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.
- package/.eslintrc +27 -11
- package/CHANGELOG.md +35 -0
- package/README.md +138 -50
- package/commitlint.config.js +1 -2
- package/dist/index.d.ts +1 -1
- package/dist/lib/client.d.ts +1 -1
- package/dist/lib/events.d.ts +9 -25
- package/dist/lib/interfaces/APIErrorOptions.d.ts +2 -1
- package/dist/lib/interfaces/ApiResponse.d.ts +2 -1
- package/dist/lib/interfaces/Events.d.ts +24 -0
- package/dist/lib/interfaces/IpPools.d.ts +12 -0
- package/dist/lib/interfaces/Options.d.ts +2 -1
- package/dist/lib/interfaces/RequestOptions.d.ts +2 -1
- package/dist/lib/interfaces/StatsOptions.d.ts +2 -1
- package/dist/lib/interfaces/mailListMembers.d.ts +6 -6
- package/dist/lib/ip-pools.d.ts +11 -14
- package/dist/lib/ips.d.ts +6 -6
- package/dist/lib/messages.d.ts +1 -1
- package/dist/lib/suppressions.d.ts +1 -1
- package/dist/mailgun.node.js +3 -0
- package/dist/{mailgun.js.LICENSE.txt → mailgun.node.js.LICENSE.txt} +1 -1
- package/dist/mailgun.web.js +3 -0
- package/dist/mailgun.web.js.LICENSE.txt +7 -0
- package/examples/addresses.js +1 -0
- package/examples/list-domains.js +1 -0
- package/examples/send-email.js +1 -0
- package/index.ts +1 -1
- package/lib/client.ts +3 -2
- package/lib/events.ts +21 -19
- package/lib/interfaces/APIErrorOptions.ts +3 -1
- package/lib/interfaces/ApiResponse.ts +3 -1
- package/lib/interfaces/Events.ts +25 -0
- package/lib/interfaces/IFormData.ts +4 -3
- package/lib/interfaces/IpPools.ts +16 -1
- package/lib/interfaces/Ips.ts +1 -0
- package/lib/interfaces/Options.ts +5 -2
- package/lib/interfaces/RequestOptions.ts +4 -2
- package/lib/interfaces/StatsOptions.ts +4 -2
- package/lib/interfaces/Supressions.ts +1 -1
- package/lib/interfaces/lists.ts +1 -0
- package/lib/interfaces/mailListMembers.ts +18 -12
- package/lib/interfaces/routes.ts +1 -0
- package/lib/ip-pools.ts +8 -7
- package/lib/ips.ts +3 -3
- package/lib/lists.ts +1 -1
- package/lib/messages.ts +1 -1
- package/lib/parse.ts +4 -3
- package/lib/stats.ts +3 -2
- package/lib/suppressions.ts +16 -11
- package/lib/validate.ts +0 -1
- package/package.json +10 -10
- package/test/client.test.ts +7 -2
- package/test/events.test.ts +1 -2
- package/test/ips.test.ts +2 -1
- package/test/lists.test.ts +5 -7
- package/test/mailListMembers.test.ts +47 -43
- package/test/messageAttachment.test.ts +3 -4
- package/test/messages.test.ts +1 -1
- package/test/parse.test.ts +2 -2
- package/test/routes.test.ts +1 -0
- package/test/stats.test.ts +1 -1
- package/test/suppressions.test.ts +12 -10
- package/test/validate.test.ts +1 -1
- package/test/webhooks.test.ts +1 -2
- package/tsconfig.webpack.json +1 -1
- package/webpack/webpack.common.config.js +47 -0
- package/webpack/webpack.dev.config.js +18 -0
- package/webpack/webpack.release.config.js +37 -0
- package/dist/mailgun.js +0 -3
- package/webpack.config.js +0 -49
- 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 =
|
|
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
|
|
89
|
-
let
|
|
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
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
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:
|
|
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
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
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:
|
|
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(
|
|
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 =
|
|
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(
|
|
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:
|
|
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(
|
|
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
|
});
|
package/test/messages.test.ts
CHANGED
package/test/parse.test.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
|
|
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;
|
package/test/routes.test.ts
CHANGED
package/test/stats.test.ts
CHANGED
|
@@ -1,11 +1,13 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
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
|
-
|
|
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
|
-
|
|
133
|
-
|
|
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
|
-
|
|
138
|
-
|
|
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
|
-
|
|
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
|
-
|
|
149
|
+
expect(page.page).to.be.eql('previous');
|
|
148
150
|
page.address.should.eql('previous@mailgun.com');
|
|
149
151
|
});
|
|
150
152
|
});
|
package/test/validate.test.ts
CHANGED
package/test/webhooks.test.ts
CHANGED
package/tsconfig.webpack.json
CHANGED
|
@@ -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];
|