{"version":3,"file":"optimistic-sync.mjs","sources":["../../../../src/lib/data/sync/optimistic-sync.ts"],"sourcesContent":["/**\n * @file Optimistic Sync\n * @description Optimistic updates with automatic rollback, retry logic,\n * and state reconciliation for seamless user experience.\n *\n * Features:\n * - Optimistic state updates\n * - Automatic rollback on failure\n * - Retry with exponential backoff\n * - State snapshot management\n * - Pending changes tracking\n * - React integration hooks\n *\n * @example\n * ```typescript\n * import { useOptimisticSync } from '@/lib/data/sync';\n *\n * const { data, update, isPending, pendingChanges } = useOptimisticSync({\n *   key: 'user',\n *   fetcher: fetchUser,\n *   updater: updateUser,\n * });\n *\n * // Optimistic update\n * update({ name: 'New Name' });\n * ```\n */\n\nimport { useCallback, useEffect, useRef, useState } from 'react';\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\n/**\n * Optimistic update status\n */\nexport type OptimisticStatus = 'idle' | 'pending' | 'syncing' | 'success' | 'error' | 'rolled-back';\n\n/**\n * Pending change record\n */\nexport interface PendingChange<T = unknown> {\n  /** Unique ID for this change */\n  id: string;\n  /** Original data before change */\n  snapshot: T;\n  /** Optimistic data after change */\n  optimisticData: T;\n  /** Change payload */\n  payload: Partial<T>;\n  /** Change timestamp */\n  timestamp: number;\n  /** Current status */\n  status: OptimisticStatus;\n  /** Error message if failed */\n  error?: string;\n  /** Retry count */\n  retryCount: number;\n}\n\n/**\n * Optimistic sync configuration\n */\nexport interface OptimisticSyncConfig<T> {\n  /** Unique key for this sync */\n  key: string;\n  /** Initial data */\n  initialData?: T;\n  /** Fetch current data */\n  fetcher?: () => Promise<T>;\n  /** Persist changes to server */\n  persister: (data: T, payload: Partial<T>) => Promise<T>;\n  /** Merge function for optimistic updates */\n  merger?: (current: T, payload: Partial<T>) => T;\n  /** Rollback function */\n  rollback?: (snapshot: T, error: Error) => T;\n  /** Max retry attempts */\n  maxRetries?: number;\n  /** Retry delay base (ms) */\n  retryDelay?: number;\n  /** Debounce updates (ms) */\n  debounceMs?: number;\n  /** Batch updates within window (ms) */\n  batchWindow?: number;\n  /** Enable persistence queue */\n  enableQueue?: boolean;\n  /** On success callback */\n  onSuccess?: (data: T, payload: Partial<T>) => void;\n  /** On error callback */\n  onError?: (error: Error, payload: Partial<T>, snapshot: T) => void;\n  /** On rollback callback */\n  onRollback?: (snapshot: T, error: Error) => void;\n}\n\n/**\n * Optimistic sync state\n */\nexport interface OptimisticSyncState<T> {\n  /** Current data (may be optimistic) */\n  data: T | undefined;\n  /** Server-confirmed data */\n  confirmedData: T | undefined;\n  /** Whether any changes are pending */\n  isPending: boolean;\n  /** Whether currently syncing */\n  isSyncing: boolean;\n  /** Last error */\n  error: Error | null;\n  /** Status */\n  status: OptimisticStatus;\n  /** Pending changes */\n  pendingChanges: PendingChange<T>[];\n  /** Is data stale (has pending changes) */\n  isStale: boolean;\n}\n\n/**\n * Optimistic sync actions\n */\nexport interface OptimisticSyncActions<T> {\n  /** Apply optimistic update */\n  update: (payload: Partial<T>) => Promise<T>;\n  /** Refresh from server */\n  refresh: () => Promise<T | undefined>;\n  /** Rollback all pending changes */\n  rollbackAll: () => void;\n  /** Rollback specific change */\n  rollbackChange: (changeId: string) => void;\n  /** Retry failed changes */\n  retryFailed: () => Promise<void>;\n  /** Reset state */\n  reset: (data?: T) => void;\n}\n\n/**\n * Optimistic sync return type\n */\nexport type OptimisticSyncReturn<T> = OptimisticSyncState<T> & OptimisticSyncActions<T>;\n\n// =============================================================================\n// UTILITIES\n// =============================================================================\n\n/**\n * Default merger - shallow merge\n */\nfunction defaultMerger<T>(current: T, payload: Partial<T>): T {\n  if (current === null || current === undefined) {\n    return payload as T;\n  }\n\n  if (typeof current !== 'object') {\n    return payload as T;\n  }\n\n  return { ...current, ...payload };\n}\n\n/**\n * Generate unique ID\n */\nfunction generateId(): string {\n  return `${Date.now()}-${Math.random().toString(36).slice(2, 9)}`;\n}\n\n/**\n * Calculate retry delay with exponential backoff and jitter\n */\nfunction calculateRetryDelay(attempt: number, baseDelay: number): number {\n  const exponentialDelay = Math.min(baseDelay * Math.pow(2, attempt), 30000);\n  const jitter = Math.random() * 1000;\n  return exponentialDelay + jitter;\n}\n\n// =============================================================================\n// OPTIMISTIC SYNC HOOK\n// =============================================================================\n\n/**\n * React hook for optimistic updates\n */\nexport function useOptimisticSync<T>(config: OptimisticSyncConfig<T>): OptimisticSyncReturn<T> {\n  const {\n    initialData,\n    fetcher,\n    persister,\n    merger = defaultMerger,\n    rollback,\n    maxRetries = 3,\n    retryDelay = 1000,\n    debounceMs = 0,\n    batchWindow = 0,\n    enableQueue = true,\n    onSuccess,\n    onError,\n    onRollback,\n  } = config;\n\n  // State\n  const [data, setData] = useState<T | undefined>(initialData);\n  const [confirmedData, setConfirmedData] = useState<T | undefined>(initialData);\n  const [pendingChanges, setPendingChanges] = useState<PendingChange<T>[]>([]);\n  const [status, setStatus] = useState<OptimisticStatus>('idle');\n  const [error, setError] = useState<Error | null>(null);\n\n  // Refs\n  const debounceTimer = useRef<ReturnType<typeof setTimeout> | undefined>(undefined);\n  const batchQueue = useRef<Partial<T>[]>([]);\n  const batchTimer = useRef<ReturnType<typeof setTimeout> | undefined>(undefined);\n  const isMounted = useRef(true);\n\n  // Cleanup\n  useEffect(() => {\n    isMounted.current = true;\n    return () => {\n      isMounted.current = false;\n      if (debounceTimer.current) clearTimeout(debounceTimer.current);\n      if (batchTimer.current) clearTimeout(batchTimer.current);\n    };\n  }, []);\n\n  // Derived state\n  const isPending = pendingChanges.some((c) => c.status === 'pending' || c.status === 'syncing');\n  const isSyncing = pendingChanges.some((c) => c.status === 'syncing');\n  const isStale = pendingChanges.length > 0;\n\n  // Persist change to server\n  const persistChange = useCallback(\n    async (change: PendingChange<T>): Promise<T> => {\n      if (!isMounted.current) throw new Error('Component unmounted');\n\n      // Update change status\n      setPendingChanges((prev) =>\n        prev.map((c) => (c.id === change.id ? { ...c, status: 'syncing' } : c))\n      );\n      setStatus('syncing');\n\n      try {\n        const result = await persister(change.optimisticData, change.payload);\n\n        if (!isMounted.current) return result;\n\n        // Success - remove from pending and update confirmed\n        setPendingChanges((prev) => prev.filter((c) => c.id !== change.id));\n        setConfirmedData(result);\n        setData(result);\n        setStatus('success');\n        setError(null);\n\n        onSuccess?.(result, change.payload);\n\n        return result;\n      } catch (err) {\n        if (!isMounted.current) throw err;\n\n        const error = err instanceof Error ? err : new Error(String(err));\n\n        // Check if should retry\n        if (change.retryCount < maxRetries) {\n          // Schedule retry\n          setPendingChanges((prev) =>\n            prev.map((c) =>\n              c.id === change.id ? { ...c, status: 'pending', retryCount: c.retryCount + 1 } : c\n            )\n          );\n\n          const delay = calculateRetryDelay(change.retryCount, retryDelay);\n          setTimeout(() => {\n            const updatedChange = pendingChanges.find((c) => c.id === change.id);\n            if (updatedChange != null) {\n              void persistChange(updatedChange);\n            }\n          }, delay);\n        } else {\n          // Max retries exceeded - rollback\n          rollbackChange(change.id);\n          onError?.(error, change.payload, change.snapshot);\n        }\n\n        setError(error);\n        throw error;\n      }\n    },\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n    [persister, maxRetries, retryDelay, onSuccess, onError, pendingChanges]\n  );\n\n  // Apply optimistic update\n  const update = useCallback(\n    async (payload: Partial<T>): Promise<T> => {\n      const currentData = data;\n      if (currentData === undefined) {\n        throw new Error('Cannot update undefined data');\n      }\n\n      // Handle batching\n      if (batchWindow > 0) {\n        batchQueue.current.push(payload);\n\n        batchTimer.current ??= setTimeout(() => {\n          const batchedPayload = batchQueue.current.reduce(\n            (acc, p) => ({ ...acc, ...p }),\n            {} as Partial<T>\n          );\n          batchQueue.current = [];\n          batchTimer.current = undefined;\n          void update(batchedPayload);\n        }, batchWindow);\n\n        // Return current data for batch\n        return currentData;\n      }\n\n      // Handle debouncing\n      if (debounceMs > 0) {\n        return new Promise<T>((resolve) => {\n          if (debounceTimer.current) {\n            clearTimeout(debounceTimer.current);\n          }\n\n          debounceTimer.current = setTimeout(() => {\n            void applyUpdate(payload)\n              .then((result) => {\n                resolve(result);\n                return result;\n              })\n              .catch((err: unknown) => {\n                throw err instanceof Error ? err : new Error(String(err));\n              });\n          }, debounceMs);\n        });\n      }\n\n      return applyUpdate(payload);\n\n      async function applyUpdate(updatePayload: Partial<T>): Promise<T> {\n        const snapshot = currentData as T;\n        const optimisticData = merger(snapshot, updatePayload);\n\n        // Create pending change\n        const change: PendingChange<T> = {\n          id: generateId(),\n          snapshot,\n          optimisticData,\n          payload: updatePayload,\n          timestamp: Date.now(),\n          status: 'pending',\n          retryCount: 0,\n        };\n\n        // Apply optimistic update immediately\n        setData(optimisticData);\n        setStatus('pending');\n        setPendingChanges((prev) => [...prev, change]);\n\n        // Persist if queue enabled\n        if (enableQueue) {\n          try {\n            return await persistChange(change);\n          } catch {\n            // Error handled in persistChange\n            return optimisticData;\n          }\n        }\n\n        return optimisticData;\n      }\n    },\n    [data, merger, batchWindow, debounceMs, enableQueue, persistChange]\n  );\n\n  // Refresh from server\n  const refresh = useCallback(async (): Promise<T | undefined> => {\n    if (!fetcher) return data;\n\n    try {\n      const freshData = await fetcher();\n      if (isMounted.current) {\n        setConfirmedData(freshData);\n\n        // Only update data if no pending changes\n        if (pendingChanges.length === 0) {\n          setData(freshData);\n        }\n      }\n      return freshData;\n    } catch (err) {\n      setError(err instanceof Error ? err : new Error(String(err)));\n      return undefined;\n    }\n  }, [fetcher, data, pendingChanges.length]);\n\n  // Rollback specific change\n  const rollbackChange = useCallback(\n    (changeId: string) => {\n      const change = pendingChanges.find((c) => c.id === changeId);\n      if (!change) return;\n\n      // Get rollback data\n      let rollbackData = change.snapshot;\n      if (rollback) {\n        rollbackData = rollback(change.snapshot, new Error('Manual rollback'));\n      }\n\n      // Remove change and restore data\n      setPendingChanges((prev) => prev.filter((c) => c.id !== changeId));\n\n      // Recalculate data from remaining changes\n      const remainingChanges = pendingChanges.filter((c) => c.id !== changeId);\n      const baseData = confirmedData ?? rollbackData;\n      if (remainingChanges.length === 0) {\n        setData(baseData);\n      } else {\n        // Apply remaining changes to confirmed data\n        const reappliedData = remainingChanges.reduce((acc, c) => merger(acc, c.payload), baseData);\n        setData(reappliedData);\n      }\n\n      setStatus('rolled-back');\n      onRollback?.(rollbackData, new Error('Manual rollback'));\n    },\n    [pendingChanges, rollback, confirmedData, merger, onRollback]\n  );\n\n  // Rollback all changes\n  const rollbackAll = useCallback(() => {\n    if (pendingChanges.length === 0) return;\n\n    const firstSnapshot = pendingChanges[0]?.snapshot;\n    if (firstSnapshot === undefined || firstSnapshot === null) return;\n    let rollbackData = firstSnapshot;\n\n    if (rollback !== undefined && rollback !== null) {\n      rollbackData = rollback(firstSnapshot, new Error('Rollback all')) as NonNullable<T>;\n    }\n\n    setPendingChanges([]);\n    setData(confirmedData ?? rollbackData);\n    setStatus('rolled-back');\n    onRollback?.(rollbackData, new Error('Rollback all'));\n  }, [pendingChanges, rollback, confirmedData, onRollback]);\n\n  // Retry failed changes\n  const retryFailed = useCallback(async () => {\n    const failedChanges = pendingChanges.filter((c) => c.status === 'error' || c.retryCount > 0);\n\n    for (const change of failedChanges) {\n      try {\n        await persistChange({\n          ...change,\n          retryCount: 0,\n        });\n      } catch {\n        // Error handled in persistChange\n      }\n    }\n  }, [pendingChanges, persistChange]);\n\n  // Reset state\n  const reset = useCallback(\n    (newData?: T) => {\n      setPendingChanges([]);\n      setStatus('idle');\n      setError(null);\n\n      if (newData !== undefined) {\n        setData(newData);\n        setConfirmedData(newData);\n      } else if (initialData !== undefined) {\n        setData(initialData);\n        setConfirmedData(initialData);\n      }\n    },\n    [initialData]\n  );\n\n  return {\n    // State\n    data,\n    confirmedData,\n    isPending,\n    isSyncing,\n    error,\n    status,\n    pendingChanges,\n    isStale,\n\n    // Actions\n    update,\n    refresh,\n    rollbackAll,\n    rollbackChange,\n    retryFailed,\n    reset,\n  };\n}\n\n// =============================================================================\n// OPTIMISTIC LIST HOOK\n// =============================================================================\n\n/**\n * Item with required ID\n */\nexport interface ListItem {\n  id: string;\n}\n\n/**\n * Optimistic list configuration\n */\nexport interface OptimisticListConfig<T extends ListItem> {\n  /** Unique key for this list */\n  key: string;\n  /** Initial items */\n  initialItems?: T[];\n  /** Fetch items */\n  fetcher?: () => Promise<T[]>;\n  /** Create item */\n  createItem?: (item: Omit<T, 'id'>) => Promise<T>;\n  /** Update item */\n  updateItem?: (id: string, updates: Partial<T>) => Promise<T>;\n  /** Delete item */\n  deleteItem?: (id: string) => Promise<void>;\n  /** Generate temporary ID for optimistic creates */\n  generateId?: () => string;\n  /** Max retries */\n  maxRetries?: number;\n  /** Callbacks */\n  onCreateSuccess?: (item: T) => void;\n  onUpdateSuccess?: (item: T) => void;\n  onDeleteSuccess?: (id: string) => void;\n  onError?: (error: Error, operation: string) => void;\n}\n\n/**\n * Pending list operation\n */\nexport interface PendingListOperation<T> {\n  id: string;\n  type: 'create' | 'update' | 'delete';\n  itemId: string;\n  data?: T | Partial<T>;\n  timestamp: number;\n  status: OptimisticStatus;\n  retryCount: number;\n}\n\n/**\n * React hook for optimistic list operations\n */\nexport function useOptimisticList<T extends ListItem>(\n  config: OptimisticListConfig<T>\n): {\n  items: T[];\n  isPending: boolean;\n  error: Error | null;\n  create: (item: Omit<T, 'id'>) => Promise<T>;\n  update: (id: string, updates: Partial<T>) => Promise<T>;\n  remove: (id: string) => Promise<void>;\n  refresh: () => Promise<T[]>;\n  reset: (newItems?: T[]) => void;\n} {\n  const {\n    initialItems = [],\n    fetcher,\n    createItem,\n    updateItem,\n    deleteItem,\n    generateId = () => `temp-${Date.now()}-${Math.random().toString(36).slice(2, 9)}`,\n    maxRetries = 3,\n    onCreateSuccess,\n    onUpdateSuccess,\n    onDeleteSuccess,\n    onError,\n  } = config;\n\n  // State\n  const [items, setItems] = useState<T[]>(initialItems);\n  const [pendingOps, setPendingOps] = useState<PendingListOperation<T>[]>([]);\n  const [error, setError] = useState<Error | null>(null);\n\n  // Refs\n  const isMounted = useRef(true);\n\n  useEffect(() => {\n    isMounted.current = true;\n    return () => {\n      isMounted.current = false;\n    };\n  }, []);\n\n  // Derived state\n  const isPending = pendingOps.some((op) => op.status === 'pending' || op.status === 'syncing');\n\n  // Fetch items\n  const refresh = useCallback(async (): Promise<T[]> => {\n    if (!fetcher) return items;\n\n    try {\n      const freshItems = await fetcher();\n      if (isMounted.current) {\n        setItems(freshItems);\n\n        // Merge with pending operations\n        const pendingCreates = pendingOps\n          .filter((op) => op.type === 'create' && op.status !== 'error')\n          .map((op) => op.data as T);\n\n        const pendingDeleteIds = new Set(\n          pendingOps.filter((op) => op.type === 'delete').map((op) => op.itemId)\n        );\n\n        const mergedItems = [\n          ...freshItems.filter((item) => !pendingDeleteIds.has(item.id)),\n          ...pendingCreates,\n        ];\n\n        setItems(mergedItems);\n      }\n      return freshItems;\n    } catch (err) {\n      setError(err instanceof Error ? err : new Error(String(err)));\n      return items;\n    }\n  }, [fetcher, items, pendingOps]);\n\n  // Create item\n  const add = useCallback(\n    async (itemData: Omit<T, 'id'>): Promise<T> => {\n      const tempId = generateId();\n      const optimisticItem = { ...itemData, id: tempId } as T;\n\n      // Add optimistically\n      setItems((prev) => [...prev, optimisticItem]);\n\n      // Track operation\n      const op: PendingListOperation<T> = {\n        id: generateId(),\n        type: 'create',\n        itemId: tempId,\n        data: optimisticItem,\n        timestamp: Date.now(),\n        status: 'pending',\n        retryCount: 0,\n      };\n      setPendingOps((prev) => [...prev, op]);\n\n      if (!createItem) {\n        return optimisticItem;\n      }\n\n      try {\n        setPendingOps((prev) =>\n          prev.map((o) => (o.id === op.id ? { ...o, status: 'syncing' } : o))\n        );\n\n        const createdItem = await createItem(itemData);\n\n        if (isMounted.current) {\n          // Replace temp item with real item\n          setItems((prev) => prev.map((item) => (item.id === tempId ? createdItem : item)));\n          setItems((prev) => [...prev, createdItem]);\n          setPendingOps((prev) => prev.filter((o) => o.id !== op.id));\n          onCreateSuccess?.(createdItem);\n        }\n\n        return createdItem;\n      } catch (err) {\n        const error = err instanceof Error ? err : new Error(String(err));\n\n        if (isMounted.current && op.retryCount >= maxRetries) {\n          // Remove optimistic item\n          setItems((prev) => prev.filter((item) => item.id !== tempId));\n          setPendingOps((prev) => prev.filter((o) => o.id !== op.id));\n          onError?.(error, 'create');\n        }\n\n        setError(error);\n        throw error;\n      }\n    },\n    [createItem, generateId, maxRetries, onCreateSuccess, onError]\n  );\n\n  // Update item\n  const update = useCallback(\n    async (id: string, updates: Partial<T>): Promise<T> => {\n      const currentItem = items.find((item) => item.id === id);\n      if (!currentItem) {\n        throw new Error(`Item ${id} not found`);\n      }\n\n      const optimisticItem = { ...currentItem, ...updates };\n\n      // Update optimistically\n      setItems((prev) => prev.map((item) => (item.id === id ? optimisticItem : item)));\n\n      // Track operation\n      const op: PendingListOperation<T> = {\n        id: generateId(),\n        type: 'update',\n        itemId: id,\n        data: updates,\n        timestamp: Date.now(),\n        status: 'pending',\n        retryCount: 0,\n      };\n      setPendingOps((prev) => [...prev, op]);\n\n      if (!updateItem) {\n        return optimisticItem;\n      }\n\n      try {\n        setPendingOps((prev) =>\n          prev.map((o) => (o.id === op.id ? { ...o, status: 'syncing' } : o))\n        );\n\n        const updatedItem = await updateItem(id, updates);\n\n        if (isMounted.current) {\n          setItems((prev) => prev.map((item) => (item.id === id ? updatedItem : item)));\n          setItems((prev) => prev.map((item) => (item.id === id ? updatedItem : item)));\n          setPendingOps((prev) => prev.filter((o) => o.id !== op.id));\n          onUpdateSuccess?.(updatedItem);\n        }\n\n        return updatedItem;\n      } catch (err) {\n        const error = err instanceof Error ? err : new Error(String(err));\n\n        if (isMounted.current && op.retryCount >= maxRetries) {\n          // Rollback\n          setItems((prev) => prev.map((item) => (item.id === id ? currentItem : item)));\n          setPendingOps((prev) => prev.filter((o) => o.id !== op.id));\n          onError?.(error, 'update');\n        }\n\n        setError(error);\n        throw error;\n      }\n    },\n    [items, updateItem, generateId, maxRetries, onUpdateSuccess, onError]\n  );\n\n  // Delete item\n  const remove = useCallback(\n    async (id: string): Promise<void> => {\n      const currentItem = items.find((item) => item.id === id);\n      if (!currentItem) return;\n\n      // Remove optimistically\n      setItems((prev) => prev.filter((item) => item.id !== id));\n\n      // Track operation\n      const op: PendingListOperation<T> = {\n        id: generateId(),\n        type: 'delete',\n        itemId: id,\n        timestamp: Date.now(),\n        status: 'pending',\n        retryCount: 0,\n      };\n      setPendingOps((prev) => [...prev, op]);\n\n      if (!deleteItem) return;\n\n      try {\n        setPendingOps((prev) =>\n          prev.map((o) => (o.id === op.id ? { ...o, status: 'syncing' } : o))\n        );\n\n        await deleteItem(id);\n\n        if (isMounted.current) {\n          setItems((prev) => prev.filter((item) => item.id !== id));\n          setPendingOps((prev) => prev.filter((o) => o.id !== op.id));\n          onDeleteSuccess?.(id);\n        }\n      } catch (err) {\n        const error = err instanceof Error ? err : new Error(String(err));\n\n        if (isMounted.current && op.retryCount >= maxRetries) {\n          // Rollback - add item back\n          setItems((prev) => [...prev, currentItem]);\n          setPendingOps((prev) => prev.filter((o) => o.id !== op.id));\n          onError?.(error, 'delete');\n        }\n\n        setError(error);\n        throw error;\n      }\n    },\n    [items, deleteItem, generateId, maxRetries, onDeleteSuccess, onError]\n  );\n\n  // Reset\n  const reset = useCallback(\n    (newItems?: T[]) => {\n      const resetItems = newItems ?? initialItems;\n      setItems(resetItems);\n      setItems(resetItems);\n      setPendingOps([]);\n      setError(null);\n    },\n    [initialItems]\n  );\n\n  return {\n    // State\n    items,\n    isPending,\n    error,\n\n    // Actions\n    create: add,\n    update,\n    remove,\n    refresh,\n    reset,\n  };\n}\n"],"names":["defaultMerger","current","payload","generateId","calculateRetryDelay","attempt","baseDelay","exponentialDelay","jitter","useOptimisticSync","config","initialData","fetcher","persister","merger","rollback","maxRetries","retryDelay","debounceMs","batchWindow","enableQueue","onSuccess","onError","onRollback","data","setData","useState","confirmedData","setConfirmedData","pendingChanges","setPendingChanges","status","setStatus","error","setError","debounceTimer","useRef","batchQueue","batchTimer","isMounted","useEffect","isPending","c","isSyncing","isStale","persistChange","useCallback","change","prev","result","err","delay","updatedChange","rollbackChange","update","currentData","batchedPayload","acc","p","resolve","applyUpdate","updatePayload","snapshot","optimisticData","refresh","freshData","changeId","rollbackData","remainingChanges","baseData","reappliedData","rollbackAll","firstSnapshot","retryFailed","failedChanges","reset","newData","useOptimisticList","initialItems","createItem","updateItem","deleteItem","onCreateSuccess","onUpdateSuccess","onDeleteSuccess","items","setItems","pendingOps","setPendingOps","op","freshItems","pendingCreates","pendingDeleteIds","mergedItems","item","add","itemData","tempId","optimisticItem","o","createdItem","id","updates","currentItem","updatedItem","remove","newItems","resetItems"],"mappings":"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"}