All files provider.ts

66.66% Statements 10/15
37.5% Branches 3/8
75% Functions 3/4
71.42% Lines 10/14

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75                              1x         1x     1x 1x           1x               1x                         1x 1x   1x                 1x                      
import {
  ToolProvider,
  ToolName,
  SpokeOutput,
  ScanOptions,
  ToolScoringOutput,
  AnalysisResult,
  SpokeOutputSchema,
} from '@aiready/core';
import { analyzeDeps } from './analyzer';
import { DepsOptions, DepsIssue } from './types';
 
/**
 * Dependency Health Tool Provider
 */
export const DepsProvider: ToolProvider = {
  id: ToolName.DependencyHealth,
  alias: ['deps', 'deps-health', 'packages'],
 
  async analyze(options: ScanOptions): Promise<SpokeOutput> {
    const report = await analyzeDeps(options as DepsOptions);
 
    // Group issues by file for AnalysisResult format
    const fileIssuesMap = new Map<string, DepsIssue[]>();
    for (const issue of report.issues) {
      const file = issue.location.file;
      if (!fileIssuesMap.has(file)) fileIssuesMap.set(file, []);
      fileIssuesMap.get(file)!.push(issue);
    }
 
    const results: AnalysisResult[] = Array.from(fileIssuesMap.entries()).map(
      ([fileName, issues]) => ({
        fileName,
        issues: issues as any[],
        metrics: {},
      })
    );
 
    return SpokeOutputSchema.parse({
      results,
      summary: report.summary,
      metadata: {
        toolName: ToolName.DependencyHealth,
        version: '0.9.5',
        timestamp: new Date().toISOString(),
        rawData: report.rawData,
      },
    });
  },
 
  score(output: SpokeOutput, options: ScanOptions): ToolScoringOutput {
    const summary = output.summary as any;
    const rawData = (output.metadata as any)?.rawData || {};
 
    return {
      toolName: ToolName.DependencyHealth,
      score: summary.score || 0,
      rawMetrics: {
        ...summary,
        ...rawData,
      },
      factors: [],
      recommendations: (summary.recommendations || []).map(
        (action: string) => ({
          action,
          estimatedImpact: 5,
          priority: 'medium',
        })
      ),
    };
  },
 
  defaultWeight: 6,
};