mailgun.js 3.5.8 → 3.7.0

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.
Files changed (71) hide show
  1. package/.eslintrc +27 -11
  2. package/CHANGELOG.md +35 -0
  3. package/README.md +138 -50
  4. package/commitlint.config.js +1 -2
  5. package/dist/index.d.ts +1 -1
  6. package/dist/lib/client.d.ts +1 -1
  7. package/dist/lib/events.d.ts +9 -25
  8. package/dist/lib/interfaces/APIErrorOptions.d.ts +2 -1
  9. package/dist/lib/interfaces/ApiResponse.d.ts +2 -1
  10. package/dist/lib/interfaces/Events.d.ts +24 -0
  11. package/dist/lib/interfaces/IpPools.d.ts +12 -0
  12. package/dist/lib/interfaces/Options.d.ts +2 -1
  13. package/dist/lib/interfaces/RequestOptions.d.ts +2 -1
  14. package/dist/lib/interfaces/StatsOptions.d.ts +2 -1
  15. package/dist/lib/interfaces/mailListMembers.d.ts +6 -6
  16. package/dist/lib/ip-pools.d.ts +11 -14
  17. package/dist/lib/ips.d.ts +6 -6
  18. package/dist/lib/messages.d.ts +1 -1
  19. package/dist/lib/suppressions.d.ts +1 -1
  20. package/dist/mailgun.node.js +3 -0
  21. package/dist/{mailgun.js.LICENSE.txt → mailgun.node.js.LICENSE.txt} +1 -1
  22. package/dist/mailgun.web.js +3 -0
  23. package/dist/mailgun.web.js.LICENSE.txt +7 -0
  24. package/examples/addresses.js +1 -0
  25. package/examples/list-domains.js +1 -0
  26. package/examples/send-email.js +1 -0
  27. package/index.ts +1 -1
  28. package/lib/client.ts +3 -2
  29. package/lib/events.ts +21 -19
  30. package/lib/interfaces/APIErrorOptions.ts +3 -1
  31. package/lib/interfaces/ApiResponse.ts +3 -1
  32. package/lib/interfaces/Events.ts +25 -0
  33. package/lib/interfaces/IFormData.ts +4 -3
  34. package/lib/interfaces/IpPools.ts +16 -1
  35. package/lib/interfaces/Ips.ts +1 -0
  36. package/lib/interfaces/Options.ts +5 -2
  37. package/lib/interfaces/RequestOptions.ts +4 -2
  38. package/lib/interfaces/StatsOptions.ts +4 -2
  39. package/lib/interfaces/Supressions.ts +1 -1
  40. package/lib/interfaces/lists.ts +1 -0
  41. package/lib/interfaces/mailListMembers.ts +18 -12
  42. package/lib/interfaces/routes.ts +1 -0
  43. package/lib/ip-pools.ts +8 -7
  44. package/lib/ips.ts +3 -3
  45. package/lib/lists.ts +1 -1
  46. package/lib/messages.ts +1 -1
  47. package/lib/parse.ts +4 -3
  48. package/lib/stats.ts +3 -2
  49. package/lib/suppressions.ts +16 -11
  50. package/lib/validate.ts +0 -1
  51. package/package.json +10 -10
  52. package/test/client.test.ts +7 -2
  53. package/test/events.test.ts +1 -2
  54. package/test/ips.test.ts +2 -1
  55. package/test/lists.test.ts +5 -7
  56. package/test/mailListMembers.test.ts +47 -43
  57. package/test/messageAttachment.test.ts +3 -4
  58. package/test/messages.test.ts +1 -1
  59. package/test/parse.test.ts +2 -2
  60. package/test/routes.test.ts +1 -0
  61. package/test/stats.test.ts +1 -1
  62. package/test/suppressions.test.ts +12 -10
  63. package/test/validate.test.ts +1 -1
  64. package/test/webhooks.test.ts +1 -2
  65. package/tsconfig.webpack.json +1 -1
  66. package/webpack/webpack.common.config.js +47 -0
  67. package/webpack/webpack.dev.config.js +18 -0
  68. package/webpack/webpack.release.config.js +37 -0
  69. package/dist/mailgun.js +0 -3
  70. package/webpack.config.js +0 -49
  71. package/webpack.release.config.js +0 -29
@@ -1,6 +1,5 @@
1
- const formData = require('form-data');
2
-
3
1
  import nock from 'nock';
2
+ import formData from 'form-data';
4
3
  import Request from '../lib/request';
5
4
  import RequestOptions from '../lib/interfaces/RequestOptions';
6
5
  import MailListMembers from '../lib/mailListMembers';
@@ -20,7 +19,7 @@ describe('mailListsMembersClient', function () {
20
19
  name: 'test name',
21
20
  subscribed: true,
22
21
  vars: { gender: 'female', age: 0 }
23
- } as MailListMember
22
+ } as MailListMember;
24
23
  });
25
24
 
26
25
  afterEach(function () {
@@ -58,7 +57,7 @@ describe('mailListsMembersClient', function () {
58
57
 
59
58
  describe('createMember', function () {
60
59
  it('adds list member to the mailing list ', function () {
61
- const member:any = {...defaultListMember};
60
+ const member:any = { ...defaultListMember };
62
61
  member.subscribed = true;
63
62
  const mailingListAddress = 'testingMailingListAddress@example.com';
64
63
  api.post(`/v3/lists/${mailingListAddress}/members`).reply(200, {
@@ -67,12 +66,12 @@ describe('mailListsMembersClient', function () {
67
66
 
68
67
  return client.createMember(mailingListAddress, member).then(function (newListMember:any) {
69
68
  newListMember.should.eql(member);
70
- })
69
+ });
71
70
  });
72
71
 
73
72
  it('works with string value in subscribed field', function () {
74
- const member:any = {...defaultListMember};
75
- member.subscribed = "yes";
73
+ const member:any = { ...defaultListMember };
74
+ member.subscribed = 'yes';
76
75
  const mailingListAddress = 'testingMailingListAddress@example.com';
77
76
  api.post(`/v3/lists/${mailingListAddress}/members`).reply(200, {
78
77
  member
@@ -80,13 +79,13 @@ describe('mailListsMembersClient', function () {
80
79
 
81
80
  return client.createMember(mailingListAddress, member).then(function (newListMember:any) {
82
81
  newListMember.should.eql(member);
83
- })
82
+ });
84
83
  });
85
84
  });
86
85
 
87
86
  describe('createMembers', function () {
88
- const mailingListAddress : string = 'testingMailingListAddress@example.com';
89
- let response : NewMultipleMembersResponse;
87
+ const mailingListAddress = 'testingMailingListAddress@example.com';
88
+ let response : NewMultipleMembersResponse;
90
89
 
91
90
  beforeEach(function () {
92
91
  response = {
@@ -106,55 +105,55 @@ describe('mailListsMembersClient', function () {
106
105
 
107
106
  it('adds list of members to the mailing list', function () {
108
107
  const newMembersListPlaceholder = new Array(5).fill(0);
109
- const newMembersList = newMembersListPlaceholder.map((_, index)=>{
110
- return {
111
- address: `test${index}@example.com`,
112
- name: `test name ${index}`,
113
- vars: {gender:"female", age:index},
114
- subscribed: true,
115
- upsert: 'yes'
116
- };
117
- });
108
+ const newMembersList = newMembersListPlaceholder.map((_, index) => ({
109
+ address: `test${index}@example.com`,
110
+ name: `test name ${index}`,
111
+ vars: { gender: 'female', age: index },
112
+ subscribed: true,
113
+ upsert: 'yes'
114
+ }));
118
115
 
119
116
  api.post(`/v3/lists/${mailingListAddress}/members.json`).reply(200, response);
120
117
 
121
118
  return client.createMembers(mailingListAddress, {
122
119
  members: newMembersList,
123
- upsert: "yes"
120
+ upsert: 'yes'
124
121
  }).then(function (result: NewMultipleMembersResponse) {
125
122
  result.should.eql(response);
126
- })
123
+ });
127
124
  });
128
125
 
129
126
  it('works with string value in members field', function () {
130
127
  const newMembersListPlaceholder = new Array(5).fill(0);
131
- const newMembersList = newMembersListPlaceholder.map((_, index)=>{
132
- return {
133
- address: `test${index}@example.com`,
134
- name: `test name ${index}`,
135
- vars: JSON.stringify({gender:"female", age:index}),
136
- subscribed: true,
137
- upsert: 'yes'
138
- };
139
- });
128
+ const newMembersList = newMembersListPlaceholder.map((_, index) => ({
129
+ address: `test${index}@example.com`,
130
+ name: `test name ${index}`,
131
+ vars: JSON.stringify({ gender: 'female', age: index }),
132
+ subscribed: true,
133
+ upsert: 'yes'
134
+
135
+ }));
140
136
  api.post(`/v3/lists/${mailingListAddress}/members.json`).reply(200, response);
141
137
  return client.createMembers(mailingListAddress, {
142
138
  members: newMembersList,
143
- upsert: "yes"
139
+ upsert: 'yes'
144
140
  }).then(function (result: NewMultipleMembersResponse) {
145
141
  result.should.eql(response);
146
- })
142
+ });
147
143
  });
148
-
149
144
  });
150
145
 
151
146
  describe('updateMember', function () {
152
147
  it('updates list member in the mailing list ', function () {
153
148
  const mailingListAddress = 'testingMailingListAddress@example.com';
154
149
  const mailingListMemberAddress = 'testingMailingListMemberAddress@example.com';
155
- api.put(`/v3/lists/${mailingListAddress}/members/${mailingListMemberAddress}`).reply(200, {member: defaultListMember});
150
+ api.put(`/v3/lists/${mailingListAddress}/members/${mailingListMemberAddress}`).reply(200, { member: defaultListMember });
156
151
 
157
- return client.updateMember(mailingListAddress, mailingListMemberAddress, defaultListMember).then(function (res: MailListMember) {
152
+ return client.updateMember(
153
+ mailingListAddress,
154
+ mailingListMemberAddress,
155
+ defaultListMember
156
+ ).then(function (res: MailListMember) {
158
157
  res.should.eql(defaultListMember);
159
158
  });
160
159
  });
@@ -162,32 +161,37 @@ describe('mailListsMembersClient', function () {
162
161
  it('works with string value in subscribed field', function () {
163
162
  const mailingListAddress = 'testingMailingListAddress@example.com';
164
163
  const mailingListMemberAddress = 'testingMailingListMemberAddress@example.com';
165
- const member:any = {...defaultListMember};
166
- member.subscribed = "yes";
167
- api.put(`/v3/lists/${mailingListAddress}/members/${mailingListMemberAddress}`).reply(200, {member: defaultListMember});
164
+ const member: any = { ...defaultListMember };
165
+ member.subscribed = 'yes';
166
+ api.put(`/v3/lists/${mailingListAddress}/members/${mailingListMemberAddress}`).reply(200, { member: defaultListMember });
168
167
 
169
- return client.updateMember(mailingListAddress, mailingListMemberAddress, member).then(function (res: MailListMember) {
168
+ return client.updateMember(
169
+ mailingListAddress,
170
+ mailingListMemberAddress,
171
+ member
172
+ ).then(function (res: MailListMember) {
170
173
  res.should.eql(defaultListMember);
171
174
  });
172
175
  });
173
176
  });
174
177
 
175
178
  describe('destroyMember', function () {
176
-
177
179
  it('deletes member from the list ', function () {
178
180
  const mailingListAddress = 'testingMailingListAddress@example.com';
179
181
  const mailingListMemberAddress = 'testingMailingListMemberAddress@example.com';
180
182
  const res = {
181
183
  member: defaultListMember,
182
- message: "deleted"
184
+ message: 'deleted'
183
185
  } as DeletedMember;
184
186
 
185
187
  api.delete(`/v3/lists/${mailingListAddress}/members/${mailingListMemberAddress}`).reply(200, res);
186
188
 
187
- return client.destroyMember(mailingListAddress, mailingListMemberAddress).then(function (deletedMemberRes: DeletedMember) {
189
+ return client.destroyMember(
190
+ mailingListAddress,
191
+ mailingListMemberAddress
192
+ ).then(function (deletedMemberRes: DeletedMember) {
188
193
  deletedMemberRes.should.eql(res);
189
194
  });
190
195
  });
191
196
  });
192
-
193
197
  });
@@ -1,12 +1,11 @@
1
- const formData = require('form-data'); // importing this way to not have type error in line 13
2
-
3
1
  import fs from 'fs';
4
2
  import nock from 'nock';
3
+ import { expect } from 'chai';
4
+ import formData from 'form-data';
5
5
 
6
6
  import Request from '../lib/request';
7
7
  import MessagesClient from '../lib/messages';
8
8
  import RequestOptions from '../lib/interfaces/RequestOptions';
9
- import { expect } from 'chai';
10
9
 
11
10
  const mailgunLogo = fs.createReadStream(`${__dirname}/img/mailgun.png`);
12
11
 
@@ -42,7 +41,7 @@ describe('MessagesClient', function () {
42
41
  filename: 'test-image',
43
42
  data: mailgunLogo
44
43
  }]
45
- })
44
+ });
46
45
 
47
46
  expect(res.message).to.eql('Queued. Thank you.');
48
47
  });
@@ -1,4 +1,4 @@
1
- const formData = require('form-data'); // importing this way to not have type error in line 13
1
+ import formData from 'form-data'; // importing this way to not have type error in line 13
2
2
 
3
3
  import fs from 'fs';
4
4
  import nock from 'nock';
@@ -1,4 +1,4 @@
1
- const formData = require('form-data');
1
+ import formData from 'form-data';
2
2
 
3
3
  import { URLSearchParams } from 'url';
4
4
  import nock from 'nock';
@@ -10,7 +10,7 @@ import RequestOptions from '../lib/interfaces/RequestOptions';
10
10
  interface Data {
11
11
  parsed: string[],
12
12
  unparseable: string[]
13
- };
13
+ }
14
14
 
15
15
  describe('ParseClient', function () {
16
16
  let client: any;
@@ -1,3 +1,4 @@
1
+ /* eslint-disable camelcase */
1
2
  import formData from 'form-data';
2
3
  import nock from 'nock';
3
4
  import Request from '../lib/request';
@@ -1,4 +1,4 @@
1
- const formData = require('form-data');
1
+ import formData from 'form-data';
2
2
 
3
3
  import nock from 'nock';
4
4
  import Request from '../lib/request';
@@ -1,11 +1,13 @@
1
- const should = require('should');
2
- const formData = require('form-data');
3
-
1
+ import chai, { expect } from 'chai';
2
+ import formData from 'form-data';
4
3
  import nock from 'nock';
4
+
5
5
  import Request from '../lib/request';
6
6
  import SuppressionClient from '../lib/suppressions';
7
7
  import RequestOptions from '../lib/interfaces/RequestOptions';
8
8
 
9
+ chai.should();
10
+
9
11
  describe('SuppressionsClient', function () {
10
12
  let client: any;
11
13
  let api: any;
@@ -80,7 +82,7 @@ describe('SuppressionsClient', function () {
80
82
  api.get('/v3/domain.com/unsubscribes').reply(200, response);
81
83
 
82
84
  return client.list('domain.com', 'unsubscribes')
83
- .then(function (unsubscribes: { items: any }) {
85
+ .then(function (unsubscribes: { items: any }) {
84
86
  let u;
85
87
 
86
88
  u = unsubscribes.items[0];
@@ -129,22 +131,22 @@ describe('SuppressionsClient', function () {
129
131
 
130
132
  page = bounces.pages.first;
131
133
  page.url.should.eql('https://api.mailgun.net/v3/mailgun.com/bounces?page=first');
132
- should(page.page).eql('first');
133
- should(page.address).eql(undefined);
134
+ expect(page.page).to.eql('first');
135
+ expect(page.address).to.be.eql(undefined);
134
136
 
135
137
  page = bounces.pages.last;
136
138
  page.url.should.eql('https://api.mailgun.net/v3/mailgun.com/bounces?page=last');
137
- should(page.page).eql('last');
138
- should(page.address).eql(undefined);
139
+ expect(page.page).to.be.eql('last');
140
+ expect(page.address).to.be.eql(undefined);
139
141
 
140
142
  page = bounces.pages.next;
141
143
  page.url.should.eql('https://api.mailgun.net/v3/mailgun.com/bounces?page=next&address=next@mailgun.com');
142
- should(page.page).eql('next');
144
+ expect(page.page).to.be.eql('next');
143
145
  page.address.should.eql('next@mailgun.com');
144
146
 
145
147
  page = bounces.pages.previous;
146
148
  page.url.should.eql('https://api.mailgun.net/v3/mailgun.com/bounces?page=previous&address=previous@mailgun.com');
147
- should(page.page).eql('previous');
149
+ expect(page.page).to.be.eql('previous');
148
150
  page.address.should.eql('previous@mailgun.com');
149
151
  });
150
152
  });
@@ -1,4 +1,4 @@
1
- const formData = require('form-data');
1
+ import formData from 'form-data';
2
2
 
3
3
  import nock from 'nock';
4
4
  import Request from '../lib/request';
@@ -1,5 +1,4 @@
1
- const formData = require('form-data');
2
-
1
+ import formData from 'form-data';
3
2
  import nock from 'nock';
4
3
  import Request from '../lib/request';
5
4
  import WebhookClient from '../lib/webhooks';
@@ -7,4 +7,4 @@
7
7
  "**/*.test.ts",
8
8
  "node_modules"
9
9
  ]
10
- }
10
+ }
@@ -0,0 +1,47 @@
1
+ const webpack = require('webpack');
2
+ const path = require('path');
3
+ const pkg = require('../package.json');
4
+
5
+ const SRC_DIR = path.join(__dirname, '../');
6
+
7
+ const outputDir = 'dist';
8
+ const commonConfig = {
9
+ mode: 'development',
10
+ context: SRC_DIR,
11
+ entry: {
12
+ mailgun: path.join(SRC_DIR, 'index.ts'),
13
+ 'mailgun.min': path.join(SRC_DIR, 'index.ts')
14
+ },
15
+ output: {
16
+ path: path.join(SRC_DIR, outputDir),
17
+ filename: 'mailgun.js',
18
+ library: 'mailgun',
19
+ libraryTarget: 'umd',
20
+ globalObject: 'this',
21
+ },
22
+ module: {
23
+ rules: [
24
+ {
25
+ test: /\.(ts|js)?/,
26
+ use: [
27
+ {
28
+ loader: 'babel-loader',
29
+ },
30
+ {
31
+ loader: `ts-loader?configFile=${path.join(SRC_DIR, 'tsconfig.webpack.json')}`
32
+ }
33
+ ],
34
+ exclude: /(node_modules|test)/
35
+ }
36
+ ]
37
+ },
38
+ plugins: [
39
+ new webpack.BannerPlugin(`${pkg.name} v${pkg.version}`)
40
+ ],
41
+ resolve: {
42
+ extensions: ['.ts', '.js', '.json']
43
+ },
44
+ devtool: 'inline-source-map'
45
+ };
46
+
47
+ module.exports = commonConfig;
@@ -0,0 +1,18 @@
1
+ const { merge } = require('webpack-merge');
2
+ const commonConfig = require('./webpack.common.config');
3
+
4
+ const nodeConf = merge(commonConfig, {
5
+ target: 'node',
6
+ output: {
7
+ filename: 'mailgun.node.js'
8
+ }
9
+ });
10
+
11
+ const webConf = merge(commonConfig, {
12
+ target: 'web',
13
+ output: {
14
+ filename: 'mailgun.web.js'
15
+ }
16
+ });
17
+
18
+ module.exports = [nodeConf, webConf];
@@ -0,0 +1,37 @@
1
+ /* eslint-disable import/no-extraneous-dependencies */
2
+ /* eslint-disable @typescript-eslint/no-var-requires */
3
+
4
+ const TerserPlugin = require('terser-webpack-plugin');
5
+ const { merge } = require('webpack-merge');
6
+ const baseConfig = require('./webpack.common.config');
7
+
8
+ const productionConfig = merge(baseConfig, {
9
+ mode: 'production',
10
+ devtool: undefined,
11
+ optimization: {
12
+ minimize: true,
13
+ minimizer: [
14
+ new TerserPlugin({
15
+ parallel: true,
16
+ terserOptions: {
17
+ keep_classnames: true,
18
+ }
19
+ }),
20
+ ],
21
+ },
22
+ });
23
+
24
+ const nodeConf = merge(productionConfig, {
25
+ target: 'node',
26
+ output: {
27
+ filename: 'mailgun.node.js'
28
+ }
29
+ });
30
+
31
+ const webConf = merge(productionConfig, {
32
+ target: 'web',
33
+ output: {
34
+ filename: 'mailgun.web.js'
35
+ }
36
+ });
37
+ module.exports = [nodeConf, webConf];