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,71 @@
|
|
|
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 type { Violation } from '../../types.js';
|
|
7
|
+
import type { AST, LanguageAdapter } from '../../languages/types.js';
|
|
8
|
+
/**
|
|
9
|
+
* Configuration for DRY analyzer
|
|
10
|
+
*/
|
|
11
|
+
export interface DRYAnalyzerConfig {
|
|
12
|
+
minLineThreshold?: number;
|
|
13
|
+
similarityThreshold?: number;
|
|
14
|
+
excludePatterns?: string[];
|
|
15
|
+
checkImports?: boolean;
|
|
16
|
+
checkStrings?: boolean;
|
|
17
|
+
ignoreComments?: boolean;
|
|
18
|
+
ignoreWhitespace?: boolean;
|
|
19
|
+
}
|
|
20
|
+
export declare const DEFAULT_DRY_CONFIG: DRYAnalyzerConfig;
|
|
21
|
+
export declare class UniversalDRYAnalyzer extends UniversalAnalyzer {
|
|
22
|
+
readonly name = "dry";
|
|
23
|
+
readonly description = "Detects code duplication across the codebase";
|
|
24
|
+
readonly category = "maintainability";
|
|
25
|
+
protected analyzeAST(ast: AST, adapter: LanguageAdapter, config: DRYAnalyzerConfig, sourceCode: string): Promise<Violation[]>;
|
|
26
|
+
/**
|
|
27
|
+
* Extract code blocks from AST
|
|
28
|
+
*/
|
|
29
|
+
private extractCodeBlocks;
|
|
30
|
+
/**
|
|
31
|
+
* Create a code block from an AST node
|
|
32
|
+
*/
|
|
33
|
+
private createCodeBlock;
|
|
34
|
+
/**
|
|
35
|
+
* Normalize code for comparison
|
|
36
|
+
*/
|
|
37
|
+
private normalizeCode;
|
|
38
|
+
/**
|
|
39
|
+
* Hash code for comparison
|
|
40
|
+
*/
|
|
41
|
+
private hashCode;
|
|
42
|
+
/**
|
|
43
|
+
* Count lines in text
|
|
44
|
+
*/
|
|
45
|
+
private countLines;
|
|
46
|
+
/**
|
|
47
|
+
* Check if block is large enough to be considered
|
|
48
|
+
*/
|
|
49
|
+
private isBlockLargeEnough;
|
|
50
|
+
/**
|
|
51
|
+
* Build local index for duplicate detection
|
|
52
|
+
*/
|
|
53
|
+
private buildLocalIndex;
|
|
54
|
+
/**
|
|
55
|
+
* Check for duplicate string literals
|
|
56
|
+
*/
|
|
57
|
+
private checkDuplicateStrings;
|
|
58
|
+
/**
|
|
59
|
+
* Check for duplicate imports
|
|
60
|
+
*/
|
|
61
|
+
private checkDuplicateImports;
|
|
62
|
+
/**
|
|
63
|
+
* Helper methods
|
|
64
|
+
*/
|
|
65
|
+
private isExcluded;
|
|
66
|
+
private findNodeByLocation;
|
|
67
|
+
private walkAST;
|
|
68
|
+
private isSignificantBlock;
|
|
69
|
+
private isStringLiteral;
|
|
70
|
+
}
|
|
71
|
+
//# sourceMappingURL=UniversalDRYAnalyzer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"UniversalDRYAnalyzer.d.ts","sourceRoot":"","sources":["../../../src/analyzers/universal/UniversalDRYAnalyzer.ts"],"names":[],"mappings":"AAAA;;;GAGG;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;AAG9E;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;IAC3B,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B;AAED,eAAO,MAAM,kBAAkB,EAAE,iBAQhC,CAAC;AAoBF,qBAAa,oBAAqB,SAAQ,iBAAiB;IACzD,QAAQ,CAAC,IAAI,SAAS;IACtB,QAAQ,CAAC,WAAW,kDAAkD;IACtE,QAAQ,CAAC,QAAQ,qBAAqB;cAEtB,UAAU,CACxB,GAAG,EAAE,GAAG,EACR,OAAO,EAAE,eAAe,EACxB,MAAM,EAAE,iBAAiB,EACzB,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,SAAS,EAAE,CAAC;IAuDvB;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAiFzB;;OAEG;IACH,OAAO,CAAC,eAAe;IAyBvB;;OAEG;IACH,OAAO,CAAC,aAAa;IAsBrB;;OAEG;IACH,OAAO,CAAC,QAAQ;IAIhB;;OAEG;IACH,OAAO,CAAC,UAAU;IAIlB;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAI1B;;OAEG;IACH,OAAO,CAAC,eAAe;IAkBvB;;OAEG;IACH,OAAO,CAAC,qBAAqB;IA0C7B;;OAEG;IACH,OAAO,CAAC,qBAAqB;IA+B7B;;OAEG;IACH,OAAO,CAAC,UAAU;IAOlB,OAAO,CAAC,kBAAkB;IAmB1B,OAAO,CAAC,OAAO;IASf,OAAO,CAAC,kBAAkB;IAO1B,OAAO,CAAC,eAAe;CAGxB"}
|
|
@@ -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"}
|