@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,581 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* GuaranteeManager - управление гарантиями/инвариантами кода
|
|
3
|
+
*
|
|
4
|
+
* GUARANTEE ноды хранят Datalog правила, которые код должен соблюдать.
|
|
5
|
+
* GOVERNS edges связывают гарантии с модулями, к которым они применяются.
|
|
6
|
+
*
|
|
7
|
+
* Workflow:
|
|
8
|
+
* 1. Создать гарантию (create) → GUARANTEE нода + GOVERNS edges
|
|
9
|
+
* 2. Проверить (check) → выполнить Datalog rule, найти нарушения
|
|
10
|
+
* 3. Экспортировать (export) → сохранить в YAML для version control
|
|
11
|
+
* 4. Импортировать (import) → загрузить из YAML в граф
|
|
12
|
+
* 5. Drift detection → сравнить граф с файлом
|
|
13
|
+
*/
|
|
14
|
+
|
|
15
|
+
import { readFileSync, writeFileSync, existsSync } from 'fs';
|
|
16
|
+
import { join } from 'path';
|
|
17
|
+
import { parse as parseYaml, stringify as stringifyYaml } from 'yaml';
|
|
18
|
+
import { minimatch } from 'minimatch';
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* Severity level for guarantees
|
|
22
|
+
*/
|
|
23
|
+
export type GuaranteeSeverity = 'error' | 'warning' | 'info';
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* Guarantee definition
|
|
27
|
+
*/
|
|
28
|
+
export interface GuaranteeDefinition {
|
|
29
|
+
id: string;
|
|
30
|
+
name?: string;
|
|
31
|
+
rule: string;
|
|
32
|
+
severity?: GuaranteeSeverity;
|
|
33
|
+
governs?: string[];
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* Guarantee node structure
|
|
38
|
+
*/
|
|
39
|
+
export interface GuaranteeNode {
|
|
40
|
+
id: string;
|
|
41
|
+
type: 'GUARANTEE';
|
|
42
|
+
name: string;
|
|
43
|
+
rule: string;
|
|
44
|
+
severity: GuaranteeSeverity;
|
|
45
|
+
governs: string[];
|
|
46
|
+
version: 'meta';
|
|
47
|
+
createdAt: number;
|
|
48
|
+
governedModules?: string[];
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* Edge structure
|
|
53
|
+
*/
|
|
54
|
+
export interface GraphEdge {
|
|
55
|
+
type: string;
|
|
56
|
+
src: string;
|
|
57
|
+
dst: string;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
* Module node
|
|
62
|
+
*/
|
|
63
|
+
export interface ModuleNode {
|
|
64
|
+
id: string;
|
|
65
|
+
type: string;
|
|
66
|
+
file?: string;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
/**
|
|
70
|
+
* Violation binding
|
|
71
|
+
*/
|
|
72
|
+
export interface ViolationBinding {
|
|
73
|
+
name: string;
|
|
74
|
+
value: string;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
/**
|
|
78
|
+
* Violation result from Datalog
|
|
79
|
+
*/
|
|
80
|
+
export interface ViolationResult {
|
|
81
|
+
bindings?: ViolationBinding[];
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
/**
|
|
85
|
+
* Enriched violation info
|
|
86
|
+
*/
|
|
87
|
+
export interface EnrichedViolation {
|
|
88
|
+
nodeId: string;
|
|
89
|
+
type: string;
|
|
90
|
+
name?: string;
|
|
91
|
+
file?: string;
|
|
92
|
+
line?: number;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
/**
|
|
96
|
+
* Check result for a single guarantee
|
|
97
|
+
*/
|
|
98
|
+
export interface GuaranteeCheckResult {
|
|
99
|
+
guaranteeId: string;
|
|
100
|
+
name: string;
|
|
101
|
+
severity: GuaranteeSeverity;
|
|
102
|
+
passed: boolean;
|
|
103
|
+
violationCount: number;
|
|
104
|
+
violations: EnrichedViolation[];
|
|
105
|
+
error: string | null;
|
|
106
|
+
checkDurationMs: number;
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
/**
|
|
110
|
+
* Check all result
|
|
111
|
+
*/
|
|
112
|
+
export interface CheckAllResult {
|
|
113
|
+
total: number;
|
|
114
|
+
passed: number;
|
|
115
|
+
failed: number;
|
|
116
|
+
errors: number;
|
|
117
|
+
results: GuaranteeCheckResult[];
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
/**
|
|
121
|
+
* Import options
|
|
122
|
+
*/
|
|
123
|
+
export interface ImportOptions {
|
|
124
|
+
clearExisting?: boolean;
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
/**
|
|
128
|
+
* Import result
|
|
129
|
+
*/
|
|
130
|
+
export interface ImportResult {
|
|
131
|
+
imported: number;
|
|
132
|
+
skipped: number;
|
|
133
|
+
importedIds: string[];
|
|
134
|
+
skippedIds: string[];
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
/**
|
|
138
|
+
* Modified guarantee in drift
|
|
139
|
+
*/
|
|
140
|
+
export interface ModifiedGuarantee {
|
|
141
|
+
id: string;
|
|
142
|
+
changes: string[];
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
/**
|
|
146
|
+
* Drift summary
|
|
147
|
+
*/
|
|
148
|
+
export interface DriftSummary {
|
|
149
|
+
onlyInGraph: number;
|
|
150
|
+
onlyInFile: number;
|
|
151
|
+
modified: number;
|
|
152
|
+
unchanged: number;
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
/**
|
|
156
|
+
* Drift result
|
|
157
|
+
*/
|
|
158
|
+
export interface DriftResult {
|
|
159
|
+
hasDrift: boolean;
|
|
160
|
+
summary: DriftSummary;
|
|
161
|
+
onlyInGraph: string[];
|
|
162
|
+
onlyInFile: string[];
|
|
163
|
+
modified: ModifiedGuarantee[];
|
|
164
|
+
unchanged: string[];
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
/**
|
|
168
|
+
* Export data format
|
|
169
|
+
*/
|
|
170
|
+
export interface ExportData {
|
|
171
|
+
version: number;
|
|
172
|
+
exportedAt: string;
|
|
173
|
+
guarantees: Array<{
|
|
174
|
+
id: string;
|
|
175
|
+
name: string;
|
|
176
|
+
rule: string;
|
|
177
|
+
severity: GuaranteeSeverity;
|
|
178
|
+
governs: string[];
|
|
179
|
+
}>;
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
/**
|
|
183
|
+
* Graph interface for GuaranteeManager
|
|
184
|
+
*/
|
|
185
|
+
export interface GuaranteeGraph {
|
|
186
|
+
addNode(node: GuaranteeNode): Promise<void>;
|
|
187
|
+
getNode(id: string): Promise<GuaranteeNode | ModuleNode | null>;
|
|
188
|
+
deleteNode(id: string): Promise<void>;
|
|
189
|
+
queryNodes(filter: { type: string }): AsyncIterable<GuaranteeNode | ModuleNode>;
|
|
190
|
+
addEdge(edge: GraphEdge): Promise<void>;
|
|
191
|
+
deleteEdge(src: string, dst: string, type: string): Promise<void>;
|
|
192
|
+
getOutgoingEdges(nodeId: string, types: string[]): Promise<GraphEdge[]>;
|
|
193
|
+
getIncomingEdges(nodeId: string, types: string[]): Promise<GraphEdge[]>;
|
|
194
|
+
checkGuarantee(rule: string): Promise<ViolationResult[]>;
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
export class GuaranteeManager {
|
|
198
|
+
private graph: GuaranteeGraph;
|
|
199
|
+
private projectPath: string;
|
|
200
|
+
private guaranteesFile: string;
|
|
201
|
+
|
|
202
|
+
constructor(graph: GuaranteeGraph, projectPath: string) {
|
|
203
|
+
this.graph = graph;
|
|
204
|
+
this.projectPath = projectPath;
|
|
205
|
+
this.guaranteesFile = join(projectPath, '.grafema', 'guarantees.yaml');
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
/**
|
|
209
|
+
* Создать новую гарантию
|
|
210
|
+
*/
|
|
211
|
+
async create(guarantee: GuaranteeDefinition): Promise<GuaranteeNode> {
|
|
212
|
+
const { id, name, rule, severity = 'warning', governs = ['**/*.js'] } = guarantee;
|
|
213
|
+
|
|
214
|
+
if (!id || !rule) {
|
|
215
|
+
throw new Error('Guarantee must have id and rule');
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
// Создаём GUARANTEE ноду
|
|
219
|
+
const guaranteeNode: GuaranteeNode = {
|
|
220
|
+
id: `GUARANTEE:${id}`,
|
|
221
|
+
type: 'GUARANTEE',
|
|
222
|
+
name: name || id,
|
|
223
|
+
rule: rule,
|
|
224
|
+
severity: severity,
|
|
225
|
+
governs: governs, // Сохраняем patterns для export
|
|
226
|
+
version: 'meta', // Гарантии в отдельном слое
|
|
227
|
+
createdAt: Date.now()
|
|
228
|
+
};
|
|
229
|
+
|
|
230
|
+
await this.graph.addNode(guaranteeNode);
|
|
231
|
+
|
|
232
|
+
// Создаём GOVERNS edges к matching модулям
|
|
233
|
+
await this._createGovernsEdges(guaranteeNode.id, governs);
|
|
234
|
+
|
|
235
|
+
return guaranteeNode;
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
/**
|
|
239
|
+
* Получить все гарантии из графа
|
|
240
|
+
*/
|
|
241
|
+
async list(): Promise<GuaranteeNode[]> {
|
|
242
|
+
const guarantees: GuaranteeNode[] = [];
|
|
243
|
+
for await (const node of this.graph.queryNodes({ type: 'GUARANTEE' })) {
|
|
244
|
+
const guaranteeNode = node as GuaranteeNode;
|
|
245
|
+
// Получаем GOVERNS edges для этой гарантии
|
|
246
|
+
const governsEdges = await this.graph.getOutgoingEdges(guaranteeNode.id, ['GOVERNS']);
|
|
247
|
+
const governedModules: string[] = [];
|
|
248
|
+
for (const edge of governsEdges) {
|
|
249
|
+
const targetNode = await this.graph.getNode(edge.dst);
|
|
250
|
+
if (targetNode) {
|
|
251
|
+
governedModules.push((targetNode as ModuleNode).file || targetNode.id);
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
guarantees.push({
|
|
256
|
+
...guaranteeNode,
|
|
257
|
+
governedModules
|
|
258
|
+
});
|
|
259
|
+
}
|
|
260
|
+
return guarantees;
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
/**
|
|
264
|
+
* Проверить гарантию
|
|
265
|
+
*/
|
|
266
|
+
async check(guaranteeId: string): Promise<GuaranteeCheckResult> {
|
|
267
|
+
const fullId = guaranteeId.startsWith('GUARANTEE:') ? guaranteeId : `GUARANTEE:${guaranteeId}`;
|
|
268
|
+
const node = (await this.graph.getNode(fullId)) as GuaranteeNode | null;
|
|
269
|
+
|
|
270
|
+
if (!node) {
|
|
271
|
+
throw new Error(`Guarantee not found: ${guaranteeId}`);
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
const startTime = Date.now();
|
|
275
|
+
let violations: ViolationResult[] = [];
|
|
276
|
+
let error: string | null = null;
|
|
277
|
+
|
|
278
|
+
try {
|
|
279
|
+
violations = await this.graph.checkGuarantee(node.rule);
|
|
280
|
+
} catch (e) {
|
|
281
|
+
error = (e as Error).message;
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
// Обогащаем violations информацией о нодах
|
|
285
|
+
const enrichedViolations: EnrichedViolation[] = [];
|
|
286
|
+
for (const v of violations) {
|
|
287
|
+
const nodeId = v.bindings?.find(b => b.name === 'X')?.value;
|
|
288
|
+
if (nodeId) {
|
|
289
|
+
const violatingNode = await this.graph.getNode(nodeId);
|
|
290
|
+
if (violatingNode) {
|
|
291
|
+
enrichedViolations.push({
|
|
292
|
+
nodeId,
|
|
293
|
+
type: violatingNode.type,
|
|
294
|
+
name: (violatingNode as GuaranteeNode).name,
|
|
295
|
+
file: (violatingNode as ModuleNode).file,
|
|
296
|
+
line: (violatingNode as { line?: number }).line
|
|
297
|
+
});
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
return {
|
|
303
|
+
guaranteeId: guaranteeId,
|
|
304
|
+
name: node.name,
|
|
305
|
+
severity: node.severity,
|
|
306
|
+
passed: violations.length === 0 && !error,
|
|
307
|
+
violationCount: violations.length,
|
|
308
|
+
violations: enrichedViolations,
|
|
309
|
+
error,
|
|
310
|
+
checkDurationMs: Date.now() - startTime
|
|
311
|
+
};
|
|
312
|
+
}
|
|
313
|
+
|
|
314
|
+
/**
|
|
315
|
+
* Проверить все гарантии
|
|
316
|
+
*/
|
|
317
|
+
async checkAll(): Promise<CheckAllResult> {
|
|
318
|
+
const guarantees = await this.list();
|
|
319
|
+
const results: GuaranteeCheckResult[] = [];
|
|
320
|
+
let passedCount = 0;
|
|
321
|
+
let failedCount = 0;
|
|
322
|
+
let errorCount = 0;
|
|
323
|
+
|
|
324
|
+
for (const g of guarantees) {
|
|
325
|
+
const result = await this.check(g.id);
|
|
326
|
+
results.push(result);
|
|
327
|
+
|
|
328
|
+
if (result.error) {
|
|
329
|
+
errorCount++;
|
|
330
|
+
} else if (result.passed) {
|
|
331
|
+
passedCount++;
|
|
332
|
+
} else {
|
|
333
|
+
failedCount++;
|
|
334
|
+
}
|
|
335
|
+
}
|
|
336
|
+
|
|
337
|
+
return {
|
|
338
|
+
total: guarantees.length,
|
|
339
|
+
passed: passedCount,
|
|
340
|
+
failed: failedCount,
|
|
341
|
+
errors: errorCount,
|
|
342
|
+
results
|
|
343
|
+
};
|
|
344
|
+
}
|
|
345
|
+
|
|
346
|
+
/**
|
|
347
|
+
* Удалить гарантию
|
|
348
|
+
*/
|
|
349
|
+
async delete(guaranteeId: string): Promise<void> {
|
|
350
|
+
const fullId = guaranteeId.startsWith('GUARANTEE:') ? guaranteeId : `GUARANTEE:${guaranteeId}`;
|
|
351
|
+
|
|
352
|
+
// Удаляем GOVERNS edges
|
|
353
|
+
const edges = await this.graph.getOutgoingEdges(fullId, ['GOVERNS']);
|
|
354
|
+
for (const edge of edges) {
|
|
355
|
+
await this.graph.deleteEdge(edge.src, edge.dst, 'GOVERNS');
|
|
356
|
+
}
|
|
357
|
+
|
|
358
|
+
// Удаляем ноду
|
|
359
|
+
await this.graph.deleteNode(fullId);
|
|
360
|
+
}
|
|
361
|
+
|
|
362
|
+
/**
|
|
363
|
+
* Экспортировать гарантии в YAML файл
|
|
364
|
+
*/
|
|
365
|
+
async export(filePath: string = this.guaranteesFile): Promise<string> {
|
|
366
|
+
const guarantees = await this.list();
|
|
367
|
+
|
|
368
|
+
const exportData: ExportData = {
|
|
369
|
+
version: 1,
|
|
370
|
+
exportedAt: new Date().toISOString(),
|
|
371
|
+
guarantees: guarantees.map(g => ({
|
|
372
|
+
id: g.id.replace('GUARANTEE:', ''),
|
|
373
|
+
name: g.name,
|
|
374
|
+
rule: g.rule,
|
|
375
|
+
severity: g.severity,
|
|
376
|
+
governs: g.governs || ['**/*.js']
|
|
377
|
+
}))
|
|
378
|
+
};
|
|
379
|
+
|
|
380
|
+
const yaml = stringifyYaml(exportData, { lineWidth: 0 });
|
|
381
|
+
writeFileSync(filePath, yaml, 'utf-8');
|
|
382
|
+
|
|
383
|
+
return filePath;
|
|
384
|
+
}
|
|
385
|
+
|
|
386
|
+
/**
|
|
387
|
+
* Импортировать гарантии из YAML файла
|
|
388
|
+
*/
|
|
389
|
+
async import(filePath: string = this.guaranteesFile, options: ImportOptions = {}): Promise<ImportResult> {
|
|
390
|
+
const { clearExisting = false } = options;
|
|
391
|
+
|
|
392
|
+
if (!existsSync(filePath)) {
|
|
393
|
+
throw new Error(`Guarantees file not found: ${filePath}`);
|
|
394
|
+
}
|
|
395
|
+
|
|
396
|
+
const content = readFileSync(filePath, 'utf-8');
|
|
397
|
+
const data = parseYaml(content) as ExportData;
|
|
398
|
+
|
|
399
|
+
if (!data.guarantees || !Array.isArray(data.guarantees)) {
|
|
400
|
+
throw new Error('Invalid guarantees file format');
|
|
401
|
+
}
|
|
402
|
+
|
|
403
|
+
// Удаляем существующие если нужно
|
|
404
|
+
if (clearExisting) {
|
|
405
|
+
const existing = await this.list();
|
|
406
|
+
for (const g of existing) {
|
|
407
|
+
await this.delete(g.id);
|
|
408
|
+
}
|
|
409
|
+
}
|
|
410
|
+
|
|
411
|
+
// Импортируем
|
|
412
|
+
const imported: string[] = [];
|
|
413
|
+
const skipped: string[] = [];
|
|
414
|
+
|
|
415
|
+
for (const g of data.guarantees) {
|
|
416
|
+
const fullId = `GUARANTEE:${g.id}`;
|
|
417
|
+
const existing = await this.graph.getNode(fullId);
|
|
418
|
+
|
|
419
|
+
if (existing && !clearExisting) {
|
|
420
|
+
skipped.push(g.id);
|
|
421
|
+
continue;
|
|
422
|
+
}
|
|
423
|
+
|
|
424
|
+
await this.create(g);
|
|
425
|
+
imported.push(g.id);
|
|
426
|
+
}
|
|
427
|
+
|
|
428
|
+
return {
|
|
429
|
+
imported: imported.length,
|
|
430
|
+
skipped: skipped.length,
|
|
431
|
+
importedIds: imported,
|
|
432
|
+
skippedIds: skipped
|
|
433
|
+
};
|
|
434
|
+
}
|
|
435
|
+
|
|
436
|
+
/**
|
|
437
|
+
* Показать drift между графом и файлом
|
|
438
|
+
*/
|
|
439
|
+
async drift(filePath: string = this.guaranteesFile): Promise<DriftResult> {
|
|
440
|
+
const graphGuarantees = await this.list();
|
|
441
|
+
const graphMap = new Map<string, GuaranteeNode>(
|
|
442
|
+
graphGuarantees.map(g => [g.id.replace('GUARANTEE:', ''), g])
|
|
443
|
+
);
|
|
444
|
+
|
|
445
|
+
let fileGuarantees: Array<{ id: string; name: string; rule: string; severity: GuaranteeSeverity; governs: string[] }> = [];
|
|
446
|
+
if (existsSync(filePath)) {
|
|
447
|
+
const content = readFileSync(filePath, 'utf-8');
|
|
448
|
+
const data = parseYaml(content) as ExportData;
|
|
449
|
+
fileGuarantees = data.guarantees || [];
|
|
450
|
+
}
|
|
451
|
+
const fileMap = new Map(fileGuarantees.map(g => [g.id, g]));
|
|
452
|
+
|
|
453
|
+
const onlyInGraph: string[] = [];
|
|
454
|
+
const onlyInFile: string[] = [];
|
|
455
|
+
const modified: ModifiedGuarantee[] = [];
|
|
456
|
+
const unchanged: string[] = [];
|
|
457
|
+
|
|
458
|
+
// Проверяем гарантии в графе
|
|
459
|
+
for (const [id, graphG] of graphMap) {
|
|
460
|
+
const fileG = fileMap.get(id);
|
|
461
|
+
if (!fileG) {
|
|
462
|
+
onlyInGraph.push(id);
|
|
463
|
+
} else if (this._hasChanges(graphG, fileG)) {
|
|
464
|
+
modified.push({
|
|
465
|
+
id,
|
|
466
|
+
changes: this._describeChanges(graphG, fileG)
|
|
467
|
+
});
|
|
468
|
+
} else {
|
|
469
|
+
unchanged.push(id);
|
|
470
|
+
}
|
|
471
|
+
}
|
|
472
|
+
|
|
473
|
+
// Проверяем гарантии только в файле
|
|
474
|
+
for (const [id] of fileMap) {
|
|
475
|
+
if (!graphMap.has(id)) {
|
|
476
|
+
onlyInFile.push(id);
|
|
477
|
+
}
|
|
478
|
+
}
|
|
479
|
+
|
|
480
|
+
return {
|
|
481
|
+
hasDrift: onlyInGraph.length > 0 || onlyInFile.length > 0 || modified.length > 0,
|
|
482
|
+
summary: {
|
|
483
|
+
onlyInGraph: onlyInGraph.length,
|
|
484
|
+
onlyInFile: onlyInFile.length,
|
|
485
|
+
modified: modified.length,
|
|
486
|
+
unchanged: unchanged.length
|
|
487
|
+
},
|
|
488
|
+
onlyInGraph,
|
|
489
|
+
onlyInFile,
|
|
490
|
+
modified,
|
|
491
|
+
unchanged
|
|
492
|
+
};
|
|
493
|
+
}
|
|
494
|
+
|
|
495
|
+
/**
|
|
496
|
+
* Найти гарантии затронутые изменением ноды
|
|
497
|
+
*/
|
|
498
|
+
async findAffectedGuarantees(nodeId: string): Promise<string[]> {
|
|
499
|
+
const node = await this.graph.getNode(nodeId);
|
|
500
|
+
if (!node) return [];
|
|
501
|
+
|
|
502
|
+
// Поднимаемся до MODULE
|
|
503
|
+
let moduleId: string | null = null;
|
|
504
|
+
if (node.type === 'MODULE') {
|
|
505
|
+
moduleId = node.id;
|
|
506
|
+
} else if ((node as ModuleNode).file) {
|
|
507
|
+
// Ищем MODULE по file
|
|
508
|
+
for await (const m of this.graph.queryNodes({ type: 'MODULE' })) {
|
|
509
|
+
if ((m as ModuleNode).file === (node as ModuleNode).file) {
|
|
510
|
+
moduleId = m.id;
|
|
511
|
+
break;
|
|
512
|
+
}
|
|
513
|
+
}
|
|
514
|
+
}
|
|
515
|
+
|
|
516
|
+
if (!moduleId) return [];
|
|
517
|
+
|
|
518
|
+
// Находим GOVERNS edges к этому модулю
|
|
519
|
+
const incomingEdges = await this.graph.getIncomingEdges(moduleId, ['GOVERNS']);
|
|
520
|
+
return incomingEdges.map(e => e.src);
|
|
521
|
+
}
|
|
522
|
+
|
|
523
|
+
// ============ Private methods ============
|
|
524
|
+
|
|
525
|
+
/**
|
|
526
|
+
* Создать GOVERNS edges к модулям по glob patterns
|
|
527
|
+
*/
|
|
528
|
+
private async _createGovernsEdges(guaranteeId: string, patterns: string[]): Promise<void> {
|
|
529
|
+
// Получаем все MODULE ноды
|
|
530
|
+
const modules: ModuleNode[] = [];
|
|
531
|
+
for await (const node of this.graph.queryNodes({ type: 'MODULE' })) {
|
|
532
|
+
modules.push(node as ModuleNode);
|
|
533
|
+
}
|
|
534
|
+
|
|
535
|
+
// Матчим patterns
|
|
536
|
+
for (const module of modules) {
|
|
537
|
+
const relativePath = module.file?.replace(this.projectPath, '').replace(/^\//, '') || '';
|
|
538
|
+
|
|
539
|
+
for (const pattern of patterns) {
|
|
540
|
+
if (minimatch(relativePath, pattern) || minimatch(module.file || '', pattern)) {
|
|
541
|
+
await this.graph.addEdge({
|
|
542
|
+
type: 'GOVERNS',
|
|
543
|
+
src: guaranteeId,
|
|
544
|
+
dst: module.id
|
|
545
|
+
});
|
|
546
|
+
break; // Один edge на модуль
|
|
547
|
+
}
|
|
548
|
+
}
|
|
549
|
+
}
|
|
550
|
+
}
|
|
551
|
+
|
|
552
|
+
/**
|
|
553
|
+
* Проверить есть ли изменения между версиями гарантии
|
|
554
|
+
*/
|
|
555
|
+
private _hasChanges(
|
|
556
|
+
graphG: GuaranteeNode,
|
|
557
|
+
fileG: { rule: string; severity: GuaranteeSeverity; name: string; governs: string[] }
|
|
558
|
+
): boolean {
|
|
559
|
+
return (
|
|
560
|
+
graphG.rule !== fileG.rule ||
|
|
561
|
+
graphG.severity !== fileG.severity ||
|
|
562
|
+
graphG.name !== fileG.name ||
|
|
563
|
+
JSON.stringify(graphG.governs) !== JSON.stringify(fileG.governs)
|
|
564
|
+
);
|
|
565
|
+
}
|
|
566
|
+
|
|
567
|
+
/**
|
|
568
|
+
* Описать изменения между версиями
|
|
569
|
+
*/
|
|
570
|
+
private _describeChanges(
|
|
571
|
+
graphG: GuaranteeNode,
|
|
572
|
+
fileG: { rule: string; severity: GuaranteeSeverity; name: string; governs: string[] }
|
|
573
|
+
): string[] {
|
|
574
|
+
const changes: string[] = [];
|
|
575
|
+
if (graphG.rule !== fileG.rule) changes.push('rule');
|
|
576
|
+
if (graphG.severity !== fileG.severity) changes.push('severity');
|
|
577
|
+
if (graphG.name !== fileG.name) changes.push('name');
|
|
578
|
+
if (JSON.stringify(graphG.governs) !== JSON.stringify(fileG.governs)) changes.push('governs');
|
|
579
|
+
return changes;
|
|
580
|
+
}
|
|
581
|
+
}
|