@xacos/mail 1.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 (63) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +17 -0
  3. package/dist/MailManager.d.ts +10 -0
  4. package/dist/MailManager.d.ts.map +1 -0
  5. package/dist/MailManager.js +69 -0
  6. package/dist/MailManager.js.map +1 -0
  7. package/dist/Mailer.d.ts +19 -0
  8. package/dist/Mailer.d.ts.map +1 -0
  9. package/dist/Mailer.js +3 -0
  10. package/dist/Mailer.js.map +1 -0
  11. package/dist/drivers/LogMailer.d.ts +7 -0
  12. package/dist/drivers/LogMailer.d.ts.map +1 -0
  13. package/dist/drivers/LogMailer.js +28 -0
  14. package/dist/drivers/LogMailer.js.map +1 -0
  15. package/dist/drivers/MailgunMailer.d.ts +14 -0
  16. package/dist/drivers/MailgunMailer.d.ts.map +1 -0
  17. package/dist/drivers/MailgunMailer.js +43 -0
  18. package/dist/drivers/MailgunMailer.js.map +1 -0
  19. package/dist/drivers/PostmarkMailer.d.ts +12 -0
  20. package/dist/drivers/PostmarkMailer.d.ts.map +1 -0
  21. package/dist/drivers/PostmarkMailer.js +41 -0
  22. package/dist/drivers/PostmarkMailer.js.map +1 -0
  23. package/dist/drivers/ResendMailer.d.ts +12 -0
  24. package/dist/drivers/ResendMailer.d.ts.map +1 -0
  25. package/dist/drivers/ResendMailer.js +44 -0
  26. package/dist/drivers/ResendMailer.js.map +1 -0
  27. package/dist/drivers/SesMailer.d.ts +14 -0
  28. package/dist/drivers/SesMailer.d.ts.map +1 -0
  29. package/dist/drivers/SesMailer.js +52 -0
  30. package/dist/drivers/SesMailer.js.map +1 -0
  31. package/dist/drivers/SmtpMailer.d.ts +15 -0
  32. package/dist/drivers/SmtpMailer.d.ts.map +1 -0
  33. package/dist/drivers/SmtpMailer.js +46 -0
  34. package/dist/drivers/SmtpMailer.js.map +1 -0
  35. package/dist/drivers/drivers.test.d.ts +2 -0
  36. package/dist/drivers/drivers.test.d.ts.map +1 -0
  37. package/dist/drivers/drivers.test.js +30 -0
  38. package/dist/drivers/drivers.test.js.map +1 -0
  39. package/dist/index.d.ts +10 -0
  40. package/dist/index.d.ts.map +1 -0
  41. package/dist/index.js +10 -0
  42. package/dist/index.js.map +1 -0
  43. package/dist/index.test.d.ts +2 -0
  44. package/dist/index.test.d.ts.map +1 -0
  45. package/dist/index.test.js +18 -0
  46. package/dist/index.test.js.map +1 -0
  47. package/dist/utils/interpolate.d.ts +6 -0
  48. package/dist/utils/interpolate.d.ts.map +1 -0
  49. package/dist/utils/interpolate.js +10 -0
  50. package/dist/utils/interpolate.js.map +1 -0
  51. package/package.json +76 -0
  52. package/src/MailManager.ts +76 -0
  53. package/src/Mailer.ts +22 -0
  54. package/src/drivers/LogMailer.ts +29 -0
  55. package/src/drivers/MailgunMailer.ts +56 -0
  56. package/src/drivers/PostmarkMailer.ts +53 -0
  57. package/src/drivers/ResendMailer.ts +56 -0
  58. package/src/drivers/SesMailer.ts +64 -0
  59. package/src/drivers/SmtpMailer.ts +59 -0
  60. package/src/drivers/drivers.test.ts +34 -0
  61. package/src/index.test.ts +23 -0
  62. package/src/index.ts +11 -0
  63. package/src/utils/interpolate.ts +10 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 XAOCS Team
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,17 @@
1
+ # @xacos/mail
2
+
3
+ > Part of the [XAOCS Framework](https://xaocs.dev) — full-stack TypeScript, built for AI-native development.
4
+
5
+ ## Install
6
+
7
+ ```bash
8
+ bun add @xacos/mail
9
+ ```
10
+
11
+ ## Docs
12
+
13
+ Full documentation at [xaocs.dev/docs/mail](https://xaocs.dev/docs/mail).
14
+
15
+ ## License
16
+
17
+ MIT © XAOCS Team
@@ -0,0 +1,10 @@
1
+ import type { XacosConfig } from '@xacos/config';
2
+ import type { Mailer, MailMessage, MailResult } from './Mailer';
3
+ export declare class MailManager {
4
+ private config;
5
+ private mailer;
6
+ constructor(config?: XacosConfig['mail']);
7
+ getMailer(): Mailer;
8
+ send(message: MailMessage): Promise<MailResult>;
9
+ }
10
+ //# sourceMappingURL=MailManager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MailManager.d.ts","sourceRoot":"","sources":["../src/MailManager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AACjD,OAAO,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAShE,qBAAa,WAAW;IAGV,OAAO,CAAC,MAAM;IAF1B,OAAO,CAAC,MAAM,CAAuB;gBAEjB,MAAM,GAAE,WAAW,CAAC,MAAM,CAAM;IAEpD,SAAS,IAAI,MAAM;IAwDb,IAAI,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC;CAGtD"}
@@ -0,0 +1,69 @@
1
+ import { LogMailer } from './drivers/LogMailer';
2
+ import { SmtpMailer } from './drivers/SmtpMailer';
3
+ import { SesMailer } from './drivers/SesMailer';
4
+ import { MailgunMailer } from './drivers/MailgunMailer';
5
+ import { PostmarkMailer } from './drivers/PostmarkMailer';
6
+ import { ResendMailer } from './drivers/ResendMailer';
7
+ export class MailManager {
8
+ config;
9
+ mailer = null;
10
+ constructor(config = {}) {
11
+ this.config = config;
12
+ }
13
+ getMailer() {
14
+ if (this.mailer)
15
+ return this.mailer;
16
+ const config = this.config ?? {};
17
+ const driver = config.driver ?? 'log';
18
+ switch (driver) {
19
+ case 'smtp':
20
+ this.mailer = new SmtpMailer({
21
+ host: config.host ?? 'localhost',
22
+ port: config.port ?? 587,
23
+ user: config.user ?? '',
24
+ pass: config.pass ?? '',
25
+ from: config.from ?? 'noreply@xacos.dev',
26
+ });
27
+ break;
28
+ case 'ses':
29
+ if (!config.ses)
30
+ throw new Error('[XAOCS Mail] SES config missing');
31
+ this.mailer = new SesMailer({
32
+ region: config.ses.region ?? 'us-east-1',
33
+ key: config.ses.key ?? '',
34
+ secret: config.ses.secret ?? '',
35
+ from: config.from ?? 'noreply@xacos.dev',
36
+ });
37
+ break;
38
+ case 'mailgun':
39
+ this.mailer = new MailgunMailer({
40
+ apiKey: process.env['MAILGUN_API_KEY'] ?? '',
41
+ domain: process.env['MAILGUN_DOMAIN'] ?? '',
42
+ from: config.from ?? 'noreply@xacos.dev',
43
+ host: process.env['MAILGUN_HOST'] ?? undefined,
44
+ });
45
+ break;
46
+ case 'postmark':
47
+ this.mailer = new PostmarkMailer({
48
+ serverToken: process.env['POSTMARK_SERVER_TOKEN'] ?? '',
49
+ from: config.from ?? 'noreply@xacos.dev',
50
+ });
51
+ break;
52
+ case 'resend':
53
+ this.mailer = new ResendMailer({
54
+ apiKey: process.env['RESEND_API_KEY'] ?? '',
55
+ from: config.from ?? 'noreply@xacos.dev',
56
+ });
57
+ break;
58
+ case 'log':
59
+ default:
60
+ this.mailer = new LogMailer(config.from);
61
+ break;
62
+ }
63
+ return this.mailer;
64
+ }
65
+ async send(message) {
66
+ return this.getMailer().send(message);
67
+ }
68
+ }
69
+ //# sourceMappingURL=MailManager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MailManager.js","sourceRoot":"","sources":["../src/MailManager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ export interface MailMessage {
2
+ from?: string;
3
+ to: string | string[];
4
+ subject: string;
5
+ template?: string;
6
+ data?: Record<string, any>;
7
+ text?: string;
8
+ html?: string;
9
+ }
10
+ export interface MailResult {
11
+ success: boolean;
12
+ messageId?: string | undefined;
13
+ error?: string | undefined;
14
+ provider: string;
15
+ }
16
+ export declare abstract class Mailer {
17
+ abstract send(message: MailMessage): Promise<MailResult>;
18
+ }
19
+ //# sourceMappingURL=Mailer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Mailer.d.ts","sourceRoot":"","sources":["../src/Mailer.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,WAAW;IAC1B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,EAAE,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC3B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/B,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,QAAQ,EAAE,MAAM,CAAC;CAClB;AAGD,8BAAsB,MAAM;IAC1B,QAAQ,CAAC,IAAI,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC;CACzD"}
package/dist/Mailer.js ADDED
@@ -0,0 +1,3 @@
1
+ export class Mailer {
2
+ }
3
+ //# sourceMappingURL=Mailer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Mailer.js","sourceRoot":"","sources":["../src/Mailer.ts"],"names":[],"mappings":"AAkBA,MAAM,OAAgB,MAAM;CAE3B"}
@@ -0,0 +1,7 @@
1
+ import type { Mailer, MailMessage, MailResult } from '../Mailer';
2
+ export declare class LogMailer implements Mailer {
3
+ private from;
4
+ constructor(from?: string);
5
+ send(message: MailMessage): Promise<MailResult>;
6
+ }
7
+ //# sourceMappingURL=LogMailer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LogMailer.d.ts","sourceRoot":"","sources":["../../src/drivers/LogMailer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAGjE,qBAAa,SAAU,YAAW,MAAM;IAC1B,OAAO,CAAC,IAAI;gBAAJ,IAAI,GAAE,MAA4B;IAGhD,IAAI,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC;CAoBtD"}
@@ -0,0 +1,28 @@
1
+ import { interpolate } from '../utils/interpolate';
2
+ export class LogMailer {
3
+ from;
4
+ constructor(from = 'noreply@xacos.dev') {
5
+ this.from = from;
6
+ }
7
+ async send(message) {
8
+ const subject = interpolate(message.subject, message.data ?? {});
9
+ const text = message.text ? interpolate(message.text, message.data ?? {}) : undefined;
10
+ const html = message.template
11
+ ? interpolate(message.template, message.data ?? {})
12
+ : (message.html ? interpolate(message.html, message.data ?? {}) : undefined);
13
+ console.log('\n--- [MAIL LOG] ---');
14
+ console.log('From: ', message.from ?? this.from);
15
+ console.log('To: ', message.to);
16
+ console.log('Subject:', subject);
17
+ if (text)
18
+ console.log('Text: ', text);
19
+ if (html)
20
+ console.log('HTML: ', '[Rendered HTML Content]');
21
+ console.log('------------------\n');
22
+ return {
23
+ success: true,
24
+ provider: 'log',
25
+ };
26
+ }
27
+ }
28
+ //# sourceMappingURL=LogMailer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LogMailer.js","sourceRoot":"","sources":["../../src/drivers/LogMailer.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAEnD,MAAM,OAAO,SAAS;IACA;IAApB,YAAoB,OAAe,mBAAmB;QAAlC,SAAI,GAAJ,IAAI,CAA8B;IACtD,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,OAAoB;QAC7B,MAAM,OAAO,GAAG,WAAW,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;QACjE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,WAAW,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QACtF,MAAM,IAAI,GAAG,OAAO,CAAC,QAAQ;YAC3B,CAAC,CAAC,WAAW,CAAC,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,IAAI,IAAI,EAAE,CAAC;YACnD,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,WAAW,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;QAE/E,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC;QACpC,OAAO,CAAC,GAAG,CAAC,UAAU,EAAE,OAAO,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC;QACnD,OAAO,CAAC,GAAG,CAAC,UAAU,EAAE,OAAO,CAAC,EAAE,CAAC,CAAC;QACpC,OAAO,CAAC,GAAG,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;QACjC,IAAI,IAAI;YAAE,OAAO,CAAC,GAAG,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;QACxC,IAAI,IAAI;YAAE,OAAO,CAAC,GAAG,CAAC,UAAU,EAAE,yBAAyB,CAAC,CAAC;QAC7D,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC;QAEpC,OAAO;YACL,OAAO,EAAE,IAAI;YACb,QAAQ,EAAE,KAAK;SAChB,CAAC;IACJ,CAAC;CACF"}
@@ -0,0 +1,14 @@
1
+ import type { Mailer, MailMessage, MailResult } from '../Mailer';
2
+ export interface MailgunConfig {
3
+ apiKey: string;
4
+ domain: string;
5
+ from: string;
6
+ host?: string | undefined;
7
+ }
8
+ export declare class MailgunMailer implements Mailer {
9
+ private client;
10
+ private config;
11
+ constructor(config: MailgunConfig);
12
+ send(message: MailMessage): Promise<MailResult>;
13
+ }
14
+ //# sourceMappingURL=MailgunMailer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MailgunMailer.d.ts","sourceRoot":"","sources":["../../src/drivers/MailgunMailer.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAGjE,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAC3B;AAED,qBAAa,aAAc,YAAW,MAAM;IAC1C,OAAO,CAAC,MAAM,CAAqD;IACnE,OAAO,CAAC,MAAM,CAAgB;gBAElB,MAAM,EAAE,aAAa;IAU3B,IAAI,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC;CA4BtD"}
@@ -0,0 +1,43 @@
1
+ import Mailgun from 'mailgun.js';
2
+ import FormData from 'form-data';
3
+ import { interpolate } from '../utils/interpolate';
4
+ export class MailgunMailer {
5
+ client;
6
+ config;
7
+ constructor(config) {
8
+ this.config = config;
9
+ const mg = new Mailgun(FormData);
10
+ this.client = mg.client({
11
+ username: 'api',
12
+ key: config.apiKey,
13
+ url: config.host ?? 'https://api.mailgun.net',
14
+ });
15
+ }
16
+ async send(message) {
17
+ const html = message.template
18
+ ? interpolate(message.template, message.data ?? {})
19
+ : message.html ?? '';
20
+ try {
21
+ const response = await this.client.messages.create(this.config.domain, {
22
+ from: message.from ?? this.config.from,
23
+ to: Array.isArray(message.to) ? message.to : [message.to],
24
+ subject: message.subject,
25
+ html,
26
+ text: message.text,
27
+ });
28
+ return {
29
+ success: true,
30
+ messageId: response.id,
31
+ provider: 'mailgun',
32
+ };
33
+ }
34
+ catch (error) {
35
+ return {
36
+ success: false,
37
+ error: error.message,
38
+ provider: 'mailgun',
39
+ };
40
+ }
41
+ }
42
+ }
43
+ //# sourceMappingURL=MailgunMailer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MailgunMailer.js","sourceRoot":"","sources":["../../src/drivers/MailgunMailer.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,YAAY,CAAC;AACjC,OAAO,QAAQ,MAAM,WAAW,CAAC;AAEjC,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AASnD,MAAM,OAAO,aAAa;IAChB,MAAM,CAAqD;IAC3D,MAAM,CAAgB;IAE9B,YAAY,MAAqB;QAC/B,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,MAAM,EAAE,GAAG,IAAI,OAAO,CAAC,QAAQ,CAAC,CAAC;QACjC,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC,MAAM,CAAC;YACtB,QAAQ,EAAE,KAAK;YACf,GAAG,EAAE,MAAM,CAAC,MAAM;YAClB,GAAG,EAAE,MAAM,CAAC,IAAI,IAAI,yBAAyB;SAC9C,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,OAAoB;QAC7B,MAAM,IAAI,GAAG,OAAO,CAAC,QAAQ;YAC3B,CAAC,CAAC,WAAW,CAAC,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,IAAI,IAAI,EAAE,CAAC;YACnD,CAAC,CAAC,OAAO,CAAC,IAAI,IAAI,EAAE,CAAC;QAEvB,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE;gBACrE,IAAI,EAAE,OAAO,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI;gBACtC,EAAE,EAAE,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;gBACzD,OAAO,EAAE,OAAO,CAAC,OAAO;gBACxB,IAAI;gBACJ,IAAI,EAAE,OAAO,CAAC,IAAI;aACZ,CAAC,CAAC;YAGV,OAAO;gBACL,OAAO,EAAE,IAAI;gBACb,SAAS,EAAE,QAAQ,CAAC,EAAE;gBACtB,QAAQ,EAAE,SAAS;aACpB,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,KAAK,EAAG,KAAe,CAAC,OAAO;gBAC/B,QAAQ,EAAE,SAAS;aACpB,CAAC;QACJ,CAAC;IACH,CAAC;CACF"}
@@ -0,0 +1,12 @@
1
+ import type { Mailer, MailMessage, MailResult } from '../Mailer';
2
+ export interface PostmarkConfig {
3
+ serverToken: string;
4
+ from: string;
5
+ }
6
+ export declare class PostmarkMailer implements Mailer {
7
+ private client;
8
+ private config;
9
+ constructor(config: PostmarkConfig);
10
+ send(message: MailMessage): Promise<MailResult>;
11
+ }
12
+ //# sourceMappingURL=PostmarkMailer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PostmarkMailer.d.ts","sourceRoot":"","sources":["../../src/drivers/PostmarkMailer.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAGjE,MAAM,WAAW,cAAc;IAC7B,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,qBAAa,cAAe,YAAW,MAAM;IAC3C,OAAO,CAAC,MAAM,CAAe;IAC7B,OAAO,CAAC,MAAM,CAAiB;gBAEnB,MAAM,EAAE,cAAc;IAK5B,IAAI,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC;CAiCtD"}
@@ -0,0 +1,41 @@
1
+ import { ServerClient } from 'postmark';
2
+ import { interpolate } from '../utils/interpolate';
3
+ export class PostmarkMailer {
4
+ client;
5
+ config;
6
+ constructor(config) {
7
+ this.config = config;
8
+ this.client = new ServerClient(config.serverToken);
9
+ }
10
+ async send(message) {
11
+ const htmlBody = message.template
12
+ ? interpolate(message.template, message.data ?? {})
13
+ : message.html ?? '';
14
+ try {
15
+ const messageData = {
16
+ From: message.from ?? this.config.from,
17
+ To: Array.isArray(message.to) ? message.to.join(',') : message.to,
18
+ Subject: message.subject,
19
+ MessageStream: 'outbound',
20
+ };
21
+ if (htmlBody)
22
+ messageData.HtmlBody = htmlBody;
23
+ if (message.text)
24
+ messageData.TextBody = message.text;
25
+ const response = await this.client.sendEmail(messageData);
26
+ return {
27
+ success: true,
28
+ messageId: response.MessageID,
29
+ provider: 'postmark',
30
+ };
31
+ }
32
+ catch (error) {
33
+ return {
34
+ success: false,
35
+ error: error.message,
36
+ provider: 'postmark',
37
+ };
38
+ }
39
+ }
40
+ }
41
+ //# sourceMappingURL=PostmarkMailer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PostmarkMailer.js","sourceRoot":"","sources":["../../src/drivers/PostmarkMailer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAExC,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAOnD,MAAM,OAAO,cAAc;IACjB,MAAM,CAAe;IACrB,MAAM,CAAiB;IAE/B,YAAY,MAAsB;QAChC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,MAAM,GAAG,IAAI,YAAY,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;IACrD,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,OAAoB;QAC7B,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ;YAC/B,CAAC,CAAC,WAAW,CAAC,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,IAAI,IAAI,EAAE,CAAC;YACnD,CAAC,CAAC,OAAO,CAAC,IAAI,IAAI,EAAE,CAAC;QAEvB,IAAI,CAAC;YACH,MAAM,WAAW,GAAQ;gBACvB,IAAI,EAAE,OAAO,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI;gBACtC,EAAE,EAAE,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE;gBACjE,OAAO,EAAE,OAAO,CAAC,OAAO;gBACxB,aAAa,EAAE,UAAU;aAC1B,CAAC;YAEF,IAAI,QAAQ;gBAAE,WAAW,CAAC,QAAQ,GAAG,QAAQ,CAAC;YAC9C,IAAI,OAAO,CAAC,IAAI;gBAAE,WAAW,CAAC,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;YAEtD,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;YAI1D,OAAO;gBACL,OAAO,EAAE,IAAI;gBACb,SAAS,EAAE,QAAQ,CAAC,SAAS;gBAC7B,QAAQ,EAAE,UAAU;aACrB,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,KAAK,EAAG,KAAe,CAAC,OAAO;gBAC/B,QAAQ,EAAE,UAAU;aACrB,CAAC;QACJ,CAAC;IACH,CAAC;CACF"}
@@ -0,0 +1,12 @@
1
+ import type { Mailer, MailMessage, MailResult } from '../Mailer';
2
+ export interface ResendConfig {
3
+ apiKey: string;
4
+ from: string;
5
+ }
6
+ export declare class ResendMailer implements Mailer {
7
+ private client;
8
+ private config;
9
+ constructor(config: ResendConfig);
10
+ send(message: MailMessage): Promise<MailResult>;
11
+ }
12
+ //# sourceMappingURL=ResendMailer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ResendMailer.d.ts","sourceRoot":"","sources":["../../src/drivers/ResendMailer.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAGjE,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;CACd;AAED,qBAAa,YAAa,YAAW,MAAM;IACzC,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,MAAM,CAAe;gBAEjB,MAAM,EAAE,YAAY;IAK1B,IAAI,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC;CAoCtD"}
@@ -0,0 +1,44 @@
1
+ import { Resend } from 'resend';
2
+ import { interpolate } from '../utils/interpolate';
3
+ export class ResendMailer {
4
+ client;
5
+ config;
6
+ constructor(config) {
7
+ this.config = config;
8
+ this.client = new Resend(config.apiKey);
9
+ }
10
+ async send(message) {
11
+ const html = message.template
12
+ ? interpolate(message.template, message.data ?? {})
13
+ : message.html ?? '';
14
+ try {
15
+ const response = await this.client.emails.send({
16
+ from: message.from ?? this.config.from,
17
+ to: Array.isArray(message.to) ? message.to : [message.to],
18
+ subject: message.subject,
19
+ html,
20
+ text: message.text,
21
+ });
22
+ if (response.error) {
23
+ return {
24
+ success: false,
25
+ error: response.error.message,
26
+ provider: 'resend',
27
+ };
28
+ }
29
+ return {
30
+ success: true,
31
+ messageId: response.data?.id,
32
+ provider: 'resend',
33
+ };
34
+ }
35
+ catch (error) {
36
+ return {
37
+ success: false,
38
+ error: error.message,
39
+ provider: 'resend',
40
+ };
41
+ }
42
+ }
43
+ }
44
+ //# sourceMappingURL=ResendMailer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ResendMailer.js","sourceRoot":"","sources":["../../src/drivers/ResendMailer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAEhC,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAOnD,MAAM,OAAO,YAAY;IACf,MAAM,CAAS;IACf,MAAM,CAAe;IAE7B,YAAY,MAAoB;QAC9B,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,MAAM,GAAG,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAC1C,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,OAAoB;QAC7B,MAAM,IAAI,GAAG,OAAO,CAAC,QAAQ;YAC3B,CAAC,CAAC,WAAW,CAAC,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,IAAI,IAAI,EAAE,CAAC;YACnD,CAAC,CAAC,OAAO,CAAC,IAAI,IAAI,EAAE,CAAC;QAEvB,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC;gBAC7C,IAAI,EAAE,OAAO,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI;gBACtC,EAAE,EAAE,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;gBACzD,OAAO,EAAE,OAAO,CAAC,OAAO;gBACxB,IAAI;gBACJ,IAAI,EAAE,OAAO,CAAC,IAAI;aACZ,CAAC,CAAC;YAGV,IAAI,QAAQ,CAAC,KAAK,EAAE,CAAC;gBACnB,OAAO;oBACL,OAAO,EAAE,KAAK;oBACd,KAAK,EAAE,QAAQ,CAAC,KAAK,CAAC,OAAO;oBAC7B,QAAQ,EAAE,QAAQ;iBACnB,CAAC;YACJ,CAAC;YAED,OAAO;gBACL,OAAO,EAAE,IAAI;gBACb,SAAS,EAAE,QAAQ,CAAC,IAAI,EAAE,EAAE;gBAC5B,QAAQ,EAAE,QAAQ;aACnB,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,KAAK,EAAG,KAAe,CAAC,OAAO;gBAC/B,QAAQ,EAAE,QAAQ;aACnB,CAAC;QACJ,CAAC;IACH,CAAC;CACF"}
@@ -0,0 +1,14 @@
1
+ import type { Mailer, MailMessage, MailResult } from '../Mailer';
2
+ export interface SesConfig {
3
+ region: string;
4
+ key: string;
5
+ secret: string;
6
+ from: string;
7
+ }
8
+ export declare class SesMailer implements Mailer {
9
+ private client;
10
+ private defaultFrom;
11
+ constructor(config: SesConfig);
12
+ send(message: MailMessage): Promise<MailResult>;
13
+ }
14
+ //# sourceMappingURL=SesMailer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SesMailer.d.ts","sourceRoot":"","sources":["../../src/drivers/SesMailer.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAGjE,MAAM,WAAW,SAAS;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;CACd;AAED,qBAAa,SAAU,YAAW,MAAM;IACtC,OAAO,CAAC,MAAM,CAAY;IAC1B,OAAO,CAAC,WAAW,CAAS;gBAEhB,MAAM,EAAE,SAAS;IAWvB,IAAI,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC;CAoCtD"}
@@ -0,0 +1,52 @@
1
+ import { SESClient, SendEmailCommand } from '@aws-sdk/client-ses';
2
+ import { interpolate } from '../utils/interpolate';
3
+ export class SesMailer {
4
+ client;
5
+ defaultFrom;
6
+ constructor(config) {
7
+ this.defaultFrom = config.from;
8
+ this.client = new SESClient({
9
+ region: config.region,
10
+ credentials: {
11
+ accessKeyId: config.key,
12
+ secretAccessKey: config.secret,
13
+ },
14
+ });
15
+ }
16
+ async send(message) {
17
+ const subject = interpolate(message.subject, message.data ?? {});
18
+ const text = message.text ? interpolate(message.text, message.data ?? {}) : undefined;
19
+ const html = message.template
20
+ ? interpolate(message.template, message.data ?? {})
21
+ : (message.html ? interpolate(message.html, message.data ?? {}) : undefined);
22
+ const command = new SendEmailCommand({
23
+ Source: message.from ?? this.defaultFrom,
24
+ Destination: {
25
+ ToAddresses: Array.isArray(message.to) ? message.to : [message.to],
26
+ },
27
+ Message: {
28
+ Subject: { Data: subject },
29
+ Body: {
30
+ Text: text ? { Data: text } : undefined,
31
+ Html: html ? { Data: html } : undefined,
32
+ },
33
+ },
34
+ });
35
+ try {
36
+ const response = await this.client.send(command);
37
+ return {
38
+ success: true,
39
+ messageId: response.MessageId,
40
+ provider: 'ses',
41
+ };
42
+ }
43
+ catch (error) {
44
+ return {
45
+ success: false,
46
+ error: error.message,
47
+ provider: 'ses',
48
+ };
49
+ }
50
+ }
51
+ }
52
+ //# sourceMappingURL=SesMailer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SesMailer.js","sourceRoot":"","sources":["../../src/drivers/SesMailer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAElE,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AASnD,MAAM,OAAO,SAAS;IACZ,MAAM,CAAY;IAClB,WAAW,CAAS;IAE5B,YAAY,MAAiB;QAC3B,IAAI,CAAC,WAAW,GAAG,MAAM,CAAC,IAAI,CAAC;QAC/B,IAAI,CAAC,MAAM,GAAG,IAAI,SAAS,CAAC;YAC1B,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,WAAW,EAAE;gBACX,WAAW,EAAE,MAAM,CAAC,GAAG;gBACvB,eAAe,EAAE,MAAM,CAAC,MAAM;aAC/B;SACF,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,OAAoB;QAC7B,MAAM,OAAO,GAAG,WAAW,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;QACjE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,WAAW,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QACtF,MAAM,IAAI,GAAG,OAAO,CAAC,QAAQ;YAC3B,CAAC,CAAC,WAAW,CAAC,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,IAAI,IAAI,EAAE,CAAC;YACnD,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,WAAW,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;QAE/E,MAAM,OAAO,GAAG,IAAI,gBAAgB,CAAC;YACnC,MAAM,EAAE,OAAO,CAAC,IAAI,IAAI,IAAI,CAAC,WAAW;YACxC,WAAW,EAAE;gBACX,WAAW,EAAE,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;aACnE;YACD,OAAO,EAAE;gBACP,OAAO,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE;gBAC1B,IAAI,EAAE;oBACJ,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,SAAS;oBACvC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,SAAS;iBACxC;aACF;SACF,CAAC,CAAC;QAEH,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACjD,OAAO;gBACL,OAAO,EAAE,IAAI;gBACb,SAAS,EAAE,QAAQ,CAAC,SAAS;gBAC7B,QAAQ,EAAE,KAAK;aAChB,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,KAAK,EAAG,KAAe,CAAC,OAAO;gBAC/B,QAAQ,EAAE,KAAK;aAChB,CAAC;QACJ,CAAC;IACH,CAAC;CACF"}
@@ -0,0 +1,15 @@
1
+ import type { Mailer, MailMessage, MailResult } from '../Mailer';
2
+ export interface SmtpConfig {
3
+ host: string;
4
+ port: number;
5
+ user: string;
6
+ pass: string;
7
+ from: string;
8
+ }
9
+ export declare class SmtpMailer implements Mailer {
10
+ private transporter;
11
+ private defaultFrom;
12
+ constructor(config: SmtpConfig);
13
+ send(message: MailMessage): Promise<MailResult>;
14
+ }
15
+ //# sourceMappingURL=SmtpMailer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SmtpMailer.d.ts","sourceRoot":"","sources":["../../src/drivers/SmtpMailer.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAGjE,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd;AAED,qBAAa,UAAW,YAAW,MAAM;IACvC,OAAO,CAAC,WAAW,CAAyB;IAC5C,OAAO,CAAC,WAAW,CAAS;gBAEhB,MAAM,EAAE,UAAU;IAYxB,IAAI,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC;CA6BtD"}
@@ -0,0 +1,46 @@
1
+ import nodemailer from 'nodemailer';
2
+ import { interpolate } from '../utils/interpolate';
3
+ export class SmtpMailer {
4
+ transporter;
5
+ defaultFrom;
6
+ constructor(config) {
7
+ this.defaultFrom = config.from;
8
+ this.transporter = nodemailer.createTransport({
9
+ host: config.host,
10
+ port: config.port,
11
+ auth: {
12
+ user: config.user,
13
+ pass: config.pass,
14
+ },
15
+ });
16
+ }
17
+ async send(message) {
18
+ const subject = interpolate(message.subject, message.data ?? {});
19
+ const text = message.text ? interpolate(message.text, message.data ?? {}) : undefined;
20
+ const html = message.template
21
+ ? interpolate(message.template, message.data ?? {})
22
+ : (message.html ? interpolate(message.html, message.data ?? {}) : undefined);
23
+ try {
24
+ const response = await this.transporter.sendMail({
25
+ from: message.from ?? this.defaultFrom,
26
+ to: Array.isArray(message.to) ? message.to.join(', ') : message.to,
27
+ subject,
28
+ text,
29
+ html,
30
+ });
31
+ return {
32
+ success: true,
33
+ messageId: response.messageId,
34
+ provider: 'smtp',
35
+ };
36
+ }
37
+ catch (error) {
38
+ return {
39
+ success: false,
40
+ error: error.message,
41
+ provider: 'smtp',
42
+ };
43
+ }
44
+ }
45
+ }
46
+ //# sourceMappingURL=SmtpMailer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SmtpMailer.js","sourceRoot":"","sources":["../../src/drivers/SmtpMailer.ts"],"names":[],"mappings":"AAAA,OAAO,UAAU,MAAM,YAAY,CAAC;AAEpC,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAUnD,MAAM,OAAO,UAAU;IACb,WAAW,CAAyB;IACpC,WAAW,CAAS;IAE5B,YAAY,MAAkB;QAC5B,IAAI,CAAC,WAAW,GAAG,MAAM,CAAC,IAAI,CAAC;QAC/B,IAAI,CAAC,WAAW,GAAG,UAAU,CAAC,eAAe,CAAC;YAC5C,IAAI,EAAE,MAAM,CAAC,IAAI;YACjB,IAAI,EAAE,MAAM,CAAC,IAAI;YACjB,IAAI,EAAE;gBACJ,IAAI,EAAE,MAAM,CAAC,IAAI;gBACjB,IAAI,EAAE,MAAM,CAAC,IAAI;aAClB;SACF,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,OAAoB;QAC7B,MAAM,OAAO,GAAG,WAAW,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;QACjE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,WAAW,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QACtF,MAAM,IAAI,GAAG,OAAO,CAAC,QAAQ;YAC3B,CAAC,CAAC,WAAW,CAAC,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,IAAI,IAAI,EAAE,CAAC;YACnD,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,WAAW,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;QAE/E,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC;gBAC/C,IAAI,EAAE,OAAO,CAAC,IAAI,IAAI,IAAI,CAAC,WAAW;gBACtC,EAAE,EAAE,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE;gBAClE,OAAO;gBACP,IAAI;gBACJ,IAAI;aACL,CAAC,CAAC;YAEH,OAAO;gBACL,OAAO,EAAE,IAAI;gBACb,SAAS,EAAE,QAAQ,CAAC,SAAS;gBAC7B,QAAQ,EAAE,MAAM;aACjB,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,KAAK,EAAG,KAAe,CAAC,OAAO;gBAC/B,QAAQ,EAAE,MAAM;aACjB,CAAC;QACJ,CAAC;IACH,CAAC;CACF"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=drivers.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"drivers.test.d.ts","sourceRoot":"","sources":["../../src/drivers/drivers.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,30 @@
1
+ import { describe, it, expect } from "bun:test";
2
+ import { MailgunMailer } from "./MailgunMailer";
3
+ import { PostmarkMailer } from "./PostmarkMailer";
4
+ import { ResendMailer } from "./ResendMailer";
5
+ describe("MailgunMailer", () => {
6
+ it("constructs without throwing", () => {
7
+ expect(() => new MailgunMailer({
8
+ apiKey: "key-test",
9
+ domain: "test.example.com",
10
+ from: "test@example.com",
11
+ })).not.toThrow();
12
+ });
13
+ });
14
+ describe("PostmarkMailer", () => {
15
+ it("constructs without throwing", () => {
16
+ expect(() => new PostmarkMailer({
17
+ serverToken: "token-test",
18
+ from: "test@example.com",
19
+ })).not.toThrow();
20
+ });
21
+ });
22
+ describe("ResendMailer", () => {
23
+ it("constructs without throwing", () => {
24
+ expect(() => new ResendMailer({
25
+ apiKey: "re_test",
26
+ from: "test@example.com",
27
+ })).not.toThrow();
28
+ });
29
+ });
30
+ //# sourceMappingURL=drivers.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"drivers.test.js","sourceRoot":"","sources":["../../src/drivers/drivers.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAChD,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAE9C,QAAQ,CAAC,eAAe,EAAE,GAAG,EAAE;IAC7B,EAAE,CAAC,6BAA6B,EAAE,GAAG,EAAE;QACrC,MAAM,CAAC,GAAG,EAAE,CAAC,IAAI,aAAa,CAAC;YAC7B,MAAM,EAAE,UAAU;YAClB,MAAM,EAAE,kBAAkB;YAC1B,IAAI,EAAE,kBAAkB;SACzB,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;IACpB,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;IAC9B,EAAE,CAAC,6BAA6B,EAAE,GAAG,EAAE;QACrC,MAAM,CAAC,GAAG,EAAE,CAAC,IAAI,cAAc,CAAC;YAC9B,WAAW,EAAE,YAAY;YACzB,IAAI,EAAE,kBAAkB;SACzB,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;IACpB,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,cAAc,EAAE,GAAG,EAAE;IAC5B,EAAE,CAAC,6BAA6B,EAAE,GAAG,EAAE;QACrC,MAAM,CAAC,GAAG,EAAE,CAAC,IAAI,YAAY,CAAC;YAC5B,MAAM,EAAE,SAAS;YACjB,IAAI,EAAE,kBAAkB;SACzB,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;IACpB,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,10 @@
1
+ export * from './Mailer';
2
+ export * from './MailManager';
3
+ export * from './drivers/LogMailer';
4
+ export * from './drivers/SmtpMailer';
5
+ export * from './drivers/SesMailer';
6
+ export * from './drivers/MailgunMailer';
7
+ export * from './drivers/PostmarkMailer';
8
+ export * from './drivers/ResendMailer';
9
+ export * from './utils/interpolate';
10
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAC;AACzB,cAAc,eAAe,CAAC;AAC9B,cAAc,qBAAqB,CAAC;AACpC,cAAc,sBAAsB,CAAC;AACrC,cAAc,qBAAqB,CAAC;AACpC,cAAc,yBAAyB,CAAC;AACxC,cAAc,0BAA0B,CAAC;AACzC,cAAc,wBAAwB,CAAC;AAEvC,cAAc,qBAAqB,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,10 @@
1
+ export * from './Mailer';
2
+ export * from './MailManager';
3
+ export * from './drivers/LogMailer';
4
+ export * from './drivers/SmtpMailer';
5
+ export * from './drivers/SesMailer';
6
+ export * from './drivers/MailgunMailer';
7
+ export * from './drivers/PostmarkMailer';
8
+ export * from './drivers/ResendMailer';
9
+ export * from './utils/interpolate';
10
+ //# sourceMappingURL=index.js.map