@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,302 @@
1
+ /**
2
+ * Ultra-simple event-driven architecture that just works with automatic Redis/Memory strategy
3
+ * @module @bloomneo/appkit/event
4
+ * @file src/event/index.ts
5
+ *
6
+ * @llm-rule WHEN: Building apps that need event-driven architecture with zero configuration
7
+ * @llm-rule AVOID: Complex event setups - this auto-detects Redis/Memory from environment
8
+ * @llm-rule NOTE: Uses eventClass.get() pattern like auth - get() → event.emit() → distributed
9
+ * @llm-rule NOTE: Common pattern - eventClass.get(namespace) → event.on() → event.emit() → handled
10
+ */
11
+ import { EventClass } from './event.js';
12
+ import { getSmartDefaults, validateProductionRequirements, validateStartupConfiguration, performHealthCheck } from './defaults.js';
13
+ // Global event instances for performance (like auth module)
14
+ let globalConfig = null;
15
+ const namedEvents = new Map();
16
+ /**
17
+ * Get event instance for specific namespace - the only function you need to learn
18
+ * Strategy auto-detected from environment (REDIS_URL → Redis, no URL → Memory)
19
+ * @llm-rule WHEN: Need event-driven architecture in any part of your app - this is your main entry point
20
+ * @llm-rule AVOID: Creating EventClass directly - always use this function
21
+ * @llm-rule NOTE: Typical flow - get(namespace) → event.on() → event.emit() → distributed handling
22
+ */
23
+ function get(namespace = 'default') {
24
+ // Validate namespace
25
+ if (!namespace || typeof namespace !== 'string') {
26
+ throw new Error('Event namespace must be a non-empty string');
27
+ }
28
+ if (!/^[a-zA-Z0-9_-]+$/.test(namespace)) {
29
+ throw new Error('Event namespace must contain only letters, numbers, underscores, and hyphens');
30
+ }
31
+ // Lazy initialization - parse environment once (like auth)
32
+ if (!globalConfig) {
33
+ globalConfig = getSmartDefaults();
34
+ }
35
+ // Return cached instance if exists
36
+ if (namedEvents.has(namespace)) {
37
+ return namedEvents.get(namespace);
38
+ }
39
+ // Create new event instance for namespace
40
+ const eventInstance = new EventClass(globalConfig, namespace);
41
+ // Auto-connect on first use
42
+ eventInstance.connect().catch((error) => {
43
+ console.error(`[AppKit] Event auto-connect failed for namespace "${namespace}":`, error.message);
44
+ });
45
+ namedEvents.set(namespace, eventInstance);
46
+ return eventInstance;
47
+ }
48
+ /**
49
+ * Clear all event instances and disconnect - essential for testing
50
+ * @llm-rule WHEN: Testing event logic with different configurations or app shutdown
51
+ * @llm-rule AVOID: Using in production except for graceful shutdown
52
+ */
53
+ async function clear() {
54
+ const disconnectPromises = [];
55
+ for (const [namespace, event] of namedEvents) {
56
+ disconnectPromises.push(event.disconnect().catch((error) => {
57
+ console.error(`[AppKit] Event disconnect failed for namespace "${namespace}":`, error.message);
58
+ }));
59
+ }
60
+ await Promise.all(disconnectPromises);
61
+ namedEvents.clear();
62
+ globalConfig = null;
63
+ }
64
+ /**
65
+ * Reset event configuration (useful for testing)
66
+ * @llm-rule WHEN: Testing event logic with different environment configurations
67
+ * @llm-rule AVOID: Using in production - only for tests and development
68
+ */
69
+ async function reset(newConfig) {
70
+ // Clear existing instances
71
+ await clear();
72
+ // Reset configuration
73
+ if (newConfig) {
74
+ const defaults = getSmartDefaults();
75
+ globalConfig = { ...defaults, ...newConfig };
76
+ }
77
+ else {
78
+ globalConfig = null; // Will reload from environment on next get()
79
+ }
80
+ }
81
+ /**
82
+ * Get active event strategy for debugging
83
+ * @llm-rule WHEN: Debugging or health checks to see which strategy is active (Redis vs Memory)
84
+ * @llm-rule AVOID: Using for application logic - events should be transparent
85
+ */
86
+ function getStrategy() {
87
+ if (!globalConfig) {
88
+ globalConfig = getSmartDefaults();
89
+ }
90
+ return globalConfig.strategy;
91
+ }
92
+ /**
93
+ * Get all active event namespaces
94
+ * @llm-rule WHEN: Debugging or monitoring which event namespaces are active
95
+ * @llm-rule AVOID: Using for business logic - this is for observability only
96
+ */
97
+ function getActiveNamespaces() {
98
+ return Array.from(namedEvents.keys());
99
+ }
100
+ /**
101
+ * Get event configuration summary for debugging
102
+ * @llm-rule WHEN: Health checks or debugging event configuration
103
+ * @llm-rule AVOID: Exposing sensitive connection details - this only shows safe info
104
+ */
105
+ function getConfig() {
106
+ if (!globalConfig) {
107
+ globalConfig = getSmartDefaults();
108
+ }
109
+ return {
110
+ strategy: globalConfig.strategy,
111
+ historyEnabled: globalConfig.history.enabled,
112
+ activeNamespaces: getActiveNamespaces(),
113
+ environment: globalConfig.environment.nodeEnv,
114
+ };
115
+ }
116
+ /**
117
+ * Check if Redis is available and configured
118
+ * @llm-rule WHEN: Conditional logic based on event capabilities
119
+ * @llm-rule AVOID: Complex event detection - just use events normally, strategy handles it
120
+ */
121
+ function hasRedis() {
122
+ return !!process.env.REDIS_URL;
123
+ }
124
+ /**
125
+ * Emit event across all namespaces (dangerous)
126
+ * @llm-rule WHEN: Broadcasting system-wide events like shutdown or maintenance
127
+ * @llm-rule AVOID: Using for regular events - use namespace-specific events instead
128
+ * @llm-rule NOTE: Only use for system-level events that need global broadcast
129
+ */
130
+ async function broadcast(event, data = {}) {
131
+ const activeInstances = Array.from(namedEvents.values());
132
+ if (activeInstances.length === 0) {
133
+ console.warn(`[AppKit] No active event namespaces for broadcast: ${event}`);
134
+ return [];
135
+ }
136
+ const results = await Promise.allSettled(activeInstances.map(instance => instance.emit(event, data)));
137
+ return results.map(result => result.status === 'fulfilled' ? result.value : false);
138
+ }
139
+ /**
140
+ * Get event statistics across all namespaces
141
+ * @llm-rule WHEN: Monitoring event system health and usage
142
+ * @llm-rule AVOID: Using for business logic - this is for monitoring only
143
+ */
144
+ function getStats() {
145
+ const strategy = getStrategy();
146
+ const namespaces = Array.from(namedEvents.entries()).map(([namespace, instance]) => {
147
+ const config = instance.getConfig();
148
+ const listeners = instance.getListeners();
149
+ return {
150
+ namespace,
151
+ listeners: listeners.totalListeners || 0,
152
+ connected: config.connected,
153
+ };
154
+ });
155
+ return {
156
+ strategy,
157
+ totalNamespaces: namespaces.length,
158
+ totalListeners: namespaces.reduce((sum, ns) => sum + ns.listeners, 0),
159
+ connected: namespaces.filter(ns => ns.connected).length,
160
+ namespaces,
161
+ };
162
+ }
163
+ /**
164
+ * Validate event configuration at startup with detailed feedback
165
+ * @llm-rule WHEN: App startup to ensure events are properly configured
166
+ * @llm-rule AVOID: Skipping validation - missing event config causes runtime issues
167
+ * @llm-rule NOTE: Returns validation results instead of throwing - allows graceful handling
168
+ */
169
+ function validateConfig() {
170
+ try {
171
+ const validation = validateStartupConfiguration();
172
+ if (validation.errors.length > 0) {
173
+ console.error('[VoilaJSX AppKit] Event configuration errors:', validation.errors);
174
+ }
175
+ if (validation.warnings.length > 0) {
176
+ console.warn('[VoilaJSX AppKit] Event configuration warnings:', validation.warnings);
177
+ }
178
+ if (validation.ready) {
179
+ console.log(`✅ [VoilaJSX AppKit] Events configured with ${validation.strategy} strategy`);
180
+ }
181
+ return {
182
+ valid: validation.errors.length === 0,
183
+ strategy: validation.strategy,
184
+ warnings: validation.warnings,
185
+ errors: validation.errors,
186
+ ready: validation.ready,
187
+ };
188
+ }
189
+ catch (error) {
190
+ const errorMessage = error.message;
191
+ console.error('[VoilaJSX AppKit] Event configuration validation failed:', errorMessage);
192
+ return {
193
+ valid: false,
194
+ strategy: 'unknown',
195
+ warnings: [],
196
+ errors: [errorMessage],
197
+ ready: false,
198
+ };
199
+ }
200
+ }
201
+ /**
202
+ * Validate production requirements and throw if critical issues found
203
+ * @llm-rule WHEN: Production deployment validation - ensures events work in production
204
+ * @llm-rule AVOID: Skipping in production - event failures are often silent
205
+ * @llm-rule NOTE: Throws on critical issues, warns on non-critical ones
206
+ */
207
+ function validateProduction() {
208
+ try {
209
+ validateProductionRequirements();
210
+ if (process.env.NODE_ENV === 'production' && !hasRedis()) {
211
+ console.warn('[VoilaJSX AppKit] No Redis configured in production. ' +
212
+ 'Set REDIS_URL for distributed events across servers.');
213
+ }
214
+ console.log('✅ [VoilaJSX AppKit] Production event requirements validated');
215
+ }
216
+ catch (error) {
217
+ console.error('[VoilaJSX AppKit] Production event validation failed:', error.message);
218
+ throw error;
219
+ }
220
+ }
221
+ /**
222
+ * Get comprehensive health check status for monitoring
223
+ * @llm-rule WHEN: Health check endpoints or monitoring systems
224
+ * @llm-rule AVOID: Using in critical application path - this is for monitoring only
225
+ * @llm-rule NOTE: Returns detailed status without exposing sensitive configuration
226
+ */
227
+ function getHealthStatus() {
228
+ return performHealthCheck();
229
+ }
230
+ /**
231
+ * Graceful shutdown for all event instances
232
+ * @llm-rule WHEN: App shutdown or process termination
233
+ * @llm-rule AVOID: Abrupt process exit - graceful shutdown prevents data loss
234
+ */
235
+ async function shutdown() {
236
+ console.log('🔄 [AppKit] Event graceful shutdown...');
237
+ try {
238
+ // Broadcast shutdown event before closing
239
+ await broadcast('system.shutdown', {
240
+ timestamp: new Date().toISOString(),
241
+ reason: 'graceful_shutdown'
242
+ });
243
+ // Small delay to allow event processing
244
+ await new Promise(resolve => setTimeout(resolve, 100));
245
+ // Clear all instances
246
+ await clear();
247
+ console.log('✅ [AppKit] Event shutdown complete');
248
+ }
249
+ catch (error) {
250
+ console.error('❌ [AppKit] Event shutdown error:', error.message);
251
+ }
252
+ }
253
+ /**
254
+ * Single eventing export with minimal API (like auth module)
255
+ */
256
+ export const eventClass = {
257
+ // Core method (like auth.get())
258
+ get,
259
+ // Utility methods
260
+ clear,
261
+ reset,
262
+ getStrategy,
263
+ getActiveNamespaces,
264
+ getConfig,
265
+ hasRedis,
266
+ getStats,
267
+ // Advanced methods
268
+ broadcast,
269
+ // Validation and lifecycle
270
+ validateConfig,
271
+ validateProduction,
272
+ getHealthStatus,
273
+ shutdown,
274
+ };
275
+ export { EventClass } from './event.js';
276
+ // Default export
277
+ export default eventClass;
278
+ // Auto-setup graceful shutdown handlers
279
+ if (typeof process !== 'undefined') {
280
+ // Handle graceful shutdown
281
+ const shutdownHandler = () => {
282
+ shutdown().finally(() => {
283
+ process.exit(0);
284
+ });
285
+ };
286
+ process.on('SIGTERM', shutdownHandler);
287
+ process.on('SIGINT', shutdownHandler);
288
+ // Handle uncaught errors
289
+ process.on('uncaughtException', (error) => {
290
+ console.error('[AppKit] Uncaught exception during event operation:', error);
291
+ shutdown().finally(() => {
292
+ process.exit(1);
293
+ });
294
+ });
295
+ process.on('unhandledRejection', (reason) => {
296
+ console.error('[AppKit] Unhandled rejection during event operation:', reason);
297
+ shutdown().finally(() => {
298
+ process.exit(1);
299
+ });
300
+ });
301
+ }
302
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/event/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,122 @@
1
+ /**
2
+ * Memory event strategy with Node.js EventEmitter and cleanup management
3
+ * @module @bloomneo/appkit/event
4
+ * @file src/event/strategies/memory.ts
5
+ *
6
+ * @llm-rule WHEN: No REDIS_URL environment variable - perfect for development and single-server apps
7
+ * @llm-rule AVOID: Production use across multiple servers - events don't work across processes
8
+ * @llm-rule NOTE: Fast local events, automatic cleanup, memory limits, great for development
9
+ */
10
+ import type { EventStrategy, EventHandler } from '../event.js';
11
+ import type { EventConfig } from '../defaults.js';
12
+ /**
13
+ * Memory event strategy with intelligent cleanup and limits
14
+ */
15
+ export declare class MemoryStrategy implements EventStrategy {
16
+ private config;
17
+ private namespace;
18
+ private emitter;
19
+ private cleanupInterval;
20
+ private listenerCounts;
21
+ /**
22
+ * Creates memory strategy with direct environment access (like auth pattern)
23
+ * @llm-rule WHEN: Event initialization without Redis URL - automatic fallback
24
+ * @llm-rule AVOID: Manual memory configuration - environment detection handles this
25
+ */
26
+ constructor(config: EventConfig, namespace: string);
27
+ /**
28
+ * Emits event via Node.js EventEmitter
29
+ * @llm-rule WHEN: Sending events within single process/server
30
+ * @llm-rule AVOID: Expecting cross-process delivery - memory events are local only
31
+ * @llm-rule NOTE: Instant delivery, no network latency, perfect for development
32
+ */
33
+ emit(event: string, data: any): Promise<boolean>;
34
+ /**
35
+ * Adds event listener with automatic cleanup tracking
36
+ * @llm-rule WHEN: Listening to events within single process
37
+ * @llm-rule AVOID: Adding too many listeners - respects maxListeners limit
38
+ */
39
+ on(event: string, handler: EventHandler): void;
40
+ /**
41
+ * Adds one-time event listener with automatic cleanup
42
+ * @llm-rule WHEN: Listening to events that should only fire once
43
+ * @llm-rule AVOID: Manual cleanup - this handles removal automatically
44
+ */
45
+ once(event: string, handler: EventHandler): void;
46
+ /**
47
+ * Removes event listener(s) with cleanup tracking
48
+ * @llm-rule WHEN: Cleaning up event listeners to prevent memory leaks
49
+ * @llm-rule AVOID: Forgetting to remove listeners - memory strategy tracks everything
50
+ */
51
+ off(event: string, handler?: EventHandler): void;
52
+ /**
53
+ * Gets current event listeners for debugging
54
+ * @llm-rule WHEN: Debugging event listeners or monitoring memory usage
55
+ * @llm-rule AVOID: Using for business logic - this is for debugging only
56
+ */
57
+ getListeners(event?: string): any;
58
+ /**
59
+ * Disconnects memory strategy gracefully
60
+ * @llm-rule WHEN: App shutdown or event cleanup
61
+ * @llm-rule AVOID: Memory leaks - always cleanup intervals and listeners
62
+ */
63
+ disconnect(): Promise<void>;
64
+ /**
65
+ * Checks if adding listener would exceed limit
66
+ */
67
+ private checkListenerLimit;
68
+ /**
69
+ * Increments listener count tracking
70
+ */
71
+ private incrementListenerCount;
72
+ /**
73
+ * Decrements listener count tracking
74
+ */
75
+ private decrementListenerCount;
76
+ /**
77
+ * Updates listener count from actual emitter state
78
+ */
79
+ private updateListenerCount;
80
+ /**
81
+ * Sets up automatic cleanup interval
82
+ */
83
+ private setupCleanup;
84
+ /**
85
+ * Stops cleanup interval
86
+ */
87
+ private stopCleanup;
88
+ /**
89
+ * Performs memory cleanup and garbage collection
90
+ */
91
+ private performCleanup;
92
+ /**
93
+ * Syncs tracking counts with actual emitter state
94
+ */
95
+ private syncListenerCounts;
96
+ /**
97
+ * Cleans up events with no listeners
98
+ */
99
+ private cleanupEmptyEvents;
100
+ /**
101
+ * Gets memory usage statistics
102
+ */
103
+ private getMemoryStats;
104
+ /**
105
+ * Gets detailed memory statistics for debugging
106
+ */
107
+ getDetailedStats(): {
108
+ strategy: string;
109
+ namespace: string;
110
+ totalEvents: number;
111
+ totalListeners: number;
112
+ maxListeners: number;
113
+ memoryUsage: string;
114
+ events: Array<{
115
+ event: string;
116
+ listeners: number;
117
+ }>;
118
+ cleanupEnabled: boolean;
119
+ lastCleanup: string;
120
+ };
121
+ }
122
+ //# sourceMappingURL=memory.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory.d.ts","sourceRoot":"","sources":["../../../src/event/strategies/memory.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC/D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAElD;;GAEG;AACH,qBAAa,cAAe,YAAW,aAAa;IAClD,OAAO,CAAC,MAAM,CAAc;IAC5B,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,OAAO,CAAe;IAC9B,OAAO,CAAC,eAAe,CAA+B;IACtD,OAAO,CAAC,cAAc,CAA6B;IAEnD;;;;OAIG;gBACS,MAAM,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM;IAkBlD;;;;;OAKG;IACG,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,GAAG,OAAO,CAAC,OAAO,CAAC;IAetD;;;;OAIG;IACH,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,YAAY,GAAG,IAAI;IAmB9C;;;;OAIG;IACH,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,YAAY,GAAG,IAAI;IAyBhD;;;;OAIG;IACH,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,YAAY,GAAG,IAAI;IAqBhD;;;;OAIG;IACH,YAAY,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,GAAG;IAwBjC;;;;OAIG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAqBjC;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAY1B;;OAEG;IACH,OAAO,CAAC,sBAAsB;IAK9B;;OAEG;IACH,OAAO,CAAC,sBAAsB;IAW9B;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAS3B;;OAEG;IACH,OAAO,CAAC,YAAY;IAapB;;OAEG;IACH,OAAO,CAAC,WAAW;IAOnB;;OAEG;IACH,OAAO,CAAC,cAAc;IAuBtB;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAY1B;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAY1B;;OAEG;IACH,OAAO,CAAC,cAAc;IAoBtB;;OAEG;IACH,gBAAgB,IAAI;QAClB,QAAQ,EAAE,MAAM,CAAC;QACjB,SAAS,EAAE,MAAM,CAAC;QAClB,WAAW,EAAE,MAAM,CAAC;QACpB,cAAc,EAAE,MAAM,CAAC;QACvB,YAAY,EAAE,MAAM,CAAC;QACrB,WAAW,EAAE,MAAM,CAAC;QACpB,MAAM,EAAE,KAAK,CAAC;YAAE,KAAK,EAAE,MAAM,CAAC;YAAC,SAAS,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC;QACpD,cAAc,EAAE,OAAO,CAAC;QACxB,WAAW,EAAE,MAAM,CAAC;KACrB;CAsBF"}