@agelum/backend 0.1.1 → 0.1.3

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 (106) hide show
  1. package/README.md +33 -5
  2. package/dist/client/hooks.d.ts +65 -0
  3. package/dist/client/hooks.d.ts.map +1 -0
  4. package/dist/client/hooks.js +343 -0
  5. package/dist/client/hooks.js.map +1 -0
  6. package/dist/client/index.d.ts +10 -0
  7. package/dist/client/index.d.ts.map +1 -0
  8. package/dist/client/index.js +15 -0
  9. package/dist/client/index.js.map +1 -0
  10. package/dist/client/manager.d.ts +137 -0
  11. package/dist/client/manager.d.ts.map +1 -0
  12. package/dist/client/manager.js +287 -0
  13. package/dist/client/manager.js.map +1 -0
  14. package/dist/client/provider.d.ts +25 -0
  15. package/dist/client/provider.d.ts.map +1 -0
  16. package/dist/client/provider.js +84 -0
  17. package/dist/client/provider.js.map +1 -0
  18. package/dist/client/revalidation.d.ts +101 -0
  19. package/dist/client/revalidation.d.ts.map +1 -0
  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 +81 -0
  27. package/dist/client/sse-client.d.ts.map +1 -0
  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 +126 -0
  31. package/dist/client/storage.d.ts.map +1 -0
  32. package/dist/client/storage.js +489 -0
  33. package/dist/client/storage.js.map +1 -0
  34. package/dist/client/trpc.d.ts +12 -0
  35. package/dist/client/trpc.d.ts.map +1 -0
  36. package/dist/client/trpc.js +29 -0
  37. package/dist/client/trpc.js.map +1 -0
  38. package/dist/client/types.d.ts +10 -0
  39. package/dist/client/types.d.ts.map +1 -0
  40. package/dist/client/types.js +2 -0
  41. package/dist/client/types.js.map +1 -0
  42. package/dist/client.d.ts +12 -0
  43. package/dist/client.d.ts.map +1 -0
  44. package/dist/client.js +14 -0
  45. package/dist/client.js.map +1 -0
  46. package/dist/config/schema.d.ts +250 -0
  47. package/dist/config/schema.d.ts.map +1 -0
  48. package/dist/config/schema.js +66 -0
  49. package/dist/config/schema.js.map +1 -0
  50. package/dist/core/analyzer.d.ts +15 -0
  51. package/dist/core/analyzer.d.ts.map +1 -0
  52. package/dist/core/analyzer.js +212 -0
  53. package/dist/core/analyzer.js.map +1 -0
  54. package/dist/core/driver.d.ts +7 -0
  55. package/dist/core/driver.d.ts.map +1 -0
  56. package/dist/core/driver.js +259 -0
  57. package/dist/core/driver.js.map +1 -0
  58. package/dist/core/function.d.ts +103 -0
  59. package/dist/core/function.d.ts.map +1 -0
  60. package/dist/core/function.js +245 -0
  61. package/dist/core/function.js.map +1 -0
  62. package/dist/core/sse.d.ts +98 -0
  63. package/dist/core/sse.d.ts.map +1 -0
  64. package/dist/core/sse.js +323 -0
  65. package/dist/core/sse.js.map +1 -0
  66. package/dist/core/types.d.ts +196 -0
  67. package/dist/core/types.d.ts.map +1 -0
  68. package/dist/core/types.js +2 -0
  69. package/dist/core/types.js.map +1 -0
  70. package/dist/index.d.ts +40 -0
  71. package/dist/index.d.ts.map +1 -0
  72. package/dist/index.js +41 -0
  73. package/dist/index.js.map +1 -0
  74. package/dist/providers/localStorage.d.ts +13 -0
  75. package/dist/providers/localStorage.d.ts.map +1 -0
  76. package/dist/providers/localStorage.js +66 -0
  77. package/dist/providers/localStorage.js.map +1 -0
  78. package/dist/providers/memory.d.ts +13 -0
  79. package/dist/providers/memory.d.ts.map +1 -0
  80. package/dist/providers/memory.js +36 -0
  81. package/dist/providers/memory.js.map +1 -0
  82. package/dist/providers/redis.d.ts +14 -0
  83. package/dist/providers/redis.d.ts.map +1 -0
  84. package/dist/providers/redis.js +32 -0
  85. package/dist/providers/redis.js.map +1 -0
  86. package/dist/server.d.ts +18 -0
  87. package/dist/server.d.ts.map +1 -0
  88. package/dist/server.js +19 -0
  89. package/dist/server.js.map +1 -0
  90. package/dist/trpc/hooks.d.ts +82 -0
  91. package/dist/trpc/hooks.d.ts.map +1 -0
  92. package/dist/trpc/hooks.js +276 -0
  93. package/dist/trpc/hooks.js.map +1 -0
  94. package/dist/trpc/index.d.ts +9 -0
  95. package/dist/trpc/index.d.ts.map +1 -0
  96. package/dist/trpc/index.js +9 -0
  97. package/dist/trpc/index.js.map +1 -0
  98. package/dist/trpc/router.d.ts +76 -0
  99. package/dist/trpc/router.d.ts.map +1 -0
  100. package/dist/trpc/router.js +171 -0
  101. package/dist/trpc/router.js.map +1 -0
  102. package/dist/trpc/types.d.ts +114 -0
  103. package/dist/trpc/types.d.ts.map +1 -0
  104. package/dist/trpc/types.js +5 -0
  105. package/dist/trpc/types.js.map +1 -0
  106. package/package.json +21 -10
@@ -0,0 +1,489 @@
1
+ /**
2
+ * Client-side storage management for reactive queries
3
+ * Handles localStorage-based query registry and session persistence
4
+ */
5
+ export class ReactiveStorage {
6
+ storageKey = "@agelum/backend:registry";
7
+ legacyStorageKey = "@drizzle/reactive:registry";
8
+ indexKey;
9
+ activeHooks = new Map();
10
+ sessionId;
11
+ organizationId;
12
+ constructor(organizationId) {
13
+ this.organizationId =
14
+ organizationId;
15
+ this.indexKey = this.getIndexKey(organizationId);
16
+ this.sessionId =
17
+ this.generateSessionId();
18
+ this.initializeRegistry();
19
+ this.cleanupExpiredEntries();
20
+ }
21
+ /** Derive the per-org index key */
22
+ getIndexKey(orgId) {
23
+ return `reactive_registry_${orgId}`;
24
+ }
25
+ /** Derive per-query entry key */
26
+ getEntryKey(orgId, queryKey) {
27
+ return `@agelum/backend:entry:${orgId}:${this.hash(queryKey)}`;
28
+ }
29
+ getLegacyEntryKey(orgId, queryKey) {
30
+ return `@drizzle/reactive:entry:${orgId}:${this.hash(queryKey)}`;
31
+ }
32
+ /** Simple 32-bit hash for stable short keys */
33
+ hash(input) {
34
+ let h = 2166136261 >>> 0;
35
+ for (let i = 0; i < input.length; i++) {
36
+ h ^= input.charCodeAt(i);
37
+ h = Math.imul(h, 16777619);
38
+ }
39
+ return (h >>> 0).toString(36);
40
+ }
41
+ /**
42
+ * Initialize the query registry for this organization
43
+ */
44
+ initializeRegistry() {
45
+ const existing = this.getRegistry();
46
+ if (!existing ||
47
+ existing.organizationId !==
48
+ this.organizationId) {
49
+ // Create new registry for this organization
50
+ const newRegistry = {
51
+ organizationId: this.organizationId,
52
+ queries: {},
53
+ session: {
54
+ startTime: Date.now(),
55
+ lastSync: Date.now(),
56
+ realtimeConnected: false,
57
+ },
58
+ };
59
+ this.saveRegistry(newRegistry);
60
+ }
61
+ else {
62
+ // Update session info
63
+ existing.session.startTime =
64
+ Date.now();
65
+ existing.session.lastSync =
66
+ Date.now();
67
+ this.saveRegistry(existing);
68
+ }
69
+ }
70
+ /**
71
+ * Get the current query registry
72
+ */
73
+ getRegistry() {
74
+ try {
75
+ // Prefer per-org index; fallback to legacy single-key registry for migration
76
+ const stored = localStorage.getItem(this.indexKey) ||
77
+ localStorage.getItem(this.storageKey) ||
78
+ localStorage.getItem(this.legacyStorageKey);
79
+ if (!stored)
80
+ return null;
81
+ const registry = JSON.parse(stored);
82
+ return registry;
83
+ }
84
+ catch (error) {
85
+ console.warn("Failed to parse registry from localStorage", error instanceof Error
86
+ ? error.message
87
+ : String(error));
88
+ return null;
89
+ }
90
+ }
91
+ /**
92
+ * Save the query registry to localStorage
93
+ */
94
+ saveRegistry(registry) {
95
+ try {
96
+ localStorage.setItem(this.indexKey, JSON.stringify(registry));
97
+ }
98
+ catch (error) {
99
+ console.warn("Failed to save registry to localStorage", error instanceof Error
100
+ ? error.message
101
+ : String(error));
102
+ // Handle localStorage quota exceeded
103
+ this.cleanupOldEntries();
104
+ try {
105
+ localStorage.setItem(this.indexKey, JSON.stringify(registry));
106
+ }
107
+ catch (retryError) {
108
+ console.error("Failed to save registry after cleanup to localStorage", retryError instanceof Error
109
+ ? retryError.message
110
+ : String(retryError));
111
+ }
112
+ }
113
+ }
114
+ /**
115
+ * Register a query execution
116
+ */
117
+ registerQuery(queryKey, dependencies, data, ttl) {
118
+ const registry = this.getRegistry();
119
+ if (!registry)
120
+ return;
121
+ const now = Date.now();
122
+ const existingQuery = registry.queries[queryKey];
123
+ console.debug("Registering query in storage", {
124
+ queryKey,
125
+ hasExistingData: !!existingQuery,
126
+ existingLastServerChange: existingQuery?.lastServerChange,
127
+ newDataExists: !!data,
128
+ timestamp: now,
129
+ });
130
+ // Check if data actually changed
131
+ const dataChanged = !existingQuery ||
132
+ JSON.stringify(existingQuery.data) !== JSON.stringify(data);
133
+ // Write data to a separate entry to avoid huge single-key payloads
134
+ try {
135
+ const entryKey = this.getEntryKey(this.organizationId, queryKey);
136
+ // Derive human-friendly fields for debugging in localStorage
137
+ const [name, inputJson] = queryKey.split("::");
138
+ const input = inputJson
139
+ ? (() => {
140
+ try {
141
+ return JSON.parse(inputJson);
142
+ }
143
+ catch {
144
+ return undefined;
145
+ }
146
+ })()
147
+ : undefined;
148
+ const entryPayload = JSON.stringify({
149
+ name,
150
+ input,
151
+ queryKey,
152
+ data,
153
+ });
154
+ localStorage.setItem(entryKey, entryPayload);
155
+ }
156
+ catch (e) {
157
+ console.warn("Failed to write entry for", e instanceof Error
158
+ ? e.message
159
+ : String(e));
160
+ }
161
+ // Store only metadata in the index
162
+ registry.queries[queryKey] = {
163
+ lastRevalidated: now,
164
+ // Only update lastServerChange if data actually changed
165
+ lastServerChange: dataChanged
166
+ ? now
167
+ : existingQuery?.lastServerChange ||
168
+ now,
169
+ };
170
+ // Update session sync time
171
+ registry.session.lastSync = now;
172
+ this.saveRegistry(registry);
173
+ console.debug("Query registered in storage", {
174
+ queryKey,
175
+ dataChanged,
176
+ isStale: false, // Fresh data is never stale
177
+ });
178
+ }
179
+ /**
180
+ * Mark a query as stale (needs revalidation)
181
+ */
182
+ invalidateQuery(queryKey) {
183
+ const registry = this.getRegistry();
184
+ if (!registry)
185
+ return;
186
+ if (registry.queries[queryKey]) {
187
+ // Keep the data but mark as needing revalidation
188
+ registry.queries[queryKey].lastServerChange = Date.now();
189
+ this.saveRegistry(registry);
190
+ console.debug("Query marked as stale in storage", {
191
+ queryKey,
192
+ });
193
+ }
194
+ }
195
+ /**
196
+ * Mark a query as stale for testing (simulates server-side changes)
197
+ */
198
+ markQueryStaleForTesting(queryKey) {
199
+ const registry = this.getRegistry();
200
+ if (!registry)
201
+ return;
202
+ if (registry.queries[queryKey]) {
203
+ // Simulate a server-side change by setting lastServerChange to future
204
+ registry.queries[queryKey].lastServerChange =
205
+ Date.now() + 1000; // 1 second in future
206
+ this.saveRegistry(registry);
207
+ console.debug("Query marked as stale for testing in storage", {
208
+ queryKey,
209
+ });
210
+ }
211
+ }
212
+ /**
213
+ * Invalidate queries based on table changes
214
+ */
215
+ invalidateByTable(table, relations) {
216
+ const registry = this.getRegistry();
217
+ if (!registry)
218
+ return;
219
+ const now = Date.now();
220
+ let hasChanges = false;
221
+ // Find all queries that depend on this table
222
+ Object.keys(registry.queries).forEach((queryKey) => {
223
+ // Simple heuristic: if query key contains table name or related tables
224
+ const relatedTables = relations[table] || [];
225
+ const allTables = [
226
+ table,
227
+ ...relatedTables,
228
+ ];
229
+ const shouldInvalidate = allTables.some((tableName) => queryKey
230
+ .toLowerCase()
231
+ .includes(tableName.toLowerCase()));
232
+ if (shouldInvalidate) {
233
+ registry.queries[queryKey].lastServerChange = now;
234
+ hasChanges = true;
235
+ }
236
+ });
237
+ if (hasChanges) {
238
+ registry.session.lastSync = now;
239
+ this.saveRegistry(registry);
240
+ }
241
+ }
242
+ /**
243
+ * Get cached data for a query
244
+ */
245
+ getCachedData(queryKey) {
246
+ const registry = this.getRegistry();
247
+ if (!registry)
248
+ return null;
249
+ const queryData = registry.queries[queryKey];
250
+ if (!queryData)
251
+ return null;
252
+ const isStale = queryData.lastServerChange !==
253
+ undefined &&
254
+ queryData.lastServerChange >
255
+ queryData.lastRevalidated;
256
+ console.debug("Getting cached data from storage", {
257
+ queryKey,
258
+ isStale,
259
+ lastRevalidated: queryData.lastRevalidated,
260
+ lastServerChange: queryData.lastServerChange,
261
+ timestamp: Date.now(),
262
+ });
263
+ // Read data from its own entry key
264
+ let data = undefined;
265
+ try {
266
+ const entryKey = this.getEntryKey(this.organizationId, queryKey);
267
+ const raw = localStorage.getItem(entryKey) ||
268
+ localStorage.getItem(this.getLegacyEntryKey(this.organizationId, queryKey));
269
+ if (raw) {
270
+ const parsed = JSON.parse(raw);
271
+ data = parsed?.data;
272
+ }
273
+ }
274
+ catch (e) {
275
+ console.warn("Failed to read entry from localStorage", {
276
+ queryKey,
277
+ error: e instanceof Error
278
+ ? e.message
279
+ : String(e),
280
+ });
281
+ }
282
+ return {
283
+ data,
284
+ isStale,
285
+ lastRevalidated: queryData.lastRevalidated,
286
+ };
287
+ }
288
+ /**
289
+ * Detect session gaps and queries that need revalidation
290
+ */
291
+ detectSessionGap() {
292
+ const registry = this.getRegistry();
293
+ if (!registry) {
294
+ return {
295
+ hasGap: true,
296
+ gapDuration: 0,
297
+ staleQueries: [],
298
+ };
299
+ }
300
+ const now = Date.now();
301
+ const gapDuration = now - registry.session.lastSync;
302
+ const hasGap = gapDuration > 30000; // 30 seconds threshold
303
+ const staleQueries = [];
304
+ if (hasGap) {
305
+ // All queries are potentially stale after a gap
306
+ Object.keys(registry.queries).forEach((queryKey) => {
307
+ staleQueries.push(queryKey);
308
+ });
309
+ }
310
+ else {
311
+ // Only queries with server changes are stale
312
+ Object.entries(registry.queries).forEach(([queryKey, queryData]) => {
313
+ if (queryData.lastServerChange &&
314
+ queryData.lastServerChange >
315
+ queryData.lastRevalidated) {
316
+ staleQueries.push(queryKey);
317
+ }
318
+ });
319
+ }
320
+ return {
321
+ hasGap,
322
+ gapDuration,
323
+ staleQueries,
324
+ };
325
+ }
326
+ /**
327
+ * Register an active hook for priority revalidation
328
+ */
329
+ registerActiveHook(queryKey, dependencies, organizationId) {
330
+ this.activeHooks.set(queryKey, {
331
+ queryKey,
332
+ isActive: true,
333
+ lastAccess: Date.now(),
334
+ dependencies,
335
+ organizationId,
336
+ });
337
+ }
338
+ /**
339
+ * Unregister an active hook
340
+ */
341
+ unregisterActiveHook(queryKey) {
342
+ this.activeHooks.delete(queryKey);
343
+ }
344
+ /**
345
+ * Get active hooks for priority revalidation
346
+ */
347
+ getActiveHooks() {
348
+ return Array.from(this.activeHooks.values());
349
+ }
350
+ /**
351
+ * Get active hooks sorted by priority (most recent access first)
352
+ */
353
+ getActiveHooksByPriority() {
354
+ return this.getActiveHooks().sort((a, b) => b.lastAccess - a.lastAccess);
355
+ }
356
+ /**
357
+ * Update real-time connection status
358
+ */
359
+ updateRealtimeStatus(connected) {
360
+ const registry = this.getRegistry();
361
+ if (!registry)
362
+ return;
363
+ registry.session.realtimeConnected =
364
+ connected;
365
+ registry.session.lastSync =
366
+ Date.now();
367
+ this.saveRegistry(registry);
368
+ }
369
+ /**
370
+ * Get queries that should be revalidated first (active hooks)
371
+ */
372
+ getPriorityQueries() {
373
+ const activeHooks = this.getActiveHooksByPriority();
374
+ return activeHooks.map((hook) => hook.queryKey);
375
+ }
376
+ /**
377
+ * Get background queries that can be revalidated later
378
+ */
379
+ getBackgroundQueries() {
380
+ const registry = this.getRegistry();
381
+ if (!registry)
382
+ return [];
383
+ const activeQueryKeys = new Set(this.getPriorityQueries());
384
+ return Object.keys(registry.queries).filter((key) => !activeQueryKeys.has(key));
385
+ }
386
+ /**
387
+ * Clean up expired entries to free up localStorage space
388
+ */
389
+ cleanupExpiredEntries() {
390
+ const registry = this.getRegistry();
391
+ if (!registry)
392
+ return;
393
+ const now = Date.now();
394
+ const maxAge = 24 * 60 * 60 * 1000; // 24 hours
395
+ let hasChanges = false;
396
+ Object.keys(registry.queries).forEach((queryKey) => {
397
+ const queryData = registry.queries[queryKey];
398
+ if (now -
399
+ queryData.lastRevalidated >
400
+ maxAge) {
401
+ delete registry.queries[queryKey];
402
+ hasChanges = true;
403
+ }
404
+ });
405
+ if (hasChanges) {
406
+ this.saveRegistry(registry);
407
+ }
408
+ }
409
+ /**
410
+ * Clean up old entries when localStorage is full
411
+ */
412
+ cleanupOldEntries() {
413
+ const registry = this.getRegistry();
414
+ if (!registry)
415
+ return;
416
+ const entries = Object.entries(registry.queries);
417
+ if (entries.length === 0)
418
+ return;
419
+ // Remove oldest 50% of entries
420
+ entries.sort(([, a], [, b]) => a.lastRevalidated -
421
+ b.lastRevalidated);
422
+ const keepCount = Math.ceil(entries.length / 2);
423
+ const newQueries = {};
424
+ entries
425
+ .slice(-keepCount)
426
+ .forEach(([key, value]) => {
427
+ newQueries[key] = value;
428
+ });
429
+ registry.queries = newQueries;
430
+ this.saveRegistry(registry);
431
+ console.debug("Cleaned up old entries from storage", {
432
+ keptCount: keepCount,
433
+ totalEntries: entries.length,
434
+ });
435
+ }
436
+ /**
437
+ * Generate a unique session ID
438
+ */
439
+ generateSessionId() {
440
+ return `session_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;
441
+ }
442
+ /**
443
+ * Get session information
444
+ */
445
+ getSessionInfo() {
446
+ const registry = this.getRegistry();
447
+ return registry?.session || null;
448
+ }
449
+ /**
450
+ * Clear all stored data for this organization
451
+ */
452
+ clearRegistry() {
453
+ try {
454
+ // Remove index and all known entries for this org
455
+ const registry = this.getRegistry();
456
+ if (registry) {
457
+ Object.keys(registry.queries).forEach((queryKey) => {
458
+ const entryKey = this.getEntryKey(this.organizationId, queryKey);
459
+ localStorage.removeItem(entryKey);
460
+ localStorage.removeItem(this.getLegacyEntryKey(this.organizationId, queryKey));
461
+ });
462
+ }
463
+ localStorage.removeItem(this.indexKey);
464
+ console.debug("Cleared all registry data for organization", {
465
+ organizationId: this.organizationId,
466
+ });
467
+ }
468
+ catch (error) {
469
+ console.warn("Failed to clear registry", {
470
+ error: error instanceof Error
471
+ ? error.message
472
+ : String(error),
473
+ });
474
+ }
475
+ }
476
+ /**
477
+ * Export registry for debugging
478
+ */
479
+ exportRegistry() {
480
+ return this.getRegistry();
481
+ }
482
+ }
483
+ /**
484
+ * Create a storage instance for an organization
485
+ */
486
+ export function createReactiveStorage(organizationId) {
487
+ return new ReactiveStorage(organizationId);
488
+ }
489
+ //# sourceMappingURL=storage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"storage.js","sourceRoot":"","sources":["../../src/client/storage.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import React from 'react';
2
+ type RelationsMap = Record<string, string[]>;
3
+ export declare function createTrpcRevalidateFn(trpcClient: any): (compositeKey: string) => Promise<any>;
4
+ interface TrpcReactiveProviderProps {
5
+ children: React.ReactNode;
6
+ organizationId: string;
7
+ relations: RelationsMap;
8
+ trpcClient: any;
9
+ }
10
+ export declare function TrpcReactiveProvider({ children, organizationId, relations, trpcClient, }: TrpcReactiveProviderProps): import("react/jsx-runtime").JSX.Element;
11
+ export {};
12
+ //# sourceMappingURL=trpc.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trpc.d.ts","sourceRoot":"","sources":["../../src/client/trpc.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,MAAM,OAAO,CAAA;AAGzB,KAAK,YAAY,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAA;AAE5C,wBAAgB,sBAAsB,CAAC,UAAU,EAAE,GAAG,IACtC,cAAc,MAAM,kBAanC;AAED,UAAU,yBAAyB;IACjC,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;IACzB,cAAc,EAAE,MAAM,CAAA;IACtB,SAAS,EAAE,YAAY,CAAA;IACvB,UAAU,EAAE,GAAG,CAAA;CAChB;AAED,wBAAgB,oBAAoB,CAAC,EACnC,QAAQ,EACR,cAAc,EACd,SAAS,EACT,UAAU,GACX,EAAE,yBAAyB,2CAa3B"}
@@ -0,0 +1,29 @@
1
+ 'use client';
2
+ import { jsx as _jsx } from "react/jsx-runtime";
3
+ import React from 'react';
4
+ import { ReactiveProvider } from './provider.js';
5
+ export function createTrpcRevalidateFn(trpcClient) {
6
+ return async (compositeKey) => {
7
+ const [name, inputJson] = compositeKey.split('::');
8
+ const input = inputJson ? JSON.parse(inputJson) : undefined;
9
+ const parts = name.split('.');
10
+ let cursor = trpcClient;
11
+ for (const part of parts)
12
+ cursor = cursor?.[part];
13
+ if (cursor?.query)
14
+ return await cursor.query(input);
15
+ if (cursor?.mutate)
16
+ return await cursor.mutate(input);
17
+ throw new Error(`Unknown tRPC procedure for key: ${name}`);
18
+ };
19
+ }
20
+ export function TrpcReactiveProvider({ children, organizationId, relations, trpcClient, }) {
21
+ const revalidateFn = React.useMemo(() => createTrpcRevalidateFn(trpcClient), [trpcClient]);
22
+ const config = {
23
+ relations,
24
+ organizationId,
25
+ revalidateFn,
26
+ };
27
+ return _jsx(ReactiveProvider, { config: config, children: children });
28
+ }
29
+ //# sourceMappingURL=trpc.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trpc.js","sourceRoot":"","sources":["../../src/client/trpc.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAA;;AAEZ,OAAO,KAAK,MAAM,OAAO,CAAA;AACzB,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAA;AAIhD,MAAM,UAAU,sBAAsB,CAAC,UAAe;IACpD,OAAO,KAAK,EAAE,YAAoB,EAAE,EAAE;QACpC,MAAM,CAAC,IAAI,EAAE,SAAS,CAAC,GAAG,YAAY,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;QAClD,MAAM,KAAK,GAAG,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;QAE3D,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;QAC7B,IAAI,MAAM,GAAQ,UAAU,CAAA;QAC5B,KAAK,MAAM,IAAI,IAAI,KAAK;YAAE,MAAM,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,CAAA;QAEjD,IAAI,MAAM,EAAE,KAAK;YAAE,OAAO,MAAM,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAA;QACnD,IAAI,MAAM,EAAE,MAAM;YAAE,OAAO,MAAM,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;QAErD,MAAM,IAAI,KAAK,CAAC,mCAAmC,IAAI,EAAE,CAAC,CAAA;IAC5D,CAAC,CAAA;AACH,CAAC;AASD,MAAM,UAAU,oBAAoB,CAAC,EACnC,QAAQ,EACR,cAAc,EACd,SAAS,EACT,UAAU,GACgB;IAC1B,MAAM,YAAY,GAAG,KAAK,CAAC,OAAO,CAChC,GAAG,EAAE,CAAC,sBAAsB,CAAC,UAAU,CAAC,EACxC,CAAC,UAAU,CAAC,CACb,CAAA;IAED,MAAM,MAAM,GAAG;QACb,SAAS;QACT,cAAc;QACd,YAAY;KACb,CAAA;IAED,OAAO,KAAC,gBAAgB,IAAC,MAAM,EAAE,MAAM,YAAG,QAAQ,GAAoB,CAAA;AACxE,CAAC"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Client-side types
3
+ */
4
+ export interface UseReactiveResult<T> {
5
+ data: T | undefined;
6
+ isLoading: boolean;
7
+ isStale: boolean;
8
+ error: Error | null;
9
+ }
10
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/client/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,WAAW,iBAAiB,CAAC,CAAC;IAClC,IAAI,EAAE,CAAC,GAAG,SAAS,CAAA;IACnB,SAAS,EAAE,OAAO,CAAA;IAClB,OAAO,EAAE,OAAO,CAAA;IAChB,KAAK,EAAE,KAAK,GAAG,IAAI,CAAA;CACpB"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/client/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Client-only exports for @agelum/backend
3
+ * Import this with: import { ... } from '@agelum/backend/client'
4
+ */
5
+ export { ReactiveProvider, useReactiveContext, } from "./client/provider.js";
6
+ export { useReactive, useReactiveQuery, initializeReactiveClient, } from "./client/hooks.js";
7
+ export { ReactiveClientManager } from "./client/manager.js";
8
+ export { TrpcReactiveProvider, createTrpcRevalidateFn, } from "./client/trpc.js";
9
+ export { LocalStorageProvider } from "./providers/localStorage.js";
10
+ export type { UseReactiveResult } from "./client/types.js";
11
+ export declare const version = "0.1.0";
12
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EACL,gBAAgB,EAChB,kBAAkB,GACnB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EACL,WAAW,EACX,gBAAgB,EAChB,wBAAwB,GACzB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EACL,oBAAoB,EACpB,sBAAsB,GACvB,MAAM,kBAAkB,CAAC;AAG1B,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AAGnE,YAAY,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAG3D,eAAO,MAAM,OAAO,UAAU,CAAC"}
package/dist/client.js ADDED
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Client-only exports for @agelum/backend
3
+ * Import this with: import { ... } from '@agelum/backend/client'
4
+ */
5
+ // Essential client-side exports
6
+ export { ReactiveProvider, useReactiveContext, } from "./client/provider.js";
7
+ export { useReactive, useReactiveQuery, initializeReactiveClient, } from "./client/hooks.js";
8
+ export { ReactiveClientManager } from "./client/manager.js";
9
+ export { TrpcReactiveProvider, createTrpcRevalidateFn, } from "./client/trpc.js";
10
+ // Storage providers for client
11
+ export { LocalStorageProvider } from "./providers/localStorage.js";
12
+ // Version
13
+ export const version = "0.1.0";
14
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,gCAAgC;AAChC,OAAO,EACL,gBAAgB,EAChB,kBAAkB,GACnB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EACL,WAAW,EACX,gBAAgB,EAChB,wBAAwB,GACzB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EACL,oBAAoB,EACpB,sBAAsB,GACvB,MAAM,kBAAkB,CAAC;AAE1B,+BAA+B;AAC/B,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AAKnE,UAAU;AACV,MAAM,CAAC,MAAM,OAAO,GAAG,OAAO,CAAC"}