@bloomneo/appkit 1.2.9
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 +21 -0
- package/README.md +902 -0
- package/bin/appkit.js +71 -0
- package/bin/commands/generate.js +1050 -0
- package/bin/templates/backend/README.md.template +39 -0
- package/bin/templates/backend/api.http.template +0 -0
- package/bin/templates/backend/docs/APPKIT_CLI.md +507 -0
- package/bin/templates/backend/docs/APPKIT_COMMENTS_GUIDELINES.md +61 -0
- package/bin/templates/backend/docs/APPKIT_LLM_GUIDE.md +2539 -0
- package/bin/templates/backend/package.json.template +34 -0
- package/bin/templates/backend/src/api/features/welcome/welcome.http.template +29 -0
- package/bin/templates/backend/src/api/features/welcome/welcome.route.ts.template +36 -0
- package/bin/templates/backend/src/api/features/welcome/welcome.service.ts.template +88 -0
- package/bin/templates/backend/src/api/features/welcome/welcome.types.ts.template +18 -0
- package/bin/templates/backend/src/api/lib/api-router.ts.template +84 -0
- package/bin/templates/backend/src/api/server.ts.template +188 -0
- package/bin/templates/backend/tsconfig.api.json.template +24 -0
- package/bin/templates/backend/tsconfig.json.template +40 -0
- package/bin/templates/feature/feature.http.template +63 -0
- package/bin/templates/feature/feature.route.ts.template +36 -0
- package/bin/templates/feature/feature.service.ts.template +81 -0
- package/bin/templates/feature/feature.types.ts.template +23 -0
- package/bin/templates/feature-db/feature.http.template +63 -0
- package/bin/templates/feature-db/feature.model.ts.template +74 -0
- package/bin/templates/feature-db/feature.route.ts.template +58 -0
- package/bin/templates/feature-db/feature.service.ts.template +231 -0
- package/bin/templates/feature-db/feature.types.ts.template +25 -0
- package/bin/templates/feature-db/schema-addition.prisma.template +9 -0
- package/bin/templates/feature-db/seeding/README.md.template +57 -0
- package/bin/templates/feature-db/seeding/feature.seed.js.template +67 -0
- package/bin/templates/feature-user/schema-addition.prisma.template +19 -0
- package/bin/templates/feature-user/user.http.template +157 -0
- package/bin/templates/feature-user/user.model.ts.template +244 -0
- package/bin/templates/feature-user/user.route.ts.template +379 -0
- package/bin/templates/feature-user/user.seed.js.template +182 -0
- package/bin/templates/feature-user/user.service.ts.template +426 -0
- package/bin/templates/feature-user/user.types.ts.template +127 -0
- package/dist/auth/auth.d.ts +182 -0
- package/dist/auth/auth.d.ts.map +1 -0
- package/dist/auth/auth.js +477 -0
- package/dist/auth/auth.js.map +1 -0
- package/dist/auth/defaults.d.ts +104 -0
- package/dist/auth/defaults.d.ts.map +1 -0
- package/dist/auth/defaults.js +374 -0
- package/dist/auth/defaults.js.map +1 -0
- package/dist/auth/index.d.ts +70 -0
- package/dist/auth/index.d.ts.map +1 -0
- package/dist/auth/index.js +94 -0
- package/dist/auth/index.js.map +1 -0
- package/dist/cache/cache.d.ts +118 -0
- package/dist/cache/cache.d.ts.map +1 -0
- package/dist/cache/cache.js +249 -0
- package/dist/cache/cache.js.map +1 -0
- package/dist/cache/defaults.d.ts +63 -0
- package/dist/cache/defaults.d.ts.map +1 -0
- package/dist/cache/defaults.js +193 -0
- package/dist/cache/defaults.js.map +1 -0
- package/dist/cache/index.d.ts +101 -0
- package/dist/cache/index.d.ts.map +1 -0
- package/dist/cache/index.js +203 -0
- package/dist/cache/index.js.map +1 -0
- package/dist/cache/strategies/memory.d.ts +138 -0
- package/dist/cache/strategies/memory.d.ts.map +1 -0
- package/dist/cache/strategies/memory.js +348 -0
- package/dist/cache/strategies/memory.js.map +1 -0
- package/dist/cache/strategies/redis.d.ts +105 -0
- package/dist/cache/strategies/redis.d.ts.map +1 -0
- package/dist/cache/strategies/redis.js +318 -0
- package/dist/cache/strategies/redis.js.map +1 -0
- package/dist/config/config.d.ts +62 -0
- package/dist/config/config.d.ts.map +1 -0
- package/dist/config/config.js +107 -0
- package/dist/config/config.js.map +1 -0
- package/dist/config/defaults.d.ts +44 -0
- package/dist/config/defaults.d.ts.map +1 -0
- package/dist/config/defaults.js +217 -0
- package/dist/config/defaults.js.map +1 -0
- package/dist/config/index.d.ts +105 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +163 -0
- package/dist/config/index.js.map +1 -0
- package/dist/database/adapters/mongoose.d.ts +106 -0
- package/dist/database/adapters/mongoose.d.ts.map +1 -0
- package/dist/database/adapters/mongoose.js +480 -0
- package/dist/database/adapters/mongoose.js.map +1 -0
- package/dist/database/adapters/prisma.d.ts +106 -0
- package/dist/database/adapters/prisma.d.ts.map +1 -0
- package/dist/database/adapters/prisma.js +494 -0
- package/dist/database/adapters/prisma.js.map +1 -0
- package/dist/database/defaults.d.ts +87 -0
- package/dist/database/defaults.d.ts.map +1 -0
- package/dist/database/defaults.js +271 -0
- package/dist/database/defaults.js.map +1 -0
- package/dist/database/index.d.ts +137 -0
- package/dist/database/index.d.ts.map +1 -0
- package/dist/database/index.js +490 -0
- package/dist/database/index.js.map +1 -0
- package/dist/email/defaults.d.ts +100 -0
- package/dist/email/defaults.d.ts.map +1 -0
- package/dist/email/defaults.js +400 -0
- package/dist/email/defaults.js.map +1 -0
- package/dist/email/email.d.ts +139 -0
- package/dist/email/email.d.ts.map +1 -0
- package/dist/email/email.js +316 -0
- package/dist/email/email.js.map +1 -0
- package/dist/email/index.d.ts +176 -0
- package/dist/email/index.d.ts.map +1 -0
- package/dist/email/index.js +251 -0
- package/dist/email/index.js.map +1 -0
- package/dist/email/strategies/console.d.ts +90 -0
- package/dist/email/strategies/console.d.ts.map +1 -0
- package/dist/email/strategies/console.js +268 -0
- package/dist/email/strategies/console.js.map +1 -0
- package/dist/email/strategies/resend.d.ts +84 -0
- package/dist/email/strategies/resend.d.ts.map +1 -0
- package/dist/email/strategies/resend.js +266 -0
- package/dist/email/strategies/resend.js.map +1 -0
- package/dist/email/strategies/smtp.d.ts +77 -0
- package/dist/email/strategies/smtp.d.ts.map +1 -0
- package/dist/email/strategies/smtp.js +286 -0
- package/dist/email/strategies/smtp.js.map +1 -0
- package/dist/error/defaults.d.ts +40 -0
- package/dist/error/defaults.d.ts.map +1 -0
- package/dist/error/defaults.js +75 -0
- package/dist/error/defaults.js.map +1 -0
- package/dist/error/error.d.ts +140 -0
- package/dist/error/error.d.ts.map +1 -0
- package/dist/error/error.js +200 -0
- package/dist/error/error.js.map +1 -0
- package/dist/error/index.d.ts +145 -0
- package/dist/error/index.d.ts.map +1 -0
- package/dist/error/index.js +145 -0
- package/dist/error/index.js.map +1 -0
- package/dist/event/defaults.d.ts +111 -0
- package/dist/event/defaults.d.ts.map +1 -0
- package/dist/event/defaults.js +378 -0
- package/dist/event/defaults.js.map +1 -0
- package/dist/event/event.d.ts +171 -0
- package/dist/event/event.d.ts.map +1 -0
- package/dist/event/event.js +391 -0
- package/dist/event/event.js.map +1 -0
- package/dist/event/index.d.ts +173 -0
- package/dist/event/index.d.ts.map +1 -0
- package/dist/event/index.js +302 -0
- package/dist/event/index.js.map +1 -0
- package/dist/event/strategies/memory.d.ts +122 -0
- package/dist/event/strategies/memory.d.ts.map +1 -0
- package/dist/event/strategies/memory.js +331 -0
- package/dist/event/strategies/memory.js.map +1 -0
- package/dist/event/strategies/redis.d.ts +115 -0
- package/dist/event/strategies/redis.d.ts.map +1 -0
- package/dist/event/strategies/redis.js +434 -0
- package/dist/event/strategies/redis.js.map +1 -0
- package/dist/index.d.ts +58 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +72 -0
- package/dist/index.js.map +1 -0
- package/dist/logger/defaults.d.ts +67 -0
- package/dist/logger/defaults.d.ts.map +1 -0
- package/dist/logger/defaults.js +213 -0
- package/dist/logger/defaults.js.map +1 -0
- package/dist/logger/index.d.ts +84 -0
- package/dist/logger/index.d.ts.map +1 -0
- package/dist/logger/index.js +101 -0
- package/dist/logger/index.js.map +1 -0
- package/dist/logger/logger.d.ts +165 -0
- package/dist/logger/logger.d.ts.map +1 -0
- package/dist/logger/logger.js +843 -0
- package/dist/logger/logger.js.map +1 -0
- package/dist/logger/transports/console.d.ts +102 -0
- package/dist/logger/transports/console.d.ts.map +1 -0
- package/dist/logger/transports/console.js +276 -0
- package/dist/logger/transports/console.js.map +1 -0
- package/dist/logger/transports/database.d.ts +153 -0
- package/dist/logger/transports/database.d.ts.map +1 -0
- package/dist/logger/transports/database.js +539 -0
- package/dist/logger/transports/database.js.map +1 -0
- package/dist/logger/transports/file.d.ts +146 -0
- package/dist/logger/transports/file.d.ts.map +1 -0
- package/dist/logger/transports/file.js +464 -0
- package/dist/logger/transports/file.js.map +1 -0
- package/dist/logger/transports/http.d.ts +128 -0
- package/dist/logger/transports/http.d.ts.map +1 -0
- package/dist/logger/transports/http.js +401 -0
- package/dist/logger/transports/http.js.map +1 -0
- package/dist/logger/transports/webhook.d.ts +152 -0
- package/dist/logger/transports/webhook.d.ts.map +1 -0
- package/dist/logger/transports/webhook.js +485 -0
- package/dist/logger/transports/webhook.js.map +1 -0
- package/dist/queue/defaults.d.ts +66 -0
- package/dist/queue/defaults.d.ts.map +1 -0
- package/dist/queue/defaults.js +205 -0
- package/dist/queue/defaults.js.map +1 -0
- package/dist/queue/index.d.ts +124 -0
- package/dist/queue/index.d.ts.map +1 -0
- package/dist/queue/index.js +116 -0
- package/dist/queue/index.js.map +1 -0
- package/dist/queue/queue.d.ts +156 -0
- package/dist/queue/queue.d.ts.map +1 -0
- package/dist/queue/queue.js +387 -0
- package/dist/queue/queue.js.map +1 -0
- package/dist/queue/transports/database.d.ts +165 -0
- package/dist/queue/transports/database.d.ts.map +1 -0
- package/dist/queue/transports/database.js +595 -0
- package/dist/queue/transports/database.js.map +1 -0
- package/dist/queue/transports/memory.d.ts +143 -0
- package/dist/queue/transports/memory.d.ts.map +1 -0
- package/dist/queue/transports/memory.js +415 -0
- package/dist/queue/transports/memory.js.map +1 -0
- package/dist/queue/transports/redis.d.ts +203 -0
- package/dist/queue/transports/redis.d.ts.map +1 -0
- package/dist/queue/transports/redis.js +744 -0
- package/dist/queue/transports/redis.js.map +1 -0
- package/dist/security/defaults.d.ts +64 -0
- package/dist/security/defaults.d.ts.map +1 -0
- package/dist/security/defaults.js +159 -0
- package/dist/security/defaults.js.map +1 -0
- package/dist/security/index.d.ts +110 -0
- package/dist/security/index.d.ts.map +1 -0
- package/dist/security/index.js +160 -0
- package/dist/security/index.js.map +1 -0
- package/dist/security/security.d.ts +138 -0
- package/dist/security/security.d.ts.map +1 -0
- package/dist/security/security.js +419 -0
- package/dist/security/security.js.map +1 -0
- package/dist/storage/defaults.d.ts +79 -0
- package/dist/storage/defaults.d.ts.map +1 -0
- package/dist/storage/defaults.js +358 -0
- package/dist/storage/defaults.js.map +1 -0
- package/dist/storage/index.d.ts +153 -0
- package/dist/storage/index.d.ts.map +1 -0
- package/dist/storage/index.js +242 -0
- package/dist/storage/index.js.map +1 -0
- package/dist/storage/storage.d.ts +151 -0
- package/dist/storage/storage.d.ts.map +1 -0
- package/dist/storage/storage.js +439 -0
- package/dist/storage/storage.js.map +1 -0
- package/dist/storage/strategies/local.d.ts +117 -0
- package/dist/storage/strategies/local.d.ts.map +1 -0
- package/dist/storage/strategies/local.js +368 -0
- package/dist/storage/strategies/local.js.map +1 -0
- package/dist/storage/strategies/r2.d.ts +130 -0
- package/dist/storage/strategies/r2.d.ts.map +1 -0
- package/dist/storage/strategies/r2.js +470 -0
- package/dist/storage/strategies/r2.js.map +1 -0
- package/dist/storage/strategies/s3.d.ts +121 -0
- package/dist/storage/strategies/s3.d.ts.map +1 -0
- package/dist/storage/strategies/s3.js +461 -0
- package/dist/storage/strategies/s3.js.map +1 -0
- package/dist/util/defaults.d.ts +77 -0
- package/dist/util/defaults.d.ts.map +1 -0
- package/dist/util/defaults.js +193 -0
- package/dist/util/defaults.js.map +1 -0
- package/dist/util/index.d.ts +97 -0
- package/dist/util/index.d.ts.map +1 -0
- package/dist/util/index.js +165 -0
- package/dist/util/index.js.map +1 -0
- package/dist/util/util.d.ts +145 -0
- package/dist/util/util.d.ts.map +1 -0
- package/dist/util/util.js +481 -0
- package/dist/util/util.js.map +1 -0
- package/package.json +234 -0
|
@@ -0,0 +1,251 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Ultra-simple email sending that just works with automatic provider detection
|
|
3
|
+
* @module @bloomneo/appkit/email
|
|
4
|
+
* @file src/email/index.ts
|
|
5
|
+
*
|
|
6
|
+
* @llm-rule WHEN: Building apps that need email sending with zero configuration
|
|
7
|
+
* @llm-rule AVOID: Complex email setups - this auto-detects Resend/SMTP/Console from environment
|
|
8
|
+
* @llm-rule NOTE: Uses emailClass.get() pattern like auth - get() → email.send() → done
|
|
9
|
+
* @llm-rule NOTE: Common pattern - emailClass.get() → email.send({ to, subject, text }) → sent
|
|
10
|
+
*/
|
|
11
|
+
import { EmailClass } from './email.js';
|
|
12
|
+
import { getSmartDefaults, validateProductionRequirements, validateStartupConfiguration, performHealthCheck } from './defaults.js';
|
|
13
|
+
// Global email instance for performance (like auth module)
|
|
14
|
+
let globalEmail = null;
|
|
15
|
+
/**
|
|
16
|
+
* Get email instance - the only function you need to learn
|
|
17
|
+
* Strategy auto-detected from environment (RESEND_API_KEY → Resend, SMTP_HOST → SMTP, default → Console)
|
|
18
|
+
* @llm-rule WHEN: Need email sending in any part of your app - this is your main entry point
|
|
19
|
+
* @llm-rule AVOID: Creating EmailClass directly - always use this function
|
|
20
|
+
* @llm-rule NOTE: Typical flow - get() → email.send() → email delivered/logged
|
|
21
|
+
*/
|
|
22
|
+
function get() {
|
|
23
|
+
// Lazy initialization - parse environment once (like auth)
|
|
24
|
+
if (!globalEmail) {
|
|
25
|
+
const config = getSmartDefaults();
|
|
26
|
+
globalEmail = new EmailClass(config);
|
|
27
|
+
}
|
|
28
|
+
return globalEmail;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Clear email instance and disconnect - essential for testing
|
|
32
|
+
* @llm-rule WHEN: Testing email logic with different configurations or app shutdown
|
|
33
|
+
* @llm-rule AVOID: Using in production except for graceful shutdown
|
|
34
|
+
*/
|
|
35
|
+
async function clear() {
|
|
36
|
+
if (globalEmail) {
|
|
37
|
+
await globalEmail.disconnect();
|
|
38
|
+
globalEmail = null;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Reset email configuration (useful for testing)
|
|
43
|
+
* @llm-rule WHEN: Testing email logic with different environment configurations
|
|
44
|
+
* @llm-rule AVOID: Using in production - only for tests and development
|
|
45
|
+
*/
|
|
46
|
+
async function reset(newConfig) {
|
|
47
|
+
// Clear existing instance
|
|
48
|
+
await clear();
|
|
49
|
+
// Reset configuration
|
|
50
|
+
if (newConfig) {
|
|
51
|
+
const defaults = getSmartDefaults();
|
|
52
|
+
const config = { ...defaults, ...newConfig };
|
|
53
|
+
globalEmail = new EmailClass(config);
|
|
54
|
+
}
|
|
55
|
+
else {
|
|
56
|
+
globalEmail = null; // Will reload from environment on next get()
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Get active email strategy for debugging
|
|
61
|
+
* @llm-rule WHEN: Debugging or health checks to see which strategy is active (Resend/SMTP/Console)
|
|
62
|
+
* @llm-rule AVOID: Using for application logic - email should be transparent
|
|
63
|
+
*/
|
|
64
|
+
function getStrategy() {
|
|
65
|
+
const email = get();
|
|
66
|
+
return email.getStrategy();
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Get email configuration summary for debugging
|
|
70
|
+
* @llm-rule WHEN: Health checks or debugging email configuration
|
|
71
|
+
* @llm-rule AVOID: Exposing sensitive API keys or passwords - this only shows safe info
|
|
72
|
+
*/
|
|
73
|
+
function getConfig() {
|
|
74
|
+
const email = get();
|
|
75
|
+
return email.getConfig();
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Check if Resend is available and configured
|
|
79
|
+
* @llm-rule WHEN: Conditional logic based on email capabilities
|
|
80
|
+
* @llm-rule AVOID: Complex email detection - just use email normally, it handles strategy
|
|
81
|
+
*/
|
|
82
|
+
function hasResend() {
|
|
83
|
+
return !!process.env.RESEND_API_KEY;
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Check if SMTP is available and configured
|
|
87
|
+
* @llm-rule WHEN: Conditional logic based on email capabilities
|
|
88
|
+
* @llm-rule AVOID: Complex email detection - just use email normally, it handles strategy
|
|
89
|
+
*/
|
|
90
|
+
function hasSmtp() {
|
|
91
|
+
return !!process.env.SMTP_HOST;
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Check if any email provider is configured (not just console)
|
|
95
|
+
* @llm-rule WHEN: Determining if real emails can be sent
|
|
96
|
+
* @llm-rule AVOID: Using for validation - email.send() will return success/error appropriately
|
|
97
|
+
*/
|
|
98
|
+
function hasProvider() {
|
|
99
|
+
return hasResend() || hasSmtp();
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Send simple email (convenience function)
|
|
103
|
+
* @llm-rule WHEN: Quick email sending without getting instance first
|
|
104
|
+
* @llm-rule AVOID: For complex emails - use get() and full EmailData object instead
|
|
105
|
+
*/
|
|
106
|
+
async function send(data) {
|
|
107
|
+
const email = get();
|
|
108
|
+
return await email.send(data);
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Send simple text email (ultra-convenience function)
|
|
112
|
+
* @llm-rule WHEN: Sending basic notifications or alerts quickly
|
|
113
|
+
* @llm-rule AVOID: For formatted emails - use send() with HTML content instead
|
|
114
|
+
*/
|
|
115
|
+
async function sendText(to, subject, text) {
|
|
116
|
+
const email = get();
|
|
117
|
+
return await email.sendText(to, subject, text);
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Validate email configuration at startup with detailed feedback
|
|
121
|
+
* @llm-rule WHEN: App startup to ensure email is properly configured
|
|
122
|
+
* @llm-rule AVOID: Skipping validation - missing email config causes runtime issues
|
|
123
|
+
* @llm-rule NOTE: Returns validation results instead of throwing - allows graceful handling
|
|
124
|
+
*/
|
|
125
|
+
function validateConfig() {
|
|
126
|
+
try {
|
|
127
|
+
const validation = validateStartupConfiguration();
|
|
128
|
+
if (validation.errors.length > 0) {
|
|
129
|
+
console.error('[VoilaJSX AppKit] Email configuration errors:', validation.errors);
|
|
130
|
+
}
|
|
131
|
+
if (validation.warnings.length > 0) {
|
|
132
|
+
console.warn('[VoilaJSX AppKit] Email configuration warnings:', validation.warnings);
|
|
133
|
+
}
|
|
134
|
+
if (validation.ready) {
|
|
135
|
+
console.log(`✅ [VoilaJSX AppKit] Email configured with ${validation.strategy} strategy`);
|
|
136
|
+
}
|
|
137
|
+
return {
|
|
138
|
+
valid: validation.errors.length === 0,
|
|
139
|
+
strategy: validation.strategy,
|
|
140
|
+
warnings: validation.warnings,
|
|
141
|
+
errors: validation.errors,
|
|
142
|
+
ready: validation.ready,
|
|
143
|
+
};
|
|
144
|
+
}
|
|
145
|
+
catch (error) {
|
|
146
|
+
const errorMessage = error.message;
|
|
147
|
+
console.error('[VoilaJSX AppKit] Email configuration validation failed:', errorMessage);
|
|
148
|
+
return {
|
|
149
|
+
valid: false,
|
|
150
|
+
strategy: 'unknown',
|
|
151
|
+
warnings: [],
|
|
152
|
+
errors: [errorMessage],
|
|
153
|
+
ready: false,
|
|
154
|
+
};
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* Validate production requirements and throw if critical issues found
|
|
159
|
+
* @llm-rule WHEN: Production deployment validation - ensures email works in production
|
|
160
|
+
* @llm-rule AVOID: Skipping in production - email failures are often silent
|
|
161
|
+
* @llm-rule NOTE: Throws on critical issues, warns on non-critical ones
|
|
162
|
+
*/
|
|
163
|
+
function validateProduction() {
|
|
164
|
+
try {
|
|
165
|
+
validateProductionRequirements();
|
|
166
|
+
if (process.env.NODE_ENV === 'production' && !hasProvider()) {
|
|
167
|
+
console.warn('[VoilaJSX AppKit] No email provider configured in production. ' +
|
|
168
|
+
'Set RESEND_API_KEY or SMTP_HOST to send real emails.');
|
|
169
|
+
}
|
|
170
|
+
console.log('✅ [VoilaJSX AppKit] Production email requirements validated');
|
|
171
|
+
}
|
|
172
|
+
catch (error) {
|
|
173
|
+
console.error('[VoilaJSX AppKit] Production email validation failed:', error.message);
|
|
174
|
+
throw error;
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
/**
|
|
178
|
+
* Get comprehensive health check status for monitoring
|
|
179
|
+
* @llm-rule WHEN: Health check endpoints or monitoring systems
|
|
180
|
+
* @llm-rule AVOID: Using in critical application path - this is for monitoring only
|
|
181
|
+
* @llm-rule NOTE: Returns detailed status without exposing sensitive configuration
|
|
182
|
+
*/
|
|
183
|
+
function getHealthStatus() {
|
|
184
|
+
return performHealthCheck();
|
|
185
|
+
}
|
|
186
|
+
/**
|
|
187
|
+
* Graceful shutdown for email instance
|
|
188
|
+
* @llm-rule WHEN: App shutdown or process termination
|
|
189
|
+
* @llm-rule AVOID: Abrupt process exit - graceful shutdown prevents connection issues
|
|
190
|
+
*/
|
|
191
|
+
async function shutdown() {
|
|
192
|
+
console.log('🔄 [AppKit] Email graceful shutdown...');
|
|
193
|
+
try {
|
|
194
|
+
await clear();
|
|
195
|
+
console.log('✅ [AppKit] Email shutdown complete');
|
|
196
|
+
}
|
|
197
|
+
catch (error) {
|
|
198
|
+
console.error('❌ [AppKit] Email shutdown error:', error.message);
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
/**
|
|
202
|
+
* Single email export with minimal API (like auth module)
|
|
203
|
+
*/
|
|
204
|
+
export const emailClass = {
|
|
205
|
+
// Core method (like auth.get())
|
|
206
|
+
get,
|
|
207
|
+
// Utility methods
|
|
208
|
+
clear,
|
|
209
|
+
reset,
|
|
210
|
+
getStrategy,
|
|
211
|
+
getConfig,
|
|
212
|
+
hasResend,
|
|
213
|
+
hasSmtp,
|
|
214
|
+
hasProvider,
|
|
215
|
+
// Convenience methods
|
|
216
|
+
send,
|
|
217
|
+
sendText,
|
|
218
|
+
// Validation and lifecycle
|
|
219
|
+
validateConfig,
|
|
220
|
+
validateProduction,
|
|
221
|
+
getHealthStatus,
|
|
222
|
+
shutdown,
|
|
223
|
+
};
|
|
224
|
+
export { EmailClass } from './email.js';
|
|
225
|
+
// Default export
|
|
226
|
+
export default emailClass;
|
|
227
|
+
// Auto-setup graceful shutdown handlers
|
|
228
|
+
if (typeof process !== 'undefined') {
|
|
229
|
+
// Handle graceful shutdown
|
|
230
|
+
const shutdownHandler = () => {
|
|
231
|
+
shutdown().finally(() => {
|
|
232
|
+
process.exit(0);
|
|
233
|
+
});
|
|
234
|
+
};
|
|
235
|
+
process.on('SIGTERM', shutdownHandler);
|
|
236
|
+
process.on('SIGINT', shutdownHandler);
|
|
237
|
+
// Handle uncaught errors
|
|
238
|
+
process.on('uncaughtException', (error) => {
|
|
239
|
+
console.error('[AppKit] Uncaught exception during email operation:', error);
|
|
240
|
+
shutdown().finally(() => {
|
|
241
|
+
process.exit(1);
|
|
242
|
+
});
|
|
243
|
+
});
|
|
244
|
+
process.on('unhandledRejection', (reason) => {
|
|
245
|
+
console.error('[AppKit] Unhandled rejection during email operation:', reason);
|
|
246
|
+
shutdown().finally(() => {
|
|
247
|
+
process.exit(1);
|
|
248
|
+
});
|
|
249
|
+
});
|
|
250
|
+
}
|
|
251
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/email/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Console email strategy for development with beautiful formatting and email preview
|
|
3
|
+
* @module @bloomneo/appkit/email
|
|
4
|
+
* @file src/email/strategies/console.ts
|
|
5
|
+
*
|
|
6
|
+
* @llm-rule WHEN: No email provider configured - perfect for development and testing
|
|
7
|
+
* @llm-rule AVOID: Using in production - emails are only logged, not sent
|
|
8
|
+
* @llm-rule NOTE: Beautiful console output with colors, formatting, and email preview for development
|
|
9
|
+
*/
|
|
10
|
+
import type { EmailStrategy, EmailData, EmailResult } from '../email.js';
|
|
11
|
+
import type { EmailConfig } from '../defaults.js';
|
|
12
|
+
/**
|
|
13
|
+
* Console email strategy with beautiful development output
|
|
14
|
+
*/
|
|
15
|
+
export declare class ConsoleStrategy implements EmailStrategy {
|
|
16
|
+
private config;
|
|
17
|
+
private colorize;
|
|
18
|
+
private showPreview;
|
|
19
|
+
private format;
|
|
20
|
+
/**
|
|
21
|
+
* Creates console strategy with direct environment access (like auth pattern)
|
|
22
|
+
* @llm-rule WHEN: No email provider configured - automatic fallback for development
|
|
23
|
+
* @llm-rule AVOID: Manual console configuration - environment detection handles this
|
|
24
|
+
*/
|
|
25
|
+
constructor(config: EmailConfig);
|
|
26
|
+
/**
|
|
27
|
+
* Logs email to console with beautiful formatting
|
|
28
|
+
* @llm-rule WHEN: Development email sending - provides visual feedback without actual sending
|
|
29
|
+
* @llm-rule AVOID: Using for production - emails are only displayed, not delivered
|
|
30
|
+
* @llm-rule NOTE: Shows email content, recipients, and preview for development workflow
|
|
31
|
+
*/
|
|
32
|
+
send(data: EmailData): Promise<EmailResult>;
|
|
33
|
+
/**
|
|
34
|
+
* Disconnects console strategy (no-op)
|
|
35
|
+
* @llm-rule WHEN: App shutdown - console has no resources to cleanup
|
|
36
|
+
* @llm-rule AVOID: Expecting cleanup behavior - console strategy is stateless
|
|
37
|
+
*/
|
|
38
|
+
disconnect(): Promise<void>;
|
|
39
|
+
/**
|
|
40
|
+
* Logs email in simple format
|
|
41
|
+
*/
|
|
42
|
+
private logSimpleEmail;
|
|
43
|
+
/**
|
|
44
|
+
* Logs email in detailed format
|
|
45
|
+
*/
|
|
46
|
+
private logDetailedEmail;
|
|
47
|
+
/**
|
|
48
|
+
* Shows email content preview
|
|
49
|
+
*/
|
|
50
|
+
private showEmailPreview;
|
|
51
|
+
/**
|
|
52
|
+
* Formats email recipients for display
|
|
53
|
+
*/
|
|
54
|
+
private formatRecipients;
|
|
55
|
+
/**
|
|
56
|
+
* Formats single email address for display
|
|
57
|
+
*/
|
|
58
|
+
private formatEmailAddress;
|
|
59
|
+
/**
|
|
60
|
+
* Gets attachment size for display
|
|
61
|
+
*/
|
|
62
|
+
private getAttachmentSize;
|
|
63
|
+
/**
|
|
64
|
+
* Converts HTML to plain text for preview
|
|
65
|
+
*/
|
|
66
|
+
private htmlToText;
|
|
67
|
+
/**
|
|
68
|
+
* Truncates text for preview
|
|
69
|
+
*/
|
|
70
|
+
private truncateText;
|
|
71
|
+
/**
|
|
72
|
+
* Generates unique message ID
|
|
73
|
+
*/
|
|
74
|
+
private generateMessageId;
|
|
75
|
+
/**
|
|
76
|
+
* Gets color codes for console output
|
|
77
|
+
*/
|
|
78
|
+
private getColors;
|
|
79
|
+
/**
|
|
80
|
+
* Gets console strategy statistics
|
|
81
|
+
*/
|
|
82
|
+
getStats(): {
|
|
83
|
+
emailsLogged: number;
|
|
84
|
+
strategy: string;
|
|
85
|
+
colorEnabled: boolean;
|
|
86
|
+
previewEnabled: boolean;
|
|
87
|
+
format: string;
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
//# sourceMappingURL=console.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"console.d.ts","sourceRoot":"","sources":["../../../src/email/strategies/console.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,SAAS,EAAE,WAAW,EAAgB,MAAM,aAAa,CAAC;AACvF,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAElD;;GAEG;AACH,qBAAa,eAAgB,YAAW,aAAa;IACnD,OAAO,CAAC,MAAM,CAAc;IAC5B,OAAO,CAAC,QAAQ,CAAU;IAC1B,OAAO,CAAC,WAAW,CAAU;IAC7B,OAAO,CAAC,MAAM,CAAwB;IAEtC;;;;OAIG;gBACS,MAAM,EAAE,WAAW;IAO/B;;;;;OAKG;IACG,IAAI,CAAC,IAAI,EAAE,SAAS,GAAG,OAAO,CAAC,WAAW,CAAC;IA+BjD;;;;OAIG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAOjC;;OAEG;IACH,OAAO,CAAC,cAAc;IAoBtB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAgDxB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IA6BxB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAKxB;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAY1B;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAYzB;;OAEG;IACH,OAAO,CAAC,UAAU;IAiBlB;;OAEG;IACH,OAAO,CAAC,YAAY;IAQpB;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAMzB;;OAEG;IACH,OAAO,CAAC,SAAS;IAwBjB;;OAEG;IACH,QAAQ,IAAI;QACV,YAAY,EAAE,MAAM,CAAC;QACrB,QAAQ,EAAE,MAAM,CAAC;QACjB,YAAY,EAAE,OAAO,CAAC;QACtB,cAAc,EAAE,OAAO,CAAC;QACxB,MAAM,EAAE,MAAM,CAAC;KAChB;CAUF"}
|
|
@@ -0,0 +1,268 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Console email strategy for development with beautiful formatting and email preview
|
|
3
|
+
* @module @bloomneo/appkit/email
|
|
4
|
+
* @file src/email/strategies/console.ts
|
|
5
|
+
*
|
|
6
|
+
* @llm-rule WHEN: No email provider configured - perfect for development and testing
|
|
7
|
+
* @llm-rule AVOID: Using in production - emails are only logged, not sent
|
|
8
|
+
* @llm-rule NOTE: Beautiful console output with colors, formatting, and email preview for development
|
|
9
|
+
*/
|
|
10
|
+
/**
|
|
11
|
+
* Console email strategy with beautiful development output
|
|
12
|
+
*/
|
|
13
|
+
export class ConsoleStrategy {
|
|
14
|
+
config;
|
|
15
|
+
colorize;
|
|
16
|
+
showPreview;
|
|
17
|
+
format;
|
|
18
|
+
/**
|
|
19
|
+
* Creates console strategy with direct environment access (like auth pattern)
|
|
20
|
+
* @llm-rule WHEN: No email provider configured - automatic fallback for development
|
|
21
|
+
* @llm-rule AVOID: Manual console configuration - environment detection handles this
|
|
22
|
+
*/
|
|
23
|
+
constructor(config) {
|
|
24
|
+
this.config = config;
|
|
25
|
+
this.colorize = config.console.colorize;
|
|
26
|
+
this.showPreview = config.console.showPreview;
|
|
27
|
+
this.format = config.console.format;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Logs email to console with beautiful formatting
|
|
31
|
+
* @llm-rule WHEN: Development email sending - provides visual feedback without actual sending
|
|
32
|
+
* @llm-rule AVOID: Using for production - emails are only displayed, not delivered
|
|
33
|
+
* @llm-rule NOTE: Shows email content, recipients, and preview for development workflow
|
|
34
|
+
*/
|
|
35
|
+
async send(data) {
|
|
36
|
+
try {
|
|
37
|
+
// Generate unique message ID for tracking
|
|
38
|
+
const messageId = this.generateMessageId();
|
|
39
|
+
// Log email based on format preference
|
|
40
|
+
if (this.format === 'detailed') {
|
|
41
|
+
this.logDetailedEmail(data, messageId);
|
|
42
|
+
}
|
|
43
|
+
else {
|
|
44
|
+
this.logSimpleEmail(data, messageId);
|
|
45
|
+
}
|
|
46
|
+
// Show email preview if enabled
|
|
47
|
+
if (this.showPreview && (data.html || data.text)) {
|
|
48
|
+
this.showEmailPreview(data);
|
|
49
|
+
}
|
|
50
|
+
return {
|
|
51
|
+
success: true,
|
|
52
|
+
messageId,
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
catch (error) {
|
|
56
|
+
console.error(`❌ [AppKit] Console email error:`, error.message);
|
|
57
|
+
return {
|
|
58
|
+
success: false,
|
|
59
|
+
error: error.message,
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Disconnects console strategy (no-op)
|
|
65
|
+
* @llm-rule WHEN: App shutdown - console has no resources to cleanup
|
|
66
|
+
* @llm-rule AVOID: Expecting cleanup behavior - console strategy is stateless
|
|
67
|
+
*/
|
|
68
|
+
async disconnect() {
|
|
69
|
+
// Console strategy has no resources to clean up
|
|
70
|
+
return Promise.resolve();
|
|
71
|
+
}
|
|
72
|
+
// Private helper methods
|
|
73
|
+
/**
|
|
74
|
+
* Logs email in simple format
|
|
75
|
+
*/
|
|
76
|
+
logSimpleEmail(data, messageId) {
|
|
77
|
+
const colors = this.getColors();
|
|
78
|
+
console.log();
|
|
79
|
+
console.log(`${colors.cyan}📧 EMAIL SENT${colors.reset} ${colors.gray}(console)${colors.reset}`);
|
|
80
|
+
console.log(`${colors.gray}Message ID: ${messageId}${colors.reset}`);
|
|
81
|
+
console.log(`${colors.bold}To:${colors.reset} ${this.formatRecipients(data.to)}`);
|
|
82
|
+
console.log(`${colors.bold}Subject:${colors.reset} ${data.subject}`);
|
|
83
|
+
if (data.from) {
|
|
84
|
+
console.log(`${colors.bold}From:${colors.reset} ${this.formatEmailAddress(data.from)}`);
|
|
85
|
+
}
|
|
86
|
+
if (data.attachments && data.attachments.length > 0) {
|
|
87
|
+
console.log(`${colors.bold}Attachments:${colors.reset} ${data.attachments.length} file(s)`);
|
|
88
|
+
}
|
|
89
|
+
console.log();
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Logs email in detailed format
|
|
93
|
+
*/
|
|
94
|
+
logDetailedEmail(data, messageId) {
|
|
95
|
+
const colors = this.getColors();
|
|
96
|
+
console.log();
|
|
97
|
+
console.log(`${colors.cyan}╭─ 📧 EMAIL SENT ${colors.gray}(console)${colors.reset}`);
|
|
98
|
+
console.log(`${colors.cyan}│${colors.reset} ${colors.bold}Message ID:${colors.reset} ${messageId}`);
|
|
99
|
+
console.log(`${colors.cyan}│${colors.reset}`);
|
|
100
|
+
// Headers
|
|
101
|
+
console.log(`${colors.cyan}│${colors.reset} ${colors.bold}To:${colors.reset} ${this.formatRecipients(data.to)}`);
|
|
102
|
+
if (data.from) {
|
|
103
|
+
console.log(`${colors.cyan}│${colors.reset} ${colors.bold}From:${colors.reset} ${this.formatEmailAddress(data.from)}`);
|
|
104
|
+
}
|
|
105
|
+
if (data.cc) {
|
|
106
|
+
console.log(`${colors.cyan}│${colors.reset} ${colors.bold}CC:${colors.reset} ${this.formatRecipients(data.cc)}`);
|
|
107
|
+
}
|
|
108
|
+
if (data.bcc) {
|
|
109
|
+
console.log(`${colors.cyan}│${colors.reset} ${colors.bold}BCC:${colors.reset} ${this.formatRecipients(data.bcc)}`);
|
|
110
|
+
}
|
|
111
|
+
if (data.replyTo) {
|
|
112
|
+
console.log(`${colors.cyan}│${colors.reset} ${colors.bold}Reply-To:${colors.reset} ${this.formatEmailAddress(data.replyTo)}`);
|
|
113
|
+
}
|
|
114
|
+
console.log(`${colors.cyan}│${colors.reset} ${colors.bold}Subject:${colors.reset} ${data.subject}`);
|
|
115
|
+
// Content info
|
|
116
|
+
const contentTypes = [];
|
|
117
|
+
if (data.text)
|
|
118
|
+
contentTypes.push('text');
|
|
119
|
+
if (data.html)
|
|
120
|
+
contentTypes.push('html');
|
|
121
|
+
console.log(`${colors.cyan}│${colors.reset} ${colors.bold}Content:${colors.reset} ${contentTypes.join(', ')}`);
|
|
122
|
+
// Attachments
|
|
123
|
+
if (data.attachments && data.attachments.length > 0) {
|
|
124
|
+
console.log(`${colors.cyan}│${colors.reset} ${colors.bold}Attachments:${colors.reset}`);
|
|
125
|
+
data.attachments.forEach((attachment, index) => {
|
|
126
|
+
const size = this.getAttachmentSize(attachment.content);
|
|
127
|
+
console.log(`${colors.cyan}│${colors.reset} ${index + 1}. ${attachment.filename} (${size})`);
|
|
128
|
+
});
|
|
129
|
+
}
|
|
130
|
+
console.log(`${colors.cyan}╰─ ${colors.green}✅ Logged successfully${colors.reset}`);
|
|
131
|
+
console.log();
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Shows email content preview
|
|
135
|
+
*/
|
|
136
|
+
showEmailPreview(data) {
|
|
137
|
+
const colors = this.getColors();
|
|
138
|
+
console.log(`${colors.yellow}📋 EMAIL PREVIEW${colors.reset}`);
|
|
139
|
+
console.log(`${colors.gray}─────────────────${colors.reset}`);
|
|
140
|
+
// Show text content
|
|
141
|
+
if (data.text) {
|
|
142
|
+
console.log(`${colors.bold}TEXT VERSION:${colors.reset}`);
|
|
143
|
+
const previewText = this.truncateText(data.text, 300);
|
|
144
|
+
console.log(previewText);
|
|
145
|
+
if (data.html) {
|
|
146
|
+
console.log();
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
// Show HTML content (converted to text)
|
|
150
|
+
if (data.html) {
|
|
151
|
+
console.log(`${colors.bold}HTML VERSION:${colors.reset}`);
|
|
152
|
+
const htmlAsText = this.htmlToText(data.html);
|
|
153
|
+
const previewHtml = this.truncateText(htmlAsText, 300);
|
|
154
|
+
console.log(previewHtml);
|
|
155
|
+
}
|
|
156
|
+
console.log(`${colors.gray}─────────────────${colors.reset}`);
|
|
157
|
+
console.log();
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* Formats email recipients for display
|
|
161
|
+
*/
|
|
162
|
+
formatRecipients(recipients) {
|
|
163
|
+
const recipientArray = Array.isArray(recipients) ? recipients : [recipients];
|
|
164
|
+
return recipientArray.map(recipient => this.formatEmailAddress(recipient)).join(', ');
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* Formats single email address for display
|
|
168
|
+
*/
|
|
169
|
+
formatEmailAddress(address) {
|
|
170
|
+
if (typeof address === 'string') {
|
|
171
|
+
return address;
|
|
172
|
+
}
|
|
173
|
+
if (address.name) {
|
|
174
|
+
return `${address.name} <${address.email}>`;
|
|
175
|
+
}
|
|
176
|
+
return address.email;
|
|
177
|
+
}
|
|
178
|
+
/**
|
|
179
|
+
* Gets attachment size for display
|
|
180
|
+
*/
|
|
181
|
+
getAttachmentSize(content) {
|
|
182
|
+
const bytes = Buffer.isBuffer(content) ? content.length : Buffer.from(content).length;
|
|
183
|
+
if (bytes < 1024) {
|
|
184
|
+
return `${bytes} B`;
|
|
185
|
+
}
|
|
186
|
+
else if (bytes < 1024 * 1024) {
|
|
187
|
+
return `${(bytes / 1024).toFixed(1)} KB`;
|
|
188
|
+
}
|
|
189
|
+
else {
|
|
190
|
+
return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
/**
|
|
194
|
+
* Converts HTML to plain text for preview
|
|
195
|
+
*/
|
|
196
|
+
htmlToText(html) {
|
|
197
|
+
return html
|
|
198
|
+
.replace(/<br\s*\/?>/gi, '\n')
|
|
199
|
+
.replace(/<\/p>/gi, '\n\n')
|
|
200
|
+
.replace(/<\/div>/gi, '\n')
|
|
201
|
+
.replace(/<\/h[1-6]>/gi, '\n\n')
|
|
202
|
+
.replace(/<[^>]+>/g, '')
|
|
203
|
+
.replace(/ /g, ' ')
|
|
204
|
+
.replace(/&/g, '&')
|
|
205
|
+
.replace(/</g, '<')
|
|
206
|
+
.replace(/>/g, '>')
|
|
207
|
+
.replace(/"/g, '"')
|
|
208
|
+
.replace(/'/g, "'")
|
|
209
|
+
.replace(/\s+/g, ' ')
|
|
210
|
+
.trim();
|
|
211
|
+
}
|
|
212
|
+
/**
|
|
213
|
+
* Truncates text for preview
|
|
214
|
+
*/
|
|
215
|
+
truncateText(text, maxLength) {
|
|
216
|
+
if (text.length <= maxLength) {
|
|
217
|
+
return text;
|
|
218
|
+
}
|
|
219
|
+
return text.substring(0, maxLength) + '...';
|
|
220
|
+
}
|
|
221
|
+
/**
|
|
222
|
+
* Generates unique message ID
|
|
223
|
+
*/
|
|
224
|
+
generateMessageId() {
|
|
225
|
+
const timestamp = Date.now();
|
|
226
|
+
const random = Math.random().toString(36).substring(2, 8);
|
|
227
|
+
return `console-${timestamp}-${random}`;
|
|
228
|
+
}
|
|
229
|
+
/**
|
|
230
|
+
* Gets color codes for console output
|
|
231
|
+
*/
|
|
232
|
+
getColors() {
|
|
233
|
+
if (!this.colorize) {
|
|
234
|
+
return {
|
|
235
|
+
reset: '',
|
|
236
|
+
bold: '',
|
|
237
|
+
cyan: '',
|
|
238
|
+
green: '',
|
|
239
|
+
yellow: '',
|
|
240
|
+
gray: '',
|
|
241
|
+
red: '',
|
|
242
|
+
};
|
|
243
|
+
}
|
|
244
|
+
return {
|
|
245
|
+
reset: '\x1b[0m',
|
|
246
|
+
bold: '\x1b[1m',
|
|
247
|
+
cyan: '\x1b[36m',
|
|
248
|
+
green: '\x1b[32m',
|
|
249
|
+
yellow: '\x1b[33m',
|
|
250
|
+
gray: '\x1b[90m',
|
|
251
|
+
red: '\x1b[31m',
|
|
252
|
+
};
|
|
253
|
+
}
|
|
254
|
+
/**
|
|
255
|
+
* Gets console strategy statistics
|
|
256
|
+
*/
|
|
257
|
+
getStats() {
|
|
258
|
+
// Simple stats - could be enhanced with actual tracking
|
|
259
|
+
return {
|
|
260
|
+
emailsLogged: 0, // Could track this if needed
|
|
261
|
+
strategy: 'console',
|
|
262
|
+
colorEnabled: this.colorize,
|
|
263
|
+
previewEnabled: this.showPreview,
|
|
264
|
+
format: this.format,
|
|
265
|
+
};
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
//# sourceMappingURL=console.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"console.js","sourceRoot":"","sources":["../../../src/email/strategies/console.ts"],"names":[],"mappings":"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"}
|