all repos — caroster @ de693e86e975ebf6ed7f19f82762e553d852de03

[Octree] Group carpool to your event https://caroster.io

fix: šŸ› Set complete profile on register

#206
Tim Izzo tim@octree.ch
Wed, 27 Oct 2021 14:15:32 +0200
commit

de693e86e975ebf6ed7f19f82762e553d852de03

parent

73cc94b7e5b8bf32dc77f112aa686c7d474fbb82

M backend/extensions/users-permissions/config/schema.graphql.jsbackend/extensions/users-permissions/config/schema.graphql.js

@@ -7,6 +7,12 @@

extend input editUserInput { old_password: String } + + extend input UsersPermissionsRegisterInput { + firstName: String + lastName: String + lang: String + } `, mutation: ` updateMe(input: editUserInput): updateUserPayload!
M frontend/containers/SignUpForm/index.jsfrontend/containers/SignUpForm/index.tsx

@@ -9,6 +9,7 @@ import Typography from '@material-ui/core/Typography';

import CircularProgress from '@material-ui/core/CircularProgress'; import {makeStyles} from '@material-ui/core/styles'; import useToastsStore from '../../stores/useToastStore'; +import useLangStore from '../../stores/useLangStore'; import {useRegisterMutation} from '../../generated/graphql'; const SignUp = () => {

@@ -18,6 +19,7 @@ const addToast = useToastsStore(s => s.addToast);

const router = useRouter(); const [isLoading, setIsLoading] = useState(false); const [error, setError] = useState(''); + const lang = useLangStore(s => s.language); const [firstName, setFirstName] = useState(''); const [lastName, setLastName] = useState(''); const [email, setEmail] = useState('');

@@ -38,9 +40,14 @@ setIsLoading(true);

try { await register({ variables: { - email, - password, - username: `${firstName} ${lastName}`, + user: { + username: `${firstName} ${lastName}`, + email, + password, + firstName, + lastName, + lang, + }, }, }); router.push('/auth/confirm');

@@ -135,9 +142,14 @@ );

}; const getStrapiError = error => { - if (error.message?.[0]?.messages?.[0]) return error.message[0].messages[0].id; - return error?.graphQLErrors?.[0].extensions.exception.data.message?.[0] - ?.messages[0].id; + try { + if (error.message?.[0]?.messages?.[0]) + return error.message[0].messages[0].id; + return error?.graphQLErrors?.[0].extensions.exception.data.message?.[0] + ?.messages[0].id; + } catch { + return 'generic.error'; + } }; const useStyles = makeStyles(theme => ({
M frontend/generated/graphql.tsxfrontend/generated/graphql.tsx

@@ -1145,6 +1145,9 @@ export type UsersPermissionsRegisterInput = {

username: Scalars['String']; email: Scalars['String']; password: Scalars['String']; + firstName?: Maybe<Scalars['String']>; + lastName?: Maybe<Scalars['String']>; + lang?: Maybe<Scalars['String']>; }; export type UsersPermissionsRole = {

@@ -1646,9 +1649,7 @@ & Pick<UsersPermissionsMe, 'id' | 'username' | 'email' | 'confirmed'>

); export type RegisterMutationVariables = Exact<{ - email: Scalars['String']; - password: Scalars['String']; - username: Scalars['String']; + user: UsersPermissionsRegisterInput; }>;

@@ -1966,8 +1967,8 @@ }

} `; export const RegisterDocument = gql` - mutation register($email: String!, $password: String!, $username: String!) { - register(input: {email: $email, password: $password, username: $username}) { + mutation register($user: UsersPermissionsRegisterInput!) { + register(input: $user) { jwt user { ...MeFields

@@ -1990,9 +1991,7 @@ *

* @example * const [registerMutation, { data, loading, error }] = useRegisterMutation({ * variables: { - * email: // value for 'email' - * password: // value for 'password' - * username: // value for 'username' + * user: // value for 'user' * }, * }); */
M frontend/graphql/auth.gqlfrontend/graphql/auth.gql

@@ -5,8 +5,8 @@ email

confirmed } -mutation register($email: String!, $password: String!, $username: String!) { - register(input: {email: $email, password: $password, username: $username}) { +mutation register($user: UsersPermissionsRegisterInput!) { + register(input: $user) { jwt user { ...MeFields
M frontend/next.config.jsfrontend/next.config.js

@@ -1,8 +1,7 @@

const withPWA = require('next-pwa'); -const {withSentryConfig} = require('@sentry/nextjs'); const {NODE_ENV} = process.env; -const moduleExports = withPWA({ +module.exports = withPWA({ pwa: { dest: 'public', disable: NODE_ENV !== 'production',

@@ -14,11 +13,3 @@ typescript: {

ignoreBuildErrors: true, }, }); - -const SentryWebpackPluginOptions = { - // For all available options, see: - // https://github.com/getsentry/sentry-webpack-plugin#options. - silent: true, -}; - -module.exports = withSentryConfig(moduleExports, SentryWebpackPluginOptions);
M frontend/package.jsonfrontend/package.json

@@ -12,7 +12,6 @@ },

"dependencies": { "@apollo/client": "^3.3.7", "@material-ui/core": "^4.11.3", - "@sentry/nextjs": "^6.7.2", "@types/node": "^14.14.20", "@types/react": "^17.0.0", "deepmerge": "^4.2.2",
M frontend/public/sw.jsfrontend/public/sw.js

@@ -1,2 +1,1 @@

-if(!self.define){const e=e=>{"require"!==e&&(e+=".js");let s=Promise.resolve();return n[e]||(s=new Promise((async s=>{if("document"in self){const n=document.createElement("script");n.src=e,document.head.appendChild(n),n.onload=s}else importScripts(e),s()}))),s.then((()=>{if(!n[e])throw new Error(`Module ${e} didnā€™t register its module`);return n[e]}))},s=(s,n)=>{Promise.all(s.map(e)).then((e=>n(1===e.length?e[0]:e)))},n={require:Promise.resolve(s)};self.define=(s,a,t)=>{n[s]||(n[s]=Promise.resolve().then((()=>{let n={};const c={uri:location.origin+s.slice(1)};return Promise.all(a.map((s=>{switch(s){case"exports":return n;case"module":return c;default:return e(s)}}))).then((e=>{const s=t(...e);return n.default||(n.default=s),n}))})))}}define("./sw.js",["./workbox-ea903bce"],(function(e){"use strict";importScripts(),self.skipWaiting(),e.clientsClaim(),e.precacheAndRoute([{url:"/_next/static/85nz_qufRpLHHj-H4oCY5/_buildManifest.js",revision:"85nz_qufRpLHHj-H4oCY5"},{url:"/_next/static/85nz_qufRpLHHj-H4oCY5/_ssgManifest.js",revision:"85nz_qufRpLHHj-H4oCY5"},{url:"/_next/static/chunks/413-9fc97176575377d8c5cb.js",revision:"85nz_qufRpLHHj-H4oCY5"},{url:"/_next/static/chunks/413-9fc97176575377d8c5cb.js.map",revision:"85nz_qufRpLHHj-H4oCY5"},{url:"/_next/static/chunks/418-6cc84eb981a323cb6c06.js",revision:"85nz_qufRpLHHj-H4oCY5"},{url:"/_next/static/chunks/418-6cc84eb981a323cb6c06.js.map",revision:"85nz_qufRpLHHj-H4oCY5"},{url:"/_next/static/chunks/501-2ca3e0e056d2c58ebc0e.js",revision:"85nz_qufRpLHHj-H4oCY5"},{url:"/_next/static/chunks/501-2ca3e0e056d2c58ebc0e.js.map",revision:"85nz_qufRpLHHj-H4oCY5"},{url:"/_next/static/chunks/506-ebd4f195ec3d9ddffd42.js",revision:"85nz_qufRpLHHj-H4oCY5"},{url:"/_next/static/chunks/506-ebd4f195ec3d9ddffd42.js.map",revision:"85nz_qufRpLHHj-H4oCY5"},{url:"/_next/static/chunks/51-7a9ade5b4c990801cc14.js",revision:"85nz_qufRpLHHj-H4oCY5"},{url:"/_next/static/chunks/51-7a9ade5b4c990801cc14.js.map",revision:"85nz_qufRpLHHj-H4oCY5"},{url:"/_next/static/chunks/654-f653a6a06eb1cd76d5db.js",revision:"85nz_qufRpLHHj-H4oCY5"},{url:"/_next/static/chunks/654-f653a6a06eb1cd76d5db.js.map",revision:"85nz_qufRpLHHj-H4oCY5"},{url:"/_next/static/chunks/925-b58e0ca3a44b38a8777c.js",revision:"85nz_qufRpLHHj-H4oCY5"},{url:"/_next/static/chunks/925-b58e0ca3a44b38a8777c.js.map",revision:"85nz_qufRpLHHj-H4oCY5"},{url:"/_next/static/chunks/framework-09a88f8e6a8ced89af74.js",revision:"85nz_qufRpLHHj-H4oCY5"},{url:"/_next/static/chunks/framework-09a88f8e6a8ced89af74.js.map",revision:"85nz_qufRpLHHj-H4oCY5"},{url:"/_next/static/chunks/main-29a64400a3155e7a312c.js",revision:"85nz_qufRpLHHj-H4oCY5"},{url:"/_next/static/chunks/main-29a64400a3155e7a312c.js.map",revision:"85nz_qufRpLHHj-H4oCY5"},{url:"/_next/static/chunks/pages/_app-901ef8cfad559dab4112.js",revision:"85nz_qufRpLHHj-H4oCY5"},{url:"/_next/static/chunks/pages/_app-901ef8cfad559dab4112.js.map",revision:"85nz_qufRpLHHj-H4oCY5"},{url:"/_next/static/chunks/pages/_error-3348a922a0331ed04840.js",revision:"85nz_qufRpLHHj-H4oCY5"},{url:"/_next/static/chunks/pages/_error-3348a922a0331ed04840.js.map",revision:"85nz_qufRpLHHj-H4oCY5"},{url:"/_next/static/chunks/pages/auth/confirm-f4f5aa7cc4c1b6c4cd78.js",revision:"85nz_qufRpLHHj-H4oCY5"},{url:"/_next/static/chunks/pages/auth/confirm-f4f5aa7cc4c1b6c4cd78.js.map",revision:"85nz_qufRpLHHj-H4oCY5"},{url:"/_next/static/chunks/pages/auth/login-d3b5ba38709ccf6ecd7e.js",revision:"85nz_qufRpLHHj-H4oCY5"},{url:"/_next/static/chunks/pages/auth/login-d3b5ba38709ccf6ecd7e.js.map",revision:"85nz_qufRpLHHj-H4oCY5"},{url:"/_next/static/chunks/pages/auth/lost-password-4e059d60aca80bbf161e.js",revision:"85nz_qufRpLHHj-H4oCY5"},{url:"/_next/static/chunks/pages/auth/lost-password-4e059d60aca80bbf161e.js.map",revision:"85nz_qufRpLHHj-H4oCY5"},{url:"/_next/static/chunks/pages/auth/register-809eff91943d824ad339.js",revision:"85nz_qufRpLHHj-H4oCY5"},{url:"/_next/static/chunks/pages/auth/register-809eff91943d824ad339.js.map",revision:"85nz_qufRpLHHj-H4oCY5"},{url:"/_next/static/chunks/pages/auth/reset-90a10a2b4644f9ef15cb.js",revision:"85nz_qufRpLHHj-H4oCY5"},{url:"/_next/static/chunks/pages/auth/reset-90a10a2b4644f9ef15cb.js.map",revision:"85nz_qufRpLHHj-H4oCY5"},{url:"/_next/static/chunks/pages/dashboard-c9947896d75079dcb89a.js",revision:"85nz_qufRpLHHj-H4oCY5"},{url:"/_next/static/chunks/pages/dashboard-c9947896d75079dcb89a.js.map",revision:"85nz_qufRpLHHj-H4oCY5"},{url:"/_next/static/chunks/pages/e/%5Buuid%5D-497857d7ab528f3309ac.js",revision:"85nz_qufRpLHHj-H4oCY5"},{url:"/_next/static/chunks/pages/e/%5Buuid%5D-497857d7ab528f3309ac.js.map",revision:"85nz_qufRpLHHj-H4oCY5"},{url:"/_next/static/chunks/pages/index-2761996c414f5f16e2ba.js",revision:"85nz_qufRpLHHj-H4oCY5"},{url:"/_next/static/chunks/pages/index-2761996c414f5f16e2ba.js.map",revision:"85nz_qufRpLHHj-H4oCY5"},{url:"/_next/static/chunks/pages/profile-e438bcc473d593419ef6.js",revision:"85nz_qufRpLHHj-H4oCY5"},{url:"/_next/static/chunks/pages/profile-e438bcc473d593419ef6.js.map",revision:"85nz_qufRpLHHj-H4oCY5"},{url:"/_next/static/chunks/polyfills-89b2a8f84ce411a0b95b.js",revision:"85nz_qufRpLHHj-H4oCY5"},{url:"/_next/static/chunks/polyfills-89b2a8f84ce411a0b95b.js.map",revision:"85nz_qufRpLHHj-H4oCY5"},{url:"/_next/static/chunks/webpack-1fe9559839a2b80690de.js",revision:"85nz_qufRpLHHj-H4oCY5"},{url:"/_next/static/chunks/webpack-1fe9559839a2b80690de.js.map",revision:"85nz_qufRpLHHj-H4oCY5"},{url:"/assets/Caroster_Octree_Social.jpg",revision:"563fc10a4ec83e735943c5f67d417a6e"},{url:"/assets/android-chrome-192x192.png",revision:"b288769d936ad5f9a87944e027d0096c"},{url:"/assets/android-chrome-512x512.png",revision:"c789c009674fc4a2087a8b71c24a12b7"},{url:"/assets/apple-touch-icon.png",revision:"573a4bc22886d3ef3f6c3aa0eab64d44"},{url:"/assets/favicon-16x16.png",revision:"9f98c22a36ec0001995797d29a7583b1"},{url:"/assets/favicon-32x32.png",revision:"562ff70a6694a29302644d4f85b2e920"},{url:"/assets/favicon.ico",revision:"45004f0a61722a526ca688bddc4955c4"},{url:"/assets/google-icon.svg",revision:"81ad048ed858673aaca6cc2227076b8a"},{url:"/assets/icon.png",revision:"ac122f40fd4c9fd7f1831b0dd406c950"},{url:"/assets/logo.png",revision:"d685d6b49c3aedcf4819d5cbbc873d60"},{url:"/assets/logo.svg",revision:"ac6bdc2dc62feb11a5bc8b0ad3aca84e"},{url:"/assets/site.webmanifest",revision:"053100cb84a50d2ae7f5492f7dd7f25e"},{url:"/favicon.ico",revision:"8eb6dd187ac1c4e26f8df8062bb42e09"},{url:"/manifest.json",revision:"e76480838d8eb8908456941dcb59275e"}],{ignoreURLParametersMatching:[]}),e.cleanupOutdatedCaches(),e.registerRoute("/",new e.NetworkFirst({cacheName:"start-url",plugins:[{cacheWillUpdate:async({request:e,response:s,event:n,state:a})=>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")})); -//# sourceMappingURL=sw.js.map +if(!self.define){const s=s=>{"require"!==s&&(s+=".js");let e=Promise.resolve();return a[s]||(e=new Promise((async e=>{if("document"in self){const a=document.createElement("script");a.src=s,document.head.appendChild(a),a.onload=e}else importScripts(s),e()}))),e.then((()=>{if(!a[s])throw new Error(`Module ${s} didnā€™t register its module`);return a[s]}))},e=(e,a)=>{Promise.all(e.map(s)).then((s=>a(1===s.length?s[0]:s)))},a={require:Promise.resolve(e)};self.define=(e,t,r)=>{a[e]||(a[e]=Promise.resolve().then((()=>{let a={};const i={uri:location.origin+e.slice(1)};return Promise.all(t.map((e=>{switch(e){case"exports":return a;case"module":return i;default:return s(e)}}))).then((s=>{const e=r(...s);return a.default||(a.default=e),a}))})))}}define("./sw.js",["./workbox-ea903bce"],(function(s){"use strict";importScripts(),self.skipWaiting(),s.clientsClaim(),s.precacheAndRoute([{url:"/_next/static/chunks/654-ed986fc33b4f01a80aa9.js",revision:"isNRsH7Sfr7sSpqaevhtN"},{url:"/_next/static/chunks/660-acb7f10a4cc2aa9c433f.js",revision:"isNRsH7Sfr7sSpqaevhtN"},{url:"/_next/static/chunks/681-725739dcf7a1911ad521.js",revision:"isNRsH7Sfr7sSpqaevhtN"},{url:"/_next/static/chunks/890-f720cc774718968f607e.js",revision:"isNRsH7Sfr7sSpqaevhtN"},{url:"/_next/static/chunks/925-26267f659e168d324a87.js",revision:"isNRsH7Sfr7sSpqaevhtN"},{url:"/_next/static/chunks/940-b0d5631a090d1d9f503d.js",revision:"isNRsH7Sfr7sSpqaevhtN"},{url:"/_next/static/chunks/framework-2191d16384373197bc0a.js",revision:"isNRsH7Sfr7sSpqaevhtN"},{url:"/_next/static/chunks/main-707e3475b4679de86540.js",revision:"isNRsH7Sfr7sSpqaevhtN"},{url:"/_next/static/chunks/pages/_app-9efb421cce5a8ea789fe.js",revision:"isNRsH7Sfr7sSpqaevhtN"},{url:"/_next/static/chunks/pages/_error-40228b1888d317150799.js",revision:"isNRsH7Sfr7sSpqaevhtN"},{url:"/_next/static/chunks/pages/auth/confirm-0bc3bb4df1698533c96b.js",revision:"isNRsH7Sfr7sSpqaevhtN"},{url:"/_next/static/chunks/pages/auth/login-4559bc9118016d108ad8.js",revision:"isNRsH7Sfr7sSpqaevhtN"},{url:"/_next/static/chunks/pages/auth/lost-password-c58d81dfdade33cebe6f.js",revision:"isNRsH7Sfr7sSpqaevhtN"},{url:"/_next/static/chunks/pages/auth/register-853981e1d8b93dcfa3a0.js",revision:"isNRsH7Sfr7sSpqaevhtN"},{url:"/_next/static/chunks/pages/auth/reset-8b458359a05293a5021e.js",revision:"isNRsH7Sfr7sSpqaevhtN"},{url:"/_next/static/chunks/pages/dashboard-634beb09778df9d50b4b.js",revision:"isNRsH7Sfr7sSpqaevhtN"},{url:"/_next/static/chunks/pages/e/%5Buuid%5D-76dcbfc36bc76cd6e1d0.js",revision:"isNRsH7Sfr7sSpqaevhtN"},{url:"/_next/static/chunks/pages/index-83388086cb355393557c.js",revision:"isNRsH7Sfr7sSpqaevhtN"},{url:"/_next/static/chunks/pages/profile-743568128a6e49b6997a.js",revision:"isNRsH7Sfr7sSpqaevhtN"},{url:"/_next/static/chunks/polyfills-a54b4f32bdc1ef890ddd.js",revision:"isNRsH7Sfr7sSpqaevhtN"},{url:"/_next/static/chunks/webpack-6d72c6ed51d58793f029.js",revision:"isNRsH7Sfr7sSpqaevhtN"},{url:"/_next/static/isNRsH7Sfr7sSpqaevhtN/_buildManifest.js",revision:"isNRsH7Sfr7sSpqaevhtN"},{url:"/_next/static/isNRsH7Sfr7sSpqaevhtN/_ssgManifest.js",revision:"isNRsH7Sfr7sSpqaevhtN"},{url:"/assets/Caroster_Octree_Social.jpg",revision:"563fc10a4ec83e735943c5f67d417a6e"},{url:"/assets/android-chrome-192x192.png",revision:"b288769d936ad5f9a87944e027d0096c"},{url:"/assets/android-chrome-512x512.png",revision:"c789c009674fc4a2087a8b71c24a12b7"},{url:"/assets/apple-touch-icon.png",revision:"573a4bc22886d3ef3f6c3aa0eab64d44"},{url:"/assets/favicon-16x16.png",revision:"9f98c22a36ec0001995797d29a7583b1"},{url:"/assets/favicon-32x32.png",revision:"562ff70a6694a29302644d4f85b2e920"},{url:"/assets/favicon.ico",revision:"45004f0a61722a526ca688bddc4955c4"},{url:"/assets/google-icon.svg",revision:"81ad048ed858673aaca6cc2227076b8a"},{url:"/assets/icon.png",revision:"ac122f40fd4c9fd7f1831b0dd406c950"},{url:"/assets/logo.png",revision:"d685d6b49c3aedcf4819d5cbbc873d60"},{url:"/assets/logo.svg",revision:"ac6bdc2dc62feb11a5bc8b0ad3aca84e"},{url:"/assets/site.webmanifest",revision:"053100cb84a50d2ae7f5492f7dd7f25e"},{url:"/favicon.ico",revision:"8eb6dd187ac1c4e26f8df8062bb42e09"},{url:"/manifest.json",revision:"e76480838d8eb8908456941dcb59275e"}],{ignoreURLParametersMatching:[]}),s.cleanupOutdatedCaches(),s.registerRoute("/",new s.NetworkFirst({cacheName:"start-url",plugins:[{cacheWillUpdate:async({request:s,response:e,event:a,state:t})=>e&&"opaqueredirect"===e.type?new Response(e.body,{status:200,statusText:"OK",headers:e.headers}):e}]}),"GET"),s.registerRoute(/^https:\/\/fonts\.(?:googleapis|gstatic)\.com\/.*/i,new s.CacheFirst({cacheName:"google-fonts",plugins:[new s.ExpirationPlugin({maxEntries:4,maxAgeSeconds:31536e3,purgeOnQuotaError:!0})]}),"GET"),s.registerRoute(/\.(?:eot|otf|ttc|ttf|woff|woff2|font.css)$/i,new s.StaleWhileRevalidate({cacheName:"static-font-assets",plugins:[new s.ExpirationPlugin({maxEntries:4,maxAgeSeconds:604800,purgeOnQuotaError:!0})]}),"GET"),s.registerRoute(/\.(?:jpg|jpeg|gif|png|svg|ico|webp)$/i,new s.StaleWhileRevalidate({cacheName:"static-image-assets",plugins:[new s.ExpirationPlugin({maxEntries:64,maxAgeSeconds:86400,purgeOnQuotaError:!0})]}),"GET"),s.registerRoute(/\/_next\/image\?url=.+$/i,new s.StaleWhileRevalidate({cacheName:"next-image",plugins:[new s.ExpirationPlugin({maxEntries:64,maxAgeSeconds:86400,purgeOnQuotaError:!0})]}),"GET"),s.registerRoute(/\.(?:mp3|mp4)$/i,new s.StaleWhileRevalidate({cacheName:"static-media-assets",plugins:[new s.ExpirationPlugin({maxEntries:32,maxAgeSeconds:86400,purgeOnQuotaError:!0})]}),"GET"),s.registerRoute(/\.(?:js)$/i,new s.StaleWhileRevalidate({cacheName:"static-js-assets",plugins:[new s.ExpirationPlugin({maxEntries:32,maxAgeSeconds:86400,purgeOnQuotaError:!0})]}),"GET"),s.registerRoute(/\.(?:css|less)$/i,new s.StaleWhileRevalidate({cacheName:"static-style-assets",plugins:[new s.ExpirationPlugin({maxEntries:32,maxAgeSeconds:86400,purgeOnQuotaError:!0})]}),"GET"),s.registerRoute(/\/_next\/data\/.+\/.+\.json$/i,new s.StaleWhileRevalidate({cacheName:"next-data",plugins:[new s.ExpirationPlugin({maxEntries:32,maxAgeSeconds:86400,purgeOnQuotaError:!0})]}),"GET"),s.registerRoute(/\.(?:json|xml|csv)$/i,new s.NetworkFirst({cacheName:"static-data-assets",plugins:[new s.ExpirationPlugin({maxEntries:32,maxAgeSeconds:86400,purgeOnQuotaError:!0})]}),"GET"),s.registerRoute((({url:s})=>{if(!(self.origin===s.origin))return!1;const e=s.pathname;return!e.startsWith("/api/auth/")&&!!e.startsWith("/api/")}),new s.NetworkFirst({cacheName:"apis",networkTimeoutSeconds:10,plugins:[new s.ExpirationPlugin({maxEntries:16,maxAgeSeconds:86400,purgeOnQuotaError:!0})]}),"GET"),s.registerRoute((({url:s})=>{if(!(self.origin===s.origin))return!1;return!s.pathname.startsWith("/api/")}),new s.NetworkFirst({cacheName:"others",networkTimeoutSeconds:10,plugins:[new s.ExpirationPlugin({maxEntries:32,maxAgeSeconds:86400,purgeOnQuotaError:!0})]}),"GET")}));
D frontend/public/sw.js.map

@@ -1,1 +0,0 @@

-{"version":3,"file":"sw.js","sources":["../../../../../../../private/var/folders/dz/3fr83j3509zgmfj9jhpky8vw0000gn/T/5d71ee2ee85007a408e7c0d74f7611a7/sw.js"],"sourcesContent":["import {registerRoute as workbox_routing_registerRoute} from '/Users/karian/55K/Sites/caroster/caroster/frontend/node_modules/workbox-routing/registerRoute.mjs';\nimport {NetworkFirst as workbox_strategies_NetworkFirst} from '/Users/karian/55K/Sites/caroster/caroster/frontend/node_modules/workbox-strategies/NetworkFirst.mjs';\nimport {ExpirationPlugin as workbox_expiration_ExpirationPlugin} from '/Users/karian/55K/Sites/caroster/caroster/frontend/node_modules/workbox-expiration/ExpirationPlugin.mjs';\nimport {CacheFirst as workbox_strategies_CacheFirst} from '/Users/karian/55K/Sites/caroster/caroster/frontend/node_modules/workbox-strategies/CacheFirst.mjs';\nimport {StaleWhileRevalidate as workbox_strategies_StaleWhileRevalidate} from '/Users/karian/55K/Sites/caroster/caroster/frontend/node_modules/workbox-strategies/StaleWhileRevalidate.mjs';\nimport {clientsClaim as workbox_core_clientsClaim} from '/Users/karian/55K/Sites/caroster/caroster/frontend/node_modules/workbox-core/clientsClaim.mjs';\nimport {precacheAndRoute as workbox_precaching_precacheAndRoute} from '/Users/karian/55K/Sites/caroster/caroster/frontend/node_modules/workbox-precaching/precacheAndRoute.mjs';\nimport {cleanupOutdatedCaches as workbox_precaching_cleanupOutdatedCaches} from '/Users/karian/55K/Sites/caroster/caroster/frontend/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 \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\": \"/_next/static/85nz_qufRpLHHj-H4oCY5/_buildManifest.js\",\n \"revision\": \"85nz_qufRpLHHj-H4oCY5\"\n },\n {\n \"url\": \"/_next/static/85nz_qufRpLHHj-H4oCY5/_ssgManifest.js\",\n \"revision\": \"85nz_qufRpLHHj-H4oCY5\"\n },\n {\n \"url\": \"/_next/static/chunks/413-9fc97176575377d8c5cb.js\",\n \"revision\": \"85nz_qufRpLHHj-H4oCY5\"\n },\n {\n \"url\": \"/_next/static/chunks/413-9fc97176575377d8c5cb.js.map\",\n \"revision\": \"85nz_qufRpLHHj-H4oCY5\"\n },\n {\n \"url\": \"/_next/static/chunks/418-6cc84eb981a323cb6c06.js\",\n \"revision\": \"85nz_qufRpLHHj-H4oCY5\"\n },\n {\n \"url\": \"/_next/static/chunks/418-6cc84eb981a323cb6c06.js.map\",\n \"revision\": \"85nz_qufRpLHHj-H4oCY5\"\n },\n {\n \"url\": \"/_next/static/chunks/501-2ca3e0e056d2c58ebc0e.js\",\n \"revision\": \"85nz_qufRpLHHj-H4oCY5\"\n },\n {\n \"url\": \"/_next/static/chunks/501-2ca3e0e056d2c58ebc0e.js.map\",\n \"revision\": \"85nz_qufRpLHHj-H4oCY5\"\n },\n {\n \"url\": \"/_next/static/chunks/506-ebd4f195ec3d9ddffd42.js\",\n \"revision\": \"85nz_qufRpLHHj-H4oCY5\"\n },\n {\n \"url\": \"/_next/static/chunks/506-ebd4f195ec3d9ddffd42.js.map\",\n \"revision\": \"85nz_qufRpLHHj-H4oCY5\"\n },\n {\n \"url\": \"/_next/static/chunks/51-7a9ade5b4c990801cc14.js\",\n \"revision\": \"85nz_qufRpLHHj-H4oCY5\"\n },\n {\n \"url\": \"/_next/static/chunks/51-7a9ade5b4c990801cc14.js.map\",\n \"revision\": \"85nz_qufRpLHHj-H4oCY5\"\n },\n {\n \"url\": \"/_next/static/chunks/654-f653a6a06eb1cd76d5db.js\",\n \"revision\": \"85nz_qufRpLHHj-H4oCY5\"\n },\n {\n \"url\": \"/_next/static/chunks/654-f653a6a06eb1cd76d5db.js.map\",\n \"revision\": \"85nz_qufRpLHHj-H4oCY5\"\n },\n {\n \"url\": \"/_next/static/chunks/925-b58e0ca3a44b38a8777c.js\",\n \"revision\": \"85nz_qufRpLHHj-H4oCY5\"\n },\n {\n \"url\": \"/_next/static/chunks/925-b58e0ca3a44b38a8777c.js.map\",\n \"revision\": \"85nz_qufRpLHHj-H4oCY5\"\n },\n {\n \"url\": \"/_next/static/chunks/framework-09a88f8e6a8ced89af74.js\",\n \"revision\": \"85nz_qufRpLHHj-H4oCY5\"\n },\n {\n \"url\": \"/_next/static/chunks/framework-09a88f8e6a8ced89af74.js.map\",\n \"revision\": \"85nz_qufRpLHHj-H4oCY5\"\n },\n {\n \"url\": \"/_next/static/chunks/main-29a64400a3155e7a312c.js\",\n \"revision\": \"85nz_qufRpLHHj-H4oCY5\"\n },\n {\n \"url\": \"/_next/static/chunks/main-29a64400a3155e7a312c.js.map\",\n \"revision\": \"85nz_qufRpLHHj-H4oCY5\"\n },\n {\n \"url\": \"/_next/static/chunks/pages/_app-901ef8cfad559dab4112.js\",\n \"revision\": \"85nz_qufRpLHHj-H4oCY5\"\n },\n {\n \"url\": \"/_next/static/chunks/pages/_app-901ef8cfad559dab4112.js.map\",\n \"revision\": \"85nz_qufRpLHHj-H4oCY5\"\n },\n {\n \"url\": \"/_next/static/chunks/pages/_error-3348a922a0331ed04840.js\",\n \"revision\": \"85nz_qufRpLHHj-H4oCY5\"\n },\n {\n \"url\": \"/_next/static/chunks/pages/_error-3348a922a0331ed04840.js.map\",\n \"revision\": \"85nz_qufRpLHHj-H4oCY5\"\n },\n {\n \"url\": \"/_next/static/chunks/pages/auth/confirm-f4f5aa7cc4c1b6c4cd78.js\",\n \"revision\": \"85nz_qufRpLHHj-H4oCY5\"\n },\n {\n \"url\": \"/_next/static/chunks/pages/auth/confirm-f4f5aa7cc4c1b6c4cd78.js.map\",\n \"revision\": \"85nz_qufRpLHHj-H4oCY5\"\n },\n {\n \"url\": \"/_next/static/chunks/pages/auth/login-d3b5ba38709ccf6ecd7e.js\",\n \"revision\": \"85nz_qufRpLHHj-H4oCY5\"\n },\n {\n \"url\": \"/_next/static/chunks/pages/auth/login-d3b5ba38709ccf6ecd7e.js.map\",\n \"revision\": \"85nz_qufRpLHHj-H4oCY5\"\n },\n {\n \"url\": \"/_next/static/chunks/pages/auth/lost-password-4e059d60aca80bbf161e.js\",\n \"revision\": \"85nz_qufRpLHHj-H4oCY5\"\n },\n {\n \"url\": \"/_next/static/chunks/pages/auth/lost-password-4e059d60aca80bbf161e.js.map\",\n \"revision\": \"85nz_qufRpLHHj-H4oCY5\"\n },\n {\n \"url\": \"/_next/static/chunks/pages/auth/register-809eff91943d824ad339.js\",\n \"revision\": \"85nz_qufRpLHHj-H4oCY5\"\n },\n {\n \"url\": \"/_next/static/chunks/pages/auth/register-809eff91943d824ad339.js.map\",\n \"revision\": \"85nz_qufRpLHHj-H4oCY5\"\n },\n {\n \"url\": \"/_next/static/chunks/pages/auth/reset-90a10a2b4644f9ef15cb.js\",\n \"revision\": \"85nz_qufRpLHHj-H4oCY5\"\n },\n {\n \"url\": \"/_next/static/chunks/pages/auth/reset-90a10a2b4644f9ef15cb.js.map\",\n \"revision\": \"85nz_qufRpLHHj-H4oCY5\"\n },\n {\n \"url\": \"/_next/static/chunks/pages/dashboard-c9947896d75079dcb89a.js\",\n \"revision\": \"85nz_qufRpLHHj-H4oCY5\"\n },\n {\n \"url\": \"/_next/static/chunks/pages/dashboard-c9947896d75079dcb89a.js.map\",\n \"revision\": \"85nz_qufRpLHHj-H4oCY5\"\n },\n {\n \"url\": \"/_next/static/chunks/pages/e/%5Buuid%5D-497857d7ab528f3309ac.js\",\n \"revision\": \"85nz_qufRpLHHj-H4oCY5\"\n },\n {\n \"url\": \"/_next/static/chunks/pages/e/%5Buuid%5D-497857d7ab528f3309ac.js.map\",\n \"revision\": \"85nz_qufRpLHHj-H4oCY5\"\n },\n {\n \"url\": \"/_next/static/chunks/pages/index-2761996c414f5f16e2ba.js\",\n \"revision\": \"85nz_qufRpLHHj-H4oCY5\"\n },\n {\n \"url\": \"/_next/static/chunks/pages/index-2761996c414f5f16e2ba.js.map\",\n \"revision\": \"85nz_qufRpLHHj-H4oCY5\"\n },\n {\n \"url\": \"/_next/static/chunks/pages/profile-e438bcc473d593419ef6.js\",\n \"revision\": \"85nz_qufRpLHHj-H4oCY5\"\n },\n {\n \"url\": \"/_next/static/chunks/pages/profile-e438bcc473d593419ef6.js.map\",\n \"revision\": \"85nz_qufRpLHHj-H4oCY5\"\n },\n {\n \"url\": \"/_next/static/chunks/polyfills-89b2a8f84ce411a0b95b.js\",\n \"revision\": \"85nz_qufRpLHHj-H4oCY5\"\n },\n {\n \"url\": \"/_next/static/chunks/polyfills-89b2a8f84ce411a0b95b.js.map\",\n \"revision\": \"85nz_qufRpLHHj-H4oCY5\"\n },\n {\n \"url\": \"/_next/static/chunks/webpack-1fe9559839a2b80690de.js\",\n \"revision\": \"85nz_qufRpLHHj-H4oCY5\"\n },\n {\n \"url\": \"/_next/static/chunks/webpack-1fe9559839a2b80690de.js.map\",\n \"revision\": \"85nz_qufRpLHHj-H4oCY5\"\n },\n {\n \"url\": \"/assets/Caroster_Octree_Social.jpg\",\n \"revision\": \"563fc10a4ec83e735943c5f67d417a6e\"\n },\n {\n \"url\": \"/assets/android-chrome-192x192.png\",\n \"revision\": \"b288769d936ad5f9a87944e027d0096c\"\n },\n {\n \"url\": \"/assets/android-chrome-512x512.png\",\n \"revision\": \"c789c009674fc4a2087a8b71c24a12b7\"\n },\n {\n \"url\": \"/assets/apple-touch-icon.png\",\n \"revision\": \"573a4bc22886d3ef3f6c3aa0eab64d44\"\n },\n {\n \"url\": \"/assets/favicon-16x16.png\",\n \"revision\": \"9f98c22a36ec0001995797d29a7583b1\"\n },\n {\n \"url\": \"/assets/favicon-32x32.png\",\n \"revision\": \"562ff70a6694a29302644d4f85b2e920\"\n },\n {\n \"url\": \"/assets/favicon.ico\",\n \"revision\": \"45004f0a61722a526ca688bddc4955c4\"\n },\n {\n \"url\": \"/assets/google-icon.svg\",\n \"revision\": \"81ad048ed858673aaca6cc2227076b8a\"\n },\n {\n \"url\": \"/assets/icon.png\",\n \"revision\": \"ac122f40fd4c9fd7f1831b0dd406c950\"\n },\n {\n \"url\": \"/assets/logo.png\",\n \"revision\": \"d685d6b49c3aedcf4819d5cbbc873d60\"\n },\n {\n \"url\": \"/assets/logo.svg\",\n \"revision\": \"ac6bdc2dc62feb11a5bc8b0ad3aca84e\"\n },\n {\n \"url\": \"/assets/site.webmanifest\",\n \"revision\": \"053100cb84a50d2ae7f5492f7dd7f25e\"\n },\n {\n \"url\": \"/favicon.ico\",\n \"revision\": \"8eb6dd187ac1c4e26f8df8062bb42e09\"\n },\n {\n \"url\": \"/manifest.json\",\n \"revision\": \"e76480838d8eb8908456941dcb59275e\"\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,gBAUAC,KAAKC,kDAU+B,CAClC,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,2DACK,yBAEd,KACS,+DACK,yBAEd,KACS,4DACK,yBAEd,KACS,gEACK,yBAEd,KACS,4DACK,yBAEd,KACS,gEACK,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,yEACK,yBAEd,KACS,6EACK,yBAEd,KACS,iFACK,yBAEd,KACS,qFACK,yBAEd,KACS,4EACK,yBAEd,KACS,gFACK,yBAEd,KACS,yEACK,yBAEd,KACS,6EACK,yBAEd,KACS,wEACK,yBAEd,KACS,4EACK,yBAEd,KACS,2EACK,yBAEd,KACS,+EACK,yBAEd,KACS,oEACK,yBAEd,KACS,wEACK,yBAEd,KACS,sEACK,yBAEd,KACS,0EACK,yBAEd,KACS,kEACK,yBAEd,KACS,sEACK,yBAEd,KACS,gEACK,yBAEd,KACS,oEACK,yBAEd,KACS,8CACK,oCAEd,KACS,8CACK,oCAEd,KACS,8CACK,oCAEd,KACS,wCACK,oCAEd,KACS,qCACK,oCAEd,KACS,qCACK,oCAEd,KACS,+BACK,oCAEd,KACS,mCACK,oCAEd,KACS,4BACK,oCAEd,KACS,4BACK,oCAEd,KACS,4BACK,oCAEd,KACS,oCACK,oCAEd,KACS,wBACK,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"}
M frontend/public/workbox-ea903bce.jsfrontend/public/workbox-ea903bce.js

@@ -1,2 +1,1 @@

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
D frontend/public/workbox-ea903bce.js.map

@@ -1,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<string>}\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<string, Array<module:workbox-routing.Route>>} 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<Promise<Response> | 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<Response>|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<string>} ignoreParams\n * @return {Promise<Response|undefined>}\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<Response>}\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<Response>}\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<Response|undefined>} 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<boolean>} `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<Request>}\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<Function>}\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<Response|undefined>}\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<Object>} [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<Object>}\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<Promise>} 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<Response>}\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<string>} 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<string>}\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<Object>} [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<Response>}\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<Object|string>} [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<module:workbox-precaching.PrecacheController.PrecacheEntry|string>} 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<module:workbox-precaching.InstallResult>}\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<module:workbox-precaching.CleanupResult>}\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<string, string>} 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<string>} 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<Response|undefined>}\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<RegExp>} [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<RegExp>} 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<Response>}\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<Object>} [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<Response>}\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<Response>}\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<Response>}\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<Object>} [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<Response>}\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<string>} 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<Object|string>} 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<Object|string>} [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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"}
D frontend/sentry.client.config.js

@@ -1,16 +0,0 @@

-// This file configures the initialization of Sentry on the browser. -// The config you add here will be used whenever a page is visited. -// https://docs.sentry.io/platforms/javascript/guides/nextjs/ - -import * as Sentry from '@sentry/nextjs'; - -const SENTRY_DSN = process.env.SENTRY_DSN || process.env.NEXT_PUBLIC_SENTRY_DSN; - -Sentry.init({ - dsn: - SENTRY_DSN || - 'https://glet_e9aeb5775266f7ed1b1d16ebb550e016@git.octree.ch/api/v4/error_tracking/collector/299', - // Note: if you want to override the automatic release value, do not set a - // `release` value here - use the environment variable `SENTRY_RELEASE`, so - // that it will also get attached to your source maps -});
D frontend/sentry.properties

@@ -1,5 +0,0 @@

-defaults.url=git.octree.ch/api/v4/error_tracking/collector/299 -defaults.org=octree-sarl -defaults.project=caroster -auth.token=glet_e9aeb5775266f7ed1b1d16ebb550e016 -cli.executable=../../../.npm/_npx/275038/lib/node_modules/@sentry/wizard/node_modules/@sentry/cli/bin/sentry-cli
D frontend/sentry.server.config.js

@@ -1,16 +0,0 @@

-// This file configures the initialization of Sentry on the server. -// The config you add here will be used whenever the server handles a request. -// https://docs.sentry.io/platforms/javascript/guides/nextjs/ - -import * as Sentry from '@sentry/nextjs'; - -const SENTRY_DSN = process.env.SENTRY_DSN || process.env.NEXT_PUBLIC_SENTRY_DSN; - -Sentry.init({ - dsn: - SENTRY_DSN || - 'https://glet_e9aeb5775266f7ed1b1d16ebb550e016@git.octree.ch/api/v4/error_tracking/collector/299', - // Note: if you want to override the automatic release value, do not set a - // `release` value here - use the environment variable `SENTRY_RELEASE`, so - // that it will also get attached to your source maps -});
M frontend/yarn.lockfrontend/yarn.lock

@@ -1647,139 +1647,6 @@ integrity sha512-c/qwwcHyafOQuVQJj0IlBjf5yYgBI7YPJ77k4fOJYesb41jio65eaJODRUmfYKhTOFBrIZ66kgvGPlNbjuoRdQ==

dependencies: any-observable "^0.3.0" -"@sentry/browser@6.7.2": - version "6.7.2" - resolved "https://npm-8ee.hidora.com/@sentry%2fbrowser/-/browser-6.7.2.tgz#cfbe060de5a9694617f175a6bde469e5e266792e" - integrity sha512-Lv0Ne1QcesyGAhVcQDfQa3hDPR/MhPSDTMg3xFi+LxqztchVc4w/ynzR0wCZFb8KIHpTj5SpJHfxpDhXYMtS9g== - dependencies: - "@sentry/core" "6.7.2" - "@sentry/types" "6.7.2" - "@sentry/utils" "6.7.2" - tslib "^1.9.3" - -"@sentry/cli@^1.64.1": - version "1.66.0" - resolved "https://npm-8ee.hidora.com/@sentry%2fcli/-/cli-1.66.0.tgz#0526f1bc1c0570ce72ed817190af92f3b63a2e9a" - integrity sha512-2pZ+JHnvKqwyJWcGkKg/gCM/zURYronAnruBNllI+rH2g5IL0N90deMmjB1xcqXS66J222+MPTtWrGEK1Vl0/w== - dependencies: - https-proxy-agent "^5.0.0" - mkdirp "^0.5.5" - node-fetch "^2.6.0" - npmlog "^4.1.2" - progress "^2.0.3" - proxy-from-env "^1.1.0" - -"@sentry/core@6.7.2": - version "6.7.2" - resolved "https://npm-8ee.hidora.com/@sentry%2fcore/-/core-6.7.2.tgz#1d294fac6e62744bce3b9dfbcd90b14e93620480" - integrity sha512-NTZqwN5nR94yrXmSfekoPs1mIFuKvf8esdIW/DadwSKWAdLJwQTJY9xK/8PQv+SEzd7wiitPAx+mCw2By1xiNQ== - dependencies: - "@sentry/hub" "6.7.2" - "@sentry/minimal" "6.7.2" - "@sentry/types" "6.7.2" - "@sentry/utils" "6.7.2" - tslib "^1.9.3" - -"@sentry/hub@6.7.2": - version "6.7.2" - resolved "https://npm-8ee.hidora.com/@sentry%2fhub/-/hub-6.7.2.tgz#31b250e74aa303877620dfa500aa89e4411e2dec" - integrity sha512-05qVW6ymChJsXag4+fYCQokW3AcABIgcqrVYZUBf6GMU/Gbz5SJqpV7y1+njwWvnPZydMncP9LaDVpMKbE7UYQ== - dependencies: - "@sentry/types" "6.7.2" - "@sentry/utils" "6.7.2" - tslib "^1.9.3" - -"@sentry/integrations@6.7.2": - version "6.7.2" - resolved "https://npm-8ee.hidora.com/@sentry%2fintegrations/-/integrations-6.7.2.tgz#1ddfb165b4aee42d0e9d9ef531c5ded8a73cbd61" - integrity sha512-IvOLqKVTxPxSJLbKVEe15BjvotnWBs86h5MJx3DLA/1HLP4xtUOvFsdmuMLJij5PtFG10HuUpRn8acEh5h9PTw== - dependencies: - "@sentry/types" "6.7.2" - "@sentry/utils" "6.7.2" - localforage "^1.8.1" - tslib "^1.9.3" - -"@sentry/minimal@6.7.2": - version "6.7.2" - resolved "https://npm-8ee.hidora.com/@sentry%2fminimal/-/minimal-6.7.2.tgz#9e6c0c587daea64a9042041694a4ad5d559d16cd" - integrity sha512-jkpwFv2GFHoVl5vnK+9/Q+Ea8eVdbJ3hn3/Dqq9MOLFnVK7ED6MhdHKLT79puGSFj+85OuhM5m2Q44mIhyS5mw== - dependencies: - "@sentry/hub" "6.7.2" - "@sentry/types" "6.7.2" - tslib "^1.9.3" - -"@sentry/nextjs@^6.7.2": - version "6.7.2" - resolved "https://npm-8ee.hidora.com/@sentry%2fnextjs/-/nextjs-6.7.2.tgz#bb689aa75222ae899abbc2307cd6e676ca61946c" - integrity sha512-O891EUf9wTSDU+n1GH/ibPblOZVbWfWe8HTnH/BvsPjLjzumJ1IFSpQhQtyiYpmewbEDuR1F2hmqD+CoiTAtTg== - dependencies: - "@sentry/core" "6.7.2" - "@sentry/integrations" "6.7.2" - "@sentry/node" "6.7.2" - "@sentry/react" "6.7.2" - "@sentry/tracing" "6.7.2" - "@sentry/utils" "6.7.2" - "@sentry/webpack-plugin" "1.15.1" - tslib "^1.9.3" - -"@sentry/node@6.7.2": - version "6.7.2" - resolved "https://npm-8ee.hidora.com/@sentry%2fnode/-/node-6.7.2.tgz#ef2b865af2c37d83966db7fbd031179aa8c82cc0" - integrity sha512-vfNTmxBbHthAKPDBo0gVk/aNHdgUfXLzmaK7FgWO7cISiI2soCfvKEIP61XqIFZru06teqcRuDsYlR4wSeyWpg== - dependencies: - "@sentry/core" "6.7.2" - "@sentry/hub" "6.7.2" - "@sentry/tracing" "6.7.2" - "@sentry/types" "6.7.2" - "@sentry/utils" "6.7.2" - cookie "^0.4.1" - https-proxy-agent "^5.0.0" - lru_map "^0.3.3" - tslib "^1.9.3" - -"@sentry/react@6.7.2": - version "6.7.2" - resolved "https://npm-8ee.hidora.com/@sentry%2freact/-/react-6.7.2.tgz#68edb082ea42cabcf86939f254457436b82b4a0a" - integrity sha512-gjXRuhgd3l2s18Y4dw9ZMWCiFKyeAU79fBiYdv8lqu9EFPFquU0qkZbgep8D37Xq2GWjQM0qEBmD758L6bUwvQ== - dependencies: - "@sentry/browser" "6.7.2" - "@sentry/minimal" "6.7.2" - "@sentry/types" "6.7.2" - "@sentry/utils" "6.7.2" - hoist-non-react-statics "^3.3.2" - tslib "^1.9.3" - -"@sentry/tracing@6.7.2": - version "6.7.2" - resolved "https://npm-8ee.hidora.com/@sentry%2ftracing/-/tracing-6.7.2.tgz#78a6934837143ae5e200b49bd256bc8a917477bc" - integrity sha512-juKlI7FICKONWJFJxDxerj0A+8mNRhmtrdR+OXFqOkqSAy/QXlSFZcA/j//O19k2CfwK1BrvoMcQ/4gnffUOVg== - dependencies: - "@sentry/hub" "6.7.2" - "@sentry/minimal" "6.7.2" - "@sentry/types" "6.7.2" - "@sentry/utils" "6.7.2" - tslib "^1.9.3" - -"@sentry/types@6.7.2": - version "6.7.2" - resolved "https://npm-8ee.hidora.com/@sentry%2ftypes/-/types-6.7.2.tgz#8108272c98ad7784ddf9ddda0b7bdc6880ed6e50" - integrity sha512-h21Go/PfstUN+ZV6SbwRSZVg9GXRJWdLfHoO5PSVb3TVEMckuxk8tAE57/u+UZDwX8wu+Xyon2TgsKpiWKxqUg== - -"@sentry/utils@6.7.2": - version "6.7.2" - resolved "https://npm-8ee.hidora.com/@sentry%2futils/-/utils-6.7.2.tgz#c7f957ebe16de3e701a0c5477ac2dba04e7b4b68" - integrity sha512-9COL7aaBbe61Hp5BlArtXZ1o/cxli1NGONLPrVT4fMyeQFmLonhUiy77NdsW19XnvhvaA+2IoV5dg3dnFiF/og== - dependencies: - "@sentry/types" "6.7.2" - tslib "^1.9.3" - -"@sentry/webpack-plugin@1.15.1": - version "1.15.1" - resolved "https://npm-8ee.hidora.com/@sentry%2fwebpack-plugin/-/webpack-plugin-1.15.1.tgz#deb014fce8c1b51811100f25ec9050dd03addd9b" - integrity sha512-/Z06MJDXyWcN2+CbeDTMDwVzySjgZWQajOke773TvpkgqdtkeT1eYBsA+pfsje+ZE1prEgrZdlH/L9HdM1odnQ== - dependencies: - "@sentry/cli" "^1.64.1" - "@sindresorhus/is@^0.14.0": version "0.14.0" resolved "https://npm-8ee.hidora.com/@sindresorhus%2fis/-/is-0.14.0.tgz#9fb3a3cf3132328151f353de4632e01e52102bea"

@@ -2142,19 +2009,6 @@ integrity sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==

dependencies: normalize-path "^3.0.0" picomatch "^2.0.4" - -aproba@^1.0.3: - version "1.2.0" - resolved "https://npm-8ee.hidora.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" - integrity sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw== - -are-we-there-yet@~1.1.2: - version "1.1.5" - resolved "https://npm-8ee.hidora.com/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz#4b35c2944f062a8bfcda66410760350fe9ddfc21" - integrity sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w== - dependencies: - delegates "^1.0.0" - readable-stream "^2.0.6" arg@^4.1.0: version "4.1.3"

@@ -2899,11 +2753,6 @@ version "1.2.0"

resolved "https://npm-8ee.hidora.com/console-browserify/-/console-browserify-1.2.0.tgz#67063cef57ceb6cf4993a2ab3a55840ae8c49336" integrity sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA== -console-control-strings@^1.0.0, console-control-strings@~1.1.0: - version "1.1.0" - resolved "https://npm-8ee.hidora.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" - integrity sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4= - constant-case@^3.0.3, constant-case@^3.0.4: version "3.0.4" resolved "https://npm-8ee.hidora.com/constant-case/-/constant-case-3.0.4.tgz#3b84a9aeaf4cf31ec45e6bf5de91bdfb0589faf1"

@@ -2925,11 +2774,6 @@ integrity sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==

dependencies: safe-buffer "~5.1.1" -cookie@^0.4.1: - version "0.4.1" - resolved "https://npm-8ee.hidora.com/cookie/-/cookie-0.4.1.tgz#afd713fe26ebd21ba95ceb61f9a8116e50a537d1" - integrity sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA== - core-js-compat@^3.14.0: version "3.15.0" resolved "https://npm-8ee.hidora.com/core-js-compat/-/core-js-compat-3.15.0.tgz#e14a371123db9d1c5b41206d3f420643d238b8fa"

@@ -3193,11 +3037,6 @@ delayed-stream@~1.0.0:

version "1.0.0" resolved "https://npm-8ee.hidora.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk= - -delegates@^1.0.0: - version "1.0.0" - resolved "https://npm-8ee.hidora.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" - integrity sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o= depd@~1.1.2: version "1.1.2"

@@ -3918,20 +3757,6 @@ version "1.0.1"

resolved "https://npm-8ee.hidora.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc= -gauge@~2.7.3: - version "2.7.4" - resolved "https://npm-8ee.hidora.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" - integrity sha1-LANAXHU4w51+s3sxcCLjJfsBi/c= - dependencies: - aproba "^1.0.3" - console-control-strings "^1.0.0" - has-unicode "^2.0.0" - object-assign "^4.1.0" - signal-exit "^3.0.0" - string-width "^1.0.1" - strip-ansi "^3.0.1" - wide-align "^1.1.0" - gensync@^1.0.0-beta.2: version "1.0.0-beta.2" resolved "https://npm-8ee.hidora.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0"

@@ -4167,11 +3992,6 @@ integrity sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==

dependencies: has-symbols "^1.0.2" -has-unicode@^2.0.0: - version "2.0.1" - resolved "https://npm-8ee.hidora.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" - integrity sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk= - has@^1.0.3: version "1.0.3" resolved "https://npm-8ee.hidora.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796"

@@ -4317,11 +4137,6 @@ resolved "https://npm-8ee.hidora.com/image-size/-/image-size-1.0.0.tgz#58b31fe4743b1cec0a0ac26f5c914d3c5b2f0750"

integrity sha512-JLJ6OwBfO1KcA+TvJT+v8gbE6iWbj24LyDNFgFEN0lzegn6cC6a/p3NIDaepMsJjQjlUWqIC7wJv8lBFxPNjcw== dependencies: queue "6.0.2" - -immediate@~3.0.5: - version "3.0.6" - resolved "https://npm-8ee.hidora.com/immediate/-/immediate-3.0.6.tgz#9db1dbd0faf8de6fbe0f5dd5e56bb606280de69b" - integrity sha1-nbHb0Pr43m++D13V5Wu2BigN5ps= immutable@~3.7.6: version "3.7.6"

@@ -5021,13 +4836,6 @@ dependencies:

prelude-ls "^1.2.1" type-check "~0.4.0" -lie@3.1.1: - version "3.1.1" - resolved "https://npm-8ee.hidora.com/lie/-/lie-3.1.1.tgz#9a436b2cc7746ca59de7a41fa469b3efb76bd87e" - integrity sha1-mkNrLMd0bKWd56QfpGmz77dr2H4= - dependencies: - immediate "~3.0.5" - lines-and-columns@^1.1.6: version "1.1.6" resolved "https://npm-8ee.hidora.com/lines-and-columns/-/lines-and-columns-1.1.6.tgz#1c00c743b433cd0a4e80758f7b64a57440d9ff00"

@@ -5094,13 +4902,6 @@ dependencies:

big.js "^5.2.2" emojis-list "^3.0.0" json5 "^1.0.1" - -localforage@^1.8.1: - version "1.9.0" - resolved "https://npm-8ee.hidora.com/localforage/-/localforage-1.9.0.tgz#f3e4d32a8300b362b4634cc4e066d9d00d2f09d1" - integrity sha512-rR1oyNrKulpe+VM9cYmcFn6tsHuokyVHFaCM3+osEmxaHTbEk8oQu6eGDfS6DQLWi/N67XRmB8ECG37OES368g== - dependencies: - lie "3.1.1" locate-path@^2.0.0: version "2.0.0"

@@ -5249,11 +5050,6 @@ integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==

dependencies: yallist "^4.0.0" -lru_map@^0.3.3: - version "0.3.3" - resolved "https://npm-8ee.hidora.com/lru_map/-/lru_map-0.3.3.tgz#b5c8351b9464cbd750335a79650a0ec0e56118dd" - integrity sha1-tcg1G5Rky9dQM1p5ZQoOwOVhGN0= - magic-string@^0.25.0, magic-string@^0.25.7: version "0.25.7" resolved "https://npm-8ee.hidora.com/magic-string/-/magic-string-0.25.7.tgz#3f497d6fd34c669c6798dcb821f2ef31f5445051"

@@ -5367,13 +5163,6 @@ version "1.2.5"

resolved "https://npm-8ee.hidora.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== -mkdirp@^0.5.5: - version "0.5.5" - resolved "https://npm-8ee.hidora.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def" - integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ== - dependencies: - minimist "^1.2.5" - mkdirp@^1.0.4: version "1.0.4" resolved "https://npm-8ee.hidora.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e"

@@ -5497,7 +5286,7 @@ dependencies:

lower-case "^2.0.2" tslib "^2.0.3" -node-fetch@2.6.1, node-fetch@^2.6.0, node-fetch@^2.6.1: +node-fetch@2.6.1, node-fetch@^2.6.1: version "2.6.1" resolved "https://npm-8ee.hidora.com/node-fetch/-/node-fetch-2.6.1.tgz#045bd323631f76ed2e2b55573394416b639a0052" integrity sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==

@@ -5565,16 +5354,6 @@ version "4.5.1"

resolved "https://npm-8ee.hidora.com/normalize-url/-/normalize-url-4.5.1.tgz#0dd90cf1288ee1d1313b87081c9a5932ee48518a" integrity sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA== -npmlog@^4.1.2: - version "4.1.2" - resolved "https://npm-8ee.hidora.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" - integrity sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg== - dependencies: - are-we-there-yet "~1.1.2" - console-control-strings "~1.1.0" - gauge "~2.7.3" - set-blocking "~2.0.0" - nullthrows@^1.1.1: version "1.1.1" resolved "https://npm-8ee.hidora.com/nullthrows/-/nullthrows-1.1.1.tgz#7818258843856ae971eae4208ad7d7eb19a431b1"

@@ -6000,7 +5779,7 @@ version "0.11.10"

resolved "https://npm-8ee.hidora.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" integrity sha1-czIwDoQBYb2j5podHZGn1LwW8YI= -progress@^2.0.0, progress@^2.0.3: +progress@^2.0.0: version "2.0.3" resolved "https://npm-8ee.hidora.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==

@@ -6020,11 +5799,6 @@ dependencies:

loose-envify "^1.4.0" object-assign "^4.1.1" react-is "^16.8.1" - -proxy-from-env@^1.1.0: - version "1.1.0" - resolved "https://npm-8ee.hidora.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2" - integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg== public-encrypt@^4.0.0: version "4.0.3"

@@ -6204,7 +5978,7 @@ dependencies:

loose-envify "^1.1.0" object-assign "^4.1.1" -readable-stream@^2.0.2, readable-stream@^2.0.6, readable-stream@^2.3.3, readable-stream@^2.3.6: +readable-stream@^2.0.2, readable-stream@^2.3.3, readable-stream@^2.3.6: version "2.3.7" resolved "https://npm-8ee.hidora.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==

@@ -6588,7 +6362,7 @@ integrity sha512-SaaNal9imEO737H2c05Og0/8LUXG7EnsZyMa8MzkmuHoELfT6txuj0cMqRj6zfPKnmQ1yasR4PCJc8x+M4JSPA==

dependencies: randombytes "^2.1.0" -set-blocking@^2.0.0, set-blocking@~2.0.0: +set-blocking@^2.0.0: version "2.0.0" resolved "https://npm-8ee.hidora.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc=

@@ -6637,7 +6411,7 @@ call-bind "^1.0.0"

get-intrinsic "^1.0.2" object-inspect "^1.9.0" -signal-exit@^3.0.0, signal-exit@^3.0.2: +signal-exit@^3.0.2: version "3.0.3" resolved "https://npm-8ee.hidora.com/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c" integrity sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==

@@ -6811,7 +6585,7 @@ code-point-at "^1.0.0"

is-fullwidth-code-point "^1.0.0" strip-ansi "^3.0.0" -"string-width@^1.0.2 || 2", string-width@^2.1.1: +string-width@^2.1.1: version "2.1.1" resolved "https://npm-8ee.hidora.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==

@@ -7181,7 +6955,7 @@ json5 "^1.0.1"

minimist "^1.2.0" strip-bom "^3.0.0" -tslib@^1.10.0, tslib@^1.8.1, tslib@^1.9.0, tslib@^1.9.3: +tslib@^1.10.0, tslib@^1.8.1, tslib@^1.9.0: version "1.14.1" resolved "https://npm-8ee.hidora.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==

@@ -7508,13 +7282,6 @@ resolved "https://npm-8ee.hidora.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1"

integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== dependencies: isexe "^2.0.0" - -wide-align@^1.1.0: - version "1.1.3" - resolved "https://npm-8ee.hidora.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457" - integrity sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA== - dependencies: - string-width "^1.0.2 || 2" word-wrap@^1.2.3: version "1.2.3"