@teleporthq/teleport-plugin-next-workflows 0.44.9 → 0.44.10
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/__tests__/ai-error-contract.test.ts +10 -0
- package/__tests__/continue-on-error.test.ts +27 -0
- package/__tests__/email-node-recipients.test.ts +288 -0
- package/__tests__/sent-email-log-module.test.ts +54 -0
- package/dist/cjs/executor-generator.d.ts.map +1 -1
- package/dist/cjs/executor-generator.js +4 -1
- package/dist/cjs/executor-generator.js.map +1 -1
- package/dist/cjs/nodes/email/email-mailersend.d.ts.map +1 -1
- package/dist/cjs/nodes/email/email-mailersend.js +55 -48
- package/dist/cjs/nodes/email/email-mailersend.js.map +1 -1
- package/dist/cjs/nodes/email/email-mailgun.d.ts.map +1 -1
- package/dist/cjs/nodes/email/email-mailgun.js +44 -32
- package/dist/cjs/nodes/email/email-mailgun.js.map +1 -1
- package/dist/cjs/nodes/email/email-postmark.d.ts.map +1 -1
- package/dist/cjs/nodes/email/email-postmark.js +44 -31
- package/dist/cjs/nodes/email/email-postmark.js.map +1 -1
- package/dist/cjs/nodes/email/email-recipients.d.ts +28 -0
- package/dist/cjs/nodes/email/email-recipients.d.ts.map +1 -0
- package/dist/cjs/nodes/email/email-recipients.js +74 -0
- package/dist/cjs/nodes/email/email-recipients.js.map +1 -0
- package/dist/cjs/nodes/email/email-resend.d.ts.map +1 -1
- package/dist/cjs/nodes/email/email-resend.js +42 -28
- package/dist/cjs/nodes/email/email-resend.js.map +1 -1
- package/dist/cjs/nodes/email/email-sendgrid.d.ts.map +1 -1
- package/dist/cjs/nodes/email/email-sendgrid.js +56 -41
- package/dist/cjs/nodes/email/email-sendgrid.js.map +1 -1
- package/dist/cjs/sent-email-log/sent-email-log-code.d.ts.map +1 -1
- package/dist/cjs/sent-email-log/sent-email-log-code.js +17 -1
- package/dist/cjs/sent-email-log/sent-email-log-code.js.map +1 -1
- package/dist/cjs/tsconfig.tsbuildinfo +1 -1
- package/dist/esm/executor-generator.d.ts.map +1 -1
- package/dist/esm/executor-generator.js +4 -1
- package/dist/esm/executor-generator.js.map +1 -1
- package/dist/esm/nodes/email/email-mailersend.d.ts.map +1 -1
- package/dist/esm/nodes/email/email-mailersend.js +55 -48
- package/dist/esm/nodes/email/email-mailersend.js.map +1 -1
- package/dist/esm/nodes/email/email-mailgun.d.ts.map +1 -1
- package/dist/esm/nodes/email/email-mailgun.js +44 -32
- package/dist/esm/nodes/email/email-mailgun.js.map +1 -1
- package/dist/esm/nodes/email/email-postmark.d.ts.map +1 -1
- package/dist/esm/nodes/email/email-postmark.js +44 -31
- package/dist/esm/nodes/email/email-postmark.js.map +1 -1
- package/dist/esm/nodes/email/email-recipients.d.ts +28 -0
- package/dist/esm/nodes/email/email-recipients.d.ts.map +1 -0
- package/dist/esm/nodes/email/email-recipients.js +71 -0
- package/dist/esm/nodes/email/email-recipients.js.map +1 -0
- package/dist/esm/nodes/email/email-resend.d.ts.map +1 -1
- package/dist/esm/nodes/email/email-resend.js +42 -28
- package/dist/esm/nodes/email/email-resend.js.map +1 -1
- package/dist/esm/nodes/email/email-sendgrid.d.ts.map +1 -1
- package/dist/esm/nodes/email/email-sendgrid.js +56 -41
- package/dist/esm/nodes/email/email-sendgrid.js.map +1 -1
- package/dist/esm/sent-email-log/sent-email-log-code.d.ts.map +1 -1
- package/dist/esm/sent-email-log/sent-email-log-code.js +17 -1
- package/dist/esm/sent-email-log/sent-email-log-code.js.map +1 -1
- package/dist/esm/tsconfig.tsbuildinfo +1 -1
- package/package.json +2 -2
- package/src/executor-generator.ts +4 -1
- package/src/nodes/email/email-mailersend.ts +72 -55
- package/src/nodes/email/email-mailgun.ts +51 -36
- package/src/nodes/email/email-postmark.ts +51 -35
- package/src/nodes/email/email-recipients.ts +86 -0
- package/src/nodes/email/email-resend.ts +49 -31
- package/src/nodes/email/email-sendgrid.ts +63 -44
- package/src/sent-email-log/sent-email-log-code.ts +17 -1
|
@@ -54,6 +54,16 @@ describe('isFatalNodeResult — error contract normalization', () => {
|
|
|
54
54
|
expect(utils.isFatalNodeResult({ success: false })).toBeTruthy()
|
|
55
55
|
})
|
|
56
56
|
|
|
57
|
+
it('lets a result that says success: true through, even one carrying an error note', () => {
|
|
58
|
+
expect(
|
|
59
|
+
utils.isFatalNodeResult({
|
|
60
|
+
id: 're-1',
|
|
61
|
+
success: true,
|
|
62
|
+
error: 'refused for blocked@lumen.test (only the owner)',
|
|
63
|
+
})
|
|
64
|
+
).toBeFalsy()
|
|
65
|
+
})
|
|
66
|
+
|
|
57
67
|
it('does not flag successful results', () => {
|
|
58
68
|
expect(utils.isFatalNodeResult({ result: 'ok' })).toBeFalsy()
|
|
59
69
|
expect(utils.isFatalNodeResult({ error: false })).toBeFalsy()
|
|
@@ -102,6 +102,33 @@ describe('executeNodes — a refused result on a continueOnError node', () => {
|
|
|
102
102
|
})
|
|
103
103
|
})
|
|
104
104
|
|
|
105
|
+
describe('executeNodes — an email node that reached some of its recipients', () => {
|
|
106
|
+
it('reports success with the refused addresses and the chain goes on, flag or not', async () => {
|
|
107
|
+
const utils = loadSharedRuntime()
|
|
108
|
+
const partlyDelivered = {
|
|
109
|
+
id: 're-1',
|
|
110
|
+
success: true,
|
|
111
|
+
error: 'refused for blocked@lumen.test (only the owner)',
|
|
112
|
+
deliveries: [
|
|
113
|
+
{ to: 'jane@lumen.test', success: true, id: 're-1' },
|
|
114
|
+
{ to: 'blocked@lumen.test', success: false, error: 'only the owner' },
|
|
115
|
+
],
|
|
116
|
+
}
|
|
117
|
+
const ran: string[] = []
|
|
118
|
+
const handlers = {
|
|
119
|
+
'email-resend': async () => partlyDelivered,
|
|
120
|
+
'toast-show': async () => {
|
|
121
|
+
ran.push('toast')
|
|
122
|
+
return { shown: true }
|
|
123
|
+
},
|
|
124
|
+
}
|
|
125
|
+
const context: Record<string, unknown> = {}
|
|
126
|
+
await utils.executeNodes([sendNode(), afterNode], edges, context, handlers, {}, null, 'x4')
|
|
127
|
+
expect(context.send).toEqual(partlyDelivered)
|
|
128
|
+
expect(ran).toEqual(['toast'])
|
|
129
|
+
})
|
|
130
|
+
})
|
|
131
|
+
|
|
105
132
|
describe('generated server segment route', () => {
|
|
106
133
|
const segment: WorkflowSegment = {
|
|
107
134
|
id: 'server-1',
|
|
@@ -0,0 +1,288 @@
|
|
|
1
|
+
import { loadHandler } from './_helpers/load-handler'
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* A workflow email node given several recipients sends one provider call per
|
|
5
|
+
* address: a refused address (a sender that only delivers to the account
|
|
6
|
+
* owner's address, an account still pending approval) no longer blocks the
|
|
7
|
+
* others, and the result says who got the email. One recipient behaves as it
|
|
8
|
+
* always did. Executed against fake provider SDKs that refuse an address the
|
|
9
|
+
* way each real provider does.
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
const REASON = 'You can only send testing emails to your own email address'
|
|
13
|
+
const BUYER = 'buyer@lumen.test'
|
|
14
|
+
const ANA = 'ana@lumen.test'
|
|
15
|
+
const BLOCKED = 'blocked@lumen.test'
|
|
16
|
+
const BLOCKED_TOO = 'blocked-too@lumen.test'
|
|
17
|
+
|
|
18
|
+
const addressesOf = (to: unknown): string[] => {
|
|
19
|
+
const list = Array.isArray(to) ? to : String(to).split(',')
|
|
20
|
+
return list.map((entry: any) => (typeof entry === 'object' ? entry.email : String(entry).trim()))
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
const refuses = (to: unknown): boolean =>
|
|
24
|
+
addressesOf(to).some((address) => address.toLowerCase().startsWith('blocked'))
|
|
25
|
+
|
|
26
|
+
interface ProviderCall {
|
|
27
|
+
to: string[]
|
|
28
|
+
cc: string[]
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
/** Fake provider SDKs that record every call's recipients and refuse the blocked ones. */
|
|
32
|
+
const fakeSdks = (calls: ProviderCall[]): Record<string, unknown> => {
|
|
33
|
+
const record = (to: unknown, cc: unknown) => {
|
|
34
|
+
calls.push({ to: addressesOf(to), cc: cc ? addressesOf(cc) : [] })
|
|
35
|
+
return calls.length
|
|
36
|
+
}
|
|
37
|
+
const sendgrid = {
|
|
38
|
+
setApiKey: (): void => undefined,
|
|
39
|
+
send: async (msg: { to: unknown; cc?: unknown }) => {
|
|
40
|
+
const n = record(msg.to, msg.cc)
|
|
41
|
+
if (refuses(msg.to)) {
|
|
42
|
+
const err: any = new Error('Bad Request')
|
|
43
|
+
err.response = { body: { errors: [{ message: REASON }] } }
|
|
44
|
+
throw err
|
|
45
|
+
}
|
|
46
|
+
return [{ statusCode: 202, headers: { 'x-message-id': 'sg-' + n } }]
|
|
47
|
+
},
|
|
48
|
+
}
|
|
49
|
+
const chainable = () => {
|
|
50
|
+
const params: Record<string, unknown> = {}
|
|
51
|
+
for (const key of ['From', 'To', 'Subject', 'Html', 'ReplyTo', 'Cc', 'Bcc', 'Attachments']) {
|
|
52
|
+
params['set' + key] = (value: unknown) => {
|
|
53
|
+
params[key.toLowerCase()] = value
|
|
54
|
+
return params
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
return params
|
|
58
|
+
}
|
|
59
|
+
return {
|
|
60
|
+
postmark: {
|
|
61
|
+
ServerClient: function ServerClient() {
|
|
62
|
+
return {
|
|
63
|
+
sendEmail: async (payload: { To: unknown; Cc?: unknown }) => {
|
|
64
|
+
const n = record(payload.To, payload.Cc)
|
|
65
|
+
if (refuses(payload.To)) {
|
|
66
|
+
throw new Error(REASON)
|
|
67
|
+
}
|
|
68
|
+
return { MessageID: 'pm-' + n }
|
|
69
|
+
},
|
|
70
|
+
}
|
|
71
|
+
},
|
|
72
|
+
},
|
|
73
|
+
resend: {
|
|
74
|
+
Resend: function Resend() {
|
|
75
|
+
return {
|
|
76
|
+
emails: {
|
|
77
|
+
send: async (payload: {
|
|
78
|
+
to: unknown
|
|
79
|
+
cc?: unknown
|
|
80
|
+
}): Promise<{
|
|
81
|
+
data: { id: string } | null
|
|
82
|
+
error: { name: string; message: string } | null
|
|
83
|
+
}> => {
|
|
84
|
+
const n = record(payload.to, payload.cc)
|
|
85
|
+
if (refuses(payload.to)) {
|
|
86
|
+
return { data: null, error: { name: 'validation_error', message: REASON } }
|
|
87
|
+
}
|
|
88
|
+
return { data: { id: 're-' + n }, error: null }
|
|
89
|
+
},
|
|
90
|
+
},
|
|
91
|
+
}
|
|
92
|
+
},
|
|
93
|
+
},
|
|
94
|
+
'@sendgrid/mail': {
|
|
95
|
+
...sendgrid,
|
|
96
|
+
MailService: function MailService() {
|
|
97
|
+
return sendgrid
|
|
98
|
+
},
|
|
99
|
+
},
|
|
100
|
+
'mailgun.js': function Mailgun() {
|
|
101
|
+
return {
|
|
102
|
+
client: () => ({
|
|
103
|
+
messages: {
|
|
104
|
+
create: async (_domain: string, payload: { to: unknown; cc?: unknown }) => {
|
|
105
|
+
const n = record(payload.to, payload.cc)
|
|
106
|
+
if (refuses(payload.to)) {
|
|
107
|
+
throw new Error(REASON)
|
|
108
|
+
}
|
|
109
|
+
return { id: 'mg-' + n }
|
|
110
|
+
},
|
|
111
|
+
},
|
|
112
|
+
}),
|
|
113
|
+
}
|
|
114
|
+
},
|
|
115
|
+
'form-data': function FormData() {
|
|
116
|
+
return {}
|
|
117
|
+
},
|
|
118
|
+
mailersend: {
|
|
119
|
+
MailerSend: function MailerSend() {
|
|
120
|
+
return {
|
|
121
|
+
email: {
|
|
122
|
+
send: async (params: { to: unknown; cc?: unknown }) => {
|
|
123
|
+
const n = record(params.to, params.cc)
|
|
124
|
+
if (refuses(params.to)) {
|
|
125
|
+
return { statusCode: 422, body: { message: REASON } }
|
|
126
|
+
}
|
|
127
|
+
return { statusCode: 202, headers: { 'x-message-id': 'ms-' + n } }
|
|
128
|
+
},
|
|
129
|
+
},
|
|
130
|
+
}
|
|
131
|
+
},
|
|
132
|
+
Sender: function Sender(email: string, name: string) {
|
|
133
|
+
return { email, name }
|
|
134
|
+
},
|
|
135
|
+
Recipient: function Recipient(email: string, name: string) {
|
|
136
|
+
return { email, name }
|
|
137
|
+
},
|
|
138
|
+
Attachment: function Attachment() {
|
|
139
|
+
return {}
|
|
140
|
+
},
|
|
141
|
+
EmailParams: function EmailParams() {
|
|
142
|
+
return chainable()
|
|
143
|
+
},
|
|
144
|
+
},
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
// The handler loads its SDK through `__non_webpack_require__` whenever that
|
|
149
|
+
// exists, so the fakes take the SDKs' place through the same global.
|
|
150
|
+
const withSdks = async <T>(sdks: Record<string, unknown>, run: () => Promise<T>): Promise<T> => {
|
|
151
|
+
const scope = globalThis as { __non_webpack_require__?: unknown }
|
|
152
|
+
scope.__non_webpack_require__ = (id: string) => {
|
|
153
|
+
if (!(id in sdks)) {
|
|
154
|
+
throw new Error('unexpected require: ' + id)
|
|
155
|
+
}
|
|
156
|
+
return sdks[id]
|
|
157
|
+
}
|
|
158
|
+
try {
|
|
159
|
+
return await run()
|
|
160
|
+
} finally {
|
|
161
|
+
delete scope.__non_webpack_require__
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
type IdKey = 'id' | 'messageId'
|
|
166
|
+
|
|
167
|
+
const NODES: Array<[string, string, IdKey]> = [
|
|
168
|
+
['email-postmark', 'pm', 'messageId'],
|
|
169
|
+
['email-resend', 're', 'id'],
|
|
170
|
+
['email-sendgrid', 'sg', 'messageId'],
|
|
171
|
+
['email-mailgun', 'mg', 'messageId'],
|
|
172
|
+
['email-mailersend', 'ms', 'messageId'],
|
|
173
|
+
]
|
|
174
|
+
|
|
175
|
+
const baseConfig = {
|
|
176
|
+
apiKey: 'key',
|
|
177
|
+
serverToken: 'token',
|
|
178
|
+
domain: 'mg.lumen.test',
|
|
179
|
+
from: 'shop@lumen.test',
|
|
180
|
+
fromName: 'Lumen Pottery',
|
|
181
|
+
subject: 'Your order',
|
|
182
|
+
body: '<p>Thanks</p>',
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
const sendThrough = async (nodeType: string, to: unknown, extra: Record<string, unknown> = {}) => {
|
|
186
|
+
const calls: ProviderCall[] = []
|
|
187
|
+
const handler = loadHandler(nodeType)
|
|
188
|
+
const result = (await withSdks(fakeSdks(calls), () =>
|
|
189
|
+
handler({ ...baseConfig, to, ...extra }, {})
|
|
190
|
+
)) as Record<string, unknown>
|
|
191
|
+
return { calls, result }
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
describe('workflow email nodes send to each recipient separately', () => {
|
|
195
|
+
for (const [nodeType, prefix, idKey] of NODES) {
|
|
196
|
+
const idOf = (n: number) => ({ [idKey]: prefix + '-' + n })
|
|
197
|
+
|
|
198
|
+
describe(nodeType, () => {
|
|
199
|
+
it('one recipient: one provider call and the result as before', async () => {
|
|
200
|
+
const asString = await sendThrough(nodeType, BUYER)
|
|
201
|
+
expect(asString.calls).toEqual([{ to: [BUYER], cc: [] }])
|
|
202
|
+
expect(asString.result).toEqual({ ...idOf(1), success: true })
|
|
203
|
+
|
|
204
|
+
const asList = await sendThrough(nodeType, [BUYER])
|
|
205
|
+
expect(asList.calls).toEqual([{ to: [BUYER], cc: [] }])
|
|
206
|
+
expect(asList.result).toEqual({ ...idOf(1), success: true })
|
|
207
|
+
})
|
|
208
|
+
|
|
209
|
+
it('one refused recipient: the failure as before', async () => {
|
|
210
|
+
const { calls, result } = await sendThrough(nodeType, BLOCKED)
|
|
211
|
+
expect(calls).toEqual([{ to: [BLOCKED], cc: [] }])
|
|
212
|
+
expect(result).toEqual({ [idKey]: '', success: false, error: REASON })
|
|
213
|
+
})
|
|
214
|
+
|
|
215
|
+
it('several recipients, one refused: one call per address, the others delivered', async () => {
|
|
216
|
+
const { calls, result } = await sendThrough(nodeType, [BUYER, BLOCKED, ANA], {
|
|
217
|
+
cc: 'ops@lumen.test',
|
|
218
|
+
})
|
|
219
|
+
expect(calls).toEqual([
|
|
220
|
+
{ to: [BUYER], cc: ['ops@lumen.test'] },
|
|
221
|
+
{ to: [BLOCKED], cc: ['ops@lumen.test'] },
|
|
222
|
+
{ to: [ANA], cc: ['ops@lumen.test'] },
|
|
223
|
+
])
|
|
224
|
+
expect(result).toEqual({
|
|
225
|
+
...idOf(1),
|
|
226
|
+
success: true,
|
|
227
|
+
error: 'refused for ' + BLOCKED + ' (' + REASON + ')',
|
|
228
|
+
deliveries: [
|
|
229
|
+
{ to: BUYER, success: true, ...idOf(1) },
|
|
230
|
+
{ to: BLOCKED, success: false, error: REASON },
|
|
231
|
+
{ to: ANA, success: true, ...idOf(3) },
|
|
232
|
+
],
|
|
233
|
+
})
|
|
234
|
+
})
|
|
235
|
+
|
|
236
|
+
it('every recipient refused: a failed result naming each', async () => {
|
|
237
|
+
const { calls, result } = await sendThrough(nodeType, [BLOCKED, BLOCKED_TOO])
|
|
238
|
+
expect(calls).toHaveLength(2)
|
|
239
|
+
expect(result).toEqual({
|
|
240
|
+
[idKey]: '',
|
|
241
|
+
success: false,
|
|
242
|
+
error:
|
|
243
|
+
'refused for ' + BLOCKED + ' (' + REASON + '); ' + BLOCKED_TOO + ' (' + REASON + ')',
|
|
244
|
+
deliveries: [
|
|
245
|
+
{ to: BLOCKED, success: false, error: REASON },
|
|
246
|
+
{ to: BLOCKED_TOO, success: false, error: REASON },
|
|
247
|
+
],
|
|
248
|
+
})
|
|
249
|
+
})
|
|
250
|
+
|
|
251
|
+
it('drops empty entries and sends to an address once, whatever its case', async () => {
|
|
252
|
+
const { calls, result } = await sendThrough(nodeType, [
|
|
253
|
+
BUYER,
|
|
254
|
+
'',
|
|
255
|
+
'Buyer@Lumen.test',
|
|
256
|
+
null,
|
|
257
|
+
ANA,
|
|
258
|
+
])
|
|
259
|
+
expect(calls).toEqual([
|
|
260
|
+
{ to: [BUYER], cc: [] },
|
|
261
|
+
{ to: [ANA], cc: [] },
|
|
262
|
+
])
|
|
263
|
+
expect((result.deliveries as unknown[]).map((d: any) => d.to)).toEqual([BUYER, ANA])
|
|
264
|
+
})
|
|
265
|
+
|
|
266
|
+
it('refuses to send without a recipient', async () => {
|
|
267
|
+
for (const to of ['', [], undefined, [null, '']]) {
|
|
268
|
+
const { calls, result } = await sendThrough(nodeType, to)
|
|
269
|
+
expect(calls).toEqual([])
|
|
270
|
+
expect(result).toEqual({ [idKey]: '', success: false, error: 'No recipient' })
|
|
271
|
+
}
|
|
272
|
+
})
|
|
273
|
+
})
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
it('mailersend keeps a named recipient and matches named entries by address', async () => {
|
|
277
|
+
const { calls, result } = await sendThrough('email-mailersend', [
|
|
278
|
+
{ email: BUYER, name: 'Ana' },
|
|
279
|
+
{ email: 'Buyer@lumen.test', name: 'Ana again' },
|
|
280
|
+
{ email: ANA },
|
|
281
|
+
])
|
|
282
|
+
expect(calls).toEqual([
|
|
283
|
+
{ to: [BUYER], cc: [] },
|
|
284
|
+
{ to: [ANA], cc: [] },
|
|
285
|
+
])
|
|
286
|
+
expect((result.deliveries as unknown[]).map((d: any) => d.to)).toEqual([BUYER, ANA])
|
|
287
|
+
})
|
|
288
|
+
})
|
|
@@ -340,6 +340,60 @@ describe('sent-email-log runtime module', () => {
|
|
|
340
340
|
}
|
|
341
341
|
})
|
|
342
342
|
|
|
343
|
+
it('writes one row per delivery when the node reached its recipients one call each', async () => {
|
|
344
|
+
const { api, queries, restore } = loadModule({})
|
|
345
|
+
try {
|
|
346
|
+
const wrapped = api.wrapEmailNodeHandler('email-resend', async () => ({
|
|
347
|
+
id: 're-1',
|
|
348
|
+
success: true,
|
|
349
|
+
error: 'refused for blocked@lumen.test (only the owner)',
|
|
350
|
+
deliveries: [
|
|
351
|
+
{ to: 'jane@lumen.test', success: true, id: 're-1' },
|
|
352
|
+
{ to: 'blocked@lumen.test', success: false, error: 'only the owner' },
|
|
353
|
+
{ to: 'ana@lumen.test', success: true, id: 're-3' },
|
|
354
|
+
],
|
|
355
|
+
}))
|
|
356
|
+
const context: any = {}
|
|
357
|
+
await wrapped(
|
|
358
|
+
{
|
|
359
|
+
to: ['jane@lumen.test', 'blocked@lumen.test', 'ana@lumen.test'],
|
|
360
|
+
cc: 'ops@lumen.test',
|
|
361
|
+
from: 'shop@acme.com',
|
|
362
|
+
subject: 'Hi',
|
|
363
|
+
body: '<p>x</p>',
|
|
364
|
+
emailPurpose: 'welcome',
|
|
365
|
+
emailAudience: 'customer',
|
|
366
|
+
},
|
|
367
|
+
context
|
|
368
|
+
)
|
|
369
|
+
expect(context.__pendingNodePromises).toHaveLength(3)
|
|
370
|
+
await Promise.all(context.__pendingNodePromises)
|
|
371
|
+
const rows = queries.map(rowOf)
|
|
372
|
+
expect(
|
|
373
|
+
rows.map((row) => [
|
|
374
|
+
row.recipient_email,
|
|
375
|
+
row.recipients,
|
|
376
|
+
row.status,
|
|
377
|
+
row.provider_message_id,
|
|
378
|
+
row.error_message,
|
|
379
|
+
])
|
|
380
|
+
).toEqual([
|
|
381
|
+
['jane@lumen.test', '["jane@lumen.test"]', 'sent', 're-1', null],
|
|
382
|
+
['blocked@lumen.test', '["blocked@lumen.test"]', 'failed', null, 'only the owner'],
|
|
383
|
+
['ana@lumen.test', '["ana@lumen.test"]', 'sent', 're-3', null],
|
|
384
|
+
])
|
|
385
|
+
for (const row of rows) {
|
|
386
|
+
expect(row.cc).toBe('["ops@lumen.test"]')
|
|
387
|
+
expect(row.email_type).toBe('welcome')
|
|
388
|
+
expect(row.audience).toBe('customer')
|
|
389
|
+
expect(row.provider).toBe('resend')
|
|
390
|
+
expect(row.source_ref).toBe('email-resend')
|
|
391
|
+
}
|
|
392
|
+
} finally {
|
|
393
|
+
restore()
|
|
394
|
+
}
|
|
395
|
+
})
|
|
396
|
+
|
|
343
397
|
it('records an integration node only for its send-email action, and forwards extra arguments', async () => {
|
|
344
398
|
const { api, queries, restore } = loadModule({})
|
|
345
399
|
try {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"executor-generator.d.ts","sourceRoot":"","sources":["../../src/executor-generator.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,iBAAiB,EAGlB,MAAM,gBAAgB,CAAA;AAKvB,MAAM,WAAW,yBAAyB;IACxC;;;;;OAKG;IACH,YAAY,CAAC,EAAE,iBAAiB,CAAA;CACjC;AAID,eAAO,MAAM,8BAA8B,aAAa,yBAAyB,KAAQ,
|
|
1
|
+
{"version":3,"file":"executor-generator.d.ts","sourceRoot":"","sources":["../../src/executor-generator.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,iBAAiB,EAGlB,MAAM,gBAAgB,CAAA;AAKvB,MAAM,WAAW,yBAAyB;IACxC;;;;;OAKG;IACH,YAAY,CAAC,EAAE,iBAAiB,CAAA;CACjC;AAID,eAAO,MAAM,8BAA8B,aAAa,yBAAyB,KAAQ,MAugDxF,CAAA;AAED,eAAO,MAAM,yBAAyB,QAAO,MA+nB5C,CAAA"}
|
|
@@ -879,9 +879,12 @@ async function settlePendingNodePromises(context) {
|
|
|
879
879
|
// ({ error: '...' } / { success: false }) or through the AI-node contract
|
|
880
880
|
// ({ error: true, message, code } — provider/auth failures). Both must halt
|
|
881
881
|
// the workflow; treating error:true as success used to let the pipeline limp
|
|
882
|
-
// into downstream NOT NULL violations.
|
|
882
|
+
// into downstream NOT NULL violations. A result that says success: true is
|
|
883
|
+
// the node's own verdict: an email node that reached some of its recipients
|
|
884
|
+
// reports success with the refused addresses under error, and goes on.
|
|
883
885
|
function isFatalNodeResult(result) {
|
|
884
886
|
if (!result) return false;
|
|
887
|
+
if (result.success === true) return false;
|
|
885
888
|
return result.success === false ||
|
|
886
889
|
(typeof result.error === 'string' && result.error) ||
|
|
887
890
|
result.error === true;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"executor-generator.js","sourceRoot":"","sources":["../../src/executor-generator.ts"],"names":[],"mappings":";;;AAAA,iDAIuB;AACvB,yFAA0F;AAC1F,uEAAyE;AACzE,6DAAoE;AAYpE,MAAM,gBAAgB,GAAsB,EAAE,OAAO,EAAE,EAAE,EAAE,aAAa,EAAE,EAAE,EAAE,CAAA;AAEvE,MAAM,8BAA8B,GAAG,CAAC,UAAqC,EAAE,EAAU,EAAE;IAChG,OAAO;;;;;;;;;EASP,IAAA,6CAA8B,EAAC,OAAO,CAAC,YAAY,IAAI,gBAAgB,CAAC;EACxE,IAAA,gDAAiC,GAAE;EACnC,IAAA,4DAA+B,GAAE
|
|
1
|
+
{"version":3,"file":"executor-generator.js","sourceRoot":"","sources":["../../src/executor-generator.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"email-mailersend.d.ts","sourceRoot":"","sources":["../../../../src/nodes/email/email-mailersend.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAmB,MAAM,UAAU,CAAA;
|
|
1
|
+
{"version":3,"file":"email-mailersend.d.ts","sourceRoot":"","sources":["../../../../src/nodes/email/email-mailersend.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAmB,MAAM,UAAU,CAAA;AA4FhE,eAAO,MAAM,eAAe,EAAE,oBAY7B,CAAA"}
|
|
@@ -2,67 +2,74 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.emailMailersend = void 0;
|
|
4
4
|
const types_1 = require("../types");
|
|
5
|
+
const commerce_tracking_1 = require("../analytics/commerce-tracking");
|
|
6
|
+
const email_recipients_1 = require("./email-recipients");
|
|
5
7
|
async function email_mailersend(config, context) {
|
|
6
8
|
const apiKey = config.apiKey;
|
|
7
9
|
const from = config.from;
|
|
8
10
|
const fromName = config.fromName || '';
|
|
9
|
-
const to = config.to;
|
|
10
11
|
const subject = config.subject;
|
|
11
12
|
const body = config.body;
|
|
12
13
|
const replyTo = config.replyTo;
|
|
13
14
|
const cc = config.cc;
|
|
14
15
|
const bcc = config.bcc;
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
16
|
+
const recipients = __emailRecipients(config.to);
|
|
17
|
+
async function sendTo(to) {
|
|
18
|
+
try {
|
|
19
|
+
const __nodeRequire = typeof __non_webpack_require__ !== 'undefined' ? __non_webpack_require__ : require;
|
|
20
|
+
const mailersendPkg = __nodeRequire('mailersend');
|
|
21
|
+
const MailerSend = mailersendPkg.MailerSend;
|
|
22
|
+
const EmailParams = mailersendPkg.EmailParams;
|
|
23
|
+
const Sender = mailersendPkg.Sender;
|
|
24
|
+
const Recipient = mailersendPkg.Recipient;
|
|
25
|
+
const mailerSend = new MailerSend({ apiKey });
|
|
26
|
+
const sentFrom = new Sender(from, fromName);
|
|
27
|
+
const recipient = typeof to === 'object' && to.email
|
|
28
|
+
? new Recipient(to.email, to.name || '')
|
|
29
|
+
: new Recipient(to, '');
|
|
30
|
+
const emailParams = new EmailParams()
|
|
31
|
+
.setFrom(sentFrom)
|
|
32
|
+
.setTo([recipient])
|
|
33
|
+
.setSubject(subject)
|
|
34
|
+
.setHtml(body);
|
|
35
|
+
if (replyTo) {
|
|
36
|
+
emailParams.setReplyTo(new Sender(replyTo));
|
|
28
37
|
}
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
38
|
+
if (cc) {
|
|
39
|
+
const ccList = Array.isArray(cc) ? cc : [cc];
|
|
40
|
+
emailParams.setCc(ccList.map(function (email) {
|
|
41
|
+
return new Recipient(typeof email === 'object' ? email.email : email, '');
|
|
42
|
+
}));
|
|
43
|
+
}
|
|
44
|
+
if (bcc) {
|
|
45
|
+
const bccList = Array.isArray(bcc) ? bcc : [bcc];
|
|
46
|
+
emailParams.setBcc(bccList.map(function (email) {
|
|
47
|
+
return new Recipient(typeof email === 'object' ? email.email : email, '');
|
|
48
|
+
}));
|
|
49
|
+
}
|
|
50
|
+
const response = await mailerSend.email.send(emailParams);
|
|
51
|
+
const statusCode = response && response.statusCode;
|
|
52
|
+
if (statusCode === 202 || statusCode === 200) {
|
|
53
|
+
const messageId = (response.headers && response.headers['x-message-id']) || '';
|
|
54
|
+
return { messageId, success: true };
|
|
55
|
+
}
|
|
56
|
+
return {
|
|
57
|
+
messageId: '',
|
|
58
|
+
success: false,
|
|
59
|
+
error: (response.body && response.body.message) || 'Failed to send email',
|
|
60
|
+
};
|
|
50
61
|
}
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
if (statusCode === 202 || statusCode === 200) {
|
|
54
|
-
const messageId = (response.headers && response.headers['x-message-id']) || '';
|
|
55
|
-
return { messageId, success: true };
|
|
62
|
+
catch (err) {
|
|
63
|
+
return { messageId: '', success: false, error: err.message };
|
|
56
64
|
}
|
|
57
|
-
return {
|
|
58
|
-
messageId: '',
|
|
59
|
-
success: false,
|
|
60
|
-
error: (response.body && response.body.message) || 'Failed to send email',
|
|
61
|
-
};
|
|
62
65
|
}
|
|
63
|
-
|
|
64
|
-
return { messageId: '', success: false, error:
|
|
66
|
+
if (recipients.length === 0) {
|
|
67
|
+
return { messageId: '', success: false, error: 'No recipient' };
|
|
68
|
+
}
|
|
69
|
+
if (recipients.length === 1) {
|
|
70
|
+
return sendTo(recipients[0]);
|
|
65
71
|
}
|
|
72
|
+
return __emailDeliveries({ recipients, send: sendTo, idKey: 'messageId' });
|
|
66
73
|
}
|
|
67
74
|
exports.emailMailersend = {
|
|
68
75
|
nodeType: 'email-mailersend',
|
|
@@ -71,7 +78,7 @@ exports.emailMailersend = {
|
|
|
71
78
|
mailersend: '^2.0.0',
|
|
72
79
|
},
|
|
73
80
|
generateHandler() {
|
|
74
|
-
return (0, types_1.handlerToString)(email_mailersend);
|
|
81
|
+
return (0, commerce_tracking_1.assertHandlerHasNoModuleRefs)((0, types_1.handlerToString)(email_mailersend) + '\n' + email_recipients_1.EMAIL_RECIPIENTS_HELPER_SOURCE, 'email-mailersend');
|
|
75
82
|
},
|
|
76
83
|
};
|
|
77
84
|
//# sourceMappingURL=email-mailersend.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"email-mailersend.js","sourceRoot":"","sources":["../../../../src/nodes/email/email-mailersend.ts"],"names":[],"mappings":";;;AAAA,oCAAgE;
|
|
1
|
+
{"version":3,"file":"email-mailersend.js","sourceRoot":"","sources":["../../../../src/nodes/email/email-mailersend.ts"],"names":[],"mappings":";;;AAAA,oCAAgE;AAChE,sEAA6E;AAC7E,yDAAwF;AAOxF,KAAK,UAAU,gBAAgB,CAAC,MAAW,EAAE,OAAgC;IAC3E,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAA;IAC5B,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAA;IACxB,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,IAAI,EAAE,CAAA;IACtC,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAA;IAC9B,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAA;IACxB,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAA;IAC9B,MAAM,EAAE,GAAG,MAAM,CAAC,EAAE,CAAA;IACpB,MAAM,GAAG,GAAG,MAAM,CAAC,GAAG,CAAA;IACtB,MAAM,UAAU,GAAG,iBAAiB,CAAC,MAAM,CAAC,EAAE,CAAC,CAAA;IAE/C,KAAK,UAAU,MAAM,CAAC,EAAO;QAC3B,IAAI;YACF,MAAM,aAAa,GACjB,OAAO,uBAAuB,KAAK,WAAW,CAAC,CAAC,CAAC,uBAAuB,CAAC,CAAC,CAAC,OAAO,CAAA;YACpF,MAAM,aAAa,GAAG,aAAa,CAAC,YAAY,CAAC,CAAA;YACjD,MAAM,UAAU,GAAG,aAAa,CAAC,UAAU,CAAA;YAC3C,MAAM,WAAW,GAAG,aAAa,CAAC,WAAW,CAAA;YAC7C,MAAM,MAAM,GAAG,aAAa,CAAC,MAAM,CAAA;YACnC,MAAM,SAAS,GAAG,aAAa,CAAC,SAAS,CAAA;YAEzC,MAAM,UAAU,GAAG,IAAI,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC,CAAA;YAC7C,MAAM,QAAQ,GAAG,IAAI,MAAM,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAA;YAE3C,MAAM,SAAS,GACb,OAAO,EAAE,KAAK,QAAQ,IAAI,EAAE,CAAC,KAAK;gBAChC,CAAC,CAAC,IAAI,SAAS,CAAC,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC;gBACxC,CAAC,CAAC,IAAI,SAAS,CAAC,EAAE,EAAE,EAAE,CAAC,CAAA;YAE3B,MAAM,WAAW,GAAG,IAAI,WAAW,EAAE;iBAClC,OAAO,CAAC,QAAQ,CAAC;iBACjB,KAAK,CAAC,CAAC,SAAS,CAAC,CAAC;iBAClB,UAAU,CAAC,OAAO,CAAC;iBACnB,OAAO,CAAC,IAAI,CAAC,CAAA;YAEhB,IAAI,OAAO,EAAE;gBACX,WAAW,CAAC,UAAU,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,CAAC,CAAA;aAC5C;YAED,IAAI,EAAE,EAAE;gBACN,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAA;gBAC5C,WAAW,CAAC,KAAK,CACf,MAAM,CAAC,GAAG,CAAC,UAAU,KAAU;oBAC7B,OAAO,IAAI,SAAS,CAAC,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAA;gBAC3E,CAAC,CAAC,CACH,CAAA;aACF;YAED,IAAI,GAAG,EAAE;gBACP,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAA;gBAChD,WAAW,CAAC,MAAM,CAChB,OAAO,CAAC,GAAG,CAAC,UAAU,KAAU;oBAC9B,OAAO,IAAI,SAAS,CAAC,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAA;gBAC3E,CAAC,CAAC,CACH,CAAA;aACF;YAED,MAAM,QAAQ,GAAG,MAAM,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,CAAA;YACzD,MAAM,UAAU,GAAG,QAAQ,IAAI,QAAQ,CAAC,UAAU,CAAA;YAElD,IAAI,UAAU,KAAK,GAAG,IAAI,UAAU,KAAK,GAAG,EAAE;gBAC5C,MAAM,SAAS,GAAG,CAAC,QAAQ,CAAC,OAAO,IAAI,QAAQ,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC,IAAI,EAAE,CAAA;gBAC9E,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,IAAI,EAAE,CAAA;aACpC;YAED,OAAO;gBACL,SAAS,EAAE,EAAE;gBACb,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,CAAC,QAAQ,CAAC,IAAI,IAAI,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,sBAAsB;aAC1E,CAAA;SACF;QAAC,OAAO,GAAY,EAAE;YACrB,OAAO,EAAE,SAAS,EAAE,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAG,GAAa,CAAC,OAAO,EAAE,CAAA;SACxE;IACH,CAAC;IAED,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE;QAC3B,OAAO,EAAE,SAAS,EAAE,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,cAAc,EAAE,CAAA;KAChE;IACD,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE;QAC3B,OAAO,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAA;KAC7B;IACD,OAAO,iBAAiB,CAAC,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC,CAAA;AAC5E,CAAC;AACY,QAAA,eAAe,GAAyB;IACnD,QAAQ,EAAE,kBAAkB;IAC5B,YAAY,EAAE,QAAQ;IACtB,YAAY,EAAE;QACZ,UAAU,EAAE,QAAQ;KACrB;IACD,eAAe;QACb,OAAO,IAAA,gDAA4B,EACjC,IAAA,uBAAe,EAAC,gBAAgB,CAAC,GAAG,IAAI,GAAG,iDAA8B,EACzE,kBAAkB,CACnB,CAAA;IACH,CAAC;CACF,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"email-mailgun.d.ts","sourceRoot":"","sources":["../../../../src/nodes/email/email-mailgun.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAAmB,MAAM,UAAU,CAAA;
|
|
1
|
+
{"version":3,"file":"email-mailgun.d.ts","sourceRoot":"","sources":["../../../../src/nodes/email/email-mailgun.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAAmB,MAAM,UAAU,CAAA;AAuEhE,eAAO,MAAM,YAAY,EAAE,oBAiB1B,CAAA"}
|