@oalacea/daemon 0.6.3 → 0.7.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/README.md +268 -58
- package/bin/Dockerfile +158 -16
- package/dist/cli/cli.d.ts.map +1 -1
- package/dist/cli/cli.js +22 -2
- package/dist/cli/cli.js.map +1 -1
- package/dist/cli/commands/command.types.d.ts +216 -0
- package/dist/cli/commands/command.types.d.ts.map +1 -0
- package/dist/cli/commands/command.types.js +64 -0
- package/dist/cli/commands/command.types.js.map +1 -0
- package/dist/cli/commands/history.command.d.ts +91 -0
- package/dist/cli/commands/history.command.d.ts.map +1 -0
- package/dist/cli/commands/history.command.js +336 -0
- package/dist/cli/commands/history.command.js.map +1 -0
- package/dist/cli/commands/index.d.ts +14 -3
- package/dist/cli/commands/index.d.ts.map +1 -1
- package/dist/cli/commands/index.js +7 -0
- package/dist/cli/commands/index.js.map +1 -1
- package/dist/cli/commands/init.command.d.ts +12 -14
- package/dist/cli/commands/init.command.d.ts.map +1 -1
- package/dist/cli/commands/init.command.js +278 -144
- package/dist/cli/commands/init.command.js.map +1 -1
- package/dist/cli/commands/optimize.command.d.ts +110 -0
- package/dist/cli/commands/optimize.command.d.ts.map +1 -0
- package/dist/cli/commands/optimize.command.js +497 -0
- package/dist/cli/commands/optimize.command.js.map +1 -0
- package/dist/cli/commands/report.command.d.ts +110 -0
- package/dist/cli/commands/report.command.d.ts.map +1 -0
- package/dist/cli/commands/report.command.js +532 -0
- package/dist/cli/commands/report.command.js.map +1 -0
- package/dist/cli/commands/review.command.d.ts +110 -0
- package/dist/cli/commands/review.command.d.ts.map +1 -0
- package/dist/cli/commands/review.command.js +520 -0
- package/dist/cli/commands/review.command.js.map +1 -0
- package/dist/cli/commands/score.command.d.ts +47 -0
- package/dist/cli/commands/score.command.d.ts.map +1 -0
- package/dist/cli/commands/score.command.js +261 -0
- package/dist/cli/commands/score.command.js.map +1 -0
- package/dist/cli/utils/index.d.ts +10 -0
- package/dist/cli/utils/index.d.ts.map +1 -0
- package/dist/cli/utils/index.js +10 -0
- package/dist/cli/utils/index.js.map +1 -0
- package/dist/cli/utils/output.d.ts +192 -0
- package/dist/cli/utils/output.d.ts.map +1 -0
- package/dist/cli/utils/output.js +411 -0
- package/dist/cli/utils/output.js.map +1 -0
- package/dist/cli/utils/progress.d.ts +204 -0
- package/dist/cli/utils/progress.d.ts.map +1 -0
- package/dist/cli/utils/progress.js +396 -0
- package/dist/cli/utils/progress.js.map +1 -0
- package/dist/core/types/index.d.ts +1 -0
- package/dist/core/types/index.d.ts.map +1 -1
- package/dist/core/types/project.types.d.ts +3 -3
- package/dist/core/types/project.types.d.ts.map +1 -1
- package/dist/core/types/scoring.types.d.ts +301 -0
- package/dist/core/types/scoring.types.d.ts.map +1 -0
- package/dist/core/types/scoring.types.js +8 -0
- package/dist/core/types/scoring.types.js.map +1 -0
- package/dist/services/detection/framework-detector.d.ts.map +1 -1
- package/dist/services/detection/framework-detector.js +74 -5
- package/dist/services/detection/framework-detector.js.map +1 -1
- package/dist/services/index.d.ts +12 -0
- package/dist/services/index.d.ts.map +1 -1
- package/dist/services/index.js +14 -0
- package/dist/services/index.js.map +1 -1
- package/dist/services/optimization/detectors/bug-detector.d.ts +82 -0
- package/dist/services/optimization/detectors/bug-detector.d.ts.map +1 -0
- package/dist/services/optimization/detectors/bug-detector.js +443 -0
- package/dist/services/optimization/detectors/bug-detector.js.map +1 -0
- package/dist/services/optimization/detectors/code-smell-detector.d.ts +108 -0
- package/dist/services/optimization/detectors/code-smell-detector.d.ts.map +1 -0
- package/dist/services/optimization/detectors/code-smell-detector.js +569 -0
- package/dist/services/optimization/detectors/code-smell-detector.js.map +1 -0
- package/dist/services/optimization/detectors/index.d.ts +7 -0
- package/dist/services/optimization/detectors/index.d.ts.map +1 -0
- package/dist/services/optimization/detectors/index.js +7 -0
- package/dist/services/optimization/detectors/index.js.map +1 -0
- package/dist/services/optimization/detectors/perf-detector.d.ts +80 -0
- package/dist/services/optimization/detectors/perf-detector.d.ts.map +1 -0
- package/dist/services/optimization/detectors/perf-detector.js +451 -0
- package/dist/services/optimization/detectors/perf-detector.js.map +1 -0
- package/dist/services/optimization/index.d.ts +61 -0
- package/dist/services/optimization/index.d.ts.map +1 -0
- package/dist/services/optimization/index.js +69 -0
- package/dist/services/optimization/index.js.map +1 -0
- package/dist/services/optimization/optimization.service.d.ts +65 -0
- package/dist/services/optimization/optimization.service.d.ts.map +1 -0
- package/dist/services/optimization/optimization.service.js +511 -0
- package/dist/services/optimization/optimization.service.js.map +1 -0
- package/dist/services/optimization/optimization.types.d.ts +343 -0
- package/dist/services/optimization/optimization.types.d.ts.map +1 -0
- package/dist/services/optimization/optimization.types.js +8 -0
- package/dist/services/optimization/optimization.types.js.map +1 -0
- package/dist/services/optimization/optimizers/code-optimizer.d.ts +87 -0
- package/dist/services/optimization/optimizers/code-optimizer.d.ts.map +1 -0
- package/dist/services/optimization/optimizers/code-optimizer.js +436 -0
- package/dist/services/optimization/optimizers/code-optimizer.js.map +1 -0
- package/dist/services/optimization/optimizers/index.d.ts +7 -0
- package/dist/services/optimization/optimizers/index.d.ts.map +1 -0
- package/dist/services/optimization/optimizers/index.js +7 -0
- package/dist/services/optimization/optimizers/index.js.map +1 -0
- package/dist/services/optimization/optimizers/perf-optimizer.d.ts +64 -0
- package/dist/services/optimization/optimizers/perf-optimizer.d.ts.map +1 -0
- package/dist/services/optimization/optimizers/perf-optimizer.js +330 -0
- package/dist/services/optimization/optimizers/perf-optimizer.js.map +1 -0
- package/dist/services/optimization/optimizers/refact-optimizer.d.ts +82 -0
- package/dist/services/optimization/optimizers/refact-optimizer.d.ts.map +1 -0
- package/dist/services/optimization/optimizers/refact-optimizer.js +354 -0
- package/dist/services/optimization/optimizers/refact-optimizer.js.map +1 -0
- package/dist/services/optimization/patterns/anti-patterns.d.ts +31 -0
- package/dist/services/optimization/patterns/anti-patterns.d.ts.map +1 -0
- package/dist/services/optimization/patterns/anti-patterns.js +501 -0
- package/dist/services/optimization/patterns/anti-patterns.js.map +1 -0
- package/dist/services/optimization/patterns/index.d.ts +5 -0
- package/dist/services/optimization/patterns/index.d.ts.map +1 -0
- package/dist/services/optimization/patterns/index.js +5 -0
- package/dist/services/optimization/patterns/index.js.map +1 -0
- package/dist/services/reporting/export/chart.exporter.d.ts +59 -0
- package/dist/services/reporting/export/chart.exporter.d.ts.map +1 -0
- package/dist/services/reporting/export/chart.exporter.js +350 -0
- package/dist/services/reporting/export/chart.exporter.js.map +1 -0
- package/dist/services/reporting/export/index.d.ts +9 -0
- package/dist/services/reporting/export/index.d.ts.map +1 -0
- package/dist/services/reporting/export/index.js +10 -0
- package/dist/services/reporting/export/index.js.map +1 -0
- package/dist/services/reporting/export/pdf.exporter.d.ts +133 -0
- package/dist/services/reporting/export/pdf.exporter.d.ts.map +1 -0
- package/dist/services/reporting/export/pdf.exporter.js +270 -0
- package/dist/services/reporting/export/pdf.exporter.js.map +1 -0
- package/dist/services/reporting/history.service.d.ts +93 -0
- package/dist/services/reporting/history.service.d.ts.map +1 -0
- package/dist/services/reporting/history.service.js +285 -0
- package/dist/services/reporting/history.service.js.map +1 -0
- package/dist/services/reporting/index.d.ts +15 -0
- package/dist/services/reporting/index.d.ts.map +1 -0
- package/dist/services/reporting/index.js +16 -0
- package/dist/services/reporting/index.js.map +1 -0
- package/dist/services/reporting/report.service.d.ts +102 -0
- package/dist/services/reporting/report.service.d.ts.map +1 -0
- package/dist/services/reporting/report.service.js +240 -0
- package/dist/services/reporting/report.service.js.map +1 -0
- package/dist/services/reporting/reporting.types.d.ts +329 -0
- package/dist/services/reporting/reporting.types.d.ts.map +1 -0
- package/dist/services/reporting/reporting.types.js +8 -0
- package/dist/services/reporting/reporting.types.js.map +1 -0
- package/dist/services/reporting/templates/html.template.d.ts +81 -0
- package/dist/services/reporting/templates/html.template.d.ts.map +1 -0
- package/dist/services/reporting/templates/html.template.js +741 -0
- package/dist/services/reporting/templates/html.template.js.map +1 -0
- package/dist/services/reporting/templates/json.template.d.ts +85 -0
- package/dist/services/reporting/templates/json.template.d.ts.map +1 -0
- package/dist/services/reporting/templates/json.template.js +308 -0
- package/dist/services/reporting/templates/json.template.js.map +1 -0
- package/dist/services/reporting/templates/markdown.template.d.ts +69 -0
- package/dist/services/reporting/templates/markdown.template.d.ts.map +1 -0
- package/dist/services/reporting/templates/markdown.template.js +311 -0
- package/dist/services/reporting/templates/markdown.template.js.map +1 -0
- package/dist/services/reporting/trend-analyzer.d.ts +73 -0
- package/dist/services/reporting/trend-analyzer.d.ts.map +1 -0
- package/dist/services/reporting/trend-analyzer.js +291 -0
- package/dist/services/reporting/trend-analyzer.js.map +1 -0
- package/dist/services/review/analyzers/dependency-analyzer.d.ts +87 -0
- package/dist/services/review/analyzers/dependency-analyzer.d.ts.map +1 -0
- package/dist/services/review/analyzers/dependency-analyzer.js +458 -0
- package/dist/services/review/analyzers/dependency-analyzer.js.map +1 -0
- package/dist/services/review/analyzers/index.d.ts +13 -0
- package/dist/services/review/analyzers/index.d.ts.map +1 -0
- package/dist/services/review/analyzers/index.js +13 -0
- package/dist/services/review/analyzers/index.js.map +1 -0
- package/dist/services/review/analyzers/nestjs-analyzer.d.ts +210 -0
- package/dist/services/review/analyzers/nestjs-analyzer.d.ts.map +1 -0
- package/dist/services/review/analyzers/nestjs-analyzer.js +571 -0
- package/dist/services/review/analyzers/nestjs-analyzer.js.map +1 -0
- package/dist/services/review/analyzers/performance-analyzer.d.ts +91 -0
- package/dist/services/review/analyzers/performance-analyzer.d.ts.map +1 -0
- package/dist/services/review/analyzers/performance-analyzer.js +589 -0
- package/dist/services/review/analyzers/performance-analyzer.js.map +1 -0
- package/dist/services/review/analyzers/security-analyzer.d.ts +96 -0
- package/dist/services/review/analyzers/security-analyzer.d.ts.map +1 -0
- package/dist/services/review/analyzers/security-analyzer.js +512 -0
- package/dist/services/review/analyzers/security-analyzer.js.map +1 -0
- package/dist/services/review/analyzers/static-analyzer.d.ts +90 -0
- package/dist/services/review/analyzers/static-analyzer.d.ts.map +1 -0
- package/dist/services/review/analyzers/static-analyzer.js +423 -0
- package/dist/services/review/analyzers/static-analyzer.js.map +1 -0
- package/dist/services/review/fixers/auto-fixer.d.ts +94 -0
- package/dist/services/review/fixers/auto-fixer.d.ts.map +1 -0
- package/dist/services/review/fixers/auto-fixer.js +404 -0
- package/dist/services/review/fixers/auto-fixer.js.map +1 -0
- package/dist/services/review/fixers/index.d.ts +11 -0
- package/dist/services/review/fixers/index.d.ts.map +1 -0
- package/dist/services/review/fixers/index.js +11 -0
- package/dist/services/review/fixers/index.js.map +1 -0
- package/dist/services/review/fixers/refactor-suggester.d.ts +100 -0
- package/dist/services/review/fixers/refactor-suggester.d.ts.map +1 -0
- package/dist/services/review/fixers/refactor-suggester.js +555 -0
- package/dist/services/review/fixers/refactor-suggester.js.map +1 -0
- package/dist/services/review/fixers/test-generator.d.ts +99 -0
- package/dist/services/review/fixers/test-generator.d.ts.map +1 -0
- package/dist/services/review/fixers/test-generator.js +458 -0
- package/dist/services/review/fixers/test-generator.js.map +1 -0
- package/dist/services/review/index.d.ts +14 -0
- package/dist/services/review/index.d.ts.map +1 -0
- package/dist/services/review/index.js +14 -0
- package/dist/services/review/index.js.map +1 -0
- package/dist/services/review/reporters/fix-reporter.d.ts +67 -0
- package/dist/services/review/reporters/fix-reporter.d.ts.map +1 -0
- package/dist/services/review/reporters/fix-reporter.js +437 -0
- package/dist/services/review/reporters/fix-reporter.js.map +1 -0
- package/dist/services/review/reporters/index.d.ts +10 -0
- package/dist/services/review/reporters/index.d.ts.map +1 -0
- package/dist/services/review/reporters/index.js +10 -0
- package/dist/services/review/reporters/index.js.map +1 -0
- package/dist/services/review/reporters/score-reporter.d.ts +84 -0
- package/dist/services/review/reporters/score-reporter.d.ts.map +1 -0
- package/dist/services/review/reporters/score-reporter.js +560 -0
- package/dist/services/review/reporters/score-reporter.js.map +1 -0
- package/dist/services/review/review.service.d.ts +129 -0
- package/dist/services/review/review.service.d.ts.map +1 -0
- package/dist/services/review/review.service.js +396 -0
- package/dist/services/review/review.service.js.map +1 -0
- package/dist/services/review/review.types.d.ts +443 -0
- package/dist/services/review/review.types.d.ts.map +1 -0
- package/dist/services/review/review.types.js +11 -0
- package/dist/services/review/review.types.js.map +1 -0
- package/dist/services/scoring/dimensions/accessibility.analyzer.d.ts +53 -0
- package/dist/services/scoring/dimensions/accessibility.analyzer.d.ts.map +1 -0
- package/dist/services/scoring/dimensions/accessibility.analyzer.js +260 -0
- package/dist/services/scoring/dimensions/accessibility.analyzer.js.map +1 -0
- package/dist/services/scoring/dimensions/backend-logic.analyzer.d.ts +138 -0
- package/dist/services/scoring/dimensions/backend-logic.analyzer.d.ts.map +1 -0
- package/dist/services/scoring/dimensions/backend-logic.analyzer.js +713 -0
- package/dist/services/scoring/dimensions/backend-logic.analyzer.js.map +1 -0
- package/dist/services/scoring/dimensions/business-logic.analyzer.d.ts +142 -0
- package/dist/services/scoring/dimensions/business-logic.analyzer.d.ts.map +1 -0
- package/dist/services/scoring/dimensions/business-logic.analyzer.js +747 -0
- package/dist/services/scoring/dimensions/business-logic.analyzer.js.map +1 -0
- package/dist/services/scoring/dimensions/code-quality.analyzer.d.ts +142 -0
- package/dist/services/scoring/dimensions/code-quality.analyzer.d.ts.map +1 -0
- package/dist/services/scoring/dimensions/code-quality.analyzer.js +685 -0
- package/dist/services/scoring/dimensions/code-quality.analyzer.js.map +1 -0
- package/dist/services/scoring/dimensions/index.d.ts +18 -0
- package/dist/services/scoring/dimensions/index.d.ts.map +1 -0
- package/dist/services/scoring/dimensions/index.js +27 -0
- package/dist/services/scoring/dimensions/index.js.map +1 -0
- package/dist/services/scoring/dimensions/performance.analyzer.d.ts +125 -0
- package/dist/services/scoring/dimensions/performance.analyzer.d.ts.map +1 -0
- package/dist/services/scoring/dimensions/performance.analyzer.js +615 -0
- package/dist/services/scoring/dimensions/performance.analyzer.js.map +1 -0
- package/dist/services/scoring/dimensions/security.analyzer.d.ts +53 -0
- package/dist/services/scoring/dimensions/security.analyzer.d.ts.map +1 -0
- package/dist/services/scoring/dimensions/security.analyzer.js +327 -0
- package/dist/services/scoring/dimensions/security.analyzer.js.map +1 -0
- package/dist/services/scoring/dimensions/seo.analyzer.d.ts +77 -0
- package/dist/services/scoring/dimensions/seo.analyzer.d.ts.map +1 -0
- package/dist/services/scoring/dimensions/seo.analyzer.js +502 -0
- package/dist/services/scoring/dimensions/seo.analyzer.js.map +1 -0
- package/dist/services/scoring/dimensions/test-coverage.analyzer.d.ts +106 -0
- package/dist/services/scoring/dimensions/test-coverage.analyzer.d.ts.map +1 -0
- package/dist/services/scoring/dimensions/test-coverage.analyzer.js +496 -0
- package/dist/services/scoring/dimensions/test-coverage.analyzer.js.map +1 -0
- package/dist/services/scoring/dimensions/ui-ux.analyzer.d.ts +126 -0
- package/dist/services/scoring/dimensions/ui-ux.analyzer.d.ts.map +1 -0
- package/dist/services/scoring/dimensions/ui-ux.analyzer.js +665 -0
- package/dist/services/scoring/dimensions/ui-ux.analyzer.js.map +1 -0
- package/dist/services/scoring/index.d.ts +10 -0
- package/dist/services/scoring/index.d.ts.map +1 -0
- package/dist/services/scoring/index.js +10 -0
- package/dist/services/scoring/index.js.map +1 -0
- package/dist/services/scoring/scoring-service.d.ts +222 -0
- package/dist/services/scoring/scoring-service.d.ts.map +1 -0
- package/dist/services/scoring/scoring-service.js +636 -0
- package/dist/services/scoring/scoring-service.js.map +1 -0
- package/package.json +11 -3
- package/templates/README.md +183 -0
- package/templates/nestjs/controller.spec.ts +203 -0
- package/templates/nestjs/e2e/api.e2e-spec.ts +451 -0
- package/templates/nestjs/e2e/auth.e2e-spec.ts +533 -0
- package/templates/nestjs/fixtures/test-module.ts +311 -0
- package/templates/nestjs/guard.spec.ts +314 -0
- package/templates/nestjs/interceptor.spec.ts +458 -0
- package/templates/nestjs/module.spec.ts +173 -0
- package/templates/nestjs/pipe.spec.ts +474 -0
- package/templates/nestjs/service.spec.ts +296 -0
- package/templates/rust/Cargo.toml +72 -0
- package/templates/rust/actix-controller.test.rs +114 -0
- package/templates/rust/axum-handler.test.rs +117 -0
- package/templates/rust/integration.test.rs +63 -0
- package/templates/rust/rocket-route.test.rs +106 -0
- package/templates/rust/unit.test.rs +38 -0
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Bug Detector
|
|
3
|
+
*
|
|
4
|
+
* Detects various bugs in code including:
|
|
5
|
+
* - Memory leaks (useState, useEffect patterns)
|
|
6
|
+
* - Race conditions (async/await without proper handling)
|
|
7
|
+
* - Null/undefined errors (missing guards)
|
|
8
|
+
* - Infinite loops (recursive calls)
|
|
9
|
+
* - Missing error handling (try/catch)
|
|
10
|
+
* - SQL/NoSQL injection patterns
|
|
11
|
+
* - XSS vulnerabilities (innerHTML, dangerouslySetInnerHTML)
|
|
12
|
+
*/
|
|
13
|
+
import type { BugType, DetectedBug, DetectionOptions, Severity } from '../optimization.types.js';
|
|
14
|
+
/**
|
|
15
|
+
* Bug Detector Service
|
|
16
|
+
*/
|
|
17
|
+
export declare class BugDetector {
|
|
18
|
+
private readonly logger;
|
|
19
|
+
constructor();
|
|
20
|
+
/**
|
|
21
|
+
* Detect bugs in a single file
|
|
22
|
+
*/
|
|
23
|
+
detectInFile(filePath: string, content: string, options?: DetectionOptions): Promise<DetectedBug[]>;
|
|
24
|
+
/**
|
|
25
|
+
* Detect bugs across all files in a directory
|
|
26
|
+
*/
|
|
27
|
+
detectInDirectory(dirPath: string, options?: DetectionOptions): Promise<DetectedBug[]>;
|
|
28
|
+
/**
|
|
29
|
+
* Get prioritized list of bugs
|
|
30
|
+
*/
|
|
31
|
+
prioritizeBugs(bugs: DetectedBug[]): DetectedBug[];
|
|
32
|
+
/**
|
|
33
|
+
* Get bugs by severity
|
|
34
|
+
*/
|
|
35
|
+
getBugsBySeverity(bugs: DetectedBug[], severity: Severity): DetectedBug[];
|
|
36
|
+
/**
|
|
37
|
+
* Get bugs by type
|
|
38
|
+
*/
|
|
39
|
+
getBugsByType(bugs: DetectedBug[], type: BugType): DetectedBug[];
|
|
40
|
+
/**
|
|
41
|
+
* Get fixable bugs
|
|
42
|
+
*/
|
|
43
|
+
getFixableBugs(bugs: DetectedBug[]): DetectedBug[];
|
|
44
|
+
/**
|
|
45
|
+
* Generate statistics summary
|
|
46
|
+
*/
|
|
47
|
+
generateSummary(bugs: DetectedBug[]): {
|
|
48
|
+
total: number;
|
|
49
|
+
bySeverity: Record<Severity, number>;
|
|
50
|
+
byType: Record<BugType, number>;
|
|
51
|
+
fixable: number;
|
|
52
|
+
};
|
|
53
|
+
/**
|
|
54
|
+
* Find all regex matches in content with their positions
|
|
55
|
+
*/
|
|
56
|
+
private findAllMatches;
|
|
57
|
+
/**
|
|
58
|
+
* Find line and column for a position in content
|
|
59
|
+
*/
|
|
60
|
+
private findLocation;
|
|
61
|
+
/**
|
|
62
|
+
* Generate unique bug ID
|
|
63
|
+
*/
|
|
64
|
+
private generateBugId;
|
|
65
|
+
/**
|
|
66
|
+
* Check if bug type is auto-fixable
|
|
67
|
+
*/
|
|
68
|
+
private isFixable;
|
|
69
|
+
/**
|
|
70
|
+
* Check if severity matches minimum requirement
|
|
71
|
+
*/
|
|
72
|
+
private isSeverityMatch;
|
|
73
|
+
/**
|
|
74
|
+
* Extract code snippet around a line
|
|
75
|
+
*/
|
|
76
|
+
private extractSnippet;
|
|
77
|
+
/**
|
|
78
|
+
* Get relevant files to scan
|
|
79
|
+
*/
|
|
80
|
+
private getRelevantFiles;
|
|
81
|
+
}
|
|
82
|
+
//# sourceMappingURL=bug-detector.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bug-detector.d.ts","sourceRoot":"","sources":["../../../../src/services/optimization/detectors/bug-detector.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAKH,OAAO,KAAK,EACV,OAAO,EACP,WAAW,EACX,gBAAgB,EAEhB,QAAQ,EACT,MAAM,0BAA0B,CAAC;AA2MlC;;GAEG;AACH,qBAAa,WAAW;IACtB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;;IAMhC;;OAEG;IACG,YAAY,CAChB,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,EACf,OAAO,GAAE,gBAAqB,GAC7B,OAAO,CAAC,WAAW,EAAE,CAAC;IA+CzB;;OAEG;IACG,iBAAiB,CACrB,OAAO,EAAE,MAAM,EACf,OAAO,GAAE,gBAAqB,GAC7B,OAAO,CAAC,WAAW,EAAE,CAAC;IAoBzB;;OAEG;IACH,cAAc,CAAC,IAAI,EAAE,WAAW,EAAE,GAAG,WAAW,EAAE;IAelD;;OAEG;IACH,iBAAiB,CAAC,IAAI,EAAE,WAAW,EAAE,EAAE,QAAQ,EAAE,QAAQ,GAAG,WAAW,EAAE;IAIzE;;OAEG;IACH,aAAa,CAAC,IAAI,EAAE,WAAW,EAAE,EAAE,IAAI,EAAE,OAAO,GAAG,WAAW,EAAE;IAIhE;;OAEG;IACH,cAAc,CAAC,IAAI,EAAE,WAAW,EAAE,GAAG,WAAW,EAAE;IAIlD;;OAEG;IACH,eAAe,CAAC,IAAI,EAAE,WAAW,EAAE,GAAG;QACpC,KAAK,EAAE,MAAM,CAAC;QACd,UAAU,EAAE,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QACrC,MAAM,EAAE,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAChC,OAAO,EAAE,MAAM,CAAC;KACjB;IAsBD;;OAEG;IACH,OAAO,CAAC,cAAc;IAgBtB;;OAEG;IACH,OAAO,CAAC,YAAY;IAUpB;;OAEG;IACH,OAAO,CAAC,aAAa;IAKrB;;OAEG;IACH,OAAO,CAAC,SAAS;IAIjB;;OAEG;IACH,OAAO,CAAC,eAAe;IAKvB;;OAEG;IACH,OAAO,CAAC,cAAc;IActB;;OAEG;YACW,gBAAgB;CAsD/B"}
|
|
@@ -0,0 +1,443 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Bug Detector
|
|
3
|
+
*
|
|
4
|
+
* Detects various bugs in code including:
|
|
5
|
+
* - Memory leaks (useState, useEffect patterns)
|
|
6
|
+
* - Race conditions (async/await without proper handling)
|
|
7
|
+
* - Null/undefined errors (missing guards)
|
|
8
|
+
* - Infinite loops (recursive calls)
|
|
9
|
+
* - Missing error handling (try/catch)
|
|
10
|
+
* - SQL/NoSQL injection patterns
|
|
11
|
+
* - XSS vulnerabilities (innerHTML, dangerouslySetInnerHTML)
|
|
12
|
+
*/
|
|
13
|
+
import * as fs from 'node:fs/promises';
|
|
14
|
+
import * as path from 'node:path';
|
|
15
|
+
import { createLogger } from '../../../shared/utils/logger.js';
|
|
16
|
+
/** Regex patterns for bug detection */
|
|
17
|
+
const BUG_PATTERNS = {
|
|
18
|
+
'memory-leak': [
|
|
19
|
+
{
|
|
20
|
+
pattern: /useEffect\s*\(\s*\(\)\s*=>\s*{[\s\S]*?(?:addEventListener|setInterval|setTimeout|subscribe)[\s\S]*?},\s*\[\s*\]\s*\)/gs,
|
|
21
|
+
severity: 'high',
|
|
22
|
+
description: 'Missing cleanup function in useEffect with event listener or timer',
|
|
23
|
+
fix: 'Return a cleanup function: () => {.removeEventListener(...) / clearInterval(...)}',
|
|
24
|
+
},
|
|
25
|
+
{
|
|
26
|
+
pattern: /setInterval\s*\(\s*\(\)\s*=>\s*{[\s\S]*?useState\(|[\s\S]*?setState\(/gs,
|
|
27
|
+
severity: 'high',
|
|
28
|
+
description: 'Potential stale closure in setInterval - state may not update',
|
|
29
|
+
fix: 'Use useRef to hold current state value',
|
|
30
|
+
},
|
|
31
|
+
{
|
|
32
|
+
pattern: /useCallback\s*\(\s*\(\)\s*=>\s*{[\s\S]*?},\s*\[\s*\]\s*\)[\s\S]*?useEffect/gs,
|
|
33
|
+
severity: 'medium',
|
|
34
|
+
description: 'useCallback with empty deps used in useEffect may cause stale closure',
|
|
35
|
+
fix: 'Include all dependencies in useCallback dependency array',
|
|
36
|
+
},
|
|
37
|
+
],
|
|
38
|
+
'race-condition': [
|
|
39
|
+
{
|
|
40
|
+
pattern: /\w+State\([\w\s,()]*\)\s*;\s*\w+State\([\w\s,()]*\+\s*1\)\s*;/gs,
|
|
41
|
+
severity: 'high',
|
|
42
|
+
description: 'Multiple state updates based on old state can cause race conditions',
|
|
43
|
+
fix: 'Use functional updates: setState(prev => prev + 1)',
|
|
44
|
+
},
|
|
45
|
+
{
|
|
46
|
+
pattern: /await\s+[^;]+;\s*await\s+[^;]+(?:\w+\s*=)\s*result/gs,
|
|
47
|
+
severity: 'medium',
|
|
48
|
+
description: 'Sequential async operations that could run in parallel',
|
|
49
|
+
fix: 'Use Promise.all() for parallel execution',
|
|
50
|
+
},
|
|
51
|
+
{
|
|
52
|
+
pattern: /for\s*\(\s*const\s+\w+\s+of\s+\w+\s*\)\s*{[\s\S]*?await\s+/gs,
|
|
53
|
+
severity: 'medium',
|
|
54
|
+
description: 'Sequential awaits in loop - consider Promise.all for better performance',
|
|
55
|
+
fix: 'Collect promises and use Promise.all()',
|
|
56
|
+
},
|
|
57
|
+
],
|
|
58
|
+
'null-reference': [
|
|
59
|
+
{
|
|
60
|
+
pattern: /(?:\w+\.\w+\s*\?\?\s*undefined|\w+\?\.\w+\s*\|\|[^|]|\w+\.\w+\s*\|\|\s*\w+\.\w+)/gs,
|
|
61
|
+
severity: 'medium',
|
|
62
|
+
description: 'Potential null/undefined access without proper guard',
|
|
63
|
+
fix: 'Use optional chaining (?.) or nullish coalescing (??) consistently',
|
|
64
|
+
},
|
|
65
|
+
{
|
|
66
|
+
pattern: /const\s+{\s*\w+\s*}\s*=\s*(?:req\.body|req\.query|req\.params|formData\(\)|JSON\.parse)/gs,
|
|
67
|
+
severity: 'high',
|
|
68
|
+
description: 'Destructuring without validation - may cause undefined errors',
|
|
69
|
+
fix: 'Validate input before destructuring or use default values',
|
|
70
|
+
},
|
|
71
|
+
{
|
|
72
|
+
pattern: /\[\d+\](?!\s*\?\?)/gs,
|
|
73
|
+
severity: 'low',
|
|
74
|
+
description: 'Array access without bounds checking',
|
|
75
|
+
fix: 'Check array length before accessing or use .at() with safe defaults',
|
|
76
|
+
},
|
|
77
|
+
],
|
|
78
|
+
'infinite-loop': [
|
|
79
|
+
{
|
|
80
|
+
pattern: /while\s*\(\s*true\s*\)|for\s*\(\s*;\s*;\s*\)/gs,
|
|
81
|
+
severity: 'high',
|
|
82
|
+
description: 'Infinite loop detected - ensure there is a break condition',
|
|
83
|
+
fix: 'Add proper termination condition or break statement',
|
|
84
|
+
},
|
|
85
|
+
{
|
|
86
|
+
pattern: /function\s+\w+\s*\([^)]*\)\s*{[\s\S]{0,500}return\s+\w+\([^)]*\)[\s\S]*?}/gs,
|
|
87
|
+
severity: 'critical',
|
|
88
|
+
description: 'Possible infinite recursion - no base case detected',
|
|
89
|
+
fix: 'Add base case to prevent stack overflow',
|
|
90
|
+
},
|
|
91
|
+
{
|
|
92
|
+
pattern: /useEffect\s*\(\s*\(\)\s*=>\s*{[\s\S]*?setState\([\s\S]*?},\s*\[\s*\]\s*\)/gs,
|
|
93
|
+
severity: 'critical',
|
|
94
|
+
description: 'useEffect with setState and empty deps will cause infinite loop',
|
|
95
|
+
fix: 'Add state to dependency array or use functional update',
|
|
96
|
+
},
|
|
97
|
+
],
|
|
98
|
+
'missing-error-handling': [
|
|
99
|
+
{
|
|
100
|
+
pattern: /await\s+(?:fetch|axios|\w+\.fetch|\w+\.get|\w+\.post|\w+\.query)(?:\([^)]*\))?(?!\s*\.\s*catch|[\s\S]*?try\s*{)/gs,
|
|
101
|
+
severity: 'high',
|
|
102
|
+
description: 'Async operation without error handling',
|
|
103
|
+
fix: 'Wrap in try/catch or add .catch() handler',
|
|
104
|
+
},
|
|
105
|
+
{
|
|
106
|
+
pattern: /JSON\.parse\s*\([^)]+\)(?!\s*(?:\?\s*\.|try|\.catch))/gs,
|
|
107
|
+
severity: 'high',
|
|
108
|
+
description: 'JSON.parse without try/catch can throw on invalid JSON',
|
|
109
|
+
fix: 'Wrap in try/catch block',
|
|
110
|
+
},
|
|
111
|
+
{
|
|
112
|
+
pattern: /\.then\s*\([^)]*\)\s*(?!\.catch)/gs,
|
|
113
|
+
severity: 'medium',
|
|
114
|
+
description: 'Promise chain without .catch() handler',
|
|
115
|
+
fix: 'Add .catch() to handle rejections',
|
|
116
|
+
},
|
|
117
|
+
],
|
|
118
|
+
'sql-injection': [
|
|
119
|
+
{
|
|
120
|
+
pattern: /(?:SELECT|INSERT|UPDATE|DELETE)\s+(?:(?!prepare|execute|escape|\$\d|\?|\$\w+\s*=>).)*?(?:\+\s*[^;]+|`\s*\$\s*{|`[^`]*\s*\$\s*{)/gsi,
|
|
121
|
+
severity: 'critical',
|
|
122
|
+
description: 'Possible SQL injection via string concatenation or template literal',
|
|
123
|
+
fix: 'Use parameterized queries or prepared statements',
|
|
124
|
+
},
|
|
125
|
+
{
|
|
126
|
+
pattern: /query\s*\(\s*['"`][\s\S]*?\$\{[\s\S]*?\}['"`]\s*/gs,
|
|
127
|
+
severity: 'critical',
|
|
128
|
+
description: 'SQL query with template literal interpolation',
|
|
129
|
+
fix: 'Use parameterized queries with placeholders',
|
|
130
|
+
},
|
|
131
|
+
{
|
|
132
|
+
pattern: /db\.(?:exec|query|run)\s*\(\s*[^;]*?\+\s*/gs,
|
|
133
|
+
severity: 'critical',
|
|
134
|
+
description: 'SQL query built with string concatenation',
|
|
135
|
+
fix: 'Use prepared statements with parameter binding',
|
|
136
|
+
},
|
|
137
|
+
],
|
|
138
|
+
'xss': [
|
|
139
|
+
{
|
|
140
|
+
pattern: /\.innerHTML\s*=\s*(?!.*DOMPurify|sanitize)/gs,
|
|
141
|
+
severity: 'critical',
|
|
142
|
+
description: 'XSS vulnerability: innerHTML assignment without sanitization',
|
|
143
|
+
fix: 'Use textContent or sanitize with DOMPurify',
|
|
144
|
+
},
|
|
145
|
+
{
|
|
146
|
+
pattern: /dangerouslySetInnerHTML\s*=\s*{\s*__html:\s*[^}]+}(?![\s\S]*?DOMPurify|sanitize)/gs,
|
|
147
|
+
severity: 'high',
|
|
148
|
+
description: 'React dangerouslySetInnerHTML without sanitization',
|
|
149
|
+
fix: 'Sanitize HTML with DOMPurify before rendering',
|
|
150
|
+
},
|
|
151
|
+
{
|
|
152
|
+
pattern: /document\.write\s*\(/gs,
|
|
153
|
+
severity: 'critical',
|
|
154
|
+
description: 'document.write() is vulnerable to XSS',
|
|
155
|
+
fix: 'Use DOM manipulation methods like appendChild',
|
|
156
|
+
},
|
|
157
|
+
{
|
|
158
|
+
pattern: /eval\s*\(|new\s+Function\s*\(/gs,
|
|
159
|
+
severity: 'high',
|
|
160
|
+
description: 'eval() or new Function() can lead to code injection',
|
|
161
|
+
fix: 'Avoid eval - use safer alternatives',
|
|
162
|
+
},
|
|
163
|
+
],
|
|
164
|
+
'missing-validation': [
|
|
165
|
+
{
|
|
166
|
+
pattern: /(?:req\.body|req\.query|req\.params|formData\(\)|URLSearchParams)\.[a-zA-Z_][a-zA-Z0-9_]*(?!\s*(?:\.\s*(?:validate|parse|safeParse|schema)|\|\||\?\s*\.|!))/gs,
|
|
167
|
+
severity: 'high',
|
|
168
|
+
description: 'Direct use of user input without validation',
|
|
169
|
+
fix: 'Validate with schema library (Zod, Yup, Joi)',
|
|
170
|
+
},
|
|
171
|
+
{
|
|
172
|
+
pattern: /localStorage\.(?:getItem|setItem)\s*\([^)]+\)(?![\s\S]*?validate|parse)/gs,
|
|
173
|
+
severity: 'medium',
|
|
174
|
+
description: 'localStorage value used without validation',
|
|
175
|
+
fix: 'Validate and parse localStorage values',
|
|
176
|
+
},
|
|
177
|
+
],
|
|
178
|
+
'unused-variable': [
|
|
179
|
+
{
|
|
180
|
+
pattern: /(?:const|let|var)\s+\w+\s*=\s*[^;]+;(?:\s*(?:const|let|var)\s+|[\s\S]{0,200}return)/gs,
|
|
181
|
+
severity: 'low',
|
|
182
|
+
description: 'Variable declared but potentially unused',
|
|
183
|
+
fix: 'Remove unused variable or use it',
|
|
184
|
+
},
|
|
185
|
+
{
|
|
186
|
+
pattern: /import\s+{[^}]+}\s+from\s+[^;]+;(?!.*(?:export|typeof|\w+\s*[,:]))/gs,
|
|
187
|
+
severity: 'low',
|
|
188
|
+
description: 'Import may be unused',
|
|
189
|
+
fix: 'Remove unused import',
|
|
190
|
+
},
|
|
191
|
+
],
|
|
192
|
+
'dead-code': [
|
|
193
|
+
{
|
|
194
|
+
pattern: /return\s+[^;]+;[\s\S]{0,100}(?!return|if|switch|throw|try)/gs,
|
|
195
|
+
severity: 'low',
|
|
196
|
+
description: 'Unreachable code after return statement',
|
|
197
|
+
fix: 'Remove dead code',
|
|
198
|
+
},
|
|
199
|
+
{
|
|
200
|
+
pattern: /if\s*\(\s*(?:true|false|0|1|null|undefined)\s*\)/gs,
|
|
201
|
+
severity: 'low',
|
|
202
|
+
description: 'Conditional with constant value - dead code',
|
|
203
|
+
fix: 'Remove dead branch or use actual condition',
|
|
204
|
+
},
|
|
205
|
+
],
|
|
206
|
+
};
|
|
207
|
+
/**
|
|
208
|
+
* Bug Detector Service
|
|
209
|
+
*/
|
|
210
|
+
export class BugDetector {
|
|
211
|
+
logger;
|
|
212
|
+
constructor() {
|
|
213
|
+
this.logger = createLogger('BugDetector');
|
|
214
|
+
}
|
|
215
|
+
/**
|
|
216
|
+
* Detect bugs in a single file
|
|
217
|
+
*/
|
|
218
|
+
async detectInFile(filePath, content, options = {}) {
|
|
219
|
+
const bugs = [];
|
|
220
|
+
const lines = content.split('\n');
|
|
221
|
+
// Filter by bug types if specified
|
|
222
|
+
const typesToCheck = options.bugTypes?.length
|
|
223
|
+
? options.bugTypes
|
|
224
|
+
: Object.keys(BUG_PATTERNS);
|
|
225
|
+
for (const bugType of typesToCheck) {
|
|
226
|
+
const patterns = BUG_PATTERNS[bugType];
|
|
227
|
+
if (!patterns)
|
|
228
|
+
continue;
|
|
229
|
+
for (const { pattern, severity, description, fix } of patterns) {
|
|
230
|
+
const matches = this.findAllMatches(content, pattern);
|
|
231
|
+
for (const match of matches) {
|
|
232
|
+
const location = this.findLocation(content, match.start);
|
|
233
|
+
// Check severity filter
|
|
234
|
+
if (options.minSeverity && !this.isSeverityMatch(severity, options.minSeverity)) {
|
|
235
|
+
continue;
|
|
236
|
+
}
|
|
237
|
+
const bug = {
|
|
238
|
+
id: this.generateBugId(filePath, bugType, location.line),
|
|
239
|
+
type: bugType,
|
|
240
|
+
severity,
|
|
241
|
+
description,
|
|
242
|
+
location: {
|
|
243
|
+
filePath: path.relative(process.cwd(), filePath),
|
|
244
|
+
line: location.line,
|
|
245
|
+
column: location.column,
|
|
246
|
+
},
|
|
247
|
+
fixable: this.isFixable(bugType),
|
|
248
|
+
suggestedFix: fix,
|
|
249
|
+
codeSnippet: this.extractSnippet(lines, location.line, 3),
|
|
250
|
+
};
|
|
251
|
+
bugs.push(bug);
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
return bugs;
|
|
256
|
+
}
|
|
257
|
+
/**
|
|
258
|
+
* Detect bugs across all files in a directory
|
|
259
|
+
*/
|
|
260
|
+
async detectInDirectory(dirPath, options = {}) {
|
|
261
|
+
const allBugs = [];
|
|
262
|
+
const files = await this.getRelevantFiles(dirPath, options);
|
|
263
|
+
this.logger.info(`Scanning ${files.length} files for bugs...`);
|
|
264
|
+
for (const filePath of files) {
|
|
265
|
+
try {
|
|
266
|
+
const content = await fs.readFile(filePath, 'utf-8');
|
|
267
|
+
const bugs = await this.detectInFile(filePath, content, options);
|
|
268
|
+
allBugs.push(...bugs);
|
|
269
|
+
}
|
|
270
|
+
catch (error) {
|
|
271
|
+
this.logger.warn(`Failed to analyze ${filePath}:`, error);
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
this.logger.info(`Found ${allBugs.length} bugs`);
|
|
275
|
+
return allBugs;
|
|
276
|
+
}
|
|
277
|
+
/**
|
|
278
|
+
* Get prioritized list of bugs
|
|
279
|
+
*/
|
|
280
|
+
prioritizeBugs(bugs) {
|
|
281
|
+
const severityWeight = { critical: 4, high: 3, medium: 2, low: 1 };
|
|
282
|
+
return bugs.sort((a, b) => {
|
|
283
|
+
const severityDiff = severityWeight[b.severity] - severityWeight[a.severity];
|
|
284
|
+
if (severityDiff !== 0)
|
|
285
|
+
return severityDiff;
|
|
286
|
+
// Prefer fixable bugs
|
|
287
|
+
if (a.fixable && !b.fixable)
|
|
288
|
+
return -1;
|
|
289
|
+
if (!a.fixable && b.fixable)
|
|
290
|
+
return 1;
|
|
291
|
+
return 0;
|
|
292
|
+
});
|
|
293
|
+
}
|
|
294
|
+
/**
|
|
295
|
+
* Get bugs by severity
|
|
296
|
+
*/
|
|
297
|
+
getBugsBySeverity(bugs, severity) {
|
|
298
|
+
return bugs.filter(bug => bug.severity === severity);
|
|
299
|
+
}
|
|
300
|
+
/**
|
|
301
|
+
* Get bugs by type
|
|
302
|
+
*/
|
|
303
|
+
getBugsByType(bugs, type) {
|
|
304
|
+
return bugs.filter(bug => bug.type === type);
|
|
305
|
+
}
|
|
306
|
+
/**
|
|
307
|
+
* Get fixable bugs
|
|
308
|
+
*/
|
|
309
|
+
getFixableBugs(bugs) {
|
|
310
|
+
return bugs.filter(bug => bug.fixable);
|
|
311
|
+
}
|
|
312
|
+
/**
|
|
313
|
+
* Generate statistics summary
|
|
314
|
+
*/
|
|
315
|
+
generateSummary(bugs) {
|
|
316
|
+
const bySeverity = {
|
|
317
|
+
critical: 0,
|
|
318
|
+
high: 0,
|
|
319
|
+
medium: 0,
|
|
320
|
+
low: 0,
|
|
321
|
+
};
|
|
322
|
+
const byType = {};
|
|
323
|
+
for (const bug of bugs) {
|
|
324
|
+
bySeverity[bug.severity]++;
|
|
325
|
+
byType[bug.type] = (byType[bug.type] || 0) + 1;
|
|
326
|
+
}
|
|
327
|
+
return {
|
|
328
|
+
total: bugs.length,
|
|
329
|
+
bySeverity,
|
|
330
|
+
byType: byType,
|
|
331
|
+
fixable: bugs.filter(b => b.fixable).length,
|
|
332
|
+
};
|
|
333
|
+
}
|
|
334
|
+
/**
|
|
335
|
+
* Find all regex matches in content with their positions
|
|
336
|
+
*/
|
|
337
|
+
findAllMatches(content, pattern) {
|
|
338
|
+
const matches = [];
|
|
339
|
+
const globalPattern = new RegExp(pattern.source, pattern.flags.includes('g') ? pattern.flags : pattern.flags + 'g');
|
|
340
|
+
let match;
|
|
341
|
+
while ((match = globalPattern.exec(content)) !== null) {
|
|
342
|
+
matches.push({
|
|
343
|
+
start: match.index,
|
|
344
|
+
end: match.index + match[0].length,
|
|
345
|
+
text: match[0],
|
|
346
|
+
});
|
|
347
|
+
}
|
|
348
|
+
return matches;
|
|
349
|
+
}
|
|
350
|
+
/**
|
|
351
|
+
* Find line and column for a position in content
|
|
352
|
+
*/
|
|
353
|
+
findLocation(content, position) {
|
|
354
|
+
const before = content.substring(0, position);
|
|
355
|
+
const lines = before.split('\n');
|
|
356
|
+
return {
|
|
357
|
+
line: lines.length,
|
|
358
|
+
column: lines[lines.length - 1].length + 1,
|
|
359
|
+
};
|
|
360
|
+
}
|
|
361
|
+
/**
|
|
362
|
+
* Generate unique bug ID
|
|
363
|
+
*/
|
|
364
|
+
generateBugId(filePath, type, line) {
|
|
365
|
+
const hash = Buffer.from(`${filePath}:${type}:${line}`).toString('base64').slice(0, 8);
|
|
366
|
+
return `bug-${type}-${hash}`;
|
|
367
|
+
}
|
|
368
|
+
/**
|
|
369
|
+
* Check if bug type is auto-fixable
|
|
370
|
+
*/
|
|
371
|
+
isFixable(type) {
|
|
372
|
+
return ['dead-code', 'unused-variable', 'missing-validation'].includes(type);
|
|
373
|
+
}
|
|
374
|
+
/**
|
|
375
|
+
* Check if severity matches minimum requirement
|
|
376
|
+
*/
|
|
377
|
+
isSeverityMatch(severity, minSeverity) {
|
|
378
|
+
const order = ['critical', 'high', 'medium', 'low'];
|
|
379
|
+
return order.indexOf(severity) <= order.indexOf(minSeverity);
|
|
380
|
+
}
|
|
381
|
+
/**
|
|
382
|
+
* Extract code snippet around a line
|
|
383
|
+
*/
|
|
384
|
+
extractSnippet(lines, targetLine, context) {
|
|
385
|
+
const start = Math.max(0, targetLine - context - 1);
|
|
386
|
+
const end = Math.min(lines.length, targetLine + context);
|
|
387
|
+
return lines
|
|
388
|
+
.slice(start, end)
|
|
389
|
+
.map((line, idx) => {
|
|
390
|
+
const lineNum = start + idx + 1;
|
|
391
|
+
const prefix = lineNum === targetLine ? '>>> ' : ' ';
|
|
392
|
+
return `${prefix}${lineNum}: ${line}`;
|
|
393
|
+
})
|
|
394
|
+
.join('\n');
|
|
395
|
+
}
|
|
396
|
+
/**
|
|
397
|
+
* Get relevant files to scan
|
|
398
|
+
*/
|
|
399
|
+
async getRelevantFiles(dirPath, options) {
|
|
400
|
+
const files = [];
|
|
401
|
+
const extensions = ['.ts', '.tsx', '.js', '.jsx', '.vue', '.svelte'];
|
|
402
|
+
async function walk(currentPath) {
|
|
403
|
+
try {
|
|
404
|
+
const entries = await fs.readdir(currentPath, { withFileTypes: true });
|
|
405
|
+
for (const entry of entries) {
|
|
406
|
+
const fullPath = path.join(currentPath, entry.name);
|
|
407
|
+
// Skip node_modules and common exclusions
|
|
408
|
+
if (entry.name === 'node_modules' ||
|
|
409
|
+
entry.name === '.git' ||
|
|
410
|
+
entry.name === 'dist' ||
|
|
411
|
+
entry.name === 'build' ||
|
|
412
|
+
entry.name === '.next' ||
|
|
413
|
+
entry.name === 'coverage') {
|
|
414
|
+
continue;
|
|
415
|
+
}
|
|
416
|
+
// Check exclude patterns
|
|
417
|
+
if (options.excludePatterns?.some(pattern => entry.name.match(pattern))) {
|
|
418
|
+
continue;
|
|
419
|
+
}
|
|
420
|
+
if (entry.isDirectory()) {
|
|
421
|
+
await walk(fullPath);
|
|
422
|
+
}
|
|
423
|
+
else if (entry.isFile()) {
|
|
424
|
+
const ext = path.extname(entry.name);
|
|
425
|
+
if (extensions.includes(ext)) {
|
|
426
|
+
// Check include patterns
|
|
427
|
+
if (!options.includePatterns?.length ||
|
|
428
|
+
options.includePatterns.some(pattern => entry.name.match(pattern))) {
|
|
429
|
+
files.push(fullPath);
|
|
430
|
+
}
|
|
431
|
+
}
|
|
432
|
+
}
|
|
433
|
+
}
|
|
434
|
+
}
|
|
435
|
+
catch (error) {
|
|
436
|
+
// Skip directories we can't read
|
|
437
|
+
}
|
|
438
|
+
}
|
|
439
|
+
await walk(dirPath);
|
|
440
|
+
return files;
|
|
441
|
+
}
|
|
442
|
+
}
|
|
443
|
+
//# sourceMappingURL=bug-detector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bug-detector.js","sourceRoot":"","sources":["../../../../src/services/optimization/detectors/bug-detector.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACvC,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AASlC,OAAO,EAAE,YAAY,EAAe,MAAM,iCAAiC,CAAC;AAE5E,uCAAuC;AACvC,MAAM,YAAY,GAQd;IACF,aAAa,EAAE;QACb;YACE,OAAO,EAAE,wHAAwH;YACjI,QAAQ,EAAE,MAAM;YAChB,WAAW,EAAE,oEAAoE;YACjF,GAAG,EAAE,mFAAmF;SACzF;QACD;YACE,OAAO,EAAE,yEAAyE;YAClF,QAAQ,EAAE,MAAM;YAChB,WAAW,EAAE,+DAA+D;YAC5E,GAAG,EAAE,wCAAwC;SAC9C;QACD;YACE,OAAO,EAAE,8EAA8E;YACvF,QAAQ,EAAE,QAAQ;YAClB,WAAW,EAAE,uEAAuE;YACpF,GAAG,EAAE,0DAA0D;SAChE;KACF;IACD,gBAAgB,EAAE;QAChB;YACE,OAAO,EAAE,iEAAiE;YAC1E,QAAQ,EAAE,MAAM;YAChB,WAAW,EAAE,qEAAqE;YAClF,GAAG,EAAE,oDAAoD;SAC1D;QACD;YACE,OAAO,EAAE,sDAAsD;YAC/D,QAAQ,EAAE,QAAQ;YAClB,WAAW,EAAE,wDAAwD;YACrE,GAAG,EAAE,0CAA0C;SAChD;QACD;YACE,OAAO,EAAE,8DAA8D;YACvE,QAAQ,EAAE,QAAQ;YAClB,WAAW,EAAE,yEAAyE;YACtF,GAAG,EAAE,wCAAwC;SAC9C;KACF;IACD,gBAAgB,EAAE;QAChB;YACE,OAAO,EAAE,oFAAoF;YAC7F,QAAQ,EAAE,QAAQ;YAClB,WAAW,EAAE,sDAAsD;YACnE,GAAG,EAAE,oEAAoE;SAC1E;QACD;YACE,OAAO,EAAE,2FAA2F;YACpG,QAAQ,EAAE,MAAM;YAChB,WAAW,EAAE,+DAA+D;YAC5E,GAAG,EAAE,2DAA2D;SACjE;QACD;YACE,OAAO,EAAE,sBAAsB;YAC/B,QAAQ,EAAE,KAAK;YACf,WAAW,EAAE,sCAAsC;YACnD,GAAG,EAAE,qEAAqE;SAC3E;KACF;IACD,eAAe,EAAE;QACf;YACE,OAAO,EAAE,gDAAgD;YACzD,QAAQ,EAAE,MAAM;YAChB,WAAW,EAAE,4DAA4D;YACzE,GAAG,EAAE,qDAAqD;SAC3D;QACD;YACE,OAAO,EAAE,6EAA6E;YACtF,QAAQ,EAAE,UAAU;YACpB,WAAW,EAAE,qDAAqD;YAClE,GAAG,EAAE,yCAAyC;SAC/C;QACD;YACE,OAAO,EAAE,6EAA6E;YACtF,QAAQ,EAAE,UAAU;YACpB,WAAW,EAAE,iEAAiE;YAC9E,GAAG,EAAE,wDAAwD;SAC9D;KACF;IACD,wBAAwB,EAAE;QACxB;YACE,OAAO,EAAE,mHAAmH;YAC5H,QAAQ,EAAE,MAAM;YAChB,WAAW,EAAE,wCAAwC;YACrD,GAAG,EAAE,2CAA2C;SACjD;QACD;YACE,OAAO,EAAE,yDAAyD;YAClE,QAAQ,EAAE,MAAM;YAChB,WAAW,EAAE,wDAAwD;YACrE,GAAG,EAAE,yBAAyB;SAC/B;QACD;YACE,OAAO,EAAE,oCAAoC;YAC7C,QAAQ,EAAE,QAAQ;YAClB,WAAW,EAAE,wCAAwC;YACrD,GAAG,EAAE,mCAAmC;SACzC;KACF;IACD,eAAe,EAAE;QACf;YACE,OAAO,EAAE,oIAAoI;YAC7I,QAAQ,EAAE,UAAU;YACpB,WAAW,EAAE,qEAAqE;YAClF,GAAG,EAAE,kDAAkD;SACxD;QACD;YACE,OAAO,EAAE,oDAAoD;YAC7D,QAAQ,EAAE,UAAU;YACpB,WAAW,EAAE,+CAA+C;YAC5D,GAAG,EAAE,6CAA6C;SACnD;QACD;YACE,OAAO,EAAE,6CAA6C;YACtD,QAAQ,EAAE,UAAU;YACpB,WAAW,EAAE,2CAA2C;YACxD,GAAG,EAAE,gDAAgD;SACtD;KACF;IACD,KAAK,EAAE;QACL;YACE,OAAO,EAAE,8CAA8C;YACvD,QAAQ,EAAE,UAAU;YACpB,WAAW,EAAE,8DAA8D;YAC3E,GAAG,EAAE,4CAA4C;SAClD;QACD;YACE,OAAO,EAAE,oFAAoF;YAC7F,QAAQ,EAAE,MAAM;YAChB,WAAW,EAAE,oDAAoD;YACjE,GAAG,EAAE,+CAA+C;SACrD;QACD;YACE,OAAO,EAAE,wBAAwB;YACjC,QAAQ,EAAE,UAAU;YACpB,WAAW,EAAE,uCAAuC;YACpD,GAAG,EAAE,+CAA+C;SACrD;QACD;YACE,OAAO,EAAE,iCAAiC;YAC1C,QAAQ,EAAE,MAAM;YAChB,WAAW,EAAE,qDAAqD;YAClE,GAAG,EAAE,qCAAqC;SAC3C;KACF;IACD,oBAAoB,EAAE;QACpB;YACE,OAAO,EAAE,+JAA+J;YACxK,QAAQ,EAAE,MAAM;YAChB,WAAW,EAAE,6CAA6C;YAC1D,GAAG,EAAE,8CAA8C;SACpD;QACD;YACE,OAAO,EAAE,2EAA2E;YACpF,QAAQ,EAAE,QAAQ;YAClB,WAAW,EAAE,4CAA4C;YACzD,GAAG,EAAE,wCAAwC;SAC9C;KACF;IACD,iBAAiB,EAAE;QACjB;YACE,OAAO,EAAE,uFAAuF;YAChG,QAAQ,EAAE,KAAK;YACf,WAAW,EAAE,0CAA0C;YACvD,GAAG,EAAE,kCAAkC;SACxC;QACD;YACE,OAAO,EAAE,sEAAsE;YAC/E,QAAQ,EAAE,KAAK;YACf,WAAW,EAAE,sBAAsB;YACnC,GAAG,EAAE,sBAAsB;SAC5B;KACF;IACD,WAAW,EAAE;QACX;YACE,OAAO,EAAE,8DAA8D;YACvE,QAAQ,EAAE,KAAK;YACf,WAAW,EAAE,yCAAyC;YACtD,GAAG,EAAE,kBAAkB;SACxB;QACD;YACE,OAAO,EAAE,oDAAoD;YAC7D,QAAQ,EAAE,KAAK;YACf,WAAW,EAAE,6CAA6C;YAC1D,GAAG,EAAE,4CAA4C;SAClD;KACF;CACF,CAAC;AAEF;;GAEG;AACH,MAAM,OAAO,WAAW;IACL,MAAM,CAAS;IAEhC;QACE,IAAI,CAAC,MAAM,GAAG,YAAY,CAAC,aAAa,CAAC,CAAC;IAC5C,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,YAAY,CAChB,QAAgB,EAChB,OAAe,EACf,UAA4B,EAAE;QAE9B,MAAM,IAAI,GAAkB,EAAE,CAAC;QAC/B,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAElC,mCAAmC;QACnC,MAAM,YAAY,GAAG,OAAO,CAAC,QAAQ,EAAE,MAAM;YAC3C,CAAC,CAAC,OAAO,CAAC,QAAQ;YAClB,CAAC,CAAE,MAAM,CAAC,IAAI,CAAC,YAAY,CAAe,CAAC;QAE7C,KAAK,MAAM,OAAO,IAAI,YAAY,EAAE,CAAC;YACnC,MAAM,QAAQ,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC;YACvC,IAAI,CAAC,QAAQ;gBAAE,SAAS;YAExB,KAAK,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,GAAG,EAAE,IAAI,QAAQ,EAAE,CAAC;gBAC/D,MAAM,OAAO,GAAG,IAAI,CAAC,cAAc,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;gBAEtD,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;oBAC5B,MAAM,QAAQ,GAAG,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;oBAEzD,wBAAwB;oBACxB,IAAI,OAAO,CAAC,WAAW,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,QAAQ,EAAE,OAAO,CAAC,WAAW,CAAC,EAAE,CAAC;wBAChF,SAAS;oBACX,CAAC;oBAED,MAAM,GAAG,GAAgB;wBACvB,EAAE,EAAE,IAAI,CAAC,aAAa,CAAC,QAAQ,EAAE,OAAO,EAAE,QAAQ,CAAC,IAAI,CAAC;wBACxD,IAAI,EAAE,OAAO;wBACb,QAAQ;wBACR,WAAW;wBACX,QAAQ,EAAE;4BACR,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,QAAQ,CAAC;4BAChD,IAAI,EAAE,QAAQ,CAAC,IAAI;4BACnB,MAAM,EAAE,QAAQ,CAAC,MAAM;yBACxB;wBACD,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC;wBAChC,YAAY,EAAE,GAAG;wBACjB,WAAW,EAAE,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC;qBAC1D,CAAC;oBAEF,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;gBACjB,CAAC;YACH,CAAC;QACH,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,iBAAiB,CACrB,OAAe,EACf,UAA4B,EAAE;QAE9B,MAAM,OAAO,GAAkB,EAAE,CAAC;QAClC,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAE5D,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,YAAY,KAAK,CAAC,MAAM,oBAAoB,CAAC,CAAC;QAE/D,KAAK,MAAM,QAAQ,IAAI,KAAK,EAAE,CAAC;YAC7B,IAAI,CAAC;gBACH,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;gBACrD,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;gBACjE,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC;YACxB,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,qBAAqB,QAAQ,GAAG,EAAE,KAAK,CAAC,CAAC;YAC5D,CAAC;QACH,CAAC;QAED,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,OAAO,CAAC,MAAM,OAAO,CAAC,CAAC;QACjD,OAAO,OAAO,CAAC;IACjB,CAAC;IAED;;OAEG;IACH,cAAc,CAAC,IAAmB;QAChC,MAAM,cAAc,GAAG,EAAE,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC;QAEnE,OAAO,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;YACxB,MAAM,YAAY,GAAG,cAAc,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,cAAc,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;YAC7E,IAAI,YAAY,KAAK,CAAC;gBAAE,OAAO,YAAY,CAAC;YAE5C,sBAAsB;YACtB,IAAI,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,CAAC,OAAO;gBAAE,OAAO,CAAC,CAAC,CAAC;YACvC,IAAI,CAAC,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,OAAO;gBAAE,OAAO,CAAC,CAAC;YAEtC,OAAO,CAAC,CAAC;QACX,CAAC,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACH,iBAAiB,CAAC,IAAmB,EAAE,QAAkB;QACvD,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC;IACvD,CAAC;IAED;;OAEG;IACH,aAAa,CAAC,IAAmB,EAAE,IAAa;QAC9C,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;IAC/C,CAAC;IAED;;OAEG;IACH,cAAc,CAAC,IAAmB;QAChC,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IACzC,CAAC;IAED;;OAEG;IACH,eAAe,CAAC,IAAmB;QAMjC,MAAM,UAAU,GAA6B;YAC3C,QAAQ,EAAE,CAAC;YACX,IAAI,EAAE,CAAC;YACP,MAAM,EAAE,CAAC;YACT,GAAG,EAAE,CAAC;SACP,CAAC;QACF,MAAM,MAAM,GAA2B,EAAE,CAAC;QAE1C,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;YACvB,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC3B,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;QACjD,CAAC;QAED,OAAO;YACL,KAAK,EAAE,IAAI,CAAC,MAAM;YAClB,UAAU;YACV,MAAM,EAAE,MAAiC;YACzC,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,MAAM;SAC5C,CAAC;IACJ,CAAC;IAED;;OAEG;IACK,cAAc,CAAC,OAAe,EAAE,OAAe;QACrD,MAAM,OAAO,GAAwD,EAAE,CAAC;QACxE,MAAM,aAAa,GAAG,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,GAAG,GAAG,CAAC,CAAC;QAEpH,IAAI,KAA6B,CAAC;QAClC,OAAO,CAAC,KAAK,GAAG,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;YACtD,OAAO,CAAC,IAAI,CAAC;gBACX,KAAK,EAAE,KAAK,CAAC,KAAK;gBAClB,GAAG,EAAE,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM;gBAClC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC;aACf,CAAC,CAAC;QACL,CAAC;QAED,OAAO,OAAO,CAAC;IACjB,CAAC;IAED;;OAEG;IACK,YAAY,CAAC,OAAe,EAAE,QAAgB;QACpD,MAAM,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;QAC9C,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAEjC,OAAO;YACL,IAAI,EAAE,KAAK,CAAC,MAAM;YAClB,MAAM,EAAE,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC;SAC3C,CAAC;IACJ,CAAC;IAED;;OAEG;IACK,aAAa,CAAC,QAAgB,EAAE,IAAa,EAAE,IAAY;QACjE,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,QAAQ,IAAI,IAAI,IAAI,IAAI,EAAE,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACvF,OAAO,OAAO,IAAI,IAAI,IAAI,EAAE,CAAC;IAC/B,CAAC;IAED;;OAEG;IACK,SAAS,CAAC,IAAa;QAC7B,OAAO,CAAC,WAAW,EAAE,iBAAiB,EAAE,oBAAoB,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;IAC/E,CAAC;IAED;;OAEG;IACK,eAAe,CAAC,QAAkB,EAAE,WAAqB;QAC/D,MAAM,KAAK,GAAe,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC;QAChE,OAAO,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;IAC/D,CAAC;IAED;;OAEG;IACK,cAAc,CAAC,KAAe,EAAE,UAAkB,EAAE,OAAe;QACzE,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,UAAU,GAAG,OAAO,GAAG,CAAC,CAAC,CAAC;QACpD,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC,CAAC;QAEzD,OAAO,KAAK;aACT,KAAK,CAAC,KAAK,EAAE,GAAG,CAAC;aACjB,GAAG,CAAC,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE;YACjB,MAAM,OAAO,GAAG,KAAK,GAAG,GAAG,GAAG,CAAC,CAAC;YAChC,MAAM,MAAM,GAAG,OAAO,KAAK,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC;YACxD,OAAO,GAAG,MAAM,GAAG,OAAO,KAAK,IAAI,EAAE,CAAC;QACxC,CAAC,CAAC;aACD,IAAI,CAAC,IAAI,CAAC,CAAC;IAChB,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,gBAAgB,CAC5B,OAAe,EACf,OAAyB;QAEzB,MAAM,KAAK,GAAa,EAAE,CAAC;QAC3B,MAAM,UAAU,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC;QAErE,KAAK,UAAU,IAAI,CAAC,WAAmB;YACrC,IAAI,CAAC;gBACH,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;gBAEvE,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;oBAC5B,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;oBAEpD,0CAA0C;oBAC1C,IACE,KAAK,CAAC,IAAI,KAAK,cAAc;wBAC7B,KAAK,CAAC,IAAI,KAAK,MAAM;wBACrB,KAAK,CAAC,IAAI,KAAK,MAAM;wBACrB,KAAK,CAAC,IAAI,KAAK,OAAO;wBACtB,KAAK,CAAC,IAAI,KAAK,OAAO;wBACtB,KAAK,CAAC,IAAI,KAAK,UAAU,EACzB,CAAC;wBACD,SAAS;oBACX,CAAC;oBAED,yBAAyB;oBACzB,IAAI,OAAO,CAAC,eAAe,EAAE,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC;wBACxE,SAAS;oBACX,CAAC;oBAED,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;wBACxB,MAAM,IAAI,CAAC,QAAQ,CAAC,CAAC;oBACvB,CAAC;yBAAM,IAAI,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC;wBAC1B,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;wBACrC,IAAI,UAAU,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;4BAC7B,yBAAyB;4BACzB,IACE,CAAC,OAAO,CAAC,eAAe,EAAE,MAAM;gCAChC,OAAO,CAAC,eAAe,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,EAClE,CAAC;gCACD,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;4BACvB,CAAC;wBACH,CAAC;oBACH,CAAC;gBACH,CAAC;YACH,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,iCAAiC;YACnC,CAAC;QACH,CAAC;QAED,MAAM,IAAI,CAAC,OAAO,CAAC,CAAC;QACpB,OAAO,KAAK,CAAC;IACf,CAAC;CACF"}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Code Smell Detector
|
|
3
|
+
*
|
|
4
|
+
* Detects code smells including:
|
|
5
|
+
* - Long functions (>50 lines)
|
|
6
|
+
* - Deep nesting (>4 levels)
|
|
7
|
+
* - Magic numbers
|
|
8
|
+
* - God objects
|
|
9
|
+
* - Feature envy
|
|
10
|
+
* - Inappropriate intimacy
|
|
11
|
+
* - Duplicated code
|
|
12
|
+
*/
|
|
13
|
+
import type { CodeSmell, CodeSmellType, DetectionOptions, Severity } from '../optimization.types.js';
|
|
14
|
+
/**
|
|
15
|
+
* Code Smell Detector Service
|
|
16
|
+
*/
|
|
17
|
+
export declare class CodeSmellDetector {
|
|
18
|
+
private readonly logger;
|
|
19
|
+
private readonly fileContents;
|
|
20
|
+
private readonly hashes;
|
|
21
|
+
constructor();
|
|
22
|
+
/**
|
|
23
|
+
* Detect code smells in a single file
|
|
24
|
+
*/
|
|
25
|
+
detectInFile(filePath: string, content: string, options?: DetectionOptions): Promise<CodeSmell[]>;
|
|
26
|
+
/**
|
|
27
|
+
* Detect code smells across all files in a directory
|
|
28
|
+
*/
|
|
29
|
+
detectInDirectory(dirPath: string, options?: DetectionOptions): Promise<CodeSmell[]>;
|
|
30
|
+
/**
|
|
31
|
+
* Get prioritized list of code smells
|
|
32
|
+
*/
|
|
33
|
+
prioritizeSmells(smells: CodeSmell[]): CodeSmell[];
|
|
34
|
+
/**
|
|
35
|
+
* Get smells by type
|
|
36
|
+
*/
|
|
37
|
+
getSmellsByType(smells: CodeSmell[], type: CodeSmellType): CodeSmell[];
|
|
38
|
+
/**
|
|
39
|
+
* Get smells by severity
|
|
40
|
+
*/
|
|
41
|
+
getSmellsBySeverity(smells: CodeSmell[], severity: Severity): CodeSmell[];
|
|
42
|
+
/**
|
|
43
|
+
* Generate statistics summary
|
|
44
|
+
*/
|
|
45
|
+
generateSummary(smells: CodeSmell[]): {
|
|
46
|
+
total: number;
|
|
47
|
+
byType: Record<CodeSmellType, number>;
|
|
48
|
+
bySeverity: Record<Severity, number>;
|
|
49
|
+
avgComplexity: number;
|
|
50
|
+
};
|
|
51
|
+
/**
|
|
52
|
+
* Detect long functions
|
|
53
|
+
*/
|
|
54
|
+
private detectLongFunctions;
|
|
55
|
+
/**
|
|
56
|
+
* Detect deep nesting
|
|
57
|
+
*/
|
|
58
|
+
private detectDeepNesting;
|
|
59
|
+
/**
|
|
60
|
+
* Detect magic numbers
|
|
61
|
+
*/
|
|
62
|
+
private detectMagicNumbers;
|
|
63
|
+
/**
|
|
64
|
+
* Detect god objects
|
|
65
|
+
*/
|
|
66
|
+
private detectGodObjects;
|
|
67
|
+
/**
|
|
68
|
+
* Detect complex conditions
|
|
69
|
+
*/
|
|
70
|
+
private detectComplexConditions;
|
|
71
|
+
/**
|
|
72
|
+
* Detect parameter hell (too many parameters)
|
|
73
|
+
*/
|
|
74
|
+
private detectParameterHell;
|
|
75
|
+
/**
|
|
76
|
+
* Detect shotgun surgery (many files need to be modified for one change)
|
|
77
|
+
*/
|
|
78
|
+
private detectShotgunSurgery;
|
|
79
|
+
/**
|
|
80
|
+
* Detect duplicated code across files
|
|
81
|
+
*/
|
|
82
|
+
private detectDuplicatedCode;
|
|
83
|
+
/**
|
|
84
|
+
* Detect indentation size from file
|
|
85
|
+
*/
|
|
86
|
+
private detectIndentSize;
|
|
87
|
+
/**
|
|
88
|
+
* Normalize code for duplicate detection
|
|
89
|
+
*/
|
|
90
|
+
private normalizeCode;
|
|
91
|
+
/**
|
|
92
|
+
* Suggest a constant name based on context
|
|
93
|
+
*/
|
|
94
|
+
private suggestConstantName;
|
|
95
|
+
/**
|
|
96
|
+
* Generate unique smell ID
|
|
97
|
+
*/
|
|
98
|
+
private generateSmellId;
|
|
99
|
+
/**
|
|
100
|
+
* Check if severity matches minimum requirement
|
|
101
|
+
*/
|
|
102
|
+
private isSeverityMatch;
|
|
103
|
+
/**
|
|
104
|
+
* Get relevant files to scan
|
|
105
|
+
*/
|
|
106
|
+
private getRelevantFiles;
|
|
107
|
+
}
|
|
108
|
+
//# sourceMappingURL=code-smell-detector.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"code-smell-detector.d.ts","sourceRoot":"","sources":["../../../../src/services/optimization/detectors/code-smell-detector.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAMH,OAAO,KAAK,EACV,SAAS,EACT,aAAa,EACb,gBAAgB,EAEhB,QAAQ,EACT,MAAM,0BAA0B,CAAC;AAclC;;GAEG;AACH,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAkC;IAC/D,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAkC;;IAMzD;;OAEG;IACG,YAAY,CAChB,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,EACf,OAAO,GAAE,gBAAqB,GAC7B,OAAO,CAAC,SAAS,EAAE,CAAC;IA6BvB;;OAEG;IACG,iBAAiB,CACrB,OAAO,EAAE,MAAM,EACf,OAAO,GAAE,gBAAqB,GAC7B,OAAO,CAAC,SAAS,EAAE,CAAC;IA6BvB;;OAEG;IACH,gBAAgB,CAAC,MAAM,EAAE,SAAS,EAAE,GAAG,SAAS,EAAE;IAelD;;OAEG;IACH,eAAe,CAAC,MAAM,EAAE,SAAS,EAAE,EAAE,IAAI,EAAE,aAAa,GAAG,SAAS,EAAE;IAItE;;OAEG;IACH,mBAAmB,CAAC,MAAM,EAAE,SAAS,EAAE,EAAE,QAAQ,EAAE,QAAQ,GAAG,SAAS,EAAE;IAIzE;;OAEG;IACH,eAAe,CAAC,MAAM,EAAE,SAAS,EAAE,GAAG;QACpC,KAAK,EAAE,MAAM,CAAC;QACd,MAAM,EAAE,MAAM,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC;QACtC,UAAU,EAAE,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QACrC,aAAa,EAAE,MAAM,CAAC;KACvB;IAwBD;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAoE3B;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAgCzB;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAuD1B;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAyCxB;;OAEG;IACH,OAAO,CAAC,uBAAuB;IA8B/B;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAmC3B;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAgC5B;;OAEG;YACW,oBAAoB;IA4DlC;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAaxB;;OAEG;IACH,OAAO,CAAC,aAAa;IAUrB;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAwB3B;;OAEG;IACH,OAAO,CAAC,eAAe;IAKvB;;OAEG;IACH,OAAO,CAAC,eAAe;IAKvB;;OAEG;YACW,gBAAgB;CAgD/B"}
|