@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,233 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DataFlowValidator - проверяет что все переменные прослеживаются до листовых узлов
|
|
3
|
+
*
|
|
4
|
+
* ПРАВИЛО: Каждая переменная должна иметь путь до листового узла через ASSIGNED_FROM рёбра
|
|
5
|
+
*
|
|
6
|
+
* ЛИСТОВЫЕ УЗЛЫ:
|
|
7
|
+
* - LITERAL: примитивные значения
|
|
8
|
+
* - EXTERNAL_STDIO: console.log/error
|
|
9
|
+
* - EXTERNAL_DATABASE: database queries
|
|
10
|
+
* - EXTERNAL_NETWORK: HTTP requests
|
|
11
|
+
* - EXTERNAL_FILESYSTEM: fs.readFile
|
|
12
|
+
* - EVENT_LISTENER: события
|
|
13
|
+
*/
|
|
14
|
+
|
|
15
|
+
import { Plugin, createSuccessResult } from '../Plugin.js';
|
|
16
|
+
import type { PluginContext, PluginResult, PluginMetadata } from '../Plugin.js';
|
|
17
|
+
import type { NodeRecord } from '@grafema/types';
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* Edge structure
|
|
21
|
+
*/
|
|
22
|
+
interface EdgeRecord {
|
|
23
|
+
type: string;
|
|
24
|
+
src: string;
|
|
25
|
+
dst: string;
|
|
26
|
+
[key: string]: unknown;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* Data flow issue
|
|
31
|
+
*/
|
|
32
|
+
interface DataFlowIssue {
|
|
33
|
+
type: string;
|
|
34
|
+
severity: string;
|
|
35
|
+
message: string;
|
|
36
|
+
variable: string;
|
|
37
|
+
file?: string;
|
|
38
|
+
line?: number;
|
|
39
|
+
chain?: string[];
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* Path finding result
|
|
44
|
+
*/
|
|
45
|
+
interface PathResult {
|
|
46
|
+
found: boolean;
|
|
47
|
+
chain: string[];
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* Validation summary
|
|
52
|
+
*/
|
|
53
|
+
interface ValidationSummary {
|
|
54
|
+
total: number;
|
|
55
|
+
validated: number;
|
|
56
|
+
issues: number;
|
|
57
|
+
byType: Record<string, number>;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
export class DataFlowValidator extends Plugin {
|
|
61
|
+
get metadata(): PluginMetadata {
|
|
62
|
+
return {
|
|
63
|
+
name: 'DataFlowValidator',
|
|
64
|
+
phase: 'VALIDATION',
|
|
65
|
+
priority: 100,
|
|
66
|
+
creates: {
|
|
67
|
+
nodes: [],
|
|
68
|
+
edges: []
|
|
69
|
+
}
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
async execute(context: PluginContext): Promise<PluginResult> {
|
|
74
|
+
const { graph } = context;
|
|
75
|
+
|
|
76
|
+
console.log('[DataFlowValidator] Starting data flow validation...');
|
|
77
|
+
|
|
78
|
+
// Check if graph supports getAllEdges
|
|
79
|
+
if (!graph.getAllEdges) {
|
|
80
|
+
console.log('[DataFlowValidator] Graph does not support getAllEdges, skipping validation');
|
|
81
|
+
return createSuccessResult({ nodes: 0, edges: 0 }, { skipped: true });
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
// Получаем все переменные
|
|
85
|
+
const allNodes = await graph.getAllNodes();
|
|
86
|
+
const allEdges = await graph.getAllEdges() as EdgeRecord[];
|
|
87
|
+
|
|
88
|
+
const variables = allNodes.filter(n =>
|
|
89
|
+
n.type === 'VARIABLE_DECLARATION' || n.type === 'CONSTANT'
|
|
90
|
+
);
|
|
91
|
+
|
|
92
|
+
console.log(`[DataFlowValidator] Found ${variables.length} variables to validate`);
|
|
93
|
+
|
|
94
|
+
const issues: DataFlowIssue[] = [];
|
|
95
|
+
const leafTypes = new Set([
|
|
96
|
+
'LITERAL',
|
|
97
|
+
'EXTERNAL_STDIO',
|
|
98
|
+
'EXTERNAL_DATABASE',
|
|
99
|
+
'EXTERNAL_NETWORK',
|
|
100
|
+
'EXTERNAL_FILESYSTEM',
|
|
101
|
+
'EVENT_LISTENER',
|
|
102
|
+
'CLASS', // NewExpression - конструкторы классов
|
|
103
|
+
'FUNCTION', // Arrow functions и function expressions
|
|
104
|
+
'METHOD_CALL', // Вызовы методов (промежуточные узлы)
|
|
105
|
+
'CALL_SITE' // Вызовы функций (промежуточные узлы)
|
|
106
|
+
]);
|
|
107
|
+
|
|
108
|
+
for (const variable of variables) {
|
|
109
|
+
// Проверяем наличие ASSIGNED_FROM ребра
|
|
110
|
+
const assignment = allEdges.find(e =>
|
|
111
|
+
e.type === 'ASSIGNED_FROM' && e.src === variable.id
|
|
112
|
+
);
|
|
113
|
+
|
|
114
|
+
if (!assignment) {
|
|
115
|
+
issues.push({
|
|
116
|
+
type: 'MISSING_ASSIGNMENT',
|
|
117
|
+
severity: 'WARNING',
|
|
118
|
+
message: `Variable "${variable.name}" (${variable.file}:${variable.line}) has no ASSIGNED_FROM edge`,
|
|
119
|
+
variable: variable.name as string,
|
|
120
|
+
file: variable.file,
|
|
121
|
+
line: variable.line as number | undefined
|
|
122
|
+
});
|
|
123
|
+
continue;
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
// Проверяем что источник существует
|
|
127
|
+
const source = allNodes.find(n => n.id === assignment.dst);
|
|
128
|
+
if (!source) {
|
|
129
|
+
issues.push({
|
|
130
|
+
type: 'BROKEN_REFERENCE',
|
|
131
|
+
severity: 'ERROR',
|
|
132
|
+
message: `Variable "${variable.name}" references non-existent node ${assignment.dst}`,
|
|
133
|
+
variable: variable.name as string,
|
|
134
|
+
file: variable.file,
|
|
135
|
+
line: variable.line as number | undefined
|
|
136
|
+
});
|
|
137
|
+
continue;
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
// Проверяем путь до листового узла
|
|
141
|
+
const path = this.findPathToLeaf(variable, allNodes, allEdges, leafTypes);
|
|
142
|
+
if (!path.found) {
|
|
143
|
+
issues.push({
|
|
144
|
+
type: 'NO_LEAF_NODE',
|
|
145
|
+
severity: 'WARNING',
|
|
146
|
+
message: `Variable "${variable.name}" (${variable.file}:${variable.line}) does not trace to a leaf node. Chain: ${path.chain.join(' -> ')}`,
|
|
147
|
+
variable: variable.name as string,
|
|
148
|
+
file: variable.file,
|
|
149
|
+
line: variable.line as number | undefined,
|
|
150
|
+
chain: path.chain
|
|
151
|
+
});
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
// Группируем issues по типу
|
|
156
|
+
const summary: ValidationSummary = {
|
|
157
|
+
total: variables.length,
|
|
158
|
+
validated: variables.length - issues.length,
|
|
159
|
+
issues: issues.length,
|
|
160
|
+
byType: {}
|
|
161
|
+
};
|
|
162
|
+
|
|
163
|
+
for (const issue of issues) {
|
|
164
|
+
if (!summary.byType[issue.type]) {
|
|
165
|
+
summary.byType[issue.type] = 0;
|
|
166
|
+
}
|
|
167
|
+
summary.byType[issue.type]++;
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
console.log('[DataFlowValidator] Summary:', summary);
|
|
171
|
+
|
|
172
|
+
// Выводим issues
|
|
173
|
+
if (issues.length > 0) {
|
|
174
|
+
console.log(`[DataFlowValidator] Found ${issues.length} issues:`);
|
|
175
|
+
for (const issue of issues) {
|
|
176
|
+
const level = issue.severity === 'ERROR' ? '❌' : '⚠️';
|
|
177
|
+
console.log(` ${level} [${issue.type}] ${issue.message}`);
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
return createSuccessResult(
|
|
182
|
+
{ nodes: 0, edges: 0 },
|
|
183
|
+
{ summary, issues }
|
|
184
|
+
);
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
/**
|
|
188
|
+
* Находит путь от переменной до листового узла
|
|
189
|
+
*/
|
|
190
|
+
private findPathToLeaf(
|
|
191
|
+
startNode: NodeRecord,
|
|
192
|
+
allNodes: NodeRecord[],
|
|
193
|
+
allEdges: EdgeRecord[],
|
|
194
|
+
leafTypes: Set<string>,
|
|
195
|
+
visited: Set<string> = new Set(),
|
|
196
|
+
chain: string[] = []
|
|
197
|
+
): PathResult {
|
|
198
|
+
// Защита от циклов
|
|
199
|
+
if (visited.has(startNode.id)) {
|
|
200
|
+
return { found: false, chain: [...chain, `${startNode.type}:${startNode.name} (CYCLE)`] };
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
visited.add(startNode.id);
|
|
204
|
+
chain.push(`${startNode.type}:${startNode.name}`);
|
|
205
|
+
|
|
206
|
+
// Проверяем что это листовой узел
|
|
207
|
+
if (leafTypes.has(startNode.type)) {
|
|
208
|
+
return { found: true, chain };
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
// Ищем ASSIGNED_FROM ребро
|
|
212
|
+
const assignment = allEdges.find(e =>
|
|
213
|
+
e.type === 'ASSIGNED_FROM' && e.src === startNode.id
|
|
214
|
+
);
|
|
215
|
+
|
|
216
|
+
if (!assignment) {
|
|
217
|
+
// Для METHOD_CALL и CALL_SITE - это промежуточные узлы, но можем считать их leaf для первой версии
|
|
218
|
+
if (startNode.type === 'METHOD_CALL' || startNode.type === 'CALL_SITE') {
|
|
219
|
+
return { found: true, chain: [...chain, '(intermediate node)'] };
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
return { found: false, chain: [...chain, '(no assignment)'] };
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
// Продолжаем по цепочке
|
|
226
|
+
const nextNode = allNodes.find(n => n.id === assignment.dst);
|
|
227
|
+
if (!nextNode) {
|
|
228
|
+
return { found: false, chain: [...chain, '(broken reference)'] };
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
return this.findPathToLeaf(nextNode, allNodes, allEdges, leafTypes, visited, chain);
|
|
232
|
+
}
|
|
233
|
+
}
|
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* EvalBanValidator - запрещает использование eval и Function
|
|
3
|
+
*
|
|
4
|
+
* Security инвариант: код не должен использовать динамическое выполнение.
|
|
5
|
+
*
|
|
6
|
+
* Детектирует:
|
|
7
|
+
* - eval("code") - прямой вызов eval
|
|
8
|
+
* - new Function("code") - конструктор Function
|
|
9
|
+
* - Function("code") - вызов Function без new
|
|
10
|
+
* - window.eval("code") - eval через window
|
|
11
|
+
* - globalThis.eval("code") - eval через globalThis
|
|
12
|
+
* - Aliased eval: const e = eval; e("code") - через AliasTracker
|
|
13
|
+
*
|
|
14
|
+
* ПРАВИЛА (Datalog):
|
|
15
|
+
* violation(X) :- node(X, "CALL"), attr(X, "name", "eval").
|
|
16
|
+
* violation(X) :- node(X, "CALL"), attr(X, "name", "Function").
|
|
17
|
+
* violation(X) :- node(X, "CALL"), attr(X, "method", "eval").
|
|
18
|
+
*/
|
|
19
|
+
|
|
20
|
+
import { Plugin, createSuccessResult } from '../Plugin.js';
|
|
21
|
+
import type { PluginContext, PluginResult, PluginMetadata } from '../Plugin.js';
|
|
22
|
+
import type { BaseNodeRecord } from '@grafema/types';
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* Eval ban issue
|
|
26
|
+
*/
|
|
27
|
+
interface EvalBanIssue {
|
|
28
|
+
type: string;
|
|
29
|
+
severity: string;
|
|
30
|
+
message: string;
|
|
31
|
+
nodeId: string;
|
|
32
|
+
file?: string;
|
|
33
|
+
line?: number;
|
|
34
|
+
object?: string;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* Extended node with call properties
|
|
39
|
+
*/
|
|
40
|
+
interface CallNode extends BaseNodeRecord {
|
|
41
|
+
method?: string;
|
|
42
|
+
object?: string;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* Validation summary
|
|
47
|
+
*/
|
|
48
|
+
interface ValidationSummary {
|
|
49
|
+
evalCalls: number;
|
|
50
|
+
functionCalls: number;
|
|
51
|
+
methodEvalCalls: number;
|
|
52
|
+
aliasedEvalCalls: number;
|
|
53
|
+
totalViolations: number;
|
|
54
|
+
timeSeconds: string;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
export class EvalBanValidator extends Plugin {
|
|
58
|
+
get metadata(): PluginMetadata {
|
|
59
|
+
return {
|
|
60
|
+
name: 'EvalBanValidator',
|
|
61
|
+
phase: 'VALIDATION',
|
|
62
|
+
priority: 95, // Высокий приоритет - security check
|
|
63
|
+
creates: {
|
|
64
|
+
nodes: [],
|
|
65
|
+
edges: []
|
|
66
|
+
}
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
async execute(context: PluginContext): Promise<PluginResult> {
|
|
71
|
+
const { graph } = context;
|
|
72
|
+
|
|
73
|
+
console.log('[EvalBanValidator] Checking for eval/Function usage...');
|
|
74
|
+
const startTime = Date.now();
|
|
75
|
+
|
|
76
|
+
const issues: EvalBanIssue[] = [];
|
|
77
|
+
|
|
78
|
+
// ОПТИМИЗАЦИЯ: вместо Datalog (медленный full scan), используем прямые graph queries
|
|
79
|
+
// Datalog зависает на больших графах из-за отсутствия индексов
|
|
80
|
+
|
|
81
|
+
// 1. Прямой вызов eval("code") - ищем все CALL ноды с name="eval"
|
|
82
|
+
console.log('[EvalBanValidator] Searching for eval() calls...');
|
|
83
|
+
const evalStart = Date.now();
|
|
84
|
+
let evalCount = 0;
|
|
85
|
+
|
|
86
|
+
for await (const node of graph.queryNodes({ nodeType: 'CALL' })) {
|
|
87
|
+
if (node.name === 'eval') {
|
|
88
|
+
evalCount++;
|
|
89
|
+
issues.push({
|
|
90
|
+
type: 'EVAL_USAGE',
|
|
91
|
+
severity: 'ERROR',
|
|
92
|
+
message: `Direct eval() call at ${node.file}:${node.line || '?'} - dynamic code execution is forbidden`,
|
|
93
|
+
nodeId: node.id,
|
|
94
|
+
file: node.file,
|
|
95
|
+
line: node.line as number | undefined
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
console.log(`[EvalBanValidator] eval() search took ${Date.now() - evalStart}ms, found ${evalCount} violations`);
|
|
100
|
+
|
|
101
|
+
// 2. Вызов Function("code") или new Function("code")
|
|
102
|
+
console.log('[EvalBanValidator] Searching for Function() calls...');
|
|
103
|
+
const funcStart = Date.now();
|
|
104
|
+
let funcCount = 0;
|
|
105
|
+
|
|
106
|
+
for await (const node of graph.queryNodes({ nodeType: 'CALL' })) {
|
|
107
|
+
if (node.name === 'Function') {
|
|
108
|
+
funcCount++;
|
|
109
|
+
issues.push({
|
|
110
|
+
type: 'FUNCTION_CONSTRUCTOR',
|
|
111
|
+
severity: 'ERROR',
|
|
112
|
+
message: `Function() constructor at ${node.file}:${node.line || '?'} - dynamic code execution is forbidden`,
|
|
113
|
+
nodeId: node.id,
|
|
114
|
+
file: node.file,
|
|
115
|
+
line: node.line as number | undefined
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
console.log(`[EvalBanValidator] Function() search took ${Date.now() - funcStart}ms, found ${funcCount} violations`);
|
|
120
|
+
|
|
121
|
+
// 3. Method call: window.eval, globalThis.eval, this.eval
|
|
122
|
+
// Note: METHOD_CALL was merged into CALL - method calls have 'method' attribute
|
|
123
|
+
console.log('[EvalBanValidator] Searching for method eval() calls...');
|
|
124
|
+
const methodStart = Date.now();
|
|
125
|
+
let methodCount = 0;
|
|
126
|
+
|
|
127
|
+
for await (const node of graph.queryNodes({ nodeType: 'CALL' })) {
|
|
128
|
+
const callNode = node as CallNode;
|
|
129
|
+
// Method calls have 'method' attribute (e.g., window.eval())
|
|
130
|
+
if (callNode.method === 'eval' && callNode.object) {
|
|
131
|
+
methodCount++;
|
|
132
|
+
const objectName = callNode.object;
|
|
133
|
+
issues.push({
|
|
134
|
+
type: 'EVAL_METHOD',
|
|
135
|
+
severity: 'ERROR',
|
|
136
|
+
message: `${objectName}.eval() call at ${node.file}:${node.line || '?'} - dynamic code execution is forbidden`,
|
|
137
|
+
nodeId: node.id,
|
|
138
|
+
file: node.file,
|
|
139
|
+
line: node.line as number | undefined,
|
|
140
|
+
object: objectName
|
|
141
|
+
});
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
console.log(`[EvalBanValidator] method eval() search took ${Date.now() - methodStart}ms, found ${methodCount} violations`);
|
|
145
|
+
|
|
146
|
+
// 4. Aliased eval - SKIP for now (complex Datalog query causes OOM)
|
|
147
|
+
console.log('[EvalBanValidator] Skipping aliased eval detection (requires optimized implementation)');
|
|
148
|
+
|
|
149
|
+
const totalTime = ((Date.now() - startTime) / 1000).toFixed(1);
|
|
150
|
+
const summary: ValidationSummary = {
|
|
151
|
+
evalCalls: evalCount,
|
|
152
|
+
functionCalls: funcCount,
|
|
153
|
+
methodEvalCalls: methodCount,
|
|
154
|
+
aliasedEvalCalls: 0, // Skipped for now
|
|
155
|
+
totalViolations: issues.length,
|
|
156
|
+
timeSeconds: totalTime
|
|
157
|
+
};
|
|
158
|
+
|
|
159
|
+
console.log('[EvalBanValidator] Summary:', summary);
|
|
160
|
+
|
|
161
|
+
if (issues.length > 0) {
|
|
162
|
+
console.log('[EvalBanValidator] ❌ Security violations found:');
|
|
163
|
+
for (const issue of issues) {
|
|
164
|
+
console.log(` 🚫 ${issue.message}`);
|
|
165
|
+
}
|
|
166
|
+
} else {
|
|
167
|
+
console.log('[EvalBanValidator] ✅ No eval/Function usage detected');
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
return createSuccessResult(
|
|
171
|
+
{ nodes: 0, edges: 0 }, // created - validator doesn't create nodes/edges
|
|
172
|
+
{ summary, issues } // metadata
|
|
173
|
+
);
|
|
174
|
+
}
|
|
175
|
+
}
|
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* GraphConnectivityValidator - проверяет что все узлы связаны с корневыми узлами
|
|
3
|
+
* Находит "островки" - узлы которые не имеют путей до SERVICE/MODULE
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import { Plugin, createSuccessResult } from '../Plugin.js';
|
|
7
|
+
import type { PluginContext, PluginMetadata, PluginResult } from '../Plugin.js';
|
|
8
|
+
import type { NodeRecord } from '@grafema/types';
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Edge structure
|
|
12
|
+
*/
|
|
13
|
+
interface EdgeRecord {
|
|
14
|
+
src: string;
|
|
15
|
+
dst: string;
|
|
16
|
+
[key: string]: unknown;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* Unreachable node info for manifest
|
|
21
|
+
*/
|
|
22
|
+
interface UnreachableNodeInfo {
|
|
23
|
+
id: string;
|
|
24
|
+
type: string;
|
|
25
|
+
name?: string;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* Validation result in manifest
|
|
30
|
+
*/
|
|
31
|
+
interface ValidationResult {
|
|
32
|
+
unreachableNodes?: UnreachableNodeInfo[];
|
|
33
|
+
hasErrors: boolean;
|
|
34
|
+
totalNodes: number;
|
|
35
|
+
reachableNodes: number;
|
|
36
|
+
unreachableCount?: number;
|
|
37
|
+
unreachableByType?: Record<string, number>;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* Extended manifest with validation field
|
|
42
|
+
*/
|
|
43
|
+
interface ManifestWithValidation {
|
|
44
|
+
validation?: ValidationResult;
|
|
45
|
+
[key: string]: unknown;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
export class GraphConnectivityValidator extends Plugin {
|
|
49
|
+
get metadata(): PluginMetadata {
|
|
50
|
+
return {
|
|
51
|
+
name: 'GraphConnectivityValidator',
|
|
52
|
+
phase: 'VALIDATION',
|
|
53
|
+
priority: 100,
|
|
54
|
+
creates: {
|
|
55
|
+
nodes: [],
|
|
56
|
+
edges: []
|
|
57
|
+
}
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
async execute(context: PluginContext): Promise<PluginResult> {
|
|
62
|
+
const { graph, manifest } = context;
|
|
63
|
+
const manifestWithValidation = manifest as ManifestWithValidation;
|
|
64
|
+
|
|
65
|
+
console.log('[GraphConnectivityValidator] Starting connectivity validation...');
|
|
66
|
+
|
|
67
|
+
// Получаем все узлы
|
|
68
|
+
const allNodes = await graph.getAllNodes();
|
|
69
|
+
console.log(`[GraphConnectivityValidator] Total nodes: ${allNodes.length}`);
|
|
70
|
+
|
|
71
|
+
// Находим корневые узлы (SERVICE, MODULE)
|
|
72
|
+
const rootTypes = ['SERVICE', 'MODULE', 'PROJECT'];
|
|
73
|
+
const rootNodes = allNodes.filter(n => rootTypes.includes(n.type));
|
|
74
|
+
console.log(`[GraphConnectivityValidator] Root nodes: ${rootNodes.length}`);
|
|
75
|
+
|
|
76
|
+
if (rootNodes.length === 0) {
|
|
77
|
+
console.warn('[GraphConnectivityValidator] No root nodes found!');
|
|
78
|
+
return createSuccessResult({ nodes: 0, edges: 0 }, { skipped: true, reason: 'No root nodes' });
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
// Check if graph supports getAllEdges
|
|
82
|
+
if (!graph.getAllEdges) {
|
|
83
|
+
console.log('[GraphConnectivityValidator] Graph does not support getAllEdges, skipping validation');
|
|
84
|
+
return createSuccessResult({ nodes: 0, edges: 0 }, { skipped: true, reason: 'No getAllEdges support' });
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
// Собираем все ребра
|
|
88
|
+
const allEdges = await graph.getAllEdges();
|
|
89
|
+
console.log(`[GraphConnectivityValidator] Total edges: ${allEdges.length}`);
|
|
90
|
+
|
|
91
|
+
// Строим карты смежности (обе направления)
|
|
92
|
+
const adjacencyOut = new Map<string, string[]>(); // nodeId -> [targetIds]
|
|
93
|
+
const adjacencyIn = new Map<string, string[]>(); // nodeId -> [sourceIds]
|
|
94
|
+
|
|
95
|
+
for (const edge of allEdges) {
|
|
96
|
+
// Outgoing edges
|
|
97
|
+
if (!adjacencyOut.has(edge.src)) {
|
|
98
|
+
adjacencyOut.set(edge.src, []);
|
|
99
|
+
}
|
|
100
|
+
adjacencyOut.get(edge.src)!.push(edge.dst);
|
|
101
|
+
|
|
102
|
+
// Incoming edges
|
|
103
|
+
if (!adjacencyIn.has(edge.dst)) {
|
|
104
|
+
adjacencyIn.set(edge.dst, []);
|
|
105
|
+
}
|
|
106
|
+
adjacencyIn.get(edge.dst)!.push(edge.src);
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
// BFS от корневых узлов для поиска достижимых узлов
|
|
110
|
+
const reachable = new Set<string>();
|
|
111
|
+
const queue: string[] = [...rootNodes.map(n => n.id)];
|
|
112
|
+
|
|
113
|
+
while (queue.length > 0) {
|
|
114
|
+
const nodeId = queue.shift()!;
|
|
115
|
+
|
|
116
|
+
if (reachable.has(nodeId)) continue;
|
|
117
|
+
reachable.add(nodeId);
|
|
118
|
+
|
|
119
|
+
// Добавляем все связанные узлы (в обоих направлениях)
|
|
120
|
+
const outgoing = adjacencyOut.get(nodeId) || [];
|
|
121
|
+
const incoming = adjacencyIn.get(nodeId) || [];
|
|
122
|
+
|
|
123
|
+
for (const targetId of [...outgoing, ...incoming]) {
|
|
124
|
+
if (!reachable.has(targetId)) {
|
|
125
|
+
queue.push(targetId);
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
// Находим недостижимые узлы
|
|
131
|
+
const unreachable = allNodes.filter(n => !reachable.has(n.id));
|
|
132
|
+
|
|
133
|
+
if (unreachable.length > 0) {
|
|
134
|
+
// ЯРКОЕ ПРЕДУПРЕЖДЕНИЕ В КОНСОЛИ
|
|
135
|
+
console.error('\n' + '='.repeat(80));
|
|
136
|
+
console.error('⚠️ GRAPH VALIDATION ERROR: DISCONNECTED NODES FOUND');
|
|
137
|
+
console.error('='.repeat(80));
|
|
138
|
+
console.error(`Found ${unreachable.length} unreachable nodes (${((unreachable.length / allNodes.length) * 100).toFixed(1)}% of total)`);
|
|
139
|
+
console.error(`These nodes are not connected to the main graph (SERVICE/MODULE/PROJECT level)`);
|
|
140
|
+
console.error('');
|
|
141
|
+
|
|
142
|
+
// Группируем по типам для читаемости
|
|
143
|
+
const byType: Record<string, NodeRecord[]> = {};
|
|
144
|
+
for (const node of unreachable) {
|
|
145
|
+
if (!byType[node.type]) byType[node.type] = [];
|
|
146
|
+
byType[node.type].push(node);
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
for (const [type, nodes] of Object.entries(byType)) {
|
|
150
|
+
console.error(` ${type}: ${nodes.length} nodes`);
|
|
151
|
+
// Показываем первые 5 для каждого типа
|
|
152
|
+
for (const node of nodes.slice(0, 5)) {
|
|
153
|
+
console.error(` - ${node.name || node.id}`);
|
|
154
|
+
|
|
155
|
+
// Показываем связи этого узла
|
|
156
|
+
const out = adjacencyOut.get(node.id) || [];
|
|
157
|
+
const incoming = adjacencyIn.get(node.id) || [];
|
|
158
|
+
if (out.length > 0 || incoming.length > 0) {
|
|
159
|
+
console.error(` Edges: ${incoming.length} incoming, ${out.length} outgoing`);
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
if (nodes.length > 5) {
|
|
163
|
+
console.error(` ... and ${nodes.length - 5} more`);
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
console.error('');
|
|
168
|
+
console.error('💡 ACTION REQUIRED: Fix analysis plugins to ensure all nodes are connected');
|
|
169
|
+
console.error(' Anonymous functions, callbacks, and method calls should be linked to parent nodes');
|
|
170
|
+
console.error('='.repeat(80) + '\n');
|
|
171
|
+
|
|
172
|
+
// Сохраняем информацию в manifest для дальнейшего использования
|
|
173
|
+
if (!manifestWithValidation.validation) manifestWithValidation.validation = {} as ValidationResult;
|
|
174
|
+
manifestWithValidation.validation.unreachableNodes = unreachable.map(n => ({
|
|
175
|
+
id: n.id,
|
|
176
|
+
type: n.type,
|
|
177
|
+
name: n.name
|
|
178
|
+
}));
|
|
179
|
+
manifestWithValidation.validation.hasErrors = true;
|
|
180
|
+
manifestWithValidation.validation.totalNodes = allNodes.length;
|
|
181
|
+
manifestWithValidation.validation.reachableNodes = reachable.size;
|
|
182
|
+
manifestWithValidation.validation.unreachableCount = unreachable.length;
|
|
183
|
+
manifestWithValidation.validation.unreachableByType = Object.fromEntries(
|
|
184
|
+
Object.entries(byType).map(([type, nodes]) => [type, nodes.length])
|
|
185
|
+
);
|
|
186
|
+
} else {
|
|
187
|
+
console.log('[GraphConnectivityValidator] ✅ All nodes are reachable from root nodes');
|
|
188
|
+
if (!manifestWithValidation.validation) manifestWithValidation.validation = {} as ValidationResult;
|
|
189
|
+
manifestWithValidation.validation.hasErrors = false;
|
|
190
|
+
manifestWithValidation.validation.totalNodes = allNodes.length;
|
|
191
|
+
manifestWithValidation.validation.reachableNodes = reachable.size;
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
console.log(`[GraphConnectivityValidator] Validation complete: ${reachable.size}/${allNodes.length} nodes reachable`);
|
|
195
|
+
|
|
196
|
+
return createSuccessResult(
|
|
197
|
+
{ nodes: 0, edges: 0 },
|
|
198
|
+
{ totalNodes: allNodes.length, reachableNodes: reachable.size }
|
|
199
|
+
);
|
|
200
|
+
}
|
|
201
|
+
}
|