1import * as Layer from "effect/Layer";
2import * as FetchHttpClient from "effect/http/FetchHttpClient";
3import * as Provider from "../Provider.ts";
4import { Account, AccountProvider } from "./Account.ts";
5import { Certificate, CertificateProvider } from "./Certificate.ts";
6import { IssueCertificateHttp } from "./IssueCertificateHttp.ts";
7
8export class Providers extends Provider.ProviderCollection<Providers>()(
9 "ACME",
10) {}
11
12export type ProviderRequirements = Layer.Services<ReturnType<typeof providers>>;
13
14/**
15 * Registers the ACME resource providers ({@link Account},
16 * {@link Certificate}) and the {@link IssueCertificateHttp} binding.
17 *
18 * DNS-01 solvers come from the DNS provider's own `providers()` layer —
19 * include e.g. `Cloudflare.providers()` alongside this one.
20 *
21 * @example
22 * ```typescript
23 * export default Alchemy.Stack(
24 * "Certs",
25 * {
26 * providers: Layer.mergeAll(ACME.providers(), Cloudflare.providers()),
27 * state: Alchemy.localState(),
28 * },
29 * Effect.gen(function* () {
30 * const wildcard = yield* Wildcard;
31 * return { notAfter: wildcard.notAfter };
32 * }),
33 * );
34 * ```
35 */
36export const providers = () =>
37 Layer.effect(Providers, Provider.collection([Account, Certificate])).pipe(
38 Layer.provide(Layer.mergeAll(AccountProvider(), CertificateProvider())),
39 Layer.provideMerge(IssueCertificateHttp),
40 Layer.provideMerge(FetchHttpClient.layer),
41 Layer.orDie,
42 );