@gravito/signal 3.1.0 → 4.0.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 (72) hide show
  1. package/dist/OrbitSignal.d.ts +6 -0
  2. package/dist/errors/codes.d.ts +19 -0
  3. package/dist/errors.d.ts +18 -11
  4. package/dist/index.cjs +55148 -81886
  5. package/dist/index.d.ts +514 -1
  6. package/dist/index.js +61553 -0
  7. package/dist/index.mjs +55158 -81907
  8. package/dist/transports/BaseTransport.d.ts +15 -23
  9. package/package.json +16 -4
  10. package/CHANGELOG.md +0 -74
  11. package/build.ts +0 -133
  12. package/dist/index.cjs.map +0 -712
  13. package/dist/index.mjs.map +0 -710
  14. package/doc/ADVANCED_RENDERING.md +0 -71
  15. package/doc/DISTRIBUTED_MESSAGING.md +0 -79
  16. package/doc/OPTIMIZATION_PLAN.md +0 -496
  17. package/package.json.bak +0 -75
  18. package/scripts/check-coverage.ts +0 -64
  19. package/src/Mailable.ts +0 -674
  20. package/src/OrbitSignal.ts +0 -451
  21. package/src/Queueable.ts +0 -9
  22. package/src/TypedMailable.ts +0 -96
  23. package/src/dev/DevMailbox.ts +0 -146
  24. package/src/dev/DevServer.ts +0 -192
  25. package/src/dev/storage/FileMailboxStorage.ts +0 -66
  26. package/src/dev/storage/MailboxStorage.ts +0 -15
  27. package/src/dev/storage/MemoryMailboxStorage.ts +0 -36
  28. package/src/dev/ui/mailbox.ts +0 -77
  29. package/src/dev/ui/preview.ts +0 -103
  30. package/src/dev/ui/shared.ts +0 -60
  31. package/src/errors.ts +0 -69
  32. package/src/events.ts +0 -72
  33. package/src/index.ts +0 -41
  34. package/src/renderers/HtmlRenderer.ts +0 -41
  35. package/src/renderers/MjmlRenderer.ts +0 -73
  36. package/src/renderers/ReactMjmlRenderer.ts +0 -94
  37. package/src/renderers/ReactRenderer.ts +0 -66
  38. package/src/renderers/Renderer.ts +0 -67
  39. package/src/renderers/TemplateRenderer.ts +0 -84
  40. package/src/renderers/VueMjmlRenderer.ts +0 -99
  41. package/src/renderers/VueRenderer.ts +0 -71
  42. package/src/renderers/mjml-templates.ts +0 -50
  43. package/src/transports/BaseTransport.ts +0 -148
  44. package/src/transports/LogTransport.ts +0 -55
  45. package/src/transports/MemoryTransport.ts +0 -55
  46. package/src/transports/SesTransport.ts +0 -129
  47. package/src/transports/SmtpTransport.ts +0 -184
  48. package/src/transports/Transport.ts +0 -45
  49. package/src/types.ts +0 -309
  50. package/src/utils/html.ts +0 -43
  51. package/src/webhooks/SendGridWebhookDriver.ts +0 -80
  52. package/src/webhooks/SesWebhookDriver.ts +0 -44
  53. package/tests/DevMailbox.test.ts +0 -54
  54. package/tests/FileMailboxStorage.test.ts +0 -56
  55. package/tests/MjmlLayout.test.ts +0 -28
  56. package/tests/MjmlRenderer.test.ts +0 -53
  57. package/tests/OrbitSignalWebhook.test.ts +0 -56
  58. package/tests/ReactMjmlRenderer.test.ts +0 -33
  59. package/tests/SendGridWebhookDriver.test.ts +0 -69
  60. package/tests/SesWebhookDriver.test.ts +0 -46
  61. package/tests/VueMjmlRenderer.test.ts +0 -35
  62. package/tests/dev-server.test.ts +0 -66
  63. package/tests/log-transport.test.ts +0 -21
  64. package/tests/mailable-extra.test.ts +0 -68
  65. package/tests/mailable.test.ts +0 -77
  66. package/tests/orbit-signal.test.ts +0 -43
  67. package/tests/renderers.test.ts +0 -58
  68. package/tests/template-renderer.test.ts +0 -24
  69. package/tests/transports.test.ts +0 -52
  70. package/tests/ui.test.ts +0 -37
  71. package/tsconfig.build.json +0 -24
  72. package/tsconfig.json +0 -9
package/dist/index.d.ts CHANGED
@@ -7,26 +7,539 @@
7
7
  *
8
8
  * @packageDocumentation
9
9
  */
10
+ /**
11
+ * Queue-able interface from the stream package.
12
+ *
13
+ * Defines the contract for messages that can be queued for asynchronous processing,
14
+ * enabling email mailables to be dispatched to background workers.
15
+ *
16
+ * @see {@link Mailable} For messages that implement this interface
17
+ * @public
18
+ */
10
19
  export type { Queueable } from '@gravito/stream';
20
+ /**
21
+ * Development mailbox for capturing and previewing sent emails.
22
+ *
23
+ * Provides an in-memory storage mechanism for intercepting emails during development.
24
+ * Works with DevServer to display a preview UI at a configured endpoint (default: /__mail).
25
+ *
26
+ * @see {@link OrbitSignal} For development mode configuration
27
+ * @see {@link MailboxEntry} For mailbox data structure
28
+ * @public
29
+ */
11
30
  export { DevMailbox, type MailboxEntry } from './dev/DevMailbox';
31
+ /**
32
+ * Mail error codes and transport error class.
33
+ *
34
+ * Provides structured error information for mail delivery failures, including
35
+ * categorized error codes (CONNECTION_FAILED, AUTH_FAILED, RATE_LIMIT, etc.)
36
+ * and the MailTransportError exception class for programmatic error handling.
37
+ *
38
+ * @example
39
+ * ```typescript
40
+ * import { MailTransportError, MailErrorCode } from '@gravito/signal'
41
+ *
42
+ * try {
43
+ * await transport.send(message)
44
+ * } catch (error) {
45
+ * if (error instanceof MailTransportError) {
46
+ * if (error.code === MailErrorCode.RATE_LIMIT) {
47
+ * // Implement exponential backoff
48
+ * }
49
+ * }
50
+ * }
51
+ * ```
52
+ *
53
+ * @see {@link Transport} For implementations that throw these errors
54
+ * @public
55
+ */
12
56
  export { MailErrorCode, MailTransportError } from './errors';
57
+ export { MailErrorCodes } from './errors/codes';
58
+ /**
59
+ * Mail lifecycle event types and handlers.
60
+ *
61
+ * Provides event types and interfaces for subscribing to key moments in the
62
+ * email delivery process: beforeRender, afterRender, beforeSend, afterSend,
63
+ * sendFailed, and webhookReceived. Enables logging, analytics, and custom
64
+ * processing during mail service operations.
65
+ *
66
+ * @example
67
+ * ```typescript
68
+ * import { OrbitSignal, type MailEvent } from '@gravito/signal'
69
+ *
70
+ * mail.on('afterSend', (event: MailEvent) => {
71
+ * console.log('Sent to:', event.message?.to[0].address)
72
+ * })
73
+ *
74
+ * mail.on('sendFailed', (event: MailEvent) => {
75
+ * console.error('Failed:', event.error?.message)
76
+ * })
77
+ * ```
78
+ *
79
+ * @see {@link OrbitSignal} For event subscription API
80
+ * @public
81
+ */
13
82
  export type { MailEvent, MailEventHandler, MailEventType } from './events';
83
+ /**
84
+ * Base class for all mailable messages.
85
+ *
86
+ * Provides a fluent API to build email envelopes and render content using
87
+ * multiple rendering engines (HTML, Prism templates, React, Vue). Supports
88
+ * background queuing via the Queueable interface and integration with the
89
+ * OrbitSignal service for sending.
90
+ *
91
+ * @example
92
+ * ```typescript
93
+ * import { Mailable } from '@gravito/signal'
94
+ *
95
+ * class WelcomeEmail extends Mailable {
96
+ * constructor(private user: User) {
97
+ * super()
98
+ * }
99
+ *
100
+ * build() {
101
+ * return this
102
+ * .to(this.user.email)
103
+ * .subject('Welcome!')
104
+ * .view('emails/welcome', { name: this.user.name })
105
+ * }
106
+ * }
107
+ *
108
+ * await mail.send(new WelcomeEmail(user))
109
+ * ```
110
+ *
111
+ * @see {@link TypedMailable} For type-safe data passing
112
+ * @see {@link OrbitSignal} For sending integration
113
+ * @public
114
+ */
14
115
  export { Mailable } from './Mailable';
116
+ /**
117
+ * Type-safe mailable base class with compile-time data validation.
118
+ *
119
+ * Extends Mailable to provide generic type parameters for email data,
120
+ * ensuring template variables and component props are correctly typed
121
+ * and validated at build time. Improves developer experience and reduces
122
+ * runtime errors in complex email workflows.
123
+ *
124
+ * @example
125
+ * ```typescript
126
+ * import { TypedMailable } from '@gravito/signal'
127
+ *
128
+ * interface WelcomeData {
129
+ * name: string
130
+ * activationUrl: string
131
+ * }
132
+ *
133
+ * class WelcomeEmail extends TypedMailable<WelcomeData> {
134
+ * protected data: WelcomeData
135
+ *
136
+ * build() {
137
+ * return this
138
+ * .to(this.data.email)
139
+ * .view('emails/welcome', this.data)
140
+ * }
141
+ * }
142
+ * ```
143
+ *
144
+ * @see {@link Mailable} For base functionality
145
+ * @see {@link Renderer} For rendering engines
146
+ * @public
147
+ */
148
+ export { TypedMailable } from './TypedMailable';
149
+ /**
150
+ * OrbitSignal - The central email service orbit for Gravito.
151
+ *
152
+ * A production-ready email service providing multi-transport support, automatic
153
+ * retry with exponential backoff, event-driven lifecycle hooks, and development
154
+ * tooling. Integrates seamlessly with Gravito's orbit system and queue infrastructure.
155
+ *
156
+ * Supports multiple transports (SMTP, AWS SES, Log, Memory) and rendering engines
157
+ * (HTML, Prism templates, React, Vue). In development mode, captures emails in an
158
+ * in-memory mailbox and displays a preview UI.
159
+ *
160
+ * @example
161
+ * ```typescript
162
+ * import { OrbitSignal, SmtpTransport } from '@gravito/signal'
163
+ *
164
+ * const mail = new OrbitSignal({
165
+ * transport: new SmtpTransport({
166
+ * host: 'smtp.mailtrap.io',
167
+ * port: 2525,
168
+ * auth: { user: 'username', pass: 'password' }
169
+ * }),
170
+ * from: { name: 'My App', address: 'noreply@myapp.com' },
171
+ * devMode: process.env.NODE_ENV === 'development'
172
+ * })
173
+ *
174
+ * mail.install(core)
175
+ * ```
176
+ *
177
+ * @example
178
+ * ```typescript
179
+ * // Sending with events
180
+ * mail.on('beforeSend', async (event) => {
181
+ * console.log('Sending to:', event.message?.to[0].address)
182
+ * })
183
+ *
184
+ * await mail.send(new WelcomeEmail(user))
185
+ * ```
186
+ *
187
+ * @see {@link Mailable} For creating email messages
188
+ * @see {@link Transport} For custom transport implementations
189
+ * @see {@link MailEvent} For lifecycle event types
190
+ * @public
191
+ */
15
192
  export { OrbitSignal } from './OrbitSignal';
193
+ /**
194
+ * Raw HTML content renderer.
195
+ *
196
+ * Renders plain HTML strings as email content. Suitable for pre-rendered
197
+ * HTML or when using other templating libraries. Performs minimal processing.
198
+ *
199
+ * @example
200
+ * ```typescript
201
+ * import { Mailable, HtmlRenderer } from '@gravito/signal'
202
+ *
203
+ * class RawHtmlEmail extends Mailable {
204
+ * build() {
205
+ * return this
206
+ * .to('user@example.com')
207
+ * .html('<h1>Hello</h1><p>This is HTML</p>')
208
+ * }
209
+ * }
210
+ * ```
211
+ *
212
+ * @see {@link Renderer} For the renderer interface
213
+ * @public
214
+ */
16
215
  export { HtmlRenderer } from './renderers/HtmlRenderer';
216
+ /**
217
+ * MJML (Responsive Email Markup Language) template renderer.
218
+ *
219
+ * Renders MJML template syntax and converts it to optimized, responsive HTML
220
+ * suitable for all email clients. MJML abstracts away CSS and media queries
221
+ * complexity while ensuring broad compatibility.
222
+ *
223
+ * @example
224
+ * ```typescript
225
+ * import { Mailable, MjmlRenderer } from '@gravito/signal'
226
+ *
227
+ * class MjmlEmail extends Mailable {
228
+ * build() {
229
+ * return this
230
+ * .to('user@example.com')
231
+ * .view('emails/welcome.mjml', { name: 'Alice' })
232
+ * }
233
+ * }
234
+ * ```
235
+ *
236
+ * @see {@link ReactMjmlRenderer} For React components
237
+ * @see {@link VueMjmlRenderer} For Vue components
238
+ * @see {@link Renderer} For the renderer interface
239
+ * @public
240
+ */
17
241
  export { MjmlRenderer } from './renderers/MjmlRenderer';
242
+ /**
243
+ * Built-in MJML email templates and utilities.
244
+ *
245
+ * Pre-built responsive email template components and helpers for common
246
+ * use cases, reducing boilerplate when creating MJML-based emails.
247
+ *
248
+ * @see {@link MjmlRenderer} For MJML rendering
249
+ * @see {@link ReactMjmlRenderer} For React + MJML
250
+ * @public
251
+ */
18
252
  export * from './renderers/mjml-templates';
253
+ /**
254
+ * React component renderer with MJML support.
255
+ *
256
+ * Renders React components as email content with MJML syntax support,
257
+ * enabling you to build emails using familiar React patterns while maintaining
258
+ * responsive email best practices.
259
+ *
260
+ * @example
261
+ * ```typescript
262
+ * import { Mailable, ReactMjmlRenderer } from '@gravito/signal'
263
+ *
264
+ * const WelcomeComponent = ({ name }: { name: string }) => (
265
+ * <mjml>
266
+ * <mj-body>
267
+ * <mj-section>
268
+ * <mj-column><mj-text>Welcome, {name}!</mj-text></mj-column>
269
+ * </mj-section>
270
+ * </mj-body>
271
+ * </mjml>
272
+ * )
273
+ *
274
+ * class ReactEmail extends Mailable {
275
+ * build() {
276
+ * return this
277
+ * .to('user@example.com')
278
+ * .react(WelcomeComponent, { name: 'Alice' })
279
+ * }
280
+ * }
281
+ * ```
282
+ *
283
+ * @see {@link VueMjmlRenderer} For Vue component rendering
284
+ * @see {@link Renderer} For the renderer interface
285
+ * @public
286
+ */
19
287
  export { ReactMjmlRenderer } from './renderers/ReactMjmlRenderer';
288
+ /**
289
+ * Renderer abstractions for email content generation.
290
+ *
291
+ * Defines the interface and return type for building custom content renderers,
292
+ * enabling support for additional templating engines beyond the built-in
293
+ * HTML, Prism, React, and Vue implementations.
294
+ *
295
+ * @see {@link HtmlRenderer} For raw HTML content
296
+ * @see {@link TemplateRenderer} For Prism template rendering
297
+ * @see {@link ReactMjmlRenderer} For React component rendering
298
+ * @see {@link VueMjmlRenderer} For Vue component rendering
299
+ * @public
300
+ */
20
301
  export type { Renderer, RenderResult } from './renderers/Renderer';
302
+ /**
303
+ * Prism templating engine renderer for email content.
304
+ *
305
+ * Renders Blade-style templates using the Prism template engine. Supports
306
+ * variables, control structures, and template inheritance for complex
307
+ * email layouts and components.
308
+ *
309
+ * @example
310
+ * ```typescript
311
+ * import { Mailable, TemplateRenderer } from '@gravito/signal'
312
+ *
313
+ * class TemplateEmail extends Mailable {
314
+ * build() {
315
+ * return this
316
+ * .to('user@example.com')
317
+ * .view('emails/welcome', { name: 'Alice' })
318
+ * }
319
+ * }
320
+ * ```
321
+ *
322
+ * @see {@link Renderer} For the renderer interface
323
+ * @public
324
+ */
21
325
  export { TemplateRenderer } from './renderers/TemplateRenderer';
326
+ /**
327
+ * Vue component renderer with MJML support.
328
+ *
329
+ * Renders Vue single-file components or templates as email content with MJML
330
+ * syntax support, enabling Vue developers to build emails using familiar
331
+ * patterns while maintaining responsive email best practices.
332
+ *
333
+ * @example
334
+ * ```typescript
335
+ * import { Mailable, VueMjmlRenderer } from '@gravito/signal'
336
+ *
337
+ * class VueEmail extends Mailable {
338
+ * build() {
339
+ * return this
340
+ * .to('user@example.com')
341
+ * .vue('emails/welcome.vue', { name: 'Alice' })
342
+ * }
343
+ * }
344
+ * ```
345
+ *
346
+ * @see {@link ReactMjmlRenderer} For React component rendering
347
+ * @see {@link Renderer} For the renderer interface
348
+ * @public
349
+ */
22
350
  export { VueMjmlRenderer } from './renderers/VueMjmlRenderer';
23
- export { TypedMailable } from './TypedMailable';
351
+ /**
352
+ * Base transport class with automatic retry and backoff logic.
353
+ *
354
+ * Provides common functionality for all transports, including exponential
355
+ * backoff retry strategy, connection management, and error handling.
356
+ * Extend this class to implement custom transport drivers.
357
+ *
358
+ * @example
359
+ * ```typescript
360
+ * import { BaseTransport, type TransportOptions } from '@gravito/signal'
361
+ *
362
+ * class CustomTransport extends BaseTransport {
363
+ * async send(message) {
364
+ * // Custom delivery logic
365
+ * }
366
+ * }
367
+ * ```
368
+ *
369
+ * @see {@link SmtpTransport} For production SMTP implementation
370
+ * @see {@link Transport} For the interface
371
+ * @public
372
+ */
24
373
  export { BaseTransport, type TransportOptions } from './transports/BaseTransport';
374
+ /**
375
+ * Console logging transport for development environments.
376
+ *
377
+ * Logs all emails to the console instead of sending them. Useful for
378
+ * local development and testing to avoid sending real emails to users.
379
+ *
380
+ * @example
381
+ * ```typescript
382
+ * import { LogTransport } from '@gravito/signal'
383
+ *
384
+ * const mail = new OrbitSignal({
385
+ * transport: new LogTransport(),
386
+ * from: { address: 'dev@localhost' }
387
+ * })
388
+ * ```
389
+ *
390
+ * @see {@link MemoryTransport} For in-memory testing
391
+ * @public
392
+ */
25
393
  export { LogTransport } from './transports/LogTransport';
394
+ /**
395
+ * In-memory transport for testing email workflows.
396
+ *
397
+ * Stores sent emails in memory without actual transmission. Perfect for
398
+ * unit tests and integration tests where email sending needs to be verified
399
+ * without external dependencies.
400
+ *
401
+ * @example
402
+ * ```typescript
403
+ * import { MemoryTransport } from '@gravito/signal'
404
+ *
405
+ * const transport = new MemoryTransport()
406
+ * const mail = new OrbitSignal({
407
+ * transport,
408
+ * from: { address: 'test@example.com' }
409
+ * })
410
+ *
411
+ * await mail.send(email)
412
+ * assert.equal(transport.sentMessages.length, 1)
413
+ * ```
414
+ *
415
+ * @see {@link LogTransport} For development logging
416
+ * @public
417
+ */
26
418
  export { MemoryTransport } from './transports/MemoryTransport';
419
+ /**
420
+ * AWS SES email transport with automatic retry and rate limit handling.
421
+ *
422
+ * Delivers emails via Amazon Simple Email Service with built-in support
423
+ * for authentication, rate limiting awareness, and automatic retry with
424
+ * exponential backoff suitable for production AWS environments.
425
+ *
426
+ * @example
427
+ * ```typescript
428
+ * import { SesTransport } from '@gravito/signal'
429
+ *
430
+ * const mail = new OrbitSignal({
431
+ * transport: new SesTransport({
432
+ * region: 'us-east-1',
433
+ * retries: 3,
434
+ * retryDelay: 1000,
435
+ * retryMultiplier: 2
436
+ * }),
437
+ * from: { address: 'verified@example.com' }
438
+ * })
439
+ * ```
440
+ *
441
+ * @see {@link SmtpTransport} For SMTP alternative
442
+ * @see {@link SesWebhookDriver} For bounce/complaint handling
443
+ * @public
444
+ */
27
445
  export { SesTransport } from './transports/SesTransport';
446
+ /**
447
+ * SMTP email transport with connection pooling and automatic retry.
448
+ *
449
+ * Delivers emails via standard SMTP protocol with support for TLS/SSL,
450
+ * connection pooling, and automatic retry with exponential backoff.
451
+ * Compatible with any SMTP server (Gmail, Mailtrap, AWS SES SMTP, etc.).
452
+ *
453
+ * @example
454
+ * ```typescript
455
+ * import { SmtpTransport } from '@gravito/signal'
456
+ *
457
+ * const mail = new OrbitSignal({
458
+ * transport: new SmtpTransport({
459
+ * host: 'smtp.mailtrap.io',
460
+ * port: 2525,
461
+ * auth: { user: 'username', pass: 'password' },
462
+ * poolSize: 10
463
+ * }),
464
+ * from: { address: 'noreply@example.com' }
465
+ * })
466
+ * ```
467
+ *
468
+ * @see {@link SesTransport} For AWS SES integration
469
+ * @see {@link BaseTransport} For base retry logic
470
+ * @public
471
+ */
28
472
  export { SmtpTransport } from './transports/SmtpTransport';
473
+ /**
474
+ * Transport interface and implementations for email delivery.
475
+ *
476
+ * Defines the contract for email delivery mechanisms and provides built-in
477
+ * transports: SmtpTransport (standard email servers), SesTransport (AWS SES),
478
+ * LogTransport (console output), and MemoryTransport (testing).
479
+ *
480
+ * @see {@link SmtpTransport} For SMTP server integration
481
+ * @see {@link SesTransport} For AWS SES integration
482
+ * @see {@link LogTransport} For development logging
483
+ * @see {@link MemoryTransport} For testing
484
+ * @public
485
+ */
29
486
  export type { Transport } from './transports/Transport';
487
+ /**
488
+ * Email message types and configuration interfaces.
489
+ *
490
+ * Provides TypeScript interfaces for:
491
+ * - Address: Email address with optional display name
492
+ * - Attachment: File attachment configuration
493
+ * - Envelope: Complete email envelope (from, to, cc, bcc, etc.)
494
+ * - MailConfig: OrbitSignal configuration options
495
+ * - Message: Finalized message ready for transport
496
+ *
497
+ * @example
498
+ * ```typescript
499
+ * import type { Address, Attachment, Message, MailConfig } from '@gravito/signal'
500
+ *
501
+ * const config: MailConfig = {
502
+ * transport: new SmtpTransport({ ... }),
503
+ * from: { name: 'App', address: 'noreply@app.com' }
504
+ * }
505
+ * ```
506
+ *
507
+ * @public
508
+ */
30
509
  export type { Address, Attachment, Envelope, MailConfig, Message, } from './types';
510
+ /**
511
+ * SendGrid webhook driver for handling bounce and complaint events.
512
+ *
513
+ * Processes webhook notifications from SendGrid (bounces, complaints, etc.)
514
+ * and converts them into standardized mail events for logging and analytics.
515
+ *
516
+ * @example
517
+ * ```typescript
518
+ * import { SendGridWebhookDriver } from '@gravito/signal'
519
+ *
520
+ * const driver = new SendGridWebhookDriver()
521
+ * mail.registerWebhookDriver('sendgrid', driver)
522
+ * ```
523
+ *
524
+ * @see {@link SesWebhookDriver} For AWS SES webhooks
525
+ * @public
526
+ */
31
527
  export { type SendGridWebhookConfig, SendGridWebhookDriver } from './webhooks/SendGridWebhookDriver';
528
+ /**
529
+ * AWS SES webhook driver for handling bounce and complaint events.
530
+ *
531
+ * Processes SNS notifications from AWS SES (bounces, complaints, etc.)
532
+ * and converts them into standardized mail events for logging and analytics.
533
+ *
534
+ * @example
535
+ * ```typescript
536
+ * import { SesWebhookDriver } from '@gravito/signal'
537
+ *
538
+ * const driver = new SesWebhookDriver()
539
+ * mail.registerWebhookDriver('ses', driver)
540
+ * ```
541
+ *
542
+ * @see {@link SendGridWebhookDriver} For SendGrid webhooks
543
+ * @public
544
+ */
32
545
  export { SesWebhookDriver } from './webhooks/SesWebhookDriver';