import { sveltekit } from '@sveltejs/kit/vite'; import { SvelteKitPWA } from '@vite-pwa/sveltekit'; import { defineConfig } from 'vite'; export default defineConfig({ plugins: [ sveltekit(), SvelteKitPWA({ registerType: 'autoUpdate', injectRegister: null, strategies: 'generateSW', scope: '/', base: '/', manifest: { id: '/', name: 'Recipes', short_name: 'Recipes', description: 'Save, browse, and cook your recipes on any device.', lang: 'en', dir: 'ltr', start_url: '/', scope: '/', display: 'standalone', display_override: ['window-controls-overlay', 'standalone', 'minimal-ui', 'browser'], orientation: 'any', background_color: '#121212', theme_color: '#121212', categories: ['food', 'lifestyle', 'utilities'], prefer_related_applications: false, // Lets Chromium/Brave report an existing install via getInstalledRelatedApps(). related_applications: [ { platform: 'webapp', url: '/manifest.webmanifest' } ], icons: [ { src: '/icon-72x72.png', sizes: '72x72', type: 'image/png', purpose: 'any' }, { src: '/icon-96x96.png', sizes: '96x96', type: 'image/png', purpose: 'any' }, { src: '/icon-128x128.png', sizes: '128x128', type: 'image/png', purpose: 'any' }, { src: '/icon-144x144.png', sizes: '144x144', type: 'image/png', purpose: 'any' }, { src: '/icon-152x152.png', sizes: '152x152', type: 'image/png', purpose: 'any' }, { src: '/icon-192x192.png', sizes: '192x192', type: 'image/png', purpose: 'any' }, { src: '/icon-384x384.png', sizes: '384x384', type: 'image/png', purpose: 'any' }, { src: '/icon-512x512.png', sizes: '512x512', type: 'image/png', purpose: 'any' }, { src: '/maskable-icon-192x192.png', sizes: '192x192', type: 'image/png', purpose: 'maskable' }, { src: '/maskable-icon-512x512.png', sizes: '512x512', type: 'image/png', purpose: 'maskable' } ], shortcuts: [ { name: 'Dashboard', short_name: 'Dashboard', description: 'View your recipes', url: '/dashboard', icons: [{ src: '/icon-192x192.png', sizes: '192x192', type: 'image/png' }] }, { name: 'New recipe', short_name: 'New', description: 'Create a new recipe', url: '/recipe/new', icons: [{ src: '/icon-192x192.png', sizes: '192x192', type: 'image/png' }] } ] }, workbox: { navigateFallback: null, globPatterns: ['client/**/*.{js,css,ico,png,svg,webp,webmanifest,woff,woff2}'], cleanupOutdatedCaches: true, clientsClaim: true, skipWaiting: false, runtimeCaching: [ { urlPattern: ({ request }) => request.mode === 'navigate', handler: 'NetworkFirst', options: { cacheName: 'pages', networkTimeoutSeconds: 3, expiration: { maxEntries: 64, maxAgeSeconds: 60 * 60 * 24 }, cacheableResponse: { statuses: [0, 200] } } }, { urlPattern: ({ request }) => request.destination === 'image' || request.destination === 'font' || request.destination === 'style' || request.destination === 'script', handler: 'StaleWhileRevalidate', options: { cacheName: 'assets', expiration: { maxEntries: 128, maxAgeSeconds: 60 * 60 * 24 * 30 }, cacheableResponse: { statuses: [0, 200] } } } ] }, devOptions: { enabled: false, suppressWarnings: true, type: 'module' }, kit: { includeVersionFile: true } }) ] });