// Basic service worker for PWA installability and future caching // Generated by Copilot — you can extend with runtime caching if needed. const CACHE_NAME = 'cvl-cache-v1'; const APP_SHELL = [ '/', '/index.html', '/icon.png', // Vite will handle asset hashing; we keep shell minimal to avoid stale caches. ]; self.addEventListener('install', (event) => { // Skip waiting so updates activate faster. self.skipWaiting(); event.waitUntil( caches.open(CACHE_NAME).then((cache) => cache.addAll(APP_SHELL)).catch(() => void 0) ); }); self.addEventListener('activate', (event) => { event.waitUntil( caches.keys().then((keys) => Promise.all( keys.map((k) => (k === CACHE_NAME ? undefined : caches.delete(k))) ) ) ); // Take control of uncontrolled clients as soon as possible. self.clients.claim(); }); self.addEventListener('fetch', (event) => { const { request } = event; // Only handle GET requests and same-origin. if (request.method !== 'GET' || new URL(request.url).origin !== self.location.origin) { return; } // Network-first for HTML navigations; cache-first for others. if (request.mode === 'navigate') { event.respondWith( fetch(request) .then((resp) => { const copy = resp.clone(); caches.open(CACHE_NAME).then((cache) => cache.put('/', copy)).catch(() => void 0); return resp; }) .catch(() => caches.match('/') || caches.match('/index.html')) ); } else { event.respondWith( caches.match(request).then((cached) => cached || fetch(request).then((resp) => { const copy = resp.clone(); caches.open(CACHE_NAME).then((cache) => cache.put(request, copy)).catch(() => void 0); return resp; }).catch(() => cached) ) ); } });