@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
|
@@ -16,6 +16,7 @@
|
|
|
16
16
|
import { Plugin, createSuccessResult } from '../Plugin.js';
|
|
17
17
|
import type { PluginContext, PluginResult, PluginMetadata } from '../Plugin.js';
|
|
18
18
|
import type { BaseNodeRecord, NodeRecord } from '@grafema/types';
|
|
19
|
+
import { StrictModeError } from '../../errors/GrafemaError.js';
|
|
19
20
|
|
|
20
21
|
/**
|
|
21
22
|
* Alias info from index
|
|
@@ -80,13 +81,15 @@ export class AliasTracker extends Plugin {
|
|
|
80
81
|
|
|
81
82
|
async execute(context: PluginContext): Promise<PluginResult> {
|
|
82
83
|
const { graph, onProgress } = context;
|
|
84
|
+
const logger = this.log(context);
|
|
83
85
|
|
|
84
|
-
|
|
86
|
+
logger.info('Starting alias resolution');
|
|
85
87
|
|
|
86
88
|
let callsProcessed = 0;
|
|
87
89
|
let aliasesFound = 0;
|
|
88
90
|
let edgesCreated = 0;
|
|
89
91
|
let resolvedToMethod = 0;
|
|
92
|
+
const errors: Error[] = [];
|
|
90
93
|
|
|
91
94
|
// Трекинг превышений глубины
|
|
92
95
|
this.depthExceeded = [];
|
|
@@ -105,11 +108,11 @@ export class AliasTracker extends Plugin {
|
|
|
105
108
|
unresolvedCalls.push(callNode);
|
|
106
109
|
}
|
|
107
110
|
|
|
108
|
-
|
|
111
|
+
logger.info('Found unresolved call sites', { count: unresolvedCalls.length });
|
|
109
112
|
|
|
110
113
|
// 2. Строим индекс алиасов: variableName -> EXPRESSION info
|
|
111
114
|
const aliasIndex = await this.buildAliasIndex(graph);
|
|
112
|
-
|
|
115
|
+
logger.debug('Found potential aliases', { count: aliasIndex.size });
|
|
113
116
|
|
|
114
117
|
// 3. Строим индекс методов для резолвинга
|
|
115
118
|
const methodIndex = await this.buildMethodIndex(graph);
|
|
@@ -182,15 +185,39 @@ export class AliasTracker extends Plugin {
|
|
|
182
185
|
|
|
183
186
|
// Алярм если были превышения глубины
|
|
184
187
|
if (this.depthExceeded.length > 0) {
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
+
logger.warn('Alias chains exceeded max depth', {
|
|
189
|
+
count: this.depthExceeded.length,
|
|
190
|
+
maxDepth: AliasTracker.MAX_DEPTH,
|
|
191
|
+
examples: this.depthExceeded.slice(0, 5).map(info => ({
|
|
192
|
+
file: info.file,
|
|
193
|
+
name: info.name,
|
|
194
|
+
chain: info.chain.join(' → ')
|
|
195
|
+
}))
|
|
196
|
+
});
|
|
197
|
+
|
|
198
|
+
// In strict mode, report as errors
|
|
199
|
+
if (context.strictMode) {
|
|
200
|
+
for (const info of this.depthExceeded) {
|
|
201
|
+
const error = new StrictModeError(
|
|
202
|
+
`Alias chain exceeded max depth (${info.depth}): ${info.name}`,
|
|
203
|
+
'STRICT_ALIAS_DEPTH_EXCEEDED',
|
|
204
|
+
{
|
|
205
|
+
filePath: info.file,
|
|
206
|
+
phase: 'ENRICHMENT',
|
|
207
|
+
plugin: 'AliasTracker',
|
|
208
|
+
aliasName: info.name,
|
|
209
|
+
chainLength: info.depth,
|
|
210
|
+
},
|
|
211
|
+
`Possible circular alias reference. Chain: ${info.chain.slice(0, 3).join(' -> ')}...`
|
|
212
|
+
);
|
|
213
|
+
errors.push(error);
|
|
214
|
+
}
|
|
188
215
|
}
|
|
189
216
|
}
|
|
190
217
|
|
|
191
|
-
|
|
218
|
+
logger.info('Summary', summary);
|
|
192
219
|
|
|
193
|
-
return createSuccessResult({ nodes: 0, edges: edgesCreated }, summary);
|
|
220
|
+
return createSuccessResult({ nodes: 0, edges: edgesCreated }, summary, errors);
|
|
194
221
|
}
|
|
195
222
|
|
|
196
223
|
/**
|
|
@@ -0,0 +1,240 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ArgumentParameterLinker - creates RECEIVES_ARGUMENT edges connecting
|
|
3
|
+
* function parameters to call arguments.
|
|
4
|
+
*
|
|
5
|
+
* RECEIVES_ARGUMENT edges connect:
|
|
6
|
+
* PARAMETER node -> RECEIVES_ARGUMENT -> argument source (VARIABLE, LITERAL, CALL, etc.)
|
|
7
|
+
*
|
|
8
|
+
* This is the inverse of PASSES_ARGUMENT:
|
|
9
|
+
* - PASSES_ARGUMENT: CALL -> argument (call site perspective)
|
|
10
|
+
* - RECEIVES_ARGUMENT: PARAMETER -> argument (function perspective)
|
|
11
|
+
*
|
|
12
|
+
* Edge attributes:
|
|
13
|
+
* - argIndex: position of the argument (0-based)
|
|
14
|
+
* - callId: ID of the CALL node that passed this argument
|
|
15
|
+
*
|
|
16
|
+
* Algorithm:
|
|
17
|
+
* For each CALL node with PASSES_ARGUMENT edges:
|
|
18
|
+
* 1. Get outgoing CALLS edge to find target function
|
|
19
|
+
* 2. If no CALLS edge -> skip (unresolved call)
|
|
20
|
+
* 3. Get target function's PARAMETER nodes via HAS_PARAMETER edges
|
|
21
|
+
* 4. For each PASSES_ARGUMENT edge:
|
|
22
|
+
* a. Get argIndex from edge metadata
|
|
23
|
+
* b. Find PARAMETER with matching index
|
|
24
|
+
* c. Create RECEIVES_ARGUMENT edge: PARAMETER -> argument_source
|
|
25
|
+
*/
|
|
26
|
+
|
|
27
|
+
import { Plugin, createSuccessResult } from '../Plugin.js';
|
|
28
|
+
import type { PluginContext, PluginResult, PluginMetadata } from '../Plugin.js';
|
|
29
|
+
import type { BaseNodeRecord, EdgeRecord } from '@grafema/types';
|
|
30
|
+
import { StrictModeError } from '../../errors/GrafemaError.js';
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* Extended call node type
|
|
34
|
+
*/
|
|
35
|
+
interface CallNode extends BaseNodeRecord {
|
|
36
|
+
// All properties inherited from BaseNodeRecord
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* Extended parameter node type
|
|
41
|
+
*/
|
|
42
|
+
interface ParameterNode extends BaseNodeRecord {
|
|
43
|
+
index?: number;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* Edge with metadata for PASSES_ARGUMENT
|
|
48
|
+
*/
|
|
49
|
+
interface PassesArgumentEdge extends EdgeRecord {
|
|
50
|
+
argIndex?: number;
|
|
51
|
+
isSpread?: boolean;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* Edge record with extended fields for RECEIVES_ARGUMENT lookup
|
|
56
|
+
*/
|
|
57
|
+
interface ExtendedEdgeRecord extends EdgeRecord {
|
|
58
|
+
callId?: string;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
export class ArgumentParameterLinker extends Plugin {
|
|
62
|
+
get metadata(): PluginMetadata {
|
|
63
|
+
return {
|
|
64
|
+
name: 'ArgumentParameterLinker',
|
|
65
|
+
phase: 'ENRICHMENT',
|
|
66
|
+
priority: 45, // Runs AFTER MethodCallResolver (50) which creates required CALLS edges
|
|
67
|
+
creates: {
|
|
68
|
+
nodes: [],
|
|
69
|
+
edges: ['RECEIVES_ARGUMENT']
|
|
70
|
+
},
|
|
71
|
+
dependencies: ['JSASTAnalyzer', 'MethodCallResolver'] // Requires CALLS edges
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
async execute(context: PluginContext): Promise<PluginResult> {
|
|
76
|
+
const { graph, onProgress } = context;
|
|
77
|
+
const logger = this.log(context);
|
|
78
|
+
|
|
79
|
+
logger.info('Starting argument-parameter linking');
|
|
80
|
+
|
|
81
|
+
const startTime = Date.now();
|
|
82
|
+
|
|
83
|
+
let callsProcessed = 0;
|
|
84
|
+
let edgesCreated = 0;
|
|
85
|
+
let unresolvedCalls = 0;
|
|
86
|
+
let noParams = 0;
|
|
87
|
+
const errors: Error[] = [];
|
|
88
|
+
|
|
89
|
+
// Collect all CALL nodes (both CALL and METHOD_CALL via CALL type check)
|
|
90
|
+
const callNodes: CallNode[] = [];
|
|
91
|
+
for await (const node of graph.queryNodes({ nodeType: 'CALL' })) {
|
|
92
|
+
callNodes.push(node as CallNode);
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
logger.info('Found calls to process', { count: callNodes.length });
|
|
96
|
+
|
|
97
|
+
// Build a Set of existing RECEIVES_ARGUMENT edges to avoid duplicates
|
|
98
|
+
// Key: `${paramId}:${dstId}:${callId}`
|
|
99
|
+
const existingEdges = new Set<string>();
|
|
100
|
+
for await (const node of graph.queryNodes({ nodeType: 'PARAMETER' })) {
|
|
101
|
+
const edges = await graph.getOutgoingEdges(node.id, ['RECEIVES_ARGUMENT']) as ExtendedEdgeRecord[];
|
|
102
|
+
for (const edge of edges) {
|
|
103
|
+
const callId = edge.callId ?? (edge.metadata?.callId as string | undefined) ?? '';
|
|
104
|
+
existingEdges.add(`${node.id}:${edge.dst}:${callId}`);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
logger.debug('Found existing RECEIVES_ARGUMENT edges', { count: existingEdges.size });
|
|
108
|
+
|
|
109
|
+
for (const callNode of callNodes) {
|
|
110
|
+
callsProcessed++;
|
|
111
|
+
|
|
112
|
+
// Report progress every 100 calls
|
|
113
|
+
if (onProgress && callsProcessed % 100 === 0) {
|
|
114
|
+
const elapsed = ((Date.now() - startTime) / 1000).toFixed(1);
|
|
115
|
+
onProgress({
|
|
116
|
+
phase: 'enrichment',
|
|
117
|
+
currentPlugin: 'ArgumentParameterLinker',
|
|
118
|
+
message: `Linking arguments ${callsProcessed}/${callNodes.length} (${elapsed}s)`,
|
|
119
|
+
totalFiles: callNodes.length,
|
|
120
|
+
processedFiles: callsProcessed
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
// 1. Get PASSES_ARGUMENT edges from this call
|
|
125
|
+
const passesArgumentEdges = await graph.getOutgoingEdges(callNode.id, ['PASSES_ARGUMENT']);
|
|
126
|
+
if (passesArgumentEdges.length === 0) {
|
|
127
|
+
continue; // No arguments passed, skip
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
// 2. Get CALLS edge to find target function
|
|
131
|
+
const callsEdges = await graph.getOutgoingEdges(callNode.id, ['CALLS']);
|
|
132
|
+
if (callsEdges.length === 0) {
|
|
133
|
+
unresolvedCalls++;
|
|
134
|
+
|
|
135
|
+
// In strict mode, report unresolved calls that have arguments
|
|
136
|
+
if (context.strictMode) {
|
|
137
|
+
const error = new StrictModeError(
|
|
138
|
+
`Call with arguments has no resolved target: ${callNode.name || callNode.id}`,
|
|
139
|
+
'STRICT_UNRESOLVED_ARGUMENT',
|
|
140
|
+
{
|
|
141
|
+
filePath: callNode.file,
|
|
142
|
+
lineNumber: callNode.line as number | undefined,
|
|
143
|
+
phase: 'ENRICHMENT',
|
|
144
|
+
plugin: 'ArgumentParameterLinker',
|
|
145
|
+
callId: callNode.id,
|
|
146
|
+
},
|
|
147
|
+
`Ensure the called function is imported or defined`
|
|
148
|
+
);
|
|
149
|
+
errors.push(error);
|
|
150
|
+
}
|
|
151
|
+
continue; // Unresolved call, skip
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
// Get target function node
|
|
155
|
+
const targetFunctionId = callsEdges[0].dst;
|
|
156
|
+
const targetFunction = await graph.getNode(targetFunctionId);
|
|
157
|
+
if (!targetFunction) {
|
|
158
|
+
unresolvedCalls++;
|
|
159
|
+
continue;
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
// 3. Get target function's PARAMETER nodes via HAS_PARAMETER edges
|
|
163
|
+
const hasParameterEdges = await graph.getOutgoingEdges(targetFunctionId, ['HAS_PARAMETER']);
|
|
164
|
+
if (hasParameterEdges.length === 0) {
|
|
165
|
+
noParams++;
|
|
166
|
+
continue; // Function has no parameters
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
// Build parameter index map: argIndex -> paramNode
|
|
170
|
+
const paramsByIndex = new Map<number, ParameterNode>();
|
|
171
|
+
for (const paramEdge of hasParameterEdges) {
|
|
172
|
+
const paramNode = await graph.getNode(paramEdge.dst) as ParameterNode | null;
|
|
173
|
+
if (paramNode && typeof paramNode.index === 'number') {
|
|
174
|
+
paramsByIndex.set(paramNode.index, paramNode);
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
if (paramsByIndex.size === 0) {
|
|
179
|
+
noParams++;
|
|
180
|
+
continue;
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
// 4. For each PASSES_ARGUMENT edge, create RECEIVES_ARGUMENT edge
|
|
184
|
+
for (const passesEdge of passesArgumentEdges as PassesArgumentEdge[]) {
|
|
185
|
+
// Get argIndex from edge (can be top-level or in metadata)
|
|
186
|
+
const argIndex = passesEdge.argIndex ?? (passesEdge.metadata?.argIndex as number | undefined);
|
|
187
|
+
if (argIndex === undefined) {
|
|
188
|
+
continue; // No argIndex, skip
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
// Find matching parameter
|
|
192
|
+
const paramNode = paramsByIndex.get(argIndex);
|
|
193
|
+
if (!paramNode) {
|
|
194
|
+
continue; // No parameter for this argument index (extra arg)
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
// Check for duplicate
|
|
198
|
+
const edgeKey = `${paramNode.id}:${passesEdge.dst}:${callNode.id}`;
|
|
199
|
+
if (existingEdges.has(edgeKey)) {
|
|
200
|
+
continue; // Already exists
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
// Create RECEIVES_ARGUMENT edge: PARAMETER -> argument_source
|
|
204
|
+
await graph.addEdge({
|
|
205
|
+
type: 'RECEIVES_ARGUMENT',
|
|
206
|
+
src: paramNode.id,
|
|
207
|
+
dst: passesEdge.dst,
|
|
208
|
+
metadata: {
|
|
209
|
+
argIndex,
|
|
210
|
+
callId: callNode.id
|
|
211
|
+
}
|
|
212
|
+
});
|
|
213
|
+
|
|
214
|
+
existingEdges.add(edgeKey);
|
|
215
|
+
edgesCreated++;
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
const totalTime = ((Date.now() - startTime) / 1000).toFixed(2);
|
|
220
|
+
logger.info('Complete', {
|
|
221
|
+
callsProcessed,
|
|
222
|
+
edgesCreated,
|
|
223
|
+
unresolvedCalls,
|
|
224
|
+
noParams,
|
|
225
|
+
time: `${totalTime}s`
|
|
226
|
+
});
|
|
227
|
+
|
|
228
|
+
return createSuccessResult(
|
|
229
|
+
{ nodes: 0, edges: edgesCreated },
|
|
230
|
+
{
|
|
231
|
+
callsProcessed,
|
|
232
|
+
edgesCreated,
|
|
233
|
+
unresolvedCalls,
|
|
234
|
+
noParams,
|
|
235
|
+
timeMs: Date.now() - startTime
|
|
236
|
+
},
|
|
237
|
+
errors
|
|
238
|
+
);
|
|
239
|
+
}
|
|
240
|
+
}
|
|
@@ -0,0 +1,267 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ClosureCaptureEnricher - tracks transitive closure captures
|
|
3
|
+
*
|
|
4
|
+
* Problem: CAPTURES edges only exist for immediate parent scope (depth=1).
|
|
5
|
+
* Multi-level captures (grandparent, great-grandparent) are not tracked.
|
|
6
|
+
*
|
|
7
|
+
* Solution: Walk scope chains upward to find ALL captured variables,
|
|
8
|
+
* creating CAPTURES edges with depth metadata.
|
|
9
|
+
*
|
|
10
|
+
* USES:
|
|
11
|
+
* - SCOPE nodes with scopeType='closure'
|
|
12
|
+
* - SCOPE.parentScopeId for scope chain navigation
|
|
13
|
+
* - VARIABLE nodes with parentScopeId
|
|
14
|
+
* - CONSTANT nodes with parentScopeId
|
|
15
|
+
* - PARAMETER nodes with parentFunctionId (resolved via HAS_SCOPE)
|
|
16
|
+
*
|
|
17
|
+
* CREATES:
|
|
18
|
+
* - SCOPE -> CAPTURES -> VARIABLE/CONSTANT/PARAMETER (with metadata: { depth: N })
|
|
19
|
+
*
|
|
20
|
+
* NOTE: Depth=1 edges are created by JSASTAnalyzer without depth metadata.
|
|
21
|
+
* This enricher only creates edges for depth > 1.
|
|
22
|
+
*/
|
|
23
|
+
|
|
24
|
+
import { Plugin, createSuccessResult } from '../Plugin.js';
|
|
25
|
+
import type { PluginContext, PluginResult, PluginMetadata } from '../Plugin.js';
|
|
26
|
+
import type { BaseNodeRecord } from '@grafema/types';
|
|
27
|
+
|
|
28
|
+
interface ScopeNode extends BaseNodeRecord {
|
|
29
|
+
scopeType?: string;
|
|
30
|
+
parentScopeId?: string;
|
|
31
|
+
capturesFrom?: string;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
interface VariableNode extends BaseNodeRecord {
|
|
35
|
+
parentScopeId?: string;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
interface ParameterNode extends BaseNodeRecord {
|
|
39
|
+
parentFunctionId?: string;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
interface ScopeChainEntry {
|
|
43
|
+
scopeId: string;
|
|
44
|
+
depth: number;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
export class ClosureCaptureEnricher extends Plugin {
|
|
48
|
+
static MAX_DEPTH = 10;
|
|
49
|
+
|
|
50
|
+
get metadata(): PluginMetadata {
|
|
51
|
+
return {
|
|
52
|
+
name: 'ClosureCaptureEnricher',
|
|
53
|
+
phase: 'ENRICHMENT',
|
|
54
|
+
priority: 40, // Lower number = runs later. Runs after ImportExportLinker (90)
|
|
55
|
+
creates: {
|
|
56
|
+
nodes: [],
|
|
57
|
+
edges: ['CAPTURES']
|
|
58
|
+
},
|
|
59
|
+
dependencies: ['JSASTAnalyzer'] // Requires SCOPE and VARIABLE nodes
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
async execute(context: PluginContext): Promise<PluginResult> {
|
|
64
|
+
const { graph, onProgress } = context;
|
|
65
|
+
const logger = this.log(context);
|
|
66
|
+
|
|
67
|
+
logger.info('Starting transitive capture resolution');
|
|
68
|
+
|
|
69
|
+
let closuresProcessed = 0;
|
|
70
|
+
let capturesCreated = 0;
|
|
71
|
+
let existingCapturesSkipped = 0;
|
|
72
|
+
|
|
73
|
+
// Step 1: Build scope index for fast lookup
|
|
74
|
+
const scopeIndex = await this.buildScopeIndex(graph);
|
|
75
|
+
logger.debug('Indexed scopes', { count: scopeIndex.size });
|
|
76
|
+
|
|
77
|
+
// Step 2: Build variable index (scopeId -> variables/constants/parameters)
|
|
78
|
+
const variablesByScopeIndex = await this.buildVariablesByScopeIndex(graph);
|
|
79
|
+
logger.debug('Indexed variables by scope', { scopes: variablesByScopeIndex.size });
|
|
80
|
+
|
|
81
|
+
// Step 3: Find all closure scopes
|
|
82
|
+
const closureScopes: ScopeNode[] = [];
|
|
83
|
+
for await (const node of graph.queryNodes({ type: 'SCOPE' })) {
|
|
84
|
+
const scope = node as ScopeNode;
|
|
85
|
+
if (scope.scopeType === 'closure') {
|
|
86
|
+
closureScopes.push(scope);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
logger.info('Found closure scopes', { count: closureScopes.length });
|
|
91
|
+
|
|
92
|
+
// Step 4: Build existing CAPTURES edge set to avoid duplicates
|
|
93
|
+
const existingCaptures = await this.buildExistingCapturesSet(graph);
|
|
94
|
+
logger.debug('Existing CAPTURES edges', { count: existingCaptures.size });
|
|
95
|
+
|
|
96
|
+
// Step 5: Process each closure
|
|
97
|
+
for (const closure of closureScopes) {
|
|
98
|
+
closuresProcessed++;
|
|
99
|
+
|
|
100
|
+
// Progress reporting
|
|
101
|
+
if (onProgress && closuresProcessed % 50 === 0) {
|
|
102
|
+
onProgress({
|
|
103
|
+
phase: 'enrichment',
|
|
104
|
+
currentPlugin: 'ClosureCaptureEnricher',
|
|
105
|
+
message: `Processing closures ${closuresProcessed}/${closureScopes.length}`,
|
|
106
|
+
totalFiles: closureScopes.length,
|
|
107
|
+
processedFiles: closuresProcessed
|
|
108
|
+
});
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
// Walk scope chain upward
|
|
112
|
+
const ancestors = this.walkScopeChain(closure.id, scopeIndex);
|
|
113
|
+
|
|
114
|
+
// For each ancestor scope (depth > 1), find variables and create edges
|
|
115
|
+
for (const ancestor of ancestors) {
|
|
116
|
+
if (ancestor.depth <= 1) continue; // Skip immediate parent (already handled by JSASTAnalyzer)
|
|
117
|
+
|
|
118
|
+
const variables = variablesByScopeIndex.get(ancestor.scopeId) || [];
|
|
119
|
+
|
|
120
|
+
for (const variable of variables) {
|
|
121
|
+
const edgeKey = `${closure.id}:${variable.id}`;
|
|
122
|
+
|
|
123
|
+
if (existingCaptures.has(edgeKey)) {
|
|
124
|
+
existingCapturesSkipped++;
|
|
125
|
+
continue;
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
await graph.addEdge({
|
|
129
|
+
src: closure.id,
|
|
130
|
+
dst: variable.id,
|
|
131
|
+
type: 'CAPTURES',
|
|
132
|
+
metadata: { depth: ancestor.depth }
|
|
133
|
+
});
|
|
134
|
+
|
|
135
|
+
capturesCreated++;
|
|
136
|
+
existingCaptures.add(edgeKey); // Track to avoid duplicates
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
const summary = {
|
|
142
|
+
closuresProcessed,
|
|
143
|
+
capturesCreated,
|
|
144
|
+
existingCapturesSkipped
|
|
145
|
+
};
|
|
146
|
+
|
|
147
|
+
logger.info('Summary', summary);
|
|
148
|
+
|
|
149
|
+
return createSuccessResult({ nodes: 0, edges: capturesCreated }, summary);
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
/**
|
|
153
|
+
* Build index: scopeId -> ScopeNode
|
|
154
|
+
*/
|
|
155
|
+
private async buildScopeIndex(graph: PluginContext['graph']): Promise<Map<string, ScopeNode>> {
|
|
156
|
+
const index = new Map<string, ScopeNode>();
|
|
157
|
+
|
|
158
|
+
for await (const node of graph.queryNodes({ type: 'SCOPE' })) {
|
|
159
|
+
index.set(node.id, node as ScopeNode);
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
return index;
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
/**
|
|
166
|
+
* Build index: scopeId -> VariableNode[]
|
|
167
|
+
* Includes VARIABLE, CONSTANT, and PARAMETER nodes
|
|
168
|
+
*/
|
|
169
|
+
private async buildVariablesByScopeIndex(graph: PluginContext['graph']): Promise<Map<string, VariableNode[]>> {
|
|
170
|
+
const index = new Map<string, VariableNode[]>();
|
|
171
|
+
|
|
172
|
+
// Index VARIABLE nodes via parentScopeId
|
|
173
|
+
for await (const node of graph.queryNodes({ type: 'VARIABLE' })) {
|
|
174
|
+
const variable = node as VariableNode;
|
|
175
|
+
if (!variable.parentScopeId) continue;
|
|
176
|
+
|
|
177
|
+
const vars = index.get(variable.parentScopeId) || [];
|
|
178
|
+
vars.push(variable);
|
|
179
|
+
index.set(variable.parentScopeId, vars);
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
// Index CONSTANT nodes via parentScopeId
|
|
183
|
+
for await (const node of graph.queryNodes({ type: 'CONSTANT' })) {
|
|
184
|
+
const constant = node as VariableNode;
|
|
185
|
+
if (!constant.parentScopeId) continue;
|
|
186
|
+
|
|
187
|
+
const vars = index.get(constant.parentScopeId) || [];
|
|
188
|
+
vars.push(constant);
|
|
189
|
+
index.set(constant.parentScopeId, vars);
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
// Index PARAMETER nodes via parentFunctionId -> HAS_SCOPE lookup
|
|
193
|
+
for await (const node of graph.queryNodes({ type: 'PARAMETER' })) {
|
|
194
|
+
const param = node as ParameterNode;
|
|
195
|
+
if (!param.parentFunctionId) continue;
|
|
196
|
+
|
|
197
|
+
// Find the function's scope via HAS_SCOPE edge
|
|
198
|
+
// FUNCTION -[HAS_SCOPE]-> SCOPE
|
|
199
|
+
const scopeEdges = await graph.getOutgoingEdges(param.parentFunctionId, ['HAS_SCOPE']);
|
|
200
|
+
if (scopeEdges.length === 0) continue;
|
|
201
|
+
|
|
202
|
+
const scopeId = scopeEdges[0].dst;
|
|
203
|
+
const params = index.get(scopeId) || [];
|
|
204
|
+
params.push(param as unknown as VariableNode);
|
|
205
|
+
index.set(scopeId, params);
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
return index;
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
/**
|
|
212
|
+
* Build set of existing CAPTURES edges: "srcId:dstId"
|
|
213
|
+
*/
|
|
214
|
+
private async buildExistingCapturesSet(graph: PluginContext['graph']): Promise<Set<string>> {
|
|
215
|
+
const set = new Set<string>();
|
|
216
|
+
|
|
217
|
+
// Query all SCOPE nodes and get their CAPTURES edges
|
|
218
|
+
for await (const node of graph.queryNodes({ type: 'SCOPE' })) {
|
|
219
|
+
const edges = await graph.getOutgoingEdges(node.id, ['CAPTURES']);
|
|
220
|
+
for (const edge of edges) {
|
|
221
|
+
set.add(`${edge.src}:${edge.dst}`);
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
return set;
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
/**
|
|
229
|
+
* Walk scope chain upward from startScopeId
|
|
230
|
+
* Returns ancestor scopes with depth (1 = immediate parent, 2 = grandparent, etc.)
|
|
231
|
+
*
|
|
232
|
+
* Walks ALL scopes in the chain (including if/for/while blocks),
|
|
233
|
+
* not just closures.
|
|
234
|
+
*/
|
|
235
|
+
private walkScopeChain(
|
|
236
|
+
startScopeId: string,
|
|
237
|
+
scopeIndex: Map<string, ScopeNode>
|
|
238
|
+
): ScopeChainEntry[] {
|
|
239
|
+
const result: ScopeChainEntry[] = [];
|
|
240
|
+
const visited = new Set<string>();
|
|
241
|
+
|
|
242
|
+
const currentScope = scopeIndex.get(startScopeId);
|
|
243
|
+
if (!currentScope) return result;
|
|
244
|
+
|
|
245
|
+
// Start walking from the closure's capturesFrom (immediate parent) or parentScopeId
|
|
246
|
+
let parentId = currentScope.capturesFrom || currentScope.parentScopeId;
|
|
247
|
+
let depth = 1;
|
|
248
|
+
|
|
249
|
+
while (parentId && depth <= ClosureCaptureEnricher.MAX_DEPTH) {
|
|
250
|
+
// Cycle protection
|
|
251
|
+
if (visited.has(parentId)) break;
|
|
252
|
+
visited.add(parentId);
|
|
253
|
+
|
|
254
|
+
result.push({ scopeId: parentId, depth });
|
|
255
|
+
|
|
256
|
+
// Get parent scope
|
|
257
|
+
const parentScope = scopeIndex.get(parentId);
|
|
258
|
+
if (!parentScope) break;
|
|
259
|
+
|
|
260
|
+
// Move up the chain via parentScopeId
|
|
261
|
+
parentId = parentScope.parentScopeId;
|
|
262
|
+
depth++;
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
return result;
|
|
266
|
+
}
|
|
267
|
+
}
|