UNPKG

code-insight-analyst

Version:
1,108 lines (1,092 loc) 23.5 kB
export { run } from './cli/index.js'; /** * 核心分析引擎 */ /** * 分析选项接口 */ interface AnalysisOptions { /** * 要分析的项目目录路径 */ directory: string; /** * 是否启用详细日志 */ verbose?: boolean; /** * 输出报告路径 */ outputPath?: string; /** * 分析类型列表 */ analysisTypes: string[]; } /** * 分析引擎类 */ declare class AnalysisEngine { private options; constructor(options: AnalysisOptions); /** * 执行分析 */ analyze(): Promise<Record<string, unknown>>; } /** * 任务类型 */ type Task<TInput = unknown> = { /** * 任务ID */ id: string; /** * 任务处理函数的路径 * 相对于项目根目录的路径 */ handlerPath: string; /** * 任务输入数据 */ input: TInput; /** * 优先级 * 数值越低优先级越高 */ priority?: number; }; /** * 任务结果 */ type TaskResult<T = unknown> = { /** * 任务ID */ taskId: string; /** * 任务结果 */ result: T; /** * 是否成功 */ success: boolean; /** * 错误信息 */ error?: string; /** * 执行时间(毫秒) */ executionTime: number; }; /** * 并行处理器类 * 使用worker_threads实现多进程任务处理 */ declare class ParallelProcessor { private maxWorkers; private workerScript; /** * 工作线程池 */ private workers; /** * 任务队列 */ private taskQueue; /** * 任务结果 */ private results; /** * 事件发射器 */ private emitter; /** * 正在处理中的任务数 */ private processingTasks; /** * 是否正在运行 */ private isRunning; /** * 构造函数 * * @param maxWorkers - 最大工作线程数 * @param workerScript - 工作线程脚本路径 */ constructor(maxWorkers?: number, workerScript?: string); /** * 初始化工作线程池 */ private initializeWorkers; /** * 添加任务 * * @param task - 任务 * @returns 任务ID */ addTask<TInput>(task: Task<TInput>): string; /** * 添加多个任务 * * @param tasks - 任务列表 * @returns 任务ID列表 */ addTasks<TInput>(tasks: Task<TInput>[]): string[]; /** * 处理下一个任务 * * @param worker - 工作线程 */ private processNextTask; /** * 启动处理器 */ start(): void; /** * 停止处理器 */ stop(): Promise<void>; /** * 等待任务完成 * * @param taskId - 任务ID * @returns 任务结果 */ waitForTask<T>(taskId: string): Promise<TaskResult<T>>; /** * 等待所有任务完成 * * @returns 所有任务的结果 */ waitForAll<T>(): Promise<TaskResult<T>[]>; /** * 执行任务集合 * * @param tasks - 任务列表 * @returns 任务结果列表 */ execute<TInput, TResult>(tasks: Task<TInput>[]): Promise<TaskResult<TResult>[]>; /** * 获取待处理任务数量 * * @returns 待处理任务数量 */ getPendingTaskCount(): number; /** * 获取处理中任务数量 * * @returns 处理中任务数量 */ getProcessingTaskCount(): number; } /** * 单个文件的分析位置信息 */ interface ILocation { /** * 文件路径 */ filePath: string; /** * 开始行号 */ startLine?: number; /** * 结束行号 */ endLine?: number; /** * 开始列号 */ startColumn?: number; /** * 结束列号 */ endColumn?: number; } /** * 代码覆盖率分析结果 */ interface ICoverageResult { /** * 文件路径 */ filePath: string; /** * 行覆盖率 */ lineCoverage: number; /** * 语句覆盖率 */ statementCoverage: number; /** * 分支覆盖率 */ branchCoverage: number; /** * 函数覆盖率 */ functionCoverage: number; /** * 未覆盖的行 */ uncoveredLines: number[]; } /** * 重复代码分析结果 */ interface IDuplicateResult { /** * 重复代码块 */ duplicates: Array<{ /** * 重复代码的位置信息 */ locations: ILocation[]; /** * 重复代码的行数 */ lines: number; /** * 重复代码的相似度 */ similarity: number; /** * 重复代码的片段 */ snippet?: string; }>; /** * 总重复率 */ totalDuplicationRate: number; } /** * 未使用代码分析结果 */ interface IUnusedCodeResult { /** * 未使用的导入 */ unusedImports: ILocation[]; /** * 未使用的变量 */ unusedVariables: ILocation[]; /** * 未使用的函数 */ unusedFunctions: ILocation[]; /** * 未使用的类 */ unusedClasses: ILocation[]; /** * 未使用的导出 */ unusedExports: ILocation[]; } /** * 依赖关系分析结果 */ interface IDependencyResult { /** * 依赖图(邻接表表示) */ dependencyGraph: Record<string, string[]>; /** * 循环依赖 */ circularDependencies: Array<string[]>; /** * 未使用的依赖 */ unusedDependencies: string[]; /** * 缺失的依赖 */ missingDependencies: string[]; } /** * 内存泄漏分析结果 */ interface IMemoryLeakResult { /** * 可能导致内存泄漏的代码 */ potentialLeaks: Array<{ /** * 位置信息 */ location: ILocation; /** * 泄漏风险级别 */ riskLevel: 'low' | 'medium' | 'high'; /** * 泄漏类型 */ type: string; /** * 描述 */ description: string; }>; } /** * 死循环检测结果 */ interface IInfiniteLoopResult { /** * 可能的无限循环 */ potentialInfiniteLoops: Array<{ /** * 位置信息 */ location: ILocation; /** * 风险级别 */ riskLevel: 'low' | 'medium' | 'high'; /** * 原因 */ reason: string; /** * 修复建议 */ suggestion?: string; }>; } /** * 增量分析相关信息 */ interface IIncrementalInfo { /** * 基准提交 SHA */ baseCommit?: string; /** * 当前提交 SHA */ currentCommit?: string; /** * 改动文件列表 */ changedFiles: string[]; /** * 与基准对比的变化趋势 */ trends?: { /** * 代码覆盖率变化 */ coverageTrend?: number; /** * 重复代码变化 */ duplicationTrend?: number; /** * 未使用代码变化 */ unusedCodeTrend?: number; /** * 循环依赖变化 */ circularDependenciesTrend?: number; }; } /** * 自定义规则分析结果 */ interface ICustomRuleResult { /** * 规则名称 */ ruleName: string; /** * 规则描述 */ description: string; /** * 触发的问题 */ issues: Array<{ /** * 位置信息 */ location: ILocation; /** * 严重性 */ severity: 'info' | 'warning' | 'error'; /** * 消息 */ message: string; /** * 修复建议 */ suggestion?: string; }>; } /** * 分析结果的统计信息 */ interface IAnalysisStats { /** * 总文件数量 */ totalFiles: number; /** * 总代码行数 */ totalLines: number; /** * 分析开始时间 */ startTime: Date; /** * 分析结束时间 */ endTime: Date; /** * 分析耗时(毫秒) */ duration: number; } /** * 完整分析结果 */ interface IAnalysisResult { /** * 项目名称 */ projectName: string; /** * 分析统计信息 */ stats: IAnalysisStats; /** * 代码覆盖率结果 */ coverage?: ICoverageResult[]; /** * 重复代码结果 */ duplicates?: IDuplicateResult; /** * 未使用代码结果 */ unusedCode?: IUnusedCodeResult; /** * 依赖关系结果 */ dependencies?: IDependencyResult; /** * 内存泄漏结果 */ memoryLeaks?: IMemoryLeakResult; /** * 死循环检测结果 */ infiniteLoops?: IInfiniteLoopResult; /** * 自定义规则结果 */ customRules?: ICustomRuleResult[]; /** * 增量分析信息 */ incrementalInfo?: IIncrementalInfo; } /** * 报告生成器选项接口 */ interface IReportOptions { /** * 输出路径 */ outputPath?: string; /** * 报告标题 */ title?: string; /** * 是否包含详细信息 */ detailed?: boolean; /** * 是否包含图表 */ includeCharts?: boolean; /** * 项目名称 */ projectName?: string; /** * 生成时间 */ timestamp?: Date; /** * 自定义模板路径 */ templatePath?: string; } /** * 图表数据类型 */ interface IChartData { /** * 图表标题 */ title: string; /** * 图表类型 */ type: 'bar' | 'line' | 'pie' | 'doughnut' | 'radar'; /** * 图表标签 */ labels: string[]; /** * 图表数据集 */ datasets: Array<{ /** * 数据集标签 */ label?: string; /** * 数据集数据 */ data: number[]; /** * 背景颜色 */ backgroundColor?: string | string[]; /** * 边框颜色 */ borderColor?: string | string[]; }>; } /** * 报告生成器接口 */ interface IReportGenerator { /** * 生成报告 * @param results 分析结果 * @returns 报告文件路径 */ generate(results: IAnalysisResult): Promise<string | null>; /** * 准备图表数据 * @param results 分析结果 * @returns 图表数据 */ prepareChartData?(results: IAnalysisResult): IChartData[]; } /** * 基础报告生成器 */ declare abstract class BaseReportGenerator implements IReportGenerator { protected options: IReportOptions; constructor(options?: IReportOptions); /** * 生成报告 * @param results 分析结果 */ abstract generate(results: IAnalysisResult): Promise<string | null>; /** * 确保输出目录存在 */ protected ensureOutputDir(): Promise<void>; /** * 格式化日期时间 * @param date 日期对象 * @returns 格式化的日期时间字符串 */ protected formatDateTime(date: Date): string; /** * 格式化持续时间 * @param ms 毫秒数 * @returns 格式化的持续时间字符串 */ protected formatDuration(ms: number): string; /** * 生成报告文件名 * @param extension 文件扩展名 * @returns 报告文件名 */ protected getReportFileName(extension: string): string; /** * 生成报告完整路径 * @param fileName 文件名 * @returns 报告完整路径 */ protected getReportPath(fileName: string): string; /** * 分析代码覆盖率图表数据 * @param results 分析结果 * @returns 覆盖率图表数据 */ protected getCoverageChartData(results: IAnalysisResult): IChartData | null; /** * 分析重复代码图表数据 * @param results 分析结果 * @returns 重复代码图表数据 */ protected getDuplicatesChartData(results: IAnalysisResult): IChartData | null; /** * 分析未使用代码图表数据 * @param results 分析结果 * @returns 未使用代码图表数据 */ protected getUnusedCodeChartData(results: IAnalysisResult): IChartData | null; /** * 分析依赖图表数据 * @param results 分析结果 * @returns 依赖图表数据 */ protected getDependencyChartData(results: IAnalysisResult): IChartData | null; /** * 分析风险图表数据 * @param results 分析结果 * @returns 风险图表数据 */ protected getRiskChartData(results: IAnalysisResult): IChartData | null; /** * 分析增量变化图表数据 * @param results 分析结果 * @returns 增量变化图表数据 */ protected getIncrementalChartData(results: IAnalysisResult): IChartData | null; /** * 准备所有图表数据 * @param results 分析结果 * @returns 所有图表数据 */ prepareChartData(results: IAnalysisResult): IChartData[]; } /** * HTML报告生成器 */ declare class HTMLReportGenerator extends BaseReportGenerator { private defaultTemplatePath; constructor(options?: IReportOptions); /** * 生成HTML报告 * @param results 分析结果 * @returns 报告文件路径 */ generate(results: IAnalysisResult): Promise<string | null>; } /** * JSON报告生成器 */ declare class JSONReportGenerator extends BaseReportGenerator { constructor(options?: IReportOptions); /** * 生成JSON报告 * @param results 分析结果 * @returns 报告文件路径 */ generate(results: IAnalysisResult): Promise<string | null>; } /** * 控制台报告生成器 */ declare class ConsoleReportGenerator extends BaseReportGenerator { constructor(options?: IReportOptions); /** * 生成控制台报告 * @param results 分析结果 * @returns null (控制台输出不生成文件) */ generate(results: IAnalysisResult): Promise<string | null>; /** * 打印报告头部 * @param results 分析结果 */ private printHeader; /** * 打印总体摘要 * @param results 分析结果 */ private printSummary; /** * 打印覆盖率摘要 * @param results 分析结果 */ private printCoverageSummary; /** * 打印重复代码摘要 * @param duplicates 重复代码结果 */ private printDuplicatesSummary; /** * 打印未使用代码摘要 * @param unusedCode 未使用代码结果 */ private printUnusedCodeSummary; /** * 打印依赖关系摘要 * @param dependencies 依赖关系结果 */ private printDependenciesSummary; /** * 打印风险摘要(内存泄漏或死循环) * @param title 标题 * @param items 风险项列表 */ private printRiskSummary; /** * 打印增量分析信息 * @param incrementalInfo 增量分析信息 */ private printIncrementalInfo; /** * 打印报告底部 */ private printFooter; } type ReportFormat = 'html' | 'json' | 'console'; /** * 报告生成器工厂 * 根据指定格式创建相应的报告生成器 */ declare class ReportGeneratorFactory { /** * 创建报告生成器实例 * @param format 报告格式 * @param options 报告选项 * @returns 报告生成器实例 */ static create(format: ReportFormat, options?: IReportOptions): HTMLReportGenerator | JSONReportGenerator | ConsoleReportGenerator; /** * 生成多种格式的报告 * @param results 分析结果 * @param formats 需要生成的报告格式 * @param options 报告选项 * @returns 生成的报告文件路径 */ static generateReports(results: IAnalysisResult, formats?: ReportFormat[], options?: IReportOptions): Promise<string[]>; } /** * 图表可视化器类 * 用于生成Chart.js配置和选项 */ declare class ChartVisualizer { /** * 生成Chart.js配置 * @param chartData 图表数据 * @returns Chart.js配置对象 */ static generateChartConfig(chartData: IChartData): any; /** * 生成HTML内容初始化图表 * @param chartData 图表数据列表 * @returns 包含初始化脚本的HTML字符串 */ static generateChartInitScript(chartData: IChartData[]): string; /** * 生成图表HTML容器 * @param index 图表索引 * @param chartData 图表数据 * @returns 图表容器HTML */ static generateChartContainer(index: number, chartData: IChartData): string; /** * 将所有图表包装在一个容器中 * @param chartData 图表数据列表 * @returns 包含所有图表的HTML */ static wrapChartsInContainer(chartData: IChartData[]): string; /** * 将图表排列成行 * @param chartData 图表数据列表 * @param chartsPerRow 每行图表数量 * @returns 排列后的HTML */ private static arrangeChartsInRows; } /** * 增量分析器配置接口 */ interface IIncrementalAnalyzerOptions { /** * 项目根目录 */ projectRoot: string; /** * 基准提交SHA或分支名(默认为最近一次提交) */ baseCommit?: string; /** * 当前提交SHA或分支名(默认为工作区) */ currentCommit?: string; /** * 缓存目录(存储历史分析结果) */ cacheDir?: string; /** * 要分析的文件扩展名 */ fileExtensions?: string[]; } /** * 增量分析器 * 提供Git版本间差异分析和结果对比功能 */ declare class IncrementalAnalyzer { private options; private cacheDir; constructor(options: IIncrementalAnalyzerOptions); /** * 获取增量分析信息 * @returns 增量分析信息 */ getIncrementalInfo(): Promise<IIncrementalInfo>; /** * 保存分析结果到缓存 * @param commit 提交SHA * @param results 分析结果 */ saveResultsToCache(commit: string, results: any): Promise<void>; /** * 从缓存加载分析结果 * @param commit 提交SHA * @returns 分析结果,如果不存在则返回null */ loadResultsFromCache(commit: string): Promise<any | null>; /** * 比较两次分析结果,计算变化趋势 * @param baseResults 基准分析结果 * @param currentResults 当前分析结果 * @returns 包含趋势信息的增量分析结果 */ calculateTrends(baseResults: any, currentResults: any): IIncrementalInfo; /** * 生成文件内容的哈希 * @param filePath 文件路径 * @returns 文件哈希值 */ generateFileHash(filePath: string): Promise<string>; /** * 确定是否需要重新分析文件 * @param filePath 文件路径 * @returns 是否需要重新分析 */ shouldReanalyzeFile(filePath: string): Promise<boolean>; /** * 检查是否在Git仓库中 * @returns 是否在Git仓库中 */ private isGitRepository; /** * 获取最近一次提交的哈希值 * @returns 提交哈希值 */ private getLastCommitHash; /** * 获取当前提交的哈希值 * @returns 提交哈希值 */ private getCurrentCommitHash; /** * 获取两次提交之间变更的文件列表 * @param baseCommit 基准提交 * @param currentCommit 当前提交 * @returns 变更文件列表 */ private getChangedFiles; /** * 计算平均代码覆盖率 * @param coverageResults 覆盖率结果 * @returns 平均覆盖率(0-1之间) */ private calculateAverageCoverage; /** * 计算未使用代码项目总数 * @param unusedResults 未使用代码结果 * @returns 未使用项目总数 */ private countUnusedItems; } /** * 自定义规则配置接口 */ interface IRule { /** * 规则名称 */ name: string; /** * 规则描述 */ description: string; /** * 规则启用状态 */ enabled: boolean; /** * 规则配置 */ config: Record<string, any>; /** * 规则执行函数 */ execute: (context: IRuleContext) => Promise<IRuleIssue[]>; } /** * 规则执行环境接口 */ interface IRuleContext { /** * 项目根路径 */ projectRoot: string; /** * 当前文件路径 */ filePath?: string; /** * 当前文件内容 */ fileContent?: string; /** * AST服务 */ astService?: any; /** * 文件系统服务 */ fsService?: any; } /** * 规则检测到的问题 */ interface IRuleIssue { /** * 文件路径 */ filePath: string; /** * 开始行号 */ startLine?: number; /** * 结束行号 */ endLine?: number; /** * 开始列号 */ startColumn?: number; /** * 结束列号 */ endColumn?: number; /** * 严重性 */ severity: 'info' | 'warning' | 'error'; /** * 消息 */ message: string; /** * 修复建议 */ suggestion?: string; } /** * 规则引擎配置接口 */ interface IRuleEngineOptions { /** * 项目根路径 */ projectRoot: string; /** * 规则目录路径 */ rulesDir?: string; /** * 规则配置文件路径 */ configPath?: string; /** * AST服务 */ astService?: any; /** * 文件系统服务 */ fsService?: any; } /** * 自定义规则引擎 */ declare class RuleEngine { private rules; private options; constructor(options: IRuleEngineOptions); /** * 初始化规则引擎 */ initialize(): Promise<void>; /** * 加载内置规则 */ private loadBuiltinRules; /** * 加载自定义规则 */ private loadCustomRules; /** * 应用配置文件中的规则设置 */ private applyConfiguration; /** * 执行所有已启用的规则 * @param files 要分析的文件路径列表 * @returns 自定义规则分析结果 */ executeRules(files: string[]): Promise<ICustomRuleResult[]>; /** * 添加自定义规则 * @param rule 自定义规则 */ addRule(rule: IRule): void; /** * 获取规则 * @param name 规则名称 * @returns 规则对象 */ getRule(name: string): IRule | undefined; /** * 获取所有规则 * @returns 所有规则对象的数组 */ getAllRules(): IRule[]; } /** * Code Insight Analyst - 代码分析工具 * 主模块导出 */ declare const version = "0.1.0"; declare function main(): Promise<void>; export { AnalysisEngine, type AnalysisOptions, BaseReportGenerator, ChartVisualizer, type IIncrementalAnalyzerOptions, type IRule, type IRuleContext, type IRuleEngineOptions, type IRuleIssue, IncrementalAnalyzer, ParallelProcessor, type ReportFormat, ReportGeneratorFactory, RuleEngine, type Task, type TaskResult, main as default, version };