@teleporthq/teleport-plugin-next-workflows 0.44.9 → 0.44.11

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 (82) hide show
  1. package/__tests__/ai-error-contract.test.ts +10 -0
  2. package/__tests__/continue-on-error.test.ts +27 -0
  3. package/__tests__/email-node-recipients.test.ts +288 -0
  4. package/__tests__/security-runtime-shadow.test.ts +2 -1
  5. package/__tests__/sent-email-log-module.test.ts +54 -0
  6. package/dist/cjs/executor-generator.d.ts.map +1 -1
  7. package/dist/cjs/executor-generator.js +4 -1
  8. package/dist/cjs/executor-generator.js.map +1 -1
  9. package/dist/cjs/nodes/email/email-mailersend.d.ts.map +1 -1
  10. package/dist/cjs/nodes/email/email-mailersend.js +55 -48
  11. package/dist/cjs/nodes/email/email-mailersend.js.map +1 -1
  12. package/dist/cjs/nodes/email/email-mailgun.d.ts.map +1 -1
  13. package/dist/cjs/nodes/email/email-mailgun.js +44 -32
  14. package/dist/cjs/nodes/email/email-mailgun.js.map +1 -1
  15. package/dist/cjs/nodes/email/email-postmark.d.ts.map +1 -1
  16. package/dist/cjs/nodes/email/email-postmark.js +44 -31
  17. package/dist/cjs/nodes/email/email-postmark.js.map +1 -1
  18. package/dist/cjs/nodes/email/email-recipients.d.ts +28 -0
  19. package/dist/cjs/nodes/email/email-recipients.d.ts.map +1 -0
  20. package/dist/cjs/nodes/email/email-recipients.js +74 -0
  21. package/dist/cjs/nodes/email/email-recipients.js.map +1 -0
  22. package/dist/cjs/nodes/email/email-resend.d.ts.map +1 -1
  23. package/dist/cjs/nodes/email/email-resend.js +42 -28
  24. package/dist/cjs/nodes/email/email-resend.js.map +1 -1
  25. package/dist/cjs/nodes/email/email-sendgrid.d.ts.map +1 -1
  26. package/dist/cjs/nodes/email/email-sendgrid.js +56 -41
  27. package/dist/cjs/nodes/email/email-sendgrid.js.map +1 -1
  28. package/dist/cjs/nodes/general/general-custom-js.d.ts.map +1 -1
  29. package/dist/cjs/nodes/general/general-custom-js.js +2 -1
  30. package/dist/cjs/nodes/general/general-custom-js.js.map +1 -1
  31. package/dist/cjs/security-scanner.d.ts +1 -1
  32. package/dist/cjs/security-scanner.d.ts.map +1 -1
  33. package/dist/cjs/security-scanner.js +1 -0
  34. package/dist/cjs/security-scanner.js.map +1 -1
  35. package/dist/cjs/sent-email-log/sent-email-log-code.d.ts.map +1 -1
  36. package/dist/cjs/sent-email-log/sent-email-log-code.js +17 -1
  37. package/dist/cjs/sent-email-log/sent-email-log-code.js.map +1 -1
  38. package/dist/cjs/tsconfig.tsbuildinfo +1 -1
  39. package/dist/esm/executor-generator.d.ts.map +1 -1
  40. package/dist/esm/executor-generator.js +4 -1
  41. package/dist/esm/executor-generator.js.map +1 -1
  42. package/dist/esm/nodes/email/email-mailersend.d.ts.map +1 -1
  43. package/dist/esm/nodes/email/email-mailersend.js +55 -48
  44. package/dist/esm/nodes/email/email-mailersend.js.map +1 -1
  45. package/dist/esm/nodes/email/email-mailgun.d.ts.map +1 -1
  46. package/dist/esm/nodes/email/email-mailgun.js +44 -32
  47. package/dist/esm/nodes/email/email-mailgun.js.map +1 -1
  48. package/dist/esm/nodes/email/email-postmark.d.ts.map +1 -1
  49. package/dist/esm/nodes/email/email-postmark.js +44 -31
  50. package/dist/esm/nodes/email/email-postmark.js.map +1 -1
  51. package/dist/esm/nodes/email/email-recipients.d.ts +28 -0
  52. package/dist/esm/nodes/email/email-recipients.d.ts.map +1 -0
  53. package/dist/esm/nodes/email/email-recipients.js +71 -0
  54. package/dist/esm/nodes/email/email-recipients.js.map +1 -0
  55. package/dist/esm/nodes/email/email-resend.d.ts.map +1 -1
  56. package/dist/esm/nodes/email/email-resend.js +42 -28
  57. package/dist/esm/nodes/email/email-resend.js.map +1 -1
  58. package/dist/esm/nodes/email/email-sendgrid.d.ts.map +1 -1
  59. package/dist/esm/nodes/email/email-sendgrid.js +56 -41
  60. package/dist/esm/nodes/email/email-sendgrid.js.map +1 -1
  61. package/dist/esm/nodes/general/general-custom-js.d.ts.map +1 -1
  62. package/dist/esm/nodes/general/general-custom-js.js +2 -1
  63. package/dist/esm/nodes/general/general-custom-js.js.map +1 -1
  64. package/dist/esm/security-scanner.d.ts +1 -1
  65. package/dist/esm/security-scanner.d.ts.map +1 -1
  66. package/dist/esm/security-scanner.js +1 -0
  67. package/dist/esm/security-scanner.js.map +1 -1
  68. package/dist/esm/sent-email-log/sent-email-log-code.d.ts.map +1 -1
  69. package/dist/esm/sent-email-log/sent-email-log-code.js +17 -1
  70. package/dist/esm/sent-email-log/sent-email-log-code.js.map +1 -1
  71. package/dist/esm/tsconfig.tsbuildinfo +1 -1
  72. package/package.json +4 -4
  73. package/src/executor-generator.ts +4 -1
  74. package/src/nodes/email/email-mailersend.ts +72 -55
  75. package/src/nodes/email/email-mailgun.ts +51 -36
  76. package/src/nodes/email/email-postmark.ts +51 -35
  77. package/src/nodes/email/email-recipients.ts +86 -0
  78. package/src/nodes/email/email-resend.ts +49 -31
  79. package/src/nodes/email/email-sendgrid.ts +63 -44
  80. package/src/nodes/general/general-custom-js.ts +2 -1
  81. package/src/security-scanner.ts +1 -0
  82. package/src/sent-email-log/sent-email-log-code.ts +17 -1
@@ -1,69 +1,84 @@
1
1
  import { EmailSender } from '@teleporthq/teleport-shared'
2
2
  import { NodeHandlerGenerator, handlerToString } from '../types'
3
3
  import { assertHandlerHasNoModuleRefs } from '../analytics/commerce-tracking'
4
+ import { EMAIL_RECIPIENTS_HELPER_SOURCE, EmailDeliveriesPlan } from './email-recipients'
4
5
 
5
6
  // Ambient, not imported: a serialized handler has no module scope, so
6
- // generateHandler appends the helper's source (EmailSender, teleport-shared).
7
+ // generateHandler appends the helpers' source (EmailSender from teleport-shared,
8
+ // the recipients helper beside this file).
7
9
  declare function __emailSender(sender: EmailSender.EmailSenderInput): EmailSender.EmailSenderParts
10
+ declare function __emailRecipients(to: unknown): unknown[]
11
+ declare function __emailDeliveries(plan: EmailDeliveriesPlan): Promise<unknown>
8
12
 
9
13
  async function email_sendgrid(config: any, context: Record<string, unknown>) {
10
14
  const apiKey = config.apiKey
11
15
  const from = config.from
12
16
  const fromName = config.fromName
13
- const to = config.to
14
17
  const subject = config.subject
15
18
  const body = config.body
16
19
  const replyTo = config.replyTo
17
20
  const cc = config.cc
18
21
  const bcc = config.bcc
22
+ const recipients = __emailRecipients(config.to)
19
23
 
20
- try {
21
- const __nodeRequire =
22
- typeof __non_webpack_require__ !== 'undefined' ? __non_webpack_require__ : require
23
- const MailService = __nodeRequire('@sendgrid/mail').MailService
24
- const sgMail = new MailService()
25
- sgMail.setApiKey(apiKey)
24
+ async function sendTo(to: unknown) {
25
+ try {
26
+ const __nodeRequire =
27
+ typeof __non_webpack_require__ !== 'undefined' ? __non_webpack_require__ : require
28
+ const MailService = __nodeRequire('@sendgrid/mail').MailService
29
+ const sgMail = new MailService()
30
+ sgMail.setApiKey(apiKey)
26
31
 
27
- // SendGrid reads a "Name <email>" string's name verbatim, quotes included,
28
- // so a named sender goes as its two parts.
29
- const sender = __emailSender({ from, name: fromName })
30
- const msg: Record<string, any> = {
31
- to: Array.isArray(to) ? to : [to],
32
- from: sender.name ? { email: sender.email, name: sender.name } : sender.email,
33
- subject,
34
- html: body,
35
- }
32
+ // SendGrid reads a "Name <email>" string's name verbatim, quotes included,
33
+ // so a named sender goes as its two parts.
34
+ const sender = __emailSender({ from, name: fromName })
35
+ const msg: Record<string, any> = {
36
+ to: [to],
37
+ from: sender.name ? { email: sender.email, name: sender.name } : sender.email,
38
+ subject,
39
+ html: body,
40
+ }
36
41
 
37
- if (replyTo) {
38
- msg.replyTo = replyTo
39
- }
40
- if (cc) {
41
- msg.cc = Array.isArray(cc) ? cc : [cc]
42
- }
43
- if (bcc) {
44
- msg.bcc = Array.isArray(bcc) ? bcc : [bcc]
45
- }
42
+ if (replyTo) {
43
+ msg.replyTo = replyTo
44
+ }
45
+ if (cc) {
46
+ msg.cc = Array.isArray(cc) ? cc : [cc]
47
+ }
48
+ if (bcc) {
49
+ msg.bcc = Array.isArray(bcc) ? bcc : [bcc]
50
+ }
46
51
 
47
- const response = await sgMail.send(msg)
48
- const statusCode = response && response[0] && response[0].statusCode
49
- const messageId =
50
- (response && response[0] && response[0].headers && response[0].headers['x-message-id']) || ''
52
+ const response = await sgMail.send(msg)
53
+ const statusCode = response && response[0] && response[0].statusCode
54
+ const messageId =
55
+ (response && response[0] && response[0].headers && response[0].headers['x-message-id']) ||
56
+ ''
51
57
 
52
- return { messageId, success: statusCode === 202 || statusCode === 200 }
53
- } catch (err: unknown) {
54
- const error = err as any
55
- let message = 'Failed to send email'
56
- if (error.response && error.response.body && error.response.body.errors) {
57
- message = error.response.body.errors
58
- .map(function (e: any) {
59
- return e.message
60
- })
61
- .join(', ')
62
- } else if (error.message) {
63
- message = error.message
58
+ return { messageId, success: statusCode === 202 || statusCode === 200 }
59
+ } catch (err: unknown) {
60
+ const error = err as any
61
+ let message = 'Failed to send email'
62
+ if (error.response && error.response.body && error.response.body.errors) {
63
+ message = error.response.body.errors
64
+ .map(function (e: any) {
65
+ return e.message
66
+ })
67
+ .join(', ')
68
+ } else if (error.message) {
69
+ message = error.message
70
+ }
71
+ return { messageId: '', success: false, error: message }
64
72
  }
65
- return { messageId: '', success: false, error: message }
66
73
  }
74
+
75
+ if (recipients.length === 0) {
76
+ return { messageId: '', success: false, error: 'No recipient' }
77
+ }
78
+ if (recipients.length === 1) {
79
+ return sendTo(recipients[0])
80
+ }
81
+ return __emailDeliveries({ recipients, send: sendTo, idKey: 'messageId' })
67
82
  }
68
83
  export const emailSendgrid: NodeHandlerGenerator = {
69
84
  nodeType: 'email-sendgrid',
@@ -73,7 +88,11 @@ export const emailSendgrid: NodeHandlerGenerator = {
73
88
  },
74
89
  generateHandler(): string {
75
90
  return assertHandlerHasNoModuleRefs(
76
- handlerToString(email_sendgrid) + '\n' + EmailSender.generateEmailSenderHelperCode(),
91
+ handlerToString(email_sendgrid) +
92
+ '\n' +
93
+ EmailSender.generateEmailSenderHelperCode() +
94
+ '\n' +
95
+ EMAIL_RECIPIENTS_HELPER_SOURCE,
77
96
  'email-sendgrid'
78
97
  )
79
98
  },
@@ -367,7 +367,8 @@ async function general_custom_js(config: any, context: Record<string, unknown>)
367
367
  '"PDF_SERVICE_URL":1,' +
368
368
  '"PDF_SERVICE_API_KEY":1,' +
369
369
  '"TELEPORT_CRON_SECRET":1,' +
370
- '"TELEPORT_CRON_SECRET_PREVIOUS":1' +
370
+ '"TELEPORT_CRON_SECRET_PREVIOUS":1,' +
371
+ '"TELEPORT_WALL_SECRET":1' +
371
372
  '};\n' +
372
373
  // The merchant's payment credentials (see PROTECTED_ENV_NAME_PATTERN in
373
374
  // security-scanner.ts), whatever number a second save gave them.
@@ -29,6 +29,7 @@ export const PROTECTED_ENV_NAMES = [
29
29
  'PDF_SERVICE_API_KEY',
30
30
  'TELEPORT_CRON_SECRET',
31
31
  'TELEPORT_CRON_SECRET_PREVIOUS',
32
+ 'TELEPORT_WALL_SECRET',
32
33
  ] as const
33
34
 
34
35
  /**
@@ -348,6 +348,19 @@ function __entryFromNode(nodeType, config, result, error) {
348
348
  };
349
349
  }
350
350
 
351
+ // A node that reached several recipients one provider call each reports a
352
+ // delivery per recipient; the ledger then says who got the email and who was
353
+ // refused, one row per address. Any other result is one row for the node run.
354
+ function __entriesFromNode(nodeType, config, result) {
355
+ var deliveries = result && Array.isArray(result.deliveries) ? result.deliveries : [];
356
+ if (deliveries.length === 0) return [__entryFromNode(nodeType, config, result, null)];
357
+ return deliveries.map(function (delivery) {
358
+ var entry = __entryFromNode(nodeType, config, delivery, null);
359
+ entry.to = delivery.to;
360
+ return entry;
361
+ });
362
+ }
363
+
351
364
  /**
352
365
  * Wraps a server node handler so every send is recorded. The record is
353
366
  * registered on the workflow context's fire-and-forget queue — the same one
@@ -368,7 +381,10 @@ function wrapEmailNodeHandler(nodeType, handler) {
368
381
  __register(context, recordSentEmail(__entryFromNode(nodeType, config, null, err)));
369
382
  throw err;
370
383
  }
371
- __register(context, recordSentEmail(__entryFromNode(nodeType, config, result, null)));
384
+ var entries = __entriesFromNode(nodeType, config, result);
385
+ for (var i = 0; i < entries.length; i++) {
386
+ __register(context, recordSentEmail(entries[i]));
387
+ }
372
388
  return result;
373
389
  };
374
390
  }