Ts - Screener Better

import ScreenerReport from '../types.js'; export function jsonReporter(report: ScreenerReport): string return JSON.stringify(report, null, 2);

const report = await screener.run();

"name": "ts-screener", "version": "1.0.0", "type": "module", "bin": "ts-screener": "./dist/cli.js" , "scripts": "build": "tsc", "start": "node dist/cli.js" , "dependencies": "commander": "^11.0.0", "glob": "^10.3.0", "typescript": "^5.0.0" , "devDependencies": "@types/node": "^20.0.0" ts screener

program .name('ts-screener') .description('Analyze TypeScript type coverage and any usage') .option('-i, --include <patterns>', 'glob patterns to include', ' /*.ts,tsx') .option('-e, --exclude <patterns>', 'glob patterns to exclude', 'node_modules/ ') .option('--target-coverage <number>', 'minimum type coverage %', '80') .option('--json', 'output as JSON') .option('--no-implicit-any', 'fail on implicit any') .action(async (options) => const screener = new TypeScriptScreener( include: options.include.split(','), exclude: options.exclude.split(','), targetTypeCoverage: parseFloat(options.targetCoverage), noImplicitAny: options.noImplicitAny, );

if (!report.summary.passed && report.details.length) console.log('\nšŸ” Problematic files:'); for (const file of report.details) import ScreenerReport from '

export type ScreenerReport = summary: filesScanned: number; totalAnyUsage: number; totalMissingTypes: number; typeCoveragePercent: number; passed: boolean; ; details: FileReport[]; ; import ts from 'typescript'; import glob from 'glob'; import readFileSync from 'fs'; import FileReport, ScreenerOptions, ScreenerReport from './types.js'; export class TypeScriptScreener { constructor(private options: ScreenerOptions) {}

program.parse(); import ScreenerReport from '../types.js'; export function consoleReporter(report: ScreenerReport): void console.log('\nšŸ“Š TypeScript Screener Report\n'); console.log( āœ… Files scanned: $report.summary.filesScanned ); console.log( šŸŽÆ Type coverage: $report.summary.typeCoveragePercent% ); console.log( āš ļø Total 'any' usage: $report.summary.totalAnyUsage ); console.log( ā“ Missing type annotations: $report.summary.totalMissingTypes ); console.log( šŸ Status: $report.summary.passed ? 'PASSED āœ…' : 'FAILED āŒ' ); import ScreenerReport from '../types.js'

private resolveFiles(): string[] const includes = this.options.include.flatMap(pattern => glob.sync(pattern)); const excludes = new Set(this.options.exclude.flatMap(pattern => glob.sync(pattern))); return includes.filter(f => !excludes.has(f));