@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,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"}
|