{"version":3,"file":"index.cjs","sources":["../src/index.ts"],"sourcesContent":["/**\r\n * Interface for object store configuration\r\n */\r\nexport interface IDBStoreConfig {\r\n  name: string\r\n  config: IDBObjectStoreParameters\r\n  indices?: IDBIndexConfig[]\r\n  data?: Array<{ id: string | number; [key: string]: any }>\r\n}\r\n\r\n/**\r\n * Interface for index configuration\r\n */\r\nexport interface IDBIndexConfig {\r\n  name: string\r\n  keyPath: string | string[]\r\n  options?: IDBIndexParameters\r\n}\r\n\r\n/**\r\n * Interface for query options\r\n */\r\nexport interface QueryOptions {\r\n  index?: string\r\n  direction?: IDBCursorDirection\r\n  limit?: number\r\n  offset?: number\r\n}\r\n\r\n/**\r\n * Interface for database configuration\r\n */\r\nexport interface DatabaseConfig {\r\n  name: string\r\n  version: number\r\n  stores: IDBStoreConfig[]\r\n}\r\n\r\n/**\r\n * Custom error classes for better error handling\r\n */\r\nexport class IndexedDBError extends Error {\r\n  constructor(\r\n    message: string,\r\n    public code?: string\r\n  ) {\r\n    super(message)\r\n    this.name = 'IndexedDBError'\r\n  }\r\n}\r\n\r\nexport class DatabaseNotFoundError extends IndexedDBError {\r\n  constructor(dbName: string) {\r\n    super(`Database \"${dbName}\" not found`)\r\n    this.code = 'DB_NOT_FOUND'\r\n  }\r\n}\r\n\r\nexport class StoreNotFoundError extends IndexedDBError {\r\n  constructor(storeName: string) {\r\n    super(`Object store \"${storeName}\" not found`)\r\n    this.code = 'STORE_NOT_FOUND'\r\n  }\r\n}\r\n\r\nexport class TransactionError extends IndexedDBError {\r\n  constructor(message: string) {\r\n    super(message)\r\n    this.code = 'TRANSACTION_ERROR'\r\n  }\r\n}\r\n\r\n/**\r\n * Checks if IndexedDB is supported in the current browser\r\n * Supports Chrome >= 53, Firefox >= 78, Safari >= 13, Edge >= 79\r\n */\r\nexport const isIndexedDBSupported = (): boolean => {\r\n  return (\r\n    typeof window !== 'undefined' &&\r\n    'indexedDB' in window &&\r\n    indexedDB !== null &&\r\n    typeof indexedDB.open === 'function'\r\n  )\r\n}\r\n\r\n/**\r\n * Gets browser compatibility info for IndexedDB features\r\n */\r\nexport const getBrowserCompatibility = () => {\r\n  if (!isIndexedDBSupported()) {\r\n    return { supported: false, features: {} }\r\n  }\r\n\r\n  const features = {\r\n    transactions: typeof IDBTransaction !== 'undefined',\r\n    cursors: typeof IDBCursor !== 'undefined',\r\n    keyRange: typeof IDBKeyRange !== 'undefined',\r\n    multiEntry: true, // Supported in Chrome >= 53\r\n    compound: true, // Supported in Chrome >= 53\r\n  }\r\n\r\n  return { supported: true, features }\r\n}\r\n\r\n/**\r\n * Creates and initializes an IndexedDB database with the specified stores and initial data\r\n * @param name - The name of the database to create\r\n * @param version - The version of the database\r\n * @param stores - Configuration for object stores including optional initial data\r\n * @returns A promise that resolves to the database instance\r\n */\r\nconst createDB = (\r\n  name: string,\r\n  version: number,\r\n  stores?: IDBStoreConfig[]\r\n): Promise<IDBDatabase> => {\r\n  // Check for browser compatibility\r\n  if (!isIndexedDBSupported()) {\r\n    throw new IndexedDBError('IndexedDB is not supported in this browser!')\r\n  }\r\n\r\n  return new Promise<IDBDatabase>((resolve, reject) => {\r\n    const request = indexedDB.open(name, version)\r\n\r\n    // Create or update object stores when database structure needs to change\r\n    request.onupgradeneeded = (event: IDBVersionChangeEvent) => {\r\n      const db = (event.target as IDBOpenDBRequest).result\r\n\r\n      if (stores?.length) {\r\n        stores.forEach(store => {\r\n          let objectStore: IDBObjectStore\r\n\r\n          if (!db.objectStoreNames.contains(store.name)) {\r\n            objectStore = db.createObjectStore(store.name, store.config)\r\n          } else {\r\n            objectStore = (event.target as any).transaction.objectStore(\r\n              store.name\r\n            )\r\n          }\r\n\r\n          // Create indices if specified\r\n          if (store.indices?.length) {\r\n            store.indices.forEach(indexConfig => {\r\n              if (!objectStore.indexNames.contains(indexConfig.name)) {\r\n                objectStore.createIndex(\r\n                  indexConfig.name,\r\n                  indexConfig.keyPath,\r\n                  indexConfig.options\r\n                )\r\n              }\r\n            })\r\n          }\r\n        })\r\n      }\r\n    }\r\n\r\n    // Handle successful database open\r\n    request.onsuccess = async (event: Event) => {\r\n      const db = (event.target as IDBOpenDBRequest).result\r\n\r\n      // If no stores or data to initialize, resolve immediately\r\n      if (!stores?.length) {\r\n        return resolve(db)\r\n      }\r\n\r\n      try {\r\n        // Initialize data for each store that has initial data\r\n        const storesWithData = stores.filter(\r\n          store => Array.isArray(store.data) && store.data.length > 0\r\n        )\r\n\r\n        if (storesWithData.length === 0) {\r\n          return resolve(db)\r\n        }\r\n\r\n        // Process each store with data\r\n        for (const store of storesWithData) {\r\n          // Create a single transaction for all operations on this store\r\n          const tx = db.transaction(store.name, 'readwrite')\r\n          const objectStore = tx.objectStore(store.name)\r\n\r\n          // Get all existing data from the store\r\n          const existingData = await new Promise<any[]>((res, rej) => {\r\n            const getAllRequest = objectStore.getAll()\r\n            getAllRequest.onsuccess = e => res((e.target as IDBRequest).result)\r\n            getAllRequest.onerror = e => rej((e.target as IDBRequest).error)\r\n          })\r\n\r\n          // Add each data item if it doesn't already exist\r\n          const existingIds = new Set(existingData.map(item => item.id))\r\n\r\n          for (const item of store.data || []) {\r\n            if (!existingIds.has(item.id)) {\r\n              objectStore.add(item)\r\n            }\r\n          }\r\n\r\n          // Handle transaction completion\r\n          await new Promise<void>((res, rej) => {\r\n            tx.oncomplete = () => res()\r\n            tx.onerror = () =>\r\n              rej(\r\n                new TransactionError(tx.error?.message || 'Transaction failed')\r\n              )\r\n          })\r\n        }\r\n\r\n        resolve(db)\r\n      } catch (error) {\r\n        reject(\r\n          error instanceof Error\r\n            ? error\r\n            : new IndexedDBError('Unknown error occurred')\r\n        )\r\n      }\r\n    }\r\n\r\n    // Handle database open errors\r\n    request.onerror = () => {\r\n      reject(\r\n        new IndexedDBError(request.error?.message || 'Failed to open database')\r\n      )\r\n    }\r\n\r\n    request.onblocked = () => {\r\n      reject(new IndexedDBError('Database open request was blocked'))\r\n    }\r\n  })\r\n}\r\n\r\n/**\r\n * Opens an IndexedDB database with the specified name and version\r\n * @param name - The name of the database to open\r\n * @param version - The version of the database\r\n * @returns A promise that resolves to the database instance\r\n */\r\nconst openDB = (name: string, version: number): Promise<IDBDatabase> => {\r\n  // Check for browser compatibility\r\n  if (!isIndexedDBSupported()) {\r\n    throw new IndexedDBError('IndexedDB is not supported in this browser!')\r\n  }\r\n\r\n  return new Promise<IDBDatabase>((resolve, reject) => {\r\n    const request = indexedDB.open(name, version)\r\n\r\n    // Success handler - directly resolve with the database instance\r\n    request.onsuccess = () => {\r\n      resolve(request.result)\r\n    }\r\n\r\n    // Error handler - directly reject with the error\r\n    request.onerror = () => {\r\n      reject(\r\n        new IndexedDBError(request.error?.message || 'Failed to open database')\r\n      )\r\n    }\r\n\r\n    request.onblocked = () => {\r\n      reject(new IndexedDBError('Database open request was blocked'))\r\n    }\r\n  })\r\n}\r\n\r\n/**\r\n * Interface for transaction handler\r\n */\r\nexport interface TransactionHandler {\r\n  /** The transaction object */\r\n  tx: IDBTransaction\r\n  /** Gets an object store from the transaction */\r\n  getStore(name: string): Promise<IDBObjectStore>\r\n  /** Commits the transaction */\r\n  commit(): Promise<void>\r\n  /** Aborts the transaction */\r\n  abort(): void\r\n}\r\n\r\n/**\r\n * Creates a transaction on the database for specified object stores\r\n * @param dbObject - The database connection\r\n * @param stores - Name of object store(s) to include in transaction (string or array of strings)\r\n * @param mode - Transaction mode ('readonly' or 'readwrite')\r\n * @returns A transaction handler object\r\n */\r\nconst transaction = (\r\n  dbObject: IDBDatabase,\r\n  stores: string | string[],\r\n  mode: IDBTransactionMode\r\n): TransactionHandler => {\r\n  const tx = dbObject.transaction(stores, mode)\r\n\r\n  return {\r\n    tx,\r\n    getStore(name: string): Promise<IDBObjectStore> {\r\n      return new Promise((resolve, reject) => {\r\n        // Set up error handler first\r\n        tx.onerror = () => {\r\n          reject(\r\n            new TransactionError(tx.error?.message || 'Transaction failed')\r\n          )\r\n        }\r\n\r\n        // Set up abort handler\r\n        tx.onabort = () => {\r\n          reject(\r\n            new TransactionError(tx.error?.message || 'Transaction was aborted')\r\n          )\r\n        }\r\n\r\n        try {\r\n          // Get the object store\r\n          const store = tx.objectStore(name)\r\n          resolve(store)\r\n        } catch (error) {\r\n          reject(\r\n            error instanceof Error\r\n              ? new StoreNotFoundError(name)\r\n              : new TransactionError('Failed to access object store')\r\n          )\r\n        }\r\n      })\r\n    },\r\n    commit(): Promise<void> {\r\n      return new Promise((resolve, reject) => {\r\n        tx.oncomplete = () => resolve()\r\n        tx.onerror = () =>\r\n          reject(\r\n            new TransactionError(tx.error?.message || 'Transaction failed')\r\n          )\r\n        tx.onabort = () =>\r\n          reject(new TransactionError('Transaction was aborted'))\r\n      })\r\n    },\r\n    abort(): void {\r\n      tx.abort()\r\n    },\r\n  }\r\n}\r\n\r\n/**\r\n * Retrieves a single object from an IndexedDB object store\r\n * @param store - The IndexedDB object store to query\r\n * @param key - The key of the object to retrieve\r\n * @returns A promise that resolves with the retrieved object or undefined if not found\r\n */\r\nconst getObjectData = <T = any>(\r\n  store: IDBObjectStore,\r\n  key: IDBValidKey\r\n): Promise<T | undefined> => {\r\n  return new Promise<T | undefined>((resolve, reject) => {\r\n    const request = store.get(key)\r\n\r\n    request.onsuccess = () => {\r\n      resolve(request.result)\r\n    }\r\n\r\n    request.onerror = () => {\r\n      reject(\r\n        new IndexedDBError(request.error?.message || 'Failed to retrieve data')\r\n      )\r\n    }\r\n  })\r\n}\r\n\r\n/**\r\n * Retrieves all objects from an IndexedDB object store\r\n * @param store - The IndexedDB object store to query\r\n * @returns A promise that resolves with an array of all objects in the store\r\n */\r\nconst getAllObjectData = <T = any>(store: IDBObjectStore): Promise<T[]> => {\r\n  return new Promise<T[]>((resolve, reject) => {\r\n    const request = store.getAll()\r\n\r\n    request.onsuccess = () => {\r\n      resolve(request.result)\r\n    }\r\n\r\n    request.onerror = () => {\r\n      reject(\r\n        new IndexedDBError(\r\n          request.error?.message || 'Failed to retrieve all data'\r\n        )\r\n      )\r\n    }\r\n  })\r\n}\r\n\r\n/**\r\n * Queries objects from an IndexedDB object store with advanced options\r\n * @param store - The IndexedDB object store to query\r\n * @param options - Query options including index, direction, limit, offset\r\n * @returns A promise that resolves with an array of matching objects\r\n */\r\nconst queryObjectData = <T = any>(\r\n  store: IDBObjectStore,\r\n  options: QueryOptions = {}\r\n): Promise<T[]> => {\r\n  return new Promise<T[]>((resolve, reject) => {\r\n    const { index, direction = 'next', limit, offset = 0 } = options\r\n    const results: T[] = []\r\n    let skipped = 0\r\n    let counted = 0\r\n\r\n    try {\r\n      const source = index ? store.index(index) : store\r\n      const request = source.openCursor(undefined, direction)\r\n\r\n      request.onsuccess = () => {\r\n        const cursor = request.result\r\n\r\n        if (!cursor) {\r\n          resolve(results)\r\n          return\r\n        }\r\n\r\n        // Skip offset items\r\n        if (skipped < offset) {\r\n          skipped++\r\n          cursor.continue()\r\n          return\r\n        }\r\n\r\n        // Check limit\r\n        if (limit && counted >= limit) {\r\n          resolve(results)\r\n          return\r\n        }\r\n\r\n        results.push(cursor.value)\r\n        counted++\r\n        cursor.continue()\r\n      }\r\n\r\n      request.onerror = () => {\r\n        reject(new IndexedDBError(request.error?.message || 'Query failed'))\r\n      }\r\n    } catch (error) {\r\n      reject(\r\n        new IndexedDBError(\r\n          error instanceof Error ? error.message : 'Query setup failed'\r\n        )\r\n      )\r\n    }\r\n  })\r\n}\r\n\r\n/**\r\n * Counts objects in an IndexedDB object store\r\n * @param store - The IndexedDB object store to count\r\n * @param keyRange - Optional key range to count within\r\n * @returns A promise that resolves with the count\r\n */\r\nconst countObjectData = (\r\n  store: IDBObjectStore,\r\n  keyRange?: IDBKeyRange\r\n): Promise<number> => {\r\n  return new Promise<number>((resolve, reject) => {\r\n    const request = store.count(keyRange)\r\n\r\n    request.onsuccess = () => {\r\n      resolve(request.result)\r\n    }\r\n\r\n    request.onerror = () => {\r\n      reject(new IndexedDBError(request.error?.message || 'Count failed'))\r\n    }\r\n  })\r\n}\r\n\r\n/**\r\n * Adds a new object to an IndexedDB object store\r\n * @param store - The IndexedDB object store to add data to\r\n * @param data - The data object to add to the store\r\n * @returns A promise that resolves with all objects in the store after addition\r\n * @throws If the add operation fails (e.g., due to constraint violation)\r\n */\r\nconst addObjectData = <T = any>(\r\n  store: IDBObjectStore,\r\n  data: T\r\n): Promise<T[]> => {\r\n  return new Promise<T[]>((resolve, reject) => {\r\n    const request = store.add(data)\r\n\r\n    request.onsuccess = () => {\r\n      // After successful addition, get all data from the store\r\n      getAllObjectData<T>(store)\r\n        .then(allData => resolve(allData))\r\n        .catch(error => reject(error))\r\n    }\r\n\r\n    request.onerror = () => {\r\n      const error = request.error\r\n      reject(\r\n        new IndexedDBError(error?.message || 'Failed to add data to store')\r\n      )\r\n    }\r\n  })\r\n}\r\n\r\n/**\r\n * Puts (adds or updates) an object in the IndexedDB object store\r\n * @param store - The IndexedDB object store to put data into\r\n * @param data - The data object to put in the store\r\n * @returns A promise that resolves with the key of the stored object\r\n */\r\nconst putObjectData = <T = any>(\r\n  store: IDBObjectStore,\r\n  data: T\r\n): Promise<IDBValidKey> => {\r\n  return new Promise<IDBValidKey>((resolve, reject) => {\r\n    const request = store.put(data)\r\n\r\n    request.onsuccess = () => {\r\n      resolve(request.result)\r\n    }\r\n\r\n    request.onerror = () => {\r\n      reject(new IndexedDBError(request.error?.message || 'Failed to put data'))\r\n    }\r\n  })\r\n}\r\n\r\n/**\r\n * Bulk adds multiple objects to an IndexedDB object store\r\n * @param store - The IndexedDB object store to add data to\r\n * @param dataArray - Array of data objects to add\r\n * @returns A promise that resolves with an array of added object keys\r\n */\r\nconst bulkAddObjectData = <T = any>(\r\n  store: IDBObjectStore,\r\n  dataArray: T[]\r\n): Promise<IDBValidKey[]> => {\r\n  return new Promise<IDBValidKey[]>((resolve, reject) => {\r\n    const results: IDBValidKey[] = []\r\n    let completed = 0\r\n\r\n    if (dataArray.length === 0) {\r\n      resolve([])\r\n      return\r\n    }\r\n\r\n    dataArray.forEach((data, index) => {\r\n      const request = store.add(data)\r\n\r\n      request.onsuccess = () => {\r\n        results[index] = request.result\r\n        completed++\r\n\r\n        if (completed === dataArray.length) {\r\n          resolve(results)\r\n        }\r\n      }\r\n\r\n      request.onerror = () => {\r\n        reject(\r\n          new IndexedDBError(\r\n            request.error?.message || `Failed to add item at index ${index}`\r\n          )\r\n        )\r\n      }\r\n    })\r\n  })\r\n}\r\n\r\n/**\r\n * Updates an object in the IndexedDB object store\r\n * @param store - The IndexedDB object store to update data in\r\n * @param keyPath - The property name to use for finding the object to update\r\n * @param key - The value to match against the keyPath\r\n * @param newData - The new data to replace the existing object with\r\n * @returns A promise that resolves with all objects in the store after update\r\n * @throws If the object is not found or update operation fails\r\n */\r\nconst updateObjectData = <T = any>(\r\n  store: IDBObjectStore,\r\n  keyPath: string,\r\n  key: string | number,\r\n  newData: T\r\n): Promise<T[]> => {\r\n  return new Promise<T[]>((resolve, reject) => {\r\n    // First check if the object exists\r\n    getAllObjectData<T>(store)\r\n      .then(allData => {\r\n        const target = allData.find((data: any) => data[keyPath] === key)\r\n\r\n        if (!target) {\r\n          return reject(\r\n            new IndexedDBError(\r\n              `There's no object in the ${store.name} whose ${keyPath} matches ${key}.`\r\n            )\r\n          )\r\n        }\r\n\r\n        // Open a cursor to find and update the object\r\n        const cursorRequest = store.openCursor()\r\n        let found = false\r\n\r\n        cursorRequest.onsuccess = () => {\r\n          const cursor = cursorRequest.result\r\n\r\n          // If cursor is null, we've reached the end without finding the object\r\n          if (!cursor) {\r\n            if (!found) {\r\n              reject(\r\n                new IndexedDBError(\r\n                  `Failed to locate object for update with ${keyPath}=${key}`\r\n                )\r\n              )\r\n            }\r\n            return\r\n          }\r\n\r\n          // Check if this is our target object\r\n          if (cursor.value[keyPath] === key) {\r\n            found = true\r\n            const updateRequest = cursor.update(newData)\r\n\r\n            updateRequest.onsuccess = () => {\r\n              getAllObjectData<T>(store)\r\n                .then(updatedData => resolve(updatedData))\r\n                .catch(error => reject(error))\r\n            }\r\n\r\n            updateRequest.onerror = () => {\r\n              reject(\r\n                new IndexedDBError(\r\n                  updateRequest.error?.message || 'Update operation failed'\r\n                )\r\n              )\r\n            }\r\n          } else {\r\n            // Continue to the next item\r\n            cursor.continue()\r\n          }\r\n        }\r\n\r\n        cursorRequest.onerror = () => {\r\n          reject(\r\n            new IndexedDBError(\r\n              cursorRequest.error?.message || 'Cursor operation failed'\r\n            )\r\n          )\r\n        }\r\n      })\r\n      .catch(error => reject(error))\r\n  })\r\n}\r\n\r\n/**\r\n * Deletes an object from an IndexedDB object store\r\n * @param store - The IndexedDB object store to delete data from\r\n * @param key - The key of the object to delete\r\n * @returns A promise that resolves with a tuple containing [deletedObject, allRemainingObjects]\r\n * @throws If the delete operation fails\r\n */\r\nconst deleteObjectData = <T = any>(\r\n  store: IDBObjectStore,\r\n  key: IDBValidKey\r\n): Promise<[T | undefined, T[]]> => {\r\n  return new Promise<[T | undefined, T[]]>((resolve, reject) => {\r\n    // First get the object to return it after deletion\r\n    let deletedObject: T | undefined\r\n\r\n    getObjectData<T>(store, key)\r\n      .then(object => {\r\n        deletedObject = object\r\n\r\n        if (deletedObject === undefined) {\r\n          return reject(\r\n            new IndexedDBError(\r\n              `Object with key \"${key}\" not found in store \"${store.name}\"`\r\n            )\r\n          )\r\n        }\r\n\r\n        // Now delete the object\r\n        const deleteRequest = store.delete(key)\r\n\r\n        deleteRequest.onsuccess = () => {\r\n          // After successful deletion, get all remaining data\r\n          getAllObjectData<T>(store)\r\n            .then(allData => resolve([deletedObject, allData]))\r\n            .catch(error => reject(error))\r\n        }\r\n\r\n        deleteRequest.onerror = () => {\r\n          reject(\r\n            new IndexedDBError(\r\n              deleteRequest.error?.message || 'Delete operation failed'\r\n            )\r\n          )\r\n        }\r\n      })\r\n      .catch(error => {\r\n        reject(\r\n          new IndexedDBError(\r\n            `Failed to retrieve object before deletion: ${error.message}`\r\n          )\r\n        )\r\n      })\r\n  })\r\n}\r\n\r\n/**\r\n * Clears all objects from an IndexedDB object store\r\n * @param store - The IndexedDB object store to clear\r\n * @returns A promise that resolves when the store is cleared\r\n */\r\nconst clearObjectStore = (store: IDBObjectStore): Promise<void> => {\r\n  return new Promise<void>((resolve, reject) => {\r\n    const request = store.clear()\r\n\r\n    request.onsuccess = () => {\r\n      resolve()\r\n    }\r\n\r\n    request.onerror = () => {\r\n      reject(\r\n        new IndexedDBError(request.error?.message || 'Clear operation failed')\r\n      )\r\n    }\r\n  })\r\n}\r\n\r\n/**\r\n * High-level class for easy IndexedDB operations\r\n */\r\nexport class IndexedDBUtil {\r\n  private dbName: string\r\n  private dbVersion: number\r\n  private db: IDBDatabase | null = null\r\n  private stores: IDBStoreConfig[]\r\n\r\n  constructor(config: DatabaseConfig) {\r\n    this.dbName = config.name\r\n    this.dbVersion = config.version\r\n    this.stores = config.stores\r\n  }\r\n\r\n  /**\r\n   * Initialize the database connection\r\n   */\r\n  async init(): Promise<void> {\r\n    if (!isIndexedDBSupported()) {\r\n      throw new IndexedDBError('IndexedDB is not supported in this browser!')\r\n    }\r\n\r\n    this.db = await createDB(this.dbName, this.dbVersion, this.stores)\r\n  }\r\n\r\n  /**\r\n   * Get the database instance\r\n   */\r\n  getDB(): IDBDatabase {\r\n    if (!this.db) {\r\n      throw new IndexedDBError('Database not initialized. Call init() first.')\r\n    }\r\n    return this.db\r\n  }\r\n\r\n  /**\r\n   * Create a transaction for multiple operations\r\n   */\r\n  transaction(\r\n    stores: string | string[],\r\n    mode: IDBTransactionMode = 'readonly'\r\n  ): TransactionHandler {\r\n    return transaction(this.getDB(), stores, mode)\r\n  }\r\n\r\n  /**\r\n   * Get a single object by key\r\n   */\r\n  async get<T = any>(\r\n    storeName: string,\r\n    key: IDBValidKey\r\n  ): Promise<T | undefined> {\r\n    const tx = this.transaction(storeName, 'readonly')\r\n    const store = await tx.getStore(storeName)\r\n    return getObjectData<T>(store, key)\r\n  }\r\n\r\n  /**\r\n   * Get all objects from a store\r\n   */\r\n  async getAll<T = any>(storeName: string): Promise<T[]> {\r\n    const tx = this.transaction(storeName, 'readonly')\r\n    const store = await tx.getStore(storeName)\r\n    return getAllObjectData<T>(store)\r\n  }\r\n\r\n  /**\r\n   * Query objects with advanced options\r\n   */\r\n  async query<T = any>(\r\n    storeName: string,\r\n    options: QueryOptions = {}\r\n  ): Promise<T[]> {\r\n    const tx = this.transaction(storeName, 'readonly')\r\n    const store = await tx.getStore(storeName)\r\n    return queryObjectData<T>(store, options)\r\n  }\r\n\r\n  /**\r\n   * Count objects in a store\r\n   */\r\n  async count(storeName: string, keyRange?: IDBKeyRange): Promise<number> {\r\n    const tx = this.transaction(storeName, 'readonly')\r\n    const store = await tx.getStore(storeName)\r\n    return countObjectData(store, keyRange)\r\n  }\r\n\r\n  /**\r\n   * Add a new object\r\n   */\r\n  async add<T = any>(storeName: string, data: T): Promise<T[]> {\r\n    const tx = this.transaction(storeName, 'readwrite')\r\n    const store = await tx.getStore(storeName)\r\n    const result = await addObjectData<T>(store, data)\r\n    await tx.commit()\r\n    return result\r\n  }\r\n\r\n  /**\r\n   * Put (add or update) an object\r\n   */\r\n  async put<T = any>(storeName: string, data: T): Promise<IDBValidKey> {\r\n    const tx = this.transaction(storeName, 'readwrite')\r\n    const store = await tx.getStore(storeName)\r\n    const result = await putObjectData<T>(store, data)\r\n    await tx.commit()\r\n    return result\r\n  }\r\n\r\n  /**\r\n   * Bulk add multiple objects\r\n   */\r\n  async bulkAdd<T = any>(\r\n    storeName: string,\r\n    dataArray: T[]\r\n  ): Promise<IDBValidKey[]> {\r\n    const tx = this.transaction(storeName, 'readwrite')\r\n    const store = await tx.getStore(storeName)\r\n    const result = await bulkAddObjectData<T>(store, dataArray)\r\n    await tx.commit()\r\n    return result\r\n  }\r\n\r\n  /**\r\n   * Update an object\r\n   */\r\n  async update<T = any>(\r\n    storeName: string,\r\n    keyPath: string,\r\n    key: string | number,\r\n    newData: T\r\n  ): Promise<T[]> {\r\n    const tx = this.transaction(storeName, 'readwrite')\r\n    const store = await tx.getStore(storeName)\r\n    const result = await updateObjectData<T>(store, keyPath, key, newData)\r\n    await tx.commit()\r\n    return result\r\n  }\r\n\r\n  /**\r\n   * Delete an object\r\n   */\r\n  async delete<T = any>(\r\n    storeName: string,\r\n    key: IDBValidKey\r\n  ): Promise<[T | undefined, T[]]> {\r\n    const tx = this.transaction(storeName, 'readwrite')\r\n    const store = await tx.getStore(storeName)\r\n    const result = await deleteObjectData<T>(store, key)\r\n    await tx.commit()\r\n    return result\r\n  }\r\n\r\n  /**\r\n   * Clear all objects from a store\r\n   */\r\n  async clear(storeName: string): Promise<void> {\r\n    const tx = this.transaction(storeName, 'readwrite')\r\n    const store = await tx.getStore(storeName)\r\n    await clearObjectStore(store)\r\n    await tx.commit()\r\n  }\r\n\r\n  /**\r\n   * Close the database connection\r\n   */\r\n  close(): void {\r\n    if (this.db) {\r\n      this.db.close()\r\n      this.db = null\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Delete the entire database\r\n   */\r\n  static async deleteDatabase(name: string): Promise<void> {\r\n    return new Promise<void>((resolve, reject) => {\r\n      const deleteRequest = indexedDB.deleteDatabase(name)\r\n\r\n      deleteRequest.onsuccess = () => {\r\n        resolve()\r\n      }\r\n\r\n      deleteRequest.onerror = () => {\r\n        reject(\r\n          new IndexedDBError(\r\n            deleteRequest.error?.message || 'Failed to delete database'\r\n          )\r\n        )\r\n      }\r\n\r\n      deleteRequest.onblocked = () => {\r\n        reject(new IndexedDBError('Database deletion was blocked'))\r\n      }\r\n    })\r\n  }\r\n}\r\n\r\n/**\r\n * Utility functions for key range operations\r\n */\r\nexport const KeyRange = {\r\n  /**\r\n   * Create a key range that matches a single value\r\n   */\r\n  only(value: any): IDBKeyRange {\r\n    return IDBKeyRange.only(value)\r\n  },\r\n\r\n  /**\r\n   * Create a key range with lower bound\r\n   */\r\n  lowerBound(lower: any, open = false): IDBKeyRange {\r\n    return IDBKeyRange.lowerBound(lower, open)\r\n  },\r\n\r\n  /**\r\n   * Create a key range with upper bound\r\n   */\r\n  upperBound(upper: any, open = false): IDBKeyRange {\r\n    return IDBKeyRange.upperBound(upper, open)\r\n  },\r\n\r\n  /**\r\n   * Create a key range with both bounds\r\n   */\r\n  bound(\r\n    lower: any,\r\n    upper: any,\r\n    lowerOpen = false,\r\n    upperOpen = false\r\n  ): IDBKeyRange {\r\n    return IDBKeyRange.bound(lower, upper, lowerOpen, upperOpen)\r\n  },\r\n}\r\n\r\nconst DB = {\r\n  createDB,\r\n  openDB,\r\n  transaction,\r\n  getObjectData,\r\n  getAllObjectData,\r\n  queryObjectData,\r\n  countObjectData,\r\n  addObjectData,\r\n  putObjectData,\r\n  bulkAddObjectData,\r\n  deleteObjectData,\r\n  updateObjectData,\r\n  clearObjectStore,\r\n  isIndexedDBSupported,\r\n  getBrowserCompatibility,\r\n  IndexedDBUtil,\r\n  KeyRange,\r\n}\r\n\r\nexport {\r\n  createDB,\r\n  openDB,\r\n  transaction,\r\n  getObjectData,\r\n  getAllObjectData,\r\n  queryObjectData,\r\n  countObjectData,\r\n  addObjectData,\r\n  putObjectData,\r\n  bulkAddObjectData,\r\n  deleteObjectData,\r\n  updateObjectData,\r\n  clearObjectStore,\r\n}\r\n\r\nexport default DB\r\n"],"names":["IndexedDBError","message","code","DatabaseNotFoundError","dbName","StoreNotFoundError","storeName","TransactionError","isIndexedDBSupported","getBrowserCompatibility","createDB","name","version","stores","resolve","reject","request","event","db","store","objectStore","_a","indexConfig","__async","storesWithData","tx","existingData","res","rej","getAllRequest","e","existingIds","item","error","openDB","transaction","dbObject","mode","getObjectData","key","getAllObjectData","queryObjectData","options","index","direction","limit","offset","results","skipped","counted","cursor","countObjectData","keyRange","addObjectData","data","allData","putObjectData","bulkAddObjectData","dataArray","completed","updateObjectData","keyPath","newData","cursorRequest","found","updateRequest","updatedData","deleteObjectData","deletedObject","object","deleteRequest","clearObjectStore","IndexedDBUtil","config","_0","result","KeyRange","value","lower","open","upper","lowerOpen","upperOpen","DB"],"mappings":"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"}