diff --git a/src/backend/server/src/Todo.Api/Controllers/TodosController.cs b/src/backend/server/src/Todo.Api/Controllers/TodosController.cs index 4234103..f2f4ed9 100644 --- a/src/backend/server/src/Todo.Api/Controllers/TodosController.cs +++ b/src/backend/server/src/Todo.Api/Controllers/TodosController.cs @@ -37,11 +37,15 @@ public class TodosController : ApiController [HttpPost] public async Task> CreateTodo( [FromBody] CreateTodoRequest request) - => Ok(await Mediator.Send(request.To())); + { + return Ok(await Mediator.Send(request.To())); + } [HttpGet("{todoId}")] public async Task> GetTodoById([FromRoute] string todoId) - => await Mediator.Send(new GetTodoByIdQuery(todoId)); + { + return await Mediator.Send(new GetTodoByIdQuery(todoId)); + } [HttpGet] public async Task>> GetTodos([FromQuery] bool onlyActive = false) diff --git a/src/backend/server/src/Todo.Core/Application/Commands/Todo/CreateTodoCommand.cs b/src/backend/server/src/Todo.Core/Application/Commands/Todo/CreateTodoCommand.cs index 84880c7..5025828 100644 --- a/src/backend/server/src/Todo.Core/Application/Commands/Todo/CreateTodoCommand.cs +++ b/src/backend/server/src/Todo.Core/Application/Commands/Todo/CreateTodoCommand.cs @@ -2,6 +2,7 @@ using System.ComponentModel.DataAnnotations; using System.Threading; using MediatR; using Todo.Core.Application.Notifications.Todo; +using Todo.Core.Application.Queries.Todos; using Todo.Core.Interfaces.Persistence; using Todo.Core.Interfaces.User; @@ -10,9 +11,9 @@ namespace Todo.Core.Application.Commands.Todo; public record CreateTodoCommand( [Required] string TodoTitle, string? TodoProject, - string? TodoDescription) : IRequest + string? TodoDescription) : IRequest { - internal class Handler : IRequestHandler + internal class Handler : IRequestHandler { private readonly ICurrentUserService _currentUserService; private readonly IMediator _mediator; @@ -28,7 +29,7 @@ public record CreateTodoCommand( _mediator = mediator; } - public async Task Handle( + public async Task Handle( CreateTodoCommand request, CancellationToken cancellationToken) { @@ -47,7 +48,7 @@ public record CreateTodoCommand( new TodoCreated(todo.Id), cancellationToken); - return todo.Id; + return TodoViewModel.From(todo); } } } \ No newline at end of file diff --git a/src/client/public/sw.js b/src/client/public/sw.js index 65960f1..5a5441c 100644 --- a/src/client/public/sw.js +++ b/src/client/public/sw.js @@ -1,128 +1 @@ -/** - * Copyright 2018 Google Inc. All Rights Reserved. - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -// If the loader is already loaded, just stop. -if (!self.define) { - const singleRequire = name => { - if (name !== 'require') { - name = name + '.js'; - } - let promise = Promise.resolve(); - if (!registry[name]) { - - promise = new Promise(async resolve => { - if ("document" in self) { - const script = document.createElement("script"); - script.src = name; - document.head.appendChild(script); - script.onload = resolve; - } else { - importScripts(name); - resolve(); - } - }); - - } - return promise.then(() => { - if (!registry[name]) { - throw new Error(`Module ${name} didn’t register its module`); - } - return registry[name]; - }); - }; - - const require = (names, resolve) => { - Promise.all(names.map(singleRequire)) - .then(modules => resolve(modules.length === 1 ? modules[0] : modules)); - }; - - const registry = { - require: Promise.resolve(require) - }; - - self.define = (moduleName, depsNames, factory) => { - if (registry[moduleName]) { - // Module is already loading or loaded. - return; - } - registry[moduleName] = Promise.resolve().then(() => { - let exports = {}; - const module = { - uri: location.origin + moduleName.slice(1) - }; - return Promise.all( - depsNames.map(depName => { - switch(depName) { - case "exports": - return exports; - case "module": - return module; - default: - return singleRequire(depName); - } - }) - ).then(deps => { - const facValue = factory(...deps); - if(!exports.default) { - exports.default = facValue; - } - return exports; - }); - }); - }; -} -define("./sw.js",['./workbox-1ffba242'], (function (workbox) { 'use strict'; - - /** - * Welcome to your Workbox-powered service worker! - * - * You'll need to register this file in your web app. - * See https://goo.gl/nhQhGp - * - * The rest of the code is auto-generated. Please don't update this file - * directly; instead, make changes to your Workbox build configuration - * and re-run your build process. - * See https://goo.gl/2aRDsh - */ - - importScripts(); - self.skipWaiting(); - workbox.clientsClaim(); - workbox.registerRoute("/", new workbox.NetworkFirst({ - "cacheName": "start-url", - plugins: [{ - cacheWillUpdate: async ({ - request, - response, - event, - state - }) => { - if (response && response.type === 'opaqueredirect') { - return new Response(response.body, { - status: 200, - statusText: 'OK', - headers: response.headers - }); - } - - return response; - } - }] - }), 'GET'); - workbox.registerRoute(/.*/i, new workbox.NetworkOnly({ - "cacheName": "dev", - plugins: [] - }), 'GET'); - -})); -//# sourceMappingURL=sw.js.map +if(!self.define){const e=e=>{"require"!==e&&(e+=".js");let s=Promise.resolve();return i[e]||(s=new Promise((async s=>{if("document"in self){const i=document.createElement("script");i.src=e,document.head.appendChild(i),i.onload=s}else importScripts(e),s()}))),s.then((()=>{if(!i[e])throw new Error(`Module ${e} didn’t register its module`);return i[e]}))},s=(s,i)=>{Promise.all(s.map(e)).then((e=>i(1===e.length?e[0]:e)))},i={require:Promise.resolve(s)};self.define=(s,n,a)=>{i[s]||(i[s]=Promise.resolve().then((()=>{let i={};const t={uri:location.origin+s.slice(1)};return Promise.all(n.map((s=>{switch(s){case"exports":return i;case"module":return t;default:return e(s)}}))).then((e=>{const s=a(...e);return i.default||(i.default=s),i}))})))}}define("./sw.js",["./workbox-4a677df8"],(function(e){"use strict";importScripts(),self.skipWaiting(),e.clientsClaim(),e.precacheAndRoute([{url:"/_next/server/middleware-manifest.json",revision:"iwQv_8-4QCbK3RyXR2qie"},{url:"/_next/static/chunks/709-0f72f1dea588eff2.js",revision:"iwQv_8-4QCbK3RyXR2qie"},{url:"/_next/static/chunks/framework-0f8b31729833af61.js",revision:"iwQv_8-4QCbK3RyXR2qie"},{url:"/_next/static/chunks/main-a8edae0d785a1705.js",revision:"iwQv_8-4QCbK3RyXR2qie"},{url:"/_next/static/chunks/pages/_app-a9a3a3392d07fd8d.js",revision:"iwQv_8-4QCbK3RyXR2qie"},{url:"/_next/static/chunks/pages/_error-2280fa386d040b66.js",revision:"iwQv_8-4QCbK3RyXR2qie"},{url:"/_next/static/chunks/pages/index-7d9d2774b1d15ff3.js",revision:"iwQv_8-4QCbK3RyXR2qie"},{url:"/_next/static/chunks/pages/todos/%5BtodoId%5D-a5fc50aa03ec6ee2.js",revision:"iwQv_8-4QCbK3RyXR2qie"},{url:"/_next/static/chunks/polyfills-5cd94c89d3acac5f.js",revision:"iwQv_8-4QCbK3RyXR2qie"},{url:"/_next/static/chunks/webpack-49b6f2937c9ce9f4.js",revision:"iwQv_8-4QCbK3RyXR2qie"},{url:"/_next/static/css/8c32a4be4d88baed.css",revision:"iwQv_8-4QCbK3RyXR2qie"},{url:"/_next/static/iwQv_8-4QCbK3RyXR2qie/_buildManifest.js",revision:"iwQv_8-4QCbK3RyXR2qie"},{url:"/_next/static/iwQv_8-4QCbK3RyXR2qie/_middlewareManifest.js",revision:"iwQv_8-4QCbK3RyXR2qie"},{url:"/_next/static/iwQv_8-4QCbK3RyXR2qie/_ssgManifest.js",revision:"iwQv_8-4QCbK3RyXR2qie"},{url:"/favicon.ico",revision:"c30c7d42707a47a3f4591831641e50dc"},{url:"/icons/icon-128x128.png",revision:"d626cfe7c65e6e5403bcbb9d13aa5053"},{url:"/icons/icon-144x144.png",revision:"e53a506b62999dc7a4f8b7222f8c5add"},{url:"/icons/icon-152x152.png",revision:"18b3958440703a9ecd3c246a0f3f7c72"},{url:"/icons/icon-16x16.png",revision:"83703514f19796ee15151e450984416d"},{url:"/icons/icon-192x192.png",revision:"27dc12f66697a47b6a8b3ee25ba96257"},{url:"/icons/icon-32x32.png",revision:"25e2c6ee34840568012b32e4314278df"},{url:"/icons/icon-384x384.png",revision:"a40324a3fde2b0b26eeffd4f08bf8be8"},{url:"/icons/icon-512x512.png",revision:"93d6e8e15cfa78dfee55446f607d9a28"},{url:"/icons/icon-72x72.png",revision:"f2ffc41b3482888f3ae614e0dd2f6980"},{url:"/icons/icon-96x96.png",revision:"fba02a40f7ba6fc65be8a2f245480f6d"},{url:"/manifest.json",revision:"ae65562169f29e01bb0bfdd48166a873"},{url:"/vercel.svg",revision:"4b4f1876502eb6721764637fe5c41702"}],{ignoreURLParametersMatching:[]}),e.cleanupOutdatedCaches(),e.registerRoute("/",new e.NetworkFirst({cacheName:"start-url",plugins:[{cacheWillUpdate:async({request:e,response:s,event:i,state:n})=>s&&"opaqueredirect"===s.type?new Response(s.body,{status:200,statusText:"OK",headers:s.headers}):s}]}),"GET"),e.registerRoute(/^https:\/\/fonts\.(?:gstatic)\.com\/.*/i,new e.CacheFirst({cacheName:"google-fonts-webfonts",plugins:[new e.ExpirationPlugin({maxEntries:4,maxAgeSeconds:31536e3})]}),"GET"),e.registerRoute(/^https:\/\/fonts\.(?:googleapis)\.com\/.*/i,new e.StaleWhileRevalidate({cacheName:"google-fonts-stylesheets",plugins:[new e.ExpirationPlugin({maxEntries:4,maxAgeSeconds:604800})]}),"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})]}),"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})]}),"GET"),e.registerRoute(/\/_next\/image\?url=.+$/i,new e.StaleWhileRevalidate({cacheName:"next-image",plugins:[new e.ExpirationPlugin({maxEntries:64,maxAgeSeconds:86400})]}),"GET"),e.registerRoute(/\.(?:mp3|wav|ogg)$/i,new e.CacheFirst({cacheName:"static-audio-assets",plugins:[new e.RangeRequestsPlugin,new e.ExpirationPlugin({maxEntries:32,maxAgeSeconds:86400})]}),"GET"),e.registerRoute(/\.(?:mp4)$/i,new e.CacheFirst({cacheName:"static-video-assets",plugins:[new e.RangeRequestsPlugin,new e.ExpirationPlugin({maxEntries:32,maxAgeSeconds:86400})]}),"GET"),e.registerRoute(/\.(?:js)$/i,new e.StaleWhileRevalidate({cacheName:"static-js-assets",plugins:[new e.ExpirationPlugin({maxEntries:32,maxAgeSeconds:86400})]}),"GET"),e.registerRoute(/\.(?:css|less)$/i,new e.StaleWhileRevalidate({cacheName:"static-style-assets",plugins:[new e.ExpirationPlugin({maxEntries:32,maxAgeSeconds:86400})]}),"GET"),e.registerRoute(/\/_next\/data\/.+\/.+\.json$/i,new e.StaleWhileRevalidate({cacheName:"next-data",plugins:[new e.ExpirationPlugin({maxEntries:32,maxAgeSeconds:86400})]}),"GET"),e.registerRoute(/\.(?:json|xml|csv)$/i,new e.NetworkFirst({cacheName:"static-data-assets",plugins:[new e.ExpirationPlugin({maxEntries:32,maxAgeSeconds:86400})]}),"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})]}),"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})]}),"GET"),e.registerRoute((({url:e})=>!(self.origin===e.origin)),new e.NetworkFirst({cacheName:"cross-origin",networkTimeoutSeconds:10,plugins:[new e.ExpirationPlugin({maxEntries:32,maxAgeSeconds:3600})]}),"GET")})); diff --git a/src/client/public/sw.js.map b/src/client/public/sw.js.map deleted file mode 100644 index 51a915c..0000000 --- a/src/client/public/sw.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"sw.js","sources":["../../../../../../../../tmp/2966604b4704df68e7ceebb70ae0c809/sw.js"],"sourcesContent":["import {registerRoute as workbox_routing_registerRoute} from '/home/kjuulh/git/git.front.kjuulh.io/kjuulh/todo/src/client/node_modules/workbox-routing/registerRoute.mjs';\nimport {NetworkFirst as workbox_strategies_NetworkFirst} from '/home/kjuulh/git/git.front.kjuulh.io/kjuulh/todo/src/client/node_modules/workbox-strategies/NetworkFirst.mjs';\nimport {NetworkOnly as workbox_strategies_NetworkOnly} from '/home/kjuulh/git/git.front.kjuulh.io/kjuulh/todo/src/client/node_modules/workbox-strategies/NetworkOnly.mjs';\nimport {clientsClaim as workbox_core_clientsClaim} from '/home/kjuulh/git/git.front.kjuulh.io/kjuulh/todo/src/client/node_modules/workbox-core/clientsClaim.mjs';/**\n * Welcome to your Workbox-powered service worker!\n *\n * You'll need to register this file in your web app.\n * See https://goo.gl/nhQhGp\n *\n * The rest of the code is auto-generated. Please don't update this file\n * directly; instead, make changes to your Workbox build configuration\n * and re-run your build process.\n * See https://goo.gl/2aRDsh\n */\n\n\nimportScripts(\n \n);\n\n\n\n\n\n\n\nself.skipWaiting();\n\nworkbox_core_clientsClaim();\n\n\n\nworkbox_routing_registerRoute(\"/\", new workbox_strategies_NetworkFirst({ \"cacheName\":\"start-url\", plugins: [{ cacheWillUpdate: async ({request, response, event, state}) => { if (response && response.type === 'opaqueredirect') { return new Response(response.body, {status: 200, statusText: 'OK', headers: response.headers}); } return response; } }] }), 'GET');\nworkbox_routing_registerRoute(/.*/i, new workbox_strategies_NetworkOnly({ \"cacheName\":\"dev\", plugins: [] }), 'GET');\n\n\n\n\n"],"names":["importScripts","self","skipWaiting","workbox_core_clientsClaim","workbox_routing_registerRoute","workbox_strategies_NetworkFirst","plugins","cacheWillUpdate","request","response","event","state","type","Response","body","status","statusText","headers","workbox_strategies_NetworkOnly"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAGiK;EACjK;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;EAGAA,aAAa;EAUbC,IAAI,CAACC,WAAL;AAEAC,sBAAyB;AAIzBC,uBAA6B,CAAC,GAAD,EAAM,IAAIC,oBAAJ,CAAoC;EAAE,eAAY,WAAd;EAA2BC,EAAAA,OAAO,EAAE,CAAC;EAAEC,IAAAA,eAAe,EAAE,OAAO;EAACC,MAAAA,OAAD;EAAUC,MAAAA,QAAV;EAAoBC,MAAAA,KAApB;EAA2BC,MAAAA;EAA3B,KAAP,KAA6C;EAAE,UAAIF,QAAQ,IAAIA,QAAQ,CAACG,IAAT,KAAkB,gBAAlC,EAAoD;EAAE,eAAO,IAAIC,QAAJ,CAAaJ,QAAQ,CAACK,IAAtB,EAA4B;EAACC,UAAAA,MAAM,EAAE,GAAT;EAAcC,UAAAA,UAAU,EAAE,IAA1B;EAAgCC,UAAAA,OAAO,EAAER,QAAQ,CAACQ;EAAlD,SAA5B,CAAP;EAAiG;;EAAC,aAAOR,QAAP;EAAkB;EAA5O,GAAD;EAApC,CAApC,CAAN,EAAmU,KAAnU,CAA7B;AACAL,uBAA6B,CAAC,KAAD,EAAQ,IAAIc,mBAAJ,CAAmC;EAAE,eAAY,KAAd;EAAqBZ,EAAAA,OAAO,EAAE;EAA9B,CAAnC,CAAR,EAAgF,KAAhF,CAA7B;;"} \ No newline at end of file diff --git a/src/client/public/workbox-1ffba242.js b/src/client/public/workbox-1ffba242.js deleted file mode 100644 index c81b3f5..0000000 --- a/src/client/public/workbox-1ffba242.js +++ /dev/null @@ -1,2732 +0,0 @@ -define("./workbox-1ffba242.js",['exports'], (function (exports) { 'use strict'; - - try { - self['workbox:core:6.2.4'] && _(); - } catch (e) {} - - /* - Copyright 2019 Google LLC - Use of this source code is governed by an MIT-style - license that can be found in the LICENSE file or at - https://opensource.org/licenses/MIT. - */ - const logger = (() => { - // Don't overwrite this value if it's already set. - // See https://github.com/GoogleChrome/workbox/pull/2284#issuecomment-560470923 - if (!('__WB_DISABLE_DEV_LOGS' in self)) { - self.__WB_DISABLE_DEV_LOGS = false; - } - - let inGroup = false; - const methodToColorMap = { - debug: `#7f8c8d`, - log: `#2ecc71`, - warn: `#f39c12`, - error: `#c0392b`, - groupCollapsed: `#3498db`, - groupEnd: null - }; - - const print = function (method, args) { - if (self.__WB_DISABLE_DEV_LOGS) { - return; - } - - if (method === 'groupCollapsed') { - // Safari doesn't print all console.groupCollapsed() arguments: - // https://bugs.webkit.org/show_bug.cgi?id=182754 - if (/^((?!chrome|android).)*safari/i.test(navigator.userAgent)) { - console[method](...args); - return; - } - } - - const styles = [`background: ${methodToColorMap[method]}`, `border-radius: 0.5em`, `color: white`, `font-weight: bold`, `padding: 2px 0.5em`]; // When in a group, the workbox prefix is not displayed. - - const logPrefix = inGroup ? [] : ['%cworkbox', styles.join(';')]; - console[method](...logPrefix, ...args); - - if (method === 'groupCollapsed') { - inGroup = true; - } - - if (method === 'groupEnd') { - inGroup = false; - } - }; // eslint-disable-next-line @typescript-eslint/ban-types - - - const api = {}; - const loggerMethods = Object.keys(methodToColorMap); - - for (const key of loggerMethods) { - const method = key; - - api[method] = (...args) => { - print(method, args); - }; - } - - return api; - })(); - - /* - Copyright 2018 Google LLC - - Use of this source code is governed by an MIT-style - license that can be found in the LICENSE file or at - https://opensource.org/licenses/MIT. - */ - const messages$1 = { - 'invalid-value': ({ - paramName, - validValueDescription, - value - }) => { - if (!paramName || !validValueDescription) { - throw new Error(`Unexpected input to 'invalid-value' error.`); - } - - return `The '${paramName}' parameter was given a value with an ` + `unexpected value. ${validValueDescription} Received a value of ` + `${JSON.stringify(value)}.`; - }, - 'not-an-array': ({ - moduleName, - className, - funcName, - paramName - }) => { - if (!moduleName || !className || !funcName || !paramName) { - throw new Error(`Unexpected input to 'not-an-array' error.`); - } - - return `The parameter '${paramName}' passed into ` + `'${moduleName}.${className}.${funcName}()' must be an array.`; - }, - 'incorrect-type': ({ - expectedType, - paramName, - moduleName, - className, - funcName - }) => { - if (!expectedType || !paramName || !moduleName || !funcName) { - throw new Error(`Unexpected input to 'incorrect-type' error.`); - } - - const classNameStr = className ? `${className}.` : ''; - return `The parameter '${paramName}' passed into ` + `'${moduleName}.${classNameStr}` + `${funcName}()' must be of type ${expectedType}.`; - }, - 'incorrect-class': ({ - expectedClassName, - paramName, - moduleName, - className, - funcName, - isReturnValueProblem - }) => { - if (!expectedClassName || !moduleName || !funcName) { - throw new Error(`Unexpected input to 'incorrect-class' error.`); - } - - const classNameStr = className ? `${className}.` : ''; - - if (isReturnValueProblem) { - return `The return value from ` + `'${moduleName}.${classNameStr}${funcName}()' ` + `must be an instance of class ${expectedClassName}.`; - } - - return `The parameter '${paramName}' passed into ` + `'${moduleName}.${classNameStr}${funcName}()' ` + `must be an instance of class ${expectedClassName}.`; - }, - 'missing-a-method': ({ - expectedMethod, - paramName, - moduleName, - className, - funcName - }) => { - if (!expectedMethod || !paramName || !moduleName || !className || !funcName) { - throw new Error(`Unexpected input to 'missing-a-method' error.`); - } - - return `${moduleName}.${className}.${funcName}() expected the ` + `'${paramName}' parameter to expose a '${expectedMethod}' method.`; - }, - 'add-to-cache-list-unexpected-type': ({ - entry - }) => { - return `An unexpected entry was passed to ` + `'workbox-precaching.PrecacheController.addToCacheList()' The entry ` + `'${JSON.stringify(entry)}' isn't supported. You must supply an array of ` + `strings with one or more characters, objects with a url property or ` + `Request objects.`; - }, - 'add-to-cache-list-conflicting-entries': ({ - firstEntry, - secondEntry - }) => { - if (!firstEntry || !secondEntry) { - throw new Error(`Unexpected input to ` + `'add-to-cache-list-duplicate-entries' error.`); - } - - return `Two of the entries passed to ` + `'workbox-precaching.PrecacheController.addToCacheList()' had the URL ` + `${firstEntry} but different revision details. Workbox is ` + `unable to cache and version the asset correctly. Please remove one ` + `of the entries.`; - }, - 'plugin-error-request-will-fetch': ({ - thrownErrorMessage - }) => { - if (!thrownErrorMessage) { - throw new Error(`Unexpected input to ` + `'plugin-error-request-will-fetch', error.`); - } - - return `An error was thrown by a plugins 'requestWillFetch()' method. ` + `The thrown error message was: '${thrownErrorMessage}'.`; - }, - 'invalid-cache-name': ({ - cacheNameId, - value - }) => { - if (!cacheNameId) { - throw new Error(`Expected a 'cacheNameId' for error 'invalid-cache-name'`); - } - - return `You must provide a name containing at least one character for ` + `setCacheDetails({${cacheNameId}: '...'}). Received a value of ` + `'${JSON.stringify(value)}'`; - }, - 'unregister-route-but-not-found-with-method': ({ - method - }) => { - if (!method) { - throw new Error(`Unexpected input to ` + `'unregister-route-but-not-found-with-method' error.`); - } - - return `The route you're trying to unregister was not previously ` + `registered for the method type '${method}'.`; - }, - 'unregister-route-route-not-registered': () => { - return `The route you're trying to unregister was not previously ` + `registered.`; - }, - 'queue-replay-failed': ({ - name - }) => { - return `Replaying the background sync queue '${name}' failed.`; - }, - 'duplicate-queue-name': ({ - name - }) => { - return `The Queue name '${name}' is already being used. ` + `All instances of backgroundSync.Queue must be given unique names.`; - }, - 'expired-test-without-max-age': ({ - methodName, - paramName - }) => { - return `The '${methodName}()' method can only be used when the ` + `'${paramName}' is used in the constructor.`; - }, - 'unsupported-route-type': ({ - moduleName, - className, - funcName, - paramName - }) => { - return `The supplied '${paramName}' parameter was an unsupported type. ` + `Please check the docs for ${moduleName}.${className}.${funcName} for ` + `valid input types.`; - }, - 'not-array-of-class': ({ - value, - expectedClass, - moduleName, - className, - funcName, - paramName - }) => { - return `The supplied '${paramName}' parameter must be an array of ` + `'${expectedClass}' objects. Received '${JSON.stringify(value)},'. ` + `Please check the call to ${moduleName}.${className}.${funcName}() ` + `to fix the issue.`; - }, - 'max-entries-or-age-required': ({ - moduleName, - className, - funcName - }) => { - return `You must define either config.maxEntries or config.maxAgeSeconds` + `in ${moduleName}.${className}.${funcName}`; - }, - 'statuses-or-headers-required': ({ - moduleName, - className, - funcName - }) => { - return `You must define either config.statuses or config.headers` + `in ${moduleName}.${className}.${funcName}`; - }, - 'invalid-string': ({ - moduleName, - funcName, - paramName - }) => { - if (!paramName || !moduleName || !funcName) { - throw new Error(`Unexpected input to 'invalid-string' error.`); - } - - return `When using strings, the '${paramName}' parameter must start with ` + `'http' (for cross-origin matches) or '/' (for same-origin matches). ` + `Please see the docs for ${moduleName}.${funcName}() for ` + `more info.`; - }, - 'channel-name-required': () => { - return `You must provide a channelName to construct a ` + `BroadcastCacheUpdate instance.`; - }, - 'invalid-responses-are-same-args': () => { - return `The arguments passed into responsesAreSame() appear to be ` + `invalid. Please ensure valid Responses are used.`; - }, - 'expire-custom-caches-only': () => { - return `You must provide a 'cacheName' property when using the ` + `expiration plugin with a runtime caching strategy.`; - }, - 'unit-must-be-bytes': ({ - normalizedRangeHeader - }) => { - if (!normalizedRangeHeader) { - throw new Error(`Unexpected input to 'unit-must-be-bytes' error.`); - } - - return `The 'unit' portion of the Range header must be set to 'bytes'. ` + `The Range header provided was "${normalizedRangeHeader}"`; - }, - 'single-range-only': ({ - normalizedRangeHeader - }) => { - if (!normalizedRangeHeader) { - throw new Error(`Unexpected input to 'single-range-only' error.`); - } - - return `Multiple ranges are not supported. Please use a single start ` + `value, and optional end value. The Range header provided was ` + `"${normalizedRangeHeader}"`; - }, - 'invalid-range-values': ({ - normalizedRangeHeader - }) => { - if (!normalizedRangeHeader) { - throw new Error(`Unexpected input to 'invalid-range-values' error.`); - } - - return `The Range header is missing both start and end values. At least ` + `one of those values is needed. The Range header provided was ` + `"${normalizedRangeHeader}"`; - }, - 'no-range-header': () => { - return `No Range header was found in the Request provided.`; - }, - 'range-not-satisfiable': ({ - size, - start, - end - }) => { - return `The start (${start}) and end (${end}) values in the Range are ` + `not satisfiable by the cached response, which is ${size} bytes.`; - }, - 'attempt-to-cache-non-get-request': ({ - url, - method - }) => { - return `Unable to cache '${url}' because it is a '${method}' request and ` + `only 'GET' requests can be cached.`; - }, - 'cache-put-with-no-response': ({ - url - }) => { - return `There was an attempt to cache '${url}' but the response was not ` + `defined.`; - }, - 'no-response': ({ - url, - error - }) => { - let message = `The strategy could not generate a response for '${url}'.`; - - if (error) { - message += ` The underlying error is ${error}.`; - } - - return message; - }, - 'bad-precaching-response': ({ - url, - status - }) => { - return `The precaching request for '${url}' failed` + (status ? ` with an HTTP status of ${status}.` : `.`); - }, - 'non-precached-url': ({ - url - }) => { - return `createHandlerBoundToURL('${url}') was called, but that URL is ` + `not precached. Please pass in a URL that is precached instead.`; - }, - 'add-to-cache-list-conflicting-integrities': ({ - url - }) => { - return `Two of the entries passed to ` + `'workbox-precaching.PrecacheController.addToCacheList()' had the URL ` + `${url} with different integrity values. Please remove one of them.`; - }, - 'missing-precache-entry': ({ - cacheName, - url - }) => { - return `Unable to find a precached response in ${cacheName} for ${url}.`; - }, - 'cross-origin-copy-response': ({ - origin - }) => { - return `workbox-core.copyResponse() can only be used with same-origin ` + `responses. It was passed a response with origin ${origin}.`; - } - }; - - /* - Copyright 2018 Google LLC - - Use of this source code is governed by an MIT-style - license that can be found in the LICENSE file or at - https://opensource.org/licenses/MIT. - */ - - const generatorFunction = (code, details = {}) => { - const message = messages$1[code]; - - if (!message) { - throw new Error(`Unable to find message for code '${code}'.`); - } - - return message(details); - }; - - const messageGenerator = generatorFunction; - - /* - Copyright 2018 Google LLC - - Use of this source code is governed by an MIT-style - license that can be found in the LICENSE file or at - https://opensource.org/licenses/MIT. - */ - /** - * Workbox errors should be thrown with this class. - * This allows use to ensure the type easily in tests, - * helps developers identify errors from workbox - * easily and allows use to optimise error - * messages correctly. - * - * @private - */ - - class WorkboxError extends Error { - /** - * - * @param {string} errorCode The error code that - * identifies this particular error. - * @param {Object=} details Any relevant arguments - * that will help developers identify issues should - * be added as a key on the context object. - */ - constructor(errorCode, details) { - const message = messageGenerator(errorCode, details); - super(message); - this.name = errorCode; - this.details = details; - } - - } - - /* - Copyright 2018 Google LLC - - Use of this source code is governed by an MIT-style - license that can be found in the LICENSE file or at - https://opensource.org/licenses/MIT. - */ - /* - * This method throws if the supplied value is not an array. - * The destructed values are required to produce a meaningful error for users. - * The destructed and restructured object is so it's clear what is - * needed. - */ - - const isArray = (value, details) => { - if (!Array.isArray(value)) { - throw new WorkboxError('not-an-array', details); - } - }; - - const hasMethod = (object, expectedMethod, details) => { - const type = typeof object[expectedMethod]; - - if (type !== 'function') { - details['expectedMethod'] = expectedMethod; - throw new WorkboxError('missing-a-method', details); - } - }; - - const isType = (object, expectedType, details) => { - if (typeof object !== expectedType) { - details['expectedType'] = expectedType; - throw new WorkboxError('incorrect-type', details); - } - }; - - const isInstance = (object, // Need the general type to do the check later. - // eslint-disable-next-line @typescript-eslint/ban-types - expectedClass, details) => { - if (!(object instanceof expectedClass)) { - details['expectedClassName'] = expectedClass.name; - throw new WorkboxError('incorrect-class', details); - } - }; - - const isOneOf = (value, validValues, details) => { - if (!validValues.includes(value)) { - details['validValueDescription'] = `Valid values are ${JSON.stringify(validValues)}.`; - throw new WorkboxError('invalid-value', details); - } - }; - - const isArrayOfClass = (value, // Need general type to do check later. - expectedClass, // eslint-disable-line - details) => { - const error = new WorkboxError('not-array-of-class', details); - - if (!Array.isArray(value)) { - throw error; - } - - for (const item of value) { - if (!(item instanceof expectedClass)) { - throw error; - } - } - }; - - const finalAssertExports = { - hasMethod, - isArray, - isInstance, - isOneOf, - isType, - isArrayOfClass - }; - - try { - self['workbox:routing:6.2.4'] && _(); - } catch (e) {} - - /* - Copyright 2018 Google LLC - - Use of this source code is governed by an MIT-style - license that can be found in the LICENSE file or at - https://opensource.org/licenses/MIT. - */ - /** - * The default HTTP method, 'GET', used when there's no specific method - * configured for a route. - * - * @type {string} - * - * @private - */ - - const defaultMethod = 'GET'; - /** - * The list of valid HTTP methods associated with requests that could be routed. - * - * @type {Array} - * - * @private - */ - - const validMethods = ['DELETE', 'GET', 'HEAD', 'PATCH', 'POST', 'PUT']; - - /* - Copyright 2018 Google LLC - - Use of this source code is governed by an MIT-style - license that can be found in the LICENSE file or at - https://opensource.org/licenses/MIT. - */ - /** - * @param {function()|Object} handler Either a function, or an object with a - * 'handle' method. - * @return {Object} An object with a handle method. - * - * @private - */ - - const normalizeHandler = handler => { - if (handler && typeof handler === 'object') { - { - finalAssertExports.hasMethod(handler, 'handle', { - moduleName: 'workbox-routing', - className: 'Route', - funcName: 'constructor', - paramName: 'handler' - }); - } - - return handler; - } else { - { - finalAssertExports.isType(handler, 'function', { - moduleName: 'workbox-routing', - className: 'Route', - funcName: 'constructor', - paramName: 'handler' - }); - } - - return { - handle: handler - }; - } - }; - - /* - Copyright 2018 Google LLC - - Use of this source code is governed by an MIT-style - license that can be found in the LICENSE file or at - https://opensource.org/licenses/MIT. - */ - /** - * A `Route` consists of a pair of callback functions, "match" and "handler". - * The "match" callback determine if a route should be used to "handle" a - * request by returning a non-falsy value if it can. The "handler" callback - * is called when there is a match and should return a Promise that resolves - * to a `Response`. - * - * @memberof module:workbox-routing - */ - - class Route { - /** - * Constructor for Route class. - * - * @param {module:workbox-routing~matchCallback} match - * A callback function that determines whether the route matches a given - * `fetch` event by returning a non-falsy value. - * @param {module:workbox-routing~handlerCallback} handler A callback - * function that returns a Promise resolving to a Response. - * @param {string} [method='GET'] The HTTP method to match the Route - * against. - */ - constructor(match, handler, method = defaultMethod) { - { - finalAssertExports.isType(match, 'function', { - moduleName: 'workbox-routing', - className: 'Route', - funcName: 'constructor', - paramName: 'match' - }); - - if (method) { - finalAssertExports.isOneOf(method, validMethods, { - paramName: 'method' - }); - } - } // These values are referenced directly by Router so cannot be - // altered by minificaton. - - - this.handler = normalizeHandler(handler); - this.match = match; - this.method = method; - } - /** - * - * @param {module:workbox-routing-handlerCallback} handler A callback - * function that returns a Promise resolving to a Response - */ - - - setCatchHandler(handler) { - this.catchHandler = normalizeHandler(handler); - } - - } - - /* - Copyright 2018 Google LLC - - Use of this source code is governed by an MIT-style - license that can be found in the LICENSE file or at - https://opensource.org/licenses/MIT. - */ - /** - * RegExpRoute makes it easy to create a regular expression based - * [Route]{@link module:workbox-routing.Route}. - * - * For same-origin requests the RegExp only needs to match part of the URL. For - * requests against third-party servers, you must define a RegExp that matches - * the start of the URL. - * - * [See the module docs for info.]{@link https://developers.google.com/web/tools/workbox/modules/workbox-routing} - * - * @memberof module:workbox-routing - * @extends module:workbox-routing.Route - */ - - class RegExpRoute extends Route { - /** - * If the regular expression contains - * [capture groups]{@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp#grouping-back-references}, - * the captured values will be passed to the - * [handler's]{@link module:workbox-routing~handlerCallback} `params` - * argument. - * - * @param {RegExp} regExp The regular expression to match against URLs. - * @param {module:workbox-routing~handlerCallback} handler A callback - * function that returns a Promise resulting in a Response. - * @param {string} [method='GET'] The HTTP method to match the Route - * against. - */ - constructor(regExp, handler, method) { - { - finalAssertExports.isInstance(regExp, RegExp, { - moduleName: 'workbox-routing', - className: 'RegExpRoute', - funcName: 'constructor', - paramName: 'pattern' - }); - } - - const match = ({ - url - }) => { - const result = regExp.exec(url.href); // Return immediately if there's no match. - - if (!result) { - return; - } // Require that the match start at the first character in the URL string - // if it's a cross-origin request. - // See https://github.com/GoogleChrome/workbox/issues/281 for the context - // behind this behavior. - - - if (url.origin !== location.origin && result.index !== 0) { - { - logger.debug(`The regular expression '${regExp.toString()}' only partially matched ` + `against the cross-origin URL '${url.toString()}'. RegExpRoute's will only ` + `handle cross-origin requests if they match the entire URL.`); - } - - return; - } // If the route matches, but there aren't any capture groups defined, then - // this will return [], which is truthy and therefore sufficient to - // indicate a match. - // If there are capture groups, then it will return their values. - - - return result.slice(1); - }; - - super(match, handler, method); - } - - } - - /* - Copyright 2018 Google LLC - - Use of this source code is governed by an MIT-style - license that can be found in the LICENSE file or at - https://opensource.org/licenses/MIT. - */ - - const getFriendlyURL = url => { - const urlObj = new URL(String(url), location.href); // See https://github.com/GoogleChrome/workbox/issues/2323 - // We want to include everything, except for the origin if it's same-origin. - - return urlObj.href.replace(new RegExp(`^${location.origin}`), ''); - }; - - /* - Copyright 2018 Google LLC - - Use of this source code is governed by an MIT-style - license that can be found in the LICENSE file or at - https://opensource.org/licenses/MIT. - */ - /** - * The Router can be used to process a FetchEvent through one or more - * [Routes]{@link module:workbox-routing.Route} responding with a Request if - * a matching route exists. - * - * If no route matches a given a request, the Router will use a "default" - * handler if one is defined. - * - * Should the matching Route throw an error, the Router will use a "catch" - * handler if one is defined to gracefully deal with issues and respond with a - * Request. - * - * If a request matches multiple routes, the **earliest** registered route will - * be used to respond to the request. - * - * @memberof module:workbox-routing - */ - - class Router { - /** - * Initializes a new Router. - */ - constructor() { - this._routes = new Map(); - this._defaultHandlerMap = new Map(); - } - /** - * @return {Map>} routes A `Map` of HTTP - * method name ('GET', etc.) to an array of all the corresponding `Route` - * instances that are registered. - */ - - - get routes() { - return this._routes; - } - /** - * Adds a fetch event listener to respond to events when a route matches - * the event's request. - */ - - - addFetchListener() { - // See https://github.com/Microsoft/TypeScript/issues/28357#issuecomment-436484705 - self.addEventListener('fetch', event => { - const { - request - } = event; - const responsePromise = this.handleRequest({ - request, - event - }); - - if (responsePromise) { - event.respondWith(responsePromise); - } - }); - } - /** - * Adds a message event listener for URLs to cache from the window. - * This is useful to cache resources loaded on the page prior to when the - * service worker started controlling it. - * - * The format of the message data sent from the window should be as follows. - * Where the `urlsToCache` array may consist of URL strings or an array of - * URL string + `requestInit` object (the same as you'd pass to `fetch()`). - * - * ``` - * { - * type: 'CACHE_URLS', - * payload: { - * urlsToCache: [ - * './script1.js', - * './script2.js', - * ['./script3.js', {mode: 'no-cors'}], - * ], - * }, - * } - * ``` - */ - - - addCacheListener() { - // See https://github.com/Microsoft/TypeScript/issues/28357#issuecomment-436484705 - self.addEventListener('message', event => { - // event.data is type 'any' - if (event.data && event.data.type === 'CACHE_URLS') { - // eslint-disable-line - const { - payload - } = event.data; // eslint-disable-line - - { - logger.debug(`Caching URLs from the window`, payload.urlsToCache); - } - - const requestPromises = Promise.all(payload.urlsToCache.map(entry => { - if (typeof entry === 'string') { - entry = [entry]; - } - - const request = new Request(...entry); - return this.handleRequest({ - request, - event - }); // TODO(philipwalton): TypeScript errors without this typecast for - // some reason (probably a bug). The real type here should work but - // doesn't: `Array | undefined>`. - })); // TypeScript - - event.waitUntil(requestPromises); // If a MessageChannel was used, reply to the message on success. - - if (event.ports && event.ports[0]) { - void requestPromises.then(() => event.ports[0].postMessage(true)); - } - } - }); - } - /** - * Apply the routing rules to a FetchEvent object to get a Response from an - * appropriate Route's handler. - * - * @param {Object} options - * @param {Request} options.request The request to handle. - * @param {ExtendableEvent} options.event The event that triggered the - * request. - * @return {Promise|undefined} A promise is returned if a - * registered route can handle the request. If there is no matching - * route and there's no `defaultHandler`, `undefined` is returned. - */ - - - handleRequest({ - request, - event - }) { - { - finalAssertExports.isInstance(request, Request, { - moduleName: 'workbox-routing', - className: 'Router', - funcName: 'handleRequest', - paramName: 'options.request' - }); - } - - const url = new URL(request.url, location.href); - - if (!url.protocol.startsWith('http')) { - { - logger.debug(`Workbox Router only supports URLs that start with 'http'.`); - } - - return; - } - - const sameOrigin = url.origin === location.origin; - const { - params, - route - } = this.findMatchingRoute({ - event, - request, - sameOrigin, - url - }); - let handler = route && route.handler; - const debugMessages = []; - - { - if (handler) { - debugMessages.push([`Found a route to handle this request:`, route]); - - if (params) { - debugMessages.push([`Passing the following params to the route's handler:`, params]); - } - } - } // If we don't have a handler because there was no matching route, then - // fall back to defaultHandler if that's defined. - - - const method = request.method; - - if (!handler && this._defaultHandlerMap.has(method)) { - { - debugMessages.push(`Failed to find a matching route. Falling ` + `back to the default handler for ${method}.`); - } - - handler = this._defaultHandlerMap.get(method); - } - - if (!handler) { - { - // No handler so Workbox will do nothing. If logs is set of debug - // i.e. verbose, we should print out this information. - logger.debug(`No route found for: ${getFriendlyURL(url)}`); - } - - return; - } - - { - // We have a handler, meaning Workbox is going to handle the route. - // print the routing details to the console. - logger.groupCollapsed(`Router is responding to: ${getFriendlyURL(url)}`); - debugMessages.forEach(msg => { - if (Array.isArray(msg)) { - logger.log(...msg); - } else { - logger.log(msg); - } - }); - logger.groupEnd(); - } // Wrap in try and catch in case the handle method throws a synchronous - // error. It should still callback to the catch handler. - - - let responsePromise; - - try { - responsePromise = handler.handle({ - url, - request, - event, - params - }); - } catch (err) { - responsePromise = Promise.reject(err); - } // Get route's catch handler, if it exists - - - const catchHandler = route && route.catchHandler; - - if (responsePromise instanceof Promise && (this._catchHandler || catchHandler)) { - responsePromise = responsePromise.catch(async err => { - // If there's a route catch handler, process that first - if (catchHandler) { - { - // Still include URL here as it will be async from the console group - // and may not make sense without the URL - logger.groupCollapsed(`Error thrown when responding to: ` + ` ${getFriendlyURL(url)}. Falling back to route's Catch Handler.`); - logger.error(`Error thrown by:`, route); - logger.error(err); - logger.groupEnd(); - } - - try { - return await catchHandler.handle({ - url, - request, - event, - params - }); - } catch (catchErr) { - if (catchErr instanceof Error) { - err = catchErr; - } - } - } - - if (this._catchHandler) { - { - // Still include URL here as it will be async from the console group - // and may not make sense without the URL - logger.groupCollapsed(`Error thrown when responding to: ` + ` ${getFriendlyURL(url)}. Falling back to global Catch Handler.`); - logger.error(`Error thrown by:`, route); - logger.error(err); - logger.groupEnd(); - } - - return this._catchHandler.handle({ - url, - request, - event - }); - } - - throw err; - }); - } - - return responsePromise; - } - /** - * Checks a request and URL (and optionally an event) against the list of - * registered routes, and if there's a match, returns the corresponding - * route along with any params generated by the match. - * - * @param {Object} options - * @param {URL} options.url - * @param {boolean} options.sameOrigin The result of comparing `url.origin` - * against the current origin. - * @param {Request} options.request The request to match. - * @param {Event} options.event The corresponding event. - * @return {Object} An object with `route` and `params` properties. - * They are populated if a matching route was found or `undefined` - * otherwise. - */ - - - findMatchingRoute({ - url, - sameOrigin, - request, - event - }) { - const routes = this._routes.get(request.method) || []; - - for (const route of routes) { - let params; // route.match returns type any, not possible to change right now. - // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment - - const matchResult = route.match({ - url, - sameOrigin, - request, - event - }); - - if (matchResult) { - { - // Warn developers that using an async matchCallback is almost always - // not the right thing to do. - if (matchResult instanceof Promise) { - logger.warn(`While routing ${getFriendlyURL(url)}, an async ` + `matchCallback function was used. Please convert the ` + `following route to use a synchronous matchCallback function:`, route); - } - } // See https://github.com/GoogleChrome/workbox/issues/2079 - // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment - - - params = matchResult; - - if (Array.isArray(params) && params.length === 0) { - // Instead of passing an empty array in as params, use undefined. - params = undefined; - } else if (matchResult.constructor === Object && // eslint-disable-line - Object.keys(matchResult).length === 0) { - // Instead of passing an empty object in as params, use undefined. - params = undefined; - } else if (typeof matchResult === 'boolean') { - // For the boolean value true (rather than just something truth-y), - // don't set params. - // See https://github.com/GoogleChrome/workbox/pull/2134#issuecomment-513924353 - params = undefined; - } // Return early if have a match. - - - return { - route, - params - }; - } - } // If no match was found above, return and empty object. - - - return {}; - } - /** - * Define a default `handler` that's called when no routes explicitly - * match the incoming request. - * - * Each HTTP method ('GET', 'POST', etc.) gets its own default handler. - * - * Without a default handler, unmatched requests will go against the - * network as if there were no service worker present. - * - * @param {module:workbox-routing~handlerCallback} handler A callback - * function that returns a Promise resulting in a Response. - * @param {string} [method='GET'] The HTTP method to associate with this - * default handler. Each method has its own default. - */ - - - setDefaultHandler(handler, method = defaultMethod) { - this._defaultHandlerMap.set(method, normalizeHandler(handler)); - } - /** - * If a Route throws an error while handling a request, this `handler` - * will be called and given a chance to provide a response. - * - * @param {module:workbox-routing~handlerCallback} handler A callback - * function that returns a Promise resulting in a Response. - */ - - - setCatchHandler(handler) { - this._catchHandler = normalizeHandler(handler); - } - /** - * Registers a route with the router. - * - * @param {module:workbox-routing.Route} route The route to register. - */ - - - registerRoute(route) { - { - finalAssertExports.isType(route, 'object', { - moduleName: 'workbox-routing', - className: 'Router', - funcName: 'registerRoute', - paramName: 'route' - }); - finalAssertExports.hasMethod(route, 'match', { - moduleName: 'workbox-routing', - className: 'Router', - funcName: 'registerRoute', - paramName: 'route' - }); - finalAssertExports.isType(route.handler, 'object', { - moduleName: 'workbox-routing', - className: 'Router', - funcName: 'registerRoute', - paramName: 'route' - }); - finalAssertExports.hasMethod(route.handler, 'handle', { - moduleName: 'workbox-routing', - className: 'Router', - funcName: 'registerRoute', - paramName: 'route.handler' - }); - finalAssertExports.isType(route.method, 'string', { - moduleName: 'workbox-routing', - className: 'Router', - funcName: 'registerRoute', - paramName: 'route.method' - }); - } - - if (!this._routes.has(route.method)) { - this._routes.set(route.method, []); - } // Give precedence to all of the earlier routes by adding this additional - // route to the end of the array. - - - this._routes.get(route.method).push(route); - } - /** - * Unregisters a route with the router. - * - * @param {module:workbox-routing.Route} route The route to unregister. - */ - - - unregisterRoute(route) { - if (!this._routes.has(route.method)) { - throw new WorkboxError('unregister-route-but-not-found-with-method', { - method: route.method - }); - } - - const routeIndex = this._routes.get(route.method).indexOf(route); - - if (routeIndex > -1) { - this._routes.get(route.method).splice(routeIndex, 1); - } else { - throw new WorkboxError('unregister-route-route-not-registered'); - } - } - - } - - /* - Copyright 2019 Google LLC - - Use of this source code is governed by an MIT-style - license that can be found in the LICENSE file or at - https://opensource.org/licenses/MIT. - */ - let defaultRouter; - /** - * Creates a new, singleton Router instance if one does not exist. If one - * does already exist, that instance is returned. - * - * @private - * @return {Router} - */ - - const getOrCreateDefaultRouter = () => { - if (!defaultRouter) { - defaultRouter = new Router(); // The helpers that use the default Router assume these listeners exist. - - defaultRouter.addFetchListener(); - defaultRouter.addCacheListener(); - } - - return defaultRouter; - }; - - /* - Copyright 2019 Google LLC - - Use of this source code is governed by an MIT-style - license that can be found in the LICENSE file or at - https://opensource.org/licenses/MIT. - */ - /** - * Easily register a RegExp, string, or function with a caching - * strategy to a singleton Router instance. - * - * This method will generate a Route for you if needed and - * call [registerRoute()]{@link module:workbox-routing.Router#registerRoute}. - * - * @param {RegExp|string|module:workbox-routing.Route~matchCallback|module:workbox-routing.Route} capture - * If the capture param is a `Route`, all other arguments will be ignored. - * @param {module:workbox-routing~handlerCallback} [handler] A callback - * function that returns a Promise resulting in a Response. This parameter - * is required if `capture` is not a `Route` object. - * @param {string} [method='GET'] The HTTP method to match the Route - * against. - * @return {module:workbox-routing.Route} The generated `Route`(Useful for - * unregistering). - * - * @memberof module:workbox-routing - */ - - function registerRoute(capture, handler, method) { - let route; - - if (typeof capture === 'string') { - const captureUrl = new URL(capture, location.href); - - { - if (!(capture.startsWith('/') || capture.startsWith('http'))) { - throw new WorkboxError('invalid-string', { - moduleName: 'workbox-routing', - funcName: 'registerRoute', - paramName: 'capture' - }); - } // We want to check if Express-style wildcards are in the pathname only. - // TODO: Remove this log message in v4. - - - const valueToCheck = capture.startsWith('http') ? captureUrl.pathname : capture; // See https://github.com/pillarjs/path-to-regexp#parameters - - const wildcards = '[*:?+]'; - - if (new RegExp(`${wildcards}`).exec(valueToCheck)) { - logger.debug(`The '$capture' parameter contains an Express-style wildcard ` + `character (${wildcards}). Strings are now always interpreted as ` + `exact matches; use a RegExp for partial or wildcard matches.`); - } - } - - const matchCallback = ({ - url - }) => { - { - if (url.pathname === captureUrl.pathname && url.origin !== captureUrl.origin) { - logger.debug(`${capture} only partially matches the cross-origin URL ` + `${url.toString()}. This route will only handle cross-origin requests ` + `if they match the entire URL.`); - } - } - - return url.href === captureUrl.href; - }; // If `capture` is a string then `handler` and `method` must be present. - - - route = new Route(matchCallback, handler, method); - } else if (capture instanceof RegExp) { - // If `capture` is a `RegExp` then `handler` and `method` must be present. - route = new RegExpRoute(capture, handler, method); - } else if (typeof capture === 'function') { - // If `capture` is a function then `handler` and `method` must be present. - route = new Route(capture, handler, method); - } else if (capture instanceof Route) { - route = capture; - } else { - throw new WorkboxError('unsupported-route-type', { - moduleName: 'workbox-routing', - funcName: 'registerRoute', - paramName: 'capture' - }); - } - - const defaultRouter = getOrCreateDefaultRouter(); - defaultRouter.registerRoute(route); - return route; - } - - try { - self['workbox:strategies:6.2.4'] && _(); - } catch (e) {} - - /* - Copyright 2018 Google LLC - - Use of this source code is governed by an MIT-style - license that can be found in the LICENSE file or at - https://opensource.org/licenses/MIT. - */ - const cacheOkAndOpaquePlugin = { - /** - * Returns a valid response (to allow caching) if the status is 200 (OK) or - * 0 (opaque). - * - * @param {Object} options - * @param {Response} options.response - * @return {Response|null} - * - * @private - */ - cacheWillUpdate: async ({ - response - }) => { - if (response.status === 200 || response.status === 0) { - return response; - } - - return null; - } - }; - - /* - Copyright 2018 Google LLC - - Use of this source code is governed by an MIT-style - license that can be found in the LICENSE file or at - https://opensource.org/licenses/MIT. - */ - const _cacheNameDetails = { - googleAnalytics: 'googleAnalytics', - precache: 'precache-v2', - prefix: 'workbox', - runtime: 'runtime', - suffix: typeof registration !== 'undefined' ? registration.scope : '' - }; - - const _createCacheName = cacheName => { - return [_cacheNameDetails.prefix, cacheName, _cacheNameDetails.suffix].filter(value => value && value.length > 0).join('-'); - }; - - const eachCacheNameDetail = fn => { - for (const key of Object.keys(_cacheNameDetails)) { - fn(key); - } - }; - - const cacheNames = { - updateDetails: details => { - eachCacheNameDetail(key => { - if (typeof details[key] === 'string') { - _cacheNameDetails[key] = details[key]; - } - }); - }, - getGoogleAnalyticsName: userCacheName => { - return userCacheName || _createCacheName(_cacheNameDetails.googleAnalytics); - }, - getPrecacheName: userCacheName => { - return userCacheName || _createCacheName(_cacheNameDetails.precache); - }, - getPrefix: () => { - return _cacheNameDetails.prefix; - }, - getRuntimeName: userCacheName => { - return userCacheName || _createCacheName(_cacheNameDetails.runtime); - }, - getSuffix: () => { - return _cacheNameDetails.suffix; - } - }; - - /* - Copyright 2020 Google LLC - Use of this source code is governed by an MIT-style - license that can be found in the LICENSE file or at - https://opensource.org/licenses/MIT. - */ - - function stripParams(fullURL, ignoreParams) { - const strippedURL = new URL(fullURL); - - for (const param of ignoreParams) { - strippedURL.searchParams.delete(param); - } - - return strippedURL.href; - } - /** - * Matches an item in the cache, ignoring specific URL params. This is similar - * to the `ignoreSearch` option, but it allows you to ignore just specific - * params (while continuing to match on the others). - * - * @private - * @param {Cache} cache - * @param {Request} request - * @param {Object} matchOptions - * @param {Array} ignoreParams - * @return {Promise} - */ - - - async function cacheMatchIgnoreParams(cache, request, ignoreParams, matchOptions) { - const strippedRequestURL = stripParams(request.url, ignoreParams); // If the request doesn't include any ignored params, match as normal. - - if (request.url === strippedRequestURL) { - return cache.match(request, matchOptions); - } // Otherwise, match by comparing keys - - - const keysOptions = Object.assign(Object.assign({}, matchOptions), { - ignoreSearch: true - }); - const cacheKeys = await cache.keys(request, keysOptions); - - for (const cacheKey of cacheKeys) { - const strippedCacheKeyURL = stripParams(cacheKey.url, ignoreParams); - - if (strippedRequestURL === strippedCacheKeyURL) { - return cache.match(cacheKey, matchOptions); - } - } - - return; - } - - /* - Copyright 2018 Google LLC - - Use of this source code is governed by an MIT-style - license that can be found in the LICENSE file or at - https://opensource.org/licenses/MIT. - */ - /** - * The Deferred class composes Promises in a way that allows for them to be - * resolved or rejected from outside the constructor. In most cases promises - * should be used directly, but Deferreds can be necessary when the logic to - * resolve a promise must be separate. - * - * @private - */ - - class Deferred { - /** - * Creates a promise and exposes its resolve and reject functions as methods. - */ - constructor() { - this.promise = new Promise((resolve, reject) => { - this.resolve = resolve; - this.reject = reject; - }); - } - - } - - /* - Copyright 2018 Google LLC - - Use of this source code is governed by an MIT-style - license that can be found in the LICENSE file or at - https://opensource.org/licenses/MIT. - */ - // Can't change Function type right now. - // eslint-disable-next-line @typescript-eslint/ban-types - - const quotaErrorCallbacks = new Set(); - - /* - Copyright 2018 Google LLC - - Use of this source code is governed by an MIT-style - license that can be found in the LICENSE file or at - https://opensource.org/licenses/MIT. - */ - /** - * Runs all of the callback functions, one at a time sequentially, in the order - * in which they were registered. - * - * @memberof module:workbox-core - * @private - */ - - async function executeQuotaErrorCallbacks() { - { - logger.log(`About to run ${quotaErrorCallbacks.size} ` + `callbacks to clean up caches.`); - } - - for (const callback of quotaErrorCallbacks) { - await callback(); - - { - logger.log(callback, 'is complete.'); - } - } - - { - logger.log('Finished running callbacks.'); - } - } - - /* - Copyright 2019 Google LLC - Use of this source code is governed by an MIT-style - license that can be found in the LICENSE file or at - https://opensource.org/licenses/MIT. - */ - /** - * Returns a promise that resolves and the passed number of milliseconds. - * This utility is an async/await-friendly version of `setTimeout`. - * - * @param {number} ms - * @return {Promise} - * @private - */ - - function timeout(ms) { - return new Promise(resolve => setTimeout(resolve, ms)); - } - - /* - Copyright 2020 Google LLC - - Use of this source code is governed by an MIT-style - license that can be found in the LICENSE file or at - https://opensource.org/licenses/MIT. - */ - - function toRequest(input) { - return typeof input === 'string' ? new Request(input) : input; - } - /** - * A class created every time a Strategy instance instance calls - * [handle()]{@link module:workbox-strategies.Strategy~handle} or - * [handleAll()]{@link module:workbox-strategies.Strategy~handleAll} that wraps all fetch and - * cache actions around plugin callbacks and keeps track of when the strategy - * is "done" (i.e. all added `event.waitUntil()` promises have resolved). - * - * @memberof module:workbox-strategies - */ - - - class StrategyHandler { - /** - * Creates a new instance associated with the passed strategy and event - * that's handling the request. - * - * The constructor also initializes the state that will be passed to each of - * the plugins handling this request. - * - * @param {module:workbox-strategies.Strategy} strategy - * @param {Object} options - * @param {Request|string} options.request A request to run this strategy for. - * @param {ExtendableEvent} options.event The event associated with the - * request. - * @param {URL} [options.url] - * @param {*} [options.params] - * [match callback]{@link module:workbox-routing~matchCallback}, - * (if applicable). - */ - constructor(strategy, options) { - this._cacheKeys = {}; - /** - * The request the strategy is performing (passed to the strategy's - * `handle()` or `handleAll()` method). - * @name request - * @instance - * @type {Request} - * @memberof module:workbox-strategies.StrategyHandler - */ - - /** - * The event associated with this request. - * @name event - * @instance - * @type {ExtendableEvent} - * @memberof module:workbox-strategies.StrategyHandler - */ - - /** - * A `URL` instance of `request.url` (if passed to the strategy's - * `handle()` or `handleAll()` method). - * Note: the `url` param will be present if the strategy was invoked - * from a workbox `Route` object. - * @name url - * @instance - * @type {URL|undefined} - * @memberof module:workbox-strategies.StrategyHandler - */ - - /** - * A `param` value (if passed to the strategy's - * `handle()` or `handleAll()` method). - * Note: the `param` param will be present if the strategy was invoked - * from a workbox `Route` object and the - * [match callback]{@link module:workbox-routing~matchCallback} returned - * a truthy value (it will be that value). - * @name params - * @instance - * @type {*|undefined} - * @memberof module:workbox-strategies.StrategyHandler - */ - - { - finalAssertExports.isInstance(options.event, ExtendableEvent, { - moduleName: 'workbox-strategies', - className: 'StrategyHandler', - funcName: 'constructor', - paramName: 'options.event' - }); - } - - Object.assign(this, options); - this.event = options.event; - this._strategy = strategy; - this._handlerDeferred = new Deferred(); - this._extendLifetimePromises = []; // Copy the plugins list (since it's mutable on the strategy), - // so any mutations don't affect this handler instance. - - this._plugins = [...strategy.plugins]; - this._pluginStateMap = new Map(); - - for (const plugin of this._plugins) { - this._pluginStateMap.set(plugin, {}); - } - - this.event.waitUntil(this._handlerDeferred.promise); - } - /** - * Fetches a given request (and invokes any applicable plugin callback - * methods) using the `fetchOptions` (for non-navigation requests) and - * `plugins` defined on the `Strategy` object. - * - * The following plugin lifecycle methods are invoked when using this method: - * - `requestWillFetch()` - * - `fetchDidSucceed()` - * - `fetchDidFail()` - * - * @param {Request|string} input The URL or request to fetch. - * @return {Promise} - */ - - - async fetch(input) { - const { - event - } = this; - let request = toRequest(input); - - if (request.mode === 'navigate' && event instanceof FetchEvent && event.preloadResponse) { - const possiblePreloadResponse = await event.preloadResponse; - - if (possiblePreloadResponse) { - { - logger.log(`Using a preloaded navigation response for ` + `'${getFriendlyURL(request.url)}'`); - } - - return possiblePreloadResponse; - } - } // If there is a fetchDidFail plugin, we need to save a clone of the - // original request before it's either modified by a requestWillFetch - // plugin or before the original request's body is consumed via fetch(). - - - const originalRequest = this.hasCallback('fetchDidFail') ? request.clone() : null; - - try { - for (const cb of this.iterateCallbacks('requestWillFetch')) { - request = await cb({ - request: request.clone(), - event - }); - } - } catch (err) { - if (err instanceof Error) { - throw new WorkboxError('plugin-error-request-will-fetch', { - thrownErrorMessage: err.message - }); - } - } // The request can be altered by plugins with `requestWillFetch` making - // the original request (most likely from a `fetch` event) different - // from the Request we make. Pass both to `fetchDidFail` to aid debugging. - - - const pluginFilteredRequest = request.clone(); - - try { - let fetchResponse; // See https://github.com/GoogleChrome/workbox/issues/1796 - - fetchResponse = await fetch(request, request.mode === 'navigate' ? undefined : this._strategy.fetchOptions); - - if ("development" !== 'production') { - logger.debug(`Network request for ` + `'${getFriendlyURL(request.url)}' returned a response with ` + `status '${fetchResponse.status}'.`); - } - - for (const callback of this.iterateCallbacks('fetchDidSucceed')) { - fetchResponse = await callback({ - event, - request: pluginFilteredRequest, - response: fetchResponse - }); - } - - return fetchResponse; - } catch (error) { - { - logger.log(`Network request for ` + `'${getFriendlyURL(request.url)}' threw an error.`, error); - } // `originalRequest` will only exist if a `fetchDidFail` callback - // is being used (see above). - - - if (originalRequest) { - await this.runCallbacks('fetchDidFail', { - error: error, - event, - originalRequest: originalRequest.clone(), - request: pluginFilteredRequest.clone() - }); - } - - throw error; - } - } - /** - * Calls `this.fetch()` and (in the background) runs `this.cachePut()` on - * the response generated by `this.fetch()`. - * - * The call to `this.cachePut()` automatically invokes `this.waitUntil()`, - * so you do not have to manually call `waitUntil()` on the event. - * - * @param {Request|string} input The request or URL to fetch and cache. - * @return {Promise} - */ - - - async fetchAndCachePut(input) { - const response = await this.fetch(input); - const responseClone = response.clone(); - void this.waitUntil(this.cachePut(input, responseClone)); - return response; - } - /** - * Matches a request from the cache (and invokes any applicable plugin - * callback methods) using the `cacheName`, `matchOptions`, and `plugins` - * defined on the strategy object. - * - * The following plugin lifecycle methods are invoked when using this method: - * - cacheKeyWillByUsed() - * - cachedResponseWillByUsed() - * - * @param {Request|string} key The Request or URL to use as the cache key. - * @return {Promise} A matching response, if found. - */ - - - async cacheMatch(key) { - const request = toRequest(key); - let cachedResponse; - const { - cacheName, - matchOptions - } = this._strategy; - const effectiveRequest = await this.getCacheKey(request, 'read'); - const multiMatchOptions = Object.assign(Object.assign({}, matchOptions), { - cacheName - }); - cachedResponse = await caches.match(effectiveRequest, multiMatchOptions); - - { - if (cachedResponse) { - logger.debug(`Found a cached response in '${cacheName}'.`); - } else { - logger.debug(`No cached response found in '${cacheName}'.`); - } - } - - for (const callback of this.iterateCallbacks('cachedResponseWillBeUsed')) { - cachedResponse = (await callback({ - cacheName, - matchOptions, - cachedResponse, - request: effectiveRequest, - event: this.event - })) || undefined; - } - - return cachedResponse; - } - /** - * Puts a request/response pair in the cache (and invokes any applicable - * plugin callback methods) using the `cacheName` and `plugins` defined on - * the strategy object. - * - * The following plugin lifecycle methods are invoked when using this method: - * - cacheKeyWillByUsed() - * - cacheWillUpdate() - * - cacheDidUpdate() - * - * @param {Request|string} key The request or URL to use as the cache key. - * @param {Response} response The response to cache. - * @return {Promise} `false` if a cacheWillUpdate caused the response - * not be cached, and `true` otherwise. - */ - - - async cachePut(key, response) { - const request = toRequest(key); // Run in the next task to avoid blocking other cache reads. - // https://github.com/w3c/ServiceWorker/issues/1397 - - await timeout(0); - const effectiveRequest = await this.getCacheKey(request, 'write'); - - { - if (effectiveRequest.method && effectiveRequest.method !== 'GET') { - throw new WorkboxError('attempt-to-cache-non-get-request', { - url: getFriendlyURL(effectiveRequest.url), - method: effectiveRequest.method - }); - } // See https://github.com/GoogleChrome/workbox/issues/2818 - - - const vary = response.headers.get('Vary'); - - if (vary) { - logger.debug(`The response for ${getFriendlyURL(effectiveRequest.url)} ` + `has a 'Vary: ${vary}' header. ` + `Consider setting the {ignoreVary: true} option on your strategy ` + `to ensure cache matching and deletion works as expected.`); - } - } - - if (!response) { - { - logger.error(`Cannot cache non-existent response for ` + `'${getFriendlyURL(effectiveRequest.url)}'.`); - } - - throw new WorkboxError('cache-put-with-no-response', { - url: getFriendlyURL(effectiveRequest.url) - }); - } - - const responseToCache = await this._ensureResponseSafeToCache(response); - - if (!responseToCache) { - { - logger.debug(`Response '${getFriendlyURL(effectiveRequest.url)}' ` + `will not be cached.`, responseToCache); - } - - return false; - } - - const { - cacheName, - matchOptions - } = this._strategy; - const cache = await self.caches.open(cacheName); - const hasCacheUpdateCallback = this.hasCallback('cacheDidUpdate'); - const oldResponse = hasCacheUpdateCallback ? await cacheMatchIgnoreParams( // TODO(philipwalton): the `__WB_REVISION__` param is a precaching - // feature. Consider into ways to only add this behavior if using - // precaching. - cache, effectiveRequest.clone(), ['__WB_REVISION__'], matchOptions) : null; - - { - logger.debug(`Updating the '${cacheName}' cache with a new Response ` + `for ${getFriendlyURL(effectiveRequest.url)}.`); - } - - try { - await cache.put(effectiveRequest, hasCacheUpdateCallback ? responseToCache.clone() : responseToCache); - } catch (error) { - if (error instanceof Error) { - // See https://developer.mozilla.org/en-US/docs/Web/API/DOMException#exception-QuotaExceededError - if (error.name === 'QuotaExceededError') { - await executeQuotaErrorCallbacks(); - } - - throw error; - } - } - - for (const callback of this.iterateCallbacks('cacheDidUpdate')) { - await callback({ - cacheName, - oldResponse, - newResponse: responseToCache.clone(), - request: effectiveRequest, - event: this.event - }); - } - - return true; - } - /** - * Checks the list of plugins for the `cacheKeyWillBeUsed` callback, and - * executes any of those callbacks found in sequence. The final `Request` - * object returned by the last plugin is treated as the cache key for cache - * reads and/or writes. If no `cacheKeyWillBeUsed` plugin callbacks have - * been registered, the passed request is returned unmodified - * - * @param {Request} request - * @param {string} mode - * @return {Promise} - */ - - - async getCacheKey(request, mode) { - if (!this._cacheKeys[mode]) { - let effectiveRequest = request; - - for (const callback of this.iterateCallbacks('cacheKeyWillBeUsed')) { - effectiveRequest = toRequest(await callback({ - mode, - request: effectiveRequest, - event: this.event, - // params has a type any can't change right now. - params: this.params - })); - } - - this._cacheKeys[mode] = effectiveRequest; - } - - return this._cacheKeys[mode]; - } - /** - * Returns true if the strategy has at least one plugin with the given - * callback. - * - * @param {string} name The name of the callback to check for. - * @return {boolean} - */ - - - hasCallback(name) { - for (const plugin of this._strategy.plugins) { - if (name in plugin) { - return true; - } - } - - return false; - } - /** - * Runs all plugin callbacks matching the given name, in order, passing the - * given param object (merged ith the current plugin state) as the only - * argument. - * - * Note: since this method runs all plugins, it's not suitable for cases - * where the return value of a callback needs to be applied prior to calling - * the next callback. See - * [`iterateCallbacks()`]{@link module:workbox-strategies.StrategyHandler#iterateCallbacks} - * below for how to handle that case. - * - * @param {string} name The name of the callback to run within each plugin. - * @param {Object} param The object to pass as the first (and only) param - * when executing each callback. This object will be merged with the - * current plugin state prior to callback execution. - */ - - - async runCallbacks(name, param) { - for (const callback of this.iterateCallbacks(name)) { - // TODO(philipwalton): not sure why `any` is needed. It seems like - // this should work with `as WorkboxPluginCallbackParam[C]`. - await callback(param); - } - } - /** - * Accepts a callback and returns an iterable of matching plugin callbacks, - * where each callback is wrapped with the current handler state (i.e. when - * you call each callback, whatever object parameter you pass it will - * be merged with the plugin's current state). - * - * @param {string} name The name fo the callback to run - * @return {Array} - */ - - - *iterateCallbacks(name) { - for (const plugin of this._strategy.plugins) { - if (typeof plugin[name] === 'function') { - const state = this._pluginStateMap.get(plugin); - - const statefulCallback = param => { - const statefulParam = Object.assign(Object.assign({}, param), { - state - }); // TODO(philipwalton): not sure why `any` is needed. It seems like - // this should work with `as WorkboxPluginCallbackParam[C]`. - - return plugin[name](statefulParam); - }; - - yield statefulCallback; - } - } - } - /** - * Adds a promise to the - * [extend lifetime promises]{@link https://w3c.github.io/ServiceWorker/#extendableevent-extend-lifetime-promises} - * of the event event associated with the request being handled (usually a - * `FetchEvent`). - * - * Note: you can await - * [`doneWaiting()`]{@link module:workbox-strategies.StrategyHandler~doneWaiting} - * to know when all added promises have settled. - * - * @param {Promise} promise A promise to add to the extend lifetime promises - * of the event that triggered the request. - */ - - - waitUntil(promise) { - this._extendLifetimePromises.push(promise); - - return promise; - } - /** - * Returns a promise that resolves once all promises passed to - * [`waitUntil()`]{@link module:workbox-strategies.StrategyHandler~waitUntil} - * have settled. - * - * Note: any work done after `doneWaiting()` settles should be manually - * passed to an event's `waitUntil()` method (not this handler's - * `waitUntil()` method), otherwise the service worker thread my be killed - * prior to your work completing. - */ - - - async doneWaiting() { - let promise; - - while (promise = this._extendLifetimePromises.shift()) { - await promise; - } - } - /** - * Stops running the strategy and immediately resolves any pending - * `waitUntil()` promises. - */ - - - destroy() { - this._handlerDeferred.resolve(null); - } - /** - * This method will call cacheWillUpdate on the available plugins (or use - * status === 200) to determine if the Response is safe and valid to cache. - * - * @param {Request} options.request - * @param {Response} options.response - * @return {Promise} - * - * @private - */ - - - async _ensureResponseSafeToCache(response) { - let responseToCache = response; - let pluginsUsed = false; - - for (const callback of this.iterateCallbacks('cacheWillUpdate')) { - responseToCache = (await callback({ - request: this.request, - response: responseToCache, - event: this.event - })) || undefined; - pluginsUsed = true; - - if (!responseToCache) { - break; - } - } - - if (!pluginsUsed) { - if (responseToCache && responseToCache.status !== 200) { - responseToCache = undefined; - } - - { - if (responseToCache) { - if (responseToCache.status !== 200) { - if (responseToCache.status === 0) { - logger.warn(`The response for '${this.request.url}' ` + `is an opaque response. The caching strategy that you're ` + `using will not cache opaque responses by default.`); - } else { - logger.debug(`The response for '${this.request.url}' ` + `returned a status code of '${response.status}' and won't ` + `be cached as a result.`); - } - } - } - } - } - - return responseToCache; - } - - } - - /* - Copyright 2020 Google LLC - - Use of this source code is governed by an MIT-style - license that can be found in the LICENSE file or at - https://opensource.org/licenses/MIT. - */ - /** - * An abstract base class that all other strategy classes must extend from: - * - * @memberof module:workbox-strategies - */ - - class Strategy { - /** - * Creates a new instance of the strategy and sets all documented option - * properties as public instance properties. - * - * Note: if a custom strategy class extends the base Strategy class and does - * not need more than these properties, it does not need to define its own - * constructor. - * - * @param {Object} [options] - * @param {string} [options.cacheName] Cache name to store and retrieve - * requests. Defaults to the cache names provided by - * [workbox-core]{@link module:workbox-core.cacheNames}. - * @param {Array} [options.plugins] [Plugins]{@link https://developers.google.com/web/tools/workbox/guides/using-plugins} - * to use in conjunction with this caching strategy. - * @param {Object} [options.fetchOptions] Values passed along to the - * [`init`](https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/fetch#Parameters) - * of [non-navigation](https://github.com/GoogleChrome/workbox/issues/1796) - * `fetch()` requests made by this strategy. - * @param {Object} [options.matchOptions] The - * [`CacheQueryOptions`]{@link https://w3c.github.io/ServiceWorker/#dictdef-cachequeryoptions} - * for any `cache.match()` or `cache.put()` calls made by this strategy. - */ - constructor(options = {}) { - /** - * Cache name to store and retrieve - * requests. Defaults to the cache names provided by - * [workbox-core]{@link module:workbox-core.cacheNames}. - * - * @type {string} - */ - this.cacheName = cacheNames.getRuntimeName(options.cacheName); - /** - * The list - * [Plugins]{@link https://developers.google.com/web/tools/workbox/guides/using-plugins} - * used by this strategy. - * - * @type {Array} - */ - - this.plugins = options.plugins || []; - /** - * Values passed along to the - * [`init`]{@link https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/fetch#Parameters} - * of all fetch() requests made by this strategy. - * - * @type {Object} - */ - - this.fetchOptions = options.fetchOptions; - /** - * The - * [`CacheQueryOptions`]{@link https://w3c.github.io/ServiceWorker/#dictdef-cachequeryoptions} - * for any `cache.match()` or `cache.put()` calls made by this strategy. - * - * @type {Object} - */ - - this.matchOptions = options.matchOptions; - } - /** - * Perform a request strategy and returns a `Promise` that will resolve with - * a `Response`, invoking all relevant plugin callbacks. - * - * When a strategy instance is registered with a Workbox - * [route]{@link module:workbox-routing.Route}, this method is automatically - * called when the route matches. - * - * Alternatively, this method can be used in a standalone `FetchEvent` - * listener by passing it to `event.respondWith()`. - * - * @param {FetchEvent|Object} options A `FetchEvent` or an object with the - * properties listed below. - * @param {Request|string} options.request A request to run this strategy for. - * @param {ExtendableEvent} options.event The event associated with the - * request. - * @param {URL} [options.url] - * @param {*} [options.params] - */ - - - handle(options) { - const [responseDone] = this.handleAll(options); - return responseDone; - } - /** - * Similar to [`handle()`]{@link module:workbox-strategies.Strategy~handle}, but - * instead of just returning a `Promise` that resolves to a `Response` it - * it will return an tuple of [response, done] promises, where the former - * (`response`) is equivalent to what `handle()` returns, and the latter is a - * Promise that will resolve once any promises that were added to - * `event.waitUntil()` as part of performing the strategy have completed. - * - * You can await the `done` promise to ensure any extra work performed by - * the strategy (usually caching responses) completes successfully. - * - * @param {FetchEvent|Object} options A `FetchEvent` or an object with the - * properties listed below. - * @param {Request|string} options.request A request to run this strategy for. - * @param {ExtendableEvent} options.event The event associated with the - * request. - * @param {URL} [options.url] - * @param {*} [options.params] - * @return {Array} A tuple of [response, done] - * promises that can be used to determine when the response resolves as - * well as when the handler has completed all its work. - */ - - - handleAll(options) { - // Allow for flexible options to be passed. - if (options instanceof FetchEvent) { - options = { - event: options, - request: options.request - }; - } - - const event = options.event; - const request = typeof options.request === 'string' ? new Request(options.request) : options.request; - const params = 'params' in options ? options.params : undefined; - const handler = new StrategyHandler(this, { - event, - request, - params - }); - - const responseDone = this._getResponse(handler, request, event); - - const handlerDone = this._awaitComplete(responseDone, handler, request, event); // Return an array of promises, suitable for use with Promise.all(). - - - return [responseDone, handlerDone]; - } - - async _getResponse(handler, request, event) { - await handler.runCallbacks('handlerWillStart', { - event, - request - }); - let response = undefined; - - try { - response = await this._handle(request, handler); // The "official" Strategy subclasses all throw this error automatically, - // but in case a third-party Strategy doesn't, ensure that we have a - // consistent failure when there's no response or an error response. - - if (!response || response.type === 'error') { - throw new WorkboxError('no-response', { - url: request.url - }); - } - } catch (error) { - if (error instanceof Error) { - for (const callback of handler.iterateCallbacks('handlerDidError')) { - response = await callback({ - error, - event, - request - }); - - if (response) { - break; - } - } - } - - if (!response) { - throw error; - } else { - logger.log(`While responding to '${getFriendlyURL(request.url)}', ` + `an ${error instanceof Error ? error.toString() : ''} error occurred. Using a fallback response provided by ` + `a handlerDidError plugin.`); - } - } - - for (const callback of handler.iterateCallbacks('handlerWillRespond')) { - response = await callback({ - event, - request, - response - }); - } - - return response; - } - - async _awaitComplete(responseDone, handler, request, event) { - let response; - let error; - - try { - response = await responseDone; - } catch (error) {// Ignore errors, as response errors should be caught via the `response` - // promise above. The `done` promise will only throw for errors in - // promises passed to `handler.waitUntil()`. - } - - try { - await handler.runCallbacks('handlerDidRespond', { - event, - request, - response - }); - await handler.doneWaiting(); - } catch (waitUntilError) { - if (waitUntilError instanceof Error) { - error = waitUntilError; - } - } - - await handler.runCallbacks('handlerDidComplete', { - event, - request, - response, - error: error - }); - handler.destroy(); - - if (error) { - throw error; - } - } - - } - /** - * Classes extending the `Strategy` based class should implement this method, - * and leverage the [`handler`]{@link module:workbox-strategies.StrategyHandler} - * arg to perform all fetching and cache logic, which will ensure all relevant - * cache, cache options, fetch options and plugins are used (per the current - * strategy instance). - * - * @name _handle - * @instance - * @abstract - * @function - * @param {Request} request - * @param {module:workbox-strategies.StrategyHandler} handler - * @return {Promise} - * - * @memberof module:workbox-strategies.Strategy - */ - - /* - Copyright 2018 Google LLC - - Use of this source code is governed by an MIT-style - license that can be found in the LICENSE file or at - https://opensource.org/licenses/MIT. - */ - const messages = { - strategyStart: (strategyName, request) => `Using ${strategyName} to respond to '${getFriendlyURL(request.url)}'`, - printFinalResponse: response => { - if (response) { - logger.groupCollapsed(`View the final response here.`); - logger.log(response || '[No response returned]'); - logger.groupEnd(); - } - } - }; - - /* - Copyright 2018 Google LLC - - Use of this source code is governed by an MIT-style - license that can be found in the LICENSE file or at - https://opensource.org/licenses/MIT. - */ - /** - * An implementation of a - * [network first]{@link https://developers.google.com/web/fundamentals/instant-and-offline/offline-cookbook/#network-falling-back-to-cache} - * request strategy. - * - * By default, this strategy will cache responses with a 200 status code as - * well as [opaque responses]{@link https://developers.google.com/web/tools/workbox/guides/handle-third-party-requests}. - * Opaque responses are are cross-origin requests where the response doesn't - * support [CORS]{@link https://enable-cors.org/}. - * - * If the network request fails, and there is no cache match, this will throw - * a `WorkboxError` exception. - * - * @extends module:workbox-strategies.Strategy - * @memberof module:workbox-strategies - */ - - class NetworkFirst extends Strategy { - /** - * @param {Object} [options] - * @param {string} [options.cacheName] Cache name to store and retrieve - * requests. Defaults to cache names provided by - * [workbox-core]{@link module:workbox-core.cacheNames}. - * @param {Array} [options.plugins] [Plugins]{@link https://developers.google.com/web/tools/workbox/guides/using-plugins} - * to use in conjunction with this caching strategy. - * @param {Object} [options.fetchOptions] Values passed along to the - * [`init`](https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/fetch#Parameters) - * of [non-navigation](https://github.com/GoogleChrome/workbox/issues/1796) - * `fetch()` requests made by this strategy. - * @param {Object} [options.matchOptions] [`CacheQueryOptions`](https://w3c.github.io/ServiceWorker/#dictdef-cachequeryoptions) - * @param {number} [options.networkTimeoutSeconds] If set, any network requests - * that fail to respond within the timeout will fallback to the cache. - * - * This option can be used to combat - * "[lie-fi]{@link https://developers.google.com/web/fundamentals/performance/poor-connectivity/#lie-fi}" - * scenarios. - */ - constructor(options = {}) { - super(options); // If this instance contains no plugins with a 'cacheWillUpdate' callback, - // prepend the `cacheOkAndOpaquePlugin` plugin to the plugins list. - - if (!this.plugins.some(p => 'cacheWillUpdate' in p)) { - this.plugins.unshift(cacheOkAndOpaquePlugin); - } - - this._networkTimeoutSeconds = options.networkTimeoutSeconds || 0; - - { - if (this._networkTimeoutSeconds) { - finalAssertExports.isType(this._networkTimeoutSeconds, 'number', { - moduleName: 'workbox-strategies', - className: this.constructor.name, - funcName: 'constructor', - paramName: 'networkTimeoutSeconds' - }); - } - } - } - /** - * @private - * @param {Request|string} request A request to run this strategy for. - * @param {module:workbox-strategies.StrategyHandler} handler The event that - * triggered the request. - * @return {Promise} - */ - - - async _handle(request, handler) { - const logs = []; - - { - finalAssertExports.isInstance(request, Request, { - moduleName: 'workbox-strategies', - className: this.constructor.name, - funcName: 'handle', - paramName: 'makeRequest' - }); - } - - const promises = []; - let timeoutId; - - if (this._networkTimeoutSeconds) { - const { - id, - promise - } = this._getTimeoutPromise({ - request, - logs, - handler - }); - - timeoutId = id; - promises.push(promise); - } - - const networkPromise = this._getNetworkPromise({ - timeoutId, - request, - logs, - handler - }); - - promises.push(networkPromise); - const response = await handler.waitUntil((async () => { - // Promise.race() will resolve as soon as the first promise resolves. - return (await handler.waitUntil(Promise.race(promises))) || ( // If Promise.race() resolved with null, it might be due to a network - // timeout + a cache miss. If that were to happen, we'd rather wait until - // the networkPromise resolves instead of returning null. - // Note that it's fine to await an already-resolved promise, so we don't - // have to check to see if it's still "in flight". - await networkPromise); - })()); - - { - logger.groupCollapsed(messages.strategyStart(this.constructor.name, request)); - - for (const log of logs) { - logger.log(log); - } - - messages.printFinalResponse(response); - logger.groupEnd(); - } - - if (!response) { - throw new WorkboxError('no-response', { - url: request.url - }); - } - - return response; - } - /** - * @param {Object} options - * @param {Request} options.request - * @param {Array} options.logs A reference to the logs array - * @param {Event} options.event - * @return {Promise} - * - * @private - */ - - - _getTimeoutPromise({ - request, - logs, - handler - }) { - let timeoutId; - const timeoutPromise = new Promise(resolve => { - const onNetworkTimeout = async () => { - { - logs.push(`Timing out the network response at ` + `${this._networkTimeoutSeconds} seconds.`); - } - - resolve(await handler.cacheMatch(request)); - }; - - timeoutId = setTimeout(onNetworkTimeout, this._networkTimeoutSeconds * 1000); - }); - return { - promise: timeoutPromise, - id: timeoutId - }; - } - /** - * @param {Object} options - * @param {number|undefined} options.timeoutId - * @param {Request} options.request - * @param {Array} options.logs A reference to the logs Array. - * @param {Event} options.event - * @return {Promise} - * - * @private - */ - - - async _getNetworkPromise({ - timeoutId, - request, - logs, - handler - }) { - let error; - let response; - - try { - response = await handler.fetchAndCachePut(request); - } catch (fetchError) { - if (fetchError instanceof Error) { - error = fetchError; - } - } - - if (timeoutId) { - clearTimeout(timeoutId); - } - - { - if (response) { - logs.push(`Got response from network.`); - } else { - logs.push(`Unable to get a response from the network. Will respond ` + `with a cached response.`); - } - } - - if (error || !response) { - response = await handler.cacheMatch(request); - - { - if (response) { - logs.push(`Found a cached response in the '${this.cacheName}'` + ` cache.`); - } else { - logs.push(`No response found in the '${this.cacheName}' cache.`); - } - } - } - - return response; - } - - } - - /* - Copyright 2018 Google LLC - - Use of this source code is governed by an MIT-style - license that can be found in the LICENSE file or at - https://opensource.org/licenses/MIT. - */ - /** - * An implementation of a - * [network-only]{@link https://developers.google.com/web/fundamentals/instant-and-offline/offline-cookbook/#network-only} - * request strategy. - * - * This class is useful if you want to take advantage of any - * [Workbox plugins]{@link https://developers.google.com/web/tools/workbox/guides/using-plugins}. - * - * If the network request fails, this will throw a `WorkboxError` exception. - * - * @extends module:workbox-strategies.Strategy - * @memberof module:workbox-strategies - */ - - class NetworkOnly extends Strategy { - /** - * @param {Object} [options] - * @param {Array} [options.plugins] [Plugins]{@link https://developers.google.com/web/tools/workbox/guides/using-plugins} - * to use in conjunction with this caching strategy. - * @param {Object} [options.fetchOptions] Values passed along to the - * [`init`](https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/fetch#Parameters) - * of [non-navigation](https://github.com/GoogleChrome/workbox/issues/1796) - * `fetch()` requests made by this strategy. - * @param {number} [options.networkTimeoutSeconds] If set, any network requests - * that fail to respond within the timeout will result in a network error. - */ - constructor(options = {}) { - super(options); - this._networkTimeoutSeconds = options.networkTimeoutSeconds || 0; - } - /** - * @private - * @param {Request|string} request A request to run this strategy for. - * @param {module:workbox-strategies.StrategyHandler} handler The event that - * triggered the request. - * @return {Promise} - */ - - - async _handle(request, handler) { - { - finalAssertExports.isInstance(request, Request, { - moduleName: 'workbox-strategies', - className: this.constructor.name, - funcName: '_handle', - paramName: 'request' - }); - } - - let error = undefined; - let response; - - try { - const promises = [handler.fetch(request)]; - - if (this._networkTimeoutSeconds) { - const timeoutPromise = timeout(this._networkTimeoutSeconds * 1000); - promises.push(timeoutPromise); - } - - response = await Promise.race(promises); - - if (!response) { - throw new Error(`Timed out the network response after ` + `${this._networkTimeoutSeconds} seconds.`); - } - } catch (err) { - if (err instanceof Error) { - error = err; - } - } - - { - logger.groupCollapsed(messages.strategyStart(this.constructor.name, request)); - - if (response) { - logger.log(`Got response from network.`); - } else { - logger.log(`Unable to get a response from the network.`); - } - - messages.printFinalResponse(response); - logger.groupEnd(); - } - - if (!response) { - throw new WorkboxError('no-response', { - url: request.url, - error - }); - } - - return response; - } - - } - - /* - Copyright 2019 Google LLC - - Use of this source code is governed by an MIT-style - license that can be found in the LICENSE file or at - https://opensource.org/licenses/MIT. - */ - /** - * Claim any currently available clients once the service worker - * becomes active. This is normally used in conjunction with `skipWaiting()`. - * - * @memberof module:workbox-core - */ - - function clientsClaim() { - self.addEventListener('activate', () => self.clients.claim()); - } - - exports.NetworkFirst = NetworkFirst; - exports.NetworkOnly = NetworkOnly; - exports.clientsClaim = clientsClaim; - exports.registerRoute = registerRoute; - -})); -//# sourceMappingURL=workbox-1ffba242.js.map diff --git a/src/client/public/workbox-1ffba242.js.map b/src/client/public/workbox-1ffba242.js.map deleted file mode 100644 index d71d566..0000000 --- a/src/client/public/workbox-1ffba242.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"workbox-1ffba242.js","sources":["node_modules/workbox-core/_version.js","node_modules/workbox-core/_private/logger.js","node_modules/workbox-core/models/messages/messages.js","node_modules/workbox-core/models/messages/messageGenerator.js","node_modules/workbox-core/_private/WorkboxError.js","node_modules/workbox-core/_private/assert.js","node_modules/workbox-routing/_version.js","node_modules/workbox-routing/utils/constants.js","node_modules/workbox-routing/utils/normalizeHandler.js","node_modules/workbox-routing/Route.js","node_modules/workbox-routing/RegExpRoute.js","node_modules/workbox-core/_private/getFriendlyURL.js","node_modules/workbox-routing/Router.js","node_modules/workbox-routing/utils/getOrCreateDefaultRouter.js","node_modules/workbox-routing/registerRoute.js","node_modules/workbox-strategies/_version.js","node_modules/workbox-strategies/plugins/cacheOkAndOpaquePlugin.js","node_modules/workbox-core/_private/cacheNames.js","node_modules/workbox-core/_private/cacheMatchIgnoreParams.js","node_modules/workbox-core/_private/Deferred.js","node_modules/workbox-core/models/quotaErrorCallbacks.js","node_modules/workbox-core/_private/executeQuotaErrorCallbacks.js","node_modules/workbox-core/_private/timeout.js","node_modules/workbox-strategies/StrategyHandler.js","node_modules/workbox-strategies/Strategy.js","node_modules/workbox-strategies/utils/messages.js","node_modules/workbox-strategies/NetworkFirst.js","node_modules/workbox-strategies/NetworkOnly.js","node_modules/workbox-core/clientsClaim.js"],"sourcesContent":["\"use strict\";\n// @ts-ignore\ntry {\n self['workbox:core:6.2.4'] && _();\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 // eslint-disable-next-line @typescript-eslint/ban-types\n const api = {};\n const loggerMethods = Object.keys(methodToColorMap);\n for (const key of loggerMethods) {\n const method = key;\n api[method] = (...args) => {\n print(method, args);\n };\n }\n return api;\n})());\nexport { logger };\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\nimport '../../_version.js';\nexport const messages = {\n 'invalid-value': ({ paramName, validValueDescription, value }) => {\n if (!paramName || !validValueDescription) {\n throw new Error(`Unexpected input to 'invalid-value' error.`);\n }\n return `The '${paramName}' parameter was given a value with an ` +\n `unexpected value. ${validValueDescription} Received a value of ` +\n `${JSON.stringify(value)}.`;\n },\n 'not-an-array': ({ moduleName, className, funcName, paramName }) => {\n if (!moduleName || !className || !funcName || !paramName) {\n throw new Error(`Unexpected input to 'not-an-array' error.`);\n }\n return `The parameter '${paramName}' passed into ` +\n `'${moduleName}.${className}.${funcName}()' must be an array.`;\n },\n 'incorrect-type': ({ expectedType, paramName, moduleName, className, funcName }) => {\n if (!expectedType || !paramName || !moduleName || !funcName) {\n throw new Error(`Unexpected input to 'incorrect-type' error.`);\n }\n const classNameStr = className ? `${className}.` : '';\n return `The parameter '${paramName}' passed into ` +\n `'${moduleName}.${classNameStr}` +\n `${funcName}()' must be of type ${expectedType}.`;\n },\n 'incorrect-class': ({ expectedClassName, paramName, moduleName, className, funcName, isReturnValueProblem }) => {\n if (!expectedClassName || !moduleName || !funcName) {\n throw new Error(`Unexpected input to 'incorrect-class' error.`);\n }\n const classNameStr = className ? `${className}.` : '';\n if (isReturnValueProblem) {\n return `The return value from ` +\n `'${moduleName}.${classNameStr}${funcName}()' ` +\n `must be an instance of class ${expectedClassName}.`;\n }\n return `The parameter '${paramName}' passed into ` +\n `'${moduleName}.${classNameStr}${funcName}()' ` +\n `must be an instance of class ${expectedClassName}.`;\n },\n 'missing-a-method': ({ expectedMethod, paramName, moduleName, className, funcName }) => {\n if (!expectedMethod || !paramName || !moduleName || !className\n || !funcName) {\n throw new Error(`Unexpected input to 'missing-a-method' error.`);\n }\n return `${moduleName}.${className}.${funcName}() expected the ` +\n `'${paramName}' parameter to expose a '${expectedMethod}' method.`;\n },\n 'add-to-cache-list-unexpected-type': ({ entry }) => {\n return `An unexpected entry was passed to ` +\n `'workbox-precaching.PrecacheController.addToCacheList()' The entry ` +\n `'${JSON.stringify(entry)}' isn't supported. You must supply an array of ` +\n `strings with one or more characters, objects with a url property or ` +\n `Request objects.`;\n },\n 'add-to-cache-list-conflicting-entries': ({ firstEntry, secondEntry }) => {\n if (!firstEntry || !secondEntry) {\n throw new Error(`Unexpected input to ` +\n `'add-to-cache-list-duplicate-entries' error.`);\n }\n return `Two of the entries passed to ` +\n `'workbox-precaching.PrecacheController.addToCacheList()' had the URL ` +\n `${firstEntry} but different revision details. Workbox is ` +\n `unable to cache and version the asset correctly. Please remove one ` +\n `of the entries.`;\n },\n 'plugin-error-request-will-fetch': ({ thrownErrorMessage }) => {\n if (!thrownErrorMessage) {\n throw new Error(`Unexpected input to ` +\n `'plugin-error-request-will-fetch', error.`);\n }\n return `An error was thrown by a plugins 'requestWillFetch()' method. ` +\n `The thrown error message was: '${thrownErrorMessage}'.`;\n },\n 'invalid-cache-name': ({ cacheNameId, value }) => {\n if (!cacheNameId) {\n throw new Error(`Expected a 'cacheNameId' for error 'invalid-cache-name'`);\n }\n return `You must provide a name containing at least one character for ` +\n `setCacheDetails({${cacheNameId}: '...'}). Received a value of ` +\n `'${JSON.stringify(value)}'`;\n },\n 'unregister-route-but-not-found-with-method': ({ method }) => {\n if (!method) {\n throw new Error(`Unexpected input to ` +\n `'unregister-route-but-not-found-with-method' error.`);\n }\n return `The route you're trying to unregister was not previously ` +\n `registered for the method type '${method}'.`;\n },\n 'unregister-route-route-not-registered': () => {\n return `The route you're trying to unregister was not previously ` +\n `registered.`;\n },\n 'queue-replay-failed': ({ name }) => {\n return `Replaying the background sync queue '${name}' failed.`;\n },\n 'duplicate-queue-name': ({ name }) => {\n return `The Queue name '${name}' is already being used. ` +\n `All instances of backgroundSync.Queue must be given unique names.`;\n },\n 'expired-test-without-max-age': ({ methodName, paramName }) => {\n return `The '${methodName}()' method can only be used when the ` +\n `'${paramName}' is used in the constructor.`;\n },\n 'unsupported-route-type': ({ moduleName, className, funcName, paramName }) => {\n return `The supplied '${paramName}' parameter was an unsupported type. ` +\n `Please check the docs for ${moduleName}.${className}.${funcName} for ` +\n `valid input types.`;\n },\n 'not-array-of-class': ({ value, expectedClass, moduleName, className, funcName, paramName }) => {\n return `The supplied '${paramName}' parameter must be an array of ` +\n `'${expectedClass}' objects. Received '${JSON.stringify(value)},'. ` +\n `Please check the call to ${moduleName}.${className}.${funcName}() ` +\n `to fix the issue.`;\n },\n 'max-entries-or-age-required': ({ moduleName, className, funcName }) => {\n return `You must define either config.maxEntries or config.maxAgeSeconds` +\n `in ${moduleName}.${className}.${funcName}`;\n },\n 'statuses-or-headers-required': ({ moduleName, className, funcName }) => {\n return `You must define either config.statuses or config.headers` +\n `in ${moduleName}.${className}.${funcName}`;\n },\n 'invalid-string': ({ moduleName, funcName, paramName }) => {\n if (!paramName || !moduleName || !funcName) {\n throw new Error(`Unexpected input to 'invalid-string' error.`);\n }\n return `When using strings, the '${paramName}' parameter must start with ` +\n `'http' (for cross-origin matches) or '/' (for same-origin matches). ` +\n `Please see the docs for ${moduleName}.${funcName}() for ` +\n `more info.`;\n },\n 'channel-name-required': () => {\n return `You must provide a channelName to construct a ` +\n `BroadcastCacheUpdate instance.`;\n },\n 'invalid-responses-are-same-args': () => {\n return `The arguments passed into responsesAreSame() appear to be ` +\n `invalid. Please ensure valid Responses are used.`;\n },\n 'expire-custom-caches-only': () => {\n return `You must provide a 'cacheName' property when using the ` +\n `expiration plugin with a runtime caching strategy.`;\n },\n 'unit-must-be-bytes': ({ normalizedRangeHeader }) => {\n if (!normalizedRangeHeader) {\n throw new Error(`Unexpected input to 'unit-must-be-bytes' error.`);\n }\n return `The 'unit' portion of the Range header must be set to 'bytes'. ` +\n `The Range header provided was \"${normalizedRangeHeader}\"`;\n },\n 'single-range-only': ({ normalizedRangeHeader }) => {\n if (!normalizedRangeHeader) {\n throw new Error(`Unexpected input to 'single-range-only' error.`);\n }\n return `Multiple ranges are not supported. Please use a single start ` +\n `value, and optional end value. The Range header provided was ` +\n `\"${normalizedRangeHeader}\"`;\n },\n 'invalid-range-values': ({ normalizedRangeHeader }) => {\n if (!normalizedRangeHeader) {\n throw new Error(`Unexpected input to 'invalid-range-values' error.`);\n }\n return `The Range header is missing both start and end values. At least ` +\n `one of those values is needed. The Range header provided was ` +\n `\"${normalizedRangeHeader}\"`;\n },\n 'no-range-header': () => {\n return `No Range header was found in the Request provided.`;\n },\n 'range-not-satisfiable': ({ size, start, end }) => {\n return `The start (${start}) and end (${end}) values in the Range are ` +\n `not satisfiable by the cached response, which is ${size} bytes.`;\n },\n 'attempt-to-cache-non-get-request': ({ url, method }) => {\n return `Unable to cache '${url}' because it is a '${method}' request and ` +\n `only 'GET' requests can be cached.`;\n },\n 'cache-put-with-no-response': ({ url }) => {\n return `There was an attempt to cache '${url}' but the response was not ` +\n `defined.`;\n },\n 'no-response': ({ url, error }) => {\n let message = `The strategy could not generate a response for '${url}'.`;\n if (error) {\n message += ` The underlying error is ${error}.`;\n }\n return message;\n },\n 'bad-precaching-response': ({ url, status }) => {\n return `The precaching request for '${url}' failed` +\n (status ? ` with an HTTP status of ${status}.` : `.`);\n },\n 'non-precached-url': ({ url }) => {\n return `createHandlerBoundToURL('${url}') was called, but that URL is ` +\n `not precached. Please pass in a URL that is precached instead.`;\n },\n 'add-to-cache-list-conflicting-integrities': ({ url }) => {\n return `Two of the entries passed to ` +\n `'workbox-precaching.PrecacheController.addToCacheList()' had the URL ` +\n `${url} with different integrity values. Please remove one of them.`;\n },\n 'missing-precache-entry': ({ cacheName, url }) => {\n return `Unable to find a precached response in ${cacheName} for ${url}.`;\n },\n 'cross-origin-copy-response': ({ origin }) => {\n return `workbox-core.copyResponse() can only be used with same-origin ` +\n `responses. It was passed a response with origin ${origin}.`;\n },\n};\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\nimport { messages } from './messages.js';\nimport '../../_version.js';\nconst fallback = (code, ...args) => {\n let msg = code;\n if (args.length > 0) {\n msg += ` :: ${JSON.stringify(args)}`;\n }\n return msg;\n};\nconst generatorFunction = (code, details = {}) => {\n const message = messages[code];\n if (!message) {\n throw new Error(`Unable to find message for code '${code}'.`);\n }\n return message(details);\n};\nexport const messageGenerator = (process.env.NODE_ENV === 'production') ?\n fallback : generatorFunction;\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\nimport { messageGenerator } from '../models/messages/messageGenerator.js';\nimport '../_version.js';\n/**\n * Workbox errors should be thrown with this class.\n * This allows use to ensure the type easily in tests,\n * helps developers identify errors from workbox\n * easily and allows use to optimise error\n * messages correctly.\n *\n * @private\n */\nclass WorkboxError extends Error {\n /**\n *\n * @param {string} errorCode The error code that\n * identifies this particular error.\n * @param {Object=} details Any relevant arguments\n * that will help developers identify issues should\n * be added as a key on the context object.\n */\n constructor(errorCode, details) {\n const message = messageGenerator(errorCode, details);\n super(message);\n this.name = errorCode;\n this.details = details;\n }\n}\nexport { WorkboxError };\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\nimport { WorkboxError } from '../_private/WorkboxError.js';\nimport '../_version.js';\n/*\n * This method throws if the supplied value is not an array.\n * The destructed values are required to produce a meaningful error for users.\n * The destructed and restructured object is so it's clear what is\n * needed.\n */\nconst isArray = (value, details) => {\n if (!Array.isArray(value)) {\n throw new WorkboxError('not-an-array', details);\n }\n};\nconst hasMethod = (object, expectedMethod, details) => {\n const type = typeof object[expectedMethod];\n if (type !== 'function') {\n details['expectedMethod'] = expectedMethod;\n throw new WorkboxError('missing-a-method', details);\n }\n};\nconst isType = (object, expectedType, details) => {\n if (typeof object !== expectedType) {\n details['expectedType'] = expectedType;\n throw new WorkboxError('incorrect-type', details);\n }\n};\nconst isInstance = (object, \n// Need the general type to do the check later.\n// eslint-disable-next-line @typescript-eslint/ban-types\nexpectedClass, details) => {\n if (!(object instanceof expectedClass)) {\n details['expectedClassName'] = expectedClass.name;\n throw new WorkboxError('incorrect-class', details);\n }\n};\nconst isOneOf = (value, validValues, details) => {\n if (!validValues.includes(value)) {\n details['validValueDescription'] =\n `Valid values are ${JSON.stringify(validValues)}.`;\n throw new WorkboxError('invalid-value', details);\n }\n};\nconst isArrayOfClass = (value, \n// Need general type to do check later.\nexpectedClass, // eslint-disable-line\ndetails) => {\n const error = new WorkboxError('not-array-of-class', details);\n if (!Array.isArray(value)) {\n throw error;\n }\n for (const item of value) {\n if (!(item instanceof expectedClass)) {\n throw error;\n }\n }\n};\nconst finalAssertExports = process.env.NODE_ENV === 'production' ? null : {\n hasMethod,\n isArray,\n isInstance,\n isOneOf,\n isType,\n isArrayOfClass,\n};\nexport { finalAssertExports as assert };\n","\"use strict\";\n// @ts-ignore\ntry {\n self['workbox:routing:6.2.4'] && _();\n}\ncatch (e) { }\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\nimport '../_version.js';\n/**\n * The default HTTP method, 'GET', used when there's no specific method\n * configured for a route.\n *\n * @type {string}\n *\n * @private\n */\nexport const defaultMethod = 'GET';\n/**\n * The list of valid HTTP methods associated with requests that could be routed.\n *\n * @type {Array}\n *\n * @private\n */\nexport const validMethods = [\n 'DELETE',\n 'GET',\n 'HEAD',\n 'PATCH',\n 'POST',\n 'PUT',\n];\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\nimport { assert } from 'workbox-core/_private/assert.js';\nimport '../_version.js';\n/**\n * @param {function()|Object} handler Either a function, or an object with a\n * 'handle' method.\n * @return {Object} An object with a handle method.\n *\n * @private\n */\nexport const normalizeHandler = (handler) => {\n if (handler && typeof handler === 'object') {\n if (process.env.NODE_ENV !== 'production') {\n assert.hasMethod(handler, 'handle', {\n moduleName: 'workbox-routing',\n className: 'Route',\n funcName: 'constructor',\n paramName: 'handler',\n });\n }\n return handler;\n }\n else {\n if (process.env.NODE_ENV !== 'production') {\n assert.isType(handler, 'function', {\n moduleName: 'workbox-routing',\n className: 'Route',\n funcName: 'constructor',\n paramName: 'handler',\n });\n }\n return { handle: handler };\n }\n};\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\nimport { assert } from 'workbox-core/_private/assert.js';\nimport { defaultMethod, validMethods } from './utils/constants.js';\nimport { normalizeHandler } from './utils/normalizeHandler.js';\nimport './_version.js';\n/**\n * A `Route` consists of a pair of callback functions, \"match\" and \"handler\".\n * The \"match\" callback determine if a route should be used to \"handle\" a\n * request by returning a non-falsy value if it can. The \"handler\" callback\n * is called when there is a match and should return a Promise that resolves\n * to a `Response`.\n *\n * @memberof module:workbox-routing\n */\nclass Route {\n /**\n * Constructor for Route class.\n *\n * @param {module:workbox-routing~matchCallback} match\n * A callback function that determines whether the route matches a given\n * `fetch` event by returning a non-falsy value.\n * @param {module:workbox-routing~handlerCallback} handler A callback\n * function that returns a Promise resolving to a Response.\n * @param {string} [method='GET'] The HTTP method to match the Route\n * against.\n */\n constructor(match, handler, method = defaultMethod) {\n if (process.env.NODE_ENV !== 'production') {\n assert.isType(match, 'function', {\n moduleName: 'workbox-routing',\n className: 'Route',\n funcName: 'constructor',\n paramName: 'match',\n });\n if (method) {\n assert.isOneOf(method, validMethods, { paramName: 'method' });\n }\n }\n // These values are referenced directly by Router so cannot be\n // altered by minificaton.\n this.handler = normalizeHandler(handler);\n this.match = match;\n this.method = method;\n }\n /**\n *\n * @param {module:workbox-routing-handlerCallback} handler A callback\n * function that returns a Promise resolving to a Response\n */\n setCatchHandler(handler) {\n this.catchHandler = normalizeHandler(handler);\n }\n}\nexport { Route };\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\nimport { assert } from 'workbox-core/_private/assert.js';\nimport { logger } from 'workbox-core/_private/logger.js';\nimport { Route } from './Route.js';\nimport './_version.js';\n/**\n * RegExpRoute makes it easy to create a regular expression based\n * [Route]{@link module:workbox-routing.Route}.\n *\n * For same-origin requests the RegExp only needs to match part of the URL. For\n * requests against third-party servers, you must define a RegExp that matches\n * the start of the URL.\n *\n * [See the module docs for info.]{@link https://developers.google.com/web/tools/workbox/modules/workbox-routing}\n *\n * @memberof module:workbox-routing\n * @extends module:workbox-routing.Route\n */\nclass RegExpRoute extends Route {\n /**\n * If the regular expression contains\n * [capture groups]{@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp#grouping-back-references},\n * the captured values will be passed to the\n * [handler's]{@link module:workbox-routing~handlerCallback} `params`\n * argument.\n *\n * @param {RegExp} regExp The regular expression to match against URLs.\n * @param {module:workbox-routing~handlerCallback} handler A callback\n * function that returns a Promise resulting in a Response.\n * @param {string} [method='GET'] The HTTP method to match the Route\n * against.\n */\n constructor(regExp, handler, method) {\n if (process.env.NODE_ENV !== 'production') {\n assert.isInstance(regExp, RegExp, {\n moduleName: 'workbox-routing',\n className: 'RegExpRoute',\n funcName: 'constructor',\n paramName: 'pattern',\n });\n }\n const match = ({ url }) => {\n const result = regExp.exec(url.href);\n // Return immediately if there's no match.\n if (!result) {\n return;\n }\n // Require that the match start at the first character in the URL string\n // if it's a cross-origin request.\n // See https://github.com/GoogleChrome/workbox/issues/281 for the context\n // behind this behavior.\n if ((url.origin !== location.origin) && (result.index !== 0)) {\n if (process.env.NODE_ENV !== 'production') {\n logger.debug(`The regular expression '${regExp.toString()}' only partially matched ` +\n `against the cross-origin URL '${url.toString()}'. RegExpRoute's will only ` +\n `handle cross-origin requests if they match the entire URL.`);\n }\n return;\n }\n // If the route matches, but there aren't any capture groups defined, then\n // this will return [], which is truthy and therefore sufficient to\n // indicate a match.\n // If there are capture groups, then it will return their values.\n return result.slice(1);\n };\n super(match, handler, method);\n }\n}\nexport { RegExpRoute };\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\nimport '../_version.js';\nconst getFriendlyURL = (url) => {\n const urlObj = new URL(String(url), location.href);\n // See https://github.com/GoogleChrome/workbox/issues/2323\n // We want to include everything, except for the origin if it's same-origin.\n return urlObj.href.replace(new RegExp(`^${location.origin}`), '');\n};\nexport { getFriendlyURL };\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\nimport { assert } from 'workbox-core/_private/assert.js';\nimport { getFriendlyURL } from 'workbox-core/_private/getFriendlyURL.js';\nimport { defaultMethod } from './utils/constants.js';\nimport { logger } from 'workbox-core/_private/logger.js';\nimport { normalizeHandler } from './utils/normalizeHandler.js';\nimport { WorkboxError } from 'workbox-core/_private/WorkboxError.js';\nimport './_version.js';\n/**\n * The Router can be used to process a FetchEvent through one or more\n * [Routes]{@link module:workbox-routing.Route} responding with a Request if\n * a matching route exists.\n *\n * If no route matches a given a request, the Router will use a \"default\"\n * handler if one is defined.\n *\n * Should the matching Route throw an error, the Router will use a \"catch\"\n * handler if one is defined to gracefully deal with issues and respond with a\n * Request.\n *\n * If a request matches multiple routes, the **earliest** registered route will\n * be used to respond to the request.\n *\n * @memberof module:workbox-routing\n */\nclass Router {\n /**\n * Initializes a new Router.\n */\n constructor() {\n this._routes = new Map();\n this._defaultHandlerMap = new Map();\n }\n /**\n * @return {Map>} routes A `Map` of HTTP\n * method name ('GET', etc.) to an array of all the corresponding `Route`\n * instances that are registered.\n */\n get routes() {\n return this._routes;\n }\n /**\n * Adds a fetch event listener to respond to events when a route matches\n * the event's request.\n */\n addFetchListener() {\n // See https://github.com/Microsoft/TypeScript/issues/28357#issuecomment-436484705\n self.addEventListener('fetch', ((event) => {\n const { request } = event;\n const responsePromise = this.handleRequest({ request, event });\n if (responsePromise) {\n event.respondWith(responsePromise);\n }\n }));\n }\n /**\n * Adds a message event listener for URLs to cache from the window.\n * This is useful to cache resources loaded on the page prior to when the\n * service worker started controlling it.\n *\n * The format of the message data sent from the window should be as follows.\n * Where the `urlsToCache` array may consist of URL strings or an array of\n * URL string + `requestInit` object (the same as you'd pass to `fetch()`).\n *\n * ```\n * {\n * type: 'CACHE_URLS',\n * payload: {\n * urlsToCache: [\n * './script1.js',\n * './script2.js',\n * ['./script3.js', {mode: 'no-cors'}],\n * ],\n * },\n * }\n * ```\n */\n addCacheListener() {\n // See https://github.com/Microsoft/TypeScript/issues/28357#issuecomment-436484705\n self.addEventListener('message', ((event) => {\n // event.data is type 'any'\n if (event.data && event.data.type === 'CACHE_URLS') { // eslint-disable-line\n const { payload } = event.data; // eslint-disable-line\n if (process.env.NODE_ENV !== 'production') {\n logger.debug(`Caching URLs from the window`, payload.urlsToCache);\n }\n const requestPromises = Promise.all(payload.urlsToCache.map((entry) => {\n if (typeof entry === 'string') {\n entry = [entry];\n }\n const request = new Request(...entry);\n return this.handleRequest({ request, event });\n // TODO(philipwalton): TypeScript errors without this typecast for\n // some reason (probably a bug). The real type here should work but\n // doesn't: `Array | undefined>`.\n })); // TypeScript\n event.waitUntil(requestPromises);\n // If a MessageChannel was used, reply to the message on success.\n if (event.ports && event.ports[0]) {\n void requestPromises.then(() => event.ports[0].postMessage(true));\n }\n }\n }));\n }\n /**\n * Apply the routing rules to a FetchEvent object to get a Response from an\n * appropriate Route's handler.\n *\n * @param {Object} options\n * @param {Request} options.request The request to handle.\n * @param {ExtendableEvent} options.event The event that triggered the\n * request.\n * @return {Promise|undefined} A promise is returned if a\n * registered route can handle the request. If there is no matching\n * route and there's no `defaultHandler`, `undefined` is returned.\n */\n handleRequest({ request, event }) {\n if (process.env.NODE_ENV !== 'production') {\n assert.isInstance(request, Request, {\n moduleName: 'workbox-routing',\n className: 'Router',\n funcName: 'handleRequest',\n paramName: 'options.request',\n });\n }\n const url = new URL(request.url, location.href);\n if (!url.protocol.startsWith('http')) {\n if (process.env.NODE_ENV !== 'production') {\n logger.debug(`Workbox Router only supports URLs that start with 'http'.`);\n }\n return;\n }\n const sameOrigin = url.origin === location.origin;\n const { params, route } = this.findMatchingRoute({\n event,\n request,\n sameOrigin,\n url,\n });\n let handler = route && route.handler;\n const debugMessages = [];\n if (process.env.NODE_ENV !== 'production') {\n if (handler) {\n debugMessages.push([\n `Found a route to handle this request:`, route,\n ]);\n if (params) {\n debugMessages.push([\n `Passing the following params to the route's handler:`, params,\n ]);\n }\n }\n }\n // If we don't have a handler because there was no matching route, then\n // fall back to defaultHandler if that's defined.\n const method = request.method;\n if (!handler && this._defaultHandlerMap.has(method)) {\n if (process.env.NODE_ENV !== 'production') {\n debugMessages.push(`Failed to find a matching route. Falling ` +\n `back to the default handler for ${method}.`);\n }\n handler = this._defaultHandlerMap.get(method);\n }\n if (!handler) {\n if (process.env.NODE_ENV !== 'production') {\n // No handler so Workbox will do nothing. If logs is set of debug\n // i.e. verbose, we should print out this information.\n logger.debug(`No route found for: ${getFriendlyURL(url)}`);\n }\n return;\n }\n if (process.env.NODE_ENV !== 'production') {\n // We have a handler, meaning Workbox is going to handle the route.\n // print the routing details to the console.\n logger.groupCollapsed(`Router is responding to: ${getFriendlyURL(url)}`);\n debugMessages.forEach((msg) => {\n if (Array.isArray(msg)) {\n logger.log(...msg);\n }\n else {\n logger.log(msg);\n }\n });\n logger.groupEnd();\n }\n // Wrap in try and catch in case the handle method throws a synchronous\n // error. It should still callback to the catch handler.\n let responsePromise;\n try {\n responsePromise = handler.handle({ url, request, event, params });\n }\n catch (err) {\n responsePromise = Promise.reject(err);\n }\n // Get route's catch handler, if it exists\n const catchHandler = route && route.catchHandler;\n if (responsePromise instanceof Promise && (this._catchHandler || catchHandler)) {\n responsePromise = responsePromise.catch(async (err) => {\n // If there's a route catch handler, process that first\n if (catchHandler) {\n if (process.env.NODE_ENV !== 'production') {\n // Still include URL here as it will be async from the console group\n // and may not make sense without the URL\n logger.groupCollapsed(`Error thrown when responding to: ` +\n ` ${getFriendlyURL(url)}. Falling back to route's Catch Handler.`);\n logger.error(`Error thrown by:`, route);\n logger.error(err);\n logger.groupEnd();\n }\n try {\n return await catchHandler.handle({ url, request, event, params });\n }\n catch (catchErr) {\n if (catchErr instanceof Error) {\n err = catchErr;\n }\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 // route.match returns type any, not possible to change right now.\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\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 // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n params = matchResult;\n if (Array.isArray(params) && params.length === 0) {\n // Instead of passing an empty array in as params, use undefined.\n params = undefined;\n }\n else if ((matchResult.constructor === Object && // eslint-disable-line\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.toString()}. 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.2.4'] && _();\n}\ncatch (e) { }\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\nimport '../_version.js';\nexport const cacheOkAndOpaquePlugin = {\n /**\n * Returns a valid response (to allow caching) if the status is 200 (OK) or\n * 0 (opaque).\n *\n * @param {Object} options\n * @param {Response} options.response\n * @return {Response|null}\n *\n * @private\n */\n cacheWillUpdate: async ({ response }) => {\n if (response.status === 200 || response.status === 0) {\n return response;\n }\n return null;\n },\n};\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\nimport '../_version.js';\nconst _cacheNameDetails = {\n googleAnalytics: 'googleAnalytics',\n precache: 'precache-v2',\n prefix: 'workbox',\n runtime: 'runtime',\n suffix: typeof registration !== 'undefined' ? registration.scope : '',\n};\nconst _createCacheName = (cacheName) => {\n return [_cacheNameDetails.prefix, cacheName, _cacheNameDetails.suffix]\n .filter((value) => value && value.length > 0)\n .join('-');\n};\nconst eachCacheNameDetail = (fn) => {\n for (const key of Object.keys(_cacheNameDetails)) {\n fn(key);\n }\n};\nexport const cacheNames = {\n updateDetails: (details) => {\n eachCacheNameDetail((key) => {\n if (typeof details[key] === 'string') {\n _cacheNameDetails[key] = details[key];\n }\n });\n },\n getGoogleAnalyticsName: (userCacheName) => {\n return userCacheName || _createCacheName(_cacheNameDetails.googleAnalytics);\n },\n getPrecacheName: (userCacheName) => {\n return userCacheName || _createCacheName(_cacheNameDetails.precache);\n },\n getPrefix: () => {\n return _cacheNameDetails.prefix;\n },\n getRuntimeName: (userCacheName) => {\n return userCacheName || _createCacheName(_cacheNameDetails.runtime);\n },\n getSuffix: () => {\n return _cacheNameDetails.suffix;\n },\n};\n","/*\n Copyright 2020 Google LLC\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\nimport '../_version.js';\nfunction stripParams(fullURL, ignoreParams) {\n const strippedURL = new URL(fullURL);\n for (const param of ignoreParams) {\n strippedURL.searchParams.delete(param);\n }\n return strippedURL.href;\n}\n/**\n * Matches an item in the cache, ignoring specific URL params. This is similar\n * to the `ignoreSearch` option, but it allows you to ignore just specific\n * params (while continuing to match on the others).\n *\n * @private\n * @param {Cache} cache\n * @param {Request} request\n * @param {Object} matchOptions\n * @param {Array} ignoreParams\n * @return {Promise}\n */\nasync function cacheMatchIgnoreParams(cache, request, ignoreParams, matchOptions) {\n const strippedRequestURL = stripParams(request.url, ignoreParams);\n // If the request doesn't include any ignored params, match as normal.\n if (request.url === strippedRequestURL) {\n return cache.match(request, matchOptions);\n }\n // Otherwise, match by comparing keys\n const keysOptions = Object.assign(Object.assign({}, 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.\n// Can't change Function type right now.\n// eslint-disable-next-line @typescript-eslint/ban-types\nconst quotaErrorCallbacks = new Set();\nexport { quotaErrorCallbacks };\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\nimport { logger } from '../_private/logger.js';\nimport { quotaErrorCallbacks } from '../models/quotaErrorCallbacks.js';\nimport '../_version.js';\n/**\n * Runs all of the callback functions, one at a time sequentially, in the order\n * in which they were registered.\n *\n * @memberof module:workbox-core\n * @private\n */\nasync function executeQuotaErrorCallbacks() {\n if (process.env.NODE_ENV !== 'production') {\n logger.log(`About to run ${quotaErrorCallbacks.size} ` +\n `callbacks to clean up caches.`);\n }\n for (const callback of quotaErrorCallbacks) {\n await callback();\n if (process.env.NODE_ENV !== 'production') {\n logger.log(callback, 'is complete.');\n }\n }\n if (process.env.NODE_ENV !== 'production') {\n logger.log('Finished running callbacks.');\n }\n}\nexport { executeQuotaErrorCallbacks };\n","/*\n Copyright 2019 Google LLC\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\nimport '../_version.js';\n/**\n * Returns a promise that resolves and the passed number of milliseconds.\n * This utility is an async/await-friendly version of `setTimeout`.\n *\n * @param {number} ms\n * @return {Promise}\n * @private\n */\nexport function timeout(ms) {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n","/*\n Copyright 2020 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\nimport { assert } from 'workbox-core/_private/assert.js';\nimport { cacheMatchIgnoreParams } from 'workbox-core/_private/cacheMatchIgnoreParams.js';\nimport { Deferred } from 'workbox-core/_private/Deferred.js';\nimport { executeQuotaErrorCallbacks } from 'workbox-core/_private/executeQuotaErrorCallbacks.js';\nimport { getFriendlyURL } from 'workbox-core/_private/getFriendlyURL.js';\nimport { logger } from 'workbox-core/_private/logger.js';\nimport { timeout } from 'workbox-core/_private/timeout.js';\nimport { WorkboxError } from 'workbox-core/_private/WorkboxError.js';\nimport './_version.js';\nfunction toRequest(input) {\n return (typeof input === 'string') ? new Request(input) : input;\n}\n/**\n * A class created every time a Strategy instance instance calls\n * [handle()]{@link module:workbox-strategies.Strategy~handle} or\n * [handleAll()]{@link module:workbox-strategies.Strategy~handleAll} that wraps all fetch and\n * cache actions around plugin callbacks and keeps track of when the strategy\n * is \"done\" (i.e. all added `event.waitUntil()` promises have resolved).\n *\n * @memberof module:workbox-strategies\n */\nclass StrategyHandler {\n /**\n * Creates a new instance associated with the passed strategy and event\n * that's handling the request.\n *\n * The constructor also initializes the state that will be passed to each of\n * the plugins handling this request.\n *\n * @param {module:workbox-strategies.Strategy} strategy\n * @param {Object} options\n * @param {Request|string} options.request A request to run this strategy for.\n * @param {ExtendableEvent} options.event The event associated with the\n * request.\n * @param {URL} [options.url]\n * @param {*} [options.params]\n * [match callback]{@link module:workbox-routing~matchCallback},\n * (if applicable).\n */\n constructor(strategy, options) {\n this._cacheKeys = {};\n /**\n * The request the strategy is performing (passed to the strategy's\n * `handle()` or `handleAll()` method).\n * @name request\n * @instance\n * @type {Request}\n * @memberof module:workbox-strategies.StrategyHandler\n */\n /**\n * The event associated with this request.\n * @name event\n * @instance\n * @type {ExtendableEvent}\n * @memberof module:workbox-strategies.StrategyHandler\n */\n /**\n * A `URL` instance of `request.url` (if passed to the strategy's\n * `handle()` or `handleAll()` method).\n * Note: the `url` param will be present if the strategy was invoked\n * from a workbox `Route` object.\n * @name url\n * @instance\n * @type {URL|undefined}\n * @memberof module:workbox-strategies.StrategyHandler\n */\n /**\n * A `param` value (if passed to the strategy's\n * `handle()` or `handleAll()` method).\n * Note: the `param` param will be present if the strategy was invoked\n * from a workbox `Route` object and the\n * [match callback]{@link module:workbox-routing~matchCallback} returned\n * a truthy value (it will be that value).\n * @name params\n * @instance\n * @type {*|undefined}\n * @memberof module:workbox-strategies.StrategyHandler\n */\n if (process.env.NODE_ENV !== 'production') {\n assert.isInstance(options.event, ExtendableEvent, {\n moduleName: 'workbox-strategies',\n className: 'StrategyHandler',\n funcName: 'constructor',\n paramName: 'options.event',\n });\n }\n Object.assign(this, options);\n this.event = options.event;\n this._strategy = strategy;\n this._handlerDeferred = new Deferred();\n this._extendLifetimePromises = [];\n // Copy the plugins list (since it's mutable on the strategy),\n // so any mutations don't affect this handler instance.\n this._plugins = [...strategy.plugins];\n this._pluginStateMap = new Map();\n for (const plugin of this._plugins) {\n this._pluginStateMap.set(plugin, {});\n }\n this.event.waitUntil(this._handlerDeferred.promise);\n }\n /**\n * Fetches a given request (and invokes any applicable plugin callback\n * methods) using the `fetchOptions` (for non-navigation requests) and\n * `plugins` defined on the `Strategy` object.\n *\n * The following plugin lifecycle methods are invoked when using this method:\n * - `requestWillFetch()`\n * - `fetchDidSucceed()`\n * - `fetchDidFail()`\n *\n * @param {Request|string} input The URL or request to fetch.\n * @return {Promise}\n */\n async fetch(input) {\n const { event } = this;\n let request = toRequest(input);\n if (request.mode === 'navigate' &&\n event instanceof FetchEvent &&\n event.preloadResponse) {\n const possiblePreloadResponse = await event.preloadResponse;\n if (possiblePreloadResponse) {\n if (process.env.NODE_ENV !== 'production') {\n logger.log(`Using a preloaded navigation response for ` +\n `'${getFriendlyURL(request.url)}'`);\n }\n return possiblePreloadResponse;\n }\n }\n // If there is a fetchDidFail plugin, we need to save a clone of the\n // original request before it's either modified by a requestWillFetch\n // plugin or before the original request's body is consumed via fetch().\n const originalRequest = this.hasCallback('fetchDidFail') ?\n request.clone() : null;\n try {\n for (const cb of this.iterateCallbacks('requestWillFetch')) {\n request = await cb({ request: request.clone(), event });\n }\n }\n catch (err) {\n if (err instanceof Error) {\n throw new WorkboxError('plugin-error-request-will-fetch', { thrownErrorMessage: err.message });\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: error,\n event,\n originalRequest: originalRequest.clone(),\n request: pluginFilteredRequest.clone(),\n });\n }\n throw error;\n }\n }\n /**\n * Calls `this.fetch()` and (in the background) runs `this.cachePut()` on\n * the response generated by `this.fetch()`.\n *\n * The call to `this.cachePut()` automatically invokes `this.waitUntil()`,\n * so you do not have to manually call `waitUntil()` on the event.\n *\n * @param {Request|string} input The request or URL to fetch and cache.\n * @return {Promise}\n */\n async fetchAndCachePut(input) {\n const response = await this.fetch(input);\n const responseClone = response.clone();\n void this.waitUntil(this.cachePut(input, responseClone));\n return response;\n }\n /**\n * Matches a request from the cache (and invokes any applicable plugin\n * callback methods) using the `cacheName`, `matchOptions`, and `plugins`\n * defined on the strategy object.\n *\n * The following plugin lifecycle methods are invoked when using this method:\n * - cacheKeyWillByUsed()\n * - cachedResponseWillByUsed()\n *\n * @param {Request|string} key The Request or URL to use as the cache key.\n * @return {Promise} A matching response, if found.\n */\n async cacheMatch(key) {\n const request = toRequest(key);\n let cachedResponse;\n const { cacheName, matchOptions } = this._strategy;\n const effectiveRequest = await this.getCacheKey(request, 'read');\n const multiMatchOptions = Object.assign(Object.assign({}, matchOptions), { cacheName });\n cachedResponse = await caches.match(effectiveRequest, multiMatchOptions);\n if (process.env.NODE_ENV !== 'production') {\n if (cachedResponse) {\n logger.debug(`Found a cached response in '${cacheName}'.`);\n }\n else {\n logger.debug(`No cached response found in '${cacheName}'.`);\n }\n }\n for (const callback of this.iterateCallbacks('cachedResponseWillBeUsed')) {\n cachedResponse = (await callback({\n cacheName,\n matchOptions,\n cachedResponse,\n request: effectiveRequest,\n event: this.event,\n })) || undefined;\n }\n return cachedResponse;\n }\n /**\n * Puts a request/response pair in the cache (and invokes any applicable\n * plugin callback methods) using the `cacheName` and `plugins` defined on\n * the strategy object.\n *\n * The following plugin lifecycle methods are invoked when using this method:\n * - cacheKeyWillByUsed()\n * - cacheWillUpdate()\n * - cacheDidUpdate()\n *\n * @param {Request|string} key The request or URL to use as the cache key.\n * @param {Response} response The response to cache.\n * @return {Promise} `false` if a cacheWillUpdate caused the response\n * not be cached, and `true` otherwise.\n */\n async cachePut(key, response) {\n const request = toRequest(key);\n // Run in the next task to avoid blocking other cache reads.\n // https://github.com/w3c/ServiceWorker/issues/1397\n await timeout(0);\n const effectiveRequest = await this.getCacheKey(request, 'write');\n if (process.env.NODE_ENV !== 'production') {\n if (effectiveRequest.method && effectiveRequest.method !== 'GET') {\n throw new WorkboxError('attempt-to-cache-non-get-request', {\n url: getFriendlyURL(effectiveRequest.url),\n method: effectiveRequest.method,\n });\n }\n // See https://github.com/GoogleChrome/workbox/issues/2818\n const vary = response.headers.get('Vary');\n if (vary) {\n logger.debug(`The response for ${getFriendlyURL(effectiveRequest.url)} ` +\n `has a 'Vary: ${vary}' header. ` +\n `Consider setting the {ignoreVary: true} option on your strategy ` +\n `to ensure cache matching and deletion works as expected.`);\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 if (error instanceof 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 }\n for (const callback of this.iterateCallbacks('cacheDidUpdate')) {\n await callback({\n cacheName,\n oldResponse,\n newResponse: responseToCache.clone(),\n request: effectiveRequest,\n event: this.event,\n });\n }\n return true;\n }\n /**\n * Checks the list of plugins for the `cacheKeyWillBeUsed` callback, and\n * executes any of those callbacks found in sequence. The final `Request`\n * object returned by the last plugin is treated as the cache key for cache\n * reads and/or writes. If no `cacheKeyWillBeUsed` plugin callbacks have\n * been registered, the passed request is returned unmodified\n *\n * @param {Request} request\n * @param {string} mode\n * @return {Promise}\n */\n async getCacheKey(request, mode) {\n if (!this._cacheKeys[mode]) {\n let effectiveRequest = request;\n for (const callback of this.iterateCallbacks('cacheKeyWillBeUsed')) {\n effectiveRequest = toRequest(await callback({\n mode,\n request: effectiveRequest,\n event: this.event,\n // params has a type any can't change right now.\n params: this.params,\n }));\n }\n this._cacheKeys[mode] = effectiveRequest;\n }\n return this._cacheKeys[mode];\n }\n /**\n * Returns true if the strategy has at least one plugin with the given\n * callback.\n *\n * @param {string} name The name of the callback to check for.\n * @return {boolean}\n */\n hasCallback(name) {\n for (const plugin of this._strategy.plugins) {\n if (name in plugin) {\n return true;\n }\n }\n return false;\n }\n /**\n * Runs all plugin callbacks matching the given name, in order, passing the\n * given param object (merged ith the current plugin state) as the only\n * argument.\n *\n * Note: since this method runs all plugins, it's not suitable for cases\n * where the return value of a callback needs to be applied prior to calling\n * the next callback. See\n * [`iterateCallbacks()`]{@link module:workbox-strategies.StrategyHandler#iterateCallbacks}\n * below for how to handle that case.\n *\n * @param {string} name The name of the callback to run within each plugin.\n * @param {Object} param The object to pass as the first (and only) param\n * when executing each callback. This object will be merged with the\n * current plugin state prior to callback execution.\n */\n async runCallbacks(name, param) {\n for (const callback of this.iterateCallbacks(name)) {\n // TODO(philipwalton): not sure why `any` is needed. It seems like\n // this should work with `as WorkboxPluginCallbackParam[C]`.\n await callback(param);\n }\n }\n /**\n * Accepts a callback and returns an iterable of matching plugin callbacks,\n * where each callback is wrapped with the current handler state (i.e. when\n * you call each callback, whatever object parameter you pass it will\n * be merged with the plugin's current state).\n *\n * @param {string} name The name fo the callback to run\n * @return {Array}\n */\n *iterateCallbacks(name) {\n for (const plugin of this._strategy.plugins) {\n if (typeof plugin[name] === 'function') {\n const state = this._pluginStateMap.get(plugin);\n const statefulCallback = (param) => {\n const statefulParam = Object.assign(Object.assign({}, 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(null);\n }\n /**\n * This method will call cacheWillUpdate on the available plugins (or use\n * status === 200) to determine if the Response is safe and valid to cache.\n *\n * @param {Request} options.request\n * @param {Response} options.response\n * @return {Promise}\n *\n * @private\n */\n async _ensureResponseSafeToCache(response) {\n let responseToCache = response;\n let pluginsUsed = false;\n for (const callback of this.iterateCallbacks('cacheWillUpdate')) {\n responseToCache = (await callback({\n request: this.request,\n response: responseToCache,\n event: this.event,\n })) || undefined;\n pluginsUsed = true;\n if (!responseToCache) {\n break;\n }\n }\n if (!pluginsUsed) {\n if (responseToCache && responseToCache.status !== 200) {\n responseToCache = undefined;\n }\n if (process.env.NODE_ENV !== 'production') {\n if (responseToCache) {\n if (responseToCache.status !== 200) {\n if (responseToCache.status === 0) {\n logger.warn(`The response for '${this.request.url}' ` +\n `is an opaque response. The caching strategy that you're ` +\n `using will not cache opaque responses by default.`);\n }\n else {\n logger.debug(`The response for '${this.request.url}' ` +\n `returned a status code of '${response.status}' and won't ` +\n `be cached as a result.`);\n }\n }\n }\n }\n }\n return responseToCache;\n }\n}\nexport { StrategyHandler };\n","/*\n Copyright 2020 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\nimport { cacheNames } from 'workbox-core/_private/cacheNames.js';\nimport { WorkboxError } from 'workbox-core/_private/WorkboxError.js';\nimport { logger } from 'workbox-core/_private/logger.js';\nimport { getFriendlyURL } from 'workbox-core/_private/getFriendlyURL.js';\nimport { StrategyHandler } from './StrategyHandler.js';\nimport './_version.js';\n/**\n * An abstract base class that all other strategy classes must extend from:\n *\n * @memberof module:workbox-strategies\n */\nclass Strategy {\n /**\n * Creates a new instance of the strategy and sets all documented option\n * properties as public instance properties.\n *\n * Note: if a custom strategy class extends the base Strategy class and does\n * not need more than these properties, it does not need to define its own\n * constructor.\n *\n * @param {Object} [options]\n * @param {string} [options.cacheName] Cache name to store and retrieve\n * requests. Defaults to the cache names provided by\n * [workbox-core]{@link module:workbox-core.cacheNames}.\n * @param {Array} [options.plugins] [Plugins]{@link https://developers.google.com/web/tools/workbox/guides/using-plugins}\n * to use in conjunction with this caching strategy.\n * @param {Object} [options.fetchOptions] Values passed along to the\n * [`init`](https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/fetch#Parameters)\n * of [non-navigation](https://github.com/GoogleChrome/workbox/issues/1796)\n * `fetch()` requests made by this strategy.\n * @param {Object} [options.matchOptions] The\n * [`CacheQueryOptions`]{@link https://w3c.github.io/ServiceWorker/#dictdef-cachequeryoptions}\n * for any `cache.match()` or `cache.put()` calls made by this strategy.\n */\n constructor(options = {}) {\n /**\n * Cache name to store and retrieve\n * requests. Defaults to the cache names provided by\n * [workbox-core]{@link module:workbox-core.cacheNames}.\n *\n * @type {string}\n */\n this.cacheName = cacheNames.getRuntimeName(options.cacheName);\n /**\n * The list\n * [Plugins]{@link https://developers.google.com/web/tools/workbox/guides/using-plugins}\n * used by this strategy.\n *\n * @type {Array}\n */\n this.plugins = options.plugins || [];\n /**\n * Values passed along to the\n * [`init`]{@link https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/fetch#Parameters}\n * of all fetch() requests made by this strategy.\n *\n * @type {Object}\n */\n this.fetchOptions = options.fetchOptions;\n /**\n * The\n * [`CacheQueryOptions`]{@link https://w3c.github.io/ServiceWorker/#dictdef-cachequeryoptions}\n * for any `cache.match()` or `cache.put()` calls made by this strategy.\n *\n * @type {Object}\n */\n this.matchOptions = options.matchOptions;\n }\n /**\n * Perform a request strategy and returns a `Promise` that will resolve with\n * a `Response`, invoking all relevant plugin callbacks.\n *\n * When a strategy instance is registered with a Workbox\n * [route]{@link module:workbox-routing.Route}, this method is automatically\n * called when the route matches.\n *\n * Alternatively, this method can be used in a standalone `FetchEvent`\n * listener by passing it to `event.respondWith()`.\n *\n * @param {FetchEvent|Object} options A `FetchEvent` or an object with the\n * properties listed below.\n * @param {Request|string} options.request A request to run this strategy for.\n * @param {ExtendableEvent} options.event The event associated with the\n * request.\n * @param {URL} [options.url]\n * @param {*} [options.params]\n */\n handle(options) {\n const [responseDone] = this.handleAll(options);\n return responseDone;\n }\n /**\n * Similar to [`handle()`]{@link module:workbox-strategies.Strategy~handle}, but\n * instead of just returning a `Promise` that resolves to a `Response` it\n * it will return an tuple of [response, done] promises, where the former\n * (`response`) is equivalent to what `handle()` returns, and the latter is a\n * Promise that will resolve once any promises that were added to\n * `event.waitUntil()` as part of performing the strategy have completed.\n *\n * You can await the `done` promise to ensure any extra work performed by\n * the strategy (usually caching responses) completes successfully.\n *\n * @param {FetchEvent|Object} options A `FetchEvent` or an object with the\n * properties listed below.\n * @param {Request|string} options.request A request to run this strategy for.\n * @param {ExtendableEvent} options.event The event associated with the\n * request.\n * @param {URL} [options.url]\n * @param {*} [options.params]\n * @return {Array} A tuple of [response, done]\n * promises that can be used to determine when the response resolves as\n * well as when the handler has completed all its work.\n */\n handleAll(options) {\n // Allow for flexible options to be passed.\n if (options instanceof FetchEvent) {\n options = {\n event: options,\n request: options.request,\n };\n }\n const event = options.event;\n const request = typeof options.request === 'string' ?\n new Request(options.request) :\n options.request;\n const params = 'params' in options ? options.params : undefined;\n const handler = new StrategyHandler(this, { event, request, params });\n const responseDone = this._getResponse(handler, request, event);\n const handlerDone = this._awaitComplete(responseDone, handler, request, event);\n // Return an array of promises, suitable for use with Promise.all().\n return [responseDone, handlerDone];\n }\n async _getResponse(handler, request, event) {\n await handler.runCallbacks('handlerWillStart', { event, request });\n let response = undefined;\n try {\n response = await this._handle(request, handler);\n // The \"official\" Strategy subclasses all throw this error automatically,\n // but in case a third-party Strategy doesn't, ensure that we have a\n // consistent failure when there's no response or an error response.\n if (!response || response.type === 'error') {\n throw new WorkboxError('no-response', { url: request.url });\n }\n }\n catch (error) {\n if (error instanceof Error) {\n for (const callback of handler.iterateCallbacks('handlerDidError')) {\n response = await callback({ error, event, request });\n if (response) {\n break;\n }\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 instanceof Error ? error.toString() : ''} 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 if (waitUntilError instanceof Error) {\n error = waitUntilError;\n }\n }\n await handler.runCallbacks('handlerDidComplete', {\n event,\n request,\n response,\n error: error,\n });\n handler.destroy();\n if (error) {\n throw error;\n }\n }\n}\nexport { Strategy };\n/**\n * Classes extending the `Strategy` based class should implement this method,\n * and leverage the [`handler`]{@link module:workbox-strategies.StrategyHandler}\n * arg to perform all fetching and cache logic, which will ensure all relevant\n * cache, cache options, fetch options and plugins are used (per the current\n * strategy instance).\n *\n * @name _handle\n * @instance\n * @abstract\n * @function\n * @param {Request} request\n * @param {module:workbox-strategies.StrategyHandler} handler\n * @return {Promise}\n *\n * @memberof module:workbox-strategies.Strategy\n */\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\nimport { logger } from 'workbox-core/_private/logger.js';\nimport { getFriendlyURL } from 'workbox-core/_private/getFriendlyURL.js';\nimport '../_version.js';\nexport const messages = {\n strategyStart: (strategyName, request) => `Using ${strategyName} to respond to '${getFriendlyURL(request.url)}'`,\n printFinalResponse: (response) => {\n if (response) {\n logger.groupCollapsed(`View the final response here.`);\n logger.log(response || '[No response returned]');\n logger.groupEnd();\n }\n },\n};\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\nimport { assert } from 'workbox-core/_private/assert.js';\nimport { logger } from 'workbox-core/_private/logger.js';\nimport { WorkboxError } from 'workbox-core/_private/WorkboxError.js';\nimport { cacheOkAndOpaquePlugin } from './plugins/cacheOkAndOpaquePlugin.js';\nimport { Strategy } from './Strategy.js';\nimport { messages } from './utils/messages.js';\nimport './_version.js';\n/**\n * An implementation of a\n * [network first]{@link https://developers.google.com/web/fundamentals/instant-and-offline/offline-cookbook/#network-falling-back-to-cache}\n * request strategy.\n *\n * By default, this strategy will cache responses with a 200 status code as\n * well as [opaque responses]{@link https://developers.google.com/web/tools/workbox/guides/handle-third-party-requests}.\n * Opaque responses are are cross-origin requests where the response doesn't\n * support [CORS]{@link https://enable-cors.org/}.\n *\n * If the network request fails, and there is no cache match, this will throw\n * a `WorkboxError` exception.\n *\n * @extends module:workbox-strategies.Strategy\n * @memberof module:workbox-strategies\n */\nclass NetworkFirst extends Strategy {\n /**\n * @param {Object} [options]\n * @param {string} [options.cacheName] Cache name to store and retrieve\n * requests. Defaults to cache names provided by\n * [workbox-core]{@link module:workbox-core.cacheNames}.\n * @param {Array} [options.plugins] [Plugins]{@link https://developers.google.com/web/tools/workbox/guides/using-plugins}\n * to use in conjunction with this caching strategy.\n * @param {Object} [options.fetchOptions] Values passed along to the\n * [`init`](https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/fetch#Parameters)\n * of [non-navigation](https://github.com/GoogleChrome/workbox/issues/1796)\n * `fetch()` requests made by this strategy.\n * @param {Object} [options.matchOptions] [`CacheQueryOptions`](https://w3c.github.io/ServiceWorker/#dictdef-cachequeryoptions)\n * @param {number} [options.networkTimeoutSeconds] If set, any network requests\n * that fail to respond within the timeout will fallback to the cache.\n *\n * This option can be used to combat\n * \"[lie-fi]{@link https://developers.google.com/web/fundamentals/performance/poor-connectivity/#lie-fi}\"\n * scenarios.\n */\n constructor(options = {}) {\n super(options);\n // If this instance contains no plugins with a 'cacheWillUpdate' callback,\n // prepend the `cacheOkAndOpaquePlugin` plugin to the plugins list.\n if (!this.plugins.some((p) => 'cacheWillUpdate' in p)) {\n this.plugins.unshift(cacheOkAndOpaquePlugin);\n }\n this._networkTimeoutSeconds = options.networkTimeoutSeconds || 0;\n if (process.env.NODE_ENV !== 'production') {\n if (this._networkTimeoutSeconds) {\n assert.isType(this._networkTimeoutSeconds, 'number', {\n moduleName: 'workbox-strategies',\n className: this.constructor.name,\n funcName: 'constructor',\n paramName: 'networkTimeoutSeconds',\n });\n }\n }\n }\n /**\n * @private\n * @param {Request|string} request A request to run this strategy for.\n * @param {module:workbox-strategies.StrategyHandler} handler The event that\n * triggered the request.\n * @return {Promise}\n */\n async _handle(request, handler) {\n const logs = [];\n if (process.env.NODE_ENV !== 'production') {\n assert.isInstance(request, Request, {\n moduleName: 'workbox-strategies',\n className: this.constructor.name,\n funcName: 'handle',\n paramName: 'makeRequest',\n });\n }\n const promises = [];\n let timeoutId;\n if (this._networkTimeoutSeconds) {\n const { id, promise } = this._getTimeoutPromise({ request, logs, handler });\n timeoutId = id;\n promises.push(promise);\n }\n const networkPromise = this._getNetworkPromise({ timeoutId, request, logs, handler });\n promises.push(networkPromise);\n const response = await handler.waitUntil((async () => {\n // Promise.race() will resolve as soon as the first promise resolves.\n return await handler.waitUntil(Promise.race(promises)) ||\n // If Promise.race() resolved with null, it might be due to a network\n // timeout + a cache miss. If that were to happen, we'd rather wait until\n // the networkPromise resolves instead of returning null.\n // Note that it's fine to await an already-resolved promise, so we don't\n // have to check to see if it's still \"in flight\".\n await networkPromise;\n })());\n if (process.env.NODE_ENV !== 'production') {\n logger.groupCollapsed(messages.strategyStart(this.constructor.name, request));\n for (const log of logs) {\n logger.log(log);\n }\n messages.printFinalResponse(response);\n logger.groupEnd();\n }\n if (!response) {\n throw new WorkboxError('no-response', { url: request.url });\n }\n return response;\n }\n /**\n * @param {Object} options\n * @param {Request} options.request\n * @param {Array} options.logs A reference to the logs array\n * @param {Event} options.event\n * @return {Promise}\n *\n * @private\n */\n _getTimeoutPromise({ request, logs, handler }) {\n let timeoutId;\n const timeoutPromise = new Promise((resolve) => {\n const onNetworkTimeout = async () => {\n if (process.env.NODE_ENV !== 'production') {\n logs.push(`Timing out the network response at ` +\n `${this._networkTimeoutSeconds} seconds.`);\n }\n resolve(await handler.cacheMatch(request));\n };\n timeoutId = setTimeout(onNetworkTimeout, this._networkTimeoutSeconds * 1000);\n });\n return {\n promise: timeoutPromise,\n id: timeoutId,\n };\n }\n /**\n * @param {Object} options\n * @param {number|undefined} options.timeoutId\n * @param {Request} options.request\n * @param {Array} options.logs A reference to the logs Array.\n * @param {Event} options.event\n * @return {Promise}\n *\n * @private\n */\n async _getNetworkPromise({ timeoutId, request, logs, handler }) {\n let error;\n let response;\n try {\n response = await handler.fetchAndCachePut(request);\n }\n catch (fetchError) {\n if (fetchError instanceof Error) {\n error = fetchError;\n }\n }\n if (timeoutId) {\n clearTimeout(timeoutId);\n }\n if (process.env.NODE_ENV !== 'production') {\n if (response) {\n logs.push(`Got response from network.`);\n }\n else {\n logs.push(`Unable to get a response from the network. Will respond ` +\n `with a cached response.`);\n }\n }\n if (error || !response) {\n response = await handler.cacheMatch(request);\n if (process.env.NODE_ENV !== 'production') {\n if (response) {\n logs.push(`Found a cached response in the '${this.cacheName}'` +\n ` cache.`);\n }\n else {\n logs.push(`No response found in the '${this.cacheName}' cache.`);\n }\n }\n }\n return response;\n }\n}\nexport { NetworkFirst };\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\nimport { assert } from 'workbox-core/_private/assert.js';\nimport { logger } from 'workbox-core/_private/logger.js';\nimport { timeout } from 'workbox-core/_private/timeout.js';\nimport { WorkboxError } from 'workbox-core/_private/WorkboxError.js';\nimport { Strategy } from './Strategy.js';\nimport { messages } from './utils/messages.js';\nimport './_version.js';\n/**\n * An implementation of a\n * [network-only]{@link https://developers.google.com/web/fundamentals/instant-and-offline/offline-cookbook/#network-only}\n * request strategy.\n *\n * This class is useful if you want to take advantage of any\n * [Workbox plugins]{@link https://developers.google.com/web/tools/workbox/guides/using-plugins}.\n *\n * If the network request fails, this will throw a `WorkboxError` exception.\n *\n * @extends module:workbox-strategies.Strategy\n * @memberof module:workbox-strategies\n */\nclass NetworkOnly extends Strategy {\n /**\n * @param {Object} [options]\n * @param {Array} [options.plugins] [Plugins]{@link https://developers.google.com/web/tools/workbox/guides/using-plugins}\n * to use in conjunction with this caching strategy.\n * @param {Object} [options.fetchOptions] Values passed along to the\n * [`init`](https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/fetch#Parameters)\n * of [non-navigation](https://github.com/GoogleChrome/workbox/issues/1796)\n * `fetch()` requests made by this strategy.\n * @param {number} [options.networkTimeoutSeconds] If set, any network requests\n * that fail to respond within the timeout will result in a network error.\n */\n constructor(options = {}) {\n super(options);\n this._networkTimeoutSeconds = options.networkTimeoutSeconds || 0;\n }\n /**\n * @private\n * @param {Request|string} request A request to run this strategy for.\n * @param {module:workbox-strategies.StrategyHandler} handler The event that\n * triggered the request.\n * @return {Promise}\n */\n async _handle(request, handler) {\n if (process.env.NODE_ENV !== 'production') {\n assert.isInstance(request, Request, {\n moduleName: 'workbox-strategies',\n className: this.constructor.name,\n funcName: '_handle',\n paramName: 'request',\n });\n }\n let error = undefined;\n let response;\n try {\n const promises = [handler.fetch(request)];\n if (this._networkTimeoutSeconds) {\n const timeoutPromise = timeout(this._networkTimeoutSeconds * 1000);\n promises.push(timeoutPromise);\n }\n response = await Promise.race(promises);\n if (!response) {\n throw new Error(`Timed out the network response after ` +\n `${this._networkTimeoutSeconds} seconds.`);\n }\n }\n catch (err) {\n if (err instanceof Error) {\n error = err;\n }\n }\n if (process.env.NODE_ENV !== 'production') {\n logger.groupCollapsed(messages.strategyStart(this.constructor.name, request));\n if (response) {\n logger.log(`Got response from network.`);\n }\n else {\n logger.log(`Unable to get a response from the network.`);\n }\n messages.printFinalResponse(response);\n logger.groupEnd();\n }\n if (!response) {\n throw new WorkboxError('no-response', { url: request.url, error });\n }\n return response;\n }\n}\nexport { NetworkOnly };\n","/*\n Copyright 2019 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\nimport './_version.js';\n/**\n * Claim any currently available clients once the service worker\n * becomes active. This is normally used in conjunction with `skipWaiting()`.\n *\n * @memberof module:workbox-core\n */\nfunction clientsClaim() {\n self.addEventListener('activate', () => self.clients.claim());\n}\nexport { clientsClaim };\n"],"names":["self","_","e","logger","__WB_DISABLE_DEV_LOGS","inGroup","methodToColorMap","debug","log","warn","error","groupCollapsed","groupEnd","print","method","args","test","navigator","userAgent","console","styles","logPrefix","join","api","loggerMethods","Object","keys","key","messages","paramName","validValueDescription","value","Error","JSON","stringify","moduleName","className","funcName","expectedType","classNameStr","expectedClassName","isReturnValueProblem","expectedMethod","entry","firstEntry","secondEntry","thrownErrorMessage","cacheNameId","name","methodName","expectedClass","normalizedRangeHeader","size","start","end","url","message","status","cacheName","origin","generatorFunction","code","details","messageGenerator","WorkboxError","constructor","errorCode","isArray","Array","hasMethod","object","type","isType","isInstance","isOneOf","validValues","includes","isArrayOfClass","item","finalAssertExports","defaultMethod","validMethods","normalizeHandler","handler","assert","handle","Route","match","setCatchHandler","catchHandler","RegExpRoute","regExp","RegExp","result","exec","href","location","index","toString","slice","getFriendlyURL","urlObj","URL","String","replace","Router","_routes","Map","_defaultHandlerMap","routes","addFetchListener","addEventListener","event","request","responsePromise","handleRequest","respondWith","addCacheListener","data","payload","urlsToCache","requestPromises","Promise","all","map","Request","waitUntil","ports","then","postMessage","protocol","startsWith","sameOrigin","params","route","findMatchingRoute","debugMessages","push","has","get","forEach","msg","err","reject","_catchHandler","catch","catchErr","matchResult","length","undefined","setDefaultHandler","set","registerRoute","unregisterRoute","routeIndex","indexOf","splice","defaultRouter","getOrCreateDefaultRouter","capture","captureUrl","valueToCheck","pathname","wildcards","matchCallback","cacheOkAndOpaquePlugin","cacheWillUpdate","response","_cacheNameDetails","googleAnalytics","precache","prefix","runtime","suffix","registration","scope","_createCacheName","filter","eachCacheNameDetail","fn","cacheNames","updateDetails","getGoogleAnalyticsName","userCacheName","getPrecacheName","getPrefix","getRuntimeName","getSuffix","stripParams","fullURL","ignoreParams","strippedURL","param","searchParams","delete","cacheMatchIgnoreParams","cache","matchOptions","strippedRequestURL","keysOptions","assign","ignoreSearch","cacheKeys","cacheKey","strippedCacheKeyURL","Deferred","promise","resolve","quotaErrorCallbacks","Set","executeQuotaErrorCallbacks","callback","timeout","ms","setTimeout","toRequest","input","StrategyHandler","strategy","options","_cacheKeys","ExtendableEvent","_strategy","_handlerDeferred","_extendLifetimePromises","_plugins","plugins","_pluginStateMap","plugin","fetch","mode","FetchEvent","preloadResponse","possiblePreloadResponse","originalRequest","hasCallback","clone","cb","iterateCallbacks","pluginFilteredRequest","fetchResponse","fetchOptions","runCallbacks","fetchAndCachePut","responseClone","cachePut","cacheMatch","cachedResponse","effectiveRequest","getCacheKey","multiMatchOptions","caches","vary","headers","responseToCache","_ensureResponseSafeToCache","open","hasCacheUpdateCallback","oldResponse","put","newResponse","state","statefulCallback","statefulParam","doneWaiting","shift","destroy","pluginsUsed","Strategy","responseDone","handleAll","_getResponse","handlerDone","_awaitComplete","_handle","waitUntilError","strategyStart","strategyName","printFinalResponse","NetworkFirst","some","p","unshift","_networkTimeoutSeconds","networkTimeoutSeconds","logs","promises","timeoutId","id","_getTimeoutPromise","networkPromise","_getNetworkPromise","race","timeoutPromise","onNetworkTimeout","fetchError","clearTimeout","NetworkOnly","clientsClaim","clients","claim"],"mappings":"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"} \ No newline at end of file diff --git a/src/client/public/workbox-4a677df8.js b/src/client/public/workbox-4a677df8.js new file mode 100644 index 0000000..0e5400a --- /dev/null +++ b/src/client/public/workbox-4a677df8.js @@ -0,0 +1 @@ +define("./workbox-4a677df8.js",["exports"],(function(t){"use strict";try{self["workbox:core:6.2.4"]&&_()}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.2.4"]&&_()}catch(t){}const n=t=>t&&"object"==typeof t?t:{handle:t};class r{constructor(t,e,s="GET"){this.handler=n(e),this.match=t,this.method=s}setCatchHandler(t){this.catchHandler=n(t)}}class i extends r{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:r,route:i}=this.findMatchingRoute({event:e,request:t,sameOrigin:n,url:s});let a=i&&i.handler;const o=t.method;if(!a&&this.i.has(o)&&(a=this.i.get(o)),!a)return;let c;try{c=a.handle({url:s,request:t,event:e,params:r})}catch(t){c=Promise.reject(t)}const h=i&&i.catchHandler;return c instanceof Promise&&(this.o||h)&&(c=c.catch((async n=>{if(h)try{return await h.handle({url:s,request:t,event:e,params:r})}catch(t){t instanceof Error&&(n=t)}if(this.o)return this.o.handle({url:s,request:t,event:e});throw n}))),c}findMatchingRoute({url:t,sameOrigin:e,request:s,event:n}){const r=this.t.get(s.method)||[];for(const i of r){let r;const a=i.match({url:t,sameOrigin:e,request:s,event:n});if(a)return r=a,(Array.isArray(r)&&0===r.length||a.constructor===Object&&0===Object.keys(a).length||"boolean"==typeof a)&&(r=void 0),{route:i,params:r}}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 o;const c=()=>(o||(o=new a,o.addFetchListener(),o.addCacheListener()),o);function h(t,e,n){let a;if("string"==typeof t){const s=new URL(t,location.href);a=new r((({url:t})=>t.href===s.href),e,n)}else if(t instanceof RegExp)a=new i(t,e,n);else if("function"==typeof t)a=new r(t,e,n);else{if(!(t instanceof r))throw new s("unsupported-route-type",{moduleName:"workbox-routing",funcName:"registerRoute",paramName:"capture"});a=t}return c().registerRoute(a),a}try{self["workbox:strategies:6.2.4"]&&_()}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(t,e){const s=new URL(t);for(const t of e)s.searchParams.delete(t);return s.href}class y{constructor(){this.promise=new Promise(((t,e)=>{this.resolve=t,this.reject=e}))}}const g=new Set;function m(t){return"string"==typeof t?new Request(t):t}class R{constructor(t,e){this.h={},Object.assign(this,e),this.event=e.event,this.u=t,this.l=new y,this.p=[],this.g=[...t.plugins],this.m=new Map;for(const t of this.g)this.m.set(t,{});this.event.waitUntil(this.l.promise)}async fetch(t){const{event:e}=this;let n=m(t);if("navigate"===n.mode&&e instanceof FetchEvent&&e.preloadResponse){const t=await e.preloadResponse;if(t)return t}const r=this.hasCallback("fetchDidFail")?n.clone():null;try{for(const t of this.iterateCallbacks("requestWillFetch"))n=await t({request:n.clone(),event:e})}catch(t){if(t instanceof Error)throw new s("plugin-error-request-will-fetch",{thrownErrorMessage:t.message})}const i=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:i,response:t});return t}catch(t){throw r&&await this.runCallbacks("fetchDidFail",{error:t,event:e,originalRequest:r.clone(),request:i.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=m(t);let s;const{cacheName:n,matchOptions:r}=this.u,i=await this.getCacheKey(e,"read"),a=Object.assign(Object.assign({},r),{cacheName:n});s=await caches.match(i,a);for(const t of this.iterateCallbacks("cachedResponseWillBeUsed"))s=await t({cacheName:n,matchOptions:r,cachedResponse:s,request:i,event:this.event})||void 0;return s}async cachePut(t,e){const n=m(t);var r;await(r=0,new Promise((t=>setTimeout(t,r))));const i=await this.getCacheKey(n,"write");if(!e)throw new s("cache-put-with-no-response",{url:(a=i.url,new URL(String(a),location.href).href.replace(new RegExp(`^${location.origin}`),""))});var a;const o=await this.R(e);if(!o)return!1;const{cacheName:c,matchOptions:h}=this.u,u=await self.caches.open(c),l=this.hasCallback("cacheDidUpdate"),f=l?await async function(t,e,s,n){const r=p(e.url,s);if(e.url===r)return t.match(e,n);const i=Object.assign(Object.assign({},n),{ignoreSearch:!0}),a=await t.keys(e,i);for(const e of a)if(r===p(e.url,s))return t.match(e,n)}(u,i.clone(),["__WB_REVISION__"],h):null;try{await u.put(i,l?o.clone():o)}catch(t){if(t instanceof Error)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:c,oldResponse:f,newResponse:o.clone(),request:i,event:this.event});return!0}async getCacheKey(t,e){if(!this.h[e]){let s=t;for(const t of this.iterateCallbacks("cacheKeyWillBeUsed"))s=m(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.m.get(e),n=n=>{const r=Object.assign(Object.assign({},n),{state:s});return e[t](r)};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(null)}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 v{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,r=new R(this,{event:e,request:s,params:n}),i=this.v(r,s,e);return[i,this.q(i,r,s,e)]}async v(t,e,n){let r;await t.runCallbacks("handlerWillStart",{event:n,request:e});try{if(r=await this.D(e,t),!r||"error"===r.type)throw new s("no-response",{url:e.url})}catch(s){if(s instanceof Error)for(const i of t.iterateCallbacks("handlerDidError"))if(r=await i({error:s,event:n,request:e}),r)break;if(!r)throw s}for(const s of t.iterateCallbacks("handlerWillRespond"))r=await s({event:n,request:e,response:r});return r}async q(t,e,s,n){let r,i;try{r=await t}catch(i){}try{await e.runCallbacks("handlerDidRespond",{event:n,request:s,response:r}),await e.doneWaiting()}catch(t){t instanceof Error&&(i=t)}if(await e.runCallbacks("handlerDidComplete",{event:n,request:s,response:r,error:i}),e.destroy(),i)throw i}}function b(t){t.then((()=>{}))}function q(){return q=Object.assign||function(t){for(var e=1;e(t[e]=s,!0),has:(t,e)=>t instanceof IDBTransaction&&("done"===e||"store"===e)||e in t};function k(t){return t!==IDBDatabase.prototype.transaction||"objectStoreNames"in IDBTransaction.prototype?(U||(U=[IDBCursor.prototype.advance,IDBCursor.prototype.continue,IDBCursor.prototype.continuePrimaryKey])).includes(t)?function(...e){return t.apply(B(this),e),T(x.get(this))}:function(...e){return T(t.apply(B(this),e))}:function(e,...s){const n=t.call(B(this),e,...s);return I.set(n,e.sort?e.sort():[e]),T(n)}}function O(t){return"function"==typeof t?k(t):(t instanceof IDBTransaction&&function(t){if(L.has(t))return;const e=new Promise(((e,s)=>{const n=()=>{t.removeEventListener("complete",r),t.removeEventListener("error",i),t.removeEventListener("abort",i)},r=()=>{e(),n()},i=()=>{s(t.error||new DOMException("AbortError","AbortError")),n()};t.addEventListener("complete",r),t.addEventListener("error",i),t.addEventListener("abort",i)}));L.set(t,e)}(t),e=t,(D||(D=[IDBDatabase,IDBObjectStore,IDBIndex,IDBCursor,IDBTransaction])).some((t=>e instanceof t))?new Proxy(t,N):t);var e}function T(t){if(t instanceof IDBRequest)return function(t){const e=new Promise(((e,s)=>{const n=()=>{t.removeEventListener("success",r),t.removeEventListener("error",i)},r=()=>{e(T(t.result)),n()},i=()=>{s(t.error),n()};t.addEventListener("success",r),t.addEventListener("error",i)}));return e.then((e=>{e instanceof IDBCursor&&x.set(e,t)})).catch((()=>{})),E.set(e,t),e}(t);if(C.has(t))return C.get(t);const e=O(t);return e!==t&&(C.set(t,e),E.set(e,t)),e}const B=t=>E.get(t);const P=["get","getKey","getAll","getAllKeys","count"],M=["put","add","delete","clear"],W=new Map;function j(t,e){if(!(t instanceof IDBDatabase)||e in t||"string"!=typeof e)return;if(W.get(e))return W.get(e);const s=e.replace(/FromIndex$/,""),n=e!==s,r=M.includes(s);if(!(s in(n?IDBIndex:IDBObjectStore).prototype)||!r&&!P.includes(s))return;const i=async function(t,...e){const i=this.transaction(t,r?"readwrite":"readonly");let a=i.store;return n&&(a=a.index(e.shift())),(await Promise.all([a[s](...e),r&&i.done]))[0]};return W.set(e,i),i}N=(t=>q({},t,{get:(e,s,n)=>j(e,s)||t.get(e,s,n),has:(e,s)=>!!j(e,s)||t.has(e,s)}))(N);try{self["workbox:expiration:6.2.4"]&&_()}catch(t){}const S="cache-entries",K=t=>{const e=new URL(t,location.href);return e.hash="",e.href};class A{constructor(t){this.U=null,this._=t}L(t){const e=t.createObjectStore(S,{keyPath:"id"});e.createIndex("cacheName","cacheName",{unique:!1}),e.createIndex("timestamp","timestamp",{unique:!1})}I(t){this.L(t),this._&&function(t,{blocked:e}={}){const s=indexedDB.deleteDatabase(t);e&&s.addEventListener("blocked",(()=>e())),T(s).then((()=>{}))}(this._)}async setTimestamp(t,e){const s={url:t=K(t),timestamp:e,cacheName:this._,id:this.C(t)},n=(await this.getDb()).transaction(S,"readwrite",{durability:"relaxed"});await n.store.put(s),await n.done}async getTimestamp(t){const e=await this.getDb(),s=await e.get(S,this.C(t));return null==s?void 0:s.timestamp}async expireEntries(t,e){const s=await this.getDb();let n=await s.transaction(S).store.index("timestamp").openCursor(null,"prev");const r=[];let i=0;for(;n;){const s=n.value;s.cacheName===this._&&(t&&s.timestamp=e?r.push(n.value):i++),n=await n.continue()}const a=[];for(const t of r)await s.delete(S,t.id),a.push(t.url);return a}C(t){return this._+"|"+K(t)}async getDb(){return this.U||(this.U=await function(t,e,{blocked:s,upgrade:n,blocking:r,terminated:i}={}){const a=indexedDB.open(t,e),o=T(a);return n&&a.addEventListener("upgradeneeded",(t=>{n(T(a.result),t.oldVersion,t.newVersion,T(a.transaction))})),s&&a.addEventListener("blocked",(()=>s())),o.then((t=>{i&&t.addEventListener("close",(()=>i())),r&&t.addEventListener("versionchange",(()=>r()))})).catch((()=>{})),o}("workbox-expiration",1,{upgrade:this.I.bind(this)})),this.U}}class F{constructor(t,e={}){this.N=!1,this.k=!1,this.O=e.maxEntries,this.T=e.maxAgeSeconds,this.B=e.matchOptions,this._=t,this.P=new A(t)}async expireEntries(){if(this.N)return void(this.k=!0);this.N=!0;const t=this.T?Date.now()-1e3*this.T:0,e=await this.P.expireEntries(t,this.O),s=await self.caches.open(this._);for(const t of e)await s.delete(t,this.B);this.N=!1,this.k&&(this.k=!1,b(this.expireEntries()))}async updateTimestamp(t){await this.P.setTimestamp(t,Date.now())}async isURLExpired(t){if(this.T){const e=await this.P.getTimestamp(t),s=Date.now()-1e3*this.T;return void 0===e||er||e&&e<0)throw new s("range-not-satisfiable",{size:r,end:n,start:e});let i,a;return void 0!==e&&void 0!==n?(i=e,a=n+1):void 0!==e&&void 0===n?(i=e,a=r):void 0!==n&&void 0===e&&(i=r-n,a=r),{start:i,end:a}}(i,r.start,r.end),o=i.slice(a.start,a.end),c=o.size,h=new Response(o,{status:206,statusText:"Partial Content",headers:e.headers});return h.headers.set("Content-Length",String(c)),h.headers.set("Content-Range",`bytes ${a.start}-${a.end-1}/${i.size}`),h}catch(t){return new Response("",{status:416,statusText:"Range Not Satisfiable"})}}function $(t,e){const s=e();return t.waitUntil(s),s}try{self["workbox:precaching:6.2.4"]&&_()}catch(t){}function z(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 r=new URL(n,location.href),i=new URL(n,location.href);return r.searchParams.set("__WB_REVISION__",e),{cacheKey:r.href,url:i.href}}class G{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&&e&&e.originalRequest&&e.originalRequest instanceof Request){const t=e.originalRequest.url;s?this.notUpdatedURLs.push(t):this.updatedURLs.push(t)}return s}}}class V{constructor({precacheController:t}){this.cacheKeyWillBeUsed=async({request:t,params:e})=>{const s=(null==e?void 0:e.cacheKey)||this.M.getCacheKeyForURL(t.url);return s?new Request(s,{headers:t.headers}):t},this.M=t}}let J,Q;async function X(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 r=t.clone(),i={headers:new Headers(r.headers),status:r.status,statusText:r.statusText},a=e?e(i):i,o=function(){if(void 0===J){const t=new Response("");if("body"in t)try{new Response(t.body),J=!0}catch(t){J=!1}J=!1}return J}()?r.body:await r.blob();return new Response(o,a)}class Y extends v{constructor(t={}){t.cacheName=w(t.cacheName),super(t),this.W=!1!==t.fallbackToNetwork,this.plugins.push(Y.copyRedirectedCacheableResponsesPlugin)}async D(t,e){const s=await e.cacheMatch(t);return s||(e.event&&"install"===e.event.type?await this.j(t,e):await this.S(t,e))}async S(t,e){let n;const r=e.params||{};if(!this.W)throw new s("missing-precache-entry",{cacheName:this.cacheName,url:t.url});{const s=r.integrity,i=t.integrity,a=!i||i===s;n=await e.fetch(new Request(t,{integrity:i||s})),s&&a&&(this.K(),await e.cachePut(t,n.clone()))}return n}async j(t,e){this.K();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}K(){let t=null,e=0;for(const[s,n]of this.plugins.entries())n!==Y.copyRedirectedCacheableResponsesPlugin&&(n===Y.defaultPrecacheCacheabilityPlugin&&(t=s),n.cacheWillUpdate&&e++);0===e?this.plugins.push(Y.defaultPrecacheCacheabilityPlugin):e>1&&null!==t&&this.plugins.splice(t,1)}}Y.defaultPrecacheCacheabilityPlugin={cacheWillUpdate:async({response:t})=>!t||t.status>=400?null:t},Y.copyRedirectedCacheableResponsesPlugin={cacheWillUpdate:async({response:t})=>t.redirected?await X(t):t};class Z{constructor({cacheName:t,plugins:e=[],fallbackToNetwork:s=!0}={}){this.A=new Map,this.F=new Map,this.H=new Map,this.u=new Y({cacheName:w(t),plugins:[...e,new V({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.$||(self.addEventListener("install",this.install),self.addEventListener("activate",this.activate),this.$=!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:r}=z(n),i="string"!=typeof n&&n.revision?"reload":"default";if(this.A.has(r)&&this.A.get(r)!==t)throw new s("add-to-cache-list-conflicting-entries",{firstEntry:this.A.get(r),secondEntry:t});if("string"!=typeof n&&n.integrity){if(this.H.has(t)&&this.H.get(t)!==n.integrity)throw new s("add-to-cache-list-conflicting-integrities",{url:r});this.H.set(t,n.integrity)}if(this.A.set(r,t),this.F.set(r,i),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 $(t,(async()=>{const e=new G;this.strategy.plugins.push(e);for(const[e,s]of this.A){const n=this.H.get(s),r=this.F.get(e),i=new Request(e,{integrity:n,cache:r,credentials:"same-origin"});await Promise.all(this.strategy.handleAll({params:{cacheKey:s},request:i,event:t}))}const{updatedURLs:s,notUpdatedURLs:n}=e;return{updatedURLs:s,notUpdatedURLs:n}}))}activate(t){return $(t,(async()=>{const t=await self.caches.open(this.strategy.cacheName),e=await t.keys(),s=new Set(this.A.values()),n=[];for(const r of e)s.has(r.url)||(await t.delete(r),n.push(r.url));return{deletedURLs:n}}))}getURLsToCacheKeys(){return this.A}getCachedURLs(){return[...this.A.keys()]}getCacheKeyForURL(t){const e=new URL(t,location.href);return this.A.get(e.href)}getIntegrityForCacheKey(t){return this.H.get(t)}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=Object.assign({cacheKey:e},s.params),this.strategy.handle(s))}}const tt=()=>(Q||(Q=new Z),Q);class et extends r{constructor(t,e){super((({request:s})=>{const n=t.getURLsToCacheKeys();for(const r of function*(t,{ignoreURLParametersMatching:e=[/^utm_/,/^fbclid$/],directoryIndex:s="index.html",cleanURLs:n=!0,urlManipulation:r}={}){const i=new URL(t,location.href);i.hash="",yield i.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}(i,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(r){const t=r({url:i});for(const e of t)yield e.href}}(s.url,e)){const e=n.get(r);if(e){return{cacheKey:e,integrity:t.getIntegrityForCacheKey(e)}}}}),t.strategy)}}t.CacheFirst=class extends v{async D(t,e){let n,r=await e.cacheMatch(t);if(!r)try{r=await e.fetchAndCachePut(t)}catch(t){t instanceof Error&&(n=t)}if(!r)throw new s("no-response",{url:t.url,error:n});return r}},t.ExpirationPlugin=class{constructor(t={}){this.cachedResponseWillBeUsed=async({event:t,request:e,cacheName:s,cachedResponse:n})=>{if(!n)return null;const r=this.G(n),i=this.V(s);b(i.expireEntries());const a=i.updateTimestamp(e.url);if(t)try{t.waitUntil(a)}catch(t){}return r?n:null},this.cacheDidUpdate=async({cacheName:t,request:e})=>{const s=this.V(t);await s.updateTimestamp(e.url),await s.expireEntries()},this.J=t,this.T=t.maxAgeSeconds,this.X=new Map,t.purgeOnQuotaError&&function(t){g.add(t)}((()=>this.deleteCacheAndMetadata()))}V(t){if(t===d())throw new s("expire-custom-caches-only");let e=this.X.get(t);return e||(e=new F(t,this.J),this.X.set(t,e)),e}G(t){if(!this.T)return!0;const e=this.Y(t);if(null===e)return!0;return e>=Date.now()-1e3*this.T}Y(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.X)await self.caches.delete(t),await e.delete();this.X=new Map}},t.NetworkFirst=class extends v{constructor(t={}){super(t),this.plugins.some((t=>"cacheWillUpdate"in t))||this.plugins.unshift(u),this.Z=t.networkTimeoutSeconds||0}async D(t,e){const n=[],r=[];let i;if(this.Z){const{id:s,promise:a}=this.tt({request:t,logs:n,handler:e});i=s,r.push(a)}const a=this.et({timeoutId:i,request:t,logs:n,handler:e});r.push(a);const o=await e.waitUntil((async()=>await e.waitUntil(Promise.race(r))||await a)());if(!o)throw new s("no-response",{url:t.url});return o}tt({request:t,logs:e,handler:s}){let n;return{promise:new Promise((e=>{n=setTimeout((async()=>{e(await s.cacheMatch(t))}),1e3*this.Z)})),id:n}}async et({timeoutId:t,request:e,logs:s,handler:n}){let r,i;try{i=await n.fetchAndCachePut(e)}catch(t){t instanceof Error&&(r=t)}return t&&clearTimeout(t),!r&&i||(i=await n.cacheMatch(e)),i}},t.RangeRequestsPlugin=class{constructor(){this.cachedResponseWillBeUsed=async({request:t,cachedResponse:e})=>e&&t.headers.has("range")?await H(t,e):e}},t.StaleWhileRevalidate=class extends v{constructor(t={}){super(t),this.plugins.some((t=>"cacheWillUpdate"in t))||this.plugins.unshift(u)}async D(t,e){const n=e.fetchAndCachePut(t).catch((()=>{}));let r,i=await e.cacheMatch(t);if(i);else try{i=await n}catch(t){t instanceof Error&&(r=t)}if(!i)throw new s("no-response",{url:t.url,error:r});return i}},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){tt().precache(t)}(t),function(t){const e=tt();h(new et(e,t))}(e)},t.registerRoute=h})); diff --git a/src/client/src/components/todos/todoItem.tsx b/src/client/src/components/todos/todoItem.tsx index 46d5fd3..32f4068 100644 --- a/src/client/src/components/todos/todoItem.tsx +++ b/src/client/src/components/todos/todoItem.tsx @@ -21,7 +21,9 @@ export const TodoItem: FC = (props) => {
{ - prefetchTodo(props.todo.id); + if (!props.todo.id.startsWith("temp")) { + prefetchTodo(props.todo.id); + } setIsHovering(true); }} onMouseLeave={() => setIsHovering(false)} diff --git a/src/client/src/infrastructure/apis/todosApi.ts b/src/client/src/infrastructure/apis/todosApi.ts index 44ba855..957a826 100644 --- a/src/client/src/infrastructure/apis/todosApi.ts +++ b/src/client/src/infrastructure/apis/todosApi.ts @@ -1,6 +1,7 @@ import { createApi } from "@reduxjs/toolkit/query/react"; import { baseQueryWithReauth } from "@src/infrastructure/apis/utilities"; import { Todo } from "@src/core/entities/todo"; +import { nanoid } from "@reduxjs/toolkit"; export const todosApi = createApi({ reducerPath: "api", @@ -12,7 +13,7 @@ export const todosApi = createApi({ providesTags: (result, error, id) => [{ type: "todo", id }], }), - getAllTodos: build.query({ + getAllTodos: build.query({ query: () => ({ url: `api/todos` }), providesTags: (result) => result @@ -39,7 +40,7 @@ export const todosApi = createApi({ : [], }), - createTodo: build.mutation>({ + createTodo: build.mutation({ query(body) { return { url: "/api/todos", @@ -47,7 +48,44 @@ export const todosApi = createApi({ body, }; }, - invalidatesTags: (result, error, id) => [{ type: "todo", id: "LIST" }], + invalidatesTags: (result, error, id) => [{ type: "todo", id: result.id }], + async onQueryStarted({ id, ...body }, { dispatch, queryFulfilled }) { + const tempId = nanoid(); + const replaceGetAllResult = dispatch( + todosApi.util.updateQueryData( + "getActiveTodos", + undefined, + (draft) => { + const todo: Todo = { id: "temp" + tempId, ...body }; + if (todo) { + draft.push(todo); + } + } + ) + ); + + try { + const data = await queryFulfilled; + const finishUpdated = dispatch( + todosApi.util.updateQueryData( + "getActiveTodos", + undefined, + (draft) => { + const todo = draft.find((t) => t.id == "temp" + tempId); + if (todo) { + Object.assign(todo, data.data); + } + } + ) + ); + } catch (e) { + console.error(e); + replaceGetAllResult.undo(); + dispatch( + todosApi.util.invalidateTags([{ type: "todo", id: "LIST" }]) + ); + } + }, }), replaceTodo: build.mutation>({ @@ -67,11 +105,28 @@ export const todosApi = createApi({ }) ); + const replaceGetAllResult = dispatch( + todosApi.util.updateQueryData( + "getActiveTodos", + undefined, + (draft) => { + const todo = draft.find((t) => t.id === id); + if (todo) { + Object.assign(todo, body); + } + } + ) + ); + try { await queryFulfilled; } catch { + replaceGetAllResult.undo(); replaceResult.undo(); dispatch(todosApi.util.invalidateTags([{ type: "todo", id }])); + dispatch( + todosApi.util.invalidateTags([{ type: "todo", id: "LIST" }]) + ); } }, }), diff --git a/src/client/src/presentation/contexts/SocketContext.tsx b/src/client/src/presentation/contexts/SocketContext.tsx index a3e564d..3deb868 100644 --- a/src/client/src/presentation/contexts/SocketContext.tsx +++ b/src/client/src/presentation/contexts/SocketContext.tsx @@ -25,7 +25,7 @@ export const SocketProvider: FC = (props) => { const { todoId } = JSON.parse(todoCreated) as { todoId: string }; if (todoId) { dispatch(todosApi.endpoints.getTodoById.initiate(todoId)); - dispatch(todosApi.util.invalidateTags([{ type: "todo", id: "LIST" }])); + // dispatch(todosApi.util.invalidateTags([{ type: "todo", id: "LIST" }])); } }); @@ -33,7 +33,7 @@ export const SocketProvider: FC = (props) => { const { todoId } = JSON.parse(todoUpdated) as { todoId: string }; if (todoId) { dispatch(todosApi.util.invalidateTags([{ type: "todo", id: todoId }])); - dispatch(todosApi.util.invalidateTags([{ type: "todo", id: "LIST" }])); + // dispatch(todosApi.util.invalidateTags([{ type: "todo", id: "LIST" }])); } }); diff --git a/src/client/src/presentation/hooks/socketHooks.tsx b/src/client/src/presentation/hooks/socketHooks.tsx index a8a9913..d6cb010 100644 --- a/src/client/src/presentation/hooks/socketHooks.tsx +++ b/src/client/src/presentation/hooks/socketHooks.tsx @@ -3,6 +3,7 @@ import { useAppSelector } from "@src/infrastructure/store"; import { todosSelectors } from "@src/infrastructure/state/todo"; import { todosApi } from "@src/infrastructure/apis/todosApi"; import { Todo } from "@src/core/entities/todo"; +import { nanoid } from "@reduxjs/toolkit"; export const useSelectInboxTodos = () => { const todos = useAppSelector(todosSelectors.selectAll); @@ -19,6 +20,9 @@ export const useCreateTodo = () => { return { createTodo: (todoName: string, project: string, description: string) => { createTodo({ + id: nanoid(), + created: 0, + status: false, title: todoName, project, description,