diff --git a/README.md b/README.md index bfc337bf9..84b9b551d 100644 --- a/README.md +++ b/README.md @@ -390,4 +390,12 @@ For this reason, many sessions begin by taking a snapshot of the current draft. > Because the draft is a JavaScript Proxy, you must deep clone any parts of the draft that you want to include in a snapshot. (Direct references will fail as the underlying Proxy will have expired.) While the memory size of a snapshot is not usually a concern, this deep-cloning process is thread-blocking, so try to snapshot only the parts of the `data` draft that you need. ### PWA Support -Tldraw can be installed as PWA via browsers on mobile and desktop. \ No newline at end of file +Tldraw can be installed as PWA via browsers on mobile and desktop. + +**How to install/uninstall PWAs** + - Chrome + - Desktop ([Install]](https://support.google.com/chrome/answer/9658361?hl=en&co=GENIE.Platform%3DDesktop) / [Uninstall](chrome://apps/) ) + - TODO: Add link to mobile instructions + - Safari + - TODO: Adds link to mobile instructions + - TODO: Document major browsers like Firefox/Edge. \ No newline at end of file diff --git a/next.config.js b/next.config.js index 49de7e833..a72b6eeae 100644 --- a/next.config.js +++ b/next.config.js @@ -20,7 +20,6 @@ const isProduction = NODE_ENV === 'production' module.exports = withPWA({ pwa: { - disable: !isProduction, dest: 'public', }, }) diff --git a/public/desktop-chrome-maskable-144x144.png b/public/desktop-chrome-maskable-144x144.png new file mode 100644 index 000000000..6ea9d29f3 Binary files /dev/null and b/public/desktop-chrome-maskable-144x144.png differ diff --git a/public/manifest.json b/public/manifest.json index c8ce8a4fd..51ec22d87 100644 --- a/public/manifest.json +++ b/public/manifest.json @@ -31,5 +31,20 @@ "background_color": "#fafafa", "start_url": "/", "display": "standalone", - "orientation": "portrait" + "orientation": "portrait", + "file_handlers": [ + { + "action": "/", + "name": "Tldraw ", + "accept": { + "application/tldraw": [ ".tldr" ] + }, + "icons": [ + { + "src": "/desktop-chrome-maskable-144x144.png", + "sizes": "192x192" + } + ] + } + ] } diff --git a/public/sw.js b/public/sw.js index efe948c84..e2ee7df9a 100644 --- a/public/sw.js +++ b/public/sw.js @@ -1,528 +1,128 @@ +/** + * Copyright 2018 Google Inc. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +// If the loader is already loaded, just stop. if (!self.define) { - const e = (e) => { - 'require' !== e && (e += '.js') - let s = Promise.resolve() - return ( - i[e] || - (s = new Promise(async (s) => { - if ('document' in self) { - const i = document.createElement('script') - ;(i.src = e), document.head.appendChild(i), (i.onload = s) - } else importScripts(e), s() - })), - s.then(() => { - if (!i[e]) throw new Error(`Module ${e} didn’t register its module`) - return i[e] + const singleRequire = name => { + if (name !== 'require') { + name = name + '.js'; + } + let promise = Promise.resolve(); + if (!registry[name]) { + + promise = new Promise(async resolve => { + if ("document" in self) { + const script = document.createElement("script"); + script.src = name; + document.head.appendChild(script); + script.onload = resolve; + } else { + importScripts(name); + resolve(); + } + }); + + } + return promise.then(() => { + if (!registry[name]) { + throw new Error(`Module ${name} didn’t register its module`); + } + return registry[name]; + }); + }; + + const require = (names, resolve) => { + Promise.all(names.map(singleRequire)) + .then(modules => resolve(modules.length === 1 ? modules[0] : modules)); + }; + + const registry = { + require: Promise.resolve(require) + }; + + self.define = (moduleName, depsNames, factory) => { + if (registry[moduleName]) { + // Module is already loading or loaded. + return; + } + registry[moduleName] = Promise.resolve().then(() => { + let exports = {}; + const module = { + uri: location.origin + moduleName.slice(1) + }; + return Promise.all( + depsNames.map(depName => { + switch(depName) { + case "exports": + return exports; + case "module": + return module; + default: + return singleRequire(depName); + } }) - ) - }, - s = (s, i) => { - Promise.all(s.map(e)).then((e) => i(1 === e.length ? e[0] : e)) - }, - i = { require: Promise.resolve(s) } - self.define = (s, c, t) => { - i[s] || - (i[s] = Promise.resolve().then(() => { - let i = {} - const n = { uri: location.origin + s.slice(1) } - return Promise.all( - c.map((s) => { - switch (s) { - case 'exports': - return i - case 'module': - return n - default: - return e(s) - } - }) - ).then((e) => { - const s = t(...e) - return i.default || (i.default = s), i - }) - })) - } + ).then(deps => { + const facValue = factory(...deps); + if(!exports.default) { + exports.default = facValue; + } + return exports; + }); + }); + }; } -define('./sw.js', ['./workbox-ea903bce'], function (e) { - 'use strict' - importScripts('worker-6L8AMbRb0NKpPgic9tDJq.js'), - self.skipWaiting(), - e.clientsClaim(), - e.precacheAndRoute( - [ - { - url: '/VerveineRegular.woff', - revision: '858cc7add1765cbcfb0439e275fd167b', - }, - { - url: '/_next/static/6L8AMbRb0NKpPgic9tDJq/_buildManifest.js', - revision: '6L8AMbRb0NKpPgic9tDJq', - }, - { - url: '/_next/static/6L8AMbRb0NKpPgic9tDJq/_ssgManifest.js', - revision: '6L8AMbRb0NKpPgic9tDJq', - }, - { - url: '/_next/static/chunks/245.0b8b5b2c6276314320c8.js', - revision: '6L8AMbRb0NKpPgic9tDJq', - }, - { - url: '/_next/static/chunks/245.0b8b5b2c6276314320c8.js.map', - revision: '6L8AMbRb0NKpPgic9tDJq', - }, - { - url: '/_next/static/chunks/249-6f03b7a81bcbd0038729.js', - revision: '6L8AMbRb0NKpPgic9tDJq', - }, - { - url: '/_next/static/chunks/249-6f03b7a81bcbd0038729.js.map', - revision: '6L8AMbRb0NKpPgic9tDJq', - }, - { - url: '/_next/static/chunks/326-3c7a0e1d438e42f6840a.js', - revision: '6L8AMbRb0NKpPgic9tDJq', - }, - { - url: '/_next/static/chunks/326-3c7a0e1d438e42f6840a.js.map', - revision: '6L8AMbRb0NKpPgic9tDJq', - }, - { - url: '/_next/static/chunks/433-4af653dbe4f101dcf043.js', - revision: '6L8AMbRb0NKpPgic9tDJq', - }, - { - url: '/_next/static/chunks/433-4af653dbe4f101dcf043.js.map', - revision: '6L8AMbRb0NKpPgic9tDJq', - }, - { - url: '/_next/static/chunks/448.75c2f81459cefda29a33.js', - revision: '6L8AMbRb0NKpPgic9tDJq', - }, - { - url: '/_next/static/chunks/448.75c2f81459cefda29a33.js.map', - revision: '6L8AMbRb0NKpPgic9tDJq', - }, - { - url: '/_next/static/chunks/500.add46b3673e39a4bea2f.js', - revision: '6L8AMbRb0NKpPgic9tDJq', - }, - { - url: '/_next/static/chunks/500.add46b3673e39a4bea2f.js.map', - revision: '6L8AMbRb0NKpPgic9tDJq', - }, - { - url: '/_next/static/chunks/517-ef5a73f6d009b76efe08.js', - revision: '6L8AMbRb0NKpPgic9tDJq', - }, - { - url: '/_next/static/chunks/517-ef5a73f6d009b76efe08.js.map', - revision: '6L8AMbRb0NKpPgic9tDJq', - }, - { - url: '/_next/static/chunks/605.f3864658d8634b76f25b.js', - revision: '6L8AMbRb0NKpPgic9tDJq', - }, - { - url: '/_next/static/chunks/605.f3864658d8634b76f25b.js.map', - revision: '6L8AMbRb0NKpPgic9tDJq', - }, - { - url: '/_next/static/chunks/679.243b85dfdec37fa00017.js', - revision: '6L8AMbRb0NKpPgic9tDJq', - }, - { - url: '/_next/static/chunks/679.243b85dfdec37fa00017.js.map', - revision: '6L8AMbRb0NKpPgic9tDJq', - }, - { - url: '/_next/static/chunks/725.ba6f1f8d1ef9761d5764.js', - revision: '6L8AMbRb0NKpPgic9tDJq', - }, - { - url: '/_next/static/chunks/725.ba6f1f8d1ef9761d5764.js.map', - revision: '6L8AMbRb0NKpPgic9tDJq', - }, - { - url: '/_next/static/chunks/768.3eb2d8f1c748e19b3191.js', - revision: '6L8AMbRb0NKpPgic9tDJq', - }, - { - url: '/_next/static/chunks/768.3eb2d8f1c748e19b3191.js.map', - revision: '6L8AMbRb0NKpPgic9tDJq', - }, - { - url: '/_next/static/chunks/847.bd02d1a1772e5f87b99d.js', - revision: '6L8AMbRb0NKpPgic9tDJq', - }, - { - url: '/_next/static/chunks/847.bd02d1a1772e5f87b99d.js.map', - revision: '6L8AMbRb0NKpPgic9tDJq', - }, - { - url: '/_next/static/chunks/94.a2f19400fba005dc6c4f.js', - revision: '6L8AMbRb0NKpPgic9tDJq', - }, - { - url: '/_next/static/chunks/94.a2f19400fba005dc6c4f.js.map', - revision: '6L8AMbRb0NKpPgic9tDJq', - }, - { - url: '/_next/static/chunks/945.27ce1a50bfc1ce339fd4.js', - revision: '6L8AMbRb0NKpPgic9tDJq', - }, - { - url: '/_next/static/chunks/945.27ce1a50bfc1ce339fd4.js.map', - revision: '6L8AMbRb0NKpPgic9tDJq', - }, - { - url: '/_next/static/chunks/965.d0b65414f207ca0dc6a2.js', - revision: '6L8AMbRb0NKpPgic9tDJq', - }, - { - url: '/_next/static/chunks/965.d0b65414f207ca0dc6a2.js.map', - revision: '6L8AMbRb0NKpPgic9tDJq', - }, - { - url: '/_next/static/chunks/ee9ce975.ee18cda6cbd28d404e39.js', - revision: '6L8AMbRb0NKpPgic9tDJq', - }, - { - url: '/_next/static/chunks/ee9ce975.ee18cda6cbd28d404e39.js.map', - revision: '6L8AMbRb0NKpPgic9tDJq', - }, - { - url: '/_next/static/chunks/framework-0fd486a5f941532fdde0.js', - revision: '6L8AMbRb0NKpPgic9tDJq', - }, - { - url: '/_next/static/chunks/framework-0fd486a5f941532fdde0.js.map', - revision: '6L8AMbRb0NKpPgic9tDJq', - }, - { - url: '/_next/static/chunks/main-e948a5ffef40ef3bf54a.js', - revision: '6L8AMbRb0NKpPgic9tDJq', - }, - { - url: '/_next/static/chunks/main-e948a5ffef40ef3bf54a.js.map', - revision: '6L8AMbRb0NKpPgic9tDJq', - }, - { - url: '/_next/static/chunks/pages/_app-a1d000020e93919862ee.js', - revision: '6L8AMbRb0NKpPgic9tDJq', - }, - { - url: '/_next/static/chunks/pages/_app-a1d000020e93919862ee.js.map', - revision: '6L8AMbRb0NKpPgic9tDJq', - }, - { - url: '/_next/static/chunks/pages/_error-fa66bd2a1f1976f8f4ba.js', - revision: '6L8AMbRb0NKpPgic9tDJq', - }, - { - url: '/_next/static/chunks/pages/_error-fa66bd2a1f1976f8f4ba.js.map', - revision: '6L8AMbRb0NKpPgic9tDJq', - }, - { - url: '/_next/static/chunks/pages/create-error-dbbfb7ded30741dbea75.js', - revision: '6L8AMbRb0NKpPgic9tDJq', - }, - { - url: '/_next/static/chunks/pages/create-error-dbbfb7ded30741dbea75.js.map', - revision: '6L8AMbRb0NKpPgic9tDJq', - }, - { - url: '/_next/static/chunks/pages/index-77ea2f4dd2a17b027e3c.js', - revision: '6L8AMbRb0NKpPgic9tDJq', - }, - { - url: '/_next/static/chunks/pages/index-77ea2f4dd2a17b027e3c.js.map', - revision: '6L8AMbRb0NKpPgic9tDJq', - }, - { - url: '/_next/static/chunks/pages/shhh-c685061b2f91817cb318.js', - revision: '6L8AMbRb0NKpPgic9tDJq', - }, - { - url: '/_next/static/chunks/pages/shhh-c685061b2f91817cb318.js.map', - revision: '6L8AMbRb0NKpPgic9tDJq', - }, - { - url: '/_next/static/chunks/pages/signout-1aa15c2b9eebca4b25ca.js', - revision: '6L8AMbRb0NKpPgic9tDJq', - }, - { - url: '/_next/static/chunks/pages/signout-1aa15c2b9eebca4b25ca.js.map', - revision: '6L8AMbRb0NKpPgic9tDJq', - }, - { - url: '/_next/static/chunks/pages/sponsorware-7ed3c2cbeca2692c04bd.js', - revision: '6L8AMbRb0NKpPgic9tDJq', - }, - { - url: '/_next/static/chunks/pages/sponsorware-7ed3c2cbeca2692c04bd.js.map', - revision: '6L8AMbRb0NKpPgic9tDJq', - }, - { - url: '/_next/static/chunks/polyfills-2eea1e1f8ec955b73e03.js', - revision: '6L8AMbRb0NKpPgic9tDJq', - }, - { - url: '/_next/static/chunks/polyfills-2eea1e1f8ec955b73e03.js.map', - revision: '6L8AMbRb0NKpPgic9tDJq', - }, - { - url: '/_next/static/chunks/webpack-781ce7a400ed0d5cf690.js', - revision: '6L8AMbRb0NKpPgic9tDJq', - }, - { - url: '/_next/static/chunks/webpack-781ce7a400ed0d5cf690.js.map', - revision: '6L8AMbRb0NKpPgic9tDJq', - }, - { - url: '/_next/static/css/50297e5ab72b54dddbcb.css', - revision: '6L8AMbRb0NKpPgic9tDJq', - }, - { - url: '/_next/static/css/50297e5ab72b54dddbcb.css.map', - revision: '6L8AMbRb0NKpPgic9tDJq', - }, - { - url: '/android-chrome-192x192.png', - revision: '57c9c4cd91d24d48b7ffdda0768fd225', - }, - { - url: '/android-chrome-512x512.png', - revision: '8d2454e6cf551f8ca1e1d5670b13a8d1', - }, - { - url: '/android-chrome-maskable-192x192.png', - revision: '71c93ce0b34d2fbb4c6654a9131a3d9d', - }, - { - url: '/android-chrome-maskable-512x512.png', - revision: '4265b8c09997b16ac1493500b43f3755', - }, - { - url: '/apple-touch-icon.png', - revision: '8081d08be3673ec33dbeecab06706b2b', - }, - { - url: '/favicon-16x16.png', - revision: 'ac17d75b1ee007781212853a57b88285', - }, - { - url: '/favicon-32x32.png', - revision: '360bc7cd4706c0657917f3b78fed6b71', - }, - { url: '/favicon.ico', revision: 'b2bf6bb7b4d0234f3e6df44fd7d5707e' }, - { url: '/flat.png', revision: 'e0460141713b5c94104ce19b36c4b462' }, - { - url: '/icons/grab.svg', - revision: 'a1ca9e5c31d1edd2558ab075f72fde4e', - }, - { - url: '/icons/pointer.svg', - revision: 'dff260f896fe23adb83341639fdf93be', - }, - { - url: '/icons/resize.svg', - revision: '0a3cb701d15731e25919783801d18f95', - }, - { - url: '/images/hello.mp4', - revision: 'b716f249cc6c781c91b0ac9dc23423b3', - }, - { url: '/manifest.json', revision: '3e9972cc640a3e24648a6620cfc03650' }, - ], - { ignoreURLParametersMatching: [] } - ), - e.cleanupOutdatedCaches(), - e.registerRoute( - '/', - new e.NetworkFirst({ - cacheName: 'start-url', - plugins: [ - { - cacheWillUpdate: async ({ - request: e, - response: s, - event: i, - state: c, - }) => - s && 'opaqueredirect' === s.type - ? new Response(s.body, { - status: 200, - statusText: 'OK', - headers: s.headers, - }) - : s, - }, - ], - }), - 'GET' - ), - e.registerRoute( - /^https:\/\/fonts\.(?:googleapis|gstatic)\.com\/.*/i, - new e.CacheFirst({ - cacheName: 'google-fonts', - plugins: [ - new e.ExpirationPlugin({ - maxEntries: 4, - maxAgeSeconds: 31536e3, - purgeOnQuotaError: !0, - }), - ], - }), - 'GET' - ), - e.registerRoute( - /\.(?:eot|otf|ttc|ttf|woff|woff2|font.css)$/i, - new e.StaleWhileRevalidate({ - cacheName: 'static-font-assets', - plugins: [ - new e.ExpirationPlugin({ - maxEntries: 4, - maxAgeSeconds: 604800, - purgeOnQuotaError: !0, - }), - ], - }), - 'GET' - ), - e.registerRoute( - /\.(?:jpg|jpeg|gif|png|svg|ico|webp)$/i, - new e.StaleWhileRevalidate({ - cacheName: 'static-image-assets', - plugins: [ - new e.ExpirationPlugin({ - maxEntries: 64, - maxAgeSeconds: 86400, - purgeOnQuotaError: !0, - }), - ], - }), - 'GET' - ), - e.registerRoute( - /\/_next\/image\?url=.+$/i, - new e.StaleWhileRevalidate({ - cacheName: 'next-image', - plugins: [ - new e.ExpirationPlugin({ - maxEntries: 64, - maxAgeSeconds: 86400, - purgeOnQuotaError: !0, - }), - ], - }), - 'GET' - ), - e.registerRoute( - /\.(?:mp3|mp4)$/i, - new e.StaleWhileRevalidate({ - cacheName: 'static-media-assets', - plugins: [ - new e.ExpirationPlugin({ - maxEntries: 32, - maxAgeSeconds: 86400, - purgeOnQuotaError: !0, - }), - ], - }), - 'GET' - ), - e.registerRoute( - /\.(?:js)$/i, - new e.StaleWhileRevalidate({ - cacheName: 'static-js-assets', - plugins: [ - new e.ExpirationPlugin({ - maxEntries: 32, - maxAgeSeconds: 86400, - purgeOnQuotaError: !0, - }), - ], - }), - 'GET' - ), - e.registerRoute( - /\.(?:css|less)$/i, - new e.StaleWhileRevalidate({ - cacheName: 'static-style-assets', - plugins: [ - new e.ExpirationPlugin({ - maxEntries: 32, - maxAgeSeconds: 86400, - purgeOnQuotaError: !0, - }), - ], - }), - 'GET' - ), - e.registerRoute( - /\/_next\/data\/.+\/.+\.json$/i, - new e.StaleWhileRevalidate({ - cacheName: 'next-data', - plugins: [ - new e.ExpirationPlugin({ - maxEntries: 32, - maxAgeSeconds: 86400, - purgeOnQuotaError: !0, - }), - ], - }), - 'GET' - ), - e.registerRoute( - /\.(?:json|xml|csv)$/i, - new e.NetworkFirst({ - cacheName: 'static-data-assets', - plugins: [ - new e.ExpirationPlugin({ - maxEntries: 32, - maxAgeSeconds: 86400, - purgeOnQuotaError: !0, - }), - ], - }), - 'GET' - ), - e.registerRoute( - ({ url: e }) => { - if (!(self.origin === e.origin)) return !1 - const s = e.pathname - return !s.startsWith('/api/auth/') && !!s.startsWith('/api/') - }, - new e.NetworkFirst({ - cacheName: 'apis', - networkTimeoutSeconds: 10, - plugins: [ - new e.ExpirationPlugin({ - maxEntries: 16, - maxAgeSeconds: 86400, - purgeOnQuotaError: !0, - }), - ], - }), - 'GET' - ), - e.registerRoute( - ({ url: e }) => { - if (!(self.origin === e.origin)) return !1 - return !e.pathname.startsWith('/api/') - }, - new e.NetworkFirst({ - cacheName: 'others', - networkTimeoutSeconds: 10, - plugins: [ - new e.ExpirationPlugin({ - maxEntries: 32, - maxAgeSeconds: 86400, - purgeOnQuotaError: !0, - }), - ], - }), - 'GET' - ) -}) +define("./sw.js",['./workbox-6b19f60b'], function (workbox) { 'use strict'; + + /** + * Welcome to your Workbox-powered service worker! + * + * You'll need to register this file in your web app. + * 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("worker-development.js"); + self.skipWaiting(); + workbox.clientsClaim(); + workbox.registerRoute("/", new workbox.NetworkFirst({ + "cacheName": "start-url", + plugins: [{ + cacheWillUpdate: async ({ + request, + response, + event, + state + }) => { + if (response && response.type === 'opaqueredirect') { + return new Response(response.body, { + status: 200, + statusText: 'OK', + headers: response.headers + }); + } + + return response; + } + }] + }), 'GET'); + workbox.registerRoute(/.*/i, new workbox.NetworkOnly({ + "cacheName": "dev", + plugins: [] + }), 'GET'); + +}); //# sourceMappingURL=sw.js.map diff --git a/public/sw.js.map b/public/sw.js.map index 5b449fd5e..b35d5def0 100644 --- a/public/sw.js.map +++ b/public/sw.js.map @@ -1 +1 @@ -{"version":3,"file":"sw.js","sources":["../../../../../private/var/folders/3w/cj9n4h8j7xl3b82k45v7xw2r0000gn/T/e2857e5ee10e9a773146972d39d21915/sw.js"],"sourcesContent":["import {registerRoute as workbox_routing_registerRoute} from '/Users/stephenruiz/Developer/GitHub/code-slate/node_modules/workbox-routing/registerRoute.mjs';\nimport {NetworkFirst as workbox_strategies_NetworkFirst} from '/Users/stephenruiz/Developer/GitHub/code-slate/node_modules/workbox-strategies/NetworkFirst.mjs';\nimport {ExpirationPlugin as workbox_expiration_ExpirationPlugin} from '/Users/stephenruiz/Developer/GitHub/code-slate/node_modules/workbox-expiration/ExpirationPlugin.mjs';\nimport {CacheFirst as workbox_strategies_CacheFirst} from '/Users/stephenruiz/Developer/GitHub/code-slate/node_modules/workbox-strategies/CacheFirst.mjs';\nimport {StaleWhileRevalidate as workbox_strategies_StaleWhileRevalidate} from '/Users/stephenruiz/Developer/GitHub/code-slate/node_modules/workbox-strategies/StaleWhileRevalidate.mjs';\nimport {clientsClaim as workbox_core_clientsClaim} from '/Users/stephenruiz/Developer/GitHub/code-slate/node_modules/workbox-core/clientsClaim.mjs';\nimport {precacheAndRoute as workbox_precaching_precacheAndRoute} from '/Users/stephenruiz/Developer/GitHub/code-slate/node_modules/workbox-precaching/precacheAndRoute.mjs';\nimport {cleanupOutdatedCaches as workbox_precaching_cleanupOutdatedCaches} from '/Users/stephenruiz/Developer/GitHub/code-slate/node_modules/workbox-precaching/cleanupOutdatedCaches.mjs';/**\n * Welcome to your Workbox-powered service worker!\n *\n * You'll need to register this file in your web app.\n * See https://goo.gl/nhQhGp\n *\n * The rest of the code is auto-generated. Please don't update this file\n * directly; instead, make changes to your Workbox build configuration\n * and re-run your build process.\n * See https://goo.gl/2aRDsh\n */\n\n\nimportScripts(\n \"worker-6L8AMbRb0NKpPgic9tDJq.js\"\n);\n\n\n\n\n\n\n\nself.skipWaiting();\n\nworkbox_core_clientsClaim();\n\n\n/**\n * The precacheAndRoute() method efficiently caches and responds to\n * requests for URLs in the manifest.\n * See https://goo.gl/S9QRab\n */\nworkbox_precaching_precacheAndRoute([\n {\n \"url\": \"/VerveineRegular.woff\",\n \"revision\": \"858cc7add1765cbcfb0439e275fd167b\"\n },\n {\n \"url\": \"/_next/static/6L8AMbRb0NKpPgic9tDJq/_buildManifest.js\",\n \"revision\": \"6L8AMbRb0NKpPgic9tDJq\"\n },\n {\n \"url\": \"/_next/static/6L8AMbRb0NKpPgic9tDJq/_ssgManifest.js\",\n \"revision\": \"6L8AMbRb0NKpPgic9tDJq\"\n },\n {\n \"url\": \"/_next/static/chunks/245.0b8b5b2c6276314320c8.js\",\n \"revision\": \"6L8AMbRb0NKpPgic9tDJq\"\n },\n {\n \"url\": \"/_next/static/chunks/245.0b8b5b2c6276314320c8.js.map\",\n \"revision\": \"6L8AMbRb0NKpPgic9tDJq\"\n },\n {\n \"url\": \"/_next/static/chunks/249-6f03b7a81bcbd0038729.js\",\n \"revision\": \"6L8AMbRb0NKpPgic9tDJq\"\n },\n {\n \"url\": \"/_next/static/chunks/249-6f03b7a81bcbd0038729.js.map\",\n \"revision\": \"6L8AMbRb0NKpPgic9tDJq\"\n },\n {\n \"url\": \"/_next/static/chunks/326-3c7a0e1d438e42f6840a.js\",\n \"revision\": \"6L8AMbRb0NKpPgic9tDJq\"\n },\n {\n \"url\": \"/_next/static/chunks/326-3c7a0e1d438e42f6840a.js.map\",\n \"revision\": \"6L8AMbRb0NKpPgic9tDJq\"\n },\n {\n \"url\": \"/_next/static/chunks/433-4af653dbe4f101dcf043.js\",\n \"revision\": \"6L8AMbRb0NKpPgic9tDJq\"\n },\n {\n \"url\": \"/_next/static/chunks/433-4af653dbe4f101dcf043.js.map\",\n \"revision\": \"6L8AMbRb0NKpPgic9tDJq\"\n },\n {\n \"url\": \"/_next/static/chunks/448.75c2f81459cefda29a33.js\",\n \"revision\": \"6L8AMbRb0NKpPgic9tDJq\"\n },\n {\n \"url\": \"/_next/static/chunks/448.75c2f81459cefda29a33.js.map\",\n \"revision\": \"6L8AMbRb0NKpPgic9tDJq\"\n },\n {\n \"url\": \"/_next/static/chunks/500.add46b3673e39a4bea2f.js\",\n \"revision\": \"6L8AMbRb0NKpPgic9tDJq\"\n },\n {\n \"url\": \"/_next/static/chunks/500.add46b3673e39a4bea2f.js.map\",\n \"revision\": \"6L8AMbRb0NKpPgic9tDJq\"\n },\n {\n \"url\": \"/_next/static/chunks/517-ef5a73f6d009b76efe08.js\",\n \"revision\": \"6L8AMbRb0NKpPgic9tDJq\"\n },\n {\n \"url\": \"/_next/static/chunks/517-ef5a73f6d009b76efe08.js.map\",\n \"revision\": \"6L8AMbRb0NKpPgic9tDJq\"\n },\n {\n \"url\": \"/_next/static/chunks/605.f3864658d8634b76f25b.js\",\n \"revision\": \"6L8AMbRb0NKpPgic9tDJq\"\n },\n {\n \"url\": \"/_next/static/chunks/605.f3864658d8634b76f25b.js.map\",\n \"revision\": \"6L8AMbRb0NKpPgic9tDJq\"\n },\n {\n \"url\": \"/_next/static/chunks/679.243b85dfdec37fa00017.js\",\n \"revision\": \"6L8AMbRb0NKpPgic9tDJq\"\n },\n {\n \"url\": \"/_next/static/chunks/679.243b85dfdec37fa00017.js.map\",\n \"revision\": \"6L8AMbRb0NKpPgic9tDJq\"\n },\n {\n \"url\": \"/_next/static/chunks/725.ba6f1f8d1ef9761d5764.js\",\n \"revision\": \"6L8AMbRb0NKpPgic9tDJq\"\n },\n {\n \"url\": \"/_next/static/chunks/725.ba6f1f8d1ef9761d5764.js.map\",\n \"revision\": \"6L8AMbRb0NKpPgic9tDJq\"\n },\n {\n \"url\": \"/_next/static/chunks/768.3eb2d8f1c748e19b3191.js\",\n \"revision\": \"6L8AMbRb0NKpPgic9tDJq\"\n },\n {\n \"url\": \"/_next/static/chunks/768.3eb2d8f1c748e19b3191.js.map\",\n \"revision\": \"6L8AMbRb0NKpPgic9tDJq\"\n },\n {\n \"url\": \"/_next/static/chunks/847.bd02d1a1772e5f87b99d.js\",\n \"revision\": \"6L8AMbRb0NKpPgic9tDJq\"\n },\n {\n \"url\": \"/_next/static/chunks/847.bd02d1a1772e5f87b99d.js.map\",\n \"revision\": \"6L8AMbRb0NKpPgic9tDJq\"\n },\n {\n \"url\": \"/_next/static/chunks/94.a2f19400fba005dc6c4f.js\",\n \"revision\": \"6L8AMbRb0NKpPgic9tDJq\"\n },\n {\n \"url\": \"/_next/static/chunks/94.a2f19400fba005dc6c4f.js.map\",\n \"revision\": \"6L8AMbRb0NKpPgic9tDJq\"\n },\n {\n \"url\": \"/_next/static/chunks/945.27ce1a50bfc1ce339fd4.js\",\n \"revision\": \"6L8AMbRb0NKpPgic9tDJq\"\n },\n {\n \"url\": \"/_next/static/chunks/945.27ce1a50bfc1ce339fd4.js.map\",\n \"revision\": \"6L8AMbRb0NKpPgic9tDJq\"\n },\n {\n \"url\": \"/_next/static/chunks/965.d0b65414f207ca0dc6a2.js\",\n \"revision\": \"6L8AMbRb0NKpPgic9tDJq\"\n },\n {\n \"url\": \"/_next/static/chunks/965.d0b65414f207ca0dc6a2.js.map\",\n \"revision\": \"6L8AMbRb0NKpPgic9tDJq\"\n },\n {\n \"url\": \"/_next/static/chunks/ee9ce975.ee18cda6cbd28d404e39.js\",\n \"revision\": \"6L8AMbRb0NKpPgic9tDJq\"\n },\n {\n \"url\": \"/_next/static/chunks/ee9ce975.ee18cda6cbd28d404e39.js.map\",\n \"revision\": \"6L8AMbRb0NKpPgic9tDJq\"\n },\n {\n \"url\": \"/_next/static/chunks/framework-0fd486a5f941532fdde0.js\",\n \"revision\": \"6L8AMbRb0NKpPgic9tDJq\"\n },\n {\n \"url\": \"/_next/static/chunks/framework-0fd486a5f941532fdde0.js.map\",\n \"revision\": \"6L8AMbRb0NKpPgic9tDJq\"\n },\n {\n \"url\": \"/_next/static/chunks/main-e948a5ffef40ef3bf54a.js\",\n \"revision\": \"6L8AMbRb0NKpPgic9tDJq\"\n },\n {\n \"url\": \"/_next/static/chunks/main-e948a5ffef40ef3bf54a.js.map\",\n \"revision\": \"6L8AMbRb0NKpPgic9tDJq\"\n },\n {\n \"url\": \"/_next/static/chunks/pages/_app-a1d000020e93919862ee.js\",\n \"revision\": \"6L8AMbRb0NKpPgic9tDJq\"\n },\n {\n \"url\": \"/_next/static/chunks/pages/_app-a1d000020e93919862ee.js.map\",\n \"revision\": \"6L8AMbRb0NKpPgic9tDJq\"\n },\n {\n \"url\": \"/_next/static/chunks/pages/_error-fa66bd2a1f1976f8f4ba.js\",\n \"revision\": \"6L8AMbRb0NKpPgic9tDJq\"\n },\n {\n \"url\": \"/_next/static/chunks/pages/_error-fa66bd2a1f1976f8f4ba.js.map\",\n \"revision\": \"6L8AMbRb0NKpPgic9tDJq\"\n },\n {\n \"url\": \"/_next/static/chunks/pages/create-error-dbbfb7ded30741dbea75.js\",\n \"revision\": \"6L8AMbRb0NKpPgic9tDJq\"\n },\n {\n \"url\": \"/_next/static/chunks/pages/create-error-dbbfb7ded30741dbea75.js.map\",\n \"revision\": \"6L8AMbRb0NKpPgic9tDJq\"\n },\n {\n \"url\": \"/_next/static/chunks/pages/index-77ea2f4dd2a17b027e3c.js\",\n \"revision\": \"6L8AMbRb0NKpPgic9tDJq\"\n },\n {\n \"url\": \"/_next/static/chunks/pages/index-77ea2f4dd2a17b027e3c.js.map\",\n \"revision\": \"6L8AMbRb0NKpPgic9tDJq\"\n },\n {\n \"url\": \"/_next/static/chunks/pages/shhh-c685061b2f91817cb318.js\",\n \"revision\": \"6L8AMbRb0NKpPgic9tDJq\"\n },\n {\n \"url\": \"/_next/static/chunks/pages/shhh-c685061b2f91817cb318.js.map\",\n \"revision\": \"6L8AMbRb0NKpPgic9tDJq\"\n },\n {\n \"url\": \"/_next/static/chunks/pages/signout-1aa15c2b9eebca4b25ca.js\",\n \"revision\": \"6L8AMbRb0NKpPgic9tDJq\"\n },\n {\n \"url\": \"/_next/static/chunks/pages/signout-1aa15c2b9eebca4b25ca.js.map\",\n \"revision\": \"6L8AMbRb0NKpPgic9tDJq\"\n },\n {\n \"url\": \"/_next/static/chunks/pages/sponsorware-7ed3c2cbeca2692c04bd.js\",\n \"revision\": \"6L8AMbRb0NKpPgic9tDJq\"\n },\n {\n \"url\": \"/_next/static/chunks/pages/sponsorware-7ed3c2cbeca2692c04bd.js.map\",\n \"revision\": \"6L8AMbRb0NKpPgic9tDJq\"\n },\n {\n \"url\": \"/_next/static/chunks/polyfills-2eea1e1f8ec955b73e03.js\",\n \"revision\": \"6L8AMbRb0NKpPgic9tDJq\"\n },\n {\n \"url\": \"/_next/static/chunks/polyfills-2eea1e1f8ec955b73e03.js.map\",\n \"revision\": \"6L8AMbRb0NKpPgic9tDJq\"\n },\n {\n \"url\": \"/_next/static/chunks/webpack-781ce7a400ed0d5cf690.js\",\n \"revision\": \"6L8AMbRb0NKpPgic9tDJq\"\n },\n {\n \"url\": \"/_next/static/chunks/webpack-781ce7a400ed0d5cf690.js.map\",\n \"revision\": \"6L8AMbRb0NKpPgic9tDJq\"\n },\n {\n \"url\": \"/_next/static/css/50297e5ab72b54dddbcb.css\",\n \"revision\": \"6L8AMbRb0NKpPgic9tDJq\"\n },\n {\n \"url\": \"/_next/static/css/50297e5ab72b54dddbcb.css.map\",\n \"revision\": \"6L8AMbRb0NKpPgic9tDJq\"\n },\n {\n \"url\": \"/android-chrome-192x192.png\",\n \"revision\": \"57c9c4cd91d24d48b7ffdda0768fd225\"\n },\n {\n \"url\": \"/android-chrome-512x512.png\",\n \"revision\": \"8d2454e6cf551f8ca1e1d5670b13a8d1\"\n },\n {\n \"url\": \"/android-chrome-maskable-192x192.png\",\n \"revision\": \"71c93ce0b34d2fbb4c6654a9131a3d9d\"\n },\n {\n \"url\": \"/android-chrome-maskable-512x512.png\",\n \"revision\": \"4265b8c09997b16ac1493500b43f3755\"\n },\n {\n \"url\": \"/apple-touch-icon.png\",\n \"revision\": \"8081d08be3673ec33dbeecab06706b2b\"\n },\n {\n \"url\": \"/favicon-16x16.png\",\n \"revision\": \"ac17d75b1ee007781212853a57b88285\"\n },\n {\n \"url\": \"/favicon-32x32.png\",\n \"revision\": \"360bc7cd4706c0657917f3b78fed6b71\"\n },\n {\n \"url\": \"/favicon.ico\",\n \"revision\": \"b2bf6bb7b4d0234f3e6df44fd7d5707e\"\n },\n {\n \"url\": \"/flat.png\",\n \"revision\": \"e0460141713b5c94104ce19b36c4b462\"\n },\n {\n \"url\": \"/icons/grab.svg\",\n \"revision\": \"a1ca9e5c31d1edd2558ab075f72fde4e\"\n },\n {\n \"url\": \"/icons/pointer.svg\",\n \"revision\": \"dff260f896fe23adb83341639fdf93be\"\n },\n {\n \"url\": \"/icons/resize.svg\",\n \"revision\": \"0a3cb701d15731e25919783801d18f95\"\n },\n {\n \"url\": \"/images/hello.mp4\",\n \"revision\": \"b716f249cc6c781c91b0ac9dc23423b3\"\n },\n {\n \"url\": \"/manifest.json\",\n \"revision\": \"3e9972cc640a3e24648a6620cfc03650\"\n }\n], {\n \"ignoreURLParametersMatching\": []\n});\nworkbox_precaching_cleanupOutdatedCaches();\n\n\n\nworkbox_routing_registerRoute(\"/\", new workbox_strategies_NetworkFirst({ \"cacheName\":\"start-url\", plugins: [{ cacheWillUpdate: async ({request, response, event, state}) => { if (response && response.type === 'opaqueredirect') { return new Response(response.body, {status: 200, statusText: 'OK', headers: response.headers}); } return response; } }] }), 'GET');\nworkbox_routing_registerRoute(/^https:\\/\\/fonts\\.(?:googleapis|gstatic)\\.com\\/.*/i, new workbox_strategies_CacheFirst({ \"cacheName\":\"google-fonts\", plugins: [new workbox_expiration_ExpirationPlugin({ maxEntries: 4, maxAgeSeconds: 31536000, purgeOnQuotaError: true })] }), 'GET');\nworkbox_routing_registerRoute(/\\.(?:eot|otf|ttc|ttf|woff|woff2|font.css)$/i, new workbox_strategies_StaleWhileRevalidate({ \"cacheName\":\"static-font-assets\", plugins: [new workbox_expiration_ExpirationPlugin({ maxEntries: 4, maxAgeSeconds: 604800, purgeOnQuotaError: true })] }), 'GET');\nworkbox_routing_registerRoute(/\\.(?:jpg|jpeg|gif|png|svg|ico|webp)$/i, new workbox_strategies_StaleWhileRevalidate({ \"cacheName\":\"static-image-assets\", plugins: [new workbox_expiration_ExpirationPlugin({ maxEntries: 64, maxAgeSeconds: 86400, purgeOnQuotaError: true })] }), 'GET');\nworkbox_routing_registerRoute(/\\/_next\\/image\\?url=.+$/i, new workbox_strategies_StaleWhileRevalidate({ \"cacheName\":\"next-image\", plugins: [new workbox_expiration_ExpirationPlugin({ maxEntries: 64, maxAgeSeconds: 86400, purgeOnQuotaError: true })] }), 'GET');\nworkbox_routing_registerRoute(/\\.(?:mp3|mp4)$/i, new workbox_strategies_StaleWhileRevalidate({ \"cacheName\":\"static-media-assets\", plugins: [new workbox_expiration_ExpirationPlugin({ maxEntries: 32, maxAgeSeconds: 86400, purgeOnQuotaError: true })] }), 'GET');\nworkbox_routing_registerRoute(/\\.(?:js)$/i, new workbox_strategies_StaleWhileRevalidate({ \"cacheName\":\"static-js-assets\", plugins: [new workbox_expiration_ExpirationPlugin({ maxEntries: 32, maxAgeSeconds: 86400, purgeOnQuotaError: true })] }), 'GET');\nworkbox_routing_registerRoute(/\\.(?:css|less)$/i, new workbox_strategies_StaleWhileRevalidate({ \"cacheName\":\"static-style-assets\", plugins: [new workbox_expiration_ExpirationPlugin({ maxEntries: 32, maxAgeSeconds: 86400, purgeOnQuotaError: true })] }), 'GET');\nworkbox_routing_registerRoute(/\\/_next\\/data\\/.+\\/.+\\.json$/i, new workbox_strategies_StaleWhileRevalidate({ \"cacheName\":\"next-data\", plugins: [new workbox_expiration_ExpirationPlugin({ maxEntries: 32, maxAgeSeconds: 86400, purgeOnQuotaError: true })] }), 'GET');\nworkbox_routing_registerRoute(/\\.(?:json|xml|csv)$/i, new workbox_strategies_NetworkFirst({ \"cacheName\":\"static-data-assets\", plugins: [new workbox_expiration_ExpirationPlugin({ maxEntries: 32, maxAgeSeconds: 86400, purgeOnQuotaError: true })] }), 'GET');\nworkbox_routing_registerRoute(({url}) => {\n const isSameOrigin = self.origin === url.origin\n if (!isSameOrigin) return false\n const pathname = url.pathname\n // Exclude /api/auth/callback/* to fix OAuth workflow in Safari without impact other environment\n // Above route is default for next-auth, you may need to change it if your OAuth workflow has a different callback route\n // Issue: https://github.com/shadowwalker/next-pwa/issues/131#issuecomment-821894809\n if (pathname.startsWith('/api/auth/')) return false\n if (pathname.startsWith('/api/')) return true\n return false\n }, new workbox_strategies_NetworkFirst({ \"cacheName\":\"apis\",\"networkTimeoutSeconds\":10, plugins: [new workbox_expiration_ExpirationPlugin({ maxEntries: 16, maxAgeSeconds: 86400, purgeOnQuotaError: true })] }), 'GET');\nworkbox_routing_registerRoute(({url}) => {\n const isSameOrigin = self.origin === url.origin\n if (!isSameOrigin) return false\n const pathname = url.pathname\n if (pathname.startsWith('/api/')) return false\n return true\n }, new workbox_strategies_NetworkFirst({ \"cacheName\":\"others\",\"networkTimeoutSeconds\":10, plugins: [new workbox_expiration_ExpirationPlugin({ maxEntries: 32, maxAgeSeconds: 86400, purgeOnQuotaError: true })] }), 'GET');\n\n\n\n\n"],"names":["importScripts","self","skipWaiting","workbox_strategies_NetworkFirst","plugins","cacheWillUpdate","async","request","response","event","state","type","Response","body","status","statusText","headers","workbox_strategies_CacheFirst","workbox_expiration_ExpirationPlugin","maxEntries","maxAgeSeconds","purgeOnQuotaError","workbox_strategies_StaleWhileRevalidate","url","origin","pathname","startsWith"],"mappings":"0yBAoBAA,cACE,mCASFC,KAAKC,kDAU+B,CAClC,KACS,iCACK,oCAEd,KACS,iEACK,yBAEd,KACS,+DACK,yBAEd,KACS,4DACK,yBAEd,KACS,gEACK,yBAEd,KACS,4DACK,yBAEd,KACS,gEACK,yBAEd,KACS,4DACK,yBAEd,KACS,gEACK,yBAEd,KACS,4DACK,yBAEd,KACS,gEACK,yBAEd,KACS,4DACK,yBAEd,KACS,gEACK,yBAEd,KACS,4DACK,yBAEd,KACS,gEACK,yBAEd,KACS,4DACK,yBAEd,KACS,gEACK,yBAEd,KACS,4DACK,yBAEd,KACS,gEACK,yBAEd,KACS,4DACK,yBAEd,KACS,gEACK,yBAEd,KACS,4DACK,yBAEd,KACS,gEACK,yBAEd,KACS,4DACK,yBAEd,KACS,gEACK,yBAEd,KACS,4DACK,yBAEd,KACS,gEACK,yBAEd,KACS,2DACK,yBAEd,KACS,+DACK,yBAEd,KACS,4DACK,yBAEd,KACS,gEACK,yBAEd,KACS,4DACK,yBAEd,KACS,gEACK,yBAEd,KACS,iEACK,yBAEd,KACS,qEACK,yBAEd,KACS,kEACK,yBAEd,KACS,sEACK,yBAEd,KACS,6DACK,yBAEd,KACS,iEACK,yBAEd,KACS,mEACK,yBAEd,KACS,uEACK,yBAEd,KACS,qEACK,yBAEd,KACS,yEACK,yBAEd,KACS,2EACK,yBAEd,KACS,+EACK,yBAEd,KACS,oEACK,yBAEd,KACS,wEACK,yBAEd,KACS,mEACK,yBAEd,KACS,uEACK,yBAEd,KACS,sEACK,yBAEd,KACS,0EACK,yBAEd,KACS,0EACK,yBAEd,KACS,8EACK,yBAEd,KACS,kEACK,yBAEd,KACS,sEACK,yBAEd,KACS,gEACK,yBAEd,KACS,oEACK,yBAEd,KACS,sDACK,yBAEd,KACS,0DACK,yBAEd,KACS,uCACK,oCAEd,KACS,uCACK,oCAEd,KACS,gDACK,oCAEd,KACS,gDACK,oCAEd,KACS,iCACK,oCAEd,KACS,8BACK,oCAEd,KACS,8BACK,oCAEd,KACS,wBACK,oCAEd,KACS,qBACK,oCAEd,KACS,2BACK,oCAEd,KACS,8BACK,oCAEd,KACS,6BACK,oCAEd,KACS,6BACK,oCAEd,KACS,0BACK,qCAEb,6BAC8B,+CAMH,IAAK,IAAIC,eAAgC,WAAc,YAAaC,QAAS,CAAC,CAAEC,gBAAiBC,OAAQC,QAAAA,EAASC,SAAAA,EAAUC,MAAAA,EAAOC,MAAAA,KAAiBF,GAA8B,mBAAlBA,EAASG,KAAoC,IAAIC,SAASJ,EAASK,KAAM,CAACC,OAAQ,IAAKC,WAAY,KAAMC,QAASR,EAASQ,UAAoBR,MAAmB,uBAClU,qDAAsD,IAAIS,aAA8B,WAAc,eAAgBb,QAAS,CAAC,IAAIc,mBAAoC,CAAEC,WAAY,EAAGC,cAAe,QAAUC,mBAAmB,OAAa,uBAClP,8CAA+C,IAAIC,uBAAwC,WAAc,qBAAsBlB,QAAS,CAAC,IAAIc,mBAAoC,CAAEC,WAAY,EAAGC,cAAe,OAAQC,mBAAmB,OAAa,uBACzP,wCAAyC,IAAIC,uBAAwC,WAAc,sBAAuBlB,QAAS,CAAC,IAAIc,mBAAoC,CAAEC,WAAY,GAAIC,cAAe,MAAOC,mBAAmB,OAAa,uBACpP,2BAA4B,IAAIC,uBAAwC,WAAc,aAAclB,QAAS,CAAC,IAAIc,mBAAoC,CAAEC,WAAY,GAAIC,cAAe,MAAOC,mBAAmB,OAAa,uBAC9N,kBAAmB,IAAIC,uBAAwC,WAAc,sBAAuBlB,QAAS,CAAC,IAAIc,mBAAoC,CAAEC,WAAY,GAAIC,cAAe,MAAOC,mBAAmB,OAAa,uBAC9N,aAAc,IAAIC,uBAAwC,WAAc,mBAAoBlB,QAAS,CAAC,IAAIc,mBAAoC,CAAEC,WAAY,GAAIC,cAAe,MAAOC,mBAAmB,OAAa,uBACtN,mBAAoB,IAAIC,uBAAwC,WAAc,sBAAuBlB,QAAS,CAAC,IAAIc,mBAAoC,CAAEC,WAAY,GAAIC,cAAe,MAAOC,mBAAmB,OAAa,uBAC/N,gCAAiC,IAAIC,uBAAwC,WAAc,YAAalB,QAAS,CAAC,IAAIc,mBAAoC,CAAEC,WAAY,GAAIC,cAAe,MAAOC,mBAAmB,OAAa,uBAClO,uBAAwB,IAAIlB,eAAgC,WAAc,qBAAsBC,QAAS,CAAC,IAAIc,mBAAoC,CAAEC,WAAY,GAAIC,cAAe,MAAOC,mBAAmB,OAAa,wBAC1N,EAAEE,IAAAA,WACLtB,KAAKuB,SAAWD,EAAIC,QACtB,OAAO,QACpBC,EAAWF,EAAIE,gBAIjBA,EAASC,WAAW,iBACpBD,EAASC,WAAW,WAEvB,IAAIvB,eAAgC,WAAc,6BAA+B,GAAIC,QAAS,CAAC,IAAIc,mBAAoC,CAAEC,WAAY,GAAIC,cAAe,MAAOC,mBAAmB,OAAa,wBACxL,EAAEE,IAAAA,WACLtB,KAAKuB,SAAWD,EAAIC,QACtB,OAAO,SACTD,EAAIE,SACRC,WAAW,WAEvB,IAAIvB,eAAgC,WAAc,+BAAiC,GAAIC,QAAS,CAAC,IAAIc,mBAAoC,CAAEC,WAAY,GAAIC,cAAe,MAAOC,mBAAmB,OAAa"} \ No newline at end of file +{"version":3,"file":"sw.js","sources":["../../../../private/var/folders/c2/7_m5xc4s7wb79vwldydsqh6h0000gn/T/af57713bb9ea91ca9f6ea602412fbc8a/sw.js"],"sourcesContent":["import {registerRoute as workbox_routing_registerRoute} from '/Users/francoislaberge/dev/tldraw/node_modules/workbox-routing/registerRoute.mjs';\nimport {NetworkFirst as workbox_strategies_NetworkFirst} from '/Users/francoislaberge/dev/tldraw/node_modules/workbox-strategies/NetworkFirst.mjs';\nimport {NetworkOnly as workbox_strategies_NetworkOnly} from '/Users/francoislaberge/dev/tldraw/node_modules/workbox-strategies/NetworkOnly.mjs';\nimport {clientsClaim as workbox_core_clientsClaim} from '/Users/francoislaberge/dev/tldraw/node_modules/workbox-core/clientsClaim.mjs';/**\n * Welcome to your Workbox-powered service worker!\n *\n * You'll need to register this file in your web app.\n * See https://goo.gl/nhQhGp\n *\n * The rest of the code is auto-generated. Please don't update this file\n * directly; instead, make changes to your Workbox build configuration\n * and re-run your build process.\n * See https://goo.gl/2aRDsh\n */\n\n\nimportScripts(\n \"worker-development.js\"\n);\n\n\n\n\n\n\n\nself.skipWaiting();\n\nworkbox_core_clientsClaim();\n\n\n\nworkbox_routing_registerRoute(\"/\", new workbox_strategies_NetworkFirst({ \"cacheName\":\"start-url\", plugins: [{ cacheWillUpdate: async ({request, response, event, state}) => { if (response && response.type === 'opaqueredirect') { return new Response(response.body, {status: 200, statusText: 'OK', headers: response.headers}); } return response; } }] }), 'GET');\nworkbox_routing_registerRoute(/.*/i, new workbox_strategies_NetworkOnly({ \"cacheName\":\"dev\", plugins: [] }), 'GET');\n\n\n\n\n"],"names":["importScripts","self","skipWaiting","workbox_core_clientsClaim","workbox_routing_registerRoute","workbox_strategies_NetworkFirst","plugins","cacheWillUpdate","request","response","event","state","type","Response","body","status","statusText","headers","workbox_strategies_NetworkOnly"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAGuI;EACvI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;EAGAA,aAAa,CACX,uBADW,CAAb;EAUAC,IAAI,CAACC,WAAL;AAEAC,sBAAyB;AAIzBC,uBAA6B,CAAC,GAAD,EAAM,IAAIC,oBAAJ,CAAoC;EAAE,eAAY,WAAd;EAA2BC,EAAAA,OAAO,EAAE,CAAC;EAAEC,IAAAA,eAAe,EAAE,OAAO;EAACC,MAAAA,OAAD;EAAUC,MAAAA,QAAV;EAAoBC,MAAAA,KAApB;EAA2BC,MAAAA;EAA3B,KAAP,KAA6C;EAAE,UAAIF,QAAQ,IAAIA,QAAQ,CAACG,IAAT,KAAkB,gBAAlC,EAAoD;EAAE,eAAO,IAAIC,QAAJ,CAAaJ,QAAQ,CAACK,IAAtB,EAA4B;EAACC,UAAAA,MAAM,EAAE,GAAT;EAAcC,UAAAA,UAAU,EAAE,IAA1B;EAAgCC,UAAAA,OAAO,EAAER,QAAQ,CAACQ;EAAlD,SAA5B,CAAP;EAAiG;;EAAC,aAAOR,QAAP;EAAkB;EAA5O,GAAD;EAApC,CAApC,CAAN,EAAmU,KAAnU,CAA7B;AACAL,uBAA6B,CAAC,KAAD,EAAQ,IAAIc,mBAAJ,CAAmC;EAAE,eAAY,KAAd;EAAqBZ,EAAAA,OAAO,EAAE;EAA9B,CAAnC,CAAR,EAAgF,KAAhF,CAA7B;;"} \ No newline at end of file diff --git a/public/workbox-6b19f60b.js b/public/workbox-6b19f60b.js new file mode 100644 index 000000000..41d35339c --- /dev/null +++ b/public/workbox-6b19f60b.js @@ -0,0 +1,2701 @@ +define("./workbox-6b19f60b.js",['exports'], function (exports) { 'use strict'; + + try { + self['workbox:core:6.1.5'] && _(); + } catch (e) {} + + /* + Copyright 2019 Google LLC + Use of this source code is governed by an MIT-style + license that can be found in the LICENSE file or at + https://opensource.org/licenses/MIT. + */ + const logger = (() => { + // Don't overwrite this value if it's already set. + // See https://github.com/GoogleChrome/workbox/pull/2284#issuecomment-560470923 + if (!('__WB_DISABLE_DEV_LOGS' in self)) { + self.__WB_DISABLE_DEV_LOGS = false; + } + + let inGroup = false; + const methodToColorMap = { + debug: `#7f8c8d`, + log: `#2ecc71`, + warn: `#f39c12`, + error: `#c0392b`, + groupCollapsed: `#3498db`, + groupEnd: null + }; + + const print = function (method, args) { + if (self.__WB_DISABLE_DEV_LOGS) { + return; + } + + if (method === 'groupCollapsed') { + // Safari doesn't print all console.groupCollapsed() arguments: + // https://bugs.webkit.org/show_bug.cgi?id=182754 + if (/^((?!chrome|android).)*safari/i.test(navigator.userAgent)) { + console[method](...args); + return; + } + } + + const styles = [`background: ${methodToColorMap[method]}`, `border-radius: 0.5em`, `color: white`, `font-weight: bold`, `padding: 2px 0.5em`]; // When in a group, the workbox prefix is not displayed. + + const logPrefix = inGroup ? [] : ['%cworkbox', styles.join(';')]; + console[method](...logPrefix, ...args); + + if (method === 'groupCollapsed') { + inGroup = true; + } + + if (method === 'groupEnd') { + inGroup = false; + } + }; + + const api = {}; + const loggerMethods = Object.keys(methodToColorMap); + + for (const key of loggerMethods) { + const method = key; + + api[method] = (...args) => { + print(method, args); + }; + } + + return api; + })(); + + /* + Copyright 2018 Google LLC + + Use of this source code is governed by an MIT-style + license that can be found in the LICENSE file or at + https://opensource.org/licenses/MIT. + */ + const messages$1 = { + 'invalid-value': ({ + paramName, + validValueDescription, + value + }) => { + if (!paramName || !validValueDescription) { + throw new Error(`Unexpected input to 'invalid-value' error.`); + } + + return `The '${paramName}' parameter was given a value with an ` + `unexpected value. ${validValueDescription} Received a value of ` + `${JSON.stringify(value)}.`; + }, + 'not-an-array': ({ + moduleName, + className, + funcName, + paramName + }) => { + if (!moduleName || !className || !funcName || !paramName) { + throw new Error(`Unexpected input to 'not-an-array' error.`); + } + + return `The parameter '${paramName}' passed into ` + `'${moduleName}.${className}.${funcName}()' must be an array.`; + }, + 'incorrect-type': ({ + expectedType, + paramName, + moduleName, + className, + funcName + }) => { + if (!expectedType || !paramName || !moduleName || !funcName) { + throw new Error(`Unexpected input to 'incorrect-type' error.`); + } + + return `The parameter '${paramName}' passed into ` + `'${moduleName}.${className ? className + '.' : ''}` + `${funcName}()' must be of type ${expectedType}.`; + }, + 'incorrect-class': ({ + expectedClass, + paramName, + moduleName, + className, + funcName, + isReturnValueProblem + }) => { + if (!expectedClass || !moduleName || !funcName) { + throw new Error(`Unexpected input to 'incorrect-class' error.`); + } + + if (isReturnValueProblem) { + return `The return value from ` + `'${moduleName}.${className ? className + '.' : ''}${funcName}()' ` + `must be an instance of class ${expectedClass.name}.`; + } + + return `The parameter '${paramName}' passed into ` + `'${moduleName}.${className ? className + '.' : ''}${funcName}()' ` + `must be an instance of class ${expectedClass.name}.`; + }, + 'missing-a-method': ({ + expectedMethod, + paramName, + moduleName, + className, + funcName + }) => { + if (!expectedMethod || !paramName || !moduleName || !className || !funcName) { + throw new Error(`Unexpected input to 'missing-a-method' error.`); + } + + return `${moduleName}.${className}.${funcName}() expected the ` + `'${paramName}' parameter to expose a '${expectedMethod}' method.`; + }, + 'add-to-cache-list-unexpected-type': ({ + entry + }) => { + return `An unexpected entry was passed to ` + `'workbox-precaching.PrecacheController.addToCacheList()' The entry ` + `'${JSON.stringify(entry)}' isn't supported. You must supply an array of ` + `strings with one or more characters, objects with a url property or ` + `Request objects.`; + }, + 'add-to-cache-list-conflicting-entries': ({ + firstEntry, + secondEntry + }) => { + if (!firstEntry || !secondEntry) { + throw new Error(`Unexpected input to ` + `'add-to-cache-list-duplicate-entries' error.`); + } + + return `Two of the entries passed to ` + `'workbox-precaching.PrecacheController.addToCacheList()' had the URL ` + `${firstEntry._entryId} but different revision details. Workbox is ` + `unable to cache and version the asset correctly. Please remove one ` + `of the entries.`; + }, + 'plugin-error-request-will-fetch': ({ + thrownError + }) => { + if (!thrownError) { + throw new Error(`Unexpected input to ` + `'plugin-error-request-will-fetch', error.`); + } + + return `An error was thrown by a plugins 'requestWillFetch()' method. ` + `The thrown error message was: '${thrownError.message}'.`; + }, + 'invalid-cache-name': ({ + cacheNameId, + value + }) => { + if (!cacheNameId) { + throw new Error(`Expected a 'cacheNameId' for error 'invalid-cache-name'`); + } + + return `You must provide a name containing at least one character for ` + `setCacheDetails({${cacheNameId}: '...'}). Received a value of ` + `'${JSON.stringify(value)}'`; + }, + 'unregister-route-but-not-found-with-method': ({ + method + }) => { + if (!method) { + throw new Error(`Unexpected input to ` + `'unregister-route-but-not-found-with-method' error.`); + } + + return `The route you're trying to unregister was not previously ` + `registered for the method type '${method}'.`; + }, + 'unregister-route-route-not-registered': () => { + return `The route you're trying to unregister was not previously ` + `registered.`; + }, + 'queue-replay-failed': ({ + name + }) => { + return `Replaying the background sync queue '${name}' failed.`; + }, + 'duplicate-queue-name': ({ + name + }) => { + return `The Queue name '${name}' is already being used. ` + `All instances of backgroundSync.Queue must be given unique names.`; + }, + 'expired-test-without-max-age': ({ + methodName, + paramName + }) => { + return `The '${methodName}()' method can only be used when the ` + `'${paramName}' is used in the constructor.`; + }, + 'unsupported-route-type': ({ + moduleName, + className, + funcName, + paramName + }) => { + return `The supplied '${paramName}' parameter was an unsupported type. ` + `Please check the docs for ${moduleName}.${className}.${funcName} for ` + `valid input types.`; + }, + 'not-array-of-class': ({ + value, + expectedClass, + moduleName, + className, + funcName, + paramName + }) => { + return `The supplied '${paramName}' parameter must be an array of ` + `'${expectedClass}' objects. Received '${JSON.stringify(value)},'. ` + `Please check the call to ${moduleName}.${className}.${funcName}() ` + `to fix the issue.`; + }, + 'max-entries-or-age-required': ({ + moduleName, + className, + funcName + }) => { + return `You must define either config.maxEntries or config.maxAgeSeconds` + `in ${moduleName}.${className}.${funcName}`; + }, + 'statuses-or-headers-required': ({ + moduleName, + className, + funcName + }) => { + return `You must define either config.statuses or config.headers` + `in ${moduleName}.${className}.${funcName}`; + }, + 'invalid-string': ({ + moduleName, + funcName, + paramName + }) => { + if (!paramName || !moduleName || !funcName) { + throw new Error(`Unexpected input to 'invalid-string' error.`); + } + + return `When using strings, the '${paramName}' parameter must start with ` + `'http' (for cross-origin matches) or '/' (for same-origin matches). ` + `Please see the docs for ${moduleName}.${funcName}() for ` + `more info.`; + }, + 'channel-name-required': () => { + return `You must provide a channelName to construct a ` + `BroadcastCacheUpdate instance.`; + }, + 'invalid-responses-are-same-args': () => { + return `The arguments passed into responsesAreSame() appear to be ` + `invalid. Please ensure valid Responses are used.`; + }, + 'expire-custom-caches-only': () => { + return `You must provide a 'cacheName' property when using the ` + `expiration plugin with a runtime caching strategy.`; + }, + 'unit-must-be-bytes': ({ + normalizedRangeHeader + }) => { + if (!normalizedRangeHeader) { + throw new Error(`Unexpected input to 'unit-must-be-bytes' error.`); + } + + return `The 'unit' portion of the Range header must be set to 'bytes'. ` + `The Range header provided was "${normalizedRangeHeader}"`; + }, + 'single-range-only': ({ + normalizedRangeHeader + }) => { + if (!normalizedRangeHeader) { + throw new Error(`Unexpected input to 'single-range-only' error.`); + } + + return `Multiple ranges are not supported. Please use a single start ` + `value, and optional end value. The Range header provided was ` + `"${normalizedRangeHeader}"`; + }, + 'invalid-range-values': ({ + normalizedRangeHeader + }) => { + if (!normalizedRangeHeader) { + throw new Error(`Unexpected input to 'invalid-range-values' error.`); + } + + return `The Range header is missing both start and end values. At least ` + `one of those values is needed. The Range header provided was ` + `"${normalizedRangeHeader}"`; + }, + 'no-range-header': () => { + return `No Range header was found in the Request provided.`; + }, + 'range-not-satisfiable': ({ + size, + start, + end + }) => { + return `The start (${start}) and end (${end}) values in the Range are ` + `not satisfiable by the cached response, which is ${size} bytes.`; + }, + 'attempt-to-cache-non-get-request': ({ + url, + method + }) => { + return `Unable to cache '${url}' because it is a '${method}' request and ` + `only 'GET' requests can be cached.`; + }, + 'cache-put-with-no-response': ({ + url + }) => { + return `There was an attempt to cache '${url}' but the response was not ` + `defined.`; + }, + 'no-response': ({ + url, + error + }) => { + let message = `The strategy could not generate a response for '${url}'.`; + + if (error) { + message += ` The underlying error is ${error}.`; + } + + return message; + }, + 'bad-precaching-response': ({ + url, + status + }) => { + return `The precaching request for '${url}' failed` + (status ? ` with an HTTP status of ${status}.` : `.`); + }, + 'non-precached-url': ({ + url + }) => { + return `createHandlerBoundToURL('${url}') was called, but that URL is ` + `not precached. Please pass in a URL that is precached instead.`; + }, + 'add-to-cache-list-conflicting-integrities': ({ + url + }) => { + return `Two of the entries passed to ` + `'workbox-precaching.PrecacheController.addToCacheList()' had the URL ` + `${url} with different integrity values. Please remove one of them.`; + }, + 'missing-precache-entry': ({ + cacheName, + url + }) => { + return `Unable to find a precached response in ${cacheName} for ${url}.`; + }, + 'cross-origin-copy-response': ({ + origin + }) => { + return `workbox-core.copyResponse() can only be used with same-origin ` + `responses. It was passed a response with origin ${origin}.`; + } + }; + + /* + Copyright 2018 Google LLC + + Use of this source code is governed by an MIT-style + license that can be found in the LICENSE file or at + https://opensource.org/licenses/MIT. + */ + + const generatorFunction = (code, details = {}) => { + const message = messages$1[code]; + + if (!message) { + throw new Error(`Unable to find message for code '${code}'.`); + } + + return message(details); + }; + + const messageGenerator = generatorFunction; + + /* + Copyright 2018 Google LLC + + Use of this source code is governed by an MIT-style + license that can be found in the LICENSE file or at + https://opensource.org/licenses/MIT. + */ + /** + * Workbox errors should be thrown with this class. + * This allows use to ensure the type easily in tests, + * helps developers identify errors from workbox + * easily and allows use to optimise error + * messages correctly. + * + * @private + */ + + class WorkboxError extends Error { + /** + * + * @param {string} errorCode The error code that + * identifies this particular error. + * @param {Object=} details Any relevant arguments + * that will help developers identify issues should + * be added as a key on the context object. + */ + constructor(errorCode, details) { + const message = messageGenerator(errorCode, details); + super(message); + this.name = errorCode; + this.details = details; + } + + } + + /* + Copyright 2018 Google LLC + + Use of this source code is governed by an MIT-style + license that can be found in the LICENSE file or at + https://opensource.org/licenses/MIT. + */ + /* + * This method throws if the supplied value is not an array. + * The destructed values are required to produce a meaningful error for users. + * The destructed and restructured object is so it's clear what is + * needed. + */ + + const isArray = (value, details) => { + if (!Array.isArray(value)) { + throw new WorkboxError('not-an-array', details); + } + }; + + const hasMethod = (object, expectedMethod, details) => { + const type = typeof object[expectedMethod]; + + if (type !== 'function') { + details['expectedMethod'] = expectedMethod; + throw new WorkboxError('missing-a-method', details); + } + }; + + const isType = (object, expectedType, details) => { + if (typeof object !== expectedType) { + details['expectedType'] = expectedType; + throw new WorkboxError('incorrect-type', details); + } + }; + + const isInstance = (object, expectedClass, details) => { + if (!(object instanceof expectedClass)) { + details['expectedClass'] = expectedClass; + throw new WorkboxError('incorrect-class', details); + } + }; + + const isOneOf = (value, validValues, details) => { + if (!validValues.includes(value)) { + details['validValueDescription'] = `Valid values are ${JSON.stringify(validValues)}.`; + throw new WorkboxError('invalid-value', details); + } + }; + + const isArrayOfClass = (value, expectedClass, details) => { + const error = new WorkboxError('not-array-of-class', details); + + if (!Array.isArray(value)) { + throw error; + } + + for (const item of value) { + if (!(item instanceof expectedClass)) { + throw error; + } + } + }; + + const finalAssertExports = { + hasMethod, + isArray, + isInstance, + isOneOf, + isType, + isArrayOfClass + }; + + try { + self['workbox:routing:6.1.5'] && _(); + } catch (e) {} + + /* + Copyright 2018 Google LLC + + Use of this source code is governed by an MIT-style + license that can be found in the LICENSE file or at + https://opensource.org/licenses/MIT. + */ + /** + * The default HTTP method, 'GET', used when there's no specific method + * configured for a route. + * + * @type {string} + * + * @private + */ + + const defaultMethod = 'GET'; + /** + * The list of valid HTTP methods associated with requests that could be routed. + * + * @type {Array} + * + * @private + */ + + const validMethods = ['DELETE', 'GET', 'HEAD', 'PATCH', 'POST', 'PUT']; + + /* + Copyright 2018 Google LLC + + Use of this source code is governed by an MIT-style + license that can be found in the LICENSE file or at + https://opensource.org/licenses/MIT. + */ + /** + * @param {function()|Object} handler Either a function, or an object with a + * 'handle' method. + * @return {Object} An object with a handle method. + * + * @private + */ + + const normalizeHandler = handler => { + if (handler && typeof handler === 'object') { + { + finalAssertExports.hasMethod(handler, 'handle', { + moduleName: 'workbox-routing', + className: 'Route', + funcName: 'constructor', + paramName: 'handler' + }); + } + + return handler; + } else { + { + finalAssertExports.isType(handler, 'function', { + moduleName: 'workbox-routing', + className: 'Route', + funcName: 'constructor', + paramName: 'handler' + }); + } + + return { + handle: handler + }; + } + }; + + /* + Copyright 2018 Google LLC + + Use of this source code is governed by an MIT-style + license that can be found in the LICENSE file or at + https://opensource.org/licenses/MIT. + */ + /** + * A `Route` consists of a pair of callback functions, "match" and "handler". + * The "match" callback determine if a route should be used to "handle" a + * request by returning a non-falsy value if it can. The "handler" callback + * is called when there is a match and should return a Promise that resolves + * to a `Response`. + * + * @memberof module:workbox-routing + */ + + class Route { + /** + * Constructor for Route class. + * + * @param {module:workbox-routing~matchCallback} match + * A callback function that determines whether the route matches a given + * `fetch` event by returning a non-falsy value. + * @param {module:workbox-routing~handlerCallback} handler A callback + * function that returns a Promise resolving to a Response. + * @param {string} [method='GET'] The HTTP method to match the Route + * against. + */ + constructor(match, handler, method = defaultMethod) { + { + finalAssertExports.isType(match, 'function', { + moduleName: 'workbox-routing', + className: 'Route', + funcName: 'constructor', + paramName: 'match' + }); + + if (method) { + finalAssertExports.isOneOf(method, validMethods, { + paramName: 'method' + }); + } + } // These values are referenced directly by Router so cannot be + // altered by minificaton. + + + this.handler = normalizeHandler(handler); + this.match = match; + this.method = method; + } + /** + * + * @param {module:workbox-routing-handlerCallback} handler A callback + * function that returns a Promise resolving to a Response + */ + + + setCatchHandler(handler) { + this.catchHandler = normalizeHandler(handler); + } + + } + + /* + Copyright 2018 Google LLC + + Use of this source code is governed by an MIT-style + license that can be found in the LICENSE file or at + https://opensource.org/licenses/MIT. + */ + /** + * RegExpRoute makes it easy to create a regular expression based + * [Route]{@link module:workbox-routing.Route}. + * + * For same-origin requests the RegExp only needs to match part of the URL. For + * requests against third-party servers, you must define a RegExp that matches + * the start of the URL. + * + * [See the module docs for info.]{@link https://developers.google.com/web/tools/workbox/modules/workbox-routing} + * + * @memberof module:workbox-routing + * @extends module:workbox-routing.Route + */ + + class RegExpRoute extends Route { + /** + * If the regular expression contains + * [capture groups]{@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp#grouping-back-references}, + * the captured values will be passed to the + * [handler's]{@link module:workbox-routing~handlerCallback} `params` + * argument. + * + * @param {RegExp} regExp The regular expression to match against URLs. + * @param {module:workbox-routing~handlerCallback} handler A callback + * function that returns a Promise resulting in a Response. + * @param {string} [method='GET'] The HTTP method to match the Route + * against. + */ + constructor(regExp, handler, method) { + { + finalAssertExports.isInstance(regExp, RegExp, { + moduleName: 'workbox-routing', + className: 'RegExpRoute', + funcName: 'constructor', + paramName: 'pattern' + }); + } + + const match = ({ + url + }) => { + const result = regExp.exec(url.href); // Return immediately if there's no match. + + if (!result) { + return; + } // Require that the match start at the first character in the URL string + // if it's a cross-origin request. + // See https://github.com/GoogleChrome/workbox/issues/281 for the context + // behind this behavior. + + + if (url.origin !== location.origin && result.index !== 0) { + { + logger.debug(`The regular expression '${regExp}' only partially matched ` + `against the cross-origin URL '${url}'. RegExpRoute's will only ` + `handle cross-origin requests if they match the entire URL.`); + } + + return; + } // If the route matches, but there aren't any capture groups defined, then + // this will return [], which is truthy and therefore sufficient to + // indicate a match. + // If there are capture groups, then it will return their values. + + + return result.slice(1); + }; + + super(match, handler, method); + } + + } + + /* + Copyright 2018 Google LLC + + Use of this source code is governed by an MIT-style + license that can be found in the LICENSE file or at + https://opensource.org/licenses/MIT. + */ + + const getFriendlyURL = url => { + const urlObj = new URL(String(url), location.href); // See https://github.com/GoogleChrome/workbox/issues/2323 + // We want to include everything, except for the origin if it's same-origin. + + return urlObj.href.replace(new RegExp(`^${location.origin}`), ''); + }; + + /* + Copyright 2018 Google LLC + + Use of this source code is governed by an MIT-style + license that can be found in the LICENSE file or at + https://opensource.org/licenses/MIT. + */ + /** + * The Router can be used to process a FetchEvent through one or more + * [Routes]{@link module:workbox-routing.Route} responding with a Request if + * a matching route exists. + * + * If no route matches a given a request, the Router will use a "default" + * handler if one is defined. + * + * Should the matching Route throw an error, the Router will use a "catch" + * handler if one is defined to gracefully deal with issues and respond with a + * Request. + * + * If a request matches multiple routes, the **earliest** registered route will + * be used to respond to the request. + * + * @memberof module:workbox-routing + */ + + class Router { + /** + * Initializes a new Router. + */ + constructor() { + this._routes = new Map(); + this._defaultHandlerMap = new Map(); + } + /** + * @return {Map>} routes A `Map` of HTTP + * method name ('GET', etc.) to an array of all the corresponding `Route` + * instances that are registered. + */ + + + get routes() { + return this._routes; + } + /** + * Adds a fetch event listener to respond to events when a route matches + * the event's request. + */ + + + addFetchListener() { + // See https://github.com/Microsoft/TypeScript/issues/28357#issuecomment-436484705 + self.addEventListener('fetch', event => { + const { + request + } = event; + const responsePromise = this.handleRequest({ + request, + event + }); + + if (responsePromise) { + event.respondWith(responsePromise); + } + }); + } + /** + * Adds a message event listener for URLs to cache from the window. + * This is useful to cache resources loaded on the page prior to when the + * service worker started controlling it. + * + * The format of the message data sent from the window should be as follows. + * Where the `urlsToCache` array may consist of URL strings or an array of + * URL string + `requestInit` object (the same as you'd pass to `fetch()`). + * + * ``` + * { + * type: 'CACHE_URLS', + * payload: { + * urlsToCache: [ + * './script1.js', + * './script2.js', + * ['./script3.js', {mode: 'no-cors'}], + * ], + * }, + * } + * ``` + */ + + + addCacheListener() { + // See https://github.com/Microsoft/TypeScript/issues/28357#issuecomment-436484705 + self.addEventListener('message', event => { + if (event.data && event.data.type === 'CACHE_URLS') { + const { + payload + } = event.data; + + { + logger.debug(`Caching URLs from the window`, payload.urlsToCache); + } + + const requestPromises = Promise.all(payload.urlsToCache.map(entry => { + if (typeof entry === 'string') { + entry = [entry]; + } + + const request = new Request(...entry); + return this.handleRequest({ + request, + event + }); // TODO(philipwalton): TypeScript errors without this typecast for + // some reason (probably a bug). The real type here should work but + // doesn't: `Array | undefined>`. + })); // TypeScript + + event.waitUntil(requestPromises); // If a MessageChannel was used, reply to the message on success. + + if (event.ports && event.ports[0]) { + requestPromises.then(() => event.ports[0].postMessage(true)); + } + } + }); + } + /** + * Apply the routing rules to a FetchEvent object to get a Response from an + * appropriate Route's handler. + * + * @param {Object} options + * @param {Request} options.request The request to handle. + * @param {ExtendableEvent} options.event The event that triggered the + * request. + * @return {Promise|undefined} A promise is returned if a + * registered route can handle the request. If there is no matching + * route and there's no `defaultHandler`, `undefined` is returned. + */ + + + handleRequest({ + request, + event + }) { + { + finalAssertExports.isInstance(request, Request, { + moduleName: 'workbox-routing', + className: 'Router', + funcName: 'handleRequest', + paramName: 'options.request' + }); + } + + const url = new URL(request.url, location.href); + + if (!url.protocol.startsWith('http')) { + { + logger.debug(`Workbox Router only supports URLs that start with 'http'.`); + } + + return; + } + + const sameOrigin = url.origin === location.origin; + const { + params, + route + } = this.findMatchingRoute({ + event, + request, + sameOrigin, + url + }); + let handler = route && route.handler; + const debugMessages = []; + + { + if (handler) { + debugMessages.push([`Found a route to handle this request:`, route]); + + if (params) { + debugMessages.push([`Passing the following params to the route's handler:`, params]); + } + } + } // If we don't have a handler because there was no matching route, then + // fall back to defaultHandler if that's defined. + + + const method = request.method; + + if (!handler && this._defaultHandlerMap.has(method)) { + { + debugMessages.push(`Failed to find a matching route. Falling ` + `back to the default handler for ${method}.`); + } + + handler = this._defaultHandlerMap.get(method); + } + + if (!handler) { + { + // No handler so Workbox will do nothing. If logs is set of debug + // i.e. verbose, we should print out this information. + logger.debug(`No route found for: ${getFriendlyURL(url)}`); + } + + return; + } + + { + // We have a handler, meaning Workbox is going to handle the route. + // print the routing details to the console. + logger.groupCollapsed(`Router is responding to: ${getFriendlyURL(url)}`); + debugMessages.forEach(msg => { + if (Array.isArray(msg)) { + logger.log(...msg); + } else { + logger.log(msg); + } + }); + logger.groupEnd(); + } // Wrap in try and catch in case the handle method throws a synchronous + // error. It should still callback to the catch handler. + + + let responsePromise; + + try { + responsePromise = handler.handle({ + url, + request, + event, + params + }); + } catch (err) { + responsePromise = Promise.reject(err); + } // Get route's catch handler, if it exists + + + const catchHandler = route && route.catchHandler; + + if (responsePromise instanceof Promise && (this._catchHandler || catchHandler)) { + responsePromise = responsePromise.catch(async err => { + // If there's a route catch handler, process that first + if (catchHandler) { + { + // Still include URL here as it will be async from the console group + // and may not make sense without the URL + logger.groupCollapsed(`Error thrown when responding to: ` + ` ${getFriendlyURL(url)}. Falling back to route's Catch Handler.`); + logger.error(`Error thrown by:`, route); + logger.error(err); + logger.groupEnd(); + } + + try { + return await catchHandler.handle({ + url, + request, + event, + params + }); + } catch (catchErr) { + err = catchErr; + } + } + + if (this._catchHandler) { + { + // Still include URL here as it will be async from the console group + // and may not make sense without the URL + logger.groupCollapsed(`Error thrown when responding to: ` + ` ${getFriendlyURL(url)}. Falling back to global Catch Handler.`); + logger.error(`Error thrown by:`, route); + logger.error(err); + logger.groupEnd(); + } + + return this._catchHandler.handle({ + url, + request, + event + }); + } + + throw err; + }); + } + + return responsePromise; + } + /** + * Checks a request and URL (and optionally an event) against the list of + * registered routes, and if there's a match, returns the corresponding + * route along with any params generated by the match. + * + * @param {Object} options + * @param {URL} options.url + * @param {boolean} options.sameOrigin The result of comparing `url.origin` + * against the current origin. + * @param {Request} options.request The request to match. + * @param {Event} options.event The corresponding event. + * @return {Object} An object with `route` and `params` properties. + * They are populated if a matching route was found or `undefined` + * otherwise. + */ + + + findMatchingRoute({ + url, + sameOrigin, + request, + event + }) { + const routes = this._routes.get(request.method) || []; + + for (const route of routes) { + let params; + const matchResult = route.match({ + url, + sameOrigin, + request, + event + }); + + if (matchResult) { + { + // Warn developers that using an async matchCallback is almost always + // not the right thing to do. + if (matchResult instanceof Promise) { + logger.warn(`While routing ${getFriendlyURL(url)}, an async ` + `matchCallback function was used. Please convert the ` + `following route to use a synchronous matchCallback function:`, route); + } + } // See https://github.com/GoogleChrome/workbox/issues/2079 + + + params = matchResult; + + if (Array.isArray(matchResult) && matchResult.length === 0) { + // Instead of passing an empty array in as params, use undefined. + params = undefined; + } else if (matchResult.constructor === Object && Object.keys(matchResult).length === 0) { + // Instead of passing an empty object in as params, use undefined. + params = undefined; + } else if (typeof matchResult === 'boolean') { + // For the boolean value true (rather than just something truth-y), + // don't set params. + // See https://github.com/GoogleChrome/workbox/pull/2134#issuecomment-513924353 + params = undefined; + } // Return early if have a match. + + + return { + route, + params + }; + } + } // If no match was found above, return and empty object. + + + return {}; + } + /** + * Define a default `handler` that's called when no routes explicitly + * match the incoming request. + * + * Each HTTP method ('GET', 'POST', etc.) gets its own default handler. + * + * Without a default handler, unmatched requests will go against the + * network as if there were no service worker present. + * + * @param {module:workbox-routing~handlerCallback} handler A callback + * function that returns a Promise resulting in a Response. + * @param {string} [method='GET'] The HTTP method to associate with this + * default handler. Each method has its own default. + */ + + + setDefaultHandler(handler, method = defaultMethod) { + this._defaultHandlerMap.set(method, normalizeHandler(handler)); + } + /** + * If a Route throws an error while handling a request, this `handler` + * will be called and given a chance to provide a response. + * + * @param {module:workbox-routing~handlerCallback} handler A callback + * function that returns a Promise resulting in a Response. + */ + + + setCatchHandler(handler) { + this._catchHandler = normalizeHandler(handler); + } + /** + * Registers a route with the router. + * + * @param {module:workbox-routing.Route} route The route to register. + */ + + + registerRoute(route) { + { + finalAssertExports.isType(route, 'object', { + moduleName: 'workbox-routing', + className: 'Router', + funcName: 'registerRoute', + paramName: 'route' + }); + finalAssertExports.hasMethod(route, 'match', { + moduleName: 'workbox-routing', + className: 'Router', + funcName: 'registerRoute', + paramName: 'route' + }); + finalAssertExports.isType(route.handler, 'object', { + moduleName: 'workbox-routing', + className: 'Router', + funcName: 'registerRoute', + paramName: 'route' + }); + finalAssertExports.hasMethod(route.handler, 'handle', { + moduleName: 'workbox-routing', + className: 'Router', + funcName: 'registerRoute', + paramName: 'route.handler' + }); + finalAssertExports.isType(route.method, 'string', { + moduleName: 'workbox-routing', + className: 'Router', + funcName: 'registerRoute', + paramName: 'route.method' + }); + } + + if (!this._routes.has(route.method)) { + this._routes.set(route.method, []); + } // Give precedence to all of the earlier routes by adding this additional + // route to the end of the array. + + + this._routes.get(route.method).push(route); + } + /** + * Unregisters a route with the router. + * + * @param {module:workbox-routing.Route} route The route to unregister. + */ + + + unregisterRoute(route) { + if (!this._routes.has(route.method)) { + throw new WorkboxError('unregister-route-but-not-found-with-method', { + method: route.method + }); + } + + const routeIndex = this._routes.get(route.method).indexOf(route); + + if (routeIndex > -1) { + this._routes.get(route.method).splice(routeIndex, 1); + } else { + throw new WorkboxError('unregister-route-route-not-registered'); + } + } + + } + + /* + Copyright 2019 Google LLC + + Use of this source code is governed by an MIT-style + license that can be found in the LICENSE file or at + https://opensource.org/licenses/MIT. + */ + let defaultRouter; + /** + * Creates a new, singleton Router instance if one does not exist. If one + * does already exist, that instance is returned. + * + * @private + * @return {Router} + */ + + const getOrCreateDefaultRouter = () => { + if (!defaultRouter) { + defaultRouter = new Router(); // The helpers that use the default Router assume these listeners exist. + + defaultRouter.addFetchListener(); + defaultRouter.addCacheListener(); + } + + return defaultRouter; + }; + + /* + Copyright 2019 Google LLC + + Use of this source code is governed by an MIT-style + license that can be found in the LICENSE file or at + https://opensource.org/licenses/MIT. + */ + /** + * Easily register a RegExp, string, or function with a caching + * strategy to a singleton Router instance. + * + * This method will generate a Route for you if needed and + * call [registerRoute()]{@link module:workbox-routing.Router#registerRoute}. + * + * @param {RegExp|string|module:workbox-routing.Route~matchCallback|module:workbox-routing.Route} capture + * If the capture param is a `Route`, all other arguments will be ignored. + * @param {module:workbox-routing~handlerCallback} [handler] A callback + * function that returns a Promise resulting in a Response. This parameter + * is required if `capture` is not a `Route` object. + * @param {string} [method='GET'] The HTTP method to match the Route + * against. + * @return {module:workbox-routing.Route} The generated `Route`(Useful for + * unregistering). + * + * @memberof module:workbox-routing + */ + + function registerRoute(capture, handler, method) { + let route; + + if (typeof capture === 'string') { + const captureUrl = new URL(capture, location.href); + + { + if (!(capture.startsWith('/') || capture.startsWith('http'))) { + throw new WorkboxError('invalid-string', { + moduleName: 'workbox-routing', + funcName: 'registerRoute', + paramName: 'capture' + }); + } // We want to check if Express-style wildcards are in the pathname only. + // TODO: Remove this log message in v4. + + + const valueToCheck = capture.startsWith('http') ? captureUrl.pathname : capture; // See https://github.com/pillarjs/path-to-regexp#parameters + + const wildcards = '[*:?+]'; + + if (new RegExp(`${wildcards}`).exec(valueToCheck)) { + logger.debug(`The '$capture' parameter contains an Express-style wildcard ` + `character (${wildcards}). Strings are now always interpreted as ` + `exact matches; use a RegExp for partial or wildcard matches.`); + } + } + + const matchCallback = ({ + url + }) => { + { + if (url.pathname === captureUrl.pathname && url.origin !== captureUrl.origin) { + logger.debug(`${capture} only partially matches the cross-origin URL ` + `${url}. This route will only handle cross-origin requests ` + `if they match the entire URL.`); + } + } + + return url.href === captureUrl.href; + }; // If `capture` is a string then `handler` and `method` must be present. + + + route = new Route(matchCallback, handler, method); + } else if (capture instanceof RegExp) { + // If `capture` is a `RegExp` then `handler` and `method` must be present. + route = new RegExpRoute(capture, handler, method); + } else if (typeof capture === 'function') { + // If `capture` is a function then `handler` and `method` must be present. + route = new Route(capture, handler, method); + } else if (capture instanceof Route) { + route = capture; + } else { + throw new WorkboxError('unsupported-route-type', { + moduleName: 'workbox-routing', + funcName: 'registerRoute', + paramName: 'capture' + }); + } + + const defaultRouter = getOrCreateDefaultRouter(); + defaultRouter.registerRoute(route); + return route; + } + + try { + self['workbox:strategies:6.1.5'] && _(); + } catch (e) {} + + /* + Copyright 2018 Google LLC + + Use of this source code is governed by an MIT-style + license that can be found in the LICENSE file or at + https://opensource.org/licenses/MIT. + */ + const cacheOkAndOpaquePlugin = { + /** + * Returns a valid response (to allow caching) if the status is 200 (OK) or + * 0 (opaque). + * + * @param {Object} options + * @param {Response} options.response + * @return {Response|null} + * + * @private + */ + cacheWillUpdate: async ({ + response + }) => { + if (response.status === 200 || response.status === 0) { + return response; + } + + return null; + } + }; + + /* + Copyright 2018 Google LLC + + Use of this source code is governed by an MIT-style + license that can be found in the LICENSE file or at + https://opensource.org/licenses/MIT. + */ + const _cacheNameDetails = { + googleAnalytics: 'googleAnalytics', + precache: 'precache-v2', + prefix: 'workbox', + runtime: 'runtime', + suffix: typeof registration !== 'undefined' ? registration.scope : '' + }; + + const _createCacheName = cacheName => { + return [_cacheNameDetails.prefix, cacheName, _cacheNameDetails.suffix].filter(value => value && value.length > 0).join('-'); + }; + + const eachCacheNameDetail = fn => { + for (const key of Object.keys(_cacheNameDetails)) { + fn(key); + } + }; + + const cacheNames = { + updateDetails: details => { + eachCacheNameDetail(key => { + if (typeof details[key] === 'string') { + _cacheNameDetails[key] = details[key]; + } + }); + }, + getGoogleAnalyticsName: userCacheName => { + return userCacheName || _createCacheName(_cacheNameDetails.googleAnalytics); + }, + getPrecacheName: userCacheName => { + return userCacheName || _createCacheName(_cacheNameDetails.precache); + }, + getPrefix: () => { + return _cacheNameDetails.prefix; + }, + getRuntimeName: userCacheName => { + return userCacheName || _createCacheName(_cacheNameDetails.runtime); + }, + getSuffix: () => { + return _cacheNameDetails.suffix; + } + }; + + function _extends() { + _extends = Object.assign || function (target) { + for (var i = 1; i < arguments.length; i++) { + var source = arguments[i]; + + for (var key in source) { + if (Object.prototype.hasOwnProperty.call(source, key)) { + target[key] = source[key]; + } + } + } + + return target; + }; + + return _extends.apply(this, arguments); + } + + function stripParams(fullURL, ignoreParams) { + const strippedURL = new URL(fullURL); + + for (const param of ignoreParams) { + strippedURL.searchParams.delete(param); + } + + return strippedURL.href; + } + /** + * Matches an item in the cache, ignoring specific URL params. This is similar + * to the `ignoreSearch` option, but it allows you to ignore just specific + * params (while continuing to match on the others). + * + * @private + * @param {Cache} cache + * @param {Request} request + * @param {Object} matchOptions + * @param {Array} ignoreParams + * @return {Promise} + */ + + + async function cacheMatchIgnoreParams(cache, request, ignoreParams, matchOptions) { + const strippedRequestURL = stripParams(request.url, ignoreParams); // If the request doesn't include any ignored params, match as normal. + + if (request.url === strippedRequestURL) { + return cache.match(request, matchOptions); + } // Otherwise, match by comparing keys + + + const keysOptions = _extends({}, matchOptions, { + ignoreSearch: true + }); + + const cacheKeys = await cache.keys(request, keysOptions); + + for (const cacheKey of cacheKeys) { + const strippedCacheKeyURL = stripParams(cacheKey.url, ignoreParams); + + if (strippedRequestURL === strippedCacheKeyURL) { + return cache.match(cacheKey, matchOptions); + } + } + + return; + } + + /* + Copyright 2018 Google LLC + + Use of this source code is governed by an MIT-style + license that can be found in the LICENSE file or at + https://opensource.org/licenses/MIT. + */ + /** + * The Deferred class composes Promises in a way that allows for them to be + * resolved or rejected from outside the constructor. In most cases promises + * should be used directly, but Deferreds can be necessary when the logic to + * resolve a promise must be separate. + * + * @private + */ + + class Deferred { + /** + * Creates a promise and exposes its resolve and reject functions as methods. + */ + constructor() { + this.promise = new Promise((resolve, reject) => { + this.resolve = resolve; + this.reject = reject; + }); + } + + } + + /* + Copyright 2018 Google LLC + + Use of this source code is governed by an MIT-style + license that can be found in the LICENSE file or at + https://opensource.org/licenses/MIT. + */ + + const quotaErrorCallbacks = new Set(); + + /* + Copyright 2018 Google LLC + + Use of this source code is governed by an MIT-style + license that can be found in the LICENSE file or at + https://opensource.org/licenses/MIT. + */ + /** + * Runs all of the callback functions, one at a time sequentially, in the order + * in which they were registered. + * + * @memberof module:workbox-core + * @private + */ + + async function executeQuotaErrorCallbacks() { + { + logger.log(`About to run ${quotaErrorCallbacks.size} ` + `callbacks to clean up caches.`); + } + + for (const callback of quotaErrorCallbacks) { + await callback(); + + { + logger.log(callback, 'is complete.'); + } + } + + { + logger.log('Finished running callbacks.'); + } + } + + /* + Copyright 2019 Google LLC + Use of this source code is governed by an MIT-style + license that can be found in the LICENSE file or at + https://opensource.org/licenses/MIT. + */ + /** + * Returns a promise that resolves and the passed number of milliseconds. + * This utility is an async/await-friendly version of `setTimeout`. + * + * @param {number} ms + * @return {Promise} + * @private + */ + + function timeout(ms) { + return new Promise(resolve => setTimeout(resolve, ms)); + } + + function toRequest(input) { + return typeof input === 'string' ? new Request(input) : input; + } + /** + * A class created every time a Strategy instance instance calls + * [handle()]{@link module:workbox-strategies.Strategy~handle} or + * [handleAll()]{@link module:workbox-strategies.Strategy~handleAll} that wraps all fetch and + * cache actions around plugin callbacks and keeps track of when the strategy + * is "done" (i.e. all added `event.waitUntil()` promises have resolved). + * + * @memberof module:workbox-strategies + */ + + + class StrategyHandler { + /** + * Creates a new instance associated with the passed strategy and event + * that's handling the request. + * + * The constructor also initializes the state that will be passed to each of + * the plugins handling this request. + * + * @param {module:workbox-strategies.Strategy} strategy + * @param {Object} options + * @param {Request|string} options.request A request to run this strategy for. + * @param {ExtendableEvent} options.event The event associated with the + * request. + * @param {URL} [options.url] + * @param {*} [options.params] + * [match callback]{@link module:workbox-routing~matchCallback}, + * (if applicable). + */ + constructor(strategy, options) { + this._cacheKeys = {}; + /** + * The request the strategy is performing (passed to the strategy's + * `handle()` or `handleAll()` method). + * @name request + * @instance + * @type {Request} + * @memberof module:workbox-strategies.StrategyHandler + */ + + /** + * The event associated with this request. + * @name event + * @instance + * @type {ExtendableEvent} + * @memberof module:workbox-strategies.StrategyHandler + */ + + /** + * A `URL` instance of `request.url` (if passed to the strategy's + * `handle()` or `handleAll()` method). + * Note: the `url` param will be present if the strategy was invoked + * from a workbox `Route` object. + * @name url + * @instance + * @type {URL|undefined} + * @memberof module:workbox-strategies.StrategyHandler + */ + + /** + * A `param` value (if passed to the strategy's + * `handle()` or `handleAll()` method). + * Note: the `param` param will be present if the strategy was invoked + * from a workbox `Route` object and the + * [match callback]{@link module:workbox-routing~matchCallback} returned + * a truthy value (it will be that value). + * @name params + * @instance + * @type {*|undefined} + * @memberof module:workbox-strategies.StrategyHandler + */ + + { + finalAssertExports.isInstance(options.event, ExtendableEvent, { + moduleName: 'workbox-strategies', + className: 'StrategyHandler', + funcName: 'constructor', + paramName: 'options.event' + }); + } + + Object.assign(this, options); + this.event = options.event; + this._strategy = strategy; + this._handlerDeferred = new Deferred(); + this._extendLifetimePromises = []; // Copy the plugins list (since it's mutable on the strategy), + // so any mutations don't affect this handler instance. + + this._plugins = [...strategy.plugins]; + this._pluginStateMap = new Map(); + + for (const plugin of this._plugins) { + this._pluginStateMap.set(plugin, {}); + } + + this.event.waitUntil(this._handlerDeferred.promise); + } + /** + * Fetches a given request (and invokes any applicable plugin callback + * methods) using the `fetchOptions` (for non-navigation requests) and + * `plugins` defined on the `Strategy` object. + * + * The following plugin lifecycle methods are invoked when using this method: + * - `requestWillFetch()` + * - `fetchDidSucceed()` + * - `fetchDidFail()` + * + * @param {Request|string} input The URL or request to fetch. + * @return {Promise} + */ + + + async fetch(input) { + const { + event + } = this; + let request = toRequest(input); + + if (request.mode === 'navigate' && event instanceof FetchEvent && event.preloadResponse) { + const possiblePreloadResponse = await event.preloadResponse; + + if (possiblePreloadResponse) { + { + logger.log(`Using a preloaded navigation response for ` + `'${getFriendlyURL(request.url)}'`); + } + + return possiblePreloadResponse; + } + } // If there is a fetchDidFail plugin, we need to save a clone of the + // original request before it's either modified by a requestWillFetch + // plugin or before the original request's body is consumed via fetch(). + + + const originalRequest = this.hasCallback('fetchDidFail') ? request.clone() : null; + + try { + for (const cb of this.iterateCallbacks('requestWillFetch')) { + request = await cb({ + request: request.clone(), + event + }); + } + } catch (err) { + throw new WorkboxError('plugin-error-request-will-fetch', { + thrownError: err + }); + } // The request can be altered by plugins with `requestWillFetch` making + // the original request (most likely from a `fetch` event) different + // from the Request we make. Pass both to `fetchDidFail` to aid debugging. + + + const pluginFilteredRequest = request.clone(); + + try { + let fetchResponse; // See https://github.com/GoogleChrome/workbox/issues/1796 + + fetchResponse = await fetch(request, request.mode === 'navigate' ? undefined : this._strategy.fetchOptions); + + if ("development" !== 'production') { + logger.debug(`Network request for ` + `'${getFriendlyURL(request.url)}' returned a response with ` + `status '${fetchResponse.status}'.`); + } + + for (const callback of this.iterateCallbacks('fetchDidSucceed')) { + fetchResponse = await callback({ + event, + request: pluginFilteredRequest, + response: fetchResponse + }); + } + + return fetchResponse; + } catch (error) { + { + logger.log(`Network request for ` + `'${getFriendlyURL(request.url)}' threw an error.`, error); + } // `originalRequest` will only exist if a `fetchDidFail` callback + // is being used (see above). + + + if (originalRequest) { + await this.runCallbacks('fetchDidFail', { + error, + event, + originalRequest: originalRequest.clone(), + request: pluginFilteredRequest.clone() + }); + } + + throw error; + } + } + /** + * Calls `this.fetch()` and (in the background) runs `this.cachePut()` on + * the response generated by `this.fetch()`. + * + * The call to `this.cachePut()` automatically invokes `this.waitUntil()`, + * so you do not have to manually call `waitUntil()` on the event. + * + * @param {Request|string} input The request or URL to fetch and cache. + * @return {Promise} + */ + + + async fetchAndCachePut(input) { + const response = await this.fetch(input); + const responseClone = response.clone(); + this.waitUntil(this.cachePut(input, responseClone)); + return response; + } + /** + * Matches a request from the cache (and invokes any applicable plugin + * callback methods) using the `cacheName`, `matchOptions`, and `plugins` + * defined on the strategy object. + * + * The following plugin lifecycle methods are invoked when using this method: + * - cacheKeyWillByUsed() + * - cachedResponseWillByUsed() + * + * @param {Request|string} key The Request or URL to use as the cache key. + * @return {Promise} A matching response, if found. + */ + + + async cacheMatch(key) { + const request = toRequest(key); + let cachedResponse; + const { + cacheName, + matchOptions + } = this._strategy; + const effectiveRequest = await this.getCacheKey(request, 'read'); + + const multiMatchOptions = _extends({}, matchOptions, { + cacheName + }); + + cachedResponse = await caches.match(effectiveRequest, multiMatchOptions); + + { + if (cachedResponse) { + logger.debug(`Found a cached response in '${cacheName}'.`); + } else { + logger.debug(`No cached response found in '${cacheName}'.`); + } + } + + for (const callback of this.iterateCallbacks('cachedResponseWillBeUsed')) { + cachedResponse = (await callback({ + cacheName, + matchOptions, + cachedResponse, + request: effectiveRequest, + event: this.event + })) || undefined; + } + + return cachedResponse; + } + /** + * Puts a request/response pair in the cache (and invokes any applicable + * plugin callback methods) using the `cacheName` and `plugins` defined on + * the strategy object. + * + * The following plugin lifecycle methods are invoked when using this method: + * - cacheKeyWillByUsed() + * - cacheWillUpdate() + * - cacheDidUpdate() + * + * @param {Request|string} key The request or URL to use as the cache key. + * @param {Response} response The response to cache. + * @return {Promise} `false` if a cacheWillUpdate caused the response + * not be cached, and `true` otherwise. + */ + + + async cachePut(key, response) { + const request = toRequest(key); // Run in the next task to avoid blocking other cache reads. + // https://github.com/w3c/ServiceWorker/issues/1397 + + await timeout(0); + const effectiveRequest = await this.getCacheKey(request, 'write'); + + { + if (effectiveRequest.method && effectiveRequest.method !== 'GET') { + throw new WorkboxError('attempt-to-cache-non-get-request', { + url: getFriendlyURL(effectiveRequest.url), + method: effectiveRequest.method + }); + } + } + + if (!response) { + { + logger.error(`Cannot cache non-existent response for ` + `'${getFriendlyURL(effectiveRequest.url)}'.`); + } + + throw new WorkboxError('cache-put-with-no-response', { + url: getFriendlyURL(effectiveRequest.url) + }); + } + + const responseToCache = await this._ensureResponseSafeToCache(response); + + if (!responseToCache) { + { + logger.debug(`Response '${getFriendlyURL(effectiveRequest.url)}' ` + `will not be cached.`, responseToCache); + } + + return false; + } + + const { + cacheName, + matchOptions + } = this._strategy; + const cache = await self.caches.open(cacheName); + const hasCacheUpdateCallback = this.hasCallback('cacheDidUpdate'); + const oldResponse = hasCacheUpdateCallback ? await cacheMatchIgnoreParams( // TODO(philipwalton): the `__WB_REVISION__` param is a precaching + // feature. Consider into ways to only add this behavior if using + // precaching. + cache, effectiveRequest.clone(), ['__WB_REVISION__'], matchOptions) : null; + + { + logger.debug(`Updating the '${cacheName}' cache with a new Response ` + `for ${getFriendlyURL(effectiveRequest.url)}.`); + } + + try { + await cache.put(effectiveRequest, hasCacheUpdateCallback ? responseToCache.clone() : responseToCache); + } catch (error) { + // See https://developer.mozilla.org/en-US/docs/Web/API/DOMException#exception-QuotaExceededError + if (error.name === 'QuotaExceededError') { + await executeQuotaErrorCallbacks(); + } + + throw error; + } + + for (const callback of this.iterateCallbacks('cacheDidUpdate')) { + await callback({ + cacheName, + oldResponse, + newResponse: responseToCache.clone(), + request: effectiveRequest, + event: this.event + }); + } + + return true; + } + /** + * Checks the list of plugins for the `cacheKeyWillBeUsed` callback, and + * executes any of those callbacks found in sequence. The final `Request` + * object returned by the last plugin is treated as the cache key for cache + * reads and/or writes. If no `cacheKeyWillBeUsed` plugin callbacks have + * been registered, the passed request is returned unmodified + * + * @param {Request} request + * @param {string} mode + * @return {Promise} + */ + + + async getCacheKey(request, mode) { + if (!this._cacheKeys[mode]) { + let effectiveRequest = request; + + for (const callback of this.iterateCallbacks('cacheKeyWillBeUsed')) { + effectiveRequest = toRequest(await callback({ + mode, + request: effectiveRequest, + event: this.event, + params: this.params + })); + } + + this._cacheKeys[mode] = effectiveRequest; + } + + return this._cacheKeys[mode]; + } + /** + * Returns true if the strategy has at least one plugin with the given + * callback. + * + * @param {string} name The name of the callback to check for. + * @return {boolean} + */ + + + hasCallback(name) { + for (const plugin of this._strategy.plugins) { + if (name in plugin) { + return true; + } + } + + return false; + } + /** + * Runs all plugin callbacks matching the given name, in order, passing the + * given param object (merged ith the current plugin state) as the only + * argument. + * + * Note: since this method runs all plugins, it's not suitable for cases + * where the return value of a callback needs to be applied prior to calling + * the next callback. See + * [`iterateCallbacks()`]{@link module:workbox-strategies.StrategyHandler#iterateCallbacks} + * below for how to handle that case. + * + * @param {string} name The name of the callback to run within each plugin. + * @param {Object} param The object to pass as the first (and only) param + * when executing each callback. This object will be merged with the + * current plugin state prior to callback execution. + */ + + + async runCallbacks(name, param) { + for (const callback of this.iterateCallbacks(name)) { + // TODO(philipwalton): not sure why `any` is needed. It seems like + // this should work with `as WorkboxPluginCallbackParam[C]`. + await callback(param); + } + } + /** + * Accepts a callback and returns an iterable of matching plugin callbacks, + * where each callback is wrapped with the current handler state (i.e. when + * you call each callback, whatever object parameter you pass it will + * be merged with the plugin's current state). + * + * @param {string} name The name fo the callback to run + * @return {Array} + */ + + + *iterateCallbacks(name) { + for (const plugin of this._strategy.plugins) { + if (typeof plugin[name] === 'function') { + const state = this._pluginStateMap.get(plugin); + + const statefulCallback = param => { + const statefulParam = _extends({}, param, { + state + }); // TODO(philipwalton): not sure why `any` is needed. It seems like + // this should work with `as WorkboxPluginCallbackParam[C]`. + + + return plugin[name](statefulParam); + }; + + yield statefulCallback; + } + } + } + /** + * Adds a promise to the + * [extend lifetime promises]{@link https://w3c.github.io/ServiceWorker/#extendableevent-extend-lifetime-promises} + * of the event event associated with the request being handled (usually a + * `FetchEvent`). + * + * Note: you can await + * [`doneWaiting()`]{@link module:workbox-strategies.StrategyHandler~doneWaiting} + * to know when all added promises have settled. + * + * @param {Promise} promise A promise to add to the extend lifetime promises + * of the event that triggered the request. + */ + + + waitUntil(promise) { + this._extendLifetimePromises.push(promise); + + return promise; + } + /** + * Returns a promise that resolves once all promises passed to + * [`waitUntil()`]{@link module:workbox-strategies.StrategyHandler~waitUntil} + * have settled. + * + * Note: any work done after `doneWaiting()` settles should be manually + * passed to an event's `waitUntil()` method (not this handler's + * `waitUntil()` method), otherwise the service worker thread my be killed + * prior to your work completing. + */ + + + async doneWaiting() { + let promise; + + while (promise = this._extendLifetimePromises.shift()) { + await promise; + } + } + /** + * Stops running the strategy and immediately resolves any pending + * `waitUntil()` promises. + */ + + + destroy() { + this._handlerDeferred.resolve(); + } + /** + * This method will call cacheWillUpdate on the available plugins (or use + * status === 200) to determine if the Response is safe and valid to cache. + * + * @param {Request} options.request + * @param {Response} options.response + * @return {Promise} + * + * @private + */ + + + async _ensureResponseSafeToCache(response) { + let responseToCache = response; + let pluginsUsed = false; + + for (const callback of this.iterateCallbacks('cacheWillUpdate')) { + responseToCache = (await callback({ + request: this.request, + response: responseToCache, + event: this.event + })) || undefined; + pluginsUsed = true; + + if (!responseToCache) { + break; + } + } + + if (!pluginsUsed) { + if (responseToCache && responseToCache.status !== 200) { + responseToCache = undefined; + } + + { + if (responseToCache) { + if (responseToCache.status !== 200) { + if (responseToCache.status === 0) { + logger.warn(`The response for '${this.request.url}' ` + `is an opaque response. The caching strategy that you're ` + `using will not cache opaque responses by default.`); + } else { + logger.debug(`The response for '${this.request.url}' ` + `returned a status code of '${response.status}' and won't ` + `be cached as a result.`); + } + } + } + } + } + + return responseToCache; + } + + } + + /* + Copyright 2020 Google LLC + + Use of this source code is governed by an MIT-style + license that can be found in the LICENSE file or at + https://opensource.org/licenses/MIT. + */ + /** + * An abstract base class that all other strategy classes must extend from: + * + * @memberof module:workbox-strategies + */ + + class Strategy { + /** + * Creates a new instance of the strategy and sets all documented option + * properties as public instance properties. + * + * Note: if a custom strategy class extends the base Strategy class and does + * not need more than these properties, it does not need to define its own + * constructor. + * + * @param {Object} [options] + * @param {string} [options.cacheName] Cache name to store and retrieve + * requests. Defaults to the cache names provided by + * [workbox-core]{@link module:workbox-core.cacheNames}. + * @param {Array} [options.plugins] [Plugins]{@link https://developers.google.com/web/tools/workbox/guides/using-plugins} + * to use in conjunction with this caching strategy. + * @param {Object} [options.fetchOptions] Values passed along to the + * [`init`](https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/fetch#Parameters) + * of [non-navigation](https://github.com/GoogleChrome/workbox/issues/1796) + * `fetch()` requests made by this strategy. + * @param {Object} [options.matchOptions] The + * [`CacheQueryOptions`]{@link https://w3c.github.io/ServiceWorker/#dictdef-cachequeryoptions} + * for any `cache.match()` or `cache.put()` calls made by this strategy. + */ + constructor(options = {}) { + /** + * Cache name to store and retrieve + * requests. Defaults to the cache names provided by + * [workbox-core]{@link module:workbox-core.cacheNames}. + * + * @type {string} + */ + this.cacheName = cacheNames.getRuntimeName(options.cacheName); + /** + * The list + * [Plugins]{@link https://developers.google.com/web/tools/workbox/guides/using-plugins} + * used by this strategy. + * + * @type {Array} + */ + + this.plugins = options.plugins || []; + /** + * Values passed along to the + * [`init`]{@link https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/fetch#Parameters} + * of all fetch() requests made by this strategy. + * + * @type {Object} + */ + + this.fetchOptions = options.fetchOptions; + /** + * The + * [`CacheQueryOptions`]{@link https://w3c.github.io/ServiceWorker/#dictdef-cachequeryoptions} + * for any `cache.match()` or `cache.put()` calls made by this strategy. + * + * @type {Object} + */ + + this.matchOptions = options.matchOptions; + } + /** + * Perform a request strategy and returns a `Promise` that will resolve with + * a `Response`, invoking all relevant plugin callbacks. + * + * When a strategy instance is registered with a Workbox + * [route]{@link module:workbox-routing.Route}, this method is automatically + * called when the route matches. + * + * Alternatively, this method can be used in a standalone `FetchEvent` + * listener by passing it to `event.respondWith()`. + * + * @param {FetchEvent|Object} options A `FetchEvent` or an object with the + * properties listed below. + * @param {Request|string} options.request A request to run this strategy for. + * @param {ExtendableEvent} options.event The event associated with the + * request. + * @param {URL} [options.url] + * @param {*} [options.params] + */ + + + handle(options) { + const [responseDone] = this.handleAll(options); + return responseDone; + } + /** + * Similar to [`handle()`]{@link module:workbox-strategies.Strategy~handle}, but + * instead of just returning a `Promise` that resolves to a `Response` it + * it will return an tuple of [response, done] promises, where the former + * (`response`) is equivalent to what `handle()` returns, and the latter is a + * Promise that will resolve once any promises that were added to + * `event.waitUntil()` as part of performing the strategy have completed. + * + * You can await the `done` promise to ensure any extra work performed by + * the strategy (usually caching responses) completes successfully. + * + * @param {FetchEvent|Object} options A `FetchEvent` or an object with the + * properties listed below. + * @param {Request|string} options.request A request to run this strategy for. + * @param {ExtendableEvent} options.event The event associated with the + * request. + * @param {URL} [options.url] + * @param {*} [options.params] + * @return {Array} A tuple of [response, done] + * promises that can be used to determine when the response resolves as + * well as when the handler has completed all its work. + */ + + + handleAll(options) { + // Allow for flexible options to be passed. + if (options instanceof FetchEvent) { + options = { + event: options, + request: options.request + }; + } + + const event = options.event; + const request = typeof options.request === 'string' ? new Request(options.request) : options.request; + const params = 'params' in options ? options.params : undefined; + const handler = new StrategyHandler(this, { + event, + request, + params + }); + + const responseDone = this._getResponse(handler, request, event); + + const handlerDone = this._awaitComplete(responseDone, handler, request, event); // Return an array of promises, suitable for use with Promise.all(). + + + return [responseDone, handlerDone]; + } + + async _getResponse(handler, request, event) { + await handler.runCallbacks('handlerWillStart', { + event, + request + }); + let response = undefined; + + try { + response = await this._handle(request, handler); // The "official" Strategy subclasses all throw this error automatically, + // but in case a third-party Strategy doesn't, ensure that we have a + // consistent failure when there's no response or an error response. + + if (!response || response.type === 'error') { + throw new WorkboxError('no-response', { + url: request.url + }); + } + } catch (error) { + for (const callback of handler.iterateCallbacks('handlerDidError')) { + response = await callback({ + error, + event, + request + }); + + if (response) { + break; + } + } + + if (!response) { + throw error; + } else { + logger.log(`While responding to '${getFriendlyURL(request.url)}', ` + `an ${error} error occurred. Using a fallback response provided by ` + `a handlerDidError plugin.`); + } + } + + for (const callback of handler.iterateCallbacks('handlerWillRespond')) { + response = await callback({ + event, + request, + response + }); + } + + return response; + } + + async _awaitComplete(responseDone, handler, request, event) { + let response; + let error; + + try { + response = await responseDone; + } catch (error) {// Ignore errors, as response errors should be caught via the `response` + // promise above. The `done` promise will only throw for errors in + // promises passed to `handler.waitUntil()`. + } + + try { + await handler.runCallbacks('handlerDidRespond', { + event, + request, + response + }); + await handler.doneWaiting(); + } catch (waitUntilError) { + error = waitUntilError; + } + + await handler.runCallbacks('handlerDidComplete', { + event, + request, + response, + error + }); + handler.destroy(); + + if (error) { + throw error; + } + } + + } + /** + * Classes extending the `Strategy` based class should implement this method, + * and leverage the [`handler`]{@link module:workbox-strategies.StrategyHandler} + * arg to perform all fetching and cache logic, which will ensure all relevant + * cache, cache options, fetch options and plugins are used (per the current + * strategy instance). + * + * @name _handle + * @instance + * @abstract + * @function + * @param {Request} request + * @param {module:workbox-strategies.StrategyHandler} handler + * @return {Promise} + * + * @memberof module:workbox-strategies.Strategy + */ + + /* + Copyright 2018 Google LLC + + Use of this source code is governed by an MIT-style + license that can be found in the LICENSE file or at + https://opensource.org/licenses/MIT. + */ + const messages = { + strategyStart: (strategyName, request) => `Using ${strategyName} to respond to '${getFriendlyURL(request.url)}'`, + printFinalResponse: response => { + if (response) { + logger.groupCollapsed(`View the final response here.`); + logger.log(response || '[No response returned]'); + logger.groupEnd(); + } + } + }; + + /* + Copyright 2018 Google LLC + + Use of this source code is governed by an MIT-style + license that can be found in the LICENSE file or at + https://opensource.org/licenses/MIT. + */ + /** + * An implementation of a + * [network first]{@link https://developers.google.com/web/fundamentals/instant-and-offline/offline-cookbook/#network-falling-back-to-cache} + * request strategy. + * + * By default, this strategy will cache responses with a 200 status code as + * well as [opaque responses]{@link https://developers.google.com/web/tools/workbox/guides/handle-third-party-requests}. + * Opaque responses are are cross-origin requests where the response doesn't + * support [CORS]{@link https://enable-cors.org/}. + * + * If the network request fails, and there is no cache match, this will throw + * a `WorkboxError` exception. + * + * @extends module:workbox-strategies.Strategy + * @memberof module:workbox-strategies + */ + + class NetworkFirst extends Strategy { + /** + * @param {Object} [options] + * @param {string} [options.cacheName] Cache name to store and retrieve + * requests. Defaults to cache names provided by + * [workbox-core]{@link module:workbox-core.cacheNames}. + * @param {Array} [options.plugins] [Plugins]{@link https://developers.google.com/web/tools/workbox/guides/using-plugins} + * to use in conjunction with this caching strategy. + * @param {Object} [options.fetchOptions] Values passed along to the + * [`init`](https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/fetch#Parameters) + * of [non-navigation](https://github.com/GoogleChrome/workbox/issues/1796) + * `fetch()` requests made by this strategy. + * @param {Object} [options.matchOptions] [`CacheQueryOptions`](https://w3c.github.io/ServiceWorker/#dictdef-cachequeryoptions) + * @param {number} [options.networkTimeoutSeconds] If set, any network requests + * that fail to respond within the timeout will fallback to the cache. + * + * This option can be used to combat + * "[lie-fi]{@link https://developers.google.com/web/fundamentals/performance/poor-connectivity/#lie-fi}" + * scenarios. + */ + constructor(options = {}) { + super(options); // If this instance contains no plugins with a 'cacheWillUpdate' callback, + // prepend the `cacheOkAndOpaquePlugin` plugin to the plugins list. + + if (!this.plugins.some(p => 'cacheWillUpdate' in p)) { + this.plugins.unshift(cacheOkAndOpaquePlugin); + } + + this._networkTimeoutSeconds = options.networkTimeoutSeconds || 0; + + { + if (this._networkTimeoutSeconds) { + finalAssertExports.isType(this._networkTimeoutSeconds, 'number', { + moduleName: 'workbox-strategies', + className: this.constructor.name, + funcName: 'constructor', + paramName: 'networkTimeoutSeconds' + }); + } + } + } + /** + * @private + * @param {Request|string} request A request to run this strategy for. + * @param {module:workbox-strategies.StrategyHandler} handler The event that + * triggered the request. + * @return {Promise} + */ + + + async _handle(request, handler) { + const logs = []; + + { + finalAssertExports.isInstance(request, Request, { + moduleName: 'workbox-strategies', + className: this.constructor.name, + funcName: 'handle', + paramName: 'makeRequest' + }); + } + + const promises = []; + let timeoutId; + + if (this._networkTimeoutSeconds) { + const { + id, + promise + } = this._getTimeoutPromise({ + request, + logs, + handler + }); + + timeoutId = id; + promises.push(promise); + } + + const networkPromise = this._getNetworkPromise({ + timeoutId, + request, + logs, + handler + }); + + promises.push(networkPromise); + const response = await handler.waitUntil((async () => { + // Promise.race() will resolve as soon as the first promise resolves. + return (await handler.waitUntil(Promise.race(promises))) || ( // If Promise.race() resolved with null, it might be due to a network + // timeout + a cache miss. If that were to happen, we'd rather wait until + // the networkPromise resolves instead of returning null. + // Note that it's fine to await an already-resolved promise, so we don't + // have to check to see if it's still "in flight". + await networkPromise); + })()); + + { + logger.groupCollapsed(messages.strategyStart(this.constructor.name, request)); + + for (const log of logs) { + logger.log(log); + } + + messages.printFinalResponse(response); + logger.groupEnd(); + } + + if (!response) { + throw new WorkboxError('no-response', { + url: request.url + }); + } + + return response; + } + /** + * @param {Object} options + * @param {Request} options.request + * @param {Array} options.logs A reference to the logs array + * @param {Event} options.event + * @return {Promise} + * + * @private + */ + + + _getTimeoutPromise({ + request, + logs, + handler + }) { + let timeoutId; + const timeoutPromise = new Promise(resolve => { + const onNetworkTimeout = async () => { + { + logs.push(`Timing out the network response at ` + `${this._networkTimeoutSeconds} seconds.`); + } + + resolve(await handler.cacheMatch(request)); + }; + + timeoutId = setTimeout(onNetworkTimeout, this._networkTimeoutSeconds * 1000); + }); + return { + promise: timeoutPromise, + id: timeoutId + }; + } + /** + * @param {Object} options + * @param {number|undefined} options.timeoutId + * @param {Request} options.request + * @param {Array} options.logs A reference to the logs Array. + * @param {Event} options.event + * @return {Promise} + * + * @private + */ + + + async _getNetworkPromise({ + timeoutId, + request, + logs, + handler + }) { + let error; + let response; + + try { + response = await handler.fetchAndCachePut(request); + } catch (fetchError) { + error = fetchError; + } + + if (timeoutId) { + clearTimeout(timeoutId); + } + + { + if (response) { + logs.push(`Got response from network.`); + } else { + logs.push(`Unable to get a response from the network. Will respond ` + `with a cached response.`); + } + } + + if (error || !response) { + response = await handler.cacheMatch(request); + + { + if (response) { + logs.push(`Found a cached response in the '${this.cacheName}'` + ` cache.`); + } else { + logs.push(`No response found in the '${this.cacheName}' cache.`); + } + } + } + + return response; + } + + } + + /* + Copyright 2018 Google LLC + + Use of this source code is governed by an MIT-style + license that can be found in the LICENSE file or at + https://opensource.org/licenses/MIT. + */ + /** + * An implementation of a + * [network-only]{@link https://developers.google.com/web/fundamentals/instant-and-offline/offline-cookbook/#network-only} + * request strategy. + * + * This class is useful if you want to take advantage of any + * [Workbox plugins]{@link https://developers.google.com/web/tools/workbox/guides/using-plugins}. + * + * If the network request fails, this will throw a `WorkboxError` exception. + * + * @extends module:workbox-strategies.Strategy + * @memberof module:workbox-strategies + */ + + class NetworkOnly extends Strategy { + /** + * @param {Object} [options] + * @param {Array} [options.plugins] [Plugins]{@link https://developers.google.com/web/tools/workbox/guides/using-plugins} + * to use in conjunction with this caching strategy. + * @param {Object} [options.fetchOptions] Values passed along to the + * [`init`](https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/fetch#Parameters) + * of [non-navigation](https://github.com/GoogleChrome/workbox/issues/1796) + * `fetch()` requests made by this strategy. + * @param {number} [options.networkTimeoutSeconds] If set, any network requests + * that fail to respond within the timeout will result in a network error. + */ + constructor(options = {}) { + super(options); + this._networkTimeoutSeconds = options.networkTimeoutSeconds || 0; + } + /** + * @private + * @param {Request|string} request A request to run this strategy for. + * @param {module:workbox-strategies.StrategyHandler} handler The event that + * triggered the request. + * @return {Promise} + */ + + + async _handle(request, handler) { + { + finalAssertExports.isInstance(request, Request, { + moduleName: 'workbox-strategies', + className: this.constructor.name, + funcName: '_handle', + paramName: 'request' + }); + } + + let error = undefined; + let response; + + try { + const promises = [handler.fetch(request)]; + + if (this._networkTimeoutSeconds) { + const timeoutPromise = timeout(this._networkTimeoutSeconds * 1000); + promises.push(timeoutPromise); + } + + response = await Promise.race(promises); + + if (!response) { + throw new Error(`Timed out the network response after ` + `${this._networkTimeoutSeconds} seconds.`); + } + } catch (err) { + error = err; + } + + { + logger.groupCollapsed(messages.strategyStart(this.constructor.name, request)); + + if (response) { + logger.log(`Got response from network.`); + } else { + logger.log(`Unable to get a response from the network.`); + } + + messages.printFinalResponse(response); + logger.groupEnd(); + } + + if (!response) { + throw new WorkboxError('no-response', { + url: request.url, + error + }); + } + + return response; + } + + } + + /* + Copyright 2019 Google LLC + + Use of this source code is governed by an MIT-style + license that can be found in the LICENSE file or at + https://opensource.org/licenses/MIT. + */ + /** + * Claim any currently available clients once the service worker + * becomes active. This is normally used in conjunction with `skipWaiting()`. + * + * @memberof module:workbox-core + */ + + function clientsClaim() { + self.addEventListener('activate', () => self.clients.claim()); + } + + exports.NetworkFirst = NetworkFirst; + exports.NetworkOnly = NetworkOnly; + exports.clientsClaim = clientsClaim; + exports.registerRoute = registerRoute; + +}); +//# sourceMappingURL=workbox-6b19f60b.js.map diff --git a/public/workbox-6b19f60b.js.map b/public/workbox-6b19f60b.js.map new file mode 100644 index 000000000..c0d0a8fe7 --- /dev/null +++ b/public/workbox-6b19f60b.js.map @@ -0,0 +1 @@ +{"version":3,"file":"workbox-6b19f60b.js","sources":["node_modules/workbox-core/_version.js","node_modules/workbox-core/_private/logger.js","node_modules/workbox-core/models/messages/messages.js","node_modules/workbox-core/models/messages/messageGenerator.js","node_modules/workbox-core/_private/WorkboxError.js","node_modules/workbox-core/_private/assert.js","node_modules/workbox-routing/_version.js","node_modules/workbox-routing/utils/constants.js","node_modules/workbox-routing/utils/normalizeHandler.js","node_modules/workbox-routing/Route.js","node_modules/workbox-routing/RegExpRoute.js","node_modules/workbox-core/_private/getFriendlyURL.js","node_modules/workbox-routing/Router.js","node_modules/workbox-routing/utils/getOrCreateDefaultRouter.js","node_modules/workbox-routing/registerRoute.js","node_modules/workbox-strategies/_version.js","node_modules/workbox-strategies/plugins/cacheOkAndOpaquePlugin.js","node_modules/workbox-core/_private/cacheNames.js","node_modules/workbox-core/_private/cacheMatchIgnoreParams.js","node_modules/workbox-core/_private/Deferred.js","node_modules/workbox-core/models/quotaErrorCallbacks.js","node_modules/workbox-core/_private/executeQuotaErrorCallbacks.js","node_modules/workbox-core/_private/timeout.js","node_modules/workbox-strategies/StrategyHandler.js","node_modules/workbox-strategies/Strategy.js","node_modules/workbox-strategies/utils/messages.js","node_modules/workbox-strategies/NetworkFirst.js","node_modules/workbox-strategies/NetworkOnly.js","node_modules/workbox-core/clientsClaim.js"],"sourcesContent":["\"use strict\";\n// @ts-ignore\ntry {\n self['workbox:core:6.1.5'] && _();\n}\ncatch (e) { }\n","/*\n Copyright 2019 Google LLC\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\nimport '../_version.js';\nconst logger = (process.env.NODE_ENV === 'production' ? null : (() => {\n // Don't overwrite this value if it's already set.\n // See https://github.com/GoogleChrome/workbox/pull/2284#issuecomment-560470923\n if (!('__WB_DISABLE_DEV_LOGS' in self)) {\n self.__WB_DISABLE_DEV_LOGS = false;\n }\n let inGroup = false;\n const methodToColorMap = {\n debug: `#7f8c8d`,\n log: `#2ecc71`,\n warn: `#f39c12`,\n error: `#c0392b`,\n groupCollapsed: `#3498db`,\n groupEnd: null,\n };\n const print = function (method, args) {\n if (self.__WB_DISABLE_DEV_LOGS) {\n return;\n }\n if (method === 'groupCollapsed') {\n // Safari doesn't print all console.groupCollapsed() arguments:\n // https://bugs.webkit.org/show_bug.cgi?id=182754\n if (/^((?!chrome|android).)*safari/i.test(navigator.userAgent)) {\n console[method](...args);\n return;\n }\n }\n const styles = [\n `background: ${methodToColorMap[method]}`,\n `border-radius: 0.5em`,\n `color: white`,\n `font-weight: bold`,\n `padding: 2px 0.5em`,\n ];\n // When in a group, the workbox prefix is not displayed.\n const logPrefix = inGroup ? [] : ['%cworkbox', styles.join(';')];\n console[method](...logPrefix, ...args);\n if (method === 'groupCollapsed') {\n inGroup = true;\n }\n if (method === 'groupEnd') {\n inGroup = false;\n }\n };\n const api = {};\n const loggerMethods = Object.keys(methodToColorMap);\n for (const key of loggerMethods) {\n const method = key;\n api[method] = (...args) => {\n print(method, args);\n };\n }\n return api;\n})());\nexport { logger };\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\nimport '../../_version.js';\nexport const messages = {\n 'invalid-value': ({ paramName, validValueDescription, value }) => {\n if (!paramName || !validValueDescription) {\n throw new Error(`Unexpected input to 'invalid-value' error.`);\n }\n return `The '${paramName}' parameter was given a value with an ` +\n `unexpected value. ${validValueDescription} Received a value of ` +\n `${JSON.stringify(value)}.`;\n },\n 'not-an-array': ({ moduleName, className, funcName, paramName }) => {\n if (!moduleName || !className || !funcName || !paramName) {\n throw new Error(`Unexpected input to 'not-an-array' error.`);\n }\n return `The parameter '${paramName}' passed into ` +\n `'${moduleName}.${className}.${funcName}()' must be an array.`;\n },\n 'incorrect-type': ({ expectedType, paramName, moduleName, className, funcName }) => {\n if (!expectedType || !paramName || !moduleName || !funcName) {\n throw new Error(`Unexpected input to 'incorrect-type' error.`);\n }\n return `The parameter '${paramName}' passed into ` +\n `'${moduleName}.${className ? (className + '.') : ''}` +\n `${funcName}()' must be of type ${expectedType}.`;\n },\n 'incorrect-class': ({ expectedClass, paramName, moduleName, className, funcName, isReturnValueProblem }) => {\n if (!expectedClass || !moduleName || !funcName) {\n throw new Error(`Unexpected input to 'incorrect-class' error.`);\n }\n if (isReturnValueProblem) {\n return `The return value from ` +\n `'${moduleName}.${className ? (className + '.') : ''}${funcName}()' ` +\n `must be an instance of class ${expectedClass.name}.`;\n }\n return `The parameter '${paramName}' passed into ` +\n `'${moduleName}.${className ? (className + '.') : ''}${funcName}()' ` +\n `must be an instance of class ${expectedClass.name}.`;\n },\n 'missing-a-method': ({ expectedMethod, paramName, moduleName, className, funcName }) => {\n if (!expectedMethod || !paramName || !moduleName || !className\n || !funcName) {\n throw new Error(`Unexpected input to 'missing-a-method' error.`);\n }\n return `${moduleName}.${className}.${funcName}() expected the ` +\n `'${paramName}' parameter to expose a '${expectedMethod}' method.`;\n },\n 'add-to-cache-list-unexpected-type': ({ entry }) => {\n return `An unexpected entry was passed to ` +\n `'workbox-precaching.PrecacheController.addToCacheList()' The entry ` +\n `'${JSON.stringify(entry)}' isn't supported. You must supply an array of ` +\n `strings with one or more characters, objects with a url property or ` +\n `Request objects.`;\n },\n 'add-to-cache-list-conflicting-entries': ({ firstEntry, secondEntry }) => {\n if (!firstEntry || !secondEntry) {\n throw new Error(`Unexpected input to ` +\n `'add-to-cache-list-duplicate-entries' error.`);\n }\n return `Two of the entries passed to ` +\n `'workbox-precaching.PrecacheController.addToCacheList()' had the URL ` +\n `${firstEntry._entryId} but different revision details. Workbox is ` +\n `unable to cache and version the asset correctly. Please remove one ` +\n `of the entries.`;\n },\n 'plugin-error-request-will-fetch': ({ thrownError }) => {\n if (!thrownError) {\n throw new Error(`Unexpected input to ` +\n `'plugin-error-request-will-fetch', error.`);\n }\n return `An error was thrown by a plugins 'requestWillFetch()' method. ` +\n `The thrown error message was: '${thrownError.message}'.`;\n },\n 'invalid-cache-name': ({ cacheNameId, value }) => {\n if (!cacheNameId) {\n throw new Error(`Expected a 'cacheNameId' for error 'invalid-cache-name'`);\n }\n return `You must provide a name containing at least one character for ` +\n `setCacheDetails({${cacheNameId}: '...'}). Received a value of ` +\n `'${JSON.stringify(value)}'`;\n },\n 'unregister-route-but-not-found-with-method': ({ method }) => {\n if (!method) {\n throw new Error(`Unexpected input to ` +\n `'unregister-route-but-not-found-with-method' error.`);\n }\n return `The route you're trying to unregister was not previously ` +\n `registered for the method type '${method}'.`;\n },\n 'unregister-route-route-not-registered': () => {\n return `The route you're trying to unregister was not previously ` +\n `registered.`;\n },\n 'queue-replay-failed': ({ name }) => {\n return `Replaying the background sync queue '${name}' failed.`;\n },\n 'duplicate-queue-name': ({ name }) => {\n return `The Queue name '${name}' is already being used. ` +\n `All instances of backgroundSync.Queue must be given unique names.`;\n },\n 'expired-test-without-max-age': ({ methodName, paramName }) => {\n return `The '${methodName}()' method can only be used when the ` +\n `'${paramName}' is used in the constructor.`;\n },\n 'unsupported-route-type': ({ moduleName, className, funcName, paramName }) => {\n return `The supplied '${paramName}' parameter was an unsupported type. ` +\n `Please check the docs for ${moduleName}.${className}.${funcName} for ` +\n `valid input types.`;\n },\n 'not-array-of-class': ({ value, expectedClass, moduleName, className, funcName, paramName }) => {\n return `The supplied '${paramName}' parameter must be an array of ` +\n `'${expectedClass}' objects. Received '${JSON.stringify(value)},'. ` +\n `Please check the call to ${moduleName}.${className}.${funcName}() ` +\n `to fix the issue.`;\n },\n 'max-entries-or-age-required': ({ moduleName, className, funcName }) => {\n return `You must define either config.maxEntries or config.maxAgeSeconds` +\n `in ${moduleName}.${className}.${funcName}`;\n },\n 'statuses-or-headers-required': ({ moduleName, className, funcName }) => {\n return `You must define either config.statuses or config.headers` +\n `in ${moduleName}.${className}.${funcName}`;\n },\n 'invalid-string': ({ moduleName, funcName, paramName }) => {\n if (!paramName || !moduleName || !funcName) {\n throw new Error(`Unexpected input to 'invalid-string' error.`);\n }\n return `When using strings, the '${paramName}' parameter must start with ` +\n `'http' (for cross-origin matches) or '/' (for same-origin matches). ` +\n `Please see the docs for ${moduleName}.${funcName}() for ` +\n `more info.`;\n },\n 'channel-name-required': () => {\n return `You must provide a channelName to construct a ` +\n `BroadcastCacheUpdate instance.`;\n },\n 'invalid-responses-are-same-args': () => {\n return `The arguments passed into responsesAreSame() appear to be ` +\n `invalid. Please ensure valid Responses are used.`;\n },\n 'expire-custom-caches-only': () => {\n return `You must provide a 'cacheName' property when using the ` +\n `expiration plugin with a runtime caching strategy.`;\n },\n 'unit-must-be-bytes': ({ normalizedRangeHeader }) => {\n if (!normalizedRangeHeader) {\n throw new Error(`Unexpected input to 'unit-must-be-bytes' error.`);\n }\n return `The 'unit' portion of the Range header must be set to 'bytes'. ` +\n `The Range header provided was \"${normalizedRangeHeader}\"`;\n },\n 'single-range-only': ({ normalizedRangeHeader }) => {\n if (!normalizedRangeHeader) {\n throw new Error(`Unexpected input to 'single-range-only' error.`);\n }\n return `Multiple ranges are not supported. Please use a single start ` +\n `value, and optional end value. The Range header provided was ` +\n `\"${normalizedRangeHeader}\"`;\n },\n 'invalid-range-values': ({ normalizedRangeHeader }) => {\n if (!normalizedRangeHeader) {\n throw new Error(`Unexpected input to 'invalid-range-values' error.`);\n }\n return `The Range header is missing both start and end values. At least ` +\n `one of those values is needed. The Range header provided was ` +\n `\"${normalizedRangeHeader}\"`;\n },\n 'no-range-header': () => {\n return `No Range header was found in the Request provided.`;\n },\n 'range-not-satisfiable': ({ size, start, end }) => {\n return `The start (${start}) and end (${end}) values in the Range are ` +\n `not satisfiable by the cached response, which is ${size} bytes.`;\n },\n 'attempt-to-cache-non-get-request': ({ url, method }) => {\n return `Unable to cache '${url}' because it is a '${method}' request and ` +\n `only 'GET' requests can be cached.`;\n },\n 'cache-put-with-no-response': ({ url }) => {\n return `There was an attempt to cache '${url}' but the response was not ` +\n `defined.`;\n },\n 'no-response': ({ url, error }) => {\n let message = `The strategy could not generate a response for '${url}'.`;\n if (error) {\n message += ` The underlying error is ${error}.`;\n }\n return message;\n },\n 'bad-precaching-response': ({ url, status }) => {\n return `The precaching request for '${url}' failed` +\n (status ? ` with an HTTP status of ${status}.` : `.`);\n },\n 'non-precached-url': ({ url }) => {\n return `createHandlerBoundToURL('${url}') was called, but that URL is ` +\n `not precached. Please pass in a URL that is precached instead.`;\n },\n 'add-to-cache-list-conflicting-integrities': ({ url }) => {\n return `Two of the entries passed to ` +\n `'workbox-precaching.PrecacheController.addToCacheList()' had the URL ` +\n `${url} with different integrity values. Please remove one of them.`;\n },\n 'missing-precache-entry': ({ cacheName, url }) => {\n return `Unable to find a precached response in ${cacheName} for ${url}.`;\n },\n 'cross-origin-copy-response': ({ origin }) => {\n return `workbox-core.copyResponse() can only be used with same-origin ` +\n `responses. It was passed a response with origin ${origin}.`;\n },\n};\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\nimport { messages } from './messages.js';\nimport '../../_version.js';\nconst fallback = (code, ...args) => {\n let msg = code;\n if (args.length > 0) {\n msg += ` :: ${JSON.stringify(args)}`;\n }\n return msg;\n};\nconst generatorFunction = (code, details = {}) => {\n const message = messages[code];\n if (!message) {\n throw new Error(`Unable to find message for code '${code}'.`);\n }\n return message(details);\n};\nexport const messageGenerator = (process.env.NODE_ENV === 'production') ?\n fallback : generatorFunction;\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\nimport { messageGenerator } from '../models/messages/messageGenerator.js';\nimport '../_version.js';\n/**\n * Workbox errors should be thrown with this class.\n * This allows use to ensure the type easily in tests,\n * helps developers identify errors from workbox\n * easily and allows use to optimise error\n * messages correctly.\n *\n * @private\n */\nclass WorkboxError extends Error {\n /**\n *\n * @param {string} errorCode The error code that\n * identifies this particular error.\n * @param {Object=} details Any relevant arguments\n * that will help developers identify issues should\n * be added as a key on the context object.\n */\n constructor(errorCode, details) {\n const message = messageGenerator(errorCode, details);\n super(message);\n this.name = errorCode;\n this.details = details;\n }\n}\nexport { WorkboxError };\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\nimport { WorkboxError } from '../_private/WorkboxError.js';\nimport '../_version.js';\n/*\n * This method throws if the supplied value is not an array.\n * The destructed values are required to produce a meaningful error for users.\n * The destructed and restructured object is so it's clear what is\n * needed.\n */\nconst isArray = (value, details) => {\n if (!Array.isArray(value)) {\n throw new WorkboxError('not-an-array', details);\n }\n};\nconst hasMethod = (object, expectedMethod, details) => {\n const type = typeof object[expectedMethod];\n if (type !== 'function') {\n details['expectedMethod'] = expectedMethod;\n throw new WorkboxError('missing-a-method', details);\n }\n};\nconst isType = (object, expectedType, details) => {\n if (typeof object !== expectedType) {\n details['expectedType'] = expectedType;\n throw new WorkboxError('incorrect-type', details);\n }\n};\nconst isInstance = (object, expectedClass, details) => {\n if (!(object instanceof expectedClass)) {\n details['expectedClass'] = expectedClass;\n throw new WorkboxError('incorrect-class', details);\n }\n};\nconst isOneOf = (value, validValues, details) => {\n if (!validValues.includes(value)) {\n details['validValueDescription'] =\n `Valid values are ${JSON.stringify(validValues)}.`;\n throw new WorkboxError('invalid-value', details);\n }\n};\nconst isArrayOfClass = (value, expectedClass, details) => {\n const error = new WorkboxError('not-array-of-class', details);\n if (!Array.isArray(value)) {\n throw error;\n }\n for (const item of value) {\n if (!(item instanceof expectedClass)) {\n throw error;\n }\n }\n};\nconst finalAssertExports = process.env.NODE_ENV === 'production' ? null : {\n hasMethod,\n isArray,\n isInstance,\n isOneOf,\n isType,\n isArrayOfClass,\n};\nexport { finalAssertExports as assert };\n","\"use strict\";\n// @ts-ignore\ntry {\n self['workbox:routing:6.1.5'] && _();\n}\ncatch (e) { }\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\nimport '../_version.js';\n/**\n * The default HTTP method, 'GET', used when there's no specific method\n * configured for a route.\n *\n * @type {string}\n *\n * @private\n */\nexport const defaultMethod = 'GET';\n/**\n * The list of valid HTTP methods associated with requests that could be routed.\n *\n * @type {Array}\n *\n * @private\n */\nexport const validMethods = [\n 'DELETE',\n 'GET',\n 'HEAD',\n 'PATCH',\n 'POST',\n 'PUT',\n];\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\nimport { assert } from 'workbox-core/_private/assert.js';\nimport '../_version.js';\n/**\n * @param {function()|Object} handler Either a function, or an object with a\n * 'handle' method.\n * @return {Object} An object with a handle method.\n *\n * @private\n */\nexport const normalizeHandler = (handler) => {\n if (handler && typeof handler === 'object') {\n if (process.env.NODE_ENV !== 'production') {\n assert.hasMethod(handler, 'handle', {\n moduleName: 'workbox-routing',\n className: 'Route',\n funcName: 'constructor',\n paramName: 'handler',\n });\n }\n return handler;\n }\n else {\n if (process.env.NODE_ENV !== 'production') {\n assert.isType(handler, 'function', {\n moduleName: 'workbox-routing',\n className: 'Route',\n funcName: 'constructor',\n paramName: 'handler',\n });\n }\n return { handle: handler };\n }\n};\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\nimport { assert } from 'workbox-core/_private/assert.js';\nimport { defaultMethod, validMethods } from './utils/constants.js';\nimport { normalizeHandler } from './utils/normalizeHandler.js';\nimport './_version.js';\n/**\n * A `Route` consists of a pair of callback functions, \"match\" and \"handler\".\n * The \"match\" callback determine if a route should be used to \"handle\" a\n * request by returning a non-falsy value if it can. The \"handler\" callback\n * is called when there is a match and should return a Promise that resolves\n * to a `Response`.\n *\n * @memberof module:workbox-routing\n */\nclass Route {\n /**\n * Constructor for Route class.\n *\n * @param {module:workbox-routing~matchCallback} match\n * A callback function that determines whether the route matches a given\n * `fetch` event by returning a non-falsy value.\n * @param {module:workbox-routing~handlerCallback} handler A callback\n * function that returns a Promise resolving to a Response.\n * @param {string} [method='GET'] The HTTP method to match the Route\n * against.\n */\n constructor(match, handler, method = defaultMethod) {\n if (process.env.NODE_ENV !== 'production') {\n assert.isType(match, 'function', {\n moduleName: 'workbox-routing',\n className: 'Route',\n funcName: 'constructor',\n paramName: 'match',\n });\n if (method) {\n assert.isOneOf(method, validMethods, { paramName: 'method' });\n }\n }\n // These values are referenced directly by Router so cannot be\n // altered by minificaton.\n this.handler = normalizeHandler(handler);\n this.match = match;\n this.method = method;\n }\n /**\n *\n * @param {module:workbox-routing-handlerCallback} handler A callback\n * function that returns a Promise resolving to a Response\n */\n setCatchHandler(handler) {\n this.catchHandler = normalizeHandler(handler);\n }\n}\nexport { Route };\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\nimport { assert } from 'workbox-core/_private/assert.js';\nimport { logger } from 'workbox-core/_private/logger.js';\nimport { Route } from './Route.js';\nimport './_version.js';\n/**\n * RegExpRoute makes it easy to create a regular expression based\n * [Route]{@link module:workbox-routing.Route}.\n *\n * For same-origin requests the RegExp only needs to match part of the URL. For\n * requests against third-party servers, you must define a RegExp that matches\n * the start of the URL.\n *\n * [See the module docs for info.]{@link https://developers.google.com/web/tools/workbox/modules/workbox-routing}\n *\n * @memberof module:workbox-routing\n * @extends module:workbox-routing.Route\n */\nclass RegExpRoute extends Route {\n /**\n * If the regular expression contains\n * [capture groups]{@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp#grouping-back-references},\n * the captured values will be passed to the\n * [handler's]{@link module:workbox-routing~handlerCallback} `params`\n * argument.\n *\n * @param {RegExp} regExp The regular expression to match against URLs.\n * @param {module:workbox-routing~handlerCallback} handler A callback\n * function that returns a Promise resulting in a Response.\n * @param {string} [method='GET'] The HTTP method to match the Route\n * against.\n */\n constructor(regExp, handler, method) {\n if (process.env.NODE_ENV !== 'production') {\n assert.isInstance(regExp, RegExp, {\n moduleName: 'workbox-routing',\n className: 'RegExpRoute',\n funcName: 'constructor',\n paramName: 'pattern',\n });\n }\n const match = ({ url }) => {\n const result = regExp.exec(url.href);\n // Return immediately if there's no match.\n if (!result) {\n return;\n }\n // Require that the match start at the first character in the URL string\n // if it's a cross-origin request.\n // See https://github.com/GoogleChrome/workbox/issues/281 for the context\n // behind this behavior.\n if ((url.origin !== location.origin) && (result.index !== 0)) {\n if (process.env.NODE_ENV !== 'production') {\n logger.debug(`The regular expression '${regExp}' only partially matched ` +\n `against the cross-origin URL '${url}'. RegExpRoute's will only ` +\n `handle cross-origin requests if they match the entire URL.`);\n }\n return;\n }\n // If the route matches, but there aren't any capture groups defined, then\n // this will return [], which is truthy and therefore sufficient to\n // indicate a match.\n // If there are capture groups, then it will return their values.\n return result.slice(1);\n };\n super(match, handler, method);\n }\n}\nexport { RegExpRoute };\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\nimport '../_version.js';\nconst getFriendlyURL = (url) => {\n const urlObj = new URL(String(url), location.href);\n // See https://github.com/GoogleChrome/workbox/issues/2323\n // We want to include everything, except for the origin if it's same-origin.\n return urlObj.href.replace(new RegExp(`^${location.origin}`), '');\n};\nexport { getFriendlyURL };\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\nimport { assert } from 'workbox-core/_private/assert.js';\nimport { getFriendlyURL } from 'workbox-core/_private/getFriendlyURL.js';\nimport { defaultMethod } from './utils/constants.js';\nimport { logger } from 'workbox-core/_private/logger.js';\nimport { normalizeHandler } from './utils/normalizeHandler.js';\nimport { WorkboxError } from 'workbox-core/_private/WorkboxError.js';\nimport './_version.js';\n/**\n * The Router can be used to process a FetchEvent through one or more\n * [Routes]{@link module:workbox-routing.Route} responding with a Request if\n * a matching route exists.\n *\n * If no route matches a given a request, the Router will use a \"default\"\n * handler if one is defined.\n *\n * Should the matching Route throw an error, the Router will use a \"catch\"\n * handler if one is defined to gracefully deal with issues and respond with a\n * Request.\n *\n * If a request matches multiple routes, the **earliest** registered route will\n * be used to respond to the request.\n *\n * @memberof module:workbox-routing\n */\nclass Router {\n /**\n * Initializes a new Router.\n */\n constructor() {\n this._routes = new Map();\n this._defaultHandlerMap = new Map();\n }\n /**\n * @return {Map>} routes A `Map` of HTTP\n * method name ('GET', etc.) to an array of all the corresponding `Route`\n * instances that are registered.\n */\n get routes() {\n return this._routes;\n }\n /**\n * Adds a fetch event listener to respond to events when a route matches\n * the event's request.\n */\n addFetchListener() {\n // See https://github.com/Microsoft/TypeScript/issues/28357#issuecomment-436484705\n self.addEventListener('fetch', ((event) => {\n const { request } = event;\n const responsePromise = this.handleRequest({ request, event });\n if (responsePromise) {\n event.respondWith(responsePromise);\n }\n }));\n }\n /**\n * Adds a message event listener for URLs to cache from the window.\n * This is useful to cache resources loaded on the page prior to when the\n * service worker started controlling it.\n *\n * The format of the message data sent from the window should be as follows.\n * Where the `urlsToCache` array may consist of URL strings or an array of\n * URL string + `requestInit` object (the same as you'd pass to `fetch()`).\n *\n * ```\n * {\n * type: 'CACHE_URLS',\n * payload: {\n * urlsToCache: [\n * './script1.js',\n * './script2.js',\n * ['./script3.js', {mode: 'no-cors'}],\n * ],\n * },\n * }\n * ```\n */\n addCacheListener() {\n // See https://github.com/Microsoft/TypeScript/issues/28357#issuecomment-436484705\n self.addEventListener('message', ((event) => {\n if (event.data && event.data.type === 'CACHE_URLS') {\n const { payload } = event.data;\n if (process.env.NODE_ENV !== 'production') {\n logger.debug(`Caching URLs from the window`, payload.urlsToCache);\n }\n const requestPromises = Promise.all(payload.urlsToCache.map((entry) => {\n if (typeof entry === 'string') {\n entry = [entry];\n }\n const request = new Request(...entry);\n return this.handleRequest({ request, event });\n // TODO(philipwalton): TypeScript errors without this typecast for\n // some reason (probably a bug). The real type here should work but\n // doesn't: `Array | undefined>`.\n })); // TypeScript\n event.waitUntil(requestPromises);\n // If a MessageChannel was used, reply to the message on success.\n if (event.ports && event.ports[0]) {\n requestPromises.then(() => event.ports[0].postMessage(true));\n }\n }\n }));\n }\n /**\n * Apply the routing rules to a FetchEvent object to get a Response from an\n * appropriate Route's handler.\n *\n * @param {Object} options\n * @param {Request} options.request The request to handle.\n * @param {ExtendableEvent} options.event The event that triggered the\n * request.\n * @return {Promise|undefined} A promise is returned if a\n * registered route can handle the request. If there is no matching\n * route and there's no `defaultHandler`, `undefined` is returned.\n */\n handleRequest({ request, event }) {\n if (process.env.NODE_ENV !== 'production') {\n assert.isInstance(request, Request, {\n moduleName: 'workbox-routing',\n className: 'Router',\n funcName: 'handleRequest',\n paramName: 'options.request',\n });\n }\n const url = new URL(request.url, location.href);\n if (!url.protocol.startsWith('http')) {\n if (process.env.NODE_ENV !== 'production') {\n logger.debug(`Workbox Router only supports URLs that start with 'http'.`);\n }\n return;\n }\n const sameOrigin = url.origin === location.origin;\n const { params, route } = this.findMatchingRoute({\n event,\n request,\n sameOrigin,\n url,\n });\n let handler = route && route.handler;\n const debugMessages = [];\n if (process.env.NODE_ENV !== 'production') {\n if (handler) {\n debugMessages.push([\n `Found a route to handle this request:`, route,\n ]);\n if (params) {\n debugMessages.push([\n `Passing the following params to the route's handler:`, params,\n ]);\n }\n }\n }\n // If we don't have a handler because there was no matching route, then\n // fall back to defaultHandler if that's defined.\n const method = request.method;\n if (!handler && this._defaultHandlerMap.has(method)) {\n if (process.env.NODE_ENV !== 'production') {\n debugMessages.push(`Failed to find a matching route. Falling ` +\n `back to the default handler for ${method}.`);\n }\n handler = this._defaultHandlerMap.get(method);\n }\n if (!handler) {\n if (process.env.NODE_ENV !== 'production') {\n // No handler so Workbox will do nothing. If logs is set of debug\n // i.e. verbose, we should print out this information.\n logger.debug(`No route found for: ${getFriendlyURL(url)}`);\n }\n return;\n }\n if (process.env.NODE_ENV !== 'production') {\n // We have a handler, meaning Workbox is going to handle the route.\n // print the routing details to the console.\n logger.groupCollapsed(`Router is responding to: ${getFriendlyURL(url)}`);\n debugMessages.forEach((msg) => {\n if (Array.isArray(msg)) {\n logger.log(...msg);\n }\n else {\n logger.log(msg);\n }\n });\n logger.groupEnd();\n }\n // Wrap in try and catch in case the handle method throws a synchronous\n // error. It should still callback to the catch handler.\n let responsePromise;\n try {\n responsePromise = handler.handle({ url, request, event, params });\n }\n catch (err) {\n responsePromise = Promise.reject(err);\n }\n // Get route's catch handler, if it exists\n const catchHandler = route && route.catchHandler;\n if (responsePromise instanceof Promise && (this._catchHandler || catchHandler)) {\n responsePromise = responsePromise.catch(async (err) => {\n // If there's a route catch handler, process that first\n if (catchHandler) {\n if (process.env.NODE_ENV !== 'production') {\n // Still include URL here as it will be async from the console group\n // and may not make sense without the URL\n logger.groupCollapsed(`Error thrown when responding to: ` +\n ` ${getFriendlyURL(url)}. Falling back to route's Catch Handler.`);\n logger.error(`Error thrown by:`, route);\n logger.error(err);\n logger.groupEnd();\n }\n try {\n return await catchHandler.handle({ url, request, event, params });\n }\n catch (catchErr) {\n err = catchErr;\n }\n }\n if (this._catchHandler) {\n if (process.env.NODE_ENV !== 'production') {\n // Still include URL here as it will be async from the console group\n // and may not make sense without the URL\n logger.groupCollapsed(`Error thrown when responding to: ` +\n ` ${getFriendlyURL(url)}. Falling back to global Catch Handler.`);\n logger.error(`Error thrown by:`, route);\n logger.error(err);\n logger.groupEnd();\n }\n return this._catchHandler.handle({ url, request, event });\n }\n throw err;\n });\n }\n return responsePromise;\n }\n /**\n * Checks a request and URL (and optionally an event) against the list of\n * registered routes, and if there's a match, returns the corresponding\n * route along with any params generated by the match.\n *\n * @param {Object} options\n * @param {URL} options.url\n * @param {boolean} options.sameOrigin The result of comparing `url.origin`\n * against the current origin.\n * @param {Request} options.request The request to match.\n * @param {Event} options.event The corresponding event.\n * @return {Object} An object with `route` and `params` properties.\n * They are populated if a matching route was found or `undefined`\n * otherwise.\n */\n findMatchingRoute({ url, sameOrigin, request, event }) {\n const routes = this._routes.get(request.method) || [];\n for (const route of routes) {\n let params;\n const matchResult = route.match({ url, sameOrigin, request, event });\n if (matchResult) {\n if (process.env.NODE_ENV !== 'production') {\n // Warn developers that using an async matchCallback is almost always\n // not the right thing to do. \n if (matchResult instanceof Promise) {\n logger.warn(`While routing ${getFriendlyURL(url)}, an async ` +\n `matchCallback function was used. Please convert the ` +\n `following route to use a synchronous matchCallback function:`, route);\n }\n }\n // See https://github.com/GoogleChrome/workbox/issues/2079\n params = matchResult;\n if (Array.isArray(matchResult) && matchResult.length === 0) {\n // Instead of passing an empty array in as params, use undefined.\n params = undefined;\n }\n else if ((matchResult.constructor === Object &&\n Object.keys(matchResult).length === 0)) {\n // Instead of passing an empty object in as params, use undefined.\n params = undefined;\n }\n else if (typeof matchResult === 'boolean') {\n // For the boolean value true (rather than just something truth-y),\n // don't set params.\n // See https://github.com/GoogleChrome/workbox/pull/2134#issuecomment-513924353\n params = undefined;\n }\n // Return early if have a match.\n return { route, params };\n }\n }\n // If no match was found above, return and empty object.\n return {};\n }\n /**\n * Define a default `handler` that's called when no routes explicitly\n * match the incoming request.\n *\n * Each HTTP method ('GET', 'POST', etc.) gets its own default handler.\n *\n * Without a default handler, unmatched requests will go against the\n * network as if there were no service worker present.\n *\n * @param {module:workbox-routing~handlerCallback} handler A callback\n * function that returns a Promise resulting in a Response.\n * @param {string} [method='GET'] The HTTP method to associate with this\n * default handler. Each method has its own default.\n */\n setDefaultHandler(handler, method = defaultMethod) {\n this._defaultHandlerMap.set(method, normalizeHandler(handler));\n }\n /**\n * If a Route throws an error while handling a request, this `handler`\n * will be called and given a chance to provide a response.\n *\n * @param {module:workbox-routing~handlerCallback} handler A callback\n * function that returns a Promise resulting in a Response.\n */\n setCatchHandler(handler) {\n this._catchHandler = normalizeHandler(handler);\n }\n /**\n * Registers a route with the router.\n *\n * @param {module:workbox-routing.Route} route The route to register.\n */\n registerRoute(route) {\n if (process.env.NODE_ENV !== 'production') {\n assert.isType(route, 'object', {\n moduleName: 'workbox-routing',\n className: 'Router',\n funcName: 'registerRoute',\n paramName: 'route',\n });\n assert.hasMethod(route, 'match', {\n moduleName: 'workbox-routing',\n className: 'Router',\n funcName: 'registerRoute',\n paramName: 'route',\n });\n assert.isType(route.handler, 'object', {\n moduleName: 'workbox-routing',\n className: 'Router',\n funcName: 'registerRoute',\n paramName: 'route',\n });\n assert.hasMethod(route.handler, 'handle', {\n moduleName: 'workbox-routing',\n className: 'Router',\n funcName: 'registerRoute',\n paramName: 'route.handler',\n });\n assert.isType(route.method, 'string', {\n moduleName: 'workbox-routing',\n className: 'Router',\n funcName: 'registerRoute',\n paramName: 'route.method',\n });\n }\n if (!this._routes.has(route.method)) {\n this._routes.set(route.method, []);\n }\n // Give precedence to all of the earlier routes by adding this additional\n // route to the end of the array.\n this._routes.get(route.method).push(route);\n }\n /**\n * Unregisters a route with the router.\n *\n * @param {module:workbox-routing.Route} route The route to unregister.\n */\n unregisterRoute(route) {\n if (!this._routes.has(route.method)) {\n throw new WorkboxError('unregister-route-but-not-found-with-method', {\n method: route.method,\n });\n }\n const routeIndex = this._routes.get(route.method).indexOf(route);\n if (routeIndex > -1) {\n this._routes.get(route.method).splice(routeIndex, 1);\n }\n else {\n throw new WorkboxError('unregister-route-route-not-registered');\n }\n }\n}\nexport { Router };\n","/*\n Copyright 2019 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\nimport { Router } from '../Router.js';\nimport '../_version.js';\nlet defaultRouter;\n/**\n * Creates a new, singleton Router instance if one does not exist. If one\n * does already exist, that instance is returned.\n *\n * @private\n * @return {Router}\n */\nexport const getOrCreateDefaultRouter = () => {\n if (!defaultRouter) {\n defaultRouter = new Router();\n // The helpers that use the default Router assume these listeners exist.\n defaultRouter.addFetchListener();\n defaultRouter.addCacheListener();\n }\n return defaultRouter;\n};\n","/*\n Copyright 2019 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\nimport { logger } from 'workbox-core/_private/logger.js';\nimport { WorkboxError } from 'workbox-core/_private/WorkboxError.js';\nimport { Route } from './Route.js';\nimport { RegExpRoute } from './RegExpRoute.js';\nimport { getOrCreateDefaultRouter } from './utils/getOrCreateDefaultRouter.js';\nimport './_version.js';\n/**\n * Easily register a RegExp, string, or function with a caching\n * strategy to a singleton Router instance.\n *\n * This method will generate a Route for you if needed and\n * call [registerRoute()]{@link module:workbox-routing.Router#registerRoute}.\n *\n * @param {RegExp|string|module:workbox-routing.Route~matchCallback|module:workbox-routing.Route} capture\n * If the capture param is a `Route`, all other arguments will be ignored.\n * @param {module:workbox-routing~handlerCallback} [handler] A callback\n * function that returns a Promise resulting in a Response. This parameter\n * is required if `capture` is not a `Route` object.\n * @param {string} [method='GET'] The HTTP method to match the Route\n * against.\n * @return {module:workbox-routing.Route} The generated `Route`(Useful for\n * unregistering).\n *\n * @memberof module:workbox-routing\n */\nfunction registerRoute(capture, handler, method) {\n let route;\n if (typeof capture === 'string') {\n const captureUrl = new URL(capture, location.href);\n if (process.env.NODE_ENV !== 'production') {\n if (!(capture.startsWith('/') || capture.startsWith('http'))) {\n throw new WorkboxError('invalid-string', {\n moduleName: 'workbox-routing',\n funcName: 'registerRoute',\n paramName: 'capture',\n });\n }\n // We want to check if Express-style wildcards are in the pathname only.\n // TODO: Remove this log message in v4.\n const valueToCheck = capture.startsWith('http') ?\n captureUrl.pathname : capture;\n // See https://github.com/pillarjs/path-to-regexp#parameters\n const wildcards = '[*:?+]';\n if ((new RegExp(`${wildcards}`)).exec(valueToCheck)) {\n logger.debug(`The '$capture' parameter contains an Express-style wildcard ` +\n `character (${wildcards}). Strings are now always interpreted as ` +\n `exact matches; use a RegExp for partial or wildcard matches.`);\n }\n }\n const matchCallback = ({ url }) => {\n if (process.env.NODE_ENV !== 'production') {\n if ((url.pathname === captureUrl.pathname) &&\n (url.origin !== captureUrl.origin)) {\n logger.debug(`${capture} only partially matches the cross-origin URL ` +\n `${url}. This route will only handle cross-origin requests ` +\n `if they match the entire URL.`);\n }\n }\n return url.href === captureUrl.href;\n };\n // If `capture` is a string then `handler` and `method` must be present.\n route = new Route(matchCallback, handler, method);\n }\n else if (capture instanceof RegExp) {\n // If `capture` is a `RegExp` then `handler` and `method` must be present.\n route = new RegExpRoute(capture, handler, method);\n }\n else if (typeof capture === 'function') {\n // If `capture` is a function then `handler` and `method` must be present.\n route = new Route(capture, handler, method);\n }\n else if (capture instanceof Route) {\n route = capture;\n }\n else {\n throw new WorkboxError('unsupported-route-type', {\n moduleName: 'workbox-routing',\n funcName: 'registerRoute',\n paramName: 'capture',\n });\n }\n const defaultRouter = getOrCreateDefaultRouter();\n defaultRouter.registerRoute(route);\n return route;\n}\nexport { registerRoute };\n","\"use strict\";\n// @ts-ignore\ntry {\n self['workbox:strategies:6.1.5'] && _();\n}\ncatch (e) { }\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\nimport '../_version.js';\nexport const cacheOkAndOpaquePlugin = {\n /**\n * Returns a valid response (to allow caching) if the status is 200 (OK) or\n * 0 (opaque).\n *\n * @param {Object} options\n * @param {Response} options.response\n * @return {Response|null}\n *\n * @private\n */\n cacheWillUpdate: async ({ response }) => {\n if (response.status === 200 || response.status === 0) {\n return response;\n }\n return null;\n },\n};\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\nimport '../_version.js';\nconst _cacheNameDetails = {\n googleAnalytics: 'googleAnalytics',\n precache: 'precache-v2',\n prefix: 'workbox',\n runtime: 'runtime',\n suffix: typeof registration !== 'undefined' ? registration.scope : '',\n};\nconst _createCacheName = (cacheName) => {\n return [_cacheNameDetails.prefix, cacheName, _cacheNameDetails.suffix]\n .filter((value) => value && value.length > 0)\n .join('-');\n};\nconst eachCacheNameDetail = (fn) => {\n for (const key of Object.keys(_cacheNameDetails)) {\n fn(key);\n }\n};\nexport const cacheNames = {\n updateDetails: (details) => {\n eachCacheNameDetail((key) => {\n if (typeof details[key] === 'string') {\n _cacheNameDetails[key] = details[key];\n }\n });\n },\n getGoogleAnalyticsName: (userCacheName) => {\n return userCacheName || _createCacheName(_cacheNameDetails.googleAnalytics);\n },\n getPrecacheName: (userCacheName) => {\n return userCacheName || _createCacheName(_cacheNameDetails.precache);\n },\n getPrefix: () => {\n return _cacheNameDetails.prefix;\n },\n getRuntimeName: (userCacheName) => {\n return userCacheName || _createCacheName(_cacheNameDetails.runtime);\n },\n getSuffix: () => {\n return _cacheNameDetails.suffix;\n },\n};\n","/*\n Copyright 2020 Google LLC\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\nimport '../_version.js';\nfunction stripParams(fullURL, ignoreParams) {\n const strippedURL = new URL(fullURL);\n for (const param of ignoreParams) {\n strippedURL.searchParams.delete(param);\n }\n return strippedURL.href;\n}\n/**\n * Matches an item in the cache, ignoring specific URL params. This is similar\n * to the `ignoreSearch` option, but it allows you to ignore just specific\n * params (while continuing to match on the others).\n *\n * @private\n * @param {Cache} cache\n * @param {Request} request\n * @param {Object} matchOptions\n * @param {Array} ignoreParams\n * @return {Promise}\n */\nasync function cacheMatchIgnoreParams(cache, request, ignoreParams, matchOptions) {\n const strippedRequestURL = stripParams(request.url, ignoreParams);\n // If the request doesn't include any ignored params, match as normal.\n if (request.url === strippedRequestURL) {\n return cache.match(request, matchOptions);\n }\n // Otherwise, match by comparing keys\n const keysOptions = { ...matchOptions, ignoreSearch: true };\n const cacheKeys = await cache.keys(request, keysOptions);\n for (const cacheKey of cacheKeys) {\n const strippedCacheKeyURL = stripParams(cacheKey.url, ignoreParams);\n if (strippedRequestURL === strippedCacheKeyURL) {\n return cache.match(cacheKey, matchOptions);\n }\n }\n return;\n}\nexport { cacheMatchIgnoreParams };\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\nimport '../_version.js';\n/**\n * The Deferred class composes Promises in a way that allows for them to be\n * resolved or rejected from outside the constructor. In most cases promises\n * should be used directly, but Deferreds can be necessary when the logic to\n * resolve a promise must be separate.\n *\n * @private\n */\nclass Deferred {\n /**\n * Creates a promise and exposes its resolve and reject functions as methods.\n */\n constructor() {\n this.promise = new Promise((resolve, reject) => {\n this.resolve = resolve;\n this.reject = reject;\n });\n }\n}\nexport { Deferred };\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\nimport '../_version.js';\n// Callbacks to be executed whenever there's a quota error.\nconst quotaErrorCallbacks = new Set();\nexport { quotaErrorCallbacks };\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\nimport { logger } from '../_private/logger.js';\nimport { quotaErrorCallbacks } from '../models/quotaErrorCallbacks.js';\nimport '../_version.js';\n/**\n * Runs all of the callback functions, one at a time sequentially, in the order\n * in which they were registered.\n *\n * @memberof module:workbox-core\n * @private\n */\nasync function executeQuotaErrorCallbacks() {\n if (process.env.NODE_ENV !== 'production') {\n logger.log(`About to run ${quotaErrorCallbacks.size} ` +\n `callbacks to clean up caches.`);\n }\n for (const callback of quotaErrorCallbacks) {\n await callback();\n if (process.env.NODE_ENV !== 'production') {\n logger.log(callback, 'is complete.');\n }\n }\n if (process.env.NODE_ENV !== 'production') {\n logger.log('Finished running callbacks.');\n }\n}\nexport { executeQuotaErrorCallbacks };\n","/*\n Copyright 2019 Google LLC\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\nimport '../_version.js';\n/**\n * Returns a promise that resolves and the passed number of milliseconds.\n * This utility is an async/await-friendly version of `setTimeout`.\n *\n * @param {number} ms\n * @return {Promise}\n * @private\n */\nexport function timeout(ms) {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n","/*\n Copyright 2020 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\nimport { assert } from 'workbox-core/_private/assert.js';\nimport { cacheMatchIgnoreParams } from 'workbox-core/_private/cacheMatchIgnoreParams.js';\nimport { Deferred } from 'workbox-core/_private/Deferred.js';\nimport { executeQuotaErrorCallbacks } from 'workbox-core/_private/executeQuotaErrorCallbacks.js';\nimport { getFriendlyURL } from 'workbox-core/_private/getFriendlyURL.js';\nimport { logger } from 'workbox-core/_private/logger.js';\nimport { timeout } from 'workbox-core/_private/timeout.js';\nimport { WorkboxError } from 'workbox-core/_private/WorkboxError.js';\nimport './_version.js';\nfunction toRequest(input) {\n return (typeof input === 'string') ? new Request(input) : input;\n}\n/**\n * A class created every time a Strategy instance instance calls\n * [handle()]{@link module:workbox-strategies.Strategy~handle} or\n * [handleAll()]{@link module:workbox-strategies.Strategy~handleAll} that wraps all fetch and\n * cache actions around plugin callbacks and keeps track of when the strategy\n * is \"done\" (i.e. all added `event.waitUntil()` promises have resolved).\n *\n * @memberof module:workbox-strategies\n */\nclass StrategyHandler {\n /**\n * Creates a new instance associated with the passed strategy and event\n * that's handling the request.\n *\n * The constructor also initializes the state that will be passed to each of\n * the plugins handling this request.\n *\n * @param {module:workbox-strategies.Strategy} strategy\n * @param {Object} options\n * @param {Request|string} options.request A request to run this strategy for.\n * @param {ExtendableEvent} options.event The event associated with the\n * request.\n * @param {URL} [options.url]\n * @param {*} [options.params]\n * [match callback]{@link module:workbox-routing~matchCallback},\n * (if applicable).\n */\n constructor(strategy, options) {\n this._cacheKeys = {};\n /**\n * The request the strategy is performing (passed to the strategy's\n * `handle()` or `handleAll()` method).\n * @name request\n * @instance\n * @type {Request}\n * @memberof module:workbox-strategies.StrategyHandler\n */\n /**\n * The event associated with this request.\n * @name event\n * @instance\n * @type {ExtendableEvent}\n * @memberof module:workbox-strategies.StrategyHandler\n */\n /**\n * A `URL` instance of `request.url` (if passed to the strategy's\n * `handle()` or `handleAll()` method).\n * Note: the `url` param will be present if the strategy was invoked\n * from a workbox `Route` object.\n * @name url\n * @instance\n * @type {URL|undefined}\n * @memberof module:workbox-strategies.StrategyHandler\n */\n /**\n * A `param` value (if passed to the strategy's\n * `handle()` or `handleAll()` method).\n * Note: the `param` param will be present if the strategy was invoked\n * from a workbox `Route` object and the\n * [match callback]{@link module:workbox-routing~matchCallback} returned\n * a truthy value (it will be that value).\n * @name params\n * @instance\n * @type {*|undefined}\n * @memberof module:workbox-strategies.StrategyHandler\n */\n if (process.env.NODE_ENV !== 'production') {\n assert.isInstance(options.event, ExtendableEvent, {\n moduleName: 'workbox-strategies',\n className: 'StrategyHandler',\n funcName: 'constructor',\n paramName: 'options.event',\n });\n }\n Object.assign(this, options);\n this.event = options.event;\n this._strategy = strategy;\n this._handlerDeferred = new Deferred();\n this._extendLifetimePromises = [];\n // Copy the plugins list (since it's mutable on the strategy),\n // so any mutations don't affect this handler instance.\n this._plugins = [...strategy.plugins];\n this._pluginStateMap = new Map();\n for (const plugin of this._plugins) {\n this._pluginStateMap.set(plugin, {});\n }\n this.event.waitUntil(this._handlerDeferred.promise);\n }\n /**\n * Fetches a given request (and invokes any applicable plugin callback\n * methods) using the `fetchOptions` (for non-navigation requests) and\n * `plugins` defined on the `Strategy` object.\n *\n * The following plugin lifecycle methods are invoked when using this method:\n * - `requestWillFetch()`\n * - `fetchDidSucceed()`\n * - `fetchDidFail()`\n *\n * @param {Request|string} input The URL or request to fetch.\n * @return {Promise}\n */\n async fetch(input) {\n const { event } = this;\n let request = toRequest(input);\n if (request.mode === 'navigate' &&\n event instanceof FetchEvent &&\n event.preloadResponse) {\n const possiblePreloadResponse = await event.preloadResponse;\n if (possiblePreloadResponse) {\n if (process.env.NODE_ENV !== 'production') {\n logger.log(`Using a preloaded navigation response for ` +\n `'${getFriendlyURL(request.url)}'`);\n }\n return possiblePreloadResponse;\n }\n }\n // If there is a fetchDidFail plugin, we need to save a clone of the\n // original request before it's either modified by a requestWillFetch\n // plugin or before the original request's body is consumed via fetch().\n const originalRequest = this.hasCallback('fetchDidFail') ?\n request.clone() : null;\n try {\n for (const cb of this.iterateCallbacks('requestWillFetch')) {\n request = await cb({ request: request.clone(), event });\n }\n }\n catch (err) {\n throw new WorkboxError('plugin-error-request-will-fetch', {\n thrownError: err,\n });\n }\n // The request can be altered by plugins with `requestWillFetch` making\n // the original request (most likely from a `fetch` event) different\n // from the Request we make. Pass both to `fetchDidFail` to aid debugging.\n const pluginFilteredRequest = request.clone();\n try {\n let fetchResponse;\n // See https://github.com/GoogleChrome/workbox/issues/1796\n fetchResponse = await fetch(request, request.mode === 'navigate' ?\n undefined : this._strategy.fetchOptions);\n if (process.env.NODE_ENV !== 'production') {\n logger.debug(`Network request for ` +\n `'${getFriendlyURL(request.url)}' returned a response with ` +\n `status '${fetchResponse.status}'.`);\n }\n for (const callback of this.iterateCallbacks('fetchDidSucceed')) {\n fetchResponse = await callback({\n event,\n request: pluginFilteredRequest,\n response: fetchResponse,\n });\n }\n return fetchResponse;\n }\n catch (error) {\n if (process.env.NODE_ENV !== 'production') {\n logger.log(`Network request for ` +\n `'${getFriendlyURL(request.url)}' threw an error.`, error);\n }\n // `originalRequest` will only exist if a `fetchDidFail` callback\n // is being used (see above).\n if (originalRequest) {\n await this.runCallbacks('fetchDidFail', {\n error,\n event,\n originalRequest: originalRequest.clone(),\n request: pluginFilteredRequest.clone(),\n });\n }\n throw error;\n }\n }\n /**\n * Calls `this.fetch()` and (in the background) runs `this.cachePut()` on\n * the response generated by `this.fetch()`.\n *\n * The call to `this.cachePut()` automatically invokes `this.waitUntil()`,\n * so you do not have to manually call `waitUntil()` on the event.\n *\n * @param {Request|string} input The request or URL to fetch and cache.\n * @return {Promise}\n */\n async fetchAndCachePut(input) {\n const response = await this.fetch(input);\n const responseClone = response.clone();\n this.waitUntil(this.cachePut(input, responseClone));\n return response;\n }\n /**\n * Matches a request from the cache (and invokes any applicable plugin\n * callback methods) using the `cacheName`, `matchOptions`, and `plugins`\n * defined on the strategy object.\n *\n * The following plugin lifecycle methods are invoked when using this method:\n * - cacheKeyWillByUsed()\n * - cachedResponseWillByUsed()\n *\n * @param {Request|string} key The Request or URL to use as the cache key.\n * @return {Promise} A matching response, if found.\n */\n async cacheMatch(key) {\n const request = toRequest(key);\n let cachedResponse;\n const { cacheName, matchOptions } = this._strategy;\n const effectiveRequest = await this.getCacheKey(request, 'read');\n const multiMatchOptions = { ...matchOptions, ...{ cacheName } };\n cachedResponse = await caches.match(effectiveRequest, multiMatchOptions);\n if (process.env.NODE_ENV !== 'production') {\n if (cachedResponse) {\n logger.debug(`Found a cached response in '${cacheName}'.`);\n }\n else {\n logger.debug(`No cached response found in '${cacheName}'.`);\n }\n }\n for (const callback of this.iterateCallbacks('cachedResponseWillBeUsed')) {\n cachedResponse = (await callback({\n cacheName,\n matchOptions,\n cachedResponse,\n request: effectiveRequest,\n event: this.event,\n })) || undefined;\n }\n return cachedResponse;\n }\n /**\n * Puts a request/response pair in the cache (and invokes any applicable\n * plugin callback methods) using the `cacheName` and `plugins` defined on\n * the strategy object.\n *\n * The following plugin lifecycle methods are invoked when using this method:\n * - cacheKeyWillByUsed()\n * - cacheWillUpdate()\n * - cacheDidUpdate()\n *\n * @param {Request|string} key The request or URL to use as the cache key.\n * @param {Response} response The response to cache.\n * @return {Promise} `false` if a cacheWillUpdate caused the response\n * not be cached, and `true` otherwise.\n */\n async cachePut(key, response) {\n const request = toRequest(key);\n // Run in the next task to avoid blocking other cache reads.\n // https://github.com/w3c/ServiceWorker/issues/1397\n await timeout(0);\n const effectiveRequest = await this.getCacheKey(request, 'write');\n if (process.env.NODE_ENV !== 'production') {\n if (effectiveRequest.method && effectiveRequest.method !== 'GET') {\n throw new WorkboxError('attempt-to-cache-non-get-request', {\n url: getFriendlyURL(effectiveRequest.url),\n method: effectiveRequest.method,\n });\n }\n }\n if (!response) {\n if (process.env.NODE_ENV !== 'production') {\n logger.error(`Cannot cache non-existent response for ` +\n `'${getFriendlyURL(effectiveRequest.url)}'.`);\n }\n throw new WorkboxError('cache-put-with-no-response', {\n url: getFriendlyURL(effectiveRequest.url),\n });\n }\n const responseToCache = await this._ensureResponseSafeToCache(response);\n if (!responseToCache) {\n if (process.env.NODE_ENV !== 'production') {\n logger.debug(`Response '${getFriendlyURL(effectiveRequest.url)}' ` +\n `will not be cached.`, responseToCache);\n }\n return false;\n }\n const { cacheName, matchOptions } = this._strategy;\n const cache = await self.caches.open(cacheName);\n const hasCacheUpdateCallback = this.hasCallback('cacheDidUpdate');\n const oldResponse = hasCacheUpdateCallback ? await cacheMatchIgnoreParams(\n // TODO(philipwalton): the `__WB_REVISION__` param is a precaching\n // feature. Consider into ways to only add this behavior if using\n // precaching.\n cache, effectiveRequest.clone(), ['__WB_REVISION__'], matchOptions) :\n null;\n if (process.env.NODE_ENV !== 'production') {\n logger.debug(`Updating the '${cacheName}' cache with a new Response ` +\n `for ${getFriendlyURL(effectiveRequest.url)}.`);\n }\n try {\n await cache.put(effectiveRequest, hasCacheUpdateCallback ?\n responseToCache.clone() : responseToCache);\n }\n catch (error) {\n // See https://developer.mozilla.org/en-US/docs/Web/API/DOMException#exception-QuotaExceededError\n if (error.name === 'QuotaExceededError') {\n await executeQuotaErrorCallbacks();\n }\n throw error;\n }\n for (const callback of this.iterateCallbacks('cacheDidUpdate')) {\n await callback({\n cacheName,\n oldResponse,\n newResponse: responseToCache.clone(),\n request: effectiveRequest,\n event: this.event,\n });\n }\n return true;\n }\n /**\n * Checks the list of plugins for the `cacheKeyWillBeUsed` callback, and\n * executes any of those callbacks found in sequence. The final `Request`\n * object returned by the last plugin is treated as the cache key for cache\n * reads and/or writes. If no `cacheKeyWillBeUsed` plugin callbacks have\n * been registered, the passed request is returned unmodified\n *\n * @param {Request} request\n * @param {string} mode\n * @return {Promise}\n */\n async getCacheKey(request, mode) {\n if (!this._cacheKeys[mode]) {\n let effectiveRequest = request;\n for (const callback of this.iterateCallbacks('cacheKeyWillBeUsed')) {\n effectiveRequest = toRequest(await callback({\n mode,\n request: effectiveRequest,\n event: this.event,\n params: this.params,\n }));\n }\n this._cacheKeys[mode] = effectiveRequest;\n }\n return this._cacheKeys[mode];\n }\n /**\n * Returns true if the strategy has at least one plugin with the given\n * callback.\n *\n * @param {string} name The name of the callback to check for.\n * @return {boolean}\n */\n hasCallback(name) {\n for (const plugin of this._strategy.plugins) {\n if (name in plugin) {\n return true;\n }\n }\n return false;\n }\n /**\n * Runs all plugin callbacks matching the given name, in order, passing the\n * given param object (merged ith the current plugin state) as the only\n * argument.\n *\n * Note: since this method runs all plugins, it's not suitable for cases\n * where the return value of a callback needs to be applied prior to calling\n * the next callback. See\n * [`iterateCallbacks()`]{@link module:workbox-strategies.StrategyHandler#iterateCallbacks}\n * below for how to handle that case.\n *\n * @param {string} name The name of the callback to run within each plugin.\n * @param {Object} param The object to pass as the first (and only) param\n * when executing each callback. This object will be merged with the\n * current plugin state prior to callback execution.\n */\n async runCallbacks(name, param) {\n for (const callback of this.iterateCallbacks(name)) {\n // TODO(philipwalton): not sure why `any` is needed. It seems like\n // this should work with `as WorkboxPluginCallbackParam[C]`.\n await callback(param);\n }\n }\n /**\n * Accepts a callback and returns an iterable of matching plugin callbacks,\n * where each callback is wrapped with the current handler state (i.e. when\n * you call each callback, whatever object parameter you pass it will\n * be merged with the plugin's current state).\n *\n * @param {string} name The name fo the callback to run\n * @return {Array}\n */\n *iterateCallbacks(name) {\n for (const plugin of this._strategy.plugins) {\n if (typeof plugin[name] === 'function') {\n const state = this._pluginStateMap.get(plugin);\n const statefulCallback = (param) => {\n const statefulParam = { ...param, state };\n // TODO(philipwalton): not sure why `any` is needed. It seems like\n // this should work with `as WorkboxPluginCallbackParam[C]`.\n return plugin[name](statefulParam);\n };\n yield statefulCallback;\n }\n }\n }\n /**\n * Adds a promise to the\n * [extend lifetime promises]{@link https://w3c.github.io/ServiceWorker/#extendableevent-extend-lifetime-promises}\n * of the event event associated with the request being handled (usually a\n * `FetchEvent`).\n *\n * Note: you can await\n * [`doneWaiting()`]{@link module:workbox-strategies.StrategyHandler~doneWaiting}\n * to know when all added promises have settled.\n *\n * @param {Promise} promise A promise to add to the extend lifetime promises\n * of the event that triggered the request.\n */\n waitUntil(promise) {\n this._extendLifetimePromises.push(promise);\n return promise;\n }\n /**\n * Returns a promise that resolves once all promises passed to\n * [`waitUntil()`]{@link module:workbox-strategies.StrategyHandler~waitUntil}\n * have settled.\n *\n * Note: any work done after `doneWaiting()` settles should be manually\n * passed to an event's `waitUntil()` method (not this handler's\n * `waitUntil()` method), otherwise the service worker thread my be killed\n * prior to your work completing.\n */\n async doneWaiting() {\n let promise;\n while (promise = this._extendLifetimePromises.shift()) {\n await promise;\n }\n }\n /**\n * Stops running the strategy and immediately resolves any pending\n * `waitUntil()` promises.\n */\n destroy() {\n this._handlerDeferred.resolve();\n }\n /**\n * This method will call cacheWillUpdate on the available plugins (or use\n * status === 200) to determine if the Response is safe and valid to cache.\n *\n * @param {Request} options.request\n * @param {Response} options.response\n * @return {Promise}\n *\n * @private\n */\n async _ensureResponseSafeToCache(response) {\n let responseToCache = response;\n let pluginsUsed = false;\n for (const callback of this.iterateCallbacks('cacheWillUpdate')) {\n responseToCache = (await callback({\n request: this.request,\n response: responseToCache,\n event: this.event,\n })) || undefined;\n pluginsUsed = true;\n if (!responseToCache) {\n break;\n }\n }\n if (!pluginsUsed) {\n if (responseToCache && responseToCache.status !== 200) {\n responseToCache = undefined;\n }\n if (process.env.NODE_ENV !== 'production') {\n if (responseToCache) {\n if (responseToCache.status !== 200) {\n if (responseToCache.status === 0) {\n logger.warn(`The response for '${this.request.url}' ` +\n `is an opaque response. The caching strategy that you're ` +\n `using will not cache opaque responses by default.`);\n }\n else {\n logger.debug(`The response for '${this.request.url}' ` +\n `returned a status code of '${response.status}' and won't ` +\n `be cached as a result.`);\n }\n }\n }\n }\n }\n return responseToCache;\n }\n}\nexport { StrategyHandler };\n","/*\n Copyright 2020 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\nimport { cacheNames } from 'workbox-core/_private/cacheNames.js';\nimport { WorkboxError } from 'workbox-core/_private/WorkboxError.js';\nimport { logger } from 'workbox-core/_private/logger.js';\nimport { getFriendlyURL } from 'workbox-core/_private/getFriendlyURL.js';\nimport { StrategyHandler } from './StrategyHandler.js';\nimport './_version.js';\n/**\n * An abstract base class that all other strategy classes must extend from:\n *\n * @memberof module:workbox-strategies\n */\nclass Strategy {\n /**\n * Creates a new instance of the strategy and sets all documented option\n * properties as public instance properties.\n *\n * Note: if a custom strategy class extends the base Strategy class and does\n * not need more than these properties, it does not need to define its own\n * constructor.\n *\n * @param {Object} [options]\n * @param {string} [options.cacheName] Cache name to store and retrieve\n * requests. Defaults to the cache names provided by\n * [workbox-core]{@link module:workbox-core.cacheNames}.\n * @param {Array} [options.plugins] [Plugins]{@link https://developers.google.com/web/tools/workbox/guides/using-plugins}\n * to use in conjunction with this caching strategy.\n * @param {Object} [options.fetchOptions] Values passed along to the\n * [`init`](https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/fetch#Parameters)\n * of [non-navigation](https://github.com/GoogleChrome/workbox/issues/1796)\n * `fetch()` requests made by this strategy.\n * @param {Object} [options.matchOptions] The\n * [`CacheQueryOptions`]{@link https://w3c.github.io/ServiceWorker/#dictdef-cachequeryoptions}\n * for any `cache.match()` or `cache.put()` calls made by this strategy.\n */\n constructor(options = {}) {\n /**\n * Cache name to store and retrieve\n * requests. Defaults to the cache names provided by\n * [workbox-core]{@link module:workbox-core.cacheNames}.\n *\n * @type {string}\n */\n this.cacheName = cacheNames.getRuntimeName(options.cacheName);\n /**\n * The list\n * [Plugins]{@link https://developers.google.com/web/tools/workbox/guides/using-plugins}\n * used by this strategy.\n *\n * @type {Array}\n */\n this.plugins = options.plugins || [];\n /**\n * Values passed along to the\n * [`init`]{@link https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/fetch#Parameters}\n * of all fetch() requests made by this strategy.\n *\n * @type {Object}\n */\n this.fetchOptions = options.fetchOptions;\n /**\n * The\n * [`CacheQueryOptions`]{@link https://w3c.github.io/ServiceWorker/#dictdef-cachequeryoptions}\n * for any `cache.match()` or `cache.put()` calls made by this strategy.\n *\n * @type {Object}\n */\n this.matchOptions = options.matchOptions;\n }\n /**\n * Perform a request strategy and returns a `Promise` that will resolve with\n * a `Response`, invoking all relevant plugin callbacks.\n *\n * When a strategy instance is registered with a Workbox\n * [route]{@link module:workbox-routing.Route}, this method is automatically\n * called when the route matches.\n *\n * Alternatively, this method can be used in a standalone `FetchEvent`\n * listener by passing it to `event.respondWith()`.\n *\n * @param {FetchEvent|Object} options A `FetchEvent` or an object with the\n * properties listed below.\n * @param {Request|string} options.request A request to run this strategy for.\n * @param {ExtendableEvent} options.event The event associated with the\n * request.\n * @param {URL} [options.url]\n * @param {*} [options.params]\n */\n handle(options) {\n const [responseDone] = this.handleAll(options);\n return responseDone;\n }\n /**\n * Similar to [`handle()`]{@link module:workbox-strategies.Strategy~handle}, but\n * instead of just returning a `Promise` that resolves to a `Response` it\n * it will return an tuple of [response, done] promises, where the former\n * (`response`) is equivalent to what `handle()` returns, and the latter is a\n * Promise that will resolve once any promises that were added to\n * `event.waitUntil()` as part of performing the strategy have completed.\n *\n * You can await the `done` promise to ensure any extra work performed by\n * the strategy (usually caching responses) completes successfully.\n *\n * @param {FetchEvent|Object} options A `FetchEvent` or an object with the\n * properties listed below.\n * @param {Request|string} options.request A request to run this strategy for.\n * @param {ExtendableEvent} options.event The event associated with the\n * request.\n * @param {URL} [options.url]\n * @param {*} [options.params]\n * @return {Array} A tuple of [response, done]\n * promises that can be used to determine when the response resolves as\n * well as when the handler has completed all its work.\n */\n handleAll(options) {\n // Allow for flexible options to be passed.\n if (options instanceof FetchEvent) {\n options = {\n event: options,\n request: options.request,\n };\n }\n const event = options.event;\n const request = typeof options.request === 'string' ?\n new Request(options.request) :\n options.request;\n const params = 'params' in options ? options.params : undefined;\n const handler = new StrategyHandler(this, { event, request, params });\n const responseDone = this._getResponse(handler, request, event);\n const handlerDone = this._awaitComplete(responseDone, handler, request, event);\n // Return an array of promises, suitable for use with Promise.all().\n return [responseDone, handlerDone];\n }\n async _getResponse(handler, request, event) {\n await handler.runCallbacks('handlerWillStart', { event, request });\n let response = undefined;\n try {\n response = await this._handle(request, handler);\n // The \"official\" Strategy subclasses all throw this error automatically,\n // but in case a third-party Strategy doesn't, ensure that we have a\n // consistent failure when there's no response or an error response.\n if (!response || response.type === 'error') {\n throw new WorkboxError('no-response', { url: request.url });\n }\n }\n catch (error) {\n for (const callback of handler.iterateCallbacks('handlerDidError')) {\n response = await callback({ error, event, request });\n if (response) {\n break;\n }\n }\n if (!response) {\n throw error;\n }\n else if (process.env.NODE_ENV !== 'production') {\n logger.log(`While responding to '${getFriendlyURL(request.url)}', ` +\n `an ${error} error occurred. Using a fallback response provided by ` +\n `a handlerDidError plugin.`);\n }\n }\n for (const callback of handler.iterateCallbacks('handlerWillRespond')) {\n response = await callback({ event, request, response });\n }\n return response;\n }\n async _awaitComplete(responseDone, handler, request, event) {\n let response;\n let error;\n try {\n response = await responseDone;\n }\n catch (error) {\n // Ignore errors, as response errors should be caught via the `response`\n // promise above. The `done` promise will only throw for errors in\n // promises passed to `handler.waitUntil()`.\n }\n try {\n await handler.runCallbacks('handlerDidRespond', {\n event,\n request,\n response,\n });\n await handler.doneWaiting();\n }\n catch (waitUntilError) {\n error = waitUntilError;\n }\n await handler.runCallbacks('handlerDidComplete', {\n event,\n request,\n response,\n error,\n });\n handler.destroy();\n if (error) {\n throw error;\n }\n }\n}\nexport { Strategy };\n/**\n * Classes extending the `Strategy` based class should implement this method,\n * and leverage the [`handler`]{@link module:workbox-strategies.StrategyHandler}\n * arg to perform all fetching and cache logic, which will ensure all relevant\n * cache, cache options, fetch options and plugins are used (per the current\n * strategy instance).\n *\n * @name _handle\n * @instance\n * @abstract\n * @function\n * @param {Request} request\n * @param {module:workbox-strategies.StrategyHandler} handler\n * @return {Promise}\n *\n * @memberof module:workbox-strategies.Strategy\n */\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\nimport { logger } from 'workbox-core/_private/logger.js';\nimport { getFriendlyURL } from 'workbox-core/_private/getFriendlyURL.js';\nimport '../_version.js';\nexport const messages = {\n strategyStart: (strategyName, request) => `Using ${strategyName} to respond to '${getFriendlyURL(request.url)}'`,\n printFinalResponse: (response) => {\n if (response) {\n logger.groupCollapsed(`View the final response here.`);\n logger.log(response || '[No response returned]');\n logger.groupEnd();\n }\n },\n};\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\nimport { assert } from 'workbox-core/_private/assert.js';\nimport { logger } from 'workbox-core/_private/logger.js';\nimport { WorkboxError } from 'workbox-core/_private/WorkboxError.js';\nimport { cacheOkAndOpaquePlugin } from './plugins/cacheOkAndOpaquePlugin.js';\nimport { Strategy } from './Strategy.js';\nimport { messages } from './utils/messages.js';\nimport './_version.js';\n/**\n * An implementation of a\n * [network first]{@link https://developers.google.com/web/fundamentals/instant-and-offline/offline-cookbook/#network-falling-back-to-cache}\n * request strategy.\n *\n * By default, this strategy will cache responses with a 200 status code as\n * well as [opaque responses]{@link https://developers.google.com/web/tools/workbox/guides/handle-third-party-requests}.\n * Opaque responses are are cross-origin requests where the response doesn't\n * support [CORS]{@link https://enable-cors.org/}.\n *\n * If the network request fails, and there is no cache match, this will throw\n * a `WorkboxError` exception.\n *\n * @extends module:workbox-strategies.Strategy\n * @memberof module:workbox-strategies\n */\nclass NetworkFirst extends Strategy {\n /**\n * @param {Object} [options]\n * @param {string} [options.cacheName] Cache name to store and retrieve\n * requests. Defaults to cache names provided by\n * [workbox-core]{@link module:workbox-core.cacheNames}.\n * @param {Array} [options.plugins] [Plugins]{@link https://developers.google.com/web/tools/workbox/guides/using-plugins}\n * to use in conjunction with this caching strategy.\n * @param {Object} [options.fetchOptions] Values passed along to the\n * [`init`](https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/fetch#Parameters)\n * of [non-navigation](https://github.com/GoogleChrome/workbox/issues/1796)\n * `fetch()` requests made by this strategy.\n * @param {Object} [options.matchOptions] [`CacheQueryOptions`](https://w3c.github.io/ServiceWorker/#dictdef-cachequeryoptions)\n * @param {number} [options.networkTimeoutSeconds] If set, any network requests\n * that fail to respond within the timeout will fallback to the cache.\n *\n * This option can be used to combat\n * \"[lie-fi]{@link https://developers.google.com/web/fundamentals/performance/poor-connectivity/#lie-fi}\"\n * scenarios.\n */\n constructor(options = {}) {\n super(options);\n // If this instance contains no plugins with a 'cacheWillUpdate' callback,\n // prepend the `cacheOkAndOpaquePlugin` plugin to the plugins list.\n if (!this.plugins.some((p) => 'cacheWillUpdate' in p)) {\n this.plugins.unshift(cacheOkAndOpaquePlugin);\n }\n this._networkTimeoutSeconds = options.networkTimeoutSeconds || 0;\n if (process.env.NODE_ENV !== 'production') {\n if (this._networkTimeoutSeconds) {\n assert.isType(this._networkTimeoutSeconds, 'number', {\n moduleName: 'workbox-strategies',\n className: this.constructor.name,\n funcName: 'constructor',\n paramName: 'networkTimeoutSeconds',\n });\n }\n }\n }\n /**\n * @private\n * @param {Request|string} request A request to run this strategy for.\n * @param {module:workbox-strategies.StrategyHandler} handler The event that\n * triggered the request.\n * @return {Promise}\n */\n async _handle(request, handler) {\n const logs = [];\n if (process.env.NODE_ENV !== 'production') {\n assert.isInstance(request, Request, {\n moduleName: 'workbox-strategies',\n className: this.constructor.name,\n funcName: 'handle',\n paramName: 'makeRequest',\n });\n }\n const promises = [];\n let timeoutId;\n if (this._networkTimeoutSeconds) {\n const { id, promise } = this._getTimeoutPromise({ request, logs, handler });\n timeoutId = id;\n promises.push(promise);\n }\n const networkPromise = this._getNetworkPromise({ timeoutId, request, logs, handler });\n promises.push(networkPromise);\n const response = await handler.waitUntil((async () => {\n // Promise.race() will resolve as soon as the first promise resolves.\n return await handler.waitUntil(Promise.race(promises)) ||\n // If Promise.race() resolved with null, it might be due to a network\n // timeout + a cache miss. If that were to happen, we'd rather wait until\n // the networkPromise resolves instead of returning null.\n // Note that it's fine to await an already-resolved promise, so we don't\n // have to check to see if it's still \"in flight\".\n await networkPromise;\n })());\n if (process.env.NODE_ENV !== 'production') {\n logger.groupCollapsed(messages.strategyStart(this.constructor.name, request));\n for (const log of logs) {\n logger.log(log);\n }\n messages.printFinalResponse(response);\n logger.groupEnd();\n }\n if (!response) {\n throw new WorkboxError('no-response', { url: request.url });\n }\n return response;\n }\n /**\n * @param {Object} options\n * @param {Request} options.request\n * @param {Array} options.logs A reference to the logs array\n * @param {Event} options.event\n * @return {Promise}\n *\n * @private\n */\n _getTimeoutPromise({ request, logs, handler }) {\n let timeoutId;\n const timeoutPromise = new Promise((resolve) => {\n const onNetworkTimeout = async () => {\n if (process.env.NODE_ENV !== 'production') {\n logs.push(`Timing out the network response at ` +\n `${this._networkTimeoutSeconds} seconds.`);\n }\n resolve(await handler.cacheMatch(request));\n };\n timeoutId = setTimeout(onNetworkTimeout, this._networkTimeoutSeconds * 1000);\n });\n return {\n promise: timeoutPromise,\n id: timeoutId,\n };\n }\n /**\n * @param {Object} options\n * @param {number|undefined} options.timeoutId\n * @param {Request} options.request\n * @param {Array} options.logs A reference to the logs Array.\n * @param {Event} options.event\n * @return {Promise}\n *\n * @private\n */\n async _getNetworkPromise({ timeoutId, request, logs, handler }) {\n let error;\n let response;\n try {\n response = await handler.fetchAndCachePut(request);\n }\n catch (fetchError) {\n error = fetchError;\n }\n if (timeoutId) {\n clearTimeout(timeoutId);\n }\n if (process.env.NODE_ENV !== 'production') {\n if (response) {\n logs.push(`Got response from network.`);\n }\n else {\n logs.push(`Unable to get a response from the network. Will respond ` +\n `with a cached response.`);\n }\n }\n if (error || !response) {\n response = await handler.cacheMatch(request);\n if (process.env.NODE_ENV !== 'production') {\n if (response) {\n logs.push(`Found a cached response in the '${this.cacheName}'` +\n ` cache.`);\n }\n else {\n logs.push(`No response found in the '${this.cacheName}' cache.`);\n }\n }\n }\n return response;\n }\n}\nexport { NetworkFirst };\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\nimport { assert } from 'workbox-core/_private/assert.js';\nimport { logger } from 'workbox-core/_private/logger.js';\nimport { timeout } from 'workbox-core/_private/timeout.js';\nimport { WorkboxError } from 'workbox-core/_private/WorkboxError.js';\nimport { Strategy } from './Strategy.js';\nimport { messages } from './utils/messages.js';\nimport './_version.js';\n/**\n * An implementation of a\n * [network-only]{@link https://developers.google.com/web/fundamentals/instant-and-offline/offline-cookbook/#network-only}\n * request strategy.\n *\n * This class is useful if you want to take advantage of any\n * [Workbox plugins]{@link https://developers.google.com/web/tools/workbox/guides/using-plugins}.\n *\n * If the network request fails, this will throw a `WorkboxError` exception.\n *\n * @extends module:workbox-strategies.Strategy\n * @memberof module:workbox-strategies\n */\nclass NetworkOnly extends Strategy {\n /**\n * @param {Object} [options]\n * @param {Array} [options.plugins] [Plugins]{@link https://developers.google.com/web/tools/workbox/guides/using-plugins}\n * to use in conjunction with this caching strategy.\n * @param {Object} [options.fetchOptions] Values passed along to the\n * [`init`](https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/fetch#Parameters)\n * of [non-navigation](https://github.com/GoogleChrome/workbox/issues/1796)\n * `fetch()` requests made by this strategy.\n * @param {number} [options.networkTimeoutSeconds] If set, any network requests\n * that fail to respond within the timeout will result in a network error.\n */\n constructor(options = {}) {\n super(options);\n this._networkTimeoutSeconds = options.networkTimeoutSeconds || 0;\n }\n /**\n * @private\n * @param {Request|string} request A request to run this strategy for.\n * @param {module:workbox-strategies.StrategyHandler} handler The event that\n * triggered the request.\n * @return {Promise}\n */\n async _handle(request, handler) {\n if (process.env.NODE_ENV !== 'production') {\n assert.isInstance(request, Request, {\n moduleName: 'workbox-strategies',\n className: this.constructor.name,\n funcName: '_handle',\n paramName: 'request',\n });\n }\n let error = undefined;\n let response;\n try {\n const promises = [handler.fetch(request)];\n if (this._networkTimeoutSeconds) {\n const timeoutPromise = timeout(this._networkTimeoutSeconds * 1000);\n promises.push(timeoutPromise);\n }\n response = await Promise.race(promises);\n if (!response) {\n throw new Error(`Timed out the network response after ` +\n `${this._networkTimeoutSeconds} seconds.`);\n }\n }\n catch (err) {\n error = err;\n }\n if (process.env.NODE_ENV !== 'production') {\n logger.groupCollapsed(messages.strategyStart(this.constructor.name, request));\n if (response) {\n logger.log(`Got response from network.`);\n }\n else {\n logger.log(`Unable to get a response from the network.`);\n }\n messages.printFinalResponse(response);\n logger.groupEnd();\n }\n if (!response) {\n throw new WorkboxError('no-response', { url: request.url, error });\n }\n return response;\n }\n}\nexport { NetworkOnly };\n","/*\n Copyright 2019 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\nimport './_version.js';\n/**\n * Claim any currently available clients once the service worker\n * becomes active. This is normally used in conjunction with `skipWaiting()`.\n *\n * @memberof module:workbox-core\n */\nfunction clientsClaim() {\n self.addEventListener('activate', () => self.clients.claim());\n}\nexport { clientsClaim };\n"],"names":["self","_","e","logger","__WB_DISABLE_DEV_LOGS","inGroup","methodToColorMap","debug","log","warn","error","groupCollapsed","groupEnd","print","method","args","test","navigator","userAgent","console","styles","logPrefix","join","api","loggerMethods","Object","keys","key","messages","paramName","validValueDescription","value","Error","JSON","stringify","moduleName","className","funcName","expectedType","expectedClass","isReturnValueProblem","name","expectedMethod","entry","firstEntry","secondEntry","_entryId","thrownError","message","cacheNameId","methodName","normalizedRangeHeader","size","start","end","url","status","cacheName","origin","generatorFunction","code","details","messageGenerator","WorkboxError","constructor","errorCode","isArray","Array","hasMethod","object","type","isType","isInstance","isOneOf","validValues","includes","isArrayOfClass","item","finalAssertExports","defaultMethod","validMethods","normalizeHandler","handler","assert","handle","Route","match","setCatchHandler","catchHandler","RegExpRoute","regExp","RegExp","result","exec","href","location","index","slice","getFriendlyURL","urlObj","URL","String","replace","Router","_routes","Map","_defaultHandlerMap","routes","addFetchListener","addEventListener","event","request","responsePromise","handleRequest","respondWith","addCacheListener","data","payload","urlsToCache","requestPromises","Promise","all","map","Request","waitUntil","ports","then","postMessage","protocol","startsWith","sameOrigin","params","route","findMatchingRoute","debugMessages","push","has","get","forEach","msg","err","reject","_catchHandler","catch","catchErr","matchResult","length","undefined","setDefaultHandler","set","registerRoute","unregisterRoute","routeIndex","indexOf","splice","defaultRouter","getOrCreateDefaultRouter","capture","captureUrl","valueToCheck","pathname","wildcards","matchCallback","cacheOkAndOpaquePlugin","cacheWillUpdate","response","_cacheNameDetails","googleAnalytics","precache","prefix","runtime","suffix","registration","scope","_createCacheName","filter","eachCacheNameDetail","fn","cacheNames","updateDetails","getGoogleAnalyticsName","userCacheName","getPrecacheName","getPrefix","getRuntimeName","getSuffix","stripParams","fullURL","ignoreParams","strippedURL","param","searchParams","delete","cacheMatchIgnoreParams","cache","matchOptions","strippedRequestURL","keysOptions","ignoreSearch","cacheKeys","cacheKey","strippedCacheKeyURL","Deferred","promise","resolve","quotaErrorCallbacks","Set","executeQuotaErrorCallbacks","callback","timeout","ms","setTimeout","toRequest","input","StrategyHandler","strategy","options","_cacheKeys","ExtendableEvent","assign","_strategy","_handlerDeferred","_extendLifetimePromises","_plugins","plugins","_pluginStateMap","plugin","fetch","mode","FetchEvent","preloadResponse","possiblePreloadResponse","originalRequest","hasCallback","clone","cb","iterateCallbacks","pluginFilteredRequest","fetchResponse","fetchOptions","runCallbacks","fetchAndCachePut","responseClone","cachePut","cacheMatch","cachedResponse","effectiveRequest","getCacheKey","multiMatchOptions","caches","responseToCache","_ensureResponseSafeToCache","open","hasCacheUpdateCallback","oldResponse","put","newResponse","state","statefulCallback","statefulParam","doneWaiting","shift","destroy","pluginsUsed","Strategy","responseDone","handleAll","_getResponse","handlerDone","_awaitComplete","_handle","waitUntilError","strategyStart","strategyName","printFinalResponse","NetworkFirst","some","p","unshift","_networkTimeoutSeconds","networkTimeoutSeconds","logs","promises","timeoutId","id","_getTimeoutPromise","networkPromise","_getNetworkPromise","race","timeoutPromise","onNetworkTimeout","fetchError","clearTimeout","NetworkOnly","clientsClaim","clients","claim"],"mappings":"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"} \ No newline at end of file diff --git a/public/workbox-ea903bce.js b/public/workbox-ea903bce.js deleted file mode 100644 index e683e1390..000000000 --- a/public/workbox-ea903bce.js +++ /dev/null @@ -1,1134 +0,0 @@ -define('./workbox-ea903bce.js', ['exports'], function (t) { - 'use strict' - try { - self['workbox:core:6.1.5'] && _() - } catch (t) {} - const e = (t, ...e) => { - let s = t - return e.length > 0 && (s += ` :: ${JSON.stringify(e)}`), s - } - class s extends Error { - constructor(t, s) { - super(e(t, s)), (this.name = t), (this.details = s) - } - } - try { - self['workbox:routing:6.1.5'] && _() - } catch (t) {} - const n = (t) => (t && 'object' == typeof t ? t : { handle: t }) - class i { - constructor(t, e, s = 'GET') { - ;(this.handler = n(e)), (this.match = t), (this.method = s) - } - setCatchHandler(t) { - this.catchHandler = n(t) - } - } - class r extends i { - constructor(t, e, s) { - super( - ({ url: e }) => { - const s = t.exec(e.href) - if (s && (e.origin === location.origin || 0 === s.index)) - return s.slice(1) - }, - e, - s - ) - } - } - class a { - constructor() { - ;(this.t = new Map()), (this.i = new Map()) - } - get routes() { - return this.t - } - addFetchListener() { - self.addEventListener('fetch', (t) => { - const { request: e } = t, - s = this.handleRequest({ request: e, event: t }) - s && t.respondWith(s) - }) - } - addCacheListener() { - self.addEventListener('message', (t) => { - if (t.data && 'CACHE_URLS' === t.data.type) { - const { payload: e } = t.data, - s = Promise.all( - e.urlsToCache.map((e) => { - 'string' == typeof e && (e = [e]) - const s = new Request(...e) - return this.handleRequest({ request: s, event: t }) - }) - ) - t.waitUntil(s), - t.ports && t.ports[0] && s.then(() => t.ports[0].postMessage(!0)) - } - }) - } - handleRequest({ request: t, event: e }) { - const s = new URL(t.url, location.href) - if (!s.protocol.startsWith('http')) return - const n = s.origin === location.origin, - { params: i, route: r } = this.findMatchingRoute({ - event: e, - request: t, - sameOrigin: n, - url: s, - }) - let a = r && r.handler - const c = t.method - if ((!a && this.i.has(c) && (a = this.i.get(c)), !a)) return - let o - try { - o = a.handle({ url: s, request: t, event: e, params: i }) - } catch (t) { - o = Promise.reject(t) - } - const h = r && r.catchHandler - return ( - o instanceof Promise && - (this.o || h) && - (o = o.catch(async (n) => { - if (h) - try { - return await h.handle({ - url: s, - request: t, - event: e, - params: i, - }) - } catch (t) { - n = t - } - if (this.o) return this.o.handle({ url: s, request: t, event: e }) - throw n - })), - o - ) - } - findMatchingRoute({ url: t, sameOrigin: e, request: s, event: n }) { - const i = this.t.get(s.method) || [] - for (const r of i) { - let i - const a = r.match({ url: t, sameOrigin: e, request: s, event: n }) - if (a) - return ( - (i = a), - ((Array.isArray(a) && 0 === a.length) || - (a.constructor === Object && 0 === Object.keys(a).length) || - 'boolean' == typeof a) && - (i = void 0), - { route: r, params: i } - ) - } - return {} - } - setDefaultHandler(t, e = 'GET') { - this.i.set(e, n(t)) - } - setCatchHandler(t) { - this.o = n(t) - } - registerRoute(t) { - this.t.has(t.method) || this.t.set(t.method, []), - this.t.get(t.method).push(t) - } - unregisterRoute(t) { - if (!this.t.has(t.method)) - throw new s('unregister-route-but-not-found-with-method', { - method: t.method, - }) - const e = this.t.get(t.method).indexOf(t) - if (!(e > -1)) throw new s('unregister-route-route-not-registered') - this.t.get(t.method).splice(e, 1) - } - } - let c - const o = () => ( - c || ((c = new a()), c.addFetchListener(), c.addCacheListener()), c - ) - function h(t, e, n) { - let a - if ('string' == typeof t) { - const s = new URL(t, location.href) - a = new i(({ url: t }) => t.href === s.href, e, n) - } else if (t instanceof RegExp) a = new r(t, e, n) - else if ('function' == typeof t) a = new i(t, e, n) - else { - if (!(t instanceof i)) - throw new s('unsupported-route-type', { - moduleName: 'workbox-routing', - funcName: 'registerRoute', - paramName: 'capture', - }) - a = t - } - return o().registerRoute(a), a - } - try { - self['workbox:strategies:6.1.5'] && _() - } catch (t) {} - const u = { - cacheWillUpdate: async ({ response: t }) => - 200 === t.status || 0 === t.status ? t : null, - }, - l = { - googleAnalytics: 'googleAnalytics', - precache: 'precache-v2', - prefix: 'workbox', - runtime: 'runtime', - suffix: 'undefined' != typeof registration ? registration.scope : '', - }, - f = (t) => - [l.prefix, t, l.suffix].filter((t) => t && t.length > 0).join('-'), - w = (t) => t || f(l.precache), - d = (t) => t || f(l.runtime) - function p() { - return (p = - Object.assign || - function (t) { - for (var e = 1; e < arguments.length; e++) { - var s = arguments[e] - for (var n in s) - Object.prototype.hasOwnProperty.call(s, n) && (t[n] = s[n]) - } - return t - }).apply(this, arguments) - } - function y(t, e) { - const s = new URL(t) - for (const t of e) s.searchParams.delete(t) - return s.href - } - class m { - constructor() { - this.promise = new Promise((t, e) => { - ;(this.resolve = t), (this.reject = e) - }) - } - } - const g = new Set() - function R(t) { - return 'string' == typeof t ? new Request(t) : t - } - class v { - constructor(t, e) { - ;(this.h = {}), - Object.assign(this, e), - (this.event = e.event), - (this.u = t), - (this.l = new m()), - (this.p = []), - (this.m = [...t.plugins]), - (this.g = new Map()) - for (const t of this.m) this.g.set(t, {}) - this.event.waitUntil(this.l.promise) - } - async fetch(t) { - const { event: e } = this - let n = R(t) - if ( - 'navigate' === n.mode && - e instanceof FetchEvent && - e.preloadResponse - ) { - const t = await e.preloadResponse - if (t) return t - } - const i = this.hasCallback('fetchDidFail') ? n.clone() : null - try { - for (const t of this.iterateCallbacks('requestWillFetch')) - n = await t({ request: n.clone(), event: e }) - } catch (t) { - throw new s('plugin-error-request-will-fetch', { thrownError: t }) - } - const r = n.clone() - try { - let t - t = await fetch(n, 'navigate' === n.mode ? void 0 : this.u.fetchOptions) - for (const s of this.iterateCallbacks('fetchDidSucceed')) - t = await s({ event: e, request: r, response: t }) - return t - } catch (t) { - throw ( - (i && - (await this.runCallbacks('fetchDidFail', { - error: t, - event: e, - originalRequest: i.clone(), - request: r.clone(), - })), - t) - ) - } - } - async fetchAndCachePut(t) { - const e = await this.fetch(t), - s = e.clone() - return this.waitUntil(this.cachePut(t, s)), e - } - async cacheMatch(t) { - const e = R(t) - let s - const { cacheName: n, matchOptions: i } = this.u, - r = await this.getCacheKey(e, 'read'), - a = p({}, i, { cacheName: n }) - s = await caches.match(r, a) - for (const t of this.iterateCallbacks('cachedResponseWillBeUsed')) - s = - (await t({ - cacheName: n, - matchOptions: i, - cachedResponse: s, - request: r, - event: this.event, - })) || void 0 - return s - } - async cachePut(t, e) { - const n = R(t) - var i - await ((i = 0), new Promise((t) => setTimeout(t, i))) - const r = await this.getCacheKey(n, 'write') - if (!e) - throw new s('cache-put-with-no-response', { - url: - ((a = r.url), - new URL(String(a), location.href).href.replace( - new RegExp(`^${location.origin}`), - '' - )), - }) - var a - const c = await this.R(e) - if (!c) return !1 - const { cacheName: o, matchOptions: h } = this.u, - u = await self.caches.open(o), - l = this.hasCallback('cacheDidUpdate'), - f = l - ? await (async function (t, e, s, n) { - const i = y(e.url, s) - if (e.url === i) return t.match(e, n) - const r = p({}, n, { ignoreSearch: !0 }), - a = await t.keys(e, r) - for (const e of a) if (i === y(e.url, s)) return t.match(e, n) - })(u, r.clone(), ['__WB_REVISION__'], h) - : null - try { - await u.put(r, l ? c.clone() : c) - } catch (t) { - throw ( - ('QuotaExceededError' === t.name && - (await (async function () { - for (const t of g) await t() - })()), - t) - ) - } - for (const t of this.iterateCallbacks('cacheDidUpdate')) - await t({ - cacheName: o, - oldResponse: f, - newResponse: c.clone(), - request: r, - event: this.event, - }) - return !0 - } - async getCacheKey(t, e) { - if (!this.h[e]) { - let s = t - for (const t of this.iterateCallbacks('cacheKeyWillBeUsed')) - s = R( - await t({ - mode: e, - request: s, - event: this.event, - params: this.params, - }) - ) - this.h[e] = s - } - return this.h[e] - } - hasCallback(t) { - for (const e of this.u.plugins) if (t in e) return !0 - return !1 - } - async runCallbacks(t, e) { - for (const s of this.iterateCallbacks(t)) await s(e) - } - *iterateCallbacks(t) { - for (const e of this.u.plugins) - if ('function' == typeof e[t]) { - const s = this.g.get(e), - n = (n) => { - const i = p({}, n, { state: s }) - return e[t](i) - } - yield n - } - } - waitUntil(t) { - return this.p.push(t), t - } - async doneWaiting() { - let t - for (; (t = this.p.shift()); ) await t - } - destroy() { - this.l.resolve() - } - async R(t) { - let e = t, - s = !1 - for (const t of this.iterateCallbacks('cacheWillUpdate')) - if ( - ((e = - (await t({ - request: this.request, - response: e, - event: this.event, - })) || void 0), - (s = !0), - !e) - ) - break - return s || (e && 200 !== e.status && (e = void 0)), e - } - } - class q { - constructor(t = {}) { - ;(this.cacheName = d(t.cacheName)), - (this.plugins = t.plugins || []), - (this.fetchOptions = t.fetchOptions), - (this.matchOptions = t.matchOptions) - } - handle(t) { - const [e] = this.handleAll(t) - return e - } - handleAll(t) { - t instanceof FetchEvent && (t = { event: t, request: t.request }) - const e = t.event, - s = 'string' == typeof t.request ? new Request(t.request) : t.request, - n = 'params' in t ? t.params : void 0, - i = new v(this, { event: e, request: s, params: n }), - r = this.v(i, s, e) - return [r, this.q(r, i, s, e)] - } - async v(t, e, n) { - let i - await t.runCallbacks('handlerWillStart', { event: n, request: e }) - try { - if (((i = await this.U(e, t)), !i || 'error' === i.type)) - throw new s('no-response', { url: e.url }) - } catch (s) { - for (const r of t.iterateCallbacks('handlerDidError')) - if (((i = await r({ error: s, event: n, request: e })), i)) break - if (!i) throw s - } - for (const s of t.iterateCallbacks('handlerWillRespond')) - i = await s({ event: n, request: e, response: i }) - return i - } - async q(t, e, s, n) { - let i, r - try { - i = await t - } catch (r) {} - try { - await e.runCallbacks('handlerDidRespond', { - event: n, - request: s, - response: i, - }), - await e.doneWaiting() - } catch (t) { - r = t - } - if ( - (await e.runCallbacks('handlerDidComplete', { - event: n, - request: s, - response: i, - error: r, - }), - e.destroy(), - r) - ) - throw r - } - } - function U(t) { - t.then(() => {}) - } - class x { - constructor(t, e, { onupgradeneeded: s, onversionchange: n } = {}) { - ;(this._ = null), - (this.L = t), - (this.N = e), - (this.C = s), - (this.D = n || (() => this.close())) - } - get db() { - return this._ - } - async open() { - if (!this._) - return ( - (this._ = await new Promise((t, e) => { - let s = !1 - setTimeout(() => { - ;(s = !0), - e(new Error('The open request was blocked and timed out')) - }, this.OPEN_TIMEOUT) - const n = indexedDB.open(this.L, this.N) - ;(n.onerror = () => e(n.error)), - (n.onupgradeneeded = (t) => { - s - ? (n.transaction.abort(), n.result.close()) - : 'function' == typeof this.C && this.C(t) - }), - (n.onsuccess = () => { - const e = n.result - s ? e.close() : ((e.onversionchange = this.D.bind(this)), t(e)) - }) - })), - this - ) - } - async getKey(t, e) { - return (await this.getAllKeys(t, e, 1))[0] - } - async getAll(t, e, s) { - return await this.getAllMatching(t, { query: e, count: s }) - } - async getAllKeys(t, e, s) { - return ( - await this.getAllMatching(t, { query: e, count: s, includeKeys: !0 }) - ).map((t) => t.key) - } - async getAllMatching( - t, - { - index: e, - query: s = null, - direction: n = 'next', - count: i, - includeKeys: r = !1, - } = {} - ) { - return await this.transaction([t], 'readonly', (a, c) => { - const o = a.objectStore(t), - h = e ? o.index(e) : o, - u = [], - l = h.openCursor(s, n) - l.onsuccess = () => { - const t = l.result - t - ? (u.push(r ? t : t.value), - i && u.length >= i ? c(u) : t.continue()) - : c(u) - } - }) - } - async transaction(t, e, s) { - return ( - await this.open(), - await new Promise((n, i) => { - const r = this._.transaction(t, e) - ;(r.onabort = () => i(r.error)), - (r.oncomplete = () => n()), - s(r, (t) => n(t)) - }) - ) - } - async T(t, e, s, ...n) { - return await this.transaction([e], s, (s, i) => { - const r = s.objectStore(e), - a = r[t].apply(r, n) - a.onsuccess = () => i(a.result) - }) - } - close() { - this._ && (this._.close(), (this._ = null)) - } - } - x.prototype.OPEN_TIMEOUT = 2e3 - const b = { - readonly: ['get', 'count', 'getKey', 'getAll', 'getAllKeys'], - readwrite: ['add', 'put', 'clear', 'delete'], - } - for (const [t, e] of Object.entries(b)) - for (const s of e) - s in IDBObjectStore.prototype && - (x.prototype[s] = async function (e, ...n) { - return await this.T(s, e, t, ...n) - }) - try { - self['workbox:expiration:6.1.5'] && _() - } catch (t) {} - const L = 'cache-entries', - N = (t) => { - const e = new URL(t, location.href) - return (e.hash = ''), e.href - } - class C { - constructor(t) { - ;(this.P = t), - (this._ = new x('workbox-expiration', 1, { - onupgradeneeded: (t) => this.k(t), - })) - } - k(t) { - const e = t.target.result.createObjectStore(L, { keyPath: 'id' }) - e.createIndex('cacheName', 'cacheName', { unique: !1 }), - e.createIndex('timestamp', 'timestamp', { unique: !1 }), - (async (t) => { - await new Promise((e, s) => { - const n = indexedDB.deleteDatabase(t) - ;(n.onerror = () => { - s(n.error) - }), - (n.onblocked = () => { - s(new Error('Delete blocked')) - }), - (n.onsuccess = () => { - e() - }) - }) - })(this.P) - } - async setTimestamp(t, e) { - const s = { - url: (t = N(t)), - timestamp: e, - cacheName: this.P, - id: this.K(t), - } - await this._.put(L, s) - } - async getTimestamp(t) { - return (await this._.get(L, this.K(t))).timestamp - } - async expireEntries(t, e) { - const s = await this._.transaction(L, 'readwrite', (s, n) => { - const i = s - .objectStore(L) - .index('timestamp') - .openCursor(null, 'prev'), - r = [] - let a = 0 - i.onsuccess = () => { - const s = i.result - if (s) { - const n = s.value - n.cacheName === this.P && - ((t && n.timestamp < t) || (e && a >= e) - ? r.push(s.value) - : a++), - s.continue() - } else n(r) - } - }), - n = [] - for (const t of s) await this._.delete(L, t.id), n.push(t.url) - return n - } - K(t) { - return this.P + '|' + N(t) - } - } - class E { - constructor(t, e = {}) { - ;(this.O = !1), - (this.W = !1), - (this.M = e.maxEntries), - (this.A = e.maxAgeSeconds), - (this.S = e.matchOptions), - (this.P = t), - (this.I = new C(t)) - } - async expireEntries() { - if (this.O) return void (this.W = !0) - this.O = !0 - const t = this.A ? Date.now() - 1e3 * this.A : 0, - e = await this.I.expireEntries(t, this.M), - s = await self.caches.open(this.P) - for (const t of e) await s.delete(t, this.S) - ;(this.O = !1), this.W && ((this.W = !1), U(this.expireEntries())) - } - async updateTimestamp(t) { - await this.I.setTimestamp(t, Date.now()) - } - async isURLExpired(t) { - if (this.A) { - return (await this.I.getTimestamp(t)) < Date.now() - 1e3 * this.A - } - return !1 - } - async delete() { - ;(this.W = !1), await this.I.expireEntries(1 / 0) - } - } - function D(t, e) { - const s = e() - return t.waitUntil(s), s - } - try { - self['workbox:precaching:6.1.5'] && _() - } catch (t) {} - function T(t) { - if (!t) throw new s('add-to-cache-list-unexpected-type', { entry: t }) - if ('string' == typeof t) { - const e = new URL(t, location.href) - return { cacheKey: e.href, url: e.href } - } - const { revision: e, url: n } = t - if (!n) throw new s('add-to-cache-list-unexpected-type', { entry: t }) - if (!e) { - const t = new URL(n, location.href) - return { cacheKey: t.href, url: t.href } - } - const i = new URL(n, location.href), - r = new URL(n, location.href) - return ( - i.searchParams.set('__WB_REVISION__', e), - { cacheKey: i.href, url: r.href } - ) - } - class P { - constructor() { - ;(this.updatedURLs = []), - (this.notUpdatedURLs = []), - (this.handlerWillStart = async ({ request: t, state: e }) => { - e && (e.originalRequest = t) - }), - (this.cachedResponseWillBeUsed = async ({ - event: t, - state: e, - cachedResponse: s, - }) => { - if ('install' === t.type) { - const t = e.originalRequest.url - s ? this.notUpdatedURLs.push(t) : this.updatedURLs.push(t) - } - return s - }) - } - } - class k { - constructor({ precacheController: t }) { - ;(this.cacheKeyWillBeUsed = async ({ request: t, params: e }) => { - const s = (e && e.cacheKey) || this.j.getCacheKeyForURL(t.url) - return s ? new Request(s) : t - }), - (this.j = t) - } - } - let K, O - async function W(t, e) { - let n = null - if (t.url) { - n = new URL(t.url).origin - } - if (n !== self.location.origin) - throw new s('cross-origin-copy-response', { origin: n }) - const i = t.clone(), - r = { - headers: new Headers(i.headers), - status: i.status, - statusText: i.statusText, - }, - a = e ? e(r) : r, - c = (function () { - if (void 0 === K) { - const t = new Response('') - if ('body' in t) - try { - new Response(t.body), (K = !0) - } catch (t) { - K = !1 - } - K = !1 - } - return K - })() - ? i.body - : await i.blob() - return new Response(c, a) - } - class M extends q { - constructor(t = {}) { - ;(t.cacheName = w(t.cacheName)), - super(t), - (this.F = !1 !== t.fallbackToNetwork), - this.plugins.push(M.copyRedirectedCacheableResponsesPlugin) - } - async U(t, e) { - const s = await e.cacheMatch(t) - return ( - s || - (e.event && 'install' === e.event.type - ? await this.B(t, e) - : await this.H(t, e)) - ) - } - async H(t, e) { - let n - if (!this.F) - throw new s('missing-precache-entry', { - cacheName: this.cacheName, - url: t.url, - }) - return (n = await e.fetch(t)), n - } - async B(t, e) { - this.$() - const n = await e.fetch(t) - if (!(await e.cachePut(t, n.clone()))) - throw new s('bad-precaching-response', { url: t.url, status: n.status }) - return n - } - $() { - let t = null, - e = 0 - for (const [s, n] of this.plugins.entries()) - n !== M.copyRedirectedCacheableResponsesPlugin && - (n === M.defaultPrecacheCacheabilityPlugin && (t = s), - n.cacheWillUpdate && e++) - 0 === e - ? this.plugins.push(M.defaultPrecacheCacheabilityPlugin) - : e > 1 && null !== t && this.plugins.splice(t, 1) - } - } - ;(M.defaultPrecacheCacheabilityPlugin = { - cacheWillUpdate: async ({ response: t }) => - !t || t.status >= 400 ? null : t, - }), - (M.copyRedirectedCacheableResponsesPlugin = { - cacheWillUpdate: async ({ response: t }) => - t.redirected ? await W(t) : t, - }) - class A { - constructor({ - cacheName: t, - plugins: e = [], - fallbackToNetwork: s = !0, - } = {}) { - ;(this.G = new Map()), - (this.V = new Map()), - (this.J = new Map()), - (this.u = new M({ - cacheName: w(t), - plugins: [...e, new k({ precacheController: this })], - fallbackToNetwork: s, - })), - (this.install = this.install.bind(this)), - (this.activate = this.activate.bind(this)) - } - get strategy() { - return this.u - } - precache(t) { - this.addToCacheList(t), - this.X || - (self.addEventListener('install', this.install), - self.addEventListener('activate', this.activate), - (this.X = !0)) - } - addToCacheList(t) { - const e = [] - for (const n of t) { - 'string' == typeof n - ? e.push(n) - : n && void 0 === n.revision && e.push(n.url) - const { cacheKey: t, url: i } = T(n), - r = 'string' != typeof n && n.revision ? 'reload' : 'default' - if (this.G.has(i) && this.G.get(i) !== t) - throw new s('add-to-cache-list-conflicting-entries', { - firstEntry: this.G.get(i), - secondEntry: t, - }) - if ('string' != typeof n && n.integrity) { - if (this.J.has(t) && this.J.get(t) !== n.integrity) - throw new s('add-to-cache-list-conflicting-integrities', { url: i }) - this.J.set(t, n.integrity) - } - if ((this.G.set(i, t), this.V.set(i, r), e.length > 0)) { - const t = `Workbox is precaching URLs without revision info: ${e.join( - ', ' - )}\nThis is generally NOT safe. Learn more at https://bit.ly/wb-precache` - console.warn(t) - } - } - } - install(t) { - return D(t, async () => { - const e = new P() - this.strategy.plugins.push(e) - for (const [e, s] of this.G) { - const n = this.J.get(s), - i = this.V.get(e), - r = new Request(e, { - integrity: n, - cache: i, - credentials: 'same-origin', - }) - await Promise.all( - this.strategy.handleAll({ - params: { cacheKey: s }, - request: r, - event: t, - }) - ) - } - const { updatedURLs: s, notUpdatedURLs: n } = e - return { updatedURLs: s, notUpdatedURLs: n } - }) - } - activate(t) { - return D(t, async () => { - const t = await self.caches.open(this.strategy.cacheName), - e = await t.keys(), - s = new Set(this.G.values()), - n = [] - for (const i of e) s.has(i.url) || (await t.delete(i), n.push(i.url)) - return { deletedURLs: n } - }) - } - getURLsToCacheKeys() { - return this.G - } - getCachedURLs() { - return [...this.G.keys()] - } - getCacheKeyForURL(t) { - const e = new URL(t, location.href) - return this.G.get(e.href) - } - async matchPrecache(t) { - const e = t instanceof Request ? t.url : t, - s = this.getCacheKeyForURL(e) - if (s) { - return (await self.caches.open(this.strategy.cacheName)).match(s) - } - } - createHandlerBoundToURL(t) { - const e = this.getCacheKeyForURL(t) - if (!e) throw new s('non-precached-url', { url: t }) - return (s) => ( - (s.request = new Request(t)), - (s.params = p({ cacheKey: e }, s.params)), - this.strategy.handle(s) - ) - } - } - const S = () => (O || (O = new A()), O) - class I extends i { - constructor(t, e) { - super(({ request: s }) => { - const n = t.getURLsToCacheKeys() - for (const t of (function* ( - t, - { - ignoreURLParametersMatching: e = [/^utm_/, /^fbclid$/], - directoryIndex: s = 'index.html', - cleanURLs: n = !0, - urlManipulation: i, - } = {} - ) { - const r = new URL(t, location.href) - ;(r.hash = ''), yield r.href - const a = (function (t, e = []) { - for (const s of [...t.searchParams.keys()]) - e.some((t) => t.test(s)) && t.searchParams.delete(s) - return t - })(r, e) - if ((yield a.href, s && a.pathname.endsWith('/'))) { - const t = new URL(a.href) - ;(t.pathname += s), yield t.href - } - if (n) { - const t = new URL(a.href) - ;(t.pathname += '.html'), yield t.href - } - if (i) { - const t = i({ url: r }) - for (const e of t) yield e.href - } - })(s.url, e)) { - const e = n.get(t) - if (e) return { cacheKey: e } - } - }, t.strategy) - } - } - ;(t.CacheFirst = class extends q { - async U(t, e) { - let n, - i = await e.cacheMatch(t) - if (!i) - try { - i = await e.fetchAndCachePut(t) - } catch (t) { - n = t - } - if (!i) throw new s('no-response', { url: t.url, error: n }) - return i - } - }), - (t.ExpirationPlugin = class { - constructor(t = {}) { - var e - ;(this.cachedResponseWillBeUsed = async ({ - event: t, - request: e, - cacheName: s, - cachedResponse: n, - }) => { - if (!n) return null - const i = this.Y(n), - r = this.Z(s) - U(r.expireEntries()) - const a = r.updateTimestamp(e.url) - if (t) - try { - t.waitUntil(a) - } catch (t) {} - return i ? n : null - }), - (this.cacheDidUpdate = async ({ cacheName: t, request: e }) => { - const s = this.Z(t) - await s.updateTimestamp(e.url), await s.expireEntries() - }), - (this.tt = t), - (this.A = t.maxAgeSeconds), - (this.et = new Map()), - t.purgeOnQuotaError && - ((e = () => this.deleteCacheAndMetadata()), g.add(e)) - } - Z(t) { - if (t === d()) throw new s('expire-custom-caches-only') - let e = this.et.get(t) - return e || ((e = new E(t, this.tt)), this.et.set(t, e)), e - } - Y(t) { - if (!this.A) return !0 - const e = this.st(t) - if (null === e) return !0 - return e >= Date.now() - 1e3 * this.A - } - st(t) { - if (!t.headers.has('date')) return null - const e = t.headers.get('date'), - s = new Date(e).getTime() - return isNaN(s) ? null : s - } - async deleteCacheAndMetadata() { - for (const [t, e] of this.et) - await self.caches.delete(t), await e.delete() - this.et = new Map() - } - }), - (t.NetworkFirst = class extends q { - constructor(t = {}) { - super(t), - this.plugins.some((t) => 'cacheWillUpdate' in t) || - this.plugins.unshift(u), - (this.nt = t.networkTimeoutSeconds || 0) - } - async U(t, e) { - const n = [], - i = [] - let r - if (this.nt) { - const { id: s, promise: a } = this.it({ - request: t, - logs: n, - handler: e, - }) - ;(r = s), i.push(a) - } - const a = this.rt({ timeoutId: r, request: t, logs: n, handler: e }) - i.push(a) - const c = await e.waitUntil( - (async () => (await e.waitUntil(Promise.race(i))) || (await a))() - ) - if (!c) throw new s('no-response', { url: t.url }) - return c - } - it({ request: t, logs: e, handler: s }) { - let n - return { - promise: new Promise((e) => { - n = setTimeout(async () => { - e(await s.cacheMatch(t)) - }, 1e3 * this.nt) - }), - id: n, - } - } - async rt({ timeoutId: t, request: e, logs: s, handler: n }) { - let i, r - try { - r = await n.fetchAndCachePut(e) - } catch (t) { - i = t - } - return t && clearTimeout(t), (!i && r) || (r = await n.cacheMatch(e)), r - } - }), - (t.StaleWhileRevalidate = class extends q { - constructor(t) { - super(t), - this.plugins.some((t) => 'cacheWillUpdate' in t) || - this.plugins.unshift(u) - } - async U(t, e) { - const n = e.fetchAndCachePut(t).catch(() => {}) - let i, - r = await e.cacheMatch(t) - if (r); - else - try { - r = await n - } catch (t) { - i = t - } - if (!r) throw new s('no-response', { url: t.url, error: i }) - return r - } - }), - (t.cleanupOutdatedCaches = function () { - self.addEventListener('activate', (t) => { - const e = w() - t.waitUntil( - (async (t, e = '-precache-') => { - const s = (await self.caches.keys()).filter( - (s) => - s.includes(e) && s.includes(self.registration.scope) && s !== t - ) - return await Promise.all(s.map((t) => self.caches.delete(t))), s - })(e).then((t) => {}) - ) - }) - }), - (t.clientsClaim = function () { - self.addEventListener('activate', () => self.clients.claim()) - }), - (t.precacheAndRoute = function (t, e) { - !(function (t) { - S().precache(t) - })(t), - (function (t) { - const e = S() - h(new I(e, t)) - })(e) - }), - (t.registerRoute = h) -}) -//# sourceMappingURL=workbox-ea903bce.js.map diff --git a/public/workbox-ea903bce.js.map b/public/workbox-ea903bce.js.map deleted file mode 100644 index d4f418750..000000000 --- a/public/workbox-ea903bce.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"workbox-ea903bce.js","sources":["node_modules/workbox-core/_version.js","node_modules/workbox-core/_private/logger.js","node_modules/workbox-core/models/messages/messageGenerator.js","node_modules/workbox-core/_private/WorkboxError.js","node_modules/workbox-routing/_version.js","node_modules/workbox-routing/utils/constants.js","node_modules/workbox-routing/utils/normalizeHandler.js","node_modules/workbox-routing/Route.js","node_modules/workbox-routing/RegExpRoute.js","node_modules/workbox-routing/Router.js","node_modules/workbox-routing/utils/getOrCreateDefaultRouter.js","node_modules/workbox-routing/registerRoute.js","node_modules/workbox-strategies/_version.js","node_modules/workbox-strategies/plugins/cacheOkAndOpaquePlugin.js","node_modules/workbox-core/_private/cacheNames.js","node_modules/workbox-core/_private/cacheMatchIgnoreParams.js","node_modules/workbox-core/_private/Deferred.js","node_modules/workbox-core/models/quotaErrorCallbacks.js","node_modules/workbox-strategies/StrategyHandler.js","node_modules/workbox-core/_private/timeout.js","node_modules/workbox-core/_private/getFriendlyURL.js","node_modules/workbox-core/_private/executeQuotaErrorCallbacks.js","node_modules/workbox-strategies/Strategy.js","node_modules/workbox-core/_private/dontWaitFor.js","node_modules/workbox-core/_private/DBWrapper.js","node_modules/workbox-expiration/_version.js","node_modules/workbox-expiration/models/CacheTimestampsModel.js","node_modules/workbox-core/_private/deleteDatabase.js","node_modules/workbox-expiration/CacheExpiration.js","node_modules/workbox-core/_private/waitUntil.js","node_modules/workbox-precaching/_version.js","node_modules/workbox-precaching/utils/createCacheKey.js","node_modules/workbox-precaching/utils/PrecacheInstallReportPlugin.js","node_modules/workbox-precaching/utils/PrecacheCacheKeyPlugin.js","node_modules/workbox-core/_private/canConstructResponseFromBodyStream.js","node_modules/workbox-precaching/utils/getOrCreatePrecacheController.js","node_modules/workbox-core/copyResponse.js","node_modules/workbox-precaching/PrecacheStrategy.js","node_modules/workbox-precaching/PrecacheController.js","node_modules/workbox-precaching/PrecacheRoute.js","node_modules/workbox-precaching/utils/generateURLVariations.js","node_modules/workbox-precaching/utils/removeIgnoredSearchParams.js","node_modules/workbox-strategies/CacheFirst.js","node_modules/workbox-expiration/ExpirationPlugin.js","node_modules/workbox-core/registerQuotaErrorCallback.js","node_modules/workbox-strategies/NetworkFirst.js","node_modules/workbox-strategies/StaleWhileRevalidate.js","node_modules/workbox-precaching/cleanupOutdatedCaches.js","node_modules/workbox-precaching/utils/deleteOutdatedCaches.js","node_modules/workbox-core/clientsClaim.js","node_modules/workbox-precaching/precacheAndRoute.js","node_modules/workbox-precaching/precache.js","node_modules/workbox-precaching/addRoute.js"],"sourcesContent":["\"use strict\";\n// @ts-ignore\ntry {\n self['workbox:core:6.1.5'] && _();\n}\ncatch (e) { }\n","/*\n Copyright 2019 Google LLC\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\nimport '../_version.js';\nconst logger = (process.env.NODE_ENV === 'production' ? null : (() => {\n // Don't overwrite this value if it's already set.\n // See https://github.com/GoogleChrome/workbox/pull/2284#issuecomment-560470923\n if (!('__WB_DISABLE_DEV_LOGS' in self)) {\n self.__WB_DISABLE_DEV_LOGS = false;\n }\n let inGroup = false;\n const methodToColorMap = {\n debug: `#7f8c8d`,\n log: `#2ecc71`,\n warn: `#f39c12`,\n error: `#c0392b`,\n groupCollapsed: `#3498db`,\n groupEnd: null,\n };\n const print = function (method, args) {\n if (self.__WB_DISABLE_DEV_LOGS) {\n return;\n }\n if (method === 'groupCollapsed') {\n // Safari doesn't print all console.groupCollapsed() arguments:\n // https://bugs.webkit.org/show_bug.cgi?id=182754\n if (/^((?!chrome|android).)*safari/i.test(navigator.userAgent)) {\n console[method](...args);\n return;\n }\n }\n const styles = [\n `background: ${methodToColorMap[method]}`,\n `border-radius: 0.5em`,\n `color: white`,\n `font-weight: bold`,\n `padding: 2px 0.5em`,\n ];\n // When in a group, the workbox prefix is not displayed.\n const logPrefix = inGroup ? [] : ['%cworkbox', styles.join(';')];\n console[method](...logPrefix, ...args);\n if (method === 'groupCollapsed') {\n inGroup = true;\n }\n if (method === 'groupEnd') {\n inGroup = false;\n }\n };\n const api = {};\n const loggerMethods = Object.keys(methodToColorMap);\n for (const key of loggerMethods) {\n const method = key;\n api[method] = (...args) => {\n print(method, args);\n };\n }\n return api;\n})());\nexport { logger };\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\nimport { messages } from './messages.js';\nimport '../../_version.js';\nconst fallback = (code, ...args) => {\n let msg = code;\n if (args.length > 0) {\n msg += ` :: ${JSON.stringify(args)}`;\n }\n return msg;\n};\nconst generatorFunction = (code, details = {}) => {\n const message = messages[code];\n if (!message) {\n throw new Error(`Unable to find message for code '${code}'.`);\n }\n return message(details);\n};\nexport const messageGenerator = (process.env.NODE_ENV === 'production') ?\n fallback : generatorFunction;\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\nimport { messageGenerator } from '../models/messages/messageGenerator.js';\nimport '../_version.js';\n/**\n * Workbox errors should be thrown with this class.\n * This allows use to ensure the type easily in tests,\n * helps developers identify errors from workbox\n * easily and allows use to optimise error\n * messages correctly.\n *\n * @private\n */\nclass WorkboxError extends Error {\n /**\n *\n * @param {string} errorCode The error code that\n * identifies this particular error.\n * @param {Object=} details Any relevant arguments\n * that will help developers identify issues should\n * be added as a key on the context object.\n */\n constructor(errorCode, details) {\n const message = messageGenerator(errorCode, details);\n super(message);\n this.name = errorCode;\n this.details = details;\n }\n}\nexport { WorkboxError };\n","\"use strict\";\n// @ts-ignore\ntry {\n self['workbox:routing:6.1.5'] && _();\n}\ncatch (e) { }\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\nimport '../_version.js';\n/**\n * The default HTTP method, 'GET', used when there's no specific method\n * configured for a route.\n *\n * @type {string}\n *\n * @private\n */\nexport const defaultMethod = 'GET';\n/**\n * The list of valid HTTP methods associated with requests that could be routed.\n *\n * @type {Array}\n *\n * @private\n */\nexport const validMethods = [\n 'DELETE',\n 'GET',\n 'HEAD',\n 'PATCH',\n 'POST',\n 'PUT',\n];\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\nimport { assert } from 'workbox-core/_private/assert.js';\nimport '../_version.js';\n/**\n * @param {function()|Object} handler Either a function, or an object with a\n * 'handle' method.\n * @return {Object} An object with a handle method.\n *\n * @private\n */\nexport const normalizeHandler = (handler) => {\n if (handler && typeof handler === 'object') {\n if (process.env.NODE_ENV !== 'production') {\n assert.hasMethod(handler, 'handle', {\n moduleName: 'workbox-routing',\n className: 'Route',\n funcName: 'constructor',\n paramName: 'handler',\n });\n }\n return handler;\n }\n else {\n if (process.env.NODE_ENV !== 'production') {\n assert.isType(handler, 'function', {\n moduleName: 'workbox-routing',\n className: 'Route',\n funcName: 'constructor',\n paramName: 'handler',\n });\n }\n return { handle: handler };\n }\n};\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\nimport { assert } from 'workbox-core/_private/assert.js';\nimport { defaultMethod, validMethods } from './utils/constants.js';\nimport { normalizeHandler } from './utils/normalizeHandler.js';\nimport './_version.js';\n/**\n * A `Route` consists of a pair of callback functions, \"match\" and \"handler\".\n * The \"match\" callback determine if a route should be used to \"handle\" a\n * request by returning a non-falsy value if it can. The \"handler\" callback\n * is called when there is a match and should return a Promise that resolves\n * to a `Response`.\n *\n * @memberof module:workbox-routing\n */\nclass Route {\n /**\n * Constructor for Route class.\n *\n * @param {module:workbox-routing~matchCallback} match\n * A callback function that determines whether the route matches a given\n * `fetch` event by returning a non-falsy value.\n * @param {module:workbox-routing~handlerCallback} handler A callback\n * function that returns a Promise resolving to a Response.\n * @param {string} [method='GET'] The HTTP method to match the Route\n * against.\n */\n constructor(match, handler, method = defaultMethod) {\n if (process.env.NODE_ENV !== 'production') {\n assert.isType(match, 'function', {\n moduleName: 'workbox-routing',\n className: 'Route',\n funcName: 'constructor',\n paramName: 'match',\n });\n if (method) {\n assert.isOneOf(method, validMethods, { paramName: 'method' });\n }\n }\n // These values are referenced directly by Router so cannot be\n // altered by minificaton.\n this.handler = normalizeHandler(handler);\n this.match = match;\n this.method = method;\n }\n /**\n *\n * @param {module:workbox-routing-handlerCallback} handler A callback\n * function that returns a Promise resolving to a Response\n */\n setCatchHandler(handler) {\n this.catchHandler = normalizeHandler(handler);\n }\n}\nexport { Route };\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\nimport { assert } from 'workbox-core/_private/assert.js';\nimport { logger } from 'workbox-core/_private/logger.js';\nimport { Route } from './Route.js';\nimport './_version.js';\n/**\n * RegExpRoute makes it easy to create a regular expression based\n * [Route]{@link module:workbox-routing.Route}.\n *\n * For same-origin requests the RegExp only needs to match part of the URL. For\n * requests against third-party servers, you must define a RegExp that matches\n * the start of the URL.\n *\n * [See the module docs for info.]{@link https://developers.google.com/web/tools/workbox/modules/workbox-routing}\n *\n * @memberof module:workbox-routing\n * @extends module:workbox-routing.Route\n */\nclass RegExpRoute extends Route {\n /**\n * If the regular expression contains\n * [capture groups]{@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp#grouping-back-references},\n * the captured values will be passed to the\n * [handler's]{@link module:workbox-routing~handlerCallback} `params`\n * argument.\n *\n * @param {RegExp} regExp The regular expression to match against URLs.\n * @param {module:workbox-routing~handlerCallback} handler A callback\n * function that returns a Promise resulting in a Response.\n * @param {string} [method='GET'] The HTTP method to match the Route\n * against.\n */\n constructor(regExp, handler, method) {\n if (process.env.NODE_ENV !== 'production') {\n assert.isInstance(regExp, RegExp, {\n moduleName: 'workbox-routing',\n className: 'RegExpRoute',\n funcName: 'constructor',\n paramName: 'pattern',\n });\n }\n const match = ({ url }) => {\n const result = regExp.exec(url.href);\n // Return immediately if there's no match.\n if (!result) {\n return;\n }\n // Require that the match start at the first character in the URL string\n // if it's a cross-origin request.\n // See https://github.com/GoogleChrome/workbox/issues/281 for the context\n // behind this behavior.\n if ((url.origin !== location.origin) && (result.index !== 0)) {\n if (process.env.NODE_ENV !== 'production') {\n logger.debug(`The regular expression '${regExp}' only partially matched ` +\n `against the cross-origin URL '${url}'. RegExpRoute's will only ` +\n `handle cross-origin requests if they match the entire URL.`);\n }\n return;\n }\n // If the route matches, but there aren't any capture groups defined, then\n // this will return [], which is truthy and therefore sufficient to\n // indicate a match.\n // If there are capture groups, then it will return their values.\n return result.slice(1);\n };\n super(match, handler, method);\n }\n}\nexport { RegExpRoute };\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\nimport { assert } from 'workbox-core/_private/assert.js';\nimport { getFriendlyURL } from 'workbox-core/_private/getFriendlyURL.js';\nimport { defaultMethod } from './utils/constants.js';\nimport { logger } from 'workbox-core/_private/logger.js';\nimport { normalizeHandler } from './utils/normalizeHandler.js';\nimport { WorkboxError } from 'workbox-core/_private/WorkboxError.js';\nimport './_version.js';\n/**\n * The Router can be used to process a FetchEvent through one or more\n * [Routes]{@link module:workbox-routing.Route} responding with a Request if\n * a matching route exists.\n *\n * If no route matches a given a request, the Router will use a \"default\"\n * handler if one is defined.\n *\n * Should the matching Route throw an error, the Router will use a \"catch\"\n * handler if one is defined to gracefully deal with issues and respond with a\n * Request.\n *\n * If a request matches multiple routes, the **earliest** registered route will\n * be used to respond to the request.\n *\n * @memberof module:workbox-routing\n */\nclass Router {\n /**\n * Initializes a new Router.\n */\n constructor() {\n this._routes = new Map();\n this._defaultHandlerMap = new Map();\n }\n /**\n * @return {Map>} routes A `Map` of HTTP\n * method name ('GET', etc.) to an array of all the corresponding `Route`\n * instances that are registered.\n */\n get routes() {\n return this._routes;\n }\n /**\n * Adds a fetch event listener to respond to events when a route matches\n * the event's request.\n */\n addFetchListener() {\n // See https://github.com/Microsoft/TypeScript/issues/28357#issuecomment-436484705\n self.addEventListener('fetch', ((event) => {\n const { request } = event;\n const responsePromise = this.handleRequest({ request, event });\n if (responsePromise) {\n event.respondWith(responsePromise);\n }\n }));\n }\n /**\n * Adds a message event listener for URLs to cache from the window.\n * This is useful to cache resources loaded on the page prior to when the\n * service worker started controlling it.\n *\n * The format of the message data sent from the window should be as follows.\n * Where the `urlsToCache` array may consist of URL strings or an array of\n * URL string + `requestInit` object (the same as you'd pass to `fetch()`).\n *\n * ```\n * {\n * type: 'CACHE_URLS',\n * payload: {\n * urlsToCache: [\n * './script1.js',\n * './script2.js',\n * ['./script3.js', {mode: 'no-cors'}],\n * ],\n * },\n * }\n * ```\n */\n addCacheListener() {\n // See https://github.com/Microsoft/TypeScript/issues/28357#issuecomment-436484705\n self.addEventListener('message', ((event) => {\n if (event.data && event.data.type === 'CACHE_URLS') {\n const { payload } = event.data;\n if (process.env.NODE_ENV !== 'production') {\n logger.debug(`Caching URLs from the window`, payload.urlsToCache);\n }\n const requestPromises = Promise.all(payload.urlsToCache.map((entry) => {\n if (typeof entry === 'string') {\n entry = [entry];\n }\n const request = new Request(...entry);\n return this.handleRequest({ request, event });\n // TODO(philipwalton): TypeScript errors without this typecast for\n // some reason (probably a bug). The real type here should work but\n // doesn't: `Array | undefined>`.\n })); // TypeScript\n event.waitUntil(requestPromises);\n // If a MessageChannel was used, reply to the message on success.\n if (event.ports && event.ports[0]) {\n requestPromises.then(() => event.ports[0].postMessage(true));\n }\n }\n }));\n }\n /**\n * Apply the routing rules to a FetchEvent object to get a Response from an\n * appropriate Route's handler.\n *\n * @param {Object} options\n * @param {Request} options.request The request to handle.\n * @param {ExtendableEvent} options.event The event that triggered the\n * request.\n * @return {Promise|undefined} A promise is returned if a\n * registered route can handle the request. If there is no matching\n * route and there's no `defaultHandler`, `undefined` is returned.\n */\n handleRequest({ request, event }) {\n if (process.env.NODE_ENV !== 'production') {\n assert.isInstance(request, Request, {\n moduleName: 'workbox-routing',\n className: 'Router',\n funcName: 'handleRequest',\n paramName: 'options.request',\n });\n }\n const url = new URL(request.url, location.href);\n if (!url.protocol.startsWith('http')) {\n if (process.env.NODE_ENV !== 'production') {\n logger.debug(`Workbox Router only supports URLs that start with 'http'.`);\n }\n return;\n }\n const sameOrigin = url.origin === location.origin;\n const { params, route } = this.findMatchingRoute({\n event,\n request,\n sameOrigin,\n url,\n });\n let handler = route && route.handler;\n const debugMessages = [];\n if (process.env.NODE_ENV !== 'production') {\n if (handler) {\n debugMessages.push([\n `Found a route to handle this request:`, route,\n ]);\n if (params) {\n debugMessages.push([\n `Passing the following params to the route's handler:`, params,\n ]);\n }\n }\n }\n // If we don't have a handler because there was no matching route, then\n // fall back to defaultHandler if that's defined.\n const method = request.method;\n if (!handler && this._defaultHandlerMap.has(method)) {\n if (process.env.NODE_ENV !== 'production') {\n debugMessages.push(`Failed to find a matching route. Falling ` +\n `back to the default handler for ${method}.`);\n }\n handler = this._defaultHandlerMap.get(method);\n }\n if (!handler) {\n if (process.env.NODE_ENV !== 'production') {\n // No handler so Workbox will do nothing. If logs is set of debug\n // i.e. verbose, we should print out this information.\n logger.debug(`No route found for: ${getFriendlyURL(url)}`);\n }\n return;\n }\n if (process.env.NODE_ENV !== 'production') {\n // We have a handler, meaning Workbox is going to handle the route.\n // print the routing details to the console.\n logger.groupCollapsed(`Router is responding to: ${getFriendlyURL(url)}`);\n debugMessages.forEach((msg) => {\n if (Array.isArray(msg)) {\n logger.log(...msg);\n }\n else {\n logger.log(msg);\n }\n });\n logger.groupEnd();\n }\n // Wrap in try and catch in case the handle method throws a synchronous\n // error. It should still callback to the catch handler.\n let responsePromise;\n try {\n responsePromise = handler.handle({ url, request, event, params });\n }\n catch (err) {\n responsePromise = Promise.reject(err);\n }\n // Get route's catch handler, if it exists\n const catchHandler = route && route.catchHandler;\n if (responsePromise instanceof Promise && (this._catchHandler || catchHandler)) {\n responsePromise = responsePromise.catch(async (err) => {\n // If there's a route catch handler, process that first\n if (catchHandler) {\n if (process.env.NODE_ENV !== 'production') {\n // Still include URL here as it will be async from the console group\n // and may not make sense without the URL\n logger.groupCollapsed(`Error thrown when responding to: ` +\n ` ${getFriendlyURL(url)}. Falling back to route's Catch Handler.`);\n logger.error(`Error thrown by:`, route);\n logger.error(err);\n logger.groupEnd();\n }\n try {\n return await catchHandler.handle({ url, request, event, params });\n }\n catch (catchErr) {\n err = catchErr;\n }\n }\n if (this._catchHandler) {\n if (process.env.NODE_ENV !== 'production') {\n // Still include URL here as it will be async from the console group\n // and may not make sense without the URL\n logger.groupCollapsed(`Error thrown when responding to: ` +\n ` ${getFriendlyURL(url)}. Falling back to global Catch Handler.`);\n logger.error(`Error thrown by:`, route);\n logger.error(err);\n logger.groupEnd();\n }\n return this._catchHandler.handle({ url, request, event });\n }\n throw err;\n });\n }\n return responsePromise;\n }\n /**\n * Checks a request and URL (and optionally an event) against the list of\n * registered routes, and if there's a match, returns the corresponding\n * route along with any params generated by the match.\n *\n * @param {Object} options\n * @param {URL} options.url\n * @param {boolean} options.sameOrigin The result of comparing `url.origin`\n * against the current origin.\n * @param {Request} options.request The request to match.\n * @param {Event} options.event The corresponding event.\n * @return {Object} An object with `route` and `params` properties.\n * They are populated if a matching route was found or `undefined`\n * otherwise.\n */\n findMatchingRoute({ url, sameOrigin, request, event }) {\n const routes = this._routes.get(request.method) || [];\n for (const route of routes) {\n let params;\n const matchResult = route.match({ url, sameOrigin, request, event });\n if (matchResult) {\n if (process.env.NODE_ENV !== 'production') {\n // Warn developers that using an async matchCallback is almost always\n // not the right thing to do. \n if (matchResult instanceof Promise) {\n logger.warn(`While routing ${getFriendlyURL(url)}, an async ` +\n `matchCallback function was used. Please convert the ` +\n `following route to use a synchronous matchCallback function:`, route);\n }\n }\n // See https://github.com/GoogleChrome/workbox/issues/2079\n params = matchResult;\n if (Array.isArray(matchResult) && matchResult.length === 0) {\n // Instead of passing an empty array in as params, use undefined.\n params = undefined;\n }\n else if ((matchResult.constructor === Object &&\n Object.keys(matchResult).length === 0)) {\n // Instead of passing an empty object in as params, use undefined.\n params = undefined;\n }\n else if (typeof matchResult === 'boolean') {\n // For the boolean value true (rather than just something truth-y),\n // don't set params.\n // See https://github.com/GoogleChrome/workbox/pull/2134#issuecomment-513924353\n params = undefined;\n }\n // Return early if have a match.\n return { route, params };\n }\n }\n // If no match was found above, return and empty object.\n return {};\n }\n /**\n * Define a default `handler` that's called when no routes explicitly\n * match the incoming request.\n *\n * Each HTTP method ('GET', 'POST', etc.) gets its own default handler.\n *\n * Without a default handler, unmatched requests will go against the\n * network as if there were no service worker present.\n *\n * @param {module:workbox-routing~handlerCallback} handler A callback\n * function that returns a Promise resulting in a Response.\n * @param {string} [method='GET'] The HTTP method to associate with this\n * default handler. Each method has its own default.\n */\n setDefaultHandler(handler, method = defaultMethod) {\n this._defaultHandlerMap.set(method, normalizeHandler(handler));\n }\n /**\n * If a Route throws an error while handling a request, this `handler`\n * will be called and given a chance to provide a response.\n *\n * @param {module:workbox-routing~handlerCallback} handler A callback\n * function that returns a Promise resulting in a Response.\n */\n setCatchHandler(handler) {\n this._catchHandler = normalizeHandler(handler);\n }\n /**\n * Registers a route with the router.\n *\n * @param {module:workbox-routing.Route} route The route to register.\n */\n registerRoute(route) {\n if (process.env.NODE_ENV !== 'production') {\n assert.isType(route, 'object', {\n moduleName: 'workbox-routing',\n className: 'Router',\n funcName: 'registerRoute',\n paramName: 'route',\n });\n assert.hasMethod(route, 'match', {\n moduleName: 'workbox-routing',\n className: 'Router',\n funcName: 'registerRoute',\n paramName: 'route',\n });\n assert.isType(route.handler, 'object', {\n moduleName: 'workbox-routing',\n className: 'Router',\n funcName: 'registerRoute',\n paramName: 'route',\n });\n assert.hasMethod(route.handler, 'handle', {\n moduleName: 'workbox-routing',\n className: 'Router',\n funcName: 'registerRoute',\n paramName: 'route.handler',\n });\n assert.isType(route.method, 'string', {\n moduleName: 'workbox-routing',\n className: 'Router',\n funcName: 'registerRoute',\n paramName: 'route.method',\n });\n }\n if (!this._routes.has(route.method)) {\n this._routes.set(route.method, []);\n }\n // Give precedence to all of the earlier routes by adding this additional\n // route to the end of the array.\n this._routes.get(route.method).push(route);\n }\n /**\n * Unregisters a route with the router.\n *\n * @param {module:workbox-routing.Route} route The route to unregister.\n */\n unregisterRoute(route) {\n if (!this._routes.has(route.method)) {\n throw new WorkboxError('unregister-route-but-not-found-with-method', {\n method: route.method,\n });\n }\n const routeIndex = this._routes.get(route.method).indexOf(route);\n if (routeIndex > -1) {\n this._routes.get(route.method).splice(routeIndex, 1);\n }\n else {\n throw new WorkboxError('unregister-route-route-not-registered');\n }\n }\n}\nexport { Router };\n","/*\n Copyright 2019 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\nimport { Router } from '../Router.js';\nimport '../_version.js';\nlet defaultRouter;\n/**\n * Creates a new, singleton Router instance if one does not exist. If one\n * does already exist, that instance is returned.\n *\n * @private\n * @return {Router}\n */\nexport const getOrCreateDefaultRouter = () => {\n if (!defaultRouter) {\n defaultRouter = new Router();\n // The helpers that use the default Router assume these listeners exist.\n defaultRouter.addFetchListener();\n defaultRouter.addCacheListener();\n }\n return defaultRouter;\n};\n","/*\n Copyright 2019 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\nimport { logger } from 'workbox-core/_private/logger.js';\nimport { WorkboxError } from 'workbox-core/_private/WorkboxError.js';\nimport { Route } from './Route.js';\nimport { RegExpRoute } from './RegExpRoute.js';\nimport { getOrCreateDefaultRouter } from './utils/getOrCreateDefaultRouter.js';\nimport './_version.js';\n/**\n * Easily register a RegExp, string, or function with a caching\n * strategy to a singleton Router instance.\n *\n * This method will generate a Route for you if needed and\n * call [registerRoute()]{@link module:workbox-routing.Router#registerRoute}.\n *\n * @param {RegExp|string|module:workbox-routing.Route~matchCallback|module:workbox-routing.Route} capture\n * If the capture param is a `Route`, all other arguments will be ignored.\n * @param {module:workbox-routing~handlerCallback} [handler] A callback\n * function that returns a Promise resulting in a Response. This parameter\n * is required if `capture` is not a `Route` object.\n * @param {string} [method='GET'] The HTTP method to match the Route\n * against.\n * @return {module:workbox-routing.Route} The generated `Route`(Useful for\n * unregistering).\n *\n * @memberof module:workbox-routing\n */\nfunction registerRoute(capture, handler, method) {\n let route;\n if (typeof capture === 'string') {\n const captureUrl = new URL(capture, location.href);\n if (process.env.NODE_ENV !== 'production') {\n if (!(capture.startsWith('/') || capture.startsWith('http'))) {\n throw new WorkboxError('invalid-string', {\n moduleName: 'workbox-routing',\n funcName: 'registerRoute',\n paramName: 'capture',\n });\n }\n // We want to check if Express-style wildcards are in the pathname only.\n // TODO: Remove this log message in v4.\n const valueToCheck = capture.startsWith('http') ?\n captureUrl.pathname : capture;\n // See https://github.com/pillarjs/path-to-regexp#parameters\n const wildcards = '[*:?+]';\n if ((new RegExp(`${wildcards}`)).exec(valueToCheck)) {\n logger.debug(`The '$capture' parameter contains an Express-style wildcard ` +\n `character (${wildcards}). Strings are now always interpreted as ` +\n `exact matches; use a RegExp for partial or wildcard matches.`);\n }\n }\n const matchCallback = ({ url }) => {\n if (process.env.NODE_ENV !== 'production') {\n if ((url.pathname === captureUrl.pathname) &&\n (url.origin !== captureUrl.origin)) {\n logger.debug(`${capture} only partially matches the cross-origin URL ` +\n `${url}. This route will only handle cross-origin requests ` +\n `if they match the entire URL.`);\n }\n }\n return url.href === captureUrl.href;\n };\n // If `capture` is a string then `handler` and `method` must be present.\n route = new Route(matchCallback, handler, method);\n }\n else if (capture instanceof RegExp) {\n // If `capture` is a `RegExp` then `handler` and `method` must be present.\n route = new RegExpRoute(capture, handler, method);\n }\n else if (typeof capture === 'function') {\n // If `capture` is a function then `handler` and `method` must be present.\n route = new Route(capture, handler, method);\n }\n else if (capture instanceof Route) {\n route = capture;\n }\n else {\n throw new WorkboxError('unsupported-route-type', {\n moduleName: 'workbox-routing',\n funcName: 'registerRoute',\n paramName: 'capture',\n });\n }\n const defaultRouter = getOrCreateDefaultRouter();\n defaultRouter.registerRoute(route);\n return route;\n}\nexport { registerRoute };\n","\"use strict\";\n// @ts-ignore\ntry {\n self['workbox:strategies:6.1.5'] && _();\n}\ncatch (e) { }\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\nimport '../_version.js';\nexport const cacheOkAndOpaquePlugin = {\n /**\n * Returns a valid response (to allow caching) if the status is 200 (OK) or\n * 0 (opaque).\n *\n * @param {Object} options\n * @param {Response} options.response\n * @return {Response|null}\n *\n * @private\n */\n cacheWillUpdate: async ({ response }) => {\n if (response.status === 200 || response.status === 0) {\n return response;\n }\n return null;\n },\n};\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\nimport '../_version.js';\nconst _cacheNameDetails = {\n googleAnalytics: 'googleAnalytics',\n precache: 'precache-v2',\n prefix: 'workbox',\n runtime: 'runtime',\n suffix: typeof registration !== 'undefined' ? registration.scope : '',\n};\nconst _createCacheName = (cacheName) => {\n return [_cacheNameDetails.prefix, cacheName, _cacheNameDetails.suffix]\n .filter((value) => value && value.length > 0)\n .join('-');\n};\nconst eachCacheNameDetail = (fn) => {\n for (const key of Object.keys(_cacheNameDetails)) {\n fn(key);\n }\n};\nexport const cacheNames = {\n updateDetails: (details) => {\n eachCacheNameDetail((key) => {\n if (typeof details[key] === 'string') {\n _cacheNameDetails[key] = details[key];\n }\n });\n },\n getGoogleAnalyticsName: (userCacheName) => {\n return userCacheName || _createCacheName(_cacheNameDetails.googleAnalytics);\n },\n getPrecacheName: (userCacheName) => {\n return userCacheName || _createCacheName(_cacheNameDetails.precache);\n },\n getPrefix: () => {\n return _cacheNameDetails.prefix;\n },\n getRuntimeName: (userCacheName) => {\n return userCacheName || _createCacheName(_cacheNameDetails.runtime);\n },\n getSuffix: () => {\n return _cacheNameDetails.suffix;\n },\n};\n","/*\n Copyright 2020 Google LLC\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\nimport '../_version.js';\nfunction stripParams(fullURL, ignoreParams) {\n const strippedURL = new URL(fullURL);\n for (const param of ignoreParams) {\n strippedURL.searchParams.delete(param);\n }\n return strippedURL.href;\n}\n/**\n * Matches an item in the cache, ignoring specific URL params. This is similar\n * to the `ignoreSearch` option, but it allows you to ignore just specific\n * params (while continuing to match on the others).\n *\n * @private\n * @param {Cache} cache\n * @param {Request} request\n * @param {Object} matchOptions\n * @param {Array} ignoreParams\n * @return {Promise}\n */\nasync function cacheMatchIgnoreParams(cache, request, ignoreParams, matchOptions) {\n const strippedRequestURL = stripParams(request.url, ignoreParams);\n // If the request doesn't include any ignored params, match as normal.\n if (request.url === strippedRequestURL) {\n return cache.match(request, matchOptions);\n }\n // Otherwise, match by comparing keys\n const keysOptions = { ...matchOptions, ignoreSearch: true };\n const cacheKeys = await cache.keys(request, keysOptions);\n for (const cacheKey of cacheKeys) {\n const strippedCacheKeyURL = stripParams(cacheKey.url, ignoreParams);\n if (strippedRequestURL === strippedCacheKeyURL) {\n return cache.match(cacheKey, matchOptions);\n }\n }\n return;\n}\nexport { cacheMatchIgnoreParams };\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\nimport '../_version.js';\n/**\n * The Deferred class composes Promises in a way that allows for them to be\n * resolved or rejected from outside the constructor. In most cases promises\n * should be used directly, but Deferreds can be necessary when the logic to\n * resolve a promise must be separate.\n *\n * @private\n */\nclass Deferred {\n /**\n * Creates a promise and exposes its resolve and reject functions as methods.\n */\n constructor() {\n this.promise = new Promise((resolve, reject) => {\n this.resolve = resolve;\n this.reject = reject;\n });\n }\n}\nexport { Deferred };\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\nimport '../_version.js';\n// Callbacks to be executed whenever there's a quota error.\nconst quotaErrorCallbacks = new Set();\nexport { quotaErrorCallbacks };\n","/*\n Copyright 2020 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\nimport { assert } from 'workbox-core/_private/assert.js';\nimport { cacheMatchIgnoreParams } from 'workbox-core/_private/cacheMatchIgnoreParams.js';\nimport { Deferred } from 'workbox-core/_private/Deferred.js';\nimport { executeQuotaErrorCallbacks } from 'workbox-core/_private/executeQuotaErrorCallbacks.js';\nimport { getFriendlyURL } from 'workbox-core/_private/getFriendlyURL.js';\nimport { logger } from 'workbox-core/_private/logger.js';\nimport { timeout } from 'workbox-core/_private/timeout.js';\nimport { WorkboxError } from 'workbox-core/_private/WorkboxError.js';\nimport './_version.js';\nfunction toRequest(input) {\n return (typeof input === 'string') ? new Request(input) : input;\n}\n/**\n * A class created every time a Strategy instance instance calls\n * [handle()]{@link module:workbox-strategies.Strategy~handle} or\n * [handleAll()]{@link module:workbox-strategies.Strategy~handleAll} that wraps all fetch and\n * cache actions around plugin callbacks and keeps track of when the strategy\n * is \"done\" (i.e. all added `event.waitUntil()` promises have resolved).\n *\n * @memberof module:workbox-strategies\n */\nclass StrategyHandler {\n /**\n * Creates a new instance associated with the passed strategy and event\n * that's handling the request.\n *\n * The constructor also initializes the state that will be passed to each of\n * the plugins handling this request.\n *\n * @param {module:workbox-strategies.Strategy} strategy\n * @param {Object} options\n * @param {Request|string} options.request A request to run this strategy for.\n * @param {ExtendableEvent} options.event The event associated with the\n * request.\n * @param {URL} [options.url]\n * @param {*} [options.params]\n * [match callback]{@link module:workbox-routing~matchCallback},\n * (if applicable).\n */\n constructor(strategy, options) {\n this._cacheKeys = {};\n /**\n * The request the strategy is performing (passed to the strategy's\n * `handle()` or `handleAll()` method).\n * @name request\n * @instance\n * @type {Request}\n * @memberof module:workbox-strategies.StrategyHandler\n */\n /**\n * The event associated with this request.\n * @name event\n * @instance\n * @type {ExtendableEvent}\n * @memberof module:workbox-strategies.StrategyHandler\n */\n /**\n * A `URL` instance of `request.url` (if passed to the strategy's\n * `handle()` or `handleAll()` method).\n * Note: the `url` param will be present if the strategy was invoked\n * from a workbox `Route` object.\n * @name url\n * @instance\n * @type {URL|undefined}\n * @memberof module:workbox-strategies.StrategyHandler\n */\n /**\n * A `param` value (if passed to the strategy's\n * `handle()` or `handleAll()` method).\n * Note: the `param` param will be present if the strategy was invoked\n * from a workbox `Route` object and the\n * [match callback]{@link module:workbox-routing~matchCallback} returned\n * a truthy value (it will be that value).\n * @name params\n * @instance\n * @type {*|undefined}\n * @memberof module:workbox-strategies.StrategyHandler\n */\n if (process.env.NODE_ENV !== 'production') {\n assert.isInstance(options.event, ExtendableEvent, {\n moduleName: 'workbox-strategies',\n className: 'StrategyHandler',\n funcName: 'constructor',\n paramName: 'options.event',\n });\n }\n Object.assign(this, options);\n this.event = options.event;\n this._strategy = strategy;\n this._handlerDeferred = new Deferred();\n this._extendLifetimePromises = [];\n // Copy the plugins list (since it's mutable on the strategy),\n // so any mutations don't affect this handler instance.\n this._plugins = [...strategy.plugins];\n this._pluginStateMap = new Map();\n for (const plugin of this._plugins) {\n this._pluginStateMap.set(plugin, {});\n }\n this.event.waitUntil(this._handlerDeferred.promise);\n }\n /**\n * Fetches a given request (and invokes any applicable plugin callback\n * methods) using the `fetchOptions` (for non-navigation requests) and\n * `plugins` defined on the `Strategy` object.\n *\n * The following plugin lifecycle methods are invoked when using this method:\n * - `requestWillFetch()`\n * - `fetchDidSucceed()`\n * - `fetchDidFail()`\n *\n * @param {Request|string} input The URL or request to fetch.\n * @return {Promise}\n */\n async fetch(input) {\n const { event } = this;\n let request = toRequest(input);\n if (request.mode === 'navigate' &&\n event instanceof FetchEvent &&\n event.preloadResponse) {\n const possiblePreloadResponse = await event.preloadResponse;\n if (possiblePreloadResponse) {\n if (process.env.NODE_ENV !== 'production') {\n logger.log(`Using a preloaded navigation response for ` +\n `'${getFriendlyURL(request.url)}'`);\n }\n return possiblePreloadResponse;\n }\n }\n // If there is a fetchDidFail plugin, we need to save a clone of the\n // original request before it's either modified by a requestWillFetch\n // plugin or before the original request's body is consumed via fetch().\n const originalRequest = this.hasCallback('fetchDidFail') ?\n request.clone() : null;\n try {\n for (const cb of this.iterateCallbacks('requestWillFetch')) {\n request = await cb({ request: request.clone(), event });\n }\n }\n catch (err) {\n throw new WorkboxError('plugin-error-request-will-fetch', {\n thrownError: err,\n });\n }\n // The request can be altered by plugins with `requestWillFetch` making\n // the original request (most likely from a `fetch` event) different\n // from the Request we make. Pass both to `fetchDidFail` to aid debugging.\n const pluginFilteredRequest = request.clone();\n try {\n let fetchResponse;\n // See https://github.com/GoogleChrome/workbox/issues/1796\n fetchResponse = await fetch(request, request.mode === 'navigate' ?\n undefined : this._strategy.fetchOptions);\n if (process.env.NODE_ENV !== 'production') {\n logger.debug(`Network request for ` +\n `'${getFriendlyURL(request.url)}' returned a response with ` +\n `status '${fetchResponse.status}'.`);\n }\n for (const callback of this.iterateCallbacks('fetchDidSucceed')) {\n fetchResponse = await callback({\n event,\n request: pluginFilteredRequest,\n response: fetchResponse,\n });\n }\n return fetchResponse;\n }\n catch (error) {\n if (process.env.NODE_ENV !== 'production') {\n logger.log(`Network request for ` +\n `'${getFriendlyURL(request.url)}' threw an error.`, error);\n }\n // `originalRequest` will only exist if a `fetchDidFail` callback\n // is being used (see above).\n if (originalRequest) {\n await this.runCallbacks('fetchDidFail', {\n error,\n event,\n originalRequest: originalRequest.clone(),\n request: pluginFilteredRequest.clone(),\n });\n }\n throw error;\n }\n }\n /**\n * Calls `this.fetch()` and (in the background) runs `this.cachePut()` on\n * the response generated by `this.fetch()`.\n *\n * The call to `this.cachePut()` automatically invokes `this.waitUntil()`,\n * so you do not have to manually call `waitUntil()` on the event.\n *\n * @param {Request|string} input The request or URL to fetch and cache.\n * @return {Promise}\n */\n async fetchAndCachePut(input) {\n const response = await this.fetch(input);\n const responseClone = response.clone();\n this.waitUntil(this.cachePut(input, responseClone));\n return response;\n }\n /**\n * Matches a request from the cache (and invokes any applicable plugin\n * callback methods) using the `cacheName`, `matchOptions`, and `plugins`\n * defined on the strategy object.\n *\n * The following plugin lifecycle methods are invoked when using this method:\n * - cacheKeyWillByUsed()\n * - cachedResponseWillByUsed()\n *\n * @param {Request|string} key The Request or URL to use as the cache key.\n * @return {Promise} A matching response, if found.\n */\n async cacheMatch(key) {\n const request = toRequest(key);\n let cachedResponse;\n const { cacheName, matchOptions } = this._strategy;\n const effectiveRequest = await this.getCacheKey(request, 'read');\n const multiMatchOptions = { ...matchOptions, ...{ cacheName } };\n cachedResponse = await caches.match(effectiveRequest, multiMatchOptions);\n if (process.env.NODE_ENV !== 'production') {\n if (cachedResponse) {\n logger.debug(`Found a cached response in '${cacheName}'.`);\n }\n else {\n logger.debug(`No cached response found in '${cacheName}'.`);\n }\n }\n for (const callback of this.iterateCallbacks('cachedResponseWillBeUsed')) {\n cachedResponse = (await callback({\n cacheName,\n matchOptions,\n cachedResponse,\n request: effectiveRequest,\n event: this.event,\n })) || undefined;\n }\n return cachedResponse;\n }\n /**\n * Puts a request/response pair in the cache (and invokes any applicable\n * plugin callback methods) using the `cacheName` and `plugins` defined on\n * the strategy object.\n *\n * The following plugin lifecycle methods are invoked when using this method:\n * - cacheKeyWillByUsed()\n * - cacheWillUpdate()\n * - cacheDidUpdate()\n *\n * @param {Request|string} key The request or URL to use as the cache key.\n * @param {Response} response The response to cache.\n * @return {Promise} `false` if a cacheWillUpdate caused the response\n * not be cached, and `true` otherwise.\n */\n async cachePut(key, response) {\n const request = toRequest(key);\n // Run in the next task to avoid blocking other cache reads.\n // https://github.com/w3c/ServiceWorker/issues/1397\n await timeout(0);\n const effectiveRequest = await this.getCacheKey(request, 'write');\n if (process.env.NODE_ENV !== 'production') {\n if (effectiveRequest.method && effectiveRequest.method !== 'GET') {\n throw new WorkboxError('attempt-to-cache-non-get-request', {\n url: getFriendlyURL(effectiveRequest.url),\n method: effectiveRequest.method,\n });\n }\n }\n if (!response) {\n if (process.env.NODE_ENV !== 'production') {\n logger.error(`Cannot cache non-existent response for ` +\n `'${getFriendlyURL(effectiveRequest.url)}'.`);\n }\n throw new WorkboxError('cache-put-with-no-response', {\n url: getFriendlyURL(effectiveRequest.url),\n });\n }\n const responseToCache = await this._ensureResponseSafeToCache(response);\n if (!responseToCache) {\n if (process.env.NODE_ENV !== 'production') {\n logger.debug(`Response '${getFriendlyURL(effectiveRequest.url)}' ` +\n `will not be cached.`, responseToCache);\n }\n return false;\n }\n const { cacheName, matchOptions } = this._strategy;\n const cache = await self.caches.open(cacheName);\n const hasCacheUpdateCallback = this.hasCallback('cacheDidUpdate');\n const oldResponse = hasCacheUpdateCallback ? await cacheMatchIgnoreParams(\n // TODO(philipwalton): the `__WB_REVISION__` param is a precaching\n // feature. Consider into ways to only add this behavior if using\n // precaching.\n cache, effectiveRequest.clone(), ['__WB_REVISION__'], matchOptions) :\n null;\n if (process.env.NODE_ENV !== 'production') {\n logger.debug(`Updating the '${cacheName}' cache with a new Response ` +\n `for ${getFriendlyURL(effectiveRequest.url)}.`);\n }\n try {\n await cache.put(effectiveRequest, hasCacheUpdateCallback ?\n responseToCache.clone() : responseToCache);\n }\n catch (error) {\n // See https://developer.mozilla.org/en-US/docs/Web/API/DOMException#exception-QuotaExceededError\n if (error.name === 'QuotaExceededError') {\n await executeQuotaErrorCallbacks();\n }\n throw error;\n }\n for (const callback of this.iterateCallbacks('cacheDidUpdate')) {\n await callback({\n cacheName,\n oldResponse,\n newResponse: responseToCache.clone(),\n request: effectiveRequest,\n event: this.event,\n });\n }\n return true;\n }\n /**\n * Checks the list of plugins for the `cacheKeyWillBeUsed` callback, and\n * executes any of those callbacks found in sequence. The final `Request`\n * object returned by the last plugin is treated as the cache key for cache\n * reads and/or writes. If no `cacheKeyWillBeUsed` plugin callbacks have\n * been registered, the passed request is returned unmodified\n *\n * @param {Request} request\n * @param {string} mode\n * @return {Promise}\n */\n async getCacheKey(request, mode) {\n if (!this._cacheKeys[mode]) {\n let effectiveRequest = request;\n for (const callback of this.iterateCallbacks('cacheKeyWillBeUsed')) {\n effectiveRequest = toRequest(await callback({\n mode,\n request: effectiveRequest,\n event: this.event,\n params: this.params,\n }));\n }\n this._cacheKeys[mode] = effectiveRequest;\n }\n return this._cacheKeys[mode];\n }\n /**\n * Returns true if the strategy has at least one plugin with the given\n * callback.\n *\n * @param {string} name The name of the callback to check for.\n * @return {boolean}\n */\n hasCallback(name) {\n for (const plugin of this._strategy.plugins) {\n if (name in plugin) {\n return true;\n }\n }\n return false;\n }\n /**\n * Runs all plugin callbacks matching the given name, in order, passing the\n * given param object (merged ith the current plugin state) as the only\n * argument.\n *\n * Note: since this method runs all plugins, it's not suitable for cases\n * where the return value of a callback needs to be applied prior to calling\n * the next callback. See\n * [`iterateCallbacks()`]{@link module:workbox-strategies.StrategyHandler#iterateCallbacks}\n * below for how to handle that case.\n *\n * @param {string} name The name of the callback to run within each plugin.\n * @param {Object} param The object to pass as the first (and only) param\n * when executing each callback. This object will be merged with the\n * current plugin state prior to callback execution.\n */\n async runCallbacks(name, param) {\n for (const callback of this.iterateCallbacks(name)) {\n // TODO(philipwalton): not sure why `any` is needed. It seems like\n // this should work with `as WorkboxPluginCallbackParam[C]`.\n await callback(param);\n }\n }\n /**\n * Accepts a callback and returns an iterable of matching plugin callbacks,\n * where each callback is wrapped with the current handler state (i.e. when\n * you call each callback, whatever object parameter you pass it will\n * be merged with the plugin's current state).\n *\n * @param {string} name The name fo the callback to run\n * @return {Array}\n */\n *iterateCallbacks(name) {\n for (const plugin of this._strategy.plugins) {\n if (typeof plugin[name] === 'function') {\n const state = this._pluginStateMap.get(plugin);\n const statefulCallback = (param) => {\n const statefulParam = { ...param, state };\n // TODO(philipwalton): not sure why `any` is needed. It seems like\n // this should work with `as WorkboxPluginCallbackParam[C]`.\n return plugin[name](statefulParam);\n };\n yield statefulCallback;\n }\n }\n }\n /**\n * Adds a promise to the\n * [extend lifetime promises]{@link https://w3c.github.io/ServiceWorker/#extendableevent-extend-lifetime-promises}\n * of the event event associated with the request being handled (usually a\n * `FetchEvent`).\n *\n * Note: you can await\n * [`doneWaiting()`]{@link module:workbox-strategies.StrategyHandler~doneWaiting}\n * to know when all added promises have settled.\n *\n * @param {Promise} promise A promise to add to the extend lifetime promises\n * of the event that triggered the request.\n */\n waitUntil(promise) {\n this._extendLifetimePromises.push(promise);\n return promise;\n }\n /**\n * Returns a promise that resolves once all promises passed to\n * [`waitUntil()`]{@link module:workbox-strategies.StrategyHandler~waitUntil}\n * have settled.\n *\n * Note: any work done after `doneWaiting()` settles should be manually\n * passed to an event's `waitUntil()` method (not this handler's\n * `waitUntil()` method), otherwise the service worker thread my be killed\n * prior to your work completing.\n */\n async doneWaiting() {\n let promise;\n while (promise = this._extendLifetimePromises.shift()) {\n await promise;\n }\n }\n /**\n * Stops running the strategy and immediately resolves any pending\n * `waitUntil()` promises.\n */\n destroy() {\n this._handlerDeferred.resolve();\n }\n /**\n * This method will call cacheWillUpdate on the available plugins (or use\n * status === 200) to determine if the Response is safe and valid to cache.\n *\n * @param {Request} options.request\n * @param {Response} options.response\n * @return {Promise}\n *\n * @private\n */\n async _ensureResponseSafeToCache(response) {\n let responseToCache = response;\n let pluginsUsed = false;\n for (const callback of this.iterateCallbacks('cacheWillUpdate')) {\n responseToCache = (await callback({\n request: this.request,\n response: responseToCache,\n event: this.event,\n })) || undefined;\n pluginsUsed = true;\n if (!responseToCache) {\n break;\n }\n }\n if (!pluginsUsed) {\n if (responseToCache && responseToCache.status !== 200) {\n responseToCache = undefined;\n }\n if (process.env.NODE_ENV !== 'production') {\n if (responseToCache) {\n if (responseToCache.status !== 200) {\n if (responseToCache.status === 0) {\n logger.warn(`The response for '${this.request.url}' ` +\n `is an opaque response. The caching strategy that you're ` +\n `using will not cache opaque responses by default.`);\n }\n else {\n logger.debug(`The response for '${this.request.url}' ` +\n `returned a status code of '${response.status}' and won't ` +\n `be cached as a result.`);\n }\n }\n }\n }\n }\n return responseToCache;\n }\n}\nexport { StrategyHandler };\n","/*\n Copyright 2019 Google LLC\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\nimport '../_version.js';\n/**\n * Returns a promise that resolves and the passed number of milliseconds.\n * This utility is an async/await-friendly version of `setTimeout`.\n *\n * @param {number} ms\n * @return {Promise}\n * @private\n */\nexport function timeout(ms) {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\nimport '../_version.js';\nconst getFriendlyURL = (url) => {\n const urlObj = new URL(String(url), location.href);\n // See https://github.com/GoogleChrome/workbox/issues/2323\n // We want to include everything, except for the origin if it's same-origin.\n return urlObj.href.replace(new RegExp(`^${location.origin}`), '');\n};\nexport { getFriendlyURL };\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\nimport { logger } from '../_private/logger.js';\nimport { quotaErrorCallbacks } from '../models/quotaErrorCallbacks.js';\nimport '../_version.js';\n/**\n * Runs all of the callback functions, one at a time sequentially, in the order\n * in which they were registered.\n *\n * @memberof module:workbox-core\n * @private\n */\nasync function executeQuotaErrorCallbacks() {\n if (process.env.NODE_ENV !== 'production') {\n logger.log(`About to run ${quotaErrorCallbacks.size} ` +\n `callbacks to clean up caches.`);\n }\n for (const callback of quotaErrorCallbacks) {\n await callback();\n if (process.env.NODE_ENV !== 'production') {\n logger.log(callback, 'is complete.');\n }\n }\n if (process.env.NODE_ENV !== 'production') {\n logger.log('Finished running callbacks.');\n }\n}\nexport { executeQuotaErrorCallbacks };\n","/*\n Copyright 2020 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\nimport { cacheNames } from 'workbox-core/_private/cacheNames.js';\nimport { WorkboxError } from 'workbox-core/_private/WorkboxError.js';\nimport { logger } from 'workbox-core/_private/logger.js';\nimport { getFriendlyURL } from 'workbox-core/_private/getFriendlyURL.js';\nimport { StrategyHandler } from './StrategyHandler.js';\nimport './_version.js';\n/**\n * An abstract base class that all other strategy classes must extend from:\n *\n * @memberof module:workbox-strategies\n */\nclass Strategy {\n /**\n * Creates a new instance of the strategy and sets all documented option\n * properties as public instance properties.\n *\n * Note: if a custom strategy class extends the base Strategy class and does\n * not need more than these properties, it does not need to define its own\n * constructor.\n *\n * @param {Object} [options]\n * @param {string} [options.cacheName] Cache name to store and retrieve\n * requests. Defaults to the cache names provided by\n * [workbox-core]{@link module:workbox-core.cacheNames}.\n * @param {Array} [options.plugins] [Plugins]{@link https://developers.google.com/web/tools/workbox/guides/using-plugins}\n * to use in conjunction with this caching strategy.\n * @param {Object} [options.fetchOptions] Values passed along to the\n * [`init`](https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/fetch#Parameters)\n * of [non-navigation](https://github.com/GoogleChrome/workbox/issues/1796)\n * `fetch()` requests made by this strategy.\n * @param {Object} [options.matchOptions] The\n * [`CacheQueryOptions`]{@link https://w3c.github.io/ServiceWorker/#dictdef-cachequeryoptions}\n * for any `cache.match()` or `cache.put()` calls made by this strategy.\n */\n constructor(options = {}) {\n /**\n * Cache name to store and retrieve\n * requests. Defaults to the cache names provided by\n * [workbox-core]{@link module:workbox-core.cacheNames}.\n *\n * @type {string}\n */\n this.cacheName = cacheNames.getRuntimeName(options.cacheName);\n /**\n * The list\n * [Plugins]{@link https://developers.google.com/web/tools/workbox/guides/using-plugins}\n * used by this strategy.\n *\n * @type {Array}\n */\n this.plugins = options.plugins || [];\n /**\n * Values passed along to the\n * [`init`]{@link https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/fetch#Parameters}\n * of all fetch() requests made by this strategy.\n *\n * @type {Object}\n */\n this.fetchOptions = options.fetchOptions;\n /**\n * The\n * [`CacheQueryOptions`]{@link https://w3c.github.io/ServiceWorker/#dictdef-cachequeryoptions}\n * for any `cache.match()` or `cache.put()` calls made by this strategy.\n *\n * @type {Object}\n */\n this.matchOptions = options.matchOptions;\n }\n /**\n * Perform a request strategy and returns a `Promise` that will resolve with\n * a `Response`, invoking all relevant plugin callbacks.\n *\n * When a strategy instance is registered with a Workbox\n * [route]{@link module:workbox-routing.Route}, this method is automatically\n * called when the route matches.\n *\n * Alternatively, this method can be used in a standalone `FetchEvent`\n * listener by passing it to `event.respondWith()`.\n *\n * @param {FetchEvent|Object} options A `FetchEvent` or an object with the\n * properties listed below.\n * @param {Request|string} options.request A request to run this strategy for.\n * @param {ExtendableEvent} options.event The event associated with the\n * request.\n * @param {URL} [options.url]\n * @param {*} [options.params]\n */\n handle(options) {\n const [responseDone] = this.handleAll(options);\n return responseDone;\n }\n /**\n * Similar to [`handle()`]{@link module:workbox-strategies.Strategy~handle}, but\n * instead of just returning a `Promise` that resolves to a `Response` it\n * it will return an tuple of [response, done] promises, where the former\n * (`response`) is equivalent to what `handle()` returns, and the latter is a\n * Promise that will resolve once any promises that were added to\n * `event.waitUntil()` as part of performing the strategy have completed.\n *\n * You can await the `done` promise to ensure any extra work performed by\n * the strategy (usually caching responses) completes successfully.\n *\n * @param {FetchEvent|Object} options A `FetchEvent` or an object with the\n * properties listed below.\n * @param {Request|string} options.request A request to run this strategy for.\n * @param {ExtendableEvent} options.event The event associated with the\n * request.\n * @param {URL} [options.url]\n * @param {*} [options.params]\n * @return {Array} A tuple of [response, done]\n * promises that can be used to determine when the response resolves as\n * well as when the handler has completed all its work.\n */\n handleAll(options) {\n // Allow for flexible options to be passed.\n if (options instanceof FetchEvent) {\n options = {\n event: options,\n request: options.request,\n };\n }\n const event = options.event;\n const request = typeof options.request === 'string' ?\n new Request(options.request) :\n options.request;\n const params = 'params' in options ? options.params : undefined;\n const handler = new StrategyHandler(this, { event, request, params });\n const responseDone = this._getResponse(handler, request, event);\n const handlerDone = this._awaitComplete(responseDone, handler, request, event);\n // Return an array of promises, suitable for use with Promise.all().\n return [responseDone, handlerDone];\n }\n async _getResponse(handler, request, event) {\n await handler.runCallbacks('handlerWillStart', { event, request });\n let response = undefined;\n try {\n response = await this._handle(request, handler);\n // The \"official\" Strategy subclasses all throw this error automatically,\n // but in case a third-party Strategy doesn't, ensure that we have a\n // consistent failure when there's no response or an error response.\n if (!response || response.type === 'error') {\n throw new WorkboxError('no-response', { url: request.url });\n }\n }\n catch (error) {\n for (const callback of handler.iterateCallbacks('handlerDidError')) {\n response = await callback({ error, event, request });\n if (response) {\n break;\n }\n }\n if (!response) {\n throw error;\n }\n else if (process.env.NODE_ENV !== 'production') {\n logger.log(`While responding to '${getFriendlyURL(request.url)}', ` +\n `an ${error} error occurred. Using a fallback response provided by ` +\n `a handlerDidError plugin.`);\n }\n }\n for (const callback of handler.iterateCallbacks('handlerWillRespond')) {\n response = await callback({ event, request, response });\n }\n return response;\n }\n async _awaitComplete(responseDone, handler, request, event) {\n let response;\n let error;\n try {\n response = await responseDone;\n }\n catch (error) {\n // Ignore errors, as response errors should be caught via the `response`\n // promise above. The `done` promise will only throw for errors in\n // promises passed to `handler.waitUntil()`.\n }\n try {\n await handler.runCallbacks('handlerDidRespond', {\n event,\n request,\n response,\n });\n await handler.doneWaiting();\n }\n catch (waitUntilError) {\n error = waitUntilError;\n }\n await handler.runCallbacks('handlerDidComplete', {\n event,\n request,\n response,\n error,\n });\n handler.destroy();\n if (error) {\n throw error;\n }\n }\n}\nexport { Strategy };\n/**\n * Classes extending the `Strategy` based class should implement this method,\n * and leverage the [`handler`]{@link module:workbox-strategies.StrategyHandler}\n * arg to perform all fetching and cache logic, which will ensure all relevant\n * cache, cache options, fetch options and plugins are used (per the current\n * strategy instance).\n *\n * @name _handle\n * @instance\n * @abstract\n * @function\n * @param {Request} request\n * @param {module:workbox-strategies.StrategyHandler} handler\n * @return {Promise}\n *\n * @memberof module:workbox-strategies.Strategy\n */\n","/*\n Copyright 2019 Google LLC\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\nimport '../_version.js';\n/**\n * A helper function that prevents a promise from being flagged as unused.\n *\n * @private\n **/\nexport function dontWaitFor(promise) {\n // Effective no-op.\n promise.then(() => { });\n}\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\nimport '../_version.js';\n/**\n * A class that wraps common IndexedDB functionality in a promise-based API.\n * It exposes all the underlying power and functionality of IndexedDB, but\n * wraps the most commonly used features in a way that's much simpler to use.\n *\n * @private\n */\nexport class DBWrapper {\n /**\n * @param {string} name\n * @param {number} version\n * @param {Object=} [callback]\n * @param {!Function} [callbacks.onupgradeneeded]\n * @param {!Function} [callbacks.onversionchange] Defaults to\n * DBWrapper.prototype._onversionchange when not specified.\n * @private\n */\n constructor(name, version, { onupgradeneeded, onversionchange, } = {}) {\n this._db = null;\n this._name = name;\n this._version = version;\n this._onupgradeneeded = onupgradeneeded;\n this._onversionchange = onversionchange || (() => this.close());\n }\n /**\n * Returns the IDBDatabase instance (not normally needed).\n * @return {IDBDatabase|undefined}\n *\n * @private\n */\n get db() {\n return this._db;\n }\n /**\n * Opens a connected to an IDBDatabase, invokes any onupgradedneeded\n * callback, and added an onversionchange callback to the database.\n *\n * @return {IDBDatabase}\n * @private\n */\n async open() {\n if (this._db)\n return;\n this._db = await new Promise((resolve, reject) => {\n // This flag is flipped to true if the timeout callback runs prior\n // to the request failing or succeeding. Note: we use a timeout instead\n // of an onblocked handler since there are cases where onblocked will\n // never never run. A timeout better handles all possible scenarios:\n // https://github.com/w3c/IndexedDB/issues/223\n let openRequestTimedOut = false;\n setTimeout(() => {\n openRequestTimedOut = true;\n reject(new Error('The open request was blocked and timed out'));\n }, this.OPEN_TIMEOUT);\n const openRequest = indexedDB.open(this._name, this._version);\n openRequest.onerror = () => reject(openRequest.error);\n openRequest.onupgradeneeded = (evt) => {\n if (openRequestTimedOut) {\n openRequest.transaction.abort();\n openRequest.result.close();\n }\n else if (typeof this._onupgradeneeded === 'function') {\n this._onupgradeneeded(evt);\n }\n };\n openRequest.onsuccess = () => {\n const db = openRequest.result;\n if (openRequestTimedOut) {\n db.close();\n }\n else {\n db.onversionchange = this._onversionchange.bind(this);\n resolve(db);\n }\n };\n });\n return this;\n }\n /**\n * Polyfills the native `getKey()` method. Note, this is overridden at\n * runtime if the browser supports the native method.\n *\n * @param {string} storeName\n * @param {*} query\n * @return {Array}\n * @private\n */\n async getKey(storeName, query) {\n return (await this.getAllKeys(storeName, query, 1))[0];\n }\n /**\n * Polyfills the native `getAll()` method. Note, this is overridden at\n * runtime if the browser supports the native method.\n *\n * @param {string} storeName\n * @param {*} query\n * @param {number} count\n * @return {Array}\n * @private\n */\n async getAll(storeName, query, count) {\n return await this.getAllMatching(storeName, { query, count });\n }\n /**\n * Polyfills the native `getAllKeys()` method. Note, this is overridden at\n * runtime if the browser supports the native method.\n *\n * @param {string} storeName\n * @param {*} query\n * @param {number} count\n * @return {Array}\n * @private\n */\n async getAllKeys(storeName, query, count) {\n const entries = await this.getAllMatching(storeName, { query, count, includeKeys: true });\n return entries.map((entry) => entry.key);\n }\n /**\n * Supports flexible lookup in an object store by specifying an index,\n * query, direction, and count. This method returns an array of objects\n * with the signature .\n *\n * @param {string} storeName\n * @param {Object} [opts]\n * @param {string} [opts.index] The index to use (if specified).\n * @param {*} [opts.query]\n * @param {IDBCursorDirection} [opts.direction]\n * @param {number} [opts.count] The max number of results to return.\n * @param {boolean} [opts.includeKeys] When true, the structure of the\n * returned objects is changed from an array of values to an array of\n * objects in the form {key, primaryKey, value}.\n * @return {Array}\n * @private\n */\n async getAllMatching(storeName, { index, query = null, // IE/Edge errors if query === `undefined`.\n direction = 'next', count, includeKeys = false, } = {}) {\n return await this.transaction([storeName], 'readonly', (txn, done) => {\n const store = txn.objectStore(storeName);\n const target = index ? store.index(index) : store;\n const results = [];\n const request = target.openCursor(query, direction);\n request.onsuccess = () => {\n const cursor = request.result;\n if (cursor) {\n results.push(includeKeys ? cursor : cursor.value);\n if (count && results.length >= count) {\n done(results);\n }\n else {\n cursor.continue();\n }\n }\n else {\n done(results);\n }\n };\n });\n }\n /**\n * Accepts a list of stores, a transaction type, and a callback and\n * performs a transaction. A promise is returned that resolves to whatever\n * value the callback chooses. The callback holds all the transaction logic\n * and is invoked with two arguments:\n * 1. The IDBTransaction object\n * 2. A `done` function, that's used to resolve the promise when\n * when the transaction is done, if passed a value, the promise is\n * resolved to that value.\n *\n * @param {Array} storeNames An array of object store names\n * involved in the transaction.\n * @param {string} type Can be `readonly` or `readwrite`.\n * @param {!Function} callback\n * @return {*} The result of the transaction ran by the callback.\n * @private\n */\n async transaction(storeNames, type, callback) {\n await this.open();\n return await new Promise((resolve, reject) => {\n const txn = this._db.transaction(storeNames, type);\n txn.onabort = () => reject(txn.error);\n txn.oncomplete = () => resolve();\n callback(txn, (value) => resolve(value));\n });\n }\n /**\n * Delegates async to a native IDBObjectStore method.\n *\n * @param {string} method The method name.\n * @param {string} storeName The object store name.\n * @param {string} type Can be `readonly` or `readwrite`.\n * @param {...*} args The list of args to pass to the native method.\n * @return {*} The result of the transaction.\n * @private\n */\n async _call(method, storeName, type, ...args) {\n const callback = (txn, done) => {\n const objStore = txn.objectStore(storeName);\n // TODO(philipwalton): Fix this underlying TS2684 error.\n // @ts-ignore\n const request = objStore[method].apply(objStore, args);\n request.onsuccess = () => done(request.result);\n };\n return await this.transaction([storeName], type, callback);\n }\n /**\n * Closes the connection opened by `DBWrapper.open()`. Generally this method\n * doesn't need to be called since:\n * 1. It's usually better to keep a connection open since opening\n * a new connection is somewhat slow.\n * 2. Connections are automatically closed when the reference is\n * garbage collected.\n * The primary use case for needing to close a connection is when another\n * reference (typically in another tab) needs to upgrade it and would be\n * blocked by the current, open connection.\n *\n * @private\n */\n close() {\n if (this._db) {\n this._db.close();\n this._db = null;\n }\n }\n}\n// Exposed on the prototype to let users modify the default timeout on a\n// per-instance or global basis.\nDBWrapper.prototype.OPEN_TIMEOUT = 2000;\n// Wrap native IDBObjectStore methods according to their mode.\nconst methodsToWrap = {\n readonly: ['get', 'count', 'getKey', 'getAll', 'getAllKeys'],\n readwrite: ['add', 'put', 'clear', 'delete'],\n};\nfor (const [mode, methods] of Object.entries(methodsToWrap)) {\n for (const method of methods) {\n if (method in IDBObjectStore.prototype) {\n // Don't use arrow functions here since we're outside of the class.\n DBWrapper.prototype[method] =\n async function (storeName, ...args) {\n return await this._call(method, storeName, mode, ...args);\n };\n }\n }\n}\n","\"use strict\";\n// @ts-ignore\ntry {\n self['workbox:expiration:6.1.5'] && _();\n}\ncatch (e) { }\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\nimport { DBWrapper } from 'workbox-core/_private/DBWrapper.js';\nimport { deleteDatabase } from 'workbox-core/_private/deleteDatabase.js';\nimport '../_version.js';\nconst DB_NAME = 'workbox-expiration';\nconst OBJECT_STORE_NAME = 'cache-entries';\nconst normalizeURL = (unNormalizedUrl) => {\n const url = new URL(unNormalizedUrl, location.href);\n url.hash = '';\n return url.href;\n};\n/**\n * Returns the timestamp model.\n *\n * @private\n */\nclass CacheTimestampsModel {\n /**\n *\n * @param {string} cacheName\n *\n * @private\n */\n constructor(cacheName) {\n this._cacheName = cacheName;\n this._db = new DBWrapper(DB_NAME, 1, {\n onupgradeneeded: (event) => this._handleUpgrade(event),\n });\n }\n /**\n * Should perform an upgrade of indexedDB.\n *\n * @param {Event} event\n *\n * @private\n */\n _handleUpgrade(event) {\n const db = event.target.result;\n // TODO(philipwalton): EdgeHTML doesn't support arrays as a keyPath, so we\n // have to use the `id` keyPath here and create our own values (a\n // concatenation of `url + cacheName`) instead of simply using\n // `keyPath: ['url', 'cacheName']`, which is supported in other browsers.\n const objStore = db.createObjectStore(OBJECT_STORE_NAME, { keyPath: 'id' });\n // TODO(philipwalton): once we don't have to support EdgeHTML, we can\n // create a single index with the keyPath `['cacheName', 'timestamp']`\n // instead of doing both these indexes.\n objStore.createIndex('cacheName', 'cacheName', { unique: false });\n objStore.createIndex('timestamp', 'timestamp', { unique: false });\n // Previous versions of `workbox-expiration` used `this._cacheName`\n // as the IDBDatabase name.\n deleteDatabase(this._cacheName);\n }\n /**\n * @param {string} url\n * @param {number} timestamp\n *\n * @private\n */\n async setTimestamp(url, timestamp) {\n url = normalizeURL(url);\n const entry = {\n url,\n timestamp,\n cacheName: this._cacheName,\n // Creating an ID from the URL and cache name won't be necessary once\n // Edge switches to Chromium and all browsers we support work with\n // array keyPaths.\n id: this._getId(url),\n };\n await this._db.put(OBJECT_STORE_NAME, entry);\n }\n /**\n * Returns the timestamp stored for a given URL.\n *\n * @param {string} url\n * @return {number}\n *\n * @private\n */\n async getTimestamp(url) {\n const entry = await this._db.get(OBJECT_STORE_NAME, this._getId(url));\n return entry.timestamp;\n }\n /**\n * Iterates through all the entries in the object store (from newest to\n * oldest) and removes entries once either `maxCount` is reached or the\n * entry's timestamp is less than `minTimestamp`.\n *\n * @param {number} minTimestamp\n * @param {number} maxCount\n * @return {Array}\n *\n * @private\n */\n async expireEntries(minTimestamp, maxCount) {\n const entriesToDelete = await this._db.transaction(OBJECT_STORE_NAME, 'readwrite', (txn, done) => {\n const store = txn.objectStore(OBJECT_STORE_NAME);\n const request = store.index('timestamp').openCursor(null, 'prev');\n const entriesToDelete = [];\n let entriesNotDeletedCount = 0;\n request.onsuccess = () => {\n const cursor = request.result;\n if (cursor) {\n const result = cursor.value;\n // TODO(philipwalton): once we can use a multi-key index, we\n // won't have to check `cacheName` here.\n if (result.cacheName === this._cacheName) {\n // Delete an entry if it's older than the max age or\n // if we already have the max number allowed.\n if ((minTimestamp && result.timestamp < minTimestamp) ||\n (maxCount && entriesNotDeletedCount >= maxCount)) {\n // TODO(philipwalton): we should be able to delete the\n // entry right here, but doing so causes an iteration\n // bug in Safari stable (fixed in TP). Instead we can\n // store the keys of the entries to delete, and then\n // delete the separate transactions.\n // https://github.com/GoogleChrome/workbox/issues/1978\n // cursor.delete();\n // We only need to return the URL, not the whole entry.\n entriesToDelete.push(cursor.value);\n }\n else {\n entriesNotDeletedCount++;\n }\n }\n cursor.continue();\n }\n else {\n done(entriesToDelete);\n }\n };\n });\n // TODO(philipwalton): once the Safari bug in the following issue is fixed,\n // we should be able to remove this loop and do the entry deletion in the\n // cursor loop above:\n // https://github.com/GoogleChrome/workbox/issues/1978\n const urlsDeleted = [];\n for (const entry of entriesToDelete) {\n await this._db.delete(OBJECT_STORE_NAME, entry.id);\n urlsDeleted.push(entry.url);\n }\n return urlsDeleted;\n }\n /**\n * Takes a URL and returns an ID that will be unique in the object store.\n *\n * @param {string} url\n * @return {string}\n *\n * @private\n */\n _getId(url) {\n // Creating an ID from the URL and cache name won't be necessary once\n // Edge switches to Chromium and all browsers we support work with\n // array keyPaths.\n return this._cacheName + '|' + normalizeURL(url);\n }\n}\nexport { CacheTimestampsModel };\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\nimport '../_version.js';\n/**\n * Deletes the database.\n * Note: this is exported separately from the DBWrapper module because most\n * usages of IndexedDB in workbox dont need deleting, and this way it can be\n * reused in tests to delete databases without creating DBWrapper instances.\n *\n * @param {string} name The database name.\n * @private\n */\nexport const deleteDatabase = async (name) => {\n await new Promise((resolve, reject) => {\n const request = indexedDB.deleteDatabase(name);\n request.onerror = () => {\n reject(request.error);\n };\n request.onblocked = () => {\n reject(new Error('Delete blocked'));\n };\n request.onsuccess = () => {\n resolve();\n };\n });\n};\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\nimport { assert } from 'workbox-core/_private/assert.js';\nimport { dontWaitFor } from 'workbox-core/_private/dontWaitFor.js';\nimport { logger } from 'workbox-core/_private/logger.js';\nimport { WorkboxError } from 'workbox-core/_private/WorkboxError.js';\nimport { CacheTimestampsModel } from './models/CacheTimestampsModel.js';\nimport './_version.js';\n/**\n * The `CacheExpiration` class allows you define an expiration and / or\n * limit on the number of responses stored in a\n * [`Cache`](https://developer.mozilla.org/en-US/docs/Web/API/Cache).\n *\n * @memberof module:workbox-expiration\n */\nclass CacheExpiration {\n /**\n * To construct a new CacheExpiration instance you must provide at least\n * one of the `config` properties.\n *\n * @param {string} cacheName Name of the cache to apply restrictions to.\n * @param {Object} config\n * @param {number} [config.maxEntries] The maximum number of entries to cache.\n * Entries used the least will be removed as the maximum is reached.\n * @param {number} [config.maxAgeSeconds] The maximum age of an entry before\n * it's treated as stale and removed.\n * @param {Object} [config.matchOptions] The [`CacheQueryOptions`](https://developer.mozilla.org/en-US/docs/Web/API/Cache/delete#Parameters)\n * that will be used when calling `delete()` on the cache.\n */\n constructor(cacheName, config = {}) {\n this._isRunning = false;\n this._rerunRequested = false;\n if (process.env.NODE_ENV !== 'production') {\n assert.isType(cacheName, 'string', {\n moduleName: 'workbox-expiration',\n className: 'CacheExpiration',\n funcName: 'constructor',\n paramName: 'cacheName',\n });\n if (!(config.maxEntries || config.maxAgeSeconds)) {\n throw new WorkboxError('max-entries-or-age-required', {\n moduleName: 'workbox-expiration',\n className: 'CacheExpiration',\n funcName: 'constructor',\n });\n }\n if (config.maxEntries) {\n assert.isType(config.maxEntries, 'number', {\n moduleName: 'workbox-expiration',\n className: 'CacheExpiration',\n funcName: 'constructor',\n paramName: 'config.maxEntries',\n });\n }\n if (config.maxAgeSeconds) {\n assert.isType(config.maxAgeSeconds, 'number', {\n moduleName: 'workbox-expiration',\n className: 'CacheExpiration',\n funcName: 'constructor',\n paramName: 'config.maxAgeSeconds',\n });\n }\n }\n this._maxEntries = config.maxEntries;\n this._maxAgeSeconds = config.maxAgeSeconds;\n this._matchOptions = config.matchOptions;\n this._cacheName = cacheName;\n this._timestampModel = new CacheTimestampsModel(cacheName);\n }\n /**\n * Expires entries for the given cache and given criteria.\n */\n async expireEntries() {\n if (this._isRunning) {\n this._rerunRequested = true;\n return;\n }\n this._isRunning = true;\n const minTimestamp = this._maxAgeSeconds ?\n Date.now() - (this._maxAgeSeconds * 1000) : 0;\n const urlsExpired = await this._timestampModel.expireEntries(minTimestamp, this._maxEntries);\n // Delete URLs from the cache\n const cache = await self.caches.open(this._cacheName);\n for (const url of urlsExpired) {\n await cache.delete(url, this._matchOptions);\n }\n if (process.env.NODE_ENV !== 'production') {\n if (urlsExpired.length > 0) {\n logger.groupCollapsed(`Expired ${urlsExpired.length} ` +\n `${urlsExpired.length === 1 ? 'entry' : 'entries'} and removed ` +\n `${urlsExpired.length === 1 ? 'it' : 'them'} from the ` +\n `'${this._cacheName}' cache.`);\n logger.log(`Expired the following ${urlsExpired.length === 1 ?\n 'URL' : 'URLs'}:`);\n urlsExpired.forEach((url) => logger.log(` ${url}`));\n logger.groupEnd();\n }\n else {\n logger.debug(`Cache expiration ran and found no entries to remove.`);\n }\n }\n this._isRunning = false;\n if (this._rerunRequested) {\n this._rerunRequested = false;\n dontWaitFor(this.expireEntries());\n }\n }\n /**\n * Update the timestamp for the given URL. This ensures the when\n * removing entries based on maximum entries, most recently used\n * is accurate or when expiring, the timestamp is up-to-date.\n *\n * @param {string} url\n */\n async updateTimestamp(url) {\n if (process.env.NODE_ENV !== 'production') {\n assert.isType(url, 'string', {\n moduleName: 'workbox-expiration',\n className: 'CacheExpiration',\n funcName: 'updateTimestamp',\n paramName: 'url',\n });\n }\n await this._timestampModel.setTimestamp(url, Date.now());\n }\n /**\n * Can be used to check if a URL has expired or not before it's used.\n *\n * This requires a look up from IndexedDB, so can be slow.\n *\n * Note: This method will not remove the cached entry, call\n * `expireEntries()` to remove indexedDB and Cache entries.\n *\n * @param {string} url\n * @return {boolean}\n */\n async isURLExpired(url) {\n if (!this._maxAgeSeconds) {\n if (process.env.NODE_ENV !== 'production') {\n throw new WorkboxError(`expired-test-without-max-age`, {\n methodName: 'isURLExpired',\n paramName: 'maxAgeSeconds',\n });\n }\n return false;\n }\n else {\n const timestamp = await this._timestampModel.getTimestamp(url);\n const expireOlderThan = Date.now() - (this._maxAgeSeconds * 1000);\n return (timestamp < expireOlderThan);\n }\n }\n /**\n * Removes the IndexedDB object store used to keep track of cache expiration\n * metadata.\n */\n async delete() {\n // Make sure we don't attempt another rerun if we're called in the middle of\n // a cache expiration.\n this._rerunRequested = false;\n await this._timestampModel.expireEntries(Infinity); // Expires all.\n }\n}\nexport { CacheExpiration };\n","/*\n Copyright 2020 Google LLC\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\nimport '../_version.js';\n/**\n * A utility method that makes it easier to use `event.waitUntil` with\n * async functions and return the result.\n *\n * @param {ExtendableEvent} event\n * @param {Function} asyncFn\n * @return {Function}\n * @private\n */\nfunction waitUntil(event, asyncFn) {\n const returnPromise = asyncFn();\n event.waitUntil(returnPromise);\n return returnPromise;\n}\nexport { waitUntil };\n","\"use strict\";\n// @ts-ignore\ntry {\n self['workbox:precaching:6.1.5'] && _();\n}\ncatch (e) { }\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\nimport { WorkboxError } from 'workbox-core/_private/WorkboxError.js';\nimport '../_version.js';\n// Name of the search parameter used to store revision info.\nconst REVISION_SEARCH_PARAM = '__WB_REVISION__';\n/**\n * Converts a manifest entry into a versioned URL suitable for precaching.\n *\n * @param {Object|string} entry\n * @return {string} A URL with versioning info.\n *\n * @private\n * @memberof module:workbox-precaching\n */\nexport function createCacheKey(entry) {\n if (!entry) {\n throw new WorkboxError('add-to-cache-list-unexpected-type', { entry });\n }\n // If a precache manifest entry is a string, it's assumed to be a versioned\n // URL, like '/app.abcd1234.js'. Return as-is.\n if (typeof entry === 'string') {\n const urlObject = new URL(entry, location.href);\n return {\n cacheKey: urlObject.href,\n url: urlObject.href,\n };\n }\n const { revision, url } = entry;\n if (!url) {\n throw new WorkboxError('add-to-cache-list-unexpected-type', { entry });\n }\n // If there's just a URL and no revision, then it's also assumed to be a\n // versioned URL.\n if (!revision) {\n const urlObject = new URL(url, location.href);\n return {\n cacheKey: urlObject.href,\n url: urlObject.href,\n };\n }\n // Otherwise, construct a properly versioned URL using the custom Workbox\n // search parameter along with the revision info.\n const cacheKeyURL = new URL(url, location.href);\n const originalURL = new URL(url, location.href);\n cacheKeyURL.searchParams.set(REVISION_SEARCH_PARAM, revision);\n return {\n cacheKey: cacheKeyURL.href,\n url: originalURL.href,\n };\n}\n","/*\n Copyright 2020 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\nimport '../_version.js';\n/**\n * A plugin, designed to be used with PrecacheController, to determine the\n * of assets that were updated (or not updated) during the install event.\n *\n * @private\n */\nclass PrecacheInstallReportPlugin {\n constructor() {\n this.updatedURLs = [];\n this.notUpdatedURLs = [];\n this.handlerWillStart = async ({ request, state, }) => {\n // TODO: `state` should never be undefined...\n if (state) {\n state.originalRequest = request;\n }\n };\n this.cachedResponseWillBeUsed = async ({ event, state, cachedResponse, }) => {\n if (event.type === 'install') {\n // TODO: `state` should never be undefined...\n const url = state.originalRequest.url;\n if (cachedResponse) {\n this.notUpdatedURLs.push(url);\n }\n else {\n this.updatedURLs.push(url);\n }\n }\n return cachedResponse;\n };\n }\n}\nexport { PrecacheInstallReportPlugin };\n","/*\n Copyright 2020 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\nimport '../_version.js';\n/**\n * A plugin, designed to be used with PrecacheController, to translate URLs into\n * the corresponding cache key, based on the current revision info.\n *\n * @private\n */\nclass PrecacheCacheKeyPlugin {\n constructor({ precacheController }) {\n this.cacheKeyWillBeUsed = async ({ request, params, }) => {\n const cacheKey = params && params.cacheKey ||\n this._precacheController.getCacheKeyForURL(request.url);\n return cacheKey ? new Request(cacheKey) : request;\n };\n this._precacheController = precacheController;\n }\n}\nexport { PrecacheCacheKeyPlugin };\n","/*\n Copyright 2019 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\nimport '../_version.js';\nlet supportStatus;\n/**\n * A utility function that determines whether the current browser supports\n * constructing a new `Response` from a `response.body` stream.\n *\n * @return {boolean} `true`, if the current browser can successfully\n * construct a `Response` from a `response.body` stream, `false` otherwise.\n *\n * @private\n */\nfunction canConstructResponseFromBodyStream() {\n if (supportStatus === undefined) {\n const testResponse = new Response('');\n if ('body' in testResponse) {\n try {\n new Response(testResponse.body);\n supportStatus = true;\n }\n catch (error) {\n supportStatus = false;\n }\n }\n supportStatus = false;\n }\n return supportStatus;\n}\nexport { canConstructResponseFromBodyStream };\n","/*\n Copyright 2019 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\nimport { PrecacheController } from '../PrecacheController.js';\nimport '../_version.js';\nlet precacheController;\n/**\n * @return {PrecacheController}\n * @private\n */\nexport const getOrCreatePrecacheController = () => {\n if (!precacheController) {\n precacheController = new PrecacheController();\n }\n return precacheController;\n};\n","/*\n Copyright 2019 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\nimport { canConstructResponseFromBodyStream } from './_private/canConstructResponseFromBodyStream.js';\nimport { WorkboxError } from './_private/WorkboxError.js';\nimport './_version.js';\n/**\n * Allows developers to copy a response and modify its `headers`, `status`,\n * or `statusText` values (the values settable via a\n * [`ResponseInit`]{@link https://developer.mozilla.org/en-US/docs/Web/API/Response/Response#Syntax}\n * object in the constructor).\n * To modify these values, pass a function as the second argument. That\n * function will be invoked with a single object with the response properties\n * `{headers, status, statusText}`. The return value of this function will\n * be used as the `ResponseInit` for the new `Response`. To change the values\n * either modify the passed parameter(s) and return it, or return a totally\n * new object.\n *\n * This method is intentionally limited to same-origin responses, regardless of\n * whether CORS was used or not.\n *\n * @param {Response} response\n * @param {Function} modifier\n * @memberof module:workbox-core\n */\nasync function copyResponse(response, modifier) {\n let origin = null;\n // If response.url isn't set, assume it's cross-origin and keep origin null.\n if (response.url) {\n const responseURL = new URL(response.url);\n origin = responseURL.origin;\n }\n if (origin !== self.location.origin) {\n throw new WorkboxError('cross-origin-copy-response', { origin });\n }\n const clonedResponse = response.clone();\n // Create a fresh `ResponseInit` object by cloning the headers.\n const responseInit = {\n headers: new Headers(clonedResponse.headers),\n status: clonedResponse.status,\n statusText: clonedResponse.statusText,\n };\n // Apply any user modifications.\n const modifiedResponseInit = modifier ? modifier(responseInit) : responseInit;\n // Create the new response from the body stream and `ResponseInit`\n // modifications. Note: not all browsers support the Response.body stream,\n // so fall back to reading the entire body into memory as a blob.\n const body = canConstructResponseFromBodyStream() ?\n clonedResponse.body : await clonedResponse.blob();\n return new Response(body, modifiedResponseInit);\n}\nexport { copyResponse };\n","/*\n Copyright 2020 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\nimport { copyResponse } from 'workbox-core/copyResponse.js';\nimport { cacheNames } from 'workbox-core/_private/cacheNames.js';\nimport { getFriendlyURL } from 'workbox-core/_private/getFriendlyURL.js';\nimport { logger } from 'workbox-core/_private/logger.js';\nimport { WorkboxError } from 'workbox-core/_private/WorkboxError.js';\nimport { Strategy } from 'workbox-strategies/Strategy.js';\nimport './_version.js';\n/**\n * A [Strategy]{@link module:workbox-strategies.Strategy} implementation\n * specifically designed to work with\n * [PrecacheController]{@link module:workbox-precaching.PrecacheController}\n * to both cache and fetch precached assets.\n *\n * Note: an instance of this class is created automatically when creating a\n * `PrecacheController`; it's generally not necessary to create this yourself.\n *\n * @extends module:workbox-strategies.Strategy\n * @memberof module:workbox-precaching\n */\nclass PrecacheStrategy extends Strategy {\n /**\n *\n * @param {Object} [options]\n * @param {string} [options.cacheName] Cache name to store and retrieve\n * requests. Defaults to the cache names provided by\n * [workbox-core]{@link module:workbox-core.cacheNames}.\n * @param {Array} [options.plugins] [Plugins]{@link https://developers.google.com/web/tools/workbox/guides/using-plugins}\n * to use in conjunction with this caching strategy.\n * @param {Object} [options.fetchOptions] Values passed along to the\n * [`init`]{@link https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/fetch#Parameters}\n * of all fetch() requests made by this strategy.\n * @param {Object} [options.matchOptions] The\n * [`CacheQueryOptions`]{@link https://w3c.github.io/ServiceWorker/#dictdef-cachequeryoptions}\n * for any `cache.match()` or `cache.put()` calls made by this strategy.\n * @param {boolean} [options.fallbackToNetwork=true] Whether to attempt to\n * get the response from the network if there's a precache miss.\n */\n constructor(options = {}) {\n options.cacheName = cacheNames.getPrecacheName(options.cacheName);\n super(options);\n this._fallbackToNetwork = options.fallbackToNetwork === false ? false : true;\n // Redirected responses cannot be used to satisfy a navigation request, so\n // any redirected response must be \"copied\" rather than cloned, so the new\n // response doesn't contain the `redirected` flag. See:\n // https://bugs.chromium.org/p/chromium/issues/detail?id=669363&desc=2#c1\n this.plugins.push(PrecacheStrategy.copyRedirectedCacheableResponsesPlugin);\n }\n /**\n * @private\n * @param {Request|string} request A request to run this strategy for.\n * @param {module:workbox-strategies.StrategyHandler} handler The event that\n * triggered the request.\n * @return {Promise}\n */\n async _handle(request, handler) {\n const response = await handler.cacheMatch(request);\n if (!response) {\n // If this is an `install` event then populate the cache. If this is a\n // `fetch` event (or any other event) then respond with the cached\n // response.\n if (handler.event && handler.event.type === 'install') {\n return await this._handleInstall(request, handler);\n }\n return await this._handleFetch(request, handler);\n }\n return response;\n }\n async _handleFetch(request, handler) {\n let response;\n // Fall back to the network if we don't have a cached response\n // (perhaps due to manual cache cleanup).\n if (this._fallbackToNetwork) {\n if (process.env.NODE_ENV !== 'production') {\n logger.warn(`The precached response for ` +\n `${getFriendlyURL(request.url)} in ${this.cacheName} was not ` +\n `found. Falling back to the network instead.`);\n }\n response = await handler.fetch(request);\n }\n else {\n // This shouldn't normally happen, but there are edge cases:\n // https://github.com/GoogleChrome/workbox/issues/1441\n throw new WorkboxError('missing-precache-entry', {\n cacheName: this.cacheName,\n url: request.url,\n });\n }\n if (process.env.NODE_ENV !== 'production') {\n const cacheKey = handler.params && handler.params.cacheKey ||\n await handler.getCacheKey(request, 'read');\n // Workbox is going to handle the route.\n // print the routing details to the console.\n logger.groupCollapsed(`Precaching is responding to: ` +\n getFriendlyURL(request.url));\n logger.log(`Serving the precached url: ${getFriendlyURL(cacheKey.url)}`);\n logger.groupCollapsed(`View request details here.`);\n logger.log(request);\n logger.groupEnd();\n logger.groupCollapsed(`View response details here.`);\n logger.log(response);\n logger.groupEnd();\n logger.groupEnd();\n }\n return response;\n }\n async _handleInstall(request, handler) {\n this._useDefaultCacheabilityPluginIfNeeded();\n const response = await handler.fetch(request);\n // Make sure we defer cachePut() until after we know the response\n // should be cached; see https://github.com/GoogleChrome/workbox/issues/2737\n const wasCached = await handler.cachePut(request, response.clone());\n if (!wasCached) {\n // Throwing here will lead to the `install` handler failing, which\n // we want to do if *any* of the responses aren't safe to cache.\n throw new WorkboxError('bad-precaching-response', {\n url: request.url,\n status: response.status,\n });\n }\n return response;\n }\n /**\n * This method is complex, as there a number of things to account for:\n *\n * The `plugins` array can be set at construction, and/or it might be added to\n * to at any time before the strategy is used.\n *\n * At the time the strategy is used (i.e. during an `install` event), there\n * needs to be at least one plugin that implements `cacheWillUpdate` in the\n * array, other than `copyRedirectedCacheableResponsesPlugin`.\n *\n * - If this method is called and there are no suitable `cacheWillUpdate`\n * plugins, we need to add `defaultPrecacheCacheabilityPlugin`.\n *\n * - If this method is called and there is exactly one `cacheWillUpdate`, then\n * we don't have to do anything (this might be a previously added\n * `defaultPrecacheCacheabilityPlugin`, or it might be a custom plugin).\n *\n * - If this method is called and there is more than one `cacheWillUpdate`,\n * then we need to check if one is `defaultPrecacheCacheabilityPlugin`. If so,\n * we need to remove it. (This situation is unlikely, but it could happen if\n * the strategy is used multiple times, the first without a `cacheWillUpdate`,\n * and then later on after manually adding a custom `cacheWillUpdate`.)\n *\n * See https://github.com/GoogleChrome/workbox/issues/2737 for more context.\n *\n * @private\n */\n _useDefaultCacheabilityPluginIfNeeded() {\n let defaultPluginIndex = null;\n let cacheWillUpdatePluginCount = 0;\n for (const [index, plugin] of this.plugins.entries()) {\n // Ignore the copy redirected plugin when determining what to do.\n if (plugin === PrecacheStrategy.copyRedirectedCacheableResponsesPlugin) {\n continue;\n }\n // Save the default plugin's index, in case it needs to be removed.\n if (plugin === PrecacheStrategy.defaultPrecacheCacheabilityPlugin) {\n defaultPluginIndex = index;\n }\n if (plugin.cacheWillUpdate) {\n cacheWillUpdatePluginCount++;\n }\n }\n if (cacheWillUpdatePluginCount === 0) {\n this.plugins.push(PrecacheStrategy.defaultPrecacheCacheabilityPlugin);\n }\n else if (cacheWillUpdatePluginCount > 1 && defaultPluginIndex !== null) {\n // Only remove the default plugin; multiple custom plugins are allowed.\n this.plugins.splice(defaultPluginIndex, 1);\n }\n // Nothing needs to be done if cacheWillUpdatePluginCount is 1\n }\n}\nPrecacheStrategy.defaultPrecacheCacheabilityPlugin = {\n async cacheWillUpdate({ response }) {\n if (!response || response.status >= 400) {\n return null;\n }\n return response;\n }\n};\nPrecacheStrategy.copyRedirectedCacheableResponsesPlugin = {\n async cacheWillUpdate({ response }) {\n return response.redirected ? await copyResponse(response) : response;\n }\n};\nexport { PrecacheStrategy };\n","/*\n Copyright 2019 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\nimport { assert } from 'workbox-core/_private/assert.js';\nimport { cacheNames } from 'workbox-core/_private/cacheNames.js';\nimport { logger } from 'workbox-core/_private/logger.js';\nimport { WorkboxError } from 'workbox-core/_private/WorkboxError.js';\nimport { waitUntil } from 'workbox-core/_private/waitUntil.js';\nimport { createCacheKey } from './utils/createCacheKey.js';\nimport { PrecacheInstallReportPlugin } from './utils/PrecacheInstallReportPlugin.js';\nimport { PrecacheCacheKeyPlugin } from './utils/PrecacheCacheKeyPlugin.js';\nimport { printCleanupDetails } from './utils/printCleanupDetails.js';\nimport { printInstallDetails } from './utils/printInstallDetails.js';\nimport { PrecacheStrategy } from './PrecacheStrategy.js';\nimport './_version.js';\n/**\n * Performs efficient precaching of assets.\n *\n * @memberof module:workbox-precaching\n */\nclass PrecacheController {\n /**\n * Create a new PrecacheController.\n *\n * @param {Object} [options]\n * @param {string} [options.cacheName] The cache to use for precaching.\n * @param {string} [options.plugins] Plugins to use when precaching as well\n * as responding to fetch events for precached assets.\n * @param {boolean} [options.fallbackToNetwork=true] Whether to attempt to\n * get the response from the network if there's a precache miss.\n */\n constructor({ cacheName, plugins = [], fallbackToNetwork = true } = {}) {\n this._urlsToCacheKeys = new Map();\n this._urlsToCacheModes = new Map();\n this._cacheKeysToIntegrities = new Map();\n this._strategy = new PrecacheStrategy({\n cacheName: cacheNames.getPrecacheName(cacheName),\n plugins: [\n ...plugins,\n new PrecacheCacheKeyPlugin({ precacheController: this }),\n ],\n fallbackToNetwork,\n });\n // Bind the install and activate methods to the instance.\n this.install = this.install.bind(this);\n this.activate = this.activate.bind(this);\n }\n /**\n * @type {module:workbox-precaching.PrecacheStrategy} The strategy created by this controller and\n * used to cache assets and respond to fetch events.\n */\n get strategy() {\n return this._strategy;\n }\n /**\n * Adds items to the precache list, removing any duplicates and\n * stores the files in the\n * [\"precache cache\"]{@link module:workbox-core.cacheNames} when the service\n * worker installs.\n *\n * This method can be called multiple times.\n *\n * @param {Array} [entries=[]] Array of entries to precache.\n */\n precache(entries) {\n this.addToCacheList(entries);\n if (!this._installAndActiveListenersAdded) {\n self.addEventListener('install', this.install);\n self.addEventListener('activate', this.activate);\n this._installAndActiveListenersAdded = true;\n }\n }\n /**\n * This method will add items to the precache list, removing duplicates\n * and ensuring the information is valid.\n *\n * @param {Array} entries\n * Array of entries to precache.\n */\n addToCacheList(entries) {\n if (process.env.NODE_ENV !== 'production') {\n assert.isArray(entries, {\n moduleName: 'workbox-precaching',\n className: 'PrecacheController',\n funcName: 'addToCacheList',\n paramName: 'entries',\n });\n }\n const urlsToWarnAbout = [];\n for (const entry of entries) {\n // See https://github.com/GoogleChrome/workbox/issues/2259\n if (typeof entry === 'string') {\n urlsToWarnAbout.push(entry);\n }\n else if (entry && entry.revision === undefined) {\n urlsToWarnAbout.push(entry.url);\n }\n const { cacheKey, url } = createCacheKey(entry);\n const cacheMode = (typeof entry !== 'string' && entry.revision) ?\n 'reload' : 'default';\n if (this._urlsToCacheKeys.has(url) &&\n this._urlsToCacheKeys.get(url) !== cacheKey) {\n throw new WorkboxError('add-to-cache-list-conflicting-entries', {\n firstEntry: this._urlsToCacheKeys.get(url),\n secondEntry: cacheKey,\n });\n }\n if (typeof entry !== 'string' && entry.integrity) {\n if (this._cacheKeysToIntegrities.has(cacheKey) &&\n this._cacheKeysToIntegrities.get(cacheKey) !== entry.integrity) {\n throw new WorkboxError('add-to-cache-list-conflicting-integrities', {\n url,\n });\n }\n this._cacheKeysToIntegrities.set(cacheKey, entry.integrity);\n }\n this._urlsToCacheKeys.set(url, cacheKey);\n this._urlsToCacheModes.set(url, cacheMode);\n if (urlsToWarnAbout.length > 0) {\n const warningMessage = `Workbox is precaching URLs without revision ` +\n `info: ${urlsToWarnAbout.join(', ')}\\nThis is generally NOT safe. ` +\n `Learn more at https://bit.ly/wb-precache`;\n if (process.env.NODE_ENV === 'production') {\n // Use console directly to display this warning without bloating\n // bundle sizes by pulling in all of the logger codebase in prod.\n console.warn(warningMessage);\n }\n else {\n logger.warn(warningMessage);\n }\n }\n }\n }\n /**\n * Precaches new and updated assets. Call this method from the service worker\n * install event.\n *\n * Note: this method calls `event.waitUntil()` for you, so you do not need\n * to call it yourself in your event handlers.\n *\n * @param {ExtendableEvent} event\n * @return {Promise}\n */\n install(event) {\n return waitUntil(event, async () => {\n const installReportPlugin = new PrecacheInstallReportPlugin();\n this.strategy.plugins.push(installReportPlugin);\n // Cache entries one at a time.\n // See https://github.com/GoogleChrome/workbox/issues/2528\n for (const [url, cacheKey] of this._urlsToCacheKeys) {\n const integrity = this._cacheKeysToIntegrities.get(cacheKey);\n const cacheMode = this._urlsToCacheModes.get(url);\n const request = new Request(url, {\n integrity,\n cache: cacheMode,\n credentials: 'same-origin',\n });\n await Promise.all(this.strategy.handleAll({\n params: { cacheKey },\n request,\n event,\n }));\n }\n const { updatedURLs, notUpdatedURLs } = installReportPlugin;\n if (process.env.NODE_ENV !== 'production') {\n printInstallDetails(updatedURLs, notUpdatedURLs);\n }\n return { updatedURLs, notUpdatedURLs };\n });\n }\n /**\n * Deletes assets that are no longer present in the current precache manifest.\n * Call this method from the service worker activate event.\n *\n * Note: this method calls `event.waitUntil()` for you, so you do not need\n * to call it yourself in your event handlers.\n *\n * @param {ExtendableEvent} event\n * @return {Promise}\n */\n activate(event) {\n return waitUntil(event, async () => {\n const cache = await self.caches.open(this.strategy.cacheName);\n const currentlyCachedRequests = await cache.keys();\n const expectedCacheKeys = new Set(this._urlsToCacheKeys.values());\n const deletedURLs = [];\n for (const request of currentlyCachedRequests) {\n if (!expectedCacheKeys.has(request.url)) {\n await cache.delete(request);\n deletedURLs.push(request.url);\n }\n }\n if (process.env.NODE_ENV !== 'production') {\n printCleanupDetails(deletedURLs);\n }\n return { deletedURLs };\n });\n }\n /**\n * Returns a mapping of a precached URL to the corresponding cache key, taking\n * into account the revision information for the URL.\n *\n * @return {Map} A URL to cache key mapping.\n */\n getURLsToCacheKeys() {\n return this._urlsToCacheKeys;\n }\n /**\n * Returns a list of all the URLs that have been precached by the current\n * service worker.\n *\n * @return {Array} The precached URLs.\n */\n getCachedURLs() {\n return [...this._urlsToCacheKeys.keys()];\n }\n /**\n * Returns the cache key used for storing a given URL. If that URL is\n * unversioned, like `/index.html', then the cache key will be the original\n * URL with a search parameter appended to it.\n *\n * @param {string} url A URL whose cache key you want to look up.\n * @return {string} The versioned URL that corresponds to a cache key\n * for the original URL, or undefined if that URL isn't precached.\n */\n getCacheKeyForURL(url) {\n const urlObject = new URL(url, location.href);\n return this._urlsToCacheKeys.get(urlObject.href);\n }\n /**\n * This acts as a drop-in replacement for\n * [`cache.match()`](https://developer.mozilla.org/en-US/docs/Web/API/Cache/match)\n * with the following differences:\n *\n * - It knows what the name of the precache is, and only checks in that cache.\n * - It allows you to pass in an \"original\" URL without versioning parameters,\n * and it will automatically look up the correct cache key for the currently\n * active revision of that URL.\n *\n * E.g., `matchPrecache('index.html')` will find the correct precached\n * response for the currently active service worker, even if the actual cache\n * key is `'/index.html?__WB_REVISION__=1234abcd'`.\n *\n * @param {string|Request} request The key (without revisioning parameters)\n * to look up in the precache.\n * @return {Promise}\n */\n async matchPrecache(request) {\n const url = request instanceof Request ? request.url : request;\n const cacheKey = this.getCacheKeyForURL(url);\n if (cacheKey) {\n const cache = await self.caches.open(this.strategy.cacheName);\n return cache.match(cacheKey);\n }\n return undefined;\n }\n /**\n * Returns a function that looks up `url` in the precache (taking into\n * account revision information), and returns the corresponding `Response`.\n *\n * @param {string} url The precached URL which will be used to lookup the\n * `Response`.\n * @return {module:workbox-routing~handlerCallback}\n */\n createHandlerBoundToURL(url) {\n const cacheKey = this.getCacheKeyForURL(url);\n if (!cacheKey) {\n throw new WorkboxError('non-precached-url', { url });\n }\n return (options) => {\n options.request = new Request(url);\n options.params = { cacheKey, ...options.params };\n return this.strategy.handle(options);\n };\n }\n}\nexport { PrecacheController };\n","/*\n Copyright 2020 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\nimport { logger } from 'workbox-core/_private/logger.js';\nimport { getFriendlyURL } from 'workbox-core/_private/getFriendlyURL.js';\nimport { Route } from 'workbox-routing/Route.js';\nimport { generateURLVariations } from './utils/generateURLVariations.js';\nimport './_version.js';\n/**\n * A subclass of [Route]{@link module:workbox-routing.Route} that takes a\n * [PrecacheController]{@link module:workbox-precaching.PrecacheController}\n * instance and uses it to match incoming requests and handle fetching\n * responses from the precache.\n *\n * @memberof module:workbox-precaching\n * @extends module:workbox-routing.Route\n */\nclass PrecacheRoute extends Route {\n /**\n * @param {PrecacheController} precacheController A `PrecacheController`\n * instance used to both match requests and respond to fetch events.\n * @param {Object} [options] Options to control how requests are matched\n * against the list of precached URLs.\n * @param {string} [options.directoryIndex=index.html] The `directoryIndex` will\n * check cache entries for a URLs ending with '/' to see if there is a hit when\n * appending the `directoryIndex` value.\n * @param {Array} [options.ignoreURLParametersMatching=[/^utm_/, /^fbclid$/]] An\n * array of regex's to remove search params when looking for a cache match.\n * @param {boolean} [options.cleanURLs=true] The `cleanURLs` option will\n * check the cache for the URL with a `.html` added to the end of the end.\n * @param {module:workbox-precaching~urlManipulation} [options.urlManipulation]\n * This is a function that should take a URL and return an array of\n * alternative URLs that should be checked for precache matches.\n */\n constructor(precacheController, options) {\n const match = ({ request }) => {\n const urlsToCacheKeys = precacheController.getURLsToCacheKeys();\n for (const possibleURL of generateURLVariations(request.url, options)) {\n const cacheKey = urlsToCacheKeys.get(possibleURL);\n if (cacheKey) {\n return { cacheKey };\n }\n }\n if (process.env.NODE_ENV !== 'production') {\n logger.debug(`Precaching did not find a match for ` +\n getFriendlyURL(request.url));\n }\n return;\n };\n super(match, precacheController.strategy);\n }\n}\nexport { PrecacheRoute };\n","/*\n Copyright 2019 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\nimport { removeIgnoredSearchParams } from './removeIgnoredSearchParams.js';\nimport '../_version.js';\n/**\n * Generator function that yields possible variations on the original URL to\n * check, one at a time.\n *\n * @param {string} url\n * @param {Object} options\n *\n * @private\n * @memberof module:workbox-precaching\n */\nexport function* generateURLVariations(url, { ignoreURLParametersMatching = [/^utm_/, /^fbclid$/], directoryIndex = 'index.html', cleanURLs = true, urlManipulation, } = {}) {\n const urlObject = new URL(url, location.href);\n urlObject.hash = '';\n yield urlObject.href;\n const urlWithoutIgnoredParams = removeIgnoredSearchParams(urlObject, ignoreURLParametersMatching);\n yield urlWithoutIgnoredParams.href;\n if (directoryIndex && urlWithoutIgnoredParams.pathname.endsWith('/')) {\n const directoryURL = new URL(urlWithoutIgnoredParams.href);\n directoryURL.pathname += directoryIndex;\n yield directoryURL.href;\n }\n if (cleanURLs) {\n const cleanURL = new URL(urlWithoutIgnoredParams.href);\n cleanURL.pathname += '.html';\n yield cleanURL.href;\n }\n if (urlManipulation) {\n const additionalURLs = urlManipulation({ url: urlObject });\n for (const urlToAttempt of additionalURLs) {\n yield urlToAttempt.href;\n }\n }\n}\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\nimport '../_version.js';\n/**\n * Removes any URL search parameters that should be ignored.\n *\n * @param {URL} urlObject The original URL.\n * @param {Array} ignoreURLParametersMatching RegExps to test against\n * each search parameter name. Matches mean that the search parameter should be\n * ignored.\n * @return {URL} The URL with any ignored search parameters removed.\n *\n * @private\n * @memberof module:workbox-precaching\n */\nexport function removeIgnoredSearchParams(urlObject, ignoreURLParametersMatching = []) {\n // Convert the iterable into an array at the start of the loop to make sure\n // deletion doesn't mess up iteration.\n for (const paramName of [...urlObject.searchParams.keys()]) {\n if (ignoreURLParametersMatching.some((regExp) => regExp.test(paramName))) {\n urlObject.searchParams.delete(paramName);\n }\n }\n return urlObject;\n}\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\nimport { assert } from 'workbox-core/_private/assert.js';\nimport { logger } from 'workbox-core/_private/logger.js';\nimport { WorkboxError } from 'workbox-core/_private/WorkboxError.js';\nimport { Strategy } from './Strategy.js';\nimport { messages } from './utils/messages.js';\nimport './_version.js';\n/**\n * An implementation of a [cache-first]{@link https://developers.google.com/web/fundamentals/instant-and-offline/offline-cookbook/#cache-falling-back-to-network}\n * request strategy.\n *\n * A cache first strategy is useful for assets that have been revisioned,\n * such as URLs like `/styles/example.a8f5f1.css`, since they\n * can be cached for long periods of time.\n *\n * If the network request fails, and there is no cache match, this will throw\n * a `WorkboxError` exception.\n *\n * @extends module:workbox-strategies.Strategy\n * @memberof module:workbox-strategies\n */\nclass CacheFirst extends Strategy {\n /**\n * @private\n * @param {Request|string} request A request to run this strategy for.\n * @param {module:workbox-strategies.StrategyHandler} handler The event that\n * triggered the request.\n * @return {Promise}\n */\n async _handle(request, handler) {\n const logs = [];\n if (process.env.NODE_ENV !== 'production') {\n assert.isInstance(request, Request, {\n moduleName: 'workbox-strategies',\n className: this.constructor.name,\n funcName: 'makeRequest',\n paramName: 'request',\n });\n }\n let response = await handler.cacheMatch(request);\n let error;\n if (!response) {\n if (process.env.NODE_ENV !== 'production') {\n logs.push(`No response found in the '${this.cacheName}' cache. ` +\n `Will respond with a network request.`);\n }\n try {\n response = await handler.fetchAndCachePut(request);\n }\n catch (err) {\n error = err;\n }\n if (process.env.NODE_ENV !== 'production') {\n if (response) {\n logs.push(`Got response from network.`);\n }\n else {\n logs.push(`Unable to get a response from the network.`);\n }\n }\n }\n else {\n if (process.env.NODE_ENV !== 'production') {\n logs.push(`Found a cached response in the '${this.cacheName}' cache.`);\n }\n }\n if (process.env.NODE_ENV !== 'production') {\n logger.groupCollapsed(messages.strategyStart(this.constructor.name, request));\n for (const log of logs) {\n logger.log(log);\n }\n messages.printFinalResponse(response);\n logger.groupEnd();\n }\n if (!response) {\n throw new WorkboxError('no-response', { url: request.url, error });\n }\n return response;\n }\n}\nexport { CacheFirst };\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\nimport { assert } from 'workbox-core/_private/assert.js';\nimport { cacheNames } from 'workbox-core/_private/cacheNames.js';\nimport { dontWaitFor } from 'workbox-core/_private/dontWaitFor.js';\nimport { getFriendlyURL } from 'workbox-core/_private/getFriendlyURL.js';\nimport { logger } from 'workbox-core/_private/logger.js';\nimport { registerQuotaErrorCallback } from 'workbox-core/registerQuotaErrorCallback.js';\nimport { WorkboxError } from 'workbox-core/_private/WorkboxError.js';\nimport { CacheExpiration } from './CacheExpiration.js';\nimport './_version.js';\n/**\n * This plugin can be used in a `workbox-strategy` to regularly enforce a\n * limit on the age and / or the number of cached requests.\n *\n * It can only be used with `workbox-strategy` instances that have a\n * [custom `cacheName` property set](/web/tools/workbox/guides/configure-workbox#custom_cache_names_in_strategies).\n * In other words, it can't be used to expire entries in strategy that uses the\n * default runtime cache name.\n *\n * Whenever a cached request is used or updated, this plugin will look\n * at the associated cache and remove any old or extra requests.\n *\n * When using `maxAgeSeconds`, requests may be used *once* after expiring\n * because the expiration clean up will not have occurred until *after* the\n * cached request has been used. If the request has a \"Date\" header, then\n * a light weight expiration check is performed and the request will not be\n * used immediately.\n *\n * When using `maxEntries`, the entry least-recently requested will be removed\n * from the cache first.\n *\n * @memberof module:workbox-expiration\n */\nclass ExpirationPlugin {\n /**\n * @param {Object} config\n * @param {number} [config.maxEntries] The maximum number of entries to cache.\n * Entries used the least will be removed as the maximum is reached.\n * @param {number} [config.maxAgeSeconds] The maximum age of an entry before\n * it's treated as stale and removed.\n * @param {Object} [config.matchOptions] The [`CacheQueryOptions`](https://developer.mozilla.org/en-US/docs/Web/API/Cache/delete#Parameters)\n * that will be used when calling `delete()` on the cache.\n * @param {boolean} [config.purgeOnQuotaError] Whether to opt this cache in to\n * automatic deletion if the available storage quota has been exceeded.\n */\n constructor(config = {}) {\n /**\n * A \"lifecycle\" callback that will be triggered automatically by the\n * `workbox-strategies` handlers when a `Response` is about to be returned\n * from a [Cache](https://developer.mozilla.org/en-US/docs/Web/API/Cache) to\n * the handler. It allows the `Response` to be inspected for freshness and\n * prevents it from being used if the `Response`'s `Date` header value is\n * older than the configured `maxAgeSeconds`.\n *\n * @param {Object} options\n * @param {string} options.cacheName Name of the cache the response is in.\n * @param {Response} options.cachedResponse The `Response` object that's been\n * read from a cache and whose freshness should be checked.\n * @return {Response} Either the `cachedResponse`, if it's\n * fresh, or `null` if the `Response` is older than `maxAgeSeconds`.\n *\n * @private\n */\n this.cachedResponseWillBeUsed = async ({ event, request, cacheName, cachedResponse }) => {\n if (!cachedResponse) {\n return null;\n }\n const isFresh = this._isResponseDateFresh(cachedResponse);\n // Expire entries to ensure that even if the expiration date has\n // expired, it'll only be used once.\n const cacheExpiration = this._getCacheExpiration(cacheName);\n dontWaitFor(cacheExpiration.expireEntries());\n // Update the metadata for the request URL to the current timestamp,\n // but don't `await` it as we don't want to block the response.\n const updateTimestampDone = cacheExpiration.updateTimestamp(request.url);\n if (event) {\n try {\n event.waitUntil(updateTimestampDone);\n }\n catch (error) {\n if (process.env.NODE_ENV !== 'production') {\n // The event may not be a fetch event; only log the URL if it is.\n if ('request' in event) {\n logger.warn(`Unable to ensure service worker stays alive when ` +\n `updating cache entry for ` +\n `'${getFriendlyURL(event.request.url)}'.`);\n }\n }\n }\n }\n return isFresh ? cachedResponse : null;\n };\n /**\n * A \"lifecycle\" callback that will be triggered automatically by the\n * `workbox-strategies` handlers when an entry is added to a cache.\n *\n * @param {Object} options\n * @param {string} options.cacheName Name of the cache that was updated.\n * @param {string} options.request The Request for the cached entry.\n *\n * @private\n */\n this.cacheDidUpdate = async ({ cacheName, request }) => {\n if (process.env.NODE_ENV !== 'production') {\n assert.isType(cacheName, 'string', {\n moduleName: 'workbox-expiration',\n className: 'Plugin',\n funcName: 'cacheDidUpdate',\n paramName: 'cacheName',\n });\n assert.isInstance(request, Request, {\n moduleName: 'workbox-expiration',\n className: 'Plugin',\n funcName: 'cacheDidUpdate',\n paramName: 'request',\n });\n }\n const cacheExpiration = this._getCacheExpiration(cacheName);\n await cacheExpiration.updateTimestamp(request.url);\n await cacheExpiration.expireEntries();\n };\n if (process.env.NODE_ENV !== 'production') {\n if (!(config.maxEntries || config.maxAgeSeconds)) {\n throw new WorkboxError('max-entries-or-age-required', {\n moduleName: 'workbox-expiration',\n className: 'Plugin',\n funcName: 'constructor',\n });\n }\n if (config.maxEntries) {\n assert.isType(config.maxEntries, 'number', {\n moduleName: 'workbox-expiration',\n className: 'Plugin',\n funcName: 'constructor',\n paramName: 'config.maxEntries',\n });\n }\n if (config.maxAgeSeconds) {\n assert.isType(config.maxAgeSeconds, 'number', {\n moduleName: 'workbox-expiration',\n className: 'Plugin',\n funcName: 'constructor',\n paramName: 'config.maxAgeSeconds',\n });\n }\n }\n this._config = config;\n this._maxAgeSeconds = config.maxAgeSeconds;\n this._cacheExpirations = new Map();\n if (config.purgeOnQuotaError) {\n registerQuotaErrorCallback(() => this.deleteCacheAndMetadata());\n }\n }\n /**\n * A simple helper method to return a CacheExpiration instance for a given\n * cache name.\n *\n * @param {string} cacheName\n * @return {CacheExpiration}\n *\n * @private\n */\n _getCacheExpiration(cacheName) {\n if (cacheName === cacheNames.getRuntimeName()) {\n throw new WorkboxError('expire-custom-caches-only');\n }\n let cacheExpiration = this._cacheExpirations.get(cacheName);\n if (!cacheExpiration) {\n cacheExpiration = new CacheExpiration(cacheName, this._config);\n this._cacheExpirations.set(cacheName, cacheExpiration);\n }\n return cacheExpiration;\n }\n /**\n * @param {Response} cachedResponse\n * @return {boolean}\n *\n * @private\n */\n _isResponseDateFresh(cachedResponse) {\n if (!this._maxAgeSeconds) {\n // We aren't expiring by age, so return true, it's fresh\n return true;\n }\n // Check if the 'date' header will suffice a quick expiration check.\n // See https://github.com/GoogleChromeLabs/sw-toolbox/issues/164 for\n // discussion.\n const dateHeaderTimestamp = this._getDateHeaderTimestamp(cachedResponse);\n if (dateHeaderTimestamp === null) {\n // Unable to parse date, so assume it's fresh.\n return true;\n }\n // If we have a valid headerTime, then our response is fresh iff the\n // headerTime plus maxAgeSeconds is greater than the current time.\n const now = Date.now();\n return dateHeaderTimestamp >= now - (this._maxAgeSeconds * 1000);\n }\n /**\n * This method will extract the data header and parse it into a useful\n * value.\n *\n * @param {Response} cachedResponse\n * @return {number|null}\n *\n * @private\n */\n _getDateHeaderTimestamp(cachedResponse) {\n if (!cachedResponse.headers.has('date')) {\n return null;\n }\n const dateHeader = cachedResponse.headers.get('date');\n const parsedDate = new Date(dateHeader);\n const headerTime = parsedDate.getTime();\n // If the Date header was invalid for some reason, parsedDate.getTime()\n // will return NaN.\n if (isNaN(headerTime)) {\n return null;\n }\n return headerTime;\n }\n /**\n * This is a helper method that performs two operations:\n *\n * - Deletes *all* the underlying Cache instances associated with this plugin\n * instance, by calling caches.delete() on your behalf.\n * - Deletes the metadata from IndexedDB used to keep track of expiration\n * details for each Cache instance.\n *\n * When using cache expiration, calling this method is preferable to calling\n * `caches.delete()` directly, since this will ensure that the IndexedDB\n * metadata is also cleanly removed and open IndexedDB instances are deleted.\n *\n * Note that if you're *not* using cache expiration for a given cache, calling\n * `caches.delete()` and passing in the cache's name should be sufficient.\n * There is no Workbox-specific method needed for cleanup in that case.\n */\n async deleteCacheAndMetadata() {\n // Do this one at a time instead of all at once via `Promise.all()` to\n // reduce the chance of inconsistency if a promise rejects.\n for (const [cacheName, cacheExpiration] of this._cacheExpirations) {\n await self.caches.delete(cacheName);\n await cacheExpiration.delete();\n }\n // Reset this._cacheExpirations to its initial state.\n this._cacheExpirations = new Map();\n }\n}\nexport { ExpirationPlugin };\n","/*\n Copyright 2019 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\nimport { logger } from './_private/logger.js';\nimport { assert } from './_private/assert.js';\nimport { quotaErrorCallbacks } from './models/quotaErrorCallbacks.js';\nimport './_version.js';\n/**\n * Adds a function to the set of quotaErrorCallbacks that will be executed if\n * there's a quota error.\n *\n * @param {Function} callback\n * @memberof module:workbox-core\n */\nfunction registerQuotaErrorCallback(callback) {\n if (process.env.NODE_ENV !== 'production') {\n assert.isType(callback, 'function', {\n moduleName: 'workbox-core',\n funcName: 'register',\n paramName: 'callback',\n });\n }\n quotaErrorCallbacks.add(callback);\n if (process.env.NODE_ENV !== 'production') {\n logger.log('Registered a callback to respond to quota errors.', callback);\n }\n}\nexport { registerQuotaErrorCallback };\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\nimport { assert } from 'workbox-core/_private/assert.js';\nimport { logger } from 'workbox-core/_private/logger.js';\nimport { WorkboxError } from 'workbox-core/_private/WorkboxError.js';\nimport { cacheOkAndOpaquePlugin } from './plugins/cacheOkAndOpaquePlugin.js';\nimport { Strategy } from './Strategy.js';\nimport { messages } from './utils/messages.js';\nimport './_version.js';\n/**\n * An implementation of a\n * [network first]{@link https://developers.google.com/web/fundamentals/instant-and-offline/offline-cookbook/#network-falling-back-to-cache}\n * request strategy.\n *\n * By default, this strategy will cache responses with a 200 status code as\n * well as [opaque responses]{@link https://developers.google.com/web/tools/workbox/guides/handle-third-party-requests}.\n * Opaque responses are are cross-origin requests where the response doesn't\n * support [CORS]{@link https://enable-cors.org/}.\n *\n * If the network request fails, and there is no cache match, this will throw\n * a `WorkboxError` exception.\n *\n * @extends module:workbox-strategies.Strategy\n * @memberof module:workbox-strategies\n */\nclass NetworkFirst extends Strategy {\n /**\n * @param {Object} [options]\n * @param {string} [options.cacheName] Cache name to store and retrieve\n * requests. Defaults to cache names provided by\n * [workbox-core]{@link module:workbox-core.cacheNames}.\n * @param {Array} [options.plugins] [Plugins]{@link https://developers.google.com/web/tools/workbox/guides/using-plugins}\n * to use in conjunction with this caching strategy.\n * @param {Object} [options.fetchOptions] Values passed along to the\n * [`init`](https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/fetch#Parameters)\n * of [non-navigation](https://github.com/GoogleChrome/workbox/issues/1796)\n * `fetch()` requests made by this strategy.\n * @param {Object} [options.matchOptions] [`CacheQueryOptions`](https://w3c.github.io/ServiceWorker/#dictdef-cachequeryoptions)\n * @param {number} [options.networkTimeoutSeconds] If set, any network requests\n * that fail to respond within the timeout will fallback to the cache.\n *\n * This option can be used to combat\n * \"[lie-fi]{@link https://developers.google.com/web/fundamentals/performance/poor-connectivity/#lie-fi}\"\n * scenarios.\n */\n constructor(options = {}) {\n super(options);\n // If this instance contains no plugins with a 'cacheWillUpdate' callback,\n // prepend the `cacheOkAndOpaquePlugin` plugin to the plugins list.\n if (!this.plugins.some((p) => 'cacheWillUpdate' in p)) {\n this.plugins.unshift(cacheOkAndOpaquePlugin);\n }\n this._networkTimeoutSeconds = options.networkTimeoutSeconds || 0;\n if (process.env.NODE_ENV !== 'production') {\n if (this._networkTimeoutSeconds) {\n assert.isType(this._networkTimeoutSeconds, 'number', {\n moduleName: 'workbox-strategies',\n className: this.constructor.name,\n funcName: 'constructor',\n paramName: 'networkTimeoutSeconds',\n });\n }\n }\n }\n /**\n * @private\n * @param {Request|string} request A request to run this strategy for.\n * @param {module:workbox-strategies.StrategyHandler} handler The event that\n * triggered the request.\n * @return {Promise}\n */\n async _handle(request, handler) {\n const logs = [];\n if (process.env.NODE_ENV !== 'production') {\n assert.isInstance(request, Request, {\n moduleName: 'workbox-strategies',\n className: this.constructor.name,\n funcName: 'handle',\n paramName: 'makeRequest',\n });\n }\n const promises = [];\n let timeoutId;\n if (this._networkTimeoutSeconds) {\n const { id, promise } = this._getTimeoutPromise({ request, logs, handler });\n timeoutId = id;\n promises.push(promise);\n }\n const networkPromise = this._getNetworkPromise({ timeoutId, request, logs, handler });\n promises.push(networkPromise);\n const response = await handler.waitUntil((async () => {\n // Promise.race() will resolve as soon as the first promise resolves.\n return await handler.waitUntil(Promise.race(promises)) ||\n // If Promise.race() resolved with null, it might be due to a network\n // timeout + a cache miss. If that were to happen, we'd rather wait until\n // the networkPromise resolves instead of returning null.\n // Note that it's fine to await an already-resolved promise, so we don't\n // have to check to see if it's still \"in flight\".\n await networkPromise;\n })());\n if (process.env.NODE_ENV !== 'production') {\n logger.groupCollapsed(messages.strategyStart(this.constructor.name, request));\n for (const log of logs) {\n logger.log(log);\n }\n messages.printFinalResponse(response);\n logger.groupEnd();\n }\n if (!response) {\n throw new WorkboxError('no-response', { url: request.url });\n }\n return response;\n }\n /**\n * @param {Object} options\n * @param {Request} options.request\n * @param {Array} options.logs A reference to the logs array\n * @param {Event} options.event\n * @return {Promise}\n *\n * @private\n */\n _getTimeoutPromise({ request, logs, handler }) {\n let timeoutId;\n const timeoutPromise = new Promise((resolve) => {\n const onNetworkTimeout = async () => {\n if (process.env.NODE_ENV !== 'production') {\n logs.push(`Timing out the network response at ` +\n `${this._networkTimeoutSeconds} seconds.`);\n }\n resolve(await handler.cacheMatch(request));\n };\n timeoutId = setTimeout(onNetworkTimeout, this._networkTimeoutSeconds * 1000);\n });\n return {\n promise: timeoutPromise,\n id: timeoutId,\n };\n }\n /**\n * @param {Object} options\n * @param {number|undefined} options.timeoutId\n * @param {Request} options.request\n * @param {Array} options.logs A reference to the logs Array.\n * @param {Event} options.event\n * @return {Promise}\n *\n * @private\n */\n async _getNetworkPromise({ timeoutId, request, logs, handler }) {\n let error;\n let response;\n try {\n response = await handler.fetchAndCachePut(request);\n }\n catch (fetchError) {\n error = fetchError;\n }\n if (timeoutId) {\n clearTimeout(timeoutId);\n }\n if (process.env.NODE_ENV !== 'production') {\n if (response) {\n logs.push(`Got response from network.`);\n }\n else {\n logs.push(`Unable to get a response from the network. Will respond ` +\n `with a cached response.`);\n }\n }\n if (error || !response) {\n response = await handler.cacheMatch(request);\n if (process.env.NODE_ENV !== 'production') {\n if (response) {\n logs.push(`Found a cached response in the '${this.cacheName}'` +\n ` cache.`);\n }\n else {\n logs.push(`No response found in the '${this.cacheName}' cache.`);\n }\n }\n }\n return response;\n }\n}\nexport { NetworkFirst };\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\nimport { assert } from 'workbox-core/_private/assert.js';\nimport { logger } from 'workbox-core/_private/logger.js';\nimport { WorkboxError } from 'workbox-core/_private/WorkboxError.js';\nimport { cacheOkAndOpaquePlugin } from './plugins/cacheOkAndOpaquePlugin.js';\nimport { Strategy } from './Strategy.js';\nimport { messages } from './utils/messages.js';\nimport './_version.js';\n/**\n * An implementation of a\n * [stale-while-revalidate]{@link https://developers.google.com/web/fundamentals/instant-and-offline/offline-cookbook/#stale-while-revalidate}\n * request strategy.\n *\n * Resources are requested from both the cache and the network in parallel.\n * The strategy will respond with the cached version if available, otherwise\n * wait for the network response. The cache is updated with the network response\n * with each successful request.\n *\n * By default, this strategy will cache responses with a 200 status code as\n * well as [opaque responses]{@link https://developers.google.com/web/tools/workbox/guides/handle-third-party-requests}.\n * Opaque responses are cross-origin requests where the response doesn't\n * support [CORS]{@link https://enable-cors.org/}.\n *\n * If the network request fails, and there is no cache match, this will throw\n * a `WorkboxError` exception.\n *\n * @extends module:workbox-strategies.Strategy\n * @memberof module:workbox-strategies\n */\nclass StaleWhileRevalidate extends Strategy {\n /**\n * @param {Object} [options]\n * @param {string} [options.cacheName] Cache name to store and retrieve\n * requests. Defaults to cache names provided by\n * [workbox-core]{@link module:workbox-core.cacheNames}.\n * @param {Array} [options.plugins] [Plugins]{@link https://developers.google.com/web/tools/workbox/guides/using-plugins}\n * to use in conjunction with this caching strategy.\n * @param {Object} [options.fetchOptions] Values passed along to the\n * [`init`](https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/fetch#Parameters)\n * of [non-navigation](https://github.com/GoogleChrome/workbox/issues/1796)\n * `fetch()` requests made by this strategy.\n * @param {Object} [options.matchOptions] [`CacheQueryOptions`](https://w3c.github.io/ServiceWorker/#dictdef-cachequeryoptions)\n */\n constructor(options) {\n super(options);\n // If this instance contains no plugins with a 'cacheWillUpdate' callback,\n // prepend the `cacheOkAndOpaquePlugin` plugin to the plugins list.\n if (!this.plugins.some((p) => 'cacheWillUpdate' in p)) {\n this.plugins.unshift(cacheOkAndOpaquePlugin);\n }\n }\n /**\n * @private\n * @param {Request|string} request A request to run this strategy for.\n * @param {module:workbox-strategies.StrategyHandler} handler The event that\n * triggered the request.\n * @return {Promise}\n */\n async _handle(request, handler) {\n const logs = [];\n if (process.env.NODE_ENV !== 'production') {\n assert.isInstance(request, Request, {\n moduleName: 'workbox-strategies',\n className: this.constructor.name,\n funcName: 'handle',\n paramName: 'request',\n });\n }\n const fetchAndCachePromise = handler\n .fetchAndCachePut(request)\n .catch(() => {\n // Swallow this error because a 'no-response' error will be thrown in\n // main handler return flow. This will be in the `waitUntil()` flow.\n });\n let response = await handler.cacheMatch(request);\n let error;\n if (response) {\n if (process.env.NODE_ENV !== 'production') {\n logs.push(`Found a cached response in the '${this.cacheName}'` +\n ` cache. Will update with the network response in the background.`);\n }\n }\n else {\n if (process.env.NODE_ENV !== 'production') {\n logs.push(`No response found in the '${this.cacheName}' cache. ` +\n `Will wait for the network response.`);\n }\n try {\n // NOTE(philipwalton): Really annoying that we have to type cast here.\n // https://github.com/microsoft/TypeScript/issues/20006\n response = await fetchAndCachePromise;\n }\n catch (err) {\n error = err;\n }\n }\n if (process.env.NODE_ENV !== 'production') {\n logger.groupCollapsed(messages.strategyStart(this.constructor.name, request));\n for (const log of logs) {\n logger.log(log);\n }\n messages.printFinalResponse(response);\n logger.groupEnd();\n }\n if (!response) {\n throw new WorkboxError('no-response', { url: request.url, error });\n }\n return response;\n }\n}\nexport { StaleWhileRevalidate };\n","/*\n Copyright 2019 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\nimport { cacheNames } from 'workbox-core/_private/cacheNames.js';\nimport { logger } from 'workbox-core/_private/logger.js';\nimport { deleteOutdatedCaches } from './utils/deleteOutdatedCaches.js';\nimport './_version.js';\n/**\n * Adds an `activate` event listener which will clean up incompatible\n * precaches that were created by older versions of Workbox.\n *\n * @memberof module:workbox-precaching\n */\nfunction cleanupOutdatedCaches() {\n // See https://github.com/Microsoft/TypeScript/issues/28357#issuecomment-436484705\n self.addEventListener('activate', ((event) => {\n const cacheName = cacheNames.getPrecacheName();\n event.waitUntil(deleteOutdatedCaches(cacheName).then((cachesDeleted) => {\n if (process.env.NODE_ENV !== 'production') {\n if (cachesDeleted.length > 0) {\n logger.log(`The following out-of-date precaches were cleaned up ` +\n `automatically:`, cachesDeleted);\n }\n }\n }));\n }));\n}\nexport { cleanupOutdatedCaches };\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\nimport '../_version.js';\nconst SUBSTRING_TO_FIND = '-precache-';\n/**\n * Cleans up incompatible precaches that were created by older versions of\n * Workbox, by a service worker registered under the current scope.\n *\n * This is meant to be called as part of the `activate` event.\n *\n * This should be safe to use as long as you don't include `substringToFind`\n * (defaulting to `-precache-`) in your non-precache cache names.\n *\n * @param {string} currentPrecacheName The cache name currently in use for\n * precaching. This cache won't be deleted.\n * @param {string} [substringToFind='-precache-'] Cache names which include this\n * substring will be deleted (excluding `currentPrecacheName`).\n * @return {Array} A list of all the cache names that were deleted.\n *\n * @private\n * @memberof module:workbox-precaching\n */\nconst deleteOutdatedCaches = async (currentPrecacheName, substringToFind = SUBSTRING_TO_FIND) => {\n const cacheNames = await self.caches.keys();\n const cacheNamesToDelete = cacheNames.filter((cacheName) => {\n return cacheName.includes(substringToFind) &&\n cacheName.includes(self.registration.scope) &&\n cacheName !== currentPrecacheName;\n });\n await Promise.all(cacheNamesToDelete.map((cacheName) => self.caches.delete(cacheName)));\n return cacheNamesToDelete;\n};\nexport { deleteOutdatedCaches };\n","/*\n Copyright 2019 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\nimport './_version.js';\n/**\n * Claim any currently available clients once the service worker\n * becomes active. This is normally used in conjunction with `skipWaiting()`.\n *\n * @memberof module:workbox-core\n */\nfunction clientsClaim() {\n self.addEventListener('activate', () => self.clients.claim());\n}\nexport { clientsClaim };\n","/*\n Copyright 2019 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\nimport { addRoute } from './addRoute.js';\nimport { precache } from './precache.js';\nimport './_version.js';\n/**\n * This method will add entries to the precache list and add a route to\n * respond to fetch events.\n *\n * This is a convenience method that will call\n * [precache()]{@link module:workbox-precaching.precache} and\n * [addRoute()]{@link module:workbox-precaching.addRoute} in a single call.\n *\n * @param {Array} entries Array of entries to precache.\n * @param {Object} [options] See\n * [PrecacheRoute options]{@link module:workbox-precaching.PrecacheRoute}.\n *\n * @memberof module:workbox-precaching\n */\nfunction precacheAndRoute(entries, options) {\n precache(entries);\n addRoute(options);\n}\nexport { precacheAndRoute };\n","/*\n Copyright 2019 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\nimport { getOrCreatePrecacheController } from './utils/getOrCreatePrecacheController.js';\nimport './_version.js';\n/**\n * Adds items to the precache list, removing any duplicates and\n * stores the files in the\n * [\"precache cache\"]{@link module:workbox-core.cacheNames} when the service\n * worker installs.\n *\n * This method can be called multiple times.\n *\n * Please note: This method **will not** serve any of the cached files for you.\n * It only precaches files. To respond to a network request you call\n * [addRoute()]{@link module:workbox-precaching.addRoute}.\n *\n * If you have a single array of files to precache, you can just call\n * [precacheAndRoute()]{@link module:workbox-precaching.precacheAndRoute}.\n *\n * @param {Array} [entries=[]] Array of entries to precache.\n *\n * @memberof module:workbox-precaching\n */\nfunction precache(entries) {\n const precacheController = getOrCreatePrecacheController();\n precacheController.precache(entries);\n}\nexport { precache };\n","/*\n Copyright 2019 Google LLC\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\nimport { registerRoute } from 'workbox-routing/registerRoute.js';\nimport { getOrCreatePrecacheController } from './utils/getOrCreatePrecacheController.js';\nimport { PrecacheRoute } from './PrecacheRoute.js';\nimport './_version.js';\n/**\n * Add a `fetch` listener to the service worker that will\n * respond to\n * [network requests]{@link https://developer.mozilla.org/en-US/docs/Web/API/Service_Worker_API/Using_Service_Workers#Custom_responses_to_requests}\n * with precached assets.\n *\n * Requests for assets that aren't precached, the `FetchEvent` will not be\n * responded to, allowing the event to fall through to other `fetch` event\n * listeners.\n *\n * @param {Object} [options] See\n * [PrecacheRoute options]{@link module:workbox-precaching.PrecacheRoute}.\n *\n * @memberof module:workbox-precaching\n */\nfunction addRoute(options) {\n const precacheController = getOrCreatePrecacheController();\n const precacheRoute = new PrecacheRoute(precacheController, options);\n registerRoute(precacheRoute);\n}\nexport { addRoute };\n"],"names":["self","_","e","messageGenerator","code","args","msg","length","JSON","stringify","WorkboxError","Error","constructor","errorCode","details","name","normalizeHandler","handler","handle","Route","match","method","setCatchHandler","catchHandler","RegExpRoute","regExp","url","result","exec","href","origin","location","index","slice","Router","_routes","Map","_defaultHandlerMap","this","addFetchListener","addEventListener","event","request","responsePromise","handleRequest","respondWith","addCacheListener","data","type","payload","requestPromises","Promise","all","urlsToCache","map","entry","Request","waitUntil","ports","then","postMessage","URL","protocol","startsWith","sameOrigin","params","route","findMatchingRoute","has","get","err","reject","_catchHandler","catch","async","catchErr","routes","matchResult","Array","isArray","Object","keys","undefined","setDefaultHandler","set","registerRoute","push","unregisterRoute","routeIndex","indexOf","splice","defaultRouter","getOrCreateDefaultRouter","capture","captureUrl","RegExp","moduleName","funcName","paramName","cacheOkAndOpaquePlugin","cacheWillUpdate","response","status","_cacheNameDetails","googleAnalytics","precache","prefix","runtime","suffix","registration","scope","_createCacheName","cacheName","filter","value","join","cacheNames","userCacheName","stripParams","fullURL","ignoreParams","strippedURL","param","searchParams","delete","Deferred","promise","resolve","quotaErrorCallbacks","Set","toRequest","input","StrategyHandler","strategy","options","_cacheKeys","assign","_strategy","_handlerDeferred","_extendLifetimePromises","_plugins","plugins","_pluginStateMap","plugin","mode","FetchEvent","preloadResponse","possiblePreloadResponse","originalRequest","hasCallback","clone","cb","iterateCallbacks","thrownError","pluginFilteredRequest","fetchResponse","fetch","fetchOptions","callback","error","runCallbacks","responseClone","cachePut","key","cachedResponse","matchOptions","effectiveRequest","getCacheKey","multiMatchOptions","caches","ms","setTimeout","String","replace","responseToCache","_ensureResponseSafeToCache","cache","open","hasCacheUpdateCallback","oldResponse","strippedRequestURL","keysOptions","ignoreSearch","cacheKeys","cacheKey","cacheMatchIgnoreParams","put","executeQuotaErrorCallbacks","newResponse","state","statefulCallback","statefulParam","shift","destroy","pluginsUsed","Strategy","responseDone","handleAll","_getResponse","_awaitComplete","_handle","doneWaiting","waitUntilError","dontWaitFor","DBWrapper","version","onupgradeneeded","onversionchange","_db","_name","_version","_onupgradeneeded","_onversionchange","close","openRequestTimedOut","OPEN_TIMEOUT","openRequest","indexedDB","onerror","evt","transaction","abort","onsuccess","db","bind","storeName","query","getAllKeys","count","getAllMatching","includeKeys","direction","txn","done","store","objectStore","target","results","openCursor","cursor","continue","storeNames","onabort","oncomplete","objStore","apply","prototype","methodsToWrap","readonly","readwrite","methods","entries","IDBObjectStore","_call","OBJECT_STORE_NAME","normalizeURL","unNormalizedUrl","hash","CacheTimestampsModel","_cacheName","_handleUpgrade","createObjectStore","keyPath","createIndex","unique","deleteDatabase","onblocked","timestamp","id","_getId","minTimestamp","maxCount","entriesToDelete","entriesNotDeletedCount","urlsDeleted","CacheExpiration","config","_isRunning","_rerunRequested","_maxEntries","maxEntries","_maxAgeSeconds","maxAgeSeconds","_matchOptions","_timestampModel","Date","now","urlsExpired","expireEntries","setTimestamp","getTimestamp","Infinity","asyncFn","returnPromise","createCacheKey","urlObject","revision","cacheKeyURL","originalURL","PrecacheInstallReportPlugin","updatedURLs","notUpdatedURLs","handlerWillStart","cachedResponseWillBeUsed","PrecacheCacheKeyPlugin","precacheController","cacheKeyWillBeUsed","_precacheController","getCacheKeyForURL","supportStatus","copyResponse","modifier","clonedResponse","responseInit","headers","Headers","statusText","modifiedResponseInit","body","testResponse","Response","canConstructResponseFromBodyStream","blob","PrecacheStrategy","_fallbackToNetwork","fallbackToNetwork","copyRedirectedCacheableResponsesPlugin","cacheMatch","_handleInstall","_handleFetch","_useDefaultCacheabilityPluginIfNeeded","defaultPluginIndex","cacheWillUpdatePluginCount","defaultPrecacheCacheabilityPlugin","redirected","PrecacheController","_urlsToCacheKeys","_urlsToCacheModes","_cacheKeysToIntegrities","install","activate","addToCacheList","_installAndActiveListenersAdded","urlsToWarnAbout","cacheMode","firstEntry","secondEntry","integrity","warningMessage","console","warn","installReportPlugin","credentials","currentlyCachedRequests","expectedCacheKeys","values","deletedURLs","getURLsToCacheKeys","getCachedURLs","createHandlerBoundToURL","getOrCreatePrecacheController","PrecacheRoute","urlsToCacheKeys","possibleURL","ignoreURLParametersMatching","directoryIndex","cleanURLs","urlManipulation","urlWithoutIgnoredParams","some","test","removeIgnoredSearchParams","pathname","endsWith","directoryURL","cleanURL","additionalURLs","urlToAttempt","generateURLVariations","fetchAndCachePut","isFresh","_isResponseDateFresh","cacheExpiration","_getCacheExpiration","updateTimestampDone","updateTimestamp","cacheDidUpdate","_config","_cacheExpirations","purgeOnQuotaError","deleteCacheAndMetadata","add","dateHeaderTimestamp","_getDateHeaderTimestamp","dateHeader","headerTime","getTime","isNaN","p","unshift","_networkTimeoutSeconds","networkTimeoutSeconds","logs","promises","timeoutId","_getTimeoutPromise","networkPromise","_getNetworkPromise","race","fetchError","clearTimeout","fetchAndCachePromise","currentPrecacheName","substringToFind","cacheNamesToDelete","includes","deleteOutdatedCaches","cachesDeleted","clients","claim","addRoute"],"mappings":"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"} \ No newline at end of file diff --git a/public/worker-6L8AMbRb0NKpPgic9tDJq.js b/public/worker-6L8AMbRb0NKpPgic9tDJq.js deleted file mode 100644 index 81d0a770f..000000000 --- a/public/worker-6L8AMbRb0NKpPgic9tDJq.js +++ /dev/null @@ -1 +0,0 @@ -self.__WB_DISABLE_DEV_LOGS = !0 diff --git a/public/worker-development.js b/public/worker-development.js new file mode 100644 index 000000000..41d931cd1 --- /dev/null +++ b/public/worker-development.js @@ -0,0 +1,5 @@ +/******/ (() => { // webpackBootstrap +var __webpack_exports__ = {}; +self.__WB_DISABLE_DEV_LOGS = true; +/******/ })() +; \ No newline at end of file