@pol-studios/db 1.0.10 → 1.0.12

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (120) hide show
  1. package/dist/DataLayerContext-CL6alnkb.d.ts +755 -0
  2. package/dist/UserMetadataContext-B8gVWGMl.d.ts +35 -0
  3. package/dist/UserMetadataContext-DntmpK41.d.ts +33 -0
  4. package/dist/auth/context.d.ts +3 -2
  5. package/dist/auth/context.js +5 -4
  6. package/dist/auth/guards.js +2 -2
  7. package/dist/auth/hooks.d.ts +3 -3
  8. package/dist/auth/hooks.js +6 -5
  9. package/dist/auth/index.d.ts +3 -2
  10. package/dist/auth/index.js +8 -6
  11. package/dist/{canvas-UVNDA54X.node → canvas-C4TBBDUL.node} +0 -0
  12. package/dist/{canvas-75Y7XMF3.js → canvas-ZQNCL7JL.js} +2 -2
  13. package/dist/chunk-5EFDS7SR.js +205 -0
  14. package/dist/chunk-5EFDS7SR.js.map +1 -0
  15. package/dist/{chunk-BRTW7CO5.js → chunk-7SCJNYTE.js} +1 -9
  16. package/dist/chunk-7SCJNYTE.js.map +1 -0
  17. package/dist/chunk-DJ6VLEAL.js +247 -0
  18. package/dist/chunk-DJ6VLEAL.js.map +1 -0
  19. package/dist/{chunk-Y3INY2CS.js → chunk-GC3TBUWE.js} +1 -1
  20. package/dist/chunk-GC3TBUWE.js.map +1 -0
  21. package/dist/{chunk-7HG6G25H.js → chunk-H3LNH2NT.js} +169 -268
  22. package/dist/chunk-H3LNH2NT.js.map +1 -0
  23. package/dist/{chunk-USJYMRUO.js → chunk-HAWJTZCK.js} +2 -2
  24. package/dist/chunk-HAWJTZCK.js.map +1 -0
  25. package/dist/chunk-JAATANS3.js +429 -0
  26. package/dist/chunk-JAATANS3.js.map +1 -0
  27. package/dist/chunk-LNJ3WF7V.js +470 -0
  28. package/dist/chunk-LNJ3WF7V.js.map +1 -0
  29. package/dist/chunk-N26IEHZT.js +79 -0
  30. package/dist/chunk-N26IEHZT.js.map +1 -0
  31. package/dist/chunk-NSIAAYW3.js +1 -0
  32. package/dist/chunk-NSIAAYW3.js.map +1 -0
  33. package/dist/chunk-NZON56CB.js +3864 -0
  34. package/dist/chunk-NZON56CB.js.map +1 -0
  35. package/dist/{chunk-O3K7R32P.js → chunk-OQ7U6EQ3.js} +118 -123
  36. package/dist/chunk-OQ7U6EQ3.js.map +1 -0
  37. package/dist/chunk-SM73S2DY.js +11 -0
  38. package/dist/chunk-SM73S2DY.js.map +1 -0
  39. package/dist/{chunk-JUVE3DWY.js → chunk-TKWR5AAY.js} +47 -65
  40. package/dist/chunk-TKWR5AAY.js.map +1 -0
  41. package/dist/{chunk-2IFGILT3.js → chunk-U5UNPBKB.js} +76 -107
  42. package/dist/chunk-U5UNPBKB.js.map +1 -0
  43. package/dist/chunk-WGDJ4IXR.js +921 -0
  44. package/dist/chunk-WGDJ4IXR.js.map +1 -0
  45. package/dist/chunk-WVF7RUW5.js +186 -0
  46. package/dist/chunk-WVF7RUW5.js.map +1 -0
  47. package/dist/{chunk-ZTSBF536.js → chunk-X3HZLNBV.js} +637 -435
  48. package/dist/chunk-X3HZLNBV.js.map +1 -0
  49. package/dist/{chunk-EL45Z26M.js → chunk-XU3SBFAG.js} +1219 -208
  50. package/dist/chunk-XU3SBFAG.js.map +1 -0
  51. package/dist/chunk-ZVBHWU7O.js +1412 -0
  52. package/dist/chunk-ZVBHWU7O.js.map +1 -0
  53. package/dist/client/index.d.ts +1 -1
  54. package/dist/client/index.js +42 -23
  55. package/dist/client/index.js.map +1 -1
  56. package/dist/core/index.d.ts +19 -0
  57. package/dist/{index-BFu5_dS8.d.ts → database.types-ChFCG-4M.d.ts} +1 -177
  58. package/dist/gen/index.js +4 -2
  59. package/dist/hooks/index.d.ts +10 -3
  60. package/dist/hooks/index.js +8 -10
  61. package/dist/index-CQLyNG6A.d.ts +433 -0
  62. package/dist/index.d.ts +12 -8
  63. package/dist/index.js +92 -48
  64. package/dist/index.native.d.ts +373 -33
  65. package/dist/index.native.js +79 -47
  66. package/dist/index.web.d.ts +10 -7
  67. package/dist/index.web.js +83 -78
  68. package/dist/index.web.js.map +1 -1
  69. package/dist/mutation/index.d.ts +2 -2
  70. package/dist/mutation/index.js +307 -122
  71. package/dist/mutation/index.js.map +1 -1
  72. package/dist/parser/index.js +2 -2
  73. package/dist/{pdf-3TIGQRLA.js → pdf-PHXP7RHD.js} +2 -2
  74. package/dist/powersync-bridge/index.d.ts +284 -0
  75. package/dist/powersync-bridge/index.js +22 -0
  76. package/dist/powersync-bridge/index.js.map +1 -0
  77. package/dist/query/index.js +5 -5
  78. package/dist/realtime/index.js +252 -128
  79. package/dist/realtime/index.js.map +1 -1
  80. package/dist/{UserMetadataContext-BYYqA6LI.d.ts → setupAuthContext-Kv-THH-h.d.ts} +1 -29
  81. package/dist/types/index.d.ts +5 -1
  82. package/dist/types/index.js +10 -5
  83. package/dist/{useBatchUpsert-CSQVX7w8.d.ts → useBatchUpsert-9OYjibLh.d.ts} +1 -1
  84. package/dist/{useDbCount-RGCuHmHp.d.ts → useDbCount-BG356T9i.d.ts} +3 -719
  85. package/dist/{useReceiptAI-Bn0czE7C.d.ts → useReceiptAI-6HkRpRml.d.ts} +1 -1
  86. package/dist/{useResolveFeedback-CpZPP8Pw.d.ts → useResolveFeedback-BWmatBlE.d.ts} +26 -45
  87. package/dist/{useSupabase-pPhUZHcl.d.ts → useSupabase-DvWVuHHE.d.ts} +2 -1
  88. package/dist/with-auth/index.d.ts +704 -0
  89. package/dist/with-auth/index.js +1221 -0
  90. package/dist/with-auth/index.js.map +1 -0
  91. package/package.json +25 -10
  92. package/dist/chunk-2IFGILT3.js.map +0 -1
  93. package/dist/chunk-3M2U6TXH.js +0 -928
  94. package/dist/chunk-3M2U6TXH.js.map +0 -1
  95. package/dist/chunk-5ZYAEGCJ.js +0 -416
  96. package/dist/chunk-5ZYAEGCJ.js.map +0 -1
  97. package/dist/chunk-7HG6G25H.js.map +0 -1
  98. package/dist/chunk-7XT7K4QT.js +0 -2687
  99. package/dist/chunk-7XT7K4QT.js.map +0 -1
  100. package/dist/chunk-AWFMICFV.js +0 -158
  101. package/dist/chunk-AWFMICFV.js.map +0 -1
  102. package/dist/chunk-BRTW7CO5.js.map +0 -1
  103. package/dist/chunk-EL45Z26M.js.map +0 -1
  104. package/dist/chunk-ERGF2FCE.js +0 -903
  105. package/dist/chunk-ERGF2FCE.js.map +0 -1
  106. package/dist/chunk-GK7B66LY.js +0 -135
  107. package/dist/chunk-GK7B66LY.js.map +0 -1
  108. package/dist/chunk-GQI6WJGI.js +0 -172
  109. package/dist/chunk-GQI6WJGI.js.map +0 -1
  110. package/dist/chunk-JUVE3DWY.js.map +0 -1
  111. package/dist/chunk-O3K7R32P.js.map +0 -1
  112. package/dist/chunk-SEY5UO2T.js +0 -89
  113. package/dist/chunk-SEY5UO2T.js.map +0 -1
  114. package/dist/chunk-USJYMRUO.js.map +0 -1
  115. package/dist/chunk-XX3IWSPM.js +0 -189
  116. package/dist/chunk-XX3IWSPM.js.map +0 -1
  117. package/dist/chunk-Y3INY2CS.js.map +0 -1
  118. package/dist/chunk-ZTSBF536.js.map +0 -1
  119. /package/dist/{canvas-75Y7XMF3.js.map → canvas-ZQNCL7JL.js.map} +0 -0
  120. /package/dist/{pdf-3TIGQRLA.js.map → pdf-PHXP7RHD.js.map} +0 -0
@@ -1,11 +1,11 @@
1
1
  import {
2
2
  PostgrestParser
3
- } from "../chunk-JUVE3DWY.js";
3
+ } from "../chunk-TKWR5AAY.js";
4
4
  import "../chunk-J4ZVCXZ4.js";
5
5
  import {
6
6
  isNullOrWhitespace,
7
7
  newUuid
8
- } from "../chunk-O3K7R32P.js";
8
+ } from "../chunk-OQ7U6EQ3.js";
9
9
  import {
10
10
  buildNormalizedQuery,
11
11
  encode,
@@ -19,30 +19,50 @@ import "../chunk-3PJTNH2L.js";
19
19
  import {
20
20
  UserSessionId,
21
21
  useSupabase
22
- } from "../chunk-AWFMICFV.js";
22
+ } from "../chunk-5EFDS7SR.js";
23
23
  import "../chunk-P4UZ7IXC.js";
24
24
 
25
25
  // src/realtime/useRealtime.ts
26
+ import { c as _c } from "react/compiler-runtime";
26
27
  import { useEffect, useState, useRef } from "react";
27
- import {
28
- REALTIME_POSTGRES_CHANGES_LISTEN_EVENT
29
- } from "@supabase/supabase-js";
28
+ import { REALTIME_POSTGRES_CHANGES_LISTEN_EVENT } from "@supabase/supabase-js";
30
29
  import { useDelayedValue } from "@pol-studios/hooks/state";
31
30
  function useRealtime(key, query, table, primaryKeys, options) {
31
+ const $ = _c(37);
32
32
  const supabase = useSupabase();
33
33
  const tableNameValue = typeof table === "string" ? table : table.table;
34
34
  const schemaValue = typeof table === "string" ? "public" : table.schema;
35
35
  const queriesForTable = useQueriesForTableLoader(tableNameValue);
36
- const deleteItem = useDeleteItem({
37
- primaryKeys,
38
- table: tableNameValue,
39
- schema: schemaValue
40
- });
41
- const upsertItem = useUpsertItem({
42
- primaryKeys,
43
- table: tableNameValue,
44
- schema: schemaValue
45
- });
36
+ let t0;
37
+ if ($[0] !== primaryKeys || $[1] !== schemaValue || $[2] !== tableNameValue) {
38
+ t0 = {
39
+ primaryKeys,
40
+ table: tableNameValue,
41
+ schema: schemaValue
42
+ };
43
+ $[0] = primaryKeys;
44
+ $[1] = schemaValue;
45
+ $[2] = tableNameValue;
46
+ $[3] = t0;
47
+ } else {
48
+ t0 = $[3];
49
+ }
50
+ const deleteItem = useDeleteItem(t0);
51
+ let t1;
52
+ if ($[4] !== primaryKeys || $[5] !== schemaValue || $[6] !== tableNameValue) {
53
+ t1 = {
54
+ primaryKeys,
55
+ table: tableNameValue,
56
+ schema: schemaValue
57
+ };
58
+ $[4] = primaryKeys;
59
+ $[5] = schemaValue;
60
+ $[6] = tableNameValue;
61
+ $[7] = t1;
62
+ } else {
63
+ t1 = $[7];
64
+ }
65
+ const upsertItem = useUpsertItem(t1);
46
66
  const [realtimeState, setRealtimeState] = useState("CLOSED");
47
67
  const [retryTick, setRetryTick] = useState(0);
48
68
  const channelRef = useRef(null);
@@ -52,38 +72,36 @@ function useRealtime(key, query, table, primaryKeys, options) {
52
72
  const filter = options?.filter;
53
73
  const onChange = options?.onChange;
54
74
  const debouncedKey = useDelayedValue(key, 50);
55
- useEffect(() => {
56
- if (!enabled) {
75
+ let t2;
76
+ if ($[8] !== deleteItem || $[9] !== enabled || $[10] !== filter || $[11] !== onChange || $[12] !== primaryKeys || $[13] !== queriesForTable || $[14] !== query || $[15] !== retryTick || $[16] !== schemaValue || $[17] !== supabase || $[18] !== tableNameValue || $[19] !== upsertItem) {
77
+ t2 = () => {
78
+ if (!enabled) {
79
+ if (channelRef.current) {
80
+ channelRef.current.unsubscribe();
81
+ supabase.removeChannel(channelRef.current);
82
+ channelRef.current = null;
83
+ }
84
+ setRealtimeState("CLOSED");
85
+ return;
86
+ }
87
+ const now = Date.now();
88
+ const timeSinceLastRetry = now - lastRetryTimeRef.current;
89
+ if (timeSinceLastRetry < 2e3 && retryTick > 0) {
90
+ return;
91
+ }
57
92
  if (channelRef.current) {
58
93
  channelRef.current.unsubscribe();
59
94
  supabase.removeChannel(channelRef.current);
60
95
  channelRef.current = null;
61
96
  }
62
- setRealtimeState("CLOSED");
63
- return;
64
- }
65
- const now = Date.now();
66
- const timeSinceLastRetry = now - lastRetryTimeRef.current;
67
- const minRetryInterval = 2e3;
68
- if (timeSinceLastRetry < minRetryInterval && retryTick > 0) {
69
- return;
70
- }
71
- if (channelRef.current) {
72
- channelRef.current.unsubscribe();
73
- supabase.removeChannel(channelRef.current);
74
- channelRef.current = null;
75
- }
76
- lastRetryTimeRef.current = now;
77
- retryCountRef.current += 1;
78
- const channel = supabase.channel(newUuid()).on(
79
- "postgres_changes",
80
- {
97
+ lastRetryTimeRef.current = now;
98
+ retryCountRef.current = retryCountRef.current + 1;
99
+ const channel = supabase.channel(newUuid()).on("postgres_changes", {
81
100
  event: "*",
82
101
  schema: schemaValue,
83
102
  table: tableNameValue,
84
103
  filter
85
- },
86
- async (payload) => {
104
+ }, async (payload) => {
87
105
  let data = payload.new ?? payload.old;
88
106
  if (payload.new && Object.keys(payload.new).length > 0) {
89
107
  const selectQuery = buildNormalizedQuery({
@@ -91,24 +109,19 @@ function useRealtime(key, query, table, primaryKeys, options) {
91
109
  query
92
110
  });
93
111
  if (payload.eventType !== REALTIME_POSTGRES_CHANGES_LISTEN_EVENT.DELETE && selectQuery) {
94
- if (selectQuery.groupedUserQueryPaths.every(
95
- (x) => x.path in data
96
- ) === false) {
112
+ if (selectQuery.groupedUserQueryPaths.every((x) => x.path in data) === false) {
97
113
  const qb = supabase.schema(payload.schema).from(payload.table).select(selectQuery.selectQuery);
98
114
  for (const pk of primaryKeys) {
99
115
  qb.eq(pk.toString(), data[pk]);
100
116
  }
101
117
  const res = await qb.single();
102
118
  if (res.data) {
103
- data = normalizeResponse(
104
- selectQuery.groupedPaths,
105
- res.data
106
- );
119
+ data = normalizeResponse(selectQuery.groupedPaths, res.data);
107
120
  }
108
121
  }
109
122
  }
110
123
  if ("changedBySessionId" in data) {
111
- const sessionId = data["changedBySessionId"];
124
+ const sessionId = data.changedBySessionId;
112
125
  if (sessionId !== UserSessionId) {
113
126
  await upsertItem(data);
114
127
  }
@@ -125,65 +138,102 @@ function useRealtime(key, query, table, primaryKeys, options) {
125
138
  if (onChange) {
126
139
  onChange(payload);
127
140
  }
128
- }
129
- ).on(
130
- "postgres_changes",
131
- {
141
+ }).on("postgres_changes", {
132
142
  event: "DELETE",
133
143
  schema: schemaValue,
134
144
  table: tableNameValue
135
- },
136
- async (payload) => {
137
- if (payload.eventType === REALTIME_POSTGRES_CHANGES_LISTEN_EVENT.DELETE) {
138
- await deleteItem(payload.old);
145
+ }, async (payload_0) => {
146
+ if (payload_0.eventType === REALTIME_POSTGRES_CHANGES_LISTEN_EVENT.DELETE) {
147
+ await deleteItem(payload_0.old);
139
148
  }
140
- }
141
- ).subscribe((status) => {
142
- setRealtimeState(status);
143
- if (status === "SUBSCRIBED") {
149
+ }).subscribe((status) => {
150
+ setRealtimeState(status);
151
+ if (status === "SUBSCRIBED") {
152
+ retryCountRef.current = 0;
153
+ }
154
+ });
155
+ channelRef.current = channel;
156
+ return () => {
157
+ if (channelRef.current) {
158
+ channelRef.current.unsubscribe();
159
+ supabase.removeChannel(channelRef.current);
160
+ channelRef.current = null;
161
+ }
162
+ };
163
+ };
164
+ $[8] = deleteItem;
165
+ $[9] = enabled;
166
+ $[10] = filter;
167
+ $[11] = onChange;
168
+ $[12] = primaryKeys;
169
+ $[13] = queriesForTable;
170
+ $[14] = query;
171
+ $[15] = retryTick;
172
+ $[16] = schemaValue;
173
+ $[17] = supabase;
174
+ $[18] = tableNameValue;
175
+ $[19] = upsertItem;
176
+ $[20] = t2;
177
+ } else {
178
+ t2 = $[20];
179
+ }
180
+ let t3;
181
+ if ($[21] !== primaryKeys) {
182
+ t3 = primaryKeys.join(",");
183
+ $[21] = primaryKeys;
184
+ $[22] = t3;
185
+ } else {
186
+ t3 = $[22];
187
+ }
188
+ let t4;
189
+ if ($[23] !== debouncedKey || $[24] !== enabled || $[25] !== filter || $[26] !== query || $[27] !== retryTick || $[28] !== schemaValue || $[29] !== supabase || $[30] !== t3 || $[31] !== tableNameValue) {
190
+ t4 = [supabase, tableNameValue, schemaValue, enabled, filter, query, t3, retryTick, debouncedKey];
191
+ $[23] = debouncedKey;
192
+ $[24] = enabled;
193
+ $[25] = filter;
194
+ $[26] = query;
195
+ $[27] = retryTick;
196
+ $[28] = schemaValue;
197
+ $[29] = supabase;
198
+ $[30] = t3;
199
+ $[31] = tableNameValue;
200
+ $[32] = t4;
201
+ } else {
202
+ t4 = $[32];
203
+ }
204
+ useEffect(t2, t4);
205
+ let t5;
206
+ let t6;
207
+ if ($[33] !== enabled || $[34] !== realtimeState) {
208
+ t5 = () => {
209
+ if (!enabled || realtimeState === "SUBSCRIBED") {
144
210
  retryCountRef.current = 0;
211
+ return;
145
212
  }
146
- });
147
- channelRef.current = channel;
148
- return () => {
149
- if (channelRef.current) {
150
- channelRef.current.unsubscribe();
151
- supabase.removeChannel(channelRef.current);
152
- channelRef.current = null;
153
- }
213
+ const delay = Math.min(5e3 * Math.pow(2, retryCountRef.current), 6e4);
214
+ const id = setTimeout(() => {
215
+ setRetryTick(_temp);
216
+ }, delay);
217
+ return () => clearTimeout(id);
154
218
  };
155
- }, [
156
- supabase,
157
- tableNameValue,
158
- schemaValue,
159
- enabled,
160
- filter,
161
- query,
162
- primaryKeys.join(","),
163
- retryTick,
164
- debouncedKey
165
- ]);
166
- useEffect(() => {
167
- if (!enabled || realtimeState === "SUBSCRIBED") {
168
- retryCountRef.current = 0;
169
- return;
170
- }
171
- const baseDelay = 5e3;
172
- const maxDelay = 6e4;
173
- const delay = Math.min(
174
- baseDelay * Math.pow(2, retryCountRef.current),
175
- maxDelay
176
- );
177
- const id = setTimeout(() => {
178
- setRetryTick((t) => t + 1);
179
- }, delay);
180
- return () => clearTimeout(id);
181
- }, [realtimeState, enabled]);
219
+ t6 = [realtimeState, enabled];
220
+ $[33] = enabled;
221
+ $[34] = realtimeState;
222
+ $[35] = t5;
223
+ $[36] = t6;
224
+ } else {
225
+ t5 = $[35];
226
+ t6 = $[36];
227
+ }
228
+ useEffect(t5, t6);
182
229
  return realtimeState;
183
230
  }
231
+ function _temp(t) {
232
+ return t + 1;
233
+ }
184
234
 
185
235
  // src/realtime/useRealtimeQuery.ts
186
- import { useMemo } from "react";
236
+ import { c as _c2 } from "react/compiler-runtime";
187
237
  function convertFilterToRealtimeQuery(filters) {
188
238
  function convert(filter) {
189
239
  if (!filter) return "";
@@ -205,43 +255,117 @@ function convertFilterToRealtimeQuery(filters) {
205
255
  }
206
256
  return convert(filters[0]);
207
257
  }
208
- function useRealtimeQuery(query, config, primaryKeys = ["id"]) {
209
- const parser = useMemo(
210
- () => new PostgrestParser(query),
211
- [query]
212
- );
213
- const request = useQuery(
214
- query,
215
- useMemo(() => config, [config])
216
- );
217
- const queryKey = encode(query, false);
218
- const filterString = convertFilterToRealtimeQuery(parser.filters);
219
- let filter = request.data && typeof request.data === "object" && "id" in request.data ? "id=eq." + request.data.id : filterString;
220
- if (filter.includes('in.(\\"\\")')) {
221
- filter = void 0;
258
+ function useRealtimeQuery(query, config, t0) {
259
+ const $ = _c2(27);
260
+ let t1;
261
+ if ($[0] !== t0) {
262
+ t1 = t0 === void 0 ? ["id"] : t0;
263
+ $[0] = t0;
264
+ $[1] = t1;
265
+ } else {
266
+ t1 = $[1];
222
267
  }
223
- if (isNullOrWhitespace(filter)) {
224
- filter = void 0;
268
+ const primaryKeys = t1;
269
+ const t2 = query;
270
+ let t3;
271
+ if ($[2] !== t2) {
272
+ t3 = new PostgrestParser(t2);
273
+ $[2] = t2;
274
+ $[3] = t3;
275
+ } else {
276
+ t3 = $[3];
225
277
  }
226
- const selectStatement = parser.select;
227
- const realtimeStatus = useRealtime(
228
- queryKey.join("-"),
229
- selectStatement,
230
- { schema: parser.schema, table: parser.table },
231
- primaryKeys,
232
- {
233
- filter,
234
- enabled: typeof config?.enabled === "boolean" ? config.enabled : true
278
+ const parser = t3;
279
+ const request = useQuery(query, config);
280
+ let filter;
281
+ let selectStatement;
282
+ let t4;
283
+ let t5;
284
+ if ($[4] !== parser.filters || $[5] !== parser.select || $[6] !== query || $[7] !== request.data) {
285
+ const queryKey = encode(query, false);
286
+ let t62;
287
+ if ($[12] !== parser.filters || $[13] !== request.data) {
288
+ const filterString = convertFilterToRealtimeQuery(parser.filters);
289
+ filter = request.data && typeof request.data === "object" && "id" in request.data ? "id=eq." + request.data.id : filterString;
290
+ if (filter.includes('in.(\\"\\")')) {
291
+ filter = void 0;
292
+ }
293
+ t62 = isNullOrWhitespace(filter);
294
+ $[12] = parser.filters;
295
+ $[13] = request.data;
296
+ $[14] = filter;
297
+ $[15] = t62;
298
+ } else {
299
+ filter = $[14];
300
+ t62 = $[15];
301
+ }
302
+ if (t62) {
303
+ filter = void 0;
235
304
  }
236
- );
305
+ selectStatement = parser.select;
306
+ t4 = useRealtime;
307
+ t5 = queryKey.join("-");
308
+ $[4] = parser.filters;
309
+ $[5] = parser.select;
310
+ $[6] = query;
311
+ $[7] = request.data;
312
+ $[8] = filter;
313
+ $[9] = selectStatement;
314
+ $[10] = t4;
315
+ $[11] = t5;
316
+ } else {
317
+ filter = $[8];
318
+ selectStatement = $[9];
319
+ t4 = $[10];
320
+ t5 = $[11];
321
+ }
322
+ let t6;
323
+ if ($[16] !== parser.schema || $[17] !== parser.table) {
324
+ t6 = {
325
+ schema: parser.schema,
326
+ table: parser.table
327
+ };
328
+ $[16] = parser.schema;
329
+ $[17] = parser.table;
330
+ $[18] = t6;
331
+ } else {
332
+ t6 = $[18];
333
+ }
334
+ const t7 = typeof config?.enabled === "boolean" ? config.enabled : true;
335
+ let t8;
336
+ if ($[19] !== filter || $[20] !== t7) {
337
+ t8 = {
338
+ filter,
339
+ enabled: t7
340
+ };
341
+ $[19] = filter;
342
+ $[20] = t7;
343
+ $[21] = t8;
344
+ } else {
345
+ t8 = $[21];
346
+ }
347
+ const realtimeStatus = t4(t5, selectStatement, t6, primaryKeys, t8);
237
348
  const outputRealtimeStatus = request.isFetching ? "Loading..." : realtimeStatus;
238
- return {
239
- ...request,
240
- data: request.data,
241
- realtimeStatus: outputRealtimeStatus,
242
- isRealtimeConnected: realtimeStatus == "SUBSCRIBED",
243
- isRealtimeLoading: request.isFetching
244
- };
349
+ const t9 = request.data;
350
+ const t10 = realtimeStatus == "SUBSCRIBED";
351
+ let t11;
352
+ if ($[22] !== outputRealtimeStatus || $[23] !== request || $[24] !== t10 || $[25] !== t9) {
353
+ t11 = {
354
+ ...request,
355
+ data: t9,
356
+ realtimeStatus: outputRealtimeStatus,
357
+ isRealtimeConnected: t10,
358
+ isRealtimeLoading: request.isFetching
359
+ };
360
+ $[22] = outputRealtimeStatus;
361
+ $[23] = request;
362
+ $[24] = t10;
363
+ $[25] = t9;
364
+ $[26] = t11;
365
+ } else {
366
+ t11 = $[26];
367
+ }
368
+ return t11;
245
369
  }
246
370
  export {
247
371
  convertFilterToRealtimeQuery,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/realtime/useRealtime.ts","../../src/realtime/useRealtimeQuery.ts"],"sourcesContent":["import {\n useDeleteItem,\n useQueriesForTableLoader,\n useUpsertItem,\n} from \"@supabase-cache-helpers/postgrest-react-query\";\nimport { useEffect, useState, useRef } from \"react\";\nimport useSupabase, { UserSessionId } from \"../useSupabase\";\nimport { newUuid } from \"@pol-studios/utils\";\nimport {\n buildNormalizedQuery,\n normalizeResponse,\n} from \"@supabase-cache-helpers/postgrest-core\";\nimport {\n REALTIME_POSTGRES_CHANGES_LISTEN_EVENT,\n type RealtimePostgresChangesPayload,\n} from \"@supabase/supabase-js\";\nimport { useDelayedValue } from \"@pol-studios/hooks/state\";\n\nexport default function useRealtime(\n key: string,\n query: string,\n table: string | { table: string; schema: string },\n primaryKeys: string[],\n options?: {\n filter?: string;\n enabled?: boolean;\n onChange?: (\n payload: RealtimePostgresChangesPayload<{\n [key: string]: any;\n }>,\n ) => any;\n },\n) {\n const supabase = useSupabase();\n\n const tableNameValue = typeof table === \"string\" ? table : table.table;\n const schemaValue = typeof table === \"string\" ? \"public\" : table.schema;\n const queriesForTable = useQueriesForTableLoader(tableNameValue);\n\n const deleteItem = useDeleteItem({\n primaryKeys: primaryKeys,\n table: tableNameValue,\n schema: schemaValue,\n });\n const upsertItem = useUpsertItem({\n primaryKeys: primaryKeys,\n table: tableNameValue,\n schema: schemaValue,\n });\n\n const [realtimeState, setRealtimeState] = useState<\n \"SUBSCRIBED\" | \"TIMED_OUT\" | \"CLOSED\" | \"CHANNEL_ERROR\"\n >(\"CLOSED\");\n const [retryTick, setRetryTick] = useState(0);\n\n const channelRef = useRef<ReturnType<typeof supabase.channel> | null>(null);\n const lastRetryTimeRef = useRef<number>(0);\n const retryCountRef = useRef<number>(0);\n\n const enabled = options?.enabled ?? true;\n const filter = options?.filter;\n const onChange = options?.onChange;\n\n // Debounce the key to prevent rapid subscription churn during fast navigation\n const debouncedKey = useDelayedValue(key, 50);\n\n useEffect(() => {\n if (!enabled) {\n if (channelRef.current) {\n channelRef.current.unsubscribe();\n supabase.removeChannel(channelRef.current);\n channelRef.current = null;\n }\n setRealtimeState(\"CLOSED\");\n return;\n }\n\n // Prevent rapid retries - throttle to at least 2 seconds between attempts\n const now = Date.now();\n const timeSinceLastRetry = now - lastRetryTimeRef.current;\n const minRetryInterval = 2000;\n\n if (timeSinceLastRetry < minRetryInterval && retryTick > 0) {\n return;\n }\n\n // Clean up existing channel before creating a new one\n if (channelRef.current) {\n channelRef.current.unsubscribe();\n supabase.removeChannel(channelRef.current);\n channelRef.current = null;\n }\n\n lastRetryTimeRef.current = now;\n retryCountRef.current += 1;\n\n const channel = supabase\n .channel(newUuid())\n .on(\n \"postgres_changes\",\n {\n event: \"*\",\n schema: schemaValue,\n table: tableNameValue,\n filter: filter,\n },\n async (payload) => {\n let data: any = payload.new ?? payload.old;\n\n if (payload.new && Object.keys(payload.new).length > 0) {\n const selectQuery = buildNormalizedQuery({\n queriesForTable,\n query,\n });\n\n if (\n payload.eventType !==\n REALTIME_POSTGRES_CHANGES_LISTEN_EVENT.DELETE &&\n selectQuery\n ) {\n if (\n selectQuery.groupedUserQueryPaths.every((x) =>\n x.path in data\n ) === false\n ) {\n const qb = supabase\n .schema(payload.schema as any)\n .from(payload.table as any)\n .select(selectQuery.selectQuery);\n for (const pk of primaryKeys) {\n qb.eq(pk.toString(), data[pk]);\n }\n const res = await qb.single();\n if (res.data) {\n data = normalizeResponse(\n selectQuery.groupedPaths,\n res.data,\n );\n }\n }\n }\n\n if (\"changedBySessionId\" in data) {\n const sessionId = data[\"changedBySessionId\"];\n if (sessionId !== UserSessionId) {\n await upsertItem(data);\n }\n } else {\n await upsertItem(data);\n }\n }\n\n if (\n payload.eventType === REALTIME_POSTGRES_CHANGES_LISTEN_EVENT.DELETE\n ) {\n await deleteItem(payload.old);\n }\n\n if (payload.errors?.length > 0) {\n setRealtimeState(\"CHANNEL_ERROR\");\n }\n\n if (onChange) {\n onChange(payload);\n }\n },\n )\n .on(\n \"postgres_changes\",\n {\n event: \"DELETE\",\n schema: schemaValue,\n table: tableNameValue,\n },\n async (payload) => {\n if (\n payload.eventType === REALTIME_POSTGRES_CHANGES_LISTEN_EVENT.DELETE\n ) {\n await deleteItem(payload.old);\n }\n },\n )\n .subscribe((status) => {\n setRealtimeState(status);\n\n if (status === \"SUBSCRIBED\") {\n retryCountRef.current = 0;\n }\n });\n\n channelRef.current = channel;\n\n return () => {\n if (channelRef.current) {\n channelRef.current.unsubscribe();\n supabase.removeChannel(channelRef.current);\n channelRef.current = null;\n }\n };\n }, [\n supabase,\n tableNameValue,\n schemaValue,\n enabled,\n filter,\n query,\n primaryKeys.join(\",\"),\n retryTick,\n debouncedKey,\n ]);\n\n useEffect(() => {\n if (!enabled || realtimeState === \"SUBSCRIBED\") {\n retryCountRef.current = 0;\n return;\n }\n\n // Exponential backoff: start at 5 seconds, max 60 seconds\n const baseDelay = 5000;\n const maxDelay = 60000;\n const delay = Math.min(\n baseDelay * Math.pow(2, retryCountRef.current),\n maxDelay\n );\n\n const id = setTimeout(() => {\n setRetryTick((t) => t + 1);\n }, delay);\n\n return () => clearTimeout(id);\n }, [realtimeState, enabled]);\n\n return realtimeState;\n}\n","import { PostgrestSingleResponse } from \"@supabase/supabase-js\";\nimport { useMemo } from \"react\";\nimport { ItemType } from \"@pol-studios/utils\";\nimport {\n encode,\n useQuery,\n} from \"@supabase-cache-helpers/postgrest-react-query\";\nimport { UseQueryOptions } from \"@tanstack/react-query\";\nimport useRealtime from \"./useRealtime\";\nimport { isNullOrWhitespace } from \"@pol-studios/utils\";\nimport { UseDbQuerySingleReturn } from \"../useDbQuery\";\nimport { PostgrestParser } from \"../parser/PostgrestParser\";\n\ntype ConfigurationOptions<T> = {\n crossOrganization?: boolean;\n};\n\ntype FilterOperator =\n | \"or\"\n | \"eq\"\n | \"neq\"\n | \"gt\"\n | \"gte\"\n | \"lt\"\n | \"lte\"\n | \"like\"\n | \"ilike\"\n | \"is\"\n | \"in\"\n | \"cs\"\n | \"cd\"\n | \"fts\"\n | \"plfts\";\ntype ValueType = number | string | boolean | null | Date | object;\n\ntype FilterDefinition = {\n path: string;\n alias?: string;\n operator: FilterOperator;\n negate: boolean;\n value: ValueType;\n};\n\ntype FilterDefinitions = (FilterComposite | FilterDefinition)[];\n\ntype FilterComposite = {\n or?: FilterDefinitions;\n and?: FilterDefinitions;\n};\n\nexport type UseRealtimeQueryResult<T> = UseDbQuerySingleReturn<T> & {\n realtimeStatus:\n | \"SUBSCRIBED\"\n | \"TIMED_OUT\"\n | \"CLOSED\"\n | \"CHANNEL_ERROR\"\n | \"Loading...\";\n isRealtimeConnected: boolean;\n isRealtimeLoading: boolean;\n};\ntype DataType = Record<string, any>;\n\nexport function convertFilterToRealtimeQuery(\n filters: FilterDefinitions\n): string {\n function convert(filter: FilterComposite | FilterDefinition): string {\n //TODO: I just added this line to make it work\n if (!filter) return \"\";\n if (\"path\" in filter) {\n if (filter.path.includes(\".\")) return \"\";\n\n let valueString = filter.value?.toString() ?? \"null\";\n if (filter.operator === \"in\") {\n valueString =\n '(\"' +\n valueString\n .slice(2, valueString.length - 2)\n .split(\",\")\n .join('\",\"') +\n '\")';\n }\n\n return `${filter.path}=${\n filter.negate ? \"not.\" : \"\"\n }${filter.operator}.${valueString}`;\n } else {\n if (filter.or) {\n return `(${filter.or.map((f) => convert(f)).join(\"|\")})`;\n } else if (filter.and) {\n return `(${filter.and.map((f) => convert(f)).join(\"&\")})`;\n }\n }\n return \"\";\n }\n\n //todo: review later when multiple filters are available\n return convert(filters[0]);\n}\n\nexport function useRealtimeQuery<Result extends DataType>(\n query: PromiseLike<PostgrestSingleResponse<Result>>,\n config?: Omit<\n UseQueryOptions<PostgrestSingleResponse<Result>>,\n \"queryKey\" | \"queryFn\"\n > &\n ConfigurationOptions<Result>,\n primaryKeys: (keyof ItemType<Result> & string)[] = [\"id\" as any]\n): UseRealtimeQueryResult<Result> {\n const parser = useMemo(\n () => new PostgrestParser<Result>(query as any),\n [query]\n );\n\n // Use consumer's config - don't force refetchOnMount: \"always\" which defeats prefetching\n // Realtime subscription will keep data fresh anyway\n const request = useQuery(\n query,\n useMemo(() => config as any, [config])\n );\n const queryKey = encode(query, false);\n\n // Removed: Effect that forced refetch on query key change\n // This was causing double fetches and defeating prefetch optimization\n // Realtime subscription handles keeping data in sync\n\n const filterString = convertFilterToRealtimeQuery(parser.filters);\n let filter: string | undefined =\n request.data && typeof request.data === \"object\" && \"id\" in request.data\n ? \"id=eq.\" + request.data.id\n : filterString;\n\n if (filter.includes('in.(\\\\\"\\\\\")')) {\n filter = undefined;\n }\n if (isNullOrWhitespace(filter)) {\n filter = undefined;\n }\n\n const selectStatement = parser.select;\n\n const realtimeStatus = useRealtime(\n queryKey.join(\"-\"),\n selectStatement,\n { schema: parser.schema, table: parser.table },\n primaryKeys,\n {\n filter: filter,\n enabled: typeof config?.enabled === \"boolean\" ? config.enabled : true,\n }\n );\n const outputRealtimeStatus: typeof realtimeStatus | \"Loading...\" =\n request.isFetching ? \"Loading...\" : realtimeStatus;\n\n return {\n ...request,\n data: request.data as Result | null | undefined,\n realtimeStatus: outputRealtimeStatus,\n isRealtimeConnected: realtimeStatus == \"SUBSCRIBED\",\n isRealtimeLoading: request.isFetching,\n } as UseRealtimeQueryResult<Result>;\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../src/realtime/useRealtime.ts","../../src/realtime/useRealtimeQuery.ts"],"sourcesContent":["import { c as _c } from \"react/compiler-runtime\";\nimport { useDeleteItem, useQueriesForTableLoader, useUpsertItem } from \"@supabase-cache-helpers/postgrest-react-query\";\nimport { useEffect, useState, useRef } from \"react\";\nimport useSupabase, { UserSessionId } from \"../useSupabase\";\nimport { newUuid } from \"@pol-studios/utils\";\nimport { buildNormalizedQuery, normalizeResponse } from \"@supabase-cache-helpers/postgrest-core\";\nimport { REALTIME_POSTGRES_CHANGES_LISTEN_EVENT, type RealtimePostgresChangesPayload } from \"@supabase/supabase-js\";\nimport { useDelayedValue } from \"@pol-studios/hooks/state\";\nexport default function useRealtime(key, query, table, primaryKeys, options) {\n const $ = _c(37);\n const supabase = useSupabase();\n const tableNameValue = typeof table === \"string\" ? table : table.table;\n const schemaValue = typeof table === \"string\" ? \"public\" : table.schema;\n const queriesForTable = useQueriesForTableLoader(tableNameValue);\n let t0;\n if ($[0] !== primaryKeys || $[1] !== schemaValue || $[2] !== tableNameValue) {\n t0 = {\n primaryKeys,\n table: tableNameValue,\n schema: schemaValue\n };\n $[0] = primaryKeys;\n $[1] = schemaValue;\n $[2] = tableNameValue;\n $[3] = t0;\n } else {\n t0 = $[3];\n }\n const deleteItem = useDeleteItem(t0);\n let t1;\n if ($[4] !== primaryKeys || $[5] !== schemaValue || $[6] !== tableNameValue) {\n t1 = {\n primaryKeys,\n table: tableNameValue,\n schema: schemaValue\n };\n $[4] = primaryKeys;\n $[5] = schemaValue;\n $[6] = tableNameValue;\n $[7] = t1;\n } else {\n t1 = $[7];\n }\n const upsertItem = useUpsertItem(t1);\n const [realtimeState, setRealtimeState] = useState(\"CLOSED\");\n const [retryTick, setRetryTick] = useState(0);\n const channelRef = useRef(null);\n const lastRetryTimeRef = useRef(0);\n const retryCountRef = useRef(0);\n const enabled = options?.enabled ?? true;\n const filter = options?.filter;\n const onChange = options?.onChange;\n const debouncedKey = useDelayedValue(key, 50);\n let t2;\n if ($[8] !== deleteItem || $[9] !== enabled || $[10] !== filter || $[11] !== onChange || $[12] !== primaryKeys || $[13] !== queriesForTable || $[14] !== query || $[15] !== retryTick || $[16] !== schemaValue || $[17] !== supabase || $[18] !== tableNameValue || $[19] !== upsertItem) {\n t2 = () => {\n if (!enabled) {\n if (channelRef.current) {\n channelRef.current.unsubscribe();\n supabase.removeChannel(channelRef.current);\n channelRef.current = null;\n }\n setRealtimeState(\"CLOSED\");\n return;\n }\n const now = Date.now();\n const timeSinceLastRetry = now - lastRetryTimeRef.current;\n if (timeSinceLastRetry < 2000 && retryTick > 0) {\n return;\n }\n if (channelRef.current) {\n channelRef.current.unsubscribe();\n supabase.removeChannel(channelRef.current);\n channelRef.current = null;\n }\n lastRetryTimeRef.current = now;\n retryCountRef.current = retryCountRef.current + 1;\n const channel = supabase.channel(newUuid()).on(\"postgres_changes\", {\n event: \"*\",\n schema: schemaValue,\n table: tableNameValue,\n filter\n }, async payload => {\n let data = payload.new ?? payload.old;\n if (payload.new && Object.keys(payload.new).length > 0) {\n const selectQuery = buildNormalizedQuery({\n queriesForTable,\n query\n });\n if (payload.eventType !== REALTIME_POSTGRES_CHANGES_LISTEN_EVENT.DELETE && selectQuery) {\n if (selectQuery.groupedUserQueryPaths.every(x => x.path in data) === false) {\n const qb = supabase.schema(payload.schema as any).from(payload.table as any).select(selectQuery.selectQuery);\n for (const pk of primaryKeys) {\n qb.eq(pk.toString(), data[pk]);\n }\n const res = await qb.single();\n if (res.data) {\n data = normalizeResponse(selectQuery.groupedPaths, res.data);\n }\n }\n }\n if (\"changedBySessionId\" in data) {\n const sessionId = data.changedBySessionId;\n if (sessionId !== UserSessionId) {\n await upsertItem(data);\n }\n } else {\n await upsertItem(data);\n }\n }\n if (payload.eventType === REALTIME_POSTGRES_CHANGES_LISTEN_EVENT.DELETE) {\n await deleteItem(payload.old);\n }\n if (payload.errors?.length > 0) {\n setRealtimeState(\"CHANNEL_ERROR\");\n }\n if (onChange) {\n onChange(payload);\n }\n }).on(\"postgres_changes\", {\n event: \"DELETE\",\n schema: schemaValue,\n table: tableNameValue\n }, async payload_0 => {\n if (payload_0.eventType === REALTIME_POSTGRES_CHANGES_LISTEN_EVENT.DELETE) {\n await deleteItem(payload_0.old);\n }\n }).subscribe(status => {\n setRealtimeState(status);\n if (status === \"SUBSCRIBED\") {\n retryCountRef.current = 0;\n }\n });\n channelRef.current = channel;\n return () => {\n if (channelRef.current) {\n channelRef.current.unsubscribe();\n supabase.removeChannel(channelRef.current);\n channelRef.current = null;\n }\n };\n };\n $[8] = deleteItem;\n $[9] = enabled;\n $[10] = filter;\n $[11] = onChange;\n $[12] = primaryKeys;\n $[13] = queriesForTable;\n $[14] = query;\n $[15] = retryTick;\n $[16] = schemaValue;\n $[17] = supabase;\n $[18] = tableNameValue;\n $[19] = upsertItem;\n $[20] = t2;\n } else {\n t2 = $[20];\n }\n let t3;\n if ($[21] !== primaryKeys) {\n t3 = primaryKeys.join(\",\");\n $[21] = primaryKeys;\n $[22] = t3;\n } else {\n t3 = $[22];\n }\n let t4;\n if ($[23] !== debouncedKey || $[24] !== enabled || $[25] !== filter || $[26] !== query || $[27] !== retryTick || $[28] !== schemaValue || $[29] !== supabase || $[30] !== t3 || $[31] !== tableNameValue) {\n t4 = [supabase, tableNameValue, schemaValue, enabled, filter, query, t3, retryTick, debouncedKey];\n $[23] = debouncedKey;\n $[24] = enabled;\n $[25] = filter;\n $[26] = query;\n $[27] = retryTick;\n $[28] = schemaValue;\n $[29] = supabase;\n $[30] = t3;\n $[31] = tableNameValue;\n $[32] = t4;\n } else {\n t4 = $[32];\n }\n useEffect(t2, t4);\n let t5;\n let t6;\n if ($[33] !== enabled || $[34] !== realtimeState) {\n t5 = () => {\n if (!enabled || realtimeState === \"SUBSCRIBED\") {\n retryCountRef.current = 0;\n return;\n }\n const delay = Math.min(5000 * Math.pow(2, retryCountRef.current), 60000);\n const id = setTimeout(() => {\n setRetryTick(_temp);\n }, delay);\n return () => clearTimeout(id);\n };\n t6 = [realtimeState, enabled];\n $[33] = enabled;\n $[34] = realtimeState;\n $[35] = t5;\n $[36] = t6;\n } else {\n t5 = $[35];\n t6 = $[36];\n }\n useEffect(t5, t6);\n return realtimeState;\n}\nfunction _temp(t) {\n return t + 1;\n}","import { c as _c } from \"react/compiler-runtime\";\nimport { PostgrestSingleResponse } from \"@supabase/supabase-js\";\nimport { useMemo } from \"react\";\nimport { ItemType } from \"@pol-studios/utils\";\nimport { encode, useQuery } from \"@supabase-cache-helpers/postgrest-react-query\";\nimport { UseQueryOptions } from \"@tanstack/react-query\";\nimport useRealtime from \"./useRealtime\";\nimport { isNullOrWhitespace } from \"@pol-studios/utils\";\nimport { UseDbQuerySingleReturn } from \"../useDbQuery\";\nimport { PostgrestParser } from \"../parser/PostgrestParser\";\ntype ConfigurationOptions<T> = {\n crossOrganization?: boolean;\n};\ntype FilterOperator = \"or\" | \"eq\" | \"neq\" | \"gt\" | \"gte\" | \"lt\" | \"lte\" | \"like\" | \"ilike\" | \"is\" | \"in\" | \"cs\" | \"cd\" | \"fts\" | \"plfts\";\ntype ValueType = number | string | boolean | null | Date | object;\ntype FilterDefinition = {\n path: string;\n alias?: string;\n operator: FilterOperator;\n negate: boolean;\n value: ValueType;\n};\ntype FilterDefinitions = (FilterComposite | FilterDefinition)[];\ntype FilterComposite = {\n or?: FilterDefinitions;\n and?: FilterDefinitions;\n};\nexport type UseRealtimeQueryResult<T> = UseDbQuerySingleReturn<T> & {\n realtimeStatus: \"SUBSCRIBED\" | \"TIMED_OUT\" | \"CLOSED\" | \"CHANNEL_ERROR\" | \"Loading...\";\n isRealtimeConnected: boolean;\n isRealtimeLoading: boolean;\n};\ntype DataType = Record<string, any>;\nexport function convertFilterToRealtimeQuery(filters: FilterDefinitions): string {\n function convert(filter: FilterComposite | FilterDefinition): string {\n //TODO: I just added this line to make it work\n if (!filter) return \"\";\n if (\"path\" in filter) {\n if (filter.path.includes(\".\")) return \"\";\n let valueString = filter.value?.toString() ?? \"null\";\n if (filter.operator === \"in\") {\n valueString = '(\"' + valueString.slice(2, valueString.length - 2).split(\",\").join('\",\"') + '\")';\n }\n return `${filter.path}=${filter.negate ? \"not.\" : \"\"}${filter.operator}.${valueString}`;\n } else {\n if (filter.or) {\n return `(${filter.or.map(f => convert(f)).join(\"|\")})`;\n } else if (filter.and) {\n return `(${filter.and.map(f => convert(f)).join(\"&\")})`;\n }\n }\n return \"\";\n }\n\n //todo: review later when multiple filters are available\n return convert(filters[0]);\n}\nexport function useRealtimeQuery(query, config, t0) {\n const $ = _c(27);\n let t1;\n if ($[0] !== t0) {\n t1 = t0 === undefined ? [\"id\" as any] : t0;\n $[0] = t0;\n $[1] = t1;\n } else {\n t1 = $[1];\n }\n const primaryKeys = t1;\n const t2 = query as any;\n let t3;\n if ($[2] !== t2) {\n t3 = new PostgrestParser(t2);\n $[2] = t2;\n $[3] = t3;\n } else {\n t3 = $[3];\n }\n const parser = t3;\n const request = useQuery(query, config as any);\n let filter;\n let selectStatement;\n let t4;\n let t5;\n if ($[4] !== parser.filters || $[5] !== parser.select || $[6] !== query || $[7] !== request.data) {\n const queryKey = encode(query, false);\n let t6;\n if ($[12] !== parser.filters || $[13] !== request.data) {\n const filterString = convertFilterToRealtimeQuery(parser.filters);\n filter = request.data && typeof request.data === \"object\" && \"id\" in request.data ? \"id=eq.\" + request.data.id : filterString;\n if (filter.includes(\"in.(\\\\\\\"\\\\\\\")\")) {\n filter = undefined;\n }\n t6 = isNullOrWhitespace(filter);\n $[12] = parser.filters;\n $[13] = request.data;\n $[14] = filter;\n $[15] = t6;\n } else {\n filter = $[14];\n t6 = $[15];\n }\n if (t6) {\n filter = undefined;\n }\n selectStatement = parser.select;\n t4 = useRealtime;\n t5 = queryKey.join(\"-\");\n $[4] = parser.filters;\n $[5] = parser.select;\n $[6] = query;\n $[7] = request.data;\n $[8] = filter;\n $[9] = selectStatement;\n $[10] = t4;\n $[11] = t5;\n } else {\n filter = $[8];\n selectStatement = $[9];\n t4 = $[10];\n t5 = $[11];\n }\n let t6;\n if ($[16] !== parser.schema || $[17] !== parser.table) {\n t6 = {\n schema: parser.schema,\n table: parser.table\n };\n $[16] = parser.schema;\n $[17] = parser.table;\n $[18] = t6;\n } else {\n t6 = $[18];\n }\n const t7 = typeof config?.enabled === \"boolean\" ? config.enabled : true;\n let t8;\n if ($[19] !== filter || $[20] !== t7) {\n t8 = {\n filter,\n enabled: t7\n };\n $[19] = filter;\n $[20] = t7;\n $[21] = t8;\n } else {\n t8 = $[21];\n }\n const realtimeStatus = t4(t5, selectStatement, t6, primaryKeys, t8);\n const outputRealtimeStatus = request.isFetching ? \"Loading...\" : realtimeStatus;\n const t9 = request.data as Result | null | undefined;\n const t10 = realtimeStatus == \"SUBSCRIBED\";\n let t11;\n if ($[22] !== outputRealtimeStatus || $[23] !== request || $[24] !== t10 || $[25] !== t9) {\n t11 = {\n ...request,\n data: t9,\n realtimeStatus: outputRealtimeStatus,\n isRealtimeConnected: t10,\n isRealtimeLoading: request.isFetching\n };\n $[22] = outputRealtimeStatus;\n $[23] = request;\n $[24] = t10;\n $[25] = t9;\n $[26] = t11;\n } else {\n t11 = $[26];\n }\n return t11 as UseRealtimeQueryResult<Result>;\n}"],"mappings":"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","names":["_c","_c","t6"]}
@@ -2,7 +2,6 @@ import * as react_jsx_runtime from 'react/jsx-runtime';
2
2
  import * as react from 'react';
3
3
  import { ReactNode } from 'react';
4
4
  import { User, SignUpWithPasswordCredentials, AuthTokenResponsePassword } from '@supabase/supabase-js';
5
- import { D as Database } from './useSupabase-pPhUZHcl.js';
6
5
 
7
6
  type ProfileStatus = "active" | "archived" | "suspended";
8
7
  interface SetupAuthContext {
@@ -59,31 +58,4 @@ interface SetupAuthContextProviderProps {
59
58
  */
60
59
  declare function SetupAuthContextProvider({ children, auth, }: SetupAuthContextProviderProps): react_jsx_runtime.JSX.Element;
61
60
 
62
- type UserMetadataRow = Database["core"]["Tables"]["UserMetadata"]["Row"];
63
- type UserMetadataInsert = Database["core"]["Tables"]["UserMetadata"]["Insert"];
64
- type UserMetadataUpdate = Database["core"]["Tables"]["UserMetadata"]["Update"];
65
- interface UserMetadataContextType {
66
- metadata: Record<string, string>;
67
- isLoading: boolean;
68
- error: Error | null;
69
- setMetadata: (key: string, value: string) => Promise<void>;
70
- getMetadata: (key: string) => string | undefined;
71
- removeMetadata: (key: string) => Promise<void>;
72
- refreshMetadata: () => Promise<void>;
73
- }
74
- declare const userMetadataContext: react.Context<UserMetadataContextType>;
75
- declare function UserMetadataProvider({ children }: {
76
- children: ReactNode;
77
- }): react_jsx_runtime.JSX.Element;
78
- declare function useUserMetadata(): UserMetadataContextType;
79
- declare function useUserMetadataValue(key: string): string | undefined;
80
- declare function useSetUserMetadata(): {
81
- setMetadata: (key: string, value: string) => Promise<void>;
82
- removeMetadata: (key: string) => Promise<void>;
83
- };
84
- declare function useUserMetadataState<T>(key: string, defaultValue: T, options?: {
85
- serialize?: (value: T) => string;
86
- deserialize?: (value: string) => T;
87
- }): [T, (value: T) => Promise<void>, boolean];
88
-
89
- export { type ProfileStatus as P, SetupAuthContextProvider as S, type UserMetadataContextType as U, type SetupAuthContext as a, type SetupAuthContextProviderProps as b, type Profile as c, useUserMetadata as d, useUserMetadataState as e, useUserMetadataValue as f, userMetadataContext as g, type UserMetadataInsert as h, UserMetadataProvider as i, type UserMetadataRow as j, type UserMetadataUpdate as k, setupAuthContext as s, useSetUserMetadata as u };
61
+ export { type ProfileStatus as P, SetupAuthContextProvider as S, type SetupAuthContext as a, type SetupAuthContextProviderProps as b, type Profile as c, setupAuthContext as s };
@@ -1,6 +1,10 @@
1
1
  export { a as FilterConfig, F as FilterConfigOption, G as Group, P as PropertyType, S as SortConfig, T as TableInfo, V as ValueForPropertyType, b as WhereClause, W as WhereFilter } from '../FilterConfig-Bt2Ek74z.js';
2
- export { B as BooleanOperator, l as ClarificationQuestion, k as ClarificationSuggestion, j as ComputedSortConfig, D as Database, d as DbChangeLog, f as Filter, e as FilterConditionType, m as FilterContextType, g as FilterGroup, h as FilterInput, F as FilterOperator, i as FilterState, O as OrderColumn, P as Pagination, Q as QueryState, S as Sort, V as ValueOrArrayForPropertyType } from '../index-BFu5_dS8.js';
2
+ export { r as BackendSelectionResult, B as BooleanOperator, l as ClarificationQuestion, k as ClarificationSuggestion, C as CombinedProviderStatus, j as ComputedSortConfig, n as DataLayerWithPowerSyncProps, D as DbChangeLog, a as EnhancedSyncControl, E as EnhancedSyncStatus, e as Filter, d as FilterConditionType, m as FilterContextType, f as FilterGroup, g as FilterInput, F as FilterOperator, h as FilterState, H as HasPowerSyncConfig, O as OrderColumn, i as Pagination, P as PowerSyncEnabledConfig, b as PowerSyncEnabledContextValue, q as PowerSyncTables, Q as QueryState, S as Sort, U as UseDataLayerWithPowerSync, p as UseSyncControlWithPowerSync, o as UseSyncStatusWithPowerSync, V as ValueOrArrayForPropertyType, c as createCombinedStatus } from '../index-CQLyNG6A.js';
3
+ export { D as Database } from '../database.types-ChFCG-4M.js';
3
4
  import 'moment';
4
5
  import '@supabase/supabase-js';
5
6
  import 'react';
6
7
  import '@tanstack/react-query';
8
+ import '../core/index.js';
9
+ import '../DataLayerContext-CL6alnkb.js';
10
+ import '../executor-CB4KHyYG.js';
@@ -1,10 +1,15 @@
1
- import "../chunk-7HG6G25H.js";
2
- import "../chunk-Y3INY2CS.js";
3
- import "../chunk-JUVE3DWY.js";
1
+ import {
2
+ createCombinedStatus
3
+ } from "../chunk-H3LNH2NT.js";
4
+ import "../chunk-GC3TBUWE.js";
5
+ import "../chunk-TKWR5AAY.js";
4
6
  import "../chunk-J4ZVCXZ4.js";
5
- import "../chunk-O3K7R32P.js";
7
+ import "../chunk-OQ7U6EQ3.js";
6
8
  import "../chunk-H6365JPC.js";
7
9
  import "../chunk-3PJTNH2L.js";
8
- import "../chunk-AWFMICFV.js";
10
+ import "../chunk-5EFDS7SR.js";
9
11
  import "../chunk-P4UZ7IXC.js";
12
+ export {
13
+ createCombinedStatus
14
+ };
10
15
  //# sourceMappingURL=index.js.map
@@ -1,5 +1,5 @@
1
1
  import * as _tanstack_react_query from '@tanstack/react-query';
2
- import { D as Database } from './useSupabase-pPhUZHcl.js';
2
+ import { D as Database } from './useSupabase-DvWVuHHE.js';
3
3
  import { G as GetResult } from './select-query-parser-BwyHum1L.js';
4
4
  import { j as GenericSchema } from './types-CYr9JiUE.js';
5
5