@agelum/backend 0.1.2 → 0.1.4
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/README.md +127 -8
- package/dist/client/hooks.d.ts +1 -1
- package/dist/client/hooks.d.ts.map +1 -1
- package/dist/client/hooks.js +343 -0
- package/dist/client/hooks.js.map +1 -0
- package/dist/client/index.d.ts +6 -6
- package/dist/client/index.d.ts.map +1 -1
- package/dist/client/index.js +15 -0
- package/dist/client/index.js.map +1 -0
- package/dist/client/manager.d.ts +4 -4
- package/dist/client/manager.d.ts.map +1 -1
- package/dist/client/manager.js +287 -0
- package/dist/client/manager.js.map +1 -0
- package/dist/client/provider.d.ts +1 -1
- package/dist/client/provider.d.ts.map +1 -1
- package/dist/client/provider.js +84 -0
- package/dist/client/provider.js.map +1 -0
- package/dist/client/revalidation.d.ts +2 -2
- package/dist/client/revalidation.d.ts.map +1 -1
- package/dist/client/revalidation.js +308 -0
- package/dist/client/revalidation.js.map +1 -0
- package/dist/client/session.d.ts +84 -0
- package/dist/client/session.d.ts.map +1 -0
- package/dist/client/session.js +180 -0
- package/dist/client/session.js.map +1 -0
- package/dist/client/sse-client.d.ts +1 -1
- package/dist/client/sse-client.d.ts.map +1 -1
- package/dist/client/sse-client.js +217 -0
- package/dist/client/sse-client.js.map +1 -0
- package/dist/client/storage.d.ts +1 -1
- package/dist/client/storage.d.ts.map +1 -1
- package/dist/client/storage.js +489 -0
- package/dist/client/storage.js.map +1 -0
- package/dist/client/trpc.js +29 -0
- package/dist/client/trpc.js.map +1 -0
- package/dist/client/types.d.ts +10 -0
- package/dist/client/types.d.ts.map +1 -0
- package/dist/client/types.js +2 -0
- package/dist/client/types.js.map +1 -0
- package/dist/client.d.ts +6 -6
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +14 -0
- package/dist/client.js.map +1 -0
- package/dist/config/schema.d.ts +81 -18
- package/dist/config/schema.d.ts.map +1 -1
- package/dist/config/schema.js +42 -38
- package/dist/config/schema.js.map +1 -1
- package/dist/core/analyzer.d.ts +1 -1
- package/dist/core/analyzer.d.ts.map +1 -1
- package/dist/core/analyzer.js +212 -0
- package/dist/core/analyzer.js.map +1 -0
- package/dist/core/driver.d.ts +1 -1
- package/dist/core/driver.d.ts.map +1 -1
- package/dist/core/driver.js +138 -47
- package/dist/core/driver.js.map +1 -1
- package/dist/core/function.d.ts +14 -3
- package/dist/core/function.d.ts.map +1 -1
- package/dist/core/function.js +76 -35
- package/dist/core/function.js.map +1 -1
- package/dist/core/sse.d.ts +1 -1
- package/dist/core/sse.d.ts.map +1 -1
- package/dist/core/sse.js +323 -0
- package/dist/core/sse.js.map +1 -0
- package/dist/core/types.d.ts +48 -8
- package/dist/core/types.d.ts.map +1 -1
- package/dist/core/types.js +1 -2
- package/dist/index.d.ts +12 -12
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +9 -25
- package/dist/index.js.map +1 -1
- package/dist/providers/localStorage.d.ts +1 -1
- package/dist/providers/localStorage.d.ts.map +1 -1
- package/dist/providers/localStorage.js +66 -0
- package/dist/providers/localStorage.js.map +1 -0
- package/dist/providers/memory.d.ts +1 -1
- package/dist/providers/memory.d.ts.map +1 -1
- package/dist/providers/memory.js +36 -0
- package/dist/providers/memory.js.map +1 -0
- package/dist/providers/redis.d.ts +9 -3
- package/dist/providers/redis.d.ts.map +1 -1
- package/dist/providers/redis.js +74 -0
- package/dist/providers/redis.js.map +1 -0
- package/dist/server.d.ts +11 -11
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +8 -23
- package/dist/server.js.map +1 -1
- package/dist/trpc/hooks.d.ts +82 -0
- package/dist/trpc/hooks.d.ts.map +1 -0
- package/dist/trpc/hooks.js +276 -0
- package/dist/trpc/hooks.js.map +1 -0
- package/dist/trpc/index.d.ts +4 -4
- package/dist/trpc/index.d.ts.map +1 -1
- package/dist/trpc/index.js +2 -12
- package/dist/trpc/index.js.map +1 -1
- package/dist/trpc/router.d.ts +3 -3
- package/dist/trpc/router.d.ts.map +1 -1
- package/dist/trpc/router.js +6 -12
- package/dist/trpc/router.js.map +1 -1
- package/dist/trpc/types.d.ts +2 -2
- package/dist/trpc/types.d.ts.map +1 -1
- package/dist/trpc/types.js +1 -2
- package/dist/trpc/types.js.map +1 -1
- package/package.json +13 -1
- package/dist/examples/teamhub-integration.d.ts +0 -56
- package/dist/examples/teamhub-integration.d.ts.map +0 -1
- package/dist/examples/teamhub-integration.js +0 -192
- package/dist/examples/teamhub-integration.js.map +0 -1
package/README.md
CHANGED
|
@@ -27,7 +27,7 @@ pnpm add @agelum/backend drizzle-orm @trpc/server @trpc/client zod
|
|
|
27
27
|
|
|
28
28
|
### 1. Define Reactive Functions
|
|
29
29
|
|
|
30
|
-
**Key Concept**: Reactive functions work both standalone (server-side) AND via tRPC. The `name` property is crucial for cache keys and tRPC procedures.
|
|
30
|
+
**Key Concept**: Reactive functions work both standalone (server-side) AND via tRPC. The `name` property is crucial for cache keys and tRPC procedures. Handlers receive `{ input, db }` and you can use `db.db` to access the underlying Drizzle instance inside handlers.
|
|
31
31
|
|
|
32
32
|
```typescript
|
|
33
33
|
// server/functions/users.ts
|
|
@@ -49,8 +49,8 @@ export const getUsers =
|
|
|
49
49
|
|
|
50
50
|
dependencies: ["user"], // What tables this function reads from
|
|
51
51
|
|
|
52
|
-
handler: async (input, db) => {
|
|
53
|
-
// Clean signature: (input, db)
|
|
52
|
+
handler: async ({ input, db }) => {
|
|
53
|
+
// Clean signature: ({ input, db })
|
|
54
54
|
return db.db.query.users.findMany(
|
|
55
55
|
{
|
|
56
56
|
where: (users, { eq }) =>
|
|
@@ -76,7 +76,7 @@ export const createUser =
|
|
|
76
76
|
|
|
77
77
|
dependencies: ["user"],
|
|
78
78
|
|
|
79
|
-
handler: async (input, db) => {
|
|
79
|
+
handler: async ({ input, db }) => {
|
|
80
80
|
return db.db
|
|
81
81
|
.insert(users)
|
|
82
82
|
.values(input)
|
|
@@ -98,7 +98,7 @@ export const getUserProfile =
|
|
|
98
98
|
"preferences",
|
|
99
99
|
],
|
|
100
100
|
|
|
101
|
-
handler: async (input, db) => {
|
|
101
|
+
handler: async ({ input, db }) => {
|
|
102
102
|
const user =
|
|
103
103
|
await db.db.query.users.findFirst(
|
|
104
104
|
{
|
|
@@ -118,6 +118,78 @@ export const getUserProfile =
|
|
|
118
118
|
});
|
|
119
119
|
```
|
|
120
120
|
|
|
121
|
+
**Optional Cache Settings (per function)**:
|
|
122
|
+
|
|
123
|
+
```typescript
|
|
124
|
+
export const getUsers =
|
|
125
|
+
defineReactiveFunction({
|
|
126
|
+
name: "users.getAll",
|
|
127
|
+
input: z.object({
|
|
128
|
+
companyId: z.string(),
|
|
129
|
+
}),
|
|
130
|
+
dependencies: ["user"],
|
|
131
|
+
cacheEnabled: true,
|
|
132
|
+
cache: {
|
|
133
|
+
ttl: 300,
|
|
134
|
+
key: (input) =>
|
|
135
|
+
`users.getAll:${JSON.stringify(input)}`,
|
|
136
|
+
},
|
|
137
|
+
handler: async ({ input, db }) => {
|
|
138
|
+
return db.db.query.users.findMany(
|
|
139
|
+
{
|
|
140
|
+
where: (users, { eq }) =>
|
|
141
|
+
eq(
|
|
142
|
+
users.companyId,
|
|
143
|
+
input.companyId,
|
|
144
|
+
),
|
|
145
|
+
},
|
|
146
|
+
);
|
|
147
|
+
},
|
|
148
|
+
});
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
Cache is opt-in per function via `cacheEnabled: true` or `cache.enabled: true`.
|
|
152
|
+
|
|
153
|
+
#### Typing Notes
|
|
154
|
+
|
|
155
|
+
If you want explicit handler typing, use `ReactiveFunctionContext<TInput>` with a Zod-inferred input type:
|
|
156
|
+
|
|
157
|
+
```typescript
|
|
158
|
+
import type { ReactiveFunctionContext } from "@agelum/backend/server";
|
|
159
|
+
import { z } from "zod";
|
|
160
|
+
|
|
161
|
+
const getUsersInput = z.object({
|
|
162
|
+
companyId: z.string(),
|
|
163
|
+
limit: z.number().optional(),
|
|
164
|
+
});
|
|
165
|
+
|
|
166
|
+
type GetUsersInput = z.infer<
|
|
167
|
+
typeof getUsersInput
|
|
168
|
+
>;
|
|
169
|
+
|
|
170
|
+
export const getUsers =
|
|
171
|
+
defineReactiveFunction({
|
|
172
|
+
name: "users.getAll",
|
|
173
|
+
input: getUsersInput,
|
|
174
|
+
dependencies: ["user"],
|
|
175
|
+
handler: async ({
|
|
176
|
+
input,
|
|
177
|
+
db,
|
|
178
|
+
}: ReactiveFunctionContext<GetUsersInput>) => {
|
|
179
|
+
return db.db.query.users.findMany(
|
|
180
|
+
{
|
|
181
|
+
where: (users, { eq }) =>
|
|
182
|
+
eq(
|
|
183
|
+
users.companyId,
|
|
184
|
+
input.companyId,
|
|
185
|
+
),
|
|
186
|
+
limit: input.limit ?? 50,
|
|
187
|
+
},
|
|
188
|
+
);
|
|
189
|
+
},
|
|
190
|
+
});
|
|
191
|
+
```
|
|
192
|
+
|
|
121
193
|
### 2. Server-Side Execution (Without tRPC)
|
|
122
194
|
|
|
123
195
|
**Use Case**: Background jobs, API routes, server actions, webhooks, etc.
|
|
@@ -323,7 +395,34 @@ export const db = createReactiveDb(
|
|
|
323
395
|
);
|
|
324
396
|
```
|
|
325
397
|
|
|
326
|
-
### 2.
|
|
398
|
+
### 2. Server Cache (Redis or Memory)
|
|
399
|
+
|
|
400
|
+
```typescript
|
|
401
|
+
const config = {
|
|
402
|
+
relations: {
|
|
403
|
+
user: ["profile", "preferences"],
|
|
404
|
+
profile: ["user"],
|
|
405
|
+
preferences: ["user"],
|
|
406
|
+
},
|
|
407
|
+
cache: {
|
|
408
|
+
server: {
|
|
409
|
+
provider: "redis",
|
|
410
|
+
redis: {
|
|
411
|
+
url: process.env.REDIS_URL,
|
|
412
|
+
},
|
|
413
|
+
},
|
|
414
|
+
},
|
|
415
|
+
};
|
|
416
|
+
|
|
417
|
+
export const db = createReactiveDb(
|
|
418
|
+
drizzle(pool),
|
|
419
|
+
config,
|
|
420
|
+
);
|
|
421
|
+
```
|
|
422
|
+
|
|
423
|
+
You can also pass an existing Redis client via `cache.server.redis.client`.
|
|
424
|
+
|
|
425
|
+
### 3. SSE Endpoint (Next.js)
|
|
327
426
|
|
|
328
427
|
```typescript
|
|
329
428
|
// app/api/events/route.ts
|
|
@@ -359,7 +458,7 @@ export async function POST(
|
|
|
359
458
|
}
|
|
360
459
|
```
|
|
361
460
|
|
|
362
|
-
###
|
|
461
|
+
### 4. Client Setup
|
|
363
462
|
|
|
364
463
|
```typescript
|
|
365
464
|
// client/providers/ReactiveProvider.tsx
|
|
@@ -403,6 +502,26 @@ If you use `ReactiveProvider` directly, make sure to pass a `revalidateFn` for p
|
|
|
403
502
|
- Errors during revalidation do not overwrite existing cache (no-write-on-error), keeping previously known-good data.
|
|
404
503
|
- Real-time invalidation uses SSE with client acknowledgments and retry; no heartbeats are sent.
|
|
405
504
|
|
|
505
|
+
## Cache Keys
|
|
506
|
+
|
|
507
|
+
Client cache keys are automatically composed as `name::JSON(input)`:
|
|
508
|
+
|
|
509
|
+
- `users.getAll::{"companyId":"123","limit":50}`
|
|
510
|
+
- `users.profile.getDetailed::{"userId":"456"}`
|
|
511
|
+
|
|
512
|
+
Server cache keys for reactive functions default to `name:JSON(input)` and can be customized with `cache.key`.
|
|
513
|
+
|
|
514
|
+
Access cache key programmatically:
|
|
515
|
+
|
|
516
|
+
```typescript
|
|
517
|
+
const cacheKey = getUsers.getCacheKey({
|
|
518
|
+
companyId: "test",
|
|
519
|
+
limit: 50,
|
|
520
|
+
});
|
|
521
|
+
```
|
|
522
|
+
|
|
523
|
+
Example value: `users.getAll:{"companyId":"test","limit":50}`
|
|
524
|
+
|
|
406
525
|
### 4.2 Multi-tenant Tips (Optional)
|
|
407
526
|
|
|
408
527
|
- Resolve tenant databases via a main database lookup (e.g., `organization.databaseName`), not by using IDs directly as database names.
|
|
@@ -455,7 +574,7 @@ function MyComponent() {
|
|
|
455
574
|
1. **Function Definition**: `defineReactiveFunction` creates functions that work both server-side and via tRPC
|
|
456
575
|
2. **Name-Based Mapping**: The `name` property becomes both the cache key and tRPC procedure name
|
|
457
576
|
3. **Auto-Generated Router**: `createReactiveRouter` automatically creates tRPC procedures from functions
|
|
458
|
-
4. **Smart Caching**:
|
|
577
|
+
4. **Smart Caching**: Server cache uses the configured provider (memory or Redis) and function dependencies to invalidate cached results. The React hook composes a key as `name::JSON(input)` internally to uniquely cache and revalidate by input.
|
|
459
578
|
5. **Real-time Updates**: SSE automatically invalidates affected queries when data changes. No heartbeats are sent; reliability is ensured via client acknowledgments and retry.
|
|
460
579
|
6. **Session Recovery**: Smart revalidation on page load handles offline scenarios and avoids thrashing with a minimum revalidation window.
|
|
461
580
|
|
package/dist/client/hooks.d.ts
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* React hooks for @agelum/backend
|
|
3
3
|
* Provides reactive data access with automatic caching and real-time updates
|
|
4
4
|
*/
|
|
5
|
-
import type { ReactiveConfig, InvalidationEvent } from "../core/types";
|
|
5
|
+
import type { ReactiveConfig, InvalidationEvent } from "../core/types.js";
|
|
6
6
|
/**
|
|
7
7
|
* Initialize the reactive client
|
|
8
8
|
* Call this once at app startup
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hooks.d.ts","sourceRoot":"","sources":["../../src/client/hooks.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAYH,OAAO,KAAK,EACV,cAAc,EACd,iBAAiB,EAClB,MAAM,
|
|
1
|
+
{"version":3,"file":"hooks.d.ts","sourceRoot":"","sources":["../../src/client/hooks.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAYH,OAAO,KAAK,EACV,cAAc,EACd,iBAAiB,EAClB,MAAM,kBAAkB,CAAC;AAkB1B;;;GAGG;AACH,wBAAgB,wBAAwB,CACtC,cAAc,EAAE,MAAM,EACtB,MAAM,EAAE,cAAc,EACtB,YAAY,EAAE,CACZ,QAAQ,EAAE,MAAM,KACb,OAAO,CAAC,GAAG,CAAC,GAChB,IAAI,CA0CN;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,CAAC,GAAG,GAAG,EACjC,QAAQ,EAAE,MAAM,EAChB,KAAK,CAAC,EAAE,GAAG,EACX,OAAO,CAAC,EAAE;IACR,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB,GACA;IACD,IAAI,EAAE,CAAC,GAAG,SAAS,CAAC;IACpB,SAAS,EAAE,OAAO,CAAC;IACnB,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;IACpB,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB,CAsNA;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CACnC,UAAU,EAAE,MAAM,EAAE,GACnB,IAAI,CAYN;AAED;;GAEG;AACH,wBAAgB,gBAAgB,QA2B/B;AAED;;GAEG;AACH,wBAAgB,kBAAkB,wBA0BjC;AAED;;GAEG;AACH,wBAAgB,oBAAoB,QAwBnC;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CACrC,QAAQ,EAAE,CACR,KAAK,EAAE,iBAAiB,KACrB,IAAI,GACR,IAAI,CAgBN;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAC9B,KAAK,GAAG,OAAO,EACf,UAAU,GAAG,OAAO,EAEpB,QAAQ,EAAE,MAAM,GACf;IACD,IAAI,EAAE,KAAK,GAAG,SAAS,CAAC;IACxB,SAAS,EAAE,OAAO,CAAC;IACnB,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;IACpB,OAAO,EAAE,CACP,SAAS,CAAC,EAAE,UAAU,KACnB,OAAO,CAAC,KAAK,CAAC,CAAC;IACpB,GAAG,EAAE,CACH,SAAS,EAAE,UAAU,KAClB,OAAO,CAAC,KAAK,CAAC,CAAC;CACrB,CAyFA;AAED;;GAEG;AACH,wBAAgB,qBAAqB;;;;;;EAoCpC"}
|
|
@@ -0,0 +1,343 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* React hooks for @agelum/backend
|
|
3
|
+
* Provides reactive data access with automatic caching and real-time updates
|
|
4
|
+
*/
|
|
5
|
+
import { useEffect, useState, useCallback, useRef, } from "react";
|
|
6
|
+
import { createReactiveClientManager, } from "./manager.js";
|
|
7
|
+
// Global client manager instance
|
|
8
|
+
let globalClientManager = null;
|
|
9
|
+
/**
|
|
10
|
+
* Get or create the global client manager
|
|
11
|
+
*/
|
|
12
|
+
function getClientManager() {
|
|
13
|
+
if (!globalClientManager) {
|
|
14
|
+
throw new Error("Reactive client not initialized. Call initializeReactiveClient first.");
|
|
15
|
+
}
|
|
16
|
+
return globalClientManager;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Initialize the reactive client
|
|
20
|
+
* Call this once at app startup
|
|
21
|
+
*/
|
|
22
|
+
export function initializeReactiveClient(organizationId, config, revalidateFn) {
|
|
23
|
+
console.log("🚀 Initializing reactive client for org:", organizationId);
|
|
24
|
+
if (globalClientManager) {
|
|
25
|
+
console.log("⚠️ Client already initialized, cleaning up previous instance");
|
|
26
|
+
globalClientManager.cleanup();
|
|
27
|
+
}
|
|
28
|
+
globalClientManager =
|
|
29
|
+
createReactiveClientManager({
|
|
30
|
+
organizationId,
|
|
31
|
+
config,
|
|
32
|
+
onRevalidate: revalidateFn,
|
|
33
|
+
onInvalidation: (event) => {
|
|
34
|
+
console.log(`[ReactiveClient] Received invalidation for table: ${event.table}`);
|
|
35
|
+
},
|
|
36
|
+
});
|
|
37
|
+
// Expose client manager to window for testing purposes
|
|
38
|
+
if (typeof window !== "undefined") {
|
|
39
|
+
window.__reactiveClientManager =
|
|
40
|
+
globalClientManager;
|
|
41
|
+
console.log("🔧 [ReactiveClient] Client manager exposed to window for testing");
|
|
42
|
+
}
|
|
43
|
+
console.log("✅ Reactive client initialized successfully for org:", organizationId);
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Main hook for reactive data access
|
|
47
|
+
* Automatically handles caching, real-time updates, and revalidation
|
|
48
|
+
*/
|
|
49
|
+
export function useReactive(queryKey, input, options) {
|
|
50
|
+
const [data, setData] = useState(undefined);
|
|
51
|
+
const [isLoading, setIsLoading] = useState(true);
|
|
52
|
+
const [isStale, setIsStale] = useState(false);
|
|
53
|
+
const [error, setError] = useState(null);
|
|
54
|
+
const clientManager = getClientManager();
|
|
55
|
+
const isInitialMount = useRef(true);
|
|
56
|
+
// Handle enabled option
|
|
57
|
+
const enabled = options?.enabled !== false;
|
|
58
|
+
// Compose an effective cache key that includes serialized input
|
|
59
|
+
const inputKey = typeof input === "undefined"
|
|
60
|
+
? ""
|
|
61
|
+
: `::${JSON.stringify(input)}`;
|
|
62
|
+
const effectiveKey = `${queryKey}${inputKey}`;
|
|
63
|
+
// Register this hook as active
|
|
64
|
+
useEffect(() => {
|
|
65
|
+
if (!enabled) {
|
|
66
|
+
return;
|
|
67
|
+
}
|
|
68
|
+
const cleanup = clientManager.registerActiveHook(effectiveKey, []);
|
|
69
|
+
return cleanup;
|
|
70
|
+
}, [
|
|
71
|
+
effectiveKey,
|
|
72
|
+
clientManager,
|
|
73
|
+
enabled,
|
|
74
|
+
]);
|
|
75
|
+
// Load data on mount and when queryKey changes
|
|
76
|
+
useEffect(() => {
|
|
77
|
+
if (!enabled) {
|
|
78
|
+
setIsLoading(false);
|
|
79
|
+
return;
|
|
80
|
+
}
|
|
81
|
+
const loadData = async () => {
|
|
82
|
+
try {
|
|
83
|
+
setIsLoading(true);
|
|
84
|
+
setError(null);
|
|
85
|
+
// Check ReactiveStorage cache first (immediate display)
|
|
86
|
+
const cached = clientManager.getCachedData(effectiveKey);
|
|
87
|
+
// Reduced logging - only log cache misses
|
|
88
|
+
if (!cached) {
|
|
89
|
+
console.log(`🔍 [useReactive] Cache miss for ${queryKey}`);
|
|
90
|
+
}
|
|
91
|
+
if (cached) {
|
|
92
|
+
try {
|
|
93
|
+
const now = Date.now();
|
|
94
|
+
const cacheAge = now -
|
|
95
|
+
cached.lastRevalidated;
|
|
96
|
+
const minRevalidationTime = 5 * 60 * 1000; // 5 minutes minimum between revalidations
|
|
97
|
+
// Reduced logging - only log when cache is stale
|
|
98
|
+
if (cached.isStale) {
|
|
99
|
+
console.log(`📊 [useReactive] Cache is stale for ${queryKey}`);
|
|
100
|
+
}
|
|
101
|
+
// Show cached data immediately
|
|
102
|
+
setData(cached.data);
|
|
103
|
+
setIsStale(cached.isStale || false);
|
|
104
|
+
// Only revalidate if cache is old enough (avoid excessive revalidation)
|
|
105
|
+
if (cacheAge >
|
|
106
|
+
minRevalidationTime) {
|
|
107
|
+
console.log(`🔄 [useReactive] Revalidating stale cache for ${queryKey}`);
|
|
108
|
+
// Trigger revalidation in background
|
|
109
|
+
clientManager
|
|
110
|
+
.revalidateQuery(effectiveKey)
|
|
111
|
+
.then((result) => {
|
|
112
|
+
if (result !== undefined) {
|
|
113
|
+
setData(result);
|
|
114
|
+
setIsStale(false);
|
|
115
|
+
// Update ReactiveStorage with fresh data
|
|
116
|
+
clientManager.registerQuery(effectiveKey, [], result);
|
|
117
|
+
// Reduced logging - only log significant updates
|
|
118
|
+
}
|
|
119
|
+
})
|
|
120
|
+
.catch((error) => {
|
|
121
|
+
console.warn(`[useReactive] Background revalidation failed:`, error);
|
|
122
|
+
// Keep showing cached data even if revalidation fails
|
|
123
|
+
});
|
|
124
|
+
}
|
|
125
|
+
else {
|
|
126
|
+
// Reduced logging - only log when cache is stale
|
|
127
|
+
}
|
|
128
|
+
setIsLoading(false);
|
|
129
|
+
isInitialMount.current = false;
|
|
130
|
+
return;
|
|
131
|
+
}
|
|
132
|
+
catch (parseError) {
|
|
133
|
+
console.warn("⚠️ Failed to parse cached data:", parseError);
|
|
134
|
+
// Continue with revalidation if cache is corrupted
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
// No cache or corrupted cache - trigger immediate fetch
|
|
138
|
+
console.log(`[useReactive] No cache for ${queryKey}, fetching...`);
|
|
139
|
+
const result = await clientManager.revalidateQuery(effectiveKey);
|
|
140
|
+
if (result !== undefined) {
|
|
141
|
+
setData(result);
|
|
142
|
+
setIsStale(false);
|
|
143
|
+
// Store in ReactiveStorage for future use
|
|
144
|
+
clientManager.registerQuery(effectiveKey, [], result);
|
|
145
|
+
// Reduced logging - only log significant updates
|
|
146
|
+
}
|
|
147
|
+
setIsLoading(false);
|
|
148
|
+
isInitialMount.current = false;
|
|
149
|
+
}
|
|
150
|
+
catch (err) {
|
|
151
|
+
// On error, don't register cache; surface error and keep prior cache visible
|
|
152
|
+
setError(err);
|
|
153
|
+
setIsLoading(false);
|
|
154
|
+
isInitialMount.current = false;
|
|
155
|
+
}
|
|
156
|
+
};
|
|
157
|
+
loadData();
|
|
158
|
+
}, [effectiveKey, clientManager]);
|
|
159
|
+
const refetch = useCallback(async () => {
|
|
160
|
+
if (!enabled) {
|
|
161
|
+
return;
|
|
162
|
+
}
|
|
163
|
+
try {
|
|
164
|
+
setIsLoading(true);
|
|
165
|
+
setError(null);
|
|
166
|
+
// Reduced logging - only log when there are issues
|
|
167
|
+
// Trigger manual revalidation
|
|
168
|
+
await clientManager.revalidateQuery(effectiveKey);
|
|
169
|
+
// Update stale state
|
|
170
|
+
setIsStale(false);
|
|
171
|
+
setIsLoading(false);
|
|
172
|
+
}
|
|
173
|
+
catch (err) {
|
|
174
|
+
setError(err);
|
|
175
|
+
setIsLoading(false);
|
|
176
|
+
}
|
|
177
|
+
}, [
|
|
178
|
+
effectiveKey,
|
|
179
|
+
clientManager,
|
|
180
|
+
enabled,
|
|
181
|
+
]);
|
|
182
|
+
return {
|
|
183
|
+
data,
|
|
184
|
+
isLoading,
|
|
185
|
+
isStale,
|
|
186
|
+
error,
|
|
187
|
+
refetch,
|
|
188
|
+
};
|
|
189
|
+
}
|
|
190
|
+
/**
|
|
191
|
+
* Optional page-level priority hints for better UX
|
|
192
|
+
*/
|
|
193
|
+
export function useReactivePriorities(priorities) {
|
|
194
|
+
useEffect(() => {
|
|
195
|
+
// Reduced logging - only log when there are issues
|
|
196
|
+
// In a full implementation, this would:
|
|
197
|
+
// 1. Pre-warm cache for these queries
|
|
198
|
+
// 2. Subscribe to their invalidation events
|
|
199
|
+
// 3. Set higher revalidation priority
|
|
200
|
+
return () => {
|
|
201
|
+
// Reduced logging - only log when there are issues
|
|
202
|
+
};
|
|
203
|
+
}, [priorities.join(",")]);
|
|
204
|
+
}
|
|
205
|
+
/**
|
|
206
|
+
* Hook to get current session statistics
|
|
207
|
+
*/
|
|
208
|
+
export function useReactiveStats() {
|
|
209
|
+
const [stats, setStats] = useState(null);
|
|
210
|
+
const clientManager = getClientManager();
|
|
211
|
+
useEffect(() => {
|
|
212
|
+
const updateStats = () => {
|
|
213
|
+
setStats(clientManager.getSessionStats());
|
|
214
|
+
};
|
|
215
|
+
// Update stats immediately
|
|
216
|
+
updateStats();
|
|
217
|
+
// Update stats every 5 seconds
|
|
218
|
+
const interval = setInterval(updateStats, 5000);
|
|
219
|
+
return () => clearInterval(interval);
|
|
220
|
+
}, [clientManager]);
|
|
221
|
+
return stats;
|
|
222
|
+
}
|
|
223
|
+
/**
|
|
224
|
+
* Hook to manually trigger cache refresh
|
|
225
|
+
*/
|
|
226
|
+
export function useReactiveRefresh() {
|
|
227
|
+
const clientManager = getClientManager();
|
|
228
|
+
return useCallback(async () => {
|
|
229
|
+
// Trigger revalidation for all active queries
|
|
230
|
+
const activeHooks = clientManager.getStorageStats()
|
|
231
|
+
?.queries || {};
|
|
232
|
+
const activeQueryKeys = Object.keys(activeHooks);
|
|
233
|
+
console.log(`[useReactiveRefresh] Refreshing ${activeQueryKeys.length} active queries`);
|
|
234
|
+
// Revalidate all active queries
|
|
235
|
+
await Promise.allSettled(activeQueryKeys.map((queryKey) => clientManager.revalidateQuery(queryKey)));
|
|
236
|
+
}, [clientManager]);
|
|
237
|
+
}
|
|
238
|
+
/**
|
|
239
|
+
* Hook to get revalidation statistics and performance metrics
|
|
240
|
+
*/
|
|
241
|
+
export function useRevalidationStats() {
|
|
242
|
+
const [stats, setStats] = useState(null);
|
|
243
|
+
const clientManager = getClientManager();
|
|
244
|
+
useEffect(() => {
|
|
245
|
+
const updateStats = () => {
|
|
246
|
+
const revalidationStats = clientManager.getRevalidationStats();
|
|
247
|
+
setStats(revalidationStats);
|
|
248
|
+
};
|
|
249
|
+
updateStats();
|
|
250
|
+
const interval = setInterval(updateStats, 2000);
|
|
251
|
+
return () => clearInterval(interval);
|
|
252
|
+
}, [clientManager]);
|
|
253
|
+
return stats;
|
|
254
|
+
}
|
|
255
|
+
/**
|
|
256
|
+
* Hook to handle invalidation events
|
|
257
|
+
*/
|
|
258
|
+
export function useReactiveInvalidation(callback) {
|
|
259
|
+
const clientManager = getClientManager();
|
|
260
|
+
useEffect(() => {
|
|
261
|
+
// In a full implementation, this would subscribe to invalidation events
|
|
262
|
+
console.log("[useReactiveInvalidation] Setting up invalidation listener");
|
|
263
|
+
return () => {
|
|
264
|
+
console.log("[useReactiveInvalidation] Cleaning up invalidation listener");
|
|
265
|
+
};
|
|
266
|
+
}, [callback, clientManager]);
|
|
267
|
+
}
|
|
268
|
+
/**
|
|
269
|
+
* Hook for manual queries with dynamic parameters
|
|
270
|
+
* Unlike useReactive, this hook doesn't auto-fetch and allows changing parameters on each call
|
|
271
|
+
*/
|
|
272
|
+
export function useReactiveQuery(queryKey) {
|
|
273
|
+
const [data, setData] = useState(undefined);
|
|
274
|
+
const [error, setError] = useState(null);
|
|
275
|
+
const [isLoading, setIsLoading] = useState(false);
|
|
276
|
+
const [lastVariables, setLastVariables,] = useState(undefined);
|
|
277
|
+
const clientManager = getClientManager();
|
|
278
|
+
const executeQuery = useCallback(async (variables) => {
|
|
279
|
+
setIsLoading(true);
|
|
280
|
+
setError(null);
|
|
281
|
+
try {
|
|
282
|
+
console.log(`[useReactiveQuery] Executing ${queryKey}`, variables);
|
|
283
|
+
// Compose cache key with variables
|
|
284
|
+
const inputKey = typeof variables ===
|
|
285
|
+
"undefined"
|
|
286
|
+
? ""
|
|
287
|
+
: `::${JSON.stringify(variables)}`;
|
|
288
|
+
const effectiveKey = `${queryKey}${inputKey}`;
|
|
289
|
+
// Execute the query through the client manager
|
|
290
|
+
const result = await clientManager.revalidateQuery(effectiveKey);
|
|
291
|
+
setData(result);
|
|
292
|
+
setLastVariables(variables);
|
|
293
|
+
console.log(`✅ [useReactiveQuery] ${queryKey} completed successfully`);
|
|
294
|
+
return result;
|
|
295
|
+
}
|
|
296
|
+
catch (err) {
|
|
297
|
+
const error = err;
|
|
298
|
+
setError(error);
|
|
299
|
+
console.error(`❌ [useReactiveQuery] ${queryKey} failed:`, error);
|
|
300
|
+
throw error;
|
|
301
|
+
}
|
|
302
|
+
finally {
|
|
303
|
+
setIsLoading(false);
|
|
304
|
+
}
|
|
305
|
+
}, [queryKey, clientManager]);
|
|
306
|
+
const refetch = useCallback(async (variables) => {
|
|
307
|
+
const varsToUse = variables || lastVariables;
|
|
308
|
+
if (!varsToUse) {
|
|
309
|
+
throw new Error("No variables provided for refetch and no previous variables stored");
|
|
310
|
+
}
|
|
311
|
+
return executeQuery(varsToUse);
|
|
312
|
+
}, [executeQuery, lastVariables]);
|
|
313
|
+
return {
|
|
314
|
+
data,
|
|
315
|
+
isLoading,
|
|
316
|
+
error,
|
|
317
|
+
refetch,
|
|
318
|
+
run: executeQuery,
|
|
319
|
+
};
|
|
320
|
+
}
|
|
321
|
+
/**
|
|
322
|
+
* Hook to get connection status
|
|
323
|
+
*/
|
|
324
|
+
export function useReactiveConnection() {
|
|
325
|
+
const [status, setStatus] = useState("disconnected");
|
|
326
|
+
const clientManager = getClientManager();
|
|
327
|
+
useEffect(() => {
|
|
328
|
+
const updateStatus = () => {
|
|
329
|
+
setStatus(clientManager.getConnectionStatus());
|
|
330
|
+
};
|
|
331
|
+
updateStatus();
|
|
332
|
+
const interval = setInterval(updateStatus, 1000);
|
|
333
|
+
return () => clearInterval(interval);
|
|
334
|
+
}, [clientManager]);
|
|
335
|
+
return {
|
|
336
|
+
status,
|
|
337
|
+
isConnected: status === "connected",
|
|
338
|
+
isConnecting: status === "connecting",
|
|
339
|
+
isDisconnected: status === "disconnected",
|
|
340
|
+
reconnect: () => clientManager.reconnectSSE(),
|
|
341
|
+
};
|
|
342
|
+
}
|
|
343
|
+
//# sourceMappingURL=hooks.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hooks.js","sourceRoot":"","sources":["../../src/client/hooks.ts"],"names":[],"mappings":"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"}
|
package/dist/client/index.d.ts
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Client-side reactive database features
|
|
3
3
|
*/
|
|
4
|
-
export { ReactiveStorage, createReactiveStorage } from './storage';
|
|
5
|
-
export { SimpleSessionManager, createSimpleSessionManager, revalidateOnPageLoad, type SessionInfo, type QueryRegistry, type QueryRegistryEntry, } from './session';
|
|
6
|
-
export { ReactiveClientManager, createReactiveClientManager, type ReactiveManagerOptions, } from './manager';
|
|
7
|
-
export { useReactive, useReactiveQuery, useReactivePriorities, useReactiveStats, useReactiveRefresh, useReactiveInvalidation, useRevalidationStats, useReactiveConnection, initializeReactiveClient, } from './hooks';
|
|
8
|
-
export { SmartRevalidationEngine, createSmartRevalidationEngine, type RevalidationStrategy, type RevalidationOptions, type RevalidationResult, } from './revalidation';
|
|
9
|
-
export { ReactiveProvider } from './provider';
|
|
4
|
+
export { ReactiveStorage, createReactiveStorage } from './storage.js';
|
|
5
|
+
export { SimpleSessionManager, createSimpleSessionManager, revalidateOnPageLoad, type SessionInfo, type QueryRegistry, type QueryRegistryEntry, } from './session.js';
|
|
6
|
+
export { ReactiveClientManager, createReactiveClientManager, type ReactiveManagerOptions, } from './manager.js';
|
|
7
|
+
export { useReactive, useReactiveQuery, useReactivePriorities, useReactiveStats, useReactiveRefresh, useReactiveInvalidation, useRevalidationStats, useReactiveConnection, initializeReactiveClient, } from './hooks.js';
|
|
8
|
+
export { SmartRevalidationEngine, createSmartRevalidationEngine, type RevalidationStrategy, type RevalidationOptions, type RevalidationResult, } from './revalidation.js';
|
|
9
|
+
export { ReactiveProvider } from './provider.js';
|
|
10
10
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/client/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,eAAe,EAAE,qBAAqB,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/client/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,eAAe,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAA;AACrE,OAAO,EACL,oBAAoB,EACpB,0BAA0B,EAC1B,oBAAoB,EACpB,KAAK,WAAW,EAChB,KAAK,aAAa,EAClB,KAAK,kBAAkB,GACxB,MAAM,cAAc,CAAA;AAGrB,OAAO,EACL,qBAAqB,EACrB,2BAA2B,EAC3B,KAAK,sBAAsB,GAC5B,MAAM,cAAc,CAAA;AAGrB,OAAO,EACL,WAAW,EACX,gBAAgB,EAChB,qBAAqB,EACrB,gBAAgB,EAChB,kBAAkB,EAClB,uBAAuB,EACvB,oBAAoB,EACpB,qBAAqB,EACrB,wBAAwB,GACzB,MAAM,YAAY,CAAA;AAGnB,OAAO,EACL,uBAAuB,EACvB,6BAA6B,EAC7B,KAAK,oBAAoB,EACzB,KAAK,mBAAmB,EACxB,KAAK,kBAAkB,GACxB,MAAM,mBAAmB,CAAA;AAG1B,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAA"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Client-side reactive database features
|
|
3
|
+
*/
|
|
4
|
+
// Storage and session management
|
|
5
|
+
export { ReactiveStorage, createReactiveStorage } from './storage.js';
|
|
6
|
+
export { SimpleSessionManager, createSimpleSessionManager, revalidateOnPageLoad, } from './session.js';
|
|
7
|
+
// Client manager
|
|
8
|
+
export { ReactiveClientManager, createReactiveClientManager, } from './manager.js';
|
|
9
|
+
// React hooks
|
|
10
|
+
export { useReactive, useReactiveQuery, useReactivePriorities, useReactiveStats, useReactiveRefresh, useReactiveInvalidation, useRevalidationStats, useReactiveConnection, initializeReactiveClient, } from './hooks.js';
|
|
11
|
+
// Smart revalidation
|
|
12
|
+
export { SmartRevalidationEngine, createSmartRevalidationEngine, } from './revalidation.js';
|
|
13
|
+
// Provider and types
|
|
14
|
+
export { ReactiveProvider } from './provider.js';
|
|
15
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/client/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,iCAAiC;AACjC,OAAO,EAAE,eAAe,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAA;AACrE,OAAO,EACL,oBAAoB,EACpB,0BAA0B,EAC1B,oBAAoB,GAIrB,MAAM,cAAc,CAAA;AAErB,iBAAiB;AACjB,OAAO,EACL,qBAAqB,EACrB,2BAA2B,GAE5B,MAAM,cAAc,CAAA;AAErB,cAAc;AACd,OAAO,EACL,WAAW,EACX,gBAAgB,EAChB,qBAAqB,EACrB,gBAAgB,EAChB,kBAAkB,EAClB,uBAAuB,EACvB,oBAAoB,EACpB,qBAAqB,EACrB,wBAAwB,GACzB,MAAM,YAAY,CAAA;AAEnB,qBAAqB;AACrB,OAAO,EACL,uBAAuB,EACvB,6BAA6B,GAI9B,MAAM,mBAAmB,CAAA;AAE1B,qBAAqB;AACrB,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAA"}
|
package/dist/client/manager.d.ts
CHANGED
|
@@ -2,8 +2,8 @@
|
|
|
2
2
|
* Client-side reactive manager
|
|
3
3
|
* Coordinates storage, session recovery, and real-time synchronization
|
|
4
4
|
*/
|
|
5
|
-
import { type SSEClientOptions } from './sse-client';
|
|
6
|
-
import type { ReactiveConfig, InvalidationEvent } from '../core/types';
|
|
5
|
+
import { type SSEClientOptions } from './sse-client.js';
|
|
6
|
+
import type { ReactiveConfig, InvalidationEvent } from '../core/types.js';
|
|
7
7
|
export interface ReactiveManagerOptions {
|
|
8
8
|
organizationId: string;
|
|
9
9
|
config: ReactiveConfig;
|
|
@@ -66,7 +66,7 @@ export declare class ReactiveClientManager {
|
|
|
66
66
|
/**
|
|
67
67
|
* Get SSE connection statistics
|
|
68
68
|
*/
|
|
69
|
-
getSSEStats(): import("./sse-client").SSEClientStats | null;
|
|
69
|
+
getSSEStats(): import("./sse-client.js").SSEClientStats | null;
|
|
70
70
|
/**
|
|
71
71
|
* Manually reconnect SSE
|
|
72
72
|
*/
|
|
@@ -98,7 +98,7 @@ export declare class ReactiveClientManager {
|
|
|
98
98
|
/**
|
|
99
99
|
* Get storage statistics
|
|
100
100
|
*/
|
|
101
|
-
getStorageStats(): import("../core/types").QueryRegistry | null;
|
|
101
|
+
getStorageStats(): import("../core/types.js").QueryRegistry | null;
|
|
102
102
|
/**
|
|
103
103
|
* Get session statistics
|
|
104
104
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../src/client/manager.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAaH,OAAO,EAAa,KAAK,gBAAgB,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../src/client/manager.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAaH,OAAO,EAAa,KAAK,gBAAgB,EAAE,MAAM,iBAAiB,CAAA;AAClE,OAAO,KAAK,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAA;AAEzE,MAAM,WAAW,sBAAsB;IACrC,cAAc,EAAE,MAAM,CAAA;IACtB,MAAM,EAAE,cAAc,CAAA;IACtB,cAAc,CAAC,EAAE,CAAC,KAAK,EAAE,iBAAiB,KAAK,IAAI,CAAA;IACnD,YAAY,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,GAAG,CAAC,CAAA;IACjD,UAAU,CAAC,EAAE,OAAO,CAAC,gBAAgB,CAAC,CAAA;CACvC;AAED,qBAAa,qBAAqB;IAChC,OAAO,CAAC,OAAO,CAAiB;IAChC,OAAO,CAAC,cAAc,CAAsB;IAC5C,OAAO,CAAC,kBAAkB,CAAyB;IACnD,OAAO,CAAC,SAAS,CAAyB;IAC1C,OAAO,CAAC,MAAM,CAAgB;IAC9B,OAAO,CAAC,cAAc,CAAQ;IAC9B,OAAO,CAAC,cAAc,CAAC,CAAoC;IAC3D,OAAO,CAAC,YAAY,CAAC,CAAoC;IAGzD,OAAO,CAAC,kBAAkB,CAAC,CAAY;IACvC,OAAO,CAAC,oBAAoB,CAAC,CAAY;gBAE7B,OAAO,EAAE,sBAAsB;IA0B3C;;OAEG;IACH,IAAI,qBAAqB,IAAI,MAAM,CAElC;IAED;;OAEG;IACH,aAAa,CACX,QAAQ,EAAE,MAAM,EAChB,YAAY,EAAE,MAAM,EAAE,EACtB,IAAI,CAAC,EAAE,GAAG,EACV,GAAG,CAAC,EAAE,MAAM,GACX,IAAI;IAIP;;OAEG;IACH,kBAAkB,CAAC,QAAQ,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,GAAG,MAAM,IAAI;IASxE;;OAEG;IACH,aAAa,CAAC,QAAQ,EAAE,MAAM;;;;;IAI9B;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAwB1B;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAe3B;;OAEG;IACH,OAAO,CAAC,sBAAsB;IAW9B;;OAEG;IACG,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC;IAwBrD;;OAEG;IACH,OAAO,CAAC,uBAAuB;IAsB/B;;OAEG;IACH,WAAW;IAIX;;OAEG;IACH,YAAY,IAAI,IAAI;IAUpB;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAqB3B;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAS5B;;OAEG;YACW,mBAAmB;IAYjC;;OAEG;YACW,sBAAsB;IAOpC;;OAEG;IACH,mBAAmB,IAAI,WAAW,GAAG,YAAY,GAAG,cAAc;IAUlE;;OAEG;IACH,iBAAiB,IAAI,OAAO;IAO5B;;OAEG;IACH,eAAe;IAIf;;OAEG;IACH,eAAe;;;;;;;IAIf;;OAEG;IACH,oBAAoB;;;;;;;;;IAIpB;;OAEG;IACH,wBAAwB,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IAIhD;;OAEG;IACH,OAAO,IAAI,IAAI;CAahB;AAED;;GAEG;AACH,wBAAgB,2BAA2B,CACzC,OAAO,EAAE,sBAAsB,GAC9B,qBAAqB,CAEvB"}
|