@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.
Files changed (107) hide show
  1. package/README.md +127 -8
  2. package/dist/client/hooks.d.ts +1 -1
  3. package/dist/client/hooks.d.ts.map +1 -1
  4. package/dist/client/hooks.js +343 -0
  5. package/dist/client/hooks.js.map +1 -0
  6. package/dist/client/index.d.ts +6 -6
  7. package/dist/client/index.d.ts.map +1 -1
  8. package/dist/client/index.js +15 -0
  9. package/dist/client/index.js.map +1 -0
  10. package/dist/client/manager.d.ts +4 -4
  11. package/dist/client/manager.d.ts.map +1 -1
  12. package/dist/client/manager.js +287 -0
  13. package/dist/client/manager.js.map +1 -0
  14. package/dist/client/provider.d.ts +1 -1
  15. package/dist/client/provider.d.ts.map +1 -1
  16. package/dist/client/provider.js +84 -0
  17. package/dist/client/provider.js.map +1 -0
  18. package/dist/client/revalidation.d.ts +2 -2
  19. package/dist/client/revalidation.d.ts.map +1 -1
  20. package/dist/client/revalidation.js +308 -0
  21. package/dist/client/revalidation.js.map +1 -0
  22. package/dist/client/session.d.ts +84 -0
  23. package/dist/client/session.d.ts.map +1 -0
  24. package/dist/client/session.js +180 -0
  25. package/dist/client/session.js.map +1 -0
  26. package/dist/client/sse-client.d.ts +1 -1
  27. package/dist/client/sse-client.d.ts.map +1 -1
  28. package/dist/client/sse-client.js +217 -0
  29. package/dist/client/sse-client.js.map +1 -0
  30. package/dist/client/storage.d.ts +1 -1
  31. package/dist/client/storage.d.ts.map +1 -1
  32. package/dist/client/storage.js +489 -0
  33. package/dist/client/storage.js.map +1 -0
  34. package/dist/client/trpc.js +29 -0
  35. package/dist/client/trpc.js.map +1 -0
  36. package/dist/client/types.d.ts +10 -0
  37. package/dist/client/types.d.ts.map +1 -0
  38. package/dist/client/types.js +2 -0
  39. package/dist/client/types.js.map +1 -0
  40. package/dist/client.d.ts +6 -6
  41. package/dist/client.d.ts.map +1 -1
  42. package/dist/client.js +14 -0
  43. package/dist/client.js.map +1 -0
  44. package/dist/config/schema.d.ts +81 -18
  45. package/dist/config/schema.d.ts.map +1 -1
  46. package/dist/config/schema.js +42 -38
  47. package/dist/config/schema.js.map +1 -1
  48. package/dist/core/analyzer.d.ts +1 -1
  49. package/dist/core/analyzer.d.ts.map +1 -1
  50. package/dist/core/analyzer.js +212 -0
  51. package/dist/core/analyzer.js.map +1 -0
  52. package/dist/core/driver.d.ts +1 -1
  53. package/dist/core/driver.d.ts.map +1 -1
  54. package/dist/core/driver.js +138 -47
  55. package/dist/core/driver.js.map +1 -1
  56. package/dist/core/function.d.ts +14 -3
  57. package/dist/core/function.d.ts.map +1 -1
  58. package/dist/core/function.js +76 -35
  59. package/dist/core/function.js.map +1 -1
  60. package/dist/core/sse.d.ts +1 -1
  61. package/dist/core/sse.d.ts.map +1 -1
  62. package/dist/core/sse.js +323 -0
  63. package/dist/core/sse.js.map +1 -0
  64. package/dist/core/types.d.ts +48 -8
  65. package/dist/core/types.d.ts.map +1 -1
  66. package/dist/core/types.js +1 -2
  67. package/dist/index.d.ts +12 -12
  68. package/dist/index.d.ts.map +1 -1
  69. package/dist/index.js +9 -25
  70. package/dist/index.js.map +1 -1
  71. package/dist/providers/localStorage.d.ts +1 -1
  72. package/dist/providers/localStorage.d.ts.map +1 -1
  73. package/dist/providers/localStorage.js +66 -0
  74. package/dist/providers/localStorage.js.map +1 -0
  75. package/dist/providers/memory.d.ts +1 -1
  76. package/dist/providers/memory.d.ts.map +1 -1
  77. package/dist/providers/memory.js +36 -0
  78. package/dist/providers/memory.js.map +1 -0
  79. package/dist/providers/redis.d.ts +9 -3
  80. package/dist/providers/redis.d.ts.map +1 -1
  81. package/dist/providers/redis.js +74 -0
  82. package/dist/providers/redis.js.map +1 -0
  83. package/dist/server.d.ts +11 -11
  84. package/dist/server.d.ts.map +1 -1
  85. package/dist/server.js +8 -23
  86. package/dist/server.js.map +1 -1
  87. package/dist/trpc/hooks.d.ts +82 -0
  88. package/dist/trpc/hooks.d.ts.map +1 -0
  89. package/dist/trpc/hooks.js +276 -0
  90. package/dist/trpc/hooks.js.map +1 -0
  91. package/dist/trpc/index.d.ts +4 -4
  92. package/dist/trpc/index.d.ts.map +1 -1
  93. package/dist/trpc/index.js +2 -12
  94. package/dist/trpc/index.js.map +1 -1
  95. package/dist/trpc/router.d.ts +3 -3
  96. package/dist/trpc/router.d.ts.map +1 -1
  97. package/dist/trpc/router.js +6 -12
  98. package/dist/trpc/router.js.map +1 -1
  99. package/dist/trpc/types.d.ts +2 -2
  100. package/dist/trpc/types.d.ts.map +1 -1
  101. package/dist/trpc/types.js +1 -2
  102. package/dist/trpc/types.js.map +1 -1
  103. package/package.json +13 -1
  104. package/dist/examples/teamhub-integration.d.ts +0 -56
  105. package/dist/examples/teamhub-integration.d.ts.map +0 -1
  106. package/dist/examples/teamhub-integration.js +0 -192
  107. 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. Use `db.db` to access the underlying Drizzle instance inside handlers.
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. SSE Endpoint (Next.js)
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
- ### 3. Client Setup
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**: Cache keys are generated from function names and inputs. The React hook composes a key as `name::JSON(input)` internally to uniquely cache and revalidate by input.
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
 
@@ -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,eAAe,CAAC;AAkBvB;;;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"}
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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"}
@@ -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,WAAW,CAAA;AAClE,OAAO,EACL,oBAAoB,EACpB,0BAA0B,EAC1B,oBAAoB,EACpB,KAAK,WAAW,EAChB,KAAK,aAAa,EAClB,KAAK,kBAAkB,GACxB,MAAM,WAAW,CAAA;AAGlB,OAAO,EACL,qBAAqB,EACrB,2BAA2B,EAC3B,KAAK,sBAAsB,GAC5B,MAAM,WAAW,CAAA;AAGlB,OAAO,EACL,WAAW,EACX,gBAAgB,EAChB,qBAAqB,EACrB,gBAAgB,EAChB,kBAAkB,EAClB,uBAAuB,EACvB,oBAAoB,EACpB,qBAAqB,EACrB,wBAAwB,GACzB,MAAM,SAAS,CAAA;AAGhB,OAAO,EACL,uBAAuB,EACvB,6BAA6B,EAC7B,KAAK,oBAAoB,EACzB,KAAK,mBAAmB,EACxB,KAAK,kBAAkB,GACxB,MAAM,gBAAgB,CAAA;AAGvB,OAAO,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAA"}
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"}
@@ -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,cAAc,CAAA;AAC/D,OAAO,KAAK,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAA;AAEtE,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"}
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"}