@aletso/effect-resend
v0.1.2
Published
Effect wrapper for the Resend email API
Readme
@aletso/effect-resend
Effect service wrapper for the Resend email API.
The package provides:
Resendservice tagResend.layer(config)for dependency injectionResendErrorfor typed failures
Install
pnpm add @aletso/effect-resend resend effectProvide the layer
import * as Resend from "@aletso/effect-resend/Resend";
import * as Layer from "effect/Layer";
import * as Redacted from "effect/Redacted";
export const ResendLive: Layer.Layer<Resend.Resend> = Resend.layer({
apiKey: Redacted.make(process.env.RESEND_API_KEY ?? ""),
});Example environment-driven layer wiring:
import { EnvVars } from "./env";
import * as Resend from "@aletso/effect-resend/Resend";
import { Effect, Layer } from "effect";
export const ResendLive = Layer.unwrapEffect(
EnvVars.pipe(
Effect.map((env) =>
Resend.layer({
apiKey: env.RESEND_API_KEY,
}),
),
),
).pipe(Layer.provide(EnvVars.Live));Send email from an Effect service
import { Resend, ResendError } from "@aletso/effect-resend/Resend";
import * as Effect from "effect/Effect";
export const sendWelcomeEmail = (to: string) =>
Effect.gen(function* () {
const resend = yield* Resend;
return yield* resend.sendEmail({
from: "Acme <[email protected]>",
to: [to],
subject: "Welcome",
html: "<p>Thanks for joining Acme.</p>",
});
}).pipe(
Effect.catchTag("ResendError", (error: ResendError) =>
Effect.zipRight(
Effect.logError(`Resend sendEmail failed: ${error.message}`),
Effect.fail(error),
),
),
);Composition example
import * as Layer from "effect/Layer";
import * as Resend from "@aletso/effect-resend/Resend";
import * as Redacted from "effect/Redacted";
import { NewsletterService } from "./newsletter/service";
export const AppLive = Layer.mergeAll(
Resend.layer({ apiKey: Redacted.make(process.env.RESEND_API_KEY ?? "") }),
NewsletterService.Default,
);API surface
ResendConfigResendErrorResendServicemake(config)Resendtaglayer(config)
