@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.
Files changed (262) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +902 -0
  3. package/bin/appkit.js +71 -0
  4. package/bin/commands/generate.js +1050 -0
  5. package/bin/templates/backend/README.md.template +39 -0
  6. package/bin/templates/backend/api.http.template +0 -0
  7. package/bin/templates/backend/docs/APPKIT_CLI.md +507 -0
  8. package/bin/templates/backend/docs/APPKIT_COMMENTS_GUIDELINES.md +61 -0
  9. package/bin/templates/backend/docs/APPKIT_LLM_GUIDE.md +2539 -0
  10. package/bin/templates/backend/package.json.template +34 -0
  11. package/bin/templates/backend/src/api/features/welcome/welcome.http.template +29 -0
  12. package/bin/templates/backend/src/api/features/welcome/welcome.route.ts.template +36 -0
  13. package/bin/templates/backend/src/api/features/welcome/welcome.service.ts.template +88 -0
  14. package/bin/templates/backend/src/api/features/welcome/welcome.types.ts.template +18 -0
  15. package/bin/templates/backend/src/api/lib/api-router.ts.template +84 -0
  16. package/bin/templates/backend/src/api/server.ts.template +188 -0
  17. package/bin/templates/backend/tsconfig.api.json.template +24 -0
  18. package/bin/templates/backend/tsconfig.json.template +40 -0
  19. package/bin/templates/feature/feature.http.template +63 -0
  20. package/bin/templates/feature/feature.route.ts.template +36 -0
  21. package/bin/templates/feature/feature.service.ts.template +81 -0
  22. package/bin/templates/feature/feature.types.ts.template +23 -0
  23. package/bin/templates/feature-db/feature.http.template +63 -0
  24. package/bin/templates/feature-db/feature.model.ts.template +74 -0
  25. package/bin/templates/feature-db/feature.route.ts.template +58 -0
  26. package/bin/templates/feature-db/feature.service.ts.template +231 -0
  27. package/bin/templates/feature-db/feature.types.ts.template +25 -0
  28. package/bin/templates/feature-db/schema-addition.prisma.template +9 -0
  29. package/bin/templates/feature-db/seeding/README.md.template +57 -0
  30. package/bin/templates/feature-db/seeding/feature.seed.js.template +67 -0
  31. package/bin/templates/feature-user/schema-addition.prisma.template +19 -0
  32. package/bin/templates/feature-user/user.http.template +157 -0
  33. package/bin/templates/feature-user/user.model.ts.template +244 -0
  34. package/bin/templates/feature-user/user.route.ts.template +379 -0
  35. package/bin/templates/feature-user/user.seed.js.template +182 -0
  36. package/bin/templates/feature-user/user.service.ts.template +426 -0
  37. package/bin/templates/feature-user/user.types.ts.template +127 -0
  38. package/dist/auth/auth.d.ts +182 -0
  39. package/dist/auth/auth.d.ts.map +1 -0
  40. package/dist/auth/auth.js +477 -0
  41. package/dist/auth/auth.js.map +1 -0
  42. package/dist/auth/defaults.d.ts +104 -0
  43. package/dist/auth/defaults.d.ts.map +1 -0
  44. package/dist/auth/defaults.js +374 -0
  45. package/dist/auth/defaults.js.map +1 -0
  46. package/dist/auth/index.d.ts +70 -0
  47. package/dist/auth/index.d.ts.map +1 -0
  48. package/dist/auth/index.js +94 -0
  49. package/dist/auth/index.js.map +1 -0
  50. package/dist/cache/cache.d.ts +118 -0
  51. package/dist/cache/cache.d.ts.map +1 -0
  52. package/dist/cache/cache.js +249 -0
  53. package/dist/cache/cache.js.map +1 -0
  54. package/dist/cache/defaults.d.ts +63 -0
  55. package/dist/cache/defaults.d.ts.map +1 -0
  56. package/dist/cache/defaults.js +193 -0
  57. package/dist/cache/defaults.js.map +1 -0
  58. package/dist/cache/index.d.ts +101 -0
  59. package/dist/cache/index.d.ts.map +1 -0
  60. package/dist/cache/index.js +203 -0
  61. package/dist/cache/index.js.map +1 -0
  62. package/dist/cache/strategies/memory.d.ts +138 -0
  63. package/dist/cache/strategies/memory.d.ts.map +1 -0
  64. package/dist/cache/strategies/memory.js +348 -0
  65. package/dist/cache/strategies/memory.js.map +1 -0
  66. package/dist/cache/strategies/redis.d.ts +105 -0
  67. package/dist/cache/strategies/redis.d.ts.map +1 -0
  68. package/dist/cache/strategies/redis.js +318 -0
  69. package/dist/cache/strategies/redis.js.map +1 -0
  70. package/dist/config/config.d.ts +62 -0
  71. package/dist/config/config.d.ts.map +1 -0
  72. package/dist/config/config.js +107 -0
  73. package/dist/config/config.js.map +1 -0
  74. package/dist/config/defaults.d.ts +44 -0
  75. package/dist/config/defaults.d.ts.map +1 -0
  76. package/dist/config/defaults.js +217 -0
  77. package/dist/config/defaults.js.map +1 -0
  78. package/dist/config/index.d.ts +105 -0
  79. package/dist/config/index.d.ts.map +1 -0
  80. package/dist/config/index.js +163 -0
  81. package/dist/config/index.js.map +1 -0
  82. package/dist/database/adapters/mongoose.d.ts +106 -0
  83. package/dist/database/adapters/mongoose.d.ts.map +1 -0
  84. package/dist/database/adapters/mongoose.js +480 -0
  85. package/dist/database/adapters/mongoose.js.map +1 -0
  86. package/dist/database/adapters/prisma.d.ts +106 -0
  87. package/dist/database/adapters/prisma.d.ts.map +1 -0
  88. package/dist/database/adapters/prisma.js +494 -0
  89. package/dist/database/adapters/prisma.js.map +1 -0
  90. package/dist/database/defaults.d.ts +87 -0
  91. package/dist/database/defaults.d.ts.map +1 -0
  92. package/dist/database/defaults.js +271 -0
  93. package/dist/database/defaults.js.map +1 -0
  94. package/dist/database/index.d.ts +137 -0
  95. package/dist/database/index.d.ts.map +1 -0
  96. package/dist/database/index.js +490 -0
  97. package/dist/database/index.js.map +1 -0
  98. package/dist/email/defaults.d.ts +100 -0
  99. package/dist/email/defaults.d.ts.map +1 -0
  100. package/dist/email/defaults.js +400 -0
  101. package/dist/email/defaults.js.map +1 -0
  102. package/dist/email/email.d.ts +139 -0
  103. package/dist/email/email.d.ts.map +1 -0
  104. package/dist/email/email.js +316 -0
  105. package/dist/email/email.js.map +1 -0
  106. package/dist/email/index.d.ts +176 -0
  107. package/dist/email/index.d.ts.map +1 -0
  108. package/dist/email/index.js +251 -0
  109. package/dist/email/index.js.map +1 -0
  110. package/dist/email/strategies/console.d.ts +90 -0
  111. package/dist/email/strategies/console.d.ts.map +1 -0
  112. package/dist/email/strategies/console.js +268 -0
  113. package/dist/email/strategies/console.js.map +1 -0
  114. package/dist/email/strategies/resend.d.ts +84 -0
  115. package/dist/email/strategies/resend.d.ts.map +1 -0
  116. package/dist/email/strategies/resend.js +266 -0
  117. package/dist/email/strategies/resend.js.map +1 -0
  118. package/dist/email/strategies/smtp.d.ts +77 -0
  119. package/dist/email/strategies/smtp.d.ts.map +1 -0
  120. package/dist/email/strategies/smtp.js +286 -0
  121. package/dist/email/strategies/smtp.js.map +1 -0
  122. package/dist/error/defaults.d.ts +40 -0
  123. package/dist/error/defaults.d.ts.map +1 -0
  124. package/dist/error/defaults.js +75 -0
  125. package/dist/error/defaults.js.map +1 -0
  126. package/dist/error/error.d.ts +140 -0
  127. package/dist/error/error.d.ts.map +1 -0
  128. package/dist/error/error.js +200 -0
  129. package/dist/error/error.js.map +1 -0
  130. package/dist/error/index.d.ts +145 -0
  131. package/dist/error/index.d.ts.map +1 -0
  132. package/dist/error/index.js +145 -0
  133. package/dist/error/index.js.map +1 -0
  134. package/dist/event/defaults.d.ts +111 -0
  135. package/dist/event/defaults.d.ts.map +1 -0
  136. package/dist/event/defaults.js +378 -0
  137. package/dist/event/defaults.js.map +1 -0
  138. package/dist/event/event.d.ts +171 -0
  139. package/dist/event/event.d.ts.map +1 -0
  140. package/dist/event/event.js +391 -0
  141. package/dist/event/event.js.map +1 -0
  142. package/dist/event/index.d.ts +173 -0
  143. package/dist/event/index.d.ts.map +1 -0
  144. package/dist/event/index.js +302 -0
  145. package/dist/event/index.js.map +1 -0
  146. package/dist/event/strategies/memory.d.ts +122 -0
  147. package/dist/event/strategies/memory.d.ts.map +1 -0
  148. package/dist/event/strategies/memory.js +331 -0
  149. package/dist/event/strategies/memory.js.map +1 -0
  150. package/dist/event/strategies/redis.d.ts +115 -0
  151. package/dist/event/strategies/redis.d.ts.map +1 -0
  152. package/dist/event/strategies/redis.js +434 -0
  153. package/dist/event/strategies/redis.js.map +1 -0
  154. package/dist/index.d.ts +58 -0
  155. package/dist/index.d.ts.map +1 -0
  156. package/dist/index.js +72 -0
  157. package/dist/index.js.map +1 -0
  158. package/dist/logger/defaults.d.ts +67 -0
  159. package/dist/logger/defaults.d.ts.map +1 -0
  160. package/dist/logger/defaults.js +213 -0
  161. package/dist/logger/defaults.js.map +1 -0
  162. package/dist/logger/index.d.ts +84 -0
  163. package/dist/logger/index.d.ts.map +1 -0
  164. package/dist/logger/index.js +101 -0
  165. package/dist/logger/index.js.map +1 -0
  166. package/dist/logger/logger.d.ts +165 -0
  167. package/dist/logger/logger.d.ts.map +1 -0
  168. package/dist/logger/logger.js +843 -0
  169. package/dist/logger/logger.js.map +1 -0
  170. package/dist/logger/transports/console.d.ts +102 -0
  171. package/dist/logger/transports/console.d.ts.map +1 -0
  172. package/dist/logger/transports/console.js +276 -0
  173. package/dist/logger/transports/console.js.map +1 -0
  174. package/dist/logger/transports/database.d.ts +153 -0
  175. package/dist/logger/transports/database.d.ts.map +1 -0
  176. package/dist/logger/transports/database.js +539 -0
  177. package/dist/logger/transports/database.js.map +1 -0
  178. package/dist/logger/transports/file.d.ts +146 -0
  179. package/dist/logger/transports/file.d.ts.map +1 -0
  180. package/dist/logger/transports/file.js +464 -0
  181. package/dist/logger/transports/file.js.map +1 -0
  182. package/dist/logger/transports/http.d.ts +128 -0
  183. package/dist/logger/transports/http.d.ts.map +1 -0
  184. package/dist/logger/transports/http.js +401 -0
  185. package/dist/logger/transports/http.js.map +1 -0
  186. package/dist/logger/transports/webhook.d.ts +152 -0
  187. package/dist/logger/transports/webhook.d.ts.map +1 -0
  188. package/dist/logger/transports/webhook.js +485 -0
  189. package/dist/logger/transports/webhook.js.map +1 -0
  190. package/dist/queue/defaults.d.ts +66 -0
  191. package/dist/queue/defaults.d.ts.map +1 -0
  192. package/dist/queue/defaults.js +205 -0
  193. package/dist/queue/defaults.js.map +1 -0
  194. package/dist/queue/index.d.ts +124 -0
  195. package/dist/queue/index.d.ts.map +1 -0
  196. package/dist/queue/index.js +116 -0
  197. package/dist/queue/index.js.map +1 -0
  198. package/dist/queue/queue.d.ts +156 -0
  199. package/dist/queue/queue.d.ts.map +1 -0
  200. package/dist/queue/queue.js +387 -0
  201. package/dist/queue/queue.js.map +1 -0
  202. package/dist/queue/transports/database.d.ts +165 -0
  203. package/dist/queue/transports/database.d.ts.map +1 -0
  204. package/dist/queue/transports/database.js +595 -0
  205. package/dist/queue/transports/database.js.map +1 -0
  206. package/dist/queue/transports/memory.d.ts +143 -0
  207. package/dist/queue/transports/memory.d.ts.map +1 -0
  208. package/dist/queue/transports/memory.js +415 -0
  209. package/dist/queue/transports/memory.js.map +1 -0
  210. package/dist/queue/transports/redis.d.ts +203 -0
  211. package/dist/queue/transports/redis.d.ts.map +1 -0
  212. package/dist/queue/transports/redis.js +744 -0
  213. package/dist/queue/transports/redis.js.map +1 -0
  214. package/dist/security/defaults.d.ts +64 -0
  215. package/dist/security/defaults.d.ts.map +1 -0
  216. package/dist/security/defaults.js +159 -0
  217. package/dist/security/defaults.js.map +1 -0
  218. package/dist/security/index.d.ts +110 -0
  219. package/dist/security/index.d.ts.map +1 -0
  220. package/dist/security/index.js +160 -0
  221. package/dist/security/index.js.map +1 -0
  222. package/dist/security/security.d.ts +138 -0
  223. package/dist/security/security.d.ts.map +1 -0
  224. package/dist/security/security.js +419 -0
  225. package/dist/security/security.js.map +1 -0
  226. package/dist/storage/defaults.d.ts +79 -0
  227. package/dist/storage/defaults.d.ts.map +1 -0
  228. package/dist/storage/defaults.js +358 -0
  229. package/dist/storage/defaults.js.map +1 -0
  230. package/dist/storage/index.d.ts +153 -0
  231. package/dist/storage/index.d.ts.map +1 -0
  232. package/dist/storage/index.js +242 -0
  233. package/dist/storage/index.js.map +1 -0
  234. package/dist/storage/storage.d.ts +151 -0
  235. package/dist/storage/storage.d.ts.map +1 -0
  236. package/dist/storage/storage.js +439 -0
  237. package/dist/storage/storage.js.map +1 -0
  238. package/dist/storage/strategies/local.d.ts +117 -0
  239. package/dist/storage/strategies/local.d.ts.map +1 -0
  240. package/dist/storage/strategies/local.js +368 -0
  241. package/dist/storage/strategies/local.js.map +1 -0
  242. package/dist/storage/strategies/r2.d.ts +130 -0
  243. package/dist/storage/strategies/r2.d.ts.map +1 -0
  244. package/dist/storage/strategies/r2.js +470 -0
  245. package/dist/storage/strategies/r2.js.map +1 -0
  246. package/dist/storage/strategies/s3.d.ts +121 -0
  247. package/dist/storage/strategies/s3.d.ts.map +1 -0
  248. package/dist/storage/strategies/s3.js +461 -0
  249. package/dist/storage/strategies/s3.js.map +1 -0
  250. package/dist/util/defaults.d.ts +77 -0
  251. package/dist/util/defaults.d.ts.map +1 -0
  252. package/dist/util/defaults.js +193 -0
  253. package/dist/util/defaults.js.map +1 -0
  254. package/dist/util/index.d.ts +97 -0
  255. package/dist/util/index.d.ts.map +1 -0
  256. package/dist/util/index.js +165 -0
  257. package/dist/util/index.js.map +1 -0
  258. package/dist/util/util.d.ts +145 -0
  259. package/dist/util/util.d.ts.map +1 -0
  260. package/dist/util/util.js +481 -0
  261. package/dist/util/util.js.map +1 -0
  262. 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(/&nbsp;/g, ' ')
204
+ .replace(/&amp;/g, '&')
205
+ .replace(/&lt;/g, '<')
206
+ .replace(/&gt;/g, '>')
207
+ .replace(/&quot;/g, '"')
208
+ .replace(/&#39;/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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"}