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.
Files changed (180) hide show
  1. package/dist/adapters/GoAdapter.d.ts +53 -0
  2. package/dist/adapters/GoAdapter.d.ts.map +1 -0
  3. package/dist/adapters/GoAdapter.js +602 -0
  4. package/dist/adapters/GoAdapter.js.map +1 -0
  5. package/dist/adapters/GoConfig.d.ts +35 -0
  6. package/dist/adapters/GoConfig.d.ts.map +1 -0
  7. package/dist/adapters/GoConfig.js +155 -0
  8. package/dist/adapters/GoConfig.js.map +1 -0
  9. package/dist/adapters/LanguageAdapter.d.ts +135 -0
  10. package/dist/adapters/LanguageAdapter.d.ts.map +1 -0
  11. package/dist/adapters/LanguageAdapter.js +47 -0
  12. package/dist/adapters/LanguageAdapter.js.map +1 -0
  13. package/dist/adapters/TypeScriptAdapter.d.ts +43 -0
  14. package/dist/adapters/TypeScriptAdapter.d.ts.map +1 -0
  15. package/dist/adapters/TypeScriptAdapter.js +386 -0
  16. package/dist/adapters/TypeScriptAdapter.js.map +1 -0
  17. package/dist/adapters/UniversalAnalyzer.d.ts +42 -0
  18. package/dist/adapters/UniversalAnalyzer.d.ts.map +1 -0
  19. package/dist/adapters/UniversalAnalyzer.js +103 -0
  20. package/dist/adapters/UniversalAnalyzer.js.map +1 -0
  21. package/dist/adapters/UniversalSOLIDAnalyzer.d.ts +48 -0
  22. package/dist/adapters/UniversalSOLIDAnalyzer.d.ts.map +1 -0
  23. package/dist/adapters/UniversalSOLIDAnalyzer.js +178 -0
  24. package/dist/adapters/UniversalSOLIDAnalyzer.js.map +1 -0
  25. package/dist/adapters/solidAnalyzerCompat.d.ts +21 -0
  26. package/dist/adapters/solidAnalyzerCompat.d.ts.map +1 -0
  27. package/dist/adapters/solidAnalyzerCompat.js +78 -0
  28. package/dist/adapters/solidAnalyzerCompat.js.map +1 -0
  29. package/dist/analyzers/cross-language/APIContractAnalyzer.d.ts +103 -0
  30. package/dist/analyzers/cross-language/APIContractAnalyzer.d.ts.map +1 -0
  31. package/dist/analyzers/cross-language/APIContractAnalyzer.js +425 -0
  32. package/dist/analyzers/cross-language/APIContractAnalyzer.js.map +1 -0
  33. package/dist/analyzers/cross-language/CrossLanguageSOLIDAnalyzer.d.ts +117 -0
  34. package/dist/analyzers/cross-language/CrossLanguageSOLIDAnalyzer.d.ts.map +1 -0
  35. package/dist/analyzers/cross-language/CrossLanguageSOLIDAnalyzer.js +618 -0
  36. package/dist/analyzers/cross-language/CrossLanguageSOLIDAnalyzer.js.map +1 -0
  37. package/dist/analyzers/cross-language/DependencyGraphBuilder.d.ts +129 -0
  38. package/dist/analyzers/cross-language/DependencyGraphBuilder.d.ts.map +1 -0
  39. package/dist/analyzers/cross-language/DependencyGraphBuilder.js +473 -0
  40. package/dist/analyzers/cross-language/DependencyGraphBuilder.js.map +1 -0
  41. package/dist/analyzers/cross-language/SchemaValidator.d.ts +126 -0
  42. package/dist/analyzers/cross-language/SchemaValidator.d.ts.map +1 -0
  43. package/dist/analyzers/cross-language/SchemaValidator.js +522 -0
  44. package/dist/analyzers/cross-language/SchemaValidator.js.map +1 -0
  45. package/dist/analyzers/dataAccessAnalyzerCompat.d.ts +20 -0
  46. package/dist/analyzers/dataAccessAnalyzerCompat.d.ts.map +1 -0
  47. package/dist/analyzers/dataAccessAnalyzerCompat.js +59 -0
  48. package/dist/analyzers/dataAccessAnalyzerCompat.js.map +1 -0
  49. package/dist/analyzers/documentationAnalyzerCompat.d.ts +20 -0
  50. package/dist/analyzers/documentationAnalyzerCompat.d.ts.map +1 -0
  51. package/dist/analyzers/documentationAnalyzerCompat.js +52 -0
  52. package/dist/analyzers/documentationAnalyzerCompat.js.map +1 -0
  53. package/dist/analyzers/dryAnalyzerCompat.d.ts +20 -0
  54. package/dist/analyzers/dryAnalyzerCompat.d.ts.map +1 -0
  55. package/dist/analyzers/dryAnalyzerCompat.js +44 -0
  56. package/dist/analyzers/dryAnalyzerCompat.js.map +1 -0
  57. package/dist/analyzers/schemaAnalyzer.d.ts +21 -0
  58. package/dist/analyzers/schemaAnalyzer.d.ts.map +1 -0
  59. package/dist/analyzers/schemaAnalyzer.js +405 -0
  60. package/dist/analyzers/schemaAnalyzer.js.map +1 -0
  61. package/dist/analyzers/schemaAnalyzerCompat.d.ts +20 -0
  62. package/dist/analyzers/schemaAnalyzerCompat.d.ts.map +1 -0
  63. package/dist/analyzers/schemaAnalyzerCompat.js +69 -0
  64. package/dist/analyzers/schemaAnalyzerCompat.js.map +1 -0
  65. package/dist/analyzers/solidAnalyzerCompat.d.ts +20 -0
  66. package/dist/analyzers/solidAnalyzerCompat.d.ts.map +1 -0
  67. package/dist/analyzers/solidAnalyzerCompat.js +78 -0
  68. package/dist/analyzers/solidAnalyzerCompat.js.map +1 -0
  69. package/dist/analyzers/universal/UniversalDRYAnalyzer.d.ts +71 -0
  70. package/dist/analyzers/universal/UniversalDRYAnalyzer.d.ts.map +1 -0
  71. package/dist/analyzers/universal/UniversalDRYAnalyzer.js +276 -0
  72. package/dist/analyzers/universal/UniversalDRYAnalyzer.js.map +1 -0
  73. package/dist/analyzers/universal/UniversalDataAccessAnalyzer.d.ts +82 -0
  74. package/dist/analyzers/universal/UniversalDataAccessAnalyzer.d.ts.map +1 -0
  75. package/dist/analyzers/universal/UniversalDataAccessAnalyzer.js +489 -0
  76. package/dist/analyzers/universal/UniversalDataAccessAnalyzer.js.map +1 -0
  77. package/dist/analyzers/universal/UniversalDocumentationAnalyzer.d.ts +48 -0
  78. package/dist/analyzers/universal/UniversalDocumentationAnalyzer.d.ts.map +1 -0
  79. package/dist/analyzers/universal/UniversalDocumentationAnalyzer.js +175 -0
  80. package/dist/analyzers/universal/UniversalDocumentationAnalyzer.js.map +1 -0
  81. package/dist/analyzers/universal/UniversalSOLIDAnalyzer.d.ts +64 -0
  82. package/dist/analyzers/universal/UniversalSOLIDAnalyzer.d.ts.map +1 -0
  83. package/dist/analyzers/universal/UniversalSOLIDAnalyzer.js +286 -0
  84. package/dist/analyzers/universal/UniversalSOLIDAnalyzer.js.map +1 -0
  85. package/dist/analyzers/universal/UniversalSchemaAnalyzer.d.ts +119 -0
  86. package/dist/analyzers/universal/UniversalSchemaAnalyzer.d.ts.map +1 -0
  87. package/dist/analyzers/universal/UniversalSchemaAnalyzer.js +812 -0
  88. package/dist/analyzers/universal/UniversalSchemaAnalyzer.js.map +1 -0
  89. package/dist/auditRunner.d.ts.map +1 -1
  90. package/dist/auditRunner.js +23 -7
  91. package/dist/auditRunner.js.map +1 -1
  92. package/dist/codeIndexDB-enhanced.d.ts +80 -0
  93. package/dist/codeIndexDB-enhanced.d.ts.map +1 -0
  94. package/dist/codeIndexDB-enhanced.js +488 -0
  95. package/dist/codeIndexDB-enhanced.js.map +1 -0
  96. package/dist/codeIndexDb.d.ts +70 -1
  97. package/dist/codeIndexDb.d.ts.map +1 -1
  98. package/dist/codeIndexDb.js +199 -2
  99. package/dist/codeIndexDb.js.map +1 -1
  100. package/dist/config/defaults.js +1 -1
  101. package/dist/config/defaults.js.map +1 -1
  102. package/dist/languages/LanguageOrchestrator.d.ts +181 -0
  103. package/dist/languages/LanguageOrchestrator.d.ts.map +1 -0
  104. package/dist/languages/LanguageOrchestrator.js +365 -0
  105. package/dist/languages/LanguageOrchestrator.js.map +1 -0
  106. package/dist/languages/LanguageRegistry.d.ts +43 -0
  107. package/dist/languages/LanguageRegistry.d.ts.map +1 -0
  108. package/dist/languages/LanguageRegistry.js +86 -0
  109. package/dist/languages/LanguageRegistry.js.map +1 -0
  110. package/dist/languages/RuntimeManager.d.ts +181 -0
  111. package/dist/languages/RuntimeManager.d.ts.map +1 -0
  112. package/dist/languages/RuntimeManager.js +841 -0
  113. package/dist/languages/RuntimeManager.js.map +1 -0
  114. package/dist/languages/UniversalAnalyzer.d.ts +37 -0
  115. package/dist/languages/UniversalAnalyzer.d.ts.map +1 -0
  116. package/dist/languages/UniversalAnalyzer.js +101 -0
  117. package/dist/languages/UniversalAnalyzer.js.map +1 -0
  118. package/dist/languages/go/GoAdapter.d.ts +57 -0
  119. package/dist/languages/go/GoAdapter.d.ts.map +1 -0
  120. package/dist/languages/go/GoAdapter.js +360 -0
  121. package/dist/languages/go/GoAdapter.js.map +1 -0
  122. package/dist/languages/index.d.ts +13 -0
  123. package/dist/languages/index.d.ts.map +1 -0
  124. package/dist/languages/index.js +23 -0
  125. package/dist/languages/index.js.map +1 -0
  126. package/dist/languages/types.d.ts +182 -0
  127. package/dist/languages/types.d.ts.map +1 -0
  128. package/dist/languages/types.js +5 -0
  129. package/dist/languages/types.js.map +1 -0
  130. package/dist/languages/typescript/TypeScriptAdapter.d.ts +108 -0
  131. package/dist/languages/typescript/TypeScriptAdapter.d.ts.map +1 -0
  132. package/dist/languages/typescript/TypeScriptAdapter.js +567 -0
  133. package/dist/languages/typescript/TypeScriptAdapter.js.map +1 -0
  134. package/dist/languages/typescript/test-extraction.d.ts +2 -0
  135. package/dist/languages/typescript/test-extraction.d.ts.map +1 -0
  136. package/dist/languages/typescript/test-extraction.js +36 -0
  137. package/dist/languages/typescript/test-extraction.js.map +1 -0
  138. package/dist/mcp-hybrid.d.ts +10 -0
  139. package/dist/mcp-hybrid.d.ts.map +1 -0
  140. package/dist/mcp-hybrid.js +41 -0
  141. package/dist/mcp-hybrid.js.map +1 -0
  142. package/dist/mcp-index.d.ts +11 -0
  143. package/dist/mcp-index.d.ts.map +1 -0
  144. package/dist/mcp-index.js +101 -0
  145. package/dist/mcp-index.js.map +1 -0
  146. package/dist/mcp-tools/workflowGuide.d.ts.map +1 -1
  147. package/dist/mcp-tools/workflowGuide.js +67 -10
  148. package/dist/mcp-tools/workflowGuide.js.map +1 -1
  149. package/dist/mcp-tools-shared.d.ts +49 -0
  150. package/dist/mcp-tools-shared.d.ts.map +1 -0
  151. package/dist/mcp-tools-shared.js +1282 -0
  152. package/dist/mcp-tools-shared.js.map +1 -0
  153. package/dist/mcp-ui-server.d.ts +27 -0
  154. package/dist/mcp-ui-server.d.ts.map +1 -0
  155. package/dist/mcp-ui-server.js +484 -0
  156. package/dist/mcp-ui-server.js.map +1 -0
  157. package/dist/mcp-ui-simple.d.ts +27 -0
  158. package/dist/mcp-ui-simple.d.ts.map +1 -0
  159. package/dist/mcp-ui-simple.js +425 -0
  160. package/dist/mcp-ui-simple.js.map +1 -0
  161. package/dist/mcp.js +7 -4
  162. package/dist/mcp.js.map +1 -1
  163. package/dist/services/SchemaParser.d.ts +89 -0
  164. package/dist/services/SchemaParser.d.ts.map +1 -0
  165. package/dist/services/SchemaParser.js +434 -0
  166. package/dist/services/SchemaParser.js.map +1 -0
  167. package/dist/types/crossLanguage.d.ts +267 -0
  168. package/dist/types/crossLanguage.d.ts.map +1 -0
  169. package/dist/types/crossLanguage.js +6 -0
  170. package/dist/types/crossLanguage.js.map +1 -0
  171. package/dist/types.d.ts +128 -0
  172. package/dist/types.d.ts.map +1 -1
  173. package/dist/types.js.map +1 -1
  174. package/dist/utils/fileDiscovery.d.ts +6 -0
  175. package/dist/utils/fileDiscovery.d.ts.map +1 -1
  176. package/dist/utils/fileDiscovery.js +12 -1
  177. package/dist/utils/fileDiscovery.js.map +1 -1
  178. package/examples/schema-example.json +364 -0
  179. package/examples/schema-example.yaml +137 -0
  180. 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":"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"}