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