47 lines
1.7 KiB
JavaScript
47 lines
1.7 KiB
JavaScript
import adapter from '@sveltejs/adapter-static';
|
|
import { vitePreprocess } from '@sveltejs/vite-plugin-svelte';
|
|
import fs from 'fs';
|
|
import path from 'path';
|
|
|
|
/** @type {import('@sveltejs/kit').Config} */
|
|
const config = {
|
|
// Consult https://svelte.dev/docs/kit/integrations
|
|
// for more information about preprocessors
|
|
preprocess: vitePreprocess(),
|
|
kit: {
|
|
// fallback: the SPA shell served for routes that were not prerendered
|
|
// (unlisted cities, GPS coordinate routes); the universal load then
|
|
// resolves the location client-side. Most static hosts serve 404.html
|
|
// for unknown paths automatically.
|
|
adapter: adapter({ fallback: '404.html' }),
|
|
// Pregenerate city pages to improve SEO during static build
|
|
prerender: {
|
|
// dynamic per-location routes (14-day, compare, unlisted cities) are
|
|
// served by the SPA fallback instead of being prerendered
|
|
handleUnseenRoutes: 'ignore',
|
|
// a transient geocoding failure for one city should skip that page
|
|
// (the fallback still serves it), not abort the whole build
|
|
handleHttpError: ({ path, message }) => {
|
|
console.warn(`prerender skipped ${path}: ${message}`);
|
|
},
|
|
entries: (() => {
|
|
try {
|
|
const citiesPath = path.resolve('src/routes/weather/locations/city-names100.json');
|
|
const raw = fs.readFileSync(citiesPath, 'utf-8');
|
|
const cities = JSON.parse(raw);
|
|
if (Array.isArray(cities)) {
|
|
const cityEntries = cities.map((c) => `/weather/week/${c}`);
|
|
// Keep the default wildcard to include other routes
|
|
return ['*', ...cityEntries];
|
|
}
|
|
} catch {
|
|
// If anything goes wrong, fall back to default behavior
|
|
}
|
|
return ['*'];
|
|
})()
|
|
}
|
|
}
|
|
};
|
|
|
|
export default config;
|