@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,527 @@
|
|
|
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
|
+
|
|
13
|
+
import { Plugin, createSuccessResult, createErrorResult } from '../Plugin.js';
|
|
14
|
+
import type { PluginMetadata, PluginContext, PluginResult } from '../Plugin.js';
|
|
15
|
+
import { parse } from '@babel/parser';
|
|
16
|
+
import type { ParseResult, ParserPlugin } from '@babel/parser';
|
|
17
|
+
import _traverse from '@babel/traverse';
|
|
18
|
+
import type {
|
|
19
|
+
File,
|
|
20
|
+
Node,
|
|
21
|
+
CallExpression,
|
|
22
|
+
MemberExpression,
|
|
23
|
+
BinaryExpression,
|
|
24
|
+
TemplateLiteral,
|
|
25
|
+
Identifier,
|
|
26
|
+
StringLiteral,
|
|
27
|
+
ObjectExpression,
|
|
28
|
+
ObjectProperty,
|
|
29
|
+
ArrayExpression,
|
|
30
|
+
VariableDeclarator,
|
|
31
|
+
NumericLiteral
|
|
32
|
+
} from '@babel/types';
|
|
33
|
+
import type { NodePath } from '@babel/traverse';
|
|
34
|
+
import { readFileSync } from 'fs';
|
|
35
|
+
import type { NodeRecord } from '@grafema/types';
|
|
36
|
+
|
|
37
|
+
// ES module compatibility - handle default export
|
|
38
|
+
const traverseFn = (_traverse as unknown as { default: typeof _traverse }).default || _traverse;
|
|
39
|
+
const traverse = traverseFn as unknown as (
|
|
40
|
+
ast: Node | null | undefined,
|
|
41
|
+
opts: Record<string, unknown>
|
|
42
|
+
) => void;
|
|
43
|
+
|
|
44
|
+
interface MountPointNode {
|
|
45
|
+
id: string;
|
|
46
|
+
type: 'MOUNT_POINT';
|
|
47
|
+
name: string;
|
|
48
|
+
file: string;
|
|
49
|
+
line: number;
|
|
50
|
+
prefix: string;
|
|
51
|
+
evaluated?: boolean;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
interface ModuleNode {
|
|
55
|
+
id: string;
|
|
56
|
+
type: 'MODULE';
|
|
57
|
+
name: string;
|
|
58
|
+
file: string;
|
|
59
|
+
line: number;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
interface Edge {
|
|
63
|
+
type: string;
|
|
64
|
+
fromId: string;
|
|
65
|
+
dst: string;
|
|
66
|
+
[key: string]: unknown;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
interface EdgeCriteria {
|
|
70
|
+
type?: string;
|
|
71
|
+
dst?: string;
|
|
72
|
+
[key: string]: unknown;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
interface Graph {
|
|
76
|
+
nodes: Map<string, NodeRecord> | { get(id: string): NodeRecord | undefined; values(): Iterable<NodeRecord> };
|
|
77
|
+
edges: Map<string, Edge> | { values(): Iterable<Edge> };
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
export class PrefixEvaluator extends Plugin {
|
|
81
|
+
get metadata(): PluginMetadata {
|
|
82
|
+
return {
|
|
83
|
+
name: 'PrefixEvaluator',
|
|
84
|
+
phase: 'ENRICHMENT',
|
|
85
|
+
priority: 80, // After MountPointResolver (90)
|
|
86
|
+
creates: {
|
|
87
|
+
nodes: [],
|
|
88
|
+
edges: []
|
|
89
|
+
},
|
|
90
|
+
dependencies: ['JSModuleIndexer', 'JSASTAnalyzer', 'MountPointResolver']
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
async execute(context: PluginContext): Promise<PluginResult> {
|
|
95
|
+
try {
|
|
96
|
+
const { graph } = context;
|
|
97
|
+
const graphTyped = graph as unknown as Graph;
|
|
98
|
+
|
|
99
|
+
let mountPointsEvaluated = 0;
|
|
100
|
+
let successfulEvaluations = 0;
|
|
101
|
+
|
|
102
|
+
// Find all MOUNT_POINT nodes with placeholder prefixes
|
|
103
|
+
const mountPoints: MountPointNode[] = [];
|
|
104
|
+
if (graphTyped.nodes) {
|
|
105
|
+
const allNodes = await (graphTyped.nodes as Map<string, NodeRecord>).values();
|
|
106
|
+
for (const node of allNodes) {
|
|
107
|
+
// Cast through unknown since node types vary
|
|
108
|
+
const typedNode = node as unknown as MountPointNode;
|
|
109
|
+
if (typedNode.type === 'MOUNT_POINT' && typedNode.prefix && typedNode.prefix.startsWith('${')) {
|
|
110
|
+
mountPoints.push(typedNode);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
console.log(`[PrefixEvaluator] Found ${mountPoints.length} mount points with placeholders`);
|
|
116
|
+
|
|
117
|
+
// For each mount point try to evaluate prefix
|
|
118
|
+
for (const mountPoint of mountPoints) {
|
|
119
|
+
mountPointsEvaluated++;
|
|
120
|
+
|
|
121
|
+
// Find MODULE that defines this mount point
|
|
122
|
+
const definesEdges = this.findEdges(graphTyped, {
|
|
123
|
+
type: 'DEFINES',
|
|
124
|
+
dst: mountPoint.id
|
|
125
|
+
});
|
|
126
|
+
|
|
127
|
+
if (definesEdges.length === 0) {
|
|
128
|
+
console.log(`[PrefixEvaluator] No DEFINES edge for mount point ${mountPoint.id}`);
|
|
129
|
+
continue;
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
const moduleId = definesEdges[0].fromId;
|
|
133
|
+
const module = (graphTyped.nodes as Map<string, NodeRecord>).get(moduleId) as ModuleNode | undefined;
|
|
134
|
+
|
|
135
|
+
if (!module || module.type !== 'MODULE') {
|
|
136
|
+
console.log(`[PrefixEvaluator] Module not found for ${mountPoint.id}`);
|
|
137
|
+
continue;
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
// Parse module AST
|
|
141
|
+
let ast: ParseResult<File>;
|
|
142
|
+
try {
|
|
143
|
+
const code = readFileSync(module.file, 'utf-8');
|
|
144
|
+
ast = parse(code, {
|
|
145
|
+
sourceType: 'module',
|
|
146
|
+
plugins: ['jsx', 'typescript'] as ParserPlugin[]
|
|
147
|
+
});
|
|
148
|
+
} catch (error) {
|
|
149
|
+
const err = error as Error;
|
|
150
|
+
console.log(`[PrefixEvaluator] Failed to parse ${module.file}:`, err.message);
|
|
151
|
+
continue;
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
// Try to evaluate prefix based on placeholder type
|
|
155
|
+
const evaluatedPrefix = await this.evaluatePrefix(
|
|
156
|
+
mountPoint.prefix,
|
|
157
|
+
mountPoint.line,
|
|
158
|
+
ast,
|
|
159
|
+
module
|
|
160
|
+
);
|
|
161
|
+
|
|
162
|
+
if (evaluatedPrefix && evaluatedPrefix !== mountPoint.prefix) {
|
|
163
|
+
mountPoint.prefix = evaluatedPrefix;
|
|
164
|
+
mountPoint.evaluated = true;
|
|
165
|
+
successfulEvaluations++;
|
|
166
|
+
console.log(`[PrefixEvaluator] Resolved ${mountPoint.file}:${mountPoint.line}: ${evaluatedPrefix}`);
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
console.log(`[PrefixEvaluator] Evaluated ${successfulEvaluations}/${mountPointsEvaluated} mount points`);
|
|
171
|
+
|
|
172
|
+
return createSuccessResult(
|
|
173
|
+
{ nodes: 0, edges: 0 },
|
|
174
|
+
{ mountPointsEvaluated, successfulEvaluations }
|
|
175
|
+
);
|
|
176
|
+
|
|
177
|
+
} catch (error) {
|
|
178
|
+
console.error(`[PrefixEvaluator] Error:`, error);
|
|
179
|
+
return createErrorResult(error as Error);
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
/**
|
|
184
|
+
* Evaluate prefix based on placeholder type
|
|
185
|
+
*/
|
|
186
|
+
async evaluatePrefix(
|
|
187
|
+
placeholder: string,
|
|
188
|
+
line: number,
|
|
189
|
+
ast: ParseResult<File>,
|
|
190
|
+
_module: ModuleNode
|
|
191
|
+
): Promise<string | null> {
|
|
192
|
+
if (placeholder === '${variable}') {
|
|
193
|
+
return this.evaluateVariable(line, ast);
|
|
194
|
+
} else if (placeholder === '${binary}') {
|
|
195
|
+
return this.evaluateBinary(line, ast);
|
|
196
|
+
} else if (placeholder === '${template}') {
|
|
197
|
+
return this.evaluateTemplate(line, ast);
|
|
198
|
+
} else if (placeholder === '${member}') {
|
|
199
|
+
return this.evaluateMember(line, ast);
|
|
200
|
+
}
|
|
201
|
+
// ${call}, ${conditional} - not supported yet
|
|
202
|
+
return null;
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
/**
|
|
206
|
+
* Resolve ${variable} - find VariableDeclaration
|
|
207
|
+
*/
|
|
208
|
+
evaluateVariable(line: number, ast: ParseResult<File>): string | null {
|
|
209
|
+
let variableName: string | null = null;
|
|
210
|
+
let variableValue: string | null = null;
|
|
211
|
+
|
|
212
|
+
// First find app.use() on the target line and get variable name
|
|
213
|
+
traverse(ast, {
|
|
214
|
+
CallExpression: (path: NodePath<CallExpression>) => {
|
|
215
|
+
const node = path.node;
|
|
216
|
+
if (node.loc?.start.line === line) {
|
|
217
|
+
// Check if this is app.use() or router.use()
|
|
218
|
+
if (node.callee.type === 'MemberExpression' &&
|
|
219
|
+
(node.callee.property as Identifier).name === 'use' &&
|
|
220
|
+
node.arguments.length >= 2) {
|
|
221
|
+
const firstArg = node.arguments[0];
|
|
222
|
+
if (firstArg.type === 'Identifier') {
|
|
223
|
+
variableName = firstArg.name;
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
});
|
|
229
|
+
|
|
230
|
+
if (!variableName) {
|
|
231
|
+
return null;
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
// Now find declaration of this variable
|
|
235
|
+
const targetName = variableName;
|
|
236
|
+
traverse(ast, {
|
|
237
|
+
VariableDeclarator: (path: NodePath<VariableDeclarator>) => {
|
|
238
|
+
const node = path.node;
|
|
239
|
+
if (node.id.type === 'Identifier' && node.id.name === targetName) {
|
|
240
|
+
if (node.init && node.init.type === 'StringLiteral') {
|
|
241
|
+
variableValue = (node.init as StringLiteral).value;
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
});
|
|
246
|
+
|
|
247
|
+
return variableValue;
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
/**
|
|
251
|
+
* Resolve ${binary} - BinaryExpression (a + b)
|
|
252
|
+
*/
|
|
253
|
+
evaluateBinary(line: number, ast: ParseResult<File>): string | null {
|
|
254
|
+
let binaryExpression: BinaryExpression | null = null;
|
|
255
|
+
|
|
256
|
+
// Find app.use() on target line and get BinaryExpression
|
|
257
|
+
traverse(ast, {
|
|
258
|
+
CallExpression: (path: NodePath<CallExpression>) => {
|
|
259
|
+
const node = path.node;
|
|
260
|
+
if (node.loc?.start.line === line) {
|
|
261
|
+
if (node.callee.type === 'MemberExpression' &&
|
|
262
|
+
(node.callee.property as Identifier).name === 'use' &&
|
|
263
|
+
node.arguments.length >= 2) {
|
|
264
|
+
const firstArg = node.arguments[0];
|
|
265
|
+
if (firstArg.type === 'BinaryExpression') {
|
|
266
|
+
binaryExpression = firstArg;
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
});
|
|
272
|
+
|
|
273
|
+
if (!binaryExpression) {
|
|
274
|
+
return null;
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
// Cast to help TypeScript understand the narrowing after closure mutation
|
|
278
|
+
const expr = binaryExpression as BinaryExpression;
|
|
279
|
+
|
|
280
|
+
// Recursively resolve both sides of Binary Expression
|
|
281
|
+
const left = this.resolveExpression(expr.left, ast);
|
|
282
|
+
const right = this.resolveExpression(expr.right, ast);
|
|
283
|
+
|
|
284
|
+
if (left && right && expr.operator === '+') {
|
|
285
|
+
return left + right;
|
|
286
|
+
}
|
|
287
|
+
|
|
288
|
+
return null;
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
/**
|
|
292
|
+
* Recursively resolve arbitrary expression
|
|
293
|
+
*/
|
|
294
|
+
resolveExpression(node: Node, ast: ParseResult<File>): string | null {
|
|
295
|
+
if (node.type === 'StringLiteral') {
|
|
296
|
+
return (node as StringLiteral).value;
|
|
297
|
+
} else if (node.type === 'Identifier') {
|
|
298
|
+
// Find variable declaration
|
|
299
|
+
let value: string | null = null;
|
|
300
|
+
const targetName = (node as Identifier).name;
|
|
301
|
+
traverse(ast, {
|
|
302
|
+
VariableDeclarator: (path: NodePath<VariableDeclarator>) => {
|
|
303
|
+
if (path.node.id.type === 'Identifier' &&
|
|
304
|
+
path.node.id.name === targetName &&
|
|
305
|
+
path.node.init &&
|
|
306
|
+
path.node.init.type === 'StringLiteral') {
|
|
307
|
+
value = (path.node.init as StringLiteral).value;
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
});
|
|
311
|
+
return value;
|
|
312
|
+
} else if (node.type === 'BinaryExpression') {
|
|
313
|
+
const binaryNode = node as BinaryExpression;
|
|
314
|
+
const left = this.resolveExpression(binaryNode.left, ast);
|
|
315
|
+
const right = this.resolveExpression(binaryNode.right, ast);
|
|
316
|
+
if (left && right && binaryNode.operator === '+') {
|
|
317
|
+
return left + right;
|
|
318
|
+
}
|
|
319
|
+
} else if (node.type === 'MemberExpression') {
|
|
320
|
+
// Resolve MemberExpression (for TemplateLiteral with objects)
|
|
321
|
+
return this.resolveMemberExpression(node as MemberExpression, ast);
|
|
322
|
+
}
|
|
323
|
+
return null;
|
|
324
|
+
}
|
|
325
|
+
|
|
326
|
+
/**
|
|
327
|
+
* Resolve ${template} - TemplateLiteral with variables
|
|
328
|
+
*/
|
|
329
|
+
evaluateTemplate(line: number, ast: ParseResult<File>): string | null {
|
|
330
|
+
let templateLiteral: TemplateLiteral | null = null;
|
|
331
|
+
|
|
332
|
+
// Find app.use() and TemplateLiteral
|
|
333
|
+
traverse(ast, {
|
|
334
|
+
CallExpression: (path: NodePath<CallExpression>) => {
|
|
335
|
+
const node = path.node;
|
|
336
|
+
if (node.loc?.start.line === line) {
|
|
337
|
+
if (node.callee.type === 'MemberExpression' &&
|
|
338
|
+
(node.callee.property as Identifier).name === 'use' &&
|
|
339
|
+
node.arguments.length >= 2) {
|
|
340
|
+
const firstArg = node.arguments[0];
|
|
341
|
+
if (firstArg.type === 'TemplateLiteral') {
|
|
342
|
+
templateLiteral = firstArg;
|
|
343
|
+
}
|
|
344
|
+
}
|
|
345
|
+
}
|
|
346
|
+
}
|
|
347
|
+
});
|
|
348
|
+
|
|
349
|
+
if (!templateLiteral) {
|
|
350
|
+
return null;
|
|
351
|
+
}
|
|
352
|
+
|
|
353
|
+
// Cast to help TypeScript understand the narrowing after closure mutation
|
|
354
|
+
const tmpl = templateLiteral as TemplateLiteral;
|
|
355
|
+
|
|
356
|
+
// Assemble string from quasis and expressions
|
|
357
|
+
let result = '';
|
|
358
|
+
for (let i = 0; i < tmpl.quasis.length; i++) {
|
|
359
|
+
result += tmpl.quasis[i].value.raw;
|
|
360
|
+
|
|
361
|
+
if (i < tmpl.expressions.length) {
|
|
362
|
+
const expr = tmpl.expressions[i];
|
|
363
|
+
const resolvedValue = this.resolveExpression(expr as Node, ast);
|
|
364
|
+
if (resolvedValue === null) {
|
|
365
|
+
return null; // Couldn't resolve expression
|
|
366
|
+
}
|
|
367
|
+
result += resolvedValue;
|
|
368
|
+
}
|
|
369
|
+
}
|
|
370
|
+
|
|
371
|
+
return result;
|
|
372
|
+
}
|
|
373
|
+
|
|
374
|
+
/**
|
|
375
|
+
* Resolve ${member} - MemberExpression (config.apiPrefix)
|
|
376
|
+
*/
|
|
377
|
+
evaluateMember(line: number, ast: ParseResult<File>): string | null {
|
|
378
|
+
let memberExpression: MemberExpression | null = null;
|
|
379
|
+
|
|
380
|
+
// Find app.use() and MemberExpression
|
|
381
|
+
traverse(ast, {
|
|
382
|
+
CallExpression: (path: NodePath<CallExpression>) => {
|
|
383
|
+
const node = path.node;
|
|
384
|
+
if (node.loc?.start.line === line) {
|
|
385
|
+
if (node.callee.type === 'MemberExpression' &&
|
|
386
|
+
(node.callee.property as Identifier).name === 'use' &&
|
|
387
|
+
node.arguments.length >= 2) {
|
|
388
|
+
const firstArg = node.arguments[0];
|
|
389
|
+
if (firstArg.type === 'MemberExpression') {
|
|
390
|
+
memberExpression = firstArg;
|
|
391
|
+
}
|
|
392
|
+
}
|
|
393
|
+
}
|
|
394
|
+
}
|
|
395
|
+
});
|
|
396
|
+
|
|
397
|
+
if (!memberExpression) {
|
|
398
|
+
return null;
|
|
399
|
+
}
|
|
400
|
+
|
|
401
|
+
// Resolve MemberExpression (can be nested: config.nested.path)
|
|
402
|
+
return this.resolveMemberExpression(memberExpression, ast);
|
|
403
|
+
}
|
|
404
|
+
|
|
405
|
+
/**
|
|
406
|
+
* Recursively resolve MemberExpression
|
|
407
|
+
*/
|
|
408
|
+
resolveMemberExpression(node: MemberExpression, ast: ParseResult<File>): string | null {
|
|
409
|
+
if (node.type !== 'MemberExpression') {
|
|
410
|
+
return null;
|
|
411
|
+
}
|
|
412
|
+
|
|
413
|
+
// Get path to property: config.nested.path → ['config', 'nested', 'path']
|
|
414
|
+
const path: (string | number)[] = [];
|
|
415
|
+
let current: Node = node;
|
|
416
|
+
while (current.type === 'MemberExpression') {
|
|
417
|
+
const memberNode = current as MemberExpression;
|
|
418
|
+
if (memberNode.property.type === 'Identifier') {
|
|
419
|
+
path.unshift((memberNode.property as Identifier).name);
|
|
420
|
+
} else if (memberNode.property.type === 'NumericLiteral') {
|
|
421
|
+
// Array access: arr[0]
|
|
422
|
+
path.unshift((memberNode.property as NumericLiteral).value);
|
|
423
|
+
}
|
|
424
|
+
current = memberNode.object;
|
|
425
|
+
}
|
|
426
|
+
|
|
427
|
+
if (current.type === 'Identifier') {
|
|
428
|
+
path.unshift((current as Identifier).name);
|
|
429
|
+
} else {
|
|
430
|
+
return null;
|
|
431
|
+
}
|
|
432
|
+
|
|
433
|
+
// Now resolve via AST
|
|
434
|
+
// Find object declaration
|
|
435
|
+
const rootName = path[0] as string;
|
|
436
|
+
let objectValue: Record<string, unknown> | unknown[] | null = null;
|
|
437
|
+
|
|
438
|
+
traverse(ast, {
|
|
439
|
+
VariableDeclarator: (varPath: NodePath<VariableDeclarator>) => {
|
|
440
|
+
if (varPath.node.id.type === 'Identifier' &&
|
|
441
|
+
varPath.node.id.name === rootName &&
|
|
442
|
+
varPath.node.init &&
|
|
443
|
+
varPath.node.init.type === 'ObjectExpression') {
|
|
444
|
+
objectValue = this.evaluateObjectExpression(varPath.node.init as ObjectExpression);
|
|
445
|
+
} else if (varPath.node.id.type === 'Identifier' &&
|
|
446
|
+
varPath.node.id.name === rootName &&
|
|
447
|
+
varPath.node.init &&
|
|
448
|
+
varPath.node.init.type === 'ArrayExpression') {
|
|
449
|
+
objectValue = this.evaluateArrayExpression(varPath.node.init as ArrayExpression);
|
|
450
|
+
}
|
|
451
|
+
}
|
|
452
|
+
});
|
|
453
|
+
|
|
454
|
+
if (!objectValue) {
|
|
455
|
+
return null;
|
|
456
|
+
}
|
|
457
|
+
|
|
458
|
+
// Walk through path and get value
|
|
459
|
+
let result: unknown = objectValue;
|
|
460
|
+
for (let i = 1; i < path.length; i++) {
|
|
461
|
+
const key = path[i];
|
|
462
|
+
if (result && typeof result === 'object' && key in (result as Record<string, unknown>)) {
|
|
463
|
+
result = (result as Record<string | number, unknown>)[key];
|
|
464
|
+
} else {
|
|
465
|
+
return null;
|
|
466
|
+
}
|
|
467
|
+
}
|
|
468
|
+
|
|
469
|
+
return typeof result === 'string' ? result : null;
|
|
470
|
+
}
|
|
471
|
+
|
|
472
|
+
/**
|
|
473
|
+
* Evaluate ObjectExpression to plain JS object
|
|
474
|
+
*/
|
|
475
|
+
evaluateObjectExpression(node: ObjectExpression): Record<string, unknown> {
|
|
476
|
+
const obj: Record<string, unknown> = {};
|
|
477
|
+
for (const prop of node.properties) {
|
|
478
|
+
if (prop.type === 'ObjectProperty') {
|
|
479
|
+
const objProp = prop as ObjectProperty;
|
|
480
|
+
if (objProp.key.type === 'Identifier') {
|
|
481
|
+
const key = (objProp.key as Identifier).name;
|
|
482
|
+
if (objProp.value.type === 'StringLiteral') {
|
|
483
|
+
obj[key] = (objProp.value as StringLiteral).value;
|
|
484
|
+
} else if (objProp.value.type === 'ObjectExpression') {
|
|
485
|
+
obj[key] = this.evaluateObjectExpression(objProp.value);
|
|
486
|
+
}
|
|
487
|
+
}
|
|
488
|
+
}
|
|
489
|
+
}
|
|
490
|
+
return obj;
|
|
491
|
+
}
|
|
492
|
+
|
|
493
|
+
/**
|
|
494
|
+
* Evaluate ArrayExpression to plain JS array
|
|
495
|
+
*/
|
|
496
|
+
evaluateArrayExpression(node: ArrayExpression): string[] {
|
|
497
|
+
const arr: string[] = [];
|
|
498
|
+
for (const element of node.elements) {
|
|
499
|
+
if (element && element.type === 'StringLiteral') {
|
|
500
|
+
arr.push((element as StringLiteral).value);
|
|
501
|
+
}
|
|
502
|
+
}
|
|
503
|
+
return arr;
|
|
504
|
+
}
|
|
505
|
+
|
|
506
|
+
/**
|
|
507
|
+
* Helper method for finding edges
|
|
508
|
+
*/
|
|
509
|
+
findEdges(graph: Graph, criteria: EdgeCriteria): Edge[] {
|
|
510
|
+
const result: Edge[] = [];
|
|
511
|
+
if (!graph.edges) return result;
|
|
512
|
+
|
|
513
|
+
for (const edge of graph.edges.values()) {
|
|
514
|
+
let matches = true;
|
|
515
|
+
for (const [key, value] of Object.entries(criteria)) {
|
|
516
|
+
if (edge[key] !== value) {
|
|
517
|
+
matches = false;
|
|
518
|
+
break;
|
|
519
|
+
}
|
|
520
|
+
}
|
|
521
|
+
if (matches) {
|
|
522
|
+
result.push(edge);
|
|
523
|
+
}
|
|
524
|
+
}
|
|
525
|
+
return result;
|
|
526
|
+
}
|
|
527
|
+
}
|