@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,160 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* RustModuleIndexer - plugin for indexing Rust modules
|
|
3
|
+
* Discovers .rs files in rust-engine/src/ directory
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import { readFileSync, existsSync, readdirSync, statSync } from 'fs';
|
|
7
|
+
import { resolve, relative, basename, join } from 'path';
|
|
8
|
+
import { createHash } from 'crypto';
|
|
9
|
+
import { Plugin, createSuccessResult } from '../Plugin.js';
|
|
10
|
+
import type { PluginContext, PluginResult, PluginMetadata } from '../Plugin.js';
|
|
11
|
+
import type { NodeRecord } from '@grafema/types';
|
|
12
|
+
|
|
13
|
+
// Test file patterns for Rust
|
|
14
|
+
const RUST_TEST_PATTERNS: RegExp[] = [
|
|
15
|
+
/[/\\]tests[/\\]/, // /tests/
|
|
16
|
+
/_test\.rs$/, // _test.rs
|
|
17
|
+
/[/\\]test\.rs$/, // test.rs in subdirectory
|
|
18
|
+
];
|
|
19
|
+
|
|
20
|
+
export class RustModuleIndexer extends Plugin {
|
|
21
|
+
private testPatterns: RegExp[];
|
|
22
|
+
|
|
23
|
+
constructor() {
|
|
24
|
+
super();
|
|
25
|
+
this.testPatterns = RUST_TEST_PATTERNS;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
get metadata(): PluginMetadata {
|
|
29
|
+
return {
|
|
30
|
+
name: 'RustModuleIndexer',
|
|
31
|
+
phase: 'INDEXING',
|
|
32
|
+
priority: 85, // After JSModuleIndexer (90)
|
|
33
|
+
creates: {
|
|
34
|
+
nodes: ['RUST_MODULE'],
|
|
35
|
+
edges: ['CONTAINS']
|
|
36
|
+
}
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* Check if file is a test file based on path patterns
|
|
42
|
+
*/
|
|
43
|
+
private isTestFile(filePath: string): boolean {
|
|
44
|
+
return this.testPatterns.some(pattern => pattern.test(filePath));
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* Recursively find all .rs files in a directory
|
|
49
|
+
*/
|
|
50
|
+
private findRustFiles(dir: string, files: string[] = []): string[] {
|
|
51
|
+
try {
|
|
52
|
+
const entries = readdirSync(dir);
|
|
53
|
+
for (const entry of entries) {
|
|
54
|
+
// Skip target directory
|
|
55
|
+
if (entry === 'target') continue;
|
|
56
|
+
|
|
57
|
+
const fullPath = join(dir, entry);
|
|
58
|
+
try {
|
|
59
|
+
const stat = statSync(fullPath);
|
|
60
|
+
if (stat.isDirectory()) {
|
|
61
|
+
this.findRustFiles(fullPath, files);
|
|
62
|
+
} else if (entry.endsWith('.rs')) {
|
|
63
|
+
files.push(fullPath);
|
|
64
|
+
}
|
|
65
|
+
} catch {
|
|
66
|
+
// Skip files we can't stat
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
} catch {
|
|
70
|
+
// Skip directories we can't read
|
|
71
|
+
}
|
|
72
|
+
return files;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
/**
|
|
76
|
+
* Convert file path to Rust module name
|
|
77
|
+
* src/ffi/napi_bindings.rs -> ffi::napi_bindings
|
|
78
|
+
* src/lib.rs -> crate
|
|
79
|
+
* src/ffi/mod.rs -> ffi
|
|
80
|
+
*/
|
|
81
|
+
private pathToModuleName(relativePath: string): string {
|
|
82
|
+
let name = relativePath
|
|
83
|
+
.replace(/\.rs$/, '')
|
|
84
|
+
.replace(/\//g, '::');
|
|
85
|
+
|
|
86
|
+
if (name.endsWith('::mod')) {
|
|
87
|
+
name = name.replace(/::mod$/, '');
|
|
88
|
+
}
|
|
89
|
+
if (name === 'lib') {
|
|
90
|
+
name = 'crate';
|
|
91
|
+
}
|
|
92
|
+
return name;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
async execute(context: PluginContext): Promise<PluginResult> {
|
|
96
|
+
const { manifest, graph, onProgress } = context;
|
|
97
|
+
// Cast manifest to expected shape
|
|
98
|
+
const typedManifest = manifest as { projectPath: string } | undefined;
|
|
99
|
+
const { projectPath } = typedManifest!;
|
|
100
|
+
|
|
101
|
+
// Find rust-engine/src directory
|
|
102
|
+
const rustRoot = resolve(projectPath, 'rust-engine/src');
|
|
103
|
+
|
|
104
|
+
if (!existsSync(rustRoot)) {
|
|
105
|
+
console.log('[RustModuleIndexer] rust-engine/src not found, skipping');
|
|
106
|
+
return createSuccessResult({ nodes: 0, edges: 0 }, { skipped: true });
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
// Discover all .rs files recursively
|
|
110
|
+
const rsFiles = this.findRustFiles(rustRoot);
|
|
111
|
+
|
|
112
|
+
console.log(`[RustModuleIndexer] Found ${rsFiles.length} .rs files`);
|
|
113
|
+
|
|
114
|
+
let nodesCreated = 0;
|
|
115
|
+
const errors: Array<{ file: string; error: string }> = [];
|
|
116
|
+
|
|
117
|
+
for (const filePath of rsFiles) {
|
|
118
|
+
try {
|
|
119
|
+
const content = readFileSync(filePath, 'utf-8');
|
|
120
|
+
const hash = createHash('sha256').update(content).digest('hex');
|
|
121
|
+
const relativePath = relative(rustRoot, filePath);
|
|
122
|
+
const moduleName = this.pathToModuleName(relativePath);
|
|
123
|
+
|
|
124
|
+
const nodeId = `RUST_MODULE#${moduleName}#${filePath}`;
|
|
125
|
+
|
|
126
|
+
await graph.addNode({
|
|
127
|
+
id: nodeId,
|
|
128
|
+
type: 'RUST_MODULE',
|
|
129
|
+
name: moduleName,
|
|
130
|
+
file: filePath,
|
|
131
|
+
contentHash: hash,
|
|
132
|
+
isLib: basename(filePath) === 'lib.rs',
|
|
133
|
+
isMod: basename(filePath) === 'mod.rs',
|
|
134
|
+
isTest: this.isTestFile(filePath)
|
|
135
|
+
} as unknown as NodeRecord);
|
|
136
|
+
|
|
137
|
+
nodesCreated++;
|
|
138
|
+
|
|
139
|
+
if (onProgress && nodesCreated % 10 === 0) {
|
|
140
|
+
onProgress({
|
|
141
|
+
phase: 'indexing',
|
|
142
|
+
currentPlugin: 'RustModuleIndexer',
|
|
143
|
+
message: `Indexed ${nodesCreated}/${rsFiles.length} Rust modules`,
|
|
144
|
+
totalFiles: rsFiles.length,
|
|
145
|
+
processedFiles: nodesCreated
|
|
146
|
+
});
|
|
147
|
+
}
|
|
148
|
+
} catch (err) {
|
|
149
|
+
errors.push({ file: filePath, error: (err as Error).message });
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
if (errors.length > 0) {
|
|
154
|
+
console.warn(`[RustModuleIndexer] ${errors.length} errors during indexing`);
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
console.log(`[RustModuleIndexer] Indexed ${nodesCreated} Rust modules`);
|
|
158
|
+
return createSuccessResult({ nodes: nodesCreated, edges: 0 }, { errors: errors.length });
|
|
159
|
+
}
|
|
160
|
+
}
|
|
@@ -0,0 +1,230 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ServiceDetector - обнаруживает сервисы в монорепозитории
|
|
3
|
+
*
|
|
4
|
+
* Паттерны детекции:
|
|
5
|
+
* 1. Директории с package.json в apps/, packages/, services/
|
|
6
|
+
* 2. Директории с Dockerfile
|
|
7
|
+
* 3. Директории с server.js/index.js entry points
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
import { readFileSync, existsSync, readdirSync, statSync } from 'fs';
|
|
11
|
+
import { join, basename } from 'path';
|
|
12
|
+
import type { NodeRecord } from '@grafema/types';
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Context for ServiceDetector
|
|
16
|
+
*/
|
|
17
|
+
interface DetectorContext {
|
|
18
|
+
projectPath: string;
|
|
19
|
+
graph: {
|
|
20
|
+
addNode(node: NodeRecord): Promise<void>;
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* Package.json structure (relevant fields)
|
|
26
|
+
*/
|
|
27
|
+
interface PackageJson {
|
|
28
|
+
name?: string;
|
|
29
|
+
main?: string;
|
|
30
|
+
[key: string]: unknown;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* Service info
|
|
35
|
+
*/
|
|
36
|
+
interface ServiceInfo {
|
|
37
|
+
id: string;
|
|
38
|
+
name: string;
|
|
39
|
+
path: string;
|
|
40
|
+
packageJson: PackageJson | null;
|
|
41
|
+
entryPoint: string | null;
|
|
42
|
+
hasDockerfile: boolean;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
export class ServiceDetector {
|
|
46
|
+
name: string;
|
|
47
|
+
phase: string;
|
|
48
|
+
priority: number;
|
|
49
|
+
|
|
50
|
+
constructor() {
|
|
51
|
+
this.name = 'ServiceDetector';
|
|
52
|
+
this.phase = 'INDEXING';
|
|
53
|
+
this.priority = 90; // Запускается перед JSModuleIndexer
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* Анализирует проект и создаёт SERVICE ноды
|
|
58
|
+
*/
|
|
59
|
+
async analyze(context: DetectorContext): Promise<DetectorContext> {
|
|
60
|
+
const { projectPath, graph } = context;
|
|
61
|
+
const services: ServiceInfo[] = [];
|
|
62
|
+
|
|
63
|
+
console.log(`[${this.name}] Detecting services in: ${projectPath}`);
|
|
64
|
+
|
|
65
|
+
// Паттерн 1: Монорепо структура (apps/, packages/, services/)
|
|
66
|
+
const monorepoPatterns = ['apps', 'packages', 'services'];
|
|
67
|
+
|
|
68
|
+
for (const pattern of monorepoPatterns) {
|
|
69
|
+
const monorepoDir = join(projectPath, pattern);
|
|
70
|
+
|
|
71
|
+
if (existsSync(monorepoDir)) {
|
|
72
|
+
const detected = this.detectServicesInDir(monorepoDir, projectPath);
|
|
73
|
+
services.push(...detected);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
// Паттерн 2: Корневой проект (если нет монорепо)
|
|
78
|
+
if (services.length === 0) {
|
|
79
|
+
const rootService = this.detectRootService(projectPath);
|
|
80
|
+
if (rootService) {
|
|
81
|
+
services.push(rootService);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
// Создаём SERVICE ноды в графе
|
|
86
|
+
for (const service of services) {
|
|
87
|
+
await graph.addNode({
|
|
88
|
+
id: service.id,
|
|
89
|
+
type: 'SERVICE',
|
|
90
|
+
name: service.name,
|
|
91
|
+
file: service.path,
|
|
92
|
+
metadata: {
|
|
93
|
+
packageJson: service.packageJson,
|
|
94
|
+
entryPoint: service.entryPoint,
|
|
95
|
+
hasDockerfile: service.hasDockerfile
|
|
96
|
+
}
|
|
97
|
+
} as unknown as NodeRecord);
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
console.log(`[${this.name}] Detected ${services.length} services`);
|
|
101
|
+
services.forEach(s => console.log(` - ${s.name} (${s.path})`));
|
|
102
|
+
|
|
103
|
+
return context;
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
/**
|
|
107
|
+
* Обнаруживает сервисы в директории монорепо
|
|
108
|
+
*/
|
|
109
|
+
private detectServicesInDir(dir: string, projectPath: string): ServiceInfo[] {
|
|
110
|
+
const services: ServiceInfo[] = [];
|
|
111
|
+
|
|
112
|
+
try {
|
|
113
|
+
const entries = readdirSync(dir);
|
|
114
|
+
|
|
115
|
+
for (const entry of entries) {
|
|
116
|
+
const fullPath = join(dir, entry);
|
|
117
|
+
|
|
118
|
+
// Пропускаем файлы и скрытые директории
|
|
119
|
+
if (!statSync(fullPath).isDirectory() || entry.startsWith('.')) {
|
|
120
|
+
continue;
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
// Проверяем признаки сервиса
|
|
124
|
+
const packageJsonPath = join(fullPath, 'package.json');
|
|
125
|
+
const hasPackageJson = existsSync(packageJsonPath);
|
|
126
|
+
|
|
127
|
+
if (hasPackageJson) {
|
|
128
|
+
const service = this.createServiceFromDir(fullPath, entry, projectPath);
|
|
129
|
+
if (service) {
|
|
130
|
+
services.push(service);
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
} catch (error) {
|
|
135
|
+
console.warn(`[${this.name}] Error scanning ${dir}:`, (error as Error).message);
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
return services;
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
/**
|
|
142
|
+
* Обнаруживает корневой сервис (не монорепо)
|
|
143
|
+
*/
|
|
144
|
+
private detectRootService(projectPath: string): ServiceInfo | null {
|
|
145
|
+
const packageJsonPath = join(projectPath, 'package.json');
|
|
146
|
+
|
|
147
|
+
if (!existsSync(packageJsonPath)) {
|
|
148
|
+
return null;
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
const projectName = basename(projectPath);
|
|
152
|
+
return this.createServiceFromDir(projectPath, projectName, projectPath);
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
/**
|
|
156
|
+
* Создаёт объект сервиса из директории
|
|
157
|
+
*/
|
|
158
|
+
private createServiceFromDir(
|
|
159
|
+
servicePath: string,
|
|
160
|
+
serviceName: string,
|
|
161
|
+
projectPath: string
|
|
162
|
+
): ServiceInfo | null {
|
|
163
|
+
try {
|
|
164
|
+
const packageJsonPath = join(servicePath, 'package.json');
|
|
165
|
+
let packageJson: PackageJson | null = null;
|
|
166
|
+
|
|
167
|
+
if (existsSync(packageJsonPath)) {
|
|
168
|
+
const content = readFileSync(packageJsonPath, 'utf-8');
|
|
169
|
+
packageJson = JSON.parse(content) as PackageJson;
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
// Определяем entry point
|
|
173
|
+
const entryPoint = this.findEntryPoint(servicePath, packageJson);
|
|
174
|
+
|
|
175
|
+
// Проверяем наличие Dockerfile
|
|
176
|
+
const hasDockerfile = existsSync(join(servicePath, 'Dockerfile')) ||
|
|
177
|
+
existsSync(join(servicePath, 'dockerfile'));
|
|
178
|
+
|
|
179
|
+
// Генерируем ID сервиса
|
|
180
|
+
const relativePath = servicePath.replace(projectPath, '').replace(/^\//, '');
|
|
181
|
+
const serviceId = `SERVICE:${relativePath || serviceName}`;
|
|
182
|
+
|
|
183
|
+
return {
|
|
184
|
+
id: serviceId,
|
|
185
|
+
name: packageJson?.name || serviceName,
|
|
186
|
+
path: servicePath,
|
|
187
|
+
packageJson,
|
|
188
|
+
entryPoint,
|
|
189
|
+
hasDockerfile
|
|
190
|
+
};
|
|
191
|
+
} catch (error) {
|
|
192
|
+
console.warn(`[${this.name}] Error creating service from ${servicePath}:`, (error as Error).message);
|
|
193
|
+
return null;
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
/**
|
|
198
|
+
* Находит entry point сервиса
|
|
199
|
+
*/
|
|
200
|
+
private findEntryPoint(servicePath: string, packageJson: PackageJson | null): string | null {
|
|
201
|
+
// 1. Из package.json main
|
|
202
|
+
if (packageJson?.main) {
|
|
203
|
+
return packageJson.main;
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
// 2. Стандартные entry points
|
|
207
|
+
const candidates = [
|
|
208
|
+
'src/index.js',
|
|
209
|
+
'src/index.ts',
|
|
210
|
+
'src/server.js',
|
|
211
|
+
'src/server.ts',
|
|
212
|
+
'src/main.js',
|
|
213
|
+
'src/main.ts',
|
|
214
|
+
'index.js',
|
|
215
|
+
'index.ts',
|
|
216
|
+
'server.js',
|
|
217
|
+
'server.ts',
|
|
218
|
+
'app.js',
|
|
219
|
+
'app.ts'
|
|
220
|
+
];
|
|
221
|
+
|
|
222
|
+
for (const candidate of candidates) {
|
|
223
|
+
if (existsSync(join(servicePath, candidate))) {
|
|
224
|
+
return candidate;
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
return null;
|
|
229
|
+
}
|
|
230
|
+
}
|
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CallResolverValidator - проверяет что все вызовы функций ссылаются на определения
|
|
3
|
+
*
|
|
4
|
+
* Использует Datalog для декларативной проверки гарантии:
|
|
5
|
+
* "Все внутренние вызовы функций (CALL_SITE) должны иметь CALLS ребро к FUNCTION"
|
|
6
|
+
*
|
|
7
|
+
* ПРАВИЛО (Datalog):
|
|
8
|
+
* violation(X) :- node(X, "CALL"), \+ attr(X, "object", _), \+ edge(X, _, "CALLS").
|
|
9
|
+
*
|
|
10
|
+
* Это находит CALL узлы без "object" метаданных (т.е. CALL_SITE, не METHOD_CALL),
|
|
11
|
+
* которые не имеют CALLS ребра к определению функции.
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
import { Plugin, createSuccessResult } from '../Plugin.js';
|
|
15
|
+
import type { PluginContext, PluginResult, PluginMetadata } from '../Plugin.js';
|
|
16
|
+
import type { NodeRecord } from '@grafema/types';
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Call resolver issue
|
|
20
|
+
*/
|
|
21
|
+
interface CallResolverIssue {
|
|
22
|
+
type: string;
|
|
23
|
+
severity: string;
|
|
24
|
+
message: string;
|
|
25
|
+
callName: string;
|
|
26
|
+
nodeId: string;
|
|
27
|
+
file?: string;
|
|
28
|
+
line?: number;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* Method call statistics
|
|
33
|
+
*/
|
|
34
|
+
interface MethodCallStats {
|
|
35
|
+
total: number;
|
|
36
|
+
resolved: number;
|
|
37
|
+
external: number;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* Validation summary
|
|
42
|
+
*/
|
|
43
|
+
interface ValidationSummary {
|
|
44
|
+
totalCalls: number;
|
|
45
|
+
resolvedInternalCalls: number;
|
|
46
|
+
unresolvedInternalCalls: number;
|
|
47
|
+
externalMethodCalls: number;
|
|
48
|
+
issues: number;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* Datalog violation result
|
|
53
|
+
*/
|
|
54
|
+
interface DatalogViolation {
|
|
55
|
+
bindings: Array<{ name: string; value: string }>;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
export class CallResolverValidator extends Plugin {
|
|
59
|
+
get metadata(): PluginMetadata {
|
|
60
|
+
return {
|
|
61
|
+
name: 'CallResolverValidator',
|
|
62
|
+
phase: 'VALIDATION',
|
|
63
|
+
priority: 90,
|
|
64
|
+
creates: {
|
|
65
|
+
nodes: [],
|
|
66
|
+
edges: []
|
|
67
|
+
}
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
async execute(context: PluginContext): Promise<PluginResult> {
|
|
72
|
+
const { graph } = context;
|
|
73
|
+
|
|
74
|
+
console.log('[CallResolverValidator] Starting call resolution validation using Datalog...');
|
|
75
|
+
|
|
76
|
+
// Check if graph supports checkGuarantee
|
|
77
|
+
if (!graph.checkGuarantee) {
|
|
78
|
+
console.log('[CallResolverValidator] Graph does not support checkGuarantee, skipping validation');
|
|
79
|
+
return createSuccessResult({ nodes: 0, edges: 0 }, { skipped: true });
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
// Datalog гарантия:
|
|
83
|
+
// CALL без "object" (т.е. CALL_SITE) должен иметь CALLS ребро
|
|
84
|
+
const violations = await graph.checkGuarantee(`
|
|
85
|
+
violation(X) :- node(X, "CALL"), \\+ attr(X, "object", _), \\+ edge(X, _, "CALLS").
|
|
86
|
+
`) as DatalogViolation[];
|
|
87
|
+
|
|
88
|
+
const issues: CallResolverIssue[] = [];
|
|
89
|
+
|
|
90
|
+
if (violations.length > 0) {
|
|
91
|
+
console.log(`[CallResolverValidator] Found ${violations.length} unresolved function calls`);
|
|
92
|
+
|
|
93
|
+
for (const v of violations) {
|
|
94
|
+
const nodeId = v.bindings.find(b => b.name === 'X')?.value;
|
|
95
|
+
if (nodeId) {
|
|
96
|
+
const node = await graph.getNode(nodeId);
|
|
97
|
+
if (node) {
|
|
98
|
+
issues.push({
|
|
99
|
+
type: 'UNRESOLVED_FUNCTION_CALL',
|
|
100
|
+
severity: 'WARNING',
|
|
101
|
+
message: `Call to "${node.name}" at ${node.file}:${node.line || '?'} does not resolve to a function definition`,
|
|
102
|
+
callName: node.name as string,
|
|
103
|
+
nodeId: nodeId,
|
|
104
|
+
file: node.file,
|
|
105
|
+
line: node.line as number | undefined
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
// Также проверим METHOD_CALL на известные внешние методы
|
|
113
|
+
// (это информационно, не ошибка)
|
|
114
|
+
const methodCallStats = await this.countMethodCalls(graph);
|
|
115
|
+
|
|
116
|
+
const summary: ValidationSummary = {
|
|
117
|
+
totalCalls: methodCallStats.total,
|
|
118
|
+
resolvedInternalCalls: methodCallStats.resolved,
|
|
119
|
+
unresolvedInternalCalls: issues.length,
|
|
120
|
+
externalMethodCalls: methodCallStats.external,
|
|
121
|
+
issues: issues.length
|
|
122
|
+
};
|
|
123
|
+
|
|
124
|
+
console.log('[CallResolverValidator] Summary:', summary);
|
|
125
|
+
|
|
126
|
+
if (issues.length > 0) {
|
|
127
|
+
console.log(`[CallResolverValidator] Unresolved calls:`);
|
|
128
|
+
for (const issue of issues.slice(0, 10)) { // Show first 10
|
|
129
|
+
console.log(` ⚠️ ${issue.message}`);
|
|
130
|
+
}
|
|
131
|
+
if (issues.length > 10) {
|
|
132
|
+
console.log(` ... and ${issues.length - 10} more`);
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
return createSuccessResult(
|
|
137
|
+
{ nodes: 0, edges: 0 },
|
|
138
|
+
{ summary, issues }
|
|
139
|
+
);
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
/**
|
|
143
|
+
* Подсчитывает статистику по вызовам
|
|
144
|
+
*/
|
|
145
|
+
private async countMethodCalls(graph: PluginContext['graph']): Promise<MethodCallStats> {
|
|
146
|
+
const stats: MethodCallStats = {
|
|
147
|
+
total: 0,
|
|
148
|
+
resolved: 0,
|
|
149
|
+
external: 0
|
|
150
|
+
};
|
|
151
|
+
|
|
152
|
+
// Подсчитываем все CALL узлы
|
|
153
|
+
for await (const node of graph.queryNodes({ nodeType: 'CALL' })) {
|
|
154
|
+
stats.total++;
|
|
155
|
+
|
|
156
|
+
// Проверяем наличие "object" в метаданных (METHOD_CALL)
|
|
157
|
+
if ((node as NodeRecord & { object?: string }).object) {
|
|
158
|
+
stats.external++;
|
|
159
|
+
} else {
|
|
160
|
+
// CALL_SITE - проверяем есть ли CALLS ребро
|
|
161
|
+
const edges = await graph.getOutgoingEdges(node.id, ['CALLS']);
|
|
162
|
+
if (edges.length > 0) {
|
|
163
|
+
stats.resolved++;
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
return stats;
|
|
169
|
+
}
|
|
170
|
+
}
|