import type { CodeFinding, CveFinding, ParsedFindings, RawScanReport } from '../index.js'; import { extractSnippet } from './snipper.js'; const CVE_ID_REGEX = /CVE-\d{4}-\d+/g; const GHSA_ID_REGEX = /GHSA-[\w-]+/g; /** * Parses supreme-max raw report findings into normalized code and CVE groups. */ export function parseFindings(report: RawScanReport): ParsedFindings { const codeFindings: CodeFinding[] = []; const cveFindings: CveFinding[] = []; for (const finding of report.findings) { if (finding.line === null) { const cveIds = extractUniqueMatches(finding.issue, CVE_ID_REGEX); const ghsaIds = extractUniqueMatches(finding.issue, GHSA_ID_REGEX); cveFindings.push({ ...finding, type: 'cve_finding', cve_ids: cveIds, ghsa_ids: ghsaIds, advisory_links: [ ...cveIds.map((id) => `https://nvd.nist.gov/vuln/detail/${id}`), ...ghsaIds.map((id) => `https://github.com/advisories/${id}`), ], }); continue; } codeFindings.push({ ...finding, type: 'code_finding', snippet: extractSnippet(finding.file, finding.line), vscode_link: `vscode://file/${finding.file}:${finding.line}`, }); } return { code_findings: codeFindings, cve_findings: cveFindings, }; } function extractUniqueMatches(input: string, regex: RegExp): string[] { const matches = input.match(regex); if (matches === null) { return []; } return [...new Set(matches)]; }