@opensourcekd/ng-common-libs 1.1.8
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 +437 -0
- package/dist/angular/index.cjs +1273 -0
- package/dist/angular/index.cjs.map +1 -0
- package/dist/angular/index.d.ts +691 -0
- package/dist/angular/index.mjs +1255 -0
- package/dist/angular/index.mjs.map +1 -0
- package/dist/core/index.cjs +592 -0
- package/dist/core/index.cjs.map +1 -0
- package/dist/core/index.d.ts +332 -0
- package/dist/core/index.mjs +587 -0
- package/dist/core/index.mjs.map +1 -0
- package/dist/index.cjs +1277 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.ts +691 -0
- package/dist/index.mjs +1255 -0
- package/dist/index.mjs.map +1 -0
- package/package.json +97 -0
|
@@ -0,0 +1,592 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var rxjs = require('rxjs');
|
|
4
|
+
var operators = require('rxjs/operators');
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* EventBus - A centralized event bus for application-wide communication
|
|
8
|
+
* Framework-agnostic implementation using only RxJS
|
|
9
|
+
*
|
|
10
|
+
* @example
|
|
11
|
+
* ```typescript
|
|
12
|
+
* // Create an instance
|
|
13
|
+
* const eventBus = new EventBus();
|
|
14
|
+
*
|
|
15
|
+
* // Emit an event
|
|
16
|
+
* eventBus.emit('user:login', { userId: '123', username: 'john' });
|
|
17
|
+
*
|
|
18
|
+
* // Subscribe to an event
|
|
19
|
+
* eventBus.on('user:login').subscribe(data => {
|
|
20
|
+
* console.log('User logged in:', data);
|
|
21
|
+
* });
|
|
22
|
+
* ```
|
|
23
|
+
*/
|
|
24
|
+
class EventBus {
|
|
25
|
+
eventSubject = new rxjs.Subject();
|
|
26
|
+
/**
|
|
27
|
+
* Emit an event with optional data
|
|
28
|
+
* @param eventType - The type/name of the event
|
|
29
|
+
* @param data - Optional data to send with the event
|
|
30
|
+
*/
|
|
31
|
+
emit(eventType, data) {
|
|
32
|
+
this.eventSubject.next({
|
|
33
|
+
type: eventType,
|
|
34
|
+
data,
|
|
35
|
+
timestamp: Date.now()
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Subscribe to a specific event type
|
|
40
|
+
* @param eventType - The type/name of the event to listen for
|
|
41
|
+
* @returns Observable that emits the event data
|
|
42
|
+
*/
|
|
43
|
+
on(eventType) {
|
|
44
|
+
return this.eventSubject.asObservable().pipe(operators.filter(event => event.type === eventType), operators.map(event => event.data));
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Subscribe to multiple event types
|
|
48
|
+
* @param eventTypes - Array of event types to listen for
|
|
49
|
+
* @returns Observable that emits the full event payload
|
|
50
|
+
*/
|
|
51
|
+
onMultiple(eventTypes) {
|
|
52
|
+
return this.eventSubject.asObservable().pipe(operators.filter(event => eventTypes.includes(event.type)));
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Subscribe to all events
|
|
56
|
+
* @returns Observable that emits all event payloads
|
|
57
|
+
*/
|
|
58
|
+
onAll() {
|
|
59
|
+
return this.eventSubject.asObservable();
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* TokenManager - Manages authentication tokens
|
|
65
|
+
* Framework-agnostic implementation using browser storage APIs
|
|
66
|
+
* Handles storage, retrieval, and validation of JWT tokens
|
|
67
|
+
*
|
|
68
|
+
* @example
|
|
69
|
+
* ```typescript
|
|
70
|
+
* const tokenManager = new TokenManager();
|
|
71
|
+
*
|
|
72
|
+
* // Store a token
|
|
73
|
+
* tokenManager.setToken('your-jwt-token');
|
|
74
|
+
*
|
|
75
|
+
* // Check if authenticated
|
|
76
|
+
* if (tokenManager.isAuthenticated()) {
|
|
77
|
+
* const userData = tokenManager.getUserFromToken();
|
|
78
|
+
* }
|
|
79
|
+
* ```
|
|
80
|
+
*/
|
|
81
|
+
class TokenManager {
|
|
82
|
+
TOKEN_KEY = 'auth_token';
|
|
83
|
+
REFRESH_TOKEN_KEY = 'refresh_token';
|
|
84
|
+
useSessionStorage = false;
|
|
85
|
+
/**
|
|
86
|
+
* Configure token manager
|
|
87
|
+
*/
|
|
88
|
+
configure(config) {
|
|
89
|
+
if (config.tokenKey) {
|
|
90
|
+
this.TOKEN_KEY = config.tokenKey;
|
|
91
|
+
}
|
|
92
|
+
if (config.refreshTokenKey) {
|
|
93
|
+
this.REFRESH_TOKEN_KEY = config.refreshTokenKey;
|
|
94
|
+
}
|
|
95
|
+
if (config.useSessionStorage !== undefined) {
|
|
96
|
+
this.useSessionStorage = config.useSessionStorage;
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Get the storage mechanism based on configuration
|
|
101
|
+
*/
|
|
102
|
+
getStorage() {
|
|
103
|
+
return this.useSessionStorage ? sessionStorage : localStorage;
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Set authentication token
|
|
107
|
+
*/
|
|
108
|
+
setToken(token) {
|
|
109
|
+
this.getStorage().setItem(this.TOKEN_KEY, token);
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Get authentication token
|
|
113
|
+
*/
|
|
114
|
+
getToken() {
|
|
115
|
+
return this.getStorage().getItem(this.TOKEN_KEY);
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Remove authentication token
|
|
119
|
+
*/
|
|
120
|
+
removeToken() {
|
|
121
|
+
this.getStorage().removeItem(this.TOKEN_KEY);
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Set refresh token
|
|
125
|
+
*/
|
|
126
|
+
setRefreshToken(token) {
|
|
127
|
+
this.getStorage().setItem(this.REFRESH_TOKEN_KEY, token);
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Get refresh token
|
|
131
|
+
*/
|
|
132
|
+
getRefreshToken() {
|
|
133
|
+
return this.getStorage().getItem(this.REFRESH_TOKEN_KEY);
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* Remove refresh token
|
|
137
|
+
*/
|
|
138
|
+
removeRefreshToken() {
|
|
139
|
+
this.getStorage().removeItem(this.REFRESH_TOKEN_KEY);
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* Clear all tokens
|
|
143
|
+
*/
|
|
144
|
+
clearTokens() {
|
|
145
|
+
this.removeToken();
|
|
146
|
+
this.removeRefreshToken();
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* Check if token exists
|
|
150
|
+
*/
|
|
151
|
+
hasToken() {
|
|
152
|
+
return !!this.getToken();
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* Decode JWT token (without verification)
|
|
156
|
+
* @param token - JWT token to decode
|
|
157
|
+
* @returns Decoded token payload or null if invalid
|
|
158
|
+
*/
|
|
159
|
+
decodeToken(token) {
|
|
160
|
+
const tokenToDecode = token || this.getToken();
|
|
161
|
+
if (!tokenToDecode)
|
|
162
|
+
return null;
|
|
163
|
+
try {
|
|
164
|
+
const parts = tokenToDecode.split('.');
|
|
165
|
+
if (parts.length !== 3)
|
|
166
|
+
return null;
|
|
167
|
+
const payload = parts[1];
|
|
168
|
+
const decoded = JSON.parse(atob(payload.replace(/-/g, '+').replace(/_/g, '/')));
|
|
169
|
+
return decoded;
|
|
170
|
+
}
|
|
171
|
+
catch (error) {
|
|
172
|
+
console.error('Error decoding token:', error);
|
|
173
|
+
return null;
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
/**
|
|
177
|
+
* Check if token is expired
|
|
178
|
+
* @param token - Optional token to check (defaults to stored token)
|
|
179
|
+
* @returns true if token is expired or invalid
|
|
180
|
+
*/
|
|
181
|
+
isTokenExpired(token) {
|
|
182
|
+
const decoded = this.decodeToken(token);
|
|
183
|
+
if (!decoded || !decoded.exp)
|
|
184
|
+
return true;
|
|
185
|
+
const expirationDate = new Date(decoded.exp * 1000);
|
|
186
|
+
return expirationDate <= new Date();
|
|
187
|
+
}
|
|
188
|
+
/**
|
|
189
|
+
* Check if user is authenticated (has valid, non-expired token)
|
|
190
|
+
*/
|
|
191
|
+
isAuthenticated() {
|
|
192
|
+
return this.hasToken() && !this.isTokenExpired();
|
|
193
|
+
}
|
|
194
|
+
/**
|
|
195
|
+
* Get token expiration date
|
|
196
|
+
*/
|
|
197
|
+
getTokenExpirationDate(token) {
|
|
198
|
+
const decoded = this.decodeToken(token);
|
|
199
|
+
if (!decoded || !decoded.exp)
|
|
200
|
+
return null;
|
|
201
|
+
return new Date(decoded.exp * 1000);
|
|
202
|
+
}
|
|
203
|
+
/**
|
|
204
|
+
* Get user data from token
|
|
205
|
+
*/
|
|
206
|
+
getUserFromToken(token) {
|
|
207
|
+
return this.decodeToken(token);
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
/**
|
|
212
|
+
* StorageManager - Type-safe wrapper for browser storage
|
|
213
|
+
* Framework-agnostic implementation using browser storage APIs
|
|
214
|
+
* Provides JSON serialization/deserialization and error handling
|
|
215
|
+
*
|
|
216
|
+
* @example
|
|
217
|
+
* ```typescript
|
|
218
|
+
* const storage = new StorageManager();
|
|
219
|
+
*
|
|
220
|
+
* // Store data
|
|
221
|
+
* storage.setLocal('user-prefs', { theme: 'dark', lang: 'en' });
|
|
222
|
+
*
|
|
223
|
+
* // Retrieve data
|
|
224
|
+
* const prefs = storage.getLocal('user-prefs');
|
|
225
|
+
*
|
|
226
|
+
* // With expiration
|
|
227
|
+
* storage.setWithExpiration('temp-data', someData, 3600000); // 1 hour
|
|
228
|
+
* ```
|
|
229
|
+
*/
|
|
230
|
+
class StorageManager {
|
|
231
|
+
/**
|
|
232
|
+
* Set item in localStorage with JSON serialization
|
|
233
|
+
*/
|
|
234
|
+
setLocal(key, value) {
|
|
235
|
+
try {
|
|
236
|
+
const serialized = JSON.stringify(value);
|
|
237
|
+
localStorage.setItem(key, serialized);
|
|
238
|
+
return true;
|
|
239
|
+
}
|
|
240
|
+
catch (error) {
|
|
241
|
+
console.error('Error setting localStorage item:', error);
|
|
242
|
+
return false;
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
/**
|
|
246
|
+
* Get item from localStorage with JSON deserialization
|
|
247
|
+
*/
|
|
248
|
+
getLocal(key, defaultValue) {
|
|
249
|
+
try {
|
|
250
|
+
const item = localStorage.getItem(key);
|
|
251
|
+
if (item === null) {
|
|
252
|
+
return defaultValue !== undefined ? defaultValue : null;
|
|
253
|
+
}
|
|
254
|
+
return JSON.parse(item);
|
|
255
|
+
}
|
|
256
|
+
catch (error) {
|
|
257
|
+
console.error('Error getting localStorage item:', error);
|
|
258
|
+
return defaultValue !== undefined ? defaultValue : null;
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
/**
|
|
262
|
+
* Remove item from localStorage
|
|
263
|
+
*/
|
|
264
|
+
removeLocal(key) {
|
|
265
|
+
try {
|
|
266
|
+
localStorage.removeItem(key);
|
|
267
|
+
}
|
|
268
|
+
catch (error) {
|
|
269
|
+
console.error('Error removing localStorage item:', error);
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
/**
|
|
273
|
+
* Clear all localStorage items
|
|
274
|
+
*/
|
|
275
|
+
clearLocal() {
|
|
276
|
+
try {
|
|
277
|
+
localStorage.clear();
|
|
278
|
+
}
|
|
279
|
+
catch (error) {
|
|
280
|
+
console.error('Error clearing localStorage:', error);
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
/**
|
|
284
|
+
* Check if key exists in localStorage
|
|
285
|
+
*/
|
|
286
|
+
hasLocal(key) {
|
|
287
|
+
try {
|
|
288
|
+
return localStorage.getItem(key) !== null;
|
|
289
|
+
}
|
|
290
|
+
catch (error) {
|
|
291
|
+
console.error('Error checking localStorage key:', error);
|
|
292
|
+
return false;
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
/**
|
|
296
|
+
* Get all localStorage keys
|
|
297
|
+
*/
|
|
298
|
+
getLocalKeys() {
|
|
299
|
+
try {
|
|
300
|
+
return Object.keys(localStorage);
|
|
301
|
+
}
|
|
302
|
+
catch (error) {
|
|
303
|
+
console.error('Error getting localStorage keys:', error);
|
|
304
|
+
return [];
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
/**
|
|
308
|
+
* Set item in sessionStorage with JSON serialization
|
|
309
|
+
*/
|
|
310
|
+
setSession(key, value) {
|
|
311
|
+
try {
|
|
312
|
+
const serialized = JSON.stringify(value);
|
|
313
|
+
sessionStorage.setItem(key, serialized);
|
|
314
|
+
return true;
|
|
315
|
+
}
|
|
316
|
+
catch (error) {
|
|
317
|
+
console.error('Error setting sessionStorage item:', error);
|
|
318
|
+
return false;
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
/**
|
|
322
|
+
* Get item from sessionStorage with JSON deserialization
|
|
323
|
+
*/
|
|
324
|
+
getSession(key, defaultValue) {
|
|
325
|
+
try {
|
|
326
|
+
const item = sessionStorage.getItem(key);
|
|
327
|
+
if (item === null) {
|
|
328
|
+
return defaultValue !== undefined ? defaultValue : null;
|
|
329
|
+
}
|
|
330
|
+
return JSON.parse(item);
|
|
331
|
+
}
|
|
332
|
+
catch (error) {
|
|
333
|
+
console.error('Error getting sessionStorage item:', error);
|
|
334
|
+
return defaultValue !== undefined ? defaultValue : null;
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
/**
|
|
338
|
+
* Remove item from sessionStorage
|
|
339
|
+
*/
|
|
340
|
+
removeSession(key) {
|
|
341
|
+
try {
|
|
342
|
+
sessionStorage.removeItem(key);
|
|
343
|
+
}
|
|
344
|
+
catch (error) {
|
|
345
|
+
console.error('Error removing sessionStorage item:', error);
|
|
346
|
+
}
|
|
347
|
+
}
|
|
348
|
+
/**
|
|
349
|
+
* Clear all sessionStorage items
|
|
350
|
+
*/
|
|
351
|
+
clearSession() {
|
|
352
|
+
try {
|
|
353
|
+
sessionStorage.clear();
|
|
354
|
+
}
|
|
355
|
+
catch (error) {
|
|
356
|
+
console.error('Error clearing sessionStorage:', error);
|
|
357
|
+
}
|
|
358
|
+
}
|
|
359
|
+
/**
|
|
360
|
+
* Check if key exists in sessionStorage
|
|
361
|
+
*/
|
|
362
|
+
hasSession(key) {
|
|
363
|
+
try {
|
|
364
|
+
return sessionStorage.getItem(key) !== null;
|
|
365
|
+
}
|
|
366
|
+
catch (error) {
|
|
367
|
+
console.error('Error checking sessionStorage key:', error);
|
|
368
|
+
return false;
|
|
369
|
+
}
|
|
370
|
+
}
|
|
371
|
+
/**
|
|
372
|
+
* Get all sessionStorage keys
|
|
373
|
+
*/
|
|
374
|
+
getSessionKeys() {
|
|
375
|
+
try {
|
|
376
|
+
return Object.keys(sessionStorage);
|
|
377
|
+
}
|
|
378
|
+
catch (error) {
|
|
379
|
+
console.error('Error getting sessionStorage keys:', error);
|
|
380
|
+
return [];
|
|
381
|
+
}
|
|
382
|
+
}
|
|
383
|
+
/**
|
|
384
|
+
* Set item with expiration time
|
|
385
|
+
* @param key - Storage key
|
|
386
|
+
* @param value - Value to store
|
|
387
|
+
* @param expirationMs - Expiration time in milliseconds
|
|
388
|
+
* @param useSession - Use sessionStorage instead of localStorage
|
|
389
|
+
*/
|
|
390
|
+
setWithExpiration(key, value, expirationMs, useSession = false) {
|
|
391
|
+
const item = {
|
|
392
|
+
value,
|
|
393
|
+
expiration: Date.now() + expirationMs
|
|
394
|
+
};
|
|
395
|
+
return useSession
|
|
396
|
+
? this.setSession(key, item)
|
|
397
|
+
: this.setLocal(key, item);
|
|
398
|
+
}
|
|
399
|
+
/**
|
|
400
|
+
* Get item with expiration check
|
|
401
|
+
* Returns null if item is expired
|
|
402
|
+
*/
|
|
403
|
+
getWithExpiration(key, useSession = false) {
|
|
404
|
+
const item = useSession
|
|
405
|
+
? this.getSession(key)
|
|
406
|
+
: this.getLocal(key);
|
|
407
|
+
if (!item)
|
|
408
|
+
return null;
|
|
409
|
+
if (Date.now() > item.expiration) {
|
|
410
|
+
// Item expired, remove it
|
|
411
|
+
if (useSession) {
|
|
412
|
+
this.removeSession(key);
|
|
413
|
+
}
|
|
414
|
+
else {
|
|
415
|
+
this.removeLocal(key);
|
|
416
|
+
}
|
|
417
|
+
return null;
|
|
418
|
+
}
|
|
419
|
+
return item.value;
|
|
420
|
+
}
|
|
421
|
+
}
|
|
422
|
+
|
|
423
|
+
/**
|
|
424
|
+
* Log level enum
|
|
425
|
+
*/
|
|
426
|
+
exports.LogLevel = void 0;
|
|
427
|
+
(function (LogLevel) {
|
|
428
|
+
LogLevel[LogLevel["DEBUG"] = 0] = "DEBUG";
|
|
429
|
+
LogLevel[LogLevel["INFO"] = 1] = "INFO";
|
|
430
|
+
LogLevel[LogLevel["WARN"] = 2] = "WARN";
|
|
431
|
+
LogLevel[LogLevel["ERROR"] = 3] = "ERROR";
|
|
432
|
+
LogLevel[LogLevel["NONE"] = 4] = "NONE";
|
|
433
|
+
})(exports.LogLevel || (exports.LogLevel = {}));
|
|
434
|
+
/**
|
|
435
|
+
* Logger - Centralized logging utility
|
|
436
|
+
* Framework-agnostic implementation using browser console APIs
|
|
437
|
+
* Supports different log levels and can be configured globally
|
|
438
|
+
*
|
|
439
|
+
* @example
|
|
440
|
+
* ```typescript
|
|
441
|
+
* const logger = new Logger();
|
|
442
|
+
*
|
|
443
|
+
* // Configure
|
|
444
|
+
* logger.configure({
|
|
445
|
+
* level: LogLevel.DEBUG,
|
|
446
|
+
* enableTimestamp: true,
|
|
447
|
+
* prefix: 'MyApp'
|
|
448
|
+
* });
|
|
449
|
+
*
|
|
450
|
+
* // Use
|
|
451
|
+
* logger.info('User logged in', { userId: '123' });
|
|
452
|
+
* logger.error('Failed to load data', error);
|
|
453
|
+
* ```
|
|
454
|
+
*/
|
|
455
|
+
class Logger {
|
|
456
|
+
config = {
|
|
457
|
+
level: exports.LogLevel.INFO,
|
|
458
|
+
enableTimestamp: true,
|
|
459
|
+
enableStackTrace: false,
|
|
460
|
+
prefix: ''
|
|
461
|
+
};
|
|
462
|
+
/**
|
|
463
|
+
* Configure the logger
|
|
464
|
+
*/
|
|
465
|
+
configure(config) {
|
|
466
|
+
this.config = { ...this.config, ...config };
|
|
467
|
+
}
|
|
468
|
+
/**
|
|
469
|
+
* Set log level
|
|
470
|
+
*/
|
|
471
|
+
setLevel(level) {
|
|
472
|
+
this.config.level = level;
|
|
473
|
+
}
|
|
474
|
+
/**
|
|
475
|
+
* Get current log level
|
|
476
|
+
*/
|
|
477
|
+
getLevel() {
|
|
478
|
+
return this.config.level;
|
|
479
|
+
}
|
|
480
|
+
/**
|
|
481
|
+
* Format log message with timestamp and prefix
|
|
482
|
+
*/
|
|
483
|
+
formatMessage(message, level) {
|
|
484
|
+
const parts = [];
|
|
485
|
+
if (this.config.enableTimestamp) {
|
|
486
|
+
parts.push(`[${new Date().toISOString()}]`);
|
|
487
|
+
}
|
|
488
|
+
if (this.config.prefix) {
|
|
489
|
+
parts.push(`[${this.config.prefix}]`);
|
|
490
|
+
}
|
|
491
|
+
parts.push(`[${level}]`);
|
|
492
|
+
parts.push(message);
|
|
493
|
+
return parts.join(' ');
|
|
494
|
+
}
|
|
495
|
+
/**
|
|
496
|
+
* Check if log level should be logged
|
|
497
|
+
*/
|
|
498
|
+
shouldLog(level) {
|
|
499
|
+
return level >= this.config.level;
|
|
500
|
+
}
|
|
501
|
+
/**
|
|
502
|
+
* Log debug message
|
|
503
|
+
*/
|
|
504
|
+
debug(message, ...args) {
|
|
505
|
+
if (this.shouldLog(exports.LogLevel.DEBUG)) {
|
|
506
|
+
console.debug(this.formatMessage(message, 'DEBUG'), ...args);
|
|
507
|
+
}
|
|
508
|
+
}
|
|
509
|
+
/**
|
|
510
|
+
* Log info message
|
|
511
|
+
*/
|
|
512
|
+
info(message, ...args) {
|
|
513
|
+
if (this.shouldLog(exports.LogLevel.INFO)) {
|
|
514
|
+
console.info(this.formatMessage(message, 'INFO'), ...args);
|
|
515
|
+
}
|
|
516
|
+
}
|
|
517
|
+
/**
|
|
518
|
+
* Log warning message
|
|
519
|
+
*/
|
|
520
|
+
warn(message, ...args) {
|
|
521
|
+
if (this.shouldLog(exports.LogLevel.WARN)) {
|
|
522
|
+
console.warn(this.formatMessage(message, 'WARN'), ...args);
|
|
523
|
+
}
|
|
524
|
+
}
|
|
525
|
+
/**
|
|
526
|
+
* Log error message
|
|
527
|
+
*/
|
|
528
|
+
error(message, error, ...args) {
|
|
529
|
+
if (this.shouldLog(exports.LogLevel.ERROR)) {
|
|
530
|
+
console.error(this.formatMessage(message, 'ERROR'), ...args);
|
|
531
|
+
if (error) {
|
|
532
|
+
console.error(error);
|
|
533
|
+
if (this.config.enableStackTrace && error?.stack) {
|
|
534
|
+
console.error('Stack trace:', error.stack);
|
|
535
|
+
}
|
|
536
|
+
}
|
|
537
|
+
}
|
|
538
|
+
}
|
|
539
|
+
/**
|
|
540
|
+
* Log a group of messages
|
|
541
|
+
*/
|
|
542
|
+
group(label, callback) {
|
|
543
|
+
if (this.shouldLog(exports.LogLevel.INFO)) {
|
|
544
|
+
console.group(this.formatMessage(label, 'GROUP'));
|
|
545
|
+
callback();
|
|
546
|
+
console.groupEnd();
|
|
547
|
+
}
|
|
548
|
+
}
|
|
549
|
+
/**
|
|
550
|
+
* Log a collapsed group of messages
|
|
551
|
+
*/
|
|
552
|
+
groupCollapsed(label, callback) {
|
|
553
|
+
if (this.shouldLog(exports.LogLevel.INFO)) {
|
|
554
|
+
console.groupCollapsed(this.formatMessage(label, 'GROUP'));
|
|
555
|
+
callback();
|
|
556
|
+
console.groupEnd();
|
|
557
|
+
}
|
|
558
|
+
}
|
|
559
|
+
/**
|
|
560
|
+
* Log a table (useful for arrays of objects)
|
|
561
|
+
*/
|
|
562
|
+
table(data, columns) {
|
|
563
|
+
if (this.shouldLog(exports.LogLevel.INFO)) {
|
|
564
|
+
console.table(data, columns);
|
|
565
|
+
}
|
|
566
|
+
}
|
|
567
|
+
/**
|
|
568
|
+
* Log execution time of a function
|
|
569
|
+
*/
|
|
570
|
+
async time(label, fn) {
|
|
571
|
+
const start = performance.now();
|
|
572
|
+
try {
|
|
573
|
+
const result = await fn();
|
|
574
|
+
const end = performance.now();
|
|
575
|
+
const duration = (end - start).toFixed(2);
|
|
576
|
+
this.info(`${label} completed in ${duration}ms`);
|
|
577
|
+
return result;
|
|
578
|
+
}
|
|
579
|
+
catch (error) {
|
|
580
|
+
const end = performance.now();
|
|
581
|
+
const duration = (end - start).toFixed(2);
|
|
582
|
+
this.error(`${label} failed after ${duration}ms`, error);
|
|
583
|
+
throw error;
|
|
584
|
+
}
|
|
585
|
+
}
|
|
586
|
+
}
|
|
587
|
+
|
|
588
|
+
exports.EventBus = EventBus;
|
|
589
|
+
exports.Logger = Logger;
|
|
590
|
+
exports.StorageManager = StorageManager;
|
|
591
|
+
exports.TokenManager = TokenManager;
|
|
592
|
+
//# sourceMappingURL=index.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.cjs","sources":["../../src/core/event-bus.ts","../../src/core/token-manager.ts","../../src/core/storage-manager.ts","../../src/core/logger.ts"],"sourcesContent":["import { Subject, Observable } from 'rxjs';\nimport { filter, map } from 'rxjs/operators';\n\n/**\n * Event payload interface\n */\nexport interface EventPayload<T = any> {\n type: string;\n data: T;\n timestamp?: number;\n}\n\n/**\n * EventBus - A centralized event bus for application-wide communication\n * Framework-agnostic implementation using only RxJS\n * \n * @example\n * ```typescript\n * // Create an instance\n * const eventBus = new EventBus();\n * \n * // Emit an event\n * eventBus.emit('user:login', { userId: '123', username: 'john' });\n * \n * // Subscribe to an event\n * eventBus.on('user:login').subscribe(data => {\n * console.log('User logged in:', data);\n * });\n * ```\n */\nexport class EventBus {\n private eventSubject = new Subject<EventPayload>();\n\n /**\n * Emit an event with optional data\n * @param eventType - The type/name of the event\n * @param data - Optional data to send with the event\n */\n emit<T = any>(eventType: string, data?: T): void {\n this.eventSubject.next({\n type: eventType,\n data,\n timestamp: Date.now()\n });\n }\n\n /**\n * Subscribe to a specific event type\n * @param eventType - The type/name of the event to listen for\n * @returns Observable that emits the event data\n */\n on<T = any>(eventType: string): Observable<T> {\n return this.eventSubject.asObservable().pipe(\n filter(event => event.type === eventType),\n map(event => event.data as T)\n );\n }\n\n /**\n * Subscribe to multiple event types\n * @param eventTypes - Array of event types to listen for\n * @returns Observable that emits the full event payload\n */\n onMultiple(eventTypes: string[]): Observable<EventPayload> {\n return this.eventSubject.asObservable().pipe(\n filter(event => eventTypes.includes(event.type))\n );\n }\n\n /**\n * Subscribe to all events\n * @returns Observable that emits all event payloads\n */\n onAll(): Observable<EventPayload> {\n return this.eventSubject.asObservable();\n }\n}\n","/**\n * Token configuration interface\n */\nexport interface TokenConfig {\n tokenKey?: string;\n refreshTokenKey?: string;\n useSessionStorage?: boolean;\n}\n\n/**\n * TokenManager - Manages authentication tokens\n * Framework-agnostic implementation using browser storage APIs\n * Handles storage, retrieval, and validation of JWT tokens\n * \n * @example\n * ```typescript\n * const tokenManager = new TokenManager();\n * \n * // Store a token\n * tokenManager.setToken('your-jwt-token');\n * \n * // Check if authenticated\n * if (tokenManager.isAuthenticated()) {\n * const userData = tokenManager.getUserFromToken();\n * }\n * ```\n */\nexport class TokenManager {\n private TOKEN_KEY = 'auth_token';\n private REFRESH_TOKEN_KEY = 'refresh_token';\n private useSessionStorage = false;\n\n /**\n * Configure token manager\n */\n configure(config: TokenConfig): void {\n if (config.tokenKey) {\n this.TOKEN_KEY = config.tokenKey;\n }\n if (config.refreshTokenKey) {\n this.REFRESH_TOKEN_KEY = config.refreshTokenKey;\n }\n if (config.useSessionStorage !== undefined) {\n this.useSessionStorage = config.useSessionStorage;\n }\n }\n\n /**\n * Get the storage mechanism based on configuration\n */\n private getStorage(): Storage {\n return this.useSessionStorage ? sessionStorage : localStorage;\n }\n\n /**\n * Set authentication token\n */\n setToken(token: string): void {\n this.getStorage().setItem(this.TOKEN_KEY, token);\n }\n\n /**\n * Get authentication token\n */\n getToken(): string | null {\n return this.getStorage().getItem(this.TOKEN_KEY);\n }\n\n /**\n * Remove authentication token\n */\n removeToken(): void {\n this.getStorage().removeItem(this.TOKEN_KEY);\n }\n\n /**\n * Set refresh token\n */\n setRefreshToken(token: string): void {\n this.getStorage().setItem(this.REFRESH_TOKEN_KEY, token);\n }\n\n /**\n * Get refresh token\n */\n getRefreshToken(): string | null {\n return this.getStorage().getItem(this.REFRESH_TOKEN_KEY);\n }\n\n /**\n * Remove refresh token\n */\n removeRefreshToken(): void {\n this.getStorage().removeItem(this.REFRESH_TOKEN_KEY);\n }\n\n /**\n * Clear all tokens\n */\n clearTokens(): void {\n this.removeToken();\n this.removeRefreshToken();\n }\n\n /**\n * Check if token exists\n */\n hasToken(): boolean {\n return !!this.getToken();\n }\n\n /**\n * Decode JWT token (without verification)\n * @param token - JWT token to decode\n * @returns Decoded token payload or null if invalid\n */\n decodeToken(token?: string): any {\n const tokenToDecode = token || this.getToken();\n if (!tokenToDecode) return null;\n\n try {\n const parts = tokenToDecode.split('.');\n if (parts.length !== 3) return null;\n\n const payload = parts[1];\n const decoded = JSON.parse(atob(payload.replace(/-/g, '+').replace(/_/g, '/')));\n return decoded;\n } catch (error) {\n console.error('Error decoding token:', error);\n return null;\n }\n }\n\n /**\n * Check if token is expired\n * @param token - Optional token to check (defaults to stored token)\n * @returns true if token is expired or invalid\n */\n isTokenExpired(token?: string): boolean {\n const decoded = this.decodeToken(token);\n if (!decoded || !decoded.exp) return true;\n\n const expirationDate = new Date(decoded.exp * 1000);\n return expirationDate <= new Date();\n }\n\n /**\n * Check if user is authenticated (has valid, non-expired token)\n */\n isAuthenticated(): boolean {\n return this.hasToken() && !this.isTokenExpired();\n }\n\n /**\n * Get token expiration date\n */\n getTokenExpirationDate(token?: string): Date | null {\n const decoded = this.decodeToken(token);\n if (!decoded || !decoded.exp) return null;\n return new Date(decoded.exp * 1000);\n }\n\n /**\n * Get user data from token\n */\n getUserFromToken(token?: string): any {\n return this.decodeToken(token);\n }\n}\n","/**\n * StorageManager - Type-safe wrapper for browser storage\n * Framework-agnostic implementation using browser storage APIs\n * Provides JSON serialization/deserialization and error handling\n * \n * @example\n * ```typescript\n * const storage = new StorageManager();\n * \n * // Store data\n * storage.setLocal('user-prefs', { theme: 'dark', lang: 'en' });\n * \n * // Retrieve data\n * const prefs = storage.getLocal('user-prefs');\n * \n * // With expiration\n * storage.setWithExpiration('temp-data', someData, 3600000); // 1 hour\n * ```\n */\nexport class StorageManager {\n /**\n * Set item in localStorage with JSON serialization\n */\n setLocal<T>(key: string, value: T): boolean {\n try {\n const serialized = JSON.stringify(value);\n localStorage.setItem(key, serialized);\n return true;\n } catch (error) {\n console.error('Error setting localStorage item:', error);\n return false;\n }\n }\n\n /**\n * Get item from localStorage with JSON deserialization\n */\n getLocal<T>(key: string, defaultValue?: T): T | null {\n try {\n const item = localStorage.getItem(key);\n if (item === null) {\n return defaultValue !== undefined ? defaultValue : null;\n }\n return JSON.parse(item) as T;\n } catch (error) {\n console.error('Error getting localStorage item:', error);\n return defaultValue !== undefined ? defaultValue : null;\n }\n }\n\n /**\n * Remove item from localStorage\n */\n removeLocal(key: string): void {\n try {\n localStorage.removeItem(key);\n } catch (error) {\n console.error('Error removing localStorage item:', error);\n }\n }\n\n /**\n * Clear all localStorage items\n */\n clearLocal(): void {\n try {\n localStorage.clear();\n } catch (error) {\n console.error('Error clearing localStorage:', error);\n }\n }\n\n /**\n * Check if key exists in localStorage\n */\n hasLocal(key: string): boolean {\n try {\n return localStorage.getItem(key) !== null;\n } catch (error) {\n console.error('Error checking localStorage key:', error);\n return false;\n }\n }\n\n /**\n * Get all localStorage keys\n */\n getLocalKeys(): string[] {\n try {\n return Object.keys(localStorage);\n } catch (error) {\n console.error('Error getting localStorage keys:', error);\n return [];\n }\n }\n\n /**\n * Set item in sessionStorage with JSON serialization\n */\n setSession<T>(key: string, value: T): boolean {\n try {\n const serialized = JSON.stringify(value);\n sessionStorage.setItem(key, serialized);\n return true;\n } catch (error) {\n console.error('Error setting sessionStorage item:', error);\n return false;\n }\n }\n\n /**\n * Get item from sessionStorage with JSON deserialization\n */\n getSession<T>(key: string, defaultValue?: T): T | null {\n try {\n const item = sessionStorage.getItem(key);\n if (item === null) {\n return defaultValue !== undefined ? defaultValue : null;\n }\n return JSON.parse(item) as T;\n } catch (error) {\n console.error('Error getting sessionStorage item:', error);\n return defaultValue !== undefined ? defaultValue : null;\n }\n }\n\n /**\n * Remove item from sessionStorage\n */\n removeSession(key: string): void {\n try {\n sessionStorage.removeItem(key);\n } catch (error) {\n console.error('Error removing sessionStorage item:', error);\n }\n }\n\n /**\n * Clear all sessionStorage items\n */\n clearSession(): void {\n try {\n sessionStorage.clear();\n } catch (error) {\n console.error('Error clearing sessionStorage:', error);\n }\n }\n\n /**\n * Check if key exists in sessionStorage\n */\n hasSession(key: string): boolean {\n try {\n return sessionStorage.getItem(key) !== null;\n } catch (error) {\n console.error('Error checking sessionStorage key:', error);\n return false;\n }\n }\n\n /**\n * Get all sessionStorage keys\n */\n getSessionKeys(): string[] {\n try {\n return Object.keys(sessionStorage);\n } catch (error) {\n console.error('Error getting sessionStorage keys:', error);\n return [];\n }\n }\n\n /**\n * Set item with expiration time\n * @param key - Storage key\n * @param value - Value to store\n * @param expirationMs - Expiration time in milliseconds\n * @param useSession - Use sessionStorage instead of localStorage\n */\n setWithExpiration<T>(\n key: string,\n value: T,\n expirationMs: number,\n useSession = false\n ): boolean {\n const item = {\n value,\n expiration: Date.now() + expirationMs\n };\n return useSession\n ? this.setSession(key, item)\n : this.setLocal(key, item);\n }\n\n /**\n * Get item with expiration check\n * Returns null if item is expired\n */\n getWithExpiration<T>(key: string, useSession = false): T | null {\n const item = useSession\n ? this.getSession<{ value: T; expiration: number }>(key)\n : this.getLocal<{ value: T; expiration: number }>(key);\n\n if (!item) return null;\n\n if (Date.now() > item.expiration) {\n // Item expired, remove it\n if (useSession) {\n this.removeSession(key);\n } else {\n this.removeLocal(key);\n }\n return null;\n }\n\n return item.value;\n }\n}\n","/**\n * Log level enum\n */\nexport enum LogLevel {\n DEBUG = 0,\n INFO = 1,\n WARN = 2,\n ERROR = 3,\n NONE = 4\n}\n\n/**\n * Logger configuration\n */\nexport interface LoggerConfig {\n level?: LogLevel;\n enableTimestamp?: boolean;\n enableStackTrace?: boolean;\n prefix?: string;\n}\n\n/**\n * Logger - Centralized logging utility\n * Framework-agnostic implementation using browser console APIs\n * Supports different log levels and can be configured globally\n * \n * @example\n * ```typescript\n * const logger = new Logger();\n * \n * // Configure\n * logger.configure({\n * level: LogLevel.DEBUG,\n * enableTimestamp: true,\n * prefix: 'MyApp'\n * });\n * \n * // Use\n * logger.info('User logged in', { userId: '123' });\n * logger.error('Failed to load data', error);\n * ```\n */\nexport class Logger {\n private config: LoggerConfig = {\n level: LogLevel.INFO,\n enableTimestamp: true,\n enableStackTrace: false,\n prefix: ''\n };\n\n /**\n * Configure the logger\n */\n configure(config: LoggerConfig): void {\n this.config = { ...this.config, ...config };\n }\n\n /**\n * Set log level\n */\n setLevel(level: LogLevel): void {\n this.config.level = level;\n }\n\n /**\n * Get current log level\n */\n getLevel(): LogLevel {\n return this.config.level!;\n }\n\n /**\n * Format log message with timestamp and prefix\n */\n private formatMessage(message: string, level: string): string {\n const parts: string[] = [];\n\n if (this.config.enableTimestamp) {\n parts.push(`[${new Date().toISOString()}]`);\n }\n\n if (this.config.prefix) {\n parts.push(`[${this.config.prefix}]`);\n }\n\n parts.push(`[${level}]`);\n parts.push(message);\n\n return parts.join(' ');\n }\n\n /**\n * Check if log level should be logged\n */\n private shouldLog(level: LogLevel): boolean {\n return level >= this.config.level!;\n }\n\n /**\n * Log debug message\n */\n debug(message: string, ...args: any[]): void {\n if (this.shouldLog(LogLevel.DEBUG)) {\n console.debug(this.formatMessage(message, 'DEBUG'), ...args);\n }\n }\n\n /**\n * Log info message\n */\n info(message: string, ...args: any[]): void {\n if (this.shouldLog(LogLevel.INFO)) {\n console.info(this.formatMessage(message, 'INFO'), ...args);\n }\n }\n\n /**\n * Log warning message\n */\n warn(message: string, ...args: any[]): void {\n if (this.shouldLog(LogLevel.WARN)) {\n console.warn(this.formatMessage(message, 'WARN'), ...args);\n }\n }\n\n /**\n * Log error message\n */\n error(message: string, error?: any, ...args: any[]): void {\n if (this.shouldLog(LogLevel.ERROR)) {\n console.error(this.formatMessage(message, 'ERROR'), ...args);\n \n if (error) {\n console.error(error);\n \n if (this.config.enableStackTrace && error?.stack) {\n console.error('Stack trace:', error.stack);\n }\n }\n }\n }\n\n /**\n * Log a group of messages\n */\n group(label: string, callback: () => void): void {\n if (this.shouldLog(LogLevel.INFO)) {\n console.group(this.formatMessage(label, 'GROUP'));\n callback();\n console.groupEnd();\n }\n }\n\n /**\n * Log a collapsed group of messages\n */\n groupCollapsed(label: string, callback: () => void): void {\n if (this.shouldLog(LogLevel.INFO)) {\n console.groupCollapsed(this.formatMessage(label, 'GROUP'));\n callback();\n console.groupEnd();\n }\n }\n\n /**\n * Log a table (useful for arrays of objects)\n */\n table(data: any, columns?: string[]): void {\n if (this.shouldLog(LogLevel.INFO)) {\n console.table(data, columns);\n }\n }\n\n /**\n * Log execution time of a function\n */\n async time<T>(label: string, fn: () => Promise<T> | T): Promise<T> {\n const start = performance.now();\n try {\n const result = await fn();\n const end = performance.now();\n const duration = (end - start).toFixed(2);\n this.info(`${label} completed in ${duration}ms`);\n return result;\n } catch (error) {\n const end = performance.now();\n const duration = (end - start).toFixed(2);\n this.error(`${label} failed after ${duration}ms`, error);\n throw error;\n }\n }\n}\n"],"names":["Subject","filter","map","LogLevel"],"mappings":";;;;;AAYA;;;;;;;;;;;;;;;;;AAiBG;MACU,QAAQ,CAAA;AACX,IAAA,YAAY,GAAG,IAAIA,YAAO,EAAgB;AAElD;;;;AAIG;IACH,IAAI,CAAU,SAAiB,EAAE,IAAQ,EAAA;AACvC,QAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC;AACrB,YAAA,IAAI,EAAE,SAAS;YACf,IAAI;AACJ,YAAA,SAAS,EAAE,IAAI,CAAC,GAAG;AACpB,SAAA,CAAC;IACJ;AAEA;;;;AAIG;AACH,IAAA,EAAE,CAAU,SAAiB,EAAA;AAC3B,QAAA,OAAO,IAAI,CAAC,YAAY,CAAC,YAAY,EAAE,CAAC,IAAI,CAC1CC,gBAAM,CAAC,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS,CAAC,EACzCC,aAAG,CAAC,KAAK,IAAI,KAAK,CAAC,IAAS,CAAC,CAC9B;IACH;AAEA;;;;AAIG;AACH,IAAA,UAAU,CAAC,UAAoB,EAAA;QAC7B,OAAO,IAAI,CAAC,YAAY,CAAC,YAAY,EAAE,CAAC,IAAI,CAC1CD,gBAAM,CAAC,KAAK,IAAI,UAAU,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CACjD;IACH;AAEA;;;AAGG;IACH,KAAK,GAAA;AACH,QAAA,OAAO,IAAI,CAAC,YAAY,CAAC,YAAY,EAAE;IACzC;AACD;;ACnED;;;;;;;;;;;;;;;;;AAiBG;MACU,YAAY,CAAA;IACf,SAAS,GAAG,YAAY;IACxB,iBAAiB,GAAG,eAAe;IACnC,iBAAiB,GAAG,KAAK;AAEjC;;AAEG;AACH,IAAA,SAAS,CAAC,MAAmB,EAAA;AAC3B,QAAA,IAAI,MAAM,CAAC,QAAQ,EAAE;AACnB,YAAA,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,QAAQ;QAClC;AACA,QAAA,IAAI,MAAM,CAAC,eAAe,EAAE;AAC1B,YAAA,IAAI,CAAC,iBAAiB,GAAG,MAAM,CAAC,eAAe;QACjD;AACA,QAAA,IAAI,MAAM,CAAC,iBAAiB,KAAK,SAAS,EAAE;AAC1C,YAAA,IAAI,CAAC,iBAAiB,GAAG,MAAM,CAAC,iBAAiB;QACnD;IACF;AAEA;;AAEG;IACK,UAAU,GAAA;QAChB,OAAO,IAAI,CAAC,iBAAiB,GAAG,cAAc,GAAG,YAAY;IAC/D;AAEA;;AAEG;AACH,IAAA,QAAQ,CAAC,KAAa,EAAA;AACpB,QAAA,IAAI,CAAC,UAAU,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,CAAC;IAClD;AAEA;;AAEG;IACH,QAAQ,GAAA;QACN,OAAO,IAAI,CAAC,UAAU,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC;IAClD;AAEA;;AAEG;IACH,WAAW,GAAA;QACT,IAAI,CAAC,UAAU,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC;IAC9C;AAEA;;AAEG;AACH,IAAA,eAAe,CAAC,KAAa,EAAA;AAC3B,QAAA,IAAI,CAAC,UAAU,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,iBAAiB,EAAE,KAAK,CAAC;IAC1D;AAEA;;AAEG;IACH,eAAe,GAAA;QACb,OAAO,IAAI,CAAC,UAAU,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,iBAAiB,CAAC;IAC1D;AAEA;;AAEG;IACH,kBAAkB,GAAA;QAChB,IAAI,CAAC,UAAU,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,iBAAiB,CAAC;IACtD;AAEA;;AAEG;IACH,WAAW,GAAA;QACT,IAAI,CAAC,WAAW,EAAE;QAClB,IAAI,CAAC,kBAAkB,EAAE;IAC3B;AAEA;;AAEG;IACH,QAAQ,GAAA;AACN,QAAA,OAAO,CAAC,CAAC,IAAI,CAAC,QAAQ,EAAE;IAC1B;AAEA;;;;AAIG;AACH,IAAA,WAAW,CAAC,KAAc,EAAA;QACxB,MAAM,aAAa,GAAG,KAAK,IAAI,IAAI,CAAC,QAAQ,EAAE;AAC9C,QAAA,IAAI,CAAC,aAAa;AAAE,YAAA,OAAO,IAAI;AAE/B,QAAA,IAAI;YACF,MAAM,KAAK,GAAG,aAAa,CAAC,KAAK,CAAC,GAAG,CAAC;AACtC,YAAA,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;AAAE,gBAAA,OAAO,IAAI;AAEnC,YAAA,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC;YACxB,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC;AAC/E,YAAA,OAAO,OAAO;QAChB;QAAE,OAAO,KAAK,EAAE;AACd,YAAA,OAAO,CAAC,KAAK,CAAC,uBAAuB,EAAE,KAAK,CAAC;AAC7C,YAAA,OAAO,IAAI;QACb;IACF;AAEA;;;;AAIG;AACH,IAAA,cAAc,CAAC,KAAc,EAAA;QAC3B,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC;AACvC,QAAA,IAAI,CAAC,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG;AAAE,YAAA,OAAO,IAAI;QAEzC,MAAM,cAAc,GAAG,IAAI,IAAI,CAAC,OAAO,CAAC,GAAG,GAAG,IAAI,CAAC;AACnD,QAAA,OAAO,cAAc,IAAI,IAAI,IAAI,EAAE;IACrC;AAEA;;AAEG;IACH,eAAe,GAAA;QACb,OAAO,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE;IAClD;AAEA;;AAEG;AACH,IAAA,sBAAsB,CAAC,KAAc,EAAA;QACnC,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC;AACvC,QAAA,IAAI,CAAC,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG;AAAE,YAAA,OAAO,IAAI;QACzC,OAAO,IAAI,IAAI,CAAC,OAAO,CAAC,GAAG,GAAG,IAAI,CAAC;IACrC;AAEA;;AAEG;AACH,IAAA,gBAAgB,CAAC,KAAc,EAAA;AAC7B,QAAA,OAAO,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC;IAChC;AACD;;ACxKD;;;;;;;;;;;;;;;;;;AAkBG;MACU,cAAc,CAAA;AACzB;;AAEG;IACH,QAAQ,CAAI,GAAW,EAAE,KAAQ,EAAA;AAC/B,QAAA,IAAI;YACF,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC;AACxC,YAAA,YAAY,CAAC,OAAO,CAAC,GAAG,EAAE,UAAU,CAAC;AACrC,YAAA,OAAO,IAAI;QACb;QAAE,OAAO,KAAK,EAAE;AACd,YAAA,OAAO,CAAC,KAAK,CAAC,kCAAkC,EAAE,KAAK,CAAC;AACxD,YAAA,OAAO,KAAK;QACd;IACF;AAEA;;AAEG;IACH,QAAQ,CAAI,GAAW,EAAE,YAAgB,EAAA;AACvC,QAAA,IAAI;YACF,MAAM,IAAI,GAAG,YAAY,CAAC,OAAO,CAAC,GAAG,CAAC;AACtC,YAAA,IAAI,IAAI,KAAK,IAAI,EAAE;gBACjB,OAAO,YAAY,KAAK,SAAS,GAAG,YAAY,GAAG,IAAI;YACzD;AACA,YAAA,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAM;QAC9B;QAAE,OAAO,KAAK,EAAE;AACd,YAAA,OAAO,CAAC,KAAK,CAAC,kCAAkC,EAAE,KAAK,CAAC;YACxD,OAAO,YAAY,KAAK,SAAS,GAAG,YAAY,GAAG,IAAI;QACzD;IACF;AAEA;;AAEG;AACH,IAAA,WAAW,CAAC,GAAW,EAAA;AACrB,QAAA,IAAI;AACF,YAAA,YAAY,CAAC,UAAU,CAAC,GAAG,CAAC;QAC9B;QAAE,OAAO,KAAK,EAAE;AACd,YAAA,OAAO,CAAC,KAAK,CAAC,mCAAmC,EAAE,KAAK,CAAC;QAC3D;IACF;AAEA;;AAEG;IACH,UAAU,GAAA;AACR,QAAA,IAAI;YACF,YAAY,CAAC,KAAK,EAAE;QACtB;QAAE,OAAO,KAAK,EAAE;AACd,YAAA,OAAO,CAAC,KAAK,CAAC,8BAA8B,EAAE,KAAK,CAAC;QACtD;IACF;AAEA;;AAEG;AACH,IAAA,QAAQ,CAAC,GAAW,EAAA;AAClB,QAAA,IAAI;YACF,OAAO,YAAY,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,IAAI;QAC3C;QAAE,OAAO,KAAK,EAAE;AACd,YAAA,OAAO,CAAC,KAAK,CAAC,kCAAkC,EAAE,KAAK,CAAC;AACxD,YAAA,OAAO,KAAK;QACd;IACF;AAEA;;AAEG;IACH,YAAY,GAAA;AACV,QAAA,IAAI;AACF,YAAA,OAAO,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC;QAClC;QAAE,OAAO,KAAK,EAAE;AACd,YAAA,OAAO,CAAC,KAAK,CAAC,kCAAkC,EAAE,KAAK,CAAC;AACxD,YAAA,OAAO,EAAE;QACX;IACF;AAEA;;AAEG;IACH,UAAU,CAAI,GAAW,EAAE,KAAQ,EAAA;AACjC,QAAA,IAAI;YACF,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC;AACxC,YAAA,cAAc,CAAC,OAAO,CAAC,GAAG,EAAE,UAAU,CAAC;AACvC,YAAA,OAAO,IAAI;QACb;QAAE,OAAO,KAAK,EAAE;AACd,YAAA,OAAO,CAAC,KAAK,CAAC,oCAAoC,EAAE,KAAK,CAAC;AAC1D,YAAA,OAAO,KAAK;QACd;IACF;AAEA;;AAEG;IACH,UAAU,CAAI,GAAW,EAAE,YAAgB,EAAA;AACzC,QAAA,IAAI;YACF,MAAM,IAAI,GAAG,cAAc,CAAC,OAAO,CAAC,GAAG,CAAC;AACxC,YAAA,IAAI,IAAI,KAAK,IAAI,EAAE;gBACjB,OAAO,YAAY,KAAK,SAAS,GAAG,YAAY,GAAG,IAAI;YACzD;AACA,YAAA,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAM;QAC9B;QAAE,OAAO,KAAK,EAAE;AACd,YAAA,OAAO,CAAC,KAAK,CAAC,oCAAoC,EAAE,KAAK,CAAC;YAC1D,OAAO,YAAY,KAAK,SAAS,GAAG,YAAY,GAAG,IAAI;QACzD;IACF;AAEA;;AAEG;AACH,IAAA,aAAa,CAAC,GAAW,EAAA;AACvB,QAAA,IAAI;AACF,YAAA,cAAc,CAAC,UAAU,CAAC,GAAG,CAAC;QAChC;QAAE,OAAO,KAAK,EAAE;AACd,YAAA,OAAO,CAAC,KAAK,CAAC,qCAAqC,EAAE,KAAK,CAAC;QAC7D;IACF;AAEA;;AAEG;IACH,YAAY,GAAA;AACV,QAAA,IAAI;YACF,cAAc,CAAC,KAAK,EAAE;QACxB;QAAE,OAAO,KAAK,EAAE;AACd,YAAA,OAAO,CAAC,KAAK,CAAC,gCAAgC,EAAE,KAAK,CAAC;QACxD;IACF;AAEA;;AAEG;AACH,IAAA,UAAU,CAAC,GAAW,EAAA;AACpB,QAAA,IAAI;YACF,OAAO,cAAc,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,IAAI;QAC7C;QAAE,OAAO,KAAK,EAAE;AACd,YAAA,OAAO,CAAC,KAAK,CAAC,oCAAoC,EAAE,KAAK,CAAC;AAC1D,YAAA,OAAO,KAAK;QACd;IACF;AAEA;;AAEG;IACH,cAAc,GAAA;AACZ,QAAA,IAAI;AACF,YAAA,OAAO,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC;QACpC;QAAE,OAAO,KAAK,EAAE;AACd,YAAA,OAAO,CAAC,KAAK,CAAC,oCAAoC,EAAE,KAAK,CAAC;AAC1D,YAAA,OAAO,EAAE;QACX;IACF;AAEA;;;;;;AAMG;IACH,iBAAiB,CACf,GAAW,EACX,KAAQ,EACR,YAAoB,EACpB,UAAU,GAAG,KAAK,EAAA;AAElB,QAAA,MAAM,IAAI,GAAG;YACX,KAAK;AACL,YAAA,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG;SAC1B;AACD,QAAA,OAAO;cACH,IAAI,CAAC,UAAU,CAAC,GAAG,EAAE,IAAI;cACzB,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,IAAI,CAAC;IAC9B;AAEA;;;AAGG;AACH,IAAA,iBAAiB,CAAI,GAAW,EAAE,UAAU,GAAG,KAAK,EAAA;QAClD,MAAM,IAAI,GAAG;AACX,cAAE,IAAI,CAAC,UAAU,CAAmC,GAAG;AACvD,cAAE,IAAI,CAAC,QAAQ,CAAmC,GAAG,CAAC;AAExD,QAAA,IAAI,CAAC,IAAI;AAAE,YAAA,OAAO,IAAI;QAEtB,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,UAAU,EAAE;;YAEhC,IAAI,UAAU,EAAE;AACd,gBAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC;YACzB;iBAAO;AACL,gBAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC;YACvB;AACA,YAAA,OAAO,IAAI;QACb;QAEA,OAAO,IAAI,CAAC,KAAK;IACnB;AACD;;ACzND;;AAEG;AACSE;AAAZ,CAAA,UAAY,QAAQ,EAAA;AAClB,IAAA,QAAA,CAAA,QAAA,CAAA,OAAA,CAAA,GAAA,CAAA,CAAA,GAAA,OAAS;AACT,IAAA,QAAA,CAAA,QAAA,CAAA,MAAA,CAAA,GAAA,CAAA,CAAA,GAAA,MAAQ;AACR,IAAA,QAAA,CAAA,QAAA,CAAA,MAAA,CAAA,GAAA,CAAA,CAAA,GAAA,MAAQ;AACR,IAAA,QAAA,CAAA,QAAA,CAAA,OAAA,CAAA,GAAA,CAAA,CAAA,GAAA,OAAS;AACT,IAAA,QAAA,CAAA,QAAA,CAAA,MAAA,CAAA,GAAA,CAAA,CAAA,GAAA,MAAQ;AACV,CAAC,EANWA,gBAAQ,KAARA,gBAAQ,GAAA,EAAA,CAAA,CAAA;AAkBpB;;;;;;;;;;;;;;;;;;;;AAoBG;MACU,MAAM,CAAA;AACT,IAAA,MAAM,GAAiB;QAC7B,KAAK,EAAEA,gBAAQ,CAAC,IAAI;AACpB,QAAA,eAAe,EAAE,IAAI;AACrB,QAAA,gBAAgB,EAAE,KAAK;AACvB,QAAA,MAAM,EAAE;KACT;AAED;;AAEG;AACH,IAAA,SAAS,CAAC,MAAoB,EAAA;AAC5B,QAAA,IAAI,CAAC,MAAM,GAAG,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE,GAAG,MAAM,EAAE;IAC7C;AAEA;;AAEG;AACH,IAAA,QAAQ,CAAC,KAAe,EAAA;AACtB,QAAA,IAAI,CAAC,MAAM,CAAC,KAAK,GAAG,KAAK;IAC3B;AAEA;;AAEG;IACH,QAAQ,GAAA;AACN,QAAA,OAAO,IAAI,CAAC,MAAM,CAAC,KAAM;IAC3B;AAEA;;AAEG;IACK,aAAa,CAAC,OAAe,EAAE,KAAa,EAAA;QAClD,MAAM,KAAK,GAAa,EAAE;AAE1B,QAAA,IAAI,IAAI,CAAC,MAAM,CAAC,eAAe,EAAE;AAC/B,YAAA,KAAK,CAAC,IAAI,CAAC,CAAA,CAAA,EAAI,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAA,CAAA,CAAG,CAAC;QAC7C;AAEA,QAAA,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE;YACtB,KAAK,CAAC,IAAI,CAAC,CAAA,CAAA,EAAI,IAAI,CAAC,MAAM,CAAC,MAAM,CAAA,CAAA,CAAG,CAAC;QACvC;AAEA,QAAA,KAAK,CAAC,IAAI,CAAC,IAAI,KAAK,CAAA,CAAA,CAAG,CAAC;AACxB,QAAA,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC;AAEnB,QAAA,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC;IACxB;AAEA;;AAEG;AACK,IAAA,SAAS,CAAC,KAAe,EAAA;AAC/B,QAAA,OAAO,KAAK,IAAI,IAAI,CAAC,MAAM,CAAC,KAAM;IACpC;AAEA;;AAEG;AACH,IAAA,KAAK,CAAC,OAAe,EAAE,GAAG,IAAW,EAAA;QACnC,IAAI,IAAI,CAAC,SAAS,CAACA,gBAAQ,CAAC,KAAK,CAAC,EAAE;AAClC,YAAA,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE,OAAO,CAAC,EAAE,GAAG,IAAI,CAAC;QAC9D;IACF;AAEA;;AAEG;AACH,IAAA,IAAI,CAAC,OAAe,EAAE,GAAG,IAAW,EAAA;QAClC,IAAI,IAAI,CAAC,SAAS,CAACA,gBAAQ,CAAC,IAAI,CAAC,EAAE;AACjC,YAAA,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE,MAAM,CAAC,EAAE,GAAG,IAAI,CAAC;QAC5D;IACF;AAEA;;AAEG;AACH,IAAA,IAAI,CAAC,OAAe,EAAE,GAAG,IAAW,EAAA;QAClC,IAAI,IAAI,CAAC,SAAS,CAACA,gBAAQ,CAAC,IAAI,CAAC,EAAE;AACjC,YAAA,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE,MAAM,CAAC,EAAE,GAAG,IAAI,CAAC;QAC5D;IACF;AAEA;;AAEG;AACH,IAAA,KAAK,CAAC,OAAe,EAAE,KAAW,EAAE,GAAG,IAAW,EAAA;QAChD,IAAI,IAAI,CAAC,SAAS,CAACA,gBAAQ,CAAC,KAAK,CAAC,EAAE;AAClC,YAAA,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE,OAAO,CAAC,EAAE,GAAG,IAAI,CAAC;YAE5D,IAAI,KAAK,EAAE;AACT,gBAAA,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC;gBAEpB,IAAI,IAAI,CAAC,MAAM,CAAC,gBAAgB,IAAI,KAAK,EAAE,KAAK,EAAE;oBAChD,OAAO,CAAC,KAAK,CAAC,cAAc,EAAE,KAAK,CAAC,KAAK,CAAC;gBAC5C;YACF;QACF;IACF;AAEA;;AAEG;IACH,KAAK,CAAC,KAAa,EAAE,QAAoB,EAAA;QACvC,IAAI,IAAI,CAAC,SAAS,CAACA,gBAAQ,CAAC,IAAI,CAAC,EAAE;AACjC,YAAA,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;AACjD,YAAA,QAAQ,EAAE;YACV,OAAO,CAAC,QAAQ,EAAE;QACpB;IACF;AAEA;;AAEG;IACH,cAAc,CAAC,KAAa,EAAE,QAAoB,EAAA;QAChD,IAAI,IAAI,CAAC,SAAS,CAACA,gBAAQ,CAAC,IAAI,CAAC,EAAE;AACjC,YAAA,OAAO,CAAC,cAAc,CAAC,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;AAC1D,YAAA,QAAQ,EAAE;YACV,OAAO,CAAC,QAAQ,EAAE;QACpB;IACF;AAEA;;AAEG;IACH,KAAK,CAAC,IAAS,EAAE,OAAkB,EAAA;QACjC,IAAI,IAAI,CAAC,SAAS,CAACA,gBAAQ,CAAC,IAAI,CAAC,EAAE;AACjC,YAAA,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE,OAAO,CAAC;QAC9B;IACF;AAEA;;AAEG;AACH,IAAA,MAAM,IAAI,CAAI,KAAa,EAAE,EAAwB,EAAA;AACnD,QAAA,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE;AAC/B,QAAA,IAAI;AACF,YAAA,MAAM,MAAM,GAAG,MAAM,EAAE,EAAE;AACzB,YAAA,MAAM,GAAG,GAAG,WAAW,CAAC,GAAG,EAAE;AAC7B,YAAA,MAAM,QAAQ,GAAG,CAAC,GAAG,GAAG,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC;YACzC,IAAI,CAAC,IAAI,CAAC,CAAA,EAAG,KAAK,CAAA,cAAA,EAAiB,QAAQ,CAAA,EAAA,CAAI,CAAC;AAChD,YAAA,OAAO,MAAM;QACf;QAAE,OAAO,KAAK,EAAE;AACd,YAAA,MAAM,GAAG,GAAG,WAAW,CAAC,GAAG,EAAE;AAC7B,YAAA,MAAM,QAAQ,GAAG,CAAC,GAAG,GAAG,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC;YACzC,IAAI,CAAC,KAAK,CAAC,CAAA,EAAG,KAAK,CAAA,cAAA,EAAiB,QAAQ,CAAA,EAAA,CAAI,EAAE,KAAK,CAAC;AACxD,YAAA,MAAM,KAAK;QACb;IACF;AACD;;;;;;;"}
|