@grafema/core 0.1.1-alpha → 0.2.1-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/dist/Orchestrator.d.ts +7 -0
- package/dist/Orchestrator.d.ts.map +1 -1
- package/dist/Orchestrator.js +25 -3
- package/dist/config/ConfigLoader.d.ts +18 -0
- package/dist/config/ConfigLoader.d.ts.map +1 -1
- package/dist/config/ConfigLoader.js +65 -3
- 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/NodeFactory.d.ts +44 -5
- package/dist/core/NodeFactory.d.ts.map +1 -1
- package/dist/core/NodeFactory.js +52 -7
- package/dist/core/nodes/ArrayLiteralNode.d.ts.map +1 -1
- package/dist/core/nodes/ArrayLiteralNode.js +4 -2
- 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 +2 -2
- package/dist/core/nodes/CallSiteNode.d.ts.map +1 -1
- package/dist/core/nodes/CallSiteNode.js +9 -5
- 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 +2 -2
- package/dist/core/nodes/ClassNode.d.ts.map +1 -1
- package/dist/core/nodes/ClassNode.js +8 -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 +2 -2
- package/dist/core/nodes/DecoratorNode.d.ts.map +1 -1
- package/dist/core/nodes/DecoratorNode.js +5 -3
- package/dist/core/nodes/EnumNode.d.ts +2 -2
- package/dist/core/nodes/EnumNode.d.ts.map +1 -1
- package/dist/core/nodes/EnumNode.js +5 -3
- 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 +2 -2
- package/dist/core/nodes/ExportNode.d.ts.map +1 -1
- package/dist/core/nodes/ExportNode.js +8 -4
- package/dist/core/nodes/ExpressionNode.d.ts +2 -2
- package/dist/core/nodes/ExpressionNode.d.ts.map +1 -1
- package/dist/core/nodes/ExpressionNode.js +6 -4
- package/dist/core/nodes/ExternalModuleNode.d.ts +4 -0
- package/dist/core/nodes/ExternalModuleNode.d.ts.map +1 -1
- package/dist/core/nodes/ExternalModuleNode.js +10 -2
- 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 +10 -2
- package/dist/core/nodes/ImportNode.d.ts.map +1 -1
- package/dist/core/nodes/ImportNode.js +21 -4
- package/dist/core/nodes/InterfaceNode.d.ts +2 -2
- package/dist/core/nodes/InterfaceNode.d.ts.map +1 -1
- package/dist/core/nodes/InterfaceNode.js +5 -3
- 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 +2 -2
- package/dist/core/nodes/MethodCallNode.d.ts.map +1 -1
- package/dist/core/nodes/MethodCallNode.js +9 -5
- package/dist/core/nodes/MethodNode.d.ts +2 -2
- package/dist/core/nodes/MethodNode.d.ts.map +1 -1
- package/dist/core/nodes/MethodNode.js +8 -4
- package/dist/core/nodes/ObjectLiteralNode.d.ts.map +1 -1
- package/dist/core/nodes/ObjectLiteralNode.js +4 -2
- 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/TypeNode.d.ts +2 -2
- package/dist/core/nodes/TypeNode.d.ts.map +1 -1
- package/dist/core/nodes/TypeNode.js +5 -3
- package/dist/core/nodes/VariableDeclarationNode.d.ts +2 -2
- package/dist/core/nodes/VariableDeclarationNode.d.ts.map +1 -1
- package/dist/core/nodes/VariableDeclarationNode.js +9 -5
- package/dist/core/nodes/index.d.ts +3 -0
- package/dist/core/nodes/index.d.ts.map +1 -1
- package/dist/core/nodes/index.js +3 -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/DiagnosticReporter.d.ts +23 -0
- package/dist/diagnostics/DiagnosticReporter.d.ts.map +1 -1
- package/dist/diagnostics/DiagnosticReporter.js +88 -0
- package/dist/diagnostics/index.d.ts +1 -1
- package/dist/diagnostics/index.d.ts.map +1 -1
- package/dist/errors/GrafemaError.d.ts +43 -0
- package/dist/errors/GrafemaError.d.ts.map +1 -1
- package/dist/errors/GrafemaError.js +50 -0
- package/dist/index.d.ts +17 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +17 -1
- package/dist/plugins/analysis/DatabaseAnalyzer.d.ts.map +1 -1
- package/dist/plugins/analysis/DatabaseAnalyzer.js +3 -2
- package/dist/plugins/analysis/ExpressAnalyzer.d.ts.map +1 -1
- package/dist/plugins/analysis/ExpressAnalyzer.js +3 -1
- 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 +53 -18
- package/dist/plugins/analysis/FetchAnalyzer.d.ts +40 -0
- package/dist/plugins/analysis/FetchAnalyzer.d.ts.map +1 -1
- package/dist/plugins/analysis/FetchAnalyzer.js +163 -15
- package/dist/plugins/analysis/JSASTAnalyzer.d.ts +157 -26
- package/dist/plugins/analysis/JSASTAnalyzer.d.ts.map +1 -1
- package/dist/plugins/analysis/JSASTAnalyzer.js +2418 -191
- package/dist/plugins/analysis/RustAnalyzer.js +4 -4
- package/dist/plugins/analysis/SQLiteAnalyzer.d.ts.map +1 -1
- package/dist/plugins/analysis/SQLiteAnalyzer.js +4 -2
- 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 +91 -7
- package/dist/plugins/analysis/ast/GraphBuilder.d.ts +173 -0
- package/dist/plugins/analysis/ast/GraphBuilder.d.ts.map +1 -1
- package/dist/plugins/analysis/ast/GraphBuilder.js +1256 -65
- package/dist/plugins/analysis/ast/types.d.ts +294 -0
- package/dist/plugins/analysis/ast/types.d.ts.map +1 -1
- package/dist/plugins/analysis/ast/visitors/ASTVisitor.d.ts +5 -1
- package/dist/plugins/analysis/ast/visitors/ASTVisitor.d.ts.map +1 -1
- package/dist/plugins/analysis/ast/visitors/CallExpressionVisitor.d.ts +1 -0
- package/dist/plugins/analysis/ast/visitors/CallExpressionVisitor.d.ts.map +1 -1
- package/dist/plugins/analysis/ast/visitors/CallExpressionVisitor.js +12 -1
- package/dist/plugins/analysis/ast/visitors/FunctionVisitor.d.ts +10 -0
- package/dist/plugins/analysis/ast/visitors/FunctionVisitor.d.ts.map +1 -1
- package/dist/plugins/analysis/ast/visitors/FunctionVisitor.js +62 -0
- 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 +101 -0
- package/dist/plugins/analysis/ast/visitors/VariableVisitor.d.ts +16 -1
- package/dist/plugins/analysis/ast/visitors/VariableVisitor.d.ts.map +1 -1
- package/dist/plugins/analysis/ast/visitors/VariableVisitor.js +233 -39
- package/dist/plugins/discovery/WorkspaceDiscovery.d.ts.map +1 -1
- package/dist/plugins/discovery/WorkspaceDiscovery.js +9 -4
- package/dist/plugins/enrichment/AliasTracker.d.ts.map +1 -1
- package/dist/plugins/enrichment/AliasTracker.js +16 -1
- 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 +64 -20
- package/dist/plugins/enrichment/MethodCallResolver.d.ts.map +1 -1
- package/dist/plugins/enrichment/MethodCallResolver.js +15 -1
- 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 +172 -151
- 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/ValueDomainAnalyzer.d.ts +5 -27
- package/dist/plugins/enrichment/ValueDomainAnalyzer.d.ts.map +1 -1
- package/dist/plugins/enrichment/ValueDomainAnalyzer.js +62 -139
- 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 +58 -0
- package/dist/plugins/indexing/RustModuleIndexer.d.ts +1 -1
- package/dist/plugins/indexing/RustModuleIndexer.js +4 -4
- 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 +101 -76
- package/dist/plugins/validation/DataFlowValidator.d.ts.map +1 -1
- package/dist/plugins/validation/DataFlowValidator.js +49 -41
- package/dist/plugins/validation/GraphConnectivityValidator.d.ts.map +1 -1
- package/dist/plugins/validation/GraphConnectivityValidator.js +25 -1
- package/dist/plugins/validation/SQLInjectionValidator.d.ts.map +1 -1
- package/dist/plugins/validation/SQLInjectionValidator.js +2 -3
- 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 +13 -18
- package/dist/storage/backends/RFDBServerBackend.d.ts.map +1 -1
- package/dist/storage/backends/RFDBServerBackend.js +47 -51
- package/dist/storage/backends/typeValidation.d.ts.map +1 -1
- package/dist/storage/backends/typeValidation.js +1 -0
- package/package.json +3 -3
- package/src/Orchestrator.ts +35 -3
- package/src/config/ConfigLoader.ts +94 -3
- package/src/core/FileExplainer.ts +179 -0
- package/src/core/NodeFactory.ts +72 -8
- package/src/core/nodes/ArrayLiteralNode.ts +3 -2
- package/src/core/nodes/BranchNode.ts +113 -0
- package/src/core/nodes/CallSiteNode.ts +7 -5
- package/src/core/nodes/CaseNode.ts +123 -0
- package/src/core/nodes/ClassNode.ts +6 -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 +4 -3
- package/src/core/nodes/EnumNode.ts +4 -3
- package/src/core/nodes/EventListenerNode.ts +7 -4
- package/src/core/nodes/ExportNode.ts +6 -4
- package/src/core/nodes/ExpressionNode.ts +5 -4
- package/src/core/nodes/ExternalModuleNode.ts +11 -2
- package/src/core/nodes/HttpRequestNode.ts +7 -4
- package/src/core/nodes/ImportNode.ts +31 -4
- package/src/core/nodes/InterfaceNode.ts +4 -3
- package/src/core/nodes/LiteralNode.ts +5 -4
- package/src/core/nodes/MethodCallNode.ts +7 -5
- package/src/core/nodes/MethodNode.ts +6 -4
- package/src/core/nodes/ObjectLiteralNode.ts +3 -2
- package/src/core/nodes/ParameterNode.ts +4 -3
- package/src/core/nodes/TypeNode.ts +4 -3
- package/src/core/nodes/VariableDeclarationNode.ts +7 -5
- package/src/core/nodes/index.ts +3 -0
- 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/DiagnosticReporter.ts +120 -0
- package/src/diagnostics/index.ts +1 -1
- package/src/errors/GrafemaError.ts +65 -0
- package/src/index.ts +45 -0
- package/src/plugins/analysis/DatabaseAnalyzer.ts +4 -2
- package/src/plugins/analysis/ExpressAnalyzer.ts +5 -1
- package/src/plugins/analysis/ExpressResponseAnalyzer.ts +636 -0
- package/src/plugins/analysis/ExpressRouteAnalyzer.ts +57 -18
- package/src/plugins/analysis/FetchAnalyzer.ts +204 -16
- package/src/plugins/analysis/JSASTAnalyzer.ts +2958 -260
- package/src/plugins/analysis/RustAnalyzer.ts +4 -4
- package/src/plugins/analysis/SQLiteAnalyzer.ts +5 -2
- package/src/plugins/analysis/SocketIOAnalyzer.ts +121 -7
- package/src/plugins/analysis/ast/GraphBuilder.ts +1578 -70
- package/src/plugins/analysis/ast/types.ts +387 -0
- package/src/plugins/analysis/ast/visitors/ASTVisitor.ts +8 -0
- package/src/plugins/analysis/ast/visitors/CallExpressionVisitor.ts +16 -1
- package/src/plugins/analysis/ast/visitors/FunctionVisitor.ts +77 -2
- package/src/plugins/analysis/ast/visitors/ImportExportVisitor.ts +112 -1
- package/src/plugins/analysis/ast/visitors/VariableVisitor.ts +272 -47
- package/src/plugins/discovery/WorkspaceDiscovery.ts +11 -4
- package/src/plugins/enrichment/AliasTracker.ts +22 -1
- 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 +70 -20
- package/src/plugins/enrichment/MethodCallResolver.ts +21 -1
- package/src/plugins/enrichment/MountPointResolver.ts +206 -198
- package/src/plugins/enrichment/NodejsBuiltinsResolver.ts +365 -0
- package/src/plugins/enrichment/ValueDomainAnalyzer.ts +67 -184
- package/src/plugins/indexing/JSModuleIndexer.ts +66 -0
- package/src/plugins/indexing/RustModuleIndexer.ts +4 -4
- package/src/plugins/validation/BrokenImportValidator.ts +325 -0
- package/src/plugins/validation/CallResolverValidator.ts +129 -109
- package/src/plugins/validation/DataFlowValidator.ts +75 -58
- package/src/plugins/validation/GraphConnectivityValidator.ts +39 -1
- package/src/plugins/validation/SQLInjectionValidator.ts +2 -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 +64 -68
- package/src/storage/backends/typeValidation.ts +1 -0
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
import { readFileSync, existsSync } from 'fs';
|
|
7
7
|
import { join, resolve, dirname, relative, basename } from 'path';
|
|
8
8
|
import { createHash } from 'crypto';
|
|
9
|
+
import { minimatch } from 'minimatch';
|
|
9
10
|
import { Plugin, createErrorResult } from '../Plugin.js';
|
|
10
11
|
import type { PluginContext, PluginResult, PluginMetadata } from '../Plugin.js';
|
|
11
12
|
// @ts-expect-error - no type declarations for node-source-walk
|
|
@@ -76,6 +77,10 @@ export class JSModuleIndexer extends Plugin {
|
|
|
76
77
|
private cache: Map<string, string[] | Error>;
|
|
77
78
|
private testPatterns: RegExp[];
|
|
78
79
|
private markTestFiles: boolean;
|
|
80
|
+
// Include/exclude pattern filtering (REG-185)
|
|
81
|
+
private includePatterns?: string[];
|
|
82
|
+
private excludePatterns?: string[];
|
|
83
|
+
private projectPath: string = '';
|
|
79
84
|
|
|
80
85
|
constructor() {
|
|
81
86
|
super();
|
|
@@ -95,6 +100,43 @@ export class JSModuleIndexer extends Plugin {
|
|
|
95
100
|
return this.testPatterns.some(pattern => pattern.test(filePath));
|
|
96
101
|
}
|
|
97
102
|
|
|
103
|
+
/**
|
|
104
|
+
* Check if a file should be skipped based on include/exclude patterns.
|
|
105
|
+
*
|
|
106
|
+
* Logic:
|
|
107
|
+
* 1. If file matches any exclude pattern -> SKIP
|
|
108
|
+
* 2. If include patterns specified AND file doesn't match any -> SKIP
|
|
109
|
+
* 3. Otherwise -> PROCESS
|
|
110
|
+
*
|
|
111
|
+
* @param absolutePath - Absolute path to the file
|
|
112
|
+
* @returns true if file should be skipped, false if it should be processed
|
|
113
|
+
*/
|
|
114
|
+
private shouldSkipFile(absolutePath: string): boolean {
|
|
115
|
+
// Normalize to relative path for pattern matching
|
|
116
|
+
const relativePath = relative(this.projectPath, absolutePath).replace(/\\/g, '/');
|
|
117
|
+
|
|
118
|
+
// Check exclude patterns first (if any match, skip)
|
|
119
|
+
if (this.excludePatterns && this.excludePatterns.length > 0) {
|
|
120
|
+
for (const pattern of this.excludePatterns) {
|
|
121
|
+
if (minimatch(relativePath, pattern, { dot: true })) {
|
|
122
|
+
return true; // Excluded
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
// Check include patterns (if specified, file must match at least one)
|
|
128
|
+
if (this.includePatterns && this.includePatterns.length > 0) {
|
|
129
|
+
for (const pattern of this.includePatterns) {
|
|
130
|
+
if (minimatch(relativePath, pattern, { dot: true })) {
|
|
131
|
+
return false; // Included
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
return true; // Include specified but file didn't match any
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
return false; // No filtering, process file
|
|
138
|
+
}
|
|
139
|
+
|
|
98
140
|
get metadata(): PluginMetadata {
|
|
99
141
|
return {
|
|
100
142
|
name: 'JSModuleIndexer',
|
|
@@ -225,6 +267,22 @@ export class JSModuleIndexer extends Plugin {
|
|
|
225
267
|
// Collect parse errors to report (REG-147)
|
|
226
268
|
const parseErrors: Error[] = [];
|
|
227
269
|
|
|
270
|
+
// Store projectPath for shouldSkipFile()
|
|
271
|
+
this.projectPath = projectPath;
|
|
272
|
+
|
|
273
|
+
// Read include/exclude patterns from config (REG-185)
|
|
274
|
+
const orchConfig = config as { include?: string[]; exclude?: string[] } | undefined;
|
|
275
|
+
this.includePatterns = orchConfig?.include;
|
|
276
|
+
this.excludePatterns = orchConfig?.exclude;
|
|
277
|
+
|
|
278
|
+
// Log if patterns are configured
|
|
279
|
+
if (this.includePatterns || this.excludePatterns) {
|
|
280
|
+
logger.info('File filtering enabled', {
|
|
281
|
+
include: this.includePatterns?.length ?? 0,
|
|
282
|
+
exclude: this.excludePatterns?.length ?? 0,
|
|
283
|
+
});
|
|
284
|
+
}
|
|
285
|
+
|
|
228
286
|
// Check config for test file marking
|
|
229
287
|
if ((config as { analysis?: { tests?: { markTestFiles?: boolean } } })?.analysis?.tests?.markTestFiles === false) {
|
|
230
288
|
this.markTestFiles = false;
|
|
@@ -260,6 +318,14 @@ export class JSModuleIndexer extends Plugin {
|
|
|
260
318
|
while (stack.length > 0 && visited.size < MAX_MODULES) {
|
|
261
319
|
const { file: currentFile, depth } = stack.pop()!;
|
|
262
320
|
|
|
321
|
+
// Check if file should be skipped based on include/exclude patterns (REG-185)
|
|
322
|
+
if (this.shouldSkipFile(currentFile)) {
|
|
323
|
+
logger.debug('Skipping file (filtered by patterns)', {
|
|
324
|
+
file: currentFile.replace(projectPath, '')
|
|
325
|
+
});
|
|
326
|
+
continue; // Don't process, don't follow imports
|
|
327
|
+
}
|
|
328
|
+
|
|
263
329
|
// Report progress every PROGRESS_INTERVAL files
|
|
264
330
|
if (onProgress && visited.size - lastProgressReport >= PROGRESS_INTERVAL) {
|
|
265
331
|
onProgress({
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* RustModuleIndexer - plugin for indexing Rust modules
|
|
3
|
-
* Discovers .rs files in
|
|
3
|
+
* Discovers .rs files in packages/rfdb-server/src/ directory
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
6
|
import { readFileSync, existsSync, readdirSync, statSync } from 'fs';
|
|
@@ -99,11 +99,11 @@ export class RustModuleIndexer extends Plugin {
|
|
|
99
99
|
const typedManifest = manifest as { projectPath: string } | undefined;
|
|
100
100
|
const { projectPath } = typedManifest!;
|
|
101
101
|
|
|
102
|
-
// Find
|
|
103
|
-
const rustRoot = resolve(projectPath, '
|
|
102
|
+
// Find packages/rfdb-server/src directory
|
|
103
|
+
const rustRoot = resolve(projectPath, 'packages/rfdb-server/src');
|
|
104
104
|
|
|
105
105
|
if (!existsSync(rustRoot)) {
|
|
106
|
-
logger.info('
|
|
106
|
+
logger.info('packages/rfdb-server/src not found, skipping');
|
|
107
107
|
return createSuccessResult({ nodes: 0, edges: 0 }, { skipped: true });
|
|
108
108
|
}
|
|
109
109
|
|
|
@@ -0,0 +1,325 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* BrokenImportValidator - detects broken imports and undefined symbols (REG-261)
|
|
3
|
+
*
|
|
4
|
+
* This VALIDATION plugin queries the graph (built by ANALYSIS and ENRICHMENT phases)
|
|
5
|
+
* to detect:
|
|
6
|
+
*
|
|
7
|
+
* 1. ERR_BROKEN_IMPORT: Named/default import references non-existent export
|
|
8
|
+
* - IMPORT node with relative source but no IMPORTS_FROM edge
|
|
9
|
+
* - Skips: external (npm) imports, namespace imports, type-only imports
|
|
10
|
+
*
|
|
11
|
+
* 2. ERR_UNDEFINED_SYMBOL: Symbol used but not defined, imported, or global
|
|
12
|
+
* - CALL node without CALLS edge
|
|
13
|
+
* - Not a method call (no `object` property)
|
|
14
|
+
* - Not a local definition (FUNCTION/CLASS/VARIABLE in same file)
|
|
15
|
+
* - Not an import (IMPORT with matching local name)
|
|
16
|
+
* - Not a known global (console, setTimeout, etc.)
|
|
17
|
+
*
|
|
18
|
+
* Architecture follows existing validator patterns:
|
|
19
|
+
* - Phase: VALIDATION
|
|
20
|
+
* - Priority: 85 (after enrichment, before general validators)
|
|
21
|
+
* - Returns: ValidationError[] collected via DiagnosticCollector
|
|
22
|
+
*/
|
|
23
|
+
|
|
24
|
+
import { Plugin, createSuccessResult } from '../Plugin.js';
|
|
25
|
+
import type { PluginContext, PluginResult, PluginMetadata } from '../Plugin.js';
|
|
26
|
+
import type { BaseNodeRecord } from '@grafema/types';
|
|
27
|
+
import { ValidationError } from '../../errors/GrafemaError.js';
|
|
28
|
+
import { GlobalsRegistry } from '../../data/globals/index.js';
|
|
29
|
+
|
|
30
|
+
// === INTERFACES ===
|
|
31
|
+
|
|
32
|
+
interface ImportNode extends BaseNodeRecord {
|
|
33
|
+
source?: string;
|
|
34
|
+
importType?: string; // 'default' | 'named' | 'namespace'
|
|
35
|
+
imported?: string; // Original name in source module
|
|
36
|
+
local?: string; // Local binding name in this file
|
|
37
|
+
importBinding?: string; // 'value' | 'type' (TypeScript)
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
interface CallNode extends BaseNodeRecord {
|
|
41
|
+
object?: string; // If present, this is a method call
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
// === CONSTANTS ===
|
|
45
|
+
|
|
46
|
+
const ERROR_CODES = {
|
|
47
|
+
BROKEN_IMPORT: 'ERR_BROKEN_IMPORT',
|
|
48
|
+
UNDEFINED_SYMBOL: 'ERR_UNDEFINED_SYMBOL',
|
|
49
|
+
} as const;
|
|
50
|
+
|
|
51
|
+
// Types that represent local definitions
|
|
52
|
+
const DEFINITION_TYPES = new Set([
|
|
53
|
+
'FUNCTION',
|
|
54
|
+
'CLASS',
|
|
55
|
+
'VARIABLE_DECLARATION',
|
|
56
|
+
'CONSTANT',
|
|
57
|
+
'PARAMETER',
|
|
58
|
+
]);
|
|
59
|
+
|
|
60
|
+
// === PLUGIN CLASS ===
|
|
61
|
+
|
|
62
|
+
export class BrokenImportValidator extends Plugin {
|
|
63
|
+
private globalsRegistry: GlobalsRegistry;
|
|
64
|
+
|
|
65
|
+
constructor(config: Record<string, unknown> = {}) {
|
|
66
|
+
super(config);
|
|
67
|
+
this.globalsRegistry = new GlobalsRegistry();
|
|
68
|
+
|
|
69
|
+
// Allow custom globals from config
|
|
70
|
+
const customGlobals = config.customGlobals as string[] | undefined;
|
|
71
|
+
if (customGlobals) {
|
|
72
|
+
this.globalsRegistry.addCustomGlobals(customGlobals);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
get metadata(): PluginMetadata {
|
|
77
|
+
return {
|
|
78
|
+
name: 'BrokenImportValidator',
|
|
79
|
+
phase: 'VALIDATION',
|
|
80
|
+
priority: 85, // After enrichment plugins, before general validators
|
|
81
|
+
creates: {
|
|
82
|
+
nodes: [],
|
|
83
|
+
edges: []
|
|
84
|
+
},
|
|
85
|
+
dependencies: ['ImportExportLinker', 'FunctionCallResolver']
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
async execute(context: PluginContext): Promise<PluginResult> {
|
|
90
|
+
const { graph, onProgress } = context;
|
|
91
|
+
const logger = this.log(context);
|
|
92
|
+
|
|
93
|
+
logger.info('Starting broken import validation');
|
|
94
|
+
const startTime = Date.now();
|
|
95
|
+
|
|
96
|
+
const errors: ValidationError[] = [];
|
|
97
|
+
const stats = {
|
|
98
|
+
importsChecked: 0,
|
|
99
|
+
brokenImports: 0,
|
|
100
|
+
callsChecked: 0,
|
|
101
|
+
undefinedSymbols: 0,
|
|
102
|
+
skipped: {
|
|
103
|
+
externalImports: 0,
|
|
104
|
+
namespaceImports: 0,
|
|
105
|
+
typeOnlyImports: 0,
|
|
106
|
+
methodCalls: 0,
|
|
107
|
+
alreadyResolved: 0,
|
|
108
|
+
localDefinitions: 0,
|
|
109
|
+
imports: 0,
|
|
110
|
+
globals: 0,
|
|
111
|
+
},
|
|
112
|
+
};
|
|
113
|
+
|
|
114
|
+
// === Step 1: Build indexes ===
|
|
115
|
+
|
|
116
|
+
// Index: file -> Set<name> for local definitions
|
|
117
|
+
const definitionsByFile = new Map<string, Set<string>>();
|
|
118
|
+
for await (const node of graph.queryNodes({})) {
|
|
119
|
+
if (!DEFINITION_TYPES.has(node.type)) continue;
|
|
120
|
+
if (!node.file || !node.name) continue;
|
|
121
|
+
|
|
122
|
+
if (!definitionsByFile.has(node.file)) {
|
|
123
|
+
definitionsByFile.set(node.file, new Set());
|
|
124
|
+
}
|
|
125
|
+
definitionsByFile.get(node.file)!.add(node.name);
|
|
126
|
+
}
|
|
127
|
+
logger.debug('Indexed definitions', { files: definitionsByFile.size });
|
|
128
|
+
|
|
129
|
+
// Index: file:local -> ImportNode
|
|
130
|
+
const importsByFile = new Map<string, Map<string, ImportNode>>();
|
|
131
|
+
const allImports: ImportNode[] = [];
|
|
132
|
+
|
|
133
|
+
for await (const node of graph.queryNodes({ nodeType: 'IMPORT' })) {
|
|
134
|
+
const imp = node as ImportNode;
|
|
135
|
+
if (!imp.file) continue;
|
|
136
|
+
|
|
137
|
+
allImports.push(imp);
|
|
138
|
+
|
|
139
|
+
// Index by local name for undefined symbol checking
|
|
140
|
+
const localName = imp.local || imp.name;
|
|
141
|
+
if (localName) {
|
|
142
|
+
if (!importsByFile.has(imp.file)) {
|
|
143
|
+
importsByFile.set(imp.file, new Map());
|
|
144
|
+
}
|
|
145
|
+
importsByFile.get(imp.file)!.set(localName, imp);
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
logger.debug('Indexed imports', { count: allImports.length });
|
|
149
|
+
|
|
150
|
+
// === Step 2: Check for broken imports ===
|
|
151
|
+
|
|
152
|
+
for (const imp of allImports) {
|
|
153
|
+
stats.importsChecked++;
|
|
154
|
+
|
|
155
|
+
// Progress reporting
|
|
156
|
+
if (onProgress && stats.importsChecked % 100 === 0) {
|
|
157
|
+
onProgress({
|
|
158
|
+
phase: 'validation',
|
|
159
|
+
currentPlugin: 'BrokenImportValidator',
|
|
160
|
+
message: `Checking imports ${stats.importsChecked}/${allImports.length}`,
|
|
161
|
+
totalFiles: allImports.length,
|
|
162
|
+
processedFiles: stats.importsChecked
|
|
163
|
+
});
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
// Skip external (npm) imports - only check relative imports
|
|
167
|
+
const isRelative = imp.source &&
|
|
168
|
+
(imp.source.startsWith('./') || imp.source.startsWith('../'));
|
|
169
|
+
if (!isRelative) {
|
|
170
|
+
stats.skipped.externalImports++;
|
|
171
|
+
continue;
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
// Skip namespace imports - they link to MODULE, not EXPORT
|
|
175
|
+
if (imp.importType === 'namespace') {
|
|
176
|
+
stats.skipped.namespaceImports++;
|
|
177
|
+
continue;
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
// Skip type-only imports (TypeScript) - erased at compile time
|
|
181
|
+
if (imp.importBinding === 'type') {
|
|
182
|
+
stats.skipped.typeOnlyImports++;
|
|
183
|
+
continue;
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
// Check for IMPORTS_FROM edge
|
|
187
|
+
const importsFromEdges = await graph.getOutgoingEdges(imp.id, ['IMPORTS_FROM']);
|
|
188
|
+
|
|
189
|
+
if (importsFromEdges.length === 0) {
|
|
190
|
+
// No IMPORTS_FROM edge = broken import
|
|
191
|
+
const importedName = imp.imported || imp.local || imp.name;
|
|
192
|
+
|
|
193
|
+
errors.push(new ValidationError(
|
|
194
|
+
`Import "${importedName}" from "${imp.source}" - export doesn't exist`,
|
|
195
|
+
ERROR_CODES.BROKEN_IMPORT,
|
|
196
|
+
{
|
|
197
|
+
filePath: imp.file,
|
|
198
|
+
lineNumber: imp.line as number | undefined,
|
|
199
|
+
phase: 'VALIDATION',
|
|
200
|
+
plugin: 'BrokenImportValidator',
|
|
201
|
+
importedName,
|
|
202
|
+
source: imp.source,
|
|
203
|
+
importType: imp.importType,
|
|
204
|
+
},
|
|
205
|
+
`Check if "${importedName}" is exported from "${imp.source}"`,
|
|
206
|
+
'error'
|
|
207
|
+
));
|
|
208
|
+
|
|
209
|
+
stats.brokenImports++;
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
logger.debug('Broken imports found', { count: stats.brokenImports });
|
|
214
|
+
|
|
215
|
+
// === Step 3: Check for undefined symbols ===
|
|
216
|
+
|
|
217
|
+
const callsToCheck: CallNode[] = [];
|
|
218
|
+
for await (const node of graph.queryNodes({ nodeType: 'CALL' })) {
|
|
219
|
+
const call = node as CallNode;
|
|
220
|
+
|
|
221
|
+
// Skip method calls (have object attribute)
|
|
222
|
+
if (call.object) {
|
|
223
|
+
stats.skipped.methodCalls++;
|
|
224
|
+
continue;
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
// Skip if already has CALLS edge (resolved)
|
|
228
|
+
const callsEdges = await graph.getOutgoingEdges(call.id, ['CALLS']);
|
|
229
|
+
if (callsEdges.length > 0) {
|
|
230
|
+
stats.skipped.alreadyResolved++;
|
|
231
|
+
continue;
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
callsToCheck.push(call);
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
logger.debug('Unresolved calls to check', { count: callsToCheck.length });
|
|
238
|
+
|
|
239
|
+
for (const call of callsToCheck) {
|
|
240
|
+
stats.callsChecked++;
|
|
241
|
+
|
|
242
|
+
const calledName = call.name;
|
|
243
|
+
const file = call.file;
|
|
244
|
+
|
|
245
|
+
if (!calledName || !file) continue;
|
|
246
|
+
|
|
247
|
+
// Check 1: Is it a local definition?
|
|
248
|
+
const fileDefinitions = definitionsByFile.get(file);
|
|
249
|
+
if (fileDefinitions?.has(calledName)) {
|
|
250
|
+
stats.skipped.localDefinitions++;
|
|
251
|
+
continue;
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
// Check 2: Is it imported? (even if broken, that's a different error)
|
|
255
|
+
const fileImports = importsByFile.get(file);
|
|
256
|
+
if (fileImports?.has(calledName)) {
|
|
257
|
+
stats.skipped.imports++;
|
|
258
|
+
continue;
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
// Check 3: Is it a global?
|
|
262
|
+
if (this.globalsRegistry.isGlobal(calledName)) {
|
|
263
|
+
stats.skipped.globals++;
|
|
264
|
+
continue;
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
// Symbol is undefined
|
|
268
|
+
errors.push(new ValidationError(
|
|
269
|
+
`"${calledName}" is used but not defined or imported`,
|
|
270
|
+
ERROR_CODES.UNDEFINED_SYMBOL,
|
|
271
|
+
{
|
|
272
|
+
filePath: file,
|
|
273
|
+
lineNumber: call.line as number | undefined,
|
|
274
|
+
phase: 'VALIDATION',
|
|
275
|
+
plugin: 'BrokenImportValidator',
|
|
276
|
+
symbol: calledName,
|
|
277
|
+
},
|
|
278
|
+
`Add an import for "${calledName}" or define it locally`,
|
|
279
|
+
'warning' // Warning severity - might be a false positive
|
|
280
|
+
));
|
|
281
|
+
|
|
282
|
+
stats.undefinedSymbols++;
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
// === Step 4: Summary ===
|
|
286
|
+
|
|
287
|
+
const totalTime = ((Date.now() - startTime) / 1000).toFixed(2);
|
|
288
|
+
const summary = {
|
|
289
|
+
importsChecked: stats.importsChecked,
|
|
290
|
+
brokenImports: stats.brokenImports,
|
|
291
|
+
callsChecked: stats.callsChecked,
|
|
292
|
+
undefinedSymbols: stats.undefinedSymbols,
|
|
293
|
+
skipped: stats.skipped,
|
|
294
|
+
totalIssues: stats.brokenImports + stats.undefinedSymbols,
|
|
295
|
+
time: `${totalTime}s`,
|
|
296
|
+
};
|
|
297
|
+
|
|
298
|
+
logger.info('Validation complete', summary);
|
|
299
|
+
|
|
300
|
+
if (errors.length > 0) {
|
|
301
|
+
logger.warn('Issues found', {
|
|
302
|
+
brokenImports: stats.brokenImports,
|
|
303
|
+
undefinedSymbols: stats.undefinedSymbols,
|
|
304
|
+
});
|
|
305
|
+
|
|
306
|
+
// Log first few errors for visibility
|
|
307
|
+
for (const error of errors.slice(0, 5)) {
|
|
308
|
+
if (error.code === ERROR_CODES.BROKEN_IMPORT) {
|
|
309
|
+
logger.error(`[${error.code}] ${error.message}`);
|
|
310
|
+
} else {
|
|
311
|
+
logger.warn(`[${error.code}] ${error.message}`);
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
if (errors.length > 5) {
|
|
315
|
+
logger.debug(`... and ${errors.length - 5} more issues`);
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
|
|
319
|
+
return createSuccessResult(
|
|
320
|
+
{ nodes: 0, edges: 0 },
|
|
321
|
+
{ summary },
|
|
322
|
+
errors
|
|
323
|
+
);
|
|
324
|
+
}
|
|
325
|
+
}
|