@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
|
@@ -104,18 +104,21 @@ export class SQLInjectionValidator extends Plugin {
|
|
|
104
104
|
phase: 'VALIDATION',
|
|
105
105
|
priority: 90, // After ValueDomainAnalyzer (65)
|
|
106
106
|
creates: {
|
|
107
|
-
nodes: [],
|
|
108
|
-
edges: []
|
|
107
|
+
nodes: ['issue:security'],
|
|
108
|
+
edges: ['AFFECTS']
|
|
109
109
|
}
|
|
110
110
|
};
|
|
111
111
|
}
|
|
112
112
|
|
|
113
113
|
async execute(context: PluginContext): Promise<PluginResult> {
|
|
114
114
|
const { graph } = context;
|
|
115
|
+
const logger = this.log(context);
|
|
115
116
|
|
|
116
|
-
|
|
117
|
+
logger.info('Starting SQL injection vulnerability check');
|
|
117
118
|
|
|
118
119
|
const issues: SQLInjectionIssue[] = [];
|
|
120
|
+
let issueNodeCount = 0;
|
|
121
|
+
let affectsEdgeCount = 0;
|
|
119
122
|
|
|
120
123
|
// 1. Find all CALL nodes that look like SQL queries
|
|
121
124
|
const sqlCalls: CallNode[] = [];
|
|
@@ -127,13 +130,13 @@ export class SQLInjectionValidator extends Plugin {
|
|
|
127
130
|
}
|
|
128
131
|
}
|
|
129
132
|
|
|
130
|
-
|
|
133
|
+
logger.debug('SQL calls collected', { count: sqlCalls.length });
|
|
131
134
|
|
|
132
135
|
// 2. For each SQL call, analyze the query argument
|
|
133
136
|
for (const call of sqlCalls) {
|
|
134
137
|
const result = await this.analyzeQueryCall(call, graph);
|
|
135
138
|
if (result.isVulnerable) {
|
|
136
|
-
|
|
139
|
+
const issue: SQLInjectionIssue = {
|
|
137
140
|
type: 'SQL_INJECTION',
|
|
138
141
|
severity: 'ERROR',
|
|
139
142
|
message: `Potential SQL injection at ${call.file}:${call.line || '?'} - ${result.reason}`,
|
|
@@ -142,37 +145,79 @@ export class SQLInjectionValidator extends Plugin {
|
|
|
142
145
|
line: call.line as number | undefined,
|
|
143
146
|
reason: result.reason!,
|
|
144
147
|
nondeterministicSources: result.sources
|
|
145
|
-
}
|
|
148
|
+
};
|
|
149
|
+
issues.push(issue);
|
|
150
|
+
|
|
151
|
+
// Persist issue to graph if reportIssue is available
|
|
152
|
+
if (context.reportIssue) {
|
|
153
|
+
await context.reportIssue({
|
|
154
|
+
category: 'security',
|
|
155
|
+
severity: 'error',
|
|
156
|
+
message: issue.message,
|
|
157
|
+
file: call.file || '',
|
|
158
|
+
line: call.line || 0,
|
|
159
|
+
column: call.column || 0,
|
|
160
|
+
targetNodeId: call.id,
|
|
161
|
+
context: {
|
|
162
|
+
type: 'SQL_INJECTION',
|
|
163
|
+
reason: result.reason,
|
|
164
|
+
nondeterministicSources: result.sources
|
|
165
|
+
}
|
|
166
|
+
});
|
|
167
|
+
issueNodeCount++;
|
|
168
|
+
affectsEdgeCount++;
|
|
169
|
+
}
|
|
146
170
|
}
|
|
147
171
|
}
|
|
148
172
|
|
|
149
173
|
// 3. Also check via graph pattern - CALL nodes that have ARGUMENT -> PARAMETER paths
|
|
150
|
-
const patternViolations = await this.checkViaGraphPattern(graph, sqlCalls);
|
|
174
|
+
const patternViolations = await this.checkViaGraphPattern(graph, logger, sqlCalls);
|
|
151
175
|
for (const violation of patternViolations) {
|
|
152
176
|
// Avoid duplicates
|
|
153
177
|
if (!issues.find(i => i.nodeId === violation.nodeId)) {
|
|
154
178
|
issues.push(violation);
|
|
179
|
+
|
|
180
|
+
// Persist issue to graph if reportIssue is available
|
|
181
|
+
if (context.reportIssue) {
|
|
182
|
+
await context.reportIssue({
|
|
183
|
+
category: 'security',
|
|
184
|
+
severity: 'error',
|
|
185
|
+
message: violation.message,
|
|
186
|
+
file: violation.file || '',
|
|
187
|
+
line: violation.line || 0,
|
|
188
|
+
targetNodeId: violation.nodeId,
|
|
189
|
+
context: {
|
|
190
|
+
type: 'SQL_INJECTION',
|
|
191
|
+
reason: violation.reason,
|
|
192
|
+
nondeterministicSources: violation.nondeterministicSources
|
|
193
|
+
}
|
|
194
|
+
});
|
|
195
|
+
issueNodeCount++;
|
|
196
|
+
affectsEdgeCount++;
|
|
197
|
+
}
|
|
155
198
|
}
|
|
156
199
|
}
|
|
157
200
|
|
|
158
201
|
const summary = {
|
|
159
202
|
sqlCallsChecked: sqlCalls.length,
|
|
160
|
-
vulnerabilitiesFound: issues.length
|
|
203
|
+
vulnerabilitiesFound: issues.length,
|
|
204
|
+
issueNodesCreated: issueNodeCount,
|
|
205
|
+
affectsEdgesCreated: affectsEdgeCount
|
|
161
206
|
};
|
|
162
207
|
|
|
163
|
-
|
|
208
|
+
logger.info('Validation complete', summary);
|
|
164
209
|
|
|
165
210
|
if (issues.length > 0) {
|
|
166
|
-
|
|
211
|
+
logger.warn('SQL injection vulnerabilities found', { count: issues.length });
|
|
167
212
|
for (const issue of issues) {
|
|
168
|
-
|
|
213
|
+
logger.warn(issue.message);
|
|
169
214
|
}
|
|
170
215
|
} else {
|
|
171
|
-
|
|
216
|
+
logger.info('No SQL injection vulnerabilities detected');
|
|
172
217
|
}
|
|
173
218
|
|
|
174
219
|
return createSuccessResult(
|
|
175
|
-
{ nodes:
|
|
220
|
+
{ nodes: issueNodeCount, edges: affectsEdgeCount },
|
|
176
221
|
{ summary, issues }
|
|
177
222
|
);
|
|
178
223
|
}
|
|
@@ -192,9 +237,7 @@ export class SQLInjectionValidator extends Plugin {
|
|
|
192
237
|
|
|
193
238
|
// Check if this call has PASSES_ARGUMENT edges
|
|
194
239
|
const outgoing = await graph.getOutgoingEdges(call.id) as unknown as EdgeRecord[];
|
|
195
|
-
const argEdges = outgoing.filter(e =>
|
|
196
|
-
(e.edgeType || e.edge_type) === 'PASSES_ARGUMENT'
|
|
197
|
-
);
|
|
240
|
+
const argEdges = outgoing.filter(e => e.type === 'PASSES_ARGUMENT');
|
|
198
241
|
|
|
199
242
|
if (argEdges.length === 0) {
|
|
200
243
|
// No tracked arguments - check via queryArgName attribute if available
|
|
@@ -272,8 +315,7 @@ export class SQLInjectionValidator extends Plugin {
|
|
|
272
315
|
// Check DERIVES_FROM edges
|
|
273
316
|
const outgoing = await graph.getOutgoingEdges(exprNode.id) as unknown as EdgeRecord[];
|
|
274
317
|
const derivesFromEdges = outgoing.filter(e =>
|
|
275
|
-
|
|
276
|
-
(e.edgeType || e.edge_type) === 'ASSIGNED_FROM'
|
|
318
|
+
e.type === 'DERIVES_FROM' || e.type === 'ASSIGNED_FROM'
|
|
277
319
|
);
|
|
278
320
|
|
|
279
321
|
for (const edge of derivesFromEdges) {
|
|
@@ -307,6 +349,7 @@ export class SQLInjectionValidator extends Plugin {
|
|
|
307
349
|
*/
|
|
308
350
|
private async checkViaGraphPattern(
|
|
309
351
|
graph: PluginContext['graph'],
|
|
352
|
+
logger: ReturnType<typeof this.log>,
|
|
310
353
|
excludeCalls: CallNode[] = []
|
|
311
354
|
): Promise<SQLInjectionIssue[]> {
|
|
312
355
|
const issues: SQLInjectionIssue[] = [];
|
|
@@ -316,7 +359,7 @@ export class SQLInjectionValidator extends Plugin {
|
|
|
316
359
|
try {
|
|
317
360
|
// Check if graph supports checkGuarantee
|
|
318
361
|
if (!graph.checkGuarantee) {
|
|
319
|
-
|
|
362
|
+
logger.debug('Graph does not support checkGuarantee, skipping pattern-based check');
|
|
320
363
|
return issues;
|
|
321
364
|
}
|
|
322
365
|
|
|
@@ -353,7 +396,7 @@ export class SQLInjectionValidator extends Plugin {
|
|
|
353
396
|
}
|
|
354
397
|
} catch (err) {
|
|
355
398
|
// Datalog query might fail if backend doesn't support it
|
|
356
|
-
|
|
399
|
+
logger.debug('Datalog check skipped', { error: (err as Error).message });
|
|
357
400
|
}
|
|
358
401
|
|
|
359
402
|
return issues;
|
|
@@ -70,8 +70,9 @@ export class ShadowingDetector extends Plugin {
|
|
|
70
70
|
|
|
71
71
|
async execute(context: PluginContext): Promise<PluginResult> {
|
|
72
72
|
const { graph } = context;
|
|
73
|
+
const logger = this.log(context);
|
|
73
74
|
|
|
74
|
-
|
|
75
|
+
logger.info('Starting variable shadowing detection');
|
|
75
76
|
|
|
76
77
|
const issues: ShadowingIssue[] = [];
|
|
77
78
|
|
|
@@ -154,15 +155,15 @@ export class ShadowingDetector extends Plugin {
|
|
|
154
155
|
totalIssues: issues.length
|
|
155
156
|
};
|
|
156
157
|
|
|
157
|
-
|
|
158
|
+
logger.info('Detection complete', { ...summary });
|
|
158
159
|
|
|
159
160
|
if (issues.length > 0) {
|
|
160
|
-
|
|
161
|
+
logger.warn('Shadowing issues found', { count: issues.length });
|
|
161
162
|
for (const issue of issues) {
|
|
162
|
-
|
|
163
|
+
logger.warn(issue.message, { type: issue.type });
|
|
163
164
|
}
|
|
164
165
|
} else {
|
|
165
|
-
|
|
166
|
+
logger.info('No shadowing issues detected');
|
|
166
167
|
}
|
|
167
168
|
|
|
168
169
|
return createSuccessResult(
|
|
@@ -58,14 +58,15 @@ export class TypeScriptDeadCodeValidator extends Plugin {
|
|
|
58
58
|
|
|
59
59
|
async execute(context: PluginContext): Promise<PluginResult> {
|
|
60
60
|
const { graph } = context;
|
|
61
|
+
const logger = this.log(context);
|
|
61
62
|
|
|
62
|
-
|
|
63
|
+
logger.info('Starting TypeScript dead code analysis');
|
|
63
64
|
const startTime = Date.now();
|
|
64
65
|
|
|
65
66
|
const issues: DeadCodeIssue[] = [];
|
|
66
67
|
|
|
67
68
|
// Collect all interfaces
|
|
68
|
-
|
|
69
|
+
logger.debug('Collecting interfaces');
|
|
69
70
|
const interfaces: Map<string, { id: string; name: string; file?: string; line?: number; properties?: unknown[] }> = new Map();
|
|
70
71
|
|
|
71
72
|
for await (const node of graph.queryNodes({ nodeType: 'INTERFACE' })) {
|
|
@@ -80,10 +81,10 @@ export class TypeScriptDeadCodeValidator extends Plugin {
|
|
|
80
81
|
properties: (node as { properties?: unknown[] }).properties
|
|
81
82
|
});
|
|
82
83
|
}
|
|
83
|
-
|
|
84
|
+
logger.debug('Interfaces collected', { count: interfaces.size });
|
|
84
85
|
|
|
85
86
|
// Find interfaces with IMPLEMENTS or EXTENDS edges
|
|
86
|
-
|
|
87
|
+
logger.debug('Checking implementations');
|
|
87
88
|
const implementedInterfaces: Map<string, number> = new Map();
|
|
88
89
|
|
|
89
90
|
// Get all edges and filter by type (no queryEdges in GraphBackend yet)
|
|
@@ -168,31 +169,31 @@ export class TypeScriptDeadCodeValidator extends Plugin {
|
|
|
168
169
|
timeSeconds: totalTime
|
|
169
170
|
};
|
|
170
171
|
|
|
171
|
-
|
|
172
|
+
logger.info('Analysis complete', { ...summary });
|
|
172
173
|
|
|
173
174
|
// Report issues
|
|
174
175
|
const warnings = issues.filter(i => i.severity === 'WARNING');
|
|
175
176
|
const infos = issues.filter(i => i.severity === 'INFO');
|
|
176
177
|
|
|
177
178
|
if (warnings.length > 0) {
|
|
178
|
-
|
|
179
|
+
logger.warn('Warnings found', { count: warnings.length });
|
|
179
180
|
for (const issue of warnings) {
|
|
180
|
-
|
|
181
|
+
logger.warn(issue.message);
|
|
181
182
|
}
|
|
182
183
|
}
|
|
183
184
|
|
|
184
185
|
if (infos.length > 0) {
|
|
185
|
-
|
|
186
|
+
logger.info('Info messages', { count: infos.length });
|
|
186
187
|
for (const issue of infos.slice(0, 5)) { // Limit to first 5
|
|
187
|
-
|
|
188
|
+
logger.info(issue.message);
|
|
188
189
|
}
|
|
189
190
|
if (infos.length > 5) {
|
|
190
|
-
|
|
191
|
+
logger.debug(`... and ${infos.length - 5} more`);
|
|
191
192
|
}
|
|
192
193
|
}
|
|
193
194
|
|
|
194
195
|
if (issues.length === 0) {
|
|
195
|
-
|
|
196
|
+
logger.info('No dead TypeScript code detected');
|
|
196
197
|
}
|
|
197
198
|
|
|
198
199
|
return createSuccessResult(
|
|
@@ -7,6 +7,7 @@
|
|
|
7
7
|
|
|
8
8
|
import { VCSPlugin, FileStatus } from './VCSPlugin.js';
|
|
9
9
|
import type { VCSConfig, VCSPluginMetadata, ChangedFile, FileDiff, DiffHunk } from './VCSPlugin.js';
|
|
10
|
+
import { FileAccessError } from '../../errors/GrafemaError.js';
|
|
10
11
|
import { exec } from 'child_process';
|
|
11
12
|
import { promisify } from 'util';
|
|
12
13
|
import { join } from 'path';
|
|
@@ -113,8 +114,12 @@ export class GitPlugin extends VCSPlugin {
|
|
|
113
114
|
|
|
114
115
|
return files;
|
|
115
116
|
} catch (error) {
|
|
116
|
-
|
|
117
|
-
|
|
117
|
+
throw new FileAccessError(
|
|
118
|
+
`Failed to get changed files: ${(error as Error).message}`,
|
|
119
|
+
'ERR_GIT_ACCESS_DENIED',
|
|
120
|
+
{ plugin: 'GitPlugin' },
|
|
121
|
+
'Check that git is installed and this is a valid git repository'
|
|
122
|
+
);
|
|
118
123
|
}
|
|
119
124
|
}
|
|
120
125
|
|
|
@@ -152,8 +157,12 @@ export class GitPlugin extends VCSPlugin {
|
|
|
152
157
|
// Парсим unified diff
|
|
153
158
|
return this._parseUnifiedDiff(filePath, stdout);
|
|
154
159
|
} catch (error) {
|
|
155
|
-
|
|
156
|
-
|
|
160
|
+
throw new FileAccessError(
|
|
161
|
+
`Failed to get diff for ${filePath}: ${(error as Error).message}`,
|
|
162
|
+
'ERR_GIT_ACCESS_DENIED',
|
|
163
|
+
{ plugin: 'GitPlugin', filePath },
|
|
164
|
+
'Ensure the file is tracked by git and the working directory is accessible'
|
|
165
|
+
);
|
|
157
166
|
}
|
|
158
167
|
}
|
|
159
168
|
|
|
@@ -164,8 +173,13 @@ export class GitPlugin extends VCSPlugin {
|
|
|
164
173
|
try {
|
|
165
174
|
const { stdout } = await this._exec('git rev-parse --abbrev-ref HEAD');
|
|
166
175
|
return stdout.trim();
|
|
167
|
-
} catch {
|
|
168
|
-
|
|
176
|
+
} catch (error) {
|
|
177
|
+
throw new FileAccessError(
|
|
178
|
+
`Failed to get current branch: ${(error as Error).message}`,
|
|
179
|
+
'ERR_GIT_ACCESS_DENIED',
|
|
180
|
+
{ plugin: 'GitPlugin' },
|
|
181
|
+
'Ensure this is a valid git repository with at least one commit'
|
|
182
|
+
);
|
|
169
183
|
}
|
|
170
184
|
}
|
|
171
185
|
|
|
@@ -176,8 +190,13 @@ export class GitPlugin extends VCSPlugin {
|
|
|
176
190
|
try {
|
|
177
191
|
const { stdout } = await this._exec('git rev-parse HEAD');
|
|
178
192
|
return stdout.trim();
|
|
179
|
-
} catch {
|
|
180
|
-
|
|
193
|
+
} catch (error) {
|
|
194
|
+
throw new FileAccessError(
|
|
195
|
+
`Failed to get last commit hash: ${(error as Error).message}`,
|
|
196
|
+
'ERR_GIT_NOT_FOUND',
|
|
197
|
+
{ plugin: 'GitPlugin' },
|
|
198
|
+
'Ensure this is a valid git repository with at least one commit'
|
|
199
|
+
);
|
|
181
200
|
}
|
|
182
201
|
}
|
|
183
202
|
|
|
@@ -309,8 +328,12 @@ export class GitPlugin extends VCSPlugin {
|
|
|
309
328
|
const { stdout } = await this._exec('git ls-files');
|
|
310
329
|
return stdout.trim().split('\n').filter(line => line.length > 0);
|
|
311
330
|
} catch (error) {
|
|
312
|
-
|
|
313
|
-
|
|
331
|
+
throw new FileAccessError(
|
|
332
|
+
`Failed to get tracked files: ${(error as Error).message}`,
|
|
333
|
+
'ERR_GIT_ACCESS_DENIED',
|
|
334
|
+
{ plugin: 'GitPlugin' },
|
|
335
|
+
'Check that git is installed and this is a valid git repository'
|
|
336
|
+
);
|
|
314
337
|
}
|
|
315
338
|
}
|
|
316
339
|
|
|
@@ -329,8 +352,13 @@ export class GitPlugin extends VCSPlugin {
|
|
|
329
352
|
timestamp: parseInt(lines[3]) * 1000,
|
|
330
353
|
message: lines[4]
|
|
331
354
|
};
|
|
332
|
-
} catch {
|
|
333
|
-
|
|
355
|
+
} catch (error) {
|
|
356
|
+
throw new FileAccessError(
|
|
357
|
+
`Failed to get last commit info: ${(error as Error).message}`,
|
|
358
|
+
'ERR_GIT_NOT_FOUND',
|
|
359
|
+
{ plugin: 'GitPlugin' },
|
|
360
|
+
'Ensure this is a valid git repository with at least one commit'
|
|
361
|
+
);
|
|
334
362
|
}
|
|
335
363
|
}
|
|
336
364
|
|
|
@@ -12,6 +12,8 @@
|
|
|
12
12
|
* - Perforce
|
|
13
13
|
*/
|
|
14
14
|
|
|
15
|
+
import type { Logger } from '../../logging/Logger.js';
|
|
16
|
+
|
|
15
17
|
/**
|
|
16
18
|
* VCS Plugin configuration
|
|
17
19
|
*/
|
|
@@ -154,13 +156,13 @@ export class VCSPluginFactory {
|
|
|
154
156
|
/**
|
|
155
157
|
* Автоматически определить и создать подходящий VCS плагин
|
|
156
158
|
*/
|
|
157
|
-
static async detect(config: VCSConfig = {}): Promise<VCSPlugin | null> {
|
|
159
|
+
static async detect(config: VCSConfig = {}, logger?: Logger): Promise<VCSPlugin | null> {
|
|
158
160
|
for (const PluginClass of this.availablePlugins) {
|
|
159
161
|
const plugin = new PluginClass(config);
|
|
160
162
|
|
|
161
163
|
try {
|
|
162
164
|
if (await plugin.isAvailable()) {
|
|
163
|
-
|
|
165
|
+
logger?.info('VCS detected', { name: plugin.metadata.name });
|
|
164
166
|
return plugin;
|
|
165
167
|
}
|
|
166
168
|
} catch {
|
|
@@ -168,20 +170,20 @@ export class VCSPluginFactory {
|
|
|
168
170
|
}
|
|
169
171
|
}
|
|
170
172
|
|
|
171
|
-
|
|
173
|
+
logger?.warn('No VCS system detected');
|
|
172
174
|
return null;
|
|
173
175
|
}
|
|
174
176
|
|
|
175
177
|
/**
|
|
176
178
|
* Создать плагин по имени
|
|
177
179
|
*/
|
|
178
|
-
static create(name: string, config: VCSConfig = {}): VCSPlugin | null {
|
|
180
|
+
static create(name: string, config: VCSConfig = {}, logger?: Logger): VCSPlugin | null {
|
|
179
181
|
const PluginClass = this.availablePlugins.find(
|
|
180
182
|
Plugin => new Plugin(config).metadata.name === name
|
|
181
183
|
);
|
|
182
184
|
|
|
183
185
|
if (!PluginClass) {
|
|
184
|
-
|
|
186
|
+
logger?.error('VCS plugin not found', { name });
|
|
185
187
|
return null;
|
|
186
188
|
}
|
|
187
189
|
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
# Graph Query Utilities
|
|
2
|
+
|
|
3
|
+
## Graph Structure
|
|
4
|
+
|
|
5
|
+
### Function Containment
|
|
6
|
+
|
|
7
|
+
```
|
|
8
|
+
FUNCTION -[HAS_SCOPE]-> SCOPE (function_body)
|
|
9
|
+
SCOPE -[CONTAINS]-> SCOPE (nested blocks: if, for, etc.)
|
|
10
|
+
SCOPE -[CONTAINS]-> CALL (function call)
|
|
11
|
+
SCOPE -[CONTAINS]-> METHOD_CALL (method call)
|
|
12
|
+
SCOPE -[DECLARES]-> VARIABLE
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
**Key Points:**
|
|
16
|
+
- FUNCTION nodes do NOT have CONTAINS edges directly
|
|
17
|
+
- FUNCTION has exactly one HAS_SCOPE edge to its body SCOPE
|
|
18
|
+
- All content (calls, variables, nested scopes) is inside SCOPEs
|
|
19
|
+
- Nested functions have their own HAS_SCOPE -> SCOPE hierarchy
|
|
20
|
+
- Variables are connected via DECLARES (not CONTAINS)
|
|
21
|
+
|
|
22
|
+
### Call Resolution
|
|
23
|
+
|
|
24
|
+
```
|
|
25
|
+
CALL/METHOD_CALL -[CALLS]-> FUNCTION (target)
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
- CALLS edge exists only if target function was resolved
|
|
29
|
+
- Resolved = we found the function definition in the graph
|
|
30
|
+
- Unresolved = external function, dynamic call, or import issue
|
|
31
|
+
|
|
32
|
+
### Backward Traversal (finding container)
|
|
33
|
+
|
|
34
|
+
To find the function containing a CALL:
|
|
35
|
+
|
|
36
|
+
```
|
|
37
|
+
CALL <- CONTAINS <- SCOPE <- CONTAINS <- SCOPE <- HAS_SCOPE <- FUNCTION
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
To find the function containing a VARIABLE:
|
|
41
|
+
|
|
42
|
+
```
|
|
43
|
+
VARIABLE <- DECLARES <- SCOPE <- CONTAINS <- SCOPE <- HAS_SCOPE <- FUNCTION
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
Walk up via CONTAINS, DECLARES, and HAS_SCOPE edges.
|
|
@@ -0,0 +1,206 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Find all CALL and METHOD_CALL nodes inside a function.
|
|
3
|
+
*
|
|
4
|
+
* Graph structure:
|
|
5
|
+
* ```
|
|
6
|
+
* FUNCTION -[HAS_SCOPE]-> SCOPE -[CONTAINS]-> CALL
|
|
7
|
+
* SCOPE -[CONTAINS]-> METHOD_CALL
|
|
8
|
+
* SCOPE -[CONTAINS]-> SCOPE (nested blocks)
|
|
9
|
+
* ```
|
|
10
|
+
*
|
|
11
|
+
* Algorithm:
|
|
12
|
+
* 1. Get function's scope via HAS_SCOPE edge
|
|
13
|
+
* 2. BFS through CONTAINS edges, collecting CALL and METHOD_CALL nodes
|
|
14
|
+
* 3. Stop at nested FUNCTION/CLASS boundaries (don't enter inner functions)
|
|
15
|
+
* 4. For each call, check CALLS edge to determine if resolved
|
|
16
|
+
* 5. If transitive=true, recursively follow resolved CALLS edges
|
|
17
|
+
*
|
|
18
|
+
* Performance: O(S + C) where S = scopes, C = calls
|
|
19
|
+
* For functions with 100 calls, expect ~200 DB operations.
|
|
20
|
+
*
|
|
21
|
+
* @module queries/findCallsInFunction
|
|
22
|
+
*/
|
|
23
|
+
|
|
24
|
+
import type { CallInfo, FindCallsOptions } from './types.js';
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* Graph backend interface (minimal surface)
|
|
28
|
+
*/
|
|
29
|
+
interface GraphBackend {
|
|
30
|
+
getNode(id: string): Promise<{
|
|
31
|
+
id: string;
|
|
32
|
+
type: string;
|
|
33
|
+
name: string;
|
|
34
|
+
file?: string;
|
|
35
|
+
line?: number;
|
|
36
|
+
object?: string;
|
|
37
|
+
} | null>;
|
|
38
|
+
getOutgoingEdges(
|
|
39
|
+
nodeId: string,
|
|
40
|
+
edgeTypes: string[] | null
|
|
41
|
+
): Promise<Array<{ src: string; dst: string; type: string }>>;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* Find all CALL and METHOD_CALL nodes inside a function.
|
|
46
|
+
*
|
|
47
|
+
* @param backend - Graph backend for queries
|
|
48
|
+
* @param functionId - ID of the FUNCTION node
|
|
49
|
+
* @param options - Options for traversal
|
|
50
|
+
* @returns Array of CallInfo objects
|
|
51
|
+
*/
|
|
52
|
+
export async function findCallsInFunction(
|
|
53
|
+
backend: GraphBackend,
|
|
54
|
+
functionId: string,
|
|
55
|
+
options: FindCallsOptions = {}
|
|
56
|
+
): Promise<CallInfo[]> {
|
|
57
|
+
const {
|
|
58
|
+
maxDepth = 10,
|
|
59
|
+
transitive = false,
|
|
60
|
+
transitiveDepth = 5,
|
|
61
|
+
} = options;
|
|
62
|
+
|
|
63
|
+
const calls: CallInfo[] = [];
|
|
64
|
+
const visited = new Set<string>();
|
|
65
|
+
const seenTargets = new Set<string>(); // For deduplication in transitive mode
|
|
66
|
+
|
|
67
|
+
// Add the starting function to seenTargets to prevent cycles back to it
|
|
68
|
+
if (transitive) {
|
|
69
|
+
seenTargets.add(functionId);
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
// Step 1: Get function's scope via HAS_SCOPE
|
|
73
|
+
const hasScopeEdges = await backend.getOutgoingEdges(functionId, ['HAS_SCOPE']);
|
|
74
|
+
|
|
75
|
+
// BFS queue: { nodeId, currentDepth }
|
|
76
|
+
const queue: Array<{ id: string; depth: number }> = [];
|
|
77
|
+
|
|
78
|
+
for (const edge of hasScopeEdges) {
|
|
79
|
+
queue.push({ id: edge.dst, depth: 0 });
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
// Step 2: BFS through scopes
|
|
83
|
+
while (queue.length > 0) {
|
|
84
|
+
const { id, depth } = queue.shift()!;
|
|
85
|
+
|
|
86
|
+
if (visited.has(id) || depth > maxDepth) continue;
|
|
87
|
+
visited.add(id);
|
|
88
|
+
|
|
89
|
+
const containsEdges = await backend.getOutgoingEdges(id, ['CONTAINS']);
|
|
90
|
+
|
|
91
|
+
for (const edge of containsEdges) {
|
|
92
|
+
const child = await backend.getNode(edge.dst);
|
|
93
|
+
if (!child) continue;
|
|
94
|
+
|
|
95
|
+
// Collect CALL and METHOD_CALL nodes
|
|
96
|
+
if (child.type === 'CALL' || child.type === 'METHOD_CALL') {
|
|
97
|
+
const callInfo = await buildCallInfo(backend, child, 0);
|
|
98
|
+
calls.push(callInfo);
|
|
99
|
+
|
|
100
|
+
// Transitive: follow resolved calls
|
|
101
|
+
if (transitive && callInfo.resolved && callInfo.target) {
|
|
102
|
+
await collectTransitiveCalls(
|
|
103
|
+
backend,
|
|
104
|
+
callInfo.target.id,
|
|
105
|
+
1, // Starting at depth 1
|
|
106
|
+
transitiveDepth,
|
|
107
|
+
calls,
|
|
108
|
+
seenTargets
|
|
109
|
+
);
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
// Continue into nested scopes, but NOT into nested functions/classes
|
|
114
|
+
if (child.type === 'SCOPE') {
|
|
115
|
+
queue.push({ id: child.id, depth: depth + 1 });
|
|
116
|
+
}
|
|
117
|
+
// Skip FUNCTION, CLASS - they have their own scope hierarchy
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
return calls;
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
/**
|
|
125
|
+
* Build CallInfo from a call node
|
|
126
|
+
*/
|
|
127
|
+
async function buildCallInfo(
|
|
128
|
+
backend: GraphBackend,
|
|
129
|
+
callNode: { id: string; type: string; name: string; file?: string; line?: number; object?: string },
|
|
130
|
+
depth: number
|
|
131
|
+
): Promise<CallInfo> {
|
|
132
|
+
// Check for CALLS edge (resolved target)
|
|
133
|
+
const callsEdges = await backend.getOutgoingEdges(callNode.id, ['CALLS']);
|
|
134
|
+
const isResolved = callsEdges.length > 0;
|
|
135
|
+
|
|
136
|
+
let target = undefined;
|
|
137
|
+
if (isResolved) {
|
|
138
|
+
const targetNode = await backend.getNode(callsEdges[0].dst);
|
|
139
|
+
if (targetNode) {
|
|
140
|
+
target = {
|
|
141
|
+
id: targetNode.id,
|
|
142
|
+
name: targetNode.name,
|
|
143
|
+
file: targetNode.file,
|
|
144
|
+
line: targetNode.line,
|
|
145
|
+
};
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
return {
|
|
150
|
+
id: callNode.id,
|
|
151
|
+
name: callNode.name,
|
|
152
|
+
type: callNode.type as 'CALL' | 'METHOD_CALL',
|
|
153
|
+
object: callNode.object,
|
|
154
|
+
resolved: isResolved,
|
|
155
|
+
target,
|
|
156
|
+
file: callNode.file,
|
|
157
|
+
line: callNode.line,
|
|
158
|
+
depth,
|
|
159
|
+
};
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
/**
|
|
163
|
+
* Recursively collect transitive calls
|
|
164
|
+
*
|
|
165
|
+
* Infinite loop prevention:
|
|
166
|
+
* - Track seen function IDs in seenTargets
|
|
167
|
+
* - Stop when we've seen a function before (handles recursion)
|
|
168
|
+
* - Stop at transitiveDepth limit
|
|
169
|
+
*/
|
|
170
|
+
async function collectTransitiveCalls(
|
|
171
|
+
backend: GraphBackend,
|
|
172
|
+
functionId: string,
|
|
173
|
+
currentDepth: number,
|
|
174
|
+
maxTransitiveDepth: number,
|
|
175
|
+
calls: CallInfo[],
|
|
176
|
+
seenTargets: Set<string>
|
|
177
|
+
): Promise<void> {
|
|
178
|
+
// Prevent infinite loops and limit depth
|
|
179
|
+
if (seenTargets.has(functionId) || currentDepth > maxTransitiveDepth) {
|
|
180
|
+
return;
|
|
181
|
+
}
|
|
182
|
+
seenTargets.add(functionId);
|
|
183
|
+
|
|
184
|
+
// Find calls in this function (non-transitive to avoid recursion)
|
|
185
|
+
const innerCalls = await findCallsInFunction(backend, functionId, {
|
|
186
|
+
maxDepth: 10,
|
|
187
|
+
transitive: false,
|
|
188
|
+
});
|
|
189
|
+
|
|
190
|
+
for (const call of innerCalls) {
|
|
191
|
+
// Add with updated depth
|
|
192
|
+
calls.push({ ...call, depth: currentDepth });
|
|
193
|
+
|
|
194
|
+
// Continue transitively if resolved
|
|
195
|
+
if (call.resolved && call.target) {
|
|
196
|
+
await collectTransitiveCalls(
|
|
197
|
+
backend,
|
|
198
|
+
call.target.id,
|
|
199
|
+
currentDepth + 1,
|
|
200
|
+
maxTransitiveDepth,
|
|
201
|
+
calls,
|
|
202
|
+
seenTargets
|
|
203
|
+
);
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
}
|