diff --git a/components/CollectionCard.tsx b/components/CollectionCard.tsx index b9efac6..cad3db7 100644 --- a/components/CollectionCard.tsx +++ b/components/CollectionCard.tsx @@ -15,7 +15,10 @@ export default function ({ collection }: { collection: Collection }) {

{collection.name}

- +

{formattedDate}

diff --git a/components/InputSelect/CollectionSelection.tsx b/components/InputSelect/CollectionSelection.tsx index aa5be0d..b14a658 100644 --- a/components/InputSelect/CollectionSelection.tsx +++ b/components/InputSelect/CollectionSelection.tsx @@ -5,7 +5,17 @@ import CreatableSelect from "react-select/creatable"; import { styles } from "./styles"; import { Options } from "./types"; -export default function ({ onChange }: any) { +type Props = { + onChange: any; + defaultValue: + | { + value: number; + label: string; + } + | undefined; +}; + +export default function ({ onChange, defaultValue }: Props) { const { collections } = useCollectionStore(); const router = useRouter(); @@ -17,10 +27,8 @@ export default function ({ onChange }: any) { return e.id === collectionId; }); - let defaultCollection = null; - - if (activeCollection) { - defaultCollection = { + if (activeCollection && !defaultValue) { + defaultValue = { value: activeCollection?.id, label: activeCollection?.name, }; @@ -28,7 +36,7 @@ export default function ({ onChange }: any) { useEffect(() => { const formatedCollections = collections.map((e) => { - return { value: e.id, label: e.name }; + return { value: e.id, label: e.name, ownerId: e.ownerId }; }); setOptions(formatedCollections); @@ -40,7 +48,7 @@ export default function ({ onChange }: any) { onChange={onChange} options={options} styles={styles} - defaultValue={defaultCollection} + defaultValue={defaultValue} menuPosition="fixed" /> ); diff --git a/components/InputSelect/TagSelection.tsx b/components/InputSelect/TagSelection.tsx index 87ac38b..819c9ae 100644 --- a/components/InputSelect/TagSelection.tsx +++ b/components/InputSelect/TagSelection.tsx @@ -4,7 +4,15 @@ import CreatableSelect from "react-select/creatable"; import { styles } from "./styles"; import { Options } from "./types"; -export default function ({ onChange }: any) { +type Props = { + onChange: any; + defaultValue?: { + value: number; + label: string; + }[]; +}; + +export default function ({ onChange, defaultValue }: Props) { const { tags } = useTagStore(); const [options, setOptions] = useState([]); @@ -23,6 +31,7 @@ export default function ({ onChange }: any) { onChange={onChange} options={options} styles={styles} + defaultValue={defaultValue} menuPosition="fixed" isMulti /> diff --git a/components/LinkList.tsx b/components/LinkList.tsx index b513a26..0dd5a0c 100644 --- a/components/LinkList.tsx +++ b/components/LinkList.tsx @@ -3,17 +3,17 @@ import { faFolder, faArrowUpRightFromSquare, faEllipsis, - faStar, faPenToSquare, faTrashCan, } from "@fortawesome/free-solid-svg-icons"; import { faFileImage, faFilePdf } from "@fortawesome/free-regular-svg-icons"; - import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import { useState } from "react"; import Image from "next/image"; import Dropdown from "./Dropdown"; import useLinkStore from "@/store/links"; +import Modal from "./Modal"; +import EditLink from "./Modal/EditLink"; export default function ({ link, @@ -23,6 +23,7 @@ export default function ({ count: number; }) { const [editDropdown, setEditDropdown] = useState(false); + const [editModal, setEditModal] = useState(false); const [archiveLabel, setArchiveLabel] = useState("Archived Formats"); const { removeLink } = useLinkStore(); @@ -34,14 +35,24 @@ export default function ({ day: "numeric", }); + const toggleEditModal = () => { + setEditModal(!editModal); + }; + return ( -
+
+ {editModal ? ( + + + + ) : null} + { const target = e.target as HTMLElement; @@ -53,7 +64,7 @@ export default function ({ width={80} height={80} alt="" - className="blur-sm absolute left-0 opacity-50 select-none" + className="blur-sm absolute left-2 opacity-50 select-none hidden sm:block" draggable="false" onError={(e) => { const target = e.target as HTMLElement; @@ -65,9 +76,6 @@ export default function ({

{count + 1}.

{link.name}

- {link.starred ? ( - - ) : null}

{link.title}

@@ -101,20 +109,25 @@ export default function ({
- setEditDropdown(!editDropdown)} id="edit-dropdown" - /> + className="text-gray-500 inline-flex rounded-md cursor-pointer hover:bg-white hover:outline outline-sky-100 outline-1 duration-100 p-1" + > + +

{archiveLabel}

setArchiveLabel("Archived Formats")} > , - }, { name: "Edit", icon: , + onClick: () => { + setEditModal(true); + setEditDropdown(false); + }, }, { name: "Delete", icon: , - onClick: () => removeLink(link), + onClick: () => { + removeLink(link); + setEditDropdown(false); + }, }, ]} onClickOutside={(e: Event) => { const target = e.target as HTMLInputElement; if (target.id !== "edit-dropdown") setEditDropdown(false); }} - className="absolute top-8 right-0" + className="absolute top-9 right-0" /> ) : null}
diff --git a/components/AddLinkModal.tsx b/components/Modal/AddLink.tsx similarity index 60% rename from components/AddLinkModal.tsx rename to components/Modal/AddLink.tsx index d4f8519..a803d2d 100644 --- a/components/AddLinkModal.tsx +++ b/components/Modal/AddLink.tsx @@ -1,46 +1,76 @@ -import React, { useState } from "react"; -import CollectionSelection from "./InputSelect/CollectionSelection"; -import TagSelection from "./InputSelect/TagSelection"; +import React, { useEffect, useState } from "react"; +import CollectionSelection from "@/components/InputSelect/CollectionSelection"; +import TagSelection from "@/components/InputSelect/TagSelection"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import { faPlus } from "@fortawesome/free-solid-svg-icons"; -import { useRouter } from "next/router"; -import { NewLink } from "@/types/global"; +import { ExtendedLink, NewLink } from "@/types/global"; import useLinkStore from "@/store/links"; +import { useRouter } from "next/router"; +import useCollectionStore from "@/store/collections"; -export default function ({ toggleLinkModal }: { toggleLinkModal: Function }) { +type Props = { + toggleLinkModal: Function; +}; + +export default function AddLink({ toggleLinkModal }: Props) { const router = useRouter(); - const [newLink, setNewLink] = useState({ name: "", url: "", tags: [], - collection: { id: Number(router.query.id) }, + collection: { + id: undefined, + name: "", + ownerId: undefined, + }, }); const { addLink } = useLinkStore(); + const { collections } = useCollectionStore(); + + useEffect(() => { + if (router.query.id) { + const currentCollection = collections.find( + (e) => e.id == Number(router.query.id) + ); + + setNewLink({ + ...newLink, + collection: { + id: currentCollection?.id, + name: currentCollection?.name, + ownerId: currentCollection?.ownerId, + }, + }); + } + }, []); const setTags = (e: any) => { const tagNames = e.map((e: any) => { - return e.label; + return { name: e.label }; }); setNewLink({ ...newLink, tags: tagNames }); }; const setCollection = (e: any) => { - const collection = { id: e?.value, isNew: e?.__isNew__ }; + if (e?.__isNew__) e.value = null; - setNewLink({ ...newLink, collection: collection }); + setNewLink({ + ...newLink, + collection: { id: e?.value, name: e?.label, ownerId: e?.ownerId }, + }); }; const submitLink = async () => { - const response = await addLink(newLink); + console.log(newLink); + + const response = await addLink(newLink as ExtendedLink); if (response) toggleLinkModal(); }; - return ( -
+

New Link

@@ -72,7 +102,14 @@ export default function ({ toggleLinkModal }: { toggleLinkModal: Function }) {

Collection

- +
(link); + + const { updateLink } = useLinkStore(); + + const setTags = (e: any) => { + const tagNames = e.map((e: any) => { + return { name: e.label }; + }); + + setCurrentLink({ ...currentLink, tags: tagNames }); + }; + + const setCollection = (e: any) => { + if (e?.__isNew__) e.value = null; + + setCurrentLink({ + ...currentLink, + collection: { id: e?.value, name: e?.label, ownerId: e?.ownerId } as any, + }); + }; + + const submitLink = async () => { + updateLink(currentLink); + toggleLinkModal(); + }; + + return ( +
+

New Link

+ +
+

Name

+ + setCurrentLink({ ...currentLink, name: e.target.value }) + } + type="text" + placeholder="e.g. Example Link" + className="w-60 rounded-md p-3 border-sky-100 border-solid border text-sm outline-none focus:border-sky-500 duration-100" + /> +
+ +
+

URL

+ + setCurrentLink({ ...currentLink, url: e.target.value }) + } + type="text" + placeholder="e.g. http://example.com/" + className="w-60 rounded-md p-3 border-sky-100 border-solid border text-sm outline-none focus:border-sky-500 duration-100" + /> +
+ +
+

Tags

+ { + return { label: e.name, value: e.id }; + })} + /> +
+ +
+

Collection

+ +
+ +
+ + Edit Link +
+
+ ); +} diff --git a/components/Modal/index.tsx b/components/Modal/index.tsx new file mode 100644 index 0000000..915a80d --- /dev/null +++ b/components/Modal/index.tsx @@ -0,0 +1,19 @@ +import { ReactNode } from "react"; +import ClickAwayHandler from "@/components/ClickAwayHandler"; + +type Props = { + toggleModal: Function; + children: ReactNode; +}; + +export default function ({ toggleModal, children }: Props) { + return ( +
+ +
+ {children} +
+
+
+ ); +} diff --git a/components/Navbar.tsx b/components/Navbar.tsx index c5aa529..5abe047 100644 --- a/components/Navbar.tsx +++ b/components/Navbar.tsx @@ -1,62 +1,25 @@ -import { useRouter } from "next/router"; -import useCollectionStore from "@/store/collections"; -import { Collection, Tag } from "@prisma/client"; -import ClickAwayHandler from "./ClickAwayHandler"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; +import { signOut } from "next-auth/react"; +import { useSession } from "next-auth/react"; import { faPlus, - faFolder, - faBox, - faHashtag, - faBookmark, faMagnifyingGlass, - IconDefinition, + faCircleUser, + faSliders, + faArrowRightFromBracket, + faChevronDown, } from "@fortawesome/free-solid-svg-icons"; -import { useEffect, useState } from "react"; -import AddLinkModal from "./AddLinkModal"; -import useTagStore from "@/store/tags"; +import { useState } from "react"; +import Dropdown from "@/components/Dropdown"; +import Modal from "./Modal"; +import AddLink from "./Modal/AddLink"; export default function () { - const router = useRouter(); - const [pageName, setPageName] = useState(""); - const [pageIcon, setPageIcon] = useState(null); + const { data: session } = useSession(); - const { collections } = useCollectionStore(); - const { tags } = useTagStore(); + const [profileDropdown, setProfileDropdown] = useState(false); - useEffect(() => { - if (router.route === "/collections/[id]") { - const collectionId = router.query.id; - - const activeCollection: Collection | undefined = collections.find( - (e) => e.id.toString() == collectionId - ); - - if (activeCollection) { - setPageName(activeCollection?.name); - } - - setPageIcon(faFolder); - } else if (router.route === "/tags/[id]") { - const tagId = router.query.id; - - const activeTag: Tag | undefined = tags.find( - (e) => e.id.toString() == tagId - ); - - if (activeTag) { - setPageName(activeTag?.name); - } - - setPageIcon(faHashtag); - } else if (router.route === "/collections") { - setPageName("All Collections"); - setPageIcon(faBox); - } else if (router.route === "/links") { - setPageName("All Links"); - setPageIcon(faBookmark); - } - }, [router, collections, tags]); + const user = session?.user; const [linkModal, setLinkModal] = useState(false); @@ -65,50 +28,75 @@ export default function () { }; return ( -
-
- {pageIcon ? ( - - ) : null} -

{pageName}

+
+
+ +
- -
-
- - -
- +
+ className="inline-flex gap-1 items-center select-none cursor-pointer p-1 text-sky-500 rounded-md hover:outline-sky-500 outline duration-100 bg-white outline-sky-100 outline-1" + > + +
{linkModal ? ( -
- - - -
+ + + ) : null} + +
+
setProfileDropdown(!profileDropdown)} + id="profile-dropdown" + > + +
+

{user?.name}

+ +
+
+ {profileDropdown ? ( + , + }, + { + name: "Logout", + icon: , + onClick: () => { + signOut(); + setProfileDropdown(!profileDropdown); + }, + }, + ]} + onClickOutside={(e: Event) => { + const target = e.target as HTMLInputElement; + if (target.id !== "profile-dropdown") setProfileDropdown(false); + }} + className="absolute top-8 right-0 z-20" + /> + ) : null} +
); diff --git a/components/Sidebar/index.tsx b/components/Sidebar/index.tsx index de03dd1..d4566e3 100644 --- a/components/Sidebar/index.tsx +++ b/components/Sidebar/index.tsx @@ -1,37 +1,25 @@ -import { useSession } from "next-auth/react"; import ClickAwayHandler from "@/components/ClickAwayHandler"; import { useState } from "react"; import useCollectionStore from "@/store/collections"; -import { signOut } from "next-auth/react"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import { faPlus, - faChevronDown, faFolder, faBox, faHashtag, faBookmark, - faCircleUser, - faSliders, - faArrowRightFromBracket, } from "@fortawesome/free-solid-svg-icons"; import SidebarItem from "./SidebarItem"; import useTagStore from "@/store/tags"; import Link from "next/link"; -import Dropdown from "@/components/Dropdown"; export default function () { - const { data: session } = useSession(); - const [collectionInput, setCollectionInput] = useState(false); - const [profileDropdown, setProfileDropdown] = useState(false); const { collections, addCollection } = useCollectionStore(); const { tags } = useTagStore(); - const user = session?.user; - const toggleCollectionInput = () => { setCollectionInput(!collectionInput); }; @@ -48,48 +36,12 @@ export default function () { }; return ( -
-
-
setProfileDropdown(!profileDropdown)} - id="profile-dropdown" - > - -
-

{user?.name}

- -
-
- {profileDropdown ? ( - , - }, - { - name: "Logout", - icon: , - onClick: () => { - signOut(); - setProfileDropdown(!profileDropdown); - }, - }, - ]} - onClickOutside={(e: Event) => { - const target = e.target as HTMLInputElement; - if (target.id !== "profile-dropdown") setProfileDropdown(false); - }} - className="absolute top-10 left-0" - /> - ) : null} -
+
+

+ Linkwarden +

- +

All Links

@@ -119,12 +71,13 @@ export default function () { /> ) : ( - + onClick={toggleCollectionInput} + className="select-none text-gray-500 rounded-md cursor-pointer hover:bg-white hover:outline outline-sky-100 outline-1 duration-100 p-1" + > + +
)}
diff --git a/layouts/MainLayout.tsx b/layouts/MainLayout.tsx index e41ab6d..4ddb3ab 100644 --- a/layouts/MainLayout.tsx +++ b/layouts/MainLayout.tsx @@ -1,4 +1,3 @@ -import Head from "next/head"; import Navbar from "@/components/Navbar"; import Sidebar from "@/components/Sidebar"; import { ReactNode } from "react"; @@ -23,11 +22,6 @@ export default function ({ children }: Props) { if (status === "authenticated" && !redirection && routeExists) return ( <> - - Linkwarden - - -
@@ -36,15 +30,6 @@ export default function ({ children }: Props) { ); else if ((status === "unauthenticated" && !redirection) || !routeExists) - return ( - <> - - Linkwarden - - - - {children} - - ); + return <>{children}; else return ; } diff --git a/lib/api/archive.ts b/lib/api/archive.ts index b4f12f5..496a464 100644 --- a/lib/api/archive.ts +++ b/lib/api/archive.ts @@ -1,31 +1,62 @@ -import { chromium, devices } from "playwright"; +import { Page } from "puppeteer"; import { prisma } from "@/lib/api/db"; +import puppeteer from "puppeteer-extra"; +import AdblockerPlugin from "puppeteer-extra-plugin-adblocker"; +import StealthPlugin from "puppeteer-extra-plugin-stealth"; export default async (url: string, collectionId: number, linkId: number) => { const archivePath = `data/archives/${collectionId}/${linkId}`; - const browser = await chromium.launch(); - const context = await browser.newContext(devices["Desktop Chrome"]); - const page = await context.newPage(); + const browser = await puppeteer.launch(); - // const contexts = browser.contexts(); - // console.log(contexts.length); + try { + puppeteer.use(AdblockerPlugin()).use(StealthPlugin()); - await page.goto(url); + const page = await browser.newPage(); - const linkExists = await prisma.link.findFirst({ - where: { - id: linkId, - }, - }); + await page.goto(url, { waitUntil: "domcontentloaded", timeout: 300000 }); - if (linkExists) { - await Promise.all([ - page.pdf({ path: archivePath + ".pdf" }), - page.screenshot({ fullPage: true, path: archivePath + ".png" }), - ]); + await page.setViewport({ width: 1080, height: 1024 }); + + await autoScroll(page); + + const linkExists = await prisma.link.findFirst({ + where: { + id: linkId, + }, + }); + + if (linkExists) { + await Promise.all([ + page.pdf({ path: archivePath + ".pdf", format: "a4" }), + page.screenshot({ fullPage: true, path: archivePath + ".png" }), + ]); + } + + await browser.close(); + } catch (err) { + console.log(err); + await browser.close(); } - - await context.close(); - await browser.close(); +}; + +const autoScroll = async (page: Page) => { + await page.evaluate(async () => { + await new Promise((resolve, reject) => { + let totalHeight = 0; + let distance = 100; + let scrollDown = setInterval(() => { + let scrollHeight = document.body.scrollHeight; + window.scrollBy(0, distance); + totalHeight += distance; + if (totalHeight >= scrollHeight) { + clearInterval(scrollDown); + window.scroll(0, 0); + resolve(); + } + }, 100); + }); + + await new Promise((r) => setTimeout(r, 2000)); + }); }; diff --git a/lib/api/controllers/collections/getCollections.ts b/lib/api/controllers/collections/getCollections.ts index 7e668b5..110cd41 100644 --- a/lib/api/controllers/collections/getCollections.ts +++ b/lib/api/controllers/collections/getCollections.ts @@ -1,19 +1,11 @@ -import type { NextApiRequest, NextApiResponse } from "next"; import { prisma } from "@/lib/api/db"; -import { Session } from "next-auth"; -export default async function ( - req: NextApiRequest, - res: NextApiResponse, - session: Session -) { +export default async function (userId: number) { const collections = await prisma.collection.findMany({ where: { - ownerId: session?.user.id, + ownerId: userId, }, }); - return res.status(200).json({ - response: collections || [], - }); + return { response: collections, status: 200 }; } diff --git a/lib/api/controllers/collections/postCollection.ts b/lib/api/controllers/collections/postCollection.ts index d938755..d8dc865 100644 --- a/lib/api/controllers/collections/postCollection.ts +++ b/lib/api/controllers/collections/postCollection.ts @@ -1,29 +1,16 @@ -import type { NextApiRequest, NextApiResponse } from "next"; import { prisma } from "@/lib/api/db"; -import { Session } from "next-auth"; import { existsSync, mkdirSync } from "fs"; -export default async function ( - req: NextApiRequest, - res: NextApiResponse, - session: Session -) { - if (!session?.user?.email) { - return res.status(401).json({ response: "You must be logged in." }); - } +export default async function (collectionName: string, userId: number) { + if (!collectionName) + return { + response: "Please enter a valid name for the collection.", + status: 400, + }; - const email: string = session.user.email; - const collectionName: string = req?.body?.collectionName; - - if (!collectionName) { - return res - .status(401) - .json({ response: "Please enter a valid name for the collection." }); - } - - const findCollection = await prisma.user.findFirst({ + const findCollection = await prisma.user.findUnique({ where: { - email, + id: userId, }, select: { collections: { @@ -36,15 +23,14 @@ export default async function ( const checkIfCollectionExists = findCollection?.collections[0]; - if (checkIfCollectionExists) { - return res.status(400).json({ response: "Collection already exists." }); - } + if (checkIfCollectionExists) + return { response: "Collection already exists.", status: 400 }; const newCollection = await prisma.collection.create({ data: { owner: { connect: { - id: session.user.id, + id: userId, }, }, name: collectionName, @@ -55,7 +41,5 @@ export default async function ( if (!existsSync(collectionPath)) mkdirSync(collectionPath, { recursive: true }); - return res.status(200).json({ - response: newCollection, - }); + return { response: newCollection, status: 200 }; } diff --git a/lib/api/controllers/links/deleteLink.ts b/lib/api/controllers/links/deleteLink.ts index 15f119e..54b1e28 100644 --- a/lib/api/controllers/links/deleteLink.ts +++ b/lib/api/controllers/links/deleteLink.ts @@ -1,37 +1,23 @@ -import type { NextApiRequest, NextApiResponse } from "next"; import { prisma } from "@/lib/api/db"; -import { Session } from "next-auth"; import { ExtendedLink } from "@/types/global"; import fs from "fs"; import { Link, UsersAndCollections } from "@prisma/client"; import hasAccessToCollection from "@/lib/api/hasAccessToCollection"; -export default async function ( - req: NextApiRequest, - res: NextApiResponse, - session: Session -) { - if (!session?.user?.email) { - return res.status(401).json({ response: "You must be logged in." }); - } - - const link: ExtendedLink = req?.body; - - if (!link) { - return res.status(401).json({ response: "Please choose a valid link." }); - } +export default async function (link: ExtendedLink, userId: number) { + if (!link) return { response: "Please choose a valid link.", status: 401 }; const collectionIsAccessible = await hasAccessToCollection( - session.user.id, + userId, link.collectionId ); const memberHasAccess = collectionIsAccessible?.members.some( - (e: UsersAndCollections) => e.userId === session.user.id && e.canDelete + (e: UsersAndCollections) => e.userId === userId && e.canDelete ); - if (!(collectionIsAccessible?.ownerId === session.user.id || memberHasAccess)) - return res.status(401).json({ response: "Collection is not accessible." }); + if (!(collectionIsAccessible?.ownerId === userId || memberHasAccess)) + return { response: "Collection is not accessible.", status: 401 }; const deleteLink: Link = await prisma.link.delete({ where: { @@ -47,7 +33,5 @@ export default async function ( if (err) console.log(err); }); - return res.status(200).json({ - response: deleteLink, - }); + return { response: deleteLink, status: 200 }; } diff --git a/lib/api/controllers/links/getLinks.ts b/lib/api/controllers/links/getLinks.ts index bf07860..12ee450 100644 --- a/lib/api/controllers/links/getLinks.ts +++ b/lib/api/controllers/links/getLinks.ts @@ -1,23 +1,16 @@ -import type { NextApiRequest, NextApiResponse } from "next"; import { prisma } from "@/lib/api/db"; -import { Session } from "next-auth"; - -export default async function ( - req: NextApiRequest, - res: NextApiResponse, - session: Session -) { - const tags = await prisma.link.findMany({ +export default async function (userId: number) { + const links = await prisma.link.findMany({ where: { collection: { OR: [ { - ownerId: session?.user.id, + ownerId: userId, }, { members: { some: { - userId: session?.user.id, + userId, }, }, }, @@ -30,7 +23,5 @@ export default async function ( }, }); - return res.status(200).json({ - response: tags || [], - }); + return { response: links, status: 200 }; } diff --git a/lib/api/controllers/links/postLink.ts b/lib/api/controllers/links/postLink.ts index 2994843..f184b97 100644 --- a/lib/api/controllers/links/postLink.ts +++ b/lib/api/controllers/links/postLink.ts @@ -1,7 +1,5 @@ -import type { NextApiRequest, NextApiResponse } from "next"; import { prisma } from "@/lib/api/db"; -import { Session } from "next-auth"; -import { ExtendedLink, NewLink } from "@/types/global"; +import { ExtendedLink } from "@/types/global"; import { existsSync, mkdirSync } from "fs"; import getTitle from "../../getTitle"; import archive from "../../archive"; @@ -9,77 +7,31 @@ import { Link, UsersAndCollections } from "@prisma/client"; import AES from "crypto-js/aes"; import hasAccessToCollection from "@/lib/api/hasAccessToCollection"; -export default async function ( - req: NextApiRequest, - res: NextApiResponse, - session: Session -) { - if (!session?.user?.email) { - return res.status(401).json({ response: "You must be logged in." }); - } - - const email: string = session.user.email; - const link: NewLink = req?.body; +export default async function (link: ExtendedLink, userId: number) { + link.collection.name = link.collection.name.trim(); if (!link.name) { - return res - .status(401) - .json({ response: "Please enter a valid name for the link." }); + return { response: "Please enter a valid name for the link.", status: 401 }; + } else if (!link.collection.name) { + return { response: "Please enter a valid collection name.", status: 401 }; } - if (link.collection.isNew) { - const collectionId = link.collection.id as string; + if (link.collection.ownerId) { + const collectionIsAccessible = await hasAccessToCollection( + userId, + link.collection.id + ); - const findCollection = await prisma.user.findFirst({ - where: { - email, - }, - select: { - collections: { - where: { - name: collectionId, - }, - }, - }, - }); + const memberHasAccess = collectionIsAccessible?.members.some( + (e: UsersAndCollections) => e.userId === userId && e.canCreate + ); - const checkIfCollectionExists = findCollection?.collections[0]; - - if (checkIfCollectionExists) - return res.status(400).json({ response: "Collection already exists." }); - - const newCollection = await prisma.collection.create({ - data: { - owner: { - connect: { - id: session.user.id, - }, - }, - name: collectionId, - }, - }); - - const collectionPath = `data/archives/${newCollection.id}`; - if (!existsSync(collectionPath)) - mkdirSync(collectionPath, { recursive: true }); - - link.collection.id = newCollection.id; + if (!(collectionIsAccessible?.ownerId === userId || memberHasAccess)) + return { response: "Collection is not accessible.", status: 401 }; + } else { + link.collection.ownerId = userId; } - const collectionId = link.collection.id as number; - - const collectionIsAccessible = await hasAccessToCollection( - session.user.id, - collectionId - ); - - const memberHasAccess = collectionIsAccessible?.members.some( - (e: UsersAndCollections) => e.userId === session.user.id && e.canCreate - ); - - if (!(collectionIsAccessible?.ownerId === session.user.id || memberHasAccess)) - return res.status(401).json({ response: "Collection is not accessible." }); - const title = await getTitle(link.url); const newLink: Link = await prisma.link.create({ @@ -87,35 +39,45 @@ export default async function ( name: link.name, url: link.url, collection: { - connect: { - id: collectionId, - }, - }, - tags: { - connectOrCreate: link.tags.map((name) => ({ + connectOrCreate: { where: { - name_collectionId: { - name, - collectionId, + name_ownerId: { + ownerId: link.collection.ownerId, + name: link.collection.name, }, }, create: { - name, - collections: { + name: link.collection.name, + ownerId: userId, + }, + }, + }, + tags: { + connectOrCreate: link.tags.map((tag) => ({ + where: { + name_ownerId: { + name: tag.name, + ownerId: link.collection.ownerId, + }, + }, + create: { + name: tag.name, + owner: { connect: { - id: collectionId, + id: link.collection.ownerId, }, }, }, })), }, title, - starred: false, screenshotPath: "", pdfPath: "", }, }); + console.log(newLink); + const AES_SECRET = process.env.AES_SECRET as string; const screenshotHashedPath = AES.encrypt( @@ -136,7 +98,5 @@ export default async function ( archive(updatedLink.url, updatedLink.collectionId, updatedLink.id); - return res.status(200).json({ - response: updatedLink, - }); + return { response: updatedLink, status: 200 }; } diff --git a/lib/api/controllers/tags/getTags.ts b/lib/api/controllers/tags/getTags.ts index 0fd7bf9..0654eba 100644 --- a/lib/api/controllers/tags/getTags.ts +++ b/lib/api/controllers/tags/getTags.ts @@ -1,12 +1,6 @@ -import type { NextApiRequest, NextApiResponse } from "next"; import { prisma } from "@/lib/api/db"; -import { Session } from "next-auth"; -export default async function ( - req: NextApiRequest, - res: NextApiResponse, - session: Session -) { +export default async function (userId: number) { // tag cleanup await prisma.tag.deleteMany({ where: { @@ -18,15 +12,22 @@ export default async function ( const tags = await prisma.tag.findMany({ where: { - collections: { + ownerId: userId, + owner: { OR: [ { - ownerId: session?.user.id, + id: userId, }, { - members: { + collections: { some: { - userId: session?.user.id, + members: { + some: { + user: { + id: userId, + }, + }, + }, }, }, }, @@ -35,7 +36,5 @@ export default async function ( }, }); - return res.status(200).json({ - response: tags || [], - }); + return { response: tags, status: 200 }; } diff --git a/package.json b/package.json index dd18e92..d70957e 100644 --- a/package.json +++ b/package.json @@ -29,7 +29,10 @@ "eslint-config-next": "13.1.6", "next": "13.1.6", "next-auth": "^4.19.1", - "playwright": "^1.31.2", + "puppeteer": "^19.8.0", + "puppeteer-extra": "^3.3.6", + "puppeteer-extra-plugin-adblocker": "^2.13.6", + "puppeteer-extra-plugin-stealth": "^2.11.2", "react": "18.2.0", "react-dom": "18.2.0", "react-select": "^5.7.0", diff --git a/pages/_app.tsx b/pages/_app.tsx index aff7668..2aa706b 100644 --- a/pages/_app.tsx +++ b/pages/_app.tsx @@ -3,10 +3,33 @@ import MainLayout from "@/layouts/MainLayout"; import "@/styles/globals.css"; import { SessionProvider } from "next-auth/react"; import type { AppProps } from "next/app"; +import Head from "next/head"; export default function App({ Component, pageProps }: AppProps) { return ( + + Linkwarden + + + + + + diff --git a/pages/api/auth/[...nextauth].ts b/pages/api/auth/[...nextauth].ts index 804774f..c21967b 100644 --- a/pages/api/auth/[...nextauth].ts +++ b/pages/api/auth/[...nextauth].ts @@ -35,6 +35,8 @@ export const authOptions: AuthOptions = { passwordMatches = bcrypt.compareSync(password, findUser.password); } + console.log(passwordMatches); + if (passwordMatches) { return { id: findUser?.id, diff --git a/pages/api/routes/collections/index.ts b/pages/api/routes/collections/index.ts index 2b25189..b2f4b63 100644 --- a/pages/api/routes/collections/index.ts +++ b/pages/api/routes/collections/index.ts @@ -4,21 +4,25 @@ import { authOptions } from "pages/api/auth/[...nextauth]"; import getCollections from "@/lib/api/controllers/collections/getCollections"; import postCollection from "@/lib/api/controllers/collections/postCollection"; -type Data = { - response: object[] | string; -}; - -export default async function ( - req: NextApiRequest, - res: NextApiResponse -) { +export default async function (req: NextApiRequest, res: NextApiResponse) { const session = await getServerSession(req, res, authOptions); if (!session?.user?.email) { return res.status(401).json({ response: "You must be logged in." }); } - if (req.method === "GET") return await getCollections(req, res, session); - - if (req.method === "POST") return await postCollection(req, res, session); + if (req.method === "GET") { + const collections = await getCollections(session.user.id); + return res + .status(collections.status) + .json({ response: collections.response }); + } else if (req.method === "POST") { + const newCollection = await postCollection( + req.body.collectionName.trim(), + session.user.id + ); + return res + .status(newCollection.status) + .json({ response: newCollection.response }); + } } diff --git a/pages/api/routes/links/index.ts b/pages/api/routes/links/index.ts index 7f8cb26..2ef7ae2 100644 --- a/pages/api/routes/links/index.ts +++ b/pages/api/routes/links/index.ts @@ -5,21 +5,25 @@ import getLinks from "@/lib/api/controllers/links/getLinks"; import postLink from "@/lib/api/controllers/links/postLink"; import deleteLink from "@/lib/api/controllers/links/deleteLink"; -type Data = { - response: object[] | string; -}; - -export default async function ( - req: NextApiRequest, - res: NextApiResponse -) { +export default async function (req: NextApiRequest, res: NextApiResponse) { const session = await getServerSession(req, res, authOptions); if (!session?.user?.email) { return res.status(401).json({ response: "You must be logged in." }); } - if (req.method === "GET") return await getLinks(req, res, session); - else if (req.method === "POST") return await postLink(req, res, session); - else if (req.method === "DELETE") return await deleteLink(req, res, session); + if (req.method === "GET") { + const links = await getLinks(session.user.id); + return res.status(links.status).json({ response: links.response }); + } else if (req.method === "POST") { + const newlink = await postLink(req.body, session.user.id); + return res.status(newlink.status).json({ + response: newlink.response, + }); + } else if (req.method === "DELETE") { + const deleted = await deleteLink(req.body, session.user.id); + return res.status(deleted.status).json({ + response: deleted.response, + }); + } } diff --git a/pages/api/routes/tags/index.ts b/pages/api/routes/tags/index.ts index ea0aff5..5bc9b6a 100644 --- a/pages/api/routes/tags/index.ts +++ b/pages/api/routes/tags/index.ts @@ -17,5 +17,8 @@ export default async function ( return res.status(401).json({ response: "You must be logged in." }); } - if (req.method === "GET") return await getTags(req, res, session); + if (req.method === "GET") { + const tags = await getTags(session.user.id); + return res.status(tags.status).json({ response: tags.response }); + } } diff --git a/pages/collections/[id].tsx b/pages/collections/[id].tsx index cf06f26..f1c0cff 100644 --- a/pages/collections/[id].tsx +++ b/pages/collections/[id].tsx @@ -12,10 +12,7 @@ export default function () { return ( // ml-80 -
-

- {linksByCollection.length || 0} Links Found -

+
{linksByCollection.map((e, i) => { return ; })} diff --git a/pages/collections/index.tsx b/pages/collections/index.tsx index 8a9dfe6..b2db463 100644 --- a/pages/collections/index.tsx +++ b/pages/collections/index.tsx @@ -1,20 +1,56 @@ -import { useSession } from "next-auth/react"; import useCollectionStore from "@/store/collections"; - +import { faAdd, faBox, faEllipsis } from "@fortawesome/free-solid-svg-icons"; +import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import CollectionCard from "@/components/CollectionCard"; +import Dropdown from "@/components/Dropdown"; +import { useState } from "react"; export default function () { const { collections } = useCollectionStore(); - const { data: session, status } = useSession(); - - const user = session?.user; + const [editDropdown, setEditDropdown] = useState(false); return ( // ml-80 -
- {collections.map((e, i) => { - return ; - })} +
+
+
+ +

All Collections

+
+
+
setEditDropdown(!editDropdown)} + id="edit-dropdown" + className="inline-flex rounded-md cursor-pointer hover:bg-white hover:border-sky-500 border-sky-100 border duration-100 p-1" + > + +
+ {editDropdown ? ( + , + }, + ]} + onClickOutside={(e: Event) => { + const target = e.target as HTMLInputElement; + if (target.id !== "edit-dropdown") setEditDropdown(false); + }} + className="absolute top-7 left-0" + /> + ) : null} +
+
+
+ {collections.map((e, i) => { + return ; + })} +
); } diff --git a/pages/links.tsx b/pages/links.tsx new file mode 100644 index 0000000..01fb4e8 --- /dev/null +++ b/pages/links.tsx @@ -0,0 +1,14 @@ +import LinkList from "@/components/LinkList"; +import useLinkStore from "@/store/links"; + +export default function Links() { + const { links } = useLinkStore(); + + return ( +
+ {links.map((e, i) => { + return ; + })} +
+ ); +} diff --git a/pages/login.tsx b/pages/login.tsx index 5f32162..ab3c60d 100644 --- a/pages/login.tsx +++ b/pages/login.tsx @@ -21,6 +21,8 @@ export default function () { password: form.password, }); + console.log(res?.status); + if (res?.ok) { setForm({ email: "", diff --git a/prisma/migrations/20230322214726_renamed_is_favorite_to_starred/migration.sql b/prisma/migrations/20230322214726_renamed_is_favorite_to_starred/migration.sql deleted file mode 100644 index 48f56e6..0000000 --- a/prisma/migrations/20230322214726_renamed_is_favorite_to_starred/migration.sql +++ /dev/null @@ -1,2 +0,0 @@ --- AlterTable -ALTER TABLE "Link" RENAME COLUMN "isFavorites" TO "starred"; diff --git a/prisma/migrations/20230312184928_init/migration.sql b/prisma/migrations/20230327225044_init/migration.sql similarity index 88% rename from prisma/migrations/20230312184928_init/migration.sql rename to prisma/migrations/20230327225044_init/migration.sql index 0158c62..b58779b 100644 --- a/prisma/migrations/20230312184928_init/migration.sql +++ b/prisma/migrations/20230327225044_init/migration.sql @@ -37,7 +37,6 @@ CREATE TABLE "Link" ( "url" TEXT NOT NULL, "title" TEXT NOT NULL, "collectionId" INTEGER NOT NULL, - "isFavorites" BOOLEAN NOT NULL, "screenshotPath" TEXT NOT NULL, "pdfPath" TEXT NOT NULL, "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, @@ -50,6 +49,7 @@ CREATE TABLE "Tag" ( "id" SERIAL NOT NULL, "name" TEXT NOT NULL, "collectionId" INTEGER NOT NULL, + "ownerId" INTEGER NOT NULL, CONSTRAINT "Tag_pkey" PRIMARY KEY ("id") ); @@ -63,6 +63,12 @@ CREATE TABLE "_LinkToTag" ( -- CreateIndex CREATE UNIQUE INDEX "User_email_key" ON "User"("email"); +-- CreateIndex +CREATE UNIQUE INDEX "Collection_name_ownerId_key" ON "Collection"("name", "ownerId"); + +-- CreateIndex +CREATE UNIQUE INDEX "Tag_name_ownerId_key" ON "Tag"("name", "ownerId"); + -- CreateIndex CREATE UNIQUE INDEX "Tag_name_collectionId_key" ON "Tag"("name", "collectionId"); @@ -87,6 +93,9 @@ ALTER TABLE "Link" ADD CONSTRAINT "Link_collectionId_fkey" FOREIGN KEY ("collect -- AddForeignKey ALTER TABLE "Tag" ADD CONSTRAINT "Tag_collectionId_fkey" FOREIGN KEY ("collectionId") REFERENCES "Collection"("id") ON DELETE RESTRICT ON UPDATE CASCADE; +-- AddForeignKey +ALTER TABLE "Tag" ADD CONSTRAINT "Tag_ownerId_fkey" FOREIGN KEY ("ownerId") REFERENCES "User"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + -- AddForeignKey ALTER TABLE "_LinkToTag" ADD CONSTRAINT "_LinkToTag_A_fkey" FOREIGN KEY ("A") REFERENCES "Link"("id") ON DELETE CASCADE ON UPDATE CASCADE; diff --git a/prisma/migrations/20230328031049_init/migration.sql b/prisma/migrations/20230328031049_init/migration.sql new file mode 100644 index 0000000..562ef5b --- /dev/null +++ b/prisma/migrations/20230328031049_init/migration.sql @@ -0,0 +1,2 @@ +-- DropIndex +DROP INDEX "Tag_name_collectionId_key"; diff --git a/prisma/migrations/20230328072406_/migration.sql b/prisma/migrations/20230328072406_/migration.sql new file mode 100644 index 0000000..a70afb8 --- /dev/null +++ b/prisma/migrations/20230328072406_/migration.sql @@ -0,0 +1,11 @@ +/* + Warnings: + + - You are about to drop the column `collectionId` on the `Tag` table. All the data in the column will be lost. + +*/ +-- DropForeignKey +ALTER TABLE "Tag" DROP CONSTRAINT "Tag_collectionId_fkey"; + +-- AlterTable +ALTER TABLE "Tag" DROP COLUMN "collectionId"; diff --git a/prisma/schema.prisma b/prisma/schema.prisma index 19c207c..9c5acdf 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -13,6 +13,7 @@ model User { email String @unique password String collections Collection[] + tags Tag[] collectionsJoined UsersAndCollections[] createdAt DateTime @default(now()) } @@ -24,8 +25,9 @@ model Collection { ownerId Int members UsersAndCollections[] links Link[] - tags Tag[] createdAt DateTime @default(now()) + + @@unique([name, ownerId]) } model UsersAndCollections { @@ -50,7 +52,6 @@ model Link { collection Collection @relation(fields: [collectionId], references: [id]) collectionId Int tags Tag[] - starred Boolean screenshotPath String pdfPath String createdAt DateTime @default(now()) @@ -60,8 +61,8 @@ model Tag { id Int @id @default(autoincrement()) name String links Link[] - collections Collection @relation(fields: [collectionId], references: [id]) - collectionId Int + owner User @relation(fields: [ownerId], references: [id]) + ownerId Int - @@unique([name, collectionId]) + @@unique([name, ownerId]) } \ No newline at end of file diff --git a/public/android-chrome-192x192.png b/public/android-chrome-192x192.png new file mode 100644 index 0000000..7e10908 Binary files /dev/null and b/public/android-chrome-192x192.png differ diff --git a/public/android-chrome-512x512.png b/public/android-chrome-512x512.png new file mode 100644 index 0000000..7dd4183 Binary files /dev/null and b/public/android-chrome-512x512.png differ diff --git a/public/apple-touch-icon.png b/public/apple-touch-icon.png new file mode 100644 index 0000000..02568a1 Binary files /dev/null and b/public/apple-touch-icon.png differ diff --git a/public/favicon-16x16.png b/public/favicon-16x16.png new file mode 100644 index 0000000..4045c7d Binary files /dev/null and b/public/favicon-16x16.png differ diff --git a/public/favicon-32x32.png b/public/favicon-32x32.png new file mode 100644 index 0000000..99c3808 Binary files /dev/null and b/public/favicon-32x32.png differ diff --git a/public/favicon.ico b/public/favicon.ico index 718d6fe..9844cef 100644 Binary files a/public/favicon.ico and b/public/favicon.ico differ diff --git a/public/icon.png b/public/icon.png new file mode 100644 index 0000000..ef4dfaf Binary files /dev/null and b/public/icon.png differ diff --git a/public/site.webmanifest b/public/site.webmanifest new file mode 100644 index 0000000..45dc8a2 --- /dev/null +++ b/public/site.webmanifest @@ -0,0 +1 @@ +{"name":"","short_name":"","icons":[{"src":"/android-chrome-192x192.png","sizes":"192x192","type":"image/png"},{"src":"/android-chrome-512x512.png","sizes":"512x512","type":"image/png"}],"theme_color":"#ffffff","background_color":"#ffffff","display":"standalone"} \ No newline at end of file diff --git a/store/links.ts b/store/links.ts index 9fe9db7..858c2e0 100644 --- a/store/links.ts +++ b/store/links.ts @@ -1,12 +1,12 @@ import { create } from "zustand"; -import { ExtendedLink, NewLink } from "@/types/global"; +import { ExtendedLink } from "@/types/global"; import useTagStore from "./tags"; import useCollectionStore from "./collections"; type LinkStore = { links: ExtendedLink[]; setLinks: () => void; - addLink: (linkName: NewLink) => Promise; + addLink: (linkName: ExtendedLink) => Promise; updateLink: (link: ExtendedLink) => void; removeLink: (link: ExtendedLink) => void; }; @@ -31,6 +31,8 @@ const useLinkStore = create()((set) => ({ const data = await response.json(); + console.log(data); + if (response.ok) set((state) => ({ links: [...state.links, data.response], @@ -43,7 +45,7 @@ const useLinkStore = create()((set) => ({ }, updateLink: (link) => set((state) => ({ - links: state.links.map((c) => (c.id === link.id ? link : c)), + links: state.links.map((e) => (e.id === link.id ? link : e)), })), removeLink: async (link) => { const response = await fetch("/api/routes/links", { diff --git a/types/global.ts b/types/global.ts index 3a3fffc..79decde 100644 --- a/types/global.ts +++ b/types/global.ts @@ -8,9 +8,10 @@ export interface ExtendedLink extends Link { export interface NewLink { name: string; url: string; - tags: string[]; + tags: Tag[]; collection: { - id: string | number; - isNew?: boolean; + id: number | undefined; + name: string | undefined; + ownerId: number | undefined; }; } diff --git a/yarn.lock b/yarn.lock index 0aeaf73..ff456d5 100644 --- a/yarn.lock +++ b/yarn.lock @@ -58,6 +58,41 @@ "@babel/helper-validator-identifier" "^7.19.1" to-fast-properties "^2.0.0" +"@cliqz/adblocker-content@^1.23.8", "@cliqz/adblocker-content@^1.26.3": + version "1.26.3" + resolved "https://registry.yarnpkg.com/@cliqz/adblocker-content/-/adblocker-content-1.26.3.tgz#6f0c78883d6574f0d0ce081a6a79d052c1c89e47" + integrity sha512-Bg6Ex5LNBUnijhlQlkeZqrtKqViqfcTXiXvpXQHMY01pdeZQ70rYBT7HRV5FpQYV3xWkRaQrClanhWz36XWRew== + dependencies: + "@cliqz/adblocker-extended-selectors" "^1.26.3" + +"@cliqz/adblocker-extended-selectors@^1.26.3": + version "1.26.3" + resolved "https://registry.yarnpkg.com/@cliqz/adblocker-extended-selectors/-/adblocker-extended-selectors-1.26.3.tgz#7553158ae78e7a50a263bfc595e521746cceec00" + integrity sha512-wLcP7gkc3YVee/iqkIbFoeweSMbX9aaNUissIlzqDz+8BAci0RXOt4SHj+Ri/TIpTkR5urvhKsmQ8sb1hnJX6Q== + +"@cliqz/adblocker-puppeteer@1.23.8": + version "1.23.8" + resolved "https://registry.yarnpkg.com/@cliqz/adblocker-puppeteer/-/adblocker-puppeteer-1.23.8.tgz#e74636cd200459d1734929e41504a76939504311" + integrity sha512-Ca1/DBqQXsOpKTFVAHX6OpLTSEupXmUkUWHj6iXhLLleC7RPISN5B0b801VDmaGRqoC5zKRxn0vYbIfpgCWVug== + dependencies: + "@cliqz/adblocker" "^1.23.8" + "@cliqz/adblocker-content" "^1.23.8" + tldts-experimental "^5.6.21" + +"@cliqz/adblocker@^1.23.8": + version "1.26.3" + resolved "https://registry.yarnpkg.com/@cliqz/adblocker/-/adblocker-1.26.3.tgz#8ae59ffaf731d26ee515eeb3a9b3d51c28480b90" + integrity sha512-RdXlgNRWEvT+QAVuc81hsitSOObXFkAJiXPL/8PmJ8rFKh0RHfkOpdXl8Xb2GOh2HUbKhy5u9vAhSFMCBKCbCg== + dependencies: + "@cliqz/adblocker-content" "^1.26.3" + "@cliqz/adblocker-extended-selectors" "^1.26.3" + "@remusao/guess-url-type" "^1.1.2" + "@remusao/small" "^1.1.2" + "@remusao/smaz" "^1.7.1" + "@types/chrome" "^0.0.224" + "@types/firefox-webext-browser" "^111.0.0" + tldts-experimental "^5.6.21" + "@emotion/babel-plugin@^11.10.6": version "11.10.6" resolved "https://registry.yarnpkg.com/@emotion/babel-plugin/-/babel-plugin-11.10.6.tgz#a68ee4b019d661d6f37dec4b8903255766925ead" @@ -377,6 +412,41 @@ resolved "https://registry.yarnpkg.com/@prisma/engines/-/engines-4.9.0.tgz#05a1411964e047c1bc43f777c7a1c69f86a2a26c" integrity sha512-t1pt0Gsp+HcgPJrHFc+d/ZSAaKKWar2G/iakrE07yeKPNavDP3iVKPpfXP22OTCHZUWf7OelwKJxQgKAm5hkgw== +"@remusao/guess-url-type@^1.1.2": + version "1.2.1" + resolved "https://registry.yarnpkg.com/@remusao/guess-url-type/-/guess-url-type-1.2.1.tgz#b3e7c32abdf98d0fb4f93cc67cad580b5fe4ba57" + integrity sha512-rbOqre2jW8STjheOsOaQHLgYBaBZ9Owbdt8NO7WvNZftJlaG3y/K9oOkl8ZUpuFBisIhmBuMEW6c+YrQl5inRA== + +"@remusao/small@^1.1.2": + version "1.2.1" + resolved "https://registry.yarnpkg.com/@remusao/small/-/small-1.2.1.tgz#63bfe4548832289f94ac868a0c305970c9a0e5f9" + integrity sha512-7MjoGt0TJMVw1GPKgWq6SJPws1SLsUXQRa43Umht+nkyw2jnpy3WpiLNqGdwo5rHr5Wp9B2W/Pm5RQp656UJdw== + +"@remusao/smaz-compress@^1.9.1": + version "1.9.1" + resolved "https://registry.yarnpkg.com/@remusao/smaz-compress/-/smaz-compress-1.9.1.tgz#fc75eaf9bcac2d58bc4c3d518183a7cb9612d275" + integrity sha512-E2f48TwloQu3r6BdLOGF2aczeH7bJ/32oJGqvzT9SKur0cuUnLcZ7ZXP874E2fwmdE+cXzfC7bKzp79cDnmeyw== + dependencies: + "@remusao/trie" "^1.4.1" + +"@remusao/smaz-decompress@^1.9.1": + version "1.9.1" + resolved "https://registry.yarnpkg.com/@remusao/smaz-decompress/-/smaz-decompress-1.9.1.tgz#8094f997e8fb591a678cda9cf08c209c825eba5b" + integrity sha512-TfjKKprYe3n47od8auhvJ/Ikj9kQTbDTe71ynKlxslrvvUhlIV3VQSuwYuMWMbdz1fIs0H/fxCN1Z8/H3km6/A== + +"@remusao/smaz@^1.7.1": + version "1.9.1" + resolved "https://registry.yarnpkg.com/@remusao/smaz/-/smaz-1.9.1.tgz#a2b9b045385f81e1615a68d932b7cc8b04c9db8d" + integrity sha512-e6BLuP8oaXCZ9+v46Is4ilAZ/Vq6YLgmBP204Ixgk1qTjXmqvFYG7+AS7v9nsZdGOy96r9DWGFbbDVgMxwu1rA== + dependencies: + "@remusao/smaz-compress" "^1.9.1" + "@remusao/smaz-decompress" "^1.9.1" + +"@remusao/trie@^1.4.1": + version "1.4.1" + resolved "https://registry.yarnpkg.com/@remusao/trie/-/trie-1.4.1.tgz#755d09f8a007476334e611f42719b2d581f00720" + integrity sha512-yvwa+aCyYI/UjeD39BnpMypG8N06l86wIDW1/PAc6ihBRnodIfZDwccxQN3n1t74wduzaz74m4ZMHZnB06567Q== + "@rushstack/eslint-patch@^1.1.3": version "1.2.0" resolved "https://registry.yarnpkg.com/@rushstack/eslint-patch/-/eslint-patch-1.2.0.tgz#8be36a1f66f3265389e90b5f9c9962146758f728" @@ -396,16 +466,58 @@ dependencies: "@types/node" "*" +"@types/chrome@^0.0.224": + version "0.0.224" + resolved "https://registry.yarnpkg.com/@types/chrome/-/chrome-0.0.224.tgz#0138497299eaaf261d61ece62d7d6af3868ce856" + integrity sha512-YkL7q3KDV7OAKgVCBNIfH73rnjNMbIzAYHzTa2DKhSK/2z0Wf/n8yJnK/UoW+lvuYJJR4LtAkG3YvsIZTy7BOA== + dependencies: + "@types/filesystem" "*" + "@types/har-format" "*" + "@types/crypto-js@^4.1.1": version "4.1.1" resolved "https://registry.yarnpkg.com/@types/crypto-js/-/crypto-js-4.1.1.tgz#602859584cecc91894eb23a4892f38cfa927890d" integrity sha512-BG7fQKZ689HIoc5h+6D2Dgq1fABRa0RbBWKBd9SP/MVRVXROflpm5fhwyATX5duFmbStzyzyycPB8qUYKDH3NA== +"@types/debug@^4.1.0": + version "4.1.7" + resolved "https://registry.yarnpkg.com/@types/debug/-/debug-4.1.7.tgz#7cc0ea761509124709b8b2d1090d8f6c17aadb82" + integrity sha512-9AonUzyTjXXhEOa0DnqpzZi6VHlqKMswga9EXjpXnnqxwLtdvPPtlO8evrI5D9S6asFRCQ6v+wpiUKbw+vKqyg== + dependencies: + "@types/ms" "*" + +"@types/filesystem@*": + version "0.0.32" + resolved "https://registry.yarnpkg.com/@types/filesystem/-/filesystem-0.0.32.tgz#307df7cc084a2293c3c1a31151b178063e0a8edf" + integrity sha512-Yuf4jR5YYMR2DVgwuCiP11s0xuVRyPKmz8vo6HBY3CGdeMj8af93CFZX+T82+VD1+UqHOxTq31lO7MI7lepBtQ== + dependencies: + "@types/filewriter" "*" + +"@types/filewriter@*": + version "0.0.29" + resolved "https://registry.yarnpkg.com/@types/filewriter/-/filewriter-0.0.29.tgz#a48795ecadf957f6c0d10e0c34af86c098fa5bee" + integrity sha512-BsPXH/irW0ht0Ji6iw/jJaK8Lj3FJemon2gvEqHKpCdDCeemHa+rI3WBGq5z7cDMZgoLjY40oninGxqk+8NzNQ== + +"@types/firefox-webext-browser@^111.0.0": + version "111.0.0" + resolved "https://registry.yarnpkg.com/@types/firefox-webext-browser/-/firefox-webext-browser-111.0.0.tgz#16311d8da94e21a715d1688ba8547069eb89cf5a" + integrity sha512-KboW0ughUYzuYAvzWGJsiSMmH9AgJDvnstjsNrXMgf6cpJ5g1eBGzkqpjPzVqkOyTH/mFl7gd15+XyaVQhKywA== + +"@types/har-format@*": + version "1.2.10" + resolved "https://registry.yarnpkg.com/@types/har-format/-/har-format-1.2.10.tgz#7b4e1e0ada4d17684ac3b05d601a4871cfab11fc" + integrity sha512-o0J30wqycjF5miWDKYKKzzOU1ZTLuA42HZ4HE7/zqTOc/jTLdQ5NhYWvsRQo45Nfi1KHoRdNhteSI4BAxTF1Pg== + "@types/json5@^0.0.29": version "0.0.29" resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" integrity sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ== +"@types/ms@*": + version "0.7.31" + resolved "https://registry.yarnpkg.com/@types/ms/-/ms-0.7.31.tgz#31b7ca6407128a3d2bbc27fe2d21b345397f6197" + integrity sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA== + "@types/node@*": version "18.11.19" resolved "https://registry.yarnpkg.com/@types/node/-/node-18.11.19.tgz#35e26df9ec441ab99d73e99e9aca82935eea216d" @@ -454,6 +566,13 @@ resolved "https://registry.yarnpkg.com/@types/scheduler/-/scheduler-0.16.2.tgz#1a62f89525723dde24ba1b01b092bf5df8ad4d39" integrity sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew== +"@types/yauzl@^2.9.1": + version "2.10.0" + resolved "https://registry.yarnpkg.com/@types/yauzl/-/yauzl-2.10.0.tgz#b3248295276cf8c6f153ebe6a9aba0c988cb2599" + integrity sha512-Cn6WYCm0tXv8p6k+A8PvbDG763EDpBoTzHdA+Q/MF6H3sapGjCm9NzoaJncJS9tUKSuCoDs9XHxYYsQDgxR6kw== + dependencies: + "@types/node" "*" + "@typescript-eslint/parser@^5.42.0": version "5.49.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.49.0.tgz#d699734b2f20e16351e117417d34a2bc9d7c4b90" @@ -606,6 +725,11 @@ aria-query@^5.1.3: dependencies: deep-equal "^2.0.5" +arr-union@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" + integrity sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q== + array-includes@^3.1.5, array-includes@^3.1.6: version "3.1.6" resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.6.tgz#9e9e720e194f198266ba9e18c29e6a9b0e4b225f" @@ -701,6 +825,11 @@ balanced-match@^1.0.0: resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== +base64-js@^1.3.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" + integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== + bcrypt@^5.1.0: version "5.1.0" resolved "https://registry.yarnpkg.com/bcrypt/-/bcrypt-5.1.0.tgz#bbb27665dbc400480a524d8991ac7434e8529e17" @@ -714,6 +843,15 @@ binary-extensions@^2.0.0: resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== +bl@^4.0.3: + version "4.1.0" + resolved "https://registry.yarnpkg.com/bl/-/bl-4.1.0.tgz#451535264182bec2fbbc83a62ab98cf11d9f7b3a" + integrity sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w== + dependencies: + buffer "^5.5.0" + inherits "^2.0.4" + readable-stream "^3.4.0" + brace-expansion@^1.1.7: version "1.1.11" resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" @@ -739,6 +877,19 @@ browserslist@^4.21.4: node-releases "^2.0.6" update-browserslist-db "^1.0.9" +buffer-crc32@~0.2.3: + version "0.2.13" + resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242" + integrity sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ== + +buffer@^5.2.1, buffer@^5.5.0: + version "5.7.1" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" + integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== + dependencies: + base64-js "^1.3.1" + ieee754 "^1.1.13" + call-bind@^1.0.0, call-bind@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" @@ -794,16 +945,39 @@ chokidar@^3.5.3: optionalDependencies: fsevents "~2.3.2" +chownr@^1.1.1: + version "1.1.4" + resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b" + integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg== + chownr@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/chownr/-/chownr-2.0.0.tgz#15bfbe53d2eab4cf70f18a8cd68ebe5b3cb1dece" integrity sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ== +chromium-bidi@0.4.5: + version "0.4.5" + resolved "https://registry.yarnpkg.com/chromium-bidi/-/chromium-bidi-0.4.5.tgz#a352e755536dde609bd2c77e4b1f0906bff8784e" + integrity sha512-rkav9YzRfAshSTG3wNXF7P7yNiI29QAo1xBXElPoCoSQR5n20q3cOyVhDv6S7+GlF/CJ/emUxlQiR0xOPurkGg== + dependencies: + mitt "3.0.0" + client-only@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/client-only/-/client-only-0.0.1.tgz#38bba5d403c41ab150bff64a95c85013cf73bca1" integrity sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA== +clone-deep@^0.2.4: + version "0.2.4" + resolved "https://registry.yarnpkg.com/clone-deep/-/clone-deep-0.2.4.tgz#4e73dd09e9fb971cc38670c5dced9c1896481cc6" + integrity sha512-we+NuQo2DHhSl+DP6jlUiAhyAjBQrYnpOk15rN6c6JSPScjiCLh8IbSU+VTcph6YS3o7mASE8a0+gbZ7ChLpgg== + dependencies: + for-own "^0.1.3" + is-plain-object "^2.0.1" + kind-of "^3.0.2" + lazy-cache "^1.0.3" + shallow-clone "^0.1.2" + color-convert@^1.9.0: version "1.9.3" resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" @@ -853,6 +1027,16 @@ cookie@^0.5.0: resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.5.0.tgz#d1f5d71adec6558c58f389987c366aa47e994f8b" integrity sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw== +cosmiconfig@8.1.3: + version "8.1.3" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-8.1.3.tgz#0e614a118fcc2d9e5afc2f87d53cd09931015689" + integrity sha512-/UkO2JKI18b5jVMJUp0lvKFMpa/Gye+ZgZjKD+DGEN9y7NRcf/nK1A0sp67ONmKtnDCNMS44E6jrk0Yc3bDuUw== + dependencies: + import-fresh "^3.2.1" + js-yaml "^4.1.0" + parse-json "^5.0.0" + path-type "^4.0.0" + cosmiconfig@^7.0.0: version "7.1.0" resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-7.1.0.tgz#1443b9afa596b670082ea46cbd8f6a62b84635f6" @@ -864,6 +1048,13 @@ cosmiconfig@^7.0.0: path-type "^4.0.0" yaml "^1.10.0" +cross-fetch@3.1.5: + version "3.1.5" + resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-3.1.5.tgz#e1389f44d9e7ba767907f7af8454787952ab534f" + integrity sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw== + dependencies: + node-fetch "2.6.7" + cross-spawn@^7.0.2, cross-spawn@^7.0.3: version "7.0.3" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" @@ -893,7 +1084,7 @@ damerau-levenshtein@^1.0.8: resolved "https://registry.yarnpkg.com/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz#b43d286ccbd36bc5b2f7ed41caf2d0aba1f8a6e7" integrity sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA== -debug@4, debug@^4.1.1, debug@^4.3.2, debug@^4.3.4: +debug@4, debug@4.3.4, debug@^4.1.1, debug@^4.3.2, debug@^4.3.4: version "4.3.4" resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== @@ -935,6 +1126,11 @@ deep-is@^0.1.3: resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== +deepmerge@^4.2.2: + version "4.3.1" + resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.3.1.tgz#44b5f2147cd3b00d4b56137685966f26fd25dd4a" + integrity sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A== + define-lazy-prop@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz#3f7ae421129bcaaac9bc74905c98a0009ec9ee7f" @@ -972,6 +1168,11 @@ detective@^5.2.1: defined "^1.0.0" minimist "^1.2.6" +devtools-protocol@0.0.1107588: + version "0.0.1107588" + resolved "https://registry.yarnpkg.com/devtools-protocol/-/devtools-protocol-0.0.1107588.tgz#f8cac707840b97cc30b029359341bcbbb0ad8ffa" + integrity sha512-yIR+pG9x65Xko7bErCUSQaDLrO/P1p3JUzEk7JCU4DowPcGHkTGUGQapcfcLc4qj0UaALwZ+cr0riFgiqpixcg== + didyoumean@^1.2.2: version "1.2.2" resolved "https://registry.yarnpkg.com/didyoumean/-/didyoumean-1.2.2.tgz#989346ffe9e839b4555ecf5666edea0d3e8ad037" @@ -1026,6 +1227,13 @@ emoji-regex@^9.2.2: resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72" integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== +end-of-stream@^1.1.0, end-of-stream@^1.4.1: + version "1.4.4" + resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" + integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== + dependencies: + once "^1.4.0" + enhanced-resolve@^5.10.0: version "5.12.0" resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.12.0.tgz#300e1c90228f5b570c4d35babf263f6da7155634" @@ -1351,6 +1559,17 @@ esutils@^2.0.2: resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== +extract-zip@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/extract-zip/-/extract-zip-2.0.1.tgz#663dca56fe46df890d5f131ef4a06d22bb8ba13a" + integrity sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg== + dependencies: + debug "^4.1.1" + get-stream "^5.1.0" + yauzl "^2.10.0" + optionalDependencies: + "@types/yauzl" "^2.9.1" + fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: version "3.1.3" resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" @@ -1384,6 +1603,13 @@ fastq@^1.6.0: dependencies: reusify "^1.0.4" +fd-slicer@~1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/fd-slicer/-/fd-slicer-1.1.0.tgz#25c7c89cb1f9077f8891bbe61d8f390eae256f1e" + integrity sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g== + dependencies: + pend "~1.2.0" + file-entry-cache@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027" @@ -1431,11 +1657,42 @@ for-each@^0.3.3: dependencies: is-callable "^1.1.3" +for-in@^0.1.3: + version "0.1.8" + resolved "https://registry.yarnpkg.com/for-in/-/for-in-0.1.8.tgz#d8773908e31256109952b1fdb9b3fa867d2775e1" + integrity sha512-F0to7vbBSHP8E3l6dCjxNOLuSFAACIxFy3UehTUlG7svlXi37HHsDkyVcHo0Pq8QwrE+pXvWSVX3ZT1T9wAZ9g== + +for-in@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" + integrity sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ== + +for-own@^0.1.3: + version "0.1.5" + resolved "https://registry.yarnpkg.com/for-own/-/for-own-0.1.5.tgz#5265c681a4f294dabbf17c9509b6763aa84510ce" + integrity sha512-SKmowqGTJoPzLO1T0BBJpkfp3EMacCMOuH40hOUbrbzElVktk4DioXVM99QkLCyKoiuOmyjgcWMpVz2xjE7LZw== + dependencies: + for-in "^1.0.1" + fraction.js@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/fraction.js/-/fraction.js-4.2.0.tgz#448e5109a313a3527f5a3ab2119ec4cf0e0e2950" integrity sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA== +fs-constants@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad" + integrity sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow== + +fs-extra@^10.0.0: + version "10.1.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-10.1.0.tgz#02873cfbc4084dde127eaa5f9905eef2325d1abf" + integrity sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ== + dependencies: + graceful-fs "^4.2.0" + jsonfile "^6.0.1" + universalify "^2.0.0" + fs-minipass@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-2.1.0.tgz#7f5036fdbf12c63c169190cbe4199c852271f9fb" @@ -1497,6 +1754,13 @@ get-intrinsic@^1.0.2, get-intrinsic@^1.1.1, get-intrinsic@^1.1.3: has "^1.0.3" has-symbols "^1.0.3" +get-stream@^5.1.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.2.0.tgz#4966a1795ee5ace65e706c4b7beb71257d6e22d3" + integrity sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA== + dependencies: + pump "^3.0.0" + get-symbol-description@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.0.0.tgz#7fdb81c900101fbd564dd5f1a30af5aadc1e58d6" @@ -1602,6 +1866,11 @@ gopd@^1.0.1: dependencies: get-intrinsic "^1.1.3" +graceful-fs@^4.1.6, graceful-fs@^4.2.0: + version "4.2.11" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" + integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== + graceful-fs@^4.2.4: version "4.2.10" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.10.tgz#147d3a006da4ca3ce14728c7aefc287c367d7a6c" @@ -1670,7 +1939,7 @@ hoist-non-react-statics@^3.3.1: dependencies: react-is "^16.7.0" -https-proxy-agent@^5.0.0: +https-proxy-agent@5.0.1, https-proxy-agent@^5.0.0: version "5.0.1" resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz#c59ef224a04fe8b754f3db0063a25ea30d0005d6" integrity sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA== @@ -1678,6 +1947,11 @@ https-proxy-agent@^5.0.0: agent-base "6" debug "4" +ieee754@^1.1.13: + version "1.2.1" + resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" + integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== + ignore@^5.2.0: version "5.2.4" resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.4.tgz#a291c0c6178ff1b960befe47fcdec301674a6324" @@ -1704,7 +1978,7 @@ inflight@^1.0.4: once "^1.3.0" wrappy "1" -inherits@2, inherits@^2.0.3: +inherits@2, inherits@^2.0.3, inherits@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== @@ -1762,6 +2036,11 @@ is-boolean-object@^1.1.0: call-bind "^1.0.2" has-tostringtag "^1.0.0" +is-buffer@^1.0.2, is-buffer@^1.1.5: + version "1.1.6" + resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" + integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== + is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.7: version "1.2.7" resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" @@ -1786,6 +2065,11 @@ is-docker@^2.0.0, is-docker@^2.1.1: resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.2.1.tgz#33eeabe23cfe86f14bde4408a02c0cfb853acdaa" integrity sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ== +is-extendable@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" + integrity sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw== + is-extglob@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" @@ -1830,6 +2114,13 @@ is-path-inside@^3.0.3: resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== +is-plain-object@^2.0.1: + version "2.0.4" + resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" + integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== + dependencies: + isobject "^3.0.1" + is-regex@^1.1.4: version "1.1.4" resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958" @@ -1912,6 +2203,11 @@ isexe@^2.0.0: resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== +isobject@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" + integrity sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg== + jose@^4.10.0, jose@^4.9.3: version "4.11.2" resolved "https://registry.yarnpkg.com/jose/-/jose-4.11.2.tgz#d9699307c02e18ff56825843ba90e2fae9f09e23" @@ -1956,6 +2252,15 @@ json5@^1.0.1: dependencies: minimist "^1.2.0" +jsonfile@^6.0.1: + version "6.1.0" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae" + integrity sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ== + dependencies: + universalify "^2.0.0" + optionalDependencies: + graceful-fs "^4.1.6" + "jsx-ast-utils@^2.4.1 || ^3.0.0", jsx-ast-utils@^3.3.3: version "3.3.3" resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-3.3.3.tgz#76b3e6e6cece5c69d49a5792c3d01bd1a0cdc7ea" @@ -1964,6 +2269,20 @@ json5@^1.0.1: array-includes "^3.1.5" object.assign "^4.1.3" +kind-of@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-2.0.1.tgz#018ec7a4ce7e3a86cb9141be519d24c8faa981b5" + integrity sha512-0u8i1NZ/mg0b+W3MGGw5I7+6Eib2nx72S/QvXa0hYjEkjTknYmEYQJwGu3mLC0BrhtJjtQafTkyRUQ75Kx0LVg== + dependencies: + is-buffer "^1.0.2" + +kind-of@^3.0.2: + version "3.2.2" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" + integrity sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ== + dependencies: + is-buffer "^1.1.5" + language-subtag-registry@~0.3.2: version "0.3.22" resolved "https://registry.yarnpkg.com/language-subtag-registry/-/language-subtag-registry-0.3.22.tgz#2e1500861b2e457eba7e7ae86877cbd08fa1fd1d" @@ -1976,6 +2295,16 @@ language-tags@=1.0.5: dependencies: language-subtag-registry "~0.3.2" +lazy-cache@^0.2.3: + version "0.2.7" + resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-0.2.7.tgz#7feddf2dcb6edb77d11ef1d117ab5ffdf0ab1b65" + integrity sha512-gkX52wvU/R8DVMMt78ATVPFMJqfW8FPz1GZ1sVHBVQHmu/WvhIWE4cE1GBzhJNFicDeYhnwp6Rl35BcAIM3YOQ== + +lazy-cache@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-1.0.4.tgz#a1d78fc3a50474cb80845d3b3b6e1da49a446e8e" + integrity sha512-RE2g0b5VGZsOCFOCgP7omTRYFqydmZkBwl5oNnQ1lDYC57uyO9KqNnNVxT7COSHTxrRCWVcAVOcbjk+tvh/rgQ== + levn@^0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" @@ -2032,6 +2361,15 @@ memoize-one@^6.0.0: resolved "https://registry.yarnpkg.com/memoize-one/-/memoize-one-6.0.0.tgz#b2591b871ed82948aee4727dc6abceeeac8c1045" integrity sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw== +merge-deep@^3.0.1: + version "3.0.3" + resolved "https://registry.yarnpkg.com/merge-deep/-/merge-deep-3.0.3.tgz#1a2b2ae926da8b2ae93a0ac15d90cd1922766003" + integrity sha512-qtmzAS6t6grwEkNrunqTBdn0qKwFgNWvlxUbAV8es9M7Ot1EbyApytCnvE0jALPa46ZpKDUo527kKiaWplmlFA== + dependencies: + arr-union "^3.1.0" + clone-deep "^0.2.4" + kind-of "^3.0.2" + merge2@^1.3.0, merge2@^1.4.1: version "1.4.1" resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" @@ -2077,6 +2415,24 @@ minizlib@^2.1.1: minipass "^3.0.0" yallist "^4.0.0" +mitt@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/mitt/-/mitt-3.0.0.tgz#69ef9bd5c80ff6f57473e8d89326d01c414be0bd" + integrity sha512-7dX2/10ITVyqh4aOSVI9gdape+t9l2/8QxHrFmUXu4EEUpdlxl6RudZUPZoc+zuY2hk1j7XxVroIVIan/pD/SQ== + +mixin-object@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/mixin-object/-/mixin-object-2.0.1.tgz#4fb949441dab182540f1fe035ba60e1947a5e57e" + integrity sha512-ALGF1Jt9ouehcaXaHhn6t1yGWRqGaHkPFndtFVHfZXOvkIZ/yoGaSi0AHVTafb3ZBGg4dr/bDwnaEKqCXzchMA== + dependencies: + for-in "^0.1.3" + is-extendable "^0.1.1" + +mkdirp-classic@^0.5.2: + version "0.5.3" + resolved "https://registry.yarnpkg.com/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz#fa10c9115cc6d8865be221ba47ee9bed78601113" + integrity sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A== + mkdirp@^1.0.3: version "1.0.4" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" @@ -2147,7 +2503,14 @@ node-addon-api@^5.0.0: resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-5.1.0.tgz#49da1ca055e109a23d537e9de43c09cca21eb762" integrity sha512-eh0GgfEkpnoWDq+VY8OyvYhFEzBk6jIYbRKdIlyTiAXIVJ8PyBaKb0rp7oDtoddbdoHWhq8wwr+XZ81F1rpNdA== -node-fetch@^2.6.7: +node-fetch@2.6.7: + version "2.6.7" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.7.tgz#24de9fba827e3b4ae44dc8b20256a379160052ad" + integrity sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ== + dependencies: + whatwg-url "^5.0.0" + +node-fetch@^2.6.0, node-fetch@^2.6.7: version "2.6.9" resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.9.tgz#7c7f744b5cc6eb5fd404e0c7a9fec630a55657e6" integrity sha512-DJm/CJkZkRjKKj4Zi4BsKVZh3ValV5IR5s7LVZnW+6YMh0W1BfNA8XSs6DLMGYlId5F3KnA70uu2qepcR08Qqg== @@ -2274,7 +2637,7 @@ oidc-token-hash@^5.0.1: resolved "https://registry.yarnpkg.com/oidc-token-hash/-/oidc-token-hash-5.0.1.tgz#ae6beec3ec20f0fd885e5400d175191d6e2f10c6" integrity sha512-EvoOtz6FIEBzE+9q253HsLCVRiK/0doEJ2HCvvqMQb3dHZrP3WlJKYtJ55CRTw4jmYomzH4wkPuCj/I3ZvpKxQ== -once@^1.3.0: +once@^1.3.0, once@^1.3.1, once@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== @@ -2368,6 +2731,11 @@ path-type@^4.0.0: resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== +pend@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/pend/-/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50" + integrity sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg== + picocolors@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" @@ -2383,18 +2751,6 @@ pify@^2.3.0: resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" integrity sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog== -playwright-core@1.31.2: - version "1.31.2" - resolved "https://registry.yarnpkg.com/playwright-core/-/playwright-core-1.31.2.tgz#debf4b215d14cb619adb7e511c164d068075b2ed" - integrity sha512-a1dFgCNQw4vCsG7bnojZjDnPewZcw7tZUNFN0ZkcLYKj+mPmXvg4MpaaKZ5SgqPsOmqIf2YsVRkgqiRDxD+fDQ== - -playwright@^1.31.2: - version "1.31.2" - resolved "https://registry.yarnpkg.com/playwright/-/playwright-1.31.2.tgz#4252280586c596746122cd1fdf9f8ff6a63fa852" - integrity sha512-jpC47n2PKQNtzB7clmBuWh6ftBRS/Bt5EGLigJ9k2QAKcNeYXZkEaDH5gmvb6+AbcE0DO6GnXdbl9ogG6Eh+og== - dependencies: - playwright-core "1.31.2" - postcss-import@^14.1.0: version "14.1.0" resolved "https://registry.yarnpkg.com/postcss-import/-/postcss-import-14.1.0.tgz#a7333ffe32f0b8795303ee9e40215dac922781f0" @@ -2486,6 +2842,11 @@ prisma@^4.9.0: dependencies: "@prisma/engines" "4.9.0" +progress@2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" + integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== + prop-types@^15.6.0, prop-types@^15.6.2, prop-types@^15.8.1: version "15.8.1" resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.8.1.tgz#67d87bf1a694f48435cf332c24af10214a3140b5" @@ -2495,11 +2856,108 @@ prop-types@^15.6.0, prop-types@^15.6.2, prop-types@^15.8.1: object-assign "^4.1.1" react-is "^16.13.1" +proxy-from-env@1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2" + integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg== + +pump@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" + integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" + punycode@^2.1.0: version "2.3.0" resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.0.tgz#f67fa67c94da8f4d0cfff981aee4118064199b8f" integrity sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA== +puppeteer-core@19.8.0: + version "19.8.0" + resolved "https://registry.yarnpkg.com/puppeteer-core/-/puppeteer-core-19.8.0.tgz#0152f652a64274f93f681b52ed03baf7de7905dd" + integrity sha512-5gBkLR9nae7chWDhI3mpj5QA+hPmjEOW29qw5ap5g51Uo5Lxe5Yip1uyQwZSjg5Wn/eyE9grh2Lyx3m8rPK90A== + dependencies: + chromium-bidi "0.4.5" + cross-fetch "3.1.5" + debug "4.3.4" + devtools-protocol "0.0.1107588" + extract-zip "2.0.1" + https-proxy-agent "5.0.1" + proxy-from-env "1.1.0" + tar-fs "2.1.1" + unbzip2-stream "1.4.3" + ws "8.13.0" + +puppeteer-extra-plugin-adblocker@^2.13.6: + version "2.13.6" + resolved "https://registry.yarnpkg.com/puppeteer-extra-plugin-adblocker/-/puppeteer-extra-plugin-adblocker-2.13.6.tgz#99828243579b59ed81e8b1da23d16a3a0dbae557" + integrity sha512-AftgnUZ1rg2RPe9RpX6rkYAxEohwp3iFeGIyjsAuTaIiw4VLZqOb1LSY8/S60vAxpeat60fbCajxoUetmLy4Dw== + dependencies: + "@cliqz/adblocker-puppeteer" "1.23.8" + debug "^4.1.1" + node-fetch "^2.6.0" + puppeteer-extra-plugin "^3.2.3" + +puppeteer-extra-plugin-stealth@^2.11.2: + version "2.11.2" + resolved "https://registry.yarnpkg.com/puppeteer-extra-plugin-stealth/-/puppeteer-extra-plugin-stealth-2.11.2.tgz#bd3f5a1781cac8a98c983d148086585a84fcc8f1" + integrity sha512-bUemM5XmTj9i2ZerBzsk2AN5is0wHMNE6K0hXBzBXOzP5m5G3Wl0RHhiqKeHToe/uIH8AoZiGhc1tCkLZQPKTQ== + dependencies: + debug "^4.1.1" + puppeteer-extra-plugin "^3.2.3" + puppeteer-extra-plugin-user-preferences "^2.4.1" + +puppeteer-extra-plugin-user-data-dir@^2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/puppeteer-extra-plugin-user-data-dir/-/puppeteer-extra-plugin-user-data-dir-2.4.1.tgz#4ea9d56d20455672a54fe086309a102a5126411c" + integrity sha512-kH1GnCcqEDoBXO7epAse4TBPJh9tEpVEK/vkedKfjOVOhZAvLkHGc9swMs5ChrJbRnf8Hdpug6TJlEuimXNQ+g== + dependencies: + debug "^4.1.1" + fs-extra "^10.0.0" + puppeteer-extra-plugin "^3.2.3" + rimraf "^3.0.2" + +puppeteer-extra-plugin-user-preferences@^2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/puppeteer-extra-plugin-user-preferences/-/puppeteer-extra-plugin-user-preferences-2.4.1.tgz#db8ec63c04a6a10a8f8997e15fdffdf13272161d" + integrity sha512-i1oAZxRbc1bk8MZufKCruCEC3CCafO9RKMkkodZltI4OqibLFXF3tj6HZ4LZ9C5vCXZjYcDWazgtY69mnmrQ9A== + dependencies: + debug "^4.1.1" + deepmerge "^4.2.2" + puppeteer-extra-plugin "^3.2.3" + puppeteer-extra-plugin-user-data-dir "^2.4.1" + +puppeteer-extra-plugin@^3.2.3: + version "3.2.3" + resolved "https://registry.yarnpkg.com/puppeteer-extra-plugin/-/puppeteer-extra-plugin-3.2.3.tgz#50c9f0749c005bbc7b8b208bcd00a9d46a15b585" + integrity sha512-6RNy0e6pH8vaS3akPIKGg28xcryKscczt4wIl0ePciZENGE2yoaQJNd17UiEbdmh5/6WW6dPcfRWT9lxBwCi2Q== + dependencies: + "@types/debug" "^4.1.0" + debug "^4.1.1" + merge-deep "^3.0.1" + +puppeteer-extra@^3.3.6: + version "3.3.6" + resolved "https://registry.yarnpkg.com/puppeteer-extra/-/puppeteer-extra-3.3.6.tgz#fc16ff396aae52664842da9a557ea8fa51eaa8b7" + integrity sha512-rsLBE/6mMxAjlLd06LuGacrukP2bqbzKCLzV1vrhHFavqQE/taQ2UXv3H5P0Ls7nsrASa+6x3bDbXHpqMwq+7A== + dependencies: + "@types/debug" "^4.1.0" + debug "^4.1.1" + deepmerge "^4.2.2" + +puppeteer@^19.8.0: + version "19.8.0" + resolved "https://registry.yarnpkg.com/puppeteer/-/puppeteer-19.8.0.tgz#2d2225fb24ba6813cd31304d41c6b8340c9f3582" + integrity sha512-MpQClmttCUxv4bVokX/YSXLCU12CUApuRf0rIJyGknYcIrDQNkLUx1N7hNt88Ya4lq9VDsdiDEJ3bcPijqJYPQ== + dependencies: + cosmiconfig "8.1.3" + https-proxy-agent "5.0.1" + progress "2.0.3" + proxy-from-env "1.1.0" + puppeteer-core "19.8.0" + queue-microtask@^1.2.2: version "1.2.3" resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" @@ -2562,6 +3020,15 @@ read-cache@^1.0.0: dependencies: pify "^2.3.0" +readable-stream@^3.1.1, readable-stream@^3.4.0: + version "3.6.2" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" + integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== + dependencies: + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.1" + readable-stream@^3.6.0: version "3.6.0" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" @@ -2677,6 +3144,16 @@ set-blocking@^2.0.0: resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" integrity sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw== +shallow-clone@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/shallow-clone/-/shallow-clone-0.1.2.tgz#5909e874ba77106d73ac414cfec1ffca87d97060" + integrity sha512-J1zdXCky5GmNnuauESROVu31MQSnLoYvlyEn6j2Ztk6Q5EHFIhxkMhYcv6vuDzl2XEzoRr856QwzMgWM/TmZgw== + dependencies: + is-extendable "^0.1.1" + kind-of "^2.0.1" + lazy-cache "^0.2.3" + mixin-object "^2.0.1" + shebang-command@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" @@ -2868,6 +3345,27 @@ tapable@^2.2.0: resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.1.tgz#1967a73ef4060a82f12ab96af86d52fdb76eeca0" integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ== +tar-fs@2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-2.1.1.tgz#489a15ab85f1f0befabb370b7de4f9eb5cbe8784" + integrity sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng== + dependencies: + chownr "^1.1.1" + mkdirp-classic "^0.5.2" + pump "^3.0.0" + tar-stream "^2.1.4" + +tar-stream@^2.1.4: + version "2.2.0" + resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-2.2.0.tgz#acad84c284136b060dc3faa64474aa9aebd77287" + integrity sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ== + dependencies: + bl "^4.0.3" + end-of-stream "^1.4.1" + fs-constants "^1.0.0" + inherits "^2.0.3" + readable-stream "^3.1.1" + tar@^6.1.11: version "6.1.13" resolved "https://registry.yarnpkg.com/tar/-/tar-6.1.13.tgz#46e22529000f612180601a6fe0680e7da508847b" @@ -2885,6 +3383,11 @@ text-table@^0.2.0: resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== +through@^2.3.8: + version "2.3.8" + resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" + integrity sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg== + tiny-glob@^0.2.9: version "0.2.9" resolved "https://registry.yarnpkg.com/tiny-glob/-/tiny-glob-0.2.9.tgz#2212d441ac17928033b110f8b3640683129d31e2" @@ -2893,6 +3396,18 @@ tiny-glob@^0.2.9: globalyzer "0.1.0" globrex "^0.1.2" +tldts-core@^5.7.112: + version "5.7.112" + resolved "https://registry.yarnpkg.com/tldts-core/-/tldts-core-5.7.112.tgz#168459aa79495f5d46407a685a7a9f0cdc9a272b" + integrity sha512-mutrEUgG2sp0e/MIAnv9TbSLR0IPbvmAImpzqul5O/HJ2XM1/I1sajchQ/fbj0fPdA31IiuWde8EUhfwyldY1Q== + +tldts-experimental@^5.6.21: + version "5.7.112" + resolved "https://registry.yarnpkg.com/tldts-experimental/-/tldts-experimental-5.7.112.tgz#6a44be12811161e7daf2e89950563b8e7da94ed1" + integrity sha512-Nq5qWN4OiLziAOOOEoSME7cZI4Hz8Srt+9q6cl8mZ5EAhCfmeE6l7K5XjuIKN+pySuGUvthE5aPiD185YU1/lg== + dependencies: + tldts-core "^5.7.112" + to-fast-properties@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" @@ -2973,6 +3488,19 @@ unbox-primitive@^1.0.2: has-symbols "^1.0.3" which-boxed-primitive "^1.0.2" +unbzip2-stream@1.4.3: + version "1.4.3" + resolved "https://registry.yarnpkg.com/unbzip2-stream/-/unbzip2-stream-1.4.3.tgz#b0da04c4371311df771cdc215e87f2130991ace7" + integrity sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg== + dependencies: + buffer "^5.2.1" + through "^2.3.8" + +universalify@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.0.tgz#75a4984efedc4b08975c5aeb73f530d02df25717" + integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ== + update-browserslist-db@^1.0.9: version "1.0.10" resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz#0f54b876545726f17d00cd9a2561e6dade943ff3" @@ -3078,6 +3606,11 @@ wrappy@1: resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== +ws@8.13.0: + version "8.13.0" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.13.0.tgz#9a9fb92f93cf41512a0735c8f4dd09b8a1211cd0" + integrity sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA== + xtend@^4.0.2: version "4.0.2" resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" @@ -3093,6 +3626,14 @@ yaml@^1.10.0, yaml@^1.10.2: resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b" integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== +yauzl@^2.10.0: + version "2.10.0" + resolved "https://registry.yarnpkg.com/yauzl/-/yauzl-2.10.0.tgz#c7eb17c93e112cb1086fa6d8e51fb0667b79a5f9" + integrity sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g== + dependencies: + buffer-crc32 "~0.2.3" + fd-slicer "~1.1.0" + yocto-queue@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b"