import { i as Subscribable, r as ServerReadable, s as Writable, t as Clearable } from "../../index-B0IeflOl.mjs";
import { i as StandardSchemaV1, n as ValidationSchemaObjectErrorProps } from "../../validate-C_H-c0gq.mjs";
import { c as IndexedDbStoreHandle, o as IndexedDbStore } from "../../index-FXJtYpbX.mjs";
import { WebStorageInput, WebStorageOutput } from "../web-storage/index.mjs";
//#region src/web/indexed-db-storage/index.d.ts
interface IndexedDbStorageOptions<S extends WebStorageInput> {
  schemas: S;
  defaultValues: WebStorageOutput<S>;
  keyTransform?: (key: keyof S) => string;
  onValidationError?: (props: ValidationSchemaObjectErrorProps<WebStorageOutput<S>>) => void | StandardSchemaV1.InferOutput<S[keyof S]>;
}
interface IndexedDbStorage<O extends Record<string, unknown>> extends Subscribable<O>, ServerReadable<O>, Writable<Partial<O>, O>, Clearable, IndexedDbStoreHandle {
  /** Update the cache now; persist asynchronously. Never rejects. */
  set: (value: Partial<O> | ((prev: O) => Partial<O>)) => Promise<void>;
  /** Reset cache to defaults; delete keys asynchronously. Never rejects. */
  clear: () => Promise<void>;
  /** Never rejects. */
  hydrate: () => Promise<O>;
  '~': {
    getDefaultValue: <K extends keyof O>(key: K) => O[K];
    getSchema: (key: keyof O) => StandardSchemaV1<unknown>;
    transformKey: (key: keyof O) => string;
  } & Subscribable<O>['~'];
}
/** Pass to `createIndexedDb({ stores })`; handle is on `db.stores`. */
type IndexedDbStorageDefinition<S extends WebStorageInput> = IndexedDbStore<IndexedDbStorage<WebStorageOutput<S>>>;
/**
 * Key/value store for `createIndexedDb({ stores })`. `get()` reads an
 * in-memory cache hydrated from IndexedDB (`await db.ready`). `set`/`clear`
 * update the cache now and persist later. SSR snapshot is `defaultValues`.
 *
 * @example Vanilla
 * ```ts twoslash title="settings-storage.ts"
 * import { createIndexedDb, createIndexedDbStorage } from 'seitu/web'
 * import * as z from 'zod'
 *
 * const db = createIndexedDb({
 *   name: 'app',
 *   stores: {
 *     settings: createIndexedDbStorage({
 *       schemas: {
 *         token: z.string().nullable(),
 *         preferences: z.object({ theme: z.enum(['light', 'dark']) }),
 *       },
 *       defaultValues: { token: null, preferences: { theme: 'light' } },
 *     }),
 *   },
 * })
 * const { settings } = db.stores
 *
 * settings.get()
 * await db.ready
 * await settings.set({ token: 'abc' })
 * settings.get() // { token: 'abc', preferences: { theme: 'light' } }
 * settings.subscribe(console.log)
 * ```
 *
 * @example React
 * ```tsx twoslash title="page.tsx"
 * 'use client'
 *
 * import { createIndexedDb, createIndexedDbStorage } from 'seitu/web'
 * import { useSubscription } from 'seitu/react'
 * import * as z from 'zod'
 *
 * const db = createIndexedDb({
 *   name: 'app',
 *   stores: {
 *     settings: createIndexedDbStorage({
 *       schemas: { count: z.number(), name: z.string() },
 *       defaultValues: { count: 0, name: '' },
 *     }),
 *   },
 * })
 *
 * export default function Page() {
 *   const value = useSubscription(db.stores.settings)
 *   return (
 *     <div>
 *       <span>{value.count}</span>
 *       <span>{value.name}</span>
 *     </div>
 *   )
 * }
 * ```
 */
declare function createIndexedDbStorage<S extends WebStorageInput>(options: IndexedDbStorageOptions<S>): IndexedDbStorageDefinition<S>;
//#endregion
export { IndexedDbStorage, IndexedDbStorageDefinition, IndexedDbStorageOptions, createIndexedDbStorage };