/** * Knip lens for finding unused files, exports, and dependencies */ import { BaseLens } from '../base/BaseLens.js'; import { LensResult, ExecuteResult, LensOptions, Executor } from '../../types/index.js'; /** * Options for KnipLens with optional source file injection */ export interface KnipLensOptions extends LensOptions { /** * Pre-discovered source files to use for file metrics. * When provided, skips filesystem discovery (making the lens browser-compatible). * Should be relative paths from the project root. */ sourceFiles?: string[]; } /** Source file extensions that Knip analyzes (exported for consumers) */ export declare const SOURCE_EXTENSIONS: Set; /** * Knip JSON output format (v4 and earlier) */ interface KnipJsonOutput { files: Record; dependencies: Array<[string, string]>; devDependencies: Array<[string, string]>; optionalPeerDependencies: Array<[string, string]>; unlisted: Record; binaries: Record; unresolved: Record; exports: Record; nsExports: Record; classMembers: Record; types: Record; nsTypes: Record; enumMembers: Record; duplicates: Record>; } /** * Lens for Knip - finds unused files, exports, and dependencies */ export declare class KnipLens extends BaseLens { readonly name = "knip"; readonly description = "Find unused files, exports, and dependencies"; readonly languages: string[]; readonly supportedTools: string[]; readonly requirements: import("../..").LensRequirements; private pathMapper?; private injectedSourceFiles?; constructor(executor?: Executor, options?: KnipLensOptions); /** * Calculate quality score (0-100) from Knip results * * Scoring algorithm: * - Start at 100 * - Subtract penalties based on issue type and count * - Unlisted dependencies (errors): 15 points each * - Unresolved imports (errors): 10 points each * - Unused files: 5 points each * - Unused dependencies: 2 points each * - Unused exports/types: 1 point each * - Floor at 0 * * Rationale: Unlisted/unresolved are critical (prevent runtime errors), * unused files add clutter, unused deps slow installs, unused exports are minor */ static calculateQualityScore(result: LensResult): number; /** * Parse Knip JSON output */ parse(output: ExecuteResult): KnipJsonOutput; /** * Format Knip results to standard format */ format(parsed: KnipJsonOutput): LensResult; /** * Parse export info which may contain position information */ private parseExportInfo; /** * Get empty output structure */ private getEmptyOutput; /** * Detect if the output is in Knip v5+ format */ private isV5Format; /** * Convert Knip v5+ format to v4 format */ private convertV5ToV4; /** * Normalize output to ensure all expected fields exist */ private normalizeOutput; /** * Get or create path mapper */ private getPathMapper; /** * Get all source files for file metrics. * Returns injected source files if provided, otherwise returns empty array. * * To provide source files, pass them via the `sourceFiles` option when * constructing the lens. This makes the lens browser-compatible by avoiding * direct filesystem access. * * @example * ```typescript * // With @principal-ai/codebase-composition * const tree = await filesystemService.buildFileSystemTreeFromPath(projectPath); * const sourceFiles = tree.allFiles * .filter(f => SOURCE_EXTENSIONS.has(f.extension)) * .map(f => f.relativePath); * * const lens = new KnipLens(executor, { sourceFiles }); * ``` */ private findAllSourceFiles; /** * Override execute to ensure JSON format */ execute(): Promise; } export {}; //# sourceMappingURL=KnipLens.d.ts.map