From 66c55890f750507b5a1d3866290d5ca32028d64f Mon Sep 17 00:00:00 2001 From: Bu Kinoshita <6929565+bukinoshita@users.noreply.github.com> Date: Sat, 25 Mar 2023 03:37:34 -0300 Subject: [PATCH 1/3] feat: Add domains --- src/domains/domains.ts | 22 +++++++++++++++++++ .../create-domain-options.interface.ts | 7 ++++++ src/domains/interfaces/index.ts | 1 + 3 files changed, 30 insertions(+) create mode 100644 src/domains/domains.ts create mode 100644 src/domains/interfaces/create-domain-options.interface.ts create mode 100644 src/domains/interfaces/index.ts diff --git a/src/domains/domains.ts b/src/domains/domains.ts new file mode 100644 index 00000000..c2b3fe1e --- /dev/null +++ b/src/domains/domains.ts @@ -0,0 +1,22 @@ +import { Resend } from '../resend'; +import { CreateDomainOptions, CreateDomainRequestOptions } 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..1c0e9d32 --- /dev/null +++ b/src/domains/interfaces/create-domain-options.interface.ts @@ -0,0 +1,7 @@ +import { PostOptions } from '../../common/interfaces'; + +export interface CreateDomainOptions { + name: string; +} + +export interface CreateDomainRequestOptions extends PostOptions {} 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'; From 1f6fc5b819e0df89c8a1bf31087c3023d142cc4b Mon Sep 17 00:00:00 2001 From: Bu Kinoshita <6929565+bukinoshita@users.noreply.github.com> Date: Mon, 27 Mar 2023 14:49:56 -0300 Subject: [PATCH 2/3] fix: Minor tweaks --- src/domains/interfaces/create-domain-options.interface.ts | 5 ++++- src/resend.ts | 2 ++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/src/domains/interfaces/create-domain-options.interface.ts b/src/domains/interfaces/create-domain-options.interface.ts index 1c0e9d32..a82d225e 100644 --- a/src/domains/interfaces/create-domain-options.interface.ts +++ b/src/domains/interfaces/create-domain-options.interface.ts @@ -1,7 +1,10 @@ import { PostOptions } from '../../common/interfaces'; +export type DomainRegion = 'us-east-1' | 'eu-west-1' | 'sa-east-1'; + export interface CreateDomainOptions { - name: string; + domain: string; + region?: DomainRegion; } export interface CreateDomainRequestOptions extends PostOptions {} 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) { From dfb68a80b9a96335fb9e3ade07d2c595c0da4401 Mon Sep 17 00:00:00 2001 From: Bu Kinoshita <6929565+bukinoshita@users.noreply.github.com> Date: Mon, 27 Mar 2023 14:57:19 -0300 Subject: [PATCH 3/3] feat: Add returning types --- src/domains/domains.ts | 8 ++- .../create-domain-options.interface.ts | 51 +++++++++++++++++++ 2 files changed, 57 insertions(+), 2 deletions(-) diff --git a/src/domains/domains.ts b/src/domains/domains.ts index c2b3fe1e..a04102c7 100644 --- a/src/domains/domains.ts +++ b/src/domains/domains.ts @@ -1,5 +1,9 @@ import { Resend } from '../resend'; -import { CreateDomainOptions, CreateDomainRequestOptions } from './interfaces'; +import { + CreateDomainOptions, + CreateDomainRequestOptions, + CreateDomainResponse, +} from './interfaces'; export class Domains { constructor(private readonly resend: Resend) {} @@ -7,7 +11,7 @@ export class Domains { async create( payload: CreateDomainOptions, options: CreateDomainRequestOptions = {}, - ): Promise { + ): Promise { const { data } = await this.resend.post('/domains', payload, options); return data; } diff --git a/src/domains/interfaces/create-domain-options.interface.ts b/src/domains/interfaces/create-domain-options.interface.ts index a82d225e..92e23c3f 100644 --- a/src/domains/interfaces/create-domain-options.interface.ts +++ b/src/domains/interfaces/create-domain-options.interface.ts @@ -8,3 +8,54 @@ export interface CreateDomainOptions { } 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; +};