@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,391 @@
1
+ /**
2
+ * Core event class with automatic strategy selection and ultra-simple API
3
+ * @module @bloomneo/appkit/event
4
+ * @file src/event/event.ts
5
+ *
6
+ * @llm-rule WHEN: Building apps that need event-driven architecture with automatic Redis/Memory selection
7
+ * @llm-rule AVOID: Using directly - always get instance via eventClass.get()
8
+ * @llm-rule NOTE: Auto-detects Redis vs Memory based on environment variables
9
+ */
10
+ import { RedisStrategy } from './strategies/redis.js';
11
+ import { MemoryStrategy } from './strategies/memory.js';
12
+ /**
13
+ * Event class with automatic strategy selection and ultra-simple API
14
+ */
15
+ export class EventClass {
16
+ config;
17
+ namespace;
18
+ strategy;
19
+ connected = false;
20
+ eventHistory = []; // ✅ Renamed from 'history' to 'eventHistory'
21
+ wildcardHandlers = new Map();
22
+ constructor(config, namespace) {
23
+ this.config = config;
24
+ this.namespace = namespace;
25
+ this.strategy = this.createStrategy();
26
+ }
27
+ /**
28
+ * Creates appropriate strategy based on configuration
29
+ * @llm-rule WHEN: Event initialization - selects Redis or Memory based on environment
30
+ * @llm-rule AVOID: Manual strategy creation - configuration handles strategy selection
31
+ */
32
+ createStrategy() {
33
+ switch (this.config.strategy) {
34
+ case 'redis':
35
+ return new RedisStrategy(this.config, this.namespace);
36
+ case 'memory':
37
+ return new MemoryStrategy(this.config, this.namespace);
38
+ default:
39
+ throw new Error(`Unknown event strategy: ${this.config.strategy}`);
40
+ }
41
+ }
42
+ /**
43
+ * Connects to event backend with automatic retry logic
44
+ * @llm-rule WHEN: Event initialization or reconnection after failure
45
+ * @llm-rule AVOID: Manual connection management - this handles connection state
46
+ */
47
+ async connect() {
48
+ if (this.connected)
49
+ return;
50
+ try {
51
+ // Strategy-specific connection (Redis connects, Memory is immediate)
52
+ if ('connect' in this.strategy) {
53
+ await this.strategy.connect();
54
+ }
55
+ this.connected = true;
56
+ if (this.config.environment.isDevelopment) {
57
+ console.log(`✅ [AppKit] Event system connected using ${this.config.strategy} strategy (namespace: ${this.namespace})`);
58
+ }
59
+ }
60
+ catch (error) {
61
+ console.error(`❌ [AppKit] Event connection failed:`, error.message);
62
+ throw error;
63
+ }
64
+ }
65
+ /**
66
+ * Disconnects from event backend gracefully
67
+ * @llm-rule WHEN: App shutdown or event cleanup
68
+ * @llm-rule AVOID: Abrupt disconnection - graceful shutdown prevents data loss
69
+ */
70
+ async disconnect() {
71
+ if (!this.connected)
72
+ return;
73
+ try {
74
+ await this.strategy.disconnect();
75
+ this.connected = false;
76
+ this.wildcardHandlers.clear();
77
+ if (this.config.environment.isDevelopment) {
78
+ console.log(`👋 [AppKit] Event system disconnected (namespace: ${this.namespace})`);
79
+ }
80
+ }
81
+ catch (error) {
82
+ console.error(`⚠️ [AppKit] Event disconnect error:`, error.message);
83
+ }
84
+ }
85
+ /**
86
+ * Emits an event with automatic namespacing and history tracking
87
+ * @llm-rule WHEN: Triggering events in your application
88
+ * @llm-rule AVOID: Manual event management - this handles namespacing and distribution
89
+ * @llm-rule NOTE: Automatically adds to history if enabled, handles wildcards
90
+ */
91
+ async emit(event, data = {}) {
92
+ this.validateEventName(event);
93
+ await this.ensureConnected();
94
+ try {
95
+ // Build namespaced event name
96
+ const namespacedEvent = this.buildEventName(event);
97
+ // Emit via strategy
98
+ const result = await this.strategy.emit(namespacedEvent, data);
99
+ // Add to history if enabled
100
+ if (this.config.history.enabled) {
101
+ this.addToHistory(event, data);
102
+ }
103
+ // Handle local wildcard listeners (for both Redis and Memory)
104
+ this.handleWildcardEmit(event, data);
105
+ // Log in development
106
+ if (this.config.environment.isDevelopment) {
107
+ console.log(`📤 [AppKit] Event emitted: ${event}`, data);
108
+ }
109
+ return result;
110
+ }
111
+ catch (error) {
112
+ console.error(`[AppKit] Event emit error for "${event}":`, error.message);
113
+ return false;
114
+ }
115
+ }
116
+ /**
117
+ * Adds event listener with automatic namespacing and wildcard support
118
+ * @llm-rule WHEN: Listening to events in your application
119
+ * @llm-rule AVOID: Manual listener management - this handles namespacing and wildcards
120
+ * @llm-rule NOTE: Supports wildcard patterns like 'user.*' or 'order.*.completed'
121
+ */
122
+ on(event, handler) {
123
+ this.validateEventName(event);
124
+ this.validateHandler(handler);
125
+ if (this.isWildcardPattern(event)) {
126
+ this.addWildcardHandler(event, handler);
127
+ }
128
+ else {
129
+ const namespacedEvent = this.buildEventName(event);
130
+ this.strategy.on(namespacedEvent, handler);
131
+ }
132
+ }
133
+ /**
134
+ * Adds one-time event listener with automatic cleanup
135
+ * @llm-rule WHEN: Listening to events that should only fire once
136
+ * @llm-rule AVOID: Manual cleanup - this handles removal after first trigger
137
+ */
138
+ once(event, handler) {
139
+ this.validateEventName(event);
140
+ this.validateHandler(handler);
141
+ if (this.isWildcardPattern(event)) {
142
+ // For wildcards, create wrapper that removes itself
143
+ const onceWrapper = (eventName, data) => {
144
+ this.removeWildcardHandler(event, onceWrapper);
145
+ handler(eventName, data);
146
+ };
147
+ this.addWildcardHandler(event, onceWrapper);
148
+ }
149
+ else {
150
+ const namespacedEvent = this.buildEventName(event);
151
+ this.strategy.once(namespacedEvent, handler);
152
+ }
153
+ }
154
+ /**
155
+ * Removes event listener(s)
156
+ * @llm-rule WHEN: Cleaning up event listeners to prevent memory leaks
157
+ * @llm-rule AVOID: Forgetting to remove listeners - causes memory leaks over time
158
+ */
159
+ off(event, handler) {
160
+ this.validateEventName(event);
161
+ if (this.isWildcardPattern(event)) {
162
+ if (handler) {
163
+ this.removeWildcardHandler(event, handler);
164
+ }
165
+ else {
166
+ this.wildcardHandlers.delete(event);
167
+ }
168
+ }
169
+ else {
170
+ const namespacedEvent = this.buildEventName(event);
171
+ this.strategy.off(namespacedEvent, handler);
172
+ }
173
+ }
174
+ /**
175
+ * Emits multiple events efficiently (batch operation)
176
+ * @llm-rule WHEN: Emitting multiple events like bulk notifications or data sync
177
+ * @llm-rule AVOID: Multiple individual emit() calls - this handles batching efficiently
178
+ */
179
+ async emitBatch(events) {
180
+ const results = [];
181
+ // Process in batches of 10 for performance
182
+ const batchSize = 10;
183
+ for (let i = 0; i < events.length; i += batchSize) {
184
+ const batch = events.slice(i, i + batchSize);
185
+ // Emit batch concurrently
186
+ const batchPromises = batch.map(({ event, data }) => this.emit(event, data));
187
+ const batchResults = await Promise.allSettled(batchPromises);
188
+ // Process results
189
+ for (const result of batchResults) {
190
+ if (result.status === 'fulfilled') {
191
+ results.push(result.value);
192
+ }
193
+ else {
194
+ results.push(false);
195
+ }
196
+ }
197
+ // Small delay between batches to be respectful
198
+ if (i + batchSize < events.length) {
199
+ await this.sleep(10);
200
+ }
201
+ }
202
+ return results;
203
+ }
204
+ /**
205
+ * Gets event history for debugging and replay
206
+ * @llm-rule WHEN: Debugging event flow or implementing event replay functionality
207
+ * @llm-rule AVOID: Using for business logic - history is for debugging and replay only
208
+ */
209
+ async history(event, limit) {
210
+ if (!this.config.history.enabled) {
211
+ return [];
212
+ }
213
+ let filtered = this.eventHistory; // ✅ Updated to use renamed property
214
+ // Filter by event if specified
215
+ if (event) {
216
+ filtered = this.eventHistory.filter(entry => entry.event === event || this.matchesWildcard(entry.event, event));
217
+ }
218
+ // Apply limit
219
+ if (limit && limit > 0) {
220
+ filtered = filtered.slice(-limit);
221
+ }
222
+ return filtered;
223
+ }
224
+ /**
225
+ * Gets current event listeners for debugging
226
+ * @llm-rule WHEN: Debugging event listeners or building admin interfaces
227
+ * @llm-rule AVOID: Using for business logic - this is for debugging only
228
+ */
229
+ getListeners(event) {
230
+ const strategyListeners = this.strategy.getListeners(event);
231
+ const wildcardListeners = event
232
+ ? Array.from(this.wildcardHandlers.entries()).filter(([pattern]) => this.matchesWildcard(event, pattern))
233
+ : Array.from(this.wildcardHandlers.entries());
234
+ return {
235
+ direct: strategyListeners,
236
+ wildcards: wildcardListeners.map(([pattern, handlers]) => ({
237
+ pattern,
238
+ count: handlers.length
239
+ }))
240
+ };
241
+ }
242
+ /**
243
+ * Gets current event strategy name for debugging
244
+ * @llm-rule WHEN: Debugging or health checks to see which strategy is active
245
+ * @llm-rule AVOID: Using for application logic - events should be transparent
246
+ */
247
+ getStrategy() {
248
+ return this.config.strategy;
249
+ }
250
+ /**
251
+ * Gets event configuration summary for debugging
252
+ * @llm-rule WHEN: Health checks or debugging event configuration
253
+ * @llm-rule AVOID: Exposing sensitive details - this only shows safe info
254
+ */
255
+ getConfig() {
256
+ return {
257
+ strategy: this.config.strategy,
258
+ namespace: this.namespace,
259
+ historyEnabled: this.config.history.enabled,
260
+ historySize: this.eventHistory.length, // ✅ Updated to use renamed property
261
+ connected: this.connected,
262
+ };
263
+ }
264
+ // Private helper methods
265
+ /**
266
+ * Ensures event system is connected before operations
267
+ */
268
+ async ensureConnected() {
269
+ if (!this.connected) {
270
+ await this.connect();
271
+ }
272
+ }
273
+ /**
274
+ * Builds namespaced event name
275
+ */
276
+ buildEventName(event) {
277
+ return `${this.namespace}:${event}`;
278
+ }
279
+ /**
280
+ * Validates event name format
281
+ */
282
+ validateEventName(event) {
283
+ if (!event || typeof event !== 'string') {
284
+ throw new Error('Event name must be a non-empty string');
285
+ }
286
+ if (event.length > 255) {
287
+ throw new Error('Event name too long (max 255 characters)');
288
+ }
289
+ // Allow alphanumeric, dots, dashes, underscores, and asterisks (for wildcards)
290
+ if (!/^[a-zA-Z0-9._*-]+$/.test(event)) {
291
+ throw new Error('Event name contains invalid characters. Use only letters, numbers, dots, dashes, underscores, and asterisks.');
292
+ }
293
+ }
294
+ /**
295
+ * Validates event handler function
296
+ */
297
+ validateHandler(handler) {
298
+ if (typeof handler !== 'function') {
299
+ throw new Error('Event handler must be a function');
300
+ }
301
+ }
302
+ /**
303
+ * Checks if event name is a wildcard pattern
304
+ */
305
+ isWildcardPattern(event) {
306
+ return event.includes('*');
307
+ }
308
+ /**
309
+ * Adds wildcard handler
310
+ */
311
+ addWildcardHandler(pattern, handler) {
312
+ if (!this.wildcardHandlers.has(pattern)) {
313
+ this.wildcardHandlers.set(pattern, []);
314
+ }
315
+ this.wildcardHandlers.get(pattern).push(handler);
316
+ }
317
+ /**
318
+ * Removes wildcard handler
319
+ */
320
+ removeWildcardHandler(pattern, handler) {
321
+ const handlers = this.wildcardHandlers.get(pattern);
322
+ if (handlers) {
323
+ const index = handlers.indexOf(handler);
324
+ if (index !== -1) {
325
+ handlers.splice(index, 1);
326
+ }
327
+ if (handlers.length === 0) {
328
+ this.wildcardHandlers.delete(pattern);
329
+ }
330
+ }
331
+ }
332
+ /**
333
+ * Handles wildcard pattern matching for emitted events
334
+ */
335
+ handleWildcardEmit(event, data) {
336
+ for (const [pattern, handlers] of this.wildcardHandlers.entries()) {
337
+ if (this.matchesWildcard(event, pattern)) {
338
+ for (const handler of handlers) {
339
+ try {
340
+ const result = handler(event, data);
341
+ if (result && typeof result.then === 'function') {
342
+ result.catch((error) => {
343
+ console.error(`Wildcard handler error for pattern "${pattern}":`, error.message);
344
+ });
345
+ }
346
+ }
347
+ catch (error) {
348
+ console.error(`Wildcard handler error for pattern "${pattern}":`, error.message);
349
+ }
350
+ }
351
+ }
352
+ }
353
+ }
354
+ /**
355
+ * Checks if event matches wildcard pattern
356
+ */
357
+ matchesWildcard(event, pattern) {
358
+ if (!pattern.includes('*')) {
359
+ return event === pattern;
360
+ }
361
+ // Convert wildcard pattern to regex
362
+ const regexPattern = pattern
363
+ .replace(/\./g, '\\.')
364
+ .replace(/\*/g, '[^.]*');
365
+ const regex = new RegExp(`^${regexPattern}$`);
366
+ return regex.test(event);
367
+ }
368
+ /**
369
+ * Adds event to history with size management
370
+ */
371
+ addToHistory(event, data) {
372
+ const entry = {
373
+ event,
374
+ data,
375
+ timestamp: new Date().toISOString(),
376
+ namespace: this.namespace,
377
+ };
378
+ this.eventHistory.push(entry); // ✅ Updated to use renamed property
379
+ // Maintain history size limit
380
+ if (this.eventHistory.length > this.config.history.maxSize) {
381
+ this.eventHistory = this.eventHistory.slice(-this.config.history.maxSize); // ✅ Updated to use renamed property
382
+ }
383
+ }
384
+ /**
385
+ * Sleep for specified milliseconds
386
+ */
387
+ sleep(ms) {
388
+ return new Promise(resolve => setTimeout(resolve, ms));
389
+ }
390
+ }
391
+ //# sourceMappingURL=event.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"event.js","sourceRoot":"","sources":["../../src/event/event.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,173 @@
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 { type EventConfig } from './defaults.js';
12
+ export interface Event {
13
+ emit(event: string, data?: any): Promise<boolean>;
14
+ on(event: string, handler: EventHandler | WildcardHandler): void;
15
+ once(event: string, handler: EventHandler): void;
16
+ off(event: string, handler?: EventHandler | WildcardHandler): void;
17
+ emitBatch(events: BatchEvent[]): Promise<boolean[]>;
18
+ history(event?: string, limit?: number): Promise<EventHistoryEntry[]>;
19
+ getListeners(event?: string): any;
20
+ disconnect(): Promise<void>;
21
+ getStrategy(): string;
22
+ getConfig(): any;
23
+ }
24
+ export interface EventHandler {
25
+ (data: any): void | Promise<void>;
26
+ }
27
+ export interface WildcardHandler {
28
+ (eventName: string, data: any): void | Promise<void>;
29
+ }
30
+ export interface BatchEvent {
31
+ event: string;
32
+ data: any;
33
+ }
34
+ export interface EventHistoryEntry {
35
+ event: string;
36
+ data: any;
37
+ timestamp: string;
38
+ namespace: string;
39
+ }
40
+ /**
41
+ * Get event instance for specific namespace - the only function you need to learn
42
+ * Strategy auto-detected from environment (REDIS_URL → Redis, no URL → Memory)
43
+ * @llm-rule WHEN: Need event-driven architecture in any part of your app - this is your main entry point
44
+ * @llm-rule AVOID: Creating EventClass directly - always use this function
45
+ * @llm-rule NOTE: Typical flow - get(namespace) → event.on() → event.emit() → distributed handling
46
+ */
47
+ declare function get(namespace?: string): Event;
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
+ declare function clear(): Promise<void>;
54
+ /**
55
+ * Reset event configuration (useful for testing)
56
+ * @llm-rule WHEN: Testing event logic with different environment configurations
57
+ * @llm-rule AVOID: Using in production - only for tests and development
58
+ */
59
+ declare function reset(newConfig?: Partial<EventConfig>): Promise<void>;
60
+ /**
61
+ * Get active event strategy for debugging
62
+ * @llm-rule WHEN: Debugging or health checks to see which strategy is active (Redis vs Memory)
63
+ * @llm-rule AVOID: Using for application logic - events should be transparent
64
+ */
65
+ declare function getStrategy(): string;
66
+ /**
67
+ * Get all active event namespaces
68
+ * @llm-rule WHEN: Debugging or monitoring which event namespaces are active
69
+ * @llm-rule AVOID: Using for business logic - this is for observability only
70
+ */
71
+ declare function getActiveNamespaces(): string[];
72
+ /**
73
+ * Get event configuration summary for debugging
74
+ * @llm-rule WHEN: Health checks or debugging event configuration
75
+ * @llm-rule AVOID: Exposing sensitive connection details - this only shows safe info
76
+ */
77
+ declare function getConfig(): {
78
+ strategy: string;
79
+ historyEnabled: boolean;
80
+ activeNamespaces: string[];
81
+ environment: string;
82
+ };
83
+ /**
84
+ * Check if Redis is available and configured
85
+ * @llm-rule WHEN: Conditional logic based on event capabilities
86
+ * @llm-rule AVOID: Complex event detection - just use events normally, strategy handles it
87
+ */
88
+ declare function hasRedis(): boolean;
89
+ /**
90
+ * Emit event across all namespaces (dangerous)
91
+ * @llm-rule WHEN: Broadcasting system-wide events like shutdown or maintenance
92
+ * @llm-rule AVOID: Using for regular events - use namespace-specific events instead
93
+ * @llm-rule NOTE: Only use for system-level events that need global broadcast
94
+ */
95
+ declare function broadcast(event: string, data?: any): Promise<boolean[]>;
96
+ /**
97
+ * Get event statistics across all namespaces
98
+ * @llm-rule WHEN: Monitoring event system health and usage
99
+ * @llm-rule AVOID: Using for business logic - this is for monitoring only
100
+ */
101
+ declare function getStats(): {
102
+ strategy: string;
103
+ totalNamespaces: number;
104
+ totalListeners: number;
105
+ connected: number;
106
+ namespaces: Array<{
107
+ namespace: string;
108
+ listeners: number;
109
+ connected: boolean;
110
+ }>;
111
+ };
112
+ /**
113
+ * Validate event configuration at startup with detailed feedback
114
+ * @llm-rule WHEN: App startup to ensure events are properly configured
115
+ * @llm-rule AVOID: Skipping validation - missing event config causes runtime issues
116
+ * @llm-rule NOTE: Returns validation results instead of throwing - allows graceful handling
117
+ */
118
+ declare function validateConfig(): {
119
+ valid: boolean;
120
+ strategy: string;
121
+ warnings: string[];
122
+ errors: string[];
123
+ ready: boolean;
124
+ };
125
+ /**
126
+ * Validate production requirements and throw if critical issues found
127
+ * @llm-rule WHEN: Production deployment validation - ensures events work in production
128
+ * @llm-rule AVOID: Skipping in production - event failures are often silent
129
+ * @llm-rule NOTE: Throws on critical issues, warns on non-critical ones
130
+ */
131
+ declare function validateProduction(): void;
132
+ /**
133
+ * Get comprehensive health check status for monitoring
134
+ * @llm-rule WHEN: Health check endpoints or monitoring systems
135
+ * @llm-rule AVOID: Using in critical application path - this is for monitoring only
136
+ * @llm-rule NOTE: Returns detailed status without exposing sensitive configuration
137
+ */
138
+ declare function getHealthStatus(): {
139
+ status: 'healthy' | 'warning' | 'error';
140
+ strategy: string;
141
+ configured: boolean;
142
+ issues: string[];
143
+ ready: boolean;
144
+ timestamp: string;
145
+ };
146
+ /**
147
+ * Graceful shutdown for all event instances
148
+ * @llm-rule WHEN: App shutdown or process termination
149
+ * @llm-rule AVOID: Abrupt process exit - graceful shutdown prevents data loss
150
+ */
151
+ declare function shutdown(): Promise<void>;
152
+ /**
153
+ * Single eventing export with minimal API (like auth module)
154
+ */
155
+ export declare const eventClass: {
156
+ readonly get: typeof get;
157
+ readonly clear: typeof clear;
158
+ readonly reset: typeof reset;
159
+ readonly getStrategy: typeof getStrategy;
160
+ readonly getActiveNamespaces: typeof getActiveNamespaces;
161
+ readonly getConfig: typeof getConfig;
162
+ readonly hasRedis: typeof hasRedis;
163
+ readonly getStats: typeof getStats;
164
+ readonly broadcast: typeof broadcast;
165
+ readonly validateConfig: typeof validateConfig;
166
+ readonly validateProduction: typeof validateProduction;
167
+ readonly getHealthStatus: typeof getHealthStatus;
168
+ readonly shutdown: typeof shutdown;
169
+ };
170
+ export type { EventConfig } from './defaults.js';
171
+ export { EventClass } from './event.js';
172
+ export default eventClass;
173
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/event/index.ts"],"names":[],"mappings":"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"}