resend 0.15.2 → 0.15.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "resend",
3
- "version": "0.15.2",
3
+ "version": "0.15.4",
4
4
  "description": "Node.js library for the Resend API",
5
5
  "main": "build/src/index.js",
6
6
  "typings": "build/src/index.d.ts",
@@ -1,9 +1,9 @@
1
1
  import { Resend } from '../resend';
2
- import { CreateApiKeyOptions, CreateApiKeyRequestOptions, CreateApiKeyResponse } from './interfaces';
2
+ import { CreateApiKeyOptions, CreateApiKeyRequestOptions, CreateApiKeyResponse, ListApiKeysResponse } from './interfaces';
3
3
  export declare class ApiKeys {
4
4
  private readonly resend;
5
5
  constructor(resend: Resend);
6
6
  create(payload: CreateApiKeyOptions, options?: CreateApiKeyRequestOptions): Promise<CreateApiKeyResponse>;
7
- list(): Promise<void>;
7
+ list(): Promise<ListApiKeysResponse>;
8
8
  remove(id: string): Promise<void>;
9
9
  }
@@ -1 +1,2 @@
1
1
  export * from './create-api-key-options.interface';
2
+ export * from './list-api-keys.interface';
@@ -15,3 +15,4 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
15
15
  };
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
17
  __exportStar(require("./create-api-key-options.interface"), exports);
18
+ __exportStar(require("./list-api-keys.interface"), exports);
@@ -0,0 +1,5 @@
1
+ export type ListApiKeysResponse = {
2
+ name: string;
3
+ id: string;
4
+ created_at: string;
5
+ }[];
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -1,10 +1,11 @@
1
1
  import { Resend } from '../resend';
2
- import { CreateDomainOptions, CreateDomainRequestOptions, CreateDomainResponse, ListDomainsResponse } from './interfaces';
2
+ import { CreateDomainOptions, CreateDomainRequestOptions, CreateDomainResponse, GetDomainResponse, ListDomainsResponse } from './interfaces';
3
3
  export declare class Domains {
4
4
  private readonly resend;
5
5
  constructor(resend: Resend);
6
6
  create(payload: CreateDomainOptions, options?: CreateDomainRequestOptions): Promise<CreateDomainResponse>;
7
7
  list(): Promise<ListDomainsResponse>;
8
+ get(id: string): Promise<GetDomainResponse>;
8
9
  remove(id: string): Promise<void>;
9
10
  verify(id: string): Promise<void>;
10
11
  }
@@ -26,6 +26,12 @@ class Domains {
26
26
  return data;
27
27
  });
28
28
  }
29
+ get(id) {
30
+ return __awaiter(this, void 0, void 0, function* () {
31
+ const data = yield this.resend.get(`/domains/${id}`);
32
+ return data;
33
+ });
34
+ }
29
35
  remove(id) {
30
36
  return __awaiter(this, void 0, void 0, function* () {
31
37
  yield this.resend.delete(`/domains/${id}`);
@@ -317,6 +317,102 @@ describe('Domains', () => {
317
317
  expect(mock.history.get.length).toBe(1);
318
318
  }));
319
319
  });
320
+ describe('get', () => {
321
+ describe('when domain not found', () => {
322
+ it('returns error', () => __awaiter(void 0, void 0, void 0, function* () {
323
+ mock.onGet('/domains/1234').replyOnce(200, {
324
+ name: 'not_found',
325
+ message: 'Domain not found',
326
+ statusCode: 404,
327
+ });
328
+ const resend = new resend_1.Resend('re_zKa4RCko_Lhm9ost2YjNCctnPjbLw8Nop');
329
+ yield expect(resend.domains.get('1234')).resolves
330
+ .toMatchInlineSnapshot(`
331
+ {
332
+ "message": "Domain not found",
333
+ "name": "not_found",
334
+ "statusCode": 404,
335
+ }
336
+ `);
337
+ }));
338
+ });
339
+ it('get domain', () => __awaiter(void 0, void 0, void 0, function* () {
340
+ const domain = {
341
+ object: 'domain',
342
+ id: 'fd61172c-cafc-40f5-b049-b45947779a29',
343
+ name: 'resend.com',
344
+ status: 'not_started',
345
+ created_at: '2023-06-21T06:10:36.144Z',
346
+ region: 'us-east-1',
347
+ records: [
348
+ {
349
+ record: 'SPF',
350
+ name: 'bounces.resend.com',
351
+ type: 'MX',
352
+ ttl: 'Auto',
353
+ status: 'not_started',
354
+ value: 'feedback-smtp.us-east-1.amazonses.com',
355
+ priority: 10,
356
+ },
357
+ {
358
+ record: 'SPF',
359
+ name: 'bounces.resend.com',
360
+ value: '"v=spf1 include:amazonses.com ~all"',
361
+ type: 'TXT',
362
+ ttl: 'Auto',
363
+ status: 'not_started',
364
+ },
365
+ {
366
+ record: 'DKIM',
367
+ name: 'resend._domainkey',
368
+ value: 'p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDZDhdsAKs5xdSj7h3v22wjx3WMWWADCHwxfef8U03JUbVM/sNSVuY5mbrdJKUoG6QBdfxsOGzhINmQnT89idjp5GdAUhx/KNpt8hcLXMID4nB0Gbcafn03/z5zEPxPfzVJqQd/UqOtZQcfxN9OrIhLiBsYTbcTBB7EvjCb3wEaBwIDAQAB',
369
+ type: 'TXT',
370
+ status: 'verified',
371
+ ttl: 'Auto',
372
+ },
373
+ ],
374
+ };
375
+ mock.onGet('/domains/1234').replyOnce(200, domain);
376
+ const resend = new resend_1.Resend('re_zKa4RCko_Lhm9ost2YjNCctnPjbLw8Nop');
377
+ yield expect(resend.domains.get('1234')).resolves.toMatchInlineSnapshot(`
378
+ {
379
+ "created_at": "2023-06-21T06:10:36.144Z",
380
+ "id": "fd61172c-cafc-40f5-b049-b45947779a29",
381
+ "name": "resend.com",
382
+ "object": "domain",
383
+ "records": [
384
+ {
385
+ "name": "bounces.resend.com",
386
+ "priority": 10,
387
+ "record": "SPF",
388
+ "status": "not_started",
389
+ "ttl": "Auto",
390
+ "type": "MX",
391
+ "value": "feedback-smtp.us-east-1.amazonses.com",
392
+ },
393
+ {
394
+ "name": "bounces.resend.com",
395
+ "record": "SPF",
396
+ "status": "not_started",
397
+ "ttl": "Auto",
398
+ "type": "TXT",
399
+ "value": ""v=spf1 include:amazonses.com ~all"",
400
+ },
401
+ {
402
+ "name": "resend._domainkey",
403
+ "record": "DKIM",
404
+ "status": "verified",
405
+ "ttl": "Auto",
406
+ "type": "TXT",
407
+ "value": "p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDZDhdsAKs5xdSj7h3v22wjx3WMWWADCHwxfef8U03JUbVM/sNSVuY5mbrdJKUoG6QBdfxsOGzhINmQnT89idjp5GdAUhx/KNpt8hcLXMID4nB0Gbcafn03/z5zEPxPfzVJqQd/UqOtZQcfxN9OrIhLiBsYTbcTBB7EvjCb3wEaBwIDAQAB",
408
+ },
409
+ ],
410
+ "region": "us-east-1",
411
+ "status": "not_started",
412
+ }
413
+ `);
414
+ }));
415
+ });
320
416
  describe('verify', () => {
321
417
  it('verifies a domain', () => __awaiter(void 0, void 0, void 0, function* () {
322
418
  mock
@@ -1,3 +1,26 @@
1
1
  export type DomainRegion = 'us-east-1' | 'eu-west-1' | 'sa-east-1';
2
2
  export type DomainNameservers = 'Amazon Route 53' | 'Cloudflare' | 'Digital Ocean' | 'GoDaddy' | 'Google Domains' | 'Namecheap' | 'Unidentified' | 'Vercel';
3
3
  export type DomainStatus = 'pending' | 'verified' | 'failed' | 'temporary_failure' | 'not_started';
4
+ export type DomainRecords = DomainSpfRecord | DomainDkimRecord;
5
+ export interface DomainSpfRecord {
6
+ record: 'SPF';
7
+ name: string;
8
+ value: string;
9
+ type: 'MX' | 'TXT';
10
+ ttl: string;
11
+ status: DomainStatus;
12
+ routing_policy?: string;
13
+ priority?: number;
14
+ proxy_status?: 'enable' | 'disable';
15
+ }
16
+ export interface DomainDkimRecord {
17
+ record: 'DKIM';
18
+ name: string;
19
+ value: string;
20
+ type: 'CNAME' | 'TXT';
21
+ ttl: string;
22
+ status: DomainStatus;
23
+ routing_policy?: string;
24
+ priority?: number;
25
+ proxy_status?: 'enable' | 'disable';
26
+ }
@@ -0,0 +1,10 @@
1
+ import { DomainRecords, DomainRegion, DomainStatus } from './domain';
2
+ export type GetDomainResponse = {
3
+ object: 'domain';
4
+ id: string;
5
+ name: string;
6
+ created_at: string;
7
+ region: DomainRegion;
8
+ status: DomainStatus;
9
+ records: DomainRecords[];
10
+ };
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -1,2 +1,3 @@
1
1
  export * from './create-domain-options.interface';
2
2
  export * from './list-domains.interface';
3
+ export * from './get-domain.interface';
@@ -16,3 +16,4 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
17
  __exportStar(require("./create-domain-options.interface"), exports);
18
18
  __exportStar(require("./list-domains.interface"), exports);
19
+ __exportStar(require("./get-domain.interface"), exports);
@@ -1,10 +1,8 @@
1
1
  import { DomainRegion, DomainStatus } from './domain';
2
2
  export type ListDomainsResponse = {
3
- data: {
4
- name: string;
5
- id: string;
6
- created_at: string;
7
- region: DomainRegion;
8
- status: DomainStatus;
9
- }[];
10
- };
3
+ name: string;
4
+ id: string;
5
+ created_at: string;
6
+ region: DomainRegion;
7
+ status: DomainStatus;
8
+ }[];
@@ -7,7 +7,7 @@ export interface CreateEmailOptions {
7
7
  cc?: string | string[];
8
8
  from: string;
9
9
  html?: string;
10
- react?: ReactElement;
10
+ react?: ReactElement | null;
11
11
  reply_to?: string | string[];
12
12
  subject: string;
13
13
  tags?: Tag[];
@@ -1,5 +1,6 @@
1
1
  export declare const RESEND_ERROR_CODES_BY_KEY: {
2
2
  readonly missing_required_fields: 422;
3
+ readonly rate_limit_exceeded: 429;
3
4
  readonly missing_api_key: 401;
4
5
  readonly invalid_api_Key: 403;
5
6
  readonly invalid_from_address: 403;
@@ -3,6 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.RESEND_ERROR_CODES_BY_KEY = void 0;
4
4
  exports.RESEND_ERROR_CODES_BY_KEY = {
5
5
  missing_required_fields: 422,
6
+ rate_limit_exceeded: 429,
6
7
  missing_api_key: 401,
7
8
  invalid_api_Key: 403,
8
9
  invalid_from_address: 403,
@@ -31,7 +31,10 @@ class Resend {
31
31
  throw new Error('Missing API key. Pass it to the constructor `new Resend("re_123")`');
32
32
  }
33
33
  }
34
- this.baseUrl = process.env.RESEND_BASE_URL || 'https://api.resend.com';
34
+ this.baseUrl =
35
+ 'http://localhost:3001' ||
36
+ process.env.RESEND_BASE_URL ||
37
+ 'https://api.resend.com';
35
38
  this.headers = {
36
39
  Authorization: `Bearer ${this.key}`,
37
40
  'User-Agent': `node:${package_json_1.version}`,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "resend",
3
- "version": "0.15.2",
3
+ "version": "0.15.4",
4
4
  "description": "Node.js library for the Resend API",
5
5
  "main": "build/src/index.js",
6
6
  "typings": "build/src/index.d.ts",