Skip to content

Commit 6ec0b0b

Browse files
irangareddycameroncooke
authored andcommitted
Validate individual coverage target objects before processing
Add isValidCoverageTarget type guard to filter out malformed objects from xccov JSON output, preventing runtime crashes on missing properties.
1 parent 34c5d5a commit 6ec0b0b

1 file changed

Lines changed: 16 additions & 3 deletions

File tree

src/mcp/tools/coverage/get_coverage_report.ts

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
4354
export 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

Comments
 (0)