@reifydb/react 0.4.7 → 0.4.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { Column, SchemaNode, InferSchema } from '@reifydb/core';
1
+ import { Column, ShapeNode, InferShape } from '@reifydb/core';
2
2
  export * from '@reifydb/core';
3
3
  import { WsClientOptions, WsClient, HttpClient, JsonHttpClient, JsonWebsocketClient } from '@reifydb/client';
4
4
  export * from '@reifydb/client';
@@ -22,6 +22,7 @@ declare const DEFAULT_URL = "ws://127.0.0.1:8090";
22
22
  declare class Connection {
23
23
  private state;
24
24
  private config;
25
+ private connectPromise;
25
26
  constructor(config?: ConnectionConfig);
26
27
  setConfig(config: ConnectionConfig): void;
27
28
  getConfig(): ConnectionConfig;
@@ -86,21 +87,21 @@ declare function useQueryExecutor<T = any>(options?: QueryExecutorOptions): {
86
87
  results: QueryResult<T>[] | undefined;
87
88
  error: string | undefined;
88
89
  executionTime: number | undefined;
89
- query: (statements: string | string[], params?: any, schemas?: readonly SchemaNode[]) => Promise<void>;
90
+ query: (statements: string | string[], params?: any, shapes?: readonly ShapeNode[]) => Promise<void>;
90
91
  cancelQuery: () => void;
91
92
  };
92
93
 
93
94
  interface QueryOptions extends QueryExecutorOptions {
94
95
  connectionConfig?: ConnectionConfig;
95
96
  }
96
- declare function useQueryOne<S extends SchemaNode = any>(rql: string, params?: any, schema?: S, options?: QueryOptions): {
97
+ declare function useQueryOne<S extends ShapeNode = any>(rql: string, params?: any, shape?: S, options?: QueryOptions): {
97
98
  isExecuting: boolean;
98
- result: QueryResult<S extends SchemaNode ? InferSchema<S> : any> | undefined;
99
+ result: QueryResult<S extends ShapeNode ? InferShape<S> : any> | undefined;
99
100
  error: string | undefined;
100
101
  };
101
- declare function useQueryMany<S extends readonly SchemaNode[] = readonly SchemaNode[]>(statements: string | string[], params?: any, schemas?: S, options?: QueryOptions): {
102
+ declare function useQueryMany<S extends readonly ShapeNode[] = readonly ShapeNode[]>(statements: string | string[], params?: any, shapes?: S, options?: QueryOptions): {
102
103
  isExecuting: boolean;
103
- results: QueryResult<S extends readonly SchemaNode[] ? InferSchema<S[number]> : any>[] | undefined;
104
+ results: QueryResult<S extends readonly ShapeNode[] ? InferShape<S[number]> : any>[] | undefined;
104
105
  error: string | undefined;
105
106
  };
106
107
 
@@ -124,21 +125,21 @@ declare function useCommandExecutor<T = any>(options?: CommandExecutorOptions):
124
125
  results: CommandResult<T>[] | undefined;
125
126
  error: string | undefined;
126
127
  executionTime: number | undefined;
127
- command: (statements: string | string[], params?: any, schemas?: readonly SchemaNode[]) => Promise<void>;
128
+ command: (statements: string | string[], params?: any, shapes?: readonly ShapeNode[]) => Promise<void>;
128
129
  cancelCommand: () => void;
129
130
  };
130
131
 
131
132
  interface CommandOptions extends CommandExecutorOptions {
132
133
  connectionConfig?: ConnectionConfig;
133
134
  }
134
- declare function useCommandOne<S extends SchemaNode = any>(statement: string, params?: any, schema?: S, options?: CommandOptions): {
135
+ declare function useCommandOne<S extends ShapeNode = any>(statement: string, params?: any, shape?: S, options?: CommandOptions): {
135
136
  isExecuting: boolean;
136
- result: CommandResult<S extends SchemaNode ? InferSchema<S> : any> | undefined;
137
+ result: CommandResult<S extends ShapeNode ? InferShape<S> : any> | undefined;
137
138
  error: string | undefined;
138
139
  };
139
- declare function useCommandMany<S extends readonly SchemaNode[] = readonly SchemaNode[]>(statements: string | string[], params?: any, schemas?: S, options?: CommandOptions): {
140
+ declare function useCommandMany<S extends readonly ShapeNode[] = readonly ShapeNode[]>(statements: string | string[], params?: any, shapes?: S, options?: CommandOptions): {
140
141
  isExecuting: boolean;
141
- results: CommandResult<S extends readonly SchemaNode[] ? InferSchema<S[number]> : any>[] | undefined;
142
+ results: CommandResult<S extends readonly ShapeNode[] ? InferShape<S[number]> : any>[] | undefined;
142
143
  error: string | undefined;
143
144
  };
144
145
 
@@ -162,21 +163,21 @@ declare function useAdminExecutor<T = any>(options?: AdminExecutorOptions): {
162
163
  results: AdminResult<T>[] | undefined;
163
164
  error: string | undefined;
164
165
  executionTime: number | undefined;
165
- admin: (statements: string | string[], params?: any, schemas?: readonly SchemaNode[]) => Promise<void>;
166
+ admin: (statements: string | string[], params?: any, shapes?: readonly ShapeNode[]) => Promise<void>;
166
167
  cancelAdmin: () => void;
167
168
  };
168
169
 
169
170
  interface AdminOptions extends AdminExecutorOptions {
170
171
  connectionConfig?: ConnectionConfig;
171
172
  }
172
- declare function useAdminOne<S extends SchemaNode = any>(statement: string, params?: any, schema?: S, options?: AdminOptions): {
173
+ declare function useAdminOne<S extends ShapeNode = any>(statement: string, params?: any, shape?: S, options?: AdminOptions): {
173
174
  isExecuting: boolean;
174
- result: AdminResult<S extends SchemaNode ? InferSchema<S> : any> | undefined;
175
+ result: AdminResult<S extends ShapeNode ? InferShape<S> : any> | undefined;
175
176
  error: string | undefined;
176
177
  };
177
- declare function useAdminMany<S extends readonly SchemaNode[] = readonly SchemaNode[]>(statements: string | string[], params?: any, schemas?: S, options?: AdminOptions): {
178
+ declare function useAdminMany<S extends readonly ShapeNode[] = readonly ShapeNode[]>(statements: string | string[], params?: any, shapes?: S, options?: AdminOptions): {
178
179
  isExecuting: boolean;
179
- results: AdminResult<S extends readonly SchemaNode[] ? InferSchema<S[number]> : any>[] | undefined;
180
+ results: AdminResult<S extends readonly ShapeNode[] ? InferShape<S[number]> : any>[] | undefined;
180
181
  error: string | undefined;
181
182
  };
182
183
 
@@ -198,7 +199,7 @@ interface SubscriptionState<T> {
198
199
  }
199
200
  declare function useSubscriptionExecutor<T = any>(options?: SubscriptionExecutorOptions): {
200
201
  state: SubscriptionState<T>;
201
- subscribe: (query: string, params?: any, schema?: SchemaNode) => Promise<void>;
202
+ subscribe: (query: string, params?: any, shape?: ShapeNode) => Promise<void>;
202
203
  unsubscribe: () => Promise<void>;
203
204
  clearChanges: () => void;
204
205
  clearData: () => void;
@@ -207,9 +208,9 @@ declare function useSubscriptionExecutor<T = any>(options?: SubscriptionExecutor
207
208
  interface SubscriptionOptions extends SubscriptionExecutorOptions {
208
209
  enabled?: boolean;
209
210
  }
210
- declare function useSubscription<S extends SchemaNode = any>(query: string, params?: any, schema?: S, options?: SubscriptionOptions): {
211
- data: InferSchema<S>[];
212
- changes: ChangeEvent<InferSchema<S>>[];
211
+ declare function useSubscription<S extends ShapeNode = any>(query: string, params?: any, shape?: S, options?: SubscriptionOptions): {
212
+ data: InferShape<S>[];
213
+ changes: ChangeEvent<InferShape<S>>[];
213
214
  isSubscribed: boolean;
214
215
  isSubscribing: boolean;
215
216
  error: string | undefined;
@@ -224,6 +225,6 @@ interface TableInfo {
224
225
  name: string;
225
226
  columns: ColumnInfo[];
226
227
  }
227
- declare function useSchema(): [boolean, TableInfo[], string | undefined];
228
+ declare function useShape(): [boolean, TableInfo[], string | undefined];
228
229
 
229
- export { type AdminExecutorOptions, type AdminOptions, type AdminResult, type AdminState, type ChangeEvent, type ColumnInfo, type CommandExecutorOptions, type CommandOptions, type CommandResult, type CommandState, Connection, type ConnectionConfig, ConnectionContext, ConnectionProvider, type ConnectionProviderProps, DEFAULT_CONFIG, DEFAULT_URL, type QueryExecutorOptions, type QueryOptions, type QueryResult, type QueryState, type SubscriptionExecutorOptions, type SubscriptionOptions, type SubscriptionState, type TableInfo, clearConnection, getConnection, useAdminExecutor, useAdminMany, useAdminOne, useCommandExecutor, useCommandMany, useCommandOne, useConnection, useQueryExecutor, useQueryMany, useQueryOne, useSchema, useSubscription, useSubscriptionExecutor };
230
+ export { type AdminExecutorOptions, type AdminOptions, type AdminResult, type AdminState, type ChangeEvent, type ColumnInfo, type CommandExecutorOptions, type CommandOptions, type CommandResult, type CommandState, Connection, type ConnectionConfig, ConnectionContext, ConnectionProvider, type ConnectionProviderProps, DEFAULT_CONFIG, DEFAULT_URL, type QueryExecutorOptions, type QueryOptions, type QueryResult, type QueryState, type SubscriptionExecutorOptions, type SubscriptionOptions, type SubscriptionState, type TableInfo, clearConnection, getConnection, useAdminExecutor, useAdminMany, useAdminOne, useCommandExecutor, useCommandMany, useCommandOne, useConnection, useQueryExecutor, useQueryMany, useQueryOne, useShape, useSubscription, useSubscriptionExecutor };
package/dist/index.js CHANGED
@@ -18,6 +18,7 @@ var Connection = class {
18
18
  connectionError: null,
19
19
  listeners: /* @__PURE__ */ new Set()
20
20
  };
21
+ this.connectPromise = null;
21
22
  this.config = { ...DEFAULT_CONFIG, ...config };
22
23
  }
23
24
  setConfig(config) {
@@ -27,43 +28,52 @@ var Connection = class {
27
28
  return this.config;
28
29
  }
29
30
  async connect(url, options) {
30
- if (this.state.isConnected || this.state.isConnecting) {
31
+ if (this.state.isConnected) {
31
32
  return;
32
33
  }
34
+ if (this.connectPromise) {
35
+ return this.connectPromise;
36
+ }
33
37
  const connectUrl = url || this.config.url || DEFAULT_CONFIG.url;
34
38
  const connectOptions = { token: this.config.token, ...this.config.options, ...options };
35
39
  this.updateState({
36
40
  isConnecting: true,
37
41
  connectionError: null
38
42
  });
39
- try {
40
- const isHttp = connectUrl.startsWith("http://") || connectUrl.startsWith("https://");
41
- const isJson = this.config.format === "json";
42
- let client;
43
- if (isHttp) {
44
- client = isJson ? Client.connect_json_http(connectUrl, connectOptions) : Client.connect_http(connectUrl, connectOptions);
45
- } else {
46
- client = isJson ? await Client.connect_json_ws(connectUrl, connectOptions) : await Client.connect_ws(connectUrl, connectOptions);
43
+ this.connectPromise = (async () => {
44
+ try {
45
+ const isHttp = connectUrl.startsWith("http://") || connectUrl.startsWith("https://");
46
+ const isJson = this.config.format === "json";
47
+ let client;
48
+ if (isHttp) {
49
+ client = isJson ? Client.connect_json_http(connectUrl, connectOptions) : Client.connect_http(connectUrl, connectOptions);
50
+ } else {
51
+ client = isJson ? await Client.connect_json_ws(connectUrl, connectOptions) : await Client.connect_ws(connectUrl, connectOptions);
52
+ }
53
+ this.updateState({
54
+ client,
55
+ isConnected: true,
56
+ isConnecting: false,
57
+ connectionError: null
58
+ });
59
+ } catch (err) {
60
+ const errorMessage = err instanceof Error ? err.message : "Failed to connect to ReifyDB";
61
+ console.error("[Connection] Connection failed:", errorMessage, err);
62
+ this.updateState({
63
+ client: null,
64
+ isConnected: false,
65
+ isConnecting: false,
66
+ connectionError: errorMessage
67
+ });
68
+ throw err;
69
+ } finally {
70
+ this.connectPromise = null;
47
71
  }
48
- this.updateState({
49
- client,
50
- isConnected: true,
51
- isConnecting: false,
52
- connectionError: null
53
- });
54
- } catch (err) {
55
- const errorMessage = err instanceof Error ? err.message : "Failed to connect to ReifyDB";
56
- console.error("[Connection] Connection failed:", errorMessage, err);
57
- this.updateState({
58
- client: null,
59
- isConnected: false,
60
- isConnecting: false,
61
- connectionError: errorMessage
62
- });
63
- throw err;
64
- }
72
+ })();
73
+ return this.connectPromise;
65
74
  }
66
75
  async disconnect() {
76
+ this.connectPromise = null;
67
77
  if (this.state.client) {
68
78
  try {
69
79
  if ("disconnect" in this.state.client) {
@@ -219,10 +229,10 @@ function useQueryExecutor(options) {
219
229
  const executionIdRef = useRef2(0);
220
230
  const pendingRef = useRef2(null);
221
231
  const query = useCallback(
222
- (statements, params, schemas) => {
232
+ (statements, params, shapes) => {
223
233
  const currentClient = clientRef.current;
224
234
  if (!currentClient) {
225
- pendingRef.current = { statements, params, schemas };
235
+ pendingRef.current = { statements, params, shapes };
226
236
  setState((prev) => ({ ...prev, isExecuting: true, error: void 0 }));
227
237
  return Promise.resolve();
228
238
  }
@@ -232,7 +242,7 @@ function useQueryExecutor(options) {
232
242
  const startTime = Date.now();
233
243
  return (async () => {
234
244
  try {
235
- const frameResults = await currentClient.query(statements, params || null, schemas || []) || [];
245
+ const frameResults = await currentClient.query(statements, params || null, shapes || []) || [];
236
246
  if (executionIdRef.current !== thisExecution) return;
237
247
  const executionTime = Date.now() - startTime;
238
248
  const results = frameResults.map((frame) => {
@@ -303,8 +313,8 @@ function useQueryExecutor(options) {
303
313
  );
304
314
  useEffect3(() => {
305
315
  if (client && pendingRef.current) {
306
- const { statements, params, schemas } = pendingRef.current;
307
- query(statements, params, schemas);
316
+ const { statements, params, shapes } = pendingRef.current;
317
+ query(statements, params, shapes);
308
318
  }
309
319
  }, [client, query]);
310
320
  const cancelQuery = useCallback(() => {
@@ -327,7 +337,7 @@ function useQueryExecutor(options) {
327
337
 
328
338
  // src/hooks/use-query.ts
329
339
  import { useEffect as useEffect4, useMemo } from "react";
330
- function useQueryOne(rql, params, schema, options) {
340
+ function useQueryOne(rql, params, shape, options) {
331
341
  const {
332
342
  isExecuting,
333
343
  results,
@@ -335,15 +345,15 @@ function useQueryOne(rql, params, schema, options) {
335
345
  query
336
346
  } = useQueryExecutor(options);
337
347
  useEffect4(() => {
338
- const schemas = schema ? [schema] : void 0;
339
- query(rql, params, schemas);
348
+ const shapes = shape ? [shape] : void 0;
349
+ query(rql, params, shapes);
340
350
  }, [rql, params, query]);
341
351
  const result = useMemo(() => {
342
352
  return results && results.length > 0 ? results[0] : void 0;
343
353
  }, [results]);
344
354
  return { isExecuting, result, error };
345
355
  }
346
- function useQueryMany(statements, params, schemas, options) {
356
+ function useQueryMany(statements, params, shapes, options) {
347
357
  const {
348
358
  isExecuting,
349
359
  results,
@@ -351,7 +361,7 @@ function useQueryMany(statements, params, schemas, options) {
351
361
  query
352
362
  } = useQueryExecutor(options);
353
363
  useEffect4(() => {
354
- query(statements, params, schemas);
364
+ query(statements, params, shapes);
355
365
  }, [statements, params, query]);
356
366
  return { isExecuting, results, error };
357
367
  }
@@ -378,10 +388,10 @@ function useCommandExecutor(options) {
378
388
  const executionIdRef = useRef3(0);
379
389
  const pendingRef = useRef3(null);
380
390
  const command = useCallback2(
381
- (statements, params, schemas) => {
391
+ (statements, params, shapes) => {
382
392
  const currentClient = clientRef.current;
383
393
  if (!currentClient) {
384
- pendingRef.current = { statements, params, schemas };
394
+ pendingRef.current = { statements, params, shapes };
385
395
  setState((prev) => ({ ...prev, isExecuting: true, error: void 0 }));
386
396
  return Promise.resolve();
387
397
  }
@@ -391,7 +401,7 @@ function useCommandExecutor(options) {
391
401
  const startTime = Date.now();
392
402
  return (async () => {
393
403
  try {
394
- const frameResults = await currentClient.command(statements, params || null, schemas || []) || [];
404
+ const frameResults = await currentClient.command(statements, params || null, shapes || []) || [];
395
405
  if (executionIdRef.current !== thisExecution) return;
396
406
  const executionTime = Date.now() - startTime;
397
407
  const results = frameResults.map((frame) => {
@@ -463,8 +473,8 @@ function useCommandExecutor(options) {
463
473
  );
464
474
  useEffect5(() => {
465
475
  if (client && pendingRef.current) {
466
- const { statements, params, schemas } = pendingRef.current;
467
- command(statements, params, schemas);
476
+ const { statements, params, shapes } = pendingRef.current;
477
+ command(statements, params, shapes);
468
478
  }
469
479
  }, [client, command]);
470
480
  const cancelCommand = useCallback2(() => {
@@ -487,7 +497,7 @@ function useCommandExecutor(options) {
487
497
 
488
498
  // src/hooks/use-command.ts
489
499
  import { useEffect as useEffect6, useMemo as useMemo2 } from "react";
490
- function useCommandOne(statement, params, schema, options) {
500
+ function useCommandOne(statement, params, shape, options) {
491
501
  const {
492
502
  isExecuting,
493
503
  results,
@@ -495,15 +505,15 @@ function useCommandOne(statement, params, schema, options) {
495
505
  command
496
506
  } = useCommandExecutor(options);
497
507
  useEffect6(() => {
498
- const schemas = schema ? [schema] : void 0;
499
- command(statement, params, schemas);
508
+ const shapes = shape ? [shape] : void 0;
509
+ command(statement, params, shapes);
500
510
  }, [statement, params, command]);
501
511
  const result = useMemo2(() => {
502
512
  return results && results.length > 0 ? results[0] : void 0;
503
513
  }, [results]);
504
514
  return { isExecuting, result, error };
505
515
  }
506
- function useCommandMany(statements, params, schemas, options) {
516
+ function useCommandMany(statements, params, shapes, options) {
507
517
  const {
508
518
  isExecuting,
509
519
  results,
@@ -511,7 +521,7 @@ function useCommandMany(statements, params, schemas, options) {
511
521
  command
512
522
  } = useCommandExecutor(options);
513
523
  useEffect6(() => {
514
- command(statements, params, schemas);
524
+ command(statements, params, shapes);
515
525
  }, [statements, params, command]);
516
526
  return { isExecuting, results, error };
517
527
  }
@@ -538,10 +548,10 @@ function useAdminExecutor(options) {
538
548
  const executionIdRef = useRef4(0);
539
549
  const pendingRef = useRef4(null);
540
550
  const admin = useCallback3(
541
- (statements, params, schemas) => {
551
+ (statements, params, shapes) => {
542
552
  const currentClient = clientRef.current;
543
553
  if (!currentClient) {
544
- pendingRef.current = { statements, params, schemas };
554
+ pendingRef.current = { statements, params, shapes };
545
555
  setState((prev) => ({ ...prev, isExecuting: true, error: void 0 }));
546
556
  return Promise.resolve();
547
557
  }
@@ -551,7 +561,7 @@ function useAdminExecutor(options) {
551
561
  const startTime = Date.now();
552
562
  return (async () => {
553
563
  try {
554
- const frameResults = await currentClient.admin(statements, params || null, schemas || []) || [];
564
+ const frameResults = await currentClient.admin(statements, params || null, shapes || []) || [];
555
565
  if (executionIdRef.current !== thisExecution) return;
556
566
  const executionTime = Date.now() - startTime;
557
567
  const results = frameResults.map((frame) => {
@@ -624,8 +634,8 @@ function useAdminExecutor(options) {
624
634
  );
625
635
  useEffect7(() => {
626
636
  if (client && pendingRef.current) {
627
- const { statements, params, schemas } = pendingRef.current;
628
- admin(statements, params, schemas);
637
+ const { statements, params, shapes } = pendingRef.current;
638
+ admin(statements, params, shapes);
629
639
  }
630
640
  }, [client, admin]);
631
641
  const cancelAdmin = useCallback3(() => {
@@ -648,7 +658,7 @@ function useAdminExecutor(options) {
648
658
 
649
659
  // src/hooks/use-admin.ts
650
660
  import { useEffect as useEffect8, useMemo as useMemo3 } from "react";
651
- function useAdminOne(statement, params, schema, options) {
661
+ function useAdminOne(statement, params, shape, options) {
652
662
  const {
653
663
  isExecuting,
654
664
  results,
@@ -656,15 +666,15 @@ function useAdminOne(statement, params, schema, options) {
656
666
  admin
657
667
  } = useAdminExecutor(options);
658
668
  useEffect8(() => {
659
- const schemas = schema ? [schema] : void 0;
660
- admin(statement, params, schemas);
669
+ const shapes = shape ? [shape] : void 0;
670
+ admin(statement, params, shapes);
661
671
  }, [statement, params, admin]);
662
672
  const result = useMemo3(() => {
663
673
  return results && results.length > 0 ? results[0] : void 0;
664
674
  }, [results]);
665
675
  return { isExecuting, result, error };
666
676
  }
667
- function useAdminMany(statements, params, schemas, options) {
677
+ function useAdminMany(statements, params, shapes, options) {
668
678
  const {
669
679
  isExecuting,
670
680
  results,
@@ -672,7 +682,7 @@ function useAdminMany(statements, params, schemas, options) {
672
682
  admin
673
683
  } = useAdminExecutor(options);
674
684
  useEffect8(() => {
675
- admin(statements, params, schemas);
685
+ admin(statements, params, shapes);
676
686
  }, [statements, params, admin]);
677
687
  return { isExecuting, results, error };
678
688
  }
@@ -693,7 +703,7 @@ function useSubscriptionExecutor(options) {
693
703
  const subscriptionIdRef = useRef5(void 0);
694
704
  const queryRef = useRef5(void 0);
695
705
  const paramsRef = useRef5(void 0);
696
- const schemaRef = useRef5(void 0);
706
+ const shapeRef = useRef5(void 0);
697
707
  useEffect9(() => {
698
708
  clientRef.current = client;
699
709
  }, [client]);
@@ -721,7 +731,7 @@ function useSubscriptionExecutor(options) {
721
731
  const handleRemove = useCallback4((rows) => {
722
732
  addChangeEvent("REMOVE", rows);
723
733
  }, [addChangeEvent]);
724
- const subscribe = useCallback4(async (query, params, schema) => {
734
+ const subscribe = useCallback4(async (query, params, shape) => {
725
735
  const currentClient = clientRef.current;
726
736
  if (!currentClient) {
727
737
  setState((prev) => ({ ...prev, error: "Client not connected" }));
@@ -733,14 +743,14 @@ function useSubscriptionExecutor(options) {
733
743
  }
734
744
  queryRef.current = query;
735
745
  paramsRef.current = params;
736
- schemaRef.current = schema;
746
+ shapeRef.current = shape;
737
747
  setState((prev) => ({
738
748
  ...prev,
739
749
  isSubscribing: true,
740
750
  error: void 0
741
751
  }));
742
752
  try {
743
- const subId = await currentClient.subscribe(query, params, schema, {
753
+ const subId = await currentClient.subscribe(query, params, shape, {
744
754
  onInsert: handleInsert,
745
755
  onUpdate: handleUpdate,
746
756
  onRemove: handleRemove
@@ -769,7 +779,7 @@ function useSubscriptionExecutor(options) {
769
779
  subscriptionIdRef.current = void 0;
770
780
  queryRef.current = void 0;
771
781
  paramsRef.current = void 0;
772
- schemaRef.current = void 0;
782
+ shapeRef.current = void 0;
773
783
  setState((prev) => ({
774
784
  ...prev,
775
785
  isSubscribed: false,
@@ -806,7 +816,7 @@ function useSubscriptionExecutor(options) {
806
816
 
807
817
  // src/hooks/use-subscription.ts
808
818
  import { useEffect as useEffect10, useMemo as useMemo4 } from "react";
809
- function useSubscription(query, params, schema, options) {
819
+ function useSubscription(query, params, shape, options) {
810
820
  const {
811
821
  state,
812
822
  subscribe,
@@ -815,11 +825,11 @@ function useSubscription(query, params, schema, options) {
815
825
  const paramsKey = useMemo4(() => JSON.stringify(params), [params]);
816
826
  useEffect10(() => {
817
827
  if (options?.enabled === false) return;
818
- subscribe(query, params, schema);
828
+ subscribe(query, params, shape);
819
829
  return () => {
820
830
  unsubscribe();
821
831
  };
822
- }, [query, paramsKey, schema, options?.enabled, subscribe, unsubscribe]);
832
+ }, [query, paramsKey, shape, options?.enabled, subscribe, unsubscribe]);
823
833
  return {
824
834
  data: state.data,
825
835
  changes: state.changes,
@@ -830,52 +840,52 @@ function useSubscription(query, params, schema, options) {
830
840
  };
831
841
  }
832
842
 
833
- // src/hooks/use-schema.ts
843
+ // src/hooks/use-shape.ts
834
844
  import { useEffect as useEffect11, useState as useState6 } from "react";
835
- import { Schema } from "@reifydb/core";
836
- var namespaceSchema = Schema.object({
837
- id: Schema.number(),
838
- name: Schema.string()
845
+ import { Shape } from "@reifydb/core";
846
+ var namespaceShape = Shape.object({
847
+ id: Shape.number(),
848
+ name: Shape.string()
839
849
  });
840
- var tableSchema = Schema.object({
841
- id: Schema.number(),
842
- namespace_id: Schema.number(),
843
- name: Schema.string(),
844
- primary_key_id: Schema.number()
850
+ var tableShape = Shape.object({
851
+ id: Shape.number(),
852
+ namespace_id: Shape.number(),
853
+ name: Shape.string(),
854
+ primary_key_id: Shape.number()
845
855
  });
846
- var viewSchema = Schema.object({
847
- id: Schema.number(),
848
- namespace_id: Schema.number(),
849
- name: Schema.string()
856
+ var viewShape = Shape.object({
857
+ id: Shape.number(),
858
+ namespace_id: Shape.number(),
859
+ name: Shape.string()
850
860
  });
851
- var columnSchema = Schema.object({
852
- id: Schema.number(),
853
- source_id: Schema.number(),
854
- source_type: Schema.number(),
855
- name: Schema.string(),
856
- type: Schema.number(),
857
- position: Schema.number(),
858
- auto_increment: Schema.boolean()
861
+ var columnShape = Shape.object({
862
+ id: Shape.number(),
863
+ shape_id: Shape.number(),
864
+ shape_type: Shape.number(),
865
+ name: Shape.string(),
866
+ type: Shape.number(),
867
+ position: Shape.number(),
868
+ auto_increment: Shape.boolean()
859
869
  });
860
- function useSchema() {
870
+ function useShape() {
861
871
  const { isExecuting, results, error, query } = useQueryExecutor();
862
- const [schema, setSchema] = useState6([]);
872
+ const [shape, setShape] = useState6([]);
863
873
  const [isLoading, setIsLoading] = useState6(true);
864
874
  useEffect11(() => {
865
875
  if (!query) return;
866
- const fetchSchema = async () => {
876
+ const fetchShape = async () => {
867
877
  setIsLoading(true);
868
878
  try {
869
879
  await query(
870
- `OUTPUT FROM system::namespaces; OUTPUT FROM system::tables; OUTPUT FROM system::views; FROM system::columns;`,
880
+ `OUTPUT FROM system::namespaces; OUTPUT FROM system::tables; OUTPUT FROM system::views; OUTPUT FROM system::columns;`,
871
881
  void 0,
872
- [namespaceSchema, tableSchema, viewSchema, columnSchema]
882
+ [namespaceShape, tableShape, viewShape, columnShape]
873
883
  );
874
884
  } catch (err) {
875
- console.error("Failed to fetch schema:", err);
885
+ console.error("Failed to fetch shape:", err);
876
886
  }
877
887
  };
878
- fetchSchema();
888
+ fetchShape();
879
889
  }, [query]);
880
890
  useEffect11(() => {
881
891
  if (!results || results.length < 4) {
@@ -960,34 +970,34 @@ function useSchema() {
960
970
  };
961
971
  const tableColumnsMap = /* @__PURE__ */ new Map();
962
972
  columns.forEach((column) => {
963
- const sourceId = column.source_id?.valueOf();
964
- const sourceType = column.source_type?.valueOf();
973
+ const shapeId = column.shape_id?.valueOf();
974
+ const shapeType = column.shape_type?.valueOf();
965
975
  const columnName = column.name?.valueOf();
966
976
  const typeId = column.type?.valueOf();
967
977
  const position = column.position?.valueOf();
968
- if (sourceId === void 0 || !columnName || typeId === void 0) return;
969
- if (sourceType !== 0 && sourceType !== 1) return;
970
- if (!tableColumnsMap.has(sourceId)) {
971
- tableColumnsMap.set(sourceId, []);
978
+ if (shapeId === void 0 || !columnName || typeId === void 0) return;
979
+ if (shapeType !== 0 && shapeType !== 1) return;
980
+ if (!tableColumnsMap.has(shapeId)) {
981
+ tableColumnsMap.set(shapeId, []);
972
982
  }
973
- tableColumnsMap.get(sourceId).push({
983
+ tableColumnsMap.get(shapeId).push({
974
984
  name: columnName,
975
985
  dataType: typeMap[typeId] || `Unknown(${typeId})`,
976
986
  position: position ?? 0
977
987
  });
978
988
  });
979
- tableColumnsMap.forEach((cols, sourceId) => {
980
- const tableInfo = tableInfoMap.get(sourceId);
989
+ tableColumnsMap.forEach((cols, shapeId) => {
990
+ const tableInfo = tableInfoMap.get(shapeId);
981
991
  if (tableInfo) {
982
992
  cols.sort((a, b) => a.position - b.position);
983
993
  tableInfo.columns = cols.map((c) => ({ name: c.name, dataType: c.dataType }));
984
994
  }
985
995
  });
986
- const schemaArray = Array.from(tableInfoMap.values()).filter((table) => table.name !== "reifydb::flows").sort((a, b) => a.name.localeCompare(b.name));
987
- setSchema(schemaArray);
996
+ const shapeArray = Array.from(tableInfoMap.values()).filter((table) => table.name !== "reifydb::flows").sort((a, b) => a.name.localeCompare(b.name));
997
+ setShape(shapeArray);
988
998
  setIsLoading(false);
989
999
  }, [results, isExecuting]);
990
- return [isLoading, schema, error];
1000
+ return [isLoading, shape, error];
991
1001
  }
992
1002
  export {
993
1003
  Connection,
@@ -1007,7 +1017,7 @@ export {
1007
1017
  useQueryExecutor,
1008
1018
  useQueryMany,
1009
1019
  useQueryOne,
1010
- useSchema,
1020
+ useShape,
1011
1021
  useSubscription,
1012
1022
  useSubscriptionExecutor
1013
1023
  };
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/connection/connection.ts","../src/connection/connection-pool.ts","../src/connection/connection-context.tsx","../src/hooks/use-connection.ts","../src/hooks/use-query-executor.ts","../src/hooks/use-query.ts","../src/hooks/use-command-executor.ts","../src/hooks/use-command.ts","../src/hooks/use-admin-executor.ts","../src/hooks/use-admin.ts","../src/hooks/use-subscription-executor.ts","../src/hooks/use-subscription.ts","../src/hooks/use-schema.ts"],"sourcesContent":["// SPDX-License-Identifier: Apache-2.0\n// Copyright (c) 2025 ReifyDB\n\nexport * from '@reifydb/core';\nexport * from '@reifydb/client';\n\n// Export connection utilities\nexport {Connection, type ConnectionConfig, DEFAULT_CONFIG, DEFAULT_URL} from './connection/connection';\nexport {getConnection, clearConnection} from './connection/connection-pool';\nexport {ConnectionProvider, ConnectionContext, type ConnectionProviderProps} from './connection/connection-context';\n\n// Export React hooks\nexport {useConnection} from './hooks/use-connection';\nexport {useQueryExecutor, type QueryResult, type QueryState, type QueryExecutorOptions} from './hooks/use-query-executor';\nexport {useQueryOne, useQueryMany, type QueryOptions} from './hooks/use-query';\nexport {useCommandExecutor, type CommandResult, type CommandState, type CommandExecutorOptions} from './hooks/use-command-executor';\nexport {useCommandOne, useCommandMany, type CommandOptions} from './hooks/use-command';\nexport {useAdminExecutor, type AdminResult, type AdminState, type AdminExecutorOptions} from './hooks/use-admin-executor';\nexport {useAdminOne, useAdminMany, type AdminOptions} from './hooks/use-admin';\nexport {\n useSubscriptionExecutor,\n type SubscriptionExecutorOptions,\n type SubscriptionState,\n type ChangeEvent\n} from './hooks/use-subscription-executor';\nexport {\n useSubscription,\n type SubscriptionOptions\n} from './hooks/use-subscription';\nexport {useSchema, type TableInfo, type ColumnInfo} from './hooks/use-schema';","// SPDX-License-Identifier: Apache-2.0\n// Copyright (c) 2025 ReifyDB\n\nimport {Client, WsClient, HttpClient, JsonHttpClient, JsonWebsocketClient, type WsClientOptions} from '@reifydb/client';\n\ninterface ConnectionState {\n client: WsClient | HttpClient | JsonHttpClient | JsonWebsocketClient | null;\n isConnected: boolean;\n isConnecting: boolean;\n connectionError: string | null;\n listeners: Set<(state: ConnectionState) => void>;\n}\n\nexport interface ConnectionConfig {\n url?: string;\n token?: string;\n format?: 'json';\n options?: Omit<WsClientOptions, 'url' | 'token'>;\n}\n\nexport const DEFAULT_CONFIG: ConnectionConfig = {\n url: 'ws://127.0.0.1:8090',\n options: {timeoutMs: 30_000},\n};\n\nexport const DEFAULT_URL = 'ws://127.0.0.1:8090';\n\nexport class Connection {\n private state: ConnectionState = {\n client: null,\n isConnected: false,\n isConnecting: false,\n connectionError: null,\n listeners: new Set(),\n };\n private config: ConnectionConfig;\n\n constructor(config: ConnectionConfig = DEFAULT_CONFIG) {\n this.config = {...DEFAULT_CONFIG, ...config};\n }\n\n setConfig(config: ConnectionConfig): void {\n this.config = config;\n }\n\n getConfig(): ConnectionConfig {\n return this.config;\n }\n\n async connect(url?: string, options?: Omit<WsClientOptions, 'url'>): Promise<void> {\n // Don't connect if already connected or connecting\n if (this.state.isConnected || this.state.isConnecting) {\n return;\n }\n\n const connectUrl = url || this.config.url || DEFAULT_CONFIG.url!;\n const connectOptions = {token: this.config.token, ...this.config.options, ...options};\n\n this.updateState({\n isConnecting: true,\n connectionError: null,\n });\n\n try {\n const isHttp = connectUrl.startsWith('http://') || connectUrl.startsWith('https://');\n const isJson = this.config.format === 'json';\n let client: WsClient | HttpClient | JsonHttpClient | JsonWebsocketClient;\n if (isHttp) {\n client = isJson\n ? Client.connect_json_http(connectUrl, connectOptions)\n : Client.connect_http(connectUrl, connectOptions);\n } else {\n client = isJson\n ? await Client.connect_json_ws(connectUrl, connectOptions)\n : await Client.connect_ws(connectUrl, connectOptions);\n }\n this.updateState({\n client,\n isConnected: true,\n isConnecting: false,\n connectionError: null,\n });\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : 'Failed to connect to ReifyDB';\n console.error('[Connection] Connection failed:', errorMessage, err);\n this.updateState({\n client: null,\n isConnected: false,\n isConnecting: false,\n connectionError: errorMessage,\n });\n throw err;\n }\n }\n\n async disconnect(): Promise<void> {\n if (this.state.client) {\n try {\n if ('disconnect' in this.state.client) {\n (this.state.client as WsClient).disconnect();\n // Small delay to ensure WebSocket closes cleanly\n await new Promise(resolve => setTimeout(resolve, 10));\n }\n } catch (err) {\n console.error('Error disconnecting:', err);\n }\n }\n\n this.updateState({\n client: null,\n isConnected: false,\n isConnecting: false,\n connectionError: null,\n });\n }\n\n async reconnect(url?: string, options?: Omit<WsClientOptions, 'url'>): Promise<void> {\n await this.disconnect();\n await this.connect(url, options);\n }\n\n getClient(): WsClient | HttpClient | JsonHttpClient | JsonWebsocketClient | null {\n return this.state.client;\n }\n\n isConnected(): boolean {\n return this.state.isConnected;\n }\n\n isConnecting(): boolean {\n return this.state.isConnecting;\n }\n\n getConnectionError(): string | null {\n return this.state.connectionError;\n }\n\n getState(): Omit<ConnectionState, 'listeners'> {\n const {listeners, ...state} = this.state;\n return state;\n }\n\n // Subscribe to state changes\n subscribe(listener: (state: ConnectionState) => void): () => void {\n this.state.listeners.add(listener);\n // Return unsubscribe function\n return () => {\n this.state.listeners.delete(listener);\n };\n }\n\n private updateState(updates: Partial<ConnectionState>): void {\n this.state = {\n ...this.state,\n ...updates,\n };\n\n // Notify all listeners\n this.state.listeners.forEach(listener => {\n listener(this.state);\n });\n }\n}\n\n","// SPDX-License-Identifier: Apache-2.0\n// Copyright (c) 2025 ReifyDB\n\nimport { Connection, ConnectionConfig, DEFAULT_CONFIG } from './connection';\n\n/**\n * Singleton default connection instance.\n * This ensures a single global connection that gets reused and updated.\n */\nlet defaultConnection: Connection | null = null;\n\n/**\n * Get the singleton connection instance.\n * If a config is provided, the connection's config will be updated via setConfig().\n * @param config - Optional connection configuration\n * @returns The singleton Connection instance\n */\nexport function getConnection(config?: ConnectionConfig): Connection {\n // Create singleton on first call\n if (!defaultConnection) {\n const mergedConfig = {...DEFAULT_CONFIG, ...config};\n defaultConnection = new Connection(mergedConfig);\n // Start connection immediately - don't wait for React's useEffect\n defaultConnection.connect().catch(err => {\n console.error('[ConnectionPool] Eager connect failed:', err);\n });\n } else if (config) {\n // Only update config when explicitly provided, to avoid\n // stripping fields (e.g. token) that were set on creation.\n defaultConnection.setConfig({...DEFAULT_CONFIG, ...config});\n }\n\n return defaultConnection;\n}\n\n/**\n * Clear the singleton connection\n */\nexport async function clearConnection(): Promise<void> {\n if (defaultConnection) {\n await defaultConnection.disconnect();\n defaultConnection = null;\n }\n}","// SPDX-License-Identifier: Apache-2.0\n// Copyright (c) 2025 ReifyDB\n\nimport React, { createContext, useEffect, useRef, ReactNode } from 'react';\nimport { Connection, ConnectionConfig } from './connection';\nimport { getConnection } from './connection-pool';\n\nexport const ConnectionContext = createContext<Connection | null>(null);\n\nexport interface ConnectionProviderProps {\n config?: ConnectionConfig;\n children: ReactNode;\n}\n\nexport function ConnectionProvider({ config, children }: ConnectionProviderProps) {\n // Get the singleton connection - this always returns the same instance\n // but updates its config via setConfig()\n const connection = getConnection(config);\n\n // Track previous config to detect changes\n const prevConfigRef = useRef<string | undefined>(undefined);\n const currentConfigStr = JSON.stringify(config);\n\n useEffect(() => {\n const configChanged = prevConfigRef.current !== undefined &&\n prevConfigRef.current !== currentConfigStr;\n\n if (configChanged && connection.isConnected()) {\n // Config changed while connected - reconnect with new config\n connection.reconnect().catch(err => {\n console.error('[ConnectionProvider] Failed to reconnect:', err);\n });\n } else if (!connection.isConnected() && !connection.isConnecting()) {\n // Auto-connect if not connected\n connection.connect().catch(err => {\n console.error('[ConnectionProvider] Failed to connect:', err);\n });\n }\n\n // Update previous config reference\n prevConfigRef.current = currentConfigStr;\n }, [currentConfigStr, connection]);\n\n return (\n <ConnectionContext.Provider value={connection}>\n {children}\n </ConnectionContext.Provider>\n );\n}","// SPDX-License-Identifier: Apache-2.0\n// Copyright (c) 2025 ReifyDB\n\nimport {useContext, useEffect, useState} from 'react';\nimport {ConnectionConfig} from '../connection/connection';\nimport {getConnection} from '../connection/connection-pool';\nimport {ConnectionContext} from '../connection/connection-context';\nimport {WsClient, HttpClient, JsonHttpClient, JsonWebsocketClient} from '@reifydb/client';\n\ninterface ConnectionState {\n client: WsClient | HttpClient | JsonHttpClient | JsonWebsocketClient | null;\n isConnected: boolean;\n isConnecting: boolean;\n connectionError: string | null;\n}\n\nexport function useConnection(overrideConfig?: ConnectionConfig) {\n const contextConnection = useContext(ConnectionContext);\n\n // Use override config if provided, otherwise use context, otherwise get default\n const [connection] = useState(() => {\n if (overrideConfig) {\n return getConnection(overrideConfig);\n }\n if (contextConnection) {\n return contextConnection;\n }\n return getConnection();\n });\n\n const [state, setState] = useState<ConnectionState>(() => connection.getState());\n\n useEffect(() => {\n // Get initial state immediately\n const currentState = connection.getState();\n setState(currentState);\n\n // Subscribe to connection state changes\n const unsubscribe = connection.subscribe((newState) => {\n setState({\n client: newState.client,\n isConnected: newState.isConnected,\n isConnecting: newState.isConnecting,\n connectionError: newState.connectionError,\n });\n });\n\n // No auto-connect - ConnectionProvider handles all auto-connection\n // Users must either wrap with ConnectionProvider or manually call connect()\n\n return unsubscribe;\n }, [connection]);\n\n return {\n ...state,\n connect: () => connection.connect(),\n disconnect: () => connection.disconnect(),\n reconnect: () => connection.reconnect(),\n };\n}","// SPDX-License-Identifier: Apache-2.0\n// Copyright (c) 2025 ReifyDB\n\nimport {useState, useCallback, useRef, useEffect} from 'react';\nimport {Column, SchemaNode} from '@reifydb/core';\nimport {ConnectionConfig} from '../connection/connection';\nimport {useConnection} from './use-connection';\n\nexport interface QueryResult<T = any> {\n columns: Column[];\n rows: T[];\n executionTimeMs: number;\n rowsAffected?: number;\n}\n\nexport interface QueryState<T = any> {\n isExecuting: boolean;\n results: QueryResult<T>[] | undefined;\n error: string | undefined;\n executionTime: number | undefined;\n}\n\nexport interface QueryExecutorOptions {\n connectionConfig?: ConnectionConfig;\n}\n\nexport function useQueryExecutor<T = any>(options?: QueryExecutorOptions) {\n const {client} = useConnection(options?.connectionConfig);\n\n const [state, setState] = useState<QueryState<T>>({\n isExecuting: false,\n results: undefined,\n error: undefined,\n executionTime: undefined,\n });\n\n const clientRef = useRef(client);\n clientRef.current = client;\n\n const isMountedRef = useRef(true);\n useEffect(() => {\n return () => { isMountedRef.current = false; };\n }, []);\n\n const executionIdRef = useRef(0);\n const pendingRef = useRef<{statements: string | string[], params?: any, schemas?: readonly SchemaNode[]} | null>(null);\n\n const query = useCallback(\n (statements: string | string[], params?: any, schemas?: readonly SchemaNode[]): Promise<void> => {\n const currentClient = clientRef.current;\n\n if (!currentClient) {\n pendingRef.current = {statements, params, schemas};\n setState(prev => ({...prev, isExecuting: true, error: undefined}));\n return Promise.resolve();\n }\n\n pendingRef.current = null;\n const thisExecution = ++executionIdRef.current;\n\n setState(prev => ({...prev, isExecuting: true, error: undefined}));\n\n const startTime = Date.now();\n\n return (async () => {\n try {\n const frameResults = await currentClient.query(statements, params || null, schemas || []) || [];\n\n if (executionIdRef.current !== thisExecution) return;\n\n const executionTime = Date.now() - startTime;\n\n const results: QueryResult<T>[] = frameResults.map((frame: any) => {\n if (Array.isArray(frame) && frame.length > 0) {\n const firstRow = frame[0];\n let columns: Column[] = [];\n\n const hasValueObjects = firstRow && typeof firstRow === 'object' &&\n Object.values(firstRow).some(v => v && typeof v === 'object' && 'type' in v);\n\n if (hasValueObjects) {\n columns = Object.keys(firstRow).map((key) => {\n const value = firstRow[key];\n const dataType = value?.type || 'Utf8';\n return {\n name: key,\n type: dataType,\n payload: [],\n };\n });\n } else {\n columns = Object.keys(firstRow).map((key) => ({\n name: key,\n type: 'Utf8',\n payload: [],\n }));\n }\n\n return {\n columns,\n rows: frame as T[],\n executionTimeMs: executionTime,\n };\n } else {\n return {\n columns: [],\n rows: [],\n executionTimeMs: executionTime,\n };\n }\n });\n\n if (!isMountedRef.current) return;\n setState({\n isExecuting: false,\n results,\n error: undefined,\n executionTime,\n });\n } catch (err) {\n if (executionIdRef.current !== thisExecution) return;\n\n const executionTime = Date.now() - startTime;\n let errorMessage = 'Query execution failed';\n\n if (err instanceof Error) {\n errorMessage = err.message;\n } else if (typeof err === 'string') {\n errorMessage = err;\n } else if (err && typeof err === 'object' && 'message' in err) {\n errorMessage = (err as { message: string }).message;\n }\n\n console.error('Query execution failed:', errorMessage);\n\n if (!isMountedRef.current) return;\n setState(prev => ({\n ...prev,\n isExecuting: false,\n error: errorMessage,\n executionTime,\n }));\n\n }\n })();\n },\n []\n );\n\n useEffect(() => {\n if (client && pendingRef.current) {\n const {statements, params, schemas} = pendingRef.current;\n query(statements, params, schemas);\n }\n }, [client, query]);\n\n const cancelQuery = useCallback(() => {\n executionIdRef.current++;\n setState((prev) => ({\n ...prev,\n isExecuting: false,\n error: 'Query cancelled',\n }));\n }, []);\n\n return {\n isExecuting: state.isExecuting,\n results: state.results,\n error: state.error,\n executionTime: state.executionTime,\n query,\n cancelQuery,\n };\n}\n","// SPDX-License-Identifier: Apache-2.0\n// Copyright (c) 2025 ReifyDB\n\nimport {useEffect, useMemo} from 'react';\nimport {SchemaNode, InferSchema} from '@reifydb/core';\nimport {ConnectionConfig} from '../connection/connection';\nimport {useQueryExecutor, type QueryResult, type QueryExecutorOptions} from './use-query-executor';\n\nexport interface QueryOptions extends QueryExecutorOptions {\n connectionConfig?: ConnectionConfig;\n}\n\n// Single query hook - returns a single result\nexport function useQueryOne<S extends SchemaNode = any>(\n rql: string,\n params?: any,\n schema?: S,\n options?: QueryOptions\n): {\n isExecuting: boolean;\n result: QueryResult<S extends SchemaNode ? InferSchema<S> : any> | undefined;\n error: string | undefined;\n} {\n const {\n isExecuting,\n results,\n error,\n query\n } = useQueryExecutor<S extends SchemaNode ? InferSchema<S> : any>(options);\n\n useEffect(() => {\n // Pass schema as array for the executor\n const schemas = schema ? [schema] : undefined;\n query(rql, params, schemas);\n }, [rql, params, query]);\n\n // Extract first result for single query convenience\n const result = useMemo(() => {\n return results && results.length > 0 ? results[0] : undefined;\n }, [results]);\n\n return {isExecuting, result, error};\n}\n\n// Multiple query hook - returns multiple results\nexport function useQueryMany<S extends readonly SchemaNode[] = readonly SchemaNode[]>(\n statements: string | string[],\n params?: any,\n schemas?: S,\n options?: QueryOptions\n): {\n isExecuting: boolean;\n results: QueryResult<S extends readonly SchemaNode[] ? InferSchema<S[number]> : any>[] | undefined;\n error: string | undefined;\n} {\n const {\n isExecuting,\n results,\n error,\n query\n } = useQueryExecutor<S extends readonly SchemaNode[] ? InferSchema<S[number]> : any>(options);\n\n useEffect(() => {\n query(statements, params, schemas);\n }, [statements, params, query]);\n\n return {isExecuting, results, error};\n}","// SPDX-License-Identifier: Apache-2.0\n// Copyright (c) 2025 ReifyDB\n\nimport {useState, useCallback, useRef, useEffect} from 'react';\nimport {Column, SchemaNode} from '@reifydb/core';\nimport {ConnectionConfig} from '../connection/connection';\nimport {useConnection} from './use-connection';\n\nexport interface CommandResult<T = any> {\n columns: Column[];\n rows: T[];\n executionTimeMs: number;\n rowsAffected?: number;\n}\n\nexport interface CommandState<T = any> {\n isExecuting: boolean;\n results: CommandResult<T>[] | undefined;\n error: string | undefined;\n executionTime: number | undefined;\n}\n\nexport interface CommandExecutorOptions {\n connectionConfig?: ConnectionConfig;\n}\n\nexport function useCommandExecutor<T = any>(options?: CommandExecutorOptions) {\n const {client} = useConnection(options?.connectionConfig);\n\n const [state, setState] = useState<CommandState<T>>({\n isExecuting: false,\n results: undefined,\n error: undefined,\n executionTime: undefined,\n });\n\n const clientRef = useRef(client);\n clientRef.current = client;\n\n const isMountedRef = useRef(false);\n useEffect(() => {\n isMountedRef.current = true;\n return () => { isMountedRef.current = false; };\n }, []);\n\n const executionIdRef = useRef(0);\n const pendingRef = useRef<{statements: string | string[], params?: any, schemas?: readonly SchemaNode[]} | null>(null);\n\n const command = useCallback(\n (statements: string | string[], params?: any, schemas?: readonly SchemaNode[]): Promise<void> => {\n const currentClient = clientRef.current;\n\n if (!currentClient) {\n pendingRef.current = {statements, params, schemas};\n setState(prev => ({...prev, isExecuting: true, error: undefined}));\n return Promise.resolve();\n }\n\n pendingRef.current = null;\n const thisExecution = ++executionIdRef.current;\n\n setState(prev => ({...prev, isExecuting: true, error: undefined}));\n\n const startTime = Date.now();\n\n return (async () => {\n try {\n const frameResults = await currentClient.command(statements, params || null, schemas || []) || [];\n\n if (executionIdRef.current !== thisExecution) return;\n\n const executionTime = Date.now() - startTime;\n\n const results: CommandResult<T>[] = frameResults.map((frame: any) => {\n if (Array.isArray(frame) && frame.length > 0) {\n const firstRow = frame[0];\n let columns: Column[] = [];\n\n const hasValueObjects = firstRow && typeof firstRow === 'object' &&\n Object.values(firstRow).some(v => v && typeof v === 'object' && 'type' in v);\n\n if (hasValueObjects) {\n columns = Object.keys(firstRow).map((key) => {\n const value = firstRow[key];\n const dataType = value?.type || 'Utf8';\n return {\n name: key,\n type: dataType,\n payload: [],\n };\n });\n } else {\n columns = Object.keys(firstRow).map((key) => ({\n name: key,\n type: 'Utf8',\n payload: [],\n }));\n }\n\n return {\n columns,\n rows: frame as T[],\n executionTimeMs: executionTime,\n };\n } else {\n return {\n columns: [],\n rows: [],\n executionTimeMs: executionTime,\n rowsAffected: typeof frame === 'number' ? frame : undefined,\n };\n }\n });\n\n if (!isMountedRef.current) return;\n setState({\n isExecuting: false,\n results,\n error: undefined,\n executionTime,\n });\n } catch (err) {\n if (executionIdRef.current !== thisExecution) return;\n\n const executionTime = Date.now() - startTime;\n let errorMessage = 'Command execution failed';\n\n if (err instanceof Error) {\n errorMessage = err.message;\n } else if (typeof err === 'string') {\n errorMessage = err;\n } else if (err && typeof err === 'object' && 'message' in err) {\n errorMessage = (err as { message: string }).message;\n }\n\n console.error('Command execution failed:', errorMessage);\n\n if (!isMountedRef.current) return;\n setState(prev => ({\n ...prev,\n isExecuting: false,\n error: errorMessage,\n executionTime,\n }));\n\n }\n })();\n },\n []\n );\n\n useEffect(() => {\n if (client && pendingRef.current) {\n const {statements, params, schemas} = pendingRef.current;\n command(statements, params, schemas);\n }\n }, [client, command]);\n\n const cancelCommand = useCallback(() => {\n executionIdRef.current++;\n setState((prev) => ({\n ...prev,\n isExecuting: false,\n error: 'Command cancelled',\n }));\n }, []);\n\n return {\n isExecuting: state.isExecuting,\n results: state.results,\n error: state.error,\n executionTime: state.executionTime,\n command,\n cancelCommand,\n };\n}\n","// SPDX-License-Identifier: Apache-2.0\n// Copyright (c) 2025 ReifyDB\n\nimport {useEffect, useMemo} from 'react';\nimport {SchemaNode, InferSchema} from '@reifydb/core';\nimport {ConnectionConfig} from '../connection/connection';\nimport {useCommandExecutor, type CommandResult, type CommandExecutorOptions} from './use-command-executor';\n\nexport interface CommandOptions extends CommandExecutorOptions {\n connectionConfig?: ConnectionConfig;\n}\n\n// Single command hook - returns a single result\nexport function useCommandOne<S extends SchemaNode = any>(\n statement: string,\n params?: any,\n schema?: S,\n options?: CommandOptions\n): {\n isExecuting: boolean;\n result: CommandResult<S extends SchemaNode ? InferSchema<S> : any> | undefined;\n error: string | undefined;\n} {\n const {\n isExecuting,\n results,\n error,\n command\n } = useCommandExecutor<S extends SchemaNode ? InferSchema<S> : any>(options);\n\n useEffect(() => {\n // Pass schema as array for the executor\n const schemas = schema ? [schema] : undefined;\n command(statement, params, schemas);\n }, [statement, params, command]);\n\n // Extract first result for single command convenience\n const result = useMemo(() => {\n return results && results.length > 0 ? results[0] : undefined;\n }, [results]);\n\n return {isExecuting, result, error};\n}\n\n// Multiple command hook - returns multiple results\nexport function useCommandMany<S extends readonly SchemaNode[] = readonly SchemaNode[]>(\n statements: string | string[],\n params?: any,\n schemas?: S,\n options?: CommandOptions\n): {\n isExecuting: boolean;\n results: CommandResult<S extends readonly SchemaNode[] ? InferSchema<S[number]> : any>[] | undefined;\n error: string | undefined;\n} {\n const {\n isExecuting,\n results,\n error,\n command\n } = useCommandExecutor<S extends readonly SchemaNode[] ? InferSchema<S[number]> : any>(options);\n\n useEffect(() => {\n command(statements, params, schemas);\n }, [statements, params, command]);\n\n return {isExecuting, results, error};\n}","// SPDX-License-Identifier: Apache-2.0\n// Copyright (c) 2025 ReifyDB\n\nimport {useState, useCallback, useRef, useEffect} from 'react';\nimport {Column, SchemaNode} from '@reifydb/core';\nimport {ConnectionConfig} from '../connection/connection';\nimport {useConnection} from './use-connection';\n\nexport interface AdminResult<T = any> {\n columns: Column[];\n rows: T[];\n executionTimeMs: number;\n rowsAffected?: number;\n}\n\nexport interface AdminState<T = any> {\n isExecuting: boolean;\n results: AdminResult<T>[] | undefined;\n error: string | undefined;\n executionTime: number | undefined;\n}\n\nexport interface AdminExecutorOptions {\n connectionConfig?: ConnectionConfig;\n}\n\nexport function useAdminExecutor<T = any>(options?: AdminExecutorOptions) {\n const {client} = useConnection(options?.connectionConfig);\n\n const [state, setState] = useState<AdminState<T>>({\n isExecuting: false,\n results: undefined,\n error: undefined,\n executionTime: undefined,\n });\n\n // Stable refs so the callback never recreates\n const clientRef = useRef(client);\n clientRef.current = client;\n\n const isMountedRef = useRef(false);\n useEffect(() => {\n isMountedRef.current = true;\n return () => { isMountedRef.current = false; };\n }, []);\n\n // Counter to detect superseded executions\n const executionIdRef = useRef(0);\n\n // Stash pending call if client isn't ready yet\n const pendingRef = useRef<{statements: string | string[], params?: any, schemas?: readonly SchemaNode[]} | null>(null);\n\n const admin = useCallback(\n (statements: string | string[], params?: any, schemas?: readonly SchemaNode[]): Promise<void> => {\n const currentClient = clientRef.current;\n // If no client yet, stash the request for replay when client connects\n if (!currentClient) {\n pendingRef.current = {statements, params, schemas};\n setState(prev => ({...prev, isExecuting: true, error: undefined}));\n return Promise.resolve();\n }\n\n pendingRef.current = null;\n const thisExecution = ++executionIdRef.current;\n\n setState(prev => ({...prev, isExecuting: true, error: undefined}));\n\n const startTime = Date.now();\n\n return (async () => {\n try {\n const frameResults = await currentClient.admin(statements, params || null, schemas || []) || [];\n\n // If this execution was superseded by a newer one, discard results\n if (executionIdRef.current !== thisExecution) return;\n\n const executionTime = Date.now() - startTime;\n\n // Process each frame into a AdminResult\n const results: AdminResult<T>[] = frameResults.map((frame: any) => {\n if (Array.isArray(frame) && frame.length > 0) {\n const firstRow = frame[0];\n let columns: Column[] = [];\n\n // Check if we have Value objects or plain objects\n const hasValueObjects = firstRow && typeof firstRow === 'object' &&\n Object.values(firstRow).some(v => v && typeof v === 'object' && 'type' in v);\n\n if (hasValueObjects) {\n columns = Object.keys(firstRow).map((key) => {\n const value = firstRow[key];\n const dataType = value?.type || 'Utf8';\n return {\n name: key,\n type: dataType,\n payload: [],\n };\n });\n } else {\n columns = Object.keys(firstRow).map((key) => ({\n name: key,\n type: 'Utf8',\n payload: [],\n }));\n }\n\n return {\n columns,\n rows: frame as T[],\n executionTimeMs: executionTime,\n };\n } else {\n return {\n columns: [],\n rows: [],\n executionTimeMs: executionTime,\n rowsAffected: typeof frame === 'number' ? frame : undefined,\n };\n }\n });\n\n if (!isMountedRef.current) return;\n setState({\n isExecuting: false,\n results,\n error: undefined,\n executionTime,\n });\n } catch (err) {\n if (executionIdRef.current !== thisExecution) return;\n\n const executionTime = Date.now() - startTime;\n let errorMessage = 'Admin execution failed';\n\n if (err instanceof Error) {\n errorMessage = err.message;\n } else if (typeof err === 'string') {\n errorMessage = err;\n } else if (err && typeof err === 'object' && 'message' in err) {\n errorMessage = (err as { message: string }).message;\n }\n\n console.error('Admin execution failed:', errorMessage);\n\n if (!isMountedRef.current) return;\n setState(prev => ({\n ...prev,\n isExecuting: false,\n error: errorMessage,\n executionTime,\n }));\n\n }\n })();\n },\n [] // stable — never recreates\n );\n\n // Replay pending request when client becomes available\n useEffect(() => {\n if (client && pendingRef.current) {\n const {statements, params, schemas} = pendingRef.current;\n admin(statements, params, schemas);\n }\n }, [client, admin]);\n\n const cancelAdmin = useCallback(() => {\n // Bump execution ID so any in-flight request is ignored on completion\n executionIdRef.current++;\n setState((prev) => ({\n ...prev,\n isExecuting: false,\n error: 'Admin cancelled',\n }));\n }, []);\n\n return {\n isExecuting: state.isExecuting,\n results: state.results,\n error: state.error,\n executionTime: state.executionTime,\n admin,\n cancelAdmin,\n };\n}\n","// SPDX-License-Identifier: Apache-2.0\n// Copyright (c) 2025 ReifyDB\n\nimport {useEffect, useMemo} from 'react';\nimport {SchemaNode, InferSchema} from '@reifydb/core';\nimport {ConnectionConfig} from '../connection/connection';\nimport {useAdminExecutor, type AdminResult, type AdminExecutorOptions} from './use-admin-executor';\n\nexport interface AdminOptions extends AdminExecutorOptions {\n connectionConfig?: ConnectionConfig;\n}\n\n// Single admin hook - returns a single result\nexport function useAdminOne<S extends SchemaNode = any>(\n statement: string,\n params?: any,\n schema?: S,\n options?: AdminOptions\n): {\n isExecuting: boolean;\n result: AdminResult<S extends SchemaNode ? InferSchema<S> : any> | undefined;\n error: string | undefined;\n} {\n const {\n isExecuting,\n results,\n error,\n admin\n } = useAdminExecutor<S extends SchemaNode ? InferSchema<S> : any>(options);\n\n useEffect(() => {\n // Pass schema as array for the executor\n const schemas = schema ? [schema] : undefined;\n admin(statement, params, schemas);\n }, [statement, params, admin]);\n\n // Extract first result for single admin convenience\n const result = useMemo(() => {\n return results && results.length > 0 ? results[0] : undefined;\n }, [results]);\n\n return {isExecuting, result, error};\n}\n\n// Multiple admin hook - returns multiple results\nexport function useAdminMany<S extends readonly SchemaNode[] = readonly SchemaNode[]>(\n statements: string | string[],\n params?: any,\n schemas?: S,\n options?: AdminOptions\n): {\n isExecuting: boolean;\n results: AdminResult<S extends readonly SchemaNode[] ? InferSchema<S[number]> : any>[] | undefined;\n error: string | undefined;\n} {\n const {\n isExecuting,\n results,\n error,\n admin\n } = useAdminExecutor<S extends readonly SchemaNode[] ? InferSchema<S[number]> : any>(options);\n\n useEffect(() => {\n admin(statements, params, schemas);\n }, [statements, params, admin]);\n\n return {isExecuting, results, error};\n}\n","// SPDX-License-Identifier: Apache-2.0\n// Copyright (c) 2025 ReifyDB\n\nimport { useState, useCallback, useRef, useEffect } from 'react';\nimport { SchemaNode } from '@reifydb/core';\nimport { useConnection } from './use-connection';\nimport type { ConnectionConfig } from '../connection/connection';\n\nexport interface SubscriptionExecutorOptions {\n connectionConfig?: ConnectionConfig;\n}\n\nexport interface ChangeEvent<T> {\n operation: 'INSERT' | 'UPDATE' | 'REMOVE';\n rows: T[];\n timestamp: number;\n}\n\nexport interface SubscriptionState<T> {\n data: T[];\n changes: ChangeEvent<T>[];\n isSubscribed: boolean;\n isSubscribing: boolean;\n error: string | undefined;\n subscriptionId: string | undefined;\n}\n\nexport function useSubscriptionExecutor<T = any>(\n options?: SubscriptionExecutorOptions\n) {\n const { client } = useConnection(options?.connectionConfig);\n\n const [state, setState] = useState<SubscriptionState<T>>({\n data: [],\n changes: [],\n isSubscribed: false,\n isSubscribing: false,\n error: undefined,\n subscriptionId: undefined\n });\n\n // Use a ref for client to avoid recreating callbacks when client changes\n const clientRef = useRef(client);\n\n const subscriptionIdRef = useRef<string | undefined>(undefined);\n const queryRef = useRef<string | undefined>(undefined);\n const paramsRef = useRef<any>(undefined);\n const schemaRef = useRef<SchemaNode | undefined>(undefined);\n\n // Keep clientRef in sync with client\n useEffect(() => {\n clientRef.current = client;\n }, [client]);\n\n // Helper to add change event\n const addChangeEvent = useCallback((\n operation: 'INSERT' | 'UPDATE' | 'REMOVE',\n rows: T[]\n ) => {\n setState(prev => {\n const newChange: ChangeEvent<T> = {\n operation,\n rows,\n timestamp: Date.now()\n };\n\n const newChanges = [...prev.changes, newChange];\n\n return {\n ...prev,\n data: prev.data,\n changes: newChanges\n };\n });\n }, []);\n\n // Separate callbacks for each operation type\n const handleInsert = useCallback((rows: T[]) => {\n addChangeEvent('INSERT', rows);\n }, [addChangeEvent]);\n\n const handleUpdate = useCallback((rows: T[]) => {\n addChangeEvent('UPDATE', rows);\n }, [addChangeEvent]);\n\n const handleRemove = useCallback((rows: T[]) => {\n addChangeEvent('REMOVE', rows);\n }, [addChangeEvent]);\n\n const subscribe = useCallback(async (\n query: string,\n params?: any,\n schema?: SchemaNode\n ) => {\n const currentClient = clientRef.current;\n if (!currentClient) {\n setState(prev => ({ ...prev, error: 'Client not connected' }));\n return;\n }\n\n if (!('subscribe' in currentClient)) {\n setState(prev => ({ ...prev, error: 'Subscriptions require a WebSocket connection' }));\n return;\n }\n\n // Store refs for reconnection\n queryRef.current = query;\n paramsRef.current = params;\n schemaRef.current = schema;\n\n setState(prev => ({\n ...prev,\n isSubscribing: true,\n error: undefined\n }));\n\n try {\n const subId = await currentClient.subscribe(query, params, schema, {\n onInsert: handleInsert,\n onUpdate: handleUpdate,\n onRemove: handleRemove\n });\n\n subscriptionIdRef.current = subId;\n setState(prev => ({\n ...prev,\n isSubscribing: false,\n isSubscribed: true,\n subscriptionId: subId\n }));\n } catch (err: any) {\n setState(prev => ({\n ...prev,\n isSubscribing: false,\n error: err.message || 'Subscription failed'\n }));\n }\n }, [handleInsert, handleUpdate, handleRemove]);\n\n const unsubscribe = useCallback(async () => {\n const currentClient = clientRef.current;\n if (!currentClient || !subscriptionIdRef.current) return;\n if (!('unsubscribe' in currentClient)) return;\n\n try {\n await currentClient.unsubscribe(subscriptionIdRef.current);\n subscriptionIdRef.current = undefined;\n queryRef.current = undefined;\n paramsRef.current = undefined;\n schemaRef.current = undefined;\n\n setState(prev => ({\n ...prev,\n isSubscribed: false,\n subscriptionId: undefined\n }));\n } catch (err: any) {\n setState(prev => ({\n ...prev,\n error: err.message || 'Unsubscribe failed'\n }));\n }\n }, []);\n\n const clearChanges = useCallback(() => {\n setState(prev => ({ ...prev, changes: [] }));\n }, []);\n\n const clearData = useCallback(() => {\n setState(prev => ({ ...prev, data: [] }));\n }, []);\n\n // Cleanup on unmount\n useEffect(() => {\n return () => {\n if (subscriptionIdRef.current && clientRef.current && 'unsubscribe' in clientRef.current) {\n clientRef.current.unsubscribe(subscriptionIdRef.current).catch(console.error);\n }\n };\n }, []);\n\n return {\n state,\n subscribe,\n unsubscribe,\n clearChanges,\n clearData\n };\n}\n","// SPDX-License-Identifier: Apache-2.0\n// Copyright (c) 2025 ReifyDB\n\nimport { useEffect, useMemo } from 'react';\nimport { SchemaNode, InferSchema } from '@reifydb/core';\nimport {\n useSubscriptionExecutor,\n type SubscriptionExecutorOptions,\n type ChangeEvent\n} from './use-subscription-executor';\n\nexport interface SubscriptionOptions extends SubscriptionExecutorOptions {\n enabled?: boolean; // Auto-subscribe (default: true)\n}\n\nexport function useSubscription<S extends SchemaNode = any>(\n query: string,\n params?: any,\n schema?: S,\n options?: SubscriptionOptions\n): {\n data: InferSchema<S>[];\n changes: ChangeEvent<InferSchema<S>>[];\n isSubscribed: boolean;\n isSubscribing: boolean;\n error: string | undefined;\n subscriptionId: string | undefined;\n} {\n const {\n state,\n subscribe,\n unsubscribe\n } = useSubscriptionExecutor<InferSchema<S>>(options);\n\n // Serialize params for stable comparison (objects create new refs each render)\n const paramsKey = useMemo(() => JSON.stringify(params), [params]);\n\n useEffect(() => {\n if (options?.enabled === false) return;\n\n subscribe(query, params, schema);\n\n return () => {\n unsubscribe();\n };\n }, [query, paramsKey, schema, options?.enabled, subscribe, unsubscribe]);\n\n return {\n data: state.data,\n changes: state.changes,\n isSubscribed: state.isSubscribed,\n isSubscribing: state.isSubscribing,\n error: state.error,\n subscriptionId: state.subscriptionId\n };\n}\n","// SPDX-License-Identifier: Apache-2.0\n// Copyright (c) 2025 ReifyDB\n\nimport {useEffect, useState} from 'react';\nimport {Schema, InferSchema} from '@reifydb/core';\nimport {useQueryExecutor} from './use-query-executor';\n\nexport interface ColumnInfo {\n name: string;\n dataType: string;\n}\n\nexport interface TableInfo {\n name: string;\n columns: ColumnInfo[];\n}\n\nconst namespaceSchema = Schema.object({\n id: Schema.number(),\n name: Schema.string(),\n});\n\nconst tableSchema = Schema.object({\n id: Schema.number(),\n namespace_id: Schema.number(),\n name: Schema.string(),\n primary_key_id: Schema.number(),\n});\n\nconst viewSchema = Schema.object({\n id: Schema.number(),\n namespace_id: Schema.number(),\n name: Schema.string(),\n});\n\nconst columnSchema = Schema.object({\n id: Schema.number(),\n source_id: Schema.number(),\n source_type: Schema.number(),\n name: Schema.string(),\n type: Schema.number(),\n position: Schema.number(),\n auto_increment: Schema.boolean(),\n});\n\ntype NamespaceRow = InferSchema<typeof namespaceSchema>;\ntype TableRow = InferSchema<typeof tableSchema>;\ntype ViewRow = InferSchema<typeof viewSchema>;\ntype ColumnRow = InferSchema<typeof columnSchema>;\n\nexport function useSchema(): [boolean, TableInfo[], string | undefined] {\n const {isExecuting, results, error, query} = useQueryExecutor();\n const [schema, setSchema] = useState<TableInfo[]>([]);\n const [isLoading, setIsLoading] = useState(true);\n\n useEffect(() => {\n if (!query) return;\n\n const fetchSchema = async () => {\n setIsLoading(true);\n\n try {\n await query(\n `OUTPUT FROM system::namespaces; OUTPUT FROM system::tables; OUTPUT FROM system::views; FROM system::columns;`,\n undefined,\n [namespaceSchema, tableSchema, viewSchema, columnSchema]\n );\n } catch (err) {\n console.error('Failed to fetch schema:', err);\n }\n };\n\n fetchSchema();\n }, [query]);\n\n useEffect(() => {\n if (!results || results.length < 4) {\n setIsLoading(isExecuting);\n return;\n }\n\n const tablesResult = results[1];\n const viewsResult = results[2];\n const columnsResult = results[3];\n\n if (!tablesResult?.rows || !viewsResult?.rows || !columnsResult?.rows) {\n setIsLoading(false);\n return;\n }\n\n const namespacesResult = results[0];\n const namespaces = namespacesResult.rows as unknown as NamespaceRow[];\n const tables = tablesResult.rows as unknown as TableRow[];\n const views = viewsResult.rows as unknown as ViewRow[];\n const columns = columnsResult.rows as unknown as ColumnRow[];\n\n const namespaceMap = new Map<number, string>();\n namespaces.forEach((ns) => {\n const id = ns.id?.valueOf() as number;\n const name = ns.name?.valueOf() as string;\n if (id !== undefined && name) {\n namespaceMap.set(id, name);\n }\n });\n\n const tableInfoMap = new Map<number, TableInfo>();\n\n tables.forEach((table) => {\n const tableId = table.id?.valueOf() as number;\n const namespaceId = table.namespace_id?.valueOf() as number;\n const tableName = table.name?.valueOf() as string;\n\n if (tableId === undefined || !tableName || namespaceId === undefined) return;\n\n const namespace = namespaceMap.get(namespaceId);\n if (!namespace) return;\n\n const fullTableName = `${namespace}::${tableName}`;\n\n tableInfoMap.set(tableId, {\n name: fullTableName,\n columns: [],\n });\n });\n\n views.forEach((view) => {\n const viewId = view.id?.valueOf() as number;\n const namespaceId = view.namespace_id?.valueOf() as number;\n const viewName = view.name?.valueOf() as string;\n\n if (viewId === undefined || !viewName || namespaceId === undefined) return;\n\n const namespace = namespaceMap.get(namespaceId);\n if (!namespace) return;\n\n const fullViewName = `${namespace}::${viewName}`;\n\n tableInfoMap.set(viewId, {\n name: fullViewName,\n columns: [],\n });\n });\n\n const typeMap: Record<number, string> = {\n 0: 'None',\n 1: 'Float4',\n 2: 'Float8',\n 3: 'Int1',\n 4: 'Int2',\n 5: 'Int4',\n 6: 'Int8',\n 7: 'Int16',\n 8: 'Utf8',\n 9: 'Uint1',\n 10: 'Uint2',\n 11: 'Uint4',\n 12: 'Uint8',\n 13: 'Uint16',\n 14: 'Boolean',\n 15: 'Date',\n 16: 'DateTime',\n 17: 'Time',\n 18: 'Duration',\n 19: 'IdentityId',\n 20: 'Uuid4',\n 21: 'Uuid7',\n 22: 'Blob',\n 23: 'Int',\n 24: 'Decimal',\n 25: 'Uint',\n 26: 'Any',\n };\n\n // Create a map to collect columns with their positions\n const tableColumnsMap = new Map<number, Array<{name: string; dataType: string; position: number}>>();\n\n columns.forEach((column) => {\n const sourceId = column.source_id?.valueOf() as number;\n const sourceType = column.source_type?.valueOf() as number;\n const columnName = column.name?.valueOf() as string;\n const typeId = column.type?.valueOf() as number;\n const position = column.position?.valueOf() as number;\n\n if (sourceId === undefined || !columnName || typeId === undefined) return;\n if (sourceType !== 0 && sourceType !== 1) return;\n\n if (!tableColumnsMap.has(sourceId)) {\n tableColumnsMap.set(sourceId, []);\n }\n\n tableColumnsMap.get(sourceId)!.push({\n name: columnName,\n dataType: typeMap[typeId] || `Unknown(${typeId})`,\n position: position ?? 0,\n });\n });\n\n // Sort columns by position and add to table info\n tableColumnsMap.forEach((cols, sourceId) => {\n const tableInfo = tableInfoMap.get(sourceId);\n if (tableInfo) {\n cols.sort((a, b) => a.position - b.position);\n tableInfo.columns = cols.map((c) => ({name: c.name, dataType: c.dataType}));\n }\n });\n\n const schemaArray = Array.from(tableInfoMap.values())\n .filter((table) => table.name !== 'reifydb::flows')\n .sort((a, b) => a.name.localeCompare(b.name));\n\n setSchema(schemaArray);\n setIsLoading(false);\n }, [results, isExecuting]);\n\n return [isLoading, schema, error];\n}\n"],"mappings":"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","names":["useEffect","useEffect","useState","useRef","useEffect","useState","useRef","useEffect","useEffect","useEffect","useState","useCallback","useRef","useEffect","useState","useRef","useEffect","useCallback","useEffect","useMemo","useEffect","useMemo","useState","useCallback","useRef","useEffect","useState","useRef","useEffect","useCallback","useEffect","useMemo","useEffect","useMemo","useState","useCallback","useRef","useEffect","useState","useRef","useEffect","useCallback","useEffect","useMemo","useMemo","useEffect","useEffect","useState","useState","useEffect"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/connection/connection.ts","../src/connection/connection-pool.ts","../src/connection/connection-context.tsx","../src/hooks/use-connection.ts","../src/hooks/use-query-executor.ts","../src/hooks/use-query.ts","../src/hooks/use-command-executor.ts","../src/hooks/use-command.ts","../src/hooks/use-admin-executor.ts","../src/hooks/use-admin.ts","../src/hooks/use-subscription-executor.ts","../src/hooks/use-subscription.ts","../src/hooks/use-shape.ts"],"sourcesContent":["// SPDX-License-Identifier: Apache-2.0\n// Copyright (c) 2025 ReifyDB\n\nexport * from '@reifydb/core';\nexport * from '@reifydb/client';\n\n// Export connection utilities\nexport {Connection, type ConnectionConfig, DEFAULT_CONFIG, DEFAULT_URL} from './connection/connection';\nexport {getConnection, clearConnection} from './connection/connection-pool';\nexport {ConnectionProvider, ConnectionContext, type ConnectionProviderProps} from './connection/connection-context';\n\n// Export React hooks\nexport {useConnection} from './hooks/use-connection';\nexport {useQueryExecutor, type QueryResult, type QueryState, type QueryExecutorOptions} from './hooks/use-query-executor';\nexport {useQueryOne, useQueryMany, type QueryOptions} from './hooks/use-query';\nexport {useCommandExecutor, type CommandResult, type CommandState, type CommandExecutorOptions} from './hooks/use-command-executor';\nexport {useCommandOne, useCommandMany, type CommandOptions} from './hooks/use-command';\nexport {useAdminExecutor, type AdminResult, type AdminState, type AdminExecutorOptions} from './hooks/use-admin-executor';\nexport {useAdminOne, useAdminMany, type AdminOptions} from './hooks/use-admin';\nexport {\n useSubscriptionExecutor,\n type SubscriptionExecutorOptions,\n type SubscriptionState,\n type ChangeEvent\n} from './hooks/use-subscription-executor';\nexport {\n useSubscription,\n type SubscriptionOptions\n} from './hooks/use-subscription';\nexport {useShape, type TableInfo, type ColumnInfo} from './hooks/use-shape';","// SPDX-License-Identifier: Apache-2.0\n// Copyright (c) 2025 ReifyDB\n\nimport {Client, WsClient, HttpClient, JsonHttpClient, JsonWebsocketClient, type WsClientOptions} from '@reifydb/client';\n\ninterface ConnectionState {\n client: WsClient | HttpClient | JsonHttpClient | JsonWebsocketClient | null;\n isConnected: boolean;\n isConnecting: boolean;\n connectionError: string | null;\n listeners: Set<(state: ConnectionState) => void>;\n}\n\nexport interface ConnectionConfig {\n url?: string;\n token?: string;\n format?: 'json';\n options?: Omit<WsClientOptions, 'url' | 'token'>;\n}\n\nexport const DEFAULT_CONFIG: ConnectionConfig = {\n url: 'ws://127.0.0.1:8090',\n options: {timeoutMs: 30_000},\n};\n\nexport const DEFAULT_URL = 'ws://127.0.0.1:8090';\n\nexport class Connection {\n private state: ConnectionState = {\n client: null,\n isConnected: false,\n isConnecting: false,\n connectionError: null,\n listeners: new Set(),\n };\n private config: ConnectionConfig;\n private connectPromise: Promise<void> | null = null;\n\n constructor(config: ConnectionConfig = DEFAULT_CONFIG) {\n this.config = {...DEFAULT_CONFIG, ...config};\n }\n\n setConfig(config: ConnectionConfig): void {\n this.config = config;\n }\n\n getConfig(): ConnectionConfig {\n return this.config;\n }\n\n async connect(url?: string, options?: Omit<WsClientOptions, 'url'>): Promise<void> {\n if (this.state.isConnected) {\n return;\n }\n\n // If already connecting, wait for the in-flight connection\n if (this.connectPromise) {\n return this.connectPromise;\n }\n\n const connectUrl = url || this.config.url || DEFAULT_CONFIG.url!;\n const connectOptions = {token: this.config.token, ...this.config.options, ...options};\n\n this.updateState({\n isConnecting: true,\n connectionError: null,\n });\n\n this.connectPromise = (async () => {\n try {\n const isHttp = connectUrl.startsWith('http://') || connectUrl.startsWith('https://');\n const isJson = this.config.format === 'json';\n let client: WsClient | HttpClient | JsonHttpClient | JsonWebsocketClient;\n if (isHttp) {\n client = isJson\n ? Client.connect_json_http(connectUrl, connectOptions)\n : Client.connect_http(connectUrl, connectOptions);\n } else {\n client = isJson\n ? await Client.connect_json_ws(connectUrl, connectOptions)\n : await Client.connect_ws(connectUrl, connectOptions);\n }\n this.updateState({\n client,\n isConnected: true,\n isConnecting: false,\n connectionError: null,\n });\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : 'Failed to connect to ReifyDB';\n console.error('[Connection] Connection failed:', errorMessage, err);\n this.updateState({\n client: null,\n isConnected: false,\n isConnecting: false,\n connectionError: errorMessage,\n });\n throw err;\n } finally {\n this.connectPromise = null;\n }\n })();\n\n return this.connectPromise;\n }\n\n async disconnect(): Promise<void> {\n this.connectPromise = null;\n if (this.state.client) {\n try {\n if ('disconnect' in this.state.client) {\n (this.state.client as WsClient).disconnect();\n // Small delay to ensure WebSocket closes cleanly\n await new Promise(resolve => setTimeout(resolve, 10));\n }\n } catch (err) {\n console.error('Error disconnecting:', err);\n }\n }\n\n this.updateState({\n client: null,\n isConnected: false,\n isConnecting: false,\n connectionError: null,\n });\n }\n\n async reconnect(url?: string, options?: Omit<WsClientOptions, 'url'>): Promise<void> {\n await this.disconnect();\n await this.connect(url, options);\n }\n\n getClient(): WsClient | HttpClient | JsonHttpClient | JsonWebsocketClient | null {\n return this.state.client;\n }\n\n isConnected(): boolean {\n return this.state.isConnected;\n }\n\n isConnecting(): boolean {\n return this.state.isConnecting;\n }\n\n getConnectionError(): string | null {\n return this.state.connectionError;\n }\n\n getState(): Omit<ConnectionState, 'listeners'> {\n const {listeners, ...state} = this.state;\n return state;\n }\n\n // Subscribe to state changes\n subscribe(listener: (state: ConnectionState) => void): () => void {\n this.state.listeners.add(listener);\n // Return unsubscribe function\n return () => {\n this.state.listeners.delete(listener);\n };\n }\n\n private updateState(updates: Partial<ConnectionState>): void {\n this.state = {\n ...this.state,\n ...updates,\n };\n\n // Notify all listeners\n this.state.listeners.forEach(listener => {\n listener(this.state);\n });\n }\n}\n\n","// SPDX-License-Identifier: Apache-2.0\n// Copyright (c) 2025 ReifyDB\n\nimport { Connection, ConnectionConfig, DEFAULT_CONFIG } from './connection';\n\n/**\n * Singleton default connection instance.\n * This ensures a single global connection that gets reused and updated.\n */\nlet defaultConnection: Connection | null = null;\n\n/**\n * Get the singleton connection instance.\n * If a config is provided, the connection's config will be updated via setConfig().\n * @param config - Optional connection configuration\n * @returns The singleton Connection instance\n */\nexport function getConnection(config?: ConnectionConfig): Connection {\n // Create singleton on first call\n if (!defaultConnection) {\n const mergedConfig = {...DEFAULT_CONFIG, ...config};\n defaultConnection = new Connection(mergedConfig);\n // Start connection immediately - don't wait for React's useEffect\n defaultConnection.connect().catch(err => {\n console.error('[ConnectionPool] Eager connect failed:', err);\n });\n } else if (config) {\n // Only update config when explicitly provided, to avoid\n // stripping fields (e.g. token) that were set on creation.\n defaultConnection.setConfig({...DEFAULT_CONFIG, ...config});\n }\n\n return defaultConnection;\n}\n\n/**\n * Clear the singleton connection\n */\nexport async function clearConnection(): Promise<void> {\n if (defaultConnection) {\n await defaultConnection.disconnect();\n defaultConnection = null;\n }\n}","// SPDX-License-Identifier: Apache-2.0\n// Copyright (c) 2025 ReifyDB\n\nimport React, { createContext, useEffect, useRef, ReactNode } from 'react';\nimport { Connection, ConnectionConfig } from './connection';\nimport { getConnection } from './connection-pool';\n\nexport const ConnectionContext = createContext<Connection | null>(null);\n\nexport interface ConnectionProviderProps {\n config?: ConnectionConfig;\n children: ReactNode;\n}\n\nexport function ConnectionProvider({ config, children }: ConnectionProviderProps) {\n // Get the singleton connection - this always returns the same instance\n // but updates its config via setConfig()\n const connection = getConnection(config);\n\n // Track previous config to detect changes\n const prevConfigRef = useRef<string | undefined>(undefined);\n const currentConfigStr = JSON.stringify(config);\n\n useEffect(() => {\n const configChanged = prevConfigRef.current !== undefined &&\n prevConfigRef.current !== currentConfigStr;\n\n if (configChanged && connection.isConnected()) {\n // Config changed while connected - reconnect with new config\n connection.reconnect().catch(err => {\n console.error('[ConnectionProvider] Failed to reconnect:', err);\n });\n } else if (!connection.isConnected() && !connection.isConnecting()) {\n // Auto-connect if not connected\n connection.connect().catch(err => {\n console.error('[ConnectionProvider] Failed to connect:', err);\n });\n }\n\n // Update previous config reference\n prevConfigRef.current = currentConfigStr;\n }, [currentConfigStr, connection]);\n\n return (\n <ConnectionContext.Provider value={connection}>\n {children}\n </ConnectionContext.Provider>\n );\n}","// SPDX-License-Identifier: Apache-2.0\n// Copyright (c) 2025 ReifyDB\n\nimport {useContext, useEffect, useState} from 'react';\nimport {ConnectionConfig} from '../connection/connection';\nimport {getConnection} from '../connection/connection-pool';\nimport {ConnectionContext} from '../connection/connection-context';\nimport {WsClient, HttpClient, JsonHttpClient, JsonWebsocketClient} from '@reifydb/client';\n\ninterface ConnectionState {\n client: WsClient | HttpClient | JsonHttpClient | JsonWebsocketClient | null;\n isConnected: boolean;\n isConnecting: boolean;\n connectionError: string | null;\n}\n\nexport function useConnection(overrideConfig?: ConnectionConfig) {\n const contextConnection = useContext(ConnectionContext);\n\n // Use override config if provided, otherwise use context, otherwise get default\n const [connection] = useState(() => {\n if (overrideConfig) {\n return getConnection(overrideConfig);\n }\n if (contextConnection) {\n return contextConnection;\n }\n return getConnection();\n });\n\n const [state, setState] = useState<ConnectionState>(() => connection.getState());\n\n useEffect(() => {\n // Get initial state immediately\n const currentState = connection.getState();\n setState(currentState);\n\n // Subscribe to connection state changes\n const unsubscribe = connection.subscribe((newState) => {\n setState({\n client: newState.client,\n isConnected: newState.isConnected,\n isConnecting: newState.isConnecting,\n connectionError: newState.connectionError,\n });\n });\n\n // No auto-connect - ConnectionProvider handles all auto-connection\n // Users must either wrap with ConnectionProvider or manually call connect()\n\n return unsubscribe;\n }, [connection]);\n\n return {\n ...state,\n connect: () => connection.connect(),\n disconnect: () => connection.disconnect(),\n reconnect: () => connection.reconnect(),\n };\n}","// SPDX-License-Identifier: Apache-2.0\n// Copyright (c) 2025 ReifyDB\n\nimport {useState, useCallback, useRef, useEffect} from 'react';\nimport {Column, ShapeNode} from '@reifydb/core';\nimport {ConnectionConfig} from '../connection/connection';\nimport {useConnection} from './use-connection';\n\nexport interface QueryResult<T = any> {\n columns: Column[];\n rows: T[];\n executionTimeMs: number;\n rowsAffected?: number;\n}\n\nexport interface QueryState<T = any> {\n isExecuting: boolean;\n results: QueryResult<T>[] | undefined;\n error: string | undefined;\n executionTime: number | undefined;\n}\n\nexport interface QueryExecutorOptions {\n connectionConfig?: ConnectionConfig;\n}\n\nexport function useQueryExecutor<T = any>(options?: QueryExecutorOptions) {\n const {client} = useConnection(options?.connectionConfig);\n\n const [state, setState] = useState<QueryState<T>>({\n isExecuting: false,\n results: undefined,\n error: undefined,\n executionTime: undefined,\n });\n\n const clientRef = useRef(client);\n clientRef.current = client;\n\n const isMountedRef = useRef(true);\n useEffect(() => {\n return () => { isMountedRef.current = false; };\n }, []);\n\n const executionIdRef = useRef(0);\n const pendingRef = useRef<{statements: string | string[], params?: any, shapes?: readonly ShapeNode[]} | null>(null);\n\n const query = useCallback(\n (statements: string | string[], params?: any, shapes?: readonly ShapeNode[]): Promise<void> => {\n const currentClient = clientRef.current;\n\n if (!currentClient) {\n pendingRef.current = {statements, params, shapes};\n setState(prev => ({...prev, isExecuting: true, error: undefined}));\n return Promise.resolve();\n }\n\n pendingRef.current = null;\n const thisExecution = ++executionIdRef.current;\n\n setState(prev => ({...prev, isExecuting: true, error: undefined}));\n\n const startTime = Date.now();\n\n return (async () => {\n try {\n const frameResults = await currentClient.query(statements, params || null, shapes || []) || [];\n\n if (executionIdRef.current !== thisExecution) return;\n\n const executionTime = Date.now() - startTime;\n\n const results: QueryResult<T>[] = frameResults.map((frame: any) => {\n if (Array.isArray(frame) && frame.length > 0) {\n const firstRow = frame[0];\n let columns: Column[] = [];\n\n const hasValueObjects = firstRow && typeof firstRow === 'object' &&\n Object.values(firstRow).some(v => v && typeof v === 'object' && 'type' in v);\n\n if (hasValueObjects) {\n columns = Object.keys(firstRow).map((key) => {\n const value = firstRow[key];\n const dataType = value?.type || 'Utf8';\n return {\n name: key,\n type: dataType,\n payload: [],\n };\n });\n } else {\n columns = Object.keys(firstRow).map((key) => ({\n name: key,\n type: 'Utf8',\n payload: [],\n }));\n }\n\n return {\n columns,\n rows: frame as T[],\n executionTimeMs: executionTime,\n };\n } else {\n return {\n columns: [],\n rows: [],\n executionTimeMs: executionTime,\n };\n }\n });\n\n if (!isMountedRef.current) return;\n setState({\n isExecuting: false,\n results,\n error: undefined,\n executionTime,\n });\n } catch (err) {\n if (executionIdRef.current !== thisExecution) return;\n\n const executionTime = Date.now() - startTime;\n let errorMessage = 'Query execution failed';\n\n if (err instanceof Error) {\n errorMessage = err.message;\n } else if (typeof err === 'string') {\n errorMessage = err;\n } else if (err && typeof err === 'object' && 'message' in err) {\n errorMessage = (err as { message: string }).message;\n }\n\n console.error('Query execution failed:', errorMessage);\n\n if (!isMountedRef.current) return;\n setState(prev => ({\n ...prev,\n isExecuting: false,\n error: errorMessage,\n executionTime,\n }));\n\n }\n })();\n },\n []\n );\n\n useEffect(() => {\n if (client && pendingRef.current) {\n const {statements, params, shapes} = pendingRef.current;\n query(statements, params, shapes);\n }\n }, [client, query]);\n\n const cancelQuery = useCallback(() => {\n executionIdRef.current++;\n setState((prev) => ({\n ...prev,\n isExecuting: false,\n error: 'Query cancelled',\n }));\n }, []);\n\n return {\n isExecuting: state.isExecuting,\n results: state.results,\n error: state.error,\n executionTime: state.executionTime,\n query,\n cancelQuery,\n };\n}\n","// SPDX-License-Identifier: Apache-2.0\n// Copyright (c) 2025 ReifyDB\n\nimport {useEffect, useMemo} from 'react';\nimport {ShapeNode, InferShape} from '@reifydb/core';\nimport {ConnectionConfig} from '../connection/connection';\nimport {useQueryExecutor, type QueryResult, type QueryExecutorOptions} from './use-query-executor';\n\nexport interface QueryOptions extends QueryExecutorOptions {\n connectionConfig?: ConnectionConfig;\n}\n\n// Single query hook - returns a single result\nexport function useQueryOne<S extends ShapeNode = any>(\n rql: string,\n params?: any,\n shape?: S,\n options?: QueryOptions\n): {\n isExecuting: boolean;\n result: QueryResult<S extends ShapeNode ? InferShape<S> : any> | undefined;\n error: string | undefined;\n} {\n const {\n isExecuting,\n results,\n error,\n query\n } = useQueryExecutor<S extends ShapeNode ? InferShape<S> : any>(options);\n\n useEffect(() => {\n // Pass shape as array for the executor\n const shapes = shape ? [shape] : undefined;\n query(rql, params, shapes);\n }, [rql, params, query]);\n\n // Extract first result for single query convenience\n const result = useMemo(() => {\n return results && results.length > 0 ? results[0] : undefined;\n }, [results]);\n\n return {isExecuting, result, error};\n}\n\n// Multiple query hook - returns multiple results\nexport function useQueryMany<S extends readonly ShapeNode[] = readonly ShapeNode[]>(\n statements: string | string[],\n params?: any,\n shapes?: S,\n options?: QueryOptions\n): {\n isExecuting: boolean;\n results: QueryResult<S extends readonly ShapeNode[] ? InferShape<S[number]> : any>[] | undefined;\n error: string | undefined;\n} {\n const {\n isExecuting,\n results,\n error,\n query\n } = useQueryExecutor<S extends readonly ShapeNode[] ? InferShape<S[number]> : any>(options);\n\n useEffect(() => {\n query(statements, params, shapes);\n }, [statements, params, query]);\n\n return {isExecuting, results, error};\n}","// SPDX-License-Identifier: Apache-2.0\n// Copyright (c) 2025 ReifyDB\n\nimport {useState, useCallback, useRef, useEffect} from 'react';\nimport {Column, ShapeNode} from '@reifydb/core';\nimport {ConnectionConfig} from '../connection/connection';\nimport {useConnection} from './use-connection';\n\nexport interface CommandResult<T = any> {\n columns: Column[];\n rows: T[];\n executionTimeMs: number;\n rowsAffected?: number;\n}\n\nexport interface CommandState<T = any> {\n isExecuting: boolean;\n results: CommandResult<T>[] | undefined;\n error: string | undefined;\n executionTime: number | undefined;\n}\n\nexport interface CommandExecutorOptions {\n connectionConfig?: ConnectionConfig;\n}\n\nexport function useCommandExecutor<T = any>(options?: CommandExecutorOptions) {\n const {client} = useConnection(options?.connectionConfig);\n\n const [state, setState] = useState<CommandState<T>>({\n isExecuting: false,\n results: undefined,\n error: undefined,\n executionTime: undefined,\n });\n\n const clientRef = useRef(client);\n clientRef.current = client;\n\n const isMountedRef = useRef(false);\n useEffect(() => {\n isMountedRef.current = true;\n return () => { isMountedRef.current = false; };\n }, []);\n\n const executionIdRef = useRef(0);\n const pendingRef = useRef<{statements: string | string[], params?: any, shapes?: readonly ShapeNode[]} | null>(null);\n\n const command = useCallback(\n (statements: string | string[], params?: any, shapes?: readonly ShapeNode[]): Promise<void> => {\n const currentClient = clientRef.current;\n\n if (!currentClient) {\n pendingRef.current = {statements, params, shapes};\n setState(prev => ({...prev, isExecuting: true, error: undefined}));\n return Promise.resolve();\n }\n\n pendingRef.current = null;\n const thisExecution = ++executionIdRef.current;\n\n setState(prev => ({...prev, isExecuting: true, error: undefined}));\n\n const startTime = Date.now();\n\n return (async () => {\n try {\n const frameResults = await currentClient.command(statements, params || null, shapes || []) || [];\n\n if (executionIdRef.current !== thisExecution) return;\n\n const executionTime = Date.now() - startTime;\n\n const results: CommandResult<T>[] = frameResults.map((frame: any) => {\n if (Array.isArray(frame) && frame.length > 0) {\n const firstRow = frame[0];\n let columns: Column[] = [];\n\n const hasValueObjects = firstRow && typeof firstRow === 'object' &&\n Object.values(firstRow).some(v => v && typeof v === 'object' && 'type' in v);\n\n if (hasValueObjects) {\n columns = Object.keys(firstRow).map((key) => {\n const value = firstRow[key];\n const dataType = value?.type || 'Utf8';\n return {\n name: key,\n type: dataType,\n payload: [],\n };\n });\n } else {\n columns = Object.keys(firstRow).map((key) => ({\n name: key,\n type: 'Utf8',\n payload: [],\n }));\n }\n\n return {\n columns,\n rows: frame as T[],\n executionTimeMs: executionTime,\n };\n } else {\n return {\n columns: [],\n rows: [],\n executionTimeMs: executionTime,\n rowsAffected: typeof frame === 'number' ? frame : undefined,\n };\n }\n });\n\n if (!isMountedRef.current) return;\n setState({\n isExecuting: false,\n results,\n error: undefined,\n executionTime,\n });\n } catch (err) {\n if (executionIdRef.current !== thisExecution) return;\n\n const executionTime = Date.now() - startTime;\n let errorMessage = 'Command execution failed';\n\n if (err instanceof Error) {\n errorMessage = err.message;\n } else if (typeof err === 'string') {\n errorMessage = err;\n } else if (err && typeof err === 'object' && 'message' in err) {\n errorMessage = (err as { message: string }).message;\n }\n\n console.error('Command execution failed:', errorMessage);\n\n if (!isMountedRef.current) return;\n setState(prev => ({\n ...prev,\n isExecuting: false,\n error: errorMessage,\n executionTime,\n }));\n\n }\n })();\n },\n []\n );\n\n useEffect(() => {\n if (client && pendingRef.current) {\n const {statements, params, shapes} = pendingRef.current;\n command(statements, params, shapes);\n }\n }, [client, command]);\n\n const cancelCommand = useCallback(() => {\n executionIdRef.current++;\n setState((prev) => ({\n ...prev,\n isExecuting: false,\n error: 'Command cancelled',\n }));\n }, []);\n\n return {\n isExecuting: state.isExecuting,\n results: state.results,\n error: state.error,\n executionTime: state.executionTime,\n command,\n cancelCommand,\n };\n}\n","// SPDX-License-Identifier: Apache-2.0\n// Copyright (c) 2025 ReifyDB\n\nimport {useEffect, useMemo} from 'react';\nimport {ShapeNode, InferShape} from '@reifydb/core';\nimport {ConnectionConfig} from '../connection/connection';\nimport {useCommandExecutor, type CommandResult, type CommandExecutorOptions} from './use-command-executor';\n\nexport interface CommandOptions extends CommandExecutorOptions {\n connectionConfig?: ConnectionConfig;\n}\n\n// Single command hook - returns a single result\nexport function useCommandOne<S extends ShapeNode = any>(\n statement: string,\n params?: any,\n shape?: S,\n options?: CommandOptions\n): {\n isExecuting: boolean;\n result: CommandResult<S extends ShapeNode ? InferShape<S> : any> | undefined;\n error: string | undefined;\n} {\n const {\n isExecuting,\n results,\n error,\n command\n } = useCommandExecutor<S extends ShapeNode ? InferShape<S> : any>(options);\n\n useEffect(() => {\n // Pass shape as array for the executor\n const shapes = shape ? [shape] : undefined;\n command(statement, params, shapes);\n }, [statement, params, command]);\n\n // Extract first result for single command convenience\n const result = useMemo(() => {\n return results && results.length > 0 ? results[0] : undefined;\n }, [results]);\n\n return {isExecuting, result, error};\n}\n\n// Multiple command hook - returns multiple results\nexport function useCommandMany<S extends readonly ShapeNode[] = readonly ShapeNode[]>(\n statements: string | string[],\n params?: any,\n shapes?: S,\n options?: CommandOptions\n): {\n isExecuting: boolean;\n results: CommandResult<S extends readonly ShapeNode[] ? InferShape<S[number]> : any>[] | undefined;\n error: string | undefined;\n} {\n const {\n isExecuting,\n results,\n error,\n command\n } = useCommandExecutor<S extends readonly ShapeNode[] ? InferShape<S[number]> : any>(options);\n\n useEffect(() => {\n command(statements, params, shapes);\n }, [statements, params, command]);\n\n return {isExecuting, results, error};\n}","// SPDX-License-Identifier: Apache-2.0\n// Copyright (c) 2025 ReifyDB\n\nimport {useState, useCallback, useRef, useEffect} from 'react';\nimport {Column, ShapeNode} from '@reifydb/core';\nimport {ConnectionConfig} from '../connection/connection';\nimport {useConnection} from './use-connection';\n\nexport interface AdminResult<T = any> {\n columns: Column[];\n rows: T[];\n executionTimeMs: number;\n rowsAffected?: number;\n}\n\nexport interface AdminState<T = any> {\n isExecuting: boolean;\n results: AdminResult<T>[] | undefined;\n error: string | undefined;\n executionTime: number | undefined;\n}\n\nexport interface AdminExecutorOptions {\n connectionConfig?: ConnectionConfig;\n}\n\nexport function useAdminExecutor<T = any>(options?: AdminExecutorOptions) {\n const {client} = useConnection(options?.connectionConfig);\n\n const [state, setState] = useState<AdminState<T>>({\n isExecuting: false,\n results: undefined,\n error: undefined,\n executionTime: undefined,\n });\n\n // Stable refs so the callback never recreates\n const clientRef = useRef(client);\n clientRef.current = client;\n\n const isMountedRef = useRef(false);\n useEffect(() => {\n isMountedRef.current = true;\n return () => { isMountedRef.current = false; };\n }, []);\n\n // Counter to detect superseded executions\n const executionIdRef = useRef(0);\n\n // Stash pending call if client isn't ready yet\n const pendingRef = useRef<{statements: string | string[], params?: any, shapes?: readonly ShapeNode[]} | null>(null);\n\n const admin = useCallback(\n (statements: string | string[], params?: any, shapes?: readonly ShapeNode[]): Promise<void> => {\n const currentClient = clientRef.current;\n // If no client yet, stash the request for replay when client connects\n if (!currentClient) {\n pendingRef.current = {statements, params, shapes};\n setState(prev => ({...prev, isExecuting: true, error: undefined}));\n return Promise.resolve();\n }\n\n pendingRef.current = null;\n const thisExecution = ++executionIdRef.current;\n\n setState(prev => ({...prev, isExecuting: true, error: undefined}));\n\n const startTime = Date.now();\n\n return (async () => {\n try {\n const frameResults = await currentClient.admin(statements, params || null, shapes || []) || [];\n\n // If this execution was superseded by a newer one, discard results\n if (executionIdRef.current !== thisExecution) return;\n\n const executionTime = Date.now() - startTime;\n\n // Process each frame into a AdminResult\n const results: AdminResult<T>[] = frameResults.map((frame: any) => {\n if (Array.isArray(frame) && frame.length > 0) {\n const firstRow = frame[0];\n let columns: Column[] = [];\n\n // Check if we have Value objects or plain objects\n const hasValueObjects = firstRow && typeof firstRow === 'object' &&\n Object.values(firstRow).some(v => v && typeof v === 'object' && 'type' in v);\n\n if (hasValueObjects) {\n columns = Object.keys(firstRow).map((key) => {\n const value = firstRow[key];\n const dataType = value?.type || 'Utf8';\n return {\n name: key,\n type: dataType,\n payload: [],\n };\n });\n } else {\n columns = Object.keys(firstRow).map((key) => ({\n name: key,\n type: 'Utf8',\n payload: [],\n }));\n }\n\n return {\n columns,\n rows: frame as T[],\n executionTimeMs: executionTime,\n };\n } else {\n return {\n columns: [],\n rows: [],\n executionTimeMs: executionTime,\n rowsAffected: typeof frame === 'number' ? frame : undefined,\n };\n }\n });\n\n if (!isMountedRef.current) return;\n setState({\n isExecuting: false,\n results,\n error: undefined,\n executionTime,\n });\n } catch (err) {\n if (executionIdRef.current !== thisExecution) return;\n\n const executionTime = Date.now() - startTime;\n let errorMessage = 'Admin execution failed';\n\n if (err instanceof Error) {\n errorMessage = err.message;\n } else if (typeof err === 'string') {\n errorMessage = err;\n } else if (err && typeof err === 'object' && 'message' in err) {\n errorMessage = (err as { message: string }).message;\n }\n\n console.error('Admin execution failed:', errorMessage);\n\n if (!isMountedRef.current) return;\n setState(prev => ({\n ...prev,\n isExecuting: false,\n error: errorMessage,\n executionTime,\n }));\n\n }\n })();\n },\n [] // stable — never recreates\n );\n\n // Replay pending request when client becomes available\n useEffect(() => {\n if (client && pendingRef.current) {\n const {statements, params, shapes} = pendingRef.current;\n admin(statements, params, shapes);\n }\n }, [client, admin]);\n\n const cancelAdmin = useCallback(() => {\n // Bump execution ID so any in-flight request is ignored on completion\n executionIdRef.current++;\n setState((prev) => ({\n ...prev,\n isExecuting: false,\n error: 'Admin cancelled',\n }));\n }, []);\n\n return {\n isExecuting: state.isExecuting,\n results: state.results,\n error: state.error,\n executionTime: state.executionTime,\n admin,\n cancelAdmin,\n };\n}\n","// SPDX-License-Identifier: Apache-2.0\n// Copyright (c) 2025 ReifyDB\n\nimport {useEffect, useMemo} from 'react';\nimport {ShapeNode, InferShape} from '@reifydb/core';\nimport {ConnectionConfig} from '../connection/connection';\nimport {useAdminExecutor, type AdminResult, type AdminExecutorOptions} from './use-admin-executor';\n\nexport interface AdminOptions extends AdminExecutorOptions {\n connectionConfig?: ConnectionConfig;\n}\n\n// Single admin hook - returns a single result\nexport function useAdminOne<S extends ShapeNode = any>(\n statement: string,\n params?: any,\n shape?: S,\n options?: AdminOptions\n): {\n isExecuting: boolean;\n result: AdminResult<S extends ShapeNode ? InferShape<S> : any> | undefined;\n error: string | undefined;\n} {\n const {\n isExecuting,\n results,\n error,\n admin\n } = useAdminExecutor<S extends ShapeNode ? InferShape<S> : any>(options);\n\n useEffect(() => {\n // Pass shape as array for the executor\n const shapes = shape ? [shape] : undefined;\n admin(statement, params, shapes);\n }, [statement, params, admin]);\n\n // Extract first result for single admin convenience\n const result = useMemo(() => {\n return results && results.length > 0 ? results[0] : undefined;\n }, [results]);\n\n return {isExecuting, result, error};\n}\n\n// Multiple admin hook - returns multiple results\nexport function useAdminMany<S extends readonly ShapeNode[] = readonly ShapeNode[]>(\n statements: string | string[],\n params?: any,\n shapes?: S,\n options?: AdminOptions\n): {\n isExecuting: boolean;\n results: AdminResult<S extends readonly ShapeNode[] ? InferShape<S[number]> : any>[] | undefined;\n error: string | undefined;\n} {\n const {\n isExecuting,\n results,\n error,\n admin\n } = useAdminExecutor<S extends readonly ShapeNode[] ? InferShape<S[number]> : any>(options);\n\n useEffect(() => {\n admin(statements, params, shapes);\n }, [statements, params, admin]);\n\n return {isExecuting, results, error};\n}\n","// SPDX-License-Identifier: Apache-2.0\n// Copyright (c) 2025 ReifyDB\n\nimport { useState, useCallback, useRef, useEffect } from 'react';\nimport { ShapeNode } from '@reifydb/core';\nimport { useConnection } from './use-connection';\nimport type { ConnectionConfig } from '../connection/connection';\n\nexport interface SubscriptionExecutorOptions {\n connectionConfig?: ConnectionConfig;\n}\n\nexport interface ChangeEvent<T> {\n operation: 'INSERT' | 'UPDATE' | 'REMOVE';\n rows: T[];\n timestamp: number;\n}\n\nexport interface SubscriptionState<T> {\n data: T[];\n changes: ChangeEvent<T>[];\n isSubscribed: boolean;\n isSubscribing: boolean;\n error: string | undefined;\n subscriptionId: string | undefined;\n}\n\nexport function useSubscriptionExecutor<T = any>(\n options?: SubscriptionExecutorOptions\n) {\n const { client } = useConnection(options?.connectionConfig);\n\n const [state, setState] = useState<SubscriptionState<T>>({\n data: [],\n changes: [],\n isSubscribed: false,\n isSubscribing: false,\n error: undefined,\n subscriptionId: undefined\n });\n\n // Use a ref for client to avoid recreating callbacks when client changes\n const clientRef = useRef(client);\n\n const subscriptionIdRef = useRef<string | undefined>(undefined);\n const queryRef = useRef<string | undefined>(undefined);\n const paramsRef = useRef<any>(undefined);\n const shapeRef = useRef<ShapeNode | undefined>(undefined);\n\n // Keep clientRef in sync with client\n useEffect(() => {\n clientRef.current = client;\n }, [client]);\n\n // Helper to add change event\n const addChangeEvent = useCallback((\n operation: 'INSERT' | 'UPDATE' | 'REMOVE',\n rows: T[]\n ) => {\n setState(prev => {\n const newChange: ChangeEvent<T> = {\n operation,\n rows,\n timestamp: Date.now()\n };\n\n const newChanges = [...prev.changes, newChange];\n\n return {\n ...prev,\n data: prev.data,\n changes: newChanges\n };\n });\n }, []);\n\n // Separate callbacks for each operation type\n const handleInsert = useCallback((rows: T[]) => {\n addChangeEvent('INSERT', rows);\n }, [addChangeEvent]);\n\n const handleUpdate = useCallback((rows: T[]) => {\n addChangeEvent('UPDATE', rows);\n }, [addChangeEvent]);\n\n const handleRemove = useCallback((rows: T[]) => {\n addChangeEvent('REMOVE', rows);\n }, [addChangeEvent]);\n\n const subscribe = useCallback(async (\n query: string,\n params?: any,\n shape?: ShapeNode\n ) => {\n const currentClient = clientRef.current;\n if (!currentClient) {\n setState(prev => ({ ...prev, error: 'Client not connected' }));\n return;\n }\n\n if (!('subscribe' in currentClient)) {\n setState(prev => ({ ...prev, error: 'Subscriptions require a WebSocket connection' }));\n return;\n }\n\n // Store refs for reconnection\n queryRef.current = query;\n paramsRef.current = params;\n shapeRef.current = shape;\n\n setState(prev => ({\n ...prev,\n isSubscribing: true,\n error: undefined\n }));\n\n try {\n const subId = await currentClient.subscribe(query, params, shape, {\n onInsert: handleInsert,\n onUpdate: handleUpdate,\n onRemove: handleRemove\n });\n\n subscriptionIdRef.current = subId;\n setState(prev => ({\n ...prev,\n isSubscribing: false,\n isSubscribed: true,\n subscriptionId: subId\n }));\n } catch (err: any) {\n setState(prev => ({\n ...prev,\n isSubscribing: false,\n error: err.message || 'Subscription failed'\n }));\n }\n }, [handleInsert, handleUpdate, handleRemove]);\n\n const unsubscribe = useCallback(async () => {\n const currentClient = clientRef.current;\n if (!currentClient || !subscriptionIdRef.current) return;\n if (!('unsubscribe' in currentClient)) return;\n\n try {\n await currentClient.unsubscribe(subscriptionIdRef.current);\n subscriptionIdRef.current = undefined;\n queryRef.current = undefined;\n paramsRef.current = undefined;\n shapeRef.current = undefined;\n\n setState(prev => ({\n ...prev,\n isSubscribed: false,\n subscriptionId: undefined\n }));\n } catch (err: any) {\n setState(prev => ({\n ...prev,\n error: err.message || 'Unsubscribe failed'\n }));\n }\n }, []);\n\n const clearChanges = useCallback(() => {\n setState(prev => ({ ...prev, changes: [] }));\n }, []);\n\n const clearData = useCallback(() => {\n setState(prev => ({ ...prev, data: [] }));\n }, []);\n\n // Cleanup on unmount\n useEffect(() => {\n return () => {\n if (subscriptionIdRef.current && clientRef.current && 'unsubscribe' in clientRef.current) {\n clientRef.current.unsubscribe(subscriptionIdRef.current).catch(console.error);\n }\n };\n }, []);\n\n return {\n state,\n subscribe,\n unsubscribe,\n clearChanges,\n clearData\n };\n}\n","// SPDX-License-Identifier: Apache-2.0\n// Copyright (c) 2025 ReifyDB\n\nimport { useEffect, useMemo } from 'react';\nimport { ShapeNode, InferShape } from '@reifydb/core';\nimport {\n useSubscriptionExecutor,\n type SubscriptionExecutorOptions,\n type ChangeEvent\n} from './use-subscription-executor';\n\nexport interface SubscriptionOptions extends SubscriptionExecutorOptions {\n enabled?: boolean; // Auto-subscribe (default: true)\n}\n\nexport function useSubscription<S extends ShapeNode = any>(\n query: string,\n params?: any,\n shape?: S,\n options?: SubscriptionOptions\n): {\n data: InferShape<S>[];\n changes: ChangeEvent<InferShape<S>>[];\n isSubscribed: boolean;\n isSubscribing: boolean;\n error: string | undefined;\n subscriptionId: string | undefined;\n} {\n const {\n state,\n subscribe,\n unsubscribe\n } = useSubscriptionExecutor<InferShape<S>>(options);\n\n // Serialize params for stable comparison (objects create new refs each render)\n const paramsKey = useMemo(() => JSON.stringify(params), [params]);\n\n useEffect(() => {\n if (options?.enabled === false) return;\n\n subscribe(query, params, shape);\n\n return () => {\n unsubscribe();\n };\n }, [query, paramsKey, shape, options?.enabled, subscribe, unsubscribe]);\n\n return {\n data: state.data,\n changes: state.changes,\n isSubscribed: state.isSubscribed,\n isSubscribing: state.isSubscribing,\n error: state.error,\n subscriptionId: state.subscriptionId\n };\n}\n","// SPDX-License-Identifier: Apache-2.0\n// Copyright (c) 2025 ReifyDB\n\nimport {useEffect, useState} from 'react';\nimport {Shape, InferShape} from '@reifydb/core';\nimport {useQueryExecutor} from './use-query-executor';\n\nexport interface ColumnInfo {\n name: string;\n dataType: string;\n}\n\nexport interface TableInfo {\n name: string;\n columns: ColumnInfo[];\n}\n\nconst namespaceShape = Shape.object({\n id: Shape.number(),\n name: Shape.string(),\n});\n\nconst tableShape = Shape.object({\n id: Shape.number(),\n namespace_id: Shape.number(),\n name: Shape.string(),\n primary_key_id: Shape.number(),\n});\n\nconst viewShape = Shape.object({\n id: Shape.number(),\n namespace_id: Shape.number(),\n name: Shape.string(),\n});\n\nconst columnShape = Shape.object({\n id: Shape.number(),\n shape_id: Shape.number(),\n shape_type: Shape.number(),\n name: Shape.string(),\n type: Shape.number(),\n position: Shape.number(),\n auto_increment: Shape.boolean(),\n});\n\ntype NamespaceRow = InferShape<typeof namespaceShape>;\ntype TableRow = InferShape<typeof tableShape>;\ntype ViewRow = InferShape<typeof viewShape>;\ntype ColumnRow = InferShape<typeof columnShape>;\n\nexport function useShape(): [boolean, TableInfo[], string | undefined] {\n const {isExecuting, results, error, query} = useQueryExecutor();\n const [shape, setShape] = useState<TableInfo[]>([]);\n const [isLoading, setIsLoading] = useState(true);\n\n useEffect(() => {\n if (!query) return;\n\n const fetchShape = async () => {\n setIsLoading(true);\n\n try {\n await query(\n `OUTPUT FROM system::namespaces; OUTPUT FROM system::tables; OUTPUT FROM system::views; OUTPUT FROM system::columns;`,\n undefined,\n [namespaceShape, tableShape, viewShape, columnShape]\n );\n } catch (err) {\n console.error('Failed to fetch shape:', err);\n }\n };\n\n fetchShape();\n }, [query]);\n\n useEffect(() => {\n if (!results || results.length < 4) {\n setIsLoading(isExecuting);\n return;\n }\n\n const tablesResult = results[1];\n const viewsResult = results[2];\n const columnsResult = results[3];\n\n if (!tablesResult?.rows || !viewsResult?.rows || !columnsResult?.rows) {\n setIsLoading(false);\n return;\n }\n\n const namespacesResult = results[0];\n const namespaces = namespacesResult.rows as unknown as NamespaceRow[];\n const tables = tablesResult.rows as unknown as TableRow[];\n const views = viewsResult.rows as unknown as ViewRow[];\n const columns = columnsResult.rows as unknown as ColumnRow[];\n\n const namespaceMap = new Map<number, string>();\n namespaces.forEach((ns) => {\n const id = ns.id?.valueOf() as number;\n const name = ns.name?.valueOf() as string;\n if (id !== undefined && name) {\n namespaceMap.set(id, name);\n }\n });\n\n const tableInfoMap = new Map<number, TableInfo>();\n\n tables.forEach((table) => {\n const tableId = table.id?.valueOf() as number;\n const namespaceId = table.namespace_id?.valueOf() as number;\n const tableName = table.name?.valueOf() as string;\n\n if (tableId === undefined || !tableName || namespaceId === undefined) return;\n\n const namespace = namespaceMap.get(namespaceId);\n if (!namespace) return;\n\n const fullTableName = `${namespace}::${tableName}`;\n\n tableInfoMap.set(tableId, {\n name: fullTableName,\n columns: [],\n });\n });\n\n views.forEach((view) => {\n const viewId = view.id?.valueOf() as number;\n const namespaceId = view.namespace_id?.valueOf() as number;\n const viewName = view.name?.valueOf() as string;\n\n if (viewId === undefined || !viewName || namespaceId === undefined) return;\n\n const namespace = namespaceMap.get(namespaceId);\n if (!namespace) return;\n\n const fullViewName = `${namespace}::${viewName}`;\n\n tableInfoMap.set(viewId, {\n name: fullViewName,\n columns: [],\n });\n });\n\n const typeMap: Record<number, string> = {\n 0: 'None',\n 1: 'Float4',\n 2: 'Float8',\n 3: 'Int1',\n 4: 'Int2',\n 5: 'Int4',\n 6: 'Int8',\n 7: 'Int16',\n 8: 'Utf8',\n 9: 'Uint1',\n 10: 'Uint2',\n 11: 'Uint4',\n 12: 'Uint8',\n 13: 'Uint16',\n 14: 'Boolean',\n 15: 'Date',\n 16: 'DateTime',\n 17: 'Time',\n 18: 'Duration',\n 19: 'IdentityId',\n 20: 'Uuid4',\n 21: 'Uuid7',\n 22: 'Blob',\n 23: 'Int',\n 24: 'Decimal',\n 25: 'Uint',\n 26: 'Any',\n };\n\n // Create a map to collect columns with their positions\n const tableColumnsMap = new Map<number, Array<{name: string; dataType: string; position: number}>>();\n\n columns.forEach((column) => {\n const shapeId = column.shape_id?.valueOf() as number;\n const shapeType = column.shape_type?.valueOf() as number;\n const columnName = column.name?.valueOf() as string;\n const typeId = column.type?.valueOf() as number;\n const position = column.position?.valueOf() as number;\n\n if (shapeId === undefined || !columnName || typeId === undefined) return;\n if (shapeType !== 0 && shapeType !== 1) return;\n\n if (!tableColumnsMap.has(shapeId)) {\n tableColumnsMap.set(shapeId, []);\n }\n\n tableColumnsMap.get(shapeId)!.push({\n name: columnName,\n dataType: typeMap[typeId] || `Unknown(${typeId})`,\n position: position ?? 0,\n });\n });\n\n // Sort columns by position and add to table info\n tableColumnsMap.forEach((cols, shapeId) => {\n const tableInfo = tableInfoMap.get(shapeId);\n if (tableInfo) {\n cols.sort((a, b) => a.position - b.position);\n tableInfo.columns = cols.map((c) => ({name: c.name, dataType: c.dataType}));\n }\n });\n\n const shapeArray = Array.from(tableInfoMap.values())\n .filter((table) => table.name !== 'reifydb::flows')\n .sort((a, b) => a.name.localeCompare(b.name));\n\n setShape(shapeArray);\n setIsLoading(false);\n }, [results, isExecuting]);\n\n return [isLoading, shape, error];\n}\n"],"mappings":"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","names":["useEffect","useEffect","useState","useRef","useEffect","useState","useRef","useEffect","useEffect","useEffect","useState","useCallback","useRef","useEffect","useState","useRef","useEffect","useCallback","useEffect","useMemo","useEffect","useMemo","useState","useCallback","useRef","useEffect","useState","useRef","useEffect","useCallback","useEffect","useMemo","useEffect","useMemo","useState","useCallback","useRef","useEffect","useState","useRef","useEffect","useCallback","useEffect","useMemo","useMemo","useEffect","useEffect","useState","useState","useEffect"]}
package/package.json CHANGED
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "@reifydb/react",
3
- "version": "0.4.7",
3
+ "version": "0.4.8",
4
4
  "type": "module",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
7
7
  "dependencies": {
8
- "@reifydb/client": "0.4.7",
9
- "@reifydb/core": "0.4.7"
8
+ "@reifydb/core": "0.4.8",
9
+ "@reifydb/client": "0.4.8"
10
10
  },
11
11
  "peerDependencies": {
12
12
  "react": ">=16.8.0"