@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.
- package/LICENSE +5 -0
- package/README.md +534 -0
- package/dist/email-manager.d.ts +134 -0
- package/dist/email-manager.d.ts.map +1 -0
- package/dist/email-manager.js +360 -0
- package/dist/email-manager.js.map +1 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +17 -0
- package/dist/index.js.map +1 -0
- package/dist/managers/email-analytics.d.ts +92 -0
- package/dist/managers/email-analytics.d.ts.map +1 -0
- package/dist/managers/email-analytics.js +375 -0
- package/dist/managers/email-analytics.js.map +1 -0
- package/dist/managers/email-scheduler.d.ts +81 -0
- package/dist/managers/email-scheduler.d.ts.map +1 -0
- package/dist/managers/email-scheduler.js +288 -0
- package/dist/managers/email-scheduler.js.map +1 -0
- package/dist/managers/provider-manager.d.ts +104 -0
- package/dist/managers/provider-manager.d.ts.map +1 -0
- package/dist/managers/provider-manager.js +436 -0
- package/dist/managers/provider-manager.js.map +1 -0
- package/dist/managers/template-manager.d.ts +65 -0
- package/dist/managers/template-manager.d.ts.map +1 -0
- package/dist/managers/template-manager.js +314 -0
- package/dist/managers/template-manager.js.map +1 -0
- package/dist/types.d.ts +507 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +60 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/simple-template-engine.d.ts +27 -0
- package/dist/utils/simple-template-engine.d.ts.map +1 -0
- package/dist/utils/simple-template-engine.js +61 -0
- package/dist/utils/simple-template-engine.js.map +1 -0
- 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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"}
|