@pol-studios/db 1.0.59 → 1.0.61

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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/hooks/useAdvanceQuery.ts","../src/hooks/useDbInsert.ts","../src/hooks/useDbUpdate.ts","../src/hooks/useDbUpsert.ts","../src/hooks/useDbDelete.ts","../src/hooks/useDbInfiniteQuery.ts","../src/hooks/useDbCount.ts","../src/hooks/useSyncStatus.ts","../src/hooks/useSyncControl.ts","../src/hooks/useOnlineStatus.ts"],"sourcesContent":["/**\n * V3 useAdvanceQuery Hook\n *\n * Hybrid query hook that combines PowerSync (local SQLite) with edge function filtering.\n * - When NO filters active: Uses PowerSync for fast local queries that stay in sync\n * - When filters active: Uses edge function for complex filtering\n *\n * This provides the best of both worlds:\n * - Fast, reactive local queries via PowerSync\n * - Complex filtering, natural language queries, and aggregations via edge function\n *\n * @example\n * const [result, filters, setFilters] = useAdvanceQuery<Equipment[]>(\n * \"EquipmentFixtureUnit\",\n * {\n * select: \"*, EquipmentFixtureUnitControl(*)\",\n * where: { projectDatabaseId: 123 },\n * orderBy: [{ field: \"unitNumber\", direction: \"asc\" }],\n * filterKey: \"equipment-filters\",\n * }\n * );\n */\n\nimport { Dispatch, SetStateAction, useCallback, useMemo, useRef, useState, useEffect } from \"react\";\nimport { useQuery } from \"@tanstack/react-query\";\nimport { useDataLayerCore } from \"./useDataLayer\";\nimport { useDbQuery } from \"./useDbQuery\";\nimport type { TableIdentifier, ResolveRowType, UseDbQueryOptions } from \"./useDbQuery\";\nimport type { QueryOptions } from \"../core/types\";\nimport { useSessionStorageState } from \"@pol-studios/hooks/storage\";\nimport { isUsable, omit } from \"@pol-studios/utils\";\nimport { getSupabaseUrl } from \"../config\";\nimport useSupabase from \"../useSupabase\";\nimport { devLog, devWarn } from \"../utils/dev-log\";\n\n// =============================================================================\n// Types (re-exported from useDbAdvanceQuery for compatibility)\n// =============================================================================\n\nexport type FilterOperator = \"=\" | \">\" | \">=\" | \"<\" | \"<=\" | \"contains\" | \"ilike\" | \"is\" | \"in\" | \"ai_search\";\nexport interface Filter {\n id: string;\n field: string;\n op: FilterOperator;\n value: string | number | string[] | number[] | boolean | null;\n not?: boolean;\n similarity?: number;\n where?: string;\n display?: string;\n}\nexport interface FilterGroup {\n id: string;\n op: \"AND\" | \"OR\";\n filters: Array<Filter | FilterGroup>;\n not?: boolean;\n}\nexport interface Pagination {\n offset?: number;\n limit?: number;\n}\nexport interface Sort {\n field: string;\n direction: \"asc\" | \"desc\";\n}\nexport interface QueryState extends FilterGroup {\n pagination?: Pagination;\n sort?: Sort[];\n distinctOn?: string[];\n naturalLanguageQuery?: string;\n isReady: boolean;\n}\nexport interface ClarificationQuestion {\n question: string;\n suggestions: Array<{\n interpretation: string;\n field_path: string;\n example: string;\n confidence: number;\n }>;\n}\n\n// =============================================================================\n// Options and Result Types\n// =============================================================================\n\nexport interface UseAdvanceQueryOptions extends Omit<UseDbQueryOptions, \"realtime\"> {\n /** Key for persisting filter state (required for filter state persistence) */\n filterKey: string;\n /** Initial filter state */\n initialFilters?: QueryState;\n /** Timeout for edge function requests in ms (default: 15000) */\n timeout?: number;\n /** Count mode: \"exact\" | \"estimated\" | \"\" (default: \"exact\") */\n count?: \"exact\" | \"estimated\" | \"\";\n /**\n * Whether to enable real-time subscriptions\n * - PowerSync path: Uses watch() for reactive updates (default: true when PowerSync)\n * - Edge function path: Uses Supabase realtime to invalidate query on changes\n */\n realtime?: boolean;\n}\nexport interface UseAdvanceQueryResult<T> {\n data: T[] | undefined;\n isLoading: boolean;\n isPending: boolean;\n isFetching: boolean;\n isRefetching: boolean;\n isSuccess: boolean;\n isError: boolean;\n error: Error | null;\n refetch: () => Promise<void>;\n count?: number;\n clarification?: ClarificationQuestion;\n}\n\n// =============================================================================\n// Default Filter State\n// =============================================================================\n\nconst createDefaultFilterState = (): QueryState => ({\n id: \"root\",\n op: \"AND\",\n filters: [],\n pagination: undefined,\n sort: [],\n isReady: true\n});\n\n// =============================================================================\n// Hook Implementation\n// =============================================================================\n\n/**\n * Hybrid advance query hook\n *\n * Uses PowerSync (local SQLite) when no filters are active for fast, reactive queries.\n * Falls back to edge function when filters are active for complex filtering.\n */\nexport function useAdvanceQuery<T extends TableIdentifier>(table: T, options: UseAdvanceQueryOptions): [UseAdvanceQueryResult<ResolveRowType<T>>, QueryState, Dispatch<SetStateAction<QueryState>>];\nexport function useAdvanceQuery<T>(table: string, options: UseAdvanceQueryOptions): [UseAdvanceQueryResult<T>, QueryState, Dispatch<SetStateAction<QueryState>>];\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function useAdvanceQuery<T = any>(table: TableIdentifier | string, options: UseAdvanceQueryOptions): [UseAdvanceQueryResult<T>, QueryState, Dispatch<SetStateAction<QueryState>>] {\n const tableName = typeof table === \"string\" ? table : `${(table as {\n schema: string;\n table: string;\n }).schema}.${(table as {\n schema: string;\n table: string;\n }).table}`;\n const {\n registry,\n queryClient,\n powerSync\n } = useDataLayerCore();\n const supabase = useSupabase();\n const {\n filterKey,\n initialFilters,\n enabled = true,\n timeout = 15000,\n count = \"exact\",\n realtime,\n select,\n where,\n orderBy,\n limit,\n offset,\n ...restOptions\n } = options;\n\n // Determine if realtime should be enabled\n // Default: true for PowerSync path, false for edge function path\n const isPowerSync = powerSync !== null;\n const realtimeEnabled = realtime ?? isPowerSync;\n\n // ==========================================================================\n // Filter State Management\n // ==========================================================================\n\n const defaultFilterState = useMemo(() => initialFilters ?? createDefaultFilterState(),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [] // Only compute once\n );\n const [filtersRaw, setFiltersRaw] = useSessionStorageState<QueryState>(filterKey, defaultFilterState);\n const filters = filtersRaw ?? defaultFilterState;\n\n // Type-safe setFilters wrapper\n const setFilters: Dispatch<SetStateAction<QueryState>> = useCallback(action => {\n if (typeof action === \"function\") {\n setFiltersRaw(prev => action(prev ?? defaultFilterState));\n } else {\n setFiltersRaw(action);\n }\n }, [setFiltersRaw, defaultFilterState]);\n\n // ==========================================================================\n // Determine Query Strategy\n // ==========================================================================\n\n const hasAdvancedFilters = useMemo(() => (filters?.filters?.length ?? 0) > 0 || !!filters?.naturalLanguageQuery, [filters?.filters?.length, filters?.naturalLanguageQuery]);\n\n // Use direct DB query (via useDbQuery) when: no advanced filters\n // useDbQuery handles adapter selection (PowerSync vs Supabase) based on sync status\n // This ensures queries use Supabase during initial sync when PowerSync hasn't synced yet\n const usePowerSyncPath = !hasAdvancedFilters;\n\n // ==========================================================================\n // PowerSync Query (no filters path)\n // ==========================================================================\n\n // Convert orderBy from Sort[] to QueryOptions orderBy format\n const powerSyncOrderBy = useMemo(() => {\n if (filters?.sort && filters.sort.length > 0) {\n return filters.sort.map(s => ({\n field: s.field,\n direction: s.direction\n }));\n }\n return orderBy;\n }, [filters?.sort, orderBy]);\n const powerSyncResult = useDbQuery<T>(table as string, {\n select,\n where,\n orderBy: powerSyncOrderBy,\n limit: filters?.pagination?.limit ?? limit,\n offset: filters?.pagination?.offset ?? offset,\n enabled: enabled && usePowerSyncPath && filters?.isReady !== false,\n realtime: realtimeEnabled // Enable watch() subscriptions for reactive updates\n });\n\n // ==========================================================================\n // Edge Function Query (with filters path)\n // ==========================================================================\n\n const [extraData, setExtraData] = useState<{\n count?: number;\n key?: string;\n }>({});\n const edgeFunctionQueryKey = useMemo(() => [\"v3\", \"advance-query\", tableName, select, JSON.stringify(where), JSON.stringify(filters)], [tableName, select, where, filters]);\n const edgeFunctionResult = useQuery<{\n data: T[];\n count?: number;\n clarification?: ClarificationQuestion;\n }>({\n queryKey: edgeFunctionQueryKey,\n queryFn: async ({\n signal\n }) => {\n const {\n data: {\n session\n }\n } = await supabase.auth.getSession();\n if (!session?.access_token) {\n throw new Error(\"No active session\");\n }\n const controller = new AbortController();\n signal.addEventListener(\"abort\", () => controller.abort());\n const timeoutId = setTimeout(() => controller.abort(), timeout);\n try {\n // Build filter body\n const filterBody = {\n id: filters.id || \"root\",\n op: filters.op || \"AND\",\n not: filters.not,\n filters: filters.filters || []\n };\n\n // Parse base where conditions into filters\n const baseFilters: Filter[] = [];\n if (where) {\n Object.entries(where).forEach(([field, value]) => {\n if (value !== undefined && value !== null) {\n if (typeof value === \"object\" && \"in\" in value) {\n // Handle { in: [...] } syntax\n baseFilters.push({\n id: `base-${field}`,\n field,\n op: \"in\",\n value: (value as {\n in: unknown[];\n }).in as string[] | number[]\n });\n } else {\n baseFilters.push({\n id: `base-${field}`,\n field,\n op: \"=\",\n value: value as string | number | boolean | null\n });\n }\n }\n });\n }\n\n // Combine base filters with user filters\n const combinedFilters = [...baseFilters, ...filterBody.filters];\n const currentKey = `${tableName}${select}${JSON.stringify(omit(filters, [\"pagination\", \"isReady\"]))}`;\n const res = await fetch(`${getSupabaseUrl()}/functions/v1/query?forceDenoVersion=2`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${session.access_token}`\n },\n body: JSON.stringify({\n table: tableName,\n schema: \"public\",\n select: select ?? \"*\",\n filters: {\n id: filterBody.id,\n op: filterBody.op,\n not: filterBody.not,\n filters: combinedFilters\n },\n pagination: filters.pagination,\n sort: filters.sort || orderBy?.map(o => ({\n field: o.field,\n direction: o.direction\n })),\n distinctOn: filters.distinctOn,\n naturalLanguageQuery: filters.naturalLanguageQuery,\n count: currentKey === extraData.key ? \"\" : count\n }),\n signal: controller.signal\n });\n if (!res.ok) {\n const errorData = await res.json();\n const errorMessage = typeof errorData?.error === \"string\" ? errorData.error : errorData?.error?.message || errorData?.message || \"Query failed\";\n throw new Error(errorMessage);\n }\n const result = await res.json();\n\n // Handle clarification response\n if (result.clarification) {\n return {\n data: [] as T[],\n count: 0,\n clarification: result.clarification\n };\n }\n setExtraData(prev => ({\n count: prev.key === currentKey ? prev.count : result.count,\n key: currentKey\n }));\n return {\n data: result.data as T[],\n count: result.count\n };\n } finally {\n clearTimeout(timeoutId);\n }\n },\n enabled: enabled && !usePowerSyncPath && filters?.isReady !== false,\n staleTime: 30000,\n gcTime: 300000,\n refetchOnMount: true,\n refetchOnWindowFocus: false\n });\n\n // ==========================================================================\n // Supabase Realtime Subscription (edge function path only)\n // ==========================================================================\n\n // When realtime is enabled and using edge function path,\n // subscribe to Supabase realtime to invalidate query on changes\n useEffect(() => {\n // Only set up realtime for edge function path when realtime is enabled\n if (!realtimeEnabled || usePowerSyncPath || !enabled) {\n return;\n }\n\n // Build filter for the subscription based on where clause\n const channel = supabase.channel(`advance-query-${tableName}-${filterKey}`).on(\"postgres_changes\", {\n event: \"*\",\n // Listen to INSERT, UPDATE, DELETE\n schema: \"public\",\n table: tableName\n // Note: We can't easily filter by complex where clauses,\n // so we invalidate on any change to the table\n }, () => {\n // Invalidate the query to trigger a refetch\n queryClient.invalidateQueries({\n queryKey: edgeFunctionQueryKey\n });\n }).subscribe();\n return () => {\n supabase.removeChannel(channel);\n };\n }, [realtimeEnabled, usePowerSyncPath, enabled, supabase, tableName, filterKey, queryClient, edgeFunctionQueryKey]);\n\n // ==========================================================================\n // Dev Logging (edge function path only - PowerSync path logs via useDbQuery)\n // ==========================================================================\n\n useEffect(() => {\n // Only log for edge function path\n if (usePowerSyncPath) return;\n const pathName = \"EdgeFunction\";\n\n // Log errors\n if (edgeFunctionResult.isError && edgeFunctionResult.error) {\n devWarn(\"useAdvanceQuery\", `${tableName} via ${pathName}: Error - ${edgeFunctionResult.error.message}`);\n }\n\n // Log empty results (only after successful fetch)\n if (edgeFunctionResult.isSuccess && edgeFunctionResult.data?.data?.length === 0) {\n devLog(\"useAdvanceQuery\", `${tableName} via ${pathName}: 0 results`);\n }\n }, [usePowerSyncPath, edgeFunctionResult.isError, edgeFunctionResult.error, edgeFunctionResult.isSuccess, edgeFunctionResult.data, tableName]);\n\n // ==========================================================================\n // Combine Results\n // ==========================================================================\n\n const result = useMemo((): UseAdvanceQueryResult<T> => {\n if (usePowerSyncPath) {\n // PowerSync path\n return {\n data: powerSyncResult.data as T[] | undefined,\n isLoading: powerSyncResult.isLoading,\n isPending: powerSyncResult.isPending,\n isFetching: powerSyncResult.isFetching,\n isRefetching: powerSyncResult.isRefetching,\n isSuccess: powerSyncResult.isSuccess,\n isError: powerSyncResult.isError,\n error: powerSyncResult.error,\n refetch: powerSyncResult.refetch,\n count: powerSyncResult.count ?? powerSyncResult.data?.length\n };\n }\n\n // Edge function path\n return {\n data: edgeFunctionResult.data?.data,\n isLoading: edgeFunctionResult.isLoading,\n isPending: edgeFunctionResult.isPending,\n isFetching: edgeFunctionResult.isFetching,\n isRefetching: edgeFunctionResult.isFetching,\n isSuccess: edgeFunctionResult.isSuccess,\n isError: edgeFunctionResult.isError,\n error: edgeFunctionResult.error as Error | null,\n refetch: async () => {\n await edgeFunctionResult.refetch();\n },\n count: edgeFunctionResult.data?.count ?? extraData.count,\n clarification: edgeFunctionResult.data?.clarification\n };\n }, [usePowerSyncPath, powerSyncResult, edgeFunctionResult, extraData.count]);\n return [result, filters, setFilters];\n}\nexport default useAdvanceQuery;","import { c as _c } from \"react/compiler-runtime\";\n/**\n * V3 useDbInsert Hook\n *\n * React hook for inserting records into a table using the V3 adapter pattern.\n * Integrates with React Query for mutation management and cache invalidation.\n */\n\nimport { useCallback } from \"react\";\nimport { useMutation, useQueryClient } from \"@tanstack/react-query\";\nimport { useDataLayerCore } from \"./useDataLayer\";\nimport { devLog } from \"../utils/dev-log\";\n\n/**\n * Options for useDbInsert hook\n */\nexport interface UseDbInsertOptions<T> {\n /** Callback when insert succeeds */\n onSuccess?: (data: T) => void;\n /** Callback when insert fails */\n onError?: (error: Error) => void;\n /** Tables to invalidate after successful insert */\n invalidateTables?: string[];\n}\n\n/**\n * Result from useDbInsert hook\n */\nexport interface UseDbInsertResult<T> {\n /** Trigger insert (fire and forget) */\n mutate: (data: Partial<T>) => void;\n /** Trigger insert and await result */\n mutateAsync: (data: Partial<T>) => Promise<T>;\n /** Whether mutation is in progress */\n isPending: boolean;\n /** Mutation error if any */\n error: Error | null;\n /** Reset mutation state */\n reset: () => void;\n /** Last successful data */\n data: T | undefined;\n}\n\n/**\n * Hook for inserting records into a table\n *\n * Uses the V3 adapter pattern to route inserts to the appropriate backend\n * (PowerSync, Supabase, or Cached) based on table configuration.\n *\n * @param table - The table name to insert into\n * @param options - Optional configuration for callbacks and cache invalidation\n * @returns Mutation result with mutate/mutateAsync functions\n *\n * @example\n * ```typescript\n * const { mutateAsync, isPending } = useDbInsert<Task>(\"Task\");\n * const newTask = await mutateAsync({ title: \"New Task\", status: \"pending\" });\n * ```\n *\n * @example\n * ```typescript\n * // With options\n * const { mutate } = useDbInsert<Project>(\"Project\", {\n * onSuccess: (data) => console.log(\"Created:\", data),\n * onError: (error) => console.error(\"Failed:\", error),\n * invalidateTables: [\"Project\", \"ProjectSummary\"],\n * });\n * ```\n */\nexport function useDbInsert(table, t0) {\n const $ = _c(25);\n let t1;\n if ($[0] !== t0) {\n t1 = t0 === undefined ? {} : t0;\n $[0] = t0;\n $[1] = t1;\n } else {\n t1 = $[1];\n }\n const options = t1;\n const {\n registry\n } = useDataLayerCore();\n const queryClient = useQueryClient();\n const {\n onSuccess,\n onError,\n invalidateTables: t2\n } = options;\n let t3;\n if ($[2] !== t2 || $[3] !== table) {\n t3 = t2 === undefined ? [table] : t2;\n $[2] = t2;\n $[3] = table;\n $[4] = t3;\n } else {\n t3 = $[4];\n }\n const invalidateTables = t3;\n let t4;\n if ($[5] !== registry || $[6] !== table) {\n t4 = async data => {\n const adapter = registry.getAdapter(table, \"write\");\n devLog(\"useDbInsert\", `${table} via ${adapter.name}`);\n return await adapter.insert(table, data);\n };\n $[5] = registry;\n $[6] = table;\n $[7] = t4;\n } else {\n t4 = $[7];\n }\n const mutationFn = t4;\n let t5;\n if ($[8] !== invalidateTables || $[9] !== onSuccess || $[10] !== queryClient) {\n t5 = data_0 => {\n invalidateTables.forEach(t => {\n queryClient.invalidateQueries({\n predicate: query => query.queryKey[0] === \"v3\" && query.queryKey[2] === t\n });\n });\n onSuccess?.(data_0);\n };\n $[8] = invalidateTables;\n $[9] = onSuccess;\n $[10] = queryClient;\n $[11] = t5;\n } else {\n t5 = $[11];\n }\n let t6;\n if ($[12] !== onError) {\n t6 = error => {\n onError?.(error instanceof Error ? error : new Error(String(error)));\n };\n $[12] = onError;\n $[13] = t6;\n } else {\n t6 = $[13];\n }\n let t7;\n if ($[14] !== mutationFn || $[15] !== t5 || $[16] !== t6) {\n t7 = {\n mutationFn,\n onSuccess: t5,\n onError: t6\n };\n $[14] = mutationFn;\n $[15] = t5;\n $[16] = t6;\n $[17] = t7;\n } else {\n t7 = $[17];\n }\n const mutation = useMutation(t7);\n const t8 = mutation.error as Error | null;\n let t9;\n if ($[18] !== mutation.data || $[19] !== mutation.isPending || $[20] !== mutation.mutate || $[21] !== mutation.mutateAsync || $[22] !== mutation.reset || $[23] !== t8) {\n t9 = {\n mutate: mutation.mutate,\n mutateAsync: mutation.mutateAsync,\n isPending: mutation.isPending,\n error: t8,\n reset: mutation.reset,\n data: mutation.data\n };\n $[18] = mutation.data;\n $[19] = mutation.isPending;\n $[20] = mutation.mutate;\n $[21] = mutation.mutateAsync;\n $[22] = mutation.reset;\n $[23] = t8;\n $[24] = t9;\n } else {\n t9 = $[24];\n }\n return t9;\n}\nexport default useDbInsert;","import { c as _c } from \"react/compiler-runtime\";\n/**\n * V3 useDbUpdate Hook\n *\n * React hook for updating records in a table using the V3 adapter pattern.\n * Integrates with React Query for mutation management, cache invalidation,\n * and optional optimistic updates.\n */\n\nimport { useCallback } from \"react\";\nimport { useMutation, useQueryClient } from \"@tanstack/react-query\";\nimport { useDataLayerCore } from \"./useDataLayer\";\nimport { devLog } from \"../utils/dev-log\";\n\n/**\n * Options for useDbUpdate hook\n */\nexport interface UseDbUpdateOptions<T> {\n /** Callback when update succeeds */\n onSuccess?: (data: T) => void;\n /** Callback when update fails */\n onError?: (error: Error) => void;\n /** Tables to invalidate after successful update */\n invalidateTables?: string[];\n /** Enable optimistic updates */\n optimistic?: boolean;\n}\n\n/**\n * Result from useDbUpdate hook\n */\nexport interface UseDbUpdateResult<T> {\n /** Trigger update (fire and forget) */\n mutate: (params: {\n id: string;\n data: Partial<T>;\n }) => void;\n /** Trigger update and await result */\n mutateAsync: (params: {\n id: string;\n data: Partial<T>;\n }) => Promise<T>;\n /** Whether mutation is in progress */\n isPending: boolean;\n /** Mutation error if any */\n error: Error | null;\n /** Reset mutation state */\n reset: () => void;\n /** Last successful data */\n data: T | undefined;\n}\n\n/**\n * Hook for updating records in a table\n *\n * Uses the V3 adapter pattern to route updates to the appropriate backend\n * (PowerSync, Supabase, or Cached) based on table configuration.\n *\n * @param table - The table name to update records in\n * @param options - Optional configuration for callbacks, cache invalidation, and optimistic updates\n * @returns Mutation result with mutate/mutateAsync functions\n *\n * @example\n * ```typescript\n * const { mutateAsync, isPending } = useDbUpdate<Task>(\"Task\");\n * const updated = await mutateAsync({ id: taskId, data: { status: \"completed\" } });\n * ```\n *\n * @example\n * ```typescript\n * // With optimistic updates\n * const { mutate } = useDbUpdate<Project>(\"Project\", {\n * optimistic: true,\n * onSuccess: (data) => console.log(\"Updated:\", data),\n * onError: (error) => console.error(\"Failed:\", error),\n * });\n * ```\n */\nexport function useDbUpdate(table, t0) {\n const $ = _c(32);\n let t1;\n if ($[0] !== t0) {\n t1 = t0 === undefined ? {} : t0;\n $[0] = t0;\n $[1] = t1;\n } else {\n t1 = $[1];\n }\n const options = t1;\n const {\n registry\n } = useDataLayerCore();\n const queryClient = useQueryClient();\n const {\n onSuccess,\n onError,\n invalidateTables: t2,\n optimistic: t3\n } = options;\n let t4;\n if ($[2] !== t2 || $[3] !== table) {\n t4 = t2 === undefined ? [table] : t2;\n $[2] = t2;\n $[3] = table;\n $[4] = t4;\n } else {\n t4 = $[4];\n }\n const invalidateTables = t4;\n const optimistic = t3 === undefined ? false : t3;\n let t5;\n if ($[5] !== registry || $[6] !== table) {\n t5 = async params => {\n const adapter = registry.getAdapter(table, \"write\");\n devLog(\"useDbUpdate\", `${table} via ${adapter.name}`);\n return await adapter.update(table, params.id, params.data);\n };\n $[5] = registry;\n $[6] = table;\n $[7] = t5;\n } else {\n t5 = $[7];\n }\n const mutationFn = t5;\n let t6;\n if ($[8] !== optimistic || $[9] !== queryClient || $[10] !== table) {\n t6 = optimistic ? async () => {\n await queryClient.cancelQueries({\n predicate: query => query.queryKey[0] === \"v3\" && query.queryKey[2] === table\n });\n const previousData = queryClient.getQueriesData({\n predicate: query_0 => query_0.queryKey[0] === \"v3\" && query_0.queryKey[2] === table\n });\n return {\n previousData\n };\n } : undefined;\n $[8] = optimistic;\n $[9] = queryClient;\n $[10] = table;\n $[11] = t6;\n } else {\n t6 = $[11];\n }\n let t7;\n if ($[12] !== invalidateTables || $[13] !== onSuccess || $[14] !== queryClient) {\n t7 = data => {\n invalidateTables.forEach(t => {\n queryClient.invalidateQueries({\n predicate: query_1 => query_1.queryKey[0] === \"v3\" && query_1.queryKey[2] === t\n });\n });\n onSuccess?.(data);\n };\n $[12] = invalidateTables;\n $[13] = onSuccess;\n $[14] = queryClient;\n $[15] = t7;\n } else {\n t7 = $[15];\n }\n let t8;\n if ($[16] !== onError || $[17] !== optimistic || $[18] !== queryClient) {\n t8 = (error, _variables, context) => {\n if (optimistic && context?.previousData) {\n context.previousData.forEach(t9 => {\n const [queryKey, data_0] = t9;\n queryClient.setQueryData(queryKey, data_0);\n });\n }\n onError?.(error instanceof Error ? error : new Error(String(error)));\n };\n $[16] = onError;\n $[17] = optimistic;\n $[18] = queryClient;\n $[19] = t8;\n } else {\n t8 = $[19];\n }\n let t9;\n if ($[20] !== mutationFn || $[21] !== t6 || $[22] !== t7 || $[23] !== t8) {\n t9 = {\n mutationFn,\n onMutate: t6,\n onSuccess: t7,\n onError: t8\n };\n $[20] = mutationFn;\n $[21] = t6;\n $[22] = t7;\n $[23] = t8;\n $[24] = t9;\n } else {\n t9 = $[24];\n }\n const mutation = useMutation(t9);\n const t10 = mutation.error as Error | null;\n let t11;\n if ($[25] !== mutation.data || $[26] !== mutation.isPending || $[27] !== mutation.mutate || $[28] !== mutation.mutateAsync || $[29] !== mutation.reset || $[30] !== t10) {\n t11 = {\n mutate: mutation.mutate,\n mutateAsync: mutation.mutateAsync,\n isPending: mutation.isPending,\n error: t10,\n reset: mutation.reset,\n data: mutation.data\n };\n $[25] = mutation.data;\n $[26] = mutation.isPending;\n $[27] = mutation.mutate;\n $[28] = mutation.mutateAsync;\n $[29] = mutation.reset;\n $[30] = t10;\n $[31] = t11;\n } else {\n t11 = $[31];\n }\n return t11;\n}\nexport default useDbUpdate;","import { c as _c } from \"react/compiler-runtime\";\n/**\n * V3 useDbUpsert Hook\n *\n * React hook for upserting (insert or update) records in a table using the V3 adapter pattern.\n * Integrates with React Query for mutation management and cache invalidation.\n */\n\nimport { useCallback } from \"react\";\nimport { useMutation, useQueryClient } from \"@tanstack/react-query\";\nimport { useDataLayerCore } from \"./useDataLayer\";\nimport { devLog } from \"../utils/dev-log\";\n\n/**\n * Options for useDbUpsert hook\n */\nexport interface UseDbUpsertOptions<T> {\n /** Callback when upsert succeeds */\n onSuccess?: (data: T) => void;\n /** Callback when upsert fails */\n onError?: (error: Error) => void;\n /** Tables to invalidate after successful upsert */\n invalidateTables?: string[];\n}\n\n/**\n * Result from useDbUpsert hook\n */\nexport interface UseDbUpsertResult<T> {\n /** Trigger upsert (fire and forget) */\n mutate: (data: Partial<T>) => void;\n /** Trigger upsert and await result */\n mutateAsync: (data: Partial<T>) => Promise<T>;\n /** Whether mutation is in progress */\n isPending: boolean;\n /** Mutation error if any */\n error: Error | null;\n /** Reset mutation state */\n reset: () => void;\n /** Last successful data */\n data: T | undefined;\n}\n\n/**\n * Hook for upserting (insert or update) records in a table\n *\n * Uses the V3 adapter pattern to route upserts to the appropriate backend\n * (PowerSync, Supabase, or Cached) based on table configuration.\n *\n * If the record has an ID and exists, it will be updated.\n * Otherwise, a new record will be inserted.\n *\n * @param table - The table name to upsert into\n * @param options - Optional configuration for callbacks and cache invalidation\n * @returns Mutation result with mutate/mutateAsync functions\n *\n * @example\n * ```typescript\n * const { mutateAsync, isPending } = useDbUpsert<Task>(\"Task\");\n * const task = await mutateAsync({ id: existingId, title: \"Updated Title\" });\n * ```\n *\n * @example\n * ```typescript\n * // Insert if no ID, update if ID exists\n * const { mutate } = useDbUpsert<Setting>(\"Setting\", {\n * onSuccess: (data) => console.log(\"Upserted:\", data),\n * invalidateTables: [\"Setting\", \"UserPreferences\"],\n * });\n *\n * // This will insert (no id)\n * mutate({ key: \"theme\", value: \"dark\" });\n *\n * // This will update (has id)\n * mutate({ id: \"setting-123\", key: \"theme\", value: \"light\" });\n * ```\n */\nexport function useDbUpsert(table, t0) {\n const $ = _c(25);\n let t1;\n if ($[0] !== t0) {\n t1 = t0 === undefined ? {} : t0;\n $[0] = t0;\n $[1] = t1;\n } else {\n t1 = $[1];\n }\n const options = t1;\n const {\n registry\n } = useDataLayerCore();\n const queryClient = useQueryClient();\n const {\n onSuccess,\n onError,\n invalidateTables: t2\n } = options;\n let t3;\n if ($[2] !== t2 || $[3] !== table) {\n t3 = t2 === undefined ? [table] : t2;\n $[2] = t2;\n $[3] = table;\n $[4] = t3;\n } else {\n t3 = $[4];\n }\n const invalidateTables = t3;\n let t4;\n if ($[5] !== registry || $[6] !== table) {\n t4 = async data => {\n const adapter = registry.getAdapter(table, \"write\");\n devLog(\"useDbUpsert\", `${table} via ${adapter.name}`);\n return await adapter.upsert(table, data);\n };\n $[5] = registry;\n $[6] = table;\n $[7] = t4;\n } else {\n t4 = $[7];\n }\n const mutationFn = t4;\n let t5;\n if ($[8] !== invalidateTables || $[9] !== onSuccess || $[10] !== queryClient) {\n t5 = data_0 => {\n invalidateTables.forEach(t => {\n queryClient.invalidateQueries({\n predicate: query => query.queryKey[0] === \"v3\" && query.queryKey[2] === t\n });\n });\n onSuccess?.(data_0);\n };\n $[8] = invalidateTables;\n $[9] = onSuccess;\n $[10] = queryClient;\n $[11] = t5;\n } else {\n t5 = $[11];\n }\n let t6;\n if ($[12] !== onError) {\n t6 = error => {\n onError?.(error instanceof Error ? error : new Error(String(error)));\n };\n $[12] = onError;\n $[13] = t6;\n } else {\n t6 = $[13];\n }\n let t7;\n if ($[14] !== mutationFn || $[15] !== t5 || $[16] !== t6) {\n t7 = {\n mutationFn,\n onSuccess: t5,\n onError: t6\n };\n $[14] = mutationFn;\n $[15] = t5;\n $[16] = t6;\n $[17] = t7;\n } else {\n t7 = $[17];\n }\n const mutation = useMutation(t7);\n const t8 = mutation.error as Error | null;\n let t9;\n if ($[18] !== mutation.data || $[19] !== mutation.isPending || $[20] !== mutation.mutate || $[21] !== mutation.mutateAsync || $[22] !== mutation.reset || $[23] !== t8) {\n t9 = {\n mutate: mutation.mutate,\n mutateAsync: mutation.mutateAsync,\n isPending: mutation.isPending,\n error: t8,\n reset: mutation.reset,\n data: mutation.data\n };\n $[18] = mutation.data;\n $[19] = mutation.isPending;\n $[20] = mutation.mutate;\n $[21] = mutation.mutateAsync;\n $[22] = mutation.reset;\n $[23] = t8;\n $[24] = t9;\n } else {\n t9 = $[24];\n }\n return t9;\n}\nexport default useDbUpsert;","import { c as _c } from \"react/compiler-runtime\";\n/**\n * V3 useDbDelete Hook\n *\n * React hook for deleting records from a table using the V3 adapter pattern.\n * Integrates with React Query for mutation management, cache invalidation,\n * and optional optimistic deletes.\n */\n\nimport { useCallback } from \"react\";\nimport { useMutation, useQueryClient } from \"@tanstack/react-query\";\nimport { useDataLayerCore } from \"./useDataLayer\";\nimport { devLog } from \"../utils/dev-log\";\n\n/**\n * Options for useDbDelete hook\n */\nexport interface UseDbDeleteOptions {\n /** Callback when delete succeeds */\n onSuccess?: () => void;\n /** Callback when delete fails */\n onError?: (error: Error) => void;\n /** Tables to invalidate after successful delete */\n invalidateTables?: string[];\n /** Enable optimistic delete */\n optimistic?: boolean;\n}\n\n/**\n * Result from useDbDelete hook\n */\nexport interface UseDbDeleteResult {\n /** Trigger delete (fire and forget) */\n mutate: (id: string) => void;\n /** Trigger delete and await completion */\n mutateAsync: (id: string) => Promise<void>;\n /** Whether mutation is in progress */\n isPending: boolean;\n /** Mutation error if any */\n error: Error | null;\n /** Reset mutation state */\n reset: () => void;\n}\n\n/**\n * Hook for deleting records from a table\n *\n * Uses the V3 adapter pattern to route deletes to the appropriate backend\n * (PowerSync, Supabase, or Cached) based on table configuration.\n *\n * @param table - The table name to delete from\n * @param options - Optional configuration for callbacks, cache invalidation, and optimistic deletes\n * @returns Mutation result with mutate/mutateAsync functions\n *\n * @example\n * ```typescript\n * const { mutateAsync, isPending } = useDbDelete(\"Task\");\n * await mutateAsync(taskId);\n * ```\n *\n * @example\n * ```typescript\n * // With optimistic delete for instant UI feedback\n * const { mutate } = useDbDelete(\"Comment\", {\n * optimistic: true,\n * onSuccess: () => console.log(\"Deleted successfully\"),\n * onError: (error) => console.error(\"Delete failed:\", error),\n * invalidateTables: [\"Comment\", \"Post\"],\n * });\n *\n * // Immediately removes from UI, rolls back on failure\n * mutate(commentId);\n * ```\n */\nexport function useDbDelete(table, t0) {\n const $ = _c(31);\n let t1;\n if ($[0] !== t0) {\n t1 = t0 === undefined ? {} : t0;\n $[0] = t0;\n $[1] = t1;\n } else {\n t1 = $[1];\n }\n const options = t1;\n const {\n registry\n } = useDataLayerCore();\n const queryClient = useQueryClient();\n const {\n onSuccess,\n onError,\n invalidateTables: t2,\n optimistic: t3\n } = options;\n let t4;\n if ($[2] !== t2 || $[3] !== table) {\n t4 = t2 === undefined ? [table] : t2;\n $[2] = t2;\n $[3] = table;\n $[4] = t4;\n } else {\n t4 = $[4];\n }\n const invalidateTables = t4;\n const optimistic = t3 === undefined ? false : t3;\n let t5;\n if ($[5] !== registry || $[6] !== table) {\n t5 = async id => {\n const adapter = registry.getAdapter(table, \"write\");\n devLog(\"useDbDelete\", `${table} via ${adapter.name}`);\n await adapter.delete(table, id);\n };\n $[5] = registry;\n $[6] = table;\n $[7] = t5;\n } else {\n t5 = $[7];\n }\n const mutationFn = t5;\n let t6;\n if ($[8] !== optimistic || $[9] !== queryClient || $[10] !== table) {\n t6 = optimistic ? async id_0 => {\n await queryClient.cancelQueries({\n predicate: query => query.queryKey[0] === \"v3\" && query.queryKey[2] === table\n });\n const previousData = queryClient.getQueriesData({\n predicate: query_0 => query_0.queryKey[0] === \"v3\" && query_0.queryKey[2] === table\n });\n queryClient.setQueriesData({\n predicate: query_1 => query_1.queryKey[0] === \"v3\" && query_1.queryKey[2] === table\n }, old => {\n if (!old?.data) {\n return old;\n }\n return {\n ...old,\n data: old.data.filter(item => item.id !== id_0)\n };\n });\n return {\n previousData\n };\n } : undefined;\n $[8] = optimistic;\n $[9] = queryClient;\n $[10] = table;\n $[11] = t6;\n } else {\n t6 = $[11];\n }\n let t7;\n if ($[12] !== invalidateTables || $[13] !== onSuccess || $[14] !== queryClient) {\n t7 = () => {\n invalidateTables.forEach(t => {\n queryClient.invalidateQueries({\n predicate: query_2 => query_2.queryKey[0] === \"v3\" && query_2.queryKey[2] === t\n });\n });\n onSuccess?.();\n };\n $[12] = invalidateTables;\n $[13] = onSuccess;\n $[14] = queryClient;\n $[15] = t7;\n } else {\n t7 = $[15];\n }\n let t8;\n if ($[16] !== onError || $[17] !== optimistic || $[18] !== queryClient) {\n t8 = (error, _id, context) => {\n if (optimistic && context?.previousData) {\n context.previousData.forEach(t9 => {\n const [queryKey, data] = t9;\n queryClient.setQueryData(queryKey, data);\n });\n }\n onError?.(error instanceof Error ? error : new Error(String(error)));\n };\n $[16] = onError;\n $[17] = optimistic;\n $[18] = queryClient;\n $[19] = t8;\n } else {\n t8 = $[19];\n }\n let t9;\n if ($[20] !== mutationFn || $[21] !== t6 || $[22] !== t7 || $[23] !== t8) {\n t9 = {\n mutationFn,\n onMutate: t6,\n onSuccess: t7,\n onError: t8\n };\n $[20] = mutationFn;\n $[21] = t6;\n $[22] = t7;\n $[23] = t8;\n $[24] = t9;\n } else {\n t9 = $[24];\n }\n const mutation = useMutation(t9);\n const t10 = mutation.error as Error | null;\n let t11;\n if ($[25] !== mutation.isPending || $[26] !== mutation.mutate || $[27] !== mutation.mutateAsync || $[28] !== mutation.reset || $[29] !== t10) {\n t11 = {\n mutate: mutation.mutate,\n mutateAsync: mutation.mutateAsync,\n isPending: mutation.isPending,\n error: t10,\n reset: mutation.reset\n };\n $[25] = mutation.isPending;\n $[26] = mutation.mutate;\n $[27] = mutation.mutateAsync;\n $[28] = mutation.reset;\n $[29] = t10;\n $[30] = t11;\n } else {\n t11 = $[30];\n }\n return t11;\n}\nexport default useDbDelete;","/**\n * V3 useDbInfiniteQuery Hook\n *\n * React hook for querying records with infinite scroll pagination.\n * Works identically whether PowerSync or Supabase is the backend.\n * Uses React Query's useInfiniteQuery for state management and caching.\n *\n * Types are automatically inferred from table names when you augment\n * the DatabaseTypes interface with your app's Database type.\n *\n * @example\n * // In your app's types/db.d.ts:\n * declare module \"@pol-studios/db\" {\n * interface DatabaseTypes {\n * database: import(\"@/database.types\").Database;\n * }\n * }\n *\n * // Then usage auto-infers types:\n * const { data, fetchNextPage, hasNextPage } = useDbInfiniteQuery(\"EquipmentFixtureUnit\", {\n * pageSize: 20,\n * orderBy: [{ field: \"createdAt\", direction: \"desc\" }],\n * });\n */\n\nimport { useMemo, useCallback, useEffect, useRef } from \"react\";\nimport { useInfiniteQuery, InfiniteData } from \"@tanstack/react-query\";\nimport { useDataLayerCore } from \"./useDataLayer\";\nimport type { QueryOptions, WhereClause } from \"../core/types\";\nimport { devLog, devWarn } from \"../utils/dev-log\";\n\n// =============================================================================\n// Module Augmentation Interface\n// =============================================================================\n\n/**\n * Augment this interface in your app to enable automatic type inference.\n */\n// eslint-disable-next-line @typescript-eslint/no-empty-interface\nexport interface DatabaseTypes {}\n\n// =============================================================================\n// Database Type Helpers\n// =============================================================================\n\n/**\n * The configured Database type, or a generic fallback\n */\ntype ConfiguredDatabase = DatabaseTypes extends {\n database: infer DB;\n} ? DB : GenericSchema;\n\n/**\n * Generic schema structure for fallback\n */\ntype GenericSchema = {\n public: {\n Tables: Record<string, {\n Row: Record<string, unknown>;\n }>;\n Views: Record<string, {\n Row: Record<string, unknown>;\n }>;\n };\n [schema: string]: {\n Tables: Record<string, {\n Row: Record<string, unknown>;\n }>;\n Views?: Record<string, {\n Row: Record<string, unknown>;\n }>;\n };\n};\n\n/**\n * Default schema from Database (usually \"public\")\n */\ntype DefaultSchema = ConfiguredDatabase extends {\n public: infer S;\n} ? S : never;\n\n/**\n * Extract all valid table names from the default schema\n */\nexport type PublicTableNames = DefaultSchema extends {\n Tables: infer T;\n} ? keyof T & string : string;\n\n/**\n * Extract all valid schema names\n */\nexport type SchemaNames = keyof ConfiguredDatabase & string;\n\n/**\n * Extract table names for a specific schema\n */\nexport type SchemaTableNames<S extends string> = ConfiguredDatabase extends { [K in S]: {\n Tables: infer T;\n} } ? keyof T & string : string;\n\n/**\n * Build dot notation strings for all schema.table combinations\n */\ntype SchemaDotTable = { [S in SchemaNames]: S extends \"public\" ? never : `${S}.${SchemaTableNames<S>}` }[SchemaNames];\n\n/**\n * Table identifier - provides autocomplete for valid table names\n */\nexport type TableIdentifier = PublicTableNames | SchemaDotTable | { [S in Exclude<SchemaNames, \"public\">]: {\n schema: S;\n table: SchemaTableNames<S>;\n} }[Exclude<SchemaNames, \"public\">];\n\n/**\n * Resolve row type from a table identifier\n */\nexport type ResolveRowType<T extends TableIdentifier> = T extends string ? T extends `${infer Schema}.${infer Table}` ? ConfiguredDatabase extends { [K in Schema]: {\n Tables: { [K2 in Table]: {\n Row: infer R;\n } };\n} } ? R : Record<string, unknown> : DefaultSchema extends {\n Tables: { [K in T]: {\n Row: infer R;\n } };\n} ? R : DefaultSchema extends {\n Views: { [K in T]: {\n Row: infer R;\n } };\n} ? R : Record<string, unknown> : T extends {\n schema: infer S;\n table: infer TN;\n} ? S extends string ? TN extends string ? ConfiguredDatabase extends { [K in S]: {\n Tables: { [K2 in TN]: {\n Row: infer R;\n } };\n} } ? R : Record<string, unknown> : Record<string, unknown> : Record<string, unknown> : Record<string, unknown>;\n\n// =============================================================================\n// Types\n// =============================================================================\n\n/**\n * Options for useDbInfiniteQuery hook\n */\nexport interface UseDbInfiniteQueryOptions extends Omit<QueryOptions, \"limit\" | \"offset\" | \"enabled\"> {\n /** Whether the query is enabled (default: true) */\n enabled?: boolean;\n /** React Query stale time in ms (default: 30000) */\n staleTime?: number;\n /** Whether to refetch on window focus (default: true) */\n refetchOnWindowFocus?: boolean;\n /** Number of items per page (default: 50) */\n pageSize?: number;\n /** Text to search for */\n searchText?: string;\n /** Fields to search in when searchText is provided */\n searchFields?: string[];\n}\n\n/**\n * Result from useDbInfiniteQuery hook\n */\nexport interface UseDbInfiniteQueryResult<T> {\n /** Flattened array of all loaded data */\n data: T[] | undefined;\n /** Whether query is loading (initial load) */\n isLoading: boolean;\n /** Whether query is in pending state */\n isPending: boolean;\n /** Whether query is currently fetching (including refetch) */\n isFetching: boolean;\n /** Query error if any */\n error: Error | null;\n /** Function to fetch the next page */\n fetchNextPage: () => Promise<void>;\n /** Whether there are more pages to load */\n hasNextPage: boolean;\n /** Whether currently fetching the next page */\n isFetchingNextPage: boolean;\n /** Total count of items (if available) */\n count?: number;\n /** Refetch all pages */\n refetch: () => Promise<void>;\n}\n\n/**\n * Internal page result type\n */\ninterface PageResult<T> {\n data: T[];\n count?: number;\n}\n\n// =============================================================================\n// Helper Functions\n// =============================================================================\n\n/**\n * Build a query key for React Query infinite queries\n */\nfunction buildInfiniteQueryKey(table: string, options: UseDbInfiniteQueryOptions): unknown[] {\n return [\"v3\", \"infinite-query\", table, options.select ?? \"*\", JSON.stringify(options.where ?? {}), JSON.stringify(options.orderBy ?? []), options.pageSize ?? 50, options.searchText ?? \"\", JSON.stringify(options.searchFields ?? [])];\n}\n\n/**\n * Serialize query options for dependency tracking\n */\nfunction serializeInfiniteQueryOptions(options: UseDbInfiniteQueryOptions): string {\n return JSON.stringify({\n select: options.select,\n where: options.where,\n orderBy: options.orderBy,\n pageSize: options.pageSize,\n searchText: options.searchText,\n searchFields: options.searchFields\n });\n}\n\n/**\n * Helper to resolve table name from TableIdentifier\n */\nfunction resolveTableName(table: TableIdentifier): string {\n if (typeof table === \"string\") {\n return table;\n }\n return `${table.schema}.${table.table}`;\n}\n\n/**\n * Build search where clause from searchText and searchFields\n */\nfunction buildSearchWhereClause(searchText: string, searchFields: string[], existingWhere?: WhereClause): WhereClause {\n const searchWhere: WhereClause = {};\n if (searchFields.length === 1) {\n searchWhere[searchFields[0]] = {\n like: `%${searchText}%`\n };\n } else if (searchFields.length > 1) {\n searchWhere[searchFields[0]] = {\n like: `%${searchText}%`\n };\n }\n return {\n ...existingWhere,\n ...searchWhere\n };\n}\n\n// =============================================================================\n// Hook Implementation\n// =============================================================================\n\n/**\n * Hook for querying records with infinite scroll pagination\n *\n * @param table - Table name (string) or { schema, table } object\n * @param options - Query options (select, where, orderBy, pageSize, searchText, etc.)\n * @returns Query result with data, loading states, pagination controls, and refetch function\n *\n * @example\n * // Basic infinite query - types auto-inferred from table name\n * const { data, fetchNextPage, hasNextPage } = useDbInfiniteQuery(\"EquipmentFixtureUnit\");\n *\n * @example\n * // With search and pagination\n * const { data, fetchNextPage, hasNextPage, isFetchingNextPage } = useDbInfiniteQuery(\"Task\", {\n * pageSize: 20,\n * searchText: searchQuery,\n * searchFields: [\"name\", \"description\"],\n * orderBy: [{ field: \"createdAt\", direction: \"desc\" }],\n * });\n *\n * @example\n * // In a FlatList or similar\n * <FlatList\n * data={data}\n * onEndReached={() => hasNextPage && fetchNextPage()}\n * ListFooterComponent={isFetchingNextPage ? <Spinner /> : null}\n * />\n */\nexport function useDbInfiniteQuery<T extends TableIdentifier>(table: T, options?: UseDbInfiniteQueryOptions): UseDbInfiniteQueryResult<ResolveRowType<T>>;\n\n/**\n * Overload for explicit type parameter (backwards compatibility)\n */\nexport function useDbInfiniteQuery<T>(table: string, options?: UseDbInfiniteQueryOptions): UseDbInfiniteQueryResult<T>;\nexport function useDbInfiniteQuery<T>(table: TableIdentifier, options: UseDbInfiniteQueryOptions = {}): UseDbInfiniteQueryResult<T> {\n const tableName = resolveTableName(table);\n const {\n registry\n } = useDataLayerCore();\n const {\n enabled = true,\n staleTime = 30000,\n refetchOnWindowFocus = true,\n pageSize = 50,\n searchText,\n searchFields,\n ...queryOptions\n } = options;\n\n // Get adapter for this table\n // No isInitialized check needed - if we get here, core context exists = initialized\n const adapter = useMemo(() => {\n try {\n return registry.getAdapter(tableName);\n } catch {\n return null;\n }\n }, [registry, tableName]);\n\n // Serialize options for stable dependency tracking\n const serializedOptions = useMemo(() => serializeInfiniteQueryOptions(options), [options.select, options.where, options.orderBy, options.pageSize, options.searchText, options.searchFields]);\n\n // Build query key\n const queryKey = useMemo(() => buildInfiniteQueryKey(tableName, options), [tableName, serializedOptions]);\n\n // Build the where clause including search conditions\n const effectiveWhere = useMemo(() => {\n if (searchText && searchFields && searchFields.length > 0) {\n return buildSearchWhereClause(searchText, searchFields, queryOptions.where);\n }\n return queryOptions.where;\n }, [searchText, searchFields, queryOptions.where]);\n\n // Memoize base query options\n const memoizedQueryOptions = useMemo(() => ({\n select: queryOptions.select,\n where: effectiveWhere,\n orderBy: queryOptions.orderBy\n }), [queryOptions.select, effectiveWhere, queryOptions.orderBy]);\n\n // Track the adapter name that was actually used for the most recent query\n // This is used for accurate logging since the memoized adapter may be stale\n const lastUsedAdapterNameRef = useRef<string>(\"unknown\");\n\n // Execute infinite query with React Query\n const infiniteQuery = useInfiniteQuery<PageResult<T>, Error, InfiniteData<PageResult<T>, number>, unknown[], number>({\n queryKey,\n queryFn: async ({\n pageParam\n }) => {\n // Use currentAdapter directly - registry.getAdapter() throws if unavailable\n const currentAdapter = registry.getAdapter(tableName);\n\n // Track which adapter was actually used for accurate logging\n lastUsedAdapterNameRef.current = currentAdapter.name;\n const offset = (pageParam - 1) * pageSize;\n const result = await currentAdapter.query<T>(tableName, {\n ...memoizedQueryOptions,\n limit: pageSize,\n offset\n });\n return {\n data: result.data ?? [],\n count: result.count\n };\n },\n initialPageParam: 1,\n getNextPageParam: (lastPage, allPages) => {\n const totalLoaded = allPages.reduce((sum, page) => sum + page.data.length, 0);\n const totalCount = lastPage.count;\n if (totalCount !== undefined && totalLoaded >= totalCount) {\n return undefined;\n }\n if (lastPage.data.length < pageSize) {\n return undefined;\n }\n return allPages.length + 1;\n },\n enabled: enabled && adapter !== null,\n staleTime,\n refetchOnWindowFocus\n });\n\n // Flatten all pages into a single data array\n const flattenedData = useMemo(() => {\n if (!infiniteQuery.data?.pages) return undefined;\n return infiniteQuery.data.pages.flatMap(page_0 => page_0.data);\n }, [infiniteQuery.data?.pages]);\n\n // Get total count from the last page\n const count = useMemo(() => {\n if (!infiniteQuery.data?.pages || infiniteQuery.data.pages.length === 0) {\n return undefined;\n }\n return infiniteQuery.data.pages[infiniteQuery.data.pages.length - 1].count;\n }, [infiniteQuery.data?.pages]);\n\n // Build fetchNextPage function\n const fetchNextPage = useCallback(async () => {\n await infiniteQuery.fetchNextPage();\n }, [infiniteQuery]);\n\n // Build refetch function\n const refetch = useCallback(async () => {\n await infiniteQuery.refetch();\n }, [infiniteQuery]);\n\n // Dev logging for debugging\n // Uses lastUsedAdapterNameRef to log the adapter that was ACTUALLY used for the query,\n // not the memoized adapter from render time (which may be stale due to auto-detection)\n useEffect(() => {\n const adapterName = lastUsedAdapterNameRef.current;\n\n // Log errors\n if (infiniteQuery.isError && infiniteQuery.error) {\n devWarn(\"useDbInfiniteQuery\", `${tableName} via ${adapterName}: Error - ${infiniteQuery.error.message}`);\n }\n\n // Log empty results (only after successful fetch, not during loading)\n if (infiniteQuery.isSuccess && flattenedData?.length === 0) {\n devLog(\"useDbInfiniteQuery\", `${tableName} via ${adapterName}: 0 results`);\n }\n }, [infiniteQuery.isError, infiniteQuery.error, infiniteQuery.isSuccess, flattenedData, tableName]);\n return {\n data: flattenedData,\n isLoading: infiniteQuery.isLoading,\n isPending: infiniteQuery.isPending,\n isFetching: infiniteQuery.isFetching,\n error: infiniteQuery.error as Error | null,\n fetchNextPage,\n hasNextPage: infiniteQuery.hasNextPage ?? false,\n isFetchingNextPage: infiniteQuery.isFetchingNextPage,\n count,\n refetch\n };\n}\nexport default useDbInfiniteQuery;","import { c as _c } from \"react/compiler-runtime\";\n/**\n * V3 useDbCount Hook\n *\n * React hook for counting records in a table.\n * Works with the data layer using either PowerSync or Supabase backend.\n */\n\nimport { useMemo, useCallback, useEffect, useRef } from \"react\";\nimport { useQuery } from \"@tanstack/react-query\";\nimport { useDataLayerCore } from \"./useDataLayer\";\nimport type { WhereClause } from \"../core/types\";\nimport { devWarn } from \"../utils/dev-log\";\n\n// =============================================================================\n// Types\n// =============================================================================\n\n/**\n * Options for useDbCount hook\n */\nexport interface UseDbCountOptions {\n /** Filter conditions */\n where?: WhereClause;\n /** Whether the query is enabled (default: true) */\n enabled?: boolean;\n /** React Query stale time in ms (default: 30000) */\n staleTime?: number;\n}\n\n/**\n * Result from useDbCount hook\n */\nexport interface UseDbCountResult {\n /** The count value */\n count: number | undefined;\n /** Whether query is loading */\n isLoading: boolean;\n /** Whether query is fetching */\n isFetching: boolean;\n /** Query error if any */\n error: Error | null;\n /** Refetch the count */\n refetch: () => Promise<void>;\n}\n\n// =============================================================================\n// Hook Implementation\n// =============================================================================\n\n/**\n * Hook for counting records in a table\n *\n * @param table - The table name to count\n * @param options - Count options (where filter, enabled)\n * @returns Count result with loading states\n *\n * @example\n * // Simple count\n * const { count, isLoading } = useDbCount(\"EquipmentFixtureUnit\");\n *\n * @example\n * // Count with filter\n * const { count } = useDbCount(\"EquipmentFixtureUnit\", {\n * where: { projectDatabaseId: 123 },\n * });\n */\nexport function useDbCount(table, t0) {\n const $ = _c(32);\n let t1;\n if ($[0] !== t0) {\n t1 = t0 === undefined ? {} : t0;\n $[0] = t0;\n $[1] = t1;\n } else {\n t1 = $[1];\n }\n const options = t1;\n const {\n registry\n } = useDataLayerCore();\n const {\n enabled: t2,\n staleTime: t3,\n where\n } = options;\n const enabled = t2 === undefined ? true : t2;\n const staleTime = t3 === undefined ? 30000 : t3;\n let t4;\n try {\n let t5;\n if ($[2] !== registry || $[3] !== table) {\n t5 = registry.getAdapter(table);\n $[2] = registry;\n $[3] = table;\n $[4] = t5;\n } else {\n t5 = $[4];\n }\n t4 = t5;\n } catch {\n t4 = null;\n }\n const adapter = t4;\n let t5;\n if ($[5] !== where) {\n t5 = JSON.stringify(where ?? {});\n $[5] = where;\n $[6] = t5;\n } else {\n t5 = $[6];\n }\n let t6;\n if ($[7] !== t5 || $[8] !== table) {\n t6 = [\"v3\", \"count\", table, t5];\n $[7] = t5;\n $[8] = table;\n $[9] = t6;\n } else {\n t6 = $[9];\n }\n const queryKey = t6;\n const lastUsedAdapterNameRef = useRef(\"unknown\");\n let t7;\n if ($[10] !== registry || $[11] !== table || $[12] !== where) {\n t7 = async () => {\n const currentAdapter = registry.getAdapter(table);\n lastUsedAdapterNameRef.current = currentAdapter.name;\n const result = await currentAdapter.query(table, {\n where,\n select: \"id\"\n });\n return result.count ?? result.data.length;\n };\n $[10] = registry;\n $[11] = table;\n $[12] = where;\n $[13] = t7;\n } else {\n t7 = $[13];\n }\n const queryFn = t7;\n const t8 = enabled && adapter !== null;\n let t9;\n if ($[14] !== queryFn || $[15] !== queryKey || $[16] !== staleTime || $[17] !== t8) {\n t9 = {\n queryKey,\n queryFn,\n enabled: t8,\n staleTime\n };\n $[14] = queryFn;\n $[15] = queryKey;\n $[16] = staleTime;\n $[17] = t8;\n $[18] = t9;\n } else {\n t9 = $[18];\n }\n const query = useQuery(t9);\n let t10;\n let t11;\n if ($[19] !== query.error || $[20] !== query.isError || $[21] !== table) {\n t10 = () => {\n if (query.isError && query.error) {\n const adapterName = lastUsedAdapterNameRef.current;\n devWarn(\"useDbCount\", `${table} via ${adapterName}: Error - ${query.error.message}`);\n }\n };\n t11 = [query.isError, query.error, table];\n $[19] = query.error;\n $[20] = query.isError;\n $[21] = table;\n $[22] = t10;\n $[23] = t11;\n } else {\n t10 = $[22];\n t11 = $[23];\n }\n useEffect(t10, t11);\n let t12;\n if ($[24] !== query) {\n t12 = async () => {\n await query.refetch();\n };\n $[24] = query;\n $[25] = t12;\n } else {\n t12 = $[25];\n }\n const refetch = t12;\n const t13 = query.error as Error | null;\n let t14;\n if ($[26] !== query.data || $[27] !== query.isFetching || $[28] !== query.isLoading || $[29] !== refetch || $[30] !== t13) {\n t14 = {\n count: query.data,\n isLoading: query.isLoading,\n isFetching: query.isFetching,\n error: t13,\n refetch\n };\n $[26] = query.data;\n $[27] = query.isFetching;\n $[28] = query.isLoading;\n $[29] = refetch;\n $[30] = t13;\n $[31] = t14;\n } else {\n t14 = $[31];\n }\n return t14;\n}\nexport default useDbCount;","import { c as _c } from \"react/compiler-runtime\";\n/**\n * V3 useSyncStatus Hook\n *\n * Provides sync status information from the data layer.\n * Returns default \"always synced\" status when PowerSync is not available.\n *\n * Uses the split context architecture for optimal performance.\n */\n\nimport { useState, useEffect, useContext } from \"react\";\nimport { DataLayerStatusContext, DataLayerCoreContext } from \"../providers/DataLayerContext\";\nimport type { SyncStatus } from \"../core/types\";\n\n/**\n * Default sync status when PowerSync is not available\n */\nconst defaultSyncStatus: SyncStatus = {\n isConnected: true,\n // Supabase-only mode is always \"connected\" when online\n isSyncing: false,\n lastSyncedAt: null,\n pendingUploads: 0,\n error: null\n};\n\n/**\n * Hook to get the current sync status\n *\n * When PowerSync is not available, returns a default \"always synced\" status.\n *\n * This hook uses the split context architecture - it only subscribes to\n * status changes, not core value changes.\n *\n * @example\n * const { isSyncing, pendingUploads, isConnected } = useSyncStatus();\n *\n * if (pendingUploads > 0) {\n * console.log(`${pendingUploads} changes waiting to sync`);\n * }\n */\nexport function useSyncStatus() {\n const $ = _c(6);\n const statusContext = useContext(DataLayerStatusContext);\n const coreContext = useContext(DataLayerCoreContext);\n if (!statusContext || !coreContext) {\n throw new Error(\"useSyncStatus must be used within a DataLayerProvider. Make sure you have wrapped your app with <DataLayerProvider>.\");\n }\n const {\n syncStatus,\n status\n } = statusContext;\n const {\n powerSync\n } = coreContext;\n const [currentStatus, setCurrentStatus] = useState(syncStatus);\n let t0;\n let t1;\n if ($[0] !== powerSync || $[1] !== status.currentBackend || $[2] !== status.isOnline || $[3] !== syncStatus) {\n t0 = () => {\n if (powerSync && status.currentBackend === \"powersync\") {\n setCurrentStatus(syncStatus);\n } else {\n setCurrentStatus({\n ...defaultSyncStatus,\n isConnected: status.isOnline\n });\n }\n };\n t1 = [syncStatus, status.currentBackend, status.isOnline, powerSync];\n $[0] = powerSync;\n $[1] = status.currentBackend;\n $[2] = status.isOnline;\n $[3] = syncStatus;\n $[4] = t0;\n $[5] = t1;\n } else {\n t0 = $[4];\n t1 = $[5];\n }\n useEffect(t0, t1);\n return currentStatus;\n}\nexport default useSyncStatus;","import { c as _c } from \"react/compiler-runtime\";\n/**\n * V3 useSyncControl Hook\n *\n * Provides sync control functions from the data layer.\n * Returns no-op functions when PowerSync is not available.\n *\n * Uses the split context architecture for optimal performance.\n */\n\nimport { useMemo, useContext } from \"react\";\nimport { DataLayerCoreContext } from \"../providers/DataLayerContext\";\nimport type { SyncControl } from \"../core/types\";\n\n/**\n * Hook to get sync controls for PowerSync\n *\n * When PowerSync is not available, all methods are no-ops that log a warning.\n *\n * PERFORMANCE: This hook only subscribes to DataLayerCoreContext (stable values),\n * NOT DataLayerStatusContext. This means components using useSyncControl() will\n * NOT re-render when network status or sync status changes.\n *\n * @example\n * const { triggerSync, startLiveSync, stopLiveSync } = useSyncControl();\n *\n * // Manually trigger a sync\n * await triggerSync();\n *\n * // Start/stop live sync\n * await startLiveSync();\n * stopLiveSync();\n */\nexport function useSyncControl() {\n const $ = _c(1);\n const coreContext = useContext(DataLayerCoreContext);\n if (!coreContext) {\n throw new Error(\"useSyncControl must be used within a DataLayerProvider. Make sure you have wrapped your app with <DataLayerProvider>.\");\n }\n const {\n syncControl,\n powerSync\n } = coreContext;\n const isPowerSyncActive = powerSync !== null;\n let t0;\n if ($[0] === Symbol.for(\"react.memo_cache_sentinel\")) {\n t0 = {\n triggerSync: _temp,\n startLiveSync: _temp2,\n stopLiveSync: _temp3,\n setScope: _temp4,\n pauseAutoRetry: _temp5,\n resumeAutoRetry: _temp6,\n isAutoRetryPaused: false,\n addPendingMutation: _temp7,\n removePendingMutation: _temp8\n };\n $[0] = t0;\n } else {\n t0 = $[0];\n }\n const noOpControls = t0;\n let t1;\n bb0: {\n if (isPowerSyncActive) {\n t1 = syncControl;\n break bb0;\n }\n t1 = noOpControls;\n }\n const controls = t1;\n return controls;\n}\nfunction _temp8() {}\nfunction _temp7() {}\nfunction _temp6() {\n console.warn(\"[useSyncControl] resumeAutoRetry called but PowerSync is not available\");\n}\nfunction _temp5() {\n console.warn(\"[useSyncControl] pauseAutoRetry called but PowerSync is not available\");\n}\nasync function _temp4(_scopeName, _values) {\n console.warn(\"[useSyncControl] setScope called but PowerSync is not available\");\n}\nfunction _temp3() {\n console.warn(\"[useSyncControl] stopLiveSync called but PowerSync is not available\");\n}\nasync function _temp2() {\n console.warn(\"[useSyncControl] startLiveSync called but PowerSync is not available\");\n}\nasync function _temp() {\n console.warn(\"[useSyncControl] triggerSync called but PowerSync is not available\");\n}\nexport default useSyncControl;","import { c as _c } from \"react/compiler-runtime\";\n/**\n * V3 useOnlineStatus Hook\n *\n * Provides online/connection status information.\n * Uses DataLayerProvider's status as the SINGLE source of truth.\n *\n * On React Native: status.isOnline comes from PowerSync platform adapter (NetInfo)\n * On Web: status.isOnline comes from browser navigator.onLine\n */\n\nimport { useMemo } from \"react\";\nimport { useDataLayerCore, useDataLayerStatus } from \"./useDataLayer\";\n\n/**\n * Online status information\n */\nexport interface OnlineStatus {\n /** Whether the device has network connectivity */\n isOnline: boolean;\n /** Whether PowerSync is connected (false if using Supabase-only) */\n isConnected: boolean;\n /** Current backend being used */\n backend: \"powersync\" | \"supabase\" | null;\n}\n\n/**\n * Hook to get online/connection status\n *\n * Uses DataLayerProvider's status as the single source of truth:\n * - On React Native: isOnline comes from PowerSync platform adapter (NetInfo)\n * - On Web: isOnline comes from browser navigator.onLine\n *\n * @example\n * const { isOnline, isConnected, backend } = useOnlineStatus();\n *\n * if (!isOnline) {\n * return <OfflineBanner />;\n * }\n */\nexport function useOnlineStatus() {\n const $ = _c(4);\n const {\n powerSync\n } = useDataLayerCore();\n const {\n status\n } = useDataLayerStatus();\n const t0 = powerSync !== null && status.powerSyncStatus === \"available\";\n let t1;\n if ($[0] !== status.currentBackend || $[1] !== status.isOnline || $[2] !== t0) {\n t1 = {\n isOnline: status.isOnline,\n isConnected: t0,\n backend: status.currentBackend\n };\n $[0] = status.currentBackend;\n $[1] = status.isOnline;\n $[2] = t0;\n $[3] = t1;\n } else {\n t1 = $[3];\n }\n return t1;\n}\nexport default useOnlineStatus;"],"mappings":"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","names":["result","_c","useMutation","useQueryClient","_c","useQueryClient","t9","useMutation","_c","useMutation","useQueryClient","_c","useQueryClient","useMutation","_c","useMutation","useQueryClient","_c","useQueryClient","t9","useMutation","useMemo","useCallback","useEffect","useRef","useMemo","useRef","useCallback","useEffect","_c","useEffect","useRef","useQuery","_c","t5","useRef","useQuery","useEffect","_c","useState","useEffect","_c","useState","useEffect","_c","useContext","_c","useContext","_c","_c"]}
1
+ {"version":3,"sources":["../src/hooks/useAdvanceQuery.ts","../src/hooks/useDbInsert.ts","../src/hooks/useDbUpdate.ts","../src/hooks/useDbUpsert.ts","../src/hooks/useDbDelete.ts","../src/hooks/useDbInfiniteQuery.ts","../src/hooks/useDbCount.ts","../src/hooks/useSyncStatus.ts","../src/hooks/useSyncControl.ts","../src/hooks/useOnlineStatus.ts"],"sourcesContent":["/**\n * V3 useAdvanceQuery Hook\n *\n * Hybrid query hook that combines PowerSync (local SQLite) with edge function filtering.\n * - When NO filters active: Uses PowerSync for fast local queries that stay in sync\n * - When filters active: Uses edge function for complex filtering\n *\n * This provides the best of both worlds:\n * - Fast, reactive local queries via PowerSync\n * - Complex filtering, natural language queries, and aggregations via edge function\n *\n * @example\n * const [result, filters, setFilters] = useAdvanceQuery<Equipment[]>(\n * \"EquipmentFixtureUnit\",\n * {\n * select: \"*, EquipmentFixtureUnitControl(*)\",\n * where: { projectDatabaseId: 123 },\n * orderBy: [{ field: \"unitNumber\", direction: \"asc\" }],\n * filterKey: \"equipment-filters\",\n * }\n * );\n */\n\nimport { Dispatch, SetStateAction, useCallback, useMemo, useRef, useState, useEffect } from \"react\";\nimport { useQuery } from \"@tanstack/react-query\";\nimport { useDataLayerCore } from \"./useDataLayer\";\nimport { useDbQuery } from \"./useDbQuery\";\nimport type { TableIdentifier, ResolveRowType, UseDbQueryOptions } from \"./useDbQuery\";\nimport type { QueryOptions } from \"../core/types\";\nimport { useSessionStorageState } from \"@pol-studios/hooks/storage\";\nimport { isUsable, omit } from \"@pol-studios/utils\";\nimport { getSupabaseUrl } from \"../config\";\nimport useSupabase from \"../useSupabase\";\nimport { devLog, devWarn } from \"../utils/dev-log\";\n\n// =============================================================================\n// Types (re-exported from useDbAdvanceQuery for compatibility)\n// =============================================================================\n\nexport type FilterOperator = \"=\" | \">\" | \">=\" | \"<\" | \"<=\" | \"contains\" | \"ilike\" | \"is\" | \"in\" | \"ai_search\";\nexport interface Filter {\n id: string;\n field: string;\n op: FilterOperator;\n value: string | number | string[] | number[] | boolean | null;\n not?: boolean;\n similarity?: number;\n where?: string;\n display?: string;\n}\nexport interface FilterGroup {\n id: string;\n op: \"AND\" | \"OR\";\n filters: Array<Filter | FilterGroup>;\n not?: boolean;\n}\nexport interface Pagination {\n offset?: number;\n limit?: number;\n}\nexport interface Sort {\n field: string;\n direction: \"asc\" | \"desc\";\n}\nexport interface QueryState extends FilterGroup {\n pagination?: Pagination;\n sort?: Sort[];\n distinctOn?: string[];\n naturalLanguageQuery?: string;\n isReady: boolean;\n}\nexport interface ClarificationQuestion {\n question: string;\n suggestions: Array<{\n interpretation: string;\n field_path: string;\n example: string;\n confidence: number;\n }>;\n}\n\n// =============================================================================\n// Options and Result Types\n// =============================================================================\n\nexport interface UseAdvanceQueryOptions extends Omit<UseDbQueryOptions, \"realtime\"> {\n /** Key for persisting filter state (required for filter state persistence) */\n filterKey: string;\n /** Initial filter state */\n initialFilters?: QueryState;\n /** Timeout for edge function requests in ms (default: 15000) */\n timeout?: number;\n /** Count mode: \"exact\" | \"estimated\" | \"\" (default: \"exact\") */\n count?: \"exact\" | \"estimated\" | \"\";\n /**\n * Whether to enable real-time subscriptions\n * - PowerSync path: Uses watch() for reactive updates (default: true when PowerSync)\n * - Edge function path: Uses Supabase realtime to invalidate query on changes\n */\n realtime?: boolean;\n}\nexport interface UseAdvanceQueryResult<T> {\n data: T[] | undefined;\n isLoading: boolean;\n isPending: boolean;\n isFetching: boolean;\n isRefetching: boolean;\n isSuccess: boolean;\n isError: boolean;\n error: Error | null;\n refetch: () => Promise<void>;\n count?: number;\n clarification?: ClarificationQuestion;\n}\n\n// =============================================================================\n// Default Filter State\n// =============================================================================\n\nconst createDefaultFilterState = (): QueryState => ({\n id: \"root\",\n op: \"AND\",\n filters: [],\n pagination: undefined,\n sort: [],\n isReady: true\n});\n\n// =============================================================================\n// Hook Implementation\n// =============================================================================\n\n/**\n * Hybrid advance query hook\n *\n * Uses PowerSync (local SQLite) when no filters are active for fast, reactive queries.\n * Falls back to edge function when filters are active for complex filtering.\n */\nexport function useAdvanceQuery<T extends TableIdentifier>(table: T, options: UseAdvanceQueryOptions): [UseAdvanceQueryResult<ResolveRowType<T>>, QueryState, Dispatch<SetStateAction<QueryState>>];\nexport function useAdvanceQuery<T>(table: string, options: UseAdvanceQueryOptions): [UseAdvanceQueryResult<T>, QueryState, Dispatch<SetStateAction<QueryState>>];\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function useAdvanceQuery<T = any>(table: TableIdentifier | string, options: UseAdvanceQueryOptions): [UseAdvanceQueryResult<T>, QueryState, Dispatch<SetStateAction<QueryState>>] {\n const tableName = typeof table === \"string\" ? table : `${(table as {\n schema: string;\n table: string;\n }).schema}.${(table as {\n schema: string;\n table: string;\n }).table}`;\n const {\n registry,\n queryClient,\n powerSync\n } = useDataLayerCore();\n const supabase = useSupabase();\n const {\n filterKey,\n initialFilters,\n enabled = true,\n timeout = 15000,\n count = \"exact\",\n realtime,\n select,\n where,\n orderBy,\n limit,\n offset,\n ...restOptions\n } = options;\n\n // Determine if realtime should be enabled\n // Default: true for PowerSync path, false for edge function path\n const isPowerSync = powerSync !== null;\n const realtimeEnabled = realtime ?? isPowerSync;\n\n // ==========================================================================\n // Filter State Management\n // ==========================================================================\n\n const defaultFilterState = useMemo(() => initialFilters ?? createDefaultFilterState(),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [] // Only compute once\n );\n const [filtersRaw, setFiltersRaw] = useSessionStorageState<QueryState>(filterKey, defaultFilterState);\n const filters = filtersRaw ?? defaultFilterState;\n\n // Type-safe setFilters wrapper\n const setFilters: Dispatch<SetStateAction<QueryState>> = useCallback(action => {\n if (typeof action === \"function\") {\n setFiltersRaw(prev => action(prev ?? defaultFilterState));\n } else {\n setFiltersRaw(action);\n }\n }, [setFiltersRaw, defaultFilterState]);\n\n // ==========================================================================\n // Determine Query Strategy\n // ==========================================================================\n\n const hasAdvancedFilters = useMemo(() => (filters?.filters?.length ?? 0) > 0 || !!filters?.naturalLanguageQuery, [filters?.filters?.length, filters?.naturalLanguageQuery]);\n\n // Use direct DB query (via useDbQuery) when: no advanced filters\n // useDbQuery handles adapter selection (PowerSync vs Supabase) based on sync status\n // This ensures queries use Supabase during initial sync when PowerSync hasn't synced yet\n const usePowerSyncPath = !hasAdvancedFilters;\n\n // ==========================================================================\n // PowerSync Query (no filters path)\n // ==========================================================================\n\n // Convert orderBy from Sort[] to QueryOptions orderBy format\n const powerSyncOrderBy = useMemo(() => {\n if (filters?.sort && filters.sort.length > 0) {\n return filters.sort.map(s => ({\n field: s.field,\n direction: s.direction\n }));\n }\n return orderBy;\n }, [filters?.sort, orderBy]);\n const powerSyncResult = useDbQuery<T>(table as string, {\n select,\n where,\n orderBy: powerSyncOrderBy,\n limit: filters?.pagination?.limit ?? limit,\n offset: filters?.pagination?.offset ?? offset,\n enabled: enabled && usePowerSyncPath && filters?.isReady !== false,\n realtime: realtimeEnabled // Enable watch() subscriptions for reactive updates\n });\n\n // ==========================================================================\n // Edge Function Query (with filters path)\n // ==========================================================================\n\n const [extraData, setExtraData] = useState<{\n count?: number;\n key?: string;\n }>({});\n const edgeFunctionQueryKey = useMemo(() => [\"v3\", \"advance-query\", tableName, select, JSON.stringify(where), JSON.stringify(filters)], [tableName, select, where, filters]);\n const edgeFunctionResult = useQuery<{\n data: T[];\n count?: number;\n clarification?: ClarificationQuestion;\n }>({\n queryKey: edgeFunctionQueryKey,\n queryFn: async ({\n signal\n }) => {\n const {\n data: {\n session\n }\n } = await supabase.auth.getSession();\n if (!session?.access_token) {\n throw new Error(\"No active session\");\n }\n const controller = new AbortController();\n signal.addEventListener(\"abort\", () => controller.abort());\n const timeoutId = setTimeout(() => controller.abort(), timeout);\n try {\n // Build filter body\n const filterBody = {\n id: filters.id || \"root\",\n op: filters.op || \"AND\",\n not: filters.not,\n filters: filters.filters || []\n };\n\n // Parse base where conditions into filters\n const baseFilters: Filter[] = [];\n if (where) {\n Object.entries(where).forEach(([field, value]) => {\n if (value !== undefined && value !== null) {\n if (typeof value === \"object\" && \"in\" in value) {\n // Handle { in: [...] } syntax\n baseFilters.push({\n id: `base-${field}`,\n field,\n op: \"in\",\n value: (value as {\n in: unknown[];\n }).in as string[] | number[]\n });\n } else {\n baseFilters.push({\n id: `base-${field}`,\n field,\n op: \"=\",\n value: value as string | number | boolean | null\n });\n }\n }\n });\n }\n\n // Combine base filters with user filters\n const combinedFilters = [...baseFilters, ...filterBody.filters];\n const currentKey = `${tableName}${select}${JSON.stringify(omit(filters, [\"pagination\", \"isReady\"]))}`;\n const res = await fetch(`${getSupabaseUrl()}/functions/v1/query?forceDenoVersion=2`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${session.access_token}`\n },\n body: JSON.stringify({\n table: tableName,\n schema: \"public\",\n select: select ?? \"*\",\n filters: {\n id: filterBody.id,\n op: filterBody.op,\n not: filterBody.not,\n filters: combinedFilters\n },\n pagination: filters.pagination,\n sort: filters.sort || orderBy?.map(o => ({\n field: o.field,\n direction: o.direction\n })),\n distinctOn: filters.distinctOn,\n naturalLanguageQuery: filters.naturalLanguageQuery,\n count: currentKey === extraData.key ? \"\" : count\n }),\n signal: controller.signal\n });\n if (!res.ok) {\n const errorData = await res.json();\n const errorMessage = typeof errorData?.error === \"string\" ? errorData.error : errorData?.error?.message || errorData?.message || \"Query failed\";\n throw new Error(errorMessage);\n }\n const result = await res.json();\n\n // Handle clarification response\n if (result.clarification) {\n return {\n data: [] as T[],\n count: 0,\n clarification: result.clarification\n };\n }\n setExtraData(prev => ({\n count: prev.key === currentKey ? prev.count : result.count,\n key: currentKey\n }));\n return {\n data: result.data as T[],\n count: result.count\n };\n } finally {\n clearTimeout(timeoutId);\n }\n },\n enabled: enabled && !usePowerSyncPath && filters?.isReady !== false,\n staleTime: 30000,\n gcTime: 300000,\n refetchOnMount: true,\n refetchOnWindowFocus: false\n });\n\n // ==========================================================================\n // Supabase Realtime Subscription (edge function path only)\n // ==========================================================================\n\n // When realtime is enabled and using edge function path,\n // subscribe to Supabase realtime to invalidate query on changes\n useEffect(() => {\n // Only set up realtime for edge function path when realtime is enabled\n if (!realtimeEnabled || usePowerSyncPath || !enabled) {\n return;\n }\n\n // Build filter for the subscription based on where clause\n const channel = supabase.channel(`advance-query-${tableName}-${filterKey}`).on(\"postgres_changes\", {\n event: \"*\",\n // Listen to INSERT, UPDATE, DELETE\n schema: \"public\",\n table: tableName\n // Note: We can't easily filter by complex where clauses,\n // so we invalidate on any change to the table\n }, () => {\n // Invalidate the query to trigger a refetch\n queryClient.invalidateQueries({\n queryKey: edgeFunctionQueryKey\n });\n }).subscribe();\n return () => {\n supabase.removeChannel(channel);\n };\n }, [realtimeEnabled, usePowerSyncPath, enabled, supabase, tableName, filterKey, queryClient, edgeFunctionQueryKey]);\n\n // ==========================================================================\n // Dev Logging (edge function path only - PowerSync path logs via useDbQuery)\n // ==========================================================================\n\n useEffect(() => {\n // Only log for edge function path\n if (usePowerSyncPath) return;\n const pathName = \"EdgeFunction\";\n\n // Log errors\n if (edgeFunctionResult.isError && edgeFunctionResult.error) {\n devWarn(\"useAdvanceQuery\", `${tableName} via ${pathName}: Error - ${edgeFunctionResult.error.message}`);\n }\n\n // Log empty results (only after successful fetch)\n if (edgeFunctionResult.isSuccess && edgeFunctionResult.data?.data?.length === 0) {\n devLog(\"useAdvanceQuery\", `${tableName} via ${pathName}: 0 results`);\n }\n }, [usePowerSyncPath, edgeFunctionResult.isError, edgeFunctionResult.error, edgeFunctionResult.isSuccess, edgeFunctionResult.data, tableName]);\n\n // ==========================================================================\n // Combine Results\n // ==========================================================================\n\n const result = useMemo((): UseAdvanceQueryResult<T> => {\n if (usePowerSyncPath) {\n // PowerSync path\n return {\n data: powerSyncResult.data as T[] | undefined,\n isLoading: powerSyncResult.isLoading,\n isPending: powerSyncResult.isPending,\n isFetching: powerSyncResult.isFetching,\n isRefetching: powerSyncResult.isRefetching,\n isSuccess: powerSyncResult.isSuccess,\n isError: powerSyncResult.isError,\n error: powerSyncResult.error,\n refetch: powerSyncResult.refetch,\n count: powerSyncResult.count ?? powerSyncResult.data?.length\n };\n }\n\n // Edge function path\n return {\n data: edgeFunctionResult.data?.data,\n isLoading: edgeFunctionResult.isLoading,\n isPending: edgeFunctionResult.isPending,\n isFetching: edgeFunctionResult.isFetching,\n isRefetching: edgeFunctionResult.isFetching,\n isSuccess: edgeFunctionResult.isSuccess,\n isError: edgeFunctionResult.isError,\n error: edgeFunctionResult.error as Error | null,\n refetch: async () => {\n await edgeFunctionResult.refetch();\n },\n count: edgeFunctionResult.data?.count ?? extraData.count,\n clarification: edgeFunctionResult.data?.clarification\n };\n }, [usePowerSyncPath, powerSyncResult, edgeFunctionResult, extraData.count]);\n return [result, filters, setFilters];\n}\nexport default useAdvanceQuery;","import { c as _c } from \"react/compiler-runtime\";\n/**\n * V3 useDbInsert Hook\n *\n * React hook for inserting records into a table using the V3 adapter pattern.\n * Integrates with React Query for mutation management and cache invalidation.\n */\n\nimport { useCallback } from \"react\";\nimport { useMutation, useQueryClient } from \"@tanstack/react-query\";\nimport { useDataLayerCore } from \"./useDataLayer\";\nimport { devLog } from \"../utils/dev-log\";\n\n/**\n * Options for useDbInsert hook\n */\nexport interface UseDbInsertOptions<T> {\n /** Callback when insert succeeds */\n onSuccess?: (data: T) => void;\n /** Callback when insert fails */\n onError?: (error: Error) => void;\n /** Tables to invalidate after successful insert */\n invalidateTables?: string[];\n}\n\n/**\n * Result from useDbInsert hook\n */\nexport interface UseDbInsertResult<T> {\n /** Trigger insert (fire and forget) */\n mutate: (data: Partial<T>) => void;\n /** Trigger insert and await result */\n mutateAsync: (data: Partial<T>) => Promise<T>;\n /** Whether mutation is in progress */\n isPending: boolean;\n /** Mutation error if any */\n error: Error | null;\n /** Reset mutation state */\n reset: () => void;\n /** Last successful data */\n data: T | undefined;\n}\n\n/**\n * Hook for inserting records into a table\n *\n * Uses the V3 adapter pattern to route inserts to the appropriate backend\n * (PowerSync, Supabase, or Cached) based on table configuration.\n *\n * @param table - The table name to insert into\n * @param options - Optional configuration for callbacks and cache invalidation\n * @returns Mutation result with mutate/mutateAsync functions\n *\n * @example\n * ```typescript\n * const { mutateAsync, isPending } = useDbInsert<Task>(\"Task\");\n * const newTask = await mutateAsync({ title: \"New Task\", status: \"pending\" });\n * ```\n *\n * @example\n * ```typescript\n * // With options\n * const { mutate } = useDbInsert<Project>(\"Project\", {\n * onSuccess: (data) => console.log(\"Created:\", data),\n * onError: (error) => console.error(\"Failed:\", error),\n * invalidateTables: [\"Project\", \"ProjectSummary\"],\n * });\n * ```\n */\nexport function useDbInsert(table, t0) {\n const $ = _c(25);\n let t1;\n if ($[0] !== t0) {\n t1 = t0 === undefined ? {} : t0;\n $[0] = t0;\n $[1] = t1;\n } else {\n t1 = $[1];\n }\n const options = t1;\n const {\n registry\n } = useDataLayerCore();\n const queryClient = useQueryClient();\n const {\n onSuccess,\n onError,\n invalidateTables: t2\n } = options;\n let t3;\n if ($[2] !== t2 || $[3] !== table) {\n t3 = t2 === undefined ? [table] : t2;\n $[2] = t2;\n $[3] = table;\n $[4] = t3;\n } else {\n t3 = $[4];\n }\n const invalidateTables = t3;\n let t4;\n if ($[5] !== registry || $[6] !== table) {\n t4 = async data => {\n const adapter = registry.getAdapter(table, \"write\");\n devLog(\"useDbInsert\", `${table} via ${adapter.name}`);\n return await adapter.insert(table, data);\n };\n $[5] = registry;\n $[6] = table;\n $[7] = t4;\n } else {\n t4 = $[7];\n }\n const mutationFn = t4;\n let t5;\n if ($[8] !== invalidateTables || $[9] !== onSuccess || $[10] !== queryClient) {\n t5 = data_0 => {\n invalidateTables.forEach(t => {\n queryClient.invalidateQueries({\n predicate: query => query.queryKey[0] === \"v3\" && query.queryKey[2] === t\n });\n });\n onSuccess?.(data_0);\n };\n $[8] = invalidateTables;\n $[9] = onSuccess;\n $[10] = queryClient;\n $[11] = t5;\n } else {\n t5 = $[11];\n }\n let t6;\n if ($[12] !== onError) {\n t6 = error => {\n onError?.(error instanceof Error ? error : new Error(String(error)));\n };\n $[12] = onError;\n $[13] = t6;\n } else {\n t6 = $[13];\n }\n let t7;\n if ($[14] !== mutationFn || $[15] !== t5 || $[16] !== t6) {\n t7 = {\n mutationFn,\n onSuccess: t5,\n onError: t6\n };\n $[14] = mutationFn;\n $[15] = t5;\n $[16] = t6;\n $[17] = t7;\n } else {\n t7 = $[17];\n }\n const mutation = useMutation(t7);\n const t8 = mutation.error as Error | null;\n let t9;\n if ($[18] !== mutation.data || $[19] !== mutation.isPending || $[20] !== mutation.mutate || $[21] !== mutation.mutateAsync || $[22] !== mutation.reset || $[23] !== t8) {\n t9 = {\n mutate: mutation.mutate,\n mutateAsync: mutation.mutateAsync,\n isPending: mutation.isPending,\n error: t8,\n reset: mutation.reset,\n data: mutation.data\n };\n $[18] = mutation.data;\n $[19] = mutation.isPending;\n $[20] = mutation.mutate;\n $[21] = mutation.mutateAsync;\n $[22] = mutation.reset;\n $[23] = t8;\n $[24] = t9;\n } else {\n t9 = $[24];\n }\n return t9;\n}\nexport default useDbInsert;","import { c as _c } from \"react/compiler-runtime\";\n/**\n * V3 useDbUpdate Hook\n *\n * React hook for updating records in a table using the V3 adapter pattern.\n * Integrates with React Query for mutation management, cache invalidation,\n * and optional optimistic updates.\n */\n\nimport { useCallback } from \"react\";\nimport { useMutation, useQueryClient } from \"@tanstack/react-query\";\nimport { useDataLayerCore } from \"./useDataLayer\";\nimport { devLog } from \"../utils/dev-log\";\n\n/**\n * Options for useDbUpdate hook\n */\nexport interface UseDbUpdateOptions<T> {\n /** Callback when update succeeds */\n onSuccess?: (data: T) => void;\n /** Callback when update fails */\n onError?: (error: Error) => void;\n /** Tables to invalidate after successful update */\n invalidateTables?: string[];\n /** Enable optimistic updates */\n optimistic?: boolean;\n}\n\n/**\n * Result from useDbUpdate hook\n */\nexport interface UseDbUpdateResult<T> {\n /** Trigger update (fire and forget) */\n mutate: (params: {\n id: string;\n data: Partial<T>;\n }) => void;\n /** Trigger update and await result */\n mutateAsync: (params: {\n id: string;\n data: Partial<T>;\n }) => Promise<T>;\n /** Whether mutation is in progress */\n isPending: boolean;\n /** Mutation error if any */\n error: Error | null;\n /** Reset mutation state */\n reset: () => void;\n /** Last successful data */\n data: T | undefined;\n}\n\n/**\n * Hook for updating records in a table\n *\n * Uses the V3 adapter pattern to route updates to the appropriate backend\n * (PowerSync, Supabase, or Cached) based on table configuration.\n *\n * @param table - The table name to update records in\n * @param options - Optional configuration for callbacks, cache invalidation, and optimistic updates\n * @returns Mutation result with mutate/mutateAsync functions\n *\n * @example\n * ```typescript\n * const { mutateAsync, isPending } = useDbUpdate<Task>(\"Task\");\n * const updated = await mutateAsync({ id: taskId, data: { status: \"completed\" } });\n * ```\n *\n * @example\n * ```typescript\n * // With optimistic updates\n * const { mutate } = useDbUpdate<Project>(\"Project\", {\n * optimistic: true,\n * onSuccess: (data) => console.log(\"Updated:\", data),\n * onError: (error) => console.error(\"Failed:\", error),\n * });\n * ```\n */\nexport function useDbUpdate(table, t0) {\n const $ = _c(32);\n let t1;\n if ($[0] !== t0) {\n t1 = t0 === undefined ? {} : t0;\n $[0] = t0;\n $[1] = t1;\n } else {\n t1 = $[1];\n }\n const options = t1;\n const {\n registry\n } = useDataLayerCore();\n const queryClient = useQueryClient();\n const {\n onSuccess,\n onError,\n invalidateTables: t2,\n optimistic: t3\n } = options;\n let t4;\n if ($[2] !== t2 || $[3] !== table) {\n t4 = t2 === undefined ? [table] : t2;\n $[2] = t2;\n $[3] = table;\n $[4] = t4;\n } else {\n t4 = $[4];\n }\n const invalidateTables = t4;\n const optimistic = t3 === undefined ? false : t3;\n let t5;\n if ($[5] !== registry || $[6] !== table) {\n t5 = async params => {\n const adapter = registry.getAdapter(table, \"write\");\n devLog(\"useDbUpdate\", `${table} via ${adapter.name}`);\n return await adapter.update(table, params.id, params.data);\n };\n $[5] = registry;\n $[6] = table;\n $[7] = t5;\n } else {\n t5 = $[7];\n }\n const mutationFn = t5;\n let t6;\n if ($[8] !== optimistic || $[9] !== queryClient || $[10] !== table) {\n t6 = optimistic ? async () => {\n await queryClient.cancelQueries({\n predicate: query => query.queryKey[0] === \"v3\" && query.queryKey[2] === table\n });\n const previousData = queryClient.getQueriesData({\n predicate: query_0 => query_0.queryKey[0] === \"v3\" && query_0.queryKey[2] === table\n });\n return {\n previousData\n };\n } : undefined;\n $[8] = optimistic;\n $[9] = queryClient;\n $[10] = table;\n $[11] = t6;\n } else {\n t6 = $[11];\n }\n let t7;\n if ($[12] !== invalidateTables || $[13] !== onSuccess || $[14] !== queryClient) {\n t7 = data => {\n invalidateTables.forEach(t => {\n queryClient.invalidateQueries({\n predicate: query_1 => query_1.queryKey[0] === \"v3\" && query_1.queryKey[2] === t\n });\n });\n onSuccess?.(data);\n };\n $[12] = invalidateTables;\n $[13] = onSuccess;\n $[14] = queryClient;\n $[15] = t7;\n } else {\n t7 = $[15];\n }\n let t8;\n if ($[16] !== onError || $[17] !== optimistic || $[18] !== queryClient) {\n t8 = (error, _variables, context) => {\n if (optimistic && context?.previousData) {\n context.previousData.forEach(t9 => {\n const [queryKey, data_0] = t9;\n queryClient.setQueryData(queryKey, data_0);\n });\n }\n onError?.(error instanceof Error ? error : new Error(String(error)));\n };\n $[16] = onError;\n $[17] = optimistic;\n $[18] = queryClient;\n $[19] = t8;\n } else {\n t8 = $[19];\n }\n let t9;\n if ($[20] !== mutationFn || $[21] !== t6 || $[22] !== t7 || $[23] !== t8) {\n t9 = {\n mutationFn,\n onMutate: t6,\n onSuccess: t7,\n onError: t8\n };\n $[20] = mutationFn;\n $[21] = t6;\n $[22] = t7;\n $[23] = t8;\n $[24] = t9;\n } else {\n t9 = $[24];\n }\n const mutation = useMutation(t9);\n const t10 = mutation.error as Error | null;\n let t11;\n if ($[25] !== mutation.data || $[26] !== mutation.isPending || $[27] !== mutation.mutate || $[28] !== mutation.mutateAsync || $[29] !== mutation.reset || $[30] !== t10) {\n t11 = {\n mutate: mutation.mutate,\n mutateAsync: mutation.mutateAsync,\n isPending: mutation.isPending,\n error: t10,\n reset: mutation.reset,\n data: mutation.data\n };\n $[25] = mutation.data;\n $[26] = mutation.isPending;\n $[27] = mutation.mutate;\n $[28] = mutation.mutateAsync;\n $[29] = mutation.reset;\n $[30] = t10;\n $[31] = t11;\n } else {\n t11 = $[31];\n }\n return t11;\n}\nexport default useDbUpdate;","import { c as _c } from \"react/compiler-runtime\";\n/**\n * V3 useDbUpsert Hook\n *\n * React hook for upserting (insert or update) records in a table using the V3 adapter pattern.\n * Integrates with React Query for mutation management and cache invalidation.\n */\n\nimport { useCallback } from \"react\";\nimport { useMutation, useQueryClient } from \"@tanstack/react-query\";\nimport { useDataLayerCore } from \"./useDataLayer\";\nimport { devLog } from \"../utils/dev-log\";\n\n/**\n * Options for useDbUpsert hook\n */\nexport interface UseDbUpsertOptions<T> {\n /** Callback when upsert succeeds */\n onSuccess?: (data: T) => void;\n /** Callback when upsert fails */\n onError?: (error: Error) => void;\n /** Tables to invalidate after successful upsert */\n invalidateTables?: string[];\n}\n\n/**\n * Result from useDbUpsert hook\n */\nexport interface UseDbUpsertResult<T> {\n /** Trigger upsert (fire and forget) */\n mutate: (data: Partial<T>) => void;\n /** Trigger upsert and await result */\n mutateAsync: (data: Partial<T>) => Promise<T>;\n /** Whether mutation is in progress */\n isPending: boolean;\n /** Mutation error if any */\n error: Error | null;\n /** Reset mutation state */\n reset: () => void;\n /** Last successful data */\n data: T | undefined;\n}\n\n/**\n * Hook for upserting (insert or update) records in a table\n *\n * Uses the V3 adapter pattern to route upserts to the appropriate backend\n * (PowerSync, Supabase, or Cached) based on table configuration.\n *\n * If the record has an ID and exists, it will be updated.\n * Otherwise, a new record will be inserted.\n *\n * @param table - The table name to upsert into\n * @param options - Optional configuration for callbacks and cache invalidation\n * @returns Mutation result with mutate/mutateAsync functions\n *\n * @example\n * ```typescript\n * const { mutateAsync, isPending } = useDbUpsert<Task>(\"Task\");\n * const task = await mutateAsync({ id: existingId, title: \"Updated Title\" });\n * ```\n *\n * @example\n * ```typescript\n * // Insert if no ID, update if ID exists\n * const { mutate } = useDbUpsert<Setting>(\"Setting\", {\n * onSuccess: (data) => console.log(\"Upserted:\", data),\n * invalidateTables: [\"Setting\", \"UserPreferences\"],\n * });\n *\n * // This will insert (no id)\n * mutate({ key: \"theme\", value: \"dark\" });\n *\n * // This will update (has id)\n * mutate({ id: \"setting-123\", key: \"theme\", value: \"light\" });\n * ```\n */\nexport function useDbUpsert(table, t0) {\n const $ = _c(25);\n let t1;\n if ($[0] !== t0) {\n t1 = t0 === undefined ? {} : t0;\n $[0] = t0;\n $[1] = t1;\n } else {\n t1 = $[1];\n }\n const options = t1;\n const {\n registry\n } = useDataLayerCore();\n const queryClient = useQueryClient();\n const {\n onSuccess,\n onError,\n invalidateTables: t2\n } = options;\n let t3;\n if ($[2] !== t2 || $[3] !== table) {\n t3 = t2 === undefined ? [table] : t2;\n $[2] = t2;\n $[3] = table;\n $[4] = t3;\n } else {\n t3 = $[4];\n }\n const invalidateTables = t3;\n let t4;\n if ($[5] !== registry || $[6] !== table) {\n t4 = async data => {\n const adapter = registry.getAdapter(table, \"write\");\n devLog(\"useDbUpsert\", `${table} via ${adapter.name}`);\n return await adapter.upsert(table, data);\n };\n $[5] = registry;\n $[6] = table;\n $[7] = t4;\n } else {\n t4 = $[7];\n }\n const mutationFn = t4;\n let t5;\n if ($[8] !== invalidateTables || $[9] !== onSuccess || $[10] !== queryClient) {\n t5 = data_0 => {\n invalidateTables.forEach(t => {\n queryClient.invalidateQueries({\n predicate: query => query.queryKey[0] === \"v3\" && query.queryKey[2] === t\n });\n });\n onSuccess?.(data_0);\n };\n $[8] = invalidateTables;\n $[9] = onSuccess;\n $[10] = queryClient;\n $[11] = t5;\n } else {\n t5 = $[11];\n }\n let t6;\n if ($[12] !== onError) {\n t6 = error => {\n onError?.(error instanceof Error ? error : new Error(String(error)));\n };\n $[12] = onError;\n $[13] = t6;\n } else {\n t6 = $[13];\n }\n let t7;\n if ($[14] !== mutationFn || $[15] !== t5 || $[16] !== t6) {\n t7 = {\n mutationFn,\n onSuccess: t5,\n onError: t6\n };\n $[14] = mutationFn;\n $[15] = t5;\n $[16] = t6;\n $[17] = t7;\n } else {\n t7 = $[17];\n }\n const mutation = useMutation(t7);\n const t8 = mutation.error as Error | null;\n let t9;\n if ($[18] !== mutation.data || $[19] !== mutation.isPending || $[20] !== mutation.mutate || $[21] !== mutation.mutateAsync || $[22] !== mutation.reset || $[23] !== t8) {\n t9 = {\n mutate: mutation.mutate,\n mutateAsync: mutation.mutateAsync,\n isPending: mutation.isPending,\n error: t8,\n reset: mutation.reset,\n data: mutation.data\n };\n $[18] = mutation.data;\n $[19] = mutation.isPending;\n $[20] = mutation.mutate;\n $[21] = mutation.mutateAsync;\n $[22] = mutation.reset;\n $[23] = t8;\n $[24] = t9;\n } else {\n t9 = $[24];\n }\n return t9;\n}\nexport default useDbUpsert;","import { c as _c } from \"react/compiler-runtime\";\n/**\n * V3 useDbDelete Hook\n *\n * React hook for deleting records from a table using the V3 adapter pattern.\n * Integrates with React Query for mutation management, cache invalidation,\n * and optional optimistic deletes.\n */\n\nimport { useCallback } from \"react\";\nimport { useMutation, useQueryClient } from \"@tanstack/react-query\";\nimport { useDataLayerCore } from \"./useDataLayer\";\nimport { devLog } from \"../utils/dev-log\";\n\n/**\n * Options for useDbDelete hook\n */\nexport interface UseDbDeleteOptions {\n /** Callback when delete succeeds */\n onSuccess?: () => void;\n /** Callback when delete fails */\n onError?: (error: Error) => void;\n /** Tables to invalidate after successful delete */\n invalidateTables?: string[];\n /** Enable optimistic delete */\n optimistic?: boolean;\n}\n\n/**\n * Result from useDbDelete hook\n */\nexport interface UseDbDeleteResult {\n /** Trigger delete (fire and forget) */\n mutate: (id: string) => void;\n /** Trigger delete and await completion */\n mutateAsync: (id: string) => Promise<void>;\n /** Whether mutation is in progress */\n isPending: boolean;\n /** Mutation error if any */\n error: Error | null;\n /** Reset mutation state */\n reset: () => void;\n}\n\n/**\n * Hook for deleting records from a table\n *\n * Uses the V3 adapter pattern to route deletes to the appropriate backend\n * (PowerSync, Supabase, or Cached) based on table configuration.\n *\n * @param table - The table name to delete from\n * @param options - Optional configuration for callbacks, cache invalidation, and optimistic deletes\n * @returns Mutation result with mutate/mutateAsync functions\n *\n * @example\n * ```typescript\n * const { mutateAsync, isPending } = useDbDelete(\"Task\");\n * await mutateAsync(taskId);\n * ```\n *\n * @example\n * ```typescript\n * // With optimistic delete for instant UI feedback\n * const { mutate } = useDbDelete(\"Comment\", {\n * optimistic: true,\n * onSuccess: () => console.log(\"Deleted successfully\"),\n * onError: (error) => console.error(\"Delete failed:\", error),\n * invalidateTables: [\"Comment\", \"Post\"],\n * });\n *\n * // Immediately removes from UI, rolls back on failure\n * mutate(commentId);\n * ```\n */\nexport function useDbDelete(table, t0) {\n const $ = _c(31);\n let t1;\n if ($[0] !== t0) {\n t1 = t0 === undefined ? {} : t0;\n $[0] = t0;\n $[1] = t1;\n } else {\n t1 = $[1];\n }\n const options = t1;\n const {\n registry\n } = useDataLayerCore();\n const queryClient = useQueryClient();\n const {\n onSuccess,\n onError,\n invalidateTables: t2,\n optimistic: t3\n } = options;\n let t4;\n if ($[2] !== t2 || $[3] !== table) {\n t4 = t2 === undefined ? [table] : t2;\n $[2] = t2;\n $[3] = table;\n $[4] = t4;\n } else {\n t4 = $[4];\n }\n const invalidateTables = t4;\n const optimistic = t3 === undefined ? false : t3;\n let t5;\n if ($[5] !== registry || $[6] !== table) {\n t5 = async id => {\n const adapter = registry.getAdapter(table, \"write\");\n devLog(\"useDbDelete\", `${table} via ${adapter.name}`);\n await adapter.delete(table, id);\n };\n $[5] = registry;\n $[6] = table;\n $[7] = t5;\n } else {\n t5 = $[7];\n }\n const mutationFn = t5;\n let t6;\n if ($[8] !== optimistic || $[9] !== queryClient || $[10] !== table) {\n t6 = optimistic ? async id_0 => {\n await queryClient.cancelQueries({\n predicate: query => query.queryKey[0] === \"v3\" && query.queryKey[2] === table\n });\n const previousData = queryClient.getQueriesData({\n predicate: query_0 => query_0.queryKey[0] === \"v3\" && query_0.queryKey[2] === table\n });\n queryClient.setQueriesData({\n predicate: query_1 => query_1.queryKey[0] === \"v3\" && query_1.queryKey[2] === table\n }, old => {\n if (!old?.data) {\n return old;\n }\n return {\n ...old,\n data: old.data.filter(item => item.id !== id_0)\n };\n });\n return {\n previousData\n };\n } : undefined;\n $[8] = optimistic;\n $[9] = queryClient;\n $[10] = table;\n $[11] = t6;\n } else {\n t6 = $[11];\n }\n let t7;\n if ($[12] !== invalidateTables || $[13] !== onSuccess || $[14] !== queryClient) {\n t7 = () => {\n invalidateTables.forEach(t => {\n queryClient.invalidateQueries({\n predicate: query_2 => query_2.queryKey[0] === \"v3\" && query_2.queryKey[2] === t\n });\n });\n onSuccess?.();\n };\n $[12] = invalidateTables;\n $[13] = onSuccess;\n $[14] = queryClient;\n $[15] = t7;\n } else {\n t7 = $[15];\n }\n let t8;\n if ($[16] !== onError || $[17] !== optimistic || $[18] !== queryClient) {\n t8 = (error, _id, context) => {\n if (optimistic && context?.previousData) {\n context.previousData.forEach(t9 => {\n const [queryKey, data] = t9;\n queryClient.setQueryData(queryKey, data);\n });\n }\n onError?.(error instanceof Error ? error : new Error(String(error)));\n };\n $[16] = onError;\n $[17] = optimistic;\n $[18] = queryClient;\n $[19] = t8;\n } else {\n t8 = $[19];\n }\n let t9;\n if ($[20] !== mutationFn || $[21] !== t6 || $[22] !== t7 || $[23] !== t8) {\n t9 = {\n mutationFn,\n onMutate: t6,\n onSuccess: t7,\n onError: t8\n };\n $[20] = mutationFn;\n $[21] = t6;\n $[22] = t7;\n $[23] = t8;\n $[24] = t9;\n } else {\n t9 = $[24];\n }\n const mutation = useMutation(t9);\n const t10 = mutation.error as Error | null;\n let t11;\n if ($[25] !== mutation.isPending || $[26] !== mutation.mutate || $[27] !== mutation.mutateAsync || $[28] !== mutation.reset || $[29] !== t10) {\n t11 = {\n mutate: mutation.mutate,\n mutateAsync: mutation.mutateAsync,\n isPending: mutation.isPending,\n error: t10,\n reset: mutation.reset\n };\n $[25] = mutation.isPending;\n $[26] = mutation.mutate;\n $[27] = mutation.mutateAsync;\n $[28] = mutation.reset;\n $[29] = t10;\n $[30] = t11;\n } else {\n t11 = $[30];\n }\n return t11;\n}\nexport default useDbDelete;","/**\n * V3 useDbInfiniteQuery Hook\n *\n * React hook for querying records with infinite scroll pagination.\n * Works identically whether PowerSync or Supabase is the backend.\n * Uses React Query's useInfiniteQuery for state management and caching.\n *\n * Types are automatically inferred from table names when you augment\n * the DatabaseTypes interface with your app's Database type.\n *\n * @example\n * // In your app's types/db.d.ts:\n * declare module \"@pol-studios/db\" {\n * interface DatabaseTypes {\n * database: import(\"@/database.types\").Database;\n * }\n * }\n *\n * // Then usage auto-infers types:\n * const { data, fetchNextPage, hasNextPage } = useDbInfiniteQuery(\"EquipmentFixtureUnit\", {\n * pageSize: 20,\n * orderBy: [{ field: \"createdAt\", direction: \"desc\" }],\n * });\n */\n\nimport { useMemo, useCallback, useEffect, useRef } from \"react\";\nimport { useInfiniteQuery, InfiniteData } from \"@tanstack/react-query\";\nimport { useDataLayerCore } from \"./useDataLayer\";\nimport type { QueryOptions, WhereClause } from \"../core/types\";\nimport { devLog, devWarn } from \"../utils/dev-log\";\n\n// =============================================================================\n// Module Augmentation Interface\n// =============================================================================\n\n/**\n * Augment this interface in your app to enable automatic type inference.\n */\n// eslint-disable-next-line @typescript-eslint/no-empty-interface\nexport interface DatabaseTypes {}\n\n// =============================================================================\n// Database Type Helpers\n// =============================================================================\n\n/**\n * The configured Database type, or a generic fallback\n */\ntype ConfiguredDatabase = DatabaseTypes extends {\n database: infer DB;\n} ? DB : GenericSchema;\n\n/**\n * Generic schema structure for fallback\n */\ntype GenericSchema = {\n public: {\n Tables: Record<string, {\n Row: Record<string, unknown>;\n }>;\n Views: Record<string, {\n Row: Record<string, unknown>;\n }>;\n };\n [schema: string]: {\n Tables: Record<string, {\n Row: Record<string, unknown>;\n }>;\n Views?: Record<string, {\n Row: Record<string, unknown>;\n }>;\n };\n};\n\n/**\n * Default schema from Database (usually \"public\")\n */\ntype DefaultSchema = ConfiguredDatabase extends {\n public: infer S;\n} ? S : never;\n\n/**\n * Extract all valid table names from the default schema\n */\nexport type PublicTableNames = DefaultSchema extends {\n Tables: infer T;\n} ? keyof T & string : string;\n\n/**\n * Extract all valid schema names\n */\nexport type SchemaNames = keyof ConfiguredDatabase & string;\n\n/**\n * Extract table names for a specific schema\n */\nexport type SchemaTableNames<S extends string> = ConfiguredDatabase extends { [K in S]: {\n Tables: infer T;\n} } ? keyof T & string : string;\n\n/**\n * Build dot notation strings for all schema.table combinations\n */\ntype SchemaDotTable = { [S in SchemaNames]: S extends \"public\" ? never : `${S}.${SchemaTableNames<S>}` }[SchemaNames];\n\n/**\n * Table identifier - provides autocomplete for valid table names\n */\nexport type TableIdentifier = PublicTableNames | SchemaDotTable | { [S in Exclude<SchemaNames, \"public\">]: {\n schema: S;\n table: SchemaTableNames<S>;\n} }[Exclude<SchemaNames, \"public\">];\n\n/**\n * Resolve row type from a table identifier\n */\nexport type ResolveRowType<T extends TableIdentifier> = T extends string ? T extends `${infer Schema}.${infer Table}` ? ConfiguredDatabase extends { [K in Schema]: {\n Tables: { [K2 in Table]: {\n Row: infer R;\n } };\n} } ? R : Record<string, unknown> : DefaultSchema extends {\n Tables: { [K in T]: {\n Row: infer R;\n } };\n} ? R : DefaultSchema extends {\n Views: { [K in T]: {\n Row: infer R;\n } };\n} ? R : Record<string, unknown> : T extends {\n schema: infer S;\n table: infer TN;\n} ? S extends string ? TN extends string ? ConfiguredDatabase extends { [K in S]: {\n Tables: { [K2 in TN]: {\n Row: infer R;\n } };\n} } ? R : Record<string, unknown> : Record<string, unknown> : Record<string, unknown> : Record<string, unknown>;\n\n// =============================================================================\n// Types\n// =============================================================================\n\n/**\n * Options for useDbInfiniteQuery hook\n */\nexport interface UseDbInfiniteQueryOptions extends Omit<QueryOptions, \"limit\" | \"offset\" | \"enabled\"> {\n /** Whether the query is enabled (default: true) */\n enabled?: boolean;\n /** React Query stale time in ms (default: 30000) */\n staleTime?: number;\n /** Whether to refetch on window focus (default: true) */\n refetchOnWindowFocus?: boolean;\n /** Number of items per page (default: 50) */\n pageSize?: number;\n /** Text to search for */\n searchText?: string;\n /** Fields to search in when searchText is provided */\n searchFields?: string[];\n}\n\n/**\n * Result from useDbInfiniteQuery hook\n */\nexport interface UseDbInfiniteQueryResult<T> {\n /** Flattened array of all loaded data */\n data: T[] | undefined;\n /** Whether query is loading (initial load) */\n isLoading: boolean;\n /** Whether query is in pending state */\n isPending: boolean;\n /** Whether query is currently fetching (including refetch) */\n isFetching: boolean;\n /** Query error if any */\n error: Error | null;\n /** Function to fetch the next page */\n fetchNextPage: () => Promise<void>;\n /** Whether there are more pages to load */\n hasNextPage: boolean;\n /** Whether currently fetching the next page */\n isFetchingNextPage: boolean;\n /** Total count of items (if available) */\n count?: number;\n /** Refetch all pages */\n refetch: () => Promise<void>;\n}\n\n/**\n * Internal page result type\n */\ninterface PageResult<T> {\n data: T[];\n count?: number;\n}\n\n// =============================================================================\n// Helper Functions\n// =============================================================================\n\n/**\n * Build a query key for React Query infinite queries\n */\nfunction buildInfiniteQueryKey(table: string, options: UseDbInfiniteQueryOptions): unknown[] {\n return [\"v3\", \"infinite-query\", table, options.select ?? \"*\", JSON.stringify(options.where ?? {}), JSON.stringify(options.orderBy ?? []), options.pageSize ?? 50, options.searchText ?? \"\", JSON.stringify(options.searchFields ?? [])];\n}\n\n/**\n * Serialize query options for dependency tracking\n */\nfunction serializeInfiniteQueryOptions(options: UseDbInfiniteQueryOptions): string {\n return JSON.stringify({\n select: options.select,\n where: options.where,\n orderBy: options.orderBy,\n pageSize: options.pageSize,\n searchText: options.searchText,\n searchFields: options.searchFields\n });\n}\n\n/**\n * Helper to resolve table name from TableIdentifier\n */\nfunction resolveTableName(table: TableIdentifier): string {\n if (typeof table === \"string\") {\n return table;\n }\n return `${table.schema}.${table.table}`;\n}\n\n/**\n * Build search where clause from searchText and searchFields\n */\nfunction buildSearchWhereClause(searchText: string, searchFields: string[], existingWhere?: WhereClause): WhereClause {\n const searchWhere: WhereClause = {};\n if (searchFields.length === 1) {\n searchWhere[searchFields[0]] = {\n like: `%${searchText}%`\n };\n } else if (searchFields.length > 1) {\n searchWhere[searchFields[0]] = {\n like: `%${searchText}%`\n };\n }\n return {\n ...existingWhere,\n ...searchWhere\n };\n}\n\n// =============================================================================\n// Hook Implementation\n// =============================================================================\n\n/**\n * Hook for querying records with infinite scroll pagination\n *\n * @param table - Table name (string) or { schema, table } object\n * @param options - Query options (select, where, orderBy, pageSize, searchText, etc.)\n * @returns Query result with data, loading states, pagination controls, and refetch function\n *\n * @example\n * // Basic infinite query - types auto-inferred from table name\n * const { data, fetchNextPage, hasNextPage } = useDbInfiniteQuery(\"EquipmentFixtureUnit\");\n *\n * @example\n * // With search and pagination\n * const { data, fetchNextPage, hasNextPage, isFetchingNextPage } = useDbInfiniteQuery(\"Task\", {\n * pageSize: 20,\n * searchText: searchQuery,\n * searchFields: [\"name\", \"description\"],\n * orderBy: [{ field: \"createdAt\", direction: \"desc\" }],\n * });\n *\n * @example\n * // In a FlatList or similar\n * <FlatList\n * data={data}\n * onEndReached={() => hasNextPage && fetchNextPage()}\n * ListFooterComponent={isFetchingNextPage ? <Spinner /> : null}\n * />\n */\nexport function useDbInfiniteQuery<T extends TableIdentifier>(table: T, options?: UseDbInfiniteQueryOptions): UseDbInfiniteQueryResult<ResolveRowType<T>>;\n\n/**\n * Overload for explicit type parameter (backwards compatibility)\n */\nexport function useDbInfiniteQuery<T>(table: string, options?: UseDbInfiniteQueryOptions): UseDbInfiniteQueryResult<T>;\nexport function useDbInfiniteQuery<T>(table: TableIdentifier, options: UseDbInfiniteQueryOptions = {}): UseDbInfiniteQueryResult<T> {\n const tableName = resolveTableName(table);\n const {\n registry\n } = useDataLayerCore();\n const {\n enabled = true,\n staleTime = 30000,\n refetchOnWindowFocus = true,\n pageSize = 50,\n searchText,\n searchFields,\n ...queryOptions\n } = options;\n\n // Get adapter for this table\n // No isInitialized check needed - if we get here, core context exists = initialized\n const adapter = useMemo(() => {\n try {\n return registry.getAdapter(tableName);\n } catch {\n return null;\n }\n }, [registry, tableName]);\n\n // Serialize options for stable dependency tracking\n const serializedOptions = useMemo(() => serializeInfiniteQueryOptions(options), [options.select, options.where, options.orderBy, options.pageSize, options.searchText, options.searchFields]);\n\n // Build query key\n const queryKey = useMemo(() => buildInfiniteQueryKey(tableName, options), [tableName, serializedOptions]);\n\n // Build the where clause including search conditions\n const effectiveWhere = useMemo(() => {\n if (searchText && searchFields && searchFields.length > 0) {\n return buildSearchWhereClause(searchText, searchFields, queryOptions.where);\n }\n return queryOptions.where;\n }, [searchText, searchFields, queryOptions.where]);\n\n // Memoize base query options\n const memoizedQueryOptions = useMemo(() => ({\n select: queryOptions.select,\n where: effectiveWhere,\n orderBy: queryOptions.orderBy\n }), [queryOptions.select, effectiveWhere, queryOptions.orderBy]);\n\n // Track the adapter name that was actually used for the most recent query\n // This is used for accurate logging since the memoized adapter may be stale\n const lastUsedAdapterNameRef = useRef<string>(\"unknown\");\n\n // Execute infinite query with React Query\n const infiniteQuery = useInfiniteQuery<PageResult<T>, Error, InfiniteData<PageResult<T>, number>, unknown[], number>({\n queryKey,\n queryFn: async ({\n pageParam\n }) => {\n // Use currentAdapter directly - registry.getAdapter() throws if unavailable\n const currentAdapter = registry.getAdapter(tableName);\n\n // Track which adapter was actually used for accurate logging\n lastUsedAdapterNameRef.current = currentAdapter.name;\n const offset = (pageParam - 1) * pageSize;\n const result = await currentAdapter.query<T>(tableName, {\n ...memoizedQueryOptions,\n limit: pageSize,\n offset\n });\n return {\n data: result.data ?? [],\n count: result.count\n };\n },\n initialPageParam: 1,\n getNextPageParam: (lastPage, allPages) => {\n const totalLoaded = allPages.reduce((sum, page) => sum + page.data.length, 0);\n const totalCount = lastPage.count;\n if (totalCount !== undefined && totalLoaded >= totalCount) {\n return undefined;\n }\n if (lastPage.data.length < pageSize) {\n return undefined;\n }\n return allPages.length + 1;\n },\n enabled: enabled && adapter !== null,\n staleTime,\n refetchOnWindowFocus\n });\n\n // Flatten all pages into a single data array\n const flattenedData = useMemo(() => {\n if (!infiniteQuery.data?.pages) return undefined;\n return infiniteQuery.data.pages.flatMap(page_0 => page_0.data);\n }, [infiniteQuery.data?.pages]);\n\n // Get total count from the last page\n const count = useMemo(() => {\n if (!infiniteQuery.data?.pages || infiniteQuery.data.pages.length === 0) {\n return undefined;\n }\n return infiniteQuery.data.pages[infiniteQuery.data.pages.length - 1].count;\n }, [infiniteQuery.data?.pages]);\n\n // Build fetchNextPage function\n const fetchNextPage = useCallback(async () => {\n await infiniteQuery.fetchNextPage();\n }, [infiniteQuery]);\n\n // Build refetch function\n const refetch = useCallback(async () => {\n await infiniteQuery.refetch();\n }, [infiniteQuery]);\n\n // Dev logging for debugging\n // Uses lastUsedAdapterNameRef to log the adapter that was ACTUALLY used for the query,\n // not the memoized adapter from render time (which may be stale due to auto-detection)\n useEffect(() => {\n const adapterName = lastUsedAdapterNameRef.current;\n\n // Log errors\n if (infiniteQuery.isError && infiniteQuery.error) {\n devWarn(\"useDbInfiniteQuery\", `${tableName} via ${adapterName}: Error - ${infiniteQuery.error.message}`);\n }\n\n // Log empty results (only after successful fetch, not during loading)\n if (infiniteQuery.isSuccess && flattenedData?.length === 0) {\n devLog(\"useDbInfiniteQuery\", `${tableName} via ${adapterName}: 0 results`);\n }\n }, [infiniteQuery.isError, infiniteQuery.error, infiniteQuery.isSuccess, flattenedData, tableName]);\n return {\n data: flattenedData,\n isLoading: infiniteQuery.isLoading,\n isPending: infiniteQuery.isPending,\n isFetching: infiniteQuery.isFetching,\n error: infiniteQuery.error as Error | null,\n fetchNextPage,\n hasNextPage: infiniteQuery.hasNextPage ?? false,\n isFetchingNextPage: infiniteQuery.isFetchingNextPage,\n count,\n refetch\n };\n}\nexport default useDbInfiniteQuery;","import { c as _c } from \"react/compiler-runtime\";\n/**\n * V3 useDbCount Hook\n *\n * React hook for counting records in a table.\n * Works with the data layer using either PowerSync or Supabase backend.\n */\n\nimport { useMemo, useCallback, useEffect, useRef } from \"react\";\nimport { useQuery } from \"@tanstack/react-query\";\nimport { useDataLayerCore } from \"./useDataLayer\";\nimport type { WhereClause } from \"../core/types\";\nimport { devWarn } from \"../utils/dev-log\";\n\n// =============================================================================\n// Types\n// =============================================================================\n\n/**\n * Options for useDbCount hook\n */\nexport interface UseDbCountOptions {\n /** Filter conditions */\n where?: WhereClause;\n /** Whether the query is enabled (default: true) */\n enabled?: boolean;\n /** React Query stale time in ms (default: 30000) */\n staleTime?: number;\n}\n\n/**\n * Result from useDbCount hook\n */\nexport interface UseDbCountResult {\n /** The count value */\n count: number | undefined;\n /** Whether query is loading */\n isLoading: boolean;\n /** Whether query is fetching */\n isFetching: boolean;\n /** Query error if any */\n error: Error | null;\n /** Refetch the count */\n refetch: () => Promise<void>;\n}\n\n// =============================================================================\n// Hook Implementation\n// =============================================================================\n\n/**\n * Hook for counting records in a table\n *\n * @param table - The table name to count\n * @param options - Count options (where filter, enabled)\n * @returns Count result with loading states\n *\n * @example\n * // Simple count\n * const { count, isLoading } = useDbCount(\"EquipmentFixtureUnit\");\n *\n * @example\n * // Count with filter\n * const { count } = useDbCount(\"EquipmentFixtureUnit\", {\n * where: { projectDatabaseId: 123 },\n * });\n */\nexport function useDbCount(table, t0) {\n const $ = _c(32);\n let t1;\n if ($[0] !== t0) {\n t1 = t0 === undefined ? {} : t0;\n $[0] = t0;\n $[1] = t1;\n } else {\n t1 = $[1];\n }\n const options = t1;\n const {\n registry\n } = useDataLayerCore();\n const {\n enabled: t2,\n staleTime: t3,\n where\n } = options;\n const enabled = t2 === undefined ? true : t2;\n const staleTime = t3 === undefined ? 30000 : t3;\n let t4;\n try {\n let t5;\n if ($[2] !== registry || $[3] !== table) {\n t5 = registry.getAdapter(table);\n $[2] = registry;\n $[3] = table;\n $[4] = t5;\n } else {\n t5 = $[4];\n }\n t4 = t5;\n } catch {\n t4 = null;\n }\n const adapter = t4;\n let t5;\n if ($[5] !== where) {\n t5 = JSON.stringify(where ?? {});\n $[5] = where;\n $[6] = t5;\n } else {\n t5 = $[6];\n }\n let t6;\n if ($[7] !== t5 || $[8] !== table) {\n t6 = [\"v3\", \"count\", table, t5];\n $[7] = t5;\n $[8] = table;\n $[9] = t6;\n } else {\n t6 = $[9];\n }\n const queryKey = t6;\n const lastUsedAdapterNameRef = useRef(\"unknown\");\n let t7;\n if ($[10] !== registry || $[11] !== table || $[12] !== where) {\n t7 = async () => {\n const currentAdapter = registry.getAdapter(table);\n lastUsedAdapterNameRef.current = currentAdapter.name;\n const result = await currentAdapter.query(table, {\n where,\n select: \"id\"\n });\n return result.count ?? result.data.length;\n };\n $[10] = registry;\n $[11] = table;\n $[12] = where;\n $[13] = t7;\n } else {\n t7 = $[13];\n }\n const queryFn = t7;\n const t8 = enabled && adapter !== null;\n let t9;\n if ($[14] !== queryFn || $[15] !== queryKey || $[16] !== staleTime || $[17] !== t8) {\n t9 = {\n queryKey,\n queryFn,\n enabled: t8,\n staleTime\n };\n $[14] = queryFn;\n $[15] = queryKey;\n $[16] = staleTime;\n $[17] = t8;\n $[18] = t9;\n } else {\n t9 = $[18];\n }\n const query = useQuery(t9);\n let t10;\n let t11;\n if ($[19] !== query.error || $[20] !== query.isError || $[21] !== table) {\n t10 = () => {\n if (query.isError && query.error) {\n const adapterName = lastUsedAdapterNameRef.current;\n devWarn(\"useDbCount\", `${table} via ${adapterName}: Error - ${query.error.message}`);\n }\n };\n t11 = [query.isError, query.error, table];\n $[19] = query.error;\n $[20] = query.isError;\n $[21] = table;\n $[22] = t10;\n $[23] = t11;\n } else {\n t10 = $[22];\n t11 = $[23];\n }\n useEffect(t10, t11);\n let t12;\n if ($[24] !== query) {\n t12 = async () => {\n await query.refetch();\n };\n $[24] = query;\n $[25] = t12;\n } else {\n t12 = $[25];\n }\n const refetch = t12;\n const t13 = query.error as Error | null;\n let t14;\n if ($[26] !== query.data || $[27] !== query.isFetching || $[28] !== query.isLoading || $[29] !== refetch || $[30] !== t13) {\n t14 = {\n count: query.data,\n isLoading: query.isLoading,\n isFetching: query.isFetching,\n error: t13,\n refetch\n };\n $[26] = query.data;\n $[27] = query.isFetching;\n $[28] = query.isLoading;\n $[29] = refetch;\n $[30] = t13;\n $[31] = t14;\n } else {\n t14 = $[31];\n }\n return t14;\n}\nexport default useDbCount;","import { c as _c } from \"react/compiler-runtime\";\n/**\n * V3 useSyncStatus Hook\n *\n * Provides sync status information from the data layer.\n * Returns default \"always synced\" status when PowerSync is not available.\n *\n * Uses the split context architecture for optimal performance.\n */\n\nimport { useState, useEffect, useContext } from \"react\";\nimport { DataLayerStatusContext, DataLayerCoreContext } from \"../providers/DataLayerContext\";\nimport type { SyncStatus } from \"../core/types\";\n\n/**\n * Default sync status when PowerSync is not available\n */\nconst defaultSyncStatus: SyncStatus = {\n isConnected: true,\n // Supabase-only mode is always \"connected\" when online\n isSyncing: false,\n lastSyncedAt: null,\n pendingUploads: 0,\n error: null\n};\n\n/**\n * Hook to get the current sync status\n *\n * When PowerSync is not available, returns a default \"always synced\" status.\n *\n * This hook uses the split context architecture - it only subscribes to\n * status changes, not core value changes.\n *\n * @example\n * const { isSyncing, pendingUploads, isConnected } = useSyncStatus();\n *\n * if (pendingUploads > 0) {\n * console.log(`${pendingUploads} changes waiting to sync`);\n * }\n */\nexport function useSyncStatus() {\n const $ = _c(6);\n const statusContext = useContext(DataLayerStatusContext);\n const coreContext = useContext(DataLayerCoreContext);\n if (!statusContext || !coreContext) {\n throw new Error(\"useSyncStatus must be used within a DataLayerProvider. Make sure you have wrapped your app with <DataLayerProvider>.\");\n }\n const {\n syncStatus,\n status\n } = statusContext;\n const {\n powerSync\n } = coreContext;\n const [currentStatus, setCurrentStatus] = useState(syncStatus);\n let t0;\n let t1;\n if ($[0] !== powerSync || $[1] !== status.currentBackend || $[2] !== status.isOnline || $[3] !== syncStatus) {\n t0 = () => {\n if (powerSync && status.currentBackend === \"powersync\") {\n setCurrentStatus(syncStatus);\n } else {\n setCurrentStatus({\n ...defaultSyncStatus,\n isConnected: status.isOnline\n });\n }\n };\n t1 = [syncStatus, status.currentBackend, status.isOnline, powerSync];\n $[0] = powerSync;\n $[1] = status.currentBackend;\n $[2] = status.isOnline;\n $[3] = syncStatus;\n $[4] = t0;\n $[5] = t1;\n } else {\n t0 = $[4];\n t1 = $[5];\n }\n useEffect(t0, t1);\n return currentStatus;\n}\nexport default useSyncStatus;","import { c as _c } from \"react/compiler-runtime\";\n/**\n * V3 useSyncControl Hook\n *\n * Provides sync control functions from the data layer.\n * Returns no-op functions when PowerSync is not available.\n *\n * Uses the split context architecture for optimal performance.\n */\n\nimport { useMemo, useContext } from \"react\";\nimport { DataLayerCoreContext } from \"../providers/DataLayerContext\";\nimport type { SyncControl } from \"../core/types\";\n\n/**\n * Hook to get sync controls for PowerSync\n *\n * When PowerSync is not available, all methods are no-ops that log a warning.\n *\n * PERFORMANCE: This hook only subscribes to DataLayerCoreContext (stable values),\n * NOT DataLayerStatusContext. This means components using useSyncControl() will\n * NOT re-render when network status or sync status changes.\n *\n * @example\n * const { triggerSync, startLiveSync, stopLiveSync } = useSyncControl();\n *\n * // Manually trigger a sync\n * await triggerSync();\n *\n * // Start/stop live sync\n * await startLiveSync();\n * stopLiveSync();\n */\nexport function useSyncControl() {\n const $ = _c(1);\n const coreContext = useContext(DataLayerCoreContext);\n if (!coreContext) {\n throw new Error(\"useSyncControl must be used within a DataLayerProvider. Make sure you have wrapped your app with <DataLayerProvider>.\");\n }\n const {\n syncControl,\n powerSync\n } = coreContext;\n const isPowerSyncActive = powerSync !== null;\n let t0;\n if ($[0] === Symbol.for(\"react.memo_cache_sentinel\")) {\n t0 = {\n triggerSync: _temp,\n startLiveSync: _temp2,\n stopLiveSync: _temp3,\n setScope: _temp4,\n addPendingMutation: _temp5,\n removePendingMutation: _temp6\n };\n $[0] = t0;\n } else {\n t0 = $[0];\n }\n const noOpControls = t0;\n let t1;\n bb0: {\n if (isPowerSyncActive) {\n t1 = syncControl;\n break bb0;\n }\n t1 = noOpControls;\n }\n const controls = t1;\n return controls;\n}\nfunction _temp6() {}\nfunction _temp5() {}\nasync function _temp4(_scopeName, _values) {\n console.warn(\"[useSyncControl] setScope called but PowerSync is not available\");\n}\nfunction _temp3() {\n console.warn(\"[useSyncControl] stopLiveSync called but PowerSync is not available\");\n}\nasync function _temp2() {\n console.warn(\"[useSyncControl] startLiveSync called but PowerSync is not available\");\n}\nasync function _temp() {\n console.warn(\"[useSyncControl] triggerSync called but PowerSync is not available\");\n}\nexport default useSyncControl;","import { c as _c } from \"react/compiler-runtime\";\n/**\n * V3 useOnlineStatus Hook\n *\n * Provides online/connection status information.\n * Uses DataLayerProvider's status as the SINGLE source of truth.\n *\n * On React Native: status.isOnline comes from PowerSync platform adapter (NetInfo)\n * On Web: status.isOnline comes from browser navigator.onLine\n */\n\nimport { useMemo } from \"react\";\nimport { useDataLayerCore, useDataLayerStatus } from \"./useDataLayer\";\n\n/**\n * Online status information\n */\nexport interface OnlineStatus {\n /** Whether the device has network connectivity */\n isOnline: boolean;\n /** Whether PowerSync is connected (false if using Supabase-only) */\n isConnected: boolean;\n /** Current backend being used */\n backend: \"powersync\" | \"supabase\" | null;\n}\n\n/**\n * Hook to get online/connection status\n *\n * Uses DataLayerProvider's status as the single source of truth:\n * - On React Native: isOnline comes from PowerSync platform adapter (NetInfo)\n * - On Web: isOnline comes from browser navigator.onLine\n *\n * @example\n * const { isOnline, isConnected, backend } = useOnlineStatus();\n *\n * if (!isOnline) {\n * return <OfflineBanner />;\n * }\n */\nexport function useOnlineStatus() {\n const $ = _c(4);\n const {\n powerSync\n } = useDataLayerCore();\n const {\n status\n } = useDataLayerStatus();\n const t0 = powerSync !== null && status.powerSyncStatus === \"available\";\n let t1;\n if ($[0] !== status.currentBackend || $[1] !== status.isOnline || $[2] !== t0) {\n t1 = {\n isOnline: status.isOnline,\n isConnected: t0,\n backend: status.currentBackend\n };\n $[0] = status.currentBackend;\n $[1] = status.isOnline;\n $[2] = t0;\n $[3] = t1;\n } else {\n t1 = $[3];\n }\n return t1;\n}\nexport default useOnlineStatus;"],"mappings":"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","names":["result","_c","useMutation","useQueryClient","_c","useQueryClient","t9","useMutation","_c","useMutation","useQueryClient","_c","useQueryClient","useMutation","_c","useMutation","useQueryClient","_c","useQueryClient","t9","useMutation","useMemo","useCallback","useEffect","useRef","useMemo","useRef","useCallback","useEffect","_c","useEffect","useRef","useQuery","_c","t5","useRef","useQuery","useEffect","_c","useState","useEffect","_c","useState","useEffect","_c","useContext","_c","useContext","_c","_c"]}
@@ -67,8 +67,13 @@ type SyncScope = "global" | string;
67
67
  */
68
68
  interface PowerSyncStrategy {
69
69
  strategy: "powersync";
70
- /** Which scope controls what data to sync */
71
- syncScope: SyncScope;
70
+ /**
71
+ * Which scope controls what data to sync.
72
+ *
73
+ * Optional when using the unified `definePolConfig` API which doesn't use scopes.
74
+ * Required when using the legacy DataLayerConfig directly.
75
+ */
76
+ syncScope?: SyncScope;
72
77
  /**
73
78
  * Alias used in PowerSync schema for this table.
74
79
  * Required when multiple schemas have tables with the same name.
@@ -197,25 +202,6 @@ interface DataLayerConfig<DB = unknown> {
197
202
  /** Interval for periodic sync in milliseconds (default: 300000 = 5 min) */
198
203
  periodicIntervalMs?: number;
199
204
  };
200
- /**
201
- * Options for initial sync behavior when using PowerSync.
202
- */
203
- initialSync?: {
204
- /**
205
- * Use Supabase for queries until PowerSync completes initial sync.
206
- *
207
- * When true (default): Queries return online data from Supabase while
208
- * PowerSync is downloading initial data, ensuring users see content
209
- * immediately. Once sync completes, queries automatically switch to
210
- * the local PowerSync database for offline-first operation.
211
- *
212
- * When false: Queries always use PowerSync (which may be empty during
213
- * initial sync), showing loading states until data is available locally.
214
- *
215
- * @default true
216
- */
217
- useOnlineUntilSynced?: boolean;
218
- };
219
205
  }
220
206
  /**
221
207
  * Comparison operators for where clauses
@@ -388,28 +374,6 @@ interface SyncControl {
388
374
  * @param values - Array of values (e.g., project IDs)
389
375
  */
390
376
  setScope: (scopeName: string, values: string[]) => Promise<void>;
391
- /**
392
- * Pause automatic retries of failed uploads.
393
- *
394
- * When wired to PowerSyncProvider, this calls connector.pauseAutoRetry()
395
- * which prevents the connector from retrying failed transactions during
396
- * the next uploadData() call.
397
- *
398
- * Use this when:
399
- * - User is actively resolving conflicts
400
- * - User wants to go offline intentionally
401
- * - Manual control over sync timing is needed
402
- */
403
- pauseAutoRetry: () => void;
404
- /**
405
- * Resume automatic retries of failed uploads.
406
- *
407
- * When wired to PowerSyncProvider, this calls connector.resumeAutoRetry()
408
- * which allows the connector to resume retrying failed transactions.
409
- */
410
- resumeAutoRetry: () => void;
411
- /** Whether automatic retries are currently paused */
412
- isAutoRetryPaused: boolean;
413
377
  /**
414
378
  * Add a pending mutation to the list.
415
379
  * Called by mutation hooks BEFORE the write operation for optimistic updates.
@@ -9,7 +9,7 @@ import {
9
9
  useOnlineStatus,
10
10
  useSyncControl,
11
11
  useSyncStatus
12
- } from "../chunk-WY6MNB6K.js";
12
+ } from "../chunk-ZPFZ2ZRW.js";
13
13
  import {
14
14
  useDataLayer,
15
15
  useDataLayerCore,
package/dist/index.js CHANGED
@@ -4,7 +4,7 @@ import {
4
4
  getPowerSyncInstance,
5
5
  isAbstractPowerSyncDatabase,
6
6
  isPowerSyncAvailable
7
- } from "./chunk-7BGDQT5X.js";
7
+ } from "./chunk-PIPB3JMK.js";
8
8
  import {
9
9
  useReceiptAI_default,
10
10
  useSupabaseFunction
@@ -24,7 +24,7 @@ import {
24
24
  useHasConflicts,
25
25
  usePendingConflicts,
26
26
  useSupabaseUpload
27
- } from "./chunk-K46TGKB2.js";
27
+ } from "./chunk-7PBTPCRN.js";
28
28
  import {
29
29
  ADAPTER_STRATEGIES,
30
30
  AdapterRegistry,
@@ -77,7 +77,7 @@ import {
77
77
  useUpsertChangelog,
78
78
  useUpsertChangelogEntry,
79
79
  useUpsertChangelogMedia
80
- } from "./chunk-VADZSRHY.js";
80
+ } from "./chunk-FWCHS5NN.js";
81
81
  import {
82
82
  LiveChangeContext,
83
83
  LiveChangeContextProvider,
@@ -88,7 +88,7 @@ import {
88
88
  useUserMetadataState,
89
89
  useUserMetadataValue,
90
90
  userMetadataContext
91
- } from "./chunk-VSY6766U.js";
91
+ } from "./chunk-H4Z73DC4.js";
92
92
  import {
93
93
  PostgrestFilter,
94
94
  binarySearch,
@@ -128,7 +128,7 @@ import {
128
128
  useOnlineStatus,
129
129
  useSyncControl,
130
130
  useSyncStatus
131
- } from "./chunk-WY6MNB6K.js";
131
+ } from "./chunk-ZPFZ2ZRW.js";
132
132
  import {
133
133
  Constants,
134
134
  createCombinedStatus