@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,375 @@
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
+ /**
9
+ * Email Analytics System
10
+ * Handles email performance tracking and reporting
11
+ */
12
+ export class EmailAnalytics {
13
+ constructor(config = {
14
+ enabled: true,
15
+ trackOpens: true,
16
+ trackClicks: true,
17
+ trackBounces: true,
18
+ maxEvents: 10000
19
+ }) {
20
+ this.events = [];
21
+ this.stats = new Map();
22
+ this.config = config;
23
+ }
24
+ /**
25
+ * Track email sent event
26
+ */
27
+ trackEmailSent(emailId, provider, recipient) {
28
+ if (!this.config.enabled)
29
+ return;
30
+ this.recordEvent({
31
+ type: 'sent',
32
+ emailId,
33
+ provider,
34
+ recipient,
35
+ timestamp: new Date()
36
+ });
37
+ this.updateEmailStats(emailId, 'sent');
38
+ }
39
+ /**
40
+ * Track email delivered event
41
+ */
42
+ trackEmailDelivered(emailId, recipient) {
43
+ if (!this.config.enabled)
44
+ return;
45
+ this.recordEvent({
46
+ type: 'delivered',
47
+ emailId,
48
+ recipient,
49
+ timestamp: new Date()
50
+ });
51
+ this.updateEmailStats(emailId, 'delivered');
52
+ }
53
+ /**
54
+ * Track email opened event
55
+ */
56
+ trackEmailOpened(emailId, recipient) {
57
+ if (!this.config.enabled || !this.config.trackOpens)
58
+ return;
59
+ this.recordEvent({
60
+ type: 'opened',
61
+ emailId,
62
+ recipient,
63
+ timestamp: new Date()
64
+ });
65
+ this.updateEmailStats(emailId, 'opened');
66
+ }
67
+ /**
68
+ * Track email clicked event
69
+ */
70
+ trackEmailClicked(emailId, recipient, url) {
71
+ if (!this.config.enabled || !this.config.trackClicks)
72
+ return;
73
+ this.recordEvent({
74
+ type: 'clicked',
75
+ emailId,
76
+ recipient,
77
+ url,
78
+ timestamp: new Date()
79
+ });
80
+ this.updateEmailStats(emailId, 'clicked');
81
+ }
82
+ /**
83
+ * Track email bounced event
84
+ */
85
+ trackEmailBounced(emailId, recipient, reason) {
86
+ if (!this.config.enabled || !this.config.trackBounces)
87
+ return;
88
+ this.recordEvent({
89
+ type: 'bounced',
90
+ emailId,
91
+ recipient,
92
+ reason,
93
+ timestamp: new Date()
94
+ });
95
+ this.updateEmailStats(emailId, 'bounced');
96
+ }
97
+ /**
98
+ * Get email statistics for a specific email
99
+ */
100
+ getEmailStats(emailId) {
101
+ const existingStats = this.stats.get(emailId);
102
+ if (existingStats) {
103
+ return existingStats;
104
+ }
105
+ // Calculate stats from events if not cached
106
+ const events = this.events.filter(event => event.emailId === emailId);
107
+ const stats = {
108
+ emailId,
109
+ sent: events.filter(e => e.type === 'sent').length,
110
+ delivered: events.filter(e => e.type === 'delivered').length,
111
+ opened: events.filter(e => e.type === 'opened').length,
112
+ clicked: events.filter(e => e.type === 'clicked').length,
113
+ bounced: events.filter(e => e.type === 'bounced').length,
114
+ deliveryRate: 0,
115
+ openRate: 0,
116
+ clickRate: 0
117
+ };
118
+ // Calculate rates
119
+ stats.deliveryRate = this.calculateDeliveryRate(events);
120
+ stats.openRate = this.calculateOpenRate(events);
121
+ stats.clickRate = this.calculateClickRate(events);
122
+ // Cache the stats
123
+ this.stats.set(emailId, stats);
124
+ return stats;
125
+ }
126
+ /**
127
+ * Get delivery report for a time period
128
+ */
129
+ getDeliveryReport(options = {}) {
130
+ const startDate = options.startDate || new Date(Date.now() - 30 * 24 * 60 * 60 * 1000); // 30 days ago
131
+ const endDate = options.endDate || new Date();
132
+ let relevantEvents = this.events.filter(event => event.timestamp >= startDate && event.timestamp <= endDate);
133
+ // Filter by provider if specified
134
+ if (options.provider) {
135
+ relevantEvents = relevantEvents.filter(event => event.provider === options.provider);
136
+ }
137
+ // Filter by template if specified
138
+ if (options.templateId) {
139
+ // Note: This would require tracking templateId in events, which we could add
140
+ // For now, we'll include all events
141
+ }
142
+ const totalSent = relevantEvents.filter(e => e.type === 'sent').length;
143
+ const totalDelivered = relevantEvents.filter(e => e.type === 'delivered').length;
144
+ const totalOpened = relevantEvents.filter(e => e.type === 'opened').length;
145
+ const totalClicked = relevantEvents.filter(e => e.type === 'clicked').length;
146
+ const totalBounced = relevantEvents.filter(e => e.type === 'bounced').length;
147
+ return {
148
+ period: { startDate, endDate },
149
+ totalSent,
150
+ totalDelivered,
151
+ totalOpened,
152
+ totalClicked,
153
+ totalBounced,
154
+ deliveryRate: totalSent > 0 ? (totalDelivered / totalSent) * 100 : 0,
155
+ openRate: totalDelivered > 0 ? (totalOpened / totalDelivered) * 100 : 0,
156
+ clickRate: totalDelivered > 0 ? (totalClicked / totalDelivered) * 100 : 0,
157
+ bounceRate: totalSent > 0 ? (totalBounced / totalSent) * 100 : 0
158
+ };
159
+ }
160
+ /**
161
+ * Get bounce report for a time period
162
+ */
163
+ getBounceReport(options = {}) {
164
+ const startDate = options.startDate || new Date(Date.now() - 30 * 24 * 60 * 60 * 1000); // 30 days ago
165
+ const endDate = options.endDate || new Date();
166
+ let bounceEvents = this.events.filter(event => event.type === 'bounced' &&
167
+ event.timestamp >= startDate &&
168
+ event.timestamp <= endDate);
169
+ // Filter by provider if specified
170
+ if (options.provider) {
171
+ bounceEvents = bounceEvents.filter(event => event.provider === options.provider);
172
+ }
173
+ const totalBounces = bounceEvents.length;
174
+ const totalSent = this.events.filter(event => event.type === 'sent' &&
175
+ event.timestamp >= startDate &&
176
+ event.timestamp <= endDate &&
177
+ (!options.provider || event.provider === options.provider)).length;
178
+ // Group bounces by reason
179
+ const bouncesByReason = {};
180
+ bounceEvents.forEach(event => {
181
+ const reason = event.reason || 'unknown';
182
+ bouncesByReason[reason] = (bouncesByReason[reason] || 0) + 1;
183
+ });
184
+ // Group bounces by provider
185
+ const bouncesByProvider = {};
186
+ bounceEvents.forEach(event => {
187
+ const provider = event.provider || 'unknown';
188
+ bouncesByProvider[provider] = (bouncesByProvider[provider] || 0) + 1;
189
+ });
190
+ return {
191
+ period: { startDate, endDate },
192
+ totalBounces,
193
+ bouncesByReason,
194
+ bouncesByProvider,
195
+ bounceRate: totalSent > 0 ? (totalBounces / totalSent) * 100 : 0
196
+ };
197
+ }
198
+ /**
199
+ * Get analytics summary
200
+ */
201
+ getSummary(days = 30) {
202
+ const startDate = new Date(Date.now() - days * 24 * 60 * 60 * 1000);
203
+ const endDate = new Date();
204
+ const deliveryReport = this.getDeliveryReport({ startDate, endDate });
205
+ const bounceReport = this.getBounceReport({ startDate, endDate });
206
+ // Get top providers by volume
207
+ const providerStats = {};
208
+ this.events
209
+ .filter(e => e.type === 'sent' && e.timestamp >= startDate && e.timestamp <= endDate)
210
+ .forEach(event => {
211
+ const provider = event.provider || 'unknown';
212
+ providerStats[provider] = (providerStats[provider] || 0) + 1;
213
+ });
214
+ const topProviders = Object.entries(providerStats)
215
+ .sort(([, a], [, b]) => b - a)
216
+ .slice(0, 5)
217
+ .map(([provider, count]) => ({ provider, count }));
218
+ // Get daily stats for the period
219
+ const dailyStats = this.getDailyStats(startDate, endDate);
220
+ return {
221
+ period: { startDate, endDate, days },
222
+ overview: {
223
+ totalSent: deliveryReport.totalSent,
224
+ deliveryRate: deliveryReport.deliveryRate,
225
+ openRate: deliveryReport.openRate,
226
+ clickRate: deliveryReport.clickRate,
227
+ bounceRate: bounceReport.bounceRate
228
+ },
229
+ topProviders,
230
+ dailyStats,
231
+ totalEvents: this.events.length,
232
+ uniqueEmails: new Set(this.events.map(e => e.emailId)).size
233
+ };
234
+ }
235
+ /**
236
+ * Get daily statistics for a period
237
+ */
238
+ getDailyStats(startDate, endDate) {
239
+ const dailyStats = {};
240
+ // Initialize all days in the period
241
+ const currentDate = new Date(startDate);
242
+ while (currentDate <= endDate) {
243
+ const dateKey = currentDate.toISOString().split('T')[0];
244
+ dailyStats[dateKey] = {
245
+ date: new Date(currentDate),
246
+ sent: 0,
247
+ delivered: 0,
248
+ opened: 0,
249
+ clicked: 0,
250
+ bounced: 0
251
+ };
252
+ currentDate.setDate(currentDate.getDate() + 1);
253
+ }
254
+ // Populate with actual data
255
+ this.events
256
+ .filter(e => e.timestamp >= startDate && e.timestamp <= endDate)
257
+ .forEach(event => {
258
+ const dateKey = event.timestamp.toISOString().split('T')[0];
259
+ if (dailyStats[dateKey]) {
260
+ dailyStats[dateKey][event.type]++;
261
+ }
262
+ });
263
+ return Object.values(dailyStats).sort((a, b) => a.date.getTime() - b.date.getTime());
264
+ }
265
+ /**
266
+ * Record an event
267
+ */
268
+ recordEvent(event) {
269
+ this.events.push(event);
270
+ // Maintain max events limit to prevent memory issues
271
+ if (this.events.length > this.config.maxEvents) {
272
+ // Remove oldest events (keep most recent maxEvents/2)
273
+ const keepCount = Math.floor(this.config.maxEvents / 2);
274
+ this.events = this.events.slice(-keepCount);
275
+ // Clear stats cache as some events were removed
276
+ this.stats.clear();
277
+ }
278
+ }
279
+ /**
280
+ * Update email stats cache
281
+ */
282
+ updateEmailStats(emailId, eventType) {
283
+ const stats = this.stats.get(emailId) || {
284
+ emailId,
285
+ sent: 0,
286
+ delivered: 0,
287
+ opened: 0,
288
+ clicked: 0,
289
+ bounced: 0,
290
+ deliveryRate: 0,
291
+ openRate: 0,
292
+ clickRate: 0
293
+ };
294
+ // Increment the appropriate counter
295
+ switch (eventType) {
296
+ case 'sent':
297
+ stats.sent++;
298
+ break;
299
+ case 'delivered':
300
+ stats.delivered++;
301
+ break;
302
+ case 'opened':
303
+ stats.opened++;
304
+ break;
305
+ case 'clicked':
306
+ stats.clicked++;
307
+ break;
308
+ case 'bounced':
309
+ stats.bounced++;
310
+ break;
311
+ }
312
+ // Recalculate rates
313
+ stats.deliveryRate = stats.sent > 0 ? (stats.delivered / stats.sent) * 100 : 0;
314
+ stats.openRate = stats.delivered > 0 ? (stats.opened / stats.delivered) * 100 : 0;
315
+ stats.clickRate = stats.delivered > 0 ? (stats.clicked / stats.delivered) * 100 : 0;
316
+ this.stats.set(emailId, stats);
317
+ }
318
+ /**
319
+ * Calculate delivery rate from events
320
+ */
321
+ calculateDeliveryRate(events) {
322
+ const sent = events.filter(e => e.type === 'sent').length;
323
+ const delivered = events.filter(e => e.type === 'delivered').length;
324
+ return sent > 0 ? (delivered / sent) * 100 : 0;
325
+ }
326
+ /**
327
+ * Calculate open rate from events
328
+ */
329
+ calculateOpenRate(events) {
330
+ const delivered = events.filter(e => e.type === 'delivered').length;
331
+ const opened = events.filter(e => e.type === 'opened').length;
332
+ return delivered > 0 ? (opened / delivered) * 100 : 0;
333
+ }
334
+ /**
335
+ * Calculate click rate from events
336
+ */
337
+ calculateClickRate(events) {
338
+ const delivered = events.filter(e => e.type === 'delivered').length;
339
+ const clicked = events.filter(e => e.type === 'clicked').length;
340
+ return delivered > 0 ? (clicked / delivered) * 100 : 0;
341
+ }
342
+ /**
343
+ * Update analytics configuration
344
+ */
345
+ updateConfig(config) {
346
+ this.config = { ...this.config, ...config };
347
+ }
348
+ /**
349
+ * Export events data (for backup or migration)
350
+ */
351
+ exportEvents() {
352
+ return [...this.events];
353
+ }
354
+ /**
355
+ * Import events data (for restore or migration)
356
+ */
357
+ importEvents(events) {
358
+ this.events = events.slice(0, this.config.maxEvents);
359
+ this.stats.clear(); // Clear cache to force recalculation
360
+ }
361
+ /**
362
+ * Clear all analytics data (for testing)
363
+ */
364
+ clear() {
365
+ this.events = [];
366
+ this.stats.clear();
367
+ }
368
+ /**
369
+ * Get total event count
370
+ */
371
+ getEventCount() {
372
+ return this.events.length;
373
+ }
374
+ }
375
+ //# sourceMappingURL=email-analytics.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"email-analytics.js","sourceRoot":"","sources":["../../src/managers/email-analytics.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,81 @@
1
+ import { EmailData, ScheduledEmail, ScheduleResult, CancelResult, SchedulingConfig } from '../types.js';
2
+ /**
3
+ * Email Scheduling System
4
+ * Handles queuing and scheduled delivery of emails
5
+ */
6
+ export declare class EmailScheduler {
7
+ private queue;
8
+ private isRunning;
9
+ private interval;
10
+ private config;
11
+ private sendEmailCallback;
12
+ constructor(sendEmailCallback: (email: EmailData) => Promise<any>, config?: SchedulingConfig);
13
+ /**
14
+ * Schedule an email for future delivery
15
+ */
16
+ scheduleEmail(email: EmailData, scheduleTime: Date): Promise<ScheduleResult>;
17
+ /**
18
+ * Cancel a scheduled email
19
+ */
20
+ cancelScheduledEmail(scheduleId: string): Promise<CancelResult>;
21
+ /**
22
+ * Get scheduled email by ID
23
+ */
24
+ getScheduledEmail(scheduleId: string): ScheduledEmail | null;
25
+ /**
26
+ * List all scheduled emails
27
+ */
28
+ listScheduledEmails(status?: 'scheduled' | 'cancelled' | 'sent' | 'failed'): ScheduledEmail[];
29
+ /**
30
+ * Start the scheduler
31
+ */
32
+ startScheduler(): void;
33
+ /**
34
+ * Stop the scheduler
35
+ */
36
+ stopScheduler(): void;
37
+ /**
38
+ * Process the email queue
39
+ */
40
+ private processQueue;
41
+ /**
42
+ * Process a single scheduled email
43
+ */
44
+ private processSingleEmail;
45
+ /**
46
+ * Handle failed email delivery with retry logic
47
+ */
48
+ private handleFailedEmail;
49
+ /**
50
+ * Sort queue by scheduled time
51
+ */
52
+ private sortQueue;
53
+ /**
54
+ * Clean up old completed emails to prevent memory issues
55
+ */
56
+ private cleanupCompletedEmails;
57
+ /**
58
+ * Get scheduler statistics
59
+ */
60
+ getStats(): {
61
+ isRunning: boolean;
62
+ totalInQueue: number;
63
+ scheduled: number;
64
+ overdue: number;
65
+ nextScheduled: Date | null;
66
+ config: SchedulingConfig;
67
+ };
68
+ /**
69
+ * Update scheduler configuration
70
+ */
71
+ updateConfig(config: Partial<SchedulingConfig>): void;
72
+ /**
73
+ * Clear all scheduled emails (for testing)
74
+ */
75
+ clear(): void;
76
+ /**
77
+ * Get queue length
78
+ */
79
+ getQueueLength(): number;
80
+ }
81
+ //# sourceMappingURL=email-scheduler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"email-scheduler.d.ts","sourceRoot":"","sources":["../../src/managers/email-scheduler.ts"],"names":[],"mappings":"AASA,OAAO,EACL,SAAS,EACT,cAAc,EACd,cAAc,EACd,YAAY,EACZ,gBAAgB,EACjB,MAAM,aAAa,CAAC;AAErB;;;GAGG;AACH,qBAAa,cAAc;IACzB,OAAO,CAAC,KAAK,CAAwB;IACrC,OAAO,CAAC,SAAS,CAAkB;IACnC,OAAO,CAAC,QAAQ,CAA+B;IAC/C,OAAO,CAAC,MAAM,CAAmB;IACjC,OAAO,CAAC,iBAAiB,CAAqC;gBAG5D,iBAAiB,EAAE,CAAC,KAAK,EAAE,SAAS,KAAK,OAAO,CAAC,GAAG,CAAC,EACrD,MAAM,GAAE,gBAKP;IAMH;;OAEG;IACG,aAAa,CAAC,KAAK,EAAE,SAAS,EAAE,YAAY,EAAE,IAAI,GAAG,OAAO,CAAC,cAAc,CAAC;IA6ClF;;OAEG;IACG,oBAAoB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;IAqCrE;;OAEG;IACH,iBAAiB,CAAC,UAAU,EAAE,MAAM,GAAG,cAAc,GAAG,IAAI;IAI5D;;OAEG;IACH,mBAAmB,CAAC,MAAM,CAAC,EAAE,WAAW,GAAG,WAAW,GAAG,MAAM,GAAG,QAAQ,GAAG,cAAc,EAAE;IAa7F;;OAEG;IACH,cAAc,IAAI,IAAI;IAatB;;OAEG;IACH,aAAa,IAAI,IAAI;IAcrB;;OAEG;YACW,YAAY;IAoB1B;;OAEG;YACW,kBAAkB;IAgChC;;OAEG;YACW,iBAAiB;IA2B/B;;OAEG;IACH,OAAO,CAAC,SAAS;IAIjB;;OAEG;IACH,OAAO,CAAC,sBAAsB;IAoB9B;;OAEG;IACH,QAAQ;;;;;;;;IAiBR;;OAEG;IACH,YAAY,CAAC,MAAM,EAAE,OAAO,CAAC,gBAAgB,CAAC,GAAG,IAAI;IAUrD;;OAEG;IACH,KAAK,IAAI,IAAI;IAIb;;OAEG;IACH,cAAc,IAAI,MAAM;CAGzB"}