@bernierllc/email-manager 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (35) hide show
  1. package/LICENSE +5 -0
  2. package/README.md +534 -0
  3. package/dist/email-manager.d.ts +134 -0
  4. package/dist/email-manager.d.ts.map +1 -0
  5. package/dist/email-manager.js +360 -0
  6. package/dist/email-manager.js.map +1 -0
  7. package/dist/index.d.ts +7 -0
  8. package/dist/index.d.ts.map +1 -0
  9. package/dist/index.js +17 -0
  10. package/dist/index.js.map +1 -0
  11. package/dist/managers/email-analytics.d.ts +92 -0
  12. package/dist/managers/email-analytics.d.ts.map +1 -0
  13. package/dist/managers/email-analytics.js +375 -0
  14. package/dist/managers/email-analytics.js.map +1 -0
  15. package/dist/managers/email-scheduler.d.ts +81 -0
  16. package/dist/managers/email-scheduler.d.ts.map +1 -0
  17. package/dist/managers/email-scheduler.js +288 -0
  18. package/dist/managers/email-scheduler.js.map +1 -0
  19. package/dist/managers/provider-manager.d.ts +104 -0
  20. package/dist/managers/provider-manager.d.ts.map +1 -0
  21. package/dist/managers/provider-manager.js +436 -0
  22. package/dist/managers/provider-manager.js.map +1 -0
  23. package/dist/managers/template-manager.d.ts +65 -0
  24. package/dist/managers/template-manager.d.ts.map +1 -0
  25. package/dist/managers/template-manager.js +314 -0
  26. package/dist/managers/template-manager.js.map +1 -0
  27. package/dist/types.d.ts +507 -0
  28. package/dist/types.d.ts.map +1 -0
  29. package/dist/types.js +60 -0
  30. package/dist/types.js.map +1 -0
  31. package/dist/utils/simple-template-engine.d.ts +27 -0
  32. package/dist/utils/simple-template-engine.d.ts.map +1 -0
  33. package/dist/utils/simple-template-engine.js +61 -0
  34. package/dist/utils/simple-template-engine.js.map +1 -0
  35. package/package.json +57 -0
@@ -0,0 +1,436 @@
1
+ /*
2
+ Copyright (c) 2025 Bernier LLC
3
+
4
+ This file is licensed to the client under a limited-use license.
5
+ The client may use and modify this code *only within the scope of the project it was delivered for*.
6
+ Redistribution or use in other products or commercial offerings is not permitted without written consent from Bernier LLC.
7
+ */
8
+ import { EmailSender } from '@bernierllc/email-sender';
9
+ import { EmailProviderSchema } from '../types.js';
10
+ /**
11
+ * Provider Management System
12
+ * Handles email provider configuration, fallback, and load balancing
13
+ */
14
+ export class ProviderManager {
15
+ constructor(emailSender) {
16
+ this.providers = new Map();
17
+ this.activeProviders = [];
18
+ this.usageTracking = new Map();
19
+ this.emailSender = emailSender;
20
+ // Reset usage tracking periodically
21
+ setInterval(() => this.resetUsageCounters(), 60000); // Every minute
22
+ }
23
+ /**
24
+ * Add a new email provider
25
+ */
26
+ async addProvider(provider) {
27
+ try {
28
+ // Validate provider configuration
29
+ const validation = this.validateProvider(provider);
30
+ if (!validation.isValid) {
31
+ return {
32
+ success: false,
33
+ errors: validation.errors
34
+ };
35
+ }
36
+ // Check for ID conflicts
37
+ if (this.providers.has(provider.id)) {
38
+ return {
39
+ success: false,
40
+ errors: [`Provider with ID ${provider.id} already exists`]
41
+ };
42
+ }
43
+ // Test provider connection
44
+ const testResult = await this.testProviderConnection(provider);
45
+ if (!testResult.success) {
46
+ return {
47
+ success: false,
48
+ errors: [`Provider connection test failed: ${testResult.message}`]
49
+ };
50
+ }
51
+ // Add provider
52
+ this.providers.set(provider.id, provider);
53
+ this.updateActiveProviders();
54
+ this.initializeUsageTracking(provider.id);
55
+ return {
56
+ success: true,
57
+ provider,
58
+ message: 'Provider added successfully'
59
+ };
60
+ }
61
+ catch (error) {
62
+ return {
63
+ success: false,
64
+ errors: [error instanceof Error ? error.message : 'Unknown error occurred']
65
+ };
66
+ }
67
+ }
68
+ /**
69
+ * Remove a provider
70
+ */
71
+ async removeProvider(providerId) {
72
+ try {
73
+ if (!this.providers.has(providerId)) {
74
+ return {
75
+ success: false,
76
+ error: `Provider not found: ${providerId}`
77
+ };
78
+ }
79
+ this.providers.delete(providerId);
80
+ this.usageTracking.delete(providerId);
81
+ this.updateActiveProviders();
82
+ return {
83
+ success: true,
84
+ message: 'Provider removed successfully'
85
+ };
86
+ }
87
+ catch (error) {
88
+ return {
89
+ success: false,
90
+ error: error instanceof Error ? error.message : 'Unknown error occurred'
91
+ };
92
+ }
93
+ }
94
+ /**
95
+ * Get a provider by ID
96
+ */
97
+ async getProvider(providerId) {
98
+ return this.providers.get(providerId) || null;
99
+ }
100
+ /**
101
+ * List all providers
102
+ */
103
+ async listProviders() {
104
+ const providers = Array.from(this.providers.values());
105
+ // Sort by priority
106
+ providers.sort((a, b) => a.priority - b.priority);
107
+ return {
108
+ providers,
109
+ total: providers.length
110
+ };
111
+ }
112
+ /**
113
+ * Send email with provider fallback
114
+ */
115
+ async sendEmail(email) {
116
+ const providers = this.getAvailableProviders(email.provider);
117
+ let lastError = null;
118
+ for (const provider of providers) {
119
+ try {
120
+ // Check rate limits
121
+ if (!this.checkRateLimit(provider)) {
122
+ console.warn(`Rate limit exceeded for provider ${provider.id}, trying next provider`);
123
+ continue;
124
+ }
125
+ const result = await this.sendWithProvider(email, provider);
126
+ if (result.success) {
127
+ // Update usage tracking
128
+ this.updateUsageTracking(provider.id);
129
+ return result;
130
+ }
131
+ lastError = new Error(result.errors?.join(', ') || 'Send failed');
132
+ }
133
+ catch (error) {
134
+ console.error(`Failed to send with provider ${provider.id}:`, error);
135
+ lastError = error instanceof Error ? error : new Error('Unknown error');
136
+ continue;
137
+ }
138
+ }
139
+ return {
140
+ success: false,
141
+ errors: [
142
+ { code: 'ALL_PROVIDERS_FAILED', message: 'All providers failed to send email' },
143
+ { code: 'LAST_ERROR', message: lastError ? lastError.message : 'No detailed error information' }
144
+ ],
145
+ provider: 'none',
146
+ sentAt: new Date()
147
+ };
148
+ }
149
+ /**
150
+ * Get provider status
151
+ */
152
+ async getProviderStatus(providerId) {
153
+ const provider = this.providers.get(providerId);
154
+ if (!provider) {
155
+ return null;
156
+ }
157
+ const usage = this.usageTracking.get(providerId);
158
+ const testResult = await this.testProviderConnection(provider);
159
+ return {
160
+ id: provider.id,
161
+ isActive: provider.isActive,
162
+ isHealthy: testResult.success,
163
+ lastHealthCheck: new Date(),
164
+ currentUsage: usage ? {
165
+ minute: usage.minute,
166
+ hour: usage.hour,
167
+ day: usage.day
168
+ } : { minute: 0, hour: 0, day: 0 },
169
+ rateLimit: provider.rateLimit
170
+ };
171
+ }
172
+ /**
173
+ * Test provider connection
174
+ */
175
+ async testConnection(providerId) {
176
+ const provider = this.providers.get(providerId);
177
+ if (!provider) {
178
+ return {
179
+ success: false,
180
+ message: `Provider not found: ${providerId}`
181
+ };
182
+ }
183
+ return this.testProviderConnection(provider);
184
+ }
185
+ /**
186
+ * Send email with specific provider
187
+ */
188
+ async sendWithProvider(email, provider) {
189
+ try {
190
+ // Create new EmailSender instance for this provider
191
+ const emailSender = new EmailSender({
192
+ provider: provider.type,
193
+ fromEmail: provider.config.fromEmail || 'noreply@example.com',
194
+ ...provider.config
195
+ });
196
+ // Prepare email data for the email sender
197
+ const emailMessage = {
198
+ toEmail: Array.isArray(email.to) ? email.to[0] : email.to,
199
+ subject: email.subject,
200
+ textContent: email.text,
201
+ htmlContent: email.html,
202
+ attachments: email.attachments ? email.attachments.map(att => ({
203
+ filename: att.filename,
204
+ content: typeof att.content === 'string' ? att.content : Buffer.from(att.content).toString('base64'),
205
+ contentType: att.contentType,
206
+ disposition: att.contentDisposition
207
+ })) : undefined
208
+ };
209
+ // Send email using sendEmail method
210
+ const result = await emailSender.sendEmail(emailMessage);
211
+ return {
212
+ success: result.success,
213
+ messageId: result.messageId,
214
+ provider: provider.id,
215
+ sentAt: new Date(),
216
+ errors: result.success ? [] : [{ code: 'SEND_FAILED', message: result.errorMessage || 'Send failed' }],
217
+ metadata: result.metadata
218
+ };
219
+ }
220
+ catch (error) {
221
+ throw new Error(`Provider ${provider.id} failed: ${error instanceof Error ? error.message : 'Unknown error'}`);
222
+ }
223
+ }
224
+ /**
225
+ * Get available providers sorted by priority
226
+ */
227
+ getAvailableProviders(preferredProvider) {
228
+ let providers = this.activeProviders.filter(provider => provider.isActive);
229
+ // If a preferred provider is specified, try it first
230
+ if (preferredProvider) {
231
+ const preferred = providers.find(p => p.id === preferredProvider);
232
+ if (preferred) {
233
+ providers = [preferred, ...providers.filter(p => p.id !== preferredProvider)];
234
+ }
235
+ }
236
+ else {
237
+ // Sort by priority (lower number = higher priority)
238
+ providers.sort((a, b) => a.priority - b.priority);
239
+ }
240
+ return providers;
241
+ }
242
+ /**
243
+ * Check if provider is within rate limits
244
+ */
245
+ checkRateLimit(provider) {
246
+ if (!provider.rateLimit) {
247
+ return true;
248
+ }
249
+ const usage = this.usageTracking.get(provider.id);
250
+ if (!usage) {
251
+ return true;
252
+ }
253
+ return (usage.minute < provider.rateLimit.maxPerMinute &&
254
+ usage.hour < provider.rateLimit.maxPerHour &&
255
+ usage.day < provider.rateLimit.maxPerDay);
256
+ }
257
+ /**
258
+ * Update usage tracking for a provider
259
+ */
260
+ updateUsageTracking(providerId) {
261
+ const usage = this.usageTracking.get(providerId);
262
+ if (usage) {
263
+ usage.minute++;
264
+ usage.hour++;
265
+ usage.day++;
266
+ }
267
+ }
268
+ /**
269
+ * Initialize usage tracking for a provider
270
+ */
271
+ initializeUsageTracking(providerId) {
272
+ this.usageTracking.set(providerId, {
273
+ minute: 0,
274
+ hour: 0,
275
+ day: 0,
276
+ lastReset: new Date()
277
+ });
278
+ }
279
+ /**
280
+ * Reset usage counters based on time intervals
281
+ */
282
+ resetUsageCounters() {
283
+ const now = new Date();
284
+ for (const [providerId, usage] of this.usageTracking.entries()) {
285
+ const timeSinceReset = now.getTime() - usage.lastReset.getTime();
286
+ // Reset minute counter every minute
287
+ if (timeSinceReset >= 60000) {
288
+ usage.minute = 0;
289
+ }
290
+ // Reset hour counter every hour
291
+ if (timeSinceReset >= 3600000) {
292
+ usage.hour = 0;
293
+ }
294
+ // Reset day counter every day
295
+ if (timeSinceReset >= 86400000) {
296
+ usage.day = 0;
297
+ usage.lastReset = now;
298
+ }
299
+ }
300
+ }
301
+ /**
302
+ * Update the active providers list
303
+ */
304
+ updateActiveProviders() {
305
+ this.activeProviders = Array.from(this.providers.values())
306
+ .filter(provider => provider.isActive)
307
+ .sort((a, b) => a.priority - b.priority);
308
+ }
309
+ /**
310
+ * Validate provider configuration
311
+ */
312
+ validateProvider(provider) {
313
+ const errors = [];
314
+ try {
315
+ // Use Zod schema validation
316
+ EmailProviderSchema.parse(provider);
317
+ }
318
+ catch (error) {
319
+ if (error.errors) {
320
+ errors.push(...error.errors.map((e) => `${e.path.join('.')}: ${e.message}`));
321
+ }
322
+ else {
323
+ errors.push('Provider validation failed');
324
+ }
325
+ }
326
+ // Additional business logic validation
327
+ if (provider.priority < 1) {
328
+ errors.push('Provider priority must be >= 1');
329
+ }
330
+ // Provider-specific validation
331
+ switch (provider.type) {
332
+ case 'sendgrid':
333
+ if (!provider.config.apiKey) {
334
+ errors.push('SendGrid provider requires apiKey in config');
335
+ }
336
+ break;
337
+ case 'mailgun':
338
+ if (!provider.config.apiKey || !provider.config.domain) {
339
+ errors.push('Mailgun provider requires apiKey and domain in config');
340
+ }
341
+ break;
342
+ case 'ses':
343
+ if (!provider.config.accessKeyId || !provider.config.secretAccessKey || !provider.config.region) {
344
+ errors.push('AWS SES provider requires accessKeyId, secretAccessKey, and region in config');
345
+ }
346
+ break;
347
+ case 'smtp':
348
+ if (!provider.config.host || !provider.config.port) {
349
+ errors.push('SMTP provider requires host and port in config');
350
+ }
351
+ break;
352
+ case 'postmark':
353
+ if (!provider.config.serverToken) {
354
+ errors.push('Postmark provider requires serverToken in config');
355
+ }
356
+ break;
357
+ }
358
+ return {
359
+ isValid: errors.length === 0,
360
+ errors
361
+ };
362
+ }
363
+ /**
364
+ * Test provider connection
365
+ */
366
+ async testProviderConnection(provider) {
367
+ try {
368
+ // Create new EmailSender instance for this provider
369
+ const emailSender = new EmailSender({
370
+ provider: provider.type,
371
+ fromEmail: provider.config.fromEmail || 'noreply@example.com',
372
+ ...provider.config
373
+ });
374
+ // Test connection using testConnection method
375
+ const isValid = await emailSender.testConnection();
376
+ return {
377
+ success: isValid,
378
+ message: isValid ? 'Provider connection successful' : 'Provider connection failed',
379
+ details: { providerId: provider.id, type: provider.type }
380
+ };
381
+ }
382
+ catch (error) {
383
+ return {
384
+ success: false,
385
+ message: `Connection test failed: ${error instanceof Error ? error.message : 'Unknown error'}`,
386
+ details: { providerId: provider.id, type: provider.type, error }
387
+ };
388
+ }
389
+ }
390
+ /**
391
+ * Get provider statistics
392
+ */
393
+ getStats() {
394
+ const providers = Array.from(this.providers.values());
395
+ return {
396
+ total: providers.length,
397
+ active: providers.filter(p => p.isActive).length,
398
+ inactive: providers.filter(p => !p.isActive).length,
399
+ byType: this.groupByType(providers),
400
+ usageStats: this.getUsageStats()
401
+ };
402
+ }
403
+ /**
404
+ * Group providers by type
405
+ */
406
+ groupByType(providers) {
407
+ const grouped = {};
408
+ for (const provider of providers) {
409
+ grouped[provider.type] = (grouped[provider.type] || 0) + 1;
410
+ }
411
+ return grouped;
412
+ }
413
+ /**
414
+ * Get usage statistics
415
+ */
416
+ getUsageStats() {
417
+ const stats = {};
418
+ for (const [providerId, usage] of this.usageTracking.entries()) {
419
+ stats[providerId] = {
420
+ minute: usage.minute,
421
+ hour: usage.hour,
422
+ day: usage.day
423
+ };
424
+ }
425
+ return stats;
426
+ }
427
+ /**
428
+ * Clear all providers (for testing)
429
+ */
430
+ clear() {
431
+ this.providers.clear();
432
+ this.activeProviders = [];
433
+ this.usageTracking.clear();
434
+ }
435
+ }
436
+ //# sourceMappingURL=provider-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provider-manager.js","sourceRoot":"","sources":["../../src/managers/provider-manager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,65 @@
1
+ import { SimpleTemplateEngine } from '../utils/simple-template-engine.js';
2
+ import { EmailTemplate, TemplateResult, RenderedTemplate, TemplateContext, ListOptions, TemplateList, DeleteResult } from '../types.js';
3
+ /**
4
+ * Template Management System
5
+ * Handles CRUD operations for email templates and rendering
6
+ */
7
+ export declare class TemplateManager {
8
+ private templates;
9
+ private templateEngine;
10
+ constructor(templateEngine: SimpleTemplateEngine);
11
+ /**
12
+ * Create a new email template
13
+ */
14
+ createTemplate(template: Omit<EmailTemplate, 'createdAt' | 'updatedAt'>): Promise<TemplateResult>;
15
+ /**
16
+ * Update an existing template
17
+ */
18
+ updateTemplate(templateId: string, updates: Partial<EmailTemplate>): Promise<TemplateResult>;
19
+ /**
20
+ * Delete a template
21
+ */
22
+ deleteTemplate(templateId: string): Promise<DeleteResult>;
23
+ /**
24
+ * Get a template by ID
25
+ */
26
+ getTemplate(templateId: string): Promise<EmailTemplate | null>;
27
+ /**
28
+ * List templates with filtering and pagination
29
+ */
30
+ listTemplates(options?: ListOptions): Promise<TemplateList>;
31
+ /**
32
+ * Render a template with context data
33
+ */
34
+ renderTemplate(templateId: string, context: TemplateContext): Promise<RenderedTemplate>;
35
+ /**
36
+ * Validate template structure and syntax
37
+ */
38
+ private validateTemplate;
39
+ /**
40
+ * Find duplicate variable names
41
+ */
42
+ private findDuplicateVariables;
43
+ /**
44
+ * Increment semantic version
45
+ */
46
+ private incrementVersion;
47
+ /**
48
+ * Get template statistics
49
+ */
50
+ getStats(): {
51
+ total: number;
52
+ active: number;
53
+ inactive: number;
54
+ byCategory: Record<string, number>;
55
+ };
56
+ /**
57
+ * Group templates by category
58
+ */
59
+ private groupByCategory;
60
+ /**
61
+ * Clear all templates (for testing)
62
+ */
63
+ clear(): void;
64
+ }
65
+ //# sourceMappingURL=template-manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"template-manager.d.ts","sourceRoot":"","sources":["../../src/managers/template-manager.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,oBAAoB,EAAE,MAAM,oCAAoC,CAAC;AAC1E,OAAO,EACL,aAAa,EACb,cAAc,EACd,gBAAgB,EAChB,eAAe,EAEf,WAAW,EACX,YAAY,EACZ,YAAY,EAEb,MAAM,aAAa,CAAC;AAErB;;;GAGG;AACH,qBAAa,eAAe;IAC1B,OAAO,CAAC,SAAS,CAAyC;IAC1D,OAAO,CAAC,cAAc,CAAuB;gBAEjC,cAAc,EAAE,oBAAoB;IAIhD;;OAEG;IACG,cAAc,CAAC,QAAQ,EAAE,IAAI,CAAC,aAAa,EAAE,WAAW,GAAG,WAAW,CAAC,GAAG,OAAO,CAAC,cAAc,CAAC;IA2CvG;;OAEG;IACG,cAAc,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,aAAa,CAAC,GAAG,OAAO,CAAC,cAAc,CAAC;IA4ClG;;OAEG;IACG,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;IAuB/D;;OAEG;IACG,WAAW,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC;IAIpE;;OAEG;IACG,aAAa,CAAC,OAAO,GAAE,WAAgB,GAAG,OAAO,CAAC,YAAY,CAAC;IA4CrE;;OAEG;IACG,cAAc,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAmC7F;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAyDxB;;OAEG;IACH,OAAO,CAAC,sBAAsB;IAiB9B;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAUxB;;OAEG;IACH,QAAQ;;;;;;IAWR;;OAEG;IACH,OAAO,CAAC,eAAe;IAWvB;;OAEG;IACH,KAAK,IAAI,IAAI;CAGd"}