@bloomneo/appkit 1.2.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +902 -0
- package/bin/appkit.js +71 -0
- package/bin/commands/generate.js +1050 -0
- package/bin/templates/backend/README.md.template +39 -0
- package/bin/templates/backend/api.http.template +0 -0
- package/bin/templates/backend/docs/APPKIT_CLI.md +507 -0
- package/bin/templates/backend/docs/APPKIT_COMMENTS_GUIDELINES.md +61 -0
- package/bin/templates/backend/docs/APPKIT_LLM_GUIDE.md +2539 -0
- package/bin/templates/backend/package.json.template +34 -0
- package/bin/templates/backend/src/api/features/welcome/welcome.http.template +29 -0
- package/bin/templates/backend/src/api/features/welcome/welcome.route.ts.template +36 -0
- package/bin/templates/backend/src/api/features/welcome/welcome.service.ts.template +88 -0
- package/bin/templates/backend/src/api/features/welcome/welcome.types.ts.template +18 -0
- package/bin/templates/backend/src/api/lib/api-router.ts.template +84 -0
- package/bin/templates/backend/src/api/server.ts.template +188 -0
- package/bin/templates/backend/tsconfig.api.json.template +24 -0
- package/bin/templates/backend/tsconfig.json.template +40 -0
- package/bin/templates/feature/feature.http.template +63 -0
- package/bin/templates/feature/feature.route.ts.template +36 -0
- package/bin/templates/feature/feature.service.ts.template +81 -0
- package/bin/templates/feature/feature.types.ts.template +23 -0
- package/bin/templates/feature-db/feature.http.template +63 -0
- package/bin/templates/feature-db/feature.model.ts.template +74 -0
- package/bin/templates/feature-db/feature.route.ts.template +58 -0
- package/bin/templates/feature-db/feature.service.ts.template +231 -0
- package/bin/templates/feature-db/feature.types.ts.template +25 -0
- package/bin/templates/feature-db/schema-addition.prisma.template +9 -0
- package/bin/templates/feature-db/seeding/README.md.template +57 -0
- package/bin/templates/feature-db/seeding/feature.seed.js.template +67 -0
- package/bin/templates/feature-user/schema-addition.prisma.template +19 -0
- package/bin/templates/feature-user/user.http.template +157 -0
- package/bin/templates/feature-user/user.model.ts.template +244 -0
- package/bin/templates/feature-user/user.route.ts.template +379 -0
- package/bin/templates/feature-user/user.seed.js.template +182 -0
- package/bin/templates/feature-user/user.service.ts.template +426 -0
- package/bin/templates/feature-user/user.types.ts.template +127 -0
- package/dist/auth/auth.d.ts +182 -0
- package/dist/auth/auth.d.ts.map +1 -0
- package/dist/auth/auth.js +477 -0
- package/dist/auth/auth.js.map +1 -0
- package/dist/auth/defaults.d.ts +104 -0
- package/dist/auth/defaults.d.ts.map +1 -0
- package/dist/auth/defaults.js +374 -0
- package/dist/auth/defaults.js.map +1 -0
- package/dist/auth/index.d.ts +70 -0
- package/dist/auth/index.d.ts.map +1 -0
- package/dist/auth/index.js +94 -0
- package/dist/auth/index.js.map +1 -0
- package/dist/cache/cache.d.ts +118 -0
- package/dist/cache/cache.d.ts.map +1 -0
- package/dist/cache/cache.js +249 -0
- package/dist/cache/cache.js.map +1 -0
- package/dist/cache/defaults.d.ts +63 -0
- package/dist/cache/defaults.d.ts.map +1 -0
- package/dist/cache/defaults.js +193 -0
- package/dist/cache/defaults.js.map +1 -0
- package/dist/cache/index.d.ts +101 -0
- package/dist/cache/index.d.ts.map +1 -0
- package/dist/cache/index.js +203 -0
- package/dist/cache/index.js.map +1 -0
- package/dist/cache/strategies/memory.d.ts +138 -0
- package/dist/cache/strategies/memory.d.ts.map +1 -0
- package/dist/cache/strategies/memory.js +348 -0
- package/dist/cache/strategies/memory.js.map +1 -0
- package/dist/cache/strategies/redis.d.ts +105 -0
- package/dist/cache/strategies/redis.d.ts.map +1 -0
- package/dist/cache/strategies/redis.js +318 -0
- package/dist/cache/strategies/redis.js.map +1 -0
- package/dist/config/config.d.ts +62 -0
- package/dist/config/config.d.ts.map +1 -0
- package/dist/config/config.js +107 -0
- package/dist/config/config.js.map +1 -0
- package/dist/config/defaults.d.ts +44 -0
- package/dist/config/defaults.d.ts.map +1 -0
- package/dist/config/defaults.js +217 -0
- package/dist/config/defaults.js.map +1 -0
- package/dist/config/index.d.ts +105 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +163 -0
- package/dist/config/index.js.map +1 -0
- package/dist/database/adapters/mongoose.d.ts +106 -0
- package/dist/database/adapters/mongoose.d.ts.map +1 -0
- package/dist/database/adapters/mongoose.js +480 -0
- package/dist/database/adapters/mongoose.js.map +1 -0
- package/dist/database/adapters/prisma.d.ts +106 -0
- package/dist/database/adapters/prisma.d.ts.map +1 -0
- package/dist/database/adapters/prisma.js +494 -0
- package/dist/database/adapters/prisma.js.map +1 -0
- package/dist/database/defaults.d.ts +87 -0
- package/dist/database/defaults.d.ts.map +1 -0
- package/dist/database/defaults.js +271 -0
- package/dist/database/defaults.js.map +1 -0
- package/dist/database/index.d.ts +137 -0
- package/dist/database/index.d.ts.map +1 -0
- package/dist/database/index.js +490 -0
- package/dist/database/index.js.map +1 -0
- package/dist/email/defaults.d.ts +100 -0
- package/dist/email/defaults.d.ts.map +1 -0
- package/dist/email/defaults.js +400 -0
- package/dist/email/defaults.js.map +1 -0
- package/dist/email/email.d.ts +139 -0
- package/dist/email/email.d.ts.map +1 -0
- package/dist/email/email.js +316 -0
- package/dist/email/email.js.map +1 -0
- package/dist/email/index.d.ts +176 -0
- package/dist/email/index.d.ts.map +1 -0
- package/dist/email/index.js +251 -0
- package/dist/email/index.js.map +1 -0
- package/dist/email/strategies/console.d.ts +90 -0
- package/dist/email/strategies/console.d.ts.map +1 -0
- package/dist/email/strategies/console.js +268 -0
- package/dist/email/strategies/console.js.map +1 -0
- package/dist/email/strategies/resend.d.ts +84 -0
- package/dist/email/strategies/resend.d.ts.map +1 -0
- package/dist/email/strategies/resend.js +266 -0
- package/dist/email/strategies/resend.js.map +1 -0
- package/dist/email/strategies/smtp.d.ts +77 -0
- package/dist/email/strategies/smtp.d.ts.map +1 -0
- package/dist/email/strategies/smtp.js +286 -0
- package/dist/email/strategies/smtp.js.map +1 -0
- package/dist/error/defaults.d.ts +40 -0
- package/dist/error/defaults.d.ts.map +1 -0
- package/dist/error/defaults.js +75 -0
- package/dist/error/defaults.js.map +1 -0
- package/dist/error/error.d.ts +140 -0
- package/dist/error/error.d.ts.map +1 -0
- package/dist/error/error.js +200 -0
- package/dist/error/error.js.map +1 -0
- package/dist/error/index.d.ts +145 -0
- package/dist/error/index.d.ts.map +1 -0
- package/dist/error/index.js +145 -0
- package/dist/error/index.js.map +1 -0
- package/dist/event/defaults.d.ts +111 -0
- package/dist/event/defaults.d.ts.map +1 -0
- package/dist/event/defaults.js +378 -0
- package/dist/event/defaults.js.map +1 -0
- package/dist/event/event.d.ts +171 -0
- package/dist/event/event.d.ts.map +1 -0
- package/dist/event/event.js +391 -0
- package/dist/event/event.js.map +1 -0
- package/dist/event/index.d.ts +173 -0
- package/dist/event/index.d.ts.map +1 -0
- package/dist/event/index.js +302 -0
- package/dist/event/index.js.map +1 -0
- package/dist/event/strategies/memory.d.ts +122 -0
- package/dist/event/strategies/memory.d.ts.map +1 -0
- package/dist/event/strategies/memory.js +331 -0
- package/dist/event/strategies/memory.js.map +1 -0
- package/dist/event/strategies/redis.d.ts +115 -0
- package/dist/event/strategies/redis.d.ts.map +1 -0
- package/dist/event/strategies/redis.js +434 -0
- package/dist/event/strategies/redis.js.map +1 -0
- package/dist/index.d.ts +58 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +72 -0
- package/dist/index.js.map +1 -0
- package/dist/logger/defaults.d.ts +67 -0
- package/dist/logger/defaults.d.ts.map +1 -0
- package/dist/logger/defaults.js +213 -0
- package/dist/logger/defaults.js.map +1 -0
- package/dist/logger/index.d.ts +84 -0
- package/dist/logger/index.d.ts.map +1 -0
- package/dist/logger/index.js +101 -0
- package/dist/logger/index.js.map +1 -0
- package/dist/logger/logger.d.ts +165 -0
- package/dist/logger/logger.d.ts.map +1 -0
- package/dist/logger/logger.js +843 -0
- package/dist/logger/logger.js.map +1 -0
- package/dist/logger/transports/console.d.ts +102 -0
- package/dist/logger/transports/console.d.ts.map +1 -0
- package/dist/logger/transports/console.js +276 -0
- package/dist/logger/transports/console.js.map +1 -0
- package/dist/logger/transports/database.d.ts +153 -0
- package/dist/logger/transports/database.d.ts.map +1 -0
- package/dist/logger/transports/database.js +539 -0
- package/dist/logger/transports/database.js.map +1 -0
- package/dist/logger/transports/file.d.ts +146 -0
- package/dist/logger/transports/file.d.ts.map +1 -0
- package/dist/logger/transports/file.js +464 -0
- package/dist/logger/transports/file.js.map +1 -0
- package/dist/logger/transports/http.d.ts +128 -0
- package/dist/logger/transports/http.d.ts.map +1 -0
- package/dist/logger/transports/http.js +401 -0
- package/dist/logger/transports/http.js.map +1 -0
- package/dist/logger/transports/webhook.d.ts +152 -0
- package/dist/logger/transports/webhook.d.ts.map +1 -0
- package/dist/logger/transports/webhook.js +485 -0
- package/dist/logger/transports/webhook.js.map +1 -0
- package/dist/queue/defaults.d.ts +66 -0
- package/dist/queue/defaults.d.ts.map +1 -0
- package/dist/queue/defaults.js +205 -0
- package/dist/queue/defaults.js.map +1 -0
- package/dist/queue/index.d.ts +124 -0
- package/dist/queue/index.d.ts.map +1 -0
- package/dist/queue/index.js +116 -0
- package/dist/queue/index.js.map +1 -0
- package/dist/queue/queue.d.ts +156 -0
- package/dist/queue/queue.d.ts.map +1 -0
- package/dist/queue/queue.js +387 -0
- package/dist/queue/queue.js.map +1 -0
- package/dist/queue/transports/database.d.ts +165 -0
- package/dist/queue/transports/database.d.ts.map +1 -0
- package/dist/queue/transports/database.js +595 -0
- package/dist/queue/transports/database.js.map +1 -0
- package/dist/queue/transports/memory.d.ts +143 -0
- package/dist/queue/transports/memory.d.ts.map +1 -0
- package/dist/queue/transports/memory.js +415 -0
- package/dist/queue/transports/memory.js.map +1 -0
- package/dist/queue/transports/redis.d.ts +203 -0
- package/dist/queue/transports/redis.d.ts.map +1 -0
- package/dist/queue/transports/redis.js +744 -0
- package/dist/queue/transports/redis.js.map +1 -0
- package/dist/security/defaults.d.ts +64 -0
- package/dist/security/defaults.d.ts.map +1 -0
- package/dist/security/defaults.js +159 -0
- package/dist/security/defaults.js.map +1 -0
- package/dist/security/index.d.ts +110 -0
- package/dist/security/index.d.ts.map +1 -0
- package/dist/security/index.js +160 -0
- package/dist/security/index.js.map +1 -0
- package/dist/security/security.d.ts +138 -0
- package/dist/security/security.d.ts.map +1 -0
- package/dist/security/security.js +419 -0
- package/dist/security/security.js.map +1 -0
- package/dist/storage/defaults.d.ts +79 -0
- package/dist/storage/defaults.d.ts.map +1 -0
- package/dist/storage/defaults.js +358 -0
- package/dist/storage/defaults.js.map +1 -0
- package/dist/storage/index.d.ts +153 -0
- package/dist/storage/index.d.ts.map +1 -0
- package/dist/storage/index.js +242 -0
- package/dist/storage/index.js.map +1 -0
- package/dist/storage/storage.d.ts +151 -0
- package/dist/storage/storage.d.ts.map +1 -0
- package/dist/storage/storage.js +439 -0
- package/dist/storage/storage.js.map +1 -0
- package/dist/storage/strategies/local.d.ts +117 -0
- package/dist/storage/strategies/local.d.ts.map +1 -0
- package/dist/storage/strategies/local.js +368 -0
- package/dist/storage/strategies/local.js.map +1 -0
- package/dist/storage/strategies/r2.d.ts +130 -0
- package/dist/storage/strategies/r2.d.ts.map +1 -0
- package/dist/storage/strategies/r2.js +470 -0
- package/dist/storage/strategies/r2.js.map +1 -0
- package/dist/storage/strategies/s3.d.ts +121 -0
- package/dist/storage/strategies/s3.d.ts.map +1 -0
- package/dist/storage/strategies/s3.js +461 -0
- package/dist/storage/strategies/s3.js.map +1 -0
- package/dist/util/defaults.d.ts +77 -0
- package/dist/util/defaults.d.ts.map +1 -0
- package/dist/util/defaults.js +193 -0
- package/dist/util/defaults.js.map +1 -0
- package/dist/util/index.d.ts +97 -0
- package/dist/util/index.d.ts.map +1 -0
- package/dist/util/index.js +165 -0
- package/dist/util/index.js.map +1 -0
- package/dist/util/util.d.ts +145 -0
- package/dist/util/util.d.ts.map +1 -0
- package/dist/util/util.js +481 -0
- package/dist/util/util.js.map +1 -0
- package/package.json +234 -0
|
@@ -0,0 +1,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":"AAAA;;;;;;;;GAQG;AAIH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAEjD,MAAM,WAAW,YAAY;IAC3B,CAAC,IAAI,EAAE,GAAG,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACnC;AAED,MAAM,WAAW,eAAe;IAC9B,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACtD;AAED,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,GAAG,CAAC;IACV,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACjD,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,YAAY,GAAG,IAAI,CAAC;IAC/C,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,YAAY,GAAG,IAAI,CAAC;IACjD,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,YAAY,GAAG,IAAI,CAAC;IACjD,YAAY,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,GAAG,CAAC;IAClC,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CAC7B;AAED,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,GAAG,CAAC;CACX;AAED;;GAEG;AACH,qBAAa,UAAU;IACd,MAAM,EAAE,WAAW,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IACzB,OAAO,CAAC,QAAQ,CAAiC;IACjD,OAAO,CAAC,SAAS,CAAkB;IACnC,OAAO,CAAC,YAAY,CAA2B;IAC/C,OAAO,CAAC,gBAAgB,CAAwC;gBAEpD,MAAM,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM;IAMlD;;;;OAIG;IACH,OAAO,CAAC,cAAc;IAWtB;;;;OAIG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAoB9B;;;;OAIG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAgBjC;;;;;OAKG;IACG,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,GAAE,GAAQ,GAAG,OAAO,CAAC,OAAO,CAAC;IA+B3D;;;;;OAKG;IACH,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,YAAY,GAAG,eAAe,GAAG,IAAI;IAYhE;;;;OAIG;IACH,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,YAAY,GAAG,IAAI;IAiBhD;;;;OAIG;IACH,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,YAAY,GAAG,eAAe,GAAG,IAAI;IAelE;;;;OAIG;IACG,SAAS,CAAC,MAAM,EAAE,UAAU,EAAE,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;IA8BzD;;;;OAIG;IACG,OAAO,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,EAAE,CAAC;IAsB3E;;;;OAIG;IACH,YAAY,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,GAAG;IAiBjC;;;;OAIG;IACH,WAAW,IAAI,MAAM;IAIrB;;;;OAIG;IACH,SAAS,IAAI;QACX,QAAQ,EAAE,MAAM,CAAC;QACjB,SAAS,EAAE,MAAM,CAAC;QAClB,cAAc,EAAE,OAAO,CAAC;QACxB,WAAW,EAAE,MAAM,CAAC;QACpB,SAAS,EAAE,OAAO,CAAC;KACpB;IAYD;;OAEG;YACW,eAAe;IAM7B;;OAEG;IACH,OAAO,CAAC,cAAc;IAItB;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAezB;;OAEG;IACH,OAAO,CAAC,eAAe;IAMvB;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAIzB;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAO1B;;OAEG;IACH,OAAO,CAAC,qBAAqB;IAa7B;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAmB1B;;OAEG;IACH,OAAO,CAAC,eAAe;IAcvB;;OAEG;IACH,OAAO,CAAC,YAAY;IAgBpB;;OAEG;IACH,OAAO,CAAC,KAAK;CAGd"}
|