From 87a208503d5c84faa2ebfef8f0c2ea06469d8a8c Mon Sep 17 00:00:00 2001 From: Masonlet Date: Mon, 23 Mar 2026 13:06:32 -0400 Subject: [PATCH] fix: parse TO_EMAIL as comma-separated list --- api/contact/config.ts | 7 ++++--- api/contact/email.ts | 6 +++--- tests/contact/email.test.ts | 11 +++++------ 3 files changed, 12 insertions(+), 12 deletions(-) diff --git a/api/contact/config.ts b/api/contact/config.ts index 10f03da..9f61844 100644 --- a/api/contact/config.ts +++ b/api/contact/config.ts @@ -3,13 +3,14 @@ import { Resend } from "resend"; export interface Config { resend: Resend | null; fromEmail: string | undefined; - toEmail: string | string[] | undefined; + toEmails: string[]; allowedOrigins: string[]; } const apiKey = process.env["RESEND_API_KEY"]; const fromEmail = process.env["FROM_EMAIL"]; -const toEmail = process.env["TO_EMAIL"]; +const toEmailsRaw = process.env["TO_EMAIL"] ?? ""; +const toEmails = toEmailsRaw.split(",").map(o => o.trim()).filter(Boolean); const allowedOriginsRaw = process.env["ALLOWED_ORIGINS"] ?? ""; const allowedOrigins = allowedOriginsRaw.split(",").map(o => o.trim()).filter(Boolean); @@ -19,7 +20,7 @@ if (apiKey) resend = new Resend(apiKey); export const config: Config = { resend, fromEmail, - toEmail, + toEmails, allowedOrigins } diff --git a/api/contact/email.ts b/api/contact/email.ts index cf3973c..7a0a24d 100644 --- a/api/contact/email.ts +++ b/api/contact/email.ts @@ -5,16 +5,16 @@ import type { Config } from "./config.js"; export interface EmailConfig { client: Resend; from: string; - to: string | string[]; + to: string[]; } export function getEmailConfig(config: Config): EmailConfig | null { if ( !config.resend || !config.fromEmail?.trim() || - !config.toEmail?.length + !config.toEmails?.length ) return null; - return { client: config.resend, from: config.fromEmail, to: config.toEmail }; + return { client: config.resend, from: config.fromEmail, to: config.toEmails }; } export async function sendEmail(config: EmailConfig, body: ContactBody): Promise { diff --git a/tests/contact/email.test.ts b/tests/contact/email.test.ts index 76555bc..677554c 100644 --- a/tests/contact/email.test.ts +++ b/tests/contact/email.test.ts @@ -20,18 +20,17 @@ describe("email.ts", () => { describe("getEmailConfig", () => { it("returns null if config missing or empty props", () => { - expect(getEmailConfig({ resend: null as any, fromEmail: "a@b.com", toEmail: "c@d.com" })).toBeNull(); - expect(getEmailConfig({ resend: {} as any, fromEmail: "", toEmail: "c@d.com" })).toBeNull(); - expect(getEmailConfig({ resend: {} as any, fromEmail: "a@b.com", toEmail: "" })).toBeNull(); - expect(getEmailConfig({ resend: {} as any, fromEmail: "a@b.com", toEmail: [] })).toBeNull(); + expect(getEmailConfig({ resend: null as any, fromEmail: "a@b.com", toEmails: ["c@d.com"] })).toBeNull(); + expect(getEmailConfig({ resend: {} as any, fromEmail: "", toEmails: ["c@d.com"] })).toBeNull(); + expect(getEmailConfig({ resend: {} as any, fromEmail: "a@b.com", toEmails: [] })).toBeNull(); }); it("returns EmailConfig when valid", () => { - const result = getEmailConfig({ resend: mockResend, fromEmail: "from@test.com", toEmail: "to@test.com" }); + const result = getEmailConfig({ resend: mockResend, fromEmail: "from@test.com", toEmails: ["to@test.com"] }); expect(result).toMatchObject({ client: mockResend, from: 'from@test.com', - to: 'to@test.com' + to: ['to@test.com'] }); }); });