@impruthvi/nodemail 0.3.0 → 0.4.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 (51) hide show
  1. package/CHANGELOG.md +63 -0
  2. package/README.md +145 -7
  3. package/dist/core/MailFacade.d.ts +1 -0
  4. package/dist/core/MailFacade.d.ts.map +1 -1
  5. package/dist/core/MailFacade.js +4 -0
  6. package/dist/core/MailFacade.js.map +1 -1
  7. package/dist/core/MailManager.d.ts +11 -2
  8. package/dist/core/MailManager.d.ts.map +1 -1
  9. package/dist/core/MailManager.js +79 -1
  10. package/dist/core/MailManager.js.map +1 -1
  11. package/dist/core/Mailable.d.ts +12 -2
  12. package/dist/core/Mailable.d.ts.map +1 -1
  13. package/dist/core/Mailable.js +44 -2
  14. package/dist/core/Mailable.js.map +1 -1
  15. package/dist/index.d.ts +3 -1
  16. package/dist/index.d.ts.map +1 -1
  17. package/dist/index.js +6 -2
  18. package/dist/index.js.map +1 -1
  19. package/dist/templates/EjsEngine.d.ts +14 -0
  20. package/dist/templates/EjsEngine.d.ts.map +1 -0
  21. package/dist/templates/EjsEngine.js +59 -0
  22. package/dist/templates/EjsEngine.js.map +1 -0
  23. package/dist/templates/HandlebarsEngine.d.ts +16 -0
  24. package/dist/templates/HandlebarsEngine.d.ts.map +1 -0
  25. package/dist/templates/HandlebarsEngine.js +65 -0
  26. package/dist/templates/HandlebarsEngine.js.map +1 -0
  27. package/dist/templates/PugEngine.d.ts +15 -0
  28. package/dist/templates/PugEngine.d.ts.map +1 -0
  29. package/dist/templates/PugEngine.js +70 -0
  30. package/dist/templates/PugEngine.js.map +1 -0
  31. package/dist/templates/TemplateEngine.d.ts +12 -0
  32. package/dist/templates/TemplateEngine.d.ts.map +1 -0
  33. package/dist/templates/TemplateEngine.js +3 -0
  34. package/dist/templates/TemplateEngine.js.map +1 -0
  35. package/dist/templates/index.d.ts +5 -0
  36. package/dist/templates/index.d.ts.map +1 -0
  37. package/dist/templates/index.js +10 -0
  38. package/dist/templates/index.js.map +1 -0
  39. package/dist/types/index.d.ts +9 -0
  40. package/dist/types/index.d.ts.map +1 -1
  41. package/examples/mailgun.ts +1 -1
  42. package/examples/postmark.ts +1 -1
  43. package/examples/resend.ts +1 -1
  44. package/examples/views/invoice.ejs +26 -0
  45. package/examples/views/notification.pug +14 -0
  46. package/examples/views/welcome.hbs +15 -0
  47. package/examples/with-ejs.ts +63 -0
  48. package/examples/with-handlebars.ts +60 -0
  49. package/examples/with-mailable-templates.ts +146 -0
  50. package/examples/with-pug.ts +66 -0
  51. package/package.json +16 -4
package/CHANGELOG.md CHANGED
@@ -7,6 +7,69 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [0.4.0] - 2025-12-07
11
+
12
+ ### Added
13
+ - **Template Engine Support** (Phase 4 complete)
14
+ - HandlebarsEngine with dynamic loading and caching
15
+ - EjsEngine with dynamic loading and caching
16
+ - PugEngine with dynamic loading and caching
17
+ - TemplateEngine interface for custom engines
18
+ - **Complete Fluent API** - All email options now chainable
19
+ - Added `cc()` method for carbon copy recipients
20
+ - Added `bcc()` method for blind carbon copy recipients
21
+ - Added `replyTo()` method for reply-to addresses
22
+ - Added `attachments()` method for file attachments
23
+ - Added `headers()` method for custom headers
24
+ - **Laravel-like Mailable Pattern** - Elegant email class API
25
+ - `Mailable.to()` method for setting recipients
26
+ - `Mailable.send()` method for direct sending
27
+ - `Mail.to().send(mailable)` Laravel-style syntax (recommended)
28
+ - `mailable.to().send()` alternative direct syntax
29
+ - Protected methods: `cc()`, `bcc()`, `replyTo()`, `attach()`, `withHeaders()`
30
+ - Enhanced MailManager with automatic template rendering
31
+ - Added template configuration to MailConfig
32
+ - Support for 'handlebars', 'ejs', 'pug' engines
33
+ - Custom engine instance support
34
+ - Configurable views path, extension, and caching
35
+ - Template engine tests (34 new tests)
36
+ - HandlebarsEngine.test.ts (11 tests)
37
+ - EjsEngine.test.ts (11 tests)
38
+ - PugEngine.test.ts (12 tests)
39
+ - Mailable tests (10 new tests)
40
+ - Comprehensive Mailable class testing
41
+ - Template support validation
42
+ - Laravel-style API testing
43
+ - Template examples
44
+ - examples/with-handlebars.ts
45
+ - examples/with-ejs.ts
46
+ - examples/with-pug.ts
47
+ - examples/with-mailable-templates.ts (refactored)
48
+ - examples/views/ directory with sample templates
49
+ - Test utilities
50
+ - test-smtp-ethereal.ts for instant SMTP testing
51
+ - test-templates.ts for template engine validation
52
+
53
+ ### Changed
54
+ - **BREAKING**: Refactored Mailable class to Laravel-like pattern
55
+ - Removed `getMailOptions()` method
56
+ - Now uses `build()` method with fluent API
57
+ - Direct sending capability added
58
+ - Updated package.json to version 0.4.0
59
+ - Added handlebars, ejs, pug to peerDependencies (all optional)
60
+ - Enhanced MessageBuilder.send() to accept Mailable instances
61
+ - Updated test suite: 122 total tests (17 new tests added)
62
+ - Code coverage: 85%+ overall
63
+ - Template engines coverage: 93.5%
64
+ - ESLint configuration for all directories (src, examples, tests)
65
+
66
+ ### Fixed
67
+ - Type safety for template engine configuration
68
+ - Promise handling in template rendering
69
+ - ESLint warnings for template engine dynamic loading
70
+ - ESLint parsing errors for examples directory
71
+ - Floating promise warnings in example files
72
+
10
73
  ## [0.3.0] - 2025-11-25
11
74
 
12
75
  ### Added
package/README.md CHANGED
@@ -3,8 +3,8 @@
3
3
  [![npm version](https://badge.fury.io/js/@impruthvi%2Fnodemail.svg)](https://www.npmjs.com/package/@impruthvi/nodemail)
4
4
  [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
5
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)
6
+ [![Tests](https://img.shields.io/badge/tests-112%20passing-brightgreen)](https://github.com/impruthvi/nodemail)
7
+ [![Coverage](https://img.shields.io/badge/coverage-85%25-brightgreen)](https://github.com/impruthvi/nodemail)
8
8
 
9
9
  > 🚧 **Work in Progress** - A unified mail service for Node.js/TypeScript inspired by Laravel's elegant Mail system.
10
10
 
@@ -22,21 +22,21 @@ Inspired by [Laravel's Mail system](https://laravel.com/docs/mail).
22
22
 
23
23
  ## ✨ Features
24
24
 
25
- ### ✅ Available Now
25
+ ### ✅ Available Now (v0.4.0)
26
26
  - 🎯 **Multiple Providers** - SMTP (Nodemailer), SendGrid, AWS SES, Mailgun, Resend, Postmark
27
+ - 🎨 **Template Engines** - Handlebars, EJS, Pug support with dynamic loading
28
+ - 📝 **Mailable Classes** - Reusable email definitions with template support
27
29
  - 🪶 **Lightweight** - Only ~25MB with SMTP, install additional providers as needed
28
30
  - 🔒 **Type-Safe** - Full TypeScript support with strict typing
29
- - 🎨 **Fluent API** - Chainable, Laravel-inspired interface
30
- - ⚡ **Dynamic Loading** - Providers loaded only when installed (peerDependencies)
31
+ - **Complete Fluent API** - Chain to(), subject(), html(), template(), data(), cc(), bcc(), attachments(), headers()
32
+ - ⚡ **Dynamic Loading** - Providers and templates loaded only when installed (peerDependencies)
31
33
  - 🛡️ **Error Handling** - Graceful degradation with helpful error messages
32
34
 
33
35
  ### 🚧 Coming Soon
34
- - 📝 **Mailable Classes** - Enhanced reusable email definitions
35
36
  - 🔔 **Notifications** - Multi-channel notification system
36
37
  - 📋 **Markdown Mail** - Beautiful emails from markdown
37
38
  - 🧪 **Testing Utilities** - Mail::fake() for testing
38
39
  - 📦 **Queue Support** - Background email sending (Bull/BullMQ)
39
- - 🎨 **Template Engines** - Handlebars, EJS, Pug
40
40
  - 🌍 **i18n Support** - Multi-language emails
41
41
  - 🚀 **More Providers** - Mailtrap and others
42
42
 
@@ -73,6 +73,20 @@ npm install resend
73
73
  npm install postmark
74
74
  ```
75
75
 
76
+ ### Adding Template Engines (Optional)
77
+
78
+ **Currently Supported:**
79
+ ```bash
80
+ # Handlebars (✅ Implemented)
81
+ npm install handlebars
82
+
83
+ # EJS (✅ Implemented)
84
+ npm install ejs
85
+
86
+ # Pug (✅ Implemented)
87
+ npm install pug
88
+ ```
89
+
76
90
  ## 🚀 Quick Start
77
91
 
78
92
  ### SMTP (Nodemailer)
@@ -200,6 +214,130 @@ Mail.configure({
200
214
  });
201
215
  ```
202
216
 
217
+ ## 🎨 Template Engines
218
+
219
+ ### Using Handlebars
220
+
221
+ ```typescript
222
+ // npm install handlebars
223
+ import { Mail } from '@impruthvi/nodemail';
224
+
225
+ Mail.configure({
226
+ default: 'smtp',
227
+ from: { address: 'noreply@example.com', name: 'My App' },
228
+ mailers: { /* your mailer config */ },
229
+ templates: {
230
+ engine: 'handlebars',
231
+ viewsPath: './views/emails',
232
+ extension: '.hbs',
233
+ cache: true,
234
+ },
235
+ });
236
+
237
+ // Send with template
238
+ await Mail.to('user@example.com')
239
+ .subject('Welcome!')
240
+ .template('welcome')
241
+ .data({ name: 'John', appName: 'My App' })
242
+ .send();
243
+ ```
244
+
245
+ **Template file** (`views/emails/welcome.hbs`):
246
+ ```handlebars
247
+ <h1>Welcome, {{name}}!</h1>
248
+ <p>Thank you for joining {{appName}}.</p>
249
+ ```
250
+
251
+ ### Using EJS
252
+
253
+ ```typescript
254
+ // npm install ejs
255
+ Mail.configure({
256
+ templates: {
257
+ engine: 'ejs',
258
+ viewsPath: './views/emails',
259
+ extension: '.ejs',
260
+ },
261
+ });
262
+
263
+ await Mail.to('customer@example.com')
264
+ .subject('Your Invoice')
265
+ .template('invoice')
266
+ .data({ items: [...], total: 99.99 })
267
+ .send();
268
+ ```
269
+
270
+ ### Using Pug
271
+
272
+ ```typescript
273
+ // npm install pug
274
+ Mail.configure({
275
+ templates: {
276
+ engine: 'pug',
277
+ viewsPath: './views/emails',
278
+ cache: true,
279
+ },
280
+ });
281
+
282
+ await Mail.to('user@example.com')
283
+ .subject('Notification')
284
+ .template('notification')
285
+ .data({ title: 'Update', message: 'New features!' })
286
+ .send();
287
+ ```
288
+
289
+ ## 📨 Complete Fluent API
290
+
291
+ ```typescript
292
+ await Mail.to('user@example.com')
293
+ .subject('Complete Example')
294
+ .html('<h1>Hello!</h1>')
295
+ .text('Hello!')
296
+ .from('custom@example.com')
297
+ .cc(['manager@example.com', 'team@example.com'])
298
+ .bcc('archive@example.com')
299
+ .replyTo('support@example.com')
300
+ .attachments([
301
+ { filename: 'report.pdf', path: './files/report.pdf' },
302
+ { filename: 'image.png', content: buffer },
303
+ ])
304
+ .headers({ 'X-Custom-Header': 'value' })
305
+ .send();
306
+ ```
307
+
308
+ ## 📝 Mailable Classes
309
+
310
+ Create reusable email classes with Laravel-like syntax:
311
+
312
+ ```typescript
313
+ import { Mailable } from '@impruthvi/nodemail';
314
+
315
+ class WelcomeEmail extends Mailable {
316
+ constructor(
317
+ private user: { name: string; email: string },
318
+ private appName: string
319
+ ) {
320
+ super();
321
+ }
322
+
323
+ build() {
324
+ return this
325
+ .subject(`Welcome to ${this.appName}!`)
326
+ .view('welcome', {
327
+ name: this.user.name,
328
+ email: this.user.email,
329
+ appName: this.appName,
330
+ });
331
+ }
332
+ }
333
+
334
+ // Method 1: Laravel-style (recommended)
335
+ await Mail.to('user@example.com').send(new WelcomeEmail(user, 'My App'));
336
+
337
+ // Method 2: Direct sending
338
+ await new WelcomeEmail(user, 'My App').to('user@example.com').send();
339
+ ```
340
+
203
341
  **Advanced usage (coming soon):**
204
342
 
205
343
  ```typescript
@@ -6,6 +6,7 @@ declare class MailFacade {
6
6
  private static getInstance;
7
7
  static to(address: string | string[]): import("./MailManager").MessageBuilder;
8
8
  static mailer(name: string): MailManager;
9
+ static send(mailable: import('./Mailable').Mailable): Promise<import('../types').MailResponse>;
9
10
  static fake(): void;
10
11
  static assertSent(): void;
11
12
  }
@@ -1 +1 @@
1
- {"version":3,"file":"MailFacade.d.ts","sourceRoot":"","sources":["../../src/core/MailFacade.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAE3C,cAAM,UAAU;IACd,OAAO,CAAC,MAAM,CAAC,QAAQ,CAA4B;IAKnD,MAAM,CAAC,SAAS,CAAC,MAAM,EAAE,UAAU,GAAG,IAAI;IAO1C,OAAO,CAAC,MAAM,CAAC,WAAW;IAU1B,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE;IAOpC,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM;IAO1B,MAAM,CAAC,IAAI,IAAI,IAAI;IAQnB,MAAM,CAAC,UAAU,IAAI,IAAI;CAI1B;AAED,OAAO,EAAE,UAAU,IAAI,IAAI,EAAE,CAAC"}
1
+ {"version":3,"file":"MailFacade.d.ts","sourceRoot":"","sources":["../../src/core/MailFacade.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAE3C,cAAM,UAAU;IACd,OAAO,CAAC,MAAM,CAAC,QAAQ,CAA4B;IAKnD,MAAM,CAAC,SAAS,CAAC,MAAM,EAAE,UAAU,GAAG,IAAI;IAO1C,OAAO,CAAC,MAAM,CAAC,WAAW;IAU1B,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE;IAOpC,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM;WAOb,IAAI,CAAC,QAAQ,EAAE,OAAO,YAAY,EAAE,QAAQ,GAAG,OAAO,CAAC,OAAO,UAAU,EAAE,YAAY,CAAC;IAQpG,MAAM,CAAC,IAAI,IAAI,IAAI;IAQnB,MAAM,CAAC,UAAU,IAAI,IAAI;CAI1B;AAED,OAAO,EAAE,UAAU,IAAI,IAAI,EAAE,CAAC"}
@@ -19,6 +19,10 @@ class MailFacade {
19
19
  static mailer(name) {
20
20
  return this.getInstance().mailer(name);
21
21
  }
22
+ static async send(mailable) {
23
+ mailable.setMailManager(this.getInstance());
24
+ return mailable.send();
25
+ }
22
26
  static fake() {
23
27
  throw new Error('Mail.fake() not yet implemented');
24
28
  }
@@ -1 +1 @@
1
- {"version":3,"file":"MailFacade.js","sourceRoot":"","sources":["../../src/core/MailFacade.ts"],"names":[],"mappings":";;;AAKA,+CAA4C;AAG5C,MAAM,UAAU;IACN,MAAM,CAAC,QAAQ,GAAuB,IAAI,CAAC;IAKnD,MAAM,CAAC,SAAS,CAAC,MAAkB;QACjC,IAAI,CAAC,QAAQ,GAAG,IAAI,yBAAW,CAAC,MAAM,CAAC,CAAC;IAC1C,CAAC;IAKO,MAAM,CAAC,WAAW;QACxB,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;YACnB,MAAM,IAAI,KAAK,CAAC,sEAAsE,CAAC,CAAC;QAC1F,CAAC;QACD,OAAO,IAAI,CAAC,QAAQ,CAAC;IACvB,CAAC;IAKD,MAAM,CAAC,EAAE,CAAC,OAA0B;QAClC,OAAO,IAAI,CAAC,WAAW,EAAE,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC;IACxC,CAAC;IAKD,MAAM,CAAC,MAAM,CAAC,IAAY;QACxB,OAAO,IAAI,CAAC,WAAW,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IACzC,CAAC;IAKD,MAAM,CAAC,IAAI;QAET,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC;IACrD,CAAC;IAKD,MAAM,CAAC,UAAU;QAEf,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAC;IAC3D,CAAC;;AAGoB,0BAAI"}
1
+ {"version":3,"file":"MailFacade.js","sourceRoot":"","sources":["../../src/core/MailFacade.ts"],"names":[],"mappings":";;;AAKA,+CAA4C;AAG5C,MAAM,UAAU;IACN,MAAM,CAAC,QAAQ,GAAuB,IAAI,CAAC;IAKnD,MAAM,CAAC,SAAS,CAAC,MAAkB;QACjC,IAAI,CAAC,QAAQ,GAAG,IAAI,yBAAW,CAAC,MAAM,CAAC,CAAC;IAC1C,CAAC;IAKO,MAAM,CAAC,WAAW;QACxB,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;YACnB,MAAM,IAAI,KAAK,CAAC,sEAAsE,CAAC,CAAC;QAC1F,CAAC;QACD,OAAO,IAAI,CAAC,QAAQ,CAAC;IACvB,CAAC;IAKD,MAAM,CAAC,EAAE,CAAC,OAA0B;QAClC,OAAO,IAAI,CAAC,WAAW,EAAE,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC;IACxC,CAAC;IAKD,MAAM,CAAC,MAAM,CAAC,IAAY;QACxB,OAAO,IAAI,CAAC,WAAW,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IACzC,CAAC;IAKD,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,QAAuC;QACvD,QAAQ,CAAC,cAAc,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;QAC5C,OAAO,QAAQ,CAAC,IAAI,EAAE,CAAC;IACzB,CAAC;IAKD,MAAM,CAAC,IAAI;QAET,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC;IACrD,CAAC;IAKD,MAAM,CAAC,UAAU;QAEf,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAC;IAC3D,CAAC;;AAGoB,0BAAI"}
@@ -1,8 +1,10 @@
1
- import type { MailConfig, MailOptions, MailResponse } from '../types';
1
+ import type { MailConfig, MailOptions, MailResponse, Attachment } from '../types';
2
2
  export declare class MailManager {
3
3
  private config;
4
4
  private providers;
5
+ private templateEngine?;
5
6
  constructor(config: MailConfig);
7
+ private initializeTemplateEngine;
6
8
  private createProvider;
7
9
  private getProvider;
8
10
  to(address: string | string[]): MessageBuilder;
@@ -18,6 +20,13 @@ export declare class MessageBuilder {
18
20
  html(html: string): this;
19
21
  text(text: string): this;
20
22
  from(from: string): this;
21
- send(): Promise<MailResponse>;
23
+ cc(cc: string | string[]): this;
24
+ bcc(bcc: string | string[]): this;
25
+ replyTo(replyTo: string): this;
26
+ attachments(attachments: Attachment[]): this;
27
+ headers(headers: Record<string, string>): this;
28
+ template(template: string): this;
29
+ data(data: Record<string, unknown>): this;
30
+ send(mailable?: import('./Mailable').Mailable): Promise<MailResponse>;
22
31
  }
23
32
  //# sourceMappingURL=MailManager.d.ts.map
@@ -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;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"}
1
+ {"version":3,"file":"MailManager.d.ts","sourceRoot":"","sources":["../../src/core/MailManager.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EACV,UAAU,EACV,WAAW,EAEX,YAAY,EAEZ,UAAU,EACX,MAAM,UAAU,CAAC;AAYlB,qBAAa,WAAW;IACtB,OAAO,CAAC,MAAM,CAAa;IAC3B,OAAO,CAAC,SAAS,CAAwC;IACzD,OAAO,CAAC,cAAc,CAAC,CAAiB;gBAE5B,MAAM,EAAE,UAAU;IAS9B,OAAO,CAAC,wBAAwB;IA0ChC,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;IAiBvD,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;IAKjB,EAAE,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,EAAE;IAKxB,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,EAAE;IAK1B,OAAO,CAAC,OAAO,EAAE,MAAM;IAKvB,WAAW,CAAC,WAAW,EAAE,UAAU,EAAE;IAKrC,OAAO,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;IAKvC,QAAQ,CAAC,QAAQ,EAAE,MAAM;IAKzB,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAK5B,IAAI,CAAC,QAAQ,CAAC,EAAE,OAAO,YAAY,EAAE,QAAQ,GAAG,OAAO,CAAC,YAAY,CAAC;CAoB5E"}
@@ -7,11 +7,49 @@ const SesProvider_1 = require("../providers/SesProvider");
7
7
  const MailgunProvider_1 = require("../providers/MailgunProvider");
8
8
  const ResendProvider_1 = require("../providers/ResendProvider");
9
9
  const PostmarkProvider_1 = require("../providers/PostmarkProvider");
10
+ const HandlebarsEngine_1 = require("../templates/HandlebarsEngine");
11
+ const EjsEngine_1 = require("../templates/EjsEngine");
12
+ const PugEngine_1 = require("../templates/PugEngine");
10
13
  class MailManager {
11
14
  config;
12
15
  providers = new Map();
16
+ templateEngine;
13
17
  constructor(config) {
14
18
  this.config = config;
19
+ this.initializeTemplateEngine();
20
+ }
21
+ initializeTemplateEngine() {
22
+ if (!this.config.templates) {
23
+ return;
24
+ }
25
+ const { engine, viewsPath, extension, cache, options } = this.config.templates;
26
+ if (!engine) {
27
+ return;
28
+ }
29
+ const engineOptions = {
30
+ ...(viewsPath && { viewsPath }),
31
+ ...(extension && { extension }),
32
+ ...(cache !== undefined && { cache }),
33
+ ...(options && { options }),
34
+ };
35
+ if (typeof engine === 'string') {
36
+ switch (engine) {
37
+ case 'handlebars':
38
+ this.templateEngine = new HandlebarsEngine_1.HandlebarsEngine(engineOptions);
39
+ break;
40
+ case 'ejs':
41
+ this.templateEngine = new EjsEngine_1.EjsEngine(engineOptions);
42
+ break;
43
+ case 'pug':
44
+ this.templateEngine = new PugEngine_1.PugEngine(engineOptions);
45
+ break;
46
+ default:
47
+ throw new Error(`Unsupported template engine: ${engine}`);
48
+ }
49
+ }
50
+ else {
51
+ this.templateEngine = engine;
52
+ }
15
53
  }
16
54
  createProvider(mailerConfig) {
17
55
  switch (mailerConfig.driver) {
@@ -58,6 +96,10 @@ class MailManager {
58
96
  return new MailManager(newConfig);
59
97
  }
60
98
  async send(options) {
99
+ if (options.template && this.templateEngine) {
100
+ const html = await this.templateEngine.renderFile(options.template, options.data);
101
+ options = { ...options, html };
102
+ }
61
103
  const provider = this.getProvider();
62
104
  return provider.send(options);
63
105
  }
@@ -89,7 +131,43 @@ class MessageBuilder {
89
131
  this.options.from = from;
90
132
  return this;
91
133
  }
92
- async send() {
134
+ cc(cc) {
135
+ this.options.cc = cc;
136
+ return this;
137
+ }
138
+ bcc(bcc) {
139
+ this.options.bcc = bcc;
140
+ return this;
141
+ }
142
+ replyTo(replyTo) {
143
+ this.options.replyTo = replyTo;
144
+ return this;
145
+ }
146
+ attachments(attachments) {
147
+ this.options.attachments = attachments;
148
+ return this;
149
+ }
150
+ headers(headers) {
151
+ this.options.headers = headers;
152
+ return this;
153
+ }
154
+ template(template) {
155
+ this.options.template = template;
156
+ return this;
157
+ }
158
+ data(data) {
159
+ this.options.data = data;
160
+ return this;
161
+ }
162
+ async send(mailable) {
163
+ if (mailable) {
164
+ mailable.setMailManager(this.manager);
165
+ const mailOptions = mailable.getMailOptions();
166
+ return this.manager.send({
167
+ ...mailOptions,
168
+ to: this.options.to,
169
+ });
170
+ }
93
171
  if (!this.options.subject) {
94
172
  throw new Error('Email subject is required');
95
173
  }
@@ -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":"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"}
@@ -1,12 +1,22 @@
1
- import type { MailOptions } from '../types';
1
+ import type { MailOptions, MailResponse } from '../types';
2
+ import type { MailManager } from './MailManager';
2
3
  export declare abstract class Mailable {
3
4
  protected options: Partial<MailOptions>;
5
+ private recipients;
6
+ private mailManager?;
4
7
  abstract build(): this;
8
+ to(recipients: string | string[]): this;
9
+ setMailManager(manager: MailManager): this;
10
+ send(): Promise<MailResponse>;
5
11
  protected subject(subject: string): this;
6
12
  protected html(html: string): this;
7
13
  protected text(text: string): this;
8
14
  protected view(template: string, data?: Record<string, unknown>): this;
9
- protected attach(path: string): this;
15
+ protected cc(cc: string | string[]): this;
16
+ protected bcc(bcc: string | string[]): this;
17
+ protected replyTo(replyTo: string): this;
18
+ protected attach(path: string, filename?: string): this;
19
+ protected withHeaders(headers: Record<string, string>): this;
10
20
  getMailOptions(): Partial<MailOptions>;
11
21
  }
12
22
  //# sourceMappingURL=Mailable.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"Mailable.d.ts","sourceRoot":"","sources":["../../src/core/Mailable.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAE5C,8BAAsB,QAAQ;IAC5B,SAAS,CAAC,OAAO,EAAE,OAAO,CAAC,WAAW,CAAC,CAAM;IAM7C,QAAQ,CAAC,KAAK,IAAI,IAAI;IAKtB,SAAS,CAAC,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAQxC,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAQlC,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAQlC,SAAS,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAWtE,SAAS,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAWpC,cAAc,IAAI,OAAO,CAAC,WAAW,CAAC;CAIvC"}
1
+ {"version":3,"file":"Mailable.d.ts","sourceRoot":"","sources":["../../src/core/Mailable.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAC1D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAEjD,8BAAsB,QAAQ;IAC5B,SAAS,CAAC,OAAO,EAAE,OAAO,CAAC,WAAW,CAAC,CAAM;IAC7C,OAAO,CAAC,UAAU,CAAyB;IAC3C,OAAO,CAAC,WAAW,CAAC,CAAc;IAMlC,QAAQ,CAAC,KAAK,IAAI,IAAI;IAKtB,EAAE,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,IAAI;IAQvC,cAAc,CAAC,OAAO,EAAE,WAAW,GAAG,IAAI;IAQpC,IAAI,IAAI,OAAO,CAAC,YAAY,CAAC;IAmBnC,SAAS,CAAC,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAQxC,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAQlC,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAQlC,SAAS,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAWtE,SAAS,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,IAAI;IAQzC,SAAS,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,IAAI;IAQ3C,SAAS,CAAC,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAQxC,SAAS,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI;IAcvD,SAAS,CAAC,WAAW,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI;IAQ5D,cAAc,IAAI,OAAO,CAAC,WAAW,CAAC;CAIvC"}
@@ -3,6 +3,29 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.Mailable = void 0;
4
4
  class Mailable {
5
5
  options = {};
6
+ recipients = [];
7
+ mailManager;
8
+ to(recipients) {
9
+ this.recipients = recipients;
10
+ return this;
11
+ }
12
+ setMailManager(manager) {
13
+ this.mailManager = manager;
14
+ return this;
15
+ }
16
+ async send() {
17
+ if (!this.mailManager) {
18
+ throw new Error('Mail manager not configured. Use Mail.to().send(mailable) or configure mailable with setMailManager()');
19
+ }
20
+ if (!this.recipients || (Array.isArray(this.recipients) && this.recipients.length === 0)) {
21
+ throw new Error('No recipients specified. Use .to() to set recipients.');
22
+ }
23
+ const mailOptions = this.getMailOptions();
24
+ return this.mailManager.send({
25
+ ...mailOptions,
26
+ to: this.recipients,
27
+ });
28
+ }
6
29
  subject(subject) {
7
30
  this.options.subject = subject;
8
31
  return this;
@@ -22,11 +45,30 @@ class Mailable {
22
45
  }
23
46
  return this;
24
47
  }
25
- attach(path) {
48
+ cc(cc) {
49
+ this.options.cc = cc;
50
+ return this;
51
+ }
52
+ bcc(bcc) {
53
+ this.options.bcc = bcc;
54
+ return this;
55
+ }
56
+ replyTo(replyTo) {
57
+ this.options.replyTo = replyTo;
58
+ return this;
59
+ }
60
+ attach(path, filename) {
26
61
  if (!this.options.attachments) {
27
62
  this.options.attachments = [];
28
63
  }
29
- this.options.attachments.push({ filename: path, path });
64
+ this.options.attachments.push({
65
+ filename: filename || path.split('/').pop() || 'attachment',
66
+ path
67
+ });
68
+ return this;
69
+ }
70
+ withHeaders(headers) {
71
+ this.options.headers = headers;
30
72
  return this;
31
73
  }
32
74
  getMailOptions() {
@@ -1 +1 @@
1
- {"version":3,"file":"Mailable.js","sourceRoot":"","sources":["../../src/core/Mailable.ts"],"names":[],"mappings":";;;AAMA,MAAsB,QAAQ;IAClB,OAAO,GAAyB,EAAE,CAAC;IAWnC,OAAO,CAAC,OAAe;QAC/B,IAAI,CAAC,OAAO,CAAC,OAAO,GAAG,OAAO,CAAC;QAC/B,OAAO,IAAI,CAAC;IACd,CAAC;IAKS,IAAI,CAAC,IAAY;QACzB,IAAI,CAAC,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC;QACzB,OAAO,IAAI,CAAC;IACd,CAAC;IAKS,IAAI,CAAC,IAAY;QACzB,IAAI,CAAC,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC;QACzB,OAAO,IAAI,CAAC;IACd,CAAC;IAKS,IAAI,CAAC,QAAgB,EAAE,IAA8B;QAC7D,IAAI,CAAC,OAAO,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACjC,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;YACvB,IAAI,CAAC,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC;QAC3B,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAKS,MAAM,CAAC,IAAY;QAC3B,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC;YAC9B,IAAI,CAAC,OAAO,CAAC,WAAW,GAAG,EAAE,CAAC;QAChC,CAAC;QACD,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;QACxD,OAAO,IAAI,CAAC;IACd,CAAC;IAKD,cAAc;QACZ,IAAI,CAAC,KAAK,EAAE,CAAC;QACb,OAAO,IAAI,CAAC,OAAO,CAAC;IACtB,CAAC;CACF;AA9DD,4BA8DC"}
1
+ {"version":3,"file":"Mailable.js","sourceRoot":"","sources":["../../src/core/Mailable.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -8,6 +8,8 @@ export { SesProvider } from './providers/SesProvider';
8
8
  export { MailgunProvider } from './providers/MailgunProvider';
9
9
  export { ResendProvider } from './providers/ResendProvider';
10
10
  export { PostmarkProvider } from './providers/PostmarkProvider';
11
+ export type { TemplateEngine, TemplateEngineOptions } from './templates';
12
+ export { HandlebarsEngine, EjsEngine, PugEngine } from './templates';
11
13
  export * from './types';
12
- export declare const VERSION = "0.3.0";
14
+ export declare const VERSION = "0.4.0";
13
15
  //# 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;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"}
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,YAAY,EAAE,cAAc,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AACzE,OAAO,EAAE,gBAAgB,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAGrE,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.PostmarkProvider = exports.ResendProvider = exports.MailgunProvider = exports.SesProvider = exports.SendGridProvider = exports.SmtpProvider = exports.Message = exports.Mailable = exports.MailManager = exports.Mail = void 0;
17
+ exports.VERSION = exports.PugEngine = exports.EjsEngine = exports.HandlebarsEngine = 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");
@@ -35,6 +35,10 @@ var ResendProvider_1 = require("./providers/ResendProvider");
35
35
  Object.defineProperty(exports, "ResendProvider", { enumerable: true, get: function () { return ResendProvider_1.ResendProvider; } });
36
36
  var PostmarkProvider_1 = require("./providers/PostmarkProvider");
37
37
  Object.defineProperty(exports, "PostmarkProvider", { enumerable: true, get: function () { return PostmarkProvider_1.PostmarkProvider; } });
38
+ var templates_1 = require("./templates");
39
+ Object.defineProperty(exports, "HandlebarsEngine", { enumerable: true, get: function () { return templates_1.HandlebarsEngine; } });
40
+ Object.defineProperty(exports, "EjsEngine", { enumerable: true, get: function () { return templates_1.EjsEngine; } });
41
+ Object.defineProperty(exports, "PugEngine", { enumerable: true, get: function () { return templates_1.PugEngine; } });
38
42
  __exportStar(require("./types"), exports);
39
- exports.VERSION = '0.3.0';
43
+ exports.VERSION = '0.4.0';
40
44
  //# 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;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"}
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;AAIzB,yCAAqE;AAA5D,6GAAA,gBAAgB,OAAA;AAAE,sGAAA,SAAS,OAAA;AAAE,sGAAA,SAAS,OAAA;AAG/C,0CAAwB;AAGX,QAAA,OAAO,GAAG,OAAO,CAAC"}
@@ -0,0 +1,14 @@
1
+ import { TemplateEngine, TemplateEngineOptions } from './TemplateEngine';
2
+ export declare class EjsEngine implements TemplateEngine {
3
+ private ejs;
4
+ private cache;
5
+ private options;
6
+ constructor(options?: TemplateEngineOptions);
7
+ private loadEjs;
8
+ render(template: string, data?: Record<string, unknown>): Promise<string>;
9
+ renderFile(filePath: string, data?: Record<string, unknown>): Promise<string>;
10
+ compile(template: string): (data?: Record<string, unknown>) => string;
11
+ clearCache(): void;
12
+ private resolveTemplatePath;
13
+ }
14
+ //# sourceMappingURL=EjsEngine.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EjsEngine.d.ts","sourceRoot":"","sources":["../../src/templates/EjsEngine.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAC;AASzE,qBAAa,SAAU,YAAW,cAAc;IAC9C,OAAO,CAAC,GAAG,CAAM;IACjB,OAAO,CAAC,KAAK,CAAmB;IAChC,OAAO,CAAC,OAAO,CAAwB;gBAE3B,OAAO,GAAE,qBAA0B;IAW/C,OAAO,CAAC,OAAO;IAWf,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC;IAOnE,UAAU,CACd,QAAQ,EAAE,MAAM,EAChB,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC7B,OAAO,CAAC,MAAM,CAAC;IA2BlB,OAAO,CAAC,QAAQ,EAAE,MAAM,GAAG,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,MAAM;IAOrE,UAAU,IAAI,IAAI;IAOlB,OAAO,CAAC,mBAAmB;CAS5B"}