@bernierllc/email-manager 0.1.1 → 0.1.3

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.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/config/schema.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB;;;GAGG;AACH,eAAO,MAAM,wBAAwB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA6JzB,CAAC;AAEb;;GAEG;AACH,MAAM,MAAM,2BAA2B,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,wBAAwB,CAAC,CAAC;AAEnF;;GAEG;AACH,wBAAgB,6BAA6B,CAAC,MAAM,EAAE,GAAG,GAAG,MAAM,EAAE,CAmBnE;AAED;;GAEG;AACH,wBAAgB,6BAA6B,CAAC,MAAM,EAAE,GAAG,GAAG,MAAM,EAAE,CAYnE;AAED;;GAEG;AACH,wBAAgB,8BAA8B,CAAC,MAAM,EAAE,GAAG,GAAG,MAAM,EAAE,CAYpE;AAED;;GAEG;AACH,wBAAgB,iCAAiC,CAAC,MAAM,EAAE,GAAG,GAAG,MAAM,EAAE,CAYvE;AAED;;GAEG;AACH,wBAAgB,6BAA6B,CAAC,MAAM,EAAE,GAAG,GAAG,MAAM,EAAE,CAgBnE;AAED;;GAEG;AACH,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,GAAG,GAAG,MAAM,EAAE,CAQhE;AAED;;GAEG;AACH,wBAAgB,+BAA+B,CAAC,MAAM,EAAE,GAAG,GAAG,MAAM,EAAE,CAYrE;AAED;;GAEG;AACH,wBAAgB,6BAA6B,CAAC,MAAM,EAAE,GAAG,GAAG,MAAM,EAAE,CAYnE;AAED;;GAEG;AACH,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,GAAG,GAAG;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,MAAM,EAAE,CAAA;CAAE,CA4B9F"}
@@ -0,0 +1,301 @@
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
+ /**
10
+ * Zod schema for email manager suite runtime configuration
11
+ * Provides runtime validation and type safety
12
+ */
13
+ export const emailManagerConfigSchema = z.object({
14
+ enabled: z.boolean().default(true),
15
+ defaultProvider: z.string().optional(),
16
+ providers: z.object({
17
+ configDir: z.string().default('./providers'),
18
+ failover: z.object({
19
+ enabled: z.boolean().default(true),
20
+ maxAttempts: z.number().positive().default(3),
21
+ delayMs: z.number().positive().default(5000),
22
+ }).default({}),
23
+ healthCheck: z.object({
24
+ enabled: z.boolean().default(true),
25
+ intervalMs: z.number().positive().default(300000), // 5 minutes
26
+ timeoutMs: z.number().positive().default(10000),
27
+ }).default({}),
28
+ }).default({}),
29
+ templates: z.object({
30
+ storageDir: z.string().default('./templates'),
31
+ maxPerCategory: z.number().positive().default(100),
32
+ cacheTtlMs: z.number().positive().default(3600000), // 1 hour
33
+ versioningEnabled: z.boolean().default(true),
34
+ validationEnabled: z.boolean().default(true),
35
+ compilation: z.object({
36
+ enabled: z.boolean().default(true),
37
+ engine: z.enum(['handlebars', 'mustache', 'pug', 'ejs']).default('handlebars'),
38
+ cacheSize: z.number().positive().default(1000),
39
+ }).default({}),
40
+ }).default({}),
41
+ scheduling: z.object({
42
+ enabled: z.boolean().default(true),
43
+ maxQueueSize: z.number().positive().default(10000),
44
+ pollIntervalMs: z.number().positive().default(60000), // 1 minute
45
+ maxAheadMs: z.number().positive().default(2592000000), // 30 days
46
+ persistence: z.object({
47
+ enabled: z.boolean().default(true),
48
+ provider: z.enum(['file', 'database', 'redis']).default('file'),
49
+ path: z.string().optional(),
50
+ }).default({}),
51
+ }).default({}),
52
+ analytics: z.object({
53
+ enabled: z.boolean().default(true),
54
+ retentionDays: z.number().positive().default(90),
55
+ aggregationIntervalMs: z.number().positive().default(300000), // 5 minutes
56
+ detailedTracking: z.boolean().default(true),
57
+ webhooks: z.object({
58
+ enabled: z.boolean().default(true),
59
+ url: z.string().url().optional(),
60
+ secret: z.string().optional(),
61
+ events: z.array(z.string()).default(['sent', 'delivered', 'opened', 'clicked', 'bounced', 'complained']),
62
+ }).default({}),
63
+ }).default({}),
64
+ rateLimiting: z.object({
65
+ enabled: z.boolean().default(true),
66
+ emailsPerMinute: z.number().positive().default(1000),
67
+ windowMs: z.number().positive().default(60000),
68
+ perRecipient: z.object({
69
+ enabled: z.boolean().default(true),
70
+ emailsPerHour: z.number().positive().default(10),
71
+ }).default({}),
72
+ perTemplate: z.object({
73
+ enabled: z.boolean().default(false),
74
+ limits: z.record(z.number().positive()).default({}),
75
+ }).default({}),
76
+ }).default({}),
77
+ security: z.object({
78
+ dkimEnabled: z.boolean().default(false),
79
+ dkimPrivateKeyPath: z.string().optional(),
80
+ dkimSelector: z.string().optional(),
81
+ spfCheckEnabled: z.boolean().default(false),
82
+ contentFiltering: z.object({
83
+ enabled: z.boolean().default(true),
84
+ blockSuspicious: z.boolean().default(true),
85
+ customFiltersDir: z.string().optional(),
86
+ }).default({}),
87
+ privacy: z.object({
88
+ piiDetection: z.boolean().default(true),
89
+ autoRedactLogs: z.boolean().default(true),
90
+ dataRetentionDays: z.number().positive().default(30),
91
+ }).default({}),
92
+ }).default({}),
93
+ delivery: z.object({
94
+ optimizationEnabled: z.boolean().default(true),
95
+ batching: z.object({
96
+ enabled: z.boolean().default(true),
97
+ size: z.number().positive().default(100),
98
+ intervalMs: z.number().positive().default(10000),
99
+ }).default({}),
100
+ retry: z.object({
101
+ enabled: z.boolean().default(true),
102
+ maxAttempts: z.number().nonnegative().default(5),
103
+ initialDelayMs: z.number().positive().default(30000),
104
+ maxDelayMs: z.number().positive().default(3600000), // 1 hour
105
+ backoffFactor: z.number().min(1).default(2),
106
+ }).default({}),
107
+ }).default({}),
108
+ cache: z.object({
109
+ enabled: z.boolean().default(true),
110
+ provider: z.enum(['memory', 'redis', 'memcached']).default('memory'),
111
+ templatesTtlMs: z.number().positive().default(3600000), // 1 hour
112
+ providerStatusTtlMs: z.number().positive().default(300000), // 5 minutes
113
+ analyticsTtlMs: z.number().positive().default(900000), // 15 minutes
114
+ url: z.string().optional(),
115
+ }).default({}),
116
+ database: z.object({
117
+ provider: z.enum(['sqlite', 'postgresql', 'mysql', 'mongodb']).default('sqlite'),
118
+ url: z.string().optional(),
119
+ pool: z.object({
120
+ min: z.number().nonnegative().default(2),
121
+ max: z.number().positive().default(20),
122
+ timeoutMs: z.number().positive().default(30000),
123
+ }).default({}),
124
+ logQueries: z.boolean().default(false),
125
+ }).default({}),
126
+ logger: z.object({
127
+ level: z.enum(['debug', 'info', 'warn', 'error']).default('info'),
128
+ enabled: z.boolean().default(true),
129
+ includeEmails: z.boolean().default(false),
130
+ includeContent: z.boolean().default(false),
131
+ logDeliveryEvents: z.boolean().default(true),
132
+ logTemplateOperations: z.boolean().default(true),
133
+ }).default({}),
134
+ monitoring: z.object({
135
+ enabled: z.boolean().default(true),
136
+ metricsIntervalMs: z.number().positive().default(60000), // 1 minute
137
+ performanceEnabled: z.boolean().default(true),
138
+ alertingEnabled: z.boolean().default(true),
139
+ alertThresholds: z.object({
140
+ deliveryFailureRate: z.number().min(0).max(100).default(10),
141
+ queueSize: z.number().positive().default(5000),
142
+ processingDelayMs: z.number().positive().default(300000), // 5 minutes
143
+ }).default({}),
144
+ }).default({}),
145
+ corePackages: z.object({
146
+ emailSender: z.object({
147
+ timeoutMs: z.number().positive().default(30000),
148
+ deliveryConfirmation: z.boolean().default(true),
149
+ }).default({}),
150
+ templateEngine: z.object({
151
+ strictMode: z.boolean().default(true),
152
+ cacheSize: z.number().positive().default(1000),
153
+ }).default({}),
154
+ cryptoUtils: z.object({
155
+ algorithm: z.string().default('aes-256-gcm'),
156
+ }).default({}),
157
+ }).default({}),
158
+ }).partial();
159
+ /**
160
+ * Validate security configurations
161
+ */
162
+ export function validateSecurityConfiguration(config) {
163
+ const errors = [];
164
+ // DKIM configuration validation
165
+ if (config.security?.dkimEnabled) {
166
+ if (!config.security?.dkimPrivateKeyPath) {
167
+ errors.push('security.dkimPrivateKeyPath is required when DKIM is enabled');
168
+ }
169
+ if (!config.security?.dkimSelector) {
170
+ errors.push('security.dkimSelector is required when DKIM is enabled');
171
+ }
172
+ }
173
+ // Privacy configuration validation
174
+ if (config.security?.privacy?.dataRetentionDays < 1) {
175
+ errors.push('security.privacy.dataRetentionDays must be at least 1 day');
176
+ }
177
+ return errors;
178
+ }
179
+ /**
180
+ * Validate provider configuration
181
+ */
182
+ export function validateProviderConfiguration(config) {
183
+ const errors = [];
184
+ if (config.providers?.failover?.maxAttempts > 10) {
185
+ errors.push('providers.failover.maxAttempts should not exceed 10 for performance reasons');
186
+ }
187
+ if (config.providers?.healthCheck?.intervalMs < 30000) { // 30 seconds
188
+ errors.push('providers.healthCheck.intervalMs should be at least 30 seconds to avoid excessive load');
189
+ }
190
+ return errors;
191
+ }
192
+ /**
193
+ * Validate analytics configuration
194
+ */
195
+ export function validateAnalyticsConfiguration(config) {
196
+ const errors = [];
197
+ if (config.analytics?.enabled && config.analytics?.webhooks?.enabled && !config.analytics?.webhooks?.url) {
198
+ errors.push('analytics.webhooks.url is required when webhook tracking is enabled');
199
+ }
200
+ if (config.analytics?.retentionDays > 365) {
201
+ console.warn('⚠️ Email Manager: analytics.retentionDays > 365 may impact performance');
202
+ }
203
+ return errors;
204
+ }
205
+ /**
206
+ * Validate rate limiting configuration
207
+ */
208
+ export function validateRateLimitingConfiguration(config) {
209
+ const errors = [];
210
+ if (config.rateLimiting?.emailsPerMinute > 10000) {
211
+ errors.push('rateLimiting.emailsPerMinute should not exceed 10000 for system stability');
212
+ }
213
+ if (config.rateLimiting?.perRecipient?.emailsPerHour > 100) {
214
+ console.warn('⚠️ Email Manager: High per-recipient rate limit may trigger provider spam filters');
215
+ }
216
+ return errors;
217
+ }
218
+ /**
219
+ * Validate database configuration
220
+ */
221
+ export function validateDatabaseConfiguration(config) {
222
+ const errors = [];
223
+ if (config.database?.provider !== 'sqlite' && !config.database?.url) {
224
+ errors.push(`database.url is required for ${config.database?.provider} database provider`);
225
+ }
226
+ if (config.database?.pool?.max > 100) {
227
+ errors.push('database.pool.max should not exceed 100 connections');
228
+ }
229
+ if (config.database?.pool?.min > config.database?.pool?.max) {
230
+ errors.push('database.pool.min cannot be greater than database.pool.max');
231
+ }
232
+ return errors;
233
+ }
234
+ /**
235
+ * Validate cache configuration
236
+ */
237
+ export function validateCacheConfiguration(config) {
238
+ const errors = [];
239
+ if (config.cache?.provider !== 'memory' && !config.cache?.url) {
240
+ errors.push(`cache.url is required for ${config.cache?.provider} cache provider`);
241
+ }
242
+ return errors;
243
+ }
244
+ /**
245
+ * Validate scheduling configuration
246
+ */
247
+ export function validateSchedulingConfiguration(config) {
248
+ const errors = [];
249
+ if (config.scheduling?.enabled && config.scheduling?.maxQueueSize > 50000) {
250
+ console.warn('⚠️ Email Manager: Large scheduling queue may impact memory usage');
251
+ }
252
+ if (config.scheduling?.persistence?.provider !== 'file' && !config.scheduling?.persistence?.path) {
253
+ errors.push(`scheduling.persistence.path is required for ${config.scheduling?.persistence?.provider} persistence`);
254
+ }
255
+ return errors;
256
+ }
257
+ /**
258
+ * Validate template configuration
259
+ */
260
+ export function validateTemplateConfiguration(config) {
261
+ const errors = [];
262
+ if (config.templates?.compilation?.cacheSize > 10000) {
263
+ console.warn('⚠️ Email Manager: Large template cache may impact memory usage');
264
+ }
265
+ if (config.templates?.maxPerCategory > 1000) {
266
+ errors.push('templates.maxPerCategory should not exceed 1000 for performance reasons');
267
+ }
268
+ return errors;
269
+ }
270
+ /**
271
+ * Comprehensive configuration validation
272
+ */
273
+ export function validateEmailManagerConfig(config) {
274
+ const errors = [];
275
+ // Schema validation
276
+ try {
277
+ emailManagerConfigSchema.parse(config);
278
+ }
279
+ catch (error) {
280
+ if (error instanceof z.ZodError) {
281
+ errors.push(...error.errors.map(err => `${err.path.join('.')}: ${err.message}`));
282
+ }
283
+ else {
284
+ errors.push(`Configuration validation error: ${error}`);
285
+ }
286
+ }
287
+ // Custom validations
288
+ errors.push(...validateSecurityConfiguration(config));
289
+ errors.push(...validateProviderConfiguration(config));
290
+ errors.push(...validateAnalyticsConfiguration(config));
291
+ errors.push(...validateRateLimitingConfiguration(config));
292
+ errors.push(...validateDatabaseConfiguration(config));
293
+ errors.push(...validateCacheConfiguration(config));
294
+ errors.push(...validateSchedulingConfiguration(config));
295
+ errors.push(...validateTemplateConfiguration(config));
296
+ return {
297
+ isValid: errors.length === 0,
298
+ errors
299
+ };
300
+ }
301
+ //# sourceMappingURL=schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/config/schema.ts"],"names":[],"mappings":"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"}