@bernierllc/email-manager 0.1.1 → 0.1.4

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/README.md CHANGED
@@ -2,6 +2,12 @@
2
2
 
3
3
  A comprehensive email management service that orchestrates email sending, template management, scheduling, and analytics. This service integrates with `@bernierllc/email-sender`, `@bernierllc/template-engine`, and `@bernierllc/magic-link` to provide a complete email solution.
4
4
 
5
+ ## ⚠️ Node.js Only
6
+
7
+ **This package is Node.js-only** and cannot be bundled for browser use due to Node.js dependencies (nodemailer, etc.).
8
+
9
+ **For browser/frontend applications**, use [`@bernierllc/email-manager-client`](../email-manager-client/README.md) instead, which provides the same API via HTTP calls.
10
+
5
11
  ## Features
6
12
 
7
13
  ### 🚀 **Email Orchestration**
@@ -0,0 +1,60 @@
1
+ import { ResolvedEmailManagerConfig, ConfigurationSource } from './types.js';
2
+ /**
3
+ * Configuration loader with source tracking and validation
4
+ */
5
+ export declare class EmailManagerConfigurationLoader {
6
+ private sources;
7
+ /**
8
+ * Parse environment variable value to appropriate type
9
+ */
10
+ private parseEnvironmentValue;
11
+ /**
12
+ * Set nested object value using dot notation
13
+ */
14
+ private setNestedValue;
15
+ /**
16
+ * Merge configuration objects recursively
17
+ */
18
+ private mergeConfiguration;
19
+ /**
20
+ * Get default configuration values
21
+ */
22
+ private getDefaultConfiguration;
23
+ /**
24
+ * Load configuration from all sources with validation
25
+ */
26
+ loadConfiguration(): ResolvedEmailManagerConfig;
27
+ /**
28
+ * Configure core package dependencies with overrides
29
+ */
30
+ private configureCorePackageDependencies;
31
+ /**
32
+ * Get configuration sources for debugging
33
+ */
34
+ getConfigurationSources(): ConfigurationSource[];
35
+ /**
36
+ * Get environment variable documentation
37
+ */
38
+ getEnvironmentVariableDocumentation(): Record<string, string>;
39
+ /**
40
+ * Print resolved configuration with sensitive data redacted
41
+ */
42
+ printConfiguration(config: ResolvedEmailManagerConfig, redactSecrets?: boolean): string;
43
+ }
44
+ /**
45
+ * Load email manager suite configuration
46
+ * Main entry point for configuration loading
47
+ */
48
+ export declare function loadEmailManagerConfiguration(): ResolvedEmailManagerConfig;
49
+ /**
50
+ * Load configuration with source tracking for debugging
51
+ */
52
+ export declare function loadEmailManagerConfigurationWithSources(): {
53
+ config: ResolvedEmailManagerConfig;
54
+ sources: ConfigurationSource[];
55
+ };
56
+ /**
57
+ * Get environment variable documentation
58
+ */
59
+ export declare function getEmailManagerEnvironmentDocumentation(): Record<string, string>;
60
+ //# sourceMappingURL=loadConfiguration.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loadConfiguration.d.ts","sourceRoot":"","sources":["../../src/config/loadConfiguration.ts"],"names":[],"mappings":"AASA,OAAO,EAA6B,0BAA0B,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AA+FxG;;GAEG;AACH,qBAAa,+BAA+B;IAC1C,OAAO,CAAC,OAAO,CAA6B;IAE5C;;OAEG;IACH,OAAO,CAAC,qBAAqB;IAiB7B;;OAEG;IACH,OAAO,CAAC,cAAc;IAoBtB;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAW1B;;OAEG;IACH,OAAO,CAAC,uBAAuB;IA4I/B;;OAEG;IACH,iBAAiB,IAAI,0BAA0B;IAuF/C;;OAEG;IACH,OAAO,CAAC,gCAAgC;IAwBxC;;OAEG;IACH,uBAAuB,IAAI,mBAAmB,EAAE;IAIhD;;OAEG;IACH,mCAAmC,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;IAU7D;;OAEG;IACH,kBAAkB,CAAC,MAAM,EAAE,0BAA0B,EAAE,aAAa,GAAE,OAAc,GAAG,MAAM;CAqB9F;AAED;;;GAGG;AACH,wBAAgB,6BAA6B,IAAI,0BAA0B,CAG1E;AAED;;GAEG;AACH,wBAAgB,wCAAwC,IAAI;IAC1D,MAAM,EAAE,0BAA0B,CAAC;IACnC,OAAO,EAAE,mBAAmB,EAAE,CAAC;CAChC,CAMA;AAED;;GAEG;AACH,wBAAgB,uCAAuC,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAGhF"}
@@ -0,0 +1,468 @@
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 { cosmiconfigSync } from 'cosmiconfig';
9
+ import { emailManagerConfigSchema, validateEmailManagerConfig } from './schema.js';
10
+ /**
11
+ * Environment variable mappings for email manager suite
12
+ */
13
+ const ENV_MAPPINGS = {
14
+ enabled: 'EMAIL_MANAGER_ENABLED',
15
+ defaultProvider: 'EMAIL_MANAGER_DEFAULT_PROVIDER',
16
+ 'providers.configDir': 'EMAIL_MANAGER_PROVIDERS_DIR',
17
+ 'providers.failover.enabled': 'EMAIL_MANAGER_FAILOVER_ENABLED',
18
+ 'providers.failover.maxAttempts': 'EMAIL_MANAGER_FAILOVER_MAX_ATTEMPTS',
19
+ 'providers.failover.delayMs': 'EMAIL_MANAGER_FAILOVER_DELAY_MS',
20
+ 'providers.healthCheck.enabled': 'EMAIL_MANAGER_HEALTH_CHECK_ENABLED',
21
+ 'providers.healthCheck.intervalMs': 'EMAIL_MANAGER_HEALTH_CHECK_INTERVAL_MS',
22
+ 'providers.healthCheck.timeoutMs': 'EMAIL_MANAGER_HEALTH_CHECK_TIMEOUT_MS',
23
+ 'templates.storageDir': 'EMAIL_MANAGER_TEMPLATES_DIR',
24
+ 'templates.maxPerCategory': 'EMAIL_MANAGER_TEMPLATES_MAX_PER_CATEGORY',
25
+ 'templates.cacheTtlMs': 'EMAIL_MANAGER_TEMPLATES_CACHE_TTL_MS',
26
+ 'templates.versioningEnabled': 'EMAIL_MANAGER_TEMPLATES_VERSIONING_ENABLED',
27
+ 'templates.validationEnabled': 'EMAIL_MANAGER_TEMPLATES_VALIDATION_ENABLED',
28
+ 'templates.compilation.enabled': 'EMAIL_MANAGER_TEMPLATES_PRECOMPILE',
29
+ 'templates.compilation.engine': 'EMAIL_MANAGER_TEMPLATES_ENGINE',
30
+ 'templates.compilation.cacheSize': 'EMAIL_MANAGER_TEMPLATES_COMPILE_CACHE_SIZE',
31
+ 'scheduling.enabled': 'EMAIL_MANAGER_SCHEDULING_ENABLED',
32
+ 'scheduling.maxQueueSize': 'EMAIL_MANAGER_SCHEDULING_MAX_QUEUE_SIZE',
33
+ 'scheduling.pollIntervalMs': 'EMAIL_MANAGER_SCHEDULING_POLL_INTERVAL_MS',
34
+ 'scheduling.maxAheadMs': 'EMAIL_MANAGER_SCHEDULING_MAX_AHEAD_MS',
35
+ 'scheduling.persistence.enabled': 'EMAIL_MANAGER_SCHEDULING_PERSISTENCE_ENABLED',
36
+ 'scheduling.persistence.provider': 'EMAIL_MANAGER_SCHEDULING_PERSISTENCE_PROVIDER',
37
+ 'scheduling.persistence.path': 'EMAIL_MANAGER_SCHEDULING_PERSISTENCE_PATH',
38
+ 'analytics.enabled': 'EMAIL_MANAGER_ANALYTICS_ENABLED',
39
+ 'analytics.retentionDays': 'EMAIL_MANAGER_ANALYTICS_RETENTION_DAYS',
40
+ 'analytics.aggregationIntervalMs': 'EMAIL_MANAGER_ANALYTICS_AGGREGATION_INTERVAL_MS',
41
+ 'analytics.detailedTracking': 'EMAIL_MANAGER_ANALYTICS_DETAILED_TRACKING',
42
+ 'analytics.webhooks.enabled': 'EMAIL_MANAGER_ANALYTICS_WEBHOOKS_ENABLED',
43
+ 'analytics.webhooks.url': 'EMAIL_MANAGER_ANALYTICS_WEBHOOK_URL',
44
+ 'analytics.webhooks.secret': 'EMAIL_MANAGER_ANALYTICS_WEBHOOK_SECRET',
45
+ 'rateLimiting.enabled': 'EMAIL_MANAGER_RATE_LIMITING_ENABLED',
46
+ 'rateLimiting.emailsPerMinute': 'EMAIL_MANAGER_RATE_LIMIT_EMAILS_PER_MINUTE',
47
+ 'rateLimiting.windowMs': 'EMAIL_MANAGER_RATE_LIMIT_WINDOW_MS',
48
+ 'rateLimiting.perRecipient.enabled': 'EMAIL_MANAGER_PER_RECIPIENT_RATE_LIMITING',
49
+ 'rateLimiting.perRecipient.emailsPerHour': 'EMAIL_MANAGER_PER_RECIPIENT_EMAILS_PER_HOUR',
50
+ 'rateLimiting.perTemplate.enabled': 'EMAIL_MANAGER_PER_TEMPLATE_RATE_LIMITING',
51
+ 'security.dkimEnabled': 'EMAIL_MANAGER_SECURITY_DKIM_ENABLED',
52
+ 'security.dkimPrivateKeyPath': 'EMAIL_MANAGER_SECURITY_DKIM_PRIVATE_KEY_PATH',
53
+ 'security.dkimSelector': 'EMAIL_MANAGER_SECURITY_DKIM_SELECTOR',
54
+ 'security.spfCheckEnabled': 'EMAIL_MANAGER_SECURITY_SPF_CHECK_ENABLED',
55
+ 'security.contentFiltering.enabled': 'EMAIL_MANAGER_CONTENT_FILTERING_ENABLED',
56
+ 'security.contentFiltering.blockSuspicious': 'EMAIL_MANAGER_CONTENT_FILTERING_BLOCK_SUSPICIOUS',
57
+ 'security.contentFiltering.customFiltersDir': 'EMAIL_MANAGER_CONTENT_FILTERING_CUSTOM_FILTERS_DIR',
58
+ 'security.privacy.piiDetection': 'EMAIL_MANAGER_PRIVACY_PII_DETECTION',
59
+ 'security.privacy.autoRedactLogs': 'EMAIL_MANAGER_PRIVACY_AUTO_REDACT_LOGS',
60
+ 'security.privacy.dataRetentionDays': 'EMAIL_MANAGER_PRIVACY_DATA_RETENTION_DAYS',
61
+ 'delivery.optimizationEnabled': 'EMAIL_MANAGER_DELIVERY_OPTIMIZATION_ENABLED',
62
+ 'delivery.batching.enabled': 'EMAIL_MANAGER_DELIVERY_BATCHING_ENABLED',
63
+ 'delivery.batching.size': 'EMAIL_MANAGER_DELIVERY_BATCH_SIZE',
64
+ 'delivery.batching.intervalMs': 'EMAIL_MANAGER_DELIVERY_BATCH_INTERVAL_MS',
65
+ 'delivery.retry.enabled': 'EMAIL_MANAGER_DELIVERY_RETRY_ENABLED',
66
+ 'delivery.retry.maxAttempts': 'EMAIL_MANAGER_DELIVERY_RETRY_MAX_ATTEMPTS',
67
+ 'delivery.retry.initialDelayMs': 'EMAIL_MANAGER_DELIVERY_RETRY_INITIAL_DELAY_MS',
68
+ 'delivery.retry.maxDelayMs': 'EMAIL_MANAGER_DELIVERY_RETRY_MAX_DELAY_MS',
69
+ 'delivery.retry.backoffFactor': 'EMAIL_MANAGER_DELIVERY_RETRY_BACKOFF_FACTOR',
70
+ 'cache.enabled': 'EMAIL_MANAGER_CACHE_ENABLED',
71
+ 'cache.provider': 'EMAIL_MANAGER_CACHE_PROVIDER',
72
+ 'cache.templatesTtlMs': 'EMAIL_MANAGER_CACHE_TEMPLATES_TTL_MS',
73
+ 'cache.providerStatusTtlMs': 'EMAIL_MANAGER_CACHE_PROVIDER_STATUS_TTL_MS',
74
+ 'cache.analyticsTtlMs': 'EMAIL_MANAGER_CACHE_ANALYTICS_TTL_MS',
75
+ 'cache.url': 'EMAIL_MANAGER_CACHE_URL',
76
+ 'database.provider': 'EMAIL_MANAGER_DATABASE_PROVIDER',
77
+ 'database.url': 'EMAIL_MANAGER_DATABASE_URL',
78
+ 'database.pool.min': 'EMAIL_MANAGER_DATABASE_POOL_MIN',
79
+ 'database.pool.max': 'EMAIL_MANAGER_DATABASE_POOL_MAX',
80
+ 'database.pool.timeoutMs': 'EMAIL_MANAGER_DATABASE_POOL_TIMEOUT_MS',
81
+ 'database.logQueries': 'EMAIL_MANAGER_DATABASE_LOG_QUERIES',
82
+ 'logger.level': 'EMAIL_MANAGER_LOG_LEVEL',
83
+ 'logger.enabled': 'EMAIL_MANAGER_LOG_ENABLED',
84
+ 'logger.includeEmails': 'EMAIL_MANAGER_LOG_INCLUDE_EMAILS',
85
+ 'logger.includeContent': 'EMAIL_MANAGER_LOG_INCLUDE_CONTENT',
86
+ 'logger.logDeliveryEvents': 'EMAIL_MANAGER_LOG_DELIVERY_EVENTS',
87
+ 'logger.logTemplateOperations': 'EMAIL_MANAGER_LOG_TEMPLATE_OPERATIONS',
88
+ 'monitoring.enabled': 'EMAIL_MANAGER_MONITORING_ENABLED',
89
+ 'monitoring.metricsIntervalMs': 'EMAIL_MANAGER_MONITORING_METRICS_INTERVAL_MS',
90
+ 'monitoring.performanceEnabled': 'EMAIL_MANAGER_MONITORING_PERFORMANCE_ENABLED',
91
+ 'monitoring.alertingEnabled': 'EMAIL_MANAGER_MONITORING_ALERTING_ENABLED',
92
+ 'monitoring.alertThresholds.deliveryFailureRate': 'EMAIL_MANAGER_MONITORING_ALERT_FAILURE_RATE',
93
+ 'monitoring.alertThresholds.queueSize': 'EMAIL_MANAGER_MONITORING_ALERT_QUEUE_SIZE',
94
+ 'monitoring.alertThresholds.processingDelayMs': 'EMAIL_MANAGER_MONITORING_ALERT_PROCESSING_DELAY_MS',
95
+ 'corePackages.emailSender.timeoutMs': 'EMAIL_MANAGER_EMAIL_SENDER_TIMEOUT_MS',
96
+ 'corePackages.emailSender.deliveryConfirmation': 'EMAIL_MANAGER_EMAIL_SENDER_DELIVERY_CONFIRMATION',
97
+ 'corePackages.templateEngine.strictMode': 'EMAIL_MANAGER_TEMPLATE_ENGINE_STRICT_MODE',
98
+ 'corePackages.templateEngine.cacheSize': 'EMAIL_MANAGER_TEMPLATE_ENGINE_CACHE_SIZE',
99
+ 'corePackages.cryptoUtils.algorithm': 'EMAIL_MANAGER_CRYPTO_UTILS_ALGORITHM',
100
+ };
101
+ /**
102
+ * Configuration loader with source tracking and validation
103
+ */
104
+ export class EmailManagerConfigurationLoader {
105
+ constructor() {
106
+ this.sources = [];
107
+ }
108
+ /**
109
+ * Parse environment variable value to appropriate type
110
+ */
111
+ parseEnvironmentValue(value, key) {
112
+ // Boolean values
113
+ if (value === 'true')
114
+ return true;
115
+ if (value === 'false')
116
+ return false;
117
+ // Array values (comma-separated)
118
+ if (key.includes('events')) {
119
+ return value.split(',').map(event => event.trim());
120
+ }
121
+ // Number values
122
+ if (/^\d+$/.test(value))
123
+ return parseInt(value);
124
+ if (/^\d+\.\d+$/.test(value))
125
+ return parseFloat(value);
126
+ return value;
127
+ }
128
+ /**
129
+ * Set nested object value using dot notation
130
+ */
131
+ setNestedValue(obj, path, value) {
132
+ const keys = path.split('.');
133
+ let current = obj;
134
+ for (let i = 0; i < keys.length - 1; i++) {
135
+ const key = keys[i];
136
+ if (key && !(key in current)) {
137
+ current[key] = {};
138
+ }
139
+ if (key) {
140
+ current = current[key];
141
+ }
142
+ }
143
+ const lastKey = keys[keys.length - 1];
144
+ if (lastKey) {
145
+ current[lastKey] = value;
146
+ }
147
+ }
148
+ /**
149
+ * Merge configuration objects recursively
150
+ */
151
+ mergeConfiguration(target, source) {
152
+ Object.keys(source).forEach(key => {
153
+ if (source[key] && typeof source[key] === 'object' && !Array.isArray(source[key])) {
154
+ if (!target[key])
155
+ target[key] = {};
156
+ this.mergeConfiguration(target[key], source[key]);
157
+ }
158
+ else {
159
+ target[key] = source[key];
160
+ }
161
+ });
162
+ }
163
+ /**
164
+ * Get default configuration values
165
+ */
166
+ getDefaultConfiguration() {
167
+ return {
168
+ enabled: true,
169
+ providers: {
170
+ configDir: './providers',
171
+ failover: {
172
+ enabled: true,
173
+ maxAttempts: 3,
174
+ delayMs: 5000,
175
+ },
176
+ healthCheck: {
177
+ enabled: true,
178
+ intervalMs: 300000, // 5 minutes
179
+ timeoutMs: 10000,
180
+ },
181
+ },
182
+ templates: {
183
+ storageDir: './templates',
184
+ maxPerCategory: 100,
185
+ cacheTtlMs: 3600000, // 1 hour
186
+ versioningEnabled: true,
187
+ validationEnabled: true,
188
+ compilation: {
189
+ enabled: true,
190
+ engine: 'handlebars',
191
+ cacheSize: 1000,
192
+ },
193
+ },
194
+ scheduling: {
195
+ enabled: true,
196
+ maxQueueSize: 10000,
197
+ pollIntervalMs: 60000, // 1 minute
198
+ maxAheadMs: 2592000000, // 30 days
199
+ persistence: {
200
+ enabled: true,
201
+ provider: 'file',
202
+ },
203
+ },
204
+ analytics: {
205
+ enabled: true,
206
+ retentionDays: 90,
207
+ aggregationIntervalMs: 300000, // 5 minutes
208
+ detailedTracking: true,
209
+ webhooks: {
210
+ enabled: true,
211
+ events: ['sent', 'delivered', 'opened', 'clicked', 'bounced', 'complained'],
212
+ },
213
+ },
214
+ rateLimiting: {
215
+ enabled: true,
216
+ emailsPerMinute: 1000,
217
+ windowMs: 60000,
218
+ perRecipient: {
219
+ enabled: true,
220
+ emailsPerHour: 10,
221
+ },
222
+ perTemplate: {
223
+ enabled: false,
224
+ limits: {},
225
+ },
226
+ },
227
+ security: {
228
+ dkimEnabled: false,
229
+ spfCheckEnabled: false,
230
+ contentFiltering: {
231
+ enabled: true,
232
+ blockSuspicious: true,
233
+ },
234
+ privacy: {
235
+ piiDetection: true,
236
+ autoRedactLogs: true,
237
+ dataRetentionDays: 30,
238
+ },
239
+ },
240
+ delivery: {
241
+ optimizationEnabled: true,
242
+ batching: {
243
+ enabled: true,
244
+ size: 100,
245
+ intervalMs: 10000,
246
+ },
247
+ retry: {
248
+ enabled: true,
249
+ maxAttempts: 5,
250
+ initialDelayMs: 30000,
251
+ maxDelayMs: 3600000, // 1 hour
252
+ backoffFactor: 2,
253
+ },
254
+ },
255
+ cache: {
256
+ enabled: true,
257
+ provider: 'memory',
258
+ templatesTtlMs: 3600000, // 1 hour
259
+ providerStatusTtlMs: 300000, // 5 minutes
260
+ analyticsTtlMs: 900000, // 15 minutes
261
+ },
262
+ database: {
263
+ provider: 'sqlite',
264
+ pool: {
265
+ min: 2,
266
+ max: 20,
267
+ timeoutMs: 30000,
268
+ },
269
+ logQueries: false,
270
+ },
271
+ logger: {
272
+ level: 'info',
273
+ enabled: true,
274
+ includeEmails: false,
275
+ includeContent: false,
276
+ logDeliveryEvents: true,
277
+ logTemplateOperations: true,
278
+ },
279
+ monitoring: {
280
+ enabled: true,
281
+ metricsIntervalMs: 60000, // 1 minute
282
+ performanceEnabled: true,
283
+ alertingEnabled: true,
284
+ alertThresholds: {
285
+ deliveryFailureRate: 10,
286
+ queueSize: 5000,
287
+ processingDelayMs: 300000, // 5 minutes
288
+ },
289
+ },
290
+ corePackages: {
291
+ emailSender: {
292
+ timeoutMs: 30000,
293
+ deliveryConfirmation: true,
294
+ },
295
+ templateEngine: {
296
+ strictMode: true,
297
+ cacheSize: 1000,
298
+ },
299
+ cryptoUtils: {
300
+ algorithm: 'aes-256-gcm',
301
+ },
302
+ },
303
+ };
304
+ }
305
+ /**
306
+ * Load configuration from all sources with validation
307
+ */
308
+ loadConfiguration() {
309
+ const config = this.getDefaultConfiguration();
310
+ this.sources = [];
311
+ // Add default configuration source
312
+ this.sources.push({
313
+ key: 'defaults',
314
+ value: config,
315
+ source: 'default',
316
+ description: 'Default email manager suite configuration'
317
+ });
318
+ // Load configuration file if it exists
319
+ const explorer = cosmiconfigSync('email-manager', {
320
+ searchPlaces: [
321
+ 'email-manager.config.js',
322
+ 'email-manager.config.json',
323
+ 'email-manager-suite.config.js',
324
+ 'email-manager-suite.config.json',
325
+ '.email-managerrc',
326
+ '.email-managerrc.js',
327
+ '.email-managerrc.json'
328
+ ]
329
+ });
330
+ try {
331
+ const result = explorer.search();
332
+ if (result && result.config) {
333
+ this.mergeConfiguration(config, result.config);
334
+ this.sources.push({
335
+ key: 'file',
336
+ value: result.config,
337
+ source: 'file',
338
+ description: `Configuration file: ${result.filepath}`
339
+ });
340
+ }
341
+ }
342
+ catch (error) {
343
+ console.warn('⚠️ Email Manager Suite: Failed to load configuration file', error);
344
+ }
345
+ // Apply environment variable overrides
346
+ const envOverrides = [];
347
+ Object.entries(ENV_MAPPINGS).forEach(([configPath, envVar]) => {
348
+ const envValue = process.env[envVar];
349
+ if (envValue !== undefined) {
350
+ const parsedValue = this.parseEnvironmentValue(envValue, configPath);
351
+ this.setNestedValue(config, configPath, parsedValue);
352
+ envOverrides.push({
353
+ key: configPath,
354
+ value: parsedValue,
355
+ source: 'environment',
356
+ description: `Environment variable: ${envVar}=${envValue}`
357
+ });
358
+ }
359
+ });
360
+ if (envOverrides.length > 0) {
361
+ this.sources.push(...envOverrides);
362
+ }
363
+ // Configure core package dependencies
364
+ this.configureCorePackageDependencies(config);
365
+ // Validate the configuration
366
+ const validation = validateEmailManagerConfig(config);
367
+ if (!validation.isValid) {
368
+ console.error('❌ Email Manager Suite: Configuration validation failed');
369
+ validation.errors.forEach(error => console.error(` └── ${error}`));
370
+ throw new Error('Invalid email manager suite configuration');
371
+ }
372
+ // Apply schema defaults and validate types
373
+ const resolvedConfig = emailManagerConfigSchema.parse(config);
374
+ // Log configuration sources for transparency
375
+ if (this.sources.length > 1) { // More than just defaults
376
+ console.log('⚙️ Email Manager Suite: Configuration loaded');
377
+ this.sources.slice(1).forEach(source => {
378
+ console.log(` └── ${source.source}: ${source.description}`);
379
+ });
380
+ }
381
+ return resolvedConfig;
382
+ }
383
+ /**
384
+ * Configure core package dependencies with overrides
385
+ */
386
+ configureCorePackageDependencies(config) {
387
+ // Log core package configuration overrides for transparency
388
+ const coreOverrides = [];
389
+ if (config.corePackages?.emailSender) {
390
+ coreOverrides.push('@bernierllc/email-sender configuration');
391
+ }
392
+ if (config.corePackages?.templateEngine) {
393
+ coreOverrides.push('@bernierllc/template-engine configuration');
394
+ }
395
+ if (config.corePackages?.cryptoUtils) {
396
+ coreOverrides.push('@bernierllc/crypto-utils configuration');
397
+ }
398
+ if (coreOverrides.length > 0) {
399
+ console.log('⚙️ Email Manager Suite: Configuring core package dependencies');
400
+ coreOverrides.forEach(override => {
401
+ console.log(` └── Overriding: ${override}`);
402
+ });
403
+ }
404
+ }
405
+ /**
406
+ * Get configuration sources for debugging
407
+ */
408
+ getConfigurationSources() {
409
+ return [...this.sources];
410
+ }
411
+ /**
412
+ * Get environment variable documentation
413
+ */
414
+ getEnvironmentVariableDocumentation() {
415
+ const docs = {};
416
+ Object.entries(ENV_MAPPINGS).forEach(([configPath, envVar]) => {
417
+ docs[envVar] = `Controls ${configPath} configuration`;
418
+ });
419
+ return docs;
420
+ }
421
+ /**
422
+ * Print resolved configuration with sensitive data redacted
423
+ */
424
+ printConfiguration(config, redactSecrets = true) {
425
+ const configCopy = JSON.parse(JSON.stringify(config));
426
+ if (redactSecrets) {
427
+ // Redact sensitive configuration values
428
+ if (configCopy.security?.dkimPrivateKeyPath) {
429
+ configCopy.security.dkimPrivateKeyPath = '[REDACTED]';
430
+ }
431
+ if (configCopy.analytics?.webhooks?.secret) {
432
+ configCopy.analytics.webhooks.secret = '[REDACTED]';
433
+ }
434
+ if (configCopy.database?.url) {
435
+ configCopy.database.url = configCopy.database.url.replace(/:\/\/[^:]+:[^@]+@/, '://[REDACTED]:[REDACTED]@');
436
+ }
437
+ if (configCopy.cache?.url) {
438
+ configCopy.cache.url = configCopy.cache.url.replace(/:\/\/[^:]+:[^@]+@/, '://[REDACTED]:[REDACTED]@');
439
+ }
440
+ }
441
+ return JSON.stringify(configCopy, null, 2);
442
+ }
443
+ }
444
+ /**
445
+ * Load email manager suite configuration
446
+ * Main entry point for configuration loading
447
+ */
448
+ export function loadEmailManagerConfiguration() {
449
+ const loader = new EmailManagerConfigurationLoader();
450
+ return loader.loadConfiguration();
451
+ }
452
+ /**
453
+ * Load configuration with source tracking for debugging
454
+ */
455
+ export function loadEmailManagerConfigurationWithSources() {
456
+ const loader = new EmailManagerConfigurationLoader();
457
+ const config = loader.loadConfiguration();
458
+ const sources = loader.getConfigurationSources();
459
+ return { config, sources };
460
+ }
461
+ /**
462
+ * Get environment variable documentation
463
+ */
464
+ export function getEmailManagerEnvironmentDocumentation() {
465
+ const loader = new EmailManagerConfigurationLoader();
466
+ return loader.getEnvironmentVariableDocumentation();
467
+ }
468
+ //# sourceMappingURL=loadConfiguration.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loadConfiguration.js","sourceRoot":"","sources":["../../src/config/loadConfiguration.ts"],"names":[],"mappings":"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"}