@bernierllc/email-sender 3.0.3 → 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 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
- constructor(config: EmailProviderConfig);
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): Promise<SendResult>;
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: EmailProviderConfig): void;
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;AAMvE,OAAO,EACL,YAAY,EACZ,UAAU,EACV,cAAc,EACd,YAAY,EACZ,yBAAyB,EACzB,qBAAqB,EACtB,MAAM,UAAU,CAAC;AAElB,qBAAa,WAAW;IACtB,OAAO,CAAC,QAAQ,CAAgB;gBAEpB,MAAM,EAAE,mBAAmB;IAIvC;;OAEG;IACH,OAAO,CAAC,cAAc;IAiBtB;;OAEG;IACG,SAAS,CAAC,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,UAAU,CAAC;IAIzD;;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,mBAAmB,GAAG,IAAI;CAGhD"}
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":"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"}
1
+ {"version":3,"file":"email-sender.js","sourceRoot":"","sources":["../../src/core/email-sender.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -3,14 +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';
14
15
  export type { VerifiedSender, SenderValidationResult, Template, ProviderTemplate, TemplateVersion, SyncResult, TemplateAnalytics, SendGridAdvancedConfig } from './providers/sendgrid/types';
15
16
  export { SendGridApiError, TemplateNotFoundError, UnauthorizedTemplateAccessError, TemplateConflictError, RateLimitError } from './providers/sendgrid/errors';
16
17
  //# sourceMappingURL=index.d.ts.map
@@ -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;AAGlD,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,EACd,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"}
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.RateLimitError = exports.TemplateConflictError = exports.UnauthorizedTemplateAccessError = exports.TemplateNotFoundError = exports.SendGridApiError = 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; } });
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,oDAAkD;AAAzC,2GAAA,WAAW,OAAA;AAEpB,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;AA4BzB,sDAMqC;AALnC,0GAAA,gBAAgB,OAAA;AAChB,+GAAA,qBAAqB,OAAA;AACrB,yHAAA,+BAA+B,OAAA;AAC/B,+GAAA,qBAAqB,OAAA;AACrB,wGAAA,cAAc,OAAA"}
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"}
@@ -96,4 +96,19 @@ export interface EmailTemplate {
96
96
  createdAt: Date;
97
97
  updatedAt: Date;
98
98
  }
99
+ export interface StagingSafetyConfig {
100
+ enabled: boolean;
101
+ environment: 'development' | 'staging' | 'production';
102
+ whitelist: string[];
103
+ rewriteTo?: string;
104
+ blockNonWhitelisted: boolean;
105
+ logBlocked: boolean;
106
+ }
107
+ export interface EmailSafetyResult {
108
+ allowed: boolean;
109
+ originalRecipient: string;
110
+ finalRecipient: string;
111
+ action: 'sent' | 'blocked' | 'rewritten';
112
+ reason?: string;
113
+ }
99
114
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bernierllc/email-sender",
3
- "version": "3.0.3",
3
+ "version": "3.0.5",
4
4
  "description": "Email sending with provider-agnostic interface and SendGrid advanced features (templates, verified senders, rate limiting)",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -47,6 +47,10 @@
47
47
  "engines": {
48
48
  "node": ">=18.0.0"
49
49
  },
50
+ "publishConfig": {
51
+ "access": "public",
52
+ "registry": "https://registry.npmjs.org/"
53
+ },
50
54
  "scripts": {
51
55
  "build": "tsc",
52
56
  "test": "jest",