@pol-studios/db 1.0.22 → 1.0.24

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (36) hide show
  1. package/dist/{DataLayerContext-ZmLPYR_s.d.ts → DataLayerContext-BnDyYvkg.d.ts} +2 -2
  2. package/dist/auth/context.js +2 -2
  3. package/dist/auth/hooks.js +3 -3
  4. package/dist/auth/index.js +3 -3
  5. package/dist/{chunk-3FHAKRDV.js → chunk-2DOYFTN4.js} +32 -31
  6. package/dist/chunk-2DOYFTN4.js.map +1 -0
  7. package/dist/{chunk-I4BDZDHX.js → chunk-7OLNKLII.js} +3 -3
  8. package/dist/{chunk-FKRACEHV.js → chunk-BXSOHOQ2.js} +53 -24
  9. package/dist/chunk-BXSOHOQ2.js.map +1 -0
  10. package/dist/{chunk-WP6TIVPH.js → chunk-LABTYQOJ.js} +4 -4
  11. package/dist/{chunk-LPC64MD4.js → chunk-VWPLASGY.js} +2 -2
  12. package/dist/{chunk-OUUQSI3Y.js → chunk-VZMZXL37.js} +2 -2
  13. package/dist/{chunk-3EVWXMUV.js → chunk-WHJJDWFT.js} +33 -8
  14. package/dist/chunk-WHJJDWFT.js.map +1 -0
  15. package/dist/hooks/index.d.ts +5 -4
  16. package/dist/hooks/index.js +1 -1
  17. package/dist/{index-2YySlz7X.d.ts → index-B6xGmPRV.d.ts} +1 -1
  18. package/dist/index.d.ts +4 -4
  19. package/dist/index.js +7 -7
  20. package/dist/index.native.d.ts +5 -5
  21. package/dist/index.native.js +7 -7
  22. package/dist/index.web.d.ts +6 -6
  23. package/dist/index.web.js +6 -6
  24. package/dist/query/index.js +1 -1
  25. package/dist/types/index.d.ts +2 -2
  26. package/dist/{useDbCount-s-aR9YeV.d.ts → useDbCount-Dn_1uI69.d.ts} +1 -1
  27. package/dist/{useResolveFeedback-DTGcHpCs.d.ts → useResolveFeedback-CBHY2Z1Q.d.ts} +3 -3
  28. package/dist/with-auth/index.js +4 -4
  29. package/package.json +1 -1
  30. package/dist/chunk-3EVWXMUV.js.map +0 -1
  31. package/dist/chunk-3FHAKRDV.js.map +0 -1
  32. package/dist/chunk-FKRACEHV.js.map +0 -1
  33. /package/dist/{chunk-I4BDZDHX.js.map → chunk-7OLNKLII.js.map} +0 -0
  34. /package/dist/{chunk-WP6TIVPH.js.map → chunk-LABTYQOJ.js.map} +0 -0
  35. /package/dist/{chunk-LPC64MD4.js.map → chunk-VWPLASGY.js.map} +0 -0
  36. /package/dist/{chunk-OUUQSI3Y.js.map → chunk-VZMZXL37.js.map} +0 -0
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/hooks/useDataLayer.ts","../src/providers/DataLayerContext.ts","../src/hooks/useDbQuery.ts","../src/hooks/useDbQueryById.ts","../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 Data Layer Hooks\n *\n * Provides access to the V3 data layer context for components.\n * This module provides three hooks for different use cases:\n *\n * - useDataLayerCore(): Stable values only (registry, adapters, clients)\n * Use in query/mutation hooks to avoid re-renders on status changes.\n *\n * - useDataLayerStatus(): Dynamic values only (status, syncStatus, syncControl)\n * Use for UI components that display sync status, online indicator, etc.\n *\n * - useDataLayer(): Combined access (backward compatible)\n * Use when you need both core and status values.\n */\n\nimport { useContext } from \"react\";\nimport { DataLayerContext, DataLayerCoreContext, DataLayerStatusContext, type DataLayerContextValue, type DataLayerCoreContextValue, type DataLayerStatusContextValue } from \"../providers/DataLayerContext\";\n\n// =============================================================================\n// PERFORMANCE-OPTIMIZED HOOKS (Recommended)\n// =============================================================================\n\n/**\n * Hook to access ONLY the stable core values (registry, adapters, clients)\n *\n * PERFORMANCE BENEFIT: Components using this hook will NOT re-render when\n * network status or sync status changes. Use this in query/mutation hooks.\n *\n * Provides access to:\n * - registry: Adapter registry for getting table adapters\n * - getAdapter: Function to get adapter for a specific table\n * - powerSync: PowerSync database instance (null when not available)\n * - supabase: Supabase client (always available)\n * - queryClient: React Query client\n * - schema: Database schema\n *\n * @throws Error if used outside of DataLayerProvider\n *\n * @example\n * const { getAdapter, supabase } = useDataLayerCore();\n * const adapter = getAdapter(\"Task\");\n * // This component won't re-render on sync status changes\n */\nexport function useDataLayerCore() {\n const context = useContext(DataLayerCoreContext);\n if (!context) {\n throw new Error(\"useDataLayerCore must be used within a DataLayerProvider. Make sure you have wrapped your app with <DataLayerProvider>.\");\n }\n return context;\n}\n\n/**\n * Hook to access ONLY the dynamic status values\n *\n * PERFORMANCE BENEFIT: Only components that actually need status information\n * will re-render when status changes. Use for UI components that display\n * sync status, online indicator, pending uploads count, etc.\n *\n * Provides access to:\n * - status: Current initialization and connection status\n * - syncStatus: Sync status for PowerSync\n * - syncControl: Sync controls for PowerSync\n *\n * @throws Error if used outside of DataLayerProvider\n *\n * @example\n * const { status, syncStatus } = useDataLayerStatus();\n *\n * return (\n * <StatusBar\n * isOnline={status.isOnline}\n * pendingUploads={syncStatus.pendingUploads}\n * />\n * );\n */\nexport function useDataLayerStatus() {\n const context = useContext(DataLayerStatusContext);\n if (!context) {\n throw new Error(\"useDataLayerStatus must be used within a DataLayerProvider. Make sure you have wrapped your app with <DataLayerProvider>.\");\n }\n return context;\n}\n\n// =============================================================================\n// BACKWARD COMPATIBLE HOOKS\n// =============================================================================\n\n/**\n * Hook to access the V3 data layer context (combined core + status)\n *\n * NOTE: Consider using useDataLayerCore() or useDataLayerStatus() instead\n * for better render performance. This hook re-renders on ALL status changes.\n *\n * Provides access to:\n * - registry: Adapter registry for getting table adapters\n * - getAdapter: Function to get adapter for a specific table\n * - powerSync: PowerSync database instance (null when not available)\n * - supabase: Supabase client (always available)\n * - queryClient: React Query client\n * - schema: Database schema\n * - status: Current initialization and connection status\n * - syncStatus: Sync status for PowerSync\n * - syncControl: Sync controls for PowerSync\n *\n * @throws Error if used outside of DataLayerProvider\n *\n * @example\n * const { getAdapter, status } = useDataLayer();\n *\n * if (status.isInitialized) {\n * const adapter = getAdapter(\"Task\");\n * // Use adapter...\n * }\n */\nexport function useDataLayer() {\n const context = useContext(DataLayerContext);\n if (!context) {\n throw new Error(\"useDataLayer must be used within a DataLayerProvider. Make sure you have wrapped your app with <DataLayerProvider>.\");\n }\n return context;\n}\n\n/**\n * Hook to safely access data layer context (returns null if not in provider)\n *\n * Use this when you need to check if the data layer is available\n * without throwing an error. Useful for conditional rendering or\n * components that may be rendered outside the provider context.\n *\n * @example\n * const dataLayer = useDataLayerOptional();\n *\n * if (dataLayer) {\n * // Safe to use data layer\n * } else {\n * // Render fallback UI\n * }\n */\nexport function useDataLayerOptional() {\n return useContext(DataLayerContext);\n}\nexport default useDataLayer;","/**\n * V3 Data Layer Context\n *\n * Defines the React context and types for the V3 data layer provider.\n * This context provides access to adapters, sync status, and core instances.\n *\n * PERFORMANCE OPTIMIZATION:\n * The context is split into two separate contexts to prevent unnecessary re-renders:\n * - DataLayerCoreContext: Stable values that don't change after initialization\n * - DataLayerStatusContext: Dynamic values that change during runtime\n *\n * The original DataLayerContext is kept for backward compatibility.\n */\n\nimport { createContext } from \"react\";\nimport type { SupabaseClient } from \"@supabase/supabase-js\";\nimport type { QueryClient } from \"@tanstack/react-query\";\nimport type { AdapterRegistry } from \"../adapters/registry\";\nimport type { PowerSyncDatabase } from \"../query/executor\";\nimport type { DatabaseSchema, SyncStatus, SyncControl } from \"../core/types\";\nimport type { BackendStatus, AutoDetectionResult } from \"../adapters/auto-detector\";\nimport type { TableDataAdapter } from \"../adapters/types\";\n\n// =============================================================================\n// Status Types\n// =============================================================================\n\n/**\n * Status of the data layer initialization\n */\nexport interface DataLayerStatus {\n /** Whether the data layer is fully initialized */\n isInitialized: boolean;\n /** Current active backend */\n currentBackend: \"powersync\" | \"supabase\" | null;\n /** PowerSync connection status */\n powerSyncStatus: BackendStatus;\n /** Whether device is online */\n isOnline: boolean;\n /** Last auto-detection result */\n lastDetection: AutoDetectionResult | null;\n /** Initialization error if any */\n error: Error | null;\n /** Whether initial sync has completed (from PowerSync) */\n hasSynced: boolean;\n}\n\n// =============================================================================\n// Split Context Types (Performance Optimization)\n// =============================================================================\n\n/**\n * STABLE core context - values that don't change after initialization\n *\n * Use useDataLayerCore() to access these values in query/mutation hooks\n * to avoid re-renders when sync status changes.\n */\nexport interface DataLayerCoreContextValue {\n /** Adapter registry for getting table adapters */\n registry: AdapterRegistry;\n /** Get adapter for a specific table */\n getAdapter: (table: string) => TableDataAdapter;\n /** PowerSync database instance (null when not available) */\n powerSync: PowerSyncDatabase | null;\n /** Supabase client (always available) */\n supabase: SupabaseClient;\n /** React Query client */\n queryClient: QueryClient;\n /** Database schema */\n schema: DatabaseSchema;\n}\n\n/**\n * DYNAMIC status context - values that change during runtime\n *\n * Use useDataLayerStatus() for UI components that display sync status,\n * online indicator, etc. Components using this WILL re-render when status changes.\n */\nexport interface DataLayerStatusContextValue {\n /** Current status */\n status: DataLayerStatus;\n /** Sync status (for PowerSync, no-op for Supabase-only) */\n syncStatus: SyncStatus;\n /** Sync controls (for PowerSync, no-op for Supabase-only) */\n syncControl: SyncControl;\n}\n\n// =============================================================================\n// Combined Context Value Type (Backward Compatibility)\n// =============================================================================\n\n/**\n * Context value for the data layer (combines core and status)\n *\n * @deprecated Prefer using useDataLayerCore() or useDataLayerStatus() for better performance.\n * This combined interface is kept for backward compatibility.\n */\nexport interface DataLayerContextValue {\n /** Adapter registry for getting table adapters */\n registry: AdapterRegistry;\n\n /** Get adapter for a specific table */\n getAdapter: (table: string) => TableDataAdapter;\n\n /** PowerSync database instance (null when not available) */\n powerSync: PowerSyncDatabase | null;\n\n /** Supabase client (always available) */\n supabase: SupabaseClient;\n\n /** React Query client */\n queryClient: QueryClient;\n\n /** Database schema */\n schema: DatabaseSchema;\n\n /** Current status */\n status: DataLayerStatus;\n\n /** Sync status (for PowerSync, no-op for Supabase-only) */\n syncStatus: SyncStatus;\n\n /** Sync controls (for PowerSync, no-op for Supabase-only) */\n syncControl: SyncControl;\n}\n\n// =============================================================================\n// Context Creation\n// =============================================================================\n\n/**\n * STABLE Core context - values that don't change after initialization\n *\n * Use useDataLayerCore() hook to access. Components consuming this context\n * will NOT re-render when sync status or network status changes.\n */\nexport const DataLayerCoreContext = createContext<DataLayerCoreContextValue | null>(null);\nDataLayerCoreContext.displayName = \"DataLayerCoreContext\";\n\n/**\n * DYNAMIC Status context - values that change during runtime\n *\n * Use useDataLayerStatus() hook to access. Components consuming this context\n * WILL re-render when sync status or network status changes.\n */\nexport const DataLayerStatusContext = createContext<DataLayerStatusContextValue | null>(null);\nDataLayerStatusContext.displayName = \"DataLayerStatusContext\";\n\n/**\n * Combined data layer context (backward compatibility)\n *\n * @deprecated Prefer using DataLayerCoreContext or DataLayerStatusContext for better performance.\n * Provides access to the V3 data layer throughout the React component tree.\n * Must be accessed via the useDataLayer hook or similar consumer.\n */\nexport const DataLayerContext = createContext<DataLayerContextValue | null>(null);\nDataLayerContext.displayName = \"DataLayerContext\";","/**\n * V3 useDbQuery Hook\n *\n * React hook for querying multiple records from a table.\n * Works identically whether PowerSync or Supabase is the backend.\n * Uses React Query 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 } = useDbQuery(\"EquipmentFixtureUnit\", { ... });\n * // data is typed as Tables<\"EquipmentFixtureUnit\">[]\n */\n\nimport { useMemo, useEffect, useCallback } from \"react\";\nimport { useQuery } from \"@tanstack/react-query\";\nimport { useDataLayerCore, useDataLayerStatus } from \"./useDataLayer\";\nimport type { QueryOptions } from \"../core/types\";\n\n// =============================================================================\n// Module Augmentation Interface\n// =============================================================================\n\n/**\n * Augment this interface in your app to enable automatic type inference.\n *\n * @example\n * // In types/db.d.ts\n * declare module \"@pol-studios/db\" {\n * interface DatabaseTypes {\n * database: import(\"@/database.types\").Database;\n * }\n * }\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 // Skip public schema for dot notation\n: `${S}.${SchemaTableNames<S>}` }[SchemaNames];\n\n/**\n * Table identifier - provides autocomplete for valid table names\n *\n * Supports:\n * - \"TableName\" - public schema tables\n * - \"schema.TableName\" - dot notation for other schemas\n * - { schema, table } - object format for other schemas\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 *\n * Supports:\n * - \"TableName\" → public schema\n * - \"schema.TableName\" → specified schema (dot notation)\n * - { schema: \"schema\", table: \"TableName\" } → specified schema (object)\n */\nexport type ResolveRowType<T extends TableIdentifier> = T extends string ?\n// Check for dot notation first (e.g., \"core.Profile\")\nT 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> :\n// Plain string - look in public schema\nDefaultSchema 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} ?\n// Object with schema - look in specified schema\nS 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 useDbQuery hook\n */\nexport interface UseDbQueryOptions extends Omit<QueryOptions, \"enabled\"> {\n /** Whether the query is enabled (default: true) */\n enabled?: boolean;\n /**\n * React Query stale time in ms\n * Default depends on backend:\n * - PowerSync (offline): 0 - always refetch from SQLite (disk is fast)\n * - Supabase (online): 30000 - use normal caching\n */\n staleTime?: number;\n /** React Query gcTime (cache time) in ms (default: 300000 - 5 minutes) */\n gcTime?: number;\n /** Whether to refetch on window focus (default: true) */\n refetchOnWindowFocus?: boolean;\n /**\n * Whether to refetch on mount\n * Default depends on backend:\n * - PowerSync (offline): \"always\" - always query SQLite\n * - Supabase (online): true - refetch if stale\n */\n refetchOnMount?: boolean | \"always\";\n /** Whether to enable real-time subscriptions (if adapter supports) */\n realtime?: boolean;\n /** If true, returns single item instead of array (for compatibility with V2) */\n single?: boolean;\n}\n\n/**\n * Result from useDbQuery hook\n */\nexport interface UseDbQueryResult<T> {\n /** Query 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 /** Whether query is currently refetching (alias for isFetching for V2 compatibility) */\n isRefetching: boolean;\n /** Whether query completed successfully */\n isSuccess: boolean;\n /** Whether query errored */\n isError: boolean;\n /** Query error if any */\n error: Error | null;\n /** Refetch the query */\n refetch: () => Promise<void>;\n /** Total count (if pagination is used) */\n count?: number;\n /** Whether data is stale */\n isStale: boolean;\n /** Timestamp of last data update */\n dataUpdatedAt: number | null;\n}\n\n// =============================================================================\n// Helper Functions\n// =============================================================================\n\n/**\n * Build a query key for React Query\n *\n * Creates a stable, unique key for caching based on table and query options.\n * Keys are namespaced with \"v3\" to avoid collisions with V2 queries.\n *\n * NOTE: Backend is intentionally NOT included in the key. The data is the same\n * regardless of whether it comes from Supabase or PowerSync - switching backends\n * should NOT invalidate the cache. This is critical for offline-first UX.\n */\nfunction buildQueryKey(table: string, options: UseDbQueryOptions): unknown[] {\n return [\"v3\", \"query\", table, options.select ?? \"*\", JSON.stringify(options.where ?? {}), JSON.stringify(options.orderBy ?? []), options.limit, options.offset];\n}\n\n/**\n * Serialize query options for dependency tracking\n */\nfunction serializeQueryOptions(options: UseDbQueryOptions): string {\n return JSON.stringify({\n select: options.select,\n where: options.where,\n orderBy: options.orderBy,\n limit: options.limit,\n offset: options.offset\n });\n}\n\n// =============================================================================\n// Hook Implementation\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 * Hook for querying multiple records from a table\n *\n * This hook provides a unified interface for querying data that works\n * identically whether the backend is PowerSync (offline-first) or\n * Supabase (online-only). It uses React Query for caching and state management.\n *\n * Features:\n * - Automatic type inference from table names (when DatabaseTypes is augmented)\n * - Automatic backend selection based on DataLayerProvider configuration\n * - React Query integration for caching, deduplication, and background updates\n * - Optional real-time subscriptions (when adapter supports it)\n * - Pagination support with count\n *\n * @param table - Table name (string) or { schema, table } object\n * @param options - Query options (select, where, orderBy, limit, offset, etc.)\n * @returns Query result with data, loading states, error, and refetch function\n *\n * @example\n * // Basic query - types auto-inferred from table name\n * const { data } = useDbQuery(\"EquipmentFixtureUnit\");\n * // data is typed as Tables<\"EquipmentFixtureUnit\">[]\n *\n * @example\n * // Query from non-public schema\n * const { data } = useDbQuery({ schema: \"core\", table: \"Profile\" });\n * // data is typed as Tables<{ schema: \"core\" }, \"Profile\">[]\n *\n * @example\n * // Query with filters and sorting\n * const { data } = useDbQuery(\"Task\", {\n * select: \"*, Project(*)\",\n * where: { status: \"active\" },\n * orderBy: [{ field: \"createdAt\", direction: \"desc\" }],\n * limit: 10,\n * });\n */\n/**\n * Main hook signature with auto-inferred types from table identifiers\n */\nexport function useDbQuery<T extends TableIdentifier>(table: T, options?: UseDbQueryOptions): UseDbQueryResult<ResolveRowType<T>>;\n\n/**\n * Overload for explicit type parameter when table name is a string literal\n */\nexport function useDbQuery<T>(table: string, options?: UseDbQueryOptions): UseDbQueryResult<T>;\n\n// Implementation signature - uses any to satisfy both overloads\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function useDbQuery<T = any>(table: TableIdentifier | string, options: UseDbQueryOptions = {}): UseDbQueryResult<T> {\n const tableName = typeof table === \"string\" ? table : resolveTableName(table as TableIdentifier);\n const {\n registry,\n queryClient\n } = useDataLayerCore();\n const {\n status\n } = useDataLayerStatus();\n\n // Determine if using PowerSync (offline/SQLite) or Supabase (online)\n const isPowerSync = status.currentBackend === \"powersync\";\n\n // Backend-aware defaults:\n // - PowerSync: staleTime=0, refetchOnMount=\"always\" (SQLite is fast, always query disk)\n // - Supabase: staleTime=30000, refetchOnMount=true (use normal React Query caching)\n // - realtime: PowerSync=true (use watch() for live updates), Supabase=false (no streaming)\n const {\n enabled = true,\n staleTime = isPowerSync ? 0 : 30000,\n gcTime = 300000,\n // 5 minutes - keep in memory for instant display while refetching\n refetchOnWindowFocus = true,\n refetchOnMount = isPowerSync ? \"always\" : true,\n realtime = isPowerSync,\n // Enable real-time subscriptions by default for PowerSync\n ...queryOptions\n } = options;\n\n // Get adapter for this table\n const adapter = useMemo(() => {\n if (!status.isInitialized) return null;\n try {\n return registry.getAdapter(tableName);\n } catch {\n return null;\n }\n }, [registry, tableName, status.isInitialized, status.currentBackend]);\n\n // Build query key - memoized to prevent unnecessary re-renders\n // Backend is NOT included - cache persists across backend switches for offline-first UX\n const queryKey = useMemo(() => buildQueryKey(tableName, options), [tableName, serializeQueryOptions(options)]);\n\n // Memoize query options to prevent re-creating on every render\n const memoizedQueryOptions = useMemo(() => ({\n select: queryOptions.select,\n where: queryOptions.where,\n orderBy: queryOptions.orderBy,\n limit: queryOptions.limit,\n offset: queryOptions.offset\n }), [serializeQueryOptions(queryOptions)]);\n\n // Query function\n const queryFn = useCallback(async () => {\n if (!adapter) {\n throw new Error(`Adapter not available for table: ${tableName}`);\n }\n const result = await adapter.query(tableName, memoizedQueryOptions);\n return result;\n }, [adapter, tableName, memoizedQueryOptions]);\n\n // Execute query with React Query\n // Backend-aware caching strategy:\n // - PowerSync: SQLite is source of truth, always refetch from disk (it's fast)\n // - Supabase: Use normal React Query caching to avoid unnecessary network requests\n const query = useQuery({\n queryKey,\n queryFn,\n enabled: enabled && status.isInitialized && adapter !== null,\n staleTime,\n gcTime,\n refetchOnWindowFocus,\n refetchOnMount\n });\n\n // Set up real-time subscription if enabled\n useEffect(() => {\n if (!realtime || !adapter?.subscribe || !status.isInitialized) {\n return;\n }\n const unsubscribe = adapter.subscribe(tableName, memoizedQueryOptions, data => {\n // Check if query has relations (contains parentheses like \"Table(*)\")\n const hasRelations = memoizedQueryOptions.select?.includes(\"(\");\n if (hasRelations) {\n // Has relations - subscription returns flat data without nested relations\n // Invalidate to trigger a full refetch with relations\n queryClient.invalidateQueries({\n queryKey\n });\n } else {\n // No relations - safe to directly update cache with flat data\n queryClient.setQueryData(queryKey, {\n data,\n count: data.length\n });\n }\n });\n return () => {\n unsubscribe();\n };\n }, [realtime, adapter, tableName, memoizedQueryOptions, queryClient, queryKey, status.isInitialized]);\n\n // Build refetch function\n const refetch = useCallback(async () => {\n await query.refetch();\n }, [query]);\n return {\n data: query.data?.data as T[] | undefined,\n isLoading: query.isLoading,\n isPending: query.isPending,\n isFetching: query.isFetching,\n isRefetching: query.isFetching,\n // Alias for V2 compatibility\n isSuccess: query.isSuccess,\n isError: query.isError,\n error: query.error as Error | null,\n refetch,\n count: query.data?.count,\n isStale: query.isStale,\n dataUpdatedAt: query.dataUpdatedAt ?? null\n };\n}\nexport default useDbQuery;","/**\n * V3 useDbQueryById Hook\n *\n * React hook for querying a single record by ID from a table.\n * Works identically whether PowerSync or Supabase is the backend.\n * Uses React Query for state management and caching.\n */\n\nimport { useCallback, useMemo } from \"react\";\nimport { useQuery } from \"@tanstack/react-query\";\nimport { useDataLayerCore, useDataLayerStatus } from \"./useDataLayer\";\nimport type { WhereClause } from \"../core/types\";\n\n// =============================================================================\n// Types\n// =============================================================================\n\n/**\n * Options for useDbQueryById hook\n */\nexport interface UseDbQueryByIdOptions {\n /** Columns to select (Supabase-style select string) */\n select?: string;\n /** Whether the query is enabled (default: true if id is provided) */\n enabled?: boolean;\n /** React Query stale time in ms (default: 30000) */\n staleTime?: number;\n}\n\n/**\n * Result from useDbQueryById hook\n */\nexport interface UseDbQueryByIdResult<T> {\n /** Query data (undefined while loading, null if not found) */\n data: T | null | 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 /** Refetch the query */\n refetch: () => Promise<void>;\n}\n\n// =============================================================================\n// Helper Functions\n// =============================================================================\n\n/**\n * Build a query key for React Query\n *\n * Creates a stable, unique key for caching based on table, ID, and select.\n * Keys are namespaced with \"v3\" to avoid collisions with V2 queries.\n */\nfunction buildQueryKey(table: string, id: string | number | null | undefined, select?: string): unknown[] {\n return [\"v3\", \"queryById\", table, id, select ?? \"*\"];\n}\n\n// =============================================================================\n// Hook Implementation\n// =============================================================================\n\n/**\n * Hook for querying a single record by ID\n *\n * This hook provides a unified interface for fetching a single record that works\n * identically whether the backend is PowerSync (offline-first) or\n * Supabase (online-only). It uses React Query for caching and state management.\n *\n * Features:\n * - Automatic backend selection based on DataLayerProvider configuration\n * - React Query integration for caching, deduplication, and background updates\n * - Automatic disabling when ID is null/undefined\n * - Fallback to query with where clause if adapter doesn't support queryById\n * - Type-safe with generic type parameter\n *\n * @param table - The table name to query\n * @param id - The record ID (query is disabled if null/undefined)\n * @param options - Query options (select, enabled, staleTime)\n * @returns Query result with data, loading states, error, and refetch function\n *\n * @example\n * // Basic query by ID\n * const { data, isLoading, error } = useDbQueryById<Task>(\"Task\", taskId);\n *\n * @example\n * // Query with relations\n * const { data, isLoading, error } = useDbQueryById<Task>(\"Task\", taskId, {\n * select: \"*, Project(*), AssignedUser:User(*)\",\n * });\n *\n * @example\n * // Conditional query based on other state\n * const { data } = useDbQueryById<Project>(\"Project\", selectedProjectId, {\n * enabled: hasPermission && !!selectedProjectId,\n * });\n *\n * @example\n * // With custom stale time\n * const { data } = useDbQueryById<User>(\"User\", userId, {\n * staleTime: 60000, // 1 minute\n * });\n */\nexport function useDbQueryById<T = Record<string, unknown>>(table: string, id: string | number | null | undefined, options: UseDbQueryByIdOptions = {}): UseDbQueryByIdResult<T> {\n const {\n registry\n } = useDataLayerCore();\n const {\n status\n } = useDataLayerStatus();\n const {\n select,\n enabled = id != null,\n staleTime = 30000\n } = options;\n\n // Get adapter for this table\n const adapter = useMemo(() => {\n if (!status.isInitialized) return null;\n try {\n return registry.getAdapter(table);\n } catch {\n return null;\n }\n }, [registry, table, status.isInitialized, status.currentBackend]);\n\n // Build query key - memoized to prevent unnecessary re-renders\n const queryKey = useMemo(() => buildQueryKey(table, id, select), [table, id, select]);\n\n // Query function\n const queryFn = useCallback(async (): Promise<T | null> => {\n if (!adapter) {\n throw new Error(`Adapter not available for table: ${table}`);\n }\n if (id == null) {\n return null;\n }\n\n // Use queryById if available, otherwise fall back to query with where\n if (adapter.queryById) {\n return adapter.queryById<T>(table, String(id), {\n select\n });\n }\n\n // Fallback: use query with where clause\n const result = await adapter.query<T>(table, {\n select,\n where: {\n id\n } as WhereClause,\n limit: 1\n });\n return result.data[0] ?? null;\n }, [adapter, table, id, select]);\n\n // Execute query with React Query\n const query = useQuery({\n queryKey,\n queryFn,\n enabled: enabled && status.isInitialized && adapter !== null && id != null,\n staleTime\n });\n\n // Build refetch function\n const refetch = useCallback(async () => {\n await query.refetch();\n }, [query]);\n return {\n data: query.data,\n isLoading: query.isLoading,\n isPending: query.isPending,\n isFetching: query.isFetching,\n error: query.error as Error | null,\n refetch\n };\n}\nexport default useDbQueryById;","/**\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, useDataLayerStatus } 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\";\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 } = useDataLayerCore();\n const {\n status\n } = useDataLayerStatus();\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 = status.currentBackend === \"powersync\";\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), status.currentBackend], [tableName, select, where, filters, status.currentBackend]);\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 // 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, useMemo } from \"react\";\nimport { useMutation, useQueryClient } from \"@tanstack/react-query\";\nimport { useDataLayerCore, useDataLayerStatus } from \"./useDataLayer\";\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(28);\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 status\n } = useDataLayerStatus();\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 bb0: {\n if (!status.isInitialized) {\n t4 = null;\n break bb0;\n }\n try {\n let t5;\n if ($[5] !== registry || $[6] !== table) {\n t5 = registry.getAdapter(table);\n $[5] = registry;\n $[6] = table;\n $[7] = t5;\n } else {\n t5 = $[7];\n }\n t4 = t5;\n } catch {\n t4 = null;\n }\n }\n const adapter = t4;\n let t5;\n if ($[8] !== adapter || $[9] !== table) {\n t5 = async data => {\n if (!adapter) {\n throw new Error(`Adapter not available for table: ${table}`);\n }\n return adapter.insert(table, data);\n };\n $[8] = adapter;\n $[9] = table;\n $[10] = t5;\n } else {\n t5 = $[10];\n }\n const mutationFn = t5;\n let t6;\n if ($[11] !== invalidateTables || $[12] !== onSuccess || $[13] !== queryClient) {\n t6 = 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 $[11] = invalidateTables;\n $[12] = onSuccess;\n $[13] = queryClient;\n $[14] = t6;\n } else {\n t6 = $[14];\n }\n let t7;\n if ($[15] !== onError) {\n t7 = error => {\n onError?.(error instanceof Error ? error : new Error(String(error)));\n };\n $[15] = onError;\n $[16] = t7;\n } else {\n t7 = $[16];\n }\n let t8;\n if ($[17] !== mutationFn || $[18] !== t6 || $[19] !== t7) {\n t8 = {\n mutationFn,\n onSuccess: t6,\n onError: t7\n };\n $[17] = mutationFn;\n $[18] = t6;\n $[19] = t7;\n $[20] = t8;\n } else {\n t8 = $[20];\n }\n const mutation = useMutation(t8);\n const t9 = mutation.error as Error | null;\n let t10;\n if ($[21] !== mutation.data || $[22] !== mutation.isPending || $[23] !== mutation.mutate || $[24] !== mutation.mutateAsync || $[25] !== mutation.reset || $[26] !== t9) {\n t10 = {\n mutate: mutation.mutate,\n mutateAsync: mutation.mutateAsync,\n isPending: mutation.isPending,\n error: t9,\n reset: mutation.reset,\n data: mutation.data\n };\n $[21] = mutation.data;\n $[22] = mutation.isPending;\n $[23] = mutation.mutate;\n $[24] = mutation.mutateAsync;\n $[25] = mutation.reset;\n $[26] = t9;\n $[27] = t10;\n } else {\n t10 = $[27];\n }\n return t10;\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, useMemo } from \"react\";\nimport { useMutation, useQueryClient } from \"@tanstack/react-query\";\nimport { useDataLayerCore, useDataLayerStatus } from \"./useDataLayer\";\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(35);\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 status\n } = useDataLayerStatus();\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 bb0: {\n if (!status.isInitialized) {\n t5 = null;\n break bb0;\n }\n try {\n let t6;\n if ($[5] !== registry || $[6] !== table) {\n t6 = registry.getAdapter(table);\n $[5] = registry;\n $[6] = table;\n $[7] = t6;\n } else {\n t6 = $[7];\n }\n t5 = t6;\n } catch {\n t5 = null;\n }\n }\n const adapter = t5;\n let t6;\n if ($[8] !== adapter || $[9] !== table) {\n t6 = async params => {\n if (!adapter) {\n throw new Error(`Adapter not available for table: ${table}`);\n }\n return adapter.update(table, params.id, params.data);\n };\n $[8] = adapter;\n $[9] = table;\n $[10] = t6;\n } else {\n t6 = $[10];\n }\n const mutationFn = t6;\n let t7;\n if ($[11] !== optimistic || $[12] !== queryClient || $[13] !== table) {\n t7 = 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 $[11] = optimistic;\n $[12] = queryClient;\n $[13] = table;\n $[14] = t7;\n } else {\n t7 = $[14];\n }\n let t8;\n if ($[15] !== invalidateTables || $[16] !== onSuccess || $[17] !== queryClient) {\n t8 = 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 $[15] = invalidateTables;\n $[16] = onSuccess;\n $[17] = queryClient;\n $[18] = t8;\n } else {\n t8 = $[18];\n }\n let t9;\n if ($[19] !== onError || $[20] !== optimistic || $[21] !== queryClient) {\n t9 = (error, _variables, context) => {\n if (optimistic && context?.previousData) {\n context.previousData.forEach(t10 => {\n const [queryKey, data_0] = t10;\n queryClient.setQueryData(queryKey, data_0);\n });\n }\n onError?.(error instanceof Error ? error : new Error(String(error)));\n };\n $[19] = onError;\n $[20] = optimistic;\n $[21] = queryClient;\n $[22] = t9;\n } else {\n t9 = $[22];\n }\n let t10;\n if ($[23] !== mutationFn || $[24] !== t7 || $[25] !== t8 || $[26] !== t9) {\n t10 = {\n mutationFn,\n onMutate: t7,\n onSuccess: t8,\n onError: t9\n };\n $[23] = mutationFn;\n $[24] = t7;\n $[25] = t8;\n $[26] = t9;\n $[27] = t10;\n } else {\n t10 = $[27];\n }\n const mutation = useMutation(t10);\n const t11 = mutation.error as Error | null;\n let t12;\n if ($[28] !== mutation.data || $[29] !== mutation.isPending || $[30] !== mutation.mutate || $[31] !== mutation.mutateAsync || $[32] !== mutation.reset || $[33] !== t11) {\n t12 = {\n mutate: mutation.mutate,\n mutateAsync: mutation.mutateAsync,\n isPending: mutation.isPending,\n error: t11,\n reset: mutation.reset,\n data: mutation.data\n };\n $[28] = mutation.data;\n $[29] = mutation.isPending;\n $[30] = mutation.mutate;\n $[31] = mutation.mutateAsync;\n $[32] = mutation.reset;\n $[33] = t11;\n $[34] = t12;\n } else {\n t12 = $[34];\n }\n return t12;\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, useMemo } from \"react\";\nimport { useMutation, useQueryClient } from \"@tanstack/react-query\";\nimport { useDataLayerCore, useDataLayerStatus } from \"./useDataLayer\";\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(28);\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 status\n } = useDataLayerStatus();\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 bb0: {\n if (!status.isInitialized) {\n t4 = null;\n break bb0;\n }\n ;\n try {\n let t6;\n if ($[5] !== registry || $[6] !== table) {\n t6 = registry.getAdapter(table);\n $[5] = registry;\n $[6] = table;\n $[7] = t6;\n } else {\n t6 = $[7];\n }\n const resolvedAdapter = t6;\n t4 = resolvedAdapter;\n } catch (t5) {\n const error = t5;\n if (__DEV__) {\n console.warn(`[useDbUpsert] Failed to get adapter for table \"${table}\":`, error);\n }\n t4 = null;\n }\n }\n const adapter = t4;\n let t5;\n if ($[8] !== adapter || $[9] !== table) {\n t5 = async data => {\n if (__DEV__) {\n console.log(`[useDbUpsert] mutationFn called for table \"${table}\":`, {\n adapterName: adapter?.name ?? \"null\",\n dataKeys: Object.keys(data),\n hasId: \"id\" in data\n });\n }\n if (!adapter) {\n throw new Error(`Adapter not available for table: ${table}`);\n }\n const result = await adapter.upsert(table, data);\n if (__DEV__) {\n console.log(`[useDbUpsert] upsert completed for table \"${table}\":`, {\n adapterName: adapter.name,\n resultId: (result as Record<string, unknown>)?.id ?? \"unknown\"\n });\n }\n return result;\n };\n $[8] = adapter;\n $[9] = table;\n $[10] = t5;\n } else {\n t5 = $[10];\n }\n const mutationFn = t5;\n let t6;\n if ($[11] !== invalidateTables || $[12] !== onSuccess || $[13] !== queryClient) {\n t6 = 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 $[11] = invalidateTables;\n $[12] = onSuccess;\n $[13] = queryClient;\n $[14] = t6;\n } else {\n t6 = $[14];\n }\n let t7;\n if ($[15] !== onError) {\n t7 = error_0 => {\n onError?.(error_0 instanceof Error ? error_0 : new Error(String(error_0)));\n };\n $[15] = onError;\n $[16] = t7;\n } else {\n t7 = $[16];\n }\n let t8;\n if ($[17] !== mutationFn || $[18] !== t6 || $[19] !== t7) {\n t8 = {\n mutationFn,\n onSuccess: t6,\n onError: t7\n };\n $[17] = mutationFn;\n $[18] = t6;\n $[19] = t7;\n $[20] = t8;\n } else {\n t8 = $[20];\n }\n const mutation = useMutation(t8);\n const t9 = mutation.error as Error | null;\n let t10;\n if ($[21] !== mutation.data || $[22] !== mutation.isPending || $[23] !== mutation.mutate || $[24] !== mutation.mutateAsync || $[25] !== mutation.reset || $[26] !== t9) {\n t10 = {\n mutate: mutation.mutate,\n mutateAsync: mutation.mutateAsync,\n isPending: mutation.isPending,\n error: t9,\n reset: mutation.reset,\n data: mutation.data\n };\n $[21] = mutation.data;\n $[22] = mutation.isPending;\n $[23] = mutation.mutate;\n $[24] = mutation.mutateAsync;\n $[25] = mutation.reset;\n $[26] = t9;\n $[27] = t10;\n } else {\n t10 = $[27];\n }\n return t10;\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, useMemo } from \"react\";\nimport { useMutation, useQueryClient } from \"@tanstack/react-query\";\nimport { useDataLayerCore, useDataLayerStatus } from \"./useDataLayer\";\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(34);\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 status\n } = useDataLayerStatus();\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 bb0: {\n if (!status.isInitialized) {\n t5 = null;\n break bb0;\n }\n try {\n let t6;\n if ($[5] !== registry || $[6] !== table) {\n t6 = registry.getAdapter(table);\n $[5] = registry;\n $[6] = table;\n $[7] = t6;\n } else {\n t6 = $[7];\n }\n t5 = t6;\n } catch {\n t5 = null;\n }\n }\n const adapter = t5;\n let t6;\n if ($[8] !== adapter || $[9] !== table) {\n t6 = async id => {\n if (!adapter) {\n throw new Error(`Adapter not available for table: ${table}`);\n }\n await adapter.delete(table, id);\n };\n $[8] = adapter;\n $[9] = table;\n $[10] = t6;\n } else {\n t6 = $[10];\n }\n const mutationFn = t6;\n let t7;\n if ($[11] !== optimistic || $[12] !== queryClient || $[13] !== table) {\n t7 = 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 $[11] = optimistic;\n $[12] = queryClient;\n $[13] = table;\n $[14] = t7;\n } else {\n t7 = $[14];\n }\n let t8;\n if ($[15] !== invalidateTables || $[16] !== onSuccess || $[17] !== queryClient) {\n t8 = () => {\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 $[15] = invalidateTables;\n $[16] = onSuccess;\n $[17] = queryClient;\n $[18] = t8;\n } else {\n t8 = $[18];\n }\n let t9;\n if ($[19] !== onError || $[20] !== optimistic || $[21] !== queryClient) {\n t9 = (error, _id, context) => {\n if (optimistic && context?.previousData) {\n context.previousData.forEach(t10 => {\n const [queryKey, data] = t10;\n queryClient.setQueryData(queryKey, data);\n });\n }\n onError?.(error instanceof Error ? error : new Error(String(error)));\n };\n $[19] = onError;\n $[20] = optimistic;\n $[21] = queryClient;\n $[22] = t9;\n } else {\n t9 = $[22];\n }\n let t10;\n if ($[23] !== mutationFn || $[24] !== t7 || $[25] !== t8 || $[26] !== t9) {\n t10 = {\n mutationFn,\n onMutate: t7,\n onSuccess: t8,\n onError: t9\n };\n $[23] = mutationFn;\n $[24] = t7;\n $[25] = t8;\n $[26] = t9;\n $[27] = t10;\n } else {\n t10 = $[27];\n }\n const mutation = useMutation(t10);\n const t11 = mutation.error as Error | null;\n let t12;\n if ($[28] !== mutation.isPending || $[29] !== mutation.mutate || $[30] !== mutation.mutateAsync || $[31] !== mutation.reset || $[32] !== t11) {\n t12 = {\n mutate: mutation.mutate,\n mutateAsync: mutation.mutateAsync,\n isPending: mutation.isPending,\n error: t11,\n reset: mutation.reset\n };\n $[28] = mutation.isPending;\n $[29] = mutation.mutate;\n $[30] = mutation.mutateAsync;\n $[31] = mutation.reset;\n $[32] = t11;\n $[33] = t12;\n } else {\n t12 = $[33];\n }\n return t12;\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 } from \"react\";\nimport { useInfiniteQuery, InfiniteData } from \"@tanstack/react-query\";\nimport { useDataLayerCore, useDataLayerStatus } from \"./useDataLayer\";\nimport type { QueryOptions, WhereClause } from \"../core/types\";\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 status\n } = useDataLayerStatus();\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 const adapter = useMemo(() => {\n if (!status.isInitialized) return null;\n try {\n return registry.getAdapter(tableName);\n } catch {\n return null;\n }\n }, [registry, tableName, status.isInitialized, status.currentBackend]);\n\n // Build query key\n const queryKey = useMemo(() => buildInfiniteQueryKey(tableName, options), [tableName, serializeInfiniteQueryOptions(options)]);\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 // 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 if (!adapter) {\n throw new Error(`Adapter not available for table: ${tableName}`);\n }\n const offset = (pageParam - 1) * pageSize;\n const result = await adapter.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 && status.isInitialized && 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 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 } from \"react\";\nimport { useQuery } from \"@tanstack/react-query\";\nimport { useDataLayerCore, useDataLayerStatus } from \"./useDataLayer\";\nimport type { WhereClause } from \"../core/types\";\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(27);\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 status\n } = useDataLayerStatus();\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 bb0: {\n if (!status.isInitialized) {\n t4 = null;\n break bb0;\n }\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 }\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 let t7;\n if ($[10] !== adapter || $[11] !== table || $[12] !== where) {\n t7 = async () => {\n if (!adapter) {\n throw new Error(`Adapter not available for table: ${table}`);\n }\n const result = await adapter.query(table, {\n where,\n select: \"id\"\n });\n return result.count ?? result.data.length;\n };\n $[10] = adapter;\n $[11] = table;\n $[12] = where;\n $[13] = t7;\n } else {\n t7 = $[13];\n }\n const queryFn = t7;\n const t8 = enabled && status.isInitialized && 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 if ($[19] !== query) {\n t10 = async () => {\n await query.refetch();\n };\n $[19] = query;\n $[20] = t10;\n } else {\n t10 = $[20];\n }\n const refetch = t10;\n const t11 = query.error as Error | null;\n let t12;\n if ($[21] !== query.data || $[22] !== query.isFetching || $[23] !== query.isLoading || $[24] !== refetch || $[25] !== t11) {\n t12 = {\n count: query.data,\n isLoading: query.isLoading,\n isFetching: query.isFetching,\n error: t11,\n refetch\n };\n $[21] = query.data;\n $[22] = query.isFetching;\n $[23] = query.isLoading;\n $[24] = refetch;\n $[25] = t11;\n $[26] = t12;\n } else {\n t12 = $[26];\n }\n return t12;\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, useState, useCallback, useSyncExternalStore } from \"react\";\nimport { DataLayerStatusContext, DataLayerCoreContext } from \"../providers/DataLayerContext\";\nimport type { SyncControl, FailedUpload } from \"../core/types\";\n\n// Try to import from @pol-studios/powersync - this may not be available in all environments\nlet failedUploadStore: {\n getAll: () => FailedUpload[];\n clear: () => void;\n load: () => Promise<void>;\n} | null = null;\n\n// Dynamic import attempt - gracefully handles if powersync package is not available\ntry {\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const powersyncSync = require(\"@pol-studios/powersync/sync\");\n failedUploadStore = powersyncSync.failedUploadStore;\n} catch {\n // PowerSync sync module not available - will use no-op fallbacks\n}\n\n// Subscription tracking for useSyncExternalStore\nlet failedUploadListeners: Set<() => void> = new Set();\nlet cachedFailedUploads: FailedUpload[] = [];\n\n/**\n * Subscribe to failed upload store changes\n */\nfunction subscribeToFailedUploads(callback: () => void): () => void {\n failedUploadListeners.add(callback);\n return () => {\n failedUploadListeners.delete(callback);\n };\n}\n\n/**\n * Get current snapshot of failed uploads\n */\nfunction getFailedUploadsSnapshot(): FailedUpload[] {\n if (!failedUploadStore) {\n return [];\n }\n const uploads = failedUploadStore.getAll();\n // Only update cache if actually changed (referential equality check)\n if (uploads.length !== cachedFailedUploads.length || uploads.some((u, i) => u.id !== cachedFailedUploads[i]?.id)) {\n cachedFailedUploads = uploads;\n }\n return cachedFailedUploads;\n}\n\n/**\n * Notify all listeners of failed upload changes\n */\nfunction notifyFailedUploadListeners(): void {\n failedUploadListeners.forEach(listener => listener());\n}\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 * This hook uses the split context architecture - it subscribes to both\n * status (for syncControl) and core (for powerSync instance check).\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 *\n * @example Failed upload controls\n * const {\n * failedUploads,\n * retryFailedUploads,\n * clearFailedUploads,\n * pauseAutoRetry,\n * resumeAutoRetry,\n * isAutoRetryPaused\n * } = useSyncControl();\n *\n * // Show failed uploads count\n * console.log(`${failedUploads.length} uploads failed`);\n *\n * // Manually retry all failed uploads\n * await retryFailedUploads();\n *\n * // Discard all failed uploads\n * clearFailedUploads();\n */\nexport function useSyncControl() {\n const $ = _c(12);\n const statusContext = useContext(DataLayerStatusContext);\n const coreContext = useContext(DataLayerCoreContext);\n if (!statusContext || !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 status\n } = statusContext;\n const {\n powerSync\n } = coreContext;\n const [isAutoRetryPaused, setIsAutoRetryPaused] = useState(false);\n const failedUploads = useSyncExternalStore(subscribeToFailedUploads, getFailedUploadsSnapshot, _temp);\n let t0;\n if ($[0] !== powerSync || $[1] !== status.currentBackend || $[2] !== syncControl) {\n t0 = async () => {\n if (!powerSync || status.currentBackend !== \"powersync\") {\n console.warn(\"[useSyncControl] retryFailedUploads called but PowerSync is not available\");\n return;\n }\n if (!failedUploadStore) {\n console.warn(\"[useSyncControl] retryFailedUploads called but failedUploadStore is not available\");\n return;\n }\n failedUploadStore.clear();\n notifyFailedUploadListeners();\n await syncControl.triggerSync();\n };\n $[0] = powerSync;\n $[1] = status.currentBackend;\n $[2] = syncControl;\n $[3] = t0;\n } else {\n t0 = $[3];\n }\n const retryFailedUploads = t0;\n const clearFailedUploads = _temp2;\n let t1;\n if ($[4] === Symbol.for(\"react.memo_cache_sentinel\")) {\n t1 = () => {\n setIsAutoRetryPaused(true);\n console.log(\"[useSyncControl] Auto-retry paused\");\n };\n $[4] = t1;\n } else {\n t1 = $[4];\n }\n const pauseAutoRetry = t1;\n let t2;\n if ($[5] === Symbol.for(\"react.memo_cache_sentinel\")) {\n t2 = () => {\n setIsAutoRetryPaused(false);\n console.log(\"[useSyncControl] Auto-retry resumed\");\n };\n $[5] = t2;\n } else {\n t2 = $[5];\n }\n const resumeAutoRetry = t2;\n let t3;\n if ($[6] === Symbol.for(\"react.memo_cache_sentinel\")) {\n t3 = {\n triggerSync: _temp3,\n startLiveSync: _temp4,\n stopLiveSync: _temp5,\n setScope: _temp6,\n retryFailedUploads: _temp7,\n clearFailedUploads: _temp8,\n failedUploads: [],\n pauseAutoRetry: _temp9,\n resumeAutoRetry: _temp0,\n isAutoRetryPaused: false\n };\n $[6] = t3;\n } else {\n t3 = $[6];\n }\n const noOpControls = t3;\n let t4;\n bb0: {\n if (powerSync && status.currentBackend === \"powersync\") {\n let t5;\n if ($[7] !== failedUploads || $[8] !== isAutoRetryPaused || $[9] !== retryFailedUploads || $[10] !== syncControl) {\n t5 = {\n ...syncControl,\n retryFailedUploads,\n clearFailedUploads,\n failedUploads,\n pauseAutoRetry,\n resumeAutoRetry,\n isAutoRetryPaused\n };\n $[7] = failedUploads;\n $[8] = isAutoRetryPaused;\n $[9] = retryFailedUploads;\n $[10] = syncControl;\n $[11] = t5;\n } else {\n t5 = $[11];\n }\n t4 = t5;\n break bb0;\n }\n t4 = noOpControls;\n }\n const controls = t4;\n return controls;\n}\nfunction _temp0() {\n console.warn(\"[useSyncControl] resumeAutoRetry called but PowerSync is not available\");\n}\nfunction _temp9() {\n console.warn(\"[useSyncControl] pauseAutoRetry called but PowerSync is not available\");\n}\nfunction _temp8() {\n console.warn(\"[useSyncControl] clearFailedUploads called but PowerSync is not available\");\n}\nasync function _temp7() {\n console.warn(\"[useSyncControl] retryFailedUploads called but PowerSync is not available\");\n}\nasync function _temp6(_scopeName, _values) {\n console.warn(\"[useSyncControl] setScope called but PowerSync is not available\");\n}\nfunction _temp5() {\n console.warn(\"[useSyncControl] stopLiveSync called but PowerSync is not available\");\n}\nasync function _temp4() {\n console.warn(\"[useSyncControl] startLiveSync called but PowerSync is not available\");\n}\nasync function _temp3() {\n console.warn(\"[useSyncControl] triggerSync called but PowerSync is not available\");\n}\nfunction _temp2() {\n if (!failedUploadStore) {\n console.warn(\"[useSyncControl] clearFailedUploads called but failedUploadStore is not available\");\n return;\n }\n failedUploadStore.clear();\n notifyFailedUploadListeners();\n}\nfunction _temp() {\n return [];\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":["useCallback","useMemo","useQuery","buildQueryKey","useMemo","useCallback","useQuery","useCallback","useMemo","useEffect","useQuery","useMemo","useCallback","useQuery","result","useEffect","t5","_c","useMutation","useQueryClient","_c","useQueryClient","t6","t10","useMutation","_c","useMutation","useQueryClient","_c","useQueryClient","t6","t5","useMutation","_c","useMutation","useQueryClient","_c","useQueryClient","t6","t10","useMutation","useMemo","useCallback","resolveTableName","useMemo","useCallback","_c","useQuery","_c","t5","useQuery","_c","useState","useEffect","useContext","_c","useContext","useState","useEffect","_c","useContext","useState","_c","useContext","useState","_c","_c"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/query/select-parser.ts","../src/query/relationship-resolver.ts","../src/query/sql-builder.ts","../src/query/result-joiner.ts","../src/query/executor.ts"],"sourcesContent":["/**\n * Select String Parser\n *\n * Parses Supabase PostgREST select syntax into an AST for local SQLite processing.\n *\n * Supported Syntax:\n * - \"*\" -> All columns\n * - \"id, name, status\" -> Specific columns\n * - \"*, RelatedTable(*)\" -> All columns + relation\n * - \"id, RelatedTable(id, name)\" -> Specific + relation with specific columns\n * - \"*, Parent(*, Grandparent(name))\" -> Nested relations\n * - \"*, items:RelatedTable(*)\" -> Aliased relation\n * - \"aliasName:columnName\" -> Aliased column\n */\n\nimport type { ParsedSelect, SelectColumn, SelectRelation } from \"../core/types\";\n\n/**\n * Tokenize a string at the top level, respecting parentheses nesting.\n * Splits by comma but keeps nested parentheses intact.\n *\n * @example\n * tokenizeTopLevel(\"id, name, Parent(*, Child(name))\")\n * // Returns: [\"id\", \"name\", \"Parent(*, Child(name))\"]\n */\nfunction tokenizeTopLevel(input: string): string[] {\n const tokens: string[] = [];\n let current = \"\";\n let depth = 0;\n for (const char of input) {\n if (char === \"(\") {\n depth++;\n current += char;\n } else if (char === \")\") {\n depth--;\n current += char;\n } else if (char === \",\" && depth === 0) {\n const trimmed = current.trim();\n if (trimmed) {\n tokens.push(trimmed);\n }\n current = \"\";\n } else {\n current += char;\n }\n }\n\n // Add the last token\n const trimmed = current.trim();\n if (trimmed) {\n tokens.push(trimmed);\n }\n return tokens;\n}\n\n/**\n * Parse a single column token that may have an alias.\n *\n * @example\n * parseColumnToken(\"aliasName:columnName\") -> { name: \"columnName\", alias: \"aliasName\" }\n * parseColumnToken(\"columnName\") -> { name: \"columnName\" }\n */\nfunction parseColumnToken(token: string): SelectColumn {\n // Check for alias format: alias:column\n const aliasMatch = token.match(/^(\\w+):(\\w+)$/);\n if (aliasMatch) {\n return {\n name: aliasMatch[2],\n alias: aliasMatch[1]\n };\n }\n return {\n name: token\n };\n}\n\n/**\n * Parse a Supabase PostgREST select string into an AST.\n *\n * @param select - The select string (e.g., \"*, RelatedTable(*)\")\n * @returns Parsed select AST\n *\n * @example\n * parseSelect(\"*\")\n * // Returns: { columns: \"*\", relations: [] }\n *\n * parseSelect(\"id, name, status\")\n * // Returns: {\n * // columns: [{ name: \"id\" }, { name: \"name\" }, { name: \"status\" }],\n * // relations: []\n * // }\n *\n * parseSelect(\"*, EquipmentFixture(*)\")\n * // Returns: {\n * // columns: \"*\",\n * // relations: [{ name: \"EquipmentFixture\", columns: \"*\", relations: [] }]\n * // }\n *\n * parseSelect(\"id, name, ProjectDatabase(name, Organization(*))\")\n * // Returns: {\n * // columns: [{ name: \"id\" }, { name: \"name\" }],\n * // relations: [{\n * // name: \"ProjectDatabase\",\n * // columns: [{ name: \"name\" }],\n * // relations: [{ name: \"Organization\", columns: \"*\", relations: [] }]\n * // }]\n * // }\n */\nexport function parseSelect(select: string): ParsedSelect {\n const trimmed = select.trim();\n\n // Handle simple wildcard\n if (trimmed === \"*\") {\n return {\n columns: \"*\",\n relations: []\n };\n }\n\n // Handle empty string\n if (!trimmed) {\n return {\n columns: \"*\",\n relations: []\n };\n }\n const result: ParsedSelect = {\n columns: [],\n relations: []\n };\n\n // Tokenize at top level (respecting parentheses)\n const tokens = tokenizeTopLevel(trimmed);\n for (const token of tokens) {\n const trimmedToken = token.trim();\n if (!trimmedToken) {\n continue;\n }\n\n // Check if it's a relation: Name(...) or alias:Name(...)\n // Regex: optional alias followed by table name and parentheses with content\n const relationMatch = trimmedToken.match(/^(?:(\\w+):)?(\\w+)\\((.+)\\)$/);\n if (relationMatch) {\n const alias = relationMatch[1];\n const name = relationMatch[2];\n const innerSelect = relationMatch[3];\n\n // Recursively parse inner select\n const innerParsed = parseSelect(innerSelect);\n result.relations.push({\n name,\n alias,\n columns: innerParsed.columns,\n relations: innerParsed.relations\n });\n } else if (trimmedToken === \"*\") {\n // Wildcard - all columns\n result.columns = \"*\";\n } else {\n // It's a column, possibly with alias\n const column = parseColumnToken(trimmedToken);\n\n // Only add to columns array if we haven't set \"*\" already\n if (result.columns !== \"*\") {\n (result.columns as SelectColumn[]).push(column);\n }\n }\n }\n\n // If no explicit columns were added but we have relations, default to \"*\"\n if (Array.isArray(result.columns) && result.columns.length === 0) {\n result.columns = \"*\";\n }\n return result;\n}\n\n/**\n * Convert a parsed select back to a string representation (for debugging)\n */\nexport function stringifySelect(parsed: ParsedSelect): string {\n const parts: string[] = [];\n\n // Add columns\n if (parsed.columns === \"*\") {\n parts.push(\"*\");\n } else {\n for (const col of parsed.columns) {\n if (col.alias) {\n parts.push(`${col.alias}:${col.name}`);\n } else {\n parts.push(col.name);\n }\n }\n }\n\n // Add relations\n for (const rel of parsed.relations) {\n const innerStr = stringifySelect({\n columns: rel.columns,\n relations: rel.relations\n });\n if (rel.alias) {\n parts.push(`${rel.alias}:${rel.name}(${innerStr})`);\n } else {\n parts.push(`${rel.name}(${innerStr})`);\n }\n }\n return parts.join(\", \");\n}\n\n/**\n * Extract all column names from a parsed select (for building SQL queries)\n * Does not include relation names.\n */\nexport function extractColumnNames(parsed: ParsedSelect): string[] | \"*\" {\n if (parsed.columns === \"*\") {\n return \"*\";\n }\n return parsed.columns.map(col => col.name);\n}\n\n/**\n * Extract all relation names from a parsed select\n */\nexport function extractRelationNames(parsed: ParsedSelect): string[] {\n return parsed.relations.map(rel => rel.alias ?? rel.name);\n}\n\n/**\n * Check if a select string references a specific relation\n */\nexport function hasRelation(parsed: ParsedSelect, relationName: string): boolean {\n return parsed.relations.some(rel => rel.name === relationName || rel.alias === relationName);\n}\n\n/**\n * Get the select configuration for a specific relation\n */\nexport function getRelationSelect(parsed: ParsedSelect, relationName: string): SelectRelation | undefined {\n return parsed.relations.find(rel => rel.name === relationName || rel.alias === relationName);\n}\n\n// Export the helper function for testing\nexport { tokenizeTopLevel };","/**\n * Relationship Resolver\n *\n * Looks up relationships between tables from the database schema.\n * Used to determine how to join related data in queries.\n */\n\nimport type { DatabaseSchema, TableSchema, RelationshipInfo, RelationshipType, ResolvedRelationship } from \"../core/types\";\n\n/**\n * Resolves relationships between tables using the database schema.\n *\n * Given a table and a relation name (which could be another table),\n * this class determines:\n * 1. Whether a relationship exists\n * 2. The type of relationship (one-to-many or many-to-one)\n * 3. Which columns are used for the join\n */\nexport class RelationshipResolver {\n constructor(private schema: DatabaseSchema) {}\n\n /**\n * Resolve a relationship from one table to another.\n *\n * This handles both:\n * - Forward relationships: This table has a FK to the related table (many-to-one)\n * - Reverse relationships: Related table has a FK to this table (one-to-many)\n *\n * @param fromTable - The table we're querying from\n * @param relationName - The name of the related table\n * @returns The resolved relationship or null if not found\n *\n * @example\n * // Forward relationship (many-to-one)\n * // EquipmentUnit.projectDatabaseId -> ProjectDatabase.id\n * resolver.resolve(\"EquipmentUnit\", \"ProjectDatabase\")\n * // Returns: {\n * // type: \"many-to-one\",\n * // fromTable: \"EquipmentUnit\",\n * // toTable: \"ProjectDatabase\",\n * // foreignKey: \"projectDatabaseId\",\n * // referencedColumn: \"id\"\n * // }\n *\n * @example\n * // Reverse relationship (one-to-many)\n * // EquipmentUnit <- EquipmentFixture.equipmentUnitId\n * resolver.resolve(\"EquipmentUnit\", \"EquipmentFixture\")\n * // Returns: {\n * // type: \"one-to-many\",\n * // fromTable: \"EquipmentUnit\",\n * // toTable: \"EquipmentFixture\",\n * // foreignKey: \"equipmentUnitId\",\n * // referencedColumn: \"id\"\n * // }\n */\n resolve(fromTable: string, relationName: string): ResolvedRelationship | null {\n const tableSchema = this.getTableSchema(fromTable);\n if (!tableSchema) {\n return null;\n }\n\n // Check forward relationships (this table has the FK)\n // e.g., EquipmentUnit.projectDatabaseId -> ProjectDatabase\n for (const rel of tableSchema.relationships) {\n if (rel.referencedTable === relationName) {\n return {\n type: \"many-to-one\",\n fromTable,\n toTable: relationName,\n foreignKey: rel.foreignKey,\n referencedColumn: rel.referencedColumn\n };\n }\n }\n\n // Check reverse relationships (other table has FK to this table)\n // e.g., EquipmentUnit <- EquipmentFixture.equipmentUnitId\n const relatedTableSchema = this.getTableSchema(relationName);\n if (relatedTableSchema) {\n for (const rel of relatedTableSchema.relationships) {\n if (rel.referencedTable === fromTable) {\n return {\n type: \"one-to-many\",\n fromTable,\n toTable: relationName,\n foreignKey: rel.foreignKey,\n referencedColumn: rel.referencedColumn\n };\n }\n }\n }\n return null;\n }\n\n /**\n * Get all forward relationships for a table (many-to-one).\n * These are relationships where this table has a foreign key.\n */\n getForwardRelationships(tableName: string): ResolvedRelationship[] {\n const tableSchema = this.getTableSchema(tableName);\n if (!tableSchema) {\n return [];\n }\n return tableSchema.relationships.map(rel => ({\n type: \"many-to-one\" as RelationshipType,\n fromTable: tableName,\n toTable: rel.referencedTable,\n foreignKey: rel.foreignKey,\n referencedColumn: rel.referencedColumn\n }));\n }\n\n /**\n * Get all reverse relationships for a table (one-to-many).\n * These are relationships where other tables have FKs pointing to this table.\n */\n getReverseRelationships(tableName: string): ResolvedRelationship[] {\n const results: ResolvedRelationship[] = [];\n\n // Search all tables for FKs pointing to this table\n for (const schemaName of Object.keys(this.schema.schemas)) {\n const schemaDefinition = this.schema.schemas[schemaName];\n if (!schemaDefinition) continue;\n for (const [otherTableName, otherTableSchema] of Object.entries(schemaDefinition.tables)) {\n if (otherTableName === tableName) continue;\n for (const rel of otherTableSchema.relationships) {\n if (rel.referencedTable === tableName) {\n results.push({\n type: \"one-to-many\",\n fromTable: tableName,\n toTable: otherTableName,\n foreignKey: rel.foreignKey,\n referencedColumn: rel.referencedColumn\n });\n }\n }\n }\n }\n return results;\n }\n\n /**\n * Get all relationships for a table (both directions).\n */\n getAllRelationships(tableName: string): ResolvedRelationship[] {\n return [...this.getForwardRelationships(tableName), ...this.getReverseRelationships(tableName)];\n }\n\n /**\n * Check if a relationship exists between two tables.\n */\n hasRelationship(fromTable: string, toTable: string): boolean {\n return this.resolve(fromTable, toTable) !== null;\n }\n\n /**\n * Get the table schema from the database schema.\n * Searches across all schema namespaces (public, core, etc.).\n */\n getTableSchema(tableName: string): TableSchema | null {\n // Check each schema namespace\n for (const schemaName of Object.keys(this.schema.schemas)) {\n const schemaDefinition = this.schema.schemas[schemaName];\n if (!schemaDefinition) continue;\n\n // Check tables\n if (schemaDefinition.tables[tableName]) {\n return schemaDefinition.tables[tableName];\n }\n\n // Check views\n if (schemaDefinition.views && schemaDefinition.views[tableName]) {\n return schemaDefinition.views[tableName];\n }\n }\n return null;\n }\n\n /**\n * Get the primary key column for a table.\n * Defaults to \"id\" if not explicitly found.\n */\n getPrimaryKey(tableName: string): string {\n const tableSchema = this.getTableSchema(tableName);\n if (!tableSchema) {\n return \"id\";\n }\n\n // Look for an 'id' column (most common case)\n const idColumn = tableSchema.columns.find(col => col.name === \"id\");\n if (idColumn) {\n return \"id\";\n }\n\n // Fall back to first column (usually the primary key)\n if (tableSchema.columns.length > 0) {\n return tableSchema.columns[0].name;\n }\n return \"id\";\n }\n\n /**\n * Get all column names for a table.\n */\n getColumnNames(tableName: string): string[] {\n const tableSchema = this.getTableSchema(tableName);\n if (!tableSchema) {\n return [];\n }\n return tableSchema.columns.map(col => col.name);\n }\n\n /**\n * Check if a table exists in the schema.\n */\n hasTable(tableName: string): boolean {\n return this.getTableSchema(tableName) !== null;\n }\n\n /**\n * Get all table names in the schema.\n */\n getAllTableNames(): string[] {\n const tables: string[] = [];\n for (const schemaName of Object.keys(this.schema.schemas)) {\n const schemaDefinition = this.schema.schemas[schemaName];\n if (!schemaDefinition) continue;\n tables.push(...Object.keys(schemaDefinition.tables));\n }\n return tables;\n }\n}\n\n/**\n * Create a relationship resolver instance.\n * Convenience function for creating a resolver.\n */\nexport function createRelationshipResolver(schema: DatabaseSchema): RelationshipResolver {\n return new RelationshipResolver(schema);\n}","/**\n * SQL Builder\n *\n * Builds SQLite queries from parsed select statements and query options.\n * Produces parameterized queries for safe execution against PowerSync's local SQLite.\n *\n * Note: SQLite uses double quotes for identifiers (table/column names).\n * This builder only creates queries for single tables - relations are queried\n * separately and joined in code.\n */\n\nimport type { BuiltQuery, SelectColumn, WhereClause, WhereOperators, OrderBy } from \"../core/types\";\n\n/**\n * Check if a value is a where operator object\n */\nfunction isWhereOperator(value: unknown): value is WhereOperators {\n if (value === null || typeof value !== \"object\") {\n return false;\n }\n const obj = value as Record<string, unknown>;\n return \"in\" in obj || \"gt\" in obj || \"gte\" in obj || \"lt\" in obj || \"lte\" in obj || \"like\" in obj || \"is\" in obj || \"neq\" in obj || \"notIn\" in obj;\n}\n\n/**\n * SQLite query builder.\n * Creates parameterized SQL queries for local SQLite execution.\n */\nexport class SQLBuilder {\n /**\n * Build a SELECT query for a single table.\n *\n * @param table - Table name\n * @param columns - Columns to select (\"*\" or array of column definitions)\n * @param options - Query options (where, orderBy, limit, offset)\n * @returns Built query with SQL and parameters\n *\n * @example\n * const builder = new SQLBuilder();\n * const query = builder.build(\"EquipmentUnit\", \"*\", {\n * where: { status: \"active\", projectDatabaseId: 123 },\n * orderBy: [{ field: \"name\", direction: \"asc\" }],\n * limit: 10\n * });\n * // query.sql: SELECT * FROM \"EquipmentUnit\" WHERE \"status\" = ? AND \"projectDatabaseId\" = ? ORDER BY \"name\" ASC LIMIT ?\n * // query.params: [\"active\", 123, 10]\n */\n build(table: string, columns: \"*\" | SelectColumn[], options: {\n where?: WhereClause;\n orderBy?: OrderBy[];\n limit?: number;\n offset?: number;\n } = {}): BuiltQuery {\n const params: (string | number | boolean | null)[] = [];\n\n // Build SELECT clause\n let columnList: string;\n if (columns === \"*\") {\n columnList = \"*\";\n } else if (columns.length === 0) {\n columnList = \"*\";\n } else {\n columnList = columns.map(c => {\n if (c.alias) {\n return `\"${c.name}\" AS \"${c.alias}\"`;\n }\n return `\"${c.name}\"`;\n }).join(\", \");\n }\n let sql = `SELECT ${columnList} FROM \"${table}\"`;\n\n // Build WHERE clause\n if (options.where && Object.keys(options.where).length > 0) {\n const whereClauses: string[] = [];\n for (const [field, value] of Object.entries(options.where)) {\n if (value === null) {\n // Direct null check\n whereClauses.push(`\"${field}\" IS NULL`);\n } else if (isWhereOperator(value)) {\n // Handle operator objects\n const operatorClauses = this.buildOperatorClauses(field, value, params);\n whereClauses.push(...operatorClauses);\n } else {\n // Simple equality\n whereClauses.push(`\"${field}\" = ?`);\n params.push(value as string | number | boolean);\n }\n }\n if (whereClauses.length > 0) {\n sql += ` WHERE ${whereClauses.join(\" AND \")}`;\n }\n }\n\n // Build ORDER BY clause\n if (options.orderBy && options.orderBy.length > 0) {\n const orderClauses = options.orderBy.map(o => `\"${o.field}\" ${o.direction.toUpperCase()}`);\n sql += ` ORDER BY ${orderClauses.join(\", \")}`;\n }\n\n // Build LIMIT clause\n if (options.limit !== undefined) {\n sql += ` LIMIT ?`;\n params.push(options.limit);\n }\n\n // Build OFFSET clause\n if (options.offset !== undefined) {\n sql += ` OFFSET ?`;\n params.push(options.offset);\n }\n return {\n sql,\n params\n };\n }\n\n /**\n * Build WHERE clauses from operator objects.\n */\n private buildOperatorClauses(field: string, operators: WhereOperators, params: (string | number | boolean | null)[]): string[] {\n const clauses: string[] = [];\n if (\"in\" in operators && operators.in !== undefined) {\n if (operators.in.length === 0) {\n // Empty IN clause - always false\n clauses.push(\"1 = 0\");\n } else {\n const placeholders = operators.in.map(() => \"?\").join(\", \");\n clauses.push(`\"${field}\" IN (${placeholders})`);\n params.push(...operators.in);\n }\n }\n if (\"notIn\" in operators && operators.notIn !== undefined) {\n if (operators.notIn.length === 0) {\n // Empty NOT IN clause - always true, skip\n } else {\n const placeholders = operators.notIn.map(() => \"?\").join(\", \");\n clauses.push(`\"${field}\" NOT IN (${placeholders})`);\n params.push(...operators.notIn);\n }\n }\n if (\"gt\" in operators && operators.gt !== undefined) {\n clauses.push(`\"${field}\" > ?`);\n params.push(operators.gt);\n }\n if (\"gte\" in operators && operators.gte !== undefined) {\n clauses.push(`\"${field}\" >= ?`);\n params.push(operators.gte);\n }\n if (\"lt\" in operators && operators.lt !== undefined) {\n clauses.push(`\"${field}\" < ?`);\n params.push(operators.lt);\n }\n if (\"lte\" in operators && operators.lte !== undefined) {\n clauses.push(`\"${field}\" <= ?`);\n params.push(operators.lte);\n }\n if (\"like\" in operators && operators.like !== undefined) {\n clauses.push(`\"${field}\" LIKE ?`);\n // Add wildcards if not already present\n const pattern = operators.like.includes(\"%\") ? operators.like : `%${operators.like}%`;\n params.push(pattern);\n }\n if (\"is\" in operators && operators.is === null) {\n clauses.push(`\"${field}\" IS NULL`);\n }\n if (\"neq\" in operators && operators.neq !== undefined) {\n if (operators.neq === null) {\n clauses.push(`\"${field}\" IS NOT NULL`);\n } else {\n clauses.push(`\"${field}\" != ?`);\n params.push(operators.neq);\n }\n }\n return clauses;\n }\n\n /**\n * Build a query to fetch related records by foreign key.\n *\n * @param table - The related table name\n * @param foreignKey - The FK column to match against\n * @param parentIds - Array of parent IDs to fetch related records for\n * @param columns - Columns to select\n * @returns Built query\n *\n * @example\n * // Fetch all EquipmentFixtures for given EquipmentUnit IDs\n * const query = builder.buildRelationQuery(\n * \"EquipmentFixture\",\n * \"equipmentUnitId\",\n * [\"uuid-1\", \"uuid-2\"],\n * \"*\"\n * );\n * // query.sql: SELECT * FROM \"EquipmentFixture\" WHERE \"equipmentUnitId\" IN (?, ?)\n * // query.params: [\"uuid-1\", \"uuid-2\"]\n */\n buildRelationQuery(table: string, foreignKey: string, parentIds: (string | number)[], columns: \"*\" | SelectColumn[]): BuiltQuery {\n // Handle empty parent IDs\n if (parentIds.length === 0) {\n return {\n sql: `SELECT ${columns === \"*\" ? \"*\" : this.buildColumnList(columns, foreignKey)} FROM \"${table}\" WHERE 1 = 0`,\n params: []\n };\n }\n\n // Build column list, ensuring FK is included for joining\n let columnList: string;\n if (columns === \"*\") {\n columnList = \"*\";\n } else {\n columnList = this.buildColumnList(columns, foreignKey);\n }\n const placeholders = parentIds.map(() => \"?\").join(\", \");\n const sql = `SELECT ${columnList} FROM \"${table}\" WHERE \"${foreignKey}\" IN (${placeholders})`;\n return {\n sql,\n params: [...parentIds]\n };\n }\n\n /**\n * Build column list ensuring the foreign key is included.\n */\n private buildColumnList(columns: SelectColumn[], foreignKey: string): string {\n const colNames = columns.map(c => c.name);\n\n // Always include the foreign key for joining\n const columnList = columns.map(c => {\n if (c.alias) {\n return `\"${c.name}\" AS \"${c.alias}\"`;\n }\n return `\"${c.name}\"`;\n });\n\n // Add FK if not already present\n if (!colNames.includes(foreignKey)) {\n columnList.unshift(`\"${foreignKey}\"`);\n }\n return columnList.join(\", \");\n }\n\n /**\n * Build a SELECT query for a single record by ID.\n *\n * @param table - Table name\n * @param id - Record ID\n * @param columns - Columns to select\n * @param idColumn - Name of the ID column (defaults to \"id\")\n * @returns Built query\n */\n buildByIdQuery(table: string, id: string | number, columns: \"*\" | SelectColumn[] = \"*\", idColumn: string = \"id\"): BuiltQuery {\n let columnList: string;\n if (columns === \"*\") {\n columnList = \"*\";\n } else if (columns.length === 0) {\n columnList = \"*\";\n } else {\n columnList = columns.map(c => c.alias ? `\"${c.name}\" AS \"${c.alias}\"` : `\"${c.name}\"`).join(\", \");\n }\n const sql = `SELECT ${columnList} FROM \"${table}\" WHERE \"${idColumn}\" = ? LIMIT 1`;\n return {\n sql,\n params: [id]\n };\n }\n\n /**\n * Build an INSERT query.\n *\n * @param table - Table name\n * @param data - Record data to insert\n * @returns Built query\n */\n buildInsertQuery(table: string, data: Record<string, unknown>): BuiltQuery {\n const columns = Object.keys(data).filter(k => data[k] !== undefined);\n const values = columns.map(k => data[k]);\n if (columns.length === 0) {\n throw new Error(\"Cannot insert empty record\");\n }\n const columnList = columns.map(c => `\"${c}\"`).join(\", \");\n const placeholders = columns.map(() => \"?\").join(\", \");\n const sql = `INSERT INTO \"${table}\" (${columnList}) VALUES (${placeholders})`;\n return {\n sql,\n params: values as (string | number | boolean | null)[]\n };\n }\n\n /**\n * Build an UPDATE query.\n *\n * @param table - Table name\n * @param id - Record ID\n * @param data - Fields to update\n * @param idColumn - Name of the ID column (defaults to \"id\")\n * @returns Built query\n */\n buildUpdateQuery(table: string, id: string | number, data: Record<string, unknown>, idColumn: string = \"id\"): BuiltQuery {\n const columns = Object.keys(data).filter(k => k !== idColumn && data[k] !== undefined);\n if (columns.length === 0) {\n throw new Error(\"No fields to update\");\n }\n const setClauses = columns.map(c => `\"${c}\" = ?`).join(\", \");\n const values = columns.map(k => data[k]);\n const sql = `UPDATE \"${table}\" SET ${setClauses} WHERE \"${idColumn}\" = ?`;\n return {\n sql,\n params: [...(values as (string | number | boolean | null)[]), id]\n };\n }\n\n /**\n * Build a DELETE query.\n *\n * @param table - Table name\n * @param id - Record ID\n * @param idColumn - Name of the ID column (defaults to \"id\")\n * @returns Built query\n */\n buildDeleteQuery(table: string, id: string | number, idColumn: string = \"id\"): BuiltQuery {\n const sql = `DELETE FROM \"${table}\" WHERE \"${idColumn}\" = ?`;\n return {\n sql,\n params: [id]\n };\n }\n\n /**\n * Build a COUNT query.\n *\n * @param table - Table name\n * @param where - Optional where clause\n * @returns Built query\n */\n buildCountQuery(table: string, where?: WhereClause): BuiltQuery {\n const params: (string | number | boolean | null)[] = [];\n let sql = `SELECT COUNT(*) as count FROM \"${table}\"`;\n if (where && Object.keys(where).length > 0) {\n const whereClauses: string[] = [];\n for (const [field, value] of Object.entries(where)) {\n if (value === null) {\n whereClauses.push(`\"${field}\" IS NULL`);\n } else if (isWhereOperator(value)) {\n const operatorClauses = this.buildOperatorClauses(field, value, params);\n whereClauses.push(...operatorClauses);\n } else {\n whereClauses.push(`\"${field}\" = ?`);\n params.push(value as string | number | boolean);\n }\n }\n if (whereClauses.length > 0) {\n sql += ` WHERE ${whereClauses.join(\" AND \")}`;\n }\n }\n return {\n sql,\n params\n };\n }\n}\n\n/**\n * Create a new SQL builder instance.\n */\nexport function createSQLBuilder(): SQLBuilder {\n return new SQLBuilder();\n}","/**\n * Result Joiner\n *\n * After querying the base table and related tables separately,\n * this module joins them into a nested structure matching Supabase's format.\n */\n\nimport type { ResolvedRelationship } from \"../core/types\";\n\n/**\n * Data about a relation to be joined onto base records.\n */\nexport interface RelationJoinData {\n records: Record<string, unknown>[];\n relationship: ResolvedRelationship;\n nestedRelations: Map<string, RelationJoinData>;\n}\n\n/**\n * Result joiner for combining base records with related data.\n *\n * This class handles joining related data onto base records after\n * separate queries have been executed. It supports:\n * - One-to-many relationships (base gets array of related)\n * - Many-to-one relationships (base gets single related object or null)\n * - Nested relationships (recursive joining)\n */\nexport class ResultJoiner {\n /**\n * Join related data onto base records.\n *\n * @param baseRecords - The base table records\n * @param relatedRecords - Records from the related table\n * @param relationship - The relationship definition\n * @param relationName - The property name to use for the relation\n * @returns Base records with related data attached\n *\n * @example\n * // One-to-many: EquipmentUnit -> EquipmentFixture[]\n * const joiner = new ResultJoiner();\n * const result = joiner.join(\n * equipmentUnits,\n * equipmentFixtures,\n * { type: \"one-to-many\", foreignKey: \"equipmentUnitId\", referencedColumn: \"id\", ... },\n * \"EquipmentFixture\"\n * );\n * // Each equipmentUnit now has EquipmentFixture: [...]\n *\n * @example\n * // Many-to-one: EquipmentUnit -> ProjectDatabase\n * const result = joiner.join(\n * equipmentUnits,\n * projectDatabases,\n * { type: \"many-to-one\", foreignKey: \"projectDatabaseId\", referencedColumn: \"id\", ... },\n * \"ProjectDatabase\"\n * );\n * // Each equipmentUnit now has ProjectDatabase: {...} or null\n */\n join<T extends Record<string, unknown>>(baseRecords: T[], relatedRecords: Record<string, unknown>[], relationship: ResolvedRelationship, relationName: string): T[] {\n if (baseRecords.length === 0) {\n return baseRecords;\n }\n if (relationship.type === \"one-to-many\") {\n // Each base record gets an array of related records\n // The related table has a FK pointing to the base table\n // e.g., EquipmentFixture.equipmentUnitId -> EquipmentUnit.id\n return baseRecords.map(base => {\n const baseId = base[relationship.referencedColumn];\n const related = relatedRecords.filter(r => r[relationship.foreignKey] === baseId);\n return {\n ...base,\n [relationName]: related\n };\n });\n } else {\n // Many-to-one: Each base record gets a single related object or null\n // The base table has a FK pointing to the related table\n // e.g., EquipmentUnit.projectDatabaseId -> ProjectDatabase.id\n\n // Build a lookup map for faster joining\n const relatedMap = new Map<unknown, Record<string, unknown>>();\n for (const r of relatedRecords) {\n const refValue = r[relationship.referencedColumn];\n if (refValue !== null && refValue !== undefined) {\n relatedMap.set(refValue, r);\n }\n }\n return baseRecords.map(base => {\n const fkValue = base[relationship.foreignKey];\n const related = fkValue != null ? relatedMap.get(fkValue) ?? null : null;\n return {\n ...base,\n [relationName]: related\n };\n });\n }\n }\n\n /**\n * Recursively join nested relations onto records.\n *\n * @param baseRecords - The base records\n * @param relationData - Map of relation names to join data\n * @returns Base records with all nested relations attached\n *\n * @example\n * // Join EquipmentFixture and ProjectDatabase onto EquipmentUnit\n * // where EquipmentFixture has its own nested Organization relation\n * const result = joiner.joinNested(equipmentUnits, new Map([\n * [\"EquipmentFixture\", {\n * records: fixtures,\n * relationship: { type: \"one-to-many\", ... },\n * nestedRelations: new Map()\n * }],\n * [\"ProjectDatabase\", {\n * records: projects,\n * relationship: { type: \"many-to-one\", ... },\n * nestedRelations: new Map([\n * [\"Organization\", { records: orgs, relationship: ..., nestedRelations: new Map() }]\n * ])\n * }]\n * ]));\n */\n joinNested<T extends Record<string, unknown>>(baseRecords: T[], relationData: Map<string, RelationJoinData>): T[] {\n let result = [...baseRecords];\n const entries = Array.from(relationData.entries());\n for (const [relationName, data] of entries) {\n // First, recursively join nested relations onto the related records\n let relatedRecords = data.records;\n if (data.nestedRelations.size > 0) {\n relatedRecords = this.joinNested(relatedRecords, data.nestedRelations);\n }\n\n // Then join the related records onto the base records\n result = this.join(result, relatedRecords, data.relationship, relationName);\n }\n return result;\n }\n\n /**\n * Group records by a key field.\n * Useful for preparing data before joining.\n *\n * @param records - Records to group\n * @param keyField - Field to group by\n * @returns Map of key values to arrays of records\n */\n groupBy<T extends Record<string, unknown>>(records: T[], keyField: string): Map<unknown, T[]> {\n const groups = new Map<unknown, T[]>();\n for (const record of records) {\n const key = record[keyField];\n if (!groups.has(key)) {\n groups.set(key, []);\n }\n groups.get(key)!.push(record);\n }\n return groups;\n }\n\n /**\n * Index records by a unique key field.\n * Useful for many-to-one lookups.\n *\n * @param records - Records to index\n * @param keyField - Field to index by (should be unique)\n * @returns Map of key values to single records\n */\n indexBy<T extends Record<string, unknown>>(records: T[], keyField: string): Map<unknown, T> {\n const index = new Map<unknown, T>();\n for (const record of records) {\n const key = record[keyField];\n if (key !== null && key !== undefined) {\n index.set(key, record);\n }\n }\n return index;\n }\n\n /**\n * Extract unique values for a field from records.\n * Useful for building IN clauses for related queries.\n *\n * @param records - Records to extract from\n * @param field - Field to extract\n * @returns Array of unique non-null values\n */\n extractUniqueValues<T extends Record<string, unknown>>(records: T[], field: string): (string | number)[] {\n const values = new Set<string | number>();\n for (const record of records) {\n const value = record[field];\n if (value !== null && value !== undefined) {\n values.add(value as string | number);\n }\n }\n return Array.from(values);\n }\n\n /**\n * Remove a relation property from records (for cleanup).\n *\n * @param records - Records to process\n * @param relationName - Relation property to remove\n * @returns Records without the specified property\n */\n removeRelation<T extends Record<string, unknown>>(records: T[], relationName: string): Omit<T, typeof relationName>[] {\n return records.map(record => {\n const {\n [relationName]: _removed,\n ...rest\n } = record;\n return rest as Omit<T, typeof relationName>;\n });\n }\n\n /**\n * Flatten a nested relation into the parent record.\n * Useful for flattening many-to-one relations.\n *\n * @param records - Records with nested relation\n * @param relationName - Name of the relation to flatten\n * @param prefix - Prefix for flattened field names\n * @returns Records with flattened relation fields\n */\n flattenRelation<T extends Record<string, unknown>>(records: T[], relationName: string, prefix: string = \"\"): Record<string, unknown>[] {\n return records.map(record => {\n const relation = record[relationName] as Record<string, unknown> | null;\n const {\n [relationName]: _removed,\n ...rest\n } = record;\n if (!relation) {\n return rest;\n }\n const flattenedRelation: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(relation)) {\n const fieldName = prefix ? `${prefix}_${key}` : `${relationName}_${key}`;\n flattenedRelation[fieldName] = value;\n }\n return {\n ...rest,\n ...flattenedRelation\n };\n });\n }\n}\n\n/**\n * Create a new result joiner instance.\n */\nexport function createResultJoiner(): ResultJoiner {\n return new ResultJoiner();\n}","/**\n * Query Executor\n *\n * Orchestrates the full query execution pipeline:\n * 1. Parse select string\n * 2. Build SQL queries\n * 3. Execute against PowerSync database\n * 4. Join related data\n *\n * This provides a unified interface for executing Supabase-style queries\n * against the local SQLite database via PowerSync.\n */\n\nimport type { DatabaseSchema, QueryOptions, ResolvedRelationship, SelectRelation } from \"../core/types\";\nimport { parseSelect } from \"./select-parser\";\nimport { RelationshipResolver } from \"./relationship-resolver\";\nimport { SQLBuilder } from \"./sql-builder\";\nimport { RelationJoinData, ResultJoiner } from \"./result-joiner\";\n\n/**\n * Interface for PowerSync database.\n * This matches the getAll method signature from @powersync/react-native.\n */\nexport interface PowerSyncDatabase {\n getAll<T>(sql: string, params?: unknown[]): Promise<T[]>;\n get<T>(sql: string, params?: unknown[]): Promise<T | null>;\n execute(sql: string, params?: unknown[]): Promise<{\n rowsAffected: number;\n }>;\n}\n\n/**\n * Query executor that handles the full query lifecycle.\n *\n * @example\n * const executor = new QueryExecutor(db, databaseSchema);\n *\n * // Simple query\n * const units = await executor.execute<EquipmentUnit>(\"EquipmentUnit\", {\n * where: { status: \"active\" },\n * orderBy: [{ field: \"name\", direction: \"asc\" }],\n * limit: 10\n * });\n *\n * // Query with relations\n * const unitsWithRelations = await executor.execute<EquipmentUnitWithRelations>(\n * \"EquipmentUnit\",\n * {\n * select: \"*, EquipmentFixture(*), ProjectDatabase(name, Organization(*))\",\n * where: { status: \"active\" }\n * }\n * );\n */\nexport class QueryExecutor {\n private resolver: RelationshipResolver;\n private builder: SQLBuilder;\n private joiner: ResultJoiner;\n constructor(private db: PowerSyncDatabase, private schema: DatabaseSchema) {\n this.resolver = new RelationshipResolver(schema);\n this.builder = new SQLBuilder();\n this.joiner = new ResultJoiner();\n }\n\n /**\n * Execute a query and return results.\n *\n * @param table - The table to query\n * @param options - Query options including select, where, orderBy, limit, offset\n * @returns Array of records with relations attached\n */\n async execute<T>(table: string, options: QueryOptions = {}): Promise<T[]> {\n // Parse the select string\n const parsed = parseSelect(options.select ?? \"*\");\n\n // Build and execute base query\n const baseQuery = this.builder.build(table, parsed.columns, {\n where: options.where,\n orderBy: options.orderBy,\n limit: options.limit,\n offset: options.offset\n });\n const baseRecords = await this.db.getAll<Record<string, unknown>>(baseQuery.sql, baseQuery.params);\n\n // If no records or no relations, return early\n if (baseRecords.length === 0 || parsed.relations.length === 0) {\n return baseRecords as T[];\n }\n\n // Query and join relations\n const result = await this.queryAndJoinRelations(table, baseRecords, parsed.relations);\n return result as T[];\n }\n\n /**\n * Execute a query for a single record by ID.\n *\n * @param table - The table to query\n * @param id - The record ID\n * @param options - Query options (only select is used)\n * @returns Single record or null\n */\n async executeById<T>(table: string, id: string | number, options: Pick<QueryOptions, \"select\"> = {}): Promise<T | null> {\n const parsed = parseSelect(options.select ?? \"*\");\n const idColumn = this.resolver.getPrimaryKey(table);\n\n // Build and execute base query\n const baseQuery = this.builder.buildByIdQuery(table, id, parsed.columns, idColumn);\n const records = await this.db.getAll<Record<string, unknown>>(baseQuery.sql, baseQuery.params);\n if (records.length === 0) {\n return null;\n }\n\n // If no relations, return early\n if (parsed.relations.length === 0) {\n return records[0] as T;\n }\n\n // Query and join relations\n const result = await this.queryAndJoinRelations(table, records, parsed.relations);\n return result[0] as T;\n }\n\n /**\n * Execute a count query.\n *\n * @param table - The table to count\n * @param options - Query options (only where is used)\n * @returns Count of matching records\n */\n async count(table: string, options: Pick<QueryOptions, \"where\"> = {}): Promise<number> {\n const query = this.builder.buildCountQuery(table, options.where);\n const result = await this.db.getAll<{\n count: number;\n }>(query.sql, query.params);\n return result[0]?.count ?? 0;\n }\n\n /**\n * Insert a record.\n *\n * @param table - The table to insert into\n * @param data - The record data\n * @returns The inserted record (re-fetched to get defaults)\n */\n async insert<T>(table: string, data: Record<string, unknown>): Promise<T> {\n if (__DEV__) {\n console.log(`[QueryExecutor] insert called:`, {\n table,\n dataKeys: Object.keys(data),\n hasId: \"id\" in data\n });\n }\n const idColumn = this.resolver.getPrimaryKey(table);\n\n // Generate UUID client-side if not provided\n // PowerSync provides uuid() function in SQLite\n if (!data[idColumn]) {\n const [{\n id\n }] = await this.db.getAll<{\n id: string;\n }>(\"SELECT uuid() as id\");\n data = {\n ...data,\n [idColumn]: id\n };\n if (__DEV__) {\n console.log(`[QueryExecutor] insert generated UUID:`, {\n table,\n id\n });\n }\n }\n const query = this.builder.buildInsertQuery(table, data);\n if (__DEV__) {\n console.log(`[QueryExecutor] insert executing SQL:`, {\n table,\n sql: query.sql,\n paramCount: query.params.length\n });\n }\n await this.db.execute(query.sql, query.params);\n if (__DEV__) {\n console.log(`[QueryExecutor] insert SQL executed successfully:`, {\n table,\n id: data[idColumn]\n });\n }\n\n // Return with guaranteed ID\n const result = await this.executeById<T>(table, data[idColumn] as string);\n if (__DEV__) {\n console.log(`[QueryExecutor] insert completed:`, {\n table,\n operation: \"insert\",\n resultId: (result as Record<string, unknown>)?.[idColumn] ?? data[idColumn],\n refetchSucceeded: result !== null\n });\n }\n return result ?? data as T;\n }\n\n /**\n * Update a record.\n *\n * @param table - The table to update\n * @param id - The record ID\n * @param data - The fields to update\n * @returns The updated record\n */\n async update<T>(table: string, id: string | number, data: Record<string, unknown>): Promise<T> {\n if (__DEV__) {\n console.log(`[QueryExecutor] update called:`, {\n table,\n id,\n dataKeys: Object.keys(data)\n });\n }\n const idColumn = this.resolver.getPrimaryKey(table);\n const query = this.builder.buildUpdateQuery(table, id, data, idColumn);\n if (__DEV__) {\n console.log(`[QueryExecutor] update executing SQL:`, {\n table,\n id,\n sql: query.sql,\n paramCount: query.params.length\n });\n }\n await this.db.execute(query.sql, query.params);\n if (__DEV__) {\n console.log(`[QueryExecutor] update SQL executed successfully:`, {\n table,\n id\n });\n }\n\n // Re-fetch to get the updated record\n const result = await this.executeById<T>(table, id);\n if (__DEV__) {\n console.log(`[QueryExecutor] update completed:`, {\n table,\n operation: \"update\",\n id,\n refetchSucceeded: result !== null\n });\n }\n if (result) {\n return result;\n }\n\n // Fall back to returning merged data\n return {\n ...data,\n [idColumn]: id\n } as T;\n }\n\n /**\n * Upsert a record (insert or update).\n *\n * @param table - The table to upsert into\n * @param data - The record data (must include ID for update)\n * @returns The upserted record\n */\n async upsert<T>(table: string, data: Record<string, unknown>): Promise<T> {\n if (__DEV__) {\n console.log(`[QueryExecutor] upsert called:`, {\n table,\n dataKeys: Object.keys(data),\n hasId: \"id\" in data,\n idValue: data.id ?? \"none\"\n });\n }\n const idColumn = this.resolver.getPrimaryKey(table);\n let id = data[idColumn];\n\n // Generate UUID client-side if not provided\n // PowerSync provides uuid() function in SQLite\n if (!id) {\n const [{\n id: generatedId\n }] = await this.db.getAll<{\n id: string;\n }>(\"SELECT uuid() as id\");\n id = generatedId;\n data = {\n ...data,\n [idColumn]: id\n };\n if (__DEV__) {\n console.log(`[QueryExecutor] upsert generated UUID:`, {\n table,\n id\n });\n }\n }\n\n // Check if record exists\n const existing = await this.executeById(table, id as string | number);\n if (__DEV__) {\n console.log(`[QueryExecutor] upsert existence check:`, {\n table,\n id,\n exists: existing !== null,\n willPerform: existing ? \"update\" : \"insert\"\n });\n }\n if (existing) {\n return this.update<T>(table, id as string | number, data);\n }\n return this.insert<T>(table, data);\n }\n\n /**\n * Delete a record.\n *\n * @param table - The table to delete from\n * @param id - The record ID\n */\n async delete(table: string, id: string | number): Promise<void> {\n const idColumn = this.resolver.getPrimaryKey(table);\n const query = this.builder.buildDeleteQuery(table, id, idColumn);\n await this.db.execute(query.sql, query.params);\n }\n\n /**\n * Query and join relations onto parent records.\n *\n * @param parentTable - The parent table name\n * @param parentRecords - Parent records to add relations to\n * @param relations - Relations to query and join\n * @returns Parent records with relations attached\n */\n private async queryAndJoinRelations(parentTable: string, parentRecords: Record<string, unknown>[], relations: SelectRelation[]): Promise<Record<string, unknown>[]> {\n let result = [...parentRecords];\n for (const relation of relations) {\n // Resolve the relationship\n const resolved = this.resolver.resolve(parentTable, relation.name);\n if (!resolved) {\n console.warn(`Could not resolve relationship: ${parentTable} -> ${relation.name}`);\n continue;\n }\n\n // Get parent IDs for the query\n const parentIds = this.getParentIdsForRelation(parentRecords, resolved);\n if (parentIds.length === 0) {\n // No parents to join, add empty arrays/nulls\n result = result.map(r => ({\n ...r,\n [relation.alias ?? relation.name]: resolved.type === \"one-to-many\" ? [] : null\n }));\n continue;\n }\n\n // Query related table\n const relQuery = this.buildRelatedQuery(relation, resolved, parentIds);\n let relatedRecords = await this.db.getAll<Record<string, unknown>>(relQuery.sql, relQuery.params);\n\n // Recursively handle nested relations\n if (relation.relations.length > 0 && relatedRecords.length > 0) {\n relatedRecords = await this.queryAndJoinRelations(relation.name, relatedRecords, relation.relations);\n }\n\n // Join onto parent records\n result = this.joiner.join(result, relatedRecords, resolved, relation.alias ?? relation.name);\n }\n return result;\n }\n\n /**\n * Get parent IDs needed for a relation query.\n */\n private getParentIdsForRelation(parentRecords: Record<string, unknown>[], resolved: ResolvedRelationship): (string | number)[] {\n let parentIds: (string | number)[];\n if (resolved.type === \"one-to-many\") {\n // For one-to-many, we need the parent's referenced column (usually id)\n parentIds = this.joiner.extractUniqueValues(parentRecords, resolved.referencedColumn);\n } else {\n // For many-to-one, we need the parent's foreign key values\n parentIds = this.joiner.extractUniqueValues(parentRecords, resolved.foreignKey);\n }\n return parentIds;\n }\n\n /**\n * Build a query for related records.\n */\n private buildRelatedQuery(relation: SelectRelation, resolved: ResolvedRelationship, parentIds: (string | number)[]): {\n sql: string;\n params: (string | number | boolean | null)[];\n } {\n // Determine which column to filter on\n const filterColumn = resolved.type === \"one-to-many\" ? resolved.foreignKey // Filter by FK in the related table\n : resolved.referencedColumn; // Filter by PK in the related table\n\n // Dedupe parent IDs\n const uniqueIds = Array.from(new Set(parentIds));\n return this.builder.buildRelationQuery(relation.name, filterColumn, uniqueIds, relation.columns);\n }\n\n /**\n * Get the relationship resolver (for advanced use).\n */\n getResolver(): RelationshipResolver {\n return this.resolver;\n }\n\n /**\n * Get the SQL builder (for advanced use).\n */\n getBuilder(): SQLBuilder {\n return this.builder;\n }\n\n /**\n * Get the result joiner (for advanced use).\n */\n getJoiner(): ResultJoiner {\n return this.joiner;\n }\n}\n\n/**\n * Create a query executor instance.\n *\n * @param db - PowerSync database instance\n * @param schema - Database schema\n * @returns QueryExecutor instance\n */\nexport function createQueryExecutor(db: PowerSyncDatabase, schema: DatabaseSchema): QueryExecutor {\n return new QueryExecutor(db, schema);\n}"],"mappings":"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","names":["trimmed"]}