@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,472 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* IncrementalAnalysisPlugin - плагин для инкрементального анализа
|
|
3
|
+
*
|
|
4
|
+
* НАЗНАЧЕНИЕ:
|
|
5
|
+
* Обнаруживает изменённые файлы через VCS (Git) и создаёт __local версии
|
|
6
|
+
* только для изменённых нод, используя fine-grained merge
|
|
7
|
+
*
|
|
8
|
+
* АЛГОРИТМ:
|
|
9
|
+
* 1. Получить список изменённых файлов из VCS
|
|
10
|
+
* 2. Для каждого файла:
|
|
11
|
+
* - Парсить новый код
|
|
12
|
+
* - Получить main версию нод
|
|
13
|
+
* - Классифицировать: added/modified/deleted/unchanged
|
|
14
|
+
* - Создать __local версии только для added/modified
|
|
15
|
+
* 3. Переанализировать изменённые ноды для создания связей
|
|
16
|
+
*
|
|
17
|
+
* ВЕРСИИ:
|
|
18
|
+
* - "main" - committed код (git HEAD)
|
|
19
|
+
* - "__local" - uncommitted изменения
|
|
20
|
+
*/
|
|
21
|
+
import { Plugin, createSuccessResult, createErrorResult } from '../Plugin.js';
|
|
22
|
+
import { versionManager } from '../../core/VersionManager.js';
|
|
23
|
+
import { VCSPluginFactory } from '../vcs/index.js';
|
|
24
|
+
import { parse } from '@babel/parser';
|
|
25
|
+
import traverseModule from '@babel/traverse';
|
|
26
|
+
import { readFile } from 'fs/promises';
|
|
27
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
28
|
+
const traverse = traverseModule.default || traverseModule;
|
|
29
|
+
export class IncrementalAnalysisPlugin extends Plugin {
|
|
30
|
+
vcsPlugin = null;
|
|
31
|
+
get metadata() {
|
|
32
|
+
return {
|
|
33
|
+
name: 'IncrementalAnalysisPlugin',
|
|
34
|
+
phase: 'ANALYSIS',
|
|
35
|
+
priority: 85, // Запускается после JSModuleIndexer (90) но перед JSASTAnalyzer (80)
|
|
36
|
+
creates: {
|
|
37
|
+
nodes: ['FUNCTION', 'CLASS', 'VARIABLE_DECLARATION'], // Создаёт __local версии
|
|
38
|
+
edges: ['REPLACES', 'CALLS', 'USES']
|
|
39
|
+
},
|
|
40
|
+
dependencies: ['JSModuleIndexer']
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
async initialize(context) {
|
|
44
|
+
// Инициализируем VCS плагин
|
|
45
|
+
const manifest = context.manifest;
|
|
46
|
+
this.vcsPlugin = await VCSPluginFactory.detect({
|
|
47
|
+
rootPath: manifest?.projectPath
|
|
48
|
+
});
|
|
49
|
+
if (!this.vcsPlugin) {
|
|
50
|
+
console.log('[IncrementalAnalysis] No VCS detected, skipping incremental analysis');
|
|
51
|
+
}
|
|
52
|
+
else {
|
|
53
|
+
console.log(`[IncrementalAnalysis] Using VCS: ${this.vcsPlugin.metadata.name}`);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
async execute(context) {
|
|
57
|
+
try {
|
|
58
|
+
const { graph } = context;
|
|
59
|
+
const manifest = context.manifest;
|
|
60
|
+
const projectPath = manifest?.projectPath ?? '';
|
|
61
|
+
// Если нет VCS - пропускаем инкрементальный анализ
|
|
62
|
+
if (!this.vcsPlugin) {
|
|
63
|
+
return createSuccessResult({ nodes: 0, edges: 0 }, {
|
|
64
|
+
skipped: true,
|
|
65
|
+
reason: 'No VCS detected'
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
// Проверяем наличие uncommitted изменений
|
|
69
|
+
const hasChanges = await this.vcsPlugin.hasUncommittedChanges();
|
|
70
|
+
if (!hasChanges) {
|
|
71
|
+
console.log('[IncrementalAnalysis] No uncommitted changes detected');
|
|
72
|
+
return createSuccessResult({ nodes: 0, edges: 0 }, {
|
|
73
|
+
skipped: true,
|
|
74
|
+
reason: 'No uncommitted changes'
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
// Получаем список изменённых файлов
|
|
78
|
+
const changedFiles = (await this.vcsPlugin.getChangedFiles());
|
|
79
|
+
console.log(`[IncrementalAnalysis] All changed files:`, changedFiles.map(f => f.path));
|
|
80
|
+
const jsFiles = changedFiles.filter(file => file.path.endsWith('.js') || file.path.endsWith('.mjs') || file.path.endsWith('.cjs'));
|
|
81
|
+
if (jsFiles.length === 0) {
|
|
82
|
+
console.log('[IncrementalAnalysis] No JavaScript files changed');
|
|
83
|
+
return createSuccessResult({ nodes: 0, edges: 0 }, {
|
|
84
|
+
skipped: true,
|
|
85
|
+
reason: 'No JS files changed'
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
console.log(`[IncrementalAnalysis] Found ${jsFiles.length} changed JS files:`, jsFiles.map(f => f.path));
|
|
89
|
+
let totalNodesCreated = 0;
|
|
90
|
+
let totalEdgesCreated = 0;
|
|
91
|
+
// Обрабатываем каждый изменённый файл
|
|
92
|
+
for (const fileInfo of jsFiles) {
|
|
93
|
+
const result = await this.processChangedFile(fileInfo, projectPath, graph);
|
|
94
|
+
totalNodesCreated += result.nodesCreated;
|
|
95
|
+
totalEdgesCreated += result.edgesCreated;
|
|
96
|
+
}
|
|
97
|
+
console.log(`[IncrementalAnalysis] Created ${totalNodesCreated} __local nodes, ${totalEdgesCreated} edges`);
|
|
98
|
+
return createSuccessResult({ nodes: totalNodesCreated, edges: totalEdgesCreated }, {
|
|
99
|
+
filesProcessed: jsFiles.length,
|
|
100
|
+
changedFiles: jsFiles.map(f => ({ path: f.path, status: f.status }))
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
catch (error) {
|
|
104
|
+
console.error('[IncrementalAnalysis] Error:', error);
|
|
105
|
+
return createErrorResult(error);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Обработать один изменённый файл
|
|
110
|
+
*/
|
|
111
|
+
async processChangedFile(fileInfo, projectPath, graph) {
|
|
112
|
+
const { path: relativePath, status } = fileInfo;
|
|
113
|
+
// relativePath может начинаться с / или быть относительным
|
|
114
|
+
const fullPath = relativePath.startsWith('/') ? relativePath : `${projectPath}/${relativePath}`;
|
|
115
|
+
console.log(`[IncrementalAnalysis] Processing ${relativePath} (${status})`);
|
|
116
|
+
// Если файл удалён - ничего не делаем (main версия остаётся, __local не создаём)
|
|
117
|
+
if (status === 'deleted') {
|
|
118
|
+
console.log(` → File deleted, keeping main version only`);
|
|
119
|
+
return { nodesCreated: 0, edgesCreated: 0 };
|
|
120
|
+
}
|
|
121
|
+
// Выполняем fine-grained merge
|
|
122
|
+
const result = await this.finegrainedMerge(fullPath, graph);
|
|
123
|
+
console.log(` → Added: ${result.added}, Modified: ${result.modified}, Unchanged: ${result.unchanged}, Deleted: ${result.deleted}`);
|
|
124
|
+
return {
|
|
125
|
+
nodesCreated: result.added + result.modified,
|
|
126
|
+
edgesCreated: result.edgesCreated || 0
|
|
127
|
+
};
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Fine-grained merge - ключевая функция инкрементального анализа
|
|
131
|
+
*/
|
|
132
|
+
async finegrainedMerge(filePath, graph) {
|
|
133
|
+
// 1. Парсим новое содержимое файла
|
|
134
|
+
const newContent = await readFile(filePath, 'utf-8');
|
|
135
|
+
const newNodes = await this.extractTopLevelNodes(newContent, filePath);
|
|
136
|
+
console.log(` → Parsed ${newNodes.length} nodes from new content`);
|
|
137
|
+
// 2. Получаем существующие main ноды для этого файла
|
|
138
|
+
const mainNodes = await graph.getNodesByVersion('main', {
|
|
139
|
+
file: filePath
|
|
140
|
+
});
|
|
141
|
+
const mainTopLevel = mainNodes.filter(node => ['FUNCTION', 'CLASS', 'VARIABLE_DECLARATION', 'MODULE'].includes(node.type));
|
|
142
|
+
console.log(` → Found ${mainTopLevel.length} existing main nodes`);
|
|
143
|
+
// 3. Классифицируем изменения
|
|
144
|
+
const changes = versionManager.classifyChanges(mainTopLevel, newNodes);
|
|
145
|
+
console.log(` → Classification: +${changes.added.length} ~${changes.modified.length} =${changes.unchanged.length} -${changes.deleted.length}`);
|
|
146
|
+
// 4. Создаём __local версии для added/modified нод
|
|
147
|
+
let edgesCreated = 0;
|
|
148
|
+
// 4a. ADDED nodes - просто создаём с версией __local
|
|
149
|
+
for (const node of changes.added) {
|
|
150
|
+
const enrichedNode = versionManager.enrichNodeWithVersion(node, '__local');
|
|
151
|
+
await graph.addNode(enrichedNode);
|
|
152
|
+
}
|
|
153
|
+
// 4b. MODIFIED nodes - создаём __local версию + REPLACES ребро
|
|
154
|
+
for (const { old: oldNode, new: newNode } of changes.modified) {
|
|
155
|
+
const mainNodeId = versionManager.generateVersionedId(oldNode, 'main');
|
|
156
|
+
const enrichedNode = versionManager.enrichNodeWithVersion(newNode, '__local', {
|
|
157
|
+
replacesId: mainNodeId
|
|
158
|
+
});
|
|
159
|
+
await graph.addNode(enrichedNode);
|
|
160
|
+
// Создаём REPLACES ребро
|
|
161
|
+
const replacesEdge = versionManager.createReplacesEdge(enrichedNode.id, mainNodeId);
|
|
162
|
+
console.log(` [REPLACES] ${newNode.name}: ${enrichedNode.id} → ${mainNodeId}`);
|
|
163
|
+
await graph.addEdge({
|
|
164
|
+
type: replacesEdge.type,
|
|
165
|
+
src: replacesEdge.fromId,
|
|
166
|
+
dst: replacesEdge.toId
|
|
167
|
+
});
|
|
168
|
+
edgesCreated++;
|
|
169
|
+
}
|
|
170
|
+
// 4c. UNCHANGED nodes - не создаём __local версию (используется main)
|
|
171
|
+
// 4d. DELETED nodes - не создаём __local версию (main остаётся, показывая что было удалено)
|
|
172
|
+
// 5. Переанализируем изменённые ноды для создания связей (CALLS, USES)
|
|
173
|
+
const nodesToReanalyze = [...changes.added, ...changes.modified.map(m => m.new)];
|
|
174
|
+
if (nodesToReanalyze.length > 0) {
|
|
175
|
+
const reanalyzeResult = await this.reanalyzeNodes(nodesToReanalyze, filePath, '__local', graph);
|
|
176
|
+
edgesCreated += reanalyzeResult.edgesCreated;
|
|
177
|
+
}
|
|
178
|
+
return {
|
|
179
|
+
added: changes.added.length,
|
|
180
|
+
modified: changes.modified.length,
|
|
181
|
+
unchanged: changes.unchanged.length,
|
|
182
|
+
deleted: changes.deleted.length,
|
|
183
|
+
edgesCreated
|
|
184
|
+
};
|
|
185
|
+
}
|
|
186
|
+
/**
|
|
187
|
+
* Извлечь top-level ноды из файла
|
|
188
|
+
*/
|
|
189
|
+
async extractTopLevelNodes(content, filePath) {
|
|
190
|
+
const nodes = [];
|
|
191
|
+
try {
|
|
192
|
+
// Парсим с помощью Babel
|
|
193
|
+
const ast = parse(content, {
|
|
194
|
+
sourceType: 'module',
|
|
195
|
+
plugins: [
|
|
196
|
+
'jsx',
|
|
197
|
+
'typescript',
|
|
198
|
+
'decorators-legacy',
|
|
199
|
+
'classProperties',
|
|
200
|
+
'objectRestSpread',
|
|
201
|
+
'optionalChaining',
|
|
202
|
+
'nullishCoalescingOperator'
|
|
203
|
+
]
|
|
204
|
+
});
|
|
205
|
+
// Обходим AST и извлекаем top-level декларации
|
|
206
|
+
traverse(ast, {
|
|
207
|
+
// Function Declarations (включая export function)
|
|
208
|
+
FunctionDeclaration: (path) => {
|
|
209
|
+
// Только top-level функции (родитель - Program или ExportNamedDeclaration)
|
|
210
|
+
const parentType = path.parent.type;
|
|
211
|
+
if (parentType !== 'Program' &&
|
|
212
|
+
parentType !== 'ExportNamedDeclaration' &&
|
|
213
|
+
parentType !== 'ExportDefaultDeclaration') {
|
|
214
|
+
return;
|
|
215
|
+
}
|
|
216
|
+
const node = path.node;
|
|
217
|
+
nodes.push({
|
|
218
|
+
type: 'FUNCTION',
|
|
219
|
+
name: node.id?.name || 'anonymous',
|
|
220
|
+
file: filePath,
|
|
221
|
+
line: node.loc?.start.line || 0,
|
|
222
|
+
column: node.loc?.start.column || 0,
|
|
223
|
+
params: node.params.map(p => p.name || p.type),
|
|
224
|
+
async: node.async || false,
|
|
225
|
+
exported: this.isExported(path) ||
|
|
226
|
+
parentType === 'ExportNamedDeclaration' ||
|
|
227
|
+
parentType === 'ExportDefaultDeclaration',
|
|
228
|
+
bodyHash: versionManager.calculateBodyHash(content.substring(node.body.start, node.body.end)) ?? undefined
|
|
229
|
+
});
|
|
230
|
+
},
|
|
231
|
+
// Class Declarations
|
|
232
|
+
ClassDeclaration: (path) => {
|
|
233
|
+
const parentType = path.parent.type;
|
|
234
|
+
if (parentType !== 'Program' &&
|
|
235
|
+
parentType !== 'ExportNamedDeclaration' &&
|
|
236
|
+
parentType !== 'ExportDefaultDeclaration') {
|
|
237
|
+
return;
|
|
238
|
+
}
|
|
239
|
+
const node = path.node;
|
|
240
|
+
const methods = node.body.body
|
|
241
|
+
.filter(member => member.type === 'ClassMethod')
|
|
242
|
+
.map(method => method.key.name);
|
|
243
|
+
nodes.push({
|
|
244
|
+
type: 'CLASS',
|
|
245
|
+
name: node.id?.name || 'anonymous',
|
|
246
|
+
file: filePath,
|
|
247
|
+
line: node.loc?.start.line || 0,
|
|
248
|
+
column: node.loc?.start.column || 0,
|
|
249
|
+
methods: methods,
|
|
250
|
+
exported: this.isExported(path) ||
|
|
251
|
+
parentType === 'ExportNamedDeclaration' ||
|
|
252
|
+
parentType === 'ExportDefaultDeclaration',
|
|
253
|
+
extends: node.superClass?.name || undefined
|
|
254
|
+
});
|
|
255
|
+
},
|
|
256
|
+
// Variable Declarations (const, let, var)
|
|
257
|
+
VariableDeclaration: (path) => {
|
|
258
|
+
const parentType = path.parent.type;
|
|
259
|
+
if (parentType !== 'Program' && parentType !== 'ExportNamedDeclaration') {
|
|
260
|
+
return;
|
|
261
|
+
}
|
|
262
|
+
const node = path.node;
|
|
263
|
+
// Каждый declarator - отдельная нода
|
|
264
|
+
for (const declarator of node.declarations) {
|
|
265
|
+
if (declarator.id.type === 'Identifier') {
|
|
266
|
+
nodes.push({
|
|
267
|
+
type: 'VARIABLE_DECLARATION',
|
|
268
|
+
name: declarator.id.name,
|
|
269
|
+
file: filePath,
|
|
270
|
+
line: node.loc?.start.line || 0,
|
|
271
|
+
column: node.loc?.start.column || 0,
|
|
272
|
+
kind: node.kind // const, let, var
|
|
273
|
+
});
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
});
|
|
278
|
+
}
|
|
279
|
+
catch (error) {
|
|
280
|
+
console.error(` ✗ Failed to parse ${filePath}:`, error.message);
|
|
281
|
+
}
|
|
282
|
+
return nodes;
|
|
283
|
+
}
|
|
284
|
+
/**
|
|
285
|
+
* Проверить, экспортируется ли нода
|
|
286
|
+
*/
|
|
287
|
+
isExported(path) {
|
|
288
|
+
// Проверяем родительский узел
|
|
289
|
+
const parent = path.parent;
|
|
290
|
+
if (parent.type === 'ExportNamedDeclaration' || parent.type === 'ExportDefaultDeclaration') {
|
|
291
|
+
return true;
|
|
292
|
+
}
|
|
293
|
+
// Проверяем наличие export в том же scope
|
|
294
|
+
// export { foo, bar }
|
|
295
|
+
const programPath = path.findParent(p => p.isProgram());
|
|
296
|
+
if (programPath) {
|
|
297
|
+
const nodeName = path.node.id?.name;
|
|
298
|
+
if (!nodeName)
|
|
299
|
+
return false;
|
|
300
|
+
let isExported = false;
|
|
301
|
+
programPath.traverse({
|
|
302
|
+
ExportNamedDeclaration: (exportPath) => {
|
|
303
|
+
const specifiers = exportPath.node.specifiers;
|
|
304
|
+
if (specifiers) {
|
|
305
|
+
for (const spec of specifiers) {
|
|
306
|
+
if (spec.exported?.name === nodeName || spec.local?.name === nodeName) {
|
|
307
|
+
isExported = true;
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
});
|
|
313
|
+
return isExported;
|
|
314
|
+
}
|
|
315
|
+
return false;
|
|
316
|
+
}
|
|
317
|
+
/**
|
|
318
|
+
* Переанализировать ноды для создания CALLS/USES edges
|
|
319
|
+
*/
|
|
320
|
+
async reanalyzeNodes(nodes, filePath, version, graph) {
|
|
321
|
+
let edgesCreated = 0;
|
|
322
|
+
try {
|
|
323
|
+
// Читаем файл заново
|
|
324
|
+
const content = await readFile(filePath, 'utf-8');
|
|
325
|
+
// Парсим AST
|
|
326
|
+
const ast = parse(content, {
|
|
327
|
+
sourceType: 'module',
|
|
328
|
+
plugins: ['jsx', 'typescript', 'decorators-legacy']
|
|
329
|
+
});
|
|
330
|
+
// Для каждой ноды ищем её в AST и анализируем
|
|
331
|
+
for (const node of nodes) {
|
|
332
|
+
if (node.type === 'FUNCTION') {
|
|
333
|
+
const functionEdges = await this.analyzeFunctionCalls(node, ast, version, graph);
|
|
334
|
+
edgesCreated += functionEdges;
|
|
335
|
+
}
|
|
336
|
+
else if (node.type === 'CLASS') {
|
|
337
|
+
const classEdges = await this.analyzeClassMethods(node, ast, version, graph);
|
|
338
|
+
edgesCreated += classEdges;
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
console.log(` → Reanalyzed ${nodes.length} nodes, created ${edgesCreated} edges`);
|
|
342
|
+
return { edgesCreated };
|
|
343
|
+
}
|
|
344
|
+
catch (error) {
|
|
345
|
+
console.error(`[IncrementalAnalysis] Error reanalyzing nodes:`, error);
|
|
346
|
+
return { edgesCreated: 0 };
|
|
347
|
+
}
|
|
348
|
+
}
|
|
349
|
+
/**
|
|
350
|
+
* Анализировать вызовы функций внутри функции
|
|
351
|
+
*/
|
|
352
|
+
async analyzeFunctionCalls(functionNode, ast, version, graph) {
|
|
353
|
+
let edgesCreated = 0;
|
|
354
|
+
let functionPath = null;
|
|
355
|
+
// Ищем функцию в AST по имени
|
|
356
|
+
traverse(ast, {
|
|
357
|
+
FunctionDeclaration: (path) => {
|
|
358
|
+
const node = path.node;
|
|
359
|
+
if (node.id?.name === functionNode.name) {
|
|
360
|
+
functionPath = path;
|
|
361
|
+
path.stop();
|
|
362
|
+
}
|
|
363
|
+
},
|
|
364
|
+
// Arrow functions и function expressions в VariableDeclaration
|
|
365
|
+
VariableDeclarator: (path) => {
|
|
366
|
+
const node = path.node;
|
|
367
|
+
if (node.id?.name === functionNode.name) {
|
|
368
|
+
if (node.init?.type === 'ArrowFunctionExpression' ||
|
|
369
|
+
node.init?.type === 'FunctionExpression') {
|
|
370
|
+
functionPath = path.get('init');
|
|
371
|
+
path.stop();
|
|
372
|
+
}
|
|
373
|
+
}
|
|
374
|
+
}
|
|
375
|
+
});
|
|
376
|
+
// Если нашли функцию, анализируем её тело
|
|
377
|
+
if (functionPath) {
|
|
378
|
+
edgesCreated = await this.traverseFunctionBody(functionPath, functionNode, version, graph);
|
|
379
|
+
}
|
|
380
|
+
return edgesCreated;
|
|
381
|
+
}
|
|
382
|
+
/**
|
|
383
|
+
* Traverse function body для поиска CALLS
|
|
384
|
+
*/
|
|
385
|
+
async traverseFunctionBody(path, functionNode, version, graph) {
|
|
386
|
+
const callSites = [];
|
|
387
|
+
// Собираем все CallExpression внутри функции
|
|
388
|
+
path.traverse({
|
|
389
|
+
CallExpression: (callPath) => {
|
|
390
|
+
const node = callPath.node;
|
|
391
|
+
const callee = node.callee;
|
|
392
|
+
// Простые вызовы: foo()
|
|
393
|
+
if (callee.type === 'Identifier') {
|
|
394
|
+
callSites.push({
|
|
395
|
+
callee: callee.name,
|
|
396
|
+
type: 'FUNCTION_CALL'
|
|
397
|
+
});
|
|
398
|
+
}
|
|
399
|
+
// Method calls: obj.method()
|
|
400
|
+
else if (callee.type === 'MemberExpression') {
|
|
401
|
+
const objectName = callee.object?.name;
|
|
402
|
+
const methodName = callee.property?.name;
|
|
403
|
+
if (objectName && methodName) {
|
|
404
|
+
callSites.push({
|
|
405
|
+
callee: `${objectName}.${methodName}`,
|
|
406
|
+
object: objectName,
|
|
407
|
+
method: methodName,
|
|
408
|
+
type: 'METHOD_CALL'
|
|
409
|
+
});
|
|
410
|
+
}
|
|
411
|
+
}
|
|
412
|
+
}
|
|
413
|
+
});
|
|
414
|
+
// Создаём CALLS edges для каждого call site (последовательно)
|
|
415
|
+
let edgesCreated = 0;
|
|
416
|
+
for (const callSite of callSites) {
|
|
417
|
+
// Генерируем ID для caller (__local версия)
|
|
418
|
+
const callerId = versionManager.generateVersionedId(functionNode, version);
|
|
419
|
+
// Пытаемся найти callee в графе (сначала __local, потом main)
|
|
420
|
+
const calleeName = callSite.callee.split('.')[0]; // Для method calls берём объект
|
|
421
|
+
const calleeStableId = `FUNCTION:${calleeName}:${functionNode.file}`;
|
|
422
|
+
// Ищем callee в базе
|
|
423
|
+
try {
|
|
424
|
+
const created = await this.findCalleeAndCreateEdge(callerId, calleeStableId, version, graph);
|
|
425
|
+
if (created)
|
|
426
|
+
edgesCreated++;
|
|
427
|
+
}
|
|
428
|
+
catch (err) {
|
|
429
|
+
console.error(`[IncrementalAnalysis] Error creating CALLS edge:`, err);
|
|
430
|
+
}
|
|
431
|
+
}
|
|
432
|
+
return edgesCreated;
|
|
433
|
+
}
|
|
434
|
+
/**
|
|
435
|
+
* Найти callee и создать CALLS edge
|
|
436
|
+
*/
|
|
437
|
+
async findCalleeAndCreateEdge(callerId, calleeStableId, version, graph) {
|
|
438
|
+
try {
|
|
439
|
+
// Ищем callee сначала в __local, потом в main
|
|
440
|
+
const calleeVersions = await graph.getNodesByStableId(calleeStableId);
|
|
441
|
+
if (calleeVersions.length === 0) {
|
|
442
|
+
// Callee не найден - возможно это external функция
|
|
443
|
+
return false;
|
|
444
|
+
}
|
|
445
|
+
// Предпочитаем __local версию, если есть
|
|
446
|
+
const calleeNode = calleeVersions.find(n => n.version === '__local') ||
|
|
447
|
+
calleeVersions.find(n => n.version === 'main');
|
|
448
|
+
if (!calleeNode) {
|
|
449
|
+
return false;
|
|
450
|
+
}
|
|
451
|
+
// Создаём CALLS edge
|
|
452
|
+
await graph.addEdge({
|
|
453
|
+
type: 'CALLS',
|
|
454
|
+
src: callerId,
|
|
455
|
+
dst: calleeNode.id
|
|
456
|
+
});
|
|
457
|
+
return true;
|
|
458
|
+
}
|
|
459
|
+
catch (error) {
|
|
460
|
+
console.error(`[IncrementalAnalysis] Error finding callee:`, error);
|
|
461
|
+
return false;
|
|
462
|
+
}
|
|
463
|
+
}
|
|
464
|
+
/**
|
|
465
|
+
* Анализировать методы класса
|
|
466
|
+
*/
|
|
467
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
468
|
+
async analyzeClassMethods(_classNode, _ast, _version, _graph) {
|
|
469
|
+
// TODO: реализовать анализ методов класса
|
|
470
|
+
return 0;
|
|
471
|
+
}
|
|
472
|
+
}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* JSASTAnalyzer - плагин для парсинга JavaScript AST
|
|
3
|
+
* Создаёт ноды: FUNCTION, CLASS, METHOD и т.д.
|
|
4
|
+
*/
|
|
5
|
+
import type { NodePath } from '@babel/traverse';
|
|
6
|
+
import * as t from '@babel/types';
|
|
7
|
+
import { Plugin } from '../Plugin.js';
|
|
8
|
+
import { type VisitorModule, type VisitorCollections } from './ast/visitors/index.js';
|
|
9
|
+
import type { PluginContext, PluginResult, PluginMetadata, GraphBackend } from '@grafema/types';
|
|
10
|
+
import type { ModuleNode, LiteralInfo, VariableAssignmentInfo, CounterRef, ExtractedVariable } from './ast/types.js';
|
|
11
|
+
/**
|
|
12
|
+
* Context for tracking semantic IDs within a scope hierarchy.
|
|
13
|
+
* Used to generate stable, line-number-independent IDs for SCOPE nodes.
|
|
14
|
+
*/
|
|
15
|
+
interface ScopeContext {
|
|
16
|
+
semanticPath: string;
|
|
17
|
+
siblingCounters: Map<string, number>;
|
|
18
|
+
}
|
|
19
|
+
interface AnalysisManifest {
|
|
20
|
+
projectPath: string;
|
|
21
|
+
[key: string]: unknown;
|
|
22
|
+
}
|
|
23
|
+
interface AnalyzeContext extends PluginContext {
|
|
24
|
+
manifest?: AnalysisManifest;
|
|
25
|
+
forceAnalysis?: boolean;
|
|
26
|
+
workerCount?: number;
|
|
27
|
+
onProgress?: (info: Record<string, unknown>) => void;
|
|
28
|
+
}
|
|
29
|
+
export declare class JSASTAnalyzer extends Plugin {
|
|
30
|
+
private graphBuilder;
|
|
31
|
+
private analyzedModules;
|
|
32
|
+
private profiler;
|
|
33
|
+
private _cacheCleared;
|
|
34
|
+
constructor();
|
|
35
|
+
get metadata(): PluginMetadata;
|
|
36
|
+
/**
|
|
37
|
+
* Вычисляет хеш содержимого файла
|
|
38
|
+
*/
|
|
39
|
+
calculateFileHash(filePath: string): string | null;
|
|
40
|
+
/**
|
|
41
|
+
* Проверяет нужно ли анализировать модуль (сравнивает хеши)
|
|
42
|
+
*/
|
|
43
|
+
shouldAnalyzeModule(module: ModuleNode, graph: GraphBackend, forceAnalysis: boolean): Promise<boolean>;
|
|
44
|
+
execute(context: AnalyzeContext): Promise<PluginResult>;
|
|
45
|
+
/**
|
|
46
|
+
* Extract variable names from destructuring patterns
|
|
47
|
+
* Uses t.isX() type guards to avoid casts
|
|
48
|
+
*/
|
|
49
|
+
extractVariableNamesFromPattern(pattern: t.Node | null | undefined, variables?: ExtractedVariable[], propertyPath?: string[]): ExtractedVariable[];
|
|
50
|
+
/**
|
|
51
|
+
* Отслеживает присваивание переменной для data flow анализа
|
|
52
|
+
*/
|
|
53
|
+
trackVariableAssignment(initNode: t.Expression | null | undefined, variableId: string, variableName: string, module: VisitorModule, line: number, literals: LiteralInfo[], variableAssignments: VariableAssignmentInfo[], literalCounterRef: CounterRef): void;
|
|
54
|
+
/**
|
|
55
|
+
* Получить все MODULE ноды из графа
|
|
56
|
+
*/
|
|
57
|
+
private getModuleNodes;
|
|
58
|
+
/**
|
|
59
|
+
* Анализировать один модуль
|
|
60
|
+
*/
|
|
61
|
+
analyzeModule(module: ModuleNode, graph: GraphBackend, projectPath: string): Promise<{
|
|
62
|
+
nodes: number;
|
|
63
|
+
edges: number;
|
|
64
|
+
}>;
|
|
65
|
+
/**
|
|
66
|
+
* Helper to generate semantic ID for a scope and update counters
|
|
67
|
+
*/
|
|
68
|
+
private generateSemanticId;
|
|
69
|
+
/**
|
|
70
|
+
* Helper to create child scope context from a semantic ID
|
|
71
|
+
*/
|
|
72
|
+
private createChildScopeContext;
|
|
73
|
+
/**
|
|
74
|
+
* Generate a unique anonymous function name within the current scope
|
|
75
|
+
* Uses scopeCtx.siblingCounters to ensure stability across JS/TS versions
|
|
76
|
+
*/
|
|
77
|
+
private generateAnonymousName;
|
|
78
|
+
/**
|
|
79
|
+
* Анализирует тело функции и извлекает переменные, вызовы, условные блоки
|
|
80
|
+
*/
|
|
81
|
+
analyzeFunctionBody(funcPath: NodePath<t.Function>, parentScopeId: string, module: VisitorModule, collections: VisitorCollections, scopeCtx?: ScopeContext): void;
|
|
82
|
+
}
|
|
83
|
+
export {};
|
|
84
|
+
//# sourceMappingURL=JSASTAnalyzer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"JSASTAnalyzer.d.ts","sourceRoot":"","sources":["../../../src/plugins/analysis/JSASTAnalyzer.ts"],"names":[],"mappings":"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"}
|