@grafema/core 0.1.0-alpha.5 → 0.1.1-alpha
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 +24 -2
- package/dist/Orchestrator.d.ts.map +1 -1
- package/dist/Orchestrator.js +197 -24
- package/dist/config/ConfigLoader.d.ts +72 -0
- package/dist/config/ConfigLoader.d.ts.map +1 -0
- package/dist/config/ConfigLoader.js +187 -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/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 +225 -17
- package/dist/core/NodeFactory.d.ts.map +1 -1
- package/dist/core/NodeFactory.js +208 -18
- 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 +41 -0
- package/dist/core/nodes/CallSiteNode.d.ts +28 -0
- package/dist/core/nodes/CallSiteNode.d.ts.map +1 -1
- package/dist/core/nodes/CallSiteNode.js +46 -0
- package/dist/core/nodes/ClassNode.d.ts +33 -1
- package/dist/core/nodes/ClassNode.d.ts.map +1 -1
- package/dist/core/nodes/ClassNode.js +46 -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 +62 -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 +54 -0
- package/dist/core/nodes/ExportNode.d.ts +37 -1
- package/dist/core/nodes/ExportNode.d.ts.map +1 -1
- package/dist/core/nodes/ExportNode.js +48 -2
- 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 +178 -0
- package/dist/core/nodes/ExternalModuleNode.d.ts +28 -0
- package/dist/core/nodes/ExternalModuleNode.d.ts.map +1 -0
- package/dist/core/nodes/ExternalModuleNode.js +41 -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/ImportNode.d.ts +19 -5
- package/dist/core/nodes/ImportNode.d.ts.map +1 -1
- package/dist/core/nodes/ImportNode.js +23 -5
- 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 +55 -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/MethodCallNode.d.ts +30 -0
- package/dist/core/nodes/MethodCallNode.d.ts.map +1 -1
- package/dist/core/nodes/MethodCallNode.js +49 -0
- package/dist/core/nodes/MethodNode.d.ts +32 -0
- package/dist/core/nodes/MethodNode.d.ts.map +1 -1
- package/dist/core/nodes/MethodNode.js +48 -0
- 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 +41 -0
- 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 +53 -0
- package/dist/core/nodes/VariableDeclarationNode.d.ts +27 -0
- package/dist/core/nodes/VariableDeclarationNode.d.ts.map +1 -1
- package/dist/core/nodes/VariableDeclarationNode.js +40 -0
- package/dist/core/nodes/index.d.ts +12 -1
- package/dist/core/nodes/index.d.ts.map +1 -1
- package/dist/core/nodes/index.js +14 -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 +77 -0
- package/dist/diagnostics/DiagnosticReporter.d.ts.map +1 -0
- package/dist/diagnostics/DiagnosticReporter.js +159 -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 +118 -0
- package/dist/errors/GrafemaError.d.ts.map +1 -0
- package/dist/errors/GrafemaError.js +131 -0
- package/dist/index.d.ts +57 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +54 -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 +13 -6
- package/dist/plugins/analysis/ExpressAnalyzer.d.ts.map +1 -1
- package/dist/plugins/analysis/ExpressAnalyzer.js +27 -19
- package/dist/plugins/analysis/ExpressRouteAnalyzer.d.ts.map +1 -1
- package/dist/plugins/analysis/ExpressRouteAnalyzer.js +21 -14
- package/dist/plugins/analysis/FetchAnalyzer.d.ts +1 -0
- package/dist/plugins/analysis/FetchAnalyzer.d.ts.map +1 -1
- package/dist/plugins/analysis/FetchAnalyzer.js +34 -14
- 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 +180 -17
- package/dist/plugins/analysis/JSASTAnalyzer.d.ts.map +1 -1
- package/dist/plugins/analysis/JSASTAnalyzer.js +1171 -471
- 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 +15 -10
- package/dist/plugins/analysis/SQLiteAnalyzer.d.ts.map +1 -1
- package/dist/plugins/analysis/SQLiteAnalyzer.js +9 -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.map +1 -1
- package/dist/plugins/analysis/SocketIOAnalyzer.js +27 -15
- 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 +34 -4
- package/dist/plugins/analysis/ast/GraphBuilder.d.ts.map +1 -1
- package/dist/plugins/analysis/ast/GraphBuilder.js +318 -298
- 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 +176 -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 +9 -4
- 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 +99 -9
- package/dist/plugins/analysis/ast/visitors/CallExpressionVisitor.d.ts.map +1 -1
- package/dist/plugins/analysis/ast/visitors/CallExpressionVisitor.js +663 -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 +4 -1
- package/dist/plugins/analysis/ast/visitors/FunctionVisitor.d.ts.map +1 -1
- package/dist/plugins/analysis/ast/visitors/FunctionVisitor.js +128 -63
- package/dist/plugins/analysis/ast/visitors/ImportExportVisitor.d.ts.map +1 -1
- package/dist/plugins/analysis/ast/visitors/ImportExportVisitor.js +11 -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 +4 -1
- package/dist/plugins/analysis/ast/visitors/VariableVisitor.d.ts.map +1 -1
- package/dist/plugins/analysis/ast/visitors/VariableVisitor.js +17 -13
- 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 +136 -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 +14 -8
- package/dist/plugins/enrichment/HTTPConnectionEnricher.d.ts.map +1 -1
- package/dist/plugins/enrichment/HTTPConnectionEnricher.js +14 -7
- 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 +18 -12
- package/dist/plugins/enrichment/MountPointResolver.d.ts.map +1 -1
- package/dist/plugins/enrichment/MountPointResolver.js +8 -3
- 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 +17 -0
- package/dist/plugins/enrichment/ValueDomainAnalyzer.d.ts.map +1 -1
- package/dist/plugins/enrichment/ValueDomainAnalyzer.js +129 -10
- 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.map +1 -1
- package/dist/plugins/indexing/JSModuleIndexer.js +63 -31
- package/dist/plugins/indexing/RustModuleIndexer.d.ts.map +1 -1
- package/dist/plugins/indexing/RustModuleIndexer.js +5 -4
- 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/CallResolverValidator.d.ts.map +1 -1
- package/dist/plugins/validation/CallResolverValidator.js +8 -7
- package/dist/plugins/validation/DataFlowValidator.d.ts.map +1 -1
- package/dist/plugins/validation/DataFlowValidator.js +17 -12
- 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 +19 -23
- 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 +59 -16
- 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/storage/backends/RFDBServerBackend.d.ts +10 -17
- package/dist/storage/backends/RFDBServerBackend.d.ts.map +1 -1
- package/dist/storage/backends/RFDBServerBackend.js +31 -10
- 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 +237 -24
- package/src/config/ConfigLoader.ts +263 -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/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 +401 -18
- 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 +65 -0
- package/src/core/nodes/CallSiteNode.ts +58 -0
- package/src/core/nodes/ClassNode.ts +63 -2
- package/src/core/nodes/DecoratorNode.ts +91 -0
- package/src/core/nodes/EnumNode.ts +86 -0
- package/src/core/nodes/ExportNode.ts +70 -2
- package/src/core/nodes/ExpressionNode.ts +231 -0
- package/src/core/nodes/ExternalModuleNode.ts +56 -0
- package/src/core/nodes/ExternalStdioNode.ts +17 -9
- package/src/core/nodes/FunctionNode.ts +101 -1
- package/src/core/nodes/ImportNode.ts +32 -10
- package/src/core/nodes/InterfaceNode.ts +91 -0
- package/src/core/nodes/IssueNode.ts +177 -0
- package/src/core/nodes/MethodCallNode.ts +64 -0
- package/src/core/nodes/MethodNode.ts +63 -0
- package/src/core/nodes/ModuleNode.ts +50 -0
- package/src/core/nodes/NetworkRequestNode.ts +77 -0
- package/src/core/nodes/ObjectLiteralNode.ts +65 -0
- package/src/core/nodes/ScopeNode.ts +65 -0
- package/src/core/nodes/TypeNode.ts +78 -0
- package/src/core/nodes/VariableDeclarationNode.ts +52 -0
- package/src/core/nodes/index.ts +18 -1
- package/src/diagnostics/DiagnosticCollector.ts +163 -0
- package/src/diagnostics/DiagnosticReporter.ts +204 -0
- package/src/diagnostics/DiagnosticWriter.ts +50 -0
- package/src/diagnostics/index.ts +16 -0
- package/src/errors/GrafemaError.ts +174 -0
- package/src/index.ts +148 -1
- package/src/logging/Logger.ts +152 -0
- package/src/plugins/Plugin.ts +42 -0
- package/src/plugins/analysis/DatabaseAnalyzer.ts +14 -8
- package/src/plugins/analysis/ExpressAnalyzer.ts +29 -19
- package/src/plugins/analysis/ExpressRouteAnalyzer.ts +22 -21
- package/src/plugins/analysis/FetchAnalyzer.ts +39 -16
- package/src/plugins/analysis/IncrementalAnalysisPlugin.ts +84 -101
- package/src/plugins/analysis/JSASTAnalyzer.ts +1483 -503
- package/src/plugins/analysis/ReactAnalyzer.ts +57 -57
- package/src/plugins/analysis/RustAnalyzer.ts +15 -10
- package/src/plugins/analysis/SQLiteAnalyzer.ts +10 -7
- package/src/plugins/analysis/ServiceLayerAnalyzer.ts +22 -16
- package/src/plugins/analysis/SocketIOAnalyzer.ts +31 -22
- package/src/plugins/analysis/SystemDbAnalyzer.ts +16 -11
- package/src/plugins/analysis/ast/GraphBuilder.ts +439 -327
- package/src/plugins/analysis/ast/IdGenerator.ts +177 -0
- package/src/plugins/analysis/ast/types.ts +209 -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 +11 -8
- package/src/plugins/analysis/ast/visitors/CallExpressionVisitor.ts +909 -83
- package/src/plugins/analysis/ast/visitors/ClassVisitor.ts +97 -44
- package/src/plugins/analysis/ast/visitors/FunctionVisitor.ts +159 -93
- package/src/plugins/analysis/ast/visitors/ImportExportVisitor.ts +12 -8
- package/src/plugins/analysis/ast/visitors/TypeScriptVisitor.ts +41 -14
- package/src/plugins/analysis/ast/visitors/VariableVisitor.ts +37 -17
- package/src/plugins/discovery/MonorepoServiceDiscovery.ts +3 -2
- package/src/plugins/discovery/SimpleProjectDiscovery.ts +6 -1
- package/src/plugins/discovery/WorkspaceDiscovery.ts +177 -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 +14 -8
- package/src/plugins/enrichment/HTTPConnectionEnricher.ts +14 -7
- package/src/plugins/enrichment/ImportExportLinker.ts +24 -6
- package/src/plugins/enrichment/MethodCallResolver.ts +18 -12
- package/src/plugins/enrichment/MountPointResolver.ts +8 -3
- package/src/plugins/enrichment/PrefixEvaluator.ts +16 -7
- package/src/plugins/enrichment/RustFFIEnricher.ts +6 -5
- package/src/plugins/enrichment/ValueDomainAnalyzer.ts +149 -12
- package/src/plugins/indexing/IncrementalModuleIndexer.ts +23 -14
- package/src/plugins/indexing/JSModuleIndexer.ts +74 -34
- package/src/plugins/indexing/RustModuleIndexer.ts +5 -4
- package/src/plugins/validation/CallResolverValidator.ts +8 -7
- package/src/plugins/validation/DataFlowValidator.ts +16 -12
- package/src/plugins/validation/EvalBanValidator.ts +17 -16
- package/src/plugins/validation/GraphConnectivityValidator.ts +19 -23
- package/src/plugins/validation/NodeCreationValidator.ts +554 -0
- package/src/plugins/validation/SQLInjectionValidator.ts +61 -15
- 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/storage/backends/RFDBServerBackend.ts +43 -29
- 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
|
@@ -1,15 +1,22 @@
|
|
|
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
|
import type { BaseNodeRecord } from '@grafema/types';
|
|
5
11
|
interface ExternalStdioNodeRecord extends BaseNodeRecord {
|
|
6
|
-
type: '
|
|
12
|
+
type: 'net:stdio';
|
|
13
|
+
description?: string;
|
|
7
14
|
}
|
|
8
15
|
export declare class ExternalStdioNode {
|
|
9
|
-
static readonly TYPE: "
|
|
10
|
-
static readonly SINGLETON_ID = "
|
|
11
|
-
static readonly REQUIRED: readonly ["name"
|
|
12
|
-
static readonly OPTIONAL: readonly [];
|
|
16
|
+
static readonly TYPE: "net:stdio";
|
|
17
|
+
static readonly SINGLETON_ID = "net:stdio#__stdio__";
|
|
18
|
+
static readonly REQUIRED: readonly ["name"];
|
|
19
|
+
static readonly OPTIONAL: readonly ["description"];
|
|
13
20
|
static create(): ExternalStdioNodeRecord;
|
|
14
21
|
static validate(node: ExternalStdioNodeRecord): string[];
|
|
15
22
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ExternalStdioNode.d.ts","sourceRoot":"","sources":["../../../src/core/nodes/ExternalStdioNode.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"ExternalStdioNode.d.ts","sourceRoot":"","sources":["../../../src/core/nodes/ExternalStdioNode.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAErD,UAAU,uBAAwB,SAAQ,cAAc;IACtD,IAAI,EAAE,WAAW,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,qBAAa,iBAAiB;IAC5B,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAG,WAAW,CAAU;IAC5C,MAAM,CAAC,QAAQ,CAAC,YAAY,yBAAyB;IAErD,MAAM,CAAC,QAAQ,CAAC,QAAQ,oBAAqB;IAC7C,MAAM,CAAC,QAAQ,CAAC,QAAQ,2BAA4B;IAEpD,MAAM,CAAC,MAAM,IAAI,uBAAuB;IAWxC,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,uBAAuB,GAAG,MAAM,EAAE;CAMzD;AAED,YAAY,EAAE,uBAAuB,EAAE,CAAC"}
|
|
@@ -1,26 +1,33 @@
|
|
|
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
|
export class ExternalStdioNode {
|
|
5
|
-
static TYPE = '
|
|
6
|
-
static SINGLETON_ID = '
|
|
7
|
-
static REQUIRED = ['name'
|
|
8
|
-
static OPTIONAL = [];
|
|
11
|
+
static TYPE = 'net:stdio';
|
|
12
|
+
static SINGLETON_ID = 'net:stdio#__stdio__';
|
|
13
|
+
static REQUIRED = ['name'];
|
|
14
|
+
static OPTIONAL = ['description'];
|
|
9
15
|
static create() {
|
|
10
16
|
return {
|
|
11
17
|
id: this.SINGLETON_ID,
|
|
12
18
|
type: this.TYPE,
|
|
13
19
|
name: '__stdio__',
|
|
14
20
|
file: '__builtin__',
|
|
15
|
-
line: 0
|
|
21
|
+
line: 0,
|
|
22
|
+
description: 'Standard input/output stream'
|
|
16
23
|
};
|
|
17
24
|
}
|
|
18
25
|
static validate(node) {
|
|
19
26
|
const errors = [];
|
|
20
27
|
if (node.type !== this.TYPE)
|
|
21
|
-
errors.push(`Expected type ${this.TYPE}`);
|
|
28
|
+
errors.push(`Expected type ${this.TYPE}, got ${node.type}`);
|
|
22
29
|
if (node.id !== this.SINGLETON_ID)
|
|
23
|
-
errors.push(`Invalid singleton ID`);
|
|
30
|
+
errors.push(`Invalid singleton ID: ${node.id}, expected ${this.SINGLETON_ID}`);
|
|
24
31
|
return errors;
|
|
25
32
|
}
|
|
26
33
|
}
|
|
@@ -1,7 +1,18 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* FunctionNode - contract for FUNCTION 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}->{scope_path}->FUNCTION->{name}
|
|
9
|
+
* Example: src/app.js->global->FUNCTION->processData
|
|
3
10
|
*/
|
|
4
11
|
import type { FunctionNodeRecord } from '@grafema/types';
|
|
12
|
+
import { type ScopeContext, type Location } from '../SemanticId.js';
|
|
13
|
+
/**
|
|
14
|
+
* Options for function node creation
|
|
15
|
+
*/
|
|
5
16
|
interface FunctionNodeOptions {
|
|
6
17
|
async?: boolean;
|
|
7
18
|
generator?: boolean;
|
|
@@ -13,6 +24,18 @@ interface FunctionNodeOptions {
|
|
|
13
24
|
params?: string[];
|
|
14
25
|
counter?: number;
|
|
15
26
|
}
|
|
27
|
+
/**
|
|
28
|
+
* Options specific to createWithContext
|
|
29
|
+
*/
|
|
30
|
+
interface FunctionNodeContextOptions {
|
|
31
|
+
async?: boolean;
|
|
32
|
+
generator?: boolean;
|
|
33
|
+
exported?: boolean;
|
|
34
|
+
arrowFunction?: boolean;
|
|
35
|
+
isClassMethod?: boolean;
|
|
36
|
+
className?: string;
|
|
37
|
+
params?: string[];
|
|
38
|
+
}
|
|
16
39
|
export declare class FunctionNode {
|
|
17
40
|
static readonly TYPE: "FUNCTION";
|
|
18
41
|
static readonly REQUIRED: readonly ["name", "file", "line", "column"];
|
|
@@ -21,6 +44,19 @@ export declare class FunctionNode {
|
|
|
21
44
|
* Create FUNCTION node
|
|
22
45
|
*/
|
|
23
46
|
static create(name: string, file: string, line: number, column: number, options?: FunctionNodeOptions): FunctionNodeRecord;
|
|
47
|
+
/**
|
|
48
|
+
* Create FUNCTION node with semantic ID (NEW API)
|
|
49
|
+
*
|
|
50
|
+
* Uses ScopeContext from ScopeTracker for stable identifiers that
|
|
51
|
+
* don't change when unrelated code is added/removed.
|
|
52
|
+
*
|
|
53
|
+
* @param name - Function name (or 'anonymous[N]' for anonymous functions)
|
|
54
|
+
* @param context - Scope context from ScopeTracker.getContext()
|
|
55
|
+
* @param location - Source location { line, column }
|
|
56
|
+
* @param options - Optional function properties
|
|
57
|
+
* @returns FunctionNodeRecord with semantic ID
|
|
58
|
+
*/
|
|
59
|
+
static createWithContext(name: string, context: ScopeContext, location: Partial<Location>, options?: FunctionNodeContextOptions): FunctionNodeRecord;
|
|
24
60
|
static validate(node: FunctionNodeRecord): string[];
|
|
25
61
|
}
|
|
26
62
|
export {};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FunctionNode.d.ts","sourceRoot":"","sources":["../../../src/core/nodes/FunctionNode.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"FunctionNode.d.ts","sourceRoot":"","sources":["../../../src/core/nodes/FunctionNode.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AACzD,OAAO,EAAqB,KAAK,YAAY,EAAE,KAAK,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAEvF;;GAEG;AACH,UAAU,mBAAmB;IAC3B,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,UAAU,0BAA0B;IAClC,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,qBAAa,YAAY;IACvB,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAG,UAAU,CAAU;IAE3C,MAAM,CAAC,QAAQ,CAAC,QAAQ,8CAA+C;IACvE,MAAM,CAAC,QAAQ,CAAC,QAAQ,wHAAyH;IAEjJ;;OAEG;IACH,MAAM,CAAC,MAAM,CACX,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,EACd,OAAO,GAAE,mBAAwB,GAChC,kBAAkB;IA2BrB;;;;;;;;;;;OAWG;IACH,MAAM,CAAC,iBAAiB,CACtB,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,YAAY,EACrB,QAAQ,EAAE,OAAO,CAAC,QAAQ,CAAC,EAC3B,OAAO,GAAE,0BAA+B,GACvC,kBAAkB;IA4DrB,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,kBAAkB,GAAG,MAAM,EAAE;CAgBpD"}
|
|
@@ -1,6 +1,14 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* FunctionNode - contract for FUNCTION 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}->{scope_path}->FUNCTION->{name}
|
|
9
|
+
* Example: src/app.js->global->FUNCTION->processData
|
|
3
10
|
*/
|
|
11
|
+
import { computeSemanticId } from '../SemanticId.js';
|
|
4
12
|
export class FunctionNode {
|
|
5
13
|
static TYPE = 'FUNCTION';
|
|
6
14
|
static REQUIRED = ['name', 'file', 'line', 'column'];
|
|
@@ -21,7 +29,6 @@ export class FunctionNode {
|
|
|
21
29
|
const id = `${file}:FUNCTION:${name}:${line}:${column}${counter}`;
|
|
22
30
|
return {
|
|
23
31
|
id,
|
|
24
|
-
stableId: id,
|
|
25
32
|
type: this.TYPE,
|
|
26
33
|
name,
|
|
27
34
|
file,
|
|
@@ -37,6 +44,78 @@ export class FunctionNode {
|
|
|
37
44
|
params: options.params || []
|
|
38
45
|
};
|
|
39
46
|
}
|
|
47
|
+
/**
|
|
48
|
+
* Create FUNCTION node with semantic ID (NEW API)
|
|
49
|
+
*
|
|
50
|
+
* Uses ScopeContext from ScopeTracker for stable identifiers that
|
|
51
|
+
* don't change when unrelated code is added/removed.
|
|
52
|
+
*
|
|
53
|
+
* @param name - Function name (or 'anonymous[N]' for anonymous functions)
|
|
54
|
+
* @param context - Scope context from ScopeTracker.getContext()
|
|
55
|
+
* @param location - Source location { line, column }
|
|
56
|
+
* @param options - Optional function properties
|
|
57
|
+
* @returns FunctionNodeRecord with semantic ID
|
|
58
|
+
*/
|
|
59
|
+
static createWithContext(name, context, location, options = {}) {
|
|
60
|
+
// Validate required fields
|
|
61
|
+
if (!name)
|
|
62
|
+
throw new Error('FunctionNode.createWithContext: name is required');
|
|
63
|
+
if (!context.file)
|
|
64
|
+
throw new Error('FunctionNode.createWithContext: file is required');
|
|
65
|
+
if (location.line === undefined)
|
|
66
|
+
throw new Error('FunctionNode.createWithContext: line is required');
|
|
67
|
+
if (location.column === undefined)
|
|
68
|
+
throw new Error('FunctionNode.createWithContext: column is required');
|
|
69
|
+
// Compute semantic ID
|
|
70
|
+
const id = computeSemanticId(this.TYPE, name, context);
|
|
71
|
+
// Compute parentScopeId from context
|
|
72
|
+
// If we have a scope path, the parent is the last scope in the path
|
|
73
|
+
let parentScopeId;
|
|
74
|
+
if (context.scopePath.length > 0) {
|
|
75
|
+
// Find the most recent function/method scope to use as parent
|
|
76
|
+
// For now, we construct the parent's semantic ID from the scope path
|
|
77
|
+
const parentContext = {
|
|
78
|
+
file: context.file,
|
|
79
|
+
scopePath: context.scopePath.slice(0, -1) // Remove last scope
|
|
80
|
+
};
|
|
81
|
+
const parentScopeName = context.scopePath[context.scopePath.length - 1];
|
|
82
|
+
// Check if parent is a function/method scope (not a control flow scope)
|
|
83
|
+
if (!parentScopeName.includes('#')) {
|
|
84
|
+
// Named scope - likely a function or class
|
|
85
|
+
parentScopeId = computeSemanticId('FUNCTION', parentScopeName, parentContext);
|
|
86
|
+
}
|
|
87
|
+
else {
|
|
88
|
+
// Control flow scope - find the nearest function ancestor
|
|
89
|
+
// For simplicity, take the first non-control-flow scope from the path
|
|
90
|
+
const nonControlFlowScopes = context.scopePath.filter(s => !s.includes('#'));
|
|
91
|
+
if (nonControlFlowScopes.length > 0) {
|
|
92
|
+
const parentName = nonControlFlowScopes[nonControlFlowScopes.length - 1];
|
|
93
|
+
const idx = context.scopePath.indexOf(parentName);
|
|
94
|
+
const ancestorContext = {
|
|
95
|
+
file: context.file,
|
|
96
|
+
scopePath: context.scopePath.slice(0, idx)
|
|
97
|
+
};
|
|
98
|
+
parentScopeId = computeSemanticId('FUNCTION', parentName, ancestorContext);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
return {
|
|
103
|
+
id,
|
|
104
|
+
type: this.TYPE,
|
|
105
|
+
name,
|
|
106
|
+
file: context.file,
|
|
107
|
+
line: location.line,
|
|
108
|
+
column: location.column,
|
|
109
|
+
async: options.async || false,
|
|
110
|
+
generator: options.generator || false,
|
|
111
|
+
exported: options.exported || false,
|
|
112
|
+
arrowFunction: options.arrowFunction || false,
|
|
113
|
+
parentScopeId,
|
|
114
|
+
isClassMethod: options.isClassMethod || false,
|
|
115
|
+
className: options.className,
|
|
116
|
+
params: options.params || []
|
|
117
|
+
};
|
|
118
|
+
}
|
|
40
119
|
static validate(node) {
|
|
41
120
|
const errors = [];
|
|
42
121
|
if (node.type !== this.TYPE) {
|
|
@@ -2,26 +2,40 @@
|
|
|
2
2
|
* ImportNode - contract for IMPORT node
|
|
3
3
|
*/
|
|
4
4
|
import type { BaseNodeRecord } from '@grafema/types';
|
|
5
|
-
type
|
|
5
|
+
type ImportBinding = 'value' | 'type' | 'typeof';
|
|
6
|
+
type ImportType = 'default' | 'named' | 'namespace';
|
|
6
7
|
interface ImportNodeRecord extends BaseNodeRecord {
|
|
7
8
|
type: 'IMPORT';
|
|
8
9
|
column: number;
|
|
9
10
|
source: string;
|
|
10
|
-
|
|
11
|
+
importType: ImportType;
|
|
12
|
+
importBinding: ImportBinding;
|
|
11
13
|
imported: string;
|
|
12
14
|
local: string;
|
|
13
15
|
}
|
|
14
16
|
interface ImportNodeOptions {
|
|
15
|
-
|
|
17
|
+
importType?: ImportType;
|
|
18
|
+
importBinding?: ImportBinding;
|
|
16
19
|
imported?: string;
|
|
17
20
|
local?: string;
|
|
18
21
|
}
|
|
19
22
|
export declare class ImportNode {
|
|
20
23
|
static readonly TYPE: "IMPORT";
|
|
21
24
|
static readonly REQUIRED: readonly ["name", "file", "line", "source"];
|
|
22
|
-
static readonly OPTIONAL: readonly ["column", "
|
|
25
|
+
static readonly OPTIONAL: readonly ["column", "importType", "importBinding", "imported", "local"];
|
|
26
|
+
/**
|
|
27
|
+
* Create IMPORT node
|
|
28
|
+
*
|
|
29
|
+
* @param name - The local binding name (what the import is called in this module)
|
|
30
|
+
* @param file - Absolute file path
|
|
31
|
+
* @param line - Line number (for debugging only, not part of ID)
|
|
32
|
+
* @param column - Column position (pass 0 if unavailable - JSASTAnalyzer limitation)
|
|
33
|
+
* @param source - Module source (e.g., 'react', './utils')
|
|
34
|
+
* @param options - Optional fields
|
|
35
|
+
* @returns ImportNodeRecord
|
|
36
|
+
*/
|
|
23
37
|
static create(name: string, file: string, line: number, column: number, source: string, options?: ImportNodeOptions): ImportNodeRecord;
|
|
24
38
|
static validate(node: ImportNodeRecord): string[];
|
|
25
39
|
}
|
|
26
|
-
export type { ImportNodeRecord,
|
|
40
|
+
export type { ImportNodeRecord, ImportBinding, ImportType };
|
|
27
41
|
//# sourceMappingURL=ImportNode.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ImportNode.d.ts","sourceRoot":"","sources":["../../../src/core/nodes/ImportNode.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAErD,KAAK,
|
|
1
|
+
{"version":3,"file":"ImportNode.d.ts","sourceRoot":"","sources":["../../../src/core/nodes/ImportNode.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAErD,KAAK,aAAa,GAAG,OAAO,GAAG,MAAM,GAAG,QAAQ,CAAC;AACjD,KAAK,UAAU,GAAG,SAAS,GAAG,OAAO,GAAG,WAAW,CAAC;AAEpD,UAAU,gBAAiB,SAAQ,cAAc;IAC/C,IAAI,EAAE,QAAQ,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,UAAU,CAAC;IACvB,aAAa,EAAE,aAAa,CAAC;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,UAAU,iBAAiB;IACzB,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,qBAAa,UAAU;IACrB,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAG,QAAQ,CAAU;IAEzC,MAAM,CAAC,QAAQ,CAAC,QAAQ,8CAA+C;IACvE,MAAM,CAAC,QAAQ,CAAC,QAAQ,0EAA2E;IAEnG;;;;;;;;;;OAUG;IACH,MAAM,CAAC,MAAM,CACX,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,EACd,OAAO,GAAE,iBAAsB,GAC9B,gBAAgB;IA4BnB,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,gBAAgB,GAAG,MAAM,EAAE;CAgBlD;AAED,YAAY,EAAE,gBAAgB,EAAE,aAAa,EAAE,UAAU,EAAE,CAAC"}
|
|
@@ -4,25 +4,43 @@
|
|
|
4
4
|
export class ImportNode {
|
|
5
5
|
static TYPE = 'IMPORT';
|
|
6
6
|
static REQUIRED = ['name', 'file', 'line', 'source'];
|
|
7
|
-
static OPTIONAL = ['column', '
|
|
7
|
+
static OPTIONAL = ['column', 'importType', 'importBinding', 'imported', 'local'];
|
|
8
|
+
/**
|
|
9
|
+
* Create IMPORT node
|
|
10
|
+
*
|
|
11
|
+
* @param name - The local binding name (what the import is called in this module)
|
|
12
|
+
* @param file - Absolute file path
|
|
13
|
+
* @param line - Line number (for debugging only, not part of ID)
|
|
14
|
+
* @param column - Column position (pass 0 if unavailable - JSASTAnalyzer limitation)
|
|
15
|
+
* @param source - Module source (e.g., 'react', './utils')
|
|
16
|
+
* @param options - Optional fields
|
|
17
|
+
* @returns ImportNodeRecord
|
|
18
|
+
*/
|
|
8
19
|
static create(name, file, line, column, source, options = {}) {
|
|
9
20
|
if (!name)
|
|
10
21
|
throw new Error('ImportNode.create: name is required');
|
|
11
22
|
if (!file)
|
|
12
23
|
throw new Error('ImportNode.create: file is required');
|
|
13
|
-
if (
|
|
24
|
+
if (line === undefined)
|
|
14
25
|
throw new Error('ImportNode.create: line is required');
|
|
15
26
|
if (!source)
|
|
16
27
|
throw new Error('ImportNode.create: source is required');
|
|
28
|
+
// Auto-detect importType from imported field if not explicitly provided
|
|
29
|
+
let importType = options.importType;
|
|
30
|
+
if (!importType && options.imported) {
|
|
31
|
+
importType = options.imported === 'default' ? 'default' :
|
|
32
|
+
options.imported === '*' ? 'namespace' : 'named';
|
|
33
|
+
}
|
|
17
34
|
return {
|
|
18
|
-
id: `${file}:IMPORT:${
|
|
35
|
+
id: `${file}:IMPORT:${source}:${name}`, // SEMANTIC ID: no line number
|
|
19
36
|
type: this.TYPE,
|
|
20
37
|
name,
|
|
21
38
|
file,
|
|
22
|
-
line,
|
|
39
|
+
line, // Stored as field, not in ID
|
|
23
40
|
column: column || 0,
|
|
24
41
|
source,
|
|
25
|
-
|
|
42
|
+
importType: importType || 'named', // NEW field with auto-detection
|
|
43
|
+
importBinding: options.importBinding || 'value', // RENAMED field
|
|
26
44
|
imported: options.imported || name,
|
|
27
45
|
local: options.local || name
|
|
28
46
|
};
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* InterfaceNode - contract for INTERFACE node
|
|
3
|
+
*
|
|
4
|
+
* Represents TypeScript interface declarations.
|
|
5
|
+
*
|
|
6
|
+
* ID format: {file}:INTERFACE:{name}:{line}
|
|
7
|
+
* Example: /src/types.ts:INTERFACE:IUser:5
|
|
8
|
+
*/
|
|
9
|
+
import type { BaseNodeRecord } from '@grafema/types';
|
|
10
|
+
interface InterfacePropertyRecord {
|
|
11
|
+
name: string;
|
|
12
|
+
type?: string;
|
|
13
|
+
optional?: boolean;
|
|
14
|
+
readonly?: boolean;
|
|
15
|
+
}
|
|
16
|
+
interface InterfaceNodeRecord extends BaseNodeRecord {
|
|
17
|
+
type: 'INTERFACE';
|
|
18
|
+
column: number;
|
|
19
|
+
extends: string[];
|
|
20
|
+
properties: InterfacePropertyRecord[];
|
|
21
|
+
isExternal?: boolean;
|
|
22
|
+
}
|
|
23
|
+
interface InterfaceNodeOptions {
|
|
24
|
+
extends?: string[];
|
|
25
|
+
properties?: InterfacePropertyRecord[];
|
|
26
|
+
isExternal?: boolean;
|
|
27
|
+
}
|
|
28
|
+
export declare class InterfaceNode {
|
|
29
|
+
static readonly TYPE: "INTERFACE";
|
|
30
|
+
static readonly REQUIRED: readonly ["name", "file", "line"];
|
|
31
|
+
static readonly OPTIONAL: readonly ["column", "extends", "properties", "isExternal"];
|
|
32
|
+
/**
|
|
33
|
+
* Create INTERFACE node
|
|
34
|
+
*
|
|
35
|
+
* @param name - Interface name
|
|
36
|
+
* @param file - File path
|
|
37
|
+
* @param line - Line number
|
|
38
|
+
* @param column - Column position
|
|
39
|
+
* @param options - Optional interface properties
|
|
40
|
+
* @returns InterfaceNodeRecord
|
|
41
|
+
*/
|
|
42
|
+
static create(name: string, file: string, line: number, column: number, options?: InterfaceNodeOptions): InterfaceNodeRecord;
|
|
43
|
+
static validate(node: InterfaceNodeRecord): string[];
|
|
44
|
+
}
|
|
45
|
+
export type { InterfaceNodeRecord, InterfacePropertyRecord };
|
|
46
|
+
//# sourceMappingURL=InterfaceNode.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"InterfaceNode.d.ts","sourceRoot":"","sources":["../../../src/core/nodes/InterfaceNode.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAErD,UAAU,uBAAuB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,UAAU,mBAAoB,SAAQ,cAAc;IAClD,IAAI,EAAE,WAAW,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,UAAU,EAAE,uBAAuB,EAAE,CAAC;IACtC,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED,UAAU,oBAAoB;IAC5B,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,UAAU,CAAC,EAAE,uBAAuB,EAAE,CAAC;IACvC,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED,qBAAa,aAAa;IACxB,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAG,WAAW,CAAU;IAE5C,MAAM,CAAC,QAAQ,CAAC,QAAQ,oCAAqC;IAC7D,MAAM,CAAC,QAAQ,CAAC,QAAQ,6DAA8D;IAEtF;;;;;;;;;OASG;IACH,MAAM,CAAC,MAAM,CACX,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,EACd,OAAO,GAAE,oBAAyB,GACjC,mBAAmB;IAkBtB,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,mBAAmB,GAAG,MAAM,EAAE;CAgBrD;AAED,YAAY,EAAE,mBAAmB,EAAE,uBAAuB,EAAE,CAAC"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* InterfaceNode - contract for INTERFACE node
|
|
3
|
+
*
|
|
4
|
+
* Represents TypeScript interface declarations.
|
|
5
|
+
*
|
|
6
|
+
* ID format: {file}:INTERFACE:{name}:{line}
|
|
7
|
+
* Example: /src/types.ts:INTERFACE:IUser:5
|
|
8
|
+
*/
|
|
9
|
+
export class InterfaceNode {
|
|
10
|
+
static TYPE = 'INTERFACE';
|
|
11
|
+
static REQUIRED = ['name', 'file', 'line'];
|
|
12
|
+
static OPTIONAL = ['column', 'extends', 'properties', 'isExternal'];
|
|
13
|
+
/**
|
|
14
|
+
* Create INTERFACE node
|
|
15
|
+
*
|
|
16
|
+
* @param name - Interface name
|
|
17
|
+
* @param file - File path
|
|
18
|
+
* @param line - Line number
|
|
19
|
+
* @param column - Column position
|
|
20
|
+
* @param options - Optional interface properties
|
|
21
|
+
* @returns InterfaceNodeRecord
|
|
22
|
+
*/
|
|
23
|
+
static create(name, file, line, column, options = {}) {
|
|
24
|
+
if (!name)
|
|
25
|
+
throw new Error('InterfaceNode.create: name is required');
|
|
26
|
+
if (!file)
|
|
27
|
+
throw new Error('InterfaceNode.create: file is required');
|
|
28
|
+
if (!line)
|
|
29
|
+
throw new Error('InterfaceNode.create: line is required');
|
|
30
|
+
return {
|
|
31
|
+
id: `${file}:INTERFACE:${name}:${line}`,
|
|
32
|
+
type: this.TYPE,
|
|
33
|
+
name,
|
|
34
|
+
file,
|
|
35
|
+
line,
|
|
36
|
+
column: column || 0,
|
|
37
|
+
extends: options.extends || [],
|
|
38
|
+
properties: options.properties || [],
|
|
39
|
+
...(options.isExternal !== undefined && { isExternal: options.isExternal })
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
static validate(node) {
|
|
43
|
+
const errors = [];
|
|
44
|
+
if (node.type !== this.TYPE) {
|
|
45
|
+
errors.push(`Expected type ${this.TYPE}, got ${node.type}`);
|
|
46
|
+
}
|
|
47
|
+
const nodeRecord = node;
|
|
48
|
+
for (const field of this.REQUIRED) {
|
|
49
|
+
if (!nodeRecord[field]) {
|
|
50
|
+
errors.push(`Missing required field: ${field}`);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
return errors;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* IssueNode - contract for issue:* nodes
|
|
3
|
+
*
|
|
4
|
+
* Types: issue:security, issue:performance, issue:style, issue:smell
|
|
5
|
+
* ID format: issue:<category>#<hash>
|
|
6
|
+
*
|
|
7
|
+
* Issues represent detected problems in the codebase.
|
|
8
|
+
* They connect to affected code via AFFECTS edges.
|
|
9
|
+
*/
|
|
10
|
+
import type { BaseNodeRecord } from '@grafema/types';
|
|
11
|
+
export type IssueSeverity = 'error' | 'warning' | 'info';
|
|
12
|
+
export type IssueType = `issue:${string}`;
|
|
13
|
+
export interface IssueNodeRecord extends BaseNodeRecord {
|
|
14
|
+
type: IssueType;
|
|
15
|
+
severity: IssueSeverity;
|
|
16
|
+
category: string;
|
|
17
|
+
message: string;
|
|
18
|
+
plugin: string;
|
|
19
|
+
targetNodeId?: string;
|
|
20
|
+
createdAt: number;
|
|
21
|
+
context?: Record<string, unknown>;
|
|
22
|
+
}
|
|
23
|
+
export interface IssueNodeOptions {
|
|
24
|
+
context?: Record<string, unknown>;
|
|
25
|
+
}
|
|
26
|
+
export declare class IssueNode {
|
|
27
|
+
static readonly REQUIRED: readonly ["category", "severity", "message", "plugin", "file"];
|
|
28
|
+
static readonly OPTIONAL: readonly ["targetNodeId", "context"];
|
|
29
|
+
/**
|
|
30
|
+
* Generate deterministic issue ID
|
|
31
|
+
* Format: issue:<category>#<hash12>
|
|
32
|
+
*
|
|
33
|
+
* Hash is based on plugin + file + line + column + message
|
|
34
|
+
* This ensures same issue = same ID across analysis runs
|
|
35
|
+
*/
|
|
36
|
+
static generateId(category: string, plugin: string, file: string, line: number, column: number, message: string): string;
|
|
37
|
+
/**
|
|
38
|
+
* Create issue node
|
|
39
|
+
*
|
|
40
|
+
* @param category - Issue category (security, performance, style, smell, or custom)
|
|
41
|
+
* @param severity - error | warning | info
|
|
42
|
+
* @param message - Human-readable description
|
|
43
|
+
* @param plugin - Plugin name that detected this issue
|
|
44
|
+
* @param file - File where issue was detected
|
|
45
|
+
* @param line - Line number
|
|
46
|
+
* @param column - Column number (optional, defaults to 0)
|
|
47
|
+
* @param options - Optional fields (context)
|
|
48
|
+
*/
|
|
49
|
+
static create(category: string, severity: IssueSeverity, message: string, plugin: string, file: string, line: number, column?: number, options?: IssueNodeOptions): IssueNodeRecord;
|
|
50
|
+
/**
|
|
51
|
+
* Validate issue node
|
|
52
|
+
* @returns array of error messages, empty if valid
|
|
53
|
+
*/
|
|
54
|
+
static validate(node: IssueNodeRecord): string[];
|
|
55
|
+
/**
|
|
56
|
+
* Parse issue ID into components
|
|
57
|
+
* @param id - full ID (e.g., 'issue:security#a3f2b1c4d5e6')
|
|
58
|
+
* @returns { category, hash } or null if invalid
|
|
59
|
+
*/
|
|
60
|
+
static parseId(id: string): {
|
|
61
|
+
category: string;
|
|
62
|
+
hash: string;
|
|
63
|
+
} | null;
|
|
64
|
+
/**
|
|
65
|
+
* Check if type is an issue type
|
|
66
|
+
*/
|
|
67
|
+
static isIssueType(type: string): boolean;
|
|
68
|
+
/**
|
|
69
|
+
* Get all known issue categories
|
|
70
|
+
*/
|
|
71
|
+
static getCategories(): string[];
|
|
72
|
+
}
|
|
73
|
+
//# sourceMappingURL=IssueNode.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"IssueNode.d.ts","sourceRoot":"","sources":["../../../src/core/nodes/IssueNode.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAIrD,MAAM,MAAM,aAAa,GAAG,OAAO,GAAG,SAAS,GAAG,MAAM,CAAC;AAGzD,MAAM,MAAM,SAAS,GAAG,SAAS,MAAM,EAAE,CAAC;AAE1C,MAAM,WAAW,eAAgB,SAAQ,cAAc;IACrD,IAAI,EAAE,SAAS,CAAC;IAChB,QAAQ,EAAE,aAAa,CAAC;IACxB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACnC;AAED,MAAM,WAAW,gBAAgB;IAC/B,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACnC;AAKD,qBAAa,SAAS;IACpB,MAAM,CAAC,QAAQ,CAAC,QAAQ,iEAAkE;IAC1F,MAAM,CAAC,QAAQ,CAAC,QAAQ,uCAAwC;IAEhE;;;;;;OAMG;IACH,MAAM,CAAC,UAAU,CACf,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,MAAM,GACd,MAAM;IAMT;;;;;;;;;;;OAWG;IACH,MAAM,CAAC,MAAM,CACX,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,aAAa,EACvB,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,MAAM,GAAE,MAAU,EAClB,OAAO,GAAE,gBAAqB,GAC7B,eAAe;IA8BlB;;;OAGG;IACH,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,eAAe,GAAG,MAAM,EAAE;IA4BhD;;;;OAIG;IACH,MAAM,CAAC,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI;IAYrE;;OAEG;IACH,MAAM,CAAC,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAKzC;;OAEG;IACH,MAAM,CAAC,aAAa,IAAI,MAAM,EAAE;CAGjC"}
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* IssueNode - contract for issue:* nodes
|
|
3
|
+
*
|
|
4
|
+
* Types: issue:security, issue:performance, issue:style, issue:smell
|
|
5
|
+
* ID format: issue:<category>#<hash>
|
|
6
|
+
*
|
|
7
|
+
* Issues represent detected problems in the codebase.
|
|
8
|
+
* They connect to affected code via AFFECTS edges.
|
|
9
|
+
*/
|
|
10
|
+
import { createHash } from 'crypto';
|
|
11
|
+
import { getNamespace } from './NodeKind.js';
|
|
12
|
+
// Valid severity levels
|
|
13
|
+
const VALID_SEVERITIES = ['error', 'warning', 'info'];
|
|
14
|
+
export class IssueNode {
|
|
15
|
+
static REQUIRED = ['category', 'severity', 'message', 'plugin', 'file'];
|
|
16
|
+
static OPTIONAL = ['targetNodeId', 'context'];
|
|
17
|
+
/**
|
|
18
|
+
* Generate deterministic issue ID
|
|
19
|
+
* Format: issue:<category>#<hash12>
|
|
20
|
+
*
|
|
21
|
+
* Hash is based on plugin + file + line + column + message
|
|
22
|
+
* This ensures same issue = same ID across analysis runs
|
|
23
|
+
*/
|
|
24
|
+
static generateId(category, plugin, file, line, column, message) {
|
|
25
|
+
const hashInput = `${plugin}|${file}|${line}|${column}|${message}`;
|
|
26
|
+
const hash = createHash('sha256').update(hashInput).digest('hex').substring(0, 12);
|
|
27
|
+
return `issue:${category}#${hash}`;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Create issue node
|
|
31
|
+
*
|
|
32
|
+
* @param category - Issue category (security, performance, style, smell, or custom)
|
|
33
|
+
* @param severity - error | warning | info
|
|
34
|
+
* @param message - Human-readable description
|
|
35
|
+
* @param plugin - Plugin name that detected this issue
|
|
36
|
+
* @param file - File where issue was detected
|
|
37
|
+
* @param line - Line number
|
|
38
|
+
* @param column - Column number (optional, defaults to 0)
|
|
39
|
+
* @param options - Optional fields (context)
|
|
40
|
+
*/
|
|
41
|
+
static create(category, severity, message, plugin, file, line, column = 0, options = {}) {
|
|
42
|
+
if (!category)
|
|
43
|
+
throw new Error('IssueNode.create: category is required');
|
|
44
|
+
if (!severity)
|
|
45
|
+
throw new Error('IssueNode.create: severity is required');
|
|
46
|
+
if (!VALID_SEVERITIES.includes(severity)) {
|
|
47
|
+
throw new Error(`IssueNode.create: invalid severity "${severity}". Valid: ${VALID_SEVERITIES.join(', ')}`);
|
|
48
|
+
}
|
|
49
|
+
if (!message)
|
|
50
|
+
throw new Error('IssueNode.create: message is required');
|
|
51
|
+
if (!plugin)
|
|
52
|
+
throw new Error('IssueNode.create: plugin is required');
|
|
53
|
+
if (!file)
|
|
54
|
+
throw new Error('IssueNode.create: file is required');
|
|
55
|
+
const type = `issue:${category}`;
|
|
56
|
+
const id = this.generateId(category, plugin, file, line, column, message);
|
|
57
|
+
const now = Date.now();
|
|
58
|
+
return {
|
|
59
|
+
id,
|
|
60
|
+
type,
|
|
61
|
+
name: message.substring(0, 100), // Truncate for display
|
|
62
|
+
file,
|
|
63
|
+
line,
|
|
64
|
+
column,
|
|
65
|
+
severity,
|
|
66
|
+
category,
|
|
67
|
+
message,
|
|
68
|
+
plugin,
|
|
69
|
+
createdAt: now,
|
|
70
|
+
context: options.context,
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Validate issue node
|
|
75
|
+
* @returns array of error messages, empty if valid
|
|
76
|
+
*/
|
|
77
|
+
static validate(node) {
|
|
78
|
+
const errors = [];
|
|
79
|
+
if (!IssueNode.isIssueType(node.type)) {
|
|
80
|
+
errors.push(`Expected issue:* type, got ${node.type}`);
|
|
81
|
+
}
|
|
82
|
+
if (!node.category) {
|
|
83
|
+
errors.push('Missing required field: category');
|
|
84
|
+
}
|
|
85
|
+
if (!node.severity) {
|
|
86
|
+
errors.push('Missing required field: severity');
|
|
87
|
+
}
|
|
88
|
+
else if (!VALID_SEVERITIES.includes(node.severity)) {
|
|
89
|
+
errors.push(`Invalid severity: ${node.severity}. Valid: ${VALID_SEVERITIES.join(', ')}`);
|
|
90
|
+
}
|
|
91
|
+
if (!node.message) {
|
|
92
|
+
errors.push('Missing required field: message');
|
|
93
|
+
}
|
|
94
|
+
if (!node.plugin) {
|
|
95
|
+
errors.push('Missing required field: plugin');
|
|
96
|
+
}
|
|
97
|
+
return errors;
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Parse issue ID into components
|
|
101
|
+
* @param id - full ID (e.g., 'issue:security#a3f2b1c4d5e6')
|
|
102
|
+
* @returns { category, hash } or null if invalid
|
|
103
|
+
*/
|
|
104
|
+
static parseId(id) {
|
|
105
|
+
if (!id)
|
|
106
|
+
return null;
|
|
107
|
+
const match = id.match(/^issue:([^#]+)#(.+)$/);
|
|
108
|
+
if (!match)
|
|
109
|
+
return null;
|
|
110
|
+
return {
|
|
111
|
+
category: match[1],
|
|
112
|
+
hash: match[2],
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Check if type is an issue type
|
|
117
|
+
*/
|
|
118
|
+
static isIssueType(type) {
|
|
119
|
+
if (!type)
|
|
120
|
+
return false;
|
|
121
|
+
return getNamespace(type) === 'issue';
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Get all known issue categories
|
|
125
|
+
*/
|
|
126
|
+
static getCategories() {
|
|
127
|
+
return ['security', 'performance', 'style', 'smell'];
|
|
128
|
+
}
|
|
129
|
+
}
|