import type { Cache, CreateLogger, Database, DateProvider, HttpServer, TaskScheduling, Telemetry, } from "../index.js"; type DefaultSdkStore = { logger: CreateLogger; telemetry: Telemetry; date: DateProvider; cache: Cache; taskScheduling: TaskScheduling; database: Database; httpServer: HttpServer; }; type Fallback = K extends keyof DefaultSdkStore ? DefaultSdkStore[K] : K extends keyof TExtendedStore ? TExtendedStore[K] : never; export type DependencyStore> = { set( name: TKey, provider: Fallback, ): void; get( name: TKey, ): Fallback; }; export function createDependencyStore>( initialProviders: Partial< Omit & TExtendedStore > = {}, ): DependencyStore { type Store = typeof initialProviders; const store = initialProviders; return { set( name: TKey, provider: Fallback, ): void { store[name as keyof Store] = provider as Store[keyof Store]; }, get( name: TKey, ): Fallback { const provider = store[name as keyof Store]; if (!provider) { throw new Error(`No provider for ${name.toString()}`); } return provider as Fallback; }, }; }