diff --git a/src/domains/domains.ts b/src/domains/domains.ts new file mode 100644 index 00000000..a04102c7 --- /dev/null +++ b/src/domains/domains.ts @@ -0,0 +1,26 @@ +import { Resend } from '../resend'; +import { + CreateDomainOptions, + CreateDomainRequestOptions, + CreateDomainResponse, +} from './interfaces'; + +export class Domains { + constructor(private readonly resend: Resend) {} + + async create( + payload: CreateDomainOptions, + options: CreateDomainRequestOptions = {}, + ): Promise { + const { data } = await this.resend.post('/domains', payload, options); + return data; + } + + async remove(id: string) { + await this.resend.delete(`/domains/${id}`); + } + + async verify(id: string) { + await this.resend.post(`/domains/${id}/verify`); + } +} diff --git a/src/domains/interfaces/create-domain-options.interface.ts b/src/domains/interfaces/create-domain-options.interface.ts new file mode 100644 index 00000000..92e23c3f --- /dev/null +++ b/src/domains/interfaces/create-domain-options.interface.ts @@ -0,0 +1,61 @@ +import { PostOptions } from '../../common/interfaces'; + +export type DomainRegion = 'us-east-1' | 'eu-west-1' | 'sa-east-1'; + +export interface CreateDomainOptions { + domain: string; + region?: DomainRegion; +} + +export interface CreateDomainRequestOptions extends PostOptions {} + +export type DomainNameservers = + | 'Amazon Route 53' + | 'Cloudflare' + | 'Digital Ocean' + | 'GoDaddy' + | 'Google Domains' + | 'Namecheap' + | 'Unidentified' + | 'Vercel'; + +export type DomainStatus = + | 'pending' + | 'verified' + | 'failed' + | 'temporary_failure' + | 'not_started'; + +export interface DomainSpfRecord { + record: 'SPF'; + name: string; + value: string; + type: 'MX' | 'TXT'; + ttl: string; + status: DomainStatus; + routingPolicy?: string; + priority?: number; + proxStatus?: 'enable' | 'disable'; +} + +export interface DomainDkimRecord { + record: 'DKIM'; + name: string; + value: string; + type: 'CNAME'; + ttl: string; + status: DomainStatus; + routingPolicy?: string; + priority?: number; + proxStatus?: 'enable' | 'disable'; +} + +export type CreateDomainResponse = { + name: string; + id: string; + dnsProvider: DomainNameservers; + status: DomainStatus; + createdAt: string; + records: (DomainSpfRecord | DomainDkimRecord)[]; + region: DomainRegion; +}; diff --git a/src/domains/interfaces/index.ts b/src/domains/interfaces/index.ts new file mode 100644 index 00000000..3a6c812d --- /dev/null +++ b/src/domains/interfaces/index.ts @@ -0,0 +1 @@ +export * from './create-domain-options.interface'; diff --git a/src/resend.ts b/src/resend.ts index 7d4944ac..a0163e93 100644 --- a/src/resend.ts +++ b/src/resend.ts @@ -8,6 +8,7 @@ import { import { version } from '../package.json'; import { GetOptions, PostOptions, PutOptions } from './common/interfaces'; import { ApiKeys } from './api-keys/api-keys'; +import { Domains } from './domains/domains'; export class Resend { readonly baseUrl: string; @@ -15,6 +16,7 @@ export class Resend { private readonly request: AxiosInstance; readonly apiKeys = new ApiKeys(this); + readonly domains = new Domains(this); constructor(readonly key?: string) { if (!key) {