@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,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":"AAAA;;;;;;;;;GASG;AAGH,OAAO,EAKL,KAAK,WAAW,EACjB,MAAM,eAAe,CAAC;AAMvB,MAAM,WAAW,KAAK;IACpB,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,GAAG,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAClD,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,YAAY,GAAG,eAAe,GAAG,IAAI,CAAC;IACjE,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,YAAY,GAAG,IAAI,CAAC;IACjD,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,YAAY,GAAG,eAAe,GAAG,IAAI,CAAC;IACnE,SAAS,CAAC,MAAM,EAAE,UAAU,EAAE,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;IACpD,OAAO,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,EAAE,CAAC,CAAC;IACtE,YAAY,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,GAAG,CAAC;IAClC,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5B,WAAW,IAAI,MAAM,CAAC;IACtB,SAAS,IAAI,GAAG,CAAC;CAClB;AAED,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,UAAU;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,GAAG,CAAC;CACX;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;;;;;;GAMG;AACH,iBAAS,GAAG,CAAC,SAAS,GAAE,MAAkB,GAAG,KAAK,CA8BjD;AAED;;;;GAIG;AACH,iBAAe,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAcpC;AAED;;;;GAIG;AACH,iBAAe,KAAK,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC,WAAW,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAWpE;AAED;;;;GAIG;AACH,iBAAS,WAAW,IAAI,MAAM,CAK7B;AAED;;;;GAIG;AACH,iBAAS,mBAAmB,IAAI,MAAM,EAAE,CAEvC;AAED;;;;GAIG;AACH,iBAAS,SAAS,IAAI;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,cAAc,EAAE,OAAO,CAAC;IACxB,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAC3B,WAAW,EAAE,MAAM,CAAC;CACrB,CAWA;AAED;;;;GAIG;AACH,iBAAS,QAAQ,IAAI,OAAO,CAE3B;AAED;;;;;GAKG;AACH,iBAAe,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,GAAE,GAAQ,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,CAe1E;AAED;;;;GAIG;AACH,iBAAS,QAAQ,IAAI;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,eAAe,EAAE,MAAM,CAAC;IACxB,cAAc,EAAE,MAAM,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,KAAK,CAAC;QAChB,SAAS,EAAE,MAAM,CAAC;QAClB,SAAS,EAAE,MAAM,CAAC;QAClB,SAAS,EAAE,OAAO,CAAC;KACpB,CAAC,CAAC;CACJ,CAoBA;AAED;;;;;GAKG;AACH,iBAAS,cAAc,IAAI;IACzB,KAAK,EAAE,OAAO,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,KAAK,EAAE,OAAO,CAAC;CAChB,CAmCA;AAED;;;;;GAKG;AACH,iBAAS,kBAAkB,IAAI,IAAI,CAgBlC;AAED;;;;;GAKG;AACH,iBAAS,eAAe,IAAI;IAC1B,MAAM,EAAE,SAAS,GAAG,SAAS,GAAG,OAAO,CAAC;IACxC,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,OAAO,CAAC;IACpB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,KAAK,EAAE,OAAO,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;CACnB,CAEA;AAED;;;;GAIG;AACH,iBAAe,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC,CAmBvC;AAED;;GAEG;AACH,eAAO,MAAM,UAAU;;;;;;;;;;;;;;CAqBb,CAAC;AAGX,YAAY,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AACjD,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAGxC,eAAe,UAAU,CAAC"}
|