UNPKG

seitu

Version:
89 lines • 3.52 kB
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 };