chore: add prettier formatting
All checks were successful
CI / Lint, typecheck and build (push) Successful in 9m56s

This commit is contained in:
zv
2026-06-14 20:26:56 +02:00
parent 8bbd9397a1
commit ee55521803
79 changed files with 2451 additions and 969 deletions

View File

@@ -19,48 +19,57 @@ function normalizeSources(value: unknown): ForecastSource[] {
}
function normalizeHourlyForecast(value: unknown): HourlyForecast[] {
return Array.isArray(value) ? value.flatMap((candidate) => {
if (!candidate || typeof candidate !== "object") return [];
const row = candidate as Partial<HourlyForecast>;
const time = readString(row.time);
if (!time) return [];
return [{
time,
temperature: readNumber(row.temperature),
feelsLike: readNumber(row.feelsLike),
precipitationProbability: readNumber(row.precipitationProbability),
precipitation: readNumber(row.precipitation),
weatherCode: readNumber(row.weatherCode),
windSpeed: readNumber(row.windSpeed),
source: isForecastSource(row.source) ? row.source : "open-meteo",
}];
}) : [];
return Array.isArray(value)
? value.flatMap((candidate) => {
if (!candidate || typeof candidate !== "object") return [];
const row = candidate as Partial<HourlyForecast>;
const time = readString(row.time);
if (!time) return [];
return [
{
time,
temperature: readNumber(row.temperature),
feelsLike: readNumber(row.feelsLike),
precipitationProbability: readNumber(row.precipitationProbability),
precipitation: readNumber(row.precipitation),
weatherCode: readNumber(row.weatherCode),
windSpeed: readNumber(row.windSpeed),
source: isForecastSource(row.source) ? row.source : "open-meteo",
},
];
})
: [];
}
function normalizeDailyForecast(value: unknown): DailyForecast[] {
return Array.isArray(value) ? value.flatMap((candidate) => {
if (!candidate || typeof candidate !== "object") return [];
const row = candidate as Partial<DailyForecast>;
const date = readString(row.date);
if (!date) return [];
return [{
date,
temperatureMax: readNumber(row.temperatureMax),
temperatureMin: readNumber(row.temperatureMin),
precipitationProbability: readNumber(row.precipitationProbability),
precipitation: readNumber(row.precipitation),
weatherCode: readNumber(row.weatherCode),
sunrise: readString(row.sunrise),
sunset: readString(row.sunset),
sources: normalizeSources(row.sources),
}];
}) : [];
return Array.isArray(value)
? value.flatMap((candidate) => {
if (!candidate || typeof candidate !== "object") return [];
const row = candidate as Partial<DailyForecast>;
const date = readString(row.date);
if (!date) return [];
return [
{
date,
temperatureMax: readNumber(row.temperatureMax),
temperatureMin: readNumber(row.temperatureMin),
precipitationProbability: readNumber(row.precipitationProbability),
precipitation: readNumber(row.precipitation),
weatherCode: readNumber(row.weatherCode),
sunrise: readString(row.sunrise),
sunset: readString(row.sunset),
sources: normalizeSources(row.sources),
},
];
})
: [];
}
function normalizeForecast(raw: Partial<WeatherForecast>): WeatherForecast {
const latitude = Number(raw.latitude);
const longitude = Number(raw.longitude);
if (!Number.isFinite(latitude) || !Number.isFinite(longitude)) throw new Error("Forecast service returned invalid coordinates.");
if (!Number.isFinite(latitude) || !Number.isFinite(longitude))
throw new Error("Forecast service returned invalid coordinates.");
const region: WeatherRegion = raw.region === "GLOBAL" ? "GLOBAL" : "PL";
return {
latitude,
@@ -71,7 +80,9 @@ function normalizeForecast(raw: Partial<WeatherForecast>): WeatherForecast {
daily: normalizeDailyForecast(raw.daily),
sources: normalizeSources(raw.sources),
capabilities: raw.capabilities ?? getWeatherCapabilities(region),
unavailableReasons: Array.isArray(raw.unavailableReasons) ? raw.unavailableReasons.filter((value): value is string => typeof value === "string") : [],
unavailableReasons: Array.isArray(raw.unavailableReasons)
? raw.unavailableReasons.filter((value): value is string => typeof value === "string")
: [],
};
}
@@ -79,5 +90,5 @@ export async function fetchForecast(latitude: number, longitude: number, region:
const params = new URLSearchParams({ latitude: String(latitude), longitude: String(longitude), region });
const response = await fetch(`/api/forecast?${params}`, { signal });
if (!response.ok) throw new Error("Unable to load forecast.");
return normalizeForecast(await response.json() as Partial<WeatherForecast>);
return normalizeForecast((await response.json()) as Partial<WeatherForecast>);
}