@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
package/src/core/Task.ts
ADDED
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Task - базовая единица работы в очереди
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
import type { TaskData, TaskType } from './TaskTypes.js';
|
|
6
|
+
|
|
7
|
+
export type TaskStatus = 'pending' | 'running' | 'completed' | 'failed';
|
|
8
|
+
|
|
9
|
+
export interface TaskOptions {
|
|
10
|
+
id: string;
|
|
11
|
+
type: TaskType;
|
|
12
|
+
priority?: number;
|
|
13
|
+
data: TaskData;
|
|
14
|
+
dependencies?: string[];
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
export class Task {
|
|
18
|
+
readonly id: string;
|
|
19
|
+
readonly type: TaskType;
|
|
20
|
+
readonly priority: number;
|
|
21
|
+
readonly data: TaskData;
|
|
22
|
+
readonly dependencies: string[];
|
|
23
|
+
|
|
24
|
+
status: TaskStatus;
|
|
25
|
+
result: unknown;
|
|
26
|
+
error: Error | null;
|
|
27
|
+
startedAt: number | null;
|
|
28
|
+
completedAt: number | null;
|
|
29
|
+
retries: number;
|
|
30
|
+
maxRetries: number;
|
|
31
|
+
|
|
32
|
+
constructor({ id, type, priority = 50, data, dependencies = [] }: TaskOptions) {
|
|
33
|
+
this.id = id;
|
|
34
|
+
this.type = type;
|
|
35
|
+
this.priority = priority;
|
|
36
|
+
this.data = data;
|
|
37
|
+
this.dependencies = dependencies;
|
|
38
|
+
|
|
39
|
+
this.status = 'pending';
|
|
40
|
+
this.result = null;
|
|
41
|
+
this.error = null;
|
|
42
|
+
this.startedAt = null;
|
|
43
|
+
this.completedAt = null;
|
|
44
|
+
this.retries = 0;
|
|
45
|
+
this.maxRetries = 3;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* Может ли задача выполняться (все зависимости готовы)
|
|
50
|
+
*/
|
|
51
|
+
canExecute(completedTasks: Set<string>): boolean {
|
|
52
|
+
return this.dependencies.every(depId => completedTasks.has(depId));
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* Начать выполнение
|
|
57
|
+
*/
|
|
58
|
+
start(): void {
|
|
59
|
+
this.status = 'running';
|
|
60
|
+
this.startedAt = Date.now();
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* Завершить успешно
|
|
65
|
+
*/
|
|
66
|
+
complete(result: unknown): void {
|
|
67
|
+
this.status = 'completed';
|
|
68
|
+
this.result = result;
|
|
69
|
+
this.completedAt = Date.now();
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
/**
|
|
73
|
+
* Завершить с ошибкой
|
|
74
|
+
*/
|
|
75
|
+
fail(error: Error): void {
|
|
76
|
+
this.status = 'failed';
|
|
77
|
+
this.error = error;
|
|
78
|
+
this.completedAt = Date.now();
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
/**
|
|
82
|
+
* Можно ли повторить
|
|
83
|
+
*/
|
|
84
|
+
canRetry(): boolean {
|
|
85
|
+
return this.retries < this.maxRetries;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
/**
|
|
89
|
+
* Повторить задачу
|
|
90
|
+
*/
|
|
91
|
+
retry(): void {
|
|
92
|
+
this.retries++;
|
|
93
|
+
this.status = 'pending';
|
|
94
|
+
this.error = null;
|
|
95
|
+
this.startedAt = null;
|
|
96
|
+
this.completedAt = null;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
/**
|
|
100
|
+
* Продолжительность выполнения (мс)
|
|
101
|
+
*/
|
|
102
|
+
get duration(): number {
|
|
103
|
+
if (!this.startedAt) return 0;
|
|
104
|
+
const end = this.completedAt || Date.now();
|
|
105
|
+
return end - this.startedAt;
|
|
106
|
+
}
|
|
107
|
+
}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Task Types - конкретные типы данных для задач
|
|
3
|
+
*
|
|
4
|
+
* Extensibility: добавляйте новые типы в TaskData union
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import type { ModuleNode } from '../plugins/analysis/ast/types.js';
|
|
8
|
+
|
|
9
|
+
// === TASK TYPE LITERALS ===
|
|
10
|
+
export type TaskType = 'ANALYZE_MODULE';
|
|
11
|
+
// При добавлении нового типа: 'ANALYZE_MODULE' | 'NEW_TYPE';
|
|
12
|
+
|
|
13
|
+
// === TASK DATA BY TYPE ===
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Данные для ANALYZE_MODULE задачи
|
|
17
|
+
*/
|
|
18
|
+
export interface AnalyzeModuleData {
|
|
19
|
+
module: ModuleNode;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
// При добавлении нового типа:
|
|
23
|
+
// export interface NewTypeData {
|
|
24
|
+
// ...
|
|
25
|
+
// }
|
|
26
|
+
|
|
27
|
+
// === UNION TYPE ===
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* Union всех возможных TaskData
|
|
31
|
+
* Расширяется при добавлении новых типов задач
|
|
32
|
+
*/
|
|
33
|
+
export type TaskData = AnalyzeModuleData;
|
|
34
|
+
// При добавлении: AnalyzeModuleData | NewTypeData;
|
|
35
|
+
|
|
36
|
+
// === TYPE GUARDS ===
|
|
37
|
+
|
|
38
|
+
export function isAnalyzeModuleData(data: TaskData): data is AnalyzeModuleData {
|
|
39
|
+
return 'module' in data && data.module !== null && typeof data.module === 'object';
|
|
40
|
+
}
|
|
@@ -0,0 +1,404 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* VersionManager - управление версиями нод для incremental analysis
|
|
3
|
+
*
|
|
4
|
+
* КОНЦЕПЦИЯ:
|
|
5
|
+
* - Храним несколько версий кода одновременно (main, __local, branch names)
|
|
6
|
+
* - Используем stable IDs для сравнения версий
|
|
7
|
+
* - Поддерживаем fine-grained merge (только изменённые ноды)
|
|
8
|
+
*
|
|
9
|
+
* ВЕРСИИ:
|
|
10
|
+
* - "main" - committed код из git HEAD
|
|
11
|
+
* - "__local" - uncommitted изменения (working directory)
|
|
12
|
+
* - "branch-name" - другие ветки (будущее)
|
|
13
|
+
*/
|
|
14
|
+
|
|
15
|
+
import { createHash } from 'crypto';
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* Version constants
|
|
19
|
+
*/
|
|
20
|
+
export interface VersionConstants {
|
|
21
|
+
MAIN: 'main';
|
|
22
|
+
LOCAL: '__local';
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* Node types for stable ID generation
|
|
27
|
+
*/
|
|
28
|
+
export type StableIdNodeType =
|
|
29
|
+
| 'FUNCTION'
|
|
30
|
+
| 'CLASS'
|
|
31
|
+
| 'INTERFACE'
|
|
32
|
+
| 'TYPE_ALIAS'
|
|
33
|
+
| 'VARIABLE_DECLARATION'
|
|
34
|
+
| 'MODULE'
|
|
35
|
+
| 'SERVICE'
|
|
36
|
+
| 'CALL_SITE'
|
|
37
|
+
| 'SCOPE'
|
|
38
|
+
| 'EXPRESSION'
|
|
39
|
+
| 'STATEMENT'
|
|
40
|
+
| 'DATABASE_QUERY'
|
|
41
|
+
| 'HTTP_REQUEST'
|
|
42
|
+
| 'FILESYSTEM'
|
|
43
|
+
| 'NETWORK'
|
|
44
|
+
| 'ENDPOINT';
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* Node for stable ID generation
|
|
48
|
+
*/
|
|
49
|
+
export interface VersionedNode {
|
|
50
|
+
type: string;
|
|
51
|
+
name?: string;
|
|
52
|
+
file?: string;
|
|
53
|
+
line?: number;
|
|
54
|
+
column?: number;
|
|
55
|
+
// Content fields for external nodes
|
|
56
|
+
query?: string;
|
|
57
|
+
url?: string;
|
|
58
|
+
path?: string;
|
|
59
|
+
endpoint?: string;
|
|
60
|
+
// Additional fields for structural comparison
|
|
61
|
+
params?: unknown[];
|
|
62
|
+
returnType?: string;
|
|
63
|
+
async?: boolean;
|
|
64
|
+
exported?: boolean;
|
|
65
|
+
bodyHash?: string;
|
|
66
|
+
methods?: unknown[];
|
|
67
|
+
properties?: unknown[];
|
|
68
|
+
extends?: string;
|
|
69
|
+
implements?: string[];
|
|
70
|
+
kind?: string;
|
|
71
|
+
value?: unknown;
|
|
72
|
+
contentHash?: string;
|
|
73
|
+
imports?: unknown[];
|
|
74
|
+
exports?: unknown[];
|
|
75
|
+
arguments?: unknown[];
|
|
76
|
+
callee?: string;
|
|
77
|
+
operation?: string;
|
|
78
|
+
collection?: string;
|
|
79
|
+
method?: string;
|
|
80
|
+
handler?: string;
|
|
81
|
+
// Version-aware fields
|
|
82
|
+
id?: string;
|
|
83
|
+
version?: string;
|
|
84
|
+
_stableId?: string;
|
|
85
|
+
_replaces?: string;
|
|
86
|
+
updatedAt?: number;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
/**
|
|
90
|
+
* REPLACES edge structure
|
|
91
|
+
*/
|
|
92
|
+
export interface ReplacesEdge {
|
|
93
|
+
type: 'REPLACES';
|
|
94
|
+
fromId: string;
|
|
95
|
+
toId: string;
|
|
96
|
+
version: string;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
/**
|
|
100
|
+
* Enrichment options
|
|
101
|
+
*/
|
|
102
|
+
export interface EnrichOptions {
|
|
103
|
+
replacesId?: string;
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
/**
|
|
107
|
+
* Modified node info
|
|
108
|
+
*/
|
|
109
|
+
export interface ModifiedNodeInfo {
|
|
110
|
+
old: VersionedNode;
|
|
111
|
+
new: VersionedNode;
|
|
112
|
+
stableId: string;
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
/**
|
|
116
|
+
* Changes summary
|
|
117
|
+
*/
|
|
118
|
+
export interface ChangesSummary {
|
|
119
|
+
addedCount: number;
|
|
120
|
+
modifiedCount: number;
|
|
121
|
+
unchangedCount: number;
|
|
122
|
+
deletedCount: number;
|
|
123
|
+
totalChanges: number;
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
/**
|
|
127
|
+
* Classification result
|
|
128
|
+
*/
|
|
129
|
+
export interface ClassifyChangesResult {
|
|
130
|
+
added: VersionedNode[];
|
|
131
|
+
modified: ModifiedNodeInfo[];
|
|
132
|
+
unchanged: VersionedNode[];
|
|
133
|
+
deleted: VersionedNode[];
|
|
134
|
+
summary: ChangesSummary;
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
/**
|
|
138
|
+
* Type-specific comparison keys
|
|
139
|
+
*/
|
|
140
|
+
interface TypeSpecificKeys {
|
|
141
|
+
[nodeType: string]: string[];
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
export class VersionManager {
|
|
145
|
+
readonly versions: VersionConstants;
|
|
146
|
+
|
|
147
|
+
constructor() {
|
|
148
|
+
this.versions = {
|
|
149
|
+
MAIN: 'main',
|
|
150
|
+
LOCAL: '__local'
|
|
151
|
+
};
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
/**
|
|
155
|
+
* Генерировать stable ID для ноды (без версии)
|
|
156
|
+
*
|
|
157
|
+
* Stable ID остаётся одинаковым для одной и той же сущности
|
|
158
|
+
* в разных версиях кода
|
|
159
|
+
*/
|
|
160
|
+
generateStableId(node: VersionedNode): string {
|
|
161
|
+
const { type, name, file, line, column } = node;
|
|
162
|
+
|
|
163
|
+
// Для FUNCTION, CLASS - используем type:name:file
|
|
164
|
+
if (['FUNCTION', 'CLASS', 'INTERFACE', 'TYPE_ALIAS'].includes(type)) {
|
|
165
|
+
return `${type}:${name}:${file}`;
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
// Для VARIABLE_DECLARATION - добавляем line для различения локальных переменных
|
|
169
|
+
if (type === 'VARIABLE_DECLARATION') {
|
|
170
|
+
return `${type}:${name}:${file}:${line || 0}`;
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
// Для MODULE - только file
|
|
174
|
+
if (type === 'MODULE') {
|
|
175
|
+
return `MODULE:${file}`;
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
// Для SERVICE - используем имя или file
|
|
179
|
+
if (type === 'SERVICE') {
|
|
180
|
+
return `SERVICE:${name || file}`;
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
// Для вложенных нод (CALL_SITE, SCOPE, EXPRESSION) - используем file:line:column
|
|
184
|
+
if (['CALL_SITE', 'SCOPE', 'EXPRESSION', 'STATEMENT'].includes(type)) {
|
|
185
|
+
return `${type}:${file}:${line || 0}:${column || 0}`;
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
// Для EXTERNAL нод (DATABASE_QUERY, HTTP_REQUEST) - используем содержимое
|
|
189
|
+
if (['DATABASE_QUERY', 'HTTP_REQUEST', 'FILESYSTEM', 'NETWORK'].includes(type)) {
|
|
190
|
+
// Используем хеш содержимого для уникальности
|
|
191
|
+
const content = node.query || node.url || node.path || node.endpoint || '';
|
|
192
|
+
const hash = createHash('sha256').update(content).digest('hex').substring(0, 16);
|
|
193
|
+
return `${type}:${hash}`;
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
// По умолчанию - используем все доступные поля
|
|
197
|
+
const parts = [type, name, file, line, column].filter(p => p !== undefined && p !== null);
|
|
198
|
+
return parts.join(':');
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
/**
|
|
202
|
+
* Генерировать versioned ID для ноды
|
|
203
|
+
*/
|
|
204
|
+
generateVersionedId(node: VersionedNode, version: string): string {
|
|
205
|
+
const stableId = this.generateStableId(node);
|
|
206
|
+
return `${stableId}:${version}`;
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
/**
|
|
210
|
+
* Извлечь stable ID из versioned ID
|
|
211
|
+
*/
|
|
212
|
+
extractStableId(versionedId: string): string {
|
|
213
|
+
const lastColonIndex = versionedId.lastIndexOf(':');
|
|
214
|
+
return versionedId.substring(0, lastColonIndex);
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
/**
|
|
218
|
+
* Извлечь версию из versioned ID
|
|
219
|
+
*/
|
|
220
|
+
extractVersion(versionedId: string): string {
|
|
221
|
+
const lastColonIndex = versionedId.lastIndexOf(':');
|
|
222
|
+
return versionedId.substring(lastColonIndex + 1);
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
/**
|
|
226
|
+
* Проверить, имеет ли нода структурные изменения
|
|
227
|
+
*/
|
|
228
|
+
hasStructuralChanges(oldNode: VersionedNode, newNode: VersionedNode): boolean {
|
|
229
|
+
// Список ключевых полей для сравнения (зависит от типа ноды)
|
|
230
|
+
const keysToCompare = this._getComparisonKeys(oldNode.type);
|
|
231
|
+
|
|
232
|
+
for (const key of keysToCompare) {
|
|
233
|
+
const oldValue = (oldNode as unknown as Record<string, unknown>)[key];
|
|
234
|
+
const newValue = (newNode as unknown as Record<string, unknown>)[key];
|
|
235
|
+
|
|
236
|
+
// Глубокое сравнение для массивов и объектов
|
|
237
|
+
if (JSON.stringify(oldValue) !== JSON.stringify(newValue)) {
|
|
238
|
+
return true;
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
return false;
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
/**
|
|
246
|
+
* Получить ключи для сравнения в зависимости от типа ноды
|
|
247
|
+
*/
|
|
248
|
+
private _getComparisonKeys(nodeType: string): string[] {
|
|
249
|
+
const commonKeys = ['name', 'line', 'column'];
|
|
250
|
+
|
|
251
|
+
const typeSpecificKeys: TypeSpecificKeys = {
|
|
252
|
+
FUNCTION: ['params', 'returnType', 'async', 'exported', 'bodyHash'],
|
|
253
|
+
CLASS: ['methods', 'properties', 'extends', 'implements', 'exported'],
|
|
254
|
+
VARIABLE_DECLARATION: ['kind', 'value', 'exported'],
|
|
255
|
+
MODULE: ['contentHash', 'imports', 'exports'],
|
|
256
|
+
CALL_SITE: ['arguments', 'callee'],
|
|
257
|
+
DATABASE_QUERY: ['query', 'operation', 'collection'],
|
|
258
|
+
HTTP_REQUEST: ['method', 'url', 'endpoint'],
|
|
259
|
+
ENDPOINT: ['path', 'method', 'handler']
|
|
260
|
+
};
|
|
261
|
+
|
|
262
|
+
return [...commonKeys, ...(typeSpecificKeys[nodeType] || [])];
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
/**
|
|
266
|
+
* Вычислить хеш тела функции для сравнения
|
|
267
|
+
*/
|
|
268
|
+
calculateBodyHash(bodySource: string | null | undefined): string | null {
|
|
269
|
+
if (!bodySource) return null;
|
|
270
|
+
|
|
271
|
+
// Нормализуем код: убираем пробелы и комментарии для сравнения
|
|
272
|
+
const normalized = bodySource
|
|
273
|
+
.replace(/\/\*[\s\S]*?\*\//g, '') // Блочные комментарии
|
|
274
|
+
.replace(/\/\/.*/g, '') // Строчные комментарии
|
|
275
|
+
.replace(/\s+/g, ' ') // Множественные пробелы -> один пробел
|
|
276
|
+
.trim();
|
|
277
|
+
|
|
278
|
+
return createHash('sha256').update(normalized, 'utf-8').digest('hex');
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
/**
|
|
282
|
+
* Создать REPLACES ребро между версиями
|
|
283
|
+
*/
|
|
284
|
+
createReplacesEdge(localNodeId: string, mainNodeId: string): ReplacesEdge {
|
|
285
|
+
return {
|
|
286
|
+
type: 'REPLACES',
|
|
287
|
+
fromId: localNodeId,
|
|
288
|
+
toId: mainNodeId,
|
|
289
|
+
version: '__local' // Edge тоже имеет версию
|
|
290
|
+
};
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
/**
|
|
294
|
+
* Дополнить ноду полями для version-aware анализа
|
|
295
|
+
*/
|
|
296
|
+
enrichNodeWithVersion(
|
|
297
|
+
node: VersionedNode,
|
|
298
|
+
version: string,
|
|
299
|
+
options: EnrichOptions = {}
|
|
300
|
+
): VersionedNode {
|
|
301
|
+
const stableId = this.generateStableId(node);
|
|
302
|
+
const versionedId = this.generateVersionedId(node, version);
|
|
303
|
+
|
|
304
|
+
const enriched: VersionedNode = {
|
|
305
|
+
...node,
|
|
306
|
+
id: versionedId,
|
|
307
|
+
version: version,
|
|
308
|
+
_stableId: stableId
|
|
309
|
+
};
|
|
310
|
+
|
|
311
|
+
// Добавляем _replaces если это замена main версии
|
|
312
|
+
if (options.replacesId) {
|
|
313
|
+
enriched._replaces = options.replacesId;
|
|
314
|
+
}
|
|
315
|
+
|
|
316
|
+
// Добавляем timestamp
|
|
317
|
+
if (!enriched.updatedAt) {
|
|
318
|
+
enriched.updatedAt = Date.now();
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
return enriched;
|
|
322
|
+
}
|
|
323
|
+
|
|
324
|
+
/**
|
|
325
|
+
* Классифицировать изменения между версиями
|
|
326
|
+
*/
|
|
327
|
+
classifyChanges(mainNodes: VersionedNode[], localNodes: VersionedNode[]): ClassifyChangesResult {
|
|
328
|
+
// Создаём Map по stable ID
|
|
329
|
+
const mainMap = new Map<string, VersionedNode>();
|
|
330
|
+
for (const node of mainNodes) {
|
|
331
|
+
const stableId = this.generateStableId(node);
|
|
332
|
+
mainMap.set(stableId, node);
|
|
333
|
+
}
|
|
334
|
+
|
|
335
|
+
const localMap = new Map<string, VersionedNode>();
|
|
336
|
+
for (const node of localNodes) {
|
|
337
|
+
const stableId = this.generateStableId(node);
|
|
338
|
+
localMap.set(stableId, node);
|
|
339
|
+
}
|
|
340
|
+
|
|
341
|
+
// Классификация
|
|
342
|
+
const added: VersionedNode[] = [];
|
|
343
|
+
const modified: ModifiedNodeInfo[] = [];
|
|
344
|
+
const unchanged: VersionedNode[] = [];
|
|
345
|
+
const deleted: VersionedNode[] = [];
|
|
346
|
+
|
|
347
|
+
// Проверяем локальные ноды
|
|
348
|
+
for (const [stableId, localNode] of localMap) {
|
|
349
|
+
if (!mainMap.has(stableId)) {
|
|
350
|
+
// Нода добавлена
|
|
351
|
+
added.push(localNode);
|
|
352
|
+
} else {
|
|
353
|
+
const mainNode = mainMap.get(stableId)!;
|
|
354
|
+
if (this.hasStructuralChanges(mainNode, localNode)) {
|
|
355
|
+
// Нода изменена
|
|
356
|
+
modified.push({ old: mainNode, new: localNode, stableId });
|
|
357
|
+
} else {
|
|
358
|
+
// Нода не изменилась
|
|
359
|
+
unchanged.push(localNode);
|
|
360
|
+
}
|
|
361
|
+
}
|
|
362
|
+
}
|
|
363
|
+
|
|
364
|
+
// Проверяем удалённые ноды (есть в main, нет в local)
|
|
365
|
+
for (const [stableId, mainNode] of mainMap) {
|
|
366
|
+
if (!localMap.has(stableId)) {
|
|
367
|
+
deleted.push(mainNode);
|
|
368
|
+
}
|
|
369
|
+
}
|
|
370
|
+
|
|
371
|
+
return {
|
|
372
|
+
added, // Новые ноды
|
|
373
|
+
modified, // Изменённые ноды
|
|
374
|
+
unchanged, // Неизменённые ноды
|
|
375
|
+
deleted, // Удалённые ноды
|
|
376
|
+
summary: {
|
|
377
|
+
addedCount: added.length,
|
|
378
|
+
modifiedCount: modified.length,
|
|
379
|
+
unchangedCount: unchanged.length,
|
|
380
|
+
deletedCount: deleted.length,
|
|
381
|
+
totalChanges: added.length + modified.length + deleted.length
|
|
382
|
+
}
|
|
383
|
+
};
|
|
384
|
+
}
|
|
385
|
+
|
|
386
|
+
/**
|
|
387
|
+
* Проверить, является ли версия локальной (uncommitted)
|
|
388
|
+
*/
|
|
389
|
+
isLocalVersion(version: string): boolean {
|
|
390
|
+
return version === this.versions.LOCAL;
|
|
391
|
+
}
|
|
392
|
+
|
|
393
|
+
/**
|
|
394
|
+
* Проверить, является ли версия основной (committed)
|
|
395
|
+
*/
|
|
396
|
+
isMainVersion(version: string): boolean {
|
|
397
|
+
return version === this.versions.MAIN;
|
|
398
|
+
}
|
|
399
|
+
}
|
|
400
|
+
|
|
401
|
+
/**
|
|
402
|
+
* Singleton instance
|
|
403
|
+
*/
|
|
404
|
+
export const versionManager = new VersionManager();
|