@bernierllc/email 1.0.1 → 1.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 (65) hide show
  1. package/README.md +76 -217
  2. package/dist/index.d.ts +3 -0
  3. package/dist/index.d.ts.map +1 -0
  4. package/dist/index.js +28 -0
  5. package/dist/index.js.map +1 -0
  6. package/dist/simple-email-service.d.ts +58 -0
  7. package/dist/simple-email-service.d.ts.map +1 -0
  8. package/dist/simple-email-service.js +416 -0
  9. package/dist/simple-email-service.js.map +1 -0
  10. package/dist/types.d.ts +311 -0
  11. package/dist/types.d.ts.map +1 -0
  12. package/dist/types.js +33 -0
  13. package/dist/types.js.map +1 -0
  14. package/package.json +57 -22
  15. package/.eslintrc.json +0 -112
  16. package/.flake8 +0 -18
  17. package/.github/workflows/ci.yml +0 -300
  18. package/EXTRACTION_SUMMARY.md +0 -265
  19. package/IMPLEMENTATION_STATUS.md +0 -159
  20. package/OPEN_SOURCE_SETUP.md +0 -420
  21. package/PACKAGE_USAGE.md +0 -471
  22. package/examples/fastapi-example/main.py +0 -257
  23. package/examples/nextjs-example/next-env.d.ts +0 -13
  24. package/examples/nextjs-example/package.json +0 -26
  25. package/examples/nextjs-example/pages/admin/templates.tsx +0 -157
  26. package/examples/nextjs-example/tsconfig.json +0 -28
  27. package/packages/core/package.json +0 -70
  28. package/packages/core/rollup.config.js +0 -37
  29. package/packages/core/specification.md +0 -416
  30. package/packages/core/src/adapters/supabase.ts +0 -291
  31. package/packages/core/src/core/scheduler.ts +0 -356
  32. package/packages/core/src/core/template-manager.ts +0 -388
  33. package/packages/core/src/index.ts +0 -30
  34. package/packages/core/src/providers/base.ts +0 -104
  35. package/packages/core/src/providers/sendgrid.ts +0 -368
  36. package/packages/core/src/types/provider.ts +0 -91
  37. package/packages/core/src/types/scheduled.ts +0 -78
  38. package/packages/core/src/types/template.ts +0 -97
  39. package/packages/core/tsconfig.json +0 -23
  40. package/packages/python/README.md +0 -106
  41. package/packages/python/email_template_manager/__init__.py +0 -66
  42. package/packages/python/email_template_manager/config.py +0 -98
  43. package/packages/python/email_template_manager/core/magic_links.py +0 -245
  44. package/packages/python/email_template_manager/core/manager.py +0 -344
  45. package/packages/python/email_template_manager/core/scheduler.py +0 -473
  46. package/packages/python/email_template_manager/exceptions.py +0 -67
  47. package/packages/python/email_template_manager/models/magic_link.py +0 -59
  48. package/packages/python/email_template_manager/models/scheduled.py +0 -78
  49. package/packages/python/email_template_manager/models/template.py +0 -90
  50. package/packages/python/email_template_manager/providers/aws_ses.py +0 -44
  51. package/packages/python/email_template_manager/providers/base.py +0 -94
  52. package/packages/python/email_template_manager/providers/sendgrid.py +0 -325
  53. package/packages/python/email_template_manager/providers/smtp.py +0 -44
  54. package/packages/python/pyproject.toml +0 -133
  55. package/packages/python/setup.py +0 -93
  56. package/packages/python/specification.md +0 -930
  57. package/packages/react/README.md +0 -13
  58. package/packages/react/package.json +0 -105
  59. package/packages/react/rollup.config.js +0 -37
  60. package/packages/react/specification.md +0 -569
  61. package/packages/react/src/index.ts +0 -20
  62. package/packages/react/tsconfig.json +0 -24
  63. package/plans/email-template-manager_app-admin.md +0 -590
  64. package/src/index.js +0 -1
  65. package/test_package.py +0 -125
@@ -0,0 +1,416 @@
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.EmailService = void 0;
11
+ const retry_policy_1 = require("@bernierllc/retry-policy");
12
+ const retry_state_1 = require("@bernierllc/retry-state");
13
+ const types_1 = require("./types");
14
+ /**
15
+ * Simplified email service demonstrating service layer orchestration pattern
16
+ * This implementation focuses on the service architecture rather than full integration
17
+ */
18
+ class EmailService {
19
+ config;
20
+ retryStorage;
21
+ constructor(config) {
22
+ this.config = this.normalizeConfig(config);
23
+ this.retryStorage = new retry_state_1.MemoryRetryStateStorage();
24
+ }
25
+ /**
26
+ * Send a single email with retry logic
27
+ */
28
+ async send(message) {
29
+ const startTime = Date.now();
30
+ const messageId = this.generateMessageId();
31
+ try {
32
+ // Apply defaults and validate
33
+ const enrichedMessage = this.applyDefaults(message);
34
+ this.validateMessage(enrichedMessage);
35
+ // Attempt to send with retry logic
36
+ const result = await this.sendWithRetry(enrichedMessage, messageId);
37
+ return {
38
+ ...result,
39
+ deliveryTime: Date.now() - startTime,
40
+ timestamp: new Date()
41
+ };
42
+ }
43
+ catch (error) {
44
+ const errorMessage = error instanceof Error ? error.message : 'Unknown error';
45
+ return {
46
+ success: false,
47
+ error: errorMessage,
48
+ messageId,
49
+ provider: this.config.provider.type,
50
+ timestamp: new Date(),
51
+ deliveryTime: Date.now() - startTime
52
+ };
53
+ }
54
+ }
55
+ /**
56
+ * Send an email using a template
57
+ */
58
+ async sendTemplate(message) {
59
+ try {
60
+ // Simple template rendering simulation
61
+ const rendered = this.renderTemplate(message.template, message.templateData);
62
+ const emailMessage = {
63
+ ...message,
64
+ html: rendered.html,
65
+ text: rendered.text
66
+ };
67
+ return await this.send(emailMessage);
68
+ }
69
+ catch (error) {
70
+ return {
71
+ success: false,
72
+ error: error instanceof Error ? error.message : 'Template rendering failed',
73
+ timestamp: new Date()
74
+ };
75
+ }
76
+ }
77
+ /**
78
+ * Send a magic link email
79
+ */
80
+ async sendMagicLink(config) {
81
+ try {
82
+ // Simulate magic link generation
83
+ const magicLink = this.generateMagicLink(config);
84
+ const expiresAt = new Date(Date.now() + (this.config.magicLink?.expirationMinutes || 60) * 60 * 1000);
85
+ // Create email with magic link
86
+ const emailMessage = {
87
+ ...config,
88
+ to: config.recipient,
89
+ html: this.createMagicLinkHtml(magicLink, config.purpose),
90
+ text: this.createMagicLinkText(magicLink, config.purpose)
91
+ };
92
+ const emailResult = await this.send(emailMessage);
93
+ return {
94
+ success: emailResult.success,
95
+ magicLink,
96
+ token: this.extractTokenFromLink(magicLink),
97
+ expiresAt,
98
+ error: emailResult.error,
99
+ emailResult
100
+ };
101
+ }
102
+ catch (error) {
103
+ return {
104
+ success: false,
105
+ error: error instanceof Error ? error.message : 'Magic link email failed'
106
+ };
107
+ }
108
+ }
109
+ /**
110
+ * Send multiple emails
111
+ */
112
+ async sendBulk(messages) {
113
+ const results = [];
114
+ const errors = [];
115
+ for (const message of messages) {
116
+ try {
117
+ const result = await this.send(message);
118
+ results.push(result);
119
+ if (!result.success && result.error) {
120
+ errors.push(result.error);
121
+ }
122
+ }
123
+ catch (error) {
124
+ const errorMessage = error instanceof Error ? error.message : 'Unknown error';
125
+ errors.push(errorMessage);
126
+ results.push({
127
+ success: false,
128
+ error: errorMessage,
129
+ timestamp: new Date()
130
+ });
131
+ }
132
+ }
133
+ const successful = results.filter(r => r.success).length;
134
+ const failed = results.length - successful;
135
+ const totalRetries = results.reduce((sum, r) => sum + (r.retryCount || 0), 0);
136
+ const avgDeliveryTime = results
137
+ .filter(r => r.deliveryTime)
138
+ .reduce((sum, r) => sum + (r.deliveryTime || 0), 0) / (successful || 1);
139
+ return {
140
+ totalEmails: messages.length,
141
+ successful,
142
+ failed,
143
+ results,
144
+ errors,
145
+ summary: {
146
+ successRate: (successful / messages.length) * 100,
147
+ averageDeliveryTime: avgDeliveryTime,
148
+ totalRetries
149
+ }
150
+ };
151
+ }
152
+ /**
153
+ * Validate template syntax
154
+ */
155
+ async validateTemplate(template) {
156
+ try {
157
+ // Simple template validation
158
+ const variables = this.extractTemplateVariables(template);
159
+ const hasErrors = template.includes('{{}}') || template.includes('{{ }}');
160
+ return {
161
+ isValid: !hasErrors,
162
+ errors: hasErrors ? ['Empty template variables found'] : [],
163
+ warnings: [],
164
+ requiredVariables: variables,
165
+ optionalVariables: []
166
+ };
167
+ }
168
+ catch (error) {
169
+ return {
170
+ isValid: false,
171
+ errors: [error instanceof Error ? error.message : 'Template validation failed'],
172
+ warnings: [],
173
+ requiredVariables: [],
174
+ optionalVariables: []
175
+ };
176
+ }
177
+ }
178
+ /**
179
+ * Get email delivery metrics
180
+ */
181
+ async getMetrics() {
182
+ // Simplified metrics - in real implementation would aggregate from storage
183
+ return {
184
+ totalSent: 0,
185
+ totalDelivered: 0,
186
+ totalFailed: 0,
187
+ successRate: 0,
188
+ averageDeliveryTime: 0,
189
+ retryRate: 0,
190
+ bounceRate: 0,
191
+ complaintRate: 0,
192
+ providerStats: {}
193
+ };
194
+ }
195
+ /**
196
+ * Get delivery status
197
+ */
198
+ async getDeliveryStatus(messageId) {
199
+ try {
200
+ const retryState = await this.retryStorage.get(messageId);
201
+ if (!retryState) {
202
+ return null;
203
+ }
204
+ return {
205
+ messageId,
206
+ status: retryState.status === 'completed' ? types_1.DeliveryStatus.SENT :
207
+ retryState.status === 'failed' ? types_1.DeliveryStatus.FAILED : types_1.DeliveryStatus.PENDING,
208
+ timestamp: retryState.lastAttempt || new Date(),
209
+ recipient: 'unknown',
210
+ subject: 'unknown',
211
+ provider: this.config.provider.type,
212
+ retryCount: retryState.attempt,
213
+ error: retryState.error?.message,
214
+ events: []
215
+ };
216
+ }
217
+ catch {
218
+ return null;
219
+ }
220
+ }
221
+ /**
222
+ * Test configuration
223
+ */
224
+ async testConfiguration() {
225
+ try {
226
+ // Simple configuration validation
227
+ if (!this.config.provider.type) {
228
+ return { success: false, error: 'Provider type not specified' };
229
+ }
230
+ if (!this.config.defaults.from) {
231
+ return { success: false, error: 'Default from address not specified' };
232
+ }
233
+ return { success: true };
234
+ }
235
+ catch (error) {
236
+ return {
237
+ success: false,
238
+ error: error instanceof Error ? error.message : 'Configuration test failed'
239
+ };
240
+ }
241
+ }
242
+ // Private helper methods
243
+ normalizeConfig(config) {
244
+ return {
245
+ provider: config.provider,
246
+ defaults: {
247
+ from: config.defaults?.from || 'noreply@example.com',
248
+ replyTo: config.defaults?.replyTo || '',
249
+ subject: config.defaults?.subject || ''
250
+ },
251
+ templates: {
252
+ engine: config.templates?.engine || 'liquid',
253
+ templateDir: config.templates?.templateDir || './templates',
254
+ cache: config.templates?.cache ?? true
255
+ },
256
+ magicLink: {
257
+ secret: config.magicLink?.secret || 'default-secret',
258
+ expirationMinutes: config.magicLink?.expirationMinutes || 60,
259
+ issuer: config.magicLink?.issuer || 'EmailService'
260
+ },
261
+ retry: {
262
+ maxRetries: config.retry?.maxRetries || 3,
263
+ initialDelayMs: config.retry?.initialDelayMs || 1000,
264
+ maxDelayMs: config.retry?.maxDelayMs || 30000,
265
+ jitter: config.retry?.jitter ?? true,
266
+ enableMetrics: config.retry?.enableMetrics ?? true
267
+ },
268
+ rateLimit: {
269
+ maxEmailsPerMinute: config.rateLimit?.maxEmailsPerMinute || 60,
270
+ maxEmailsPerHour: config.rateLimit?.maxEmailsPerHour || 1000
271
+ }
272
+ };
273
+ }
274
+ applyDefaults(message) {
275
+ return {
276
+ ...message,
277
+ from: message.from || this.config.defaults.from,
278
+ replyTo: message.replyTo || this.config.defaults.replyTo,
279
+ subject: message.subject || this.config.defaults?.subject || '',
280
+ priority: message.priority || types_1.EmailPriority.NORMAL
281
+ };
282
+ }
283
+ validateMessage(message) {
284
+ if (!message.to || (Array.isArray(message.to) && message.to.length === 0)) {
285
+ throw new Error('Email message must have at least one recipient');
286
+ }
287
+ if (!message.subject) {
288
+ throw new Error('Email message must have a subject');
289
+ }
290
+ if (!message.text && !message.html) {
291
+ throw new Error('Email message must have either text or HTML content');
292
+ }
293
+ if (!message.from) {
294
+ throw new Error('Email message must have a sender address');
295
+ }
296
+ }
297
+ async sendWithRetry(message, messageId) {
298
+ let attempt = 1;
299
+ let lastError = null;
300
+ // Create initial retry state
301
+ const retryState = (0, retry_state_1.createRetryState)({
302
+ id: messageId,
303
+ maxRetries: this.config.retry.maxRetries || 3,
304
+ initialDelayMs: this.config.retry.initialDelayMs || 1000
305
+ });
306
+ await this.retryStorage.set(messageId, retryState);
307
+ while (attempt <= (this.config.retry.maxRetries || 3)) {
308
+ try {
309
+ // Simulate email sending
310
+ const success = Math.random() > 0.2; // 80% success rate simulation
311
+ if (success) {
312
+ return {
313
+ success: true,
314
+ messageId,
315
+ provider: this.config.provider.type,
316
+ retryCount: attempt - 1,
317
+ timestamp: new Date()
318
+ };
319
+ }
320
+ else {
321
+ throw new Error('Simulated email sending failure');
322
+ }
323
+ }
324
+ catch (error) {
325
+ lastError = error instanceof Error ? error : new Error('Unknown error');
326
+ if ((0, retry_policy_1.shouldRetry)(attempt - 1, lastError, { maxRetries: this.config.retry.maxRetries || 3 })) {
327
+ const delay = (0, retry_policy_1.calculateRetryDelay)(attempt - 1, {
328
+ initialDelayMs: this.config.retry.initialDelayMs || 1000,
329
+ maxDelayMs: this.config.retry.maxDelayMs || 30000,
330
+ jitter: this.config.retry.jitter ?? true
331
+ });
332
+ await this.delay(delay);
333
+ attempt++;
334
+ }
335
+ else {
336
+ break;
337
+ }
338
+ }
339
+ }
340
+ return {
341
+ success: false,
342
+ error: lastError?.message || 'Failed to send email after retries',
343
+ messageId,
344
+ provider: this.config.provider.type,
345
+ retryCount: attempt - 1,
346
+ timestamp: new Date()
347
+ };
348
+ }
349
+ renderTemplate(template, data) {
350
+ // Simple template rendering
351
+ let html = template;
352
+ let text = template;
353
+ // Replace variables in format {{ variable }}
354
+ Object.entries(data).forEach(([key, value]) => {
355
+ const placeholder = new RegExp(`{{\\s*${key}\\s*}}`, 'g');
356
+ const valueStr = String(value);
357
+ html = html.replace(placeholder, valueStr);
358
+ text = text.replace(placeholder, valueStr);
359
+ });
360
+ return { html, text };
361
+ }
362
+ generateMagicLink(config) {
363
+ const token = Buffer.from(JSON.stringify({
364
+ email: config.recipient,
365
+ purpose: config.purpose,
366
+ timestamp: Date.now(),
367
+ random: Math.random()
368
+ })).toString('base64url');
369
+ return `${config.redirectUrl}?token=${token}`;
370
+ }
371
+ extractTokenFromLink(link) {
372
+ const url = new URL(link);
373
+ return url.searchParams.get('token') || '';
374
+ }
375
+ createMagicLinkHtml(link, purpose) {
376
+ return `
377
+ <html>
378
+ <body style="font-family: Arial, sans-serif; max-width: 600px; margin: 0 auto;">
379
+ <h2>Your Magic Link</h2>
380
+ <p>Click the link below to ${purpose}:</p>
381
+ <p><a href="${link}" style="background-color: #007bff; color: white; padding: 10px 20px; text-decoration: none; border-radius: 5px;">Continue</a></p>
382
+ <p>If the button doesn't work, copy and paste this link:</p>
383
+ <p><code>${link}</code></p>
384
+ <p><small>This link will expire in ${this.config.magicLink.expirationMinutes} minutes.</small></p>
385
+ </body>
386
+ </html>
387
+ `;
388
+ }
389
+ createMagicLinkText(link, purpose) {
390
+ return `
391
+ Your Magic Link
392
+
393
+ Click the link below to ${purpose}:
394
+ ${link}
395
+
396
+ This link will expire in ${this.config.magicLink.expirationMinutes} minutes.
397
+ `.trim();
398
+ }
399
+ extractTemplateVariables(template) {
400
+ const matches = template.match(/{{\\s*([^\\s}]+)\\s*}}/g);
401
+ if (!matches)
402
+ return [];
403
+ return matches.map(match => {
404
+ const variable = match.replace(/{{\\s*|\\s*}}/g, '');
405
+ return variable;
406
+ });
407
+ }
408
+ generateMessageId() {
409
+ return `email-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;
410
+ }
411
+ async delay(ms) {
412
+ return new Promise(resolve => setTimeout(resolve, ms));
413
+ }
414
+ }
415
+ exports.EmailService = EmailService;
416
+ //# sourceMappingURL=simple-email-service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"simple-email-service.js","sourceRoot":"","sources":["../src/simple-email-service.ts"],"names":[],"mappings":"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"}