@bernierllc/email-sender 2.0.2 → 3.0.5
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 +138 -0
- package/dist/core/email-safety-manager.d.ts +30 -0
- package/dist/core/email-safety-manager.d.ts.map +1 -0
- package/dist/core/email-safety-manager.js +106 -0
- package/dist/core/email-safety-manager.js.map +1 -0
- package/dist/core/email-sender.d.ts +23 -5
- package/dist/core/email-sender.d.ts.map +1 -1
- package/dist/core/email-sender.js +55 -2
- package/dist/core/email-sender.js.map +1 -1
- package/dist/index.d.ts +5 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +9 -1
- package/dist/index.js.map +1 -1
- package/dist/providers/sendgrid/client.d.ts +26 -0
- package/dist/providers/sendgrid/client.d.ts.map +1 -0
- package/dist/providers/sendgrid/client.js +71 -0
- package/dist/providers/sendgrid/client.js.map +1 -0
- package/dist/providers/sendgrid/converters.d.ts +19 -0
- package/dist/providers/sendgrid/converters.d.ts.map +1 -0
- package/dist/providers/sendgrid/converters.js +54 -0
- package/dist/providers/sendgrid/converters.js.map +1 -0
- package/dist/providers/sendgrid/errors.d.ts +23 -0
- package/dist/providers/sendgrid/errors.d.ts.map +1 -0
- package/dist/providers/sendgrid/errors.js +53 -0
- package/dist/providers/sendgrid/errors.js.map +1 -0
- package/dist/providers/sendgrid/index.d.ts +13 -0
- package/dist/providers/sendgrid/index.d.ts.map +1 -0
- package/dist/providers/sendgrid/index.js +39 -0
- package/dist/providers/sendgrid/index.js.map +1 -0
- package/dist/providers/sendgrid/rate-limiter.d.ts +18 -0
- package/dist/providers/sendgrid/rate-limiter.d.ts.map +1 -0
- package/dist/providers/sendgrid/rate-limiter.js +69 -0
- package/dist/providers/sendgrid/rate-limiter.js.map +1 -0
- package/dist/providers/sendgrid/safety.d.ts +32 -0
- package/dist/providers/sendgrid/safety.d.ts.map +1 -0
- package/dist/providers/sendgrid/safety.js +82 -0
- package/dist/providers/sendgrid/safety.js.map +1 -0
- package/dist/providers/sendgrid/sender-manager.d.ts +25 -0
- package/dist/providers/sendgrid/sender-manager.d.ts.map +1 -0
- package/dist/providers/sendgrid/sender-manager.js +126 -0
- package/dist/providers/sendgrid/sender-manager.js.map +1 -0
- package/dist/providers/sendgrid/template-manager.d.ts +29 -0
- package/dist/providers/sendgrid/template-manager.d.ts.map +1 -0
- package/dist/providers/sendgrid/template-manager.js +153 -0
- package/dist/providers/sendgrid/template-manager.js.map +1 -0
- package/dist/providers/sendgrid/types.d.ts +136 -0
- package/dist/providers/sendgrid/types.d.ts.map +1 -0
- package/dist/providers/sendgrid/types.js +10 -0
- package/dist/providers/sendgrid/types.js.map +1 -0
- package/dist/providers/sendgrid.d.ts +63 -2
- package/dist/providers/sendgrid.d.ts.map +1 -1
- package/dist/providers/sendgrid.js +145 -1
- package/dist/providers/sendgrid.js.map +1 -1
- package/dist/types/index.d.ts +15 -0
- package/dist/types/index.d.ts.map +1 -1
- package/package.json +12 -3
package/README.md
CHANGED
|
@@ -5,6 +5,7 @@ A core utility for basic email sending with provider-agnostic interface.
|
|
|
5
5
|
## Features
|
|
6
6
|
|
|
7
7
|
- **Provider-Agnostic**: Support for multiple email providers (SMTP, SendGrid, SES, Mailgun, Postmark)
|
|
8
|
+
- **Staging Email Safety**: Prevent accidental email sends in non-production environments
|
|
8
9
|
- **TypeScript**: Full TypeScript support with strict typing
|
|
9
10
|
- **Validation**: Comprehensive email and configuration validation
|
|
10
11
|
- **Attachments**: Support for file attachments
|
|
@@ -280,6 +281,143 @@ interface EmailProviderConfig {
|
|
|
280
281
|
}
|
|
281
282
|
```
|
|
282
283
|
|
|
284
|
+
## Staging Email Safety
|
|
285
|
+
|
|
286
|
+
Prevent accidental email sends in non-production environments by using the staging safety feature.
|
|
287
|
+
|
|
288
|
+
### Staging with Whitelist (Block Non-Whitelisted)
|
|
289
|
+
|
|
290
|
+
```typescript
|
|
291
|
+
import { EmailSender } from '@bernierllc/email-sender';
|
|
292
|
+
|
|
293
|
+
const emailSender = new EmailSender({
|
|
294
|
+
provider: 'smtp' as const,
|
|
295
|
+
host: 'smtp.example.com',
|
|
296
|
+
port: 587,
|
|
297
|
+
username: 'user',
|
|
298
|
+
password: 'pass',
|
|
299
|
+
fromEmail: 'sender@example.com',
|
|
300
|
+
stagingSafety: {
|
|
301
|
+
enabled: true,
|
|
302
|
+
environment: 'staging',
|
|
303
|
+
whitelist: ['test@example.com', 'admin@example.com', 'qa@example.com'],
|
|
304
|
+
blockNonWhitelisted: true,
|
|
305
|
+
logBlocked: true,
|
|
306
|
+
},
|
|
307
|
+
});
|
|
308
|
+
|
|
309
|
+
// This will send (whitelisted)
|
|
310
|
+
await emailSender.sendEmail({
|
|
311
|
+
toEmail: 'test@example.com',
|
|
312
|
+
subject: 'Test Email',
|
|
313
|
+
htmlContent: '<p>This email will be sent</p>',
|
|
314
|
+
});
|
|
315
|
+
|
|
316
|
+
// This will be blocked (not whitelisted)
|
|
317
|
+
const result = await emailSender.sendEmail({
|
|
318
|
+
toEmail: 'customer@example.com',
|
|
319
|
+
subject: 'Test Email',
|
|
320
|
+
htmlContent: '<p>This email will be blocked</p>',
|
|
321
|
+
});
|
|
322
|
+
console.log(result.success); // false
|
|
323
|
+
console.log(result.errorMessage); // "Email blocked by safety manager: ..."
|
|
324
|
+
```
|
|
325
|
+
|
|
326
|
+
### Staging with Rewrite (Redirect to Test Email)
|
|
327
|
+
|
|
328
|
+
```typescript
|
|
329
|
+
const emailSender = new EmailSender({
|
|
330
|
+
provider: 'smtp' as const,
|
|
331
|
+
host: 'smtp.example.com',
|
|
332
|
+
port: 587,
|
|
333
|
+
username: 'user',
|
|
334
|
+
password: 'pass',
|
|
335
|
+
fromEmail: 'sender@example.com',
|
|
336
|
+
stagingSafety: {
|
|
337
|
+
enabled: true,
|
|
338
|
+
environment: 'staging',
|
|
339
|
+
whitelist: ['admin@example.com'], // Admin emails go through normally
|
|
340
|
+
rewriteTo: 'staging-test@example.com', // All other emails redirected here
|
|
341
|
+
blockNonWhitelisted: false,
|
|
342
|
+
logBlocked: true,
|
|
343
|
+
},
|
|
344
|
+
});
|
|
345
|
+
|
|
346
|
+
// This will be sent to staging-test@example.com instead
|
|
347
|
+
await emailSender.sendEmail({
|
|
348
|
+
toEmail: 'customer@example.com',
|
|
349
|
+
subject: 'Test Email',
|
|
350
|
+
htmlContent: '<p>This will be sent to staging-test@example.com</p>',
|
|
351
|
+
});
|
|
352
|
+
```
|
|
353
|
+
|
|
354
|
+
### Production (All Emails Allowed)
|
|
355
|
+
|
|
356
|
+
```typescript
|
|
357
|
+
const emailSender = new EmailSender({
|
|
358
|
+
provider: 'smtp' as const,
|
|
359
|
+
host: 'smtp.example.com',
|
|
360
|
+
port: 587,
|
|
361
|
+
username: 'user',
|
|
362
|
+
password: 'pass',
|
|
363
|
+
fromEmail: 'sender@example.com',
|
|
364
|
+
stagingSafety: {
|
|
365
|
+
enabled: true,
|
|
366
|
+
environment: 'production',
|
|
367
|
+
whitelist: [], // Not used in production
|
|
368
|
+
blockNonWhitelisted: false,
|
|
369
|
+
logBlocked: false,
|
|
370
|
+
},
|
|
371
|
+
});
|
|
372
|
+
|
|
373
|
+
// All emails are allowed in production
|
|
374
|
+
await emailSender.sendEmail({
|
|
375
|
+
toEmail: 'customer@example.com',
|
|
376
|
+
subject: 'Production Email',
|
|
377
|
+
htmlContent: '<p>This email will be sent</p>',
|
|
378
|
+
});
|
|
379
|
+
```
|
|
380
|
+
|
|
381
|
+
### Check Recipient Safety Before Sending
|
|
382
|
+
|
|
383
|
+
```typescript
|
|
384
|
+
const safetyResult = emailSender.checkRecipientSafety('test@example.com');
|
|
385
|
+
console.log('Safety check result:', safetyResult);
|
|
386
|
+
|
|
387
|
+
if (safetyResult && !safetyResult.allowed) {
|
|
388
|
+
console.log('Email would be blocked:', safetyResult.reason);
|
|
389
|
+
}
|
|
390
|
+
```
|
|
391
|
+
|
|
392
|
+
### Dynamic Configuration Based on Environment
|
|
393
|
+
|
|
394
|
+
```typescript
|
|
395
|
+
const environment = process.env.NODE_ENV || 'development';
|
|
396
|
+
|
|
397
|
+
const emailSender = new EmailSender({
|
|
398
|
+
provider: 'smtp' as const,
|
|
399
|
+
host: 'smtp.example.com',
|
|
400
|
+
port: 587,
|
|
401
|
+
username: 'user',
|
|
402
|
+
password: 'pass',
|
|
403
|
+
fromEmail: 'sender@example.com',
|
|
404
|
+
stagingSafety: {
|
|
405
|
+
enabled: environment !== 'production',
|
|
406
|
+
environment: environment as 'development' | 'staging' | 'production',
|
|
407
|
+
whitelist: environment === 'staging'
|
|
408
|
+
? ['qa@example.com', 'test@example.com']
|
|
409
|
+
: [],
|
|
410
|
+
rewriteTo: environment === 'development' ? 'dev@example.com' : undefined,
|
|
411
|
+
blockNonWhitelisted: environment === 'staging',
|
|
412
|
+
logBlocked: true,
|
|
413
|
+
},
|
|
414
|
+
});
|
|
415
|
+
|
|
416
|
+
console.log('Current environment:', environment);
|
|
417
|
+
console.log('Safety enabled:', emailSender.isSafetyEnabled());
|
|
418
|
+
console.log('Safety config:', emailSender.getSafetyConfig());
|
|
419
|
+
```
|
|
420
|
+
|
|
283
421
|
## Examples
|
|
284
422
|
|
|
285
423
|
### Send Email with Attachment
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Email Safety Manager - Staging Email Safety
|
|
3
|
+
* Prevents accidental email sends in non-production environments
|
|
4
|
+
*/
|
|
5
|
+
import { StagingSafetyConfig, EmailSafetyResult } from '../types';
|
|
6
|
+
export declare class EmailSafetyManager {
|
|
7
|
+
private config;
|
|
8
|
+
constructor(config: StagingSafetyConfig);
|
|
9
|
+
/**
|
|
10
|
+
* Check if a recipient is allowed to receive emails
|
|
11
|
+
*/
|
|
12
|
+
checkRecipient(email: string): EmailSafetyResult;
|
|
13
|
+
/**
|
|
14
|
+
* Check if an email address is whitelisted
|
|
15
|
+
*/
|
|
16
|
+
isWhitelisted(email: string): boolean;
|
|
17
|
+
/**
|
|
18
|
+
* Rewrite a recipient email address
|
|
19
|
+
*/
|
|
20
|
+
rewriteRecipient(email: string): string;
|
|
21
|
+
/**
|
|
22
|
+
* Update the safety configuration
|
|
23
|
+
*/
|
|
24
|
+
updateConfig(config: Partial<StagingSafetyConfig>): void;
|
|
25
|
+
/**
|
|
26
|
+
* Get the current configuration
|
|
27
|
+
*/
|
|
28
|
+
getConfig(): StagingSafetyConfig;
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=email-safety-manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"email-safety-manager.d.ts","sourceRoot":"","sources":["../../src/core/email-safety-manager.ts"],"names":[],"mappings":"AAQA;;;GAGG;AAEH,OAAO,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAElE,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,MAAM,CAAsB;gBAExB,MAAM,EAAE,mBAAmB;IAIvC;;OAEG;IACH,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,iBAAiB;IAkEhD;;OAEG;IACH,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;IAOrC;;OAEG;IACH,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM;IAOvC;;OAEG;IACH,YAAY,CAAC,MAAM,EAAE,OAAO,CAAC,mBAAmB,CAAC,GAAG,IAAI;IAIxD;;OAEG;IACH,SAAS,IAAI,mBAAmB;CAGjC"}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/*
|
|
3
|
+
Copyright (c) 2025 Bernier LLC
|
|
4
|
+
|
|
5
|
+
This file is licensed to the client under a limited-use license.
|
|
6
|
+
The client may use and modify this code *only within the scope of the project it was delivered for*.
|
|
7
|
+
Redistribution or use in other products or commercial offerings is not permitted without written consent from Bernier LLC.
|
|
8
|
+
*/
|
|
9
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
+
exports.EmailSafetyManager = void 0;
|
|
11
|
+
class EmailSafetyManager {
|
|
12
|
+
constructor(config) {
|
|
13
|
+
this.config = config;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Check if a recipient is allowed to receive emails
|
|
17
|
+
*/
|
|
18
|
+
checkRecipient(email) {
|
|
19
|
+
// If safety is disabled, allow all emails
|
|
20
|
+
if (!this.config.enabled) {
|
|
21
|
+
return {
|
|
22
|
+
allowed: true,
|
|
23
|
+
originalRecipient: email,
|
|
24
|
+
finalRecipient: email,
|
|
25
|
+
action: 'sent',
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
const normalizedEmail = email.toLowerCase().trim();
|
|
29
|
+
// In production, all emails are allowed
|
|
30
|
+
if (this.config.environment === 'production') {
|
|
31
|
+
return {
|
|
32
|
+
allowed: true,
|
|
33
|
+
originalRecipient: email,
|
|
34
|
+
finalRecipient: email,
|
|
35
|
+
action: 'sent',
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
// Check if email is whitelisted
|
|
39
|
+
const isWhitelisted = this.isWhitelisted(normalizedEmail);
|
|
40
|
+
if (isWhitelisted) {
|
|
41
|
+
return {
|
|
42
|
+
allowed: true,
|
|
43
|
+
originalRecipient: email,
|
|
44
|
+
finalRecipient: email,
|
|
45
|
+
action: 'sent',
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
// If rewrite is configured, rewrite the recipient
|
|
49
|
+
if (this.config.rewriteTo) {
|
|
50
|
+
return {
|
|
51
|
+
allowed: true,
|
|
52
|
+
originalRecipient: email,
|
|
53
|
+
finalRecipient: this.config.rewriteTo,
|
|
54
|
+
action: 'rewritten',
|
|
55
|
+
reason: 'Non-production environment with rewrite enabled',
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
// If blocking is enabled, block the email
|
|
59
|
+
if (this.config.blockNonWhitelisted) {
|
|
60
|
+
return {
|
|
61
|
+
allowed: false,
|
|
62
|
+
originalRecipient: email,
|
|
63
|
+
finalRecipient: email,
|
|
64
|
+
action: 'blocked',
|
|
65
|
+
reason: 'Non-whitelisted recipient in staging environment',
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
// Default: allow but log
|
|
69
|
+
return {
|
|
70
|
+
allowed: true,
|
|
71
|
+
originalRecipient: email,
|
|
72
|
+
finalRecipient: email,
|
|
73
|
+
action: 'sent',
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Check if an email address is whitelisted
|
|
78
|
+
*/
|
|
79
|
+
isWhitelisted(email) {
|
|
80
|
+
const normalizedEmail = email.toLowerCase().trim();
|
|
81
|
+
return this.config.whitelist.some((whitelisted) => whitelisted.toLowerCase().trim() === normalizedEmail);
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Rewrite a recipient email address
|
|
85
|
+
*/
|
|
86
|
+
rewriteRecipient(email) {
|
|
87
|
+
if (!this.config.rewriteTo) {
|
|
88
|
+
return email;
|
|
89
|
+
}
|
|
90
|
+
return this.config.rewriteTo;
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Update the safety configuration
|
|
94
|
+
*/
|
|
95
|
+
updateConfig(config) {
|
|
96
|
+
this.config = { ...this.config, ...config };
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Get the current configuration
|
|
100
|
+
*/
|
|
101
|
+
getConfig() {
|
|
102
|
+
return { ...this.config };
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
exports.EmailSafetyManager = EmailSafetyManager;
|
|
106
|
+
//# sourceMappingURL=email-safety-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"email-safety-manager.js","sourceRoot":"","sources":["../../src/core/email-safety-manager.ts"],"names":[],"mappings":";AAAA;;;;;;EAME;;;AASF,MAAa,kBAAkB;IAG7B,YAAY,MAA2B;QACrC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;IAED;;OAEG;IACH,cAAc,CAAC,KAAa;QAC1B,0CAA0C;QAC1C,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YACzB,OAAO;gBACL,OAAO,EAAE,IAAI;gBACb,iBAAiB,EAAE,KAAK;gBACxB,cAAc,EAAE,KAAK;gBACrB,MAAM,EAAE,MAAM;aACf,CAAC;QACJ,CAAC;QAED,MAAM,eAAe,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,CAAC;QAEnD,wCAAwC;QACxC,IAAI,IAAI,CAAC,MAAM,CAAC,WAAW,KAAK,YAAY,EAAE,CAAC;YAC7C,OAAO;gBACL,OAAO,EAAE,IAAI;gBACb,iBAAiB,EAAE,KAAK;gBACxB,cAAc,EAAE,KAAK;gBACrB,MAAM,EAAE,MAAM;aACf,CAAC;QACJ,CAAC;QAED,gCAAgC;QAChC,MAAM,aAAa,GAAG,IAAI,CAAC,aAAa,CAAC,eAAe,CAAC,CAAC;QAE1D,IAAI,aAAa,EAAE,CAAC;YAClB,OAAO;gBACL,OAAO,EAAE,IAAI;gBACb,iBAAiB,EAAE,KAAK;gBACxB,cAAc,EAAE,KAAK;gBACrB,MAAM,EAAE,MAAM;aACf,CAAC;QACJ,CAAC;QAED,kDAAkD;QAClD,IAAI,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC;YAC1B,OAAO;gBACL,OAAO,EAAE,IAAI;gBACb,iBAAiB,EAAE,KAAK;gBACxB,cAAc,EAAE,IAAI,CAAC,MAAM,CAAC,SAAS;gBACrC,MAAM,EAAE,WAAW;gBACnB,MAAM,EAAE,iDAAiD;aAC1D,CAAC;QACJ,CAAC;QAED,0CAA0C;QAC1C,IAAI,IAAI,CAAC,MAAM,CAAC,mBAAmB,EAAE,CAAC;YACpC,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,iBAAiB,EAAE,KAAK;gBACxB,cAAc,EAAE,KAAK;gBACrB,MAAM,EAAE,SAAS;gBACjB,MAAM,EAAE,kDAAkD;aAC3D,CAAC;QACJ,CAAC;QAED,yBAAyB;QACzB,OAAO;YACL,OAAO,EAAE,IAAI;YACb,iBAAiB,EAAE,KAAK;YACxB,cAAc,EAAE,KAAK;YACrB,MAAM,EAAE,MAAM;SACf,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,aAAa,CAAC,KAAa;QACzB,MAAM,eAAe,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,CAAC;QACnD,OAAO,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,CAC/B,CAAC,WAAW,EAAE,EAAE,CAAC,WAAW,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,KAAK,eAAe,CACtE,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,gBAAgB,CAAC,KAAa;QAC5B,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC;YAC3B,OAAO,KAAK,CAAC;QACf,CAAC;QACD,OAAO,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC;IAC/B,CAAC;IAED;;OAEG;IACH,YAAY,CAAC,MAAoC;QAC/C,IAAI,CAAC,MAAM,GAAG,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE,GAAG,MAAM,EAAE,CAAC;IAC9C,CAAC;IAED;;OAEG;IACH,SAAS;QACP,OAAO,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;IAC5B,CAAC;CACF;AA7GD,gDA6GC"}
|
|
@@ -2,18 +2,24 @@
|
|
|
2
2
|
* Main EmailSender class for managing email providers
|
|
3
3
|
*/
|
|
4
4
|
import { EmailProvider, EmailProviderConfig } from '../providers/base';
|
|
5
|
-
import { EmailMessage, SendResult, DeliveryStatus, WebhookEvent, EmailProviderCapabilities, EmailValidationResult } from '../types';
|
|
5
|
+
import { EmailMessage, SendResult, DeliveryStatus, WebhookEvent, EmailProviderCapabilities, EmailValidationResult, StagingSafetyConfig, EmailSafetyResult } from '../types';
|
|
6
|
+
export interface EmailSenderConfig extends EmailProviderConfig {
|
|
7
|
+
stagingSafety?: StagingSafetyConfig;
|
|
8
|
+
}
|
|
6
9
|
export declare class EmailSender {
|
|
7
10
|
private provider;
|
|
8
|
-
|
|
11
|
+
private safetyManager?;
|
|
12
|
+
constructor(config: EmailSenderConfig);
|
|
9
13
|
/**
|
|
10
14
|
* Create the appropriate provider based on configuration
|
|
11
15
|
*/
|
|
12
16
|
private createProvider;
|
|
13
17
|
/**
|
|
14
|
-
* Send a single email
|
|
18
|
+
* Send a single email with optional safety checks
|
|
15
19
|
*/
|
|
16
|
-
sendEmail(email: EmailMessage
|
|
20
|
+
sendEmail(email: EmailMessage, options?: {
|
|
21
|
+
bypassSafety?: boolean;
|
|
22
|
+
}): Promise<SendResult>;
|
|
17
23
|
/**
|
|
18
24
|
* Send multiple emails
|
|
19
25
|
*/
|
|
@@ -66,6 +72,18 @@ export declare class EmailSender {
|
|
|
66
72
|
/**
|
|
67
73
|
* Update provider configuration
|
|
68
74
|
*/
|
|
69
|
-
updateConfig(config:
|
|
75
|
+
updateConfig(config: EmailSenderConfig): void;
|
|
76
|
+
/**
|
|
77
|
+
* Check if a recipient would be allowed by the safety manager
|
|
78
|
+
*/
|
|
79
|
+
checkRecipientSafety(email: string): EmailSafetyResult | null;
|
|
80
|
+
/**
|
|
81
|
+
* Get the current safety configuration
|
|
82
|
+
*/
|
|
83
|
+
getSafetyConfig(): StagingSafetyConfig | null;
|
|
84
|
+
/**
|
|
85
|
+
* Check if staging safety is enabled
|
|
86
|
+
*/
|
|
87
|
+
isSafetyEnabled(): boolean;
|
|
70
88
|
}
|
|
71
89
|
//# sourceMappingURL=email-sender.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"email-sender.d.ts","sourceRoot":"","sources":["../../src/core/email-sender.ts"],"names":[],"mappings":"AAQA;;GAEG;AAEH,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"email-sender.d.ts","sourceRoot":"","sources":["../../src/core/email-sender.ts"],"names":[],"mappings":"AAQA;;GAEG;AAEH,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAOvE,OAAO,EACL,YAAY,EACZ,UAAU,EACV,cAAc,EACd,YAAY,EACZ,yBAAyB,EACzB,qBAAqB,EACrB,mBAAmB,EACnB,iBAAiB,EAClB,MAAM,UAAU,CAAC;AAElB,MAAM,WAAW,iBAAkB,SAAQ,mBAAmB;IAC5D,aAAa,CAAC,EAAE,mBAAmB,CAAC;CACrC;AAED,qBAAa,WAAW;IACtB,OAAO,CAAC,QAAQ,CAAgB;IAChC,OAAO,CAAC,aAAa,CAAC,CAAqB;gBAE/B,MAAM,EAAE,iBAAiB;IASrC;;OAEG;IACH,OAAO,CAAC,cAAc;IAiBtB;;OAEG;IACG,SAAS,CAAC,KAAK,EAAE,YAAY,EAAE,OAAO,CAAC,EAAE;QAAE,YAAY,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,OAAO,CAAC,UAAU,CAAC;IAsB/F;;OAEG;IACG,SAAS,CAAC,MAAM,EAAE,YAAY,EAAE,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;IAI9D;;OAEG;IACG,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC;IAI1E;;OAEG;IACG,cAAc,CAAC,OAAO,EAAE,GAAG,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IAI9E;;OAEG;IACH,qBAAqB,IAAI,qBAAqB;IAI9C;;OAEG;IACH,eAAe,IAAI,MAAM;IAIzB;;OAEG;IACH,eAAe,IAAI,yBAAyB;IAI5C;;OAEG;IACG,cAAc,IAAI,OAAO,CAAC,OAAO,CAAC;IAIxC;;OAEG;IACH,oBAAoB,CAAC,KAAK,EAAE,YAAY,GAAG,qBAAqB;IAIhE;;OAEG;IACG,cAAc,CAAC,YAAY,EAAE;QACjC,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,EAAE,MAAM,CAAC;QAChB,WAAW,EAAE,MAAM,CAAC;QACpB,WAAW,CAAC,EAAE,MAAM,CAAC;KACtB,GAAG,OAAO,CAAC,MAAM,CAAC;IAOnB;;OAEG;IACG,iBAAiB,CACrB,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,MAAM,EACf,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EACjC,MAAM,CAAC,EAAE,MAAM,GACd,OAAO,CAAC,UAAU,CAAC;IAOtB;;OAEG;IACH,WAAW,IAAI,aAAa;IAI5B;;OAEG;IACH,YAAY,CAAC,MAAM,EAAE,iBAAiB,GAAG,IAAI;IAa7C;;OAEG;IACH,oBAAoB,CAAC,KAAK,EAAE,MAAM,GAAG,iBAAiB,GAAG,IAAI;IAO7D;;OAEG;IACH,eAAe,IAAI,mBAAmB,GAAG,IAAI;IAO7C;;OAEG;IACH,eAAe,IAAI,OAAO;CAG3B"}
|
|
@@ -13,9 +13,14 @@ const sendgrid_1 = require("../providers/sendgrid");
|
|
|
13
13
|
const ses_1 = require("../providers/ses");
|
|
14
14
|
const mailgun_1 = require("../providers/mailgun");
|
|
15
15
|
const postmark_1 = require("../providers/postmark");
|
|
16
|
+
const email_safety_manager_1 = require("./email-safety-manager");
|
|
16
17
|
class EmailSender {
|
|
17
18
|
constructor(config) {
|
|
18
19
|
this.provider = this.createProvider(config);
|
|
20
|
+
// Initialize safety manager if configured
|
|
21
|
+
if (config.stagingSafety) {
|
|
22
|
+
this.safetyManager = new email_safety_manager_1.EmailSafetyManager(config.stagingSafety);
|
|
23
|
+
}
|
|
19
24
|
}
|
|
20
25
|
/**
|
|
21
26
|
* Create the appropriate provider based on configuration
|
|
@@ -37,9 +42,24 @@ class EmailSender {
|
|
|
37
42
|
}
|
|
38
43
|
}
|
|
39
44
|
/**
|
|
40
|
-
* Send a single email
|
|
45
|
+
* Send a single email with optional safety checks
|
|
41
46
|
*/
|
|
42
|
-
async sendEmail(email) {
|
|
47
|
+
async sendEmail(email, options) {
|
|
48
|
+
// Apply staging safety if enabled
|
|
49
|
+
if (this.safetyManager && !options?.bypassSafety) {
|
|
50
|
+
const safetyResult = this.safetyManager.checkRecipient(email.toEmail);
|
|
51
|
+
if (!safetyResult.allowed) {
|
|
52
|
+
return {
|
|
53
|
+
success: false,
|
|
54
|
+
errorMessage: `Email blocked by safety manager: ${safetyResult.reason}`,
|
|
55
|
+
metadata: { safetyResult },
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
// Rewrite recipient if needed
|
|
59
|
+
if (safetyResult.action === 'rewritten') {
|
|
60
|
+
email = { ...email, toEmail: safetyResult.finalRecipient };
|
|
61
|
+
}
|
|
62
|
+
}
|
|
43
63
|
return this.provider.sendEmail(email);
|
|
44
64
|
}
|
|
45
65
|
/**
|
|
@@ -119,6 +139,39 @@ class EmailSender {
|
|
|
119
139
|
*/
|
|
120
140
|
updateConfig(config) {
|
|
121
141
|
this.provider = this.createProvider(config);
|
|
142
|
+
// Update or initialize safety manager
|
|
143
|
+
if (config.stagingSafety) {
|
|
144
|
+
if (this.safetyManager) {
|
|
145
|
+
this.safetyManager.updateConfig(config.stagingSafety);
|
|
146
|
+
}
|
|
147
|
+
else {
|
|
148
|
+
this.safetyManager = new email_safety_manager_1.EmailSafetyManager(config.stagingSafety);
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* Check if a recipient would be allowed by the safety manager
|
|
154
|
+
*/
|
|
155
|
+
checkRecipientSafety(email) {
|
|
156
|
+
if (!this.safetyManager) {
|
|
157
|
+
return null;
|
|
158
|
+
}
|
|
159
|
+
return this.safetyManager.checkRecipient(email);
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* Get the current safety configuration
|
|
163
|
+
*/
|
|
164
|
+
getSafetyConfig() {
|
|
165
|
+
if (!this.safetyManager) {
|
|
166
|
+
return null;
|
|
167
|
+
}
|
|
168
|
+
return this.safetyManager.getConfig();
|
|
169
|
+
}
|
|
170
|
+
/**
|
|
171
|
+
* Check if staging safety is enabled
|
|
172
|
+
*/
|
|
173
|
+
isSafetyEnabled() {
|
|
174
|
+
return this.safetyManager !== undefined;
|
|
122
175
|
}
|
|
123
176
|
}
|
|
124
177
|
exports.EmailSender = EmailSender;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"email-sender.js","sourceRoot":"","sources":["../../src/core/email-sender.ts"],"names":[],"mappings":";AAAA;;;;;;EAME;;;AAOF,4CAAiD;AACjD,oDAAyD;AACzD,0CAA+C;AAC/C,kDAAuD;AACvD,oDAAyD;
|
|
1
|
+
{"version":3,"file":"email-sender.js","sourceRoot":"","sources":["../../src/core/email-sender.ts"],"names":[],"mappings":";AAAA;;;;;;EAME;;;AAOF,4CAAiD;AACjD,oDAAyD;AACzD,0CAA+C;AAC/C,kDAAuD;AACvD,oDAAyD;AACzD,iEAA4D;AAgB5D,MAAa,WAAW;IAItB,YAAY,MAAyB;QACnC,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;QAE5C,0CAA0C;QAC1C,IAAI,MAAM,CAAC,aAAa,EAAE,CAAC;YACzB,IAAI,CAAC,aAAa,GAAG,IAAI,yCAAkB,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;QACpE,CAAC;IACH,CAAC;IAED;;OAEG;IACK,cAAc,CAAC,MAA2B;QAChD,QAAQ,MAAM,CAAC,QAAQ,EAAE,CAAC;YACxB,KAAK,MAAM;gBACT,OAAO,IAAI,mBAAY,CAAC,MAAM,CAAC,CAAC;YAClC,KAAK,UAAU;gBACb,OAAO,IAAI,2BAAgB,CAAC,MAAM,CAAC,CAAC;YACtC,KAAK,KAAK;gBACR,OAAO,IAAI,iBAAW,CAAC,MAAa,CAAC,CAAC;YACxC,KAAK,SAAS;gBACZ,OAAO,IAAI,yBAAe,CAAC,MAAa,CAAC,CAAC;YAC5C,KAAK,UAAU;gBACb,OAAO,IAAI,2BAAgB,CAAC,MAAa,CAAC,CAAC;YAC7C;gBACE,MAAM,IAAI,KAAK,CAAC,yBAAyB,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC;QAChE,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,SAAS,CAAC,KAAmB,EAAE,OAAoC;QACvE,kCAAkC;QAClC,IAAI,IAAI,CAAC,aAAa,IAAI,CAAC,OAAO,EAAE,YAAY,EAAE,CAAC;YACjD,MAAM,YAAY,GAAG,IAAI,CAAC,aAAa,CAAC,cAAc,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YAEtE,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,CAAC;gBAC1B,OAAO;oBACL,OAAO,EAAE,KAAK;oBACd,YAAY,EAAE,oCAAoC,YAAY,CAAC,MAAM,EAAE;oBACvE,QAAQ,EAAE,EAAE,YAAY,EAAE;iBAC3B,CAAC;YACJ,CAAC;YAED,8BAA8B;YAC9B,IAAI,YAAY,CAAC,MAAM,KAAK,WAAW,EAAE,CAAC;gBACxC,KAAK,GAAG,EAAE,GAAG,KAAK,EAAE,OAAO,EAAE,YAAY,CAAC,cAAc,EAAE,CAAC;YAC7D,CAAC;QACH,CAAC;QAED,OAAO,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IACxC,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,SAAS,CAAC,MAAsB;QACpC,OAAO,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;IACzC,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,iBAAiB,CAAC,SAAiB;QACvC,OAAO,IAAI,CAAC,QAAQ,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAC;IACpD,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,cAAc,CAAC,OAAY,EAAE,SAAiB;QAClD,OAAO,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;IAC1D,CAAC;IAED;;OAEG;IACH,qBAAqB;QACnB,OAAO,IAAI,CAAC,QAAQ,CAAC,qBAAqB,EAAE,CAAC;IAC/C,CAAC;IAED;;OAEG;IACH,eAAe;QACb,OAAO,IAAI,CAAC,QAAQ,CAAC,eAAe,EAAE,CAAC;IACzC,CAAC;IAED;;OAEG;IACH,eAAe;QACb,OAAO,IAAI,CAAC,QAAQ,CAAC,eAAe,EAAE,CAAC;IACzC,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,cAAc;QAClB,OAAO,IAAI,CAAC,QAAQ,CAAC,cAAc,EAAE,CAAC;IACxC,CAAC;IAED;;OAEG;IACH,oBAAoB,CAAC,KAAmB;QACtC,OAAO,IAAI,CAAC,QAAQ,CAAC,oBAAoB,CAAC,KAAK,CAAC,CAAC;IACnD,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,cAAc,CAAC,YAKpB;QACC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,cAAc,EAAE,CAAC;YAClC,MAAM,IAAI,KAAK,CAAC,kDAAkD,CAAC,CAAC;QACtE,CAAC;QACD,OAAO,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,YAAY,CAAC,CAAC;IACpD,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,iBAAiB,CACrB,UAAkB,EAClB,OAAe,EACf,YAAiC,EACjC,MAAe;QAEf,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,iBAAiB,EAAE,CAAC;YACrC,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAC;QACpE,CAAC;QACD,OAAO,IAAI,CAAC,QAAQ,CAAC,iBAAiB,CAAC,UAAU,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,CAAC,CAAC;IACpF,CAAC;IAED;;OAEG;IACH,WAAW;QACT,OAAO,IAAI,CAAC,QAAQ,CAAC;IACvB,CAAC;IAED;;OAEG;IACH,YAAY,CAAC,MAAyB;QACpC,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;QAE5C,sCAAsC;QACtC,IAAI,MAAM,CAAC,aAAa,EAAE,CAAC;YACzB,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;gBACvB,IAAI,CAAC,aAAa,CAAC,YAAY,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;YACxD,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC,aAAa,GAAG,IAAI,yCAAkB,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;YACpE,CAAC;QACH,CAAC;IACH,CAAC;IAED;;OAEG;IACH,oBAAoB,CAAC,KAAa;QAChC,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC;YACxB,OAAO,IAAI,CAAC;QACd,CAAC;QACD,OAAO,IAAI,CAAC,aAAa,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;IAClD,CAAC;IAED;;OAEG;IACH,eAAe;QACb,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC;YACxB,OAAO,IAAI,CAAC;QACd,CAAC;QACD,OAAO,IAAI,CAAC,aAAa,CAAC,SAAS,EAAE,CAAC;IACxC,CAAC;IAED;;OAEG;IACH,eAAe;QACb,OAAO,IAAI,CAAC,aAAa,KAAK,SAAS,CAAC;IAC1C,CAAC;CACF;AAjMD,kCAiMC"}
|
package/dist/index.d.ts
CHANGED
|
@@ -3,12 +3,15 @@
|
|
|
3
3
|
* Main entry point for the email sending system
|
|
4
4
|
*/
|
|
5
5
|
export * from './types';
|
|
6
|
-
export { EmailSender } from './core/email-sender';
|
|
6
|
+
export { EmailSender, EmailSenderConfig } from './core/email-sender';
|
|
7
|
+
export { EmailSafetyManager } from './core/email-safety-manager';
|
|
7
8
|
export { EmailProvider } from './providers/base';
|
|
8
9
|
export { SmtpProvider } from './providers/smtp';
|
|
9
10
|
export { SendGridProvider } from './providers/sendgrid';
|
|
10
11
|
export { SesProvider } from './providers/ses';
|
|
11
12
|
export { MailgunProvider } from './providers/mailgun';
|
|
12
13
|
export { PostmarkProvider } from './providers/postmark';
|
|
13
|
-
export type { EmailMessage, SendResult, DeliveryStatus, WebhookEvent, EmailProviderConfig, EmailProviderCapabilities, EmailValidationResult, EmailAttachment, BatchEmailOptions, EmailTemplate } from './types';
|
|
14
|
+
export type { EmailMessage, SendResult, DeliveryStatus, WebhookEvent, EmailProviderConfig, EmailProviderCapabilities, EmailValidationResult, EmailAttachment, BatchEmailOptions, EmailTemplate, StagingSafetyConfig, EmailSafetyResult } from './types';
|
|
15
|
+
export type { VerifiedSender, SenderValidationResult, Template, ProviderTemplate, TemplateVersion, SyncResult, TemplateAnalytics, SendGridAdvancedConfig } from './providers/sendgrid/types';
|
|
16
|
+
export { SendGridApiError, TemplateNotFoundError, UnauthorizedTemplateAccessError, TemplateConflictError, RateLimitError } from './providers/sendgrid/errors';
|
|
14
17
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAQA;;;GAGG;AAGH,cAAc,SAAS,CAAC;AAGxB,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAQA;;;GAGG;AAGH,cAAc,SAAS,CAAC;AAGxB,OAAO,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACrE,OAAO,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;AAGjE,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAChD,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAC9C,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAGxD,YAAY,EACV,YAAY,EACZ,UAAU,EACV,cAAc,EACd,YAAY,EACZ,mBAAmB,EACnB,yBAAyB,EACzB,qBAAqB,EACrB,eAAe,EACf,iBAAiB,EACjB,aAAa,EACb,mBAAmB,EACnB,iBAAiB,EAClB,MAAM,SAAS,CAAC;AAGjB,YAAY,EACV,cAAc,EACd,sBAAsB,EACtB,QAAQ,EACR,gBAAgB,EAChB,eAAe,EACf,UAAU,EACV,iBAAiB,EACjB,sBAAsB,EACvB,MAAM,4BAA4B,CAAC;AAEpC,OAAO,EACL,gBAAgB,EAChB,qBAAqB,EACrB,+BAA+B,EAC/B,qBAAqB,EACrB,cAAc,EACf,MAAM,6BAA6B,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -21,7 +21,7 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
|
21
21
|
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
22
22
|
};
|
|
23
23
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
24
|
-
exports.PostmarkProvider = exports.MailgunProvider = exports.SesProvider = exports.SendGridProvider = exports.SmtpProvider = exports.EmailProvider = exports.EmailSender = void 0;
|
|
24
|
+
exports.RateLimitError = exports.TemplateConflictError = exports.UnauthorizedTemplateAccessError = exports.TemplateNotFoundError = exports.SendGridApiError = exports.PostmarkProvider = exports.MailgunProvider = exports.SesProvider = exports.SendGridProvider = exports.SmtpProvider = exports.EmailProvider = exports.EmailSafetyManager = exports.EmailSender = void 0;
|
|
25
25
|
/**
|
|
26
26
|
* Email Sender - Core Library
|
|
27
27
|
* Main entry point for the email sending system
|
|
@@ -31,6 +31,8 @@ __exportStar(require("./types"), exports);
|
|
|
31
31
|
// Core classes
|
|
32
32
|
var email_sender_1 = require("./core/email-sender");
|
|
33
33
|
Object.defineProperty(exports, "EmailSender", { enumerable: true, get: function () { return email_sender_1.EmailSender; } });
|
|
34
|
+
var email_safety_manager_1 = require("./core/email-safety-manager");
|
|
35
|
+
Object.defineProperty(exports, "EmailSafetyManager", { enumerable: true, get: function () { return email_safety_manager_1.EmailSafetyManager; } });
|
|
34
36
|
// Provider classes
|
|
35
37
|
var base_1 = require("./providers/base");
|
|
36
38
|
Object.defineProperty(exports, "EmailProvider", { enumerable: true, get: function () { return base_1.EmailProvider; } });
|
|
@@ -44,4 +46,10 @@ var mailgun_1 = require("./providers/mailgun");
|
|
|
44
46
|
Object.defineProperty(exports, "MailgunProvider", { enumerable: true, get: function () { return mailgun_1.MailgunProvider; } });
|
|
45
47
|
var postmark_1 = require("./providers/postmark");
|
|
46
48
|
Object.defineProperty(exports, "PostmarkProvider", { enumerable: true, get: function () { return postmark_1.PostmarkProvider; } });
|
|
49
|
+
var errors_1 = require("./providers/sendgrid/errors");
|
|
50
|
+
Object.defineProperty(exports, "SendGridApiError", { enumerable: true, get: function () { return errors_1.SendGridApiError; } });
|
|
51
|
+
Object.defineProperty(exports, "TemplateNotFoundError", { enumerable: true, get: function () { return errors_1.TemplateNotFoundError; } });
|
|
52
|
+
Object.defineProperty(exports, "UnauthorizedTemplateAccessError", { enumerable: true, get: function () { return errors_1.UnauthorizedTemplateAccessError; } });
|
|
53
|
+
Object.defineProperty(exports, "TemplateConflictError", { enumerable: true, get: function () { return errors_1.TemplateConflictError; } });
|
|
54
|
+
Object.defineProperty(exports, "RateLimitError", { enumerable: true, get: function () { return errors_1.RateLimitError; } });
|
|
47
55
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAAA;;;;;;EAME;;;;;;;;;;;;;;;;;AAEF;;;GAGG;AAEH,aAAa;AACb,0CAAwB;AAExB,eAAe;AACf,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAAA;;;;;;EAME;;;;;;;;;;;;;;;;;AAEF;;;GAGG;AAEH,aAAa;AACb,0CAAwB;AAExB,eAAe;AACf,oDAAqE;AAA5D,2GAAA,WAAW,OAAA;AACpB,oEAAiE;AAAxD,0HAAA,kBAAkB,OAAA;AAE3B,mBAAmB;AACnB,yCAAiD;AAAxC,qGAAA,aAAa,OAAA;AACtB,yCAAgD;AAAvC,oGAAA,YAAY,OAAA;AACrB,iDAAwD;AAA/C,4GAAA,gBAAgB,OAAA;AACzB,uCAA8C;AAArC,kGAAA,WAAW,OAAA;AACpB,+CAAsD;AAA7C,0GAAA,eAAe,OAAA;AACxB,iDAAwD;AAA/C,4GAAA,gBAAgB,OAAA;AA8BzB,sDAMqC;AALnC,0GAAA,gBAAgB,OAAA;AAChB,+GAAA,qBAAqB,OAAA;AACrB,yHAAA,+BAA+B,OAAA;AAC/B,+GAAA,qBAAqB,OAAA;AACrB,wGAAA,cAAc,OAAA"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SendGrid API client
|
|
3
|
+
* Merged from @bernierllc/email-sendgrid-plugin v1.0.1
|
|
4
|
+
*/
|
|
5
|
+
import { ApiRequestOptions, ApiResponse } from './types';
|
|
6
|
+
import { SimpleRateLimiter } from './rate-limiter';
|
|
7
|
+
export interface SendGridClientConfig {
|
|
8
|
+
apiKey: string;
|
|
9
|
+
rateLimiter?: SimpleRateLimiter | undefined;
|
|
10
|
+
logger?: {
|
|
11
|
+
debug: (message: string) => void;
|
|
12
|
+
error: (message: string) => void;
|
|
13
|
+
info: (message: string) => void;
|
|
14
|
+
} | undefined;
|
|
15
|
+
}
|
|
16
|
+
export declare class SendGridClient {
|
|
17
|
+
private readonly apiKey;
|
|
18
|
+
private readonly rateLimiter?;
|
|
19
|
+
private readonly logger?;
|
|
20
|
+
private readonly baseUrl;
|
|
21
|
+
constructor(config: SendGridClientConfig);
|
|
22
|
+
request(endpoint: string, options: ApiRequestOptions): Promise<ApiResponse>;
|
|
23
|
+
isSuccessResponse(response: ApiResponse): boolean;
|
|
24
|
+
parseResponseBody<T>(response: ApiResponse): T;
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../../src/providers/sendgrid/client.ts"],"names":[],"mappings":"AAQA;;;GAGG;AAEH,OAAO,EAAE,iBAAiB,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAEzD,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAEnD,MAAM,WAAW,oBAAoB;IACnC,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,iBAAiB,GAAG,SAAS,CAAC;IAC5C,MAAM,CAAC,EAAE;QACP,KAAK,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;QACjC,KAAK,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;QACjC,IAAI,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;KACjC,GAAG,SAAS,CAAC;CACf;AAED,qBAAa,cAAc;IACzB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAgC;IAC7D,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CAA6C;IACrE,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAiC;gBAE7C,MAAM,EAAE,oBAAoB;IAMlC,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,WAAW,CAAC;IA6CjF,iBAAiB,CAAC,QAAQ,EAAE,WAAW,GAAG,OAAO;IAIjD,iBAAiB,CAAC,CAAC,EAAE,QAAQ,EAAE,WAAW,GAAG,CAAC;CAO/C"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/*
|
|
3
|
+
Copyright (c) 2025 Bernier LLC
|
|
4
|
+
|
|
5
|
+
This file is licensed to the client under a limited-use license.
|
|
6
|
+
The client may use and modify this code *only within the scope of the project it was delivered for*.
|
|
7
|
+
Redistribution or use in other products or commercial offerings is not permitted without written consent from Bernier LLC.
|
|
8
|
+
*/
|
|
9
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
+
exports.SendGridClient = void 0;
|
|
11
|
+
const errors_1 = require("./errors");
|
|
12
|
+
class SendGridClient {
|
|
13
|
+
constructor(config) {
|
|
14
|
+
this.baseUrl = 'https://api.sendgrid.com/v3';
|
|
15
|
+
this.apiKey = config.apiKey;
|
|
16
|
+
this.rateLimiter = config.rateLimiter;
|
|
17
|
+
this.logger = config.logger;
|
|
18
|
+
}
|
|
19
|
+
async request(endpoint, options) {
|
|
20
|
+
// Apply rate limiting if configured
|
|
21
|
+
if (this.rateLimiter) {
|
|
22
|
+
await this.rateLimiter.acquire();
|
|
23
|
+
}
|
|
24
|
+
try {
|
|
25
|
+
const url = `${this.baseUrl}${endpoint}`;
|
|
26
|
+
const requestInit = {
|
|
27
|
+
method: options.method,
|
|
28
|
+
headers: {
|
|
29
|
+
'Authorization': `Bearer ${this.apiKey}`,
|
|
30
|
+
'Content-Type': 'application/json',
|
|
31
|
+
...options.headers
|
|
32
|
+
}
|
|
33
|
+
};
|
|
34
|
+
if (options.body) {
|
|
35
|
+
requestInit.body = options.body;
|
|
36
|
+
}
|
|
37
|
+
const response = await fetch(url, requestInit);
|
|
38
|
+
const body = await response.text();
|
|
39
|
+
// Log all API calls for audit trail
|
|
40
|
+
this.logger?.debug(`SendGrid API ${options.method} ${endpoint}: ${response.status}`);
|
|
41
|
+
return {
|
|
42
|
+
statusCode: response.status,
|
|
43
|
+
headers: Object.fromEntries(response.headers.entries()),
|
|
44
|
+
body
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
catch (error) {
|
|
48
|
+
const errorMessage = error instanceof Error ? error.message : 'Unknown error';
|
|
49
|
+
this.logger?.error(`SendGrid API error: ${errorMessage}`);
|
|
50
|
+
throw new errors_1.SendGridApiError(`API request failed: ${errorMessage}`, undefined, error);
|
|
51
|
+
}
|
|
52
|
+
finally {
|
|
53
|
+
if (this.rateLimiter) {
|
|
54
|
+
this.rateLimiter.release();
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
isSuccessResponse(response) {
|
|
59
|
+
return response.statusCode >= 200 && response.statusCode < 300;
|
|
60
|
+
}
|
|
61
|
+
parseResponseBody(response) {
|
|
62
|
+
try {
|
|
63
|
+
return JSON.parse(response.body);
|
|
64
|
+
}
|
|
65
|
+
catch (_error) {
|
|
66
|
+
throw new errors_1.SendGridApiError('Failed to parse response body', response.statusCode, response.body);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
exports.SendGridClient = SendGridClient;
|
|
71
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../../src/providers/sendgrid/client.ts"],"names":[],"mappings":";AAAA;;;;;;EAME;;;AAQF,qCAA4C;AAa5C,MAAa,cAAc;IAMzB,YAAY,MAA4B;QAFvB,YAAO,GAAG,6BAA6B,CAAC;QAGvD,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;QAC5B,IAAI,CAAC,WAAW,GAAG,MAAM,CAAC,WAAW,CAAC;QACtC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;IAC9B,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,QAAgB,EAAE,OAA0B;QACxD,oCAAoC;QACpC,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YACrB,MAAM,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,CAAC;QACnC,CAAC;QAED,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,OAAO,GAAG,QAAQ,EAAE,CAAC;YAEzC,MAAM,WAAW,GAAgB;gBAC/B,MAAM,EAAE,OAAO,CAAC,MAAM;gBACtB,OAAO,EAAE;oBACP,eAAe,EAAE,UAAU,IAAI,CAAC,MAAM,EAAE;oBACxC,cAAc,EAAE,kBAAkB;oBAClC,GAAG,OAAO,CAAC,OAAO;iBACnB;aACF,CAAC;YAEF,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;gBACjB,WAAW,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;YAClC,CAAC;YAED,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC;YAE/C,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;YAEnC,oCAAoC;YACpC,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,gBAAgB,OAAO,CAAC,MAAM,IAAI,QAAQ,KAAK,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;YAErF,OAAO;gBACL,UAAU,EAAE,QAAQ,CAAC,MAAM;gBAC3B,OAAO,EAAE,MAAM,CAAC,WAAW,CAAC,QAAQ,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;gBACvD,IAAI;aACL,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,YAAY,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC;YAC9E,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,uBAAuB,YAAY,EAAE,CAAC,CAAC;YAC1D,MAAM,IAAI,yBAAgB,CAAC,uBAAuB,YAAY,EAAE,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC;QACtF,CAAC;gBAAS,CAAC;YACT,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;gBACrB,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,CAAC;YAC7B,CAAC;QACH,CAAC;IACH,CAAC;IAED,iBAAiB,CAAC,QAAqB;QACrC,OAAO,QAAQ,CAAC,UAAU,IAAI,GAAG,IAAI,QAAQ,CAAC,UAAU,GAAG,GAAG,CAAC;IACjE,CAAC;IAED,iBAAiB,CAAI,QAAqB;QACxC,IAAI,CAAC;YACH,OAAO,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAM,CAAC;QACxC,CAAC;QAAC,OAAO,MAAM,EAAE,CAAC;YAChB,MAAM,IAAI,yBAAgB,CAAC,+BAA+B,EAAE,QAAQ,CAAC,UAAU,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC;QAClG,CAAC;IACH,CAAC;CACF;AApED,wCAoEC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Converters for SendGrid data types
|
|
3
|
+
* Merged from @bernierllc/email-sendgrid-plugin v1.0.1
|
|
4
|
+
*/
|
|
5
|
+
import { SendGridTemplateData, SendGridVerifiedSenderData, ProviderTemplate, VerifiedSender } from './types';
|
|
6
|
+
export declare class TemplateConverter {
|
|
7
|
+
private readonly prefixEnforcer?;
|
|
8
|
+
constructor(prefixEnforcer?: {
|
|
9
|
+
hasPrefix: (name: string) => boolean;
|
|
10
|
+
removePrefix: (name: string) => string;
|
|
11
|
+
} | undefined);
|
|
12
|
+
convertToProviderTemplate(data: SendGridTemplateData): ProviderTemplate;
|
|
13
|
+
}
|
|
14
|
+
export declare class SenderConverter {
|
|
15
|
+
convertToVerifiedSender(data: SendGridVerifiedSenderData): VerifiedSender;
|
|
16
|
+
extractDomain(email: string): string;
|
|
17
|
+
isDomainMatch(domain1: string, domain2: string): boolean;
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=converters.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"converters.d.ts","sourceRoot":"","sources":["../../../src/providers/sendgrid/converters.ts"],"names":[],"mappings":"AAQA;;;GAGG;AAEH,OAAO,EACL,oBAAoB,EACpB,0BAA0B,EAC1B,gBAAgB,EAChB,cAAc,EACf,MAAM,SAAS,CAAC;AAEjB,qBAAa,iBAAiB;IAChB,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC;gBAAf,cAAc,CAAC,EAAE;QAAG,SAAS,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC;QAAC,YAAY,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAAA;KAAE,YAAA;IAE/H,yBAAyB,CAAC,IAAI,EAAE,oBAAoB,GAAG,gBAAgB;CAexE;AAED,qBAAa,eAAe;IAC1B,uBAAuB,CAAC,IAAI,EAAE,0BAA0B,GAAG,cAAc;IAczE,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM;IAKpC,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO;CAGzD"}
|