@igniter-js/mail 0.1.13 → 0.1.14

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.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/errors/mail.error.ts","../src/adapters/postmark.adapter.ts","../src/adapters/resend.adapter.ts","../src/adapters/sendgrid.adapter.ts","../src/adapters/smtp.adapter.ts","../src/utils/schema.ts","../src/core/manager.tsx","../src/builders/main.builder.ts","../src/builders/template.builder.ts","../src/adapters/mock.adapter.ts"],"names":["IgniterError","resend","Resend","nodemailer","render"],"mappings":"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","file":"index.js","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 | 'MAIL_PROVIDER_SCHEDULE_QUEUE_NOT_CONFIGURED'\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/mail.error'\nimport type {\n IgniterMailAdapter,\n IgniterMailAdapterCredentials,\n IgniterMailAdapterSendParams,\n} from '../types/adapter'\n\n/**\n * Postmark adapter.\n *\n * Notes:\n * - This implementation uses `fetch` (no SDK dependency).\n * - Designed to be extracted to `@igniter-js/mail/adapters/postmark`.\n *\n * @example\n * ```ts\n * const adapter = PostmarkMailAdapter.create({\n * secret: process.env.POSTMARK_SERVER_TOKEN,\n * from: 'no-reply@example.com',\n * })\n * await adapter.send({ to: 'user@example.com', subject: 'Hello', html: '<p>Hi</p>', text: 'Hi' })\n * ```\n */\nexport class PostmarkMailAdapter implements IgniterMailAdapter {\n /**\n * Creates a new adapter instance.\n *\n * @param credentials - Provider credentials (secret/from).\n * @returns A Postmark adapter instance.\n * @throws {IgniterMailError} Does not throw on creation; errors surface on send.\n * @example\n * ```ts\n * const adapter = PostmarkMailAdapter.create({ secret: 'token', from: 'no-reply@acme.com' })\n * ```\n */\n static create(credentials: IgniterMailAdapterCredentials) {\n return new PostmarkMailAdapter(credentials)\n }\n\n /**\n * Creates a new adapter instance.\n *\n * @param credentials - Provider credentials (secret/from).\n * @throws {IgniterMailError} Does not throw on creation; errors surface on send.\n */\n constructor(private readonly credentials: IgniterMailAdapterCredentials = {}) {}\n\n /**\n * Sends an email using Postmark (HTTP API).\n *\n * @param params - Normalized email parameters.\n * @returns A promise that resolves when the email is accepted.\n * @throws {IgniterMailError} When configuration is invalid or Postmark rejects the request.\n * @example\n * ```ts\n * await adapter.send({ to: 'user@example.com', subject: 'Hello', html: '<p>Hi</p>', text: 'Hi' })\n * ```\n */\n async send(params: IgniterMailAdapterSendParams) {\n if (!this.credentials.secret) {\n throw new IgniterMailError({\n code: 'MAIL_ADAPTER_CONFIGURATION_INVALID',\n message: 'Postmark adapter secret is required',\n })\n }\n\n if (!this.credentials.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.credentials.secret\n const from = this.credentials.from\n\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: params.to,\n Subject: params.subject,\n HtmlBody: params.html,\n TextBody: params.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}","import { Resend } from 'resend'\n\nimport { IgniterMailError } from '../errors/mail.error'\nimport type {\n IgniterMailAdapter,\n IgniterMailAdapterCredentials,\n IgniterMailAdapterSendParams,\n} from '../types/adapter'\n\n/**\n * Resend adapter implementation.\n *\n * Notes:\n * - Uses the Resend SDK.\n * - Designed to be extracted to `@igniter-js/mail/adapters/resend`.\n *\n * @example\n * ```ts\n * const adapter = ResendMailAdapter.create({\n * secret: process.env.RESEND_API_KEY,\n * from: 'no-reply@example.com',\n * })\n * await adapter.send({ to: 'user@example.com', subject: 'Hi', html: '<p>Hi</p>', text: 'Hi' })\n * ```\n */\nexport class ResendMailAdapter implements IgniterMailAdapter {\n /**\n * Creates a new adapter instance.\n *\n * @param credentials - Adapter credentials including API secret and default from.\n * @returns A configured Resend adapter.\n * @throws {IgniterMailError} Does not throw on creation; errors surface on send.\n * @example\n * ```ts\n * const adapter = ResendMailAdapter.create({ secret: 'token', from: 'no-reply@acme.com' })\n * ```\n */\n static create(credentials: IgniterMailAdapterCredentials) {\n return new ResendMailAdapter(credentials)\n }\n\n /**\n * Creates an adapter with credentials.\n *\n * @param credentials - Adapter credentials including API secret and default from.\n * @throws {IgniterMailError} Does not throw on creation; errors surface on send.\n */\n constructor(private readonly credentials: IgniterMailAdapterCredentials = {}) {}\n\n /**\n * Sends an email using Resend.\n *\n * @param params - Email payload to send.\n * @returns Resolves when the email is accepted by Resend.\n * @throws {IgniterMailError} When credentials are missing or Resend rejects the request.\n *\n * @example\n * ```ts\n * await adapter.send({ to: 'user@example.com', subject: 'Welcome', html: '<p>Hi</p>', text: 'Hi' })\n * ```\n */\n async send(params: IgniterMailAdapterSendParams): Promise<void> {\n if (!this.credentials.secret) {\n throw new IgniterMailError({\n code: 'MAIL_ADAPTER_CONFIGURATION_INVALID',\n message: 'Resend adapter secret is required',\n })\n }\n\n if (!this.credentials.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.credentials.secret)\n const from = this.credentials.from\n\n await resend.emails.create({\n to: params.to,\n from,\n subject: params.subject,\n html: params.html,\n text: params.text,\n scheduledAt: params.scheduledAt?.toISOString(),\n })\n }\n}\n","import { IgniterMailError } from '../errors/mail.error'\nimport type {\n IgniterMailAdapter,\n IgniterMailAdapterCredentials,\n IgniterMailAdapterSendParams,\n} from '../types/adapter'\n\n/**\n * SendGrid adapter implementation.\n *\n * Notes:\n * - This implementation uses `fetch` (no SDK dependency).\n * - Designed to be extracted to `@igniter-js/mail/adapters/sendgrid`.\n *\n * @example\n * ```ts\n * const adapter = SendGridMailAdapter.create({\n * secret: process.env.SENDGRID_API_KEY,\n * from: 'no-reply@example.com',\n * })\n * await adapter.send({ to: 'user@example.com', subject: 'Hello', html: '<p>Hi</p>', text: 'Hi' })\n * ```\n */\nexport class SendGridMailAdapter implements IgniterMailAdapter {\n /**\n * Creates a new adapter instance.\n *\n * @param credentials - Adapter credentials including API secret and default from.\n * @returns A configured SendGrid adapter.\n * @throws {IgniterMailError} Does not throw on creation; errors surface on send.\n * @example\n * ```ts\n * const adapter = SendGridMailAdapter.create({ secret: 'token', from: 'no-reply@acme.com' })\n * ```\n */\n static create(credentials: IgniterMailAdapterCredentials) {\n return new SendGridMailAdapter(credentials)\n }\n\n /**\n * Creates an adapter with credentials.\n *\n * @param credentials - Adapter credentials including API secret and default from.\n * @throws {IgniterMailError} Does not throw on creation; errors surface on send.\n */\n constructor(private readonly credentials: IgniterMailAdapterCredentials = {}) {}\n\n /**\n * Sends an email using SendGrid (HTTP API).\n *\n * @param params - Email payload to send.\n * @returns Resolves when the email is accepted by SendGrid.\n * @throws {IgniterMailError} When credentials are missing or the API fails.\n *\n * @example\n * ```ts\n * await adapter.send({ to: 'user@example.com', subject: 'Hi', html: '<p>Hi</p>', text: 'Hi' })\n * ```\n */\n async send(params: IgniterMailAdapterSendParams): Promise<void> {\n if (!this.credentials.secret) {\n throw new IgniterMailError({\n code: 'MAIL_ADAPTER_CONFIGURATION_INVALID',\n message: 'SendGrid adapter secret is required',\n })\n }\n\n if (!this.credentials.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.credentials.secret\n const from = this.credentials.from\n\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 {\n to: [{ email: params.to }],\n },\n ],\n from: { email: from },\n subject: params.subject,\n content: [\n { type: 'text/plain', value: params.text },\n { type: 'text/html', value: params.html },\n ],\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: 'SendGrid send failed',\n metadata: {\n status: response.status,\n body,\n },\n })\n }\n }\n}\n","import nodemailer from 'nodemailer'\n\nimport { IgniterMailError } from '../errors/mail.error'\nimport type {\n IgniterMailAdapter,\n IgniterMailAdapterCredentials,\n IgniterMailAdapterSendParams,\n} from '../types/adapter'\n\n/**\n * SMTP adapter implementation.\n *\n * Notes:\n * - Uses Nodemailer.\n * - `credentials.secret` must be an SMTP connection URL.\n *\n * @example\n * ```ts\n * const adapter = SmtpMailAdapter.create({\n * secret: 'smtps://user:pass@host:465',\n * from: 'no-reply@example.com',\n * })\n * await adapter.send({ to: 'user@example.com', subject: 'Hi', html: '<p>Hi</p>', text: 'Hi' })\n * ```\n */\nexport class SmtpMailAdapter implements IgniterMailAdapter {\n /**\n * Creates a new adapter instance.\n *\n * @param credentials - Adapter credentials including SMTP URL and default from.\n * @returns A configured SMTP adapter.\n * @throws {IgniterMailError} Does not throw on creation; errors surface on send.\n * @example\n * ```ts\n * const adapter = SmtpMailAdapter.create({ secret: 'smtps://user:pass@host:465', from: 'no-reply@acme.com' })\n * ```\n */\n static create(credentials: IgniterMailAdapterCredentials) {\n return new SmtpMailAdapter(credentials)\n }\n\n /**\n * Creates an adapter with credentials.\n *\n * @param credentials - Adapter credentials including SMTP URL and default from.\n * @throws {IgniterMailError} Does not throw on creation; errors surface on send.\n */\n constructor(private readonly credentials: IgniterMailAdapterCredentials = {}) {}\n\n /**\n * Sends an email using Nodemailer over SMTP.\n *\n * @param params - Email payload to send.\n * @returns Resolves when the email is sent.\n * @throws {IgniterMailError} When credentials are missing or the SMTP send fails.\n *\n * @example\n * ```ts\n * await adapter.send({ to: 'user@example.com', subject: 'Hi', html: '<p>Hi</p>', text: 'Hi' })\n * ```\n */\n async send(params: IgniterMailAdapterSendParams): Promise<void> {\n if (!this.credentials.secret) {\n throw new IgniterMailError({\n code: 'MAIL_ADAPTER_CONFIGURATION_INVALID',\n message: 'SMTP adapter secret is required',\n })\n }\n\n if (!this.credentials.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.credentials.secret\n const from = this.credentials.from\n\n const transport = nodemailer.createTransport(smtpUrl, {\n connectionTimeout: 10000,\n greetingTimeout: 5000,\n socketTimeout: 10000,\n tls: {\n rejectUnauthorized: false,\n },\n })\n\n try {\n await transport.sendMail({\n from,\n to: params.to,\n subject: params.subject,\n html: params.html,\n text: params.text,\n })\n } catch(error) {\n throw new IgniterMailError({\n code: 'MAIL_PROVIDER_SEND_FAILED',\n message: 'SMTP send failed',\n metadata: {\n originalError: error,\n },\n })\n } finally {\n transport.close()\n }\n }\n}\n","import type { StandardSchemaV1 } from '@igniter-js/core'\nimport { IgniterMailError } from '../errors/mail.error'\n\n/**\n * Schema utilities for `@igniter-js/mail`.\n */\nexport class IgniterMailSchema {\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 method returns the input as-is.\n */\n static async validateInput<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\n /**\n * Creates a passthrough StandardSchema validator.\n */\n static 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}\n","import type { IgniterLogger } from \"@igniter-js/core\";\nimport React from \"react\";\nimport { render } from \"@react-email/components\";\nimport { IgniterMailError } from \"../errors/mail.error\";\nimport type { IgniterMailAdapter } from \"../types/adapter\";\nimport type {\n IgniterMailInfer,\n IgniterMailOptions,\n IgniterMailQueueConfig,\n IgniterMailSendParams,\n IIgniterMail,\n} from \"../types/provider\";\nimport type {\n IgniterMailTemplateBuilt,\n IgniterMailTemplateKey,\n IgniterMailTemplatePayload,\n} from \"../types/templates\";\nimport { IgniterMailSchema } from \"../utils/schema\";\nimport type { IgniterTelemetryManager } from \"@igniter-js/telemetry\";\nimport type { IgniterMailTelemetryEvents } from \"../telemetry\";\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 IgniterMailManagerCore<\n TTemplates extends object,\n> implements IIgniterMail<TTemplates> {\n private readonly adapter: IgniterMailAdapter;\n private readonly templates: TTemplates;\n private readonly logger?: IgniterLogger;\n private readonly telemetry?: IgniterTelemetryManager<IgniterMailTelemetryEvents>;\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 {} as unknown as IgniterMailInfer<TTemplates>;\n\n constructor(options: IgniterMailOptions<TTemplates>) {\n const { adapter, templates, logger, telemetry, 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.telemetry = telemetry;\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\n const passthroughSchema = IgniterMailSchema.createPassthroughSchema();\n\n queue.adapter.register({\n name: queueOptions?.job ?? \"send\",\n input: passthroughSchema, \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 queue: { name: queueOptions?.queue ?? \"mail\" },\n handler: async ({ input }) => {\n await this.send(input as any);\n },\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 IgniterMailTemplateBuilt<any>,\n >(\n template: TTemplate,\n data: IgniterMailTemplatePayload<TTemplate>,\n ): Promise<IgniterMailTemplatePayload<TTemplate>> {\n try {\n return (await IgniterMailSchema.validateInput(\n template.schema as any,\n data,\n )) as IgniterMailTemplatePayload<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 IgniterMailTemplateKey<TTemplates>>(\n params: IgniterMailSendParams<TTemplates, TSelectedTemplate>,\n ): Promise<void> {\n const startTime = Date.now();\n\n try {\n this.logger?.debug(\"IgniterMail.send started\", {\n to: params.to,\n template: String(params.template),\n });\n\n this.telemetry?.emit('igniter.mail.send.started', {\n level: \"debug\",\n attributes: {\n \"mail.to\": params.to,\n \"mail.template\": String(params.template),\n \"mail.subject\": params.subject,\n },\n });\n\n await this.onSendStarted(params);\n\n const template = (this.templates as any)[params.template] as\n | IgniterMailTemplateBuilt<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 const durationMs = Date.now() - startTime;\n\n this.telemetry?.emit('igniter.mail.send.success', {\n level: \"info\",\n attributes: {\n \"mail.to\": params.to,\n \"mail.template\": String(params.template),\n \"mail.subject\": params.subject || template.subject,\n \"mail.duration_ms\": durationMs,\n },\n });\n\n this.logger?.info(\"IgniterMail.send success\", {\n to: params.to,\n template: String(params.template),\n durationMs,\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 const durationMs = Date.now() - startTime;\n\n this.telemetry?.emit('igniter.mail.send.error', {\n level: \"error\",\n attributes: {\n \"mail.to\": params.to,\n \"mail.template\": String(params.template),\n \"mail.subject\": params.subject,\n \"mail.error.code\": normalizedError.code,\n \"mail.error.message\": normalizedError.message,\n \"mail.duration_ms\": durationMs,\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 * Requires a queue adapter; otherwise it throws.\n */\n async schedule<TSelectedTemplate extends IgniterMailTemplateKey<TTemplates>>(\n params: IgniterMailSendParams<TTemplates, TSelectedTemplate>,\n date: Date,\n ): Promise<void> {\n const startTime = Date.now();\n\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 const delay = Math.max(0, date.getTime() - Date.now());\n\n this.logger?.debug(\"IgniterMail.schedule started\", {\n to: params.to,\n template: String(params.template),\n scheduledAt: date.toISOString(),\n delayMs: delay,\n });\n\n this.telemetry?.emit('igniter.mail.schedule.started', {\n level: \"debug\",\n attributes: {\n \"mail.to\": params.to,\n \"mail.template\": String(params.template),\n \"mail.scheduled_at\": date.toISOString(),\n \"mail.delay_ms\": delay,\n },\n });\n\n if (!this.queue) {\n throw new IgniterMailError({\n code: \"MAIL_PROVIDER_SCHEDULE_QUEUE_NOT_CONFIGURED\",\n message: \"MAIL_PROVIDER_SCHEDULE_QUEUE_NOT_CONFIGURED\",\n logger: this.logger,\n });\n }\n\n try {\n await this.ensureQueueJobRegistered();\n\n const queue = this.queue.options?.queue ?? \"mail\";\n const job = this.queue.options?.job ?? \"send\";\n const id = `${queue}.${job}`;\n\n this.logger?.info(\"IgniterMail.schedule enqueued\", {\n to: params.to,\n template: String(params.template),\n delay,\n durationMs: Date.now() - startTime,\n });\n\n await this.queue.adapter.invoke({\n id,\n input: params as any,\n delay,\n });\n\n this.telemetry?.emit('igniter.mail.schedule.success', {\n level: \"info\",\n attributes: {\n \"mail.to\": params.to,\n \"mail.template\": String(params.template),\n \"mail.scheduled_at\": date.toISOString(),\n \"mail.delay_ms\": delay,\n \"mail.queue_id\": this.queue.options?.queue ?? \"mail\",\n },\n });\n\n return;\n } catch (error) {\n let normalizedError = error as IgniterMailError;\n\n if (!IgniterMailError.is(error)) {\n normalizedError = 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 scheduledAt: date.toISOString(),\n },\n });\n }\n\n this.telemetry?.emit('igniter.mail.schedule.error', {\n level: \"error\",\n attributes: {\n \"mail.to\": params.to,\n \"mail.template\": String(params.template),\n \"mail.scheduled_at\": date.toISOString(),\n \"mail.error.code\": normalizedError.code,\n \"mail.error.message\": normalizedError.message,\n },\n });\n\n this.logger?.error(\"IgniterMail.schedule failed\", normalizedError);\n throw normalizedError;\n }\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}\n","import type { IgniterJobQueueAdapter, IgniterLogger } from \"@igniter-js/core\";\nimport { PostmarkMailAdapter } from \"../adapters/postmark.adapter\";\nimport { ResendMailAdapter } from \"../adapters/resend.adapter\";\nimport { SendGridMailAdapter } from \"../adapters/sendgrid.adapter\";\nimport { SmtpMailAdapter } from \"../adapters/smtp.adapter\";\nimport { IgniterMailError } from \"../errors/mail.error\";\nimport type { IgniterMailAdapter } from \"../types/adapter\";\nimport type {\n IgniterMailOptions,\n IgniterMailQueueOptions,\n IgniterMailSendParams,\n IIgniterMail,\n} from \"../types/provider\";\nimport type { IgniterMailTemplateBuilt } from \"../types/templates\";\nimport { IgniterMailManagerCore } from \"../core/manager\";\nimport type { IgniterTelemetryManager } from \"@igniter-js/telemetry\";\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 Record<string, IgniterMailTemplateBuilt<any>> = Record<string, IgniterMailTemplateBuilt<any>>,\n> {\n private from?: string;\n private adapter?: IgniterMailAdapter;\n private templates: TTemplates = {} as TTemplates;\n private logger?: IgniterLogger;\n private telemetry?: IgniterTelemetryManager<any>;\n private queue?: {\n adapter: IgniterJobQueueAdapter<any>;\n options?: IgniterMailQueueOptions;\n };\n\n private onSendStartedHandler?: (\n params: IgniterMailSendParams<\n TTemplates,\n any\n >,\n ) => Promise<void>;\n\n private onSendErrorHandler?: (\n params: IgniterMailSendParams<\n TTemplates,\n any\n >,\n error: Error,\n ) => Promise<void>;\n\n private onSendSuccessHandler?: (\n params: IgniterMailSendParams<\n TTemplates,\n any\n >,\n ) => Promise<void>;\n\n private constructor(\n options: IgniterMailOptions<any>,\n ) {\n this.from = options.from;\n this.adapter = options.adapter;\n this.templates = options.templates;\n this.logger = options.logger;\n this.telemetry = options.telemetry;\n this.onSendStartedHandler = options.onSendStarted;\n this.onSendErrorHandler = options.onSendError;\n this.onSendSuccessHandler = options.onSendSuccess;\n if (options.queue) {\n this.queue = {\n adapter: options.queue.adapter,\n options: options.queue.options,\n };\n }\n }\n\n /**\n * Creates a new builder.\n */\n static create() {\n return new IgniterMailBuilder<{}>({ from: '', adapter: {} as any, templates: {} });\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 /** Attaches a telemetry instance for observability. */\n withTelemetry(telemetry: IgniterTelemetryManager<any>) {\n this.telemetry = telemetry;\n return this;\n }\n\n /**\n * Enables queue delivery.\n *\n * When configured, `IgniterMail.schedule()` will enqueue jobs using the queue adapter.\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: IgniterMailAdapter): this;\n withAdapter(provider: string, secret: string): this;\n withAdapter(adapterOrProvider: IgniterMailAdapter | 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 switch (adapterOrProvider) {\n case \"resend\":\n this.adapter = ResendMailAdapter.create({\n secret,\n from: this.from,\n })\n return this\n\n case \"smtp\":\n this.adapter = SmtpMailAdapter.create({\n secret,\n from: this.from,\n })\n return this\n\n case \"postmark\":\n this.adapter = PostmarkMailAdapter.create({\n secret,\n from: this.from,\n })\n return this\n\n case \"sendgrid\":\n this.adapter = SendGridMailAdapter.create({\n secret,\n from: this.from,\n })\n return this\n\n default:\n throw new IgniterMailError({\n code: \"MAIL_PROVIDER_ADAPTER_NOT_FOUND\",\n message: `MAIL_PROVIDER_ADAPTER_NOT_FOUND: ${adapterOrProvider}`,\n logger: this.logger,\n metadata: {\n provider: adapterOrProvider,\n },\n });\n }\n }\n\n this.adapter = adapterOrProvider;\n\n return this;\n }\n\n /**\n * Registers a template.\n */\n addTemplate<TKey extends string, TTemplate extends IgniterMailTemplateBuilt<any>>(\n key: TKey,\n template: TTemplate,\n ) {\n return new IgniterMailBuilder<\n TTemplates & { [K in TKey]: TTemplate }\n >({\n from: this.from!,\n adapter: this.adapter!,\n templates: {\n ...this.templates,\n [key]: template,\n } as TTemplates & { [K in TKey]: TTemplate },\n logger: this.logger,\n telemetry: this.telemetry,\n onSendStarted: this.onSendStartedHandler,\n onSendError: this.onSendErrorHandler,\n onSendSuccess: this.onSendSuccessHandler,\n queue: this.queue\n ? {\n adapter: this.queue.adapter,\n options: this.queue.options,\n }\n : undefined,\n });\n }\n\n /** Hook invoked before sending. */\n onSendStarted(\n handler: (\n params: IgniterMailSendParams<\n Record<string, IgniterMailTemplateBuilt<any>>,\n any\n >,\n ) => Promise<void>,\n ) {\n this.onSendStartedHandler = handler;\n return this;\n }\n\n /** Hook invoked on error. */\n onSendError(\n handler: (\n params: IgniterMailSendParams<\n Record<string, IgniterMailTemplateBuilt<any>>,\n any\n >,\n error: Error,\n ) => Promise<void>,\n ) {\n this.onSendErrorHandler = handler;\n return this;\n }\n\n /** Hook invoked on success. */\n onSendSuccess(\n handler: (\n params: IgniterMailSendParams<\n Record<string, IgniterMailTemplateBuilt<any>>,\n any\n >,\n ) => Promise<void>,\n ) {\n this.onSendSuccessHandler = handler;\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 return new IgniterMailManagerCore<TTemplates>({\n from: this.from,\n adapter: this.adapter,\n templates: this.templates as TTemplates,\n onSendStarted: this.onSendStartedHandler as any,\n onSendError: this.onSendErrorHandler as any,\n onSendSuccess: this.onSendSuccessHandler as any,\n telemetry: this.telemetry,\n logger: this.logger,\n queue: this.queue\n ? {\n adapter: this.queue.adapter,\n options: this.queue.options,\n }\n : undefined,\n });\n }\n}\n\nexport const IgniterMail = IgniterMailBuilder\n","import type { StandardSchemaV1 } from '@igniter-js/core'\nimport type { ReactElement } from 'react'\nimport { IgniterMailError } from '../errors/mail.error'\nimport type { IgniterMailTemplateBuilt } from '../types/templates'\n\n/**\n * Builder for {@link IgniterMailTemplate}.\n */\nexport class IgniterMailTemplateBuilder<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 IgniterMailTemplateBuilder<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 IgniterMailTemplateBuilder<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(): IgniterMailTemplateBuilt<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 IgniterMailTemplateBuilt<TSchema>['render'],\n }\n }\n}\n\nexport const IgniterMailTemplate = IgniterMailTemplateBuilder","import type {\n IgniterMailAdapter,\n IgniterMailAdapterSendParams,\n} from '../types/adapter'\n\n/**\n * In-memory mock adapter for `@igniter-js/mail`.\n *\n * Use this in tests to avoid real provider calls.\n */\nexport class MockMailAdapter implements IgniterMailAdapter {\n /** Creates a new mock adapter instance. */\n static create(): MockMailAdapter {\n return new MockMailAdapter()\n }\n\n /** Tracks all send calls. */\n public readonly sent: IgniterMailAdapterSendParams[] = []\n\n /** Tracks method call counts. */\n public readonly calls = {\n send: 0,\n }\n\n async send(params: IgniterMailAdapterSendParams): Promise<void> {\n this.calls.send += 1\n this.sent.push(params)\n }\n\n /** Clears all tracked state. */\n clear(): void {\n this.sent.length = 0\n this.calls.send = 0\n }\n}\n"]}
1
+ {"version":3,"sources":["../src/errors/mail.error.ts","../src/adapters/postmark.adapter.ts","../src/adapters/resend.adapter.ts","../src/adapters/sendgrid.adapter.ts","../src/adapters/smtp.adapter.ts","../src/utils/schema.ts","../src/core/manager.tsx","../src/builders/main.builder.ts","../src/builders/template.builder.ts","../src/adapters/mock.adapter.ts"],"names":["IgniterError","resend","Resend","nodemailer","render","React"],"mappings":"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","file":"index.js","sourcesContent":["import { IgniterError, type IgniterLogger } from \"@igniter-js/common\";\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_TEMPLATE_LIST_FAILED'\n | 'MAIL_PROVIDER_TEMPLATE_GET_FAILED'\n | 'MAIL_PROVIDER_TEMPLATE_RENDER_FAILED'\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 | 'MAIL_PROVIDER_SCHEDULE_QUEUE_NOT_CONFIGURED'\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","import { IgniterMailError } from '../errors/mail.error'\nimport type {\n IgniterMailAdapter,\n IgniterMailAdapterCredentials,\n IgniterMailAdapterSendParams,\n} from '../types/adapter'\n\n/**\n * Postmark adapter.\n *\n * Notes:\n * - This implementation uses `fetch` (no SDK dependency).\n * - Designed to be extracted to `@igniter-js/mail/adapters/postmark`.\n *\n * @example\n * ```ts\n * const adapter = PostmarkMailAdapter.create({\n * secret: process.env.POSTMARK_SERVER_TOKEN,\n * from: 'no-reply@example.com',\n * })\n * await adapter.send({ to: 'user@example.com', subject: 'Hello', html: '<p>Hi</p>', text: 'Hi' })\n * ```\n */\nexport class PostmarkMailAdapter implements IgniterMailAdapter {\n /**\n * Creates a new adapter instance.\n *\n * @param credentials - Provider credentials (secret/from).\n * @returns A Postmark adapter instance.\n * @throws {IgniterMailError} Does not throw on creation; errors surface on send.\n * @example\n * ```ts\n * const adapter = PostmarkMailAdapter.create({ secret: 'token', from: 'no-reply@acme.com' })\n * ```\n */\n static create(credentials: IgniterMailAdapterCredentials) {\n return new PostmarkMailAdapter(credentials)\n }\n\n /**\n * Creates a new adapter instance.\n *\n * @param credentials - Provider credentials (secret/from).\n * @throws {IgniterMailError} Does not throw on creation; errors surface on send.\n */\n constructor(private readonly credentials: IgniterMailAdapterCredentials = {}) {}\n\n /**\n * Sends an email using Postmark (HTTP API).\n *\n * @param params - Normalized email parameters.\n * @returns A promise that resolves when the email is accepted.\n * @throws {IgniterMailError} When configuration is invalid or Postmark rejects the request.\n * @example\n * ```ts\n * await adapter.send({ to: 'user@example.com', subject: 'Hello', html: '<p>Hi</p>', text: 'Hi' })\n * ```\n */\n async send(params: IgniterMailAdapterSendParams) {\n if (!this.credentials.secret) {\n throw new IgniterMailError({\n code: 'MAIL_ADAPTER_CONFIGURATION_INVALID',\n message: 'Postmark adapter secret is required',\n })\n }\n\n if (!this.credentials.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.credentials.secret\n const from = this.credentials.from\n\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: params.to,\n Subject: params.subject,\n HtmlBody: params.html,\n TextBody: params.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}","import { Resend } from 'resend'\n\nimport { IgniterMailError } from '../errors/mail.error'\nimport type {\n IgniterMailAdapter,\n IgniterMailAdapterCredentials,\n IgniterMailAdapterSendParams,\n} from '../types/adapter'\n\n/**\n * Resend adapter implementation.\n *\n * Notes:\n * - Uses the Resend SDK.\n * - Designed to be extracted to `@igniter-js/mail/adapters/resend`.\n *\n * @example\n * ```ts\n * const adapter = ResendMailAdapter.create({\n * secret: process.env.RESEND_API_KEY,\n * from: 'no-reply@example.com',\n * })\n * await adapter.send({ to: 'user@example.com', subject: 'Hi', html: '<p>Hi</p>', text: 'Hi' })\n * ```\n */\nexport class ResendMailAdapter implements IgniterMailAdapter {\n /**\n * Creates a new adapter instance.\n *\n * @param credentials - Adapter credentials including API secret and default from.\n * @returns A configured Resend adapter.\n * @throws {IgniterMailError} Does not throw on creation; errors surface on send.\n * @example\n * ```ts\n * const adapter = ResendMailAdapter.create({ secret: 'token', from: 'no-reply@acme.com' })\n * ```\n */\n static create(credentials: IgniterMailAdapterCredentials) {\n return new ResendMailAdapter(credentials)\n }\n\n /**\n * Creates an adapter with credentials.\n *\n * @param credentials - Adapter credentials including API secret and default from.\n * @throws {IgniterMailError} Does not throw on creation; errors surface on send.\n */\n constructor(private readonly credentials: IgniterMailAdapterCredentials = {}) {}\n\n /**\n * Sends an email using Resend.\n *\n * @param params - Email payload to send.\n * @returns Resolves when the email is accepted by Resend.\n * @throws {IgniterMailError} When credentials are missing or Resend rejects the request.\n *\n * @example\n * ```ts\n * await adapter.send({ to: 'user@example.com', subject: 'Welcome', html: '<p>Hi</p>', text: 'Hi' })\n * ```\n */\n async send(params: IgniterMailAdapterSendParams): Promise<void> {\n if (!this.credentials.secret) {\n throw new IgniterMailError({\n code: 'MAIL_ADAPTER_CONFIGURATION_INVALID',\n message: 'Resend adapter secret is required',\n })\n }\n\n if (!this.credentials.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.credentials.secret)\n const from = this.credentials.from\n\n await resend.emails.create({\n to: params.to,\n from,\n subject: params.subject,\n html: params.html,\n text: params.text,\n scheduledAt: params.scheduledAt?.toISOString(),\n })\n }\n}\n","import { IgniterMailError } from '../errors/mail.error'\nimport type {\n IgniterMailAdapter,\n IgniterMailAdapterCredentials,\n IgniterMailAdapterSendParams,\n} from '../types/adapter'\n\n/**\n * SendGrid adapter implementation.\n *\n * Notes:\n * - This implementation uses `fetch` (no SDK dependency).\n * - Designed to be extracted to `@igniter-js/mail/adapters/sendgrid`.\n *\n * @example\n * ```ts\n * const adapter = SendGridMailAdapter.create({\n * secret: process.env.SENDGRID_API_KEY,\n * from: 'no-reply@example.com',\n * })\n * await adapter.send({ to: 'user@example.com', subject: 'Hello', html: '<p>Hi</p>', text: 'Hi' })\n * ```\n */\nexport class SendGridMailAdapter implements IgniterMailAdapter {\n /**\n * Creates a new adapter instance.\n *\n * @param credentials - Adapter credentials including API secret and default from.\n * @returns A configured SendGrid adapter.\n * @throws {IgniterMailError} Does not throw on creation; errors surface on send.\n * @example\n * ```ts\n * const adapter = SendGridMailAdapter.create({ secret: 'token', from: 'no-reply@acme.com' })\n * ```\n */\n static create(credentials: IgniterMailAdapterCredentials) {\n return new SendGridMailAdapter(credentials)\n }\n\n /**\n * Creates an adapter with credentials.\n *\n * @param credentials - Adapter credentials including API secret and default from.\n * @throws {IgniterMailError} Does not throw on creation; errors surface on send.\n */\n constructor(private readonly credentials: IgniterMailAdapterCredentials = {}) {}\n\n /**\n * Sends an email using SendGrid (HTTP API).\n *\n * @param params - Email payload to send.\n * @returns Resolves when the email is accepted by SendGrid.\n * @throws {IgniterMailError} When credentials are missing or the API fails.\n *\n * @example\n * ```ts\n * await adapter.send({ to: 'user@example.com', subject: 'Hi', html: '<p>Hi</p>', text: 'Hi' })\n * ```\n */\n async send(params: IgniterMailAdapterSendParams): Promise<void> {\n if (!this.credentials.secret) {\n throw new IgniterMailError({\n code: 'MAIL_ADAPTER_CONFIGURATION_INVALID',\n message: 'SendGrid adapter secret is required',\n })\n }\n\n if (!this.credentials.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.credentials.secret\n const from = this.credentials.from\n\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 {\n to: [{ email: params.to }],\n },\n ],\n from: { email: from },\n subject: params.subject,\n content: [\n { type: 'text/plain', value: params.text },\n { type: 'text/html', value: params.html },\n ],\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: 'SendGrid send failed',\n metadata: {\n status: response.status,\n body,\n },\n })\n }\n }\n}\n","import nodemailer from 'nodemailer'\n\nimport { IgniterMailError } from '../errors/mail.error'\nimport type {\n IgniterMailAdapter,\n IgniterMailAdapterCredentials,\n IgniterMailAdapterSendParams,\n} from '../types/adapter'\n\n/**\n * SMTP adapter implementation.\n *\n * Notes:\n * - Uses Nodemailer.\n * - `credentials.secret` must be an SMTP connection URL.\n *\n * @example\n * ```ts\n * const adapter = SmtpMailAdapter.create({\n * secret: 'smtps://user:pass@host:465',\n * from: 'no-reply@example.com',\n * })\n * await adapter.send({ to: 'user@example.com', subject: 'Hi', html: '<p>Hi</p>', text: 'Hi' })\n * ```\n */\nexport class SmtpMailAdapter implements IgniterMailAdapter {\n /**\n * Creates a new adapter instance.\n *\n * @param credentials - Adapter credentials including SMTP URL and default from.\n * @returns A configured SMTP adapter.\n * @throws {IgniterMailError} Does not throw on creation; errors surface on send.\n * @example\n * ```ts\n * const adapter = SmtpMailAdapter.create({ secret: 'smtps://user:pass@host:465', from: 'no-reply@acme.com' })\n * ```\n */\n static create(credentials: IgniterMailAdapterCredentials) {\n return new SmtpMailAdapter(credentials)\n }\n\n /**\n * Creates an adapter with credentials.\n *\n * @param credentials - Adapter credentials including SMTP URL and default from.\n * @throws {IgniterMailError} Does not throw on creation; errors surface on send.\n */\n constructor(private readonly credentials: IgniterMailAdapterCredentials = {}) {}\n\n /**\n * Sends an email using Nodemailer over SMTP.\n *\n * @param params - Email payload to send.\n * @returns Resolves when the email is sent.\n * @throws {IgniterMailError} When credentials are missing or the SMTP send fails.\n *\n * @example\n * ```ts\n * await adapter.send({ to: 'user@example.com', subject: 'Hi', html: '<p>Hi</p>', text: 'Hi' })\n * ```\n */\n async send(params: IgniterMailAdapterSendParams): Promise<void> {\n if (!this.credentials.secret) {\n throw new IgniterMailError({\n code: 'MAIL_ADAPTER_CONFIGURATION_INVALID',\n message: 'SMTP adapter secret is required',\n })\n }\n\n if (!this.credentials.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.credentials.secret\n const from = this.credentials.from\n\n const transport = nodemailer.createTransport(smtpUrl, {\n connectionTimeout: 10000,\n greetingTimeout: 5000,\n socketTimeout: 10000,\n tls: {\n rejectUnauthorized: false,\n },\n })\n\n try {\n await transport.sendMail({\n from,\n to: params.to,\n subject: params.subject,\n html: params.html,\n text: params.text,\n })\n } catch(error) {\n throw new IgniterMailError({\n code: 'MAIL_PROVIDER_SEND_FAILED',\n message: 'SMTP send failed',\n metadata: {\n originalError: error,\n },\n })\n } finally {\n transport.close()\n }\n }\n}\n","import type { StandardSchemaV1 } from \"@igniter-js/common\";\nimport { IgniterMailError } from '../errors/mail.error'\n\n/**\n * Schema utilities for `@igniter-js/mail`.\n */\nexport class IgniterMailSchema {\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 method returns the input as-is.\n */\n static async validateInput<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\n /**\n * Creates a passthrough StandardSchema validator.\n */\n static 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}\n","import type { IgniterLogger } from \"@igniter-js/common\";\nimport React from \"react\";\nimport { render } from \"@react-email/components\";\nimport { IgniterMailError } from \"../errors/mail.error\";\nimport type { IgniterMailAdapter } from \"../types/adapter\";\nimport type {\n IgniterMailInfer,\n IgniterMailOptions,\n IgniterMailQueueConfig,\n IgniterMailSendParams,\n IIgniterMail,\n IgniterMailTemplatesAPI,\n} from \"../types/provider\";\nimport type {\n IgniterMailTemplateBuilt,\n IgniterMailTemplateKey,\n IgniterMailTemplateMeta,\n IgniterMailTemplatePayload,\n} from \"../types/templates\";\nimport { IgniterMailSchema } from \"../utils/schema\";\nimport type { IgniterTelemetryManager } from \"@igniter-js/telemetry\";\nimport type { IgniterMailTelemetryEvents } from \"../telemetry\";\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 IgniterMailManagerCore<\n TTemplates extends object,\n> implements IIgniterMail<TTemplates> {\n private readonly adapter: IgniterMailAdapter;\n private readonly templateRegistry: TTemplates;\n private readonly logger?: IgniterLogger;\n private readonly telemetry?: IgniterTelemetryManager<IgniterMailTelemetryEvents>;\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 {} as unknown as IgniterMailInfer<TTemplates>;\n\n /**\n * Template registry helpers.\n */\n public readonly templates: IgniterMailTemplatesAPI<TTemplates>;\n\n constructor(options: IgniterMailOptions<TTemplates>) {\n const { adapter, templates, logger, telemetry, 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.templateRegistry = templates;\n this.logger = logger;\n this.telemetry = telemetry;\n this.queue = queue;\n this.options = rest;\n\n this.templates = {\n list: async () => this.listTemplates(),\n get: async (id) => this.getTemplate(id),\n render: async (id, variables) => this.renderTemplate(id, variables),\n };\n }\n\n private buildTemplateMeta(\n key: string,\n template: IgniterMailTemplateBuilt<any>,\n ): IgniterMailTemplateMeta {\n const now = new Date().toISOString();\n return {\n id: key,\n name: template.name ?? key,\n description: template.description ?? `Template ${key}`,\n path: template.path ?? `mail/${key}`,\n subject: template.subject,\n createdAt: template.createdAt ?? now,\n updatedAt: template.updatedAt ?? now,\n variables: template.variables,\n };\n }\n\n private async listTemplates(): Promise<IgniterMailTemplateMeta[]> {\n const startTime = Date.now();\n\n this.logger?.debug(\"IgniterMail.templates.list started\");\n this.telemetry?.emit('igniter.mail.templates.list.started', {\n level: \"debug\",\n attributes: {},\n });\n\n try {\n const results = Object.entries(this.templateRegistry as any).map(\n ([key, template]) =>\n this.buildTemplateMeta(\n key,\n template as IgniterMailTemplateBuilt<any>,\n ),\n );\n\n this.telemetry?.emit('igniter.mail.templates.list.success', {\n level: \"info\",\n attributes: {\n \"ctx.mail.template.count\": results.length,\n \"ctx.mail.duration_ms\": Date.now() - startTime,\n },\n });\n\n this.logger?.info(\"IgniterMail.templates.list success\", {\n count: results.length,\n durationMs: Date.now() - startTime,\n });\n\n return results;\n } catch (error) {\n const normalizedError = IgniterMailError.is(error)\n ? error\n : new IgniterMailError({\n code: \"MAIL_PROVIDER_TEMPLATE_LIST_FAILED\",\n message: \"MAIL_PROVIDER_TEMPLATE_LIST_FAILED\",\n cause: error,\n logger: this.logger,\n });\n\n this.telemetry?.emit('igniter.mail.templates.list.error', {\n level: \"error\",\n attributes: {\n \"ctx.mail.error.code\": normalizedError.code,\n \"ctx.mail.error.message\": normalizedError.message,\n \"ctx.mail.duration_ms\": Date.now() - startTime,\n },\n });\n\n this.logger?.error(\"IgniterMail.templates.list failed\", normalizedError);\n throw normalizedError;\n }\n }\n\n private async getTemplate<\n TSelectedTemplate extends IgniterMailTemplateKey<TTemplates>,\n >(\n id: TSelectedTemplate,\n ): Promise<IgniterMailTemplateMeta | null> {\n const startTime = Date.now();\n\n this.logger?.debug(\"IgniterMail.templates.get started\", {\n template: String(id),\n });\n this.telemetry?.emit('igniter.mail.templates.get.started', {\n level: \"debug\",\n attributes: {\n \"ctx.mail.template_id\": String(id),\n },\n });\n\n try {\n const template = (this.templateRegistry as any)[id] as\n | IgniterMailTemplateBuilt<any>\n | undefined;\n\n if (!template) {\n this.telemetry?.emit('igniter.mail.templates.get.success', {\n level: \"info\",\n attributes: {\n \"ctx.mail.template_id\": String(id),\n \"ctx.mail.duration_ms\": Date.now() - startTime,\n },\n });\n return null;\n }\n\n const result = this.buildTemplateMeta(String(id), template);\n\n this.telemetry?.emit('igniter.mail.templates.get.success', {\n level: \"info\",\n attributes: {\n \"ctx.mail.template_id\": String(id),\n \"ctx.mail.duration_ms\": Date.now() - startTime,\n },\n });\n\n return result;\n } catch (error) {\n const normalizedError = IgniterMailError.is(error)\n ? error\n : new IgniterMailError({\n code: \"MAIL_PROVIDER_TEMPLATE_GET_FAILED\",\n message: \"MAIL_PROVIDER_TEMPLATE_GET_FAILED\",\n cause: error,\n logger: this.logger,\n metadata: { template: String(id) },\n });\n\n this.telemetry?.emit('igniter.mail.templates.get.error', {\n level: \"error\",\n attributes: {\n \"ctx.mail.template_id\": String(id),\n \"ctx.mail.error.code\": normalizedError.code,\n \"ctx.mail.error.message\": normalizedError.message,\n \"ctx.mail.duration_ms\": Date.now() - startTime,\n },\n });\n\n this.logger?.error(\"IgniterMail.templates.get failed\", normalizedError);\n throw normalizedError;\n }\n }\n\n private async renderTemplate<\n TSelectedTemplate extends IgniterMailTemplateKey<TTemplates>,\n >(\n id: TSelectedTemplate,\n variables?: IgniterMailTemplatePayload<TTemplates[TSelectedTemplate]>,\n ): Promise<{ html: string; text: string }> {\n const startTime = Date.now();\n\n this.logger?.debug(\"IgniterMail.templates.render started\", {\n template: String(id),\n });\n this.telemetry?.emit('igniter.mail.templates.render.started', {\n level: \"debug\",\n attributes: {\n \"ctx.mail.template_id\": String(id),\n },\n });\n\n try {\n const template = (this.templateRegistry as any)[id] as\n | IgniterMailTemplateBuilt<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: { template: String(id) },\n });\n }\n\n const validatedData = await this.validateTemplateData(\n template,\n (variables ?? {}) as IgniterMailTemplatePayload<typeof template>,\n );\n const MailTemplate = template.render;\n\n const html = await render(\n <MailTemplate {...(validatedData as any)} />,\n );\n const text = await render(\n <MailTemplate {...(validatedData as any)} />,\n { plainText: true },\n );\n\n this.telemetry?.emit('igniter.mail.templates.render.success', {\n level: \"info\",\n attributes: {\n \"ctx.mail.template_id\": String(id),\n \"ctx.mail.duration_ms\": Date.now() - startTime,\n },\n });\n\n this.logger?.info(\"IgniterMail.templates.render success\", {\n template: String(id),\n durationMs: Date.now() - startTime,\n });\n\n return { html, text };\n } catch (error) {\n const normalizedError = IgniterMailError.is(error)\n ? error\n : new IgniterMailError({\n code: \"MAIL_PROVIDER_TEMPLATE_RENDER_FAILED\",\n message: \"MAIL_PROVIDER_TEMPLATE_RENDER_FAILED\",\n cause: error,\n logger: this.logger,\n metadata: { template: String(id) },\n });\n\n this.telemetry?.emit('igniter.mail.templates.render.error', {\n level: \"error\",\n attributes: {\n \"ctx.mail.template_id\": String(id),\n \"ctx.mail.error.code\": normalizedError.code,\n \"ctx.mail.error.message\": normalizedError.message,\n \"ctx.mail.duration_ms\": Date.now() - startTime,\n },\n });\n\n this.logger?.error(\"IgniterMail.templates.render failed\", normalizedError);\n throw normalizedError;\n }\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\n const passthroughSchema = IgniterMailSchema.createPassthroughSchema();\n\n queue.adapter.register({\n name: queueOptions?.job ?? \"send\",\n input: passthroughSchema, \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 queue: { name: queueOptions?.queue ?? \"mail\" },\n handler: async ({ input }) => {\n await this.send(input as any);\n },\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 IgniterMailTemplateBuilt<any>,\n >(\n template: TTemplate,\n data: IgniterMailTemplatePayload<TTemplate>,\n ): Promise<IgniterMailTemplatePayload<TTemplate>> {\n try {\n return (await IgniterMailSchema.validateInput(\n template.schema as any,\n data,\n )) as IgniterMailTemplatePayload<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 IgniterMailTemplateKey<TTemplates>>(\n params: IgniterMailSendParams<TTemplates, TSelectedTemplate>,\n ): Promise<void> {\n const startTime = Date.now();\n\n try {\n this.logger?.debug(\"IgniterMail.send started\", {\n to: params.to,\n template: String(params.template),\n });\n\n this.telemetry?.emit('igniter.mail.send.started', {\n level: \"debug\",\n attributes: {\n \"mail.to\": params.to,\n \"mail.template\": String(params.template),\n \"mail.subject\": params.subject,\n },\n });\n\n await this.onSendStarted(params);\n\n const template = (this.templateRegistry as any)[params.template] as\n | IgniterMailTemplateBuilt<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 const durationMs = Date.now() - startTime;\n\n this.telemetry?.emit('igniter.mail.send.success', {\n level: \"info\",\n attributes: {\n \"mail.to\": params.to,\n \"mail.template\": String(params.template),\n \"mail.subject\": params.subject || template.subject,\n \"mail.duration_ms\": durationMs,\n },\n });\n\n this.logger?.info(\"IgniterMail.send success\", {\n to: params.to,\n template: String(params.template),\n durationMs,\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 const durationMs = Date.now() - startTime;\n\n this.telemetry?.emit('igniter.mail.send.error', {\n level: \"error\",\n attributes: {\n \"mail.to\": params.to,\n \"mail.template\": String(params.template),\n \"mail.subject\": params.subject,\n \"mail.error.code\": normalizedError.code,\n \"mail.error.message\": normalizedError.message,\n \"mail.duration_ms\": durationMs,\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 * Requires a queue adapter; otherwise it throws.\n */\n async schedule<TSelectedTemplate extends IgniterMailTemplateKey<TTemplates>>(\n params: IgniterMailSendParams<TTemplates, TSelectedTemplate>,\n date: Date,\n ): Promise<void> {\n const startTime = Date.now();\n\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 const delay = Math.max(0, date.getTime() - Date.now());\n\n this.logger?.debug(\"IgniterMail.schedule started\", {\n to: params.to,\n template: String(params.template),\n scheduledAt: date.toISOString(),\n delayMs: delay,\n });\n\n this.telemetry?.emit('igniter.mail.schedule.started', {\n level: \"debug\",\n attributes: {\n \"mail.to\": params.to,\n \"mail.template\": String(params.template),\n \"mail.scheduled_at\": date.toISOString(),\n \"mail.delay_ms\": delay,\n },\n });\n\n if (!this.queue) {\n throw new IgniterMailError({\n code: \"MAIL_PROVIDER_SCHEDULE_QUEUE_NOT_CONFIGURED\",\n message: \"MAIL_PROVIDER_SCHEDULE_QUEUE_NOT_CONFIGURED\",\n logger: this.logger,\n });\n }\n\n try {\n await this.ensureQueueJobRegistered();\n\n const queue = this.queue.options?.queue ?? \"mail\";\n const job = this.queue.options?.job ?? \"send\";\n const id = `${queue}.${job}`;\n\n this.logger?.info(\"IgniterMail.schedule enqueued\", {\n to: params.to,\n template: String(params.template),\n delay,\n durationMs: Date.now() - startTime,\n });\n\n await this.queue.adapter.invoke({\n id,\n input: params as any,\n delay,\n });\n\n this.telemetry?.emit('igniter.mail.schedule.success', {\n level: \"info\",\n attributes: {\n \"mail.to\": params.to,\n \"mail.template\": String(params.template),\n \"mail.scheduled_at\": date.toISOString(),\n \"mail.delay_ms\": delay,\n \"mail.queue_id\": this.queue.options?.queue ?? \"mail\",\n },\n });\n\n return;\n } catch (error) {\n let normalizedError = error as IgniterMailError;\n\n if (!IgniterMailError.is(error)) {\n normalizedError = 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 scheduledAt: date.toISOString(),\n },\n });\n }\n\n this.telemetry?.emit('igniter.mail.schedule.error', {\n level: \"error\",\n attributes: {\n \"mail.to\": params.to,\n \"mail.template\": String(params.template),\n \"mail.scheduled_at\": date.toISOString(),\n \"mail.error.code\": normalizedError.code,\n \"mail.error.message\": normalizedError.message,\n },\n });\n\n this.logger?.error(\"IgniterMail.schedule failed\", normalizedError);\n throw normalizedError;\n }\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}\n","import type { IgniterLogger } from \"@igniter-js/common\";\nimport type { IgniterJobQueueAdapter } from \"@igniter-js/core\";\nimport { PostmarkMailAdapter } from \"../adapters/postmark.adapter\";\nimport { ResendMailAdapter } from \"../adapters/resend.adapter\";\nimport { SendGridMailAdapter } from \"../adapters/sendgrid.adapter\";\nimport { SmtpMailAdapter } from \"../adapters/smtp.adapter\";\nimport { IgniterMailError } from \"../errors/mail.error\";\nimport type { IgniterMailAdapter } from \"../types/adapter\";\nimport type {\n IgniterMailOptions,\n IgniterMailQueueOptions,\n IgniterMailSendParams,\n IIgniterMail,\n} from \"../types/provider\";\nimport type { IgniterMailTemplateBuilt } from \"../types/templates\";\nimport { IgniterMailManagerCore } from \"../core/manager\";\nimport type { IgniterTelemetryManager } from \"@igniter-js/telemetry\";\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 Record<string, IgniterMailTemplateBuilt<any>> = Record<string, IgniterMailTemplateBuilt<any>>,\n> {\n private from?: string;\n private adapter?: IgniterMailAdapter;\n private templates: TTemplates = {} as TTemplates;\n private logger?: IgniterLogger;\n private telemetry?: IgniterTelemetryManager<any>;\n private queue?: {\n adapter: IgniterJobQueueAdapter<any>;\n options?: IgniterMailQueueOptions;\n };\n\n private onSendStartedHandler?: (\n params: IgniterMailSendParams<\n TTemplates,\n any\n >,\n ) => Promise<void>;\n\n private onSendErrorHandler?: (\n params: IgniterMailSendParams<\n TTemplates,\n any\n >,\n error: Error,\n ) => Promise<void>;\n\n private onSendSuccessHandler?: (\n params: IgniterMailSendParams<\n TTemplates,\n any\n >,\n ) => Promise<void>;\n\n private constructor(\n options: IgniterMailOptions<any>,\n ) {\n this.from = options.from;\n this.adapter = options.adapter;\n this.templates = options.templates;\n this.logger = options.logger;\n this.telemetry = options.telemetry;\n this.onSendStartedHandler = options.onSendStarted;\n this.onSendErrorHandler = options.onSendError;\n this.onSendSuccessHandler = options.onSendSuccess;\n if (options.queue) {\n this.queue = {\n adapter: options.queue.adapter,\n options: options.queue.options,\n };\n }\n }\n\n /**\n * Creates a new builder.\n */\n static create() {\n return new IgniterMailBuilder<{}>({ from: '', adapter: {} as any, templates: {} });\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 /** Attaches a telemetry instance for observability. */\n withTelemetry(telemetry: IgniterTelemetryManager<any>) {\n this.telemetry = telemetry;\n return this;\n }\n\n /**\n * Enables queue delivery.\n *\n * When configured, `IgniterMail.schedule()` will enqueue jobs using the queue adapter.\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: IgniterMailAdapter): this;\n withAdapter(provider: string, secret: string): this;\n withAdapter(adapterOrProvider: IgniterMailAdapter | 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 switch (adapterOrProvider) {\n case \"resend\":\n this.adapter = ResendMailAdapter.create({\n secret,\n from: this.from,\n })\n return this\n\n case \"smtp\":\n this.adapter = SmtpMailAdapter.create({\n secret,\n from: this.from,\n })\n return this\n\n case \"postmark\":\n this.adapter = PostmarkMailAdapter.create({\n secret,\n from: this.from,\n })\n return this\n\n case \"sendgrid\":\n this.adapter = SendGridMailAdapter.create({\n secret,\n from: this.from,\n })\n return this\n\n default:\n throw new IgniterMailError({\n code: \"MAIL_PROVIDER_ADAPTER_NOT_FOUND\",\n message: `MAIL_PROVIDER_ADAPTER_NOT_FOUND: ${adapterOrProvider}`,\n logger: this.logger,\n metadata: {\n provider: adapterOrProvider,\n },\n });\n }\n }\n\n this.adapter = adapterOrProvider;\n\n return this;\n }\n\n /**\n * Registers a template.\n */\n addTemplate<TKey extends string, TTemplate extends IgniterMailTemplateBuilt<any>>(\n key: TKey,\n template: TTemplate,\n ) {\n return new IgniterMailBuilder<\n TTemplates & { [K in TKey]: TTemplate }\n >({\n from: this.from!,\n adapter: this.adapter!,\n templates: {\n ...this.templates,\n [key]: template,\n } as TTemplates & { [K in TKey]: TTemplate },\n logger: this.logger,\n telemetry: this.telemetry,\n onSendStarted: this.onSendStartedHandler,\n onSendError: this.onSendErrorHandler,\n onSendSuccess: this.onSendSuccessHandler,\n queue: this.queue\n ? {\n adapter: this.queue.adapter,\n options: this.queue.options,\n }\n : undefined,\n });\n }\n\n /** Hook invoked before sending. */\n onSendStarted(\n handler: (\n params: IgniterMailSendParams<\n Record<string, IgniterMailTemplateBuilt<any>>,\n any\n >,\n ) => Promise<void>,\n ) {\n this.onSendStartedHandler = handler;\n return this;\n }\n\n /** Hook invoked on error. */\n onSendError(\n handler: (\n params: IgniterMailSendParams<\n Record<string, IgniterMailTemplateBuilt<any>>,\n any\n >,\n error: Error,\n ) => Promise<void>,\n ) {\n this.onSendErrorHandler = handler;\n return this;\n }\n\n /** Hook invoked on success. */\n onSendSuccess(\n handler: (\n params: IgniterMailSendParams<\n Record<string, IgniterMailTemplateBuilt<any>>,\n any\n >,\n ) => Promise<void>,\n ) {\n this.onSendSuccessHandler = handler;\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 return new IgniterMailManagerCore<TTemplates>({\n from: this.from,\n adapter: this.adapter,\n templates: this.templates as TTemplates,\n onSendStarted: this.onSendStartedHandler as any,\n onSendError: this.onSendErrorHandler as any,\n onSendSuccess: this.onSendSuccessHandler as any,\n telemetry: this.telemetry,\n logger: this.logger,\n queue: this.queue\n ? {\n adapter: this.queue.adapter,\n options: this.queue.options,\n }\n : undefined,\n });\n }\n}\n\nexport const IgniterMail = IgniterMailBuilder\n","import type { StandardSchemaV1 } from \"@igniter-js/common\";\nimport type { ReactElement } from 'react'\nimport { IgniterMailError } from '../errors/mail.error'\nimport type { IgniterMailTemplateBuilt } from '../types/templates'\n\n/**\n * Builder for {@link IgniterMailTemplate}.\n */\nexport class IgniterMailTemplateBuilder<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 IgniterMailTemplateBuilder<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 IgniterMailTemplateBuilder<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(): IgniterMailTemplateBuilt<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 IgniterMailTemplateBuilt<TSchema>['render'],\n }\n }\n}\n\nexport const IgniterMailTemplate = IgniterMailTemplateBuilder","import type {\n IgniterMailAdapter,\n IgniterMailAdapterSendParams,\n} from '../types/adapter'\n\n/**\n * In-memory mock adapter for `@igniter-js/mail`.\n *\n * Use this in tests to avoid real provider calls.\n */\nexport class MockMailAdapter implements IgniterMailAdapter {\n /** Creates a new mock adapter instance. */\n static create(): MockMailAdapter {\n return new MockMailAdapter()\n }\n\n /** Tracks all send calls. */\n public readonly sent: IgniterMailAdapterSendParams[] = []\n\n /** Tracks method call counts. */\n public readonly calls = {\n send: 0,\n }\n\n async send(params: IgniterMailAdapterSendParams): Promise<void> {\n this.calls.send += 1\n this.sent.push(params)\n }\n\n /** Clears all tracked state. */\n clear(): void {\n this.sent.length = 0\n this.calls.send = 0\n }\n}\n"]}
package/dist/index.mjs CHANGED
@@ -1,4 +1,4 @@
1
- import { IgniterError } from '@igniter-js/core';
1
+ import { IgniterError } from '@igniter-js/common';
2
2
  import { Resend } from 'resend';
3
3
  import nodemailer from 'nodemailer';
4
4
  import React from 'react';
@@ -395,11 +395,193 @@ var IgniterMailManagerCore = class {
395
395
  });
396
396
  }
397
397
  this.adapter = adapter;
398
- this.templates = templates;
398
+ this.templateRegistry = templates;
399
399
  this.logger = logger;
400
400
  this.telemetry = telemetry;
401
401
  this.queue = queue;
402
402
  this.options = rest;
403
+ this.templates = {
404
+ list: async () => this.listTemplates(),
405
+ get: async (id) => this.getTemplate(id),
406
+ render: async (id, variables) => this.renderTemplate(id, variables)
407
+ };
408
+ }
409
+ buildTemplateMeta(key, template) {
410
+ const now = (/* @__PURE__ */ new Date()).toISOString();
411
+ return {
412
+ id: key,
413
+ name: template.name ?? key,
414
+ description: template.description ?? `Template ${key}`,
415
+ path: template.path ?? `mail/${key}`,
416
+ subject: template.subject,
417
+ createdAt: template.createdAt ?? now,
418
+ updatedAt: template.updatedAt ?? now,
419
+ variables: template.variables
420
+ };
421
+ }
422
+ async listTemplates() {
423
+ const startTime = Date.now();
424
+ this.logger?.debug("IgniterMail.templates.list started");
425
+ this.telemetry?.emit("igniter.mail.templates.list.started", {
426
+ level: "debug",
427
+ attributes: {}
428
+ });
429
+ try {
430
+ const results = Object.entries(this.templateRegistry).map(
431
+ ([key, template]) => this.buildTemplateMeta(
432
+ key,
433
+ template
434
+ )
435
+ );
436
+ this.telemetry?.emit("igniter.mail.templates.list.success", {
437
+ level: "info",
438
+ attributes: {
439
+ "ctx.mail.template.count": results.length,
440
+ "ctx.mail.duration_ms": Date.now() - startTime
441
+ }
442
+ });
443
+ this.logger?.info("IgniterMail.templates.list success", {
444
+ count: results.length,
445
+ durationMs: Date.now() - startTime
446
+ });
447
+ return results;
448
+ } catch (error) {
449
+ const normalizedError = IgniterMailError.is(error) ? error : new IgniterMailError({
450
+ code: "MAIL_PROVIDER_TEMPLATE_LIST_FAILED",
451
+ message: "MAIL_PROVIDER_TEMPLATE_LIST_FAILED",
452
+ cause: error,
453
+ logger: this.logger
454
+ });
455
+ this.telemetry?.emit("igniter.mail.templates.list.error", {
456
+ level: "error",
457
+ attributes: {
458
+ "ctx.mail.error.code": normalizedError.code,
459
+ "ctx.mail.error.message": normalizedError.message,
460
+ "ctx.mail.duration_ms": Date.now() - startTime
461
+ }
462
+ });
463
+ this.logger?.error("IgniterMail.templates.list failed", normalizedError);
464
+ throw normalizedError;
465
+ }
466
+ }
467
+ async getTemplate(id) {
468
+ const startTime = Date.now();
469
+ this.logger?.debug("IgniterMail.templates.get started", {
470
+ template: String(id)
471
+ });
472
+ this.telemetry?.emit("igniter.mail.templates.get.started", {
473
+ level: "debug",
474
+ attributes: {
475
+ "ctx.mail.template_id": String(id)
476
+ }
477
+ });
478
+ try {
479
+ const template = this.templateRegistry[id];
480
+ if (!template) {
481
+ this.telemetry?.emit("igniter.mail.templates.get.success", {
482
+ level: "info",
483
+ attributes: {
484
+ "ctx.mail.template_id": String(id),
485
+ "ctx.mail.duration_ms": Date.now() - startTime
486
+ }
487
+ });
488
+ return null;
489
+ }
490
+ const result = this.buildTemplateMeta(String(id), template);
491
+ this.telemetry?.emit("igniter.mail.templates.get.success", {
492
+ level: "info",
493
+ attributes: {
494
+ "ctx.mail.template_id": String(id),
495
+ "ctx.mail.duration_ms": Date.now() - startTime
496
+ }
497
+ });
498
+ return result;
499
+ } catch (error) {
500
+ const normalizedError = IgniterMailError.is(error) ? error : new IgniterMailError({
501
+ code: "MAIL_PROVIDER_TEMPLATE_GET_FAILED",
502
+ message: "MAIL_PROVIDER_TEMPLATE_GET_FAILED",
503
+ cause: error,
504
+ logger: this.logger,
505
+ metadata: { template: String(id) }
506
+ });
507
+ this.telemetry?.emit("igniter.mail.templates.get.error", {
508
+ level: "error",
509
+ attributes: {
510
+ "ctx.mail.template_id": String(id),
511
+ "ctx.mail.error.code": normalizedError.code,
512
+ "ctx.mail.error.message": normalizedError.message,
513
+ "ctx.mail.duration_ms": Date.now() - startTime
514
+ }
515
+ });
516
+ this.logger?.error("IgniterMail.templates.get failed", normalizedError);
517
+ throw normalizedError;
518
+ }
519
+ }
520
+ async renderTemplate(id, variables) {
521
+ const startTime = Date.now();
522
+ this.logger?.debug("IgniterMail.templates.render started", {
523
+ template: String(id)
524
+ });
525
+ this.telemetry?.emit("igniter.mail.templates.render.started", {
526
+ level: "debug",
527
+ attributes: {
528
+ "ctx.mail.template_id": String(id)
529
+ }
530
+ });
531
+ try {
532
+ const template = this.templateRegistry[id];
533
+ if (!template) {
534
+ throw new IgniterMailError({
535
+ code: "MAIL_PROVIDER_TEMPLATE_NOT_FOUND",
536
+ message: "MAIL_PROVIDER_TEMPLATE_NOT_FOUND",
537
+ logger: this.logger,
538
+ metadata: { template: String(id) }
539
+ });
540
+ }
541
+ const validatedData = await this.validateTemplateData(
542
+ template,
543
+ variables ?? {}
544
+ );
545
+ const MailTemplate = template.render;
546
+ const html = await render(
547
+ /* @__PURE__ */ React.createElement(MailTemplate, { ...validatedData })
548
+ );
549
+ const text = await render(
550
+ /* @__PURE__ */ React.createElement(MailTemplate, { ...validatedData }),
551
+ { plainText: true }
552
+ );
553
+ this.telemetry?.emit("igniter.mail.templates.render.success", {
554
+ level: "info",
555
+ attributes: {
556
+ "ctx.mail.template_id": String(id),
557
+ "ctx.mail.duration_ms": Date.now() - startTime
558
+ }
559
+ });
560
+ this.logger?.info("IgniterMail.templates.render success", {
561
+ template: String(id),
562
+ durationMs: Date.now() - startTime
563
+ });
564
+ return { html, text };
565
+ } catch (error) {
566
+ const normalizedError = IgniterMailError.is(error) ? error : new IgniterMailError({
567
+ code: "MAIL_PROVIDER_TEMPLATE_RENDER_FAILED",
568
+ message: "MAIL_PROVIDER_TEMPLATE_RENDER_FAILED",
569
+ cause: error,
570
+ logger: this.logger,
571
+ metadata: { template: String(id) }
572
+ });
573
+ this.telemetry?.emit("igniter.mail.templates.render.error", {
574
+ level: "error",
575
+ attributes: {
576
+ "ctx.mail.template_id": String(id),
577
+ "ctx.mail.error.code": normalizedError.code,
578
+ "ctx.mail.error.message": normalizedError.message,
579
+ "ctx.mail.duration_ms": Date.now() - startTime
580
+ }
581
+ });
582
+ this.logger?.error("IgniterMail.templates.render failed", normalizedError);
583
+ throw normalizedError;
584
+ }
403
585
  }
404
586
  async ensureQueueJobRegistered() {
405
587
  const queue = this.queue;
@@ -470,7 +652,7 @@ var IgniterMailManagerCore = class {
470
652
  }
471
653
  });
472
654
  await this.onSendStarted(params);
473
- const template = this.templates[params.template];
655
+ const template = this.templateRegistry[params.template];
474
656
  if (!template) {
475
657
  throw new IgniterMailError({
476
658
  code: "MAIL_PROVIDER_TEMPLATE_NOT_FOUND",