@impruthvi/nodemail 0.2.0 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -7,6 +7,33 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [0.3.0] - 2025-11-25
11
+
12
+ ### Added
13
+ - **New email providers** (3 additional providers)
14
+ - MailgunProvider with dynamic loading
15
+ - ResendProvider with dynamic loading
16
+ - PostmarkProvider with dynamic loading
17
+ - Example files for new providers
18
+ - examples/mailgun.ts
19
+ - examples/resend.ts
20
+ - examples/postmark.ts
21
+ - Support for all provider-specific features
22
+ - Mailgun: EU region support, custom headers
23
+ - Resend: Tags and custom headers
24
+ - Postmark: Message streams and tags
25
+ - Updated MailManager to support 6 total providers
26
+
27
+ ### Changed
28
+ - Updated README with documentation for Mailgun, Resend, and Postmark
29
+ - Updated package.json to version 0.3.0
30
+ - Added form-data as peer dependency for Mailgun
31
+ - Updated provider installation instructions
32
+
33
+ ### Fixed
34
+ - TypeScript strict mode compliance for new providers
35
+ - ESLint warnings with proper annotations
36
+
10
37
  ## [0.2.0] - 2025-11-23
11
38
 
12
39
  ### Added
package/README.md CHANGED
@@ -1,11 +1,14 @@
1
- # nodemail
1
+ # @impruthvi/nodemail
2
2
 
3
+ [![npm version](https://badge.fury.io/js/@impruthvi%2Fnodemail.svg)](https://www.npmjs.com/package/@impruthvi/nodemail)
3
4
  [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
4
5
  [![TypeScript](https://img.shields.io/badge/TypeScript-5.6-blue.svg)](https://www.typescriptlang.org/)
6
+ [![Tests](https://img.shields.io/badge/tests-25%20passing-brightgreen)](https://github.com/impruthvi/nodemail)
7
+ [![Coverage](https://img.shields.io/badge/coverage-95%25-brightgreen)](https://github.com/impruthvi/nodemail)
5
8
 
6
9
  > 🚧 **Work in Progress** - A unified mail service for Node.js/TypeScript inspired by Laravel's elegant Mail system.
7
10
 
8
- **nodemail** aims to bring the simplicity and elegance of Laravel's Mail system to the Node.js ecosystem with full TypeScript support.
11
+ **@impruthvi/nodemail** aims to bring the simplicity and elegance of Laravel's Mail system to the Node.js ecosystem with full TypeScript support.
9
12
 
10
13
  ## ðŸŽŊ Vision
11
14
 
@@ -20,7 +23,7 @@ Inspired by [Laravel's Mail system](https://laravel.com/docs/mail).
20
23
  ## âœĻ Features
21
24
 
22
25
  ### ✅ Available Now
23
- - ðŸŽŊ **Multiple Providers** - SMTP (Nodemailer), SendGrid, AWS SES
26
+ - ðŸŽŊ **Multiple Providers** - SMTP (Nodemailer), SendGrid, AWS SES, Mailgun, Resend, Postmark
24
27
  - ðŸŠķ **Lightweight** - Only ~25MB with SMTP, install additional providers as needed
25
28
  - 🔒 **Type-Safe** - Full TypeScript support with strict typing
26
29
  - ðŸŽĻ **Fluent API** - Chainable, Laravel-inspired interface
@@ -35,12 +38,17 @@ Inspired by [Laravel's Mail system](https://laravel.com/docs/mail).
35
38
  - ðŸ“Ķ **Queue Support** - Background email sending (Bull/BullMQ)
36
39
  - ðŸŽĻ **Template Engines** - Handlebars, EJS, Pug
37
40
  - 🌍 **i18n Support** - Multi-language emails
38
- - 🚀 **More Providers** - Mailgun, Resend, Postmark, Mailtrap
41
+ - 🚀 **More Providers** - Mailtrap and others
39
42
 
40
43
  ## ðŸ“Ķ Installation
41
44
 
42
45
  ```bash
43
- npm install nodemail
46
+ npm install @impruthvi/nodemail@beta
47
+ ```
48
+
49
+ Or for the latest stable (when v1.0.0 is released):
50
+ ```bash
51
+ npm install @impruthvi/nodemail
44
52
  ```
45
53
 
46
54
  **Lightweight by default!** Only includes SMTP support (~25MB).
@@ -54,17 +62,14 @@ npm install @sendgrid/mail
54
62
 
55
63
  # AWS SES (✅ Implemented)
56
64
  npm install @aws-sdk/client-ses
57
- ```
58
65
 
59
- **Coming Soon:**
60
- ```bash
61
- # Mailgun
62
- npm install mailgun.js
66
+ # Mailgun (✅ Implemented)
67
+ npm install mailgun.js form-data
63
68
 
64
- # Resend
69
+ # Resend (✅ Implemented)
65
70
  npm install resend
66
71
 
67
- # Postmark
72
+ # Postmark (✅ Implemented)
68
73
  npm install postmark
69
74
  ```
70
75
 
@@ -105,6 +110,8 @@ await Mail.to('user@example.com')
105
110
 
106
111
  ```typescript
107
112
  // npm install @sendgrid/mail
113
+ import { Mail } from '@impruthvi/nodemail';
114
+
108
115
  Mail.configure({
109
116
  default: 'sendgrid',
110
117
  from: { address: 'noreply@example.com', name: 'My App' },
@@ -121,6 +128,8 @@ Mail.configure({
121
128
 
122
129
  ```typescript
123
130
  // npm install @aws-sdk/client-ses
131
+ import { Mail } from '@impruthvi/nodemail';
132
+
124
133
  Mail.configure({
125
134
  default: 'ses',
126
135
  from: { address: 'noreply@example.com', name: 'My App' },
@@ -135,6 +144,62 @@ Mail.configure({
135
144
  });
136
145
  ```
137
146
 
147
+ ### Mailgun
148
+
149
+ ```typescript
150
+ // npm install mailgun.js form-data
151
+ import { Mail } from '@impruthvi/nodemail';
152
+
153
+ Mail.configure({
154
+ default: 'mailgun',
155
+ from: { address: 'noreply@yourdomain.com', name: 'My App' },
156
+ mailers: {
157
+ mailgun: {
158
+ driver: 'mailgun',
159
+ domain: process.env.MAILGUN_DOMAIN,
160
+ apiKey: process.env.MAILGUN_API_KEY,
161
+ region: 'us', // or 'eu'
162
+ },
163
+ },
164
+ });
165
+ ```
166
+
167
+ ### Resend
168
+
169
+ ```typescript
170
+ // npm install resend
171
+ import { Mail } from '@impruthvi/nodemail';
172
+
173
+ Mail.configure({
174
+ default: 'resend',
175
+ from: { address: 'noreply@yourdomain.com', name: 'My App' },
176
+ mailers: {
177
+ resend: {
178
+ driver: 'resend',
179
+ apiKey: process.env.RESEND_API_KEY,
180
+ },
181
+ },
182
+ });
183
+ ```
184
+
185
+ ### Postmark
186
+
187
+ ```typescript
188
+ // npm install postmark
189
+ import { Mail } from '@impruthvi/nodemail';
190
+
191
+ Mail.configure({
192
+ default: 'postmark',
193
+ from: { address: 'noreply@yourdomain.com', name: 'My App' },
194
+ mailers: {
195
+ postmark: {
196
+ driver: 'postmark',
197
+ serverToken: process.env.POSTMARK_SERVER_TOKEN,
198
+ },
199
+ },
200
+ });
201
+ ```
202
+
138
203
  **Advanced usage (coming soon):**
139
204
 
140
205
  ```typescript
@@ -281,10 +346,10 @@ If you've used Laravel's Mail system, you know how elegant it is:
281
346
  Mail::to($user->email)->send(new WelcomeEmail($user));
282
347
  ```
283
348
 
284
- **nodemail** brings this same elegance to Node.js/TypeScript:
349
+ **@impruthvi/nodemail** brings this same elegance to Node.js/TypeScript:
285
350
 
286
351
  ```typescript
287
- // nodemail (TypeScript)
352
+ // @impruthvi/nodemail (TypeScript)
288
353
  await Mail.to(user.email).send(new WelcomeEmail(user));
289
354
  ```
290
355
 
@@ -1 +1 @@
1
- {"version":3,"file":"MailManager.d.ts","sourceRoot":"","sources":["../../src/core/MailManager.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EACV,UAAU,EACV,WAAW,EAEX,YAAY,EAEb,MAAM,UAAU,CAAC;AAKlB,qBAAa,WAAW;IACtB,OAAO,CAAC,MAAM,CAAa;IAC3B,OAAO,CAAC,SAAS,CAAwC;gBAE7C,MAAM,EAAE,UAAU;IAO9B,OAAO,CAAC,cAAc;IAgBtB,OAAO,CAAC,WAAW;IAyBnB,EAAE,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE;IAO7B,MAAM,CAAC,IAAI,EAAE,MAAM;IAab,IAAI,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,YAAY,CAAC;IAQvD,gBAAgB,IAAI,MAAM;CAG3B;AAKD,qBAAa,cAAc;IAIvB,OAAO,CAAC,OAAO;IAHV,OAAO,EAAE,OAAO,CAAC,WAAW,CAAC,CAAM;gBAGhC,OAAO,EAAE,WAAW,EAC5B,EAAE,EAAE,MAAM,GAAG,MAAM,EAAE;IAKvB,OAAO,CAAC,OAAO,EAAE,MAAM;IAKvB,IAAI,CAAC,IAAI,EAAE,MAAM;IAKjB,IAAI,CAAC,IAAI,EAAE,MAAM;IAKjB,IAAI,CAAC,IAAI,EAAE,MAAM;IAKX,IAAI,IAAI,OAAO,CAAC,YAAY,CAAC;CAOpC"}
1
+ {"version":3,"file":"MailManager.d.ts","sourceRoot":"","sources":["../../src/core/MailManager.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EACV,UAAU,EACV,WAAW,EAEX,YAAY,EAEb,MAAM,UAAU,CAAC;AAQlB,qBAAa,WAAW;IACtB,OAAO,CAAC,MAAM,CAAa;IAC3B,OAAO,CAAC,SAAS,CAAwC;gBAE7C,MAAM,EAAE,UAAU;IAO9B,OAAO,CAAC,cAAc;IAsBtB,OAAO,CAAC,WAAW;IAyBnB,EAAE,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE;IAO7B,MAAM,CAAC,IAAI,EAAE,MAAM;IAab,IAAI,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,YAAY,CAAC;IAQvD,gBAAgB,IAAI,MAAM;CAG3B;AAKD,qBAAa,cAAc;IAIvB,OAAO,CAAC,OAAO;IAHV,OAAO,EAAE,OAAO,CAAC,WAAW,CAAC,CAAM;gBAGhC,OAAO,EAAE,WAAW,EAC5B,EAAE,EAAE,MAAM,GAAG,MAAM,EAAE;IAKvB,OAAO,CAAC,OAAO,EAAE,MAAM;IAKvB,IAAI,CAAC,IAAI,EAAE,MAAM;IAKjB,IAAI,CAAC,IAAI,EAAE,MAAM;IAKjB,IAAI,CAAC,IAAI,EAAE,MAAM;IAKX,IAAI,IAAI,OAAO,CAAC,YAAY,CAAC;CAOpC"}
@@ -4,6 +4,9 @@ exports.MessageBuilder = exports.MailManager = void 0;
4
4
  const SmtpProvider_1 = require("../providers/SmtpProvider");
5
5
  const SendGridProvider_1 = require("../providers/SendGridProvider");
6
6
  const SesProvider_1 = require("../providers/SesProvider");
7
+ const MailgunProvider_1 = require("../providers/MailgunProvider");
8
+ const ResendProvider_1 = require("../providers/ResendProvider");
9
+ const PostmarkProvider_1 = require("../providers/PostmarkProvider");
7
10
  class MailManager {
8
11
  config;
9
12
  providers = new Map();
@@ -18,6 +21,12 @@ class MailManager {
18
21
  return new SendGridProvider_1.SendGridProvider(mailerConfig);
19
22
  case 'ses':
20
23
  return new SesProvider_1.SesProvider(mailerConfig);
24
+ case 'mailgun':
25
+ return new MailgunProvider_1.MailgunProvider(mailerConfig);
26
+ case 'resend':
27
+ return new ResendProvider_1.ResendProvider(mailerConfig);
28
+ case 'postmark':
29
+ return new PostmarkProvider_1.PostmarkProvider(mailerConfig);
21
30
  default:
22
31
  throw new Error(`Unsupported mail driver: ${mailerConfig.driver}`);
23
32
  }
@@ -1 +1 @@
1
- {"version":3,"file":"MailManager.js","sourceRoot":"","sources":["../../src/core/MailManager.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"MailManager.js","sourceRoot":"","sources":["../../src/core/MailManager.ts"],"names":[],"mappings":";;;AAYA,4DAAyD;AACzD,oEAAiE;AACjE,0DAAuD;AACvD,kEAA+D;AAC/D,gEAA6D;AAC7D,oEAAiE;AAEjE,MAAa,WAAW;IACd,MAAM,CAAa;IACnB,SAAS,GAA8B,IAAI,GAAG,EAAE,CAAC;IAEzD,YAAY,MAAkB;QAC5B,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;IAKO,cAAc,CAAC,YAA0B;QAC/C,QAAQ,YAAY,CAAC,MAAM,EAAE,CAAC;YAC5B,KAAK,MAAM;gBACT,OAAO,IAAI,2BAAY,CAAC,YAA6C,CAAC,CAAC;YACzE,KAAK,UAAU;gBACb,OAAO,IAAI,mCAAgB,CAAC,YAAiD,CAAC,CAAC;YACjF,KAAK,KAAK;gBACR,OAAO,IAAI,yBAAW,CAAC,YAA4C,CAAC,CAAC;YACvE,KAAK,SAAS;gBACZ,OAAO,IAAI,iCAAe,CAAC,YAAgD,CAAC,CAAC;YAC/E,KAAK,QAAQ;gBACX,OAAO,IAAI,+BAAc,CAAC,YAA+C,CAAC,CAAC;YAC7E,KAAK,UAAU;gBACb,OAAO,IAAI,mCAAgB,CAAC,YAAiD,CAAC,CAAC;YACjF;gBACE,MAAM,IAAI,KAAK,CAAC,4BAA4B,YAAY,CAAC,MAAM,EAAE,CAAC,CAAC;QACvE,CAAC;IACH,CAAC;IAKO,WAAW,CAAC,IAAa;QAC/B,MAAM,UAAU,GAAG,IAAI,IAAI,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC;QAE/C,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC;YACrC,MAAM,IAAI,KAAK,CAAC,WAAW,UAAU,qBAAqB,CAAC,CAAC;QAC9D,CAAC;QAGD,IAAI,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QAC9C,IAAI,CAAC,QAAQ,EAAE,CAAC;YAEd,MAAM,YAAY,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;YACrD,IAAI,CAAC,YAAY,EAAE,CAAC;gBAClB,MAAM,IAAI,KAAK,CAAC,WAAW,UAAU,2BAA2B,CAAC,CAAC;YACpE,CAAC;YACD,QAAQ,GAAG,IAAI,CAAC,cAAc,CAAC,YAAY,CAAC,CAAC;YAC7C,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;QAC3C,CAAC;QAED,OAAO,QAAQ,CAAC;IAClB,CAAC;IAKD,EAAE,CAAC,OAA0B;QAC3B,OAAO,IAAI,cAAc,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAC3C,CAAC;IAKD,MAAM,CAAC,IAAY;QACjB,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;YAC/B,MAAM,IAAI,KAAK,CAAC,WAAW,IAAI,qBAAqB,CAAC,CAAC;QACxD,CAAC;QAGD,MAAM,SAAS,GAAG,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QACpD,OAAO,IAAI,WAAW,CAAC,SAAS,CAAC,CAAC;IACpC,CAAC;IAKD,KAAK,CAAC,IAAI,CAAC,OAAoB;QAC7B,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;QACpC,OAAO,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAChC,CAAC;IAKD,gBAAgB;QACd,OAAO,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC;IAC7B,CAAC;CACF;AAzFD,kCAyFC;AAKD,MAAa,cAAc;IAIf;IAHH,OAAO,GAAyB,EAAE,CAAC;IAE1C,YACU,OAAoB,EAC5B,EAAqB;QADb,YAAO,GAAP,OAAO,CAAa;QAG5B,IAAI,CAAC,OAAO,CAAC,EAAE,GAAG,EAAE,CAAC;IACvB,CAAC;IAED,OAAO,CAAC,OAAe;QACrB,IAAI,CAAC,OAAO,CAAC,OAAO,GAAG,OAAO,CAAC;QAC/B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,CAAC,IAAY;QACf,IAAI,CAAC,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC;QACzB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,CAAC,IAAY;QACf,IAAI,CAAC,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC;QACzB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,CAAC,IAAY;QACf,IAAI,CAAC,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC;QACzB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,KAAK,CAAC,IAAI;QACR,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;YAC1B,MAAM,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAC;QAC/C,CAAC;QAED,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,OAAsB,CAAC,CAAC;IACxD,CAAC;CACF;AArCD,wCAqCC"}
package/dist/index.d.ts CHANGED
@@ -5,6 +5,9 @@ export { Message } from './core/Message';
5
5
  export { SmtpProvider } from './providers/SmtpProvider';
6
6
  export { SendGridProvider } from './providers/SendGridProvider';
7
7
  export { SesProvider } from './providers/SesProvider';
8
+ export { MailgunProvider } from './providers/MailgunProvider';
9
+ export { ResendProvider } from './providers/ResendProvider';
10
+ export { PostmarkProvider } from './providers/PostmarkProvider';
8
11
  export * from './types';
9
- export declare const VERSION = "0.1.0";
12
+ export declare const VERSION = "0.3.0";
10
13
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AACzC,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAC3C,OAAO,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAGzC,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACxD,OAAO,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAChE,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAGtD,cAAc,SAAS,CAAC;AAGxB,eAAO,MAAM,OAAO,UAAU,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AACzC,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAC3C,OAAO,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAGzC,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACxD,OAAO,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAChE,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACtD,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAC9D,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAC5D,OAAO,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAGhE,cAAc,SAAS,CAAC;AAGxB,eAAO,MAAM,OAAO,UAAU,CAAC"}
package/dist/index.js CHANGED
@@ -14,7 +14,7 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
14
  for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
15
  };
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
- exports.VERSION = exports.SesProvider = exports.SendGridProvider = exports.SmtpProvider = exports.Message = exports.Mailable = exports.MailManager = exports.Mail = void 0;
17
+ exports.VERSION = exports.PostmarkProvider = exports.ResendProvider = exports.MailgunProvider = exports.SesProvider = exports.SendGridProvider = exports.SmtpProvider = exports.Message = exports.Mailable = exports.MailManager = exports.Mail = void 0;
18
18
  var MailFacade_1 = require("./core/MailFacade");
19
19
  Object.defineProperty(exports, "Mail", { enumerable: true, get: function () { return MailFacade_1.Mail; } });
20
20
  var MailManager_1 = require("./core/MailManager");
@@ -29,6 +29,12 @@ var SendGridProvider_1 = require("./providers/SendGridProvider");
29
29
  Object.defineProperty(exports, "SendGridProvider", { enumerable: true, get: function () { return SendGridProvider_1.SendGridProvider; } });
30
30
  var SesProvider_1 = require("./providers/SesProvider");
31
31
  Object.defineProperty(exports, "SesProvider", { enumerable: true, get: function () { return SesProvider_1.SesProvider; } });
32
+ var MailgunProvider_1 = require("./providers/MailgunProvider");
33
+ Object.defineProperty(exports, "MailgunProvider", { enumerable: true, get: function () { return MailgunProvider_1.MailgunProvider; } });
34
+ var ResendProvider_1 = require("./providers/ResendProvider");
35
+ Object.defineProperty(exports, "ResendProvider", { enumerable: true, get: function () { return ResendProvider_1.ResendProvider; } });
36
+ var PostmarkProvider_1 = require("./providers/PostmarkProvider");
37
+ Object.defineProperty(exports, "PostmarkProvider", { enumerable: true, get: function () { return PostmarkProvider_1.PostmarkProvider; } });
32
38
  __exportStar(require("./types"), exports);
33
- exports.VERSION = '0.1.0';
39
+ exports.VERSION = '0.3.0';
34
40
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAKA,gDAAyC;AAAhC,kGAAA,IAAI,OAAA;AACb,kDAAiD;AAAxC,0GAAA,WAAW,OAAA;AACpB,4CAA2C;AAAlC,oGAAA,QAAQ,OAAA;AACjB,0CAAyC;AAAhC,kGAAA,OAAO,OAAA;AAGhB,yDAAwD;AAA/C,4GAAA,YAAY,OAAA;AACrB,iEAAgE;AAAvD,oHAAA,gBAAgB,OAAA;AACzB,uDAAsD;AAA7C,0GAAA,WAAW,OAAA;AAGpB,0CAAwB;AAGX,QAAA,OAAO,GAAG,OAAO,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAKA,gDAAyC;AAAhC,kGAAA,IAAI,OAAA;AACb,kDAAiD;AAAxC,0GAAA,WAAW,OAAA;AACpB,4CAA2C;AAAlC,oGAAA,QAAQ,OAAA;AACjB,0CAAyC;AAAhC,kGAAA,OAAO,OAAA;AAGhB,yDAAwD;AAA/C,4GAAA,YAAY,OAAA;AACrB,iEAAgE;AAAvD,oHAAA,gBAAgB,OAAA;AACzB,uDAAsD;AAA7C,0GAAA,WAAW,OAAA;AACpB,+DAA8D;AAArD,kHAAA,eAAe,OAAA;AACxB,6DAA4D;AAAnD,gHAAA,cAAc,OAAA;AACvB,iEAAgE;AAAvD,oHAAA,gBAAgB,OAAA;AAGzB,0CAAwB;AAGX,QAAA,OAAO,GAAG,OAAO,CAAC"}
@@ -0,0 +1,15 @@
1
+ import type { MailProvider, MailOptions, MailResponse } from '../types';
2
+ export declare class MailgunProvider implements MailProvider {
3
+ private client;
4
+ private domain;
5
+ constructor(config: {
6
+ apiKey: string;
7
+ domain: string;
8
+ region?: 'us' | 'eu';
9
+ host?: string;
10
+ });
11
+ send(options: MailOptions): Promise<MailResponse>;
12
+ private formatAddress;
13
+ private formatRecipients;
14
+ }
15
+ //# sourceMappingURL=MailgunProvider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MailgunProvider.d.ts","sourceRoot":"","sources":["../../src/providers/MailgunProvider.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,YAAY,EAAe,MAAM,UAAU,CAAC;AAMrF,qBAAa,eAAgB,YAAW,YAAY;IAElD,OAAO,CAAC,MAAM,CAAM;IACpB,OAAO,CAAC,MAAM,CAAS;gBAEX,MAAM,EAAE;QAClB,MAAM,EAAE,MAAM,CAAC;QACf,MAAM,EAAE,MAAM,CAAC;QACf,MAAM,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC;QACrB,IAAI,CAAC,EAAE,MAAM,CAAC;KACf;IAsCK,IAAI,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,YAAY,CAAC;IA0EvD,OAAO,CAAC,aAAa;IAUrB,OAAO,CAAC,gBAAgB;CAQzB"}
@@ -0,0 +1,103 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.MailgunProvider = void 0;
4
+ class MailgunProvider {
5
+ client;
6
+ domain;
7
+ constructor(config) {
8
+ if (!config.apiKey) {
9
+ throw new Error('Mailgun API key is required');
10
+ }
11
+ if (!config.domain) {
12
+ throw new Error('Mailgun domain is required');
13
+ }
14
+ this.domain = config.domain;
15
+ try {
16
+ const Mailgun = require('mailgun.js');
17
+ const formData = require('form-data');
18
+ const mailgun = new Mailgun(formData);
19
+ const clientOptions = {
20
+ key: config.apiKey,
21
+ };
22
+ if (config.region === 'eu') {
23
+ clientOptions.url = 'https://api.eu.mailgun.net';
24
+ }
25
+ else if (config.host) {
26
+ clientOptions.url = config.host;
27
+ }
28
+ this.client = mailgun.client(clientOptions);
29
+ }
30
+ catch {
31
+ throw new Error('Mailgun provider requires "mailgun.js" and "form-data" packages. ' +
32
+ 'Install with: npm install mailgun.js form-data');
33
+ }
34
+ }
35
+ async send(options) {
36
+ try {
37
+ const mailgunMessage = {
38
+ from: options.from ? this.formatAddress(options.from) : undefined,
39
+ to: this.formatRecipients(Array.isArray(options.to) ? options.to : [options.to]),
40
+ subject: options.subject,
41
+ };
42
+ if (options.cc) {
43
+ const cc = Array.isArray(options.cc) ? options.cc : [options.cc];
44
+ mailgunMessage.cc = this.formatRecipients(cc);
45
+ }
46
+ if (options.bcc) {
47
+ const bcc = Array.isArray(options.bcc) ? options.bcc : [options.bcc];
48
+ mailgunMessage.bcc = this.formatRecipients(bcc);
49
+ }
50
+ if (options.html) {
51
+ mailgunMessage.html = options.html;
52
+ }
53
+ if (options.text) {
54
+ mailgunMessage.text = options.text;
55
+ }
56
+ if (options.replyTo) {
57
+ mailgunMessage['h:Reply-To'] = this.formatAddress(options.replyTo);
58
+ }
59
+ if (options.headers) {
60
+ for (const [key, value] of Object.entries(options.headers)) {
61
+ mailgunMessage[`h:${key}`] = value;
62
+ }
63
+ }
64
+ if (options.attachments && options.attachments.length > 0) {
65
+ mailgunMessage.attachment = options.attachments.map((att) => ({
66
+ filename: att.filename,
67
+ data: att.content ? Buffer.from(att.content) : undefined,
68
+ }));
69
+ }
70
+ const result = await this.client.messages.create(this.domain, mailgunMessage);
71
+ return {
72
+ success: true,
73
+ messageId: result?.id,
74
+ };
75
+ }
76
+ catch (error) {
77
+ if (error instanceof Error) {
78
+ return {
79
+ success: false,
80
+ error: `Mailgun send failed: ${error.message}`,
81
+ };
82
+ }
83
+ return {
84
+ success: false,
85
+ error: 'Mailgun send failed with unknown error',
86
+ };
87
+ }
88
+ }
89
+ formatAddress(address) {
90
+ if (typeof address === 'string') {
91
+ return address;
92
+ }
93
+ return address.name ? `${address.name} <${address.address}>` : address.address;
94
+ }
95
+ formatRecipients(addresses) {
96
+ if (addresses.length === 1 && addresses[0]) {
97
+ return this.formatAddress(addresses[0]);
98
+ }
99
+ return addresses.map((addr) => this.formatAddress(addr));
100
+ }
101
+ }
102
+ exports.MailgunProvider = MailgunProvider;
103
+ //# sourceMappingURL=MailgunProvider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MailgunProvider.js","sourceRoot":"","sources":["../../src/providers/MailgunProvider.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import type { MailProvider, MailOptions, MailResponse } from '../types';
2
+ export declare class PostmarkProvider implements MailProvider {
3
+ private client;
4
+ constructor(config: {
5
+ serverToken: string;
6
+ });
7
+ send(options: MailOptions): Promise<MailResponse>;
8
+ private formatAddress;
9
+ private formatRecipients;
10
+ }
11
+ //# sourceMappingURL=PostmarkProvider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PostmarkProvider.d.ts","sourceRoot":"","sources":["../../src/providers/PostmarkProvider.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,YAAY,EAAe,MAAM,UAAU,CAAC;AAMrF,qBAAa,gBAAiB,YAAW,YAAY;IAEnD,OAAO,CAAC,MAAM,CAAM;gBAER,MAAM,EAAE;QAAE,WAAW,EAAE,MAAM,CAAA;KAAE;IAmBrC,IAAI,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,YAAY,CAAC;IA4EvD,OAAO,CAAC,aAAa;IAUrB,OAAO,CAAC,gBAAgB;CAGzB"}
@@ -0,0 +1,84 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.PostmarkProvider = void 0;
4
+ class PostmarkProvider {
5
+ client;
6
+ constructor(config) {
7
+ if (!config.serverToken) {
8
+ throw new Error('Postmark server token is required');
9
+ }
10
+ try {
11
+ const postmark = require('postmark');
12
+ this.client = new postmark.ServerClient(config.serverToken);
13
+ }
14
+ catch {
15
+ throw new Error('Postmark provider requires "postmark" package. ' +
16
+ 'Install with: npm install postmark');
17
+ }
18
+ }
19
+ async send(options) {
20
+ try {
21
+ const postmarkMessage = {
22
+ From: options.from ? this.formatAddress(options.from) : undefined,
23
+ To: this.formatRecipients(Array.isArray(options.to) ? options.to : [options.to]).join(', '),
24
+ Subject: options.subject,
25
+ };
26
+ if (options.cc) {
27
+ const cc = Array.isArray(options.cc) ? options.cc : [options.cc];
28
+ postmarkMessage.Cc = this.formatRecipients(cc).join(', ');
29
+ }
30
+ if (options.bcc) {
31
+ const bcc = Array.isArray(options.bcc) ? options.bcc : [options.bcc];
32
+ postmarkMessage.Bcc = this.formatRecipients(bcc).join(', ');
33
+ }
34
+ if (options.html) {
35
+ postmarkMessage.HtmlBody = options.html;
36
+ }
37
+ if (options.text) {
38
+ postmarkMessage.TextBody = options.text;
39
+ }
40
+ if (options.replyTo) {
41
+ postmarkMessage.ReplyTo = this.formatAddress(options.replyTo);
42
+ }
43
+ if (options.headers) {
44
+ postmarkMessage.Headers = Object.entries(options.headers).map(([Name, Value]) => ({ Name, Value }));
45
+ }
46
+ if (options.attachments && options.attachments.length > 0) {
47
+ postmarkMessage.Attachments = options.attachments.map((att) => ({
48
+ Name: att.filename,
49
+ Content: att.content,
50
+ ContentType: att.contentType || 'application/octet-stream',
51
+ ContentID: att.cid,
52
+ }));
53
+ }
54
+ const result = await this.client.sendEmail(postmarkMessage);
55
+ return {
56
+ success: true,
57
+ messageId: result?.MessageID,
58
+ };
59
+ }
60
+ catch (error) {
61
+ if (error instanceof Error) {
62
+ return {
63
+ success: false,
64
+ error: `Postmark send failed: ${error.message}`,
65
+ };
66
+ }
67
+ return {
68
+ success: false,
69
+ error: 'Postmark send failed with unknown error',
70
+ };
71
+ }
72
+ }
73
+ formatAddress(address) {
74
+ if (typeof address === 'string') {
75
+ return address;
76
+ }
77
+ return address.name ? `${address.name} <${address.address}>` : address.address;
78
+ }
79
+ formatRecipients(addresses) {
80
+ return addresses.map((addr) => this.formatAddress(addr));
81
+ }
82
+ }
83
+ exports.PostmarkProvider = PostmarkProvider;
84
+ //# sourceMappingURL=PostmarkProvider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PostmarkProvider.js","sourceRoot":"","sources":["../../src/providers/PostmarkProvider.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import type { MailProvider, MailOptions, MailResponse } from '../types';
2
+ export declare class ResendProvider implements MailProvider {
3
+ private client;
4
+ constructor(config: {
5
+ apiKey: string;
6
+ });
7
+ send(options: MailOptions): Promise<MailResponse>;
8
+ private formatAddress;
9
+ private formatRecipients;
10
+ }
11
+ //# sourceMappingURL=ResendProvider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ResendProvider.d.ts","sourceRoot":"","sources":["../../src/providers/ResendProvider.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,YAAY,EAAe,MAAM,UAAU,CAAC;AAMrF,qBAAa,cAAe,YAAW,YAAY;IAEjD,OAAO,CAAC,MAAM,CAAM;gBAER,MAAM,EAAE;QAAE,MAAM,EAAE,MAAM,CAAA;KAAE;IAmBhC,IAAI,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,YAAY,CAAC;IAuEvD,OAAO,CAAC,aAAa;IAUrB,OAAO,CAAC,gBAAgB;CAGzB"}
@@ -0,0 +1,82 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ResendProvider = void 0;
4
+ class ResendProvider {
5
+ client;
6
+ constructor(config) {
7
+ if (!config.apiKey) {
8
+ throw new Error('Resend API key is required');
9
+ }
10
+ try {
11
+ const { Resend } = require('resend');
12
+ this.client = new Resend(config.apiKey);
13
+ }
14
+ catch {
15
+ throw new Error('Resend provider requires "resend" package. ' +
16
+ 'Install with: npm install resend');
17
+ }
18
+ }
19
+ async send(options) {
20
+ try {
21
+ const resendMessage = {
22
+ from: options.from ? this.formatAddress(options.from) : undefined,
23
+ to: this.formatRecipients(Array.isArray(options.to) ? options.to : [options.to]),
24
+ subject: options.subject,
25
+ };
26
+ if (options.cc) {
27
+ const cc = Array.isArray(options.cc) ? options.cc : [options.cc];
28
+ resendMessage.cc = this.formatRecipients(cc);
29
+ }
30
+ if (options.bcc) {
31
+ const bcc = Array.isArray(options.bcc) ? options.bcc : [options.bcc];
32
+ resendMessage.bcc = this.formatRecipients(bcc);
33
+ }
34
+ if (options.html) {
35
+ resendMessage.html = options.html;
36
+ }
37
+ else if (options.text) {
38
+ resendMessage.text = options.text;
39
+ }
40
+ if (options.replyTo) {
41
+ resendMessage.reply_to = this.formatAddress(options.replyTo);
42
+ }
43
+ if (options.headers) {
44
+ resendMessage.headers = options.headers;
45
+ }
46
+ if (options.attachments && options.attachments.length > 0) {
47
+ resendMessage.attachments = options.attachments.map((att) => ({
48
+ filename: att.filename,
49
+ content: att.content ? Buffer.from(att.content) : undefined,
50
+ }));
51
+ }
52
+ const result = await this.client.emails.send(resendMessage);
53
+ return {
54
+ success: true,
55
+ messageId: result?.data?.id,
56
+ };
57
+ }
58
+ catch (error) {
59
+ if (error instanceof Error) {
60
+ return {
61
+ success: false,
62
+ error: `Resend send failed: ${error.message}`,
63
+ };
64
+ }
65
+ return {
66
+ success: false,
67
+ error: 'Resend send failed with unknown error',
68
+ };
69
+ }
70
+ }
71
+ formatAddress(address) {
72
+ if (typeof address === 'string') {
73
+ return address;
74
+ }
75
+ return address.name ? `${address.name} <${address.address}>` : address.address;
76
+ }
77
+ formatRecipients(addresses) {
78
+ return addresses.map((addr) => this.formatAddress(addr));
79
+ }
80
+ }
81
+ exports.ResendProvider = ResendProvider;
82
+ //# sourceMappingURL=ResendProvider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ResendProvider.js","sourceRoot":"","sources":["../../src/providers/ResendProvider.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ import { config } from 'dotenv';
2
+ import { Mail } from '../src';
3
+
4
+ // Load environment variables
5
+ config();
6
+
7
+ async function main() {
8
+ try {
9
+ console.log('📧 Sending email via Mailgun...\n');
10
+
11
+ const response = await Mail.to('recipient@example.com')
12
+ .subject('Test Email from Mailgun Provider')
13
+ .html('<h1>Hello from Mailgun!</h1><p>This email was sent using @impruthvi/nodemail with Mailgun.</p>')
14
+ .text('Hello from Mailgun! This email was sent using @impruthvi/nodemail with Mailgun.')
15
+ .cc('cc@example.com')
16
+ .send();
17
+
18
+ console.log('✅ Email sent successfully!');
19
+ console.log('Response:', response);
20
+ } catch (error) {
21
+ console.error('❌ Error sending email:', error);
22
+ process.exit(1);
23
+ }
24
+ }
25
+
26
+ main();
@@ -0,0 +1,25 @@
1
+ import { config } from 'dotenv';
2
+ import { Mail } from '../src';
3
+
4
+ // Load environment variables
5
+ config();
6
+
7
+ async function main() {
8
+ try {
9
+ console.log('📧 Sending email via Postmark...\n');
10
+
11
+ const response = await Mail.to('recipient@example.com')
12
+ .subject('Test Email from Postmark Provider')
13
+ .html('<h1>Hello from Postmark!</h1><p>This email was sent using @impruthvi/nodemail with Postmark.</p>')
14
+ .text('Hello from Postmark! This email was sent using @impruthvi/nodemail with Postmark.')
15
+ .send();
16
+
17
+ console.log('✅ Email sent successfully!');
18
+ console.log('Response:', response);
19
+ } catch (error) {
20
+ console.error('❌ Error sending email:', error);
21
+ process.exit(1);
22
+ }
23
+ }
24
+
25
+ main();
@@ -0,0 +1,25 @@
1
+ import { config } from 'dotenv';
2
+ import { Mail } from '../src';
3
+
4
+ // Load environment variables
5
+ config();
6
+
7
+ async function main() {
8
+ try {
9
+ console.log('📧 Sending email via Resend...\n');
10
+
11
+ const response = await Mail.to('recipient@example.com')
12
+ .subject('Test Email from Resend Provider')
13
+ .html('<h1>Hello from Resend!</h1><p>This email was sent using @impruthvi/nodemail with Resend.</p>')
14
+ .text('Hello from Resend! This email was sent using @impruthvi/nodemail with Resend.')
15
+ .send();
16
+
17
+ console.log('✅ Email sent successfully!');
18
+ console.log('Response:', response);
19
+ } catch (error) {
20
+ console.error('❌ Error sending email:', error);
21
+ process.exit(1);
22
+ }
23
+ }
24
+
25
+ main();
package/package.json CHANGED
@@ -1,11 +1,9 @@
1
1
  {
2
2
  "name": "@impruthvi/nodemail",
3
- "version": "0.2.0",
4
- "description": "A unified mail service for Node.js/TypeScript with Laravel-like simplicity. Support for multiple providers (SMTP, SendGrid, AWS SES, Mailgun, Resend, etc.) - just change environment variables, no code changes needed.",
3
+ "version": "0.3.0",
4
+ "description": "A unified mail service for Node.js/TypeScript with Laravel-like simplicity. Support for multiple providers (SMTP, SendGrid, AWS SES, Mailgun, Resend, Postmark) - just change environment variables, no code changes needed.",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
7
- "bin": {
8
- },
9
7
  "scripts": {
10
8
  "build": "tsc",
11
9
  "dev": "tsx watch src/index.ts",
@@ -66,6 +64,7 @@
66
64
  "peerDependencies": {
67
65
  "@aws-sdk/client-ses": "^3.699.0",
68
66
  "@sendgrid/mail": "^8.1.4",
67
+ "form-data": "^4.0.1",
69
68
  "mailgun.js": "^10.2.3",
70
69
  "postmark": "^4.0.5",
71
70
  "resend": "^4.0.1"
@@ -77,6 +76,9 @@
77
76
  "@aws-sdk/client-ses": {
78
77
  "optional": true
79
78
  },
79
+ "form-data": {
80
+ "optional": true
81
+ },
80
82
  "mailgun.js": {
81
83
  "optional": true
82
84
  },