@studiosonrai/nestjs-email 1.0.0 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +90 -0
- package/dist/src/email.module.js +7 -0
- package/dist/src/email.module.js.map +1 -1
- package/dist/src/email.service.js +2 -0
- package/dist/src/email.service.js.map +1 -1
- package/dist/src/index.d.ts +1 -0
- package/dist/src/index.js +1 -0
- package/dist/src/index.js.map +1 -1
- package/dist/src/interfaces/email.interfaces.d.ts +5 -1
- package/dist/src/providers/azure.provider.js +5 -1
- package/dist/src/providers/azure.provider.js.map +1 -1
- package/dist/src/providers/azure.provider.spec.d.ts +1 -0
- package/dist/src/providers/azure.provider.spec.js +84 -0
- package/dist/src/providers/azure.provider.spec.js.map +1 -0
- package/dist/src/providers/index.d.ts +1 -0
- package/dist/src/providers/index.js +1 -0
- package/dist/src/providers/index.js.map +1 -1
- package/dist/src/providers/resend.provider.d.ts +17 -0
- package/dist/src/providers/resend.provider.js +178 -0
- package/dist/src/providers/resend.provider.js.map +1 -0
- package/dist/src/providers/resend.provider.spec.d.ts +1 -0
- package/dist/src/providers/resend.provider.spec.js +108 -0
- package/dist/src/providers/resend.provider.spec.js.map +1 -0
- package/dist/src/providers/smtp.provider.js +5 -1
- package/dist/src/providers/smtp.provider.js.map +1 -1
- package/dist/src/providers/smtp.provider.spec.d.ts +1 -0
- package/dist/src/providers/smtp.provider.spec.js +90 -0
- package/dist/src/providers/smtp.provider.spec.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +17 -5
package/README.md
ADDED
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
# @studiosonrai/nestjs-email
|
|
2
|
+
|
|
3
|
+
Email module for NestJS with SMTP, Azure Communication Service, and Resend support.
|
|
4
|
+
|
|
5
|
+
## Installation
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
npm install @studiosonrai/nestjs-email
|
|
9
|
+
|
|
10
|
+
# For SMTP:
|
|
11
|
+
npm install nodemailer
|
|
12
|
+
|
|
13
|
+
# For Azure:
|
|
14
|
+
npm install @azure/communication-email
|
|
15
|
+
|
|
16
|
+
# For Resend:
|
|
17
|
+
npm install resend
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
## Usage
|
|
21
|
+
|
|
22
|
+
### SMTP
|
|
23
|
+
|
|
24
|
+
```typescript
|
|
25
|
+
import { EmailModule, EmailService } from '@studiosonrai/nestjs-email';
|
|
26
|
+
|
|
27
|
+
@Module({
|
|
28
|
+
imports: [
|
|
29
|
+
EmailModule.forRootAsync({
|
|
30
|
+
inject: [ConfigService],
|
|
31
|
+
useFactory: (config: ConfigService) => ({
|
|
32
|
+
provider: 'smtp',
|
|
33
|
+
smtp: {
|
|
34
|
+
host: config.get('SMTP_HOST'),
|
|
35
|
+
port: config.get('SMTP_PORT'),
|
|
36
|
+
auth: { user: config.get('SMTP_USER'), pass: config.get('SMTP_PASS') },
|
|
37
|
+
},
|
|
38
|
+
defaultFrom: config.get('MAIL_FROM'),
|
|
39
|
+
}),
|
|
40
|
+
}),
|
|
41
|
+
],
|
|
42
|
+
})
|
|
43
|
+
export class AppModule {}
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
### Resend
|
|
47
|
+
|
|
48
|
+
```typescript
|
|
49
|
+
@Module({
|
|
50
|
+
imports: [
|
|
51
|
+
EmailModule.forRootAsync({
|
|
52
|
+
inject: [ConfigService],
|
|
53
|
+
useFactory: (config: ConfigService) => ({
|
|
54
|
+
provider: 'resend',
|
|
55
|
+
resend: {
|
|
56
|
+
apiKey: config.get('RESEND_API_KEY'),
|
|
57
|
+
},
|
|
58
|
+
defaultFrom: config.get('MAIL_FROM'),
|
|
59
|
+
}),
|
|
60
|
+
}),
|
|
61
|
+
],
|
|
62
|
+
})
|
|
63
|
+
export class AppModule {}
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
### Sending Emails
|
|
67
|
+
|
|
68
|
+
```typescript
|
|
69
|
+
// Inject and use
|
|
70
|
+
@Injectable()
|
|
71
|
+
export class MyService {
|
|
72
|
+
constructor(private emailService: EmailService) {}
|
|
73
|
+
|
|
74
|
+
async send() {
|
|
75
|
+
await this.emailService.sendEmail('to@example.com', 'Subject', '<p>Body</p>');
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
## Configuration
|
|
81
|
+
|
|
82
|
+
| Option | Type | Description |
|
|
83
|
+
|--------|------|-------------|
|
|
84
|
+
| `provider` | `'smtp' \| 'azure' \| 'resend'` | Email provider |
|
|
85
|
+
| `smtp` | `{ host, port, secure?, auth? }` | SMTP config |
|
|
86
|
+
| `azure` | `{ connectionString, senderAddress }` | Azure config |
|
|
87
|
+
| `resend` | `{ apiKey }` | Resend config |
|
|
88
|
+
| `defaultFrom` | `string` | Default sender address |
|
|
89
|
+
| `imageCompression` | `{ enabled, maxWidth?, quality? }` | Compress inline images |
|
|
90
|
+
| `verbose` | `boolean` | Enable logging |
|
package/dist/src/email.module.js
CHANGED
|
@@ -13,6 +13,7 @@ const email_service_1 = require("./email.service");
|
|
|
13
13
|
const email_constants_1 = require("./email.constants");
|
|
14
14
|
const smtp_provider_1 = require("./providers/smtp.provider");
|
|
15
15
|
const azure_provider_1 = require("./providers/azure.provider");
|
|
16
|
+
const resend_provider_1 = require("./providers/resend.provider");
|
|
16
17
|
function createEmailProvider(options) {
|
|
17
18
|
const providerOptions = {
|
|
18
19
|
defaultFrom: options.defaultFrom,
|
|
@@ -31,6 +32,12 @@ function createEmailProvider(options) {
|
|
|
31
32
|
}
|
|
32
33
|
return new azure_provider_1.AzureEmailProvider(options.azure, providerOptions);
|
|
33
34
|
}
|
|
35
|
+
if (options.provider === 'resend') {
|
|
36
|
+
if (!options.resend) {
|
|
37
|
+
throw new Error('Resend configuration is required when provider is "resend"');
|
|
38
|
+
}
|
|
39
|
+
return new resend_provider_1.ResendEmailProvider(options.resend, providerOptions);
|
|
40
|
+
}
|
|
34
41
|
throw new Error(`Unknown email provider: ${options.provider}`);
|
|
35
42
|
}
|
|
36
43
|
let EmailModule = EmailModule_1 = class EmailModule {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"email.module.js","sourceRoot":"","sources":["../../src/email.module.ts"],"names":[],"mappings":";;;;;;;;;;AAAA,2CAAyE;AAOzE,mDAA+C;AAC/C,uDAAyE;AACzE,6DAA8D;AAC9D,+DAAgE;
|
|
1
|
+
{"version":3,"file":"email.module.js","sourceRoot":"","sources":["../../src/email.module.ts"],"names":[],"mappings":"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"}
|
|
@@ -16,6 +16,8 @@ exports.EmailService = void 0;
|
|
|
16
16
|
const common_1 = require("@nestjs/common");
|
|
17
17
|
const email_constants_1 = require("./email.constants");
|
|
18
18
|
let EmailService = class EmailService {
|
|
19
|
+
options;
|
|
20
|
+
provider;
|
|
19
21
|
constructor(options, provider) {
|
|
20
22
|
this.options = options;
|
|
21
23
|
this.provider = provider;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"email.service.js","sourceRoot":"","sources":["../../src/email.service.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,2CAAkF;AAQlF,uDAAyE;AAMlE,IAAM,YAAY,GAAlB,MAAM,YAAY;
|
|
1
|
+
{"version":3,"file":"email.service.js","sourceRoot":"","sources":["../../src/email.service.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,2CAAkF;AAQlF,uDAAyE;AAMlE,IAAM,YAAY,GAAlB,MAAM,YAAY;IAGJ;IAEA;IAJnB,YAEmB,OAA2B,EAE3B,QAAuB;QAFvB,YAAO,GAAP,OAAO,CAAoB;QAE3B,aAAQ,GAAR,QAAQ,CAAe;IACvC,CAAC;IAUJ,KAAK,CAAC,SAAS,CACb,EAAqB,EACrB,OAAe,EACf,IAAY,EACZ,WAA+B;QAE/B,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC;YAC3C,EAAE;YACF,OAAO;YACP,IAAI,EAAE,IAAI;YACV,WAAW;SACZ,CAAC,CAAC;QAEH,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YACpB,MAAM,IAAI,qCAA4B,CACpC,MAAM,CAAC,KAAK,EAAE,OAAO,IAAI,sBAAsB,CAChD,CAAC;QACJ,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;IAOD,KAAK,CAAC,IAAI,CAAC,OAAyB;QAClC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;QAEtD,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YACpB,MAAM,IAAI,qCAA4B,CACpC,MAAM,CAAC,KAAK,EAAE,OAAO,IAAI,sBAAsB,CAChD,CAAC;QACJ,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;IAOD,KAAK,CAAC,OAAO,CAAC,OAAyB;QACrC,OAAO,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;IAC1C,CAAC;IAKD,OAAO;QACL,OAAO,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC;IACjC,CAAC;IAKD,eAAe;QACb,OAAO,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC;IAC/B,CAAC;CACF,CAAA;AA7EY,oCAAY;uBAAZ,YAAY;IADxB,IAAA,mBAAU,GAAE;IAGR,WAAA,IAAA,eAAM,EAAC,sCAAoB,CAAC,CAAA;IAE5B,WAAA,IAAA,eAAM,EAAC,gCAAc,CAAC,CAAA;;GAJd,YAAY,CA6ExB"}
|
package/dist/src/index.d.ts
CHANGED
package/dist/src/index.js
CHANGED
|
@@ -21,4 +21,5 @@ __exportStar(require("./template.service"), exports);
|
|
|
21
21
|
__exportStar(require("./interfaces/email.interfaces"), exports);
|
|
22
22
|
__exportStar(require("./providers/smtp.provider"), exports);
|
|
23
23
|
__exportStar(require("./providers/azure.provider"), exports);
|
|
24
|
+
__exportStar(require("./providers/resend.provider"), exports);
|
|
24
25
|
//# sourceMappingURL=index.js.map
|
package/dist/src/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AACA,iDAA+B;AAC/B,kDAAgC;AAChC,oDAAkC;AAClC,qDAAmC;AAGnC,gEAA8C;AAG9C,4DAA0C;AAC1C,6DAA2C"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AACA,iDAA+B;AAC/B,kDAAgC;AAChC,oDAAkC;AAClC,qDAAmC;AAGnC,gEAA8C;AAG9C,4DAA0C;AAC1C,6DAA2C;AAC3C,8DAA4C"}
|
|
@@ -40,16 +40,20 @@ export interface AzureEmailConfig {
|
|
|
40
40
|
connectionString: string;
|
|
41
41
|
senderAddress: string;
|
|
42
42
|
}
|
|
43
|
+
export interface ResendEmailConfig {
|
|
44
|
+
apiKey: string;
|
|
45
|
+
}
|
|
43
46
|
export interface ImageCompressionOptions {
|
|
44
47
|
enabled: boolean;
|
|
45
48
|
maxWidth?: number;
|
|
46
49
|
quality?: number;
|
|
47
50
|
}
|
|
48
|
-
export type EmailProviderType = 'smtp' | 'azure';
|
|
51
|
+
export type EmailProviderType = 'smtp' | 'azure' | 'resend';
|
|
49
52
|
export interface EmailModuleOptions {
|
|
50
53
|
provider: EmailProviderType;
|
|
51
54
|
smtp?: SmtpTransportConfig;
|
|
52
55
|
azure?: AzureEmailConfig;
|
|
56
|
+
resend?: ResendEmailConfig;
|
|
53
57
|
defaultFrom?: string;
|
|
54
58
|
imageCompression?: ImageCompressionOptions;
|
|
55
59
|
verbose?: boolean;
|
|
@@ -35,8 +35,12 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
35
35
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
36
|
exports.AzureEmailProvider = void 0;
|
|
37
37
|
class AzureEmailProvider {
|
|
38
|
+
emailClient;
|
|
39
|
+
senderAddress;
|
|
40
|
+
ready = false;
|
|
41
|
+
imageCompression;
|
|
42
|
+
verbose;
|
|
38
43
|
constructor(config, options) {
|
|
39
|
-
this.ready = false;
|
|
40
44
|
this.senderAddress = config.senderAddress;
|
|
41
45
|
this.imageCompression = options?.imageCompression;
|
|
42
46
|
this.verbose = options?.verbose ?? false;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"azure.provider.js","sourceRoot":"","sources":["../../../src/providers/azure.provider.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAYA,MAAa,kBAAkB;
|
|
1
|
+
{"version":3,"file":"azure.provider.js","sourceRoot":"","sources":["../../../src/providers/azure.provider.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const azure_provider_1 = require("./azure.provider");
|
|
4
|
+
describe('AzureEmailProvider Integration', () => {
|
|
5
|
+
let provider;
|
|
6
|
+
const config = {
|
|
7
|
+
connectionString: process.env.AZURE_EMAIL_CONNECTION_STRING || '',
|
|
8
|
+
senderAddress: process.env.AZURE_EMAIL_SENDER || '',
|
|
9
|
+
};
|
|
10
|
+
const testRecipient = process.env.TEST_EMAIL_TO || 'test@example.com';
|
|
11
|
+
beforeAll(async () => {
|
|
12
|
+
if (!config.connectionString) {
|
|
13
|
+
throw new Error('Azure connection string is required (AZURE_EMAIL_CONNECTION_STRING)');
|
|
14
|
+
}
|
|
15
|
+
if (!config.senderAddress) {
|
|
16
|
+
throw new Error('Azure sender address is required (AZURE_EMAIL_SENDER)');
|
|
17
|
+
}
|
|
18
|
+
provider = new azure_provider_1.AzureEmailProvider(config, {
|
|
19
|
+
verbose: true,
|
|
20
|
+
});
|
|
21
|
+
await new Promise((resolve) => setTimeout(resolve, 500));
|
|
22
|
+
});
|
|
23
|
+
it('should initialize successfully', () => {
|
|
24
|
+
expect(provider.isReady()).toBe(true);
|
|
25
|
+
});
|
|
26
|
+
it('should send a simple email', async () => {
|
|
27
|
+
const result = await provider.sendEmail({
|
|
28
|
+
to: testRecipient,
|
|
29
|
+
subject: `[Azure Test] Simple Email - ${new Date().toISOString()}`,
|
|
30
|
+
html: '<h1>Test Email</h1><p>This is a test email sent via Azure Communication Service.</p>',
|
|
31
|
+
text: 'Test Email\n\nThis is a test email sent via Azure Communication Service.',
|
|
32
|
+
});
|
|
33
|
+
expect(result.success).toBe(true);
|
|
34
|
+
expect(result.messageId).toBeDefined();
|
|
35
|
+
console.log('Message ID:', result.messageId);
|
|
36
|
+
}, 30000);
|
|
37
|
+
it('should send email with custom from address', async () => {
|
|
38
|
+
const result = await provider.sendEmail({
|
|
39
|
+
to: testRecipient,
|
|
40
|
+
from: config.senderAddress,
|
|
41
|
+
subject: `[Azure Test] Custom From - ${new Date().toISOString()}`,
|
|
42
|
+
html: '<p>Email with custom from address.</p>',
|
|
43
|
+
});
|
|
44
|
+
expect(result.success).toBe(true);
|
|
45
|
+
expect(result.messageId).toBeDefined();
|
|
46
|
+
}, 30000);
|
|
47
|
+
it('should send email with cc', async () => {
|
|
48
|
+
const result = await provider.sendEmail({
|
|
49
|
+
to: testRecipient,
|
|
50
|
+
cc: testRecipient,
|
|
51
|
+
subject: `[Azure Test] CC Test - ${new Date().toISOString()}`,
|
|
52
|
+
html: '<p>Email with CC recipient.</p>',
|
|
53
|
+
});
|
|
54
|
+
expect(result.success).toBe(true);
|
|
55
|
+
expect(result.messageId).toBeDefined();
|
|
56
|
+
}, 30000);
|
|
57
|
+
it('should send email with replyTo', async () => {
|
|
58
|
+
const result = await provider.sendEmail({
|
|
59
|
+
to: testRecipient,
|
|
60
|
+
replyTo: testRecipient,
|
|
61
|
+
subject: `[Azure Test] Reply-To Test - ${new Date().toISOString()}`,
|
|
62
|
+
html: '<p>Email with reply-to address.</p>',
|
|
63
|
+
});
|
|
64
|
+
expect(result.success).toBe(true);
|
|
65
|
+
expect(result.messageId).toBeDefined();
|
|
66
|
+
}, 30000);
|
|
67
|
+
it('should send email with attachment', async () => {
|
|
68
|
+
const result = await provider.sendEmail({
|
|
69
|
+
to: testRecipient,
|
|
70
|
+
subject: `[Azure Test] Attachment Test - ${new Date().toISOString()}`,
|
|
71
|
+
html: '<p>Email with attachment.</p>',
|
|
72
|
+
attachments: [
|
|
73
|
+
{
|
|
74
|
+
filename: 'test.txt',
|
|
75
|
+
content: Buffer.from('This is a test attachment content.'),
|
|
76
|
+
contentType: 'text/plain',
|
|
77
|
+
},
|
|
78
|
+
],
|
|
79
|
+
});
|
|
80
|
+
expect(result.success).toBe(true);
|
|
81
|
+
expect(result.messageId).toBeDefined();
|
|
82
|
+
}, 30000);
|
|
83
|
+
});
|
|
84
|
+
//# sourceMappingURL=azure.provider.spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"azure.provider.spec.js","sourceRoot":"","sources":["../../../src/providers/azure.provider.spec.ts"],"names":[],"mappings":"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"}
|
|
@@ -16,4 +16,5 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
|
16
16
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
17
|
__exportStar(require("./smtp.provider"), exports);
|
|
18
18
|
__exportStar(require("./azure.provider"), exports);
|
|
19
|
+
__exportStar(require("./resend.provider"), exports);
|
|
19
20
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/providers/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,kDAAgC;AAChC,mDAAiC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/providers/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,kDAAgC;AAChC,mDAAiC;AACjC,oDAAkC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { EmailProvider, SendEmailOptions, SendEmailResult, ResendEmailConfig, ImageCompressionOptions } from '../interfaces/email.interfaces';
|
|
2
|
+
export declare class ResendEmailProvider implements EmailProvider {
|
|
3
|
+
private resendClient;
|
|
4
|
+
private ready;
|
|
5
|
+
private defaultFrom?;
|
|
6
|
+
private imageCompression?;
|
|
7
|
+
private verbose;
|
|
8
|
+
constructor(config: ResendEmailConfig, options?: {
|
|
9
|
+
defaultFrom?: string;
|
|
10
|
+
imageCompression?: ImageCompressionOptions;
|
|
11
|
+
verbose?: boolean;
|
|
12
|
+
});
|
|
13
|
+
private initializeClient;
|
|
14
|
+
private compressAttachment;
|
|
15
|
+
sendEmail(options: SendEmailOptions): Promise<SendEmailResult>;
|
|
16
|
+
isReady(): boolean;
|
|
17
|
+
}
|
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.ResendEmailProvider = void 0;
|
|
37
|
+
class ResendEmailProvider {
|
|
38
|
+
resendClient;
|
|
39
|
+
ready = false;
|
|
40
|
+
defaultFrom;
|
|
41
|
+
imageCompression;
|
|
42
|
+
verbose;
|
|
43
|
+
constructor(config, options) {
|
|
44
|
+
this.defaultFrom = options?.defaultFrom;
|
|
45
|
+
this.imageCompression = options?.imageCompression;
|
|
46
|
+
this.verbose = options?.verbose ?? false;
|
|
47
|
+
this.initializeClient(config.apiKey);
|
|
48
|
+
}
|
|
49
|
+
async initializeClient(apiKey) {
|
|
50
|
+
try {
|
|
51
|
+
const { Resend } = await Promise.resolve().then(() => __importStar(require('resend')));
|
|
52
|
+
this.resendClient = new Resend(apiKey);
|
|
53
|
+
this.ready = true;
|
|
54
|
+
if (this.verbose) {
|
|
55
|
+
console.log('[EmailModule] Resend provider initialized');
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
catch (error) {
|
|
59
|
+
console.error('[EmailModule] Failed to initialize Resend provider:', error);
|
|
60
|
+
throw new Error('Failed to initialize Resend provider. Make sure resend is installed.');
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
async compressAttachment(attachment) {
|
|
64
|
+
if (!this.imageCompression?.enabled) {
|
|
65
|
+
return attachment;
|
|
66
|
+
}
|
|
67
|
+
if (!attachment.contentType?.startsWith('image/')) {
|
|
68
|
+
return attachment;
|
|
69
|
+
}
|
|
70
|
+
try {
|
|
71
|
+
const sharp = (await Promise.resolve().then(() => __importStar(require('sharp')))).default;
|
|
72
|
+
const buffer = attachment.content instanceof Buffer
|
|
73
|
+
? attachment.content
|
|
74
|
+
: Buffer.from(attachment.content, 'base64');
|
|
75
|
+
const compressedBuffer = await sharp(buffer)
|
|
76
|
+
.resize({
|
|
77
|
+
width: this.imageCompression.maxWidth ?? 1200,
|
|
78
|
+
withoutEnlargement: true,
|
|
79
|
+
})
|
|
80
|
+
.jpeg({ quality: this.imageCompression.quality ?? 75 })
|
|
81
|
+
.toBuffer();
|
|
82
|
+
return {
|
|
83
|
+
...attachment,
|
|
84
|
+
content: compressedBuffer,
|
|
85
|
+
contentType: 'image/jpeg',
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
catch (error) {
|
|
89
|
+
if (this.verbose) {
|
|
90
|
+
console.warn(`[EmailModule] Failed to compress ${attachment.filename}, sending original.`);
|
|
91
|
+
}
|
|
92
|
+
return attachment;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
async sendEmail(options) {
|
|
96
|
+
if (!this.resendClient) {
|
|
97
|
+
return {
|
|
98
|
+
success: false,
|
|
99
|
+
error: new Error('Resend client not initialized'),
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
try {
|
|
103
|
+
let processedAttachments = [];
|
|
104
|
+
if (options.attachments?.length) {
|
|
105
|
+
processedAttachments = await Promise.all(options.attachments.map((att) => this.compressAttachment(att)));
|
|
106
|
+
}
|
|
107
|
+
if (processedAttachments.length > 0) {
|
|
108
|
+
const totalSize = processedAttachments.reduce((acc, att) => {
|
|
109
|
+
const size = att.content instanceof Buffer
|
|
110
|
+
? att.content.length
|
|
111
|
+
: Buffer.byteLength(att.content, 'base64');
|
|
112
|
+
return acc + size;
|
|
113
|
+
}, 0);
|
|
114
|
+
if (totalSize > 40 * 1024 * 1024) {
|
|
115
|
+
return {
|
|
116
|
+
success: false,
|
|
117
|
+
error: new Error('Attachments exceed Resend 40MB email size limit'),
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
const emailOptions = {
|
|
122
|
+
from: options.from ?? this.defaultFrom,
|
|
123
|
+
to: Array.isArray(options.to) ? options.to : [options.to],
|
|
124
|
+
subject: options.subject,
|
|
125
|
+
};
|
|
126
|
+
if (options.html) {
|
|
127
|
+
emailOptions.html = options.html;
|
|
128
|
+
}
|
|
129
|
+
if (options.text) {
|
|
130
|
+
emailOptions.text = options.text;
|
|
131
|
+
}
|
|
132
|
+
if (options.cc) {
|
|
133
|
+
emailOptions.cc = Array.isArray(options.cc) ? options.cc : [options.cc];
|
|
134
|
+
}
|
|
135
|
+
if (options.bcc) {
|
|
136
|
+
emailOptions.bcc = Array.isArray(options.bcc) ? options.bcc : [options.bcc];
|
|
137
|
+
}
|
|
138
|
+
if (options.replyTo) {
|
|
139
|
+
emailOptions.replyTo = options.replyTo;
|
|
140
|
+
}
|
|
141
|
+
if (processedAttachments.length > 0) {
|
|
142
|
+
emailOptions.attachments = processedAttachments.map((att) => ({
|
|
143
|
+
filename: att.filename,
|
|
144
|
+
content: att.content instanceof Buffer
|
|
145
|
+
? att.content
|
|
146
|
+
: Buffer.from(att.content, 'base64'),
|
|
147
|
+
}));
|
|
148
|
+
}
|
|
149
|
+
const { data, error } = await this.resendClient.emails.send(emailOptions);
|
|
150
|
+
if (error) {
|
|
151
|
+
console.error('[EmailModule] Resend send error:', error);
|
|
152
|
+
return {
|
|
153
|
+
success: false,
|
|
154
|
+
error: new Error(error.message || 'Resend send failed'),
|
|
155
|
+
};
|
|
156
|
+
}
|
|
157
|
+
if (this.verbose) {
|
|
158
|
+
console.log(`[EmailModule] Email sent successfully via Resend to ${options.to}`);
|
|
159
|
+
}
|
|
160
|
+
return {
|
|
161
|
+
success: true,
|
|
162
|
+
messageId: data?.id,
|
|
163
|
+
};
|
|
164
|
+
}
|
|
165
|
+
catch (error) {
|
|
166
|
+
console.error('[EmailModule] Resend send error:', error);
|
|
167
|
+
return {
|
|
168
|
+
success: false,
|
|
169
|
+
error: error instanceof Error ? error : new Error(String(error)),
|
|
170
|
+
};
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
isReady() {
|
|
174
|
+
return this.ready;
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
exports.ResendEmailProvider = ResendEmailProvider;
|
|
178
|
+
//# sourceMappingURL=resend.provider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resend.provider.js","sourceRoot":"","sources":["../../../src/providers/resend.provider.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|