@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,203 @@
|
|
|
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
|
+
|
|
16
|
+
import { Plugin, createSuccessResult } from '../Plugin.js';
|
|
17
|
+
import type { PluginContext, PluginResult, PluginMetadata } from '../Plugin.js';
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* Dead code issue
|
|
21
|
+
*/
|
|
22
|
+
interface DeadCodeIssue {
|
|
23
|
+
type: 'UNUSED_INTERFACE' | 'EMPTY_INTERFACE' | 'SINGLE_IMPLEMENTATION' | 'UNUSED_ENUM' | 'UNUSED_TYPE';
|
|
24
|
+
severity: 'WARNING' | 'INFO';
|
|
25
|
+
message: string;
|
|
26
|
+
nodeId: string;
|
|
27
|
+
name: string;
|
|
28
|
+
file?: string;
|
|
29
|
+
line?: number;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* Validation summary
|
|
34
|
+
*/
|
|
35
|
+
interface ValidationSummary {
|
|
36
|
+
totalInterfaces: number;
|
|
37
|
+
unusedInterfaces: number;
|
|
38
|
+
emptyInterfaces: number;
|
|
39
|
+
singleImplInterfaces: number;
|
|
40
|
+
totalEnums: number;
|
|
41
|
+
totalTypes: number;
|
|
42
|
+
timeSeconds: string;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
export class TypeScriptDeadCodeValidator extends Plugin {
|
|
46
|
+
get metadata(): PluginMetadata {
|
|
47
|
+
return {
|
|
48
|
+
name: 'TypeScriptDeadCodeValidator',
|
|
49
|
+
phase: 'VALIDATION',
|
|
50
|
+
priority: 50, // Lower priority - runs after other validators
|
|
51
|
+
creates: {
|
|
52
|
+
nodes: [],
|
|
53
|
+
edges: []
|
|
54
|
+
},
|
|
55
|
+
dependencies: ['JSASTAnalyzer'] // Requires TypeScript nodes to be created
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
async execute(context: PluginContext): Promise<PluginResult> {
|
|
60
|
+
const { graph } = context;
|
|
61
|
+
|
|
62
|
+
console.log('[TypeScriptDeadCodeValidator] Checking for dead TypeScript code...');
|
|
63
|
+
const startTime = Date.now();
|
|
64
|
+
|
|
65
|
+
const issues: DeadCodeIssue[] = [];
|
|
66
|
+
|
|
67
|
+
// Collect all interfaces
|
|
68
|
+
console.log('[TypeScriptDeadCodeValidator] Collecting interfaces...');
|
|
69
|
+
const interfaces: Map<string, { id: string; name: string; file?: string; line?: number; properties?: unknown[] }> = new Map();
|
|
70
|
+
|
|
71
|
+
for await (const node of graph.queryNodes({ nodeType: 'INTERFACE' })) {
|
|
72
|
+
// Skip external/reference interfaces
|
|
73
|
+
if ((node as { isExternal?: boolean }).isExternal) continue;
|
|
74
|
+
|
|
75
|
+
interfaces.set(node.id, {
|
|
76
|
+
id: node.id,
|
|
77
|
+
name: node.name as string,
|
|
78
|
+
file: node.file,
|
|
79
|
+
line: node.line as number | undefined,
|
|
80
|
+
properties: (node as { properties?: unknown[] }).properties
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
console.log(`[TypeScriptDeadCodeValidator] Found ${interfaces.size} interfaces`);
|
|
84
|
+
|
|
85
|
+
// Find interfaces with IMPLEMENTS or EXTENDS edges
|
|
86
|
+
console.log('[TypeScriptDeadCodeValidator] Checking implementations...');
|
|
87
|
+
const implementedInterfaces: Map<string, number> = new Map();
|
|
88
|
+
|
|
89
|
+
// Get all edges and filter by type (no queryEdges in GraphBackend yet)
|
|
90
|
+
const allEdges = await graph.getAllEdges?.() ?? [];
|
|
91
|
+
for (const edge of allEdges) {
|
|
92
|
+
if (edge.type === 'IMPLEMENTS' || edge.type === 'EXTENDS') {
|
|
93
|
+
const count = implementedInterfaces.get(edge.dst) || 0;
|
|
94
|
+
implementedInterfaces.set(edge.dst, count + 1);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
// Analyze interfaces
|
|
99
|
+
let unusedCount = 0;
|
|
100
|
+
let emptyCount = 0;
|
|
101
|
+
let singleImplCount = 0;
|
|
102
|
+
|
|
103
|
+
for (const [id, iface] of interfaces) {
|
|
104
|
+
const implCount = implementedInterfaces.get(id) || 0;
|
|
105
|
+
const properties = iface.properties || [];
|
|
106
|
+
|
|
107
|
+
// Check for empty interface
|
|
108
|
+
if (properties.length === 0) {
|
|
109
|
+
emptyCount++;
|
|
110
|
+
issues.push({
|
|
111
|
+
type: 'EMPTY_INTERFACE',
|
|
112
|
+
severity: 'INFO',
|
|
113
|
+
message: `Empty interface '${iface.name}' at ${iface.file}:${iface.line || '?'} - consider using type alias or removing`,
|
|
114
|
+
nodeId: id,
|
|
115
|
+
name: iface.name,
|
|
116
|
+
file: iface.file,
|
|
117
|
+
line: iface.line
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
// Check for unused interface (no implementations)
|
|
122
|
+
if (implCount === 0) {
|
|
123
|
+
unusedCount++;
|
|
124
|
+
issues.push({
|
|
125
|
+
type: 'UNUSED_INTERFACE',
|
|
126
|
+
severity: 'WARNING',
|
|
127
|
+
message: `Interface '${iface.name}' at ${iface.file}:${iface.line || '?'} has no implementations`,
|
|
128
|
+
nodeId: id,
|
|
129
|
+
name: iface.name,
|
|
130
|
+
file: iface.file,
|
|
131
|
+
line: iface.line
|
|
132
|
+
});
|
|
133
|
+
}
|
|
134
|
+
// Check for single implementation (possible over-engineering)
|
|
135
|
+
else if (implCount === 1) {
|
|
136
|
+
singleImplCount++;
|
|
137
|
+
issues.push({
|
|
138
|
+
type: 'SINGLE_IMPLEMENTATION',
|
|
139
|
+
severity: 'INFO',
|
|
140
|
+
message: `Interface '${iface.name}' at ${iface.file}:${iface.line || '?'} has only one implementation - may be over-engineering`,
|
|
141
|
+
nodeId: id,
|
|
142
|
+
name: iface.name,
|
|
143
|
+
file: iface.file,
|
|
144
|
+
line: iface.line
|
|
145
|
+
});
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
// Count enums and types (for summary, full analysis requires USES_TYPE)
|
|
150
|
+
let enumCount = 0;
|
|
151
|
+
for await (const _node of graph.queryNodes({ nodeType: 'ENUM' })) {
|
|
152
|
+
enumCount++;
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
let typeCount = 0;
|
|
156
|
+
for await (const _node of graph.queryNodes({ nodeType: 'TYPE' })) {
|
|
157
|
+
typeCount++;
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
const totalTime = ((Date.now() - startTime) / 1000).toFixed(2);
|
|
161
|
+
const summary: ValidationSummary = {
|
|
162
|
+
totalInterfaces: interfaces.size,
|
|
163
|
+
unusedInterfaces: unusedCount,
|
|
164
|
+
emptyInterfaces: emptyCount,
|
|
165
|
+
singleImplInterfaces: singleImplCount,
|
|
166
|
+
totalEnums: enumCount,
|
|
167
|
+
totalTypes: typeCount,
|
|
168
|
+
timeSeconds: totalTime
|
|
169
|
+
};
|
|
170
|
+
|
|
171
|
+
console.log('[TypeScriptDeadCodeValidator] Summary:', summary);
|
|
172
|
+
|
|
173
|
+
// Report issues
|
|
174
|
+
const warnings = issues.filter(i => i.severity === 'WARNING');
|
|
175
|
+
const infos = issues.filter(i => i.severity === 'INFO');
|
|
176
|
+
|
|
177
|
+
if (warnings.length > 0) {
|
|
178
|
+
console.log(`[TypeScriptDeadCodeValidator] ⚠️ ${warnings.length} warning(s):`);
|
|
179
|
+
for (const issue of warnings) {
|
|
180
|
+
console.log(` ⚠️ ${issue.message}`);
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
if (infos.length > 0) {
|
|
185
|
+
console.log(`[TypeScriptDeadCodeValidator] ℹ️ ${infos.length} info(s):`);
|
|
186
|
+
for (const issue of infos.slice(0, 5)) { // Limit to first 5
|
|
187
|
+
console.log(` ℹ️ ${issue.message}`);
|
|
188
|
+
}
|
|
189
|
+
if (infos.length > 5) {
|
|
190
|
+
console.log(` ... and ${infos.length - 5} more`);
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
if (issues.length === 0) {
|
|
195
|
+
console.log('[TypeScriptDeadCodeValidator] ✅ No dead TypeScript code detected');
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
return createSuccessResult(
|
|
199
|
+
{ nodes: 0, edges: 0 },
|
|
200
|
+
{ summary, issues }
|
|
201
|
+
);
|
|
202
|
+
}
|
|
203
|
+
}
|
|
@@ -0,0 +1,344 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Git VCS Plugin
|
|
3
|
+
*
|
|
4
|
+
* Плагин для работы с Git репозиториями
|
|
5
|
+
* Обнаруживает изменённые файлы и предоставляет их содержимое
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import { VCSPlugin, FileStatus } from './VCSPlugin.js';
|
|
9
|
+
import type { VCSConfig, VCSPluginMetadata, ChangedFile, FileDiff, DiffHunk } from './VCSPlugin.js';
|
|
10
|
+
import { exec } from 'child_process';
|
|
11
|
+
import { promisify } from 'util';
|
|
12
|
+
import { join } from 'path';
|
|
13
|
+
import { existsSync } from 'fs';
|
|
14
|
+
import { readFile } from 'fs/promises';
|
|
15
|
+
import { createHash } from 'crypto';
|
|
16
|
+
|
|
17
|
+
const execAsync = promisify(exec);
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* Commit info
|
|
21
|
+
*/
|
|
22
|
+
export interface CommitInfo {
|
|
23
|
+
hash: string;
|
|
24
|
+
author: string;
|
|
25
|
+
email: string;
|
|
26
|
+
timestamp: number;
|
|
27
|
+
message: string;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
export class GitPlugin extends VCSPlugin {
|
|
31
|
+
private gitDir: string;
|
|
32
|
+
|
|
33
|
+
constructor(config: VCSConfig = {}) {
|
|
34
|
+
super(config);
|
|
35
|
+
this.gitDir = join(this.rootPath, '.git');
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
get metadata(): VCSPluginMetadata {
|
|
39
|
+
return {
|
|
40
|
+
name: 'git',
|
|
41
|
+
type: 'vcs',
|
|
42
|
+
supported: existsSync(this.gitDir)
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* Проверить доступность Git
|
|
48
|
+
*/
|
|
49
|
+
async isAvailable(): Promise<boolean> {
|
|
50
|
+
try {
|
|
51
|
+
// Проверяем существование .git директории
|
|
52
|
+
if (!existsSync(this.gitDir)) {
|
|
53
|
+
return false;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
// Проверяем работу git команды
|
|
57
|
+
const { stdout } = await this._exec('git rev-parse --git-dir');
|
|
58
|
+
return stdout.trim().length > 0;
|
|
59
|
+
} catch {
|
|
60
|
+
return false;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
* Получить список изменённых файлов
|
|
66
|
+
*/
|
|
67
|
+
async getChangedFiles(): Promise<ChangedFile[]> {
|
|
68
|
+
try {
|
|
69
|
+
// Получаем список файлов через git status --porcelain
|
|
70
|
+
const { stdout } = await this._exec('git status --porcelain');
|
|
71
|
+
|
|
72
|
+
if (!stdout.trim()) {
|
|
73
|
+
return []; // Нет изменений
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
const files: ChangedFile[] = [];
|
|
77
|
+
const lines = stdout.trim().split('\n');
|
|
78
|
+
|
|
79
|
+
for (const line of lines) {
|
|
80
|
+
// Git status format: XY filename
|
|
81
|
+
// X = index status, Y = working tree status
|
|
82
|
+
// После XY идёт пробел(ы), затем filename
|
|
83
|
+
const status = line.substring(0, 2);
|
|
84
|
+
// Убираем XY и все leading пробелы
|
|
85
|
+
const filePath = line.substring(2).trim();
|
|
86
|
+
|
|
87
|
+
// Пропускаем ignored и unmerged файлы
|
|
88
|
+
if (status === '!!' || status === 'UU') {
|
|
89
|
+
continue;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
// Парсим статус
|
|
93
|
+
const parsedStatus = this._parseGitStatus(status);
|
|
94
|
+
|
|
95
|
+
// Получаем хеш содержимого для tracked файлов
|
|
96
|
+
let contentHash: string | null = null;
|
|
97
|
+
try {
|
|
98
|
+
const fullPath = join(this.rootPath, filePath);
|
|
99
|
+
if (existsSync(fullPath) && parsedStatus !== FileStatus.DELETED) {
|
|
100
|
+
const content = await readFile(fullPath, 'utf-8');
|
|
101
|
+
contentHash = this._hashContent(content);
|
|
102
|
+
}
|
|
103
|
+
} catch {
|
|
104
|
+
// Игнорируем ошибки чтения файла
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
files.push({
|
|
108
|
+
path: filePath,
|
|
109
|
+
status: parsedStatus,
|
|
110
|
+
contentHash
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
return files;
|
|
115
|
+
} catch (error) {
|
|
116
|
+
console.error('[GitPlugin] Failed to get changed files:', (error as Error).message);
|
|
117
|
+
return [];
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
/**
|
|
122
|
+
* Получить содержимое файла из HEAD
|
|
123
|
+
*/
|
|
124
|
+
async getCommittedContent(filePath: string): Promise<string | null> {
|
|
125
|
+
try {
|
|
126
|
+
// Проверяем, отслеживается ли файл
|
|
127
|
+
const isTracked = await this.isTracked(filePath);
|
|
128
|
+
if (!isTracked) {
|
|
129
|
+
return null;
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
// Получаем содержимое из HEAD
|
|
133
|
+
const { stdout } = await this._exec(`git show HEAD:"${filePath}"`);
|
|
134
|
+
return stdout;
|
|
135
|
+
} catch {
|
|
136
|
+
// Файл может не существовать в HEAD (новый файл)
|
|
137
|
+
return null;
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
/**
|
|
142
|
+
* Получить diff для файла
|
|
143
|
+
*/
|
|
144
|
+
async getFileDiff(filePath: string): Promise<FileDiff> {
|
|
145
|
+
try {
|
|
146
|
+
const { stdout } = await this._exec(`git diff HEAD -- "${filePath}"`);
|
|
147
|
+
|
|
148
|
+
if (!stdout.trim()) {
|
|
149
|
+
return { path: filePath, hunks: [] };
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
// Парсим unified diff
|
|
153
|
+
return this._parseUnifiedDiff(filePath, stdout);
|
|
154
|
+
} catch (error) {
|
|
155
|
+
console.error(`[GitPlugin] Failed to get diff for ${filePath}:`, (error as Error).message);
|
|
156
|
+
return { path: filePath, hunks: [] };
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
/**
|
|
161
|
+
* Получить текущую ветку
|
|
162
|
+
*/
|
|
163
|
+
async getCurrentBranch(): Promise<string> {
|
|
164
|
+
try {
|
|
165
|
+
const { stdout } = await this._exec('git rev-parse --abbrev-ref HEAD');
|
|
166
|
+
return stdout.trim();
|
|
167
|
+
} catch {
|
|
168
|
+
return 'unknown';
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
/**
|
|
173
|
+
* Получить хеш последнего коммита
|
|
174
|
+
*/
|
|
175
|
+
async getLastCommitHash(): Promise<string | null> {
|
|
176
|
+
try {
|
|
177
|
+
const { stdout } = await this._exec('git rev-parse HEAD');
|
|
178
|
+
return stdout.trim();
|
|
179
|
+
} catch {
|
|
180
|
+
return null;
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
/**
|
|
185
|
+
* Проверить, отслеживается ли файл
|
|
186
|
+
*/
|
|
187
|
+
async isTracked(filePath: string): Promise<boolean> {
|
|
188
|
+
try {
|
|
189
|
+
await this._exec(`git ls-files --error-unmatch "${filePath}"`);
|
|
190
|
+
return true;
|
|
191
|
+
} catch {
|
|
192
|
+
return false;
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
/**
|
|
197
|
+
* Вспомогательные методы
|
|
198
|
+
*/
|
|
199
|
+
|
|
200
|
+
/**
|
|
201
|
+
* Выполнить git команду
|
|
202
|
+
*/
|
|
203
|
+
private async _exec(command: string): Promise<{ stdout: string; stderr: string }> {
|
|
204
|
+
return await execAsync(command, {
|
|
205
|
+
cwd: this.rootPath,
|
|
206
|
+
maxBuffer: 10 * 1024 * 1024 // 10MB буфер для больших diff'ов
|
|
207
|
+
});
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
/**
|
|
211
|
+
* Парсить git status код в FileStatus
|
|
212
|
+
*/
|
|
213
|
+
private _parseGitStatus(statusCode: string): string {
|
|
214
|
+
const index = statusCode[0];
|
|
215
|
+
const workingTree = statusCode[1];
|
|
216
|
+
|
|
217
|
+
// Приоритет: working tree > index
|
|
218
|
+
if (workingTree === 'M' || index === 'M') {
|
|
219
|
+
return FileStatus.MODIFIED;
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
if (workingTree === 'A' || index === 'A') {
|
|
223
|
+
return FileStatus.ADDED;
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
if (workingTree === 'D' || index === 'D') {
|
|
227
|
+
return FileStatus.DELETED;
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
if (workingTree === 'R' || index === 'R') {
|
|
231
|
+
return FileStatus.RENAMED;
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
if (workingTree === 'C' || index === 'C') {
|
|
235
|
+
return FileStatus.COPIED;
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
if (workingTree === '?') {
|
|
239
|
+
return FileStatus.UNTRACKED;
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
return FileStatus.MODIFIED; // По умолчанию
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
/**
|
|
246
|
+
* Парсить unified diff формат
|
|
247
|
+
*/
|
|
248
|
+
private _parseUnifiedDiff(filePath: string, diffText: string): FileDiff {
|
|
249
|
+
const hunks: DiffHunk[] = [];
|
|
250
|
+
const lines = diffText.split('\n');
|
|
251
|
+
|
|
252
|
+
let currentHunk: DiffHunk | null = null;
|
|
253
|
+
|
|
254
|
+
for (const line of lines) {
|
|
255
|
+
// Начало нового hunk: @@ -oldStart,oldLines +newStart,newLines @@
|
|
256
|
+
if (line.startsWith('@@')) {
|
|
257
|
+
if (currentHunk) {
|
|
258
|
+
hunks.push(currentHunk);
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
const match = line.match(/@@ -(\d+),?(\d*) \+(\d+),?(\d*) @@/);
|
|
262
|
+
if (match) {
|
|
263
|
+
currentHunk = {
|
|
264
|
+
oldStart: parseInt(match[1]),
|
|
265
|
+
oldLines: match[2] ? parseInt(match[2]) : 1,
|
|
266
|
+
newStart: parseInt(match[3]),
|
|
267
|
+
newLines: match[4] ? parseInt(match[4]) : 1,
|
|
268
|
+
lines: []
|
|
269
|
+
};
|
|
270
|
+
}
|
|
271
|
+
continue;
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
// Пропускаем заголовки diff
|
|
275
|
+
if (line.startsWith('diff --git') ||
|
|
276
|
+
line.startsWith('index ') ||
|
|
277
|
+
line.startsWith('---') ||
|
|
278
|
+
line.startsWith('+++')) {
|
|
279
|
+
continue;
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
// Добавляем строку в текущий hunk
|
|
283
|
+
if (currentHunk) {
|
|
284
|
+
currentHunk.lines.push(line);
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
|
|
288
|
+
// Добавляем последний hunk
|
|
289
|
+
if (currentHunk) {
|
|
290
|
+
hunks.push(currentHunk);
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
return { path: filePath, hunks };
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
/**
|
|
297
|
+
* Вычислить SHA256 хеш содержимого
|
|
298
|
+
*/
|
|
299
|
+
private _hashContent(content: string): string {
|
|
300
|
+
return createHash('sha256').update(content, 'utf-8').digest('hex');
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
/**
|
|
304
|
+
* Получить список всех tracked файлов в репозитории
|
|
305
|
+
* (полезно для initial analysis)
|
|
306
|
+
*/
|
|
307
|
+
async getAllTrackedFiles(): Promise<string[]> {
|
|
308
|
+
try {
|
|
309
|
+
const { stdout } = await this._exec('git ls-files');
|
|
310
|
+
return stdout.trim().split('\n').filter(line => line.length > 0);
|
|
311
|
+
} catch (error) {
|
|
312
|
+
console.error('[GitPlugin] Failed to get tracked files:', (error as Error).message);
|
|
313
|
+
return [];
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
/**
|
|
318
|
+
* Получить информацию о последнем коммите
|
|
319
|
+
*/
|
|
320
|
+
async getLastCommitInfo(): Promise<CommitInfo | null> {
|
|
321
|
+
try {
|
|
322
|
+
const { stdout } = await this._exec('git log -1 --pretty=format:"%H%n%an%n%ae%n%at%n%s"');
|
|
323
|
+
const lines = stdout.split('\n');
|
|
324
|
+
|
|
325
|
+
return {
|
|
326
|
+
hash: lines[0],
|
|
327
|
+
author: lines[1],
|
|
328
|
+
email: lines[2],
|
|
329
|
+
timestamp: parseInt(lines[3]) * 1000,
|
|
330
|
+
message: lines[4]
|
|
331
|
+
};
|
|
332
|
+
} catch {
|
|
333
|
+
return null;
|
|
334
|
+
}
|
|
335
|
+
}
|
|
336
|
+
|
|
337
|
+
/**
|
|
338
|
+
* Проверить, есть ли uncommitted изменения
|
|
339
|
+
*/
|
|
340
|
+
async hasUncommittedChanges(): Promise<boolean> {
|
|
341
|
+
const changedFiles = await this.getChangedFiles();
|
|
342
|
+
return changedFiles.length > 0;
|
|
343
|
+
}
|
|
344
|
+
}
|