@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,140 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* RustModuleIndexer - plugin for indexing Rust modules
|
|
3
|
+
* Discovers .rs files in rust-engine/src/ directory
|
|
4
|
+
*/
|
|
5
|
+
import { readFileSync, existsSync, readdirSync, statSync } from 'fs';
|
|
6
|
+
import { resolve, relative, basename, join } from 'path';
|
|
7
|
+
import { createHash } from 'crypto';
|
|
8
|
+
import { Plugin, createSuccessResult } from '../Plugin.js';
|
|
9
|
+
// Test file patterns for Rust
|
|
10
|
+
const RUST_TEST_PATTERNS = [
|
|
11
|
+
/[/\\]tests[/\\]/, // /tests/
|
|
12
|
+
/_test\.rs$/, // _test.rs
|
|
13
|
+
/[/\\]test\.rs$/, // test.rs in subdirectory
|
|
14
|
+
];
|
|
15
|
+
export class RustModuleIndexer extends Plugin {
|
|
16
|
+
testPatterns;
|
|
17
|
+
constructor() {
|
|
18
|
+
super();
|
|
19
|
+
this.testPatterns = RUST_TEST_PATTERNS;
|
|
20
|
+
}
|
|
21
|
+
get metadata() {
|
|
22
|
+
return {
|
|
23
|
+
name: 'RustModuleIndexer',
|
|
24
|
+
phase: 'INDEXING',
|
|
25
|
+
priority: 85, // After JSModuleIndexer (90)
|
|
26
|
+
creates: {
|
|
27
|
+
nodes: ['RUST_MODULE'],
|
|
28
|
+
edges: ['CONTAINS']
|
|
29
|
+
}
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Check if file is a test file based on path patterns
|
|
34
|
+
*/
|
|
35
|
+
isTestFile(filePath) {
|
|
36
|
+
return this.testPatterns.some(pattern => pattern.test(filePath));
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Recursively find all .rs files in a directory
|
|
40
|
+
*/
|
|
41
|
+
findRustFiles(dir, files = []) {
|
|
42
|
+
try {
|
|
43
|
+
const entries = readdirSync(dir);
|
|
44
|
+
for (const entry of entries) {
|
|
45
|
+
// Skip target directory
|
|
46
|
+
if (entry === 'target')
|
|
47
|
+
continue;
|
|
48
|
+
const fullPath = join(dir, entry);
|
|
49
|
+
try {
|
|
50
|
+
const stat = statSync(fullPath);
|
|
51
|
+
if (stat.isDirectory()) {
|
|
52
|
+
this.findRustFiles(fullPath, files);
|
|
53
|
+
}
|
|
54
|
+
else if (entry.endsWith('.rs')) {
|
|
55
|
+
files.push(fullPath);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
catch {
|
|
59
|
+
// Skip files we can't stat
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
catch {
|
|
64
|
+
// Skip directories we can't read
|
|
65
|
+
}
|
|
66
|
+
return files;
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Convert file path to Rust module name
|
|
70
|
+
* src/ffi/napi_bindings.rs -> ffi::napi_bindings
|
|
71
|
+
* src/lib.rs -> crate
|
|
72
|
+
* src/ffi/mod.rs -> ffi
|
|
73
|
+
*/
|
|
74
|
+
pathToModuleName(relativePath) {
|
|
75
|
+
let name = relativePath
|
|
76
|
+
.replace(/\.rs$/, '')
|
|
77
|
+
.replace(/\//g, '::');
|
|
78
|
+
if (name.endsWith('::mod')) {
|
|
79
|
+
name = name.replace(/::mod$/, '');
|
|
80
|
+
}
|
|
81
|
+
if (name === 'lib') {
|
|
82
|
+
name = 'crate';
|
|
83
|
+
}
|
|
84
|
+
return name;
|
|
85
|
+
}
|
|
86
|
+
async execute(context) {
|
|
87
|
+
const { manifest, graph, onProgress } = context;
|
|
88
|
+
// Cast manifest to expected shape
|
|
89
|
+
const typedManifest = manifest;
|
|
90
|
+
const { projectPath } = typedManifest;
|
|
91
|
+
// Find rust-engine/src directory
|
|
92
|
+
const rustRoot = resolve(projectPath, 'rust-engine/src');
|
|
93
|
+
if (!existsSync(rustRoot)) {
|
|
94
|
+
console.log('[RustModuleIndexer] rust-engine/src not found, skipping');
|
|
95
|
+
return createSuccessResult({ nodes: 0, edges: 0 }, { skipped: true });
|
|
96
|
+
}
|
|
97
|
+
// Discover all .rs files recursively
|
|
98
|
+
const rsFiles = this.findRustFiles(rustRoot);
|
|
99
|
+
console.log(`[RustModuleIndexer] Found ${rsFiles.length} .rs files`);
|
|
100
|
+
let nodesCreated = 0;
|
|
101
|
+
const errors = [];
|
|
102
|
+
for (const filePath of rsFiles) {
|
|
103
|
+
try {
|
|
104
|
+
const content = readFileSync(filePath, 'utf-8');
|
|
105
|
+
const hash = createHash('sha256').update(content).digest('hex');
|
|
106
|
+
const relativePath = relative(rustRoot, filePath);
|
|
107
|
+
const moduleName = this.pathToModuleName(relativePath);
|
|
108
|
+
const nodeId = `RUST_MODULE#${moduleName}#${filePath}`;
|
|
109
|
+
await graph.addNode({
|
|
110
|
+
id: nodeId,
|
|
111
|
+
type: 'RUST_MODULE',
|
|
112
|
+
name: moduleName,
|
|
113
|
+
file: filePath,
|
|
114
|
+
contentHash: hash,
|
|
115
|
+
isLib: basename(filePath) === 'lib.rs',
|
|
116
|
+
isMod: basename(filePath) === 'mod.rs',
|
|
117
|
+
isTest: this.isTestFile(filePath)
|
|
118
|
+
});
|
|
119
|
+
nodesCreated++;
|
|
120
|
+
if (onProgress && nodesCreated % 10 === 0) {
|
|
121
|
+
onProgress({
|
|
122
|
+
phase: 'indexing',
|
|
123
|
+
currentPlugin: 'RustModuleIndexer',
|
|
124
|
+
message: `Indexed ${nodesCreated}/${rsFiles.length} Rust modules`,
|
|
125
|
+
totalFiles: rsFiles.length,
|
|
126
|
+
processedFiles: nodesCreated
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
catch (err) {
|
|
131
|
+
errors.push({ file: filePath, error: err.message });
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
if (errors.length > 0) {
|
|
135
|
+
console.warn(`[RustModuleIndexer] ${errors.length} errors during indexing`);
|
|
136
|
+
}
|
|
137
|
+
console.log(`[RustModuleIndexer] Indexed ${nodesCreated} Rust modules`);
|
|
138
|
+
return createSuccessResult({ nodes: nodesCreated, edges: 0 }, { errors: errors.length });
|
|
139
|
+
}
|
|
140
|
+
}
|
|
@@ -0,0 +1,46 @@
|
|
|
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
|
+
import type { NodeRecord } from '@grafema/types';
|
|
10
|
+
/**
|
|
11
|
+
* Context for ServiceDetector
|
|
12
|
+
*/
|
|
13
|
+
interface DetectorContext {
|
|
14
|
+
projectPath: string;
|
|
15
|
+
graph: {
|
|
16
|
+
addNode(node: NodeRecord): Promise<void>;
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
export declare class ServiceDetector {
|
|
20
|
+
name: string;
|
|
21
|
+
phase: string;
|
|
22
|
+
priority: number;
|
|
23
|
+
constructor();
|
|
24
|
+
/**
|
|
25
|
+
* Анализирует проект и создаёт SERVICE ноды
|
|
26
|
+
*/
|
|
27
|
+
analyze(context: DetectorContext): Promise<DetectorContext>;
|
|
28
|
+
/**
|
|
29
|
+
* Обнаруживает сервисы в директории монорепо
|
|
30
|
+
*/
|
|
31
|
+
private detectServicesInDir;
|
|
32
|
+
/**
|
|
33
|
+
* Обнаруживает корневой сервис (не монорепо)
|
|
34
|
+
*/
|
|
35
|
+
private detectRootService;
|
|
36
|
+
/**
|
|
37
|
+
* Создаёт объект сервиса из директории
|
|
38
|
+
*/
|
|
39
|
+
private createServiceFromDir;
|
|
40
|
+
/**
|
|
41
|
+
* Находит entry point сервиса
|
|
42
|
+
*/
|
|
43
|
+
private findEntryPoint;
|
|
44
|
+
}
|
|
45
|
+
export {};
|
|
46
|
+
//# sourceMappingURL=ServiceDetector.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ServiceDetector.d.ts","sourceRoot":"","sources":["../../../src/plugins/indexing/ServiceDetector.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAEjD;;GAEG;AACH,UAAU,eAAe;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE;QACL,OAAO,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;KAC1C,CAAC;CACH;AAuBD,qBAAa,eAAe;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;;IAQjB;;OAEG;IACG,OAAO,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,eAAe,CAAC;IA+CjE;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAgC3B;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAWzB;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAuC5B;;OAEG;IACH,OAAO,CAAC,cAAc;CA8BvB"}
|
|
@@ -0,0 +1,164 @@
|
|
|
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
|
+
import { readFileSync, existsSync, readdirSync, statSync } from 'fs';
|
|
10
|
+
import { join, basename } from 'path';
|
|
11
|
+
export class ServiceDetector {
|
|
12
|
+
name;
|
|
13
|
+
phase;
|
|
14
|
+
priority;
|
|
15
|
+
constructor() {
|
|
16
|
+
this.name = 'ServiceDetector';
|
|
17
|
+
this.phase = 'INDEXING';
|
|
18
|
+
this.priority = 90; // Запускается перед JSModuleIndexer
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Анализирует проект и создаёт SERVICE ноды
|
|
22
|
+
*/
|
|
23
|
+
async analyze(context) {
|
|
24
|
+
const { projectPath, graph } = context;
|
|
25
|
+
const services = [];
|
|
26
|
+
console.log(`[${this.name}] Detecting services in: ${projectPath}`);
|
|
27
|
+
// Паттерн 1: Монорепо структура (apps/, packages/, services/)
|
|
28
|
+
const monorepoPatterns = ['apps', 'packages', 'services'];
|
|
29
|
+
for (const pattern of monorepoPatterns) {
|
|
30
|
+
const monorepoDir = join(projectPath, pattern);
|
|
31
|
+
if (existsSync(monorepoDir)) {
|
|
32
|
+
const detected = this.detectServicesInDir(monorepoDir, projectPath);
|
|
33
|
+
services.push(...detected);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
// Паттерн 2: Корневой проект (если нет монорепо)
|
|
37
|
+
if (services.length === 0) {
|
|
38
|
+
const rootService = this.detectRootService(projectPath);
|
|
39
|
+
if (rootService) {
|
|
40
|
+
services.push(rootService);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
// Создаём SERVICE ноды в графе
|
|
44
|
+
for (const service of services) {
|
|
45
|
+
await graph.addNode({
|
|
46
|
+
id: service.id,
|
|
47
|
+
type: 'SERVICE',
|
|
48
|
+
name: service.name,
|
|
49
|
+
file: service.path,
|
|
50
|
+
metadata: {
|
|
51
|
+
packageJson: service.packageJson,
|
|
52
|
+
entryPoint: service.entryPoint,
|
|
53
|
+
hasDockerfile: service.hasDockerfile
|
|
54
|
+
}
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
console.log(`[${this.name}] Detected ${services.length} services`);
|
|
58
|
+
services.forEach(s => console.log(` - ${s.name} (${s.path})`));
|
|
59
|
+
return context;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Обнаруживает сервисы в директории монорепо
|
|
63
|
+
*/
|
|
64
|
+
detectServicesInDir(dir, projectPath) {
|
|
65
|
+
const services = [];
|
|
66
|
+
try {
|
|
67
|
+
const entries = readdirSync(dir);
|
|
68
|
+
for (const entry of entries) {
|
|
69
|
+
const fullPath = join(dir, entry);
|
|
70
|
+
// Пропускаем файлы и скрытые директории
|
|
71
|
+
if (!statSync(fullPath).isDirectory() || entry.startsWith('.')) {
|
|
72
|
+
continue;
|
|
73
|
+
}
|
|
74
|
+
// Проверяем признаки сервиса
|
|
75
|
+
const packageJsonPath = join(fullPath, 'package.json');
|
|
76
|
+
const hasPackageJson = existsSync(packageJsonPath);
|
|
77
|
+
if (hasPackageJson) {
|
|
78
|
+
const service = this.createServiceFromDir(fullPath, entry, projectPath);
|
|
79
|
+
if (service) {
|
|
80
|
+
services.push(service);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
catch (error) {
|
|
86
|
+
console.warn(`[${this.name}] Error scanning ${dir}:`, error.message);
|
|
87
|
+
}
|
|
88
|
+
return services;
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Обнаруживает корневой сервис (не монорепо)
|
|
92
|
+
*/
|
|
93
|
+
detectRootService(projectPath) {
|
|
94
|
+
const packageJsonPath = join(projectPath, 'package.json');
|
|
95
|
+
if (!existsSync(packageJsonPath)) {
|
|
96
|
+
return null;
|
|
97
|
+
}
|
|
98
|
+
const projectName = basename(projectPath);
|
|
99
|
+
return this.createServiceFromDir(projectPath, projectName, projectPath);
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Создаёт объект сервиса из директории
|
|
103
|
+
*/
|
|
104
|
+
createServiceFromDir(servicePath, serviceName, projectPath) {
|
|
105
|
+
try {
|
|
106
|
+
const packageJsonPath = join(servicePath, 'package.json');
|
|
107
|
+
let packageJson = null;
|
|
108
|
+
if (existsSync(packageJsonPath)) {
|
|
109
|
+
const content = readFileSync(packageJsonPath, 'utf-8');
|
|
110
|
+
packageJson = JSON.parse(content);
|
|
111
|
+
}
|
|
112
|
+
// Определяем entry point
|
|
113
|
+
const entryPoint = this.findEntryPoint(servicePath, packageJson);
|
|
114
|
+
// Проверяем наличие Dockerfile
|
|
115
|
+
const hasDockerfile = existsSync(join(servicePath, 'Dockerfile')) ||
|
|
116
|
+
existsSync(join(servicePath, 'dockerfile'));
|
|
117
|
+
// Генерируем ID сервиса
|
|
118
|
+
const relativePath = servicePath.replace(projectPath, '').replace(/^\//, '');
|
|
119
|
+
const serviceId = `SERVICE:${relativePath || serviceName}`;
|
|
120
|
+
return {
|
|
121
|
+
id: serviceId,
|
|
122
|
+
name: packageJson?.name || serviceName,
|
|
123
|
+
path: servicePath,
|
|
124
|
+
packageJson,
|
|
125
|
+
entryPoint,
|
|
126
|
+
hasDockerfile
|
|
127
|
+
};
|
|
128
|
+
}
|
|
129
|
+
catch (error) {
|
|
130
|
+
console.warn(`[${this.name}] Error creating service from ${servicePath}:`, error.message);
|
|
131
|
+
return null;
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Находит entry point сервиса
|
|
136
|
+
*/
|
|
137
|
+
findEntryPoint(servicePath, packageJson) {
|
|
138
|
+
// 1. Из package.json main
|
|
139
|
+
if (packageJson?.main) {
|
|
140
|
+
return packageJson.main;
|
|
141
|
+
}
|
|
142
|
+
// 2. Стандартные entry points
|
|
143
|
+
const candidates = [
|
|
144
|
+
'src/index.js',
|
|
145
|
+
'src/index.ts',
|
|
146
|
+
'src/server.js',
|
|
147
|
+
'src/server.ts',
|
|
148
|
+
'src/main.js',
|
|
149
|
+
'src/main.ts',
|
|
150
|
+
'index.js',
|
|
151
|
+
'index.ts',
|
|
152
|
+
'server.js',
|
|
153
|
+
'server.ts',
|
|
154
|
+
'app.js',
|
|
155
|
+
'app.ts'
|
|
156
|
+
];
|
|
157
|
+
for (const candidate of candidates) {
|
|
158
|
+
if (existsSync(join(servicePath, candidate))) {
|
|
159
|
+
return candidate;
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
return null;
|
|
163
|
+
}
|
|
164
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
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
|
+
import { Plugin } from '../Plugin.js';
|
|
14
|
+
import type { PluginContext, PluginResult, PluginMetadata } from '../Plugin.js';
|
|
15
|
+
export declare class CallResolverValidator extends Plugin {
|
|
16
|
+
get metadata(): PluginMetadata;
|
|
17
|
+
execute(context: PluginContext): Promise<PluginResult>;
|
|
18
|
+
/**
|
|
19
|
+
* Подсчитывает статистику по вызовам
|
|
20
|
+
*/
|
|
21
|
+
private countMethodCalls;
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=CallResolverValidator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CallResolverValidator.d.ts","sourceRoot":"","sources":["../../../src/plugins/validation/CallResolverValidator.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,MAAM,EAAuB,MAAM,cAAc,CAAC;AAC3D,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AA2ChF,qBAAa,qBAAsB,SAAQ,MAAM;IAC/C,IAAI,QAAQ,IAAI,cAAc,CAU7B;IAEK,OAAO,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,YAAY,CAAC;IAuE5D;;OAEG;YACW,gBAAgB;CAyB/B"}
|
|
@@ -0,0 +1,108 @@
|
|
|
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
|
+
import { Plugin, createSuccessResult } from '../Plugin.js';
|
|
14
|
+
export class CallResolverValidator extends Plugin {
|
|
15
|
+
get metadata() {
|
|
16
|
+
return {
|
|
17
|
+
name: 'CallResolverValidator',
|
|
18
|
+
phase: 'VALIDATION',
|
|
19
|
+
priority: 90,
|
|
20
|
+
creates: {
|
|
21
|
+
nodes: [],
|
|
22
|
+
edges: []
|
|
23
|
+
}
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
async execute(context) {
|
|
27
|
+
const { graph } = context;
|
|
28
|
+
console.log('[CallResolverValidator] Starting call resolution validation using Datalog...');
|
|
29
|
+
// Check if graph supports checkGuarantee
|
|
30
|
+
if (!graph.checkGuarantee) {
|
|
31
|
+
console.log('[CallResolverValidator] Graph does not support checkGuarantee, skipping validation');
|
|
32
|
+
return createSuccessResult({ nodes: 0, edges: 0 }, { skipped: true });
|
|
33
|
+
}
|
|
34
|
+
// Datalog гарантия:
|
|
35
|
+
// CALL без "object" (т.е. CALL_SITE) должен иметь CALLS ребро
|
|
36
|
+
const violations = await graph.checkGuarantee(`
|
|
37
|
+
violation(X) :- node(X, "CALL"), \\+ attr(X, "object", _), \\+ edge(X, _, "CALLS").
|
|
38
|
+
`);
|
|
39
|
+
const issues = [];
|
|
40
|
+
if (violations.length > 0) {
|
|
41
|
+
console.log(`[CallResolverValidator] Found ${violations.length} unresolved function calls`);
|
|
42
|
+
for (const v of violations) {
|
|
43
|
+
const nodeId = v.bindings.find(b => b.name === 'X')?.value;
|
|
44
|
+
if (nodeId) {
|
|
45
|
+
const node = await graph.getNode(nodeId);
|
|
46
|
+
if (node) {
|
|
47
|
+
issues.push({
|
|
48
|
+
type: 'UNRESOLVED_FUNCTION_CALL',
|
|
49
|
+
severity: 'WARNING',
|
|
50
|
+
message: `Call to "${node.name}" at ${node.file}:${node.line || '?'} does not resolve to a function definition`,
|
|
51
|
+
callName: node.name,
|
|
52
|
+
nodeId: nodeId,
|
|
53
|
+
file: node.file,
|
|
54
|
+
line: node.line
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
// Также проверим METHOD_CALL на известные внешние методы
|
|
61
|
+
// (это информационно, не ошибка)
|
|
62
|
+
const methodCallStats = await this.countMethodCalls(graph);
|
|
63
|
+
const summary = {
|
|
64
|
+
totalCalls: methodCallStats.total,
|
|
65
|
+
resolvedInternalCalls: methodCallStats.resolved,
|
|
66
|
+
unresolvedInternalCalls: issues.length,
|
|
67
|
+
externalMethodCalls: methodCallStats.external,
|
|
68
|
+
issues: issues.length
|
|
69
|
+
};
|
|
70
|
+
console.log('[CallResolverValidator] Summary:', summary);
|
|
71
|
+
if (issues.length > 0) {
|
|
72
|
+
console.log(`[CallResolverValidator] Unresolved calls:`);
|
|
73
|
+
for (const issue of issues.slice(0, 10)) { // Show first 10
|
|
74
|
+
console.log(` ⚠️ ${issue.message}`);
|
|
75
|
+
}
|
|
76
|
+
if (issues.length > 10) {
|
|
77
|
+
console.log(` ... and ${issues.length - 10} more`);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
return createSuccessResult({ nodes: 0, edges: 0 }, { summary, issues });
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Подсчитывает статистику по вызовам
|
|
84
|
+
*/
|
|
85
|
+
async countMethodCalls(graph) {
|
|
86
|
+
const stats = {
|
|
87
|
+
total: 0,
|
|
88
|
+
resolved: 0,
|
|
89
|
+
external: 0
|
|
90
|
+
};
|
|
91
|
+
// Подсчитываем все CALL узлы
|
|
92
|
+
for await (const node of graph.queryNodes({ nodeType: 'CALL' })) {
|
|
93
|
+
stats.total++;
|
|
94
|
+
// Проверяем наличие "object" в метаданных (METHOD_CALL)
|
|
95
|
+
if (node.object) {
|
|
96
|
+
stats.external++;
|
|
97
|
+
}
|
|
98
|
+
else {
|
|
99
|
+
// CALL_SITE - проверяем есть ли CALLS ребро
|
|
100
|
+
const edges = await graph.getOutgoingEdges(node.id, ['CALLS']);
|
|
101
|
+
if (edges.length > 0) {
|
|
102
|
+
stats.resolved++;
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
return stats;
|
|
107
|
+
}
|
|
108
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DataFlowValidator - проверяет что все переменные прослеживаются до листовых узлов
|
|
3
|
+
*
|
|
4
|
+
* ПРАВИЛО: Каждая переменная должна иметь путь до листового узла через ASSIGNED_FROM рёбра
|
|
5
|
+
*
|
|
6
|
+
* ЛИСТОВЫЕ УЗЛЫ:
|
|
7
|
+
* - LITERAL: примитивные значения
|
|
8
|
+
* - EXTERNAL_STDIO: console.log/error
|
|
9
|
+
* - EXTERNAL_DATABASE: database queries
|
|
10
|
+
* - EXTERNAL_NETWORK: HTTP requests
|
|
11
|
+
* - EXTERNAL_FILESYSTEM: fs.readFile
|
|
12
|
+
* - EVENT_LISTENER: события
|
|
13
|
+
*/
|
|
14
|
+
import { Plugin } from '../Plugin.js';
|
|
15
|
+
import type { PluginContext, PluginResult, PluginMetadata } from '../Plugin.js';
|
|
16
|
+
export declare class DataFlowValidator extends Plugin {
|
|
17
|
+
get metadata(): PluginMetadata;
|
|
18
|
+
execute(context: PluginContext): Promise<PluginResult>;
|
|
19
|
+
/**
|
|
20
|
+
* Находит путь от переменной до листового узла
|
|
21
|
+
*/
|
|
22
|
+
private findPathToLeaf;
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=DataFlowValidator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DataFlowValidator.d.ts","sourceRoot":"","sources":["../../../src/plugins/validation/DataFlowValidator.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,MAAM,EAAuB,MAAM,cAAc,CAAC;AAC3D,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AA4ChF,qBAAa,iBAAkB,SAAQ,MAAM;IAC3C,IAAI,QAAQ,IAAI,cAAc,CAU7B;IAEK,OAAO,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,YAAY,CAAC;IAkH5D;;OAEG;IACH,OAAO,CAAC,cAAc;CA2CvB"}
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DataFlowValidator - проверяет что все переменные прослеживаются до листовых узлов
|
|
3
|
+
*
|
|
4
|
+
* ПРАВИЛО: Каждая переменная должна иметь путь до листового узла через ASSIGNED_FROM рёбра
|
|
5
|
+
*
|
|
6
|
+
* ЛИСТОВЫЕ УЗЛЫ:
|
|
7
|
+
* - LITERAL: примитивные значения
|
|
8
|
+
* - EXTERNAL_STDIO: console.log/error
|
|
9
|
+
* - EXTERNAL_DATABASE: database queries
|
|
10
|
+
* - EXTERNAL_NETWORK: HTTP requests
|
|
11
|
+
* - EXTERNAL_FILESYSTEM: fs.readFile
|
|
12
|
+
* - EVENT_LISTENER: события
|
|
13
|
+
*/
|
|
14
|
+
import { Plugin, createSuccessResult } from '../Plugin.js';
|
|
15
|
+
export class DataFlowValidator extends Plugin {
|
|
16
|
+
get metadata() {
|
|
17
|
+
return {
|
|
18
|
+
name: 'DataFlowValidator',
|
|
19
|
+
phase: 'VALIDATION',
|
|
20
|
+
priority: 100,
|
|
21
|
+
creates: {
|
|
22
|
+
nodes: [],
|
|
23
|
+
edges: []
|
|
24
|
+
}
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
async execute(context) {
|
|
28
|
+
const { graph } = context;
|
|
29
|
+
console.log('[DataFlowValidator] Starting data flow validation...');
|
|
30
|
+
// Check if graph supports getAllEdges
|
|
31
|
+
if (!graph.getAllEdges) {
|
|
32
|
+
console.log('[DataFlowValidator] Graph does not support getAllEdges, skipping validation');
|
|
33
|
+
return createSuccessResult({ nodes: 0, edges: 0 }, { skipped: true });
|
|
34
|
+
}
|
|
35
|
+
// Получаем все переменные
|
|
36
|
+
const allNodes = await graph.getAllNodes();
|
|
37
|
+
const allEdges = await graph.getAllEdges();
|
|
38
|
+
const variables = allNodes.filter(n => n.type === 'VARIABLE_DECLARATION' || n.type === 'CONSTANT');
|
|
39
|
+
console.log(`[DataFlowValidator] Found ${variables.length} variables to validate`);
|
|
40
|
+
const issues = [];
|
|
41
|
+
const leafTypes = new Set([
|
|
42
|
+
'LITERAL',
|
|
43
|
+
'EXTERNAL_STDIO',
|
|
44
|
+
'EXTERNAL_DATABASE',
|
|
45
|
+
'EXTERNAL_NETWORK',
|
|
46
|
+
'EXTERNAL_FILESYSTEM',
|
|
47
|
+
'EVENT_LISTENER',
|
|
48
|
+
'CLASS', // NewExpression - конструкторы классов
|
|
49
|
+
'FUNCTION', // Arrow functions и function expressions
|
|
50
|
+
'METHOD_CALL', // Вызовы методов (промежуточные узлы)
|
|
51
|
+
'CALL_SITE' // Вызовы функций (промежуточные узлы)
|
|
52
|
+
]);
|
|
53
|
+
for (const variable of variables) {
|
|
54
|
+
// Проверяем наличие ASSIGNED_FROM ребра
|
|
55
|
+
const assignment = allEdges.find(e => e.type === 'ASSIGNED_FROM' && e.src === variable.id);
|
|
56
|
+
if (!assignment) {
|
|
57
|
+
issues.push({
|
|
58
|
+
type: 'MISSING_ASSIGNMENT',
|
|
59
|
+
severity: 'WARNING',
|
|
60
|
+
message: `Variable "${variable.name}" (${variable.file}:${variable.line}) has no ASSIGNED_FROM edge`,
|
|
61
|
+
variable: variable.name,
|
|
62
|
+
file: variable.file,
|
|
63
|
+
line: variable.line
|
|
64
|
+
});
|
|
65
|
+
continue;
|
|
66
|
+
}
|
|
67
|
+
// Проверяем что источник существует
|
|
68
|
+
const source = allNodes.find(n => n.id === assignment.dst);
|
|
69
|
+
if (!source) {
|
|
70
|
+
issues.push({
|
|
71
|
+
type: 'BROKEN_REFERENCE',
|
|
72
|
+
severity: 'ERROR',
|
|
73
|
+
message: `Variable "${variable.name}" references non-existent node ${assignment.dst}`,
|
|
74
|
+
variable: variable.name,
|
|
75
|
+
file: variable.file,
|
|
76
|
+
line: variable.line
|
|
77
|
+
});
|
|
78
|
+
continue;
|
|
79
|
+
}
|
|
80
|
+
// Проверяем путь до листового узла
|
|
81
|
+
const path = this.findPathToLeaf(variable, allNodes, allEdges, leafTypes);
|
|
82
|
+
if (!path.found) {
|
|
83
|
+
issues.push({
|
|
84
|
+
type: 'NO_LEAF_NODE',
|
|
85
|
+
severity: 'WARNING',
|
|
86
|
+
message: `Variable "${variable.name}" (${variable.file}:${variable.line}) does not trace to a leaf node. Chain: ${path.chain.join(' -> ')}`,
|
|
87
|
+
variable: variable.name,
|
|
88
|
+
file: variable.file,
|
|
89
|
+
line: variable.line,
|
|
90
|
+
chain: path.chain
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
// Группируем issues по типу
|
|
95
|
+
const summary = {
|
|
96
|
+
total: variables.length,
|
|
97
|
+
validated: variables.length - issues.length,
|
|
98
|
+
issues: issues.length,
|
|
99
|
+
byType: {}
|
|
100
|
+
};
|
|
101
|
+
for (const issue of issues) {
|
|
102
|
+
if (!summary.byType[issue.type]) {
|
|
103
|
+
summary.byType[issue.type] = 0;
|
|
104
|
+
}
|
|
105
|
+
summary.byType[issue.type]++;
|
|
106
|
+
}
|
|
107
|
+
console.log('[DataFlowValidator] Summary:', summary);
|
|
108
|
+
// Выводим issues
|
|
109
|
+
if (issues.length > 0) {
|
|
110
|
+
console.log(`[DataFlowValidator] Found ${issues.length} issues:`);
|
|
111
|
+
for (const issue of issues) {
|
|
112
|
+
const level = issue.severity === 'ERROR' ? '❌' : '⚠️';
|
|
113
|
+
console.log(` ${level} [${issue.type}] ${issue.message}`);
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
return createSuccessResult({ nodes: 0, edges: 0 }, { summary, issues });
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Находит путь от переменной до листового узла
|
|
120
|
+
*/
|
|
121
|
+
findPathToLeaf(startNode, allNodes, allEdges, leafTypes, visited = new Set(), chain = []) {
|
|
122
|
+
// Защита от циклов
|
|
123
|
+
if (visited.has(startNode.id)) {
|
|
124
|
+
return { found: false, chain: [...chain, `${startNode.type}:${startNode.name} (CYCLE)`] };
|
|
125
|
+
}
|
|
126
|
+
visited.add(startNode.id);
|
|
127
|
+
chain.push(`${startNode.type}:${startNode.name}`);
|
|
128
|
+
// Проверяем что это листовой узел
|
|
129
|
+
if (leafTypes.has(startNode.type)) {
|
|
130
|
+
return { found: true, chain };
|
|
131
|
+
}
|
|
132
|
+
// Ищем ASSIGNED_FROM ребро
|
|
133
|
+
const assignment = allEdges.find(e => e.type === 'ASSIGNED_FROM' && e.src === startNode.id);
|
|
134
|
+
if (!assignment) {
|
|
135
|
+
// Для METHOD_CALL и CALL_SITE - это промежуточные узлы, но можем считать их leaf для первой версии
|
|
136
|
+
if (startNode.type === 'METHOD_CALL' || startNode.type === 'CALL_SITE') {
|
|
137
|
+
return { found: true, chain: [...chain, '(intermediate node)'] };
|
|
138
|
+
}
|
|
139
|
+
return { found: false, chain: [...chain, '(no assignment)'] };
|
|
140
|
+
}
|
|
141
|
+
// Продолжаем по цепочке
|
|
142
|
+
const nextNode = allNodes.find(n => n.id === assignment.dst);
|
|
143
|
+
if (!nextNode) {
|
|
144
|
+
return { found: false, chain: [...chain, '(broken reference)'] };
|
|
145
|
+
}
|
|
146
|
+
return this.findPathToLeaf(nextNode, allNodes, allEdges, leafTypes, visited, chain);
|
|
147
|
+
}
|
|
148
|
+
}
|