From acc3b33d77350187beefdec6d0c015f3fdbbdadf Mon Sep 17 00:00:00 2001 From: oiov Date: Sat, 21 Jun 2025 20:12:11 +0800 Subject: [PATCH] Add tg docs and github page custom domain docs --- README-zh.md | 1 + README.md | 1 + app/(protected)/admin/system/app-configs.tsx | 26 +- app/api/v1/email-catcher/route.ts | 2 - components/shared/version-notifier.tsx | 77 +- config/docs.ts | 10 + content/docs/developer/telegram-bot.mdx | 156 +- content/docs/examples/github-page.mdx | 10 + content/docs/index.mdx | 5 + public/_static/examples/github.png | Bin 0 -> 170877 bytes 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 - 15 files changed, 2804 insertions(+), 45 deletions(-) create mode 100644 content/docs/examples/github-page.mdx create mode 100644 public/_static/examples/github.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/README-zh.md b/README-zh.md index b1041eb..fb88cb1 100644 --- a/README-zh.md +++ b/README-zh.md @@ -51,6 +51,7 @@ WR.DO 是一个一站式网络工具平台,集成短链服务、临时邮箱 - 多维度图表展示网站状态 - 域名服务配置(动态配置各项服务是否启用,包括短链、临时邮箱(收发邮件)、子域名管理) - 用户列表管理(设置权限、分配使用额度、禁用用户等) + - 动态配置登录方式 (支持 Google, GitHub, 邮箱验证, 账户密码, LinuxDO) - 短链管理(管理所有用户创建的短链) - 邮箱管理(管理所有用户创建的临时邮箱) - 子域名管理(管理所有用户创建的子域名) diff --git a/README.md b/README.md index c983c30..1da63ff 100644 --- a/README.md +++ b/README.md @@ -50,6 +50,7 @@ WR.DO is a all-in-one web utility platform featuring short links with analytics, - Multi-dimensional dashboard with website analytics - Dynamic service configuration (toggle short links, email, subdomain management) - User management (permissions, quotas, account control) + - Dynamically configure login methods (Google, GitHub, Magic Link, Credentials, LinuxDO) - Centralized short link administration - Centralized email management - Centralized subdomain administration diff --git a/app/(protected)/admin/system/app-configs.tsx b/app/(protected)/admin/system/app-configs.tsx index 51256d4..ea34a9a 100644 --- a/app/(protected)/admin/system/app-configs.tsx +++ b/app/(protected)/admin/system/app-configs.tsx @@ -3,9 +3,11 @@ import { useEffect, useState, useTransition } from "react"; import Link from "next/link"; import { useTranslations } from "next-intl"; +import pkg from "package.json"; import { toast } from "sonner"; import useSWR from "swr"; +import { siteConfig } from "@/config/site"; import { fetcher } from "@/lib/utils"; import { Badge } from "@/components/ui/badge"; import { Button } from "@/components/ui/button"; @@ -239,7 +241,29 @@ export default function AppConfigs({}: {}) { )} - +
+ Powered by + + {siteConfig.name} + + + v{pkg.version} + + +
diff --git a/app/api/v1/email-catcher/route.ts b/app/api/v1/email-catcher/route.ts index ee3fbab..3cea12c 100644 --- a/app/api/v1/email-catcher/route.ts +++ b/app/api/v1/email-catcher/route.ts @@ -97,8 +97,6 @@ function shouldPushToTelegram( .map((email) => email.trim()) .filter((email) => email.length > 0); - console.log("[Email]", whiteListArray, email.to); - return whiteListArray.includes(email.to); } diff --git a/components/shared/version-notifier.tsx b/components/shared/version-notifier.tsx index 83adc5a..96a945e 100644 --- a/components/shared/version-notifier.tsx +++ b/components/shared/version-notifier.tsx @@ -74,54 +74,55 @@ const VersionNotifier: React.FC = ({ return () => clearInterval(interval); }, []); - if (!showUpdate) { - return ( + return ( + <> - ); - } + {showUpdate && ( +
+
+
+
+ + 🎉 {t("New version available")}: {latestVersion} + +
+ +
- return ( -
-
-
- - 🎉 {t("New version available")}: {latestVersion} - +
+ + {t("Update now")} + + +
+
- -
- -
- - {t("Update now")} - - -
-
+ )} + ); }; diff --git a/config/docs.ts b/config/docs.ts index 3bce240..e215923 100644 --- a/config/docs.ts +++ b/config/docs.ts @@ -81,6 +81,11 @@ export const docsConfig: DocsConfig = { { title: "Examples", items: [ + { + title: "Github Page Custom Domain", + href: "/docs/examples/github-page", + icon: "page", + }, { title: "Cloudflare Custom Domain", href: "/docs/examples/cloudflare", @@ -146,6 +151,11 @@ export const docsConfig: DocsConfig = { href: "/docs/developer/database", icon: "page", }, + { + title: "Telegram Bot", + href: "/docs/developer/telegram-bot", + icon: "page", + }, { title: "Components", href: "/docs/developer/components", diff --git a/content/docs/developer/telegram-bot.mdx b/content/docs/developer/telegram-bot.mdx index 6d7d501..02b96c9 100644 --- a/content/docs/developer/telegram-bot.mdx +++ b/content/docs/developer/telegram-bot.mdx @@ -1,4 +1,156 @@ --- -title: Telegram Bot +title: Telegram 邮件推送功能配置指南 description: How to configure Telegram bot ---- \ No newline at end of file +--- + +## 功能概述 + +WR.DO 支持将接收到的邮件自动推送到 Telegram 群组或私聊中,让您能够实时收到邮件通知。支持自定义消息模板、多个聊天群组推送以及白名单过滤等功能。 + +相关配置位于 `localhost:3000/admin/system` 的 `电子邮件配置中`。 + + +## 配置参数说明 + +### 必需参数 + +| 系统参数名(请勿修改) | 类型 | 说明 | +|--------|------|------| +| `enable_tg_email_push` | boolean | 是否启用 Telegram 推送功能 | +| `tg_email_bot_token` | string | Telegram Bot Token | +| `tg_email_chat_id` | string | 目标聊天 ID(支持多个,逗号分隔) | + +### 可选参数 + +| 系统参数名(请勿修改) | 类型 | 说明 | +|--------|------|------| +| `tg_email_template` | string | 自定义消息模板 | +| `tg_email_target_white_list` | string | 邮件地址白名单(逗号分隔) | + +## 第一步:创建 Telegram Bot + +### 1. 与 BotFather 对话 + +1. 在 Telegram 中搜索 `@BotFather` +2. 发送 `/start` 开始对话 +3. 发送 `/newbot` 创建新机器人 + +### 2. 设置机器人信息 + +1. 输入机器人的显示名称(例如:`Email Notifier`) +2. 输入机器人的用户名(必须以 `bot` 结尾,例如:`my_email_bot`) +3. BotFather 会返回一个 Token,格式类似:`123456789:ABCdefGHIjklMNOpqrSTUvwxyz` + +## 第二步:获取聊天 ID + +### 方法一:私聊获取 + +1. 在 Telegram 中搜索您刚创建的机器人 +2. 发送 `/start` 或任意消息给机器人 +3. 打开浏览器,访问: + + ```bash + https://api.telegram.org/bot/getUpdates + ``` + + 将 `` 替换为您的实际 Token +4. 在返回的 JSON 中找到 `"chat":{"id":123456789}` 部分,这个数字就是您的聊天 ID + +### 方法二:群组获取 + +1. 将机器人添加到目标群组 +2. 在群组中发送任意消息 @ 您的机器人(例如:`@my_email_bot hello`) +3. 访问上述 API 链接 +4. 找到对应的群组聊天 ID(通常是负数,如:`-123456789`) + +### 方法三:使用其他机器人 + +1. 搜索 `@userinfobot` 或 `@chatidbot` +2. 发送消息获取聊天 ID + +## 第三步:系统配置 + +打开 `localhost:3000/admin/system` 页面,点击 `电子邮件配置`,填写对应的参数。 + +## 第四步:自定义消息模板 + +### 默认消息格式 + +如果不设置自定义模板,系统会使用以下默认格式: + +```bash +📧 *New Email* + +*From:* `发件人姓名 <邮箱地址>` +*To:* `收件人邮箱` +*Subject:* 邮件主题 +*Date:* 发送日期 + +\`\`\`Content +邮件内容(前2000字符) +\`\`\` +``` + +### 自定义模板 + +您可以使用以下变量来自定义消息模板: + +| 变量 | 说明 | +|------|------| +| `{{from}}` | 发件人信息 | +| `{{to}}` | 收件人邮箱 | +| `{{subject}}` | 邮件主题 | +| `{{text}}` | 邮件文本内容 | +| `{{date}}` | 发送日期 | + +### 模板示例 + +```md +🔔 收到新邮件\n\n发件人:{{from}}\n主题:{{subject}}\n时间:{{date}}\n\n内容:\n{{text}} +``` + +## 功能特性 + +### 1. 多聊天群组支持 +- 支持同时向多个 Telegram 群组或私聊发送通知 +- 使用逗号分隔多个聊天 ID +- 发送失败不会影响其他群组的推送 + +### 2. 白名单过滤 +- 支持设置收件人邮箱白名单 +- 只有白名单中的邮箱收到邮件时才会推送到 Telegram +- 如果不设置白名单,则推送所有邮件 + +### 3. 内容处理 +- 自动去除 HTML 标签 +- 内容超过 2000 字符时自动截断 +- 支持 Markdown 格式显示 + +### 4. 错误处理 +- 自动重试机制 +- 详细的错误日志记录 +- 部分发送失败不影响整体流程 + +## 故障排除 + +### 常见问题 + +1. **机器人无法发送消息** + - 检查 Bot Token 是否正确 + - 确认机器人已被添加到目标群组 + - 确认机器人在群组中有发送消息的权限 + +2. **获取不到聊天 ID** + - 确保已经向机器人发送过消息 + - 检查 API 请求 URL 是否正确 + - 尝试使用专门的机器人获取 ID + +3. **消息格式异常** + - 检查自定义模板中的变量是否正确 + - 确认 Markdown 语法没有错误 + - 测试时可以先使用默认模板 + +4. **部分群组收不到消息** + - 检查聊天 ID 是否正确 + - 确认机器人在对应群组中 + - 查看服务器日志中的错误信息 diff --git a/content/docs/examples/github-page.mdx b/content/docs/examples/github-page.mdx new file mode 100644 index 0000000..a7a5e9f --- /dev/null +++ b/content/docs/examples/github-page.mdx @@ -0,0 +1,10 @@ +--- +title: Github Page +description: Free parsing custom domain names. +--- + +Foollow https://github.com/[account]/[repo]/settings/pages to deploy your github page, add your custom domain name like `abc.wr.do`. + +Then back to https://wr.do/dashboard/records, config the `CNAME` content: + +![](/_static/examples/github.png) diff --git a/content/docs/index.mdx b/content/docs/index.mdx index fc9e06a..f013c2a 100644 --- a/content/docs/index.mdx +++ b/content/docs/index.mdx @@ -23,12 +23,16 @@ WR.DO is a all-in-one web utility platform featuring short links with analytics, - Unlimited mailbox creation - Receive unlimited emails (powered by Cloudflare Email Worker) - Send emails (powered by Resend) + - Support catch-all emails + - Support push to telegram groups - API endpoints for mailbox creation - API endpoints for inbox retrieval - 🌐 **Subdomain Management Service**: - Manage DNS records across multiple Cloudflare accounts and domains - Create various DNS record types (CNAME, A, TXT, etc.) + - Support enabling application mode (user submission, admin approval) + - Support email notification of administrator and user domain application status - 📡 **Open API Module**: - Website metadata extraction API @@ -42,6 +46,7 @@ WR.DO is a all-in-one web utility platform featuring short links with analytics, - Multi-dimensional dashboard with website analytics - Dynamic service configuration (toggle short links, email, subdomain management) - User management (permissions, quotas, account control) + - Dynamically configure login methods (Google, GitHub, Magic Link, Credentials, LinuxDO) - Centralized short link administration - Centralized email management - Centralized subdomain administration diff --git a/public/_static/examples/github.png b/public/_static/examples/github.png new file mode 100644 index 0000000000000000000000000000000000000000..9fb5bd793ca1461c391e50adc0fe94cfda10fbe2 GIT binary patch literal 170877 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®yjb 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 literal 0 HcmV?d00001 diff --git a/public/sw.js b/public/sw.js index 20437cf..10bb6b1 100644 --- a/public/sw.js +++ b/public/sw.js @@ -1 +1,101 @@ -if(!self.define){let e,s={};const n=(n,c)=>(n=new URL(n+".js",c).href,s[n]||new Promise((s=>{if("document"in self){const e=document.createElement("script");e.src=n,e.onload=s,document.head.appendChild(e)}else e=n,importScripts(n),s()})).then((()=>{let e=s[n];if(!e)throw new Error(`Module ${n} didn’t register its module`);return e})));self.define=(c,a)=>{const i=e||("document"in self?document.currentScript.src:"")||location.href;if(s[i])return;let t={};const r=e=>n(e,i),d={module:{uri:i},exports:t,require:r};s[i]=Promise.all(c.map((e=>d[e]||r(e)))).then((e=>(a(...e),t)))}}define(["./workbox-e9849328"],(function(e){"use strict";importScripts(),self.skipWaiting(),e.clientsClaim(),e.precacheAndRoute([{url:"/_next/app-build-manifest.json",revision:"0c267fef8f9fc71bf51972bc0913d831"},{url:"/_next/static/RmIUG3nnVvNFGfLT6yc-R/_buildManifest.js",revision:"73b52720bea01027a804a328361e8618"},{url:"/_next/static/RmIUG3nnVvNFGfLT6yc-R/_ssgManifest.js",revision:"b6652df95db52feb4daf4eca35380933"},{url:"/_next/static/chunks/1139-5740388ed4c7e5ee.js",revision:"RmIUG3nnVvNFGfLT6yc-R"},{url:"/_next/static/chunks/1216.057c6927e653812a.js",revision:"057c6927e653812a"},{url:"/_next/static/chunks/1388-ef997802c3c6a7ed.js",revision:"RmIUG3nnVvNFGfLT6yc-R"},{url:"/_next/static/chunks/1403-634f1e6401232c43.js",revision:"RmIUG3nnVvNFGfLT6yc-R"},{url:"/_next/static/chunks/1415-df72043ee6e69051.js",revision:"RmIUG3nnVvNFGfLT6yc-R"},{url:"/_next/static/chunks/1645-2cda1d052fa78be6.js",revision:"RmIUG3nnVvNFGfLT6yc-R"},{url:"/_next/static/chunks/1826-8d6c47c8e76fdc60.js",revision:"RmIUG3nnVvNFGfLT6yc-R"},{url:"/_next/static/chunks/1863-2d339170309c28ad.js",revision:"RmIUG3nnVvNFGfLT6yc-R"},{url:"/_next/static/chunks/1868-70adc99ffecf5ab8.js",revision:"RmIUG3nnVvNFGfLT6yc-R"},{url:"/_next/static/chunks/2094-053542c77b2407da.js",revision:"RmIUG3nnVvNFGfLT6yc-R"},{url:"/_next/static/chunks/2142-d1eb195dd5efafef.js",revision:"RmIUG3nnVvNFGfLT6yc-R"},{url:"/_next/static/chunks/2171-9a1ff0ce96870317.js",revision:"RmIUG3nnVvNFGfLT6yc-R"},{url:"/_next/static/chunks/2207-80945283a4fe0bbf.js",revision:"RmIUG3nnVvNFGfLT6yc-R"},{url:"/_next/static/chunks/2435-8db99ef5b8d19214.js",revision:"RmIUG3nnVvNFGfLT6yc-R"},{url:"/_next/static/chunks/2560-af30217bf65c5fc2.js",revision:"RmIUG3nnVvNFGfLT6yc-R"},{url:"/_next/static/chunks/2634-6bed07ac2c56126b.js",revision:"RmIUG3nnVvNFGfLT6yc-R"},{url:"/_next/static/chunks/2694-a700d54f2a2d3241.js",revision:"RmIUG3nnVvNFGfLT6yc-R"},{url:"/_next/static/chunks/27163a17.08d89e3b0915188c.js",revision:"08d89e3b0915188c"},{url:"/_next/static/chunks/2928-f22018a8c212558c.js",revision:"RmIUG3nnVvNFGfLT6yc-R"},{url:"/_next/static/chunks/3005-9fe909429bf04889.js",revision:"RmIUG3nnVvNFGfLT6yc-R"},{url:"/_next/static/chunks/3077-83b04c0a5f653793.js",revision:"RmIUG3nnVvNFGfLT6yc-R"},{url:"/_next/static/chunks/3107-fab00402de5c9da9.js",revision:"RmIUG3nnVvNFGfLT6yc-R"},{url:"/_next/static/chunks/3203-bf9835234e8bcb3b.js",revision:"RmIUG3nnVvNFGfLT6yc-R"},{url:"/_next/static/chunks/3417-400d4aa9c8017383.js",revision:"RmIUG3nnVvNFGfLT6yc-R"},{url:"/_next/static/chunks/3422-0f23e1fdf056c6ed.js",revision:"RmIUG3nnVvNFGfLT6yc-R"},{url:"/_next/static/chunks/3555.58af2a07a94c328f.js",revision:"58af2a07a94c328f"},{url:"/_next/static/chunks/3633-b531ea72fc3e192d.js",revision:"RmIUG3nnVvNFGfLT6yc-R"},{url:"/_next/static/chunks/4024-bc1ea1e928173305.js",revision:"RmIUG3nnVvNFGfLT6yc-R"},{url:"/_next/static/chunks/4515-ea4604bef1287355.js",revision:"RmIUG3nnVvNFGfLT6yc-R"},{url:"/_next/static/chunks/4834-cd14c15636da6e49.js",revision:"RmIUG3nnVvNFGfLT6yc-R"},{url:"/_next/static/chunks/4a8527dd.ab1073dfd920aed2.js",revision:"ab1073dfd920aed2"},{url:"/_next/static/chunks/5003-c1ae6915a5121aa7.js",revision:"RmIUG3nnVvNFGfLT6yc-R"},{url:"/_next/static/chunks/50224b42.2bb1073a5294c36c.js",revision:"2bb1073a5294c36c"},{url:"/_next/static/chunks/5434-9447fc18fd0f54e2.js",revision:"RmIUG3nnVvNFGfLT6yc-R"},{url:"/_next/static/chunks/5845-4d8f3b70c1c3faf0.js",revision:"RmIUG3nnVvNFGfLT6yc-R"},{url:"/_next/static/chunks/6254-54e744a50d1189ca.js",revision:"RmIUG3nnVvNFGfLT6yc-R"},{url:"/_next/static/chunks/69-5a1e415f7f748207.js",revision:"RmIUG3nnVvNFGfLT6yc-R"},{url:"/_next/static/chunks/6c3b26aa.d016978d1671db02.js",revision:"d016978d1671db02"},{url:"/_next/static/chunks/7184-f9c978c5ee0d1ab1.js",revision:"RmIUG3nnVvNFGfLT6yc-R"},{url:"/_next/static/chunks/7241-690f5cd317bde001.js",revision:"RmIUG3nnVvNFGfLT6yc-R"},{url:"/_next/static/chunks/7271.be219f36d2bf6390.js",revision:"be219f36d2bf6390"},{url:"/_next/static/chunks/7705-ad4a4d70d9568874.js",revision:"RmIUG3nnVvNFGfLT6yc-R"},{url:"/_next/static/chunks/7797-fa749103cb890710.js",revision:"RmIUG3nnVvNFGfLT6yc-R"},{url:"/_next/static/chunks/7865-5e51c968efc491ca.js",revision:"RmIUG3nnVvNFGfLT6yc-R"},{url:"/_next/static/chunks/8539-c472ab4358561be3.js",revision:"RmIUG3nnVvNFGfLT6yc-R"},{url:"/_next/static/chunks/8599-0de4d28105efb578.js",revision:"RmIUG3nnVvNFGfLT6yc-R"},{url:"/_next/static/chunks/9066-5a145a8a589b9d48.js",revision:"RmIUG3nnVvNFGfLT6yc-R"},{url:"/_next/static/chunks/9305-536c4d9fff0358c9.js",revision:"RmIUG3nnVvNFGfLT6yc-R"},{url:"/_next/static/chunks/9392-b8e1f2b8eb504601.js",revision:"RmIUG3nnVvNFGfLT6yc-R"},{url:"/_next/static/chunks/9423-3101d7196f851c9a.js",revision:"RmIUG3nnVvNFGfLT6yc-R"},{url:"/_next/static/chunks/9521-ff258274fc4646f6.js",revision:"RmIUG3nnVvNFGfLT6yc-R"},{url:"/_next/static/chunks/9586-a89b71266a46044e.js",revision:"RmIUG3nnVvNFGfLT6yc-R"},{url:"/_next/static/chunks/9596-fb809bc981c34020.js",revision:"RmIUG3nnVvNFGfLT6yc-R"},{url:"/_next/static/chunks/9716-4f8f351acf594364.js",revision:"RmIUG3nnVvNFGfLT6yc-R"},{url:"/_next/static/chunks/991-48f70e44c6d98fee.js",revision:"RmIUG3nnVvNFGfLT6yc-R"},{url:"/_next/static/chunks/a33f0537-4968ab0047fe8bc4.js",revision:"RmIUG3nnVvNFGfLT6yc-R"},{url:"/_next/static/chunks/app/(auth)/layout-b48225cca4b9c592.js",revision:"RmIUG3nnVvNFGfLT6yc-R"},{url:"/_next/static/chunks/app/(auth)/login/page-5f9b72ca93ecdea2.js",revision:"RmIUG3nnVvNFGfLT6yc-R"},{url:"/_next/static/chunks/app/(auth)/register/page-14744220ccc57635.js",revision:"RmIUG3nnVvNFGfLT6yc-R"},{url:"/_next/static/chunks/app/(docs)/docs/%5B%5B...slug%5D%5D/page-18021aa591246faa.js",revision:"RmIUG3nnVvNFGfLT6yc-R"},{url:"/_next/static/chunks/app/(docs)/docs/layout-9d9ca86445b756cf.js",revision:"RmIUG3nnVvNFGfLT6yc-R"},{url:"/_next/static/chunks/app/(docs)/layout-b17995a5d02aa98c.js",revision:"RmIUG3nnVvNFGfLT6yc-R"},{url:"/_next/static/chunks/app/(marketing)/%5Bslug%5D/page-afe00d345c0ea854.js",revision:"RmIUG3nnVvNFGfLT6yc-R"},{url:"/_next/static/chunks/app/(marketing)/error-9e2db496f6125a10.js",revision:"RmIUG3nnVvNFGfLT6yc-R"},{url:"/_next/static/chunks/app/(marketing)/feedback/loading-54a818aa242c1c78.js",revision:"RmIUG3nnVvNFGfLT6yc-R"},{url:"/_next/static/chunks/app/(marketing)/feedback/page-367ab03cdca895f8.js",revision:"RmIUG3nnVvNFGfLT6yc-R"},{url:"/_next/static/chunks/app/(marketing)/layout-71bc4682e1bd0937.js",revision:"RmIUG3nnVvNFGfLT6yc-R"},{url:"/_next/static/chunks/app/(marketing)/not-found-d5f4451fe8d5c1ec.js",revision:"RmIUG3nnVvNFGfLT6yc-R"},{url:"/_next/static/chunks/app/(marketing)/page-ba0bfcb38dcd2b48.js",revision:"RmIUG3nnVvNFGfLT6yc-R"},{url:"/_next/static/chunks/app/(protected)/admin/layout-a8eb3ad7a9dd897a.js",revision:"RmIUG3nnVvNFGfLT6yc-R"},{url:"/_next/static/chunks/app/(protected)/admin/loading-53f9d12d30d1f3d0.js",revision:"RmIUG3nnVvNFGfLT6yc-R"},{url:"/_next/static/chunks/app/(protected)/admin/page-b4a39b5bb87d792b.js",revision:"RmIUG3nnVvNFGfLT6yc-R"},{url:"/_next/static/chunks/app/(protected)/admin/records/loading-ab4f1775d0a5855f.js",revision:"RmIUG3nnVvNFGfLT6yc-R"},{url:"/_next/static/chunks/app/(protected)/admin/records/page-a199da75ad88db15.js",revision:"RmIUG3nnVvNFGfLT6yc-R"},{url:"/_next/static/chunks/app/(protected)/admin/system/loading-91f2953d70544a70.js",revision:"RmIUG3nnVvNFGfLT6yc-R"},{url:"/_next/static/chunks/app/(protected)/admin/system/page-47314f33e561d8aa.js",revision:"RmIUG3nnVvNFGfLT6yc-R"},{url:"/_next/static/chunks/app/(protected)/admin/urls/loading-dbff54ab0e2bca06.js",revision:"RmIUG3nnVvNFGfLT6yc-R"},{url:"/_next/static/chunks/app/(protected)/admin/urls/page-a195b9e30eabab76.js",revision:"RmIUG3nnVvNFGfLT6yc-R"},{url:"/_next/static/chunks/app/(protected)/admin/users/loading-482e4f378d7d5b45.js",revision:"RmIUG3nnVvNFGfLT6yc-R"},{url:"/_next/static/chunks/app/(protected)/admin/users/page-adfd0e11d6a0e4be.js",revision:"RmIUG3nnVvNFGfLT6yc-R"},{url:"/_next/static/chunks/app/(protected)/dashboard/loading-0adcc5db79d0e55c.js",revision:"RmIUG3nnVvNFGfLT6yc-R"},{url:"/_next/static/chunks/app/(protected)/dashboard/page-d779a9535c252e68.js",revision:"RmIUG3nnVvNFGfLT6yc-R"},{url:"/_next/static/chunks/app/(protected)/dashboard/records/loading-554f6e54f79dfe52.js",revision:"RmIUG3nnVvNFGfLT6yc-R"},{url:"/_next/static/chunks/app/(protected)/dashboard/records/page-3419a6e6830b994c.js",revision:"RmIUG3nnVvNFGfLT6yc-R"},{url:"/_next/static/chunks/app/(protected)/dashboard/scrape/loading-9db6275fe4c0583c.js",revision:"RmIUG3nnVvNFGfLT6yc-R"},{url:"/_next/static/chunks/app/(protected)/dashboard/scrape/markdown/loading-66ed94667ed675f8.js",revision:"RmIUG3nnVvNFGfLT6yc-R"},{url:"/_next/static/chunks/app/(protected)/dashboard/scrape/markdown/page-52c24705c06422a2.js",revision:"RmIUG3nnVvNFGfLT6yc-R"},{url:"/_next/static/chunks/app/(protected)/dashboard/scrape/meta-info/loading-05b8d9559831628a.js",revision:"RmIUG3nnVvNFGfLT6yc-R"},{url:"/_next/static/chunks/app/(protected)/dashboard/scrape/meta-info/page-cc5b2f376c140869.js",revision:"RmIUG3nnVvNFGfLT6yc-R"},{url:"/_next/static/chunks/app/(protected)/dashboard/scrape/page-bd2803d664693616.js",revision:"RmIUG3nnVvNFGfLT6yc-R"},{url:"/_next/static/chunks/app/(protected)/dashboard/scrape/qrcode/loading-3b898f6af6b6caf4.js",revision:"RmIUG3nnVvNFGfLT6yc-R"},{url:"/_next/static/chunks/app/(protected)/dashboard/scrape/qrcode/page-e84f2584d9812933.js",revision:"RmIUG3nnVvNFGfLT6yc-R"},{url:"/_next/static/chunks/app/(protected)/dashboard/scrape/screenshot/loading-b0c2bfbaebd441c9.js",revision:"RmIUG3nnVvNFGfLT6yc-R"},{url:"/_next/static/chunks/app/(protected)/dashboard/scrape/screenshot/page-e5d12e0d70435d01.js",revision:"RmIUG3nnVvNFGfLT6yc-R"},{url:"/_next/static/chunks/app/(protected)/dashboard/settings/loading-ccdc89b2d9f7cb9f.js",revision:"RmIUG3nnVvNFGfLT6yc-R"},{url:"/_next/static/chunks/app/(protected)/dashboard/settings/page-faccb31ac18650f1.js",revision:"RmIUG3nnVvNFGfLT6yc-R"},{url:"/_next/static/chunks/app/(protected)/dashboard/urls/loading-5e7c488421b67916.js",revision:"RmIUG3nnVvNFGfLT6yc-R"},{url:"/_next/static/chunks/app/(protected)/dashboard/urls/page-80e0aeb726973ba9.js",revision:"RmIUG3nnVvNFGfLT6yc-R"},{url:"/_next/static/chunks/app/(protected)/layout-c8e4d18ef7402c1a.js",revision:"RmIUG3nnVvNFGfLT6yc-R"},{url:"/_next/static/chunks/app/(protected)/setup/loading-9a63f2e4e17f39b9.js",revision:"RmIUG3nnVvNFGfLT6yc-R"},{url:"/_next/static/chunks/app/(protected)/setup/page-e6232a0a1ad7835d.js",revision:"RmIUG3nnVvNFGfLT6yc-R"},{url:"/_next/static/chunks/app/_not-found/page-bf20037676ab596e.js",revision:"RmIUG3nnVvNFGfLT6yc-R"},{url:"/_next/static/chunks/app/chat/layout-6206368de0c39353.js",revision:"RmIUG3nnVvNFGfLT6yc-R"},{url:"/_next/static/chunks/app/chat/loading-473e4310406058f5.js",revision:"RmIUG3nnVvNFGfLT6yc-R"},{url:"/_next/static/chunks/app/chat/page-e47d4ca906d2bbba.js",revision:"RmIUG3nnVvNFGfLT6yc-R"},{url:"/_next/static/chunks/app/emails/layout-81980063f2a0475f.js",revision:"RmIUG3nnVvNFGfLT6yc-R"},{url:"/_next/static/chunks/app/emails/loading-3045eef4f2115370.js",revision:"RmIUG3nnVvNFGfLT6yc-R"},{url:"/_next/static/chunks/app/emails/page-a08c3e3ef24d5edd.js",revision:"RmIUG3nnVvNFGfLT6yc-R"},{url:"/_next/static/chunks/app/layout-a6935878349b1368.js",revision:"RmIUG3nnVvNFGfLT6yc-R"},{url:"/_next/static/chunks/app/not-found-f63b66c698305b83.js",revision:"RmIUG3nnVvNFGfLT6yc-R"},{url:"/_next/static/chunks/app/password-prompt/layout-0624ec0bd786787f.js",revision:"RmIUG3nnVvNFGfLT6yc-R"},{url:"/_next/static/chunks/app/password-prompt/loading-66a4a04851738671.js",revision:"RmIUG3nnVvNFGfLT6yc-R"},{url:"/_next/static/chunks/app/password-prompt/page-023e2cacfbc0e590.js",revision:"RmIUG3nnVvNFGfLT6yc-R"},{url:"/_next/static/chunks/ba634aa8-4cec903169236942.js",revision:"RmIUG3nnVvNFGfLT6yc-R"},{url:"/_next/static/chunks/db206de2-f82759f7af294c9e.js",revision:"RmIUG3nnVvNFGfLT6yc-R"},{url:"/_next/static/chunks/e40cd213.64f597590378c6cb.js",revision:"64f597590378c6cb"},{url:"/_next/static/chunks/ef956ed8.c4c1ce487e6e4c3b.js",revision:"c4c1ce487e6e4c3b"},{url:"/_next/static/chunks/framework-20afca218c33ed8b.js",revision:"RmIUG3nnVvNFGfLT6yc-R"},{url:"/_next/static/chunks/main-a4e14eeb08fabb62.js",revision:"RmIUG3nnVvNFGfLT6yc-R"},{url:"/_next/static/chunks/main-app-571fe4d9916d1d2b.js",revision:"RmIUG3nnVvNFGfLT6yc-R"},{url:"/_next/static/chunks/pages/_app-6eec5c984b7548b1.js",revision:"RmIUG3nnVvNFGfLT6yc-R"},{url:"/_next/static/chunks/pages/_error-cffe1ad5943208e4.js",revision:"RmIUG3nnVvNFGfLT6yc-R"},{url:"/_next/static/chunks/polyfills-42372ed130431b0a.js",revision:"846118c33b2c0e922d7b3a7676f81f6f"},{url:"/_next/static/chunks/webpack-bfd090d22501dfde.js",revision:"RmIUG3nnVvNFGfLT6yc-R"},{url:"/_next/static/css/45a6a8d6489d6174.css",revision:"45a6a8d6489d6174"},{url:"/_next/static/css/8aee48eb52f4c731.css",revision:"8aee48eb52f4c731"},{url:"/_next/static/css/e3bff416fde6ee53.css",revision:"e3bff416fde6ee53"},{url:"/_next/static/css/f1a8eed5f3d5046a.css",revision:"f1a8eed5f3d5046a"},{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/8e9860b6e62d6359-s.woff2",revision:"01ba6c2a184b8cba08b0d57167664d75"},{url:"/_next/static/media/90475aac776488b6-s.p.woff2",revision:"183db31d6365283bef4914042be9dfab"},{url:"/_next/static/media/97e0cb1ae144a2a9-s.woff2",revision:"e360c61c5bd8d90639fd4503c829c2dc"},{url:"/_next/static/media/d9396795aa5ec363-s.p.woff2",revision:"70880e42f07b0386e261974cd14820a1"},{url:"/_next/static/media/df0a9ae256c0569c-s.woff2",revision:"d54db44de5ccb18886ece2fda72bdfe0"},{url:"/_next/static/media/e4af272ccee01ff0-s.p.woff2",revision:"65850a373e258f1c897a2b3d75eb74de"},{url:"/_static/avatar.png",revision:"3db1ae56a24dc2d45a165e19489a9caf"},{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/domain-form.png",revision:"fcffc219301dedf41475264dfe761184"},{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/linuxdo-connect.png",revision:"5cf62c821a8463e404eb45fd32b2244a"},{url:"/_static/docs/r2-domain.png",revision:"a5855dba9a2793cffdd14b06c9b266a9"},{url:"/_static/docs/setup-1.png",revision:"4340ad005b7629b09aa41541e76d1ef8"},{url:"/_static/docs/setup-2.png",revision:"ae15ea4cf3d1b8ddabba0c99d2aeebd0"},{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/domains.png",revision:"c51b2b851940e6344e1a134edc9b25fa"},{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/realtime-globe.png",revision:"162bcb7f8facb4db26a00c829c6a9278"},{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:"/colos.json",revision:"0bde54329d673a1068bf42dc6e5c1ce1"},{url:"/countries.geojson",revision:"61620289087717ec96be2a6ac3d262e1"},{url:"/favicon.ico",revision:"4c7bd029735bc3a7896a5ab1d689c949"},{url:"/llms.txt",revision:"beb0322b35b77077ac55b38e0c03d303"},{url:"/manifest.json",revision:"e2cd4ac92dd32f82c3e0d7019d43a263"},{url:"/robots.txt",revision:"001eed25907c33863f2e60dfe3620dfd"},{url:"/site.webmanifest",revision:"e2cd4ac92dd32f82c3e0d7019d43a263"},{url:"/sitemap-0.xml",revision:"1ca2ba78e66734af1fa3855d8008ec44"},{url:"/sitemap.xml",revision:"175031181630b79b72c538659e0fe91c"}],{ignoreURLParametersMatching:[]}),e.cleanupOutdatedCaches(),e.registerRoute("/",new e.NetworkFirst({cacheName:"start-url",plugins:[{cacheWillUpdate:async({request:e,response:s,event:n,state:c})=>s&&"opaqueredirect"===s.type?new Response(s.body,{status:200,statusText:"OK",headers:s.headers}):s}]}),"GET"),e.registerRoute(/^https:\/\/fonts\.(?:gstatic)\.com\/.*/i,new e.CacheFirst({cacheName:"google-fonts-webfonts",plugins:[new e.ExpirationPlugin({maxEntries:4,maxAgeSeconds:31536e3})]}),"GET"),e.registerRoute(/^https:\/\/fonts\.(?:googleapis)\.com\/.*/i,new e.StaleWhileRevalidate({cacheName:"google-fonts-stylesheets",plugins:[new e.ExpirationPlugin({maxEntries:4,maxAgeSeconds:604800})]}),"GET"),e.registerRoute(/\.(?:eot|otf|ttc|ttf|woff|woff2|font.css)$/i,new e.StaleWhileRevalidate({cacheName:"static-font-assets",plugins:[new e.ExpirationPlugin({maxEntries:4,maxAgeSeconds:604800})]}),"GET"),e.registerRoute(/\.(?:jpg|jpeg|gif|png|svg|ico|webp)$/i,new e.StaleWhileRevalidate({cacheName:"static-image-assets",plugins:[new e.ExpirationPlugin({maxEntries:64,maxAgeSeconds:86400})]}),"GET"),e.registerRoute(/\/_next\/image\?url=.+$/i,new e.StaleWhileRevalidate({cacheName:"next-image",plugins:[new e.ExpirationPlugin({maxEntries:64,maxAgeSeconds:86400})]}),"GET"),e.registerRoute(/\.(?:mp3|wav|ogg)$/i,new e.CacheFirst({cacheName:"static-audio-assets",plugins:[new e.RangeRequestsPlugin,new e.ExpirationPlugin({maxEntries:32,maxAgeSeconds:86400})]}),"GET"),e.registerRoute(/\.(?:mp4)$/i,new e.CacheFirst({cacheName:"static-video-assets",plugins:[new e.RangeRequestsPlugin,new e.ExpirationPlugin({maxEntries:32,maxAgeSeconds:86400})]}),"GET"),e.registerRoute(/\.(?:js)$/i,new e.StaleWhileRevalidate({cacheName:"static-js-assets",plugins:[new e.ExpirationPlugin({maxEntries:32,maxAgeSeconds:86400})]}),"GET"),e.registerRoute(/\.(?:css|less)$/i,new e.StaleWhileRevalidate({cacheName:"static-style-assets",plugins:[new e.ExpirationPlugin({maxEntries:32,maxAgeSeconds:86400})]}),"GET"),e.registerRoute(/\/_next\/data\/.+\/.+\.json$/i,new e.StaleWhileRevalidate({cacheName:"next-data",plugins:[new e.ExpirationPlugin({maxEntries:32,maxAgeSeconds:86400})]}),"GET"),e.registerRoute(/\.(?:json|xml|csv)$/i,new e.NetworkFirst({cacheName:"static-data-assets",plugins:[new e.ExpirationPlugin({maxEntries:32,maxAgeSeconds:86400})]}),"GET"),e.registerRoute((({url:e})=>{if(!(self.origin===e.origin))return!1;const s=e.pathname;return!s.startsWith("/api/auth/")&&!!s.startsWith("/api/")}),new e.NetworkFirst({cacheName:"apis",networkTimeoutSeconds:10,plugins:[new e.ExpirationPlugin({maxEntries:16,maxAgeSeconds:86400})]}),"GET"),e.registerRoute((({url:e})=>{if(!(self.origin===e.origin))return!1;return!e.pathname.startsWith("/api/")}),new e.NetworkFirst({cacheName:"others",networkTimeoutSeconds:10,plugins:[new e.ExpirationPlugin({maxEntries:32,maxAgeSeconds:86400})]}),"GET"),e.registerRoute((({url:e})=>!(self.origin===e.origin)),new e.NetworkFirst({cacheName:"cross-origin",networkTimeoutSeconds:10,plugins:[new e.ExpirationPlugin({maxEntries:32,maxAgeSeconds:3600})]}),"GET")})); +/** + * 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..c6affa0 --- /dev/null +++ b/public/sw.js.map @@ -0,0 +1 @@ +{"version":3,"file":"sw.js","sources":["../../../../../../private/var/folders/9b/3qmyp8zd2xvdspdrp149fyg00000gn/T/af7b76ab7f62d5d1205dcfb9271c20f7/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}));