// Minimal service worker for the AtomCMS-Next PWA. Cache-first for immutable // static assets, network-first for navigations (with a cached fallback so the // shell still loads offline). Bump CACHE to invalidate. const CACHE = "atom-v1"; self.addEventListener("install", () => { self.skipWaiting(); }); self.addEventListener("activate", (event) => { event.waitUntil( caches .keys() .then((keys) => Promise.all( keys.filter((k) => k !== CACHE).map((k) => caches.delete(k)), ), ) .then(() => self.clients.claim()), ); }); self.addEventListener("fetch", (event) => { const req = event.request; if (req.method !== "GET") return; const url = new URL(req.url); if (url.origin !== self.location.origin) return; // Cache-first for immutable static assets. if ( url.pathname.startsWith("/assets/") || url.pathname.startsWith("/_next/static/") ) { event.respondWith( caches.open(CACHE).then((cache) => cache.match(req).then( (hit) => hit || fetch(req).then((res) => { if (res.ok) cache.put(req, res.clone()); return res; }), ), ), ); return; } // Network-first for page navigations; fall back to cache, then the shell. if (req.mode === "navigate") { event.respondWith( fetch(req) .then((res) => { const copy = res.clone(); caches .open(CACHE) .then((c) => c.put(req, copy)) .catch(() => {}); return res; }) .catch(() => caches.match(req).then((hit) => hit || caches.match("/"))), ); } });