@re-shell/cli
Version:
Full-stack development platform uniting microservices and microfrontends. Build complete applications with .NET (ASP.NET Core Web API, Minimal API), Java (Spring Boot, Quarkus, Micronaut, Vert.x), Rust (Actix-Web, Warp, Rocket, Axum), Python (FastAPI, Dja
335 lines (334 loc) • 9 kB
TypeScript
import { EventEmitter } from 'events';
export interface CodeQualityConfig {
sonarQube?: SonarQubeConfig;
eslint?: ESLintConfig;
customRules?: CustomRule[];
thresholds?: QualityThresholds;
excludePatterns?: string[];
includePatterns?: string[];
generateReport?: boolean;
outputPath?: string;
integrations?: QualityIntegration[];
}
export interface SonarQubeConfig {
serverUrl: string;
token?: string;
projectKey: string;
projectName?: string;
sources?: string[];
exclusions?: string[];
qualityGate?: string;
profile?: string;
properties?: Record<string, string>;
}
export interface ESLintConfig {
configPath?: string;
rules?: Record<string, any>;
extends?: string[];
plugins?: string[];
parser?: string;
parserOptions?: any;
env?: Record<string, boolean>;
}
export interface CustomRule {
id: string;
name: string;
description: string;
severity: 'info' | 'minor' | 'major' | 'critical' | 'blocker';
type: 'bug' | 'vulnerability' | 'code_smell' | 'security_hotspot';
pattern?: RegExp;
check: (file: FileAnalysis) => RuleViolation[];
autoFix?: (content: string, violations: RuleViolation[]) => string;
}
export interface QualityThresholds {
bugs: number;
vulnerabilities: number;
codeSmells: number;
coverage: number;
duplicatedLines: number;
maintainabilityRating: 'A' | 'B' | 'C' | 'D' | 'E';
reliabilityRating: 'A' | 'B' | 'C' | 'D' | 'E';
securityRating: 'A' | 'B' | 'C' | 'D' | 'E';
}
export interface QualityIntegration {
type: 'github' | 'gitlab' | 'slack' | 'jira' | 'custom';
config: any;
events: string[];
}
export interface FileAnalysis {
path: string;
content: string;
lines: number;
complexity: number;
maintainabilityIndex: number;
dependencies: string[];
exports: string[];
imports: string[];
functions: FunctionInfo[];
classes: ClassInfo[];
issues: Issue[];
}
export interface FunctionInfo {
name: string;
startLine: number;
endLine: number;
complexity: number;
parameters: number;
returns: string;
documented: boolean;
}
export interface ClassInfo {
name: string;
startLine: number;
endLine: number;
methods: number;
properties: number;
extends?: string;
implements?: string[];
documented: boolean;
}
export interface Issue {
rule: string;
severity: 'info' | 'minor' | 'major' | 'critical' | 'blocker';
type: 'bug' | 'vulnerability' | 'code_smell' | 'security_hotspot';
message: string;
line: number;
column?: number;
effort?: string;
debt?: string;
tags?: string[];
}
export interface RuleViolation {
line: number;
column?: number;
message: string;
severity: Issue['severity'];
suggestion?: string;
autoFixable?: boolean;
}
export interface QualityAnalysisResult {
project: string;
timestamp: Date;
summary: QualitySummary;
files: FileAnalysis[];
metrics: QualityMetrics;
issues: Issue[];
sonarQube?: SonarQubeResult;
trends?: QualityTrend[];
recommendations: string[];
}
export interface QualitySummary {
totalFiles: number;
totalLines: number;
totalIssues: number;
bugCount: number;
vulnerabilityCount: number;
codeSmellCount: number;
duplicatedLines: number;
technicalDebt: string;
maintainabilityRating: string;
reliabilityRating: string;
securityRating: string;
}
export interface QualityMetrics {
complexity: ComplexityMetrics;
maintainability: MaintainabilityMetrics;
reliability: ReliabilityMetrics;
security: SecurityMetrics;
coverage: CoverageMetrics;
duplication: DuplicationMetrics;
}
export interface ComplexityMetrics {
average: number;
maximum: number;
distribution: Record<string, number>;
hotspots: ComplexityHotspot[];
}
export interface ComplexityHotspot {
file: string;
function: string;
complexity: number;
line: number;
suggestion: string;
}
export interface MaintainabilityMetrics {
index: number;
rating: string;
factors: MaintainabilityFactor[];
debt: string;
}
export interface MaintainabilityFactor {
factor: string;
impact: number;
description: string;
}
export interface ReliabilityMetrics {
rating: string;
bugs: number;
effort: string;
issues: Issue[];
}
export interface SecurityMetrics {
rating: string;
vulnerabilities: number;
hotspots: number;
effort: string;
issues: Issue[];
}
export interface CoverageMetrics {
lines: number;
branches: number;
functions: number;
overall: number;
}
export interface DuplicationMetrics {
lines: number;
blocks: number;
files: number;
percentage: number;
duplicatedFiles: DuplicatedFile[];
}
export interface DuplicatedFile {
file: string;
duplicatedLines: number;
duplicates: DuplicateBlock[];
}
export interface DuplicateBlock {
startLine: number;
endLine: number;
duplicatedIn: string[];
}
export interface SonarQubeResult {
qualityGate: QualityGateResult;
measures: SonarMeasure[];
issues: SonarIssue[];
hotspots: SecurityHotspot[];
}
export interface QualityGateResult {
status: 'OK' | 'WARN' | 'ERROR';
conditions: QualityGateCondition[];
}
export interface QualityGateCondition {
metric: string;
operator: string;
value: string;
actual: string;
status: 'OK' | 'WARN' | 'ERROR';
}
export interface SonarMeasure {
metric: string;
value: string;
component: string;
}
export interface SonarIssue {
key: string;
rule: string;
severity: string;
component: string;
line?: number;
message: string;
effort?: string;
debt?: string;
status: string;
type: string;
}
export interface SecurityHotspot {
key: string;
component: string;
line?: number;
message: string;
status: string;
vulnerabilityProbability: 'HIGH' | 'MEDIUM' | 'LOW';
securityCategory: string;
}
export interface QualityTrend {
date: Date;
metric: string;
value: number;
change: number;
direction: 'improving' | 'degrading' | 'stable';
}
export interface QualityReport {
summary: QualityReportSummary;
analysis: QualityAnalysisResult;
comparison?: QualityComparison;
actionPlan: ActionItem[];
timestamp: Date;
}
export interface QualityReportSummary {
overallRating: string;
totalIssues: number;
criticalIssues: number;
technicalDebt: string;
coverage: number;
maintainabilityTrend: 'improving' | 'degrading' | 'stable';
}
export interface QualityComparison {
baseline: Date;
changes: QualityChange[];
improvements: string[];
regressions: string[];
}
export interface QualityChange {
metric: string;
before: number;
after: number;
change: number;
percentage: number;
}
export interface ActionItem {
priority: 'high' | 'medium' | 'low';
category: 'bug' | 'vulnerability' | 'maintainability' | 'coverage';
title: string;
description: string;
effort: string;
impact: string;
files?: string[];
}
export declare class CodeQualityAnalyzer extends EventEmitter {
private config;
constructor(config: CodeQualityConfig);
analyze(projectPath: string): Promise<QualityAnalysisResult>;
private findSourceFiles;
private analyzeFile;
private calculateComplexity;
private calculateMaintainabilityIndex;
private extractDependencies;
private extractExports;
private extractImports;
private extractFunctions;
private extractClasses;
private findFunctionEnd;
private findClassEnd;
private calculateFunctionComplexity;
private countParameters;
private countMethods;
private countProperties;
private isFunctionDocumented;
private isClassDocumented;
private analyzeForIssues;
private runESLintAnalysis;
private generateESLintConfig;
private mapESLintSeverity;
private runSonarQubeAnalysis;
private generateSonarProperties;
private fetchSonarQubeResults;
private applyCustomRules;
private calculateMetrics;
private calculateComplexityDistribution;
private identifyComplexityHotspots;
private calculateMaintainabilityRating;
private identifyMaintainabilityFactors;
private calculateTechnicalDebt;
private generateSummary;
private generateRecommendations;
private calculateTrends;
generateReport(analysisResult: QualityAnalysisResult): Promise<QualityReport>;
private generateActionPlan;
private saveReport;
private generateHtmlReport;
private createEmptySummary;
private createEmptyMetrics;
}
export declare function createCustomRule(id: string, name: string, check: (file: FileAnalysis) => RuleViolation[]): CustomRule;
export declare function analyzeCodeQuality(projectPath: string, config?: Partial<CodeQualityConfig>): Promise<QualityReport>;