@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,339 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ClassVisitor - handles class declarations and their methods
|
|
3
|
+
*
|
|
4
|
+
* Handles:
|
|
5
|
+
* - ClassDeclaration
|
|
6
|
+
* - ClassMethod (nested)
|
|
7
|
+
* - ClassProperty with function values (nested)
|
|
8
|
+
* - Implements (TypeScript)
|
|
9
|
+
* - Decorators
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
import type {
|
|
13
|
+
ClassDeclaration,
|
|
14
|
+
ClassMethod,
|
|
15
|
+
ClassProperty,
|
|
16
|
+
Identifier,
|
|
17
|
+
ArrowFunctionExpression,
|
|
18
|
+
FunctionExpression,
|
|
19
|
+
Decorator,
|
|
20
|
+
Node
|
|
21
|
+
} from '@babel/types';
|
|
22
|
+
import type { NodePath } from '@babel/traverse';
|
|
23
|
+
import { ASTVisitor, type VisitorModule, type VisitorCollections, type VisitorHandlers } from './ASTVisitor.js';
|
|
24
|
+
import type { AnalyzeFunctionBodyCallback } from './FunctionVisitor.js';
|
|
25
|
+
import type { DecoratorInfo } from '../types.js';
|
|
26
|
+
import { ExpressionEvaluator } from '../ExpressionEvaluator.js';
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* Class declaration info
|
|
30
|
+
*/
|
|
31
|
+
interface ClassInfo {
|
|
32
|
+
id: string;
|
|
33
|
+
type: 'CLASS';
|
|
34
|
+
name: string;
|
|
35
|
+
file: string;
|
|
36
|
+
line: number;
|
|
37
|
+
column: number;
|
|
38
|
+
superClass: string | null;
|
|
39
|
+
implements?: string[]; // TypeScript implements
|
|
40
|
+
methods: string[];
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* Function node info for class methods
|
|
45
|
+
*/
|
|
46
|
+
interface ClassFunctionInfo {
|
|
47
|
+
id: string;
|
|
48
|
+
stableId: string;
|
|
49
|
+
type: 'FUNCTION';
|
|
50
|
+
name: string;
|
|
51
|
+
file: string;
|
|
52
|
+
line: number;
|
|
53
|
+
column: number;
|
|
54
|
+
async: boolean;
|
|
55
|
+
generator?: boolean;
|
|
56
|
+
arrowFunction?: boolean;
|
|
57
|
+
isClassProperty?: boolean;
|
|
58
|
+
isClassMethod?: boolean;
|
|
59
|
+
className: string;
|
|
60
|
+
methodKind?: 'constructor' | 'method' | 'get' | 'set';
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* Scope node info
|
|
65
|
+
*/
|
|
66
|
+
interface ScopeInfo {
|
|
67
|
+
id: string;
|
|
68
|
+
type: 'SCOPE';
|
|
69
|
+
scopeType: string;
|
|
70
|
+
name: string;
|
|
71
|
+
conditional?: boolean;
|
|
72
|
+
file: string;
|
|
73
|
+
line: number;
|
|
74
|
+
parentFunctionId: string;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
export class ClassVisitor extends ASTVisitor {
|
|
78
|
+
private analyzeFunctionBody: AnalyzeFunctionBodyCallback;
|
|
79
|
+
|
|
80
|
+
/**
|
|
81
|
+
* @param module - Current module being analyzed
|
|
82
|
+
* @param collections - Must contain arrays and counter refs
|
|
83
|
+
* @param analyzeFunctionBody - Callback to analyze method internals
|
|
84
|
+
*/
|
|
85
|
+
constructor(
|
|
86
|
+
module: VisitorModule,
|
|
87
|
+
collections: VisitorCollections,
|
|
88
|
+
analyzeFunctionBody: AnalyzeFunctionBodyCallback
|
|
89
|
+
) {
|
|
90
|
+
super(module, collections);
|
|
91
|
+
this.analyzeFunctionBody = analyzeFunctionBody;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
/**
|
|
95
|
+
* Extract decorator information from a Decorator node
|
|
96
|
+
*/
|
|
97
|
+
private extractDecoratorInfo(
|
|
98
|
+
decorator: Decorator,
|
|
99
|
+
targetId: string,
|
|
100
|
+
targetType: 'CLASS' | 'METHOD' | 'PROPERTY' | 'PARAMETER',
|
|
101
|
+
module: VisitorModule
|
|
102
|
+
): DecoratorInfo | null {
|
|
103
|
+
let decoratorName: string;
|
|
104
|
+
let decoratorArgs: unknown[] | undefined;
|
|
105
|
+
|
|
106
|
+
// @Decorator or @Decorator()
|
|
107
|
+
if (decorator.expression.type === 'Identifier') {
|
|
108
|
+
decoratorName = (decorator.expression as Identifier).name;
|
|
109
|
+
} else if (decorator.expression.type === 'CallExpression') {
|
|
110
|
+
const callExpr = decorator.expression as { callee: { type: string; name?: string }; arguments: unknown[] };
|
|
111
|
+
if (callExpr.callee.type === 'Identifier') {
|
|
112
|
+
decoratorName = callExpr.callee.name!;
|
|
113
|
+
// Extract arguments (cast to Node since Babel types guarantee these are AST nodes)
|
|
114
|
+
decoratorArgs = callExpr.arguments.map(arg => {
|
|
115
|
+
return ExpressionEvaluator.extractLiteralValue(arg as Node);
|
|
116
|
+
}).filter(v => v !== null);
|
|
117
|
+
if (decoratorArgs.length === 0) {
|
|
118
|
+
decoratorArgs = undefined;
|
|
119
|
+
}
|
|
120
|
+
} else {
|
|
121
|
+
return null; // Complex decorator expression
|
|
122
|
+
}
|
|
123
|
+
} else {
|
|
124
|
+
return null; // Unsupported decorator type
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
const decoratorId = `DECORATOR#${decoratorName}#${module.file}#${decorator.loc!.start.line}:${decorator.loc!.start.column}`;
|
|
128
|
+
|
|
129
|
+
return {
|
|
130
|
+
id: decoratorId,
|
|
131
|
+
type: 'DECORATOR',
|
|
132
|
+
name: decoratorName,
|
|
133
|
+
file: module.file,
|
|
134
|
+
line: decorator.loc!.start.line,
|
|
135
|
+
column: decorator.loc!.start.column,
|
|
136
|
+
arguments: decoratorArgs,
|
|
137
|
+
targetId,
|
|
138
|
+
targetType
|
|
139
|
+
};
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
getHandlers(): VisitorHandlers {
|
|
143
|
+
const { module } = this;
|
|
144
|
+
const {
|
|
145
|
+
functions,
|
|
146
|
+
scopes,
|
|
147
|
+
classDeclarations,
|
|
148
|
+
decorators
|
|
149
|
+
} = this.collections;
|
|
150
|
+
|
|
151
|
+
const analyzeFunctionBody = this.analyzeFunctionBody;
|
|
152
|
+
const collections = this.collections;
|
|
153
|
+
|
|
154
|
+
return {
|
|
155
|
+
ClassDeclaration: (classPath: NodePath) => {
|
|
156
|
+
const classNode = classPath.node as ClassDeclaration;
|
|
157
|
+
if (!classNode.id) return; // Skip anonymous classes
|
|
158
|
+
|
|
159
|
+
const className = classNode.id.name;
|
|
160
|
+
|
|
161
|
+
// Create CLASS node for declaration
|
|
162
|
+
const classId = `CLASS#${className}#${module.file}#${classNode.loc!.start.line}`;
|
|
163
|
+
const superClassName = classNode.superClass?.type === 'Identifier'
|
|
164
|
+
? (classNode.superClass as Identifier).name
|
|
165
|
+
: null;
|
|
166
|
+
|
|
167
|
+
// Extract implements (TypeScript)
|
|
168
|
+
const implementsNames: string[] = [];
|
|
169
|
+
const classNodeWithImplements = classNode as ClassDeclaration & { implements?: Array<{ expression: { type: string; name?: string } }> };
|
|
170
|
+
if (classNodeWithImplements.implements && classNodeWithImplements.implements.length > 0) {
|
|
171
|
+
for (const impl of classNodeWithImplements.implements) {
|
|
172
|
+
if (impl.expression.type === 'Identifier') {
|
|
173
|
+
implementsNames.push(impl.expression.name!);
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
(classDeclarations as ClassInfo[]).push({
|
|
179
|
+
id: classId,
|
|
180
|
+
type: 'CLASS',
|
|
181
|
+
name: className,
|
|
182
|
+
file: module.file,
|
|
183
|
+
line: classNode.loc!.start.line,
|
|
184
|
+
column: classNode.loc!.start.column,
|
|
185
|
+
superClass: superClassName,
|
|
186
|
+
implements: implementsNames.length > 0 ? implementsNames : undefined,
|
|
187
|
+
methods: []
|
|
188
|
+
});
|
|
189
|
+
|
|
190
|
+
// Extract class decorators
|
|
191
|
+
const classNodeWithDecorators = classNode as ClassDeclaration & { decorators?: Decorator[] };
|
|
192
|
+
if (classNodeWithDecorators.decorators && classNodeWithDecorators.decorators.length > 0 && decorators) {
|
|
193
|
+
for (const decorator of classNodeWithDecorators.decorators) {
|
|
194
|
+
const decoratorInfo = this.extractDecoratorInfo(decorator, classId, 'CLASS', module);
|
|
195
|
+
if (decoratorInfo) {
|
|
196
|
+
(decorators as DecoratorInfo[]).push(decoratorInfo);
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
// Get reference to current class for adding methods
|
|
202
|
+
const classDeclarationsTyped = classDeclarations as ClassInfo[];
|
|
203
|
+
const currentClass = classDeclarationsTyped[classDeclarationsTyped.length - 1];
|
|
204
|
+
|
|
205
|
+
// Process class methods and properties
|
|
206
|
+
classPath.traverse({
|
|
207
|
+
ClassProperty: (propPath: NodePath) => {
|
|
208
|
+
const propNode = propPath.node as ClassProperty;
|
|
209
|
+
|
|
210
|
+
// Skip if not property of current class
|
|
211
|
+
if (propPath.parent !== classNode.body) {
|
|
212
|
+
return;
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
const propName = propNode.key.type === 'Identifier'
|
|
216
|
+
? propNode.key.name
|
|
217
|
+
: (propNode.key as { value?: string }).value || 'anonymous';
|
|
218
|
+
|
|
219
|
+
// Extract property decorators (even for non-function properties)
|
|
220
|
+
const propNodeWithDecorators = propNode as ClassProperty & { decorators?: Decorator[] };
|
|
221
|
+
if (propNodeWithDecorators.decorators && propNodeWithDecorators.decorators.length > 0 && decorators) {
|
|
222
|
+
// For function properties, target will be set later; for regular properties, create a target ID
|
|
223
|
+
const propertyTargetId = `PROPERTY#${className}.${propName}#${module.file}#${propNode.loc!.start.line}`;
|
|
224
|
+
for (const decorator of propNodeWithDecorators.decorators) {
|
|
225
|
+
const decoratorInfo = this.extractDecoratorInfo(decorator, propertyTargetId, 'PROPERTY', module);
|
|
226
|
+
if (decoratorInfo) {
|
|
227
|
+
(decorators as DecoratorInfo[]).push(decoratorInfo);
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
// Only process if value is a function
|
|
233
|
+
if (propNode.value &&
|
|
234
|
+
(propNode.value.type === 'ArrowFunctionExpression' ||
|
|
235
|
+
propNode.value.type === 'FunctionExpression')) {
|
|
236
|
+
|
|
237
|
+
const funcNode = propNode.value as ArrowFunctionExpression | FunctionExpression;
|
|
238
|
+
|
|
239
|
+
const functionId = `FUNCTION#${className}.${propName}#${module.file}#${propNode.loc!.start.line}:${propNode.loc!.start.column}`;
|
|
240
|
+
|
|
241
|
+
// Add method to class methods list for CONTAINS edges
|
|
242
|
+
currentClass.methods.push(functionId);
|
|
243
|
+
|
|
244
|
+
(functions as ClassFunctionInfo[]).push({
|
|
245
|
+
id: functionId,
|
|
246
|
+
stableId: functionId,
|
|
247
|
+
type: 'FUNCTION',
|
|
248
|
+
name: propName,
|
|
249
|
+
file: module.file,
|
|
250
|
+
line: propNode.loc!.start.line,
|
|
251
|
+
column: propNode.loc!.start.column,
|
|
252
|
+
async: funcNode.async || false,
|
|
253
|
+
generator: funcNode.type === 'FunctionExpression' ? funcNode.generator || false : false,
|
|
254
|
+
arrowFunction: funcNode.type === 'ArrowFunctionExpression',
|
|
255
|
+
isClassProperty: true,
|
|
256
|
+
className: className
|
|
257
|
+
});
|
|
258
|
+
|
|
259
|
+
// Create SCOPE for property function body
|
|
260
|
+
const propBodyScopeId = `SCOPE#${className}.${propName}:body#${module.file}#${propNode.loc!.start.line}`;
|
|
261
|
+
(scopes as ScopeInfo[]).push({
|
|
262
|
+
id: propBodyScopeId,
|
|
263
|
+
type: 'SCOPE',
|
|
264
|
+
scopeType: 'property_body',
|
|
265
|
+
name: `${className}.${propName}:body`,
|
|
266
|
+
conditional: false,
|
|
267
|
+
file: module.file,
|
|
268
|
+
line: propNode.loc!.start.line,
|
|
269
|
+
parentFunctionId: functionId
|
|
270
|
+
});
|
|
271
|
+
|
|
272
|
+
const funcPath = propPath.get('value') as NodePath<ArrowFunctionExpression | FunctionExpression>;
|
|
273
|
+
analyzeFunctionBody(funcPath, propBodyScopeId, module, collections);
|
|
274
|
+
}
|
|
275
|
+
},
|
|
276
|
+
|
|
277
|
+
ClassMethod: (methodPath: NodePath<ClassMethod>) => {
|
|
278
|
+
const methodNode = methodPath.node;
|
|
279
|
+
const methodName = methodNode.key.type === 'Identifier'
|
|
280
|
+
? methodNode.key.name
|
|
281
|
+
: (methodNode.key as { value?: string }).value || 'anonymous';
|
|
282
|
+
|
|
283
|
+
// Skip if not method of current class (nested classes)
|
|
284
|
+
if (methodPath.parent !== classNode.body) {
|
|
285
|
+
return;
|
|
286
|
+
}
|
|
287
|
+
|
|
288
|
+
const functionId = `FUNCTION#${className}.${methodName}#${module.file}#${methodNode.loc!.start.line}:${methodNode.loc!.start.column}`;
|
|
289
|
+
|
|
290
|
+
// Add method to class methods list for CONTAINS edges
|
|
291
|
+
currentClass.methods.push(functionId);
|
|
292
|
+
|
|
293
|
+
const funcData: ClassFunctionInfo = {
|
|
294
|
+
id: functionId,
|
|
295
|
+
stableId: functionId,
|
|
296
|
+
type: 'FUNCTION',
|
|
297
|
+
name: methodName,
|
|
298
|
+
file: module.file,
|
|
299
|
+
line: methodNode.loc!.start.line,
|
|
300
|
+
column: methodNode.loc!.start.column,
|
|
301
|
+
async: methodNode.async || false,
|
|
302
|
+
generator: methodNode.generator || false,
|
|
303
|
+
isClassMethod: true,
|
|
304
|
+
className: className,
|
|
305
|
+
methodKind: methodNode.kind as 'constructor' | 'method' | 'get' | 'set'
|
|
306
|
+
};
|
|
307
|
+
(functions as ClassFunctionInfo[]).push(funcData);
|
|
308
|
+
|
|
309
|
+
// Extract method decorators
|
|
310
|
+
const methodNodeWithDecorators = methodNode as ClassMethod & { decorators?: Decorator[] };
|
|
311
|
+
if (methodNodeWithDecorators.decorators && methodNodeWithDecorators.decorators.length > 0 && decorators) {
|
|
312
|
+
for (const decorator of methodNodeWithDecorators.decorators) {
|
|
313
|
+
const decoratorInfo = this.extractDecoratorInfo(decorator, functionId, 'METHOD', module);
|
|
314
|
+
if (decoratorInfo) {
|
|
315
|
+
(decorators as DecoratorInfo[]).push(decoratorInfo);
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
|
|
320
|
+
// Create SCOPE for method body
|
|
321
|
+
const methodBodyScopeId = `SCOPE#${className}.${methodName}:body#${module.file}#${methodNode.loc!.start.line}`;
|
|
322
|
+
(scopes as ScopeInfo[]).push({
|
|
323
|
+
id: methodBodyScopeId,
|
|
324
|
+
type: 'SCOPE',
|
|
325
|
+
scopeType: 'method_body',
|
|
326
|
+
name: `${className}.${methodName}:body`,
|
|
327
|
+
conditional: false,
|
|
328
|
+
file: module.file,
|
|
329
|
+
line: methodNode.loc!.start.line,
|
|
330
|
+
parentFunctionId: functionId
|
|
331
|
+
});
|
|
332
|
+
|
|
333
|
+
analyzeFunctionBody(methodPath, methodBodyScopeId, module, collections);
|
|
334
|
+
}
|
|
335
|
+
});
|
|
336
|
+
}
|
|
337
|
+
};
|
|
338
|
+
}
|
|
339
|
+
}
|
|
@@ -0,0 +1,273 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* FunctionVisitor - handles function declarations and arrow functions
|
|
3
|
+
*
|
|
4
|
+
* Handles:
|
|
5
|
+
* - FunctionDeclaration
|
|
6
|
+
* - ArrowFunctionExpression (module-level)
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
import type {
|
|
10
|
+
Node,
|
|
11
|
+
Function,
|
|
12
|
+
FunctionDeclaration,
|
|
13
|
+
ArrowFunctionExpression,
|
|
14
|
+
Identifier,
|
|
15
|
+
AssignmentPattern,
|
|
16
|
+
RestElement,
|
|
17
|
+
VariableDeclarator
|
|
18
|
+
} from '@babel/types';
|
|
19
|
+
import type { NodePath } from '@babel/traverse';
|
|
20
|
+
import { ASTVisitor, type VisitorModule, type VisitorCollections, type VisitorHandlers, type CounterRef } from './ASTVisitor.js';
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* Scope context for generating stable semantic IDs
|
|
24
|
+
*/
|
|
25
|
+
interface ScopeContext {
|
|
26
|
+
semanticPath: string;
|
|
27
|
+
siblingCounters: Map<string, number>;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* Parameter node info
|
|
32
|
+
*/
|
|
33
|
+
interface ParameterInfo {
|
|
34
|
+
id: string;
|
|
35
|
+
type: 'PARAMETER';
|
|
36
|
+
name: string;
|
|
37
|
+
file: string;
|
|
38
|
+
line: number;
|
|
39
|
+
index: number;
|
|
40
|
+
hasDefault?: boolean;
|
|
41
|
+
isRest?: boolean;
|
|
42
|
+
parentFunctionId: string;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* Function node info
|
|
47
|
+
*/
|
|
48
|
+
interface FunctionInfo {
|
|
49
|
+
id: string;
|
|
50
|
+
stableId: string;
|
|
51
|
+
type: 'FUNCTION';
|
|
52
|
+
name: string;
|
|
53
|
+
file: string;
|
|
54
|
+
line: number;
|
|
55
|
+
column?: number;
|
|
56
|
+
async: boolean;
|
|
57
|
+
generator?: boolean;
|
|
58
|
+
arrowFunction?: boolean;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* Scope node info
|
|
63
|
+
*/
|
|
64
|
+
interface ScopeInfo {
|
|
65
|
+
id: string;
|
|
66
|
+
type: 'SCOPE';
|
|
67
|
+
scopeType: string;
|
|
68
|
+
name: string;
|
|
69
|
+
conditional?: boolean;
|
|
70
|
+
file: string;
|
|
71
|
+
line: number;
|
|
72
|
+
parentFunctionId: string;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
/**
|
|
76
|
+
* Callback type for analyzing function bodies
|
|
77
|
+
*/
|
|
78
|
+
export type AnalyzeFunctionBodyCallback = (
|
|
79
|
+
path: NodePath<Function>,
|
|
80
|
+
scopeId: string,
|
|
81
|
+
module: VisitorModule,
|
|
82
|
+
collections: VisitorCollections
|
|
83
|
+
) => void;
|
|
84
|
+
|
|
85
|
+
export class FunctionVisitor extends ASTVisitor {
|
|
86
|
+
private analyzeFunctionBody: AnalyzeFunctionBodyCallback;
|
|
87
|
+
|
|
88
|
+
/**
|
|
89
|
+
* @param module - Current module being analyzed
|
|
90
|
+
* @param collections - Must contain arrays and counter refs
|
|
91
|
+
* @param analyzeFunctionBody - Callback to analyze function internals
|
|
92
|
+
*/
|
|
93
|
+
constructor(
|
|
94
|
+
module: VisitorModule,
|
|
95
|
+
collections: VisitorCollections,
|
|
96
|
+
analyzeFunctionBody: AnalyzeFunctionBodyCallback
|
|
97
|
+
) {
|
|
98
|
+
super(module, collections);
|
|
99
|
+
this.analyzeFunctionBody = analyzeFunctionBody;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
getHandlers(): VisitorHandlers {
|
|
103
|
+
const { module } = this;
|
|
104
|
+
const functions = this.collections.functions ?? [];
|
|
105
|
+
const parameters = this.collections.parameters ?? [];
|
|
106
|
+
const scopes = this.collections.scopes ?? [];
|
|
107
|
+
const functionCounterRef = (this.collections.functionCounterRef ?? { value: 0 }) as CounterRef;
|
|
108
|
+
const moduleScopeCtx = this.collections.moduleScopeCtx as ScopeContext | undefined;
|
|
109
|
+
|
|
110
|
+
const analyzeFunctionBody = this.analyzeFunctionBody;
|
|
111
|
+
const collections = this.collections;
|
|
112
|
+
|
|
113
|
+
// Helper function to generate stable anonymous function name
|
|
114
|
+
const generateAnonymousName = (): string => {
|
|
115
|
+
if (!moduleScopeCtx) return 'anonymous';
|
|
116
|
+
const index = moduleScopeCtx.siblingCounters.get('anonymous') || 0;
|
|
117
|
+
moduleScopeCtx.siblingCounters.set('anonymous', index + 1);
|
|
118
|
+
return `anonymous[${index}]`;
|
|
119
|
+
};
|
|
120
|
+
|
|
121
|
+
// Helper function to create PARAMETER nodes for function params
|
|
122
|
+
const createParameterNodes = (
|
|
123
|
+
params: Node[],
|
|
124
|
+
functionId: string,
|
|
125
|
+
file: string,
|
|
126
|
+
line: number
|
|
127
|
+
): void => {
|
|
128
|
+
if (!parameters) return; // Guard for backward compatibility
|
|
129
|
+
|
|
130
|
+
params.forEach((param, index) => {
|
|
131
|
+
// Handle different parameter types
|
|
132
|
+
if (param.type === 'Identifier') {
|
|
133
|
+
const paramId = `PARAMETER#${param.name}#${file}#${line}:${index}`;
|
|
134
|
+
(parameters as ParameterInfo[]).push({
|
|
135
|
+
id: paramId,
|
|
136
|
+
type: 'PARAMETER',
|
|
137
|
+
name: param.name,
|
|
138
|
+
file: file,
|
|
139
|
+
line: param.loc?.start.line || line,
|
|
140
|
+
index: index,
|
|
141
|
+
parentFunctionId: functionId
|
|
142
|
+
});
|
|
143
|
+
} else if (param.type === 'AssignmentPattern') {
|
|
144
|
+
// Default parameter: function(a = 1)
|
|
145
|
+
const assignmentParam = param as AssignmentPattern;
|
|
146
|
+
if (assignmentParam.left.type === 'Identifier') {
|
|
147
|
+
const paramId = `PARAMETER#${assignmentParam.left.name}#${file}#${line}:${index}`;
|
|
148
|
+
(parameters as ParameterInfo[]).push({
|
|
149
|
+
id: paramId,
|
|
150
|
+
type: 'PARAMETER',
|
|
151
|
+
name: assignmentParam.left.name,
|
|
152
|
+
file: file,
|
|
153
|
+
line: assignmentParam.left.loc?.start.line || line,
|
|
154
|
+
index: index,
|
|
155
|
+
hasDefault: true,
|
|
156
|
+
parentFunctionId: functionId
|
|
157
|
+
});
|
|
158
|
+
}
|
|
159
|
+
} else if ((param as Node).type === 'RestElement') {
|
|
160
|
+
// Rest parameter: function(...args)
|
|
161
|
+
const restParam = param as unknown as RestElement;
|
|
162
|
+
if (restParam.argument.type === 'Identifier') {
|
|
163
|
+
const paramId = `PARAMETER#${restParam.argument.name}#${file}#${line}:${index}`;
|
|
164
|
+
(parameters as ParameterInfo[]).push({
|
|
165
|
+
id: paramId,
|
|
166
|
+
type: 'PARAMETER',
|
|
167
|
+
name: restParam.argument.name,
|
|
168
|
+
file: file,
|
|
169
|
+
line: restParam.argument.loc?.start.line || line,
|
|
170
|
+
index: index,
|
|
171
|
+
isRest: true,
|
|
172
|
+
parentFunctionId: functionId
|
|
173
|
+
});
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
// ObjectPattern and ArrayPattern (destructuring parameters) can be added later
|
|
177
|
+
});
|
|
178
|
+
};
|
|
179
|
+
|
|
180
|
+
return {
|
|
181
|
+
// Regular function declarations
|
|
182
|
+
FunctionDeclaration: (path: NodePath) => {
|
|
183
|
+
const node = path.node as FunctionDeclaration;
|
|
184
|
+
if (!node.id) return; // Skip anonymous function declarations
|
|
185
|
+
|
|
186
|
+
const functionId = `FUNCTION#${node.id.name}#${module.file}#${node.loc!.start.line}`;
|
|
187
|
+
|
|
188
|
+
(functions as FunctionInfo[]).push({
|
|
189
|
+
id: functionId,
|
|
190
|
+
stableId: functionId,
|
|
191
|
+
type: 'FUNCTION',
|
|
192
|
+
name: node.id.name,
|
|
193
|
+
file: module.file,
|
|
194
|
+
line: node.loc!.start.line,
|
|
195
|
+
async: node.async || false,
|
|
196
|
+
generator: node.generator || false
|
|
197
|
+
});
|
|
198
|
+
|
|
199
|
+
// Create PARAMETER nodes for function parameters
|
|
200
|
+
createParameterNodes(node.params, functionId, module.file, node.loc!.start.line);
|
|
201
|
+
|
|
202
|
+
// Create SCOPE for function body
|
|
203
|
+
const functionBodyScopeId = `SCOPE#${node.id.name}:body#${module.file}#${node.loc!.start.line}`;
|
|
204
|
+
(scopes as ScopeInfo[]).push({
|
|
205
|
+
id: functionBodyScopeId,
|
|
206
|
+
type: 'SCOPE',
|
|
207
|
+
scopeType: 'function_body',
|
|
208
|
+
name: `${node.id.name}:body`,
|
|
209
|
+
conditional: false,
|
|
210
|
+
file: module.file,
|
|
211
|
+
line: node.loc!.start.line,
|
|
212
|
+
parentFunctionId: functionId
|
|
213
|
+
});
|
|
214
|
+
|
|
215
|
+
// Analyze function body
|
|
216
|
+
analyzeFunctionBody(path as NodePath<FunctionDeclaration>, functionBodyScopeId, module, collections);
|
|
217
|
+
|
|
218
|
+
// Stop traversal - analyzeFunctionBody already processed contents
|
|
219
|
+
path.skip();
|
|
220
|
+
},
|
|
221
|
+
|
|
222
|
+
// Arrow functions (module-level, assigned to variables or as callbacks)
|
|
223
|
+
ArrowFunctionExpression: (path: NodePath) => {
|
|
224
|
+
const node = path.node as ArrowFunctionExpression;
|
|
225
|
+
const line = node.loc!.start.line;
|
|
226
|
+
const column = node.loc!.start.column;
|
|
227
|
+
|
|
228
|
+
// Determine arrow function name (use scope-level counter for stable semanticId)
|
|
229
|
+
let functionName = generateAnonymousName();
|
|
230
|
+
|
|
231
|
+
// If arrow function is assigned to variable: const add = () => {}
|
|
232
|
+
const parent = path.parent;
|
|
233
|
+
if (parent.type === 'VariableDeclarator') {
|
|
234
|
+
const declarator = parent as VariableDeclarator;
|
|
235
|
+
if (declarator.id.type === 'Identifier') {
|
|
236
|
+
functionName = declarator.id.name;
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
const functionId = `FUNCTION#${functionName}#${module.file}#${line}:${column}:${functionCounterRef.value++}`;
|
|
241
|
+
|
|
242
|
+
(functions as FunctionInfo[]).push({
|
|
243
|
+
id: functionId,
|
|
244
|
+
stableId: functionId,
|
|
245
|
+
type: 'FUNCTION',
|
|
246
|
+
name: functionName,
|
|
247
|
+
file: module.file,
|
|
248
|
+
line,
|
|
249
|
+
column,
|
|
250
|
+
async: node.async || false,
|
|
251
|
+
arrowFunction: true
|
|
252
|
+
});
|
|
253
|
+
|
|
254
|
+
// Create PARAMETER nodes for arrow function parameters
|
|
255
|
+
createParameterNodes(node.params, functionId, module.file, line);
|
|
256
|
+
|
|
257
|
+
// Create SCOPE for arrow function body
|
|
258
|
+
const bodyScope = `SCOPE#${functionName}:body#${module.file}#${line}:${column}`;
|
|
259
|
+
(scopes as ScopeInfo[]).push({
|
|
260
|
+
id: bodyScope,
|
|
261
|
+
type: 'SCOPE',
|
|
262
|
+
name: `${functionName}:body`,
|
|
263
|
+
file: module.file,
|
|
264
|
+
line,
|
|
265
|
+
scopeType: 'function-body',
|
|
266
|
+
parentFunctionId: functionId
|
|
267
|
+
});
|
|
268
|
+
|
|
269
|
+
analyzeFunctionBody(path as NodePath<ArrowFunctionExpression>, bodyScope, module, collections);
|
|
270
|
+
}
|
|
271
|
+
};
|
|
272
|
+
}
|
|
273
|
+
}
|