@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.
- package/LICENSE.md +59 -0
- package/README.md +34 -0
- package/dist/clients/mail-client.factory.d.ts +4 -0
- package/dist/clients/mail-client.factory.js +22 -0
- package/dist/clients/mail-client.factory.js.map +1 -0
- package/dist/clients/mail.client.d.ts +26 -0
- package/dist/clients/mail.client.js +19 -0
- package/dist/clients/mail.client.js.map +1 -0
- package/dist/clients/mailpit-mail.client.d.ts +14 -0
- package/dist/clients/mailpit-mail.client.js +68 -0
- package/dist/clients/mailpit-mail.client.js.map +1 -0
- package/dist/clients/mock-mail.client.d.ts +4 -0
- package/dist/clients/mock-mail.client.js +18 -0
- package/dist/clients/mock-mail.client.js.map +1 -0
- package/dist/clients/scaleway-mail.client.d.ts +11 -0
- package/dist/clients/scaleway-mail.client.js +75 -0
- package/dist/clients/scaleway-mail.client.js.map +1 -0
- package/dist/clients/sendgrid-mail.client.d.ts +10 -0
- package/dist/clients/sendgrid-mail.client.js +87 -0
- package/dist/clients/sendgrid-mail.client.js.map +1 -0
- package/dist/enums/mail-provider.enum.d.ts +4 -0
- package/dist/enums/mail-provider.enum.js +6 -0
- package/dist/enums/mail-provider.enum.js.map +1 -0
- package/dist/errors/mail-api.error.d.ts +6 -0
- package/dist/errors/mail-api.error.js +13 -0
- package/dist/errors/mail-api.error.js.map +1 -0
- package/dist/errors/mail-unavailable.error.d.ts +5 -0
- package/dist/errors/mail-unavailable.error.js +21 -0
- package/dist/errors/mail-unavailable.error.js.map +1 -0
- package/dist/index.d.ts +16 -0
- package/dist/index.js +15 -0
- package/dist/index.js.map +1 -0
- package/dist/modules/mail.module-definitions.d.ts +3 -0
- package/dist/modules/mail.module-definitions.js +8 -0
- package/dist/modules/mail.module-definitions.js.map +1 -0
- package/dist/modules/mail.module-options.d.ts +88 -0
- package/dist/modules/mail.module-options.js +2 -0
- package/dist/modules/mail.module-options.js.map +1 -0
- package/dist/modules/mail.module.d.ts +9 -0
- package/dist/modules/mail.module.js +63 -0
- package/dist/modules/mail.module.js.map +1 -0
- package/dist/queue/mail-queue-name.d.ts +1 -0
- package/dist/queue/mail-queue-name.js +2 -0
- package/dist/queue/mail-queue-name.js.map +1 -0
- package/dist/queue/mail-queue.module-options.d.ts +11 -0
- package/dist/queue/mail-queue.module-options.js +2 -0
- package/dist/queue/mail-queue.module-options.js.map +1 -0
- package/dist/queue/mail-queue.module.d.ts +5 -0
- package/dist/queue/mail-queue.module.js +27 -0
- package/dist/queue/mail-queue.module.js.map +1 -0
- package/dist/queue/send-html-mail.job-handler.d.ts +8 -0
- package/dist/queue/send-html-mail.job-handler.js +39 -0
- package/dist/queue/send-html-mail.job-handler.js.map +1 -0
- package/dist/queue/send-html-mail.job.d.ts +15 -0
- package/dist/queue/send-html-mail.job.js +22 -0
- package/dist/queue/send-html-mail.job.js.map +1 -0
- package/dist/queue/send-template-mail.job-handler.d.ts +10 -0
- package/dist/queue/send-template-mail.job-handler.js +47 -0
- package/dist/queue/send-template-mail.job-handler.js.map +1 -0
- package/dist/queue/send-template-mail.job.d.ts +15 -0
- package/dist/queue/send-template-mail.job.js +22 -0
- package/dist/queue/send-template-mail.job.js.map +1 -0
- package/dist/utils/exhaustive-check.d.ts +1 -0
- package/dist/utils/exhaustive-check.js +4 -0
- package/dist/utils/exhaustive-check.js.map +1 -0
- package/package.json +40 -3
- 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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
1
|
+
{"version":3,"file":"mail-queue.module-options.js","sourceRoot":"","sources":["../../lib/queue/mail-queue.module-options.ts"],"names":[],"mappings":""}
|
|
@@ -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 @@
|
|
|
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.
|
|
4
|
-
"
|
|
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
|
+
```
|