@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
|
@@ -17,6 +17,15 @@ import { Plugin, createSuccessResult } from '../Plugin.js';
|
|
|
17
17
|
import type { PluginMetadata, PluginContext, PluginResult } from '../Plugin.js';
|
|
18
18
|
import type { NodeRecord } from '@grafema/types';
|
|
19
19
|
import type { EdgeRecord } from '@grafema/types';
|
|
20
|
+
import {
|
|
21
|
+
traceValues,
|
|
22
|
+
aggregateValues,
|
|
23
|
+
NONDETERMINISTIC_PATTERNS,
|
|
24
|
+
NONDETERMINISTIC_OBJECTS,
|
|
25
|
+
} from '../../queries/traceValues.js';
|
|
26
|
+
|
|
27
|
+
// Re-export for backward compatibility
|
|
28
|
+
export { NONDETERMINISTIC_PATTERNS, NONDETERMINISTIC_OBJECTS };
|
|
20
29
|
|
|
21
30
|
interface ComputedCallNode {
|
|
22
31
|
id: string;
|
|
@@ -42,22 +51,6 @@ interface VariableNode {
|
|
|
42
51
|
[key: string]: unknown;
|
|
43
52
|
}
|
|
44
53
|
|
|
45
|
-
interface ExpressionNode {
|
|
46
|
-
id: string;
|
|
47
|
-
type: string;
|
|
48
|
-
name?: string;
|
|
49
|
-
file?: string;
|
|
50
|
-
line?: number;
|
|
51
|
-
expressionType?: string;
|
|
52
|
-
object?: string;
|
|
53
|
-
property?: string;
|
|
54
|
-
attrs?: {
|
|
55
|
-
expressionType?: string;
|
|
56
|
-
object?: string;
|
|
57
|
-
property?: string;
|
|
58
|
-
};
|
|
59
|
-
}
|
|
60
|
-
|
|
61
54
|
interface ScopeNode {
|
|
62
55
|
id: string;
|
|
63
56
|
type: string;
|
|
@@ -65,7 +58,6 @@ interface ScopeNode {
|
|
|
65
58
|
file?: string;
|
|
66
59
|
line?: number;
|
|
67
60
|
originalId?: string;
|
|
68
|
-
stableId?: string;
|
|
69
61
|
parentScopeId?: string;
|
|
70
62
|
constraints?: Constraint[];
|
|
71
63
|
}
|
|
@@ -90,17 +82,13 @@ interface ValueSetAtNodeResult extends ValueSetResult {
|
|
|
90
82
|
globalHasUnknown: boolean;
|
|
91
83
|
}
|
|
92
84
|
|
|
93
|
-
interface NondeterministicPattern {
|
|
94
|
-
object: string;
|
|
95
|
-
property: string;
|
|
96
|
-
}
|
|
97
|
-
|
|
98
85
|
interface Graph {
|
|
99
86
|
queryNodes(filter: { nodeType: string }): AsyncIterable<NodeRecord>;
|
|
100
87
|
getNode(id: string): Promise<NodeRecord | null>;
|
|
101
88
|
getOutgoingEdges(nodeId: string): Promise<EdgeRecord[]>;
|
|
102
89
|
getIncomingEdges(nodeId: string): Promise<EdgeRecord[]>;
|
|
103
90
|
addEdge(edge: { src: string; dst: string; type: string; metadata?: Record<string, unknown> }): Promise<void> | void;
|
|
91
|
+
deleteEdge?(src: string, dst: string, type: string): Promise<void>; // Optional for edge updates
|
|
104
92
|
}
|
|
105
93
|
|
|
106
94
|
interface ProgressCallback {
|
|
@@ -116,37 +104,6 @@ interface ProgressCallback {
|
|
|
116
104
|
export class ValueDomainAnalyzer extends Plugin {
|
|
117
105
|
static MAX_DEPTH = 10; // Maximum depth for tracing
|
|
118
106
|
|
|
119
|
-
// Nondeterministic MemberExpression patterns
|
|
120
|
-
// object.property patterns that are external/user input
|
|
121
|
-
static NONDETERMINISTIC_PATTERNS: NondeterministicPattern[] = [
|
|
122
|
-
// Environment variables
|
|
123
|
-
{ object: 'process', property: 'env' },
|
|
124
|
-
// HTTP request data (Express.js patterns)
|
|
125
|
-
{ object: 'req', property: 'body' },
|
|
126
|
-
{ object: 'req', property: 'query' },
|
|
127
|
-
{ object: 'req', property: 'params' },
|
|
128
|
-
{ object: 'req', property: 'headers' },
|
|
129
|
-
{ object: 'req', property: 'cookies' },
|
|
130
|
-
{ object: 'request', property: 'body' },
|
|
131
|
-
{ object: 'request', property: 'query' },
|
|
132
|
-
{ object: 'request', property: 'params' },
|
|
133
|
-
// Context patterns (Koa, etc.)
|
|
134
|
-
{ object: 'ctx', property: 'request' },
|
|
135
|
-
{ object: 'ctx', property: 'body' },
|
|
136
|
-
{ object: 'ctx', property: 'query' },
|
|
137
|
-
{ object: 'ctx', property: 'params' },
|
|
138
|
-
];
|
|
139
|
-
|
|
140
|
-
// Nondeterministic object prefixes (any property access is nondeterministic)
|
|
141
|
-
static NONDETERMINISTIC_OBJECTS: string[] = [
|
|
142
|
-
'process.env', // process.env.ANY_VAR
|
|
143
|
-
'req.body', // req.body.userId
|
|
144
|
-
'req.query', // req.query.filter
|
|
145
|
-
'req.params', // req.params.id
|
|
146
|
-
'request.body',
|
|
147
|
-
'ctx.request',
|
|
148
|
-
];
|
|
149
|
-
|
|
150
107
|
get metadata(): PluginMetadata {
|
|
151
108
|
return {
|
|
152
109
|
name: 'ValueDomainAnalyzer',
|
|
@@ -154,17 +111,18 @@ export class ValueDomainAnalyzer extends Plugin {
|
|
|
154
111
|
priority: 65, // After AliasTracker (60)
|
|
155
112
|
creates: {
|
|
156
113
|
nodes: [],
|
|
157
|
-
edges: ['CALLS']
|
|
114
|
+
edges: ['CALLS', 'FLOWS_INTO'] // Added FLOWS_INTO (modifies existing)
|
|
158
115
|
}
|
|
159
116
|
};
|
|
160
117
|
}
|
|
161
118
|
|
|
162
119
|
async execute(context: PluginContext): Promise<PluginResult> {
|
|
163
120
|
const { graph } = context;
|
|
121
|
+
const logger = this.log(context);
|
|
164
122
|
const onProgress = (context as unknown as { onProgress?: ProgressCallback }).onProgress;
|
|
165
123
|
const graphTyped = graph as unknown as Graph;
|
|
166
124
|
|
|
167
|
-
|
|
125
|
+
logger.info('Starting value domain analysis');
|
|
168
126
|
|
|
169
127
|
let callsProcessed = 0;
|
|
170
128
|
let callsResolved = 0;
|
|
@@ -182,7 +140,7 @@ export class ValueDomainAnalyzer extends Plugin {
|
|
|
182
140
|
}
|
|
183
141
|
}
|
|
184
142
|
|
|
185
|
-
|
|
143
|
+
logger.info('Found computed member calls', { count: computedCalls.length });
|
|
186
144
|
|
|
187
145
|
// 2. For each computed call get value set
|
|
188
146
|
for (const call of computedCalls) {
|
|
@@ -249,18 +207,24 @@ export class ValueDomainAnalyzer extends Plugin {
|
|
|
249
207
|
}
|
|
250
208
|
}
|
|
251
209
|
|
|
210
|
+
// 5. Resolve computed property mutations in FLOWS_INTO edges
|
|
211
|
+
logger.debug('Resolving computed property mutations');
|
|
212
|
+
const mutationStats = await this.resolveComputedMutations(graphTyped, logger);
|
|
213
|
+
logger.debug('Mutation resolution stats', mutationStats);
|
|
214
|
+
|
|
252
215
|
const summary = {
|
|
253
216
|
callsProcessed,
|
|
254
217
|
callsResolved,
|
|
255
218
|
edgesCreated,
|
|
256
219
|
conditionalCalls,
|
|
257
|
-
partialCalls
|
|
220
|
+
partialCalls,
|
|
221
|
+
computedMutations: mutationStats
|
|
258
222
|
};
|
|
259
223
|
|
|
260
|
-
|
|
224
|
+
logger.info('Summary', summary);
|
|
261
225
|
|
|
262
226
|
return createSuccessResult(
|
|
263
|
-
{ nodes: 0, edges: edgesCreated },
|
|
227
|
+
{ nodes: 0, edges: edgesCreated + mutationStats.resolved + mutationStats.conditional },
|
|
264
228
|
summary
|
|
265
229
|
);
|
|
266
230
|
}
|
|
@@ -294,13 +258,10 @@ export class ValueDomainAnalyzer extends Plugin {
|
|
|
294
258
|
}
|
|
295
259
|
|
|
296
260
|
if (variables.length === 0) {
|
|
297
|
-
console.log(`[ValueDomainAnalyzer] No variable found for ${variableName} in ${file}`);
|
|
298
261
|
result.hasUnknown = true;
|
|
299
262
|
return result;
|
|
300
263
|
}
|
|
301
264
|
|
|
302
|
-
console.log(`[ValueDomainAnalyzer] Found ${variables.length} variable(s) for ${variableName}`);
|
|
303
|
-
|
|
304
265
|
// Trace ASSIGNED_FROM to LITERAL or nondeterministic sources
|
|
305
266
|
const visited = new Set<string>();
|
|
306
267
|
const valueSet = new Set<unknown>();
|
|
@@ -377,8 +338,7 @@ export class ValueDomainAnalyzer extends Plugin {
|
|
|
377
338
|
for await (const s of graph.queryNodes({ nodeType: 'SCOPE' })) {
|
|
378
339
|
const scopeNode = s as ScopeNode;
|
|
379
340
|
if (scopeNode.id === currentScopeId ||
|
|
380
|
-
scopeNode.originalId === currentScopeId
|
|
381
|
-
scopeNode.stableId === currentScopeId) {
|
|
341
|
+
scopeNode.originalId === currentScopeId) {
|
|
382
342
|
scope = scopeNode;
|
|
383
343
|
break;
|
|
384
344
|
}
|
|
@@ -505,135 +465,69 @@ export class ValueDomainAnalyzer extends Plugin {
|
|
|
505
465
|
}
|
|
506
466
|
|
|
507
467
|
/**
|
|
508
|
-
*
|
|
509
|
-
|
|
510
|
-
isNondeterministicExpression(node: ExpressionNode): boolean {
|
|
511
|
-
const expressionType = node.expressionType || node.attrs?.expressionType;
|
|
512
|
-
if (expressionType !== 'MemberExpression') {
|
|
513
|
-
return false;
|
|
514
|
-
}
|
|
515
|
-
|
|
516
|
-
const object = node.object || node.attrs?.object;
|
|
517
|
-
const property = node.property || node.attrs?.property;
|
|
518
|
-
|
|
519
|
-
if (!object || !property) {
|
|
520
|
-
return false;
|
|
521
|
-
}
|
|
522
|
-
|
|
523
|
-
// Check exact patterns (object.property)
|
|
524
|
-
for (const pattern of ValueDomainAnalyzer.NONDETERMINISTIC_PATTERNS) {
|
|
525
|
-
if (object === pattern.object && property === pattern.property) {
|
|
526
|
-
return true;
|
|
527
|
-
}
|
|
528
|
-
}
|
|
529
|
-
|
|
530
|
-
// Check if object is a known nondeterministic prefix
|
|
531
|
-
// e.g., process.env.VAR where object is 'process.env'
|
|
532
|
-
for (const prefix of ValueDomainAnalyzer.NONDETERMINISTIC_OBJECTS) {
|
|
533
|
-
if (object === prefix || object.startsWith(prefix + '.')) {
|
|
534
|
-
return true;
|
|
535
|
-
}
|
|
536
|
-
}
|
|
537
|
-
|
|
538
|
-
return false;
|
|
539
|
-
}
|
|
540
|
-
|
|
541
|
-
/**
|
|
542
|
-
* Recursive value set tracing through ASSIGNED_FROM edges
|
|
468
|
+
* Recursive value set tracing through ASSIGNED_FROM edges.
|
|
469
|
+
* Delegates to shared traceValues utility (REG-244).
|
|
543
470
|
*/
|
|
544
471
|
async traceValueSet(
|
|
545
472
|
node: NodeRecord,
|
|
546
473
|
graph: Graph,
|
|
547
|
-
|
|
474
|
+
_visited: Set<string>,
|
|
548
475
|
depth: number
|
|
549
476
|
): Promise<ValueSetResult> {
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
|
|
556
|
-
|
|
557
|
-
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
|
|
565
|
-
|
|
566
|
-
|
|
567
|
-
|
|
568
|
-
|
|
569
|
-
|
|
570
|
-
|
|
571
|
-
|
|
572
|
-
|
|
573
|
-
|
|
574
|
-
|
|
575
|
-
|
|
576
|
-
|
|
577
|
-
|
|
578
|
-
|
|
579
|
-
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
|
|
589
|
-
|
|
590
|
-
|
|
591
|
-
|
|
592
|
-
|
|
593
|
-
|
|
594
|
-
|
|
595
|
-
}
|
|
477
|
+
// Create adapter from Graph interface to TraceValuesGraphBackend
|
|
478
|
+
const backend = {
|
|
479
|
+
getNode: async (id: string) => {
|
|
480
|
+
const n = await graph.getNode(id);
|
|
481
|
+
if (!n) return null;
|
|
482
|
+
return {
|
|
483
|
+
id: n.id,
|
|
484
|
+
type: (n as { type?: string }).type,
|
|
485
|
+
nodeType: (n as { nodeType?: string }).nodeType,
|
|
486
|
+
value: (n as { value?: unknown }).value,
|
|
487
|
+
file: (n as { file?: string }).file,
|
|
488
|
+
line: (n as { line?: number }).line,
|
|
489
|
+
expressionType: (n as { expressionType?: string }).expressionType,
|
|
490
|
+
object: (n as { object?: string }).object,
|
|
491
|
+
property: (n as { property?: string }).property,
|
|
492
|
+
};
|
|
493
|
+
},
|
|
494
|
+
getOutgoingEdges: async (nodeId: string, edgeTypes: string[] | null) => {
|
|
495
|
+
const edges = await graph.getOutgoingEdges(nodeId);
|
|
496
|
+
const filtered = edgeTypes === null
|
|
497
|
+
? edges
|
|
498
|
+
: edges.filter(e => edgeTypes.includes(e.type));
|
|
499
|
+
return filtered.map(e => ({
|
|
500
|
+
src: (e as { src?: string; source_id?: string }).src ||
|
|
501
|
+
(e as { source_id?: string }).source_id || '',
|
|
502
|
+
dst: (e as { dst?: string; target_id?: string }).dst ||
|
|
503
|
+
(e as { target_id?: string }).target_id || '',
|
|
504
|
+
type: e.type,
|
|
505
|
+
}));
|
|
506
|
+
},
|
|
507
|
+
// REG-334: getIncomingEdges required for Promise tracing
|
|
508
|
+
getIncomingEdges: async (nodeId: string, edgeTypes: string[] | null) => {
|
|
509
|
+
const edges = await graph.getIncomingEdges(nodeId);
|
|
510
|
+
const filtered = edgeTypes === null
|
|
511
|
+
? edges
|
|
512
|
+
: edges.filter(e => edgeTypes.includes(e.type));
|
|
513
|
+
return filtered.map(e => ({
|
|
514
|
+
src: (e as { src?: string; source_id?: string }).src ||
|
|
515
|
+
(e as { source_id?: string }).source_id || '',
|
|
516
|
+
dst: (e as { dst?: string; target_id?: string }).dst ||
|
|
517
|
+
(e as { target_id?: string }).target_id || '',
|
|
518
|
+
type: e.type,
|
|
519
|
+
}));
|
|
520
|
+
},
|
|
521
|
+
};
|
|
596
522
|
|
|
597
|
-
//
|
|
598
|
-
|
|
599
|
-
|
|
600
|
-
|
|
601
|
-
|
|
602
|
-
const edgeType = (e as { edgeType?: string; edge_type?: string }).edgeType ||
|
|
603
|
-
(e as { edge_type?: string }).edge_type;
|
|
604
|
-
return edgeType === 'ASSIGNED_FROM' || edgeType === 'DERIVES_FROM';
|
|
523
|
+
// Use shared utility
|
|
524
|
+
const traced = await traceValues(backend, node.id, {
|
|
525
|
+
maxDepth: ValueDomainAnalyzer.MAX_DEPTH - depth,
|
|
526
|
+
followDerivesFrom: true,
|
|
527
|
+
detectNondeterministic: true,
|
|
605
528
|
});
|
|
606
529
|
|
|
607
|
-
|
|
608
|
-
// No sources - unknown
|
|
609
|
-
result.hasUnknown = true;
|
|
610
|
-
return result;
|
|
611
|
-
}
|
|
612
|
-
|
|
613
|
-
// Recursively trace each source
|
|
614
|
-
for (const edge of dataFlowEdges) {
|
|
615
|
-
// dst (from getOutgoingEdges) or target_id (from other APIs)
|
|
616
|
-
const targetId = (edge as { dst?: string; target_id?: string }).dst ||
|
|
617
|
-
(edge as { target_id?: string }).target_id;
|
|
618
|
-
if (!targetId) continue;
|
|
619
|
-
|
|
620
|
-
const sourceNode = await graph.getNode(targetId);
|
|
621
|
-
if (!sourceNode) continue;
|
|
622
|
-
|
|
623
|
-
const sourceResult = await this.traceValueSet(
|
|
624
|
-
sourceNode,
|
|
625
|
-
graph,
|
|
626
|
-
visited,
|
|
627
|
-
depth + 1
|
|
628
|
-
);
|
|
629
|
-
|
|
630
|
-
sourceResult.values.forEach(v => result.values.push(v));
|
|
631
|
-
if (sourceResult.hasUnknown) {
|
|
632
|
-
result.hasUnknown = true;
|
|
633
|
-
}
|
|
634
|
-
}
|
|
635
|
-
|
|
636
|
-
return result;
|
|
530
|
+
return aggregateValues(traced);
|
|
637
531
|
}
|
|
638
532
|
|
|
639
533
|
/**
|
|
@@ -652,11 +546,7 @@ export class ValueDomainAnalyzer extends Plugin {
|
|
|
652
546
|
// Check if this is a method of the right object
|
|
653
547
|
// Simplified: check via incoming CONTAINS edges from CLASS
|
|
654
548
|
const incoming = await graph.getIncomingEdges(node.id);
|
|
655
|
-
const containsEdges = incoming.filter(e =>
|
|
656
|
-
const edgeType = (e as { edgeType?: string; edge_type?: string }).edgeType ||
|
|
657
|
-
(e as { edge_type?: string }).edge_type;
|
|
658
|
-
return edgeType === 'CONTAINS';
|
|
659
|
-
});
|
|
549
|
+
const containsEdges = incoming.filter(e => e.type === 'CONTAINS');
|
|
660
550
|
|
|
661
551
|
for (const edge of containsEdges) {
|
|
662
552
|
const sourceId = (edge as { src?: string; source_id?: string }).src ||
|
|
@@ -677,6 +567,136 @@ export class ValueDomainAnalyzer extends Plugin {
|
|
|
677
567
|
|
|
678
568
|
return null;
|
|
679
569
|
}
|
|
570
|
+
|
|
571
|
+
/**
|
|
572
|
+
* Resolve computed property names for object mutations.
|
|
573
|
+
* Finds FLOWS_INTO edges with mutationType: 'computed' and resolves
|
|
574
|
+
* the property name using value set tracing.
|
|
575
|
+
*
|
|
576
|
+
* @param graph - Graph backend with edge operations
|
|
577
|
+
* @returns Statistics about resolution
|
|
578
|
+
*/
|
|
579
|
+
async resolveComputedMutations(graph: Graph, logger: ReturnType<typeof this.log>): Promise<{
|
|
580
|
+
resolved: number;
|
|
581
|
+
conditional: number;
|
|
582
|
+
unknownParameter: number;
|
|
583
|
+
unknownRuntime: number;
|
|
584
|
+
deferredCrossFile: number;
|
|
585
|
+
total: number;
|
|
586
|
+
}> {
|
|
587
|
+
const stats = {
|
|
588
|
+
resolved: 0,
|
|
589
|
+
conditional: 0,
|
|
590
|
+
unknownParameter: 0,
|
|
591
|
+
unknownRuntime: 0,
|
|
592
|
+
deferredCrossFile: 0,
|
|
593
|
+
total: 0
|
|
594
|
+
};
|
|
595
|
+
|
|
596
|
+
// Process edges by finding all VARIABLE and CONSTANT nodes and checking their outgoing edges
|
|
597
|
+
const processedEdges = new Set<string>();
|
|
598
|
+
|
|
599
|
+
// Helper to process a node's outgoing edges
|
|
600
|
+
const processNodeEdges = async (node: NodeRecord): Promise<void> => {
|
|
601
|
+
const outgoing = await graph.getOutgoingEdges(node.id);
|
|
602
|
+
|
|
603
|
+
for (const edge of outgoing) {
|
|
604
|
+
if (edge.type !== 'FLOWS_INTO') continue;
|
|
605
|
+
|
|
606
|
+
const edgeKey = `${edge.src}->${edge.dst}:FLOWS_INTO`;
|
|
607
|
+
if (processedEdges.has(edgeKey)) continue;
|
|
608
|
+
processedEdges.add(edgeKey);
|
|
609
|
+
|
|
610
|
+
const mutationType = edge.metadata?.mutationType as string | undefined;
|
|
611
|
+
const computedPropertyVar = edge.metadata?.computedPropertyVar as string | undefined;
|
|
612
|
+
|
|
613
|
+
if (mutationType !== 'computed' || !computedPropertyVar) continue;
|
|
614
|
+
|
|
615
|
+
stats.total++;
|
|
616
|
+
|
|
617
|
+
// Get file from source node
|
|
618
|
+
const sourceNode = await graph.getNode(edge.src);
|
|
619
|
+
const file = (sourceNode as { file?: string })?.file;
|
|
620
|
+
if (!file) continue;
|
|
621
|
+
|
|
622
|
+
// Resolve the computed property variable using existing getValueSet
|
|
623
|
+
const valueSet = await this.getValueSet(computedPropertyVar, file, graph);
|
|
624
|
+
|
|
625
|
+
// Check if the variable is a PARAMETER node
|
|
626
|
+
let isParameter = false;
|
|
627
|
+
for await (const node of graph.queryNodes({ nodeType: 'PARAMETER' })) {
|
|
628
|
+
const paramNode = node as { name?: string; file?: string; attrs?: { name?: string; file?: string } };
|
|
629
|
+
const nodeName = paramNode.name || paramNode.attrs?.name;
|
|
630
|
+
const nodeFile = paramNode.file || paramNode.attrs?.file;
|
|
631
|
+
if (nodeName === computedPropertyVar && nodeFile === file) {
|
|
632
|
+
isParameter = true;
|
|
633
|
+
break;
|
|
634
|
+
}
|
|
635
|
+
}
|
|
636
|
+
|
|
637
|
+
// Determine resolution status based on value set
|
|
638
|
+
let resolutionStatus: string;
|
|
639
|
+
let resolvedPropertyNames: string[] = [];
|
|
640
|
+
|
|
641
|
+
if (valueSet.values.length === 0 && isParameter) {
|
|
642
|
+
// Variable is a function parameter - cannot be statically resolved
|
|
643
|
+
resolutionStatus = 'UNKNOWN_PARAMETER';
|
|
644
|
+
stats.unknownParameter++;
|
|
645
|
+
} else if (valueSet.values.length === 0 && valueSet.hasUnknown) {
|
|
646
|
+
// Completely nondeterministic - runtime value (function call result, etc.)
|
|
647
|
+
resolutionStatus = 'UNKNOWN_RUNTIME';
|
|
648
|
+
stats.unknownRuntime++;
|
|
649
|
+
} else if (valueSet.values.length === 0) {
|
|
650
|
+
// No values found at all - treat as unknown
|
|
651
|
+
resolutionStatus = 'UNKNOWN_RUNTIME';
|
|
652
|
+
stats.unknownRuntime++;
|
|
653
|
+
} else if (valueSet.values.length === 1 && !valueSet.hasUnknown) {
|
|
654
|
+
// Single deterministic value
|
|
655
|
+
resolutionStatus = 'RESOLVED';
|
|
656
|
+
resolvedPropertyNames = valueSet.values.map(v => String(v));
|
|
657
|
+
stats.resolved++;
|
|
658
|
+
} else {
|
|
659
|
+
// Multiple values (conditional) or partial resolution
|
|
660
|
+
resolutionStatus = 'RESOLVED_CONDITIONAL';
|
|
661
|
+
resolvedPropertyNames = valueSet.values.map(v => String(v));
|
|
662
|
+
stats.conditional++;
|
|
663
|
+
}
|
|
664
|
+
|
|
665
|
+
// Update edge: delete old, create new with resolved data
|
|
666
|
+
// Following the same pattern as InstanceOfResolver
|
|
667
|
+
if (graph.deleteEdge) {
|
|
668
|
+
await graph.deleteEdge(edge.src, edge.dst, 'FLOWS_INTO');
|
|
669
|
+
}
|
|
670
|
+
|
|
671
|
+
// Preserve original edge data and add resolution info
|
|
672
|
+
// For UNKNOWN cases, keep propertyName as '<computed>' and resolvedPropertyNames empty
|
|
673
|
+
await graph.addEdge({
|
|
674
|
+
src: edge.src,
|
|
675
|
+
dst: edge.dst,
|
|
676
|
+
type: 'FLOWS_INTO',
|
|
677
|
+
metadata: {
|
|
678
|
+
mutationType,
|
|
679
|
+
propertyName: resolvedPropertyNames[0] || '<computed>',
|
|
680
|
+
computedPropertyVar,
|
|
681
|
+
resolvedPropertyNames,
|
|
682
|
+
resolutionStatus
|
|
683
|
+
}
|
|
684
|
+
});
|
|
685
|
+
}
|
|
686
|
+
};
|
|
687
|
+
|
|
688
|
+
// Process VARIABLE nodes
|
|
689
|
+
for await (const node of graph.queryNodes({ nodeType: 'VARIABLE' })) {
|
|
690
|
+
await processNodeEdges(node);
|
|
691
|
+
}
|
|
692
|
+
|
|
693
|
+
// Process CONSTANT nodes
|
|
694
|
+
for await (const node of graph.queryNodes({ nodeType: 'CONSTANT' })) {
|
|
695
|
+
await processNodeEdges(node);
|
|
696
|
+
}
|
|
697
|
+
|
|
698
|
+
return stats;
|
|
699
|
+
}
|
|
680
700
|
}
|
|
681
701
|
|
|
682
702
|
export default ValueDomainAnalyzer;
|
|
@@ -151,12 +151,13 @@ export class IncrementalModuleIndexer extends Plugin {
|
|
|
151
151
|
|
|
152
152
|
return imports;
|
|
153
153
|
} catch (err) {
|
|
154
|
-
|
|
154
|
+
// Parse error will be logged by execute() when it needs logger context
|
|
155
155
|
return [];
|
|
156
156
|
}
|
|
157
157
|
}
|
|
158
158
|
|
|
159
159
|
async execute(context: PluginContext): Promise<PluginResult> {
|
|
160
|
+
const logger = this.log(context);
|
|
160
161
|
try {
|
|
161
162
|
const { manifest, graph } = context;
|
|
162
163
|
// Cast manifest to expected shape
|
|
@@ -175,7 +176,7 @@ export class IncrementalModuleIndexer extends Plugin {
|
|
|
175
176
|
let totalImportsParsed = 0;
|
|
176
177
|
let unresolvedImports = 0;
|
|
177
178
|
|
|
178
|
-
|
|
179
|
+
logger.info('Starting incremental indexing', { entryFile: relative(projectPath, entryFile) });
|
|
179
180
|
|
|
180
181
|
while (queue.length > 0) {
|
|
181
182
|
const file = queue.shift()!;
|
|
@@ -183,12 +184,13 @@ export class IncrementalModuleIndexer extends Plugin {
|
|
|
183
184
|
if (processed.has(file)) continue;
|
|
184
185
|
processed.add(file);
|
|
185
186
|
|
|
186
|
-
// Create MODULE node
|
|
187
|
+
// Create MODULE node with semantic ID
|
|
187
188
|
const fileHash = this.calculateFileHash(file);
|
|
188
189
|
const relativePath = relative(projectPath, file);
|
|
190
|
+
const semanticId = `${relativePath}->global->MODULE->module`;
|
|
189
191
|
|
|
190
192
|
const moduleNode: NodeRecord = {
|
|
191
|
-
id:
|
|
193
|
+
id: semanticId,
|
|
192
194
|
type: 'MODULE',
|
|
193
195
|
name: relativePath,
|
|
194
196
|
file: file,
|
|
@@ -211,10 +213,12 @@ export class IncrementalModuleIndexer extends Plugin {
|
|
|
211
213
|
const imports = this.parseImports(file, projectPath);
|
|
212
214
|
totalImportsParsed += imports.length;
|
|
213
215
|
for (const importFile of imports) {
|
|
214
|
-
// Store for later edge creation
|
|
216
|
+
// Store for later edge creation with semantic ID format
|
|
217
|
+
const importRelativePath = relative(projectPath, importFile);
|
|
218
|
+
const importSemanticId = `${importRelativePath}->global->MODULE->module`;
|
|
215
219
|
pendingImports.push({
|
|
216
220
|
src: moduleNode.id,
|
|
217
|
-
dst:
|
|
221
|
+
dst: importSemanticId
|
|
218
222
|
});
|
|
219
223
|
|
|
220
224
|
if (!processed.has(importFile)) {
|
|
@@ -251,14 +255,16 @@ export class IncrementalModuleIndexer extends Plugin {
|
|
|
251
255
|
}
|
|
252
256
|
|
|
253
257
|
if (processed.size % 10 === 0) {
|
|
254
|
-
|
|
258
|
+
logger.debug('Indexing progress', { indexed: processed.size, queueLength: queue.length });
|
|
255
259
|
}
|
|
256
260
|
}
|
|
257
261
|
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
+
logger.info('Modules indexed', { count: processed.size });
|
|
263
|
+
logger.debug('Import statistics', {
|
|
264
|
+
totalImportsParsed,
|
|
265
|
+
unresolvedImports,
|
|
266
|
+
pendingEdges: pendingImports.length
|
|
267
|
+
});
|
|
262
268
|
|
|
263
269
|
// Now create all IMPORTS edges after all MODULE nodes exist
|
|
264
270
|
for (const { src, dst } of pendingImports) {
|
|
@@ -271,8 +277,11 @@ export class IncrementalModuleIndexer extends Plugin {
|
|
|
271
277
|
edgesCreated++;
|
|
272
278
|
}
|
|
273
279
|
|
|
274
|
-
|
|
275
|
-
|
|
280
|
+
logger.info('Indexing complete', {
|
|
281
|
+
nodesCreated,
|
|
282
|
+
edgesCreated,
|
|
283
|
+
importsEdgesCreated: pendingImports.length
|
|
284
|
+
});
|
|
276
285
|
|
|
277
286
|
return createSuccessResult(
|
|
278
287
|
{ nodes: nodesCreated, edges: edgesCreated },
|
|
@@ -280,7 +289,7 @@ export class IncrementalModuleIndexer extends Plugin {
|
|
|
280
289
|
);
|
|
281
290
|
|
|
282
291
|
} catch (error) {
|
|
283
|
-
|
|
292
|
+
logger.error('Indexing failed', { error });
|
|
284
293
|
return createErrorResult(error as Error);
|
|
285
294
|
}
|
|
286
295
|
}
|