@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,528 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CallExpressionVisitor - handles function calls and constructor invocations at module level
|
|
3
|
+
*
|
|
4
|
+
* Handles:
|
|
5
|
+
* - Direct function calls: foo()
|
|
6
|
+
* - Method calls: obj.method()
|
|
7
|
+
* - Event handlers: obj.on('event', handler)
|
|
8
|
+
* - Constructor calls: new Foo(), new Function()
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
import type { Node, CallExpression, NewExpression, Identifier, MemberExpression } from '@babel/types';
|
|
12
|
+
import type { NodePath } from '@babel/traverse';
|
|
13
|
+
import { ASTVisitor, type VisitorModule, type VisitorCollections, type VisitorHandlers, type CounterRef } from './ASTVisitor.js';
|
|
14
|
+
import { ExpressionEvaluator } from '../ExpressionEvaluator.js';
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Argument info for PASSES_ARGUMENT edges
|
|
18
|
+
*/
|
|
19
|
+
interface ArgumentInfo {
|
|
20
|
+
callId: string;
|
|
21
|
+
argIndex: number;
|
|
22
|
+
file: string;
|
|
23
|
+
line: number;
|
|
24
|
+
column: number;
|
|
25
|
+
isSpread?: boolean;
|
|
26
|
+
targetType?: string;
|
|
27
|
+
targetId?: string;
|
|
28
|
+
targetName?: string;
|
|
29
|
+
literalValue?: unknown;
|
|
30
|
+
functionLine?: number;
|
|
31
|
+
functionColumn?: number;
|
|
32
|
+
nestedCallLine?: number;
|
|
33
|
+
nestedCallColumn?: number;
|
|
34
|
+
objectName?: string;
|
|
35
|
+
propertyName?: string;
|
|
36
|
+
expressionType?: string;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* Call site info
|
|
41
|
+
*/
|
|
42
|
+
interface CallSiteInfo {
|
|
43
|
+
id: string;
|
|
44
|
+
type: 'CALL';
|
|
45
|
+
name: string;
|
|
46
|
+
file: string;
|
|
47
|
+
line: number;
|
|
48
|
+
column: number;
|
|
49
|
+
parentScopeId: string;
|
|
50
|
+
targetFunctionName: string;
|
|
51
|
+
isNew?: boolean;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* Method call info
|
|
56
|
+
*/
|
|
57
|
+
interface MethodCallInfo {
|
|
58
|
+
id: string;
|
|
59
|
+
type: 'CALL';
|
|
60
|
+
name: string;
|
|
61
|
+
object: string;
|
|
62
|
+
method: string;
|
|
63
|
+
computed?: boolean;
|
|
64
|
+
computedPropertyVar?: string | null;
|
|
65
|
+
file: string;
|
|
66
|
+
line: number;
|
|
67
|
+
column: number;
|
|
68
|
+
parentScopeId: string;
|
|
69
|
+
isNew?: boolean;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
/**
|
|
73
|
+
* Event listener info
|
|
74
|
+
*/
|
|
75
|
+
interface EventListenerInfo {
|
|
76
|
+
id: string;
|
|
77
|
+
type: 'event:listener';
|
|
78
|
+
name: string;
|
|
79
|
+
object: string;
|
|
80
|
+
file: string;
|
|
81
|
+
line: number;
|
|
82
|
+
parentScopeId: string;
|
|
83
|
+
callbackArg: Node;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
/**
|
|
87
|
+
* Method callback info
|
|
88
|
+
*/
|
|
89
|
+
interface MethodCallbackInfo {
|
|
90
|
+
methodCallId: string;
|
|
91
|
+
callbackLine: number;
|
|
92
|
+
callbackColumn: number;
|
|
93
|
+
callbackType: string;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
/**
|
|
97
|
+
* Literal node info
|
|
98
|
+
*/
|
|
99
|
+
interface LiteralInfo {
|
|
100
|
+
id: string;
|
|
101
|
+
type: 'LITERAL' | 'EXPRESSION';
|
|
102
|
+
value?: unknown;
|
|
103
|
+
valueType?: string;
|
|
104
|
+
expressionType?: string;
|
|
105
|
+
operator?: string;
|
|
106
|
+
name?: string;
|
|
107
|
+
file: string;
|
|
108
|
+
line: number;
|
|
109
|
+
column: number;
|
|
110
|
+
parentCallId: string;
|
|
111
|
+
argIndex: number;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
export class CallExpressionVisitor extends ASTVisitor {
|
|
115
|
+
constructor(module: VisitorModule, collections: VisitorCollections) {
|
|
116
|
+
super(module, collections);
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
/**
|
|
120
|
+
* Extract argument information for PASSES_ARGUMENT edges
|
|
121
|
+
*/
|
|
122
|
+
extractArguments(
|
|
123
|
+
args: CallExpression['arguments'],
|
|
124
|
+
callId: string,
|
|
125
|
+
module: VisitorModule,
|
|
126
|
+
callArguments: ArgumentInfo[],
|
|
127
|
+
literals: LiteralInfo[],
|
|
128
|
+
literalCounterRef: CounterRef
|
|
129
|
+
): void {
|
|
130
|
+
args.forEach((arg, index) => {
|
|
131
|
+
const argInfo: ArgumentInfo = {
|
|
132
|
+
callId,
|
|
133
|
+
argIndex: index,
|
|
134
|
+
file: module.file,
|
|
135
|
+
line: arg.loc?.start.line || 0,
|
|
136
|
+
column: arg.loc?.start.column || 0
|
|
137
|
+
};
|
|
138
|
+
|
|
139
|
+
// Check for spread: ...arg
|
|
140
|
+
let actualArg: Node = arg;
|
|
141
|
+
if (arg.type === 'SpreadElement') {
|
|
142
|
+
argInfo.isSpread = true;
|
|
143
|
+
actualArg = arg.argument; // Get the actual argument
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
// Literal value
|
|
147
|
+
const literalValue = ExpressionEvaluator.extractLiteralValue(actualArg);
|
|
148
|
+
if (literalValue !== null) {
|
|
149
|
+
const literalId = `LITERAL#arg${index}#${module.file}#${argInfo.line}:${argInfo.column}:${literalCounterRef.value++}`;
|
|
150
|
+
literals.push({
|
|
151
|
+
id: literalId,
|
|
152
|
+
type: 'LITERAL',
|
|
153
|
+
value: literalValue,
|
|
154
|
+
valueType: typeof literalValue,
|
|
155
|
+
file: module.file,
|
|
156
|
+
line: argInfo.line,
|
|
157
|
+
column: argInfo.column,
|
|
158
|
+
parentCallId: callId,
|
|
159
|
+
argIndex: index
|
|
160
|
+
});
|
|
161
|
+
argInfo.targetType = 'LITERAL';
|
|
162
|
+
argInfo.targetId = literalId;
|
|
163
|
+
argInfo.literalValue = literalValue;
|
|
164
|
+
}
|
|
165
|
+
// Variable reference
|
|
166
|
+
else if (actualArg.type === 'Identifier') {
|
|
167
|
+
argInfo.targetType = 'VARIABLE';
|
|
168
|
+
argInfo.targetName = (actualArg as Identifier).name; // Will be resolved in GraphBuilder
|
|
169
|
+
}
|
|
170
|
+
// Function expression (callback)
|
|
171
|
+
else if (actualArg.type === 'ArrowFunctionExpression' || actualArg.type === 'FunctionExpression') {
|
|
172
|
+
argInfo.targetType = 'FUNCTION';
|
|
173
|
+
argInfo.functionLine = actualArg.loc?.start.line;
|
|
174
|
+
argInfo.functionColumn = actualArg.loc?.start.column;
|
|
175
|
+
}
|
|
176
|
+
// Call expression (nested call)
|
|
177
|
+
else if (actualArg.type === 'CallExpression') {
|
|
178
|
+
argInfo.targetType = 'CALL';
|
|
179
|
+
// Nested calls will be processed separately, link by position
|
|
180
|
+
argInfo.nestedCallLine = actualArg.loc?.start.line;
|
|
181
|
+
argInfo.nestedCallColumn = actualArg.loc?.start.column;
|
|
182
|
+
}
|
|
183
|
+
// Member expression: obj.prop or obj[x]
|
|
184
|
+
else if (actualArg.type === 'MemberExpression') {
|
|
185
|
+
const memberExpr = actualArg as MemberExpression;
|
|
186
|
+
argInfo.targetType = 'EXPRESSION';
|
|
187
|
+
argInfo.expressionType = 'MemberExpression';
|
|
188
|
+
if (memberExpr.object.type === 'Identifier') {
|
|
189
|
+
argInfo.objectName = memberExpr.object.name;
|
|
190
|
+
}
|
|
191
|
+
if (!memberExpr.computed && memberExpr.property.type === 'Identifier') {
|
|
192
|
+
argInfo.propertyName = memberExpr.property.name;
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
// Binary/Logical expression: a + b, a && b
|
|
196
|
+
else if (actualArg.type === 'BinaryExpression' || actualArg.type === 'LogicalExpression') {
|
|
197
|
+
const expr = actualArg as { operator?: string; type: string };
|
|
198
|
+
const operator = expr.operator || '?';
|
|
199
|
+
const exprName = `<${actualArg.type}:${operator}>`;
|
|
200
|
+
const expressionId = `EXPRESSION#${exprName}#${module.file}#${argInfo.line}:${argInfo.column}:${literalCounterRef.value++}`;
|
|
201
|
+
|
|
202
|
+
// Create EXPRESSION node
|
|
203
|
+
literals.push({
|
|
204
|
+
id: expressionId,
|
|
205
|
+
type: 'EXPRESSION',
|
|
206
|
+
expressionType: actualArg.type,
|
|
207
|
+
operator: operator,
|
|
208
|
+
name: exprName,
|
|
209
|
+
file: module.file,
|
|
210
|
+
line: argInfo.line,
|
|
211
|
+
column: argInfo.column,
|
|
212
|
+
parentCallId: callId,
|
|
213
|
+
argIndex: index
|
|
214
|
+
});
|
|
215
|
+
|
|
216
|
+
argInfo.targetType = 'EXPRESSION';
|
|
217
|
+
argInfo.targetId = expressionId;
|
|
218
|
+
argInfo.expressionType = actualArg.type;
|
|
219
|
+
|
|
220
|
+
// Track DERIVES_FROM edges for identifiers in expression
|
|
221
|
+
const identifiers = this.extractIdentifiers(actualArg);
|
|
222
|
+
const { variableAssignments } = this.collections;
|
|
223
|
+
if (variableAssignments) {
|
|
224
|
+
for (const identName of identifiers) {
|
|
225
|
+
variableAssignments.push({
|
|
226
|
+
variableId: expressionId,
|
|
227
|
+
sourceId: null,
|
|
228
|
+
sourceName: identName,
|
|
229
|
+
sourceType: 'DERIVES_FROM_VARIABLE',
|
|
230
|
+
file: module.file
|
|
231
|
+
});
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
// Object literal
|
|
236
|
+
else if (actualArg.type === 'ObjectExpression') {
|
|
237
|
+
argInfo.targetType = 'OBJECT_LITERAL';
|
|
238
|
+
}
|
|
239
|
+
// Array literal
|
|
240
|
+
else if (actualArg.type === 'ArrayExpression') {
|
|
241
|
+
argInfo.targetType = 'ARRAY_LITERAL';
|
|
242
|
+
}
|
|
243
|
+
// Other expression types
|
|
244
|
+
else {
|
|
245
|
+
argInfo.targetType = 'EXPRESSION';
|
|
246
|
+
argInfo.expressionType = actualArg.type;
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
callArguments.push(argInfo);
|
|
250
|
+
});
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
/**
|
|
254
|
+
* Extract all Identifier names from an expression (recursively)
|
|
255
|
+
* Used for BinaryExpression/LogicalExpression to track DERIVES_FROM edges
|
|
256
|
+
*/
|
|
257
|
+
extractIdentifiers(node: Node | null | undefined, identifiers: Set<string> = new Set()): string[] {
|
|
258
|
+
if (!node) return Array.from(identifiers);
|
|
259
|
+
|
|
260
|
+
if (node.type === 'Identifier') {
|
|
261
|
+
identifiers.add((node as Identifier).name);
|
|
262
|
+
} else if (node.type === 'BinaryExpression' || node.type === 'LogicalExpression') {
|
|
263
|
+
const expr = node as { left: Node; right: Node };
|
|
264
|
+
this.extractIdentifiers(expr.left, identifiers);
|
|
265
|
+
this.extractIdentifiers(expr.right, identifiers);
|
|
266
|
+
} else if (node.type === 'UnaryExpression') {
|
|
267
|
+
const expr = node as { argument: Node };
|
|
268
|
+
this.extractIdentifiers(expr.argument, identifiers);
|
|
269
|
+
} else if (node.type === 'ConditionalExpression') {
|
|
270
|
+
const expr = node as { test: Node; consequent: Node; alternate: Node };
|
|
271
|
+
this.extractIdentifiers(expr.test, identifiers);
|
|
272
|
+
this.extractIdentifiers(expr.consequent, identifiers);
|
|
273
|
+
this.extractIdentifiers(expr.alternate, identifiers);
|
|
274
|
+
} else if (node.type === 'MemberExpression') {
|
|
275
|
+
const memberExpr = node as MemberExpression;
|
|
276
|
+
// For obj.prop - track obj (but not prop as it's a property name)
|
|
277
|
+
if (memberExpr.object.type === 'Identifier') {
|
|
278
|
+
identifiers.add(memberExpr.object.name);
|
|
279
|
+
} else {
|
|
280
|
+
this.extractIdentifiers(memberExpr.object, identifiers);
|
|
281
|
+
}
|
|
282
|
+
} else if (node.type === 'CallExpression') {
|
|
283
|
+
const callExpr = node as CallExpression;
|
|
284
|
+
// For func() - track func if identifier, and all arguments
|
|
285
|
+
if (callExpr.callee.type === 'Identifier') {
|
|
286
|
+
identifiers.add((callExpr.callee as Identifier).name);
|
|
287
|
+
}
|
|
288
|
+
for (const arg of callExpr.arguments) {
|
|
289
|
+
if (arg.type !== 'SpreadElement') {
|
|
290
|
+
this.extractIdentifiers(arg, identifiers);
|
|
291
|
+
} else {
|
|
292
|
+
this.extractIdentifiers(arg.argument, identifiers);
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
return Array.from(identifiers);
|
|
298
|
+
}
|
|
299
|
+
|
|
300
|
+
/**
|
|
301
|
+
* Get a stable scope ID for a function parent
|
|
302
|
+
* Format must match what FunctionVisitor creates:
|
|
303
|
+
* - FunctionDeclaration: FUNCTION#name#file#line
|
|
304
|
+
* - ArrowFunctionExpression: FUNCTION#name#file#line:col:counter
|
|
305
|
+
*
|
|
306
|
+
* NOTE: We don't have access to the counter here, so for arrow functions
|
|
307
|
+
* we try to match by name+file+line:col. This may not always work for
|
|
308
|
+
* multiple arrow functions on the same line.
|
|
309
|
+
*/
|
|
310
|
+
getFunctionScopeId(functionParent: NodePath, module: VisitorModule): string {
|
|
311
|
+
const funcNode = functionParent.node as Node & {
|
|
312
|
+
id?: { name: string } | null;
|
|
313
|
+
loc?: { start: { line: number; column: number } };
|
|
314
|
+
type: string;
|
|
315
|
+
};
|
|
316
|
+
const line = funcNode.loc?.start.line || 0;
|
|
317
|
+
const col = funcNode.loc?.start.column || 0;
|
|
318
|
+
|
|
319
|
+
// FunctionDeclaration with name
|
|
320
|
+
if (funcNode.type === 'FunctionDeclaration' && funcNode.id?.name) {
|
|
321
|
+
return `FUNCTION#${funcNode.id.name}#${module.file}#${line}`;
|
|
322
|
+
}
|
|
323
|
+
|
|
324
|
+
// For arrow functions and other cases, we can't perfectly match the ID
|
|
325
|
+
// because FunctionVisitor uses a counter. For now, use module.id as fallback
|
|
326
|
+
// to avoid creating invalid edges. The CALL node will be connected to MODULE
|
|
327
|
+
// instead of the specific function.
|
|
328
|
+
return module.id;
|
|
329
|
+
}
|
|
330
|
+
|
|
331
|
+
getHandlers(): VisitorHandlers {
|
|
332
|
+
const { module } = this;
|
|
333
|
+
const callSites = this.collections.callSites ?? [];
|
|
334
|
+
const methodCalls = this.collections.methodCalls ?? [];
|
|
335
|
+
const eventListeners = this.collections.eventListeners ?? [];
|
|
336
|
+
const methodCallbacks = this.collections.methodCallbacks ?? [];
|
|
337
|
+
const literals = this.collections.literals ?? [];
|
|
338
|
+
const callArguments = this.collections.callArguments ?? [];
|
|
339
|
+
const callSiteCounterRef = (this.collections.callSiteCounterRef ?? { value: 0 }) as CounterRef;
|
|
340
|
+
const literalCounterRef = (this.collections.literalCounterRef ?? { value: 0 }) as CounterRef;
|
|
341
|
+
const processedNodes = this.collections.processedNodes ?? { callSites: new Set(), methodCalls: new Set(), eventListeners: new Set() };
|
|
342
|
+
|
|
343
|
+
return {
|
|
344
|
+
CallExpression: (path: NodePath) => {
|
|
345
|
+
const callNode = path.node as CallExpression;
|
|
346
|
+
const functionParent = path.getFunctionParent();
|
|
347
|
+
// Determine parent scope - if inside a function, use function's scope, otherwise module
|
|
348
|
+
const parentScopeId = functionParent ? this.getFunctionScopeId(functionParent, module) : module.id;
|
|
349
|
+
|
|
350
|
+
// Identifier calls (direct function calls)
|
|
351
|
+
if (callNode.callee.type === 'Identifier') {
|
|
352
|
+
const callee = callNode.callee as Identifier;
|
|
353
|
+
const callId = `CALL#${callee.name}#${module.file}#${callNode.loc!.start.line}:${callNode.loc!.start.column}:${callSiteCounterRef.value++}`;
|
|
354
|
+
|
|
355
|
+
(callSites as CallSiteInfo[]).push({
|
|
356
|
+
id: callId,
|
|
357
|
+
type: 'CALL',
|
|
358
|
+
name: callee.name,
|
|
359
|
+
file: module.file,
|
|
360
|
+
line: callNode.loc!.start.line,
|
|
361
|
+
column: callNode.loc!.start.column,
|
|
362
|
+
parentScopeId,
|
|
363
|
+
targetFunctionName: callee.name
|
|
364
|
+
});
|
|
365
|
+
|
|
366
|
+
// Extract arguments for PASSES_ARGUMENT edges
|
|
367
|
+
if (callNode.arguments.length > 0) {
|
|
368
|
+
this.extractArguments(
|
|
369
|
+
callNode.arguments,
|
|
370
|
+
callId,
|
|
371
|
+
module,
|
|
372
|
+
callArguments as ArgumentInfo[],
|
|
373
|
+
literals as LiteralInfo[],
|
|
374
|
+
literalCounterRef
|
|
375
|
+
);
|
|
376
|
+
}
|
|
377
|
+
}
|
|
378
|
+
// MemberExpression calls (method calls at module level)
|
|
379
|
+
else if (callNode.callee.type === 'MemberExpression') {
|
|
380
|
+
const memberCallee = callNode.callee as MemberExpression;
|
|
381
|
+
const object = memberCallee.object;
|
|
382
|
+
const property = memberCallee.property;
|
|
383
|
+
const isComputed = memberCallee.computed;
|
|
384
|
+
|
|
385
|
+
if ((object.type === 'Identifier' || object.type === 'ThisExpression') && property.type === 'Identifier') {
|
|
386
|
+
const objectName = object.type === 'Identifier' ? (object as Identifier).name : 'this';
|
|
387
|
+
// For computed access obj[x](), methodName is '<computed>' but we save the variable name
|
|
388
|
+
const methodName = isComputed ? '<computed>' : (property as Identifier).name;
|
|
389
|
+
const computedPropertyVar = isComputed ? (property as Identifier).name : null;
|
|
390
|
+
|
|
391
|
+
// Special handling for .on() event handlers
|
|
392
|
+
if (methodName === 'on' && callNode.arguments.length >= 2) {
|
|
393
|
+
const firstArg = callNode.arguments[0];
|
|
394
|
+
const secondArg = callNode.arguments[1];
|
|
395
|
+
|
|
396
|
+
if (firstArg.type === 'StringLiteral') {
|
|
397
|
+
const eventName = firstArg.value;
|
|
398
|
+
|
|
399
|
+
// Dedup check
|
|
400
|
+
const nodeKey = `${callNode.start}:${callNode.end}`;
|
|
401
|
+
if (processedNodes.eventListeners.has(nodeKey)) {
|
|
402
|
+
return;
|
|
403
|
+
}
|
|
404
|
+
processedNodes.eventListeners.add(nodeKey);
|
|
405
|
+
|
|
406
|
+
(eventListeners as EventListenerInfo[]).push({
|
|
407
|
+
id: `event:listener#${eventName}#${module.file}#${callNode.loc!.start.line}:${callNode.loc!.start.column}:${callSiteCounterRef.value++}`,
|
|
408
|
+
type: 'event:listener',
|
|
409
|
+
name: eventName,
|
|
410
|
+
object: objectName,
|
|
411
|
+
file: module.file,
|
|
412
|
+
line: callNode.loc!.start.line,
|
|
413
|
+
parentScopeId,
|
|
414
|
+
callbackArg: secondArg
|
|
415
|
+
});
|
|
416
|
+
}
|
|
417
|
+
} else {
|
|
418
|
+
// Regular method call
|
|
419
|
+
const nodeKey = `${callNode.start}:${callNode.end}`;
|
|
420
|
+
if (processedNodes.methodCalls.has(nodeKey)) {
|
|
421
|
+
return;
|
|
422
|
+
}
|
|
423
|
+
processedNodes.methodCalls.add(nodeKey);
|
|
424
|
+
|
|
425
|
+
const fullName = `${objectName}.${methodName}`;
|
|
426
|
+
const methodCallId = `CALL#${fullName}#${module.file}#${callNode.loc!.start.line}:${callNode.loc!.start.column}:${callSiteCounterRef.value++}`;
|
|
427
|
+
|
|
428
|
+
(methodCalls as MethodCallInfo[]).push({
|
|
429
|
+
id: methodCallId,
|
|
430
|
+
type: 'CALL',
|
|
431
|
+
name: fullName,
|
|
432
|
+
object: objectName,
|
|
433
|
+
method: methodName,
|
|
434
|
+
computed: isComputed,
|
|
435
|
+
computedPropertyVar, // Variable name used in obj[x]() calls
|
|
436
|
+
file: module.file,
|
|
437
|
+
line: callNode.loc!.start.line,
|
|
438
|
+
column: callNode.loc!.start.column,
|
|
439
|
+
parentScopeId
|
|
440
|
+
});
|
|
441
|
+
|
|
442
|
+
// Extract arguments for PASSES_ARGUMENT edges
|
|
443
|
+
if (callNode.arguments.length > 0) {
|
|
444
|
+
this.extractArguments(
|
|
445
|
+
callNode.arguments,
|
|
446
|
+
methodCallId,
|
|
447
|
+
module,
|
|
448
|
+
callArguments as ArgumentInfo[],
|
|
449
|
+
literals as LiteralInfo[],
|
|
450
|
+
literalCounterRef
|
|
451
|
+
);
|
|
452
|
+
|
|
453
|
+
// Also track callbacks for HAS_CALLBACK edges
|
|
454
|
+
callNode.arguments.forEach((arg) => {
|
|
455
|
+
if (arg.type === 'ArrowFunctionExpression' || arg.type === 'FunctionExpression') {
|
|
456
|
+
(methodCallbacks as MethodCallbackInfo[]).push({
|
|
457
|
+
methodCallId,
|
|
458
|
+
callbackLine: arg.loc!.start.line,
|
|
459
|
+
callbackColumn: arg.loc!.start.column,
|
|
460
|
+
callbackType: arg.type
|
|
461
|
+
});
|
|
462
|
+
}
|
|
463
|
+
});
|
|
464
|
+
}
|
|
465
|
+
}
|
|
466
|
+
}
|
|
467
|
+
}
|
|
468
|
+
},
|
|
469
|
+
|
|
470
|
+
// NewExpression: new Foo(), new Function(), new Map(), etc.
|
|
471
|
+
NewExpression: (path: NodePath) => {
|
|
472
|
+
const newNode = path.node as NewExpression;
|
|
473
|
+
const functionParent = path.getFunctionParent();
|
|
474
|
+
const parentScopeId = functionParent ? this.getFunctionScopeId(functionParent, module) : module.id;
|
|
475
|
+
|
|
476
|
+
// Dedup check
|
|
477
|
+
const nodeKey = `new:${newNode.start}:${newNode.end}`;
|
|
478
|
+
if (processedNodes.methodCalls.has(nodeKey)) {
|
|
479
|
+
return;
|
|
480
|
+
}
|
|
481
|
+
processedNodes.methodCalls.add(nodeKey);
|
|
482
|
+
|
|
483
|
+
// new Foo() - Identifier callee
|
|
484
|
+
if (newNode.callee.type === 'Identifier') {
|
|
485
|
+
const callee = newNode.callee as Identifier;
|
|
486
|
+
const constructorName = callee.name;
|
|
487
|
+
|
|
488
|
+
(callSites as CallSiteInfo[]).push({
|
|
489
|
+
id: `CALL#new:${constructorName}#${module.file}#${newNode.loc!.start.line}:${newNode.loc!.start.column}:${callSiteCounterRef.value++}`,
|
|
490
|
+
type: 'CALL',
|
|
491
|
+
name: constructorName,
|
|
492
|
+
file: module.file,
|
|
493
|
+
line: newNode.loc!.start.line,
|
|
494
|
+
column: newNode.loc!.start.column,
|
|
495
|
+
parentScopeId,
|
|
496
|
+
targetFunctionName: constructorName,
|
|
497
|
+
isNew: true // Mark as constructor call
|
|
498
|
+
});
|
|
499
|
+
}
|
|
500
|
+
// new obj.Constructor() - MemberExpression callee
|
|
501
|
+
else if (newNode.callee.type === 'MemberExpression') {
|
|
502
|
+
const memberCallee = newNode.callee as MemberExpression;
|
|
503
|
+
const object = memberCallee.object;
|
|
504
|
+
const property = memberCallee.property;
|
|
505
|
+
|
|
506
|
+
if (object.type === 'Identifier' && property.type === 'Identifier') {
|
|
507
|
+
const objectName = (object as Identifier).name;
|
|
508
|
+
const constructorName = (property as Identifier).name;
|
|
509
|
+
const fullName = `${objectName}.${constructorName}`;
|
|
510
|
+
|
|
511
|
+
(methodCalls as MethodCallInfo[]).push({
|
|
512
|
+
id: `CALL#new:${fullName}#${module.file}#${newNode.loc!.start.line}:${newNode.loc!.start.column}:${callSiteCounterRef.value++}`,
|
|
513
|
+
type: 'CALL',
|
|
514
|
+
name: fullName,
|
|
515
|
+
object: objectName,
|
|
516
|
+
method: constructorName,
|
|
517
|
+
file: module.file,
|
|
518
|
+
line: newNode.loc!.start.line,
|
|
519
|
+
column: newNode.loc!.start.column,
|
|
520
|
+
parentScopeId,
|
|
521
|
+
isNew: true // Mark as constructor call
|
|
522
|
+
});
|
|
523
|
+
}
|
|
524
|
+
}
|
|
525
|
+
}
|
|
526
|
+
};
|
|
527
|
+
}
|
|
528
|
+
}
|