@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,119 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ShadowingDetector - detects variable shadowing issues
|
|
3
|
+
*
|
|
4
|
+
* Detects two types of shadowing:
|
|
5
|
+
*
|
|
6
|
+
* 1. Cross-file shadowing:
|
|
7
|
+
* - CLASS `User` defined in models.js
|
|
8
|
+
* - VARIABLE `User` in handlers.js shadows the class
|
|
9
|
+
* - Method calls on the variable go to wrong target
|
|
10
|
+
*
|
|
11
|
+
* 2. Scope-aware shadowing:
|
|
12
|
+
* - import { User } from './models'
|
|
13
|
+
* - function handler() { const User = {...}; User.save(); }
|
|
14
|
+
* - Local variable shadows the imported class
|
|
15
|
+
*
|
|
16
|
+
* Implementation notes:
|
|
17
|
+
* - Datalog doesn't support inequality (\=), so we use JS filtering
|
|
18
|
+
* - queryNodes is an async generator, use getAllNodes for arrays
|
|
19
|
+
*/
|
|
20
|
+
import { Plugin, createSuccessResult } from '../Plugin.js';
|
|
21
|
+
export class ShadowingDetector extends Plugin {
|
|
22
|
+
get metadata() {
|
|
23
|
+
return {
|
|
24
|
+
name: 'ShadowingDetector',
|
|
25
|
+
phase: 'VALIDATION',
|
|
26
|
+
priority: 80, // After enrichment, before other validators
|
|
27
|
+
creates: {
|
|
28
|
+
nodes: [],
|
|
29
|
+
edges: []
|
|
30
|
+
}
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
async execute(context) {
|
|
34
|
+
const { graph } = context;
|
|
35
|
+
console.log('[ShadowingDetector] Checking for variable shadowing...');
|
|
36
|
+
const issues = [];
|
|
37
|
+
// Get all relevant nodes
|
|
38
|
+
const allClasses = await graph.getAllNodes({ type: 'CLASS' });
|
|
39
|
+
const allVariables = await graph.getAllNodes({ type: 'VARIABLE' });
|
|
40
|
+
const allConstants = await graph.getAllNodes({ type: 'CONSTANT' });
|
|
41
|
+
const allImports = await graph.getAllNodes({ type: 'IMPORT' });
|
|
42
|
+
// Build maps for efficient lookup
|
|
43
|
+
const classesByName = new Map();
|
|
44
|
+
for (const cls of allClasses) {
|
|
45
|
+
const name = cls.name;
|
|
46
|
+
if (!classesByName.has(name)) {
|
|
47
|
+
classesByName.set(name, []);
|
|
48
|
+
}
|
|
49
|
+
classesByName.get(name).push(cls);
|
|
50
|
+
}
|
|
51
|
+
const importsByFileAndLocal = new Map();
|
|
52
|
+
for (const imp of allImports) {
|
|
53
|
+
const key = `${imp.file}:${imp.local}`;
|
|
54
|
+
importsByFileAndLocal.set(key, imp);
|
|
55
|
+
}
|
|
56
|
+
// 1. Cross-file shadowing: VARIABLE shadows CLASS from another file
|
|
57
|
+
for (const variable of allVariables) {
|
|
58
|
+
const name = variable.name;
|
|
59
|
+
const classesWithSameName = classesByName.get(name);
|
|
60
|
+
if (classesWithSameName) {
|
|
61
|
+
// Find classes in different files
|
|
62
|
+
const shadowedClasses = classesWithSameName.filter(c => c.file !== variable.file);
|
|
63
|
+
for (const shadowedClass of shadowedClasses) {
|
|
64
|
+
issues.push({
|
|
65
|
+
type: 'CROSS_FILE_SHADOW',
|
|
66
|
+
severity: 'WARNING',
|
|
67
|
+
message: `Variable "${name}" at ${variable.file}:${variable.line || '?'} shadows class "${name}" from ${shadowedClass.file}`,
|
|
68
|
+
shadowingNodeId: variable.id,
|
|
69
|
+
shadowedName: name,
|
|
70
|
+
shadowedNodeId: shadowedClass.id,
|
|
71
|
+
shadowedFile: shadowedClass.file,
|
|
72
|
+
file: variable.file,
|
|
73
|
+
line: variable.line
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
// 2. Scope-aware shadowing: local VARIABLE/CONSTANT shadows IMPORT
|
|
79
|
+
// Variables/constants with parentScopeId (inside functions) that shadow imports
|
|
80
|
+
const allLocalVars = [...allVariables, ...allConstants].filter(v => v.parentScopeId);
|
|
81
|
+
for (const localVar of allLocalVars) {
|
|
82
|
+
const name = localVar.name;
|
|
83
|
+
const importKey = `${localVar.file}:${name}`;
|
|
84
|
+
const shadowedImport = importsByFileAndLocal.get(importKey);
|
|
85
|
+
if (shadowedImport) {
|
|
86
|
+
const nodeType = localVar.type === 'CONSTANT' ? 'constant' : 'variable';
|
|
87
|
+
issues.push({
|
|
88
|
+
type: 'SCOPE_SHADOW',
|
|
89
|
+
severity: 'WARNING',
|
|
90
|
+
message: `Local ${nodeType} "${name}" at ${localVar.file}:${localVar.line || '?'} shadows imported "${name}"`,
|
|
91
|
+
shadowingNodeId: localVar.id,
|
|
92
|
+
shadowedName: name,
|
|
93
|
+
shadowedNodeId: shadowedImport.id,
|
|
94
|
+
file: localVar.file,
|
|
95
|
+
line: localVar.line,
|
|
96
|
+
scope: localVar.parentScopeId
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
const crossFileCount = issues.filter(i => i.type === 'CROSS_FILE_SHADOW').length;
|
|
101
|
+
const scopeCount = issues.filter(i => i.type === 'SCOPE_SHADOW').length;
|
|
102
|
+
const summary = {
|
|
103
|
+
crossFileShadows: crossFileCount,
|
|
104
|
+
scopeShadows: scopeCount,
|
|
105
|
+
totalIssues: issues.length
|
|
106
|
+
};
|
|
107
|
+
console.log('[ShadowingDetector] Summary:', summary);
|
|
108
|
+
if (issues.length > 0) {
|
|
109
|
+
console.log('[ShadowingDetector] Shadowing issues found:');
|
|
110
|
+
for (const issue of issues) {
|
|
111
|
+
console.log(` ${issue.type === 'CROSS_FILE_SHADOW' ? '📁' : '🔒'} ${issue.message}`);
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
else {
|
|
115
|
+
console.log('[ShadowingDetector] No shadowing issues detected');
|
|
116
|
+
}
|
|
117
|
+
return createSuccessResult({ nodes: 0, edges: 0 }, { summary, issues });
|
|
118
|
+
}
|
|
119
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TypeScriptDeadCodeValidator - detects unused TypeScript constructs
|
|
3
|
+
*
|
|
4
|
+
* Checks:
|
|
5
|
+
* - Unused interfaces (no IMPLEMENTS edges)
|
|
6
|
+
* - Empty interfaces (no properties)
|
|
7
|
+
* - Interfaces with single implementation (possible over-engineering)
|
|
8
|
+
* - Unused enums (no references) - requires USES_TYPE edges
|
|
9
|
+
* - Unused type aliases (no references) - requires USES_TYPE edges
|
|
10
|
+
*
|
|
11
|
+
* NOTE: Full "unused type" detection requires USES_TYPE edges which track
|
|
12
|
+
* where types are used in function parameters, return types, and variables.
|
|
13
|
+
* Currently we can only detect interfaces without implementations.
|
|
14
|
+
*/
|
|
15
|
+
import { Plugin } from '../Plugin.js';
|
|
16
|
+
import type { PluginContext, PluginResult, PluginMetadata } from '../Plugin.js';
|
|
17
|
+
export declare class TypeScriptDeadCodeValidator extends Plugin {
|
|
18
|
+
get metadata(): PluginMetadata;
|
|
19
|
+
execute(context: PluginContext): Promise<PluginResult>;
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=TypeScriptDeadCodeValidator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TypeScriptDeadCodeValidator.d.ts","sourceRoot":"","sources":["../../../src/plugins/validation/TypeScriptDeadCodeValidator.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAE,MAAM,EAAuB,MAAM,cAAc,CAAC;AAC3D,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AA4BhF,qBAAa,2BAA4B,SAAQ,MAAM;IACrD,IAAI,QAAQ,IAAI,cAAc,CAW7B;IAEK,OAAO,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,YAAY,CAAC;CAgJ7D"}
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TypeScriptDeadCodeValidator - detects unused TypeScript constructs
|
|
3
|
+
*
|
|
4
|
+
* Checks:
|
|
5
|
+
* - Unused interfaces (no IMPLEMENTS edges)
|
|
6
|
+
* - Empty interfaces (no properties)
|
|
7
|
+
* - Interfaces with single implementation (possible over-engineering)
|
|
8
|
+
* - Unused enums (no references) - requires USES_TYPE edges
|
|
9
|
+
* - Unused type aliases (no references) - requires USES_TYPE edges
|
|
10
|
+
*
|
|
11
|
+
* NOTE: Full "unused type" detection requires USES_TYPE edges which track
|
|
12
|
+
* where types are used in function parameters, return types, and variables.
|
|
13
|
+
* Currently we can only detect interfaces without implementations.
|
|
14
|
+
*/
|
|
15
|
+
import { Plugin, createSuccessResult } from '../Plugin.js';
|
|
16
|
+
export class TypeScriptDeadCodeValidator extends Plugin {
|
|
17
|
+
get metadata() {
|
|
18
|
+
return {
|
|
19
|
+
name: 'TypeScriptDeadCodeValidator',
|
|
20
|
+
phase: 'VALIDATION',
|
|
21
|
+
priority: 50, // Lower priority - runs after other validators
|
|
22
|
+
creates: {
|
|
23
|
+
nodes: [],
|
|
24
|
+
edges: []
|
|
25
|
+
},
|
|
26
|
+
dependencies: ['JSASTAnalyzer'] // Requires TypeScript nodes to be created
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
async execute(context) {
|
|
30
|
+
const { graph } = context;
|
|
31
|
+
console.log('[TypeScriptDeadCodeValidator] Checking for dead TypeScript code...');
|
|
32
|
+
const startTime = Date.now();
|
|
33
|
+
const issues = [];
|
|
34
|
+
// Collect all interfaces
|
|
35
|
+
console.log('[TypeScriptDeadCodeValidator] Collecting interfaces...');
|
|
36
|
+
const interfaces = new Map();
|
|
37
|
+
for await (const node of graph.queryNodes({ nodeType: 'INTERFACE' })) {
|
|
38
|
+
// Skip external/reference interfaces
|
|
39
|
+
if (node.isExternal)
|
|
40
|
+
continue;
|
|
41
|
+
interfaces.set(node.id, {
|
|
42
|
+
id: node.id,
|
|
43
|
+
name: node.name,
|
|
44
|
+
file: node.file,
|
|
45
|
+
line: node.line,
|
|
46
|
+
properties: node.properties
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
console.log(`[TypeScriptDeadCodeValidator] Found ${interfaces.size} interfaces`);
|
|
50
|
+
// Find interfaces with IMPLEMENTS or EXTENDS edges
|
|
51
|
+
console.log('[TypeScriptDeadCodeValidator] Checking implementations...');
|
|
52
|
+
const implementedInterfaces = new Map();
|
|
53
|
+
// Get all edges and filter by type (no queryEdges in GraphBackend yet)
|
|
54
|
+
const allEdges = await graph.getAllEdges?.() ?? [];
|
|
55
|
+
for (const edge of allEdges) {
|
|
56
|
+
if (edge.type === 'IMPLEMENTS' || edge.type === 'EXTENDS') {
|
|
57
|
+
const count = implementedInterfaces.get(edge.dst) || 0;
|
|
58
|
+
implementedInterfaces.set(edge.dst, count + 1);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
// Analyze interfaces
|
|
62
|
+
let unusedCount = 0;
|
|
63
|
+
let emptyCount = 0;
|
|
64
|
+
let singleImplCount = 0;
|
|
65
|
+
for (const [id, iface] of interfaces) {
|
|
66
|
+
const implCount = implementedInterfaces.get(id) || 0;
|
|
67
|
+
const properties = iface.properties || [];
|
|
68
|
+
// Check for empty interface
|
|
69
|
+
if (properties.length === 0) {
|
|
70
|
+
emptyCount++;
|
|
71
|
+
issues.push({
|
|
72
|
+
type: 'EMPTY_INTERFACE',
|
|
73
|
+
severity: 'INFO',
|
|
74
|
+
message: `Empty interface '${iface.name}' at ${iface.file}:${iface.line || '?'} - consider using type alias or removing`,
|
|
75
|
+
nodeId: id,
|
|
76
|
+
name: iface.name,
|
|
77
|
+
file: iface.file,
|
|
78
|
+
line: iface.line
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
// Check for unused interface (no implementations)
|
|
82
|
+
if (implCount === 0) {
|
|
83
|
+
unusedCount++;
|
|
84
|
+
issues.push({
|
|
85
|
+
type: 'UNUSED_INTERFACE',
|
|
86
|
+
severity: 'WARNING',
|
|
87
|
+
message: `Interface '${iface.name}' at ${iface.file}:${iface.line || '?'} has no implementations`,
|
|
88
|
+
nodeId: id,
|
|
89
|
+
name: iface.name,
|
|
90
|
+
file: iface.file,
|
|
91
|
+
line: iface.line
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
// Check for single implementation (possible over-engineering)
|
|
95
|
+
else if (implCount === 1) {
|
|
96
|
+
singleImplCount++;
|
|
97
|
+
issues.push({
|
|
98
|
+
type: 'SINGLE_IMPLEMENTATION',
|
|
99
|
+
severity: 'INFO',
|
|
100
|
+
message: `Interface '${iface.name}' at ${iface.file}:${iface.line || '?'} has only one implementation - may be over-engineering`,
|
|
101
|
+
nodeId: id,
|
|
102
|
+
name: iface.name,
|
|
103
|
+
file: iface.file,
|
|
104
|
+
line: iface.line
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
// Count enums and types (for summary, full analysis requires USES_TYPE)
|
|
109
|
+
let enumCount = 0;
|
|
110
|
+
for await (const _node of graph.queryNodes({ nodeType: 'ENUM' })) {
|
|
111
|
+
enumCount++;
|
|
112
|
+
}
|
|
113
|
+
let typeCount = 0;
|
|
114
|
+
for await (const _node of graph.queryNodes({ nodeType: 'TYPE' })) {
|
|
115
|
+
typeCount++;
|
|
116
|
+
}
|
|
117
|
+
const totalTime = ((Date.now() - startTime) / 1000).toFixed(2);
|
|
118
|
+
const summary = {
|
|
119
|
+
totalInterfaces: interfaces.size,
|
|
120
|
+
unusedInterfaces: unusedCount,
|
|
121
|
+
emptyInterfaces: emptyCount,
|
|
122
|
+
singleImplInterfaces: singleImplCount,
|
|
123
|
+
totalEnums: enumCount,
|
|
124
|
+
totalTypes: typeCount,
|
|
125
|
+
timeSeconds: totalTime
|
|
126
|
+
};
|
|
127
|
+
console.log('[TypeScriptDeadCodeValidator] Summary:', summary);
|
|
128
|
+
// Report issues
|
|
129
|
+
const warnings = issues.filter(i => i.severity === 'WARNING');
|
|
130
|
+
const infos = issues.filter(i => i.severity === 'INFO');
|
|
131
|
+
if (warnings.length > 0) {
|
|
132
|
+
console.log(`[TypeScriptDeadCodeValidator] ⚠️ ${warnings.length} warning(s):`);
|
|
133
|
+
for (const issue of warnings) {
|
|
134
|
+
console.log(` ⚠️ ${issue.message}`);
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
if (infos.length > 0) {
|
|
138
|
+
console.log(`[TypeScriptDeadCodeValidator] ℹ️ ${infos.length} info(s):`);
|
|
139
|
+
for (const issue of infos.slice(0, 5)) { // Limit to first 5
|
|
140
|
+
console.log(` ℹ️ ${issue.message}`);
|
|
141
|
+
}
|
|
142
|
+
if (infos.length > 5) {
|
|
143
|
+
console.log(` ... and ${infos.length - 5} more`);
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
if (issues.length === 0) {
|
|
147
|
+
console.log('[TypeScriptDeadCodeValidator] ✅ No dead TypeScript code detected');
|
|
148
|
+
}
|
|
149
|
+
return createSuccessResult({ nodes: 0, edges: 0 }, { summary, issues });
|
|
150
|
+
}
|
|
151
|
+
}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Git VCS Plugin
|
|
3
|
+
*
|
|
4
|
+
* Плагин для работы с Git репозиториями
|
|
5
|
+
* Обнаруживает изменённые файлы и предоставляет их содержимое
|
|
6
|
+
*/
|
|
7
|
+
import { VCSPlugin } from './VCSPlugin.js';
|
|
8
|
+
import type { VCSConfig, VCSPluginMetadata, ChangedFile, FileDiff } from './VCSPlugin.js';
|
|
9
|
+
/**
|
|
10
|
+
* Commit info
|
|
11
|
+
*/
|
|
12
|
+
export interface CommitInfo {
|
|
13
|
+
hash: string;
|
|
14
|
+
author: string;
|
|
15
|
+
email: string;
|
|
16
|
+
timestamp: number;
|
|
17
|
+
message: string;
|
|
18
|
+
}
|
|
19
|
+
export declare class GitPlugin extends VCSPlugin {
|
|
20
|
+
private gitDir;
|
|
21
|
+
constructor(config?: VCSConfig);
|
|
22
|
+
get metadata(): VCSPluginMetadata;
|
|
23
|
+
/**
|
|
24
|
+
* Проверить доступность Git
|
|
25
|
+
*/
|
|
26
|
+
isAvailable(): Promise<boolean>;
|
|
27
|
+
/**
|
|
28
|
+
* Получить список изменённых файлов
|
|
29
|
+
*/
|
|
30
|
+
getChangedFiles(): Promise<ChangedFile[]>;
|
|
31
|
+
/**
|
|
32
|
+
* Получить содержимое файла из HEAD
|
|
33
|
+
*/
|
|
34
|
+
getCommittedContent(filePath: string): Promise<string | null>;
|
|
35
|
+
/**
|
|
36
|
+
* Получить diff для файла
|
|
37
|
+
*/
|
|
38
|
+
getFileDiff(filePath: string): Promise<FileDiff>;
|
|
39
|
+
/**
|
|
40
|
+
* Получить текущую ветку
|
|
41
|
+
*/
|
|
42
|
+
getCurrentBranch(): Promise<string>;
|
|
43
|
+
/**
|
|
44
|
+
* Получить хеш последнего коммита
|
|
45
|
+
*/
|
|
46
|
+
getLastCommitHash(): Promise<string | null>;
|
|
47
|
+
/**
|
|
48
|
+
* Проверить, отслеживается ли файл
|
|
49
|
+
*/
|
|
50
|
+
isTracked(filePath: string): Promise<boolean>;
|
|
51
|
+
/**
|
|
52
|
+
* Вспомогательные методы
|
|
53
|
+
*/
|
|
54
|
+
/**
|
|
55
|
+
* Выполнить git команду
|
|
56
|
+
*/
|
|
57
|
+
private _exec;
|
|
58
|
+
/**
|
|
59
|
+
* Парсить git status код в FileStatus
|
|
60
|
+
*/
|
|
61
|
+
private _parseGitStatus;
|
|
62
|
+
/**
|
|
63
|
+
* Парсить unified diff формат
|
|
64
|
+
*/
|
|
65
|
+
private _parseUnifiedDiff;
|
|
66
|
+
/**
|
|
67
|
+
* Вычислить SHA256 хеш содержимого
|
|
68
|
+
*/
|
|
69
|
+
private _hashContent;
|
|
70
|
+
/**
|
|
71
|
+
* Получить список всех tracked файлов в репозитории
|
|
72
|
+
* (полезно для initial analysis)
|
|
73
|
+
*/
|
|
74
|
+
getAllTrackedFiles(): Promise<string[]>;
|
|
75
|
+
/**
|
|
76
|
+
* Получить информацию о последнем коммите
|
|
77
|
+
*/
|
|
78
|
+
getLastCommitInfo(): Promise<CommitInfo | null>;
|
|
79
|
+
/**
|
|
80
|
+
* Проверить, есть ли uncommitted изменения
|
|
81
|
+
*/
|
|
82
|
+
hasUncommittedChanges(): Promise<boolean>;
|
|
83
|
+
}
|
|
84
|
+
//# sourceMappingURL=GitPlugin.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GitPlugin.d.ts","sourceRoot":"","sources":["../../../src/plugins/vcs/GitPlugin.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,SAAS,EAAc,MAAM,gBAAgB,CAAC;AACvD,OAAO,KAAK,EAAE,SAAS,EAAE,iBAAiB,EAAE,WAAW,EAAE,QAAQ,EAAY,MAAM,gBAAgB,CAAC;AAUpG;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,qBAAa,SAAU,SAAQ,SAAS;IACtC,OAAO,CAAC,MAAM,CAAS;gBAEX,MAAM,GAAE,SAAc;IAKlC,IAAI,QAAQ,IAAI,iBAAiB,CAMhC;IAED;;OAEG;IACG,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC;IAerC;;OAEG;IACG,eAAe,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;IAsD/C;;OAEG;IACG,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAiBnE;;OAEG;IACG,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC;IAgBtD;;OAEG;IACG,gBAAgB,IAAI,OAAO,CAAC,MAAM,CAAC;IASzC;;OAEG;IACG,iBAAiB,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IASjD;;OAEG;IACG,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IASnD;;OAEG;IAEH;;OAEG;YACW,KAAK;IAOnB;;OAEG;IACH,OAAO,CAAC,eAAe;IAgCvB;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAgDzB;;OAEG;IACH,OAAO,CAAC,YAAY;IAIpB;;;OAGG;IACG,kBAAkB,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAU7C;;OAEG;IACG,iBAAiB,IAAI,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC;IAiBrD;;OAEG;IACG,qBAAqB,IAAI,OAAO,CAAC,OAAO,CAAC;CAIhD"}
|
|
@@ -0,0 +1,295 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Git VCS Plugin
|
|
3
|
+
*
|
|
4
|
+
* Плагин для работы с Git репозиториями
|
|
5
|
+
* Обнаруживает изменённые файлы и предоставляет их содержимое
|
|
6
|
+
*/
|
|
7
|
+
import { VCSPlugin, FileStatus } from './VCSPlugin.js';
|
|
8
|
+
import { exec } from 'child_process';
|
|
9
|
+
import { promisify } from 'util';
|
|
10
|
+
import { join } from 'path';
|
|
11
|
+
import { existsSync } from 'fs';
|
|
12
|
+
import { readFile } from 'fs/promises';
|
|
13
|
+
import { createHash } from 'crypto';
|
|
14
|
+
const execAsync = promisify(exec);
|
|
15
|
+
export class GitPlugin extends VCSPlugin {
|
|
16
|
+
gitDir;
|
|
17
|
+
constructor(config = {}) {
|
|
18
|
+
super(config);
|
|
19
|
+
this.gitDir = join(this.rootPath, '.git');
|
|
20
|
+
}
|
|
21
|
+
get metadata() {
|
|
22
|
+
return {
|
|
23
|
+
name: 'git',
|
|
24
|
+
type: 'vcs',
|
|
25
|
+
supported: existsSync(this.gitDir)
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Проверить доступность Git
|
|
30
|
+
*/
|
|
31
|
+
async isAvailable() {
|
|
32
|
+
try {
|
|
33
|
+
// Проверяем существование .git директории
|
|
34
|
+
if (!existsSync(this.gitDir)) {
|
|
35
|
+
return false;
|
|
36
|
+
}
|
|
37
|
+
// Проверяем работу git команды
|
|
38
|
+
const { stdout } = await this._exec('git rev-parse --git-dir');
|
|
39
|
+
return stdout.trim().length > 0;
|
|
40
|
+
}
|
|
41
|
+
catch {
|
|
42
|
+
return false;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Получить список изменённых файлов
|
|
47
|
+
*/
|
|
48
|
+
async getChangedFiles() {
|
|
49
|
+
try {
|
|
50
|
+
// Получаем список файлов через git status --porcelain
|
|
51
|
+
const { stdout } = await this._exec('git status --porcelain');
|
|
52
|
+
if (!stdout.trim()) {
|
|
53
|
+
return []; // Нет изменений
|
|
54
|
+
}
|
|
55
|
+
const files = [];
|
|
56
|
+
const lines = stdout.trim().split('\n');
|
|
57
|
+
for (const line of lines) {
|
|
58
|
+
// Git status format: XY filename
|
|
59
|
+
// X = index status, Y = working tree status
|
|
60
|
+
// После XY идёт пробел(ы), затем filename
|
|
61
|
+
const status = line.substring(0, 2);
|
|
62
|
+
// Убираем XY и все leading пробелы
|
|
63
|
+
const filePath = line.substring(2).trim();
|
|
64
|
+
// Пропускаем ignored и unmerged файлы
|
|
65
|
+
if (status === '!!' || status === 'UU') {
|
|
66
|
+
continue;
|
|
67
|
+
}
|
|
68
|
+
// Парсим статус
|
|
69
|
+
const parsedStatus = this._parseGitStatus(status);
|
|
70
|
+
// Получаем хеш содержимого для tracked файлов
|
|
71
|
+
let contentHash = null;
|
|
72
|
+
try {
|
|
73
|
+
const fullPath = join(this.rootPath, filePath);
|
|
74
|
+
if (existsSync(fullPath) && parsedStatus !== FileStatus.DELETED) {
|
|
75
|
+
const content = await readFile(fullPath, 'utf-8');
|
|
76
|
+
contentHash = this._hashContent(content);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
catch {
|
|
80
|
+
// Игнорируем ошибки чтения файла
|
|
81
|
+
}
|
|
82
|
+
files.push({
|
|
83
|
+
path: filePath,
|
|
84
|
+
status: parsedStatus,
|
|
85
|
+
contentHash
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
return files;
|
|
89
|
+
}
|
|
90
|
+
catch (error) {
|
|
91
|
+
console.error('[GitPlugin] Failed to get changed files:', error.message);
|
|
92
|
+
return [];
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Получить содержимое файла из HEAD
|
|
97
|
+
*/
|
|
98
|
+
async getCommittedContent(filePath) {
|
|
99
|
+
try {
|
|
100
|
+
// Проверяем, отслеживается ли файл
|
|
101
|
+
const isTracked = await this.isTracked(filePath);
|
|
102
|
+
if (!isTracked) {
|
|
103
|
+
return null;
|
|
104
|
+
}
|
|
105
|
+
// Получаем содержимое из HEAD
|
|
106
|
+
const { stdout } = await this._exec(`git show HEAD:"${filePath}"`);
|
|
107
|
+
return stdout;
|
|
108
|
+
}
|
|
109
|
+
catch {
|
|
110
|
+
// Файл может не существовать в HEAD (новый файл)
|
|
111
|
+
return null;
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Получить diff для файла
|
|
116
|
+
*/
|
|
117
|
+
async getFileDiff(filePath) {
|
|
118
|
+
try {
|
|
119
|
+
const { stdout } = await this._exec(`git diff HEAD -- "${filePath}"`);
|
|
120
|
+
if (!stdout.trim()) {
|
|
121
|
+
return { path: filePath, hunks: [] };
|
|
122
|
+
}
|
|
123
|
+
// Парсим unified diff
|
|
124
|
+
return this._parseUnifiedDiff(filePath, stdout);
|
|
125
|
+
}
|
|
126
|
+
catch (error) {
|
|
127
|
+
console.error(`[GitPlugin] Failed to get diff for ${filePath}:`, error.message);
|
|
128
|
+
return { path: filePath, hunks: [] };
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Получить текущую ветку
|
|
133
|
+
*/
|
|
134
|
+
async getCurrentBranch() {
|
|
135
|
+
try {
|
|
136
|
+
const { stdout } = await this._exec('git rev-parse --abbrev-ref HEAD');
|
|
137
|
+
return stdout.trim();
|
|
138
|
+
}
|
|
139
|
+
catch {
|
|
140
|
+
return 'unknown';
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* Получить хеш последнего коммита
|
|
145
|
+
*/
|
|
146
|
+
async getLastCommitHash() {
|
|
147
|
+
try {
|
|
148
|
+
const { stdout } = await this._exec('git rev-parse HEAD');
|
|
149
|
+
return stdout.trim();
|
|
150
|
+
}
|
|
151
|
+
catch {
|
|
152
|
+
return null;
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* Проверить, отслеживается ли файл
|
|
157
|
+
*/
|
|
158
|
+
async isTracked(filePath) {
|
|
159
|
+
try {
|
|
160
|
+
await this._exec(`git ls-files --error-unmatch "${filePath}"`);
|
|
161
|
+
return true;
|
|
162
|
+
}
|
|
163
|
+
catch {
|
|
164
|
+
return false;
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* Вспомогательные методы
|
|
169
|
+
*/
|
|
170
|
+
/**
|
|
171
|
+
* Выполнить git команду
|
|
172
|
+
*/
|
|
173
|
+
async _exec(command) {
|
|
174
|
+
return await execAsync(command, {
|
|
175
|
+
cwd: this.rootPath,
|
|
176
|
+
maxBuffer: 10 * 1024 * 1024 // 10MB буфер для больших diff'ов
|
|
177
|
+
});
|
|
178
|
+
}
|
|
179
|
+
/**
|
|
180
|
+
* Парсить git status код в FileStatus
|
|
181
|
+
*/
|
|
182
|
+
_parseGitStatus(statusCode) {
|
|
183
|
+
const index = statusCode[0];
|
|
184
|
+
const workingTree = statusCode[1];
|
|
185
|
+
// Приоритет: working tree > index
|
|
186
|
+
if (workingTree === 'M' || index === 'M') {
|
|
187
|
+
return FileStatus.MODIFIED;
|
|
188
|
+
}
|
|
189
|
+
if (workingTree === 'A' || index === 'A') {
|
|
190
|
+
return FileStatus.ADDED;
|
|
191
|
+
}
|
|
192
|
+
if (workingTree === 'D' || index === 'D') {
|
|
193
|
+
return FileStatus.DELETED;
|
|
194
|
+
}
|
|
195
|
+
if (workingTree === 'R' || index === 'R') {
|
|
196
|
+
return FileStatus.RENAMED;
|
|
197
|
+
}
|
|
198
|
+
if (workingTree === 'C' || index === 'C') {
|
|
199
|
+
return FileStatus.COPIED;
|
|
200
|
+
}
|
|
201
|
+
if (workingTree === '?') {
|
|
202
|
+
return FileStatus.UNTRACKED;
|
|
203
|
+
}
|
|
204
|
+
return FileStatus.MODIFIED; // По умолчанию
|
|
205
|
+
}
|
|
206
|
+
/**
|
|
207
|
+
* Парсить unified diff формат
|
|
208
|
+
*/
|
|
209
|
+
_parseUnifiedDiff(filePath, diffText) {
|
|
210
|
+
const hunks = [];
|
|
211
|
+
const lines = diffText.split('\n');
|
|
212
|
+
let currentHunk = null;
|
|
213
|
+
for (const line of lines) {
|
|
214
|
+
// Начало нового hunk: @@ -oldStart,oldLines +newStart,newLines @@
|
|
215
|
+
if (line.startsWith('@@')) {
|
|
216
|
+
if (currentHunk) {
|
|
217
|
+
hunks.push(currentHunk);
|
|
218
|
+
}
|
|
219
|
+
const match = line.match(/@@ -(\d+),?(\d*) \+(\d+),?(\d*) @@/);
|
|
220
|
+
if (match) {
|
|
221
|
+
currentHunk = {
|
|
222
|
+
oldStart: parseInt(match[1]),
|
|
223
|
+
oldLines: match[2] ? parseInt(match[2]) : 1,
|
|
224
|
+
newStart: parseInt(match[3]),
|
|
225
|
+
newLines: match[4] ? parseInt(match[4]) : 1,
|
|
226
|
+
lines: []
|
|
227
|
+
};
|
|
228
|
+
}
|
|
229
|
+
continue;
|
|
230
|
+
}
|
|
231
|
+
// Пропускаем заголовки diff
|
|
232
|
+
if (line.startsWith('diff --git') ||
|
|
233
|
+
line.startsWith('index ') ||
|
|
234
|
+
line.startsWith('---') ||
|
|
235
|
+
line.startsWith('+++')) {
|
|
236
|
+
continue;
|
|
237
|
+
}
|
|
238
|
+
// Добавляем строку в текущий hunk
|
|
239
|
+
if (currentHunk) {
|
|
240
|
+
currentHunk.lines.push(line);
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
// Добавляем последний hunk
|
|
244
|
+
if (currentHunk) {
|
|
245
|
+
hunks.push(currentHunk);
|
|
246
|
+
}
|
|
247
|
+
return { path: filePath, hunks };
|
|
248
|
+
}
|
|
249
|
+
/**
|
|
250
|
+
* Вычислить SHA256 хеш содержимого
|
|
251
|
+
*/
|
|
252
|
+
_hashContent(content) {
|
|
253
|
+
return createHash('sha256').update(content, 'utf-8').digest('hex');
|
|
254
|
+
}
|
|
255
|
+
/**
|
|
256
|
+
* Получить список всех tracked файлов в репозитории
|
|
257
|
+
* (полезно для initial analysis)
|
|
258
|
+
*/
|
|
259
|
+
async getAllTrackedFiles() {
|
|
260
|
+
try {
|
|
261
|
+
const { stdout } = await this._exec('git ls-files');
|
|
262
|
+
return stdout.trim().split('\n').filter(line => line.length > 0);
|
|
263
|
+
}
|
|
264
|
+
catch (error) {
|
|
265
|
+
console.error('[GitPlugin] Failed to get tracked files:', error.message);
|
|
266
|
+
return [];
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
/**
|
|
270
|
+
* Получить информацию о последнем коммите
|
|
271
|
+
*/
|
|
272
|
+
async getLastCommitInfo() {
|
|
273
|
+
try {
|
|
274
|
+
const { stdout } = await this._exec('git log -1 --pretty=format:"%H%n%an%n%ae%n%at%n%s"');
|
|
275
|
+
const lines = stdout.split('\n');
|
|
276
|
+
return {
|
|
277
|
+
hash: lines[0],
|
|
278
|
+
author: lines[1],
|
|
279
|
+
email: lines[2],
|
|
280
|
+
timestamp: parseInt(lines[3]) * 1000,
|
|
281
|
+
message: lines[4]
|
|
282
|
+
};
|
|
283
|
+
}
|
|
284
|
+
catch {
|
|
285
|
+
return null;
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
/**
|
|
289
|
+
* Проверить, есть ли uncommitted изменения
|
|
290
|
+
*/
|
|
291
|
+
async hasUncommittedChanges() {
|
|
292
|
+
const changedFiles = await this.getChangedFiles();
|
|
293
|
+
return changedFiles.length > 0;
|
|
294
|
+
}
|
|
295
|
+
}
|