import { LEAK_IDENTIFIER, LEAK_INLINE, LEAK_PATH } from "#configuration/strings/coverage.strings"; import type { LeakReason, LeakSet, PagePayload } from "#types/leak.types"; import type { Finding } from "#types/derivation.types"; import { leaksIn } from "#core/matchers/leak.matcher"; const REASON_LEADS: Readonly> = { identifier: LEAK_IDENTIFIER, "inline-code": LEAK_INLINE, path: LEAK_PATH, }; export const validatePayload = function validatePayload( payload: PagePayload, leaks: LeakSet, roots: ReadonlySet, ): Finding[] { const tokens = new Set(leaks.tokens); const findings: Finding[] = []; const seen = new Set(); for (const text of payload.strings) { for (const match of leaksIn(text, tokens, roots)) { const key = match.reason + match.token; if (!seen.has(key)) { seen.add(key); findings.push({ file: payload.file, message: `${REASON_LEADS[match.reason]}${match.token}` }); } } } return findings; };