| /** |
| * Welcome to your Workbox-powered service worker! |
| * |
| * You'll need to register this file in your web app and you should |
| * disable HTTP caching for this file too. |
| * See https://goo.gl/nhQhGp |
| * |
| * The rest of the code is auto-generated. Please don't update this file |
| * directly; instead, make changes to your Workbox build configuration |
| * and re-run your build process. |
| * See https://goo.gl/2aRDsh |
| */ |
| |
| importScripts("workbox-v4.3.1/workbox-sw.js"); |
| workbox.setConfig({modulePathPrefix: "workbox-v4.3.1"}); |
| |
| workbox.core.setCacheNameDetails({prefix: "gatsby-plugin-offline"}); |
| |
| workbox.core.skipWaiting(); |
| |
| workbox.core.clientsClaim(); |
| |
| /** |
| * The workboxSW.precacheAndRoute() method efficiently caches and responds to |
| * requests for URLs in the manifest. |
| * See https://goo.gl/S9QRab |
| */ |
| self.__precacheManifest = [ |
| { |
| "url": "webpack-runtime-20f9c665c2949ed076fe.js" |
| }, |
| { |
| "url": "framework-85aff51d15c28c7fbe5f.js" |
| }, |
| { |
| "url": "f0e45107-ff2c7ac7fae000cceb4b.js" |
| }, |
| { |
| "url": "app-dc092efbd8d9d25365f0.js" |
| }, |
| { |
| "url": "offline-plugin-app-shell-fallback/index.html", |
| "revision": "306006a9b02c9b7578a28b491345c6d4" |
| }, |
| { |
| "url": "component---cache-caches-gatsby-plugin-offline-app-shell-js-5a1ee105f05b3144b807.js" |
| }, |
| { |
| "url": "page-data/offline-plugin-app-shell-fallback/page-data.json", |
| "revision": "0282e2b86db56eb397d1111699dffeba" |
| }, |
| { |
| "url": "page-data/app-data.json", |
| "revision": "060ed841939fcd1f9aa4c73215b71f58" |
| }, |
| { |
| "url": "polyfill-46800a246443c64ac6e0.js" |
| }, |
| { |
| "url": "manifest.webmanifest", |
| "revision": "cdbe61b8a9e88deda0d49fb45970be87" |
| } |
| ].concat(self.__precacheManifest || []); |
| workbox.precaching.precacheAndRoute(self.__precacheManifest, {}); |
| |
| workbox.routing.registerRoute(/(\.js$|\.css$|static\/)/, new workbox.strategies.CacheFirst(), 'GET'); |
| workbox.routing.registerRoute(/^https?:.*\/page-data\/.*\.json/, new workbox.strategies.StaleWhileRevalidate(), 'GET'); |
| workbox.routing.registerRoute(/^https?:.*\.(png|jpg|jpeg|webp|svg|gif|tiff|js|woff|woff2|json|css)$/, new workbox.strategies.StaleWhileRevalidate(), 'GET'); |
| workbox.routing.registerRoute(/^https?:\/\/fonts\.googleapis\.com\/css/, new workbox.strategies.StaleWhileRevalidate(), 'GET'); |
| |
| /* global importScripts, workbox, idbKeyval */ |
| importScripts(`idb-keyval-3.2.0-iife.min.js`) |
| |
| const { NavigationRoute } = workbox.routing |
| |
| let lastNavigationRequest = null |
| let offlineShellEnabled = true |
| |
| // prefer standard object syntax to support more browsers |
| const MessageAPI = { |
| setPathResources: (event, { path, resources }) => { |
| event.waitUntil(idbKeyval.set(`resources:${path}`, resources)) |
| }, |
| |
| clearPathResources: event => { |
| event.waitUntil(idbKeyval.clear()) |
| }, |
| |
| enableOfflineShell: () => { |
| offlineShellEnabled = true |
| }, |
| |
| disableOfflineShell: () => { |
| offlineShellEnabled = false |
| }, |
| } |
| |
| self.addEventListener(`message`, event => { |
| const { gatsbyApi: api } = event.data |
| if (api) MessageAPI[api](event, event.data) |
| }) |
| |
| function handleAPIRequest({ event }) { |
| const { pathname } = new URL(event.request.url) |
| |
| const params = pathname.match(/:(.+)/)[1] |
| const data = {} |
| |
| if (params.includes(`=`)) { |
| params.split(`&`).forEach(param => { |
| const [key, val] = param.split(`=`) |
| data[key] = val |
| }) |
| } else { |
| data.api = params |
| } |
| |
| if (MessageAPI[data.api] !== undefined) { |
| MessageAPI[data.api]() |
| } |
| |
| if (!data.redirect) { |
| return new Response() |
| } |
| |
| return new Response(null, { |
| status: 302, |
| headers: { |
| Location: lastNavigationRequest, |
| }, |
| }) |
| } |
| |
| const navigationRoute = new NavigationRoute(async ({ event }) => { |
| // handle API requests separately to normal navigation requests, so do this |
| // check first |
| if (event.request.url.match(/\/.gatsby-plugin-offline:.+/)) { |
| return handleAPIRequest({ event }) |
| } |
| |
| if (!offlineShellEnabled) { |
| return await fetch(event.request) |
| } |
| |
| lastNavigationRequest = event.request.url |
| |
| let { pathname } = new URL(event.request.url) |
| pathname = pathname.replace(new RegExp(`^`), ``) |
| |
| // Check for resources + the app bundle |
| // The latter may not exist if the SW is updating to a new version |
| const resources = await idbKeyval.get(`resources:${pathname}`) |
| if (!resources || !(await caches.match(`/app-dc092efbd8d9d25365f0.js`))) { |
| return await fetch(event.request) |
| } |
| |
| for (const resource of resources) { |
| // As soon as we detect a failed resource, fetch the entire page from |
| // network - that way we won't risk being in an inconsistent state with |
| // some parts of the page failing. |
| if (!(await caches.match(resource))) { |
| return await fetch(event.request) |
| } |
| } |
| |
| const offlineShell = `/offline-plugin-app-shell-fallback/index.html` |
| const offlineShellWithKey = workbox.precaching.getCacheKeyForURL(offlineShell) |
| return await caches.match(offlineShellWithKey) |
| }) |
| |
| workbox.routing.registerRoute(navigationRoute) |
| |
| // this route is used when performing a non-navigation request (e.g. fetch) |
| workbox.routing.registerRoute(/\/.gatsby-plugin-offline:.+/, handleAPIRequest) |