+
+
+
-
-
-
+
+
+
+ Notes
+
+
+
- QuickView coming soon.
+
+
+
diff --git a/lumina/app/profile/settings/page.tsx b/lumina/app/profile/settings/page.tsx
new file mode 100644
index 0000000..3fc67d0
--- /dev/null
+++ b/lumina/app/profile/settings/page.tsx
@@ -0,0 +1,34 @@
+'use client';
+
+import { useParams } from 'next/navigation'
+import { nip19 } from "nostr-tools";
+import { NostrProvider } from "nostr-react";
+import { UpdateProfileForm } from "@/components/UpdateProfileForm";
+
+export default function ProfileSettingsPage() {
+
+ let pubkey = null;
+ if (typeof window !== 'undefined') {
+ pubkey = window.localStorage.getItem('pubkey');
+ }
+ // check if pubkey is not null and contains "npub"
+ // if so, then we need to convert it to a pubkey
+ if (pubkey && pubkey.includes("npub")) {
+ // convert npub to pubkey
+ pubkey = nip19.decode(pubkey.toString()).data.toString()
+ }
+
+ const relayUrls = [
+ "wss://relay.lumina.rocks",
+ ];
+
+ return (
+ <>
+
+
+
+
+
+ >
+ );
+}
diff --git a/lumina/app/reel/page.tsx b/lumina/app/reel/page.tsx
new file mode 100644
index 0000000..313a8cd
--- /dev/null
+++ b/lumina/app/reel/page.tsx
@@ -0,0 +1,31 @@
+"use client";
+
+import ReelFeed from "@/components/ReelFeed"
+import { NostrProvider } from "nostr-react";
+
+export default function ReelPage() {
+ const relayUrls = [
+ "wss://relay.lumina.rocks",
+ ];
+
+ return (
+ //
+ //
+ //
+ //
+ //
+ //
+ //
+ // Home
+ //
+ //
+ //
+ //
+ //
+
+
+
+
+
+ );
+}
diff --git a/lumina/app/search/[searchTag]/page.tsx b/lumina/app/search/[searchTag]/page.tsx
new file mode 100644
index 0000000..6d420b2
--- /dev/null
+++ b/lumina/app/search/[searchTag]/page.tsx
@@ -0,0 +1,57 @@
+'use client';
+
+import Head from "next/head";
+import ProfileInfoCard from "@/components/ProfileInfoCard";
+import ProfileFeed from "@/components/ProfileFeed";
+import { useParams } from 'next/navigation'
+import { nip19 } from "nostr-tools";
+import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs"
+import { SectionIcon, GridIcon } from '@radix-ui/react-icons'
+import TagFeed from "@/components/TagFeed";
+import { NostrProvider } from "nostr-react";
+import FollowerFeed from "@/components/FollowerFeed";
+import ProfileQuickViewFeed from "@/components/ProfileQuickViewFeed";
+import FollowerQuickViewFeed from "@/components/FollowerQuickViewFeed";
+import SearchProfilesBox from "@/components/searchComponents/SearchProfilesBox";
+import SearchNotesBox from "@/components/searchComponents/SearchNotesBox";
+
+export default function SearchPage() {
+
+ let pubkey = null;
+ if (typeof window !== 'undefined') {
+ pubkey = window.localStorage.getItem('pubkey');
+ }
+
+ const params = useParams()
+ let searchTag = params.searchTag
+
+ // check if pubkey contains "npub"
+ // if so, then we need to convert it to a pubkey
+ // if (pubkey.includes("npub")) {
+ // // convert npub to pubkey
+ // pubkey = nip19.decode(pubkey.toString()).data.toString()
+ // }
+
+ const relayUrls = [
+ "wss://relay.lumina.rocks",
+ ];
+
+ return (
+ <>
+
+
+ LUMINA.rocks
+
+
+
+
+
+
+ >
+ );
+}
diff --git a/lumina/app/search/page.tsx b/lumina/app/search/page.tsx
new file mode 100644
index 0000000..aad638c
--- /dev/null
+++ b/lumina/app/search/page.tsx
@@ -0,0 +1,24 @@
+"use client";
+
+import { Search } from "@/components/Search";
+import { TrendingAccounts } from "@/components/TrendingAccounts";
+import { TrendingImages } from "@/components/TrendingImages";
+import { NostrProvider } from "nostr-react";
+
+
+export default function SearchMainPage() {
+
+ const relayUrls = [
+ "wss://relay.lumina.rocks",
+ ];
+
+ return (
+ <>
+
+
+
+
+
+ >
+ );
+}
diff --git a/lumina/app/tag/[tag]/page.tsx b/lumina/app/tag/[tag]/page.tsx
index 6a5512e..c163188 100644
--- a/lumina/app/tag/[tag]/page.tsx
+++ b/lumina/app/tag/[tag]/page.tsx
@@ -1,7 +1,6 @@
'use client';
import Head from "next/head";
-import { NostrProvider } from "nostr-react";
import ProfileInfoCard from "@/components/ProfileInfoCard";
import ProfileFeed from "@/components/ProfileFeed";
import { useParams } from 'next/navigation'
@@ -9,11 +8,7 @@ import { nip19 } from "nostr-tools";
import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs"
import { SectionIcon, GridIcon } from '@radix-ui/react-icons'
import TagFeed from "@/components/TagFeed";
-
-const relayUrls = [
- "wss://relay.damus.io",
- "wss://relay.nostr.band",
-];
+import { NostrProvider } from "nostr-react";
export default function Home() {
@@ -26,9 +21,13 @@ export default function Home() {
// pubkey = nip19.decode(pubkey.toString()).data.toString()
// }
+ const relayUrls = [
+ "wss://relay.lumina.rocks",
+ ];
+
return (
<>
-
+
LUMINA.rocks - {tag}
diff --git a/lumina/bun.lockb b/lumina/bun.lockb
index 03a51a8..a8ca6e2 100755
Binary files a/lumina/bun.lockb and b/lumina/bun.lockb differ
diff --git a/lumina/components/BottomBar.tsx b/lumina/components/BottomBar.tsx
new file mode 100644
index 0000000..b5654d1
--- /dev/null
+++ b/lumina/components/BottomBar.tsx
@@ -0,0 +1,55 @@
+"use client";
+
+/**
+ * v0 by Vercel.
+ * @see https://v0.dev/t/mwaJmHMv0vd
+ * Documentation: https://v0.dev/docs#integrating-generated-code-into-your-nextjs-app
+ */
+import { BellIcon, GlobeIcon, HomeIcon, RowsIcon } from "@radix-ui/react-icons"
+import Link from "next/link"
+import { JSX, SVGProps, useEffect, useState } from "react"
+import { Avatar, AvatarFallback, AvatarImage } from "./ui/avatar"
+import { useRouter, usePathname } from 'next/navigation'
+import { SearchIcon } from "lucide-react";
+
+export default function BottomBar() {
+
+ const router = useRouter();
+ const [pubkey, setPubkey] = useState(null);
+
+ useEffect(() => {
+ return setPubkey(window.localStorage.getItem('pubkey') ?? null);
+ }, []);
+
+ const pathname = usePathname();
+ const isActive = (path: string, currentPath: string) => currentPath === path ? 'text-purple-500' : '';
+
+ return (
+
+ )
+}
\ No newline at end of file
diff --git a/lumina/components/CommentCard.tsx b/lumina/components/CommentCard.tsx
new file mode 100644
index 0000000..86c766c
--- /dev/null
+++ b/lumina/components/CommentCard.tsx
@@ -0,0 +1,123 @@
+import React from 'react';
+import { useProfile } from "nostr-react";
+import {
+ nip19,
+} from "nostr-tools";
+import {
+ Card,
+ CardContent,
+ CardFooter,
+ CardHeader,
+ CardTitle,
+} from "@/components/ui/card"
+import {
+ Tooltip,
+ TooltipContent,
+ TooltipProvider,
+ TooltipTrigger,
+} from "@/components/ui/tooltip"
+import {
+ Carousel,
+ CarouselContent,
+ CarouselItem,
+ CarouselNext,
+ CarouselPrevious,
+} from "@/components/ui/carousel"
+import ReactionButton from '@/components/ReactionButton';
+import { Avatar, AvatarImage } from '@/components/ui/avatar';
+import ViewRawButton from '@/components/ViewRawButton';
+import ViewNoteButton from './ViewNoteButton';
+import Link from 'next/link';
+
+interface CommentCardProps {
+ pubkey: string;
+ text: string;
+ eventId: string;
+ tags: string[][];
+ event: any;
+}
+
+const NoteCard: React.FC = ({ pubkey, text, eventId, tags, event }) => {
+ const { data: userData } = useProfile({
+ pubkey,
+ });
+
+ const title = userData?.username || userData?.display_name || userData?.name || userData?.npub || nip19.npubEncode(pubkey);
+ const imageSrc = text.match(/https?:\/\/[^ ]*\.(png|jpg|gif)/g);
+ const textWithoutImage = text.replace(/https?:\/\/.*\.(?:png|jpg|gif)/g, '');
+ const createdAt = new Date(event.created_at * 1000);
+ const hrefProfile = `/profile/${nip19.npubEncode(pubkey)}`;
+ const profileImageSrc = userData?.picture || "https://robohash.org/" + pubkey;
+
+ return (
+ <>
+
+
+
+
+
+
+
+
+
+
+ {title}
+
+
+
+
+
+
+
+
+ {
+
+ {imageSrc && imageSrc.length > 1 ? (
+
+
+ {imageSrc.map((src, index) => (
+
+
+
+ ))}
+
+
+
+
+ ) : (
+ imageSrc ?

: ""
+ )}
+
+ }
+
+
+ {textWithoutImage}
+
+
+
+
+
+
+ {createdAt.toLocaleString()}
+
+
+ >
+ );
+}
+
+export default NoteCard;
\ No newline at end of file
diff --git a/lumina/components/CommentsCompontent.tsx b/lumina/components/CommentsCompontent.tsx
new file mode 100644
index 0000000..8f913a2
--- /dev/null
+++ b/lumina/components/CommentsCompontent.tsx
@@ -0,0 +1,34 @@
+import React from 'react';
+import { useNostrEvents } from "nostr-react";
+import {
+ nip19,
+} from "nostr-tools";
+import CommentCard from '@/components/CommentCard';
+
+interface CommentsCompontentProps {
+ pubkey: string;
+ event: any;
+}
+
+const CommentsCompontent: React.FC = ({ pubkey, event }) => {
+
+ const { events } = useNostrEvents({
+ filter: {
+ kinds: [1],
+ '#e': [event.id],
+ },
+ });
+
+ return (
+ <>
+ Comments
+ {events.map((event) => (
+
+
+
+ ))}
+ >
+ );
+}
+
+export default CommentsCompontent;
\ No newline at end of file
diff --git a/lumina/components/FollowButton.tsx b/lumina/components/FollowButton.tsx
new file mode 100644
index 0000000..a70001c
--- /dev/null
+++ b/lumina/components/FollowButton.tsx
@@ -0,0 +1,97 @@
+
+import React, { useEffect, useState } from 'react';
+import { Button } from './ui/button';
+import { useNostr, useNostrEvents } from 'nostr-react';
+import { finalizeEvent } from 'nostr-tools';
+import { sign } from 'crypto';
+import { SignalMedium } from 'lucide-react';
+
+interface FollowButtonProps {
+ pubkey: string;
+ userPubkey: string;
+}
+
+const FollowButton: React.FC = ({ pubkey, userPubkey }) => {
+ // const { publish } = useNostr();
+ const [isFollowing, setIsFollowing] = useState(false);
+
+ let storedPubkey: string | null = null;
+ let storedNsec: string | null = null;
+ let isLoggedIn = false;
+ if (typeof window !== 'undefined') {
+ storedPubkey = window.localStorage.getItem('pubkey');
+ storedNsec = window.localStorage.getItem('nsec');
+ isLoggedIn = storedPubkey !== null;
+ }
+
+ const { events } = useNostrEvents({
+ filter: {
+ kinds: [3],
+ authors: [userPubkey],
+ limit: 1,
+ },
+ });
+
+ let followingPubkeys = events.flatMap((event) => event.tags.map(tag => tag[1]));
+ // filter out all null or undefined
+ followingPubkeys = followingPubkeys.filter((tag) => tag);
+
+
+ useEffect(() => {
+ if (followingPubkeys.includes(pubkey)) {
+ setIsFollowing(true);
+ }
+ }, [followingPubkeys, isFollowing, setIsFollowing]);
+
+ const handleFollow = async () => {
+ // if (isLoggedIn) {
+
+ // let eventTemplate = {
+ // kind: 3,
+ // created_at: Math.floor(Date.now() / 1000),
+ // tags: [followingPubkeys],
+ // content: '',
+ // }
+
+ // console.log(eventTemplate);
+
+ // if (isFollowing) {
+ // eventTemplate.tags = eventTemplate.tags.filter(tag => tag[1] !== pubkey);
+ // } else {
+ // eventTemplate.tags[0].push(pubkey);
+ // }
+
+ // console.log(eventTemplate);
+
+ // let signedEvent = null;
+ // if (storedNsec != null) {
+ // // TODO: Sign Nostr Event with nsec
+ // const nsecArray = storedNsec ? new TextEncoder().encode(storedNsec) : new Uint8Array();
+ // signedEvent = finalizeEvent(eventTemplate, nsecArray);
+ // console.log(signedEvent);
+ // } else if (storedPubkey != null) {
+ // // TODO: Request Extension to sign Nostr Event
+ // console.log('Requesting Extension to sign Nostr Event..');
+ // try {
+ // signedEvent = await window.nostr.signEvent(eventTemplate);
+ // } catch (error) {
+ // console.error('Nostr Extension not found or aborted.');
+ // }
+ // }
+
+ // if (signedEvent !== null) {
+ // console.log(signedEvent);
+ // publish(signedEvent);
+ // setIsFollowing(!isFollowing);
+ // }
+ // }
+ };
+
+ return (
+
+ );
+};
+
+export default FollowButton;
\ No newline at end of file
diff --git a/lumina/components/FollowerFeed.tsx b/lumina/components/FollowerFeed.tsx
new file mode 100644
index 0000000..4a36966
--- /dev/null
+++ b/lumina/components/FollowerFeed.tsx
@@ -0,0 +1,54 @@
+import { useRef } from "react";
+import { useNostrEvents, dateToUnix } from "nostr-react";
+import NoteCard from './NoteCard';
+
+interface FollowerFeedProps {
+ pubkey: string;
+}
+
+const FollowerFeed: React.FC = ({ pubkey }) => {
+ const now = useRef(new Date()); // Make sure current time isn't re-rendered
+
+ const { events: following, isLoading: followingLoading } = useNostrEvents({
+ filter: {
+ kinds: [3],
+ authors: [pubkey],
+ limit: 1,
+ },
+ });
+ // let followingPubkeys = following.map((event) => event.tags[event.tags.length - 1][1]);
+ // let followingPubkeys = following.flatMap((event) => event.tags.map(tag => tag[1])).slice(0, 50);
+ let followingPubkeys = following.flatMap((event) => event.tags.map(tag => tag[1])).slice(0, 500);
+
+ const { events } = useNostrEvents({
+ filter: {
+ // since: dateToUnix(now.current), // all new events from now
+ // since: 0,
+ limit: 1000,
+ kinds: [1],
+ authors: followingPubkeys,
+ },
+ });
+
+ // const filteredEvents = events.filter((event) => event.content.includes(".jpg"));
+ // filter events with regex that checks for png, jpg, or gif
+ let filteredEvents = events.filter((event) => event.content.match(/https?:\/\/.*\.(?:png|jpg|gif|mp4|webm)/g)?.[0]);
+
+ // now filter all events with a tag[0] == t and tag[1] == nsfw
+ filteredEvents = filteredEvents.filter((event) => event.tags.map((tag) => tag[0] == "t" && tag[1] == "nsfw"));
+ // filter out all replies
+ filteredEvents = filteredEvents.filter((event) => !event.tags.some((tag) => { return tag[0] == 'e' }));
+
+ return (
+ <>
+ {filteredEvents.map((event) => (
+ // {event.pubkey} posted: {event.content}
+
+
+
+ ))}
+ >
+ );
+}
+
+export default FollowerFeed;
\ No newline at end of file
diff --git a/lumina/components/FollowerQuickViewFeed.tsx b/lumina/components/FollowerQuickViewFeed.tsx
new file mode 100644
index 0000000..8f4c002
--- /dev/null
+++ b/lumina/components/FollowerQuickViewFeed.tsx
@@ -0,0 +1,73 @@
+import { useRef } from "react";
+import { useNostrEvents, dateToUnix } from "nostr-react";
+import { Skeleton } from "@/components/ui/skeleton";
+import QuickViewNoteCard from "./QuickViewNoteCard";
+
+interface FollowerQuickViewFeedProps {
+ pubkey: string;
+}
+
+const FollowerQuickViewFeed: React.FC = ({ pubkey }) => {
+ const now = useRef(new Date()); // Make sure current time isn't re-rendered
+
+ const { events: following, isLoading: followingLoading } = useNostrEvents({
+ filter: {
+ kinds: [3],
+ authors: [pubkey],
+ limit: 1,
+ },
+ });
+ // let followingPubkeys = following.map((event) => event.tags[event.tags.length - 1][1]);
+ // let followingPubkeys = following.flatMap((event) => event.tags.map(tag => tag[1])).slice(0, 50);
+ let followingPubkeys = following.flatMap((event) => event.tags.map(tag => tag[1])).slice(0, 500);
+
+ const { events } = useNostrEvents({
+ filter: {
+ // since: dateToUnix(now.current), // all new events from now
+ // since: 0,
+ limit: 1000,
+ kinds: [1],
+ authors: followingPubkeys,
+ },
+ });
+
+ let filteredEvents = events.filter((event) => event.content.match(/https?:\/\/.*\.(?:png|jpg|gif)/g)?.[0]);
+ // filter out all replies (tag[0] == e)
+ filteredEvents = filteredEvents.filter((event) => !event.tags.some((tag) => { return tag[0] == 'e' }));
+
+ return (
+ <>
+
+ {filteredEvents.length === 0 ? (
+ <>
+
+
+
+ >
+ ) : (filteredEvents.map((event) => (
+
+ )))}
+
+ >
+ );
+}
+
+export default FollowerQuickViewFeed;
\ No newline at end of file
diff --git a/lumina/components/GlobalFeed.tsx b/lumina/components/GlobalFeed.tsx
index c4b376a..e09a0fa 100644
--- a/lumina/components/GlobalFeed.tsx
+++ b/lumina/components/GlobalFeed.tsx
@@ -30,7 +30,7 @@ const GlobalFeed: React.FC = () => {
{filteredEvents.map((event) => (
// {event.pubkey} posted: {event.content}
-
+
))}
>
diff --git a/lumina/components/LoginForm.tsx b/lumina/components/LoginForm.tsx
new file mode 100644
index 0000000..9033685
--- /dev/null
+++ b/lumina/components/LoginForm.tsx
@@ -0,0 +1,189 @@
+declare global {
+ interface Window {
+ nostr: any;
+ }
+}
+
+import { Button } from "@/components/ui/button"
+import {
+ Card,
+ CardContent,
+ CardDescription,
+ CardFooter,
+ CardHeader,
+ CardTitle,
+} from "@/components/ui/card"
+import { Input } from "@/components/ui/input"
+import { Label } from "@/components/ui/label"
+import {
+ Accordion,
+ AccordionContent,
+ AccordionItem,
+ AccordionTrigger,
+} from "@/components/ui/accordion"
+import { useEffect, useRef } from "react"
+import { getPublicKey, generateSecretKey, nip19 } from 'nostr-tools'
+import { InfoIcon } from "lucide-react";
+import Link from "next/link";
+import { bytesToHex, hexToBytes } from '@noble/hashes/utils'
+
+export function LoginForm() {
+
+ let publicKey = useRef(null);
+ let nsecInput = useRef(null);
+ let npubInput = useRef(null);
+
+ useEffect(() => {
+ // handle Amber Login Response
+ const urlParams = new URLSearchParams(window.location.search);
+ const amberResponse = urlParams.get('amberResponse');
+ if (amberResponse !== null) {
+ localStorage.setItem("pubkey", nip19.decode(amberResponse).data.toString());
+ localStorage.setItem("loginType", "amber");
+ window.location.href = `/profile/${amberResponse}`;
+ }
+ }, []);
+
+
+ const handleAmber = async () => {
+ const hostname = window.location.host;
+ console.log(hostname);
+ if (!hostname) {
+ throw new Error("Hostname is null or undefined");
+ }
+ const intent = `intent:#Intent;scheme=nostrsigner;S.compressionType=none;S.returnType=signature;S.type=get_public_key;S.callbackUrl=http://${hostname}/login?amberResponse=;end`;
+ window.location.href = intent;
+ }
+
+ const handleExtensionLogin = async () => {
+ // eslint-disable-next-line
+ if (window.nostr !== undefined) {
+ publicKey.current = await window.nostr.getPublicKey()
+ console.log("Logged in with pubkey: ", publicKey.current);
+ if (publicKey.current !== null) {
+ localStorage.setItem("pubkey", publicKey.current);
+ localStorage.setItem("loginType", "extension");
+ // window.location.reload();
+ window.location.href = `/profile/${nip19.npubEncode(publicKey.current)}`;
+ }
+ }
+ };
+
+ // const handleNsecSignUp = async () => {
+ // let nsec = generateSecretKey();
+ // console.log('nsec: ' + nsec);
+
+ // let nsecHex = bytesToHex(nsec);
+ // console.log('bytesToHex nsec: ' + nsecHex);
+
+ // let pubkey = getPublicKey(nsec);
+ // console.log('pubkey: ' + pubkey);
+
+ // localStorage.setItem("nsec", nsecHex);
+ // localStorage.setItem("pubkey", pubkey);
+ // localStorage.setItem("loginType", "raw_nsec")
+ // window.location.href = `/profile/${nip19.npubEncode(pubkey)}`;
+ // };
+
+ const handleNsecLogin = async () => {
+ if (nsecInput.current !== null) {
+ try {
+ let input = nsecInput.current.value;
+ if(input.includes("nsec")) {
+ input = bytesToHex(nip19.decode(input).data as Uint8Array);
+ console.log('decoded nsec: ' + input);
+ }
+ let nsecBytes = hexToBytes(input);
+ let nsecHex = bytesToHex(nsecBytes);
+ let pubkey = getPublicKey(nsecBytes);
+
+ localStorage.setItem("nsec", nsecHex);
+ localStorage.setItem("pubkey", pubkey);
+ localStorage.setItem("loginType", "raw_nsec")
+
+ window.location.href = `/profile/${nip19.npubEncode(pubkey)}`;
+ } catch (e) {
+ console.error(e);
+ }
+ }
+ };
+
+ const handleNpubLogin = async () => {
+ if (npubInput.current !== null) {
+ try {
+ let input = npubInput.current.value;
+ let npub = null;
+ let pubkey = null;
+ if(input.startsWith("npub1")) {
+ npub = input;
+ pubkey = nip19.decode(input).data.toString();
+ } else {
+ pubkey = input;
+ npub = nip19.npubEncode(input);
+ }
+
+ localStorage.setItem("pubkey", pubkey);
+ localStorage.setItem("loginType", "readOnly_npub")
+
+ window.location.href = `/profile/${npub}`;
+ } catch (e) {
+ console.error(e);
+ }
+ }
+ };
+
+
+ return (
+
+
+ Login to Lumina
+
+ Login to your account either with a nostr extension or with your nsec.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ or
+
+
+ Login with npub (read-only)
+
+
+
+
+
+
+
+
+
+ or
+
+
+ Login with nsec (not recommended)
+
+
+
+
+
+
+
+
+
+
+
+
+
+ )
+}
\ No newline at end of file
diff --git a/lumina/components/Navigation.tsx b/lumina/components/Navigation.tsx
deleted file mode 100644
index fc3f125..0000000
--- a/lumina/components/Navigation.tsx
+++ /dev/null
@@ -1,16 +0,0 @@
-"use client"
-
-import * as React from "react"
-import { MoonIcon, SunIcon } from "@radix-ui/react-icons"
-import { DropdownThemeMode } from "@/components/DropdownThemeMode"
-
-export function Navigation() {
-
- return (
-
- )
-}
diff --git a/lumina/components/NoteCard.tsx b/lumina/components/NoteCard.tsx
index 3671082..3ba7913 100644
--- a/lumina/components/NoteCard.tsx
+++ b/lumina/components/NoteCard.tsx
@@ -1,14 +1,11 @@
import React from 'react';
-// import Button from 'react-bootstrap/Button';
-import { Button } from '@/components/ui/button';
-import { useNostrEvents, useProfile } from "nostr-react";
+import { useProfile } from "nostr-react";
import {
nip19,
} from "nostr-tools";
import {
Card,
CardContent,
- CardDescription,
CardFooter,
CardHeader,
CardTitle,
@@ -27,113 +24,135 @@ import {
CarouselPrevious,
} from "@/components/ui/carousel"
import ReactionButton from '@/components/ReactionButton';
-import { Avatar, AvatarFallback, AvatarImage } from '@/components/ui/avatar';
+import { Avatar, AvatarImage } from '@/components/ui/avatar';
import ViewRawButton from '@/components/ViewRawButton';
-import Image from 'next/image';
+import ViewNoteButton from './ViewNoteButton';
+import Link from 'next/link';
+import ViewCopyButton from './ViewCopyButton';
+import { Event as NostrEvent } from "nostr-tools";
+import ZapButton from './ZapButton';
interface NoteCardProps {
pubkey: string;
text: string;
eventId: string;
tags: string[][];
- event: any;
+ event: NostrEvent;
+ showViewNoteCardButton: boolean;
}
-const NoteCard: React.FC = ({ pubkey, text, eventId, tags, event }) => {
+const NoteCard: React.FC = ({ pubkey, text, eventId, tags, event, showViewNoteCardButton }) => {
const { data: userData } = useProfile({
pubkey,
});
const title = userData?.username || userData?.display_name || userData?.name || userData?.npub || nip19.npubEncode(pubkey);
- // const imageSrc = text.match(/https?:\/\/.*\.(?:png|jpg|gif)/g)?.[0];
- const imageSrc = text.match(/https?:\/\/.*\.(?:png|jpg|gif)/g)?.[0].split(' ');
- const textWithoutImage = text.replace(/https?:\/\/.*\.(?:png|jpg|gif)/g, '');
- // const textWithoutImage = text.replace(/https?:\/\/.*\.(?:png|jpg|gif)(\?.*)?/g, '');
+ // text = text.replaceAll('\n', '
');
+ text = text.replaceAll('\n', ' ');
+ const imageSrc = text.match(/https?:\/\/[^ ]*\.(png|jpg|gif)/g);
+ const videoSrc = text.match(/https?:\/\/[^ ]*\.(mp4|webm|mov)/g);
+ const textWithoutImage = text.replace(/https?:\/\/.*\.(?:png|jpg|gif|mp4|webm|mov)/g, '');
const createdAt = new Date(event.created_at * 1000);
const hrefProfile = `/profile/${nip19.npubEncode(pubkey)}`;
- // const profileImageSrc = userData?.picture || "https://via.placeholder.com/150";
const profileImageSrc = userData?.picture || "https://robohash.org/" + pubkey;
return (
<>
-
-
-
-
- {/*
-
- */}
- {/* {title} */}
-
-
-
-
-
-
-
-
- {title}
-
-
-
-
-
- {/* Card Description */}
-
-
-
- {
- // imageSrc ? imageSrc.map((src, index) =>

) : ""
-
- {imageSrc && imageSrc.length > 1 ? (
-
-
- {imageSrc.map((src, index) => (
-
-
- {/* */}
-
- ))}
-
-
-
-
- ) : (
- imageSrc ?

: ""
- // imageSrc ?
: ""
- )}
+
+
+
+
+
+
+
+
+
+
+ {title}
+
+
+
+
+
+
+
+
+ {
+
+
+ {imageSrc && imageSrc.length > 1 ? (
+
+
+ {imageSrc.map((src, index) => (
+
+
+
+ ))}
+
+
+
+
+ ) : (
+ imageSrc ?

: ""
+ )}
+
+
+ {videoSrc && videoSrc.length > 1 ? (
+
+
+ {videoSrc.map((src, index) => (
+
+
+
+ ))}
+
+
+
+
+ ) : (
+ videoSrc ? : ""
+ )}
+
+
+ }
+
+
+ {textWithoutImage}
+
- }
-
- {textWithoutImage}
-
-
-
-
-
-
-
-
- {createdAt.toLocaleString()}
-
-
+
+
+
+
+
+ {showViewNoteCardButton && }
+
+
+
+
+
+
+
+
+ {createdAt.toLocaleString()}
+
+
>
);
}
diff --git a/lumina/components/NotePageComponent.tsx b/lumina/components/NotePageComponent.tsx
new file mode 100644
index 0000000..7cfa1d6
--- /dev/null
+++ b/lumina/components/NotePageComponent.tsx
@@ -0,0 +1,41 @@
+import { useRef } from "react";
+import { useNostrEvents } from "nostr-react";
+import NoteCard from '@/components/NoteCard';
+import CommentsCompontent from "@/components/CommentsCompontent";
+
+interface NotePageComponentProps {
+ id: string;
+}
+
+const NotePageComponent: React.FC
= ({ id }) => {
+ const now = useRef(new Date()); // Make sure current time isn't re-rendered
+
+ const { events } = useNostrEvents({
+ filter: {
+ // since: dateToUnix(now.current), // all new events from now
+ // since: 0,
+ ids: [id],
+ limit: 1,
+ kinds: [1],
+ },
+ });
+
+ // filter out all events that also have another e tag with another id
+ const filteredEvents = events.filter((event) => { return event.tags.filter((tag) => { return tag[0] === '#e' && tag[1] !== id }).length === 0 });
+
+ return (
+ <>
+ {events.map((event) => (
+ // {event.pubkey} posted: {event.content}
+
+ ))}
+ >
+ );
+}
+
+export default NotePageComponent;
\ No newline at end of file
diff --git a/lumina/components/Notification.tsx b/lumina/components/Notification.tsx
new file mode 100644
index 0000000..3351f41
--- /dev/null
+++ b/lumina/components/Notification.tsx
@@ -0,0 +1,112 @@
+import React from 'react';
+import { useNostrEvents, useProfile } from "nostr-react";
+import { Card, CardHeader, CardTitle, CardContent, CardFooter, CardDescription } from '@/components/ui/card';
+import {
+ NostrEvent,
+ Event,
+ nip19,
+} from "nostr-tools";
+import { Avatar, AvatarImage } from './ui/avatar';
+import Link from 'next/link';
+
+interface NotificationProps {
+ event: NostrEvent;
+}
+
+const Notification: React.FC = ({ event }) => {
+ let sender = event.pubkey;
+ let sats = 0;
+ let reactedToId = '';
+
+ const { data: userData, isLoading: userDataLoading } = useProfile({
+ pubkey: sender,
+ });
+
+ if (!event) {
+ return null;
+ }
+
+ if (event.kind === 9735) {
+ for (let tag of event.tags) {
+ if (tag[0] === 'P') {
+ sender = tag[1];
+ }
+ if (tag[0] === 'bolt11') {
+ let bolt11decoded = require('light-bolt11-decoder').decode(tag[1]);
+ for (let field of bolt11decoded.sections) {
+ if (field.name === 'amount') {
+ sats = field.value / 1000;
+ }
+ }
+ }
+ }
+ }
+
+ if (event.kind === 7) {
+ for (let tag of event.tags) {
+ if (tag[0] === 'e') {
+ reactedToId = tag[1];
+ }
+ }
+ }
+
+ let name = userData?.name ?? nip19.npubEncode(event.pubkey).slice(0, 8) + ':' + nip19.npubEncode(event.pubkey).slice(-3);
+ let createdAt = new Date(event.created_at * 1000);
+
+ return (
+ <>
+
+ {/* ZAP */}
+ {event.kind === 9735 && (
+
+
{sats} sats ⚡️
+
+
+
{name} zapped you
+
{createdAt.toLocaleDateString() + ' ' + createdAt.toLocaleTimeString()}
+
+
+ )}
+ {/* FOLLOW */}
+ {event.kind === 3 && (
+
+
{event.content}
+
+
+
{name} started following you
+
{createdAt.toLocaleDateString() + ' ' + createdAt.toLocaleTimeString()}
+
+
+ )}
+ {/* REACTION */}
+ {event.kind === 7 && (
+
+
+
{event.content}
+
+
+
{name} reacted to you
+
{createdAt.toLocaleDateString() + ' ' + createdAt.toLocaleTimeString()}
+
+
+
+ )}
+
+
+ >
+ );
+}
+
+export default Notification;
\ No newline at end of file
diff --git a/lumina/components/Notifications.tsx b/lumina/components/Notifications.tsx
new file mode 100644
index 0000000..4920166
--- /dev/null
+++ b/lumina/components/Notifications.tsx
@@ -0,0 +1,86 @@
+import React from 'react';
+import { useNostrEvents, useProfile } from "nostr-react";
+import { Card, CardHeader, CardTitle, CardContent, CardFooter, CardDescription } from '@/components/ui/card';
+import { Skeleton } from '@/components/ui/skeleton';
+import { AvatarImage } from '@radix-ui/react-avatar';
+import { Avatar } from '@/components/ui/avatar';
+import NIP05 from '@/components/nip05';
+import {
+ nip19,
+} from "nostr-tools";
+import Notification from './Notification';
+
+interface NotificationsProps {
+ pubkey: string;
+}
+
+const Notifications: React.FC = ({ pubkey }) => {
+ const { data: userData, isLoading: userDataLoading } = useProfile({
+ pubkey,
+ });
+
+
+ // const { events: followers, isLoading: followersLoading } = useNostrEvents({
+ // filter: {
+ // kinds: [3],
+ // '#p': [pubkey],
+ // limit: 50,
+ // },
+ // });
+
+ const { events: zaps, isLoading: zapsLoading } = useNostrEvents({
+ filter: {
+ kinds: [9735],
+ '#p': [pubkey],
+ limit: 20,
+ },
+ });
+
+ const { events: reactions, isLoading: reactionsLoading } = useNostrEvents({
+ filter: {
+ kinds: [7],
+ '#p': [pubkey],
+ limit: 20,
+ },
+ });
+
+ // const { events: following, isLoading: followingLoading } = useNostrEvents({
+ // filter: {
+ // kinds: [3],
+ // authors: [pubkey],
+ // limit: 1,
+ // },
+ // });
+
+ // filter for only new followings (latest in a users followers list)
+ // const filteredFollowers = followers.filter(follower => {
+ // const lastPTag = follower.tags[follower.tags.length - 1];
+ // if (lastPTag[0] === "p" && lastPTag[1] === pubkey.toString()) {
+ // // console.log(follower.tags[follower.tags.length - 1]);
+ // return true;
+ // }
+ // });
+
+ // let allNotifications = [...filteredFollowers, ...zaps].sort((a, b) => b.created_at - a.created_at);
+ let allNotifications = [...zaps, ...reactions].sort((a, b) => b.created_at - a.created_at);
+
+ return (
+ <>
+
+ {/*
*/}
+
+
+ Notifications
+
+
+ {allNotifications.map((notification, index) => (
+
+ ))}
+
+
+
+ >
+ );
+}
+
+export default Notifications;
\ No newline at end of file
diff --git a/lumina/components/ProfileFeed.tsx b/lumina/components/ProfileFeed.tsx
index b3cedcf..182e6f4 100644
--- a/lumina/components/ProfileFeed.tsx
+++ b/lumina/components/ProfileFeed.tsx
@@ -20,7 +20,7 @@ const ProfileFeed: React.FC = ({ pubkey }) => {
},
});
- let filteredEvents = events.filter((event) => event.content.match(/https?:\/\/.*\.(?:png|jpg|gif)/g)?.[0]);
+ let filteredEvents = events.filter((event) => event.content.match(/https?:\/\/.*\.(?:png|jpg|gif|mp4|webm|mov)/g)?.[0]);
// filter out all replies (tag[0] == e)
filteredEvents = filteredEvents.filter((event) => !event.tags.some((tag) => { return tag[0] == 'e' }));
@@ -40,7 +40,7 @@ const ProfileFeed: React.FC = ({ pubkey }) => {
// {event.pubkey} posted: {event.content}
//
-
+
)))}
>
diff --git a/lumina/components/ProfileInfoCard.tsx b/lumina/components/ProfileInfoCard.tsx
index 5ef2bef..3032fa5 100644
--- a/lumina/components/ProfileInfoCard.tsx
+++ b/lumina/components/ProfileInfoCard.tsx
@@ -1,35 +1,148 @@
-import React from 'react';
+import React, { useMemo } from 'react';
import { useProfile } from "nostr-react";
-import { Card, CardHeader, CardTitle, CardContent, CardFooter } from '@/components/ui/card';
-import { Skeleton } from './ui/skeleton';
+import { Card, CardHeader, CardTitle, CardContent } from '@/components/ui/card';
+import { AvatarImage } from '@radix-ui/react-avatar';
+import { Avatar } from '@/components/ui/avatar';
+import NIP05 from '@/components/nip05';
+import { nip19 } from "nostr-tools";
+import Link from 'next/link';
+import { Button } from './ui/button';
+import { ImStatsDots } from "react-icons/im";
+import FollowButton from './FollowButton';
+import {
+ Drawer,
+ DrawerClose,
+ DrawerContent,
+ DrawerDescription,
+ DrawerFooter,
+ DrawerHeader,
+ DrawerTitle,
+ DrawerTrigger,
+} from "@/components/ui/drawer"
+import { Input } from './ui/input';
+import { Share1Icon } from '@radix-ui/react-icons';
+import { toast } from './ui/use-toast';
interface ProfileInfoCardProps {
pubkey: string;
}
-const ProfileInfoCard: React.FC = ({ pubkey }) => {
- const { data: userData } = useProfile({
- pubkey,
- });
+const ProfileInfoCard: React.FC = React.memo(({ pubkey }) => {
- const title = userData?.username || userData?.display_name || userData?.name || userData?.npub;
+ let userPubkey = '';
+ let host = '';
+ if (typeof window !== 'undefined') {
+ userPubkey = window.localStorage.getItem('pubkey') ?? '';
+ host = window.location.host;
+ }
+
+ const { data: userData, isLoading } = useProfile({ pubkey });
+
+ const npubShortened = useMemo(() => {
+ let encoded = nip19.npubEncode(pubkey);
+ let parts = encoded.split('npub');
+ return 'npub' + parts[1].slice(0, 4) + ':' + parts[1].slice(-3);
+ }, [pubkey]);
+
+ const title = userData?.username || userData?.display_name || userData?.name || userData?.npub || npubShortened;
const description = userData?.about?.replace(/(?:\r\n|\r|\n)/g, '
');
+ const nip05 = userData?.nip05;
+
+ const handleCopyLink = async () => {
+ try {
+ await navigator.clipboard.writeText(host+"/profile/"+nip19.npubEncode(pubkey));
+ toast({
+ description: 'URL copied to clipboard',
+ title: 'Copied'
+ });
+ } catch (err) {
+ toast({
+ description: 'Error copying URL to clipboard',
+ title: 'Error',
+ variant: 'destructive'
+ });
+ }
+ };
+
+ const handleCopyPublicKey = async () => {
+ try {
+ await navigator.clipboard.writeText(nip19.npubEncode(pubkey));
+ toast({
+ description: 'PublicKey copied to clipboard',
+ title: 'Copied'
+ });
+ } catch (err) {
+ toast({
+ description: 'Error copying PublicKey to clipboard',
+ title: 'Error',
+ variant: 'destructive'
+ });
+ }
+ };
+
return (
- <>
- {title}
-
- {description ? (
-
-
-
- ) : (
-
-
+
+
+
+
+
+
+
+
+
+
+
+ {/*
*/}
+
+
+
+
+
+
+
+
+
+
+
+
+ Share this Profile
+ Share this Profile with others.
+
+
+ {/*
URL
*/}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
- )}
-
- >
+
+
+
+
+
+
);
-}
+});
+
+ProfileInfoCard.displayName = 'ProfileInfoCard';
export default ProfileInfoCard;
\ No newline at end of file
diff --git a/lumina/components/ProfileQuickViewFeed.tsx b/lumina/components/ProfileQuickViewFeed.tsx
new file mode 100644
index 0000000..678a4c6
--- /dev/null
+++ b/lumina/components/ProfileQuickViewFeed.tsx
@@ -0,0 +1,63 @@
+import { useRef, useState } from "react";
+import { useNostrEvents, dateToUnix } from "nostr-react";
+import { Skeleton } from "@/components/ui/skeleton";
+import QuickViewNoteCard from "./QuickViewNoteCard";
+import { Button } from "@/components/ui/button";
+
+interface ProfileQuickViewFeedProps {
+ pubkey: string;
+}
+
+const ProfileQuickViewFeed: React.FC
= ({ pubkey }) => {
+ const now = useRef(new Date()); // Make sure current time isn't re-rendered
+ const [limit, setLimit] = useState(100);
+
+ const { isLoading ,events } = useNostrEvents({
+ filter: {
+ authors: [pubkey],
+ limit: limit,
+ kinds: [1],
+ },
+ });
+
+ let filteredEvents = events.filter((event) => event.content.match(/https?:\/\/.*\.(?:png|jpg|gif|mp4|webm|mov)/g)?.[0]);
+ // filter out all replies (tag[0] == e)
+ filteredEvents = filteredEvents.filter((event) => !event.tags.some((tag) => { return tag[0] == 'e' }));
+
+ const loadMore = () => {
+ setLimit(limit => limit + 50);
+ }
+
+ return (
+ <>
+
+ {filteredEvents.length === 0 && isLoading ? (
+ <>
+
+
+
+
+
+
+
+
+
+ >
+ ) : (
+ <>
+ {filteredEvents.map((event) => (
+
+ ))}
+ >
+ )}
+
+ {!isLoading ? (
+
+
+
+ ) : null}
+ >
+ );
+}
+
+export default ProfileQuickViewFeed;
\ No newline at end of file
diff --git a/lumina/components/ProfileTextFeed.tsx b/lumina/components/ProfileTextFeed.tsx
new file mode 100644
index 0000000..56f6b71
--- /dev/null
+++ b/lumina/components/ProfileTextFeed.tsx
@@ -0,0 +1,51 @@
+import { useRef } from "react";
+import { useNostrEvents, dateToUnix } from "nostr-react";
+import NoteCard from '@/components/NoteCard';
+import { Skeleton } from "@/components/ui/skeleton";
+
+interface ProfileTextFeedProps {
+ pubkey: string;
+}
+
+const ProfileTextFeed: React.FC = ({ pubkey }) => {
+ const now = useRef(new Date()); // Make sure current time isn't re-rendered
+
+ const { events, isLoading } = useNostrEvents({
+ filter: {
+ // since: dateToUnix(now.current), // all new events from now
+ authors: [pubkey],
+ // since: 0,
+ // limit: 10,
+ kinds: [1],
+ },
+ });
+
+ // filter out all images since we only want text messages
+ let filteredEvents = events.filter((event) => !event.content.match(/https?:\/\/.*\.(?:png|jpg|gif)/g)?.[0]);
+ // filter out all replies (tag[0] == e)
+ filteredEvents = filteredEvents.filter((event) => !event.tags.some((tag) => { return tag[0] == 'e' }));
+
+ return (
+ <>
+ {/* Profile Feed
*/}
+
+ {filteredEvents.length === 0 && isLoading ? (
+
+ ) : (filteredEvents.map((event) => (
+ // {event.pubkey} posted: {event.content}
+ //
+
+
+
+ )))}
+ >
+ );
+}
+
+export default ProfileTextFeed;
\ No newline at end of file
diff --git a/lumina/components/QuickViewNoteCard.tsx b/lumina/components/QuickViewNoteCard.tsx
new file mode 100644
index 0000000..33e15db
--- /dev/null
+++ b/lumina/components/QuickViewNoteCard.tsx
@@ -0,0 +1,86 @@
+import React from 'react';
+import { useProfile } from "nostr-react";
+import {
+ nip19,
+} from "nostr-tools";
+import {
+ Card,
+ SmallCardContent,
+} from "@/components/ui/card"
+import Image from 'next/image';
+import Link from 'next/link';
+import { PlayIcon, StackIcon, VideoIcon } from '@radix-ui/react-icons';
+
+interface NoteCardProps {
+ pubkey: string;
+ text: string;
+ eventId: string;
+ tags: string[][];
+ event: any;
+ linkToNote: boolean;
+}
+
+const QuickViewNoteCard: React.FC = ({ pubkey, text, eventId, tags, event, linkToNote }) => {
+ const { data: userData } = useProfile({
+ pubkey,
+ });
+
+ const title = userData?.username || userData?.display_name || userData?.name || userData?.npub || nip19.npubEncode(pubkey);
+ text = text.replaceAll('\n', ' ');
+ const imageSrc = text.match(/https?:\/\/[^ ]*\.(png|jpg|gif)/g);
+ const videoSrc = text.match(/https?:\/\/[^ ]*\.(mp4|webm|mov)/g);
+ const textWithoutImage = text.replace(/https?:\/\/.*\.(?:png|jpg|gif|mp4|webm|mov)/g, '');
+ const createdAt = new Date(event.created_at * 1000);
+ const hrefProfile = `/profile/${nip19.npubEncode(pubkey)}`;
+ const profileImageSrc = userData?.picture || "https://robohash.org/" + pubkey;
+ const encodedNoteId = nip19.noteEncode(event.id)
+
+ const card = (
+
+
+
+
+ {imageSrc && imageSrc.length > 1 && !videoSrc ? (
+
+
+
+
+

+
+ ) : imageSrc && imageSrc.length > 0 ? (
+
+ {videoSrc && videoSrc.length > 0 &&
+
+ }
+

+
+ ) : videoSrc && videoSrc.length > 0 ? (
+
+ ) : null}
+
+
+
+
+ );
+
+ return (
+ <>
+ {linkToNote ? (
+
+ {card}
+
+ ) : (
+ card
+ )}
+ >
+ );
+}
+
+export default QuickViewNoteCard;
\ No newline at end of file
diff --git a/lumina/components/ReactionButton.tsx b/lumina/components/ReactionButton.tsx
index e1b79fd..16565e8 100644
--- a/lumina/components/ReactionButton.tsx
+++ b/lumina/components/ReactionButton.tsx
@@ -4,12 +4,24 @@ import {
type Event as NostrEvent,
getEventHash,
getPublicKey,
- getSignature,
+ finalizeEvent,
} from "nostr-tools";
import { Button } from "@/components/ui/button";
+import {
+ Drawer,
+ DrawerClose,
+ DrawerContent,
+ DrawerDescription,
+ DrawerFooter,
+ DrawerHeader,
+ DrawerTitle,
+ DrawerTrigger,
+} from "@/components/ui/drawer"
+import { ReloadIcon } from "@radix-ui/react-icons";
+import ReactionButtonReactionList from "./ReactionButtonReactionList";
-export default function ReactionButton(event: any) {
- const { events } = useNostrEvents({
+export default function ReactionButton({ event }: { event: any }) {
+ const { events, isLoading } = useNostrEvents({
filter: {
// since: dateToUnix(now.current), // all new events from now
// since: 0,
@@ -19,40 +31,73 @@ export default function ReactionButton(event: any) {
},
});
- const { publish } = useNostr();
+ // filter out all events that also have another e tag with another id
+ // this will filter out likes that are made on comments and not on the note itself
+ const filteredEvents = events.filter((event) => { return event.tags.filter((tag) => { return tag[0] === '#e' && tag[1] !== event.id }).length === 0 });
- const onPost = async () => {
- const privKey = prompt("Paste your private key:");
+ // const { publish } = useNostr();
- if (!privKey) {
- alert("no private key provided");
- return;
- }
+ // const onPost = async () => {
+ // const privKey = prompt("Paste your private key:");
- const message = prompt("Enter the message you want to send:");
+ // if (!privKey) {
+ // alert("no private key provided");
+ // return;
+ // }
- if (!message) {
- alert("no message provided");
- return;
- }
+ // const message = prompt("Enter the message you want to send:");
- const event: NostrEvent = {
- content: message,
- kind: 1,
- tags: [],
- created_at: dateToUnix(),
- pubkey: getPublicKey(privKey),
- id: "",
- sig: ""
- };
+ // if (!message) {
+ // alert("no message provided");
+ // return;
+ // }
- event.id = getEventHash(event);
- event.sig = getSignature(event, privKey);
+ // const event: NostrEvent = {
+ // content: message,
+ // kind: 1,
+ // tags: [],
+ // created_at: dateToUnix(),
+ // pubkey: getPublicKey(privKey),
+ // id: "",
+ // sig: ""
+ // };
- publish(event);
- };
+ // event.id = getEventHash(event);
+ // event.sig = getSignature(event, privKey);
+
+ // publish(event);
+ // };
return (
-
+
+
+ {/* */}
+ {isLoading ? (
+
+ ) : (
+
+ )}
+
+
+
+ Reactions
+
+ {/* TODO: Create Reaction Event on Click */}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ //
);
}
\ No newline at end of file
diff --git a/lumina/components/ReactionButtonReactionList.tsx b/lumina/components/ReactionButtonReactionList.tsx
new file mode 100644
index 0000000..13d0a7f
--- /dev/null
+++ b/lumina/components/ReactionButtonReactionList.tsx
@@ -0,0 +1,12 @@
+import { ScrollArea } from "@/components/ui/scroll-area"
+import ReactionButtonReactionListItem from "./ReactionButtonReactionListItem";
+
+export default function ReactionButtonReactionList({ filteredEvents }: { filteredEvents: any }) {
+ return (
+
+ {filteredEvents.map((event: any) => (
+
+ ))}
+
+ );
+}
\ No newline at end of file
diff --git a/lumina/components/ReactionButtonReactionListItem.tsx b/lumina/components/ReactionButtonReactionListItem.tsx
new file mode 100644
index 0000000..6dff4cc
--- /dev/null
+++ b/lumina/components/ReactionButtonReactionListItem.tsx
@@ -0,0 +1,43 @@
+import Link from "next/link";
+import { useNostr, dateToUnix, useNostrEvents, useProfile } from "nostr-react";
+
+import {
+ type Event as NostrEvent,
+ getEventHash,
+ getPublicKey,
+ finalizeEvent,
+ nip19,
+} from "nostr-tools";
+import { Avatar, AvatarImage } from "@/components/ui/avatar";
+
+export default function ReactionButtonReactionListItem({ event }: { event: NostrEvent }) {
+
+ let pubkey = event.pubkey;
+
+ const { data: userData } = useProfile({
+ pubkey,
+ });
+
+ const title = userData?.username || userData?.display_name || userData?.name || nip19.npubEncode(pubkey).slice(0, 8) + ':' + nip19.npubEncode(pubkey).slice(-3);;
+ const createdAt = new Date(event.created_at * 1000);
+ const hrefProfile = `/profile/${nip19.npubEncode(pubkey)}`;
+ const profileImageSrc = userData?.picture || "https://robohash.org/" + pubkey;
+ const content = event.content;
+
+ console.log("event", event.content);
+
+ return (
+
+
+
+ {/*

*/}
+
+
+
+
{title}
+
{content}
+
+
+
+ );
+}
\ No newline at end of file
diff --git a/lumina/components/ReelFeed.tsx b/lumina/components/ReelFeed.tsx
new file mode 100644
index 0000000..7cf8f9f
--- /dev/null
+++ b/lumina/components/ReelFeed.tsx
@@ -0,0 +1,40 @@
+import { useRef } from "react";
+import { useNostrEvents, dateToUnix } from "nostr-react";
+import NoteCard from './NoteCard';
+
+const ReelFeed: React.FC = () => {
+ const now = useRef(new Date()); // Make sure current time isn't re-rendered
+
+ const { events } = useNostrEvents({
+ filter: {
+ // since: dateToUnix(now.current), // all new events from now
+ // since: 0,
+ // limit: 100,
+ kinds: [1063],
+ },
+ });
+
+ // const filteredEvents = events.filter((event) => event.content.includes(".jpg"));
+ // filter events with regex that checks for png, jpg, or gif
+ let filteredEvents = events.filter((event) => event.content.match(/https?:\/\/.*\.(?:png|jpg|gif)/g)?.[0]);
+
+ // now filter all events with a tag[0] == t and tag[1] == nsfw
+ // filteredEvents = filteredEvents.filter((event) => event.tags.map((tag) => tag[0] == "t" && tag[1] == "nsfw"));
+ filteredEvents = filteredEvents.filter((event) => !event.tags.some((tag) => { return tag[0] == 't' && tag[1] == 'nsfw'}));
+ // filter out all replies
+ filteredEvents = filteredEvents.filter((event) => !event.tags.some((tag) => { return tag[0] == 'e' }));
+
+ return (
+ <>
+ Reel Feed
+ {filteredEvents.map((event) => (
+ // {event.pubkey} posted: {event.content}
+
+
+
+ ))}
+ >
+ );
+}
+
+export default ReelFeed;
\ No newline at end of file
diff --git a/lumina/components/Search.tsx b/lumina/components/Search.tsx
new file mode 100644
index 0000000..82a2c9e
--- /dev/null
+++ b/lumina/components/Search.tsx
@@ -0,0 +1,62 @@
+import { Button } from "@/components/ui/button"
+import { Input } from "@/components/ui/input"
+import { queryProfile } from "nostr-tools/nip05"
+import { nip19 } from "nostr-tools"
+import { useState } from 'react';
+import { ReloadIcon } from "@radix-ui/react-icons";
+// import { useRouter } from 'next/router';
+import { useRouter } from 'next/navigation';
+
+export function Search() {
+ const router = useRouter();
+
+ const [inputValue, setInputValue] = useState('');
+ const [isLoading, setIsLoading] = useState(false); // Neuer Zustand für das Laden
+
+ const calculateAndRedirect = async () => {
+ setIsLoading(true);
+
+ if (inputValue.startsWith('npub')) { // npub Search
+ // window.location.href = `/profile/${inputValue}`;
+ router.push(`/profile/${inputValue}`);
+ } else if (inputValue.startsWith('#')) { // Hashtag Search
+ // window.location.href = `/tag/${inputValue.replaceAll('#', '')}`;
+ router.push(`/tag/${inputValue.replaceAll('#', '')}`);
+ } else if(inputValue.includes('@')) { // NIP-05 Search
+ // if inputValue starts with @, then add a "_" at the beginning
+ if(inputValue.startsWith('@')) {
+ setInputValue('_' + inputValue);
+ }
+
+ let profile = await queryProfile(inputValue);
+ if(profile?.pubkey !== undefined) { // Only redirect if profile is found
+ router.push(`/profile/${nip19.npubEncode(profile?.pubkey)}`);
+ }
+ } else {
+ router.push(`/search/${inputValue}`);
+ }
+ setIsLoading(false);
+ }
+
+ const handleKeyDown = (event: React.KeyboardEvent) => {
+ if (event.key === 'Enter') {
+ calculateAndRedirect();
+ }
+ }
+
+ return (
+
+ setInputValue(e.target.value)}
+ onKeyDown={handleKeyDown}
+ />
+ {/* */}
+
+
+ )
+}
\ No newline at end of file
diff --git a/lumina/components/TagFeed.tsx b/lumina/components/TagFeed.tsx
index ddcf488..2d38764 100644
--- a/lumina/components/TagFeed.tsx
+++ b/lumina/components/TagFeed.tsx
@@ -21,7 +21,7 @@ const TagFeed: React.FC = ({tag}) => {
// const filteredEvents = events.filter((event) => event.content.includes(".jpg"));
// filter events with regex that checks for png, jpg, or gif
- let filteredEvents = events.filter((event) => event.content.match(/https?:\/\/.*\.(?:png|jpg|gif)/g)?.[0]);
+ let filteredEvents = events.filter((event) => event.content.match(/https?:\/\/.*\.(?:png|jpg|gif|mp4|webm)/g)?.[0]);
// now filter all events with a tag[0] == t and tag[1] == nsfw
filteredEvents = filteredEvents.filter((event) => event.tags.map((tag) => tag[0] == "t" && tag[1] == "nsfw"));
@@ -34,7 +34,7 @@ const TagFeed: React.FC = ({tag}) => {
{filteredEvents.map((event) => (
// {event.pubkey} posted: {event.content}
-
+
))}
>
diff --git a/lumina/components/TrendingAccount.tsx b/lumina/components/TrendingAccount.tsx
new file mode 100644
index 0000000..9d844a8
--- /dev/null
+++ b/lumina/components/TrendingAccount.tsx
@@ -0,0 +1,55 @@
+import React from 'react';
+import { useProfile } from "nostr-react";
+import {
+ nip19,
+} from "nostr-tools";
+import {
+ Card,
+ CardHeader,
+ CardTitle,
+ SmallCardContent,
+} from "@/components/ui/card"
+import { Avatar, AvatarImage } from '@/components/ui/avatar';
+import Link from 'next/link';
+
+interface TrendingAccountProps {
+ pubkey: string;
+}
+
+const TrendingAccount: React.FC = ({ pubkey }) => {
+ const { data: userData } = useProfile({
+ pubkey,
+ });
+
+ const title = userData?.username || userData?.display_name || userData?.name || userData?.npub || nip19.npubEncode(pubkey);
+ const hrefProfile = `/profile/${nip19.npubEncode(pubkey)}`;
+ const profileImageSrc = userData?.picture || "https://robohash.org/" + pubkey;
+
+ return (
+ <>
+
+
+
+
+
+
+
+
+ {/*
{title.substring(0, 12)} */}
+
{title}
+
+
+
+
+
+
+
+
+ >
+ );
+}
+
+export default TrendingAccount;
\ No newline at end of file
diff --git a/lumina/components/TrendingAccounts.tsx b/lumina/components/TrendingAccounts.tsx
index d64ad5d..bcc48a2 100644
--- a/lumina/components/TrendingAccounts.tsx
+++ b/lumina/components/TrendingAccounts.tsx
@@ -1,39 +1,26 @@
-import { useRef } from "react";
-import { useNostrEvents, dateToUnix } from "nostr-react";
-import NoteCard from './NoteCard';
+import React, { useState, useEffect } from 'react';
+import TrendingAccount from '@/components/TrendingAccount';
-const TrendingAccounts: React.FC = () => {
- const now = useRef(new Date()); // Make sure current time isn't re-rendered
+export function TrendingAccounts() {
+ const [profiles, setProfiles] = useState([]);
- const { events } = useNostrEvents({
- filter: {
- // since: dateToUnix(now.current), // all new events from now
- // since: 0,
- limit: 100,
- kinds: [1],
- },
- });
+ useEffect(() => {
+ fetch('https://api.nostr.band/v0/trending/profiles')
+ .then(res => res.json())
+ .then(data => setProfiles(data.profiles))
+ .catch(error => {
+ console.error('Error calling trending profiles:', error);
+ });
+ }, []);
- // const filteredEvents = events.filter((event) => event.content.includes(".jpg"));
- // filter events with regex that checks for png, jpg, or gif
- let filteredEvents = events.filter((event) => event.content.match(/https?:\/\/.*\.(?:png|jpg|gif)/g)?.[0]);
-
- // now filter all events with a tag[0] == t and tag[1] == nsfw
- filteredEvents = filteredEvents.filter((event) => event.tags.map((tag) => tag[0] == "t" && tag[1] == "nsfw"));
- // filter out all replies
- filteredEvents = filteredEvents.filter((event) => event.tags.map((tag) => tag[0] == "e"));
-
- return (
- <>
- Global Feed
- {filteredEvents.map((event) => (
- // {event.pubkey} posted: {event.content}
-
-
+ return (
+
+
Trending Accounts
+
+ {profiles && profiles.length > 0 && profiles.slice(0,4).map((profile, index) => (
+
+ ))}
+
- ))}
- >
- );
-}
-
-export default TrendingAccounts;
\ No newline at end of file
+ );
+}
\ No newline at end of file
diff --git a/lumina/components/TrendingImage.tsx b/lumina/components/TrendingImage.tsx
new file mode 100644
index 0000000..ecea5cc
--- /dev/null
+++ b/lumina/components/TrendingImage.tsx
@@ -0,0 +1,84 @@
+import React, { useMemo } from 'react';
+import { useNostr, useNostrEvents, useProfile } from "nostr-react";
+import {
+ nip19,
+} from "nostr-tools";
+import {
+ Card,
+ CardHeader,
+ CardTitle,
+ SmallCardContent,
+} from "@/components/ui/card"
+import Image from 'next/image';
+import Link from 'next/link';
+import { Avatar } from './ui/avatar';
+import { AvatarImage } from '@radix-ui/react-avatar';
+
+interface TrendingImageProps {
+ eventId: string;
+ pubkey: string;
+}
+
+const TrendingImage: React.FC
= ({ eventId, pubkey }) => {
+ const { data: userData } = useProfile({
+ pubkey,
+ });
+
+ const { events } = useNostrEvents({
+ filter: {
+ kinds: [1],
+ ids: [eventId]
+ },
+ });
+
+ const npubShortened = useMemo(() => {
+ let encoded = nip19.npubEncode(pubkey);
+ let parts = encoded.split('npub');
+ return 'npub' + parts[1].slice(0, 4) + ':' + parts[1].slice(-3);
+ }, [pubkey]);
+
+ let text = events && events.length > 0 ? events[0].content : '';
+ const createdAt = events && events.length > 0 ? new Date(events[0].created_at * 1000) : new Date();
+ const title = userData?.username || userData?.display_name || userData?.name || userData?.npub || npubShortened;
+ text = text.replaceAll('\n', ' ');
+ const imageSrc = text.match(/https?:\/\/[^ ]*\.(png|jpg|gif)/g);
+ const textWithoutImage = text.replace(/https?:\/\/.*\.(?:png|jpg|gif)/g, '');
+ const hrefProfile = `/profile/${nip19.npubEncode(pubkey)}`;
+ const profileImageSrc = userData?.picture || "https://robohash.org/" + pubkey;
+
+ return (
+ <>
+
+
+
+
+
+
+
+
+
+ {imageSrc && imageSrc.length > 0 && (
+
+
+

+
+
+ //

+ //
+ //
+ //
+ )}
+
+
+
+
+ >
+ );
+}
+
+export default TrendingImage;
\ No newline at end of file
diff --git a/lumina/components/TrendingImages.tsx b/lumina/components/TrendingImages.tsx
new file mode 100644
index 0000000..10c09c7
--- /dev/null
+++ b/lumina/components/TrendingImages.tsx
@@ -0,0 +1,27 @@
+import React, { useState, useEffect } from 'react';
+import TrendingImage from './TrendingImage';
+
+export function TrendingImages() {
+ const [profiles, setProfiles] = useState([]);
+
+ useEffect(() => {
+ fetch('https://api.nostr.band/v0/trending/images')
+ .then(res => res.json())
+ .then(data => setProfiles(data.images))
+ .catch(error => {
+ console.error('Error calling trending profiles:', error);
+ });
+ }, []);
+
+ return (
+
+
Currently Trending
+
+ {profiles && profiles.length > 0 && profiles.map((profile, index) => (
+ //
{profile.id}
+
+ ))}
+
+
+ );
+}
\ No newline at end of file
diff --git a/lumina/components/UpdateProfileForm.tsx b/lumina/components/UpdateProfileForm.tsx
new file mode 100644
index 0000000..57c5e56
--- /dev/null
+++ b/lumina/components/UpdateProfileForm.tsx
@@ -0,0 +1,102 @@
+'use client';
+
+import React, { useState, useEffect } from 'react';
+import { Button } from "@/components/ui/button"
+import { Input } from "@/components/ui/input"
+import { generateSecretKey, getPublicKey } from 'nostr-tools/pure'
+import { nip19 } from "nostr-tools"
+import { Label } from "./ui/label"
+import { Textarea } from "@/components/ui/textarea"
+import { finalizeEvent, verifyEvent } from 'nostr-tools/pure'
+import { bytesToHex, hexToBytes } from '@noble/hashes/utils'
+import { useNostr, useProfile } from 'nostr-react';
+
+export function UpdateProfileForm() {
+
+ const { publish } = useNostr();
+
+ let npub = '';
+ let pubkey = '';
+ let nsec: Uint8Array;
+
+ if (typeof window !== 'undefined') {
+ pubkey = window.localStorage.getItem("pubkey") ?? '';
+ const nsecHex = window.localStorage.getItem("nsec");
+
+ if (pubkey && pubkey.length > 0) {
+ npub = nip19.npubEncode(pubkey);
+ }
+
+ if (nsecHex && nsecHex.length > 0) {
+ nsec = hexToBytes(nsecHex);
+ }
+ }
+
+ let { data: userData } = useProfile({
+ pubkey,
+ });
+
+ const [username, setUsername] = useState(userData?.name);
+ const [displayName, setDisplayName] = useState(userData?.display_name);
+ const [bio, setBio] = useState(userData?.about);
+
+ const handleUsernameChange = (event: React.ChangeEvent) => {
+ setUsername(event.target.value);
+ };
+ const handleDisplayNameChange = (event: React.ChangeEvent) => {
+ setDisplayName(event.target.value);
+ };
+ const handleBioChange = (event: React.ChangeEvent) => {
+ setBio(event.target.value);
+ };
+
+ async function handleProfileUpdate() {
+ const username = (document.getElementById('username') as HTMLInputElement).value;
+ const bio = (document.getElementById('bio') as HTMLInputElement).value;
+ const displayname = (document.getElementById('displayname') as HTMLInputElement).value;
+
+ if (nsec) {
+ let event = finalizeEvent({
+ kind: 0,
+ created_at: Math.floor(Date.now() / 1000),
+ tags: [],
+ content: `{"name": "${username}", "about": "${bio}"}`,
+ }, nsec);
+
+ let isGood = verifyEvent(event);
+
+ // console.log('isGood: ' + isGood);
+ // console.log(event);
+
+ if (isGood) {
+ publish(event);
+ window.location.href = `/profile/${npub}`;
+ }
+ }
+ }
+
+ return (
+
+ )
+}
\ No newline at end of file
diff --git a/lumina/components/ViewCopyButton.tsx b/lumina/components/ViewCopyButton.tsx
new file mode 100644
index 0000000..6a5d397
--- /dev/null
+++ b/lumina/components/ViewCopyButton.tsx
@@ -0,0 +1,91 @@
+import { Button } from "@/components/ui/button";
+import {
+ Drawer,
+ DrawerClose,
+ DrawerContent,
+ DrawerDescription,
+ DrawerFooter,
+ DrawerHeader,
+ DrawerTitle,
+ DrawerTrigger,
+} from "@/components/ui/drawer"
+import { Textarea } from "./ui/textarea";
+import { Share1Icon } from "@radix-ui/react-icons";
+import { Input } from "./ui/input";
+import React, { useRef } from 'react';
+import { useToast } from "./ui/use-toast";
+import { Event as NostrEvent, nip19 } from "nostr-tools";
+
+interface ViewCopyButtonProps {
+ event: NostrEvent;
+}
+
+export default function ViewCopyButton({ event }: ViewCopyButtonProps) {
+ const jsonEvent = JSON.stringify(event, null, 2);
+ const inputRef = useRef(null);
+ const inputRefID = useRef(null);
+ const { toast } = useToast()
+
+ const handleCopyLink = async () => {
+ try {
+ await navigator.clipboard.writeText(window.location.href);
+ toast({
+ description: 'URL copied to clipboard',
+ title: 'Copied'
+ });
+ } catch (err) {
+ toast({
+ description: 'Error copying URL to clipboard',
+ title: 'Error',
+ variant: 'destructive'
+ });
+ }
+ };
+
+ const handleCopyNoteId = async () => {
+ try {
+ await navigator.clipboard.writeText(nip19.noteEncode(event.id));
+ toast({
+ description: 'Note ID copied to clipboard',
+ title: 'Copied'
+ });
+ } catch (err) {
+ toast({
+ description: 'Error copying Note ID to clipboard',
+ title: 'Error',
+ variant: 'destructive'
+ });
+ }
+ };
+
+ return (
+
+
+
+
+
+
+ Share this Note
+ Share this Note with others.
+
+
+ {/*
URL
*/}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ );
+}
\ No newline at end of file
diff --git a/lumina/components/ViewNoteButton.tsx b/lumina/components/ViewNoteButton.tsx
new file mode 100644
index 0000000..8d34173
--- /dev/null
+++ b/lumina/components/ViewNoteButton.tsx
@@ -0,0 +1,10 @@
+import { Button } from "@/components/ui/button";
+import { SizeIcon } from "@radix-ui/react-icons";
+import { nip19 } from "nostr-tools";
+
+export default function ViewNoteButton({ event }: { event: any }) {
+ const encodedNoteId = nip19.noteEncode(event.id);
+ return (
+
+ );
+}
\ No newline at end of file
diff --git a/lumina/components/ViewRawButton.tsx b/lumina/components/ViewRawButton.tsx
index e139a27..4cd2be5 100644
--- a/lumina/components/ViewRawButton.tsx
+++ b/lumina/components/ViewRawButton.tsx
@@ -11,9 +11,13 @@ import {
} from "@/components/ui/drawer"
import { Textarea } from "./ui/textarea";
import { CodeIcon } from "@radix-ui/react-icons";
+import { Event as NostrEvent } from "nostr-tools";
+interface ViewRawButtonProps {
+ event: NostrEvent;
+}
-export default function ViewRawButton(event: any) {
+export default function ViewRawButton({ event }: ViewRawButtonProps) {
return (
diff --git a/lumina/components/ZapButton.tsx b/lumina/components/ZapButton.tsx
new file mode 100644
index 0000000..a412af9
--- /dev/null
+++ b/lumina/components/ZapButton.tsx
@@ -0,0 +1,122 @@
+import { useNostr, dateToUnix, useNostrEvents } from "nostr-react";
+
+import {
+ type Event as NostrEvent,
+ getEventHash,
+ getPublicKey,
+ finalizeEvent,
+} from "nostr-tools";
+import { Button } from "@/components/ui/button";
+import {
+ Drawer,
+ DrawerClose,
+ DrawerContent,
+ DrawerDescription,
+ DrawerFooter,
+ DrawerHeader,
+ DrawerTitle,
+ DrawerTrigger,
+} from "@/components/ui/drawer"
+import { ReloadIcon } from "@radix-ui/react-icons";
+import ZapButtonList from "./ZapButtonList";
+import { Input } from "./ui/input";
+
+export default function ZapButton({ event }: { event: any }) {
+ const { events, isLoading } = useNostrEvents({
+ filter: {
+ // since: dateToUnix(now.current), // all new events from now
+ // since: 0,
+ // limit: 100,
+ '#e': [event.id],
+ kinds: [9735],
+ },
+ });
+
+ // filter out all events that also have another e tag with another id
+ // this will filter out likes that are made on comments and not on the note itself
+ // const filteredEvents = events.filter((event) => { return event.tags.filter((tag) => { return tag[0] === '#e' && tag[1] !== event.id }).length === 0 });
+
+ let sats = 0;
+ var lightningPayReq = require('bolt11');
+ events.forEach((event) => {
+ // console.log(event);
+ event.tags.forEach((tag) => {
+ if (tag[0] === 'bolt11') {
+ let decoded = lightningPayReq.decode(tag[1]);
+ // console.log(decoded.satoshis);
+ sats = sats + decoded.satoshis;
+ }
+ });
+ });
+
+
+ // const { publish } = useNostr();
+
+ // const onPost = async () => {
+ // const privKey = prompt("Paste your private key:");
+
+ // if (!privKey) {
+ // alert("no private key provided");
+ // return;
+ // }
+
+ // const message = prompt("Enter the message you want to send:");
+
+ // if (!message) {
+ // alert("no message provided");
+ // return;
+ // }
+
+ // const event: NostrEvent = {
+ // content: message,
+ // kind: 1,
+ // tags: [],
+ // created_at: dateToUnix(),
+ // pubkey: getPublicKey(privKey),
+ // id: "",
+ // sig: ""
+ // };
+
+ // event.id = getEventHash(event);
+ // event.sig = getSignature(event, privKey);
+
+ // publish(event);
+ // };
+
+ return (
+
+
+ {/* */}
+ {isLoading ? (
+
+ ) : (
+ //
+
+ )}
+
+
+
+ Zaps
+ {/* Sorry, but this feature is not implemented yet. */}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ //
+ );
+}
\ No newline at end of file
diff --git a/lumina/components/ZapButtonList.tsx b/lumina/components/ZapButtonList.tsx
new file mode 100644
index 0000000..cf6e0d8
--- /dev/null
+++ b/lumina/components/ZapButtonList.tsx
@@ -0,0 +1,12 @@
+import { ScrollArea } from "@/components/ui/scroll-area"
+import ZapButtonListItem from "./ZapButtonListItem";
+
+export default function ZapButtonList({ events }: { events: any }) {
+ return (
+
+ {events.map((event: any) => (
+
+ ))}
+
+ );
+}
\ No newline at end of file
diff --git a/lumina/components/ZapButtonListItem.tsx b/lumina/components/ZapButtonListItem.tsx
new file mode 100644
index 0000000..854d6d7
--- /dev/null
+++ b/lumina/components/ZapButtonListItem.tsx
@@ -0,0 +1,55 @@
+import Link from "next/link";
+import { useNostr, dateToUnix, useNostrEvents, useProfile } from "nostr-react";
+
+import {
+ type Event as NostrEvent,
+ getEventHash,
+ getPublicKey,
+ finalizeEvent,
+ nip19,
+} from "nostr-tools";
+import { Avatar, AvatarImage } from "@/components/ui/avatar";
+
+export default function ZapButtonListItem({ event }: { event: NostrEvent }) {
+
+ let pubkey = event.pubkey;
+ for(let i = 0; i < event.tags.length; i++) {
+ if(event.tags[i][0] === 'P') {
+ pubkey = event.tags[i][1];
+ break;
+ }
+ }
+
+ const { data: userData } = useProfile({
+ pubkey,
+ });
+
+ const title = userData?.username || userData?.display_name || userData?.name || nip19.npubEncode(pubkey).slice(0, 8) + ':' + nip19.npubEncode(pubkey).slice(-3);;
+ const createdAt = new Date(event.created_at * 1000);
+ const hrefProfile = `/profile/${nip19.npubEncode(pubkey)}`;
+ const profileImageSrc = userData?.picture || "https://robohash.org/" + pubkey;
+ let sats = 0;
+ var lightningPayReq = require('bolt11');
+ event.tags.forEach((tag) => {
+ if (tag[0] === 'bolt11') {
+ let decoded = lightningPayReq.decode(tag[1]);
+ // console.log(decoded.satoshis);
+ sats = decoded.satoshis;
+ }
+ });
+
+ return (
+
+
+
+ {/*

*/}
+
+
+
+
{title}
+
{sats} sats ⚡️
+
+
+
+ );
+}
\ No newline at end of file
diff --git a/lumina/components/dashboard/RecentFollower.tsx b/lumina/components/dashboard/RecentFollower.tsx
new file mode 100644
index 0000000..c421e7a
--- /dev/null
+++ b/lumina/components/dashboard/RecentFollower.tsx
@@ -0,0 +1,36 @@
+import { Avatar, AvatarFallback, AvatarImage } from "@/components/ui/avatar";
+import { Card, CardContent, CardHeader, CardTitle } from "../ui/card";
+import { useProfile } from "nostr-react";
+import {
+ nip19,
+} from "nostr-tools";
+import Link from "next/link";
+
+export function RecentFollower({ follower }: { follower: any }) {
+
+ const { data: userData, isLoading: userDataLoading } = useProfile({
+ pubkey: follower.pubkey,
+ });
+
+ let encoded = nip19.npubEncode(follower.pubkey);
+ let parts = encoded.split('npub');
+ let npubShortened = 'npub' + parts[1].slice(0, 4) + ':' + parts[1].slice(-3);
+ let title = userData?.username || userData?.display_name || userData?.name || userData?.npub || npubShortened;
+ const profileImageSrc = userData?.picture || "https://robohash.org/" + follower.pubkey;
+ return (
+
+
+
+
+ n/a
+
+
+
+
{title}
+
+ {new Date(follower.created_at * 1000).toLocaleDateString()} {new Date(follower.created_at * 1000).toLocaleTimeString()}
+
+ {/*
{follower.amount}
*/}
+
+ )
+}
\ No newline at end of file
diff --git a/lumina/components/dashboard/RecentFollowerCard.tsx b/lumina/components/dashboard/RecentFollowerCard.tsx
new file mode 100644
index 0000000..ff72bb4
--- /dev/null
+++ b/lumina/components/dashboard/RecentFollowerCard.tsx
@@ -0,0 +1,23 @@
+import { Avatar, AvatarFallback, AvatarImage } from "@/components/ui/avatar";
+import { Card, CardContent, CardHeader, CardTitle } from "../ui/card";
+import { RecentFollower } from "./RecentFollower";
+
+export function RecentFollowerCard({ followers }: { followers: Array }) {
+ const lastFiveFollowers = followers.slice(-5).reverse();
+ return (
+
+
+ Recent Follower 🫂
+
+
+
+
+ {lastFiveFollowers.map((follower) => (
+
+ ))}
+
+
+
+
+ )
+}
\ No newline at end of file
diff --git a/lumina/components/dashboard/RecentZap.tsx b/lumina/components/dashboard/RecentZap.tsx
new file mode 100644
index 0000000..c4d38ce
--- /dev/null
+++ b/lumina/components/dashboard/RecentZap.tsx
@@ -0,0 +1,45 @@
+import { Avatar, AvatarFallback, AvatarImage } from "@/components/ui/avatar";
+import { Card, CardContent, CardHeader, CardTitle } from "../ui/card";
+import { useProfile } from "nostr-react";
+import {
+ nip19,
+} from "nostr-tools";
+import Link from "next/link";
+
+export function RecentZap({ zap }: { zap: any }) {
+
+ let zapperPubkey = zap.pubkey;
+ for(let tag of zap.tags){
+ if(tag[0] === 'P') {
+ zapperPubkey = tag[1];
+ }
+ }
+
+ const { data: userData, isLoading: userDataLoading } = useProfile({
+ pubkey: zapperPubkey,
+ });
+
+ console.log('zap', zap)
+
+ let encoded = nip19.npubEncode(zapperPubkey);
+ let parts = encoded.split('npub');
+ let npubShortened = 'npub' + parts[1].slice(0, 4) + ':' + parts[1].slice(-3);
+ let title = userData?.username || userData?.display_name || userData?.name || userData?.npub || npubShortened;
+ const profileImageSrc = userData?.picture || "https://robohash.org/" + zap.pubkey;
+ return (
+
+
+
+
+ n/a
+
+
+
+
{title}
+
+ {new Date(zap.created_at * 1000).toLocaleDateString()} {new Date(zap.created_at * 1000).toLocaleTimeString()}
+
+ {/*
{zap.amount}
*/}
+
+ )
+}
\ No newline at end of file
diff --git a/lumina/components/dashboard/RecentZapsCard.tsx b/lumina/components/dashboard/RecentZapsCard.tsx
new file mode 100644
index 0000000..425f10f
--- /dev/null
+++ b/lumina/components/dashboard/RecentZapsCard.tsx
@@ -0,0 +1,23 @@
+import { Avatar, AvatarFallback, AvatarImage } from "@/components/ui/avatar";
+import { Card, CardContent, CardHeader, CardTitle } from "../ui/card";
+import { RecentZap } from "./RecentZap";
+
+export function RecentZapsCard({ zaps }: { zaps: Array }) {
+ const lastFiveZaps = zaps.slice(-5).reverse();
+ return (
+
+
+ Recent Zaps ⚡️
+
+
+
+
+ {lastFiveZaps.map((zap) => (
+
+ ))}
+
+
+
+
+ )
+}
\ No newline at end of file
diff --git a/lumina/components/dashboard/Statistics.tsx b/lumina/components/dashboard/Statistics.tsx
new file mode 100644
index 0000000..132986f
--- /dev/null
+++ b/lumina/components/dashboard/Statistics.tsx
@@ -0,0 +1,120 @@
+import React from 'react';
+import { useNostrEvents, useProfile } from "nostr-react";
+import { Card, CardHeader, CardTitle, CardContent, CardFooter, CardDescription } from '@/components/ui/card';
+import { Skeleton } from '@/components/ui/skeleton';
+import { AvatarImage } from '@radix-ui/react-avatar';
+import { Avatar } from '@/components/ui/avatar';
+import NIP05 from '@/components/nip05';
+import { RecentFollowerCard } from './RecentFollowerCard';
+import {
+ nip19,
+} from "nostr-tools";
+import { RecentZapsCard } from './RecentZapsCard';
+
+interface ProfileInfoCardProps {
+ pubkey: string;
+}
+
+const ProfileInfoCard: React.FC = ({ pubkey }) => {
+ const { data: userData, isLoading: userDataLoading } = useProfile({
+ pubkey,
+ });
+
+ const { events: followers, isLoading: followersLoading } = useNostrEvents({
+ filter: {
+ kinds: [3],
+ '#p': [pubkey],
+ },
+ });
+
+ const { events: zaps, isLoading: zapsLoading } = useNostrEvents({
+ filter: {
+ kinds: [9735],
+ '#p': [pubkey],
+ limit: 50,
+ },
+ });
+
+ const { events: following, isLoading: followingLoading } = useNostrEvents({
+ filter: {
+ kinds: [3],
+ authors: [pubkey],
+ limit: 1,
+ },
+ });
+
+ // filter for only new followings (latest in a users followers list)
+ const filteredFollowers = followers.filter(follower => {
+ const lastPTag = follower.tags[follower.tags.length - 1];
+ if (lastPTag[0] === "p" && lastPTag[1] === pubkey.toString()) {
+ // console.log(follower.tags[follower.tags.length - 1]);
+ return true;
+ }
+ });
+
+ let encoded = nip19.npubEncode(pubkey);
+ let parts = encoded.split('npub');
+ let npubShortened = 'npub' + parts[1].slice(0, 4) + ':' + parts[1].slice(-3);
+ const title = userData?.username || userData?.display_name || userData?.name || userData?.npub || npubShortened;
+ const description = userData?.about?.replace(/(?:\r\n|\r|\n)/g, '
');
+ const nip05 = userData?.nip05
+ let profileImageSrc = userData?.picture || "https://robohash.org/" + pubkey;
+ return (
+ <>
+
+ {/*
*/}
+
+
+ {/* Profile */}
+
+
+
+
+
+
+
+
{title}
+
+
+
+
+
+
+
+
+
+
+ Total Followers
+
+
+ {followers.length}
+ {/*
+ +20.1% from last month
+
*/}
+
+
+
+
+ Total Following
+
+
+
+ {followingLoading ? "Loading.." : (following.length > 0 ? following[0]?.tags.length : "-")}
+
+ {/*
+ +20.1% from last month
+
*/}
+
+
+
+
+
+ >
+ );
+}
+
+export default ProfileInfoCard;
\ No newline at end of file
diff --git a/lumina/components/headerComponents/AvatarDropdown.tsx b/lumina/components/headerComponents/AvatarDropdown.tsx
new file mode 100644
index 0000000..55af16c
--- /dev/null
+++ b/lumina/components/headerComponents/AvatarDropdown.tsx
@@ -0,0 +1,63 @@
+"use client"
+
+import * as React from "react"
+import { MoonIcon, SunIcon } from "@radix-ui/react-icons"
+import { useTheme } from "next-themes"
+
+import { Button } from "@/components/ui/button"
+import {
+ DropdownMenu,
+ DropdownMenuContent,
+ DropdownMenuItem,
+ DropdownMenuTrigger,
+} from "@/components/ui/dropdown-menu"
+import { Avatar, AvatarFallback, AvatarImage } from "../ui/avatar"
+import { useProfile } from "nostr-react"
+import Link from "next/link"
+import { nip19 } from "nostr-tools"
+
+export function AvatarDropdown() {
+
+ let pubkey = window.localStorage.getItem('pubkey');
+ let pubkeyEncoded = pubkey ? nip19.npubEncode(pubkey) : pubkey;
+
+ let src = "https://robohash.org/" + (pubkey as string);
+
+ const { data: userData } = useProfile({
+ pubkey: pubkey as string,
+ });
+
+ if (pubkey !== null) {
+ src = userData?.picture || "https://robohash.org/" + pubkey;
+ }
+
+ return (
+
+
+ {/* */}
+
+
+
+
+
+
+
+ Profile
+
+
+
+
+ Settings
+
+
+ { window.localStorage.clear(); window.location.href = "/" }}>
+ Logout
+
+
+
+ )
+}
\ No newline at end of file
diff --git a/lumina/components/DropdownThemeMode.tsx b/lumina/components/headerComponents/DropdownThemeMode.tsx
similarity index 100%
rename from lumina/components/DropdownThemeMode.tsx
rename to lumina/components/headerComponents/DropdownThemeMode.tsx
diff --git a/lumina/components/headerComponents/LoginButton.tsx b/lumina/components/headerComponents/LoginButton.tsx
new file mode 100644
index 0000000..8312d38
--- /dev/null
+++ b/lumina/components/headerComponents/LoginButton.tsx
@@ -0,0 +1,13 @@
+"use client";
+
+import { Button } from "@/components/ui/button";
+import React, { useRef } from 'react';
+import Link from "next/link";
+
+export default function LoginButton() {
+ return (
+
+
+
+ );
+}
\ No newline at end of file
diff --git a/lumina/components/headerComponents/RegisterButton.tsx b/lumina/components/headerComponents/RegisterButton.tsx
new file mode 100644
index 0000000..5ebd704
--- /dev/null
+++ b/lumina/components/headerComponents/RegisterButton.tsx
@@ -0,0 +1,13 @@
+"use client";
+
+import { Button } from "@/components/ui/button";
+import React, { useRef } from 'react';
+import Link from "next/link";
+
+export default function RegisterButton() {
+ return (
+
+
+
+ );
+}
\ No newline at end of file
diff --git a/lumina/components/headerComponents/TopNavigation.tsx b/lumina/components/headerComponents/TopNavigation.tsx
new file mode 100644
index 0000000..00eab64
--- /dev/null
+++ b/lumina/components/headerComponents/TopNavigation.tsx
@@ -0,0 +1,37 @@
+"use client";
+
+import { siteConfig } from "@/config/site";
+import { useEffect, useState } from "react";
+import { TopNavigationItems } from "./TopNavigationItems";
+import { DropdownThemeMode } from "./DropdownThemeMode";
+import LoginButton from "./LoginButton";
+import { Button } from "../ui/button";
+import { AvatarDropdown } from "./AvatarDropdown";
+import RegisterButton from "./RegisterButton";
+
+export function TopNavigation() {
+ const [pubkey, setPubkey] = useState(null);
+
+ useEffect(() => {
+ if (typeof window !== 'undefined') {
+ setPubkey(window.localStorage.getItem('pubkey'));
+ }
+ }, []);
+
+ return (
+
+
+
+
+
+
+
+
+ )
+}
\ No newline at end of file
diff --git a/lumina/components/headerComponents/TopNavigationItems.tsx b/lumina/components/headerComponents/TopNavigationItems.tsx
new file mode 100644
index 0000000..c60a3df
--- /dev/null
+++ b/lumina/components/headerComponents/TopNavigationItems.tsx
@@ -0,0 +1,42 @@
+import * as React from "react"
+import Link from "next/link"
+
+import { NavItem } from "@/types/nav"
+import { siteConfig } from "@/config/site"
+import { cn } from "@/lib/utils"
+// import { Icons } from "@/components/icons"
+
+interface TopNavigationItemsProps {
+ items?: NavItem[]
+}
+
+export function TopNavigationItems({ items }: TopNavigationItemsProps) {
+ return (
+
+
+ {/* */}
+ {siteConfig.name}
+
+ {/* TOP NAVIGATION ITEMS */}
+ {/* {items?.length ? (
+
+ ) : null} */}
+
+ )
+}
\ No newline at end of file
diff --git a/lumina/components/icons.tsx b/lumina/components/icons.tsx
new file mode 100644
index 0000000..a620b33
--- /dev/null
+++ b/lumina/components/icons.tsx
@@ -0,0 +1,31 @@
+// import {
+// LucideProps,
+// Moon,
+// SunMedium,
+// Twitter,
+// type Icon as LucideIcon,
+// } from "lucide-react"
+
+// export type Icon = LucideIcon
+
+// export const Icons = {
+// sun: SunMedium,
+// moon: Moon,
+// twitter: Twitter,
+// logo: (props: LucideProps) => (
+//
+// ),
+// gitHub: (props: LucideProps) => (
+//
+// ),
+// }
\ No newline at end of file
diff --git a/lumina/components/nip05.tsx b/lumina/components/nip05.tsx
new file mode 100644
index 0000000..13cb714
--- /dev/null
+++ b/lumina/components/nip05.tsx
@@ -0,0 +1,45 @@
+import { CheckIcon, ReloadIcon } from "@radix-ui/react-icons";
+import React, { useState, useEffect } from 'react';
+
+interface NIP05Props {
+ nip05: string;
+ pubkey: string;
+}
+
+const NIP05: React.FC = ({ nip05, pubkey }) => {
+ const [isLoading, setIsLoading] = useState(true);
+ const [isValid, setIsValid] = useState(false);
+
+ let name = nip05.split('@')[0]
+ let domain = nip05.split('@')[1]
+
+ useEffect(() => {
+ if(nip05.length > 0) {
+ fetch(`https://${domain}/.well-known/nostr.json?name=${name}`)
+ .then(response => response.json())
+ .then(data => {
+ if (data.names[name] === pubkey) {
+ setIsValid(true);
+ } else {
+ setIsValid(false);
+ }
+ setIsLoading(false);
+ })
+ }
+ }, [nip05, pubkey]);
+
+ return (
+ <>
+
+ {nip05.length > 0 &&
+ <>
+ { name === "_" ? domain : nip05 }
+ {isLoading ? : isValid ? : ❌}
+ >
+ }
+
+ >
+ );
+}
+
+export default NIP05;
\ No newline at end of file
diff --git a/lumina/components/onboarding/createSecretKeyForm.tsx b/lumina/components/onboarding/createSecretKeyForm.tsx
new file mode 100644
index 0000000..f175d23
--- /dev/null
+++ b/lumina/components/onboarding/createSecretKeyForm.tsx
@@ -0,0 +1,56 @@
+import React, { useState, useEffect } from 'react';
+import { Button } from "@/components/ui/button"
+import { Input } from "@/components/ui/input"
+import { generateSecretKey, getPublicKey } from 'nostr-tools/pure'
+import { nip19 } from "nostr-tools"
+import { Label } from "../ui/label"
+import { bytesToHex, hexToBytes } from '@noble/hashes/utils'
+
+export function CreateSecretKeyForm() {
+ const [nsec, setNsec] = useState('');
+ const [npub, setNpub] = useState('');
+
+ const regenerateKey = () => {
+ let sk = generateSecretKey(); // `sk` is a Uint8Array
+ let pk = getPublicKey(sk); // `pk` is a hex string
+ let newNpub = nip19.npubEncode(pk); // `npub` is a string
+ let newNsec = nip19.nsecEncode(sk); // `nsec` is a string
+
+ setNsec(newNsec);
+ setNpub(newNpub);
+ }
+
+ // Schlüssel generieren, wenn die Komponente zum ersten Mal gerendert wird
+ useEffect(() => {
+ if(localStorage.getItem("nsec")) {
+ const nsecString = localStorage.getItem('nsec') || '';
+ const nsecBytes = hexToBytes(nsecString);
+ setNsec(nip19.nsecEncode(nsecBytes));
+ setNpub(nip19.npubEncode(getPublicKey(nsecBytes)));
+ } else {
+ regenerateKey();
+ }
+ }, []);
+
+ return (
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ )
+}
\ No newline at end of file
diff --git a/lumina/components/searchComponents/SearchNotesBox.tsx b/lumina/components/searchComponents/SearchNotesBox.tsx
new file mode 100644
index 0000000..edfca51
--- /dev/null
+++ b/lumina/components/searchComponents/SearchNotesBox.tsx
@@ -0,0 +1,65 @@
+import React from 'react';
+import { useNostrEvents, useProfile } from "nostr-react";
+import {
+ nip19,
+} from "nostr-tools";
+import {
+ Card,
+ CardContent,
+ CardFooter,
+ CardHeader,
+ CardTitle,
+} from "@/components/ui/card"
+import {
+ Tooltip,
+ TooltipContent,
+ TooltipProvider,
+ TooltipTrigger,
+} from "@/components/ui/tooltip"
+import {
+ Carousel,
+ CarouselContent,
+ CarouselItem,
+ CarouselNext,
+ CarouselPrevious,
+} from "@/components/ui/carousel"
+import ReactionButton from '@/components/ReactionButton';
+import { Avatar, AvatarImage } from '@/components/ui/avatar';
+import ViewRawButton from '@/components/ViewRawButton';
+import Link from 'next/link';
+import { Event as NostrEvent } from "nostr-tools";
+import ProfileInfoCard from '../ProfileInfoCard';
+import NoteCard from '../NoteCard';
+
+interface SearchNotesBoxProps {
+ searchTag: string;
+}
+
+const SearchNotesBox: React.FC = ({ searchTag }) => {
+ const { events: notes } = useNostrEvents({
+ filter: {
+ kinds: [1],
+ search: searchTag,
+ limit: 10,
+ },
+ });
+
+ return (
+ <>
+
+
+ Notes
+
+
+
+ {notes.map((event: NostrEvent) => (
+
+ ))}
+
+
+
+ >
+ );
+}
+
+export default SearchNotesBox;
\ No newline at end of file
diff --git a/lumina/components/searchComponents/SearchProfilesBox.tsx b/lumina/components/searchComponents/SearchProfilesBox.tsx
new file mode 100644
index 0000000..b61b8bc
--- /dev/null
+++ b/lumina/components/searchComponents/SearchProfilesBox.tsx
@@ -0,0 +1,65 @@
+import React from 'react';
+import { useNostrEvents, useProfile } from "nostr-react";
+import {
+ nip19,
+} from "nostr-tools";
+import {
+ Card,
+ CardContent,
+ CardFooter,
+ CardHeader,
+ CardTitle,
+} from "@/components/ui/card"
+import {
+ Tooltip,
+ TooltipContent,
+ TooltipProvider,
+ TooltipTrigger,
+} from "@/components/ui/tooltip"
+import {
+ Carousel,
+ CarouselContent,
+ CarouselItem,
+ CarouselNext,
+ CarouselPrevious,
+} from "@/components/ui/carousel"
+import ReactionButton from '@/components/ReactionButton';
+import { Avatar, AvatarImage } from '@/components/ui/avatar';
+import ViewRawButton from '@/components/ViewRawButton';
+import Link from 'next/link';
+import { Event as NostrEvent } from "nostr-tools";
+import ProfileInfoCard from '../ProfileInfoCard';
+import NoteCard from '../NoteCard';
+
+interface SearchProfilesBoxProps {
+ searchTag: string;
+}
+
+const SearchProfilesBox: React.FC = ({ searchTag }) => {
+ const { events: profiles } = useNostrEvents({
+ filter: {
+ kinds: [0],
+ search: searchTag,
+ limit: 10,
+ },
+ });
+
+ return (
+ <>
+
+
+ Profiles
+
+
+
+ {profiles.map((event: NostrEvent) => (
+
+ ))}
+
+
+
+ >
+ );
+}
+
+export default SearchProfilesBox;
\ No newline at end of file
diff --git a/lumina/components/ui/accordion.tsx b/lumina/components/ui/accordion.tsx
new file mode 100644
index 0000000..24c788c
--- /dev/null
+++ b/lumina/components/ui/accordion.tsx
@@ -0,0 +1,58 @@
+"use client"
+
+import * as React from "react"
+import * as AccordionPrimitive from "@radix-ui/react-accordion"
+import { ChevronDown } from "lucide-react"
+
+import { cn } from "@/lib/utils"
+
+const Accordion = AccordionPrimitive.Root
+
+const AccordionItem = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => (
+
+))
+AccordionItem.displayName = "AccordionItem"
+
+const AccordionTrigger = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, children, ...props }, ref) => (
+
+ svg]:rotate-180",
+ className
+ )}
+ {...props}
+ >
+ {children}
+
+
+
+))
+AccordionTrigger.displayName = AccordionPrimitive.Trigger.displayName
+
+const AccordionContent = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, children, ...props }, ref) => (
+
+ {children}
+
+))
+
+AccordionContent.displayName = AccordionPrimitive.Content.displayName
+
+export { Accordion, AccordionItem, AccordionTrigger, AccordionContent }
diff --git a/lumina/components/ui/card.tsx b/lumina/components/ui/card.tsx
index afa13ec..7dea9a1 100644
--- a/lumina/components/ui/card.tsx
+++ b/lumina/components/ui/card.tsx
@@ -76,4 +76,12 @@ const CardFooter = React.forwardRef<
))
CardFooter.displayName = "CardFooter"
-export { Card, CardHeader, CardFooter, CardTitle, CardDescription, CardContent }
+const SmallCardContent = React.forwardRef<
+ HTMLDivElement,
+ React.HTMLAttributes
+>(({ className, ...props }, ref) => (
+
+))
+SmallCardContent.displayName = "CardContent"
+
+export { Card, CardHeader, CardFooter, CardTitle, CardDescription, CardContent, SmallCardContent }
diff --git a/lumina/components/ui/dialog.tsx b/lumina/components/ui/dialog.tsx
new file mode 100644
index 0000000..01ff19c
--- /dev/null
+++ b/lumina/components/ui/dialog.tsx
@@ -0,0 +1,122 @@
+"use client"
+
+import * as React from "react"
+import * as DialogPrimitive from "@radix-ui/react-dialog"
+import { X } from "lucide-react"
+
+import { cn } from "@/lib/utils"
+
+const Dialog = DialogPrimitive.Root
+
+const DialogTrigger = DialogPrimitive.Trigger
+
+const DialogPortal = DialogPrimitive.Portal
+
+const DialogClose = DialogPrimitive.Close
+
+const DialogOverlay = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => (
+
+))
+DialogOverlay.displayName = DialogPrimitive.Overlay.displayName
+
+const DialogContent = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, children, ...props }, ref) => (
+
+
+
+ {children}
+
+
+ Close
+
+
+
+))
+DialogContent.displayName = DialogPrimitive.Content.displayName
+
+const DialogHeader = ({
+ className,
+ ...props
+}: React.HTMLAttributes) => (
+
+)
+DialogHeader.displayName = "DialogHeader"
+
+const DialogFooter = ({
+ className,
+ ...props
+}: React.HTMLAttributes) => (
+
+)
+DialogFooter.displayName = "DialogFooter"
+
+const DialogTitle = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => (
+
+))
+DialogTitle.displayName = DialogPrimitive.Title.displayName
+
+const DialogDescription = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => (
+
+))
+DialogDescription.displayName = DialogPrimitive.Description.displayName
+
+export {
+ Dialog,
+ DialogPortal,
+ DialogOverlay,
+ DialogClose,
+ DialogTrigger,
+ DialogContent,
+ DialogHeader,
+ DialogFooter,
+ DialogTitle,
+ DialogDescription,
+}
diff --git a/lumina/components/ui/form.tsx b/lumina/components/ui/form.tsx
new file mode 100644
index 0000000..4603f8b
--- /dev/null
+++ b/lumina/components/ui/form.tsx
@@ -0,0 +1,176 @@
+import * as React from "react"
+import * as LabelPrimitive from "@radix-ui/react-label"
+import { Slot } from "@radix-ui/react-slot"
+import {
+ Controller,
+ ControllerProps,
+ FieldPath,
+ FieldValues,
+ FormProvider,
+ useFormContext,
+} from "react-hook-form"
+
+import { cn } from "@/lib/utils"
+import { Label } from "@/components/ui/label"
+
+const Form = FormProvider
+
+type FormFieldContextValue<
+ TFieldValues extends FieldValues = FieldValues,
+ TName extends FieldPath = FieldPath
+> = {
+ name: TName
+}
+
+const FormFieldContext = React.createContext(
+ {} as FormFieldContextValue
+)
+
+const FormField = <
+ TFieldValues extends FieldValues = FieldValues,
+ TName extends FieldPath = FieldPath
+>({
+ ...props
+}: ControllerProps) => {
+ return (
+
+
+
+ )
+}
+
+const useFormField = () => {
+ const fieldContext = React.useContext(FormFieldContext)
+ const itemContext = React.useContext(FormItemContext)
+ const { getFieldState, formState } = useFormContext()
+
+ const fieldState = getFieldState(fieldContext.name, formState)
+
+ if (!fieldContext) {
+ throw new Error("useFormField should be used within ")
+ }
+
+ const { id } = itemContext
+
+ return {
+ id,
+ name: fieldContext.name,
+ formItemId: `${id}-form-item`,
+ formDescriptionId: `${id}-form-item-description`,
+ formMessageId: `${id}-form-item-message`,
+ ...fieldState,
+ }
+}
+
+type FormItemContextValue = {
+ id: string
+}
+
+const FormItemContext = React.createContext(
+ {} as FormItemContextValue
+)
+
+const FormItem = React.forwardRef<
+ HTMLDivElement,
+ React.HTMLAttributes
+>(({ className, ...props }, ref) => {
+ const id = React.useId()
+
+ return (
+
+
+
+ )
+})
+FormItem.displayName = "FormItem"
+
+const FormLabel = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => {
+ const { error, formItemId } = useFormField()
+
+ return (
+
+ )
+})
+FormLabel.displayName = "FormLabel"
+
+const FormControl = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ ...props }, ref) => {
+ const { error, formItemId, formDescriptionId, formMessageId } = useFormField()
+
+ return (
+
+ )
+})
+FormControl.displayName = "FormControl"
+
+const FormDescription = React.forwardRef<
+ HTMLParagraphElement,
+ React.HTMLAttributes
+>(({ className, ...props }, ref) => {
+ const { formDescriptionId } = useFormField()
+
+ return (
+
+ )
+})
+FormDescription.displayName = "FormDescription"
+
+const FormMessage = React.forwardRef<
+ HTMLParagraphElement,
+ React.HTMLAttributes
+>(({ className, children, ...props }, ref) => {
+ const { error, formMessageId } = useFormField()
+ const body = error ? String(error?.message) : children
+
+ if (!body) {
+ return null
+ }
+
+ return (
+
+ {body}
+
+ )
+})
+FormMessage.displayName = "FormMessage"
+
+export {
+ useFormField,
+ Form,
+ FormItem,
+ FormLabel,
+ FormControl,
+ FormDescription,
+ FormMessage,
+ FormField,
+}
diff --git a/lumina/components/ui/input.tsx b/lumina/components/ui/input.tsx
new file mode 100644
index 0000000..677d05f
--- /dev/null
+++ b/lumina/components/ui/input.tsx
@@ -0,0 +1,25 @@
+import * as React from "react"
+
+import { cn } from "@/lib/utils"
+
+export interface InputProps
+ extends React.InputHTMLAttributes {}
+
+const Input = React.forwardRef(
+ ({ className, type, ...props }, ref) => {
+ return (
+
+ )
+ }
+)
+Input.displayName = "Input"
+
+export { Input }
diff --git a/lumina/components/ui/label.tsx b/lumina/components/ui/label.tsx
new file mode 100644
index 0000000..5341821
--- /dev/null
+++ b/lumina/components/ui/label.tsx
@@ -0,0 +1,26 @@
+"use client"
+
+import * as React from "react"
+import * as LabelPrimitive from "@radix-ui/react-label"
+import { cva, type VariantProps } from "class-variance-authority"
+
+import { cn } from "@/lib/utils"
+
+const labelVariants = cva(
+ "text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70"
+)
+
+const Label = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef &
+ VariantProps
+>(({ className, ...props }, ref) => (
+
+))
+Label.displayName = LabelPrimitive.Root.displayName
+
+export { Label }
diff --git a/lumina/components/ui/scroll-area.tsx b/lumina/components/ui/scroll-area.tsx
new file mode 100644
index 0000000..0b4a48d
--- /dev/null
+++ b/lumina/components/ui/scroll-area.tsx
@@ -0,0 +1,48 @@
+"use client"
+
+import * as React from "react"
+import * as ScrollAreaPrimitive from "@radix-ui/react-scroll-area"
+
+import { cn } from "@/lib/utils"
+
+const ScrollArea = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, children, ...props }, ref) => (
+
+
+ {children}
+
+
+
+
+))
+ScrollArea.displayName = ScrollAreaPrimitive.Root.displayName
+
+const ScrollBar = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, orientation = "vertical", ...props }, ref) => (
+
+
+
+))
+ScrollBar.displayName = ScrollAreaPrimitive.ScrollAreaScrollbar.displayName
+
+export { ScrollArea, ScrollBar }
diff --git a/lumina/components/ui/toast.tsx b/lumina/components/ui/toast.tsx
new file mode 100644
index 0000000..521b94b
--- /dev/null
+++ b/lumina/components/ui/toast.tsx
@@ -0,0 +1,129 @@
+"use client"
+
+import * as React from "react"
+import * as ToastPrimitives from "@radix-ui/react-toast"
+import { cva, type VariantProps } from "class-variance-authority"
+import { X } from "lucide-react"
+
+import { cn } from "@/lib/utils"
+
+const ToastProvider = ToastPrimitives.Provider
+
+const ToastViewport = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => (
+
+))
+ToastViewport.displayName = ToastPrimitives.Viewport.displayName
+
+const toastVariants = cva(
+ "group pointer-events-auto relative flex w-full items-center justify-between space-x-4 overflow-hidden rounded-md border p-6 pr-8 shadow-lg transition-all data-[swipe=cancel]:translate-x-0 data-[swipe=end]:translate-x-[var(--radix-toast-swipe-end-x)] data-[swipe=move]:translate-x-[var(--radix-toast-swipe-move-x)] data-[swipe=move]:transition-none data-[state=open]:animate-in data-[state=closed]:animate-out data-[swipe=end]:animate-out data-[state=closed]:fade-out-80 data-[state=closed]:slide-out-to-right-full data-[state=open]:slide-in-from-top-full data-[state=open]:sm:slide-in-from-bottom-full",
+ {
+ variants: {
+ variant: {
+ default: "border bg-background text-foreground",
+ destructive:
+ "destructive group border-destructive bg-destructive text-destructive-foreground",
+ },
+ },
+ defaultVariants: {
+ variant: "default",
+ },
+ }
+)
+
+const Toast = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef &
+ VariantProps
+>(({ className, variant, ...props }, ref) => {
+ return (
+
+ )
+})
+Toast.displayName = ToastPrimitives.Root.displayName
+
+const ToastAction = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => (
+
+))
+ToastAction.displayName = ToastPrimitives.Action.displayName
+
+const ToastClose = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => (
+
+
+
+))
+ToastClose.displayName = ToastPrimitives.Close.displayName
+
+const ToastTitle = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => (
+
+))
+ToastTitle.displayName = ToastPrimitives.Title.displayName
+
+const ToastDescription = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => (
+
+))
+ToastDescription.displayName = ToastPrimitives.Description.displayName
+
+type ToastProps = React.ComponentPropsWithoutRef
+
+type ToastActionElement = React.ReactElement
+
+export {
+ type ToastProps,
+ type ToastActionElement,
+ ToastProvider,
+ ToastViewport,
+ Toast,
+ ToastTitle,
+ ToastDescription,
+ ToastClose,
+ ToastAction,
+}
diff --git a/lumina/components/ui/toaster.tsx b/lumina/components/ui/toaster.tsx
new file mode 100644
index 0000000..e223385
--- /dev/null
+++ b/lumina/components/ui/toaster.tsx
@@ -0,0 +1,35 @@
+"use client"
+
+import {
+ Toast,
+ ToastClose,
+ ToastDescription,
+ ToastProvider,
+ ToastTitle,
+ ToastViewport,
+} from "@/components/ui/toast"
+import { useToast } from "@/components/ui/use-toast"
+
+export function Toaster() {
+ const { toasts } = useToast()
+
+ return (
+
+ {toasts.map(function ({ id, title, description, action, ...props }) {
+ return (
+
+
+ {title && {title}}
+ {description && (
+ {description}
+ )}
+
+ {action}
+
+
+ )
+ })}
+
+
+ )
+}
diff --git a/lumina/components/ui/use-toast.ts b/lumina/components/ui/use-toast.ts
new file mode 100644
index 0000000..02e111d
--- /dev/null
+++ b/lumina/components/ui/use-toast.ts
@@ -0,0 +1,194 @@
+"use client"
+
+// Inspired by react-hot-toast library
+import * as React from "react"
+
+import type {
+ ToastActionElement,
+ ToastProps,
+} from "@/components/ui/toast"
+
+const TOAST_LIMIT = 1
+const TOAST_REMOVE_DELAY = 1000000
+
+type ToasterToast = ToastProps & {
+ id: string
+ title?: React.ReactNode
+ description?: React.ReactNode
+ action?: ToastActionElement
+}
+
+const actionTypes = {
+ ADD_TOAST: "ADD_TOAST",
+ UPDATE_TOAST: "UPDATE_TOAST",
+ DISMISS_TOAST: "DISMISS_TOAST",
+ REMOVE_TOAST: "REMOVE_TOAST",
+} as const
+
+let count = 0
+
+function genId() {
+ count = (count + 1) % Number.MAX_SAFE_INTEGER
+ return count.toString()
+}
+
+type ActionType = typeof actionTypes
+
+type Action =
+ | {
+ type: ActionType["ADD_TOAST"]
+ toast: ToasterToast
+ }
+ | {
+ type: ActionType["UPDATE_TOAST"]
+ toast: Partial
+ }
+ | {
+ type: ActionType["DISMISS_TOAST"]
+ toastId?: ToasterToast["id"]
+ }
+ | {
+ type: ActionType["REMOVE_TOAST"]
+ toastId?: ToasterToast["id"]
+ }
+
+interface State {
+ toasts: ToasterToast[]
+}
+
+const toastTimeouts = new Map>()
+
+const addToRemoveQueue = (toastId: string) => {
+ if (toastTimeouts.has(toastId)) {
+ return
+ }
+
+ const timeout = setTimeout(() => {
+ toastTimeouts.delete(toastId)
+ dispatch({
+ type: "REMOVE_TOAST",
+ toastId: toastId,
+ })
+ }, TOAST_REMOVE_DELAY)
+
+ toastTimeouts.set(toastId, timeout)
+}
+
+export const reducer = (state: State, action: Action): State => {
+ switch (action.type) {
+ case "ADD_TOAST":
+ return {
+ ...state,
+ toasts: [action.toast, ...state.toasts].slice(0, TOAST_LIMIT),
+ }
+
+ case "UPDATE_TOAST":
+ return {
+ ...state,
+ toasts: state.toasts.map((t) =>
+ t.id === action.toast.id ? { ...t, ...action.toast } : t
+ ),
+ }
+
+ case "DISMISS_TOAST": {
+ const { toastId } = action
+
+ // ! Side effects ! - This could be extracted into a dismissToast() action,
+ // but I'll keep it here for simplicity
+ if (toastId) {
+ addToRemoveQueue(toastId)
+ } else {
+ state.toasts.forEach((toast) => {
+ addToRemoveQueue(toast.id)
+ })
+ }
+
+ return {
+ ...state,
+ toasts: state.toasts.map((t) =>
+ t.id === toastId || toastId === undefined
+ ? {
+ ...t,
+ open: false,
+ }
+ : t
+ ),
+ }
+ }
+ case "REMOVE_TOAST":
+ if (action.toastId === undefined) {
+ return {
+ ...state,
+ toasts: [],
+ }
+ }
+ return {
+ ...state,
+ toasts: state.toasts.filter((t) => t.id !== action.toastId),
+ }
+ }
+}
+
+const listeners: Array<(state: State) => void> = []
+
+let memoryState: State = { toasts: [] }
+
+function dispatch(action: Action) {
+ memoryState = reducer(memoryState, action)
+ listeners.forEach((listener) => {
+ listener(memoryState)
+ })
+}
+
+type Toast = Omit
+
+function toast({ ...props }: Toast) {
+ const id = genId()
+
+ const update = (props: ToasterToast) =>
+ dispatch({
+ type: "UPDATE_TOAST",
+ toast: { ...props, id },
+ })
+ const dismiss = () => dispatch({ type: "DISMISS_TOAST", toastId: id })
+
+ dispatch({
+ type: "ADD_TOAST",
+ toast: {
+ ...props,
+ id,
+ open: true,
+ onOpenChange: (open) => {
+ if (!open) dismiss()
+ },
+ },
+ })
+
+ return {
+ id: id,
+ dismiss,
+ update,
+ }
+}
+
+function useToast() {
+ const [state, setState] = React.useState(memoryState)
+
+ React.useEffect(() => {
+ listeners.push(setState)
+ return () => {
+ const index = listeners.indexOf(setState)
+ if (index > -1) {
+ listeners.splice(index, 1)
+ }
+ }
+ }, [state])
+
+ return {
+ ...state,
+ toast,
+ dismiss: (toastId?: string) => dispatch({ type: "DISMISS_TOAST", toastId }),
+ }
+}
+
+export { useToast, toast }
diff --git a/lumina/config/site.ts b/lumina/config/site.ts
new file mode 100644
index 0000000..025dae4
--- /dev/null
+++ b/lumina/config/site.ts
@@ -0,0 +1,18 @@
+export type SiteConfig = typeof siteConfig
+
+export const siteConfig = {
+ name: "LUMINA",
+ description:
+ "A beautiful Nostr client for images.",
+ mainNav: [
+ {
+ title: "Home",
+ href: "/",
+ },
+ ],
+ links: {
+ twitter: "https://lumina.rocks/profile/npub1fq8vrf63vsrqjrwqgtwlvauqauc0yme6se8g8dqhcpf6tfs3equqntmzut",
+ github: "https://github.com/mroxso/lumina-rocks-website",
+ docs: "https://heynostr.com",
+ },
+}
\ No newline at end of file
diff --git a/lumina/next.config.mjs b/lumina/next.config.mjs
index bd8ccfd..c369c9c 100644
--- a/lumina/next.config.mjs
+++ b/lumina/next.config.mjs
@@ -1,4 +1,9 @@
-/** @type {import('next').NextConfig} */
+import withPWA from 'next-pwa';
+
+const config = {
+ dest: 'public'
+};
+
const nextConfig = {
output: 'standalone',
images: {
@@ -13,4 +18,4 @@ const nextConfig = {
},
};
-export default nextConfig;
\ No newline at end of file
+export default withPWA(config)(nextConfig);
\ No newline at end of file
diff --git a/lumina/package-lock.json b/lumina/package-lock.json
index cf3c623..4df25b3 100644
--- a/lumina/package-lock.json
+++ b/lumina/package-lock.json
@@ -8,26 +8,38 @@
"name": "lumina",
"version": "0.1.0",
"dependencies": {
+ "@hookform/resolvers": "^3.4.0",
+ "@radix-ui/react-accordion": "^1.1.2",
"@radix-ui/react-avatar": "^1.0.4",
"@radix-ui/react-dialog": "^1.0.5",
"@radix-ui/react-dropdown-menu": "^2.0.6",
"@radix-ui/react-icons": "^1.3.0",
+ "@radix-ui/react-label": "^2.0.2",
"@radix-ui/react-navigation-menu": "^1.1.4",
+ "@radix-ui/react-scroll-area": "^1.0.5",
"@radix-ui/react-slot": "^1.0.2",
"@radix-ui/react-tabs": "^1.0.4",
+ "@radix-ui/react-toast": "^1.1.5",
"@radix-ui/react-tooltip": "^1.0.7",
+ "bolt11": "^1.4.1",
"class-variance-authority": "^0.7.0",
"clsx": "^2.1.0",
"embla-carousel-react": "^8.0.0-rc21",
+ "light-bolt11-decoder": "^3.1.1",
"lucide-react": "^0.316.0",
"next": "14.1.0",
+ "next-pwa": "^5.6.0",
"next-themes": "^0.2.1",
"nostr-react": "^0.7.0",
+ "nostr-tools": "^2.4.0",
"react": "^18",
"react-dom": "^18",
+ "react-hook-form": "^7.51.4",
+ "react-icons": "^5.1.0",
"tailwind-merge": "^2.2.1",
"tailwindcss-animate": "^1.0.7",
- "vaul": "^0.8.9"
+ "vaul": "^0.8.9",
+ "zod": "^3.23.8"
},
"devDependencies": {
"@types/node": "^20",
@@ -59,6 +71,1668 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
+ "node_modules/@ampproject/remapping": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz",
+ "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==",
+ "dependencies": {
+ "@jridgewell/gen-mapping": "^0.3.0",
+ "@jridgewell/trace-mapping": "^0.3.9"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@babel/code-frame": {
+ "version": "7.23.5",
+ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.5.tgz",
+ "integrity": "sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==",
+ "dependencies": {
+ "@babel/highlight": "^7.23.4",
+ "chalk": "^2.4.2"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/code-frame/node_modules/ansi-styles": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+ "dependencies": {
+ "color-convert": "^1.9.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/@babel/code-frame/node_modules/chalk": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+ "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+ "dependencies": {
+ "ansi-styles": "^3.2.1",
+ "escape-string-regexp": "^1.0.5",
+ "supports-color": "^5.3.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/@babel/code-frame/node_modules/color-convert": {
+ "version": "1.9.3",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
+ "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
+ "dependencies": {
+ "color-name": "1.1.3"
+ }
+ },
+ "node_modules/@babel/code-frame/node_modules/color-name": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
+ "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw=="
+ },
+ "node_modules/@babel/code-frame/node_modules/escape-string-regexp": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+ "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==",
+ "engines": {
+ "node": ">=0.8.0"
+ }
+ },
+ "node_modules/@babel/code-frame/node_modules/has-flag": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+ "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/@babel/code-frame/node_modules/supports-color": {
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+ "dependencies": {
+ "has-flag": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/@babel/compat-data": {
+ "version": "7.23.5",
+ "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.23.5.tgz",
+ "integrity": "sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw==",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/core": {
+ "version": "7.23.9",
+ "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.9.tgz",
+ "integrity": "sha512-5q0175NOjddqpvvzU+kDiSOAk4PfdO6FvwCWoQ6RO7rTzEe8vlo+4HVfcnAREhD4npMs0e9uZypjTwzZPCf/cw==",
+ "dependencies": {
+ "@ampproject/remapping": "^2.2.0",
+ "@babel/code-frame": "^7.23.5",
+ "@babel/generator": "^7.23.6",
+ "@babel/helper-compilation-targets": "^7.23.6",
+ "@babel/helper-module-transforms": "^7.23.3",
+ "@babel/helpers": "^7.23.9",
+ "@babel/parser": "^7.23.9",
+ "@babel/template": "^7.23.9",
+ "@babel/traverse": "^7.23.9",
+ "@babel/types": "^7.23.9",
+ "convert-source-map": "^2.0.0",
+ "debug": "^4.1.0",
+ "gensync": "^1.0.0-beta.2",
+ "json5": "^2.2.3",
+ "semver": "^6.3.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/babel"
+ }
+ },
+ "node_modules/@babel/core/node_modules/json5": {
+ "version": "2.2.3",
+ "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz",
+ "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==",
+ "bin": {
+ "json5": "lib/cli.js"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/@babel/generator": {
+ "version": "7.23.6",
+ "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.6.tgz",
+ "integrity": "sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw==",
+ "dependencies": {
+ "@babel/types": "^7.23.6",
+ "@jridgewell/gen-mapping": "^0.3.2",
+ "@jridgewell/trace-mapping": "^0.3.17",
+ "jsesc": "^2.5.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-annotate-as-pure": {
+ "version": "7.22.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz",
+ "integrity": "sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==",
+ "dependencies": {
+ "@babel/types": "^7.22.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": {
+ "version": "7.22.15",
+ "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.15.tgz",
+ "integrity": "sha512-QkBXwGgaoC2GtGZRoma6kv7Szfv06khvhFav67ZExau2RaXzy8MpHSMO2PNoP2XtmQphJQRHFfg77Bq731Yizw==",
+ "dependencies": {
+ "@babel/types": "^7.22.15"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-compilation-targets": {
+ "version": "7.23.6",
+ "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz",
+ "integrity": "sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==",
+ "dependencies": {
+ "@babel/compat-data": "^7.23.5",
+ "@babel/helper-validator-option": "^7.23.5",
+ "browserslist": "^4.22.2",
+ "lru-cache": "^5.1.1",
+ "semver": "^6.3.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-compilation-targets/node_modules/lru-cache": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz",
+ "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==",
+ "dependencies": {
+ "yallist": "^3.0.2"
+ }
+ },
+ "node_modules/@babel/helper-compilation-targets/node_modules/yallist": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
+ "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g=="
+ },
+ "node_modules/@babel/helper-create-class-features-plugin": {
+ "version": "7.23.10",
+ "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.23.10.tgz",
+ "integrity": "sha512-2XpP2XhkXzgxecPNEEK8Vz8Asj9aRxt08oKOqtiZoqV2UGZ5T+EkyP9sXQ9nwMxBIG34a7jmasVqoMop7VdPUw==",
+ "dependencies": {
+ "@babel/helper-annotate-as-pure": "^7.22.5",
+ "@babel/helper-environment-visitor": "^7.22.20",
+ "@babel/helper-function-name": "^7.23.0",
+ "@babel/helper-member-expression-to-functions": "^7.23.0",
+ "@babel/helper-optimise-call-expression": "^7.22.5",
+ "@babel/helper-replace-supers": "^7.22.20",
+ "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5",
+ "@babel/helper-split-export-declaration": "^7.22.6",
+ "semver": "^6.3.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/helper-create-regexp-features-plugin": {
+ "version": "7.22.15",
+ "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.15.tgz",
+ "integrity": "sha512-29FkPLFjn4TPEa3RE7GpW+qbE8tlsu3jntNYNfcGsc49LphF1PQIiD+vMZ1z1xVOKt+93khA9tc2JBs3kBjA7w==",
+ "dependencies": {
+ "@babel/helper-annotate-as-pure": "^7.22.5",
+ "regexpu-core": "^5.3.1",
+ "semver": "^6.3.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/helper-define-polyfill-provider": {
+ "version": "0.5.0",
+ "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.5.0.tgz",
+ "integrity": "sha512-NovQquuQLAQ5HuyjCz7WQP9MjRj7dx++yspwiyUiGl9ZyadHRSql1HZh5ogRd8W8w6YM6EQ/NTB8rgjLt5W65Q==",
+ "dependencies": {
+ "@babel/helper-compilation-targets": "^7.22.6",
+ "@babel/helper-plugin-utils": "^7.22.5",
+ "debug": "^4.1.1",
+ "lodash.debounce": "^4.0.8",
+ "resolve": "^1.14.2"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0"
+ }
+ },
+ "node_modules/@babel/helper-environment-visitor": {
+ "version": "7.22.20",
+ "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz",
+ "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-function-name": {
+ "version": "7.23.0",
+ "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz",
+ "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==",
+ "dependencies": {
+ "@babel/template": "^7.22.15",
+ "@babel/types": "^7.23.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-hoist-variables": {
+ "version": "7.22.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz",
+ "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==",
+ "dependencies": {
+ "@babel/types": "^7.22.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-member-expression-to-functions": {
+ "version": "7.23.0",
+ "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.23.0.tgz",
+ "integrity": "sha512-6gfrPwh7OuT6gZyJZvd6WbTfrqAo7vm4xCzAXOusKqq/vWdKXphTpj5klHKNmRUU6/QRGlBsyU9mAIPaWHlqJA==",
+ "dependencies": {
+ "@babel/types": "^7.23.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-module-imports": {
+ "version": "7.22.15",
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz",
+ "integrity": "sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==",
+ "dependencies": {
+ "@babel/types": "^7.22.15"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-module-transforms": {
+ "version": "7.23.3",
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz",
+ "integrity": "sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==",
+ "dependencies": {
+ "@babel/helper-environment-visitor": "^7.22.20",
+ "@babel/helper-module-imports": "^7.22.15",
+ "@babel/helper-simple-access": "^7.22.5",
+ "@babel/helper-split-export-declaration": "^7.22.6",
+ "@babel/helper-validator-identifier": "^7.22.20"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/helper-optimise-call-expression": {
+ "version": "7.22.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.22.5.tgz",
+ "integrity": "sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==",
+ "dependencies": {
+ "@babel/types": "^7.22.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-plugin-utils": {
+ "version": "7.22.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz",
+ "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-remap-async-to-generator": {
+ "version": "7.22.20",
+ "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.20.tgz",
+ "integrity": "sha512-pBGyV4uBqOns+0UvhsTO8qgl8hO89PmiDYv+/COyp1aeMcmfrfruz+/nCMFiYyFF/Knn0yfrC85ZzNFjembFTw==",
+ "dependencies": {
+ "@babel/helper-annotate-as-pure": "^7.22.5",
+ "@babel/helper-environment-visitor": "^7.22.20",
+ "@babel/helper-wrap-function": "^7.22.20"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/helper-replace-supers": {
+ "version": "7.22.20",
+ "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.22.20.tgz",
+ "integrity": "sha512-qsW0In3dbwQUbK8kejJ4R7IHVGwHJlV6lpG6UA7a9hSa2YEiAib+N1T2kr6PEeUT+Fl7najmSOS6SmAwCHK6Tw==",
+ "dependencies": {
+ "@babel/helper-environment-visitor": "^7.22.20",
+ "@babel/helper-member-expression-to-functions": "^7.22.15",
+ "@babel/helper-optimise-call-expression": "^7.22.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/helper-simple-access": {
+ "version": "7.22.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz",
+ "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==",
+ "dependencies": {
+ "@babel/types": "^7.22.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-skip-transparent-expression-wrappers": {
+ "version": "7.22.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.22.5.tgz",
+ "integrity": "sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==",
+ "dependencies": {
+ "@babel/types": "^7.22.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-split-export-declaration": {
+ "version": "7.22.6",
+ "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz",
+ "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==",
+ "dependencies": {
+ "@babel/types": "^7.22.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-string-parser": {
+ "version": "7.23.4",
+ "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz",
+ "integrity": "sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-validator-identifier": {
+ "version": "7.22.20",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz",
+ "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-validator-option": {
+ "version": "7.23.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz",
+ "integrity": "sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-wrap-function": {
+ "version": "7.22.20",
+ "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.22.20.tgz",
+ "integrity": "sha512-pms/UwkOpnQe/PDAEdV/d7dVCoBbB+R4FvYoHGZz+4VPcg7RtYy2KP7S2lbuWM6FCSgob5wshfGESbC/hzNXZw==",
+ "dependencies": {
+ "@babel/helper-function-name": "^7.22.5",
+ "@babel/template": "^7.22.15",
+ "@babel/types": "^7.22.19"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helpers": {
+ "version": "7.23.9",
+ "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.9.tgz",
+ "integrity": "sha512-87ICKgU5t5SzOT7sBMfCOZQ2rHjRU+Pcb9BoILMYz600W6DkVRLFBPwQ18gwUVvggqXivaUakpnxWQGbpywbBQ==",
+ "dependencies": {
+ "@babel/template": "^7.23.9",
+ "@babel/traverse": "^7.23.9",
+ "@babel/types": "^7.23.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/highlight": {
+ "version": "7.23.4",
+ "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.23.4.tgz",
+ "integrity": "sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==",
+ "dependencies": {
+ "@babel/helper-validator-identifier": "^7.22.20",
+ "chalk": "^2.4.2",
+ "js-tokens": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/highlight/node_modules/ansi-styles": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+ "dependencies": {
+ "color-convert": "^1.9.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/@babel/highlight/node_modules/chalk": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+ "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+ "dependencies": {
+ "ansi-styles": "^3.2.1",
+ "escape-string-regexp": "^1.0.5",
+ "supports-color": "^5.3.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/@babel/highlight/node_modules/color-convert": {
+ "version": "1.9.3",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
+ "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
+ "dependencies": {
+ "color-name": "1.1.3"
+ }
+ },
+ "node_modules/@babel/highlight/node_modules/color-name": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
+ "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw=="
+ },
+ "node_modules/@babel/highlight/node_modules/escape-string-regexp": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+ "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==",
+ "engines": {
+ "node": ">=0.8.0"
+ }
+ },
+ "node_modules/@babel/highlight/node_modules/has-flag": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+ "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/@babel/highlight/node_modules/supports-color": {
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+ "dependencies": {
+ "has-flag": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/@babel/parser": {
+ "version": "7.23.9",
+ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.9.tgz",
+ "integrity": "sha512-9tcKgqKbs3xGJ+NtKF2ndOBBLVwPjl1SHxPQkd36r3Dlirw3xWUeGaTbqr7uGZcTaxkVNwc+03SVP7aCdWrTlA==",
+ "bin": {
+ "parser": "bin/babel-parser.js"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": {
+ "version": "7.23.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.23.3.tgz",
+ "integrity": "sha512-iRkKcCqb7iGnq9+3G6rZ+Ciz5VywC4XNRHe57lKM+jOeYAoR0lVqdeeDRfh0tQcTfw/+vBhHn926FmQhLtlFLQ==",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.22.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": {
+ "version": "7.23.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.23.3.tgz",
+ "integrity": "sha512-WwlxbfMNdVEpQjZmK5mhm7oSwD3dS6eU+Iwsi4Knl9wAletWem7kaRsGOG+8UEbRyqxY4SS5zvtfXwX+jMxUwQ==",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.22.5",
+ "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5",
+ "@babel/plugin-transform-optional-chaining": "^7.23.3"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.13.0"
+ }
+ },
+ "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": {
+ "version": "7.23.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.23.7.tgz",
+ "integrity": "sha512-LlRT7HgaifEpQA1ZgLVOIJZZFVPWN5iReq/7/JixwBtwcoeVGDBD53ZV28rrsLYOZs1Y/EHhA8N/Z6aazHR8cw==",
+ "dependencies": {
+ "@babel/helper-environment-visitor": "^7.22.20",
+ "@babel/helper-plugin-utils": "^7.22.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/plugin-proposal-private-property-in-object": {
+ "version": "7.21.0-placeholder-for-preset-env.2",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz",
+ "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==",
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-async-generators": {
+ "version": "7.8.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz",
+ "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.8.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-class-properties": {
+ "version": "7.12.13",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz",
+ "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.12.13"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-class-static-block": {
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz",
+ "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.14.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-dynamic-import": {
+ "version": "7.8.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz",
+ "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.8.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-export-namespace-from": {
+ "version": "7.8.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz",
+ "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.8.3"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-import-assertions": {
+ "version": "7.23.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.23.3.tgz",
+ "integrity": "sha512-lPgDSU+SJLK3xmFDTV2ZRQAiM7UuUjGidwBywFavObCiZc1BeAAcMtHJKUya92hPHO+at63JJPLygilZard8jw==",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.22.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-import-attributes": {
+ "version": "7.23.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.23.3.tgz",
+ "integrity": "sha512-pawnE0P9g10xgoP7yKr6CK63K2FMsTE+FZidZO/1PwRdzmAPVs+HS1mAURUsgaoxammTJvULUdIkEK0gOcU2tA==",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.22.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-import-meta": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz",
+ "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.10.4"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-json-strings": {
+ "version": "7.8.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz",
+ "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.8.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-logical-assignment-operators": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz",
+ "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.10.4"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": {
+ "version": "7.8.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz",
+ "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.8.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-numeric-separator": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz",
+ "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.10.4"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-object-rest-spread": {
+ "version": "7.8.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz",
+ "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.8.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-optional-catch-binding": {
+ "version": "7.8.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz",
+ "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.8.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-optional-chaining": {
+ "version": "7.8.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz",
+ "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.8.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-private-property-in-object": {
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz",
+ "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.14.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-top-level-await": {
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz",
+ "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.14.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-unicode-sets-regex": {
+ "version": "7.18.6",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz",
+ "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==",
+ "dependencies": {
+ "@babel/helper-create-regexp-features-plugin": "^7.18.6",
+ "@babel/helper-plugin-utils": "^7.18.6"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-arrow-functions": {
+ "version": "7.23.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.23.3.tgz",
+ "integrity": "sha512-NzQcQrzaQPkaEwoTm4Mhyl8jI1huEL/WWIEvudjTCMJ9aBZNpsJbMASx7EQECtQQPS/DcnFpo0FIh3LvEO9cxQ==",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.22.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-async-generator-functions": {
+ "version": "7.23.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.23.9.tgz",
+ "integrity": "sha512-8Q3veQEDGe14dTYuwagbRtwxQDnytyg1JFu4/HwEMETeofocrB0U0ejBJIXoeG/t2oXZ8kzCyI0ZZfbT80VFNQ==",
+ "dependencies": {
+ "@babel/helper-environment-visitor": "^7.22.20",
+ "@babel/helper-plugin-utils": "^7.22.5",
+ "@babel/helper-remap-async-to-generator": "^7.22.20",
+ "@babel/plugin-syntax-async-generators": "^7.8.4"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-async-to-generator": {
+ "version": "7.23.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.23.3.tgz",
+ "integrity": "sha512-A7LFsKi4U4fomjqXJlZg/u0ft/n8/7n7lpffUP/ZULx/DtV9SGlNKZolHH6PE8Xl1ngCc0M11OaeZptXVkfKSw==",
+ "dependencies": {
+ "@babel/helper-module-imports": "^7.22.15",
+ "@babel/helper-plugin-utils": "^7.22.5",
+ "@babel/helper-remap-async-to-generator": "^7.22.20"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-block-scoped-functions": {
+ "version": "7.23.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.23.3.tgz",
+ "integrity": "sha512-vI+0sIaPIO6CNuM9Kk5VmXcMVRiOpDh7w2zZt9GXzmE/9KD70CUEVhvPR/etAeNK/FAEkhxQtXOzVF3EuRL41A==",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.22.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-block-scoping": {
+ "version": "7.23.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.23.4.tgz",
+ "integrity": "sha512-0QqbP6B6HOh7/8iNR4CQU2Th/bbRtBp4KS9vcaZd1fZ0wSh5Fyssg0UCIHwxh+ka+pNDREbVLQnHCMHKZfPwfw==",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.22.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-class-properties": {
+ "version": "7.23.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.23.3.tgz",
+ "integrity": "sha512-uM+AN8yCIjDPccsKGlw271xjJtGii+xQIF/uMPS8H15L12jZTsLfF4o5vNO7d/oUguOyfdikHGc/yi9ge4SGIg==",
+ "dependencies": {
+ "@babel/helper-create-class-features-plugin": "^7.22.15",
+ "@babel/helper-plugin-utils": "^7.22.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-class-static-block": {
+ "version": "7.23.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.23.4.tgz",
+ "integrity": "sha512-nsWu/1M+ggti1SOALj3hfx5FXzAY06fwPJsUZD4/A5e1bWi46VUIWtD+kOX6/IdhXGsXBWllLFDSnqSCdUNydQ==",
+ "dependencies": {
+ "@babel/helper-create-class-features-plugin": "^7.22.15",
+ "@babel/helper-plugin-utils": "^7.22.5",
+ "@babel/plugin-syntax-class-static-block": "^7.14.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.12.0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-classes": {
+ "version": "7.23.8",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.23.8.tgz",
+ "integrity": "sha512-yAYslGsY1bX6Knmg46RjiCiNSwJKv2IUC8qOdYKqMMr0491SXFhcHqOdRDeCRohOOIzwN/90C6mQ9qAKgrP7dg==",
+ "dependencies": {
+ "@babel/helper-annotate-as-pure": "^7.22.5",
+ "@babel/helper-compilation-targets": "^7.23.6",
+ "@babel/helper-environment-visitor": "^7.22.20",
+ "@babel/helper-function-name": "^7.23.0",
+ "@babel/helper-plugin-utils": "^7.22.5",
+ "@babel/helper-replace-supers": "^7.22.20",
+ "@babel/helper-split-export-declaration": "^7.22.6",
+ "globals": "^11.1.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-classes/node_modules/globals": {
+ "version": "11.12.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz",
+ "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/@babel/plugin-transform-computed-properties": {
+ "version": "7.23.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.23.3.tgz",
+ "integrity": "sha512-dTj83UVTLw/+nbiHqQSFdwO9CbTtwq1DsDqm3CUEtDrZNET5rT5E6bIdTlOftDTDLMYxvxHNEYO4B9SLl8SLZw==",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.22.5",
+ "@babel/template": "^7.22.15"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-destructuring": {
+ "version": "7.23.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.23.3.tgz",
+ "integrity": "sha512-n225npDqjDIr967cMScVKHXJs7rout1q+tt50inyBCPkyZ8KxeI6d+GIbSBTT/w/9WdlWDOej3V9HE5Lgk57gw==",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.22.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-dotall-regex": {
+ "version": "7.23.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.23.3.tgz",
+ "integrity": "sha512-vgnFYDHAKzFaTVp+mneDsIEbnJ2Np/9ng9iviHw3P/KVcgONxpNULEW/51Z/BaFojG2GI2GwwXck5uV1+1NOYQ==",
+ "dependencies": {
+ "@babel/helper-create-regexp-features-plugin": "^7.22.15",
+ "@babel/helper-plugin-utils": "^7.22.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-duplicate-keys": {
+ "version": "7.23.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.23.3.tgz",
+ "integrity": "sha512-RrqQ+BQmU3Oyav3J+7/myfvRCq7Tbz+kKLLshUmMwNlDHExbGL7ARhajvoBJEvc+fCguPPu887N+3RRXBVKZUA==",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.22.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-dynamic-import": {
+ "version": "7.23.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.23.4.tgz",
+ "integrity": "sha512-V6jIbLhdJK86MaLh4Jpghi8ho5fGzt3imHOBu/x0jlBaPYqDoWz4RDXjmMOfnh+JWNaQleEAByZLV0QzBT4YQQ==",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.22.5",
+ "@babel/plugin-syntax-dynamic-import": "^7.8.3"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-exponentiation-operator": {
+ "version": "7.23.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.23.3.tgz",
+ "integrity": "sha512-5fhCsl1odX96u7ILKHBj4/Y8vipoqwsJMh4csSA8qFfxrZDEA4Ssku2DyNvMJSmZNOEBT750LfFPbtrnTP90BQ==",
+ "dependencies": {
+ "@babel/helper-builder-binary-assignment-operator-visitor": "^7.22.15",
+ "@babel/helper-plugin-utils": "^7.22.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-export-namespace-from": {
+ "version": "7.23.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.23.4.tgz",
+ "integrity": "sha512-GzuSBcKkx62dGzZI1WVgTWvkkz84FZO5TC5T8dl/Tht/rAla6Dg/Mz9Yhypg+ezVACf/rgDuQt3kbWEv7LdUDQ==",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.22.5",
+ "@babel/plugin-syntax-export-namespace-from": "^7.8.3"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-for-of": {
+ "version": "7.23.6",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.23.6.tgz",
+ "integrity": "sha512-aYH4ytZ0qSuBbpfhuofbg/e96oQ7U2w1Aw/UQmKT+1l39uEhUPoFS3fHevDc1G0OvewyDudfMKY1OulczHzWIw==",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.22.5",
+ "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-function-name": {
+ "version": "7.23.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.23.3.tgz",
+ "integrity": "sha512-I1QXp1LxIvt8yLaib49dRW5Okt7Q4oaxao6tFVKS/anCdEOMtYwWVKoiOA1p34GOWIZjUK0E+zCp7+l1pfQyiw==",
+ "dependencies": {
+ "@babel/helper-compilation-targets": "^7.22.15",
+ "@babel/helper-function-name": "^7.23.0",
+ "@babel/helper-plugin-utils": "^7.22.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-json-strings": {
+ "version": "7.23.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.23.4.tgz",
+ "integrity": "sha512-81nTOqM1dMwZ/aRXQ59zVubN9wHGqk6UtqRK+/q+ciXmRy8fSolhGVvG09HHRGo4l6fr/c4ZhXUQH0uFW7PZbg==",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.22.5",
+ "@babel/plugin-syntax-json-strings": "^7.8.3"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-literals": {
+ "version": "7.23.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.23.3.tgz",
+ "integrity": "sha512-wZ0PIXRxnwZvl9AYpqNUxpZ5BiTGrYt7kueGQ+N5FiQ7RCOD4cm8iShd6S6ggfVIWaJf2EMk8eRzAh52RfP4rQ==",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.22.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-logical-assignment-operators": {
+ "version": "7.23.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.23.4.tgz",
+ "integrity": "sha512-Mc/ALf1rmZTP4JKKEhUwiORU+vcfarFVLfcFiolKUo6sewoxSEgl36ak5t+4WamRsNr6nzjZXQjM35WsU+9vbg==",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.22.5",
+ "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-member-expression-literals": {
+ "version": "7.23.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.23.3.tgz",
+ "integrity": "sha512-sC3LdDBDi5x96LA+Ytekz2ZPk8i/Ck+DEuDbRAll5rknJ5XRTSaPKEYwomLcs1AA8wg9b3KjIQRsnApj+q51Ag==",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.22.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-modules-amd": {
+ "version": "7.23.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.23.3.tgz",
+ "integrity": "sha512-vJYQGxeKM4t8hYCKVBlZX/gtIY2I7mRGFNcm85sgXGMTBcoV3QdVtdpbcWEbzbfUIUZKwvgFT82mRvaQIebZzw==",
+ "dependencies": {
+ "@babel/helper-module-transforms": "^7.23.3",
+ "@babel/helper-plugin-utils": "^7.22.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-modules-commonjs": {
+ "version": "7.23.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.23.3.tgz",
+ "integrity": "sha512-aVS0F65LKsdNOtcz6FRCpE4OgsP2OFnW46qNxNIX9h3wuzaNcSQsJysuMwqSibC98HPrf2vCgtxKNwS0DAlgcA==",
+ "dependencies": {
+ "@babel/helper-module-transforms": "^7.23.3",
+ "@babel/helper-plugin-utils": "^7.22.5",
+ "@babel/helper-simple-access": "^7.22.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-modules-systemjs": {
+ "version": "7.23.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.23.9.tgz",
+ "integrity": "sha512-KDlPRM6sLo4o1FkiSlXoAa8edLXFsKKIda779fbLrvmeuc3itnjCtaO6RrtoaANsIJANj+Vk1zqbZIMhkCAHVw==",
+ "dependencies": {
+ "@babel/helper-hoist-variables": "^7.22.5",
+ "@babel/helper-module-transforms": "^7.23.3",
+ "@babel/helper-plugin-utils": "^7.22.5",
+ "@babel/helper-validator-identifier": "^7.22.20"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-modules-umd": {
+ "version": "7.23.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.23.3.tgz",
+ "integrity": "sha512-zHsy9iXX2nIsCBFPud3jKn1IRPWg3Ing1qOZgeKV39m1ZgIdpJqvlWVeiHBZC6ITRG0MfskhYe9cLgntfSFPIg==",
+ "dependencies": {
+ "@babel/helper-module-transforms": "^7.23.3",
+ "@babel/helper-plugin-utils": "^7.22.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-named-capturing-groups-regex": {
+ "version": "7.22.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.22.5.tgz",
+ "integrity": "sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ==",
+ "dependencies": {
+ "@babel/helper-create-regexp-features-plugin": "^7.22.5",
+ "@babel/helper-plugin-utils": "^7.22.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-new-target": {
+ "version": "7.23.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.23.3.tgz",
+ "integrity": "sha512-YJ3xKqtJMAT5/TIZnpAR3I+K+WaDowYbN3xyxI8zxx/Gsypwf9B9h0VB+1Nh6ACAAPRS5NSRje0uVv5i79HYGQ==",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.22.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-nullish-coalescing-operator": {
+ "version": "7.23.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.23.4.tgz",
+ "integrity": "sha512-jHE9EVVqHKAQx+VePv5LLGHjmHSJR76vawFPTdlxR/LVJPfOEGxREQwQfjuZEOPTwG92X3LINSh3M40Rv4zpVA==",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.22.5",
+ "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-numeric-separator": {
+ "version": "7.23.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.23.4.tgz",
+ "integrity": "sha512-mps6auzgwjRrwKEZA05cOwuDc9FAzoyFS4ZsG/8F43bTLf/TgkJg7QXOrPO1JO599iA3qgK9MXdMGOEC8O1h6Q==",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.22.5",
+ "@babel/plugin-syntax-numeric-separator": "^7.10.4"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-object-rest-spread": {
+ "version": "7.23.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.23.4.tgz",
+ "integrity": "sha512-9x9K1YyeQVw0iOXJlIzwm8ltobIIv7j2iLyP2jIhEbqPRQ7ScNgwQufU2I0Gq11VjyG4gI4yMXt2VFags+1N3g==",
+ "dependencies": {
+ "@babel/compat-data": "^7.23.3",
+ "@babel/helper-compilation-targets": "^7.22.15",
+ "@babel/helper-plugin-utils": "^7.22.5",
+ "@babel/plugin-syntax-object-rest-spread": "^7.8.3",
+ "@babel/plugin-transform-parameters": "^7.23.3"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-object-super": {
+ "version": "7.23.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.23.3.tgz",
+ "integrity": "sha512-BwQ8q0x2JG+3lxCVFohg+KbQM7plfpBwThdW9A6TMtWwLsbDA01Ek2Zb/AgDN39BiZsExm4qrXxjk+P1/fzGrA==",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.22.5",
+ "@babel/helper-replace-supers": "^7.22.20"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-optional-catch-binding": {
+ "version": "7.23.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.23.4.tgz",
+ "integrity": "sha512-XIq8t0rJPHf6Wvmbn9nFxU6ao4c7WhghTR5WyV8SrJfUFzyxhCm4nhC+iAp3HFhbAKLfYpgzhJ6t4XCtVwqO5A==",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.22.5",
+ "@babel/plugin-syntax-optional-catch-binding": "^7.8.3"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-optional-chaining": {
+ "version": "7.23.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.23.4.tgz",
+ "integrity": "sha512-ZU8y5zWOfjM5vZ+asjgAPwDaBjJzgufjES89Rs4Lpq63O300R/kOz30WCLo6BxxX6QVEilwSlpClnG5cZaikTA==",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.22.5",
+ "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5",
+ "@babel/plugin-syntax-optional-chaining": "^7.8.3"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-parameters": {
+ "version": "7.23.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.23.3.tgz",
+ "integrity": "sha512-09lMt6UsUb3/34BbECKVbVwrT9bO6lILWln237z7sLaWnMsTi7Yc9fhX5DLpkJzAGfaReXI22wP41SZmnAA3Vw==",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.22.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-private-methods": {
+ "version": "7.23.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.23.3.tgz",
+ "integrity": "sha512-UzqRcRtWsDMTLrRWFvUBDwmw06tCQH9Rl1uAjfh6ijMSmGYQ+fpdB+cnqRC8EMh5tuuxSv0/TejGL+7vyj+50g==",
+ "dependencies": {
+ "@babel/helper-create-class-features-plugin": "^7.22.15",
+ "@babel/helper-plugin-utils": "^7.22.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-private-property-in-object": {
+ "version": "7.23.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.23.4.tgz",
+ "integrity": "sha512-9G3K1YqTq3F4Vt88Djx1UZ79PDyj+yKRnUy7cZGSMe+a7jkwD259uKKuUzQlPkGam7R+8RJwh5z4xO27fA1o2A==",
+ "dependencies": {
+ "@babel/helper-annotate-as-pure": "^7.22.5",
+ "@babel/helper-create-class-features-plugin": "^7.22.15",
+ "@babel/helper-plugin-utils": "^7.22.5",
+ "@babel/plugin-syntax-private-property-in-object": "^7.14.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-property-literals": {
+ "version": "7.23.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.23.3.tgz",
+ "integrity": "sha512-jR3Jn3y7cZp4oEWPFAlRsSWjxKe4PZILGBSd4nis1TsC5qeSpb+nrtihJuDhNI7QHiVbUaiXa0X2RZY3/TI6Nw==",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.22.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-regenerator": {
+ "version": "7.23.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.23.3.tgz",
+ "integrity": "sha512-KP+75h0KghBMcVpuKisx3XTu9Ncut8Q8TuvGO4IhY+9D5DFEckQefOuIsB/gQ2tG71lCke4NMrtIPS8pOj18BQ==",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.22.5",
+ "regenerator-transform": "^0.15.2"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-reserved-words": {
+ "version": "7.23.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.23.3.tgz",
+ "integrity": "sha512-QnNTazY54YqgGxwIexMZva9gqbPa15t/x9VS+0fsEFWplwVpXYZivtgl43Z1vMpc1bdPP2PP8siFeVcnFvA3Cg==",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.22.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-shorthand-properties": {
+ "version": "7.23.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.23.3.tgz",
+ "integrity": "sha512-ED2fgqZLmexWiN+YNFX26fx4gh5qHDhn1O2gvEhreLW2iI63Sqm4llRLCXALKrCnbN4Jy0VcMQZl/SAzqug/jg==",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.22.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-spread": {
+ "version": "7.23.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.23.3.tgz",
+ "integrity": "sha512-VvfVYlrlBVu+77xVTOAoxQ6mZbnIq5FM0aGBSFEcIh03qHf+zNqA4DC/3XMUozTg7bZV3e3mZQ0i13VB6v5yUg==",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.22.5",
+ "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-sticky-regex": {
+ "version": "7.23.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.23.3.tgz",
+ "integrity": "sha512-HZOyN9g+rtvnOU3Yh7kSxXrKbzgrm5X4GncPY1QOquu7epga5MxKHVpYu2hvQnry/H+JjckSYRb93iNfsioAGg==",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.22.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-template-literals": {
+ "version": "7.23.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.23.3.tgz",
+ "integrity": "sha512-Flok06AYNp7GV2oJPZZcP9vZdszev6vPBkHLwxwSpaIqx75wn6mUd3UFWsSsA0l8nXAKkyCmL/sR02m8RYGeHg==",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.22.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-typeof-symbol": {
+ "version": "7.23.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.23.3.tgz",
+ "integrity": "sha512-4t15ViVnaFdrPC74be1gXBSMzXk3B4Us9lP7uLRQHTFpV5Dvt33pn+2MyyNxmN3VTTm3oTrZVMUmuw3oBnQ2oQ==",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.22.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-unicode-escapes": {
+ "version": "7.23.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.23.3.tgz",
+ "integrity": "sha512-OMCUx/bU6ChE3r4+ZdylEqAjaQgHAgipgW8nsCfu5pGqDcFytVd91AwRvUJSBZDz0exPGgnjoqhgRYLRjFZc9Q==",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.22.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-unicode-property-regex": {
+ "version": "7.23.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.23.3.tgz",
+ "integrity": "sha512-KcLIm+pDZkWZQAFJ9pdfmh89EwVfmNovFBcXko8szpBeF8z68kWIPeKlmSOkT9BXJxs2C0uk+5LxoxIv62MROA==",
+ "dependencies": {
+ "@babel/helper-create-regexp-features-plugin": "^7.22.15",
+ "@babel/helper-plugin-utils": "^7.22.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-unicode-regex": {
+ "version": "7.23.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.23.3.tgz",
+ "integrity": "sha512-wMHpNA4x2cIA32b/ci3AfwNgheiva2W0WUKWTK7vBHBhDKfPsc5cFGNWm69WBqpwd86u1qwZ9PWevKqm1A3yAw==",
+ "dependencies": {
+ "@babel/helper-create-regexp-features-plugin": "^7.22.15",
+ "@babel/helper-plugin-utils": "^7.22.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-unicode-sets-regex": {
+ "version": "7.23.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.23.3.tgz",
+ "integrity": "sha512-W7lliA/v9bNR83Qc3q1ip9CQMZ09CcHDbHfbLRDNuAhn1Mvkr1ZNF7hPmztMQvtTGVLJ9m8IZqWsTkXOml8dbw==",
+ "dependencies": {
+ "@babel/helper-create-regexp-features-plugin": "^7.22.15",
+ "@babel/helper-plugin-utils": "^7.22.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/preset-env": {
+ "version": "7.23.9",
+ "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.23.9.tgz",
+ "integrity": "sha512-3kBGTNBBk9DQiPoXYS0g0BYlwTQYUTifqgKTjxUwEUkduRT2QOa0FPGBJ+NROQhGyYO5BuTJwGvBnqKDykac6A==",
+ "dependencies": {
+ "@babel/compat-data": "^7.23.5",
+ "@babel/helper-compilation-targets": "^7.23.6",
+ "@babel/helper-plugin-utils": "^7.22.5",
+ "@babel/helper-validator-option": "^7.23.5",
+ "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.23.3",
+ "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.23.3",
+ "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.23.7",
+ "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2",
+ "@babel/plugin-syntax-async-generators": "^7.8.4",
+ "@babel/plugin-syntax-class-properties": "^7.12.13",
+ "@babel/plugin-syntax-class-static-block": "^7.14.5",
+ "@babel/plugin-syntax-dynamic-import": "^7.8.3",
+ "@babel/plugin-syntax-export-namespace-from": "^7.8.3",
+ "@babel/plugin-syntax-import-assertions": "^7.23.3",
+ "@babel/plugin-syntax-import-attributes": "^7.23.3",
+ "@babel/plugin-syntax-import-meta": "^7.10.4",
+ "@babel/plugin-syntax-json-strings": "^7.8.3",
+ "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4",
+ "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3",
+ "@babel/plugin-syntax-numeric-separator": "^7.10.4",
+ "@babel/plugin-syntax-object-rest-spread": "^7.8.3",
+ "@babel/plugin-syntax-optional-catch-binding": "^7.8.3",
+ "@babel/plugin-syntax-optional-chaining": "^7.8.3",
+ "@babel/plugin-syntax-private-property-in-object": "^7.14.5",
+ "@babel/plugin-syntax-top-level-await": "^7.14.5",
+ "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6",
+ "@babel/plugin-transform-arrow-functions": "^7.23.3",
+ "@babel/plugin-transform-async-generator-functions": "^7.23.9",
+ "@babel/plugin-transform-async-to-generator": "^7.23.3",
+ "@babel/plugin-transform-block-scoped-functions": "^7.23.3",
+ "@babel/plugin-transform-block-scoping": "^7.23.4",
+ "@babel/plugin-transform-class-properties": "^7.23.3",
+ "@babel/plugin-transform-class-static-block": "^7.23.4",
+ "@babel/plugin-transform-classes": "^7.23.8",
+ "@babel/plugin-transform-computed-properties": "^7.23.3",
+ "@babel/plugin-transform-destructuring": "^7.23.3",
+ "@babel/plugin-transform-dotall-regex": "^7.23.3",
+ "@babel/plugin-transform-duplicate-keys": "^7.23.3",
+ "@babel/plugin-transform-dynamic-import": "^7.23.4",
+ "@babel/plugin-transform-exponentiation-operator": "^7.23.3",
+ "@babel/plugin-transform-export-namespace-from": "^7.23.4",
+ "@babel/plugin-transform-for-of": "^7.23.6",
+ "@babel/plugin-transform-function-name": "^7.23.3",
+ "@babel/plugin-transform-json-strings": "^7.23.4",
+ "@babel/plugin-transform-literals": "^7.23.3",
+ "@babel/plugin-transform-logical-assignment-operators": "^7.23.4",
+ "@babel/plugin-transform-member-expression-literals": "^7.23.3",
+ "@babel/plugin-transform-modules-amd": "^7.23.3",
+ "@babel/plugin-transform-modules-commonjs": "^7.23.3",
+ "@babel/plugin-transform-modules-systemjs": "^7.23.9",
+ "@babel/plugin-transform-modules-umd": "^7.23.3",
+ "@babel/plugin-transform-named-capturing-groups-regex": "^7.22.5",
+ "@babel/plugin-transform-new-target": "^7.23.3",
+ "@babel/plugin-transform-nullish-coalescing-operator": "^7.23.4",
+ "@babel/plugin-transform-numeric-separator": "^7.23.4",
+ "@babel/plugin-transform-object-rest-spread": "^7.23.4",
+ "@babel/plugin-transform-object-super": "^7.23.3",
+ "@babel/plugin-transform-optional-catch-binding": "^7.23.4",
+ "@babel/plugin-transform-optional-chaining": "^7.23.4",
+ "@babel/plugin-transform-parameters": "^7.23.3",
+ "@babel/plugin-transform-private-methods": "^7.23.3",
+ "@babel/plugin-transform-private-property-in-object": "^7.23.4",
+ "@babel/plugin-transform-property-literals": "^7.23.3",
+ "@babel/plugin-transform-regenerator": "^7.23.3",
+ "@babel/plugin-transform-reserved-words": "^7.23.3",
+ "@babel/plugin-transform-shorthand-properties": "^7.23.3",
+ "@babel/plugin-transform-spread": "^7.23.3",
+ "@babel/plugin-transform-sticky-regex": "^7.23.3",
+ "@babel/plugin-transform-template-literals": "^7.23.3",
+ "@babel/plugin-transform-typeof-symbol": "^7.23.3",
+ "@babel/plugin-transform-unicode-escapes": "^7.23.3",
+ "@babel/plugin-transform-unicode-property-regex": "^7.23.3",
+ "@babel/plugin-transform-unicode-regex": "^7.23.3",
+ "@babel/plugin-transform-unicode-sets-regex": "^7.23.3",
+ "@babel/preset-modules": "0.1.6-no-external-plugins",
+ "babel-plugin-polyfill-corejs2": "^0.4.8",
+ "babel-plugin-polyfill-corejs3": "^0.9.0",
+ "babel-plugin-polyfill-regenerator": "^0.5.5",
+ "core-js-compat": "^3.31.0",
+ "semver": "^6.3.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/preset-modules": {
+ "version": "0.1.6-no-external-plugins",
+ "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz",
+ "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.0.0",
+ "@babel/types": "^7.4.4",
+ "esutils": "^2.0.2"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0"
+ }
+ },
+ "node_modules/@babel/regjsgen": {
+ "version": "0.8.0",
+ "resolved": "https://registry.npmjs.org/@babel/regjsgen/-/regjsgen-0.8.0.tgz",
+ "integrity": "sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA=="
+ },
"node_modules/@babel/runtime": {
"version": "7.23.9",
"license": "MIT",
@@ -69,6 +1743,60 @@
"node": ">=6.9.0"
}
},
+ "node_modules/@babel/template": {
+ "version": "7.23.9",
+ "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.23.9.tgz",
+ "integrity": "sha512-+xrD2BWLpvHKNmX2QbpdpsBaWnRxahMwJjO+KZk2JOElj5nSmKezyS1B4u+QbHMTX69t4ukm6hh9lsYQ7GHCKA==",
+ "dependencies": {
+ "@babel/code-frame": "^7.23.5",
+ "@babel/parser": "^7.23.9",
+ "@babel/types": "^7.23.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/traverse": {
+ "version": "7.23.9",
+ "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.9.tgz",
+ "integrity": "sha512-I/4UJ9vs90OkBtY6iiiTORVMyIhJ4kAVmsKo9KFc8UOxMeUfi2hvtIBsET5u9GizXE6/GFSuKCTNfgCswuEjRg==",
+ "dependencies": {
+ "@babel/code-frame": "^7.23.5",
+ "@babel/generator": "^7.23.6",
+ "@babel/helper-environment-visitor": "^7.22.20",
+ "@babel/helper-function-name": "^7.23.0",
+ "@babel/helper-hoist-variables": "^7.22.5",
+ "@babel/helper-split-export-declaration": "^7.22.6",
+ "@babel/parser": "^7.23.9",
+ "@babel/types": "^7.23.9",
+ "debug": "^4.3.1",
+ "globals": "^11.1.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/traverse/node_modules/globals": {
+ "version": "11.12.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz",
+ "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/@babel/types": {
+ "version": "7.23.9",
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.9.tgz",
+ "integrity": "sha512-dQjSq/7HaSjRM43FFGnv5keM2HsxpmyV1PfaSVm0nzzjwwTmjOe6J4bC8e3+pTEIgHaHj+1ZlLThRJ2auc/w1Q==",
+ "dependencies": {
+ "@babel/helper-string-parser": "^7.23.4",
+ "@babel/helper-validator-identifier": "^7.22.20",
+ "to-fast-properties": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
"node_modules/@eslint-community/eslint-utils": {
"version": "4.4.0",
"dev": true,
@@ -151,6 +1879,14 @@
"version": "0.2.1",
"license": "MIT"
},
+ "node_modules/@hookform/resolvers": {
+ "version": "3.4.0",
+ "resolved": "https://registry.npmjs.org/@hookform/resolvers/-/resolvers-3.4.0.tgz",
+ "integrity": "sha512-+oAqK3okmoEDnvUkJ3N/mvNMeeMv5Apgy1jkoRmlaaAF4vBgcJs9tHvtXU7VE4DvPosvAUUkPOaNFunzt1dbgA==",
+ "peerDependencies": {
+ "react-hook-form": "^7.0.0"
+ }
+ },
"node_modules/@humanwhocodes/config-array": {
"version": "0.11.14",
"dev": true,
@@ -325,6 +2061,15 @@
"node": ">=6.0.0"
}
},
+ "node_modules/@jridgewell/source-map": {
+ "version": "0.3.5",
+ "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.5.tgz",
+ "integrity": "sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==",
+ "dependencies": {
+ "@jridgewell/gen-mapping": "^0.3.0",
+ "@jridgewell/trace-mapping": "^0.3.9"
+ }
+ },
"node_modules/@jridgewell/sourcemap-codec": {
"version": "1.4.15",
"license": "MIT"
@@ -484,8 +2229,9 @@
}
},
"node_modules/@noble/ciphers": {
- "version": "0.2.0",
- "license": "MIT",
+ "version": "0.5.2",
+ "resolved": "https://registry.npmjs.org/@noble/ciphers/-/ciphers-0.5.2.tgz",
+ "integrity": "sha512-GADtQmZCdgbnNp+daPLc3OY3ibEtGGDV/+CzeM3MFnhiQ7ELQKlsHWYq0YbYUXx4jU3/Y1erAxU6r+hwpewqmQ==",
"funding": {
"url": "https://paulmillr.com/funding/"
}
@@ -547,6 +2293,14 @@
"node": ">=14"
}
},
+ "node_modules/@radix-ui/number": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/@radix-ui/number/-/number-1.0.1.tgz",
+ "integrity": "sha512-T5gIdVO2mmPW3NNhjNgEP3cqMXjXL9UbO0BzWcXfvdBs+BohbQxvd/K5hSVKmn9/lbTdsQVKbUcP5WLCwvUbBg==",
+ "dependencies": {
+ "@babel/runtime": "^7.13.10"
+ }
+ },
"node_modules/@radix-ui/primitive": {
"version": "1.0.1",
"license": "MIT",
@@ -554,6 +2308,37 @@
"@babel/runtime": "^7.13.10"
}
},
+ "node_modules/@radix-ui/react-accordion": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-accordion/-/react-accordion-1.1.2.tgz",
+ "integrity": "sha512-fDG7jcoNKVjSK6yfmuAs0EnPDro0WMXIhMtXdTBWqEioVW206ku+4Lw07e+13lUkFkpoEQ2PdeMIAGpdqEAmDg==",
+ "dependencies": {
+ "@babel/runtime": "^7.13.10",
+ "@radix-ui/primitive": "1.0.1",
+ "@radix-ui/react-collapsible": "1.0.3",
+ "@radix-ui/react-collection": "1.0.3",
+ "@radix-ui/react-compose-refs": "1.0.1",
+ "@radix-ui/react-context": "1.0.1",
+ "@radix-ui/react-direction": "1.0.1",
+ "@radix-ui/react-id": "1.0.1",
+ "@radix-ui/react-primitive": "1.0.3",
+ "@radix-ui/react-use-controllable-state": "1.0.1"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "@types/react-dom": "*",
+ "react": "^16.8 || ^17.0 || ^18.0",
+ "react-dom": "^16.8 || ^17.0 || ^18.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "@types/react-dom": {
+ "optional": true
+ }
+ }
+ },
"node_modules/@radix-ui/react-arrow": {
"version": "1.0.3",
"license": "MIT",
@@ -601,6 +2386,36 @@
}
}
},
+ "node_modules/@radix-ui/react-collapsible": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-collapsible/-/react-collapsible-1.0.3.tgz",
+ "integrity": "sha512-UBmVDkmR6IvDsloHVN+3rtx4Mi5TFvylYXpluuv0f37dtaz3H99bp8No0LGXRigVpl3UAT4l9j6bIchh42S/Gg==",
+ "dependencies": {
+ "@babel/runtime": "^7.13.10",
+ "@radix-ui/primitive": "1.0.1",
+ "@radix-ui/react-compose-refs": "1.0.1",
+ "@radix-ui/react-context": "1.0.1",
+ "@radix-ui/react-id": "1.0.1",
+ "@radix-ui/react-presence": "1.0.1",
+ "@radix-ui/react-primitive": "1.0.3",
+ "@radix-ui/react-use-controllable-state": "1.0.1",
+ "@radix-ui/react-use-layout-effect": "1.0.1"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "@types/react-dom": "*",
+ "react": "^16.8 || ^17.0 || ^18.0",
+ "react-dom": "^16.8 || ^17.0 || ^18.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "@types/react-dom": {
+ "optional": true
+ }
+ }
+ },
"node_modules/@radix-ui/react-collection": {
"version": "1.0.3",
"license": "MIT",
@@ -829,6 +2644,29 @@
}
}
},
+ "node_modules/@radix-ui/react-label": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-label/-/react-label-2.0.2.tgz",
+ "integrity": "sha512-N5ehvlM7qoTLx7nWPodsPYPgMzA5WM8zZChQg8nyFJKnDO5WHdba1vv5/H6IO5LtJMfD2Q3wh1qHFGNtK0w3bQ==",
+ "dependencies": {
+ "@babel/runtime": "^7.13.10",
+ "@radix-ui/react-primitive": "1.0.3"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "@types/react-dom": "*",
+ "react": "^16.8 || ^17.0 || ^18.0",
+ "react-dom": "^16.8 || ^17.0 || ^18.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "@types/react-dom": {
+ "optional": true
+ }
+ }
+ },
"node_modules/@radix-ui/react-menu": {
"version": "2.0.6",
"resolved": "https://registry.npmjs.org/@radix-ui/react-menu/-/react-menu-2.0.6.tgz",
@@ -1033,6 +2871,37 @@
}
}
},
+ "node_modules/@radix-ui/react-scroll-area": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-scroll-area/-/react-scroll-area-1.0.5.tgz",
+ "integrity": "sha512-b6PAgH4GQf9QEn8zbT2XUHpW5z8BzqEc7Kl11TwDrvuTrxlkcjTD5qa/bxgKr+nmuXKu4L/W5UZ4mlP/VG/5Gw==",
+ "dependencies": {
+ "@babel/runtime": "^7.13.10",
+ "@radix-ui/number": "1.0.1",
+ "@radix-ui/primitive": "1.0.1",
+ "@radix-ui/react-compose-refs": "1.0.1",
+ "@radix-ui/react-context": "1.0.1",
+ "@radix-ui/react-direction": "1.0.1",
+ "@radix-ui/react-presence": "1.0.1",
+ "@radix-ui/react-primitive": "1.0.3",
+ "@radix-ui/react-use-callback-ref": "1.0.1",
+ "@radix-ui/react-use-layout-effect": "1.0.1"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "@types/react-dom": "*",
+ "react": "^16.8 || ^17.0 || ^18.0",
+ "react-dom": "^16.8 || ^17.0 || ^18.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "@types/react-dom": {
+ "optional": true
+ }
+ }
+ },
"node_modules/@radix-ui/react-slot": {
"version": "1.0.2",
"license": "MIT",
@@ -1080,6 +2949,40 @@
}
}
},
+ "node_modules/@radix-ui/react-toast": {
+ "version": "1.1.5",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-toast/-/react-toast-1.1.5.tgz",
+ "integrity": "sha512-fRLn227WHIBRSzuRzGJ8W+5YALxofH23y0MlPLddaIpLpCDqdE0NZlS2NRQDRiptfxDeeCjgFIpexB1/zkxDlw==",
+ "dependencies": {
+ "@babel/runtime": "^7.13.10",
+ "@radix-ui/primitive": "1.0.1",
+ "@radix-ui/react-collection": "1.0.3",
+ "@radix-ui/react-compose-refs": "1.0.1",
+ "@radix-ui/react-context": "1.0.1",
+ "@radix-ui/react-dismissable-layer": "1.0.5",
+ "@radix-ui/react-portal": "1.0.4",
+ "@radix-ui/react-presence": "1.0.1",
+ "@radix-ui/react-primitive": "1.0.3",
+ "@radix-ui/react-use-callback-ref": "1.0.1",
+ "@radix-ui/react-use-controllable-state": "1.0.1",
+ "@radix-ui/react-use-layout-effect": "1.0.1",
+ "@radix-ui/react-visually-hidden": "1.0.3"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "@types/react-dom": "*",
+ "react": "^16.8 || ^17.0 || ^18.0",
+ "react-dom": "^16.8 || ^17.0 || ^18.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "@types/react-dom": {
+ "optional": true
+ }
+ }
+ },
"node_modules/@radix-ui/react-tooltip": {
"version": "1.0.7",
"license": "MIT",
@@ -1258,6 +3161,80 @@
"@babel/runtime": "^7.13.10"
}
},
+ "node_modules/@rollup/plugin-babel": {
+ "version": "5.3.1",
+ "resolved": "https://registry.npmjs.org/@rollup/plugin-babel/-/plugin-babel-5.3.1.tgz",
+ "integrity": "sha512-WFfdLWU/xVWKeRQnKmIAQULUI7Il0gZnBIH/ZFO069wYIfPu+8zrfp/KMW0atmELoRDq8FbiP3VCss9MhCut7Q==",
+ "dependencies": {
+ "@babel/helper-module-imports": "^7.10.4",
+ "@rollup/pluginutils": "^3.1.0"
+ },
+ "engines": {
+ "node": ">= 10.0.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0",
+ "@types/babel__core": "^7.1.9",
+ "rollup": "^1.20.0||^2.0.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/babel__core": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@rollup/plugin-node-resolve": {
+ "version": "11.2.1",
+ "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-11.2.1.tgz",
+ "integrity": "sha512-yc2n43jcqVyGE2sqV5/YCmocy9ArjVAP/BeXyTtADTBBX6V0e5UMqwO8CdQ0kzjb6zu5P1qMzsScCMRvE9OlVg==",
+ "dependencies": {
+ "@rollup/pluginutils": "^3.1.0",
+ "@types/resolve": "1.17.1",
+ "builtin-modules": "^3.1.0",
+ "deepmerge": "^4.2.2",
+ "is-module": "^1.0.0",
+ "resolve": "^1.19.0"
+ },
+ "engines": {
+ "node": ">= 10.0.0"
+ },
+ "peerDependencies": {
+ "rollup": "^1.20.0||^2.0.0"
+ }
+ },
+ "node_modules/@rollup/plugin-replace": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/@rollup/plugin-replace/-/plugin-replace-2.4.2.tgz",
+ "integrity": "sha512-IGcu+cydlUMZ5En85jxHH4qj2hta/11BHq95iHEyb2sbgiN0eCdzvUcHw5gt9pBL5lTi4JDYJ1acCoMGpTvEZg==",
+ "dependencies": {
+ "@rollup/pluginutils": "^3.1.0",
+ "magic-string": "^0.25.7"
+ },
+ "peerDependencies": {
+ "rollup": "^1.20.0 || ^2.0.0"
+ }
+ },
+ "node_modules/@rollup/pluginutils": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-3.1.0.tgz",
+ "integrity": "sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==",
+ "dependencies": {
+ "@types/estree": "0.0.39",
+ "estree-walker": "^1.0.1",
+ "picomatch": "^2.2.2"
+ },
+ "engines": {
+ "node": ">= 8.0.0"
+ },
+ "peerDependencies": {
+ "rollup": "^1.20.0||^2.0.0"
+ }
+ },
+ "node_modules/@rollup/pluginutils/node_modules/@types/estree": {
+ "version": "0.0.39",
+ "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz",
+ "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw=="
+ },
"node_modules/@rushstack/eslint-patch": {
"version": "1.7.2",
"dev": true,
@@ -1296,6 +3273,28 @@
"url": "https://paulmillr.com/funding/"
}
},
+ "node_modules/@surma/rollup-plugin-off-main-thread": {
+ "version": "2.2.3",
+ "resolved": "https://registry.npmjs.org/@surma/rollup-plugin-off-main-thread/-/rollup-plugin-off-main-thread-2.2.3.tgz",
+ "integrity": "sha512-lR8q/9W7hZpMWweNiAKU7NQerBnzQQLvi8qnTDU/fxItPhtZVMbPV3lbCwjhIlNBe9Bbr5V+KHshvWmVSG9cxQ==",
+ "dependencies": {
+ "ejs": "^3.1.6",
+ "json5": "^2.2.0",
+ "magic-string": "^0.25.0",
+ "string.prototype.matchall": "^4.0.6"
+ }
+ },
+ "node_modules/@surma/rollup-plugin-off-main-thread/node_modules/json5": {
+ "version": "2.2.3",
+ "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz",
+ "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==",
+ "bin": {
+ "json5": "lib/cli.js"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
"node_modules/@swc/helpers": {
"version": "0.5.2",
"license": "Apache-2.0",
@@ -1303,14 +3302,66 @@
"tslib": "^2.4.0"
}
},
+ "node_modules/@types/bn.js": {
+ "version": "4.11.6",
+ "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-4.11.6.tgz",
+ "integrity": "sha512-pqr857jrp2kPuO9uRjZ3PwnJTjoQy+fcdxvBTvHm6dkmEL9q+hDD/2j/0ELOBPtPnS8LjCX0gI9nbl8lVkadpg==",
+ "dependencies": {
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@types/eslint": {
+ "version": "8.56.2",
+ "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.56.2.tgz",
+ "integrity": "sha512-uQDwm1wFHmbBbCZCqAlq6Do9LYwByNZHWzXppSnay9SuwJ+VRbjkbLABer54kcPnMSlG6Fdiy2yaFXm/z9Z5gw==",
+ "peer": true,
+ "dependencies": {
+ "@types/estree": "*",
+ "@types/json-schema": "*"
+ }
+ },
+ "node_modules/@types/eslint-scope": {
+ "version": "3.7.7",
+ "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz",
+ "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==",
+ "peer": true,
+ "dependencies": {
+ "@types/eslint": "*",
+ "@types/estree": "*"
+ }
+ },
+ "node_modules/@types/estree": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz",
+ "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==",
+ "peer": true
+ },
+ "node_modules/@types/glob": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.2.0.tgz",
+ "integrity": "sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==",
+ "dependencies": {
+ "@types/minimatch": "*",
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@types/json-schema": {
+ "version": "7.0.15",
+ "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz",
+ "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA=="
+ },
"node_modules/@types/json5": {
"version": "0.0.29",
"dev": true,
"license": "MIT"
},
+ "node_modules/@types/minimatch": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-5.1.2.tgz",
+ "integrity": "sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA=="
+ },
"node_modules/@types/node": {
"version": "20.11.8",
- "dev": true,
"license": "MIT",
"dependencies": {
"undici-types": "~5.26.4"
@@ -1339,11 +3390,24 @@
"@types/react": "*"
}
},
+ "node_modules/@types/resolve": {
+ "version": "1.17.1",
+ "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.17.1.tgz",
+ "integrity": "sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw==",
+ "dependencies": {
+ "@types/node": "*"
+ }
+ },
"node_modules/@types/scheduler": {
"version": "0.16.8",
"devOptional": true,
"license": "MIT"
},
+ "node_modules/@types/trusted-types": {
+ "version": "2.0.7",
+ "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz",
+ "integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw=="
+ },
"node_modules/@typescript-eslint/parser": {
"version": "6.19.1",
"dev": true,
@@ -1494,9 +3558,166 @@
"dev": true,
"license": "ISC"
},
+ "node_modules/@webassemblyjs/ast": {
+ "version": "1.11.6",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.6.tgz",
+ "integrity": "sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==",
+ "peer": true,
+ "dependencies": {
+ "@webassemblyjs/helper-numbers": "1.11.6",
+ "@webassemblyjs/helper-wasm-bytecode": "1.11.6"
+ }
+ },
+ "node_modules/@webassemblyjs/floating-point-hex-parser": {
+ "version": "1.11.6",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz",
+ "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==",
+ "peer": true
+ },
+ "node_modules/@webassemblyjs/helper-api-error": {
+ "version": "1.11.6",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz",
+ "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==",
+ "peer": true
+ },
+ "node_modules/@webassemblyjs/helper-buffer": {
+ "version": "1.11.6",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.6.tgz",
+ "integrity": "sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA==",
+ "peer": true
+ },
+ "node_modules/@webassemblyjs/helper-numbers": {
+ "version": "1.11.6",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz",
+ "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==",
+ "peer": true,
+ "dependencies": {
+ "@webassemblyjs/floating-point-hex-parser": "1.11.6",
+ "@webassemblyjs/helper-api-error": "1.11.6",
+ "@xtuc/long": "4.2.2"
+ }
+ },
+ "node_modules/@webassemblyjs/helper-wasm-bytecode": {
+ "version": "1.11.6",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz",
+ "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==",
+ "peer": true
+ },
+ "node_modules/@webassemblyjs/helper-wasm-section": {
+ "version": "1.11.6",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.6.tgz",
+ "integrity": "sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g==",
+ "peer": true,
+ "dependencies": {
+ "@webassemblyjs/ast": "1.11.6",
+ "@webassemblyjs/helper-buffer": "1.11.6",
+ "@webassemblyjs/helper-wasm-bytecode": "1.11.6",
+ "@webassemblyjs/wasm-gen": "1.11.6"
+ }
+ },
+ "node_modules/@webassemblyjs/ieee754": {
+ "version": "1.11.6",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz",
+ "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==",
+ "peer": true,
+ "dependencies": {
+ "@xtuc/ieee754": "^1.2.0"
+ }
+ },
+ "node_modules/@webassemblyjs/leb128": {
+ "version": "1.11.6",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz",
+ "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==",
+ "peer": true,
+ "dependencies": {
+ "@xtuc/long": "4.2.2"
+ }
+ },
+ "node_modules/@webassemblyjs/utf8": {
+ "version": "1.11.6",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz",
+ "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==",
+ "peer": true
+ },
+ "node_modules/@webassemblyjs/wasm-edit": {
+ "version": "1.11.6",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.6.tgz",
+ "integrity": "sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw==",
+ "peer": true,
+ "dependencies": {
+ "@webassemblyjs/ast": "1.11.6",
+ "@webassemblyjs/helper-buffer": "1.11.6",
+ "@webassemblyjs/helper-wasm-bytecode": "1.11.6",
+ "@webassemblyjs/helper-wasm-section": "1.11.6",
+ "@webassemblyjs/wasm-gen": "1.11.6",
+ "@webassemblyjs/wasm-opt": "1.11.6",
+ "@webassemblyjs/wasm-parser": "1.11.6",
+ "@webassemblyjs/wast-printer": "1.11.6"
+ }
+ },
+ "node_modules/@webassemblyjs/wasm-gen": {
+ "version": "1.11.6",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.6.tgz",
+ "integrity": "sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA==",
+ "peer": true,
+ "dependencies": {
+ "@webassemblyjs/ast": "1.11.6",
+ "@webassemblyjs/helper-wasm-bytecode": "1.11.6",
+ "@webassemblyjs/ieee754": "1.11.6",
+ "@webassemblyjs/leb128": "1.11.6",
+ "@webassemblyjs/utf8": "1.11.6"
+ }
+ },
+ "node_modules/@webassemblyjs/wasm-opt": {
+ "version": "1.11.6",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.6.tgz",
+ "integrity": "sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g==",
+ "peer": true,
+ "dependencies": {
+ "@webassemblyjs/ast": "1.11.6",
+ "@webassemblyjs/helper-buffer": "1.11.6",
+ "@webassemblyjs/wasm-gen": "1.11.6",
+ "@webassemblyjs/wasm-parser": "1.11.6"
+ }
+ },
+ "node_modules/@webassemblyjs/wasm-parser": {
+ "version": "1.11.6",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.6.tgz",
+ "integrity": "sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ==",
+ "peer": true,
+ "dependencies": {
+ "@webassemblyjs/ast": "1.11.6",
+ "@webassemblyjs/helper-api-error": "1.11.6",
+ "@webassemblyjs/helper-wasm-bytecode": "1.11.6",
+ "@webassemblyjs/ieee754": "1.11.6",
+ "@webassemblyjs/leb128": "1.11.6",
+ "@webassemblyjs/utf8": "1.11.6"
+ }
+ },
+ "node_modules/@webassemblyjs/wast-printer": {
+ "version": "1.11.6",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.6.tgz",
+ "integrity": "sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A==",
+ "peer": true,
+ "dependencies": {
+ "@webassemblyjs/ast": "1.11.6",
+ "@xtuc/long": "4.2.2"
+ }
+ },
+ "node_modules/@xtuc/ieee754": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz",
+ "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==",
+ "peer": true
+ },
+ "node_modules/@xtuc/long": {
+ "version": "4.2.2",
+ "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz",
+ "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==",
+ "peer": true
+ },
"node_modules/acorn": {
"version": "8.11.3",
- "dev": true,
"license": "MIT",
"bin": {
"acorn": "bin/acorn"
@@ -1505,6 +3726,15 @@
"node": ">=0.4.0"
}
},
+ "node_modules/acorn-import-assertions": {
+ "version": "1.9.0",
+ "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz",
+ "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==",
+ "peer": true,
+ "peerDependencies": {
+ "acorn": "^8"
+ }
+ },
"node_modules/acorn-jsx": {
"version": "5.3.2",
"dev": true,
@@ -1515,7 +3745,6 @@
},
"node_modules/ajv": {
"version": "6.12.6",
- "dev": true,
"license": "MIT",
"dependencies": {
"fast-deep-equal": "^3.1.1",
@@ -1528,6 +3757,14 @@
"url": "https://github.com/sponsors/epoberezkin"
}
},
+ "node_modules/ajv-keywords": {
+ "version": "3.5.2",
+ "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz",
+ "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==",
+ "peerDependencies": {
+ "ajv": "^6.9.1"
+ }
+ },
"node_modules/ansi-regex": {
"version": "5.0.1",
"license": "MIT",
@@ -1592,7 +3829,6 @@
},
"node_modules/array-buffer-byte-length": {
"version": "1.0.0",
- "dev": true,
"license": "MIT",
"dependencies": {
"call-bind": "^1.0.2",
@@ -1622,12 +3858,19 @@
},
"node_modules/array-union": {
"version": "2.1.0",
- "dev": true,
"license": "MIT",
"engines": {
"node": ">=8"
}
},
+ "node_modules/array-uniq": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz",
+ "integrity": "sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q==",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
"node_modules/array.prototype.findlastindex": {
"version": "1.2.3",
"dev": true,
@@ -1694,7 +3937,6 @@
},
"node_modules/arraybuffer.prototype.slice": {
"version": "1.0.2",
- "dev": true,
"license": "MIT",
"dependencies": {
"array-buffer-byte-length": "^1.0.0",
@@ -1717,6 +3959,11 @@
"dev": true,
"license": "MIT"
},
+ "node_modules/async": {
+ "version": "3.2.5",
+ "resolved": "https://registry.npmjs.org/async/-/async-3.2.5.tgz",
+ "integrity": "sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg=="
+ },
"node_modules/asynciterator.prototype": {
"version": "1.0.0",
"dev": true,
@@ -1725,6 +3972,14 @@
"has-symbols": "^1.0.3"
}
},
+ "node_modules/at-least-node": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz",
+ "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==",
+ "engines": {
+ "node": ">= 4.0.0"
+ }
+ },
"node_modules/autoprefixer": {
"version": "10.4.17",
"dev": true,
@@ -1763,7 +4018,6 @@
},
"node_modules/available-typed-arrays": {
"version": "1.0.5",
- "dev": true,
"license": "MIT",
"engines": {
"node": ">= 0.4"
@@ -1788,10 +4042,82 @@
"dequal": "^2.0.3"
}
},
+ "node_modules/babel-loader": {
+ "version": "8.3.0",
+ "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.3.0.tgz",
+ "integrity": "sha512-H8SvsMF+m9t15HNLMipppzkC+Y2Yq+v3SonZyU70RBL/h1gxPkH08Ot8pEE9Z4Kd+czyWJClmFS8qzIP9OZ04Q==",
+ "dependencies": {
+ "find-cache-dir": "^3.3.1",
+ "loader-utils": "^2.0.0",
+ "make-dir": "^3.1.0",
+ "schema-utils": "^2.6.5"
+ },
+ "engines": {
+ "node": ">= 8.9"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0",
+ "webpack": ">=2"
+ }
+ },
+ "node_modules/babel-plugin-polyfill-corejs2": {
+ "version": "0.4.8",
+ "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.8.tgz",
+ "integrity": "sha512-OtIuQfafSzpo/LhnJaykc0R/MMnuLSSVjVYy9mHArIZ9qTCSZ6TpWCuEKZYVoN//t8HqBNScHrOtCrIK5IaGLg==",
+ "dependencies": {
+ "@babel/compat-data": "^7.22.6",
+ "@babel/helper-define-polyfill-provider": "^0.5.0",
+ "semver": "^6.3.1"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0"
+ }
+ },
+ "node_modules/babel-plugin-polyfill-corejs3": {
+ "version": "0.9.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.9.0.tgz",
+ "integrity": "sha512-7nZPG1uzK2Ymhy/NbaOWTg3uibM2BmGASS4vHS4szRZAIR8R6GwA/xAujpdrXU5iyklrimWnLWU+BLF9suPTqg==",
+ "dependencies": {
+ "@babel/helper-define-polyfill-provider": "^0.5.0",
+ "core-js-compat": "^3.34.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0"
+ }
+ },
+ "node_modules/babel-plugin-polyfill-regenerator": {
+ "version": "0.5.5",
+ "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.5.tgz",
+ "integrity": "sha512-OJGYZlhLqBh2DDHeqAxWB1XIvr49CxiJ2gIt61/PU55CQK4Z58OzMqjDe1zwQdQk+rBYsRc+1rJmdajM3gimHg==",
+ "dependencies": {
+ "@babel/helper-define-polyfill-provider": "^0.5.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0"
+ }
+ },
"node_modules/balanced-match": {
"version": "1.0.2",
"license": "MIT"
},
+ "node_modules/base-x": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/base-x/-/base-x-4.0.0.tgz",
+ "integrity": "sha512-FuwxlW4H5kh37X/oW59pwTzzTKRzfrrQwhmyspRM7swOEZcHtDZSCt45U6oKgtuFE+WYPblePMVIPR4RZrh/hw=="
+ },
+ "node_modules/bech32": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/bech32/-/bech32-1.1.4.tgz",
+ "integrity": "sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ=="
+ },
+ "node_modules/big.js": {
+ "version": "5.2.2",
+ "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz",
+ "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==",
+ "engines": {
+ "node": "*"
+ }
+ },
"node_modules/binary-extensions": {
"version": "2.2.0",
"license": "MIT",
@@ -1799,9 +4125,57 @@
"node": ">=8"
}
},
+ "node_modules/bip174": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/bip174/-/bip174-2.1.1.tgz",
+ "integrity": "sha512-mdFV5+/v0XyNYXjBS6CQPLo9ekCx4gtKZFnJm5PMto7Fs9hTTDpkkzOB7/FtluRI6JbUUAu+snTYfJRgHLZbZQ==",
+ "engines": {
+ "node": ">=8.0.0"
+ }
+ },
+ "node_modules/bitcoinjs-lib": {
+ "version": "6.1.5",
+ "resolved": "https://registry.npmjs.org/bitcoinjs-lib/-/bitcoinjs-lib-6.1.5.tgz",
+ "integrity": "sha512-yuf6xs9QX/E8LWE2aMJPNd0IxGofwfuVOiYdNUESkc+2bHHVKjhJd8qewqapeoolh9fihzHGoDCB5Vkr57RZCQ==",
+ "dependencies": {
+ "@noble/hashes": "^1.2.0",
+ "bech32": "^2.0.0",
+ "bip174": "^2.1.1",
+ "bs58check": "^3.0.1",
+ "typeforce": "^1.11.3",
+ "varuint-bitcoin": "^1.1.2"
+ },
+ "engines": {
+ "node": ">=8.0.0"
+ }
+ },
+ "node_modules/bitcoinjs-lib/node_modules/bech32": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/bech32/-/bech32-2.0.0.tgz",
+ "integrity": "sha512-LcknSilhIGatDAsY1ak2I8VtGaHNhgMSYVxFrGLXv+xLHytaKZKcaUJJUE7qmBr7h33o5YQwP55pMI0xmkpJwg=="
+ },
+ "node_modules/bn.js": {
+ "version": "4.12.0",
+ "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz",
+ "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA=="
+ },
+ "node_modules/bolt11": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/bolt11/-/bolt11-1.4.1.tgz",
+ "integrity": "sha512-jR0Y+MO+CK2at1Cg5mltLJ+6tdOwNKoTS/DJOBDdzVkQ+R9D6UgZMayTWOsuzY7OgV1gEqlyT5Tzk6t6r4XcNQ==",
+ "dependencies": {
+ "@types/bn.js": "^4.11.3",
+ "bech32": "^1.1.2",
+ "bitcoinjs-lib": "^6.0.0",
+ "bn.js": "^4.11.8",
+ "create-hash": "^1.2.0",
+ "lodash": "^4.17.11",
+ "safe-buffer": "^5.1.1",
+ "secp256k1": "^4.0.2"
+ }
+ },
"node_modules/brace-expansion": {
"version": "1.1.11",
- "dev": true,
"license": "MIT",
"dependencies": {
"balanced-match": "^1.0.0",
@@ -1818,9 +4192,13 @@
"node": ">=8"
}
},
+ "node_modules/brorand": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz",
+ "integrity": "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w=="
+ },
"node_modules/browserslist": {
"version": "4.22.3",
- "dev": true,
"funding": [
{
"type": "opencollective",
@@ -1849,6 +4227,39 @@
"node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
}
},
+ "node_modules/bs58": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/bs58/-/bs58-5.0.0.tgz",
+ "integrity": "sha512-r+ihvQJvahgYT50JD05dyJNKlmmSlMoOGwn1lCcEzanPglg7TxYjioQUYehQ9mAR/+hOSd2jRc/Z2y5UxBymvQ==",
+ "dependencies": {
+ "base-x": "^4.0.0"
+ }
+ },
+ "node_modules/bs58check": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/bs58check/-/bs58check-3.0.1.tgz",
+ "integrity": "sha512-hjuuJvoWEybo7Hn/0xOrczQKKEKD63WguEjlhLExYs2wUBcebDC1jDNK17eEAD2lYfw82d5ASC1d7K3SWszjaQ==",
+ "dependencies": {
+ "@noble/hashes": "^1.2.0",
+ "bs58": "^5.0.0"
+ }
+ },
+ "node_modules/buffer-from": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz",
+ "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ=="
+ },
+ "node_modules/builtin-modules": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz",
+ "integrity": "sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==",
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
"node_modules/busboy": {
"version": "1.6.0",
"dependencies": {
@@ -1860,7 +4271,6 @@
},
"node_modules/call-bind": {
"version": "1.0.5",
- "dev": true,
"license": "MIT",
"dependencies": {
"function-bind": "^1.1.2",
@@ -1906,7 +4316,6 @@
},
"node_modules/chalk": {
"version": "4.1.2",
- "dev": true,
"license": "MIT",
"dependencies": {
"ansi-styles": "^4.1.0",
@@ -1954,6 +4363,24 @@
"node": ">= 6"
}
},
+ "node_modules/chrome-trace-event": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz",
+ "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==",
+ "peer": true,
+ "engines": {
+ "node": ">=6.0"
+ }
+ },
+ "node_modules/cipher-base": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz",
+ "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==",
+ "dependencies": {
+ "inherits": "^2.0.1",
+ "safe-buffer": "^5.0.1"
+ }
+ },
"node_modules/class-variance-authority": {
"version": "0.7.0",
"license": "Apache-2.0",
@@ -1971,6 +4398,20 @@
"node": ">=6"
}
},
+ "node_modules/clean-webpack-plugin": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/clean-webpack-plugin/-/clean-webpack-plugin-4.0.0.tgz",
+ "integrity": "sha512-WuWE1nyTNAyW5T7oNyys2EN0cfP2fdRxhxnIQWiAp0bMabPdHhoGxM8A6YL2GhqwgrPnnaemVE7nv5XJ2Fhh2w==",
+ "dependencies": {
+ "del": "^4.1.1"
+ },
+ "engines": {
+ "node": ">=10.0.0"
+ },
+ "peerDependencies": {
+ "webpack": ">=4.0.0 <6.0.0"
+ }
+ },
"node_modules/client-only": {
"version": "0.0.1",
"license": "MIT"
@@ -2003,11 +4444,52 @@
"node": ">= 6"
}
},
+ "node_modules/common-tags": {
+ "version": "1.8.2",
+ "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.2.tgz",
+ "integrity": "sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==",
+ "engines": {
+ "node": ">=4.0.0"
+ }
+ },
+ "node_modules/commondir": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz",
+ "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg=="
+ },
"node_modules/concat-map": {
"version": "0.0.1",
- "dev": true,
"license": "MIT"
},
+ "node_modules/convert-source-map": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz",
+ "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg=="
+ },
+ "node_modules/core-js-compat": {
+ "version": "3.35.1",
+ "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.35.1.tgz",
+ "integrity": "sha512-sftHa5qUJY3rs9Zht1WEnmkvXputCyDBczPnr7QDgL8n3qrF3CMXY4VPSYtOLLiOUJcah2WNXREd48iOl6mQIw==",
+ "dependencies": {
+ "browserslist": "^4.22.2"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/core-js"
+ }
+ },
+ "node_modules/create-hash": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz",
+ "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==",
+ "dependencies": {
+ "cipher-base": "^1.0.1",
+ "inherits": "^2.0.1",
+ "md5.js": "^1.3.4",
+ "ripemd160": "^2.0.1",
+ "sha.js": "^2.4.0"
+ }
+ },
"node_modules/cross-spawn": {
"version": "7.0.3",
"license": "MIT",
@@ -2020,6 +4502,14 @@
"node": ">= 8"
}
},
+ "node_modules/crypto-random-string": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz",
+ "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==",
+ "engines": {
+ "node": ">=8"
+ }
+ },
"node_modules/cssesc": {
"version": "3.0.0",
"license": "MIT",
@@ -2042,7 +4532,6 @@
},
"node_modules/debug": {
"version": "4.3.4",
- "dev": true,
"license": "MIT",
"dependencies": {
"ms": "2.1.2"
@@ -2061,9 +4550,16 @@
"dev": true,
"license": "MIT"
},
+ "node_modules/deepmerge": {
+ "version": "4.3.1",
+ "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz",
+ "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
"node_modules/define-data-property": {
"version": "1.1.1",
- "dev": true,
"license": "MIT",
"dependencies": {
"get-intrinsic": "^1.2.1",
@@ -2076,7 +4572,6 @@
},
"node_modules/define-properties": {
"version": "1.2.1",
- "dev": true,
"license": "MIT",
"dependencies": {
"define-data-property": "^1.0.1",
@@ -2090,6 +4585,95 @@
"url": "https://github.com/sponsors/ljharb"
}
},
+ "node_modules/del": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/del/-/del-4.1.1.tgz",
+ "integrity": "sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ==",
+ "dependencies": {
+ "@types/glob": "^7.1.1",
+ "globby": "^6.1.0",
+ "is-path-cwd": "^2.0.0",
+ "is-path-in-cwd": "^2.0.0",
+ "p-map": "^2.0.0",
+ "pify": "^4.0.1",
+ "rimraf": "^2.6.3"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/del/node_modules/array-union": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz",
+ "integrity": "sha512-Dxr6QJj/RdU/hCaBjOfxW+q6lyuVE6JFWIrAUpuOOhoJJoQ99cUn3igRaHVB5P9WrgFVN0FfArM3x0cueOU8ng==",
+ "dependencies": {
+ "array-uniq": "^1.0.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/del/node_modules/glob": {
+ "version": "7.2.3",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
+ "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
+ "dependencies": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^3.1.1",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
+ },
+ "engines": {
+ "node": "*"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/del/node_modules/globby": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz",
+ "integrity": "sha512-KVbFv2TQtbzCoxAnfD6JcHZTYCzyliEaaeM/gH8qQdkKr5s0OP9scEgvdcngyk7AVdY6YVW/TJHd+lQ/Df3Daw==",
+ "dependencies": {
+ "array-union": "^1.0.1",
+ "glob": "^7.0.3",
+ "object-assign": "^4.0.1",
+ "pify": "^2.0.0",
+ "pinkie-promise": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/del/node_modules/globby/node_modules/pify": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
+ "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/del/node_modules/pify": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz",
+ "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/del/node_modules/rimraf": {
+ "version": "2.7.1",
+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz",
+ "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==",
+ "dependencies": {
+ "glob": "^7.1.3"
+ },
+ "bin": {
+ "rimraf": "bin.js"
+ }
+ },
"node_modules/dequal": {
"version": "2.0.3",
"dev": true,
@@ -2108,7 +4692,6 @@
},
"node_modules/dir-glob": {
"version": "3.0.1",
- "dev": true,
"license": "MIT",
"dependencies": {
"path-type": "^4.0.0"
@@ -2136,11 +4719,38 @@
"version": "0.2.0",
"license": "MIT"
},
+ "node_modules/ejs": {
+ "version": "3.1.9",
+ "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.9.tgz",
+ "integrity": "sha512-rC+QVNMJWv+MtPgkt0y+0rVEIdbtxVADApW9JXrUVlzHetgcyczP/E7DJmWJ4fJCZF2cPcBk0laWO9ZHMG3DmQ==",
+ "dependencies": {
+ "jake": "^10.8.5"
+ },
+ "bin": {
+ "ejs": "bin/cli.js"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
"node_modules/electron-to-chromium": {
"version": "1.4.648",
- "dev": true,
"license": "ISC"
},
+ "node_modules/elliptic": {
+ "version": "6.5.5",
+ "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.5.tgz",
+ "integrity": "sha512-7EjbcmUm17NQFu4Pmgmq2olYMj8nwMnpcddByChSUjArp8F5DQWcIcpriwO4ZToLNAJig0yiyjswfyGNje/ixw==",
+ "dependencies": {
+ "bn.js": "^4.11.9",
+ "brorand": "^1.1.0",
+ "hash.js": "^1.0.0",
+ "hmac-drbg": "^1.0.1",
+ "inherits": "^2.0.4",
+ "minimalistic-assert": "^1.0.1",
+ "minimalistic-crypto-utils": "^1.0.1"
+ }
+ },
"node_modules/embla-carousel": {
"version": "8.0.0-rc21",
"license": "MIT"
@@ -2167,9 +4777,16 @@
"version": "9.2.2",
"license": "MIT"
},
+ "node_modules/emojis-list": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz",
+ "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==",
+ "engines": {
+ "node": ">= 4"
+ }
+ },
"node_modules/enhanced-resolve": {
"version": "5.15.0",
- "dev": true,
"license": "MIT",
"dependencies": {
"graceful-fs": "^4.2.4",
@@ -2181,7 +4798,6 @@
},
"node_modules/es-abstract": {
"version": "1.22.3",
- "dev": true,
"license": "MIT",
"dependencies": {
"array-buffer-byte-length": "^1.0.0",
@@ -2252,9 +4868,14 @@
"safe-array-concat": "^1.0.1"
}
},
+ "node_modules/es-module-lexer": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.4.1.tgz",
+ "integrity": "sha512-cXLGjP0c4T3flZJKQSuziYoq7MlT+rnvfZjfp7h+I7K9BNX54kP9nyWvdbwjQ4u1iWbOL4u96fgeZLToQlZC7w==",
+ "peer": true
+ },
"node_modules/es-set-tostringtag": {
"version": "2.0.2",
- "dev": true,
"license": "MIT",
"dependencies": {
"get-intrinsic": "^1.2.2",
@@ -2275,7 +4896,6 @@
},
"node_modules/es-to-primitive": {
"version": "1.2.1",
- "dev": true,
"license": "MIT",
"dependencies": {
"is-callable": "^1.1.4",
@@ -2291,7 +4911,6 @@
},
"node_modules/escalade": {
"version": "3.1.1",
- "dev": true,
"license": "MIT",
"engines": {
"node": ">=6"
@@ -2668,7 +5287,6 @@
},
"node_modules/esrecurse": {
"version": "4.3.0",
- "dev": true,
"license": "BSD-2-Clause",
"dependencies": {
"estraverse": "^5.2.0"
@@ -2679,23 +5297,34 @@
},
"node_modules/estraverse": {
"version": "5.3.0",
- "dev": true,
"license": "BSD-2-Clause",
"engines": {
"node": ">=4.0"
}
},
+ "node_modules/estree-walker": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-1.0.1.tgz",
+ "integrity": "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg=="
+ },
"node_modules/esutils": {
"version": "2.0.3",
- "dev": true,
"license": "BSD-2-Clause",
"engines": {
"node": ">=0.10.0"
}
},
+ "node_modules/events": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz",
+ "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==",
+ "peer": true,
+ "engines": {
+ "node": ">=0.8.x"
+ }
+ },
"node_modules/fast-deep-equal": {
"version": "3.1.3",
- "dev": true,
"license": "MIT"
},
"node_modules/fast-glob": {
@@ -2724,7 +5353,6 @@
},
"node_modules/fast-json-stable-stringify": {
"version": "2.1.0",
- "dev": true,
"license": "MIT"
},
"node_modules/fast-levenshtein": {
@@ -2750,6 +5378,33 @@
"node": "^10.12.0 || >=12.0.0"
}
},
+ "node_modules/filelist": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz",
+ "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==",
+ "dependencies": {
+ "minimatch": "^5.0.1"
+ }
+ },
+ "node_modules/filelist/node_modules/brace-expansion": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
+ "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
+ "dependencies": {
+ "balanced-match": "^1.0.0"
+ }
+ },
+ "node_modules/filelist/node_modules/minimatch": {
+ "version": "5.1.6",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz",
+ "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
"node_modules/fill-range": {
"version": "7.0.1",
"license": "MIT",
@@ -2760,6 +5415,22 @@
"node": ">=8"
}
},
+ "node_modules/find-cache-dir": {
+ "version": "3.3.2",
+ "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz",
+ "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==",
+ "dependencies": {
+ "commondir": "^1.0.1",
+ "make-dir": "^3.0.2",
+ "pkg-dir": "^4.1.0"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/avajs/find-cache-dir?sponsor=1"
+ }
+ },
"node_modules/find-up": {
"version": "5.0.0",
"dev": true,
@@ -2795,7 +5466,6 @@
},
"node_modules/for-each": {
"version": "0.3.3",
- "dev": true,
"license": "MIT",
"dependencies": {
"is-callable": "^1.1.3"
@@ -2827,9 +5497,22 @@
"url": "https://github.com/sponsors/rawify"
}
},
+ "node_modules/fs-extra": {
+ "version": "9.1.0",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz",
+ "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==",
+ "dependencies": {
+ "at-least-node": "^1.0.0",
+ "graceful-fs": "^4.2.0",
+ "jsonfile": "^6.0.1",
+ "universalify": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
"node_modules/fs.realpath": {
"version": "1.0.0",
- "dev": true,
"license": "ISC"
},
"node_modules/fsevents": {
@@ -2852,7 +5535,6 @@
},
"node_modules/function.prototype.name": {
"version": "1.1.6",
- "dev": true,
"license": "MIT",
"dependencies": {
"call-bind": "^1.0.2",
@@ -2869,15 +5551,21 @@
},
"node_modules/functions-have-names": {
"version": "1.2.3",
- "dev": true,
"license": "MIT",
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
+ "node_modules/gensync": {
+ "version": "1.0.0-beta.2",
+ "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz",
+ "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
"node_modules/get-intrinsic": {
"version": "1.2.2",
- "dev": true,
"license": "MIT",
"dependencies": {
"function-bind": "^1.1.2",
@@ -2896,9 +5584,13 @@
"node": ">=6"
}
},
+ "node_modules/get-own-enumerable-property-symbols": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz",
+ "integrity": "sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g=="
+ },
"node_modules/get-symbol-description": {
"version": "1.0.0",
- "dev": true,
"license": "MIT",
"dependencies": {
"call-bind": "^1.0.2",
@@ -2952,6 +5644,12 @@
"node": ">=10.13.0"
}
},
+ "node_modules/glob-to-regexp": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz",
+ "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==",
+ "peer": true
+ },
"node_modules/glob/node_modules/minimatch": {
"version": "9.0.3",
"license": "ISC",
@@ -2988,7 +5686,6 @@
},
"node_modules/globalthis": {
"version": "1.0.3",
- "dev": true,
"license": "MIT",
"dependencies": {
"define-properties": "^1.1.3"
@@ -3002,7 +5699,6 @@
},
"node_modules/globby": {
"version": "11.1.0",
- "dev": true,
"license": "MIT",
"dependencies": {
"array-union": "^2.1.0",
@@ -3021,7 +5717,6 @@
},
"node_modules/gopd": {
"version": "1.0.1",
- "dev": true,
"license": "MIT",
"dependencies": {
"get-intrinsic": "^1.1.3"
@@ -3041,7 +5736,6 @@
},
"node_modules/has-bigints": {
"version": "1.0.2",
- "dev": true,
"license": "MIT",
"funding": {
"url": "https://github.com/sponsors/ljharb"
@@ -3049,7 +5743,6 @@
},
"node_modules/has-flag": {
"version": "4.0.0",
- "dev": true,
"license": "MIT",
"engines": {
"node": ">=8"
@@ -3057,7 +5750,6 @@
},
"node_modules/has-property-descriptors": {
"version": "1.0.1",
- "dev": true,
"license": "MIT",
"dependencies": {
"get-intrinsic": "^1.2.2"
@@ -3068,7 +5760,6 @@
},
"node_modules/has-proto": {
"version": "1.0.1",
- "dev": true,
"license": "MIT",
"engines": {
"node": ">= 0.4"
@@ -3079,7 +5770,6 @@
},
"node_modules/has-symbols": {
"version": "1.0.3",
- "dev": true,
"license": "MIT",
"engines": {
"node": ">= 0.4"
@@ -3090,7 +5780,6 @@
},
"node_modules/has-tostringtag": {
"version": "1.0.0",
- "dev": true,
"license": "MIT",
"dependencies": {
"has-symbols": "^1.0.2"
@@ -3102,6 +5791,28 @@
"url": "https://github.com/sponsors/ljharb"
}
},
+ "node_modules/hash-base": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz",
+ "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==",
+ "dependencies": {
+ "inherits": "^2.0.4",
+ "readable-stream": "^3.6.0",
+ "safe-buffer": "^5.2.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/hash.js": {
+ "version": "1.1.7",
+ "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz",
+ "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==",
+ "dependencies": {
+ "inherits": "^2.0.3",
+ "minimalistic-assert": "^1.0.1"
+ }
+ },
"node_modules/hasown": {
"version": "2.0.0",
"license": "MIT",
@@ -3112,9 +5823,23 @@
"node": ">= 0.4"
}
},
+ "node_modules/hmac-drbg": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz",
+ "integrity": "sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==",
+ "dependencies": {
+ "hash.js": "^1.0.3",
+ "minimalistic-assert": "^1.0.0",
+ "minimalistic-crypto-utils": "^1.0.1"
+ }
+ },
+ "node_modules/idb": {
+ "version": "7.1.1",
+ "resolved": "https://registry.npmjs.org/idb/-/idb-7.1.1.tgz",
+ "integrity": "sha512-gchesWBzyvGHRO9W8tzUWFDycow5gwjvFKfyV9FF32Y7F50yZMp7mP+T2mJIWFx49zicqyC4uefHM17o6xKIVQ=="
+ },
"node_modules/ignore": {
"version": "5.3.0",
- "dev": true,
"license": "MIT",
"engines": {
"node": ">= 4"
@@ -3145,7 +5870,6 @@
},
"node_modules/inflight": {
"version": "1.0.6",
- "dev": true,
"license": "ISC",
"dependencies": {
"once": "^1.3.0",
@@ -3154,12 +5878,10 @@
},
"node_modules/inherits": {
"version": "2.0.4",
- "dev": true,
"license": "ISC"
},
"node_modules/internal-slot": {
"version": "1.0.6",
- "dev": true,
"license": "MIT",
"dependencies": {
"get-intrinsic": "^1.2.2",
@@ -3179,7 +5901,6 @@
},
"node_modules/is-array-buffer": {
"version": "3.0.2",
- "dev": true,
"license": "MIT",
"dependencies": {
"call-bind": "^1.0.2",
@@ -3206,7 +5927,6 @@
},
"node_modules/is-bigint": {
"version": "1.0.4",
- "dev": true,
"license": "MIT",
"dependencies": {
"has-bigints": "^1.0.1"
@@ -3227,7 +5947,6 @@
},
"node_modules/is-boolean-object": {
"version": "1.1.2",
- "dev": true,
"license": "MIT",
"dependencies": {
"call-bind": "^1.0.2",
@@ -3242,7 +5961,6 @@
},
"node_modules/is-callable": {
"version": "1.2.7",
- "dev": true,
"license": "MIT",
"engines": {
"node": ">= 0.4"
@@ -3263,7 +5981,6 @@
},
"node_modules/is-date-object": {
"version": "1.0.5",
- "dev": true,
"license": "MIT",
"dependencies": {
"has-tostringtag": "^1.0.0"
@@ -3332,9 +6049,13 @@
"url": "https://github.com/sponsors/ljharb"
}
},
+ "node_modules/is-module": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz",
+ "integrity": "sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g=="
+ },
"node_modules/is-negative-zero": {
"version": "2.0.2",
- "dev": true,
"license": "MIT",
"engines": {
"node": ">= 0.4"
@@ -3352,7 +6073,6 @@
},
"node_modules/is-number-object": {
"version": "1.0.7",
- "dev": true,
"license": "MIT",
"dependencies": {
"has-tostringtag": "^1.0.0"
@@ -3364,6 +6084,44 @@
"url": "https://github.com/sponsors/ljharb"
}
},
+ "node_modules/is-obj": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz",
+ "integrity": "sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-path-cwd": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz",
+ "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/is-path-in-cwd": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-2.1.0.tgz",
+ "integrity": "sha512-rNocXHgipO+rvnP6dk3zI20RpOtrAM/kzbB258Uw5BWr3TpXi861yzjo16Dn4hUox07iw5AyeMLHWsujkjzvRQ==",
+ "dependencies": {
+ "is-path-inside": "^2.1.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/is-path-in-cwd/node_modules/is-path-inside": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-2.1.0.tgz",
+ "integrity": "sha512-wiyhTzfDWsvwAW53OBWF5zuvaOGlZ6PwYxAbPVDhpm+gM09xKQGjBq/8uYN12aDvMxnAnq3dxTyoSoRNmg5YFg==",
+ "dependencies": {
+ "path-is-inside": "^1.0.2"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
"node_modules/is-path-inside": {
"version": "3.0.3",
"dev": true,
@@ -3374,7 +6132,6 @@
},
"node_modules/is-regex": {
"version": "1.1.4",
- "dev": true,
"license": "MIT",
"dependencies": {
"call-bind": "^1.0.2",
@@ -3387,6 +6144,14 @@
"url": "https://github.com/sponsors/ljharb"
}
},
+ "node_modules/is-regexp": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz",
+ "integrity": "sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA==",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
"node_modules/is-set": {
"version": "2.0.2",
"dev": true,
@@ -3397,7 +6162,6 @@
},
"node_modules/is-shared-array-buffer": {
"version": "1.0.2",
- "dev": true,
"license": "MIT",
"dependencies": {
"call-bind": "^1.0.2"
@@ -3406,9 +6170,19 @@
"url": "https://github.com/sponsors/ljharb"
}
},
+ "node_modules/is-stream": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz",
+ "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==",
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
"node_modules/is-string": {
"version": "1.0.7",
- "dev": true,
"license": "MIT",
"dependencies": {
"has-tostringtag": "^1.0.0"
@@ -3422,7 +6196,6 @@
},
"node_modules/is-symbol": {
"version": "1.0.4",
- "dev": true,
"license": "MIT",
"dependencies": {
"has-symbols": "^1.0.2"
@@ -3436,7 +6209,6 @@
},
"node_modules/is-typed-array": {
"version": "1.1.12",
- "dev": true,
"license": "MIT",
"dependencies": {
"which-typed-array": "^1.1.11"
@@ -3458,7 +6230,6 @@
},
"node_modules/is-weakref": {
"version": "1.0.2",
- "dev": true,
"license": "MIT",
"dependencies": {
"call-bind": "^1.0.2"
@@ -3481,7 +6252,6 @@
},
"node_modules/isarray": {
"version": "2.0.5",
- "dev": true,
"license": "MIT"
},
"node_modules/isexe": {
@@ -3516,6 +6286,50 @@
"@pkgjs/parseargs": "^0.11.0"
}
},
+ "node_modules/jake": {
+ "version": "10.8.7",
+ "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.7.tgz",
+ "integrity": "sha512-ZDi3aP+fG/LchyBzUM804VjddnwfSfsdeYkwt8NcbKRvo4rFkjhs456iLFn3k2ZUWvNe4i48WACDbza8fhq2+w==",
+ "dependencies": {
+ "async": "^3.2.3",
+ "chalk": "^4.0.2",
+ "filelist": "^1.0.4",
+ "minimatch": "^3.1.2"
+ },
+ "bin": {
+ "jake": "bin/cli.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/jest-worker": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz",
+ "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==",
+ "dependencies": {
+ "@types/node": "*",
+ "merge-stream": "^2.0.0",
+ "supports-color": "^8.0.0"
+ },
+ "engines": {
+ "node": ">= 10.13.0"
+ }
+ },
+ "node_modules/jest-worker/node_modules/supports-color": {
+ "version": "8.1.1",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz",
+ "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==",
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/supports-color?sponsor=1"
+ }
+ },
"node_modules/jiti": {
"version": "1.21.0",
"license": "MIT",
@@ -3594,14 +6408,35 @@
"js-yaml": "bin/js-yaml.js"
}
},
+ "node_modules/jsesc": {
+ "version": "2.5.2",
+ "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz",
+ "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==",
+ "bin": {
+ "jsesc": "bin/jsesc"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
"node_modules/json-buffer": {
"version": "3.0.1",
"dev": true,
"license": "MIT"
},
+ "node_modules/json-parse-even-better-errors": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz",
+ "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==",
+ "peer": true
+ },
+ "node_modules/json-schema": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz",
+ "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA=="
+ },
"node_modules/json-schema-traverse": {
"version": "0.4.1",
- "dev": true,
"license": "MIT"
},
"node_modules/json-stable-stringify-without-jsonify": {
@@ -3620,6 +6455,25 @@
"json5": "lib/cli.js"
}
},
+ "node_modules/jsonfile": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz",
+ "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==",
+ "dependencies": {
+ "universalify": "^2.0.0"
+ },
+ "optionalDependencies": {
+ "graceful-fs": "^4.1.6"
+ }
+ },
+ "node_modules/jsonpointer": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-5.0.1.tgz",
+ "integrity": "sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
"node_modules/jsx-ast-utils": {
"version": "3.3.5",
"dev": true,
@@ -3658,6 +6512,14 @@
"node": ">=0.10"
}
},
+ "node_modules/leven": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz",
+ "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==",
+ "engines": {
+ "node": ">=6"
+ }
+ },
"node_modules/levn": {
"version": "0.4.1",
"dev": true,
@@ -3670,6 +6532,14 @@
"node": ">= 0.8.0"
}
},
+ "node_modules/light-bolt11-decoder": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/light-bolt11-decoder/-/light-bolt11-decoder-3.1.1.tgz",
+ "integrity": "sha512-sLg/KCwYkgsHWkefWd6KqpCHrLFWWaXTOX3cf6yD2hAzL0SLpX+lFcaFK2spkjbgzG6hhijKfORDc9WoUHwX0A==",
+ "dependencies": {
+ "@scure/base": "1.1.1"
+ }
+ },
"node_modules/lilconfig": {
"version": "2.1.0",
"license": "MIT",
@@ -3681,6 +6551,39 @@
"version": "1.2.4",
"license": "MIT"
},
+ "node_modules/loader-runner": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz",
+ "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==",
+ "peer": true,
+ "engines": {
+ "node": ">=6.11.5"
+ }
+ },
+ "node_modules/loader-utils": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz",
+ "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==",
+ "dependencies": {
+ "big.js": "^5.2.2",
+ "emojis-list": "^3.0.0",
+ "json5": "^2.1.2"
+ },
+ "engines": {
+ "node": ">=8.9.0"
+ }
+ },
+ "node_modules/loader-utils/node_modules/json5": {
+ "version": "2.2.3",
+ "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz",
+ "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==",
+ "bin": {
+ "json5": "lib/cli.js"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
"node_modules/locate-path": {
"version": "6.0.0",
"dev": true,
@@ -3695,11 +6598,26 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
+ "node_modules/lodash": {
+ "version": "4.17.21",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
+ "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="
+ },
+ "node_modules/lodash.debounce": {
+ "version": "4.0.8",
+ "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz",
+ "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow=="
+ },
"node_modules/lodash.merge": {
"version": "4.6.2",
"dev": true,
"license": "MIT"
},
+ "node_modules/lodash.sortby": {
+ "version": "4.7.0",
+ "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz",
+ "integrity": "sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA=="
+ },
"node_modules/loose-envify": {
"version": "1.4.0",
"license": "MIT",
@@ -3724,6 +6642,43 @@
"react": "^16.5.1 || ^17.0.0 || ^18.0.0"
}
},
+ "node_modules/magic-string": {
+ "version": "0.25.9",
+ "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz",
+ "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==",
+ "dependencies": {
+ "sourcemap-codec": "^1.4.8"
+ }
+ },
+ "node_modules/make-dir": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz",
+ "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==",
+ "dependencies": {
+ "semver": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/md5.js": {
+ "version": "1.3.5",
+ "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz",
+ "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==",
+ "dependencies": {
+ "hash-base": "^3.0.0",
+ "inherits": "^2.0.1",
+ "safe-buffer": "^5.1.2"
+ }
+ },
+ "node_modules/merge-stream": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz",
+ "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w=="
+ },
"node_modules/merge2": {
"version": "1.4.1",
"license": "MIT",
@@ -3742,9 +6697,39 @@
"node": ">=8.6"
}
},
+ "node_modules/mime-db": {
+ "version": "1.52.0",
+ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
+ "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
+ "peer": true,
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/mime-types": {
+ "version": "2.1.35",
+ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
+ "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
+ "peer": true,
+ "dependencies": {
+ "mime-db": "1.52.0"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/minimalistic-assert": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz",
+ "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A=="
+ },
+ "node_modules/minimalistic-crypto-utils": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz",
+ "integrity": "sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg=="
+ },
"node_modules/minimatch": {
"version": "3.1.2",
- "dev": true,
"license": "ISC",
"dependencies": {
"brace-expansion": "^1.1.7"
@@ -3770,7 +6755,6 @@
},
"node_modules/ms": {
"version": "2.1.2",
- "dev": true,
"license": "MIT"
},
"node_modules/mz": {
@@ -3803,6 +6787,12 @@
"dev": true,
"license": "MIT"
},
+ "node_modules/neo-async": {
+ "version": "2.6.2",
+ "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz",
+ "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==",
+ "peer": true
+ },
"node_modules/next": {
"version": "14.1.0",
"license": "MIT",
@@ -3847,6 +6837,22 @@
}
}
},
+ "node_modules/next-pwa": {
+ "version": "5.6.0",
+ "resolved": "https://registry.npmjs.org/next-pwa/-/next-pwa-5.6.0.tgz",
+ "integrity": "sha512-XV8g8C6B7UmViXU8askMEYhWwQ4qc/XqJGnexbLV68hzKaGHZDMtHsm2TNxFcbR7+ypVuth/wwpiIlMwpRJJ5A==",
+ "dependencies": {
+ "babel-loader": "^8.2.5",
+ "clean-webpack-plugin": "^4.0.0",
+ "globby": "^11.0.4",
+ "terser-webpack-plugin": "^5.3.3",
+ "workbox-webpack-plugin": "^6.5.4",
+ "workbox-window": "^6.5.4"
+ },
+ "peerDependencies": {
+ "next": ">=9.0.0"
+ }
+ },
"node_modules/next-themes": {
"version": "0.2.1",
"license": "MIT",
@@ -3882,9 +6888,23 @@
"node": "^10 || ^12 || >=14"
}
},
+ "node_modules/node-addon-api": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-2.0.2.tgz",
+ "integrity": "sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA=="
+ },
+ "node_modules/node-gyp-build": {
+ "version": "4.8.0",
+ "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.0.tgz",
+ "integrity": "sha512-u6fs2AEUljNho3EYTJNBfImO5QTo/J/1Etd+NVdCj7qWKUSN/bSLkZwhDv7I+w/MSC6qJ4cknepkAYykDdK8og==",
+ "bin": {
+ "node-gyp-build": "bin.js",
+ "node-gyp-build-optional": "optional.js",
+ "node-gyp-build-test": "build-test.js"
+ }
+ },
"node_modules/node-releases": {
"version": "2.0.14",
- "dev": true,
"license": "MIT"
},
"node_modules/normalize-path": {
@@ -3916,9 +6936,18 @@
"react": ">=16"
}
},
- "node_modules/nostr-tools": {
+ "node_modules/nostr-react/node_modules/@noble/ciphers": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/@noble/ciphers/-/ciphers-0.2.0.tgz",
+ "integrity": "sha512-6YBxJDAapHSdd3bLDv6x2wRPwq4QFMUaB3HvljNBUTThDd12eSm7/3F+2lnfzx2jvM+S6Nsy0jEt9QbPqSwqRw==",
+ "funding": {
+ "url": "https://paulmillr.com/funding/"
+ }
+ },
+ "node_modules/nostr-react/node_modules/nostr-tools": {
"version": "1.17.0",
- "license": "Unlicense",
+ "resolved": "https://registry.npmjs.org/nostr-tools/-/nostr-tools-1.17.0.tgz",
+ "integrity": "sha512-LZmR8GEWKZeElbFV5Xte75dOeE9EFUW/QLI1Ncn3JKn0kFddDKEfBbFN8Mu4TMs+L4HR/WTPha2l+PPuRnJcMw==",
"dependencies": {
"@noble/ciphers": "0.2.0",
"@noble/curves": "1.1.0",
@@ -3936,6 +6965,58 @@
}
}
},
+ "node_modules/nostr-tools": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/nostr-tools/-/nostr-tools-2.4.0.tgz",
+ "integrity": "sha512-xQC7XdGeh0gLyprcKhvx5lwr7OQ+ZOiQ9C6GpzlVAj+EBv+AiN8kySb57t3uJoG1HK15oT9jf++MmQLwhp1xNQ==",
+ "dependencies": {
+ "@noble/ciphers": "^0.5.1",
+ "@noble/curves": "1.2.0",
+ "@noble/hashes": "1.3.1",
+ "@scure/base": "1.1.1",
+ "@scure/bip32": "1.3.1",
+ "@scure/bip39": "1.2.1"
+ },
+ "optionalDependencies": {
+ "nostr-wasm": "v0.1.0"
+ },
+ "peerDependencies": {
+ "typescript": ">=5.0.0"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/nostr-tools/node_modules/@noble/curves": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.2.0.tgz",
+ "integrity": "sha512-oYclrNgRaM9SsBUBVbb8M6DTV7ZHRTKugureoYEncY5c65HOmRzvSiTE3y5CYaPYJA/GVkrhXEoF0M3Ya9PMnw==",
+ "dependencies": {
+ "@noble/hashes": "1.3.2"
+ },
+ "funding": {
+ "url": "https://paulmillr.com/funding/"
+ }
+ },
+ "node_modules/nostr-tools/node_modules/@noble/curves/node_modules/@noble/hashes": {
+ "version": "1.3.2",
+ "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.2.tgz",
+ "integrity": "sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ==",
+ "engines": {
+ "node": ">= 16"
+ },
+ "funding": {
+ "url": "https://paulmillr.com/funding/"
+ }
+ },
+ "node_modules/nostr-wasm": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/nostr-wasm/-/nostr-wasm-0.1.0.tgz",
+ "integrity": "sha512-78BTryCLcLYv96ONU8Ws3Q1JzjlAt+43pWQhIl86xZmWeegYCNLPml7yQ+gG3vR6V5h4XGj+TxO+SS5dsThQIA==",
+ "optional": true
+ },
"node_modules/object-assign": {
"version": "4.1.1",
"license": "MIT",
@@ -3952,7 +7033,6 @@
},
"node_modules/object-inspect": {
"version": "1.13.1",
- "dev": true,
"license": "MIT",
"funding": {
"url": "https://github.com/sponsors/ljharb"
@@ -3960,7 +7040,6 @@
},
"node_modules/object-keys": {
"version": "1.1.1",
- "dev": true,
"license": "MIT",
"engines": {
"node": ">= 0.4"
@@ -3968,7 +7047,6 @@
},
"node_modules/object.assign": {
"version": "4.1.5",
- "dev": true,
"license": "MIT",
"dependencies": {
"call-bind": "^1.0.5",
@@ -4053,7 +7131,6 @@
},
"node_modules/once": {
"version": "1.4.0",
- "dev": true,
"license": "ISC",
"dependencies": {
"wrappy": "1"
@@ -4103,6 +7180,22 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
+ "node_modules/p-map": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz",
+ "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/p-try": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
+ "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
+ "engines": {
+ "node": ">=6"
+ }
+ },
"node_modules/parent-module": {
"version": "1.0.1",
"dev": true,
@@ -4116,7 +7209,6 @@
},
"node_modules/path-exists": {
"version": "4.0.0",
- "dev": true,
"license": "MIT",
"engines": {
"node": ">=8"
@@ -4124,12 +7216,16 @@
},
"node_modules/path-is-absolute": {
"version": "1.0.1",
- "dev": true,
"license": "MIT",
"engines": {
"node": ">=0.10.0"
}
},
+ "node_modules/path-is-inside": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz",
+ "integrity": "sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w=="
+ },
"node_modules/path-key": {
"version": "3.1.1",
"license": "MIT",
@@ -4157,7 +7253,6 @@
},
"node_modules/path-type": {
"version": "4.0.0",
- "dev": true,
"license": "MIT",
"engines": {
"node": ">=8"
@@ -4184,6 +7279,25 @@
"node": ">=0.10.0"
}
},
+ "node_modules/pinkie": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz",
+ "integrity": "sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/pinkie-promise": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz",
+ "integrity": "sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==",
+ "dependencies": {
+ "pinkie": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
"node_modules/pirates": {
"version": "4.0.6",
"license": "MIT",
@@ -4191,6 +7305,65 @@
"node": ">= 6"
}
},
+ "node_modules/pkg-dir": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz",
+ "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==",
+ "dependencies": {
+ "find-up": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/pkg-dir/node_modules/find-up": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
+ "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
+ "dependencies": {
+ "locate-path": "^5.0.0",
+ "path-exists": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/pkg-dir/node_modules/locate-path": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
+ "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
+ "dependencies": {
+ "p-locate": "^4.1.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/pkg-dir/node_modules/p-limit": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
+ "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
+ "dependencies": {
+ "p-try": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/pkg-dir/node_modules/p-locate": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
+ "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
+ "dependencies": {
+ "p-limit": "^2.2.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
"node_modules/postcss": {
"version": "8.4.33",
"funding": [
@@ -4329,6 +7502,17 @@
"node": ">= 0.8.0"
}
},
+ "node_modules/pretty-bytes": {
+ "version": "5.6.0",
+ "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz",
+ "integrity": "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==",
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
"node_modules/prop-types": {
"version": "15.8.1",
"dev": true,
@@ -4341,7 +7525,6 @@
},
"node_modules/punycode": {
"version": "2.3.1",
- "dev": true,
"license": "MIT",
"engines": {
"node": ">=6"
@@ -4365,6 +7548,14 @@
],
"license": "MIT"
},
+ "node_modules/randombytes": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz",
+ "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==",
+ "dependencies": {
+ "safe-buffer": "^5.1.0"
+ }
+ },
"node_modules/react": {
"version": "18.2.0",
"license": "MIT",
@@ -4386,6 +7577,29 @@
"react": "^18.2.0"
}
},
+ "node_modules/react-hook-form": {
+ "version": "7.51.4",
+ "resolved": "https://registry.npmjs.org/react-hook-form/-/react-hook-form-7.51.4.tgz",
+ "integrity": "sha512-V14i8SEkh+V1gs6YtD0hdHYnoL4tp/HX/A45wWQN15CYr9bFRmmRdYStSO5L65lCCZRF+kYiSKhm9alqbcdiVA==",
+ "engines": {
+ "node": ">=12.22.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/react-hook-form"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17 || ^18"
+ }
+ },
+ "node_modules/react-icons": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/react-icons/-/react-icons-5.1.0.tgz",
+ "integrity": "sha512-D3zug1270S4hbSlIRJ0CUS97QE1yNNKDjzQe3HqY0aefp2CBn9VgzgES27sRR2gOvFK+0CNx/BW0ggOESp6fqQ==",
+ "peerDependencies": {
+ "react": "*"
+ }
+ },
"node_modules/react-is": {
"version": "16.13.1",
"dev": true,
@@ -4462,6 +7676,19 @@
"pify": "^2.3.0"
}
},
+ "node_modules/readable-stream": {
+ "version": "3.6.2",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz",
+ "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==",
+ "dependencies": {
+ "inherits": "^2.0.3",
+ "string_decoder": "^1.1.1",
+ "util-deprecate": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
"node_modules/readdirp": {
"version": "3.6.0",
"license": "MIT",
@@ -4491,13 +7718,36 @@
"url": "https://github.com/sponsors/ljharb"
}
},
+ "node_modules/regenerate": {
+ "version": "1.4.2",
+ "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz",
+ "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A=="
+ },
+ "node_modules/regenerate-unicode-properties": {
+ "version": "10.1.1",
+ "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.1.tgz",
+ "integrity": "sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q==",
+ "dependencies": {
+ "regenerate": "^1.4.2"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
"node_modules/regenerator-runtime": {
"version": "0.14.1",
"license": "MIT"
},
+ "node_modules/regenerator-transform": {
+ "version": "0.15.2",
+ "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.2.tgz",
+ "integrity": "sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==",
+ "dependencies": {
+ "@babel/runtime": "^7.8.4"
+ }
+ },
"node_modules/regexp.prototype.flags": {
"version": "1.5.1",
- "dev": true,
"license": "MIT",
"dependencies": {
"call-bind": "^1.0.2",
@@ -4511,6 +7761,49 @@
"url": "https://github.com/sponsors/ljharb"
}
},
+ "node_modules/regexpu-core": {
+ "version": "5.3.2",
+ "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.3.2.tgz",
+ "integrity": "sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==",
+ "dependencies": {
+ "@babel/regjsgen": "^0.8.0",
+ "regenerate": "^1.4.2",
+ "regenerate-unicode-properties": "^10.1.0",
+ "regjsparser": "^0.9.1",
+ "unicode-match-property-ecmascript": "^2.0.0",
+ "unicode-match-property-value-ecmascript": "^2.1.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/regjsparser": {
+ "version": "0.9.1",
+ "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz",
+ "integrity": "sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==",
+ "dependencies": {
+ "jsesc": "~0.5.0"
+ },
+ "bin": {
+ "regjsparser": "bin/parser"
+ }
+ },
+ "node_modules/regjsparser/node_modules/jsesc": {
+ "version": "0.5.0",
+ "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz",
+ "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==",
+ "bin": {
+ "jsesc": "bin/jsesc"
+ }
+ },
+ "node_modules/require-from-string": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz",
+ "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
"node_modules/resolve": {
"version": "1.22.8",
"license": "MIT",
@@ -4583,6 +7876,65 @@
"url": "https://github.com/sponsors/isaacs"
}
},
+ "node_modules/ripemd160": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz",
+ "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==",
+ "dependencies": {
+ "hash-base": "^3.0.0",
+ "inherits": "^2.0.1"
+ }
+ },
+ "node_modules/rollup": {
+ "version": "2.79.1",
+ "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.79.1.tgz",
+ "integrity": "sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw==",
+ "bin": {
+ "rollup": "dist/bin/rollup"
+ },
+ "engines": {
+ "node": ">=10.0.0"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.2"
+ }
+ },
+ "node_modules/rollup-plugin-terser": {
+ "version": "7.0.2",
+ "resolved": "https://registry.npmjs.org/rollup-plugin-terser/-/rollup-plugin-terser-7.0.2.tgz",
+ "integrity": "sha512-w3iIaU4OxcF52UUXiZNsNeuXIMDvFrr+ZXK6bFZ0Q60qyVfq4uLptoS4bbq3paG3x216eQllFZX7zt6TIImguQ==",
+ "deprecated": "This package has been deprecated and is no longer maintained. Please use @rollup/plugin-terser",
+ "dependencies": {
+ "@babel/code-frame": "^7.10.4",
+ "jest-worker": "^26.2.1",
+ "serialize-javascript": "^4.0.0",
+ "terser": "^5.0.0"
+ },
+ "peerDependencies": {
+ "rollup": "^2.0.0"
+ }
+ },
+ "node_modules/rollup-plugin-terser/node_modules/jest-worker": {
+ "version": "26.6.2",
+ "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz",
+ "integrity": "sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==",
+ "dependencies": {
+ "@types/node": "*",
+ "merge-stream": "^2.0.0",
+ "supports-color": "^7.0.0"
+ },
+ "engines": {
+ "node": ">= 10.13.0"
+ }
+ },
+ "node_modules/rollup-plugin-terser/node_modules/serialize-javascript": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz",
+ "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==",
+ "dependencies": {
+ "randombytes": "^2.1.0"
+ }
+ },
"node_modules/run-parallel": {
"version": "1.2.0",
"funding": [
@@ -4606,7 +7958,6 @@
},
"node_modules/safe-array-concat": {
"version": "1.1.0",
- "dev": true,
"license": "MIT",
"dependencies": {
"call-bind": "^1.0.5",
@@ -4621,9 +7972,27 @@
"url": "https://github.com/sponsors/ljharb"
}
},
+ "node_modules/safe-buffer": {
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
+ "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ]
+ },
"node_modules/safe-regex-test": {
"version": "1.0.2",
- "dev": true,
"license": "MIT",
"dependencies": {
"call-bind": "^1.0.5",
@@ -4644,17 +8013,54 @@
"loose-envify": "^1.1.0"
}
},
+ "node_modules/schema-utils": {
+ "version": "2.7.1",
+ "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz",
+ "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==",
+ "dependencies": {
+ "@types/json-schema": "^7.0.5",
+ "ajv": "^6.12.4",
+ "ajv-keywords": "^3.5.2"
+ },
+ "engines": {
+ "node": ">= 8.9.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/webpack"
+ }
+ },
+ "node_modules/secp256k1": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/secp256k1/-/secp256k1-4.0.3.tgz",
+ "integrity": "sha512-NLZVf+ROMxwtEj3Xa562qgv2BK5e2WNmXPiOdVIPLgs6lyTzMvBq0aWTYMI5XCP9jZMVKOcqZLw/Wc4vDkuxhA==",
+ "hasInstallScript": true,
+ "dependencies": {
+ "elliptic": "^6.5.4",
+ "node-addon-api": "^2.0.0",
+ "node-gyp-build": "^4.2.0"
+ },
+ "engines": {
+ "node": ">=10.0.0"
+ }
+ },
"node_modules/semver": {
"version": "6.3.1",
- "dev": true,
"license": "ISC",
"bin": {
"semver": "bin/semver.js"
}
},
+ "node_modules/serialize-javascript": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz",
+ "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==",
+ "dependencies": {
+ "randombytes": "^2.1.0"
+ }
+ },
"node_modules/set-function-length": {
"version": "1.2.0",
- "dev": true,
"license": "MIT",
"dependencies": {
"define-data-property": "^1.1.1",
@@ -4669,7 +8075,6 @@
},
"node_modules/set-function-name": {
"version": "2.0.1",
- "dev": true,
"license": "MIT",
"dependencies": {
"define-data-property": "^1.0.1",
@@ -4680,6 +8085,18 @@
"node": ">= 0.4"
}
},
+ "node_modules/sha.js": {
+ "version": "2.4.11",
+ "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz",
+ "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==",
+ "dependencies": {
+ "inherits": "^2.0.1",
+ "safe-buffer": "^5.0.1"
+ },
+ "bin": {
+ "sha.js": "bin.js"
+ }
+ },
"node_modules/shebang-command": {
"version": "2.0.0",
"license": "MIT",
@@ -4699,7 +8116,6 @@
},
"node_modules/side-channel": {
"version": "1.0.4",
- "dev": true,
"license": "MIT",
"dependencies": {
"call-bind": "^1.0.0",
@@ -4722,12 +8138,24 @@
},
"node_modules/slash": {
"version": "3.0.0",
- "dev": true,
"license": "MIT",
"engines": {
"node": ">=8"
}
},
+ "node_modules/source-list-map": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz",
+ "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw=="
+ },
+ "node_modules/source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
"node_modules/source-map-js": {
"version": "1.0.2",
"license": "BSD-3-Clause",
@@ -4735,12 +8163,35 @@
"node": ">=0.10.0"
}
},
+ "node_modules/source-map-support": {
+ "version": "0.5.21",
+ "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz",
+ "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==",
+ "dependencies": {
+ "buffer-from": "^1.0.0",
+ "source-map": "^0.6.0"
+ }
+ },
+ "node_modules/sourcemap-codec": {
+ "version": "1.4.8",
+ "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz",
+ "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==",
+ "deprecated": "Please use @jridgewell/sourcemap-codec instead"
+ },
"node_modules/streamsearch": {
"version": "1.1.0",
"engines": {
"node": ">=10.0.0"
}
},
+ "node_modules/string_decoder": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz",
+ "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==",
+ "dependencies": {
+ "safe-buffer": "~5.2.0"
+ }
+ },
"node_modules/string-width": {
"version": "5.1.2",
"license": "MIT",
@@ -4781,7 +8232,6 @@
},
"node_modules/string.prototype.matchall": {
"version": "4.0.10",
- "dev": true,
"license": "MIT",
"dependencies": {
"call-bind": "^1.0.2",
@@ -4800,7 +8250,6 @@
},
"node_modules/string.prototype.trim": {
"version": "1.2.8",
- "dev": true,
"license": "MIT",
"dependencies": {
"call-bind": "^1.0.2",
@@ -4816,7 +8265,6 @@
},
"node_modules/string.prototype.trimend": {
"version": "1.0.7",
- "dev": true,
"license": "MIT",
"dependencies": {
"call-bind": "^1.0.2",
@@ -4829,7 +8277,6 @@
},
"node_modules/string.prototype.trimstart": {
"version": "1.0.7",
- "dev": true,
"license": "MIT",
"dependencies": {
"call-bind": "^1.0.2",
@@ -4840,6 +8287,19 @@
"url": "https://github.com/sponsors/ljharb"
}
},
+ "node_modules/stringify-object": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz",
+ "integrity": "sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==",
+ "dependencies": {
+ "get-own-enumerable-property-symbols": "^3.0.0",
+ "is-obj": "^1.0.1",
+ "is-regexp": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
"node_modules/strip-ansi": {
"version": "6.0.1",
"dev": true,
@@ -4859,6 +8319,14 @@
"node": ">=4"
}
},
+ "node_modules/strip-comments": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/strip-comments/-/strip-comments-2.0.1.tgz",
+ "integrity": "sha512-ZprKx+bBLXv067WTCALv8SSz5l2+XhpYCsVtSqlMnkAXMWDq+/ekVbl1ghqP9rUHTzv6sm/DwCOiYutU/yp1fw==",
+ "engines": {
+ "node": ">=10"
+ }
+ },
"node_modules/strip-json-comments": {
"version": "3.1.1",
"dev": true,
@@ -4913,7 +8381,6 @@
},
"node_modules/supports-color": {
"version": "7.2.0",
- "dev": true,
"license": "MIT",
"dependencies": {
"has-flag": "^4.0.0"
@@ -4987,12 +8454,119 @@
},
"node_modules/tapable": {
"version": "2.2.1",
- "dev": true,
"license": "MIT",
"engines": {
"node": ">=6"
}
},
+ "node_modules/temp-dir": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-2.0.0.tgz",
+ "integrity": "sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/tempy": {
+ "version": "0.6.0",
+ "resolved": "https://registry.npmjs.org/tempy/-/tempy-0.6.0.tgz",
+ "integrity": "sha512-G13vtMYPT/J8A4X2SjdtBTphZlrp1gKv6hZiOjw14RCWg6GbHuQBGtjlx75xLbYV/wEc0D7G5K4rxKP/cXk8Bw==",
+ "dependencies": {
+ "is-stream": "^2.0.0",
+ "temp-dir": "^2.0.0",
+ "type-fest": "^0.16.0",
+ "unique-string": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/tempy/node_modules/type-fest": {
+ "version": "0.16.0",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.16.0.tgz",
+ "integrity": "sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg==",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/terser": {
+ "version": "5.27.0",
+ "resolved": "https://registry.npmjs.org/terser/-/terser-5.27.0.tgz",
+ "integrity": "sha512-bi1HRwVRskAjheeYl291n3JC4GgO/Ty4z1nVs5AAsmonJulGxpSektecnNedrwK9C7vpvVtcX3cw00VSLt7U2A==",
+ "dependencies": {
+ "@jridgewell/source-map": "^0.3.3",
+ "acorn": "^8.8.2",
+ "commander": "^2.20.0",
+ "source-map-support": "~0.5.20"
+ },
+ "bin": {
+ "terser": "bin/terser"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/terser-webpack-plugin": {
+ "version": "5.3.10",
+ "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.10.tgz",
+ "integrity": "sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==",
+ "dependencies": {
+ "@jridgewell/trace-mapping": "^0.3.20",
+ "jest-worker": "^27.4.5",
+ "schema-utils": "^3.1.1",
+ "serialize-javascript": "^6.0.1",
+ "terser": "^5.26.0"
+ },
+ "engines": {
+ "node": ">= 10.13.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/webpack"
+ },
+ "peerDependencies": {
+ "webpack": "^5.1.0"
+ },
+ "peerDependenciesMeta": {
+ "@swc/core": {
+ "optional": true
+ },
+ "esbuild": {
+ "optional": true
+ },
+ "uglify-js": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/terser-webpack-plugin/node_modules/schema-utils": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz",
+ "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==",
+ "dependencies": {
+ "@types/json-schema": "^7.0.8",
+ "ajv": "^6.12.5",
+ "ajv-keywords": "^3.5.2"
+ },
+ "engines": {
+ "node": ">= 10.13.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/webpack"
+ }
+ },
+ "node_modules/terser/node_modules/commander": {
+ "version": "2.20.3",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
+ "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ=="
+ },
"node_modules/text-table": {
"version": "0.2.0",
"dev": true,
@@ -5015,6 +8589,14 @@
"node": ">=0.8"
}
},
+ "node_modules/to-fast-properties": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
+ "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==",
+ "engines": {
+ "node": ">=4"
+ }
+ },
"node_modules/to-regex-range": {
"version": "5.0.1",
"license": "MIT",
@@ -5025,6 +8607,14 @@
"node": ">=8.0"
}
},
+ "node_modules/tr46": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz",
+ "integrity": "sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==",
+ "dependencies": {
+ "punycode": "^2.1.0"
+ }
+ },
"node_modules/ts-api-utils": {
"version": "1.0.3",
"dev": true,
@@ -5079,7 +8669,6 @@
},
"node_modules/typed-array-buffer": {
"version": "1.0.0",
- "dev": true,
"license": "MIT",
"dependencies": {
"call-bind": "^1.0.2",
@@ -5092,7 +8681,6 @@
},
"node_modules/typed-array-byte-length": {
"version": "1.0.0",
- "dev": true,
"license": "MIT",
"dependencies": {
"call-bind": "^1.0.2",
@@ -5109,7 +8697,6 @@
},
"node_modules/typed-array-byte-offset": {
"version": "1.0.0",
- "dev": true,
"license": "MIT",
"dependencies": {
"available-typed-arrays": "^1.0.5",
@@ -5127,7 +8714,6 @@
},
"node_modules/typed-array-length": {
"version": "1.0.4",
- "dev": true,
"license": "MIT",
"dependencies": {
"call-bind": "^1.0.2",
@@ -5138,6 +8724,11 @@
"url": "https://github.com/sponsors/ljharb"
}
},
+ "node_modules/typeforce": {
+ "version": "1.18.0",
+ "resolved": "https://registry.npmjs.org/typeforce/-/typeforce-1.18.0.tgz",
+ "integrity": "sha512-7uc1O8h1M1g0rArakJdf0uLRSSgFcYexrVoKo+bzJd32gd4gDy2L/Z+8/FjPnU9ydY3pEnVPtr9FyscYY60K1g=="
+ },
"node_modules/typescript": {
"version": "5.3.3",
"devOptional": true,
@@ -5152,7 +8743,6 @@
},
"node_modules/unbox-primitive": {
"version": "1.0.2",
- "dev": true,
"license": "MIT",
"dependencies": {
"call-bind": "^1.0.2",
@@ -5166,12 +8756,74 @@
},
"node_modules/undici-types": {
"version": "5.26.5",
- "dev": true,
"license": "MIT"
},
+ "node_modules/unicode-canonical-property-names-ecmascript": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz",
+ "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/unicode-match-property-ecmascript": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz",
+ "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==",
+ "dependencies": {
+ "unicode-canonical-property-names-ecmascript": "^2.0.0",
+ "unicode-property-aliases-ecmascript": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/unicode-match-property-value-ecmascript": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz",
+ "integrity": "sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/unicode-property-aliases-ecmascript": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz",
+ "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/unique-string": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz",
+ "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==",
+ "dependencies": {
+ "crypto-random-string": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/universalify": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz",
+ "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==",
+ "engines": {
+ "node": ">= 10.0.0"
+ }
+ },
+ "node_modules/upath": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz",
+ "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==",
+ "engines": {
+ "node": ">=4",
+ "yarn": "*"
+ }
+ },
"node_modules/update-browserslist-db": {
"version": "1.0.13",
- "dev": true,
"funding": [
{
"type": "opencollective",
@@ -5200,7 +8852,6 @@
},
"node_modules/uri-js": {
"version": "4.4.1",
- "dev": true,
"license": "BSD-2-Clause",
"dependencies": {
"punycode": "^2.1.0"
@@ -5249,6 +8900,14 @@
"version": "1.0.2",
"license": "MIT"
},
+ "node_modules/varuint-bitcoin": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/varuint-bitcoin/-/varuint-bitcoin-1.1.2.tgz",
+ "integrity": "sha512-4EVb+w4rx+YfVM32HQX42AbbT7/1f5zwAYhIujKXKk8NQK+JfRVl3pqT3hjNn/L+RstigmGGKVwHA/P0wgITZw==",
+ "dependencies": {
+ "safe-buffer": "^5.1.1"
+ }
+ },
"node_modules/vaul": {
"version": "0.8.9",
"license": "MIT",
@@ -5260,6 +8919,130 @@
"react-dom": "^16.8 || ^17.0 || ^18.0"
}
},
+ "node_modules/watchpack": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz",
+ "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==",
+ "peer": true,
+ "dependencies": {
+ "glob-to-regexp": "^0.4.1",
+ "graceful-fs": "^4.1.2"
+ },
+ "engines": {
+ "node": ">=10.13.0"
+ }
+ },
+ "node_modules/webidl-conversions": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz",
+ "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg=="
+ },
+ "node_modules/webpack": {
+ "version": "5.90.1",
+ "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.90.1.tgz",
+ "integrity": "sha512-SstPdlAC5IvgFnhiRok8hqJo/+ArAbNv7rhU4fnWGHNVfN59HSQFaxZDSAL3IFG2YmqxuRs+IU33milSxbPlog==",
+ "peer": true,
+ "dependencies": {
+ "@types/eslint-scope": "^3.7.3",
+ "@types/estree": "^1.0.5",
+ "@webassemblyjs/ast": "^1.11.5",
+ "@webassemblyjs/wasm-edit": "^1.11.5",
+ "@webassemblyjs/wasm-parser": "^1.11.5",
+ "acorn": "^8.7.1",
+ "acorn-import-assertions": "^1.9.0",
+ "browserslist": "^4.21.10",
+ "chrome-trace-event": "^1.0.2",
+ "enhanced-resolve": "^5.15.0",
+ "es-module-lexer": "^1.2.1",
+ "eslint-scope": "5.1.1",
+ "events": "^3.2.0",
+ "glob-to-regexp": "^0.4.1",
+ "graceful-fs": "^4.2.9",
+ "json-parse-even-better-errors": "^2.3.1",
+ "loader-runner": "^4.2.0",
+ "mime-types": "^2.1.27",
+ "neo-async": "^2.6.2",
+ "schema-utils": "^3.2.0",
+ "tapable": "^2.1.1",
+ "terser-webpack-plugin": "^5.3.10",
+ "watchpack": "^2.4.0",
+ "webpack-sources": "^3.2.3"
+ },
+ "bin": {
+ "webpack": "bin/webpack.js"
+ },
+ "engines": {
+ "node": ">=10.13.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/webpack"
+ },
+ "peerDependenciesMeta": {
+ "webpack-cli": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/webpack-sources": {
+ "version": "3.2.3",
+ "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz",
+ "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==",
+ "peer": true,
+ "engines": {
+ "node": ">=10.13.0"
+ }
+ },
+ "node_modules/webpack/node_modules/eslint-scope": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz",
+ "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==",
+ "peer": true,
+ "dependencies": {
+ "esrecurse": "^4.3.0",
+ "estraverse": "^4.1.1"
+ },
+ "engines": {
+ "node": ">=8.0.0"
+ }
+ },
+ "node_modules/webpack/node_modules/estraverse": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz",
+ "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==",
+ "peer": true,
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/webpack/node_modules/schema-utils": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz",
+ "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==",
+ "peer": true,
+ "dependencies": {
+ "@types/json-schema": "^7.0.8",
+ "ajv": "^6.12.5",
+ "ajv-keywords": "^3.5.2"
+ },
+ "engines": {
+ "node": ">= 10.13.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/webpack"
+ }
+ },
+ "node_modules/whatwg-url": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz",
+ "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==",
+ "dependencies": {
+ "lodash.sortby": "^4.7.0",
+ "tr46": "^1.0.1",
+ "webidl-conversions": "^4.0.2"
+ }
+ },
"node_modules/which": {
"version": "2.0.2",
"license": "ISC",
@@ -5275,7 +9058,6 @@
},
"node_modules/which-boxed-primitive": {
"version": "1.0.2",
- "dev": true,
"license": "MIT",
"dependencies": {
"is-bigint": "^1.0.1",
@@ -5329,7 +9111,6 @@
},
"node_modules/which-typed-array": {
"version": "1.1.13",
- "dev": true,
"license": "MIT",
"dependencies": {
"available-typed-arrays": "^1.0.5",
@@ -5345,6 +9126,275 @@
"url": "https://github.com/sponsors/ljharb"
}
},
+ "node_modules/workbox-background-sync": {
+ "version": "6.6.0",
+ "resolved": "https://registry.npmjs.org/workbox-background-sync/-/workbox-background-sync-6.6.0.tgz",
+ "integrity": "sha512-jkf4ZdgOJxC9u2vztxLuPT/UjlH7m/nWRQ/MgGL0v8BJHoZdVGJd18Kck+a0e55wGXdqyHO+4IQTk0685g4MUw==",
+ "dependencies": {
+ "idb": "^7.0.1",
+ "workbox-core": "6.6.0"
+ }
+ },
+ "node_modules/workbox-broadcast-update": {
+ "version": "6.6.0",
+ "resolved": "https://registry.npmjs.org/workbox-broadcast-update/-/workbox-broadcast-update-6.6.0.tgz",
+ "integrity": "sha512-nm+v6QmrIFaB/yokJmQ/93qIJ7n72NICxIwQwe5xsZiV2aI93MGGyEyzOzDPVz5THEr5rC3FJSsO3346cId64Q==",
+ "dependencies": {
+ "workbox-core": "6.6.0"
+ }
+ },
+ "node_modules/workbox-build": {
+ "version": "6.6.0",
+ "resolved": "https://registry.npmjs.org/workbox-build/-/workbox-build-6.6.0.tgz",
+ "integrity": "sha512-Tjf+gBwOTuGyZwMz2Nk/B13Fuyeo0Q84W++bebbVsfr9iLkDSo6j6PST8tET9HYA58mlRXwlMGpyWO8ETJiXdQ==",
+ "dependencies": {
+ "@apideck/better-ajv-errors": "^0.3.1",
+ "@babel/core": "^7.11.1",
+ "@babel/preset-env": "^7.11.0",
+ "@babel/runtime": "^7.11.2",
+ "@rollup/plugin-babel": "^5.2.0",
+ "@rollup/plugin-node-resolve": "^11.2.1",
+ "@rollup/plugin-replace": "^2.4.1",
+ "@surma/rollup-plugin-off-main-thread": "^2.2.3",
+ "ajv": "^8.6.0",
+ "common-tags": "^1.8.0",
+ "fast-json-stable-stringify": "^2.1.0",
+ "fs-extra": "^9.0.1",
+ "glob": "^7.1.6",
+ "lodash": "^4.17.20",
+ "pretty-bytes": "^5.3.0",
+ "rollup": "^2.43.1",
+ "rollup-plugin-terser": "^7.0.0",
+ "source-map": "^0.8.0-beta.0",
+ "stringify-object": "^3.3.0",
+ "strip-comments": "^2.0.1",
+ "tempy": "^0.6.0",
+ "upath": "^1.2.0",
+ "workbox-background-sync": "6.6.0",
+ "workbox-broadcast-update": "6.6.0",
+ "workbox-cacheable-response": "6.6.0",
+ "workbox-core": "6.6.0",
+ "workbox-expiration": "6.6.0",
+ "workbox-google-analytics": "6.6.0",
+ "workbox-navigation-preload": "6.6.0",
+ "workbox-precaching": "6.6.0",
+ "workbox-range-requests": "6.6.0",
+ "workbox-recipes": "6.6.0",
+ "workbox-routing": "6.6.0",
+ "workbox-strategies": "6.6.0",
+ "workbox-streams": "6.6.0",
+ "workbox-sw": "6.6.0",
+ "workbox-window": "6.6.0"
+ },
+ "engines": {
+ "node": ">=10.0.0"
+ }
+ },
+ "node_modules/workbox-build/node_modules/@apideck/better-ajv-errors": {
+ "version": "0.3.6",
+ "resolved": "https://registry.npmjs.org/@apideck/better-ajv-errors/-/better-ajv-errors-0.3.6.tgz",
+ "integrity": "sha512-P+ZygBLZtkp0qqOAJJVX4oX/sFo5JR3eBWwwuqHHhK0GIgQOKWrAfiAaWX0aArHkRWHMuggFEgAZNxVPwPZYaA==",
+ "dependencies": {
+ "json-schema": "^0.4.0",
+ "jsonpointer": "^5.0.0",
+ "leven": "^3.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "peerDependencies": {
+ "ajv": ">=8"
+ }
+ },
+ "node_modules/workbox-build/node_modules/ajv": {
+ "version": "8.12.0",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz",
+ "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==",
+ "dependencies": {
+ "fast-deep-equal": "^3.1.1",
+ "json-schema-traverse": "^1.0.0",
+ "require-from-string": "^2.0.2",
+ "uri-js": "^4.2.2"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/epoberezkin"
+ }
+ },
+ "node_modules/workbox-build/node_modules/glob": {
+ "version": "7.2.3",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
+ "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
+ "dependencies": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^3.1.1",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
+ },
+ "engines": {
+ "node": "*"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/workbox-build/node_modules/json-schema-traverse": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
+ "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="
+ },
+ "node_modules/workbox-build/node_modules/source-map": {
+ "version": "0.8.0-beta.0",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.8.0-beta.0.tgz",
+ "integrity": "sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==",
+ "dependencies": {
+ "whatwg-url": "^7.0.0"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/workbox-cacheable-response": {
+ "version": "6.6.0",
+ "resolved": "https://registry.npmjs.org/workbox-cacheable-response/-/workbox-cacheable-response-6.6.0.tgz",
+ "integrity": "sha512-JfhJUSQDwsF1Xv3EV1vWzSsCOZn4mQ38bWEBR3LdvOxSPgB65gAM6cS2CX8rkkKHRgiLrN7Wxoyu+TuH67kHrw==",
+ "deprecated": "workbox-background-sync@6.6.0",
+ "dependencies": {
+ "workbox-core": "6.6.0"
+ }
+ },
+ "node_modules/workbox-core": {
+ "version": "6.6.0",
+ "resolved": "https://registry.npmjs.org/workbox-core/-/workbox-core-6.6.0.tgz",
+ "integrity": "sha512-GDtFRF7Yg3DD859PMbPAYPeJyg5gJYXuBQAC+wyrWuuXgpfoOrIQIvFRZnQ7+czTIQjIr1DhLEGFzZanAT/3bQ=="
+ },
+ "node_modules/workbox-expiration": {
+ "version": "6.6.0",
+ "resolved": "https://registry.npmjs.org/workbox-expiration/-/workbox-expiration-6.6.0.tgz",
+ "integrity": "sha512-baplYXcDHbe8vAo7GYvyAmlS4f6998Jff513L4XvlzAOxcl8F620O91guoJ5EOf5qeXG4cGdNZHkkVAPouFCpw==",
+ "dependencies": {
+ "idb": "^7.0.1",
+ "workbox-core": "6.6.0"
+ }
+ },
+ "node_modules/workbox-google-analytics": {
+ "version": "6.6.0",
+ "resolved": "https://registry.npmjs.org/workbox-google-analytics/-/workbox-google-analytics-6.6.0.tgz",
+ "integrity": "sha512-p4DJa6OldXWd6M9zRl0H6vB9lkrmqYFkRQ2xEiNdBFp9U0LhsGO7hsBscVEyH9H2/3eZZt8c97NB2FD9U2NJ+Q==",
+ "dependencies": {
+ "workbox-background-sync": "6.6.0",
+ "workbox-core": "6.6.0",
+ "workbox-routing": "6.6.0",
+ "workbox-strategies": "6.6.0"
+ }
+ },
+ "node_modules/workbox-navigation-preload": {
+ "version": "6.6.0",
+ "resolved": "https://registry.npmjs.org/workbox-navigation-preload/-/workbox-navigation-preload-6.6.0.tgz",
+ "integrity": "sha512-utNEWG+uOfXdaZmvhshrh7KzhDu/1iMHyQOV6Aqup8Mm78D286ugu5k9MFD9SzBT5TcwgwSORVvInaXWbvKz9Q==",
+ "dependencies": {
+ "workbox-core": "6.6.0"
+ }
+ },
+ "node_modules/workbox-precaching": {
+ "version": "6.6.0",
+ "resolved": "https://registry.npmjs.org/workbox-precaching/-/workbox-precaching-6.6.0.tgz",
+ "integrity": "sha512-eYu/7MqtRZN1IDttl/UQcSZFkHP7dnvr/X3Vn6Iw6OsPMruQHiVjjomDFCNtd8k2RdjLs0xiz9nq+t3YVBcWPw==",
+ "dependencies": {
+ "workbox-core": "6.6.0",
+ "workbox-routing": "6.6.0",
+ "workbox-strategies": "6.6.0"
+ }
+ },
+ "node_modules/workbox-range-requests": {
+ "version": "6.6.0",
+ "resolved": "https://registry.npmjs.org/workbox-range-requests/-/workbox-range-requests-6.6.0.tgz",
+ "integrity": "sha512-V3aICz5fLGq5DpSYEU8LxeXvsT//mRWzKrfBOIxzIdQnV/Wj7R+LyJVTczi4CQ4NwKhAaBVaSujI1cEjXW+hTw==",
+ "dependencies": {
+ "workbox-core": "6.6.0"
+ }
+ },
+ "node_modules/workbox-recipes": {
+ "version": "6.6.0",
+ "resolved": "https://registry.npmjs.org/workbox-recipes/-/workbox-recipes-6.6.0.tgz",
+ "integrity": "sha512-TFi3kTgYw73t5tg73yPVqQC8QQjxJSeqjXRO4ouE/CeypmP2O/xqmB/ZFBBQazLTPxILUQ0b8aeh0IuxVn9a6A==",
+ "dependencies": {
+ "workbox-cacheable-response": "6.6.0",
+ "workbox-core": "6.6.0",
+ "workbox-expiration": "6.6.0",
+ "workbox-precaching": "6.6.0",
+ "workbox-routing": "6.6.0",
+ "workbox-strategies": "6.6.0"
+ }
+ },
+ "node_modules/workbox-routing": {
+ "version": "6.6.0",
+ "resolved": "https://registry.npmjs.org/workbox-routing/-/workbox-routing-6.6.0.tgz",
+ "integrity": "sha512-x8gdN7VDBiLC03izAZRfU+WKUXJnbqt6PG9Uh0XuPRzJPpZGLKce/FkOX95dWHRpOHWLEq8RXzjW0O+POSkKvw==",
+ "dependencies": {
+ "workbox-core": "6.6.0"
+ }
+ },
+ "node_modules/workbox-strategies": {
+ "version": "6.6.0",
+ "resolved": "https://registry.npmjs.org/workbox-strategies/-/workbox-strategies-6.6.0.tgz",
+ "integrity": "sha512-eC07XGuINAKUWDnZeIPdRdVja4JQtTuc35TZ8SwMb1ztjp7Ddq2CJ4yqLvWzFWGlYI7CG/YGqaETntTxBGdKgQ==",
+ "dependencies": {
+ "workbox-core": "6.6.0"
+ }
+ },
+ "node_modules/workbox-streams": {
+ "version": "6.6.0",
+ "resolved": "https://registry.npmjs.org/workbox-streams/-/workbox-streams-6.6.0.tgz",
+ "integrity": "sha512-rfMJLVvwuED09CnH1RnIep7L9+mj4ufkTyDPVaXPKlhi9+0czCu+SJggWCIFbPpJaAZmp2iyVGLqS3RUmY3fxg==",
+ "dependencies": {
+ "workbox-core": "6.6.0",
+ "workbox-routing": "6.6.0"
+ }
+ },
+ "node_modules/workbox-sw": {
+ "version": "6.6.0",
+ "resolved": "https://registry.npmjs.org/workbox-sw/-/workbox-sw-6.6.0.tgz",
+ "integrity": "sha512-R2IkwDokbtHUE4Kus8pKO5+VkPHD2oqTgl+XJwh4zbF1HyjAbgNmK/FneZHVU7p03XUt9ICfuGDYISWG9qV/CQ=="
+ },
+ "node_modules/workbox-webpack-plugin": {
+ "version": "6.6.0",
+ "resolved": "https://registry.npmjs.org/workbox-webpack-plugin/-/workbox-webpack-plugin-6.6.0.tgz",
+ "integrity": "sha512-xNZIZHalboZU66Wa7x1YkjIqEy1gTR+zPM+kjrYJzqN7iurYZBctBLISyScjhkJKYuRrZUP0iqViZTh8rS0+3A==",
+ "dependencies": {
+ "fast-json-stable-stringify": "^2.1.0",
+ "pretty-bytes": "^5.4.1",
+ "upath": "^1.2.0",
+ "webpack-sources": "^1.4.3",
+ "workbox-build": "6.6.0"
+ },
+ "engines": {
+ "node": ">=10.0.0"
+ },
+ "peerDependencies": {
+ "webpack": "^4.4.0 || ^5.9.0"
+ }
+ },
+ "node_modules/workbox-webpack-plugin/node_modules/webpack-sources": {
+ "version": "1.4.3",
+ "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz",
+ "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==",
+ "dependencies": {
+ "source-list-map": "^2.0.0",
+ "source-map": "~0.6.1"
+ }
+ },
+ "node_modules/workbox-window": {
+ "version": "6.6.0",
+ "resolved": "https://registry.npmjs.org/workbox-window/-/workbox-window-6.6.0.tgz",
+ "integrity": "sha512-L4N9+vka17d16geaJXXRjENLFldvkWy7JyGxElRD0JvBxvFEd8LOhr+uXCcar/NzAmIBRv9EZ+M+Qr4mOoBITw==",
+ "dependencies": {
+ "@types/trusted-types": "^2.0.2",
+ "workbox-core": "6.6.0"
+ }
+ },
"node_modules/wrap-ansi": {
"version": "8.1.0",
"license": "MIT",
@@ -5395,7 +9445,6 @@
},
"node_modules/wrappy": {
"version": "1.0.2",
- "dev": true,
"license": "ISC"
},
"node_modules/yallist": {
@@ -5420,6 +9469,14 @@
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
+ },
+ "node_modules/zod": {
+ "version": "3.23.8",
+ "resolved": "https://registry.npmjs.org/zod/-/zod-3.23.8.tgz",
+ "integrity": "sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==",
+ "funding": {
+ "url": "https://github.com/sponsors/colinhacks"
+ }
}
}
}
diff --git a/lumina/package.json b/lumina/package.json
index 8b3bd08..53f4f35 100644
--- a/lumina/package.json
+++ b/lumina/package.json
@@ -9,36 +9,48 @@
"lint": "next lint"
},
"dependencies": {
+ "@hookform/resolvers": "^3.4.0",
+ "@radix-ui/react-accordion": "^1.1.2",
"@radix-ui/react-avatar": "^1.0.4",
"@radix-ui/react-dialog": "^1.0.5",
"@radix-ui/react-dropdown-menu": "^2.0.6",
"@radix-ui/react-icons": "^1.3.0",
+ "@radix-ui/react-label": "^2.0.2",
"@radix-ui/react-navigation-menu": "^1.1.4",
+ "@radix-ui/react-scroll-area": "^1.0.5",
"@radix-ui/react-slot": "^1.0.2",
"@radix-ui/react-tabs": "^1.0.4",
+ "@radix-ui/react-toast": "^1.1.5",
"@radix-ui/react-tooltip": "^1.0.7",
+ "bolt11": "^1.4.1",
"class-variance-authority": "^0.7.0",
"clsx": "^2.1.0",
"embla-carousel-react": "^8.0.0-rc21",
+ "light-bolt11-decoder": "^3.1.1",
"lucide-react": "^0.316.0",
"next": "14.1.0",
+ "next-pwa": "^5.6.0",
"next-themes": "^0.2.1",
"nostr-react": "^0.7.0",
+ "nostr-tools": "^2.4.0",
"react": "^18",
"react-dom": "^18",
+ "react-hook-form": "^7.51.4",
+ "react-icons": "^5.1.0",
"tailwind-merge": "^2.2.1",
"tailwindcss-animate": "^1.0.7",
- "vaul": "^0.8.9"
+ "vaul": "^0.8.9",
+ "zod": "^3.23.8"
},
"devDependencies": {
- "typescript": "^5",
"@types/node": "^20",
"@types/react": "^18",
"@types/react-dom": "^18",
"autoprefixer": "^10.0.1",
+ "eslint": "^8",
+ "eslint-config-next": "14.1.0",
"postcss": "^8",
"tailwindcss": "^3.3.0",
- "eslint": "^8",
- "eslint-config-next": "14.1.0"
+ "typescript": "^5"
}
}
diff --git a/lumina/public/.well-known/nostr.json b/lumina/public/.well-known/nostr.json
new file mode 100644
index 0000000..61d6ad7
--- /dev/null
+++ b/lumina/public/.well-known/nostr.json
@@ -0,0 +1 @@
+{"names":{"_":"ff363e4afc398b7dd8ceb0b2e73e96fe9621ababc22ab150ffbb1aa0f34df8b2"}}
\ No newline at end of file
diff --git a/lumina/public/android/android-launchericon-144-144.png b/lumina/public/android/android-launchericon-144-144.png
new file mode 100644
index 0000000..d4a4a55
Binary files /dev/null and b/lumina/public/android/android-launchericon-144-144.png differ
diff --git a/lumina/public/android/android-launchericon-192-192.png b/lumina/public/android/android-launchericon-192-192.png
new file mode 100644
index 0000000..25c8c20
Binary files /dev/null and b/lumina/public/android/android-launchericon-192-192.png differ
diff --git a/lumina/public/android/android-launchericon-48-48.png b/lumina/public/android/android-launchericon-48-48.png
new file mode 100644
index 0000000..a799fe3
Binary files /dev/null and b/lumina/public/android/android-launchericon-48-48.png differ
diff --git a/lumina/public/android/android-launchericon-512-512.png b/lumina/public/android/android-launchericon-512-512.png
new file mode 100644
index 0000000..a33fbdb
Binary files /dev/null and b/lumina/public/android/android-launchericon-512-512.png differ
diff --git a/lumina/public/android/android-launchericon-72-72.png b/lumina/public/android/android-launchericon-72-72.png
new file mode 100644
index 0000000..18bce2f
Binary files /dev/null and b/lumina/public/android/android-launchericon-72-72.png differ
diff --git a/lumina/public/android/android-launchericon-96-96.png b/lumina/public/android/android-launchericon-96-96.png
new file mode 100644
index 0000000..888d385
Binary files /dev/null and b/lumina/public/android/android-launchericon-96-96.png differ
diff --git a/lumina/public/icons.json b/lumina/public/icons.json
new file mode 100644
index 0000000..95703c0
--- /dev/null
+++ b/lumina/public/icons.json
@@ -0,0 +1,452 @@
+{
+ "icons": [
+ {
+ "src": "windows11/SmallTile.scale-100.png",
+ "sizes": "71x71"
+ },
+ {
+ "src": "windows11/SmallTile.scale-125.png",
+ "sizes": "89x89"
+ },
+ {
+ "src": "windows11/SmallTile.scale-150.png",
+ "sizes": "107x107"
+ },
+ {
+ "src": "windows11/SmallTile.scale-200.png",
+ "sizes": "142x142"
+ },
+ {
+ "src": "windows11/SmallTile.scale-400.png",
+ "sizes": "284x284"
+ },
+ {
+ "src": "windows11/Square150x150Logo.scale-100.png",
+ "sizes": "150x150"
+ },
+ {
+ "src": "windows11/Square150x150Logo.scale-125.png",
+ "sizes": "188x188"
+ },
+ {
+ "src": "windows11/Square150x150Logo.scale-150.png",
+ "sizes": "225x225"
+ },
+ {
+ "src": "windows11/Square150x150Logo.scale-200.png",
+ "sizes": "300x300"
+ },
+ {
+ "src": "windows11/Square150x150Logo.scale-400.png",
+ "sizes": "600x600"
+ },
+ {
+ "src": "windows11/Wide310x150Logo.scale-100.png",
+ "sizes": "310x150"
+ },
+ {
+ "src": "windows11/Wide310x150Logo.scale-125.png",
+ "sizes": "388x188"
+ },
+ {
+ "src": "windows11/Wide310x150Logo.scale-150.png",
+ "sizes": "465x225"
+ },
+ {
+ "src": "windows11/Wide310x150Logo.scale-200.png",
+ "sizes": "620x300"
+ },
+ {
+ "src": "windows11/Wide310x150Logo.scale-400.png",
+ "sizes": "1240x600"
+ },
+ {
+ "src": "windows11/LargeTile.scale-100.png",
+ "sizes": "310x310"
+ },
+ {
+ "src": "windows11/LargeTile.scale-125.png",
+ "sizes": "388x388"
+ },
+ {
+ "src": "windows11/LargeTile.scale-150.png",
+ "sizes": "465x465"
+ },
+ {
+ "src": "windows11/LargeTile.scale-200.png",
+ "sizes": "620x620"
+ },
+ {
+ "src": "windows11/LargeTile.scale-400.png",
+ "sizes": "1240x1240"
+ },
+ {
+ "src": "windows11/Square44x44Logo.scale-100.png",
+ "sizes": "44x44"
+ },
+ {
+ "src": "windows11/Square44x44Logo.scale-125.png",
+ "sizes": "55x55"
+ },
+ {
+ "src": "windows11/Square44x44Logo.scale-150.png",
+ "sizes": "66x66"
+ },
+ {
+ "src": "windows11/Square44x44Logo.scale-200.png",
+ "sizes": "88x88"
+ },
+ {
+ "src": "windows11/Square44x44Logo.scale-400.png",
+ "sizes": "176x176"
+ },
+ {
+ "src": "windows11/StoreLogo.scale-100.png",
+ "sizes": "50x50"
+ },
+ {
+ "src": "windows11/StoreLogo.scale-125.png",
+ "sizes": "63x63"
+ },
+ {
+ "src": "windows11/StoreLogo.scale-150.png",
+ "sizes": "75x75"
+ },
+ {
+ "src": "windows11/StoreLogo.scale-200.png",
+ "sizes": "100x100"
+ },
+ {
+ "src": "windows11/StoreLogo.scale-400.png",
+ "sizes": "200x200"
+ },
+ {
+ "src": "windows11/SplashScreen.scale-100.png",
+ "sizes": "620x300"
+ },
+ {
+ "src": "windows11/SplashScreen.scale-125.png",
+ "sizes": "775x375"
+ },
+ {
+ "src": "windows11/SplashScreen.scale-150.png",
+ "sizes": "930x450"
+ },
+ {
+ "src": "windows11/SplashScreen.scale-200.png",
+ "sizes": "1240x600"
+ },
+ {
+ "src": "windows11/SplashScreen.scale-400.png",
+ "sizes": "2480x1200"
+ },
+ {
+ "src": "windows11/Square44x44Logo.targetsize-16.png",
+ "sizes": "16x16"
+ },
+ {
+ "src": "windows11/Square44x44Logo.targetsize-20.png",
+ "sizes": "20x20"
+ },
+ {
+ "src": "windows11/Square44x44Logo.targetsize-24.png",
+ "sizes": "24x24"
+ },
+ {
+ "src": "windows11/Square44x44Logo.targetsize-30.png",
+ "sizes": "30x30"
+ },
+ {
+ "src": "windows11/Square44x44Logo.targetsize-32.png",
+ "sizes": "32x32"
+ },
+ {
+ "src": "windows11/Square44x44Logo.targetsize-36.png",
+ "sizes": "36x36"
+ },
+ {
+ "src": "windows11/Square44x44Logo.targetsize-40.png",
+ "sizes": "40x40"
+ },
+ {
+ "src": "windows11/Square44x44Logo.targetsize-44.png",
+ "sizes": "44x44"
+ },
+ {
+ "src": "windows11/Square44x44Logo.targetsize-48.png",
+ "sizes": "48x48"
+ },
+ {
+ "src": "windows11/Square44x44Logo.targetsize-60.png",
+ "sizes": "60x60"
+ },
+ {
+ "src": "windows11/Square44x44Logo.targetsize-64.png",
+ "sizes": "64x64"
+ },
+ {
+ "src": "windows11/Square44x44Logo.targetsize-72.png",
+ "sizes": "72x72"
+ },
+ {
+ "src": "windows11/Square44x44Logo.targetsize-80.png",
+ "sizes": "80x80"
+ },
+ {
+ "src": "windows11/Square44x44Logo.targetsize-96.png",
+ "sizes": "96x96"
+ },
+ {
+ "src": "windows11/Square44x44Logo.targetsize-256.png",
+ "sizes": "256x256"
+ },
+ {
+ "src": "windows11/Square44x44Logo.altform-unplated_targetsize-16.png",
+ "sizes": "16x16"
+ },
+ {
+ "src": "windows11/Square44x44Logo.altform-unplated_targetsize-20.png",
+ "sizes": "20x20"
+ },
+ {
+ "src": "windows11/Square44x44Logo.altform-unplated_targetsize-24.png",
+ "sizes": "24x24"
+ },
+ {
+ "src": "windows11/Square44x44Logo.altform-unplated_targetsize-30.png",
+ "sizes": "30x30"
+ },
+ {
+ "src": "windows11/Square44x44Logo.altform-unplated_targetsize-32.png",
+ "sizes": "32x32"
+ },
+ {
+ "src": "windows11/Square44x44Logo.altform-unplated_targetsize-36.png",
+ "sizes": "36x36"
+ },
+ {
+ "src": "windows11/Square44x44Logo.altform-unplated_targetsize-40.png",
+ "sizes": "40x40"
+ },
+ {
+ "src": "windows11/Square44x44Logo.altform-unplated_targetsize-44.png",
+ "sizes": "44x44"
+ },
+ {
+ "src": "windows11/Square44x44Logo.altform-unplated_targetsize-48.png",
+ "sizes": "48x48"
+ },
+ {
+ "src": "windows11/Square44x44Logo.altform-unplated_targetsize-60.png",
+ "sizes": "60x60"
+ },
+ {
+ "src": "windows11/Square44x44Logo.altform-unplated_targetsize-64.png",
+ "sizes": "64x64"
+ },
+ {
+ "src": "windows11/Square44x44Logo.altform-unplated_targetsize-72.png",
+ "sizes": "72x72"
+ },
+ {
+ "src": "windows11/Square44x44Logo.altform-unplated_targetsize-80.png",
+ "sizes": "80x80"
+ },
+ {
+ "src": "windows11/Square44x44Logo.altform-unplated_targetsize-96.png",
+ "sizes": "96x96"
+ },
+ {
+ "src": "windows11/Square44x44Logo.altform-unplated_targetsize-256.png",
+ "sizes": "256x256"
+ },
+ {
+ "src": "windows11/Square44x44Logo.altform-lightunplated_targetsize-16.png",
+ "sizes": "16x16"
+ },
+ {
+ "src": "windows11/Square44x44Logo.altform-lightunplated_targetsize-20.png",
+ "sizes": "20x20"
+ },
+ {
+ "src": "windows11/Square44x44Logo.altform-lightunplated_targetsize-24.png",
+ "sizes": "24x24"
+ },
+ {
+ "src": "windows11/Square44x44Logo.altform-lightunplated_targetsize-30.png",
+ "sizes": "30x30"
+ },
+ {
+ "src": "windows11/Square44x44Logo.altform-lightunplated_targetsize-32.png",
+ "sizes": "32x32"
+ },
+ {
+ "src": "windows11/Square44x44Logo.altform-lightunplated_targetsize-36.png",
+ "sizes": "36x36"
+ },
+ {
+ "src": "windows11/Square44x44Logo.altform-lightunplated_targetsize-40.png",
+ "sizes": "40x40"
+ },
+ {
+ "src": "windows11/Square44x44Logo.altform-lightunplated_targetsize-44.png",
+ "sizes": "44x44"
+ },
+ {
+ "src": "windows11/Square44x44Logo.altform-lightunplated_targetsize-48.png",
+ "sizes": "48x48"
+ },
+ {
+ "src": "windows11/Square44x44Logo.altform-lightunplated_targetsize-60.png",
+ "sizes": "60x60"
+ },
+ {
+ "src": "windows11/Square44x44Logo.altform-lightunplated_targetsize-64.png",
+ "sizes": "64x64"
+ },
+ {
+ "src": "windows11/Square44x44Logo.altform-lightunplated_targetsize-72.png",
+ "sizes": "72x72"
+ },
+ {
+ "src": "windows11/Square44x44Logo.altform-lightunplated_targetsize-80.png",
+ "sizes": "80x80"
+ },
+ {
+ "src": "windows11/Square44x44Logo.altform-lightunplated_targetsize-96.png",
+ "sizes": "96x96"
+ },
+ {
+ "src": "windows11/Square44x44Logo.altform-lightunplated_targetsize-256.png",
+ "sizes": "256x256"
+ },
+ {
+ "src": "android/android-launchericon-512-512.png",
+ "sizes": "512x512"
+ },
+ {
+ "src": "android/android-launchericon-192-192.png",
+ "sizes": "192x192"
+ },
+ {
+ "src": "android/android-launchericon-144-144.png",
+ "sizes": "144x144"
+ },
+ {
+ "src": "android/android-launchericon-96-96.png",
+ "sizes": "96x96"
+ },
+ {
+ "src": "android/android-launchericon-72-72.png",
+ "sizes": "72x72"
+ },
+ {
+ "src": "android/android-launchericon-48-48.png",
+ "sizes": "48x48"
+ },
+ {
+ "src": "ios/16.png",
+ "sizes": "16x16"
+ },
+ {
+ "src": "ios/20.png",
+ "sizes": "20x20"
+ },
+ {
+ "src": "ios/29.png",
+ "sizes": "29x29"
+ },
+ {
+ "src": "ios/32.png",
+ "sizes": "32x32"
+ },
+ {
+ "src": "ios/40.png",
+ "sizes": "40x40"
+ },
+ {
+ "src": "ios/50.png",
+ "sizes": "50x50"
+ },
+ {
+ "src": "ios/57.png",
+ "sizes": "57x57"
+ },
+ {
+ "src": "ios/58.png",
+ "sizes": "58x58"
+ },
+ {
+ "src": "ios/60.png",
+ "sizes": "60x60"
+ },
+ {
+ "src": "ios/64.png",
+ "sizes": "64x64"
+ },
+ {
+ "src": "ios/72.png",
+ "sizes": "72x72"
+ },
+ {
+ "src": "ios/76.png",
+ "sizes": "76x76"
+ },
+ {
+ "src": "ios/80.png",
+ "sizes": "80x80"
+ },
+ {
+ "src": "ios/87.png",
+ "sizes": "87x87"
+ },
+ {
+ "src": "ios/100.png",
+ "sizes": "100x100"
+ },
+ {
+ "src": "ios/114.png",
+ "sizes": "114x114"
+ },
+ {
+ "src": "ios/120.png",
+ "sizes": "120x120"
+ },
+ {
+ "src": "ios/128.png",
+ "sizes": "128x128"
+ },
+ {
+ "src": "ios/144.png",
+ "sizes": "144x144"
+ },
+ {
+ "src": "ios/152.png",
+ "sizes": "152x152"
+ },
+ {
+ "src": "ios/167.png",
+ "sizes": "167x167"
+ },
+ {
+ "src": "ios/180.png",
+ "sizes": "180x180"
+ },
+ {
+ "src": "ios/192.png",
+ "sizes": "192x192"
+ },
+ {
+ "src": "ios/256.png",
+ "sizes": "256x256"
+ },
+ {
+ "src": "ios/512.png",
+ "sizes": "512x512"
+ },
+ {
+ "src": "ios/1024.png",
+ "sizes": "1024x1024"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/lumina/public/ios/100.png b/lumina/public/ios/100.png
new file mode 100644
index 0000000..ac6d44b
Binary files /dev/null and b/lumina/public/ios/100.png differ
diff --git a/lumina/public/ios/1024.png b/lumina/public/ios/1024.png
new file mode 100644
index 0000000..a21f973
Binary files /dev/null and b/lumina/public/ios/1024.png differ
diff --git a/lumina/public/ios/114.png b/lumina/public/ios/114.png
new file mode 100644
index 0000000..248fd92
Binary files /dev/null and b/lumina/public/ios/114.png differ
diff --git a/lumina/public/ios/120.png b/lumina/public/ios/120.png
new file mode 100644
index 0000000..76a6795
Binary files /dev/null and b/lumina/public/ios/120.png differ
diff --git a/lumina/public/ios/128.png b/lumina/public/ios/128.png
new file mode 100644
index 0000000..8045ce9
Binary files /dev/null and b/lumina/public/ios/128.png differ
diff --git a/lumina/public/ios/144.png b/lumina/public/ios/144.png
new file mode 100644
index 0000000..d4a4a55
Binary files /dev/null and b/lumina/public/ios/144.png differ
diff --git a/lumina/public/ios/152.png b/lumina/public/ios/152.png
new file mode 100644
index 0000000..0498f21
Binary files /dev/null and b/lumina/public/ios/152.png differ
diff --git a/lumina/public/ios/16.png b/lumina/public/ios/16.png
new file mode 100644
index 0000000..0b69799
Binary files /dev/null and b/lumina/public/ios/16.png differ
diff --git a/lumina/public/ios/167.png b/lumina/public/ios/167.png
new file mode 100644
index 0000000..f3c604d
Binary files /dev/null and b/lumina/public/ios/167.png differ
diff --git a/lumina/public/ios/180.png b/lumina/public/ios/180.png
new file mode 100644
index 0000000..57f7d23
Binary files /dev/null and b/lumina/public/ios/180.png differ
diff --git a/lumina/public/ios/192.png b/lumina/public/ios/192.png
new file mode 100644
index 0000000..25c8c20
Binary files /dev/null and b/lumina/public/ios/192.png differ
diff --git a/lumina/public/ios/20.png b/lumina/public/ios/20.png
new file mode 100644
index 0000000..3ed10bf
Binary files /dev/null and b/lumina/public/ios/20.png differ
diff --git a/lumina/public/ios/256.png b/lumina/public/ios/256.png
new file mode 100644
index 0000000..2664d2b
Binary files /dev/null and b/lumina/public/ios/256.png differ
diff --git a/lumina/public/ios/29.png b/lumina/public/ios/29.png
new file mode 100644
index 0000000..350e536
Binary files /dev/null and b/lumina/public/ios/29.png differ
diff --git a/lumina/public/ios/32.png b/lumina/public/ios/32.png
new file mode 100644
index 0000000..58954a6
Binary files /dev/null and b/lumina/public/ios/32.png differ
diff --git a/lumina/public/ios/40.png b/lumina/public/ios/40.png
new file mode 100644
index 0000000..ebb031a
Binary files /dev/null and b/lumina/public/ios/40.png differ
diff --git a/lumina/public/ios/50.png b/lumina/public/ios/50.png
new file mode 100644
index 0000000..f5d5883
Binary files /dev/null and b/lumina/public/ios/50.png differ
diff --git a/lumina/public/ios/512.png b/lumina/public/ios/512.png
new file mode 100644
index 0000000..a33fbdb
Binary files /dev/null and b/lumina/public/ios/512.png differ
diff --git a/lumina/public/ios/57.png b/lumina/public/ios/57.png
new file mode 100644
index 0000000..f93af22
Binary files /dev/null and b/lumina/public/ios/57.png differ
diff --git a/lumina/public/ios/58.png b/lumina/public/ios/58.png
new file mode 100644
index 0000000..4ca7799
Binary files /dev/null and b/lumina/public/ios/58.png differ
diff --git a/lumina/public/ios/60.png b/lumina/public/ios/60.png
new file mode 100644
index 0000000..8839d2e
Binary files /dev/null and b/lumina/public/ios/60.png differ
diff --git a/lumina/public/ios/64.png b/lumina/public/ios/64.png
new file mode 100644
index 0000000..4b6c425
Binary files /dev/null and b/lumina/public/ios/64.png differ
diff --git a/lumina/public/ios/72.png b/lumina/public/ios/72.png
new file mode 100644
index 0000000..18bce2f
Binary files /dev/null and b/lumina/public/ios/72.png differ
diff --git a/lumina/public/ios/76.png b/lumina/public/ios/76.png
new file mode 100644
index 0000000..bd58955
Binary files /dev/null and b/lumina/public/ios/76.png differ
diff --git a/lumina/public/ios/80.png b/lumina/public/ios/80.png
new file mode 100644
index 0000000..0d2cf20
Binary files /dev/null and b/lumina/public/ios/80.png differ
diff --git a/lumina/public/ios/87.png b/lumina/public/ios/87.png
new file mode 100644
index 0000000..a28192c
Binary files /dev/null and b/lumina/public/ios/87.png differ
diff --git a/lumina/public/lumina-lightning.png b/lumina/public/lumina-lightning.png
new file mode 100644
index 0000000..a7a3240
Binary files /dev/null and b/lumina/public/lumina-lightning.png differ
diff --git a/lumina/public/lumina.png b/lumina/public/lumina.png
new file mode 100644
index 0000000..4122889
Binary files /dev/null and b/lumina/public/lumina.png differ
diff --git a/lumina/public/manifest.json b/lumina/public/manifest.json
new file mode 100644
index 0000000..af5ad8a
--- /dev/null
+++ b/lumina/public/manifest.json
@@ -0,0 +1,459 @@
+{
+ "name": "LUMINA",
+ "short_name": "LUMINA",
+ "icons": [
+ {
+ "src": "windows11/SmallTile.scale-100.png",
+ "sizes": "71x71"
+ },
+ {
+ "src": "windows11/SmallTile.scale-125.png",
+ "sizes": "89x89"
+ },
+ {
+ "src": "windows11/SmallTile.scale-150.png",
+ "sizes": "107x107"
+ },
+ {
+ "src": "windows11/SmallTile.scale-200.png",
+ "sizes": "142x142"
+ },
+ {
+ "src": "windows11/SmallTile.scale-400.png",
+ "sizes": "284x284"
+ },
+ {
+ "src": "windows11/Square150x150Logo.scale-100.png",
+ "sizes": "150x150"
+ },
+ {
+ "src": "windows11/Square150x150Logo.scale-125.png",
+ "sizes": "188x188"
+ },
+ {
+ "src": "windows11/Square150x150Logo.scale-150.png",
+ "sizes": "225x225"
+ },
+ {
+ "src": "windows11/Square150x150Logo.scale-200.png",
+ "sizes": "300x300"
+ },
+ {
+ "src": "windows11/Square150x150Logo.scale-400.png",
+ "sizes": "600x600"
+ },
+ {
+ "src": "windows11/Wide310x150Logo.scale-100.png",
+ "sizes": "310x150"
+ },
+ {
+ "src": "windows11/Wide310x150Logo.scale-125.png",
+ "sizes": "388x188"
+ },
+ {
+ "src": "windows11/Wide310x150Logo.scale-150.png",
+ "sizes": "465x225"
+ },
+ {
+ "src": "windows11/Wide310x150Logo.scale-200.png",
+ "sizes": "620x300"
+ },
+ {
+ "src": "windows11/Wide310x150Logo.scale-400.png",
+ "sizes": "1240x600"
+ },
+ {
+ "src": "windows11/LargeTile.scale-100.png",
+ "sizes": "310x310"
+ },
+ {
+ "src": "windows11/LargeTile.scale-125.png",
+ "sizes": "388x388"
+ },
+ {
+ "src": "windows11/LargeTile.scale-150.png",
+ "sizes": "465x465"
+ },
+ {
+ "src": "windows11/LargeTile.scale-200.png",
+ "sizes": "620x620"
+ },
+ {
+ "src": "windows11/LargeTile.scale-400.png",
+ "sizes": "1240x1240"
+ },
+ {
+ "src": "windows11/Square44x44Logo.scale-100.png",
+ "sizes": "44x44"
+ },
+ {
+ "src": "windows11/Square44x44Logo.scale-125.png",
+ "sizes": "55x55"
+ },
+ {
+ "src": "windows11/Square44x44Logo.scale-150.png",
+ "sizes": "66x66"
+ },
+ {
+ "src": "windows11/Square44x44Logo.scale-200.png",
+ "sizes": "88x88"
+ },
+ {
+ "src": "windows11/Square44x44Logo.scale-400.png",
+ "sizes": "176x176"
+ },
+ {
+ "src": "windows11/StoreLogo.scale-100.png",
+ "sizes": "50x50"
+ },
+ {
+ "src": "windows11/StoreLogo.scale-125.png",
+ "sizes": "63x63"
+ },
+ {
+ "src": "windows11/StoreLogo.scale-150.png",
+ "sizes": "75x75"
+ },
+ {
+ "src": "windows11/StoreLogo.scale-200.png",
+ "sizes": "100x100"
+ },
+ {
+ "src": "windows11/StoreLogo.scale-400.png",
+ "sizes": "200x200"
+ },
+ {
+ "src": "windows11/SplashScreen.scale-100.png",
+ "sizes": "620x300"
+ },
+ {
+ "src": "windows11/SplashScreen.scale-125.png",
+ "sizes": "775x375"
+ },
+ {
+ "src": "windows11/SplashScreen.scale-150.png",
+ "sizes": "930x450"
+ },
+ {
+ "src": "windows11/SplashScreen.scale-200.png",
+ "sizes": "1240x600"
+ },
+ {
+ "src": "windows11/SplashScreen.scale-400.png",
+ "sizes": "2480x1200"
+ },
+ {
+ "src": "windows11/Square44x44Logo.targetsize-16.png",
+ "sizes": "16x16"
+ },
+ {
+ "src": "windows11/Square44x44Logo.targetsize-20.png",
+ "sizes": "20x20"
+ },
+ {
+ "src": "windows11/Square44x44Logo.targetsize-24.png",
+ "sizes": "24x24"
+ },
+ {
+ "src": "windows11/Square44x44Logo.targetsize-30.png",
+ "sizes": "30x30"
+ },
+ {
+ "src": "windows11/Square44x44Logo.targetsize-32.png",
+ "sizes": "32x32"
+ },
+ {
+ "src": "windows11/Square44x44Logo.targetsize-36.png",
+ "sizes": "36x36"
+ },
+ {
+ "src": "windows11/Square44x44Logo.targetsize-40.png",
+ "sizes": "40x40"
+ },
+ {
+ "src": "windows11/Square44x44Logo.targetsize-44.png",
+ "sizes": "44x44"
+ },
+ {
+ "src": "windows11/Square44x44Logo.targetsize-48.png",
+ "sizes": "48x48"
+ },
+ {
+ "src": "windows11/Square44x44Logo.targetsize-60.png",
+ "sizes": "60x60"
+ },
+ {
+ "src": "windows11/Square44x44Logo.targetsize-64.png",
+ "sizes": "64x64"
+ },
+ {
+ "src": "windows11/Square44x44Logo.targetsize-72.png",
+ "sizes": "72x72"
+ },
+ {
+ "src": "windows11/Square44x44Logo.targetsize-80.png",
+ "sizes": "80x80"
+ },
+ {
+ "src": "windows11/Square44x44Logo.targetsize-96.png",
+ "sizes": "96x96"
+ },
+ {
+ "src": "windows11/Square44x44Logo.targetsize-256.png",
+ "sizes": "256x256"
+ },
+ {
+ "src": "windows11/Square44x44Logo.altform-unplated_targetsize-16.png",
+ "sizes": "16x16"
+ },
+ {
+ "src": "windows11/Square44x44Logo.altform-unplated_targetsize-20.png",
+ "sizes": "20x20"
+ },
+ {
+ "src": "windows11/Square44x44Logo.altform-unplated_targetsize-24.png",
+ "sizes": "24x24"
+ },
+ {
+ "src": "windows11/Square44x44Logo.altform-unplated_targetsize-30.png",
+ "sizes": "30x30"
+ },
+ {
+ "src": "windows11/Square44x44Logo.altform-unplated_targetsize-32.png",
+ "sizes": "32x32"
+ },
+ {
+ "src": "windows11/Square44x44Logo.altform-unplated_targetsize-36.png",
+ "sizes": "36x36"
+ },
+ {
+ "src": "windows11/Square44x44Logo.altform-unplated_targetsize-40.png",
+ "sizes": "40x40"
+ },
+ {
+ "src": "windows11/Square44x44Logo.altform-unplated_targetsize-44.png",
+ "sizes": "44x44"
+ },
+ {
+ "src": "windows11/Square44x44Logo.altform-unplated_targetsize-48.png",
+ "sizes": "48x48"
+ },
+ {
+ "src": "windows11/Square44x44Logo.altform-unplated_targetsize-60.png",
+ "sizes": "60x60"
+ },
+ {
+ "src": "windows11/Square44x44Logo.altform-unplated_targetsize-64.png",
+ "sizes": "64x64"
+ },
+ {
+ "src": "windows11/Square44x44Logo.altform-unplated_targetsize-72.png",
+ "sizes": "72x72"
+ },
+ {
+ "src": "windows11/Square44x44Logo.altform-unplated_targetsize-80.png",
+ "sizes": "80x80"
+ },
+ {
+ "src": "windows11/Square44x44Logo.altform-unplated_targetsize-96.png",
+ "sizes": "96x96"
+ },
+ {
+ "src": "windows11/Square44x44Logo.altform-unplated_targetsize-256.png",
+ "sizes": "256x256"
+ },
+ {
+ "src": "windows11/Square44x44Logo.altform-lightunplated_targetsize-16.png",
+ "sizes": "16x16"
+ },
+ {
+ "src": "windows11/Square44x44Logo.altform-lightunplated_targetsize-20.png",
+ "sizes": "20x20"
+ },
+ {
+ "src": "windows11/Square44x44Logo.altform-lightunplated_targetsize-24.png",
+ "sizes": "24x24"
+ },
+ {
+ "src": "windows11/Square44x44Logo.altform-lightunplated_targetsize-30.png",
+ "sizes": "30x30"
+ },
+ {
+ "src": "windows11/Square44x44Logo.altform-lightunplated_targetsize-32.png",
+ "sizes": "32x32"
+ },
+ {
+ "src": "windows11/Square44x44Logo.altform-lightunplated_targetsize-36.png",
+ "sizes": "36x36"
+ },
+ {
+ "src": "windows11/Square44x44Logo.altform-lightunplated_targetsize-40.png",
+ "sizes": "40x40"
+ },
+ {
+ "src": "windows11/Square44x44Logo.altform-lightunplated_targetsize-44.png",
+ "sizes": "44x44"
+ },
+ {
+ "src": "windows11/Square44x44Logo.altform-lightunplated_targetsize-48.png",
+ "sizes": "48x48"
+ },
+ {
+ "src": "windows11/Square44x44Logo.altform-lightunplated_targetsize-60.png",
+ "sizes": "60x60"
+ },
+ {
+ "src": "windows11/Square44x44Logo.altform-lightunplated_targetsize-64.png",
+ "sizes": "64x64"
+ },
+ {
+ "src": "windows11/Square44x44Logo.altform-lightunplated_targetsize-72.png",
+ "sizes": "72x72"
+ },
+ {
+ "src": "windows11/Square44x44Logo.altform-lightunplated_targetsize-80.png",
+ "sizes": "80x80"
+ },
+ {
+ "src": "windows11/Square44x44Logo.altform-lightunplated_targetsize-96.png",
+ "sizes": "96x96"
+ },
+ {
+ "src": "windows11/Square44x44Logo.altform-lightunplated_targetsize-256.png",
+ "sizes": "256x256"
+ },
+ {
+ "src": "android/android-launchericon-512-512.png",
+ "sizes": "512x512"
+ },
+ {
+ "src": "android/android-launchericon-192-192.png",
+ "sizes": "192x192"
+ },
+ {
+ "src": "android/android-launchericon-144-144.png",
+ "sizes": "144x144"
+ },
+ {
+ "src": "android/android-launchericon-96-96.png",
+ "sizes": "96x96"
+ },
+ {
+ "src": "android/android-launchericon-72-72.png",
+ "sizes": "72x72"
+ },
+ {
+ "src": "android/android-launchericon-48-48.png",
+ "sizes": "48x48"
+ },
+ {
+ "src": "ios/16.png",
+ "sizes": "16x16"
+ },
+ {
+ "src": "ios/20.png",
+ "sizes": "20x20"
+ },
+ {
+ "src": "ios/29.png",
+ "sizes": "29x29"
+ },
+ {
+ "src": "ios/32.png",
+ "sizes": "32x32"
+ },
+ {
+ "src": "ios/40.png",
+ "sizes": "40x40"
+ },
+ {
+ "src": "ios/50.png",
+ "sizes": "50x50"
+ },
+ {
+ "src": "ios/57.png",
+ "sizes": "57x57"
+ },
+ {
+ "src": "ios/58.png",
+ "sizes": "58x58"
+ },
+ {
+ "src": "ios/60.png",
+ "sizes": "60x60"
+ },
+ {
+ "src": "ios/64.png",
+ "sizes": "64x64"
+ },
+ {
+ "src": "ios/72.png",
+ "sizes": "72x72"
+ },
+ {
+ "src": "ios/76.png",
+ "sizes": "76x76"
+ },
+ {
+ "src": "ios/80.png",
+ "sizes": "80x80"
+ },
+ {
+ "src": "ios/87.png",
+ "sizes": "87x87"
+ },
+ {
+ "src": "ios/100.png",
+ "sizes": "100x100"
+ },
+ {
+ "src": "ios/114.png",
+ "sizes": "114x114"
+ },
+ {
+ "src": "ios/120.png",
+ "sizes": "120x120"
+ },
+ {
+ "src": "ios/128.png",
+ "sizes": "128x128"
+ },
+ {
+ "src": "ios/144.png",
+ "sizes": "144x144"
+ },
+ {
+ "src": "ios/152.png",
+ "sizes": "152x152"
+ },
+ {
+ "src": "ios/167.png",
+ "sizes": "167x167"
+ },
+ {
+ "src": "ios/180.png",
+ "sizes": "180x180"
+ },
+ {
+ "src": "ios/192.png",
+ "sizes": "192x192"
+ },
+ {
+ "src": "ios/256.png",
+ "sizes": "256x256"
+ },
+ {
+ "src": "ios/512.png",
+ "sizes": "512x512"
+ },
+ {
+ "src": "ios/1024.png",
+ "sizes": "1024x1024"
+ }
+ ],
+ "theme_color": "#000",
+ "background_color": "#000",
+ "start_url": "/",
+ "display": "standalone",
+ "orientation": "portrait"
+}
\ No newline at end of file
diff --git a/lumina/public/sw.js b/lumina/public/sw.js
new file mode 100644
index 0000000..0f6f4f9
--- /dev/null
+++ b/lumina/public/sw.js
@@ -0,0 +1,101 @@
+/**
+ * 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-bd7e3b9b'], (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/lumina/public/sw.js.map b/lumina/public/sw.js.map
new file mode 100644
index 0000000..117da0f
--- /dev/null
+++ b/lumina/public/sw.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"sw.js","sources":["../../../../../../private/var/folders/2n/30k26sgs1ss4j365tn8wmw8w0000gn/T/67b3ddc72d63f367e96817ee85768b2d/sw.js"],"sourcesContent":["import {registerRoute as workbox_routing_registerRoute} from '/Users/pascal/repos/mroxso/lumina-rocks-website/lumina/node_modules/workbox-routing/registerRoute.mjs';\nimport {NetworkFirst as workbox_strategies_NetworkFirst} from '/Users/pascal/repos/mroxso/lumina-rocks-website/lumina/node_modules/workbox-strategies/NetworkFirst.mjs';\nimport {NetworkOnly as workbox_strategies_NetworkOnly} from '/Users/pascal/repos/mroxso/lumina-rocks-website/lumina/node_modules/workbox-strategies/NetworkOnly.mjs';\nimport {clientsClaim as workbox_core_clientsClaim} from '/Users/pascal/repos/mroxso/lumina-rocks-website/lumina/node_modules/workbox-core/clientsClaim.mjs';/**\n * Welcome to your Workbox-powered service worker!\n *\n * You'll need to register this file in your web app.\n * See https://goo.gl/nhQhGp\n *\n * The rest of the code is auto-generated. Please don't update this file\n * directly; instead, make changes to your Workbox build configuration\n * and re-run your build process.\n * See https://goo.gl/2aRDsh\n */\n\n\nimportScripts(\n \n);\n\n\n\n\n\n\n\nself.skipWaiting();\n\nworkbox_core_clientsClaim();\n\n\n\nworkbox_routing_registerRoute(\"/\", new workbox_strategies_NetworkFirst({ \"cacheName\":\"start-url\", plugins: [{ cacheWillUpdate: async ({ request, response, event, state }) => { if (response && response.type === 'opaqueredirect') { return new Response(response.body, { status: 200, statusText: 'OK', headers: response.headers }) } return response } }] }), 'GET');\nworkbox_routing_registerRoute(/.*/i, new workbox_strategies_NetworkOnly({ \"cacheName\":\"dev\", plugins: [] }), 'GET');\n\n\n\n\n"],"names":["importScripts","self","skipWaiting","workbox_core_clientsClaim","workbox_routing_registerRoute","workbox_strategies_NetworkFirst","plugins","cacheWillUpdate","request","response","event","state","type","Response","body","status","statusText","headers","workbox_strategies_NetworkOnly"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAgBAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAa,EAEZ,CAAA;EAQDC,CAAI,CAAA,CAAA,CAAA,CAACC,CAAW,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAA;AAElBC,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAyB,EAAE,CAAA;AAI3BC,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAA6B,CAAC,CAAA,CAAA,CAAG,CAAE,CAAA,CAAA,CAAA,CAAA,CAAIC,oBAA+B,CAAC,CAAA;EAAE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAW,EAAC,CAAW,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;EAAEC,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAO,EAAE,CAAC,CAAA;GAAEC,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAe,EAAE,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;QAAEC,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;QAAEC,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;QAAEC,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA;AAAEC,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA;AAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA;EAAE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAIF,QAAQ,CAAIA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAQ,CAACG,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,gBAAgB,CAAE,CAAA,CAAA;AAAE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,OAAO,CAAIC,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAQ,CAACJ,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAACK,IAAI,CAAE,CAAA,CAAA;EAAEC,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAM,EAAE,CAAG,CAAA,CAAA,CAAA;EAAEC,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAU,EAAE,CAAI,CAAA,CAAA,CAAA,CAAA;YAAEC,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAER,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAACQ,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA;AAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAA;EAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;EAAE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAOR,QAAQ,CAAA;EAAC,CAAA,CAAA,CAAA,CAAA,CAAA;KAAG,CAAA;AAAE,CAAA,CAAA,CAAC,CAAC,CAAA,CAAE,CAAK,CAAA,CAAA,CAAA,CAAA,CAAC,CAAA;AACxWL,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAA6B,CAAC,CAAA,CAAA,CAAA,CAAA,CAAK,CAAE,CAAA,CAAA,CAAA,CAAA,CAAIc,mBAA8B,CAAC,CAAA;EAAE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAW,EAAC,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA;EAAEZ,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAO,EAAE,CAAA,CAAA;EAAG,CAAC,CAAC,CAAE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAC,CAAA;;"}
\ No newline at end of file
diff --git a/lumina/public/windows11/LargeTile.scale-100.png b/lumina/public/windows11/LargeTile.scale-100.png
new file mode 100644
index 0000000..314c6e4
Binary files /dev/null and b/lumina/public/windows11/LargeTile.scale-100.png differ
diff --git a/lumina/public/windows11/LargeTile.scale-125.png b/lumina/public/windows11/LargeTile.scale-125.png
new file mode 100644
index 0000000..33668d3
Binary files /dev/null and b/lumina/public/windows11/LargeTile.scale-125.png differ
diff --git a/lumina/public/windows11/LargeTile.scale-150.png b/lumina/public/windows11/LargeTile.scale-150.png
new file mode 100644
index 0000000..c6c0a8d
Binary files /dev/null and b/lumina/public/windows11/LargeTile.scale-150.png differ
diff --git a/lumina/public/windows11/LargeTile.scale-200.png b/lumina/public/windows11/LargeTile.scale-200.png
new file mode 100644
index 0000000..e2f0b39
Binary files /dev/null and b/lumina/public/windows11/LargeTile.scale-200.png differ
diff --git a/lumina/public/windows11/LargeTile.scale-400.png b/lumina/public/windows11/LargeTile.scale-400.png
new file mode 100644
index 0000000..7091c28
Binary files /dev/null and b/lumina/public/windows11/LargeTile.scale-400.png differ
diff --git a/lumina/public/windows11/SmallTile.scale-100.png b/lumina/public/windows11/SmallTile.scale-100.png
new file mode 100644
index 0000000..b0d7979
Binary files /dev/null and b/lumina/public/windows11/SmallTile.scale-100.png differ
diff --git a/lumina/public/windows11/SmallTile.scale-125.png b/lumina/public/windows11/SmallTile.scale-125.png
new file mode 100644
index 0000000..071e6e9
Binary files /dev/null and b/lumina/public/windows11/SmallTile.scale-125.png differ
diff --git a/lumina/public/windows11/SmallTile.scale-150.png b/lumina/public/windows11/SmallTile.scale-150.png
new file mode 100644
index 0000000..8fe214c
Binary files /dev/null and b/lumina/public/windows11/SmallTile.scale-150.png differ
diff --git a/lumina/public/windows11/SmallTile.scale-200.png b/lumina/public/windows11/SmallTile.scale-200.png
new file mode 100644
index 0000000..ab231d4
Binary files /dev/null and b/lumina/public/windows11/SmallTile.scale-200.png differ
diff --git a/lumina/public/windows11/SmallTile.scale-400.png b/lumina/public/windows11/SmallTile.scale-400.png
new file mode 100644
index 0000000..d470630
Binary files /dev/null and b/lumina/public/windows11/SmallTile.scale-400.png differ
diff --git a/lumina/public/windows11/SplashScreen.scale-100.png b/lumina/public/windows11/SplashScreen.scale-100.png
new file mode 100644
index 0000000..1d0c24c
Binary files /dev/null and b/lumina/public/windows11/SplashScreen.scale-100.png differ
diff --git a/lumina/public/windows11/SplashScreen.scale-125.png b/lumina/public/windows11/SplashScreen.scale-125.png
new file mode 100644
index 0000000..373636d
Binary files /dev/null and b/lumina/public/windows11/SplashScreen.scale-125.png differ
diff --git a/lumina/public/windows11/SplashScreen.scale-150.png b/lumina/public/windows11/SplashScreen.scale-150.png
new file mode 100644
index 0000000..faa2618
Binary files /dev/null and b/lumina/public/windows11/SplashScreen.scale-150.png differ
diff --git a/lumina/public/windows11/SplashScreen.scale-200.png b/lumina/public/windows11/SplashScreen.scale-200.png
new file mode 100644
index 0000000..6bb2753
Binary files /dev/null and b/lumina/public/windows11/SplashScreen.scale-200.png differ
diff --git a/lumina/public/windows11/SplashScreen.scale-400.png b/lumina/public/windows11/SplashScreen.scale-400.png
new file mode 100644
index 0000000..7d09d0a
Binary files /dev/null and b/lumina/public/windows11/SplashScreen.scale-400.png differ
diff --git a/lumina/public/windows11/Square150x150Logo.scale-100.png b/lumina/public/windows11/Square150x150Logo.scale-100.png
new file mode 100644
index 0000000..0fd665b
Binary files /dev/null and b/lumina/public/windows11/Square150x150Logo.scale-100.png differ
diff --git a/lumina/public/windows11/Square150x150Logo.scale-125.png b/lumina/public/windows11/Square150x150Logo.scale-125.png
new file mode 100644
index 0000000..52d508d
Binary files /dev/null and b/lumina/public/windows11/Square150x150Logo.scale-125.png differ
diff --git a/lumina/public/windows11/Square150x150Logo.scale-150.png b/lumina/public/windows11/Square150x150Logo.scale-150.png
new file mode 100644
index 0000000..7420d94
Binary files /dev/null and b/lumina/public/windows11/Square150x150Logo.scale-150.png differ
diff --git a/lumina/public/windows11/Square150x150Logo.scale-200.png b/lumina/public/windows11/Square150x150Logo.scale-200.png
new file mode 100644
index 0000000..7e9649c
Binary files /dev/null and b/lumina/public/windows11/Square150x150Logo.scale-200.png differ
diff --git a/lumina/public/windows11/Square150x150Logo.scale-400.png b/lumina/public/windows11/Square150x150Logo.scale-400.png
new file mode 100644
index 0000000..a50308d
Binary files /dev/null and b/lumina/public/windows11/Square150x150Logo.scale-400.png differ
diff --git a/lumina/public/windows11/Square44x44Logo.altform-lightunplated_targetsize-16.png b/lumina/public/windows11/Square44x44Logo.altform-lightunplated_targetsize-16.png
new file mode 100644
index 0000000..fbe4f07
Binary files /dev/null and b/lumina/public/windows11/Square44x44Logo.altform-lightunplated_targetsize-16.png differ
diff --git a/lumina/public/windows11/Square44x44Logo.altform-lightunplated_targetsize-20.png b/lumina/public/windows11/Square44x44Logo.altform-lightunplated_targetsize-20.png
new file mode 100644
index 0000000..887ba3a
Binary files /dev/null and b/lumina/public/windows11/Square44x44Logo.altform-lightunplated_targetsize-20.png differ
diff --git a/lumina/public/windows11/Square44x44Logo.altform-lightunplated_targetsize-24.png b/lumina/public/windows11/Square44x44Logo.altform-lightunplated_targetsize-24.png
new file mode 100644
index 0000000..53ff22b
Binary files /dev/null and b/lumina/public/windows11/Square44x44Logo.altform-lightunplated_targetsize-24.png differ
diff --git a/lumina/public/windows11/Square44x44Logo.altform-lightunplated_targetsize-256.png b/lumina/public/windows11/Square44x44Logo.altform-lightunplated_targetsize-256.png
new file mode 100644
index 0000000..c2bdbe3
Binary files /dev/null and b/lumina/public/windows11/Square44x44Logo.altform-lightunplated_targetsize-256.png differ
diff --git a/lumina/public/windows11/Square44x44Logo.altform-lightunplated_targetsize-30.png b/lumina/public/windows11/Square44x44Logo.altform-lightunplated_targetsize-30.png
new file mode 100644
index 0000000..aa8f2d5
Binary files /dev/null and b/lumina/public/windows11/Square44x44Logo.altform-lightunplated_targetsize-30.png differ
diff --git a/lumina/public/windows11/Square44x44Logo.altform-lightunplated_targetsize-32.png b/lumina/public/windows11/Square44x44Logo.altform-lightunplated_targetsize-32.png
new file mode 100644
index 0000000..8a0eea2
Binary files /dev/null and b/lumina/public/windows11/Square44x44Logo.altform-lightunplated_targetsize-32.png differ
diff --git a/lumina/public/windows11/Square44x44Logo.altform-lightunplated_targetsize-36.png b/lumina/public/windows11/Square44x44Logo.altform-lightunplated_targetsize-36.png
new file mode 100644
index 0000000..a5da540
Binary files /dev/null and b/lumina/public/windows11/Square44x44Logo.altform-lightunplated_targetsize-36.png differ
diff --git a/lumina/public/windows11/Square44x44Logo.altform-lightunplated_targetsize-40.png b/lumina/public/windows11/Square44x44Logo.altform-lightunplated_targetsize-40.png
new file mode 100644
index 0000000..5203aaa
Binary files /dev/null and b/lumina/public/windows11/Square44x44Logo.altform-lightunplated_targetsize-40.png differ
diff --git a/lumina/public/windows11/Square44x44Logo.altform-lightunplated_targetsize-44.png b/lumina/public/windows11/Square44x44Logo.altform-lightunplated_targetsize-44.png
new file mode 100644
index 0000000..ae35294
Binary files /dev/null and b/lumina/public/windows11/Square44x44Logo.altform-lightunplated_targetsize-44.png differ
diff --git a/lumina/public/windows11/Square44x44Logo.altform-lightunplated_targetsize-48.png b/lumina/public/windows11/Square44x44Logo.altform-lightunplated_targetsize-48.png
new file mode 100644
index 0000000..4efa436
Binary files /dev/null and b/lumina/public/windows11/Square44x44Logo.altform-lightunplated_targetsize-48.png differ
diff --git a/lumina/public/windows11/Square44x44Logo.altform-lightunplated_targetsize-60.png b/lumina/public/windows11/Square44x44Logo.altform-lightunplated_targetsize-60.png
new file mode 100644
index 0000000..62118d3
Binary files /dev/null and b/lumina/public/windows11/Square44x44Logo.altform-lightunplated_targetsize-60.png differ
diff --git a/lumina/public/windows11/Square44x44Logo.altform-lightunplated_targetsize-64.png b/lumina/public/windows11/Square44x44Logo.altform-lightunplated_targetsize-64.png
new file mode 100644
index 0000000..b04f698
Binary files /dev/null and b/lumina/public/windows11/Square44x44Logo.altform-lightunplated_targetsize-64.png differ
diff --git a/lumina/public/windows11/Square44x44Logo.altform-lightunplated_targetsize-72.png b/lumina/public/windows11/Square44x44Logo.altform-lightunplated_targetsize-72.png
new file mode 100644
index 0000000..9efd4b5
Binary files /dev/null and b/lumina/public/windows11/Square44x44Logo.altform-lightunplated_targetsize-72.png differ
diff --git a/lumina/public/windows11/Square44x44Logo.altform-lightunplated_targetsize-80.png b/lumina/public/windows11/Square44x44Logo.altform-lightunplated_targetsize-80.png
new file mode 100644
index 0000000..81c84b7
Binary files /dev/null and b/lumina/public/windows11/Square44x44Logo.altform-lightunplated_targetsize-80.png differ
diff --git a/lumina/public/windows11/Square44x44Logo.altform-lightunplated_targetsize-96.png b/lumina/public/windows11/Square44x44Logo.altform-lightunplated_targetsize-96.png
new file mode 100644
index 0000000..9028149
Binary files /dev/null and b/lumina/public/windows11/Square44x44Logo.altform-lightunplated_targetsize-96.png differ
diff --git a/lumina/public/windows11/Square44x44Logo.altform-unplated_targetsize-16.png b/lumina/public/windows11/Square44x44Logo.altform-unplated_targetsize-16.png
new file mode 100644
index 0000000..fbe4f07
Binary files /dev/null and b/lumina/public/windows11/Square44x44Logo.altform-unplated_targetsize-16.png differ
diff --git a/lumina/public/windows11/Square44x44Logo.altform-unplated_targetsize-20.png b/lumina/public/windows11/Square44x44Logo.altform-unplated_targetsize-20.png
new file mode 100644
index 0000000..887ba3a
Binary files /dev/null and b/lumina/public/windows11/Square44x44Logo.altform-unplated_targetsize-20.png differ
diff --git a/lumina/public/windows11/Square44x44Logo.altform-unplated_targetsize-24.png b/lumina/public/windows11/Square44x44Logo.altform-unplated_targetsize-24.png
new file mode 100644
index 0000000..53ff22b
Binary files /dev/null and b/lumina/public/windows11/Square44x44Logo.altform-unplated_targetsize-24.png differ
diff --git a/lumina/public/windows11/Square44x44Logo.altform-unplated_targetsize-256.png b/lumina/public/windows11/Square44x44Logo.altform-unplated_targetsize-256.png
new file mode 100644
index 0000000..c2bdbe3
Binary files /dev/null and b/lumina/public/windows11/Square44x44Logo.altform-unplated_targetsize-256.png differ
diff --git a/lumina/public/windows11/Square44x44Logo.altform-unplated_targetsize-30.png b/lumina/public/windows11/Square44x44Logo.altform-unplated_targetsize-30.png
new file mode 100644
index 0000000..aa8f2d5
Binary files /dev/null and b/lumina/public/windows11/Square44x44Logo.altform-unplated_targetsize-30.png differ
diff --git a/lumina/public/windows11/Square44x44Logo.altform-unplated_targetsize-32.png b/lumina/public/windows11/Square44x44Logo.altform-unplated_targetsize-32.png
new file mode 100644
index 0000000..8a0eea2
Binary files /dev/null and b/lumina/public/windows11/Square44x44Logo.altform-unplated_targetsize-32.png differ
diff --git a/lumina/public/windows11/Square44x44Logo.altform-unplated_targetsize-36.png b/lumina/public/windows11/Square44x44Logo.altform-unplated_targetsize-36.png
new file mode 100644
index 0000000..a5da540
Binary files /dev/null and b/lumina/public/windows11/Square44x44Logo.altform-unplated_targetsize-36.png differ
diff --git a/lumina/public/windows11/Square44x44Logo.altform-unplated_targetsize-40.png b/lumina/public/windows11/Square44x44Logo.altform-unplated_targetsize-40.png
new file mode 100644
index 0000000..5203aaa
Binary files /dev/null and b/lumina/public/windows11/Square44x44Logo.altform-unplated_targetsize-40.png differ
diff --git a/lumina/public/windows11/Square44x44Logo.altform-unplated_targetsize-44.png b/lumina/public/windows11/Square44x44Logo.altform-unplated_targetsize-44.png
new file mode 100644
index 0000000..ae35294
Binary files /dev/null and b/lumina/public/windows11/Square44x44Logo.altform-unplated_targetsize-44.png differ
diff --git a/lumina/public/windows11/Square44x44Logo.altform-unplated_targetsize-48.png b/lumina/public/windows11/Square44x44Logo.altform-unplated_targetsize-48.png
new file mode 100644
index 0000000..4efa436
Binary files /dev/null and b/lumina/public/windows11/Square44x44Logo.altform-unplated_targetsize-48.png differ
diff --git a/lumina/public/windows11/Square44x44Logo.altform-unplated_targetsize-60.png b/lumina/public/windows11/Square44x44Logo.altform-unplated_targetsize-60.png
new file mode 100644
index 0000000..62118d3
Binary files /dev/null and b/lumina/public/windows11/Square44x44Logo.altform-unplated_targetsize-60.png differ
diff --git a/lumina/public/windows11/Square44x44Logo.altform-unplated_targetsize-64.png b/lumina/public/windows11/Square44x44Logo.altform-unplated_targetsize-64.png
new file mode 100644
index 0000000..b04f698
Binary files /dev/null and b/lumina/public/windows11/Square44x44Logo.altform-unplated_targetsize-64.png differ
diff --git a/lumina/public/windows11/Square44x44Logo.altform-unplated_targetsize-72.png b/lumina/public/windows11/Square44x44Logo.altform-unplated_targetsize-72.png
new file mode 100644
index 0000000..9efd4b5
Binary files /dev/null and b/lumina/public/windows11/Square44x44Logo.altform-unplated_targetsize-72.png differ
diff --git a/lumina/public/windows11/Square44x44Logo.altform-unplated_targetsize-80.png b/lumina/public/windows11/Square44x44Logo.altform-unplated_targetsize-80.png
new file mode 100644
index 0000000..81c84b7
Binary files /dev/null and b/lumina/public/windows11/Square44x44Logo.altform-unplated_targetsize-80.png differ
diff --git a/lumina/public/windows11/Square44x44Logo.altform-unplated_targetsize-96.png b/lumina/public/windows11/Square44x44Logo.altform-unplated_targetsize-96.png
new file mode 100644
index 0000000..9028149
Binary files /dev/null and b/lumina/public/windows11/Square44x44Logo.altform-unplated_targetsize-96.png differ
diff --git a/lumina/public/windows11/Square44x44Logo.scale-100.png b/lumina/public/windows11/Square44x44Logo.scale-100.png
new file mode 100644
index 0000000..ae35294
Binary files /dev/null and b/lumina/public/windows11/Square44x44Logo.scale-100.png differ
diff --git a/lumina/public/windows11/Square44x44Logo.scale-125.png b/lumina/public/windows11/Square44x44Logo.scale-125.png
new file mode 100644
index 0000000..39e407c
Binary files /dev/null and b/lumina/public/windows11/Square44x44Logo.scale-125.png differ
diff --git a/lumina/public/windows11/Square44x44Logo.scale-150.png b/lumina/public/windows11/Square44x44Logo.scale-150.png
new file mode 100644
index 0000000..f2072ec
Binary files /dev/null and b/lumina/public/windows11/Square44x44Logo.scale-150.png differ
diff --git a/lumina/public/windows11/Square44x44Logo.scale-200.png b/lumina/public/windows11/Square44x44Logo.scale-200.png
new file mode 100644
index 0000000..2e5e920
Binary files /dev/null and b/lumina/public/windows11/Square44x44Logo.scale-200.png differ
diff --git a/lumina/public/windows11/Square44x44Logo.scale-400.png b/lumina/public/windows11/Square44x44Logo.scale-400.png
new file mode 100644
index 0000000..8013637
Binary files /dev/null and b/lumina/public/windows11/Square44x44Logo.scale-400.png differ
diff --git a/lumina/public/windows11/Square44x44Logo.targetsize-16.png b/lumina/public/windows11/Square44x44Logo.targetsize-16.png
new file mode 100644
index 0000000..fbe4f07
Binary files /dev/null and b/lumina/public/windows11/Square44x44Logo.targetsize-16.png differ
diff --git a/lumina/public/windows11/Square44x44Logo.targetsize-20.png b/lumina/public/windows11/Square44x44Logo.targetsize-20.png
new file mode 100644
index 0000000..887ba3a
Binary files /dev/null and b/lumina/public/windows11/Square44x44Logo.targetsize-20.png differ
diff --git a/lumina/public/windows11/Square44x44Logo.targetsize-24.png b/lumina/public/windows11/Square44x44Logo.targetsize-24.png
new file mode 100644
index 0000000..53ff22b
Binary files /dev/null and b/lumina/public/windows11/Square44x44Logo.targetsize-24.png differ
diff --git a/lumina/public/windows11/Square44x44Logo.targetsize-256.png b/lumina/public/windows11/Square44x44Logo.targetsize-256.png
new file mode 100644
index 0000000..c2bdbe3
Binary files /dev/null and b/lumina/public/windows11/Square44x44Logo.targetsize-256.png differ
diff --git a/lumina/public/windows11/Square44x44Logo.targetsize-30.png b/lumina/public/windows11/Square44x44Logo.targetsize-30.png
new file mode 100644
index 0000000..aa8f2d5
Binary files /dev/null and b/lumina/public/windows11/Square44x44Logo.targetsize-30.png differ
diff --git a/lumina/public/windows11/Square44x44Logo.targetsize-32.png b/lumina/public/windows11/Square44x44Logo.targetsize-32.png
new file mode 100644
index 0000000..8a0eea2
Binary files /dev/null and b/lumina/public/windows11/Square44x44Logo.targetsize-32.png differ
diff --git a/lumina/public/windows11/Square44x44Logo.targetsize-36.png b/lumina/public/windows11/Square44x44Logo.targetsize-36.png
new file mode 100644
index 0000000..a5da540
Binary files /dev/null and b/lumina/public/windows11/Square44x44Logo.targetsize-36.png differ
diff --git a/lumina/public/windows11/Square44x44Logo.targetsize-40.png b/lumina/public/windows11/Square44x44Logo.targetsize-40.png
new file mode 100644
index 0000000..5203aaa
Binary files /dev/null and b/lumina/public/windows11/Square44x44Logo.targetsize-40.png differ
diff --git a/lumina/public/windows11/Square44x44Logo.targetsize-44.png b/lumina/public/windows11/Square44x44Logo.targetsize-44.png
new file mode 100644
index 0000000..ae35294
Binary files /dev/null and b/lumina/public/windows11/Square44x44Logo.targetsize-44.png differ
diff --git a/lumina/public/windows11/Square44x44Logo.targetsize-48.png b/lumina/public/windows11/Square44x44Logo.targetsize-48.png
new file mode 100644
index 0000000..4efa436
Binary files /dev/null and b/lumina/public/windows11/Square44x44Logo.targetsize-48.png differ
diff --git a/lumina/public/windows11/Square44x44Logo.targetsize-60.png b/lumina/public/windows11/Square44x44Logo.targetsize-60.png
new file mode 100644
index 0000000..62118d3
Binary files /dev/null and b/lumina/public/windows11/Square44x44Logo.targetsize-60.png differ
diff --git a/lumina/public/windows11/Square44x44Logo.targetsize-64.png b/lumina/public/windows11/Square44x44Logo.targetsize-64.png
new file mode 100644
index 0000000..b04f698
Binary files /dev/null and b/lumina/public/windows11/Square44x44Logo.targetsize-64.png differ
diff --git a/lumina/public/windows11/Square44x44Logo.targetsize-72.png b/lumina/public/windows11/Square44x44Logo.targetsize-72.png
new file mode 100644
index 0000000..9efd4b5
Binary files /dev/null and b/lumina/public/windows11/Square44x44Logo.targetsize-72.png differ
diff --git a/lumina/public/windows11/Square44x44Logo.targetsize-80.png b/lumina/public/windows11/Square44x44Logo.targetsize-80.png
new file mode 100644
index 0000000..81c84b7
Binary files /dev/null and b/lumina/public/windows11/Square44x44Logo.targetsize-80.png differ
diff --git a/lumina/public/windows11/Square44x44Logo.targetsize-96.png b/lumina/public/windows11/Square44x44Logo.targetsize-96.png
new file mode 100644
index 0000000..9028149
Binary files /dev/null and b/lumina/public/windows11/Square44x44Logo.targetsize-96.png differ
diff --git a/lumina/public/windows11/StoreLogo.scale-100.png b/lumina/public/windows11/StoreLogo.scale-100.png
new file mode 100644
index 0000000..f5d5883
Binary files /dev/null and b/lumina/public/windows11/StoreLogo.scale-100.png differ
diff --git a/lumina/public/windows11/StoreLogo.scale-125.png b/lumina/public/windows11/StoreLogo.scale-125.png
new file mode 100644
index 0000000..d8d8db3
Binary files /dev/null and b/lumina/public/windows11/StoreLogo.scale-125.png differ
diff --git a/lumina/public/windows11/StoreLogo.scale-150.png b/lumina/public/windows11/StoreLogo.scale-150.png
new file mode 100644
index 0000000..05989f3
Binary files /dev/null and b/lumina/public/windows11/StoreLogo.scale-150.png differ
diff --git a/lumina/public/windows11/StoreLogo.scale-200.png b/lumina/public/windows11/StoreLogo.scale-200.png
new file mode 100644
index 0000000..ac6d44b
Binary files /dev/null and b/lumina/public/windows11/StoreLogo.scale-200.png differ
diff --git a/lumina/public/windows11/StoreLogo.scale-400.png b/lumina/public/windows11/StoreLogo.scale-400.png
new file mode 100644
index 0000000..96a6ec6
Binary files /dev/null and b/lumina/public/windows11/StoreLogo.scale-400.png differ
diff --git a/lumina/public/windows11/Wide310x150Logo.scale-100.png b/lumina/public/windows11/Wide310x150Logo.scale-100.png
new file mode 100644
index 0000000..d3d1421
Binary files /dev/null and b/lumina/public/windows11/Wide310x150Logo.scale-100.png differ
diff --git a/lumina/public/windows11/Wide310x150Logo.scale-125.png b/lumina/public/windows11/Wide310x150Logo.scale-125.png
new file mode 100644
index 0000000..df3679a
Binary files /dev/null and b/lumina/public/windows11/Wide310x150Logo.scale-125.png differ
diff --git a/lumina/public/windows11/Wide310x150Logo.scale-150.png b/lumina/public/windows11/Wide310x150Logo.scale-150.png
new file mode 100644
index 0000000..7959141
Binary files /dev/null and b/lumina/public/windows11/Wide310x150Logo.scale-150.png differ
diff --git a/lumina/public/windows11/Wide310x150Logo.scale-200.png b/lumina/public/windows11/Wide310x150Logo.scale-200.png
new file mode 100644
index 0000000..1d0c24c
Binary files /dev/null and b/lumina/public/windows11/Wide310x150Logo.scale-200.png differ
diff --git a/lumina/public/windows11/Wide310x150Logo.scale-400.png b/lumina/public/windows11/Wide310x150Logo.scale-400.png
new file mode 100644
index 0000000..6bb2753
Binary files /dev/null and b/lumina/public/windows11/Wide310x150Logo.scale-400.png differ
diff --git a/lumina/public/workbox-bd7e3b9b.js b/lumina/public/workbox-bd7e3b9b.js
new file mode 100644
index 0000000..14ce496
--- /dev/null
+++ b/lumina/public/workbox-bd7e3b9b.js
@@ -0,0 +1,2456 @@
+define(['exports'], (function (exports) { 'use strict';
+
+ // @ts-ignore
+ try {
+ self['workbox:core:6.6.0'] && _();
+ } 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.6.0'] && _();
+ } 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.6.0'] && _();
+ } 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