import type { ProviderId, ProviderInfo, WeatherProvider } from "../types"; import { openMeteo } from "./openmeteo"; import { openWeather } from "./openweather"; import { tomorrowIo } from "./tomorrow"; import { weatherApi } from "./weatherapi"; /** * The provider registry. * To add a provider: write an adapter that satisfies WeatherProvider, * add it here, and add its id to ProviderId in ../types.ts. */ export const PROVIDERS: Record = { openweather: openWeather, weatherapi: weatherApi, tomorrow: tomorrowIo, openmeteo: openMeteo, }; /** Order shown in the picker. OpenWeather first because it's the default. */ const DISPLAY_ORDER: ProviderId[] = ["openweather", "weatherapi", "tomorrow", "openmeteo"]; export function isProviderId(value: string): value is ProviderId { return value in PROVIDERS; } /** A provider is ready if it needs no key, or its key is present. */ export function isReady(provider: WeatherProvider): boolean { return provider.envKey === null || Boolean(process.env[provider.envKey]?.trim()); } /** Configured providers available to the browser — never exposes keys or unconfigured sources. */ export function listProviders(): ProviderInfo[] { return DISPLAY_ORDER.map((id) => PROVIDERS[id]) .filter(isReady) .map((provider) => ({ id: provider.id, label: provider.label, ...provider.limits(), })); }