alepha
Version:
Easy-to-use modern TypeScript framework for building many kind of applications.
97 lines (96 loc) • 2.73 kB
JavaScript
import { $env, $module, z } from "alepha";
import { AlephaEmail, EmailError, EmailProvider } from "alepha/email";
import { $logger } from "alepha/logger";
//#region ../../src/email/brevo/providers/BrevoEmailProvider.ts
/**
* Environment variables for Brevo configuration.
*/
const envSchema = z.object({
BREVO_API_KEY: z.text({ description: "Brevo API key for transactional email" }),
EMAIL_FROM: z.text({ description: "Default sender email address" })
});
/**
* Email provider using Brevo (formerly Sendinblue) transactional email API.
*
* Sends emails via `POST https://api.brevo.com/v3/smtp/email`.
*
* Configuration is provided via environment variables:
* - `BREVO_API_KEY`: Brevo API key
* - `EMAIL_FROM`: Default sender email address
*
* @example
* ```typescript
* // .env
* // BREVO_API_KEY=xkeysib-xxx
* // EMAIL_FROM=noreply@example.com
*
* // app.ts
* import { AlephaEmailBrevo } from "alepha/email/brevo";
*
* const app = Alepha.create().with(AlephaEmailBrevo);
* ```
*/
var BrevoEmailProvider = class {
env = $env(envSchema);
log = $logger();
async send(options) {
const { to, subject, body } = options;
this.log.info("Sending email via Brevo", {
to,
subject
});
const recipients = Array.isArray(to) ? to : [to];
try {
const response = await fetch("https://api.brevo.com/v3/smtp/email", {
method: "POST",
headers: {
"api-key": this.env.BREVO_API_KEY,
"Content-Type": "application/json",
Accept: "application/json"
},
body: JSON.stringify({
sender: { email: this.env.EMAIL_FROM },
to: recipients.map((email) => ({ email })),
subject,
htmlContent: body
})
});
if (!response.ok) {
const text = await response.text();
throw new EmailError(`Brevo API returned ${response.status}: ${text}`);
}
this.log.info("Email sent successfully via Brevo", {
to,
subject
});
} catch (error) {
if (error instanceof EmailError) throw error;
const message = `Failed to send email via Brevo: ${error instanceof Error ? error.message : String(error)}`;
this.log.error(message, {
to,
subject
});
throw new EmailError(message, error instanceof Error ? error : void 0);
}
}
};
//#endregion
//#region ../../src/email/brevo/index.ts
/**
* Plugin for Alepha Email that provides Brevo transactional email capabilities.
*
* @see {@link BrevoEmailProvider}
* @module alepha.email.brevo
*/
const AlephaEmailBrevo = $module({
name: "alepha.email.brevo",
services: [BrevoEmailProvider],
register: (alepha) => alepha.with({
optional: true,
provide: EmailProvider,
use: BrevoEmailProvider
}).with(AlephaEmail)
});
//#endregion
export { AlephaEmailBrevo, BrevoEmailProvider };
//# sourceMappingURL=index.js.map