import { DEFAULT_MASK_FIELD_KEYWORDS, NEVER_EXPORT_FIELD_EXACT_NAMES, type ExportMaskPolicy, } from "../constants/export"; function hitKeyword(field: string, keywords: readonly string[]): boolean { const name = field.toLowerCase(); return keywords.some((k) => name.includes(k.toLowerCase())); } function normalizeFieldName(field: string): string { return field.toLowerCase().replace(/[_-]/g, ""); } function shouldNeverExportField(field: string): boolean { const normalizedField = normalizeFieldName(field); return NEVER_EXPORT_FIELD_EXACT_NAMES.includes( normalizedField as (typeof NEVER_EXPORT_FIELD_EXACT_NAMES)[number], ); } function shouldMaskField(field: string): boolean { return hitKeyword(field, DEFAULT_MASK_FIELD_KEYWORDS); } function maskValue(value: unknown): unknown { if (value === null || value === undefined) { return value; } if (typeof value === "string") { return "***"; } if (typeof value === "number") { return 0; } if (typeof value === "boolean") { return false; } return "[masked]"; } export function sanitizeUserForExport( row: Record, maskPolicy: ExportMaskPolicy, ): Record { const out: Record = {}; for (const [field, value] of Object.entries(row)) { if (shouldNeverExportField(field)) { continue; } if (maskPolicy === "masked" && shouldMaskField(field)) { out[field] = maskValue(value); continue; } out[field] = value; } return out; } // Backward-compatible alias used by current tests/callers. export const applyExportMask = sanitizeUserForExport;