const CACHE_NAME = 'adonis-v1'; const OFFLINE_URL = '/pages/offline'; const PRECACHE = [ '/', OFFLINE_URL, ]; // Cache-first file extensions const CACHE_FIRST_EXT = ['.css', '.woff', '.woff2', '.ttf', '.otf']; self.addEventListener('install', (e) => { e.waitUntil( caches.open(CACHE_NAME) .then((c) => c.addAll(PRECACHE)) .then(() => self.skipWaiting()) ); }); self.addEventListener('activate', (e) => { e.waitUntil( caches.keys() .then((keys) => Promise.all(keys.filter((k) => k !== CACHE_NAME).map((k) => caches.delete(k))) ) .then(() => self.clients.claim()) ); }); self.addEventListener('fetch', (e) => { const req = e.request; const url = new URL(req.url); // Only handle GET; skip cross-origin non-asset requests if (req.method !== 'GET') return; const isSameOrigin = url.origin === self.location.origin; const isCDN = url.hostname.includes('cdn.shopify.com'); const isStaticExt = CACHE_FIRST_EXT.some((ext) => url.pathname.endsWith(ext)); if (isStaticExt || isCDN) { // Cache-first for static/CDN assets e.respondWith( caches.match(req).then((hit) => { if (hit) return hit; return fetch(req).then((res) => { if (res.ok) { const clone = res.clone(); caches.open(CACHE_NAME).then((c) => c.put(req, clone)); } return res; }); }) ); return; } if (isSameOrigin) { // Network-first for pages — fall back to offline page e.respondWith( fetch(req).catch(() => caches.match(req).then((hit) => hit || caches.match(OFFLINE_URL)) ) ); } });