From 28c0cf7da72e3883328958a14d647cc9cae7e700 Mon Sep 17 00:00:00 2001 From: oiov Date: Tue, 20 May 2025 10:40:46 +0800 Subject: [PATCH 1/3] chore url list swich color --- app/(protected)/dashboard/urls/url-list.tsx | 1 - public/sitemap-0.xml | 72 +- public/sw.js | 102 +- public/sw.js.map | 1 - public/workbox-8817a5e5.js | 2456 ------------------- public/workbox-8817a5e5.js.map | 1 - public/workbox-e9849328.js | 1 + 7 files changed, 38 insertions(+), 2596 deletions(-) delete mode 100644 public/sw.js.map delete mode 100644 public/workbox-8817a5e5.js delete mode 100644 public/workbox-8817a5e5.js.map create mode 100644 public/workbox-e9849328.js diff --git a/app/(protected)/dashboard/urls/url-list.tsx b/app/(protected)/dashboard/urls/url-list.tsx index 69ae9dc..c0802f7 100644 --- a/app/(protected)/dashboard/urls/url-list.tsx +++ b/app/(protected)/dashboard/urls/url-list.tsx @@ -345,7 +345,6 @@ export default function UserUrlsList({ user, action }: UrlListProps) { handleChangeStatu(value, short.id || "") diff --git a/public/sitemap-0.xml b/public/sitemap-0.xml index 43ec284..2d6ed49 100644 --- a/public/sitemap-0.xml +++ b/public/sitemap-0.xml @@ -1,39 +1,39 @@ -https://wr.do/robots.txt2025-05-10T03:08:41.904Zdaily0.7 -https://wr.do/pricing2025-05-10T03:08:41.905Zdaily0.7 -https://wr.do/privacy2025-05-10T03:08:41.905Zdaily0.7 -https://wr.do/terms2025-05-10T03:08:41.905Zdaily0.7 -https://wr.do/chat2025-05-10T03:08:41.905Zdaily0.7 -https://wr.do/password-prompt2025-05-10T03:08:41.905Zdaily0.7 -https://wr.do/docs2025-05-10T03:08:41.905Zdaily0.7 -https://wr.do/docs/developer/authentification2025-05-10T03:08:41.905Zdaily0.7 -https://wr.do/docs/developer/cloudflare2025-05-10T03:08:41.905Zdaily0.7 -https://wr.do/docs/developer/cloudflare-email-worker2025-05-10T03:08:41.905Zdaily0.7 -https://wr.do/docs/developer/components2025-05-10T03:08:41.905Zdaily0.7 -https://wr.do/docs/developer/config-files2025-05-10T03:08:41.905Zdaily0.7 -https://wr.do/docs/developer/database2025-05-10T03:08:41.905Zdaily0.7 -https://wr.do/docs/developer/email2025-05-10T03:08:41.905Zdaily0.7 -https://wr.do/docs/developer/installation2025-05-10T03:08:41.905Zdaily0.7 -https://wr.do/docs/developer/markdown-files2025-05-10T03:08:41.905Zdaily0.7 -https://wr.do/docs/developer/quick-start2025-05-10T03:08:41.905Zdaily0.7 -https://wr.do/docs/dns-records2025-05-10T03:08:41.905Zdaily0.7 -https://wr.do/docs/emails2025-05-10T03:08:41.905Zdaily0.7 -https://wr.do/docs/examples/cloudflare2025-05-10T03:08:41.905Zdaily0.7 -https://wr.do/docs/examples/other2025-05-10T03:08:41.905Zdaily0.7 -https://wr.do/docs/examples/vercel2025-05-10T03:08:41.905Zdaily0.7 -https://wr.do/docs/examples/zeabur2025-05-10T03:08:41.905Zdaily0.7 -https://wr.do/docs/open-api2025-05-10T03:08:41.905Zdaily0.7 -https://wr.do/docs/open-api/icon2025-05-10T03:08:41.905Zdaily0.7 -https://wr.do/docs/open-api/markdown2025-05-10T03:08:41.905Zdaily0.7 -https://wr.do/docs/open-api/meta-info2025-05-10T03:08:41.905Zdaily0.7 -https://wr.do/docs/open-api/qrcode2025-05-10T03:08:41.905Zdaily0.7 -https://wr.do/docs/open-api/screenshot2025-05-10T03:08:41.905Zdaily0.7 -https://wr.do/docs/open-api/text2025-05-10T03:08:41.905Zdaily0.7 -https://wr.do/docs/plan2025-05-10T03:08:41.905Zdaily0.7 -https://wr.do/docs/quick-start2025-05-10T03:08:41.905Zdaily0.7 -https://wr.do/docs/short-urls2025-05-10T03:08:41.905Zdaily0.7 -https://wr.do/docs/wroom2025-05-10T03:08:41.905Zdaily0.7 -https://wr.do/manifest.json2025-05-10T03:08:41.905Zdaily0.7 -https://wr.do/opengraph-image.jpg2025-05-10T03:08:41.905Zdaily0.7 +https://wr.do/robots.txt2025-05-19T13:47:40.142Zdaily0.7 +https://wr.do/pricing2025-05-19T13:47:40.142Zdaily0.7 +https://wr.do/privacy2025-05-19T13:47:40.142Zdaily0.7 +https://wr.do/terms2025-05-19T13:47:40.142Zdaily0.7 +https://wr.do/docs2025-05-19T13:47:40.142Zdaily0.7 +https://wr.do/docs/developer/authentification2025-05-19T13:47:40.142Zdaily0.7 +https://wr.do/docs/developer/cloudflare2025-05-19T13:47:40.142Zdaily0.7 +https://wr.do/docs/developer/cloudflare-email-worker2025-05-19T13:47:40.142Zdaily0.7 +https://wr.do/docs/developer/components2025-05-19T13:47:40.142Zdaily0.7 +https://wr.do/docs/developer/config-files2025-05-19T13:47:40.142Zdaily0.7 +https://wr.do/docs/developer/database2025-05-19T13:47:40.142Zdaily0.7 +https://wr.do/docs/developer/email2025-05-19T13:47:40.142Zdaily0.7 +https://wr.do/docs/developer/installation2025-05-19T13:47:40.142Zdaily0.7 +https://wr.do/docs/developer/markdown-files2025-05-19T13:47:40.142Zdaily0.7 +https://wr.do/docs/developer/quick-start2025-05-19T13:47:40.142Zdaily0.7 +https://wr.do/docs/dns-records2025-05-19T13:47:40.142Zdaily0.7 +https://wr.do/docs/emails2025-05-19T13:47:40.142Zdaily0.7 +https://wr.do/docs/examples/cloudflare2025-05-19T13:47:40.142Zdaily0.7 +https://wr.do/docs/examples/other2025-05-19T13:47:40.142Zdaily0.7 +https://wr.do/docs/examples/vercel2025-05-19T13:47:40.142Zdaily0.7 +https://wr.do/docs/examples/zeabur2025-05-19T13:47:40.142Zdaily0.7 +https://wr.do/docs/open-api2025-05-19T13:47:40.142Zdaily0.7 +https://wr.do/docs/open-api/icon2025-05-19T13:47:40.142Zdaily0.7 +https://wr.do/docs/open-api/markdown2025-05-19T13:47:40.142Zdaily0.7 +https://wr.do/docs/open-api/meta-info2025-05-19T13:47:40.142Zdaily0.7 +https://wr.do/docs/open-api/qrcode2025-05-19T13:47:40.142Zdaily0.7 +https://wr.do/docs/open-api/screenshot2025-05-19T13:47:40.142Zdaily0.7 +https://wr.do/docs/open-api/text2025-05-19T13:47:40.142Zdaily0.7 +https://wr.do/docs/plan2025-05-19T13:47:40.142Zdaily0.7 +https://wr.do/docs/quick-start2025-05-19T13:47:40.142Zdaily0.7 +https://wr.do/docs/short-urls2025-05-19T13:47:40.142Zdaily0.7 +https://wr.do/docs/wroom2025-05-19T13:47:40.142Zdaily0.7 +https://wr.do/password-prompt2025-05-19T13:47:40.142Zdaily0.7 +https://wr.do/chat2025-05-19T13:47:40.142Zdaily0.7 +https://wr.do/manifest.json2025-05-19T13:47:40.142Zdaily0.7 +https://wr.do/opengraph-image.jpg2025-05-19T13:47:40.142Zdaily0.7 \ No newline at end of file diff --git a/public/sw.js b/public/sw.js index 10bb6b1..acac387 100644 --- a/public/sw.js +++ b/public/sw.js @@ -1,101 +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) { - let registry = {}; - - // Used for `eval` and `importScripts` where we can't get script URL by other means. - // In both cases, it's safe to use a global var because those functions are synchronous. - let nextDefineUri; - - const singleRequire = (uri, parentUri) => { - uri = new URL(uri + ".js", parentUri).href; - return registry[uri] || ( - - new Promise(resolve => { - if ("document" in self) { - const script = document.createElement("script"); - script.src = uri; - script.onload = resolve; - document.head.appendChild(script); - } else { - nextDefineUri = uri; - importScripts(uri); - resolve(); - } - }) - - .then(() => { - let promise = registry[uri]; - if (!promise) { - throw new Error(`Module ${uri} didn’t register its module`); - } - return promise; - }) - ); - }; - - self.define = (depsNames, factory) => { - const uri = nextDefineUri || ("document" in self ? document.currentScript.src : "") || location.href; - if (registry[uri]) { - // Module is already loading or loaded. - return; - } - let exports = {}; - const require = depUri => singleRequire(depUri, uri); - const specialDeps = { - module: { uri }, - exports, - require - }; - registry[uri] = Promise.all(depsNames.map( - depName => specialDeps[depName] || require(depName) - )).then(deps => { - factory(...deps); - return exports; - }); - }; -} -define(['./workbox-8817a5e5'], (function (workbox) { 'use strict'; - - 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){let e,i={};const s=(s,a)=>(s=new URL(s+".js",a).href,i[s]||new Promise((i=>{if("document"in self){const e=document.createElement("script");e.src=s,e.onload=i,document.head.appendChild(e)}else e=s,importScripts(s),i()})).then((()=>{let e=i[s];if(!e)throw new Error(`Module ${s} didn’t register its module`);return e})));self.define=(a,n)=>{const t=e||("document"in self?document.currentScript.src:"")||location.href;if(i[t])return;let c={};const r=e=>s(e,t),d={module:{uri:t},exports:c,require:r};i[t]=Promise.all(a.map((e=>d[e]||r(e)))).then((e=>(n(...e),c)))}}define(["./workbox-e9849328"],(function(e){"use strict";importScripts(),self.skipWaiting(),e.clientsClaim(),e.precacheAndRoute([{url:"/_next/app-build-manifest.json",revision:"36fe5de2ed0becc9f87cd2cace2cf251"},{url:"/_next/static/Zii8KOhYgpETjkX-z9n4Y/_buildManifest.js",revision:"73b52720bea01027a804a328361e8618"},{url:"/_next/static/Zii8KOhYgpETjkX-z9n4Y/_ssgManifest.js",revision:"b6652df95db52feb4daf4eca35380933"},{url:"/_next/static/chunks/1216.057c6927e653812a.js",revision:"057c6927e653812a"},{url:"/_next/static/chunks/1403-a3d81771e852e5cf.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/1826-eeb2dec820b91ccd.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/1932-3e4aa4210ec36606.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/2052-21bff78b03cb5c4d.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/2071-aa1f7133d51be4b9.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/2171-9a1ff0ce96870317.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/2207-4bdf30c4774b0c4c.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/2383-b8c179c6b36104e3.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/2435-61d409c80e01097a.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/2448-6326b697d799a586.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/2560-5443986a93a575e1.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/2694-cf9d685efb57db76.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/2857-e043ef3d22cae2ff.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/2918-3e089134e978a652.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/3005-1ff64d5da18ed405.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/3107-fab00402de5c9da9.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/3203-d4d8074ad2880903.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/321-f0ee4210d84c0929.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/3250-65a3fdc437438a98.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/3422-b5f001f63e2f252a.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/3654-d9aea5e61383aaac.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/435-125edd1a8a547507.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/4862-7aade0f792895ce1.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/501-b7ed66c1a62416dd.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/5107-3814fb64d8e35baa.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/5276-3ab1a4049fb02bfb.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/5434-7a651b6f86e4e66e.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/5596-ff4a78279462ec85.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/5699-38741365d68fe6af.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/5845-0a6955d226e1eb29.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/6254-4541e65b79eccb47.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/656-9a28544695bc499d.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/7056-fafec3cde147d372.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/7241-2437eeecd9994098.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/7567-59fdad9479975a76.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/7789-6f79c02428fdc02d.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/7797-504f77909dbb8a9c.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/7865-4b8ee6b3bca69bf8.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/7976-3bccb3a48c4dc527.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/8333-eb210683b72846db.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/8599-57409b44d3000698.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/8854-b5be0fb210099b34.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/9305-2df17c8fba5d9855.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/9521-fcfac90176e0fd32.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/9586-c46110f85fe2b96d.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/9596-ad40ff9c0746ddb2.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/a33f0537-4968ab0047fe8bc4.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/app/(auth)/layout-0de19d3a8d6c02ff.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/app/(auth)/login/page-24e6a0f975545944.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/app/(auth)/register/page-0d5ef98144d8399f.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/app/(docs)/docs/%5B%5B...slug%5D%5D/page-03f7ec3b422595f8.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/app/(docs)/docs/layout-2a72cef66b32135f.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/app/(docs)/layout-9ab5e63523e563f3.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/app/(marketing)/%5Bslug%5D/page-3a99fb09a3075a6f.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/app/(marketing)/error-08a3e55698094ed5.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/app/(marketing)/layout-46924c891bd04bac.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/app/(marketing)/not-found-d5f4451fe8d5c1ec.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/app/(marketing)/page-d62c4691b8ff6ab7.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/app/(protected)/admin/layout-703b7afeba662805.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/app/(protected)/admin/loading-66e41872e1d2db26.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/app/(protected)/admin/page-0ab4304a56f4b98c.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/app/(protected)/admin/records/loading-6cd8ecf96d423ba6.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/app/(protected)/admin/records/page-da14669c9e6acdea.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/app/(protected)/admin/urls/loading-93e86960074b4af7.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/app/(protected)/admin/urls/page-d2e1d1f6b50f7498.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/app/(protected)/admin/users/loading-8ab81494dd76c76b.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/app/(protected)/admin/users/page-bfee9edaa8677978.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/app/(protected)/dashboard/loading-3194020f1d1e0be2.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/app/(protected)/dashboard/page-c0e884304028d9d3.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/app/(protected)/dashboard/records/loading-a84f12bb7a95ccbe.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/app/(protected)/dashboard/records/page-0f744a8e1caf897e.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/app/(protected)/dashboard/scrape/loading-9632f72e818f3e03.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/app/(protected)/dashboard/scrape/markdown/loading-8b8460129cc90b8e.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/app/(protected)/dashboard/scrape/markdown/page-3d67e1fd54d56cd4.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/app/(protected)/dashboard/scrape/meta-info/loading-95ba21083227762a.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/app/(protected)/dashboard/scrape/meta-info/page-231621a1ea86e149.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/app/(protected)/dashboard/scrape/page-16aaee7258379007.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/app/(protected)/dashboard/scrape/qrcode/loading-7fa037fca5cf9ffd.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/app/(protected)/dashboard/scrape/qrcode/page-38ae9e4f7f2b4917.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/app/(protected)/dashboard/scrape/screenshot/loading-6118431b0fe6fb9a.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/app/(protected)/dashboard/scrape/screenshot/page-8a12ecab9b0c33b5.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/app/(protected)/dashboard/settings/loading-f709547ad4dfc8fd.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/app/(protected)/dashboard/settings/page-2716617f83ba6cd7.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/app/(protected)/dashboard/urls/loading-29795e0cdb30579a.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/app/(protected)/dashboard/urls/page-31467c4aec3a6da7.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/app/(protected)/layout-7bd55e96b10d187c.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/app/_not-found/page-daa34574791408f5.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/app/chat/layout-cff4d5ab6fd92794.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/app/chat/loading-d6f1b19ae4ffa996.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/app/chat/page-2075d07b7ef24794.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/app/emails/layout-0adcdebb603898d1.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/app/emails/loading-b97deef9df6bc2f9.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/app/emails/page-12eaff45c79464e6.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/app/layout-aa1553734c40ad19.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/app/not-found-f63b66c698305b83.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/app/password-prompt/layout-9f58a2a175509179.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/app/password-prompt/loading-7606ab971d8f9c78.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/app/password-prompt/page-a088d73ee2017dc7.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/ba634aa8-4cec903169236942.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/db206de2-aac614a3ce7bab9d.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/ef956ed8.c4c1ce487e6e4c3b.js",revision:"c4c1ce487e6e4c3b"},{url:"/_next/static/chunks/framework-20afca218c33ed8b.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/main-38f36e477a72f9a3.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/main-app-571fe4d9916d1d2b.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/pages/_app-6eec5c984b7548b1.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/pages/_error-cffe1ad5943208e4.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/polyfills-42372ed130431b0a.js",revision:"846118c33b2c0e922d7b3a7676f81f6f"},{url:"/_next/static/chunks/webpack-c211471883aae3aa.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/css/26f2d9014a23aebc.css",revision:"26f2d9014a23aebc"},{url:"/_next/static/css/45a6a8d6489d6174.css",revision:"45a6a8d6489d6174"},{url:"/_next/static/css/8aee48eb52f4c731.css",revision:"8aee48eb52f4c731"},{url:"/_next/static/css/e6f1d3c8243b4096.css",revision:"e6f1d3c8243b4096"},{url:"/_next/static/media/26a46d62cd723877-s.woff2",revision:"befd9c0fdfa3d8a645d5f95717ed6420"},{url:"/_next/static/media/55c55f0601d81cf3-s.woff2",revision:"43828e14271c77b87e3ed582dbff9f74"},{url:"/_next/static/media/581909926a08bbc8-s.woff2",revision:"f0b86e7c24f455280b8df606b89af891"},{url:"/_next/static/media/6d93bde91c0c2823-s.woff2",revision:"621a07228c8ccbfd647918f1021b4868"},{url:"/_next/static/media/90475aac776488b6-s.p.woff2",revision:"183db31d6365283bef4914042be9dfab"},{url:"/_next/static/media/97e0cb1ae144a2a9-s.woff2",revision:"e360c61c5bd8d90639fd4503c829c2dc"},{url:"/_next/static/media/a34f9d1faa5f3315-s.p.woff2",revision:"d4fe31e6a2aebc06b8d6e558c9141119"},{url:"/_next/static/media/d9396795aa5ec363-s.p.woff2",revision:"70880e42f07b0386e261974cd14820a1"},{url:"/_next/static/media/df0a9ae256c0569c-s.woff2",revision:"d54db44de5ccb18886ece2fda72bdfe0"},{url:"/_static/blog/blog-post-1.jpg",revision:"d91bb1224212bd1a832f99fe7494554f"},{url:"/_static/blog/blog-post-2.jpg",revision:"04442fcb79e9538e65be3476b2b6aa3a"},{url:"/_static/blog/blog-post-3.jpg",revision:"a758717dd624c5900385151290cf378d"},{url:"/_static/blog/blog-post-4.jpg",revision:"135c157ecc4dfcbac1ebe27a04f40d84"},{url:"/_static/docs/gg-auth-config.jpg",revision:"8e10e48df3a501dc502c36bb581b7247"},{url:"/_static/docs/link/disabled.svg",revision:"cbad92372683a3f9dd8ef50de2260671"},{url:"/_static/docs/link/error-404.svg",revision:"d615612fce1b8a1436dae35bf36023a2"},{url:"/_static/docs/link/error.svg",revision:"16eef297f91340059a082e8400315cbf"},{url:"/_static/docs/link/expired.svg",revision:"2e066f0b45e25175fb716ce6adb60790"},{url:"/_static/docs/link/password-error.svg",revision:"48abd97bfdb089354ff043b760041ed3"},{url:"/_static/docs/link/password.svg",revision:"e8a849a581fc25ae08a8c06da1c06320"},{url:"/_static/docs/r2-domain.png",revision:"a5855dba9a2793cffdd14b06c9b266a9"},{url:"/_static/examples/vercel_01.png",revision:"b9ec020bc5de0489ea314526dc1f4a38"},{url:"/_static/examples/vercel_02.png",revision:"a5a0dfb0b257becb83e6b70cbccc4490"},{url:"/_static/examples/vercel_03.png",revision:"e002acbc83d08aa0e9a650a71d1d02da"},{url:"/_static/examples/zeabur_01.png",revision:"06be65f37902549a587de901020a79f6"},{url:"/_static/examples/zeabur_02.png",revision:"d202334b902359133a9283c5500b20f2"},{url:"/_static/examples/zeabur_03.png",revision:"071418bf8c5046459e675d024e90b90b"},{url:"/_static/fonts/BAHAMASB.woff",revision:"19c1033177bfe869798e41c1d65c37d9"},{url:"/_static/fonts/BAHAMASN.woff",revision:"e5d96cc42c5bc3f5ae3302f9cdef6c9b"},{url:"/_static/illustrations/call-waiting.svg",revision:"bc1d08db6006f643c596558a8ce2115e"},{url:"/_static/illustrations/rocket-crashed.svg",revision:"f1404f635f3e5b8802646d01a0d46cbb"},{url:"/_static/images/dark-preview.png",revision:"d7093683aa7e5af23221dadaf49ede30"},{url:"/_static/images/example_01.png",revision:"1d2699ca9873d6daafdd41979e28b1c7"},{url:"/_static/images/example_02.png",revision:"cd9115f8c6c34ab8433510080e3f26dd"},{url:"/_static/images/example_03.png",revision:"9e3d01f11f45250445970f3f05bda52d"},{url:"/_static/images/light-preview.png",revision:"41b076e5d40d2382934bee8af8b483bc"},{url:"/_static/images/linuxdo.png",revision:"8f5868732c21463c570d75b36b43f62a"},{url:"/_static/images/linuxdo.webp",revision:"8f5868732c21463c570d75b36b43f62a"},{url:"/_static/images/password.png",revision:"603c0a0c8d10a9e81c422eba1ada41c0"},{url:"/_static/images/x-preview.png",revision:"26d9863ac8c1b935952432b5e79c9a81"},{url:"/_static/landing/domain.svg",revision:"c4be3f261dfb1e4c61b7f30abb409f99"},{url:"/_static/landing/email.svg",revision:"9354fe80bbc5421ff640b36017e7af29"},{url:"/_static/landing/hosting.svg",revision:"7849257e1bcc8a86937f2bcc40d3f867"},{url:"/_static/landing/info.svg",revision:"561ecee752d14d4d0b36be16e213f2d1"},{url:"/_static/landing/link.svg",revision:"dd87c312fd827b2e6734d3e7bf53defe"},{url:"/_static/landing/mailbox.svg",revision:"f7e75f4cbbf10db07f72b3ce8f334bcd"},{url:"/_static/landing/screenshot.svg",revision:"153ab26682a679fee86dc68e2889172f"},{url:"/_static/logo.png",revision:"4c7bd029735bc3a7896a5ab1d689c949"},{url:"/_static/logo.svg",revision:"44cc28924d5edf3bde71f92e39348312"},{url:"/_static/og.jpg",revision:"a4b52bc6e3ffacbf6ea33ce23a37da8f"},{url:"/_static/wr.png",revision:"45189df007a8b89e4914fa9a6c47ccc7"},{url:"/_static/wrdo.png",revision:"d6edf9a7e97b6408e5aa3a69f2374f10"},{url:"/favicon.ico",revision:"4c7bd029735bc3a7896a5ab1d689c949"},{url:"/llms.txt",revision:"beb0322b35b77077ac55b38e0c03d303"},{url:"/manifest.json",revision:"bc7cf2817813a67c5c3f841a3a54d1aa"},{url:"/robots.txt",revision:"001eed25907c33863f2e60dfe3620dfd"},{url:"/site.webmanifest",revision:"bc7cf2817813a67c5c3f841a3a54d1aa"},{url:"/sitemap-0.xml",revision:"9b41a6f0d305a5ad924906a8f155097f"},{url:"/sitemap.xml",revision:"175031181630b79b72c538659e0fe91c"}],{ignoreURLParametersMatching:[]}),e.cleanupOutdatedCaches(),e.registerRoute("/",new e.NetworkFirst({cacheName:"start-url",plugins:[{cacheWillUpdate:async({request:e,response:i,event:s,state:a})=>i&&"opaqueredirect"===i.type?new Response(i.body,{status:200,statusText:"OK",headers:i.headers}):i}]}),"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 i=e.pathname;return!i.startsWith("/api/auth/")&&!!i.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/public/sw.js.map b/public/sw.js.map deleted file mode 100644 index 8f16fe4..0000000 --- a/public/sw.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"sw.js","sources":["../../../../../../private/var/folders/9b/3qmyp8zd2xvdspdrp149fyg00000gn/T/afe9c4c3006025fb7f0a64cab65de247/sw.js"],"sourcesContent":["import {registerRoute as workbox_routing_registerRoute} from '/Users/songjunxi/Desktop/repos/wrdo-app/wr.do/node_modules/.pnpm/workbox-routing@6.6.0/node_modules/workbox-routing/registerRoute.mjs';\nimport {NetworkFirst as workbox_strategies_NetworkFirst} from '/Users/songjunxi/Desktop/repos/wrdo-app/wr.do/node_modules/.pnpm/workbox-strategies@6.6.0/node_modules/workbox-strategies/NetworkFirst.mjs';\nimport {NetworkOnly as workbox_strategies_NetworkOnly} from '/Users/songjunxi/Desktop/repos/wrdo-app/wr.do/node_modules/.pnpm/workbox-strategies@6.6.0/node_modules/workbox-strategies/NetworkOnly.mjs';\nimport {clientsClaim as workbox_core_clientsClaim} from '/Users/songjunxi/Desktop/repos/wrdo-app/wr.do/node_modules/.pnpm/workbox-core@6.6.0/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":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAgBAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAa,EAEZ,CAAA;EAQDC,CAAI,CAAA,CAAA,CAAA,CAACC,CAAW,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAA;AAElBC,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAyB,EAAE,CAAA;AAI3BC,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAA6B,CAAC,CAAA,CAAA,CAAG,CAAE,CAAA,CAAA,CAAA,CAAA,CAAIC,oBAA+B,CAAC,CAAA;EAAE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAW,EAAC,CAAW,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;EAAEC,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAO,EAAE,CAAC,CAAA;GAAEC,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAe,EAAE,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;QAAEC,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;QAAEC,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;QAAEC,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA;AAAEC,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA;AAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA;EAAE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAIF,QAAQ,CAAIA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAQ,CAACG,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,gBAAgB,CAAE,CAAA,CAAA;AAAE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,OAAO,CAAIC,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAQ,CAACJ,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAACK,IAAI,CAAE,CAAA,CAAA;EAAEC,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAM,EAAE,CAAG,CAAA,CAAA,CAAA;EAAEC,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAU,EAAE,CAAI,CAAA,CAAA,CAAA,CAAA;YAAEC,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAER,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAACQ,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA;AAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAA;EAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;EAAE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAOR,QAAQ,CAAA;EAAC,CAAA,CAAA,CAAA,CAAA,CAAA;KAAG,CAAA;AAAE,CAAA,CAAA,CAAC,CAAC,CAAA,CAAE,CAAK,CAAA,CAAA,CAAA,CAAA,CAAC,CAAA;AACxWL,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAA6B,CAAC,CAAA,CAAA,CAAA,CAAA,CAAK,CAAE,CAAA,CAAA,CAAA,CAAA,CAAIc,mBAA8B,CAAC,CAAA;EAAE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAW,EAAC,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA;EAAEZ,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAO,EAAE,CAAA,CAAA;EAAG,CAAC,CAAC,CAAE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAC,CAAA;;"} \ No newline at end of file diff --git a/public/workbox-8817a5e5.js b/public/workbox-8817a5e5.js deleted file mode 100644 index d4d3c9f..0000000 --- a/public/workbox-8817a5e5.js +++ /dev/null @@ -1,2456 +0,0 @@ -define(['exports'], (function (exports) { 'use strict'; - - // @ts-ignore - try { - self['workbox:core:6.5.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 globalThis)) { - self.__WB_DISABLE_DEV_LOGS = false; - } - let inGroup = false; - const methodToColorMap = { - debug: `#7f8c8d`, - log: `#2ecc71`, - warn: `#f39c12`, - error: `#c0392b`, - groupCollapsed: `#3498db`, - groupEnd: null // No colored prefix on groupEnd - }; - 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}.`; - }, - 'opaque-streams-source': ({ - type - }) => { - const message = `One of the workbox-streams sources resulted in an ` + `'${type}' response.`; - if (type === 'opaqueredirect') { - return `${message} Please do not use a navigation request that results ` + `in a redirect as a source.`; - } - return `${message} Please ensure your sources are CORS-enabled.`; - } - }; - - /* - 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 - }; - - // @ts-ignore - try { - self['workbox:routing:6.5.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 workbox-routing - */ - class Route { - /** - * Constructor for Route class. - * - * @param {workbox-routing~matchCallback} match - * A callback function that determines whether the route matches a given - * `fetch` event by returning a non-falsy value. - * @param {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 {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 - * {@link 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. - * - * @memberof workbox-routing - * @extends 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 - * {@link workbox-routing~handlerCallback} `params` - * argument. - * - * @param {RegExp} regExp The regular expression to match against URLs. - * @param {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` using one or more - * {@link workbox-routing.Route}, responding with a `Response` 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 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' - // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access - if (event.data && event.data.type === 'CACHE_URLS') { - // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment - const { - payload - } = event.data; - { - logger.debug(`Caching URLs from the window`, payload.urlsToCache); - } - const requestPromises = Promise.all(payload.urlsToCache.map(entry => { - if (typeof entry === 'string') { - entry = [entry]; - } - const request = new Request(...entry); - return this.handleRequest({ - request, - event - }); - // TODO(philipwalton): TypeScript errors without this typecast for - // some reason (probably a bug). The real type here should work but - // doesn't: `Array | undefined>`. - })); // TypeScript - event.waitUntil(requestPromises); - // If a MessageChannel was used, reply to the message on success. - if (event.ports && event.ports[0]) { - 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 {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 {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 {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 {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 {@link workbox-routing.Router#registerRoute}. - * - * @param {RegExp|string|workbox-routing.Route~matchCallback|workbox-routing.Route} capture - * If the capture param is a `Route`, all other arguments will be ignored. - * @param {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 {workbox-routing.Route} The generated `Route`. - * - * @memberof 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; - } - - // @ts-ignore - try { - self['workbox:strategies:6.5.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. - */ - // Callbacks to be executed whenever there's a quota error. - // 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 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 - * {@link workbox-strategies.Strategy~handle} or - * {@link 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 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 {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] The return value from the - * {@link 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 workbox-strategies.StrategyHandler - */ - /** - * The event associated with this request. - * @name event - * @instance - * @type {ExtendableEvent} - * @memberof 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 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 - * {@link workbox-routing~matchCallback} returned - * a truthy value (it will be that value). - * @name params - * @instance - * @type {*|undefined} - * @memberof 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) { - const key = `${request.url} | ${mode}`; - if (!this._cacheKeys[key]) { - 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 // eslint-disable-line - })); - } - this._cacheKeys[key] = effectiveRequest; - } - return this._cacheKeys[key]; - } - /** - * 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 - * {@link 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 - * {@link 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 - * {@link 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 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 - * {@link 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 - * {@link 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 - * {@link 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 {@link 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 {@link 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 {workbox-strategies.StrategyHandler} handler - * @return {Promise} - * - * @memberof 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](https://developer.chrome.com/docs/workbox/caching-strategies-overview/#network-first-falling-back-to-cache) - * request strategy. - * - * By default, this strategy will cache responses with a 200 status code as - * well as [opaque responses](https://developer.chrome.com/docs/workbox/caching-resources-during-runtime/#opaque-responses). - * Opaque responses are are cross-origin requests where the response doesn't - * support [CORS](https://enable-cors.org/). - * - * If the network request fails, and there is no cache match, this will throw - * a `WorkboxError` exception. - * - * @extends workbox-strategies.Strategy - * @memberof 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 - * {@link 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 {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](https://developer.chrome.com/docs/workbox/caching-strategies-overview/#network-only) - * request strategy. - * - * This class is useful if you want to take advantage of any - * [Workbox plugins](https://developer.chrome.com/docs/workbox/using-plugins/). - * - * If the network request fails, this will throw a `WorkboxError` exception. - * - * @extends workbox-strategies.Strategy - * @memberof 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 {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 workbox-core - */ - function clientsClaim() { - self.addEventListener('activate', () => self.clients.claim()); - } - - exports.NetworkFirst = NetworkFirst; - exports.NetworkOnly = NetworkOnly; - exports.clientsClaim = clientsClaim; - exports.registerRoute = registerRoute; - -})); -//# sourceMappingURL=workbox-8817a5e5.js.map diff --git a/public/workbox-8817a5e5.js.map b/public/workbox-8817a5e5.js.map deleted file mode 100644 index 484021e..0000000 --- a/public/workbox-8817a5e5.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"workbox-8817a5e5.js","sources":["node_modules/.pnpm/workbox-core@6.6.0/node_modules/workbox-core/_version.js","node_modules/.pnpm/workbox-core@6.6.0/node_modules/workbox-core/_private/logger.js","node_modules/.pnpm/workbox-core@6.6.0/node_modules/workbox-core/models/messages/messages.js","node_modules/.pnpm/workbox-core@6.6.0/node_modules/workbox-core/models/messages/messageGenerator.js","node_modules/.pnpm/workbox-core@6.6.0/node_modules/workbox-core/_private/WorkboxError.js","node_modules/.pnpm/workbox-core@6.6.0/node_modules/workbox-core/_private/assert.js","node_modules/.pnpm/workbox-routing@6.6.0/node_modules/workbox-routing/_version.js","node_modules/.pnpm/workbox-routing@6.6.0/node_modules/workbox-routing/utils/constants.js","node_modules/.pnpm/workbox-routing@6.6.0/node_modules/workbox-routing/utils/normalizeHandler.js","node_modules/.pnpm/workbox-routing@6.6.0/node_modules/workbox-routing/Route.js","node_modules/.pnpm/workbox-routing@6.6.0/node_modules/workbox-routing/RegExpRoute.js","node_modules/.pnpm/workbox-core@6.6.0/node_modules/workbox-core/_private/getFriendlyURL.js","node_modules/.pnpm/workbox-routing@6.6.0/node_modules/workbox-routing/Router.js","node_modules/.pnpm/workbox-routing@6.6.0/node_modules/workbox-routing/utils/getOrCreateDefaultRouter.js","node_modules/.pnpm/workbox-routing@6.6.0/node_modules/workbox-routing/registerRoute.js","node_modules/.pnpm/workbox-strategies@6.6.0/node_modules/workbox-strategies/_version.js","node_modules/.pnpm/workbox-strategies@6.6.0/node_modules/workbox-strategies/plugins/cacheOkAndOpaquePlugin.js","node_modules/.pnpm/workbox-core@6.6.0/node_modules/workbox-core/_private/cacheNames.js","node_modules/.pnpm/workbox-core@6.6.0/node_modules/workbox-core/_private/cacheMatchIgnoreParams.js","node_modules/.pnpm/workbox-core@6.6.0/node_modules/workbox-core/_private/Deferred.js","node_modules/.pnpm/workbox-core@6.6.0/node_modules/workbox-core/models/quotaErrorCallbacks.js","node_modules/.pnpm/workbox-core@6.6.0/node_modules/workbox-core/_private/executeQuotaErrorCallbacks.js","node_modules/.pnpm/workbox-core@6.6.0/node_modules/workbox-core/_private/timeout.js","node_modules/.pnpm/workbox-strategies@6.6.0/node_modules/workbox-strategies/StrategyHandler.js","node_modules/.pnpm/workbox-strategies@6.6.0/node_modules/workbox-strategies/Strategy.js","node_modules/.pnpm/workbox-strategies@6.6.0/node_modules/workbox-strategies/utils/messages.js","node_modules/.pnpm/workbox-strategies@6.6.0/node_modules/workbox-strategies/NetworkFirst.js","node_modules/.pnpm/workbox-strategies@6.6.0/node_modules/workbox-strategies/NetworkOnly.js","node_modules/.pnpm/workbox-core@6.6.0/node_modules/workbox-core/clientsClaim.js"],"sourcesContent":["\"use strict\";\n// @ts-ignore\ntry {\n self['workbox:core:6.5.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'\n ? null\n : (() => {\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 globalThis)) {\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, // No colored prefix on groupEnd\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 ||\n !paramName ||\n !moduleName ||\n !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 ` + `'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 ` + `'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 'opaque-streams-source': ({ type }) => {\n const message = `One of the workbox-streams sources resulted in an ` +\n `'${type}' response.`;\n if (type === 'opaqueredirect') {\n return (`${message} Please do not use a navigation request that results ` +\n `in a redirect as a source.`);\n }\n return `${message} Please ensure your sources are CORS-enabled.`;\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' ? 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'] = `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'\n ? null\n : {\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.5.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 workbox-routing\n */\nclass Route {\n /**\n * Constructor for Route class.\n *\n * @param {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 {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 {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 * {@link 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 * @memberof workbox-routing\n * @extends 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 * {@link workbox-routing~handlerCallback} `params`\n * argument.\n *\n * @param {RegExp} regExp The regular expression to match against URLs.\n * @param {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` using one or more\n * {@link workbox-routing.Route}, responding with a `Response` 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 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 // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n if (event.data && event.data.type === 'CACHE_URLS') {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n const { payload } = event.data;\n if (process.env.NODE_ENV !== 'production') {\n logger.debug(`Caching URLs from the window`, payload.urlsToCache);\n }\n const requestPromises = Promise.all(payload.urlsToCache.map((entry) => {\n if (typeof entry === 'string') {\n entry = [entry];\n }\n const request = new Request(...entry);\n return this.handleRequest({ request, event });\n // TODO(philipwalton): TypeScript errors without this typecast for\n // some reason (probably a bug). The real type here should work but\n // doesn't: `Array | undefined>`.\n })); // TypeScript\n event.waitUntil(requestPromises);\n // If a MessageChannel was used, reply to the message on success.\n if (event.ports && event.ports[0]) {\n 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([`Found a route to handle this request:`, route]);\n if (params) {\n debugMessages.push([\n `Passing the following params to the route's handler:`,\n 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 &&\n (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 {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 {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 {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 {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 {@link workbox-routing.Router#registerRoute}.\n *\n * @param {RegExp|string|workbox-routing.Route~matchCallback|workbox-routing.Route} capture\n * If the capture param is a `Route`, all other arguments will be ignored.\n * @param {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 {workbox-routing.Route} The generated `Route`.\n *\n * @memberof 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\n : 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.5.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 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 * {@link workbox-strategies.Strategy~handle} or\n * {@link 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 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 {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] The return value from the\n * {@link workbox-routing~matchCallback} (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 workbox-strategies.StrategyHandler\n */\n /**\n * The event associated with this request.\n * @name event\n * @instance\n * @type {ExtendableEvent}\n * @memberof 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 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 * {@link workbox-routing~matchCallback} returned\n * a truthy value (it will be that value).\n * @name params\n * @instance\n * @type {*|undefined}\n * @memberof 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()\n : 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', {\n thrownErrorMessage: err.message,\n });\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' ? 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 =\n (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\n ? 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 ? 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 const key = `${request.url} | ${mode}`;\n if (!this._cacheKeys[key]) {\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, // eslint-disable-line\n }));\n }\n this._cacheKeys[key] = effectiveRequest;\n }\n return this._cacheKeys[key];\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 * {@link 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 * {@link 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 * {@link 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 =\n (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 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 * {@link 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 * {@link 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 * {@link 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 {@link 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 {@link 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 {workbox-strategies.StrategyHandler} handler\n * @return {Promise}\n *\n * @memberof 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](https://developer.chrome.com/docs/workbox/caching-strategies-overview/#network-first-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](https://developer.chrome.com/docs/workbox/caching-resources-during-runtime/#opaque-responses).\n * Opaque responses are are cross-origin requests where the response doesn't\n * support [CORS](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 workbox-strategies.Strategy\n * @memberof 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 * {@link 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 {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({\n timeoutId,\n request,\n logs,\n handler,\n });\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}'` + ` 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](https://developer.chrome.com/docs/workbox/caching-strategies-overview/#network-only)\n * request strategy.\n *\n * This class is useful if you want to take advantage of any\n * [Workbox plugins](https://developer.chrome.com/docs/workbox/using-plugins/).\n *\n * If the network request fails, this will throw a `WorkboxError` exception.\n *\n * @extends workbox-strategies.Strategy\n * @memberof 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 {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 = [\n handler.fetch(request),\n ];\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 workbox-core\n */\nfunction clientsClaim() {\n self.addEventListener('activate', () => self.clients.claim());\n}\nexport { clientsClaim };\n"],"names":["self","_","e","logger","globalThis","__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","invalid-value","paramName","validValueDescription","value","Error","JSON","stringify","not-an-array","moduleName","className","funcName","incorrect-type","expectedType","classNameStr","incorrect-class","expectedClassName","isReturnValueProblem","missing-a-method","expectedMethod","add-to-cache-list-unexpected-type","entry","add-to-cache-list-conflicting-entries","firstEntry","secondEntry","plugin-error-request-will-fetch","thrownErrorMessage","invalid-cache-name","cacheNameId","unregister-route-but-not-found-with-method","unregister-route-route-not-registered","queue-replay-failed","name","duplicate-queue-name","expired-test-without-max-age","methodName","unsupported-route-type","not-array-of-class","expectedClass","max-entries-or-age-required","statuses-or-headers-required","invalid-string","channel-name-required","invalid-responses-are-same-args","expire-custom-caches-only","unit-must-be-bytes","normalizedRangeHeader","single-range-only","invalid-range-values","no-range-header","range-not-satisfiable","size","start","end","attempt-to-cache-non-get-request","url","cache-put-with-no-response","no-response","message","bad-precaching-response","status","non-precached-url","add-to-cache-list-conflicting-integrities","missing-precache-entry","cacheName","cross-origin-copy-response","origin","opaque-streams-source","type","generatorFunction","code","details","messageGenerator","WorkboxError","constructor","errorCode","isArray","Array","hasMethod","object","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/public/workbox-e9849328.js b/public/workbox-e9849328.js new file mode 100644 index 0000000..faeb758 --- /dev/null +++ b/public/workbox-e9849328.js @@ -0,0 +1 @@ +define(["exports"],(function(t){"use strict";try{self["workbox:core:6.5.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.5.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.5.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.m=[...t.plugins],this.R=new Map;for(const t of this.m)this.R.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.v(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){const s=`${t.url} | ${e}`;if(!this.h[s]){let n=t;for(const t of this.iterateCallbacks("cacheKeyWillBeUsed"))n=m(await t({mode:e,request:n,event:this.event,params:this.params}));this.h[s]=n}return this.h[s]}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.R.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 v(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.q(r,s,e);return[i,this.D(i,r,s,e)]}async q(t,e,n){let r;await t.runCallbacks("handlerWillStart",{event:n,request:e});try{if(r=await this.U(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 D(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?Object.assign.bind():function(t){for(var e=1;ee.some((e=>t instanceof e));let U,x;const L=new WeakMap,I=new WeakMap,C=new WeakMap,E=new WeakMap,N=new WeakMap;let O={get(t,e,s){if(t instanceof IDBTransaction){if("done"===e)return I.get(t);if("objectStoreNames"===e)return t.objectStoreNames||C.get(t);if("store"===e)return s.objectStoreNames[1]?void 0:s.objectStore(s.objectStoreNames[0])}return B(t[e])},set:(t,e,s)=>(t[e]=s,!0),has:(t,e)=>t instanceof IDBTransaction&&("done"===e||"store"===e)||e in t};function T(t){return t!==IDBDatabase.prototype.transaction||"objectStoreNames"in IDBTransaction.prototype?(x||(x=[IDBCursor.prototype.advance,IDBCursor.prototype.continue,IDBCursor.prototype.continuePrimaryKey])).includes(t)?function(...e){return t.apply(P(this),e),B(L.get(this))}:function(...e){return B(t.apply(P(this),e))}:function(e,...s){const n=t.call(P(this),e,...s);return C.set(n,e.sort?e.sort():[e]),B(n)}}function k(t){return"function"==typeof t?T(t):(t instanceof IDBTransaction&&function(t){if(I.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)}));I.set(t,e)}(t),D(t,U||(U=[IDBDatabase,IDBObjectStore,IDBIndex,IDBCursor,IDBTransaction]))?new Proxy(t,O):t)}function B(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(B(t.result)),n()},i=()=>{s(t.error),n()};t.addEventListener("success",r),t.addEventListener("error",i)}));return e.then((e=>{e instanceof IDBCursor&&L.set(e,t)})).catch((()=>{})),N.set(e,t),e}(t);if(E.has(t))return E.get(t);const e=k(t);return e!==t&&(E.set(t,e),N.set(e,t)),e}const P=t=>N.get(t);const M=["get","getKey","getAll","getAllKeys","count"],W=["put","add","delete","clear"],j=new Map;function S(t,e){if(!(t instanceof IDBDatabase)||e in t||"string"!=typeof e)return;if(j.get(e))return j.get(e);const s=e.replace(/FromIndex$/,""),n=e!==s,r=W.includes(s);if(!(s in(n?IDBIndex:IDBObjectStore).prototype)||!r&&!M.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 j.set(e,i),i}O=(t=>q({},t,{get:(e,s,n)=>S(e,s)||t.get(e,s,n),has:(e,s)=>!!S(e,s)||t.has(e,s)}))(O);try{self["workbox:expiration:6.5.4"]&&_()}catch(t){}const K="cache-entries",A=t=>{const e=new URL(t,location.href);return e.hash="",e.href};class F{constructor(t){this._=null,this.L=t}I(t){const e=t.createObjectStore(K,{keyPath:"id"});e.createIndex("cacheName","cacheName",{unique:!1}),e.createIndex("timestamp","timestamp",{unique:!1})}C(t){this.I(t),this.L&&function(t,{blocked:e}={}){const s=indexedDB.deleteDatabase(t);e&&s.addEventListener("blocked",(t=>e(t.oldVersion,t))),B(s).then((()=>{}))}(this.L)}async setTimestamp(t,e){const s={url:t=A(t),timestamp:e,cacheName:this.L,id:this.N(t)},n=(await this.getDb()).transaction(K,"readwrite",{durability:"relaxed"});await n.store.put(s),await n.done}async getTimestamp(t){const e=await this.getDb(),s=await e.get(K,this.N(t));return null==s?void 0:s.timestamp}async expireEntries(t,e){const s=await this.getDb();let n=await s.transaction(K).store.index("timestamp").openCursor(null,"prev");const r=[];let i=0;for(;n;){const s=n.value;s.cacheName===this.L&&(t&&s.timestamp=e?r.push(n.value):i++),n=await n.continue()}const a=[];for(const t of r)await s.delete(K,t.id),a.push(t.url);return a}N(t){return this.L+"|"+A(t)}async getDb(){return this._||(this._=await function(t,e,{blocked:s,upgrade:n,blocking:r,terminated:i}={}){const a=indexedDB.open(t,e),o=B(a);return n&&a.addEventListener("upgradeneeded",(t=>{n(B(a.result),t.oldVersion,t.newVersion,B(a.transaction),t)})),s&&a.addEventListener("blocked",(t=>s(t.oldVersion,t.newVersion,t))),o.then((t=>{i&&t.addEventListener("close",(()=>i())),r&&t.addEventListener("versionchange",(t=>r(t.oldVersion,t.newVersion,t)))})).catch((()=>{})),o}("workbox-expiration",1,{upgrade:this.C.bind(this)})),this._}}class H{constructor(t,e={}){this.O=!1,this.T=!1,this.k=e.maxEntries,this.B=e.maxAgeSeconds,this.P=e.matchOptions,this.L=t,this.M=new F(t)}async expireEntries(){if(this.O)return void(this.T=!0);this.O=!0;const t=this.B?Date.now()-1e3*this.B:0,e=await this.M.expireEntries(t,this.k),s=await self.caches.open(this.L);for(const t of e)await s.delete(t,this.P);this.O=!1,this.T&&(this.T=!1,b(this.expireEntries()))}async updateTimestamp(t){await this.M.setTimestamp(t,Date.now())}async isURLExpired(t){if(this.B){const e=await this.M.getTimestamp(t),s=Date.now()-1e3*this.B;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 z(t,e){const s=e();return t.waitUntil(s),s}try{self["workbox:precaching:6.5.4"]&&_()}catch(t){}function G(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 V{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 J{constructor({precacheController:t}){this.cacheKeyWillBeUsed=async({request:t,params:e})=>{const s=(null==e?void 0:e.cacheKey)||this.W.getCacheKeyForURL(t.url);return s?new Request(s,{headers:t.headers}):t},this.W=t}}let Q,X;async function Y(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===Q){const t=new Response("");if("body"in t)try{new Response(t.body),Q=!0}catch(t){Q=!1}Q=!1}return Q}()?r.body:await r.blob();return new Response(o,a)}class Z extends v{constructor(t={}){t.cacheName=w(t.cacheName),super(t),this.j=!1!==t.fallbackToNetwork,this.plugins.push(Z.copyRedirectedCacheableResponsesPlugin)}async U(t,e){const s=await e.cacheMatch(t);return s||(e.event&&"install"===e.event.type?await this.S(t,e):await this.K(t,e))}async K(t,e){let n;const r=e.params||{};if(!this.j)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:"no-cors"!==t.mode?i||s:void 0})),s&&a&&"no-cors"!==t.mode&&(this.A(),await e.cachePut(t,n.clone()))}return n}async S(t,e){this.A();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}A(){let t=null,e=0;for(const[s,n]of this.plugins.entries())n!==Z.copyRedirectedCacheableResponsesPlugin&&(n===Z.defaultPrecacheCacheabilityPlugin&&(t=s),n.cacheWillUpdate&&e++);0===e?this.plugins.push(Z.defaultPrecacheCacheabilityPlugin):e>1&&null!==t&&this.plugins.splice(t,1)}}Z.defaultPrecacheCacheabilityPlugin={cacheWillUpdate:async({response:t})=>!t||t.status>=400?null:t},Z.copyRedirectedCacheableResponsesPlugin={cacheWillUpdate:async({response:t})=>t.redirected?await Y(t):t};class tt{constructor({cacheName:t,plugins:e=[],fallbackToNetwork:s=!0}={}){this.F=new Map,this.H=new Map,this.$=new Map,this.u=new Z({cacheName:w(t),plugins:[...e,new J({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.G||(self.addEventListener("install",this.install),self.addEventListener("activate",this.activate),this.G=!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}=G(n),i="string"!=typeof n&&n.revision?"reload":"default";if(this.F.has(r)&&this.F.get(r)!==t)throw new s("add-to-cache-list-conflicting-entries",{firstEntry:this.F.get(r),secondEntry:t});if("string"!=typeof n&&n.integrity){if(this.$.has(t)&&this.$.get(t)!==n.integrity)throw new s("add-to-cache-list-conflicting-integrities",{url:r});this.$.set(t,n.integrity)}if(this.F.set(r,t),this.H.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 z(t,(async()=>{const e=new V;this.strategy.plugins.push(e);for(const[e,s]of this.F){const n=this.$.get(s),r=this.H.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 z(t,(async()=>{const t=await self.caches.open(this.strategy.cacheName),e=await t.keys(),s=new Set(this.F.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.F}getCachedURLs(){return[...this.F.keys()]}getCacheKeyForURL(t){const e=new URL(t,location.href);return this.F.get(e.href)}getIntegrityForCacheKey(t){return this.$.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 et=()=>(X||(X=new tt),X);class st 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 U(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.V(n),i=this.J(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.J(t);await s.updateTimestamp(e.url),await s.expireEntries()},this.X=t,this.B=t.maxAgeSeconds,this.Y=new Map,t.purgeOnQuotaError&&function(t){g.add(t)}((()=>this.deleteCacheAndMetadata()))}J(t){if(t===d())throw new s("expire-custom-caches-only");let e=this.Y.get(t);return e||(e=new H(t,this.X),this.Y.set(t,e)),e}V(t){if(!this.B)return!0;const e=this.Z(t);if(null===e)return!0;return e>=Date.now()-1e3*this.B}Z(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.Y)await self.caches.delete(t),await e.delete();this.Y=new Map}},t.NetworkFirst=class extends v{constructor(t={}){super(t),this.plugins.some((t=>"cacheWillUpdate"in t))||this.plugins.unshift(u),this.tt=t.networkTimeoutSeconds||0}async U(t,e){const n=[],r=[];let i;if(this.tt){const{id:s,promise:a}=this.et({request:t,logs:n,handler:e});i=s,r.push(a)}const a=this.st({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}et({request:t,logs:e,handler:s}){let n;return{promise:new Promise((e=>{n=setTimeout((async()=>{e(await s.cacheMatch(t))}),1e3*this.tt)})),id:n}}async st({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 $(t,e):e}},t.StaleWhileRevalidate=class extends v{constructor(t={}){super(t),this.plugins.some((t=>"cacheWillUpdate"in t))||this.plugins.unshift(u)}async U(t,e){const n=e.fetchAndCachePut(t).catch((()=>{}));e.waitUntil(n);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){et().precache(t)}(t),function(t){const e=et();h(new st(e,t))}(e)},t.registerRoute=h})); From 8a05fa09070640dab607c105b157922466be378e Mon Sep 17 00:00:00 2001 From: oiov Date: Tue, 20 May 2025 22:46:13 +0800 Subject: [PATCH 2/3] feat: support multi domain configuration and management features (database) --- .env.example | 10 - app/(protected)/admin/domains/domain-list.tsx | 364 +++ app/(protected)/admin/domains/loading.tsx | 12 + app/(protected)/admin/domains/page.tsx | 41 + app/(protected)/admin/users/user-list.tsx | 1 - .../dashboard/records/record-list.tsx | 2 +- app/(protected)/dashboard/urls/url-list.tsx | 2 +- app/api/admin/domain/route.ts | 147 + app/api/domain/route.ts | 31 + app/api/record/add/route.ts | 33 +- app/api/record/admin/add/route.ts | 26 +- app/api/record/admin/delete/route.ts | 28 +- app/api/record/admin/route.ts | 3 +- app/api/record/admin/update/route.ts | 26 +- app/api/record/delete/route.ts | 27 +- app/api/record/route.ts | 1 - app/api/record/update/route.ts | 36 +- app/api/url/add/route.ts | 13 + app/api/url/route.ts | 1 - app/api/v1/email/route.ts | 8 +- app/api/v1/short/route.ts | 12 + app/manifest.json | 2 +- components/dashboard/form-section-columns.tsx | 9 +- components/email/EmailSidebar.tsx | 60 +- components/forms/domain-form.tsx | 417 +++ components/forms/record-form.tsx | 59 +- components/forms/url-form.tsx | 104 +- components/shared/icons.tsx | 29 + config/dashboard.ts | 8 +- config/site.ts | 6 - content/docs/developer/cloudflare.mdx | 43 + content/docs/developer/installation.mdx | 9 - content/docs/developer/quick-start.mdx | 65 +- env.mjs | 13 - lib/domainConfig.ts | 36 + lib/dto/domains.ts | 122 + lib/utils.ts | 22 - lib/validations/domain.ts | 17 + package.json | 2 +- .../migrations/20250520104322/migration.sql | 18 + prisma/schema.prisma | 21 + public/_static/docs/domain-form.png | Bin 0 -> 340596 bytes public/manifest.json | 2 +- public/site.webmanifest | 2 +- public/sitemap-0.xml | 72 +- public/sw.js | 102 +- public/sw.js.map | 1 + public/workbox-8817a5e5.js | 2456 +++++++++++++++++ public/workbox-8817a5e5.js.map | 1 + public/workbox-e9849328.js | 1 - types/index.d.ts | 3 - 51 files changed, 4158 insertions(+), 368 deletions(-) create mode 100644 app/(protected)/admin/domains/domain-list.tsx create mode 100644 app/(protected)/admin/domains/loading.tsx create mode 100644 app/(protected)/admin/domains/page.tsx create mode 100644 app/api/admin/domain/route.ts create mode 100644 app/api/domain/route.ts create mode 100644 components/forms/domain-form.tsx create mode 100644 lib/domainConfig.ts create mode 100644 lib/dto/domains.ts create mode 100644 lib/validations/domain.ts create mode 100644 prisma/migrations/20250520104322/migration.sql create mode 100644 public/_static/docs/domain-form.png create mode 100644 public/sw.js.map create mode 100644 public/workbox-8817a5e5.js create mode 100644 public/workbox-8817a5e5.js.map delete mode 100644 public/workbox-e9849328.js diff --git a/.env.example b/.env.example index 379eff4..1116a71 100644 --- a/.env.example +++ b/.env.example @@ -25,14 +25,6 @@ DATABASE_URL='postgres://[user]:[password]@[neon_hostname]/[dbname]?sslmode=requ # ----------------------------------------------------------------------------- RESEND_API_KEY= -# ----------------------------------------------------------------------------- -# Cloudflare -# ----------------------------------------------------------------------------- -NEXT_PUBLIC_CLOUDFLARE_ZONE_NAME=wr.do,uv.do -CLOUDFLARE_ZONE=[{"zone_id":"abc123", "zone_name": "wr.do"},{"zone_id":"abc456", "zone_name": "uv.do"}] -CLOUDFLARE_API_KEY= -CLOUDFLARE_EMAIL= - # Open Signup NEXT_PUBLIC_OPEN_SIGNUP=1 @@ -45,7 +37,5 @@ SCREENSHOTONE_BASE_URL=https://shot.wr.do # GitHub api token for getting gitHub stars count GITHUB_TOKEN= -# Short domains, split by "," -NEXT_PUBLIC_SHORT_DOMAINS=wr.do,uv.do diff --git a/app/(protected)/admin/domains/domain-list.tsx b/app/(protected)/admin/domains/domain-list.tsx new file mode 100644 index 0000000..d913e8b --- /dev/null +++ b/app/(protected)/admin/domains/domain-list.tsx @@ -0,0 +1,364 @@ +"use client"; + +import { useState } from "react"; +import Link from "next/link"; +import { Domain, User } from "@prisma/client"; +import { PenLine, RefreshCwIcon } from "lucide-react"; +import { toast } from "sonner"; +import useSWR, { useSWRConfig } from "swr"; + +import { DomainFormData } from "@/lib/dto/domains"; +import { ShortUrlFormData } from "@/lib/dto/short-urls"; +import { + cn, + expirationTime, + fetcher, + removeUrlSuffix, + timeAgo, +} from "@/lib/utils"; +import { Button } from "@/components/ui/button"; +import { + Card, + CardContent, + CardDescription, + CardHeader, +} from "@/components/ui/card"; +import { Input } from "@/components/ui/input"; +import { Modal } from "@/components/ui/modal"; +import { Skeleton } from "@/components/ui/skeleton"; +import { Switch } from "@/components/ui/switch"; +import { + Table, + TableBody, + TableCell, + TableHead, + TableHeader, + TableRow, +} from "@/components/ui/table"; +import { DomainForm } from "@/components/forms/domain-form"; +import { FormType } from "@/components/forms/record-form"; +import { EmptyPlaceholder } from "@/components/shared/empty-placeholder"; +import { Icons } from "@/components/shared/icons"; +import { PaginationWrapper } from "@/components/shared/pagination"; + +export interface DomainListProps { + user: Pick; + action: string; +} + +function TableColumnSekleton() { + return ( + + + + + + + + + + + + + + + + + + + + + + + + ); +} + +export default function DomainList({ user, action }: DomainListProps) { + const [isShowForm, setShowForm] = useState(false); + const [formType, setFormType] = useState("add"); + const [currentEditDomain, setCurrentEditDomain] = + useState(null); + const [currentPage, setCurrentPage] = useState(1); + const [pageSize, setPageSize] = useState(10); + const [isShowDomainInfo, setShowDomainInfo] = useState(false); + const [selectedDomain, setSelectedDomain] = useState( + null, + ); + const [searchParams, setSearchParams] = useState({ + slug: "", + target: "", + userName: "", + }); + + const { mutate } = useSWRConfig(); + const { data, isLoading } = useSWR<{ + total: number; + list: DomainFormData[]; + }>( + `${action}?page=${currentPage}&size=${pageSize}&slug=${searchParams.slug}&userName=${searchParams.userName}&target=${searchParams.target}`, + fetcher, + ); + + const handleRefresh = () => { + mutate( + `${action}?page=${currentPage}&size=${pageSize}&slug=${searchParams.slug}&userName=${searchParams.userName}&target=${searchParams.target}`, + undefined, + ); + }; + + const handleChangeStatus = async ( + checked: boolean, + target: string, + domain: DomainFormData, + ) => { + const res = await fetch(action, { + method: "PUT", + body: JSON.stringify({ + id: domain.id, + enable_short_link: + target === "enable_short_link" ? checked : domain.enable_short_link, + enable_email: target === "enable_email" ? checked : domain.enable_email, + enable_dns: target === "enable_dns" ? checked : domain.enable_dns, + active: target === "active" ? checked : domain.active, + }), + }); + if (res.ok) { + const data = await res.json(); + if (data) { + toast.success("Successed!"); + } + } else { + toast.error("Activation failed!"); + } + }; + + return ( + <> + + + + Total Domains:{" "} + {data && data.total} + + +
+ + +
+
+ +
+
+ { + setSearchParams({ + ...searchParams, + slug: e.target.value, + }); + }} + /> + {searchParams.slug && ( + + )} +
+
+ + + + + + Domain + + + Shorten Service + + + Email Service + + + DNS Service + + + Active + + + Updated + + + Actions + + + + + {isLoading ? ( + <> + + + + + + + ) : data && data.list && data.list.length ? ( + data.list.map((domain) => ( +
+ + + + {domain.domain_name} + + + + + handleChangeStatus( + value, + "enable_short_link", + domain, + ) + } + /> + + + + handleChangeStatus(value, "enable_email", domain) + } + /> + + + + handleChangeStatus(value, "enable_dns", domain) + } + /> + + + + handleChangeStatus(value, "active", domain) + } + /> + + + {timeAgo(domain.updatedAt as Date)} + + + + {domain.cf_zone_id && + domain.cf_api_key && + domain.cf_email && ( + + )} + + + {/* {isShowDomainInfo && selectedDomain?.id === domain.id && ( + + )} */} +
+ )) + ) : ( + + + No Domains + + You don't have any domains yet. Start creating one. + + + )} +
+ {data && Math.ceil(data.total / pageSize) > 1 && ( + + )} +
+
+
+ + {/* form */} + + + + + ); +} + +export function DomainInfo({ domain }: { domain: DomainFormData }) { + return <>{domain.domain_name}; +} diff --git a/app/(protected)/admin/domains/loading.tsx b/app/(protected)/admin/domains/loading.tsx new file mode 100644 index 0000000..3ee8119 --- /dev/null +++ b/app/(protected)/admin/domains/loading.tsx @@ -0,0 +1,12 @@ +import { Skeleton } from "@/components/ui/skeleton"; +import { DashboardHeader } from "@/components/dashboard/header"; + +export default function DashboardRecordsLoading() { + return ( + <> + + + + + ); +} diff --git a/app/(protected)/admin/domains/page.tsx b/app/(protected)/admin/domains/page.tsx new file mode 100644 index 0000000..626f20c --- /dev/null +++ b/app/(protected)/admin/domains/page.tsx @@ -0,0 +1,41 @@ +import { redirect } from "next/navigation"; + +import { getCurrentUser } from "@/lib/session"; +import { constructMetadata } from "@/lib/utils"; +import { DashboardHeader } from "@/components/dashboard/header"; + +import UserRecordsList from "../../dashboard/records/record-list"; +import DomainList from "./domain-list"; + +export const metadata = constructMetadata({ + title: "DNS Records - WR.DO", + description: "List and manage records.", +}); + +export default async function DashboardPage() { + const user = await getCurrentUser(); + + if (!user?.id) redirect("/login"); + + return ( + <> + + + + ); +} diff --git a/app/(protected)/admin/users/user-list.tsx b/app/(protected)/admin/users/user-list.tsx index a4e613f..ebdfa07 100644 --- a/app/(protected)/admin/users/user-list.tsx +++ b/app/(protected)/admin/users/user-list.tsx @@ -33,7 +33,6 @@ import { TooltipProvider, TooltipTrigger, } from "@/components/ui/tooltip"; -import StatusDot from "@/components/dashboard/status-dot"; import { UserForm } from "@/components/forms/user-form"; import { EmptyPlaceholder } from "@/components/shared/empty-placeholder"; import { Icons } from "@/components/shared/icons"; diff --git a/app/(protected)/dashboard/records/record-list.tsx b/app/(protected)/dashboard/records/record-list.tsx index 959b13f..9128e8f 100644 --- a/app/(protected)/dashboard/records/record-list.tsx +++ b/app/(protected)/dashboard/records/record-list.tsx @@ -189,7 +189,7 @@ export default function UserRecordsList({ user, action }: RecordListProps) { setShowForm(!isShowForm); }} > - Add record + Add Record diff --git a/app/(protected)/dashboard/urls/url-list.tsx b/app/(protected)/dashboard/urls/url-list.tsx index c0802f7..80c5e03 100644 --- a/app/(protected)/dashboard/urls/url-list.tsx +++ b/app/(protected)/dashboard/urls/url-list.tsx @@ -179,7 +179,7 @@ export default function UserUrlsList({ user, action }: UrlListProps) { setShowForm(!isShowForm); }} > - Add url + Add URL diff --git a/app/api/admin/domain/route.ts b/app/api/admin/domain/route.ts new file mode 100644 index 0000000..4cb18b6 --- /dev/null +++ b/app/api/admin/domain/route.ts @@ -0,0 +1,147 @@ +import { NextRequest } from "next/server"; + +import { + createDomain, + deleteDomain, + getAllDomains, + invalidateDomainConfigCache, + updateDomain, +} from "@/lib/dto/domains"; +import { checkUserStatus } from "@/lib/dto/user"; +import { getCurrentUser } from "@/lib/session"; + +// Get domains list +export async function GET(req: NextRequest) { + try { + const user = checkUserStatus(await getCurrentUser()); + if (user instanceof Response) return user; + if (user.role !== "ADMIN") { + return Response.json("Unauthorized", { status: 401 }); + } + + // TODO: Add pagination + const domains = await getAllDomains(); + + return Response.json( + { list: domains, total: domains.length }, + { status: 200 }, + ); + } catch (error) { + console.error("[Error]", error); + return Response.json(error.message || "Server error", { status: 500 }); + } +} + +// Create domain +export async function POST(req: NextRequest) { + try { + const user = checkUserStatus(await getCurrentUser()); + if (user instanceof Response) return user; + if (user.role !== "ADMIN") { + return Response.json("Unauthorized", { status: 401 }); + } + + const { data } = await req.json(); + if (!data || !data.domain_name) { + return Response.json("domain_name is required", { status: 400 }); + } + + const newDomain = await createDomain({ + domain_name: data.domain_name, + enable_short_link: !!data.enable_short_link, + enable_email: !!data.enable_email, + enable_dns: !!data.enable_dns, + cf_zone_id: data.cf_zone_id, + cf_api_key: data.cf_api_key, + cf_email: data.cf_email, + cf_api_key_encrypted: false, + max_short_links: data.max_short_links, + max_email_forwards: data.max_email_forwards, + max_dns_records: data.max_dns_records, + active: true, + }); + + invalidateDomainConfigCache(); + + return Response.json(newDomain, { status: 200 }); + } catch (error) { + console.error("[Error]", error); + return Response.json(error.message || "Server error", { status: 500 }); + } +} + +// Update domain +export async function PUT(req: NextRequest) { + try { + const user = checkUserStatus(await getCurrentUser()); + if (user instanceof Response) return user; + if (user.role !== "ADMIN") { + return Response.json("Unauthorized", { status: 401 }); + } + + const { + domain_name, + enable_short_link, + enable_email, + enable_dns, + cf_zone_id, + cf_api_key, + cf_email, + max_short_links, + max_email_forwards, + max_dns_records, + active, + id, + } = await req.json(); + if (!id) { + return Response.json("domain id is required", { status: 400 }); + } + + const updatedDomain = await updateDomain(id, { + domain_name, + enable_short_link: !!enable_short_link, + enable_email: !!enable_email, + enable_dns: !!enable_dns, + active: !!active, + cf_zone_id, + cf_api_key, + cf_email, + cf_api_key_encrypted: false, + max_short_links, + max_email_forwards, + max_dns_records, + }); + + invalidateDomainConfigCache(); + + return Response.json(updatedDomain, { status: 200 }); + } catch (error) { + console.error("[Error]", error); + return Response.json(error.message || "Server error", { status: 500 }); + } +} + +// Delete domain +export async function DELETE(req: NextRequest) { + try { + const user = checkUserStatus(await getCurrentUser()); + if (user instanceof Response) return user; + if (user.role !== "ADMIN") { + return Response.json("Unauthorized", { status: 401 }); + } + + const { domain_name } = await req.json(); + if (!domain_name) { + return Response.json("domain_name is required", { status: 400 }); + } + + const deletedDomain = await deleteDomain(domain_name); + + invalidateDomainConfigCache(); + + return Response.json(deletedDomain, { status: 200 }); + } catch (error) { + console.error("[Error]", error); + return Response.json(error.message || "Server error", { status: 500 }); + } +} diff --git a/app/api/domain/route.ts b/app/api/domain/route.ts new file mode 100644 index 0000000..137ba1b --- /dev/null +++ b/app/api/domain/route.ts @@ -0,0 +1,31 @@ +import { NextRequest } from "next/server"; + +import { FeatureMap, getDomainsByFeature } from "@/lib/dto/domains"; +import { checkUserStatus } from "@/lib/dto/user"; +import { getCurrentUser } from "@/lib/session"; + +// Get domains by feature for frontend +export async function GET(req: NextRequest) { + try { + const user = checkUserStatus(await getCurrentUser()); + if (user instanceof Response) return user; + + const url = new URL(req.url); + const feature = url.searchParams.get("feature") || ""; + + if (!Object.keys(FeatureMap).includes(feature)) { + return Response.json( + "Invalid feature parameter. Use 'short', 'email', or 'record'.", + { + status: 400, + }, + ); + } + + const domainList = await getDomainsByFeature(FeatureMap[feature]); + return Response.json(domainList, { status: 200 }); + } catch (error) { + console.error("[Error]", error); + return Response.json(error.message || "Server error", { status: 500 }); + } +} diff --git a/app/api/record/add/route.ts b/app/api/record/add/route.ts index 89d6305..9346922 100644 --- a/app/api/record/add/route.ts +++ b/app/api/record/add/route.ts @@ -1,4 +1,3 @@ -import { env } from "@/env.mjs"; import { TeamPlanQuota } from "@/config/team"; import { createDNSRecord } from "@/lib/cloudflare"; import { @@ -6,31 +5,27 @@ import { getUserRecordByTypeNameContent, getUserRecordCount, } from "@/lib/dto/cloudflare-dns-record"; +import { getDomainsByFeature } from "@/lib/dto/domains"; import { checkUserStatus } from "@/lib/dto/user"; import { reservedDomains } from "@/lib/enums"; import { getCurrentUser } from "@/lib/session"; -import { generateSecret, parseZones } from "@/lib/utils"; +import { generateSecret } from "@/lib/utils"; export async function POST(req: Request) { try { const user = checkUserStatus(await getCurrentUser()); if (user instanceof Response) return user; - const { CLOUDFLARE_ZONE, CLOUDFLARE_API_KEY, CLOUDFLARE_EMAIL } = env; - const zones = parseZones(CLOUDFLARE_ZONE || "[]"); - - if (!zones.length || !CLOUDFLARE_API_KEY || !CLOUDFLARE_EMAIL) { - return Response.json("API key、zone iD and email are required", { + const zones = await getDomainsByFeature("enable_dns", true); + if (!zones.length) { + return Response.json("Please add at least one domain", { status: 400, - statusText: "API key、zone iD and email are required", + statusText: "Please add at least one domain", }); } const { total } = await getUserRecordCount(user.id); - if ( - user.role !== "ADMIN" && - total >= TeamPlanQuota[user.team].RC_NewRecords - ) { + if (total >= TeamPlanQuota[user.team].RC_NewRecords) { return Response.json("Your records have reached the free limit.", { status: 409, }); @@ -49,7 +44,7 @@ export async function POST(req: Request) { let matchedZone; for (const zone of zones) { - if (record.zone_name === zone.zone_name) { + if (record.zone_name === zone.domain_name) { matchedZone = zone; break; } @@ -85,22 +80,22 @@ export async function POST(req: Request) { } const data = await createDNSRecord( - matchedZone.zone_id, - CLOUDFLARE_API_KEY, - CLOUDFLARE_EMAIL, + matchedZone.cf_zone_id, + matchedZone.cf_api_key, + matchedZone.cf_email, record, ); if (!data.success || !data.result?.id) { - console.log("[data]", data); + // console.log("[data]", data); return Response.json(data.messages, { status: 501, }); } else { const res = await createUserRecord(user.id, { record_id: data.result.id, - zone_id: matchedZone.zone_id, - zone_name: matchedZone.zone_name, + zone_id: matchedZone.cf_zone_id, + zone_name: matchedZone.domain_name, name: data.result.name, type: data.result.type, content: data.result.content, diff --git a/app/api/record/admin/add/route.ts b/app/api/record/admin/add/route.ts index 49dbca6..6ca891c 100644 --- a/app/api/record/admin/add/route.ts +++ b/app/api/record/admin/add/route.ts @@ -1,4 +1,3 @@ -import { env } from "@/env.mjs"; import { TeamPlanQuota } from "@/config/team"; import { createDNSRecord } from "@/lib/cloudflare"; import { @@ -6,10 +5,11 @@ import { getUserRecordByTypeNameContent, getUserRecordCount, } from "@/lib/dto/cloudflare-dns-record"; +import { getDomainsByFeature } from "@/lib/dto/domains"; import { checkUserStatus, getUserByEmail } from "@/lib/dto/user"; import { reservedDomains } from "@/lib/enums"; import { getCurrentUser } from "@/lib/session"; -import { generateSecret, parseZones } from "@/lib/utils"; +import { generateSecret } from "@/lib/utils"; export async function POST(req: Request) { try { @@ -22,13 +22,11 @@ export async function POST(req: Request) { }); } - const { CLOUDFLARE_ZONE, CLOUDFLARE_API_KEY, CLOUDFLARE_EMAIL } = env; - const zones = parseZones(CLOUDFLARE_ZONE || "[]"); - - if (!zones.length || !CLOUDFLARE_API_KEY || !CLOUDFLARE_EMAIL) { - return Response.json("API key、zone iD and email are required", { + const zones = await getDomainsByFeature("enable_dns", true); + if (!zones.length) { + return Response.json("Please add at least one domain", { status: 400, - statusText: "API key、zone iD and email are required", + statusText: "Please add at least one domain", }); } @@ -60,7 +58,7 @@ export async function POST(req: Request) { let matchedZone; for (const zone of zones) { - if (record.zone_name === zone.zone_name) { + if (record.zone_name === zone.domain_name) { matchedZone = zone; break; } @@ -96,9 +94,9 @@ export async function POST(req: Request) { } const data = await createDNSRecord( - matchedZone.zone_id, - CLOUDFLARE_API_KEY, - CLOUDFLARE_EMAIL, + matchedZone.cf_zone_id, + matchedZone.cf_api_key, + matchedZone.cf_email, record, ); @@ -110,8 +108,8 @@ export async function POST(req: Request) { } else { const res = await createUserRecord(target_user.id, { record_id: data.result.id, - zone_id: matchedZone.zone_id, - zone_name: matchedZone.zone_name, + zone_id: matchedZone.cf_zone_id, + zone_name: matchedZone.domain_name, name: data.result.name, type: data.result.type, content: data.result.content, diff --git a/app/api/record/admin/delete/route.ts b/app/api/record/admin/delete/route.ts index 7e2ff9c..7445216 100644 --- a/app/api/record/admin/delete/route.ts +++ b/app/api/record/admin/delete/route.ts @@ -1,9 +1,8 @@ -import { env } from "@/env.mjs"; import { deleteDNSRecord } from "@/lib/cloudflare"; import { deleteUserRecord } from "@/lib/dto/cloudflare-dns-record"; +import { getDomainsByFeature } from "@/lib/dto/domains"; import { checkUserStatus } from "@/lib/dto/user"; import { getCurrentUser } from "@/lib/session"; -import { parseZones } from "@/lib/utils"; export async function POST(req: Request) { try { @@ -24,20 +23,15 @@ export async function POST(req: Request) { }); } - const { CLOUDFLARE_ZONE, CLOUDFLARE_API_KEY, CLOUDFLARE_EMAIL } = env; - const zones = parseZones(CLOUDFLARE_ZONE || "[]"); - - if (!zones.length || !CLOUDFLARE_API_KEY || !CLOUDFLARE_EMAIL) { - return Response.json( - "API key, zone configuration, and email are required", - { - status: 400, - statusText: "Missing required configuration", - }, - ); + const zones = await getDomainsByFeature("enable_dns", true); + if (!zones.length) { + return Response.json("Please add at least one domain", { + status: 400, + statusText: "Please add at least one domain", + }); } - const matchedZone = zones.find((zone) => zone.zone_id === zone_id); + const matchedZone = zones.find((zone) => zone.cf_zone_id === zone_id); if (!matchedZone) { return Response.json(`Invalid or unsupported zone_id: ${zone_id}`, { status: 400, @@ -48,9 +42,9 @@ export async function POST(req: Request) { // force delete await deleteUserRecord(userId, record_id, zone_id, active); await deleteDNSRecord( - matchedZone.zone_id, - CLOUDFLARE_API_KEY, - CLOUDFLARE_EMAIL, + matchedZone.cf_zone_id!, + matchedZone.cf_api_key!, + matchedZone.cf_email!, record_id, ); diff --git a/app/api/record/admin/route.ts b/app/api/record/admin/route.ts index cd6042e..082ddac 100644 --- a/app/api/record/admin/route.ts +++ b/app/api/record/admin/route.ts @@ -1,6 +1,5 @@ -import { env } from "@/env.mjs"; import { getUserRecords } from "@/lib/dto/cloudflare-dns-record"; -import { checkUserStatus, getUserByEmail } from "@/lib/dto/user"; +import { checkUserStatus } from "@/lib/dto/user"; import { getCurrentUser } from "@/lib/session"; export async function GET(req: Request) { diff --git a/app/api/record/admin/update/route.ts b/app/api/record/admin/update/route.ts index e8dc5c8..c07bfa0 100644 --- a/app/api/record/admin/update/route.ts +++ b/app/api/record/admin/update/route.ts @@ -1,9 +1,8 @@ -import { env } from "@/env.mjs"; import { updateDNSRecord } from "@/lib/cloudflare"; import { updateUserRecord } from "@/lib/dto/cloudflare-dns-record"; +import { getDomainsByFeature } from "@/lib/dto/domains"; import { checkUserStatus } from "@/lib/dto/user"; import { getCurrentUser } from "@/lib/session"; -import { parseZones } from "@/lib/utils"; export async function POST(req: Request) { try { @@ -16,16 +15,11 @@ export async function POST(req: Request) { }); } - const { CLOUDFLARE_ZONE, CLOUDFLARE_API_KEY, CLOUDFLARE_EMAIL } = env; - const zones = parseZones(CLOUDFLARE_ZONE || "[]"); - - if (!zones.length || !CLOUDFLARE_API_KEY || !CLOUDFLARE_EMAIL) { + const zones = await getDomainsByFeature("enable_dns", true); + if (!zones.length) { return Response.json( "API key, zone configuration, and email are required", - { - status: 400, - statusText: "Missing required configuration", - }, + { status: 401, statusText: "Missing required configuration" }, ); } @@ -44,7 +38,7 @@ export async function POST(req: Request) { let matchedZone; for (const zone of zones) { - if (record.zone_name === zone.zone_name) { + if (record.zone_name === zone.domain_name) { matchedZone = zone; break; } @@ -61,9 +55,9 @@ export async function POST(req: Request) { } const data = await updateDNSRecord( - matchedZone.zone_id, - CLOUDFLARE_API_KEY, - CLOUDFLARE_EMAIL, + matchedZone.cf_zone_id, + matchedZone.cf_api_key, + matchedZone.cf_email, recordId, { ...record, name: record_name }, ); @@ -80,8 +74,8 @@ export async function POST(req: Request) { const res = await updateUserRecord(userId, { record_id: data.result.id, - zone_id: matchedZone.zone_id, - zone_name: matchedZone.zone_name, + zone_id: matchedZone.cf_zone_id, + zone_name: matchedZone.domain_name, name: data.result.name, type: data.result.type, content: data.result.content, diff --git a/app/api/record/delete/route.ts b/app/api/record/delete/route.ts index 4d6d3de..e2bdebf 100644 --- a/app/api/record/delete/route.ts +++ b/app/api/record/delete/route.ts @@ -1,9 +1,9 @@ import { env } from "@/env.mjs"; import { deleteDNSRecord } from "@/lib/cloudflare"; import { deleteUserRecord } from "@/lib/dto/cloudflare-dns-record"; +import { getDomainsByFeature } from "@/lib/dto/domains"; import { checkUserStatus } from "@/lib/dto/user"; import { getCurrentUser } from "@/lib/session"; -import { parseZones } from "@/lib/utils"; export async function POST(req: Request) { try { @@ -12,20 +12,15 @@ export async function POST(req: Request) { const { record_id, zone_id, active } = await req.json(); - const { CLOUDFLARE_ZONE, CLOUDFLARE_API_KEY, CLOUDFLARE_EMAIL } = env; - const zones = parseZones(CLOUDFLARE_ZONE || "[]"); - - if (!zones.length || !CLOUDFLARE_API_KEY || !CLOUDFLARE_EMAIL) { - return Response.json( - "API key, zone configuration, and email are required", - { - status: 400, - statusText: "API key, zone configuration, and email are required", - }, - ); + const zones = await getDomainsByFeature("enable_dns", true); + if (!zones.length) { + return Response.json("Please add at least one domain", { + status: 400, + statusText: "Please add at least one domain", + }); } - const matchedZone = zones.find((zone) => zone.zone_id === zone_id); + const matchedZone = zones.find((zone) => zone.cf_zone_id === zone_id); if (!matchedZone) { return Response.json(`Invalid or unsupported zone_id: ${zone_id}`, { status: 400, @@ -34,9 +29,9 @@ export async function POST(req: Request) { } const res = await deleteDNSRecord( - matchedZone.zone_id, - CLOUDFLARE_API_KEY, - CLOUDFLARE_EMAIL, + matchedZone.cf_zone_id!, + matchedZone.cf_api_key!, + matchedZone.cf_email!, record_id, ); diff --git a/app/api/record/route.ts b/app/api/record/route.ts index b1de8bf..530a981 100644 --- a/app/api/record/route.ts +++ b/app/api/record/route.ts @@ -1,4 +1,3 @@ -import { env } from "@/env.mjs"; import { getUserRecords } from "@/lib/dto/cloudflare-dns-record"; import { checkUserStatus } from "@/lib/dto/user"; import { getCurrentUser } from "@/lib/session"; diff --git a/app/api/record/update/route.ts b/app/api/record/update/route.ts index 612a9dc..b04004d 100644 --- a/app/api/record/update/route.ts +++ b/app/api/record/update/route.ts @@ -1,13 +1,12 @@ -import { env } from "@/env.mjs"; import { updateDNSRecord } from "@/lib/cloudflare"; import { updateUserRecord, updateUserRecordState, } from "@/lib/dto/cloudflare-dns-record"; +import { getDomainsByFeature } from "@/lib/dto/domains"; import { checkUserStatus } from "@/lib/dto/user"; import { reservedDomains } from "@/lib/enums"; import { getCurrentUser } from "@/lib/session"; -import { parseZones } from "@/lib/utils"; // Update DNS record export async function POST(req: Request) { @@ -15,10 +14,8 @@ export async function POST(req: Request) { const user = checkUserStatus(await getCurrentUser()); if (user instanceof Response) return user; - const { CLOUDFLARE_ZONE, CLOUDFLARE_API_KEY, CLOUDFLARE_EMAIL } = env; - const zones = parseZones(CLOUDFLARE_ZONE || "[]"); - - if (!zones.length || !CLOUDFLARE_API_KEY || !CLOUDFLARE_EMAIL) { + const zones = await getDomainsByFeature("enable_dns", true); + if (!zones.length) { return Response.json( "API key, zone configuration, and email are required", { status: 401, statusText: "Missing required configuration" }, @@ -40,7 +37,7 @@ export async function POST(req: Request) { let matchedZone; for (const zone of zones) { - if (record.zone_name === zone.zone_name) { + if (record.zone_name === zone.domain_name) { matchedZone = zone; break; } @@ -64,14 +61,13 @@ export async function POST(req: Request) { } const data = await updateDNSRecord( - matchedZone.zone_id, - CLOUDFLARE_API_KEY, - CLOUDFLARE_EMAIL, + matchedZone.cf_zone_id, + matchedZone.cf_api_key, + matchedZone.cf_email, recordId, { ...record, name: record_name }, ); - console.log("[updateDNSRecord]", data); if (!data.success || !data.result?.id) { return Response.json( data.errors?.[0]?.message || "Failed to update DNS record", @@ -81,8 +77,8 @@ export async function POST(req: Request) { const res = await updateUserRecord(user.id, { record_id: data.result.id, - zone_id: matchedZone.zone_id, // Use matched zone_id - zone_name: matchedZone.zone_name, // Use matched zone_name + zone_id: matchedZone.cf_zone_id, + zone_name: matchedZone.domain_name, name: data.result.name, type: data.result.type, content: data.result.content, @@ -118,10 +114,8 @@ export async function PUT(req: Request) { const user = checkUserStatus(await getCurrentUser()); if (user instanceof Response) return user; - const { CLOUDFLARE_ZONE, CLOUDFLARE_API_KEY, CLOUDFLARE_EMAIL } = env; - const zones = parseZones(CLOUDFLARE_ZONE || "[]"); - - if (!zones.length || !CLOUDFLARE_API_KEY || !CLOUDFLARE_EMAIL) { + const zones = await getDomainsByFeature("enable_dns", true); + if (!zones.length) { return Response.json( "API key, zone configuration, and email are required", { status: 401, statusText: "Missing required configuration" }, @@ -136,7 +130,7 @@ export async function PUT(req: Request) { }); } - const matchedZone = zones.find((zone) => zone.zone_id === zone_id); + const matchedZone = zones.find((zone) => zone.cf_zone_id === zone_id); if (!matchedZone) { return Response.json(`Invalid or unsupported zone_id: ${zone_id}`, { status: 400, @@ -153,9 +147,9 @@ export async function PUT(req: Request) { isTargetAccessible = target_res.status === 200; } catch (fetchError) { isTargetAccessible = false; - console.log( - `[Fetch Error] Failed to access target ${target}: ${fetchError}`, - ); + // console.log( + // `[Fetch Error] Failed to access target ${target}: ${fetchError}`, + // ); } const res = await updateUserRecordState( diff --git a/app/api/url/add/route.ts b/app/api/url/add/route.ts index 0a85f5e..643941f 100644 --- a/app/api/url/add/route.ts +++ b/app/api/url/add/route.ts @@ -1,4 +1,5 @@ import { TeamPlanQuota } from "@/config/team"; +import { getDomainsByFeature } from "@/lib/dto/domains"; import { createUserShortUrl } from "@/lib/dto/short-urls"; import { checkUserStatus } from "@/lib/dto/user"; import { getCurrentUser } from "@/lib/session"; @@ -23,6 +24,18 @@ export async function POST(req: Request) { const { target, url, prefix, visible, active, expiration, password } = createUrlSchema.parse(data); + + const zones = await getDomainsByFeature("enable_short_link"); + if ( + !zones.length || + !zones.map((zone) => zone.domain_name).includes(prefix) + ) { + return Response.json("Invalid domain", { + status: 400, + statusText: "Invalid domain", + }); + } + const res = await createUserShortUrl({ userId: user.id, userName: user.name || "Anonymous", diff --git a/app/api/url/route.ts b/app/api/url/route.ts index c5a57e6..a392071 100644 --- a/app/api/url/route.ts +++ b/app/api/url/route.ts @@ -1,4 +1,3 @@ -import { env } from "@/env.mjs"; import { getUserShortUrls } from "@/lib/dto/short-urls"; import { checkUserStatus } from "@/lib/dto/user"; import { getCurrentUser } from "@/lib/session"; diff --git a/app/api/v1/email/route.ts b/app/api/v1/email/route.ts index de7b7f5..e65fb1a 100644 --- a/app/api/v1/email/route.ts +++ b/app/api/v1/email/route.ts @@ -3,6 +3,7 @@ import { NextRequest, NextResponse } from "next/server"; import { siteConfig } from "@/config/site"; import { TeamPlanQuota } from "@/config/team"; import { checkApiKey } from "@/lib/dto/api-key"; +import { getDomainsByFeature } from "@/lib/dto/domains"; import { createUserEmail, deleteUserEmailByAddress } from "@/lib/dto/email"; import { reservedAddressSuffix } from "@/lib/enums"; import { restrictByTimeRange } from "@/lib/team"; @@ -53,7 +54,12 @@ export async function POST(req: NextRequest) { status: 400, }); } - if (!siteConfig.emailDomains.includes(suffix)) { + + const zones = await getDomainsByFeature("enable_email", true); + if ( + !zones.length || + !zones.map((zone) => zone.domain_name).includes(suffix) + ) { return NextResponse.json("Invalid email suffix address", { status: 400 }); } diff --git a/app/api/v1/short/route.ts b/app/api/v1/short/route.ts index 16aa43b..d42cb2d 100644 --- a/app/api/v1/short/route.ts +++ b/app/api/v1/short/route.ts @@ -1,5 +1,6 @@ import { TeamPlanQuota } from "@/config/team"; import { checkApiKey } from "@/lib/dto/api-key"; +import { getDomainsByFeature } from "@/lib/dto/domains"; import { createUserShortUrl } from "@/lib/dto/short-urls"; import { restrictByTimeRange } from "@/lib/team"; import { createUrlSchema } from "@/lib/validations/url"; @@ -41,6 +42,17 @@ export async function POST(req: Request) { }); } + const zones = await getDomainsByFeature("enable_short_link"); + if ( + !zones.length || + !zones.map((zone) => zone.domain_name).includes(prefix) + ) { + return Response.json("Invalid domain", { + status: 409, + statusText: "Invalid domain", + }); + } + const res = await createUserShortUrl({ userId: user.id, userName: user.name || "Anonymous", diff --git a/app/manifest.json b/app/manifest.json index 27ece42..66a72fc 100644 --- a/app/manifest.json +++ b/app/manifest.json @@ -3,7 +3,7 @@ "short_name": "WR.DO", "description": "Shorten links with analytics, manage emails and control subdomains—all on one platform.", "appid": "com.wr.do", - "versionName": "0.5.1", + "versionName": "0.6.0", "versionCode": "1", "start_url": "/", "orientation": "portrait", diff --git a/components/dashboard/form-section-columns.tsx b/components/dashboard/form-section-columns.tsx index e7d6cce..5a7132a 100644 --- a/components/dashboard/form-section-columns.tsx +++ b/components/dashboard/form-section-columns.tsx @@ -1,5 +1,7 @@ import React from "react"; +import { cn } from "@/lib/utils"; + interface SectionColumnsType { title: string; children: React.ReactNode; @@ -14,7 +16,12 @@ export function FormSectionColumns({ className, }: SectionColumnsType) { return ( -
+

{title}

{required && ( diff --git a/components/email/EmailSidebar.tsx b/components/email/EmailSidebar.tsx index 97f9855..b9f0478 100644 --- a/components/email/EmailSidebar.tsx +++ b/components/email/EmailSidebar.tsx @@ -77,9 +77,7 @@ export default function EmailSidebar({ const [isEdit, setIsEdit] = useState(false); const [showEmailModal, setShowEmailModal] = useState(false); const [isPending, startTransition] = useTransition(); - const [domainSuffix, setDomainSuffix] = useState( - siteConfig.shortDomains[0], - ); + const [domainSuffix, setDomainSuffix] = useState("wr.do"); const [showDeleteModal, setShowDeleteModal] = useState(false); const [emailToDelete, setEmailToDelete] = useState(null); const [deleteInput, setDeleteInput] = useState(""); @@ -109,6 +107,13 @@ export default function EmailSidebar({ }, ); + const { data: emailDomains, isLoading: isLoadingDomains } = useSWR< + { domain_name: string }[] + >("/api/domain?feature=email", fetcher, { + revalidateOnFocus: false, + dedupingInterval: 10000, + }); + if (!selectedEmailAddress && data && data.list.length > 0) { onSelectEmail(data.list[0].emailAddress); } @@ -595,25 +600,36 @@ export default function EmailSidebar({ isEdit ? selectedEmailAddress?.split("@")[0] || "" : "" } /> - + {isLoadingDomains ? ( + + ) : ( + emailDomains && ( + + ) + )} + )} + + +
+ +
+ ); +} diff --git a/components/forms/record-form.tsx b/components/forms/record-form.tsx index 0f26bd4..9d590f8 100644 --- a/components/forms/record-form.tsx +++ b/components/forms/record-form.tsx @@ -5,11 +5,13 @@ import { zodResolver } from "@hookform/resolvers/zod"; import { User } from "@prisma/client"; import { useForm } from "react-hook-form"; import { toast } from "sonner"; +import useSWR from "swr"; import { siteConfig } from "@/config/site"; import { CreateDNSRecord, RecordType } from "@/lib/cloudflare"; import { UserRecordFormData } from "@/lib/dto/cloudflare-dns-record"; import { RECORD_TYPE_ENUMS, TTL_ENUMS } from "@/lib/enums"; +import { fetcher } from "@/lib/utils"; import { createRecordSchema } from "@/lib/validations/record"; import { Button } from "@/components/ui/button"; import { Input } from "@/components/ui/input"; @@ -24,6 +26,7 @@ import { SelectTrigger, SelectValue, } from "../ui/select"; +import { Skeleton } from "../ui/skeleton"; import { Switch } from "../ui/switch"; export type FormData = CreateDNSRecord; @@ -77,6 +80,16 @@ export function RecordForm({ }, }); + // Fetch the record domains + const { data: recordDomains, isLoading } = useSWR<{ domain_name: string }[]>( + "/api/domain?feature=record", + fetcher, + { + revalidateOnFocus: false, + dedupingInterval: 10000, + }, + ); + const onSubmit = handleSubmit((data) => { if (type === "add") { handleCreateRecord(data); @@ -196,26 +209,32 @@ export function RecordForm({
- + {isLoading ? ( + + ) : ( + recordDomains && ( + + ) + )}

Required. Select a domain.

diff --git a/components/forms/url-form.tsx b/components/forms/url-form.tsx index fe937fc..3899dfe 100644 --- a/components/forms/url-form.tsx +++ b/components/forms/url-form.tsx @@ -6,11 +6,12 @@ import { User } from "@prisma/client"; import { Sparkles } from "lucide-react"; import { useForm } from "react-hook-form"; import { toast } from "sonner"; +import useSWR from "swr"; import { siteConfig } from "@/config/site"; import { ShortUrlFormData } from "@/lib/dto/short-urls"; import { EXPIRATION_ENUMS } from "@/lib/enums"; -import { generateUrlSuffix } from "@/lib/utils"; +import { fetcher, generateUrlSuffix } from "@/lib/utils"; import { createUrlSchema } from "@/lib/validations/url"; import { Button } from "@/components/ui/button"; import { Input } from "@/components/ui/input"; @@ -25,7 +26,7 @@ import { SelectTrigger, SelectValue, } from "../ui/select"; -import { Switch } from "../ui/switch"; +import { Skeleton } from "../ui/skeleton"; export type FormData = ShortUrlFormData; @@ -64,13 +65,22 @@ export function UrlForm({ target: initData?.target || "", url: initData?.url || "", active: initData?.active || 1, - prefix: initData?.prefix || siteConfig.shortDomains[0], + prefix: initData?.prefix || "wr.do", visible: initData?.visible || 0, expiration: initData?.expiration || "-1", password: initData?.password || "", }, }); + const { data: shortDomains, isLoading } = useSWR<{ domain_name: string }[]>( + "/api/domain?feature=short", + fetcher, + { + revalidateOnFocus: false, + dedupingInterval: 10000, + }, + ); + const onSubmit = handleSubmit((data) => { if (type === "add") { handleCreateUrl(data); @@ -191,25 +201,33 @@ export function UrlForm({
- + {isLoading ? ( + + ) : ( + shortDomains && ( + + ) + )} - - {/*
-

- Your Final URL: -

-

- {getValues("prefix")}/s/{getValues("url")} -

-
*/} - {/* -
- - setValue("visible", value ? 1 : 0)} - /> -
-

- Public or private short url. -

-
*/} - {/* -
- - setValue("active", value ? 1 : 0)} - /> -
-

- Enable or disable short url. -

-
*/}
{/* Action buttons */} diff --git a/components/shared/icons.tsx b/components/shared/icons.tsx index f905217..b53698e 100644 --- a/components/shared/icons.tsx +++ b/components/shared/icons.tsx @@ -301,4 +301,33 @@ export const Icons = { ), + cloudflare: ({ ...props }: LucideProps) => ( + + + + + + + + + + ), }; diff --git a/config/dashboard.ts b/config/dashboard.ts index 1f9c73e..e1a1294 100644 --- a/config/dashboard.ts +++ b/config/dashboard.ts @@ -11,7 +11,7 @@ export const sidebarLinks: SidebarNavItem[] = [ { href: "/dashboard", icon: "dashboard", title: "Dashboard" }, { href: "/dashboard/urls", icon: "link", title: "Short Urls" }, { href: "/emails", icon: "mail", title: "Emails" }, - { href: "/dashboard/records", icon: "globeLock", title: "DNS Records" }, + { href: "/dashboard/records", icon: "globe", title: "DNS Records" }, { href: "/chat", icon: "messages", title: "WRoom" }, ], }, @@ -54,6 +54,12 @@ export const sidebarLinks: SidebarNavItem[] = [ title: "Admin Panel", authorizeOnly: UserRole.ADMIN, }, + { + href: "/admin/domains", + icon: "globeLock", + title: "Domains", + authorizeOnly: UserRole.ADMIN, + }, { href: "/admin/users", icon: "users", diff --git a/config/site.ts b/config/site.ts index 7d7d5e3..4764c75 100644 --- a/config/site.ts +++ b/config/site.ts @@ -3,10 +3,7 @@ import { env } from "@/env.mjs"; const site_url = env.NEXT_PUBLIC_APP_URL; const open_signup = env.NEXT_PUBLIC_OPEN_SIGNUP; -const short_domains = env.NEXT_PUBLIC_SHORT_DOMAINS || ""; -const email_domains = env.NEXT_PUBLIC_EMAIL_DOMAINS || ""; const email_r2_domain = env.NEXT_PUBLIC_EMAIL_R2_DOMAIN || ""; -const record_domains = env.NEXT_PUBLIC_CLOUDFLARE_ZONE_NAME || ""; export const siteConfig: SiteConfig = { name: "WR.DO", @@ -23,9 +20,6 @@ export const siteConfig: SiteConfig = { }, mailSupport: "support@wr.do", openSignup: open_signup === "1" ? true : false, - shortDomains: short_domains.split(","), - emailDomains: email_domains.split(","), - recordDomains: record_domains.split(","), emailR2Domain: email_r2_domain, }; diff --git a/content/docs/developer/cloudflare.mdx b/content/docs/developer/cloudflare.mdx index d947c6a..dbbc9f2 100644 --- a/content/docs/developer/cloudflare.mdx +++ b/content/docs/developer/cloudflare.mdx @@ -5,6 +5,49 @@ description: How to config the cloudflare api. Before you start, you must have a Cloudflare account and be hosted on Cloudflare. +## Overview + +Administrators can manage domain configurations at `/admin/domains`, including adding, deleting, and modifying domains. + +![](/_static/docs/domain-form.png) + +### Domain Configuration Form + +The `Short URL Service` and `Email Service` require no additional configuration and can be activated to enable short URL and email functionalities (email requires worker forwarding setup). + +To enable the `DNS Record Service`, you must complete the `Cloudflare Configs(Optional)` form with the following fields: + +- Zone ID +- API Token +- Email + +These fields are used to configure the Cloudflare API. If your domain is hosted through Cloudflare, you can find these details in the Cloudflare dashboard. + +### Zone ID + +The unique identifier for a domain hosted on Cloudflare, located at: + +https://dash.cloudflare.com/[account_id]/[zone_name] + +### API Token + +Visit https://dash.cloudflare.com/profile/api-tokens, and find the Global API Key under the API Tokens section. + +### Email + +Email for registering a Cloudflare account + + +You can manage domains hosted under different Cloudflare accounts, +provided the API Token and Email are sourced from the same account. + + +--- + +# This section is Deprecated since version v0.6.0 + +Before you start, you must have a Cloudflare account and be hosted on Cloudflare. + In this section, you can update these variables: ```js title=".env" diff --git a/content/docs/developer/installation.mdx b/content/docs/developer/installation.mdx index f874900..b47b6a9 100644 --- a/content/docs/developer/installation.mdx +++ b/content/docs/developer/installation.mdx @@ -48,21 +48,12 @@ Copy/paste the `.env.example` in the `.env` file: | GITHUB_ID | `123465` | The ID of the GitHub OAuth client. | | GITHUB_SECRET | `123465` | The secret of the GitHub OAuth client. | | RESEND_API_KEY | `123465` | The API key for Resend. | -| CLOUDFLARE_ZONE | `[{"zone_id":"abc465","zone_name":"example.com"}]` | The zone info for Cloudflare. | -| NEXT_PUBLIC_CLOUDFLARE_ZONE_NAME | `example.com,example2.com` | The zone name for Cloudflare. | -| CLOUDFLARE_API_KEY | `123465` | The API key for Cloudflare. | -| CLOUDFLARE_EMAIL | `123465` | The email for Cloudflare. | | NEXT_PUBLIC_OPEN_SIGNUP | `1` | Open signup. | | SCREENSHOTONE_BASE_URL | `https://api.example.com` | pending | | GITHUB_TOKEN | `ghp_sscsfarwetqet` | https://github.com/settings/tokens | -| NEXT_PUBLIC_SHORT_DOMAINS | `wr.do,uv.do` | The list of short domains. Separated by `,` | -| NEXT_PUBLIC_EMAIL_DOMAINS | `wr.do,uv.do` | The list of email domains. Separated by `,` | - -> `NEXT_PUBLIC_SHORT_DOMAINS`、`NEXT_PUBLIC_EMAIL_DOMAINS` is used to limit the short domain name and email domain name. - How to get `GOOGLE_CLIENT_ID`、`GITHUB_ID`, see [Authentification](/docs/developer/authentification). - How to get `RESEND_API_KEY`, see [Email](/docs/developer/email). -- How to get `CLOUDFLARE_ZONE`、`CLOUDFLARE_API_KEY`、`CLOUDFLARE_EMAIL`、`NEXT_PUBLIC_CLOUDFLARE_ZONE_NAME`, see [Cloudflare Configs](/docs/developer/cloudflare). - How to get `DATABASE_URL`, see [Database](/docs/developer/database). - How to active email worker, see [Email Worker](/docs/developer/cloudflare-email-worker). diff --git a/content/docs/developer/quick-start.mdx b/content/docs/developer/quick-start.mdx index 715b395..2f4e91e 100644 --- a/content/docs/developer/quick-start.mdx +++ b/content/docs/developer/quick-start.mdx @@ -136,40 +136,7 @@ RESEND_API_KEY = re_your_resend_api_key; -## 3. Cloudflare Configs - -Before you start, you must have a Cloudflare account and be hosted on Cloudflare. - -### Add the CLOUDFLARE_ZONE Environment Variable - -A JSON array of objects, each containing a zone_id and zone_name for your Cloudflare zones. The zone_id is the unique identifier for a domain, and the zone_name is the domain name (e.g., example.com). - -> Follow [this way](https://dash.cloudflare.com/Your_Acount_Id/wr.do), and scroll down to `Zone ID`. - -### Add the CLOUDFLARE_API_KEY Environment Variable - - This is the API key that you use to authenticate requests to the Cloudflare API. You can generate or find your API key in the Cloudflare dashboard under the `profile` -> `api-tokens` section. - - > Follow [https://dash.cloudflare.com/profile/api-tokens](https://dash.cloudflare.com/profile/api-tokens), and scroll down to `API Token`, the `Global API Key` should be used. - -### Add the CLOUDFLARE_EMAIL Environment Variable - -This is the email address associated with your Cloudflare account. It is used for authentication alongside the API key. - -### Add the NEXT_PUBLIC_CLOUDFLARE_ZONE_NAME Environment Variable - -A comma-separated list of domain names (e.g., `example.com,example2.com`) used for frontend display. These must correspond to the zone_name values in CLOUDFLARE_ZONE. - -In this section, you can update these variables: - -```js title=".env" -CLOUDFLARE_ZONE=[{"zone_id":"abc465","zone_name":"example.com"},{"zone_id":"abc465","zone_name":"example2.com"}] -NEXT_PUBLIC_CLOUDFLARE_ZONE_NAME=example.com,example2.com -CLOUDFLARE_API_KEY=1234567890abcdef1234567890abcdef -CLOUDFLARE_EMAIL=user@example.com -``` - -## 4. Email Worker Configs +## 3. Email Worker Configs See detail in [Email Worker](/docs/developer/cloudflare-email-worker). @@ -187,20 +154,14 @@ Via: NEXT_PUBLIC_EMAIL_R2_DOMAIN=https://email-attachment.wr.do ``` -## 5. Add the Bussiness Configs +## 4. Add the Bussiness Configs ```js title=".env" # Allow anyone to sign up NEXT_PUBLIC_OPEN_SIGNUP=1 - -# Short domains. Separated by `,` -NEXT_PUBLIC_SHORT_DOMAINS=wr.do,uv.do - -# Email domains. Separated by `,` -NEXT_PUBLIC_EMAIL_DOMAINS=wr.do,uv.do ``` -## 6. Add the SCREENSHOTONE_BASE_URL Environment Variable +## 5. Add the SCREENSHOTONE_BASE_URL Environment Variable It's the base URL for the screenshotone API. @@ -211,20 +172,36 @@ Deploy docs via [here](https://jasonraimondi.github.io/url-to-png/) SCREENSHOTONE_BASE_URL=https://api.screenshotone.com ``` -## 7. Add the GITHUB_TOKEN Environment Variable +## 6. Add the GITHUB_TOKEN Environment Variable Via https://github.com/settings/tokens to get your token. ```js title=".env" GITHUB_TOKEN= ``` -## 8. Start the Dev Server + +## 7. Start the Dev Server ```bash pnpm dev ``` Via [http://localhost:3000](http://localhost:3000) +## 8. Setup System + +#### Create the first account and Change the account's role to ADMIN + +Follow the steps below: + +- 1. Via [http://localhost:3000/login](http://localhost:3000/login), login with your account. +- 2. Via [http://localhost:3000/setup](http://localhost:3000/setup), change the account's role to ADMIN. +- 3. Then follow the **panel guide** to config the system and add the first domain. + + + After change change the account's role to ADMIN, and then you can refresh the website and access http://localhost:3000/admin. + + You must add at least one domain to start using short links, email or subdomain management functions. + ## Q & A diff --git a/env.mjs b/env.mjs index 605b671..6b5023a 100644 --- a/env.mjs +++ b/env.mjs @@ -15,19 +15,13 @@ export const env = createEnv({ LinuxDo_CLIENT_SECRET: z.string().optional(), DATABASE_URL: z.string().min(1), RESEND_API_KEY: z.string().optional(), - CLOUDFLARE_ZONE: z.string().min(1), - CLOUDFLARE_API_KEY: z.string().min(1), - CLOUDFLARE_EMAIL: z.string().min(1), SCREENSHOTONE_BASE_URL: z.string().optional(), GITHUB_TOKEN: z.string().optional(), }, client: { NEXT_PUBLIC_APP_URL: z.string().min(1), NEXT_PUBLIC_OPEN_SIGNUP: z.string().min(1).default("1"), - NEXT_PUBLIC_SHORT_DOMAINS: z.string().min(1).default(""), - NEXT_PUBLIC_EMAIL_DOMAINS: z.string().min(1).default(""), NEXT_PUBLIC_EMAIL_R2_DOMAIN: z.string().min(1), - NEXT_PUBLIC_CLOUDFLARE_ZONE_NAME: z.string().min(1), }, runtimeEnv: { NEXTAUTH_URL: process.env.NEXTAUTH_URL, @@ -40,14 +34,7 @@ export const env = createEnv({ RESEND_API_KEY: process.env.RESEND_API_KEY, NEXT_PUBLIC_APP_URL: process.env.NEXT_PUBLIC_APP_URL, NEXT_PUBLIC_OPEN_SIGNUP: process.env.NEXT_PUBLIC_OPEN_SIGNUP, - NEXT_PUBLIC_SHORT_DOMAINS: process.env.NEXT_PUBLIC_SHORT_DOMAINS, - NEXT_PUBLIC_EMAIL_DOMAINS: process.env.NEXT_PUBLIC_EMAIL_DOMAINS, NEXT_PUBLIC_EMAIL_R2_DOMAIN: process.env.NEXT_PUBLIC_EMAIL_R2_DOMAIN, - NEXT_PUBLIC_CLOUDFLARE_ZONE_NAME: - process.env.NEXT_PUBLIC_CLOUDFLARE_ZONE_NAME, - CLOUDFLARE_ZONE: process.env.CLOUDFLARE_ZONE, - CLOUDFLARE_API_KEY: process.env.CLOUDFLARE_API_KEY, - CLOUDFLARE_EMAIL: process.env.CLOUDFLARE_EMAIL, SCREENSHOTONE_BASE_URL: process.env.SCREENSHOTONE_BASE_URL, GITHUB_TOKEN: process.env.GITHUB_TOKEN, LinuxDo_CLIENT_ID: process.env.LinuxDo_CLIENT_ID, diff --git a/lib/domainConfig.ts b/lib/domainConfig.ts new file mode 100644 index 0000000..b1fe152 --- /dev/null +++ b/lib/domainConfig.ts @@ -0,0 +1,36 @@ +import { getAllDomains, invalidateDomainConfigCache } from "@/lib/dto/domains"; + +export async function getDomainConfig() { + return await getAllDomains(); +} + +export async function getCloudflareCredentials(domain_name: string) { + try { + const domains = await getAllDomains(); + const domain = domains.find((d) => d.domain_name === domain_name); + if (!domain || !domain.cf_api_key || !domain.cf_email) { + throw new Error( + `No Cloudflare credentials found for domain: ${domain_name}`, + ); + } + + let apiKey = domain.cf_api_key; + if (domain.cf_api_key_encrypted) { + // TODO + apiKey = decrypt(apiKey); + } + + return { + api_key: apiKey, + email: domain.cf_email, + }; + } catch (error) { + throw new Error(`Failed to fetch credentials: ${error.message}`); + } +} + +function decrypt(encryptedKey: string) { + return encryptedKey; // Replace with actual decryption logic +} + +export { invalidateDomainConfigCache }; diff --git a/lib/dto/domains.ts b/lib/dto/domains.ts new file mode 100644 index 0000000..183b51b --- /dev/null +++ b/lib/dto/domains.ts @@ -0,0 +1,122 @@ +import { Domain } from "@prisma/client"; + +import { prisma } from "../db"; + +// In-memory cache +let domainConfigCache: Domain[] | null = null; +let lastCacheUpdate = 0; +const CACHE_DURATION = 60 * 1000; // Cache for 1 minute in memory + +export const FeatureMap = { + short: "enable_short_link", + email: "enable_email", + record: "enable_dns", +}; + +export interface DomainConfig { + domain_name: string; + enable_short_link: boolean; + enable_email: boolean; + enable_dns: boolean; + cf_zone_id: string | null; + cf_api_key: string | null; + cf_email: string | null; + cf_api_key_encrypted: boolean; + max_short_links: number | null; + max_email_forwards: number | null; + max_dns_records: number | null; + active: boolean; +} + +export interface DomainFormData extends DomainConfig { + id?: string; + createdAt: Date; + updatedAt: Date; +} + +export async function getAllDomains() { + try { + const now = Date.now(); + if (domainConfigCache && now - lastCacheUpdate < CACHE_DURATION) { + return domainConfigCache; + } + + const domains = await prisma.domain.findMany({ + // where: { active: true }, + }); + + domainConfigCache = domains; + lastCacheUpdate = now; + return domains; + } catch (error) { + throw new Error(`Failed to fetch domain config: ${error.message}`); + } +} + +export async function getDomainsByFeature( + feature: string, + admin: boolean = false, +) { + try { + const now = Date.now(); + if (domainConfigCache && now - lastCacheUpdate < CACHE_DURATION) { + return domainConfigCache; + } + + const domains = await prisma.domain.findMany({ + where: { [feature]: true }, + select: { + domain_name: true, + enable_short_link: admin, + enable_email: admin, + enable_dns: admin, + cf_zone_id: admin, + cf_api_key: admin, + cf_email: admin, + }, + }); + return domains; + } catch (error) { + throw new Error(`Failed to fetch domain config: ${error.message}`); + } +} + +export async function createDomain(data: DomainConfig) { + try { + const createdDomain = await prisma.domain.create({ data }); + return createdDomain; + } catch (error) { + throw new Error(`Failed to create domain: ${error.message}`); + } +} + +export async function updateDomain(id: string, data) { + try { + const updatedDomain = await prisma.domain.update({ + where: { id }, + data: { + ...data, + updatedAt: new Date(), + }, + }); + return updatedDomain; + } catch (error) { + throw new Error(`Failed to update domain: ${error.message}`); + } +} + +export async function deleteDomain(domain_name: string) { + try { + const deletedDomain = await prisma.domain.delete({ + where: { domain_name }, + }); + return deletedDomain; + } catch (error) { + throw new Error(`Failed to delete domain`); + } +} + +export function invalidateDomainConfigCache() { + domainConfigCache = null; + lastCacheUpdate = 0; +} diff --git a/lib/utils.ts b/lib/utils.ts index 752eb01..9b2c1ab 100644 --- a/lib/utils.ts +++ b/lib/utils.ts @@ -388,25 +388,3 @@ export function extractHost(url: string): string { const match = url.match(regex); return match ? match[1] : ""; } - -// 解析 CLOUDFLARE_ZONE 环境变量并返回结构化的域名配置 -export function parseZones(raw: string) { - let zones; - - try { - zones = JSON.parse(raw); - } catch (error) { - return []; - } - - if (!Array.isArray(zones)) { - return []; - } - - const parsedZones = zones.map((zone) => { - const { zone_id, zone_name } = zone; - return { zone_id, zone_name }; - }); - - return parsedZones; -} diff --git a/lib/validations/domain.ts b/lib/validations/domain.ts new file mode 100644 index 0000000..5af3b04 --- /dev/null +++ b/lib/validations/domain.ts @@ -0,0 +1,17 @@ +import * as z from "zod"; + +export const createDomainSchema = z.object({ + id: z.string().optional(), + domain_name: z.string().min(2), + enable_short_link: z.boolean(), + enable_email: z.boolean(), + enable_dns: z.boolean(), + cf_zone_id: z.string().optional(), + cf_api_key: z.string().optional(), + cf_email: z.string().optional(), + cf_api_key_encrypted: z.boolean().default(false), + max_short_links: z.number().optional(), + max_email_forwards: z.number().optional(), + max_dns_records: z.number().optional(), + active: z.boolean().default(true), +}); diff --git a/package.json b/package.json index 65bfb75..698f52c 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "wr.do", - "version": "0.5.1", + "version": "0.6.0", "author": { "name": "oiov", "url": "https://github.com/oiov" diff --git a/prisma/migrations/20250520104322/migration.sql b/prisma/migrations/20250520104322/migration.sql new file mode 100644 index 0000000..b5fc73c --- /dev/null +++ b/prisma/migrations/20250520104322/migration.sql @@ -0,0 +1,18 @@ +CREATE TABLE domains +( + "id" UUID PRIMARY KEY DEFAULT gen_random_uuid(), + "domain_name" TEXT NOT NULL UNIQUE, + "enable_short_link" BOOLEAN DEFAULT FALSE, + "enable_email" BOOLEAN DEFAULT FALSE, + "enable_dns" BOOLEAN DEFAULT FALSE, + "cf_zone_id" TEXT NOT NULL, + "cf_api_key" TEXT NOT NULL, + "cf_email" TEXT NOT NULL, + "cf_api_key_encrypted" BOOLEAN DEFAULT FALSE, + "max_short_links" INTEGER, + "max_email_forwards" INTEGER, + "max_dns_records" INTEGER, + "active" BOOLEAN DEFAULT TRUE, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP +); \ No newline at end of file diff --git a/prisma/schema.prisma b/prisma/schema.prisma index 4c4a4c3..eb5c069 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -247,3 +247,24 @@ model UserSendEmail { @@index([createdAt]) @@map("user_send_emails") } + +model Domain { + id String @id @default(uuid()) + domain_name String @unique + enable_short_link Boolean @default(false) + enable_email Boolean @default(false) + enable_dns Boolean @default(false) + cf_zone_id String? + cf_api_key String? + cf_email String? + cf_api_key_encrypted Boolean + max_short_links Int? + max_email_forwards Int? + max_dns_records Int? + active Boolean @default(true) + + createdAt DateTime @default(now()) + updatedAt DateTime @default(now()) + + @@map("domains") +} diff --git a/public/_static/docs/domain-form.png b/public/_static/docs/domain-form.png new file mode 100644 index 0000000000000000000000000000000000000000..9b8b21de6dbbb29a66758b70472c5e50185d5187 GIT binary patch literal 340596 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 -https://wr.do/robots.txt2025-05-19T13:47:40.142Zdaily0.7 -https://wr.do/pricing2025-05-19T13:47:40.142Zdaily0.7 -https://wr.do/privacy2025-05-19T13:47:40.142Zdaily0.7 -https://wr.do/terms2025-05-19T13:47:40.142Zdaily0.7 -https://wr.do/docs2025-05-19T13:47:40.142Zdaily0.7 -https://wr.do/docs/developer/authentification2025-05-19T13:47:40.142Zdaily0.7 -https://wr.do/docs/developer/cloudflare2025-05-19T13:47:40.142Zdaily0.7 -https://wr.do/docs/developer/cloudflare-email-worker2025-05-19T13:47:40.142Zdaily0.7 -https://wr.do/docs/developer/components2025-05-19T13:47:40.142Zdaily0.7 -https://wr.do/docs/developer/config-files2025-05-19T13:47:40.142Zdaily0.7 -https://wr.do/docs/developer/database2025-05-19T13:47:40.142Zdaily0.7 -https://wr.do/docs/developer/email2025-05-19T13:47:40.142Zdaily0.7 -https://wr.do/docs/developer/installation2025-05-19T13:47:40.142Zdaily0.7 -https://wr.do/docs/developer/markdown-files2025-05-19T13:47:40.142Zdaily0.7 -https://wr.do/docs/developer/quick-start2025-05-19T13:47:40.142Zdaily0.7 -https://wr.do/docs/dns-records2025-05-19T13:47:40.142Zdaily0.7 -https://wr.do/docs/emails2025-05-19T13:47:40.142Zdaily0.7 -https://wr.do/docs/examples/cloudflare2025-05-19T13:47:40.142Zdaily0.7 -https://wr.do/docs/examples/other2025-05-19T13:47:40.142Zdaily0.7 -https://wr.do/docs/examples/vercel2025-05-19T13:47:40.142Zdaily0.7 -https://wr.do/docs/examples/zeabur2025-05-19T13:47:40.142Zdaily0.7 -https://wr.do/docs/open-api2025-05-19T13:47:40.142Zdaily0.7 -https://wr.do/docs/open-api/icon2025-05-19T13:47:40.142Zdaily0.7 -https://wr.do/docs/open-api/markdown2025-05-19T13:47:40.142Zdaily0.7 -https://wr.do/docs/open-api/meta-info2025-05-19T13:47:40.142Zdaily0.7 -https://wr.do/docs/open-api/qrcode2025-05-19T13:47:40.142Zdaily0.7 -https://wr.do/docs/open-api/screenshot2025-05-19T13:47:40.142Zdaily0.7 -https://wr.do/docs/open-api/text2025-05-19T13:47:40.142Zdaily0.7 -https://wr.do/docs/plan2025-05-19T13:47:40.142Zdaily0.7 -https://wr.do/docs/quick-start2025-05-19T13:47:40.142Zdaily0.7 -https://wr.do/docs/short-urls2025-05-19T13:47:40.142Zdaily0.7 -https://wr.do/docs/wroom2025-05-19T13:47:40.142Zdaily0.7 -https://wr.do/password-prompt2025-05-19T13:47:40.142Zdaily0.7 -https://wr.do/chat2025-05-19T13:47:40.142Zdaily0.7 -https://wr.do/manifest.json2025-05-19T13:47:40.142Zdaily0.7 -https://wr.do/opengraph-image.jpg2025-05-19T13:47:40.142Zdaily0.7 +https://wr.do/robots.txt2025-05-20T14:43:25.018Zdaily0.7 +https://wr.do/chat2025-05-20T14:43:25.018Zdaily0.7 +https://wr.do/docs2025-05-20T14:43:25.018Zdaily0.7 +https://wr.do/docs/developer/authentification2025-05-20T14:43:25.018Zdaily0.7 +https://wr.do/docs/developer/cloudflare2025-05-20T14:43:25.018Zdaily0.7 +https://wr.do/docs/developer/cloudflare-email-worker2025-05-20T14:43:25.018Zdaily0.7 +https://wr.do/docs/developer/components2025-05-20T14:43:25.018Zdaily0.7 +https://wr.do/docs/developer/config-files2025-05-20T14:43:25.018Zdaily0.7 +https://wr.do/docs/developer/database2025-05-20T14:43:25.018Zdaily0.7 +https://wr.do/docs/developer/email2025-05-20T14:43:25.018Zdaily0.7 +https://wr.do/docs/developer/installation2025-05-20T14:43:25.018Zdaily0.7 +https://wr.do/docs/developer/markdown-files2025-05-20T14:43:25.018Zdaily0.7 +https://wr.do/docs/developer/quick-start2025-05-20T14:43:25.018Zdaily0.7 +https://wr.do/docs/dns-records2025-05-20T14:43:25.018Zdaily0.7 +https://wr.do/docs/emails2025-05-20T14:43:25.018Zdaily0.7 +https://wr.do/docs/examples/cloudflare2025-05-20T14:43:25.018Zdaily0.7 +https://wr.do/docs/examples/other2025-05-20T14:43:25.018Zdaily0.7 +https://wr.do/docs/examples/vercel2025-05-20T14:43:25.018Zdaily0.7 +https://wr.do/docs/examples/zeabur2025-05-20T14:43:25.018Zdaily0.7 +https://wr.do/docs/open-api2025-05-20T14:43:25.018Zdaily0.7 +https://wr.do/docs/open-api/icon2025-05-20T14:43:25.018Zdaily0.7 +https://wr.do/docs/open-api/markdown2025-05-20T14:43:25.018Zdaily0.7 +https://wr.do/docs/open-api/meta-info2025-05-20T14:43:25.018Zdaily0.7 +https://wr.do/docs/open-api/qrcode2025-05-20T14:43:25.018Zdaily0.7 +https://wr.do/docs/open-api/screenshot2025-05-20T14:43:25.018Zdaily0.7 +https://wr.do/docs/open-api/text2025-05-20T14:43:25.018Zdaily0.7 +https://wr.do/docs/plan2025-05-20T14:43:25.018Zdaily0.7 +https://wr.do/docs/quick-start2025-05-20T14:43:25.018Zdaily0.7 +https://wr.do/docs/short-urls2025-05-20T14:43:25.018Zdaily0.7 +https://wr.do/docs/wroom2025-05-20T14:43:25.018Zdaily0.7 +https://wr.do/password-prompt2025-05-20T14:43:25.018Zdaily0.7 +https://wr.do/pricing2025-05-20T14:43:25.018Zdaily0.7 +https://wr.do/privacy2025-05-20T14:43:25.018Zdaily0.7 +https://wr.do/terms2025-05-20T14:43:25.018Zdaily0.7 +https://wr.do/manifest.json2025-05-20T14:43:25.018Zdaily0.7 +https://wr.do/opengraph-image.jpg2025-05-20T14:43:25.018Zdaily0.7 \ No newline at end of file diff --git a/public/sw.js b/public/sw.js index acac387..10bb6b1 100644 --- a/public/sw.js +++ b/public/sw.js @@ -1 +1,101 @@ -if(!self.define){let e,i={};const s=(s,a)=>(s=new URL(s+".js",a).href,i[s]||new Promise((i=>{if("document"in self){const e=document.createElement("script");e.src=s,e.onload=i,document.head.appendChild(e)}else e=s,importScripts(s),i()})).then((()=>{let e=i[s];if(!e)throw new Error(`Module ${s} didn’t register its module`);return e})));self.define=(a,n)=>{const t=e||("document"in self?document.currentScript.src:"")||location.href;if(i[t])return;let c={};const r=e=>s(e,t),d={module:{uri:t},exports:c,require:r};i[t]=Promise.all(a.map((e=>d[e]||r(e)))).then((e=>(n(...e),c)))}}define(["./workbox-e9849328"],(function(e){"use strict";importScripts(),self.skipWaiting(),e.clientsClaim(),e.precacheAndRoute([{url:"/_next/app-build-manifest.json",revision:"36fe5de2ed0becc9f87cd2cace2cf251"},{url:"/_next/static/Zii8KOhYgpETjkX-z9n4Y/_buildManifest.js",revision:"73b52720bea01027a804a328361e8618"},{url:"/_next/static/Zii8KOhYgpETjkX-z9n4Y/_ssgManifest.js",revision:"b6652df95db52feb4daf4eca35380933"},{url:"/_next/static/chunks/1216.057c6927e653812a.js",revision:"057c6927e653812a"},{url:"/_next/static/chunks/1403-a3d81771e852e5cf.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/1826-eeb2dec820b91ccd.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/1932-3e4aa4210ec36606.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/2052-21bff78b03cb5c4d.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/2071-aa1f7133d51be4b9.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/2171-9a1ff0ce96870317.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/2207-4bdf30c4774b0c4c.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/2383-b8c179c6b36104e3.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/2435-61d409c80e01097a.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/2448-6326b697d799a586.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/2560-5443986a93a575e1.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/2694-cf9d685efb57db76.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/2857-e043ef3d22cae2ff.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/2918-3e089134e978a652.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/3005-1ff64d5da18ed405.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/3107-fab00402de5c9da9.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/3203-d4d8074ad2880903.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/321-f0ee4210d84c0929.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/3250-65a3fdc437438a98.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/3422-b5f001f63e2f252a.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/3654-d9aea5e61383aaac.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/435-125edd1a8a547507.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/4862-7aade0f792895ce1.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/501-b7ed66c1a62416dd.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/5107-3814fb64d8e35baa.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/5276-3ab1a4049fb02bfb.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/5434-7a651b6f86e4e66e.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/5596-ff4a78279462ec85.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/5699-38741365d68fe6af.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/5845-0a6955d226e1eb29.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/6254-4541e65b79eccb47.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/656-9a28544695bc499d.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/7056-fafec3cde147d372.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/7241-2437eeecd9994098.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/7567-59fdad9479975a76.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/7789-6f79c02428fdc02d.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/7797-504f77909dbb8a9c.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/7865-4b8ee6b3bca69bf8.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/7976-3bccb3a48c4dc527.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/8333-eb210683b72846db.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/8599-57409b44d3000698.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/8854-b5be0fb210099b34.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/9305-2df17c8fba5d9855.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/9521-fcfac90176e0fd32.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/9586-c46110f85fe2b96d.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/9596-ad40ff9c0746ddb2.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/a33f0537-4968ab0047fe8bc4.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/app/(auth)/layout-0de19d3a8d6c02ff.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/app/(auth)/login/page-24e6a0f975545944.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/app/(auth)/register/page-0d5ef98144d8399f.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/app/(docs)/docs/%5B%5B...slug%5D%5D/page-03f7ec3b422595f8.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/app/(docs)/docs/layout-2a72cef66b32135f.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/app/(docs)/layout-9ab5e63523e563f3.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/app/(marketing)/%5Bslug%5D/page-3a99fb09a3075a6f.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/app/(marketing)/error-08a3e55698094ed5.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/app/(marketing)/layout-46924c891bd04bac.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/app/(marketing)/not-found-d5f4451fe8d5c1ec.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/app/(marketing)/page-d62c4691b8ff6ab7.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/app/(protected)/admin/layout-703b7afeba662805.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/app/(protected)/admin/loading-66e41872e1d2db26.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/app/(protected)/admin/page-0ab4304a56f4b98c.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/app/(protected)/admin/records/loading-6cd8ecf96d423ba6.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/app/(protected)/admin/records/page-da14669c9e6acdea.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/app/(protected)/admin/urls/loading-93e86960074b4af7.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/app/(protected)/admin/urls/page-d2e1d1f6b50f7498.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/app/(protected)/admin/users/loading-8ab81494dd76c76b.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/app/(protected)/admin/users/page-bfee9edaa8677978.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/app/(protected)/dashboard/loading-3194020f1d1e0be2.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/app/(protected)/dashboard/page-c0e884304028d9d3.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/app/(protected)/dashboard/records/loading-a84f12bb7a95ccbe.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/app/(protected)/dashboard/records/page-0f744a8e1caf897e.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/app/(protected)/dashboard/scrape/loading-9632f72e818f3e03.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/app/(protected)/dashboard/scrape/markdown/loading-8b8460129cc90b8e.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/app/(protected)/dashboard/scrape/markdown/page-3d67e1fd54d56cd4.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/app/(protected)/dashboard/scrape/meta-info/loading-95ba21083227762a.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/app/(protected)/dashboard/scrape/meta-info/page-231621a1ea86e149.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/app/(protected)/dashboard/scrape/page-16aaee7258379007.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/app/(protected)/dashboard/scrape/qrcode/loading-7fa037fca5cf9ffd.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/app/(protected)/dashboard/scrape/qrcode/page-38ae9e4f7f2b4917.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/app/(protected)/dashboard/scrape/screenshot/loading-6118431b0fe6fb9a.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/app/(protected)/dashboard/scrape/screenshot/page-8a12ecab9b0c33b5.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/app/(protected)/dashboard/settings/loading-f709547ad4dfc8fd.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/app/(protected)/dashboard/settings/page-2716617f83ba6cd7.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/app/(protected)/dashboard/urls/loading-29795e0cdb30579a.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/app/(protected)/dashboard/urls/page-31467c4aec3a6da7.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/app/(protected)/layout-7bd55e96b10d187c.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/app/_not-found/page-daa34574791408f5.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/app/chat/layout-cff4d5ab6fd92794.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/app/chat/loading-d6f1b19ae4ffa996.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/app/chat/page-2075d07b7ef24794.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/app/emails/layout-0adcdebb603898d1.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/app/emails/loading-b97deef9df6bc2f9.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/app/emails/page-12eaff45c79464e6.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/app/layout-aa1553734c40ad19.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/app/not-found-f63b66c698305b83.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/app/password-prompt/layout-9f58a2a175509179.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/app/password-prompt/loading-7606ab971d8f9c78.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/app/password-prompt/page-a088d73ee2017dc7.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/ba634aa8-4cec903169236942.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/db206de2-aac614a3ce7bab9d.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/ef956ed8.c4c1ce487e6e4c3b.js",revision:"c4c1ce487e6e4c3b"},{url:"/_next/static/chunks/framework-20afca218c33ed8b.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/main-38f36e477a72f9a3.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/main-app-571fe4d9916d1d2b.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/pages/_app-6eec5c984b7548b1.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/pages/_error-cffe1ad5943208e4.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/polyfills-42372ed130431b0a.js",revision:"846118c33b2c0e922d7b3a7676f81f6f"},{url:"/_next/static/chunks/webpack-c211471883aae3aa.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/css/26f2d9014a23aebc.css",revision:"26f2d9014a23aebc"},{url:"/_next/static/css/45a6a8d6489d6174.css",revision:"45a6a8d6489d6174"},{url:"/_next/static/css/8aee48eb52f4c731.css",revision:"8aee48eb52f4c731"},{url:"/_next/static/css/e6f1d3c8243b4096.css",revision:"e6f1d3c8243b4096"},{url:"/_next/static/media/26a46d62cd723877-s.woff2",revision:"befd9c0fdfa3d8a645d5f95717ed6420"},{url:"/_next/static/media/55c55f0601d81cf3-s.woff2",revision:"43828e14271c77b87e3ed582dbff9f74"},{url:"/_next/static/media/581909926a08bbc8-s.woff2",revision:"f0b86e7c24f455280b8df606b89af891"},{url:"/_next/static/media/6d93bde91c0c2823-s.woff2",revision:"621a07228c8ccbfd647918f1021b4868"},{url:"/_next/static/media/90475aac776488b6-s.p.woff2",revision:"183db31d6365283bef4914042be9dfab"},{url:"/_next/static/media/97e0cb1ae144a2a9-s.woff2",revision:"e360c61c5bd8d90639fd4503c829c2dc"},{url:"/_next/static/media/a34f9d1faa5f3315-s.p.woff2",revision:"d4fe31e6a2aebc06b8d6e558c9141119"},{url:"/_next/static/media/d9396795aa5ec363-s.p.woff2",revision:"70880e42f07b0386e261974cd14820a1"},{url:"/_next/static/media/df0a9ae256c0569c-s.woff2",revision:"d54db44de5ccb18886ece2fda72bdfe0"},{url:"/_static/blog/blog-post-1.jpg",revision:"d91bb1224212bd1a832f99fe7494554f"},{url:"/_static/blog/blog-post-2.jpg",revision:"04442fcb79e9538e65be3476b2b6aa3a"},{url:"/_static/blog/blog-post-3.jpg",revision:"a758717dd624c5900385151290cf378d"},{url:"/_static/blog/blog-post-4.jpg",revision:"135c157ecc4dfcbac1ebe27a04f40d84"},{url:"/_static/docs/gg-auth-config.jpg",revision:"8e10e48df3a501dc502c36bb581b7247"},{url:"/_static/docs/link/disabled.svg",revision:"cbad92372683a3f9dd8ef50de2260671"},{url:"/_static/docs/link/error-404.svg",revision:"d615612fce1b8a1436dae35bf36023a2"},{url:"/_static/docs/link/error.svg",revision:"16eef297f91340059a082e8400315cbf"},{url:"/_static/docs/link/expired.svg",revision:"2e066f0b45e25175fb716ce6adb60790"},{url:"/_static/docs/link/password-error.svg",revision:"48abd97bfdb089354ff043b760041ed3"},{url:"/_static/docs/link/password.svg",revision:"e8a849a581fc25ae08a8c06da1c06320"},{url:"/_static/docs/r2-domain.png",revision:"a5855dba9a2793cffdd14b06c9b266a9"},{url:"/_static/examples/vercel_01.png",revision:"b9ec020bc5de0489ea314526dc1f4a38"},{url:"/_static/examples/vercel_02.png",revision:"a5a0dfb0b257becb83e6b70cbccc4490"},{url:"/_static/examples/vercel_03.png",revision:"e002acbc83d08aa0e9a650a71d1d02da"},{url:"/_static/examples/zeabur_01.png",revision:"06be65f37902549a587de901020a79f6"},{url:"/_static/examples/zeabur_02.png",revision:"d202334b902359133a9283c5500b20f2"},{url:"/_static/examples/zeabur_03.png",revision:"071418bf8c5046459e675d024e90b90b"},{url:"/_static/fonts/BAHAMASB.woff",revision:"19c1033177bfe869798e41c1d65c37d9"},{url:"/_static/fonts/BAHAMASN.woff",revision:"e5d96cc42c5bc3f5ae3302f9cdef6c9b"},{url:"/_static/illustrations/call-waiting.svg",revision:"bc1d08db6006f643c596558a8ce2115e"},{url:"/_static/illustrations/rocket-crashed.svg",revision:"f1404f635f3e5b8802646d01a0d46cbb"},{url:"/_static/images/dark-preview.png",revision:"d7093683aa7e5af23221dadaf49ede30"},{url:"/_static/images/example_01.png",revision:"1d2699ca9873d6daafdd41979e28b1c7"},{url:"/_static/images/example_02.png",revision:"cd9115f8c6c34ab8433510080e3f26dd"},{url:"/_static/images/example_03.png",revision:"9e3d01f11f45250445970f3f05bda52d"},{url:"/_static/images/light-preview.png",revision:"41b076e5d40d2382934bee8af8b483bc"},{url:"/_static/images/linuxdo.png",revision:"8f5868732c21463c570d75b36b43f62a"},{url:"/_static/images/linuxdo.webp",revision:"8f5868732c21463c570d75b36b43f62a"},{url:"/_static/images/password.png",revision:"603c0a0c8d10a9e81c422eba1ada41c0"},{url:"/_static/images/x-preview.png",revision:"26d9863ac8c1b935952432b5e79c9a81"},{url:"/_static/landing/domain.svg",revision:"c4be3f261dfb1e4c61b7f30abb409f99"},{url:"/_static/landing/email.svg",revision:"9354fe80bbc5421ff640b36017e7af29"},{url:"/_static/landing/hosting.svg",revision:"7849257e1bcc8a86937f2bcc40d3f867"},{url:"/_static/landing/info.svg",revision:"561ecee752d14d4d0b36be16e213f2d1"},{url:"/_static/landing/link.svg",revision:"dd87c312fd827b2e6734d3e7bf53defe"},{url:"/_static/landing/mailbox.svg",revision:"f7e75f4cbbf10db07f72b3ce8f334bcd"},{url:"/_static/landing/screenshot.svg",revision:"153ab26682a679fee86dc68e2889172f"},{url:"/_static/logo.png",revision:"4c7bd029735bc3a7896a5ab1d689c949"},{url:"/_static/logo.svg",revision:"44cc28924d5edf3bde71f92e39348312"},{url:"/_static/og.jpg",revision:"a4b52bc6e3ffacbf6ea33ce23a37da8f"},{url:"/_static/wr.png",revision:"45189df007a8b89e4914fa9a6c47ccc7"},{url:"/_static/wrdo.png",revision:"d6edf9a7e97b6408e5aa3a69f2374f10"},{url:"/favicon.ico",revision:"4c7bd029735bc3a7896a5ab1d689c949"},{url:"/llms.txt",revision:"beb0322b35b77077ac55b38e0c03d303"},{url:"/manifest.json",revision:"bc7cf2817813a67c5c3f841a3a54d1aa"},{url:"/robots.txt",revision:"001eed25907c33863f2e60dfe3620dfd"},{url:"/site.webmanifest",revision:"bc7cf2817813a67c5c3f841a3a54d1aa"},{url:"/sitemap-0.xml",revision:"9b41a6f0d305a5ad924906a8f155097f"},{url:"/sitemap.xml",revision:"175031181630b79b72c538659e0fe91c"}],{ignoreURLParametersMatching:[]}),e.cleanupOutdatedCaches(),e.registerRoute("/",new e.NetworkFirst({cacheName:"start-url",plugins:[{cacheWillUpdate:async({request:e,response:i,event:s,state:a})=>i&&"opaqueredirect"===i.type?new Response(i.body,{status:200,statusText:"OK",headers:i.headers}):i}]}),"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 i=e.pathname;return!i.startsWith("/api/auth/")&&!!i.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")})); +/** + * 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) { + let registry = {}; + + // Used for `eval` and `importScripts` where we can't get script URL by other means. + // In both cases, it's safe to use a global var because those functions are synchronous. + let nextDefineUri; + + const singleRequire = (uri, parentUri) => { + uri = new URL(uri + ".js", parentUri).href; + return registry[uri] || ( + + new Promise(resolve => { + if ("document" in self) { + const script = document.createElement("script"); + script.src = uri; + script.onload = resolve; + document.head.appendChild(script); + } else { + nextDefineUri = uri; + importScripts(uri); + resolve(); + } + }) + + .then(() => { + let promise = registry[uri]; + if (!promise) { + throw new Error(`Module ${uri} didn’t register its module`); + } + return promise; + }) + ); + }; + + self.define = (depsNames, factory) => { + const uri = nextDefineUri || ("document" in self ? document.currentScript.src : "") || location.href; + if (registry[uri]) { + // Module is already loading or loaded. + return; + } + let exports = {}; + const require = depUri => singleRequire(depUri, uri); + const specialDeps = { + module: { uri }, + exports, + require + }; + registry[uri] = Promise.all(depsNames.map( + depName => specialDeps[depName] || require(depName) + )).then(deps => { + factory(...deps); + return exports; + }); + }; +} +define(['./workbox-8817a5e5'], (function (workbox) { 'use strict'; + + 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 diff --git a/public/sw.js.map b/public/sw.js.map new file mode 100644 index 0000000..95b5bf0 --- /dev/null +++ b/public/sw.js.map @@ -0,0 +1 @@ +{"version":3,"file":"sw.js","sources":["../../../../../../private/var/folders/9b/3qmyp8zd2xvdspdrp149fyg00000gn/T/04443f5fc75df19ba6a55a8a764fbf11/sw.js"],"sourcesContent":["import {registerRoute as workbox_routing_registerRoute} from '/Users/songjunxi/Desktop/repos/wrdo-app/wr.do/node_modules/.pnpm/workbox-routing@6.6.0/node_modules/workbox-routing/registerRoute.mjs';\nimport {NetworkFirst as workbox_strategies_NetworkFirst} from '/Users/songjunxi/Desktop/repos/wrdo-app/wr.do/node_modules/.pnpm/workbox-strategies@6.6.0/node_modules/workbox-strategies/NetworkFirst.mjs';\nimport {NetworkOnly as workbox_strategies_NetworkOnly} from '/Users/songjunxi/Desktop/repos/wrdo-app/wr.do/node_modules/.pnpm/workbox-strategies@6.6.0/node_modules/workbox-strategies/NetworkOnly.mjs';\nimport {clientsClaim as workbox_core_clientsClaim} from '/Users/songjunxi/Desktop/repos/wrdo-app/wr.do/node_modules/.pnpm/workbox-core@6.6.0/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":"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"} \ No newline at end of file diff --git a/public/workbox-8817a5e5.js b/public/workbox-8817a5e5.js new file mode 100644 index 0000000..d4d3c9f --- /dev/null +++ b/public/workbox-8817a5e5.js @@ -0,0 +1,2456 @@ +define(['exports'], (function (exports) { 'use strict'; + + // @ts-ignore + try { + self['workbox:core:6.5.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 globalThis)) { + self.__WB_DISABLE_DEV_LOGS = false; + } + let inGroup = false; + const methodToColorMap = { + debug: `#7f8c8d`, + log: `#2ecc71`, + warn: `#f39c12`, + error: `#c0392b`, + groupCollapsed: `#3498db`, + groupEnd: null // No colored prefix on groupEnd + }; + 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}.`; + }, + 'opaque-streams-source': ({ + type + }) => { + const message = `One of the workbox-streams sources resulted in an ` + `'${type}' response.`; + if (type === 'opaqueredirect') { + return `${message} Please do not use a navigation request that results ` + `in a redirect as a source.`; + } + return `${message} Please ensure your sources are CORS-enabled.`; + } + }; + + /* + 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 + }; + + // @ts-ignore + try { + self['workbox:routing:6.5.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 workbox-routing + */ + class Route { + /** + * Constructor for Route class. + * + * @param {workbox-routing~matchCallback} match + * A callback function that determines whether the route matches a given + * `fetch` event by returning a non-falsy value. + * @param {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 {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 + * {@link 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. + * + * @memberof workbox-routing + * @extends 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 + * {@link workbox-routing~handlerCallback} `params` + * argument. + * + * @param {RegExp} regExp The regular expression to match against URLs. + * @param {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` using one or more + * {@link workbox-routing.Route}, responding with a `Response` 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 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' + // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access + if (event.data && event.data.type === 'CACHE_URLS') { + // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment + const { + payload + } = event.data; + { + logger.debug(`Caching URLs from the window`, payload.urlsToCache); + } + const requestPromises = Promise.all(payload.urlsToCache.map(entry => { + if (typeof entry === 'string') { + entry = [entry]; + } + const request = new Request(...entry); + return this.handleRequest({ + request, + event + }); + // TODO(philipwalton): TypeScript errors without this typecast for + // some reason (probably a bug). The real type here should work but + // doesn't: `Array | undefined>`. + })); // TypeScript + event.waitUntil(requestPromises); + // If a MessageChannel was used, reply to the message on success. + if (event.ports && event.ports[0]) { + 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 {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 {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 {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 {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 {@link workbox-routing.Router#registerRoute}. + * + * @param {RegExp|string|workbox-routing.Route~matchCallback|workbox-routing.Route} capture + * If the capture param is a `Route`, all other arguments will be ignored. + * @param {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 {workbox-routing.Route} The generated `Route`. + * + * @memberof 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; + } + + // @ts-ignore + try { + self['workbox:strategies:6.5.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. + */ + // Callbacks to be executed whenever there's a quota error. + // 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 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 + * {@link workbox-strategies.Strategy~handle} or + * {@link 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 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 {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] The return value from the + * {@link 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 workbox-strategies.StrategyHandler + */ + /** + * The event associated with this request. + * @name event + * @instance + * @type {ExtendableEvent} + * @memberof 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 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 + * {@link workbox-routing~matchCallback} returned + * a truthy value (it will be that value). + * @name params + * @instance + * @type {*|undefined} + * @memberof 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) { + const key = `${request.url} | ${mode}`; + if (!this._cacheKeys[key]) { + 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 // eslint-disable-line + })); + } + this._cacheKeys[key] = effectiveRequest; + } + return this._cacheKeys[key]; + } + /** + * 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 + * {@link 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 + * {@link 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 + * {@link 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 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 + * {@link 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 + * {@link 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 + * {@link 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 {@link 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 {@link 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 {workbox-strategies.StrategyHandler} handler + * @return {Promise} + * + * @memberof 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](https://developer.chrome.com/docs/workbox/caching-strategies-overview/#network-first-falling-back-to-cache) + * request strategy. + * + * By default, this strategy will cache responses with a 200 status code as + * well as [opaque responses](https://developer.chrome.com/docs/workbox/caching-resources-during-runtime/#opaque-responses). + * Opaque responses are are cross-origin requests where the response doesn't + * support [CORS](https://enable-cors.org/). + * + * If the network request fails, and there is no cache match, this will throw + * a `WorkboxError` exception. + * + * @extends workbox-strategies.Strategy + * @memberof 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 + * {@link 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 {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](https://developer.chrome.com/docs/workbox/caching-strategies-overview/#network-only) + * request strategy. + * + * This class is useful if you want to take advantage of any + * [Workbox plugins](https://developer.chrome.com/docs/workbox/using-plugins/). + * + * If the network request fails, this will throw a `WorkboxError` exception. + * + * @extends workbox-strategies.Strategy + * @memberof 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 {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 workbox-core + */ + function clientsClaim() { + self.addEventListener('activate', () => self.clients.claim()); + } + + exports.NetworkFirst = NetworkFirst; + exports.NetworkOnly = NetworkOnly; + exports.clientsClaim = clientsClaim; + exports.registerRoute = registerRoute; + +})); +//# sourceMappingURL=workbox-8817a5e5.js.map diff --git a/public/workbox-8817a5e5.js.map b/public/workbox-8817a5e5.js.map new file mode 100644 index 0000000..484021e --- /dev/null +++ b/public/workbox-8817a5e5.js.map @@ -0,0 +1 @@ +{"version":3,"file":"workbox-8817a5e5.js","sources":["node_modules/.pnpm/workbox-core@6.6.0/node_modules/workbox-core/_version.js","node_modules/.pnpm/workbox-core@6.6.0/node_modules/workbox-core/_private/logger.js","node_modules/.pnpm/workbox-core@6.6.0/node_modules/workbox-core/models/messages/messages.js","node_modules/.pnpm/workbox-core@6.6.0/node_modules/workbox-core/models/messages/messageGenerator.js","node_modules/.pnpm/workbox-core@6.6.0/node_modules/workbox-core/_private/WorkboxError.js","node_modules/.pnpm/workbox-core@6.6.0/node_modules/workbox-core/_private/assert.js","node_modules/.pnpm/workbox-routing@6.6.0/node_modules/workbox-routing/_version.js","node_modules/.pnpm/workbox-routing@6.6.0/node_modules/workbox-routing/utils/constants.js","node_modules/.pnpm/workbox-routing@6.6.0/node_modules/workbox-routing/utils/normalizeHandler.js","node_modules/.pnpm/workbox-routing@6.6.0/node_modules/workbox-routing/Route.js","node_modules/.pnpm/workbox-routing@6.6.0/node_modules/workbox-routing/RegExpRoute.js","node_modules/.pnpm/workbox-core@6.6.0/node_modules/workbox-core/_private/getFriendlyURL.js","node_modules/.pnpm/workbox-routing@6.6.0/node_modules/workbox-routing/Router.js","node_modules/.pnpm/workbox-routing@6.6.0/node_modules/workbox-routing/utils/getOrCreateDefaultRouter.js","node_modules/.pnpm/workbox-routing@6.6.0/node_modules/workbox-routing/registerRoute.js","node_modules/.pnpm/workbox-strategies@6.6.0/node_modules/workbox-strategies/_version.js","node_modules/.pnpm/workbox-strategies@6.6.0/node_modules/workbox-strategies/plugins/cacheOkAndOpaquePlugin.js","node_modules/.pnpm/workbox-core@6.6.0/node_modules/workbox-core/_private/cacheNames.js","node_modules/.pnpm/workbox-core@6.6.0/node_modules/workbox-core/_private/cacheMatchIgnoreParams.js","node_modules/.pnpm/workbox-core@6.6.0/node_modules/workbox-core/_private/Deferred.js","node_modules/.pnpm/workbox-core@6.6.0/node_modules/workbox-core/models/quotaErrorCallbacks.js","node_modules/.pnpm/workbox-core@6.6.0/node_modules/workbox-core/_private/executeQuotaErrorCallbacks.js","node_modules/.pnpm/workbox-core@6.6.0/node_modules/workbox-core/_private/timeout.js","node_modules/.pnpm/workbox-strategies@6.6.0/node_modules/workbox-strategies/StrategyHandler.js","node_modules/.pnpm/workbox-strategies@6.6.0/node_modules/workbox-strategies/Strategy.js","node_modules/.pnpm/workbox-strategies@6.6.0/node_modules/workbox-strategies/utils/messages.js","node_modules/.pnpm/workbox-strategies@6.6.0/node_modules/workbox-strategies/NetworkFirst.js","node_modules/.pnpm/workbox-strategies@6.6.0/node_modules/workbox-strategies/NetworkOnly.js","node_modules/.pnpm/workbox-core@6.6.0/node_modules/workbox-core/clientsClaim.js"],"sourcesContent":["\"use strict\";\n// @ts-ignore\ntry {\n self['workbox:core:6.5.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'\n ? null\n : (() => {\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 globalThis)) {\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, // No colored prefix on groupEnd\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 ||\n !paramName ||\n !moduleName ||\n !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 ` + `'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 ` + `'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 'opaque-streams-source': ({ type }) => {\n const message = `One of the workbox-streams sources resulted in an ` +\n `'${type}' response.`;\n if (type === 'opaqueredirect') {\n return (`${message} Please do not use a navigation request that results ` +\n `in a redirect as a source.`);\n }\n return `${message} Please ensure your sources are CORS-enabled.`;\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' ? 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'] = `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'\n ? null\n : {\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.5.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 workbox-routing\n */\nclass Route {\n /**\n * Constructor for Route class.\n *\n * @param {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 {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 {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 * {@link 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 * @memberof workbox-routing\n * @extends 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 * {@link workbox-routing~handlerCallback} `params`\n * argument.\n *\n * @param {RegExp} regExp The regular expression to match against URLs.\n * @param {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` using one or more\n * {@link workbox-routing.Route}, responding with a `Response` 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 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 // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n if (event.data && event.data.type === 'CACHE_URLS') {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n const { payload } = event.data;\n if (process.env.NODE_ENV !== 'production') {\n logger.debug(`Caching URLs from the window`, payload.urlsToCache);\n }\n const requestPromises = Promise.all(payload.urlsToCache.map((entry) => {\n if (typeof entry === 'string') {\n entry = [entry];\n }\n const request = new Request(...entry);\n return this.handleRequest({ request, event });\n // TODO(philipwalton): TypeScript errors without this typecast for\n // some reason (probably a bug). The real type here should work but\n // doesn't: `Array | undefined>`.\n })); // TypeScript\n event.waitUntil(requestPromises);\n // If a MessageChannel was used, reply to the message on success.\n if (event.ports && event.ports[0]) {\n 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([`Found a route to handle this request:`, route]);\n if (params) {\n debugMessages.push([\n `Passing the following params to the route's handler:`,\n 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 &&\n (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 {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 {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 {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 {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 {@link workbox-routing.Router#registerRoute}.\n *\n * @param {RegExp|string|workbox-routing.Route~matchCallback|workbox-routing.Route} capture\n * If the capture param is a `Route`, all other arguments will be ignored.\n * @param {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 {workbox-routing.Route} The generated `Route`.\n *\n * @memberof 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\n : 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.5.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 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 * {@link workbox-strategies.Strategy~handle} or\n * {@link 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 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 {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] The return value from the\n * {@link workbox-routing~matchCallback} (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 workbox-strategies.StrategyHandler\n */\n /**\n * The event associated with this request.\n * @name event\n * @instance\n * @type {ExtendableEvent}\n * @memberof 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 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 * {@link workbox-routing~matchCallback} returned\n * a truthy value (it will be that value).\n * @name params\n * @instance\n * @type {*|undefined}\n * @memberof 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()\n : 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', {\n thrownErrorMessage: err.message,\n });\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' ? 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 =\n (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\n ? 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 ? 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 const key = `${request.url} | ${mode}`;\n if (!this._cacheKeys[key]) {\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, // eslint-disable-line\n }));\n }\n this._cacheKeys[key] = effectiveRequest;\n }\n return this._cacheKeys[key];\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 * {@link 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 * {@link 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 * {@link 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 =\n (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 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 * {@link 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 * {@link 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 * {@link 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 {@link 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 {@link 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 {workbox-strategies.StrategyHandler} handler\n * @return {Promise}\n *\n * @memberof 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](https://developer.chrome.com/docs/workbox/caching-strategies-overview/#network-first-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](https://developer.chrome.com/docs/workbox/caching-resources-during-runtime/#opaque-responses).\n * Opaque responses are are cross-origin requests where the response doesn't\n * support [CORS](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 workbox-strategies.Strategy\n * @memberof 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 * {@link 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 {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({\n timeoutId,\n request,\n logs,\n handler,\n });\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}'` + ` 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](https://developer.chrome.com/docs/workbox/caching-strategies-overview/#network-only)\n * request strategy.\n *\n * This class is useful if you want to take advantage of any\n * [Workbox plugins](https://developer.chrome.com/docs/workbox/using-plugins/).\n *\n * If the network request fails, this will throw a `WorkboxError` exception.\n *\n * @extends workbox-strategies.Strategy\n * @memberof 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 {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 = [\n handler.fetch(request),\n ];\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 workbox-core\n */\nfunction clientsClaim() {\n self.addEventListener('activate', () => self.clients.claim());\n}\nexport { clientsClaim };\n"],"names":["self","_","e","logger","globalThis","__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","invalid-value","paramName","validValueDescription","value","Error","JSON","stringify","not-an-array","moduleName","className","funcName","incorrect-type","expectedType","classNameStr","incorrect-class","expectedClassName","isReturnValueProblem","missing-a-method","expectedMethod","add-to-cache-list-unexpected-type","entry","add-to-cache-list-conflicting-entries","firstEntry","secondEntry","plugin-error-request-will-fetch","thrownErrorMessage","invalid-cache-name","cacheNameId","unregister-route-but-not-found-with-method","unregister-route-route-not-registered","queue-replay-failed","name","duplicate-queue-name","expired-test-without-max-age","methodName","unsupported-route-type","not-array-of-class","expectedClass","max-entries-or-age-required","statuses-or-headers-required","invalid-string","channel-name-required","invalid-responses-are-same-args","expire-custom-caches-only","unit-must-be-bytes","normalizedRangeHeader","single-range-only","invalid-range-values","no-range-header","range-not-satisfiable","size","start","end","attempt-to-cache-non-get-request","url","cache-put-with-no-response","no-response","message","bad-precaching-response","status","non-precached-url","add-to-cache-list-conflicting-integrities","missing-precache-entry","cacheName","cross-origin-copy-response","origin","opaque-streams-source","type","generatorFunction","code","details","messageGenerator","WorkboxError","constructor","errorCode","isArray","Array","hasMethod","object","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/public/workbox-e9849328.js b/public/workbox-e9849328.js deleted file mode 100644 index faeb758..0000000 --- a/public/workbox-e9849328.js +++ /dev/null @@ -1 +0,0 @@ -define(["exports"],(function(t){"use strict";try{self["workbox:core:6.5.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.5.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.5.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.m=[...t.plugins],this.R=new Map;for(const t of this.m)this.R.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.v(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){const s=`${t.url} | ${e}`;if(!this.h[s]){let n=t;for(const t of this.iterateCallbacks("cacheKeyWillBeUsed"))n=m(await t({mode:e,request:n,event:this.event,params:this.params}));this.h[s]=n}return this.h[s]}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.R.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 v(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.q(r,s,e);return[i,this.D(i,r,s,e)]}async q(t,e,n){let r;await t.runCallbacks("handlerWillStart",{event:n,request:e});try{if(r=await this.U(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 D(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?Object.assign.bind():function(t){for(var e=1;ee.some((e=>t instanceof e));let U,x;const L=new WeakMap,I=new WeakMap,C=new WeakMap,E=new WeakMap,N=new WeakMap;let O={get(t,e,s){if(t instanceof IDBTransaction){if("done"===e)return I.get(t);if("objectStoreNames"===e)return t.objectStoreNames||C.get(t);if("store"===e)return s.objectStoreNames[1]?void 0:s.objectStore(s.objectStoreNames[0])}return B(t[e])},set:(t,e,s)=>(t[e]=s,!0),has:(t,e)=>t instanceof IDBTransaction&&("done"===e||"store"===e)||e in t};function T(t){return t!==IDBDatabase.prototype.transaction||"objectStoreNames"in IDBTransaction.prototype?(x||(x=[IDBCursor.prototype.advance,IDBCursor.prototype.continue,IDBCursor.prototype.continuePrimaryKey])).includes(t)?function(...e){return t.apply(P(this),e),B(L.get(this))}:function(...e){return B(t.apply(P(this),e))}:function(e,...s){const n=t.call(P(this),e,...s);return C.set(n,e.sort?e.sort():[e]),B(n)}}function k(t){return"function"==typeof t?T(t):(t instanceof IDBTransaction&&function(t){if(I.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)}));I.set(t,e)}(t),D(t,U||(U=[IDBDatabase,IDBObjectStore,IDBIndex,IDBCursor,IDBTransaction]))?new Proxy(t,O):t)}function B(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(B(t.result)),n()},i=()=>{s(t.error),n()};t.addEventListener("success",r),t.addEventListener("error",i)}));return e.then((e=>{e instanceof IDBCursor&&L.set(e,t)})).catch((()=>{})),N.set(e,t),e}(t);if(E.has(t))return E.get(t);const e=k(t);return e!==t&&(E.set(t,e),N.set(e,t)),e}const P=t=>N.get(t);const M=["get","getKey","getAll","getAllKeys","count"],W=["put","add","delete","clear"],j=new Map;function S(t,e){if(!(t instanceof IDBDatabase)||e in t||"string"!=typeof e)return;if(j.get(e))return j.get(e);const s=e.replace(/FromIndex$/,""),n=e!==s,r=W.includes(s);if(!(s in(n?IDBIndex:IDBObjectStore).prototype)||!r&&!M.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 j.set(e,i),i}O=(t=>q({},t,{get:(e,s,n)=>S(e,s)||t.get(e,s,n),has:(e,s)=>!!S(e,s)||t.has(e,s)}))(O);try{self["workbox:expiration:6.5.4"]&&_()}catch(t){}const K="cache-entries",A=t=>{const e=new URL(t,location.href);return e.hash="",e.href};class F{constructor(t){this._=null,this.L=t}I(t){const e=t.createObjectStore(K,{keyPath:"id"});e.createIndex("cacheName","cacheName",{unique:!1}),e.createIndex("timestamp","timestamp",{unique:!1})}C(t){this.I(t),this.L&&function(t,{blocked:e}={}){const s=indexedDB.deleteDatabase(t);e&&s.addEventListener("blocked",(t=>e(t.oldVersion,t))),B(s).then((()=>{}))}(this.L)}async setTimestamp(t,e){const s={url:t=A(t),timestamp:e,cacheName:this.L,id:this.N(t)},n=(await this.getDb()).transaction(K,"readwrite",{durability:"relaxed"});await n.store.put(s),await n.done}async getTimestamp(t){const e=await this.getDb(),s=await e.get(K,this.N(t));return null==s?void 0:s.timestamp}async expireEntries(t,e){const s=await this.getDb();let n=await s.transaction(K).store.index("timestamp").openCursor(null,"prev");const r=[];let i=0;for(;n;){const s=n.value;s.cacheName===this.L&&(t&&s.timestamp=e?r.push(n.value):i++),n=await n.continue()}const a=[];for(const t of r)await s.delete(K,t.id),a.push(t.url);return a}N(t){return this.L+"|"+A(t)}async getDb(){return this._||(this._=await function(t,e,{blocked:s,upgrade:n,blocking:r,terminated:i}={}){const a=indexedDB.open(t,e),o=B(a);return n&&a.addEventListener("upgradeneeded",(t=>{n(B(a.result),t.oldVersion,t.newVersion,B(a.transaction),t)})),s&&a.addEventListener("blocked",(t=>s(t.oldVersion,t.newVersion,t))),o.then((t=>{i&&t.addEventListener("close",(()=>i())),r&&t.addEventListener("versionchange",(t=>r(t.oldVersion,t.newVersion,t)))})).catch((()=>{})),o}("workbox-expiration",1,{upgrade:this.C.bind(this)})),this._}}class H{constructor(t,e={}){this.O=!1,this.T=!1,this.k=e.maxEntries,this.B=e.maxAgeSeconds,this.P=e.matchOptions,this.L=t,this.M=new F(t)}async expireEntries(){if(this.O)return void(this.T=!0);this.O=!0;const t=this.B?Date.now()-1e3*this.B:0,e=await this.M.expireEntries(t,this.k),s=await self.caches.open(this.L);for(const t of e)await s.delete(t,this.P);this.O=!1,this.T&&(this.T=!1,b(this.expireEntries()))}async updateTimestamp(t){await this.M.setTimestamp(t,Date.now())}async isURLExpired(t){if(this.B){const e=await this.M.getTimestamp(t),s=Date.now()-1e3*this.B;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 z(t,e){const s=e();return t.waitUntil(s),s}try{self["workbox:precaching:6.5.4"]&&_()}catch(t){}function G(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 V{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 J{constructor({precacheController:t}){this.cacheKeyWillBeUsed=async({request:t,params:e})=>{const s=(null==e?void 0:e.cacheKey)||this.W.getCacheKeyForURL(t.url);return s?new Request(s,{headers:t.headers}):t},this.W=t}}let Q,X;async function Y(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===Q){const t=new Response("");if("body"in t)try{new Response(t.body),Q=!0}catch(t){Q=!1}Q=!1}return Q}()?r.body:await r.blob();return new Response(o,a)}class Z extends v{constructor(t={}){t.cacheName=w(t.cacheName),super(t),this.j=!1!==t.fallbackToNetwork,this.plugins.push(Z.copyRedirectedCacheableResponsesPlugin)}async U(t,e){const s=await e.cacheMatch(t);return s||(e.event&&"install"===e.event.type?await this.S(t,e):await this.K(t,e))}async K(t,e){let n;const r=e.params||{};if(!this.j)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:"no-cors"!==t.mode?i||s:void 0})),s&&a&&"no-cors"!==t.mode&&(this.A(),await e.cachePut(t,n.clone()))}return n}async S(t,e){this.A();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}A(){let t=null,e=0;for(const[s,n]of this.plugins.entries())n!==Z.copyRedirectedCacheableResponsesPlugin&&(n===Z.defaultPrecacheCacheabilityPlugin&&(t=s),n.cacheWillUpdate&&e++);0===e?this.plugins.push(Z.defaultPrecacheCacheabilityPlugin):e>1&&null!==t&&this.plugins.splice(t,1)}}Z.defaultPrecacheCacheabilityPlugin={cacheWillUpdate:async({response:t})=>!t||t.status>=400?null:t},Z.copyRedirectedCacheableResponsesPlugin={cacheWillUpdate:async({response:t})=>t.redirected?await Y(t):t};class tt{constructor({cacheName:t,plugins:e=[],fallbackToNetwork:s=!0}={}){this.F=new Map,this.H=new Map,this.$=new Map,this.u=new Z({cacheName:w(t),plugins:[...e,new J({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.G||(self.addEventListener("install",this.install),self.addEventListener("activate",this.activate),this.G=!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}=G(n),i="string"!=typeof n&&n.revision?"reload":"default";if(this.F.has(r)&&this.F.get(r)!==t)throw new s("add-to-cache-list-conflicting-entries",{firstEntry:this.F.get(r),secondEntry:t});if("string"!=typeof n&&n.integrity){if(this.$.has(t)&&this.$.get(t)!==n.integrity)throw new s("add-to-cache-list-conflicting-integrities",{url:r});this.$.set(t,n.integrity)}if(this.F.set(r,t),this.H.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 z(t,(async()=>{const e=new V;this.strategy.plugins.push(e);for(const[e,s]of this.F){const n=this.$.get(s),r=this.H.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 z(t,(async()=>{const t=await self.caches.open(this.strategy.cacheName),e=await t.keys(),s=new Set(this.F.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.F}getCachedURLs(){return[...this.F.keys()]}getCacheKeyForURL(t){const e=new URL(t,location.href);return this.F.get(e.href)}getIntegrityForCacheKey(t){return this.$.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 et=()=>(X||(X=new tt),X);class st 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 U(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.V(n),i=this.J(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.J(t);await s.updateTimestamp(e.url),await s.expireEntries()},this.X=t,this.B=t.maxAgeSeconds,this.Y=new Map,t.purgeOnQuotaError&&function(t){g.add(t)}((()=>this.deleteCacheAndMetadata()))}J(t){if(t===d())throw new s("expire-custom-caches-only");let e=this.Y.get(t);return e||(e=new H(t,this.X),this.Y.set(t,e)),e}V(t){if(!this.B)return!0;const e=this.Z(t);if(null===e)return!0;return e>=Date.now()-1e3*this.B}Z(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.Y)await self.caches.delete(t),await e.delete();this.Y=new Map}},t.NetworkFirst=class extends v{constructor(t={}){super(t),this.plugins.some((t=>"cacheWillUpdate"in t))||this.plugins.unshift(u),this.tt=t.networkTimeoutSeconds||0}async U(t,e){const n=[],r=[];let i;if(this.tt){const{id:s,promise:a}=this.et({request:t,logs:n,handler:e});i=s,r.push(a)}const a=this.st({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}et({request:t,logs:e,handler:s}){let n;return{promise:new Promise((e=>{n=setTimeout((async()=>{e(await s.cacheMatch(t))}),1e3*this.tt)})),id:n}}async st({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 $(t,e):e}},t.StaleWhileRevalidate=class extends v{constructor(t={}){super(t),this.plugins.some((t=>"cacheWillUpdate"in t))||this.plugins.unshift(u)}async U(t,e){const n=e.fetchAndCachePut(t).catch((()=>{}));e.waitUntil(n);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){et().precache(t)}(t),function(t){const e=et();h(new st(e,t))}(e)},t.registerRoute=h})); diff --git a/types/index.d.ts b/types/index.d.ts index a9b500d..01212c4 100644 --- a/types/index.d.ts +++ b/types/index.d.ts @@ -17,9 +17,6 @@ export type SiteConfig = { oichat: string; }; openSignup: boolean; - shortDomains: string[]; - emailDomains: string[]; - recordDomains: string[]; emailR2Domain: string; }; From 2369885fda58f703cfa2e490233c61e53d09dd67 Mon Sep 17 00:00:00 2001 From: oiov Date: Wed, 21 May 2025 16:16:56 +0800 Subject: [PATCH 3/3] feat: support setup guide for admin --- README-zh.md | 17 +- README.md | 17 +- app/(protected)/admin/domains/domain-list.tsx | 25 +- app/(protected)/dashboard/scrape/page.tsx | 17 +- app/(protected)/setup/guide.tsx | 358 ++++++++++++++++++ app/(protected)/setup/loading.tsx | 15 + app/(protected)/setup/page.tsx | 28 ++ app/api/domain/route.ts | 5 +- app/api/setup/route.ts | 31 ++ app/manifest.json | 2 +- components/dashboard/dashboard-info-card.tsx | 4 +- components/email/EmailSidebar.tsx | 42 +- components/forms/domain-form.tsx | 1 + components/forms/record-form.tsx | 42 +- components/forms/url-form.tsx | 42 +- components/ui/badge.tsx | 2 + content/docs/developer/installation.mdx | 1 - content/docs/developer/quick-start.mdx | 35 +- lib/dto/domains.ts | 14 + lib/dto/user.ts | 11 + package.json | 2 +- .../20240705091917_init/migration.sql | 2 +- public/_static/docs/setup-1.png | Bin 0 -> 135274 bytes public/_static/docs/setup-2.png | Bin 0 -> 100628 bytes public/manifest.json | 2 +- public/site.webmanifest | 2 +- public/sw.js.map | 2 +- 27 files changed, 593 insertions(+), 126 deletions(-) create mode 100644 app/(protected)/setup/guide.tsx create mode 100644 app/(protected)/setup/loading.tsx create mode 100644 app/(protected)/setup/page.tsx create mode 100644 app/api/setup/route.ts create mode 100644 public/_static/docs/setup-1.png create mode 100644 public/_static/docs/setup-2.png diff --git a/README-zh.md b/README-zh.md index 9dfe684..998c3c1 100644 --- a/README-zh.md +++ b/README-zh.md @@ -56,11 +56,22 @@ pnpm install pnpm dev ``` +#### 初始化数据库 + +```bash +pnpm postinstall +pnpm db:push +``` + +#### 激活管理员面板 + +Follow https://localhost:3000/setup + ## 社区群组 -- Discord: https://discord.gg/AHPQYuZu3m -- 微信群: - +- Discord: https://discord.gg/AHPQYuZu3m +- 微信群: + ![](https://wr.do/s/group) ## 许可证 diff --git a/README.md b/README.md index a6e195c..8dc93d1 100644 --- a/README.md +++ b/README.md @@ -57,6 +57,17 @@ pnpm install pnpm dev ``` +#### Init database + +```bash +pnpm postinstall +pnpm db:push +``` + +#### Setup Admin Panel + +Follow https://localhost:3000/setup + ## Legitimacy review - To avoid abuse, applications without website content will be rejected @@ -68,9 +79,9 @@ pnpm dev ## Community Group -- Discord: https://discord.gg/AHPQYuZu3m -- 微信群: - +- Discord: https://discord.gg/AHPQYuZu3m +- 微信群: + ![](https://wr.do/s/group) ## License diff --git a/app/(protected)/admin/domains/domain-list.tsx b/app/(protected)/admin/domains/domain-list.tsx index d913e8b..300381c 100644 --- a/app/(protected)/admin/domains/domain-list.tsx +++ b/app/(protected)/admin/domains/domain-list.tsx @@ -2,20 +2,13 @@ import { useState } from "react"; import Link from "next/link"; -import { Domain, User } from "@prisma/client"; +import { User } from "@prisma/client"; import { PenLine, RefreshCwIcon } from "lucide-react"; import { toast } from "sonner"; import useSWR, { useSWRConfig } from "swr"; import { DomainFormData } from "@/lib/dto/domains"; -import { ShortUrlFormData } from "@/lib/dto/short-urls"; -import { - cn, - expirationTime, - fetcher, - removeUrlSuffix, - timeAgo, -} from "@/lib/utils"; +import { fetcher, timeAgo } from "@/lib/utils"; import { Button } from "@/components/ui/button"; import { Card, @@ -23,7 +16,6 @@ import { CardDescription, CardHeader, } from "@/components/ui/card"; -import { Input } from "@/components/ui/input"; import { Modal } from "@/components/ui/modal"; import { Skeleton } from "@/components/ui/skeleton"; import { Switch } from "@/components/ui/switch"; @@ -81,10 +73,10 @@ export default function DomainList({ user, action }: DomainListProps) { useState(null); const [currentPage, setCurrentPage] = useState(1); const [pageSize, setPageSize] = useState(10); - const [isShowDomainInfo, setShowDomainInfo] = useState(false); - const [selectedDomain, setSelectedDomain] = useState( - null, - ); + // const [isShowDomainInfo, setShowDomainInfo] = useState(false); + // const [selectedDomain, setSelectedDomain] = useState( + // null, + // ); const [searchParams, setSearchParams] = useState({ slug: "", target: "", @@ -169,7 +161,7 @@ export default function DomainList({ user, action }: DomainListProps) { -
    + {/*
    )}
    -
    +
    */} @@ -274,6 +266,7 @@ export default function DomainList({ user, action }: DomainListProps) { handleChangeStatus(value, "active", domain) diff --git a/app/(protected)/dashboard/scrape/page.tsx b/app/(protected)/dashboard/scrape/page.tsx index 4c9d8fc..5904135 100644 --- a/app/(protected)/dashboard/scrape/page.tsx +++ b/app/(protected)/dashboard/scrape/page.tsx @@ -2,7 +2,7 @@ import { redirect } from "next/navigation"; import { getCurrentUser } from "@/lib/session"; import { constructMetadata } from "@/lib/utils"; -import { ScrapeInfoCard } from "@/components/dashboard/dashboard-info-card"; +import { StaticInfoCard } from "@/components/dashboard/dashboard-info-card"; import { DashboardHeader } from "@/components/dashboard/header"; import DashboardScrapeCharts from "./charts"; @@ -26,22 +26,19 @@ export default async function DashboardPage() { linkText="Open API." />
    - - -
    - - ([]); + const [isMobile, setIsMobile] = useState(false); + + const steps = [ + { + id: 1, + title: "Set up an administrator", + description: + "Begin by entering your website URL or selecting an example site to reimagine your website with modern themes.", + component: () => , + }, + { + id: 2, + title: "Add the first domain", + description: + "Check out your reimagined site and click to Migrate & Download.", + component: () => , + }, + { + id: 3, + title: "Congrats on completing setup 🎉", + description: + "Navigate to your GitHub dashboard where you'll manage your repository and project files.", + component: () => , + }, + ]; + + useEffect(() => { + const checkMobile = () => { + setIsMobile(window.innerWidth < 768); + }; + + checkMobile(); + window.addEventListener("resize", checkMobile); + + return () => { + window.removeEventListener("resize", checkMobile); + }; + }, []); + + const goToNextStep = () => { + if (currentStep < steps.length) { + setDirection(1); + setCurrentStep(currentStep + 1); + if (!completedSteps.includes(currentStep)) { + setCompletedSteps([...completedSteps, currentStep]); + } + } else if (currentStep === steps.length) { + router.push("/admin"); + } + }; + + const goToPreviousStep = () => { + if (currentStep > 1) { + setDirection(-1); + setCurrentStep(currentStep - 1); + } + }; + + const currentStepData = + steps.find((step) => step.id === currentStep) || steps[0]; + + const variants = { + enter: (direction: number) => ({ + x: direction > 0 ? 100 : -100, + opacity: 0, + }), + center: { + x: 0, + opacity: 1, + }, + exit: (direction: number) => ({ + x: direction < 0 ? 100 : -100, + opacity: 0, + }), + }; + + return ( + +
    +
    +

    Admin Setup Guide

    +
    + + {currentStep} + + of + {steps.length} +
    +
    + + {/* Content area */} +
    + + +
    +
    + + {currentStep} + + + {currentStepData.title} + +
    + + + {currentStepData.component()} + +
    +
    +
    +
    +
    + + + + + + +
    + ); +} + +function SetAdminRole({ id, email }: { id: string; email: string }) { + const [isPending, startTransition] = useTransition(); + const [isAdmin, setIsAdmin] = useState(false); + const handleSetAdmin = async () => { + startTransition(async () => { + const res = await fetch("/api/setup"); + if (res.ok) { + setIsAdmin(true); + } + }); + }; + + const ReadyBadge = ( + + + Ready + + ); + + return ( +
    +
    + + Allow Sign Up: + + {siteConfig.openSignup ? ReadyBadge : } +
    + +
    + + Set {email} as ADMIN: + + {isAdmin ? ( + ReadyBadge + ) : ( + + )} +
    + +
    +

    + 📢 Only by becoming an administrator can one access the admin panel + and add domain names. +

    +

    + 📢 Administrators can set all user permissions, allocate quotas, view + and edit all resources (short links, subdomains, email), etc. +

    +

    + 📢 Via{" "} + + quick start + {" "} + docs to get more information. +

    +
    +
    + ); +} + +function AddDomain({ onNextStep }: { onNextStep: () => void }) { + const [isPending, startTransition] = useTransition(); + const [domain, setDomain] = useState(""); + const handleCreateDomain = async () => { + if (!domain) { + toast.warning("Domain name cannot be empty"); + return; + } + startTransition(async () => { + const res = await fetch("/api/admin/domain", { + method: "POST", + body: JSON.stringify({ + data: { + domain_name: removeUrlSuffix(domain), + enable_short_link: true, + enable_email: true, + enable_dns: true, + cf_zone_id: "", + cf_api_key: "", + cf_email: "", + cf_api_key_encrypted: false, + max_short_links: 0, + max_email_forwards: 0, + max_dns_records: 0, + active: true, + }, + }), + }); + if (res.ok) { + onNextStep(); + } else { + toast.error("Created Failed!", { + description: await res.text(), + }); + } + }); + }; + return ( +
    + +
    + +
    + setDomain(e.target.value)} + /> +
    +

    + Please enter a valid domain name (must be hosted on Cloudflare). +

    +
    + +
    + + +
    +
    +
    + ); +} + +function Congrats() { + return <>; +} diff --git a/app/(protected)/setup/loading.tsx b/app/(protected)/setup/loading.tsx new file mode 100644 index 0000000..2c0fcc0 --- /dev/null +++ b/app/(protected)/setup/loading.tsx @@ -0,0 +1,15 @@ +import { Skeleton } from "@/components/ui/skeleton"; +import { DashboardHeader } from "@/components/dashboard/header"; + +export default function DashboardLoading() { + return ( + <> + + + + + ); +} diff --git a/app/(protected)/setup/page.tsx b/app/(protected)/setup/page.tsx new file mode 100644 index 0000000..087a833 --- /dev/null +++ b/app/(protected)/setup/page.tsx @@ -0,0 +1,28 @@ +import { redirect } from "next/navigation"; + +import { getAllUsersCount } from "@/lib/dto/user"; +import { getCurrentUser } from "@/lib/session"; +import { constructMetadata } from "@/lib/utils"; + +import SetupGuide from "./guide"; + +export const metadata = constructMetadata({ + title: "Setup Guide", + description: "Setup Guide", +}); + +export default async function SetupPage() { + const user = await getCurrentUser(); + + if (!user?.id) redirect("/login"); + + if (user.role === "ADMIN") redirect("/admin"); + + const count = await getAllUsersCount(); + + if (count === 1 && user.role === "USER") { + return ; + } + + return redirect("/admin"); +} diff --git a/app/api/domain/route.ts b/app/api/domain/route.ts index 137ba1b..34b65c7 100644 --- a/app/api/domain/route.ts +++ b/app/api/domain/route.ts @@ -1,6 +1,6 @@ import { NextRequest } from "next/server"; -import { FeatureMap, getDomainsByFeature } from "@/lib/dto/domains"; +import { FeatureMap, getDomainsByFeatureClient } from "@/lib/dto/domains"; import { checkUserStatus } from "@/lib/dto/user"; import { getCurrentUser } from "@/lib/session"; @@ -22,7 +22,8 @@ export async function GET(req: NextRequest) { ); } - const domainList = await getDomainsByFeature(FeatureMap[feature]); + const domainList = await getDomainsByFeatureClient(FeatureMap[feature]); + return Response.json(domainList, { status: 200 }); } catch (error) { console.error("[Error]", error); diff --git a/app/api/setup/route.ts b/app/api/setup/route.ts new file mode 100644 index 0000000..0183d68 --- /dev/null +++ b/app/api/setup/route.ts @@ -0,0 +1,31 @@ +import { redirect } from "next/navigation"; + +import { + checkUserStatus, + getAllUsersCount, + setFirstUserAsAdmin, +} from "@/lib/dto/user"; +import { getCurrentUser } from "@/lib/session"; + +export async function GET(req: Request) { + try { + const user = checkUserStatus(await getCurrentUser()); + if (user instanceof Response) return user; + + const count = await getAllUsersCount(); + + if (count === 1 && user.role === "USER") { + const res = await setFirstUserAsAdmin(user.id); + if (res) { + return Response.json({ admin: res.role === "ADMIN" }, { status: 201 }); + } + return Response.json({ admin: false }, { status: 400 }); + } + + return redirect("/admin"); + } catch (error) { + return Response.json(error?.statusText || error, { + status: error.status || 500, + }); + } +} diff --git a/app/manifest.json b/app/manifest.json index 66a72fc..ad20795 100644 --- a/app/manifest.json +++ b/app/manifest.json @@ -3,7 +3,7 @@ "short_name": "WR.DO", "description": "Shorten links with analytics, manage emails and control subdomains—all on one platform.", "appid": "com.wr.do", - "versionName": "0.6.0", + "versionName": "0.6.1", "versionCode": "1", "start_url": "/", "orientation": "portrait", diff --git a/components/dashboard/dashboard-info-card.tsx b/components/dashboard/dashboard-info-card.tsx index 174b067..4f48634 100644 --- a/components/dashboard/dashboard-info-card.tsx +++ b/components/dashboard/dashboard-info-card.tsx @@ -145,14 +145,12 @@ export function HeroCard({ ); } -export async function ScrapeInfoCard({ - userId, +export async function StaticInfoCard({ title, desc, link, icon = "users", }: { - userId: string; title: string; desc?: string; link: string; diff --git a/components/email/EmailSidebar.tsx b/components/email/EmailSidebar.tsx index b9f0478..851c9c2 100644 --- a/components/email/EmailSidebar.tsx +++ b/components/email/EmailSidebar.tsx @@ -603,32 +603,34 @@ export default function EmailSidebar({ {isLoadingDomains ? ( ) : ( - emailDomains && ( - { + setDomainSuffix(value); + }} + name="suffix" + defaultValue={domainSuffix || "wr.do"} + disabled={isEdit} + > + + + + + {emailDomains && emailDomains.length > 0 ? ( + emailDomains.map((v) => ( @{v.domain_name} - ))} - - - ) + )) + ) : ( + + )} + + )}
    diff --git a/components/forms/record-form.tsx b/components/forms/record-form.tsx index 9d590f8..9265df2 100644 --- a/components/forms/record-form.tsx +++ b/components/forms/record-form.tsx @@ -212,28 +212,32 @@ export function RecordForm({ {isLoading ? ( ) : ( - recordDomains && ( - { + setValue("zone_name", value); + setCurrentZoneName(value); + }} + name="zone_name" + defaultValue={String(initData?.zone_name || "wr.do")} + disabled={type === "edit"} + > + + + + + {recordDomains && recordDomains.length > 0 ? ( + recordDomains.map((v) => ( {v.domain_name} - ))} - - - ) + )) + ) : ( + + )} + + )}

    Required. Select a domain. diff --git a/components/forms/url-form.tsx b/components/forms/url-form.tsx index 3899dfe..c15f0b7 100644 --- a/components/forms/url-form.tsx +++ b/components/forms/url-form.tsx @@ -204,29 +204,31 @@ export function UrlForm({ {isLoading ? ( ) : ( - shortDomains && ( - { + setValue("prefix", value); + }} + name="prefix" + defaultValue={initData?.prefix || "wr.do"} + disabled={type === "edit"} + > + + + + + {shortDomains && shortDomains.length > 0 ? ( + shortDomains.map((v) => ( {v.domain_name} - ))} - - - ) + )) + ) : ( + + )} + + )} - After change change the account's role to ADMIN, and then you can refresh the website and access http://localhost:3000/admin. +![](/_static/docs/setup-1.png) - You must add at least one domain to start using short links, email or subdomain management functions. +![](/_static/docs/setup-2.png) + + + After change the account's role to ADMIN, then you can refresh the website and access http://localhost:3000/admin. + + You must add at least one domain to start using short links, email or subdomain management features. ## Q & A @@ -215,17 +217,6 @@ https://dash.cloudflare.com/[account_id]/[zone_name]/ssl-tls/configuration Change the `SSL/TLS Encryption` Mode to `Full` in the Cloudflare dashboard. -### How can I access the admin panel after first deployment? - -You need to first register an account and log in, -and modify the `role` field of this account to `ADMIN` in the `users` table of the database. -Then, refresh the website and access http://localhost:3000/admin. - - -Although it may not be convenient to do so, this is currently the fastest way to become an administrator. -In future versions, we will implement the function of automatically setting up administrators as soon as possible. - - ### How can I change the team plan quota? Via team.ts: diff --git a/lib/dto/domains.ts b/lib/dto/domains.ts index 183b51b..41dff10 100644 --- a/lib/dto/domains.ts +++ b/lib/dto/domains.ts @@ -81,6 +81,20 @@ export async function getDomainsByFeature( } } +export async function getDomainsByFeatureClient(feature: string) { + try { + const domains = await prisma.domain.findMany({ + where: { [feature]: true }, + select: { + domain_name: true, + }, + }); + return domains; + } catch (error) { + throw new Error(`Failed to fetch domain config: ${error.message}`); + } +} + export async function createDomain(data: DomainConfig) { try { const createdDomain = await prisma.domain.create({ data }); diff --git a/lib/dto/user.ts b/lib/dto/user.ts index 8004a1f..9d91f71 100644 --- a/lib/dto/user.ts +++ b/lib/dto/user.ts @@ -85,6 +85,17 @@ export async function getAllUsersCount() { } } +export async function setFirstUserAsAdmin(userId: string) { + try { + return await prisma.user.update({ + where: { id: userId }, + data: { role: UserRole.ADMIN }, + }); + } catch (error) { + return null; + } +} + export async function getAllUsersActiveApiKeyCount() { try { return await prisma.user.count({ where: { apiKey: { not: null } } }); diff --git a/package.json b/package.json index 698f52c..17d9a3d 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "wr.do", - "version": "0.6.0", + "version": "0.6.1", "author": { "name": "oiov", "url": "https://github.com/oiov" diff --git a/prisma/migrations/20240705091917_init/migration.sql b/prisma/migrations/20240705091917_init/migration.sql index 9cb9c4b..4096392 100644 --- a/prisma/migrations/20240705091917_init/migration.sql +++ b/prisma/migrations/20240705091917_init/migration.sql @@ -274,7 +274,7 @@ CREATE TABLE "user_send_emails" "html" TEXT DEFAULT '', "replyTo" TEXT DEFAULT '', "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, - "updatedAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP ); CREATE INDEX "user_send_emails_userId_idx" ON "user_send_emails" ("userId"); diff --git a/public/_static/docs/setup-1.png b/public/_static/docs/setup-1.png new file mode 100644 index 0000000000000000000000000000000000000000..b266c685f9469ea81e3aa0016b50e467821c7748 GIT binary patch literal 135274 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�M~=qZM~B)kvT*tU7JR6lf| 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 literal 0 HcmV?d00001 diff --git a/public/manifest.json b/public/manifest.json index 66a72fc..ad20795 100644 --- a/public/manifest.json +++ b/public/manifest.json @@ -3,7 +3,7 @@ "short_name": "WR.DO", "description": "Shorten links with analytics, manage emails and control subdomains—all on one platform.", "appid": "com.wr.do", - "versionName": "0.6.0", + "versionName": "0.6.1", "versionCode": "1", "start_url": "/", "orientation": "portrait", diff --git a/public/site.webmanifest b/public/site.webmanifest index 66a72fc..ad20795 100644 --- a/public/site.webmanifest +++ b/public/site.webmanifest @@ -3,7 +3,7 @@ "short_name": "WR.DO", "description": "Shorten links with analytics, manage emails and control subdomains—all on one platform.", "appid": "com.wr.do", - "versionName": "0.6.0", + "versionName": "0.6.1", "versionCode": "1", "start_url": "/", "orientation": "portrait", diff --git a/public/sw.js.map b/public/sw.js.map index 95b5bf0..0691226 100644 --- a/public/sw.js.map +++ b/public/sw.js.map @@ -1 +1 @@ -{"version":3,"file":"sw.js","sources":["../../../../../../private/var/folders/9b/3qmyp8zd2xvdspdrp149fyg00000gn/T/04443f5fc75df19ba6a55a8a764fbf11/sw.js"],"sourcesContent":["import {registerRoute as workbox_routing_registerRoute} from '/Users/songjunxi/Desktop/repos/wrdo-app/wr.do/node_modules/.pnpm/workbox-routing@6.6.0/node_modules/workbox-routing/registerRoute.mjs';\nimport {NetworkFirst as workbox_strategies_NetworkFirst} from '/Users/songjunxi/Desktop/repos/wrdo-app/wr.do/node_modules/.pnpm/workbox-strategies@6.6.0/node_modules/workbox-strategies/NetworkFirst.mjs';\nimport {NetworkOnly as workbox_strategies_NetworkOnly} from '/Users/songjunxi/Desktop/repos/wrdo-app/wr.do/node_modules/.pnpm/workbox-strategies@6.6.0/node_modules/workbox-strategies/NetworkOnly.mjs';\nimport {clientsClaim as workbox_core_clientsClaim} from '/Users/songjunxi/Desktop/repos/wrdo-app/wr.do/node_modules/.pnpm/workbox-core@6.6.0/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":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAgBAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAa,EAEZ,CAAA;EAQDC,CAAI,CAAA,CAAA,CAAA,CAACC,CAAW,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAA;AAElBC,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAyB,EAAE,CAAA;AAI3BC,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAA6B,CAAC,CAAA,CAAA,CAAG,CAAE,CAAA,CAAA,CAAA,CAAA,CAAIC,oBAA+B,CAAC,CAAA;EAAE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAW,EAAC,CAAW,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;EAAEC,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAO,EAAE,CAAC,CAAA;GAAEC,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAe,EAAE,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;QAAEC,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;QAAEC,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;QAAEC,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA;AAAEC,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA;AAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA;EAAE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAIF,QAAQ,CAAIA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAQ,CAACG,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,gBAAgB,CAAE,CAAA,CAAA;AAAE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,OAAO,CAAIC,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAQ,CAACJ,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAACK,IAAI,CAAE,CAAA,CAAA;EAAEC,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAM,EAAE,CAAG,CAAA,CAAA,CAAA;EAAEC,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAU,EAAE,CAAI,CAAA,CAAA,CAAA,CAAA;YAAEC,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAER,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAACQ,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA;AAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAA;EAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;EAAE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAOR,QAAQ,CAAA;EAAC,CAAA,CAAA,CAAA,CAAA,CAAA;KAAG,CAAA;AAAE,CAAA,CAAA,CAAC,CAAC,CAAA,CAAE,CAAK,CAAA,CAAA,CAAA,CAAA,CAAC,CAAA;AACxWL,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAA6B,CAAC,CAAA,CAAA,CAAA,CAAA,CAAK,CAAE,CAAA,CAAA,CAAA,CAAA,CAAIc,mBAA8B,CAAC,CAAA;EAAE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAW,EAAC,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA;EAAEZ,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAO,EAAE,CAAA,CAAA;EAAG,CAAC,CAAC,CAAE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAC,CAAA;;"} \ No newline at end of file +{"version":3,"file":"sw.js","sources":["../../../../../../private/var/folders/9b/3qmyp8zd2xvdspdrp149fyg00000gn/T/6217469e87d14bd5106dd3d5117a6cdd/sw.js"],"sourcesContent":["import {registerRoute as workbox_routing_registerRoute} from '/Users/songjunxi/Desktop/repos/wrdo-app/wr.do/node_modules/.pnpm/workbox-routing@6.6.0/node_modules/workbox-routing/registerRoute.mjs';\nimport {NetworkFirst as workbox_strategies_NetworkFirst} from '/Users/songjunxi/Desktop/repos/wrdo-app/wr.do/node_modules/.pnpm/workbox-strategies@6.6.0/node_modules/workbox-strategies/NetworkFirst.mjs';\nimport {NetworkOnly as workbox_strategies_NetworkOnly} from '/Users/songjunxi/Desktop/repos/wrdo-app/wr.do/node_modules/.pnpm/workbox-strategies@6.6.0/node_modules/workbox-strategies/NetworkOnly.mjs';\nimport {clientsClaim as workbox_core_clientsClaim} from '/Users/songjunxi/Desktop/repos/wrdo-app/wr.do/node_modules/.pnpm/workbox-core@6.6.0/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":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAgBAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAa,EAEZ,CAAA;EAQDC,CAAI,CAAA,CAAA,CAAA,CAACC,CAAW,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAA;AAElBC,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAyB,EAAE,CAAA;AAI3BC,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAA6B,CAAC,CAAA,CAAA,CAAG,CAAE,CAAA,CAAA,CAAA,CAAA,CAAIC,oBAA+B,CAAC,CAAA;EAAE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAW,EAAC,CAAW,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;EAAEC,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAO,EAAE,CAAC,CAAA;GAAEC,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAe,EAAE,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;QAAEC,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;QAAEC,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;QAAEC,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA;AAAEC,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA;AAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA;EAAE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAIF,QAAQ,CAAIA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAQ,CAACG,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,gBAAgB,CAAE,CAAA,CAAA;AAAE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,OAAO,CAAIC,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAQ,CAACJ,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAACK,IAAI,CAAE,CAAA,CAAA;EAAEC,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAM,EAAE,CAAG,CAAA,CAAA,CAAA;EAAEC,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAU,EAAE,CAAI,CAAA,CAAA,CAAA,CAAA;YAAEC,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAER,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAACQ,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA;AAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAA;EAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;EAAE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAOR,QAAQ,CAAA;EAAC,CAAA,CAAA,CAAA,CAAA,CAAA;KAAG,CAAA;AAAE,CAAA,CAAA,CAAC,CAAC,CAAA,CAAE,CAAK,CAAA,CAAA,CAAA,CAAA,CAAC,CAAA;AACxWL,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAA6B,CAAC,CAAA,CAAA,CAAA,CAAA,CAAK,CAAE,CAAA,CAAA,CAAA,CAAA,CAAIc,mBAA8B,CAAC,CAAA;EAAE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAW,EAAC,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA;EAAEZ,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAO,EAAE,CAAA,CAAA;EAAG,CAAC,CAAC,CAAE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAC,CAAA;;"} \ No newline at end of file