type StorageValue = null | string | number | boolean | object; type WatchEvent = "update" | "remove"; type WatchCallback = (event: WatchEvent, key: string) => any; type MaybePromise = T | Promise; type MaybeDefined = T extends any ? T : any; type Unwatch = () => MaybePromise; interface StorageMeta { atime?: Date; mtime?: Date; ttl?: number; [key: string]: StorageValue | Date | undefined; } type TransactionOptions = Record; type GetKeysOptions = TransactionOptions & { maxDepth?: number; }; interface DriverFlags { maxDepth?: boolean; ttl?: boolean; } interface Driver { name?: string; flags?: DriverFlags; options?: OptionsT; getInstance?: () => InstanceT; hasItem: (key: string, opts: TransactionOptions) => MaybePromise; getItem: (key: string, opts?: TransactionOptions) => MaybePromise; /** @experimental */ getItems?: (items: { key: string; options?: TransactionOptions; }[], commonOptions?: TransactionOptions) => MaybePromise<{ key: string; value: StorageValue; }[]>; /** @experimental */ getItemRaw?: (key: string, opts: TransactionOptions) => MaybePromise; setItem?: (key: string, value: string, opts: TransactionOptions) => MaybePromise; /** @experimental */ setItems?: (items: { key: string; value: string; options?: TransactionOptions; }[], commonOptions?: TransactionOptions) => MaybePromise; /** @experimental */ setItemRaw?: (key: string, value: any, opts: TransactionOptions) => MaybePromise; removeItem?: (key: string, opts: TransactionOptions) => MaybePromise; getMeta?: (key: string, opts: TransactionOptions) => MaybePromise; getKeys: (base: string, opts: GetKeysOptions) => MaybePromise; clear?: (base: string, opts: TransactionOptions) => MaybePromise; dispose?: () => MaybePromise; watch?: (callback: WatchCallback) => MaybePromise; } type StorageDefinition = { items: unknown; [key: string]: unknown; }; type StorageItemMap = T extends StorageDefinition ? T["items"] : T; type StorageItemType = K extends keyof StorageItemMap ? StorageItemMap[K] : T extends StorageDefinition ? StorageValue : T; interface Storage { hasItem, K extends keyof StorageItemMap>(key: K, opts?: TransactionOptions): Promise; hasItem(key: string, opts?: TransactionOptions): Promise; getItem, K extends string & keyof StorageItemMap>(key: K, ops?: TransactionOptions): Promise | null>; getItem>(key: string, opts?: TransactionOptions): Promise; /** @experimental */ getItems: (items: (string | { key: string; options?: TransactionOptions; })[], commonOptions?: TransactionOptions) => Promise<{ key: string; value: U; }[]>; /** @experimental See https://github.com/unjs/unstorage/issues/142 */ getItemRaw: (key: string, opts?: TransactionOptions) => Promise | null>; setItem, K extends keyof StorageItemMap>(key: K, value: StorageItemType, opts?: TransactionOptions): Promise; setItem(key: string, value: U, opts?: TransactionOptions): Promise; /** @experimental */ setItems: (items: { key: string; value: U; options?: TransactionOptions; }[], commonOptions?: TransactionOptions) => Promise; /** @experimental See https://github.com/unjs/unstorage/issues/142 */ setItemRaw: (key: string, value: MaybeDefined, opts?: TransactionOptions) => Promise; removeItem, K extends keyof StorageItemMap>(key: K, opts?: (TransactionOptions & { removeMeta?: boolean; }) | boolean): Promise; removeItem(key: string, opts?: (TransactionOptions & { removeMeta?: boolean; }) | boolean): Promise; getMeta: (key: string, opts?: (TransactionOptions & { nativeOnly?: boolean; }) | boolean) => MaybePromise; setMeta: (key: string, value: StorageMeta, opts?: TransactionOptions) => Promise; removeMeta: (key: string, opts?: TransactionOptions) => Promise; getKeys: (base?: string, opts?: GetKeysOptions) => Promise; clear: (base?: string, opts?: TransactionOptions) => Promise; dispose: () => Promise; watch: (callback: WatchCallback) => Promise; unwatch: () => Promise; mount: (base: string, driver: Driver) => Storage; unmount: (base: string, dispose?: boolean) => Promise; getMount: (key?: string) => { base: string; driver: Driver; }; getMounts: (base?: string, options?: { parents?: boolean; }) => { base: string; driver: Driver; }[]; keys: Storage["getKeys"]; get: Storage["getItem"]; set: Storage["setItem"]; has: Storage["hasItem"]; del: Storage["removeItem"]; remove: Storage["removeItem"]; } export type { Driver as D, GetKeysOptions as G, StorageValue as S, TransactionOptions as T, Unwatch as U, WatchEvent as W, Storage as a, WatchCallback as b, StorageMeta as c, DriverFlags as d };