interface TypedStorage<T> {
    get(): T | null;
    set(value: T): void;
    remove(): void;
    key: string;
}
interface StorageOptions<T> {
    serialize?: (v: T) => string;
    deserialize?: (s: string) => T;
    /** Optional validator — return true if the deserialized value is valid. */
    validate?: (v: unknown) => v is T;
}

/**
 * Forma Storage - Local
 *
 * Typed localStorage wrapper with graceful error handling.
 * Zero dependencies — native browser APIs only.
 */

/**
 * Create a typed localStorage wrapper for the given key.
 *
 * ```ts
 * const store = createLocalStorage<{ name: string }>('user');
 * store.set({ name: 'Alice' });
 * store.get(); // { name: 'Alice' }
 * store.remove();
 * ```
 */
declare function createLocalStorage<T>(key: string, options?: StorageOptions<T>): TypedStorage<T>;

/**
 * Forma Storage - Session
 *
 * Typed sessionStorage wrapper with graceful error handling.
 * Zero dependencies — native browser APIs only.
 */

/**
 * Create a typed sessionStorage wrapper for the given key.
 *
 * ```ts
 * const store = createSessionStorage<{ token: string }>('auth');
 * store.set({ token: 'abc123' });
 * store.get(); // { token: 'abc123' }
 * store.remove();
 * ```
 */
declare function createSessionStorage<T>(key: string, options?: StorageOptions<T>): TypedStorage<T>;

/**
 * Forma Storage - IndexedDB
 *
 * Simplified IndexedDB wrapper with lazy connection and promise-based API.
 * Zero dependencies — native browser APIs only.
 */
interface IDBStore<T> {
    get(key: string): Promise<T | undefined>;
    set(key: string, value: T): Promise<void>;
    delete(key: string): Promise<void>;
    getAll(): Promise<T[]>;
    keys(): Promise<string[]>;
    clear(): Promise<void>;
}
/**
 * Create a simplified IndexedDB store.
 *
 * ```ts
 * const store = createIndexedDB<User>('myApp', 'users');
 * await store.set('u1', { name: 'Alice' });
 * const user = await store.get('u1'); // { name: 'Alice' }
 * ```
 */
declare function createIndexedDB<T>(dbName: string, storeName?: string): IDBStore<T>;

export { type IDBStore, type StorageOptions, type TypedStorage, createIndexedDB, createLocalStorage, createSessionStorage };
