importScripts('https://storage.googleapis.com/workbox-cdn/releases/6.1.1/workbox-sw.js');

workbox.precaching.precacheAndRoute([]);

addEventListener('message', (event) => {
  if (event.data && event.data.type === 'SKIP_WAITING') {
    skipWaiting();
  }
});

workbox.routing.registerRoute(
  ({
    url
  }) => [
    'https://fonts.gstatic.com',
    'https://fonts.googleapis.com',
    'https://storage.googleapis.com'
  ].includes(url.origin),
  new workbox.strategies.CacheFirst({
    cacheName: 'google-fonts-webfonts',
    plugins: [
      new workbox.cacheableResponse.CacheableResponsePlugin({
        statuses: [0, 200],
      }),
      new workbox.expiration.ExpirationPlugin({
        maxAgeSeconds: 60 * 60 * 24 * 365,
        maxEntries: 30,
      }),
    ],
  })
);

workbox.routing.registerRoute(
  ({
    url
  }) => [
    'https://cdn.jsdelivr.net',
    'https://unpkg.com',
    'https://cdn.skypack.dev',
    'https://jspm.dev',
    'https://fonts.googleapis.com',
    'https://cdn.startinblox.com'
  ].includes(url.origin) || /cdn/.test(url.origin),
  new workbox.strategies.StaleWhileRevalidate({
    cacheName: 'cdn',
  })
);

workbox.routing.registerRoute(
  ({
    request
  }) => request.destination === 'image',
  new workbox.strategies.CacheFirst({
    cacheName: 'images',
    plugins: [
      new workbox.cacheableResponse.CacheableResponsePlugin({
        statuses: [200],
      }),
      new workbox.expiration.ExpirationPlugin({
        maxEntries: 300,
        maxAgeSeconds: 60 * 60 * 24 * 30,
      }),
    ],
  }),
);

workbox.routing.registerRoute(
  ({
    request
  }) =>
  request.destination === 'style' ||
  request.destination === 'script',
  new workbox.strategies.StaleWhileRevalidate({
    cacheName: 'assets',
    plugins: [
      new workbox.cacheableResponse.CacheableResponsePlugin({
        statuses: [200],
      }),
    ],
  }),
);

workbox.routing.registerRoute(
  ({
    request
  }) => request.mode === 'navigate',
  new workbox.strategies.NetworkFirst({
    cacheName: 'pages',
    plugins: [
      new workbox.cacheableResponse.CacheableResponsePlugin({
        statuses: [200],
      }),
    ],
  }),
);

workbox.routing.registerRoute(() => true,
  new workbox.strategies.StaleWhileRevalidate({
    cacheName: 'apis',
    plugins: [
      new workbox.broadcastUpdate.BroadcastUpdatePlugin(),
      new workbox.expiration.ExpirationPlugin({
        maxAgeSeconds: 60 * 60 * 24 * 30,
      }),
    ],
  })
);