@grafema/core 0.1.0-alpha.5 → 0.2.0-beta
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +0 -1
- package/dist/Orchestrator.d.ts +31 -2
- package/dist/Orchestrator.d.ts.map +1 -1
- package/dist/Orchestrator.js +222 -27
- package/dist/config/ConfigLoader.d.ts +90 -0
- package/dist/config/ConfigLoader.d.ts.map +1 -0
- package/dist/config/ConfigLoader.js +249 -0
- package/dist/config/index.d.ts +6 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +4 -0
- package/dist/core/ASTWorker.d.ts +11 -36
- package/dist/core/ASTWorker.d.ts.map +1 -1
- package/dist/core/ASTWorker.js +93 -99
- package/dist/core/CoverageAnalyzer.d.ts +65 -0
- package/dist/core/CoverageAnalyzer.d.ts.map +1 -0
- package/dist/core/CoverageAnalyzer.js +198 -0
- package/dist/core/FileExplainer.d.ts +101 -0
- package/dist/core/FileExplainer.d.ts.map +1 -0
- package/dist/core/FileExplainer.js +139 -0
- package/dist/core/FileNodeManager.d.ts +40 -0
- package/dist/core/FileNodeManager.d.ts.map +1 -0
- package/dist/core/FileNodeManager.js +84 -0
- package/dist/core/GraphFreshnessChecker.d.ts +33 -0
- package/dist/core/GraphFreshnessChecker.d.ts.map +1 -0
- package/dist/core/GraphFreshnessChecker.js +101 -0
- package/dist/core/HashUtils.d.ts +24 -0
- package/dist/core/HashUtils.d.ts.map +1 -0
- package/dist/core/HashUtils.js +45 -0
- package/dist/core/IncrementalReanalyzer.d.ts +36 -0
- package/dist/core/IncrementalReanalyzer.d.ts.map +1 -0
- package/dist/core/IncrementalReanalyzer.js +132 -0
- package/dist/core/NodeFactory.d.ts +266 -19
- package/dist/core/NodeFactory.d.ts.map +1 -1
- package/dist/core/NodeFactory.js +256 -21
- package/dist/core/ScopeTracker.d.ts +84 -0
- package/dist/core/ScopeTracker.d.ts.map +1 -0
- package/dist/core/ScopeTracker.js +116 -0
- package/dist/core/SemanticId.d.ts +90 -0
- package/dist/core/SemanticId.d.ts.map +1 -0
- package/dist/core/SemanticId.js +115 -0
- package/dist/core/VersionManager.d.ts.map +1 -1
- package/dist/core/VersionManager.js +3 -2
- package/dist/core/nodes/ArgumentExpressionNode.d.ts +43 -0
- package/dist/core/nodes/ArgumentExpressionNode.d.ts.map +1 -0
- package/dist/core/nodes/ArgumentExpressionNode.js +60 -0
- package/dist/core/nodes/ArrayLiteralNode.d.ts +27 -0
- package/dist/core/nodes/ArrayLiteralNode.d.ts.map +1 -0
- package/dist/core/nodes/ArrayLiteralNode.js +43 -0
- package/dist/core/nodes/BranchNode.d.ts +41 -0
- package/dist/core/nodes/BranchNode.d.ts.map +1 -0
- package/dist/core/nodes/BranchNode.js +82 -0
- package/dist/core/nodes/CallSiteNode.d.ts +30 -2
- package/dist/core/nodes/CallSiteNode.d.ts.map +1 -1
- package/dist/core/nodes/CallSiteNode.js +54 -4
- package/dist/core/nodes/CaseNode.d.ts +43 -0
- package/dist/core/nodes/CaseNode.d.ts.map +1 -0
- package/dist/core/nodes/CaseNode.js +81 -0
- package/dist/core/nodes/ClassNode.d.ts +34 -2
- package/dist/core/nodes/ClassNode.d.ts.map +1 -1
- package/dist/core/nodes/ClassNode.js +52 -4
- package/dist/core/nodes/ConstantNode.d.ts +2 -2
- package/dist/core/nodes/ConstantNode.d.ts.map +1 -1
- package/dist/core/nodes/ConstantNode.js +6 -4
- package/dist/core/nodes/ConstructorCallNode.d.ts +51 -0
- package/dist/core/nodes/ConstructorCallNode.d.ts.map +1 -0
- package/dist/core/nodes/ConstructorCallNode.js +171 -0
- package/dist/core/nodes/DatabaseQueryNode.d.ts +3 -2
- package/dist/core/nodes/DatabaseQueryNode.d.ts.map +1 -1
- package/dist/core/nodes/DatabaseQueryNode.js +5 -2
- package/dist/core/nodes/DecoratorNode.d.ts +42 -0
- package/dist/core/nodes/DecoratorNode.d.ts.map +1 -0
- package/dist/core/nodes/DecoratorNode.js +64 -0
- package/dist/core/nodes/EnumNode.d.ts +42 -0
- package/dist/core/nodes/EnumNode.d.ts.map +1 -0
- package/dist/core/nodes/EnumNode.js +56 -0
- package/dist/core/nodes/EventListenerNode.d.ts +4 -4
- package/dist/core/nodes/EventListenerNode.d.ts.map +1 -1
- package/dist/core/nodes/EventListenerNode.js +7 -4
- package/dist/core/nodes/ExportNode.d.ts +38 -2
- package/dist/core/nodes/ExportNode.d.ts.map +1 -1
- package/dist/core/nodes/ExportNode.js +54 -4
- package/dist/core/nodes/ExpressionNode.d.ts +97 -0
- package/dist/core/nodes/ExpressionNode.d.ts.map +1 -0
- package/dist/core/nodes/ExpressionNode.js +180 -0
- package/dist/core/nodes/ExternalModuleNode.d.ts +32 -0
- package/dist/core/nodes/ExternalModuleNode.d.ts.map +1 -0
- package/dist/core/nodes/ExternalModuleNode.js +49 -0
- package/dist/core/nodes/ExternalStdioNode.d.ts +13 -6
- package/dist/core/nodes/ExternalStdioNode.d.ts.map +1 -1
- package/dist/core/nodes/ExternalStdioNode.js +15 -8
- package/dist/core/nodes/FunctionNode.d.ts +36 -0
- package/dist/core/nodes/FunctionNode.d.ts.map +1 -1
- package/dist/core/nodes/FunctionNode.js +80 -1
- package/dist/core/nodes/HttpRequestNode.d.ts +4 -4
- package/dist/core/nodes/HttpRequestNode.d.ts.map +1 -1
- package/dist/core/nodes/HttpRequestNode.js +7 -4
- package/dist/core/nodes/ImportNode.d.ts +28 -6
- package/dist/core/nodes/ImportNode.d.ts.map +1 -1
- package/dist/core/nodes/ImportNode.js +43 -8
- package/dist/core/nodes/InterfaceNode.d.ts +46 -0
- package/dist/core/nodes/InterfaceNode.d.ts.map +1 -0
- package/dist/core/nodes/InterfaceNode.js +57 -0
- package/dist/core/nodes/IssueNode.d.ts +73 -0
- package/dist/core/nodes/IssueNode.d.ts.map +1 -0
- package/dist/core/nodes/IssueNode.js +129 -0
- package/dist/core/nodes/LiteralNode.d.ts +2 -2
- package/dist/core/nodes/LiteralNode.d.ts.map +1 -1
- package/dist/core/nodes/LiteralNode.js +6 -4
- package/dist/core/nodes/MethodCallNode.d.ts +32 -2
- package/dist/core/nodes/MethodCallNode.d.ts.map +1 -1
- package/dist/core/nodes/MethodCallNode.js +57 -4
- package/dist/core/nodes/MethodNode.d.ts +34 -2
- package/dist/core/nodes/MethodNode.d.ts.map +1 -1
- package/dist/core/nodes/MethodNode.js +55 -3
- package/dist/core/nodes/ModuleNode.d.ts +31 -0
- package/dist/core/nodes/ModuleNode.d.ts.map +1 -1
- package/dist/core/nodes/ModuleNode.js +37 -0
- package/dist/core/nodes/NetworkRequestNode.d.ts +54 -0
- package/dist/core/nodes/NetworkRequestNode.d.ts.map +1 -0
- package/dist/core/nodes/NetworkRequestNode.js +65 -0
- package/dist/core/nodes/ObjectLiteralNode.d.ts +27 -0
- package/dist/core/nodes/ObjectLiteralNode.d.ts.map +1 -0
- package/dist/core/nodes/ObjectLiteralNode.js +43 -0
- package/dist/core/nodes/ParameterNode.d.ts +2 -2
- package/dist/core/nodes/ParameterNode.d.ts.map +1 -1
- package/dist/core/nodes/ParameterNode.js +5 -3
- package/dist/core/nodes/ScopeNode.d.ts +31 -0
- package/dist/core/nodes/ScopeNode.d.ts.map +1 -1
- package/dist/core/nodes/ScopeNode.js +49 -0
- package/dist/core/nodes/TypeNode.d.ts +36 -0
- package/dist/core/nodes/TypeNode.d.ts.map +1 -0
- package/dist/core/nodes/TypeNode.js +55 -0
- package/dist/core/nodes/VariableDeclarationNode.d.ts +29 -2
- package/dist/core/nodes/VariableDeclarationNode.d.ts.map +1 -1
- package/dist/core/nodes/VariableDeclarationNode.js +48 -4
- package/dist/core/nodes/index.d.ts +15 -1
- package/dist/core/nodes/index.d.ts.map +1 -1
- package/dist/core/nodes/index.js +17 -0
- package/dist/data/builtins/BuiltinRegistry.d.ts +78 -0
- package/dist/data/builtins/BuiltinRegistry.d.ts.map +1 -0
- package/dist/data/builtins/BuiltinRegistry.js +110 -0
- package/dist/data/builtins/definitions.d.ts +28 -0
- package/dist/data/builtins/definitions.d.ts.map +1 -0
- package/dist/data/builtins/definitions.js +250 -0
- package/dist/data/builtins/index.d.ts +10 -0
- package/dist/data/builtins/index.d.ts.map +1 -0
- package/dist/data/builtins/index.js +8 -0
- package/dist/data/builtins/jsGlobals.d.ts +18 -0
- package/dist/data/builtins/jsGlobals.d.ts.map +1 -0
- package/dist/data/builtins/jsGlobals.js +26 -0
- package/dist/data/builtins/types.d.ts +34 -0
- package/dist/data/builtins/types.d.ts.map +1 -0
- package/dist/data/builtins/types.js +7 -0
- package/dist/data/globals/definitions.d.ts +27 -0
- package/dist/data/globals/definitions.d.ts.map +1 -0
- package/dist/data/globals/definitions.js +117 -0
- package/dist/data/globals/index.d.ts +36 -0
- package/dist/data/globals/index.d.ts.map +1 -0
- package/dist/data/globals/index.js +52 -0
- package/dist/diagnostics/DiagnosticCollector.d.ts +98 -0
- package/dist/diagnostics/DiagnosticCollector.d.ts.map +1 -0
- package/dist/diagnostics/DiagnosticCollector.js +129 -0
- package/dist/diagnostics/DiagnosticReporter.d.ts +100 -0
- package/dist/diagnostics/DiagnosticReporter.d.ts.map +1 -0
- package/dist/diagnostics/DiagnosticReporter.js +247 -0
- package/dist/diagnostics/DiagnosticWriter.d.ts +31 -0
- package/dist/diagnostics/DiagnosticWriter.d.ts.map +1 -0
- package/dist/diagnostics/DiagnosticWriter.js +43 -0
- package/dist/diagnostics/index.d.ts +14 -0
- package/dist/diagnostics/index.d.ts.map +1 -0
- package/dist/diagnostics/index.js +11 -0
- package/dist/errors/GrafemaError.d.ts +161 -0
- package/dist/errors/GrafemaError.d.ts.map +1 -0
- package/dist/errors/GrafemaError.js +181 -0
- package/dist/index.d.ts +73 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +70 -1
- package/dist/logging/Logger.d.ts +48 -0
- package/dist/logging/Logger.d.ts.map +1 -0
- package/dist/logging/Logger.js +134 -0
- package/dist/plugins/Plugin.d.ts +5 -1
- package/dist/plugins/Plugin.d.ts.map +1 -1
- package/dist/plugins/Plugin.js +33 -0
- package/dist/plugins/analysis/DatabaseAnalyzer.d.ts.map +1 -1
- package/dist/plugins/analysis/DatabaseAnalyzer.js +14 -6
- package/dist/plugins/analysis/ExpressAnalyzer.d.ts.map +1 -1
- package/dist/plugins/analysis/ExpressAnalyzer.js +29 -19
- package/dist/plugins/analysis/ExpressResponseAnalyzer.d.ts +148 -0
- package/dist/plugins/analysis/ExpressResponseAnalyzer.d.ts.map +1 -0
- package/dist/plugins/analysis/ExpressResponseAnalyzer.js +495 -0
- package/dist/plugins/analysis/ExpressRouteAnalyzer.d.ts.map +1 -1
- package/dist/plugins/analysis/ExpressRouteAnalyzer.js +71 -29
- package/dist/plugins/analysis/FetchAnalyzer.d.ts +41 -0
- package/dist/plugins/analysis/FetchAnalyzer.d.ts.map +1 -1
- package/dist/plugins/analysis/FetchAnalyzer.js +187 -19
- package/dist/plugins/analysis/IncrementalAnalysisPlugin.d.ts +6 -3
- package/dist/plugins/analysis/IncrementalAnalysisPlugin.d.ts.map +1 -1
- package/dist/plugins/analysis/IncrementalAnalysisPlugin.js +76 -80
- package/dist/plugins/analysis/JSASTAnalyzer.d.ts +313 -19
- package/dist/plugins/analysis/JSASTAnalyzer.d.ts.map +1 -1
- package/dist/plugins/analysis/JSASTAnalyzer.js +3430 -503
- package/dist/plugins/analysis/ReactAnalyzer.d.ts.map +1 -1
- package/dist/plugins/analysis/ReactAnalyzer.js +56 -57
- package/dist/plugins/analysis/RustAnalyzer.d.ts.map +1 -1
- package/dist/plugins/analysis/RustAnalyzer.js +16 -11
- package/dist/plugins/analysis/SQLiteAnalyzer.d.ts.map +1 -1
- package/dist/plugins/analysis/SQLiteAnalyzer.js +11 -7
- package/dist/plugins/analysis/ServiceLayerAnalyzer.d.ts.map +1 -1
- package/dist/plugins/analysis/ServiceLayerAnalyzer.js +21 -9
- package/dist/plugins/analysis/SocketIOAnalyzer.d.ts +9 -0
- package/dist/plugins/analysis/SocketIOAnalyzer.d.ts.map +1 -1
- package/dist/plugins/analysis/SocketIOAnalyzer.js +117 -21
- package/dist/plugins/analysis/SystemDbAnalyzer.d.ts.map +1 -1
- package/dist/plugins/analysis/SystemDbAnalyzer.js +15 -5
- package/dist/plugins/analysis/ast/GraphBuilder.d.ts +207 -4
- package/dist/plugins/analysis/ast/GraphBuilder.d.ts.map +1 -1
- package/dist/plugins/analysis/ast/GraphBuilder.js +1527 -316
- package/dist/plugins/analysis/ast/IdGenerator.d.ts +105 -0
- package/dist/plugins/analysis/ast/IdGenerator.d.ts.map +1 -0
- package/dist/plugins/analysis/ast/IdGenerator.js +116 -0
- package/dist/plugins/analysis/ast/types.d.ts +470 -5
- package/dist/plugins/analysis/ast/types.d.ts.map +1 -1
- package/dist/plugins/analysis/ast/utils/createParameterNodes.d.ts +33 -0
- package/dist/plugins/analysis/ast/utils/createParameterNodes.d.ts.map +1 -0
- package/dist/plugins/analysis/ast/utils/createParameterNodes.js +89 -0
- package/dist/plugins/analysis/ast/utils/index.d.ts +6 -0
- package/dist/plugins/analysis/ast/utils/index.d.ts.map +1 -0
- package/dist/plugins/analysis/ast/utils/index.js +5 -0
- package/dist/plugins/analysis/ast/utils/location.d.ts +87 -0
- package/dist/plugins/analysis/ast/utils/location.d.ts.map +1 -0
- package/dist/plugins/analysis/ast/utils/location.js +78 -0
- package/dist/plugins/analysis/ast/visitors/ASTVisitor.d.ts +14 -5
- package/dist/plugins/analysis/ast/visitors/ASTVisitor.d.ts.map +1 -1
- package/dist/plugins/analysis/ast/visitors/ASTVisitor.js +6 -5
- package/dist/plugins/analysis/ast/visitors/CallExpressionVisitor.d.ts +100 -9
- package/dist/plugins/analysis/ast/visitors/CallExpressionVisitor.d.ts.map +1 -1
- package/dist/plugins/analysis/ast/visitors/CallExpressionVisitor.js +674 -125
- package/dist/plugins/analysis/ast/visitors/ClassVisitor.d.ts +4 -1
- package/dist/plugins/analysis/ast/visitors/ClassVisitor.d.ts.map +1 -1
- package/dist/plugins/analysis/ast/visitors/ClassVisitor.js +72 -32
- package/dist/plugins/analysis/ast/visitors/FunctionVisitor.d.ts +14 -1
- package/dist/plugins/analysis/ast/visitors/FunctionVisitor.d.ts.map +1 -1
- package/dist/plugins/analysis/ast/visitors/FunctionVisitor.js +190 -63
- package/dist/plugins/analysis/ast/visitors/ImportExportVisitor.d.ts +4 -0
- package/dist/plugins/analysis/ast/visitors/ImportExportVisitor.d.ts.map +1 -1
- package/dist/plugins/analysis/ast/visitors/ImportExportVisitor.js +112 -8
- package/dist/plugins/analysis/ast/visitors/TypeScriptVisitor.d.ts +12 -1
- package/dist/plugins/analysis/ast/visitors/TypeScriptVisitor.d.ts.map +1 -1
- package/dist/plugins/analysis/ast/visitors/TypeScriptVisitor.js +36 -14
- package/dist/plugins/analysis/ast/visitors/VariableVisitor.d.ts +20 -2
- package/dist/plugins/analysis/ast/visitors/VariableVisitor.d.ts.map +1 -1
- package/dist/plugins/analysis/ast/visitors/VariableVisitor.js +243 -45
- package/dist/plugins/discovery/MonorepoServiceDiscovery.d.ts.map +1 -1
- package/dist/plugins/discovery/MonorepoServiceDiscovery.js +3 -2
- package/dist/plugins/discovery/SimpleProjectDiscovery.d.ts.map +1 -1
- package/dist/plugins/discovery/SimpleProjectDiscovery.js +5 -1
- package/dist/plugins/discovery/WorkspaceDiscovery.d.ts +22 -0
- package/dist/plugins/discovery/WorkspaceDiscovery.d.ts.map +1 -0
- package/dist/plugins/discovery/WorkspaceDiscovery.js +141 -0
- package/dist/plugins/discovery/resolveSourceEntrypoint.d.ts +46 -0
- package/dist/plugins/discovery/resolveSourceEntrypoint.d.ts.map +1 -0
- package/dist/plugins/discovery/resolveSourceEntrypoint.js +86 -0
- package/dist/plugins/discovery/workspaces/detector.d.ts +21 -0
- package/dist/plugins/discovery/workspaces/detector.d.ts.map +1 -0
- package/dist/plugins/discovery/workspaces/detector.js +49 -0
- package/dist/plugins/discovery/workspaces/globResolver.d.ts +35 -0
- package/dist/plugins/discovery/workspaces/globResolver.d.ts.map +1 -0
- package/dist/plugins/discovery/workspaces/globResolver.js +184 -0
- package/dist/plugins/discovery/workspaces/index.d.ts +9 -0
- package/dist/plugins/discovery/workspaces/index.d.ts.map +1 -0
- package/dist/plugins/discovery/workspaces/index.js +8 -0
- package/dist/plugins/discovery/workspaces/parsers.d.ts +38 -0
- package/dist/plugins/discovery/workspaces/parsers.d.ts.map +1 -0
- package/dist/plugins/discovery/workspaces/parsers.js +80 -0
- package/dist/plugins/enrichment/AliasTracker.d.ts.map +1 -1
- package/dist/plugins/enrichment/AliasTracker.js +29 -8
- package/dist/plugins/enrichment/ArgumentParameterLinker.d.ts +32 -0
- package/dist/plugins/enrichment/ArgumentParameterLinker.d.ts.map +1 -0
- package/dist/plugins/enrichment/ArgumentParameterLinker.js +175 -0
- package/dist/plugins/enrichment/ClosureCaptureEnricher.d.ts +51 -0
- package/dist/plugins/enrichment/ClosureCaptureEnricher.d.ts.map +1 -0
- package/dist/plugins/enrichment/ClosureCaptureEnricher.js +205 -0
- package/dist/plugins/enrichment/ExternalCallResolver.d.ts +42 -0
- package/dist/plugins/enrichment/ExternalCallResolver.d.ts.map +1 -0
- package/dist/plugins/enrichment/ExternalCallResolver.js +213 -0
- package/dist/plugins/enrichment/FunctionCallResolver.d.ts +58 -0
- package/dist/plugins/enrichment/FunctionCallResolver.d.ts.map +1 -0
- package/dist/plugins/enrichment/FunctionCallResolver.js +340 -0
- package/dist/plugins/enrichment/HTTPConnectionEnricher.d.ts +16 -3
- package/dist/plugins/enrichment/HTTPConnectionEnricher.d.ts.map +1 -1
- package/dist/plugins/enrichment/HTTPConnectionEnricher.js +78 -27
- package/dist/plugins/enrichment/ImportExportLinker.d.ts.map +1 -1
- package/dist/plugins/enrichment/ImportExportLinker.js +23 -6
- package/dist/plugins/enrichment/MethodCallResolver.d.ts.map +1 -1
- package/dist/plugins/enrichment/MethodCallResolver.js +33 -13
- package/dist/plugins/enrichment/MountPointResolver.d.ts +14 -12
- package/dist/plugins/enrichment/MountPointResolver.d.ts.map +1 -1
- package/dist/plugins/enrichment/MountPointResolver.js +173 -147
- package/dist/plugins/enrichment/NodejsBuiltinsResolver.d.ts +44 -0
- package/dist/plugins/enrichment/NodejsBuiltinsResolver.d.ts.map +1 -0
- package/dist/plugins/enrichment/NodejsBuiltinsResolver.js +271 -0
- package/dist/plugins/enrichment/PrefixEvaluator.d.ts.map +1 -1
- package/dist/plugins/enrichment/PrefixEvaluator.js +16 -7
- package/dist/plugins/enrichment/RustFFIEnricher.d.ts.map +1 -1
- package/dist/plugins/enrichment/RustFFIEnricher.js +6 -5
- package/dist/plugins/enrichment/ValueDomainAnalyzer.d.ts +22 -27
- package/dist/plugins/enrichment/ValueDomainAnalyzer.d.ts.map +1 -1
- package/dist/plugins/enrichment/ValueDomainAnalyzer.js +185 -143
- package/dist/plugins/indexing/IncrementalModuleIndexer.d.ts.map +1 -1
- package/dist/plugins/indexing/IncrementalModuleIndexer.js +23 -14
- package/dist/plugins/indexing/JSModuleIndexer.d.ts +15 -0
- package/dist/plugins/indexing/JSModuleIndexer.d.ts.map +1 -1
- package/dist/plugins/indexing/JSModuleIndexer.js +121 -31
- package/dist/plugins/indexing/RustModuleIndexer.d.ts +1 -1
- package/dist/plugins/indexing/RustModuleIndexer.d.ts.map +1 -1
- package/dist/plugins/indexing/RustModuleIndexer.js +8 -7
- package/dist/plugins/indexing/ServiceDetector.d.ts +10 -0
- package/dist/plugins/indexing/ServiceDetector.d.ts.map +1 -1
- package/dist/plugins/indexing/ServiceDetector.js +28 -15
- package/dist/plugins/validation/BrokenImportValidator.d.ts +31 -0
- package/dist/plugins/validation/BrokenImportValidator.d.ts.map +1 -0
- package/dist/plugins/validation/BrokenImportValidator.js +249 -0
- package/dist/plugins/validation/CallResolverValidator.d.ts +21 -10
- package/dist/plugins/validation/CallResolverValidator.d.ts.map +1 -1
- package/dist/plugins/validation/CallResolverValidator.js +103 -77
- package/dist/plugins/validation/DataFlowValidator.d.ts.map +1 -1
- package/dist/plugins/validation/DataFlowValidator.js +62 -49
- package/dist/plugins/validation/EvalBanValidator.d.ts.map +1 -1
- package/dist/plugins/validation/EvalBanValidator.js +17 -16
- package/dist/plugins/validation/GraphConnectivityValidator.d.ts.map +1 -1
- package/dist/plugins/validation/GraphConnectivityValidator.js +44 -24
- package/dist/plugins/validation/NodeCreationValidator.d.ts +85 -0
- package/dist/plugins/validation/NodeCreationValidator.d.ts.map +1 -0
- package/dist/plugins/validation/NodeCreationValidator.js +415 -0
- package/dist/plugins/validation/SQLInjectionValidator.d.ts.map +1 -1
- package/dist/plugins/validation/SQLInjectionValidator.js +61 -19
- package/dist/plugins/validation/ShadowingDetector.d.ts.map +1 -1
- package/dist/plugins/validation/ShadowingDetector.js +6 -5
- package/dist/plugins/validation/TypeScriptDeadCodeValidator.d.ts.map +1 -1
- package/dist/plugins/validation/TypeScriptDeadCodeValidator.js +12 -11
- package/dist/plugins/vcs/GitPlugin.d.ts.map +1 -1
- package/dist/plugins/vcs/GitPlugin.js +10 -12
- package/dist/plugins/vcs/VCSPlugin.d.ts +3 -2
- package/dist/plugins/vcs/VCSPlugin.d.ts.map +1 -1
- package/dist/plugins/vcs/VCSPlugin.js +5 -5
- package/dist/queries/findCallsInFunction.d.ts +52 -0
- package/dist/queries/findCallsInFunction.d.ts.map +1 -0
- package/dist/queries/findCallsInFunction.js +135 -0
- package/dist/queries/findContainingFunction.d.ts +45 -0
- package/dist/queries/findContainingFunction.d.ts.map +1 -0
- package/dist/queries/findContainingFunction.js +54 -0
- package/dist/queries/index.d.ts +14 -0
- package/dist/queries/index.d.ts.map +1 -0
- package/dist/queries/index.js +11 -0
- package/dist/queries/traceValues.d.ts +70 -0
- package/dist/queries/traceValues.d.ts.map +1 -0
- package/dist/queries/traceValues.js +299 -0
- package/dist/queries/types.d.ts +163 -0
- package/dist/queries/types.d.ts.map +1 -0
- package/dist/queries/types.js +9 -0
- package/dist/schema/GraphSchemaExtractor.d.ts +53 -0
- package/dist/schema/GraphSchemaExtractor.d.ts.map +1 -0
- package/dist/schema/GraphSchemaExtractor.js +124 -0
- package/dist/schema/InterfaceSchemaExtractor.d.ts +73 -0
- package/dist/schema/InterfaceSchemaExtractor.d.ts.map +1 -0
- package/dist/schema/InterfaceSchemaExtractor.js +112 -0
- package/dist/schema/index.d.ts +5 -0
- package/dist/schema/index.d.ts.map +1 -0
- package/dist/schema/index.js +2 -0
- package/dist/storage/backends/RFDBServerBackend.d.ts +21 -34
- package/dist/storage/backends/RFDBServerBackend.d.ts.map +1 -1
- package/dist/storage/backends/RFDBServerBackend.js +72 -62
- package/dist/storage/backends/typeValidation.d.ts.map +1 -1
- package/dist/storage/backends/typeValidation.js +1 -0
- package/dist/validation/PathValidator.d.ts +1 -2
- package/dist/validation/PathValidator.d.ts.map +1 -1
- package/package.json +3 -3
- package/src/Orchestrator.ts +272 -27
- package/src/config/ConfigLoader.ts +354 -0
- package/src/config/index.ts +5 -0
- package/src/core/ASTWorker.ts +143 -139
- package/src/core/CoverageAnalyzer.ts +243 -0
- package/src/core/FileExplainer.ts +179 -0
- package/src/core/FileNodeManager.ts +100 -0
- package/src/core/GraphFreshnessChecker.ts +143 -0
- package/src/core/HashUtils.ts +48 -0
- package/src/core/IncrementalReanalyzer.ts +192 -0
- package/src/core/NodeFactory.ts +470 -23
- package/src/core/ScopeTracker.ts +154 -0
- package/src/core/SemanticId.ts +192 -0
- package/src/core/VersionManager.ts +3 -2
- package/src/core/nodes/ArgumentExpressionNode.ts +89 -0
- package/src/core/nodes/ArrayLiteralNode.ts +66 -0
- package/src/core/nodes/BranchNode.ts +113 -0
- package/src/core/nodes/CallSiteNode.ts +64 -4
- package/src/core/nodes/CaseNode.ts +123 -0
- package/src/core/nodes/ClassNode.ts +67 -4
- package/src/core/nodes/ConstantNode.ts +5 -4
- package/src/core/nodes/ConstructorCallNode.ts +217 -0
- package/src/core/nodes/DatabaseQueryNode.ts +5 -1
- package/src/core/nodes/DecoratorNode.ts +92 -0
- package/src/core/nodes/EnumNode.ts +87 -0
- package/src/core/nodes/EventListenerNode.ts +7 -4
- package/src/core/nodes/ExportNode.ts +74 -4
- package/src/core/nodes/ExpressionNode.ts +232 -0
- package/src/core/nodes/ExternalModuleNode.ts +65 -0
- package/src/core/nodes/ExternalStdioNode.ts +17 -9
- package/src/core/nodes/FunctionNode.ts +101 -1
- package/src/core/nodes/HttpRequestNode.ts +7 -4
- package/src/core/nodes/ImportNode.ts +62 -13
- package/src/core/nodes/InterfaceNode.ts +92 -0
- package/src/core/nodes/IssueNode.ts +177 -0
- package/src/core/nodes/LiteralNode.ts +5 -4
- package/src/core/nodes/MethodCallNode.ts +70 -4
- package/src/core/nodes/MethodNode.ts +68 -3
- package/src/core/nodes/ModuleNode.ts +50 -0
- package/src/core/nodes/NetworkRequestNode.ts +77 -0
- package/src/core/nodes/ObjectLiteralNode.ts +66 -0
- package/src/core/nodes/ParameterNode.ts +4 -3
- package/src/core/nodes/ScopeNode.ts +65 -0
- package/src/core/nodes/TypeNode.ts +79 -0
- package/src/core/nodes/VariableDeclarationNode.ts +58 -4
- package/src/core/nodes/index.ts +21 -1
- package/src/data/builtins/BuiltinRegistry.ts +124 -0
- package/src/data/builtins/definitions.ts +267 -0
- package/src/data/builtins/index.ts +10 -0
- package/src/data/builtins/jsGlobals.ts +28 -0
- package/src/data/builtins/types.ts +36 -0
- package/src/data/globals/definitions.ts +156 -0
- package/src/data/globals/index.ts +66 -0
- package/src/diagnostics/DiagnosticCollector.ts +163 -0
- package/src/diagnostics/DiagnosticReporter.ts +324 -0
- package/src/diagnostics/DiagnosticWriter.ts +50 -0
- package/src/diagnostics/index.ts +16 -0
- package/src/errors/GrafemaError.ts +239 -0
- package/src/index.ts +193 -1
- package/src/logging/Logger.ts +152 -0
- package/src/plugins/Plugin.ts +42 -0
- package/src/plugins/analysis/DatabaseAnalyzer.ts +16 -8
- package/src/plugins/analysis/ExpressAnalyzer.ts +33 -19
- package/src/plugins/analysis/ExpressResponseAnalyzer.ts +636 -0
- package/src/plugins/analysis/ExpressRouteAnalyzer.ts +76 -36
- package/src/plugins/analysis/FetchAnalyzer.ts +232 -21
- package/src/plugins/analysis/IncrementalAnalysisPlugin.ts +84 -101
- package/src/plugins/analysis/JSASTAnalyzer.ts +4265 -587
- package/src/plugins/analysis/ReactAnalyzer.ts +57 -57
- package/src/plugins/analysis/RustAnalyzer.ts +16 -11
- package/src/plugins/analysis/SQLiteAnalyzer.ts +13 -7
- package/src/plugins/analysis/ServiceLayerAnalyzer.ts +22 -16
- package/src/plugins/analysis/SocketIOAnalyzer.ts +151 -28
- package/src/plugins/analysis/SystemDbAnalyzer.ts +16 -11
- package/src/plugins/analysis/ast/GraphBuilder.ts +1947 -327
- package/src/plugins/analysis/ast/IdGenerator.ts +177 -0
- package/src/plugins/analysis/ast/types.ts +596 -6
- package/src/plugins/analysis/ast/utils/createParameterNodes.ts +104 -0
- package/src/plugins/analysis/ast/utils/index.ts +12 -0
- package/src/plugins/analysis/ast/utils/location.ts +103 -0
- package/src/plugins/analysis/ast/visitors/ASTVisitor.ts +19 -8
- package/src/plugins/analysis/ast/visitors/CallExpressionVisitor.ts +924 -83
- package/src/plugins/analysis/ast/visitors/ClassVisitor.ts +97 -44
- package/src/plugins/analysis/ast/visitors/FunctionVisitor.ts +234 -93
- package/src/plugins/analysis/ast/visitors/ImportExportVisitor.ts +124 -9
- package/src/plugins/analysis/ast/visitors/TypeScriptVisitor.ts +41 -14
- package/src/plugins/analysis/ast/visitors/VariableVisitor.ts +294 -49
- package/src/plugins/discovery/MonorepoServiceDiscovery.ts +3 -2
- package/src/plugins/discovery/SimpleProjectDiscovery.ts +6 -1
- package/src/plugins/discovery/WorkspaceDiscovery.ts +184 -0
- package/src/plugins/discovery/resolveSourceEntrypoint.ts +103 -0
- package/src/plugins/discovery/workspaces/detector.ts +63 -0
- package/src/plugins/discovery/workspaces/globResolver.ts +229 -0
- package/src/plugins/discovery/workspaces/index.ts +23 -0
- package/src/plugins/discovery/workspaces/parsers.ts +99 -0
- package/src/plugins/enrichment/AliasTracker.ts +35 -8
- package/src/plugins/enrichment/ArgumentParameterLinker.ts +240 -0
- package/src/plugins/enrichment/ClosureCaptureEnricher.ts +267 -0
- package/src/plugins/enrichment/ExternalCallResolver.ts +262 -0
- package/src/plugins/enrichment/FunctionCallResolver.ts +456 -0
- package/src/plugins/enrichment/HTTPConnectionEnricher.ts +84 -27
- package/src/plugins/enrichment/ImportExportLinker.ts +24 -6
- package/src/plugins/enrichment/MethodCallResolver.ts +39 -13
- package/src/plugins/enrichment/MountPointResolver.ts +208 -195
- package/src/plugins/enrichment/NodejsBuiltinsResolver.ts +365 -0
- package/src/plugins/enrichment/PrefixEvaluator.ts +16 -7
- package/src/plugins/enrichment/RustFFIEnricher.ts +6 -5
- package/src/plugins/enrichment/ValueDomainAnalyzer.ts +209 -189
- package/src/plugins/indexing/IncrementalModuleIndexer.ts +23 -14
- package/src/plugins/indexing/JSModuleIndexer.ts +140 -34
- package/src/plugins/indexing/RustModuleIndexer.ts +8 -7
- package/src/plugins/validation/BrokenImportValidator.ts +325 -0
- package/src/plugins/validation/CallResolverValidator.ts +131 -110
- package/src/plugins/validation/DataFlowValidator.ts +88 -67
- package/src/plugins/validation/EvalBanValidator.ts +17 -16
- package/src/plugins/validation/GraphConnectivityValidator.ts +58 -24
- package/src/plugins/validation/NodeCreationValidator.ts +554 -0
- package/src/plugins/validation/SQLInjectionValidator.ts +63 -20
- package/src/plugins/validation/ShadowingDetector.ts +6 -5
- package/src/plugins/validation/TypeScriptDeadCodeValidator.ts +12 -11
- package/src/plugins/vcs/GitPlugin.ts +40 -12
- package/src/plugins/vcs/VCSPlugin.ts +7 -5
- package/src/queries/README.md +46 -0
- package/src/queries/findCallsInFunction.ts +206 -0
- package/src/queries/findContainingFunction.ts +83 -0
- package/src/queries/index.ts +23 -0
- package/src/queries/traceValues.ts +398 -0
- package/src/queries/types.ts +187 -0
- package/src/schema/GraphSchemaExtractor.ts +177 -0
- package/src/schema/InterfaceSchemaExtractor.ts +173 -0
- package/src/schema/index.ts +5 -0
- package/src/storage/backends/RFDBServerBackend.ts +100 -98
- package/src/storage/backends/typeValidation.ts +1 -0
- package/src/validation/PathValidator.ts +1 -1
- package/dist/core/AnalysisWorker.d.ts +0 -14
- package/dist/core/AnalysisWorker.d.ts.map +0 -1
- package/dist/core/AnalysisWorker.js +0 -307
- package/dist/core/ParallelAnalyzer.d.ts +0 -120
- package/dist/core/ParallelAnalyzer.d.ts.map +0 -1
- package/dist/core/ParallelAnalyzer.js +0 -331
- package/dist/core/QueueWorker.d.ts +0 -12
- package/dist/core/QueueWorker.d.ts.map +0 -1
- package/dist/core/QueueWorker.js +0 -567
- package/dist/core/RFDBClient.d.ts +0 -179
- package/dist/core/RFDBClient.d.ts.map +0 -1
- package/dist/core/RFDBClient.js +0 -429
- package/dist/plugins/discovery/ZonServiceDiscovery.d.ts +0 -19
- package/dist/plugins/discovery/ZonServiceDiscovery.d.ts.map +0 -1
- package/dist/plugins/discovery/ZonServiceDiscovery.js +0 -204
- package/src/core/AnalysisWorker.ts +0 -410
- package/src/core/ParallelAnalyzer.ts +0 -476
- package/src/core/QueueWorker.ts +0 -780
- package/src/plugins/indexing/ServiceDetector.ts +0 -230
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* GraphSchemaExtractor - Extracts graph node/edge type schemas
|
|
3
|
+
*
|
|
4
|
+
* Usage:
|
|
5
|
+
* const extractor = new GraphSchemaExtractor(backend);
|
|
6
|
+
* const schema = await extractor.extract();
|
|
7
|
+
*
|
|
8
|
+
* When to use:
|
|
9
|
+
* - Export graph schema for contract tracking
|
|
10
|
+
* - Track node/edge type changes via checksum
|
|
11
|
+
* - Generate graph documentation
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
import { createHash } from 'crypto';
|
|
15
|
+
import { NODE_TYPE, NAMESPACED_TYPE, EDGE_TYPE } from '@grafema/types';
|
|
16
|
+
import type { RFDBServerBackend } from '../storage/backends/RFDBServerBackend.js';
|
|
17
|
+
|
|
18
|
+
// ============================================================================
|
|
19
|
+
// Types
|
|
20
|
+
// ============================================================================
|
|
21
|
+
|
|
22
|
+
export interface NodeTypeSchema {
|
|
23
|
+
category: 'base' | 'namespaced';
|
|
24
|
+
namespace?: string;
|
|
25
|
+
count: number;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
export interface EdgeTypeSchema {
|
|
29
|
+
count: number;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
export interface GraphSchema {
|
|
33
|
+
$schema: 'grafema-graph-v1';
|
|
34
|
+
extractedAt: string;
|
|
35
|
+
nodeTypes: Record<string, NodeTypeSchema>;
|
|
36
|
+
edgeTypes: Record<string, EdgeTypeSchema>;
|
|
37
|
+
statistics: {
|
|
38
|
+
totalNodes: number;
|
|
39
|
+
totalEdges: number;
|
|
40
|
+
nodeTypeCount: number;
|
|
41
|
+
edgeTypeCount: number;
|
|
42
|
+
};
|
|
43
|
+
checksum: string;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
// ============================================================================
|
|
47
|
+
// Extractor
|
|
48
|
+
// ============================================================================
|
|
49
|
+
|
|
50
|
+
export interface GraphExtractOptions {
|
|
51
|
+
/** Include all defined types, not just used ones (default: false) */
|
|
52
|
+
includeAll?: boolean;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
export class GraphSchemaExtractor {
|
|
56
|
+
constructor(private backend: RFDBServerBackend) {}
|
|
57
|
+
|
|
58
|
+
/**
|
|
59
|
+
* Extract graph schema from current database
|
|
60
|
+
*
|
|
61
|
+
* @param options.includeAll - If true, include all defined types even with count=0
|
|
62
|
+
*/
|
|
63
|
+
async extract(options?: GraphExtractOptions): Promise<GraphSchema> {
|
|
64
|
+
const includeAll = options?.includeAll ?? false;
|
|
65
|
+
// Get actual counts from graph
|
|
66
|
+
const nodeCounts = await this.backend.countNodesByType();
|
|
67
|
+
const edgeCounts = await this.backend.countEdgesByType();
|
|
68
|
+
|
|
69
|
+
// Build node types from definitions + counts
|
|
70
|
+
const nodeTypes: Record<string, NodeTypeSchema> = {};
|
|
71
|
+
|
|
72
|
+
// Base node types
|
|
73
|
+
for (const [_key, value] of Object.entries(NODE_TYPE)) {
|
|
74
|
+
nodeTypes[value] = {
|
|
75
|
+
category: 'base',
|
|
76
|
+
count: nodeCounts[value] || 0,
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
// Namespaced node types
|
|
81
|
+
for (const [_key, value] of Object.entries(NAMESPACED_TYPE)) {
|
|
82
|
+
const namespace = value.split(':')[0];
|
|
83
|
+
nodeTypes[value] = {
|
|
84
|
+
category: 'namespaced',
|
|
85
|
+
namespace,
|
|
86
|
+
count: nodeCounts[value] || 0,
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
// Add any additional types found in the graph but not in definitions
|
|
91
|
+
for (const [type, count] of Object.entries(nodeCounts)) {
|
|
92
|
+
if (!nodeTypes[type]) {
|
|
93
|
+
const namespace = type.includes(':') ? type.split(':')[0] : undefined;
|
|
94
|
+
nodeTypes[type] = {
|
|
95
|
+
category: namespace ? 'namespaced' : 'base',
|
|
96
|
+
namespace,
|
|
97
|
+
count,
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
// Build edge types from definitions + counts
|
|
103
|
+
const edgeTypes: Record<string, EdgeTypeSchema> = {};
|
|
104
|
+
|
|
105
|
+
for (const [_key, value] of Object.entries(EDGE_TYPE)) {
|
|
106
|
+
edgeTypes[value] = {
|
|
107
|
+
count: edgeCounts[value] || 0,
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
// Add any additional edge types found in the graph
|
|
112
|
+
for (const [type, count] of Object.entries(edgeCounts)) {
|
|
113
|
+
if (!edgeTypes[type]) {
|
|
114
|
+
edgeTypes[type] = { count };
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
// Calculate totals
|
|
119
|
+
const totalNodes = Object.values(nodeCounts).reduce((sum, n) => sum + n, 0);
|
|
120
|
+
const totalEdges = Object.values(edgeCounts).reduce((sum, n) => sum + n, 0);
|
|
121
|
+
|
|
122
|
+
// Filter out types with count=0 unless includeAll is true
|
|
123
|
+
const filteredNodeTypes: Record<string, NodeTypeSchema> = {};
|
|
124
|
+
for (const [type, info] of Object.entries(nodeTypes)) {
|
|
125
|
+
if (includeAll || info.count > 0) {
|
|
126
|
+
filteredNodeTypes[type] = info;
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
const filteredEdgeTypes: Record<string, EdgeTypeSchema> = {};
|
|
131
|
+
for (const [type, info] of Object.entries(edgeTypes)) {
|
|
132
|
+
if (includeAll || info.count > 0) {
|
|
133
|
+
filteredEdgeTypes[type] = info;
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
// Sort for deterministic output
|
|
138
|
+
const sortedNodeTypes = this.sortObject(filteredNodeTypes);
|
|
139
|
+
const sortedEdgeTypes = this.sortObject(filteredEdgeTypes);
|
|
140
|
+
|
|
141
|
+
// Compute checksum from normalized content (based on filtered types)
|
|
142
|
+
const checksumContent = {
|
|
143
|
+
nodeTypes: Object.keys(sortedNodeTypes).sort(),
|
|
144
|
+
edgeTypes: Object.keys(sortedEdgeTypes).sort(),
|
|
145
|
+
};
|
|
146
|
+
|
|
147
|
+
const checksum = createHash('sha256')
|
|
148
|
+
.update(JSON.stringify(checksumContent))
|
|
149
|
+
.digest('hex');
|
|
150
|
+
|
|
151
|
+
return {
|
|
152
|
+
$schema: 'grafema-graph-v1',
|
|
153
|
+
extractedAt: new Date().toISOString(),
|
|
154
|
+
nodeTypes: sortedNodeTypes,
|
|
155
|
+
edgeTypes: sortedEdgeTypes,
|
|
156
|
+
statistics: {
|
|
157
|
+
totalNodes,
|
|
158
|
+
totalEdges,
|
|
159
|
+
nodeTypeCount: Object.keys(sortedNodeTypes).length,
|
|
160
|
+
edgeTypeCount: Object.keys(sortedEdgeTypes).length,
|
|
161
|
+
},
|
|
162
|
+
checksum: `sha256:${checksum}`,
|
|
163
|
+
};
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
/**
|
|
167
|
+
* Sort object keys alphabetically for deterministic output
|
|
168
|
+
*/
|
|
169
|
+
private sortObject<T>(obj: Record<string, T>): Record<string, T> {
|
|
170
|
+
const sorted: Record<string, T> = {};
|
|
171
|
+
const keys = Object.keys(obj).sort();
|
|
172
|
+
for (const key of keys) {
|
|
173
|
+
sorted[key] = obj[key];
|
|
174
|
+
}
|
|
175
|
+
return sorted;
|
|
176
|
+
}
|
|
177
|
+
}
|
|
@@ -0,0 +1,173 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* InterfaceSchemaExtractor - Extracts interface schemas from graph
|
|
3
|
+
*
|
|
4
|
+
* Usage:
|
|
5
|
+
* const extractor = new InterfaceSchemaExtractor(backend);
|
|
6
|
+
* const schema = await extractor.extract('ConfigSchema');
|
|
7
|
+
*
|
|
8
|
+
* When to use:
|
|
9
|
+
* - Export interface contracts for documentation
|
|
10
|
+
* - Track interface changes via checksum
|
|
11
|
+
* - Generate API documentation from graph
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
import { createHash } from 'crypto';
|
|
15
|
+
import type { RFDBServerBackend } from '../storage/backends/RFDBServerBackend.js';
|
|
16
|
+
|
|
17
|
+
// ============================================================================
|
|
18
|
+
// Types
|
|
19
|
+
// ============================================================================
|
|
20
|
+
|
|
21
|
+
export interface PropertySchema {
|
|
22
|
+
type: string;
|
|
23
|
+
required: boolean;
|
|
24
|
+
readonly: boolean;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
export interface InterfaceSchema {
|
|
28
|
+
$schema: 'grafema-interface-v1';
|
|
29
|
+
name: string;
|
|
30
|
+
source: {
|
|
31
|
+
file: string;
|
|
32
|
+
line: number;
|
|
33
|
+
column: number;
|
|
34
|
+
};
|
|
35
|
+
typeParameters?: string[];
|
|
36
|
+
properties: Record<string, PropertySchema>;
|
|
37
|
+
extends: string[];
|
|
38
|
+
checksum: string;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
export interface ExtractOptions {
|
|
42
|
+
/** Specific file path if multiple interfaces have same name */
|
|
43
|
+
file?: string;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
export interface InterfaceNodeRecord {
|
|
47
|
+
id: string;
|
|
48
|
+
type: 'INTERFACE';
|
|
49
|
+
name: string;
|
|
50
|
+
file: string;
|
|
51
|
+
line: number;
|
|
52
|
+
column: number;
|
|
53
|
+
extends: string[];
|
|
54
|
+
properties: Array<{
|
|
55
|
+
name: string;
|
|
56
|
+
type?: string;
|
|
57
|
+
optional?: boolean;
|
|
58
|
+
readonly?: boolean;
|
|
59
|
+
}>;
|
|
60
|
+
typeParameters?: string[];
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
// ============================================================================
|
|
64
|
+
// Extractor
|
|
65
|
+
// ============================================================================
|
|
66
|
+
|
|
67
|
+
export class InterfaceSchemaExtractor {
|
|
68
|
+
constructor(private backend: RFDBServerBackend) {}
|
|
69
|
+
|
|
70
|
+
/**
|
|
71
|
+
* Extract schema for interface by name
|
|
72
|
+
*
|
|
73
|
+
* @param interfaceName - Name of the interface (e.g., 'ConfigSchema')
|
|
74
|
+
* @param options - Optional filters
|
|
75
|
+
* @returns InterfaceSchema or null if not found
|
|
76
|
+
* @throws Error if multiple interfaces match and no file specified
|
|
77
|
+
*/
|
|
78
|
+
async extract(interfaceName: string, options?: ExtractOptions): Promise<InterfaceSchema | null> {
|
|
79
|
+
const interfaces = await this.findInterfaces(interfaceName);
|
|
80
|
+
|
|
81
|
+
if (interfaces.length === 0) {
|
|
82
|
+
return null;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
// Filter by file if specified
|
|
86
|
+
let match: InterfaceNodeRecord;
|
|
87
|
+
if (options?.file) {
|
|
88
|
+
const fileFilter = options.file;
|
|
89
|
+
const filtered = interfaces.filter(i => i.file === fileFilter || i.file.endsWith(fileFilter));
|
|
90
|
+
if (filtered.length === 0) {
|
|
91
|
+
return null;
|
|
92
|
+
}
|
|
93
|
+
match = filtered[0];
|
|
94
|
+
} else if (interfaces.length > 1) {
|
|
95
|
+
const locations = interfaces.map(i => ` - ${i.file}:${i.line}`).join('\n');
|
|
96
|
+
throw new Error(
|
|
97
|
+
`Multiple interfaces named "${interfaceName}" found:\n${locations}\n` +
|
|
98
|
+
`Use --file option to specify which one.`
|
|
99
|
+
);
|
|
100
|
+
} else {
|
|
101
|
+
match = interfaces[0];
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
return this.buildSchema(match);
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
/**
|
|
108
|
+
* Find all interfaces with given name
|
|
109
|
+
*/
|
|
110
|
+
async findInterfaces(name: string): Promise<InterfaceNodeRecord[]> {
|
|
111
|
+
const result: InterfaceNodeRecord[] = [];
|
|
112
|
+
|
|
113
|
+
for await (const node of this.backend.queryNodes({ nodeType: 'INTERFACE' })) {
|
|
114
|
+
if (node.name === name) {
|
|
115
|
+
result.push(node as unknown as InterfaceNodeRecord);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
return result;
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
/**
|
|
123
|
+
* Build InterfaceSchema from node record
|
|
124
|
+
*/
|
|
125
|
+
private buildSchema(node: InterfaceNodeRecord): InterfaceSchema {
|
|
126
|
+
// Sort properties alphabetically for deterministic output
|
|
127
|
+
const sortedProperties = [...(node.properties || [])].sort((a, b) =>
|
|
128
|
+
a.name.localeCompare(b.name)
|
|
129
|
+
);
|
|
130
|
+
|
|
131
|
+
const properties: Record<string, PropertySchema> = {};
|
|
132
|
+
for (const prop of sortedProperties) {
|
|
133
|
+
properties[prop.name] = {
|
|
134
|
+
type: prop.type || 'unknown',
|
|
135
|
+
required: !prop.optional,
|
|
136
|
+
readonly: prop.readonly || false
|
|
137
|
+
};
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
// Compute checksum from normalized content
|
|
141
|
+
const checksumContent = {
|
|
142
|
+
name: node.name,
|
|
143
|
+
properties: sortedProperties.map(p => ({
|
|
144
|
+
name: p.name,
|
|
145
|
+
type: p.type,
|
|
146
|
+
optional: p.optional,
|
|
147
|
+
readonly: p.readonly
|
|
148
|
+
})),
|
|
149
|
+
extends: [...(node.extends || [])].sort(),
|
|
150
|
+
typeParameters: node.typeParameters
|
|
151
|
+
};
|
|
152
|
+
|
|
153
|
+
const checksum = createHash('sha256')
|
|
154
|
+
.update(JSON.stringify(checksumContent))
|
|
155
|
+
.digest('hex');
|
|
156
|
+
|
|
157
|
+
return {
|
|
158
|
+
$schema: 'grafema-interface-v1',
|
|
159
|
+
name: node.name,
|
|
160
|
+
source: {
|
|
161
|
+
file: node.file,
|
|
162
|
+
line: node.line,
|
|
163
|
+
column: node.column
|
|
164
|
+
},
|
|
165
|
+
...(node.typeParameters && node.typeParameters.length > 0 && {
|
|
166
|
+
typeParameters: node.typeParameters
|
|
167
|
+
}),
|
|
168
|
+
properties,
|
|
169
|
+
extends: node.extends || [],
|
|
170
|
+
checksum: `sha256:${checksum}`
|
|
171
|
+
};
|
|
172
|
+
}
|
|
173
|
+
}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export { InterfaceSchemaExtractor } from './InterfaceSchemaExtractor.js';
|
|
2
|
+
export type { InterfaceSchema, PropertySchema, ExtractOptions } from './InterfaceSchemaExtractor.js';
|
|
3
|
+
|
|
4
|
+
export { GraphSchemaExtractor } from './GraphSchemaExtractor.js';
|
|
5
|
+
export type { GraphSchema, NodeTypeSchema, EdgeTypeSchema, GraphExtractOptions } from './GraphSchemaExtractor.js';
|
|
@@ -23,10 +23,12 @@ import { existsSync, unlinkSync } from 'fs';
|
|
|
23
23
|
import { spawn, type ChildProcess } from 'child_process';
|
|
24
24
|
import { join, dirname } from 'path';
|
|
25
25
|
import { fileURLToPath } from 'url';
|
|
26
|
+
import { createRequire } from 'module';
|
|
26
27
|
import { setTimeout as sleep } from 'timers/promises';
|
|
27
28
|
|
|
28
29
|
import type { WireNode, WireEdge } from '@grafema/types';
|
|
29
30
|
import type { NodeType, EdgeType } from '@grafema/types';
|
|
31
|
+
import type { BaseNodeRecord, EdgeRecord } from '@grafema/types';
|
|
30
32
|
import type { AttrQuery, GraphStats, GraphExport } from '../../core/GraphBackend.js';
|
|
31
33
|
|
|
32
34
|
const __filename = fileURLToPath(import.meta.url);
|
|
@@ -40,30 +42,6 @@ export interface RFDBServerBackendOptions {
|
|
|
40
42
|
dbPath?: string;
|
|
41
43
|
}
|
|
42
44
|
|
|
43
|
-
/**
|
|
44
|
-
* Node as returned from the backend
|
|
45
|
-
*/
|
|
46
|
-
export interface BackendNode {
|
|
47
|
-
id: string;
|
|
48
|
-
type: string;
|
|
49
|
-
nodeType: string;
|
|
50
|
-
name: string;
|
|
51
|
-
file: string;
|
|
52
|
-
exported: boolean;
|
|
53
|
-
[key: string]: unknown;
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
/**
|
|
57
|
-
* Edge as returned from the backend
|
|
58
|
-
*/
|
|
59
|
-
export interface BackendEdge {
|
|
60
|
-
src: string;
|
|
61
|
-
dst: string;
|
|
62
|
-
type: string;
|
|
63
|
-
edgeType: string;
|
|
64
|
-
[key: string]: unknown;
|
|
65
|
-
}
|
|
66
|
-
|
|
67
45
|
/**
|
|
68
46
|
* Input node format (flexible)
|
|
69
47
|
*/
|
|
@@ -176,13 +154,29 @@ export class RFDBServerBackend {
|
|
|
176
154
|
|
|
177
155
|
/**
|
|
178
156
|
* Find RFDB server binary in order of preference:
|
|
179
|
-
* 1.
|
|
180
|
-
* 2.
|
|
181
|
-
* 3.
|
|
157
|
+
* 1. packages/rfdb-server/target/release (monorepo development - prioritized for dev)
|
|
158
|
+
* 2. packages/rfdb-server/target/debug
|
|
159
|
+
* 3. @grafema/rfdb npm package (fallback for production)
|
|
182
160
|
*/
|
|
183
161
|
private _findServerBinary(): string | null {
|
|
184
|
-
// 1. Check
|
|
162
|
+
// 1. Check packages/rfdb-server in monorepo (prioritized for development)
|
|
163
|
+
const projectRoot = join(__dirname, '../../../../..');
|
|
164
|
+
const releaseBinary = join(projectRoot, 'packages/rfdb-server/target/release/rfdb-server');
|
|
165
|
+
if (existsSync(releaseBinary)) {
|
|
166
|
+
console.log(`[RFDBServerBackend] Found release binary: ${releaseBinary}`);
|
|
167
|
+
return releaseBinary;
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
// 2. Check debug build
|
|
171
|
+
const debugBinary = join(projectRoot, 'packages/rfdb-server/target/debug/rfdb-server');
|
|
172
|
+
if (existsSync(debugBinary)) {
|
|
173
|
+
console.log(`[RFDBServerBackend] Found debug binary: ${debugBinary}`);
|
|
174
|
+
return debugBinary;
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
// 3. Check @grafema/rfdb npm package (fallback)
|
|
185
178
|
try {
|
|
179
|
+
const require = createRequire(import.meta.url);
|
|
186
180
|
const rfdbPkg = require.resolve('@grafema/rfdb');
|
|
187
181
|
const rfdbDir = dirname(rfdbPkg);
|
|
188
182
|
const platform = process.platform;
|
|
@@ -206,21 +200,6 @@ export class RFDBServerBackend {
|
|
|
206
200
|
// @grafema/rfdb not installed
|
|
207
201
|
}
|
|
208
202
|
|
|
209
|
-
// 2. Check rust-engine in monorepo
|
|
210
|
-
const projectRoot = join(__dirname, '../../../../..');
|
|
211
|
-
const releaseBinary = join(projectRoot, 'rust-engine/target/release/rfdb-server');
|
|
212
|
-
if (existsSync(releaseBinary)) {
|
|
213
|
-
console.log(`[RFDBServerBackend] Found release binary: ${releaseBinary}`);
|
|
214
|
-
return releaseBinary;
|
|
215
|
-
}
|
|
216
|
-
|
|
217
|
-
// 3. Check debug build
|
|
218
|
-
const debugBinary = join(projectRoot, 'rust-engine/target/debug/rfdb-server');
|
|
219
|
-
if (existsSync(debugBinary)) {
|
|
220
|
-
console.log(`[RFDBServerBackend] Found debug binary: ${debugBinary}`);
|
|
221
|
-
return debugBinary;
|
|
222
|
-
}
|
|
223
|
-
|
|
224
203
|
return null;
|
|
225
204
|
}
|
|
226
205
|
|
|
@@ -283,20 +262,26 @@ export class RFDBServerBackend {
|
|
|
283
262
|
}
|
|
284
263
|
|
|
285
264
|
/**
|
|
286
|
-
* Close connection
|
|
265
|
+
* Close client connection. Server continues running to serve other clients.
|
|
287
266
|
*/
|
|
288
267
|
async close(): Promise<void> {
|
|
268
|
+
// Request server flush before disconnecting
|
|
289
269
|
if (this.client) {
|
|
270
|
+
try {
|
|
271
|
+
await this.client.flush();
|
|
272
|
+
} catch {
|
|
273
|
+
// Ignore flush errors on close - best effort
|
|
274
|
+
}
|
|
290
275
|
await this.client.close();
|
|
291
276
|
this.client = null;
|
|
292
277
|
}
|
|
293
278
|
this.connected = false;
|
|
294
279
|
|
|
295
|
-
//
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
280
|
+
// NOTE: We intentionally do NOT kill the server process.
|
|
281
|
+
// The server continues running to serve other clients (MCP, other CLI invocations).
|
|
282
|
+
// This is by design for multi-client architecture.
|
|
283
|
+
// Server lifecycle is managed separately (system process, or manual grafema server stop).
|
|
284
|
+
this.serverProcess = null;
|
|
300
285
|
}
|
|
301
286
|
|
|
302
287
|
/**
|
|
@@ -371,14 +356,22 @@ export class RFDBServerBackend {
|
|
|
371
356
|
}
|
|
372
357
|
|
|
373
358
|
const wireEdges: WireEdge[] = edges.map(e => {
|
|
374
|
-
const { src, dst, type, edgeType, edge_type, etype, ...rest } = e;
|
|
359
|
+
const { src, dst, type, edgeType, edge_type, etype, metadata, ...rest } = e;
|
|
360
|
+
|
|
361
|
+
// Flatten metadata: spread both edge-level properties and nested metadata
|
|
362
|
+
const flatMetadata = {
|
|
363
|
+
_origSrc: String(src),
|
|
364
|
+
_origDst: String(dst),
|
|
365
|
+
...rest,
|
|
366
|
+
...(typeof metadata === 'object' && metadata !== null ? metadata : {})
|
|
367
|
+
};
|
|
375
368
|
|
|
376
369
|
return {
|
|
377
370
|
src: String(src),
|
|
378
371
|
dst: String(dst),
|
|
379
372
|
edgeType: (edgeType || edge_type || etype || type || 'UNKNOWN') as EdgeType,
|
|
380
|
-
// Store
|
|
381
|
-
metadata: JSON.stringify(
|
|
373
|
+
// Store flattened metadata for retrieval
|
|
374
|
+
metadata: JSON.stringify(flatMetadata),
|
|
382
375
|
};
|
|
383
376
|
});
|
|
384
377
|
|
|
@@ -388,7 +381,7 @@ export class RFDBServerBackend {
|
|
|
388
381
|
/**
|
|
389
382
|
* Get a node by ID
|
|
390
383
|
*/
|
|
391
|
-
async getNode(id: string): Promise<
|
|
384
|
+
async getNode(id: string): Promise<BaseNodeRecord | null> {
|
|
392
385
|
if (!this.client) throw new Error('Not connected');
|
|
393
386
|
const node = await this.client.getNode(String(id));
|
|
394
387
|
if (!node) return null;
|
|
@@ -423,7 +416,7 @@ export class RFDBServerBackend {
|
|
|
423
416
|
/**
|
|
424
417
|
* Parse a node from wire format to JS format
|
|
425
418
|
*/
|
|
426
|
-
private _parseNode(wireNode: WireNode):
|
|
419
|
+
private _parseNode(wireNode: WireNode): BaseNodeRecord {
|
|
427
420
|
const metadata: Record<string, unknown> = wireNode.metadata ? JSON.parse(wireNode.metadata) : {};
|
|
428
421
|
|
|
429
422
|
// Parse nested JSON strings
|
|
@@ -439,21 +432,48 @@ export class RFDBServerBackend {
|
|
|
439
432
|
|
|
440
433
|
const humanId = (metadata.originalId as string) || wireNode.id;
|
|
441
434
|
|
|
435
|
+
// Exclude standard fields from metadata to prevent overwriting wireNode values
|
|
436
|
+
// REG-325: Metadata spread was overwriting name with LITERAL node data
|
|
437
|
+
const {
|
|
438
|
+
id: _id,
|
|
439
|
+
type: _type,
|
|
440
|
+
name: _name,
|
|
441
|
+
file: _file,
|
|
442
|
+
exported: _exported,
|
|
443
|
+
nodeType: _nodeType,
|
|
444
|
+
originalId: _originalId, // Already extracted above
|
|
445
|
+
...safeMetadata
|
|
446
|
+
} = metadata;
|
|
447
|
+
|
|
442
448
|
return {
|
|
443
449
|
id: humanId,
|
|
444
|
-
nodeType: wireNode.nodeType,
|
|
445
450
|
type: wireNode.nodeType,
|
|
446
451
|
name: wireNode.name,
|
|
447
452
|
file: wireNode.file,
|
|
448
453
|
exported: wireNode.exported,
|
|
449
|
-
...
|
|
454
|
+
...safeMetadata,
|
|
455
|
+
};
|
|
456
|
+
}
|
|
457
|
+
|
|
458
|
+
/**
|
|
459
|
+
* Parse an edge from wire format to EdgeRecord
|
|
460
|
+
*/
|
|
461
|
+
private _parseEdge(wireEdge: WireEdge): EdgeRecord {
|
|
462
|
+
const meta: Record<string, unknown> = wireEdge.metadata ? JSON.parse(wireEdge.metadata) : {};
|
|
463
|
+
// Use original string IDs if stored, otherwise use wire IDs
|
|
464
|
+
const { _origSrc, _origDst, ...rest } = meta;
|
|
465
|
+
return {
|
|
466
|
+
src: (_origSrc as string) || wireEdge.src,
|
|
467
|
+
dst: (_origDst as string) || wireEdge.dst,
|
|
468
|
+
type: wireEdge.edgeType,
|
|
469
|
+
metadata: Object.keys(rest).length > 0 ? rest : undefined,
|
|
450
470
|
};
|
|
451
471
|
}
|
|
452
472
|
|
|
453
473
|
/**
|
|
454
474
|
* Async generator for querying nodes
|
|
455
475
|
*/
|
|
456
|
-
async *queryNodes(query: NodeQuery): AsyncGenerator<
|
|
476
|
+
async *queryNodes(query: NodeQuery): AsyncGenerator<BaseNodeRecord, void, unknown> {
|
|
457
477
|
if (!this.client) throw new Error('Not connected');
|
|
458
478
|
|
|
459
479
|
// Build query for server
|
|
@@ -482,8 +502,8 @@ export class RFDBServerBackend {
|
|
|
482
502
|
/**
|
|
483
503
|
* Get ALL nodes matching query (collects from queryNodes into array)
|
|
484
504
|
*/
|
|
485
|
-
async getAllNodes(query: NodeQuery = {}): Promise<
|
|
486
|
-
const nodes:
|
|
505
|
+
async getAllNodes(query: NodeQuery = {}): Promise<BaseNodeRecord[]> {
|
|
506
|
+
const nodes: BaseNodeRecord[] = [];
|
|
487
507
|
for await (const node of this.queryNodes(query)) {
|
|
488
508
|
nodes.push(node);
|
|
489
509
|
}
|
|
@@ -505,66 +525,35 @@ export class RFDBServerBackend {
|
|
|
505
525
|
/**
|
|
506
526
|
* Get all edges
|
|
507
527
|
*/
|
|
508
|
-
async getAllEdges(): Promise<
|
|
528
|
+
async getAllEdges(): Promise<EdgeRecord[]> {
|
|
509
529
|
return this.getAllEdgesAsync();
|
|
510
530
|
}
|
|
511
531
|
|
|
512
532
|
/**
|
|
513
533
|
* Get all edges (async version)
|
|
514
534
|
*/
|
|
515
|
-
async getAllEdgesAsync(): Promise<
|
|
535
|
+
async getAllEdgesAsync(): Promise<EdgeRecord[]> {
|
|
516
536
|
if (!this.client) throw new Error('Not connected');
|
|
517
537
|
const edges = await this.client.getAllEdges();
|
|
518
|
-
return edges.map(e =>
|
|
519
|
-
const meta = JSON.parse(e.metadata || '{}');
|
|
520
|
-
// Use original string IDs if stored, otherwise use numeric IDs
|
|
521
|
-
const { _origSrc, _origDst, ...rest } = meta;
|
|
522
|
-
return {
|
|
523
|
-
src: _origSrc || e.src,
|
|
524
|
-
dst: _origDst || e.dst,
|
|
525
|
-
type: e.edgeType,
|
|
526
|
-
edgeType: e.edgeType,
|
|
527
|
-
...rest,
|
|
528
|
-
};
|
|
529
|
-
});
|
|
538
|
+
return edges.map(e => this._parseEdge(e));
|
|
530
539
|
}
|
|
531
540
|
|
|
532
541
|
/**
|
|
533
542
|
* Get outgoing edges from a node
|
|
534
543
|
*/
|
|
535
|
-
async getOutgoingEdges(nodeId: string, edgeTypes: EdgeType[] | null = null): Promise<
|
|
544
|
+
async getOutgoingEdges(nodeId: string, edgeTypes: EdgeType[] | null = null): Promise<EdgeRecord[]> {
|
|
536
545
|
if (!this.client) throw new Error('Not connected');
|
|
537
546
|
const edges = await this.client.getOutgoingEdges(nodeId, edgeTypes || undefined);
|
|
538
|
-
return edges.map(e =>
|
|
539
|
-
const meta = JSON.parse(e.metadata || '{}');
|
|
540
|
-
const { _origSrc, _origDst, ...rest } = meta;
|
|
541
|
-
return {
|
|
542
|
-
src: _origSrc || e.src,
|
|
543
|
-
dst: _origDst || e.dst,
|
|
544
|
-
type: e.edgeType,
|
|
545
|
-
edgeType: e.edgeType,
|
|
546
|
-
...rest,
|
|
547
|
-
};
|
|
548
|
-
});
|
|
547
|
+
return edges.map(e => this._parseEdge(e));
|
|
549
548
|
}
|
|
550
549
|
|
|
551
550
|
/**
|
|
552
551
|
* Get incoming edges to a node
|
|
553
552
|
*/
|
|
554
|
-
async getIncomingEdges(nodeId: string, edgeTypes: EdgeType[] | null = null): Promise<
|
|
553
|
+
async getIncomingEdges(nodeId: string, edgeTypes: EdgeType[] | null = null): Promise<EdgeRecord[]> {
|
|
555
554
|
if (!this.client) throw new Error('Not connected');
|
|
556
555
|
const edges = await this.client.getIncomingEdges(nodeId, edgeTypes || undefined);
|
|
557
|
-
return edges.map(e =>
|
|
558
|
-
const meta = JSON.parse(e.metadata || '{}');
|
|
559
|
-
const { _origSrc, _origDst, ...rest } = meta;
|
|
560
|
-
return {
|
|
561
|
-
src: _origSrc || e.src,
|
|
562
|
-
dst: _origDst || e.dst,
|
|
563
|
-
type: e.edgeType,
|
|
564
|
-
edgeType: e.edgeType,
|
|
565
|
-
...rest,
|
|
566
|
-
};
|
|
567
|
-
});
|
|
556
|
+
return edges.map(e => this._parseEdge(e));
|
|
568
557
|
}
|
|
569
558
|
|
|
570
559
|
// ===========================================================================
|
|
@@ -587,6 +576,19 @@ export class RFDBServerBackend {
|
|
|
587
576
|
return this.client.dfs(startIds, maxDepth, edgeTypes);
|
|
588
577
|
}
|
|
589
578
|
|
|
579
|
+
/**
|
|
580
|
+
* Reachability query - find all nodes reachable from start nodes
|
|
581
|
+
*/
|
|
582
|
+
async reachability(
|
|
583
|
+
startIds: string[],
|
|
584
|
+
maxDepth: number,
|
|
585
|
+
edgeTypes: EdgeType[] = [],
|
|
586
|
+
backward: boolean = false
|
|
587
|
+
): Promise<string[]> {
|
|
588
|
+
if (!this.client) throw new Error('Not connected');
|
|
589
|
+
return this.client.reachability(startIds, maxDepth, edgeTypes, backward);
|
|
590
|
+
}
|
|
591
|
+
|
|
590
592
|
// ===========================================================================
|
|
591
593
|
// Statistics
|
|
592
594
|
// ===========================================================================
|
|
@@ -713,7 +715,7 @@ export class RFDBServerBackend {
|
|
|
713
715
|
/**
|
|
714
716
|
* Find nodes by predicate (for compatibility)
|
|
715
717
|
*/
|
|
716
|
-
async findNodes(predicate: (node:
|
|
718
|
+
async findNodes(predicate: (node: BaseNodeRecord) => boolean): Promise<BaseNodeRecord[]> {
|
|
717
719
|
const allNodes = await this.getAllNodes();
|
|
718
720
|
return allNodes.filter(predicate);
|
|
719
721
|
}
|
|
@@ -45,6 +45,7 @@ const KNOWN_EDGE_TYPES = new Set<string>([
|
|
|
45
45
|
'INTERACTS_WITH', 'CALLS_API', 'LISTENS_TO', 'JOINS_ROOM', 'EMITS_EVENT',
|
|
46
46
|
'RETURNS', 'RECEIVES_ARGUMENT', 'READS_FROM', 'THROWS', 'REGISTERS_VIEW',
|
|
47
47
|
'GOVERNS', 'VIOLATES', 'HAS_PARAMETER', 'DERIVES_FROM',
|
|
48
|
+
'RESOLVES_TO', // Promise resolve() data flow
|
|
48
49
|
]);
|
|
49
50
|
|
|
50
51
|
// Store initial edge types for reset
|