@igniter-js/mail 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/errors/igniter-mail.error.ts","../src/adapters/postmark.adapter.ts","../src/adapters/resend.adapter.ts","../src/adapters/sendgrid.adapter.ts","../src/adapters/smtp.adapter.ts","../src/adapters/test.adapter.ts","../src/adapters/webhook.adapter.ts","../src/builders/igniter-mail.builder.ts","../src/builders/mail-template.builder.ts","../src/utils/validate-standard-schema-input.ts","../src/core/igniter-mail.tsx","../src/types/provider.ts","../src/utils/get-adapter.ts"],"names":["render"],"mappings":"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","file":"index.mjs","sourcesContent":["import { IgniterError, type IgniterLogger } from '@igniter-js/core'\n\n/**\n * Known error codes thrown by `@igniter-js/mail` runtime.\n */\nexport type IgniterMailErrorCode =\n | 'MAIL_PROVIDER_FROM_REQUIRED'\n | 'MAIL_PROVIDER_ADAPTER_REQUIRED'\n | 'MAIL_PROVIDER_ADAPTER_SECRET_REQUIRED'\n | 'MAIL_PROVIDER_ADAPTER_NOT_FOUND'\n | 'MAIL_PROVIDER_TEMPLATES_REQUIRED'\n | 'MAIL_PROVIDER_TEMPLATE_NOT_FOUND'\n | 'MAIL_PROVIDER_TEMPLATE_DATA_INVALID'\n | 'MAIL_PROVIDER_SCHEDULE_DATE_INVALID'\n | 'MAIL_PROVIDER_SEND_FAILED'\n | 'MAIL_PROVIDER_SCHEDULE_FAILED'\n | 'MAIL_ADAPTER_CONFIGURATION_INVALID'\n | 'MAIL_TEMPLATE_CONFIGURATION_INVALID'\n\n/**\n * Payload used to create an {@link IgniterMailError}.\n */\nexport type IgniterMailErrorPayload = {\n /** Machine-readable error code. */\n code: IgniterMailErrorCode\n /** Human-readable message. */\n message: string\n /** Optional HTTP status code when surfacing errors through HTTP boundaries. */\n statusCode?: number\n /** Optional original cause. */\n cause?: unknown\n /** Extra diagnostic details (e.g. schema issues). */\n details?: unknown\n /** Arbitrary metadata for debugging. */\n metadata?: Record<string, unknown>\n /** Optional logger used by IgniterError. */\n logger?: IgniterLogger\n}\n\n/**\n * Typed error used by the `IgniterMail` runtime.\n *\n * This is designed to be stable for extraction into `@igniter-js/mail`.\n */\nexport class IgniterMailError extends IgniterError {\n declare readonly code: IgniterMailErrorCode\n\n constructor(payload: IgniterMailErrorPayload) {\n super({\n code: payload.code,\n message: payload.message,\n statusCode: payload.statusCode,\n causer: '@igniter-js/mail',\n details: payload.details,\n metadata: payload.metadata,\n logger: payload.logger,\n })\n\n this.name = 'IgniterMailError'\n }\n\n /**\n * Type guard utility.\n */\n static is(error: unknown): error is IgniterMailError {\n return error instanceof IgniterMailError\n }\n}\n\n","import { IgniterMailError } from '../errors/igniter-mail.error'\nimport type { MailAdapter } from '../types/adapter'\nimport type { LegacyIgniterMailOptions } from '../types/provider'\n\n/**\n * Postmark adapter builder.\n *\n * Notes:\n * - This implementation uses `fetch` (no SDK dependency).\n * - Designed to be extracted to `@igniter-js/mail/adapters/postmark`.\n */\nexport class PostmarkMailAdapterBuilder {\n private secret?: string\n private from?: string\n\n /** Creates a new builder instance. */\n static create() {\n return new PostmarkMailAdapterBuilder()\n }\n\n /** Sets the Postmark Server Token. */\n withSecret(secret: string) {\n this.secret = secret\n return this\n }\n\n /** Sets the default FROM address used when sending emails via Postmark. */\n withFrom(from: string) {\n this.from = from\n return this\n }\n\n /** Builds the adapter instance. */\n build(): MailAdapter {\n if (!this.secret) {\n throw new IgniterMailError({\n code: 'MAIL_ADAPTER_CONFIGURATION_INVALID',\n message: 'Postmark adapter secret is required',\n })\n }\n\n if (!this.from) {\n throw new IgniterMailError({\n code: 'MAIL_ADAPTER_CONFIGURATION_INVALID',\n message: 'Postmark adapter from is required',\n })\n }\n\n const token = this.secret\n const from = this.from\n\n return {\n /** Sends an email using Postmark (HTTP API). */\n send: async ({ to, subject, html, text }) => {\n const response = await fetch('https://api.postmarkapp.com/email', {\n method: 'POST',\n headers: {\n Accept: 'application/json',\n 'Content-Type': 'application/json',\n 'X-Postmark-Server-Token': token,\n },\n body: JSON.stringify({\n From: from,\n To: to,\n Subject: subject,\n HtmlBody: html,\n TextBody: text,\n }),\n })\n\n if (!response.ok) {\n const body = await response.text().catch(() => '')\n\n throw new IgniterMailError({\n code: 'MAIL_PROVIDER_SEND_FAILED',\n message: 'Postmark send failed',\n metadata: {\n status: response.status,\n body,\n },\n })\n }\n },\n }\n }\n}\n\n/**\n * Legacy adapter factory.\n */\nexport const postmarkAdapter = (options: LegacyIgniterMailOptions) =>\n PostmarkMailAdapterBuilder.create()\n .withSecret(options.secret)\n .withFrom(options.from)\n .build()\n","import { Resend } from 'resend'\n\nimport { IgniterMailError } from '../errors/igniter-mail.error'\nimport type { MailAdapter } from '../types/adapter'\nimport type { LegacyIgniterMailOptions } from '../types/provider'\n\nexport class ResendMailAdapterBuilder {\n private secret?: string\n private from?: string\n\n /** Creates a new builder instance. */\n static create() {\n return new ResendMailAdapterBuilder()\n }\n\n /** Sets the Resend API key. */\n withSecret(secret: string) {\n this.secret = secret\n return this\n }\n\n /** Sets the default FROM address used when sending emails via Resend. */\n withFrom(from: string) {\n this.from = from\n return this\n }\n\n /** Builds the adapter instance. */\n build(): MailAdapter {\n if (!this.secret) {\n throw new IgniterMailError({\n code: 'MAIL_ADAPTER_CONFIGURATION_INVALID',\n message: 'Resend adapter secret is required',\n })\n }\n\n if (!this.from) {\n throw new IgniterMailError({\n code: 'MAIL_ADAPTER_CONFIGURATION_INVALID',\n message: 'Resend adapter from is required',\n })\n }\n\n const resend = new Resend(this.secret)\n const from = this.from\n\n return {\n /**\n * Sends an email using Resend.\n *\n * Note: Resend accepts `scheduledAt` as an ISO string.\n */\n send: async ({ to, subject, html, text, scheduledAt }) => {\n await resend.emails.create({\n to,\n from,\n subject,\n html,\n text,\n scheduledAt: scheduledAt?.toISOString(),\n })\n },\n }\n }\n}\n\n/**\n * Legacy adapter factory.\n */\nexport const resendAdapter = (options: LegacyIgniterMailOptions) =>\n ResendMailAdapterBuilder.create()\n .withSecret(options.secret)\n .withFrom(options.from)\n .build()\n\n","import { IgniterMailError } from '../errors/igniter-mail.error'\nimport type { MailAdapter } from '../types/adapter'\nimport type { LegacyIgniterMailOptions } from '../types/provider'\n\n/**\n * SendGrid adapter builder.\n *\n * Notes:\n * - This implementation uses `fetch` (no SDK dependency).\n * - Designed to be extracted to `@igniter-js/mail/adapters/sendgrid`.\n */\nexport class SendGridMailAdapterBuilder {\n private secret?: string\n private from?: string\n\n /** Creates a new builder instance. */\n static create() {\n return new SendGridMailAdapterBuilder()\n }\n\n /** Sets the SendGrid API key. */\n withSecret(secret: string) {\n this.secret = secret\n return this\n }\n\n /** Sets the default FROM address used when sending emails via SendGrid. */\n withFrom(from: string) {\n this.from = from\n return this\n }\n\n /** Builds the adapter instance. */\n build(): MailAdapter {\n if (!this.secret) {\n throw new IgniterMailError({\n code: 'MAIL_ADAPTER_CONFIGURATION_INVALID',\n message: 'SendGrid adapter secret is required',\n })\n }\n\n if (!this.from) {\n throw new IgniterMailError({\n code: 'MAIL_ADAPTER_CONFIGURATION_INVALID',\n message: 'SendGrid adapter from is required',\n })\n }\n\n const apiKey = this.secret\n const from = this.from\n\n return {\n /** Sends an email using SendGrid (HTTP API). */\n send: async ({ to, subject, html, text }) => {\n const response = await fetch('https://api.sendgrid.com/v3/mail/send', {\n method: 'POST',\n headers: {\n Authorization: `Bearer ${apiKey}`,\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n personalizations: [{\n to: [{ email: to }],\n }],\n from: { email: from },\n subject,\n content: [\n { type: 'text/plain', value: text },\n { type: 'text/html', value: html },\n ],\n }),\n })\n\n // SendGrid typically returns 202 for accepted.\n if (!response.ok) {\n const body = await response.text().catch(() => '')\n\n throw new IgniterMailError({\n code: 'MAIL_PROVIDER_SEND_FAILED',\n message: 'SendGrid send failed',\n metadata: {\n status: response.status,\n body,\n },\n })\n }\n },\n }\n }\n}\n\n/**\n * Legacy adapter factory.\n */\nexport const sendgridAdapter = (options: LegacyIgniterMailOptions) =>\n SendGridMailAdapterBuilder.create()\n .withSecret(options.secret)\n .withFrom(options.from)\n .build()\n","import nodemailer from 'nodemailer'\n\nimport { IgniterMailError } from '../errors/igniter-mail.error'\nimport type { MailAdapter } from '../types/adapter'\nimport type { LegacyIgniterMailOptions } from '../types/provider'\n\nexport class SmtpMailAdapterBuilder {\n private secret?: string\n private from?: string\n\n /** Creates a new builder instance. */\n static create() {\n return new SmtpMailAdapterBuilder()\n }\n\n /** Sets the SMTP connection URL (e.g. `smtps://user:pass@host:port`). */\n withSecret(secret: string) {\n this.secret = secret\n return this\n }\n\n /** Sets the default FROM address used when sending emails via SMTP. */\n withFrom(from: string) {\n this.from = from\n return this\n }\n\n /** Builds the adapter instance. */\n build(): MailAdapter {\n if (!this.secret) {\n throw new IgniterMailError({\n code: 'MAIL_ADAPTER_CONFIGURATION_INVALID',\n message: 'SMTP adapter secret is required',\n })\n }\n\n if (!this.from) {\n throw new IgniterMailError({\n code: 'MAIL_ADAPTER_CONFIGURATION_INVALID',\n message: 'SMTP adapter from is required',\n })\n }\n\n const smtpUrl = this.secret\n const from = this.from\n\n const createTransporter = () => {\n return nodemailer.createTransport(smtpUrl, {\n tls: {\n rejectUnauthorized: false,\n },\n connectionTimeout: 10000,\n greetingTimeout: 5000,\n socketTimeout: 10000,\n })\n }\n\n return {\n /** Sends an email using Nodemailer over SMTP. */\n send: async ({ to, subject, html, text }) => {\n const transport = createTransporter()\n const mailOptions = {\n from,\n to,\n subject,\n html,\n text,\n }\n\n try {\n await transport.sendMail(mailOptions)\n transport.close()\n } catch (error) {\n transport.close()\n throw error\n }\n },\n }\n }\n}\n\n/**\n * Legacy adapter factory.\n */\nexport const smtpAdapter = (options: LegacyIgniterMailOptions) =>\n SmtpMailAdapterBuilder.create()\n .withSecret(options.secret)\n .withFrom(options.from)\n .build()\n\n","import type { IgniterLogger } from '@igniter-js/core'\n\nimport type { MailAdapter, MailAdapterSendParams } from '../types/adapter'\n\n/**\n * In-memory message captured by {@link TestMailAdapter}.\n */\nexport type TestMailMessage = MailAdapterSendParams & {\n /** Timestamp when `send()` was called. */\n at: Date\n}\n\n/**\n * A test-focused adapter that captures emails in memory.\n *\n * Why this exists:\n * - Allows unit tests to assert subjects/recipients/content without hitting a real provider.\n * - Can optionally log the send operation for local debugging.\n *\n * This adapter is intentionally dependency-free so it can live in `@igniter-js/mail/adapters`.\n */\nexport type TestMailAdapter = MailAdapter & {\n /** Captured sent messages, in order. */\n readonly sent: TestMailMessage[]\n /** Clears captured messages. */\n reset: () => void\n /** Returns the last captured message (if any). */\n last: () => TestMailMessage | undefined\n}\n\nexport type CreateTestMailAdapterOptions = {\n /** Optional logger; defaults to `console`. */\n logger?: Pick<IgniterLogger, 'info'>\n /** Whether to suppress logs. Default: `false`. */\n silent?: boolean\n}\n\n/**\n * Creates a {@link TestMailAdapter}.\n */\nexport function createTestMailAdapter(\n options: CreateTestMailAdapterOptions = {},\n): TestMailAdapter {\n const sent: TestMailMessage[] = []\n const logger = options.logger ?? console\n const silent = options.silent ?? false\n\n return {\n sent,\n reset: () => {\n sent.length = 0\n },\n last: () => sent.at(-1),\n send: async (params) => {\n sent.push({ ...params, at: new Date() })\n\n if (!silent) {\n logger.info(\n `[TestMailAdapter] to=${params.to} subject=${params.subject} html=${params.html.length}B text=${params.text.length}B`,\n )\n }\n },\n }\n}\n","import { IgniterMailError } from '../errors/igniter-mail.error'\nimport type { MailAdapter } from '../types/adapter'\nimport type { LegacyIgniterMailOptions } from '../types/provider'\n\n/**\n * Webhook adapter builder.\n *\n * This adapter posts the email payload to an arbitrary HTTP endpoint.\n *\n * Why this exists:\n * - Useful for low-code automation (Make/Zapier/n8n) or custom internal relays.\n * - Dependency-free (uses `fetch`).\n * - Easy to extract as `@igniter-js/mail/adapters/webhook`.\n */\nexport class WebhookMailAdapterBuilder {\n private url?: string\n private from?: string\n\n /** Creates a new builder instance. */\n static create() {\n return new WebhookMailAdapterBuilder()\n }\n\n /**\n * Sets the webhook URL.\n *\n * Note: when using `IgniterMailBuilder.withAdapter('webhook', secret)`, the `secret`\n * is treated as the webhook URL.\n */\n withUrl(url: string) {\n this.url = url\n return this\n }\n\n /** Sets the default FROM address. */\n withFrom(from: string) {\n this.from = from\n return this\n }\n\n /** Builds the adapter instance. */\n build(): MailAdapter {\n if (!this.url) {\n throw new IgniterMailError({\n code: 'MAIL_ADAPTER_CONFIGURATION_INVALID',\n message: 'Webhook adapter url is required',\n })\n }\n\n if (!this.from) {\n throw new IgniterMailError({\n code: 'MAIL_ADAPTER_CONFIGURATION_INVALID',\n message: 'Webhook adapter from is required',\n })\n }\n\n const url = this.url\n const from = this.from\n\n return {\n /** Sends an email by POST-ing to the configured webhook URL. */\n send: async ({ to, subject, html, text, scheduledAt }) => {\n const response = await fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n to,\n from,\n subject,\n html,\n text,\n scheduledAt: scheduledAt?.toISOString(),\n }),\n })\n\n if (!response.ok) {\n const body = await response.text().catch(() => '')\n\n throw new IgniterMailError({\n code: 'MAIL_PROVIDER_SEND_FAILED',\n message: 'Webhook send failed',\n metadata: {\n status: response.status,\n body,\n },\n })\n }\n },\n }\n }\n}\n\n/**\n * Legacy adapter factory.\n */\nexport const webhookAdapter = (options: LegacyIgniterMailOptions) =>\n WebhookMailAdapterBuilder.create()\n .withUrl(options.secret)\n .withFrom(options.from)\n .build()\n","import type { IgniterJobQueueAdapter, IgniterLogger } from '@igniter-js/core'\nimport { PostmarkMailAdapterBuilder } from '../adapters/postmark.adapter'\nimport { ResendMailAdapterBuilder } from '../adapters/resend.adapter'\nimport { SendGridMailAdapterBuilder } from '../adapters/sendgrid.adapter'\nimport { SmtpMailAdapterBuilder } from '../adapters/smtp.adapter'\nimport { WebhookMailAdapterBuilder } from '../adapters/webhook.adapter'\nimport { IgniterMailError } from '../errors/igniter-mail.error'\nimport type { MailAdapter } from '../types/adapter'\nimport type {\n IgniterMailOptions,\n IgniterMailQueueOptions,\n IgniterMailSendParams,\n IIgniterMail,\n} from '../types/provider'\nimport type { IgniterMailTemplate } from '../types/templates'\n\ntype AdapterInput =\n | { kind: 'adapter'; adapter: MailAdapter }\n | { kind: 'provider'; provider: string; secret: string }\n\n/**\n * Builder for {@link IgniterMail}.\n *\n * This API is designed to remain stable when extracted to `@igniter-js/mail`.\n */\nexport class IgniterMailBuilder<\n TTemplates extends object = Record<never, never>,\n> {\n private readonly factory: (\n options: IgniterMailOptions<TTemplates>,\n ) => IIgniterMail<TTemplates>\n private from?: string\n private adapter?: AdapterInput\n private templates: Record<string, IgniterMailTemplate<any>> = {}\n\n private logger?: IgniterLogger\n private queue?: {\n adapter: IgniterJobQueueAdapter<any>\n options?: IgniterMailQueueOptions\n }\n\n private onSendStarted?: (\n params: IgniterMailSendParams<\n Record<string, IgniterMailTemplate<any>>,\n any\n >,\n ) => Promise<void>\n\n private onSendError?: (\n params: IgniterMailSendParams<\n Record<string, IgniterMailTemplate<any>>,\n any\n >,\n error: Error,\n ) => Promise<void>\n\n private onSendSuccess?: (\n params: IgniterMailSendParams<\n Record<string, IgniterMailTemplate<any>>,\n any\n >,\n ) => Promise<void>\n\n private constructor(\n factory: (\n options: IgniterMailOptions<TTemplates>,\n ) => IIgniterMail<TTemplates>,\n ) {\n this.factory = factory\n }\n\n /**\n * Creates a new builder.\n */\n static create(\n factory: (options: IgniterMailOptions<any>) => IIgniterMail<any>,\n ) {\n return new IgniterMailBuilder<Record<never, never>>(factory as any)\n }\n\n /** Sets the default FROM address. */\n withFrom(from: string) {\n this.from = from\n return this\n }\n\n /** Attaches a logger instance. */\n withLogger(logger: IgniterLogger) {\n this.logger = logger\n return this\n }\n\n /**\n * Enables queue delivery.\n *\n * If configured, `IgniterMail.schedule()` will enqueue jobs instead of using `setTimeout`.\n */\n withQueue(\n adapter: IgniterJobQueueAdapter<any>,\n options?: IgniterMailQueueOptions,\n ) {\n this.queue = { adapter, options }\n return this\n }\n\n /**\n * Configures the adapter.\n *\n * - Use an adapter instance for full control.\n * - Or pass a provider key + secret for built-in adapters.\n */\n withAdapter(adapter: MailAdapter): this\n withAdapter(provider: string, secret: string): this\n withAdapter(adapterOrProvider: MailAdapter | string, secret?: string) {\n if (typeof adapterOrProvider === 'string') {\n if (!secret) {\n throw new IgniterMailError({\n code: 'MAIL_PROVIDER_ADAPTER_SECRET_REQUIRED',\n message: 'MAIL_PROVIDER_ADAPTER_SECRET_REQUIRED',\n logger: this.logger,\n })\n }\n\n this.adapter = {\n kind: 'provider',\n provider: adapterOrProvider,\n secret,\n }\n\n return this\n }\n\n this.adapter = {\n kind: 'adapter',\n adapter: adapterOrProvider,\n }\n\n return this\n }\n\n /**\n * Registers a template.\n */\n addTemplate<TKey extends string, TTemplate extends IgniterMailTemplate<any>>(\n key: TKey,\n template: TTemplate,\n ) {\n this.templates[key] = template\n return this as unknown as IgniterMailBuilder<\n TTemplates & Record<TKey, TTemplate>\n >\n }\n\n /** Hook invoked before sending. */\n withOnSendStarted(\n onSendStarted: (\n params: IgniterMailSendParams<\n Record<string, IgniterMailTemplate<any>>,\n any\n >,\n ) => Promise<void>,\n ) {\n this.onSendStarted = onSendStarted\n return this\n }\n\n /** Hook invoked on error. */\n withOnSendError(\n onSendError: (\n params: IgniterMailSendParams<\n Record<string, IgniterMailTemplate<any>>,\n any\n >,\n error: Error,\n ) => Promise<void>,\n ) {\n this.onSendError = onSendError\n return this\n }\n\n /** Hook invoked on success. */\n withOnSendSuccess(\n onSendSuccess: (\n params: IgniterMailSendParams<\n Record<string, IgniterMailTemplate<any>>,\n any\n >,\n ) => Promise<void>,\n ) {\n this.onSendSuccess = onSendSuccess\n return this\n }\n\n /**\n * Builds the {@link IgniterMail} instance.\n */\n build(): IIgniterMail<TTemplates> {\n if (!this.from) {\n throw new IgniterMailError({\n code: 'MAIL_PROVIDER_FROM_REQUIRED',\n message: 'MAIL_PROVIDER_FROM_REQUIRED',\n logger: this.logger,\n })\n }\n\n if (!this.adapter) {\n throw new IgniterMailError({\n code: 'MAIL_PROVIDER_ADAPTER_REQUIRED',\n message: 'MAIL_PROVIDER_ADAPTER_REQUIRED',\n logger: this.logger,\n })\n }\n\n const resolvedAdapter =\n this.adapter.kind === 'adapter'\n ? this.adapter.adapter\n : (() => {\n switch (this.adapter.provider) {\n case 'resend':\n return ResendMailAdapterBuilder.create()\n .withSecret(this.adapter.secret)\n .withFrom(this.from)\n .build()\n\n case 'smtp':\n return SmtpMailAdapterBuilder.create()\n .withSecret(this.adapter.secret)\n .withFrom(this.from)\n .build()\n\n case 'postmark':\n return PostmarkMailAdapterBuilder.create()\n .withSecret(this.adapter.secret)\n .withFrom(this.from)\n .build()\n\n case 'sendgrid':\n return SendGridMailAdapterBuilder.create()\n .withSecret(this.adapter.secret)\n .withFrom(this.from)\n .build()\n\n case 'webhook':\n return WebhookMailAdapterBuilder.create()\n .withUrl(this.adapter.secret)\n .withFrom(this.from)\n .build()\n\n default:\n throw new IgniterMailError({\n code: 'MAIL_PROVIDER_ADAPTER_NOT_FOUND',\n message: `MAIL_PROVIDER_ADAPTER_NOT_FOUND: ${this.adapter.provider}`,\n logger: this.logger,\n metadata: {\n provider: this.adapter.provider,\n },\n })\n }\n })()\n\n return this.factory({\n from: this.from,\n adapter: resolvedAdapter,\n templates: this.templates as TTemplates,\n onSendStarted: this.onSendStarted as any,\n onSendError: this.onSendError as any,\n onSendSuccess: this.onSendSuccess as any,\n logger: this.logger,\n queue: this.queue\n ? {\n adapter: this.queue.adapter,\n id: `${this.queue.options?.namespace ?? 'mail'}.${this.queue.options?.task ?? 'send'}`,\n options: this.queue.options,\n }\n : undefined,\n })\n }\n}\n","import type { StandardSchemaV1 } from '@igniter-js/core'\nimport type { ReactElement } from 'react'\nimport { IgniterMailError } from '../errors/igniter-mail.error'\nimport type { IgniterMailTemplate } from '../types/templates'\n\n/**\n * Builder for {@link IgniterMailTemplate}.\n */\nexport class MailTemplateBuilder<TSchema extends StandardSchemaV1 = StandardSchemaV1> {\n private subject?: string\n private schema?: StandardSchemaV1\n private render?: (data: any) => ReactElement\n\n /** Creates a new builder instance. */\n static create() {\n return new MailTemplateBuilder<any>()\n }\n\n /** Sets the default subject for the template. */\n withSubject(subject: string) {\n this.subject = subject\n return this\n }\n\n /** Attaches the schema used to validate and infer payload types. */\n withSchema<TNextSchema extends StandardSchemaV1>(schema: TNextSchema) {\n this.schema = schema\n return this as unknown as MailTemplateBuilder<TNextSchema>\n }\n\n /** Sets the React Email render function for the template. */\n withRender(\n render: (\n data: StandardSchemaV1.InferInput<TSchema>,\n ) => ReactElement,\n ) {\n this.render = render as any\n return this\n }\n\n /** Builds the template definition. */\n build(): IgniterMailTemplate<TSchema> {\n if (!this.subject) {\n throw new IgniterMailError({\n code: 'MAIL_TEMPLATE_CONFIGURATION_INVALID',\n message: 'Mail template subject is required',\n })\n }\n\n if (!this.schema) {\n throw new IgniterMailError({\n code: 'MAIL_TEMPLATE_CONFIGURATION_INVALID',\n message: 'Mail template schema is required',\n })\n }\n\n if (!this.render) {\n throw new IgniterMailError({\n code: 'MAIL_TEMPLATE_CONFIGURATION_INVALID',\n message: 'Mail template render is required',\n })\n }\n\n return {\n subject: this.subject,\n schema: this.schema as TSchema,\n render: this.render as IgniterMailTemplate<TSchema>['render'],\n }\n }\n}\n\n","import type { StandardSchemaV1 } from '@igniter-js/core'\nimport { IgniterMailError } from '../errors/igniter-mail.error'\n\n/**\n * Validates an unknown input using `StandardSchemaV1` when the schema provides `~standard.validate`.\n *\n * If the schema does not provide a validator, this function returns the input as-is.\n */\nexport async function validateStandardSchemaInput<TSchema extends StandardSchemaV1>(\n schema: TSchema,\n input: unknown,\n): Promise<StandardSchemaV1.InferInput<TSchema>> {\n const standard = (schema as any)?.['~standard'] as\n | {\n validate: (value: unknown) =>\n | { value?: unknown; issues?: unknown[] }\n | Promise<{ value?: unknown; issues?: unknown[] }>\n }\n | undefined\n\n if (!standard?.validate) {\n return input as StandardSchemaV1.InferInput<TSchema>\n }\n\n const result = await standard.validate(input)\n\n if ((result as any)?.issues?.length) {\n throw new IgniterMailError({\n code: 'MAIL_PROVIDER_TEMPLATE_DATA_INVALID',\n message: 'Invalid mail template payload',\n statusCode: 400,\n details: (result as any).issues,\n })\n }\n\n return ((result as any)?.value ?? input) as StandardSchemaV1.InferInput<TSchema>\n}\n","import type { IgniterLogger, StandardSchemaV1 } from '@igniter-js/core'\nimport React from 'react'\nimport { render } from '@react-email/components'\nimport { IgniterMailBuilder } from '../builders/igniter-mail.builder'\nimport { IgniterMailError } from '../errors/igniter-mail.error'\nimport type { MailAdapter } from '../types/adapter'\nimport type {\n IgniterMailInfer,\n IgniterMailOptions,\n IgniterMailQueueConfig,\n IgniterMailSendParams,\n IIgniterMail,\n LegacyIgniterMailOptions,\n} from '../types/provider'\nimport type {\n IgniterMailTemplate,\n MailTemplateKey,\n MailTemplatePayload,\n} from '../types/templates'\nimport { validateStandardSchemaInput } from '../utils/validate-standard-schema-input'\n\n/**\n * Mail runtime for Igniter.js.\n *\n * This class is designed to be extracted into the `@igniter-js/mail` package.\n */\nexport class IgniterMail<TTemplates extends object>\n implements IIgniterMail<TTemplates>\n{\n private static instance: IIgniterMail<any> | undefined\n\n private readonly adapter: MailAdapter\n private readonly templates: TTemplates\n private readonly logger?: IgniterLogger\n private readonly queue?: IgniterMailQueueConfig\n private queueJobRegistered = false\n private queueJobRegistering?: Promise<void>\n private readonly options: Omit<\n IgniterMailOptions<TTemplates>,\n 'adapter' | 'templates'\n >\n\n /**\n * Type inference helper.\n * Access via `typeof mail.$Infer` (type-level only).\n */\n public readonly $Infer: IgniterMailInfer<TTemplates> =\n undefined as unknown as IgniterMailInfer<TTemplates>\n\n constructor(options: IgniterMailOptions<TTemplates>) {\n const { adapter, templates, logger, queue, ...rest } = options\n\n if (!adapter) {\n throw new IgniterMailError({\n code: 'MAIL_PROVIDER_ADAPTER_REQUIRED',\n message: 'MAIL_PROVIDER_ADAPTER_REQUIRED',\n logger,\n })\n }\n\n if (!templates) {\n throw new IgniterMailError({\n code: 'MAIL_PROVIDER_TEMPLATES_REQUIRED',\n message: 'MAIL_PROVIDER_TEMPLATES_REQUIRED',\n logger,\n })\n }\n\n this.adapter = adapter\n this.templates = templates\n this.logger = logger\n this.queue = queue\n this.options = rest\n }\n\n private async ensureQueueJobRegistered(): Promise<void> {\n const queue = this.queue\n if (!queue) return\n if (this.queueJobRegistered) return\n\n if (this.queueJobRegistering) {\n await this.queueJobRegistering\n return\n }\n\n this.queueJobRegistering = (async () => {\n const queueOptions = queue.options\n const name = queueOptions?.name ?? 'send'\n\n const passthroughSchema = {\n '~standard': {\n vendor: '@igniter-js/mail',\n version: 1,\n validate: async (value: unknown) => ({ value }),\n },\n } satisfies StandardSchemaV1\n\n const definition = queue.adapter.register({\n name,\n input: passthroughSchema,\n handler: async ({ input }) => {\n await this.send(input as any)\n },\n queue: queueOptions?.queue,\n attempts: queueOptions?.attempts,\n priority: queueOptions?.priority,\n removeOnComplete: queueOptions?.removeOnComplete,\n removeOnFail: queueOptions?.removeOnFail,\n metadata: queueOptions?.metadata,\n limiter: queueOptions?.limiter,\n })\n\n await queue.adapter.bulkRegister({\n [queue.id]: definition as any,\n })\n\n this.queueJobRegistered = true\n })()\n\n try {\n await this.queueJobRegistering\n } finally {\n this.queueJobRegistering = undefined\n }\n }\n\n private async validateTemplateData<\n TTemplate extends IgniterMailTemplate<any>,\n >(\n template: TTemplate,\n data: MailTemplatePayload<TTemplate>,\n ): Promise<MailTemplatePayload<TTemplate>> {\n try {\n return (await validateStandardSchemaInput(\n template.schema as any,\n data,\n )) as MailTemplatePayload<TTemplate>\n } catch (error) {\n const normalizedError = IgniterMailError.is(error)\n ? error\n : new IgniterMailError({\n code: 'MAIL_PROVIDER_TEMPLATE_DATA_INVALID',\n message: 'MAIL_PROVIDER_TEMPLATE_DATA_INVALID',\n cause: error,\n logger: this.logger,\n metadata: { subject: String((template as any).subject) },\n })\n\n throw normalizedError\n }\n }\n\n /**\n * Sends an email immediately.\n */\n async send<TSelectedTemplate extends MailTemplateKey<TTemplates>>(\n params: IgniterMailSendParams<TTemplates, TSelectedTemplate>,\n ): Promise<void> {\n try {\n this.logger?.debug('IgniterMail.send started', {\n to: params.to,\n template: String(params.template),\n })\n\n await this.onSendStarted(params)\n\n const template = (this.templates as any)[params.template] as\n | IgniterMailTemplate<any>\n | undefined\n\n if (!template) {\n throw new IgniterMailError({\n code: 'MAIL_PROVIDER_TEMPLATE_NOT_FOUND',\n message: 'MAIL_PROVIDER_TEMPLATE_NOT_FOUND',\n logger: this.logger,\n metadata: {\n template: String(params.template),\n },\n })\n }\n\n const validatedData = await this.validateTemplateData(\n template,\n params.data,\n )\n const MailTemplate = template.render\n\n const html = await render(<MailTemplate {...(validatedData as any)} />)\n const text = await render(<MailTemplate {...(validatedData as any)} />, {\n plainText: true,\n })\n\n await this.adapter.send({\n to: params.to,\n subject: params.subject || template.subject,\n html,\n text,\n })\n\n await this.onSendSuccess(params)\n\n this.logger?.info('IgniterMail.send success', {\n to: params.to,\n template: String(params.template),\n })\n } catch (error) {\n const normalizedError = IgniterMailError.is(error)\n ? error\n : new IgniterMailError({\n code: 'MAIL_PROVIDER_SEND_FAILED',\n message: 'MAIL_PROVIDER_SEND_FAILED',\n cause: error,\n logger: this.logger,\n metadata: {\n to: params.to,\n template: String(params.template),\n },\n })\n\n this.logger?.error('IgniterMail.send failed', normalizedError)\n\n await this.onSendError(params, normalizedError)\n throw normalizedError\n }\n }\n\n /**\n * Schedules an email for a future date.\n *\n * If a queue is configured, this method enqueues a job.\n * Otherwise, it uses a best-effort `setTimeout`.\n */\n async schedule<TSelectedTemplate extends MailTemplateKey<TTemplates>>(\n params: IgniterMailSendParams<TTemplates, TSelectedTemplate>,\n date: Date,\n ): Promise<void> {\n if (date.getTime() <= Date.now()) {\n throw new IgniterMailError({\n code: 'MAIL_PROVIDER_SCHEDULE_DATE_INVALID',\n message: 'MAIL_PROVIDER_SCHEDULE_DATE_INVALID',\n logger: this.logger,\n })\n }\n\n if (this.queue) {\n try {\n await this.ensureQueueJobRegistered()\n const delay = Math.max(0, date.getTime() - Date.now())\n\n this.logger?.info('IgniterMail.schedule enqueued', {\n id: this.queue.id,\n to: params.to,\n template: String(params.template),\n delay,\n })\n\n await this.queue.adapter.invoke({\n id: this.queue.id,\n input: params as any,\n delay,\n })\n\n return\n } catch (error) {\n const normalizedError = IgniterMailError.is(error)\n ? error\n : new IgniterMailError({\n code: 'MAIL_PROVIDER_SCHEDULE_FAILED',\n message: 'MAIL_PROVIDER_SCHEDULE_FAILED',\n cause: error,\n logger: this.logger,\n metadata: {\n to: params.to,\n template: String(params.template),\n date: date.toISOString(),\n },\n })\n\n this.logger?.error('IgniterMail.schedule failed', normalizedError)\n throw normalizedError\n }\n }\n\n const timeout = date.getTime() - Date.now()\n setTimeout(() => {\n this.send(params).catch((error) => {\n console.error('Failed to send scheduled email:', error)\n })\n }, timeout)\n }\n\n private async onSendStarted(\n params: IgniterMailSendParams<TTemplates, any>,\n ): Promise<void> {\n await this.options.onSendStarted?.(params)\n }\n\n private async onSendError(\n params: IgniterMailSendParams<TTemplates, any>,\n error: Error,\n ): Promise<void> {\n await this.options.onSendError?.(params, error)\n }\n\n private async onSendSuccess(\n params: IgniterMailSendParams<TTemplates, any>,\n ): Promise<void> {\n await this.options.onSendSuccess?.(params)\n }\n\n /** Helper to declare adapter factories. */\n static adapter = <TOptions,>(adapter: (options: TOptions) => MailAdapter) =>\n adapter\n\n /** Helper to declare templates with inferred payload types. */\n static template = <TSchema extends StandardSchemaV1>(\n template: IgniterMailTemplate<TSchema>,\n ) => template\n\n /**\n * Creates a new builder instance.\n */\n static create = () =>\n IgniterMailBuilder.create((options) => new IgniterMail<any>(options))\n\n /**\n * Initializes (singleton) instance.\n *\n * Prefer using {@link IgniterMail.create} for new code.\n */\n static initialize = <TEmailTemplates extends object>(\n options:\n | IgniterMailOptions<TEmailTemplates>\n | LegacyIgniterMailOptions<TEmailTemplates>,\n ) => {\n if (IgniterMail.instance) {\n return IgniterMail.instance as IgniterMail<TEmailTemplates>\n }\n\n const adapter = (options as any).adapter\n\n if (typeof adapter === 'function') {\n const legacyOptions = options as LegacyIgniterMailOptions<TEmailTemplates>\n IgniterMail.instance = new IgniterMail<TEmailTemplates>({\n from: legacyOptions.from,\n templates: legacyOptions.templates,\n adapter: legacyOptions.adapter(legacyOptions),\n onSendStarted: legacyOptions.onSendStarted,\n onSendError: legacyOptions.onSendError,\n onSendSuccess: legacyOptions.onSendSuccess,\n }) as unknown as IIgniterMail<any>\n return IgniterMail.instance as IgniterMail<TEmailTemplates>\n }\n\n IgniterMail.instance = new IgniterMail<TEmailTemplates>(\n options as IgniterMailOptions<TEmailTemplates>,\n ) as unknown as IIgniterMail<any>\n return IgniterMail.instance as IgniterMail<TEmailTemplates>\n }\n}\n","import type {\n IgniterJobQueueAdapter,\n IgniterLogger,\n JobLimiter,\n JobQueueConfig,\n StandardSchemaV1,\n} from '@igniter-js/core'\nimport type { MailAdapter } from './adapter'\nimport type { IgniterMailTemplate, MailTemplateKey, MailTemplatePayload } from './templates'\n\n/**\n * Type inference helper exposed by the runtime instance.\n */\nexport type IgniterMailInfer<TTemplates extends object> = {\n /** Union of valid template keys. */\n readonly Templates: MailTemplateKey<TTemplates>\n /** Payloads by template. */\n readonly Payloads: {\n [K in MailTemplateKey<TTemplates>]: MailTemplatePayload<TTemplates[K]>\n }\n\n /**\n * Union of valid `mail.send()` inputs.\n * Useful for type-level consumption.\n */\n readonly SendInput: {\n [K in MailTemplateKey<TTemplates>]: IgniterMailSendParams<TTemplates, K>\n }[MailTemplateKey<TTemplates>]\n\n /**\n * Tuple form of `mail.schedule()` inputs.\n */\n readonly ScheduleInput: [\n {\n [K in MailTemplateKey<TTemplates>]: IgniterMailSendParams<TTemplates, K>\n }[MailTemplateKey<TTemplates>],\n Date,\n ]\n}\n\n/**\n * Queue options used when scheduling or enqueuing send jobs.\n */\nexport type IgniterMailQueueOptions = {\n /** Namespace used to compose the job id (default: \"mail\"). */\n namespace?: string\n /** Task key used to compose the job id (default: \"send\"). */\n task?: string\n /** Human-readable job name (default: \"send\"). */\n name?: string\n /** Queue config for this job. */\n queue?: JobQueueConfig\n /** Number of retry attempts on failure. */\n attempts?: number\n /** Job priority (higher value = higher priority). */\n priority?: number\n /** Remove job after completion. */\n removeOnComplete?: boolean | number\n /** Remove job after failure. */\n removeOnFail?: boolean | number\n /** Additional metadata. */\n metadata?: Record<string, any>\n /** Optional rate limiter config. */\n limiter?: JobLimiter\n}\n\n/**\n * Normalized queue configuration consumed by the runtime.\n */\nexport type IgniterMailQueueConfig = {\n /** Queue adapter instance. */\n adapter: IgniterJobQueueAdapter<any>\n /** Fully qualified job id. */\n id: string\n /** Optional queue options. */\n options?: IgniterMailQueueOptions\n}\n\n/**\n * Parameters required to send an email using a template.\n */\nexport interface IgniterMailSendParams<\n TTemplates extends object,\n TSelectedTemplate extends MailTemplateKey<TTemplates>,\n> {\n /** Recipient email address. */\n to: string\n /** Optional subject override. */\n subject?: string\n /** Template key. */\n template: TSelectedTemplate\n /** Template payload (validated using StandardSchema when provided). */\n data: MailTemplatePayload<TTemplates[TSelectedTemplate]>\n}\n\n/**\n * Hooks invoked by the runtime.\n */\nexport interface IgniterMailHooks<TTemplates extends object> {\n /** Invoked before rendering/sending. */\n onSendStarted?: (params: IgniterMailSendParams<TTemplates, any>) => Promise<void>\n /** Invoked when sending fails. */\n onSendError?: (\n params: IgniterMailSendParams<TTemplates, any>,\n error: Error,\n ) => Promise<void>\n /** Invoked after a successful send. */\n onSendSuccess?: (params: IgniterMailSendParams<TTemplates, any>) => Promise<void>\n}\n\n/**\n * Options used to initialize {@link IgniterMail}.\n */\nexport interface IgniterMailOptions<\n TTemplates extends object = Record<string, IgniterMailTemplate<any>>,\n> extends IgniterMailHooks<TTemplates> {\n /** Default FROM address used by the adapter. */\n from: string\n /** Adapter implementation. */\n adapter: MailAdapter\n /** Template registry. */\n templates: TTemplates\n\n /** Optional logger used for debug/info/error logging. */\n logger?: IgniterLogger\n /** Optional queue configuration for asynchronous delivery. */\n queue?: IgniterMailQueueConfig\n}\n\n/**\n * Legacy initializer options.\n *\n * Kept for backwards compatibility with older integrations.\n */\nexport interface LegacyIgniterMailOptions<\n TTemplates extends object = Record<string, IgniterMailTemplate<any>>,\n> extends IgniterMailHooks<TTemplates> {\n /** Provider secret/token. */\n secret: string\n /** Default FROM address. */\n from: string\n /** Adapter factory. */\n adapter: (options: LegacyIgniterMailOptions<any>) => MailAdapter\n /** Template registry. */\n templates: TTemplates\n}\n\n/**\n * Public interface implemented by {@link IgniterMail}.\n */\nexport interface IIgniterMail<TTemplates extends object> {\n /**\n * Type inference helper.\n * Access via `typeof mail.$Infer` (type-level only).\n */\n readonly $Infer: IgniterMailInfer<TTemplates>\n\n /** Sends an email immediately. */\n send: <TSelectedTemplate extends MailTemplateKey<TTemplates>>(\n params: IgniterMailSendParams<TTemplates, TSelectedTemplate>,\n ) => Promise<void>\n\n /** Schedules an email for a future date (queue if configured, otherwise setTimeout). */\n schedule: <TSelectedTemplate extends MailTemplateKey<TTemplates>>(\n params: IgniterMailSendParams<TTemplates, TSelectedTemplate>,\n date: Date,\n ) => Promise<void>\n}\n\n/**\n * Helper for creating a passthrough `StandardSchemaV1` validator.\n */\nexport function createPassthroughSchema(): StandardSchemaV1 {\n return {\n '~standard': {\n vendor: '@igniter-js/mail',\n version: 1,\n validate: async (value: unknown) => ({ value }),\n },\n } satisfies StandardSchemaV1\n}\n","import { postmarkAdapter } from '../adapters/postmark.adapter'\nimport { resendAdapter } from '../adapters/resend.adapter'\nimport { sendgridAdapter } from '../adapters/sendgrid.adapter'\nimport { smtpAdapter } from '../adapters/smtp.adapter'\nimport { webhookAdapter } from '../adapters/webhook.adapter'\nimport { IgniterMailError } from '../errors/igniter-mail.error'\n\n/**\n * Resolves a legacy adapter factory by key.\n */\nexport const getAdapter = (adapter: string) => {\n switch (adapter) {\n case 'resend':\n return resendAdapter\n case 'smtp':\n return smtpAdapter\n case 'postmark':\n return postmarkAdapter\n case 'sendgrid':\n return sendgridAdapter\n case 'webhook':\n return webhookAdapter\n default:\n throw new IgniterMailError({\n code: 'MAIL_PROVIDER_ADAPTER_NOT_FOUND',\n message: `MAIL_PROVIDER_ADAPTER_NOT_FOUND: ${adapter}`,\n metadata: { adapter },\n })\n }\n}\n"]}
package/package.json ADDED
@@ -0,0 +1,90 @@
1
+ {
2
+ "name": "@igniter-js/mail",
3
+ "version": "0.1.0",
4
+ "description": "Type-safe email library for Igniter.js with React Email templates and multiple provider adapters",
5
+ "main": "dist/index.js",
6
+ "types": "dist/index.d.ts",
7
+ "sideEffects": false,
8
+ "files": [
9
+ "dist",
10
+ "README.md",
11
+ "CHANGELOG.md",
12
+ "AGENTS.md"
13
+ ],
14
+ "exports": {
15
+ ".": {
16
+ "types": "./dist/index.d.ts",
17
+ "import": "./dist/index.js",
18
+ "require": "./dist/index.js"
19
+ }
20
+ },
21
+ "scripts": {
22
+ "dev": "tsup --watch",
23
+ "build": "tsup",
24
+ "test": "vitest run",
25
+ "test:watch": "vitest",
26
+ "typecheck": "tsc --noEmit",
27
+ "lint": "eslint src",
28
+ "clean": "rm -rf dist"
29
+ },
30
+ "keywords": [
31
+ "igniter",
32
+ "igniterjs",
33
+ "mail",
34
+ "email",
35
+ "react-email",
36
+ "resend",
37
+ "postmark",
38
+ "sendgrid",
39
+ "smtp",
40
+ "transactional-email",
41
+ "typescript"
42
+ ],
43
+ "author": "Felipe Barcelos <felipebarcelospro@gmail.com>",
44
+ "license": "MIT",
45
+ "repository": {
46
+ "type": "git",
47
+ "url": "https://github.com/felipebarcelospro/igniter-js.git",
48
+ "directory": "packages/mail"
49
+ },
50
+ "bugs": {
51
+ "url": "https://github.com/felipebarcelospro/igniter-js/issues"
52
+ },
53
+ "homepage": "https://igniterjs.com",
54
+ "dependencies": {
55
+ "@react-email/components": "^0.0.25"
56
+ },
57
+ "devDependencies": {
58
+ "@igniter-js/core": "*",
59
+ "@types/node": "^22.7.5",
60
+ "@types/nodemailer": "^6.4.16",
61
+ "@types/react": "^18.3.12",
62
+ "nodemailer": "^6.9.15",
63
+ "react": "^18.3.1",
64
+ "resend": "^4.0.1",
65
+ "typescript": "^5.6.3",
66
+ "tsup": "^8.3.0",
67
+ "vitest": "^2.1.4"
68
+ },
69
+ "peerDependencies": {
70
+ "@igniter-js/core": "*",
71
+ "react": "^18.0.0"
72
+ },
73
+ "peerDependenciesMeta": {
74
+ "nodemailer": {
75
+ "optional": true
76
+ },
77
+ "postmark": {
78
+ "optional": true
79
+ },
80
+ "resend": {
81
+ "optional": true
82
+ },
83
+ "sendgrid": {
84
+ "optional": true
85
+ }
86
+ },
87
+ "publishConfig": {
88
+ "access": "public"
89
+ }
90
+ }