@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,456 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* FunctionCallResolver - creates CALLS edges for imported function calls
|
|
3
|
+
*
|
|
4
|
+
* This enrichment plugin runs AFTER ImportExportLinker (priority 80 vs 90) and:
|
|
5
|
+
* 1. Finds CALL_SITE nodes without CALLS edges (excluding method calls)
|
|
6
|
+
* 2. For each, looks for IMPORT with matching local name in same file
|
|
7
|
+
* 3. Follows IMPORTS_FROM -> EXPORT -> FUNCTION chain
|
|
8
|
+
* 4. Creates CALLS edge to target FUNCTION
|
|
9
|
+
*
|
|
10
|
+
* CREATES EDGES:
|
|
11
|
+
* - CALL_SITE -> CALLS -> FUNCTION (for imported functions)
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
import { Plugin, createSuccessResult } from '../Plugin.js';
|
|
15
|
+
import type { PluginContext, PluginResult, PluginMetadata } from '../Plugin.js';
|
|
16
|
+
import type { BaseNodeRecord } from '@grafema/types';
|
|
17
|
+
import { dirname, resolve } from 'path';
|
|
18
|
+
import { StrictModeError } from '../../errors/GrafemaError.js';
|
|
19
|
+
|
|
20
|
+
// === INTERFACES ===
|
|
21
|
+
|
|
22
|
+
interface CallNode extends BaseNodeRecord {
|
|
23
|
+
object?: string; // If present, this is a method call - skip
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
interface ImportNode extends BaseNodeRecord {
|
|
27
|
+
source?: string;
|
|
28
|
+
importType?: string; // 'default' | 'named' | 'namespace'
|
|
29
|
+
imported?: string; // Original name in source file
|
|
30
|
+
local?: string; // Local binding name
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
interface ExportNode extends BaseNodeRecord {
|
|
34
|
+
exportType?: string; // 'default' | 'named' | 'all'
|
|
35
|
+
local?: string; // Local name in exporting file
|
|
36
|
+
source?: string; // Re-export source (if re-exporting)
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
interface ExportIndexEntry {
|
|
40
|
+
node: ExportNode;
|
|
41
|
+
exportKey: string; // "default" | "named:functionName"
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
interface ExternalModuleResult {
|
|
45
|
+
type: 'external';
|
|
46
|
+
packageName: string;
|
|
47
|
+
exportedName: string;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
type ResolveChainResult = ExportNode | ExternalModuleResult | null;
|
|
51
|
+
|
|
52
|
+
type FunctionNode = BaseNodeRecord;
|
|
53
|
+
|
|
54
|
+
// === PLUGIN CLASS ===
|
|
55
|
+
|
|
56
|
+
export class FunctionCallResolver extends Plugin {
|
|
57
|
+
get metadata(): PluginMetadata {
|
|
58
|
+
return {
|
|
59
|
+
name: 'FunctionCallResolver',
|
|
60
|
+
phase: 'ENRICHMENT',
|
|
61
|
+
priority: 80, // After ImportExportLinker (90)
|
|
62
|
+
creates: {
|
|
63
|
+
nodes: ['EXTERNAL_MODULE'],
|
|
64
|
+
edges: ['CALLS']
|
|
65
|
+
},
|
|
66
|
+
dependencies: ['ImportExportLinker'] // Requires IMPORTS_FROM edges
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
async execute(context: PluginContext): Promise<PluginResult> {
|
|
71
|
+
const { graph } = context;
|
|
72
|
+
const logger = this.log(context);
|
|
73
|
+
|
|
74
|
+
logger.info('Starting function call resolution');
|
|
75
|
+
|
|
76
|
+
const startTime = Date.now();
|
|
77
|
+
|
|
78
|
+
// Step 1: Build Import Index - Map<file:local, ImportNode>
|
|
79
|
+
const importIndex = new Map<string, ImportNode>();
|
|
80
|
+
for await (const node of graph.queryNodes({ nodeType: 'IMPORT' })) {
|
|
81
|
+
const imp = node as ImportNode;
|
|
82
|
+
if (!imp.file || !imp.local) continue;
|
|
83
|
+
|
|
84
|
+
// Skip external imports (non-relative)
|
|
85
|
+
const isRelative = imp.source && (imp.source.startsWith('./') || imp.source.startsWith('../'));
|
|
86
|
+
if (!isRelative) continue;
|
|
87
|
+
|
|
88
|
+
const key = `${imp.file}:${imp.local}`;
|
|
89
|
+
importIndex.set(key, imp);
|
|
90
|
+
}
|
|
91
|
+
logger.debug('Indexed imports', { count: importIndex.size });
|
|
92
|
+
|
|
93
|
+
// Step 2: Build Function Index - Map<file, Map<name, FunctionNode>>
|
|
94
|
+
const functionIndex = new Map<string, Map<string, FunctionNode>>();
|
|
95
|
+
for await (const node of graph.queryNodes({ nodeType: 'FUNCTION' })) {
|
|
96
|
+
const func = node as FunctionNode;
|
|
97
|
+
if (!func.file || !func.name) continue;
|
|
98
|
+
|
|
99
|
+
if (!functionIndex.has(func.file)) {
|
|
100
|
+
functionIndex.set(func.file, new Map());
|
|
101
|
+
}
|
|
102
|
+
functionIndex.get(func.file)!.set(func.name, func);
|
|
103
|
+
}
|
|
104
|
+
logger.debug('Indexed functions', { files: functionIndex.size });
|
|
105
|
+
|
|
106
|
+
// Step 2.5: Build Export Index - Map<file, Map<exportKey, ExportNode>>
|
|
107
|
+
// This enables O(1) lookup when following re-export chains
|
|
108
|
+
const exportIndex = new Map<string, Map<string, ExportNode>>();
|
|
109
|
+
for await (const node of graph.queryNodes({ nodeType: 'EXPORT' })) {
|
|
110
|
+
const exp = node as ExportNode;
|
|
111
|
+
if (!exp.file) continue;
|
|
112
|
+
|
|
113
|
+
if (!exportIndex.has(exp.file)) {
|
|
114
|
+
exportIndex.set(exp.file, new Map());
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
const fileExports = exportIndex.get(exp.file)!;
|
|
118
|
+
fileExports.set(this.buildExportKey(exp), exp);
|
|
119
|
+
}
|
|
120
|
+
logger.debug('Indexed exports', { files: exportIndex.size });
|
|
121
|
+
|
|
122
|
+
// Step 2.6: Build set of known files for path resolution
|
|
123
|
+
const knownFiles = new Set<string>();
|
|
124
|
+
for (const file of exportIndex.keys()) {
|
|
125
|
+
knownFiles.add(file);
|
|
126
|
+
}
|
|
127
|
+
for (const file of functionIndex.keys()) {
|
|
128
|
+
knownFiles.add(file);
|
|
129
|
+
}
|
|
130
|
+
logger.debug('Indexed known files', { count: knownFiles.size });
|
|
131
|
+
|
|
132
|
+
// Step 3: Collect unresolved CALL_SITE nodes
|
|
133
|
+
const callSitesToResolve: CallNode[] = [];
|
|
134
|
+
for await (const node of graph.queryNodes({ nodeType: 'CALL' })) {
|
|
135
|
+
const call = node as CallNode;
|
|
136
|
+
|
|
137
|
+
// Skip method calls (have object attribute)
|
|
138
|
+
if (call.object) continue;
|
|
139
|
+
|
|
140
|
+
// Skip if already has CALLS edge
|
|
141
|
+
const existingEdges = await graph.getOutgoingEdges(call.id, ['CALLS']);
|
|
142
|
+
if (existingEdges.length > 0) continue;
|
|
143
|
+
|
|
144
|
+
callSitesToResolve.push(call);
|
|
145
|
+
}
|
|
146
|
+
logger.info('Found call sites to resolve', { count: callSitesToResolve.length });
|
|
147
|
+
|
|
148
|
+
// Step 4: Resolution
|
|
149
|
+
let edgesCreated = 0;
|
|
150
|
+
const skipped = {
|
|
151
|
+
alreadyResolved: 0,
|
|
152
|
+
methodCalls: 0,
|
|
153
|
+
external: 0,
|
|
154
|
+
missingImport: 0,
|
|
155
|
+
missingImportsFrom: 0,
|
|
156
|
+
reExportsBroken: 0 // Re-export chain broken (missing export, file not found, or circular)
|
|
157
|
+
};
|
|
158
|
+
|
|
159
|
+
let reExportsResolved = 0; // Counter for successfully resolved re-export chains
|
|
160
|
+
const errors: Error[] = [];
|
|
161
|
+
|
|
162
|
+
for (const callSite of callSitesToResolve) {
|
|
163
|
+
const calledName = callSite.name;
|
|
164
|
+
const file = callSite.file;
|
|
165
|
+
|
|
166
|
+
if (!calledName || !file) continue;
|
|
167
|
+
|
|
168
|
+
// Step 4.1: Find matching import in same file
|
|
169
|
+
const importKey = `${file}:${calledName}`;
|
|
170
|
+
const imp = importIndex.get(importKey);
|
|
171
|
+
|
|
172
|
+
if (!imp) {
|
|
173
|
+
skipped.missingImport++;
|
|
174
|
+
continue;
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
// Step 4.2: Follow IMPORTS_FROM edge to find EXPORT
|
|
178
|
+
const importsFromEdges = await graph.getOutgoingEdges(imp.id, ['IMPORTS_FROM']);
|
|
179
|
+
if (importsFromEdges.length === 0) {
|
|
180
|
+
skipped.missingImportsFrom++;
|
|
181
|
+
continue;
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
const exportNodeId = importsFromEdges[0].dst;
|
|
185
|
+
const exportNode = await graph.getNode(exportNodeId) as ExportNode | null;
|
|
186
|
+
|
|
187
|
+
if (!exportNode) {
|
|
188
|
+
skipped.missingImportsFrom++;
|
|
189
|
+
continue;
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
// Step 4.3: Resolve re-export chain (if applicable)
|
|
193
|
+
let finalExport = exportNode;
|
|
194
|
+
|
|
195
|
+
if (exportNode.source) {
|
|
196
|
+
// This is a re-export - follow the chain
|
|
197
|
+
const resolved = this.resolveExportChain(
|
|
198
|
+
exportNode,
|
|
199
|
+
exportIndex,
|
|
200
|
+
knownFiles
|
|
201
|
+
);
|
|
202
|
+
|
|
203
|
+
if (!resolved) {
|
|
204
|
+
// Chain broken or circular
|
|
205
|
+
// Distinguish: if visited set would show cycle, it's circular
|
|
206
|
+
// For simplicity, count as broken (can add nuance later)
|
|
207
|
+
skipped.reExportsBroken++;
|
|
208
|
+
|
|
209
|
+
// In strict mode, collect error
|
|
210
|
+
if (context.strictMode) {
|
|
211
|
+
const error = new StrictModeError(
|
|
212
|
+
`Cannot resolve re-export chain for: ${calledName}`,
|
|
213
|
+
'STRICT_BROKEN_IMPORT',
|
|
214
|
+
{
|
|
215
|
+
filePath: file,
|
|
216
|
+
lineNumber: callSite.line as number | undefined,
|
|
217
|
+
phase: 'ENRICHMENT',
|
|
218
|
+
plugin: 'FunctionCallResolver',
|
|
219
|
+
calledFunction: calledName,
|
|
220
|
+
importSource: imp.source,
|
|
221
|
+
},
|
|
222
|
+
`Check if the module "${imp.source}" exists and exports "${calledName}"`
|
|
223
|
+
);
|
|
224
|
+
errors.push(error);
|
|
225
|
+
}
|
|
226
|
+
continue;
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
// Check if resolved to external module
|
|
230
|
+
if ('type' in resolved && resolved.type === 'external') {
|
|
231
|
+
// Type narrowing: resolved is ExternalModuleResult
|
|
232
|
+
const externalResult = resolved as ExternalModuleResult;
|
|
233
|
+
|
|
234
|
+
// Find or create EXTERNAL_MODULE node and create CALLS edge
|
|
235
|
+
const externalModuleId = `EXTERNAL_MODULE:${externalResult.packageName}`;
|
|
236
|
+
|
|
237
|
+
// Check if node exists
|
|
238
|
+
let externalNode = await graph.getNode(externalModuleId);
|
|
239
|
+
if (!externalNode) {
|
|
240
|
+
// Create EXTERNAL_MODULE node
|
|
241
|
+
await graph.addNode({
|
|
242
|
+
id: externalModuleId,
|
|
243
|
+
type: 'EXTERNAL_MODULE',
|
|
244
|
+
name: externalResult.packageName,
|
|
245
|
+
file: '',
|
|
246
|
+
line: 0
|
|
247
|
+
});
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
// Create CALLS edge with metadata
|
|
251
|
+
await graph.addEdge({
|
|
252
|
+
type: 'CALLS',
|
|
253
|
+
src: callSite.id,
|
|
254
|
+
dst: externalModuleId,
|
|
255
|
+
metadata: { exportedName: externalResult.exportedName }
|
|
256
|
+
});
|
|
257
|
+
|
|
258
|
+
edgesCreated++;
|
|
259
|
+
reExportsResolved++;
|
|
260
|
+
continue;
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
// At this point, resolved must be ExportNode (not external)
|
|
264
|
+
finalExport = resolved as ExportNode;
|
|
265
|
+
reExportsResolved++;
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
// Step 4.4: Find target FUNCTION via final export's local name
|
|
269
|
+
const targetFile = finalExport.file;
|
|
270
|
+
const targetFunctionName = finalExport.local || finalExport.name;
|
|
271
|
+
|
|
272
|
+
if (!targetFile || !targetFunctionName) continue;
|
|
273
|
+
|
|
274
|
+
const fileFunctions = functionIndex.get(targetFile);
|
|
275
|
+
if (!fileFunctions) continue;
|
|
276
|
+
|
|
277
|
+
const targetFunction = fileFunctions.get(targetFunctionName);
|
|
278
|
+
if (!targetFunction) continue;
|
|
279
|
+
|
|
280
|
+
// Step 4.5: Create CALLS edge
|
|
281
|
+
await graph.addEdge({
|
|
282
|
+
type: 'CALLS',
|
|
283
|
+
src: callSite.id,
|
|
284
|
+
dst: targetFunction.id
|
|
285
|
+
});
|
|
286
|
+
|
|
287
|
+
edgesCreated++;
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
const totalTime = ((Date.now() - startTime) / 1000).toFixed(2);
|
|
291
|
+
logger.info('Complete', {
|
|
292
|
+
edgesCreated,
|
|
293
|
+
skipped,
|
|
294
|
+
time: `${totalTime}s`
|
|
295
|
+
});
|
|
296
|
+
|
|
297
|
+
return createSuccessResult(
|
|
298
|
+
{ nodes: 0, edges: edgesCreated },
|
|
299
|
+
{
|
|
300
|
+
callSitesProcessed: callSitesToResolve.length,
|
|
301
|
+
edgesCreated,
|
|
302
|
+
reExportsResolved,
|
|
303
|
+
skipped,
|
|
304
|
+
timeMs: Date.now() - startTime
|
|
305
|
+
},
|
|
306
|
+
errors
|
|
307
|
+
);
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
/**
|
|
311
|
+
* Build a key string for export index lookup.
|
|
312
|
+
*
|
|
313
|
+
* @param exp - Export node to build key for
|
|
314
|
+
* @returns Key in format "default" or "named:name"
|
|
315
|
+
*/
|
|
316
|
+
private buildExportKey(exp: ExportNode): string {
|
|
317
|
+
if (exp.exportType === 'default') {
|
|
318
|
+
return 'default';
|
|
319
|
+
}
|
|
320
|
+
return `named:${exp.name || exp.local || 'anonymous'}`;
|
|
321
|
+
}
|
|
322
|
+
|
|
323
|
+
/**
|
|
324
|
+
* Extract package name from import source.
|
|
325
|
+
* Handles: 'lodash', '@tanstack/react-query', 'lodash/map', '@scope/pkg/sub'
|
|
326
|
+
*/
|
|
327
|
+
private extractPackageName(source: string): string | null {
|
|
328
|
+
if (!source) return null;
|
|
329
|
+
|
|
330
|
+
// Handle scoped packages (@scope/package)
|
|
331
|
+
if (source.startsWith('@')) {
|
|
332
|
+
const parts = source.split('/');
|
|
333
|
+
if (parts.length >= 2) {
|
|
334
|
+
return `${parts[0]}/${parts[1]}`;
|
|
335
|
+
}
|
|
336
|
+
return null;
|
|
337
|
+
}
|
|
338
|
+
|
|
339
|
+
// Non-scoped package: lodash or lodash/map
|
|
340
|
+
const slashIndex = source.indexOf('/');
|
|
341
|
+
if (slashIndex === -1) {
|
|
342
|
+
return source;
|
|
343
|
+
}
|
|
344
|
+
return source.substring(0, slashIndex);
|
|
345
|
+
}
|
|
346
|
+
|
|
347
|
+
/**
|
|
348
|
+
* Resolve module specifier to actual file path using extension fallbacks.
|
|
349
|
+
* Pattern reused from ImportExportLinker (lines 101-122).
|
|
350
|
+
*
|
|
351
|
+
* @param currentDir - Directory of the file containing the import/re-export
|
|
352
|
+
* @param specifier - The module specifier (e.g., "./utils", "../lib/helpers")
|
|
353
|
+
* @param fileIndex - Set or Map of known file paths for existence checking
|
|
354
|
+
* @returns Resolved file path or null if not found
|
|
355
|
+
*/
|
|
356
|
+
private resolveModulePath(
|
|
357
|
+
currentDir: string,
|
|
358
|
+
specifier: string,
|
|
359
|
+
fileIndex: Set<string>
|
|
360
|
+
): string | null {
|
|
361
|
+
const basePath = resolve(currentDir, specifier);
|
|
362
|
+
const extensions = ['', '.js', '.ts', '.jsx', '.tsx', '/index.js', '/index.ts'];
|
|
363
|
+
|
|
364
|
+
for (const ext of extensions) {
|
|
365
|
+
const testPath = basePath + ext;
|
|
366
|
+
if (fileIndex.has(testPath)) {
|
|
367
|
+
return testPath;
|
|
368
|
+
}
|
|
369
|
+
}
|
|
370
|
+
|
|
371
|
+
return null;
|
|
372
|
+
}
|
|
373
|
+
|
|
374
|
+
/**
|
|
375
|
+
* Follow re-export chain to find the final EXPORT node (without source field).
|
|
376
|
+
*
|
|
377
|
+
* Algorithm:
|
|
378
|
+
* 1. If current export has no source -> return it (base case)
|
|
379
|
+
* 2. Resolve source path to file
|
|
380
|
+
* 3. Find matching export in that file
|
|
381
|
+
* 4. Recurse (with cycle detection)
|
|
382
|
+
*
|
|
383
|
+
* @param exportNode - Starting export node (may be re-export)
|
|
384
|
+
* @param exportIndex - Pre-built export index for O(1) lookups
|
|
385
|
+
* @param knownFiles - Set of known file paths
|
|
386
|
+
* @param visited - Set of visited export IDs for cycle detection
|
|
387
|
+
* @param maxDepth - Maximum chain depth (safety limit)
|
|
388
|
+
* @returns Final export node (without source), external module result, or null if chain broken/circular
|
|
389
|
+
*/
|
|
390
|
+
private resolveExportChain(
|
|
391
|
+
exportNode: ExportNode,
|
|
392
|
+
exportIndex: Map<string, Map<string, ExportNode>>,
|
|
393
|
+
knownFiles: Set<string>,
|
|
394
|
+
visited: Set<string> = new Set(),
|
|
395
|
+
maxDepth: number = 10
|
|
396
|
+
): ResolveChainResult {
|
|
397
|
+
// Safety: max depth exceeded
|
|
398
|
+
if (maxDepth <= 0) {
|
|
399
|
+
return null;
|
|
400
|
+
}
|
|
401
|
+
|
|
402
|
+
// Cycle detection
|
|
403
|
+
if (visited.has(exportNode.id)) {
|
|
404
|
+
return null;
|
|
405
|
+
}
|
|
406
|
+
visited.add(exportNode.id);
|
|
407
|
+
|
|
408
|
+
// Base case: not a re-export
|
|
409
|
+
if (!exportNode.source) {
|
|
410
|
+
return exportNode;
|
|
411
|
+
}
|
|
412
|
+
|
|
413
|
+
// Recursive case: follow re-export
|
|
414
|
+
const currentDir = dirname(exportNode.file!);
|
|
415
|
+
const targetFile = this.resolveModulePath(currentDir, exportNode.source, knownFiles);
|
|
416
|
+
|
|
417
|
+
if (!targetFile) {
|
|
418
|
+
// Check if this is an external module (non-relative source)
|
|
419
|
+
const source = exportNode.source!;
|
|
420
|
+
const isExternal = !source.startsWith('./') && !source.startsWith('../');
|
|
421
|
+
|
|
422
|
+
if (isExternal) {
|
|
423
|
+
const packageName = this.extractPackageName(source);
|
|
424
|
+
if (packageName) {
|
|
425
|
+
return {
|
|
426
|
+
type: 'external',
|
|
427
|
+
packageName,
|
|
428
|
+
exportedName: exportNode.local || exportNode.name || ''
|
|
429
|
+
};
|
|
430
|
+
}
|
|
431
|
+
}
|
|
432
|
+
return null; // Source file not found and not external
|
|
433
|
+
}
|
|
434
|
+
|
|
435
|
+
const targetExports = exportIndex.get(targetFile);
|
|
436
|
+
if (!targetExports) {
|
|
437
|
+
return null; // No exports in target file
|
|
438
|
+
}
|
|
439
|
+
|
|
440
|
+
// Find matching export by name
|
|
441
|
+
// Re-export: export { foo } from './other' - look for named:foo
|
|
442
|
+
// Re-export default: export { default } from './other' - look for default
|
|
443
|
+
const nextExport = targetExports.get(this.buildExportKey(exportNode));
|
|
444
|
+
if (!nextExport) {
|
|
445
|
+
return null; // Export not found in target
|
|
446
|
+
}
|
|
447
|
+
|
|
448
|
+
return this.resolveExportChain(
|
|
449
|
+
nextExport,
|
|
450
|
+
exportIndex,
|
|
451
|
+
knownFiles,
|
|
452
|
+
visited,
|
|
453
|
+
maxDepth - 1
|
|
454
|
+
);
|
|
455
|
+
}
|
|
456
|
+
}
|
|
@@ -19,6 +19,7 @@ import type { BaseNodeRecord } from '@grafema/types';
|
|
|
19
19
|
interface HTTPRouteNode extends BaseNodeRecord {
|
|
20
20
|
method?: string;
|
|
21
21
|
path?: string;
|
|
22
|
+
fullPath?: string; // Set by MountPointResolver for mounted routes
|
|
22
23
|
url?: string;
|
|
23
24
|
}
|
|
24
25
|
|
|
@@ -28,6 +29,7 @@ interface HTTPRouteNode extends BaseNodeRecord {
|
|
|
28
29
|
interface HTTPRequestNode extends BaseNodeRecord {
|
|
29
30
|
method?: string;
|
|
30
31
|
url?: string;
|
|
32
|
+
responseDataNode?: string; // ID of response.json() CALL node (set by FetchAnalyzer)
|
|
31
33
|
}
|
|
32
34
|
|
|
33
35
|
/**
|
|
@@ -48,14 +50,15 @@ export class HTTPConnectionEnricher extends Plugin {
|
|
|
48
50
|
priority: 50, // После основных enrichers
|
|
49
51
|
creates: {
|
|
50
52
|
nodes: [],
|
|
51
|
-
edges: ['INTERACTS_WITH']
|
|
53
|
+
edges: ['INTERACTS_WITH', 'HTTP_RECEIVES']
|
|
52
54
|
},
|
|
53
|
-
dependencies: ['ExpressRouteAnalyzer', 'FetchAnalyzer']
|
|
55
|
+
dependencies: ['ExpressRouteAnalyzer', 'FetchAnalyzer', 'ExpressResponseAnalyzer']
|
|
54
56
|
};
|
|
55
57
|
}
|
|
56
58
|
|
|
57
59
|
async execute(context: PluginContext): Promise<PluginResult> {
|
|
58
60
|
const { graph } = context;
|
|
61
|
+
const logger = this.log(context);
|
|
59
62
|
|
|
60
63
|
try {
|
|
61
64
|
// Собираем все http:route (backend endpoints)
|
|
@@ -70,13 +73,19 @@ export class HTTPConnectionEnricher extends Plugin {
|
|
|
70
73
|
requests.push(node as HTTPRequestNode);
|
|
71
74
|
}
|
|
72
75
|
|
|
73
|
-
|
|
76
|
+
logger.debug('Found routes and requests', {
|
|
77
|
+
routes: routes.length,
|
|
78
|
+
requests: requests.length
|
|
79
|
+
});
|
|
74
80
|
|
|
75
81
|
// Дедуплицируем по ID (из-за multi-service анализа)
|
|
76
82
|
const uniqueRoutes = this.deduplicateById(routes);
|
|
77
83
|
const uniqueRequests = this.deduplicateById(requests);
|
|
78
84
|
|
|
79
|
-
|
|
85
|
+
logger.info('Unique routes and requests', {
|
|
86
|
+
routes: uniqueRoutes.length,
|
|
87
|
+
requests: uniqueRequests.length
|
|
88
|
+
});
|
|
80
89
|
|
|
81
90
|
let edgesCreated = 0;
|
|
82
91
|
const connections: ConnectionInfo[] = [];
|
|
@@ -94,10 +103,11 @@ export class HTTPConnectionEnricher extends Plugin {
|
|
|
94
103
|
// Ищем matching route
|
|
95
104
|
for (const route of uniqueRoutes) {
|
|
96
105
|
const routeMethod = (route.method || 'GET').toUpperCase();
|
|
97
|
-
|
|
106
|
+
// Use fullPath (from MountPointResolver) if available, fallback to local path
|
|
107
|
+
const routePath = route.fullPath || route.path;
|
|
98
108
|
|
|
99
109
|
if (routePath && method === routeMethod && this.pathsMatch(url, routePath)) {
|
|
100
|
-
//
|
|
110
|
+
// 1. Create INTERACTS_WITH edge (existing)
|
|
101
111
|
await graph.addEdge({
|
|
102
112
|
type: 'INTERACTS_WITH',
|
|
103
113
|
src: request.id,
|
|
@@ -105,6 +115,28 @@ export class HTTPConnectionEnricher extends Plugin {
|
|
|
105
115
|
matchType: this.hasParams(routePath) ? 'parametric' : 'exact'
|
|
106
116
|
});
|
|
107
117
|
|
|
118
|
+
edgesCreated++;
|
|
119
|
+
|
|
120
|
+
// 2. Create HTTP_RECEIVES edges if both sides have data nodes
|
|
121
|
+
const responseDataNode = request.responseDataNode;
|
|
122
|
+
if (responseDataNode) {
|
|
123
|
+
const respondsWithEdges = await graph.getOutgoingEdges(route.id, ['RESPONDS_WITH']);
|
|
124
|
+
for (const respEdge of respondsWithEdges) {
|
|
125
|
+
await graph.addEdge({
|
|
126
|
+
type: 'HTTP_RECEIVES',
|
|
127
|
+
src: responseDataNode,
|
|
128
|
+
dst: respEdge.dst,
|
|
129
|
+
metadata: {
|
|
130
|
+
method: request.method,
|
|
131
|
+
path: request.url,
|
|
132
|
+
viaRequest: request.id,
|
|
133
|
+
viaRoute: route.id
|
|
134
|
+
}
|
|
135
|
+
});
|
|
136
|
+
edgesCreated++;
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
|
|
108
140
|
connections.push({
|
|
109
141
|
request: `${method} ${url}`,
|
|
110
142
|
route: `${routeMethod} ${routePath}`,
|
|
@@ -112,7 +144,6 @@ export class HTTPConnectionEnricher extends Plugin {
|
|
|
112
144
|
routeFile: route.file
|
|
113
145
|
});
|
|
114
146
|
|
|
115
|
-
edgesCreated++;
|
|
116
147
|
break; // Один request → один route
|
|
117
148
|
}
|
|
118
149
|
}
|
|
@@ -120,10 +151,10 @@ export class HTTPConnectionEnricher extends Plugin {
|
|
|
120
151
|
|
|
121
152
|
// Логируем найденные связи
|
|
122
153
|
if (connections.length > 0) {
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
}
|
|
154
|
+
logger.info('Connections found', {
|
|
155
|
+
count: connections.length,
|
|
156
|
+
examples: connections.slice(0, 5).map(c => `${c.request} → ${c.route}`)
|
|
157
|
+
});
|
|
127
158
|
}
|
|
128
159
|
|
|
129
160
|
return createSuccessResult(
|
|
@@ -136,41 +167,67 @@ export class HTTPConnectionEnricher extends Plugin {
|
|
|
136
167
|
);
|
|
137
168
|
|
|
138
169
|
} catch (error) {
|
|
139
|
-
|
|
170
|
+
logger.error('Error in HTTPConnectionEnricher', { error });
|
|
140
171
|
return createErrorResult(error instanceof Error ? error : new Error(String(error)));
|
|
141
172
|
}
|
|
142
173
|
}
|
|
143
174
|
|
|
144
175
|
/**
|
|
145
|
-
*
|
|
146
|
-
*
|
|
176
|
+
* Normalize URL to canonical form for comparison.
|
|
177
|
+
* Converts both Express params (:id) and template literals (${...}) to {param}.
|
|
178
|
+
*/
|
|
179
|
+
private normalizeUrl(url: string): string {
|
|
180
|
+
return url
|
|
181
|
+
.replace(/:[^/]+/g, '{param}') // :id -> {param}
|
|
182
|
+
.replace(/\$\{[^}]*\}/g, '{param}'); // ${...} -> {param}, ${userId} -> {param}
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
/**
|
|
186
|
+
* Check if URL has any parameter placeholders (after normalization)
|
|
187
|
+
*/
|
|
188
|
+
private hasParamsNormalized(normalizedUrl: string): boolean {
|
|
189
|
+
return normalizedUrl.includes('{param}');
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
/**
|
|
193
|
+
* Check if request URL matches route path.
|
|
194
|
+
* Supports:
|
|
195
|
+
* - Exact match
|
|
196
|
+
* - Express params (:id)
|
|
197
|
+
* - Template literals (${...})
|
|
198
|
+
* - Concrete values matching params (/users/123 matches /users/:id)
|
|
147
199
|
*/
|
|
148
200
|
private pathsMatch(requestUrl: string, routePath: string): boolean {
|
|
149
|
-
//
|
|
150
|
-
|
|
201
|
+
// Normalize both to canonical form
|
|
202
|
+
const normRequest = this.normalizeUrl(requestUrl);
|
|
203
|
+
const normRoute = this.normalizeUrl(routePath);
|
|
204
|
+
|
|
205
|
+
// If both normalize to same string, they match
|
|
206
|
+
if (normRequest === normRoute) {
|
|
151
207
|
return true;
|
|
152
208
|
}
|
|
153
209
|
|
|
154
|
-
//
|
|
155
|
-
if (!this.
|
|
210
|
+
// If route has no params after normalization, require exact match
|
|
211
|
+
if (!this.hasParamsNormalized(normRoute)) {
|
|
156
212
|
return false;
|
|
157
213
|
}
|
|
158
214
|
|
|
159
|
-
//
|
|
160
|
-
//
|
|
161
|
-
const
|
|
162
|
-
.replace(
|
|
163
|
-
.replace(/\//g, '\\/');
|
|
215
|
+
// Handle case where request has concrete value (e.g., '/users/123')
|
|
216
|
+
// and route has param (e.g., '/users/{param}')
|
|
217
|
+
const routeRegex = normRoute
|
|
218
|
+
.replace(/\{param\}/g, '[^/]+') // {param} -> [^/]+
|
|
219
|
+
.replace(/\//g, '\\/'); // / -> \/
|
|
164
220
|
|
|
165
|
-
|
|
166
|
-
return regex.test(requestUrl);
|
|
221
|
+
return new RegExp(`^${routeRegex}$`).test(normRequest);
|
|
167
222
|
}
|
|
168
223
|
|
|
169
224
|
/**
|
|
170
|
-
*
|
|
225
|
+
* Check if path has parameters (for edge matchType metadata)
|
|
171
226
|
*/
|
|
172
227
|
private hasParams(path: string): boolean {
|
|
173
|
-
|
|
228
|
+
if (!path) return false;
|
|
229
|
+
// Check for Express params or template literals
|
|
230
|
+
return path.includes(':') || path.includes('${');
|
|
174
231
|
}
|
|
175
232
|
|
|
176
233
|
/**
|