code-auditor-mcp 1.20.0 → 2.0.0
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/adapters/GoAdapter.d.ts +53 -0
- package/dist/adapters/GoAdapter.d.ts.map +1 -0
- package/dist/adapters/GoAdapter.js +602 -0
- package/dist/adapters/GoAdapter.js.map +1 -0
- package/dist/adapters/GoConfig.d.ts +35 -0
- package/dist/adapters/GoConfig.d.ts.map +1 -0
- package/dist/adapters/GoConfig.js +155 -0
- package/dist/adapters/GoConfig.js.map +1 -0
- package/dist/adapters/LanguageAdapter.d.ts +135 -0
- package/dist/adapters/LanguageAdapter.d.ts.map +1 -0
- package/dist/adapters/LanguageAdapter.js +47 -0
- package/dist/adapters/LanguageAdapter.js.map +1 -0
- package/dist/adapters/TypeScriptAdapter.d.ts +43 -0
- package/dist/adapters/TypeScriptAdapter.d.ts.map +1 -0
- package/dist/adapters/TypeScriptAdapter.js +386 -0
- package/dist/adapters/TypeScriptAdapter.js.map +1 -0
- package/dist/adapters/UniversalAnalyzer.d.ts +42 -0
- package/dist/adapters/UniversalAnalyzer.d.ts.map +1 -0
- package/dist/adapters/UniversalAnalyzer.js +103 -0
- package/dist/adapters/UniversalAnalyzer.js.map +1 -0
- package/dist/adapters/UniversalSOLIDAnalyzer.d.ts +48 -0
- package/dist/adapters/UniversalSOLIDAnalyzer.d.ts.map +1 -0
- package/dist/adapters/UniversalSOLIDAnalyzer.js +178 -0
- package/dist/adapters/UniversalSOLIDAnalyzer.js.map +1 -0
- package/dist/adapters/solidAnalyzerCompat.d.ts +21 -0
- package/dist/adapters/solidAnalyzerCompat.d.ts.map +1 -0
- package/dist/adapters/solidAnalyzerCompat.js +78 -0
- package/dist/adapters/solidAnalyzerCompat.js.map +1 -0
- package/dist/analyzers/cross-language/APIContractAnalyzer.d.ts +103 -0
- package/dist/analyzers/cross-language/APIContractAnalyzer.d.ts.map +1 -0
- package/dist/analyzers/cross-language/APIContractAnalyzer.js +425 -0
- package/dist/analyzers/cross-language/APIContractAnalyzer.js.map +1 -0
- package/dist/analyzers/cross-language/CrossLanguageSOLIDAnalyzer.d.ts +117 -0
- package/dist/analyzers/cross-language/CrossLanguageSOLIDAnalyzer.d.ts.map +1 -0
- package/dist/analyzers/cross-language/CrossLanguageSOLIDAnalyzer.js +618 -0
- package/dist/analyzers/cross-language/CrossLanguageSOLIDAnalyzer.js.map +1 -0
- package/dist/analyzers/cross-language/DependencyGraphBuilder.d.ts +129 -0
- package/dist/analyzers/cross-language/DependencyGraphBuilder.d.ts.map +1 -0
- package/dist/analyzers/cross-language/DependencyGraphBuilder.js +473 -0
- package/dist/analyzers/cross-language/DependencyGraphBuilder.js.map +1 -0
- package/dist/analyzers/cross-language/SchemaValidator.d.ts +126 -0
- package/dist/analyzers/cross-language/SchemaValidator.d.ts.map +1 -0
- package/dist/analyzers/cross-language/SchemaValidator.js +522 -0
- package/dist/analyzers/cross-language/SchemaValidator.js.map +1 -0
- package/dist/analyzers/dataAccessAnalyzerCompat.d.ts +20 -0
- package/dist/analyzers/dataAccessAnalyzerCompat.d.ts.map +1 -0
- package/dist/analyzers/dataAccessAnalyzerCompat.js +59 -0
- package/dist/analyzers/dataAccessAnalyzerCompat.js.map +1 -0
- package/dist/analyzers/documentationAnalyzerCompat.d.ts +20 -0
- package/dist/analyzers/documentationAnalyzerCompat.d.ts.map +1 -0
- package/dist/analyzers/documentationAnalyzerCompat.js +52 -0
- package/dist/analyzers/documentationAnalyzerCompat.js.map +1 -0
- package/dist/analyzers/dryAnalyzerCompat.d.ts +20 -0
- package/dist/analyzers/dryAnalyzerCompat.d.ts.map +1 -0
- package/dist/analyzers/dryAnalyzerCompat.js +44 -0
- package/dist/analyzers/dryAnalyzerCompat.js.map +1 -0
- package/dist/analyzers/schemaAnalyzer.d.ts +21 -0
- package/dist/analyzers/schemaAnalyzer.d.ts.map +1 -0
- package/dist/analyzers/schemaAnalyzer.js +405 -0
- package/dist/analyzers/schemaAnalyzer.js.map +1 -0
- package/dist/analyzers/schemaAnalyzerCompat.d.ts +20 -0
- package/dist/analyzers/schemaAnalyzerCompat.d.ts.map +1 -0
- package/dist/analyzers/schemaAnalyzerCompat.js +69 -0
- package/dist/analyzers/schemaAnalyzerCompat.js.map +1 -0
- package/dist/analyzers/solidAnalyzerCompat.d.ts +20 -0
- package/dist/analyzers/solidAnalyzerCompat.d.ts.map +1 -0
- package/dist/analyzers/solidAnalyzerCompat.js +78 -0
- package/dist/analyzers/solidAnalyzerCompat.js.map +1 -0
- package/dist/analyzers/universal/UniversalDRYAnalyzer.d.ts +71 -0
- package/dist/analyzers/universal/UniversalDRYAnalyzer.d.ts.map +1 -0
- package/dist/analyzers/universal/UniversalDRYAnalyzer.js +276 -0
- package/dist/analyzers/universal/UniversalDRYAnalyzer.js.map +1 -0
- package/dist/analyzers/universal/UniversalDataAccessAnalyzer.d.ts +82 -0
- package/dist/analyzers/universal/UniversalDataAccessAnalyzer.d.ts.map +1 -0
- package/dist/analyzers/universal/UniversalDataAccessAnalyzer.js +489 -0
- package/dist/analyzers/universal/UniversalDataAccessAnalyzer.js.map +1 -0
- package/dist/analyzers/universal/UniversalDocumentationAnalyzer.d.ts +48 -0
- package/dist/analyzers/universal/UniversalDocumentationAnalyzer.d.ts.map +1 -0
- package/dist/analyzers/universal/UniversalDocumentationAnalyzer.js +175 -0
- package/dist/analyzers/universal/UniversalDocumentationAnalyzer.js.map +1 -0
- package/dist/analyzers/universal/UniversalSOLIDAnalyzer.d.ts +64 -0
- package/dist/analyzers/universal/UniversalSOLIDAnalyzer.d.ts.map +1 -0
- package/dist/analyzers/universal/UniversalSOLIDAnalyzer.js +286 -0
- package/dist/analyzers/universal/UniversalSOLIDAnalyzer.js.map +1 -0
- package/dist/analyzers/universal/UniversalSchemaAnalyzer.d.ts +119 -0
- package/dist/analyzers/universal/UniversalSchemaAnalyzer.d.ts.map +1 -0
- package/dist/analyzers/universal/UniversalSchemaAnalyzer.js +812 -0
- package/dist/analyzers/universal/UniversalSchemaAnalyzer.js.map +1 -0
- package/dist/auditRunner.d.ts.map +1 -1
- package/dist/auditRunner.js +23 -7
- package/dist/auditRunner.js.map +1 -1
- package/dist/codeIndexDB-enhanced.d.ts +80 -0
- package/dist/codeIndexDB-enhanced.d.ts.map +1 -0
- package/dist/codeIndexDB-enhanced.js +488 -0
- package/dist/codeIndexDB-enhanced.js.map +1 -0
- package/dist/codeIndexDb.d.ts +70 -1
- package/dist/codeIndexDb.d.ts.map +1 -1
- package/dist/codeIndexDb.js +199 -2
- package/dist/codeIndexDb.js.map +1 -1
- package/dist/config/defaults.js +1 -1
- package/dist/config/defaults.js.map +1 -1
- package/dist/languages/LanguageOrchestrator.d.ts +181 -0
- package/dist/languages/LanguageOrchestrator.d.ts.map +1 -0
- package/dist/languages/LanguageOrchestrator.js +365 -0
- package/dist/languages/LanguageOrchestrator.js.map +1 -0
- package/dist/languages/LanguageRegistry.d.ts +43 -0
- package/dist/languages/LanguageRegistry.d.ts.map +1 -0
- package/dist/languages/LanguageRegistry.js +86 -0
- package/dist/languages/LanguageRegistry.js.map +1 -0
- package/dist/languages/RuntimeManager.d.ts +181 -0
- package/dist/languages/RuntimeManager.d.ts.map +1 -0
- package/dist/languages/RuntimeManager.js +841 -0
- package/dist/languages/RuntimeManager.js.map +1 -0
- package/dist/languages/UniversalAnalyzer.d.ts +37 -0
- package/dist/languages/UniversalAnalyzer.d.ts.map +1 -0
- package/dist/languages/UniversalAnalyzer.js +101 -0
- package/dist/languages/UniversalAnalyzer.js.map +1 -0
- package/dist/languages/go/GoAdapter.d.ts +57 -0
- package/dist/languages/go/GoAdapter.d.ts.map +1 -0
- package/dist/languages/go/GoAdapter.js +360 -0
- package/dist/languages/go/GoAdapter.js.map +1 -0
- package/dist/languages/index.d.ts +13 -0
- package/dist/languages/index.d.ts.map +1 -0
- package/dist/languages/index.js +23 -0
- package/dist/languages/index.js.map +1 -0
- package/dist/languages/types.d.ts +182 -0
- package/dist/languages/types.d.ts.map +1 -0
- package/dist/languages/types.js +5 -0
- package/dist/languages/types.js.map +1 -0
- package/dist/languages/typescript/TypeScriptAdapter.d.ts +108 -0
- package/dist/languages/typescript/TypeScriptAdapter.d.ts.map +1 -0
- package/dist/languages/typescript/TypeScriptAdapter.js +567 -0
- package/dist/languages/typescript/TypeScriptAdapter.js.map +1 -0
- package/dist/languages/typescript/test-extraction.d.ts +2 -0
- package/dist/languages/typescript/test-extraction.d.ts.map +1 -0
- package/dist/languages/typescript/test-extraction.js +36 -0
- package/dist/languages/typescript/test-extraction.js.map +1 -0
- package/dist/mcp-hybrid.d.ts +10 -0
- package/dist/mcp-hybrid.d.ts.map +1 -0
- package/dist/mcp-hybrid.js +41 -0
- package/dist/mcp-hybrid.js.map +1 -0
- package/dist/mcp-index.d.ts +11 -0
- package/dist/mcp-index.d.ts.map +1 -0
- package/dist/mcp-index.js +101 -0
- package/dist/mcp-index.js.map +1 -0
- package/dist/mcp-tools/workflowGuide.d.ts.map +1 -1
- package/dist/mcp-tools/workflowGuide.js +67 -10
- package/dist/mcp-tools/workflowGuide.js.map +1 -1
- package/dist/mcp-tools-shared.d.ts +49 -0
- package/dist/mcp-tools-shared.d.ts.map +1 -0
- package/dist/mcp-tools-shared.js +1282 -0
- package/dist/mcp-tools-shared.js.map +1 -0
- package/dist/mcp-ui-server.d.ts +27 -0
- package/dist/mcp-ui-server.d.ts.map +1 -0
- package/dist/mcp-ui-server.js +484 -0
- package/dist/mcp-ui-server.js.map +1 -0
- package/dist/mcp-ui-simple.d.ts +27 -0
- package/dist/mcp-ui-simple.d.ts.map +1 -0
- package/dist/mcp-ui-simple.js +425 -0
- package/dist/mcp-ui-simple.js.map +1 -0
- package/dist/mcp.js +7 -4
- package/dist/mcp.js.map +1 -1
- package/dist/services/SchemaParser.d.ts +89 -0
- package/dist/services/SchemaParser.d.ts.map +1 -0
- package/dist/services/SchemaParser.js +434 -0
- package/dist/services/SchemaParser.js.map +1 -0
- package/dist/types/crossLanguage.d.ts +267 -0
- package/dist/types/crossLanguage.d.ts.map +1 -0
- package/dist/types/crossLanguage.js +6 -0
- package/dist/types/crossLanguage.js.map +1 -0
- package/dist/types.d.ts +128 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/dist/utils/fileDiscovery.d.ts +6 -0
- package/dist/utils/fileDiscovery.d.ts.map +1 -1
- package/dist/utils/fileDiscovery.js +12 -1
- package/dist/utils/fileDiscovery.js.map +1 -1
- package/examples/schema-example.json +364 -0
- package/examples/schema-example.yaml +137 -0
- package/package.json +10 -3
|
@@ -0,0 +1,405 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Schema Analyzer
|
|
3
|
+
* Analyzes code against loaded database schemas to find violations and patterns
|
|
4
|
+
*/
|
|
5
|
+
import { CodeIndexDB } from '../codeIndexDB.js';
|
|
6
|
+
import { promises as fs } from 'fs';
|
|
7
|
+
import path from 'path';
|
|
8
|
+
import ts from 'typescript';
|
|
9
|
+
const DEFAULT_CONFIG = {
|
|
10
|
+
enableTableUsageTracking: true,
|
|
11
|
+
checkMissingReferences: true,
|
|
12
|
+
checkNamingConventions: true,
|
|
13
|
+
detectUnusedTables: false,
|
|
14
|
+
validateQueryPatterns: true,
|
|
15
|
+
maxQueriesPerFunction: 5,
|
|
16
|
+
allowedQueryPatterns: ['SELECT', 'INSERT', 'UPDATE', 'DELETE'],
|
|
17
|
+
requiredSchemas: []
|
|
18
|
+
};
|
|
19
|
+
export const analyzeSchema = async (files, config = {}, options = {}, progressCallback) => {
|
|
20
|
+
const finalConfig = { ...DEFAULT_CONFIG, ...config };
|
|
21
|
+
const violations = [];
|
|
22
|
+
const errors = [];
|
|
23
|
+
let filesProcessed = 0;
|
|
24
|
+
const startTime = Date.now();
|
|
25
|
+
// Get database handle
|
|
26
|
+
const db = CodeIndexDB.getInstance();
|
|
27
|
+
await db.initialize();
|
|
28
|
+
// Get all loaded schemas
|
|
29
|
+
const loadedSchemas = await db.getAllSchemas();
|
|
30
|
+
if (loadedSchemas.length === 0 && finalConfig.requiredSchemas.length > 0) {
|
|
31
|
+
violations.push({
|
|
32
|
+
file: 'project',
|
|
33
|
+
severity: 'warning',
|
|
34
|
+
message: 'No database schemas loaded for analysis',
|
|
35
|
+
schemaType: 'missing-reference',
|
|
36
|
+
details: 'Load schema definitions using schema management tools'
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
// Build table name lookup for fast access
|
|
40
|
+
const allTables = new Set();
|
|
41
|
+
const tableToSchema = new Map();
|
|
42
|
+
for (const { schema } of loadedSchemas) {
|
|
43
|
+
for (const database of schema.databases) {
|
|
44
|
+
for (const table of database.tables) {
|
|
45
|
+
allTables.add(table.name);
|
|
46
|
+
tableToSchema.set(table.name, schema.name);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
// Analyze each file
|
|
51
|
+
for (const file of files) {
|
|
52
|
+
try {
|
|
53
|
+
progressCallback?.({
|
|
54
|
+
current: filesProcessed,
|
|
55
|
+
total: files.length,
|
|
56
|
+
analyzer: 'schema',
|
|
57
|
+
file: path.basename(file),
|
|
58
|
+
phase: 'analyzing'
|
|
59
|
+
});
|
|
60
|
+
// Skip non-source files
|
|
61
|
+
if (!file.match(/\.(ts|tsx|js|jsx)$/)) {
|
|
62
|
+
continue;
|
|
63
|
+
}
|
|
64
|
+
const content = await fs.readFile(file, 'utf-8');
|
|
65
|
+
const fileViolations = await analyzeFile(file, content, allTables, tableToSchema, finalConfig, db);
|
|
66
|
+
violations.push(...fileViolations);
|
|
67
|
+
filesProcessed++;
|
|
68
|
+
}
|
|
69
|
+
catch (error) {
|
|
70
|
+
errors.push({
|
|
71
|
+
file,
|
|
72
|
+
error: error instanceof Error ? error.message : 'Unknown error'
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
return {
|
|
77
|
+
violations,
|
|
78
|
+
filesProcessed,
|
|
79
|
+
executionTime: Date.now() - startTime,
|
|
80
|
+
errors: errors.length > 0 ? errors : undefined,
|
|
81
|
+
analyzerName: 'schema',
|
|
82
|
+
metadata: {
|
|
83
|
+
loadedSchemas: loadedSchemas.length,
|
|
84
|
+
totalTables: allTables.size,
|
|
85
|
+
config: finalConfig
|
|
86
|
+
}
|
|
87
|
+
};
|
|
88
|
+
};
|
|
89
|
+
async function analyzeFile(filePath, content, allTables, tableToSchema, config, db) {
|
|
90
|
+
const violations = [];
|
|
91
|
+
// Parse TypeScript/JavaScript
|
|
92
|
+
const sourceFile = ts.createSourceFile(filePath, content, ts.ScriptTarget.Latest, true);
|
|
93
|
+
// Track schema usage for this file
|
|
94
|
+
const schemaUsages = [];
|
|
95
|
+
// Analyze the AST
|
|
96
|
+
function visit(node, currentFunction) {
|
|
97
|
+
// Detect ORM-specific patterns
|
|
98
|
+
// 1. Drizzle ORM - Functional table definitions
|
|
99
|
+
if (ts.isCallExpression(node) && ts.isIdentifier(node.expression)) {
|
|
100
|
+
const funcName = node.expression.text;
|
|
101
|
+
if (['pgTable', 'mysqlTable', 'sqliteTable'].includes(funcName)) {
|
|
102
|
+
const tableName = extractTableNameFromDrizzle(node);
|
|
103
|
+
if (tableName) {
|
|
104
|
+
const pos = sourceFile.getLineAndCharacterOfPosition(node.getStart());
|
|
105
|
+
schemaUsages.push({
|
|
106
|
+
tableName,
|
|
107
|
+
functionName: currentFunction || 'schema-definition',
|
|
108
|
+
usageType: 'reference',
|
|
109
|
+
line: pos.line + 1,
|
|
110
|
+
column: pos.character + 1
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
// 2. TypeORM - Entity decorators
|
|
116
|
+
if (ts.isDecorator(node) && ts.isCallExpression(node.expression)) {
|
|
117
|
+
const decoratorName = getDecoratorName(node.expression);
|
|
118
|
+
if (decoratorName === 'Entity') {
|
|
119
|
+
// Extract table name from Entity decorator
|
|
120
|
+
const tableName = extractTableNameFromTypeORM(node.expression);
|
|
121
|
+
if (tableName) {
|
|
122
|
+
const pos = sourceFile.getLineAndCharacterOfPosition(node.getStart());
|
|
123
|
+
schemaUsages.push({
|
|
124
|
+
tableName,
|
|
125
|
+
functionName: currentFunction || 'entity-definition',
|
|
126
|
+
usageType: 'reference',
|
|
127
|
+
line: pos.line + 1,
|
|
128
|
+
column: pos.character + 1
|
|
129
|
+
});
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
// 3. Mongoose - Schema constructors
|
|
134
|
+
if (ts.isNewExpression(node) && ts.isIdentifier(node.expression)) {
|
|
135
|
+
if (node.expression.text === 'Schema') {
|
|
136
|
+
// Analyze schema object literal for field references
|
|
137
|
+
analyzeMongooseSchema(node, currentFunction);
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
// 4. Prisma Client - Table access patterns
|
|
141
|
+
if (ts.isPropertyAccessExpression(node)) {
|
|
142
|
+
const propertyName = node.name.text;
|
|
143
|
+
// Check if this looks like Prisma client table access (prisma.user.findMany)
|
|
144
|
+
if (isPrismaBoundProperty(node)) {
|
|
145
|
+
const pos = sourceFile.getLineAndCharacterOfPosition(node.getStart());
|
|
146
|
+
schemaUsages.push({
|
|
147
|
+
tableName: propertyName,
|
|
148
|
+
functionName: currentFunction || 'unknown',
|
|
149
|
+
usageType: 'query',
|
|
150
|
+
line: pos.line + 1,
|
|
151
|
+
column: pos.character + 1
|
|
152
|
+
});
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
// 5. Detect SQL queries and table references (existing logic)
|
|
156
|
+
if (ts.isStringLiteral(node) || ts.isTemplateExpression(node)) {
|
|
157
|
+
const queryText = getQueryText(node);
|
|
158
|
+
if (queryText) {
|
|
159
|
+
const queryAnalysis = analyzeQuery(queryText, allTables, filePath);
|
|
160
|
+
violations.push(...queryAnalysis.violations);
|
|
161
|
+
// Record schema usage
|
|
162
|
+
for (const table of queryAnalysis.tables) {
|
|
163
|
+
const pos = sourceFile.getLineAndCharacterOfPosition(node.getStart());
|
|
164
|
+
schemaUsages.push({
|
|
165
|
+
tableName: table,
|
|
166
|
+
functionName: currentFunction || 'unknown',
|
|
167
|
+
usageType: queryAnalysis.type,
|
|
168
|
+
line: pos.line + 1,
|
|
169
|
+
column: pos.character + 1,
|
|
170
|
+
rawQuery: queryText
|
|
171
|
+
});
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
// Detect ORM/model references
|
|
176
|
+
if (ts.isPropertyAccessExpression(node)) {
|
|
177
|
+
const propertyName = node.name.text;
|
|
178
|
+
if (allTables.has(propertyName)) {
|
|
179
|
+
const pos = sourceFile.getLineAndCharacterOfPosition(node.getStart());
|
|
180
|
+
schemaUsages.push({
|
|
181
|
+
tableName: propertyName,
|
|
182
|
+
functionName: currentFunction || 'unknown',
|
|
183
|
+
usageType: 'reference',
|
|
184
|
+
line: pos.line + 1,
|
|
185
|
+
column: pos.character + 1
|
|
186
|
+
});
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
// Track current function context
|
|
190
|
+
let funcName = currentFunction;
|
|
191
|
+
if (ts.isFunctionDeclaration(node) || ts.isMethodDeclaration(node) || ts.isArrowFunction(node)) {
|
|
192
|
+
if (ts.isFunctionDeclaration(node) && node.name) {
|
|
193
|
+
funcName = node.name.text;
|
|
194
|
+
}
|
|
195
|
+
else if (ts.isMethodDeclaration(node) && ts.isIdentifier(node.name)) {
|
|
196
|
+
funcName = node.name.text;
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
ts.forEachChild(node, child => visit(child, funcName));
|
|
200
|
+
}
|
|
201
|
+
visit(sourceFile);
|
|
202
|
+
// Record schema usages in database
|
|
203
|
+
if (config.enableTableUsageTracking) {
|
|
204
|
+
for (const usage of schemaUsages) {
|
|
205
|
+
await db.recordSchemaUsage({
|
|
206
|
+
tableName: usage.tableName,
|
|
207
|
+
filePath,
|
|
208
|
+
functionName: usage.functionName,
|
|
209
|
+
usageType: usage.usageType,
|
|
210
|
+
line: usage.line,
|
|
211
|
+
column: usage.column,
|
|
212
|
+
rawQuery: usage.rawQuery
|
|
213
|
+
});
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
// Check for violations
|
|
217
|
+
if (config.checkMissingReferences) {
|
|
218
|
+
violations.push(...checkMissingTableReferences(schemaUsages, allTables, filePath));
|
|
219
|
+
}
|
|
220
|
+
if (config.validateQueryPatterns) {
|
|
221
|
+
violations.push(...validateQueryPatterns(schemaUsages, config, filePath));
|
|
222
|
+
}
|
|
223
|
+
return violations;
|
|
224
|
+
}
|
|
225
|
+
function getQueryText(node) {
|
|
226
|
+
if (ts.isStringLiteral(node)) {
|
|
227
|
+
const text = node.text.toUpperCase();
|
|
228
|
+
// Check if it looks like SQL
|
|
229
|
+
if (text.includes('SELECT') || text.includes('INSERT') ||
|
|
230
|
+
text.includes('UPDATE') || text.includes('DELETE') ||
|
|
231
|
+
text.includes('CREATE') || text.includes('DROP')) {
|
|
232
|
+
return node.text;
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
if (ts.isTemplateExpression(node)) {
|
|
236
|
+
// For template literals, check the head
|
|
237
|
+
const headText = node.head.text.toUpperCase();
|
|
238
|
+
if (headText.includes('SELECT') || headText.includes('INSERT') ||
|
|
239
|
+
headText.includes('UPDATE') || headText.includes('DELETE')) {
|
|
240
|
+
// Return a simplified version for analysis
|
|
241
|
+
return node.head.text + ' ...';
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
return null;
|
|
245
|
+
}
|
|
246
|
+
function analyzeQuery(query, allTables, filePath) {
|
|
247
|
+
const violations = [];
|
|
248
|
+
const tables = [];
|
|
249
|
+
const queryUpper = query.toUpperCase();
|
|
250
|
+
let type = 'query';
|
|
251
|
+
if (queryUpper.includes('SELECT'))
|
|
252
|
+
type = 'query';
|
|
253
|
+
else if (queryUpper.includes('INSERT'))
|
|
254
|
+
type = 'insert';
|
|
255
|
+
else if (queryUpper.includes('UPDATE'))
|
|
256
|
+
type = 'update';
|
|
257
|
+
else if (queryUpper.includes('DELETE'))
|
|
258
|
+
type = 'delete';
|
|
259
|
+
// Extract table names (basic regex - could be enhanced)
|
|
260
|
+
const tableMatches = query.match(/(?:FROM|JOIN|INTO|UPDATE)\s+([a-zA-Z_][a-zA-Z0-9_]*)/gi);
|
|
261
|
+
if (tableMatches) {
|
|
262
|
+
for (const match of tableMatches) {
|
|
263
|
+
const tableName = match.split(/\s+/).pop();
|
|
264
|
+
if (tableName && !allTables.has(tableName)) {
|
|
265
|
+
violations.push({
|
|
266
|
+
file: filePath,
|
|
267
|
+
severity: 'warning',
|
|
268
|
+
message: `Table '${tableName}' not found in loaded schemas`,
|
|
269
|
+
schemaType: 'missing-reference',
|
|
270
|
+
tableName,
|
|
271
|
+
snippet: query.substring(0, 100),
|
|
272
|
+
suggestion: 'Load the appropriate database schema or check table name spelling'
|
|
273
|
+
});
|
|
274
|
+
}
|
|
275
|
+
else if (tableName) {
|
|
276
|
+
tables.push(tableName);
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
return { violations, tables, type };
|
|
281
|
+
}
|
|
282
|
+
function checkMissingTableReferences(usages, allTables, filePath) {
|
|
283
|
+
const violations = [];
|
|
284
|
+
for (const usage of usages) {
|
|
285
|
+
if (!allTables.has(usage.tableName)) {
|
|
286
|
+
violations.push({
|
|
287
|
+
file: filePath,
|
|
288
|
+
line: usage.line,
|
|
289
|
+
severity: 'warning',
|
|
290
|
+
message: `Reference to unknown table '${usage.tableName}'`,
|
|
291
|
+
schemaType: 'missing-reference',
|
|
292
|
+
tableName: usage.tableName,
|
|
293
|
+
suggestion: 'Load the database schema that contains this table'
|
|
294
|
+
});
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
return violations;
|
|
298
|
+
}
|
|
299
|
+
function validateQueryPatterns(usages, config, filePath) {
|
|
300
|
+
const violations = [];
|
|
301
|
+
// Count queries per function
|
|
302
|
+
const queriesPerFunction = usages.reduce((acc, usage) => {
|
|
303
|
+
if (usage.usageType !== 'reference') {
|
|
304
|
+
acc[usage.functionName] = (acc[usage.functionName] || 0) + 1;
|
|
305
|
+
}
|
|
306
|
+
return acc;
|
|
307
|
+
}, {});
|
|
308
|
+
// Check for functions with too many queries
|
|
309
|
+
for (const [funcName, count] of Object.entries(queriesPerFunction)) {
|
|
310
|
+
if (count > config.maxQueriesPerFunction) {
|
|
311
|
+
violations.push({
|
|
312
|
+
file: filePath,
|
|
313
|
+
severity: 'suggestion',
|
|
314
|
+
message: `Function '${funcName}' has ${count} database queries (max recommended: ${config.maxQueriesPerFunction})`,
|
|
315
|
+
schemaType: 'missing-reference',
|
|
316
|
+
suggestion: 'Consider consolidating queries or extracting to a data access layer'
|
|
317
|
+
});
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
return violations;
|
|
321
|
+
}
|
|
322
|
+
// ORM-specific helper functions
|
|
323
|
+
function extractTableNameFromDrizzle(node) {
|
|
324
|
+
// Drizzle: pgTable('table_name', { ... })
|
|
325
|
+
if (node.arguments.length > 0 && ts.isStringLiteral(node.arguments[0])) {
|
|
326
|
+
return node.arguments[0].text;
|
|
327
|
+
}
|
|
328
|
+
return null;
|
|
329
|
+
}
|
|
330
|
+
function getDecoratorName(node) {
|
|
331
|
+
if (ts.isIdentifier(node.expression)) {
|
|
332
|
+
return node.expression.text;
|
|
333
|
+
}
|
|
334
|
+
return null;
|
|
335
|
+
}
|
|
336
|
+
function extractTableNameFromTypeORM(node) {
|
|
337
|
+
// TypeORM: @Entity('table_name') or @Entity({ name: 'table_name' })
|
|
338
|
+
if (node.arguments.length > 0) {
|
|
339
|
+
const firstArg = node.arguments[0];
|
|
340
|
+
if (ts.isStringLiteral(firstArg)) {
|
|
341
|
+
return firstArg.text;
|
|
342
|
+
}
|
|
343
|
+
if (ts.isObjectLiteralExpression(firstArg)) {
|
|
344
|
+
// Look for name property
|
|
345
|
+
for (const prop of firstArg.properties) {
|
|
346
|
+
if (ts.isPropertyAssignment(prop) &&
|
|
347
|
+
ts.isIdentifier(prop.name) &&
|
|
348
|
+
prop.name.text === 'name' &&
|
|
349
|
+
ts.isStringLiteral(prop.initializer)) {
|
|
350
|
+
return prop.initializer.text;
|
|
351
|
+
}
|
|
352
|
+
}
|
|
353
|
+
}
|
|
354
|
+
}
|
|
355
|
+
return null;
|
|
356
|
+
}
|
|
357
|
+
function analyzeMongooseSchema(node, currentFunction) {
|
|
358
|
+
// Mongoose: new Schema({ field: { type: String, ref: 'OtherModel' } })
|
|
359
|
+
if (node.arguments && node.arguments.length > 0) {
|
|
360
|
+
const schemaArg = node.arguments[0];
|
|
361
|
+
if (ts.isObjectLiteralExpression(schemaArg)) {
|
|
362
|
+
// Look for ref properties that indicate relationships
|
|
363
|
+
analyzeObjectForReferences(schemaArg, currentFunction);
|
|
364
|
+
}
|
|
365
|
+
}
|
|
366
|
+
}
|
|
367
|
+
function analyzeObjectForReferences(obj, currentFunction) {
|
|
368
|
+
for (const prop of obj.properties) {
|
|
369
|
+
if (ts.isPropertyAssignment(prop) && ts.isObjectLiteralExpression(prop.initializer)) {
|
|
370
|
+
// Look for ref property
|
|
371
|
+
for (const nestedProp of prop.initializer.properties) {
|
|
372
|
+
if (ts.isPropertyAssignment(nestedProp) &&
|
|
373
|
+
ts.isIdentifier(nestedProp.name) &&
|
|
374
|
+
nestedProp.name.text === 'ref' &&
|
|
375
|
+
ts.isStringLiteral(nestedProp.initializer)) {
|
|
376
|
+
// Found a reference to another model
|
|
377
|
+
const referencedModel = nestedProp.initializer.text;
|
|
378
|
+
// Add to schema usage tracking
|
|
379
|
+
// This would need access to the parent scope's schemaUsages array
|
|
380
|
+
}
|
|
381
|
+
}
|
|
382
|
+
}
|
|
383
|
+
}
|
|
384
|
+
}
|
|
385
|
+
function isPrismaBoundProperty(node) {
|
|
386
|
+
// Check if this looks like prisma.tableName.operation
|
|
387
|
+
if (ts.isPropertyAccessExpression(node.expression) &&
|
|
388
|
+
ts.isIdentifier(node.expression.expression)) {
|
|
389
|
+
const baseName = node.expression.expression.text;
|
|
390
|
+
// Common Prisma client variable names
|
|
391
|
+
return ['prisma', 'db', 'client'].includes(baseName.toLowerCase());
|
|
392
|
+
}
|
|
393
|
+
return false;
|
|
394
|
+
}
|
|
395
|
+
/**
|
|
396
|
+
* Schema Analyzer Definition
|
|
397
|
+
*/
|
|
398
|
+
export const schemaAnalyzer = {
|
|
399
|
+
name: 'schema',
|
|
400
|
+
analyze: analyzeSchema,
|
|
401
|
+
defaultConfig: DEFAULT_CONFIG,
|
|
402
|
+
description: 'Analyzes code against loaded database schemas to detect violations and track usage patterns',
|
|
403
|
+
category: 'Data Access'
|
|
404
|
+
};
|
|
405
|
+
//# sourceMappingURL=schemaAnalyzer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schemaAnalyzer.js","sourceRoot":"","sources":["../../src/analyzers/schemaAnalyzer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Compatibility layer for Schema Analyzer
|
|
3
|
+
* Ensures the new universal analyzer produces similar results to the legacy one
|
|
4
|
+
*/
|
|
5
|
+
import type { AnalyzerFunction } from '../types.js';
|
|
6
|
+
/**
|
|
7
|
+
* Legacy-compatible schema analyzer function
|
|
8
|
+
* This wraps the new UniversalSchemaAnalyzer to maintain API compatibility
|
|
9
|
+
*/
|
|
10
|
+
export declare const analyzeSchema: AnalyzerFunction;
|
|
11
|
+
/**
|
|
12
|
+
* Analyzer definition for registration
|
|
13
|
+
*/
|
|
14
|
+
export declare const schemaAnalyzer: {
|
|
15
|
+
name: string;
|
|
16
|
+
description: string;
|
|
17
|
+
category: string;
|
|
18
|
+
analyze: AnalyzerFunction;
|
|
19
|
+
};
|
|
20
|
+
//# sourceMappingURL=schemaAnalyzerCompat.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schemaAnalyzerCompat.d.ts","sourceRoot":"","sources":["../../src/analyzers/schemaAnalyzerCompat.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAQpD;;;GAGG;AACH,eAAO,MAAM,aAAa,EAAE,gBAyD3B,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,cAAc;;;;;CAK1B,CAAC"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Compatibility layer for Schema Analyzer
|
|
3
|
+
* Ensures the new universal analyzer produces similar results to the legacy one
|
|
4
|
+
*/
|
|
5
|
+
import { UniversalSchemaAnalyzer } from './universal/UniversalSchemaAnalyzer.js';
|
|
6
|
+
import { initializeLanguages } from '../languages/index.js';
|
|
7
|
+
import { CodeIndexDB } from '../codeIndexDB.js';
|
|
8
|
+
// Initialize language system on module load
|
|
9
|
+
initializeLanguages();
|
|
10
|
+
/**
|
|
11
|
+
* Legacy-compatible schema analyzer function
|
|
12
|
+
* This wraps the new UniversalSchemaAnalyzer to maintain API compatibility
|
|
13
|
+
*/
|
|
14
|
+
export const analyzeSchema = async (files, config = {}, options = {}, progressCallback) => {
|
|
15
|
+
const analyzer = new UniversalSchemaAnalyzer();
|
|
16
|
+
// Get loaded schemas from database if available
|
|
17
|
+
let schemas = [];
|
|
18
|
+
try {
|
|
19
|
+
const db = CodeIndexDB.getInstance();
|
|
20
|
+
await db.initialize();
|
|
21
|
+
const loadedSchemas = await db.getAllSchemas();
|
|
22
|
+
// Convert database schemas to universal format
|
|
23
|
+
schemas = loadedSchemas.map(({ schema }) => ({
|
|
24
|
+
name: schema.name,
|
|
25
|
+
tables: schema.databases.flatMap(db => db.tables.map(table => ({
|
|
26
|
+
name: table.name,
|
|
27
|
+
columns: table.columns || []
|
|
28
|
+
})))
|
|
29
|
+
}));
|
|
30
|
+
}
|
|
31
|
+
catch (error) {
|
|
32
|
+
// If database isn't available, continue without schemas
|
|
33
|
+
console.warn('Schema database not available:', error);
|
|
34
|
+
}
|
|
35
|
+
// Map legacy config to universal config
|
|
36
|
+
const universalConfig = {
|
|
37
|
+
enableTableUsageTracking: config.enableTableUsageTracking ?? true,
|
|
38
|
+
checkMissingReferences: config.checkMissingReferences ?? true,
|
|
39
|
+
checkNamingConventions: config.checkNamingConventions ?? true,
|
|
40
|
+
detectUnusedTables: config.detectUnusedTables ?? false,
|
|
41
|
+
validateQueryPatterns: config.validateQueryPatterns ?? true,
|
|
42
|
+
maxQueriesPerFunction: config.maxQueriesPerFunction ?? 5,
|
|
43
|
+
requiredSchemas: config.requiredSchemas ?? [],
|
|
44
|
+
schemas // Pass loaded schemas
|
|
45
|
+
};
|
|
46
|
+
// Call the universal analyzer
|
|
47
|
+
const result = await analyzer.analyze(files, universalConfig);
|
|
48
|
+
// Transform violations to match legacy format
|
|
49
|
+
const transformedViolations = result.violations.map(v => ({
|
|
50
|
+
...v,
|
|
51
|
+
schemaType: v.rule,
|
|
52
|
+
details: v.message,
|
|
53
|
+
analyzer: 'schema'
|
|
54
|
+
}));
|
|
55
|
+
return {
|
|
56
|
+
...result,
|
|
57
|
+
violations: transformedViolations
|
|
58
|
+
};
|
|
59
|
+
};
|
|
60
|
+
/**
|
|
61
|
+
* Analyzer definition for registration
|
|
62
|
+
*/
|
|
63
|
+
export const schemaAnalyzer = {
|
|
64
|
+
name: 'schema',
|
|
65
|
+
description: 'Analyzes code against database schemas',
|
|
66
|
+
category: 'database',
|
|
67
|
+
analyze: analyzeSchema
|
|
68
|
+
};
|
|
69
|
+
//# sourceMappingURL=schemaAnalyzerCompat.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schemaAnalyzerCompat.js","sourceRoot":"","sources":["../../src/analyzers/schemaAnalyzerCompat.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,uBAAuB,EAAE,MAAM,wCAAwC,CAAC;AACjF,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEhD,4CAA4C;AAC5C,mBAAmB,EAAE,CAAC;AAEtB;;;GAGG;AACH,MAAM,CAAC,MAAM,aAAa,GAAqB,KAAK,EAClD,KAAe,EACf,SAAc,EAAE,EAChB,OAAO,GAAG,EAAE,EACZ,gBAAgB,EAChB,EAAE;IACF,MAAM,QAAQ,GAAG,IAAI,uBAAuB,EAAE,CAAC;IAE/C,gDAAgD;IAChD,IAAI,OAAO,GAAU,EAAE,CAAC;IACxB,IAAI,CAAC;QACH,MAAM,EAAE,GAAG,WAAW,CAAC,WAAW,EAAE,CAAC;QACrC,MAAM,EAAE,CAAC,UAAU,EAAE,CAAC;QACtB,MAAM,aAAa,GAAG,MAAM,EAAE,CAAC,aAAa,EAAE,CAAC;QAE/C,+CAA+C;QAC/C,OAAO,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,CAAC;YAC3C,IAAI,EAAE,MAAM,CAAC,IAAI;YACjB,MAAM,EAAE,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,CACpC,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;gBACtB,IAAI,EAAE,KAAK,CAAC,IAAI;gBAChB,OAAO,EAAE,KAAK,CAAC,OAAO,IAAI,EAAE;aAC7B,CAAC,CAAC,CACJ;SACF,CAAC,CAAC,CAAC;IACN,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,wDAAwD;QACxD,OAAO,CAAC,IAAI,CAAC,gCAAgC,EAAE,KAAK,CAAC,CAAC;IACxD,CAAC;IAED,wCAAwC;IACxC,MAAM,eAAe,GAAG;QACtB,wBAAwB,EAAE,MAAM,CAAC,wBAAwB,IAAI,IAAI;QACjE,sBAAsB,EAAE,MAAM,CAAC,sBAAsB,IAAI,IAAI;QAC7D,sBAAsB,EAAE,MAAM,CAAC,sBAAsB,IAAI,IAAI;QAC7D,kBAAkB,EAAE,MAAM,CAAC,kBAAkB,IAAI,KAAK;QACtD,qBAAqB,EAAE,MAAM,CAAC,qBAAqB,IAAI,IAAI;QAC3D,qBAAqB,EAAE,MAAM,CAAC,qBAAqB,IAAI,CAAC;QACxD,eAAe,EAAE,MAAM,CAAC,eAAe,IAAI,EAAE;QAC7C,OAAO,CAAC,sBAAsB;KAC/B,CAAC;IAEF,8BAA8B;IAC9B,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,eAAe,CAAC,CAAC;IAE9D,8CAA8C;IAC9C,MAAM,qBAAqB,GAAG,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QACxD,GAAG,CAAC;QACJ,UAAU,EAAE,CAAC,CAAC,IAAI;QAClB,OAAO,EAAE,CAAC,CAAC,OAAO;QAClB,QAAQ,EAAE,QAAQ;KACnB,CAAC,CAAC,CAAC;IAEJ,OAAO;QACL,GAAG,MAAM;QACT,UAAU,EAAE,qBAAqB;KAClC,CAAC;AACJ,CAAC,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG;IAC5B,IAAI,EAAE,QAAQ;IACd,WAAW,EAAE,wCAAwC;IACrD,QAAQ,EAAE,UAAU;IACpB,OAAO,EAAE,aAAa;CACvB,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Compatibility layer for SOLID Analyzer
|
|
3
|
+
* Ensures the new universal analyzer produces similar results to the legacy one
|
|
4
|
+
*/
|
|
5
|
+
import type { AnalyzerFunction } from '../types.js';
|
|
6
|
+
/**
|
|
7
|
+
* Legacy-compatible SOLID analyzer function
|
|
8
|
+
* This wraps the new UniversalSOLIDAnalyzer to maintain API compatibility
|
|
9
|
+
*/
|
|
10
|
+
export declare const analyzeSOLID: AnalyzerFunction;
|
|
11
|
+
/**
|
|
12
|
+
* Analyzer definition for registration
|
|
13
|
+
*/
|
|
14
|
+
export declare const solidAnalyzer: {
|
|
15
|
+
name: string;
|
|
16
|
+
description: string;
|
|
17
|
+
category: string;
|
|
18
|
+
analyze: AnalyzerFunction;
|
|
19
|
+
};
|
|
20
|
+
//# sourceMappingURL=solidAnalyzerCompat.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"solidAnalyzerCompat.d.ts","sourceRoot":"","sources":["../../src/analyzers/solidAnalyzerCompat.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAOpD;;;GAGG;AACH,eAAO,MAAM,YAAY,EAAE,gBAuD1B,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,aAAa;;;;;CAKzB,CAAC"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Compatibility layer for SOLID Analyzer
|
|
3
|
+
* Ensures the new universal analyzer produces similar results to the legacy one
|
|
4
|
+
*/
|
|
5
|
+
import { UniversalSOLIDAnalyzer } from './universal/UniversalSOLIDAnalyzer.js';
|
|
6
|
+
import { initializeLanguages } from '../languages/index.js';
|
|
7
|
+
// Initialize language system on module load
|
|
8
|
+
initializeLanguages();
|
|
9
|
+
/**
|
|
10
|
+
* Legacy-compatible SOLID analyzer function
|
|
11
|
+
* This wraps the new UniversalSOLIDAnalyzer to maintain API compatibility
|
|
12
|
+
*/
|
|
13
|
+
export const analyzeSOLID = async (files, config = {}, options = {}, progressCallback) => {
|
|
14
|
+
console.error('[DEBUG] SOLID compat layer called with files:', files);
|
|
15
|
+
console.error('[DEBUG] SOLID compat layer config:', config);
|
|
16
|
+
const analyzer = new UniversalSOLIDAnalyzer();
|
|
17
|
+
// Map legacy config to universal config, only override defined values
|
|
18
|
+
const universalConfig = {
|
|
19
|
+
skipTestFiles: true
|
|
20
|
+
};
|
|
21
|
+
// Only set properties that are explicitly provided to avoid overriding defaults with undefined
|
|
22
|
+
if (config.maxMethodsPerClass !== undefined)
|
|
23
|
+
universalConfig.maxMethodsPerClass = config.maxMethodsPerClass;
|
|
24
|
+
if (config.maxLinesPerMethod !== undefined)
|
|
25
|
+
universalConfig.maxLinesPerMethod = config.maxLinesPerMethod;
|
|
26
|
+
if (config.maxParametersPerMethod !== undefined)
|
|
27
|
+
universalConfig.maxParametersPerMethod = config.maxParametersPerMethod;
|
|
28
|
+
if (config.maxClassComplexity !== undefined)
|
|
29
|
+
universalConfig.maxClassComplexity = config.maxClassComplexity;
|
|
30
|
+
if (config.maxInterfaceMembers !== undefined)
|
|
31
|
+
universalConfig.maxInterfaceMembers = config.maxInterfaceMembers;
|
|
32
|
+
if (config.checkDependencyInversion !== undefined)
|
|
33
|
+
universalConfig.checkDependencyInversion = config.checkDependencyInversion;
|
|
34
|
+
if (config.checkInterfaceSegregation !== undefined)
|
|
35
|
+
universalConfig.checkInterfaceSegregation = config.checkInterfaceSegregation;
|
|
36
|
+
if (config.checkLiskovSubstitution !== undefined)
|
|
37
|
+
universalConfig.checkLiskovSubstitution = config.checkLiskovSubstitution;
|
|
38
|
+
console.error('[DEBUG] SOLID compat: Universal config:', universalConfig);
|
|
39
|
+
// Call the universal analyzer
|
|
40
|
+
console.error('[DEBUG] SOLID compat: About to call analyzer.analyze()');
|
|
41
|
+
try {
|
|
42
|
+
const result = await analyzer.analyze(files, universalConfig, {
|
|
43
|
+
progressCallback: progressCallback ? (progress) => {
|
|
44
|
+
progressCallback({
|
|
45
|
+
current: Math.floor(progress * 100),
|
|
46
|
+
total: 100,
|
|
47
|
+
analyzer: 'solid',
|
|
48
|
+
phase: 'analyzing'
|
|
49
|
+
});
|
|
50
|
+
} : undefined,
|
|
51
|
+
...options
|
|
52
|
+
});
|
|
53
|
+
console.error('[DEBUG] SOLID compat: analyzer.analyze() completed, violations:', result.violations.length);
|
|
54
|
+
return {
|
|
55
|
+
...result,
|
|
56
|
+
violations: result.violations.map(v => ({
|
|
57
|
+
...v,
|
|
58
|
+
principle: v.rule,
|
|
59
|
+
analyzer: 'solid',
|
|
60
|
+
rule: v.rule
|
|
61
|
+
}))
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
catch (error) {
|
|
65
|
+
console.error('[DEBUG] SOLID compat: ERROR in analyzer.analyze():', error);
|
|
66
|
+
throw error;
|
|
67
|
+
}
|
|
68
|
+
};
|
|
69
|
+
/**
|
|
70
|
+
* Analyzer definition for registration
|
|
71
|
+
*/
|
|
72
|
+
export const solidAnalyzer = {
|
|
73
|
+
name: 'solid',
|
|
74
|
+
description: 'Detects violations of SOLID principles',
|
|
75
|
+
category: 'architecture',
|
|
76
|
+
analyze: analyzeSOLID
|
|
77
|
+
};
|
|
78
|
+
//# sourceMappingURL=solidAnalyzerCompat.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"solidAnalyzerCompat.js","sourceRoot":"","sources":["../../src/analyzers/solidAnalyzerCompat.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,sBAAsB,EAAE,MAAM,uCAAuC,CAAC;AAC/E,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAE5D,4CAA4C;AAC5C,mBAAmB,EAAE,CAAC;AAEtB;;;GAGG;AACH,MAAM,CAAC,MAAM,YAAY,GAAqB,KAAK,EACjD,KAAe,EACf,SAAc,EAAE,EAChB,OAAO,GAAG,EAAE,EACZ,gBAAgB,EAChB,EAAE;IACF,OAAO,CAAC,KAAK,CAAC,+CAA+C,EAAE,KAAK,CAAC,CAAC;IACtE,OAAO,CAAC,KAAK,CAAC,oCAAoC,EAAE,MAAM,CAAC,CAAC;IAC5D,MAAM,QAAQ,GAAG,IAAI,sBAAsB,EAAE,CAAC;IAE9C,sEAAsE;IACtE,MAAM,eAAe,GAAQ;QAC3B,aAAa,EAAE,IAAI;KACpB,CAAC;IAEF,+FAA+F;IAC/F,IAAI,MAAM,CAAC,kBAAkB,KAAK,SAAS;QAAE,eAAe,CAAC,kBAAkB,GAAG,MAAM,CAAC,kBAAkB,CAAC;IAC5G,IAAI,MAAM,CAAC,iBAAiB,KAAK,SAAS;QAAE,eAAe,CAAC,iBAAiB,GAAG,MAAM,CAAC,iBAAiB,CAAC;IACzG,IAAI,MAAM,CAAC,sBAAsB,KAAK,SAAS;QAAE,eAAe,CAAC,sBAAsB,GAAG,MAAM,CAAC,sBAAsB,CAAC;IACxH,IAAI,MAAM,CAAC,kBAAkB,KAAK,SAAS;QAAE,eAAe,CAAC,kBAAkB,GAAG,MAAM,CAAC,kBAAkB,CAAC;IAC5G,IAAI,MAAM,CAAC,mBAAmB,KAAK,SAAS;QAAE,eAAe,CAAC,mBAAmB,GAAG,MAAM,CAAC,mBAAmB,CAAC;IAC/G,IAAI,MAAM,CAAC,wBAAwB,KAAK,SAAS;QAAE,eAAe,CAAC,wBAAwB,GAAG,MAAM,CAAC,wBAAwB,CAAC;IAC9H,IAAI,MAAM,CAAC,yBAAyB,KAAK,SAAS;QAAE,eAAe,CAAC,yBAAyB,GAAG,MAAM,CAAC,yBAAyB,CAAC;IACjI,IAAI,MAAM,CAAC,uBAAuB,KAAK,SAAS;QAAE,eAAe,CAAC,uBAAuB,GAAG,MAAM,CAAC,uBAAuB,CAAC;IAE3H,OAAO,CAAC,KAAK,CAAC,yCAAyC,EAAE,eAAe,CAAC,CAAC;IAE1E,8BAA8B;IAC9B,OAAO,CAAC,KAAK,CAAC,wDAAwD,CAAC,CAAC;IACxE,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,eAAe,EAAE;YAC5D,gBAAgB,EAAE,gBAAgB,CAAC,CAAC,CAAC,CAAC,QAAgB,EAAE,EAAE;gBACxD,gBAAgB,CAAC;oBACf,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,GAAG,CAAC;oBACnC,KAAK,EAAE,GAAG;oBACV,QAAQ,EAAE,OAAO;oBACjB,KAAK,EAAE,WAAW;iBACnB,CAAC,CAAC;YACL,CAAC,CAAC,CAAC,CAAC,SAAS;YACb,GAAG,OAAO;SACX,CAAC,CAAC;QACH,OAAO,CAAC,KAAK,CAAC,iEAAiE,EAAE,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;QAC3G,OAAO;YACL,GAAG,MAAM;YACT,UAAU,EAAE,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;gBACtC,GAAG,CAAC;gBACJ,SAAS,EAAE,CAAC,CAAC,IAAW;gBACxB,QAAQ,EAAE,OAAO;gBACjB,IAAI,EAAE,CAAC,CAAC,IAAI;aACb,CAAC,CAAC;SACJ,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,oDAAoD,EAAE,KAAK,CAAC,CAAC;QAC3E,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG;IAC3B,IAAI,EAAE,OAAO;IACb,WAAW,EAAE,wCAAwC;IACrD,QAAQ,EAAE,cAAc;IACxB,OAAO,EAAE,YAAY;CACtB,CAAC"}
|