import { sveltekit } from '@sveltejs/kit/vite'; import { defineConfig } from 'vitest/config'; import { VitePWA } from 'vite-plugin-pwa'; // A revision that changes on every build, so the SW always re-fetches index.html // when the app is redeployed. index.html is not picked up by globPatterns because // the static adapter creates it AFTER the service worker precache manifest is // generated — so we add it explicitly here instead. const buildId = Date.now().toString(); export default defineConfig({ plugins: [ sveltekit(), VitePWA({ registerType: 'autoUpdate', strategies: 'generateSW', injectRegister: false, workbox: { globPatterns: ['**/*.{js,css,svg,png,ico,woff,woff2}'], additionalManifestEntries: [ { url: '/', revision: buildId }, { url: '/index.html', revision: buildId }, { url: '/today', revision: buildId } ], cleanupOutdatedCaches: true, clientsClaim: true, navigateFallback: '/index.html', navigateFallbackDenylist: [/^\/api/, /^\/healthz/], runtimeCaching: [ { urlPattern: /^\/api\//, handler: 'NetworkFirst', options: { cacheName: 'api-cache', networkTimeoutSeconds: 5, cacheableResponse: { statuses: [0, 200] } } } ] }, devOptions: { enabled: true, type: 'module' }, manifest: { name: 'Wotra — Working Time Tracker', short_name: 'Wotra', description: 'Track your working hours, close days and weeks, compute overtime.', theme_color: '#1a1a2e', background_color: '#f8f9fa', display: 'standalone', start_url: '/today', icons: [ { src: '/icon-192.png', sizes: '192x192', type: 'image/png' }, { src: '/icon-512.png', sizes: '512x512', type: 'image/png' } ] } }) ], server: { proxy: { '/api': 'http://localhost:8080', '/healthz': 'http://localhost:8080' } }, test: { environment: 'jsdom', globals: true, include: ['src/**/*.test.ts'] } });