@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,507 @@
1
+ import { z } from 'zod';
2
+ /**
3
+ * Email Manager Configuration
4
+ */
5
+ export interface EmailManagerConfig {
6
+ defaultProvider?: string;
7
+ providers: EmailProvider[];
8
+ templates?: EmailTemplate[];
9
+ scheduling?: SchedulingConfig;
10
+ analytics?: AnalyticsConfig;
11
+ retry?: RetryConfig;
12
+ }
13
+ /**
14
+ * Email Data Interface
15
+ */
16
+ export interface EmailData {
17
+ to: string | string[];
18
+ cc?: string | string[];
19
+ bcc?: string | string[];
20
+ subject: string;
21
+ text?: string;
22
+ html?: string;
23
+ templateId?: string;
24
+ templateContext?: TemplateContext;
25
+ attachments?: Attachment[];
26
+ metadata?: Record<string, any>;
27
+ provider?: string;
28
+ priority?: 'low' | 'normal' | 'high';
29
+ }
30
+ /**
31
+ * Email Template Interface
32
+ */
33
+ export interface EmailTemplate {
34
+ id: string;
35
+ name: string;
36
+ subject: string;
37
+ htmlTemplate: string;
38
+ textTemplate?: string;
39
+ variables: TemplateVariable[];
40
+ category?: string;
41
+ version: string;
42
+ isActive: boolean;
43
+ createdAt: Date;
44
+ updatedAt: Date;
45
+ }
46
+ /**
47
+ * Template Variable Definition
48
+ */
49
+ export interface TemplateVariable {
50
+ name: string;
51
+ type: 'string' | 'number' | 'boolean' | 'object';
52
+ required: boolean;
53
+ description?: string;
54
+ defaultValue?: any;
55
+ }
56
+ /**
57
+ * Template Context for Rendering
58
+ */
59
+ export interface TemplateContext {
60
+ [key: string]: any;
61
+ }
62
+ /**
63
+ * Email Provider Configuration
64
+ */
65
+ export interface EmailProvider {
66
+ id: string;
67
+ name: string;
68
+ type: 'sendgrid' | 'mailgun' | 'ses' | 'smtp' | 'postmark';
69
+ config: ProviderConfig;
70
+ isActive: boolean;
71
+ priority: number;
72
+ rateLimit?: RateLimit;
73
+ }
74
+ /**
75
+ * Provider-specific Configuration
76
+ */
77
+ export interface ProviderConfig {
78
+ [key: string]: any;
79
+ }
80
+ /**
81
+ * Rate Limiting Configuration
82
+ */
83
+ export interface RateLimit {
84
+ maxPerMinute: number;
85
+ maxPerHour: number;
86
+ maxPerDay: number;
87
+ }
88
+ /**
89
+ * Email Attachment
90
+ */
91
+ export interface Attachment {
92
+ filename: string;
93
+ content: Buffer | string;
94
+ contentType: string;
95
+ contentDisposition?: 'attachment' | 'inline';
96
+ cid?: string;
97
+ }
98
+ /**
99
+ * Send Result
100
+ */
101
+ export interface SendResult {
102
+ success: boolean;
103
+ messageId?: string;
104
+ provider: string;
105
+ sentAt: Date;
106
+ errors?: SendError[];
107
+ metadata?: Record<string, any>;
108
+ }
109
+ /**
110
+ * Send Error
111
+ */
112
+ export interface SendError {
113
+ code: string;
114
+ message: string;
115
+ recipient?: string;
116
+ }
117
+ /**
118
+ * Schedule Result
119
+ */
120
+ export interface ScheduleResult {
121
+ success: boolean;
122
+ scheduleId: string;
123
+ scheduledFor: Date;
124
+ emailId: string;
125
+ status: 'scheduled' | 'cancelled' | 'sent';
126
+ }
127
+ /**
128
+ * Scheduled Email
129
+ */
130
+ export interface ScheduledEmail {
131
+ id: string;
132
+ email: EmailData;
133
+ scheduledFor: Date;
134
+ status: 'scheduled' | 'cancelled' | 'sent' | 'failed';
135
+ createdAt: Date;
136
+ sentAt?: Date;
137
+ result?: SendResult;
138
+ error?: string;
139
+ }
140
+ /**
141
+ * Template Result
142
+ */
143
+ export interface TemplateResult {
144
+ success: boolean;
145
+ template?: EmailTemplate;
146
+ errors?: string[];
147
+ message?: string;
148
+ }
149
+ /**
150
+ * Rendered Template
151
+ */
152
+ export interface RenderedTemplate {
153
+ subject: string;
154
+ html: string;
155
+ text?: string;
156
+ templateId: string;
157
+ version: string;
158
+ }
159
+ /**
160
+ * Validation Result
161
+ */
162
+ export interface ValidationResult {
163
+ isValid: boolean;
164
+ errors: string[];
165
+ }
166
+ /**
167
+ * Provider Result
168
+ */
169
+ export interface ProviderResult {
170
+ success: boolean;
171
+ provider?: EmailProvider;
172
+ errors?: string[];
173
+ message?: string;
174
+ }
175
+ /**
176
+ * Delete Result
177
+ */
178
+ export interface DeleteResult {
179
+ success: boolean;
180
+ message?: string;
181
+ error?: string;
182
+ }
183
+ /**
184
+ * Template List
185
+ */
186
+ export interface TemplateList {
187
+ templates: EmailTemplate[];
188
+ total: number;
189
+ page: number;
190
+ pageSize: number;
191
+ }
192
+ /**
193
+ * Provider List
194
+ */
195
+ export interface ProviderList {
196
+ providers: EmailProvider[];
197
+ total: number;
198
+ }
199
+ /**
200
+ * List Options
201
+ */
202
+ export interface ListOptions {
203
+ page?: number;
204
+ pageSize?: number;
205
+ category?: string;
206
+ active?: boolean;
207
+ search?: string;
208
+ }
209
+ /**
210
+ * Email Statistics
211
+ */
212
+ export interface EmailStats {
213
+ emailId: string;
214
+ sent: number;
215
+ delivered: number;
216
+ opened: number;
217
+ clicked: number;
218
+ bounced: number;
219
+ deliveryRate: number;
220
+ openRate: number;
221
+ clickRate: number;
222
+ }
223
+ /**
224
+ * Delivery Report
225
+ */
226
+ export interface DeliveryReport {
227
+ period: {
228
+ startDate: Date;
229
+ endDate: Date;
230
+ };
231
+ totalSent: number;
232
+ totalDelivered: number;
233
+ totalOpened: number;
234
+ totalClicked: number;
235
+ totalBounced: number;
236
+ deliveryRate: number;
237
+ openRate: number;
238
+ clickRate: number;
239
+ bounceRate: number;
240
+ }
241
+ /**
242
+ * Bounce Report
243
+ */
244
+ export interface BounceReport {
245
+ period: {
246
+ startDate: Date;
247
+ endDate: Date;
248
+ };
249
+ totalBounces: number;
250
+ bouncesByReason: Record<string, number>;
251
+ bouncesByProvider: Record<string, number>;
252
+ bounceRate: number;
253
+ }
254
+ /**
255
+ * Report Options
256
+ */
257
+ export interface ReportOptions {
258
+ startDate?: Date;
259
+ endDate?: Date;
260
+ provider?: string;
261
+ templateId?: string;
262
+ }
263
+ /**
264
+ * Provider Status
265
+ */
266
+ export interface ProviderStatus {
267
+ id: string;
268
+ isActive: boolean;
269
+ isHealthy: boolean;
270
+ lastHealthCheck: Date;
271
+ currentUsage: {
272
+ minute: number;
273
+ hour: number;
274
+ day: number;
275
+ };
276
+ rateLimit?: RateLimit;
277
+ }
278
+ /**
279
+ * Test Result
280
+ */
281
+ export interface TestResult {
282
+ success: boolean;
283
+ message: string;
284
+ details?: any;
285
+ }
286
+ /**
287
+ * Email Event for Analytics
288
+ */
289
+ export interface EmailEvent {
290
+ type: 'sent' | 'delivered' | 'opened' | 'clicked' | 'bounced';
291
+ emailId: string;
292
+ recipient: string;
293
+ provider?: string;
294
+ url?: string;
295
+ reason?: string;
296
+ timestamp: Date;
297
+ }
298
+ /**
299
+ * Cancel Result
300
+ */
301
+ export interface CancelResult {
302
+ success: boolean;
303
+ error?: string;
304
+ message?: string;
305
+ }
306
+ /**
307
+ * Scheduling Configuration
308
+ */
309
+ export interface SchedulingConfig {
310
+ enabled: boolean;
311
+ checkIntervalMs: number;
312
+ maxRetries: number;
313
+ retryDelayMs: number;
314
+ }
315
+ /**
316
+ * Analytics Configuration
317
+ */
318
+ export interface AnalyticsConfig {
319
+ enabled: boolean;
320
+ trackOpens: boolean;
321
+ trackClicks: boolean;
322
+ trackBounces: boolean;
323
+ maxEvents: number;
324
+ }
325
+ /**
326
+ * Retry Configuration
327
+ */
328
+ export interface RetryConfig {
329
+ maxRetries: number;
330
+ initialDelayMs: number;
331
+ maxDelayMs: number;
332
+ backoffFactor: number;
333
+ jitter: boolean;
334
+ }
335
+ export declare const EmailDataSchema: z.ZodObject<{
336
+ to: z.ZodUnion<[z.ZodString, z.ZodArray<z.ZodString, "many">]>;
337
+ cc: z.ZodOptional<z.ZodUnion<[z.ZodString, z.ZodArray<z.ZodString, "many">]>>;
338
+ bcc: z.ZodOptional<z.ZodUnion<[z.ZodString, z.ZodArray<z.ZodString, "many">]>>;
339
+ subject: z.ZodString;
340
+ text: z.ZodOptional<z.ZodString>;
341
+ html: z.ZodOptional<z.ZodString>;
342
+ templateId: z.ZodOptional<z.ZodString>;
343
+ templateContext: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodAny>>;
344
+ attachments: z.ZodOptional<z.ZodArray<z.ZodObject<{
345
+ filename: z.ZodString;
346
+ content: z.ZodUnion<[z.ZodString, z.ZodType<Buffer<ArrayBufferLike>, z.ZodTypeDef, Buffer<ArrayBufferLike>>]>;
347
+ contentType: z.ZodString;
348
+ }, "strip", z.ZodTypeAny, {
349
+ filename: string;
350
+ content: string | Buffer<ArrayBufferLike>;
351
+ contentType: string;
352
+ }, {
353
+ filename: string;
354
+ content: string | Buffer<ArrayBufferLike>;
355
+ contentType: string;
356
+ }>, "many">>;
357
+ metadata: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodAny>>;
358
+ provider: z.ZodOptional<z.ZodString>;
359
+ priority: z.ZodOptional<z.ZodEnum<["low", "normal", "high"]>>;
360
+ }, "strip", z.ZodTypeAny, {
361
+ to: string | string[];
362
+ subject: string;
363
+ cc?: string | string[] | undefined;
364
+ bcc?: string | string[] | undefined;
365
+ text?: string | undefined;
366
+ html?: string | undefined;
367
+ templateId?: string | undefined;
368
+ templateContext?: Record<string, any> | undefined;
369
+ attachments?: {
370
+ filename: string;
371
+ content: string | Buffer<ArrayBufferLike>;
372
+ contentType: string;
373
+ }[] | undefined;
374
+ metadata?: Record<string, any> | undefined;
375
+ provider?: string | undefined;
376
+ priority?: "low" | "normal" | "high" | undefined;
377
+ }, {
378
+ to: string | string[];
379
+ subject: string;
380
+ cc?: string | string[] | undefined;
381
+ bcc?: string | string[] | undefined;
382
+ text?: string | undefined;
383
+ html?: string | undefined;
384
+ templateId?: string | undefined;
385
+ templateContext?: Record<string, any> | undefined;
386
+ attachments?: {
387
+ filename: string;
388
+ content: string | Buffer<ArrayBufferLike>;
389
+ contentType: string;
390
+ }[] | undefined;
391
+ metadata?: Record<string, any> | undefined;
392
+ provider?: string | undefined;
393
+ priority?: "low" | "normal" | "high" | undefined;
394
+ }>;
395
+ export declare const EmailTemplateSchema: z.ZodObject<{
396
+ id: z.ZodString;
397
+ name: z.ZodString;
398
+ subject: z.ZodString;
399
+ htmlTemplate: z.ZodString;
400
+ textTemplate: z.ZodOptional<z.ZodString>;
401
+ variables: z.ZodArray<z.ZodObject<{
402
+ name: z.ZodString;
403
+ type: z.ZodEnum<["string", "number", "boolean", "object"]>;
404
+ required: z.ZodBoolean;
405
+ description: z.ZodOptional<z.ZodString>;
406
+ defaultValue: z.ZodOptional<z.ZodAny>;
407
+ }, "strip", z.ZodTypeAny, {
408
+ type: "string" | "number" | "boolean" | "object";
409
+ name: string;
410
+ required: boolean;
411
+ description?: string | undefined;
412
+ defaultValue?: any;
413
+ }, {
414
+ type: "string" | "number" | "boolean" | "object";
415
+ name: string;
416
+ required: boolean;
417
+ description?: string | undefined;
418
+ defaultValue?: any;
419
+ }>, "many">;
420
+ category: z.ZodOptional<z.ZodString>;
421
+ version: z.ZodString;
422
+ isActive: z.ZodBoolean;
423
+ createdAt: z.ZodDate;
424
+ updatedAt: z.ZodDate;
425
+ }, "strip", z.ZodTypeAny, {
426
+ subject: string;
427
+ id: string;
428
+ name: string;
429
+ htmlTemplate: string;
430
+ variables: {
431
+ type: "string" | "number" | "boolean" | "object";
432
+ name: string;
433
+ required: boolean;
434
+ description?: string | undefined;
435
+ defaultValue?: any;
436
+ }[];
437
+ version: string;
438
+ isActive: boolean;
439
+ createdAt: Date;
440
+ updatedAt: Date;
441
+ textTemplate?: string | undefined;
442
+ category?: string | undefined;
443
+ }, {
444
+ subject: string;
445
+ id: string;
446
+ name: string;
447
+ htmlTemplate: string;
448
+ variables: {
449
+ type: "string" | "number" | "boolean" | "object";
450
+ name: string;
451
+ required: boolean;
452
+ description?: string | undefined;
453
+ defaultValue?: any;
454
+ }[];
455
+ version: string;
456
+ isActive: boolean;
457
+ createdAt: Date;
458
+ updatedAt: Date;
459
+ textTemplate?: string | undefined;
460
+ category?: string | undefined;
461
+ }>;
462
+ export declare const EmailProviderSchema: z.ZodObject<{
463
+ id: z.ZodString;
464
+ name: z.ZodString;
465
+ type: z.ZodEnum<["sendgrid", "mailgun", "ses", "smtp", "postmark"]>;
466
+ config: z.ZodRecord<z.ZodString, z.ZodAny>;
467
+ isActive: z.ZodBoolean;
468
+ priority: z.ZodNumber;
469
+ rateLimit: z.ZodOptional<z.ZodObject<{
470
+ maxPerMinute: z.ZodNumber;
471
+ maxPerHour: z.ZodNumber;
472
+ maxPerDay: z.ZodNumber;
473
+ }, "strip", z.ZodTypeAny, {
474
+ maxPerMinute: number;
475
+ maxPerHour: number;
476
+ maxPerDay: number;
477
+ }, {
478
+ maxPerMinute: number;
479
+ maxPerHour: number;
480
+ maxPerDay: number;
481
+ }>>;
482
+ }, "strip", z.ZodTypeAny, {
483
+ type: "sendgrid" | "mailgun" | "ses" | "smtp" | "postmark";
484
+ priority: number;
485
+ id: string;
486
+ name: string;
487
+ isActive: boolean;
488
+ config: Record<string, any>;
489
+ rateLimit?: {
490
+ maxPerMinute: number;
491
+ maxPerHour: number;
492
+ maxPerDay: number;
493
+ } | undefined;
494
+ }, {
495
+ type: "sendgrid" | "mailgun" | "ses" | "smtp" | "postmark";
496
+ priority: number;
497
+ id: string;
498
+ name: string;
499
+ isActive: boolean;
500
+ config: Record<string, any>;
501
+ rateLimit?: {
502
+ maxPerMinute: number;
503
+ maxPerHour: number;
504
+ maxPerDay: number;
505
+ } | undefined;
506
+ }>;
507
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,SAAS,EAAE,aAAa,EAAE,CAAC;IAC3B,SAAS,CAAC,EAAE,aAAa,EAAE,CAAC;IAC5B,UAAU,CAAC,EAAE,gBAAgB,CAAC;IAC9B,SAAS,CAAC,EAAE,eAAe,CAAC;IAC5B,KAAK,CAAC,EAAE,WAAW,CAAC;CACrB;AAED;;GAEG;AACH,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IACtB,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IACvB,GAAG,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,eAAe,CAAC,EAAE,eAAe,CAAC;IAClC,WAAW,CAAC,EAAE,UAAU,EAAE,CAAC;IAC3B,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC/B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,CAAC;CACtC;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,gBAAgB,EAAE,CAAC;IAC9B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,OAAO,CAAC;IAClB,SAAS,EAAE,IAAI,CAAC;IAChB,SAAS,EAAE,IAAI,CAAC;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,QAAQ,GAAG,QAAQ,GAAG,SAAS,GAAG,QAAQ,CAAC;IACjD,QAAQ,EAAE,OAAO,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,GAAG,CAAC;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,UAAU,GAAG,SAAS,GAAG,KAAK,GAAG,MAAM,GAAG,UAAU,CAAC;IAC3D,MAAM,EAAE,cAAc,CAAC;IACvB,QAAQ,EAAE,OAAO,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,SAAS,CAAC;CACvB;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,SAAS;IACxB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,GAAG,MAAM,CAAC;IACzB,WAAW,EAAE,MAAM,CAAC;IACpB,kBAAkB,CAAC,EAAE,YAAY,GAAG,QAAQ,CAAC;IAC7C,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,IAAI,CAAC;IACb,MAAM,CAAC,EAAE,SAAS,EAAE,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CAChC;AAED;;GAEG;AACH,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,IAAI,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,WAAW,GAAG,WAAW,GAAG,MAAM,CAAC;CAC5C;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,SAAS,CAAC;IACjB,YAAY,EAAE,IAAI,CAAC;IACnB,MAAM,EAAE,WAAW,GAAG,WAAW,GAAG,MAAM,GAAG,QAAQ,CAAC;IACtD,SAAS,EAAE,IAAI,CAAC;IAChB,MAAM,CAAC,EAAE,IAAI,CAAC;IACd,MAAM,CAAC,EAAE,UAAU,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,CAAC,EAAE,aAAa,CAAC;IACzB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,CAAC,EAAE,aAAa,CAAC;IACzB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,SAAS,EAAE,aAAa,EAAE,CAAC;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,SAAS,EAAE,aAAa,EAAE,CAAC;IAC3B,KAAK,EAAE,MAAM,CAAC;CACf;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE;QACN,SAAS,EAAE,IAAI,CAAC;QAChB,OAAO,EAAE,IAAI,CAAC;KACf,CAAC;IACF,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE;QACN,SAAS,EAAE,IAAI,CAAC;QAChB,OAAO,EAAE,IAAI,CAAC;KACf,CAAC;IACF,YAAY,EAAE,MAAM,CAAC;IACrB,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACxC,iBAAiB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC1C,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,SAAS,CAAC,EAAE,IAAI,CAAC;IACjB,OAAO,CAAC,EAAE,IAAI,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,OAAO,CAAC;IAClB,SAAS,EAAE,OAAO,CAAC;IACnB,eAAe,EAAE,IAAI,CAAC;IACtB,YAAY,EAAE;QACZ,MAAM,EAAE,MAAM,CAAC;QACf,IAAI,EAAE,MAAM,CAAC;QACb,GAAG,EAAE,MAAM,CAAC;KACb,CAAC;IACF,SAAS,CAAC,EAAE,SAAS,CAAC;CACvB;AAED;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,GAAG,CAAC;CACf;AAED;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,GAAG,WAAW,GAAG,QAAQ,GAAG,SAAS,GAAG,SAAS,CAAC;IAC9D,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,IAAI,CAAC;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,OAAO,CAAC;IACjB,eAAe,EAAE,MAAM,CAAC;IACxB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,EAAE,OAAO,CAAC;IACpB,WAAW,EAAE,OAAO,CAAC;IACrB,YAAY,EAAE,OAAO,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,MAAM,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,OAAO,CAAC;CACjB;AAGD,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAiB1B,CAAC;AAEH,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAkB9B,CAAC;AAEH,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAY9B,CAAC"}
package/dist/types.js ADDED
@@ -0,0 +1,60 @@
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 { z } from 'zod';
9
+ // Zod Validation Schemas
10
+ export const EmailDataSchema = z.object({
11
+ to: z.union([z.string().email(), z.array(z.string().email())]),
12
+ cc: z.union([z.string().email(), z.array(z.string().email())]).optional(),
13
+ bcc: z.union([z.string().email(), z.array(z.string().email())]).optional(),
14
+ subject: z.string().min(1),
15
+ text: z.string().optional(),
16
+ html: z.string().optional(),
17
+ templateId: z.string().optional(),
18
+ templateContext: z.record(z.any()).optional(),
19
+ attachments: z.array(z.object({
20
+ filename: z.string(),
21
+ content: z.union([z.string(), z.instanceof(Buffer)]),
22
+ contentType: z.string()
23
+ })).optional(),
24
+ metadata: z.record(z.any()).optional(),
25
+ provider: z.string().optional(),
26
+ priority: z.enum(['low', 'normal', 'high']).optional()
27
+ });
28
+ export const EmailTemplateSchema = z.object({
29
+ id: z.string().min(1),
30
+ name: z.string().min(1),
31
+ subject: z.string().min(1),
32
+ htmlTemplate: z.string().min(1),
33
+ textTemplate: z.string().optional(),
34
+ variables: z.array(z.object({
35
+ name: z.string(),
36
+ type: z.enum(['string', 'number', 'boolean', 'object']),
37
+ required: z.boolean(),
38
+ description: z.string().optional(),
39
+ defaultValue: z.any().optional()
40
+ })),
41
+ category: z.string().optional(),
42
+ version: z.string().min(1),
43
+ isActive: z.boolean(),
44
+ createdAt: z.date(),
45
+ updatedAt: z.date()
46
+ });
47
+ export const EmailProviderSchema = z.object({
48
+ id: z.string().min(1),
49
+ name: z.string().min(1),
50
+ type: z.enum(['sendgrid', 'mailgun', 'ses', 'smtp', 'postmark']),
51
+ config: z.record(z.any()),
52
+ isActive: z.boolean(),
53
+ priority: z.number().min(1),
54
+ rateLimit: z.object({
55
+ maxPerMinute: z.number().min(1),
56
+ maxPerHour: z.number().min(1),
57
+ maxPerDay: z.number().min(1)
58
+ }).optional()
59
+ });
60
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * Simple template engine for email-manager
3
+ * This provides basic template rendering capabilities until @bernierllc/template-engine is available
4
+ */
5
+ export interface TemplateContext {
6
+ [key: string]: any;
7
+ }
8
+ export declare class SimpleTemplateEngine {
9
+ /**
10
+ * Render a template with context data
11
+ */
12
+ render(template: string, context: TemplateContext): Promise<string>;
13
+ /**
14
+ * Validate template syntax
15
+ */
16
+ validate(template: string): boolean;
17
+ /**
18
+ * Process template with simple variable substitution
19
+ */
20
+ private processTemplate;
21
+ /**
22
+ * Get nested property value from context
23
+ * Supports dot notation like 'user.name'
24
+ */
25
+ private getNestedValue;
26
+ }
27
+ //# sourceMappingURL=simple-template-engine.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"simple-template-engine.d.ts","sourceRoot":"","sources":["../../src/utils/simple-template-engine.ts"],"names":[],"mappings":"AAQA;;;GAGG;AAEH,MAAM,WAAW,eAAe;IAC9B,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACpB;AAED,qBAAa,oBAAoB;IAC/B;;OAEG;IACG,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,MAAM,CAAC;IAIzE;;OAEG;IACH,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;IA2BnC;;OAEG;IACH,OAAO,CAAC,eAAe;IAOvB;;;OAGG;IACH,OAAO,CAAC,cAAc;CAKvB"}
@@ -0,0 +1,61 @@
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
+ export class SimpleTemplateEngine {
9
+ /**
10
+ * Render a template with context data
11
+ */
12
+ async render(template, context) {
13
+ return this.processTemplate(template, context);
14
+ }
15
+ /**
16
+ * Validate template syntax
17
+ */
18
+ validate(template) {
19
+ try {
20
+ // Check for unmatched braces
21
+ const openBraces = (template.match(/\{\{/g) || []).length;
22
+ const closeBraces = (template.match(/\}\}/g) || []).length;
23
+ if (openBraces !== closeBraces) {
24
+ throw new Error('Unmatched template braces');
25
+ }
26
+ // Check for valid variable syntax
27
+ const variables = template.match(/\{\{\s*([^}]+)\s*\}\}/g);
28
+ if (variables) {
29
+ for (const variable of variables) {
30
+ const varName = variable.replace(/\{\{\s*/, '').replace(/\s*\}\}/, '');
31
+ if (!varName || varName.trim() === '') {
32
+ throw new Error('Empty template variable');
33
+ }
34
+ }
35
+ }
36
+ return true;
37
+ }
38
+ catch (error) {
39
+ throw new Error(`Template validation failed: ${error instanceof Error ? error.message : 'Unknown error'}`);
40
+ }
41
+ }
42
+ /**
43
+ * Process template with simple variable substitution
44
+ */
45
+ processTemplate(template, context) {
46
+ return template.replace(/\{\{\s*([^}]+)\s*\}\}/g, (match, variable) => {
47
+ const value = this.getNestedValue(context, variable.trim());
48
+ return value !== undefined ? String(value) : '';
49
+ });
50
+ }
51
+ /**
52
+ * Get nested property value from context
53
+ * Supports dot notation like 'user.name'
54
+ */
55
+ getNestedValue(obj, path) {
56
+ return path.split('.').reduce((current, key) => {
57
+ return current && current[key] !== undefined ? current[key] : undefined;
58
+ }, obj);
59
+ }
60
+ }
61
+ //# sourceMappingURL=simple-template-engine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"simple-template-engine.js","sourceRoot":"","sources":["../../src/utils/simple-template-engine.ts"],"names":[],"mappings":"AAAA;;;;;;EAME;AAWF,MAAM,OAAO,oBAAoB;IAC/B;;OAEG;IACH,KAAK,CAAC,MAAM,CAAC,QAAgB,EAAE,OAAwB;QACrD,OAAO,IAAI,CAAC,eAAe,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IACjD,CAAC;IAED;;OAEG;IACH,QAAQ,CAAC,QAAgB;QACvB,IAAI,CAAC;YACH,6BAA6B;YAC7B,MAAM,UAAU,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC;YAC1D,MAAM,WAAW,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC;YAE3D,IAAI,UAAU,KAAK,WAAW,EAAE,CAAC;gBAC/B,MAAM,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAC;YAC/C,CAAC;YAED,kCAAkC;YAClC,MAAM,SAAS,GAAG,QAAQ,CAAC,KAAK,CAAC,wBAAwB,CAAC,CAAC;YAC3D,IAAI,SAAS,EAAE,CAAC;gBACd,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;oBACjC,MAAM,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;oBACvE,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;wBACtC,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;oBAC7C,CAAC;gBACH,CAAC;YACH,CAAC;YAED,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CAAC,+BAA+B,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,EAAE,CAAC,CAAC;QAC7G,CAAC;IACH,CAAC;IAED;;OAEG;IACK,eAAe,CAAC,QAAgB,EAAE,OAAwB;QAChE,OAAO,QAAQ,CAAC,OAAO,CAAC,wBAAwB,EAAE,CAAC,KAAK,EAAE,QAAQ,EAAE,EAAE;YACpE,MAAM,KAAK,GAAG,IAAI,CAAC,cAAc,CAAC,OAAO,EAAE,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC;YAC5D,OAAO,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAClD,CAAC,CAAC,CAAC;IACL,CAAC;IAED;;;OAGG;IACK,cAAc,CAAC,GAAQ,EAAE,IAAY;QAC3C,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,GAAG,EAAE,EAAE;YAC7C,OAAO,OAAO,IAAI,OAAO,CAAC,GAAG,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QAC1E,CAAC,EAAE,GAAG,CAAC,CAAC;IACV,CAAC;CACF"}