@breadstone/archipel-platform-mailing 0.0.33 → 0.0.35

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 (76) hide show
  1. package/package.json +75 -40
  2. package/src/MailModule.d.ts +75 -0
  3. package/src/MailModule.js +80 -0
  4. package/src/{services/strategies → delivering/strategies/logger}/LogDeliveryStrategy.d.ts +2 -2
  5. package/src/{services/strategies → delivering/strategies/logger}/LogDeliveryStrategy.js +1 -1
  6. package/src/delivering/strategies/logger/index.d.ts +1 -0
  7. package/src/{logger → delivering/strategies/logger}/index.js +1 -1
  8. package/src/{services/strategies → delivering/strategies/mailgun}/MailgunDeliveryStrategy.d.ts +2 -2
  9. package/src/{services/strategies → delivering/strategies/mailgun}/MailgunDeliveryStrategy.js +3 -3
  10. package/src/delivering/strategies/mailgun/index.d.ts +2 -0
  11. package/src/{mailgun → delivering/strategies/mailgun}/index.js +3 -3
  12. package/src/{services/strategies → delivering/strategies/postmark}/PostmarkDeliveryStrategy.d.ts +2 -2
  13. package/src/{services/strategies → delivering/strategies/postmark}/PostmarkDeliveryStrategy.js +3 -3
  14. package/src/delivering/strategies/postmark/index.d.ts +2 -0
  15. package/src/{postmark → delivering/strategies/postmark}/index.js +3 -3
  16. package/src/{services/strategies → delivering/strategies/resend}/ResendDeliveryStrategy.d.ts +2 -2
  17. package/src/{services/strategies → delivering/strategies/resend}/ResendDeliveryStrategy.js +3 -3
  18. package/src/delivering/strategies/resend/index.d.ts +2 -0
  19. package/src/{resend → delivering/strategies/resend}/index.js +3 -3
  20. package/src/{services/strategies → delivering/strategies/sendgrid}/SendGridDeliveryStrategy.d.ts +2 -2
  21. package/src/{services/strategies → delivering/strategies/sendgrid}/SendGridDeliveryStrategy.js +3 -3
  22. package/src/delivering/strategies/sendgrid/index.d.ts +2 -0
  23. package/src/{sendgrid → delivering/strategies/sendgrid}/index.js +3 -3
  24. package/src/{services/strategies → delivering/strategies/smtp}/SmtpDeliveryStrategy.d.ts +2 -2
  25. package/src/{services/strategies → delivering/strategies/smtp}/SmtpDeliveryStrategy.js +3 -3
  26. package/src/{smtp → delivering/strategies/smtp}/index.d.ts +1 -1
  27. package/src/{smtp → delivering/strategies/smtp}/index.js +3 -3
  28. package/src/env.d.ts +0 -4
  29. package/src/env.js +3 -13
  30. package/src/events/IMailEvents.d.ts +12 -1
  31. package/src/events/listeners/MailEventSubscriber.js +2 -1
  32. package/src/index.d.ts +5 -5
  33. package/src/index.js +5 -4
  34. package/src/models/IMailTemplateVariants.d.ts +10 -0
  35. package/src/models/IMailTemplateVariants.js +3 -0
  36. package/src/models/MailTemplateFormat.d.ts +6 -0
  37. package/src/models/MailTemplateFormat.js +3 -0
  38. package/src/services/MailService.d.ts +8 -4
  39. package/src/services/MailService.js +15 -8
  40. package/src/templating/MailTemplateEngine.d.ts +10 -1
  41. package/src/templating/MailTemplateEngine.js +17 -7
  42. package/src/templating/strategies/abstracts/TemplateFetchStrategyBase.d.ts +2 -4
  43. package/src/templating/strategies/{BlobTemplateFetchStrategy.d.ts → blob/BlobTemplateFetchStrategy.d.ts} +2 -2
  44. package/src/templating/strategies/{BlobTemplateFetchStrategy.js → blob/BlobTemplateFetchStrategy.js} +1 -1
  45. package/src/templating/strategies/blob/index.d.ts +1 -0
  46. package/src/templating/strategies/blob/index.js +6 -0
  47. package/src/templating/strategies/{DatabaseTemplateFetchStrategy.d.ts → database/DatabaseTemplateFetchStrategy.d.ts} +3 -3
  48. package/src/templating/strategies/{DatabaseTemplateFetchStrategy.js → database/DatabaseTemplateFetchStrategy.js} +5 -2
  49. package/src/templating/strategies/database/index.d.ts +1 -0
  50. package/src/templating/strategies/database/index.js +6 -0
  51. package/src/templating/strategies/file/FileTemplateFetchStrategy.d.ts +23 -0
  52. package/src/templating/strategies/{FileTemplateFetchStrategy.js → file/FileTemplateFetchStrategy.js} +11 -16
  53. package/src/templating/strategies/file/index.d.ts +1 -0
  54. package/src/templating/strategies/file/index.js +6 -0
  55. package/src/{MailTokens.d.ts → tokens/MailTokens.d.ts} +1 -11
  56. package/src/{MailTokens.js → tokens/MailTokens.js} +2 -1
  57. package/src/logger/index.d.ts +0 -1
  58. package/src/mailgun/index.d.ts +0 -2
  59. package/src/postmark/index.d.ts +0 -2
  60. package/src/resend/index.d.ts +0 -2
  61. package/src/sendgrid/index.d.ts +0 -2
  62. package/src/templating/strategies/FileTemplateFetchStrategy.d.ts +0 -25
  63. package/src/tokens/MailModule.d.ts +0 -54
  64. package/src/tokens/MailModule.js +0 -125
  65. /package/src/{services → delivering}/strategies/abstracts/DeliveryStrategyBase.d.ts +0 -0
  66. /package/src/{services → delivering}/strategies/abstracts/DeliveryStrategyBase.js +0 -0
  67. /package/src/{mailgun → delivering/strategies/mailgun}/env.d.ts +0 -0
  68. /package/src/{mailgun → delivering/strategies/mailgun}/env.js +0 -0
  69. /package/src/{postmark → delivering/strategies/postmark}/env.d.ts +0 -0
  70. /package/src/{postmark → delivering/strategies/postmark}/env.js +0 -0
  71. /package/src/{resend → delivering/strategies/resend}/env.d.ts +0 -0
  72. /package/src/{resend → delivering/strategies/resend}/env.js +0 -0
  73. /package/src/{sendgrid → delivering/strategies/sendgrid}/env.d.ts +0 -0
  74. /package/src/{sendgrid → delivering/strategies/sendgrid}/env.js +0 -0
  75. /package/src/{smtp → delivering/strategies/smtp}/env.d.ts +0 -0
  76. /package/src/{smtp → delivering/strategies/smtp}/env.js +0 -0
package/src/env.js CHANGED
@@ -1,16 +1,12 @@
1
1
  "use strict";
2
2
  // #region Imports
3
3
  Object.defineProperty(exports, "__esModule", { value: true });
4
- exports.PLATFORM_MAILING_CONFIG_ENTRIES = exports.MAIL_PORT = exports.MAIL_USER = exports.MAIL_HOST = exports.MAIL_SMTP_PASSWORD = exports.MAIL_SMTP_USER = exports.MAIL_SMTP_SECURE = exports.MAIL_SMTP_PORT = exports.MAIL_SMTP_HOST = exports.MAIL_MAILGUN_DOMAIN = exports.MAIL_MAILGUN_API_KEY = exports.MAIL_SENDGRID_API_KEY = exports.MAIL_RESEND_API_KEY = exports.MAIL_POSTMARK_API_KEY = exports.MAIL_TEMPLATE_ENGINE_FORMAT = exports.MAIL_SENDER_EMAIL = exports.MAIL_DELIVERY_STRATEGY = exports.MAIL_TEMPLATE_STRATEGY = void 0;
4
+ exports.PLATFORM_MAILING_CONFIG_ENTRIES = exports.MAIL_PORT = exports.MAIL_USER = exports.MAIL_HOST = exports.MAIL_SMTP_PASSWORD = exports.MAIL_SMTP_USER = exports.MAIL_SMTP_SECURE = exports.MAIL_SMTP_PORT = exports.MAIL_SMTP_HOST = exports.MAIL_MAILGUN_DOMAIN = exports.MAIL_MAILGUN_API_KEY = exports.MAIL_SENDGRID_API_KEY = exports.MAIL_RESEND_API_KEY = exports.MAIL_POSTMARK_API_KEY = exports.MAIL_TEMPLATE_ENGINE_FORMAT = exports.MAIL_SENDER_EMAIL = void 0;
5
5
  const archipel_platform_configuration_1 = require("@breadstone/archipel-platform-configuration");
6
6
  // #endregion
7
7
  // ──────────────────────────────────────────────────────────────
8
- // Delivery & Template Strategy
8
+ // Core
9
9
  // ──────────────────────────────────────────────────────────────
10
- /** Which template-fetch strategy to use (e.g. `file`, `blob`). */
11
- exports.MAIL_TEMPLATE_STRATEGY = (0, archipel_platform_configuration_1.createConfigKey)('MAIL_TEMPLATE_STRATEGY');
12
- /** Which delivery strategy to use (e.g. `smtp`, `postmark`, `resend`, `sendgrid`, `mailgun`, `log`). */
13
- exports.MAIL_DELIVERY_STRATEGY = (0, archipel_platform_configuration_1.createConfigKey)('MAIL_DELIVERY_STRATEGY');
14
10
  /** Sender e-mail address shown in the `From` header. */
15
11
  exports.MAIL_SENDER_EMAIL = (0, archipel_platform_configuration_1.createConfigKey)('MAIL_SENDER_EMAIL');
16
12
  /** Template engine format identifier (e.g. `handlebars`). */
@@ -64,13 +60,7 @@ exports.MAIL_PORT = (0, archipel_platform_configuration_1.createConfigKey)('MAIL
64
60
  // ──────────────────────────────────────────────────────────────
65
61
  /** All configuration entries required by `platform-mailing`. */
66
62
  exports.PLATFORM_MAILING_CONFIG_ENTRIES = [
67
- // Strategy
68
- { key: exports.MAIL_TEMPLATE_STRATEGY, required: true, description: 'Template-fetch strategy (file, blob, database).' },
69
- {
70
- key: exports.MAIL_DELIVERY_STRATEGY,
71
- required: true,
72
- description: 'Delivery strategy (smtp, postmark, resend, sendgrid, mailgun, log).',
73
- },
63
+ // Core
74
64
  { key: exports.MAIL_SENDER_EMAIL, required: true, description: 'Sender e-mail address for the From header.' },
75
65
  { key: exports.MAIL_TEMPLATE_ENGINE_FORMAT, required: true, description: 'Template engine format identifier.' },
76
66
  // Postmark
@@ -2,14 +2,25 @@ import { IEventMap } from '@breadstone/archipel-platform-core';
2
2
  /**
3
3
  * Represents the contract of events emitted by the mail domain.
4
4
  *
5
+ * Publishers only need to specify `recipientEmail`, `templateName`, and `templateParams`.
6
+ * The subject is resolved from the stored template (industry-standard behavior).
7
+ * An explicit `subject` can be provided as an override.
8
+ *
5
9
  * @public
6
10
  */
7
11
  export interface IMailEvents extends IEventMap {
8
12
  sendMail: {
13
+ /** Recipient email address. */
9
14
  recipientEmail: string;
10
- subject: string;
15
+ /** Template key to resolve (e.g. `'AuthRegister'`). */
11
16
  templateName: string;
17
+ /** Placeholder values to interpolate into subject and body. */
12
18
  templateParams: Record<string, string | number | boolean | Date | undefined | null>;
19
+ /** Optional locale for template resolution (e.g. `'de'`, `'en'`). */
20
+ locale?: string;
21
+ /** Optional subject override. When omitted, resolved from the template. */
22
+ subject?: string;
23
+ /** Optional sender email override. When omitted, uses the configured default. */
13
24
  senderEmail?: string;
14
25
  };
15
26
  }
@@ -29,7 +29,8 @@ let MailEventSubscriber = MailEventSubscriber_1 = class MailEventSubscriber {
29
29
  this._mailService = mailService;
30
30
  this._subscription = eventHub.observe(MailEventKeys_1.SEND_MAIL_EVENT_KEY).subscribe({
31
31
  next: (payload) => {
32
- this._logger.debug(`Received mail event for recipient ${(0, archipel_platform_core_1.maskSensitive)(payload.recipientEmail)} with subject "${(0, archipel_platform_core_1.maskSensitive)(payload.subject)}"`);
32
+ this._logger.debug(`Received mail event for recipient ${(0, archipel_platform_core_1.maskSensitive)(payload.recipientEmail)} ` +
33
+ `with template "${payload.templateName}"${payload.subject ? ` (subject override: "${(0, archipel_platform_core_1.maskSensitive)(payload.subject)}")` : ''}`);
33
34
  void this.handle(payload);
34
35
  },
35
36
  error: (err) => {
package/src/index.d.ts CHANGED
@@ -1,16 +1,16 @@
1
+ export * from './delivering/strategies/abstracts/DeliveryStrategyBase';
1
2
  export * from './env';
2
3
  export * from './errors/MailDeliveryError';
3
4
  export * from './events';
4
- export * from './MailTokens';
5
+ export * from './MailModule';
5
6
  export * from './models/IMailAttachment';
6
7
  export * from './models/IMailTemplate';
8
+ export * from './models/IMailTemplateVariants';
9
+ export * from './models/MailTemplateFormat';
7
10
  export * from './ports/IMailTemplateRepository';
8
11
  export * from './services/MailService';
9
12
  export * from './services/MailVerificationService';
10
13
  export * from './services/SmtpConnectionVerifier';
11
- export * from './services/strategies/abstracts/DeliveryStrategyBase';
12
14
  export * from './templating/MailTemplateEngine';
13
15
  export * from './templating/strategies/abstracts/TemplateFetchStrategyBase';
14
- export * from './templating/strategies/DatabaseTemplateFetchStrategy';
15
- export * from './tokens/MailModule';
16
- export type { IMailModuleOptions } from './tokens/MailModule';
16
+ export * from './tokens/MailTokens';
package/src/index.js CHANGED
@@ -1,19 +1,20 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  const tslib_1 = require("tslib");
4
+ tslib_1.__exportStar(require("./delivering/strategies/abstracts/DeliveryStrategyBase"), exports);
4
5
  tslib_1.__exportStar(require("./env"), exports);
5
6
  tslib_1.__exportStar(require("./errors/MailDeliveryError"), exports);
6
7
  tslib_1.__exportStar(require("./events"), exports);
7
- tslib_1.__exportStar(require("./MailTokens"), exports);
8
+ tslib_1.__exportStar(require("./MailModule"), exports);
8
9
  tslib_1.__exportStar(require("./models/IMailAttachment"), exports);
9
10
  tslib_1.__exportStar(require("./models/IMailTemplate"), exports);
11
+ tslib_1.__exportStar(require("./models/IMailTemplateVariants"), exports);
12
+ tslib_1.__exportStar(require("./models/MailTemplateFormat"), exports);
10
13
  tslib_1.__exportStar(require("./ports/IMailTemplateRepository"), exports);
11
14
  tslib_1.__exportStar(require("./services/MailService"), exports);
12
15
  tslib_1.__exportStar(require("./services/MailVerificationService"), exports);
13
16
  tslib_1.__exportStar(require("./services/SmtpConnectionVerifier"), exports);
14
- tslib_1.__exportStar(require("./services/strategies/abstracts/DeliveryStrategyBase"), exports);
15
17
  tslib_1.__exportStar(require("./templating/MailTemplateEngine"), exports);
16
18
  tslib_1.__exportStar(require("./templating/strategies/abstracts/TemplateFetchStrategyBase"), exports);
17
- tslib_1.__exportStar(require("./templating/strategies/DatabaseTemplateFetchStrategy"), exports);
18
- tslib_1.__exportStar(require("./tokens/MailModule"), exports);
19
+ tslib_1.__exportStar(require("./tokens/MailTokens"), exports);
19
20
  //# sourceMappingURL=index.js.map
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Represents the in-memory structure for a single template (multiple formats).
3
+ *
4
+ * @public
5
+ */
6
+ export interface IMailTemplateVariants {
7
+ subject?: string;
8
+ html?: string;
9
+ txt?: string;
10
+ }
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=IMailTemplateVariants.js.map
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Union type of all supported template formats.
3
+ *
4
+ * @public
5
+ */
6
+ export type MailTemplateFormat = 'html' | 'txt';
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=MailTemplateFormat.js.map
@@ -1,7 +1,7 @@
1
1
  import { ConfigService } from '@breadstone/archipel-platform-configuration';
2
+ import { DeliveryStrategyBase } from '../delivering/strategies/abstracts/DeliveryStrategyBase';
2
3
  import { type IMailAttachment } from '../models/IMailAttachment';
3
4
  import { MailTemplateEngine } from '../templating/MailTemplateEngine';
4
- import { DeliveryStrategyBase } from './strategies/abstracts/DeliveryStrategyBase';
5
5
  /**
6
6
  * Represents the `MailService` class.
7
7
  *
@@ -37,17 +37,21 @@ export declare class MailService {
37
37
  * Sends an email using a predefined template (HTML or text).
38
38
  * Automatically uses the template format (either 'html' or 'txt') based on the environment variable.
39
39
  *
40
+ * When no `subject` is provided in `mailOptions`, the subject is resolved from the
41
+ * stored template and interpolated with the given `templateParams` (industry-standard
42
+ * behavior matching Mailchimp/SendGrid/Postmark).
43
+ *
40
44
  * @public
41
45
  * @param mailOptions.from - Sender's email address (optional, defaults to config)
42
46
  * @param mailOptions.to - Recipient's email address
43
- * @param mailOptions.subject - Subject of the email
47
+ * @param mailOptions.subject - Subject of the email (optional — resolved from template if omitted)
44
48
  * @param templateOptions.templateName - Name of the template to be used
45
- * @param templateOptions.params - Parameters to inject into the template
49
+ * @param templateOptions.templateParams - Parameters to inject into the template
46
50
  */
47
51
  sendTemplate(mailOptions: {
48
52
  from?: string;
49
53
  to: string;
50
- subject: string;
54
+ subject?: string;
51
55
  }, templateOptions: {
52
56
  templateName: string;
53
57
  templateParams: Record<string, string | number | boolean | Date | undefined | null>;
@@ -5,11 +5,11 @@ exports.MailService = void 0;
5
5
  const tslib_1 = require("tslib");
6
6
  const archipel_platform_configuration_1 = require("@breadstone/archipel-platform-configuration");
7
7
  const common_1 = require("@nestjs/common");
8
+ const DeliveryStrategyBase_1 = require("../delivering/strategies/abstracts/DeliveryStrategyBase");
8
9
  const env_1 = require("../env");
9
10
  const IMailAttachment_1 = require("../models/IMailAttachment");
10
- const MailTokens_1 = require("../MailTokens");
11
11
  const MailTemplateEngine_1 = require("../templating/MailTemplateEngine");
12
- const DeliveryStrategyBase_1 = require("./strategies/abstracts/DeliveryStrategyBase");
12
+ const MailTokens_1 = require("../tokens/MailTokens");
13
13
  // #endregion
14
14
  /**
15
15
  * Represents the `MailService` class.
@@ -62,17 +62,26 @@ let MailService = class MailService {
62
62
  * Sends an email using a predefined template (HTML or text).
63
63
  * Automatically uses the template format (either 'html' or 'txt') based on the environment variable.
64
64
  *
65
+ * When no `subject` is provided in `mailOptions`, the subject is resolved from the
66
+ * stored template and interpolated with the given `templateParams` (industry-standard
67
+ * behavior matching Mailchimp/SendGrid/Postmark).
68
+ *
65
69
  * @public
66
70
  * @param mailOptions.from - Sender's email address (optional, defaults to config)
67
71
  * @param mailOptions.to - Recipient's email address
68
- * @param mailOptions.subject - Subject of the email
72
+ * @param mailOptions.subject - Subject of the email (optional — resolved from template if omitted)
69
73
  * @param templateOptions.templateName - Name of the template to be used
70
- * @param templateOptions.params - Parameters to inject into the template
74
+ * @param templateOptions.templateParams - Parameters to inject into the template
71
75
  */
72
76
  async sendTemplate(mailOptions, templateOptions) {
73
77
  const content = this._mailTemplateEngine.compileTemplate(templateOptions.templateName, templateOptions.templateParams, this._mailTemplateFormat);
74
78
  const isHtml = this._mailTemplateFormat === 'html';
75
- await this.send(mailOptions, content, isHtml);
79
+ const subject = mailOptions.subject ?? this._mailTemplateEngine.resolveSubject(templateOptions.templateName, templateOptions.templateParams);
80
+ if (!subject) {
81
+ throw new Error(`No subject provided and template '${templateOptions.templateName}' has no stored subject. ` +
82
+ 'Either pass a subject in mailOptions or ensure the template includes a subject.');
83
+ }
84
+ await this.send({ from: mailOptions.from, to: mailOptions.to, subject }, content, isHtml);
76
85
  }
77
86
  /**
78
87
  * Performs a minimal email address validation. Not exhaustive but filters obvious mistakes.
@@ -97,9 +106,7 @@ let MailService = class MailService {
97
106
  if (!IMailAttachment_1.ALLOWED_ATTACHMENT_MIME_TYPES.includes(attachment.contentType)) {
98
107
  throw new Error(`Unsupported attachment MIME type: '${attachment.contentType}'`);
99
108
  }
100
- const size = typeof attachment.content === 'string'
101
- ? Buffer.byteLength(attachment.content, 'utf-8')
102
- : attachment.content.length;
109
+ const size = typeof attachment.content === 'string' ? Buffer.byteLength(attachment.content, 'utf-8') : attachment.content.length;
103
110
  if (size > IMailAttachment_1.MAX_ATTACHMENT_SIZE_BYTES) {
104
111
  throw new Error(`Attachment '${attachment.filename}' exceeds maximum size of ${IMailAttachment_1.MAX_ATTACHMENT_SIZE_BYTES} bytes`);
105
112
  }
@@ -1,6 +1,6 @@
1
1
  import { ContentTemplateEngine } from '@breadstone/archipel-platform-core';
2
2
  import { OnModuleInit } from '@nestjs/common';
3
- import { MailTemplateFormat } from '../MailTokens';
3
+ import type { MailTemplateFormat } from '../models/MailTemplateFormat';
4
4
  import { TemplateFetchStrategyBase } from './strategies/abstracts/TemplateFetchStrategyBase';
5
5
  /**
6
6
  * The `MailTemplateEngine` class.
@@ -35,6 +35,15 @@ export declare class MailTemplateEngine implements OnModuleInit {
35
35
  * @returns The compiled template as a string.
36
36
  */
37
37
  compileTemplate(templateKey: string, params: Record<string, unknown>, format: MailTemplateFormat): string;
38
+ /**
39
+ * Resolves and interpolates the subject line from a stored template.
40
+ *
41
+ * @public
42
+ * @param templateKey The key of the template.
43
+ * @param params The parameters to insert into the subject.
44
+ * @returns The compiled subject string, or `undefined` if no subject is stored.
45
+ */
46
+ resolveSubject(templateKey: string, params: Record<string, unknown>): string | undefined;
38
47
  private escapeHtmlParams;
39
48
  private escapeHtml;
40
49
  }
@@ -5,7 +5,7 @@ exports.MailTemplateEngine = void 0;
5
5
  const tslib_1 = require("tslib");
6
6
  const archipel_platform_core_1 = require("@breadstone/archipel-platform-core");
7
7
  const common_1 = require("@nestjs/common");
8
- const MailTokens_1 = require("../MailTokens");
8
+ const MailTokens_1 = require("../tokens/MailTokens");
9
9
  const TemplateFetchStrategyBase_1 = require("./strategies/abstracts/TemplateFetchStrategyBase");
10
10
  // #endregion
11
11
  /**
@@ -66,6 +66,21 @@ let MailTemplateEngine = class MailTemplateEngine {
66
66
  throw error;
67
67
  }
68
68
  }
69
+ /**
70
+ * Resolves and interpolates the subject line from a stored template.
71
+ *
72
+ * @public
73
+ * @param templateKey The key of the template.
74
+ * @param params The parameters to insert into the subject.
75
+ * @returns The compiled subject string, or `undefined` if no subject is stored.
76
+ */
77
+ resolveSubject(templateKey, params) {
78
+ const templateVariants = this._templates[templateKey];
79
+ if (!templateVariants?.subject) {
80
+ return undefined;
81
+ }
82
+ return this._contentTemplateEngine.compileTemplate(templateVariants.subject, params);
83
+ }
69
84
  escapeHtmlParams(params) {
70
85
  const escaped = {};
71
86
  for (const [key, value] of Object.entries(params)) {
@@ -74,12 +89,7 @@ let MailTemplateEngine = class MailTemplateEngine {
74
89
  return escaped;
75
90
  }
76
91
  escapeHtml(text) {
77
- return text
78
- .replace(/&/g, '&amp;')
79
- .replace(/</g, '&lt;')
80
- .replace(/>/g, '&gt;')
81
- .replace(/"/g, '&quot;')
82
- .replace(/'/g, '&#39;');
92
+ return text.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/"/g, '&quot;').replace(/'/g, '&#39;');
83
93
  }
84
94
  };
85
95
  exports.MailTemplateEngine = MailTemplateEngine;
@@ -1,3 +1,4 @@
1
+ import type { IMailTemplateVariants } from '../../../models/IMailTemplateVariants';
1
2
  /**
2
3
  * Represents the base class for template fetch strategies.
3
4
  *
@@ -17,8 +18,5 @@ export declare abstract class TemplateFetchStrategyBase {
17
18
  * @public
18
19
  * @abstract
19
20
  */
20
- abstract load(): Promise<Record<string, {
21
- html?: string;
22
- txt?: string;
23
- }>>;
21
+ abstract load(): Promise<Record<string, IMailTemplateVariants>>;
24
22
  }
@@ -1,6 +1,6 @@
1
1
  import { BlobService } from '@breadstone/archipel-platform-blob-storage';
2
- import { IMailTemplateVariants } from '../../MailTokens';
3
- import { TemplateFetchStrategyBase } from './abstracts/TemplateFetchStrategyBase';
2
+ import type { IMailTemplateVariants } from '../../../models/IMailTemplateVariants';
3
+ import { TemplateFetchStrategyBase } from '../abstracts/TemplateFetchStrategyBase';
4
4
  /**
5
5
  * The `BlobTemplateFetchStrategy` class.
6
6
  *
@@ -5,7 +5,7 @@ exports.BlobTemplateFetchStrategy = void 0;
5
5
  const archipel_platform_blob_storage_1 = require("@breadstone/archipel-platform-blob-storage");
6
6
  const common_1 = require("@nestjs/common");
7
7
  const node_path_1 = require("node:path");
8
- const TemplateFetchStrategyBase_1 = require("./abstracts/TemplateFetchStrategyBase");
8
+ const TemplateFetchStrategyBase_1 = require("../abstracts/TemplateFetchStrategyBase");
9
9
  // #endregion
10
10
  /**
11
11
  * The `BlobTemplateFetchStrategy` class.
@@ -0,0 +1 @@
1
+ export { BlobTemplateFetchStrategy } from './BlobTemplateFetchStrategy';
@@ -0,0 +1,6 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.BlobTemplateFetchStrategy = void 0;
4
+ var BlobTemplateFetchStrategy_1 = require("./BlobTemplateFetchStrategy");
5
+ Object.defineProperty(exports, "BlobTemplateFetchStrategy", { enumerable: true, get: function () { return BlobTemplateFetchStrategy_1.BlobTemplateFetchStrategy; } });
6
+ //# sourceMappingURL=index.js.map
@@ -1,6 +1,6 @@
1
- import type { IMailTemplateRepository } from '../../ports/IMailTemplateRepository';
2
- import { TemplateFetchStrategyBase } from './abstracts/TemplateFetchStrategyBase';
3
- import type { IMailTemplateVariants } from '../../MailTokens';
1
+ import type { IMailTemplateVariants } from '../../../models/IMailTemplateVariants';
2
+ import type { IMailTemplateRepository } from '../../../ports/IMailTemplateRepository';
3
+ import { TemplateFetchStrategyBase } from '../abstracts/TemplateFetchStrategyBase';
4
4
  /**
5
5
  * Template fetch strategy that loads templates from a database via the
6
6
  * {@link IMailTemplateRepository} port.
@@ -5,8 +5,8 @@ Object.defineProperty(exports, "__esModule", { value: true });
5
5
  exports.DatabaseTemplateFetchStrategy = void 0;
6
6
  const tslib_1 = require("tslib");
7
7
  const common_1 = require("@nestjs/common");
8
- const MailTokens_1 = require("../../MailTokens");
9
- const TemplateFetchStrategyBase_1 = require("./abstracts/TemplateFetchStrategyBase");
8
+ const MailTokens_1 = require("../../../tokens/MailTokens");
9
+ const TemplateFetchStrategyBase_1 = require("../abstracts/TemplateFetchStrategyBase");
10
10
  // #endregion
11
11
  /**
12
12
  * Template fetch strategy that loads templates from a database via the
@@ -44,6 +44,9 @@ let DatabaseTemplateFetchStrategy = DatabaseTemplateFetchStrategy_1 = class Data
44
44
  templates[key] = {};
45
45
  }
46
46
  // Only set if not already filled (first match wins — default locale preferred)
47
+ if (template.subject && !templates[key].subject) {
48
+ templates[key].subject = template.subject;
49
+ }
47
50
  if (template.htmlBody && !templates[key].html) {
48
51
  templates[key].html = template.htmlBody;
49
52
  }
@@ -0,0 +1 @@
1
+ export { DatabaseTemplateFetchStrategy } from './DatabaseTemplateFetchStrategy';
@@ -0,0 +1,6 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.DatabaseTemplateFetchStrategy = void 0;
4
+ var DatabaseTemplateFetchStrategy_1 = require("./DatabaseTemplateFetchStrategy");
5
+ Object.defineProperty(exports, "DatabaseTemplateFetchStrategy", { enumerable: true, get: function () { return DatabaseTemplateFetchStrategy_1.DatabaseTemplateFetchStrategy; } });
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1,23 @@
1
+ import { ResourceManager } from '@breadstone/archipel-platform-resources';
2
+ import type { IMailTemplateVariants } from '../../../models/IMailTemplateVariants';
3
+ import { TemplateFetchStrategyBase } from '../abstracts/TemplateFetchStrategyBase';
4
+ /**
5
+ * The `FileTemplateFetchStrategy` class.
6
+ *
7
+ * Loads mail templates from the file system via `ResourceManager`.
8
+ * Template names are injected via `MAIL_TEMPLATE_NAMES_TOKEN` — defaults to an empty array.
9
+ *
10
+ * @public
11
+ */
12
+ export declare class FileTemplateFetchStrategy extends TemplateFetchStrategyBase {
13
+ private readonly _resourceManager;
14
+ private readonly _templateNames;
15
+ private readonly _logger;
16
+ constructor(resourceManager: ResourceManager, templateNames: ReadonlyArray<string>);
17
+ /**
18
+ * Loads mail templates from the file system.
19
+ *
20
+ * @public
21
+ */
22
+ load(): Promise<Record<string, IMailTemplateVariants>>;
23
+ }
@@ -4,22 +4,27 @@ var FileTemplateFetchStrategy_1;
4
4
  Object.defineProperty(exports, "__esModule", { value: true });
5
5
  exports.FileTemplateFetchStrategy = void 0;
6
6
  const tslib_1 = require("tslib");
7
- const common_1 = require("@nestjs/common");
8
7
  const archipel_platform_resources_1 = require("@breadstone/archipel-platform-resources");
9
- const TemplateFetchStrategyBase_1 = require("./abstracts/TemplateFetchStrategyBase");
8
+ const common_1 = require("@nestjs/common");
9
+ const MailTokens_1 = require("../../../tokens/MailTokens");
10
+ const TemplateFetchStrategyBase_1 = require("../abstracts/TemplateFetchStrategyBase");
10
11
  // #endregion
11
12
  /**
12
13
  * The `FileTemplateFetchStrategy` class.
13
14
  *
15
+ * Loads mail templates from the file system via `ResourceManager`.
16
+ * Template names are injected via `MAIL_TEMPLATE_NAMES_TOKEN` — defaults to an empty array.
17
+ *
14
18
  * @public
15
19
  */
16
20
  let FileTemplateFetchStrategy = FileTemplateFetchStrategy_1 = class FileTemplateFetchStrategy extends TemplateFetchStrategyBase_1.TemplateFetchStrategyBase {
17
21
  // #endregion
18
22
  // #region Ctor
19
- constructor(resourceManager) {
23
+ constructor(resourceManager, templateNames) {
20
24
  super();
21
25
  this._logger = new common_1.Logger(FileTemplateFetchStrategy_1.name);
22
26
  this._resourceManager = resourceManager;
27
+ this._templateNames = templateNames;
23
28
  }
24
29
  // #endregion
25
30
  // #region Methods
@@ -30,9 +35,8 @@ let FileTemplateFetchStrategy = FileTemplateFetchStrategy_1 = class FileTemplate
30
35
  */
31
36
  async load() {
32
37
  const templates = {};
33
- const templateNames = this.getTemplateNames();
34
38
  let templateCount = 0;
35
- for (const templateName of templateNames) {
39
+ for (const templateName of this._templateNames) {
36
40
  if (!templates[templateName]) {
37
41
  templates[templateName] = {};
38
42
  }
@@ -52,20 +56,11 @@ let FileTemplateFetchStrategy = FileTemplateFetchStrategy_1 = class FileTemplate
52
56
  this._logger.log(`${templateCount} Templates loaded from file system`);
53
57
  return templates;
54
58
  }
55
- // #endregion
56
- // #region Private Methods
57
- /**
58
- * Returns the list of known template names.
59
- *
60
- * @private
61
- */
62
- getTemplateNames() {
63
- return ['AppointmentInvitation', 'AppointmentUpdate', 'AuthForgotPassword', 'AuthRegister', 'AuthVerify'];
64
- }
65
59
  };
66
60
  exports.FileTemplateFetchStrategy = FileTemplateFetchStrategy;
67
61
  exports.FileTemplateFetchStrategy = FileTemplateFetchStrategy = FileTemplateFetchStrategy_1 = tslib_1.__decorate([
68
62
  (0, common_1.Injectable)(),
69
- tslib_1.__metadata("design:paramtypes", [archipel_platform_resources_1.ResourceManager])
63
+ tslib_1.__param(1, (0, common_1.Inject)(MailTokens_1.MAIL_TEMPLATE_NAMES_TOKEN)),
64
+ tslib_1.__metadata("design:paramtypes", [archipel_platform_resources_1.ResourceManager, Array])
70
65
  ], FileTemplateFetchStrategy);
71
66
  //# sourceMappingURL=FileTemplateFetchStrategy.js.map
@@ -0,0 +1 @@
1
+ export { FileTemplateFetchStrategy } from './FileTemplateFetchStrategy';
@@ -0,0 +1,6 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.FileTemplateFetchStrategy = void 0;
4
+ var FileTemplateFetchStrategy_1 = require("./FileTemplateFetchStrategy");
5
+ Object.defineProperty(exports, "FileTemplateFetchStrategy", { enumerable: true, get: function () { return FileTemplateFetchStrategy_1.FileTemplateFetchStrategy; } });
6
+ //# sourceMappingURL=index.js.map
@@ -6,14 +6,4 @@
6
6
  export declare const MAIL_TEMPLATE_FETCH_STRATEGY_TOKEN: unique symbol;
7
7
  export declare const MAIL_DELIVERY_STRATEGY_TOKEN: unique symbol;
8
8
  export declare const MAIL_TEMPLATE_REPOSITORY_TOKEN: unique symbol;
9
- /**
10
- * Union type of all supported template formats.
11
- */
12
- export type MailTemplateFormat = 'html' | 'txt';
13
- /**
14
- * Represents the in-memory structure for a single template (multiple formats).
15
- */
16
- export interface IMailTemplateVariants {
17
- html?: string;
18
- txt?: string;
19
- }
9
+ export declare const MAIL_TEMPLATE_NAMES_TOKEN: unique symbol;
@@ -7,8 +7,9 @@
7
7
  */
8
8
  // #endregion
9
9
  Object.defineProperty(exports, "__esModule", { value: true });
10
- exports.MAIL_TEMPLATE_REPOSITORY_TOKEN = exports.MAIL_DELIVERY_STRATEGY_TOKEN = exports.MAIL_TEMPLATE_FETCH_STRATEGY_TOKEN = void 0;
10
+ exports.MAIL_TEMPLATE_NAMES_TOKEN = exports.MAIL_TEMPLATE_REPOSITORY_TOKEN = exports.MAIL_DELIVERY_STRATEGY_TOKEN = exports.MAIL_TEMPLATE_FETCH_STRATEGY_TOKEN = void 0;
11
11
  exports.MAIL_TEMPLATE_FETCH_STRATEGY_TOKEN = Symbol('MailTemplateFetchStrategy');
12
12
  exports.MAIL_DELIVERY_STRATEGY_TOKEN = Symbol('MailDeliveryStrategy');
13
13
  exports.MAIL_TEMPLATE_REPOSITORY_TOKEN = Symbol('MailTemplateRepository');
14
+ exports.MAIL_TEMPLATE_NAMES_TOKEN = Symbol('MailTemplateNames');
14
15
  //# sourceMappingURL=MailTokens.js.map
@@ -1 +0,0 @@
1
- export { LogDeliveryStrategy } from '../services/strategies/LogDeliveryStrategy';
@@ -1,2 +0,0 @@
1
- export { MailgunDeliveryStrategy } from '../services/strategies/MailgunDeliveryStrategy';
2
- export { MAILGUN_API_KEY, MAILGUN_CONFIG_ENTRIES, MAILGUN_DOMAIN } from './env';
@@ -1,2 +0,0 @@
1
- export { PostmarkDeliveryStrategy } from '../services/strategies/PostmarkDeliveryStrategy';
2
- export { POSTMARK_API_KEY, POSTMARK_CONFIG_ENTRIES } from './env';
@@ -1,2 +0,0 @@
1
- export { ResendDeliveryStrategy } from '../services/strategies/ResendDeliveryStrategy';
2
- export { RESEND_API_KEY, RESEND_CONFIG_ENTRIES } from './env';
@@ -1,2 +0,0 @@
1
- export { SendGridDeliveryStrategy } from '../services/strategies/SendGridDeliveryStrategy';
2
- export { SENDGRID_API_KEY, SENDGRID_CONFIG_ENTRIES } from './env';
@@ -1,25 +0,0 @@
1
- import { ResourceManager } from '@breadstone/archipel-platform-resources';
2
- import { TemplateFetchStrategyBase } from './abstracts/TemplateFetchStrategyBase';
3
- import { IMailTemplateVariants } from '../../MailTokens';
4
- /**
5
- * The `FileTemplateFetchStrategy` class.
6
- *
7
- * @public
8
- */
9
- export declare class FileTemplateFetchStrategy extends TemplateFetchStrategyBase {
10
- private readonly _resourceManager;
11
- private readonly _logger;
12
- constructor(resourceManager: ResourceManager);
13
- /**
14
- * Loads mail templates from the file system.
15
- *
16
- * @public
17
- */
18
- load(): Promise<Record<string, IMailTemplateVariants>>;
19
- /**
20
- * Returns the list of known template names.
21
- *
22
- * @private
23
- */
24
- private getTemplateNames;
25
- }