alepha
Version:
Easy-to-use modern TypeScript framework for building many kind of applications.
72 lines (68 loc) • 2.05 kB
text/typescript
import { $module } from "alepha";
import { $email } from "./primitives/$email.ts";
import { EmailProvider } from "./providers/EmailProvider.ts";
import { LocalEmailProvider } from "./providers/LocalEmailProvider.ts";
import { MemoryEmailProvider } from "./providers/MemoryEmailProvider.ts";
// Exports
export * from "./errors/EmailError.ts";
export * from "./primitives/$email.ts";
export * from "./providers/EmailProvider.ts";
export * from "./providers/LocalEmailProvider.ts";
export * from "./providers/MemoryEmailProvider.ts";
// Hook declarations
declare module "alepha" {
interface Hooks {
"email:sending": {
to: string | string[];
template: string;
variables: Record<string, unknown>;
provider: EmailProvider;
abort(): void;
};
"email:sent": {
to: string | string[];
template: string;
provider: EmailProvider;
};
}
}
/**
* Email delivery over pluggable providers.
*
* **Features:**
* - `$email` declares a named send channel; the name is surfaced to the
* `email:sending` / `email:sent` hooks (as their `template` field) for
* auditing and interception
* - Multiple recipients
* - Local file provider for development
* - Memory provider for testing
*
* There is **no template rendering**: `send()` takes an already-rendered
* `subject` and `body` — bring your own templating if you need it.
*
* For SMTP support, use `AlephaEmailSmtp` from `alepha/email/smtp`.
* For Brevo support, use `AlephaEmailBrevo` from `alepha/email/brevo`.
*
* @module alepha.email
*/
export const AlephaEmail = $module({
name: "alepha.email",
primitives: [$email],
services: [EmailProvider],
variants: [MemoryEmailProvider, LocalEmailProvider],
register: (alepha) => {
if (alepha.isTest()) {
alepha.with({
optional: true,
provide: EmailProvider,
use: MemoryEmailProvider,
});
} else {
alepha.with({
optional: true,
provide: EmailProvider,
use: LocalEmailProvider,
});
}
},
});