@pol-studios/db 1.0.54 → 1.0.56

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 (77) hide show
  1. package/dist/{DataLayerContext-C7cJtiO8.d.ts → DataLayerContext-BYZtDD0g.d.ts} +1 -1
  2. package/dist/auth/context.js +6 -4
  3. package/dist/auth/hooks.js +7 -5
  4. package/dist/auth/index.js +7 -5
  5. package/dist/{chunk-FIAXWEBK.js → chunk-4EO55YV2.js} +10 -7
  6. package/dist/chunk-4EO55YV2.js.map +1 -0
  7. package/dist/{chunk-DP3YEVSX.js → chunk-6SDH7M7J.js} +26 -10
  8. package/dist/chunk-6SDH7M7J.js.map +1 -0
  9. package/dist/{chunk-UJWETW36.js → chunk-AKIRHA4Q.js} +527 -418
  10. package/dist/chunk-AKIRHA4Q.js.map +1 -0
  11. package/dist/{chunk-2XS2PM62.js → chunk-DDL63KLQ.js} +388 -107
  12. package/dist/chunk-DDL63KLQ.js.map +1 -0
  13. package/dist/{chunk-YA6MUTA7.js → chunk-FI6JAD5G.js} +3 -3
  14. package/dist/{chunk-WQLIGVQR.js → chunk-GWYTROSD.js} +98 -1
  15. package/dist/chunk-GWYTROSD.js.map +1 -0
  16. package/dist/chunk-JOULSXOI.js +415 -0
  17. package/dist/chunk-JOULSXOI.js.map +1 -0
  18. package/dist/{chunk-OKYHI6JG.js → chunk-LF3V3ERS.js} +3 -3
  19. package/dist/{chunk-FMYXG4VN.js → chunk-MEBT5YHA.js} +2 -2
  20. package/dist/{chunk-BZSAPFFB.js → chunk-N4KK5G5T.js} +116 -18
  21. package/dist/chunk-N4KK5G5T.js.map +1 -0
  22. package/dist/chunk-QYAFI34Q.js +64 -0
  23. package/dist/chunk-QYAFI34Q.js.map +1 -0
  24. package/dist/{chunk-3Q74DK5K.js → chunk-VYFAMTHI.js} +2 -2
  25. package/dist/chunk-W7PERM66.js +215 -0
  26. package/dist/chunk-W7PERM66.js.map +1 -0
  27. package/dist/{chunk-ZGQ7Q4ZU.js → chunk-WM25QE7E.js} +2 -2
  28. package/dist/{chunk-HZIVE5AZ.js → chunk-YRIPM2AN.js} +253 -338
  29. package/dist/chunk-YRIPM2AN.js.map +1 -0
  30. package/dist/chunk-YUX6RGLZ.js +1858 -0
  31. package/dist/chunk-YUX6RGLZ.js.map +1 -0
  32. package/dist/{chunk-Z3EJX3VG.js → chunk-Z456IHCB.js} +3 -3
  33. package/dist/core/index.d.ts +24 -1
  34. package/dist/{executor-YJw4m7Q7.d.ts → executor-D15yjeMo.d.ts} +20 -0
  35. package/dist/hooks/index.d.ts +3 -3
  36. package/dist/hooks/index.js +4 -2
  37. package/dist/{index-jVYdTeWx.d.ts → index-CFUuTzXO.d.ts} +1 -1
  38. package/dist/index.d.ts +5 -5
  39. package/dist/index.js +16 -14
  40. package/dist/index.native.d.ts +62 -8
  41. package/dist/index.native.js +16 -14
  42. package/dist/index.web.d.ts +10 -9
  43. package/dist/index.web.js +30 -19
  44. package/dist/index.web.js.map +1 -1
  45. package/dist/mutation/index.js +3 -3
  46. package/dist/parser/index.js +3 -3
  47. package/dist/powersync-bridge/index.d.ts +1 -1
  48. package/dist/query/index.d.ts +4 -83
  49. package/dist/query/index.js +17 -7
  50. package/dist/realtime/index.d.ts +80 -1
  51. package/dist/realtime/index.js +14 -12
  52. package/dist/realtime/index.js.map +1 -1
  53. package/dist/select-parser-BAV7fOaM.d.ts +144 -0
  54. package/dist/types/index.d.ts +3 -3
  55. package/dist/types/index.js +4 -4
  56. package/dist/{useDbCount-DHLJzmkO.d.ts → useDbCount-Ckb-FhZk.d.ts} +1 -1
  57. package/dist/{useResolveFeedback-B0UcYWVI.d.ts → useResolveFeedback-CuUkdHoR.d.ts} +13 -29
  58. package/dist/with-auth/index.js +9 -7
  59. package/dist/with-auth/index.js.map +1 -1
  60. package/package.json +9 -4
  61. package/dist/chunk-2XS2PM62.js.map +0 -1
  62. package/dist/chunk-BZSAPFFB.js.map +0 -1
  63. package/dist/chunk-CTRY7JDP.js +0 -4112
  64. package/dist/chunk-CTRY7JDP.js.map +0 -1
  65. package/dist/chunk-DP3YEVSX.js.map +0 -1
  66. package/dist/chunk-FIAXWEBK.js.map +0 -1
  67. package/dist/chunk-HZIVE5AZ.js.map +0 -1
  68. package/dist/chunk-INEUG6MC.js +0 -521
  69. package/dist/chunk-INEUG6MC.js.map +0 -1
  70. package/dist/chunk-UJWETW36.js.map +0 -1
  71. package/dist/chunk-WQLIGVQR.js.map +0 -1
  72. /package/dist/{chunk-YA6MUTA7.js.map → chunk-FI6JAD5G.js.map} +0 -0
  73. /package/dist/{chunk-OKYHI6JG.js.map → chunk-LF3V3ERS.js.map} +0 -0
  74. /package/dist/{chunk-FMYXG4VN.js.map → chunk-MEBT5YHA.js.map} +0 -0
  75. /package/dist/{chunk-3Q74DK5K.js.map → chunk-VYFAMTHI.js.map} +0 -0
  76. /package/dist/{chunk-ZGQ7Q4ZU.js.map → chunk-WM25QE7E.js.map} +0 -0
  77. /package/dist/{chunk-Z3EJX3VG.js.map → chunk-Z456IHCB.js.map} +0 -0
@@ -2,7 +2,9 @@ import { RealtimePostgresChangesPayload, PostgrestSingleResponse } from '@supaba
2
2
  import { ItemType } from '@pol-studios/utils';
3
3
  import { UseQueryOptions } from '@tanstack/react-query';
4
4
  import { U as UseDbQuerySingleReturn } from '../useDbQuery-C-TL8jY1.js';
5
+ import { E as ExtractedExplicitFk } from '../select-parser-BAV7fOaM.js';
5
6
  import '@supabase-cache-helpers/postgrest-react-query';
7
+ import '../core/index.js';
6
8
 
7
9
  declare function useRealtime(key: string, query: string, table: string | {
8
10
  table: string;
@@ -41,4 +43,81 @@ type DataType = Record<string, any>;
41
43
  declare function convertFilterToRealtimeQuery(filters: FilterDefinitions): string;
42
44
  declare function useRealtimeQuery<Result extends DataType>(query: PromiseLike<PostgrestSingleResponse<Result>>, config?: Omit<UseQueryOptions<PostgrestSingleResponse<Result>>, "queryKey" | "queryFn"> & ConfigurationOptions<Result>, primaryKeys?: (keyof ItemType<Result> & string)[]): UseRealtimeQueryResult<Result>;
43
45
 
44
- export { type UseRealtimeQueryResult, convertFilterToRealtimeQuery, useRealtimeQuery as useDbRealtimeQuery, useRealtime, useRealtimeQuery };
46
+ /**
47
+ * Optimistic Merge Utilities for Explicit FK Relations
48
+ *
49
+ * When using realtime subscriptions with explicit FK joins (e.g., Sender!senderId:core.Profile(*)),
50
+ * changes to related tables need to be optimistically merged into cached query data.
51
+ *
52
+ * This module provides utilities for:
53
+ * 1. Extracting explicit FK relation info from select strings
54
+ * 2. Merging changes from related tables into parent query data
55
+ * 3. Managing multiple subscriptions for related tables
56
+ */
57
+
58
+ /**
59
+ * A changed record from a related table.
60
+ */
61
+ interface ChangedRecord {
62
+ /** The record ID */
63
+ id: string;
64
+ /** All record fields */
65
+ [key: string]: unknown;
66
+ }
67
+ /**
68
+ * Merge updated related records into parent query data.
69
+ *
70
+ * When a record in a related table changes, this function updates all references
71
+ * to that record within the parent data's nested relations.
72
+ *
73
+ * @param parentData - The current cached query data (array of parent records)
74
+ * @param relation - The explicit FK relation info (alias, sourceField, etc.)
75
+ * @param changedRecords - The updated records from the related table
76
+ * @returns New array with merged updates (immutable - does not modify input)
77
+ *
78
+ * @example
79
+ * // Parent data has: [{ id: "1", senderId: "user-1", Sender: { id: "user-1", name: "Alice" } }]
80
+ * // User "user-1" changed their name to "Bob"
81
+ * const updated = mergeRelatedUpdate(
82
+ * parentData,
83
+ * { alias: "Sender", sourceField: "senderId", targetTable: "User", targetColumn: "id" },
84
+ * [{ id: "user-1", name: "Bob" }]
85
+ * );
86
+ * // Result: [{ id: "1", senderId: "user-1", Sender: { id: "user-1", name: "Bob" } }]
87
+ */
88
+ declare function mergeRelatedUpdate<T extends Record<string, unknown>>(parentData: T[], relation: ExtractedExplicitFk, changedRecords: ChangedRecord[]): T[];
89
+ /**
90
+ * Merge a single changed record into parent query data.
91
+ *
92
+ * Convenience wrapper around mergeRelatedUpdate for single record changes.
93
+ *
94
+ * @param parentData - The current cached query data
95
+ * @param relation - The explicit FK relation info
96
+ * @param changedRecord - The updated record from the related table
97
+ * @returns New array with merged update
98
+ */
99
+ declare function mergeSingleRelatedUpdate<T extends Record<string, unknown>>(parentData: T[], relation: ExtractedExplicitFk, changedRecord: ChangedRecord): T[];
100
+ /**
101
+ * Check if any parent records reference a given related record ID.
102
+ *
103
+ * Useful for determining whether a change to a related record is relevant
104
+ * to the current query data.
105
+ *
106
+ * @param parentData - The current cached query data
107
+ * @param relation - The explicit FK relation info
108
+ * @param relatedId - The ID of the related record that changed
109
+ * @returns true if any parent references this related record
110
+ */
111
+ declare function parentReferencesRelated<T extends Record<string, unknown>>(parentData: T[], relation: ExtractedExplicitFk, relatedId: string): boolean;
112
+ /**
113
+ * Extract all related IDs from parent data for a given relation.
114
+ *
115
+ * Useful for filtering realtime subscriptions to only watch relevant records.
116
+ *
117
+ * @param parentData - The current cached query data
118
+ * @param relation - The explicit FK relation info
119
+ * @returns Set of related record IDs referenced by the parent data
120
+ */
121
+ declare function extractRelatedIds<T extends Record<string, unknown>>(parentData: T[], relation: ExtractedExplicitFk): Set<string>;
122
+
123
+ export { type ChangedRecord, type UseRealtimeQueryResult, convertFilterToRealtimeQuery, extractRelatedIds, mergeRelatedUpdate, mergeSingleRelatedUpdate, parentReferencesRelated, useRealtimeQuery as useDbRealtimeQuery, useRealtime, useRealtimeQuery };
@@ -1,6 +1,12 @@
1
+ import {
2
+ extractRelatedIds,
3
+ mergeRelatedUpdate,
4
+ mergeSingleRelatedUpdate,
5
+ parentReferencesRelated
6
+ } from "../chunk-QYAFI34Q.js";
1
7
  import {
2
8
  PostgrestParser
3
- } from "../chunk-UJWETW36.js";
9
+ } from "../chunk-JOULSXOI.js";
4
10
  import "../chunk-J4ZVCXZ4.js";
5
11
  import {
6
12
  buildNormalizedQuery,
@@ -10,8 +16,8 @@ import {
10
16
  useQueriesForTableLoader,
11
17
  useQuery,
12
18
  useUpsertItem
13
- } from "../chunk-CTRY7JDP.js";
14
- import "../chunk-INEUG6MC.js";
19
+ } from "../chunk-YUX6RGLZ.js";
20
+ import "../chunk-AKIRHA4Q.js";
15
21
  import {
16
22
  UserSessionId,
17
23
  useSupabase
@@ -106,7 +112,7 @@ function useRealtime(key, query, table, primaryKeys, options) {
106
112
  query
107
113
  });
108
114
  if (payload.eventType !== REALTIME_POSTGRES_CHANGES_LISTEN_EVENT.DELETE && selectQuery) {
109
- if (selectQuery.groupedUserQueryPaths.every((x) => x.path in data) === false) {
115
+ if (selectQuery.groupedUserQueryPaths?.every((x) => x.path in data) === false) {
110
116
  const qb = supabase.schema(payload.schema).from(payload.table).select(selectQuery.selectQuery);
111
117
  for (const pk of primaryKeys) {
112
118
  qb.eq(pk.toString(), data[pk]);
@@ -135,14 +141,6 @@ function useRealtime(key, query, table, primaryKeys, options) {
135
141
  if (onChange) {
136
142
  onChange(payload);
137
143
  }
138
- }).on("postgres_changes", {
139
- event: "DELETE",
140
- schema: schemaValue,
141
- table: tableNameValue
142
- }, async (payload_0) => {
143
- if (payload_0.eventType === REALTIME_POSTGRES_CHANGES_LISTEN_EVENT.DELETE) {
144
- await deleteItem(payload_0.old);
145
- }
146
144
  }).subscribe((status) => {
147
145
  setRealtimeState(status);
148
146
  if (status === "SUBSCRIBED") {
@@ -367,6 +365,10 @@ function useRealtimeQuery(query, config, t0) {
367
365
  }
368
366
  export {
369
367
  convertFilterToRealtimeQuery,
368
+ extractRelatedIds,
369
+ mergeRelatedUpdate,
370
+ mergeSingleRelatedUpdate,
371
+ parentReferencesRelated,
370
372
  useRealtimeQuery as useDbRealtimeQuery,
371
373
  useRealtime,
372
374
  useRealtimeQuery
@@ -1 +1 @@
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"]}
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 }).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"]}
@@ -0,0 +1,144 @@
1
+ import { ParsedSelect, SelectRelation } from './core/index.js';
2
+
3
+ /**
4
+ * Select String Parser
5
+ *
6
+ * Parses Supabase PostgREST select syntax into an AST for local SQLite processing.
7
+ *
8
+ * Supported Syntax:
9
+ * - "*" -> All columns
10
+ * - "id, name, status" -> Specific columns
11
+ * - "*, RelatedTable(*)" -> All columns + relation
12
+ * - "id, RelatedTable(id, name)" -> Specific + relation with specific columns
13
+ * - "*, Parent(*, Grandparent(name))" -> Nested relations
14
+ * - "*, items:RelatedTable(*)" -> Aliased relation
15
+ * - "aliasName:columnName" -> Aliased column
16
+ */
17
+
18
+ /**
19
+ * Tokenize a string at the top level, respecting parentheses nesting.
20
+ * Splits by comma but keeps nested parentheses intact.
21
+ *
22
+ * @example
23
+ * tokenizeTopLevel("id, name, Parent(*, Child(name))")
24
+ * // Returns: ["id", "name", "Parent(*, Child(name))"]
25
+ */
26
+ declare function tokenizeTopLevel(input: string): string[];
27
+ /**
28
+ * Parse a Supabase PostgREST select string into an AST.
29
+ *
30
+ * @param select - The select string (e.g., "*, RelatedTable(*)")
31
+ * @returns Parsed select AST
32
+ *
33
+ * @example
34
+ * parseSelect("*")
35
+ * // Returns: { columns: "*", relations: [] }
36
+ *
37
+ * parseSelect("id, name, status")
38
+ * // Returns: {
39
+ * // columns: [{ name: "id" }, { name: "name" }, { name: "status" }],
40
+ * // relations: []
41
+ * // }
42
+ *
43
+ * parseSelect("*, EquipmentFixture(*)")
44
+ * // Returns: {
45
+ * // columns: "*",
46
+ * // relations: [{ name: "EquipmentFixture", columns: "*", relations: [] }]
47
+ * // }
48
+ *
49
+ * parseSelect("id, name, ProjectDatabase(name, Organization(*))")
50
+ * // Returns: {
51
+ * // columns: [{ name: "id" }, { name: "name" }],
52
+ * // relations: [{
53
+ * // name: "ProjectDatabase",
54
+ * // columns: [{ name: "name" }],
55
+ * // relations: [{ name: "Organization", columns: "*", relations: [] }]
56
+ * // }]
57
+ * // }
58
+ */
59
+ declare function parseSelect(select: string): ParsedSelect;
60
+ /**
61
+ * Convert a parsed select back to a string representation (for debugging)
62
+ */
63
+ declare function stringifySelect(parsed: ParsedSelect): string;
64
+ /**
65
+ * Extract all column names from a parsed select (for building SQL queries)
66
+ * Does not include relation names.
67
+ */
68
+ declare function extractColumnNames(parsed: ParsedSelect): string[] | "*";
69
+ /**
70
+ * Extract all relation names from a parsed select
71
+ */
72
+ declare function extractRelationNames(parsed: ParsedSelect): string[];
73
+ /**
74
+ * Check if a select string references a specific relation
75
+ */
76
+ declare function hasRelation(parsed: ParsedSelect, relationName: string): boolean;
77
+ /**
78
+ * Get the select configuration for a specific relation
79
+ */
80
+ declare function getRelationSelect(parsed: ParsedSelect, relationName: string): SelectRelation | undefined;
81
+ /**
82
+ * Check if a parsed select contains any explicit FK relations.
83
+ * This is used to determine if QueryExecutor should be used instead of PostgREST.
84
+ *
85
+ * @param parsed - The parsed select statement
86
+ * @returns true if any relation uses explicit FK syntax
87
+ */
88
+ declare function hasExplicitFk(parsed: ParsedSelect): boolean;
89
+ /**
90
+ * Check if a select string contains explicit FK syntax.
91
+ * Quick check without full parsing for performance.
92
+ *
93
+ * @param select - The select string
94
+ * @returns true if the string contains explicit FK syntax (! followed by field:table)
95
+ */
96
+ declare function selectHasExplicitFkSyntax(select: string): boolean;
97
+ /**
98
+ * Information about an explicit FK relation extracted from a select string.
99
+ * Used for setting up realtime subscriptions on related tables.
100
+ */
101
+ interface ExtractedExplicitFk {
102
+ /** The alias used for this relation in the select string (e.g., "Sender") */
103
+ alias: string;
104
+ /** The FK column on the parent table (e.g., "senderId") */
105
+ sourceField: string;
106
+ /** The target table, optionally schema-qualified (e.g., "core.Profile") */
107
+ targetTable: string;
108
+ /** Column to match in target table, defaults to "id" */
109
+ targetColumn: string;
110
+ }
111
+ /**
112
+ * Extract all explicit FK relations from a parsed select statement.
113
+ * Recursively traverses the relation tree to find all explicit FK specs.
114
+ *
115
+ * @param parsed - The parsed select statement
116
+ * @returns Array of extracted explicit FK relations
117
+ *
118
+ * @example
119
+ * const parsed = parseSelect("*, Sender!senderId:core.Profile(*), Recipient!recipientId:core.Profile(*)");
120
+ * const explicitFks = extractExplicitFkRelations(parsed);
121
+ * // Returns:
122
+ * // [
123
+ * // { alias: "Sender", sourceField: "senderId", targetTable: "core.Profile", targetColumn: "id" },
124
+ * // { alias: "Recipient", sourceField: "recipientId", targetTable: "core.Profile", targetColumn: "id" }
125
+ * // ]
126
+ */
127
+ declare function extractExplicitFkRelations(parsed: ParsedSelect): ExtractedExplicitFk[];
128
+ /**
129
+ * Extract all unique target table names from explicit FK relations in a select string.
130
+ * This is useful for setting up realtime watchers on related tables.
131
+ *
132
+ * @param select - The select string (e.g., "*, Sender!senderId:core.Profile(*)")
133
+ * @returns Array of unique target table names
134
+ *
135
+ * @example
136
+ * extractExplicitFkTables("*, Sender!senderId:core.Profile(*), Recipient!recipientId:core.Profile(*)")
137
+ * // Returns: ["core.Profile"]
138
+ *
139
+ * extractExplicitFkTables("*, Author!authorId:User(*), Editor!editorId:Admin(*)")
140
+ * // Returns: ["User", "Admin"]
141
+ */
142
+ declare function extractExplicitFkTables(select: string): string[];
143
+
144
+ export { type ExtractedExplicitFk as E, extractRelationNames as a, hasExplicitFk as b, selectHasExplicitFkSyntax as c, extractExplicitFkRelations as d, extractColumnNames as e, extractExplicitFkTables as f, getRelationSelect as g, hasRelation as h, parseSelect as p, stringifySelect as s, tokenizeTopLevel as t };
@@ -1,10 +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 { r as BackendSelectionResult, B as BooleanOperator, l as ClarificationQuestion, k as ClarificationSuggestion, C as CombinedProviderStatus, j as ComputedSortConfig, n as DataLayerWithPowerSyncProps, D as DbChangeLog, E as EnhancedSyncControl, a 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-jVYdTeWx.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, E as EnhancedSyncControl, a 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-CFUuTzXO.js';
3
3
  export { D as Database } from '../database.types-ChFCG-4M.js';
4
4
  import 'moment';
5
5
  import '@supabase/supabase-js';
6
6
  import 'react';
7
7
  import '@tanstack/react-query';
8
8
  import '../core/index.js';
9
- import '../DataLayerContext-C7cJtiO8.js';
10
- import '../executor-YJw4m7Q7.js';
9
+ import '../DataLayerContext-BYZtDD0g.js';
10
+ import '../executor-D15yjeMo.js';
@@ -1,11 +1,11 @@
1
1
  import {
2
2
  createCombinedStatus
3
- } from "../chunk-Z3EJX3VG.js";
3
+ } from "../chunk-Z456IHCB.js";
4
4
  import "../chunk-GC3TBUWE.js";
5
- import "../chunk-UJWETW36.js";
5
+ import "../chunk-JOULSXOI.js";
6
6
  import "../chunk-J4ZVCXZ4.js";
7
- import "../chunk-CTRY7JDP.js";
8
- import "../chunk-INEUG6MC.js";
7
+ import "../chunk-YUX6RGLZ.js";
8
+ import "../chunk-AKIRHA4Q.js";
9
9
  import "../chunk-DMVUEJG2.js";
10
10
  import "../chunk-7D4SUZUM.js";
11
11
  export {
@@ -1,4 +1,4 @@
1
- import { r as DataLayerContextValue, s as DataLayerCoreContextValue, t as DataLayerStatusContextValue } from './DataLayerContext-C7cJtiO8.js';
1
+ import { r as DataLayerContextValue, s as DataLayerCoreContextValue, t as DataLayerStatusContextValue } from './DataLayerContext-BYZtDD0g.js';
2
2
  import { Dispatch, SetStateAction } from 'react';
3
3
  import { QueryOptions, WhereClause } from './core/index.js';
4
4
 
@@ -1,7 +1,7 @@
1
1
  import * as _tanstack_react_query from '@tanstack/react-query';
2
2
  import { UseMutationResult, UseMutationOptions, UseQueryOptions } from '@tanstack/react-query';
3
3
  import { SupabaseClient, PostgrestSingleResponse as PostgrestSingleResponse$1, PostgrestError } from '@supabase/supabase-js';
4
- import { T as TableDataAdapter, C as CapableDataAdapter, c as AdapterCapabilities, A as AdapterQueryResult } from './DataLayerContext-C7cJtiO8.js';
4
+ import { T as TableDataAdapter, C as CapableDataAdapter, c as AdapterCapabilities, A as AdapterQueryResult } from './DataLayerContext-BYZtDD0g.js';
5
5
  import { DatabaseSchema, QueryOptions } from './core/index.js';
6
6
  import { FunctionsResponse } from '@supabase/functions-js';
7
7
  import * as _supabase_postgrest_js from '@supabase/postgrest-js';
@@ -9,9 +9,9 @@ import { PostgrestSingleResponse } from '@supabase/postgrest-js';
9
9
  import { G as GetResult } from './select-query-parser-BwyHum1L.js';
10
10
  import { G as GenericTable } from './types-CYr9JiUE.js';
11
11
  import { D as Database } from './useSupabase-DSZNeXnF.js';
12
- import { D as DbChangeLog, Q as QueryState } from './index-jVYdTeWx.js';
12
+ import { D as DbChangeLog, Q as QueryState } from './index-CFUuTzXO.js';
13
13
  import { U as UseDbQuerySingleReturn } from './useDbQuery-C-TL8jY1.js';
14
- import { J as UseDbUpsertResult } from './useDbCount-DHLJzmkO.js';
14
+ import { J as UseDbUpsertResult } from './useDbCount-Ckb-FhZk.js';
15
15
  import { Moment } from 'moment';
16
16
  import * as react from 'react';
17
17
  import { ReactNode } from 'react';
@@ -44,6 +44,9 @@ declare function useMutationSuccessRN<TData, TError, TVariables>(mutation: UseMu
44
44
  *
45
45
  * Implements the TableDataAdapter interface for direct Supabase/PostgREST queries.
46
46
  * This adapter is used for online-only data access without local caching.
47
+ *
48
+ * Supports explicit FK syntax (e.g., `Sender!senderId:core.Profile(*)`) by routing
49
+ * those queries through SupabaseQueryExecutor for client-side join merging.
47
50
  */
48
51
 
49
52
  /**
@@ -73,15 +76,16 @@ declare class SupabaseAdapter implements TableDataAdapter, CapableDataAdapter {
73
76
  private schema;
74
77
  readonly name = "supabase";
75
78
  readonly capabilities: AdapterCapabilities;
79
+ /**
80
+ * Query executor for handling explicit FK syntax.
81
+ * Lazily initialized when needed.
82
+ */
83
+ private queryExecutor;
76
84
  constructor(supabase: SupabaseClient, schema: DatabaseSchema);
77
85
  /**
78
- * Parse a table identifier to extract schema and table name.
79
- * Handles schema-qualified names like "core.Profile" -> { schema: "core", tableName: "Profile" }
80
- *
81
- * @param table - The table name, optionally schema-qualified (e.g., "users" or "core.Profile")
82
- * @returns Object with schema (defaults to "public") and tableName
86
+ * Get or create the SupabaseQueryExecutor for explicit FK queries.
83
87
  */
84
- private parseTableIdentifier;
88
+ private getQueryExecutor;
85
89
  /**
86
90
  * Check if a where clause contains invalid UUID values (empty strings for id fields).
87
91
  * Returns true if any id field has an empty string value.
@@ -150,26 +154,6 @@ declare class SupabaseAdapter implements TableDataAdapter, CapableDataAdapter {
150
154
  * @returns Unsubscribe function
151
155
  */
152
156
  subscribe<T>(table: string, options: QueryOptions, callback: (data: T[]) => void): () => void;
153
- /**
154
- * Apply where clause filters to a Supabase query
155
- *
156
- * Converts WhereClause to Supabase filter methods:
157
- * - Direct value: .eq(field, value)
158
- * - { in: [...] }: .in(field, values)
159
- * - { gt: n }: .gt(field, n)
160
- * - { gte: n }: .gte(field, n)
161
- * - { lt: n }: .lt(field, n)
162
- * - { lte: n }: .lte(field, n)
163
- * - { like: s }: .ilike(field, s)
164
- * - { is: null }: .is(field, null)
165
- * - { neq: v }: .neq(field, v) or .not(field, "is", null)
166
- * - { notIn: [...] }: .not().in(field, values)
167
- *
168
- * @param query - The Supabase query builder
169
- * @param where - The where clause to apply
170
- * @returns The query with filters applied
171
- */
172
- private applyWhereClause;
173
157
  }
174
158
  /**
175
159
  * Create a new SupabaseAdapter instance
@@ -5,27 +5,29 @@ import {
5
5
  useUserMetadataState,
6
6
  useUserMetadataValue,
7
7
  userMetadataContext
8
- } from "../chunk-FIAXWEBK.js";
8
+ } from "../chunk-4EO55YV2.js";
9
9
  import {
10
10
  useDbUpsert
11
- } from "../chunk-3Q74DK5K.js";
11
+ } from "../chunk-VYFAMTHI.js";
12
12
  import "../chunk-SM73S2DY.js";
13
13
  import "../chunk-NSIAAYW3.js";
14
14
  import {
15
15
  useAuth,
16
16
  useSetupAuth
17
- } from "../chunk-FMYXG4VN.js";
17
+ } from "../chunk-MEBT5YHA.js";
18
18
  import {
19
19
  useDbQuery
20
- } from "../chunk-DP3YEVSX.js";
21
- import "../chunk-WQLIGVQR.js";
20
+ } from "../chunk-6SDH7M7J.js";
21
+ import "../chunk-GWYTROSD.js";
22
22
  import "../chunk-RT4O5H2E.js";
23
23
  import {
24
24
  getSupabaseUrl
25
25
  } from "../chunk-GC3TBUWE.js";
26
+ import "../chunk-W7PERM66.js";
27
+ import "../chunk-QYAFI34Q.js";
26
28
  import "../chunk-J4ZVCXZ4.js";
27
- import "../chunk-CTRY7JDP.js";
28
- import "../chunk-INEUG6MC.js";
29
+ import "../chunk-YUX6RGLZ.js";
30
+ import "../chunk-AKIRHA4Q.js";
29
31
  import {
30
32
  useSupabase
31
33
  } from "../chunk-DMVUEJG2.js";