@@ -40,6 +40,17 @@ interface CoverageTarget {
4040 files?: CoverageFile[];
4141}
4242
43+ function isValidCoverageTarget(value: unknown): value is CoverageTarget {
44+ return (
45+ typeof value === 'object' &&
46+ value !== null &&
47+ typeof (value as CoverageTarget).name === 'string' &&
48+ typeof (value as CoverageTarget).coveredLines === 'number' &&
49+ typeof (value as CoverageTarget).executableLines === 'number' &&
50+ typeof (value as CoverageTarget).lineCoverage === 'number'
51+ );
52+ }
53+
4354export async function get_coverage_reportLogic(
4455 params: GetCoverageReportParams,
4556 executor: CommandExecutor,
@@ -84,16 +95,16 @@ export async function get_coverage_reportLogic(
8495 }
8596
8697 // Validate structure: expect an array of target objects or { targets: [...] }
87- let targets: CoverageTarget [] = [];
98+ let rawTargets: unknown [] = [];
8899 if (Array.isArray(data)) {
89- targets = data as CoverageTarget[] ;
100+ rawTargets = data;
90101 } else if (
91102 typeof data === 'object' &&
92103 data !== null &&
93104 'targets' in data &&
94105 Array.isArray((data as { targets: unknown }).targets)
95106 ) {
96- targets = (data as { targets: CoverageTarget [] }).targets;
107+ rawTargets = (data as { targets: unknown [] }).targets;
97108 } else {
98109 return {
99110 content: [
@@ -106,6 +117,8 @@ export async function get_coverage_reportLogic(
106117 };
107118 }
108119
120+ let targets = rawTargets.filter(isValidCoverageTarget);
121+
109122 // Filter by target name if specified
110123 if (target) {
111124 const lowerTarget = target.toLowerCase();
0 commit comments