import { createWebDavClient } from "./webdav"; import { createUpstashClient } from "./upstash"; export enum ProviderType { WebDAV = "webdav", UpStash = "upstash", } export const SyncClients = { [ProviderType.UpStash]: createUpstashClient, [ProviderType.WebDAV]: createWebDavClient, } as const; type SyncClientConfig = { [K in keyof typeof SyncClients]: (typeof SyncClients)[K] extends ( _: infer C, ) => any ? C : never; }; export type SyncClient = { get: (key: string) => Promise; set: (key: string, value: string) => Promise; check: () => Promise; }; export function createSyncClient( provider: T, config: SyncClientConfig[T], ): SyncClient { return SyncClients[provider](config as any) as any; }