@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,415 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PrefixEvaluator - ENRICHMENT plugin for evaluating dynamic prefixes
|
|
3
|
+
*
|
|
4
|
+
* Resolves placeholders in MOUNT_POINT.prefix:
|
|
5
|
+
* - ${variable} → finds VariableDeclaration in the same module
|
|
6
|
+
* - ${binary} → recursively resolves BinaryExpression
|
|
7
|
+
* - ${template} → resolves TemplateLiteral with variables
|
|
8
|
+
* - ${member} → finds object and its property
|
|
9
|
+
* - ${call} → not supported yet (requires runtime eval)
|
|
10
|
+
* - ${conditional} → not supported yet (requires runtime eval)
|
|
11
|
+
*/
|
|
12
|
+
import { Plugin, createSuccessResult, createErrorResult } from '../Plugin.js';
|
|
13
|
+
import { parse } from '@babel/parser';
|
|
14
|
+
import _traverse from '@babel/traverse';
|
|
15
|
+
import { readFileSync } from 'fs';
|
|
16
|
+
// ES module compatibility - handle default export
|
|
17
|
+
const traverseFn = _traverse.default || _traverse;
|
|
18
|
+
const traverse = traverseFn;
|
|
19
|
+
export class PrefixEvaluator extends Plugin {
|
|
20
|
+
get metadata() {
|
|
21
|
+
return {
|
|
22
|
+
name: 'PrefixEvaluator',
|
|
23
|
+
phase: 'ENRICHMENT',
|
|
24
|
+
priority: 80, // After MountPointResolver (90)
|
|
25
|
+
creates: {
|
|
26
|
+
nodes: [],
|
|
27
|
+
edges: []
|
|
28
|
+
},
|
|
29
|
+
dependencies: ['JSModuleIndexer', 'JSASTAnalyzer', 'MountPointResolver']
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
async execute(context) {
|
|
33
|
+
try {
|
|
34
|
+
const { graph } = context;
|
|
35
|
+
const graphTyped = graph;
|
|
36
|
+
let mountPointsEvaluated = 0;
|
|
37
|
+
let successfulEvaluations = 0;
|
|
38
|
+
// Find all MOUNT_POINT nodes with placeholder prefixes
|
|
39
|
+
const mountPoints = [];
|
|
40
|
+
if (graphTyped.nodes) {
|
|
41
|
+
const allNodes = await graphTyped.nodes.values();
|
|
42
|
+
for (const node of allNodes) {
|
|
43
|
+
// Cast through unknown since node types vary
|
|
44
|
+
const typedNode = node;
|
|
45
|
+
if (typedNode.type === 'MOUNT_POINT' && typedNode.prefix && typedNode.prefix.startsWith('${')) {
|
|
46
|
+
mountPoints.push(typedNode);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
console.log(`[PrefixEvaluator] Found ${mountPoints.length} mount points with placeholders`);
|
|
51
|
+
// For each mount point try to evaluate prefix
|
|
52
|
+
for (const mountPoint of mountPoints) {
|
|
53
|
+
mountPointsEvaluated++;
|
|
54
|
+
// Find MODULE that defines this mount point
|
|
55
|
+
const definesEdges = this.findEdges(graphTyped, {
|
|
56
|
+
type: 'DEFINES',
|
|
57
|
+
dst: mountPoint.id
|
|
58
|
+
});
|
|
59
|
+
if (definesEdges.length === 0) {
|
|
60
|
+
console.log(`[PrefixEvaluator] No DEFINES edge for mount point ${mountPoint.id}`);
|
|
61
|
+
continue;
|
|
62
|
+
}
|
|
63
|
+
const moduleId = definesEdges[0].fromId;
|
|
64
|
+
const module = graphTyped.nodes.get(moduleId);
|
|
65
|
+
if (!module || module.type !== 'MODULE') {
|
|
66
|
+
console.log(`[PrefixEvaluator] Module not found for ${mountPoint.id}`);
|
|
67
|
+
continue;
|
|
68
|
+
}
|
|
69
|
+
// Parse module AST
|
|
70
|
+
let ast;
|
|
71
|
+
try {
|
|
72
|
+
const code = readFileSync(module.file, 'utf-8');
|
|
73
|
+
ast = parse(code, {
|
|
74
|
+
sourceType: 'module',
|
|
75
|
+
plugins: ['jsx', 'typescript']
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
catch (error) {
|
|
79
|
+
const err = error;
|
|
80
|
+
console.log(`[PrefixEvaluator] Failed to parse ${module.file}:`, err.message);
|
|
81
|
+
continue;
|
|
82
|
+
}
|
|
83
|
+
// Try to evaluate prefix based on placeholder type
|
|
84
|
+
const evaluatedPrefix = await this.evaluatePrefix(mountPoint.prefix, mountPoint.line, ast, module);
|
|
85
|
+
if (evaluatedPrefix && evaluatedPrefix !== mountPoint.prefix) {
|
|
86
|
+
mountPoint.prefix = evaluatedPrefix;
|
|
87
|
+
mountPoint.evaluated = true;
|
|
88
|
+
successfulEvaluations++;
|
|
89
|
+
console.log(`[PrefixEvaluator] Resolved ${mountPoint.file}:${mountPoint.line}: ${evaluatedPrefix}`);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
console.log(`[PrefixEvaluator] Evaluated ${successfulEvaluations}/${mountPointsEvaluated} mount points`);
|
|
93
|
+
return createSuccessResult({ nodes: 0, edges: 0 }, { mountPointsEvaluated, successfulEvaluations });
|
|
94
|
+
}
|
|
95
|
+
catch (error) {
|
|
96
|
+
console.error(`[PrefixEvaluator] Error:`, error);
|
|
97
|
+
return createErrorResult(error);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Evaluate prefix based on placeholder type
|
|
102
|
+
*/
|
|
103
|
+
async evaluatePrefix(placeholder, line, ast, _module) {
|
|
104
|
+
if (placeholder === '${variable}') {
|
|
105
|
+
return this.evaluateVariable(line, ast);
|
|
106
|
+
}
|
|
107
|
+
else if (placeholder === '${binary}') {
|
|
108
|
+
return this.evaluateBinary(line, ast);
|
|
109
|
+
}
|
|
110
|
+
else if (placeholder === '${template}') {
|
|
111
|
+
return this.evaluateTemplate(line, ast);
|
|
112
|
+
}
|
|
113
|
+
else if (placeholder === '${member}') {
|
|
114
|
+
return this.evaluateMember(line, ast);
|
|
115
|
+
}
|
|
116
|
+
// ${call}, ${conditional} - not supported yet
|
|
117
|
+
return null;
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Resolve ${variable} - find VariableDeclaration
|
|
121
|
+
*/
|
|
122
|
+
evaluateVariable(line, ast) {
|
|
123
|
+
let variableName = null;
|
|
124
|
+
let variableValue = null;
|
|
125
|
+
// First find app.use() on the target line and get variable name
|
|
126
|
+
traverse(ast, {
|
|
127
|
+
CallExpression: (path) => {
|
|
128
|
+
const node = path.node;
|
|
129
|
+
if (node.loc?.start.line === line) {
|
|
130
|
+
// Check if this is app.use() or router.use()
|
|
131
|
+
if (node.callee.type === 'MemberExpression' &&
|
|
132
|
+
node.callee.property.name === 'use' &&
|
|
133
|
+
node.arguments.length >= 2) {
|
|
134
|
+
const firstArg = node.arguments[0];
|
|
135
|
+
if (firstArg.type === 'Identifier') {
|
|
136
|
+
variableName = firstArg.name;
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
});
|
|
142
|
+
if (!variableName) {
|
|
143
|
+
return null;
|
|
144
|
+
}
|
|
145
|
+
// Now find declaration of this variable
|
|
146
|
+
const targetName = variableName;
|
|
147
|
+
traverse(ast, {
|
|
148
|
+
VariableDeclarator: (path) => {
|
|
149
|
+
const node = path.node;
|
|
150
|
+
if (node.id.type === 'Identifier' && node.id.name === targetName) {
|
|
151
|
+
if (node.init && node.init.type === 'StringLiteral') {
|
|
152
|
+
variableValue = node.init.value;
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
});
|
|
157
|
+
return variableValue;
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* Resolve ${binary} - BinaryExpression (a + b)
|
|
161
|
+
*/
|
|
162
|
+
evaluateBinary(line, ast) {
|
|
163
|
+
let binaryExpression = null;
|
|
164
|
+
// Find app.use() on target line and get BinaryExpression
|
|
165
|
+
traverse(ast, {
|
|
166
|
+
CallExpression: (path) => {
|
|
167
|
+
const node = path.node;
|
|
168
|
+
if (node.loc?.start.line === line) {
|
|
169
|
+
if (node.callee.type === 'MemberExpression' &&
|
|
170
|
+
node.callee.property.name === 'use' &&
|
|
171
|
+
node.arguments.length >= 2) {
|
|
172
|
+
const firstArg = node.arguments[0];
|
|
173
|
+
if (firstArg.type === 'BinaryExpression') {
|
|
174
|
+
binaryExpression = firstArg;
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
});
|
|
180
|
+
if (!binaryExpression) {
|
|
181
|
+
return null;
|
|
182
|
+
}
|
|
183
|
+
// Cast to help TypeScript understand the narrowing after closure mutation
|
|
184
|
+
const expr = binaryExpression;
|
|
185
|
+
// Recursively resolve both sides of Binary Expression
|
|
186
|
+
const left = this.resolveExpression(expr.left, ast);
|
|
187
|
+
const right = this.resolveExpression(expr.right, ast);
|
|
188
|
+
if (left && right && expr.operator === '+') {
|
|
189
|
+
return left + right;
|
|
190
|
+
}
|
|
191
|
+
return null;
|
|
192
|
+
}
|
|
193
|
+
/**
|
|
194
|
+
* Recursively resolve arbitrary expression
|
|
195
|
+
*/
|
|
196
|
+
resolveExpression(node, ast) {
|
|
197
|
+
if (node.type === 'StringLiteral') {
|
|
198
|
+
return node.value;
|
|
199
|
+
}
|
|
200
|
+
else if (node.type === 'Identifier') {
|
|
201
|
+
// Find variable declaration
|
|
202
|
+
let value = null;
|
|
203
|
+
const targetName = node.name;
|
|
204
|
+
traverse(ast, {
|
|
205
|
+
VariableDeclarator: (path) => {
|
|
206
|
+
if (path.node.id.type === 'Identifier' &&
|
|
207
|
+
path.node.id.name === targetName &&
|
|
208
|
+
path.node.init &&
|
|
209
|
+
path.node.init.type === 'StringLiteral') {
|
|
210
|
+
value = path.node.init.value;
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
});
|
|
214
|
+
return value;
|
|
215
|
+
}
|
|
216
|
+
else if (node.type === 'BinaryExpression') {
|
|
217
|
+
const binaryNode = node;
|
|
218
|
+
const left = this.resolveExpression(binaryNode.left, ast);
|
|
219
|
+
const right = this.resolveExpression(binaryNode.right, ast);
|
|
220
|
+
if (left && right && binaryNode.operator === '+') {
|
|
221
|
+
return left + right;
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
else if (node.type === 'MemberExpression') {
|
|
225
|
+
// Resolve MemberExpression (for TemplateLiteral with objects)
|
|
226
|
+
return this.resolveMemberExpression(node, ast);
|
|
227
|
+
}
|
|
228
|
+
return null;
|
|
229
|
+
}
|
|
230
|
+
/**
|
|
231
|
+
* Resolve ${template} - TemplateLiteral with variables
|
|
232
|
+
*/
|
|
233
|
+
evaluateTemplate(line, ast) {
|
|
234
|
+
let templateLiteral = null;
|
|
235
|
+
// Find app.use() and TemplateLiteral
|
|
236
|
+
traverse(ast, {
|
|
237
|
+
CallExpression: (path) => {
|
|
238
|
+
const node = path.node;
|
|
239
|
+
if (node.loc?.start.line === line) {
|
|
240
|
+
if (node.callee.type === 'MemberExpression' &&
|
|
241
|
+
node.callee.property.name === 'use' &&
|
|
242
|
+
node.arguments.length >= 2) {
|
|
243
|
+
const firstArg = node.arguments[0];
|
|
244
|
+
if (firstArg.type === 'TemplateLiteral') {
|
|
245
|
+
templateLiteral = firstArg;
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
});
|
|
251
|
+
if (!templateLiteral) {
|
|
252
|
+
return null;
|
|
253
|
+
}
|
|
254
|
+
// Cast to help TypeScript understand the narrowing after closure mutation
|
|
255
|
+
const tmpl = templateLiteral;
|
|
256
|
+
// Assemble string from quasis and expressions
|
|
257
|
+
let result = '';
|
|
258
|
+
for (let i = 0; i < tmpl.quasis.length; i++) {
|
|
259
|
+
result += tmpl.quasis[i].value.raw;
|
|
260
|
+
if (i < tmpl.expressions.length) {
|
|
261
|
+
const expr = tmpl.expressions[i];
|
|
262
|
+
const resolvedValue = this.resolveExpression(expr, ast);
|
|
263
|
+
if (resolvedValue === null) {
|
|
264
|
+
return null; // Couldn't resolve expression
|
|
265
|
+
}
|
|
266
|
+
result += resolvedValue;
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
return result;
|
|
270
|
+
}
|
|
271
|
+
/**
|
|
272
|
+
* Resolve ${member} - MemberExpression (config.apiPrefix)
|
|
273
|
+
*/
|
|
274
|
+
evaluateMember(line, ast) {
|
|
275
|
+
let memberExpression = null;
|
|
276
|
+
// Find app.use() and MemberExpression
|
|
277
|
+
traverse(ast, {
|
|
278
|
+
CallExpression: (path) => {
|
|
279
|
+
const node = path.node;
|
|
280
|
+
if (node.loc?.start.line === line) {
|
|
281
|
+
if (node.callee.type === 'MemberExpression' &&
|
|
282
|
+
node.callee.property.name === 'use' &&
|
|
283
|
+
node.arguments.length >= 2) {
|
|
284
|
+
const firstArg = node.arguments[0];
|
|
285
|
+
if (firstArg.type === 'MemberExpression') {
|
|
286
|
+
memberExpression = firstArg;
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
});
|
|
292
|
+
if (!memberExpression) {
|
|
293
|
+
return null;
|
|
294
|
+
}
|
|
295
|
+
// Resolve MemberExpression (can be nested: config.nested.path)
|
|
296
|
+
return this.resolveMemberExpression(memberExpression, ast);
|
|
297
|
+
}
|
|
298
|
+
/**
|
|
299
|
+
* Recursively resolve MemberExpression
|
|
300
|
+
*/
|
|
301
|
+
resolveMemberExpression(node, ast) {
|
|
302
|
+
if (node.type !== 'MemberExpression') {
|
|
303
|
+
return null;
|
|
304
|
+
}
|
|
305
|
+
// Get path to property: config.nested.path → ['config', 'nested', 'path']
|
|
306
|
+
const path = [];
|
|
307
|
+
let current = node;
|
|
308
|
+
while (current.type === 'MemberExpression') {
|
|
309
|
+
const memberNode = current;
|
|
310
|
+
if (memberNode.property.type === 'Identifier') {
|
|
311
|
+
path.unshift(memberNode.property.name);
|
|
312
|
+
}
|
|
313
|
+
else if (memberNode.property.type === 'NumericLiteral') {
|
|
314
|
+
// Array access: arr[0]
|
|
315
|
+
path.unshift(memberNode.property.value);
|
|
316
|
+
}
|
|
317
|
+
current = memberNode.object;
|
|
318
|
+
}
|
|
319
|
+
if (current.type === 'Identifier') {
|
|
320
|
+
path.unshift(current.name);
|
|
321
|
+
}
|
|
322
|
+
else {
|
|
323
|
+
return null;
|
|
324
|
+
}
|
|
325
|
+
// Now resolve via AST
|
|
326
|
+
// Find object declaration
|
|
327
|
+
const rootName = path[0];
|
|
328
|
+
let objectValue = null;
|
|
329
|
+
traverse(ast, {
|
|
330
|
+
VariableDeclarator: (varPath) => {
|
|
331
|
+
if (varPath.node.id.type === 'Identifier' &&
|
|
332
|
+
varPath.node.id.name === rootName &&
|
|
333
|
+
varPath.node.init &&
|
|
334
|
+
varPath.node.init.type === 'ObjectExpression') {
|
|
335
|
+
objectValue = this.evaluateObjectExpression(varPath.node.init);
|
|
336
|
+
}
|
|
337
|
+
else if (varPath.node.id.type === 'Identifier' &&
|
|
338
|
+
varPath.node.id.name === rootName &&
|
|
339
|
+
varPath.node.init &&
|
|
340
|
+
varPath.node.init.type === 'ArrayExpression') {
|
|
341
|
+
objectValue = this.evaluateArrayExpression(varPath.node.init);
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
});
|
|
345
|
+
if (!objectValue) {
|
|
346
|
+
return null;
|
|
347
|
+
}
|
|
348
|
+
// Walk through path and get value
|
|
349
|
+
let result = objectValue;
|
|
350
|
+
for (let i = 1; i < path.length; i++) {
|
|
351
|
+
const key = path[i];
|
|
352
|
+
if (result && typeof result === 'object' && key in result) {
|
|
353
|
+
result = result[key];
|
|
354
|
+
}
|
|
355
|
+
else {
|
|
356
|
+
return null;
|
|
357
|
+
}
|
|
358
|
+
}
|
|
359
|
+
return typeof result === 'string' ? result : null;
|
|
360
|
+
}
|
|
361
|
+
/**
|
|
362
|
+
* Evaluate ObjectExpression to plain JS object
|
|
363
|
+
*/
|
|
364
|
+
evaluateObjectExpression(node) {
|
|
365
|
+
const obj = {};
|
|
366
|
+
for (const prop of node.properties) {
|
|
367
|
+
if (prop.type === 'ObjectProperty') {
|
|
368
|
+
const objProp = prop;
|
|
369
|
+
if (objProp.key.type === 'Identifier') {
|
|
370
|
+
const key = objProp.key.name;
|
|
371
|
+
if (objProp.value.type === 'StringLiteral') {
|
|
372
|
+
obj[key] = objProp.value.value;
|
|
373
|
+
}
|
|
374
|
+
else if (objProp.value.type === 'ObjectExpression') {
|
|
375
|
+
obj[key] = this.evaluateObjectExpression(objProp.value);
|
|
376
|
+
}
|
|
377
|
+
}
|
|
378
|
+
}
|
|
379
|
+
}
|
|
380
|
+
return obj;
|
|
381
|
+
}
|
|
382
|
+
/**
|
|
383
|
+
* Evaluate ArrayExpression to plain JS array
|
|
384
|
+
*/
|
|
385
|
+
evaluateArrayExpression(node) {
|
|
386
|
+
const arr = [];
|
|
387
|
+
for (const element of node.elements) {
|
|
388
|
+
if (element && element.type === 'StringLiteral') {
|
|
389
|
+
arr.push(element.value);
|
|
390
|
+
}
|
|
391
|
+
}
|
|
392
|
+
return arr;
|
|
393
|
+
}
|
|
394
|
+
/**
|
|
395
|
+
* Helper method for finding edges
|
|
396
|
+
*/
|
|
397
|
+
findEdges(graph, criteria) {
|
|
398
|
+
const result = [];
|
|
399
|
+
if (!graph.edges)
|
|
400
|
+
return result;
|
|
401
|
+
for (const edge of graph.edges.values()) {
|
|
402
|
+
let matches = true;
|
|
403
|
+
for (const [key, value] of Object.entries(criteria)) {
|
|
404
|
+
if (edge[key] !== value) {
|
|
405
|
+
matches = false;
|
|
406
|
+
break;
|
|
407
|
+
}
|
|
408
|
+
}
|
|
409
|
+
if (matches) {
|
|
410
|
+
result.push(edge);
|
|
411
|
+
}
|
|
412
|
+
}
|
|
413
|
+
return result;
|
|
414
|
+
}
|
|
415
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* RustFFIEnricher - links JavaScript CALL nodes to Rust NAPI functions
|
|
3
|
+
* Creates FFI_CALLS edges between JS calls and their Rust implementations
|
|
4
|
+
*/
|
|
5
|
+
import { Plugin } from '../Plugin.js';
|
|
6
|
+
import type { PluginContext, PluginResult, PluginMetadata } from '../Plugin.js';
|
|
7
|
+
export declare class RustFFIEnricher extends Plugin {
|
|
8
|
+
get metadata(): PluginMetadata;
|
|
9
|
+
execute(context: PluginContext): Promise<PluginResult>;
|
|
10
|
+
private buildNapiIndex;
|
|
11
|
+
private findRustCallingJsCalls;
|
|
12
|
+
private matchJsCallToRust;
|
|
13
|
+
/**
|
|
14
|
+
* Convert Rust snake_case to JavaScript camelCase
|
|
15
|
+
* add_nodes -> addNodes
|
|
16
|
+
* compute_node_id_js -> computeNodeIdJs
|
|
17
|
+
*/
|
|
18
|
+
private rustNameToJs;
|
|
19
|
+
/**
|
|
20
|
+
* Convert JavaScript camelCase to Rust snake_case
|
|
21
|
+
* addNodes -> add_nodes
|
|
22
|
+
*/
|
|
23
|
+
private jsNameToRust;
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=RustFFIEnricher.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RustFFIEnricher.d.ts","sourceRoot":"","sources":["../../../src/plugins/enrichment/RustFFIEnricher.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,MAAM,EAAuB,MAAM,cAAc,CAAC;AAC3D,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAoBhF,qBAAa,eAAgB,SAAQ,MAAM;IACzC,IAAI,QAAQ,IAAI,cAAc,CAW7B;IAEK,OAAO,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,YAAY,CAAC;YA+C9C,cAAc;YAiCd,sBAAsB;IAuCpC,OAAO,CAAC,iBAAiB;IAyCzB;;;;OAIG;IACH,OAAO,CAAC,YAAY;IAIpB;;;OAGG;IACH,OAAO,CAAC,YAAY;CAIrB"}
|
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* RustFFIEnricher - links JavaScript CALL nodes to Rust NAPI functions
|
|
3
|
+
* Creates FFI_CALLS edges between JS calls and their Rust implementations
|
|
4
|
+
*/
|
|
5
|
+
import { Plugin, createSuccessResult } from '../Plugin.js';
|
|
6
|
+
export class RustFFIEnricher extends Plugin {
|
|
7
|
+
get metadata() {
|
|
8
|
+
return {
|
|
9
|
+
name: 'RustFFIEnricher',
|
|
10
|
+
phase: 'ENRICHMENT',
|
|
11
|
+
priority: 45, // After MethodCallResolver (50)
|
|
12
|
+
creates: {
|
|
13
|
+
nodes: [],
|
|
14
|
+
edges: ['FFI_CALLS']
|
|
15
|
+
},
|
|
16
|
+
dependencies: ['RustAnalyzer', 'MethodCallResolver']
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
async execute(context) {
|
|
20
|
+
const { graph } = context;
|
|
21
|
+
// 1. Build index of NAPI-exported Rust functions/methods
|
|
22
|
+
const napiIndex = await this.buildNapiIndex(graph);
|
|
23
|
+
if (napiIndex.size === 0) {
|
|
24
|
+
console.log('[RustFFIEnricher] No NAPI exports found, skipping');
|
|
25
|
+
return createSuccessResult({ nodes: 0, edges: 0 }, { skipped: true, reason: 'No NAPI exports' });
|
|
26
|
+
}
|
|
27
|
+
console.log(`[RustFFIEnricher] Indexed ${napiIndex.size} NAPI exports`);
|
|
28
|
+
// 2. Find JS CALL nodes that target Rust
|
|
29
|
+
const jsCalls = await this.findRustCallingJsCalls(graph);
|
|
30
|
+
console.log(`[RustFFIEnricher] Found ${jsCalls.length} candidate JS calls`);
|
|
31
|
+
// 3. Match and create FFI_CALLS edges
|
|
32
|
+
let edgesCreated = 0;
|
|
33
|
+
const unmatched = [];
|
|
34
|
+
for (const call of jsCalls) {
|
|
35
|
+
const rustTarget = this.matchJsCallToRust(call, napiIndex);
|
|
36
|
+
if (rustTarget) {
|
|
37
|
+
await graph.addEdge({
|
|
38
|
+
src: call.id,
|
|
39
|
+
dst: rustTarget.id,
|
|
40
|
+
type: 'FFI_CALLS'
|
|
41
|
+
});
|
|
42
|
+
edgesCreated++;
|
|
43
|
+
}
|
|
44
|
+
else {
|
|
45
|
+
const callName = `${call.object || ''}.${call.method || call.name}`;
|
|
46
|
+
if (callName && !unmatched.includes(callName)) {
|
|
47
|
+
unmatched.push(callName);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
if (unmatched.length > 0 && unmatched.length <= 20) {
|
|
52
|
+
console.log(`[RustFFIEnricher] Unmatched calls:`, unmatched.slice(0, 10));
|
|
53
|
+
}
|
|
54
|
+
console.log(`[RustFFIEnricher] Created ${edgesCreated} FFI_CALLS edges`);
|
|
55
|
+
return createSuccessResult({ nodes: 0, edges: edgesCreated }, { unmatched: unmatched.length });
|
|
56
|
+
}
|
|
57
|
+
async buildNapiIndex(graph) {
|
|
58
|
+
const index = new Map();
|
|
59
|
+
// Index RUST_FUNCTION with napi=true
|
|
60
|
+
for await (const node of graph.queryNodes({ nodeType: 'RUST_FUNCTION' })) {
|
|
61
|
+
const rustNode = node;
|
|
62
|
+
if (rustNode.napi) {
|
|
63
|
+
const jsName = rustNode.napiJsName || this.rustNameToJs(rustNode.name);
|
|
64
|
+
index.set(jsName, rustNode);
|
|
65
|
+
// Also store with Rust name for direct matches
|
|
66
|
+
index.set(rustNode.name, rustNode);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
// Index RUST_METHOD with napi=true
|
|
70
|
+
for await (const node of graph.queryNodes({ nodeType: 'RUST_METHOD' })) {
|
|
71
|
+
const rustNode = node;
|
|
72
|
+
if (rustNode.napi) {
|
|
73
|
+
const jsName = rustNode.napiJsName || this.rustNameToJs(rustNode.name);
|
|
74
|
+
// Methods are called as object.method() in JS
|
|
75
|
+
// Use implType to determine the class name
|
|
76
|
+
if (rustNode.implType) {
|
|
77
|
+
// GraphEngine.addNodes -> maps to GraphEngine::add_nodes
|
|
78
|
+
index.set(`${rustNode.implType}.${jsName}`, rustNode);
|
|
79
|
+
// Also store just method name for loose matching
|
|
80
|
+
index.set(jsName, rustNode);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
return index;
|
|
85
|
+
}
|
|
86
|
+
async findRustCallingJsCalls(graph) {
|
|
87
|
+
const candidates = [];
|
|
88
|
+
const seen = new Set();
|
|
89
|
+
for await (const call of graph.queryNodes({ nodeType: 'CALL' })) {
|
|
90
|
+
const callNode = call;
|
|
91
|
+
// Skip duplicates
|
|
92
|
+
if (seen.has(callNode.id))
|
|
93
|
+
continue;
|
|
94
|
+
seen.add(callNode.id);
|
|
95
|
+
// Look for calls on objects that are likely Rust bindings:
|
|
96
|
+
// - engine.addNodes(), graph.bfs()
|
|
97
|
+
// - Direct function calls: computeNodeIdJs()
|
|
98
|
+
// - Method calls on GraphEngine instances
|
|
99
|
+
if (callNode.object === 'engine' ||
|
|
100
|
+
callNode.object === 'graph' ||
|
|
101
|
+
callNode.object === 'this.engine' ||
|
|
102
|
+
callNode.object === 'this.graph' ||
|
|
103
|
+
callNode.object === 'nativeBinding' ||
|
|
104
|
+
(callNode.name && callNode.name.startsWith('compute'))) {
|
|
105
|
+
candidates.push(callNode);
|
|
106
|
+
continue;
|
|
107
|
+
}
|
|
108
|
+
// Check if method name matches known NAPI pattern
|
|
109
|
+
if (callNode.method) {
|
|
110
|
+
const snakeName = this.jsNameToRust(callNode.method);
|
|
111
|
+
// Common NAPI patterns: add_*, get_*, set_*, query_*, etc.
|
|
112
|
+
if (snakeName && /^(add|get|set|query|compute|find|run|create|delete|update|list|check|flush|load|save|bfs|dfs)_/.test(snakeName)) {
|
|
113
|
+
candidates.push(callNode);
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
return candidates;
|
|
118
|
+
}
|
|
119
|
+
matchJsCallToRust(call, napiIndex) {
|
|
120
|
+
// Try multiple matching strategies
|
|
121
|
+
// 1. Direct method match: object.method -> Class.method
|
|
122
|
+
if (call.method) {
|
|
123
|
+
// Try exact match with class name (GraphEngine.method)
|
|
124
|
+
for (const [key, node] of napiIndex) {
|
|
125
|
+
if (key.endsWith(`.${call.method}`)) {
|
|
126
|
+
return node;
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
// Try just method name
|
|
130
|
+
if (napiIndex.has(call.method)) {
|
|
131
|
+
return napiIndex.get(call.method);
|
|
132
|
+
}
|
|
133
|
+
// Try snake_case version
|
|
134
|
+
const snakeName = this.jsNameToRust(call.method);
|
|
135
|
+
if (snakeName && napiIndex.has(snakeName)) {
|
|
136
|
+
return napiIndex.get(snakeName);
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
// 2. Direct function call match
|
|
140
|
+
if (call.name) {
|
|
141
|
+
const callName = call.name;
|
|
142
|
+
if (napiIndex.has(callName)) {
|
|
143
|
+
return napiIndex.get(callName);
|
|
144
|
+
}
|
|
145
|
+
// Try snake_case version
|
|
146
|
+
const snakeName = this.jsNameToRust(callName);
|
|
147
|
+
if (snakeName && napiIndex.has(snakeName)) {
|
|
148
|
+
return napiIndex.get(snakeName);
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
return null;
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* Convert Rust snake_case to JavaScript camelCase
|
|
155
|
+
* add_nodes -> addNodes
|
|
156
|
+
* compute_node_id_js -> computeNodeIdJs
|
|
157
|
+
*/
|
|
158
|
+
rustNameToJs(rustName) {
|
|
159
|
+
return rustName.replace(/_([a-z])/g, (_, c) => c.toUpperCase());
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* Convert JavaScript camelCase to Rust snake_case
|
|
163
|
+
* addNodes -> add_nodes
|
|
164
|
+
*/
|
|
165
|
+
jsNameToRust(jsName) {
|
|
166
|
+
if (!jsName)
|
|
167
|
+
return null;
|
|
168
|
+
return jsName.replace(/([A-Z])/g, '_$1').toLowerCase().replace(/^_/, '');
|
|
169
|
+
}
|
|
170
|
+
}
|