40 lines
1.4 KiB
TypeScript
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(),
|
|
}));
|
|
}
|