const addressArrayKeys = [ "from", "to", "cc", "bcc", "reply_to", "bounce_to", "disposition_notification_to" ]; export function campaignJsonForAttachmentPreview(draft: Record): Record { const next = cloneJson(draft); const entries = asRecord(next.entries); if (Array.isArray(entries.inline)) { entries.inline = entries.inline.map((entry) => normalizePreviewEntry(entry)); } if (isRecord(entries.defaults)) { entries.defaults = normalizePreviewEntry(entries.defaults); } next.entries = entries; if (isRecord(next.recipients)) { next.recipients = normalizeAddressContainer(next.recipients); } return next; } function normalizePreviewEntry(value: unknown): Record { const entry = { ...asRecord(value) }; if (typeof entry.email === "string" && !entry.email.trim()) delete entry.email; if (typeof entry.name === "string" && !entry.name.trim()) delete entry.name; for (const key of addressArrayKeys) { const current = entry[key]; if (Array.isArray(current)) { const filtered = current.map(normalizeRecipient).filter((item): item is Record => Boolean(item)); entry[key] = filtered; continue; } if (isRecord(current)) { const normalized = normalizeRecipient(current); if (normalized) entry[key] = normalized; else delete entry[key]; } } return entry; } function normalizeAddressContainer(value: Record): Record { const container = { ...value }; for (const key of addressArrayKeys) { const current = container[key]; if (Array.isArray(current)) { container[key] = current.map(normalizeRecipient).filter((item): item is Record => Boolean(item)); continue; } if (isRecord(current)) { const normalized = normalizeRecipient(current); if (normalized) container[key] = normalized; else delete container[key]; } } return container; } function normalizeRecipient(value: unknown): Record | null { const recipient = { ...asRecord(value) }; const email = typeof recipient.email === "string" ? recipient.email.trim() : ""; if (!email) return null; recipient.email = email; if (typeof recipient.name === "string" && !recipient.name.trim()) delete recipient.name; return recipient; } function cloneJson(value: T): T { return JSON.parse(JSON.stringify(value ?? {})) as T; } function asRecord(value: unknown): Record { return value && typeof value === "object" && !Array.isArray(value) ? value as Record : {}; } function isRecord(value: unknown): value is Record { return value !== null && typeof value === "object" && !Array.isArray(value); }