@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,314 @@
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 { EmailTemplateSchema } from '../types.js';
9
+ /**
10
+ * Template Management System
11
+ * Handles CRUD operations for email templates and rendering
12
+ */
13
+ export class TemplateManager {
14
+ constructor(templateEngine) {
15
+ this.templates = new Map();
16
+ this.templateEngine = templateEngine;
17
+ }
18
+ /**
19
+ * Create a new email template
20
+ */
21
+ async createTemplate(template) {
22
+ try {
23
+ // Validate template structure
24
+ const validation = this.validateTemplate(template);
25
+ if (!validation.isValid) {
26
+ return {
27
+ success: false,
28
+ errors: validation.errors
29
+ };
30
+ }
31
+ // Check for conflicts
32
+ if (this.templates.has(template.id)) {
33
+ return {
34
+ success: false,
35
+ errors: [`Template with ID ${template.id} already exists`]
36
+ };
37
+ }
38
+ // Create full template with timestamps
39
+ const fullTemplate = {
40
+ ...template,
41
+ createdAt: new Date(),
42
+ updatedAt: new Date(),
43
+ version: template.version || '1.0.0'
44
+ };
45
+ // Store template
46
+ this.templates.set(template.id, fullTemplate);
47
+ return {
48
+ success: true,
49
+ template: fullTemplate,
50
+ message: 'Template created successfully'
51
+ };
52
+ }
53
+ catch (error) {
54
+ return {
55
+ success: false,
56
+ errors: [error instanceof Error ? error.message : 'Unknown error occurred']
57
+ };
58
+ }
59
+ }
60
+ /**
61
+ * Update an existing template
62
+ */
63
+ async updateTemplate(templateId, updates) {
64
+ try {
65
+ const existingTemplate = this.templates.get(templateId);
66
+ if (!existingTemplate) {
67
+ return {
68
+ success: false,
69
+ errors: [`Template not found: ${templateId}`]
70
+ };
71
+ }
72
+ // Create updated template
73
+ const updatedTemplate = {
74
+ ...existingTemplate,
75
+ ...updates,
76
+ id: templateId, // Prevent ID changes
77
+ updatedAt: new Date(),
78
+ version: this.incrementVersion(existingTemplate.version)
79
+ };
80
+ // Validate updated template
81
+ const validation = this.validateTemplate(updatedTemplate);
82
+ if (!validation.isValid) {
83
+ return {
84
+ success: false,
85
+ errors: validation.errors
86
+ };
87
+ }
88
+ // Store updated template
89
+ this.templates.set(templateId, updatedTemplate);
90
+ return {
91
+ success: true,
92
+ template: updatedTemplate,
93
+ message: 'Template updated successfully'
94
+ };
95
+ }
96
+ catch (error) {
97
+ return {
98
+ success: false,
99
+ errors: [error instanceof Error ? error.message : 'Unknown error occurred']
100
+ };
101
+ }
102
+ }
103
+ /**
104
+ * Delete a template
105
+ */
106
+ async deleteTemplate(templateId) {
107
+ try {
108
+ if (!this.templates.has(templateId)) {
109
+ return {
110
+ success: false,
111
+ error: `Template not found: ${templateId}`
112
+ };
113
+ }
114
+ this.templates.delete(templateId);
115
+ return {
116
+ success: true,
117
+ message: 'Template deleted successfully'
118
+ };
119
+ }
120
+ catch (error) {
121
+ return {
122
+ success: false,
123
+ error: error instanceof Error ? error.message : 'Unknown error occurred'
124
+ };
125
+ }
126
+ }
127
+ /**
128
+ * Get a template by ID
129
+ */
130
+ async getTemplate(templateId) {
131
+ return this.templates.get(templateId) || null;
132
+ }
133
+ /**
134
+ * List templates with filtering and pagination
135
+ */
136
+ async listTemplates(options = {}) {
137
+ const { page = 1, pageSize = 20, category, active, search } = options;
138
+ let filteredTemplates = Array.from(this.templates.values());
139
+ // Apply filters
140
+ if (category) {
141
+ filteredTemplates = filteredTemplates.filter(t => t.category === category);
142
+ }
143
+ if (typeof active === 'boolean') {
144
+ filteredTemplates = filteredTemplates.filter(t => t.isActive === active);
145
+ }
146
+ if (search) {
147
+ const searchLower = search.toLowerCase();
148
+ filteredTemplates = filteredTemplates.filter(t => t.name.toLowerCase().includes(searchLower) ||
149
+ t.subject.toLowerCase().includes(searchLower) ||
150
+ (t.category && t.category.toLowerCase().includes(searchLower)));
151
+ }
152
+ // Sort by updated date (newest first)
153
+ filteredTemplates.sort((a, b) => b.updatedAt.getTime() - a.updatedAt.getTime());
154
+ // Apply pagination
155
+ const startIndex = (page - 1) * pageSize;
156
+ const paginatedTemplates = filteredTemplates.slice(startIndex, startIndex + pageSize);
157
+ return {
158
+ templates: paginatedTemplates,
159
+ total: filteredTemplates.length,
160
+ page,
161
+ pageSize
162
+ };
163
+ }
164
+ /**
165
+ * Render a template with context data
166
+ */
167
+ async renderTemplate(templateId, context) {
168
+ const template = this.templates.get(templateId);
169
+ if (!template) {
170
+ throw new Error(`Template not found: ${templateId}`);
171
+ }
172
+ if (!template.isActive) {
173
+ throw new Error(`Template is inactive: ${templateId}`);
174
+ }
175
+ try {
176
+ // Render HTML template
177
+ const html = await this.templateEngine.render(template.htmlTemplate, context);
178
+ // Render subject
179
+ const subject = await this.templateEngine.render(template.subject, context);
180
+ // Render text template if available
181
+ let text;
182
+ if (template.textTemplate) {
183
+ text = await this.templateEngine.render(template.textTemplate, context);
184
+ }
185
+ return {
186
+ subject,
187
+ html,
188
+ text,
189
+ templateId,
190
+ version: template.version
191
+ };
192
+ }
193
+ catch (error) {
194
+ throw new Error(`Template rendering failed: ${error instanceof Error ? error.message : 'Unknown error'}`);
195
+ }
196
+ }
197
+ /**
198
+ * Validate template structure and syntax
199
+ */
200
+ validateTemplate(template) {
201
+ const errors = [];
202
+ try {
203
+ // Use Zod schema validation
204
+ EmailTemplateSchema.parse({
205
+ ...template,
206
+ createdAt: template.createdAt || new Date(),
207
+ updatedAt: template.updatedAt || new Date()
208
+ });
209
+ }
210
+ catch (error) {
211
+ if (error.errors) {
212
+ errors.push(...error.errors.map((e) => `${e.path.join('.')}: ${e.message}`));
213
+ }
214
+ else {
215
+ errors.push('Template validation failed');
216
+ }
217
+ }
218
+ // Additional business logic validation
219
+ if (template.variables) {
220
+ const duplicateVars = this.findDuplicateVariables(template.variables);
221
+ if (duplicateVars.length > 0) {
222
+ errors.push(`Duplicate variables found: ${duplicateVars.join(', ')}`);
223
+ }
224
+ }
225
+ // Template syntax validation
226
+ if (template.htmlTemplate) {
227
+ try {
228
+ this.templateEngine.validate(template.htmlTemplate);
229
+ }
230
+ catch (error) {
231
+ errors.push(`HTML template validation failed: ${error instanceof Error ? error.message : 'Unknown error'}`);
232
+ }
233
+ }
234
+ if (template.textTemplate) {
235
+ try {
236
+ this.templateEngine.validate(template.textTemplate);
237
+ }
238
+ catch (error) {
239
+ errors.push(`Text template validation failed: ${error instanceof Error ? error.message : 'Unknown error'}`);
240
+ }
241
+ }
242
+ if (template.subject) {
243
+ try {
244
+ this.templateEngine.validate(template.subject);
245
+ }
246
+ catch (error) {
247
+ errors.push(`Subject template validation failed: ${error instanceof Error ? error.message : 'Unknown error'}`);
248
+ }
249
+ }
250
+ return {
251
+ isValid: errors.length === 0,
252
+ errors
253
+ };
254
+ }
255
+ /**
256
+ * Find duplicate variable names
257
+ */
258
+ findDuplicateVariables(variables) {
259
+ const seen = new Set();
260
+ const duplicates = [];
261
+ for (const variable of variables) {
262
+ if (variable.name) {
263
+ if (seen.has(variable.name)) {
264
+ duplicates.push(variable.name);
265
+ }
266
+ else {
267
+ seen.add(variable.name);
268
+ }
269
+ }
270
+ }
271
+ return duplicates;
272
+ }
273
+ /**
274
+ * Increment semantic version
275
+ */
276
+ incrementVersion(version) {
277
+ const parts = version.split('.').map(Number);
278
+ if (parts.length !== 3 || parts.some(isNaN)) {
279
+ return '1.0.1'; // Default if invalid version
280
+ }
281
+ parts[2]++; // Increment patch version
282
+ return parts.join('.');
283
+ }
284
+ /**
285
+ * Get template statistics
286
+ */
287
+ getStats() {
288
+ const templates = Array.from(this.templates.values());
289
+ return {
290
+ total: templates.length,
291
+ active: templates.filter(t => t.isActive).length,
292
+ inactive: templates.filter(t => !t.isActive).length,
293
+ byCategory: this.groupByCategory(templates)
294
+ };
295
+ }
296
+ /**
297
+ * Group templates by category
298
+ */
299
+ groupByCategory(templates) {
300
+ const grouped = {};
301
+ for (const template of templates) {
302
+ const category = template.category || 'uncategorized';
303
+ grouped[category] = (grouped[category] || 0) + 1;
304
+ }
305
+ return grouped;
306
+ }
307
+ /**
308
+ * Clear all templates (for testing)
309
+ */
310
+ clear() {
311
+ this.templates.clear();
312
+ }
313
+ }
314
+ //# sourceMappingURL=template-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"template-manager.js","sourceRoot":"","sources":["../../src/managers/template-manager.ts"],"names":[],"mappings":"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"}