diff --git a/CUSTOM-TYPES.md b/CUSTOM-TYPES.md index 7595440..5dafa06 100644 --- a/CUSTOM-TYPES.md +++ b/CUSTOM-TYPES.md @@ -38,13 +38,15 @@ const customEmail = await sendEmail(payload, { }) ``` -## ID Type Compatibility +## Compatibility -The plugin works with both: +The plugin works with: - **String IDs**: `id: string` - **Number IDs**: `id: number` +- **Nullable fields**: Fields can be `null`, `undefined`, or have values +- **Generated types**: Works with `payload generate:types` output -Your Payload configuration determines which type is used. The plugin automatically adapts to your setup. +Your Payload configuration determines which types are used. The plugin automatically adapts to your setup. ## Type Definitions @@ -55,33 +57,33 @@ interface BaseEmailDocument { id: string | number template?: any to: string[] - cc?: string[] - bcc?: string[] - from?: string - replyTo?: string + cc?: string[] | null + bcc?: string[] | null + from?: string | null + replyTo?: string | null subject: string html: string - text?: string - variables?: Record - scheduledAt?: string - sentAt?: string - status?: 'pending' | 'processing' | 'sent' | 'failed' - attempts?: number - lastAttemptAt?: string - error?: string - priority?: number - createdAt?: string - updatedAt?: string + text?: string | null + variables?: Record | null + scheduledAt?: string | null + sentAt?: string | null + status?: 'pending' | 'processing' | 'sent' | 'failed' | null + attempts?: number | null + lastAttemptAt?: string | null + error?: string | null + priority?: number | null + createdAt?: string | null + updatedAt?: string | null } interface BaseEmailTemplateDocument { id: string | number name: string slug: string - subject?: string + subject?: string | null content?: any - createdAt?: string - updatedAt?: string + createdAt?: string | null + updatedAt?: string | null } ``` diff --git a/package.json b/package.json index af14f2c..5c68b02 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@xtr-dev/payload-mailing", - "version": "0.1.13", + "version": "0.1.14", "description": "Template-based email system with scheduling and job processing for PayloadCMS", "type": "module", "main": "dist/index.js", diff --git a/src/sendEmail.ts b/src/sendEmail.ts index 63452b4..6ca74f5 100644 --- a/src/sendEmail.ts +++ b/src/sendEmail.ts @@ -83,12 +83,22 @@ export const sendEmail = async 0 ? validated[0] : undefined + } + if (emailData.from && emailData.from !== null) { + const validated = parseAndValidateEmails(emailData.from as string | string[]) + // from should be a single email, so take the first one if array + emailData.from = validated && validated.length > 0 ? validated[0] : undefined + } // Create the email in the collection with proper typing const email = await payload.create({ diff --git a/src/types/index.ts b/src/types/index.ts index ce8736e..1e42760 100644 --- a/src/types/index.ts +++ b/src/types/index.ts @@ -2,38 +2,38 @@ import { Payload } from 'payload' import type { CollectionConfig, RichTextField } from 'payload' import { Transporter } from 'nodemailer' -// Generic base interfaces that work with any ID type +// Generic base interfaces that work with any ID type and null values export interface BaseEmailDocument { id: string | number template?: any to: string[] - cc?: string[] - bcc?: string[] - from?: string - replyTo?: string + cc?: string[] | null + bcc?: string[] | null + from?: string | null + replyTo?: string | null subject: string html: string - text?: string - variables?: Record - scheduledAt?: string - sentAt?: string - status?: 'pending' | 'processing' | 'sent' | 'failed' - attempts?: number - lastAttemptAt?: string - error?: string - priority?: number - createdAt?: string - updatedAt?: string + text?: string | null + variables?: Record | null + scheduledAt?: string | null + sentAt?: string | null + status?: 'pending' | 'processing' | 'sent' | 'failed' | null + attempts?: number | null + lastAttemptAt?: string | null + error?: string | null + priority?: number | null + createdAt?: string | null + updatedAt?: string | null } export interface BaseEmailTemplateDocument { id: string | number name: string slug: string - subject?: string + subject?: string | null content?: any - createdAt?: string - updatedAt?: string + createdAt?: string | null + updatedAt?: string | null } export type BaseEmail = Omit & {template: Omit | TEmailTemplate['id'] | undefined | null} @@ -75,23 +75,23 @@ export interface MailingTransportConfig { export interface QueuedEmail { id: string - template?: string + template?: string | null to: string[] - cc?: string[] - bcc?: string[] - from?: string - replyTo?: string + cc?: string[] | null + bcc?: string[] | null + from?: string | null + replyTo?: string | null subject: string html: string - text?: string - variables?: Record - scheduledAt?: string - sentAt?: string + text?: string | null + variables?: Record | null + scheduledAt?: string | null + sentAt?: string | null status: 'pending' | 'processing' | 'sent' | 'failed' attempts: number - lastAttemptAt?: string - error?: string - priority?: number + lastAttemptAt?: string | null + error?: string | null + priority?: number | null createdAt: string updatedAt: string }