@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,92 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DecoratorNode - contract for DECORATOR node
|
|
3
|
+
*
|
|
4
|
+
* Represents TypeScript/JavaScript decorators applied to
|
|
5
|
+
* classes, methods, properties, or parameters.
|
|
6
|
+
*
|
|
7
|
+
* ID format: {file}:DECORATOR:{name}:{line}:{column}
|
|
8
|
+
* Example: /src/services/UserService.ts:DECORATOR:Injectable:5:0
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
import type { BaseNodeRecord } from '@grafema/types';
|
|
12
|
+
|
|
13
|
+
type DecoratorTargetType = 'CLASS' | 'METHOD' | 'PROPERTY' | 'PARAMETER';
|
|
14
|
+
|
|
15
|
+
interface DecoratorNodeRecord extends BaseNodeRecord {
|
|
16
|
+
type: 'DECORATOR';
|
|
17
|
+
column: number;
|
|
18
|
+
arguments: unknown[];
|
|
19
|
+
targetId: string;
|
|
20
|
+
targetType: DecoratorTargetType;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
interface DecoratorNodeOptions {
|
|
24
|
+
arguments?: unknown[];
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
export class DecoratorNode {
|
|
28
|
+
static readonly TYPE = 'DECORATOR' as const;
|
|
29
|
+
|
|
30
|
+
static readonly REQUIRED = ['name', 'file', 'line', 'column', 'targetId', 'targetType'] as const;
|
|
31
|
+
static readonly OPTIONAL = ['arguments'] as const;
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* Create DECORATOR node
|
|
35
|
+
*
|
|
36
|
+
* @param name - Decorator name
|
|
37
|
+
* @param file - File path
|
|
38
|
+
* @param line - Line number
|
|
39
|
+
* @param column - Column position
|
|
40
|
+
* @param targetId - ID of decorated element
|
|
41
|
+
* @param targetType - Type of decorated element
|
|
42
|
+
* @param options - Optional decorator properties
|
|
43
|
+
* @returns DecoratorNodeRecord
|
|
44
|
+
*/
|
|
45
|
+
static create(
|
|
46
|
+
name: string,
|
|
47
|
+
file: string,
|
|
48
|
+
line: number,
|
|
49
|
+
column: number,
|
|
50
|
+
targetId: string,
|
|
51
|
+
targetType: DecoratorTargetType,
|
|
52
|
+
options: DecoratorNodeOptions = {}
|
|
53
|
+
): DecoratorNodeRecord {
|
|
54
|
+
if (!name) throw new Error('DecoratorNode.create: name is required');
|
|
55
|
+
if (!file) throw new Error('DecoratorNode.create: file is required');
|
|
56
|
+
if (!line) throw new Error('DecoratorNode.create: line is required');
|
|
57
|
+
if (column === undefined) throw new Error('DecoratorNode.create: column is required');
|
|
58
|
+
if (!targetId) throw new Error('DecoratorNode.create: targetId is required');
|
|
59
|
+
if (!targetType) throw new Error('DecoratorNode.create: targetType is required');
|
|
60
|
+
|
|
61
|
+
return {
|
|
62
|
+
id: `${file}:DECORATOR:${name}:${line}:${column}`,
|
|
63
|
+
type: this.TYPE,
|
|
64
|
+
name,
|
|
65
|
+
file,
|
|
66
|
+
line,
|
|
67
|
+
column,
|
|
68
|
+
arguments: options.arguments || [],
|
|
69
|
+
targetId,
|
|
70
|
+
targetType
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
static validate(node: DecoratorNodeRecord): string[] {
|
|
75
|
+
const errors: string[] = [];
|
|
76
|
+
|
|
77
|
+
if (node.type !== this.TYPE) {
|
|
78
|
+
errors.push(`Expected type ${this.TYPE}, got ${node.type}`);
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
const nodeRecord = node as unknown as Record<string, unknown>;
|
|
82
|
+
for (const field of this.REQUIRED) {
|
|
83
|
+
if (!nodeRecord[field]) {
|
|
84
|
+
errors.push(`Missing required field: ${field}`);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
return errors;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
export type { DecoratorNodeRecord, DecoratorTargetType };
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* EnumNode - contract for ENUM node
|
|
3
|
+
*
|
|
4
|
+
* Represents TypeScript enum declarations.
|
|
5
|
+
*
|
|
6
|
+
* ID format: {file}:ENUM:{name}:{line}
|
|
7
|
+
* Example: /src/types.ts:ENUM:Status:20
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
import type { BaseNodeRecord } from '@grafema/types';
|
|
11
|
+
|
|
12
|
+
interface EnumMemberRecord {
|
|
13
|
+
name: string;
|
|
14
|
+
value?: string | number;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
interface EnumNodeRecord extends BaseNodeRecord {
|
|
18
|
+
type: 'ENUM';
|
|
19
|
+
column: number;
|
|
20
|
+
isConst: boolean;
|
|
21
|
+
members: EnumMemberRecord[];
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
interface EnumNodeOptions {
|
|
25
|
+
isConst?: boolean;
|
|
26
|
+
members?: EnumMemberRecord[];
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
export class EnumNode {
|
|
30
|
+
static readonly TYPE = 'ENUM' as const;
|
|
31
|
+
|
|
32
|
+
static readonly REQUIRED = ['name', 'file', 'line', 'column'] as const;
|
|
33
|
+
static readonly OPTIONAL = ['isConst', 'members'] as const;
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* Create ENUM node
|
|
37
|
+
*
|
|
38
|
+
* @param name - Enum name
|
|
39
|
+
* @param file - File path
|
|
40
|
+
* @param line - Line number
|
|
41
|
+
* @param column - Column position
|
|
42
|
+
* @param options - Optional enum properties
|
|
43
|
+
* @returns EnumNodeRecord
|
|
44
|
+
*/
|
|
45
|
+
static create(
|
|
46
|
+
name: string,
|
|
47
|
+
file: string,
|
|
48
|
+
line: number,
|
|
49
|
+
column: number,
|
|
50
|
+
options: EnumNodeOptions = {}
|
|
51
|
+
): EnumNodeRecord {
|
|
52
|
+
if (!name) throw new Error('EnumNode.create: name is required');
|
|
53
|
+
if (!file) throw new Error('EnumNode.create: file is required');
|
|
54
|
+
if (!line) throw new Error('EnumNode.create: line is required');
|
|
55
|
+
if (column === undefined) throw new Error('EnumNode.create: column is required');
|
|
56
|
+
|
|
57
|
+
return {
|
|
58
|
+
id: `${file}:ENUM:${name}:${line}`,
|
|
59
|
+
type: this.TYPE,
|
|
60
|
+
name,
|
|
61
|
+
file,
|
|
62
|
+
line,
|
|
63
|
+
column,
|
|
64
|
+
isConst: options.isConst || false,
|
|
65
|
+
members: options.members || []
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
static validate(node: EnumNodeRecord): string[] {
|
|
70
|
+
const errors: string[] = [];
|
|
71
|
+
|
|
72
|
+
if (node.type !== this.TYPE) {
|
|
73
|
+
errors.push(`Expected type ${this.TYPE}, got ${node.type}`);
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
const nodeRecord = node as unknown as Record<string, unknown>;
|
|
77
|
+
for (const field of this.REQUIRED) {
|
|
78
|
+
if (!nodeRecord[field]) {
|
|
79
|
+
errors.push(`Missing required field: ${field}`);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
return errors;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
export type { EnumNodeRecord, EnumMemberRecord };
|
|
@@ -6,13 +6,13 @@ import type { BaseNodeRecord } from '@grafema/types';
|
|
|
6
6
|
|
|
7
7
|
interface EventListenerNodeRecord extends BaseNodeRecord {
|
|
8
8
|
type: 'EVENT_LISTENER';
|
|
9
|
+
column: number;
|
|
9
10
|
object?: string;
|
|
10
11
|
parentScopeId?: string;
|
|
11
12
|
callbackArg?: string;
|
|
12
13
|
}
|
|
13
14
|
|
|
14
15
|
interface EventListenerNodeOptions {
|
|
15
|
-
column?: number;
|
|
16
16
|
parentScopeId?: string;
|
|
17
17
|
callbackArg?: string;
|
|
18
18
|
counter?: number;
|
|
@@ -21,22 +21,24 @@ interface EventListenerNodeOptions {
|
|
|
21
21
|
export class EventListenerNode {
|
|
22
22
|
static readonly TYPE = 'EVENT_LISTENER' as const;
|
|
23
23
|
|
|
24
|
-
static readonly REQUIRED = ['name', 'file', 'line'] as const;
|
|
25
|
-
static readonly OPTIONAL = ['object', '
|
|
24
|
+
static readonly REQUIRED = ['name', 'file', 'line', 'column'] as const;
|
|
25
|
+
static readonly OPTIONAL = ['object', 'parentScopeId', 'callbackArg'] as const;
|
|
26
26
|
|
|
27
27
|
static create(
|
|
28
28
|
eventName: string,
|
|
29
29
|
objectName: string | undefined,
|
|
30
30
|
file: string,
|
|
31
31
|
line: number,
|
|
32
|
+
column: number,
|
|
32
33
|
options: EventListenerNodeOptions = {}
|
|
33
34
|
): EventListenerNodeRecord {
|
|
34
35
|
if (!eventName) throw new Error('EventListenerNode.create: eventName is required');
|
|
35
36
|
if (!file) throw new Error('EventListenerNode.create: file is required');
|
|
36
37
|
if (line === undefined) throw new Error('EventListenerNode.create: line is required');
|
|
38
|
+
if (column === undefined) throw new Error('EventListenerNode.create: column is required');
|
|
37
39
|
|
|
38
40
|
const counter = options.counter !== undefined ? `:${options.counter}` : '';
|
|
39
|
-
const id = `${file}:EVENT_LISTENER:${eventName}:${line}:${
|
|
41
|
+
const id = `${file}:EVENT_LISTENER:${eventName}:${line}:${column}${counter}`;
|
|
40
42
|
|
|
41
43
|
return {
|
|
42
44
|
id,
|
|
@@ -45,6 +47,7 @@ export class EventListenerNode {
|
|
|
45
47
|
object: objectName,
|
|
46
48
|
file,
|
|
47
49
|
line,
|
|
50
|
+
column,
|
|
48
51
|
parentScopeId: options.parentScopeId,
|
|
49
52
|
callbackArg: options.callbackArg
|
|
50
53
|
};
|
|
@@ -1,30 +1,55 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* ExportNode - contract for EXPORT node
|
|
3
|
+
*
|
|
4
|
+
* Supports two creation modes:
|
|
5
|
+
* 1. createWithContext() - NEW: Uses ScopeContext + Location for semantic IDs
|
|
6
|
+
* 2. create() - LEGACY: Uses line-based IDs for backward compatibility
|
|
7
|
+
*
|
|
8
|
+
* Semantic ID format: {file}->global->EXPORT->{exportedName}
|
|
9
|
+
* Example: src/utils.js->global->EXPORT->formatDate
|
|
3
10
|
*/
|
|
4
11
|
|
|
5
12
|
import type { BaseNodeRecord } from '@grafema/types';
|
|
13
|
+
import { computeSemanticId, type ScopeContext, type Location } from '../SemanticId.js';
|
|
6
14
|
|
|
7
15
|
type ExportKind = 'value' | 'type';
|
|
8
16
|
|
|
17
|
+
type ExportType = 'default' | 'named' | 'all';
|
|
18
|
+
|
|
9
19
|
interface ExportNodeRecord extends BaseNodeRecord {
|
|
10
20
|
type: 'EXPORT';
|
|
11
21
|
column: number;
|
|
12
22
|
exportKind: ExportKind;
|
|
13
23
|
local: string;
|
|
14
24
|
default: boolean;
|
|
25
|
+
source?: string;
|
|
26
|
+
exportType?: ExportType;
|
|
15
27
|
}
|
|
16
28
|
|
|
17
29
|
interface ExportNodeOptions {
|
|
18
30
|
exportKind?: ExportKind;
|
|
19
31
|
local?: string;
|
|
20
32
|
default?: boolean;
|
|
33
|
+
source?: string;
|
|
34
|
+
exportType?: ExportType;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* Options for createWithContext
|
|
39
|
+
*/
|
|
40
|
+
interface ExportContextOptions {
|
|
41
|
+
exportKind?: ExportKind;
|
|
42
|
+
local?: string;
|
|
43
|
+
default?: boolean;
|
|
44
|
+
source?: string;
|
|
45
|
+
exportType?: ExportType;
|
|
21
46
|
}
|
|
22
47
|
|
|
23
48
|
export class ExportNode {
|
|
24
49
|
static readonly TYPE = 'EXPORT' as const;
|
|
25
50
|
|
|
26
|
-
static readonly REQUIRED = ['name', 'file', 'line'] as const;
|
|
27
|
-
static readonly OPTIONAL = ['
|
|
51
|
+
static readonly REQUIRED = ['name', 'file', 'line', 'column'] as const;
|
|
52
|
+
static readonly OPTIONAL = ['exportKind', 'local', 'default', 'source', 'exportType'] as const;
|
|
28
53
|
|
|
29
54
|
static create(
|
|
30
55
|
name: string,
|
|
@@ -36,6 +61,7 @@ export class ExportNode {
|
|
|
36
61
|
if (!name) throw new Error('ExportNode.create: name is required');
|
|
37
62
|
if (!file) throw new Error('ExportNode.create: file is required');
|
|
38
63
|
if (!line) throw new Error('ExportNode.create: line is required');
|
|
64
|
+
if (column === undefined) throw new Error('ExportNode.create: column is required');
|
|
39
65
|
|
|
40
66
|
return {
|
|
41
67
|
id: `${file}:EXPORT:${name}:${line}`,
|
|
@@ -43,10 +69,54 @@ export class ExportNode {
|
|
|
43
69
|
name,
|
|
44
70
|
file,
|
|
45
71
|
line,
|
|
46
|
-
column
|
|
72
|
+
column,
|
|
73
|
+
exportKind: options.exportKind || 'value',
|
|
74
|
+
local: options.local || name,
|
|
75
|
+
default: options.default || false,
|
|
76
|
+
...(options.source !== undefined && { source: options.source }),
|
|
77
|
+
...(options.exportType !== undefined && { exportType: options.exportType })
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
/**
|
|
82
|
+
* Create EXPORT node with semantic ID (NEW API)
|
|
83
|
+
*
|
|
84
|
+
* Uses ScopeContext from ScopeTracker for stable identifiers.
|
|
85
|
+
* Export names are unique within module, so no discriminator needed.
|
|
86
|
+
*
|
|
87
|
+
* @param name - Exported name (as visible to importers)
|
|
88
|
+
* @param context - Scope context from ScopeTracker.getContext()
|
|
89
|
+
* @param location - Source location { line, column }
|
|
90
|
+
* @param options - Optional export properties
|
|
91
|
+
* @returns ExportNodeRecord with semantic ID
|
|
92
|
+
*/
|
|
93
|
+
static createWithContext(
|
|
94
|
+
name: string,
|
|
95
|
+
context: ScopeContext,
|
|
96
|
+
location: Partial<Location>,
|
|
97
|
+
options: ExportContextOptions = {}
|
|
98
|
+
): ExportNodeRecord {
|
|
99
|
+
// Validate required fields
|
|
100
|
+
if (!name) throw new Error('ExportNode.createWithContext: name is required');
|
|
101
|
+
if (!context.file) throw new Error('ExportNode.createWithContext: file is required');
|
|
102
|
+
if (location.line === undefined) throw new Error('ExportNode.createWithContext: line is required');
|
|
103
|
+
if (location.column === undefined) throw new Error('ExportNode.createWithContext: column is required');
|
|
104
|
+
|
|
105
|
+
// Compute semantic ID
|
|
106
|
+
const id = computeSemanticId(this.TYPE, name, context);
|
|
107
|
+
|
|
108
|
+
return {
|
|
109
|
+
id,
|
|
110
|
+
type: this.TYPE,
|
|
111
|
+
name,
|
|
112
|
+
file: context.file,
|
|
113
|
+
line: location.line,
|
|
114
|
+
column: location.column,
|
|
47
115
|
exportKind: options.exportKind || 'value',
|
|
48
116
|
local: options.local || name,
|
|
49
|
-
default: options.default || false
|
|
117
|
+
default: options.default || false,
|
|
118
|
+
...(options.source !== undefined && { source: options.source }),
|
|
119
|
+
...(options.exportType !== undefined && { exportType: options.exportType })
|
|
50
120
|
};
|
|
51
121
|
}
|
|
52
122
|
|
|
@@ -0,0 +1,232 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ExpressionNode - contract for EXPRESSION node
|
|
3
|
+
*
|
|
4
|
+
* Represents complex expressions for data flow tracking
|
|
5
|
+
* (MemberExpression, BinaryExpression, LogicalExpression, etc.)
|
|
6
|
+
*
|
|
7
|
+
* ID format: {file}:EXPRESSION:{expressionType}:{line}:{column}
|
|
8
|
+
* Example: /src/app.ts:EXPRESSION:MemberExpression:25:10
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
import type { BaseNodeRecord } from '@grafema/types';
|
|
12
|
+
|
|
13
|
+
interface ExpressionNodeRecord extends BaseNodeRecord {
|
|
14
|
+
type: 'EXPRESSION';
|
|
15
|
+
column: number;
|
|
16
|
+
expressionType: string;
|
|
17
|
+
// MemberExpression fields
|
|
18
|
+
object?: string;
|
|
19
|
+
property?: string;
|
|
20
|
+
computed?: boolean;
|
|
21
|
+
computedPropertyVar?: string;
|
|
22
|
+
// Binary/Logical expression fields
|
|
23
|
+
operator?: string;
|
|
24
|
+
// Tracking fields
|
|
25
|
+
path?: string;
|
|
26
|
+
baseName?: string;
|
|
27
|
+
propertyPath?: string[];
|
|
28
|
+
arrayIndex?: number;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
interface ExpressionNodeOptions {
|
|
32
|
+
// MemberExpression
|
|
33
|
+
object?: string;
|
|
34
|
+
property?: string;
|
|
35
|
+
computed?: boolean;
|
|
36
|
+
computedPropertyVar?: string;
|
|
37
|
+
// Binary/Logical
|
|
38
|
+
operator?: string;
|
|
39
|
+
// Tracking
|
|
40
|
+
path?: string;
|
|
41
|
+
baseName?: string;
|
|
42
|
+
propertyPath?: string[];
|
|
43
|
+
arrayIndex?: number;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
export class ExpressionNode {
|
|
47
|
+
static readonly TYPE = 'EXPRESSION' as const;
|
|
48
|
+
|
|
49
|
+
static readonly REQUIRED = ['expressionType', 'file', 'line', 'column'] as const;
|
|
50
|
+
static readonly OPTIONAL = [
|
|
51
|
+
'object', 'property', 'computed', 'computedPropertyVar',
|
|
52
|
+
'operator', 'path', 'baseName', 'propertyPath', 'arrayIndex'
|
|
53
|
+
] as const;
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* Create EXPRESSION node
|
|
57
|
+
*
|
|
58
|
+
* @param expressionType - Type of expression (MemberExpression, BinaryExpression, etc.)
|
|
59
|
+
* @param file - File path
|
|
60
|
+
* @param line - Line number
|
|
61
|
+
* @param column - Column position
|
|
62
|
+
* @param options - Optional expression properties
|
|
63
|
+
* @returns ExpressionNodeRecord
|
|
64
|
+
*/
|
|
65
|
+
static create(
|
|
66
|
+
expressionType: string,
|
|
67
|
+
file: string,
|
|
68
|
+
line: number,
|
|
69
|
+
column: number,
|
|
70
|
+
options: ExpressionNodeOptions = {}
|
|
71
|
+
): ExpressionNodeRecord {
|
|
72
|
+
if (!expressionType) throw new Error('ExpressionNode.create: expressionType is required');
|
|
73
|
+
if (!file) throw new Error('ExpressionNode.create: file is required');
|
|
74
|
+
if (!line) throw new Error('ExpressionNode.create: line is required');
|
|
75
|
+
if (column === undefined) throw new Error('ExpressionNode.create: column is required');
|
|
76
|
+
|
|
77
|
+
const node: ExpressionNodeRecord = {
|
|
78
|
+
id: `${file}:EXPRESSION:${expressionType}:${line}:${column}`,
|
|
79
|
+
type: this.TYPE,
|
|
80
|
+
name: this._computeName(expressionType, options),
|
|
81
|
+
file,
|
|
82
|
+
line,
|
|
83
|
+
column,
|
|
84
|
+
expressionType
|
|
85
|
+
};
|
|
86
|
+
|
|
87
|
+
// Add optional fields if present
|
|
88
|
+
if (options.object !== undefined) node.object = options.object;
|
|
89
|
+
if (options.property !== undefined) node.property = options.property;
|
|
90
|
+
if (options.computed !== undefined) node.computed = options.computed;
|
|
91
|
+
if (options.computedPropertyVar !== undefined) node.computedPropertyVar = options.computedPropertyVar;
|
|
92
|
+
if (options.operator !== undefined) node.operator = options.operator;
|
|
93
|
+
if (options.path !== undefined) node.path = options.path;
|
|
94
|
+
if (options.baseName !== undefined) node.baseName = options.baseName;
|
|
95
|
+
if (options.propertyPath !== undefined) node.propertyPath = options.propertyPath;
|
|
96
|
+
if (options.arrayIndex !== undefined) node.arrayIndex = options.arrayIndex;
|
|
97
|
+
|
|
98
|
+
return node;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
/**
|
|
102
|
+
* Compute name from expression properties
|
|
103
|
+
*
|
|
104
|
+
* Naming conventions:
|
|
105
|
+
* - MemberExpression: "object.property"
|
|
106
|
+
* - BinaryExpression: "<BinaryExpression>"
|
|
107
|
+
* - LogicalExpression: "<LogicalExpression>"
|
|
108
|
+
* - ConditionalExpression: "<ternary>"
|
|
109
|
+
* - TemplateLiteral: "<template>"
|
|
110
|
+
* - Other: expressionType
|
|
111
|
+
*/
|
|
112
|
+
private static _computeName(expressionType: string, options: ExpressionNodeOptions): string {
|
|
113
|
+
if (options.path) {
|
|
114
|
+
return options.path;
|
|
115
|
+
}
|
|
116
|
+
if (options.object && options.property) {
|
|
117
|
+
return `${options.object}.${options.property}`;
|
|
118
|
+
}
|
|
119
|
+
// Special naming for non-MemberExpression types
|
|
120
|
+
switch (expressionType) {
|
|
121
|
+
case 'BinaryExpression':
|
|
122
|
+
case 'LogicalExpression':
|
|
123
|
+
return `<${expressionType}>`;
|
|
124
|
+
case 'ConditionalExpression':
|
|
125
|
+
return '<ternary>';
|
|
126
|
+
case 'TemplateLiteral':
|
|
127
|
+
return '<template>';
|
|
128
|
+
default:
|
|
129
|
+
return expressionType;
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
/**
|
|
134
|
+
* Generate EXPRESSION node ID without creating the full node
|
|
135
|
+
*
|
|
136
|
+
* Used by JSASTAnalyzer when creating assignment metadata.
|
|
137
|
+
* The full node is created later by GraphBuilder.
|
|
138
|
+
*
|
|
139
|
+
* ID format: {file}:EXPRESSION:{expressionType}:{line}:{column}
|
|
140
|
+
*
|
|
141
|
+
* @param expressionType - Type of expression (MemberExpression, BinaryExpression, etc.)
|
|
142
|
+
* @param file - File path
|
|
143
|
+
* @param line - Line number
|
|
144
|
+
* @param column - Column position
|
|
145
|
+
* @returns Generated ID string in colon format
|
|
146
|
+
*/
|
|
147
|
+
static generateId(
|
|
148
|
+
expressionType: string,
|
|
149
|
+
file: string,
|
|
150
|
+
line: number,
|
|
151
|
+
column: number
|
|
152
|
+
): string {
|
|
153
|
+
return `${file}:EXPRESSION:${expressionType}:${line}:${column}`;
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
/**
|
|
157
|
+
* Create EXPRESSION node from assignment metadata
|
|
158
|
+
*
|
|
159
|
+
* Used by GraphBuilder when processing variableAssignments.
|
|
160
|
+
* The ID is provided from upstream (generated by JSASTAnalyzer).
|
|
161
|
+
*
|
|
162
|
+
* @param expressionType - Type of expression
|
|
163
|
+
* @param file - File path
|
|
164
|
+
* @param line - Line number
|
|
165
|
+
* @param column - Column position
|
|
166
|
+
* @param options - Must include id; optional: expression properties
|
|
167
|
+
* @returns ExpressionNodeRecord
|
|
168
|
+
*/
|
|
169
|
+
static createFromMetadata(
|
|
170
|
+
expressionType: string,
|
|
171
|
+
file: string,
|
|
172
|
+
line: number,
|
|
173
|
+
column: number,
|
|
174
|
+
options: ExpressionNodeOptions & { id: string }
|
|
175
|
+
): ExpressionNodeRecord {
|
|
176
|
+
if (!options.id) {
|
|
177
|
+
throw new Error('ExpressionNode.createFromMetadata: id is required');
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
// Validate ID format - must use colon format
|
|
181
|
+
if (!options.id.includes(':EXPRESSION:')) {
|
|
182
|
+
throw new Error(
|
|
183
|
+
`ExpressionNode.createFromMetadata: Invalid ID format "${options.id}". ` +
|
|
184
|
+
`Expected format: {file}:EXPRESSION:{type}:{line}:{column}`
|
|
185
|
+
);
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
// Create base node structure
|
|
189
|
+
const node: ExpressionNodeRecord = {
|
|
190
|
+
id: options.id, // Use provided ID (from upstream)
|
|
191
|
+
type: this.TYPE,
|
|
192
|
+
name: this._computeName(expressionType, options),
|
|
193
|
+
file,
|
|
194
|
+
line,
|
|
195
|
+
column,
|
|
196
|
+
expressionType
|
|
197
|
+
};
|
|
198
|
+
|
|
199
|
+
// Add optional fields if present (same logic as create())
|
|
200
|
+
if (options.object !== undefined) node.object = options.object;
|
|
201
|
+
if (options.property !== undefined) node.property = options.property;
|
|
202
|
+
if (options.computed !== undefined) node.computed = options.computed;
|
|
203
|
+
if (options.computedPropertyVar !== undefined) node.computedPropertyVar = options.computedPropertyVar;
|
|
204
|
+
if (options.operator !== undefined) node.operator = options.operator;
|
|
205
|
+
if (options.path !== undefined) node.path = options.path;
|
|
206
|
+
if (options.baseName !== undefined) node.baseName = options.baseName;
|
|
207
|
+
if (options.propertyPath !== undefined) node.propertyPath = options.propertyPath;
|
|
208
|
+
if (options.arrayIndex !== undefined) node.arrayIndex = options.arrayIndex;
|
|
209
|
+
|
|
210
|
+
return node;
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
static validate(node: ExpressionNodeRecord): string[] {
|
|
214
|
+
const errors: string[] = [];
|
|
215
|
+
|
|
216
|
+
if (node.type !== this.TYPE) {
|
|
217
|
+
errors.push(`Expected type ${this.TYPE}, got ${node.type}`);
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
if (!node.expressionType) {
|
|
221
|
+
errors.push('Missing required field: expressionType');
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
if (!node.file) {
|
|
225
|
+
errors.push('Missing required field: file');
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
return errors;
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
export type { ExpressionNodeRecord, ExpressionNodeOptions };
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ExternalModuleNode - contract for EXTERNAL_MODULE node
|
|
3
|
+
*
|
|
4
|
+
* Represents external npm packages or Node.js built-in modules
|
|
5
|
+
* that are imported but not analyzed.
|
|
6
|
+
*
|
|
7
|
+
* ID format: EXTERNAL_MODULE:{source}
|
|
8
|
+
* Example: EXTERNAL_MODULE:lodash, EXTERNAL_MODULE:@tanstack/react-query
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
import type { BaseNodeRecord } from '@grafema/types';
|
|
12
|
+
|
|
13
|
+
interface ExternalModuleNodeRecord extends BaseNodeRecord {
|
|
14
|
+
type: 'EXTERNAL_MODULE';
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
export class ExternalModuleNode {
|
|
18
|
+
static readonly TYPE = 'EXTERNAL_MODULE' as const;
|
|
19
|
+
|
|
20
|
+
static readonly REQUIRED = ['name'] as const;
|
|
21
|
+
static readonly OPTIONAL = [] as const;
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* Create EXTERNAL_MODULE node
|
|
25
|
+
*
|
|
26
|
+
* Normalizes node: prefix for Node.js builtins:
|
|
27
|
+
* - 'node:fs' -> 'fs'
|
|
28
|
+
* - 'node:path' -> 'path'
|
|
29
|
+
*
|
|
30
|
+
* @param source - Module name (e.g., 'lodash', '@tanstack/react-query', 'node:fs')
|
|
31
|
+
* @returns ExternalModuleNodeRecord
|
|
32
|
+
*/
|
|
33
|
+
static create(source: string): ExternalModuleNodeRecord {
|
|
34
|
+
if (!source) throw new Error('ExternalModuleNode.create: source is required');
|
|
35
|
+
|
|
36
|
+
// Normalize node: prefix for Node.js builtins
|
|
37
|
+
const normalizedSource = source.startsWith('node:')
|
|
38
|
+
? source.slice(5)
|
|
39
|
+
: source;
|
|
40
|
+
|
|
41
|
+
return {
|
|
42
|
+
id: `EXTERNAL_MODULE:${normalizedSource}`,
|
|
43
|
+
type: this.TYPE,
|
|
44
|
+
name: normalizedSource,
|
|
45
|
+
file: '',
|
|
46
|
+
line: 0
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
static validate(node: ExternalModuleNodeRecord): string[] {
|
|
51
|
+
const errors: string[] = [];
|
|
52
|
+
|
|
53
|
+
if (node.type !== this.TYPE) {
|
|
54
|
+
errors.push(`Expected type ${this.TYPE}, got ${node.type}`);
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
if (!node.name) {
|
|
58
|
+
errors.push('Missing required field: name');
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
return errors;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
export type { ExternalModuleNodeRecord };
|
|
@@ -1,19 +1,26 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* ExternalStdioNode - contract for
|
|
2
|
+
* ExternalStdioNode - contract for net:stdio node (singleton)
|
|
3
|
+
*
|
|
4
|
+
* Represents standard I/O streams (console.log, console.error, etc.)
|
|
5
|
+
* Singleton node - only one instance per graph.
|
|
6
|
+
*
|
|
7
|
+
* Uses namespaced type 'net:stdio' for semantic grouping - AI agents
|
|
8
|
+
* can query all I/O-related nodes via 'net:*' pattern.
|
|
3
9
|
*/
|
|
4
10
|
|
|
5
11
|
import type { BaseNodeRecord } from '@grafema/types';
|
|
6
12
|
|
|
7
13
|
interface ExternalStdioNodeRecord extends BaseNodeRecord {
|
|
8
|
-
type: '
|
|
14
|
+
type: 'net:stdio';
|
|
15
|
+
description?: string;
|
|
9
16
|
}
|
|
10
17
|
|
|
11
18
|
export class ExternalStdioNode {
|
|
12
|
-
static readonly TYPE = '
|
|
13
|
-
static readonly SINGLETON_ID = '
|
|
19
|
+
static readonly TYPE = 'net:stdio' as const;
|
|
20
|
+
static readonly SINGLETON_ID = 'net:stdio#__stdio__';
|
|
14
21
|
|
|
15
|
-
static readonly REQUIRED = ['name'
|
|
16
|
-
static readonly OPTIONAL = [] as const;
|
|
22
|
+
static readonly REQUIRED = ['name'] as const;
|
|
23
|
+
static readonly OPTIONAL = ['description'] as const;
|
|
17
24
|
|
|
18
25
|
static create(): ExternalStdioNodeRecord {
|
|
19
26
|
return {
|
|
@@ -21,14 +28,15 @@ export class ExternalStdioNode {
|
|
|
21
28
|
type: this.TYPE,
|
|
22
29
|
name: '__stdio__',
|
|
23
30
|
file: '__builtin__',
|
|
24
|
-
line: 0
|
|
31
|
+
line: 0,
|
|
32
|
+
description: 'Standard input/output stream'
|
|
25
33
|
};
|
|
26
34
|
}
|
|
27
35
|
|
|
28
36
|
static validate(node: ExternalStdioNodeRecord): string[] {
|
|
29
37
|
const errors: string[] = [];
|
|
30
|
-
if (node.type !== this.TYPE) errors.push(`Expected type ${this.TYPE}`);
|
|
31
|
-
if (node.id !== this.SINGLETON_ID) errors.push(`Invalid singleton ID`);
|
|
38
|
+
if (node.type !== this.TYPE) errors.push(`Expected type ${this.TYPE}, got ${node.type}`);
|
|
39
|
+
if (node.id !== this.SINGLETON_ID) errors.push(`Invalid singleton ID: ${node.id}, expected ${this.SINGLETON_ID}`);
|
|
32
40
|
return errors;
|
|
33
41
|
}
|
|
34
42
|
}
|