mailgun.js 4.1.2 → 4.1.3

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.
@@ -4,4 +4,4 @@
4
4
 
5
5
  /*! https://mths.be/punycode v1.3.2 by @mathias */
6
6
 
7
- /*! mailgun.js v4.1.1 */
7
+ /*! mailgun.js v4.1.2 */
package/lib/client.ts CHANGED
@@ -18,6 +18,7 @@ import MailListsMembers from './mailListMembers';
18
18
  import { InputFormData } from './interfaces/IFormData';
19
19
  import DomainCredentialsClient from './domainsCredentials';
20
20
  import MultipleValidationClient from './multipleValidation';
21
+ import DomainTemplatesClient from './domainsTemplates';
21
22
 
22
23
  export default class Client {
23
24
  private request;
@@ -53,9 +54,10 @@ export default class Client {
53
54
  this.request = new Request(config, formData);
54
55
  const mailListsMembers = new MailListsMembers(this.request);
55
56
  const domainCredentialsClient = new DomainCredentialsClient(this.request);
57
+ const domainTemplatesClient = new DomainTemplatesClient(this.request);
56
58
  const multipleValidationClient = new MultipleValidationClient(this.request);
57
59
 
58
- this.domains = new DomainClient(this.request, domainCredentialsClient);
60
+ this.domains = new DomainClient(this.request, domainCredentialsClient, domainTemplatesClient);
59
61
  this.webhooks = new WebhookClient(this.request);
60
62
  this.events = new EventClient(this.request);
61
63
  this.stats = new StatsClient(this.request);
package/lib/domains.ts CHANGED
@@ -37,7 +37,10 @@ import {
37
37
  UpdateDomainTrackingResponse,
38
38
  UpdatedOpenTracking
39
39
  } from './interfaces/DomainTracking';
40
+ import { IDomainCredentials } from './interfaces/DomainCredentials';
41
+ import { IDomainTemplatesClient } from './interfaces/DomainTemplates';
40
42
  import DomainCredentialsClient from './domainsCredentials';
43
+ import DomainTemplatesClient from './domainsTemplates';
41
44
 
42
45
  export class Domain {
43
46
  name: string;
@@ -72,11 +75,17 @@ export class Domain {
72
75
 
73
76
  export default class DomainClient {
74
77
  request: Request;
75
- public domainCredentials: DomainCredentialsClient;
76
-
77
- constructor(request: Request, domainCredentialsClient: DomainCredentialsClient) {
78
+ public domainCredentials: IDomainCredentials;
79
+ public domainTemplates: IDomainTemplatesClient
80
+
81
+ constructor(
82
+ request: Request,
83
+ domainCredentialsClient: DomainCredentialsClient,
84
+ domainTemplatesClient: DomainTemplatesClient
85
+ ) {
78
86
  this.request = request;
79
87
  this.domainCredentials = domainCredentialsClient;
88
+ this.domainTemplates = domainTemplatesClient;
80
89
  }
81
90
 
82
91
  private _parseMessage(response: DestroyedDomainResponse) : MessageResponse {
@@ -0,0 +1,234 @@
1
+ import urljoin from 'url-join';
2
+ import APIResponse from './interfaces/ApiResponse';
3
+ import Request from './request';
4
+
5
+ import {
6
+ CreateDomainTemplateAPIResponse,
7
+ CreateDomainTemplateVersionAPIResponse,
8
+ CreateDomainTemplateVersionResult,
9
+ DomainTemplate, DomainTemplateData,
10
+ DomainTemplatesQuery,
11
+ DomainTemplateUpdateData,
12
+ DomainTemplateUpdateVersionData,
13
+ DomainTemplateVersionData,
14
+ GetDomainTemplateAPIResponse,
15
+ IDomainTemplatesClient,
16
+ ListDomainTemplatesAPIResponse,
17
+ ListDomainTemplatesResult,
18
+ ListDomainTemplateVersionsAPIResponse,
19
+ ListDomainTemplateVersionsResult,
20
+ MutateDomainTemplateVersionAPIResponse,
21
+ MutateDomainTemplateVersionResult,
22
+ NotificationAPIResponse,
23
+ NotificationResult,
24
+ ShortTemplateVersion,
25
+ TemplateVersion,
26
+ UpdateOrDeleteDomainTemplateAPIResponse,
27
+ UpdateOrDeleteDomainTemplateResult
28
+ } from './interfaces/DomainTemplates';
29
+
30
+ export class DomainTemplateItem implements DomainTemplate {
31
+ name : string;
32
+ description : string;
33
+ createdAt : Date | '';
34
+ createdBy : string;
35
+ id : string;
36
+ version?: TemplateVersion;
37
+ versions?: ShortTemplateVersion[];
38
+
39
+ constructor(domainTemplateFromAPI: DomainTemplate) {
40
+ this.name = domainTemplateFromAPI.name;
41
+ this.description = domainTemplateFromAPI.description;
42
+ this.createdAt = domainTemplateFromAPI.createdAt ? new Date(domainTemplateFromAPI.createdAt) : '';
43
+ this.createdBy = domainTemplateFromAPI.createdBy;
44
+ this.id = domainTemplateFromAPI.id;
45
+
46
+ if (domainTemplateFromAPI.version) {
47
+ this.version = domainTemplateFromAPI.version;
48
+ if (domainTemplateFromAPI.version.createdAt) {
49
+ this.version.createdAt = new Date(domainTemplateFromAPI.version.createdAt);
50
+ }
51
+ }
52
+
53
+ if (domainTemplateFromAPI.versions && domainTemplateFromAPI.versions.length) {
54
+ this.versions = domainTemplateFromAPI.versions.map((version) => {
55
+ const result = { ...version };
56
+ result.createdAt = new Date(version.createdAt);
57
+ return result;
58
+ });
59
+ }
60
+ }
61
+ }
62
+
63
+ export default class DomainTemplatesClient implements IDomainTemplatesClient {
64
+ baseRoute: string;
65
+ request: Request;
66
+
67
+ constructor(request: Request) {
68
+ this.request = request;
69
+ this.baseRoute = '/v3/';
70
+ }
71
+
72
+ private parseCreationResponse(data: CreateDomainTemplateAPIResponse): DomainTemplateItem {
73
+ return new DomainTemplateItem(data.body.template);
74
+ }
75
+
76
+ private parseCreationVersionResponse(
77
+ data: CreateDomainTemplateVersionAPIResponse
78
+ ): CreateDomainTemplateVersionResult {
79
+ const result: CreateDomainTemplateVersionResult = {} as CreateDomainTemplateVersionResult;
80
+ result.status = data.status;
81
+ result.message = data.body.message;
82
+ if (data.body && data.body.template) {
83
+ result.template = new DomainTemplateItem(data.body.template);
84
+ }
85
+ return result;
86
+ }
87
+
88
+ private parseMutationResponse(
89
+ data: UpdateOrDeleteDomainTemplateAPIResponse
90
+ ): UpdateOrDeleteDomainTemplateResult {
91
+ const result: UpdateOrDeleteDomainTemplateResult = {} as UpdateOrDeleteDomainTemplateResult;
92
+ result.status = data.status;
93
+ result.message = data.body.message;
94
+ if (data.body && data.body.template) {
95
+ result.templateName = data.body.template.name;
96
+ }
97
+ return result;
98
+ }
99
+
100
+ private parseNotificationResponse(data: NotificationAPIResponse): NotificationResult {
101
+ const result: NotificationResult = {} as NotificationResult;
102
+ result.status = data.status;
103
+ result.message = data.body.message;
104
+ return result;
105
+ }
106
+
107
+ private parseMutateTemplateVersionResponse(
108
+ data: MutateDomainTemplateVersionAPIResponse
109
+ ): MutateDomainTemplateVersionResult {
110
+ const result: MutateDomainTemplateVersionResult = {} as MutateDomainTemplateVersionResult;
111
+ result.status = data.status;
112
+ result.message = data.body.message;
113
+ if (data.body.template) {
114
+ result.templateName = data.body.template.name;
115
+ result.templateVersion = { tag: data.body.template.version.tag };
116
+ }
117
+ return result;
118
+ }
119
+
120
+ private parseList(response: ListDomainTemplatesAPIResponse): ListDomainTemplatesResult {
121
+ const data = {} as ListDomainTemplatesResult;
122
+
123
+ data.items = response.body.items.map((d: DomainTemplate) => new DomainTemplateItem(d));
124
+
125
+ data.pages = response.body.paging;
126
+
127
+ return data;
128
+ }
129
+
130
+ private parseListTemplateVersions(
131
+ response: ListDomainTemplateVersionsAPIResponse
132
+ ): ListDomainTemplateVersionsResult {
133
+ const data = {} as ListDomainTemplateVersionsResult;
134
+
135
+ data.template = new DomainTemplateItem(response.body.template);
136
+
137
+ data.pages = response.body.paging;
138
+
139
+ return data;
140
+ }
141
+
142
+ list(domain: string, query?: DomainTemplatesQuery): Promise<ListDomainTemplatesResult> {
143
+ return this.request.get(urljoin(this.baseRoute, domain, '/templates'), query)
144
+ .then(
145
+ (res: APIResponse) => this.parseList(res)
146
+ );
147
+ }
148
+
149
+ get(domain: string, templateName: string): Promise<DomainTemplateItem> {
150
+ return this.request.get(urljoin(this.baseRoute, domain, '/templates/', templateName))
151
+ .then(
152
+ (res: GetDomainTemplateAPIResponse) => new DomainTemplateItem(res.body.template)
153
+ );
154
+ }
155
+
156
+ create(
157
+ domain: string,
158
+ data: DomainTemplateData
159
+ ): Promise<DomainTemplateItem> {
160
+ return this.request.postWithFD(urljoin(this.baseRoute, domain, '/templates'), data)
161
+ .then((res: CreateDomainTemplateAPIResponse) => this.parseCreationResponse(res));
162
+ }
163
+
164
+ update(
165
+ domain: string,
166
+ templateName: string,
167
+ data: DomainTemplateUpdateData
168
+ ): Promise<UpdateOrDeleteDomainTemplateResult> {
169
+ return this.request.putWithFD(urljoin(this.baseRoute, domain, '/templates/', templateName), data)
170
+ .then((res: UpdateOrDeleteDomainTemplateAPIResponse) => this.parseMutationResponse(res));
171
+ }
172
+
173
+ destroy(domain: string, templateName: string): Promise<UpdateOrDeleteDomainTemplateResult> {
174
+ return this.request.delete(urljoin(this.baseRoute, domain, '/templates/', templateName))
175
+ .then((res: UpdateOrDeleteDomainTemplateAPIResponse) => this.parseMutationResponse(res));
176
+ }
177
+
178
+ destroyAll(domain: string): Promise<NotificationResult> {
179
+ return this.request.delete(urljoin(this.baseRoute, domain, '/templates'))
180
+ .then((res: NotificationAPIResponse) => this.parseNotificationResponse(res));
181
+ }
182
+
183
+ createVersion(
184
+ domain: string,
185
+ templateName: string,
186
+ data: DomainTemplateVersionData
187
+ ): Promise<CreateDomainTemplateVersionResult> {
188
+ return this.request.postWithFD(urljoin(this.baseRoute, domain, '/templates/', templateName, '/versions'), data)
189
+ .then(
190
+ (res: CreateDomainTemplateVersionAPIResponse) => this.parseCreationVersionResponse(res)
191
+ );
192
+ }
193
+
194
+ getVersion(domain: string, templateName: string, tag: string): Promise<DomainTemplateItem> {
195
+ return this.request.get(urljoin(this.baseRoute, domain, '/templates/', templateName, '/versions/', tag))
196
+ .then(
197
+ (res: GetDomainTemplateAPIResponse) => new DomainTemplateItem(res.body.template)
198
+ );
199
+ }
200
+
201
+ updateVersion(
202
+ domain: string,
203
+ templateName: string,
204
+ tag: string,
205
+ data: DomainTemplateUpdateVersionData
206
+ ): Promise<MutateDomainTemplateVersionResult> {
207
+ return this.request.putWithFD(urljoin(this.baseRoute, domain, '/templates/', templateName, '/versions/', tag), data)
208
+ .then(
209
+ // eslint-disable-next-line max-len
210
+ (res: MutateDomainTemplateVersionAPIResponse) => this.parseMutateTemplateVersionResponse(res)
211
+ );
212
+ }
213
+
214
+ destroyVersion(
215
+ domain: string,
216
+ templateName: string,
217
+ tag: string
218
+ ): Promise<MutateDomainTemplateVersionResult> {
219
+ return this.request.delete(urljoin(this.baseRoute, domain, '/templates/', templateName, '/versions/', tag))
220
+ // eslint-disable-next-line max-len
221
+ .then((res: MutateDomainTemplateVersionAPIResponse) => this.parseMutateTemplateVersionResponse(res));
222
+ }
223
+
224
+ listVersions(
225
+ domain: string,
226
+ templateName: string,
227
+ query?: DomainTemplatesQuery
228
+ ): Promise<ListDomainTemplateVersionsResult> {
229
+ return this.request.get(urljoin(this.baseRoute, domain, '/templates', templateName, '/versions'), query)
230
+ .then(
231
+ (res: ListDomainTemplateVersionsAPIResponse) => this.parseListTemplateVersions(res)
232
+ );
233
+ }
234
+ }
@@ -0,0 +1,234 @@
1
+ import { DomainTemplateItem } from '../domainsTemplates';
2
+
3
+ export enum YesNo {
4
+ YES = 'yes',
5
+ NO = 'no'
6
+ }
7
+
8
+ export enum Pages {
9
+ FIRST = 'first',
10
+ LAST = 'last',
11
+ NEXT = 'next',
12
+ PREV = 'prev'
13
+ }
14
+ /* eslint-disable camelcase */
15
+ export interface DomainTemplateData {
16
+ name: string;
17
+ description: string;
18
+ template: string;
19
+ tag?: string;
20
+ engine?: string;
21
+ comment?: string;
22
+ }
23
+
24
+ export interface DomainTemplateVersionData {
25
+ template: string;
26
+ tag: string;
27
+ engine?: string;
28
+ comment?: string;
29
+ active?: YesNo;
30
+ }
31
+
32
+ export interface DomainTemplateUpdateData {
33
+ description: string;
34
+ }
35
+
36
+ export interface DomainTemplateUpdateVersionData {
37
+ template?: string;
38
+ comment?: string;
39
+ active?: YesNo;
40
+ }
41
+
42
+ export interface DomainTemplatesQuery {
43
+ page: Pages;
44
+ limit: number;
45
+ p: string;
46
+ }
47
+
48
+ export interface ShortTemplateVersion {
49
+ tag: string;
50
+ engine: string;
51
+ mjml: string;
52
+ createdAt: string | Date;
53
+ comment: string;
54
+ active: boolean;
55
+ id: string;
56
+ }
57
+
58
+ export interface TemplateVersion extends ShortTemplateVersion{
59
+ template: string;
60
+ }
61
+ export interface DomainTemplate {
62
+ name: string;
63
+ description: string;
64
+ createdAt: string | Date;
65
+ createdBy: string;
66
+ id: string;
67
+ version?: TemplateVersion;
68
+ versions?: ShortTemplateVersion[];
69
+ }
70
+
71
+ export interface CreateDomainTemplateAPIResponse {
72
+ status: number;
73
+ body: {
74
+ message: string;
75
+ template: DomainTemplate;
76
+ };
77
+ }
78
+
79
+ export interface ListDomainTemplatesAPIResponse {
80
+ status: number;
81
+ body: {
82
+ items: DomainTemplate[];
83
+ paging: {
84
+ first: string;
85
+ last: string;
86
+ next: string;
87
+ previous: string;
88
+ };
89
+ };
90
+ }
91
+
92
+ export interface ListDomainTemplatesResult {
93
+ items: DomainTemplate[];
94
+ pages: {
95
+ first: string;
96
+ last: string;
97
+ next: string;
98
+ previous: string;
99
+ };
100
+ }
101
+
102
+ export interface GetDomainTemplateAPIResponse {
103
+ status: number;
104
+ body: {
105
+ template: DomainTemplate;
106
+ };
107
+ }
108
+
109
+ export interface UpdateOrDeleteDomainTemplateAPIResponse {
110
+ status: number;
111
+ body: {
112
+ message: string;
113
+ template: {
114
+ name: string
115
+ }
116
+ };
117
+ }
118
+
119
+ export interface UpdateOrDeleteDomainTemplateResult {
120
+ status: number;
121
+ message: string;
122
+ templateName?: string;
123
+ }
124
+
125
+ export interface NotificationAPIResponse {
126
+ status: number;
127
+ body: {
128
+ message: string;
129
+ };
130
+ }
131
+
132
+ export interface NotificationResult {
133
+ status: number;
134
+ message: string;
135
+ }
136
+
137
+ export interface CreateDomainTemplateVersionAPIResponse {
138
+ status: number;
139
+ body: {
140
+ message: string;
141
+ template: DomainTemplate;
142
+ };
143
+ }
144
+
145
+ export interface CreateDomainTemplateVersionResult {
146
+ status: number;
147
+ message: string;
148
+ template: DomainTemplate;
149
+ }
150
+
151
+ export interface MutateDomainTemplateVersionAPIResponse {
152
+ status: number;
153
+ body: {
154
+ message: string;
155
+ template: {
156
+ name: string;
157
+ version: {
158
+ tag: string;
159
+ }
160
+ };
161
+ };
162
+ }
163
+
164
+ export interface MutateDomainTemplateVersionResult {
165
+ status: number;
166
+ message: string;
167
+ templateName: string;
168
+ templateVersion: {
169
+ tag: string;
170
+ }
171
+ }
172
+
173
+ export interface ListDomainTemplateVersionsAPIResponse {
174
+ status: number;
175
+ body: {
176
+ template: {
177
+ name: string;
178
+ description: string;
179
+ createdAt: string;
180
+ createdBy: string;
181
+ id: string;
182
+ versions: ShortTemplateVersion[]
183
+ }
184
+ paging: {
185
+ first: string;
186
+ last: string;
187
+ next: string;
188
+ previous: string;
189
+ };
190
+ };
191
+ }
192
+
193
+ export interface ListDomainTemplateVersionsResult {
194
+ template: DomainTemplateItem;
195
+ pages: {
196
+ first: string;
197
+ last: string;
198
+ next: string;
199
+ previous: string;
200
+ };
201
+ }
202
+
203
+ export interface IDomainTemplatesClient {
204
+ list(domain: string, query?: DomainTemplatesQuery): Promise<ListDomainTemplatesResult>
205
+ get(domain: string, templateName: string): Promise<DomainTemplateItem>
206
+ create(domain: string, data: DomainTemplateData): Promise<DomainTemplateItem>
207
+ update(
208
+ domain: string,
209
+ templateName: string,
210
+ data: DomainTemplateUpdateData
211
+ ): Promise<UpdateOrDeleteDomainTemplateResult>
212
+ destroy(domain: string, templateName: string): Promise<UpdateOrDeleteDomainTemplateResult>
213
+ destroyAll(domain: string): Promise<NotificationResult>
214
+ createVersion(
215
+ domain: string,
216
+ templateName: string,
217
+ data: DomainTemplateVersionData
218
+ ) : Promise<CreateDomainTemplateVersionResult>
219
+ getVersion(domain: string, templateName: string, tag: string): Promise<DomainTemplateItem>
220
+ updateVersion(
221
+ domain: string,
222
+ templateName: string,
223
+ tag: string,
224
+ data: DomainTemplateUpdateVersionData
225
+ ): Promise<MutateDomainTemplateVersionResult>
226
+ destroyVersion(
227
+ domain: string,
228
+ templateName: string,
229
+ tag: string): Promise<MutateDomainTemplateVersionResult>
230
+ listVersions(
231
+ domain: string,
232
+ templateName: string,
233
+ query?: DomainTemplatesQuery): Promise<ListDomainTemplateVersionsResult>
234
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "mailgun.js",
3
- "version": "4.1.2",
3
+ "version": "4.1.3",
4
4
  "main": "dist/mailgun.node.js",
5
5
  "browser": "dist/mailgun.web.js",
6
6
  "types": "dist/index.d.ts",
@@ -23,7 +23,7 @@
23
23
  "build:release": "webpack --config ./webpack/webpack.release.config.js --progress --color",
24
24
  "start": "webpack --watch --config ./webpack/webpack.dev.config.js --progress --color",
25
25
  "release": "standard-version -a",
26
- "test": "multi='dot=- xunit=./results.xml' mocha -t 10000 -R mocha-multi -r ts-node/register test/*.test.ts",
26
+ "test": "multi='dot=- xunit=./results.xml' nyc mocha -t 10000 -R mocha-multi -r ts-node/register test/*.test.ts",
27
27
  "test-watch": "mocha -r ts-node/register -w -R dot test/*.test.ts",
28
28
  "docs": "typedoc --tsconfig ./tsconfig.json",
29
29
  "lint": "eslint . && eslint . --ext .ts",
@@ -63,6 +63,7 @@
63
63
  "mocha": "^9.1.3",
64
64
  "mocha-multi": "^1.1.3",
65
65
  "nock": "^13.0.4",
66
+ "nyc": "^15.1.0",
66
67
  "path-browserify": "^1.0.1",
67
68
  "standard-version": "^9.3.1",
68
69
  "terser-webpack-plugin": "^5.2.0",
@@ -14,6 +14,7 @@ import {
14
14
  UpdatedDKIMAuthority,
15
15
  UpdatedDKIMSelectorResponse, UpdatedWebPrefixResponse
16
16
  } from '../lib/interfaces/Domains';
17
+ import DomainTemplatesClient from '../lib/domainsTemplates';
17
18
 
18
19
  // TODO: fix types
19
20
  describe('DomainClient', function () {
@@ -23,7 +24,8 @@ describe('DomainClient', function () {
23
24
  beforeEach(function () {
24
25
  const reqObject = new Request({ url: 'https://api.mailgun.net' } as RequestOptions, formData as InputFormData);
25
26
  const domainCredentialsClient = new DomainCredentialsClient(reqObject);
26
- client = new DomainClient(reqObject, domainCredentialsClient);
27
+ const domainTemplatesClient = new DomainTemplatesClient(reqObject);
28
+ client = new DomainClient(reqObject, domainCredentialsClient, domainTemplatesClient);
27
29
  api = nock('https://api.mailgun.net');
28
30
  });
29
31