From 8a05fa09070640dab607c105b157922466be378e Mon Sep 17 00:00:00 2001 From: oiov Date: Tue, 20 May 2025 22:46:13 +0800 Subject: [PATCH] feat: support multi domain configuration and management features (database) --- .env.example | 10 - app/(protected)/admin/domains/domain-list.tsx | 364 +++ app/(protected)/admin/domains/loading.tsx | 12 + app/(protected)/admin/domains/page.tsx | 41 + app/(protected)/admin/users/user-list.tsx | 1 - .../dashboard/records/record-list.tsx | 2 +- app/(protected)/dashboard/urls/url-list.tsx | 2 +- app/api/admin/domain/route.ts | 147 + app/api/domain/route.ts | 31 + app/api/record/add/route.ts | 33 +- app/api/record/admin/add/route.ts | 26 +- app/api/record/admin/delete/route.ts | 28 +- app/api/record/admin/route.ts | 3 +- app/api/record/admin/update/route.ts | 26 +- app/api/record/delete/route.ts | 27 +- app/api/record/route.ts | 1 - app/api/record/update/route.ts | 36 +- app/api/url/add/route.ts | 13 + app/api/url/route.ts | 1 - app/api/v1/email/route.ts | 8 +- app/api/v1/short/route.ts | 12 + app/manifest.json | 2 +- components/dashboard/form-section-columns.tsx | 9 +- components/email/EmailSidebar.tsx | 60 +- components/forms/domain-form.tsx | 417 +++ components/forms/record-form.tsx | 59 +- components/forms/url-form.tsx | 104 +- components/shared/icons.tsx | 29 + config/dashboard.ts | 8 +- config/site.ts | 6 - content/docs/developer/cloudflare.mdx | 43 + content/docs/developer/installation.mdx | 9 - content/docs/developer/quick-start.mdx | 65 +- env.mjs | 13 - lib/domainConfig.ts | 36 + lib/dto/domains.ts | 122 + lib/utils.ts | 22 - lib/validations/domain.ts | 17 + package.json | 2 +- .../migrations/20250520104322/migration.sql | 18 + prisma/schema.prisma | 21 + public/_static/docs/domain-form.png | Bin 0 -> 340596 bytes public/manifest.json | 2 +- public/site.webmanifest | 2 +- public/sitemap-0.xml | 72 +- public/sw.js | 102 +- public/sw.js.map | 1 + public/workbox-8817a5e5.js | 2456 +++++++++++++++++ public/workbox-8817a5e5.js.map | 1 + public/workbox-e9849328.js | 1 - types/index.d.ts | 3 - 51 files changed, 4158 insertions(+), 368 deletions(-) create mode 100644 app/(protected)/admin/domains/domain-list.tsx create mode 100644 app/(protected)/admin/domains/loading.tsx create mode 100644 app/(protected)/admin/domains/page.tsx create mode 100644 app/api/admin/domain/route.ts create mode 100644 app/api/domain/route.ts create mode 100644 components/forms/domain-form.tsx create mode 100644 lib/domainConfig.ts create mode 100644 lib/dto/domains.ts create mode 100644 lib/validations/domain.ts create mode 100644 prisma/migrations/20250520104322/migration.sql create mode 100644 public/_static/docs/domain-form.png create mode 100644 public/sw.js.map create mode 100644 public/workbox-8817a5e5.js create mode 100644 public/workbox-8817a5e5.js.map delete mode 100644 public/workbox-e9849328.js diff --git a/.env.example b/.env.example index 379eff4..1116a71 100644 --- a/.env.example +++ b/.env.example @@ -25,14 +25,6 @@ DATABASE_URL='postgres://[user]:[password]@[neon_hostname]/[dbname]?sslmode=requ # ----------------------------------------------------------------------------- RESEND_API_KEY= -# ----------------------------------------------------------------------------- -# Cloudflare -# ----------------------------------------------------------------------------- -NEXT_PUBLIC_CLOUDFLARE_ZONE_NAME=wr.do,uv.do -CLOUDFLARE_ZONE=[{"zone_id":"abc123", "zone_name": "wr.do"},{"zone_id":"abc456", "zone_name": "uv.do"}] -CLOUDFLARE_API_KEY= -CLOUDFLARE_EMAIL= - # Open Signup NEXT_PUBLIC_OPEN_SIGNUP=1 @@ -45,7 +37,5 @@ SCREENSHOTONE_BASE_URL=https://shot.wr.do # GitHub api token for getting gitHub stars count GITHUB_TOKEN= -# Short domains, split by "," -NEXT_PUBLIC_SHORT_DOMAINS=wr.do,uv.do diff --git a/app/(protected)/admin/domains/domain-list.tsx b/app/(protected)/admin/domains/domain-list.tsx new file mode 100644 index 0000000..d913e8b --- /dev/null +++ b/app/(protected)/admin/domains/domain-list.tsx @@ -0,0 +1,364 @@ +"use client"; + +import { useState } from "react"; +import Link from "next/link"; +import { Domain, User } from "@prisma/client"; +import { PenLine, RefreshCwIcon } from "lucide-react"; +import { toast } from "sonner"; +import useSWR, { useSWRConfig } from "swr"; + +import { DomainFormData } from "@/lib/dto/domains"; +import { ShortUrlFormData } from "@/lib/dto/short-urls"; +import { + cn, + expirationTime, + fetcher, + removeUrlSuffix, + timeAgo, +} from "@/lib/utils"; +import { Button } from "@/components/ui/button"; +import { + Card, + CardContent, + CardDescription, + CardHeader, +} from "@/components/ui/card"; +import { Input } from "@/components/ui/input"; +import { Modal } from "@/components/ui/modal"; +import { Skeleton } from "@/components/ui/skeleton"; +import { Switch } from "@/components/ui/switch"; +import { + Table, + TableBody, + TableCell, + TableHead, + TableHeader, + TableRow, +} from "@/components/ui/table"; +import { DomainForm } from "@/components/forms/domain-form"; +import { FormType } from "@/components/forms/record-form"; +import { EmptyPlaceholder } from "@/components/shared/empty-placeholder"; +import { Icons } from "@/components/shared/icons"; +import { PaginationWrapper } from "@/components/shared/pagination"; + +export interface DomainListProps { + user: Pick; + action: string; +} + +function TableColumnSekleton() { + return ( + + + + + + + + + + + + + + + + + + + + + + + + ); +} + +export default function DomainList({ user, action }: DomainListProps) { + const [isShowForm, setShowForm] = useState(false); + const [formType, setFormType] = useState("add"); + const [currentEditDomain, setCurrentEditDomain] = + useState(null); + const [currentPage, setCurrentPage] = useState(1); + const [pageSize, setPageSize] = useState(10); + const [isShowDomainInfo, setShowDomainInfo] = useState(false); + const [selectedDomain, setSelectedDomain] = useState( + null, + ); + const [searchParams, setSearchParams] = useState({ + slug: "", + target: "", + userName: "", + }); + + const { mutate } = useSWRConfig(); + const { data, isLoading } = useSWR<{ + total: number; + list: DomainFormData[]; + }>( + `${action}?page=${currentPage}&size=${pageSize}&slug=${searchParams.slug}&userName=${searchParams.userName}&target=${searchParams.target}`, + fetcher, + ); + + const handleRefresh = () => { + mutate( + `${action}?page=${currentPage}&size=${pageSize}&slug=${searchParams.slug}&userName=${searchParams.userName}&target=${searchParams.target}`, + undefined, + ); + }; + + const handleChangeStatus = async ( + checked: boolean, + target: string, + domain: DomainFormData, + ) => { + const res = await fetch(action, { + method: "PUT", + body: JSON.stringify({ + id: domain.id, + enable_short_link: + target === "enable_short_link" ? checked : domain.enable_short_link, + enable_email: target === "enable_email" ? checked : domain.enable_email, + enable_dns: target === "enable_dns" ? checked : domain.enable_dns, + active: target === "active" ? checked : domain.active, + }), + }); + if (res.ok) { + const data = await res.json(); + if (data) { + toast.success("Successed!"); + } + } else { + toast.error("Activation failed!"); + } + }; + + return ( + <> + + + + Total Domains:{" "} + {data && data.total} + + +
+ + +
+
+ +
+
+ { + setSearchParams({ + ...searchParams, + slug: e.target.value, + }); + }} + /> + {searchParams.slug && ( + + )} +
+
+ + + + + + Domain + + + Shorten Service + + + Email Service + + + DNS Service + + + Active + + + Updated + + + Actions + + + + + {isLoading ? ( + <> + + + + + + + ) : data && data.list && data.list.length ? ( + data.list.map((domain) => ( +
+ + + + {domain.domain_name} + + + + + handleChangeStatus( + value, + "enable_short_link", + domain, + ) + } + /> + + + + handleChangeStatus(value, "enable_email", domain) + } + /> + + + + handleChangeStatus(value, "enable_dns", domain) + } + /> + + + + handleChangeStatus(value, "active", domain) + } + /> + + + {timeAgo(domain.updatedAt as Date)} + + + + {domain.cf_zone_id && + domain.cf_api_key && + domain.cf_email && ( + + )} + + + {/* {isShowDomainInfo && selectedDomain?.id === domain.id && ( + + )} */} +
+ )) + ) : ( + + + No Domains + + You don't have any domains yet. Start creating one. + + + )} +
+ {data && Math.ceil(data.total / pageSize) > 1 && ( + + )} +
+
+
+ + {/* form */} + + + + + ); +} + +export function DomainInfo({ domain }: { domain: DomainFormData }) { + return <>{domain.domain_name}; +} diff --git a/app/(protected)/admin/domains/loading.tsx b/app/(protected)/admin/domains/loading.tsx new file mode 100644 index 0000000..3ee8119 --- /dev/null +++ b/app/(protected)/admin/domains/loading.tsx @@ -0,0 +1,12 @@ +import { Skeleton } from "@/components/ui/skeleton"; +import { DashboardHeader } from "@/components/dashboard/header"; + +export default function DashboardRecordsLoading() { + return ( + <> + + + + + ); +} diff --git a/app/(protected)/admin/domains/page.tsx b/app/(protected)/admin/domains/page.tsx new file mode 100644 index 0000000..626f20c --- /dev/null +++ b/app/(protected)/admin/domains/page.tsx @@ -0,0 +1,41 @@ +import { redirect } from "next/navigation"; + +import { getCurrentUser } from "@/lib/session"; +import { constructMetadata } from "@/lib/utils"; +import { DashboardHeader } from "@/components/dashboard/header"; + +import UserRecordsList from "../../dashboard/records/record-list"; +import DomainList from "./domain-list"; + +export const metadata = constructMetadata({ + title: "DNS Records - WR.DO", + description: "List and manage records.", +}); + +export default async function DashboardPage() { + const user = await getCurrentUser(); + + if (!user?.id) redirect("/login"); + + return ( + <> + + + + ); +} diff --git a/app/(protected)/admin/users/user-list.tsx b/app/(protected)/admin/users/user-list.tsx index a4e613f..ebdfa07 100644 --- a/app/(protected)/admin/users/user-list.tsx +++ b/app/(protected)/admin/users/user-list.tsx @@ -33,7 +33,6 @@ import { TooltipProvider, TooltipTrigger, } from "@/components/ui/tooltip"; -import StatusDot from "@/components/dashboard/status-dot"; import { UserForm } from "@/components/forms/user-form"; import { EmptyPlaceholder } from "@/components/shared/empty-placeholder"; import { Icons } from "@/components/shared/icons"; diff --git a/app/(protected)/dashboard/records/record-list.tsx b/app/(protected)/dashboard/records/record-list.tsx index 959b13f..9128e8f 100644 --- a/app/(protected)/dashboard/records/record-list.tsx +++ b/app/(protected)/dashboard/records/record-list.tsx @@ -189,7 +189,7 @@ export default function UserRecordsList({ user, action }: RecordListProps) { setShowForm(!isShowForm); }} > - Add record + Add Record diff --git a/app/(protected)/dashboard/urls/url-list.tsx b/app/(protected)/dashboard/urls/url-list.tsx index c0802f7..80c5e03 100644 --- a/app/(protected)/dashboard/urls/url-list.tsx +++ b/app/(protected)/dashboard/urls/url-list.tsx @@ -179,7 +179,7 @@ export default function UserUrlsList({ user, action }: UrlListProps) { setShowForm(!isShowForm); }} > - Add url + Add URL diff --git a/app/api/admin/domain/route.ts b/app/api/admin/domain/route.ts new file mode 100644 index 0000000..4cb18b6 --- /dev/null +++ b/app/api/admin/domain/route.ts @@ -0,0 +1,147 @@ +import { NextRequest } from "next/server"; + +import { + createDomain, + deleteDomain, + getAllDomains, + invalidateDomainConfigCache, + updateDomain, +} from "@/lib/dto/domains"; +import { checkUserStatus } from "@/lib/dto/user"; +import { getCurrentUser } from "@/lib/session"; + +// Get domains list +export async function GET(req: NextRequest) { + try { + const user = checkUserStatus(await getCurrentUser()); + if (user instanceof Response) return user; + if (user.role !== "ADMIN") { + return Response.json("Unauthorized", { status: 401 }); + } + + // TODO: Add pagination + const domains = await getAllDomains(); + + return Response.json( + { list: domains, total: domains.length }, + { status: 200 }, + ); + } catch (error) { + console.error("[Error]", error); + return Response.json(error.message || "Server error", { status: 500 }); + } +} + +// Create domain +export async function POST(req: NextRequest) { + try { + const user = checkUserStatus(await getCurrentUser()); + if (user instanceof Response) return user; + if (user.role !== "ADMIN") { + return Response.json("Unauthorized", { status: 401 }); + } + + const { data } = await req.json(); + if (!data || !data.domain_name) { + return Response.json("domain_name is required", { status: 400 }); + } + + const newDomain = await createDomain({ + domain_name: data.domain_name, + enable_short_link: !!data.enable_short_link, + enable_email: !!data.enable_email, + enable_dns: !!data.enable_dns, + cf_zone_id: data.cf_zone_id, + cf_api_key: data.cf_api_key, + cf_email: data.cf_email, + cf_api_key_encrypted: false, + max_short_links: data.max_short_links, + max_email_forwards: data.max_email_forwards, + max_dns_records: data.max_dns_records, + active: true, + }); + + invalidateDomainConfigCache(); + + return Response.json(newDomain, { status: 200 }); + } catch (error) { + console.error("[Error]", error); + return Response.json(error.message || "Server error", { status: 500 }); + } +} + +// Update domain +export async function PUT(req: NextRequest) { + try { + const user = checkUserStatus(await getCurrentUser()); + if (user instanceof Response) return user; + if (user.role !== "ADMIN") { + return Response.json("Unauthorized", { status: 401 }); + } + + const { + domain_name, + enable_short_link, + enable_email, + enable_dns, + cf_zone_id, + cf_api_key, + cf_email, + max_short_links, + max_email_forwards, + max_dns_records, + active, + id, + } = await req.json(); + if (!id) { + return Response.json("domain id is required", { status: 400 }); + } + + const updatedDomain = await updateDomain(id, { + domain_name, + enable_short_link: !!enable_short_link, + enable_email: !!enable_email, + enable_dns: !!enable_dns, + active: !!active, + cf_zone_id, + cf_api_key, + cf_email, + cf_api_key_encrypted: false, + max_short_links, + max_email_forwards, + max_dns_records, + }); + + invalidateDomainConfigCache(); + + return Response.json(updatedDomain, { status: 200 }); + } catch (error) { + console.error("[Error]", error); + return Response.json(error.message || "Server error", { status: 500 }); + } +} + +// Delete domain +export async function DELETE(req: NextRequest) { + try { + const user = checkUserStatus(await getCurrentUser()); + if (user instanceof Response) return user; + if (user.role !== "ADMIN") { + return Response.json("Unauthorized", { status: 401 }); + } + + const { domain_name } = await req.json(); + if (!domain_name) { + return Response.json("domain_name is required", { status: 400 }); + } + + const deletedDomain = await deleteDomain(domain_name); + + invalidateDomainConfigCache(); + + return Response.json(deletedDomain, { status: 200 }); + } catch (error) { + console.error("[Error]", error); + return Response.json(error.message || "Server error", { status: 500 }); + } +} diff --git a/app/api/domain/route.ts b/app/api/domain/route.ts new file mode 100644 index 0000000..137ba1b --- /dev/null +++ b/app/api/domain/route.ts @@ -0,0 +1,31 @@ +import { NextRequest } from "next/server"; + +import { FeatureMap, getDomainsByFeature } from "@/lib/dto/domains"; +import { checkUserStatus } from "@/lib/dto/user"; +import { getCurrentUser } from "@/lib/session"; + +// Get domains by feature for frontend +export async function GET(req: NextRequest) { + try { + const user = checkUserStatus(await getCurrentUser()); + if (user instanceof Response) return user; + + const url = new URL(req.url); + const feature = url.searchParams.get("feature") || ""; + + if (!Object.keys(FeatureMap).includes(feature)) { + return Response.json( + "Invalid feature parameter. Use 'short', 'email', or 'record'.", + { + status: 400, + }, + ); + } + + const domainList = await getDomainsByFeature(FeatureMap[feature]); + return Response.json(domainList, { status: 200 }); + } catch (error) { + console.error("[Error]", error); + return Response.json(error.message || "Server error", { status: 500 }); + } +} diff --git a/app/api/record/add/route.ts b/app/api/record/add/route.ts index 89d6305..9346922 100644 --- a/app/api/record/add/route.ts +++ b/app/api/record/add/route.ts @@ -1,4 +1,3 @@ -import { env } from "@/env.mjs"; import { TeamPlanQuota } from "@/config/team"; import { createDNSRecord } from "@/lib/cloudflare"; import { @@ -6,31 +5,27 @@ import { getUserRecordByTypeNameContent, getUserRecordCount, } from "@/lib/dto/cloudflare-dns-record"; +import { getDomainsByFeature } from "@/lib/dto/domains"; import { checkUserStatus } from "@/lib/dto/user"; import { reservedDomains } from "@/lib/enums"; import { getCurrentUser } from "@/lib/session"; -import { generateSecret, parseZones } from "@/lib/utils"; +import { generateSecret } from "@/lib/utils"; export async function POST(req: Request) { try { const user = checkUserStatus(await getCurrentUser()); if (user instanceof Response) return user; - const { CLOUDFLARE_ZONE, CLOUDFLARE_API_KEY, CLOUDFLARE_EMAIL } = env; - const zones = parseZones(CLOUDFLARE_ZONE || "[]"); - - if (!zones.length || !CLOUDFLARE_API_KEY || !CLOUDFLARE_EMAIL) { - return Response.json("API key、zone iD and email are required", { + const zones = await getDomainsByFeature("enable_dns", true); + if (!zones.length) { + return Response.json("Please add at least one domain", { status: 400, - statusText: "API key、zone iD and email are required", + statusText: "Please add at least one domain", }); } const { total } = await getUserRecordCount(user.id); - if ( - user.role !== "ADMIN" && - total >= TeamPlanQuota[user.team].RC_NewRecords - ) { + if (total >= TeamPlanQuota[user.team].RC_NewRecords) { return Response.json("Your records have reached the free limit.", { status: 409, }); @@ -49,7 +44,7 @@ export async function POST(req: Request) { let matchedZone; for (const zone of zones) { - if (record.zone_name === zone.zone_name) { + if (record.zone_name === zone.domain_name) { matchedZone = zone; break; } @@ -85,22 +80,22 @@ export async function POST(req: Request) { } const data = await createDNSRecord( - matchedZone.zone_id, - CLOUDFLARE_API_KEY, - CLOUDFLARE_EMAIL, + matchedZone.cf_zone_id, + matchedZone.cf_api_key, + matchedZone.cf_email, record, ); if (!data.success || !data.result?.id) { - console.log("[data]", data); + // console.log("[data]", data); return Response.json(data.messages, { status: 501, }); } else { const res = await createUserRecord(user.id, { record_id: data.result.id, - zone_id: matchedZone.zone_id, - zone_name: matchedZone.zone_name, + zone_id: matchedZone.cf_zone_id, + zone_name: matchedZone.domain_name, name: data.result.name, type: data.result.type, content: data.result.content, diff --git a/app/api/record/admin/add/route.ts b/app/api/record/admin/add/route.ts index 49dbca6..6ca891c 100644 --- a/app/api/record/admin/add/route.ts +++ b/app/api/record/admin/add/route.ts @@ -1,4 +1,3 @@ -import { env } from "@/env.mjs"; import { TeamPlanQuota } from "@/config/team"; import { createDNSRecord } from "@/lib/cloudflare"; import { @@ -6,10 +5,11 @@ import { getUserRecordByTypeNameContent, getUserRecordCount, } from "@/lib/dto/cloudflare-dns-record"; +import { getDomainsByFeature } from "@/lib/dto/domains"; import { checkUserStatus, getUserByEmail } from "@/lib/dto/user"; import { reservedDomains } from "@/lib/enums"; import { getCurrentUser } from "@/lib/session"; -import { generateSecret, parseZones } from "@/lib/utils"; +import { generateSecret } from "@/lib/utils"; export async function POST(req: Request) { try { @@ -22,13 +22,11 @@ export async function POST(req: Request) { }); } - const { CLOUDFLARE_ZONE, CLOUDFLARE_API_KEY, CLOUDFLARE_EMAIL } = env; - const zones = parseZones(CLOUDFLARE_ZONE || "[]"); - - if (!zones.length || !CLOUDFLARE_API_KEY || !CLOUDFLARE_EMAIL) { - return Response.json("API key、zone iD and email are required", { + const zones = await getDomainsByFeature("enable_dns", true); + if (!zones.length) { + return Response.json("Please add at least one domain", { status: 400, - statusText: "API key、zone iD and email are required", + statusText: "Please add at least one domain", }); } @@ -60,7 +58,7 @@ export async function POST(req: Request) { let matchedZone; for (const zone of zones) { - if (record.zone_name === zone.zone_name) { + if (record.zone_name === zone.domain_name) { matchedZone = zone; break; } @@ -96,9 +94,9 @@ export async function POST(req: Request) { } const data = await createDNSRecord( - matchedZone.zone_id, - CLOUDFLARE_API_KEY, - CLOUDFLARE_EMAIL, + matchedZone.cf_zone_id, + matchedZone.cf_api_key, + matchedZone.cf_email, record, ); @@ -110,8 +108,8 @@ export async function POST(req: Request) { } else { const res = await createUserRecord(target_user.id, { record_id: data.result.id, - zone_id: matchedZone.zone_id, - zone_name: matchedZone.zone_name, + zone_id: matchedZone.cf_zone_id, + zone_name: matchedZone.domain_name, name: data.result.name, type: data.result.type, content: data.result.content, diff --git a/app/api/record/admin/delete/route.ts b/app/api/record/admin/delete/route.ts index 7e2ff9c..7445216 100644 --- a/app/api/record/admin/delete/route.ts +++ b/app/api/record/admin/delete/route.ts @@ -1,9 +1,8 @@ -import { env } from "@/env.mjs"; import { deleteDNSRecord } from "@/lib/cloudflare"; import { deleteUserRecord } from "@/lib/dto/cloudflare-dns-record"; +import { getDomainsByFeature } from "@/lib/dto/domains"; import { checkUserStatus } from "@/lib/dto/user"; import { getCurrentUser } from "@/lib/session"; -import { parseZones } from "@/lib/utils"; export async function POST(req: Request) { try { @@ -24,20 +23,15 @@ export async function POST(req: Request) { }); } - const { CLOUDFLARE_ZONE, CLOUDFLARE_API_KEY, CLOUDFLARE_EMAIL } = env; - const zones = parseZones(CLOUDFLARE_ZONE || "[]"); - - if (!zones.length || !CLOUDFLARE_API_KEY || !CLOUDFLARE_EMAIL) { - return Response.json( - "API key, zone configuration, and email are required", - { - status: 400, - statusText: "Missing required configuration", - }, - ); + const zones = await getDomainsByFeature("enable_dns", true); + if (!zones.length) { + return Response.json("Please add at least one domain", { + status: 400, + statusText: "Please add at least one domain", + }); } - const matchedZone = zones.find((zone) => zone.zone_id === zone_id); + const matchedZone = zones.find((zone) => zone.cf_zone_id === zone_id); if (!matchedZone) { return Response.json(`Invalid or unsupported zone_id: ${zone_id}`, { status: 400, @@ -48,9 +42,9 @@ export async function POST(req: Request) { // force delete await deleteUserRecord(userId, record_id, zone_id, active); await deleteDNSRecord( - matchedZone.zone_id, - CLOUDFLARE_API_KEY, - CLOUDFLARE_EMAIL, + matchedZone.cf_zone_id!, + matchedZone.cf_api_key!, + matchedZone.cf_email!, record_id, ); diff --git a/app/api/record/admin/route.ts b/app/api/record/admin/route.ts index cd6042e..082ddac 100644 --- a/app/api/record/admin/route.ts +++ b/app/api/record/admin/route.ts @@ -1,6 +1,5 @@ -import { env } from "@/env.mjs"; import { getUserRecords } from "@/lib/dto/cloudflare-dns-record"; -import { checkUserStatus, getUserByEmail } from "@/lib/dto/user"; +import { checkUserStatus } from "@/lib/dto/user"; import { getCurrentUser } from "@/lib/session"; export async function GET(req: Request) { diff --git a/app/api/record/admin/update/route.ts b/app/api/record/admin/update/route.ts index e8dc5c8..c07bfa0 100644 --- a/app/api/record/admin/update/route.ts +++ b/app/api/record/admin/update/route.ts @@ -1,9 +1,8 @@ -import { env } from "@/env.mjs"; import { updateDNSRecord } from "@/lib/cloudflare"; import { updateUserRecord } from "@/lib/dto/cloudflare-dns-record"; +import { getDomainsByFeature } from "@/lib/dto/domains"; import { checkUserStatus } from "@/lib/dto/user"; import { getCurrentUser } from "@/lib/session"; -import { parseZones } from "@/lib/utils"; export async function POST(req: Request) { try { @@ -16,16 +15,11 @@ export async function POST(req: Request) { }); } - const { CLOUDFLARE_ZONE, CLOUDFLARE_API_KEY, CLOUDFLARE_EMAIL } = env; - const zones = parseZones(CLOUDFLARE_ZONE || "[]"); - - if (!zones.length || !CLOUDFLARE_API_KEY || !CLOUDFLARE_EMAIL) { + const zones = await getDomainsByFeature("enable_dns", true); + if (!zones.length) { return Response.json( "API key, zone configuration, and email are required", - { - status: 400, - statusText: "Missing required configuration", - }, + { status: 401, statusText: "Missing required configuration" }, ); } @@ -44,7 +38,7 @@ export async function POST(req: Request) { let matchedZone; for (const zone of zones) { - if (record.zone_name === zone.zone_name) { + if (record.zone_name === zone.domain_name) { matchedZone = zone; break; } @@ -61,9 +55,9 @@ export async function POST(req: Request) { } const data = await updateDNSRecord( - matchedZone.zone_id, - CLOUDFLARE_API_KEY, - CLOUDFLARE_EMAIL, + matchedZone.cf_zone_id, + matchedZone.cf_api_key, + matchedZone.cf_email, recordId, { ...record, name: record_name }, ); @@ -80,8 +74,8 @@ export async function POST(req: Request) { const res = await updateUserRecord(userId, { record_id: data.result.id, - zone_id: matchedZone.zone_id, - zone_name: matchedZone.zone_name, + zone_id: matchedZone.cf_zone_id, + zone_name: matchedZone.domain_name, name: data.result.name, type: data.result.type, content: data.result.content, diff --git a/app/api/record/delete/route.ts b/app/api/record/delete/route.ts index 4d6d3de..e2bdebf 100644 --- a/app/api/record/delete/route.ts +++ b/app/api/record/delete/route.ts @@ -1,9 +1,9 @@ import { env } from "@/env.mjs"; import { deleteDNSRecord } from "@/lib/cloudflare"; import { deleteUserRecord } from "@/lib/dto/cloudflare-dns-record"; +import { getDomainsByFeature } from "@/lib/dto/domains"; import { checkUserStatus } from "@/lib/dto/user"; import { getCurrentUser } from "@/lib/session"; -import { parseZones } from "@/lib/utils"; export async function POST(req: Request) { try { @@ -12,20 +12,15 @@ export async function POST(req: Request) { const { record_id, zone_id, active } = await req.json(); - const { CLOUDFLARE_ZONE, CLOUDFLARE_API_KEY, CLOUDFLARE_EMAIL } = env; - const zones = parseZones(CLOUDFLARE_ZONE || "[]"); - - if (!zones.length || !CLOUDFLARE_API_KEY || !CLOUDFLARE_EMAIL) { - return Response.json( - "API key, zone configuration, and email are required", - { - status: 400, - statusText: "API key, zone configuration, and email are required", - }, - ); + const zones = await getDomainsByFeature("enable_dns", true); + if (!zones.length) { + return Response.json("Please add at least one domain", { + status: 400, + statusText: "Please add at least one domain", + }); } - const matchedZone = zones.find((zone) => zone.zone_id === zone_id); + const matchedZone = zones.find((zone) => zone.cf_zone_id === zone_id); if (!matchedZone) { return Response.json(`Invalid or unsupported zone_id: ${zone_id}`, { status: 400, @@ -34,9 +29,9 @@ export async function POST(req: Request) { } const res = await deleteDNSRecord( - matchedZone.zone_id, - CLOUDFLARE_API_KEY, - CLOUDFLARE_EMAIL, + matchedZone.cf_zone_id!, + matchedZone.cf_api_key!, + matchedZone.cf_email!, record_id, ); diff --git a/app/api/record/route.ts b/app/api/record/route.ts index b1de8bf..530a981 100644 --- a/app/api/record/route.ts +++ b/app/api/record/route.ts @@ -1,4 +1,3 @@ -import { env } from "@/env.mjs"; import { getUserRecords } from "@/lib/dto/cloudflare-dns-record"; import { checkUserStatus } from "@/lib/dto/user"; import { getCurrentUser } from "@/lib/session"; diff --git a/app/api/record/update/route.ts b/app/api/record/update/route.ts index 612a9dc..b04004d 100644 --- a/app/api/record/update/route.ts +++ b/app/api/record/update/route.ts @@ -1,13 +1,12 @@ -import { env } from "@/env.mjs"; import { updateDNSRecord } from "@/lib/cloudflare"; import { updateUserRecord, updateUserRecordState, } from "@/lib/dto/cloudflare-dns-record"; +import { getDomainsByFeature } from "@/lib/dto/domains"; import { checkUserStatus } from "@/lib/dto/user"; import { reservedDomains } from "@/lib/enums"; import { getCurrentUser } from "@/lib/session"; -import { parseZones } from "@/lib/utils"; // Update DNS record export async function POST(req: Request) { @@ -15,10 +14,8 @@ export async function POST(req: Request) { const user = checkUserStatus(await getCurrentUser()); if (user instanceof Response) return user; - const { CLOUDFLARE_ZONE, CLOUDFLARE_API_KEY, CLOUDFLARE_EMAIL } = env; - const zones = parseZones(CLOUDFLARE_ZONE || "[]"); - - if (!zones.length || !CLOUDFLARE_API_KEY || !CLOUDFLARE_EMAIL) { + const zones = await getDomainsByFeature("enable_dns", true); + if (!zones.length) { return Response.json( "API key, zone configuration, and email are required", { status: 401, statusText: "Missing required configuration" }, @@ -40,7 +37,7 @@ export async function POST(req: Request) { let matchedZone; for (const zone of zones) { - if (record.zone_name === zone.zone_name) { + if (record.zone_name === zone.domain_name) { matchedZone = zone; break; } @@ -64,14 +61,13 @@ export async function POST(req: Request) { } const data = await updateDNSRecord( - matchedZone.zone_id, - CLOUDFLARE_API_KEY, - CLOUDFLARE_EMAIL, + matchedZone.cf_zone_id, + matchedZone.cf_api_key, + matchedZone.cf_email, recordId, { ...record, name: record_name }, ); - console.log("[updateDNSRecord]", data); if (!data.success || !data.result?.id) { return Response.json( data.errors?.[0]?.message || "Failed to update DNS record", @@ -81,8 +77,8 @@ export async function POST(req: Request) { const res = await updateUserRecord(user.id, { record_id: data.result.id, - zone_id: matchedZone.zone_id, // Use matched zone_id - zone_name: matchedZone.zone_name, // Use matched zone_name + zone_id: matchedZone.cf_zone_id, + zone_name: matchedZone.domain_name, name: data.result.name, type: data.result.type, content: data.result.content, @@ -118,10 +114,8 @@ export async function PUT(req: Request) { const user = checkUserStatus(await getCurrentUser()); if (user instanceof Response) return user; - const { CLOUDFLARE_ZONE, CLOUDFLARE_API_KEY, CLOUDFLARE_EMAIL } = env; - const zones = parseZones(CLOUDFLARE_ZONE || "[]"); - - if (!zones.length || !CLOUDFLARE_API_KEY || !CLOUDFLARE_EMAIL) { + const zones = await getDomainsByFeature("enable_dns", true); + if (!zones.length) { return Response.json( "API key, zone configuration, and email are required", { status: 401, statusText: "Missing required configuration" }, @@ -136,7 +130,7 @@ export async function PUT(req: Request) { }); } - const matchedZone = zones.find((zone) => zone.zone_id === zone_id); + const matchedZone = zones.find((zone) => zone.cf_zone_id === zone_id); if (!matchedZone) { return Response.json(`Invalid or unsupported zone_id: ${zone_id}`, { status: 400, @@ -153,9 +147,9 @@ export async function PUT(req: Request) { isTargetAccessible = target_res.status === 200; } catch (fetchError) { isTargetAccessible = false; - console.log( - `[Fetch Error] Failed to access target ${target}: ${fetchError}`, - ); + // console.log( + // `[Fetch Error] Failed to access target ${target}: ${fetchError}`, + // ); } const res = await updateUserRecordState( diff --git a/app/api/url/add/route.ts b/app/api/url/add/route.ts index 0a85f5e..643941f 100644 --- a/app/api/url/add/route.ts +++ b/app/api/url/add/route.ts @@ -1,4 +1,5 @@ import { TeamPlanQuota } from "@/config/team"; +import { getDomainsByFeature } from "@/lib/dto/domains"; import { createUserShortUrl } from "@/lib/dto/short-urls"; import { checkUserStatus } from "@/lib/dto/user"; import { getCurrentUser } from "@/lib/session"; @@ -23,6 +24,18 @@ export async function POST(req: Request) { const { target, url, prefix, visible, active, expiration, password } = createUrlSchema.parse(data); + + const zones = await getDomainsByFeature("enable_short_link"); + if ( + !zones.length || + !zones.map((zone) => zone.domain_name).includes(prefix) + ) { + return Response.json("Invalid domain", { + status: 400, + statusText: "Invalid domain", + }); + } + const res = await createUserShortUrl({ userId: user.id, userName: user.name || "Anonymous", diff --git a/app/api/url/route.ts b/app/api/url/route.ts index c5a57e6..a392071 100644 --- a/app/api/url/route.ts +++ b/app/api/url/route.ts @@ -1,4 +1,3 @@ -import { env } from "@/env.mjs"; import { getUserShortUrls } from "@/lib/dto/short-urls"; import { checkUserStatus } from "@/lib/dto/user"; import { getCurrentUser } from "@/lib/session"; diff --git a/app/api/v1/email/route.ts b/app/api/v1/email/route.ts index de7b7f5..e65fb1a 100644 --- a/app/api/v1/email/route.ts +++ b/app/api/v1/email/route.ts @@ -3,6 +3,7 @@ import { NextRequest, NextResponse } from "next/server"; import { siteConfig } from "@/config/site"; import { TeamPlanQuota } from "@/config/team"; import { checkApiKey } from "@/lib/dto/api-key"; +import { getDomainsByFeature } from "@/lib/dto/domains"; import { createUserEmail, deleteUserEmailByAddress } from "@/lib/dto/email"; import { reservedAddressSuffix } from "@/lib/enums"; import { restrictByTimeRange } from "@/lib/team"; @@ -53,7 +54,12 @@ export async function POST(req: NextRequest) { status: 400, }); } - if (!siteConfig.emailDomains.includes(suffix)) { + + const zones = await getDomainsByFeature("enable_email", true); + if ( + !zones.length || + !zones.map((zone) => zone.domain_name).includes(suffix) + ) { return NextResponse.json("Invalid email suffix address", { status: 400 }); } diff --git a/app/api/v1/short/route.ts b/app/api/v1/short/route.ts index 16aa43b..d42cb2d 100644 --- a/app/api/v1/short/route.ts +++ b/app/api/v1/short/route.ts @@ -1,5 +1,6 @@ import { TeamPlanQuota } from "@/config/team"; import { checkApiKey } from "@/lib/dto/api-key"; +import { getDomainsByFeature } from "@/lib/dto/domains"; import { createUserShortUrl } from "@/lib/dto/short-urls"; import { restrictByTimeRange } from "@/lib/team"; import { createUrlSchema } from "@/lib/validations/url"; @@ -41,6 +42,17 @@ export async function POST(req: Request) { }); } + const zones = await getDomainsByFeature("enable_short_link"); + if ( + !zones.length || + !zones.map((zone) => zone.domain_name).includes(prefix) + ) { + return Response.json("Invalid domain", { + status: 409, + statusText: "Invalid domain", + }); + } + const res = await createUserShortUrl({ userId: user.id, userName: user.name || "Anonymous", diff --git a/app/manifest.json b/app/manifest.json index 27ece42..66a72fc 100644 --- a/app/manifest.json +++ b/app/manifest.json @@ -3,7 +3,7 @@ "short_name": "WR.DO", "description": "Shorten links with analytics, manage emails and control subdomains—all on one platform.", "appid": "com.wr.do", - "versionName": "0.5.1", + "versionName": "0.6.0", "versionCode": "1", "start_url": "/", "orientation": "portrait", diff --git a/components/dashboard/form-section-columns.tsx b/components/dashboard/form-section-columns.tsx index e7d6cce..5a7132a 100644 --- a/components/dashboard/form-section-columns.tsx +++ b/components/dashboard/form-section-columns.tsx @@ -1,5 +1,7 @@ import React from "react"; +import { cn } from "@/lib/utils"; + interface SectionColumnsType { title: string; children: React.ReactNode; @@ -14,7 +16,12 @@ export function FormSectionColumns({ className, }: SectionColumnsType) { return ( -
+

{title}

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

Required. Select a domain.

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

- Your Final URL: -

-

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

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

- Public or private short url. -

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

- Enable or disable short url. -

-
*/}
{/* Action buttons */} diff --git a/components/shared/icons.tsx b/components/shared/icons.tsx index f905217..b53698e 100644 --- a/components/shared/icons.tsx +++ b/components/shared/icons.tsx @@ -301,4 +301,33 @@ export const Icons = { ), + cloudflare: ({ ...props }: LucideProps) => ( + + + + + + + + + + ), }; diff --git a/config/dashboard.ts b/config/dashboard.ts index 1f9c73e..e1a1294 100644 --- a/config/dashboard.ts +++ b/config/dashboard.ts @@ -11,7 +11,7 @@ export const sidebarLinks: SidebarNavItem[] = [ { href: "/dashboard", icon: "dashboard", title: "Dashboard" }, { href: "/dashboard/urls", icon: "link", title: "Short Urls" }, { href: "/emails", icon: "mail", title: "Emails" }, - { href: "/dashboard/records", icon: "globeLock", title: "DNS Records" }, + { href: "/dashboard/records", icon: "globe", title: "DNS Records" }, { href: "/chat", icon: "messages", title: "WRoom" }, ], }, @@ -54,6 +54,12 @@ export const sidebarLinks: SidebarNavItem[] = [ title: "Admin Panel", authorizeOnly: UserRole.ADMIN, }, + { + href: "/admin/domains", + icon: "globeLock", + title: "Domains", + authorizeOnly: UserRole.ADMIN, + }, { href: "/admin/users", icon: "users", diff --git a/config/site.ts b/config/site.ts index 7d7d5e3..4764c75 100644 --- a/config/site.ts +++ b/config/site.ts @@ -3,10 +3,7 @@ import { env } from "@/env.mjs"; const site_url = env.NEXT_PUBLIC_APP_URL; const open_signup = env.NEXT_PUBLIC_OPEN_SIGNUP; -const short_domains = env.NEXT_PUBLIC_SHORT_DOMAINS || ""; -const email_domains = env.NEXT_PUBLIC_EMAIL_DOMAINS || ""; const email_r2_domain = env.NEXT_PUBLIC_EMAIL_R2_DOMAIN || ""; -const record_domains = env.NEXT_PUBLIC_CLOUDFLARE_ZONE_NAME || ""; export const siteConfig: SiteConfig = { name: "WR.DO", @@ -23,9 +20,6 @@ export const siteConfig: SiteConfig = { }, mailSupport: "support@wr.do", openSignup: open_signup === "1" ? true : false, - shortDomains: short_domains.split(","), - emailDomains: email_domains.split(","), - recordDomains: record_domains.split(","), emailR2Domain: email_r2_domain, }; diff --git a/content/docs/developer/cloudflare.mdx b/content/docs/developer/cloudflare.mdx index d947c6a..dbbc9f2 100644 --- a/content/docs/developer/cloudflare.mdx +++ b/content/docs/developer/cloudflare.mdx @@ -5,6 +5,49 @@ description: How to config the cloudflare api. Before you start, you must have a Cloudflare account and be hosted on Cloudflare. +## Overview + +Administrators can manage domain configurations at `/admin/domains`, including adding, deleting, and modifying domains. + +![](/_static/docs/domain-form.png) + +### Domain Configuration Form + +The `Short URL Service` and `Email Service` require no additional configuration and can be activated to enable short URL and email functionalities (email requires worker forwarding setup). + +To enable the `DNS Record Service`, you must complete the `Cloudflare Configs(Optional)` form with the following fields: + +- Zone ID +- API Token +- Email + +These fields are used to configure the Cloudflare API. If your domain is hosted through Cloudflare, you can find these details in the Cloudflare dashboard. + +### Zone ID + +The unique identifier for a domain hosted on Cloudflare, located at: + +https://dash.cloudflare.com/[account_id]/[zone_name] + +### API Token + +Visit https://dash.cloudflare.com/profile/api-tokens, and find the Global API Key under the API Tokens section. + +### Email + +Email for registering a Cloudflare account + + +You can manage domains hosted under different Cloudflare accounts, +provided the API Token and Email are sourced from the same account. + + +--- + +# This section is Deprecated since version v0.6.0 + +Before you start, you must have a Cloudflare account and be hosted on Cloudflare. + In this section, you can update these variables: ```js title=".env" diff --git a/content/docs/developer/installation.mdx b/content/docs/developer/installation.mdx index f874900..b47b6a9 100644 --- a/content/docs/developer/installation.mdx +++ b/content/docs/developer/installation.mdx @@ -48,21 +48,12 @@ Copy/paste the `.env.example` in the `.env` file: | GITHUB_ID | `123465` | The ID of the GitHub OAuth client. | | GITHUB_SECRET | `123465` | The secret of the GitHub OAuth client. | | RESEND_API_KEY | `123465` | The API key for Resend. | -| CLOUDFLARE_ZONE | `[{"zone_id":"abc465","zone_name":"example.com"}]` | The zone info for Cloudflare. | -| NEXT_PUBLIC_CLOUDFLARE_ZONE_NAME | `example.com,example2.com` | The zone name for Cloudflare. | -| CLOUDFLARE_API_KEY | `123465` | The API key for Cloudflare. | -| CLOUDFLARE_EMAIL | `123465` | The email for Cloudflare. | | NEXT_PUBLIC_OPEN_SIGNUP | `1` | Open signup. | | SCREENSHOTONE_BASE_URL | `https://api.example.com` | pending | | GITHUB_TOKEN | `ghp_sscsfarwetqet` | https://github.com/settings/tokens | -| NEXT_PUBLIC_SHORT_DOMAINS | `wr.do,uv.do` | The list of short domains. Separated by `,` | -| NEXT_PUBLIC_EMAIL_DOMAINS | `wr.do,uv.do` | The list of email domains. Separated by `,` | - -> `NEXT_PUBLIC_SHORT_DOMAINS`、`NEXT_PUBLIC_EMAIL_DOMAINS` is used to limit the short domain name and email domain name. - How to get `GOOGLE_CLIENT_ID`、`GITHUB_ID`, see [Authentification](/docs/developer/authentification). - How to get `RESEND_API_KEY`, see [Email](/docs/developer/email). -- How to get `CLOUDFLARE_ZONE`、`CLOUDFLARE_API_KEY`、`CLOUDFLARE_EMAIL`、`NEXT_PUBLIC_CLOUDFLARE_ZONE_NAME`, see [Cloudflare Configs](/docs/developer/cloudflare). - How to get `DATABASE_URL`, see [Database](/docs/developer/database). - How to active email worker, see [Email Worker](/docs/developer/cloudflare-email-worker). diff --git a/content/docs/developer/quick-start.mdx b/content/docs/developer/quick-start.mdx index 715b395..2f4e91e 100644 --- a/content/docs/developer/quick-start.mdx +++ b/content/docs/developer/quick-start.mdx @@ -136,40 +136,7 @@ RESEND_API_KEY = re_your_resend_api_key; -## 3. Cloudflare Configs - -Before you start, you must have a Cloudflare account and be hosted on Cloudflare. - -### Add the CLOUDFLARE_ZONE Environment Variable - -A JSON array of objects, each containing a zone_id and zone_name for your Cloudflare zones. The zone_id is the unique identifier for a domain, and the zone_name is the domain name (e.g., example.com). - -> Follow [this way](https://dash.cloudflare.com/Your_Acount_Id/wr.do), and scroll down to `Zone ID`. - -### Add the CLOUDFLARE_API_KEY Environment Variable - - This is the API key that you use to authenticate requests to the Cloudflare API. You can generate or find your API key in the Cloudflare dashboard under the `profile` -> `api-tokens` section. - - > Follow [https://dash.cloudflare.com/profile/api-tokens](https://dash.cloudflare.com/profile/api-tokens), and scroll down to `API Token`, the `Global API Key` should be used. - -### Add the CLOUDFLARE_EMAIL Environment Variable - -This is the email address associated with your Cloudflare account. It is used for authentication alongside the API key. - -### Add the NEXT_PUBLIC_CLOUDFLARE_ZONE_NAME Environment Variable - -A comma-separated list of domain names (e.g., `example.com,example2.com`) used for frontend display. These must correspond to the zone_name values in CLOUDFLARE_ZONE. - -In this section, you can update these variables: - -```js title=".env" -CLOUDFLARE_ZONE=[{"zone_id":"abc465","zone_name":"example.com"},{"zone_id":"abc465","zone_name":"example2.com"}] -NEXT_PUBLIC_CLOUDFLARE_ZONE_NAME=example.com,example2.com -CLOUDFLARE_API_KEY=1234567890abcdef1234567890abcdef -CLOUDFLARE_EMAIL=user@example.com -``` - -## 4. Email Worker Configs +## 3. Email Worker Configs See detail in [Email Worker](/docs/developer/cloudflare-email-worker). @@ -187,20 +154,14 @@ Via: NEXT_PUBLIC_EMAIL_R2_DOMAIN=https://email-attachment.wr.do ``` -## 5. Add the Bussiness Configs +## 4. Add the Bussiness Configs ```js title=".env" # Allow anyone to sign up NEXT_PUBLIC_OPEN_SIGNUP=1 - -# Short domains. Separated by `,` -NEXT_PUBLIC_SHORT_DOMAINS=wr.do,uv.do - -# Email domains. Separated by `,` -NEXT_PUBLIC_EMAIL_DOMAINS=wr.do,uv.do ``` -## 6. Add the SCREENSHOTONE_BASE_URL Environment Variable +## 5. Add the SCREENSHOTONE_BASE_URL Environment Variable It's the base URL for the screenshotone API. @@ -211,20 +172,36 @@ Deploy docs via [here](https://jasonraimondi.github.io/url-to-png/) SCREENSHOTONE_BASE_URL=https://api.screenshotone.com ``` -## 7. Add the GITHUB_TOKEN Environment Variable +## 6. Add the GITHUB_TOKEN Environment Variable Via https://github.com/settings/tokens to get your token. ```js title=".env" GITHUB_TOKEN= ``` -## 8. Start the Dev Server + +## 7. Start the Dev Server ```bash pnpm dev ``` Via [http://localhost:3000](http://localhost:3000) +## 8. Setup System + +#### Create the first account and Change the account's role to ADMIN + +Follow the steps below: + +- 1. Via [http://localhost:3000/login](http://localhost:3000/login), login with your account. +- 2. Via [http://localhost:3000/setup](http://localhost:3000/setup), change the account's role to ADMIN. +- 3. Then follow the **panel guide** to config the system and add the first domain. + + + After change change the account's role to ADMIN, and then you can refresh the website and access http://localhost:3000/admin. + + You must add at least one domain to start using short links, email or subdomain management functions. + ## Q & A diff --git a/env.mjs b/env.mjs index 605b671..6b5023a 100644 --- a/env.mjs +++ b/env.mjs @@ -15,19 +15,13 @@ export const env = createEnv({ LinuxDo_CLIENT_SECRET: z.string().optional(), DATABASE_URL: z.string().min(1), RESEND_API_KEY: z.string().optional(), - CLOUDFLARE_ZONE: z.string().min(1), - CLOUDFLARE_API_KEY: z.string().min(1), - CLOUDFLARE_EMAIL: z.string().min(1), SCREENSHOTONE_BASE_URL: z.string().optional(), GITHUB_TOKEN: z.string().optional(), }, client: { NEXT_PUBLIC_APP_URL: z.string().min(1), NEXT_PUBLIC_OPEN_SIGNUP: z.string().min(1).default("1"), - NEXT_PUBLIC_SHORT_DOMAINS: z.string().min(1).default(""), - NEXT_PUBLIC_EMAIL_DOMAINS: z.string().min(1).default(""), NEXT_PUBLIC_EMAIL_R2_DOMAIN: z.string().min(1), - NEXT_PUBLIC_CLOUDFLARE_ZONE_NAME: z.string().min(1), }, runtimeEnv: { NEXTAUTH_URL: process.env.NEXTAUTH_URL, @@ -40,14 +34,7 @@ export const env = createEnv({ RESEND_API_KEY: process.env.RESEND_API_KEY, NEXT_PUBLIC_APP_URL: process.env.NEXT_PUBLIC_APP_URL, NEXT_PUBLIC_OPEN_SIGNUP: process.env.NEXT_PUBLIC_OPEN_SIGNUP, - NEXT_PUBLIC_SHORT_DOMAINS: process.env.NEXT_PUBLIC_SHORT_DOMAINS, - NEXT_PUBLIC_EMAIL_DOMAINS: process.env.NEXT_PUBLIC_EMAIL_DOMAINS, NEXT_PUBLIC_EMAIL_R2_DOMAIN: process.env.NEXT_PUBLIC_EMAIL_R2_DOMAIN, - NEXT_PUBLIC_CLOUDFLARE_ZONE_NAME: - process.env.NEXT_PUBLIC_CLOUDFLARE_ZONE_NAME, - CLOUDFLARE_ZONE: process.env.CLOUDFLARE_ZONE, - CLOUDFLARE_API_KEY: process.env.CLOUDFLARE_API_KEY, - CLOUDFLARE_EMAIL: process.env.CLOUDFLARE_EMAIL, SCREENSHOTONE_BASE_URL: process.env.SCREENSHOTONE_BASE_URL, GITHUB_TOKEN: process.env.GITHUB_TOKEN, LinuxDo_CLIENT_ID: process.env.LinuxDo_CLIENT_ID, diff --git a/lib/domainConfig.ts b/lib/domainConfig.ts new file mode 100644 index 0000000..b1fe152 --- /dev/null +++ b/lib/domainConfig.ts @@ -0,0 +1,36 @@ +import { getAllDomains, invalidateDomainConfigCache } from "@/lib/dto/domains"; + +export async function getDomainConfig() { + return await getAllDomains(); +} + +export async function getCloudflareCredentials(domain_name: string) { + try { + const domains = await getAllDomains(); + const domain = domains.find((d) => d.domain_name === domain_name); + if (!domain || !domain.cf_api_key || !domain.cf_email) { + throw new Error( + `No Cloudflare credentials found for domain: ${domain_name}`, + ); + } + + let apiKey = domain.cf_api_key; + if (domain.cf_api_key_encrypted) { + // TODO + apiKey = decrypt(apiKey); + } + + return { + api_key: apiKey, + email: domain.cf_email, + }; + } catch (error) { + throw new Error(`Failed to fetch credentials: ${error.message}`); + } +} + +function decrypt(encryptedKey: string) { + return encryptedKey; // Replace with actual decryption logic +} + +export { invalidateDomainConfigCache }; diff --git a/lib/dto/domains.ts b/lib/dto/domains.ts new file mode 100644 index 0000000..183b51b --- /dev/null +++ b/lib/dto/domains.ts @@ -0,0 +1,122 @@ +import { Domain } from "@prisma/client"; + +import { prisma } from "../db"; + +// In-memory cache +let domainConfigCache: Domain[] | null = null; +let lastCacheUpdate = 0; +const CACHE_DURATION = 60 * 1000; // Cache for 1 minute in memory + +export const FeatureMap = { + short: "enable_short_link", + email: "enable_email", + record: "enable_dns", +}; + +export interface DomainConfig { + domain_name: string; + enable_short_link: boolean; + enable_email: boolean; + enable_dns: boolean; + cf_zone_id: string | null; + cf_api_key: string | null; + cf_email: string | null; + cf_api_key_encrypted: boolean; + max_short_links: number | null; + max_email_forwards: number | null; + max_dns_records: number | null; + active: boolean; +} + +export interface DomainFormData extends DomainConfig { + id?: string; + createdAt: Date; + updatedAt: Date; +} + +export async function getAllDomains() { + try { + const now = Date.now(); + if (domainConfigCache && now - lastCacheUpdate < CACHE_DURATION) { + return domainConfigCache; + } + + const domains = await prisma.domain.findMany({ + // where: { active: true }, + }); + + domainConfigCache = domains; + lastCacheUpdate = now; + return domains; + } catch (error) { + throw new Error(`Failed to fetch domain config: ${error.message}`); + } +} + +export async function getDomainsByFeature( + feature: string, + admin: boolean = false, +) { + try { + const now = Date.now(); + if (domainConfigCache && now - lastCacheUpdate < CACHE_DURATION) { + return domainConfigCache; + } + + const domains = await prisma.domain.findMany({ + where: { [feature]: true }, + select: { + domain_name: true, + enable_short_link: admin, + enable_email: admin, + enable_dns: admin, + cf_zone_id: admin, + cf_api_key: admin, + cf_email: admin, + }, + }); + return domains; + } catch (error) { + throw new Error(`Failed to fetch domain config: ${error.message}`); + } +} + +export async function createDomain(data: DomainConfig) { + try { + const createdDomain = await prisma.domain.create({ data }); + return createdDomain; + } catch (error) { + throw new Error(`Failed to create domain: ${error.message}`); + } +} + +export async function updateDomain(id: string, data) { + try { + const updatedDomain = await prisma.domain.update({ + where: { id }, + data: { + ...data, + updatedAt: new Date(), + }, + }); + return updatedDomain; + } catch (error) { + throw new Error(`Failed to update domain: ${error.message}`); + } +} + +export async function deleteDomain(domain_name: string) { + try { + const deletedDomain = await prisma.domain.delete({ + where: { domain_name }, + }); + return deletedDomain; + } catch (error) { + throw new Error(`Failed to delete domain`); + } +} + +export function invalidateDomainConfigCache() { + domainConfigCache = null; + lastCacheUpdate = 0; +} diff --git a/lib/utils.ts b/lib/utils.ts index 752eb01..9b2c1ab 100644 --- a/lib/utils.ts +++ b/lib/utils.ts @@ -388,25 +388,3 @@ export function extractHost(url: string): string { const match = url.match(regex); return match ? match[1] : ""; } - -// 解析 CLOUDFLARE_ZONE 环境变量并返回结构化的域名配置 -export function parseZones(raw: string) { - let zones; - - try { - zones = JSON.parse(raw); - } catch (error) { - return []; - } - - if (!Array.isArray(zones)) { - return []; - } - - const parsedZones = zones.map((zone) => { - const { zone_id, zone_name } = zone; - return { zone_id, zone_name }; - }); - - return parsedZones; -} diff --git a/lib/validations/domain.ts b/lib/validations/domain.ts new file mode 100644 index 0000000..5af3b04 --- /dev/null +++ b/lib/validations/domain.ts @@ -0,0 +1,17 @@ +import * as z from "zod"; + +export const createDomainSchema = z.object({ + id: z.string().optional(), + domain_name: z.string().min(2), + enable_short_link: z.boolean(), + enable_email: z.boolean(), + enable_dns: z.boolean(), + cf_zone_id: z.string().optional(), + cf_api_key: z.string().optional(), + cf_email: z.string().optional(), + cf_api_key_encrypted: z.boolean().default(false), + max_short_links: z.number().optional(), + max_email_forwards: z.number().optional(), + max_dns_records: z.number().optional(), + active: z.boolean().default(true), +}); diff --git a/package.json b/package.json index 65bfb75..698f52c 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "wr.do", - "version": "0.5.1", + "version": "0.6.0", "author": { "name": "oiov", "url": "https://github.com/oiov" diff --git a/prisma/migrations/20250520104322/migration.sql b/prisma/migrations/20250520104322/migration.sql new file mode 100644 index 0000000..b5fc73c --- /dev/null +++ b/prisma/migrations/20250520104322/migration.sql @@ -0,0 +1,18 @@ +CREATE TABLE domains +( + "id" UUID PRIMARY KEY DEFAULT gen_random_uuid(), + "domain_name" TEXT NOT NULL UNIQUE, + "enable_short_link" BOOLEAN DEFAULT FALSE, + "enable_email" BOOLEAN DEFAULT FALSE, + "enable_dns" BOOLEAN DEFAULT FALSE, + "cf_zone_id" TEXT NOT NULL, + "cf_api_key" TEXT NOT NULL, + "cf_email" TEXT NOT NULL, + "cf_api_key_encrypted" BOOLEAN DEFAULT FALSE, + "max_short_links" INTEGER, + "max_email_forwards" INTEGER, + "max_dns_records" INTEGER, + "active" BOOLEAN DEFAULT TRUE, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP +); \ No newline at end of file diff --git a/prisma/schema.prisma b/prisma/schema.prisma index 4c4a4c3..eb5c069 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -247,3 +247,24 @@ model UserSendEmail { @@index([createdAt]) @@map("user_send_emails") } + +model Domain { + id String @id @default(uuid()) + domain_name String @unique + enable_short_link Boolean @default(false) + enable_email Boolean @default(false) + enable_dns Boolean @default(false) + cf_zone_id String? + cf_api_key String? + cf_email String? + cf_api_key_encrypted Boolean + max_short_links Int? + max_email_forwards Int? + max_dns_records Int? + active Boolean @default(true) + + createdAt DateTime @default(now()) + updatedAt DateTime @default(now()) + + @@map("domains") +} diff --git a/public/_static/docs/domain-form.png b/public/_static/docs/domain-form.png new file mode 100644 index 0000000000000000000000000000000000000000..9b8b21de6dbbb29a66758b70472c5e50185d5187 GIT binary patch literal 340596 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 -https://wr.do/robots.txt2025-05-19T13:47:40.142Zdaily0.7 -https://wr.do/pricing2025-05-19T13:47:40.142Zdaily0.7 -https://wr.do/privacy2025-05-19T13:47:40.142Zdaily0.7 -https://wr.do/terms2025-05-19T13:47:40.142Zdaily0.7 -https://wr.do/docs2025-05-19T13:47:40.142Zdaily0.7 -https://wr.do/docs/developer/authentification2025-05-19T13:47:40.142Zdaily0.7 -https://wr.do/docs/developer/cloudflare2025-05-19T13:47:40.142Zdaily0.7 -https://wr.do/docs/developer/cloudflare-email-worker2025-05-19T13:47:40.142Zdaily0.7 -https://wr.do/docs/developer/components2025-05-19T13:47:40.142Zdaily0.7 -https://wr.do/docs/developer/config-files2025-05-19T13:47:40.142Zdaily0.7 -https://wr.do/docs/developer/database2025-05-19T13:47:40.142Zdaily0.7 -https://wr.do/docs/developer/email2025-05-19T13:47:40.142Zdaily0.7 -https://wr.do/docs/developer/installation2025-05-19T13:47:40.142Zdaily0.7 -https://wr.do/docs/developer/markdown-files2025-05-19T13:47:40.142Zdaily0.7 -https://wr.do/docs/developer/quick-start2025-05-19T13:47:40.142Zdaily0.7 -https://wr.do/docs/dns-records2025-05-19T13:47:40.142Zdaily0.7 -https://wr.do/docs/emails2025-05-19T13:47:40.142Zdaily0.7 -https://wr.do/docs/examples/cloudflare2025-05-19T13:47:40.142Zdaily0.7 -https://wr.do/docs/examples/other2025-05-19T13:47:40.142Zdaily0.7 -https://wr.do/docs/examples/vercel2025-05-19T13:47:40.142Zdaily0.7 -https://wr.do/docs/examples/zeabur2025-05-19T13:47:40.142Zdaily0.7 -https://wr.do/docs/open-api2025-05-19T13:47:40.142Zdaily0.7 -https://wr.do/docs/open-api/icon2025-05-19T13:47:40.142Zdaily0.7 -https://wr.do/docs/open-api/markdown2025-05-19T13:47:40.142Zdaily0.7 -https://wr.do/docs/open-api/meta-info2025-05-19T13:47:40.142Zdaily0.7 -https://wr.do/docs/open-api/qrcode2025-05-19T13:47:40.142Zdaily0.7 -https://wr.do/docs/open-api/screenshot2025-05-19T13:47:40.142Zdaily0.7 -https://wr.do/docs/open-api/text2025-05-19T13:47:40.142Zdaily0.7 -https://wr.do/docs/plan2025-05-19T13:47:40.142Zdaily0.7 -https://wr.do/docs/quick-start2025-05-19T13:47:40.142Zdaily0.7 -https://wr.do/docs/short-urls2025-05-19T13:47:40.142Zdaily0.7 -https://wr.do/docs/wroom2025-05-19T13:47:40.142Zdaily0.7 -https://wr.do/password-prompt2025-05-19T13:47:40.142Zdaily0.7 -https://wr.do/chat2025-05-19T13:47:40.142Zdaily0.7 -https://wr.do/manifest.json2025-05-19T13:47:40.142Zdaily0.7 -https://wr.do/opengraph-image.jpg2025-05-19T13:47:40.142Zdaily0.7 +https://wr.do/robots.txt2025-05-20T14:43:25.018Zdaily0.7 +https://wr.do/chat2025-05-20T14:43:25.018Zdaily0.7 +https://wr.do/docs2025-05-20T14:43:25.018Zdaily0.7 +https://wr.do/docs/developer/authentification2025-05-20T14:43:25.018Zdaily0.7 +https://wr.do/docs/developer/cloudflare2025-05-20T14:43:25.018Zdaily0.7 +https://wr.do/docs/developer/cloudflare-email-worker2025-05-20T14:43:25.018Zdaily0.7 +https://wr.do/docs/developer/components2025-05-20T14:43:25.018Zdaily0.7 +https://wr.do/docs/developer/config-files2025-05-20T14:43:25.018Zdaily0.7 +https://wr.do/docs/developer/database2025-05-20T14:43:25.018Zdaily0.7 +https://wr.do/docs/developer/email2025-05-20T14:43:25.018Zdaily0.7 +https://wr.do/docs/developer/installation2025-05-20T14:43:25.018Zdaily0.7 +https://wr.do/docs/developer/markdown-files2025-05-20T14:43:25.018Zdaily0.7 +https://wr.do/docs/developer/quick-start2025-05-20T14:43:25.018Zdaily0.7 +https://wr.do/docs/dns-records2025-05-20T14:43:25.018Zdaily0.7 +https://wr.do/docs/emails2025-05-20T14:43:25.018Zdaily0.7 +https://wr.do/docs/examples/cloudflare2025-05-20T14:43:25.018Zdaily0.7 +https://wr.do/docs/examples/other2025-05-20T14:43:25.018Zdaily0.7 +https://wr.do/docs/examples/vercel2025-05-20T14:43:25.018Zdaily0.7 +https://wr.do/docs/examples/zeabur2025-05-20T14:43:25.018Zdaily0.7 +https://wr.do/docs/open-api2025-05-20T14:43:25.018Zdaily0.7 +https://wr.do/docs/open-api/icon2025-05-20T14:43:25.018Zdaily0.7 +https://wr.do/docs/open-api/markdown2025-05-20T14:43:25.018Zdaily0.7 +https://wr.do/docs/open-api/meta-info2025-05-20T14:43:25.018Zdaily0.7 +https://wr.do/docs/open-api/qrcode2025-05-20T14:43:25.018Zdaily0.7 +https://wr.do/docs/open-api/screenshot2025-05-20T14:43:25.018Zdaily0.7 +https://wr.do/docs/open-api/text2025-05-20T14:43:25.018Zdaily0.7 +https://wr.do/docs/plan2025-05-20T14:43:25.018Zdaily0.7 +https://wr.do/docs/quick-start2025-05-20T14:43:25.018Zdaily0.7 +https://wr.do/docs/short-urls2025-05-20T14:43:25.018Zdaily0.7 +https://wr.do/docs/wroom2025-05-20T14:43:25.018Zdaily0.7 +https://wr.do/password-prompt2025-05-20T14:43:25.018Zdaily0.7 +https://wr.do/pricing2025-05-20T14:43:25.018Zdaily0.7 +https://wr.do/privacy2025-05-20T14:43:25.018Zdaily0.7 +https://wr.do/terms2025-05-20T14:43:25.018Zdaily0.7 +https://wr.do/manifest.json2025-05-20T14:43:25.018Zdaily0.7 +https://wr.do/opengraph-image.jpg2025-05-20T14:43:25.018Zdaily0.7 \ No newline at end of file diff --git a/public/sw.js b/public/sw.js index acac387..10bb6b1 100644 --- a/public/sw.js +++ b/public/sw.js @@ -1 +1,101 @@ -if(!self.define){let e,i={};const s=(s,a)=>(s=new URL(s+".js",a).href,i[s]||new Promise((i=>{if("document"in self){const e=document.createElement("script");e.src=s,e.onload=i,document.head.appendChild(e)}else e=s,importScripts(s),i()})).then((()=>{let e=i[s];if(!e)throw new Error(`Module ${s} didn’t register its module`);return e})));self.define=(a,n)=>{const t=e||("document"in self?document.currentScript.src:"")||location.href;if(i[t])return;let c={};const r=e=>s(e,t),d={module:{uri:t},exports:c,require:r};i[t]=Promise.all(a.map((e=>d[e]||r(e)))).then((e=>(n(...e),c)))}}define(["./workbox-e9849328"],(function(e){"use strict";importScripts(),self.skipWaiting(),e.clientsClaim(),e.precacheAndRoute([{url:"/_next/app-build-manifest.json",revision:"36fe5de2ed0becc9f87cd2cace2cf251"},{url:"/_next/static/Zii8KOhYgpETjkX-z9n4Y/_buildManifest.js",revision:"73b52720bea01027a804a328361e8618"},{url:"/_next/static/Zii8KOhYgpETjkX-z9n4Y/_ssgManifest.js",revision:"b6652df95db52feb4daf4eca35380933"},{url:"/_next/static/chunks/1216.057c6927e653812a.js",revision:"057c6927e653812a"},{url:"/_next/static/chunks/1403-a3d81771e852e5cf.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/1826-eeb2dec820b91ccd.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/1932-3e4aa4210ec36606.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/2052-21bff78b03cb5c4d.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/2071-aa1f7133d51be4b9.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/2171-9a1ff0ce96870317.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/2207-4bdf30c4774b0c4c.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/2383-b8c179c6b36104e3.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/2435-61d409c80e01097a.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/2448-6326b697d799a586.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/2560-5443986a93a575e1.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/2694-cf9d685efb57db76.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/2857-e043ef3d22cae2ff.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/2918-3e089134e978a652.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/3005-1ff64d5da18ed405.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/3107-fab00402de5c9da9.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/3203-d4d8074ad2880903.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/321-f0ee4210d84c0929.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/3250-65a3fdc437438a98.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/3422-b5f001f63e2f252a.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/3654-d9aea5e61383aaac.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/435-125edd1a8a547507.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/4862-7aade0f792895ce1.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/501-b7ed66c1a62416dd.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/5107-3814fb64d8e35baa.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/5276-3ab1a4049fb02bfb.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/5434-7a651b6f86e4e66e.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/5596-ff4a78279462ec85.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/5699-38741365d68fe6af.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/5845-0a6955d226e1eb29.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/6254-4541e65b79eccb47.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/656-9a28544695bc499d.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/7056-fafec3cde147d372.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/7241-2437eeecd9994098.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/7567-59fdad9479975a76.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/7789-6f79c02428fdc02d.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/7797-504f77909dbb8a9c.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/7865-4b8ee6b3bca69bf8.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/7976-3bccb3a48c4dc527.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/8333-eb210683b72846db.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/8599-57409b44d3000698.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/8854-b5be0fb210099b34.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/9305-2df17c8fba5d9855.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/9521-fcfac90176e0fd32.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/9586-c46110f85fe2b96d.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/9596-ad40ff9c0746ddb2.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/a33f0537-4968ab0047fe8bc4.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/app/(auth)/layout-0de19d3a8d6c02ff.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/app/(auth)/login/page-24e6a0f975545944.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/app/(auth)/register/page-0d5ef98144d8399f.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/app/(docs)/docs/%5B%5B...slug%5D%5D/page-03f7ec3b422595f8.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/app/(docs)/docs/layout-2a72cef66b32135f.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/app/(docs)/layout-9ab5e63523e563f3.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/app/(marketing)/%5Bslug%5D/page-3a99fb09a3075a6f.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/app/(marketing)/error-08a3e55698094ed5.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/app/(marketing)/layout-46924c891bd04bac.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/app/(marketing)/not-found-d5f4451fe8d5c1ec.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/app/(marketing)/page-d62c4691b8ff6ab7.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/app/(protected)/admin/layout-703b7afeba662805.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/app/(protected)/admin/loading-66e41872e1d2db26.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/app/(protected)/admin/page-0ab4304a56f4b98c.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/app/(protected)/admin/records/loading-6cd8ecf96d423ba6.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/app/(protected)/admin/records/page-da14669c9e6acdea.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/app/(protected)/admin/urls/loading-93e86960074b4af7.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/app/(protected)/admin/urls/page-d2e1d1f6b50f7498.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/app/(protected)/admin/users/loading-8ab81494dd76c76b.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/app/(protected)/admin/users/page-bfee9edaa8677978.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/app/(protected)/dashboard/loading-3194020f1d1e0be2.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/app/(protected)/dashboard/page-c0e884304028d9d3.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/app/(protected)/dashboard/records/loading-a84f12bb7a95ccbe.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/app/(protected)/dashboard/records/page-0f744a8e1caf897e.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/app/(protected)/dashboard/scrape/loading-9632f72e818f3e03.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/app/(protected)/dashboard/scrape/markdown/loading-8b8460129cc90b8e.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/app/(protected)/dashboard/scrape/markdown/page-3d67e1fd54d56cd4.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/app/(protected)/dashboard/scrape/meta-info/loading-95ba21083227762a.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/app/(protected)/dashboard/scrape/meta-info/page-231621a1ea86e149.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/app/(protected)/dashboard/scrape/page-16aaee7258379007.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/app/(protected)/dashboard/scrape/qrcode/loading-7fa037fca5cf9ffd.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/app/(protected)/dashboard/scrape/qrcode/page-38ae9e4f7f2b4917.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/app/(protected)/dashboard/scrape/screenshot/loading-6118431b0fe6fb9a.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/app/(protected)/dashboard/scrape/screenshot/page-8a12ecab9b0c33b5.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/app/(protected)/dashboard/settings/loading-f709547ad4dfc8fd.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/app/(protected)/dashboard/settings/page-2716617f83ba6cd7.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/app/(protected)/dashboard/urls/loading-29795e0cdb30579a.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/app/(protected)/dashboard/urls/page-31467c4aec3a6da7.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/app/(protected)/layout-7bd55e96b10d187c.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/app/_not-found/page-daa34574791408f5.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/app/chat/layout-cff4d5ab6fd92794.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/app/chat/loading-d6f1b19ae4ffa996.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/app/chat/page-2075d07b7ef24794.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/app/emails/layout-0adcdebb603898d1.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/app/emails/loading-b97deef9df6bc2f9.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/app/emails/page-12eaff45c79464e6.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/app/layout-aa1553734c40ad19.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/app/not-found-f63b66c698305b83.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/app/password-prompt/layout-9f58a2a175509179.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/app/password-prompt/loading-7606ab971d8f9c78.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/app/password-prompt/page-a088d73ee2017dc7.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/ba634aa8-4cec903169236942.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/db206de2-aac614a3ce7bab9d.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/ef956ed8.c4c1ce487e6e4c3b.js",revision:"c4c1ce487e6e4c3b"},{url:"/_next/static/chunks/framework-20afca218c33ed8b.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/main-38f36e477a72f9a3.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/main-app-571fe4d9916d1d2b.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/pages/_app-6eec5c984b7548b1.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/pages/_error-cffe1ad5943208e4.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/chunks/polyfills-42372ed130431b0a.js",revision:"846118c33b2c0e922d7b3a7676f81f6f"},{url:"/_next/static/chunks/webpack-c211471883aae3aa.js",revision:"Zii8KOhYgpETjkX-z9n4Y"},{url:"/_next/static/css/26f2d9014a23aebc.css",revision:"26f2d9014a23aebc"},{url:"/_next/static/css/45a6a8d6489d6174.css",revision:"45a6a8d6489d6174"},{url:"/_next/static/css/8aee48eb52f4c731.css",revision:"8aee48eb52f4c731"},{url:"/_next/static/css/e6f1d3c8243b4096.css",revision:"e6f1d3c8243b4096"},{url:"/_next/static/media/26a46d62cd723877-s.woff2",revision:"befd9c0fdfa3d8a645d5f95717ed6420"},{url:"/_next/static/media/55c55f0601d81cf3-s.woff2",revision:"43828e14271c77b87e3ed582dbff9f74"},{url:"/_next/static/media/581909926a08bbc8-s.woff2",revision:"f0b86e7c24f455280b8df606b89af891"},{url:"/_next/static/media/6d93bde91c0c2823-s.woff2",revision:"621a07228c8ccbfd647918f1021b4868"},{url:"/_next/static/media/90475aac776488b6-s.p.woff2",revision:"183db31d6365283bef4914042be9dfab"},{url:"/_next/static/media/97e0cb1ae144a2a9-s.woff2",revision:"e360c61c5bd8d90639fd4503c829c2dc"},{url:"/_next/static/media/a34f9d1faa5f3315-s.p.woff2",revision:"d4fe31e6a2aebc06b8d6e558c9141119"},{url:"/_next/static/media/d9396795aa5ec363-s.p.woff2",revision:"70880e42f07b0386e261974cd14820a1"},{url:"/_next/static/media/df0a9ae256c0569c-s.woff2",revision:"d54db44de5ccb18886ece2fda72bdfe0"},{url:"/_static/blog/blog-post-1.jpg",revision:"d91bb1224212bd1a832f99fe7494554f"},{url:"/_static/blog/blog-post-2.jpg",revision:"04442fcb79e9538e65be3476b2b6aa3a"},{url:"/_static/blog/blog-post-3.jpg",revision:"a758717dd624c5900385151290cf378d"},{url:"/_static/blog/blog-post-4.jpg",revision:"135c157ecc4dfcbac1ebe27a04f40d84"},{url:"/_static/docs/gg-auth-config.jpg",revision:"8e10e48df3a501dc502c36bb581b7247"},{url:"/_static/docs/link/disabled.svg",revision:"cbad92372683a3f9dd8ef50de2260671"},{url:"/_static/docs/link/error-404.svg",revision:"d615612fce1b8a1436dae35bf36023a2"},{url:"/_static/docs/link/error.svg",revision:"16eef297f91340059a082e8400315cbf"},{url:"/_static/docs/link/expired.svg",revision:"2e066f0b45e25175fb716ce6adb60790"},{url:"/_static/docs/link/password-error.svg",revision:"48abd97bfdb089354ff043b760041ed3"},{url:"/_static/docs/link/password.svg",revision:"e8a849a581fc25ae08a8c06da1c06320"},{url:"/_static/docs/r2-domain.png",revision:"a5855dba9a2793cffdd14b06c9b266a9"},{url:"/_static/examples/vercel_01.png",revision:"b9ec020bc5de0489ea314526dc1f4a38"},{url:"/_static/examples/vercel_02.png",revision:"a5a0dfb0b257becb83e6b70cbccc4490"},{url:"/_static/examples/vercel_03.png",revision:"e002acbc83d08aa0e9a650a71d1d02da"},{url:"/_static/examples/zeabur_01.png",revision:"06be65f37902549a587de901020a79f6"},{url:"/_static/examples/zeabur_02.png",revision:"d202334b902359133a9283c5500b20f2"},{url:"/_static/examples/zeabur_03.png",revision:"071418bf8c5046459e675d024e90b90b"},{url:"/_static/fonts/BAHAMASB.woff",revision:"19c1033177bfe869798e41c1d65c37d9"},{url:"/_static/fonts/BAHAMASN.woff",revision:"e5d96cc42c5bc3f5ae3302f9cdef6c9b"},{url:"/_static/illustrations/call-waiting.svg",revision:"bc1d08db6006f643c596558a8ce2115e"},{url:"/_static/illustrations/rocket-crashed.svg",revision:"f1404f635f3e5b8802646d01a0d46cbb"},{url:"/_static/images/dark-preview.png",revision:"d7093683aa7e5af23221dadaf49ede30"},{url:"/_static/images/example_01.png",revision:"1d2699ca9873d6daafdd41979e28b1c7"},{url:"/_static/images/example_02.png",revision:"cd9115f8c6c34ab8433510080e3f26dd"},{url:"/_static/images/example_03.png",revision:"9e3d01f11f45250445970f3f05bda52d"},{url:"/_static/images/light-preview.png",revision:"41b076e5d40d2382934bee8af8b483bc"},{url:"/_static/images/linuxdo.png",revision:"8f5868732c21463c570d75b36b43f62a"},{url:"/_static/images/linuxdo.webp",revision:"8f5868732c21463c570d75b36b43f62a"},{url:"/_static/images/password.png",revision:"603c0a0c8d10a9e81c422eba1ada41c0"},{url:"/_static/images/x-preview.png",revision:"26d9863ac8c1b935952432b5e79c9a81"},{url:"/_static/landing/domain.svg",revision:"c4be3f261dfb1e4c61b7f30abb409f99"},{url:"/_static/landing/email.svg",revision:"9354fe80bbc5421ff640b36017e7af29"},{url:"/_static/landing/hosting.svg",revision:"7849257e1bcc8a86937f2bcc40d3f867"},{url:"/_static/landing/info.svg",revision:"561ecee752d14d4d0b36be16e213f2d1"},{url:"/_static/landing/link.svg",revision:"dd87c312fd827b2e6734d3e7bf53defe"},{url:"/_static/landing/mailbox.svg",revision:"f7e75f4cbbf10db07f72b3ce8f334bcd"},{url:"/_static/landing/screenshot.svg",revision:"153ab26682a679fee86dc68e2889172f"},{url:"/_static/logo.png",revision:"4c7bd029735bc3a7896a5ab1d689c949"},{url:"/_static/logo.svg",revision:"44cc28924d5edf3bde71f92e39348312"},{url:"/_static/og.jpg",revision:"a4b52bc6e3ffacbf6ea33ce23a37da8f"},{url:"/_static/wr.png",revision:"45189df007a8b89e4914fa9a6c47ccc7"},{url:"/_static/wrdo.png",revision:"d6edf9a7e97b6408e5aa3a69f2374f10"},{url:"/favicon.ico",revision:"4c7bd029735bc3a7896a5ab1d689c949"},{url:"/llms.txt",revision:"beb0322b35b77077ac55b38e0c03d303"},{url:"/manifest.json",revision:"bc7cf2817813a67c5c3f841a3a54d1aa"},{url:"/robots.txt",revision:"001eed25907c33863f2e60dfe3620dfd"},{url:"/site.webmanifest",revision:"bc7cf2817813a67c5c3f841a3a54d1aa"},{url:"/sitemap-0.xml",revision:"9b41a6f0d305a5ad924906a8f155097f"},{url:"/sitemap.xml",revision:"175031181630b79b72c538659e0fe91c"}],{ignoreURLParametersMatching:[]}),e.cleanupOutdatedCaches(),e.registerRoute("/",new e.NetworkFirst({cacheName:"start-url",plugins:[{cacheWillUpdate:async({request:e,response:i,event:s,state:a})=>i&&"opaqueredirect"===i.type?new Response(i.body,{status:200,statusText:"OK",headers:i.headers}):i}]}),"GET"),e.registerRoute(/^https:\/\/fonts\.(?:gstatic)\.com\/.*/i,new e.CacheFirst({cacheName:"google-fonts-webfonts",plugins:[new e.ExpirationPlugin({maxEntries:4,maxAgeSeconds:31536e3})]}),"GET"),e.registerRoute(/^https:\/\/fonts\.(?:googleapis)\.com\/.*/i,new e.StaleWhileRevalidate({cacheName:"google-fonts-stylesheets",plugins:[new e.ExpirationPlugin({maxEntries:4,maxAgeSeconds:604800})]}),"GET"),e.registerRoute(/\.(?:eot|otf|ttc|ttf|woff|woff2|font.css)$/i,new e.StaleWhileRevalidate({cacheName:"static-font-assets",plugins:[new e.ExpirationPlugin({maxEntries:4,maxAgeSeconds:604800})]}),"GET"),e.registerRoute(/\.(?:jpg|jpeg|gif|png|svg|ico|webp)$/i,new e.StaleWhileRevalidate({cacheName:"static-image-assets",plugins:[new e.ExpirationPlugin({maxEntries:64,maxAgeSeconds:86400})]}),"GET"),e.registerRoute(/\/_next\/image\?url=.+$/i,new e.StaleWhileRevalidate({cacheName:"next-image",plugins:[new e.ExpirationPlugin({maxEntries:64,maxAgeSeconds:86400})]}),"GET"),e.registerRoute(/\.(?:mp3|wav|ogg)$/i,new e.CacheFirst({cacheName:"static-audio-assets",plugins:[new e.RangeRequestsPlugin,new e.ExpirationPlugin({maxEntries:32,maxAgeSeconds:86400})]}),"GET"),e.registerRoute(/\.(?:mp4)$/i,new e.CacheFirst({cacheName:"static-video-assets",plugins:[new e.RangeRequestsPlugin,new e.ExpirationPlugin({maxEntries:32,maxAgeSeconds:86400})]}),"GET"),e.registerRoute(/\.(?:js)$/i,new e.StaleWhileRevalidate({cacheName:"static-js-assets",plugins:[new e.ExpirationPlugin({maxEntries:32,maxAgeSeconds:86400})]}),"GET"),e.registerRoute(/\.(?:css|less)$/i,new e.StaleWhileRevalidate({cacheName:"static-style-assets",plugins:[new e.ExpirationPlugin({maxEntries:32,maxAgeSeconds:86400})]}),"GET"),e.registerRoute(/\/_next\/data\/.+\/.+\.json$/i,new e.StaleWhileRevalidate({cacheName:"next-data",plugins:[new e.ExpirationPlugin({maxEntries:32,maxAgeSeconds:86400})]}),"GET"),e.registerRoute(/\.(?:json|xml|csv)$/i,new e.NetworkFirst({cacheName:"static-data-assets",plugins:[new e.ExpirationPlugin({maxEntries:32,maxAgeSeconds:86400})]}),"GET"),e.registerRoute((({url:e})=>{if(!(self.origin===e.origin))return!1;const i=e.pathname;return!i.startsWith("/api/auth/")&&!!i.startsWith("/api/")}),new e.NetworkFirst({cacheName:"apis",networkTimeoutSeconds:10,plugins:[new e.ExpirationPlugin({maxEntries:16,maxAgeSeconds:86400})]}),"GET"),e.registerRoute((({url:e})=>{if(!(self.origin===e.origin))return!1;return!e.pathname.startsWith("/api/")}),new e.NetworkFirst({cacheName:"others",networkTimeoutSeconds:10,plugins:[new e.ExpirationPlugin({maxEntries:32,maxAgeSeconds:86400})]}),"GET"),e.registerRoute((({url:e})=>!(self.origin===e.origin)),new e.NetworkFirst({cacheName:"cross-origin",networkTimeoutSeconds:10,plugins:[new e.ExpirationPlugin({maxEntries:32,maxAgeSeconds:3600})]}),"GET")})); +/** + * Copyright 2018 Google Inc. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +// If the loader is already loaded, just stop. +if (!self.define) { + let registry = {}; + + // Used for `eval` and `importScripts` where we can't get script URL by other means. + // In both cases, it's safe to use a global var because those functions are synchronous. + let nextDefineUri; + + const singleRequire = (uri, parentUri) => { + uri = new URL(uri + ".js", parentUri).href; + return registry[uri] || ( + + new Promise(resolve => { + if ("document" in self) { + const script = document.createElement("script"); + script.src = uri; + script.onload = resolve; + document.head.appendChild(script); + } else { + nextDefineUri = uri; + importScripts(uri); + resolve(); + } + }) + + .then(() => { + let promise = registry[uri]; + if (!promise) { + throw new Error(`Module ${uri} didn’t register its module`); + } + return promise; + }) + ); + }; + + self.define = (depsNames, factory) => { + const uri = nextDefineUri || ("document" in self ? document.currentScript.src : "") || location.href; + if (registry[uri]) { + // Module is already loading or loaded. + return; + } + let exports = {}; + const require = depUri => singleRequire(depUri, uri); + const specialDeps = { + module: { uri }, + exports, + require + }; + registry[uri] = Promise.all(depsNames.map( + depName => specialDeps[depName] || require(depName) + )).then(deps => { + factory(...deps); + return exports; + }); + }; +} +define(['./workbox-8817a5e5'], (function (workbox) { 'use strict'; + + importScripts(); + self.skipWaiting(); + workbox.clientsClaim(); + workbox.registerRoute("/", new workbox.NetworkFirst({ + "cacheName": "start-url", + plugins: [{ + cacheWillUpdate: async ({ + request, + response, + event, + state + }) => { + if (response && response.type === 'opaqueredirect') { + return new Response(response.body, { + status: 200, + statusText: 'OK', + headers: response.headers + }); + } + return response; + } + }] + }), 'GET'); + workbox.registerRoute(/.*/i, new workbox.NetworkOnly({ + "cacheName": "dev", + plugins: [] + }), 'GET'); + +})); +//# sourceMappingURL=sw.js.map diff --git a/public/sw.js.map b/public/sw.js.map new file mode 100644 index 0000000..95b5bf0 --- /dev/null +++ b/public/sw.js.map @@ -0,0 +1 @@ +{"version":3,"file":"sw.js","sources":["../../../../../../private/var/folders/9b/3qmyp8zd2xvdspdrp149fyg00000gn/T/04443f5fc75df19ba6a55a8a764fbf11/sw.js"],"sourcesContent":["import {registerRoute as workbox_routing_registerRoute} from '/Users/songjunxi/Desktop/repos/wrdo-app/wr.do/node_modules/.pnpm/workbox-routing@6.6.0/node_modules/workbox-routing/registerRoute.mjs';\nimport {NetworkFirst as workbox_strategies_NetworkFirst} from '/Users/songjunxi/Desktop/repos/wrdo-app/wr.do/node_modules/.pnpm/workbox-strategies@6.6.0/node_modules/workbox-strategies/NetworkFirst.mjs';\nimport {NetworkOnly as workbox_strategies_NetworkOnly} from '/Users/songjunxi/Desktop/repos/wrdo-app/wr.do/node_modules/.pnpm/workbox-strategies@6.6.0/node_modules/workbox-strategies/NetworkOnly.mjs';\nimport {clientsClaim as workbox_core_clientsClaim} from '/Users/songjunxi/Desktop/repos/wrdo-app/wr.do/node_modules/.pnpm/workbox-core@6.6.0/node_modules/workbox-core/clientsClaim.mjs';/**\n * Welcome to your Workbox-powered service worker!\n *\n * You'll need to register this file in your web app.\n * See https://goo.gl/nhQhGp\n *\n * The rest of the code is auto-generated. Please don't update this file\n * directly; instead, make changes to your Workbox build configuration\n * and re-run your build process.\n * See https://goo.gl/2aRDsh\n */\n\n\nimportScripts(\n \n);\n\n\n\n\n\n\n\nself.skipWaiting();\n\nworkbox_core_clientsClaim();\n\n\n\nworkbox_routing_registerRoute(\"/\", new workbox_strategies_NetworkFirst({ \"cacheName\":\"start-url\", plugins: [{ cacheWillUpdate: async ({ request, response, event, state }) => { if (response && response.type === 'opaqueredirect') { return new Response(response.body, { status: 200, statusText: 'OK', headers: response.headers }) } return response } }] }), 'GET');\nworkbox_routing_registerRoute(/.*/i, new workbox_strategies_NetworkOnly({ \"cacheName\":\"dev\", plugins: [] }), 'GET');\n\n\n\n\n"],"names":["importScripts","self","skipWaiting","workbox_core_clientsClaim","workbox_routing_registerRoute","workbox_strategies_NetworkFirst","plugins","cacheWillUpdate","request","response","event","state","type","Response","body","status","statusText","headers","workbox_strategies_NetworkOnly"],"mappings":"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"} \ No newline at end of file diff --git a/public/workbox-8817a5e5.js b/public/workbox-8817a5e5.js new file mode 100644 index 0000000..d4d3c9f --- /dev/null +++ b/public/workbox-8817a5e5.js @@ -0,0 +1,2456 @@ +define(['exports'], (function (exports) { 'use strict'; + + // @ts-ignore + try { + self['workbox:core:6.5.4'] && _(); + } catch (e) {} + + /* + Copyright 2019 Google LLC + Use of this source code is governed by an MIT-style + license that can be found in the LICENSE file or at + https://opensource.org/licenses/MIT. + */ + const logger = (() => { + // Don't overwrite this value if it's already set. + // See https://github.com/GoogleChrome/workbox/pull/2284#issuecomment-560470923 + if (!('__WB_DISABLE_DEV_LOGS' in globalThis)) { + self.__WB_DISABLE_DEV_LOGS = false; + } + let inGroup = false; + const methodToColorMap = { + debug: `#7f8c8d`, + log: `#2ecc71`, + warn: `#f39c12`, + error: `#c0392b`, + groupCollapsed: `#3498db`, + groupEnd: null // No colored prefix on groupEnd + }; + const print = function (method, args) { + if (self.__WB_DISABLE_DEV_LOGS) { + return; + } + if (method === 'groupCollapsed') { + // Safari doesn't print all console.groupCollapsed() arguments: + // https://bugs.webkit.org/show_bug.cgi?id=182754 + if (/^((?!chrome|android).)*safari/i.test(navigator.userAgent)) { + console[method](...args); + return; + } + } + const styles = [`background: ${methodToColorMap[method]}`, `border-radius: 0.5em`, `color: white`, `font-weight: bold`, `padding: 2px 0.5em`]; + // When in a group, the workbox prefix is not displayed. + const logPrefix = inGroup ? [] : ['%cworkbox', styles.join(';')]; + console[method](...logPrefix, ...args); + if (method === 'groupCollapsed') { + inGroup = true; + } + if (method === 'groupEnd') { + inGroup = false; + } + }; + // eslint-disable-next-line @typescript-eslint/ban-types + const api = {}; + const loggerMethods = Object.keys(methodToColorMap); + for (const key of loggerMethods) { + const method = key; + api[method] = (...args) => { + print(method, args); + }; + } + return api; + })(); + + /* + Copyright 2018 Google LLC + + Use of this source code is governed by an MIT-style + license that can be found in the LICENSE file or at + https://opensource.org/licenses/MIT. + */ + const messages$1 = { + 'invalid-value': ({ + paramName, + validValueDescription, + value + }) => { + if (!paramName || !validValueDescription) { + throw new Error(`Unexpected input to 'invalid-value' error.`); + } + return `The '${paramName}' parameter was given a value with an ` + `unexpected value. ${validValueDescription} Received a value of ` + `${JSON.stringify(value)}.`; + }, + 'not-an-array': ({ + moduleName, + className, + funcName, + paramName + }) => { + if (!moduleName || !className || !funcName || !paramName) { + throw new Error(`Unexpected input to 'not-an-array' error.`); + } + return `The parameter '${paramName}' passed into ` + `'${moduleName}.${className}.${funcName}()' must be an array.`; + }, + 'incorrect-type': ({ + expectedType, + paramName, + moduleName, + className, + funcName + }) => { + if (!expectedType || !paramName || !moduleName || !funcName) { + throw new Error(`Unexpected input to 'incorrect-type' error.`); + } + const classNameStr = className ? `${className}.` : ''; + return `The parameter '${paramName}' passed into ` + `'${moduleName}.${classNameStr}` + `${funcName}()' must be of type ${expectedType}.`; + }, + 'incorrect-class': ({ + expectedClassName, + paramName, + moduleName, + className, + funcName, + isReturnValueProblem + }) => { + if (!expectedClassName || !moduleName || !funcName) { + throw new Error(`Unexpected input to 'incorrect-class' error.`); + } + const classNameStr = className ? `${className}.` : ''; + if (isReturnValueProblem) { + return `The return value from ` + `'${moduleName}.${classNameStr}${funcName}()' ` + `must be an instance of class ${expectedClassName}.`; + } + return `The parameter '${paramName}' passed into ` + `'${moduleName}.${classNameStr}${funcName}()' ` + `must be an instance of class ${expectedClassName}.`; + }, + 'missing-a-method': ({ + expectedMethod, + paramName, + moduleName, + className, + funcName + }) => { + if (!expectedMethod || !paramName || !moduleName || !className || !funcName) { + throw new Error(`Unexpected input to 'missing-a-method' error.`); + } + return `${moduleName}.${className}.${funcName}() expected the ` + `'${paramName}' parameter to expose a '${expectedMethod}' method.`; + }, + 'add-to-cache-list-unexpected-type': ({ + entry + }) => { + return `An unexpected entry was passed to ` + `'workbox-precaching.PrecacheController.addToCacheList()' The entry ` + `'${JSON.stringify(entry)}' isn't supported. You must supply an array of ` + `strings with one or more characters, objects with a url property or ` + `Request objects.`; + }, + 'add-to-cache-list-conflicting-entries': ({ + firstEntry, + secondEntry + }) => { + if (!firstEntry || !secondEntry) { + throw new Error(`Unexpected input to ` + `'add-to-cache-list-duplicate-entries' error.`); + } + return `Two of the entries passed to ` + `'workbox-precaching.PrecacheController.addToCacheList()' had the URL ` + `${firstEntry} but different revision details. Workbox is ` + `unable to cache and version the asset correctly. Please remove one ` + `of the entries.`; + }, + 'plugin-error-request-will-fetch': ({ + thrownErrorMessage + }) => { + if (!thrownErrorMessage) { + throw new Error(`Unexpected input to ` + `'plugin-error-request-will-fetch', error.`); + } + return `An error was thrown by a plugins 'requestWillFetch()' method. ` + `The thrown error message was: '${thrownErrorMessage}'.`; + }, + 'invalid-cache-name': ({ + cacheNameId, + value + }) => { + if (!cacheNameId) { + throw new Error(`Expected a 'cacheNameId' for error 'invalid-cache-name'`); + } + return `You must provide a name containing at least one character for ` + `setCacheDetails({${cacheNameId}: '...'}). Received a value of ` + `'${JSON.stringify(value)}'`; + }, + 'unregister-route-but-not-found-with-method': ({ + method + }) => { + if (!method) { + throw new Error(`Unexpected input to ` + `'unregister-route-but-not-found-with-method' error.`); + } + return `The route you're trying to unregister was not previously ` + `registered for the method type '${method}'.`; + }, + 'unregister-route-route-not-registered': () => { + return `The route you're trying to unregister was not previously ` + `registered.`; + }, + 'queue-replay-failed': ({ + name + }) => { + return `Replaying the background sync queue '${name}' failed.`; + }, + 'duplicate-queue-name': ({ + name + }) => { + return `The Queue name '${name}' is already being used. ` + `All instances of backgroundSync.Queue must be given unique names.`; + }, + 'expired-test-without-max-age': ({ + methodName, + paramName + }) => { + return `The '${methodName}()' method can only be used when the ` + `'${paramName}' is used in the constructor.`; + }, + 'unsupported-route-type': ({ + moduleName, + className, + funcName, + paramName + }) => { + return `The supplied '${paramName}' parameter was an unsupported type. ` + `Please check the docs for ${moduleName}.${className}.${funcName} for ` + `valid input types.`; + }, + 'not-array-of-class': ({ + value, + expectedClass, + moduleName, + className, + funcName, + paramName + }) => { + return `The supplied '${paramName}' parameter must be an array of ` + `'${expectedClass}' objects. Received '${JSON.stringify(value)},'. ` + `Please check the call to ${moduleName}.${className}.${funcName}() ` + `to fix the issue.`; + }, + 'max-entries-or-age-required': ({ + moduleName, + className, + funcName + }) => { + return `You must define either config.maxEntries or config.maxAgeSeconds` + `in ${moduleName}.${className}.${funcName}`; + }, + 'statuses-or-headers-required': ({ + moduleName, + className, + funcName + }) => { + return `You must define either config.statuses or config.headers` + `in ${moduleName}.${className}.${funcName}`; + }, + 'invalid-string': ({ + moduleName, + funcName, + paramName + }) => { + if (!paramName || !moduleName || !funcName) { + throw new Error(`Unexpected input to 'invalid-string' error.`); + } + return `When using strings, the '${paramName}' parameter must start with ` + `'http' (for cross-origin matches) or '/' (for same-origin matches). ` + `Please see the docs for ${moduleName}.${funcName}() for ` + `more info.`; + }, + 'channel-name-required': () => { + return `You must provide a channelName to construct a ` + `BroadcastCacheUpdate instance.`; + }, + 'invalid-responses-are-same-args': () => { + return `The arguments passed into responsesAreSame() appear to be ` + `invalid. Please ensure valid Responses are used.`; + }, + 'expire-custom-caches-only': () => { + return `You must provide a 'cacheName' property when using the ` + `expiration plugin with a runtime caching strategy.`; + }, + 'unit-must-be-bytes': ({ + normalizedRangeHeader + }) => { + if (!normalizedRangeHeader) { + throw new Error(`Unexpected input to 'unit-must-be-bytes' error.`); + } + return `The 'unit' portion of the Range header must be set to 'bytes'. ` + `The Range header provided was "${normalizedRangeHeader}"`; + }, + 'single-range-only': ({ + normalizedRangeHeader + }) => { + if (!normalizedRangeHeader) { + throw new Error(`Unexpected input to 'single-range-only' error.`); + } + return `Multiple ranges are not supported. Please use a single start ` + `value, and optional end value. The Range header provided was ` + `"${normalizedRangeHeader}"`; + }, + 'invalid-range-values': ({ + normalizedRangeHeader + }) => { + if (!normalizedRangeHeader) { + throw new Error(`Unexpected input to 'invalid-range-values' error.`); + } + return `The Range header is missing both start and end values. At least ` + `one of those values is needed. The Range header provided was ` + `"${normalizedRangeHeader}"`; + }, + 'no-range-header': () => { + return `No Range header was found in the Request provided.`; + }, + 'range-not-satisfiable': ({ + size, + start, + end + }) => { + return `The start (${start}) and end (${end}) values in the Range are ` + `not satisfiable by the cached response, which is ${size} bytes.`; + }, + 'attempt-to-cache-non-get-request': ({ + url, + method + }) => { + return `Unable to cache '${url}' because it is a '${method}' request and ` + `only 'GET' requests can be cached.`; + }, + 'cache-put-with-no-response': ({ + url + }) => { + return `There was an attempt to cache '${url}' but the response was not ` + `defined.`; + }, + 'no-response': ({ + url, + error + }) => { + let message = `The strategy could not generate a response for '${url}'.`; + if (error) { + message += ` The underlying error is ${error}.`; + } + return message; + }, + 'bad-precaching-response': ({ + url, + status + }) => { + return `The precaching request for '${url}' failed` + (status ? ` with an HTTP status of ${status}.` : `.`); + }, + 'non-precached-url': ({ + url + }) => { + return `createHandlerBoundToURL('${url}') was called, but that URL is ` + `not precached. Please pass in a URL that is precached instead.`; + }, + 'add-to-cache-list-conflicting-integrities': ({ + url + }) => { + return `Two of the entries passed to ` + `'workbox-precaching.PrecacheController.addToCacheList()' had the URL ` + `${url} with different integrity values. Please remove one of them.`; + }, + 'missing-precache-entry': ({ + cacheName, + url + }) => { + return `Unable to find a precached response in ${cacheName} for ${url}.`; + }, + 'cross-origin-copy-response': ({ + origin + }) => { + return `workbox-core.copyResponse() can only be used with same-origin ` + `responses. It was passed a response with origin ${origin}.`; + }, + 'opaque-streams-source': ({ + type + }) => { + const message = `One of the workbox-streams sources resulted in an ` + `'${type}' response.`; + if (type === 'opaqueredirect') { + return `${message} Please do not use a navigation request that results ` + `in a redirect as a source.`; + } + return `${message} Please ensure your sources are CORS-enabled.`; + } + }; + + /* + Copyright 2018 Google LLC + + Use of this source code is governed by an MIT-style + license that can be found in the LICENSE file or at + https://opensource.org/licenses/MIT. + */ + const generatorFunction = (code, details = {}) => { + const message = messages$1[code]; + if (!message) { + throw new Error(`Unable to find message for code '${code}'.`); + } + return message(details); + }; + const messageGenerator = generatorFunction; + + /* + Copyright 2018 Google LLC + + Use of this source code is governed by an MIT-style + license that can be found in the LICENSE file or at + https://opensource.org/licenses/MIT. + */ + /** + * Workbox errors should be thrown with this class. + * This allows use to ensure the type easily in tests, + * helps developers identify errors from workbox + * easily and allows use to optimise error + * messages correctly. + * + * @private + */ + class WorkboxError extends Error { + /** + * + * @param {string} errorCode The error code that + * identifies this particular error. + * @param {Object=} details Any relevant arguments + * that will help developers identify issues should + * be added as a key on the context object. + */ + constructor(errorCode, details) { + const message = messageGenerator(errorCode, details); + super(message); + this.name = errorCode; + this.details = details; + } + } + + /* + Copyright 2018 Google LLC + + Use of this source code is governed by an MIT-style + license that can be found in the LICENSE file or at + https://opensource.org/licenses/MIT. + */ + /* + * This method throws if the supplied value is not an array. + * The destructed values are required to produce a meaningful error for users. + * The destructed and restructured object is so it's clear what is + * needed. + */ + const isArray = (value, details) => { + if (!Array.isArray(value)) { + throw new WorkboxError('not-an-array', details); + } + }; + const hasMethod = (object, expectedMethod, details) => { + const type = typeof object[expectedMethod]; + if (type !== 'function') { + details['expectedMethod'] = expectedMethod; + throw new WorkboxError('missing-a-method', details); + } + }; + const isType = (object, expectedType, details) => { + if (typeof object !== expectedType) { + details['expectedType'] = expectedType; + throw new WorkboxError('incorrect-type', details); + } + }; + const isInstance = (object, + // Need the general type to do the check later. + // eslint-disable-next-line @typescript-eslint/ban-types + expectedClass, details) => { + if (!(object instanceof expectedClass)) { + details['expectedClassName'] = expectedClass.name; + throw new WorkboxError('incorrect-class', details); + } + }; + const isOneOf = (value, validValues, details) => { + if (!validValues.includes(value)) { + details['validValueDescription'] = `Valid values are ${JSON.stringify(validValues)}.`; + throw new WorkboxError('invalid-value', details); + } + }; + const isArrayOfClass = (value, + // Need general type to do check later. + expectedClass, + // eslint-disable-line + details) => { + const error = new WorkboxError('not-array-of-class', details); + if (!Array.isArray(value)) { + throw error; + } + for (const item of value) { + if (!(item instanceof expectedClass)) { + throw error; + } + } + }; + const finalAssertExports = { + hasMethod, + isArray, + isInstance, + isOneOf, + isType, + isArrayOfClass + }; + + // @ts-ignore + try { + self['workbox:routing:6.5.4'] && _(); + } catch (e) {} + + /* + Copyright 2018 Google LLC + + Use of this source code is governed by an MIT-style + license that can be found in the LICENSE file or at + https://opensource.org/licenses/MIT. + */ + /** + * The default HTTP method, 'GET', used when there's no specific method + * configured for a route. + * + * @type {string} + * + * @private + */ + const defaultMethod = 'GET'; + /** + * The list of valid HTTP methods associated with requests that could be routed. + * + * @type {Array} + * + * @private + */ + const validMethods = ['DELETE', 'GET', 'HEAD', 'PATCH', 'POST', 'PUT']; + + /* + Copyright 2018 Google LLC + + Use of this source code is governed by an MIT-style + license that can be found in the LICENSE file or at + https://opensource.org/licenses/MIT. + */ + /** + * @param {function()|Object} handler Either a function, or an object with a + * 'handle' method. + * @return {Object} An object with a handle method. + * + * @private + */ + const normalizeHandler = handler => { + if (handler && typeof handler === 'object') { + { + finalAssertExports.hasMethod(handler, 'handle', { + moduleName: 'workbox-routing', + className: 'Route', + funcName: 'constructor', + paramName: 'handler' + }); + } + return handler; + } else { + { + finalAssertExports.isType(handler, 'function', { + moduleName: 'workbox-routing', + className: 'Route', + funcName: 'constructor', + paramName: 'handler' + }); + } + return { + handle: handler + }; + } + }; + + /* + Copyright 2018 Google LLC + + Use of this source code is governed by an MIT-style + license that can be found in the LICENSE file or at + https://opensource.org/licenses/MIT. + */ + /** + * A `Route` consists of a pair of callback functions, "match" and "handler". + * The "match" callback determine if a route should be used to "handle" a + * request by returning a non-falsy value if it can. The "handler" callback + * is called when there is a match and should return a Promise that resolves + * to a `Response`. + * + * @memberof workbox-routing + */ + class Route { + /** + * Constructor for Route class. + * + * @param {workbox-routing~matchCallback} match + * A callback function that determines whether the route matches a given + * `fetch` event by returning a non-falsy value. + * @param {workbox-routing~handlerCallback} handler A callback + * function that returns a Promise resolving to a Response. + * @param {string} [method='GET'] The HTTP method to match the Route + * against. + */ + constructor(match, handler, method = defaultMethod) { + { + finalAssertExports.isType(match, 'function', { + moduleName: 'workbox-routing', + className: 'Route', + funcName: 'constructor', + paramName: 'match' + }); + if (method) { + finalAssertExports.isOneOf(method, validMethods, { + paramName: 'method' + }); + } + } + // These values are referenced directly by Router so cannot be + // altered by minificaton. + this.handler = normalizeHandler(handler); + this.match = match; + this.method = method; + } + /** + * + * @param {workbox-routing-handlerCallback} handler A callback + * function that returns a Promise resolving to a Response + */ + setCatchHandler(handler) { + this.catchHandler = normalizeHandler(handler); + } + } + + /* + Copyright 2018 Google LLC + + Use of this source code is governed by an MIT-style + license that can be found in the LICENSE file or at + https://opensource.org/licenses/MIT. + */ + /** + * RegExpRoute makes it easy to create a regular expression based + * {@link workbox-routing.Route}. + * + * For same-origin requests the RegExp only needs to match part of the URL. For + * requests against third-party servers, you must define a RegExp that matches + * the start of the URL. + * + * @memberof workbox-routing + * @extends workbox-routing.Route + */ + class RegExpRoute extends Route { + /** + * If the regular expression contains + * [capture groups]{@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp#grouping-back-references}, + * the captured values will be passed to the + * {@link workbox-routing~handlerCallback} `params` + * argument. + * + * @param {RegExp} regExp The regular expression to match against URLs. + * @param {workbox-routing~handlerCallback} handler A callback + * function that returns a Promise resulting in a Response. + * @param {string} [method='GET'] The HTTP method to match the Route + * against. + */ + constructor(regExp, handler, method) { + { + finalAssertExports.isInstance(regExp, RegExp, { + moduleName: 'workbox-routing', + className: 'RegExpRoute', + funcName: 'constructor', + paramName: 'pattern' + }); + } + const match = ({ + url + }) => { + const result = regExp.exec(url.href); + // Return immediately if there's no match. + if (!result) { + return; + } + // Require that the match start at the first character in the URL string + // if it's a cross-origin request. + // See https://github.com/GoogleChrome/workbox/issues/281 for the context + // behind this behavior. + if (url.origin !== location.origin && result.index !== 0) { + { + logger.debug(`The regular expression '${regExp.toString()}' only partially matched ` + `against the cross-origin URL '${url.toString()}'. RegExpRoute's will only ` + `handle cross-origin requests if they match the entire URL.`); + } + return; + } + // If the route matches, but there aren't any capture groups defined, then + // this will return [], which is truthy and therefore sufficient to + // indicate a match. + // If there are capture groups, then it will return their values. + return result.slice(1); + }; + super(match, handler, method); + } + } + + /* + Copyright 2018 Google LLC + + Use of this source code is governed by an MIT-style + license that can be found in the LICENSE file or at + https://opensource.org/licenses/MIT. + */ + const getFriendlyURL = url => { + const urlObj = new URL(String(url), location.href); + // See https://github.com/GoogleChrome/workbox/issues/2323 + // We want to include everything, except for the origin if it's same-origin. + return urlObj.href.replace(new RegExp(`^${location.origin}`), ''); + }; + + /* + Copyright 2018 Google LLC + + Use of this source code is governed by an MIT-style + license that can be found in the LICENSE file or at + https://opensource.org/licenses/MIT. + */ + /** + * The Router can be used to process a `FetchEvent` using one or more + * {@link workbox-routing.Route}, responding with a `Response` if + * a matching route exists. + * + * If no route matches a given a request, the Router will use a "default" + * handler if one is defined. + * + * Should the matching Route throw an error, the Router will use a "catch" + * handler if one is defined to gracefully deal with issues and respond with a + * Request. + * + * If a request matches multiple routes, the **earliest** registered route will + * be used to respond to the request. + * + * @memberof workbox-routing + */ + class Router { + /** + * Initializes a new Router. + */ + constructor() { + this._routes = new Map(); + this._defaultHandlerMap = new Map(); + } + /** + * @return {Map>} routes A `Map` of HTTP + * method name ('GET', etc.) to an array of all the corresponding `Route` + * instances that are registered. + */ + get routes() { + return this._routes; + } + /** + * Adds a fetch event listener to respond to events when a route matches + * the event's request. + */ + addFetchListener() { + // See https://github.com/Microsoft/TypeScript/issues/28357#issuecomment-436484705 + self.addEventListener('fetch', event => { + const { + request + } = event; + const responsePromise = this.handleRequest({ + request, + event + }); + if (responsePromise) { + event.respondWith(responsePromise); + } + }); + } + /** + * Adds a message event listener for URLs to cache from the window. + * This is useful to cache resources loaded on the page prior to when the + * service worker started controlling it. + * + * The format of the message data sent from the window should be as follows. + * Where the `urlsToCache` array may consist of URL strings or an array of + * URL string + `requestInit` object (the same as you'd pass to `fetch()`). + * + * ``` + * { + * type: 'CACHE_URLS', + * payload: { + * urlsToCache: [ + * './script1.js', + * './script2.js', + * ['./script3.js', {mode: 'no-cors'}], + * ], + * }, + * } + * ``` + */ + addCacheListener() { + // See https://github.com/Microsoft/TypeScript/issues/28357#issuecomment-436484705 + self.addEventListener('message', event => { + // event.data is type 'any' + // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access + if (event.data && event.data.type === 'CACHE_URLS') { + // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment + const { + payload + } = event.data; + { + logger.debug(`Caching URLs from the window`, payload.urlsToCache); + } + const requestPromises = Promise.all(payload.urlsToCache.map(entry => { + if (typeof entry === 'string') { + entry = [entry]; + } + const request = new Request(...entry); + return this.handleRequest({ + request, + event + }); + // TODO(philipwalton): TypeScript errors without this typecast for + // some reason (probably a bug). The real type here should work but + // doesn't: `Array | undefined>`. + })); // TypeScript + event.waitUntil(requestPromises); + // If a MessageChannel was used, reply to the message on success. + if (event.ports && event.ports[0]) { + void requestPromises.then(() => event.ports[0].postMessage(true)); + } + } + }); + } + /** + * Apply the routing rules to a FetchEvent object to get a Response from an + * appropriate Route's handler. + * + * @param {Object} options + * @param {Request} options.request The request to handle. + * @param {ExtendableEvent} options.event The event that triggered the + * request. + * @return {Promise|undefined} A promise is returned if a + * registered route can handle the request. If there is no matching + * route and there's no `defaultHandler`, `undefined` is returned. + */ + handleRequest({ + request, + event + }) { + { + finalAssertExports.isInstance(request, Request, { + moduleName: 'workbox-routing', + className: 'Router', + funcName: 'handleRequest', + paramName: 'options.request' + }); + } + const url = new URL(request.url, location.href); + if (!url.protocol.startsWith('http')) { + { + logger.debug(`Workbox Router only supports URLs that start with 'http'.`); + } + return; + } + const sameOrigin = url.origin === location.origin; + const { + params, + route + } = this.findMatchingRoute({ + event, + request, + sameOrigin, + url + }); + let handler = route && route.handler; + const debugMessages = []; + { + if (handler) { + debugMessages.push([`Found a route to handle this request:`, route]); + if (params) { + debugMessages.push([`Passing the following params to the route's handler:`, params]); + } + } + } + // If we don't have a handler because there was no matching route, then + // fall back to defaultHandler if that's defined. + const method = request.method; + if (!handler && this._defaultHandlerMap.has(method)) { + { + debugMessages.push(`Failed to find a matching route. Falling ` + `back to the default handler for ${method}.`); + } + handler = this._defaultHandlerMap.get(method); + } + if (!handler) { + { + // No handler so Workbox will do nothing. If logs is set of debug + // i.e. verbose, we should print out this information. + logger.debug(`No route found for: ${getFriendlyURL(url)}`); + } + return; + } + { + // We have a handler, meaning Workbox is going to handle the route. + // print the routing details to the console. + logger.groupCollapsed(`Router is responding to: ${getFriendlyURL(url)}`); + debugMessages.forEach(msg => { + if (Array.isArray(msg)) { + logger.log(...msg); + } else { + logger.log(msg); + } + }); + logger.groupEnd(); + } + // Wrap in try and catch in case the handle method throws a synchronous + // error. It should still callback to the catch handler. + let responsePromise; + try { + responsePromise = handler.handle({ + url, + request, + event, + params + }); + } catch (err) { + responsePromise = Promise.reject(err); + } + // Get route's catch handler, if it exists + const catchHandler = route && route.catchHandler; + if (responsePromise instanceof Promise && (this._catchHandler || catchHandler)) { + responsePromise = responsePromise.catch(async err => { + // If there's a route catch handler, process that first + if (catchHandler) { + { + // Still include URL here as it will be async from the console group + // and may not make sense without the URL + logger.groupCollapsed(`Error thrown when responding to: ` + ` ${getFriendlyURL(url)}. Falling back to route's Catch Handler.`); + logger.error(`Error thrown by:`, route); + logger.error(err); + logger.groupEnd(); + } + try { + return await catchHandler.handle({ + url, + request, + event, + params + }); + } catch (catchErr) { + if (catchErr instanceof Error) { + err = catchErr; + } + } + } + if (this._catchHandler) { + { + // Still include URL here as it will be async from the console group + // and may not make sense without the URL + logger.groupCollapsed(`Error thrown when responding to: ` + ` ${getFriendlyURL(url)}. Falling back to global Catch Handler.`); + logger.error(`Error thrown by:`, route); + logger.error(err); + logger.groupEnd(); + } + return this._catchHandler.handle({ + url, + request, + event + }); + } + throw err; + }); + } + return responsePromise; + } + /** + * Checks a request and URL (and optionally an event) against the list of + * registered routes, and if there's a match, returns the corresponding + * route along with any params generated by the match. + * + * @param {Object} options + * @param {URL} options.url + * @param {boolean} options.sameOrigin The result of comparing `url.origin` + * against the current origin. + * @param {Request} options.request The request to match. + * @param {Event} options.event The corresponding event. + * @return {Object} An object with `route` and `params` properties. + * They are populated if a matching route was found or `undefined` + * otherwise. + */ + findMatchingRoute({ + url, + sameOrigin, + request, + event + }) { + const routes = this._routes.get(request.method) || []; + for (const route of routes) { + let params; + // route.match returns type any, not possible to change right now. + // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment + const matchResult = route.match({ + url, + sameOrigin, + request, + event + }); + if (matchResult) { + { + // Warn developers that using an async matchCallback is almost always + // not the right thing to do. + if (matchResult instanceof Promise) { + logger.warn(`While routing ${getFriendlyURL(url)}, an async ` + `matchCallback function was used. Please convert the ` + `following route to use a synchronous matchCallback function:`, route); + } + } + // See https://github.com/GoogleChrome/workbox/issues/2079 + // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment + params = matchResult; + if (Array.isArray(params) && params.length === 0) { + // Instead of passing an empty array in as params, use undefined. + params = undefined; + } else if (matchResult.constructor === Object && + // eslint-disable-line + Object.keys(matchResult).length === 0) { + // Instead of passing an empty object in as params, use undefined. + params = undefined; + } else if (typeof matchResult === 'boolean') { + // For the boolean value true (rather than just something truth-y), + // don't set params. + // See https://github.com/GoogleChrome/workbox/pull/2134#issuecomment-513924353 + params = undefined; + } + // Return early if have a match. + return { + route, + params + }; + } + } + // If no match was found above, return and empty object. + return {}; + } + /** + * Define a default `handler` that's called when no routes explicitly + * match the incoming request. + * + * Each HTTP method ('GET', 'POST', etc.) gets its own default handler. + * + * Without a default handler, unmatched requests will go against the + * network as if there were no service worker present. + * + * @param {workbox-routing~handlerCallback} handler A callback + * function that returns a Promise resulting in a Response. + * @param {string} [method='GET'] The HTTP method to associate with this + * default handler. Each method has its own default. + */ + setDefaultHandler(handler, method = defaultMethod) { + this._defaultHandlerMap.set(method, normalizeHandler(handler)); + } + /** + * If a Route throws an error while handling a request, this `handler` + * will be called and given a chance to provide a response. + * + * @param {workbox-routing~handlerCallback} handler A callback + * function that returns a Promise resulting in a Response. + */ + setCatchHandler(handler) { + this._catchHandler = normalizeHandler(handler); + } + /** + * Registers a route with the router. + * + * @param {workbox-routing.Route} route The route to register. + */ + registerRoute(route) { + { + finalAssertExports.isType(route, 'object', { + moduleName: 'workbox-routing', + className: 'Router', + funcName: 'registerRoute', + paramName: 'route' + }); + finalAssertExports.hasMethod(route, 'match', { + moduleName: 'workbox-routing', + className: 'Router', + funcName: 'registerRoute', + paramName: 'route' + }); + finalAssertExports.isType(route.handler, 'object', { + moduleName: 'workbox-routing', + className: 'Router', + funcName: 'registerRoute', + paramName: 'route' + }); + finalAssertExports.hasMethod(route.handler, 'handle', { + moduleName: 'workbox-routing', + className: 'Router', + funcName: 'registerRoute', + paramName: 'route.handler' + }); + finalAssertExports.isType(route.method, 'string', { + moduleName: 'workbox-routing', + className: 'Router', + funcName: 'registerRoute', + paramName: 'route.method' + }); + } + if (!this._routes.has(route.method)) { + this._routes.set(route.method, []); + } + // Give precedence to all of the earlier routes by adding this additional + // route to the end of the array. + this._routes.get(route.method).push(route); + } + /** + * Unregisters a route with the router. + * + * @param {workbox-routing.Route} route The route to unregister. + */ + unregisterRoute(route) { + if (!this._routes.has(route.method)) { + throw new WorkboxError('unregister-route-but-not-found-with-method', { + method: route.method + }); + } + const routeIndex = this._routes.get(route.method).indexOf(route); + if (routeIndex > -1) { + this._routes.get(route.method).splice(routeIndex, 1); + } else { + throw new WorkboxError('unregister-route-route-not-registered'); + } + } + } + + /* + Copyright 2019 Google LLC + + Use of this source code is governed by an MIT-style + license that can be found in the LICENSE file or at + https://opensource.org/licenses/MIT. + */ + let defaultRouter; + /** + * Creates a new, singleton Router instance if one does not exist. If one + * does already exist, that instance is returned. + * + * @private + * @return {Router} + */ + const getOrCreateDefaultRouter = () => { + if (!defaultRouter) { + defaultRouter = new Router(); + // The helpers that use the default Router assume these listeners exist. + defaultRouter.addFetchListener(); + defaultRouter.addCacheListener(); + } + return defaultRouter; + }; + + /* + Copyright 2019 Google LLC + + Use of this source code is governed by an MIT-style + license that can be found in the LICENSE file or at + https://opensource.org/licenses/MIT. + */ + /** + * Easily register a RegExp, string, or function with a caching + * strategy to a singleton Router instance. + * + * This method will generate a Route for you if needed and + * call {@link workbox-routing.Router#registerRoute}. + * + * @param {RegExp|string|workbox-routing.Route~matchCallback|workbox-routing.Route} capture + * If the capture param is a `Route`, all other arguments will be ignored. + * @param {workbox-routing~handlerCallback} [handler] A callback + * function that returns a Promise resulting in a Response. This parameter + * is required if `capture` is not a `Route` object. + * @param {string} [method='GET'] The HTTP method to match the Route + * against. + * @return {workbox-routing.Route} The generated `Route`. + * + * @memberof workbox-routing + */ + function registerRoute(capture, handler, method) { + let route; + if (typeof capture === 'string') { + const captureUrl = new URL(capture, location.href); + { + if (!(capture.startsWith('/') || capture.startsWith('http'))) { + throw new WorkboxError('invalid-string', { + moduleName: 'workbox-routing', + funcName: 'registerRoute', + paramName: 'capture' + }); + } + // We want to check if Express-style wildcards are in the pathname only. + // TODO: Remove this log message in v4. + const valueToCheck = capture.startsWith('http') ? captureUrl.pathname : capture; + // See https://github.com/pillarjs/path-to-regexp#parameters + const wildcards = '[*:?+]'; + if (new RegExp(`${wildcards}`).exec(valueToCheck)) { + logger.debug(`The '$capture' parameter contains an Express-style wildcard ` + `character (${wildcards}). Strings are now always interpreted as ` + `exact matches; use a RegExp for partial or wildcard matches.`); + } + } + const matchCallback = ({ + url + }) => { + { + if (url.pathname === captureUrl.pathname && url.origin !== captureUrl.origin) { + logger.debug(`${capture} only partially matches the cross-origin URL ` + `${url.toString()}. This route will only handle cross-origin requests ` + `if they match the entire URL.`); + } + } + return url.href === captureUrl.href; + }; + // If `capture` is a string then `handler` and `method` must be present. + route = new Route(matchCallback, handler, method); + } else if (capture instanceof RegExp) { + // If `capture` is a `RegExp` then `handler` and `method` must be present. + route = new RegExpRoute(capture, handler, method); + } else if (typeof capture === 'function') { + // If `capture` is a function then `handler` and `method` must be present. + route = new Route(capture, handler, method); + } else if (capture instanceof Route) { + route = capture; + } else { + throw new WorkboxError('unsupported-route-type', { + moduleName: 'workbox-routing', + funcName: 'registerRoute', + paramName: 'capture' + }); + } + const defaultRouter = getOrCreateDefaultRouter(); + defaultRouter.registerRoute(route); + return route; + } + + // @ts-ignore + try { + self['workbox:strategies:6.5.4'] && _(); + } catch (e) {} + + /* + Copyright 2018 Google LLC + + Use of this source code is governed by an MIT-style + license that can be found in the LICENSE file or at + https://opensource.org/licenses/MIT. + */ + const cacheOkAndOpaquePlugin = { + /** + * Returns a valid response (to allow caching) if the status is 200 (OK) or + * 0 (opaque). + * + * @param {Object} options + * @param {Response} options.response + * @return {Response|null} + * + * @private + */ + cacheWillUpdate: async ({ + response + }) => { + if (response.status === 200 || response.status === 0) { + return response; + } + return null; + } + }; + + /* + Copyright 2018 Google LLC + + Use of this source code is governed by an MIT-style + license that can be found in the LICENSE file or at + https://opensource.org/licenses/MIT. + */ + const _cacheNameDetails = { + googleAnalytics: 'googleAnalytics', + precache: 'precache-v2', + prefix: 'workbox', + runtime: 'runtime', + suffix: typeof registration !== 'undefined' ? registration.scope : '' + }; + const _createCacheName = cacheName => { + return [_cacheNameDetails.prefix, cacheName, _cacheNameDetails.suffix].filter(value => value && value.length > 0).join('-'); + }; + const eachCacheNameDetail = fn => { + for (const key of Object.keys(_cacheNameDetails)) { + fn(key); + } + }; + const cacheNames = { + updateDetails: details => { + eachCacheNameDetail(key => { + if (typeof details[key] === 'string') { + _cacheNameDetails[key] = details[key]; + } + }); + }, + getGoogleAnalyticsName: userCacheName => { + return userCacheName || _createCacheName(_cacheNameDetails.googleAnalytics); + }, + getPrecacheName: userCacheName => { + return userCacheName || _createCacheName(_cacheNameDetails.precache); + }, + getPrefix: () => { + return _cacheNameDetails.prefix; + }, + getRuntimeName: userCacheName => { + return userCacheName || _createCacheName(_cacheNameDetails.runtime); + }, + getSuffix: () => { + return _cacheNameDetails.suffix; + } + }; + + /* + Copyright 2020 Google LLC + Use of this source code is governed by an MIT-style + license that can be found in the LICENSE file or at + https://opensource.org/licenses/MIT. + */ + function stripParams(fullURL, ignoreParams) { + const strippedURL = new URL(fullURL); + for (const param of ignoreParams) { + strippedURL.searchParams.delete(param); + } + return strippedURL.href; + } + /** + * Matches an item in the cache, ignoring specific URL params. This is similar + * to the `ignoreSearch` option, but it allows you to ignore just specific + * params (while continuing to match on the others). + * + * @private + * @param {Cache} cache + * @param {Request} request + * @param {Object} matchOptions + * @param {Array} ignoreParams + * @return {Promise} + */ + async function cacheMatchIgnoreParams(cache, request, ignoreParams, matchOptions) { + const strippedRequestURL = stripParams(request.url, ignoreParams); + // If the request doesn't include any ignored params, match as normal. + if (request.url === strippedRequestURL) { + return cache.match(request, matchOptions); + } + // Otherwise, match by comparing keys + const keysOptions = Object.assign(Object.assign({}, matchOptions), { + ignoreSearch: true + }); + const cacheKeys = await cache.keys(request, keysOptions); + for (const cacheKey of cacheKeys) { + const strippedCacheKeyURL = stripParams(cacheKey.url, ignoreParams); + if (strippedRequestURL === strippedCacheKeyURL) { + return cache.match(cacheKey, matchOptions); + } + } + return; + } + + /* + Copyright 2018 Google LLC + + Use of this source code is governed by an MIT-style + license that can be found in the LICENSE file or at + https://opensource.org/licenses/MIT. + */ + /** + * The Deferred class composes Promises in a way that allows for them to be + * resolved or rejected from outside the constructor. In most cases promises + * should be used directly, but Deferreds can be necessary when the logic to + * resolve a promise must be separate. + * + * @private + */ + class Deferred { + /** + * Creates a promise and exposes its resolve and reject functions as methods. + */ + constructor() { + this.promise = new Promise((resolve, reject) => { + this.resolve = resolve; + this.reject = reject; + }); + } + } + + /* + Copyright 2018 Google LLC + + Use of this source code is governed by an MIT-style + license that can be found in the LICENSE file or at + https://opensource.org/licenses/MIT. + */ + // Callbacks to be executed whenever there's a quota error. + // Can't change Function type right now. + // eslint-disable-next-line @typescript-eslint/ban-types + const quotaErrorCallbacks = new Set(); + + /* + Copyright 2018 Google LLC + + Use of this source code is governed by an MIT-style + license that can be found in the LICENSE file or at + https://opensource.org/licenses/MIT. + */ + /** + * Runs all of the callback functions, one at a time sequentially, in the order + * in which they were registered. + * + * @memberof workbox-core + * @private + */ + async function executeQuotaErrorCallbacks() { + { + logger.log(`About to run ${quotaErrorCallbacks.size} ` + `callbacks to clean up caches.`); + } + for (const callback of quotaErrorCallbacks) { + await callback(); + { + logger.log(callback, 'is complete.'); + } + } + { + logger.log('Finished running callbacks.'); + } + } + + /* + Copyright 2019 Google LLC + Use of this source code is governed by an MIT-style + license that can be found in the LICENSE file or at + https://opensource.org/licenses/MIT. + */ + /** + * Returns a promise that resolves and the passed number of milliseconds. + * This utility is an async/await-friendly version of `setTimeout`. + * + * @param {number} ms + * @return {Promise} + * @private + */ + function timeout(ms) { + return new Promise(resolve => setTimeout(resolve, ms)); + } + + /* + Copyright 2020 Google LLC + + Use of this source code is governed by an MIT-style + license that can be found in the LICENSE file or at + https://opensource.org/licenses/MIT. + */ + function toRequest(input) { + return typeof input === 'string' ? new Request(input) : input; + } + /** + * A class created every time a Strategy instance instance calls + * {@link workbox-strategies.Strategy~handle} or + * {@link workbox-strategies.Strategy~handleAll} that wraps all fetch and + * cache actions around plugin callbacks and keeps track of when the strategy + * is "done" (i.e. all added `event.waitUntil()` promises have resolved). + * + * @memberof workbox-strategies + */ + class StrategyHandler { + /** + * Creates a new instance associated with the passed strategy and event + * that's handling the request. + * + * The constructor also initializes the state that will be passed to each of + * the plugins handling this request. + * + * @param {workbox-strategies.Strategy} strategy + * @param {Object} options + * @param {Request|string} options.request A request to run this strategy for. + * @param {ExtendableEvent} options.event The event associated with the + * request. + * @param {URL} [options.url] + * @param {*} [options.params] The return value from the + * {@link workbox-routing~matchCallback} (if applicable). + */ + constructor(strategy, options) { + this._cacheKeys = {}; + /** + * The request the strategy is performing (passed to the strategy's + * `handle()` or `handleAll()` method). + * @name request + * @instance + * @type {Request} + * @memberof workbox-strategies.StrategyHandler + */ + /** + * The event associated with this request. + * @name event + * @instance + * @type {ExtendableEvent} + * @memberof workbox-strategies.StrategyHandler + */ + /** + * A `URL` instance of `request.url` (if passed to the strategy's + * `handle()` or `handleAll()` method). + * Note: the `url` param will be present if the strategy was invoked + * from a workbox `Route` object. + * @name url + * @instance + * @type {URL|undefined} + * @memberof workbox-strategies.StrategyHandler + */ + /** + * A `param` value (if passed to the strategy's + * `handle()` or `handleAll()` method). + * Note: the `param` param will be present if the strategy was invoked + * from a workbox `Route` object and the + * {@link workbox-routing~matchCallback} returned + * a truthy value (it will be that value). + * @name params + * @instance + * @type {*|undefined} + * @memberof workbox-strategies.StrategyHandler + */ + { + finalAssertExports.isInstance(options.event, ExtendableEvent, { + moduleName: 'workbox-strategies', + className: 'StrategyHandler', + funcName: 'constructor', + paramName: 'options.event' + }); + } + Object.assign(this, options); + this.event = options.event; + this._strategy = strategy; + this._handlerDeferred = new Deferred(); + this._extendLifetimePromises = []; + // Copy the plugins list (since it's mutable on the strategy), + // so any mutations don't affect this handler instance. + this._plugins = [...strategy.plugins]; + this._pluginStateMap = new Map(); + for (const plugin of this._plugins) { + this._pluginStateMap.set(plugin, {}); + } + this.event.waitUntil(this._handlerDeferred.promise); + } + /** + * Fetches a given request (and invokes any applicable plugin callback + * methods) using the `fetchOptions` (for non-navigation requests) and + * `plugins` defined on the `Strategy` object. + * + * The following plugin lifecycle methods are invoked when using this method: + * - `requestWillFetch()` + * - `fetchDidSucceed()` + * - `fetchDidFail()` + * + * @param {Request|string} input The URL or request to fetch. + * @return {Promise} + */ + async fetch(input) { + const { + event + } = this; + let request = toRequest(input); + if (request.mode === 'navigate' && event instanceof FetchEvent && event.preloadResponse) { + const possiblePreloadResponse = await event.preloadResponse; + if (possiblePreloadResponse) { + { + logger.log(`Using a preloaded navigation response for ` + `'${getFriendlyURL(request.url)}'`); + } + return possiblePreloadResponse; + } + } + // If there is a fetchDidFail plugin, we need to save a clone of the + // original request before it's either modified by a requestWillFetch + // plugin or before the original request's body is consumed via fetch(). + const originalRequest = this.hasCallback('fetchDidFail') ? request.clone() : null; + try { + for (const cb of this.iterateCallbacks('requestWillFetch')) { + request = await cb({ + request: request.clone(), + event + }); + } + } catch (err) { + if (err instanceof Error) { + throw new WorkboxError('plugin-error-request-will-fetch', { + thrownErrorMessage: err.message + }); + } + } + // The request can be altered by plugins with `requestWillFetch` making + // the original request (most likely from a `fetch` event) different + // from the Request we make. Pass both to `fetchDidFail` to aid debugging. + const pluginFilteredRequest = request.clone(); + try { + let fetchResponse; + // See https://github.com/GoogleChrome/workbox/issues/1796 + fetchResponse = await fetch(request, request.mode === 'navigate' ? undefined : this._strategy.fetchOptions); + if ("development" !== 'production') { + logger.debug(`Network request for ` + `'${getFriendlyURL(request.url)}' returned a response with ` + `status '${fetchResponse.status}'.`); + } + for (const callback of this.iterateCallbacks('fetchDidSucceed')) { + fetchResponse = await callback({ + event, + request: pluginFilteredRequest, + response: fetchResponse + }); + } + return fetchResponse; + } catch (error) { + { + logger.log(`Network request for ` + `'${getFriendlyURL(request.url)}' threw an error.`, error); + } + // `originalRequest` will only exist if a `fetchDidFail` callback + // is being used (see above). + if (originalRequest) { + await this.runCallbacks('fetchDidFail', { + error: error, + event, + originalRequest: originalRequest.clone(), + request: pluginFilteredRequest.clone() + }); + } + throw error; + } + } + /** + * Calls `this.fetch()` and (in the background) runs `this.cachePut()` on + * the response generated by `this.fetch()`. + * + * The call to `this.cachePut()` automatically invokes `this.waitUntil()`, + * so you do not have to manually call `waitUntil()` on the event. + * + * @param {Request|string} input The request or URL to fetch and cache. + * @return {Promise} + */ + async fetchAndCachePut(input) { + const response = await this.fetch(input); + const responseClone = response.clone(); + void this.waitUntil(this.cachePut(input, responseClone)); + return response; + } + /** + * Matches a request from the cache (and invokes any applicable plugin + * callback methods) using the `cacheName`, `matchOptions`, and `plugins` + * defined on the strategy object. + * + * The following plugin lifecycle methods are invoked when using this method: + * - cacheKeyWillByUsed() + * - cachedResponseWillByUsed() + * + * @param {Request|string} key The Request or URL to use as the cache key. + * @return {Promise} A matching response, if found. + */ + async cacheMatch(key) { + const request = toRequest(key); + let cachedResponse; + const { + cacheName, + matchOptions + } = this._strategy; + const effectiveRequest = await this.getCacheKey(request, 'read'); + const multiMatchOptions = Object.assign(Object.assign({}, matchOptions), { + cacheName + }); + cachedResponse = await caches.match(effectiveRequest, multiMatchOptions); + { + if (cachedResponse) { + logger.debug(`Found a cached response in '${cacheName}'.`); + } else { + logger.debug(`No cached response found in '${cacheName}'.`); + } + } + for (const callback of this.iterateCallbacks('cachedResponseWillBeUsed')) { + cachedResponse = (await callback({ + cacheName, + matchOptions, + cachedResponse, + request: effectiveRequest, + event: this.event + })) || undefined; + } + return cachedResponse; + } + /** + * Puts a request/response pair in the cache (and invokes any applicable + * plugin callback methods) using the `cacheName` and `plugins` defined on + * the strategy object. + * + * The following plugin lifecycle methods are invoked when using this method: + * - cacheKeyWillByUsed() + * - cacheWillUpdate() + * - cacheDidUpdate() + * + * @param {Request|string} key The request or URL to use as the cache key. + * @param {Response} response The response to cache. + * @return {Promise} `false` if a cacheWillUpdate caused the response + * not be cached, and `true` otherwise. + */ + async cachePut(key, response) { + const request = toRequest(key); + // Run in the next task to avoid blocking other cache reads. + // https://github.com/w3c/ServiceWorker/issues/1397 + await timeout(0); + const effectiveRequest = await this.getCacheKey(request, 'write'); + { + if (effectiveRequest.method && effectiveRequest.method !== 'GET') { + throw new WorkboxError('attempt-to-cache-non-get-request', { + url: getFriendlyURL(effectiveRequest.url), + method: effectiveRequest.method + }); + } + // See https://github.com/GoogleChrome/workbox/issues/2818 + const vary = response.headers.get('Vary'); + if (vary) { + logger.debug(`The response for ${getFriendlyURL(effectiveRequest.url)} ` + `has a 'Vary: ${vary}' header. ` + `Consider setting the {ignoreVary: true} option on your strategy ` + `to ensure cache matching and deletion works as expected.`); + } + } + if (!response) { + { + logger.error(`Cannot cache non-existent response for ` + `'${getFriendlyURL(effectiveRequest.url)}'.`); + } + throw new WorkboxError('cache-put-with-no-response', { + url: getFriendlyURL(effectiveRequest.url) + }); + } + const responseToCache = await this._ensureResponseSafeToCache(response); + if (!responseToCache) { + { + logger.debug(`Response '${getFriendlyURL(effectiveRequest.url)}' ` + `will not be cached.`, responseToCache); + } + return false; + } + const { + cacheName, + matchOptions + } = this._strategy; + const cache = await self.caches.open(cacheName); + const hasCacheUpdateCallback = this.hasCallback('cacheDidUpdate'); + const oldResponse = hasCacheUpdateCallback ? await cacheMatchIgnoreParams( + // TODO(philipwalton): the `__WB_REVISION__` param is a precaching + // feature. Consider into ways to only add this behavior if using + // precaching. + cache, effectiveRequest.clone(), ['__WB_REVISION__'], matchOptions) : null; + { + logger.debug(`Updating the '${cacheName}' cache with a new Response ` + `for ${getFriendlyURL(effectiveRequest.url)}.`); + } + try { + await cache.put(effectiveRequest, hasCacheUpdateCallback ? responseToCache.clone() : responseToCache); + } catch (error) { + if (error instanceof Error) { + // See https://developer.mozilla.org/en-US/docs/Web/API/DOMException#exception-QuotaExceededError + if (error.name === 'QuotaExceededError') { + await executeQuotaErrorCallbacks(); + } + throw error; + } + } + for (const callback of this.iterateCallbacks('cacheDidUpdate')) { + await callback({ + cacheName, + oldResponse, + newResponse: responseToCache.clone(), + request: effectiveRequest, + event: this.event + }); + } + return true; + } + /** + * Checks the list of plugins for the `cacheKeyWillBeUsed` callback, and + * executes any of those callbacks found in sequence. The final `Request` + * object returned by the last plugin is treated as the cache key for cache + * reads and/or writes. If no `cacheKeyWillBeUsed` plugin callbacks have + * been registered, the passed request is returned unmodified + * + * @param {Request} request + * @param {string} mode + * @return {Promise} + */ + async getCacheKey(request, mode) { + const key = `${request.url} | ${mode}`; + if (!this._cacheKeys[key]) { + let effectiveRequest = request; + for (const callback of this.iterateCallbacks('cacheKeyWillBeUsed')) { + effectiveRequest = toRequest(await callback({ + mode, + request: effectiveRequest, + event: this.event, + // params has a type any can't change right now. + params: this.params // eslint-disable-line + })); + } + this._cacheKeys[key] = effectiveRequest; + } + return this._cacheKeys[key]; + } + /** + * Returns true if the strategy has at least one plugin with the given + * callback. + * + * @param {string} name The name of the callback to check for. + * @return {boolean} + */ + hasCallback(name) { + for (const plugin of this._strategy.plugins) { + if (name in plugin) { + return true; + } + } + return false; + } + /** + * Runs all plugin callbacks matching the given name, in order, passing the + * given param object (merged ith the current plugin state) as the only + * argument. + * + * Note: since this method runs all plugins, it's not suitable for cases + * where the return value of a callback needs to be applied prior to calling + * the next callback. See + * {@link workbox-strategies.StrategyHandler#iterateCallbacks} + * below for how to handle that case. + * + * @param {string} name The name of the callback to run within each plugin. + * @param {Object} param The object to pass as the first (and only) param + * when executing each callback. This object will be merged with the + * current plugin state prior to callback execution. + */ + async runCallbacks(name, param) { + for (const callback of this.iterateCallbacks(name)) { + // TODO(philipwalton): not sure why `any` is needed. It seems like + // this should work with `as WorkboxPluginCallbackParam[C]`. + await callback(param); + } + } + /** + * Accepts a callback and returns an iterable of matching plugin callbacks, + * where each callback is wrapped with the current handler state (i.e. when + * you call each callback, whatever object parameter you pass it will + * be merged with the plugin's current state). + * + * @param {string} name The name fo the callback to run + * @return {Array} + */ + *iterateCallbacks(name) { + for (const plugin of this._strategy.plugins) { + if (typeof plugin[name] === 'function') { + const state = this._pluginStateMap.get(plugin); + const statefulCallback = param => { + const statefulParam = Object.assign(Object.assign({}, param), { + state + }); + // TODO(philipwalton): not sure why `any` is needed. It seems like + // this should work with `as WorkboxPluginCallbackParam[C]`. + return plugin[name](statefulParam); + }; + yield statefulCallback; + } + } + } + /** + * Adds a promise to the + * [extend lifetime promises]{@link https://w3c.github.io/ServiceWorker/#extendableevent-extend-lifetime-promises} + * of the event event associated with the request being handled (usually a + * `FetchEvent`). + * + * Note: you can await + * {@link workbox-strategies.StrategyHandler~doneWaiting} + * to know when all added promises have settled. + * + * @param {Promise} promise A promise to add to the extend lifetime promises + * of the event that triggered the request. + */ + waitUntil(promise) { + this._extendLifetimePromises.push(promise); + return promise; + } + /** + * Returns a promise that resolves once all promises passed to + * {@link workbox-strategies.StrategyHandler~waitUntil} + * have settled. + * + * Note: any work done after `doneWaiting()` settles should be manually + * passed to an event's `waitUntil()` method (not this handler's + * `waitUntil()` method), otherwise the service worker thread my be killed + * prior to your work completing. + */ + async doneWaiting() { + let promise; + while (promise = this._extendLifetimePromises.shift()) { + await promise; + } + } + /** + * Stops running the strategy and immediately resolves any pending + * `waitUntil()` promises. + */ + destroy() { + this._handlerDeferred.resolve(null); + } + /** + * This method will call cacheWillUpdate on the available plugins (or use + * status === 200) to determine if the Response is safe and valid to cache. + * + * @param {Request} options.request + * @param {Response} options.response + * @return {Promise} + * + * @private + */ + async _ensureResponseSafeToCache(response) { + let responseToCache = response; + let pluginsUsed = false; + for (const callback of this.iterateCallbacks('cacheWillUpdate')) { + responseToCache = (await callback({ + request: this.request, + response: responseToCache, + event: this.event + })) || undefined; + pluginsUsed = true; + if (!responseToCache) { + break; + } + } + if (!pluginsUsed) { + if (responseToCache && responseToCache.status !== 200) { + responseToCache = undefined; + } + { + if (responseToCache) { + if (responseToCache.status !== 200) { + if (responseToCache.status === 0) { + logger.warn(`The response for '${this.request.url}' ` + `is an opaque response. The caching strategy that you're ` + `using will not cache opaque responses by default.`); + } else { + logger.debug(`The response for '${this.request.url}' ` + `returned a status code of '${response.status}' and won't ` + `be cached as a result.`); + } + } + } + } + } + return responseToCache; + } + } + + /* + Copyright 2020 Google LLC + + Use of this source code is governed by an MIT-style + license that can be found in the LICENSE file or at + https://opensource.org/licenses/MIT. + */ + /** + * An abstract base class that all other strategy classes must extend from: + * + * @memberof workbox-strategies + */ + class Strategy { + /** + * Creates a new instance of the strategy and sets all documented option + * properties as public instance properties. + * + * Note: if a custom strategy class extends the base Strategy class and does + * not need more than these properties, it does not need to define its own + * constructor. + * + * @param {Object} [options] + * @param {string} [options.cacheName] Cache name to store and retrieve + * requests. Defaults to the cache names provided by + * {@link workbox-core.cacheNames}. + * @param {Array} [options.plugins] [Plugins]{@link https://developers.google.com/web/tools/workbox/guides/using-plugins} + * to use in conjunction with this caching strategy. + * @param {Object} [options.fetchOptions] Values passed along to the + * [`init`](https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/fetch#Parameters) + * of [non-navigation](https://github.com/GoogleChrome/workbox/issues/1796) + * `fetch()` requests made by this strategy. + * @param {Object} [options.matchOptions] The + * [`CacheQueryOptions`]{@link https://w3c.github.io/ServiceWorker/#dictdef-cachequeryoptions} + * for any `cache.match()` or `cache.put()` calls made by this strategy. + */ + constructor(options = {}) { + /** + * Cache name to store and retrieve + * requests. Defaults to the cache names provided by + * {@link workbox-core.cacheNames}. + * + * @type {string} + */ + this.cacheName = cacheNames.getRuntimeName(options.cacheName); + /** + * The list + * [Plugins]{@link https://developers.google.com/web/tools/workbox/guides/using-plugins} + * used by this strategy. + * + * @type {Array} + */ + this.plugins = options.plugins || []; + /** + * Values passed along to the + * [`init`]{@link https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/fetch#Parameters} + * of all fetch() requests made by this strategy. + * + * @type {Object} + */ + this.fetchOptions = options.fetchOptions; + /** + * The + * [`CacheQueryOptions`]{@link https://w3c.github.io/ServiceWorker/#dictdef-cachequeryoptions} + * for any `cache.match()` or `cache.put()` calls made by this strategy. + * + * @type {Object} + */ + this.matchOptions = options.matchOptions; + } + /** + * Perform a request strategy and returns a `Promise` that will resolve with + * a `Response`, invoking all relevant plugin callbacks. + * + * When a strategy instance is registered with a Workbox + * {@link workbox-routing.Route}, this method is automatically + * called when the route matches. + * + * Alternatively, this method can be used in a standalone `FetchEvent` + * listener by passing it to `event.respondWith()`. + * + * @param {FetchEvent|Object} options A `FetchEvent` or an object with the + * properties listed below. + * @param {Request|string} options.request A request to run this strategy for. + * @param {ExtendableEvent} options.event The event associated with the + * request. + * @param {URL} [options.url] + * @param {*} [options.params] + */ + handle(options) { + const [responseDone] = this.handleAll(options); + return responseDone; + } + /** + * Similar to {@link workbox-strategies.Strategy~handle}, but + * instead of just returning a `Promise` that resolves to a `Response` it + * it will return an tuple of `[response, done]` promises, where the former + * (`response`) is equivalent to what `handle()` returns, and the latter is a + * Promise that will resolve once any promises that were added to + * `event.waitUntil()` as part of performing the strategy have completed. + * + * You can await the `done` promise to ensure any extra work performed by + * the strategy (usually caching responses) completes successfully. + * + * @param {FetchEvent|Object} options A `FetchEvent` or an object with the + * properties listed below. + * @param {Request|string} options.request A request to run this strategy for. + * @param {ExtendableEvent} options.event The event associated with the + * request. + * @param {URL} [options.url] + * @param {*} [options.params] + * @return {Array} A tuple of [response, done] + * promises that can be used to determine when the response resolves as + * well as when the handler has completed all its work. + */ + handleAll(options) { + // Allow for flexible options to be passed. + if (options instanceof FetchEvent) { + options = { + event: options, + request: options.request + }; + } + const event = options.event; + const request = typeof options.request === 'string' ? new Request(options.request) : options.request; + const params = 'params' in options ? options.params : undefined; + const handler = new StrategyHandler(this, { + event, + request, + params + }); + const responseDone = this._getResponse(handler, request, event); + const handlerDone = this._awaitComplete(responseDone, handler, request, event); + // Return an array of promises, suitable for use with Promise.all(). + return [responseDone, handlerDone]; + } + async _getResponse(handler, request, event) { + await handler.runCallbacks('handlerWillStart', { + event, + request + }); + let response = undefined; + try { + response = await this._handle(request, handler); + // The "official" Strategy subclasses all throw this error automatically, + // but in case a third-party Strategy doesn't, ensure that we have a + // consistent failure when there's no response or an error response. + if (!response || response.type === 'error') { + throw new WorkboxError('no-response', { + url: request.url + }); + } + } catch (error) { + if (error instanceof Error) { + for (const callback of handler.iterateCallbacks('handlerDidError')) { + response = await callback({ + error, + event, + request + }); + if (response) { + break; + } + } + } + if (!response) { + throw error; + } else { + logger.log(`While responding to '${getFriendlyURL(request.url)}', ` + `an ${error instanceof Error ? error.toString() : ''} error occurred. Using a fallback response provided by ` + `a handlerDidError plugin.`); + } + } + for (const callback of handler.iterateCallbacks('handlerWillRespond')) { + response = await callback({ + event, + request, + response + }); + } + return response; + } + async _awaitComplete(responseDone, handler, request, event) { + let response; + let error; + try { + response = await responseDone; + } catch (error) { + // Ignore errors, as response errors should be caught via the `response` + // promise above. The `done` promise will only throw for errors in + // promises passed to `handler.waitUntil()`. + } + try { + await handler.runCallbacks('handlerDidRespond', { + event, + request, + response + }); + await handler.doneWaiting(); + } catch (waitUntilError) { + if (waitUntilError instanceof Error) { + error = waitUntilError; + } + } + await handler.runCallbacks('handlerDidComplete', { + event, + request, + response, + error: error + }); + handler.destroy(); + if (error) { + throw error; + } + } + } + /** + * Classes extending the `Strategy` based class should implement this method, + * and leverage the {@link workbox-strategies.StrategyHandler} + * arg to perform all fetching and cache logic, which will ensure all relevant + * cache, cache options, fetch options and plugins are used (per the current + * strategy instance). + * + * @name _handle + * @instance + * @abstract + * @function + * @param {Request} request + * @param {workbox-strategies.StrategyHandler} handler + * @return {Promise} + * + * @memberof workbox-strategies.Strategy + */ + + /* + Copyright 2018 Google LLC + + Use of this source code is governed by an MIT-style + license that can be found in the LICENSE file or at + https://opensource.org/licenses/MIT. + */ + const messages = { + strategyStart: (strategyName, request) => `Using ${strategyName} to respond to '${getFriendlyURL(request.url)}'`, + printFinalResponse: response => { + if (response) { + logger.groupCollapsed(`View the final response here.`); + logger.log(response || '[No response returned]'); + logger.groupEnd(); + } + } + }; + + /* + Copyright 2018 Google LLC + + Use of this source code is governed by an MIT-style + license that can be found in the LICENSE file or at + https://opensource.org/licenses/MIT. + */ + /** + * An implementation of a + * [network first](https://developer.chrome.com/docs/workbox/caching-strategies-overview/#network-first-falling-back-to-cache) + * request strategy. + * + * By default, this strategy will cache responses with a 200 status code as + * well as [opaque responses](https://developer.chrome.com/docs/workbox/caching-resources-during-runtime/#opaque-responses). + * Opaque responses are are cross-origin requests where the response doesn't + * support [CORS](https://enable-cors.org/). + * + * If the network request fails, and there is no cache match, this will throw + * a `WorkboxError` exception. + * + * @extends workbox-strategies.Strategy + * @memberof workbox-strategies + */ + class NetworkFirst extends Strategy { + /** + * @param {Object} [options] + * @param {string} [options.cacheName] Cache name to store and retrieve + * requests. Defaults to cache names provided by + * {@link workbox-core.cacheNames}. + * @param {Array} [options.plugins] [Plugins]{@link https://developers.google.com/web/tools/workbox/guides/using-plugins} + * to use in conjunction with this caching strategy. + * @param {Object} [options.fetchOptions] Values passed along to the + * [`init`](https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/fetch#Parameters) + * of [non-navigation](https://github.com/GoogleChrome/workbox/issues/1796) + * `fetch()` requests made by this strategy. + * @param {Object} [options.matchOptions] [`CacheQueryOptions`](https://w3c.github.io/ServiceWorker/#dictdef-cachequeryoptions) + * @param {number} [options.networkTimeoutSeconds] If set, any network requests + * that fail to respond within the timeout will fallback to the cache. + * + * This option can be used to combat + * "[lie-fi]{@link https://developers.google.com/web/fundamentals/performance/poor-connectivity/#lie-fi}" + * scenarios. + */ + constructor(options = {}) { + super(options); + // If this instance contains no plugins with a 'cacheWillUpdate' callback, + // prepend the `cacheOkAndOpaquePlugin` plugin to the plugins list. + if (!this.plugins.some(p => 'cacheWillUpdate' in p)) { + this.plugins.unshift(cacheOkAndOpaquePlugin); + } + this._networkTimeoutSeconds = options.networkTimeoutSeconds || 0; + { + if (this._networkTimeoutSeconds) { + finalAssertExports.isType(this._networkTimeoutSeconds, 'number', { + moduleName: 'workbox-strategies', + className: this.constructor.name, + funcName: 'constructor', + paramName: 'networkTimeoutSeconds' + }); + } + } + } + /** + * @private + * @param {Request|string} request A request to run this strategy for. + * @param {workbox-strategies.StrategyHandler} handler The event that + * triggered the request. + * @return {Promise} + */ + async _handle(request, handler) { + const logs = []; + { + finalAssertExports.isInstance(request, Request, { + moduleName: 'workbox-strategies', + className: this.constructor.name, + funcName: 'handle', + paramName: 'makeRequest' + }); + } + const promises = []; + let timeoutId; + if (this._networkTimeoutSeconds) { + const { + id, + promise + } = this._getTimeoutPromise({ + request, + logs, + handler + }); + timeoutId = id; + promises.push(promise); + } + const networkPromise = this._getNetworkPromise({ + timeoutId, + request, + logs, + handler + }); + promises.push(networkPromise); + const response = await handler.waitUntil((async () => { + // Promise.race() will resolve as soon as the first promise resolves. + return (await handler.waitUntil(Promise.race(promises))) || ( + // If Promise.race() resolved with null, it might be due to a network + // timeout + a cache miss. If that were to happen, we'd rather wait until + // the networkPromise resolves instead of returning null. + // Note that it's fine to await an already-resolved promise, so we don't + // have to check to see if it's still "in flight". + await networkPromise); + })()); + { + logger.groupCollapsed(messages.strategyStart(this.constructor.name, request)); + for (const log of logs) { + logger.log(log); + } + messages.printFinalResponse(response); + logger.groupEnd(); + } + if (!response) { + throw new WorkboxError('no-response', { + url: request.url + }); + } + return response; + } + /** + * @param {Object} options + * @param {Request} options.request + * @param {Array} options.logs A reference to the logs array + * @param {Event} options.event + * @return {Promise} + * + * @private + */ + _getTimeoutPromise({ + request, + logs, + handler + }) { + let timeoutId; + const timeoutPromise = new Promise(resolve => { + const onNetworkTimeout = async () => { + { + logs.push(`Timing out the network response at ` + `${this._networkTimeoutSeconds} seconds.`); + } + resolve(await handler.cacheMatch(request)); + }; + timeoutId = setTimeout(onNetworkTimeout, this._networkTimeoutSeconds * 1000); + }); + return { + promise: timeoutPromise, + id: timeoutId + }; + } + /** + * @param {Object} options + * @param {number|undefined} options.timeoutId + * @param {Request} options.request + * @param {Array} options.logs A reference to the logs Array. + * @param {Event} options.event + * @return {Promise} + * + * @private + */ + async _getNetworkPromise({ + timeoutId, + request, + logs, + handler + }) { + let error; + let response; + try { + response = await handler.fetchAndCachePut(request); + } catch (fetchError) { + if (fetchError instanceof Error) { + error = fetchError; + } + } + if (timeoutId) { + clearTimeout(timeoutId); + } + { + if (response) { + logs.push(`Got response from network.`); + } else { + logs.push(`Unable to get a response from the network. Will respond ` + `with a cached response.`); + } + } + if (error || !response) { + response = await handler.cacheMatch(request); + { + if (response) { + logs.push(`Found a cached response in the '${this.cacheName}'` + ` cache.`); + } else { + logs.push(`No response found in the '${this.cacheName}' cache.`); + } + } + } + return response; + } + } + + /* + Copyright 2018 Google LLC + + Use of this source code is governed by an MIT-style + license that can be found in the LICENSE file or at + https://opensource.org/licenses/MIT. + */ + /** + * An implementation of a + * [network-only](https://developer.chrome.com/docs/workbox/caching-strategies-overview/#network-only) + * request strategy. + * + * This class is useful if you want to take advantage of any + * [Workbox plugins](https://developer.chrome.com/docs/workbox/using-plugins/). + * + * If the network request fails, this will throw a `WorkboxError` exception. + * + * @extends workbox-strategies.Strategy + * @memberof workbox-strategies + */ + class NetworkOnly extends Strategy { + /** + * @param {Object} [options] + * @param {Array} [options.plugins] [Plugins]{@link https://developers.google.com/web/tools/workbox/guides/using-plugins} + * to use in conjunction with this caching strategy. + * @param {Object} [options.fetchOptions] Values passed along to the + * [`init`](https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/fetch#Parameters) + * of [non-navigation](https://github.com/GoogleChrome/workbox/issues/1796) + * `fetch()` requests made by this strategy. + * @param {number} [options.networkTimeoutSeconds] If set, any network requests + * that fail to respond within the timeout will result in a network error. + */ + constructor(options = {}) { + super(options); + this._networkTimeoutSeconds = options.networkTimeoutSeconds || 0; + } + /** + * @private + * @param {Request|string} request A request to run this strategy for. + * @param {workbox-strategies.StrategyHandler} handler The event that + * triggered the request. + * @return {Promise} + */ + async _handle(request, handler) { + { + finalAssertExports.isInstance(request, Request, { + moduleName: 'workbox-strategies', + className: this.constructor.name, + funcName: '_handle', + paramName: 'request' + }); + } + let error = undefined; + let response; + try { + const promises = [handler.fetch(request)]; + if (this._networkTimeoutSeconds) { + const timeoutPromise = timeout(this._networkTimeoutSeconds * 1000); + promises.push(timeoutPromise); + } + response = await Promise.race(promises); + if (!response) { + throw new Error(`Timed out the network response after ` + `${this._networkTimeoutSeconds} seconds.`); + } + } catch (err) { + if (err instanceof Error) { + error = err; + } + } + { + logger.groupCollapsed(messages.strategyStart(this.constructor.name, request)); + if (response) { + logger.log(`Got response from network.`); + } else { + logger.log(`Unable to get a response from the network.`); + } + messages.printFinalResponse(response); + logger.groupEnd(); + } + if (!response) { + throw new WorkboxError('no-response', { + url: request.url, + error + }); + } + return response; + } + } + + /* + Copyright 2019 Google LLC + + Use of this source code is governed by an MIT-style + license that can be found in the LICENSE file or at + https://opensource.org/licenses/MIT. + */ + /** + * Claim any currently available clients once the service worker + * becomes active. This is normally used in conjunction with `skipWaiting()`. + * + * @memberof workbox-core + */ + function clientsClaim() { + self.addEventListener('activate', () => self.clients.claim()); + } + + exports.NetworkFirst = NetworkFirst; + exports.NetworkOnly = NetworkOnly; + exports.clientsClaim = clientsClaim; + exports.registerRoute = registerRoute; + +})); +//# sourceMappingURL=workbox-8817a5e5.js.map diff --git a/public/workbox-8817a5e5.js.map b/public/workbox-8817a5e5.js.map new file mode 100644 index 0000000..484021e --- /dev/null +++ b/public/workbox-8817a5e5.js.map @@ -0,0 +1 @@ +{"version":3,"file":"workbox-8817a5e5.js","sources":["node_modules/.pnpm/workbox-core@6.6.0/node_modules/workbox-core/_version.js","node_modules/.pnpm/workbox-core@6.6.0/node_modules/workbox-core/_private/logger.js","node_modules/.pnpm/workbox-core@6.6.0/node_modules/workbox-core/models/messages/messages.js","node_modules/.pnpm/workbox-core@6.6.0/node_modules/workbox-core/models/messages/messageGenerator.js","node_modules/.pnpm/workbox-core@6.6.0/node_modules/workbox-core/_private/WorkboxError.js","node_modules/.pnpm/workbox-core@6.6.0/node_modules/workbox-core/_private/assert.js","node_modules/.pnpm/workbox-routing@6.6.0/node_modules/workbox-routing/_version.js","node_modules/.pnpm/workbox-routing@6.6.0/node_modules/workbox-routing/utils/constants.js","node_modules/.pnpm/workbox-routing@6.6.0/node_modules/workbox-routing/utils/normalizeHandler.js","node_modules/.pnpm/workbox-routing@6.6.0/node_modules/workbox-routing/Route.js","node_modules/.pnpm/workbox-routing@6.6.0/node_modules/workbox-routing/RegExpRoute.js","node_modules/.pnpm/workbox-core@6.6.0/node_modules/workbox-core/_private/getFriendlyURL.js","node_modules/.pnpm/workbox-routing@6.6.0/node_modules/workbox-routing/Router.js","node_modules/.pnpm/workbox-routing@6.6.0/node_modules/workbox-routing/utils/getOrCreateDefaultRouter.js","node_modules/.pnpm/workbox-routing@6.6.0/node_modules/workbox-routing/registerRoute.js","node_modules/.pnpm/workbox-strategies@6.6.0/node_modules/workbox-strategies/_version.js","node_modules/.pnpm/workbox-strategies@6.6.0/node_modules/workbox-strategies/plugins/cacheOkAndOpaquePlugin.js","node_modules/.pnpm/workbox-core@6.6.0/node_modules/workbox-core/_private/cacheNames.js","node_modules/.pnpm/workbox-core@6.6.0/node_modules/workbox-core/_private/cacheMatchIgnoreParams.js","node_modules/.pnpm/workbox-core@6.6.0/node_modules/workbox-core/_private/Deferred.js","node_modules/.pnpm/workbox-core@6.6.0/node_modules/workbox-core/models/quotaErrorCallbacks.js","node_modules/.pnpm/workbox-core@6.6.0/node_modules/workbox-core/_private/executeQuotaErrorCallbacks.js","node_modules/.pnpm/workbox-core@6.6.0/node_modules/workbox-core/_private/timeout.js","node_modules/.pnpm/workbox-strategies@6.6.0/node_modules/workbox-strategies/StrategyHandler.js","node_modules/.pnpm/workbox-strategies@6.6.0/node_modules/workbox-strategies/Strategy.js","node_modules/.pnpm/workbox-strategies@6.6.0/node_modules/workbox-strategies/utils/messages.js","node_modules/.pnpm/workbox-strategies@6.6.0/node_modules/workbox-strategies/NetworkFirst.js","node_modules/.pnpm/workbox-strategies@6.6.0/node_modules/workbox-strategies/NetworkOnly.js","node_modules/.pnpm/workbox-core@6.6.0/node_modules/workbox-core/clientsClaim.js"],"sourcesContent":["\"use strict\";\n// @ts-ignore\ntry {\n self['workbox:core:6.5.4'] && _();\n}\ncatch (e) { }\n","/*\n Copyright 2019 Google LLC\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\nimport '../_version.js';\nconst logger = (process.env.NODE_ENV === 'production'\n ? null\n : (() => {\n // Don't overwrite this value if it's already set.\n // See https://github.com/GoogleChrome/workbox/pull/2284#issuecomment-560470923\n if (!('__WB_DISABLE_DEV_LOGS' in globalThis)) {\n self.__WB_DISABLE_DEV_LOGS = false;\n }\n let inGroup = false;\n const methodToColorMap = {\n debug: `#7f8c8d`,\n log: `#2ecc71`,\n warn: `#f39c12`,\n error: `#c0392b`,\n groupCollapsed: `#3498db`,\n groupEnd: null, // No colored prefix on groupEnd\n };\n const print = function (method, args) {\n if (self.__WB_DISABLE_DEV_LOGS) {\n return;\n }\n if (method === 'groupCollapsed') {\n // Safari doesn't print all console.groupCollapsed() arguments:\n // https://bugs.webkit.org/show_bug.cgi?id=182754\n if (/^((?!chrome|android).)*safari/i.test(navigator.userAgent)) {\n console[method](...args);\n return;\n }\n }\n const styles = [\n `background: ${methodToColorMap[method]}`,\n `border-radius: 0.5em`,\n `color: white`,\n `font-weight: bold`,\n `padding: 2px 0.5em`,\n ];\n // When in a group, the workbox prefix is not displayed.\n const logPrefix = inGroup ? [] : ['%cworkbox', styles.join(';')];\n console[method](...logPrefix, ...args);\n if (method === 'groupCollapsed') {\n inGroup = true;\n }\n if (method === 'groupEnd') {\n inGroup = false;\n }\n };\n // eslint-disable-next-line @typescript-eslint/ban-types\n const api = {};\n const loggerMethods = Object.keys(methodToColorMap);\n for (const key of loggerMethods) {\n const method = key;\n api[method] = (...args) => {\n print(method, args);\n };\n }\n return api;\n })());\nexport { logger };\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\nimport '../../_version.js';\nexport const messages = {\n 'invalid-value': ({ paramName, validValueDescription, value }) => {\n if (!paramName || !validValueDescription) {\n throw new Error(`Unexpected input to 'invalid-value' error.`);\n }\n return (`The '${paramName}' parameter was given a value with an ` +\n `unexpected value. ${validValueDescription} Received a value of ` +\n `${JSON.stringify(value)}.`);\n },\n 'not-an-array': ({ moduleName, className, funcName, paramName }) => {\n if (!moduleName || !className || !funcName || !paramName) {\n throw new Error(`Unexpected input to 'not-an-array' error.`);\n }\n return (`The parameter '${paramName}' passed into ` +\n `'${moduleName}.${className}.${funcName}()' must be an array.`);\n },\n 'incorrect-type': ({ expectedType, paramName, moduleName, className, funcName, }) => {\n if (!expectedType || !paramName || !moduleName || !funcName) {\n throw new Error(`Unexpected input to 'incorrect-type' error.`);\n }\n const classNameStr = className ? `${className}.` : '';\n return (`The parameter '${paramName}' passed into ` +\n `'${moduleName}.${classNameStr}` +\n `${funcName}()' must be of type ${expectedType}.`);\n },\n 'incorrect-class': ({ expectedClassName, paramName, moduleName, className, funcName, isReturnValueProblem, }) => {\n if (!expectedClassName || !moduleName || !funcName) {\n throw new Error(`Unexpected input to 'incorrect-class' error.`);\n }\n const classNameStr = className ? `${className}.` : '';\n if (isReturnValueProblem) {\n return (`The return value from ` +\n `'${moduleName}.${classNameStr}${funcName}()' ` +\n `must be an instance of class ${expectedClassName}.`);\n }\n return (`The parameter '${paramName}' passed into ` +\n `'${moduleName}.${classNameStr}${funcName}()' ` +\n `must be an instance of class ${expectedClassName}.`);\n },\n 'missing-a-method': ({ expectedMethod, paramName, moduleName, className, funcName, }) => {\n if (!expectedMethod ||\n !paramName ||\n !moduleName ||\n !className ||\n !funcName) {\n throw new Error(`Unexpected input to 'missing-a-method' error.`);\n }\n return (`${moduleName}.${className}.${funcName}() expected the ` +\n `'${paramName}' parameter to expose a '${expectedMethod}' method.`);\n },\n 'add-to-cache-list-unexpected-type': ({ entry }) => {\n return (`An unexpected entry was passed to ` +\n `'workbox-precaching.PrecacheController.addToCacheList()' The entry ` +\n `'${JSON.stringify(entry)}' isn't supported. You must supply an array of ` +\n `strings with one or more characters, objects with a url property or ` +\n `Request objects.`);\n },\n 'add-to-cache-list-conflicting-entries': ({ firstEntry, secondEntry }) => {\n if (!firstEntry || !secondEntry) {\n throw new Error(`Unexpected input to ` + `'add-to-cache-list-duplicate-entries' error.`);\n }\n return (`Two of the entries passed to ` +\n `'workbox-precaching.PrecacheController.addToCacheList()' had the URL ` +\n `${firstEntry} but different revision details. Workbox is ` +\n `unable to cache and version the asset correctly. Please remove one ` +\n `of the entries.`);\n },\n 'plugin-error-request-will-fetch': ({ thrownErrorMessage }) => {\n if (!thrownErrorMessage) {\n throw new Error(`Unexpected input to ` + `'plugin-error-request-will-fetch', error.`);\n }\n return (`An error was thrown by a plugins 'requestWillFetch()' method. ` +\n `The thrown error message was: '${thrownErrorMessage}'.`);\n },\n 'invalid-cache-name': ({ cacheNameId, value }) => {\n if (!cacheNameId) {\n throw new Error(`Expected a 'cacheNameId' for error 'invalid-cache-name'`);\n }\n return (`You must provide a name containing at least one character for ` +\n `setCacheDetails({${cacheNameId}: '...'}). Received a value of ` +\n `'${JSON.stringify(value)}'`);\n },\n 'unregister-route-but-not-found-with-method': ({ method }) => {\n if (!method) {\n throw new Error(`Unexpected input to ` +\n `'unregister-route-but-not-found-with-method' error.`);\n }\n return (`The route you're trying to unregister was not previously ` +\n `registered for the method type '${method}'.`);\n },\n 'unregister-route-route-not-registered': () => {\n return (`The route you're trying to unregister was not previously ` +\n `registered.`);\n },\n 'queue-replay-failed': ({ name }) => {\n return `Replaying the background sync queue '${name}' failed.`;\n },\n 'duplicate-queue-name': ({ name }) => {\n return (`The Queue name '${name}' is already being used. ` +\n `All instances of backgroundSync.Queue must be given unique names.`);\n },\n 'expired-test-without-max-age': ({ methodName, paramName }) => {\n return (`The '${methodName}()' method can only be used when the ` +\n `'${paramName}' is used in the constructor.`);\n },\n 'unsupported-route-type': ({ moduleName, className, funcName, paramName }) => {\n return (`The supplied '${paramName}' parameter was an unsupported type. ` +\n `Please check the docs for ${moduleName}.${className}.${funcName} for ` +\n `valid input types.`);\n },\n 'not-array-of-class': ({ value, expectedClass, moduleName, className, funcName, paramName, }) => {\n return (`The supplied '${paramName}' parameter must be an array of ` +\n `'${expectedClass}' objects. Received '${JSON.stringify(value)},'. ` +\n `Please check the call to ${moduleName}.${className}.${funcName}() ` +\n `to fix the issue.`);\n },\n 'max-entries-or-age-required': ({ moduleName, className, funcName }) => {\n return (`You must define either config.maxEntries or config.maxAgeSeconds` +\n `in ${moduleName}.${className}.${funcName}`);\n },\n 'statuses-or-headers-required': ({ moduleName, className, funcName }) => {\n return (`You must define either config.statuses or config.headers` +\n `in ${moduleName}.${className}.${funcName}`);\n },\n 'invalid-string': ({ moduleName, funcName, paramName }) => {\n if (!paramName || !moduleName || !funcName) {\n throw new Error(`Unexpected input to 'invalid-string' error.`);\n }\n return (`When using strings, the '${paramName}' parameter must start with ` +\n `'http' (for cross-origin matches) or '/' (for same-origin matches). ` +\n `Please see the docs for ${moduleName}.${funcName}() for ` +\n `more info.`);\n },\n 'channel-name-required': () => {\n return (`You must provide a channelName to construct a ` +\n `BroadcastCacheUpdate instance.`);\n },\n 'invalid-responses-are-same-args': () => {\n return (`The arguments passed into responsesAreSame() appear to be ` +\n `invalid. Please ensure valid Responses are used.`);\n },\n 'expire-custom-caches-only': () => {\n return (`You must provide a 'cacheName' property when using the ` +\n `expiration plugin with a runtime caching strategy.`);\n },\n 'unit-must-be-bytes': ({ normalizedRangeHeader }) => {\n if (!normalizedRangeHeader) {\n throw new Error(`Unexpected input to 'unit-must-be-bytes' error.`);\n }\n return (`The 'unit' portion of the Range header must be set to 'bytes'. ` +\n `The Range header provided was \"${normalizedRangeHeader}\"`);\n },\n 'single-range-only': ({ normalizedRangeHeader }) => {\n if (!normalizedRangeHeader) {\n throw new Error(`Unexpected input to 'single-range-only' error.`);\n }\n return (`Multiple ranges are not supported. Please use a single start ` +\n `value, and optional end value. The Range header provided was ` +\n `\"${normalizedRangeHeader}\"`);\n },\n 'invalid-range-values': ({ normalizedRangeHeader }) => {\n if (!normalizedRangeHeader) {\n throw new Error(`Unexpected input to 'invalid-range-values' error.`);\n }\n return (`The Range header is missing both start and end values. At least ` +\n `one of those values is needed. The Range header provided was ` +\n `\"${normalizedRangeHeader}\"`);\n },\n 'no-range-header': () => {\n return `No Range header was found in the Request provided.`;\n },\n 'range-not-satisfiable': ({ size, start, end }) => {\n return (`The start (${start}) and end (${end}) values in the Range are ` +\n `not satisfiable by the cached response, which is ${size} bytes.`);\n },\n 'attempt-to-cache-non-get-request': ({ url, method }) => {\n return (`Unable to cache '${url}' because it is a '${method}' request and ` +\n `only 'GET' requests can be cached.`);\n },\n 'cache-put-with-no-response': ({ url }) => {\n return (`There was an attempt to cache '${url}' but the response was not ` +\n `defined.`);\n },\n 'no-response': ({ url, error }) => {\n let message = `The strategy could not generate a response for '${url}'.`;\n if (error) {\n message += ` The underlying error is ${error}.`;\n }\n return message;\n },\n 'bad-precaching-response': ({ url, status }) => {\n return (`The precaching request for '${url}' failed` +\n (status ? ` with an HTTP status of ${status}.` : `.`));\n },\n 'non-precached-url': ({ url }) => {\n return (`createHandlerBoundToURL('${url}') was called, but that URL is ` +\n `not precached. Please pass in a URL that is precached instead.`);\n },\n 'add-to-cache-list-conflicting-integrities': ({ url }) => {\n return (`Two of the entries passed to ` +\n `'workbox-precaching.PrecacheController.addToCacheList()' had the URL ` +\n `${url} with different integrity values. Please remove one of them.`);\n },\n 'missing-precache-entry': ({ cacheName, url }) => {\n return `Unable to find a precached response in ${cacheName} for ${url}.`;\n },\n 'cross-origin-copy-response': ({ origin }) => {\n return (`workbox-core.copyResponse() can only be used with same-origin ` +\n `responses. It was passed a response with origin ${origin}.`);\n },\n 'opaque-streams-source': ({ type }) => {\n const message = `One of the workbox-streams sources resulted in an ` +\n `'${type}' response.`;\n if (type === 'opaqueredirect') {\n return (`${message} Please do not use a navigation request that results ` +\n `in a redirect as a source.`);\n }\n return `${message} Please ensure your sources are CORS-enabled.`;\n },\n};\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\nimport { messages } from './messages.js';\nimport '../../_version.js';\nconst fallback = (code, ...args) => {\n let msg = code;\n if (args.length > 0) {\n msg += ` :: ${JSON.stringify(args)}`;\n }\n return msg;\n};\nconst generatorFunction = (code, details = {}) => {\n const message = messages[code];\n if (!message) {\n throw new Error(`Unable to find message for code '${code}'.`);\n }\n return message(details);\n};\nexport const messageGenerator = process.env.NODE_ENV === 'production' ? fallback : generatorFunction;\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\nimport { messageGenerator } from '../models/messages/messageGenerator.js';\nimport '../_version.js';\n/**\n * Workbox errors should be thrown with this class.\n * This allows use to ensure the type easily in tests,\n * helps developers identify errors from workbox\n * easily and allows use to optimise error\n * messages correctly.\n *\n * @private\n */\nclass WorkboxError extends Error {\n /**\n *\n * @param {string} errorCode The error code that\n * identifies this particular error.\n * @param {Object=} details Any relevant arguments\n * that will help developers identify issues should\n * be added as a key on the context object.\n */\n constructor(errorCode, details) {\n const message = messageGenerator(errorCode, details);\n super(message);\n this.name = errorCode;\n this.details = details;\n }\n}\nexport { WorkboxError };\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\nimport { WorkboxError } from '../_private/WorkboxError.js';\nimport '../_version.js';\n/*\n * This method throws if the supplied value is not an array.\n * The destructed values are required to produce a meaningful error for users.\n * The destructed and restructured object is so it's clear what is\n * needed.\n */\nconst isArray = (value, details) => {\n if (!Array.isArray(value)) {\n throw new WorkboxError('not-an-array', details);\n }\n};\nconst hasMethod = (object, expectedMethod, details) => {\n const type = typeof object[expectedMethod];\n if (type !== 'function') {\n details['expectedMethod'] = expectedMethod;\n throw new WorkboxError('missing-a-method', details);\n }\n};\nconst isType = (object, expectedType, details) => {\n if (typeof object !== expectedType) {\n details['expectedType'] = expectedType;\n throw new WorkboxError('incorrect-type', details);\n }\n};\nconst isInstance = (object, \n// Need the general type to do the check later.\n// eslint-disable-next-line @typescript-eslint/ban-types\nexpectedClass, details) => {\n if (!(object instanceof expectedClass)) {\n details['expectedClassName'] = expectedClass.name;\n throw new WorkboxError('incorrect-class', details);\n }\n};\nconst isOneOf = (value, validValues, details) => {\n if (!validValues.includes(value)) {\n details['validValueDescription'] = `Valid values are ${JSON.stringify(validValues)}.`;\n throw new WorkboxError('invalid-value', details);\n }\n};\nconst isArrayOfClass = (value, \n// Need general type to do check later.\nexpectedClass, // eslint-disable-line\ndetails) => {\n const error = new WorkboxError('not-array-of-class', details);\n if (!Array.isArray(value)) {\n throw error;\n }\n for (const item of value) {\n if (!(item instanceof expectedClass)) {\n throw error;\n }\n }\n};\nconst finalAssertExports = process.env.NODE_ENV === 'production'\n ? null\n : {\n hasMethod,\n isArray,\n isInstance,\n isOneOf,\n isType,\n isArrayOfClass,\n };\nexport { finalAssertExports as assert };\n","\"use strict\";\n// @ts-ignore\ntry {\n self['workbox:routing:6.5.4'] && _();\n}\ncatch (e) { }\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\nimport '../_version.js';\n/**\n * The default HTTP method, 'GET', used when there's no specific method\n * configured for a route.\n *\n * @type {string}\n *\n * @private\n */\nexport const defaultMethod = 'GET';\n/**\n * The list of valid HTTP methods associated with requests that could be routed.\n *\n * @type {Array}\n *\n * @private\n */\nexport const validMethods = [\n 'DELETE',\n 'GET',\n 'HEAD',\n 'PATCH',\n 'POST',\n 'PUT',\n];\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\nimport { assert } from 'workbox-core/_private/assert.js';\nimport '../_version.js';\n/**\n * @param {function()|Object} handler Either a function, or an object with a\n * 'handle' method.\n * @return {Object} An object with a handle method.\n *\n * @private\n */\nexport const normalizeHandler = (handler) => {\n if (handler && typeof handler === 'object') {\n if (process.env.NODE_ENV !== 'production') {\n assert.hasMethod(handler, 'handle', {\n moduleName: 'workbox-routing',\n className: 'Route',\n funcName: 'constructor',\n paramName: 'handler',\n });\n }\n return handler;\n }\n else {\n if (process.env.NODE_ENV !== 'production') {\n assert.isType(handler, 'function', {\n moduleName: 'workbox-routing',\n className: 'Route',\n funcName: 'constructor',\n paramName: 'handler',\n });\n }\n return { handle: handler };\n }\n};\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\nimport { assert } from 'workbox-core/_private/assert.js';\nimport { defaultMethod, validMethods } from './utils/constants.js';\nimport { normalizeHandler } from './utils/normalizeHandler.js';\nimport './_version.js';\n/**\n * A `Route` consists of a pair of callback functions, \"match\" and \"handler\".\n * The \"match\" callback determine if a route should be used to \"handle\" a\n * request by returning a non-falsy value if it can. The \"handler\" callback\n * is called when there is a match and should return a Promise that resolves\n * to a `Response`.\n *\n * @memberof workbox-routing\n */\nclass Route {\n /**\n * Constructor for Route class.\n *\n * @param {workbox-routing~matchCallback} match\n * A callback function that determines whether the route matches a given\n * `fetch` event by returning a non-falsy value.\n * @param {workbox-routing~handlerCallback} handler A callback\n * function that returns a Promise resolving to a Response.\n * @param {string} [method='GET'] The HTTP method to match the Route\n * against.\n */\n constructor(match, handler, method = defaultMethod) {\n if (process.env.NODE_ENV !== 'production') {\n assert.isType(match, 'function', {\n moduleName: 'workbox-routing',\n className: 'Route',\n funcName: 'constructor',\n paramName: 'match',\n });\n if (method) {\n assert.isOneOf(method, validMethods, { paramName: 'method' });\n }\n }\n // These values are referenced directly by Router so cannot be\n // altered by minificaton.\n this.handler = normalizeHandler(handler);\n this.match = match;\n this.method = method;\n }\n /**\n *\n * @param {workbox-routing-handlerCallback} handler A callback\n * function that returns a Promise resolving to a Response\n */\n setCatchHandler(handler) {\n this.catchHandler = normalizeHandler(handler);\n }\n}\nexport { Route };\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\nimport { assert } from 'workbox-core/_private/assert.js';\nimport { logger } from 'workbox-core/_private/logger.js';\nimport { Route } from './Route.js';\nimport './_version.js';\n/**\n * RegExpRoute makes it easy to create a regular expression based\n * {@link workbox-routing.Route}.\n *\n * For same-origin requests the RegExp only needs to match part of the URL. For\n * requests against third-party servers, you must define a RegExp that matches\n * the start of the URL.\n *\n * @memberof workbox-routing\n * @extends workbox-routing.Route\n */\nclass RegExpRoute extends Route {\n /**\n * If the regular expression contains\n * [capture groups]{@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp#grouping-back-references},\n * the captured values will be passed to the\n * {@link workbox-routing~handlerCallback} `params`\n * argument.\n *\n * @param {RegExp} regExp The regular expression to match against URLs.\n * @param {workbox-routing~handlerCallback} handler A callback\n * function that returns a Promise resulting in a Response.\n * @param {string} [method='GET'] The HTTP method to match the Route\n * against.\n */\n constructor(regExp, handler, method) {\n if (process.env.NODE_ENV !== 'production') {\n assert.isInstance(regExp, RegExp, {\n moduleName: 'workbox-routing',\n className: 'RegExpRoute',\n funcName: 'constructor',\n paramName: 'pattern',\n });\n }\n const match = ({ url }) => {\n const result = regExp.exec(url.href);\n // Return immediately if there's no match.\n if (!result) {\n return;\n }\n // Require that the match start at the first character in the URL string\n // if it's a cross-origin request.\n // See https://github.com/GoogleChrome/workbox/issues/281 for the context\n // behind this behavior.\n if (url.origin !== location.origin && result.index !== 0) {\n if (process.env.NODE_ENV !== 'production') {\n logger.debug(`The regular expression '${regExp.toString()}' only partially matched ` +\n `against the cross-origin URL '${url.toString()}'. RegExpRoute's will only ` +\n `handle cross-origin requests if they match the entire URL.`);\n }\n return;\n }\n // If the route matches, but there aren't any capture groups defined, then\n // this will return [], which is truthy and therefore sufficient to\n // indicate a match.\n // If there are capture groups, then it will return their values.\n return result.slice(1);\n };\n super(match, handler, method);\n }\n}\nexport { RegExpRoute };\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\nimport '../_version.js';\nconst getFriendlyURL = (url) => {\n const urlObj = new URL(String(url), location.href);\n // See https://github.com/GoogleChrome/workbox/issues/2323\n // We want to include everything, except for the origin if it's same-origin.\n return urlObj.href.replace(new RegExp(`^${location.origin}`), '');\n};\nexport { getFriendlyURL };\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\nimport { assert } from 'workbox-core/_private/assert.js';\nimport { getFriendlyURL } from 'workbox-core/_private/getFriendlyURL.js';\nimport { defaultMethod } from './utils/constants.js';\nimport { logger } from 'workbox-core/_private/logger.js';\nimport { normalizeHandler } from './utils/normalizeHandler.js';\nimport { WorkboxError } from 'workbox-core/_private/WorkboxError.js';\nimport './_version.js';\n/**\n * The Router can be used to process a `FetchEvent` using one or more\n * {@link workbox-routing.Route}, responding with a `Response` if\n * a matching route exists.\n *\n * If no route matches a given a request, the Router will use a \"default\"\n * handler if one is defined.\n *\n * Should the matching Route throw an error, the Router will use a \"catch\"\n * handler if one is defined to gracefully deal with issues and respond with a\n * Request.\n *\n * If a request matches multiple routes, the **earliest** registered route will\n * be used to respond to the request.\n *\n * @memberof workbox-routing\n */\nclass Router {\n /**\n * Initializes a new Router.\n */\n constructor() {\n this._routes = new Map();\n this._defaultHandlerMap = new Map();\n }\n /**\n * @return {Map>} routes A `Map` of HTTP\n * method name ('GET', etc.) to an array of all the corresponding `Route`\n * instances that are registered.\n */\n get routes() {\n return this._routes;\n }\n /**\n * Adds a fetch event listener to respond to events when a route matches\n * the event's request.\n */\n addFetchListener() {\n // See https://github.com/Microsoft/TypeScript/issues/28357#issuecomment-436484705\n self.addEventListener('fetch', ((event) => {\n const { request } = event;\n const responsePromise = this.handleRequest({ request, event });\n if (responsePromise) {\n event.respondWith(responsePromise);\n }\n }));\n }\n /**\n * Adds a message event listener for URLs to cache from the window.\n * This is useful to cache resources loaded on the page prior to when the\n * service worker started controlling it.\n *\n * The format of the message data sent from the window should be as follows.\n * Where the `urlsToCache` array may consist of URL strings or an array of\n * URL string + `requestInit` object (the same as you'd pass to `fetch()`).\n *\n * ```\n * {\n * type: 'CACHE_URLS',\n * payload: {\n * urlsToCache: [\n * './script1.js',\n * './script2.js',\n * ['./script3.js', {mode: 'no-cors'}],\n * ],\n * },\n * }\n * ```\n */\n addCacheListener() {\n // See https://github.com/Microsoft/TypeScript/issues/28357#issuecomment-436484705\n self.addEventListener('message', ((event) => {\n // event.data is type 'any'\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n if (event.data && event.data.type === 'CACHE_URLS') {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n const { payload } = event.data;\n if (process.env.NODE_ENV !== 'production') {\n logger.debug(`Caching URLs from the window`, payload.urlsToCache);\n }\n const requestPromises = Promise.all(payload.urlsToCache.map((entry) => {\n if (typeof entry === 'string') {\n entry = [entry];\n }\n const request = new Request(...entry);\n return this.handleRequest({ request, event });\n // TODO(philipwalton): TypeScript errors without this typecast for\n // some reason (probably a bug). The real type here should work but\n // doesn't: `Array | undefined>`.\n })); // TypeScript\n event.waitUntil(requestPromises);\n // If a MessageChannel was used, reply to the message on success.\n if (event.ports && event.ports[0]) {\n void requestPromises.then(() => event.ports[0].postMessage(true));\n }\n }\n }));\n }\n /**\n * Apply the routing rules to a FetchEvent object to get a Response from an\n * appropriate Route's handler.\n *\n * @param {Object} options\n * @param {Request} options.request The request to handle.\n * @param {ExtendableEvent} options.event The event that triggered the\n * request.\n * @return {Promise|undefined} A promise is returned if a\n * registered route can handle the request. If there is no matching\n * route and there's no `defaultHandler`, `undefined` is returned.\n */\n handleRequest({ request, event, }) {\n if (process.env.NODE_ENV !== 'production') {\n assert.isInstance(request, Request, {\n moduleName: 'workbox-routing',\n className: 'Router',\n funcName: 'handleRequest',\n paramName: 'options.request',\n });\n }\n const url = new URL(request.url, location.href);\n if (!url.protocol.startsWith('http')) {\n if (process.env.NODE_ENV !== 'production') {\n logger.debug(`Workbox Router only supports URLs that start with 'http'.`);\n }\n return;\n }\n const sameOrigin = url.origin === location.origin;\n const { params, route } = this.findMatchingRoute({\n event,\n request,\n sameOrigin,\n url,\n });\n let handler = route && route.handler;\n const debugMessages = [];\n if (process.env.NODE_ENV !== 'production') {\n if (handler) {\n debugMessages.push([`Found a route to handle this request:`, route]);\n if (params) {\n debugMessages.push([\n `Passing the following params to the route's handler:`,\n params,\n ]);\n }\n }\n }\n // If we don't have a handler because there was no matching route, then\n // fall back to defaultHandler if that's defined.\n const method = request.method;\n if (!handler && this._defaultHandlerMap.has(method)) {\n if (process.env.NODE_ENV !== 'production') {\n debugMessages.push(`Failed to find a matching route. Falling ` +\n `back to the default handler for ${method}.`);\n }\n handler = this._defaultHandlerMap.get(method);\n }\n if (!handler) {\n if (process.env.NODE_ENV !== 'production') {\n // No handler so Workbox will do nothing. If logs is set of debug\n // i.e. verbose, we should print out this information.\n logger.debug(`No route found for: ${getFriendlyURL(url)}`);\n }\n return;\n }\n if (process.env.NODE_ENV !== 'production') {\n // We have a handler, meaning Workbox is going to handle the route.\n // print the routing details to the console.\n logger.groupCollapsed(`Router is responding to: ${getFriendlyURL(url)}`);\n debugMessages.forEach((msg) => {\n if (Array.isArray(msg)) {\n logger.log(...msg);\n }\n else {\n logger.log(msg);\n }\n });\n logger.groupEnd();\n }\n // Wrap in try and catch in case the handle method throws a synchronous\n // error. It should still callback to the catch handler.\n let responsePromise;\n try {\n responsePromise = handler.handle({ url, request, event, params });\n }\n catch (err) {\n responsePromise = Promise.reject(err);\n }\n // Get route's catch handler, if it exists\n const catchHandler = route && route.catchHandler;\n if (responsePromise instanceof Promise &&\n (this._catchHandler || catchHandler)) {\n responsePromise = responsePromise.catch(async (err) => {\n // If there's a route catch handler, process that first\n if (catchHandler) {\n if (process.env.NODE_ENV !== 'production') {\n // Still include URL here as it will be async from the console group\n // and may not make sense without the URL\n logger.groupCollapsed(`Error thrown when responding to: ` +\n ` ${getFriendlyURL(url)}. Falling back to route's Catch Handler.`);\n logger.error(`Error thrown by:`, route);\n logger.error(err);\n logger.groupEnd();\n }\n try {\n return await catchHandler.handle({ url, request, event, params });\n }\n catch (catchErr) {\n if (catchErr instanceof Error) {\n err = catchErr;\n }\n }\n }\n if (this._catchHandler) {\n if (process.env.NODE_ENV !== 'production') {\n // Still include URL here as it will be async from the console group\n // and may not make sense without the URL\n logger.groupCollapsed(`Error thrown when responding to: ` +\n ` ${getFriendlyURL(url)}. Falling back to global Catch Handler.`);\n logger.error(`Error thrown by:`, route);\n logger.error(err);\n logger.groupEnd();\n }\n return this._catchHandler.handle({ url, request, event });\n }\n throw err;\n });\n }\n return responsePromise;\n }\n /**\n * Checks a request and URL (and optionally an event) against the list of\n * registered routes, and if there's a match, returns the corresponding\n * route along with any params generated by the match.\n *\n * @param {Object} options\n * @param {URL} options.url\n * @param {boolean} options.sameOrigin The result of comparing `url.origin`\n * against the current origin.\n * @param {Request} options.request The request to match.\n * @param {Event} options.event The corresponding event.\n * @return {Object} An object with `route` and `params` properties.\n * They are populated if a matching route was found or `undefined`\n * otherwise.\n */\n findMatchingRoute({ url, sameOrigin, request, event, }) {\n const routes = this._routes.get(request.method) || [];\n for (const route of routes) {\n let params;\n // route.match returns type any, not possible to change right now.\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n const matchResult = route.match({ url, sameOrigin, request, event });\n if (matchResult) {\n if (process.env.NODE_ENV !== 'production') {\n // Warn developers that using an async matchCallback is almost always\n // not the right thing to do.\n if (matchResult instanceof Promise) {\n logger.warn(`While routing ${getFriendlyURL(url)}, an async ` +\n `matchCallback function was used. Please convert the ` +\n `following route to use a synchronous matchCallback function:`, route);\n }\n }\n // See https://github.com/GoogleChrome/workbox/issues/2079\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n params = matchResult;\n if (Array.isArray(params) && params.length === 0) {\n // Instead of passing an empty array in as params, use undefined.\n params = undefined;\n }\n else if (matchResult.constructor === Object && // eslint-disable-line\n Object.keys(matchResult).length === 0) {\n // Instead of passing an empty object in as params, use undefined.\n params = undefined;\n }\n else if (typeof matchResult === 'boolean') {\n // For the boolean value true (rather than just something truth-y),\n // don't set params.\n // See https://github.com/GoogleChrome/workbox/pull/2134#issuecomment-513924353\n params = undefined;\n }\n // Return early if have a match.\n return { route, params };\n }\n }\n // If no match was found above, return and empty object.\n return {};\n }\n /**\n * Define a default `handler` that's called when no routes explicitly\n * match the incoming request.\n *\n * Each HTTP method ('GET', 'POST', etc.) gets its own default handler.\n *\n * Without a default handler, unmatched requests will go against the\n * network as if there were no service worker present.\n *\n * @param {workbox-routing~handlerCallback} handler A callback\n * function that returns a Promise resulting in a Response.\n * @param {string} [method='GET'] The HTTP method to associate with this\n * default handler. Each method has its own default.\n */\n setDefaultHandler(handler, method = defaultMethod) {\n this._defaultHandlerMap.set(method, normalizeHandler(handler));\n }\n /**\n * If a Route throws an error while handling a request, this `handler`\n * will be called and given a chance to provide a response.\n *\n * @param {workbox-routing~handlerCallback} handler A callback\n * function that returns a Promise resulting in a Response.\n */\n setCatchHandler(handler) {\n this._catchHandler = normalizeHandler(handler);\n }\n /**\n * Registers a route with the router.\n *\n * @param {workbox-routing.Route} route The route to register.\n */\n registerRoute(route) {\n if (process.env.NODE_ENV !== 'production') {\n assert.isType(route, 'object', {\n moduleName: 'workbox-routing',\n className: 'Router',\n funcName: 'registerRoute',\n paramName: 'route',\n });\n assert.hasMethod(route, 'match', {\n moduleName: 'workbox-routing',\n className: 'Router',\n funcName: 'registerRoute',\n paramName: 'route',\n });\n assert.isType(route.handler, 'object', {\n moduleName: 'workbox-routing',\n className: 'Router',\n funcName: 'registerRoute',\n paramName: 'route',\n });\n assert.hasMethod(route.handler, 'handle', {\n moduleName: 'workbox-routing',\n className: 'Router',\n funcName: 'registerRoute',\n paramName: 'route.handler',\n });\n assert.isType(route.method, 'string', {\n moduleName: 'workbox-routing',\n className: 'Router',\n funcName: 'registerRoute',\n paramName: 'route.method',\n });\n }\n if (!this._routes.has(route.method)) {\n this._routes.set(route.method, []);\n }\n // Give precedence to all of the earlier routes by adding this additional\n // route to the end of the array.\n this._routes.get(route.method).push(route);\n }\n /**\n * Unregisters a route with the router.\n *\n * @param {workbox-routing.Route} route The route to unregister.\n */\n unregisterRoute(route) {\n if (!this._routes.has(route.method)) {\n throw new WorkboxError('unregister-route-but-not-found-with-method', {\n method: route.method,\n });\n }\n const routeIndex = this._routes.get(route.method).indexOf(route);\n if (routeIndex > -1) {\n this._routes.get(route.method).splice(routeIndex, 1);\n }\n else {\n throw new WorkboxError('unregister-route-route-not-registered');\n }\n }\n}\nexport { Router };\n","/*\n Copyright 2019 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\nimport { Router } from '../Router.js';\nimport '../_version.js';\nlet defaultRouter;\n/**\n * Creates a new, singleton Router instance if one does not exist. If one\n * does already exist, that instance is returned.\n *\n * @private\n * @return {Router}\n */\nexport const getOrCreateDefaultRouter = () => {\n if (!defaultRouter) {\n defaultRouter = new Router();\n // The helpers that use the default Router assume these listeners exist.\n defaultRouter.addFetchListener();\n defaultRouter.addCacheListener();\n }\n return defaultRouter;\n};\n","/*\n Copyright 2019 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\nimport { logger } from 'workbox-core/_private/logger.js';\nimport { WorkboxError } from 'workbox-core/_private/WorkboxError.js';\nimport { Route } from './Route.js';\nimport { RegExpRoute } from './RegExpRoute.js';\nimport { getOrCreateDefaultRouter } from './utils/getOrCreateDefaultRouter.js';\nimport './_version.js';\n/**\n * Easily register a RegExp, string, or function with a caching\n * strategy to a singleton Router instance.\n *\n * This method will generate a Route for you if needed and\n * call {@link workbox-routing.Router#registerRoute}.\n *\n * @param {RegExp|string|workbox-routing.Route~matchCallback|workbox-routing.Route} capture\n * If the capture param is a `Route`, all other arguments will be ignored.\n * @param {workbox-routing~handlerCallback} [handler] A callback\n * function that returns a Promise resulting in a Response. This parameter\n * is required if `capture` is not a `Route` object.\n * @param {string} [method='GET'] The HTTP method to match the Route\n * against.\n * @return {workbox-routing.Route} The generated `Route`.\n *\n * @memberof workbox-routing\n */\nfunction registerRoute(capture, handler, method) {\n let route;\n if (typeof capture === 'string') {\n const captureUrl = new URL(capture, location.href);\n if (process.env.NODE_ENV !== 'production') {\n if (!(capture.startsWith('/') || capture.startsWith('http'))) {\n throw new WorkboxError('invalid-string', {\n moduleName: 'workbox-routing',\n funcName: 'registerRoute',\n paramName: 'capture',\n });\n }\n // We want to check if Express-style wildcards are in the pathname only.\n // TODO: Remove this log message in v4.\n const valueToCheck = capture.startsWith('http')\n ? captureUrl.pathname\n : capture;\n // See https://github.com/pillarjs/path-to-regexp#parameters\n const wildcards = '[*:?+]';\n if (new RegExp(`${wildcards}`).exec(valueToCheck)) {\n logger.debug(`The '$capture' parameter contains an Express-style wildcard ` +\n `character (${wildcards}). Strings are now always interpreted as ` +\n `exact matches; use a RegExp for partial or wildcard matches.`);\n }\n }\n const matchCallback = ({ url }) => {\n if (process.env.NODE_ENV !== 'production') {\n if (url.pathname === captureUrl.pathname &&\n url.origin !== captureUrl.origin) {\n logger.debug(`${capture} only partially matches the cross-origin URL ` +\n `${url.toString()}. This route will only handle cross-origin requests ` +\n `if they match the entire URL.`);\n }\n }\n return url.href === captureUrl.href;\n };\n // If `capture` is a string then `handler` and `method` must be present.\n route = new Route(matchCallback, handler, method);\n }\n else if (capture instanceof RegExp) {\n // If `capture` is a `RegExp` then `handler` and `method` must be present.\n route = new RegExpRoute(capture, handler, method);\n }\n else if (typeof capture === 'function') {\n // If `capture` is a function then `handler` and `method` must be present.\n route = new Route(capture, handler, method);\n }\n else if (capture instanceof Route) {\n route = capture;\n }\n else {\n throw new WorkboxError('unsupported-route-type', {\n moduleName: 'workbox-routing',\n funcName: 'registerRoute',\n paramName: 'capture',\n });\n }\n const defaultRouter = getOrCreateDefaultRouter();\n defaultRouter.registerRoute(route);\n return route;\n}\nexport { registerRoute };\n","\"use strict\";\n// @ts-ignore\ntry {\n self['workbox:strategies:6.5.4'] && _();\n}\ncatch (e) { }\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\nimport '../_version.js';\nexport const cacheOkAndOpaquePlugin = {\n /**\n * Returns a valid response (to allow caching) if the status is 200 (OK) or\n * 0 (opaque).\n *\n * @param {Object} options\n * @param {Response} options.response\n * @return {Response|null}\n *\n * @private\n */\n cacheWillUpdate: async ({ response }) => {\n if (response.status === 200 || response.status === 0) {\n return response;\n }\n return null;\n },\n};\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\nimport '../_version.js';\nconst _cacheNameDetails = {\n googleAnalytics: 'googleAnalytics',\n precache: 'precache-v2',\n prefix: 'workbox',\n runtime: 'runtime',\n suffix: typeof registration !== 'undefined' ? registration.scope : '',\n};\nconst _createCacheName = (cacheName) => {\n return [_cacheNameDetails.prefix, cacheName, _cacheNameDetails.suffix]\n .filter((value) => value && value.length > 0)\n .join('-');\n};\nconst eachCacheNameDetail = (fn) => {\n for (const key of Object.keys(_cacheNameDetails)) {\n fn(key);\n }\n};\nexport const cacheNames = {\n updateDetails: (details) => {\n eachCacheNameDetail((key) => {\n if (typeof details[key] === 'string') {\n _cacheNameDetails[key] = details[key];\n }\n });\n },\n getGoogleAnalyticsName: (userCacheName) => {\n return userCacheName || _createCacheName(_cacheNameDetails.googleAnalytics);\n },\n getPrecacheName: (userCacheName) => {\n return userCacheName || _createCacheName(_cacheNameDetails.precache);\n },\n getPrefix: () => {\n return _cacheNameDetails.prefix;\n },\n getRuntimeName: (userCacheName) => {\n return userCacheName || _createCacheName(_cacheNameDetails.runtime);\n },\n getSuffix: () => {\n return _cacheNameDetails.suffix;\n },\n};\n","/*\n Copyright 2020 Google LLC\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\nimport '../_version.js';\nfunction stripParams(fullURL, ignoreParams) {\n const strippedURL = new URL(fullURL);\n for (const param of ignoreParams) {\n strippedURL.searchParams.delete(param);\n }\n return strippedURL.href;\n}\n/**\n * Matches an item in the cache, ignoring specific URL params. This is similar\n * to the `ignoreSearch` option, but it allows you to ignore just specific\n * params (while continuing to match on the others).\n *\n * @private\n * @param {Cache} cache\n * @param {Request} request\n * @param {Object} matchOptions\n * @param {Array} ignoreParams\n * @return {Promise}\n */\nasync function cacheMatchIgnoreParams(cache, request, ignoreParams, matchOptions) {\n const strippedRequestURL = stripParams(request.url, ignoreParams);\n // If the request doesn't include any ignored params, match as normal.\n if (request.url === strippedRequestURL) {\n return cache.match(request, matchOptions);\n }\n // Otherwise, match by comparing keys\n const keysOptions = Object.assign(Object.assign({}, matchOptions), { ignoreSearch: true });\n const cacheKeys = await cache.keys(request, keysOptions);\n for (const cacheKey of cacheKeys) {\n const strippedCacheKeyURL = stripParams(cacheKey.url, ignoreParams);\n if (strippedRequestURL === strippedCacheKeyURL) {\n return cache.match(cacheKey, matchOptions);\n }\n }\n return;\n}\nexport { cacheMatchIgnoreParams };\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\nimport '../_version.js';\n/**\n * The Deferred class composes Promises in a way that allows for them to be\n * resolved or rejected from outside the constructor. In most cases promises\n * should be used directly, but Deferreds can be necessary when the logic to\n * resolve a promise must be separate.\n *\n * @private\n */\nclass Deferred {\n /**\n * Creates a promise and exposes its resolve and reject functions as methods.\n */\n constructor() {\n this.promise = new Promise((resolve, reject) => {\n this.resolve = resolve;\n this.reject = reject;\n });\n }\n}\nexport { Deferred };\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\nimport '../_version.js';\n// Callbacks to be executed whenever there's a quota error.\n// Can't change Function type right now.\n// eslint-disable-next-line @typescript-eslint/ban-types\nconst quotaErrorCallbacks = new Set();\nexport { quotaErrorCallbacks };\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\nimport { logger } from '../_private/logger.js';\nimport { quotaErrorCallbacks } from '../models/quotaErrorCallbacks.js';\nimport '../_version.js';\n/**\n * Runs all of the callback functions, one at a time sequentially, in the order\n * in which they were registered.\n *\n * @memberof workbox-core\n * @private\n */\nasync function executeQuotaErrorCallbacks() {\n if (process.env.NODE_ENV !== 'production') {\n logger.log(`About to run ${quotaErrorCallbacks.size} ` +\n `callbacks to clean up caches.`);\n }\n for (const callback of quotaErrorCallbacks) {\n await callback();\n if (process.env.NODE_ENV !== 'production') {\n logger.log(callback, 'is complete.');\n }\n }\n if (process.env.NODE_ENV !== 'production') {\n logger.log('Finished running callbacks.');\n }\n}\nexport { executeQuotaErrorCallbacks };\n","/*\n Copyright 2019 Google LLC\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\nimport '../_version.js';\n/**\n * Returns a promise that resolves and the passed number of milliseconds.\n * This utility is an async/await-friendly version of `setTimeout`.\n *\n * @param {number} ms\n * @return {Promise}\n * @private\n */\nexport function timeout(ms) {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n","/*\n Copyright 2020 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\nimport { assert } from 'workbox-core/_private/assert.js';\nimport { cacheMatchIgnoreParams } from 'workbox-core/_private/cacheMatchIgnoreParams.js';\nimport { Deferred } from 'workbox-core/_private/Deferred.js';\nimport { executeQuotaErrorCallbacks } from 'workbox-core/_private/executeQuotaErrorCallbacks.js';\nimport { getFriendlyURL } from 'workbox-core/_private/getFriendlyURL.js';\nimport { logger } from 'workbox-core/_private/logger.js';\nimport { timeout } from 'workbox-core/_private/timeout.js';\nimport { WorkboxError } from 'workbox-core/_private/WorkboxError.js';\nimport './_version.js';\nfunction toRequest(input) {\n return typeof input === 'string' ? new Request(input) : input;\n}\n/**\n * A class created every time a Strategy instance instance calls\n * {@link workbox-strategies.Strategy~handle} or\n * {@link workbox-strategies.Strategy~handleAll} that wraps all fetch and\n * cache actions around plugin callbacks and keeps track of when the strategy\n * is \"done\" (i.e. all added `event.waitUntil()` promises have resolved).\n *\n * @memberof workbox-strategies\n */\nclass StrategyHandler {\n /**\n * Creates a new instance associated with the passed strategy and event\n * that's handling the request.\n *\n * The constructor also initializes the state that will be passed to each of\n * the plugins handling this request.\n *\n * @param {workbox-strategies.Strategy} strategy\n * @param {Object} options\n * @param {Request|string} options.request A request to run this strategy for.\n * @param {ExtendableEvent} options.event The event associated with the\n * request.\n * @param {URL} [options.url]\n * @param {*} [options.params] The return value from the\n * {@link workbox-routing~matchCallback} (if applicable).\n */\n constructor(strategy, options) {\n this._cacheKeys = {};\n /**\n * The request the strategy is performing (passed to the strategy's\n * `handle()` or `handleAll()` method).\n * @name request\n * @instance\n * @type {Request}\n * @memberof workbox-strategies.StrategyHandler\n */\n /**\n * The event associated with this request.\n * @name event\n * @instance\n * @type {ExtendableEvent}\n * @memberof workbox-strategies.StrategyHandler\n */\n /**\n * A `URL` instance of `request.url` (if passed to the strategy's\n * `handle()` or `handleAll()` method).\n * Note: the `url` param will be present if the strategy was invoked\n * from a workbox `Route` object.\n * @name url\n * @instance\n * @type {URL|undefined}\n * @memberof workbox-strategies.StrategyHandler\n */\n /**\n * A `param` value (if passed to the strategy's\n * `handle()` or `handleAll()` method).\n * Note: the `param` param will be present if the strategy was invoked\n * from a workbox `Route` object and the\n * {@link workbox-routing~matchCallback} returned\n * a truthy value (it will be that value).\n * @name params\n * @instance\n * @type {*|undefined}\n * @memberof workbox-strategies.StrategyHandler\n */\n if (process.env.NODE_ENV !== 'production') {\n assert.isInstance(options.event, ExtendableEvent, {\n moduleName: 'workbox-strategies',\n className: 'StrategyHandler',\n funcName: 'constructor',\n paramName: 'options.event',\n });\n }\n Object.assign(this, options);\n this.event = options.event;\n this._strategy = strategy;\n this._handlerDeferred = new Deferred();\n this._extendLifetimePromises = [];\n // Copy the plugins list (since it's mutable on the strategy),\n // so any mutations don't affect this handler instance.\n this._plugins = [...strategy.plugins];\n this._pluginStateMap = new Map();\n for (const plugin of this._plugins) {\n this._pluginStateMap.set(plugin, {});\n }\n this.event.waitUntil(this._handlerDeferred.promise);\n }\n /**\n * Fetches a given request (and invokes any applicable plugin callback\n * methods) using the `fetchOptions` (for non-navigation requests) and\n * `plugins` defined on the `Strategy` object.\n *\n * The following plugin lifecycle methods are invoked when using this method:\n * - `requestWillFetch()`\n * - `fetchDidSucceed()`\n * - `fetchDidFail()`\n *\n * @param {Request|string} input The URL or request to fetch.\n * @return {Promise}\n */\n async fetch(input) {\n const { event } = this;\n let request = toRequest(input);\n if (request.mode === 'navigate' &&\n event instanceof FetchEvent &&\n event.preloadResponse) {\n const possiblePreloadResponse = (await event.preloadResponse);\n if (possiblePreloadResponse) {\n if (process.env.NODE_ENV !== 'production') {\n logger.log(`Using a preloaded navigation response for ` +\n `'${getFriendlyURL(request.url)}'`);\n }\n return possiblePreloadResponse;\n }\n }\n // If there is a fetchDidFail plugin, we need to save a clone of the\n // original request before it's either modified by a requestWillFetch\n // plugin or before the original request's body is consumed via fetch().\n const originalRequest = this.hasCallback('fetchDidFail')\n ? request.clone()\n : null;\n try {\n for (const cb of this.iterateCallbacks('requestWillFetch')) {\n request = await cb({ request: request.clone(), event });\n }\n }\n catch (err) {\n if (err instanceof Error) {\n throw new WorkboxError('plugin-error-request-will-fetch', {\n thrownErrorMessage: err.message,\n });\n }\n }\n // The request can be altered by plugins with `requestWillFetch` making\n // the original request (most likely from a `fetch` event) different\n // from the Request we make. Pass both to `fetchDidFail` to aid debugging.\n const pluginFilteredRequest = request.clone();\n try {\n let fetchResponse;\n // See https://github.com/GoogleChrome/workbox/issues/1796\n fetchResponse = await fetch(request, request.mode === 'navigate' ? undefined : this._strategy.fetchOptions);\n if (process.env.NODE_ENV !== 'production') {\n logger.debug(`Network request for ` +\n `'${getFriendlyURL(request.url)}' returned a response with ` +\n `status '${fetchResponse.status}'.`);\n }\n for (const callback of this.iterateCallbacks('fetchDidSucceed')) {\n fetchResponse = await callback({\n event,\n request: pluginFilteredRequest,\n response: fetchResponse,\n });\n }\n return fetchResponse;\n }\n catch (error) {\n if (process.env.NODE_ENV !== 'production') {\n logger.log(`Network request for ` +\n `'${getFriendlyURL(request.url)}' threw an error.`, error);\n }\n // `originalRequest` will only exist if a `fetchDidFail` callback\n // is being used (see above).\n if (originalRequest) {\n await this.runCallbacks('fetchDidFail', {\n error: error,\n event,\n originalRequest: originalRequest.clone(),\n request: pluginFilteredRequest.clone(),\n });\n }\n throw error;\n }\n }\n /**\n * Calls `this.fetch()` and (in the background) runs `this.cachePut()` on\n * the response generated by `this.fetch()`.\n *\n * The call to `this.cachePut()` automatically invokes `this.waitUntil()`,\n * so you do not have to manually call `waitUntil()` on the event.\n *\n * @param {Request|string} input The request or URL to fetch and cache.\n * @return {Promise}\n */\n async fetchAndCachePut(input) {\n const response = await this.fetch(input);\n const responseClone = response.clone();\n void this.waitUntil(this.cachePut(input, responseClone));\n return response;\n }\n /**\n * Matches a request from the cache (and invokes any applicable plugin\n * callback methods) using the `cacheName`, `matchOptions`, and `plugins`\n * defined on the strategy object.\n *\n * The following plugin lifecycle methods are invoked when using this method:\n * - cacheKeyWillByUsed()\n * - cachedResponseWillByUsed()\n *\n * @param {Request|string} key The Request or URL to use as the cache key.\n * @return {Promise} A matching response, if found.\n */\n async cacheMatch(key) {\n const request = toRequest(key);\n let cachedResponse;\n const { cacheName, matchOptions } = this._strategy;\n const effectiveRequest = await this.getCacheKey(request, 'read');\n const multiMatchOptions = Object.assign(Object.assign({}, matchOptions), { cacheName });\n cachedResponse = await caches.match(effectiveRequest, multiMatchOptions);\n if (process.env.NODE_ENV !== 'production') {\n if (cachedResponse) {\n logger.debug(`Found a cached response in '${cacheName}'.`);\n }\n else {\n logger.debug(`No cached response found in '${cacheName}'.`);\n }\n }\n for (const callback of this.iterateCallbacks('cachedResponseWillBeUsed')) {\n cachedResponse =\n (await callback({\n cacheName,\n matchOptions,\n cachedResponse,\n request: effectiveRequest,\n event: this.event,\n })) || undefined;\n }\n return cachedResponse;\n }\n /**\n * Puts a request/response pair in the cache (and invokes any applicable\n * plugin callback methods) using the `cacheName` and `plugins` defined on\n * the strategy object.\n *\n * The following plugin lifecycle methods are invoked when using this method:\n * - cacheKeyWillByUsed()\n * - cacheWillUpdate()\n * - cacheDidUpdate()\n *\n * @param {Request|string} key The request or URL to use as the cache key.\n * @param {Response} response The response to cache.\n * @return {Promise} `false` if a cacheWillUpdate caused the response\n * not be cached, and `true` otherwise.\n */\n async cachePut(key, response) {\n const request = toRequest(key);\n // Run in the next task to avoid blocking other cache reads.\n // https://github.com/w3c/ServiceWorker/issues/1397\n await timeout(0);\n const effectiveRequest = await this.getCacheKey(request, 'write');\n if (process.env.NODE_ENV !== 'production') {\n if (effectiveRequest.method && effectiveRequest.method !== 'GET') {\n throw new WorkboxError('attempt-to-cache-non-get-request', {\n url: getFriendlyURL(effectiveRequest.url),\n method: effectiveRequest.method,\n });\n }\n // See https://github.com/GoogleChrome/workbox/issues/2818\n const vary = response.headers.get('Vary');\n if (vary) {\n logger.debug(`The response for ${getFriendlyURL(effectiveRequest.url)} ` +\n `has a 'Vary: ${vary}' header. ` +\n `Consider setting the {ignoreVary: true} option on your strategy ` +\n `to ensure cache matching and deletion works as expected.`);\n }\n }\n if (!response) {\n if (process.env.NODE_ENV !== 'production') {\n logger.error(`Cannot cache non-existent response for ` +\n `'${getFriendlyURL(effectiveRequest.url)}'.`);\n }\n throw new WorkboxError('cache-put-with-no-response', {\n url: getFriendlyURL(effectiveRequest.url),\n });\n }\n const responseToCache = await this._ensureResponseSafeToCache(response);\n if (!responseToCache) {\n if (process.env.NODE_ENV !== 'production') {\n logger.debug(`Response '${getFriendlyURL(effectiveRequest.url)}' ` +\n `will not be cached.`, responseToCache);\n }\n return false;\n }\n const { cacheName, matchOptions } = this._strategy;\n const cache = await self.caches.open(cacheName);\n const hasCacheUpdateCallback = this.hasCallback('cacheDidUpdate');\n const oldResponse = hasCacheUpdateCallback\n ? await cacheMatchIgnoreParams(\n // TODO(philipwalton): the `__WB_REVISION__` param is a precaching\n // feature. Consider into ways to only add this behavior if using\n // precaching.\n cache, effectiveRequest.clone(), ['__WB_REVISION__'], matchOptions)\n : null;\n if (process.env.NODE_ENV !== 'production') {\n logger.debug(`Updating the '${cacheName}' cache with a new Response ` +\n `for ${getFriendlyURL(effectiveRequest.url)}.`);\n }\n try {\n await cache.put(effectiveRequest, hasCacheUpdateCallback ? responseToCache.clone() : responseToCache);\n }\n catch (error) {\n if (error instanceof Error) {\n // See https://developer.mozilla.org/en-US/docs/Web/API/DOMException#exception-QuotaExceededError\n if (error.name === 'QuotaExceededError') {\n await executeQuotaErrorCallbacks();\n }\n throw error;\n }\n }\n for (const callback of this.iterateCallbacks('cacheDidUpdate')) {\n await callback({\n cacheName,\n oldResponse,\n newResponse: responseToCache.clone(),\n request: effectiveRequest,\n event: this.event,\n });\n }\n return true;\n }\n /**\n * Checks the list of plugins for the `cacheKeyWillBeUsed` callback, and\n * executes any of those callbacks found in sequence. The final `Request`\n * object returned by the last plugin is treated as the cache key for cache\n * reads and/or writes. If no `cacheKeyWillBeUsed` plugin callbacks have\n * been registered, the passed request is returned unmodified\n *\n * @param {Request} request\n * @param {string} mode\n * @return {Promise}\n */\n async getCacheKey(request, mode) {\n const key = `${request.url} | ${mode}`;\n if (!this._cacheKeys[key]) {\n let effectiveRequest = request;\n for (const callback of this.iterateCallbacks('cacheKeyWillBeUsed')) {\n effectiveRequest = toRequest(await callback({\n mode,\n request: effectiveRequest,\n event: this.event,\n // params has a type any can't change right now.\n params: this.params, // eslint-disable-line\n }));\n }\n this._cacheKeys[key] = effectiveRequest;\n }\n return this._cacheKeys[key];\n }\n /**\n * Returns true if the strategy has at least one plugin with the given\n * callback.\n *\n * @param {string} name The name of the callback to check for.\n * @return {boolean}\n */\n hasCallback(name) {\n for (const plugin of this._strategy.plugins) {\n if (name in plugin) {\n return true;\n }\n }\n return false;\n }\n /**\n * Runs all plugin callbacks matching the given name, in order, passing the\n * given param object (merged ith the current plugin state) as the only\n * argument.\n *\n * Note: since this method runs all plugins, it's not suitable for cases\n * where the return value of a callback needs to be applied prior to calling\n * the next callback. See\n * {@link workbox-strategies.StrategyHandler#iterateCallbacks}\n * below for how to handle that case.\n *\n * @param {string} name The name of the callback to run within each plugin.\n * @param {Object} param The object to pass as the first (and only) param\n * when executing each callback. This object will be merged with the\n * current plugin state prior to callback execution.\n */\n async runCallbacks(name, param) {\n for (const callback of this.iterateCallbacks(name)) {\n // TODO(philipwalton): not sure why `any` is needed. It seems like\n // this should work with `as WorkboxPluginCallbackParam[C]`.\n await callback(param);\n }\n }\n /**\n * Accepts a callback and returns an iterable of matching plugin callbacks,\n * where each callback is wrapped with the current handler state (i.e. when\n * you call each callback, whatever object parameter you pass it will\n * be merged with the plugin's current state).\n *\n * @param {string} name The name fo the callback to run\n * @return {Array}\n */\n *iterateCallbacks(name) {\n for (const plugin of this._strategy.plugins) {\n if (typeof plugin[name] === 'function') {\n const state = this._pluginStateMap.get(plugin);\n const statefulCallback = (param) => {\n const statefulParam = Object.assign(Object.assign({}, param), { state });\n // TODO(philipwalton): not sure why `any` is needed. It seems like\n // this should work with `as WorkboxPluginCallbackParam[C]`.\n return plugin[name](statefulParam);\n };\n yield statefulCallback;\n }\n }\n }\n /**\n * Adds a promise to the\n * [extend lifetime promises]{@link https://w3c.github.io/ServiceWorker/#extendableevent-extend-lifetime-promises}\n * of the event event associated with the request being handled (usually a\n * `FetchEvent`).\n *\n * Note: you can await\n * {@link workbox-strategies.StrategyHandler~doneWaiting}\n * to know when all added promises have settled.\n *\n * @param {Promise} promise A promise to add to the extend lifetime promises\n * of the event that triggered the request.\n */\n waitUntil(promise) {\n this._extendLifetimePromises.push(promise);\n return promise;\n }\n /**\n * Returns a promise that resolves once all promises passed to\n * {@link workbox-strategies.StrategyHandler~waitUntil}\n * have settled.\n *\n * Note: any work done after `doneWaiting()` settles should be manually\n * passed to an event's `waitUntil()` method (not this handler's\n * `waitUntil()` method), otherwise the service worker thread my be killed\n * prior to your work completing.\n */\n async doneWaiting() {\n let promise;\n while ((promise = this._extendLifetimePromises.shift())) {\n await promise;\n }\n }\n /**\n * Stops running the strategy and immediately resolves any pending\n * `waitUntil()` promises.\n */\n destroy() {\n this._handlerDeferred.resolve(null);\n }\n /**\n * This method will call cacheWillUpdate on the available plugins (or use\n * status === 200) to determine if the Response is safe and valid to cache.\n *\n * @param {Request} options.request\n * @param {Response} options.response\n * @return {Promise}\n *\n * @private\n */\n async _ensureResponseSafeToCache(response) {\n let responseToCache = response;\n let pluginsUsed = false;\n for (const callback of this.iterateCallbacks('cacheWillUpdate')) {\n responseToCache =\n (await callback({\n request: this.request,\n response: responseToCache,\n event: this.event,\n })) || undefined;\n pluginsUsed = true;\n if (!responseToCache) {\n break;\n }\n }\n if (!pluginsUsed) {\n if (responseToCache && responseToCache.status !== 200) {\n responseToCache = undefined;\n }\n if (process.env.NODE_ENV !== 'production') {\n if (responseToCache) {\n if (responseToCache.status !== 200) {\n if (responseToCache.status === 0) {\n logger.warn(`The response for '${this.request.url}' ` +\n `is an opaque response. The caching strategy that you're ` +\n `using will not cache opaque responses by default.`);\n }\n else {\n logger.debug(`The response for '${this.request.url}' ` +\n `returned a status code of '${response.status}' and won't ` +\n `be cached as a result.`);\n }\n }\n }\n }\n }\n return responseToCache;\n }\n}\nexport { StrategyHandler };\n","/*\n Copyright 2020 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\nimport { cacheNames } from 'workbox-core/_private/cacheNames.js';\nimport { WorkboxError } from 'workbox-core/_private/WorkboxError.js';\nimport { logger } from 'workbox-core/_private/logger.js';\nimport { getFriendlyURL } from 'workbox-core/_private/getFriendlyURL.js';\nimport { StrategyHandler } from './StrategyHandler.js';\nimport './_version.js';\n/**\n * An abstract base class that all other strategy classes must extend from:\n *\n * @memberof workbox-strategies\n */\nclass Strategy {\n /**\n * Creates a new instance of the strategy and sets all documented option\n * properties as public instance properties.\n *\n * Note: if a custom strategy class extends the base Strategy class and does\n * not need more than these properties, it does not need to define its own\n * constructor.\n *\n * @param {Object} [options]\n * @param {string} [options.cacheName] Cache name to store and retrieve\n * requests. Defaults to the cache names provided by\n * {@link workbox-core.cacheNames}.\n * @param {Array} [options.plugins] [Plugins]{@link https://developers.google.com/web/tools/workbox/guides/using-plugins}\n * to use in conjunction with this caching strategy.\n * @param {Object} [options.fetchOptions] Values passed along to the\n * [`init`](https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/fetch#Parameters)\n * of [non-navigation](https://github.com/GoogleChrome/workbox/issues/1796)\n * `fetch()` requests made by this strategy.\n * @param {Object} [options.matchOptions] The\n * [`CacheQueryOptions`]{@link https://w3c.github.io/ServiceWorker/#dictdef-cachequeryoptions}\n * for any `cache.match()` or `cache.put()` calls made by this strategy.\n */\n constructor(options = {}) {\n /**\n * Cache name to store and retrieve\n * requests. Defaults to the cache names provided by\n * {@link workbox-core.cacheNames}.\n *\n * @type {string}\n */\n this.cacheName = cacheNames.getRuntimeName(options.cacheName);\n /**\n * The list\n * [Plugins]{@link https://developers.google.com/web/tools/workbox/guides/using-plugins}\n * used by this strategy.\n *\n * @type {Array}\n */\n this.plugins = options.plugins || [];\n /**\n * Values passed along to the\n * [`init`]{@link https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/fetch#Parameters}\n * of all fetch() requests made by this strategy.\n *\n * @type {Object}\n */\n this.fetchOptions = options.fetchOptions;\n /**\n * The\n * [`CacheQueryOptions`]{@link https://w3c.github.io/ServiceWorker/#dictdef-cachequeryoptions}\n * for any `cache.match()` or `cache.put()` calls made by this strategy.\n *\n * @type {Object}\n */\n this.matchOptions = options.matchOptions;\n }\n /**\n * Perform a request strategy and returns a `Promise` that will resolve with\n * a `Response`, invoking all relevant plugin callbacks.\n *\n * When a strategy instance is registered with a Workbox\n * {@link workbox-routing.Route}, this method is automatically\n * called when the route matches.\n *\n * Alternatively, this method can be used in a standalone `FetchEvent`\n * listener by passing it to `event.respondWith()`.\n *\n * @param {FetchEvent|Object} options A `FetchEvent` or an object with the\n * properties listed below.\n * @param {Request|string} options.request A request to run this strategy for.\n * @param {ExtendableEvent} options.event The event associated with the\n * request.\n * @param {URL} [options.url]\n * @param {*} [options.params]\n */\n handle(options) {\n const [responseDone] = this.handleAll(options);\n return responseDone;\n }\n /**\n * Similar to {@link workbox-strategies.Strategy~handle}, but\n * instead of just returning a `Promise` that resolves to a `Response` it\n * it will return an tuple of `[response, done]` promises, where the former\n * (`response`) is equivalent to what `handle()` returns, and the latter is a\n * Promise that will resolve once any promises that were added to\n * `event.waitUntil()` as part of performing the strategy have completed.\n *\n * You can await the `done` promise to ensure any extra work performed by\n * the strategy (usually caching responses) completes successfully.\n *\n * @param {FetchEvent|Object} options A `FetchEvent` or an object with the\n * properties listed below.\n * @param {Request|string} options.request A request to run this strategy for.\n * @param {ExtendableEvent} options.event The event associated with the\n * request.\n * @param {URL} [options.url]\n * @param {*} [options.params]\n * @return {Array} A tuple of [response, done]\n * promises that can be used to determine when the response resolves as\n * well as when the handler has completed all its work.\n */\n handleAll(options) {\n // Allow for flexible options to be passed.\n if (options instanceof FetchEvent) {\n options = {\n event: options,\n request: options.request,\n };\n }\n const event = options.event;\n const request = typeof options.request === 'string'\n ? new Request(options.request)\n : options.request;\n const params = 'params' in options ? options.params : undefined;\n const handler = new StrategyHandler(this, { event, request, params });\n const responseDone = this._getResponse(handler, request, event);\n const handlerDone = this._awaitComplete(responseDone, handler, request, event);\n // Return an array of promises, suitable for use with Promise.all().\n return [responseDone, handlerDone];\n }\n async _getResponse(handler, request, event) {\n await handler.runCallbacks('handlerWillStart', { event, request });\n let response = undefined;\n try {\n response = await this._handle(request, handler);\n // The \"official\" Strategy subclasses all throw this error automatically,\n // but in case a third-party Strategy doesn't, ensure that we have a\n // consistent failure when there's no response or an error response.\n if (!response || response.type === 'error') {\n throw new WorkboxError('no-response', { url: request.url });\n }\n }\n catch (error) {\n if (error instanceof Error) {\n for (const callback of handler.iterateCallbacks('handlerDidError')) {\n response = await callback({ error, event, request });\n if (response) {\n break;\n }\n }\n }\n if (!response) {\n throw error;\n }\n else if (process.env.NODE_ENV !== 'production') {\n logger.log(`While responding to '${getFriendlyURL(request.url)}', ` +\n `an ${error instanceof Error ? error.toString() : ''} error occurred. Using a fallback response provided by ` +\n `a handlerDidError plugin.`);\n }\n }\n for (const callback of handler.iterateCallbacks('handlerWillRespond')) {\n response = await callback({ event, request, response });\n }\n return response;\n }\n async _awaitComplete(responseDone, handler, request, event) {\n let response;\n let error;\n try {\n response = await responseDone;\n }\n catch (error) {\n // Ignore errors, as response errors should be caught via the `response`\n // promise above. The `done` promise will only throw for errors in\n // promises passed to `handler.waitUntil()`.\n }\n try {\n await handler.runCallbacks('handlerDidRespond', {\n event,\n request,\n response,\n });\n await handler.doneWaiting();\n }\n catch (waitUntilError) {\n if (waitUntilError instanceof Error) {\n error = waitUntilError;\n }\n }\n await handler.runCallbacks('handlerDidComplete', {\n event,\n request,\n response,\n error: error,\n });\n handler.destroy();\n if (error) {\n throw error;\n }\n }\n}\nexport { Strategy };\n/**\n * Classes extending the `Strategy` based class should implement this method,\n * and leverage the {@link workbox-strategies.StrategyHandler}\n * arg to perform all fetching and cache logic, which will ensure all relevant\n * cache, cache options, fetch options and plugins are used (per the current\n * strategy instance).\n *\n * @name _handle\n * @instance\n * @abstract\n * @function\n * @param {Request} request\n * @param {workbox-strategies.StrategyHandler} handler\n * @return {Promise}\n *\n * @memberof workbox-strategies.Strategy\n */\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\nimport { logger } from 'workbox-core/_private/logger.js';\nimport { getFriendlyURL } from 'workbox-core/_private/getFriendlyURL.js';\nimport '../_version.js';\nexport const messages = {\n strategyStart: (strategyName, request) => `Using ${strategyName} to respond to '${getFriendlyURL(request.url)}'`,\n printFinalResponse: (response) => {\n if (response) {\n logger.groupCollapsed(`View the final response here.`);\n logger.log(response || '[No response returned]');\n logger.groupEnd();\n }\n },\n};\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\nimport { assert } from 'workbox-core/_private/assert.js';\nimport { logger } from 'workbox-core/_private/logger.js';\nimport { WorkboxError } from 'workbox-core/_private/WorkboxError.js';\nimport { cacheOkAndOpaquePlugin } from './plugins/cacheOkAndOpaquePlugin.js';\nimport { Strategy } from './Strategy.js';\nimport { messages } from './utils/messages.js';\nimport './_version.js';\n/**\n * An implementation of a\n * [network first](https://developer.chrome.com/docs/workbox/caching-strategies-overview/#network-first-falling-back-to-cache)\n * request strategy.\n *\n * By default, this strategy will cache responses with a 200 status code as\n * well as [opaque responses](https://developer.chrome.com/docs/workbox/caching-resources-during-runtime/#opaque-responses).\n * Opaque responses are are cross-origin requests where the response doesn't\n * support [CORS](https://enable-cors.org/).\n *\n * If the network request fails, and there is no cache match, this will throw\n * a `WorkboxError` exception.\n *\n * @extends workbox-strategies.Strategy\n * @memberof workbox-strategies\n */\nclass NetworkFirst extends Strategy {\n /**\n * @param {Object} [options]\n * @param {string} [options.cacheName] Cache name to store and retrieve\n * requests. Defaults to cache names provided by\n * {@link workbox-core.cacheNames}.\n * @param {Array} [options.plugins] [Plugins]{@link https://developers.google.com/web/tools/workbox/guides/using-plugins}\n * to use in conjunction with this caching strategy.\n * @param {Object} [options.fetchOptions] Values passed along to the\n * [`init`](https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/fetch#Parameters)\n * of [non-navigation](https://github.com/GoogleChrome/workbox/issues/1796)\n * `fetch()` requests made by this strategy.\n * @param {Object} [options.matchOptions] [`CacheQueryOptions`](https://w3c.github.io/ServiceWorker/#dictdef-cachequeryoptions)\n * @param {number} [options.networkTimeoutSeconds] If set, any network requests\n * that fail to respond within the timeout will fallback to the cache.\n *\n * This option can be used to combat\n * \"[lie-fi]{@link https://developers.google.com/web/fundamentals/performance/poor-connectivity/#lie-fi}\"\n * scenarios.\n */\n constructor(options = {}) {\n super(options);\n // If this instance contains no plugins with a 'cacheWillUpdate' callback,\n // prepend the `cacheOkAndOpaquePlugin` plugin to the plugins list.\n if (!this.plugins.some((p) => 'cacheWillUpdate' in p)) {\n this.plugins.unshift(cacheOkAndOpaquePlugin);\n }\n this._networkTimeoutSeconds = options.networkTimeoutSeconds || 0;\n if (process.env.NODE_ENV !== 'production') {\n if (this._networkTimeoutSeconds) {\n assert.isType(this._networkTimeoutSeconds, 'number', {\n moduleName: 'workbox-strategies',\n className: this.constructor.name,\n funcName: 'constructor',\n paramName: 'networkTimeoutSeconds',\n });\n }\n }\n }\n /**\n * @private\n * @param {Request|string} request A request to run this strategy for.\n * @param {workbox-strategies.StrategyHandler} handler The event that\n * triggered the request.\n * @return {Promise}\n */\n async _handle(request, handler) {\n const logs = [];\n if (process.env.NODE_ENV !== 'production') {\n assert.isInstance(request, Request, {\n moduleName: 'workbox-strategies',\n className: this.constructor.name,\n funcName: 'handle',\n paramName: 'makeRequest',\n });\n }\n const promises = [];\n let timeoutId;\n if (this._networkTimeoutSeconds) {\n const { id, promise } = this._getTimeoutPromise({ request, logs, handler });\n timeoutId = id;\n promises.push(promise);\n }\n const networkPromise = this._getNetworkPromise({\n timeoutId,\n request,\n logs,\n handler,\n });\n promises.push(networkPromise);\n const response = await handler.waitUntil((async () => {\n // Promise.race() will resolve as soon as the first promise resolves.\n return ((await handler.waitUntil(Promise.race(promises))) ||\n // If Promise.race() resolved with null, it might be due to a network\n // timeout + a cache miss. If that were to happen, we'd rather wait until\n // the networkPromise resolves instead of returning null.\n // Note that it's fine to await an already-resolved promise, so we don't\n // have to check to see if it's still \"in flight\".\n (await networkPromise));\n })());\n if (process.env.NODE_ENV !== 'production') {\n logger.groupCollapsed(messages.strategyStart(this.constructor.name, request));\n for (const log of logs) {\n logger.log(log);\n }\n messages.printFinalResponse(response);\n logger.groupEnd();\n }\n if (!response) {\n throw new WorkboxError('no-response', { url: request.url });\n }\n return response;\n }\n /**\n * @param {Object} options\n * @param {Request} options.request\n * @param {Array} options.logs A reference to the logs array\n * @param {Event} options.event\n * @return {Promise}\n *\n * @private\n */\n _getTimeoutPromise({ request, logs, handler, }) {\n let timeoutId;\n const timeoutPromise = new Promise((resolve) => {\n const onNetworkTimeout = async () => {\n if (process.env.NODE_ENV !== 'production') {\n logs.push(`Timing out the network response at ` +\n `${this._networkTimeoutSeconds} seconds.`);\n }\n resolve(await handler.cacheMatch(request));\n };\n timeoutId = setTimeout(onNetworkTimeout, this._networkTimeoutSeconds * 1000);\n });\n return {\n promise: timeoutPromise,\n id: timeoutId,\n };\n }\n /**\n * @param {Object} options\n * @param {number|undefined} options.timeoutId\n * @param {Request} options.request\n * @param {Array} options.logs A reference to the logs Array.\n * @param {Event} options.event\n * @return {Promise}\n *\n * @private\n */\n async _getNetworkPromise({ timeoutId, request, logs, handler, }) {\n let error;\n let response;\n try {\n response = await handler.fetchAndCachePut(request);\n }\n catch (fetchError) {\n if (fetchError instanceof Error) {\n error = fetchError;\n }\n }\n if (timeoutId) {\n clearTimeout(timeoutId);\n }\n if (process.env.NODE_ENV !== 'production') {\n if (response) {\n logs.push(`Got response from network.`);\n }\n else {\n logs.push(`Unable to get a response from the network. Will respond ` +\n `with a cached response.`);\n }\n }\n if (error || !response) {\n response = await handler.cacheMatch(request);\n if (process.env.NODE_ENV !== 'production') {\n if (response) {\n logs.push(`Found a cached response in the '${this.cacheName}'` + ` cache.`);\n }\n else {\n logs.push(`No response found in the '${this.cacheName}' cache.`);\n }\n }\n }\n return response;\n }\n}\nexport { NetworkFirst };\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\nimport { assert } from 'workbox-core/_private/assert.js';\nimport { logger } from 'workbox-core/_private/logger.js';\nimport { timeout } from 'workbox-core/_private/timeout.js';\nimport { WorkboxError } from 'workbox-core/_private/WorkboxError.js';\nimport { Strategy } from './Strategy.js';\nimport { messages } from './utils/messages.js';\nimport './_version.js';\n/**\n * An implementation of a\n * [network-only](https://developer.chrome.com/docs/workbox/caching-strategies-overview/#network-only)\n * request strategy.\n *\n * This class is useful if you want to take advantage of any\n * [Workbox plugins](https://developer.chrome.com/docs/workbox/using-plugins/).\n *\n * If the network request fails, this will throw a `WorkboxError` exception.\n *\n * @extends workbox-strategies.Strategy\n * @memberof workbox-strategies\n */\nclass NetworkOnly extends Strategy {\n /**\n * @param {Object} [options]\n * @param {Array} [options.plugins] [Plugins]{@link https://developers.google.com/web/tools/workbox/guides/using-plugins}\n * to use in conjunction with this caching strategy.\n * @param {Object} [options.fetchOptions] Values passed along to the\n * [`init`](https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/fetch#Parameters)\n * of [non-navigation](https://github.com/GoogleChrome/workbox/issues/1796)\n * `fetch()` requests made by this strategy.\n * @param {number} [options.networkTimeoutSeconds] If set, any network requests\n * that fail to respond within the timeout will result in a network error.\n */\n constructor(options = {}) {\n super(options);\n this._networkTimeoutSeconds = options.networkTimeoutSeconds || 0;\n }\n /**\n * @private\n * @param {Request|string} request A request to run this strategy for.\n * @param {workbox-strategies.StrategyHandler} handler The event that\n * triggered the request.\n * @return {Promise}\n */\n async _handle(request, handler) {\n if (process.env.NODE_ENV !== 'production') {\n assert.isInstance(request, Request, {\n moduleName: 'workbox-strategies',\n className: this.constructor.name,\n funcName: '_handle',\n paramName: 'request',\n });\n }\n let error = undefined;\n let response;\n try {\n const promises = [\n handler.fetch(request),\n ];\n if (this._networkTimeoutSeconds) {\n const timeoutPromise = timeout(this._networkTimeoutSeconds * 1000);\n promises.push(timeoutPromise);\n }\n response = await Promise.race(promises);\n if (!response) {\n throw new Error(`Timed out the network response after ` +\n `${this._networkTimeoutSeconds} seconds.`);\n }\n }\n catch (err) {\n if (err instanceof Error) {\n error = err;\n }\n }\n if (process.env.NODE_ENV !== 'production') {\n logger.groupCollapsed(messages.strategyStart(this.constructor.name, request));\n if (response) {\n logger.log(`Got response from network.`);\n }\n else {\n logger.log(`Unable to get a response from the network.`);\n }\n messages.printFinalResponse(response);\n logger.groupEnd();\n }\n if (!response) {\n throw new WorkboxError('no-response', { url: request.url, error });\n }\n return response;\n }\n}\nexport { NetworkOnly };\n","/*\n Copyright 2019 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\nimport './_version.js';\n/**\n * Claim any currently available clients once the service worker\n * becomes active. This is normally used in conjunction with `skipWaiting()`.\n *\n * @memberof workbox-core\n */\nfunction clientsClaim() {\n self.addEventListener('activate', () => self.clients.claim());\n}\nexport { clientsClaim };\n"],"names":["self","_","e","logger","globalThis","__WB_DISABLE_DEV_LOGS","inGroup","methodToColorMap","debug","log","warn","error","groupCollapsed","groupEnd","print","method","args","test","navigator","userAgent","console","styles","logPrefix","join","api","loggerMethods","Object","keys","key","messages","invalid-value","paramName","validValueDescription","value","Error","JSON","stringify","not-an-array","moduleName","className","funcName","incorrect-type","expectedType","classNameStr","incorrect-class","expectedClassName","isReturnValueProblem","missing-a-method","expectedMethod","add-to-cache-list-unexpected-type","entry","add-to-cache-list-conflicting-entries","firstEntry","secondEntry","plugin-error-request-will-fetch","thrownErrorMessage","invalid-cache-name","cacheNameId","unregister-route-but-not-found-with-method","unregister-route-route-not-registered","queue-replay-failed","name","duplicate-queue-name","expired-test-without-max-age","methodName","unsupported-route-type","not-array-of-class","expectedClass","max-entries-or-age-required","statuses-or-headers-required","invalid-string","channel-name-required","invalid-responses-are-same-args","expire-custom-caches-only","unit-must-be-bytes","normalizedRangeHeader","single-range-only","invalid-range-values","no-range-header","range-not-satisfiable","size","start","end","attempt-to-cache-non-get-request","url","cache-put-with-no-response","no-response","message","bad-precaching-response","status","non-precached-url","add-to-cache-list-conflicting-integrities","missing-precache-entry","cacheName","cross-origin-copy-response","origin","opaque-streams-source","type","generatorFunction","code","details","messageGenerator","WorkboxError","constructor","errorCode","isArray","Array","hasMethod","object","isType","isInstance","isOneOf","validValues","includes","isArrayOfClass","item","finalAssertExports","defaultMethod","validMethods","normalizeHandler","handler","assert","handle","Route","match","setCatchHandler","catchHandler","RegExpRoute","regExp","RegExp","result","exec","href","location","index","toString","slice","getFriendlyURL","urlObj","URL","String","replace","Router","_routes","Map","_defaultHandlerMap","routes","addFetchListener","addEventListener","event","request","responsePromise","handleRequest","respondWith","addCacheListener","data","payload","urlsToCache","requestPromises","Promise","all","map","Request","waitUntil","ports","then","postMessage","protocol","startsWith","sameOrigin","params","route","findMatchingRoute","debugMessages","push","has","get","forEach","msg","err","reject","_catchHandler","catch","catchErr","matchResult","length","undefined","setDefaultHandler","set","registerRoute","unregisterRoute","routeIndex","indexOf","splice","defaultRouter","getOrCreateDefaultRouter","capture","captureUrl","valueToCheck","pathname","wildcards","matchCallback","cacheOkAndOpaquePlugin","cacheWillUpdate","response","_cacheNameDetails","googleAnalytics","precache","prefix","runtime","suffix","registration","scope","_createCacheName","filter","eachCacheNameDetail","fn","cacheNames","updateDetails","getGoogleAnalyticsName","userCacheName","getPrecacheName","getPrefix","getRuntimeName","getSuffix","stripParams","fullURL","ignoreParams","strippedURL","param","searchParams","delete","cacheMatchIgnoreParams","cache","matchOptions","strippedRequestURL","keysOptions","assign","ignoreSearch","cacheKeys","cacheKey","strippedCacheKeyURL","Deferred","promise","resolve","quotaErrorCallbacks","Set","executeQuotaErrorCallbacks","callback","timeout","ms","setTimeout","toRequest","input","StrategyHandler","strategy","options","_cacheKeys","ExtendableEvent","_strategy","_handlerDeferred","_extendLifetimePromises","_plugins","plugins","_pluginStateMap","plugin","fetch","mode","FetchEvent","preloadResponse","possiblePreloadResponse","originalRequest","hasCallback","clone","cb","iterateCallbacks","pluginFilteredRequest","fetchResponse","fetchOptions","runCallbacks","fetchAndCachePut","responseClone","cachePut","cacheMatch","cachedResponse","effectiveRequest","getCacheKey","multiMatchOptions","caches","vary","headers","responseToCache","_ensureResponseSafeToCache","open","hasCacheUpdateCallback","oldResponse","put","newResponse","state","statefulCallback","statefulParam","doneWaiting","shift","destroy","pluginsUsed","Strategy","responseDone","handleAll","_getResponse","handlerDone","_awaitComplete","_handle","waitUntilError","strategyStart","strategyName","printFinalResponse","NetworkFirst","some","p","unshift","_networkTimeoutSeconds","networkTimeoutSeconds","logs","promises","timeoutId","id","_getTimeoutPromise","networkPromise","_getNetworkPromise","race","timeoutPromise","onNetworkTimeout","fetchError","clearTimeout","NetworkOnly","clientsClaim","clients","claim"],"mappings":"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"} \ No newline at end of file diff --git a/public/workbox-e9849328.js b/public/workbox-e9849328.js deleted file mode 100644 index faeb758..0000000 --- a/public/workbox-e9849328.js +++ /dev/null @@ -1 +0,0 @@ -define(["exports"],(function(t){"use strict";try{self["workbox:core:6.5.4"]&&_()}catch(t){}const e=(t,...e)=>{let s=t;return e.length>0&&(s+=` :: ${JSON.stringify(e)}`),s};class s extends Error{constructor(t,s){super(e(t,s)),this.name=t,this.details=s}}try{self["workbox:routing:6.5.4"]&&_()}catch(t){}const n=t=>t&&"object"==typeof t?t:{handle:t};class r{constructor(t,e,s="GET"){this.handler=n(e),this.match=t,this.method=s}setCatchHandler(t){this.catchHandler=n(t)}}class i extends r{constructor(t,e,s){super((({url:e})=>{const s=t.exec(e.href);if(s&&(e.origin===location.origin||0===s.index))return s.slice(1)}),e,s)}}class a{constructor(){this.t=new Map,this.i=new Map}get routes(){return this.t}addFetchListener(){self.addEventListener("fetch",(t=>{const{request:e}=t,s=this.handleRequest({request:e,event:t});s&&t.respondWith(s)}))}addCacheListener(){self.addEventListener("message",(t=>{if(t.data&&"CACHE_URLS"===t.data.type){const{payload:e}=t.data,s=Promise.all(e.urlsToCache.map((e=>{"string"==typeof e&&(e=[e]);const s=new Request(...e);return this.handleRequest({request:s,event:t})})));t.waitUntil(s),t.ports&&t.ports[0]&&s.then((()=>t.ports[0].postMessage(!0)))}}))}handleRequest({request:t,event:e}){const s=new URL(t.url,location.href);if(!s.protocol.startsWith("http"))return;const n=s.origin===location.origin,{params:r,route:i}=this.findMatchingRoute({event:e,request:t,sameOrigin:n,url:s});let a=i&&i.handler;const o=t.method;if(!a&&this.i.has(o)&&(a=this.i.get(o)),!a)return;let c;try{c=a.handle({url:s,request:t,event:e,params:r})}catch(t){c=Promise.reject(t)}const h=i&&i.catchHandler;return c instanceof Promise&&(this.o||h)&&(c=c.catch((async n=>{if(h)try{return await h.handle({url:s,request:t,event:e,params:r})}catch(t){t instanceof Error&&(n=t)}if(this.o)return this.o.handle({url:s,request:t,event:e});throw n}))),c}findMatchingRoute({url:t,sameOrigin:e,request:s,event:n}){const r=this.t.get(s.method)||[];for(const i of r){let r;const a=i.match({url:t,sameOrigin:e,request:s,event:n});if(a)return r=a,(Array.isArray(r)&&0===r.length||a.constructor===Object&&0===Object.keys(a).length||"boolean"==typeof a)&&(r=void 0),{route:i,params:r}}return{}}setDefaultHandler(t,e="GET"){this.i.set(e,n(t))}setCatchHandler(t){this.o=n(t)}registerRoute(t){this.t.has(t.method)||this.t.set(t.method,[]),this.t.get(t.method).push(t)}unregisterRoute(t){if(!this.t.has(t.method))throw new s("unregister-route-but-not-found-with-method",{method:t.method});const e=this.t.get(t.method).indexOf(t);if(!(e>-1))throw new s("unregister-route-route-not-registered");this.t.get(t.method).splice(e,1)}}let o;const c=()=>(o||(o=new a,o.addFetchListener(),o.addCacheListener()),o);function h(t,e,n){let a;if("string"==typeof t){const s=new URL(t,location.href);a=new r((({url:t})=>t.href===s.href),e,n)}else if(t instanceof RegExp)a=new i(t,e,n);else if("function"==typeof t)a=new r(t,e,n);else{if(!(t instanceof r))throw new s("unsupported-route-type",{moduleName:"workbox-routing",funcName:"registerRoute",paramName:"capture"});a=t}return c().registerRoute(a),a}try{self["workbox:strategies:6.5.4"]&&_()}catch(t){}const u={cacheWillUpdate:async({response:t})=>200===t.status||0===t.status?t:null},l={googleAnalytics:"googleAnalytics",precache:"precache-v2",prefix:"workbox",runtime:"runtime",suffix:"undefined"!=typeof registration?registration.scope:""},f=t=>[l.prefix,t,l.suffix].filter((t=>t&&t.length>0)).join("-"),w=t=>t||f(l.precache),d=t=>t||f(l.runtime);function p(t,e){const s=new URL(t);for(const t of e)s.searchParams.delete(t);return s.href}class y{constructor(){this.promise=new Promise(((t,e)=>{this.resolve=t,this.reject=e}))}}const g=new Set;function m(t){return"string"==typeof t?new Request(t):t}class R{constructor(t,e){this.h={},Object.assign(this,e),this.event=e.event,this.u=t,this.l=new y,this.p=[],this.m=[...t.plugins],this.R=new Map;for(const t of this.m)this.R.set(t,{});this.event.waitUntil(this.l.promise)}async fetch(t){const{event:e}=this;let n=m(t);if("navigate"===n.mode&&e instanceof FetchEvent&&e.preloadResponse){const t=await e.preloadResponse;if(t)return t}const r=this.hasCallback("fetchDidFail")?n.clone():null;try{for(const t of this.iterateCallbacks("requestWillFetch"))n=await t({request:n.clone(),event:e})}catch(t){if(t instanceof Error)throw new s("plugin-error-request-will-fetch",{thrownErrorMessage:t.message})}const i=n.clone();try{let t;t=await fetch(n,"navigate"===n.mode?void 0:this.u.fetchOptions);for(const s of this.iterateCallbacks("fetchDidSucceed"))t=await s({event:e,request:i,response:t});return t}catch(t){throw r&&await this.runCallbacks("fetchDidFail",{error:t,event:e,originalRequest:r.clone(),request:i.clone()}),t}}async fetchAndCachePut(t){const e=await this.fetch(t),s=e.clone();return this.waitUntil(this.cachePut(t,s)),e}async cacheMatch(t){const e=m(t);let s;const{cacheName:n,matchOptions:r}=this.u,i=await this.getCacheKey(e,"read"),a=Object.assign(Object.assign({},r),{cacheName:n});s=await caches.match(i,a);for(const t of this.iterateCallbacks("cachedResponseWillBeUsed"))s=await t({cacheName:n,matchOptions:r,cachedResponse:s,request:i,event:this.event})||void 0;return s}async cachePut(t,e){const n=m(t);var r;await(r=0,new Promise((t=>setTimeout(t,r))));const i=await this.getCacheKey(n,"write");if(!e)throw new s("cache-put-with-no-response",{url:(a=i.url,new URL(String(a),location.href).href.replace(new RegExp(`^${location.origin}`),""))});var a;const o=await this.v(e);if(!o)return!1;const{cacheName:c,matchOptions:h}=this.u,u=await self.caches.open(c),l=this.hasCallback("cacheDidUpdate"),f=l?await async function(t,e,s,n){const r=p(e.url,s);if(e.url===r)return t.match(e,n);const i=Object.assign(Object.assign({},n),{ignoreSearch:!0}),a=await t.keys(e,i);for(const e of a)if(r===p(e.url,s))return t.match(e,n)}(u,i.clone(),["__WB_REVISION__"],h):null;try{await u.put(i,l?o.clone():o)}catch(t){if(t instanceof Error)throw"QuotaExceededError"===t.name&&await async function(){for(const t of g)await t()}(),t}for(const t of this.iterateCallbacks("cacheDidUpdate"))await t({cacheName:c,oldResponse:f,newResponse:o.clone(),request:i,event:this.event});return!0}async getCacheKey(t,e){const s=`${t.url} | ${e}`;if(!this.h[s]){let n=t;for(const t of this.iterateCallbacks("cacheKeyWillBeUsed"))n=m(await t({mode:e,request:n,event:this.event,params:this.params}));this.h[s]=n}return this.h[s]}hasCallback(t){for(const e of this.u.plugins)if(t in e)return!0;return!1}async runCallbacks(t,e){for(const s of this.iterateCallbacks(t))await s(e)}*iterateCallbacks(t){for(const e of this.u.plugins)if("function"==typeof e[t]){const s=this.R.get(e),n=n=>{const r=Object.assign(Object.assign({},n),{state:s});return e[t](r)};yield n}}waitUntil(t){return this.p.push(t),t}async doneWaiting(){let t;for(;t=this.p.shift();)await t}destroy(){this.l.resolve(null)}async v(t){let e=t,s=!1;for(const t of this.iterateCallbacks("cacheWillUpdate"))if(e=await t({request:this.request,response:e,event:this.event})||void 0,s=!0,!e)break;return s||e&&200!==e.status&&(e=void 0),e}}class v{constructor(t={}){this.cacheName=d(t.cacheName),this.plugins=t.plugins||[],this.fetchOptions=t.fetchOptions,this.matchOptions=t.matchOptions}handle(t){const[e]=this.handleAll(t);return e}handleAll(t){t instanceof FetchEvent&&(t={event:t,request:t.request});const e=t.event,s="string"==typeof t.request?new Request(t.request):t.request,n="params"in t?t.params:void 0,r=new R(this,{event:e,request:s,params:n}),i=this.q(r,s,e);return[i,this.D(i,r,s,e)]}async q(t,e,n){let r;await t.runCallbacks("handlerWillStart",{event:n,request:e});try{if(r=await this.U(e,t),!r||"error"===r.type)throw new s("no-response",{url:e.url})}catch(s){if(s instanceof Error)for(const i of t.iterateCallbacks("handlerDidError"))if(r=await i({error:s,event:n,request:e}),r)break;if(!r)throw s}for(const s of t.iterateCallbacks("handlerWillRespond"))r=await s({event:n,request:e,response:r});return r}async D(t,e,s,n){let r,i;try{r=await t}catch(i){}try{await e.runCallbacks("handlerDidRespond",{event:n,request:s,response:r}),await e.doneWaiting()}catch(t){t instanceof Error&&(i=t)}if(await e.runCallbacks("handlerDidComplete",{event:n,request:s,response:r,error:i}),e.destroy(),i)throw i}}function b(t){t.then((()=>{}))}function q(){return q=Object.assign?Object.assign.bind():function(t){for(var e=1;ee.some((e=>t instanceof e));let U,x;const L=new WeakMap,I=new WeakMap,C=new WeakMap,E=new WeakMap,N=new WeakMap;let O={get(t,e,s){if(t instanceof IDBTransaction){if("done"===e)return I.get(t);if("objectStoreNames"===e)return t.objectStoreNames||C.get(t);if("store"===e)return s.objectStoreNames[1]?void 0:s.objectStore(s.objectStoreNames[0])}return B(t[e])},set:(t,e,s)=>(t[e]=s,!0),has:(t,e)=>t instanceof IDBTransaction&&("done"===e||"store"===e)||e in t};function T(t){return t!==IDBDatabase.prototype.transaction||"objectStoreNames"in IDBTransaction.prototype?(x||(x=[IDBCursor.prototype.advance,IDBCursor.prototype.continue,IDBCursor.prototype.continuePrimaryKey])).includes(t)?function(...e){return t.apply(P(this),e),B(L.get(this))}:function(...e){return B(t.apply(P(this),e))}:function(e,...s){const n=t.call(P(this),e,...s);return C.set(n,e.sort?e.sort():[e]),B(n)}}function k(t){return"function"==typeof t?T(t):(t instanceof IDBTransaction&&function(t){if(I.has(t))return;const e=new Promise(((e,s)=>{const n=()=>{t.removeEventListener("complete",r),t.removeEventListener("error",i),t.removeEventListener("abort",i)},r=()=>{e(),n()},i=()=>{s(t.error||new DOMException("AbortError","AbortError")),n()};t.addEventListener("complete",r),t.addEventListener("error",i),t.addEventListener("abort",i)}));I.set(t,e)}(t),D(t,U||(U=[IDBDatabase,IDBObjectStore,IDBIndex,IDBCursor,IDBTransaction]))?new Proxy(t,O):t)}function B(t){if(t instanceof IDBRequest)return function(t){const e=new Promise(((e,s)=>{const n=()=>{t.removeEventListener("success",r),t.removeEventListener("error",i)},r=()=>{e(B(t.result)),n()},i=()=>{s(t.error),n()};t.addEventListener("success",r),t.addEventListener("error",i)}));return e.then((e=>{e instanceof IDBCursor&&L.set(e,t)})).catch((()=>{})),N.set(e,t),e}(t);if(E.has(t))return E.get(t);const e=k(t);return e!==t&&(E.set(t,e),N.set(e,t)),e}const P=t=>N.get(t);const M=["get","getKey","getAll","getAllKeys","count"],W=["put","add","delete","clear"],j=new Map;function S(t,e){if(!(t instanceof IDBDatabase)||e in t||"string"!=typeof e)return;if(j.get(e))return j.get(e);const s=e.replace(/FromIndex$/,""),n=e!==s,r=W.includes(s);if(!(s in(n?IDBIndex:IDBObjectStore).prototype)||!r&&!M.includes(s))return;const i=async function(t,...e){const i=this.transaction(t,r?"readwrite":"readonly");let a=i.store;return n&&(a=a.index(e.shift())),(await Promise.all([a[s](...e),r&&i.done]))[0]};return j.set(e,i),i}O=(t=>q({},t,{get:(e,s,n)=>S(e,s)||t.get(e,s,n),has:(e,s)=>!!S(e,s)||t.has(e,s)}))(O);try{self["workbox:expiration:6.5.4"]&&_()}catch(t){}const K="cache-entries",A=t=>{const e=new URL(t,location.href);return e.hash="",e.href};class F{constructor(t){this._=null,this.L=t}I(t){const e=t.createObjectStore(K,{keyPath:"id"});e.createIndex("cacheName","cacheName",{unique:!1}),e.createIndex("timestamp","timestamp",{unique:!1})}C(t){this.I(t),this.L&&function(t,{blocked:e}={}){const s=indexedDB.deleteDatabase(t);e&&s.addEventListener("blocked",(t=>e(t.oldVersion,t))),B(s).then((()=>{}))}(this.L)}async setTimestamp(t,e){const s={url:t=A(t),timestamp:e,cacheName:this.L,id:this.N(t)},n=(await this.getDb()).transaction(K,"readwrite",{durability:"relaxed"});await n.store.put(s),await n.done}async getTimestamp(t){const e=await this.getDb(),s=await e.get(K,this.N(t));return null==s?void 0:s.timestamp}async expireEntries(t,e){const s=await this.getDb();let n=await s.transaction(K).store.index("timestamp").openCursor(null,"prev");const r=[];let i=0;for(;n;){const s=n.value;s.cacheName===this.L&&(t&&s.timestamp=e?r.push(n.value):i++),n=await n.continue()}const a=[];for(const t of r)await s.delete(K,t.id),a.push(t.url);return a}N(t){return this.L+"|"+A(t)}async getDb(){return this._||(this._=await function(t,e,{blocked:s,upgrade:n,blocking:r,terminated:i}={}){const a=indexedDB.open(t,e),o=B(a);return n&&a.addEventListener("upgradeneeded",(t=>{n(B(a.result),t.oldVersion,t.newVersion,B(a.transaction),t)})),s&&a.addEventListener("blocked",(t=>s(t.oldVersion,t.newVersion,t))),o.then((t=>{i&&t.addEventListener("close",(()=>i())),r&&t.addEventListener("versionchange",(t=>r(t.oldVersion,t.newVersion,t)))})).catch((()=>{})),o}("workbox-expiration",1,{upgrade:this.C.bind(this)})),this._}}class H{constructor(t,e={}){this.O=!1,this.T=!1,this.k=e.maxEntries,this.B=e.maxAgeSeconds,this.P=e.matchOptions,this.L=t,this.M=new F(t)}async expireEntries(){if(this.O)return void(this.T=!0);this.O=!0;const t=this.B?Date.now()-1e3*this.B:0,e=await this.M.expireEntries(t,this.k),s=await self.caches.open(this.L);for(const t of e)await s.delete(t,this.P);this.O=!1,this.T&&(this.T=!1,b(this.expireEntries()))}async updateTimestamp(t){await this.M.setTimestamp(t,Date.now())}async isURLExpired(t){if(this.B){const e=await this.M.getTimestamp(t),s=Date.now()-1e3*this.B;return void 0===e||er||e&&e<0)throw new s("range-not-satisfiable",{size:r,end:n,start:e});let i,a;return void 0!==e&&void 0!==n?(i=e,a=n+1):void 0!==e&&void 0===n?(i=e,a=r):void 0!==n&&void 0===e&&(i=r-n,a=r),{start:i,end:a}}(i,r.start,r.end),o=i.slice(a.start,a.end),c=o.size,h=new Response(o,{status:206,statusText:"Partial Content",headers:e.headers});return h.headers.set("Content-Length",String(c)),h.headers.set("Content-Range",`bytes ${a.start}-${a.end-1}/${i.size}`),h}catch(t){return new Response("",{status:416,statusText:"Range Not Satisfiable"})}}function z(t,e){const s=e();return t.waitUntil(s),s}try{self["workbox:precaching:6.5.4"]&&_()}catch(t){}function G(t){if(!t)throw new s("add-to-cache-list-unexpected-type",{entry:t});if("string"==typeof t){const e=new URL(t,location.href);return{cacheKey:e.href,url:e.href}}const{revision:e,url:n}=t;if(!n)throw new s("add-to-cache-list-unexpected-type",{entry:t});if(!e){const t=new URL(n,location.href);return{cacheKey:t.href,url:t.href}}const r=new URL(n,location.href),i=new URL(n,location.href);return r.searchParams.set("__WB_REVISION__",e),{cacheKey:r.href,url:i.href}}class V{constructor(){this.updatedURLs=[],this.notUpdatedURLs=[],this.handlerWillStart=async({request:t,state:e})=>{e&&(e.originalRequest=t)},this.cachedResponseWillBeUsed=async({event:t,state:e,cachedResponse:s})=>{if("install"===t.type&&e&&e.originalRequest&&e.originalRequest instanceof Request){const t=e.originalRequest.url;s?this.notUpdatedURLs.push(t):this.updatedURLs.push(t)}return s}}}class J{constructor({precacheController:t}){this.cacheKeyWillBeUsed=async({request:t,params:e})=>{const s=(null==e?void 0:e.cacheKey)||this.W.getCacheKeyForURL(t.url);return s?new Request(s,{headers:t.headers}):t},this.W=t}}let Q,X;async function Y(t,e){let n=null;if(t.url){n=new URL(t.url).origin}if(n!==self.location.origin)throw new s("cross-origin-copy-response",{origin:n});const r=t.clone(),i={headers:new Headers(r.headers),status:r.status,statusText:r.statusText},a=e?e(i):i,o=function(){if(void 0===Q){const t=new Response("");if("body"in t)try{new Response(t.body),Q=!0}catch(t){Q=!1}Q=!1}return Q}()?r.body:await r.blob();return new Response(o,a)}class Z extends v{constructor(t={}){t.cacheName=w(t.cacheName),super(t),this.j=!1!==t.fallbackToNetwork,this.plugins.push(Z.copyRedirectedCacheableResponsesPlugin)}async U(t,e){const s=await e.cacheMatch(t);return s||(e.event&&"install"===e.event.type?await this.S(t,e):await this.K(t,e))}async K(t,e){let n;const r=e.params||{};if(!this.j)throw new s("missing-precache-entry",{cacheName:this.cacheName,url:t.url});{const s=r.integrity,i=t.integrity,a=!i||i===s;n=await e.fetch(new Request(t,{integrity:"no-cors"!==t.mode?i||s:void 0})),s&&a&&"no-cors"!==t.mode&&(this.A(),await e.cachePut(t,n.clone()))}return n}async S(t,e){this.A();const n=await e.fetch(t);if(!await e.cachePut(t,n.clone()))throw new s("bad-precaching-response",{url:t.url,status:n.status});return n}A(){let t=null,e=0;for(const[s,n]of this.plugins.entries())n!==Z.copyRedirectedCacheableResponsesPlugin&&(n===Z.defaultPrecacheCacheabilityPlugin&&(t=s),n.cacheWillUpdate&&e++);0===e?this.plugins.push(Z.defaultPrecacheCacheabilityPlugin):e>1&&null!==t&&this.plugins.splice(t,1)}}Z.defaultPrecacheCacheabilityPlugin={cacheWillUpdate:async({response:t})=>!t||t.status>=400?null:t},Z.copyRedirectedCacheableResponsesPlugin={cacheWillUpdate:async({response:t})=>t.redirected?await Y(t):t};class tt{constructor({cacheName:t,plugins:e=[],fallbackToNetwork:s=!0}={}){this.F=new Map,this.H=new Map,this.$=new Map,this.u=new Z({cacheName:w(t),plugins:[...e,new J({precacheController:this})],fallbackToNetwork:s}),this.install=this.install.bind(this),this.activate=this.activate.bind(this)}get strategy(){return this.u}precache(t){this.addToCacheList(t),this.G||(self.addEventListener("install",this.install),self.addEventListener("activate",this.activate),this.G=!0)}addToCacheList(t){const e=[];for(const n of t){"string"==typeof n?e.push(n):n&&void 0===n.revision&&e.push(n.url);const{cacheKey:t,url:r}=G(n),i="string"!=typeof n&&n.revision?"reload":"default";if(this.F.has(r)&&this.F.get(r)!==t)throw new s("add-to-cache-list-conflicting-entries",{firstEntry:this.F.get(r),secondEntry:t});if("string"!=typeof n&&n.integrity){if(this.$.has(t)&&this.$.get(t)!==n.integrity)throw new s("add-to-cache-list-conflicting-integrities",{url:r});this.$.set(t,n.integrity)}if(this.F.set(r,t),this.H.set(r,i),e.length>0){const t=`Workbox is precaching URLs without revision info: ${e.join(", ")}\nThis is generally NOT safe. Learn more at https://bit.ly/wb-precache`;console.warn(t)}}}install(t){return z(t,(async()=>{const e=new V;this.strategy.plugins.push(e);for(const[e,s]of this.F){const n=this.$.get(s),r=this.H.get(e),i=new Request(e,{integrity:n,cache:r,credentials:"same-origin"});await Promise.all(this.strategy.handleAll({params:{cacheKey:s},request:i,event:t}))}const{updatedURLs:s,notUpdatedURLs:n}=e;return{updatedURLs:s,notUpdatedURLs:n}}))}activate(t){return z(t,(async()=>{const t=await self.caches.open(this.strategy.cacheName),e=await t.keys(),s=new Set(this.F.values()),n=[];for(const r of e)s.has(r.url)||(await t.delete(r),n.push(r.url));return{deletedURLs:n}}))}getURLsToCacheKeys(){return this.F}getCachedURLs(){return[...this.F.keys()]}getCacheKeyForURL(t){const e=new URL(t,location.href);return this.F.get(e.href)}getIntegrityForCacheKey(t){return this.$.get(t)}async matchPrecache(t){const e=t instanceof Request?t.url:t,s=this.getCacheKeyForURL(e);if(s){return(await self.caches.open(this.strategy.cacheName)).match(s)}}createHandlerBoundToURL(t){const e=this.getCacheKeyForURL(t);if(!e)throw new s("non-precached-url",{url:t});return s=>(s.request=new Request(t),s.params=Object.assign({cacheKey:e},s.params),this.strategy.handle(s))}}const et=()=>(X||(X=new tt),X);class st extends r{constructor(t,e){super((({request:s})=>{const n=t.getURLsToCacheKeys();for(const r of function*(t,{ignoreURLParametersMatching:e=[/^utm_/,/^fbclid$/],directoryIndex:s="index.html",cleanURLs:n=!0,urlManipulation:r}={}){const i=new URL(t,location.href);i.hash="",yield i.href;const a=function(t,e=[]){for(const s of[...t.searchParams.keys()])e.some((t=>t.test(s)))&&t.searchParams.delete(s);return t}(i,e);if(yield a.href,s&&a.pathname.endsWith("/")){const t=new URL(a.href);t.pathname+=s,yield t.href}if(n){const t=new URL(a.href);t.pathname+=".html",yield t.href}if(r){const t=r({url:i});for(const e of t)yield e.href}}(s.url,e)){const e=n.get(r);if(e){return{cacheKey:e,integrity:t.getIntegrityForCacheKey(e)}}}}),t.strategy)}}t.CacheFirst=class extends v{async U(t,e){let n,r=await e.cacheMatch(t);if(!r)try{r=await e.fetchAndCachePut(t)}catch(t){t instanceof Error&&(n=t)}if(!r)throw new s("no-response",{url:t.url,error:n});return r}},t.ExpirationPlugin=class{constructor(t={}){this.cachedResponseWillBeUsed=async({event:t,request:e,cacheName:s,cachedResponse:n})=>{if(!n)return null;const r=this.V(n),i=this.J(s);b(i.expireEntries());const a=i.updateTimestamp(e.url);if(t)try{t.waitUntil(a)}catch(t){}return r?n:null},this.cacheDidUpdate=async({cacheName:t,request:e})=>{const s=this.J(t);await s.updateTimestamp(e.url),await s.expireEntries()},this.X=t,this.B=t.maxAgeSeconds,this.Y=new Map,t.purgeOnQuotaError&&function(t){g.add(t)}((()=>this.deleteCacheAndMetadata()))}J(t){if(t===d())throw new s("expire-custom-caches-only");let e=this.Y.get(t);return e||(e=new H(t,this.X),this.Y.set(t,e)),e}V(t){if(!this.B)return!0;const e=this.Z(t);if(null===e)return!0;return e>=Date.now()-1e3*this.B}Z(t){if(!t.headers.has("date"))return null;const e=t.headers.get("date"),s=new Date(e).getTime();return isNaN(s)?null:s}async deleteCacheAndMetadata(){for(const[t,e]of this.Y)await self.caches.delete(t),await e.delete();this.Y=new Map}},t.NetworkFirst=class extends v{constructor(t={}){super(t),this.plugins.some((t=>"cacheWillUpdate"in t))||this.plugins.unshift(u),this.tt=t.networkTimeoutSeconds||0}async U(t,e){const n=[],r=[];let i;if(this.tt){const{id:s,promise:a}=this.et({request:t,logs:n,handler:e});i=s,r.push(a)}const a=this.st({timeoutId:i,request:t,logs:n,handler:e});r.push(a);const o=await e.waitUntil((async()=>await e.waitUntil(Promise.race(r))||await a)());if(!o)throw new s("no-response",{url:t.url});return o}et({request:t,logs:e,handler:s}){let n;return{promise:new Promise((e=>{n=setTimeout((async()=>{e(await s.cacheMatch(t))}),1e3*this.tt)})),id:n}}async st({timeoutId:t,request:e,logs:s,handler:n}){let r,i;try{i=await n.fetchAndCachePut(e)}catch(t){t instanceof Error&&(r=t)}return t&&clearTimeout(t),!r&&i||(i=await n.cacheMatch(e)),i}},t.RangeRequestsPlugin=class{constructor(){this.cachedResponseWillBeUsed=async({request:t,cachedResponse:e})=>e&&t.headers.has("range")?await $(t,e):e}},t.StaleWhileRevalidate=class extends v{constructor(t={}){super(t),this.plugins.some((t=>"cacheWillUpdate"in t))||this.plugins.unshift(u)}async U(t,e){const n=e.fetchAndCachePut(t).catch((()=>{}));e.waitUntil(n);let r,i=await e.cacheMatch(t);if(i);else try{i=await n}catch(t){t instanceof Error&&(r=t)}if(!i)throw new s("no-response",{url:t.url,error:r});return i}},t.cleanupOutdatedCaches=function(){self.addEventListener("activate",(t=>{const e=w();t.waitUntil((async(t,e="-precache-")=>{const s=(await self.caches.keys()).filter((s=>s.includes(e)&&s.includes(self.registration.scope)&&s!==t));return await Promise.all(s.map((t=>self.caches.delete(t)))),s})(e).then((t=>{})))}))},t.clientsClaim=function(){self.addEventListener("activate",(()=>self.clients.claim()))},t.precacheAndRoute=function(t,e){!function(t){et().precache(t)}(t),function(t){const e=et();h(new st(e,t))}(e)},t.registerRoute=h})); diff --git a/types/index.d.ts b/types/index.d.ts index a9b500d..01212c4 100644 --- a/types/index.d.ts +++ b/types/index.d.ts @@ -17,9 +17,6 @@ export type SiteConfig = { oichat: string; }; openSignup: boolean; - shortDomains: string[]; - emailDomains: string[]; - recordDomains: string[]; emailR2Domain: string; };