wayfarer-weather/lib/weather/providers/index.ts
2026-10-31 21:50:28 -05:00

40 lines
1.4 KiB
TypeScript

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<ProviderId, WeatherProvider> = {
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(),
}));
}