@wisemen/nestjs-mail 0.0.0 → 0.0.2

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 (67) hide show
  1. package/LICENSE.md +59 -0
  2. package/README.md +34 -0
  3. package/dist/clients/mail-client.factory.d.ts +4 -0
  4. package/dist/clients/mail-client.factory.js +22 -0
  5. package/dist/clients/mail-client.factory.js.map +1 -0
  6. package/dist/clients/mail.client.d.ts +26 -0
  7. package/dist/clients/mail.client.js +19 -0
  8. package/dist/clients/mail.client.js.map +1 -0
  9. package/dist/clients/mailpit-mail.client.d.ts +14 -0
  10. package/dist/clients/mailpit-mail.client.js +68 -0
  11. package/dist/clients/mailpit-mail.client.js.map +1 -0
  12. package/dist/clients/mock-mail.client.d.ts +4 -0
  13. package/dist/clients/mock-mail.client.js +18 -0
  14. package/dist/clients/mock-mail.client.js.map +1 -0
  15. package/dist/clients/scaleway-mail.client.d.ts +11 -0
  16. package/dist/clients/scaleway-mail.client.js +75 -0
  17. package/dist/clients/scaleway-mail.client.js.map +1 -0
  18. package/dist/clients/sendgrid-mail.client.d.ts +10 -0
  19. package/dist/clients/sendgrid-mail.client.js +87 -0
  20. package/dist/clients/sendgrid-mail.client.js.map +1 -0
  21. package/dist/enums/mail-provider.enum.d.ts +4 -0
  22. package/dist/enums/mail-provider.enum.js +6 -0
  23. package/dist/enums/mail-provider.enum.js.map +1 -0
  24. package/dist/errors/mail-api.error.d.ts +6 -0
  25. package/dist/errors/mail-api.error.js +13 -0
  26. package/dist/errors/mail-api.error.js.map +1 -0
  27. package/dist/errors/mail-unavailable.error.d.ts +5 -0
  28. package/dist/errors/mail-unavailable.error.js +21 -0
  29. package/dist/errors/mail-unavailable.error.js.map +1 -0
  30. package/dist/index.d.ts +16 -0
  31. package/dist/index.js +15 -0
  32. package/dist/index.js.map +1 -0
  33. package/dist/modules/mail.module-definitions.d.ts +3 -0
  34. package/dist/modules/mail.module-definitions.js +8 -0
  35. package/dist/modules/mail.module-definitions.js.map +1 -0
  36. package/dist/modules/mail.module-options.d.ts +88 -0
  37. package/dist/modules/mail.module-options.js +2 -0
  38. package/dist/modules/mail.module-options.js.map +1 -0
  39. package/dist/modules/mail.module.d.ts +9 -0
  40. package/dist/modules/mail.module.js +63 -0
  41. package/dist/modules/mail.module.js.map +1 -0
  42. package/dist/queue/mail-queue-name.d.ts +1 -0
  43. package/dist/queue/mail-queue-name.js +2 -0
  44. package/dist/queue/mail-queue-name.js.map +1 -0
  45. package/dist/queue/mail-queue.module-options.d.ts +11 -0
  46. package/dist/queue/mail-queue.module-options.js +2 -0
  47. package/dist/queue/mail-queue.module-options.js.map +1 -0
  48. package/dist/queue/mail-queue.module.d.ts +5 -0
  49. package/dist/queue/mail-queue.module.js +27 -0
  50. package/dist/queue/mail-queue.module.js.map +1 -0
  51. package/dist/queue/send-html-mail.job-handler.d.ts +8 -0
  52. package/dist/queue/send-html-mail.job-handler.js +39 -0
  53. package/dist/queue/send-html-mail.job-handler.js.map +1 -0
  54. package/dist/queue/send-html-mail.job.d.ts +15 -0
  55. package/dist/queue/send-html-mail.job.js +22 -0
  56. package/dist/queue/send-html-mail.job.js.map +1 -0
  57. package/dist/queue/send-template-mail.job-handler.d.ts +10 -0
  58. package/dist/queue/send-template-mail.job-handler.js +47 -0
  59. package/dist/queue/send-template-mail.job-handler.js.map +1 -0
  60. package/dist/queue/send-template-mail.job.d.ts +15 -0
  61. package/dist/queue/send-template-mail.job.js +22 -0
  62. package/dist/queue/send-template-mail.job.js.map +1 -0
  63. package/dist/utils/exhaustive-check.d.ts +1 -0
  64. package/dist/utils/exhaustive-check.js +4 -0
  65. package/dist/utils/exhaustive-check.js.map +1 -0
  66. package/package.json +40 -3
  67. package/skills/getting-started/SKILL.md +65 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mail.module-definitions.js","sourceRoot":"","sources":["../../lib/modules/mail.module-definitions.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,mBAAmB,GAAG,oCAAoC,CAAA;AAEvE,MAAM,UAAU,mBAAmB,CAAE,OAA0B;IAC7D,OAAO,OAAO,CAAC,gBAAgB,IAAI,uBAAuB,EAAE,CAAA;AAC9D,CAAC;AAED,SAAS,uBAAuB;IAC9B,OAAO,OAAO,CAAC,GAAG,EAAE,GAAG,mBAAmB,CAAA;AAC5C,CAAC"}
@@ -0,0 +1,88 @@
1
+ import type { FactoryProvider, ModuleMetadata } from '@nestjs/common';
2
+ import { MailProvider } from '../enums/mail-provider.enum.js';
3
+ /**
4
+ * Options for configuring a MailPit-backed mail client.
5
+ */
6
+ export interface MailPitMailClientOptions {
7
+ /** Selects the MailPit client implementation. */
8
+ type: 'mailpit';
9
+ /** Base URL of the MailPit HTTP API. */
10
+ url: string;
11
+ /** Default sender address used when `sendMail()` omits `from`. */
12
+ defaultFrom?: string;
13
+ /** Optional HTTP basic auth credentials for protected MailPit instances. */
14
+ auth?: {
15
+ /** MailPit username. */
16
+ username: string;
17
+ /** MailPit password. */
18
+ password: string;
19
+ };
20
+ /** Optional MailPit tag added to every message. */
21
+ tag?: string;
22
+ }
23
+ /**
24
+ * Options for configuring the Scaleway transactional email client.
25
+ */
26
+ export interface ScalewayMailClientOptions {
27
+ /** Selects the Scaleway client implementation. */
28
+ type: MailProvider.SCALEWAY;
29
+ /** Scaleway project identifier used for transactional email. */
30
+ projectId: string;
31
+ /** Default sender address used when `sendMail()` omits `from`. */
32
+ from: string;
33
+ /** Scaleway API token used for authenticated requests. */
34
+ apiKey: string;
35
+ /** Scaleway region. Defaults to `fr-par` when omitted. */
36
+ region?: string;
37
+ }
38
+ /**
39
+ * Options for configuring the SendGrid client.
40
+ */
41
+ export interface SendGridMailClientOptions {
42
+ /** Selects the SendGrid client implementation. */
43
+ type: MailProvider.SEND_GRID;
44
+ /** Default sender address used when `sendMail()` omits `from`. */
45
+ defaultFrom: string;
46
+ /** SendGrid API token used for authenticated requests. */
47
+ apiToken: string;
48
+ }
49
+ /**
50
+ * Options for configuring a no-op test client.
51
+ */
52
+ export interface MockMailClientOptions {
53
+ /** Selects the mock client implementation. */
54
+ type: 'mock';
55
+ }
56
+ /**
57
+ * Supported concrete mail client configurations.
58
+ */
59
+ export type MailClientOptions = MailPitMailClientOptions | ScalewayMailClientOptions | SendGridMailClientOptions | MockMailClientOptions;
60
+ /**
61
+ * Synchronous configuration for `MailModule.forRoot(...)`.
62
+ */
63
+ export interface MailModuleOptions {
64
+ /**
65
+ * Base path used by `HandlebarsRenderer` to resolve template file paths.
66
+ *
67
+ * Defaults to `<cwd>/dist/src/modules`.
68
+ */
69
+ templateRootPath?: string;
70
+ /** Concrete mail client configuration to register in Nest DI. */
71
+ client: MailClientOptions;
72
+ }
73
+ /**
74
+ * Async configuration for `MailModule.forRootAsync(...)`.
75
+ */
76
+ export interface MailModuleAsyncOptions extends Pick<ModuleMetadata, 'imports'> {
77
+ /**
78
+ * Optional modules that should be imported before resolving the factory.
79
+ */
80
+ imports?: ModuleMetadata['imports'];
81
+ /**
82
+ * Factory that resolves the module options from config, secrets, feature
83
+ * flags, or test setup.
84
+ */
85
+ useFactory: (...args: unknown[]) => Promise<MailModuleOptions> | MailModuleOptions;
86
+ /** Dependencies injected into `useFactory`. */
87
+ inject?: FactoryProvider['inject'];
88
+ }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=mail.module-options.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mail.module-options.js","sourceRoot":"","sources":["../../lib/modules/mail.module-options.ts"],"names":[],"mappings":""}
@@ -0,0 +1,9 @@
1
+ import { DynamicModule } from '@nestjs/common';
2
+ import type { MailModuleAsyncOptions, MailModuleOptions } from './mail.module-options.js';
3
+ export declare class MailModule {
4
+ static forRoot(options: MailModuleOptions): DynamicModule;
5
+ static forRootAsync(options: MailModuleAsyncOptions): DynamicModule;
6
+ private static createOptionsProvider;
7
+ private static createMailClientProvider;
8
+ private static createHandlebarsOptionsProvider;
9
+ }
@@ -0,0 +1,63 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ var MailModule_1;
8
+ import { Module } from '@nestjs/common';
9
+ import { HANDLEBARS_MODULE_OPTIONS, HandlebarsRenderer } from '@wisemen/nestjs-handlebars';
10
+ import { createMailClient } from '../clients/mail-client.factory.js';
11
+ import { MailClient } from '../clients/mail.client.js';
12
+ import { MAIL_MODULE_OPTIONS } from './mail.module-definitions.js';
13
+ let MailModule = MailModule_1 = class MailModule {
14
+ static forRoot(options) {
15
+ return this.forRootAsync({
16
+ useFactory: () => options
17
+ });
18
+ }
19
+ static forRootAsync(options) {
20
+ return {
21
+ module: MailModule_1,
22
+ imports: options.imports ?? [],
23
+ providers: [
24
+ this.createOptionsProvider(options),
25
+ this.createMailClientProvider(),
26
+ this.createHandlebarsOptionsProvider(),
27
+ HandlebarsRenderer
28
+ ],
29
+ exports: [
30
+ HandlebarsRenderer,
31
+ MailClient
32
+ ]
33
+ };
34
+ }
35
+ static createOptionsProvider(options) {
36
+ return {
37
+ provide: MAIL_MODULE_OPTIONS,
38
+ useFactory: options.useFactory,
39
+ inject: options.inject ?? []
40
+ };
41
+ }
42
+ static createMailClientProvider() {
43
+ return {
44
+ provide: MailClient,
45
+ useFactory: (options) => createMailClient(options.client),
46
+ inject: [MAIL_MODULE_OPTIONS]
47
+ };
48
+ }
49
+ static createHandlebarsOptionsProvider() {
50
+ return {
51
+ provide: HANDLEBARS_MODULE_OPTIONS,
52
+ useFactory: (options) => ({
53
+ templateRootPath: options.templateRootPath
54
+ }),
55
+ inject: [MAIL_MODULE_OPTIONS]
56
+ };
57
+ }
58
+ };
59
+ MailModule = MailModule_1 = __decorate([
60
+ Module({})
61
+ ], MailModule);
62
+ export { MailModule };
63
+ //# sourceMappingURL=mail.module.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mail.module.js","sourceRoot":"","sources":["../../lib/modules/mail.module.ts"],"names":[],"mappings":";;;;;;;AAAA,OAAO,EAAiB,MAAM,EAAY,MAAM,gBAAgB,CAAA;AAChE,OAAO,EAAE,yBAAyB,EAAE,kBAAkB,EAAgC,MAAM,4BAA4B,CAAA;AACxH,OAAO,EAAE,gBAAgB,EAAE,MAAM,mCAAmC,CAAA;AACpE,OAAO,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAA;AACtD,OAAO,EAAE,mBAAmB,EAAE,MAAM,8BAA8B,CAAA;AAI3D,IAAM,UAAU,kBAAhB,MAAM,UAAU;IACrB,MAAM,CAAC,OAAO,CAAE,OAA0B;QACxC,OAAO,IAAI,CAAC,YAAY,CAAC;YACvB,UAAU,EAAE,GAAG,EAAE,CAAC,OAAO;SAC1B,CAAC,CAAA;IACJ,CAAC;IAED,MAAM,CAAC,YAAY,CAAE,OAA+B;QAClD,OAAO;YACL,MAAM,EAAE,YAAU;YAClB,OAAO,EAAE,OAAO,CAAC,OAAO,IAAI,EAAE;YAC9B,SAAS,EAAE;gBACT,IAAI,CAAC,qBAAqB,CAAC,OAAO,CAAC;gBACnC,IAAI,CAAC,wBAAwB,EAAE;gBAC/B,IAAI,CAAC,+BAA+B,EAAE;gBACtC,kBAAkB;aACnB;YACD,OAAO,EAAE;gBACP,kBAAkB;gBAClB,UAAU;aACX;SACF,CAAA;IACH,CAAC;IAEO,MAAM,CAAC,qBAAqB,CAAE,OAA+B;QACnE,OAAO;YACL,OAAO,EAAE,mBAAmB;YAC5B,UAAU,EAAE,OAAO,CAAC,UAAU;YAC9B,MAAM,EAAE,OAAO,CAAC,MAAM,IAAI,EAAE;SAC7B,CAAA;IACH,CAAC;IAEO,MAAM,CAAC,wBAAwB;QACrC,OAAO;YACL,OAAO,EAAE,UAAU;YACnB,UAAU,EAAE,CAAC,OAA0B,EAAE,EAAE,CAAC,gBAAgB,CAAC,OAAO,CAAC,MAAM,CAAC;YAC5E,MAAM,EAAE,CAAC,mBAAmB,CAAC;SAC9B,CAAA;IACH,CAAC;IAEO,MAAM,CAAC,+BAA+B;QAC5C,OAAO;YACL,OAAO,EAAE,yBAAyB;YAClC,UAAU,EAAE,CAAC,OAA0B,EAA2B,EAAE,CAAC,CAAC;gBACpE,gBAAgB,EAAE,OAAO,CAAC,gBAAgB;aAC3C,CAAC;YACF,MAAM,EAAE,CAAC,mBAAmB,CAAC;SAC9B,CAAA;IACH,CAAC;CACF,CAAA;AAjDY,UAAU;IADtB,MAAM,CAAC,EAAE,CAAC;GACE,UAAU,CAiDtB"}
@@ -0,0 +1 @@
1
+ export declare const MAIL_QUEUE_NAME = "mail";
@@ -0,0 +1,2 @@
1
+ export const MAIL_QUEUE_NAME = 'mail';
2
+ //# sourceMappingURL=mail-queue-name.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mail-queue-name.js","sourceRoot":"","sources":["../../lib/queue/mail-queue-name.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,eAAe,GAAG,MAAM,CAAA"}
@@ -0,0 +1,11 @@
1
+ import type { ModuleMetadata } from '@nestjs/common';
2
+ /**
3
+ * Configuration for `MailQueueModule.forRoot(...)`.
4
+ */
5
+ export interface MailQueueModuleOptions {
6
+ /**
7
+ * Modules imported into the queue module so the mail job handlers can
8
+ * resolve dependencies such as `MailClient` and `HandlebarsRenderer`.
9
+ */
10
+ imports?: ModuleMetadata['imports'];
11
+ }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=mail-queue.module-options.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mail-queue.module-options.js","sourceRoot":"","sources":["../../lib/queue/mail-queue.module-options.ts"],"names":[],"mappings":""}
@@ -0,0 +1,5 @@
1
+ import { DynamicModule } from '@nestjs/common';
2
+ import type { MailQueueModuleOptions } from './mail-queue.module-options.js';
3
+ export declare class MailQueueModule {
4
+ static forRoot(options?: MailQueueModuleOptions): DynamicModule;
5
+ }
@@ -0,0 +1,27 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ var MailQueueModule_1;
8
+ import { Module } from '@nestjs/common';
9
+ import { SendHtmlMailJobHandler } from './send-html-mail.job-handler.js';
10
+ import { SendTemplateMailJobHandler } from './send-template-mail.job-handler.js';
11
+ let MailQueueModule = MailQueueModule_1 = class MailQueueModule {
12
+ static forRoot(options = {}) {
13
+ return {
14
+ module: MailQueueModule_1,
15
+ imports: options.imports ?? [],
16
+ providers: [
17
+ SendHtmlMailJobHandler,
18
+ SendTemplateMailJobHandler
19
+ ]
20
+ };
21
+ }
22
+ };
23
+ MailQueueModule = MailQueueModule_1 = __decorate([
24
+ Module({})
25
+ ], MailQueueModule);
26
+ export { MailQueueModule };
27
+ //# sourceMappingURL=mail-queue.module.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mail-queue.module.js","sourceRoot":"","sources":["../../lib/queue/mail-queue.module.ts"],"names":[],"mappings":";;;;;;;AAAA,OAAO,EAAiB,MAAM,EAAE,MAAM,gBAAgB,CAAA;AACtD,OAAO,EAAE,sBAAsB,EAAE,MAAM,iCAAiC,CAAA;AAExE,OAAO,EAAE,0BAA0B,EAAE,MAAM,qCAAqC,CAAA;AAGzE,IAAM,eAAe,uBAArB,MAAM,eAAe;IAC1B,MAAM,CAAC,OAAO,CAAE,UAAkC,EAAE;QAClD,OAAO;YACL,MAAM,EAAE,iBAAe;YACvB,OAAO,EAAE,OAAO,CAAC,OAAO,IAAI,EAAE;YAC9B,SAAS,EAAE;gBACT,sBAAsB;gBACtB,0BAA0B;aAC3B;SACF,CAAA;IACH,CAAC;CACF,CAAA;AAXY,eAAe;IAD3B,MAAM,CAAC,EAAE,CAAC;GACE,eAAe,CAW3B"}
@@ -0,0 +1,8 @@
1
+ import { JobHandler } from '@wisemen/pgboss-nestjs-job';
2
+ import { MailClient } from '../clients/mail.client.js';
3
+ import { SendHtmlMailJob, type SendHtmlMailJobData } from './send-html-mail.job.js';
4
+ export declare class SendHtmlMailJobHandler extends JobHandler<SendHtmlMailJob> {
5
+ private mailClient;
6
+ constructor(mailClient: MailClient);
7
+ run(mail: SendHtmlMailJobData): Promise<void>;
8
+ }
@@ -0,0 +1,39 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ var __metadata = (this && this.__metadata) || function (k, v) {
8
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
9
+ };
10
+ import { Injectable } from '@nestjs/common';
11
+ import { JobHandler, PgBossJobHandler } from '@wisemen/pgboss-nestjs-job';
12
+ import { MailClient } from '../clients/mail.client.js';
13
+ import { SendHtmlMailJob } from './send-html-mail.job.js';
14
+ let SendHtmlMailJobHandler = class SendHtmlMailJobHandler extends JobHandler {
15
+ mailClient;
16
+ constructor(mailClient) {
17
+ super();
18
+ this.mailClient = mailClient;
19
+ }
20
+ async run(mail) {
21
+ await this.mailClient.sendMail({
22
+ to: mail.to,
23
+ cc: mail.cc,
24
+ bcc: mail.bcc,
25
+ from: mail.from,
26
+ replyTo: mail.replyTo,
27
+ subject: mail.subject,
28
+ text: mail.text,
29
+ html: mail.html
30
+ });
31
+ }
32
+ };
33
+ SendHtmlMailJobHandler = __decorate([
34
+ Injectable(),
35
+ PgBossJobHandler(SendHtmlMailJob),
36
+ __metadata("design:paramtypes", [MailClient])
37
+ ], SendHtmlMailJobHandler);
38
+ export { SendHtmlMailJobHandler };
39
+ //# sourceMappingURL=send-html-mail.job-handler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"send-html-mail.job-handler.js","sourceRoot":"","sources":["../../lib/queue/send-html-mail.job-handler.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAA;AAC3C,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAA;AACzE,OAAO,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAA;AACtD,OAAO,EAAE,eAAe,EAA4B,MAAM,yBAAyB,CAAA;AAI5E,IAAM,sBAAsB,GAA5B,MAAM,sBAAuB,SAAQ,UAA2B;IAE3D;IADV,YACU,UAAsB;QAE9B,KAAK,EAAE,CAAA;QAFC,eAAU,GAAV,UAAU,CAAY;IAGhC,CAAC;IAED,KAAK,CAAC,GAAG,CAAE,IAAyB;QAClC,MAAM,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC;YAC7B,EAAE,EAAE,IAAI,CAAC,EAAE;YACX,EAAE,EAAE,IAAI,CAAC,EAAE;YACX,GAAG,EAAE,IAAI,CAAC,GAAG;YACb,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,IAAI,EAAE,IAAI,CAAC,IAAI;SAChB,CAAC,CAAA;IACJ,CAAC;CACF,CAAA;AAnBY,sBAAsB;IAFlC,UAAU,EAAE;IACZ,gBAAgB,CAAC,eAAe,CAAC;qCAGV,UAAU;GAFrB,sBAAsB,CAmBlC"}
@@ -0,0 +1,15 @@
1
+ import { BaseJob } from '@wisemen/pgboss-nestjs-job';
2
+ export interface SendHtmlMailJobData {
3
+ from?: string;
4
+ to: string;
5
+ cc?: string;
6
+ bcc?: string;
7
+ replyTo?: string;
8
+ subject: string;
9
+ data: Record<string, unknown>;
10
+ text: string;
11
+ html: string;
12
+ }
13
+ export declare class SendHtmlMailJob extends BaseJob<SendHtmlMailJobData> {
14
+ constructor(data: SendHtmlMailJobData);
15
+ }
@@ -0,0 +1,22 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ var __metadata = (this && this.__metadata) || function (k, v) {
8
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
9
+ };
10
+ import { BaseJob, PgBossJob } from '@wisemen/pgboss-nestjs-job';
11
+ import { MAIL_QUEUE_NAME } from './mail-queue-name.js';
12
+ let SendHtmlMailJob = class SendHtmlMailJob extends BaseJob {
13
+ constructor(data) {
14
+ super(data);
15
+ }
16
+ };
17
+ SendHtmlMailJob = __decorate([
18
+ PgBossJob(MAIL_QUEUE_NAME),
19
+ __metadata("design:paramtypes", [Object])
20
+ ], SendHtmlMailJob);
21
+ export { SendHtmlMailJob };
22
+ //# sourceMappingURL=send-html-mail.job.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"send-html-mail.job.js","sourceRoot":"","sources":["../../lib/queue/send-html-mail.job.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,EAAE,OAAO,EAAG,SAAS,EAAE,MAAM,4BAA4B,CAAA;AAChE,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAA;AAe/C,IAAM,eAAe,GAArB,MAAM,eAAgB,SAAQ,OAA4B;IAC/D,YAAa,IAAyB;QACpC,KAAK,CAAC,IAAI,CAAC,CAAA;IACb,CAAC;CACF,CAAA;AAJY,eAAe;IAD3B,SAAS,CAAC,eAAe,CAAC;;GACd,eAAe,CAI3B"}
@@ -0,0 +1,10 @@
1
+ import { HandlebarsRenderer } from '@wisemen/nestjs-handlebars';
2
+ import { JobHandler } from '@wisemen/pgboss-nestjs-job';
3
+ import { MailClient } from '../clients/mail.client.js';
4
+ import { SendTemplateMailJob, type SendTemplateMailJobData } from './send-template-mail.job.js';
5
+ export declare class SendTemplateMailJobHandler extends JobHandler<SendTemplateMailJob> {
6
+ private mailClient;
7
+ private handlebarsRenderer;
8
+ constructor(mailClient: MailClient, handlebarsRenderer: HandlebarsRenderer);
9
+ run(mail: SendTemplateMailJobData): Promise<void>;
10
+ }
@@ -0,0 +1,47 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ var __metadata = (this && this.__metadata) || function (k, v) {
8
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
9
+ };
10
+ import { Injectable } from '@nestjs/common';
11
+ import { HandlebarsRenderer } from '@wisemen/nestjs-handlebars';
12
+ import { JobHandler, PgBossJobHandler } from '@wisemen/pgboss-nestjs-job';
13
+ import { MailClient } from '../clients/mail.client.js';
14
+ import { SendTemplateMailJob } from './send-template-mail.job.js';
15
+ let SendTemplateMailJobHandler = class SendTemplateMailJobHandler extends JobHandler {
16
+ mailClient;
17
+ handlebarsRenderer;
18
+ constructor(mailClient, handlebarsRenderer) {
19
+ super();
20
+ this.mailClient = mailClient;
21
+ this.handlebarsRenderer = handlebarsRenderer;
22
+ }
23
+ async run(mail) {
24
+ const [html, text] = await Promise.all([
25
+ this.handlebarsRenderer.render(mail.htmlHbsFilePath, mail.data),
26
+ this.handlebarsRenderer.render(mail.textHbsFilePath, mail.data)
27
+ ]);
28
+ await this.mailClient.sendMail({
29
+ to: mail.to,
30
+ cc: mail.cc,
31
+ bcc: mail.bcc,
32
+ from: mail.from,
33
+ replyTo: mail.replyTo,
34
+ subject: mail.subject,
35
+ text,
36
+ html
37
+ });
38
+ }
39
+ };
40
+ SendTemplateMailJobHandler = __decorate([
41
+ Injectable(),
42
+ PgBossJobHandler(SendTemplateMailJob),
43
+ __metadata("design:paramtypes", [MailClient,
44
+ HandlebarsRenderer])
45
+ ], SendTemplateMailJobHandler);
46
+ export { SendTemplateMailJobHandler };
47
+ //# sourceMappingURL=send-template-mail.job-handler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"send-template-mail.job-handler.js","sourceRoot":"","sources":["../../lib/queue/send-template-mail.job-handler.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAA;AAC3C,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAA;AAC/D,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAA;AACzE,OAAO,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAA;AACtD,OAAO,EAAE,mBAAmB,EAAgC,MAAM,6BAA6B,CAAA;AAIxF,IAAM,0BAA0B,GAAhC,MAAM,0BAA2B,SAAQ,UAA+B;IAEnE;IACA;IAFV,YACU,UAAsB,EACtB,kBAAsC;QAE9C,KAAK,EAAE,CAAA;QAHC,eAAU,GAAV,UAAU,CAAY;QACtB,uBAAkB,GAAlB,kBAAkB,CAAoB;IAGhD,CAAC;IAED,KAAK,CAAC,GAAG,CAAE,IAA6B;QACtC,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;YACrC,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,IAAI,CAAC,eAAe,EAAE,IAAI,CAAC,IAAI,CAAC;YAC/D,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,IAAI,CAAC,eAAe,EAAE,IAAI,CAAC,IAAI,CAAC;SAChE,CAAC,CAAA;QAEF,MAAM,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC;YAC7B,EAAE,EAAE,IAAI,CAAC,EAAE;YACX,EAAE,EAAE,IAAI,CAAC,EAAE;YACX,GAAG,EAAE,IAAI,CAAC,GAAG;YACb,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,IAAI;YACJ,IAAI;SACL,CAAC,CAAA;IACJ,CAAC;CACF,CAAA;AAzBY,0BAA0B;IAFtC,UAAU,EAAE;IACZ,gBAAgB,CAAC,mBAAmB,CAAC;qCAGd,UAAU;QACF,kBAAkB;GAHrC,0BAA0B,CAyBtC"}
@@ -0,0 +1,15 @@
1
+ import { BaseJob } from '@wisemen/pgboss-nestjs-job';
2
+ export interface SendTemplateMailJobData {
3
+ from?: string;
4
+ to: string;
5
+ cc?: string;
6
+ bcc?: string;
7
+ replyTo?: string;
8
+ subject: string;
9
+ data: Record<string, unknown>;
10
+ textHbsFilePath: string;
11
+ htmlHbsFilePath: string;
12
+ }
13
+ export declare class SendTemplateMailJob extends BaseJob<SendTemplateMailJobData> {
14
+ constructor(data: SendTemplateMailJobData);
15
+ }
@@ -0,0 +1,22 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ var __metadata = (this && this.__metadata) || function (k, v) {
8
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
9
+ };
10
+ import { BaseJob, PgBossJob } from '@wisemen/pgboss-nestjs-job';
11
+ import { MAIL_QUEUE_NAME } from './mail-queue-name.js';
12
+ let SendTemplateMailJob = class SendTemplateMailJob extends BaseJob {
13
+ constructor(data) {
14
+ super(data);
15
+ }
16
+ };
17
+ SendTemplateMailJob = __decorate([
18
+ PgBossJob(MAIL_QUEUE_NAME),
19
+ __metadata("design:paramtypes", [Object])
20
+ ], SendTemplateMailJob);
21
+ export { SendTemplateMailJob };
22
+ //# sourceMappingURL=send-template-mail.job.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"send-template-mail.job.js","sourceRoot":"","sources":["../../lib/queue/send-template-mail.job.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAA;AAC/D,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAA;AAe/C,IAAM,mBAAmB,GAAzB,MAAM,mBAAoB,SAAQ,OAAgC;IACvE,YAAa,IAA6B;QACxC,KAAK,CAAC,IAAI,CAAC,CAAA;IACb,CAAC;CACF,CAAA;AAJY,mBAAmB;IAD/B,SAAS,CAAC,eAAe,CAAC;;GACd,mBAAmB,CAI/B"}
@@ -0,0 +1 @@
1
+ export declare function exhaustiveCheck(value: never): never;
@@ -0,0 +1,4 @@
1
+ export function exhaustiveCheck(value) {
2
+ throw new Error(`Unhandled value: ${String(value)}`);
3
+ }
4
+ //# sourceMappingURL=exhaustive-check.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"exhaustive-check.js","sourceRoot":"","sources":["../../lib/utils/exhaustive-check.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,eAAe,CAAE,KAAY;IAC3C,MAAM,IAAI,KAAK,CAAC,oBAAoB,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAA;AACtD,CAAC"}
package/package.json CHANGED
@@ -1,11 +1,48 @@
1
1
  {
2
2
  "name": "@wisemen/nestjs-mail",
3
- "version": "0.0.0",
4
- "license": "SEE LICENSE IN LICENSE.md",
3
+ "version": "0.0.2",
4
+ "publishConfig": {
5
+ "access": "public"
6
+ },
7
+ "main": "./dist/index.js",
8
+ "types": "./dist/index.d.ts",
9
+ "type": "module",
10
+ "files": [
11
+ "dist/",
12
+ "skills/"
13
+ ],
14
+ "peerDependencies": {
15
+ "@nestjs/common": "^11.1.19",
16
+ "@wisemen/api-error": "^1.0.0",
17
+ "@wisemen/nestjs-handlebars": "^0.0.1"
18
+ },
19
+ "dependencies": {
20
+ "mailpit-api": "^2.0.0",
21
+ "@wisemen/pgboss-nestjs-job": "5.0.0"
22
+ },
23
+ "devDependencies": {
24
+ "@types/node": "25.3.0",
25
+ "eslint": "10.2.1",
26
+ "oxlint": "1.59.0",
27
+ "oxlint-tsgolint": "0.20.0",
28
+ "typescript": "^5.9.3",
29
+ "@wisemen/eslint-config-nestjs": "1.1.1"
30
+ },
5
31
  "author": "Wisemen",
32
+ "license": "SEE LICENSE IN LICENSE.md",
6
33
  "repository": {
7
34
  "type": "git",
8
35
  "url": "https://github.com/wisemen-digital/wisemen-core",
9
36
  "directory": "packages/api/nestjs-mail"
37
+ },
38
+ "scripts": {
39
+ "lint:oxlint": "oxlint --type-aware lib",
40
+ "lint:eslint": "eslint lib",
41
+ "lint": "pnpm run lint:oxlint && pnpm run lint:eslint",
42
+ "prebuild": "rm -rf ./dist",
43
+ "clean": "rm -rf ./dist",
44
+ "build": "tsc",
45
+ "prerelease": "npm run build",
46
+ "release": "pnpx release-it"
10
47
  }
11
- }
48
+ }
@@ -0,0 +1,65 @@
1
+ ---
2
+ name: getting-started
3
+ description: Use when configuring transactional mail delivery in NestJS APIs with @wisemen/nestjs-mail.
4
+ ---
5
+
6
+ # @wisemen/nestjs-mail - Getting Started
7
+
8
+ Use `MailModule.forRootAsync(...)` to register a shared `MailClient` and
9
+ `HandlebarsRenderer`, then keep provider selection in your application layer.
10
+
11
+ ## Send Mail
12
+
13
+ Inject `MailClient` into a use case, service, or job handler and call
14
+ `sendMail(...)` with html or text content.
15
+
16
+ ```ts
17
+ import { Injectable } from '@nestjs/common'
18
+ import { MailClient } from '@wisemen/nestjs-mail'
19
+
20
+ @Injectable()
21
+ export class SendWelcomeMailUseCase {
22
+ constructor(private readonly mailClient: MailClient) {}
23
+
24
+ async send(to: string): Promise<void> {
25
+ await this.mailClient.sendMail({
26
+ to,
27
+ subject: 'Welcome',
28
+ text: 'Welcome to the platform'
29
+ })
30
+ }
31
+ }
32
+ ```
33
+
34
+ ## Render Handlebars Templates
35
+
36
+ Use `HandlebarsRenderer` when the mail body should come from `.hbs` templates in
37
+ your built application output.
38
+
39
+ ```ts
40
+ import { Injectable } from '@nestjs/common'
41
+ import { HandlebarsRenderer } from '@wisemen/nestjs-handlebars'
42
+ import { MailClient } from '@wisemen/nestjs-mail'
43
+
44
+ @Injectable()
45
+ export class SendTemplateMailUseCase {
46
+ constructor(
47
+ private readonly mailClient: MailClient,
48
+ private readonly renderer: HandlebarsRenderer
49
+ ) {}
50
+
51
+ async send(to: string, data: Record<string, unknown>): Promise<void> {
52
+ const [html, text] = await Promise.all([
53
+ this.renderer.render('mail/templates/welcome.html.hbs', data),
54
+ this.renderer.render('mail/templates/welcome.text.hbs', data)
55
+ ])
56
+
57
+ await this.mailClient.sendMail({
58
+ to,
59
+ subject: 'Welcome',
60
+ html,
61
+ text
62
+ })
63
+ }
64
+ }
65
+ ```