@grafema/core 0.1.0-alpha.5 → 0.2.0-beta
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/README.md +0 -1
- package/dist/Orchestrator.d.ts +31 -2
- package/dist/Orchestrator.d.ts.map +1 -1
- package/dist/Orchestrator.js +222 -27
- package/dist/config/ConfigLoader.d.ts +90 -0
- package/dist/config/ConfigLoader.d.ts.map +1 -0
- package/dist/config/ConfigLoader.js +249 -0
- package/dist/config/index.d.ts +6 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +4 -0
- package/dist/core/ASTWorker.d.ts +11 -36
- package/dist/core/ASTWorker.d.ts.map +1 -1
- package/dist/core/ASTWorker.js +93 -99
- package/dist/core/CoverageAnalyzer.d.ts +65 -0
- package/dist/core/CoverageAnalyzer.d.ts.map +1 -0
- package/dist/core/CoverageAnalyzer.js +198 -0
- package/dist/core/FileExplainer.d.ts +101 -0
- package/dist/core/FileExplainer.d.ts.map +1 -0
- package/dist/core/FileExplainer.js +139 -0
- package/dist/core/FileNodeManager.d.ts +40 -0
- package/dist/core/FileNodeManager.d.ts.map +1 -0
- package/dist/core/FileNodeManager.js +84 -0
- package/dist/core/GraphFreshnessChecker.d.ts +33 -0
- package/dist/core/GraphFreshnessChecker.d.ts.map +1 -0
- package/dist/core/GraphFreshnessChecker.js +101 -0
- package/dist/core/HashUtils.d.ts +24 -0
- package/dist/core/HashUtils.d.ts.map +1 -0
- package/dist/core/HashUtils.js +45 -0
- package/dist/core/IncrementalReanalyzer.d.ts +36 -0
- package/dist/core/IncrementalReanalyzer.d.ts.map +1 -0
- package/dist/core/IncrementalReanalyzer.js +132 -0
- package/dist/core/NodeFactory.d.ts +266 -19
- package/dist/core/NodeFactory.d.ts.map +1 -1
- package/dist/core/NodeFactory.js +256 -21
- package/dist/core/ScopeTracker.d.ts +84 -0
- package/dist/core/ScopeTracker.d.ts.map +1 -0
- package/dist/core/ScopeTracker.js +116 -0
- package/dist/core/SemanticId.d.ts +90 -0
- package/dist/core/SemanticId.d.ts.map +1 -0
- package/dist/core/SemanticId.js +115 -0
- package/dist/core/VersionManager.d.ts.map +1 -1
- package/dist/core/VersionManager.js +3 -2
- package/dist/core/nodes/ArgumentExpressionNode.d.ts +43 -0
- package/dist/core/nodes/ArgumentExpressionNode.d.ts.map +1 -0
- package/dist/core/nodes/ArgumentExpressionNode.js +60 -0
- package/dist/core/nodes/ArrayLiteralNode.d.ts +27 -0
- package/dist/core/nodes/ArrayLiteralNode.d.ts.map +1 -0
- package/dist/core/nodes/ArrayLiteralNode.js +43 -0
- package/dist/core/nodes/BranchNode.d.ts +41 -0
- package/dist/core/nodes/BranchNode.d.ts.map +1 -0
- package/dist/core/nodes/BranchNode.js +82 -0
- package/dist/core/nodes/CallSiteNode.d.ts +30 -2
- package/dist/core/nodes/CallSiteNode.d.ts.map +1 -1
- package/dist/core/nodes/CallSiteNode.js +54 -4
- package/dist/core/nodes/CaseNode.d.ts +43 -0
- package/dist/core/nodes/CaseNode.d.ts.map +1 -0
- package/dist/core/nodes/CaseNode.js +81 -0
- package/dist/core/nodes/ClassNode.d.ts +34 -2
- package/dist/core/nodes/ClassNode.d.ts.map +1 -1
- package/dist/core/nodes/ClassNode.js +52 -4
- package/dist/core/nodes/ConstantNode.d.ts +2 -2
- package/dist/core/nodes/ConstantNode.d.ts.map +1 -1
- package/dist/core/nodes/ConstantNode.js +6 -4
- package/dist/core/nodes/ConstructorCallNode.d.ts +51 -0
- package/dist/core/nodes/ConstructorCallNode.d.ts.map +1 -0
- package/dist/core/nodes/ConstructorCallNode.js +171 -0
- package/dist/core/nodes/DatabaseQueryNode.d.ts +3 -2
- package/dist/core/nodes/DatabaseQueryNode.d.ts.map +1 -1
- package/dist/core/nodes/DatabaseQueryNode.js +5 -2
- package/dist/core/nodes/DecoratorNode.d.ts +42 -0
- package/dist/core/nodes/DecoratorNode.d.ts.map +1 -0
- package/dist/core/nodes/DecoratorNode.js +64 -0
- package/dist/core/nodes/EnumNode.d.ts +42 -0
- package/dist/core/nodes/EnumNode.d.ts.map +1 -0
- package/dist/core/nodes/EnumNode.js +56 -0
- package/dist/core/nodes/EventListenerNode.d.ts +4 -4
- package/dist/core/nodes/EventListenerNode.d.ts.map +1 -1
- package/dist/core/nodes/EventListenerNode.js +7 -4
- package/dist/core/nodes/ExportNode.d.ts +38 -2
- package/dist/core/nodes/ExportNode.d.ts.map +1 -1
- package/dist/core/nodes/ExportNode.js +54 -4
- package/dist/core/nodes/ExpressionNode.d.ts +97 -0
- package/dist/core/nodes/ExpressionNode.d.ts.map +1 -0
- package/dist/core/nodes/ExpressionNode.js +180 -0
- package/dist/core/nodes/ExternalModuleNode.d.ts +32 -0
- package/dist/core/nodes/ExternalModuleNode.d.ts.map +1 -0
- package/dist/core/nodes/ExternalModuleNode.js +49 -0
- package/dist/core/nodes/ExternalStdioNode.d.ts +13 -6
- package/dist/core/nodes/ExternalStdioNode.d.ts.map +1 -1
- package/dist/core/nodes/ExternalStdioNode.js +15 -8
- package/dist/core/nodes/FunctionNode.d.ts +36 -0
- package/dist/core/nodes/FunctionNode.d.ts.map +1 -1
- package/dist/core/nodes/FunctionNode.js +80 -1
- package/dist/core/nodes/HttpRequestNode.d.ts +4 -4
- package/dist/core/nodes/HttpRequestNode.d.ts.map +1 -1
- package/dist/core/nodes/HttpRequestNode.js +7 -4
- package/dist/core/nodes/ImportNode.d.ts +28 -6
- package/dist/core/nodes/ImportNode.d.ts.map +1 -1
- package/dist/core/nodes/ImportNode.js +43 -8
- package/dist/core/nodes/InterfaceNode.d.ts +46 -0
- package/dist/core/nodes/InterfaceNode.d.ts.map +1 -0
- package/dist/core/nodes/InterfaceNode.js +57 -0
- package/dist/core/nodes/IssueNode.d.ts +73 -0
- package/dist/core/nodes/IssueNode.d.ts.map +1 -0
- package/dist/core/nodes/IssueNode.js +129 -0
- package/dist/core/nodes/LiteralNode.d.ts +2 -2
- package/dist/core/nodes/LiteralNode.d.ts.map +1 -1
- package/dist/core/nodes/LiteralNode.js +6 -4
- package/dist/core/nodes/MethodCallNode.d.ts +32 -2
- package/dist/core/nodes/MethodCallNode.d.ts.map +1 -1
- package/dist/core/nodes/MethodCallNode.js +57 -4
- package/dist/core/nodes/MethodNode.d.ts +34 -2
- package/dist/core/nodes/MethodNode.d.ts.map +1 -1
- package/dist/core/nodes/MethodNode.js +55 -3
- package/dist/core/nodes/ModuleNode.d.ts +31 -0
- package/dist/core/nodes/ModuleNode.d.ts.map +1 -1
- package/dist/core/nodes/ModuleNode.js +37 -0
- package/dist/core/nodes/NetworkRequestNode.d.ts +54 -0
- package/dist/core/nodes/NetworkRequestNode.d.ts.map +1 -0
- package/dist/core/nodes/NetworkRequestNode.js +65 -0
- package/dist/core/nodes/ObjectLiteralNode.d.ts +27 -0
- package/dist/core/nodes/ObjectLiteralNode.d.ts.map +1 -0
- package/dist/core/nodes/ObjectLiteralNode.js +43 -0
- package/dist/core/nodes/ParameterNode.d.ts +2 -2
- package/dist/core/nodes/ParameterNode.d.ts.map +1 -1
- package/dist/core/nodes/ParameterNode.js +5 -3
- package/dist/core/nodes/ScopeNode.d.ts +31 -0
- package/dist/core/nodes/ScopeNode.d.ts.map +1 -1
- package/dist/core/nodes/ScopeNode.js +49 -0
- package/dist/core/nodes/TypeNode.d.ts +36 -0
- package/dist/core/nodes/TypeNode.d.ts.map +1 -0
- package/dist/core/nodes/TypeNode.js +55 -0
- package/dist/core/nodes/VariableDeclarationNode.d.ts +29 -2
- package/dist/core/nodes/VariableDeclarationNode.d.ts.map +1 -1
- package/dist/core/nodes/VariableDeclarationNode.js +48 -4
- package/dist/core/nodes/index.d.ts +15 -1
- package/dist/core/nodes/index.d.ts.map +1 -1
- package/dist/core/nodes/index.js +17 -0
- package/dist/data/builtins/BuiltinRegistry.d.ts +78 -0
- package/dist/data/builtins/BuiltinRegistry.d.ts.map +1 -0
- package/dist/data/builtins/BuiltinRegistry.js +110 -0
- package/dist/data/builtins/definitions.d.ts +28 -0
- package/dist/data/builtins/definitions.d.ts.map +1 -0
- package/dist/data/builtins/definitions.js +250 -0
- package/dist/data/builtins/index.d.ts +10 -0
- package/dist/data/builtins/index.d.ts.map +1 -0
- package/dist/data/builtins/index.js +8 -0
- package/dist/data/builtins/jsGlobals.d.ts +18 -0
- package/dist/data/builtins/jsGlobals.d.ts.map +1 -0
- package/dist/data/builtins/jsGlobals.js +26 -0
- package/dist/data/builtins/types.d.ts +34 -0
- package/dist/data/builtins/types.d.ts.map +1 -0
- package/dist/data/builtins/types.js +7 -0
- package/dist/data/globals/definitions.d.ts +27 -0
- package/dist/data/globals/definitions.d.ts.map +1 -0
- package/dist/data/globals/definitions.js +117 -0
- package/dist/data/globals/index.d.ts +36 -0
- package/dist/data/globals/index.d.ts.map +1 -0
- package/dist/data/globals/index.js +52 -0
- package/dist/diagnostics/DiagnosticCollector.d.ts +98 -0
- package/dist/diagnostics/DiagnosticCollector.d.ts.map +1 -0
- package/dist/diagnostics/DiagnosticCollector.js +129 -0
- package/dist/diagnostics/DiagnosticReporter.d.ts +100 -0
- package/dist/diagnostics/DiagnosticReporter.d.ts.map +1 -0
- package/dist/diagnostics/DiagnosticReporter.js +247 -0
- package/dist/diagnostics/DiagnosticWriter.d.ts +31 -0
- package/dist/diagnostics/DiagnosticWriter.d.ts.map +1 -0
- package/dist/diagnostics/DiagnosticWriter.js +43 -0
- package/dist/diagnostics/index.d.ts +14 -0
- package/dist/diagnostics/index.d.ts.map +1 -0
- package/dist/diagnostics/index.js +11 -0
- package/dist/errors/GrafemaError.d.ts +161 -0
- package/dist/errors/GrafemaError.d.ts.map +1 -0
- package/dist/errors/GrafemaError.js +181 -0
- package/dist/index.d.ts +73 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +70 -1
- package/dist/logging/Logger.d.ts +48 -0
- package/dist/logging/Logger.d.ts.map +1 -0
- package/dist/logging/Logger.js +134 -0
- package/dist/plugins/Plugin.d.ts +5 -1
- package/dist/plugins/Plugin.d.ts.map +1 -1
- package/dist/plugins/Plugin.js +33 -0
- package/dist/plugins/analysis/DatabaseAnalyzer.d.ts.map +1 -1
- package/dist/plugins/analysis/DatabaseAnalyzer.js +14 -6
- package/dist/plugins/analysis/ExpressAnalyzer.d.ts.map +1 -1
- package/dist/plugins/analysis/ExpressAnalyzer.js +29 -19
- package/dist/plugins/analysis/ExpressResponseAnalyzer.d.ts +148 -0
- package/dist/plugins/analysis/ExpressResponseAnalyzer.d.ts.map +1 -0
- package/dist/plugins/analysis/ExpressResponseAnalyzer.js +495 -0
- package/dist/plugins/analysis/ExpressRouteAnalyzer.d.ts.map +1 -1
- package/dist/plugins/analysis/ExpressRouteAnalyzer.js +71 -29
- package/dist/plugins/analysis/FetchAnalyzer.d.ts +41 -0
- package/dist/plugins/analysis/FetchAnalyzer.d.ts.map +1 -1
- package/dist/plugins/analysis/FetchAnalyzer.js +187 -19
- package/dist/plugins/analysis/IncrementalAnalysisPlugin.d.ts +6 -3
- package/dist/plugins/analysis/IncrementalAnalysisPlugin.d.ts.map +1 -1
- package/dist/plugins/analysis/IncrementalAnalysisPlugin.js +76 -80
- package/dist/plugins/analysis/JSASTAnalyzer.d.ts +313 -19
- package/dist/plugins/analysis/JSASTAnalyzer.d.ts.map +1 -1
- package/dist/plugins/analysis/JSASTAnalyzer.js +3430 -503
- package/dist/plugins/analysis/ReactAnalyzer.d.ts.map +1 -1
- package/dist/plugins/analysis/ReactAnalyzer.js +56 -57
- package/dist/plugins/analysis/RustAnalyzer.d.ts.map +1 -1
- package/dist/plugins/analysis/RustAnalyzer.js +16 -11
- package/dist/plugins/analysis/SQLiteAnalyzer.d.ts.map +1 -1
- package/dist/plugins/analysis/SQLiteAnalyzer.js +11 -7
- package/dist/plugins/analysis/ServiceLayerAnalyzer.d.ts.map +1 -1
- package/dist/plugins/analysis/ServiceLayerAnalyzer.js +21 -9
- package/dist/plugins/analysis/SocketIOAnalyzer.d.ts +9 -0
- package/dist/plugins/analysis/SocketIOAnalyzer.d.ts.map +1 -1
- package/dist/plugins/analysis/SocketIOAnalyzer.js +117 -21
- package/dist/plugins/analysis/SystemDbAnalyzer.d.ts.map +1 -1
- package/dist/plugins/analysis/SystemDbAnalyzer.js +15 -5
- package/dist/plugins/analysis/ast/GraphBuilder.d.ts +207 -4
- package/dist/plugins/analysis/ast/GraphBuilder.d.ts.map +1 -1
- package/dist/plugins/analysis/ast/GraphBuilder.js +1527 -316
- package/dist/plugins/analysis/ast/IdGenerator.d.ts +105 -0
- package/dist/plugins/analysis/ast/IdGenerator.d.ts.map +1 -0
- package/dist/plugins/analysis/ast/IdGenerator.js +116 -0
- package/dist/plugins/analysis/ast/types.d.ts +470 -5
- package/dist/plugins/analysis/ast/types.d.ts.map +1 -1
- package/dist/plugins/analysis/ast/utils/createParameterNodes.d.ts +33 -0
- package/dist/plugins/analysis/ast/utils/createParameterNodes.d.ts.map +1 -0
- package/dist/plugins/analysis/ast/utils/createParameterNodes.js +89 -0
- package/dist/plugins/analysis/ast/utils/index.d.ts +6 -0
- package/dist/plugins/analysis/ast/utils/index.d.ts.map +1 -0
- package/dist/plugins/analysis/ast/utils/index.js +5 -0
- package/dist/plugins/analysis/ast/utils/location.d.ts +87 -0
- package/dist/plugins/analysis/ast/utils/location.d.ts.map +1 -0
- package/dist/plugins/analysis/ast/utils/location.js +78 -0
- package/dist/plugins/analysis/ast/visitors/ASTVisitor.d.ts +14 -5
- package/dist/plugins/analysis/ast/visitors/ASTVisitor.d.ts.map +1 -1
- package/dist/plugins/analysis/ast/visitors/ASTVisitor.js +6 -5
- package/dist/plugins/analysis/ast/visitors/CallExpressionVisitor.d.ts +100 -9
- package/dist/plugins/analysis/ast/visitors/CallExpressionVisitor.d.ts.map +1 -1
- package/dist/plugins/analysis/ast/visitors/CallExpressionVisitor.js +674 -125
- package/dist/plugins/analysis/ast/visitors/ClassVisitor.d.ts +4 -1
- package/dist/plugins/analysis/ast/visitors/ClassVisitor.d.ts.map +1 -1
- package/dist/plugins/analysis/ast/visitors/ClassVisitor.js +72 -32
- package/dist/plugins/analysis/ast/visitors/FunctionVisitor.d.ts +14 -1
- package/dist/plugins/analysis/ast/visitors/FunctionVisitor.d.ts.map +1 -1
- package/dist/plugins/analysis/ast/visitors/FunctionVisitor.js +190 -63
- package/dist/plugins/analysis/ast/visitors/ImportExportVisitor.d.ts +4 -0
- package/dist/plugins/analysis/ast/visitors/ImportExportVisitor.d.ts.map +1 -1
- package/dist/plugins/analysis/ast/visitors/ImportExportVisitor.js +112 -8
- package/dist/plugins/analysis/ast/visitors/TypeScriptVisitor.d.ts +12 -1
- package/dist/plugins/analysis/ast/visitors/TypeScriptVisitor.d.ts.map +1 -1
- package/dist/plugins/analysis/ast/visitors/TypeScriptVisitor.js +36 -14
- package/dist/plugins/analysis/ast/visitors/VariableVisitor.d.ts +20 -2
- package/dist/plugins/analysis/ast/visitors/VariableVisitor.d.ts.map +1 -1
- package/dist/plugins/analysis/ast/visitors/VariableVisitor.js +243 -45
- package/dist/plugins/discovery/MonorepoServiceDiscovery.d.ts.map +1 -1
- package/dist/plugins/discovery/MonorepoServiceDiscovery.js +3 -2
- package/dist/plugins/discovery/SimpleProjectDiscovery.d.ts.map +1 -1
- package/dist/plugins/discovery/SimpleProjectDiscovery.js +5 -1
- package/dist/plugins/discovery/WorkspaceDiscovery.d.ts +22 -0
- package/dist/plugins/discovery/WorkspaceDiscovery.d.ts.map +1 -0
- package/dist/plugins/discovery/WorkspaceDiscovery.js +141 -0
- package/dist/plugins/discovery/resolveSourceEntrypoint.d.ts +46 -0
- package/dist/plugins/discovery/resolveSourceEntrypoint.d.ts.map +1 -0
- package/dist/plugins/discovery/resolveSourceEntrypoint.js +86 -0
- package/dist/plugins/discovery/workspaces/detector.d.ts +21 -0
- package/dist/plugins/discovery/workspaces/detector.d.ts.map +1 -0
- package/dist/plugins/discovery/workspaces/detector.js +49 -0
- package/dist/plugins/discovery/workspaces/globResolver.d.ts +35 -0
- package/dist/plugins/discovery/workspaces/globResolver.d.ts.map +1 -0
- package/dist/plugins/discovery/workspaces/globResolver.js +184 -0
- package/dist/plugins/discovery/workspaces/index.d.ts +9 -0
- package/dist/plugins/discovery/workspaces/index.d.ts.map +1 -0
- package/dist/plugins/discovery/workspaces/index.js +8 -0
- package/dist/plugins/discovery/workspaces/parsers.d.ts +38 -0
- package/dist/plugins/discovery/workspaces/parsers.d.ts.map +1 -0
- package/dist/plugins/discovery/workspaces/parsers.js +80 -0
- package/dist/plugins/enrichment/AliasTracker.d.ts.map +1 -1
- package/dist/plugins/enrichment/AliasTracker.js +29 -8
- package/dist/plugins/enrichment/ArgumentParameterLinker.d.ts +32 -0
- package/dist/plugins/enrichment/ArgumentParameterLinker.d.ts.map +1 -0
- package/dist/plugins/enrichment/ArgumentParameterLinker.js +175 -0
- package/dist/plugins/enrichment/ClosureCaptureEnricher.d.ts +51 -0
- package/dist/plugins/enrichment/ClosureCaptureEnricher.d.ts.map +1 -0
- package/dist/plugins/enrichment/ClosureCaptureEnricher.js +205 -0
- package/dist/plugins/enrichment/ExternalCallResolver.d.ts +42 -0
- package/dist/plugins/enrichment/ExternalCallResolver.d.ts.map +1 -0
- package/dist/plugins/enrichment/ExternalCallResolver.js +213 -0
- package/dist/plugins/enrichment/FunctionCallResolver.d.ts +58 -0
- package/dist/plugins/enrichment/FunctionCallResolver.d.ts.map +1 -0
- package/dist/plugins/enrichment/FunctionCallResolver.js +340 -0
- package/dist/plugins/enrichment/HTTPConnectionEnricher.d.ts +16 -3
- package/dist/plugins/enrichment/HTTPConnectionEnricher.d.ts.map +1 -1
- package/dist/plugins/enrichment/HTTPConnectionEnricher.js +78 -27
- package/dist/plugins/enrichment/ImportExportLinker.d.ts.map +1 -1
- package/dist/plugins/enrichment/ImportExportLinker.js +23 -6
- package/dist/plugins/enrichment/MethodCallResolver.d.ts.map +1 -1
- package/dist/plugins/enrichment/MethodCallResolver.js +33 -13
- package/dist/plugins/enrichment/MountPointResolver.d.ts +14 -12
- package/dist/plugins/enrichment/MountPointResolver.d.ts.map +1 -1
- package/dist/plugins/enrichment/MountPointResolver.js +173 -147
- package/dist/plugins/enrichment/NodejsBuiltinsResolver.d.ts +44 -0
- package/dist/plugins/enrichment/NodejsBuiltinsResolver.d.ts.map +1 -0
- package/dist/plugins/enrichment/NodejsBuiltinsResolver.js +271 -0
- package/dist/plugins/enrichment/PrefixEvaluator.d.ts.map +1 -1
- package/dist/plugins/enrichment/PrefixEvaluator.js +16 -7
- package/dist/plugins/enrichment/RustFFIEnricher.d.ts.map +1 -1
- package/dist/plugins/enrichment/RustFFIEnricher.js +6 -5
- package/dist/plugins/enrichment/ValueDomainAnalyzer.d.ts +22 -27
- package/dist/plugins/enrichment/ValueDomainAnalyzer.d.ts.map +1 -1
- package/dist/plugins/enrichment/ValueDomainAnalyzer.js +185 -143
- package/dist/plugins/indexing/IncrementalModuleIndexer.d.ts.map +1 -1
- package/dist/plugins/indexing/IncrementalModuleIndexer.js +23 -14
- package/dist/plugins/indexing/JSModuleIndexer.d.ts +15 -0
- package/dist/plugins/indexing/JSModuleIndexer.d.ts.map +1 -1
- package/dist/plugins/indexing/JSModuleIndexer.js +121 -31
- package/dist/plugins/indexing/RustModuleIndexer.d.ts +1 -1
- package/dist/plugins/indexing/RustModuleIndexer.d.ts.map +1 -1
- package/dist/plugins/indexing/RustModuleIndexer.js +8 -7
- package/dist/plugins/indexing/ServiceDetector.d.ts +10 -0
- package/dist/plugins/indexing/ServiceDetector.d.ts.map +1 -1
- package/dist/plugins/indexing/ServiceDetector.js +28 -15
- package/dist/plugins/validation/BrokenImportValidator.d.ts +31 -0
- package/dist/plugins/validation/BrokenImportValidator.d.ts.map +1 -0
- package/dist/plugins/validation/BrokenImportValidator.js +249 -0
- package/dist/plugins/validation/CallResolverValidator.d.ts +21 -10
- package/dist/plugins/validation/CallResolverValidator.d.ts.map +1 -1
- package/dist/plugins/validation/CallResolverValidator.js +103 -77
- package/dist/plugins/validation/DataFlowValidator.d.ts.map +1 -1
- package/dist/plugins/validation/DataFlowValidator.js +62 -49
- package/dist/plugins/validation/EvalBanValidator.d.ts.map +1 -1
- package/dist/plugins/validation/EvalBanValidator.js +17 -16
- package/dist/plugins/validation/GraphConnectivityValidator.d.ts.map +1 -1
- package/dist/plugins/validation/GraphConnectivityValidator.js +44 -24
- package/dist/plugins/validation/NodeCreationValidator.d.ts +85 -0
- package/dist/plugins/validation/NodeCreationValidator.d.ts.map +1 -0
- package/dist/plugins/validation/NodeCreationValidator.js +415 -0
- package/dist/plugins/validation/SQLInjectionValidator.d.ts.map +1 -1
- package/dist/plugins/validation/SQLInjectionValidator.js +61 -19
- package/dist/plugins/validation/ShadowingDetector.d.ts.map +1 -1
- package/dist/plugins/validation/ShadowingDetector.js +6 -5
- package/dist/plugins/validation/TypeScriptDeadCodeValidator.d.ts.map +1 -1
- package/dist/plugins/validation/TypeScriptDeadCodeValidator.js +12 -11
- package/dist/plugins/vcs/GitPlugin.d.ts.map +1 -1
- package/dist/plugins/vcs/GitPlugin.js +10 -12
- package/dist/plugins/vcs/VCSPlugin.d.ts +3 -2
- package/dist/plugins/vcs/VCSPlugin.d.ts.map +1 -1
- package/dist/plugins/vcs/VCSPlugin.js +5 -5
- package/dist/queries/findCallsInFunction.d.ts +52 -0
- package/dist/queries/findCallsInFunction.d.ts.map +1 -0
- package/dist/queries/findCallsInFunction.js +135 -0
- package/dist/queries/findContainingFunction.d.ts +45 -0
- package/dist/queries/findContainingFunction.d.ts.map +1 -0
- package/dist/queries/findContainingFunction.js +54 -0
- package/dist/queries/index.d.ts +14 -0
- package/dist/queries/index.d.ts.map +1 -0
- package/dist/queries/index.js +11 -0
- package/dist/queries/traceValues.d.ts +70 -0
- package/dist/queries/traceValues.d.ts.map +1 -0
- package/dist/queries/traceValues.js +299 -0
- package/dist/queries/types.d.ts +163 -0
- package/dist/queries/types.d.ts.map +1 -0
- package/dist/queries/types.js +9 -0
- package/dist/schema/GraphSchemaExtractor.d.ts +53 -0
- package/dist/schema/GraphSchemaExtractor.d.ts.map +1 -0
- package/dist/schema/GraphSchemaExtractor.js +124 -0
- package/dist/schema/InterfaceSchemaExtractor.d.ts +73 -0
- package/dist/schema/InterfaceSchemaExtractor.d.ts.map +1 -0
- package/dist/schema/InterfaceSchemaExtractor.js +112 -0
- package/dist/schema/index.d.ts +5 -0
- package/dist/schema/index.d.ts.map +1 -0
- package/dist/schema/index.js +2 -0
- package/dist/storage/backends/RFDBServerBackend.d.ts +21 -34
- package/dist/storage/backends/RFDBServerBackend.d.ts.map +1 -1
- package/dist/storage/backends/RFDBServerBackend.js +72 -62
- package/dist/storage/backends/typeValidation.d.ts.map +1 -1
- package/dist/storage/backends/typeValidation.js +1 -0
- package/dist/validation/PathValidator.d.ts +1 -2
- package/dist/validation/PathValidator.d.ts.map +1 -1
- package/package.json +3 -3
- package/src/Orchestrator.ts +272 -27
- package/src/config/ConfigLoader.ts +354 -0
- package/src/config/index.ts +5 -0
- package/src/core/ASTWorker.ts +143 -139
- package/src/core/CoverageAnalyzer.ts +243 -0
- package/src/core/FileExplainer.ts +179 -0
- package/src/core/FileNodeManager.ts +100 -0
- package/src/core/GraphFreshnessChecker.ts +143 -0
- package/src/core/HashUtils.ts +48 -0
- package/src/core/IncrementalReanalyzer.ts +192 -0
- package/src/core/NodeFactory.ts +470 -23
- package/src/core/ScopeTracker.ts +154 -0
- package/src/core/SemanticId.ts +192 -0
- package/src/core/VersionManager.ts +3 -2
- package/src/core/nodes/ArgumentExpressionNode.ts +89 -0
- package/src/core/nodes/ArrayLiteralNode.ts +66 -0
- package/src/core/nodes/BranchNode.ts +113 -0
- package/src/core/nodes/CallSiteNode.ts +64 -4
- package/src/core/nodes/CaseNode.ts +123 -0
- package/src/core/nodes/ClassNode.ts +67 -4
- package/src/core/nodes/ConstantNode.ts +5 -4
- package/src/core/nodes/ConstructorCallNode.ts +217 -0
- package/src/core/nodes/DatabaseQueryNode.ts +5 -1
- package/src/core/nodes/DecoratorNode.ts +92 -0
- package/src/core/nodes/EnumNode.ts +87 -0
- package/src/core/nodes/EventListenerNode.ts +7 -4
- package/src/core/nodes/ExportNode.ts +74 -4
- package/src/core/nodes/ExpressionNode.ts +232 -0
- package/src/core/nodes/ExternalModuleNode.ts +65 -0
- package/src/core/nodes/ExternalStdioNode.ts +17 -9
- package/src/core/nodes/FunctionNode.ts +101 -1
- package/src/core/nodes/HttpRequestNode.ts +7 -4
- package/src/core/nodes/ImportNode.ts +62 -13
- package/src/core/nodes/InterfaceNode.ts +92 -0
- package/src/core/nodes/IssueNode.ts +177 -0
- package/src/core/nodes/LiteralNode.ts +5 -4
- package/src/core/nodes/MethodCallNode.ts +70 -4
- package/src/core/nodes/MethodNode.ts +68 -3
- package/src/core/nodes/ModuleNode.ts +50 -0
- package/src/core/nodes/NetworkRequestNode.ts +77 -0
- package/src/core/nodes/ObjectLiteralNode.ts +66 -0
- package/src/core/nodes/ParameterNode.ts +4 -3
- package/src/core/nodes/ScopeNode.ts +65 -0
- package/src/core/nodes/TypeNode.ts +79 -0
- package/src/core/nodes/VariableDeclarationNode.ts +58 -4
- package/src/core/nodes/index.ts +21 -1
- package/src/data/builtins/BuiltinRegistry.ts +124 -0
- package/src/data/builtins/definitions.ts +267 -0
- package/src/data/builtins/index.ts +10 -0
- package/src/data/builtins/jsGlobals.ts +28 -0
- package/src/data/builtins/types.ts +36 -0
- package/src/data/globals/definitions.ts +156 -0
- package/src/data/globals/index.ts +66 -0
- package/src/diagnostics/DiagnosticCollector.ts +163 -0
- package/src/diagnostics/DiagnosticReporter.ts +324 -0
- package/src/diagnostics/DiagnosticWriter.ts +50 -0
- package/src/diagnostics/index.ts +16 -0
- package/src/errors/GrafemaError.ts +239 -0
- package/src/index.ts +193 -1
- package/src/logging/Logger.ts +152 -0
- package/src/plugins/Plugin.ts +42 -0
- package/src/plugins/analysis/DatabaseAnalyzer.ts +16 -8
- package/src/plugins/analysis/ExpressAnalyzer.ts +33 -19
- package/src/plugins/analysis/ExpressResponseAnalyzer.ts +636 -0
- package/src/plugins/analysis/ExpressRouteAnalyzer.ts +76 -36
- package/src/plugins/analysis/FetchAnalyzer.ts +232 -21
- package/src/plugins/analysis/IncrementalAnalysisPlugin.ts +84 -101
- package/src/plugins/analysis/JSASTAnalyzer.ts +4265 -587
- package/src/plugins/analysis/ReactAnalyzer.ts +57 -57
- package/src/plugins/analysis/RustAnalyzer.ts +16 -11
- package/src/plugins/analysis/SQLiteAnalyzer.ts +13 -7
- package/src/plugins/analysis/ServiceLayerAnalyzer.ts +22 -16
- package/src/plugins/analysis/SocketIOAnalyzer.ts +151 -28
- package/src/plugins/analysis/SystemDbAnalyzer.ts +16 -11
- package/src/plugins/analysis/ast/GraphBuilder.ts +1947 -327
- package/src/plugins/analysis/ast/IdGenerator.ts +177 -0
- package/src/plugins/analysis/ast/types.ts +596 -6
- package/src/plugins/analysis/ast/utils/createParameterNodes.ts +104 -0
- package/src/plugins/analysis/ast/utils/index.ts +12 -0
- package/src/plugins/analysis/ast/utils/location.ts +103 -0
- package/src/plugins/analysis/ast/visitors/ASTVisitor.ts +19 -8
- package/src/plugins/analysis/ast/visitors/CallExpressionVisitor.ts +924 -83
- package/src/plugins/analysis/ast/visitors/ClassVisitor.ts +97 -44
- package/src/plugins/analysis/ast/visitors/FunctionVisitor.ts +234 -93
- package/src/plugins/analysis/ast/visitors/ImportExportVisitor.ts +124 -9
- package/src/plugins/analysis/ast/visitors/TypeScriptVisitor.ts +41 -14
- package/src/plugins/analysis/ast/visitors/VariableVisitor.ts +294 -49
- package/src/plugins/discovery/MonorepoServiceDiscovery.ts +3 -2
- package/src/plugins/discovery/SimpleProjectDiscovery.ts +6 -1
- package/src/plugins/discovery/WorkspaceDiscovery.ts +184 -0
- package/src/plugins/discovery/resolveSourceEntrypoint.ts +103 -0
- package/src/plugins/discovery/workspaces/detector.ts +63 -0
- package/src/plugins/discovery/workspaces/globResolver.ts +229 -0
- package/src/plugins/discovery/workspaces/index.ts +23 -0
- package/src/plugins/discovery/workspaces/parsers.ts +99 -0
- package/src/plugins/enrichment/AliasTracker.ts +35 -8
- package/src/plugins/enrichment/ArgumentParameterLinker.ts +240 -0
- package/src/plugins/enrichment/ClosureCaptureEnricher.ts +267 -0
- package/src/plugins/enrichment/ExternalCallResolver.ts +262 -0
- package/src/plugins/enrichment/FunctionCallResolver.ts +456 -0
- package/src/plugins/enrichment/HTTPConnectionEnricher.ts +84 -27
- package/src/plugins/enrichment/ImportExportLinker.ts +24 -6
- package/src/plugins/enrichment/MethodCallResolver.ts +39 -13
- package/src/plugins/enrichment/MountPointResolver.ts +208 -195
- package/src/plugins/enrichment/NodejsBuiltinsResolver.ts +365 -0
- package/src/plugins/enrichment/PrefixEvaluator.ts +16 -7
- package/src/plugins/enrichment/RustFFIEnricher.ts +6 -5
- package/src/plugins/enrichment/ValueDomainAnalyzer.ts +209 -189
- package/src/plugins/indexing/IncrementalModuleIndexer.ts +23 -14
- package/src/plugins/indexing/JSModuleIndexer.ts +140 -34
- package/src/plugins/indexing/RustModuleIndexer.ts +8 -7
- package/src/plugins/validation/BrokenImportValidator.ts +325 -0
- package/src/plugins/validation/CallResolverValidator.ts +131 -110
- package/src/plugins/validation/DataFlowValidator.ts +88 -67
- package/src/plugins/validation/EvalBanValidator.ts +17 -16
- package/src/plugins/validation/GraphConnectivityValidator.ts +58 -24
- package/src/plugins/validation/NodeCreationValidator.ts +554 -0
- package/src/plugins/validation/SQLInjectionValidator.ts +63 -20
- package/src/plugins/validation/ShadowingDetector.ts +6 -5
- package/src/plugins/validation/TypeScriptDeadCodeValidator.ts +12 -11
- package/src/plugins/vcs/GitPlugin.ts +40 -12
- package/src/plugins/vcs/VCSPlugin.ts +7 -5
- package/src/queries/README.md +46 -0
- package/src/queries/findCallsInFunction.ts +206 -0
- package/src/queries/findContainingFunction.ts +83 -0
- package/src/queries/index.ts +23 -0
- package/src/queries/traceValues.ts +398 -0
- package/src/queries/types.ts +187 -0
- package/src/schema/GraphSchemaExtractor.ts +177 -0
- package/src/schema/InterfaceSchemaExtractor.ts +173 -0
- package/src/schema/index.ts +5 -0
- package/src/storage/backends/RFDBServerBackend.ts +100 -98
- package/src/storage/backends/typeValidation.ts +1 -0
- package/src/validation/PathValidator.ts +1 -1
- package/dist/core/AnalysisWorker.d.ts +0 -14
- package/dist/core/AnalysisWorker.d.ts.map +0 -1
- package/dist/core/AnalysisWorker.js +0 -307
- package/dist/core/ParallelAnalyzer.d.ts +0 -120
- package/dist/core/ParallelAnalyzer.d.ts.map +0 -1
- package/dist/core/ParallelAnalyzer.js +0 -331
- package/dist/core/QueueWorker.d.ts +0 -12
- package/dist/core/QueueWorker.d.ts.map +0 -1
- package/dist/core/QueueWorker.js +0 -567
- package/dist/core/RFDBClient.d.ts +0 -179
- package/dist/core/RFDBClient.d.ts.map +0 -1
- package/dist/core/RFDBClient.js +0 -429
- package/dist/plugins/discovery/ZonServiceDiscovery.d.ts +0 -19
- package/dist/plugins/discovery/ZonServiceDiscovery.d.ts.map +0 -1
- package/dist/plugins/discovery/ZonServiceDiscovery.js +0 -204
- package/src/core/AnalysisWorker.ts +0 -410
- package/src/core/ParallelAnalyzer.ts +0 -476
- package/src/core/QueueWorker.ts +0 -780
- package/src/plugins/indexing/ServiceDetector.ts +0 -230
|
@@ -0,0 +1,636 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ExpressResponseAnalyzer - detects Express response patterns
|
|
3
|
+
*
|
|
4
|
+
* For each http:route node:
|
|
5
|
+
* 1. Follow HANDLED_BY edge to get handler function
|
|
6
|
+
* 2. Traverse handler AST for res.json(...), res.send(...) patterns
|
|
7
|
+
* 3. Create RESPONDS_WITH edge from http:route to response argument node
|
|
8
|
+
*
|
|
9
|
+
* Patterns:
|
|
10
|
+
* - res.json({ data })
|
|
11
|
+
* - res.send(variable)
|
|
12
|
+
* - res.status(200).json(data)
|
|
13
|
+
*/
|
|
14
|
+
|
|
15
|
+
import { readFileSync } from 'fs';
|
|
16
|
+
import { parse, ParserPlugin } from '@babel/parser';
|
|
17
|
+
import traverseModule from '@babel/traverse';
|
|
18
|
+
import type { CallExpression, Identifier, MemberExpression, Node, ArrowFunctionExpression, FunctionExpression } from '@babel/types';
|
|
19
|
+
import type { NodePath } from '@babel/traverse';
|
|
20
|
+
import { Plugin, createSuccessResult, createErrorResult } from '../Plugin.js';
|
|
21
|
+
import type { PluginContext, PluginResult, PluginMetadata } from '../Plugin.js';
|
|
22
|
+
import type { NodeRecord } from '@grafema/types';
|
|
23
|
+
import { getLine } from './ast/utils/location.js';
|
|
24
|
+
|
|
25
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
26
|
+
const traverse = (traverseModule as any).default || traverseModule;
|
|
27
|
+
|
|
28
|
+
const RESPONSE_METHODS = ['json', 'send'];
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* Response call info
|
|
32
|
+
*/
|
|
33
|
+
interface ResponseCallInfo {
|
|
34
|
+
method: string; // 'json' or 'send'
|
|
35
|
+
argLine: number; // Line of the argument
|
|
36
|
+
argColumn: number; // Column of the argument
|
|
37
|
+
argType: string; // Type of the argument ('ObjectExpression', 'Identifier', etc.)
|
|
38
|
+
line: number;
|
|
39
|
+
identifierName?: string; // Actual variable name for Identifier arguments
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
export class ExpressResponseAnalyzer extends Plugin {
|
|
43
|
+
private responseNodeCounter = 0;
|
|
44
|
+
|
|
45
|
+
get metadata(): PluginMetadata {
|
|
46
|
+
return {
|
|
47
|
+
name: 'ExpressResponseAnalyzer',
|
|
48
|
+
phase: 'ANALYSIS',
|
|
49
|
+
priority: 74, // After ExpressRouteAnalyzer (75)
|
|
50
|
+
creates: {
|
|
51
|
+
nodes: [],
|
|
52
|
+
edges: ['RESPONDS_WITH']
|
|
53
|
+
},
|
|
54
|
+
dependencies: ['ExpressRouteAnalyzer', 'JSASTAnalyzer']
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
async execute(context: PluginContext): Promise<PluginResult> {
|
|
59
|
+
const logger = this.log(context);
|
|
60
|
+
|
|
61
|
+
try {
|
|
62
|
+
const { graph } = context;
|
|
63
|
+
|
|
64
|
+
// Get all http:route nodes
|
|
65
|
+
const routes: NodeRecord[] = [];
|
|
66
|
+
for await (const node of graph.queryNodes({ type: 'http:route' })) {
|
|
67
|
+
routes.push(node);
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
logger.info('Processing routes', { count: routes.length });
|
|
71
|
+
|
|
72
|
+
let edgesCreated = 0;
|
|
73
|
+
|
|
74
|
+
for (const route of routes) {
|
|
75
|
+
const result = await this.analyzeRouteResponses(route, graph);
|
|
76
|
+
edgesCreated += result;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
logger.info('Analysis complete', { edgesCreated });
|
|
80
|
+
|
|
81
|
+
return createSuccessResult(
|
|
82
|
+
{ nodes: 0, edges: edgesCreated },
|
|
83
|
+
{ routesAnalyzed: routes.length }
|
|
84
|
+
);
|
|
85
|
+
} catch (error) {
|
|
86
|
+
logger.error('Analysis failed', { error });
|
|
87
|
+
return createErrorResult(error as Error);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
/**
|
|
92
|
+
* Analyze a single http:route for response patterns
|
|
93
|
+
*/
|
|
94
|
+
private async analyzeRouteResponses(
|
|
95
|
+
route: NodeRecord,
|
|
96
|
+
graph: PluginContext['graph']
|
|
97
|
+
): Promise<number> {
|
|
98
|
+
let edgesCreated = 0;
|
|
99
|
+
|
|
100
|
+
try {
|
|
101
|
+
// Get HANDLED_BY edges to find handler function
|
|
102
|
+
const handledByEdges = await graph.getOutgoingEdges(route.id, ['HANDLED_BY']);
|
|
103
|
+
|
|
104
|
+
if (handledByEdges.length === 0) {
|
|
105
|
+
return 0;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
// Get handler function node
|
|
109
|
+
const handlerEdge = handledByEdges[0];
|
|
110
|
+
const handlerNode = await graph.getNode(handlerEdge.dst);
|
|
111
|
+
|
|
112
|
+
if (!handlerNode || !handlerNode.file) {
|
|
113
|
+
return 0;
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
// Parse the file and find response calls in handler
|
|
117
|
+
const code = readFileSync(handlerNode.file, 'utf-8');
|
|
118
|
+
const ast = parse(code, {
|
|
119
|
+
sourceType: 'module',
|
|
120
|
+
plugins: ['jsx', 'typescript'] as ParserPlugin[]
|
|
121
|
+
});
|
|
122
|
+
|
|
123
|
+
// Find response calls within the handler's line range
|
|
124
|
+
const responseCalls = this.findResponseCalls(
|
|
125
|
+
ast,
|
|
126
|
+
handlerNode.file,
|
|
127
|
+
handlerNode.line as number
|
|
128
|
+
);
|
|
129
|
+
|
|
130
|
+
// Create RESPONDS_WITH edges
|
|
131
|
+
for (const call of responseCalls) {
|
|
132
|
+
// Try to resolve to existing variable, or create a unique response node
|
|
133
|
+
const dstNodeId = await this.resolveOrCreateResponseNode(
|
|
134
|
+
graph,
|
|
135
|
+
handlerNode.file,
|
|
136
|
+
call,
|
|
137
|
+
route.id,
|
|
138
|
+
handlerNode.id // Handler's semantic ID for scope resolution
|
|
139
|
+
);
|
|
140
|
+
|
|
141
|
+
await graph.addEdge({
|
|
142
|
+
type: 'RESPONDS_WITH',
|
|
143
|
+
src: route.id,
|
|
144
|
+
dst: dstNodeId,
|
|
145
|
+
metadata: {
|
|
146
|
+
responseMethod: call.method
|
|
147
|
+
}
|
|
148
|
+
});
|
|
149
|
+
edgesCreated++;
|
|
150
|
+
}
|
|
151
|
+
} catch {
|
|
152
|
+
// Silent - per-route errors shouldn't spam logs
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
return edgesCreated;
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
/**
|
|
159
|
+
* Find res.json/res.send calls within a function at given line
|
|
160
|
+
*/
|
|
161
|
+
private findResponseCalls(
|
|
162
|
+
ast: ReturnType<typeof parse>,
|
|
163
|
+
file: string,
|
|
164
|
+
handlerLine: number
|
|
165
|
+
): ResponseCallInfo[] {
|
|
166
|
+
const calls: ResponseCallInfo[] = [];
|
|
167
|
+
// Using object wrapper to satisfy TypeScript's control flow analysis
|
|
168
|
+
const found: { path: NodePath | null } = { path: null };
|
|
169
|
+
|
|
170
|
+
// First pass: find the handler function at the specified line
|
|
171
|
+
traverse(ast, {
|
|
172
|
+
'ArrowFunctionExpression|FunctionExpression|FunctionDeclaration': (path: NodePath) => {
|
|
173
|
+
const node = path.node as Node;
|
|
174
|
+
const line = getLine(node);
|
|
175
|
+
|
|
176
|
+
if (line === handlerLine) {
|
|
177
|
+
found.path = path;
|
|
178
|
+
path.stop();
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
});
|
|
182
|
+
|
|
183
|
+
if (!found.path) {
|
|
184
|
+
return calls;
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
const handlerPath = found.path;
|
|
188
|
+
|
|
189
|
+
// Second pass: traverse only within the handler to find response calls
|
|
190
|
+
const handlerNode = handlerPath.node as ArrowFunctionExpression | FunctionExpression;
|
|
191
|
+
|
|
192
|
+
// Get parameter names to identify 'res'
|
|
193
|
+
const resParamName = this.getResponseParamName(handlerNode);
|
|
194
|
+
if (!resParamName) {
|
|
195
|
+
return calls;
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
// Traverse the handler body for res.json/res.send calls
|
|
199
|
+
handlerPath.traverse({
|
|
200
|
+
CallExpression: (callPath: NodePath<CallExpression>) => {
|
|
201
|
+
const callNode = callPath.node;
|
|
202
|
+
const callee = callNode.callee;
|
|
203
|
+
|
|
204
|
+
// Check for res.json() or res.send() or res.status().json() patterns
|
|
205
|
+
const responseInfo = this.extractResponseInfo(callee, resParamName);
|
|
206
|
+
if (!responseInfo) {
|
|
207
|
+
return;
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
// Get the argument being sent
|
|
211
|
+
if (callNode.arguments.length === 0) {
|
|
212
|
+
return;
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
const arg = callNode.arguments[0] as Node;
|
|
216
|
+
const argLine = getLine(arg);
|
|
217
|
+
const argColumn = arg.loc?.start.column ?? 0;
|
|
218
|
+
|
|
219
|
+
calls.push({
|
|
220
|
+
method: responseInfo.method,
|
|
221
|
+
argLine,
|
|
222
|
+
argColumn,
|
|
223
|
+
argType: arg.type,
|
|
224
|
+
line: getLine(callNode),
|
|
225
|
+
identifierName: arg.type === 'Identifier' ? (arg as Identifier).name : undefined
|
|
226
|
+
});
|
|
227
|
+
}
|
|
228
|
+
});
|
|
229
|
+
|
|
230
|
+
return calls;
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
/**
|
|
234
|
+
* Get response parameter name from function params (typically 'res')
|
|
235
|
+
*/
|
|
236
|
+
private getResponseParamName(
|
|
237
|
+
func: ArrowFunctionExpression | FunctionExpression
|
|
238
|
+
): string | null {
|
|
239
|
+
const params = func.params;
|
|
240
|
+
// Express handlers: (req, res) or (req, res, next)
|
|
241
|
+
if (params.length >= 2) {
|
|
242
|
+
const resParam = params[1];
|
|
243
|
+
if (resParam.type === 'Identifier') {
|
|
244
|
+
return (resParam as Identifier).name;
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
return null;
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
/**
|
|
251
|
+
* Extract response method info from callee
|
|
252
|
+
* Handles: res.json(), res.send(), res.status(200).json()
|
|
253
|
+
*/
|
|
254
|
+
private extractResponseInfo(
|
|
255
|
+
callee: Node,
|
|
256
|
+
resParamName: string
|
|
257
|
+
): { method: string } | null {
|
|
258
|
+
// Direct call: res.json() or res.send()
|
|
259
|
+
if (callee.type === 'MemberExpression') {
|
|
260
|
+
const memberExpr = callee as MemberExpression;
|
|
261
|
+
const property = memberExpr.property;
|
|
262
|
+
|
|
263
|
+
if (property.type !== 'Identifier') {
|
|
264
|
+
return null;
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
const methodName = (property as Identifier).name;
|
|
268
|
+
|
|
269
|
+
// Check for res.json() or res.send()
|
|
270
|
+
if (
|
|
271
|
+
memberExpr.object.type === 'Identifier' &&
|
|
272
|
+
(memberExpr.object as Identifier).name === resParamName &&
|
|
273
|
+
RESPONSE_METHODS.includes(methodName)
|
|
274
|
+
) {
|
|
275
|
+
return { method: methodName };
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
// Check for res.status(200).json() chain
|
|
279
|
+
if (
|
|
280
|
+
memberExpr.object.type === 'CallExpression' &&
|
|
281
|
+
RESPONSE_METHODS.includes(methodName)
|
|
282
|
+
) {
|
|
283
|
+
const chainedCall = memberExpr.object as CallExpression;
|
|
284
|
+
if (this.isResMethodCall(chainedCall.callee, resParamName, 'status')) {
|
|
285
|
+
return { method: methodName };
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
return null;
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
/**
|
|
294
|
+
* Check if callee is res.methodName()
|
|
295
|
+
*/
|
|
296
|
+
private isResMethodCall(
|
|
297
|
+
callee: Node,
|
|
298
|
+
resParamName: string,
|
|
299
|
+
methodName: string
|
|
300
|
+
): boolean {
|
|
301
|
+
if (callee.type !== 'MemberExpression') {
|
|
302
|
+
return false;
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
const memberExpr = callee as MemberExpression;
|
|
306
|
+
return (
|
|
307
|
+
memberExpr.object.type === 'Identifier' &&
|
|
308
|
+
(memberExpr.object as Identifier).name === resParamName &&
|
|
309
|
+
memberExpr.property.type === 'Identifier' &&
|
|
310
|
+
(memberExpr.property as Identifier).name === methodName
|
|
311
|
+
);
|
|
312
|
+
}
|
|
313
|
+
|
|
314
|
+
/**
|
|
315
|
+
* Resolve response node: find existing variable or create stub.
|
|
316
|
+
*
|
|
317
|
+
* For Identifier arguments (e.g., res.json(statusData)):
|
|
318
|
+
* 1. Try to find existing VARIABLE/PARAMETER/CONSTANT with same name in handler scope
|
|
319
|
+
* 2. If found, return existing node ID (no stub needed)
|
|
320
|
+
* 3. If not found, fall back to creating stub (external/global variables)
|
|
321
|
+
*
|
|
322
|
+
* For non-Identifier arguments (ObjectExpression, CallExpression, etc.):
|
|
323
|
+
* - Always create stub node (existing behavior)
|
|
324
|
+
*
|
|
325
|
+
* @param graph - Graph backend
|
|
326
|
+
* @param file - Handler file path
|
|
327
|
+
* @param call - Response call info (includes identifierName)
|
|
328
|
+
* @param routeId - Route ID (for metadata)
|
|
329
|
+
* @param handlerSemanticId - Handler function's semantic ID (for scope matching)
|
|
330
|
+
* @returns Node ID (existing or newly created)
|
|
331
|
+
*/
|
|
332
|
+
private async resolveOrCreateResponseNode(
|
|
333
|
+
graph: PluginContext['graph'],
|
|
334
|
+
file: string,
|
|
335
|
+
call: ResponseCallInfo,
|
|
336
|
+
routeId: string,
|
|
337
|
+
handlerSemanticId: string
|
|
338
|
+
): Promise<string> {
|
|
339
|
+
const { argLine, argColumn, argType, identifierName } = call;
|
|
340
|
+
|
|
341
|
+
// For Identifier arguments, try to find existing variable/parameter
|
|
342
|
+
if (argType === 'Identifier' && identifierName) {
|
|
343
|
+
const existingNodeId = await this.findIdentifierInScope(
|
|
344
|
+
graph,
|
|
345
|
+
file,
|
|
346
|
+
identifierName,
|
|
347
|
+
handlerSemanticId,
|
|
348
|
+
argLine
|
|
349
|
+
);
|
|
350
|
+
|
|
351
|
+
if (existingNodeId) {
|
|
352
|
+
return existingNodeId; // Use existing node, no stub needed
|
|
353
|
+
}
|
|
354
|
+
// Fall through to create stub if not found (external/global variables)
|
|
355
|
+
}
|
|
356
|
+
|
|
357
|
+
// For non-Identifier or not-found, create stub node (existing logic)
|
|
358
|
+
return this.createResponseArgumentNode(
|
|
359
|
+
graph,
|
|
360
|
+
file,
|
|
361
|
+
argLine,
|
|
362
|
+
argColumn,
|
|
363
|
+
argType,
|
|
364
|
+
routeId
|
|
365
|
+
);
|
|
366
|
+
}
|
|
367
|
+
|
|
368
|
+
/**
|
|
369
|
+
* Find existing VARIABLE/CONSTANT/PARAMETER node in handler scope.
|
|
370
|
+
*
|
|
371
|
+
* Strategy:
|
|
372
|
+
* 1. Parse handler semantic ID to extract scope prefix
|
|
373
|
+
* 2. Query VARIABLE/CONSTANT nodes: match by name, file, scope prefix, and line <= useLine
|
|
374
|
+
* 3. Query PARAMETER nodes: match by name, file, parentFunctionId === handlerSemanticId
|
|
375
|
+
*
|
|
376
|
+
* Scope matching:
|
|
377
|
+
* - Handler ID: "routes.js->anonymous[1]->FUNCTION->anonymous[1]"
|
|
378
|
+
* - Scope prefix: "routes.js->anonymous[1]->"
|
|
379
|
+
* - Variable ID: "routes.js->anonymous[1]->VARIABLE->statusData" (matches prefix)
|
|
380
|
+
* - External ID: "utils.js->VARIABLE->config" (different file)
|
|
381
|
+
*
|
|
382
|
+
* @param graph - Graph backend
|
|
383
|
+
* @param file - File path
|
|
384
|
+
* @param name - Variable name to find
|
|
385
|
+
* @param handlerSemanticId - Handler function's semantic ID
|
|
386
|
+
* @param useLine - Line where identifier is used (variable must be declared before this)
|
|
387
|
+
* @returns Node ID if found, null otherwise
|
|
388
|
+
*/
|
|
389
|
+
private async findIdentifierInScope(
|
|
390
|
+
graph: PluginContext['graph'],
|
|
391
|
+
file: string,
|
|
392
|
+
name: string,
|
|
393
|
+
handlerSemanticId: string,
|
|
394
|
+
useLine: number
|
|
395
|
+
): Promise<string | null> {
|
|
396
|
+
// Extract scope prefix from handler semantic ID
|
|
397
|
+
const handlerScopePrefix = this.extractScopePrefix(handlerSemanticId);
|
|
398
|
+
|
|
399
|
+
// Query VARIABLE nodes
|
|
400
|
+
for await (const node of graph.queryNodes({ type: 'VARIABLE' })) {
|
|
401
|
+
if (node.name === name && node.file === file) {
|
|
402
|
+
// Check if in handler scope and declared before usage
|
|
403
|
+
if (node.id.startsWith(handlerScopePrefix) && (node.line as number) <= useLine) {
|
|
404
|
+
return node.id;
|
|
405
|
+
}
|
|
406
|
+
}
|
|
407
|
+
}
|
|
408
|
+
|
|
409
|
+
// Query CONSTANT nodes
|
|
410
|
+
for await (const node of graph.queryNodes({ type: 'CONSTANT' })) {
|
|
411
|
+
if (node.name === name && node.file === file) {
|
|
412
|
+
if (node.id.startsWith(handlerScopePrefix) && (node.line as number) <= useLine) {
|
|
413
|
+
return node.id;
|
|
414
|
+
}
|
|
415
|
+
}
|
|
416
|
+
}
|
|
417
|
+
|
|
418
|
+
// Query PARAMETER nodes
|
|
419
|
+
for await (const node of graph.queryNodes({ type: 'PARAMETER' })) {
|
|
420
|
+
if (node.name === name && node.file === file) {
|
|
421
|
+
// Parameters belong to the function directly
|
|
422
|
+
const parentFunctionId = (node as NodeRecord & { parentFunctionId?: string }).parentFunctionId;
|
|
423
|
+
if (parentFunctionId === handlerSemanticId) {
|
|
424
|
+
return node.id;
|
|
425
|
+
}
|
|
426
|
+
}
|
|
427
|
+
}
|
|
428
|
+
|
|
429
|
+
// Also check module-level variables (scope prefix would be just "file.js->")
|
|
430
|
+
// For module-level constants, they should be accessible from any function in the file
|
|
431
|
+
const modulePrefix = this.extractModulePrefix(handlerSemanticId);
|
|
432
|
+
if (modulePrefix) {
|
|
433
|
+
// Check module-level VARIABLE
|
|
434
|
+
for await (const node of graph.queryNodes({ type: 'VARIABLE' })) {
|
|
435
|
+
if (node.name === name && node.file === file) {
|
|
436
|
+
// Module-level variables have IDs like "file.js->VARIABLE->name" (3 parts)
|
|
437
|
+
// Function-local variables have IDs like "file.js->funcName->VARIABLE->name" (4+ parts)
|
|
438
|
+
// Only match true module-level variables by checking structure
|
|
439
|
+
if (this.isModuleLevelId(node.id, modulePrefix) && (node.line as number) <= useLine) {
|
|
440
|
+
return node.id;
|
|
441
|
+
}
|
|
442
|
+
}
|
|
443
|
+
}
|
|
444
|
+
|
|
445
|
+
// Check module-level CONSTANT
|
|
446
|
+
for await (const node of graph.queryNodes({ type: 'CONSTANT' })) {
|
|
447
|
+
if (node.name === name && node.file === file) {
|
|
448
|
+
if (this.isModuleLevelId(node.id, modulePrefix) && (node.line as number) <= useLine) {
|
|
449
|
+
return node.id;
|
|
450
|
+
}
|
|
451
|
+
}
|
|
452
|
+
}
|
|
453
|
+
}
|
|
454
|
+
|
|
455
|
+
return null; // Not found - will create stub
|
|
456
|
+
}
|
|
457
|
+
|
|
458
|
+
/**
|
|
459
|
+
* Extract scope prefix from handler function's semantic ID.
|
|
460
|
+
*
|
|
461
|
+
* Handler function semantic IDs follow the pattern:
|
|
462
|
+
* {file}->{scope_path}->{type}->{name}
|
|
463
|
+
*
|
|
464
|
+
* Variables declared INSIDE the handler have IDs where the handler's NAME
|
|
465
|
+
* becomes part of THEIR scope path:
|
|
466
|
+
* {file}->{handler_name}->{type}->{var_name}
|
|
467
|
+
*
|
|
468
|
+
* Examples:
|
|
469
|
+
* - Handler: "index.js->global->FUNCTION->anonymous[0]"
|
|
470
|
+
* -> Variables inside: "index.js->anonymous[0]->CONSTANT->statusData"
|
|
471
|
+
* -> Scope prefix: "index.js->anonymous[0]->"
|
|
472
|
+
*
|
|
473
|
+
* - Handler: "routes.js->anonymous[1]->FUNCTION->anonymous[1]"
|
|
474
|
+
* -> Variables inside: "routes.js->anonymous[1]->VARIABLE->data"
|
|
475
|
+
* -> Scope prefix: "routes.js->anonymous[1]->"
|
|
476
|
+
*
|
|
477
|
+
* - Handler: "app.js->global->FUNCTION->handleRequest"
|
|
478
|
+
* -> Variables inside: "app.js->handleRequest->VARIABLE->result"
|
|
479
|
+
* -> Scope prefix: "app.js->handleRequest->"
|
|
480
|
+
*
|
|
481
|
+
* Algorithm:
|
|
482
|
+
* 1. Split by "->"
|
|
483
|
+
* 2. Take file (first part) and handler name (last part)
|
|
484
|
+
* 3. Join with "->" and add trailing "->"
|
|
485
|
+
*
|
|
486
|
+
* @param semanticId - Handler function's semantic ID
|
|
487
|
+
* @returns Scope prefix for matching variables declared inside the handler
|
|
488
|
+
*/
|
|
489
|
+
private extractScopePrefix(semanticId: string): string {
|
|
490
|
+
const parts = semanticId.split('->');
|
|
491
|
+
// Semantic ID format: file->scope->TYPE->name
|
|
492
|
+
// We need file + function name (last part) to match variables inside the function
|
|
493
|
+
if (parts.length >= 4) {
|
|
494
|
+
const file = parts[0];
|
|
495
|
+
const functionName = parts[parts.length - 1]; // Function name is the last part
|
|
496
|
+
return `${file}->${functionName}->`;
|
|
497
|
+
}
|
|
498
|
+
// Fallback: use first two parts (shouldn't happen for well-formed IDs)
|
|
499
|
+
if (parts.length >= 2) {
|
|
500
|
+
return `${parts[0]}->${parts[1]}->`;
|
|
501
|
+
}
|
|
502
|
+
return semanticId;
|
|
503
|
+
}
|
|
504
|
+
|
|
505
|
+
/**
|
|
506
|
+
* Extract module prefix from semantic ID (for module-level variable access).
|
|
507
|
+
*
|
|
508
|
+
* Examples:
|
|
509
|
+
* - "routes.js->anonymous[1]->FUNCTION->anonymous[1]" -> "routes.js->"
|
|
510
|
+
* - "app.js->startServer->FUNCTION->startServer" -> "app.js->"
|
|
511
|
+
*
|
|
512
|
+
* @param semanticId - Handler function's semantic ID
|
|
513
|
+
* @returns Module prefix for matching module-level variables
|
|
514
|
+
*/
|
|
515
|
+
private extractModulePrefix(semanticId: string): string | null {
|
|
516
|
+
const parts = semanticId.split('->');
|
|
517
|
+
if (parts.length >= 1 && parts[0]) {
|
|
518
|
+
return `${parts[0]}->`;
|
|
519
|
+
}
|
|
520
|
+
return null;
|
|
521
|
+
}
|
|
522
|
+
|
|
523
|
+
/**
|
|
524
|
+
* Check if a semantic ID represents a true module-level variable.
|
|
525
|
+
*
|
|
526
|
+
* Semantic IDs have format: file->scope->TYPE->name
|
|
527
|
+
* - Module-level variables have "global" as the scope: "file.js->global->TYPE->name"
|
|
528
|
+
* - Function-local variables have function name as scope: "file.js->funcName->TYPE->name"
|
|
529
|
+
*
|
|
530
|
+
* Examples:
|
|
531
|
+
* - "index.js->global->CONSTANT->CONFIG" -> true (module-level)
|
|
532
|
+
* - "index.js->global->VARIABLE->counter" -> true (module-level)
|
|
533
|
+
* - "index.js->anonymous[0]->CONSTANT->data" -> false (function-local)
|
|
534
|
+
* - "routes.js->handler->VARIABLE->result" -> false (function-local)
|
|
535
|
+
*
|
|
536
|
+
* @param nodeId - The node's semantic ID
|
|
537
|
+
* @param modulePrefix - The module prefix (e.g., "index.js->")
|
|
538
|
+
* @returns true if this is a module-level variable
|
|
539
|
+
*/
|
|
540
|
+
private isModuleLevelId(nodeId: string, modulePrefix: string): boolean {
|
|
541
|
+
if (!nodeId.startsWith(modulePrefix)) {
|
|
542
|
+
return false;
|
|
543
|
+
}
|
|
544
|
+
|
|
545
|
+
// Check if the scope part (second component) is "global"
|
|
546
|
+
const parts = nodeId.split('->');
|
|
547
|
+
// Expected format: ["file.js", "global", "TYPE", "name"]
|
|
548
|
+
// Check that second part is "global" (module scope)
|
|
549
|
+
return parts.length >= 4 && parts[1] === 'global';
|
|
550
|
+
}
|
|
551
|
+
|
|
552
|
+
/**
|
|
553
|
+
* Create a node for the response argument
|
|
554
|
+
*/
|
|
555
|
+
private async createResponseArgumentNode(
|
|
556
|
+
graph: PluginContext['graph'],
|
|
557
|
+
file: string,
|
|
558
|
+
line: number,
|
|
559
|
+
column: number,
|
|
560
|
+
astType: string,
|
|
561
|
+
routeId: string
|
|
562
|
+
): Promise<string> {
|
|
563
|
+
// Map AST type to node type and create appropriate node
|
|
564
|
+
switch (astType) {
|
|
565
|
+
case 'ObjectExpression': {
|
|
566
|
+
// Include counter to make the node unique even for same location
|
|
567
|
+
const counter = this.responseNodeCounter++;
|
|
568
|
+
const id = `OBJECT_LITERAL#response:${counter}#${file}#${line}:${column}`;
|
|
569
|
+
await graph.addNode({
|
|
570
|
+
id,
|
|
571
|
+
type: 'OBJECT_LITERAL',
|
|
572
|
+
name: '<response>',
|
|
573
|
+
file,
|
|
574
|
+
line,
|
|
575
|
+
column,
|
|
576
|
+
parentRouteId: routeId
|
|
577
|
+
} as NodeRecord);
|
|
578
|
+
return id;
|
|
579
|
+
}
|
|
580
|
+
case 'Identifier': {
|
|
581
|
+
// For identifiers, we link to the variable that's being returned
|
|
582
|
+
const counter = this.responseNodeCounter++;
|
|
583
|
+
const id = `VARIABLE#response:${counter}#${file}#${line}:${column}`;
|
|
584
|
+
await graph.addNode({
|
|
585
|
+
id,
|
|
586
|
+
type: 'VARIABLE',
|
|
587
|
+
name: '<response>',
|
|
588
|
+
file,
|
|
589
|
+
line,
|
|
590
|
+
column
|
|
591
|
+
} as NodeRecord);
|
|
592
|
+
return id;
|
|
593
|
+
}
|
|
594
|
+
case 'CallExpression': {
|
|
595
|
+
const counter = this.responseNodeCounter++;
|
|
596
|
+
const id = `CALL#response:${counter}#${file}#${line}:${column}`;
|
|
597
|
+
await graph.addNode({
|
|
598
|
+
id,
|
|
599
|
+
type: 'CALL',
|
|
600
|
+
name: '<response>',
|
|
601
|
+
file,
|
|
602
|
+
line,
|
|
603
|
+
column
|
|
604
|
+
} as NodeRecord);
|
|
605
|
+
return id;
|
|
606
|
+
}
|
|
607
|
+
case 'ArrayExpression': {
|
|
608
|
+
const counter = this.responseNodeCounter++;
|
|
609
|
+
const id = `ARRAY_LITERAL#response:${counter}#${file}#${line}:${column}`;
|
|
610
|
+
await graph.addNode({
|
|
611
|
+
id,
|
|
612
|
+
type: 'ARRAY_LITERAL',
|
|
613
|
+
name: '<response>',
|
|
614
|
+
file,
|
|
615
|
+
line,
|
|
616
|
+
column
|
|
617
|
+
} as NodeRecord);
|
|
618
|
+
return id;
|
|
619
|
+
}
|
|
620
|
+
default: {
|
|
621
|
+
// Generic expression node
|
|
622
|
+
const counter = this.responseNodeCounter++;
|
|
623
|
+
const id = `EXPRESSION#response:${counter}#${file}#${line}:${column}`;
|
|
624
|
+
await graph.addNode({
|
|
625
|
+
id,
|
|
626
|
+
type: 'EXPRESSION',
|
|
627
|
+
name: '<response>',
|
|
628
|
+
file,
|
|
629
|
+
line,
|
|
630
|
+
column
|
|
631
|
+
} as NodeRecord);
|
|
632
|
+
return id;
|
|
633
|
+
}
|
|
634
|
+
}
|
|
635
|
+
}
|
|
636
|
+
}
|