@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,378 @@
1
+ /**
2
+ * Smart defaults and environment validation for event system with auto-strategy detection
3
+ * @module @bloomneo/appkit/event
4
+ * @file src/event/defaults.ts
5
+ *
6
+ * @llm-rule WHEN: App startup - need to configure event system and connection strategy
7
+ * @llm-rule AVOID: Calling multiple times - expensive environment parsing, use lazy loading in get()
8
+ * @llm-rule NOTE: Called once at startup, cached globally for performance
9
+ * @llm-rule NOTE: Auto-detects Redis vs Memory based on REDIS_URL environment variable
10
+ */
11
+ /**
12
+ * Gets smart defaults using environment variables with auto-strategy detection
13
+ * @llm-rule WHEN: App startup to get production-ready event configuration
14
+ * @llm-rule AVOID: Calling repeatedly - expensive validation, cache the result
15
+ * @llm-rule NOTE: Auto-detects strategy: REDIS_URL → Redis, no REDIS_URL → Memory
16
+ */
17
+ export function getSmartDefaults() {
18
+ validateEnvironment();
19
+ const nodeEnv = process.env.NODE_ENV || 'development';
20
+ const isDevelopment = nodeEnv === 'development';
21
+ const isProduction = nodeEnv === 'production';
22
+ const isTest = nodeEnv === 'test';
23
+ // Auto-detect strategy from environment
24
+ const strategy = detectEventStrategy();
25
+ return {
26
+ // Strategy selection with smart detection
27
+ strategy,
28
+ // Namespace with service identification
29
+ namespace: process.env.VOILA_EVENT_NAMESPACE || process.env.VOILA_SERVICE_NAME || 'default',
30
+ // Redis configuration (only used when strategy is 'redis')
31
+ redis: {
32
+ url: process.env.REDIS_URL || 'redis://localhost:6379',
33
+ password: process.env.REDIS_PASSWORD,
34
+ maxRetries: parseInt(process.env.VOILA_EVENT_REDIS_RETRIES || '3'),
35
+ retryDelay: parseInt(process.env.VOILA_EVENT_REDIS_RETRY_DELAY || '1000'),
36
+ connectTimeout: parseInt(process.env.VOILA_EVENT_REDIS_CONNECT_TIMEOUT || '10000'),
37
+ commandTimeout: parseInt(process.env.VOILA_EVENT_REDIS_COMMAND_TIMEOUT || '5000'),
38
+ keyPrefix: process.env.VOILA_EVENT_REDIS_PREFIX || 'events',
39
+ },
40
+ // Memory configuration (only used when strategy is 'memory')
41
+ memory: {
42
+ maxListeners: parseInt(process.env.VOILA_EVENT_MEMORY_MAX_LISTENERS || '1000'),
43
+ maxHistory: parseInt(process.env.VOILA_EVENT_MEMORY_HISTORY || '100'),
44
+ checkInterval: parseInt(process.env.VOILA_EVENT_MEMORY_CHECK_INTERVAL || '30000'), // 30 seconds
45
+ enableGC: process.env.VOILA_EVENT_MEMORY_GC !== 'false',
46
+ },
47
+ // Event history configuration
48
+ history: {
49
+ enabled: process.env.VOILA_EVENT_HISTORY_ENABLED !== 'false',
50
+ maxSize: parseInt(process.env.VOILA_EVENT_HISTORY_SIZE || (isProduction ? '50' : '100')),
51
+ },
52
+ // Environment information
53
+ environment: {
54
+ isDevelopment,
55
+ isProduction,
56
+ isTest,
57
+ nodeEnv,
58
+ },
59
+ };
60
+ }
61
+ /**
62
+ * Auto-detect event strategy from environment variables
63
+ * @llm-rule WHEN: Determining which event strategy to use automatically
64
+ * @llm-rule AVOID: Manual strategy selection - environment detection handles most cases
65
+ * @llm-rule NOTE: Priority: REDIS_URL → Redis, no REDIS_URL → Memory (perfect for dev/prod)
66
+ */
67
+ function detectEventStrategy() {
68
+ // Explicit override wins (for testing/debugging)
69
+ const explicit = process.env.VOILA_EVENT_STRATEGY?.toLowerCase();
70
+ if (explicit === 'redis' || explicit === 'memory') {
71
+ return explicit;
72
+ }
73
+ // Auto-detection logic
74
+ if (process.env.REDIS_URL) {
75
+ return 'redis'; // Redis URL available - use distributed events
76
+ }
77
+ // Default to memory for development/testing
78
+ if (process.env.NODE_ENV === 'production') {
79
+ console.warn('[VoilaJSX AppKit] No REDIS_URL found in production. ' +
80
+ 'Using memory event strategy which will not work across multiple servers. ' +
81
+ 'Set REDIS_URL for distributed events.');
82
+ }
83
+ return 'memory'; // Default to memory for single-server setups
84
+ }
85
+ /**
86
+ * Validates environment variables for event configuration
87
+ * @llm-rule WHEN: App startup to ensure proper event environment configuration
88
+ * @llm-rule AVOID: Skipping validation - improper config causes silent event failures
89
+ * @llm-rule NOTE: Validates Redis URLs, numeric values, and production requirements
90
+ */
91
+ function validateEnvironment() {
92
+ // Validate event strategy if explicitly set
93
+ const strategy = process.env.VOILA_EVENT_STRATEGY;
94
+ if (strategy && !['redis', 'memory'].includes(strategy.toLowerCase())) {
95
+ throw new Error(`Invalid VOILA_EVENT_STRATEGY: "${strategy}". Must be "redis" or "memory"`);
96
+ }
97
+ // Validate Redis URL if provided
98
+ const redisUrl = process.env.REDIS_URL;
99
+ if (redisUrl && !isValidRedisUrl(redisUrl)) {
100
+ throw new Error(`Invalid REDIS_URL: "${redisUrl}". Must start with redis:// or rediss://`);
101
+ }
102
+ // Validate namespace
103
+ const namespace = process.env.VOILA_EVENT_NAMESPACE;
104
+ if (namespace && !/^[a-zA-Z0-9_-]+$/.test(namespace)) {
105
+ throw new Error(`Invalid VOILA_EVENT_NAMESPACE: "${namespace}". Must contain only letters, numbers, underscores, and hyphens`);
106
+ }
107
+ // Validate numeric values
108
+ validateNumericEnv('VOILA_EVENT_REDIS_RETRIES', 0, 10);
109
+ validateNumericEnv('VOILA_EVENT_REDIS_RETRY_DELAY', 100, 10000);
110
+ validateNumericEnv('VOILA_EVENT_REDIS_CONNECT_TIMEOUT', 1000, 60000);
111
+ validateNumericEnv('VOILA_EVENT_REDIS_COMMAND_TIMEOUT', 1000, 30000);
112
+ validateNumericEnv('VOILA_EVENT_MEMORY_MAX_LISTENERS', 10, 10000);
113
+ validateNumericEnv('VOILA_EVENT_MEMORY_HISTORY', 10, 1000);
114
+ validateNumericEnv('VOILA_EVENT_MEMORY_CHECK_INTERVAL', 5000, 300000); // 5s to 5min
115
+ validateNumericEnv('VOILA_EVENT_HISTORY_SIZE', 1, 1000);
116
+ // Validate Redis key prefix
117
+ const keyPrefix = process.env.VOILA_EVENT_REDIS_PREFIX;
118
+ if (keyPrefix && !/^[a-zA-Z0-9_-]+$/.test(keyPrefix)) {
119
+ throw new Error(`Invalid VOILA_EVENT_REDIS_PREFIX: "${keyPrefix}". Must contain only letters, numbers, underscores, and hyphens`);
120
+ }
121
+ // Production-specific validations
122
+ const nodeEnv = process.env.NODE_ENV;
123
+ if (nodeEnv === 'production') {
124
+ validateProductionConfig();
125
+ }
126
+ // Validate NODE_ENV
127
+ if (nodeEnv && !['development', 'production', 'test', 'staging'].includes(nodeEnv)) {
128
+ console.warn(`[VoilaJSX AppKit] Unusual NODE_ENV: "${nodeEnv}". ` +
129
+ `Expected: development, production, test, or staging`);
130
+ }
131
+ }
132
+ /**
133
+ * Validates Redis URL format
134
+ * @llm-rule WHEN: Checking Redis connection string validity
135
+ * @llm-rule AVOID: Using invalid Redis URLs - causes connection failures
136
+ */
137
+ function isValidRedisUrl(url) {
138
+ try {
139
+ const parsed = new URL(url);
140
+ return ['redis:', 'rediss:'].includes(parsed.protocol);
141
+ }
142
+ catch {
143
+ return false;
144
+ }
145
+ }
146
+ /**
147
+ * Validates numeric environment variable within acceptable range
148
+ * @llm-rule WHEN: Validating event configuration numeric values
149
+ * @llm-rule AVOID: Using values outside safe ranges - causes performance or memory issues
150
+ */
151
+ function validateNumericEnv(name, min, max) {
152
+ const value = process.env[name];
153
+ if (!value)
154
+ return;
155
+ const num = parseInt(value);
156
+ if (isNaN(num) || num < min || num > max) {
157
+ throw new Error(`Invalid ${name}: "${value}". Must be a number between ${min} and ${max}`);
158
+ }
159
+ }
160
+ /**
161
+ * Validates production event configuration
162
+ * @llm-rule WHEN: Running in production environment
163
+ * @llm-rule AVOID: Memory strategy in multi-server production - events won't work across servers
164
+ */
165
+ function validateProductionConfig() {
166
+ const strategy = detectEventStrategy();
167
+ if (strategy === 'memory') {
168
+ console.warn('[VoilaJSX AppKit] Using memory event strategy in production. ' +
169
+ 'Events will only work within single server instance. ' +
170
+ 'Set REDIS_URL for distributed events across multiple servers.');
171
+ }
172
+ // Validate namespace is set in production
173
+ const namespace = process.env.VOILA_EVENT_NAMESPACE;
174
+ if (!namespace) {
175
+ console.warn('[VoilaJSX AppKit] No event namespace configured in production. ' +
176
+ 'Set VOILA_EVENT_NAMESPACE for proper event isolation.');
177
+ }
178
+ }
179
+ /**
180
+ * Gets event configuration summary for debugging and health checks
181
+ * @llm-rule WHEN: Debugging event configuration or building health check endpoints
182
+ * @llm-rule AVOID: Exposing sensitive connection details - this only shows safe info
183
+ */
184
+ export function getConfigSummary() {
185
+ const config = getSmartDefaults();
186
+ return {
187
+ strategy: config.strategy,
188
+ namespace: config.namespace,
189
+ historyEnabled: config.history.enabled,
190
+ redisConnected: config.strategy === 'redis' && !!config.redis?.url,
191
+ environment: config.environment.nodeEnv,
192
+ };
193
+ }
194
+ /**
195
+ * Validates that required event configuration is present for production
196
+ * @llm-rule WHEN: App startup validation for production deployments
197
+ * @llm-rule AVOID: Skipping validation - missing event config causes runtime issues
198
+ */
199
+ export function validateProductionRequirements() {
200
+ const config = getSmartDefaults();
201
+ if (config.environment.isProduction) {
202
+ if (config.strategy === 'memory') {
203
+ console.warn('[VoilaJSX AppKit] Using memory event strategy in production. ' +
204
+ 'Events will not work across multiple server instances. ' +
205
+ 'Set REDIS_URL for distributed events.');
206
+ }
207
+ if (config.strategy === 'redis' && !config.redis?.url) {
208
+ throw new Error('Redis strategy selected but REDIS_URL not configured. ' +
209
+ 'Set REDIS_URL environment variable for Redis events.');
210
+ }
211
+ }
212
+ }
213
+ /**
214
+ * Validates startup configuration and throws detailed errors
215
+ * @llm-rule WHEN: App startup to ensure event configuration is valid before starting
216
+ * @llm-rule AVOID: Skipping validation - catches config issues early
217
+ * @llm-rule NOTE: Comprehensive validation for production readiness
218
+ */
219
+ export function validateStartupConfiguration() {
220
+ const warnings = [];
221
+ const errors = [];
222
+ try {
223
+ const config = getSmartDefaults();
224
+ const strategy = config.strategy;
225
+ // Strategy-specific validation
226
+ switch (strategy) {
227
+ case 'redis':
228
+ if (!config.redis?.url) {
229
+ errors.push('REDIS_URL is required for Redis strategy');
230
+ }
231
+ else if (!isValidRedisUrl(config.redis.url)) {
232
+ errors.push('REDIS_URL must start with redis:// or rediss://');
233
+ }
234
+ break;
235
+ case 'memory':
236
+ if (config.environment.isProduction) {
237
+ warnings.push('Memory strategy in production - events will not work across servers');
238
+ }
239
+ break;
240
+ }
241
+ // Namespace validation
242
+ if (!config.namespace || config.namespace === 'default') {
243
+ if (config.environment.isProduction) {
244
+ warnings.push('Using default namespace in production - consider setting VOILA_EVENT_NAMESPACE');
245
+ }
246
+ }
247
+ // Environment-specific warnings
248
+ if (config.environment.isProduction && strategy === 'memory') {
249
+ warnings.push('No Redis configured for distributed events in production');
250
+ }
251
+ if (config.environment.isDevelopment && strategy === 'redis') {
252
+ warnings.push('Using Redis in development - memory strategy is faster for local development');
253
+ }
254
+ return {
255
+ strategy,
256
+ warnings,
257
+ errors,
258
+ ready: errors.length === 0,
259
+ };
260
+ }
261
+ catch (error) {
262
+ errors.push(`Configuration validation failed: ${error.message}`);
263
+ return {
264
+ strategy: 'unknown',
265
+ warnings,
266
+ errors,
267
+ ready: false,
268
+ };
269
+ }
270
+ }
271
+ /**
272
+ * Performs comprehensive event system health check
273
+ * @llm-rule WHEN: Health check endpoints or monitoring systems
274
+ * @llm-rule AVOID: Running in critical path - this is for monitoring only
275
+ * @llm-rule NOTE: Returns detailed health status without exposing sensitive data
276
+ */
277
+ export function performHealthCheck() {
278
+ const issues = [];
279
+ let status = 'healthy';
280
+ try {
281
+ const validation = validateStartupConfiguration();
282
+ // Determine overall status
283
+ if (validation.errors.length > 0) {
284
+ status = 'error';
285
+ issues.push(...validation.errors);
286
+ }
287
+ else if (validation.warnings.length > 0) {
288
+ status = 'warning';
289
+ issues.push(...validation.warnings);
290
+ }
291
+ const configured = validation.strategy !== 'memory' ||
292
+ process.env.NODE_ENV !== 'production';
293
+ return {
294
+ status,
295
+ strategy: validation.strategy,
296
+ configured,
297
+ issues,
298
+ ready: validation.ready,
299
+ timestamp: new Date().toISOString(),
300
+ };
301
+ }
302
+ catch (error) {
303
+ return {
304
+ status: 'error',
305
+ strategy: 'unknown',
306
+ configured: false,
307
+ issues: [`Health check failed: ${error.message}`],
308
+ ready: false,
309
+ timestamp: new Date().toISOString(),
310
+ };
311
+ }
312
+ }
313
+ /**
314
+ * Gets optimal event configuration for different environments
315
+ * @llm-rule WHEN: Setting up environment-specific event behavior
316
+ * @llm-rule AVOID: Manual environment handling - this provides optimal defaults
317
+ */
318
+ export function getEnvironmentOptimizedConfig() {
319
+ const config = getSmartDefaults();
320
+ // Optimize for different environments
321
+ if (config.environment.isDevelopment) {
322
+ // Development: More history, frequent GC
323
+ config.history.maxSize = 100;
324
+ if (config.memory) {
325
+ config.memory.checkInterval = 10000; // 10 seconds
326
+ config.memory.enableGC = true;
327
+ }
328
+ }
329
+ else if (config.environment.isProduction) {
330
+ // Production: Less history, less frequent GC
331
+ config.history.maxSize = 50;
332
+ if (config.memory) {
333
+ config.memory.checkInterval = 60000; // 1 minute
334
+ config.memory.enableGC = true;
335
+ }
336
+ }
337
+ else if (config.environment.isTest) {
338
+ // Test: Minimal history, no GC
339
+ config.history.maxSize = 10;
340
+ if (config.memory) {
341
+ config.memory.checkInterval = 1000; // 1 second
342
+ config.memory.enableGC = false;
343
+ }
344
+ }
345
+ return config;
346
+ }
347
+ /**
348
+ * Checks if Redis is available and properly configured
349
+ * @llm-rule WHEN: Conditional logic based on event capabilities
350
+ * @llm-rule AVOID: Complex event detection - just use events normally, strategy handles it
351
+ */
352
+ export function hasRedis() {
353
+ const redisUrl = process.env.REDIS_URL;
354
+ return !!(redisUrl && isValidRedisUrl(redisUrl));
355
+ }
356
+ /**
357
+ * Gets recommended configuration for microservices
358
+ * @llm-rule WHEN: Setting up events for microservices architecture
359
+ * @llm-rule AVOID: Default config for microservices - needs specific tuning
360
+ */
361
+ export function getMicroservicesConfig() {
362
+ return {
363
+ strategy: 'redis', // Always use Redis for microservices
364
+ history: {
365
+ enabled: true,
366
+ maxSize: 25, // Less history per service
367
+ },
368
+ redis: {
369
+ url: process.env.REDIS_URL || 'redis://localhost:6379',
370
+ maxRetries: 5, // More retries for reliability
371
+ retryDelay: 2000, // Longer delays
372
+ connectTimeout: 15000, // Longer timeout
373
+ commandTimeout: 10000, // Longer command timeout
374
+ keyPrefix: 'microservices:events',
375
+ },
376
+ };
377
+ }
378
+ //# sourceMappingURL=defaults.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"defaults.js","sourceRoot":"","sources":["../../src/event/defaults.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,171 @@
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 type { EventConfig } from './defaults.js';
11
+ export interface EventHandler {
12
+ (data: any): void | Promise<void>;
13
+ }
14
+ export interface WildcardHandler {
15
+ (eventName: string, data: any): void | Promise<void>;
16
+ }
17
+ export interface EventHistoryEntry {
18
+ event: string;
19
+ data: any;
20
+ timestamp: string;
21
+ namespace: string;
22
+ }
23
+ export interface EventStrategy {
24
+ emit(event: string, data: any): Promise<boolean>;
25
+ on(event: string, handler: EventHandler): void;
26
+ once(event: string, handler: EventHandler): void;
27
+ off(event: string, handler?: EventHandler): void;
28
+ getListeners(event?: string): any;
29
+ disconnect(): Promise<void>;
30
+ }
31
+ export interface BatchEvent {
32
+ event: string;
33
+ data: any;
34
+ }
35
+ /**
36
+ * Event class with automatic strategy selection and ultra-simple API
37
+ */
38
+ export declare class EventClass {
39
+ config: EventConfig;
40
+ namespace: string;
41
+ private strategy;
42
+ private connected;
43
+ private eventHistory;
44
+ private wildcardHandlers;
45
+ constructor(config: EventConfig, namespace: string);
46
+ /**
47
+ * Creates appropriate strategy based on configuration
48
+ * @llm-rule WHEN: Event initialization - selects Redis or Memory based on environment
49
+ * @llm-rule AVOID: Manual strategy creation - configuration handles strategy selection
50
+ */
51
+ private createStrategy;
52
+ /**
53
+ * Connects to event backend with automatic retry logic
54
+ * @llm-rule WHEN: Event initialization or reconnection after failure
55
+ * @llm-rule AVOID: Manual connection management - this handles connection state
56
+ */
57
+ connect(): Promise<void>;
58
+ /**
59
+ * Disconnects from event backend gracefully
60
+ * @llm-rule WHEN: App shutdown or event cleanup
61
+ * @llm-rule AVOID: Abrupt disconnection - graceful shutdown prevents data loss
62
+ */
63
+ disconnect(): Promise<void>;
64
+ /**
65
+ * Emits an event with automatic namespacing and history tracking
66
+ * @llm-rule WHEN: Triggering events in your application
67
+ * @llm-rule AVOID: Manual event management - this handles namespacing and distribution
68
+ * @llm-rule NOTE: Automatically adds to history if enabled, handles wildcards
69
+ */
70
+ emit(event: string, data?: any): Promise<boolean>;
71
+ /**
72
+ * Adds event listener with automatic namespacing and wildcard support
73
+ * @llm-rule WHEN: Listening to events in your application
74
+ * @llm-rule AVOID: Manual listener management - this handles namespacing and wildcards
75
+ * @llm-rule NOTE: Supports wildcard patterns like 'user.*' or 'order.*.completed'
76
+ */
77
+ on(event: string, handler: EventHandler | WildcardHandler): void;
78
+ /**
79
+ * Adds one-time event listener with automatic cleanup
80
+ * @llm-rule WHEN: Listening to events that should only fire once
81
+ * @llm-rule AVOID: Manual cleanup - this handles removal after first trigger
82
+ */
83
+ once(event: string, handler: EventHandler): void;
84
+ /**
85
+ * Removes event listener(s)
86
+ * @llm-rule WHEN: Cleaning up event listeners to prevent memory leaks
87
+ * @llm-rule AVOID: Forgetting to remove listeners - causes memory leaks over time
88
+ */
89
+ off(event: string, handler?: EventHandler | WildcardHandler): void;
90
+ /**
91
+ * Emits multiple events efficiently (batch operation)
92
+ * @llm-rule WHEN: Emitting multiple events like bulk notifications or data sync
93
+ * @llm-rule AVOID: Multiple individual emit() calls - this handles batching efficiently
94
+ */
95
+ emitBatch(events: BatchEvent[]): Promise<boolean[]>;
96
+ /**
97
+ * Gets event history for debugging and replay
98
+ * @llm-rule WHEN: Debugging event flow or implementing event replay functionality
99
+ * @llm-rule AVOID: Using for business logic - history is for debugging and replay only
100
+ */
101
+ history(event?: string, limit?: number): Promise<EventHistoryEntry[]>;
102
+ /**
103
+ * Gets current event listeners for debugging
104
+ * @llm-rule WHEN: Debugging event listeners or building admin interfaces
105
+ * @llm-rule AVOID: Using for business logic - this is for debugging only
106
+ */
107
+ getListeners(event?: string): any;
108
+ /**
109
+ * Gets current event strategy name for debugging
110
+ * @llm-rule WHEN: Debugging or health checks to see which strategy is active
111
+ * @llm-rule AVOID: Using for application logic - events should be transparent
112
+ */
113
+ getStrategy(): string;
114
+ /**
115
+ * Gets event configuration summary for debugging
116
+ * @llm-rule WHEN: Health checks or debugging event configuration
117
+ * @llm-rule AVOID: Exposing sensitive details - this only shows safe info
118
+ */
119
+ getConfig(): {
120
+ strategy: string;
121
+ namespace: string;
122
+ historyEnabled: boolean;
123
+ historySize: number;
124
+ connected: boolean;
125
+ };
126
+ /**
127
+ * Ensures event system is connected before operations
128
+ */
129
+ private ensureConnected;
130
+ /**
131
+ * Builds namespaced event name
132
+ */
133
+ private buildEventName;
134
+ /**
135
+ * Validates event name format
136
+ */
137
+ private validateEventName;
138
+ /**
139
+ * Validates event handler function
140
+ */
141
+ private validateHandler;
142
+ /**
143
+ * Checks if event name is a wildcard pattern
144
+ */
145
+ private isWildcardPattern;
146
+ /**
147
+ * Adds wildcard handler
148
+ */
149
+ private addWildcardHandler;
150
+ /**
151
+ * Removes wildcard handler
152
+ */
153
+ private removeWildcardHandler;
154
+ /**
155
+ * Handles wildcard pattern matching for emitted events
156
+ */
157
+ private handleWildcardEmit;
158
+ /**
159
+ * Checks if event matches wildcard pattern
160
+ */
161
+ private matchesWildcard;
162
+ /**
163
+ * Adds event to history with size management
164
+ */
165
+ private addToHistory;
166
+ /**
167
+ * Sleep for specified milliseconds
168
+ */
169
+ private sleep;
170
+ }
171
+ //# sourceMappingURL=event.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"event.d.ts","sourceRoot":"","sources":["../../src/event/event.ts"],"names":[],"mappings":"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"}