code-auditor-mcp 1.21.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 (149) 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/schemaAnalyzerCompat.d.ts +20 -0
  58. package/dist/analyzers/schemaAnalyzerCompat.d.ts.map +1 -0
  59. package/dist/analyzers/schemaAnalyzerCompat.js +69 -0
  60. package/dist/analyzers/schemaAnalyzerCompat.js.map +1 -0
  61. package/dist/analyzers/solidAnalyzerCompat.d.ts +20 -0
  62. package/dist/analyzers/solidAnalyzerCompat.d.ts.map +1 -0
  63. package/dist/analyzers/solidAnalyzerCompat.js +78 -0
  64. package/dist/analyzers/solidAnalyzerCompat.js.map +1 -0
  65. package/dist/analyzers/universal/UniversalDRYAnalyzer.d.ts +71 -0
  66. package/dist/analyzers/universal/UniversalDRYAnalyzer.d.ts.map +1 -0
  67. package/dist/analyzers/universal/UniversalDRYAnalyzer.js +276 -0
  68. package/dist/analyzers/universal/UniversalDRYAnalyzer.js.map +1 -0
  69. package/dist/analyzers/universal/UniversalDataAccessAnalyzer.d.ts +82 -0
  70. package/dist/analyzers/universal/UniversalDataAccessAnalyzer.d.ts.map +1 -0
  71. package/dist/analyzers/universal/UniversalDataAccessAnalyzer.js +489 -0
  72. package/dist/analyzers/universal/UniversalDataAccessAnalyzer.js.map +1 -0
  73. package/dist/analyzers/universal/UniversalDocumentationAnalyzer.d.ts +48 -0
  74. package/dist/analyzers/universal/UniversalDocumentationAnalyzer.d.ts.map +1 -0
  75. package/dist/analyzers/universal/UniversalDocumentationAnalyzer.js +175 -0
  76. package/dist/analyzers/universal/UniversalDocumentationAnalyzer.js.map +1 -0
  77. package/dist/analyzers/universal/UniversalSOLIDAnalyzer.d.ts +64 -0
  78. package/dist/analyzers/universal/UniversalSOLIDAnalyzer.d.ts.map +1 -0
  79. package/dist/analyzers/universal/UniversalSOLIDAnalyzer.js +286 -0
  80. package/dist/analyzers/universal/UniversalSOLIDAnalyzer.js.map +1 -0
  81. package/dist/analyzers/universal/UniversalSchemaAnalyzer.d.ts +119 -0
  82. package/dist/analyzers/universal/UniversalSchemaAnalyzer.d.ts.map +1 -0
  83. package/dist/analyzers/universal/UniversalSchemaAnalyzer.js +812 -0
  84. package/dist/analyzers/universal/UniversalSchemaAnalyzer.js.map +1 -0
  85. package/dist/auditRunner.d.ts.map +1 -1
  86. package/dist/auditRunner.js +20 -8
  87. package/dist/auditRunner.js.map +1 -1
  88. package/dist/codeIndexDB-enhanced.d.ts +80 -0
  89. package/dist/codeIndexDB-enhanced.d.ts.map +1 -0
  90. package/dist/codeIndexDB-enhanced.js +488 -0
  91. package/dist/codeIndexDB-enhanced.js.map +1 -0
  92. package/dist/codeIndexDb.js +2 -2
  93. package/dist/codeIndexDb.js.map +1 -1
  94. package/dist/config/defaults.js +1 -1
  95. package/dist/config/defaults.js.map +1 -1
  96. package/dist/languages/LanguageOrchestrator.d.ts +181 -0
  97. package/dist/languages/LanguageOrchestrator.d.ts.map +1 -0
  98. package/dist/languages/LanguageOrchestrator.js +365 -0
  99. package/dist/languages/LanguageOrchestrator.js.map +1 -0
  100. package/dist/languages/LanguageRegistry.d.ts +43 -0
  101. package/dist/languages/LanguageRegistry.d.ts.map +1 -0
  102. package/dist/languages/LanguageRegistry.js +86 -0
  103. package/dist/languages/LanguageRegistry.js.map +1 -0
  104. package/dist/languages/RuntimeManager.d.ts +181 -0
  105. package/dist/languages/RuntimeManager.d.ts.map +1 -0
  106. package/dist/languages/RuntimeManager.js +841 -0
  107. package/dist/languages/RuntimeManager.js.map +1 -0
  108. package/dist/languages/UniversalAnalyzer.d.ts +37 -0
  109. package/dist/languages/UniversalAnalyzer.d.ts.map +1 -0
  110. package/dist/languages/UniversalAnalyzer.js +101 -0
  111. package/dist/languages/UniversalAnalyzer.js.map +1 -0
  112. package/dist/languages/go/GoAdapter.d.ts +57 -0
  113. package/dist/languages/go/GoAdapter.d.ts.map +1 -0
  114. package/dist/languages/go/GoAdapter.js +360 -0
  115. package/dist/languages/go/GoAdapter.js.map +1 -0
  116. package/dist/languages/index.d.ts +13 -0
  117. package/dist/languages/index.d.ts.map +1 -0
  118. package/dist/languages/index.js +23 -0
  119. package/dist/languages/index.js.map +1 -0
  120. package/dist/languages/types.d.ts +182 -0
  121. package/dist/languages/types.d.ts.map +1 -0
  122. package/dist/languages/types.js +5 -0
  123. package/dist/languages/types.js.map +1 -0
  124. package/dist/languages/typescript/TypeScriptAdapter.d.ts +108 -0
  125. package/dist/languages/typescript/TypeScriptAdapter.d.ts.map +1 -0
  126. package/dist/languages/typescript/TypeScriptAdapter.js +567 -0
  127. package/dist/languages/typescript/TypeScriptAdapter.js.map +1 -0
  128. package/dist/languages/typescript/test-extraction.d.ts +2 -0
  129. package/dist/languages/typescript/test-extraction.d.ts.map +1 -0
  130. package/dist/languages/typescript/test-extraction.js +36 -0
  131. package/dist/languages/typescript/test-extraction.js.map +1 -0
  132. package/dist/mcp-tools-shared.d.ts +3 -0
  133. package/dist/mcp-tools-shared.d.ts.map +1 -1
  134. package/dist/mcp-tools-shared.js +123 -2
  135. package/dist/mcp-tools-shared.js.map +1 -1
  136. package/dist/mcp.js +3 -0
  137. package/dist/mcp.js.map +1 -1
  138. package/dist/types/crossLanguage.d.ts +267 -0
  139. package/dist/types/crossLanguage.d.ts.map +1 -0
  140. package/dist/types/crossLanguage.js +6 -0
  141. package/dist/types/crossLanguage.js.map +1 -0
  142. package/dist/types.d.ts +1 -0
  143. package/dist/types.d.ts.map +1 -1
  144. package/dist/types.js.map +1 -1
  145. package/dist/utils/fileDiscovery.d.ts +6 -0
  146. package/dist/utils/fileDiscovery.d.ts.map +1 -1
  147. package/dist/utils/fileDiscovery.js +12 -1
  148. package/dist/utils/fileDiscovery.js.map +1 -1
  149. package/package.json +19 -20
@@ -0,0 +1,276 @@
1
+ /**
2
+ * Universal DRY (Don't Repeat Yourself) Analyzer
3
+ * Works across multiple programming languages using the adapter pattern
4
+ */
5
+ import { UniversalAnalyzer } from '../../languages/UniversalAnalyzer.js';
6
+ import * as crypto from 'crypto';
7
+ export const DEFAULT_DRY_CONFIG = {
8
+ minLineThreshold: 5,
9
+ similarityThreshold: 0.85,
10
+ excludePatterns: ['**/*.test.ts', '**/*.spec.ts'],
11
+ checkImports: true,
12
+ checkStrings: true,
13
+ ignoreComments: true,
14
+ ignoreWhitespace: true
15
+ };
16
+ export class UniversalDRYAnalyzer extends UniversalAnalyzer {
17
+ name = 'dry';
18
+ description = 'Detects code duplication across the codebase';
19
+ category = 'maintainability';
20
+ async analyzeAST(ast, adapter, config, sourceCode) {
21
+ const violations = [];
22
+ const finalConfig = { ...DEFAULT_DRY_CONFIG, ...config };
23
+ // Skip if file matches exclude patterns
24
+ if (this.isExcluded(ast.filePath, finalConfig.excludePatterns || [])) {
25
+ return violations;
26
+ }
27
+ // Extract code blocks from this file
28
+ const blocks = this.extractCodeBlocks(ast, adapter, sourceCode, finalConfig);
29
+ // Store blocks for cross-file comparison
30
+ // Note: In a real implementation, we'd need to aggregate blocks across all files
31
+ // For now, we'll just detect duplicates within the same file
32
+ const localIndex = this.buildLocalIndex(blocks);
33
+ // Find duplicates
34
+ for (const [hash, duplicateBlocks] of localIndex.hashMap) {
35
+ if (duplicateBlocks.length > 1) {
36
+ // Report all but the first occurrence
37
+ for (let i = 1; i < duplicateBlocks.length; i++) {
38
+ const block = duplicateBlocks[i];
39
+ const original = duplicateBlocks[0];
40
+ violations.push(this.createViolation(block.file, block.start, `Duplicate code block detected (${block.lineCount} lines). First occurrence at line ${original.start.line}`, 'warning', 'exact-duplicate', {
41
+ oldText: block.text,
42
+ newText: `// Consider extracting to a shared function`
43
+ }));
44
+ }
45
+ }
46
+ }
47
+ // Check for duplicate string literals if enabled
48
+ if (finalConfig.checkStrings) {
49
+ const stringViolations = this.checkDuplicateStrings(ast, adapter, sourceCode);
50
+ violations.push(...stringViolations);
51
+ }
52
+ // Check for duplicate imports if enabled
53
+ if (finalConfig.checkImports) {
54
+ const importViolations = this.checkDuplicateImports(ast, adapter);
55
+ violations.push(...importViolations);
56
+ }
57
+ return violations;
58
+ }
59
+ /**
60
+ * Extract code blocks from AST
61
+ */
62
+ extractCodeBlocks(ast, adapter, sourceCode, config) {
63
+ const blocks = [];
64
+ // Extract functions
65
+ const functions = adapter.extractFunctions(ast);
66
+ for (const func of functions) {
67
+ const node = this.findNodeByLocation(ast.root, func.location.start);
68
+ if (node) {
69
+ const block = this.createCodeBlock(ast.filePath, node, adapter, sourceCode, config);
70
+ if (block && this.isBlockLargeEnough(block, config)) {
71
+ blocks.push(block);
72
+ }
73
+ }
74
+ }
75
+ // Extract classes and their methods
76
+ const classes = adapter.extractClasses(ast);
77
+ for (const cls of classes) {
78
+ // Add the class itself
79
+ const classNode = this.findNodeByLocation(ast.root, cls.location.start);
80
+ if (classNode) {
81
+ const block = this.createCodeBlock(ast.filePath, classNode, adapter, sourceCode, config);
82
+ if (block && this.isBlockLargeEnough(block, config)) {
83
+ blocks.push(block);
84
+ }
85
+ }
86
+ // Add methods
87
+ for (const method of cls.methods) {
88
+ const methodNode = this.findNodeByLocation(ast.root, method.location.start);
89
+ if (methodNode) {
90
+ const block = this.createCodeBlock(ast.filePath, methodNode, adapter, sourceCode, config);
91
+ if (block && this.isBlockLargeEnough(block, config)) {
92
+ blocks.push(block);
93
+ }
94
+ }
95
+ }
96
+ }
97
+ // Extract significant code blocks (loops, conditionals, etc.)
98
+ this.walkAST(ast.root, node => {
99
+ if (this.isSignificantBlock(node, adapter)) {
100
+ const block = this.createCodeBlock(ast.filePath, node, adapter, sourceCode, config);
101
+ if (block && this.isBlockLargeEnough(block, config)) {
102
+ blocks.push(block);
103
+ }
104
+ }
105
+ });
106
+ return blocks;
107
+ }
108
+ /**
109
+ * Create a code block from an AST node
110
+ */
111
+ createCodeBlock(filePath, node, adapter, sourceCode, config) {
112
+ const text = adapter.getNodeText(node, sourceCode);
113
+ if (!text)
114
+ return null;
115
+ const normalizedText = this.normalizeCode(text, config);
116
+ const lineCount = this.countLines(text);
117
+ return {
118
+ file: filePath,
119
+ start: node.location.start,
120
+ end: node.location.end,
121
+ text,
122
+ normalizedText,
123
+ hash: this.hashCode(normalizedText),
124
+ nodeType: node.type,
125
+ lineCount
126
+ };
127
+ }
128
+ /**
129
+ * Normalize code for comparison
130
+ */
131
+ normalizeCode(code, config) {
132
+ let normalized = code;
133
+ if (config.ignoreWhitespace) {
134
+ // Normalize whitespace but preserve structure
135
+ normalized = normalized
136
+ .split('\n')
137
+ .map(line => line.trim())
138
+ .filter(line => line.length > 0)
139
+ .join('\n');
140
+ }
141
+ if (config.ignoreComments) {
142
+ // Remove single-line comments
143
+ normalized = normalized.replace(/\/\/.*$/gm, '');
144
+ // Remove multi-line comments
145
+ normalized = normalized.replace(/\/\*[\s\S]*?\*\//g, '');
146
+ }
147
+ return normalized;
148
+ }
149
+ /**
150
+ * Hash code for comparison
151
+ */
152
+ hashCode(text) {
153
+ return crypto.createHash('sha256').update(text).digest('hex');
154
+ }
155
+ /**
156
+ * Count lines in text
157
+ */
158
+ countLines(text) {
159
+ return text.split('\n').filter(line => line.trim().length > 0).length;
160
+ }
161
+ /**
162
+ * Check if block is large enough to be considered
163
+ */
164
+ isBlockLargeEnough(block, config) {
165
+ return block.lineCount >= (config.minLineThreshold || 5);
166
+ }
167
+ /**
168
+ * Build local index for duplicate detection
169
+ */
170
+ buildLocalIndex(blocks) {
171
+ const index = {
172
+ blocks,
173
+ hashMap: new Map(),
174
+ stringLiterals: new Map(),
175
+ imports: new Map()
176
+ };
177
+ // Group blocks by hash
178
+ for (const block of blocks) {
179
+ const existing = index.hashMap.get(block.hash) || [];
180
+ existing.push(block);
181
+ index.hashMap.set(block.hash, existing);
182
+ }
183
+ return index;
184
+ }
185
+ /**
186
+ * Check for duplicate string literals
187
+ */
188
+ checkDuplicateStrings(ast, adapter, sourceCode) {
189
+ const violations = [];
190
+ const stringMap = new Map();
191
+ // Find all string literals
192
+ const stringNodes = adapter.findNodes(ast, {
193
+ custom: (node) => this.isStringLiteral(node, adapter)
194
+ });
195
+ for (const node of stringNodes) {
196
+ const value = adapter.getNodeText(node, sourceCode);
197
+ if (value && value.length > 10) { // Only consider non-trivial strings
198
+ const locations = stringMap.get(value) || [];
199
+ locations.push(node.location.start);
200
+ stringMap.set(value, locations);
201
+ }
202
+ }
203
+ // Report duplicates
204
+ for (const [value, locations] of stringMap) {
205
+ if (locations.length > 2) { // More than 2 occurrences
206
+ violations.push(this.createViolation(ast.filePath, locations[0], `String literal "${value.substring(0, 30)}..." is duplicated ${locations.length} times`, 'suggestion', 'duplicate-string-literal', {
207
+ oldText: value,
208
+ newText: '// Consider extracting to a constant'
209
+ }));
210
+ }
211
+ }
212
+ return violations;
213
+ }
214
+ /**
215
+ * Check for duplicate imports
216
+ */
217
+ checkDuplicateImports(ast, adapter) {
218
+ const violations = [];
219
+ const importMap = new Map();
220
+ // Find all import statements
221
+ const imports = adapter.extractImports(ast);
222
+ for (const imp of imports) {
223
+ const count = importMap.get(imp.source) || 0;
224
+ importMap.set(imp.source, count + 1);
225
+ }
226
+ // Report duplicates
227
+ for (const [source, count] of importMap) {
228
+ if (count > 1) {
229
+ violations.push(this.createViolation(ast.filePath, { line: 1, column: 1 }, // Import section is typically at the top
230
+ `Module "${source}" is imported ${count} times`, 'warning', 'duplicate-import'));
231
+ }
232
+ }
233
+ return violations;
234
+ }
235
+ /**
236
+ * Helper methods
237
+ */
238
+ isExcluded(filePath, patterns) {
239
+ return patterns.some(pattern => {
240
+ const regex = new RegExp(pattern.replace(/\*/g, '.*'));
241
+ return regex.test(filePath);
242
+ });
243
+ }
244
+ findNodeByLocation(root, location) {
245
+ const queue = [root];
246
+ while (queue.length > 0) {
247
+ const node = queue.shift();
248
+ if (node.location.start.line === location.line &&
249
+ node.location.start.column === location.column) {
250
+ return node;
251
+ }
252
+ if (node.children) {
253
+ queue.push(...node.children);
254
+ }
255
+ }
256
+ return null;
257
+ }
258
+ walkAST(node, callback) {
259
+ callback(node);
260
+ if (node.children) {
261
+ for (const child of node.children) {
262
+ this.walkAST(child, callback);
263
+ }
264
+ }
265
+ }
266
+ isSignificantBlock(node, adapter) {
267
+ // Check if this is a block-like structure (if, for, while, etc.)
268
+ const blockTypes = ['Block', 'IfStatement', 'ForStatement', 'WhileStatement',
269
+ 'DoWhileStatement', 'SwitchStatement', 'TryStatement'];
270
+ return blockTypes.some(type => node.type.includes(type));
271
+ }
272
+ isStringLiteral(node, adapter) {
273
+ return node.type.includes('StringLiteral') || node.type.includes('TemplateLiteral');
274
+ }
275
+ }
276
+ //# sourceMappingURL=UniversalDRYAnalyzer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"UniversalDRYAnalyzer.js","sourceRoot":"","sources":["../../../src/analyzers/universal/UniversalDRYAnalyzer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,82 @@
1
+ /**
2
+ * Universal Data Access Analyzer
3
+ * Works across multiple programming languages using the adapter pattern
4
+ * Analyzes database access patterns and data layer interactions
5
+ */
6
+ import { UniversalAnalyzer } from '../../languages/UniversalAnalyzer.js';
7
+ import type { Violation } from '../../types.js';
8
+ import type { AST, LanguageAdapter } from '../../languages/types.js';
9
+ /**
10
+ * Configuration for Data Access analyzer
11
+ */
12
+ export interface DataAccessAnalyzerConfig {
13
+ checkOrgFilters?: boolean;
14
+ checkSQLInjection?: boolean;
15
+ databases?: {
16
+ [key: string]: {
17
+ name: string;
18
+ importPatterns: string[];
19
+ queryPatterns: string[];
20
+ ormPatterns?: string[];
21
+ };
22
+ };
23
+ organizationPatterns?: string[];
24
+ tablePatterns?: {
25
+ orm?: RegExp[];
26
+ sql?: RegExp[];
27
+ queryBuilder?: RegExp[];
28
+ };
29
+ performanceThresholds?: {
30
+ complexQueryCount?: number;
31
+ unfilteredQueryCount?: number;
32
+ joinedTableCount?: number;
33
+ };
34
+ securityPatterns?: {
35
+ sqlInjectionRisks?: string[];
36
+ parameterizedQueries?: string[];
37
+ };
38
+ }
39
+ export declare const DEFAULT_DATA_ACCESS_CONFIG: DataAccessAnalyzerConfig;
40
+ export declare class UniversalDataAccessAnalyzer extends UniversalAnalyzer {
41
+ readonly name = "data-access";
42
+ readonly description = "Analyzes database access patterns and data layer interactions";
43
+ readonly category = "security";
44
+ protected analyzeAST(ast: AST, adapter: LanguageAdapter, config: DataAccessAnalyzerConfig, sourceCode: string): Promise<Violation[]>;
45
+ /**
46
+ * Map imports to database types
47
+ */
48
+ private mapDatabaseImports;
49
+ /**
50
+ * Extract database calls from AST
51
+ */
52
+ private extractDatabaseCalls;
53
+ /**
54
+ * Analyze a database query
55
+ */
56
+ private analyzeQuery;
57
+ /**
58
+ * Check for violations in a database call
59
+ */
60
+ private checkViolations;
61
+ /**
62
+ * Check general data access patterns
63
+ */
64
+ private checkGeneralPatterns;
65
+ /**
66
+ * Helper methods
67
+ */
68
+ private isFunctionCall;
69
+ private isTemplateLiteral;
70
+ private isVariableAssignment;
71
+ private containsSQLKeywords;
72
+ private isOrmPattern;
73
+ private isDatabaseCall;
74
+ private extractTables;
75
+ private hasOrganizationFilter;
76
+ private checkQuerySecurity;
77
+ private extractMethodName;
78
+ private requiresOrgFilter;
79
+ private isStringLiteral;
80
+ private isConnectionString;
81
+ }
82
+ //# sourceMappingURL=UniversalDataAccessAnalyzer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"UniversalDataAccessAnalyzer.d.ts","sourceRoot":"","sources":["../../../src/analyzers/universal/UniversalDataAccessAnalyzer.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,iBAAiB,EAAE,MAAM,sCAAsC,CAAC;AACzE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,KAAK,EAAE,GAAG,EAAE,eAAe,EAAW,MAAM,0BAA0B,CAAC;AAE9E;;GAEG;AACH,MAAM,WAAW,wBAAwB;IAEvC,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAG5B,SAAS,CAAC,EAAE;QACV,CAAC,GAAG,EAAE,MAAM,GAAG;YACb,IAAI,EAAE,MAAM,CAAC;YACb,cAAc,EAAE,MAAM,EAAE,CAAC;YACzB,aAAa,EAAE,MAAM,EAAE,CAAC;YACxB,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;SACxB,CAAC;KACH,CAAC;IAGF,oBAAoB,CAAC,EAAE,MAAM,EAAE,CAAC;IAGhC,aAAa,CAAC,EAAE;QACd,GAAG,CAAC,EAAE,MAAM,EAAE,CAAC;QACf,GAAG,CAAC,EAAE,MAAM,EAAE,CAAC;QACf,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;KACzB,CAAC;IAGF,qBAAqB,CAAC,EAAE;QACtB,iBAAiB,CAAC,EAAE,MAAM,CAAC;QAC3B,oBAAoB,CAAC,EAAE,MAAM,CAAC;QAC9B,gBAAgB,CAAC,EAAE,MAAM,CAAC;KAC3B,CAAC;IAGF,gBAAgB,CAAC,EAAE;QACjB,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAC;QAC7B,oBAAoB,CAAC,EAAE,MAAM,EAAE,CAAC;KACjC,CAAC;CACH;AAED,eAAO,MAAM,0BAA0B,EAAE,wBA2CxC,CAAC;AAuBF,qBAAa,2BAA4B,SAAQ,iBAAiB;IAChE,QAAQ,CAAC,IAAI,iBAAiB;IAC9B,QAAQ,CAAC,WAAW,mEAAmE;IACvF,QAAQ,CAAC,QAAQ,cAAc;cAEf,UAAU,CACxB,GAAG,EAAE,GAAG,EACR,OAAO,EAAE,eAAe,EACxB,MAAM,EAAE,wBAAwB,EAChC,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,SAAS,EAAE,CAAC;IA+BvB;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAoB1B;;OAEG;IACH,OAAO,CAAC,oBAAoB;IA0I5B;;OAEG;IACH,OAAO,CAAC,YAAY;IAiCpB;;OAEG;IACH,OAAO,CAAC,eAAe;IAuDvB;;OAEG;IACH,OAAO,CAAC,oBAAoB;IA4C5B;;OAEG;IACH,OAAO,CAAC,cAAc;IAMtB,OAAO,CAAC,iBAAiB;IAKzB,OAAO,CAAC,oBAAoB;IAO5B,OAAO,CAAC,mBAAmB;IAM3B,OAAO,CAAC,YAAY;IAgCpB,OAAO,CAAC,cAAc;IAItB,OAAO,CAAC,aAAa;IAyCrB,OAAO,CAAC,qBAAqB;IAyE7B,OAAO,CAAC,kBAAkB;IA6B1B,OAAO,CAAC,iBAAiB;IAMzB,OAAO,CAAC,iBAAiB;IAWzB,OAAO,CAAC,eAAe;IAIvB,OAAO,CAAC,kBAAkB;CAW3B"}