@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.
- package/LICENSE +190 -0
- package/README.md +76 -0
- package/dist/Orchestrator.d.ts +142 -0
- package/dist/Orchestrator.d.ts.map +1 -0
- package/dist/Orchestrator.js +481 -0
- package/dist/api/GraphAPI.d.ts +87 -0
- package/dist/api/GraphAPI.d.ts.map +1 -0
- package/dist/api/GraphAPI.js +210 -0
- package/dist/api/GuaranteeAPI.d.ts +147 -0
- package/dist/api/GuaranteeAPI.d.ts.map +1 -0
- package/dist/api/GuaranteeAPI.js +288 -0
- package/dist/core/ASTWorker.d.ts +133 -0
- package/dist/core/ASTWorker.d.ts.map +1 -0
- package/dist/core/ASTWorker.js +352 -0
- package/dist/core/ASTWorkerPool.d.ts +85 -0
- package/dist/core/ASTWorkerPool.d.ts.map +1 -0
- package/dist/core/ASTWorkerPool.js +207 -0
- package/dist/core/AnalysisQueue.d.ts +104 -0
- package/dist/core/AnalysisQueue.d.ts.map +1 -0
- package/dist/core/AnalysisQueue.js +299 -0
- package/dist/core/AnalysisWorker.d.ts +14 -0
- package/dist/core/AnalysisWorker.d.ts.map +1 -0
- package/dist/core/AnalysisWorker.js +307 -0
- package/dist/core/GraphBackend.d.ts +156 -0
- package/dist/core/GraphBackend.d.ts.map +1 -0
- package/dist/core/GraphBackend.js +85 -0
- package/dist/core/GuaranteeManager.d.ts +230 -0
- package/dist/core/GuaranteeManager.d.ts.map +1 -0
- package/dist/core/GuaranteeManager.js +352 -0
- package/dist/core/ManifestStore.d.ts +71 -0
- package/dist/core/ManifestStore.d.ts.map +1 -0
- package/dist/core/ManifestStore.js +146 -0
- package/dist/core/NodeFactory.d.ts +160 -0
- package/dist/core/NodeFactory.d.ts.map +1 -0
- package/dist/core/NodeFactory.js +137 -0
- package/dist/core/NodeId.d.ts +88 -0
- package/dist/core/NodeId.d.ts.map +1 -0
- package/dist/core/NodeId.js +170 -0
- package/dist/core/ParallelAnalyzer.d.ts +120 -0
- package/dist/core/ParallelAnalyzer.d.ts.map +1 -0
- package/dist/core/ParallelAnalyzer.js +331 -0
- package/dist/core/PriorityQueue.d.ts +106 -0
- package/dist/core/PriorityQueue.d.ts.map +1 -0
- package/dist/core/PriorityQueue.js +168 -0
- package/dist/core/Profiler.d.ts +75 -0
- package/dist/core/Profiler.d.ts.map +1 -0
- package/dist/core/Profiler.js +149 -0
- package/dist/core/QueueWorker.d.ts +12 -0
- package/dist/core/QueueWorker.d.ts.map +1 -0
- package/dist/core/QueueWorker.js +567 -0
- package/dist/core/RFDBClient.d.ts +179 -0
- package/dist/core/RFDBClient.d.ts.map +1 -0
- package/dist/core/RFDBClient.js +429 -0
- package/dist/core/Task.d.ts +56 -0
- package/dist/core/Task.d.ts.map +1 -0
- package/dist/core/Task.js +85 -0
- package/dist/core/TaskTypes.d.ts +20 -0
- package/dist/core/TaskTypes.d.ts.map +1 -0
- package/dist/core/TaskTypes.js +10 -0
- package/dist/core/VersionManager.d.ts +166 -0
- package/dist/core/VersionManager.d.ts.map +1 -0
- package/dist/core/VersionManager.js +237 -0
- package/dist/core/WorkerPool.d.ts +82 -0
- package/dist/core/WorkerPool.d.ts.map +1 -0
- package/dist/core/WorkerPool.js +109 -0
- package/dist/core/nodes/CallSiteNode.d.ts +26 -0
- package/dist/core/nodes/CallSiteNode.d.ts.map +1 -0
- package/dist/core/nodes/CallSiteNode.js +44 -0
- package/dist/core/nodes/ClassNode.d.ts +25 -0
- package/dist/core/nodes/ClassNode.d.ts.map +1 -0
- package/dist/core/nodes/ClassNode.js +40 -0
- package/dist/core/nodes/ConstantNode.d.ts +24 -0
- package/dist/core/nodes/ConstantNode.d.ts.map +1 -0
- package/dist/core/nodes/ConstantNode.js +39 -0
- package/dist/core/nodes/DatabaseQueryNode.d.ts +22 -0
- package/dist/core/nodes/DatabaseQueryNode.d.ts.map +1 -0
- package/dist/core/nodes/DatabaseQueryNode.js +37 -0
- package/dist/core/nodes/EntrypointNode.d.ts +102 -0
- package/dist/core/nodes/EntrypointNode.d.ts.map +1 -0
- package/dist/core/nodes/EntrypointNode.js +119 -0
- package/dist/core/nodes/EventListenerNode.d.ts +25 -0
- package/dist/core/nodes/EventListenerNode.d.ts.map +1 -0
- package/dist/core/nodes/EventListenerNode.js +39 -0
- package/dist/core/nodes/ExportNode.d.ts +26 -0
- package/dist/core/nodes/ExportNode.d.ts.map +1 -0
- package/dist/core/nodes/ExportNode.js +40 -0
- package/dist/core/nodes/ExternalStdioNode.d.ts +17 -0
- package/dist/core/nodes/ExternalStdioNode.d.ts.map +1 -0
- package/dist/core/nodes/ExternalStdioNode.js +26 -0
- package/dist/core/nodes/FunctionNode.d.ts +27 -0
- package/dist/core/nodes/FunctionNode.d.ts.map +1 -0
- package/dist/core/nodes/FunctionNode.js +53 -0
- package/dist/core/nodes/GuaranteeNode.d.ts +76 -0
- package/dist/core/nodes/GuaranteeNode.d.ts.map +1 -0
- package/dist/core/nodes/GuaranteeNode.js +117 -0
- package/dist/core/nodes/HttpRequestNode.d.ts +24 -0
- package/dist/core/nodes/HttpRequestNode.d.ts.map +1 -0
- package/dist/core/nodes/HttpRequestNode.js +38 -0
- package/dist/core/nodes/ImportNode.d.ts +27 -0
- package/dist/core/nodes/ImportNode.d.ts.map +1 -0
- package/dist/core/nodes/ImportNode.js +43 -0
- package/dist/core/nodes/LiteralNode.d.ts +26 -0
- package/dist/core/nodes/LiteralNode.d.ts.map +1 -0
- package/dist/core/nodes/LiteralNode.js +40 -0
- package/dist/core/nodes/MethodCallNode.d.ts +29 -0
- package/dist/core/nodes/MethodCallNode.d.ts.map +1 -0
- package/dist/core/nodes/MethodCallNode.js +47 -0
- package/dist/core/nodes/MethodNode.d.ts +29 -0
- package/dist/core/nodes/MethodNode.d.ts.map +1 -0
- package/dist/core/nodes/MethodNode.js +44 -0
- package/dist/core/nodes/ModuleNode.d.ts +29 -0
- package/dist/core/nodes/ModuleNode.d.ts.map +1 -0
- package/dist/core/nodes/ModuleNode.js +49 -0
- package/dist/core/nodes/NodeKind.d.ts +91 -0
- package/dist/core/nodes/NodeKind.d.ts.map +1 -0
- package/dist/core/nodes/NodeKind.js +146 -0
- package/dist/core/nodes/ParameterNode.d.ts +26 -0
- package/dist/core/nodes/ParameterNode.d.ts.map +1 -0
- package/dist/core/nodes/ParameterNode.js +43 -0
- package/dist/core/nodes/ScopeNode.d.ts +32 -0
- package/dist/core/nodes/ScopeNode.d.ts.map +1 -0
- package/dist/core/nodes/ScopeNode.js +47 -0
- package/dist/core/nodes/ServiceNode.d.ts +44 -0
- package/dist/core/nodes/ServiceNode.d.ts.map +1 -0
- package/dist/core/nodes/ServiceNode.js +49 -0
- package/dist/core/nodes/VariableDeclarationNode.d.ts +22 -0
- package/dist/core/nodes/VariableDeclarationNode.d.ts.map +1 -0
- package/dist/core/nodes/VariableDeclarationNode.js +38 -0
- package/dist/core/nodes/index.d.ts +25 -0
- package/dist/core/nodes/index.d.ts.map +1 -0
- package/dist/core/nodes/index.js +30 -0
- package/dist/index.d.ts +57 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +63 -0
- package/dist/plugins/Plugin.d.ts +44 -0
- package/dist/plugins/Plugin.d.ts.map +1 -0
- package/dist/plugins/Plugin.js +46 -0
- package/dist/plugins/analysis/DatabaseAnalyzer.d.ts +23 -0
- package/dist/plugins/analysis/DatabaseAnalyzer.d.ts.map +1 -0
- package/dist/plugins/analysis/DatabaseAnalyzer.js +260 -0
- package/dist/plugins/analysis/ExpressAnalyzer.d.ts +19 -0
- package/dist/plugins/analysis/ExpressAnalyzer.d.ts.map +1 -0
- package/dist/plugins/analysis/ExpressAnalyzer.js +306 -0
- package/dist/plugins/analysis/ExpressRouteAnalyzer.d.ts +17 -0
- package/dist/plugins/analysis/ExpressRouteAnalyzer.d.ts.map +1 -0
- package/dist/plugins/analysis/ExpressRouteAnalyzer.js +308 -0
- package/dist/plugins/analysis/FetchAnalyzer.d.ts +38 -0
- package/dist/plugins/analysis/FetchAnalyzer.d.ts.map +1 -0
- package/dist/plugins/analysis/FetchAnalyzer.js +344 -0
- package/dist/plugins/analysis/IncrementalAnalysisPlugin.d.ts +65 -0
- package/dist/plugins/analysis/IncrementalAnalysisPlugin.d.ts.map +1 -0
- package/dist/plugins/analysis/IncrementalAnalysisPlugin.js +472 -0
- package/dist/plugins/analysis/JSASTAnalyzer.d.ts +84 -0
- package/dist/plugins/analysis/JSASTAnalyzer.d.ts.map +1 -0
- package/dist/plugins/analysis/JSASTAnalyzer.js +1378 -0
- package/dist/plugins/analysis/ReactAnalyzer.d.ts +90 -0
- package/dist/plugins/analysis/ReactAnalyzer.d.ts.map +1 -0
- package/dist/plugins/analysis/ReactAnalyzer.js +1153 -0
- package/dist/plugins/analysis/RustAnalyzer.d.ts +13 -0
- package/dist/plugins/analysis/RustAnalyzer.d.ts.map +1 -0
- package/dist/plugins/analysis/RustAnalyzer.js +259 -0
- package/dist/plugins/analysis/SQLiteAnalyzer.d.ts +21 -0
- package/dist/plugins/analysis/SQLiteAnalyzer.d.ts.map +1 -0
- package/dist/plugins/analysis/SQLiteAnalyzer.js +317 -0
- package/dist/plugins/analysis/ServiceLayerAnalyzer.d.ts +35 -0
- package/dist/plugins/analysis/ServiceLayerAnalyzer.d.ts.map +1 -0
- package/dist/plugins/analysis/ServiceLayerAnalyzer.js +303 -0
- package/dist/plugins/analysis/SocketIOAnalyzer.d.ts +33 -0
- package/dist/plugins/analysis/SocketIOAnalyzer.d.ts.map +1 -0
- package/dist/plugins/analysis/SocketIOAnalyzer.js +283 -0
- package/dist/plugins/analysis/SystemDbAnalyzer.d.ts +27 -0
- package/dist/plugins/analysis/SystemDbAnalyzer.d.ts.map +1 -0
- package/dist/plugins/analysis/SystemDbAnalyzer.js +211 -0
- package/dist/plugins/analysis/ast/ConditionParser.d.ts +85 -0
- package/dist/plugins/analysis/ast/ConditionParser.d.ts.map +1 -0
- package/dist/plugins/analysis/ast/ConditionParser.js +277 -0
- package/dist/plugins/analysis/ast/ExpressionEvaluator.d.ts +15 -0
- package/dist/plugins/analysis/ast/ExpressionEvaluator.d.ts.map +1 -0
- package/dist/plugins/analysis/ast/ExpressionEvaluator.js +91 -0
- package/dist/plugins/analysis/ast/GraphBuilder.d.ts +77 -0
- package/dist/plugins/analysis/ast/GraphBuilder.d.ts.map +1 -0
- package/dist/plugins/analysis/ast/GraphBuilder.js +1077 -0
- package/dist/plugins/analysis/ast/OxcAdapter.d.ts +41 -0
- package/dist/plugins/analysis/ast/OxcAdapter.d.ts.map +1 -0
- package/dist/plugins/analysis/ast/OxcAdapter.js +40 -0
- package/dist/plugins/analysis/ast/types.d.ts +346 -0
- package/dist/plugins/analysis/ast/types.d.ts.map +1 -0
- package/dist/plugins/analysis/ast/types.js +4 -0
- package/dist/plugins/analysis/ast/visitors/ASTVisitor.d.ts +93 -0
- package/dist/plugins/analysis/ast/visitors/ASTVisitor.d.ts.map +1 -0
- package/dist/plugins/analysis/ast/visitors/ASTVisitor.js +24 -0
- package/dist/plugins/analysis/ast/visitors/CallExpressionVisitor.d.ts +77 -0
- package/dist/plugins/analysis/ast/visitors/CallExpressionVisitor.d.ts.map +1 -0
- package/dist/plugins/analysis/ast/visitors/CallExpressionVisitor.js +377 -0
- package/dist/plugins/analysis/ast/visitors/ClassVisitor.d.ts +27 -0
- package/dist/plugins/analysis/ast/visitors/ClassVisitor.d.ts.map +1 -0
- package/dist/plugins/analysis/ast/visitors/ClassVisitor.js +232 -0
- package/dist/plugins/analysis/ast/visitors/FunctionVisitor.d.ts +25 -0
- package/dist/plugins/analysis/ast/visitors/FunctionVisitor.d.ts.map +1 -0
- package/dist/plugins/analysis/ast/visitors/FunctionVisitor.js +172 -0
- package/dist/plugins/analysis/ast/visitors/ImportExportVisitor.d.ts +29 -0
- package/dist/plugins/analysis/ast/visitors/ImportExportVisitor.d.ts.map +1 -0
- package/dist/plugins/analysis/ast/visitors/ImportExportVisitor.js +180 -0
- package/dist/plugins/analysis/ast/visitors/TypeScriptVisitor.d.ts +14 -0
- package/dist/plugins/analysis/ast/visitors/TypeScriptVisitor.d.ts.map +1 -0
- package/dist/plugins/analysis/ast/visitors/TypeScriptVisitor.js +200 -0
- package/dist/plugins/analysis/ast/visitors/VariableVisitor.d.ts +45 -0
- package/dist/plugins/analysis/ast/visitors/VariableVisitor.d.ts.map +1 -0
- package/dist/plugins/analysis/ast/visitors/VariableVisitor.js +150 -0
- package/dist/plugins/analysis/ast/visitors/index.d.ts +17 -0
- package/dist/plugins/analysis/ast/visitors/index.d.ts.map +1 -0
- package/dist/plugins/analysis/ast/visitors/index.js +13 -0
- package/dist/plugins/discovery/DiscoveryPlugin.d.ts +34 -0
- package/dist/plugins/discovery/DiscoveryPlugin.d.ts.map +1 -0
- package/dist/plugins/discovery/DiscoveryPlugin.js +26 -0
- package/dist/plugins/discovery/MonorepoServiceDiscovery.d.ts +26 -0
- package/dist/plugins/discovery/MonorepoServiceDiscovery.d.ts.map +1 -0
- package/dist/plugins/discovery/MonorepoServiceDiscovery.js +79 -0
- package/dist/plugins/discovery/SimpleProjectDiscovery.d.ts +14 -0
- package/dist/plugins/discovery/SimpleProjectDiscovery.d.ts.map +1 -0
- package/dist/plugins/discovery/SimpleProjectDiscovery.js +65 -0
- package/dist/plugins/discovery/ZonServiceDiscovery.d.ts +19 -0
- package/dist/plugins/discovery/ZonServiceDiscovery.d.ts.map +1 -0
- package/dist/plugins/discovery/ZonServiceDiscovery.js +204 -0
- package/dist/plugins/enrichment/AliasTracker.d.ts +40 -0
- package/dist/plugins/enrichment/AliasTracker.d.ts.map +1 -0
- package/dist/plugins/enrichment/AliasTracker.js +290 -0
- package/dist/plugins/enrichment/HTTPConnectionEnricher.d.ts +30 -0
- package/dist/plugins/enrichment/HTTPConnectionEnricher.d.ts.map +1 -0
- package/dist/plugins/enrichment/HTTPConnectionEnricher.js +135 -0
- package/dist/plugins/enrichment/ImportExportLinker.d.ts +30 -0
- package/dist/plugins/enrichment/ImportExportLinker.d.ts.map +1 -0
- package/dist/plugins/enrichment/ImportExportLinker.js +176 -0
- package/dist/plugins/enrichment/InstanceOfResolver.d.ts +21 -0
- package/dist/plugins/enrichment/InstanceOfResolver.d.ts.map +1 -0
- package/dist/plugins/enrichment/InstanceOfResolver.js +117 -0
- package/dist/plugins/enrichment/MethodCallResolver.d.ts +41 -0
- package/dist/plugins/enrichment/MethodCallResolver.d.ts.map +1 -0
- package/dist/plugins/enrichment/MethodCallResolver.js +252 -0
- package/dist/plugins/enrichment/MountPointResolver.d.ts +26 -0
- package/dist/plugins/enrichment/MountPointResolver.d.ts.map +1 -0
- package/dist/plugins/enrichment/MountPointResolver.js +189 -0
- package/dist/plugins/enrichment/PrefixEvaluator.d.ts +89 -0
- package/dist/plugins/enrichment/PrefixEvaluator.d.ts.map +1 -0
- package/dist/plugins/enrichment/PrefixEvaluator.js +415 -0
- package/dist/plugins/enrichment/RustFFIEnricher.d.ts +25 -0
- package/dist/plugins/enrichment/RustFFIEnricher.d.ts.map +1 -0
- package/dist/plugins/enrichment/RustFFIEnricher.js +170 -0
- package/dist/plugins/enrichment/ValueDomainAnalyzer.d.ts +114 -0
- package/dist/plugins/enrichment/ValueDomainAnalyzer.d.ts.map +1 -0
- package/dist/plugins/enrichment/ValueDomainAnalyzer.js +464 -0
- package/dist/plugins/indexing/IncrementalModuleIndexer.d.ts +27 -0
- package/dist/plugins/indexing/IncrementalModuleIndexer.d.ts.map +1 -0
- package/dist/plugins/indexing/IncrementalModuleIndexer.js +238 -0
- package/dist/plugins/indexing/JSModuleIndexer.d.ts +33 -0
- package/dist/plugins/indexing/JSModuleIndexer.d.ts.map +1 -0
- package/dist/plugins/indexing/JSModuleIndexer.js +299 -0
- package/dist/plugins/indexing/RustModuleIndexer.d.ts +28 -0
- package/dist/plugins/indexing/RustModuleIndexer.d.ts.map +1 -0
- package/dist/plugins/indexing/RustModuleIndexer.js +140 -0
- package/dist/plugins/indexing/ServiceDetector.d.ts +46 -0
- package/dist/plugins/indexing/ServiceDetector.d.ts.map +1 -0
- package/dist/plugins/indexing/ServiceDetector.js +164 -0
- package/dist/plugins/validation/CallResolverValidator.d.ts +23 -0
- package/dist/plugins/validation/CallResolverValidator.d.ts.map +1 -0
- package/dist/plugins/validation/CallResolverValidator.js +108 -0
- package/dist/plugins/validation/DataFlowValidator.d.ts +24 -0
- package/dist/plugins/validation/DataFlowValidator.d.ts.map +1 -0
- package/dist/plugins/validation/DataFlowValidator.js +148 -0
- package/dist/plugins/validation/EvalBanValidator.d.ts +25 -0
- package/dist/plugins/validation/EvalBanValidator.d.ts.map +1 -0
- package/dist/plugins/validation/EvalBanValidator.js +123 -0
- package/dist/plugins/validation/GraphConnectivityValidator.d.ts +11 -0
- package/dist/plugins/validation/GraphConnectivityValidator.d.ts.map +1 -0
- package/dist/plugins/validation/GraphConnectivityValidator.js +135 -0
- package/dist/plugins/validation/SQLInjectionValidator.d.ts +43 -0
- package/dist/plugins/validation/SQLInjectionValidator.d.ts.map +1 -0
- package/dist/plugins/validation/SQLInjectionValidator.js +251 -0
- package/dist/plugins/validation/ShadowingDetector.d.ts +26 -0
- package/dist/plugins/validation/ShadowingDetector.d.ts.map +1 -0
- package/dist/plugins/validation/ShadowingDetector.js +119 -0
- package/dist/plugins/validation/TypeScriptDeadCodeValidator.d.ts +21 -0
- package/dist/plugins/validation/TypeScriptDeadCodeValidator.d.ts.map +1 -0
- package/dist/plugins/validation/TypeScriptDeadCodeValidator.js +151 -0
- package/dist/plugins/vcs/GitPlugin.d.ts +84 -0
- package/dist/plugins/vcs/GitPlugin.d.ts.map +1 -0
- package/dist/plugins/vcs/GitPlugin.js +295 -0
- package/dist/plugins/vcs/VCSPlugin.d.ts +133 -0
- package/dist/plugins/vcs/VCSPlugin.d.ts.map +1 -0
- package/dist/plugins/vcs/VCSPlugin.js +82 -0
- package/dist/plugins/vcs/index.d.ts +10 -0
- package/dist/plugins/vcs/index.d.ts.map +1 -0
- package/dist/plugins/vcs/index.js +18 -0
- package/dist/storage/backends/RFDBServerBackend.d.ts +258 -0
- package/dist/storage/backends/RFDBServerBackend.d.ts.map +1 -0
- package/dist/storage/backends/RFDBServerBackend.js +565 -0
- package/dist/storage/backends/typeValidation.d.ts +47 -0
- package/dist/storage/backends/typeValidation.d.ts.map +1 -0
- package/dist/storage/backends/typeValidation.js +137 -0
- package/dist/validation/PathValidator.d.ts +81 -0
- package/dist/validation/PathValidator.d.ts.map +1 -0
- package/dist/validation/PathValidator.js +251 -0
- package/package.json +57 -0
- package/src/.rfguard/current-session.txt +1 -0
- package/src/Orchestrator.ts +673 -0
- package/src/api/GraphAPI.ts +305 -0
- package/src/api/GuaranteeAPI.ts +401 -0
- package/src/core/ASTWorker.ts +567 -0
- package/src/core/ASTWorkerPool.ts +299 -0
- package/src/core/AnalysisQueue.ts +447 -0
- package/src/core/AnalysisWorker.ts +410 -0
- package/src/core/GraphBackend.ts +265 -0
- package/src/core/GuaranteeManager.ts +581 -0
- package/src/core/ManifestStore.ts +196 -0
- package/src/core/NodeFactory.ts +274 -0
- package/src/core/NodeId.ts +257 -0
- package/src/core/ParallelAnalyzer.ts +476 -0
- package/src/core/PriorityQueue.ts +227 -0
- package/src/core/Profiler.ts +188 -0
- package/src/core/QueueWorker.ts +780 -0
- package/src/core/Task.ts +107 -0
- package/src/core/TaskTypes.ts +40 -0
- package/src/core/VersionManager.ts +404 -0
- package/src/core/WorkerPool.ts +180 -0
- package/src/core/nodes/CallSiteNode.ts +72 -0
- package/src/core/nodes/ClassNode.ts +69 -0
- package/src/core/nodes/ConstantNode.ts +63 -0
- package/src/core/nodes/DatabaseQueryNode.ts +60 -0
- package/src/core/nodes/EntrypointNode.ts +164 -0
- package/src/core/nodes/EventListenerNode.ts +64 -0
- package/src/core/nodes/ExportNode.ts +71 -0
- package/src/core/nodes/ExternalStdioNode.ts +36 -0
- package/src/core/nodes/FunctionNode.ts +78 -0
- package/src/core/nodes/GuaranteeNode.ts +162 -0
- package/src/core/nodes/HttpRequestNode.ts +63 -0
- package/src/core/nodes/ImportNode.ts +75 -0
- package/src/core/nodes/LiteralNode.ts +67 -0
- package/src/core/nodes/MethodCallNode.ts +79 -0
- package/src/core/nodes/MethodNode.ts +78 -0
- package/src/core/nodes/ModuleNode.ts +74 -0
- package/src/core/nodes/NodeKind.ts +171 -0
- package/src/core/nodes/ParameterNode.ts +73 -0
- package/src/core/nodes/ScopeNode.ts +80 -0
- package/src/core/nodes/ServiceNode.ts +86 -0
- package/src/core/nodes/VariableDeclarationNode.ts +60 -0
- package/src/core/nodes/index.ts +49 -0
- package/src/index.ts +93 -0
- package/src/plugins/Plugin.ts +74 -0
- package/src/plugins/analysis/DatabaseAnalyzer.ts +322 -0
- package/src/plugins/analysis/ExpressAnalyzer.ts +401 -0
- package/src/plugins/analysis/ExpressRouteAnalyzer.ts +414 -0
- package/src/plugins/analysis/FetchAnalyzer.ts +441 -0
- package/src/plugins/analysis/IncrementalAnalysisPlugin.ts +686 -0
- package/src/plugins/analysis/JSASTAnalyzer.ts +1680 -0
- package/src/plugins/analysis/ReactAnalyzer.ts +1368 -0
- package/src/plugins/analysis/RustAnalyzer.ts +438 -0
- package/src/plugins/analysis/SQLiteAnalyzer.ts +388 -0
- package/src/plugins/analysis/ServiceLayerAnalyzer.ts +429 -0
- package/src/plugins/analysis/SocketIOAnalyzer.ts +395 -0
- package/src/plugins/analysis/SystemDbAnalyzer.ts +284 -0
- package/src/plugins/analysis/ast/ConditionParser.ts +333 -0
- package/src/plugins/analysis/ast/ExpressionEvaluator.ts +117 -0
- package/src/plugins/analysis/ast/GraphBuilder.ts +1371 -0
- package/src/plugins/analysis/ast/OxcAdapter.ts +63 -0
- package/src/plugins/analysis/ast/types.ts +400 -0
- package/src/plugins/analysis/ast/visitors/ASTVisitor.ts +137 -0
- package/src/plugins/analysis/ast/visitors/CallExpressionVisitor.ts +528 -0
- package/src/plugins/analysis/ast/visitors/ClassVisitor.ts +339 -0
- package/src/plugins/analysis/ast/visitors/FunctionVisitor.ts +273 -0
- package/src/plugins/analysis/ast/visitors/ImportExportVisitor.ts +259 -0
- package/src/plugins/analysis/ast/visitors/TypeScriptVisitor.ts +235 -0
- package/src/plugins/analysis/ast/visitors/VariableVisitor.ts +268 -0
- package/src/plugins/analysis/ast/visitors/index.ts +36 -0
- package/src/plugins/discovery/DiscoveryPlugin.ts +50 -0
- package/src/plugins/discovery/MonorepoServiceDiscovery.ts +117 -0
- package/src/plugins/discovery/SimpleProjectDiscovery.ts +102 -0
- package/src/plugins/enrichment/AliasTracker.ts +399 -0
- package/src/plugins/enrichment/HTTPConnectionEnricher.ts +192 -0
- package/src/plugins/enrichment/ImportExportLinker.ts +221 -0
- package/src/plugins/enrichment/InstanceOfResolver.ts +165 -0
- package/src/plugins/enrichment/MethodCallResolver.ts +333 -0
- package/src/plugins/enrichment/MountPointResolver.ts +264 -0
- package/src/plugins/enrichment/PrefixEvaluator.ts +527 -0
- package/src/plugins/enrichment/RustFFIEnricher.ts +218 -0
- package/src/plugins/enrichment/ValueDomainAnalyzer.ts +682 -0
- package/src/plugins/indexing/IncrementalModuleIndexer.ts +287 -0
- package/src/plugins/indexing/JSModuleIndexer.ts +374 -0
- package/src/plugins/indexing/RustModuleIndexer.ts +160 -0
- package/src/plugins/indexing/ServiceDetector.ts +230 -0
- package/src/plugins/validation/CallResolverValidator.ts +170 -0
- package/src/plugins/validation/DataFlowValidator.ts +233 -0
- package/src/plugins/validation/EvalBanValidator.ts +175 -0
- package/src/plugins/validation/GraphConnectivityValidator.ts +201 -0
- package/src/plugins/validation/SQLInjectionValidator.ts +363 -0
- package/src/plugins/validation/ShadowingDetector.ts +173 -0
- package/src/plugins/validation/TypeScriptDeadCodeValidator.ts +203 -0
- package/src/plugins/vcs/GitPlugin.ts +344 -0
- package/src/plugins/vcs/VCSPlugin.ts +190 -0
- package/src/plugins/vcs/index.ts +32 -0
- package/src/storage/backends/RFDBServerBackend.ts +687 -0
- package/src/storage/backends/typeValidation.ts +151 -0
- package/src/validation/PathValidator.ts +342 -0
|
@@ -0,0 +1,399 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AliasTracker - резолвит вызовы через алиасы
|
|
3
|
+
*
|
|
4
|
+
* Проблема: `const m = obj.method; m()` не резолвится как method call
|
|
5
|
+
* Решение: трассируем ASSIGNED_FROM цепочки чтобы найти оригинальный источник
|
|
6
|
+
*
|
|
7
|
+
* ИСПОЛЬЗУЕТ:
|
|
8
|
+
* - VARIABLE -> ASSIGNED_FROM -> EXPRESSION (из JSASTAnalyzer)
|
|
9
|
+
* - EXPRESSION с expressionType='MemberExpression'
|
|
10
|
+
*
|
|
11
|
+
* СОЗДАЁТ:
|
|
12
|
+
* - CALL -> CALLS -> METHOD/FUNCTION (когда алиас резолвится)
|
|
13
|
+
* - CALL -> ALIAS_OF -> EXPRESSION (для трассировки)
|
|
14
|
+
*/
|
|
15
|
+
|
|
16
|
+
import { Plugin, createSuccessResult } from '../Plugin.js';
|
|
17
|
+
import type { PluginContext, PluginResult, PluginMetadata } from '../Plugin.js';
|
|
18
|
+
import type { BaseNodeRecord, NodeRecord } from '@grafema/types';
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* Alias info from index
|
|
22
|
+
*/
|
|
23
|
+
interface AliasInfo {
|
|
24
|
+
variableId: string;
|
|
25
|
+
variableName: string;
|
|
26
|
+
expressionId: string;
|
|
27
|
+
expressionType: string;
|
|
28
|
+
object?: string;
|
|
29
|
+
property?: string;
|
|
30
|
+
computed?: boolean;
|
|
31
|
+
computedPropertyVar?: string;
|
|
32
|
+
file: string;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* Expression source info
|
|
37
|
+
*/
|
|
38
|
+
interface ExpressionSource {
|
|
39
|
+
expressionId: string;
|
|
40
|
+
expressionType: string;
|
|
41
|
+
object?: string;
|
|
42
|
+
property?: string;
|
|
43
|
+
computed?: boolean;
|
|
44
|
+
computedPropertyVar?: string;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* Depth exceeded info
|
|
49
|
+
*/
|
|
50
|
+
interface DepthExceededInfo {
|
|
51
|
+
file?: string;
|
|
52
|
+
name: string;
|
|
53
|
+
chain: string[];
|
|
54
|
+
depth: number;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
* Extended call node
|
|
59
|
+
*/
|
|
60
|
+
interface CallNode extends BaseNodeRecord {
|
|
61
|
+
object?: string;
|
|
62
|
+
method?: string;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
export class AliasTracker extends Plugin {
|
|
66
|
+
static MAX_DEPTH = 10;
|
|
67
|
+
private depthExceeded: DepthExceededInfo[] = [];
|
|
68
|
+
|
|
69
|
+
get metadata(): PluginMetadata {
|
|
70
|
+
return {
|
|
71
|
+
name: 'AliasTracker',
|
|
72
|
+
phase: 'ENRICHMENT',
|
|
73
|
+
priority: 60, // После MethodCallResolver (50)
|
|
74
|
+
creates: {
|
|
75
|
+
nodes: [],
|
|
76
|
+
edges: ['CALLS', 'ALIAS_OF']
|
|
77
|
+
}
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
async execute(context: PluginContext): Promise<PluginResult> {
|
|
82
|
+
const { graph, onProgress } = context;
|
|
83
|
+
|
|
84
|
+
console.log('[AliasTracker] Starting alias resolution...');
|
|
85
|
+
|
|
86
|
+
let callsProcessed = 0;
|
|
87
|
+
let aliasesFound = 0;
|
|
88
|
+
let edgesCreated = 0;
|
|
89
|
+
let resolvedToMethod = 0;
|
|
90
|
+
|
|
91
|
+
// Трекинг превышений глубины
|
|
92
|
+
this.depthExceeded = [];
|
|
93
|
+
|
|
94
|
+
// 1. Найти все CALL без object (call sites) которые ещё не резолвлены
|
|
95
|
+
const unresolvedCalls: CallNode[] = [];
|
|
96
|
+
for await (const node of graph.queryNodes({ nodeType: 'CALL' })) {
|
|
97
|
+
const callNode = node as CallNode;
|
|
98
|
+
// Пропускаем method calls (у них есть object)
|
|
99
|
+
if (callNode.object) continue;
|
|
100
|
+
|
|
101
|
+
// Пропускаем уже резолвленные
|
|
102
|
+
const existingEdges = await graph.getOutgoingEdges(node.id, ['CALLS']);
|
|
103
|
+
if (existingEdges.length > 0) continue;
|
|
104
|
+
|
|
105
|
+
unresolvedCalls.push(callNode);
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
console.log(`[AliasTracker] Found ${unresolvedCalls.length} unresolved call sites`);
|
|
109
|
+
|
|
110
|
+
// 2. Строим индекс алиасов: variableName -> EXPRESSION info
|
|
111
|
+
const aliasIndex = await this.buildAliasIndex(graph);
|
|
112
|
+
console.log(`[AliasTracker] Found ${aliasIndex.size} potential aliases`);
|
|
113
|
+
|
|
114
|
+
// 3. Строим индекс методов для резолвинга
|
|
115
|
+
const methodIndex = await this.buildMethodIndex(graph);
|
|
116
|
+
|
|
117
|
+
// 4. Обрабатываем каждый нерезолвленный вызов
|
|
118
|
+
for (const call of unresolvedCalls) {
|
|
119
|
+
callsProcessed++;
|
|
120
|
+
|
|
121
|
+
// Report progress every 50 calls
|
|
122
|
+
if (onProgress && callsProcessed % 50 === 0) {
|
|
123
|
+
onProgress({
|
|
124
|
+
phase: 'enrichment',
|
|
125
|
+
currentPlugin: 'AliasTracker',
|
|
126
|
+
message: `Tracking aliases ${callsProcessed}/${unresolvedCalls.length}`,
|
|
127
|
+
totalFiles: unresolvedCalls.length,
|
|
128
|
+
processedFiles: callsProcessed
|
|
129
|
+
});
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
const callName = call.name as string;
|
|
133
|
+
const callFile = call.file;
|
|
134
|
+
|
|
135
|
+
// Ищем алиас с таким же именем в том же файле
|
|
136
|
+
const aliasKey = `${callFile}:${callName}`;
|
|
137
|
+
const alias = aliasIndex.get(aliasKey);
|
|
138
|
+
|
|
139
|
+
if (!alias) continue;
|
|
140
|
+
|
|
141
|
+
aliasesFound++;
|
|
142
|
+
|
|
143
|
+
// Создаём ALIAS_OF ребро для трассировки
|
|
144
|
+
await graph.addEdge({
|
|
145
|
+
src: call.id,
|
|
146
|
+
dst: alias.expressionId,
|
|
147
|
+
type: 'ALIAS_OF'
|
|
148
|
+
});
|
|
149
|
+
edgesCreated++;
|
|
150
|
+
|
|
151
|
+
// Если это MemberExpression - пробуем резолвить как method call
|
|
152
|
+
if (alias.expressionType === 'MemberExpression') {
|
|
153
|
+
const targetMethod = await this.resolveAliasedMethodCall(
|
|
154
|
+
alias.object,
|
|
155
|
+
alias.property,
|
|
156
|
+
callFile!,
|
|
157
|
+
methodIndex,
|
|
158
|
+
graph,
|
|
159
|
+
alias.computedPropertyVar // Pass variable name for computed access
|
|
160
|
+
);
|
|
161
|
+
|
|
162
|
+
if (targetMethod) {
|
|
163
|
+
await graph.addEdge({
|
|
164
|
+
src: call.id,
|
|
165
|
+
dst: targetMethod.id,
|
|
166
|
+
type: 'CALLS'
|
|
167
|
+
});
|
|
168
|
+
edgesCreated++;
|
|
169
|
+
resolvedToMethod++;
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
const summary = {
|
|
175
|
+
callsProcessed,
|
|
176
|
+
aliasesFound,
|
|
177
|
+
edgesCreated,
|
|
178
|
+
resolvedToMethod,
|
|
179
|
+
aliasesIndexed: aliasIndex.size,
|
|
180
|
+
depthExceeded: this.depthExceeded.length
|
|
181
|
+
};
|
|
182
|
+
|
|
183
|
+
// Алярм если были превышения глубины
|
|
184
|
+
if (this.depthExceeded.length > 0) {
|
|
185
|
+
console.warn(`[AliasTracker] ⚠️ WARNING: ${this.depthExceeded.length} alias chain(s) exceeded max depth (${AliasTracker.MAX_DEPTH}):`);
|
|
186
|
+
for (const info of this.depthExceeded) {
|
|
187
|
+
console.warn(` - ${info.file}:${info.name} (chain: ${info.chain.join(' → ')}...)`);
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
console.log('[AliasTracker] Summary:', summary);
|
|
192
|
+
|
|
193
|
+
return createSuccessResult({ nodes: 0, edges: edgesCreated }, summary);
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
/**
|
|
197
|
+
* Строит индекс алиасов: file:variableName -> EXPRESSION info
|
|
198
|
+
* Поддерживает транзитивные цепочки: a = b; b = c; c = obj.method
|
|
199
|
+
*/
|
|
200
|
+
private async buildAliasIndex(graph: PluginContext['graph']): Promise<Map<string, AliasInfo>> {
|
|
201
|
+
const index = new Map<string, AliasInfo>();
|
|
202
|
+
|
|
203
|
+
// Находим все VARIABLE ноды
|
|
204
|
+
for await (const varNode of graph.queryNodes({ nodeType: 'VARIABLE' })) {
|
|
205
|
+
const expressionSource = await this.findExpressionSource(varNode, graph, new Set());
|
|
206
|
+
if (expressionSource) {
|
|
207
|
+
const key = `${varNode.file}:${varNode.name}`;
|
|
208
|
+
index.set(key, {
|
|
209
|
+
variableId: varNode.id,
|
|
210
|
+
variableName: varNode.name as string,
|
|
211
|
+
...expressionSource,
|
|
212
|
+
file: varNode.file!
|
|
213
|
+
});
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
// Также проверяем CONSTANT ноды (const m = obj.method)
|
|
218
|
+
for await (const constNode of graph.queryNodes({ nodeType: 'CONSTANT' })) {
|
|
219
|
+
const expressionSource = await this.findExpressionSource(constNode, graph, new Set());
|
|
220
|
+
if (expressionSource) {
|
|
221
|
+
const key = `${constNode.file}:${constNode.name}`;
|
|
222
|
+
index.set(key, {
|
|
223
|
+
variableId: constNode.id,
|
|
224
|
+
variableName: constNode.name as string,
|
|
225
|
+
...expressionSource,
|
|
226
|
+
file: constNode.file!
|
|
227
|
+
});
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
return index;
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
/**
|
|
235
|
+
* Рекурсивно ищет EXPRESSION источник через цепочки ASSIGNED_FROM
|
|
236
|
+
*/
|
|
237
|
+
private async findExpressionSource(
|
|
238
|
+
node: NodeRecord,
|
|
239
|
+
graph: PluginContext['graph'],
|
|
240
|
+
visited: Set<string>,
|
|
241
|
+
depth: number = 0,
|
|
242
|
+
chain: string[] = []
|
|
243
|
+
): Promise<ExpressionSource | null> {
|
|
244
|
+
// Добавляем текущую ноду в цепочку
|
|
245
|
+
chain.push((node.name as string) || node.id);
|
|
246
|
+
|
|
247
|
+
// Защита от бесконечных циклов
|
|
248
|
+
if (visited.has(node.id.toString())) return null;
|
|
249
|
+
visited.add(node.id.toString());
|
|
250
|
+
|
|
251
|
+
// Защита от слишком глубоких цепочек
|
|
252
|
+
if (depth > AliasTracker.MAX_DEPTH) {
|
|
253
|
+
this.depthExceeded.push({
|
|
254
|
+
file: node.file,
|
|
255
|
+
name: chain[0],
|
|
256
|
+
chain: chain.slice(0, 5),
|
|
257
|
+
depth: depth
|
|
258
|
+
});
|
|
259
|
+
return null;
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
// Получаем ASSIGNED_FROM рёбра
|
|
263
|
+
const assignedFromEdges = await graph.getOutgoingEdges(node.id, ['ASSIGNED_FROM']);
|
|
264
|
+
|
|
265
|
+
for (const edge of assignedFromEdges) {
|
|
266
|
+
const targetNode = await graph.getNode(edge.dst);
|
|
267
|
+
if (!targetNode) continue;
|
|
268
|
+
|
|
269
|
+
// Если это EXPRESSION - нашли источник!
|
|
270
|
+
if (targetNode.type === 'EXPRESSION') {
|
|
271
|
+
return {
|
|
272
|
+
expressionId: targetNode.id,
|
|
273
|
+
expressionType: targetNode.expressionType as string,
|
|
274
|
+
object: targetNode.object as string | undefined,
|
|
275
|
+
property: targetNode.property as string | undefined,
|
|
276
|
+
computed: targetNode.computed as boolean | undefined,
|
|
277
|
+
computedPropertyVar: targetNode.computedPropertyVar as string | undefined
|
|
278
|
+
};
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
// Если это VARIABLE или CONSTANT - идём глубже (транзитивно)
|
|
282
|
+
if (targetNode.type === 'VARIABLE' || targetNode.type === 'CONSTANT') {
|
|
283
|
+
const result = await this.findExpressionSource(targetNode, graph, visited, depth + 1, chain);
|
|
284
|
+
if (result) return result;
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
|
|
288
|
+
return null;
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
/**
|
|
292
|
+
* Строит индекс методов для резолвинга: className:methodName -> METHOD node
|
|
293
|
+
*/
|
|
294
|
+
private async buildMethodIndex(graph: PluginContext['graph']): Promise<Map<string, NodeRecord>> {
|
|
295
|
+
const index = new Map<string, NodeRecord>();
|
|
296
|
+
|
|
297
|
+
// Индексируем методы классов
|
|
298
|
+
for await (const classNode of graph.queryNodes({ nodeType: 'CLASS' })) {
|
|
299
|
+
const className = classNode.name as string;
|
|
300
|
+
if (!className) continue;
|
|
301
|
+
|
|
302
|
+
const containsEdges = await graph.getOutgoingEdges(classNode.id, ['CONTAINS']);
|
|
303
|
+
for (const edge of containsEdges) {
|
|
304
|
+
const childNode = await graph.getNode(edge.dst);
|
|
305
|
+
if (childNode && (childNode.type === 'METHOD' || childNode.type === 'FUNCTION')) {
|
|
306
|
+
if (childNode.name) {
|
|
307
|
+
// По имени класса
|
|
308
|
+
index.set(`${className}:${childNode.name}`, childNode);
|
|
309
|
+
// По файлу и имени класса
|
|
310
|
+
index.set(`${classNode.file}:${className}:${childNode.name}`, childNode);
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
|
|
316
|
+
return index;
|
|
317
|
+
}
|
|
318
|
+
|
|
319
|
+
/**
|
|
320
|
+
* Пытается резолвить алиасированный method call
|
|
321
|
+
*/
|
|
322
|
+
private async resolveAliasedMethodCall(
|
|
323
|
+
objectName: string | undefined,
|
|
324
|
+
propertyName: string | undefined,
|
|
325
|
+
file: string,
|
|
326
|
+
methodIndex: Map<string, NodeRecord>,
|
|
327
|
+
graph: PluginContext['graph'],
|
|
328
|
+
computedPropertyVar: string | null = null
|
|
329
|
+
): Promise<NodeRecord | null> {
|
|
330
|
+
if (!objectName || !propertyName) return null;
|
|
331
|
+
|
|
332
|
+
// Если property вычисляемый - пробуем трассировать через computedPropertyVar
|
|
333
|
+
if (propertyName === '<computed>') {
|
|
334
|
+
if (!computedPropertyVar) {
|
|
335
|
+
return null;
|
|
336
|
+
}
|
|
337
|
+
|
|
338
|
+
if (!graph.findByAttr) {
|
|
339
|
+
return null;
|
|
340
|
+
}
|
|
341
|
+
const varNodes = await graph.findByAttr({
|
|
342
|
+
name: computedPropertyVar,
|
|
343
|
+
file: file
|
|
344
|
+
});
|
|
345
|
+
|
|
346
|
+
for (const varId of varNodes) {
|
|
347
|
+
const assignedFromEdges = await graph.getOutgoingEdges(varId, ['ASSIGNED_FROM']);
|
|
348
|
+
for (const edge of assignedFromEdges) {
|
|
349
|
+
const targetNode = await graph.getNode(edge.dst);
|
|
350
|
+
if (targetNode && targetNode.type === 'LITERAL' && typeof targetNode.value === 'string') {
|
|
351
|
+
propertyName = targetNode.value as string;
|
|
352
|
+
break;
|
|
353
|
+
}
|
|
354
|
+
}
|
|
355
|
+
if (propertyName !== '<computed>') break;
|
|
356
|
+
}
|
|
357
|
+
|
|
358
|
+
if (propertyName === '<computed>') {
|
|
359
|
+
return null;
|
|
360
|
+
}
|
|
361
|
+
}
|
|
362
|
+
|
|
363
|
+
// 1. Проверяем прямое имя класса
|
|
364
|
+
const directKey = `${objectName}:${propertyName}`;
|
|
365
|
+
if (methodIndex.has(directKey)) {
|
|
366
|
+
return methodIndex.get(directKey)!;
|
|
367
|
+
}
|
|
368
|
+
|
|
369
|
+
// 2. Проверяем локальный класс в том же файле
|
|
370
|
+
const localKey = `${file}:${objectName}:${propertyName}`;
|
|
371
|
+
if (methodIndex.has(localKey)) {
|
|
372
|
+
return methodIndex.get(localKey)!;
|
|
373
|
+
}
|
|
374
|
+
|
|
375
|
+
// 3. Ищем переменную с типом (INSTANCE_OF)
|
|
376
|
+
if (!graph.findByAttr) {
|
|
377
|
+
return null;
|
|
378
|
+
}
|
|
379
|
+
const varNodes = await graph.findByAttr({
|
|
380
|
+
name: objectName,
|
|
381
|
+
file: file
|
|
382
|
+
});
|
|
383
|
+
|
|
384
|
+
for (const varId of varNodes) {
|
|
385
|
+
const instanceOfEdges = await graph.getOutgoingEdges(varId, ['INSTANCE_OF']);
|
|
386
|
+
for (const edge of instanceOfEdges) {
|
|
387
|
+
const classNode = await graph.getNode(edge.dst);
|
|
388
|
+
if (classNode && classNode.name) {
|
|
389
|
+
const classKey = `${classNode.name}:${propertyName}`;
|
|
390
|
+
if (methodIndex.has(classKey)) {
|
|
391
|
+
return methodIndex.get(classKey)!;
|
|
392
|
+
}
|
|
393
|
+
}
|
|
394
|
+
}
|
|
395
|
+
}
|
|
396
|
+
|
|
397
|
+
return null;
|
|
398
|
+
}
|
|
399
|
+
}
|
|
@@ -0,0 +1,192 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* HTTPConnectionEnricher - связывает http:request (frontend) с http:route (backend)
|
|
3
|
+
*
|
|
4
|
+
* Создаёт INTERACTS_WITH edges между:
|
|
5
|
+
* - Frontend fetch('/api/users') → Backend GET /api/users
|
|
6
|
+
* - Frontend fetch('/api/users', {method: 'POST'}) → Backend POST /api/users
|
|
7
|
+
*
|
|
8
|
+
* Поддержка параметризованных путей:
|
|
9
|
+
* - /api/graph/:serviceId матчится с /api/graph/my-service
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
import { Plugin, createSuccessResult, createErrorResult } from '../Plugin.js';
|
|
13
|
+
import type { PluginContext, PluginResult, PluginMetadata } from '../Plugin.js';
|
|
14
|
+
import type { BaseNodeRecord } from '@grafema/types';
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* HTTP route node
|
|
18
|
+
*/
|
|
19
|
+
interface HTTPRouteNode extends BaseNodeRecord {
|
|
20
|
+
method?: string;
|
|
21
|
+
path?: string;
|
|
22
|
+
url?: string;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* HTTP request node
|
|
27
|
+
*/
|
|
28
|
+
interface HTTPRequestNode extends BaseNodeRecord {
|
|
29
|
+
method?: string;
|
|
30
|
+
url?: string;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* Connection info for logging
|
|
35
|
+
*/
|
|
36
|
+
interface ConnectionInfo {
|
|
37
|
+
request: string;
|
|
38
|
+
route: string;
|
|
39
|
+
requestFile?: string;
|
|
40
|
+
routeFile?: string;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
export class HTTPConnectionEnricher extends Plugin {
|
|
44
|
+
get metadata(): PluginMetadata {
|
|
45
|
+
return {
|
|
46
|
+
name: 'HTTPConnectionEnricher',
|
|
47
|
+
phase: 'ENRICHMENT',
|
|
48
|
+
priority: 50, // После основных enrichers
|
|
49
|
+
creates: {
|
|
50
|
+
nodes: [],
|
|
51
|
+
edges: ['INTERACTS_WITH']
|
|
52
|
+
},
|
|
53
|
+
dependencies: ['ExpressRouteAnalyzer', 'FetchAnalyzer']
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
async execute(context: PluginContext): Promise<PluginResult> {
|
|
58
|
+
const { graph } = context;
|
|
59
|
+
|
|
60
|
+
try {
|
|
61
|
+
// Собираем все http:route (backend endpoints)
|
|
62
|
+
const routes: HTTPRouteNode[] = [];
|
|
63
|
+
for await (const node of graph.queryNodes({ type: 'http:route' })) {
|
|
64
|
+
routes.push(node as HTTPRouteNode);
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
// Собираем все http:request (frontend requests)
|
|
68
|
+
const requests: HTTPRequestNode[] = [];
|
|
69
|
+
for await (const node of graph.queryNodes({ type: 'http:request' })) {
|
|
70
|
+
requests.push(node as HTTPRequestNode);
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
console.log(`[HTTPConnectionEnricher] Found ${routes.length} routes, ${requests.length} requests`);
|
|
74
|
+
|
|
75
|
+
// Дедуплицируем по ID (из-за multi-service анализа)
|
|
76
|
+
const uniqueRoutes = this.deduplicateById(routes);
|
|
77
|
+
const uniqueRequests = this.deduplicateById(requests);
|
|
78
|
+
|
|
79
|
+
console.log(`[HTTPConnectionEnricher] Unique: ${uniqueRoutes.length} routes, ${uniqueRequests.length} requests`);
|
|
80
|
+
|
|
81
|
+
let edgesCreated = 0;
|
|
82
|
+
const connections: ConnectionInfo[] = [];
|
|
83
|
+
|
|
84
|
+
// Для каждого request ищем matching route
|
|
85
|
+
for (const request of uniqueRequests) {
|
|
86
|
+
// Пропускаем dynamic URLs
|
|
87
|
+
if (request.url === 'dynamic' || !request.url) {
|
|
88
|
+
continue;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
const method = (request.method || 'GET').toUpperCase();
|
|
92
|
+
const url = request.url;
|
|
93
|
+
|
|
94
|
+
// Ищем matching route
|
|
95
|
+
for (const route of uniqueRoutes) {
|
|
96
|
+
const routeMethod = (route.method || 'GET').toUpperCase();
|
|
97
|
+
const routePath = route.path;
|
|
98
|
+
|
|
99
|
+
if (routePath && method === routeMethod && this.pathsMatch(url, routePath)) {
|
|
100
|
+
// Создаём edge
|
|
101
|
+
await graph.addEdge({
|
|
102
|
+
type: 'INTERACTS_WITH',
|
|
103
|
+
src: request.id,
|
|
104
|
+
dst: route.id,
|
|
105
|
+
matchType: this.hasParams(routePath) ? 'parametric' : 'exact'
|
|
106
|
+
});
|
|
107
|
+
|
|
108
|
+
connections.push({
|
|
109
|
+
request: `${method} ${url}`,
|
|
110
|
+
route: `${routeMethod} ${routePath}`,
|
|
111
|
+
requestFile: request.file,
|
|
112
|
+
routeFile: route.file
|
|
113
|
+
});
|
|
114
|
+
|
|
115
|
+
edgesCreated++;
|
|
116
|
+
break; // Один request → один route
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
// Логируем найденные связи
|
|
122
|
+
if (connections.length > 0) {
|
|
123
|
+
console.log(`[HTTPConnectionEnricher] Connections found:`);
|
|
124
|
+
for (const conn of connections) {
|
|
125
|
+
console.log(` ${conn.request} → ${conn.route}`);
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
return createSuccessResult(
|
|
130
|
+
{ nodes: 0, edges: edgesCreated },
|
|
131
|
+
{
|
|
132
|
+
connections: connections.length,
|
|
133
|
+
routesAnalyzed: uniqueRoutes.length,
|
|
134
|
+
requestsAnalyzed: uniqueRequests.length
|
|
135
|
+
}
|
|
136
|
+
);
|
|
137
|
+
|
|
138
|
+
} catch (error) {
|
|
139
|
+
console.error(`[HTTPConnectionEnricher] Error:`, error);
|
|
140
|
+
return createErrorResult(error instanceof Error ? error : new Error(String(error)));
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
/**
|
|
145
|
+
* Проверяет совпадают ли пути
|
|
146
|
+
* Поддерживает параметризованные пути: /api/users/:id матчится с /api/users/123
|
|
147
|
+
*/
|
|
148
|
+
private pathsMatch(requestUrl: string, routePath: string): boolean {
|
|
149
|
+
// Точное совпадение
|
|
150
|
+
if (requestUrl === routePath) {
|
|
151
|
+
return true;
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
// Если route не имеет параметров, требуем точное совпадение
|
|
155
|
+
if (!this.hasParams(routePath)) {
|
|
156
|
+
return false;
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
// Преобразуем route path в regex
|
|
160
|
+
// /api/users/:id → /api/users/[^/]+
|
|
161
|
+
const regexPattern = routePath
|
|
162
|
+
.replace(/:[^/]+/g, '[^/]+') // :param → [^/]+
|
|
163
|
+
.replace(/\//g, '\\/'); // / → \/
|
|
164
|
+
|
|
165
|
+
const regex = new RegExp(`^${regexPattern}$`);
|
|
166
|
+
return regex.test(requestUrl);
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
/**
|
|
170
|
+
* Проверяет есть ли параметры в пути
|
|
171
|
+
*/
|
|
172
|
+
private hasParams(path: string): boolean {
|
|
173
|
+
return Boolean(path && path.includes(':'));
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
/**
|
|
177
|
+
* Убирает дубликаты по ID
|
|
178
|
+
*/
|
|
179
|
+
private deduplicateById<T extends BaseNodeRecord>(nodes: T[]): T[] {
|
|
180
|
+
const seen = new Set<string>();
|
|
181
|
+
const unique: T[] = [];
|
|
182
|
+
|
|
183
|
+
for (const node of nodes) {
|
|
184
|
+
if (!seen.has(node.id)) {
|
|
185
|
+
seen.add(node.id);
|
|
186
|
+
unique.push(node);
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
return unique;
|
|
191
|
+
}
|
|
192
|
+
}
|