diff --git a/.env-example b/.env-example deleted file mode 100644 index 6678578..0000000 --- a/.env-example +++ /dev/null @@ -1,7 +0,0 @@ -# You can generate encryption key from setup page. -NEXT_PUBLIC_ENCRYPTION_KEY="" -# You can use any random string for JWT_KEY, it is recommended to use a strong key by combining characters, numbers and symbols. -JWT_KEY="" -# Domain name of your website. Used for fetching the og-image from public directory. -# Example: https://drive.example.com -NEXT_PUBLIC_DOMAIN="" \ No newline at end of file diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..8dfdad5 --- /dev/null +++ b/.env.example @@ -0,0 +1,5 @@ +GD_SERVICE_B64="Base64 Encoded value from Google Drive Service Account JSON file" + +NEXT_PUBLIC_ENCRYPTION_KEY="Rj3wRGB9nUElQ7OA" +NEXT_PUBLIC_SITE_PASSWORD="mbaharip" +NEXT_PUBLIC_VERCEL_URL="http://localhost:3000" \ No newline at end of file diff --git a/.gitignore b/.gitignore index 2a4510c..4f49267 100644 --- a/.gitignore +++ b/.gitignore @@ -9,7 +9,6 @@ /coverage # next.js -/.next/ /out/ # production @@ -28,17 +27,15 @@ yarn-error.log* .env .env.local -# vercel -.vercel - # typescript *.tsbuildinfo next-env.d.ts # personal docs /docs -/.next -/.vscode /src/pages/api/legacy/ -.vercel +/**/*/_legacy/ + +/.*/ +/src/_app \ No newline at end of file diff --git a/.idea/.gitignore b/.idea/.gitignore deleted file mode 100644 index b58b603..0000000 --- a/.idea/.gitignore +++ /dev/null @@ -1,5 +0,0 @@ -# Default ignored files -/shelf/ -/workspace.xml -# Editor-based HTTP Client requests -/httpRequests/ diff --git a/.idea/compiler.xml b/.idea/compiler.xml deleted file mode 100644 index 1a2fb33..0000000 --- a/.idea/compiler.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - \ No newline at end of file diff --git a/.idea/discord.xml b/.idea/discord.xml deleted file mode 100644 index d8e9561..0000000 --- a/.idea/discord.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - \ No newline at end of file diff --git a/.idea/drive-manager.iml b/.idea/drive-manager.iml deleted file mode 100644 index 24643cc..0000000 --- a/.idea/drive-manager.iml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/inspectionProfiles/Project_Default.xml b/.idea/inspectionProfiles/Project_Default.xml deleted file mode 100644 index 5be0a6c..0000000 --- a/.idea/inspectionProfiles/Project_Default.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml deleted file mode 100644 index 187b5d5..0000000 --- a/.idea/modules.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/.idea/prettier.xml b/.idea/prettier.xml deleted file mode 100644 index 0c83ac4..0000000 --- a/.idea/prettier.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml deleted file mode 100644 index 35eb1dd..0000000 --- a/.idea/vcs.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/.prettierrc.js b/.prettierrc.js index 8e2dfae..99bcabb 100644 --- a/.prettierrc.js +++ b/.prettierrc.js @@ -4,7 +4,7 @@ module.exports = { require("prettier-plugin-tailwindcss"), require("@trivago/prettier-plugin-sort-imports"), ], - printWidth: 60, + printWidth: 120, tabWidth: 2, useTabs: false, semi: true, diff --git a/README.md b/README.md index 7b165be..4248a4e 100644 --- a/README.md +++ b/README.md @@ -1,72 +1,79 @@ ![next-gdrive-index](./public/og.png) -## Status - -Basic features are working now, can be used for daily use. -You can check the demo [here](https://drive.mbaharip.com). +

+ Demo + · + Deploying Guide + · + FAQ +

## What is this? + `next-gdrive-index` is an indexer for Google Drive, it's a simple project that I made to index my files in Google Drive. It's aim to simplify the process of sharing files using Google Drive, and also implements some features that I think is useful for sharing files. This project are **HEAVILY INSPIRED** by [onedrive-vercel-index](https://github.com/spencerwooo/onedrive-vercel-index) by SpencerWooo. ### Why I made this? -I know there already some Google Drive indexer out there, but all of them are using **Cloudflare** worker. -I've tried to use it, but the speed isn't that great for me. -Currently I'm using SpencerWooo's onedrive index, and it's working perfectly for me from usage perspective and speed. -But, if I compare the price between these two services, Google Drive still cheaper than Onedrive. +when I compare the price between these two services, Google Drive still cheaper than Onedrive. For 100GB plan, Google Drive is IDR 269.000 / ~$18 USD annually, and Onedrive is IDR 319.000 / ~$21 USD annually. For free plan, Google Drive offering 15GB of storage, and Onedrive offering 5GB of storage. I know there are a lot of people selling cheap edu account for Google Drive and Onedrive, but most of the time those account doesn't last long, especially Google Drive account. So I want to do it legit without buying cheap edu account or anything similar this time. ## Features -### Navigate through your Google Drive files and folders. -You can navigate through your Google Drive files and folders, just like you're browsing your local files. -You can also set the root folder, so you can share only specific folder in your Google Drive. -### Theme support. -Choose your side! +- **Private Index**, lock the whole index site with password. +- **Folder and file protection**, you can protect your folder and files with password. +- **Readme file**, you can add readme file for your folder, so you can add some description for your folder. +- **File preview**, you can preview some file types directly from the browser, without downloading it first. + - Image preview + - Video preview + - Audio preview + - Markdown preview + - PDF preview + - Document preview (docx, pptx, xlsx) + - Code preview + - Text preview + - Manga preview (cbz) +- **File search**, you can search for files and folders easily. +- **Direct download**, you can download files directly from index site without opening Google Drive. +- **Raw file link**, you can use the raw file link for hosting your web project assets or comments on forum. -### Site wide password protection. -You can lock the site so only those who know the password can access it. -NOTE: This only protect the site, not the files. The files are still accessible if you know the link. +## File Security -### Search for files and folders. -We implement native search for files and folders, so you can search for files and folders easily. +All files fetched from Google Drive **NEED TO BE SHARED** with `Anyone with the link can view` permission. +This is because Google Drive API can only access files that are shared with `Anyone with the link can view` permission. -### File preview for some file types. -You can preview some file types directly from the browser, without downloading it first. -Most files are Images, Videos, Audio, Markdown, and PDF. (I'm still adding more file types) +But, every files `id` and `webContentLink` are encrypted with `AES-256-CBC` using your own key, so no one can access your files without the key. +Except, if the files are larger than the `fileSizeLimit` (default: 4MB for vercel), then the download will be redirected to the raw file link. -### Direct download for files. -Download files directly from index site without opening Google Drive. +## Known Issue -### Raw file link for files. -You can use the raw file link for hosting your web project assets or comments on forum. +### File size limit -### Embed your readme file for folder. -You can embed your readme file for folder, so you can add some description for your folder. -Simply upload `.readme.md` on your folder, and it will be displayed on the folder page. +File size limit causing some files can't be previewed, and the download will be redirected to the raw file link. -### Override folder OpenGraph image. -You can override the folder OpenGraph image by uploading `.banner.(png/jpg/jpeg/webp/svg)` on your folder. +### Long Response Time -## Credits -- [onedrive-vercel-index](https://github.com/spencerwooo/onedrive-vercel-index) by SpencerWooo for the inspiration and also some file type helpers. +The flow of the project are: ---- +- Validate the path is valid or not. (Only applied for `/...[path]`) +- Fetch the password, readme, and files from Google Drive. +- Show to the user. -## Known Issues -- ~~Fetching files from Google Drive API take too much time, it triggers 504 Error on Vercel.~~ -- ~~Can't download big files, because of Vercel's 4.5MB limit for serverless function.~~ (Implement redirect to Google Drive download link instead of using Vercel serverless function for files bigger than 4MB) - - Need to set the folder to public, so it can be downloaded directly from Google Drive. - - The way to get files are changed because of this, now it's using the file name, and 8 first character of file id for hiding the id so no one can access it via Google Drive. - - All id and webContentLink are now encrypted using AES-128-CBC. -- Protected folder cause long response time, because it need to fetch the file / folder first > fetch each of the parents till root > check if it's inside protected folder > then checking the password. -- Download might show scan warning, because it's using Google Drive's direct download link. +So, if you have a lot of files in your Google Drive, it might take a long time to fetch all the files. +To improve the response time, I added a cache to the response, so the next time you access the same path, it will be faster. -## TODO -Todo list are moved to [here](./TODO.md). \ No newline at end of file +ATM, it roughly take around 600 - 2 seconds to fetch all the data on my Google Drive. + +### No support for Google Shared Drive + +I don't have Google Shared Drive, so I can't test it and implement it. + +### No support for Google Docs, Sheets, and Slides + +For now, I don't have any plan to implement this, because I think it's not necessary. +All Google Drive files like Docs, Sheets, and Slides are hidden from the list. diff --git a/data/mockFiles.ts b/data/mockFiles.ts new file mode 100644 index 0000000..6b435f9 --- /dev/null +++ b/data/mockFiles.ts @@ -0,0 +1,70 @@ +import { IGDriveFiles } from "types/api/files"; +import { APIFilesResponse } from "types/api/response"; + +const mockFiles: APIFilesResponse = { + timestamp: Date.now(), + responseTime: 0, + folders: [], + files: [], + nextPageToken: "nextpageToken", + readmeExists: true, + bannerExists: true, + passwordExists: false, +}; +const mockFilesProtected: APIFilesResponse = { + timestamp: Date.now(), + responseTime: 0, + folders: [], + files: [], + nextPageToken: "nextpageToken", + readmeExists: true, + bannerExists: true, + passwordExists: true, +}; + +for (let i = 0; i < 10; i++) { + const folder: IGDriveFiles = { + mimeType: "application/vnd.google-apps.folder", + encryptedId: `encryptedId${i + 1}`, + name: `folder${i + 1}`, + trashed: false, + modifiedTime: new Date().toISOString(), + }; + const file: IGDriveFiles = { + mimeType: "application/vnd.google-apps.file", + encryptedId: `encryptedId${i + 1}`, + name: `file${i + 1}`, + trashed: false, + modifiedTime: new Date().toISOString(), + fileExtension: "txt", + encryptedWebContentLink: "encryptedWebContentLink", + size: Math.floor(Math.random() * 1000000000), + thumbnailLink: "/og.png", + imageMediaMetadata: + Math.random() > 0.5 + ? { + width: 1920, + height: 1080, + rotation: 0, + } + : null, + videoMediaMetadata: + Math.random() > 0.5 + ? { + width: 1920, + height: 1080, + durationMillis: 100000, + } + : null, + }; + + mockFiles.folders.push(folder); + mockFiles.files.push(file); + + folder.name = `folder${i + 1}protected`; + file.name = `file${i + 1}protected`; + mockFilesProtected.folders.push(folder); + mockFilesProtected.files.push(file); +} + +export { mockFiles, mockFilesProtected }; diff --git a/next.config.js b/next.config.js index a843cbe..8851780 100644 --- a/next.config.js +++ b/next.config.js @@ -1,6 +1,34 @@ /** @type {import('next').NextConfig} */ -const nextConfig = { - reactStrictMode: true, -} -module.exports = nextConfig +const withMDX = require("@next/mdx")({ + extension: /\.mdx?$/, + options: { + // If you use remark-gfm, you'll need to use next.config.mjs + // as the package is ESM only + // https://github.com/remarkjs/remark-gfm#install + remarkPlugins: [], + rehypePlugins: [], + // If you use `MDXProvider`, uncomment the following line. + providerImportSource: "@mdx-js/react", + }, +}); + +const nextConfig = { + pageExtensions: ["ts", "tsx", "js", "jsx", "md", "mdx"], + reactStrictMode: true, + async headers() { + return [ + { + source: "/:path*", + headers: [ + { + key: "Cache-Control", + value: "max-age=300, s-maxage=300, stale-while-revalidate, public", + }, + ], + }, + ]; + }, +}; + +module.exports = withMDX(nextConfig); diff --git a/package.json b/package.json index 4c98133..5e77880 100644 --- a/package.json +++ b/package.json @@ -3,7 +3,7 @@ "version": "0.1.0", "private": true, "scripts": { - "dev": "next dev -p 5000", + "dev": "next dev -p 3000", "build": "next build", "start": "next start", "lint": "next lint", @@ -11,57 +11,54 @@ "pretty": "prettier --write ." }, "dependencies": { - "@react-three/drei": "^9.66.1", - "@react-three/fiber": "^8.13.0", - "@types/react": "18.0.35", - "@types/react-dom": "18.0.11", - "@upstash/redis": "^1.20.4", - "@vercel/og": "^0.5.4", - "autoprefixer": "10.4.14", + "@cyntler/react-doc-viewer": "^1.13.0", + "@iconify/react": "^4.1.1", + "@mdx-js/loader": "^2.3.0", + "@mdx-js/react": "^2.3.0", + "@next/mdx": "^13.4.19", + "@popperjs/core": "^2.11.8", "axios": "^1.3.5", - "cors": "^2.8.5", "googleapis": "^118.0.0", "jsonwebtoken": "^9.0.0", - "mime-types": "^2.1.35", - "next": "^13.4.4", - "next-seo": "^6.0.0", - "nextjs-progressbar": "^0.0.16", - "postcss": "8.4.22", + "jszip": "^3.10.1", + "next": "^13.4.13", + "next-seo": "^6.1.0", "react": "^18.2.0", "react-dom": "^18.2.0", "react-h5-audio-player": "^3.8.6", - "react-icons": "4.8.1-snapshot.2", - "react-loading": "^2.0.3", + "react-is": "^18.2.0", "react-markdown": "^8.0.7", - "react-player": "^2.12.0", - "react-toastify": "^9.1.2", - "rehype-katex": "^6.0.2", - "rehype-prism-plus": "^1.5.1", - "rehype-raw": "^6.1.1", - "rehype-sanitize": "^5.0.1", - "remark-breaks": "^3.0.2", + "react-player": "^2.13.0", + "react-popper": "^2.3.0", + "react-toastify": "^9.1.3", + "rehype-katex": "^6.0.3", + "rehype-prism-plus": "^1.6.3", + "rehype-raw": "6.1.1", "remark-gfm": "^3.0.1", "remark-math": "^5.1.1", "remark-slug": "^7.0.1", - "remark-toc": "^8.0.1", - "swr": "^2.1.3", - "tailwindcss": "3.3.1", - "three": "^0.152.0" + "remark-toc": "^8.0.1" }, "devDependencies": { + "@faker-js/faker": "^8.0.2", "@tailwindcss/typography": "^0.5.9", "@trivago/prettier-plugin-sort-imports": "^4.1.1", "@types/cors": "^2.8.13", "@types/jsonwebtoken": "^9.0.1", "@types/mime-types": "^2.1.1", "@types/node": "18.15.11", + "@types/react": "18.0.35", + "@types/react-dom": "18.0.11", "@types/three": "^0.150.2", - "cypress": "^12.10.0", + "autoprefixer": "10.4.14", "encoding": "^0.1.13", "eslint": "8.38.0", "eslint-config-next": "^13.4.3", + "postcss": "8.4.22", "prettier": "^2.8.7", "prettier-plugin-tailwindcss": "^0.2.7", + "tailwind-merge": "^1.14.0", + "tailwindcss": "3.3.1", "typescript": "5.0.4" } } diff --git a/public/flaticon.svg b/public/flaticon.svg new file mode 100644 index 0000000..aed7d74 --- /dev/null +++ b/public/flaticon.svg @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/images/404.png b/public/images/404.png new file mode 100644 index 0000000..0cf89fa Binary files /dev/null and b/public/images/404.png differ diff --git a/public/images/password.png b/public/images/password.png new file mode 100644 index 0000000..0ee8346 Binary files /dev/null and b/public/images/password.png differ diff --git a/src/app/(__components)/clientContextWrapper.tsx b/src/app/(__components)/clientContextWrapper.tsx deleted file mode 100644 index 2e7788f..0000000 --- a/src/app/(__components)/clientContextWrapper.tsx +++ /dev/null @@ -1,95 +0,0 @@ -"use client"; - -import { useEffect, useState } from "react"; -import { ToastContainer } from "react-toastify"; -import "react-toastify/dist/ReactToastify.min.css"; - -import { - LayoutContext, - TLayout, -} from "context/layoutContext"; -import { TTheme, ThemeContext } from "context/themeContext"; - -type Props = { - children: React.ReactNode; -}; - -function ClientContextWrapper({ children }: Props) { - const [theme, setTheme] = useState("light"); - const [layout, setLayout] = useState("grid"); - - useEffect(() => { - console.log("ContextWrapper useEffect"); - if (typeof window === "undefined") return; - const lsTheme = localStorage.getItem("theme"); - const lsLayout = localStorage.getItem("layout"); - const lsSitePassword = - localStorage.getItem("sitePassword"); - - if ( - lsTheme && - (lsTheme === "dark" || lsTheme === "light") - ) { - setTheme(lsTheme as TTheme); - } - if ( - lsLayout && - (lsLayout === "grid" || lsLayout === "list") - ) { - setLayout(lsLayout as TLayout); - } - }, []); - - useEffect(() => { - if (theme === "light") { - document.body.classList.remove("dark"); - } else { - document.body.classList.add("dark"); - } - }, [theme]); - - return ( - <> - { - if (typeof window !== "undefined") { - localStorage.setItem("theme", theme); - } - setTheme(theme); - }, - }} - > - { - if (typeof window !== "undefined") { - localStorage.setItem("layout", layout); - } - setLayout(layout); - }, - }} - > - - {children} - - - - ); -} - -export default ClientContextWrapper; diff --git a/src/app/(__components)/compBreadcrumb.tsx b/src/app/(__components)/compBreadcrumb.tsx deleted file mode 100644 index c6e2c63..0000000 --- a/src/app/(__components)/compBreadcrumb.tsx +++ /dev/null @@ -1,117 +0,0 @@ -"use client"; - -import Link from "next/link"; -import { Fragment, useEffect, useState } from "react"; -import { MdHome } from "react-icons/md"; - -import { FilePath } from "types/api/path"; - -import siteConfig from "config/site.config"; - -type Props = { - data?: FilePath[]; -}; - -function Breadcrumb({ data = [] }: Props) { - const [breadcrumb, setBreadcrumb] = useState( - [], - ); - const [isLimited, setIsLimited] = - useState(false); - const [breadcrumbPath, setBreadcrumbPath] = useState< - string[] - >([]); - - useEffect(() => { - if (data.length) { - const reverseBreadcrumbs = data; - const isLimitReached = - reverseBreadcrumbs.length > - siteConfig.files.breadcrumbDepth; - const limitBreadcrumbs = isLimitReached - ? reverseBreadcrumbs.slice( - reverseBreadcrumbs.length - - siteConfig.files.breadcrumbDepth, - reverseBreadcrumbs.length, - ) - : reverseBreadcrumbs; - - setBreadcrumb(limitBreadcrumbs); - setIsLimited(isLimitReached); - - const path: string[] = []; - reverseBreadcrumbs.forEach((item) => { - path.push(item.name); - }); - setBreadcrumbPath(path); - } - }, [data]); - - return ( -
- {/* Home */} - - - Root - - {isLimited && ( - - {siteConfig.files.breadcrumbLimiter} - ... - - )} -
- {breadcrumb.map( - (parent: FilePath, index: number) => { - const findCurrentPath = - breadcrumbPath.findIndex( - (item) => item === parent.name, - ); - const url = breadcrumbPath - .slice(0, findCurrentPath + 1) - .join("/"); - return ( - - - {siteConfig.files.breadcrumbLimiter} - - - - {parent.name} - - - - ); - }, - )} -
-
- ); -} - -export default Breadcrumb; diff --git a/src/app/(__components)/compFileLayout.tsx b/src/app/(__components)/compFileLayout.tsx deleted file mode 100644 index 64c1627..0000000 --- a/src/app/(__components)/compFileLayout.tsx +++ /dev/null @@ -1,111 +0,0 @@ -"use client"; - -import { - useCallback, - useContext, - useEffect, - useState, -} from "react"; - -import { - LayoutContext, - TLayoutContext, -} from "context/layoutContext"; - -import { API_Response } from "types/api"; -import { FilesResponse } from "types/api/files"; - -import apiConfig from "config/api.config"; - -import GridLayout from "./compGridLayout"; -import ListLayout from "./compListLayout"; - -type Props = { - data: FilesResponse; -}; - -function FileLayout({ data }: Props) { - const { layout } = - useContext(LayoutContext); - const [clientData, setClientData] = - useState(data); - const [nextPageToken, setNextPageToken] = - useState(data.nextPageToken ?? ""); - const [isNextPageLoading, setIsNextPageLoading] = - useState(false); - const [totalItems, setTotalItems] = useState( - data.files.length + data.folders.length || 0, - ); - - useEffect(() => { - const files = clientData.files.length ?? 0; - const folders = clientData.folders.length ?? 0; - setTotalItems(files + folders); - }, [clientData]); - - const handleLoadMore = useCallback(async () => { - setIsNextPageLoading(true); - const { data: newData } = await fetch( - `${apiConfig.basePath}/api/files?pageToken=${nextPageToken}`, - ).then( - (res) => - res.json() as Promise>, - ); - - setClientData((prev) => ({ - ...prev, - files: [...prev.files, ...(newData?.files ?? [])], - folders: [ - ...prev.folders, - ...(newData?.folders ?? []), - ], - })); - setNextPageToken(newData?.nextPageToken ?? ""); - setIsNextPageLoading(false); - }, [nextPageToken]); - - return ( - <> - {layout === "grid" ? ( - <> - - - ) : ( - - )} - {nextPageToken && ( -
- -
- )} -
-
- - Total {totalItems} items - -
-
- - ); -} - -export default FileLayout; diff --git a/src/app/(__components)/compFooter.tsx b/src/app/(__components)/compFooter.tsx deleted file mode 100644 index 31f61e6..0000000 --- a/src/app/(__components)/compFooter.tsx +++ /dev/null @@ -1,32 +0,0 @@ -import Link from "next/link"; - -import siteConfig from "config/site.config"; - -function Footer() { - return ( -
- - {siteConfig.footer.renderYear && - new Date().getFullYear()}{" "} - {siteConfig.footer.text} -{" "} - - next-gdrive-index - {" "} - ❤️ - -
- ); -} - -export default Footer; diff --git a/src/app/(__components)/compGridLayout.tsx b/src/app/(__components)/compGridLayout.tsx deleted file mode 100644 index dad94ba..0000000 --- a/src/app/(__components)/compGridLayout.tsx +++ /dev/null @@ -1,201 +0,0 @@ -"use client"; - -import { drive_v3 } from "googleapis"; -import Link from "next/link"; -import { usePathname } from "next/navigation"; -import { MdFolder, MdPlayCircle } from "react-icons/md"; - -import formatDuration from "utils/fileHelper/formatDuration"; -import getFileIcon from "utils/fileHelper/iconMap"; -import getFileGroup from "utils/fileHelper/typeMap"; - -import { FilesResponse } from "types/api/files"; - -import siteConfig from "config/site.config"; - -type Props = { - data: FilesResponse; -}; - -function GridLayout({ data }: Props) { - const pathname = usePathname(); - return ( -
- {data.folders.length === 0 && - data.files.length === 0 && ( -
- - No files or folders found - -
- )} - {data.folders.length > 0 && ( -
- {data.folders.map((folder) => ( - - ))} -
- )} - {data.files.length > 0 && ( -
- {data.files.map((file) => ( - - ))} -
- )} -
- ); -} - -function GridFolder({ - folder, - path = "", -}: { - folder: drive_v3.Schema$File; - path?: string; -}) { - const folderURL = `${path}/${encodeURIComponent( - folder.name ?? "", - )}`; - return ( - -
- -
- - {folder.name} - -
-
- - ); -} - -function GridFile({ - file, - path = "", -}: { - file: drive_v3.Schema$File; - path?: string; -}) { - const Icon = getFileIcon( - file.fileExtension ?? "", - file.mimeType ?? "", - ); - const fileGroup = getFileGroup( - file.fileExtension ?? "", - file.mimeType ?? "", - ); - const isThumbnailAllowed = - siteConfig.files.allowThumbnailFileType.includes( - fileGroup, - ); - const fileURL = `${path}/${encodeURIComponent( - file.name ?? "", - )}`; - - return ( - -
- {file.thumbnailLink && isThumbnailAllowed ? ( - <> - {file.name - {file.videoMediaMetadata && ( -
- - {file.videoMediaMetadata.durationMillis && ( -
- {formatDuration( - file.videoMediaMetadata - .durationMillis, - )} -
- )} -
- )} - - ) : ( -
- -
- )} -
- {file.name -
- - {file.name} - -
-
-
- - ); -} - -export default GridLayout; diff --git a/src/app/(__components)/compListLayout.tsx b/src/app/(__components)/compListLayout.tsx deleted file mode 100644 index 2f50058..0000000 --- a/src/app/(__components)/compListLayout.tsx +++ /dev/null @@ -1,378 +0,0 @@ -"use client"; - -import { drive_v3 } from "googleapis"; -import Link from "next/link"; -import { usePathname } from "next/navigation"; -import { - MdContentCopy, - MdDownload, - MdFolder, - MdPlayCircle, -} from "react-icons/md"; - -import useCopyText from "hooks/useCopyText"; -import formatDate from "utils/fileHelper/formatDate"; -import formatSize from "utils/fileHelper/formatSize"; -import getFileGroup from "utils/fileHelper/typeMap"; - -import { FilesResponse } from "types/api/files"; -import { Constant } from "types/general/constant"; - -import apiConfig from "config/api.config"; -import siteConfig from "config/site.config"; - -type Props = { - data: FilesResponse; -}; - -function ListLayout({ data }: Props) { - const pathname = usePathname(); - return ( -
-
-
- - Name - - - Modified At - - - Size - - - Type - - - Actions - -
-
-
- {data.folders.length === 0 && - data.files.length === 0 && ( -
- - No files or folders found - -
- )} - {data.folders.length > 0 && ( - <> - {data.folders.map((folder) => ( - - ))} - - )} - {data.files.length > 0 && ( - <> - {data.files.map((file) => ( - - ))} - - )} -
-
-
- ); -} - -function ListFolder({ - folder, - path = "", -}: { - folder: drive_v3.Schema$File; - path?: string; -}) { - const folderURL = `${path}/${encodeURIComponent( - folder.name ?? "", - )}`; - return ( - -
- - -
- - {folder.name} - -
-
- - {formatDate(new Date(folder.modifiedTime ?? ""))} - - - {folder.size ? formatSize(folder.size) : "-"} - - - {Constant.type_folder} - - - - -
- - ); -} - -function ListFile({ - file, - path = "", -}: { - file: drive_v3.Schema$File; - path?: string; -}) { - const fileGroup = getFileGroup( - file.fileExtension ?? "", - file.mimeType ?? "", - ); - const isThumbnailAllowed = - siteConfig.files.allowThumbnailFileType.includes( - fileGroup, - ); - const fileURL = `${path}/${encodeURIComponent( - file.name ?? "", - )}`; - - return ( - -
- - {file.thumbnailLink && isThumbnailAllowed ? ( -
- {file.name - {file.videoMediaMetadata && ( -
- -
- )} -
- ) : ( - {file.name - )} -
- - {file.name} - -
-
- - {formatDate(new Date(file.modifiedTime ?? ""))} - - - {file.size ? formatSize(file.size) : "-"} - - - {Constant[`type_${fileGroup}`] ?? - Constant.type_default} - - - - -
- - ); -} - -function Action({ - path = "", - isDownloadable = false, -}: { - path?: string; - isDownloadable?: boolean; -}) { - const copyLink = useCopyText(); - let url: string = apiConfig.basePath; - if (path) { - if (isDownloadable) { - url += "/download"; - } - url += path; - } - return ( -
-
{ - e.preventDefault(); - e.stopPropagation(); - copyLink(url); - }} - > - -
- {isDownloadable && ( - { - e.stopPropagation(); - }} - className={ - "global-duration grid aspect-square h-8 w-8 cursor-pointer place-items-center rounded-full p-1 transition-colors hover:bg-zinc-300 active:bg-zinc-400 dark:hover:bg-zinc-700 dark:active:bg-zinc-600" - } - > - - - )} -
- ); -} - -export default ListLayout; diff --git a/src/app/(__components)/compNavbar.tsx b/src/app/(__components)/compNavbar.tsx deleted file mode 100644 index a463792..0000000 --- a/src/app/(__components)/compNavbar.tsx +++ /dev/null @@ -1,202 +0,0 @@ -"use client"; - -import Link from "next/link"; -import { useContext, useState } from "react"; -import { - MdClose, - MdDarkMode, - MdLightMode, - MdLogout, - MdMenu, - MdSearch, -} from "react-icons/md"; - -import { - TThemeContext, - ThemeContext, -} from "context/themeContext"; - -import { Constant } from "types/general/constant"; - -import siteConfig from "config/site.config"; - -function Navbar() { - const { theme, setTheme } = - useContext(ThemeContext); - const [isMenuOpen, setIsMenuOpen] = - useState(false); - - const clearPassword = () => { - document.cookie = `${Constant.cookiePassword}=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/;`; - }; - - return ( - <> - - -
- {siteConfig.navbar.links.map((link) => ( - - {link.icon && } - {link.name} - - ))} -
- - ); -} - -export default Navbar; diff --git a/src/app/(__components)/compPassword.tsx b/src/app/(__components)/compPassword.tsx deleted file mode 100644 index db027e7..0000000 --- a/src/app/(__components)/compPassword.tsx +++ /dev/null @@ -1,96 +0,0 @@ -"use client"; - -import { useRouter } from "next/navigation"; -import { useState } from "react"; - -import passwordHash from "utils/encryptionHelper/passwordHash"; - -import { Constant } from "types/general/constant"; - -function Password({ - path, - redirect = "/", -}: { - path: string; - redirect?: string; -}) { - const router = useRouter(); - const [password, setPassword] = useState(""); - - const handlePasswordSubmit = ( - e: React.FormEvent, - ) => { - e.preventDefault(); - const isPasswordExists = - document.cookie.split(Constant.cookiePassword) - .length > 1; - const expires = new Date(); - expires.setFullYear(expires.getFullYear() + 1); - - if (isPasswordExists) { - const passwordCookie = document.cookie - .split(Constant.cookiePassword)[1] - .split(";")[0] - .split("=")[1]; - const parsedPassword = JSON.parse(passwordCookie); - parsedPassword[path] = passwordHash.encode(password); - document.cookie = `${ - Constant.cookiePassword - }=${JSON.stringify( - parsedPassword, - )}; expires=${expires.toUTCString()}; path=/`; - } else { - const parsedPassword = { - [path]: passwordHash.encode(password), - }; - document.cookie = `${ - Constant.cookiePassword - }=${JSON.stringify( - parsedPassword, - )}; expires=${expires.toUTCString()}; path=/`; - } - - router.push(redirect); - }; - - return ( -
-

- Password protected -

-

- The file or folder you are trying to access is - password protected. Please enter the password to - continue. -

- -
- setPassword(e.target.value)} - /> - -
-
- ); -} - -export default Password; diff --git a/src/app/(__components)/compReadmeRender.tsx b/src/app/(__components)/compReadmeRender.tsx deleted file mode 100644 index 619c7e3..0000000 --- a/src/app/(__components)/compReadmeRender.tsx +++ /dev/null @@ -1,43 +0,0 @@ -"use client"; - -import ReactMarkdown from "react-markdown"; -import rehypeKatex from "rehype-katex"; -import rehypePrism from "rehype-prism-plus"; -import rehypeRaw from "rehype-raw"; -import remarkGfm from "remark-gfm"; -import remarkMath from "remark-math"; -import remarkSlug from "remark-slug"; -import remarkToc from "remark-toc"; - -import shortEncryption from "utils/encryptionHelper/shortEncryption"; - -import "styles/highlight.css"; -import "styles/markdown.css"; - -type Props = { - data: string; -}; - -function CompReadmeRender({ data }: Props) { - return ( -
- - {shortEncryption.decrypt(data)} - -
- ); -} - -export default CompReadmeRender; diff --git a/src/app/(__components)/compSwitchLayout.tsx b/src/app/(__components)/compSwitchLayout.tsx deleted file mode 100644 index a6c4dc7..0000000 --- a/src/app/(__components)/compSwitchLayout.tsx +++ /dev/null @@ -1,116 +0,0 @@ -"use client"; - -import { - useContext, - useEffect, - useRef, - useState, -} from "react"; -import { - MdArrowDropDown, - MdGridView, - MdList, -} from "react-icons/md"; - -import { - LayoutContext, - TLayoutContext, -} from "context/layoutContext"; - -function SwitchLayout() { - const { layout, setLayout } = - useContext(LayoutContext); - const [isRenderGrid, setIsRenderGrid] = - useState(); - const [isDropdownOpen, setIsDropdownOpen] = - useState(false); - - const dropdownRef = useRef(null); - - useEffect(() => { - setIsRenderGrid(layout === "grid"); - }, [layout]); - - useEffect(() => { - function handleClickOutside(event: MouseEvent) { - if ( - dropdownRef.current && - !dropdownRef.current.contains(event.target as Node) - ) { - setIsDropdownOpen(false); - } - } - - document.addEventListener( - "mousedown", - handleClickOutside, - ); - return () => { - document.removeEventListener( - "mousedown", - handleClickOutside, - ); - }; - }, [dropdownRef]); - - return ( -
-
setIsDropdownOpen(!isDropdownOpen)} - > -
- {isRenderGrid && ( - - )} - {!isRenderGrid && ( - - )} - {isRenderGrid ? "Grid" : "List"} -
- -
-
-
{ - setLayout("grid"); - setIsRenderGrid(true); - setIsDropdownOpen(false); - }} - > - - Grid -
-
{ - setLayout("list"); - setIsRenderGrid(false); - setIsDropdownOpen(false); - }} - > - - List -
-
-
- ); -} - -export default SwitchLayout; diff --git a/src/app/(api)/api/banner/[encryptedFileId]/route.ts b/src/app/(api)/api/banner/[encryptedFileId]/route.ts deleted file mode 100644 index 7652871..0000000 --- a/src/app/(api)/api/banner/[encryptedFileId]/route.ts +++ /dev/null @@ -1,82 +0,0 @@ -import { NextRequest, NextResponse } from "next/server"; - -import createErrorPayload from "utils/apiHelper/createErrorPayload"; -import gdrive from "utils/apiHelper/gdrive"; -import shortEncryption from "utils/encryptionHelper/shortEncryption"; -import ExtendedError from "utils/generalHelper/extendedError"; - -import { Constant } from "types/general/constant"; - -import apiConfig from "config/api.config"; - -export async function GET( - request: NextRequest, - { params }: { params: { encryptedFileId: string } }, -) { - const _start = Date.now(); - const { encryptedFileId } = params; - - try { - const getMetadata = gdrive.files.get({ - fileId: shortEncryption.decrypt(encryptedFileId), - fields: "id, name, mimeType, webContentLink", - }); - const getStream = gdrive.files.get( - { - fileId: shortEncryption.decrypt(encryptedFileId), - alt: "media", - }, - { responseType: "arraybuffer" }, - ); - - const [metadata, stream] = await Promise.all([ - getMetadata, - getStream, - ]); - - if (!metadata || metadata.data.trashed) { - throw new ExtendedError( - Constant.apiFileNotFound, - 404, - "notFound", - Constant.reasonNotFound, - ); - } - - if ( - Number(metadata.data.size) > - apiConfig.files.download.maxFileSize && - apiConfig.files.download.maxFileSize > 0 - ) { - return NextResponse.redirect( - metadata.data.webContentLink as string, - { - status: 302, - }, - ); - } - - const imgBuffer = (await stream.data) as ArrayBuffer; - - return new NextResponse(imgBuffer, { - status: 200, - headers: { - "Content-Type": - metadata.data.mimeType || - "application/octet-stream", - "Cache-Control": apiConfig.cacheControl, - "Content-Disposition": `inline; filename="${metadata.data.name}"`, - }, - }); - } catch (error: any) { - const payload = createErrorPayload( - error, - "GET /api/banner/:id", - _start, - ); - - return NextResponse.json(payload, { - status: payload.code, - }); - } -} diff --git a/src/app/(api)/api/files/[encryptedId]/route.ts b/src/app/(api)/api/files/[encryptedId]/route.ts deleted file mode 100644 index ab6e9af..0000000 --- a/src/app/(api)/api/files/[encryptedId]/route.ts +++ /dev/null @@ -1,223 +0,0 @@ -import { drive_v3 } from "googleapis"; -import { NextRequest, NextResponse } from "next/server"; - -import createErrorPayload from "utils/apiHelper/createErrorPayload"; -import gdrive from "utils/apiHelper/gdrive"; -import getSearchParams from "utils/apiHelper/getSearchParams"; -import shortEncryption from "utils/encryptionHelper/shortEncryption"; -import ExtendedError from "utils/generalHelper/extendedError"; - -import { API_Response } from "types/api"; -import { - FileResponse, - FilesResponse, -} from "types/api/files"; -import { Constant } from "types/general/constant"; - -import apiConfig from "config/api.config"; - -export async function GET( - request: NextRequest, - { params }: { params: { encryptedId: string } }, -) { - const _start = Date.now(); - - try { - const { pageToken, banner, thumbnail } = - getSearchParams(request.url, [ - "pageToken", - "banner", - "thumbnail", - ]); - const id = shortEncryption.decrypt(params.encryptedId); - if (id === apiConfig.files.rootFolder) { - return NextResponse.redirect( - `${apiConfig.basePath}/api/files`, - { - status: 301, - }, - ); - } - - const file = await gdrive.files.get({ - fileId: id, - fields: apiConfig.files.field, - }); - - if (!file || file.data.trashed) { - throw new ExtendedError( - Constant.apiFileNotFound, - 404, - "notFound", - Constant.reasonNotFound, - ); - } - - /** - * If fetched file isn't a folder, return File - */ - if ( - file.data.mimeType !== - "application/vnd.google-apps.folder" - ) { - if (thumbnail === "1") { - return NextResponse.redirect( - `${ - apiConfig.basePath - }/api/thumbnail/${shortEncryption.encrypt( - id as string, - )}`, - { - status: 302, - }, - ); - } - - const payload: API_Response = { - success: true, - timestamp: new Date().toISOString(), - responseTime: Date.now() - _start, - data: { - ...file.data, - id: shortEncryption.encrypt( - file.data.id as string, - ), - webContentLink: - shortEncryption.encrypt( - file.data.webContentLink as string, - ) || undefined, - }, - }; - - return NextResponse.json(payload, { - status: 200, - headers: { - "Cache-Control": apiConfig.cacheControl, - }, - }); - } - - const query = [ - ...apiConfig.files.query, - `'${id}' in parents`, - ]; - const fetchFolderContents = await gdrive.files.list({ - q: `${query.join(" and ")}`, - fields: `files(${apiConfig.files.field}), nextPageToken`, - orderBy: apiConfig.files.orderBy, - pageSize: apiConfig.files.itemsPerPage, - pageToken: pageToken || undefined, - }); - - const readmeFile = fetchFolderContents.data.files?.find( - (file) => - file.name === apiConfig.files.specialFile.readme, - ); - let readmeContent: string | undefined; - const bannerFile = fetchFolderContents.data.files?.find( - (file) => - file.name?.startsWith( - apiConfig.files.specialFile.banner, - ) && file.mimeType?.startsWith("image/"), - ); - - if (readmeFile) { - const readme = await gdrive.files.get( - { - fileId: readmeFile.id as string, - alt: "media", - }, - { responseType: "text" }, - ); - readmeContent = readme.data as string; - } - if (banner === "1") { - if (!bannerFile) { - throw new ExtendedError( - Constant.apiFileNotFound, - 404, - "notFound", - "The banner file is not found.", - ); - } - - return NextResponse.redirect( - `${ - apiConfig.basePath - }/api/banner/${shortEncryption.encrypt( - bannerFile.id as string, - )}`, - { - status: 302, - }, - ); - } - - const folderList = - (fetchFolderContents.data.files - ?.filter( - (file) => - file.mimeType === - "application/vnd.google-apps.folder", - ) - .map((file) => ({ - ...file, - id: shortEncryption.encrypt(file.id as string), - })) as drive_v3.Schema$File[]) || []; - const fileList = - (fetchFolderContents.data.files - ?.filter( - (file) => - !file.mimeType?.startsWith( - "application/vnd.google-apps", - ) && - !apiConfig.files.hiddenFiles.some( - (hiddenFile) => - file.name?.startsWith(hiddenFile), - ), - ) - .map((file) => ({ - ...file, - id: shortEncryption.encrypt(file.id as string), - webContentLink: - shortEncryption.encrypt( - file.webContentLink as string, - ) || undefined, - })) as drive_v3.Schema$File[]) || []; - - const payload: API_Response = { - success: true, - timestamp: new Date().toISOString(), - responseTime: Date.now() - _start, - data: { - folders: folderList, - files: fileList, - isReadmeExists: !!readmeFile, - readmeContent: readmeContent - ? shortEncryption.encrypt(readmeContent) - : undefined, - isBannerExists: !!bannerFile, - nextPageToken: - fetchFolderContents.data.nextPageToken || - undefined, - }, - }; - - return NextResponse.json(payload, { - status: 200, - headers: { - "Cache-Control": apiConfig.cacheControl, - }, - }); - } catch (error: any) { - const payload = createErrorPayload( - error, - "GET /api/files/:id", - _start, - ); - - return NextResponse.json(payload, { - status: payload.code || 500, - }); - } -} diff --git a/src/app/(api)/api/files/route.ts b/src/app/(api)/api/files/route.ts deleted file mode 100644 index cc445bd..0000000 --- a/src/app/(api)/api/files/route.ts +++ /dev/null @@ -1,148 +0,0 @@ -import { drive_v3 } from "googleapis"; -import { NextRequest, NextResponse } from "next/server"; - -import createErrorPayload from "utils/apiHelper/createErrorPayload"; -import gdrive from "utils/apiHelper/gdrive"; -import getSearchParams from "utils/apiHelper/getSearchParams"; -import shortEncryption from "utils/encryptionHelper/shortEncryption"; -import ExtendedError from "utils/generalHelper/extendedError"; - -import { API_Response } from "types/api"; -import { FilesResponse } from "types/api/files"; -import { Constant } from "types/general/constant"; - -import apiConfig from "config/api.config"; - -export async function GET(request: NextRequest) { - const _start = Date.now(); - - try { - const { pageToken, banner } = getSearchParams( - request.url, - ["pageToken", "banner"], - ); - - const query: string[] = [ - ...apiConfig.files.query, - `'${apiConfig.files.rootFolder}' in parents`, - ]; - const fetchFolderContents = await gdrive.files.list({ - q: `${query.join(" and ")}`, - fields: `files(${apiConfig.files.field}), nextPageToken`, - orderBy: apiConfig.files.orderBy, - pageSize: apiConfig.files.itemsPerPage, - pageToken: pageToken || undefined, - }); - - const readmeFile = fetchFolderContents.data.files?.find( - (file) => - file.name === apiConfig.files.specialFile.readme, - ); - let readmeContent: string | undefined; - const bannerFile = fetchFolderContents.data.files?.find( - (file) => - file.name?.startsWith( - apiConfig.files.specialFile.banner, - ) && file.mimeType?.startsWith("image/"), - ); - - if (readmeFile) { - const readme = await gdrive.files.get( - { - fileId: readmeFile.id as string, - alt: "media", - }, - { responseType: "text" }, - ); - readmeContent = readme.data as string; - } - if (banner === "1") { - if (!bannerFile) { - throw new ExtendedError( - Constant.apiFileNotFound, - 404, - "notFound", - "The banner file is not found.", - ); - } - - return NextResponse.redirect( - `${ - apiConfig.basePath - }/api/banner/${shortEncryption.encrypt( - bannerFile.id as string, - )}`, - { - status: 302, - }, - ); - } - - const folderList = - (fetchFolderContents.data.files - ?.filter( - (file) => - file.mimeType === - "application/vnd.google-apps.folder", - ) - .map((file) => ({ - ...file, - id: shortEncryption.encrypt(file.id as string), - })) as drive_v3.Schema$File[]) || []; - const fileList = - (fetchFolderContents.data.files - ?.filter( - (file) => - !file.mimeType?.startsWith( - "application/vnd.google-apps", - ) && - !apiConfig.files.hiddenFiles.some( - (hiddenFile) => - file.name?.startsWith(hiddenFile), - ), - ) - .map((file) => ({ - ...file, - id: shortEncryption.encrypt(file.id as string), - webContentLink: - shortEncryption.encrypt( - file.webContentLink as string, - ) || undefined, - })) as drive_v3.Schema$File[]) || []; - - const payload: API_Response = { - success: true, - timestamp: new Date().toISOString(), - responseTime: Date.now() - _start, - data: { - folders: folderList, - files: fileList, - isReadmeExists: !!readmeFile, - readmeContent: readmeContent - ? shortEncryption.encrypt(readmeContent) - : undefined, - isBannerExists: !!bannerFile, - nextPageToken: - fetchFolderContents.data.nextPageToken || - undefined, - }, - }; - - return NextResponse.json(payload, { - status: 200, - headers: { - "Cache-Control": apiConfig.cacheControl, - }, - }); - } catch (error: any) { - const payload = createErrorPayload( - error, - "GET /api/files", - _start, - ); - - return NextResponse.json(payload, { - status: payload.code || 500, - }); - } -} diff --git a/src/app/(api)/api/help/encrypt/route.ts b/src/app/(api)/api/help/encrypt/route.ts deleted file mode 100644 index dd26b60..0000000 --- a/src/app/(api)/api/help/encrypt/route.ts +++ /dev/null @@ -1,76 +0,0 @@ -import { NextRequest, NextResponse } from "next/server"; - -import createErrorPayload from "utils/apiHelper/createErrorPayload"; -import getSearchParams from "utils/apiHelper/getSearchParams"; -import shortEncryption from "utils/encryptionHelper/shortEncryption"; -import ExtendedError from "utils/generalHelper/extendedError"; - -import { Constant } from "types/general/constant"; - -export function GET(request: NextRequest) { - const _start = Date.now(); - - try { - const { text } = getSearchParams(request.url, ["text"]); - - if (!text) { - throw new ExtendedError( - Constant.apiBadRequest, - 400, - "bad_request", - "Missing required parameter: text", - ); - } - - const decryptedText = shortEncryption.decrypt(text); - - return NextResponse.json( - { text: decryptedText }, - { status: 200 }, - ); - } catch (error: any) { - const payload = createErrorPayload( - error, - "GET /api/help/encrypt", - _start, - ); - - return NextResponse.json(payload, { - status: payload.code, - }); - } -} - -export function POST(request: NextRequest) { - const _start = Date.now(); - - try { - const { text } = getSearchParams(request.url, ["text"]); - - if (!text) { - throw new ExtendedError( - Constant.apiBadRequest, - 400, - "bad_request", - "Missing required parameter: text", - ); - } - - const encryptedText = shortEncryption.encrypt(text); - - return NextResponse.json( - { text: encryptedText }, - { status: 200 }, - ); - } catch (error: any) { - const payload = createErrorPayload( - error, - "GET /api/help/encrypt", - _start, - ); - - return NextResponse.json(payload, { - status: payload.code, - }); - } -} diff --git a/src/app/(api)/api/thumbnail/[encryptedFileId]/route.ts b/src/app/(api)/api/thumbnail/[encryptedFileId]/route.ts deleted file mode 100644 index fbcd578..0000000 --- a/src/app/(api)/api/thumbnail/[encryptedFileId]/route.ts +++ /dev/null @@ -1,103 +0,0 @@ -import { NextRequest, NextResponse } from "next/server"; - -import createErrorPayload from "utils/apiHelper/createErrorPayload"; -import gdrive from "utils/apiHelper/gdrive"; -import shortEncryption from "utils/encryptionHelper/shortEncryption"; -import ExtendedError from "utils/generalHelper/extendedError"; - -import { Constant } from "types/general/constant"; - -import apiConfig from "config/api.config"; - -export async function GET( - request: NextRequest, - { params }: { params: { encryptedFileId: string } }, -) { - const _start = Date.now(); - const { encryptedFileId } = params; - - try { - const getMetadata = gdrive.files.get({ - fileId: shortEncryption.decrypt(encryptedFileId), - fields: - "id, name, mimeType, webContentLink, thumbnailLink, size", - }); - const getStream = gdrive.files.get( - { - fileId: shortEncryption.decrypt(encryptedFileId), - alt: "media", - }, - { responseType: "arraybuffer" }, - ); - - const [metadata, stream] = await Promise.all([ - getMetadata, - getStream, - ]); - - if (!metadata || metadata.data.trashed) { - throw new ExtendedError( - Constant.apiFileNotFound, - 404, - "notFound", - Constant.reasonNotFound, - ); - } - - if (!metadata.data.thumbnailLink) { - const imgStream = await fetch( - `${apiConfig.basePath}/og.png`, - ).then((res) => res.arrayBuffer()); - - return new NextResponse(imgStream, { - status: 200, - headers: { - "Content-Type": - metadata.data.mimeType || - "application/octet-stream", - "Cache-Control": apiConfig.cacheControl, - "Content-Disposition": `inline; filename="${metadata.data.name}"`, - }, - }); - } - - const isWithinMaxFileSize = - Number(metadata.data.size) < - apiConfig.files.download.maxFileSize && - apiConfig.files.download.maxFileSize > 0; - - if ( - metadata.data.mimeType?.startsWith("image") && - isWithinMaxFileSize - ) { - const imgBuffer = (await stream.data) as ArrayBuffer; - - return new NextResponse(imgBuffer, { - status: 200, - headers: { - "Cache-Control": apiConfig.cacheControl, - }, - }); - } - - return NextResponse.redirect( - metadata.data.thumbnailLink as string, - { - status: 302, - headers: { - "Cache-Control": apiConfig.cacheControl, - }, - }, - ); - } catch (error: any) { - const payload = createErrorPayload( - error, - "GET /api/thumbnail/:id", - _start, - ); - - return NextResponse.json(payload, { - status: payload.code, - }); - } -} diff --git a/src/app/(api)/api/thumbnail/route.ts b/src/app/(api)/api/thumbnail/route.ts deleted file mode 100644 index e69de29..0000000 diff --git a/src/app/(api)/api/validate/[...path]/route.ts b/src/app/(api)/api/validate/[...path]/route.ts deleted file mode 100644 index 62a7a94..0000000 --- a/src/app/(api)/api/validate/[...path]/route.ts +++ /dev/null @@ -1,277 +0,0 @@ -import { cookies } from "next/headers"; -import { NextRequest, NextResponse } from "next/server"; - -import createErrorPayload from "utils/apiHelper/createErrorPayload"; -import gdrive from "utils/apiHelper/gdrive"; -import passwordHash from "utils/encryptionHelper/passwordHash"; -import shortEncryption from "utils/encryptionHelper/shortEncryption"; -import ExtendedError from "utils/generalHelper/extendedError"; - -import { API_Response } from "types/api"; -import { - FilePath, - ValidateFilePathResponse, -} from "types/api/path"; -import { RequestContext } from "types/general"; -import { Constant } from "types/general/constant"; - -import apiConfig from "config/api.config"; -import siteConfig from "config/site.config"; - -export async function GET( - request: NextRequest, - { params }: RequestContext<"path", string[]>, -) { - const _start = Date.now(); - const pathArray = params.path; - - try { - const fetchRootId = - apiConfig.files.rootFolder !== "root" - ? apiConfig.files.rootFolder - : gdrive.files.get({ - fileId: "root", - fields: "id", - }); - const fetchPathId = pathArray.map(async (path) => { - const query = [ - "trashed = false", - "'me' in owners", - `name = '${path}'`, - ]; - const fetchFolderContents = await gdrive.files.list({ - q: `${query.join(" and ")}`, - fields: "files(id, name, mimeType, parents)", - }); - - if (!fetchFolderContents.data.files?.length) { - throw new ExtendedError( - Constant.apiFileNotFound, - 404, - "notFound", - `Path "${path}" is not found`, - ); - } - - return { - path, - data: fetchFolderContents.data.files.map( - (file) => ({ - id: file.id, - parents: file.parents?.[0], - mimeType: file.mimeType, - }), - ), - }; - }); - - const [rootId, pathId] = await Promise.all([ - fetchRootId, - Promise.all(fetchPathId), - ]); - - const selectedPath: string[] = []; - const mappedPath: FilePath[] = []; - - // Check path validity - pathId.forEach((path, index) => { - let checkPath; - if (index === 0) { - checkPath = path.data.find( - (file) => file.parents === rootId, - ); - } else { - checkPath = path.data.find( - (file) => - file.parents === selectedPath[index - 1], - ); - } - if (!checkPath) { - throw new ExtendedError( - Constant.apiFileNotFound, - 404, - "notFound", - `Path "${path.path}" is not found`, - ); - } - selectedPath.push(checkPath.id as string); - mappedPath.push({ - name: path.path, - encryptedId: shortEncryption.encrypt( - checkPath.id as string, - ), - mimeType: checkPath.mimeType as string, - }); - }); - - // Check for protected folder - const fetchProtectedFolder = mappedPath.map( - async (path) => { - if ( - path.mimeType !== - "application/vnd.google-apps.folder" - ) - return; - - const query = [ - "trashed = false", - "'me' in owners", - `'${shortEncryption.decrypt( - path.encryptedId, - )}' in parents`, - `name = '${apiConfig.files.specialFile.password}'`, - ]; - - const fetchFolderContents = await gdrive.files.list( - { - q: `${query.join(" and ")}`, - fields: "files(id, name, mimeType, parents)", - }, - ); - - if (!fetchFolderContents.data.files?.length) return; - - return { - path: path.name, - passwordId: fetchFolderContents.data.files[0].id, - }; - }, - ); - - let protectedFolder = await Promise.all( - fetchProtectedFolder, - ); - protectedFolder = protectedFolder.filter( - (folder) => folder !== undefined, - ); - const nearestProtectedFolder = - protectedFolder[protectedFolder.length - 1] ?? null; - const masterKey = request.headers.get( - Constant.cookieMaster, - ); - const validMasterKey = passwordHash.verify( - masterKey || "", - apiConfig.masterKey, - ); - - if ( - nearestProtectedFolder && - nearestProtectedFolder.passwordId && - !validMasterKey - ) { - const fetchPassword = await gdrive.files.get( - { - fileId: nearestProtectedFolder.passwordId, - alt: "media", - }, - { responseType: "text" }, - ); - - const userPassword = cookies().get( - Constant.cookiePassword, - )?.value; - if (!userPassword) { - throw new ExtendedError( - Constant.apiNotAuthorized, - 401, - "unauthorized", - `You need to provide password to access "${nearestProtectedFolder.path}"`, - ); - } - - const parsedUserPassword = JSON.parse(userPassword); - const nearestFolderPassword = - parsedUserPassword[ - decodeURIComponent(nearestProtectedFolder.path) - ]; - if (!nearestFolderPassword) { - throw new ExtendedError( - Constant.apiNotAuthorized, - 401, - "unauthorized", - `You need to provide password to access "${nearestProtectedFolder.path}"`, - ); - } - - if ( - !passwordHash.verify( - fetchPassword.data as string, - nearestFolderPassword, - ) - ) { - throw new ExtendedError( - Constant.apiNotAuthorized, - 401, - "unauthorized", - `The password you provided is incorrect`, - ); - } - } - - if ( - siteConfig.privateIndex && - !nearestProtectedFolder && - !validMasterKey - ) { - const userPassword = cookies().get( - Constant.cookiePassword, - )?.value; - if (!userPassword) { - throw new ExtendedError( - Constant.apiNotAuthorized, - 401, - "unauthorized", - `You need to provide password to access "root"`, - ); - } - - const parsedUserPassword = JSON.parse(userPassword); - const nearestFolderPassword = - parsedUserPassword["root"]; - if (!nearestFolderPassword) { - throw new ExtendedError( - Constant.apiNotAuthorized, - 401, - "unauthorized", - `You need to provide password to access "root"`, - ); - } - - if ( - !passwordHash.compare( - siteConfig.indexPassword, - nearestFolderPassword, - ) - ) { - throw new ExtendedError( - Constant.apiNotAuthorized, - 401, - "unauthorized", - `The password you provided is incorrect`, - ); - } - } - - const payload: API_Response = - { - success: true, - timestamp: new Date().toISOString(), - responseTime: Date.now() - _start, - data: mappedPath, - }; - - return NextResponse.json(payload, { - status: 200, - }); - } catch (error: any) { - const payload = createErrorPayload( - error, - `GET /api/verify/${pathArray.join("/")}`, - _start, - ); - - return NextResponse.json(payload, { - status: payload.code || 500, - }); - } -} diff --git a/src/app/(api)/api/validate/route.ts b/src/app/(api)/api/validate/route.ts deleted file mode 100644 index 5a40ff8..0000000 --- a/src/app/(api)/api/validate/route.ts +++ /dev/null @@ -1,89 +0,0 @@ -import { cookies } from "next/headers"; -import { NextRequest, NextResponse } from "next/server"; - -import createErrorPayload from "utils/apiHelper/createErrorPayload"; -import passwordHash from "utils/encryptionHelper/passwordHash"; -import ExtendedError from "utils/generalHelper/extendedError"; - -import { API_Response } from "types/api"; -import { ValidateFilePathResponse } from "types/api/path"; -import { Constant } from "types/general/constant"; - -import apiConfig from "config/api.config"; -import siteConfig from "config/site.config"; - -export async function GET(request: NextRequest) { - const _start = Date.now(); - - try { - const masterKey = request.headers.get( - Constant.cookieMaster, - ); - const validMasterKey = passwordHash.verify( - masterKey || "", - apiConfig.masterKey, - ); - - if (siteConfig.privateIndex && !validMasterKey) { - const userPassword = cookies().get( - Constant.cookiePassword, - )?.value; - if (!userPassword) { - throw new ExtendedError( - Constant.apiNotAuthorized, - 401, - "unauthorized", - `You need to provide password to access "root"`, - ); - } - - const parsedUserPassword = JSON.parse(userPassword); - const nearestFolderPassword = - parsedUserPassword["root"]; - if (!nearestFolderPassword) { - throw new ExtendedError( - Constant.apiNotAuthorized, - 401, - "unauthorized", - `You need to provide password to access "root"`, - ); - } - - if ( - !passwordHash.compare( - siteConfig.indexPassword, - nearestFolderPassword, - ) - ) { - throw new ExtendedError( - Constant.apiNotAuthorized, - 401, - "unauthorized", - `The password you provided is incorrect`, - ); - } - } - - const payload: API_Response = - { - success: true, - timestamp: new Date().toISOString(), - responseTime: Date.now() - _start, - data: [], - }; - - return NextResponse.json(payload, { - status: 200, - }); - } catch (error: any) { - const payload = createErrorPayload( - error, - "GET /api/validate", - _start, - ); - - return new Response(JSON.stringify(payload), { - status: payload.code, - }); - } -} diff --git a/src/app/(setup)/next-gdrive-index/page.tsx b/src/app/(setup)/next-gdrive-index/page.tsx deleted file mode 100644 index 1ad0374..0000000 --- a/src/app/(setup)/next-gdrive-index/page.tsx +++ /dev/null @@ -1,3 +0,0 @@ -function SetupPage() {} - -export default SetupPage; diff --git a/src/app/(setup)/next-gdrive-index/step-1/page.tsx b/src/app/(setup)/next-gdrive-index/step-1/page.tsx deleted file mode 100644 index 5c257bb..0000000 --- a/src/app/(setup)/next-gdrive-index/step-1/page.tsx +++ /dev/null @@ -1,5 +0,0 @@ -function SetupFirstStep() { - return
; -} - -export default SetupFirstStep; diff --git a/src/app/[...path]/loading.tsx b/src/app/[...path]/loading.tsx deleted file mode 100644 index b7b9f90..0000000 --- a/src/app/[...path]/loading.tsx +++ /dev/null @@ -1,33 +0,0 @@ -function RootLoading() { - return ( -
-
-
-
-
-
-
- ); -} - -export default RootLoading; diff --git a/src/app/[...path]/page.tsx b/src/app/[...path]/page.tsx deleted file mode 100644 index 4e0cfdc..0000000 --- a/src/app/[...path]/page.tsx +++ /dev/null @@ -1,204 +0,0 @@ -import { Metadata, ResolvingMetadata } from "next"; -import { cookies } from "next/headers"; - -import Breadcrumb from "components/compBreadcrumb"; -import FileLayout from "components/compFileLayout"; -import CompReadmeRender from "components/compReadmeRender"; -import SwitchLayout from "components/compSwitchLayout"; - -import { handleError } from "utils/generalHelper/axiosFetch"; - -import { API_Error, API_Response } from "types/api"; -import { FilesResponse } from "types/api/files"; -import { ValidateFilePathResponse } from "types/api/path"; -import { Constant } from "types/general/constant"; - -import apiConfig from "config/api.config"; -import siteConfig from "config/site.config"; - -type Props = { - params: { path: string[] }; - searchParams: { - [key: string]: string | string[] | undefined; - }; -}; - -export async function generateMetadata( - { params, searchParams }: Props, - parent?: ResolvingMetadata, -): Promise { - const pathValidation = await fetch( - `${apiConfig.basePath}/api/validate/${params.path.join( - "/", - )}`, - { - headers: { - [Constant.cookieMaster]: process.env - .MASTER_KEY as string, - }, - }, - ).then( - (res) => - res.json() as Promise< - API_Response - >, - ); - - let pageName = siteConfig.siteName; - - if (pathValidation.success) { - pageName = pathValidation.data?.[ - pathValidation.data?.length - 1 - ].name as string; - } - if ( - !pathValidation.success && - (pathValidation as API_Error).code === 401 - ) { - pageName = "Protected Folder"; - } - - // optionally access and extend (rather than replace) parent metadata - const prevMeta = (await parent) as Metadata; - - return { - ...prevMeta, - title: `${pageName} | ${siteConfig.siteName}`, - openGraph: { - title: `${pageName} | ${siteConfig.siteName}`, - description: siteConfig.siteDescription, - url: `/${params.path.join("/")}`, - siteName: siteConfig.siteName, - images: [ - { - alt: `${pageName} | ${siteConfig.siteName}`, - type: "image/png", - width: 1200, - height: 630, - url: `/opengraph/${params.path.join("/")}`, - }, - ], - }, - twitter: { - title: `${pageName} | ${siteConfig.siteName}`, - description: siteConfig.siteDescription, - card: "summary_large_image", - site: siteConfig.siteName, - images: [ - { - alt: `${pageName} | ${siteConfig.siteName}`, - type: "image/png", - width: 1200, - height: 630, - url: `/opengraph/${params.path.join("/")}`, - }, - ], - }, - }; -} - -async function FilePage({ params }: Props) { - const passwordCookies = - cookies().get(Constant.cookiePassword)?.value || ""; - - const pathValidation = await fetch( - `${apiConfig.basePath}/api/validate/${params.path.join( - "/", - )}`, - { - credentials: "include", - headers: { - Cookie: `${Constant.cookiePassword}=${passwordCookies}`, - }, - }, - ).then( - (res) => - res.json() as Promise< - API_Response - >, - ); - - if (!pathValidation.success) { - const errorData = pathValidation as API_Error; - const payload = handleError(errorData); - throw new Error(payload); - } - - let isFolder = false; - if ( - pathValidation.data?.[pathValidation.data?.length - 1] - .mimeType === "application/vnd.google-apps.folder" - ) { - isFolder = true; - } - const lastId = pathValidation.data?.[ - pathValidation.data?.length - 1 - ].encryptedId as string; - - const filesData = await fetch( - `${apiConfig.basePath}/api/files/${lastId}`, - { - credentials: "include", - headers: { - Cookie: `${Constant.cookiePassword}=${passwordCookies}`, - }, - }, - ).then( - (res) => - res.json() as Promise>, - ); - if (!filesData.success) { - const errorData = filesData as API_Error; - const payload = handleError(errorData); - throw new Error(payload); - } - - return ( -
-
- - -
- -
- {isFolder ? ( - - ) : ( - File preview - )} -
- - {filesData.data?.isReadmeExists && - filesData.data?.readmeContent && ( -
- -
- )} -
- ); -} - -export default FilePage; diff --git a/src/app/api/download/[encryptedId]/[fileName]/route.ts b/src/app/api/download/[encryptedId]/[fileName]/route.ts new file mode 100644 index 0000000..1837237 --- /dev/null +++ b/src/app/api/download/[encryptedId]/[fileName]/route.ts @@ -0,0 +1,94 @@ +import gIndexConfig from "config"; +import { NextRequest, NextResponse } from "next/server"; + +import getSearchParams from "utils/apiHelper/getSearchParams"; +import { decryptData } from "utils/encryptionHelper/hash"; +import ExtendedError from "utils/extendedError"; +import gdrive from "utils/gdriveInstance"; +import { isDownloadTokenValid } from "utils/tokenHelper"; + +import { ErrorResponse } from "types/api/response"; + +export async function GET( + request: NextRequest, + { + params, + }: { + params: { + encryptedId: string; + fileName: string; + }; + }, +) { + const reqStart = Date.now(); + const { encryptedId, fileName } = params; + try { + const data = JSON.parse(decryptData(encryptedId)) as { + id: string; + isProtected: boolean; + }; + const { token, preview, disableLimit } = getSearchParams(request.url, ["token", "preview", "disableLimit"]); + + if (!gIndexConfig.apiConfig.allowDownloadProtectedFile && data.isProtected && !token) + throw new ExtendedError("Missing download token", 403, "You are not authorized to download this file"); + if (!gIndexConfig.apiConfig.allowDownloadProtectedFile && data.isProtected && token && !isDownloadTokenValid(token)) + throw new ExtendedError("Invalid download token", 403, "You are not authorized to download this file"); + + const _fileMeta = gdrive.files.get({ + fileId: decryptData(data.id), + fields: "id, name, size, mimeType, webContentLink", + }); + const _fileContent = gdrive.files.get( + { + fileId: decryptData(data.id), + alt: "media", + }, + { responseType: "stream" }, + ); + + const [fileMeta, fileContent] = await Promise.all([_fileMeta, _fileContent]); + const fileSize = Number(fileMeta.data.size) ?? 0; + if (fileSize > gIndexConfig.apiConfig.maxFileSize && !disableLimit) { + return NextResponse.redirect(fileMeta.data.webContentLink!, { + status: 302, + headers: { + "Cache-Control": gIndexConfig.cacheControl, + }, + }); + } + const fileBuffer = await new Promise((resolve, reject) => { + const chunks: Buffer[] = []; + fileContent.data.on("data", (chunk) => { + chunks.push(chunk); + }); + fileContent.data.on("end", () => { + resolve(Buffer.concat(chunks)); + }); + fileContent.data.on("error", (err) => { + reject(err); + }); + }); + + return new NextResponse(fileBuffer, { + status: 200, + headers: { + "Content-Type": fileMeta.data.mimeType ?? "application/octet-stream", + "Content-Disposition": `${preview ? "inline;" : "attachment;"} filename="${encodeURIComponent(fileName)}"`, + "Cache-Control": gIndexConfig.cacheControl, + }, + }); + } catch (error: any) { + const res: ErrorResponse = { + timestamp: Date.now(), + responseTime: Date.now() - reqStart, + error: { + code: error.code || 500, + message: error.message, + reason: error.errors?.[0].reason, + }, + }; + return NextResponse.json(res, { + status: error.code || 500, + }); + } +} diff --git a/src/app/api/experimental/validatePath/[...path]/route.ts b/src/app/api/experimental/validatePath/[...path]/route.ts new file mode 100644 index 0000000..99b7139 --- /dev/null +++ b/src/app/api/experimental/validatePath/[...path]/route.ts @@ -0,0 +1,213 @@ +import gIndexConfig from "config"; +import { NextRequest, NextResponse } from "next/server"; + +import { + decryptData, + encryptData, +} from "utils/encryptionHelper/hash"; +import ExtendedError from "utils/extendedError"; +import gdrive from "utils/gdriveInstance"; +import { checkPathPassword } from "utils/passwordHelper"; + +import { + APIValidateResponse, + ErrorResponse, +} from "types/api/response"; +import { Constant } from "types/constant"; + +type FilePath = { + name: string; + encryptedId: string; + mimeType: string; +}; + +export async function GET( + request: NextRequest, + { params }: { params: { path: string[] } }, +) { + const reqStart = Date.now(); + const pathArray = params.path; + + try { + const fetchRootId = gdrive.files.get({ + fileId: gIndexConfig.apiConfig.rootFolder, + fields: "id", + }); + const fetchPathId = pathArray.map(async (path) => { + const query = ["trashed = false", `name = '${path}'`]; + const fetchFolderContents = await gdrive.files.list({ + q: `${query.join(" and ")}`, + fields: "files(id, name, mimeType, parents)", + }); + + if (!fetchFolderContents.data.files?.length) { + throw new Error(`Path "${path}" is not found`); + } + + return { + path, + data: fetchFolderContents.data.files.map( + (file) => ({ + id: file.id, + parents: file.parents?.[0], + mimeType: file.mimeType, + }), + ), + }; + }); + + const [rootId, pathId] = await Promise.all([ + fetchRootId, + Promise.all(fetchPathId), + ]); + + const selectedPath: string[] = []; + const mappedPath: FilePath[] = []; + + // Check path validity + pathId.forEach((path, index) => { + let checkPath = + index === 0 + ? path.data.find( + (file) => file.parents === rootId.data.id, + ) + : path.data.find( + (file) => + file.parents === selectedPath[index - 1], + ); + if (!checkPath) + throw new ExtendedError( + "Path not found", + 404, + `Can't find path "${path.path}". Please check your path again.`, + ); + selectedPath.push(checkPath.id as string); + mappedPath.push({ + name: path.path, + encryptedId: encryptData(checkPath.id as string), + mimeType: checkPath.mimeType as string, + }); + }); + + return NextResponse.json(mappedPath, { + status: 200, + }); + + // Check for protected folder + const fetchProtectedFolder = mappedPath.map( + async (path) => { + if ( + path.mimeType !== + "application/vnd.google-apps.folder" + ) + return; + + const query = [ + "trashed = false", + `'${decryptData(path.encryptedId)}' in parents`, + `name = '${gIndexConfig.apiConfig.specialFile.password}'`, + ]; + + const fetchFolderContents = await gdrive.files.list( + { + q: `${query.join(" and ")}`, + fields: "files(id, name, mimeType, parents)", + }, + ); + if (!fetchFolderContents.data.files?.length) return; + + return { + path: path.name, + passwordId: fetchFolderContents.data.files[0].id, + }; + }, + ); + let protectedFolder = await Promise.all( + fetchProtectedFolder, + ); + console.log(protectedFolder); + protectedFolder = protectedFolder.filter( + (item) => item !== undefined, + ); + const nearestFolderPassword = + protectedFolder[protectedFolder.length - 1] ?? null; + + console.log( + "After nearestFolderPassword", + nearestFolderPassword, + ); + + if ( + nearestFolderPassword && + nearestFolderPassword.passwordId + ) { + const fetchPassword = await gdrive.files.get( + { + fileId: nearestFolderPassword.passwordId, + alt: "media", + }, + { + responseType: "text", + }, + ); + + const userPassword = + request.cookies.get(Constant.cookies_SitePassword) + ?.value ?? null; + if (!userPassword) { + throw new ExtendedError( + "Password required", + 401, + `You need to enter password to access this file / folder`, + ); + } + + const nearestPathIndex = mappedPath.findIndex( + (path) => path.name === nearestFolderPassword.path, + ); + const currentPath = + "/" + + mappedPath + .slice(0, nearestPathIndex + 1) + .map((path) => path.name) + .join("/"); + + const validPassword = checkPathPassword( + currentPath, + userPassword, + fetchPassword.data as string, + ); + if (!validPassword) { + throw new ExtendedError( + "Invalid password", + 401, + `The password you entered is invalid`, + ); + } + } + + const payload: APIValidateResponse = { + timestamp: Date.now(), + responseTime: Date.now() - reqStart, + path: mappedPath.map((path) => path.name).join("/"), + valid: true, + }; + + return NextResponse.json(payload, { + status: 200, + }); + } catch (error: any) { + const res: ErrorResponse = { + timestamp: Date.now(), + responseTime: Date.now() - reqStart, + error: { + code: error.code || 500, + message: error.message, + reason: error.errors?.[0].reason, + }, + }; + return NextResponse.json(res, { + status: error.code || 500, + }); + } +} diff --git a/src/app/api/files/[encryptedId]/route.ts b/src/app/api/files/[encryptedId]/route.ts new file mode 100644 index 0000000..c270e60 --- /dev/null +++ b/src/app/api/files/[encryptedId]/route.ts @@ -0,0 +1,155 @@ +import gIndexConfig from "config"; +import { NextRequest, NextResponse } from "next/server"; + +import getSearchParams from "utils/apiHelper/getSearchParams"; +import { decryptData, encryptData } from "utils/encryptionHelper/hash"; +import ExtendedError from "utils/extendedError"; +import gdrive from "utils/gdriveInstance"; + +import { IGDriveFiles } from "types/api/files"; +import { APIFileResponse, APIFilesResponse, ErrorResponse } from "types/api/response"; + +export async function GET(request: NextRequest, { params }: { params: { encryptedId: string } }) { + const reqStart = Date.now(); + try { + const id = decryptData(params.encryptedId); + if (id === gIndexConfig.apiConfig.rootFolder) + return NextResponse.redirect(`${process.env.NEXT_PUBLIC_VERCEL_URL}/api/files`, { status: 301 }); + + const file = await gdrive.files.get({ + fileId: id, + fields: gIndexConfig.apiConfig.defaultField, + }); + + if (!file || file.data.trashed) throw new ExtendedError("File not found", 404, "Can't find requested file."); + if (file.data.mimeType !== "application/vnd.google-apps.folder") { + const res: APIFileResponse = { + timestamp: Date.now(), + responseTime: Date.now() - reqStart, + file: { + mimeType: file.data.mimeType as string, + fileExtension: file.data.fileExtension as string, + encryptedId: params.encryptedId, + name: file.data.name as string, + trashed: file.data.trashed as boolean, + modifiedTime: file.data.modifiedTime as string, + encryptedWebContentLink: encryptData(file.data.webContentLink as string), + size: Number(file.data.size ?? 0), + thumbnailLink: file.data.thumbnailLink as string, + imageMediaMetadata: file.data.imageMediaMetadata + ? { + width: Number(file.data.imageMediaMetadata.width), + height: Number(file.data.imageMediaMetadata.height), + rotation: Number(file.data.imageMediaMetadata.rotation), + } + : undefined, + videoMediaMetadata: file.data.videoMediaMetadata + ? { + width: Number(file.data.videoMediaMetadata.width), + height: Number(file.data.videoMediaMetadata.height), + durationMillis: Number(file.data.videoMediaMetadata.durationMillis), + } + : undefined, + }, + }; + + return NextResponse.json(res, { + status: 200, + headers: { + "Cache-Control": gIndexConfig.cacheControl, + }, + }); + } + + const { pageToken } = getSearchParams(request.url, ["pageToken"]); + + const filterName = gIndexConfig.apiConfig.hiddenFiles.map((item) => `name != '${item}'`).join(" and "); + const query: string[] = [...gIndexConfig.apiConfig.defaultQuery, `'${id}' in parents`, `${filterName}`]; + const fetchFolderContents = await gdrive.files.list({ + q: query.join(" and "), + fields: `files(${gIndexConfig.apiConfig.defaultField}), nextPageToken`, + orderBy: gIndexConfig.apiConfig.defaultOrder, + pageSize: gIndexConfig.apiConfig.itemsPerPage, + pageToken: pageToken || undefined, + }); + + const folders: IGDriveFiles[] = + fetchFolderContents.data.files + ?.filter((item) => item.mimeType === "application/vnd.google-apps.folder") + .map((item) => ({ + mimeType: item.mimeType as string, + encryptedId: encryptData(item.id as string), + name: item.name as string, + trashed: item.trashed as boolean, + modifiedTime: item.modifiedTime as string, + })) ?? []; + const files: IGDriveFiles[] = + fetchFolderContents.data.files + ?.filter((item) => item.mimeType !== "application/vnd.google-apps.folder") + .map((item) => ({ + mimeType: item.mimeType as string, + fileExtension: item.fileExtension as string, + encryptedId: encryptData(item.id as string), + name: item.name as string, + trashed: item.trashed as boolean, + modifiedTime: item.modifiedTime as string, + encryptedWebContentLink: encryptData(item.webContentLink as string), + size: Number(item.size ?? 0), + thumbnailLink: item.thumbnailLink as string, + imageMediaMetadata: item.imageMediaMetadata + ? { + width: Number(item.imageMediaMetadata.width ?? 0), + height: Number(item.imageMediaMetadata.height ?? 0), + rotation: Number(item.imageMediaMetadata.rotation ?? 0), + } + : undefined, + videoMediaMetadata: item.videoMediaMetadata + ? { + width: Number(item.videoMediaMetadata.width ?? 0), + height: Number(item.videoMediaMetadata.height ?? 0), + durationMillis: Number(item.videoMediaMetadata.durationMillis ?? 0), + } + : undefined, + })) ?? []; + const readmeExists = + fetchFolderContents.data.files?.some((item) => item.name === gIndexConfig.apiConfig.specialFile.readme) ?? false; + const bannerExists = + fetchFolderContents.data.files?.some( + (item) => + item.name?.startsWith(gIndexConfig.apiConfig.specialFile.banner) && item.mimeType?.startsWith("image/"), + ) ?? false; + const passwordExists = + fetchFolderContents.data.files?.some((item) => item.name === gIndexConfig.apiConfig.specialFile.password) ?? + false; + + const res: APIFilesResponse = { + timestamp: Date.now(), + responseTime: Date.now() - reqStart, + folders, + files, + nextPageToken: fetchFolderContents.data.nextPageToken || undefined, + readmeExists, + bannerExists, + passwordExists, + }; + return NextResponse.json(res, { + status: 200, + headers: { + "Cache-Control": gIndexConfig.cacheControl, + }, + }); + } catch (error: any) { + const res: ErrorResponse = { + timestamp: Date.now(), + responseTime: Date.now() - reqStart, + error: { + code: error.code || 500, + message: error.message, + reason: error.errors?.[0].reason, + }, + }; + return NextResponse.json(res, { + status: error.code || 500, + }); + } +} diff --git a/src/app/api/files/route.ts b/src/app/api/files/route.ts new file mode 100644 index 0000000..4836b91 --- /dev/null +++ b/src/app/api/files/route.ts @@ -0,0 +1,150 @@ +import gIndexConfig from "config"; +import { NextRequest, NextResponse } from "next/server"; + +import getSearchParams from "utils/apiHelper/getSearchParams"; +import privateIndexProtection from "utils/apiHelper/privateIndexProtection"; +import { encryptData } from "utils/encryptionHelper/hash"; +import gdrive from "utils/gdriveInstance"; + +import { IGDriveFiles } from "types/api/files"; +import { + APIFilesResponse, + ErrorResponse, +} from "types/api/response"; + +export async function GET(request: NextRequest) { + const reqStart = Date.now(); + try { + await privateIndexProtection(request); + const { pageToken } = getSearchParams(request.url, [ + "pageToken", + ]); + + const query: string[] = [ + ...gIndexConfig.apiConfig.defaultQuery, + `'${gIndexConfig.apiConfig.rootFolder}' in parents`, + ]; + const fetchFolderContents = await gdrive.files.list({ + q: query.join(" and "), + fields: `files(${gIndexConfig.apiConfig.defaultField}), nextPageToken`, + orderBy: gIndexConfig.apiConfig.defaultOrder, + pageSize: gIndexConfig.apiConfig.itemsPerPage, + pageToken: pageToken || undefined, + }); + + const folders: IGDriveFiles[] = + fetchFolderContents.data.files + ?.filter( + (item) => + item.mimeType === + "application/vnd.google-apps.folder", + ) + .map((item) => ({ + mimeType: item.mimeType as string, + encryptedId: encryptData(item.id as string), + name: item.name as string, + trashed: item.trashed as boolean, + modifiedTime: item.modifiedTime as string, + })) ?? []; + const files: IGDriveFiles[] = + fetchFolderContents.data.files + ?.filter( + (item) => + item.mimeType !== + "application/vnd.google-apps.folder" && + !gIndexConfig.apiConfig.hiddenFiles.includes( + item.name as string, + ), + ) + .map((item) => ({ + mimeType: item.mimeType as string, + fileExtension: item.fileExtension as string, + encryptedId: encryptData(item.id as string), + name: item.name as string, + trashed: item.trashed as boolean, + modifiedTime: item.modifiedTime as string, + encryptedWebContentLink: encryptData( + item.webContentLink as string, + ), + size: Number(item.size ?? 0), + thumbnailLink: item.thumbnailLink as string, + imageMediaMetadata: item.imageMediaMetadata + ? { + width: Number( + item.imageMediaMetadata.width ?? 0, + ), + height: Number( + item.imageMediaMetadata.height ?? 0, + ), + rotation: Number( + item.imageMediaMetadata.rotation ?? 0, + ), + } + : undefined, + videoMediaMetadata: item.videoMediaMetadata + ? { + width: Number( + item.videoMediaMetadata.width ?? 0, + ), + height: Number( + item.videoMediaMetadata.height ?? 0, + ), + durationMillis: Number( + item.videoMediaMetadata.durationMillis ?? + 0, + ), + } + : undefined, + })) ?? []; + const readmeExists = + fetchFolderContents.data.files?.some( + (item) => + item.name === + gIndexConfig.apiConfig.specialFile.readme, + ) ?? false; + const bannerExists = + fetchFolderContents.data.files?.some( + (item) => + item.name?.startsWith( + gIndexConfig.apiConfig.specialFile.banner, + ) && item.mimeType?.startsWith("image/"), + ) ?? false; + const passwordExists = + fetchFolderContents.data.files?.some( + (item) => + item.name === + gIndexConfig.apiConfig.specialFile.password, + ) ?? false; + + const res: APIFilesResponse = { + timestamp: Date.now(), + responseTime: Date.now() - reqStart, + folders, + files, + nextPageToken: + fetchFolderContents.data.nextPageToken || undefined, + readmeExists, + bannerExists, + passwordExists, + }; + return NextResponse.json(res, { + status: 200, + headers: { + "Cache-Control": gIndexConfig.cacheControl, + }, + }); + } catch (error: any) { + const res: ErrorResponse = { + timestamp: Date.now(), + responseTime: Date.now() - reqStart, + error: { + code: error.code || 500, + message: error.message, + reason: error.errors?.[0].reason, + }, + }; + return NextResponse.json(res, { + status: error.code || 500, + }); + } +} diff --git a/src/app/api/getData/route.ts b/src/app/api/getData/route.ts new file mode 100644 index 0000000..f88c82f --- /dev/null +++ b/src/app/api/getData/route.ts @@ -0,0 +1,190 @@ +import gIndexConfig from "config"; +import { drive_v3 } from "googleapis"; +import { NextRequest, NextResponse } from "next/server"; + +import getSearchParams from "utils/apiHelper/getSearchParams"; +import { + decryptData, + encryptData, +} from "utils/encryptionHelper/hash"; +import ExtendedError from "utils/extendedError"; +import gdrive from "utils/gdriveInstance"; + +import { IGDriveFiles } from "types/api/files"; +import { + APIGetFileResponse, + ErrorResponse, +} from "types/api/response"; + +function isHiddenFile(name: string) { + return gIndexConfig.apiConfig.hiddenFiles.find((item) => + name.startsWith(item), + ) + ? true + : false; +} +function generateFileObject( + data: drive_v3.Schema$File, +): IGDriveFiles { + return { + mimeType: data.mimeType as string, + fileExtension: (data.fileExtension as string) ?? null, + encryptedId: encryptData(data.id as string), + name: data.name as string, + trashed: (data.trashed as boolean) ?? false, + modifiedTime: new Date( + data.modifiedTime as string, + ).toLocaleDateString(), + encryptedWebContentLink: encryptData( + data.webContentLink as string, + ), + size: Number(data.size ?? 0), + thumbnailLink: (data.thumbnailLink as string) ?? null, + imageMediaMetadata: data.imageMediaMetadata + ? { + width: Number(data.imageMediaMetadata.width ?? 0), + height: Number( + data.imageMediaMetadata.height ?? 0, + ), + rotation: Number( + data.imageMediaMetadata.rotation ?? 0, + ), + } + : null, + videoMediaMetadata: data.videoMediaMetadata + ? { + width: Number(data.videoMediaMetadata.width ?? 0), + height: Number( + data.videoMediaMetadata.height ?? 0, + ), + durationMillis: Number( + data.videoMediaMetadata.durationMillis ?? 0, + ), + } + : null, + }; +} +function generateFolderObject( + data: drive_v3.Schema$File, +): IGDriveFiles { + return { + mimeType: data.mimeType as string, + encryptedId: encryptData(data.id as string), + name: data.name as string, + trashed: (data.trashed as boolean) ?? false, + modifiedTime: new Date( + data.modifiedTime as string, + ).toLocaleDateString(), + }; +} + +export async function GET(request: NextRequest) { + const reqStart = Date.now(); + try { + const { encryptedId, isFile, pageToken } = + getSearchParams(request.url, [ + "encryptedId", + "isFile", + "pageToken", + ]); + + let data: { + file: IGDriveFiles | null; + files: IGDriveFiles[]; + folders: IGDriveFiles[]; + pageToken: string | null; + } = { + file: null, + files: [], + folders: [], + pageToken: null, + }; + if (isFile && encryptedId) { + const fileContent = await gdrive.files.get({ + fileId: decryptData(encryptedId), + fields: gIndexConfig.apiConfig.defaultField, + }); + if (isHiddenFile(fileContent.data.name as string)) + throw new ExtendedError( + "File not found", + 404, + "File you are looking for is not found", + ); + + const payload: IGDriveFiles = generateFileObject( + fileContent.data, + ); + data.file = payload; + } else { + const filterName = gIndexConfig.apiConfig.hiddenFiles + .map((item) => `name != '${item}'`) + .join(" and "); + const query: string[] = [ + ...gIndexConfig.apiConfig.defaultQuery, + `'${ + encryptedId + ? decryptData(encryptedId) + : gIndexConfig.apiConfig.rootFolder + }' in parents`, + `${filterName}`, + ]; + const folderContent = await gdrive.files.list({ + q: query.join(" and "), + fields: `files(${gIndexConfig.apiConfig.defaultField}), nextPageToken`, + orderBy: gIndexConfig.apiConfig.defaultOrder, + pageSize: gIndexConfig.apiConfig.itemsPerPage, + pageToken: pageToken ?? undefined, + }); + + const listFolders: IGDriveFiles[] = + folderContent.data.files + ?.filter( + (item) => + item.mimeType === + "application/vnd.google-apps.folder", + ) + .map((item) => generateFolderObject(item)) ?? []; + const listFiles: IGDriveFiles[] = + folderContent.data.files + ?.filter( + (item) => + item.mimeType !== + "application/vnd.google-apps.folder", + ) + .map((item) => generateFileObject(item)) ?? []; + + data = { + ...data, + files: listFiles, + folders: listFolders, + pageToken: folderContent.data.nextPageToken ?? null, + }; + } + + const payload: APIGetFileResponse = { + timestamp: Date.now(), + responseTime: Date.now() - reqStart, + data, + }; + + return NextResponse.json(payload, { + status: 200, + headers: { + "Cache-Control": gIndexConfig.cacheControl, + }, + }); + } catch (error: any) { + const res: ErrorResponse = { + timestamp: Date.now(), + responseTime: Date.now() - reqStart, + error: { + code: error.code || 500, + message: error.message, + reason: error.errors?.[0].reason, + }, + }; + return NextResponse.json(res, { + status: error.code || 500, + }); + } +} diff --git a/src/app/api/getPassword/route.ts b/src/app/api/getPassword/route.ts new file mode 100644 index 0000000..91930e1 --- /dev/null +++ b/src/app/api/getPassword/route.ts @@ -0,0 +1,129 @@ +import gIndexConfig from "config"; +import { NextRequest, NextResponse } from "next/server"; + +import getSearchParams from "utils/apiHelper/getSearchParams"; +import { + decryptData, + encryptData, +} from "utils/encryptionHelper/hash"; +import ExtendedError from "utils/extendedError"; +import gdrive from "utils/gdriveInstance"; + +import { + APIGetPasswordResponse, + ErrorResponse, +} from "types/api/response"; + +export async function GET(request: NextRequest) { + const reqStart = Date.now(); + + try { + const { path } = getSearchParams(request.url, ["path"]); + if (!path) + throw new ExtendedError( + "Path is required", + 400, + "Can't find path in query, please check your query", + ); + const mappedPath: Record< + "name" | "id" | "mimeType", + string + >[] = JSON.parse(decryptData(path)); + const passwordParents = mappedPath.map( + (path) => `'${decryptData(path.id)}' in parents`, + ); + const query: string[] = [ + "trashed = false", + `name = '${ + gIndexConfig.apiConfig.specialFile.password + }' and (${passwordParents.join(" or ")})`, + ]; + const passwordData = await gdrive.files.list({ + q: query.join(" and "), + fields: "files(id, name, parents)", + }); + + const protectedPaths = mappedPath.map((path) => { + const isPasswordExist = passwordData.data.files?.find( + (file) => + file.parents?.[0] === decryptData(path.id), + ); + if (isPasswordExist) + return { + name: path.name, + passwordId: isPasswordExist.id, + }; + }); + + const _passwordContent: Promise<{ + path: string; + password: string; + }>[] = []; + protectedPaths.forEach((path) => { + if (!path) return; + _passwordContent.push( + gdrive.files + .get( + { + fileId: path.passwordId as string, + alt: "media", + }, + { responseType: "text" }, + ) + .then((res) => ({ + path: path.name as string, + password: res.data as string, + })), + ); + }); + + const passwordContent = await Promise.all( + _passwordContent, + ); + + let prevPath = [""]; + let password: Record< + "relativePath" | "password", + string + >[] = []; + + mappedPath.forEach((path) => { + prevPath.push(path.name); + const isPasswordExist = passwordContent.find( + (password) => password.path === path.name, + ); + if (isPasswordExist) { + password.push({ + relativePath: prevPath.join("/"), + password: encryptData(isPasswordExist.password), + }); + } + }); + + const payload: APIGetPasswordResponse = { + timestamp: Date.now(), + responseTime: Date.now() - reqStart, + data: password, + }; + + return NextResponse.json(payload, { + status: 200, + headers: { + "Cache-Control": gIndexConfig.cacheControl, + }, + }); + } catch (error: any) { + const res: ErrorResponse = { + timestamp: Date.now(), + responseTime: Date.now() - reqStart, + error: { + code: error.code || 500, + message: error.message, + reason: error.errors?.[0].reason, + }, + }; + return NextResponse.json(res, { + status: error.code || 500, + }); + } +} diff --git a/src/app/api/getReadme/route.ts b/src/app/api/getReadme/route.ts new file mode 100644 index 0000000..fd7f307 --- /dev/null +++ b/src/app/api/getReadme/route.ts @@ -0,0 +1,79 @@ +import gIndexConfig from "config"; +import { NextRequest, NextResponse } from "next/server"; + +import getSearchParams from "utils/apiHelper/getSearchParams"; +import { decryptData } from "utils/encryptionHelper/hash"; +import gdrive from "utils/gdriveInstance"; + +import { + APIGetReadmeResponse, + ErrorResponse, +} from "types/api/response"; + +export async function GET(request: NextRequest) { + const reqStart = Date.now(); + try { + const { encryptedId } = getSearchParams(request.url, [ + "encryptedId", + ]); + + const query: string[] = [ + ...gIndexConfig.apiConfig.defaultQuery, + `'${ + encryptedId + ? decryptData(encryptedId) + : gIndexConfig.apiConfig.rootFolder + }' in parents`, + ]; + const folderContent = await gdrive.files.list({ + q: query.join(" and "), + fields: `files(${gIndexConfig.apiConfig.defaultField}), nextPageToken`, + orderBy: gIndexConfig.apiConfig.defaultOrder, + pageSize: gIndexConfig.apiConfig.itemsPerPage, + pageToken: undefined, + }); + const isReadmeExist = folderContent.data.files?.find( + (file) => + file.name === + gIndexConfig.apiConfig.specialFile.readme, + ); + let data: string | null = null; + + if (isReadmeExist) { + const fileContent = await gdrive.files.get( + { + fileId: isReadmeExist.id as string, + alt: "media", + }, + { responseType: "text" }, + ); + data = fileContent.data as string; + } + + const payload: APIGetReadmeResponse = { + timestamp: Date.now(), + responseTime: Date.now() - reqStart, + data, + }; + + return NextResponse.json(payload, { + status: 200, + headers: { + "Cache-Control": gIndexConfig.cacheControl, + }, + }); + } catch (error: any) { + const res: ErrorResponse = { + timestamp: Date.now(), + responseTime: Date.now() - reqStart, + error: { + code: error.code || 500, + message: error.message, + reason: error.errors?.[0].reason, + }, + }; + return NextResponse.json(res, { + status: error.code || 500, + }); + } +} diff --git a/src/app/api/password/add/route.ts b/src/app/api/password/add/route.ts new file mode 100644 index 0000000..7d917b0 --- /dev/null +++ b/src/app/api/password/add/route.ts @@ -0,0 +1,69 @@ +import { NextRequest, NextResponse } from "next/server"; + +import getSearchParams from "utils/apiHelper/getSearchParams"; +import ExtendedError from "utils/extendedError"; +import { addNewPassword } from "utils/passwordHelper"; + +import { ErrorResponse } from "types/api/response"; +import { Constant } from "types/constant"; + +export async function GET(request: NextRequest) { + const reqStart = Date.now(); + + try { + const { path, password } = getSearchParams( + request.url, + ["path", "password"], + ); + if (!path || !password) + throw new ExtendedError( + "Missing parameters", + 400, + "Path or password is missing", + ); + + const cookies = request.cookies.get( + Constant.cookies_SitePassword, + ); + if (!cookies) + throw new ExtendedError( + "No cookies found", + 400, + "Site password not found", + ); + const newPassword = addNewPassword( + path!, + password!, + cookies.value, + true, + ); + + return NextResponse.json( + { + newPassword: { + path, + password, + }, + }, + { + status: 200, + headers: { + "Set-Cookie": newPassword as string, + }, + }, + ); + } catch (error: any) { + const res: ErrorResponse = { + timestamp: Date.now(), + responseTime: Date.now() - reqStart, + error: { + code: error.code || 500, + message: error.message, + reason: error.errors?.[0].reason, + }, + }; + return NextResponse.json(res, { + status: error.code || 500, + }); + } +} diff --git a/src/app/api/password/route.ts b/src/app/api/password/route.ts new file mode 100644 index 0000000..c579ce2 --- /dev/null +++ b/src/app/api/password/route.ts @@ -0,0 +1,47 @@ +import { NextRequest, NextResponse } from "next/server"; + +import { decryptData } from "utils/encryptionHelper/hash"; +import ExtendedError from "utils/extendedError"; + +import { ErrorResponse } from "types/api/response"; +import { Constant } from "types/constant"; + +export async function GET(request: NextRequest) { + const reqStart = Date.now(); + + try { + const cookies = request.cookies.get( + Constant.cookies_SitePassword, + ); + if (!cookies) + throw new ExtendedError( + "No cookies found", + 400, + "Site password not found", + ); + const rawToken = decryptData(cookies.value); + const token = JSON.parse(rawToken); + + return NextResponse.json( + { + password: token, + }, + { + status: 200, + }, + ); + } catch (error: any) { + const res: ErrorResponse = { + timestamp: Date.now(), + responseTime: Date.now() - reqStart, + error: { + code: error.code || 500, + message: error.message, + reason: error.errors?.[0].reason, + }, + }; + return NextResponse.json(res, { + status: error.code || 500, + }); + } +} diff --git a/src/app/api/search/redirect/[encryptedId]/route.ts b/src/app/api/search/redirect/[encryptedId]/route.ts new file mode 100644 index 0000000..354f5a5 --- /dev/null +++ b/src/app/api/search/redirect/[encryptedId]/route.ts @@ -0,0 +1,76 @@ +import gIndexConfig from "config"; +import { NextRequest, NextResponse } from "next/server"; + +import { decryptData } from "utils/encryptionHelper/hash"; +import ExtendedError from "utils/extendedError"; +import gdrive from "utils/gdriveInstance"; + +import { ErrorResponse } from "types/api/response"; + +export async function GET(request: NextRequest, { params }: { params: { encryptedId: string } }) { + const reqStart = Date.now(); + const { encryptedId } = params; + try { + const id = decryptData(encryptedId); + if (!id) throw new ExtendedError("Invalid encryptedId", 400, "EncryptedId provided is invalid"); + + const path: string[] = []; + let lastId = id; + const fileContent = await gdrive.files.get({ + fileId: lastId, + fields: "id, name, mimeType, parents", + }); + if (fileContent) { + path.push(fileContent.data.name as string); + if (fileContent.data.parents) { + lastId = fileContent.data.parents[0] as string; + while (lastId) { + const folderContent = await gdrive.files.get({ + fileId: lastId, + fields: "id, name, mimeType, parents", + }); + if (folderContent.data.id === gIndexConfig.apiConfig.rootFolder) { + lastId = ""; + break; + } + if (folderContent) { + path.push(folderContent.data.name as string); + if (folderContent.data.parents) { + if (folderContent.data.parents[0] === gIndexConfig.apiConfig.rootFolder) { + lastId = ""; + break; + } else { + lastId = folderContent.data.parents[0] as string; + } + } else { + lastId = ""; + } + } else { + lastId = ""; + } + } + } + } + + const redirectURL = new URL(path.reverse().join("/"), process.env.NEXT_PUBLIC_VERCEL_URL); + return NextResponse.redirect(redirectURL.toString(), { + status: 302, + headers: { + "Cache-Control": gIndexConfig.cacheControl, + }, + }); + } catch (error: any) { + const res: ErrorResponse = { + timestamp: Date.now(), + responseTime: Date.now() - reqStart, + error: { + code: error.code || 500, + message: error.message, + reason: error.errors?.[0].reason, + }, + }; + return NextResponse.json(res, { + status: error.code || 500, + }); + } +} diff --git a/src/app/api/search/route.ts b/src/app/api/search/route.ts new file mode 100644 index 0000000..b6c268f --- /dev/null +++ b/src/app/api/search/route.ts @@ -0,0 +1,65 @@ +import gIndexConfig from "config"; +import { NextRequest, NextResponse } from "next/server"; + +import getSearchParams from "utils/apiHelper/getSearchParams"; +import { encryptData } from "utils/encryptionHelper/hash"; +import ExtendedError from "utils/extendedError"; +import gdrive from "utils/gdriveInstance"; + +import { IGDriveFiles } from "types/api/files"; +import { APISearchResponse, ErrorResponse } from "types/api/response"; + +export async function GET(request: NextRequest) { + const reqStart = Date.now(); + try { + const { query } = getSearchParams(request.url, ["query"]); + if (!query) throw new ExtendedError("Missing query", 400, "Search query is required"); + + const searchFiles = await gdrive.files.list({ + q: [...gIndexConfig.apiConfig.defaultQuery, `name contains '${query}'`].join(" and "), + fields: `files(${gIndexConfig.apiConfig.defaultField}), nextPageToken`, + orderBy: "name_natural desc", + pageSize: gIndexConfig.apiConfig.searchResult, + pageToken: undefined, + }); + + const files: (IGDriveFiles & { redirect: string })[] = + searchFiles.data.files?.map((data) => ({ + mimeType: data.mimeType ?? "Unknown", + encryptedId: encryptData(data.id as string), + name: data.name as string, + trashed: data.trashed ?? false, + modifiedTime: new Date(data.modifiedTime as string).toLocaleDateString(), + fileExtension: (data.fileExtension as string) ?? null, + encryptedWebContentLink: undefined, + size: Number(data.size) ?? 0, + thumbnailLink: (data.thumbnailLink as string) ?? null, + imageMediaMetadata: null, + videoMediaMetadata: null, + redirect: `/api/search/redirect/${encryptData(data.id as string)}`, + })) ?? []; + + const payload: APISearchResponse = { + timestamp: Date.now(), + responseTime: Date.now() - reqStart, + files: files, + }; + + return NextResponse.json(payload, { + status: 200, + }); + } catch (error: any) { + const res: ErrorResponse = { + timestamp: Date.now(), + responseTime: Date.now() - reqStart, + error: { + code: error.code || 500, + message: error.message, + reason: error.errors?.[0].reason, + }, + }; + return NextResponse.json(res, { + status: error.code || 500, + }); + } +} diff --git a/src/app/download/[...path]/route.ts b/src/app/download/[...path]/route.ts deleted file mode 100644 index 0a94d8d..0000000 --- a/src/app/download/[...path]/route.ts +++ /dev/null @@ -1,140 +0,0 @@ -import { cookies } from "next/headers"; -import { NextRequest, NextResponse } from "next/server"; - -import createErrorPayload from "utils/apiHelper/createErrorPayload"; -import gdrive from "utils/apiHelper/gdrive"; -import shortEncryption from "utils/encryptionHelper/shortEncryption"; -import ExtendedError from "utils/generalHelper/extendedError"; - -import { API_Response } from "types/api"; -import { ValidateFilePathResponse } from "types/api/path"; -import { Constant } from "types/general/constant"; - -import apiConfig from "config/api.config"; - -export async function GET( - request: NextRequest, - { params }: { params: { path: string[] } }, -) { - const _start = Date.now(); - const { path } = params; - - try { - const passwordCookies = - cookies().get(Constant.cookiePassword)?.value || ""; - - const pathValidation = await fetch( - `${apiConfig.basePath}/api/validate/${path.join( - "/", - )}`, - { - headers: { - Cookie: `${Constant.cookiePassword}=${passwordCookies}`, - }, - }, - ).then( - (res) => - res.json() as Promise< - API_Response - >, - ); - - let isFolder = false; - if ( - pathValidation.data?.[pathValidation.data?.length - 1] - .mimeType === "application/vnd.google-apps.folder" - ) { - isFolder = true; - } - const lastId = pathValidation.data?.[ - pathValidation.data?.length - 1 - ].encryptedId as string; - - if (isFolder) { - throw new ExtendedError( - Constant.apiBadRequest, - 400, - "badRequest", - "Can't download folder.", - ); - } - - const getMetadata = gdrive.files.get({ - fileId: shortEncryption.decrypt(lastId), - fields: "id, name, mimeType, webContentLink", - }); - const getStream = gdrive.files.get( - { - fileId: shortEncryption.decrypt(lastId), - alt: "media", - }, - { responseType: "stream" }, - ); - - const [metadata, stream] = await Promise.all([ - getMetadata, - getStream, - ]); - if (!metadata || metadata.data.trashed) { - const msg = metadata.data.trashed - ? "File has been deleted" - : "File not found"; - throw new ExtendedError( - Constant.apiFileNotFound, - 404, - "notFound", - msg, - ); - } - - if ( - Number(metadata.data.size) > - apiConfig.files.download.maxFileSize && - apiConfig.files.download.maxFileSize > 0 - ) { - return NextResponse.redirect( - metadata.data.webContentLink as string, - { status: 302 }, - ); - } - - const arrayBuffer = await new Promise( - (resolve, reject) => { - const chunks: Buffer[] = []; - stream.data.on("data", (chunk) => - chunks.push(chunk), - ); - stream.data.on("end", () => { - const buffer = Buffer.concat(chunks); - resolve( - buffer.buffer.slice( - buffer.byteOffset, - buffer.byteOffset + buffer.byteLength, - ), - ); - }); - stream.data.on("error", reject); - }, - ); - return new NextResponse(arrayBuffer, { - status: 200, - headers: { - "Content-Type": - metadata.data.mimeType || - "application/octet-stream", - "Cache-Control": apiConfig.cacheControl, - "Content-Disposition": `attachment; filename="${metadata.data.name}"`, - }, - }); - } catch (error: any) { - const payload = createErrorPayload( - error, - `GET /download/${path.join("/")}`, - _start, - ); - - return NextResponse.json(payload, { - status: payload.code || 500, - }); - } -} diff --git a/src/app/error.tsx b/src/app/error.tsx deleted file mode 100644 index c678541..0000000 --- a/src/app/error.tsx +++ /dev/null @@ -1,133 +0,0 @@ -"use client"; - -// Error components must be Client Components -import { usePathname, useRouter } from "next/navigation"; -import { useEffect, useState } from "react"; - -import CompPassword from "components/compPassword"; - -import ExtendedError from "utils/generalHelper/extendedError"; - -import { Constant } from "types/general/constant"; - -export default function Error({ - error, - reset, -}: { - error: Error; - reset: () => void; -}) { - const router = useRouter(); - const pathname = usePathname(); - const [extendedError, setExtendedError] = - useState(); - const [path, setPath] = useState("root"); - - useEffect(() => { - if (error.message.includes("{")) { - const errorObj = JSON.parse( - error.message, - ) as ExtendedError; - const extendError = new ExtendedError( - errorObj.extendedMessage ?? - Constant.apiInternalError, - errorObj.code ?? 500, - errorObj.category ?? "internalServerError", - errorObj.reason ?? "Internal Server Error", - ); - setExtendedError(extendError); - - console.log(extendError.code); - - const path = - extendError.reason?.split('"')[1]?.split('"')[0] ?? - "root"; - setPath(path); - } else { - const extendedError = new ExtendedError( - Constant.apiInternalError, - 500, - "internalServerError", - error.message, - ); - setExtendedError(extendedError); - } - }, [error]); - - // useEffect(() => { - // if (extendedError?.code === 401) { - // router.push( - // `/password?redirect=${pathname}&path=${path}`, - // ); - // } - // // eslint-disable-next-line react-hooks/exhaustive-deps - // }, [extendedError, path, pathname]); - - return ( -
- {/* Image placeholder */} -
- Placeholder Image -
- - {extendedError?.code === 401 ? ( - <> - - - ) : ( - <> - {/* Error message */} -
-

- {extendedError?.code} -

-

- {extendedError?.message} -

-
- - - - -
-
- - {/* Error reason */} -
-            {extendedError?.category}: 
-            {extendedError?.reason}
-          
- - )} -
- ); -} diff --git a/src/app/layout.tsx b/src/app/layout.tsx deleted file mode 100644 index 3aa6600..0000000 --- a/src/app/layout.tsx +++ /dev/null @@ -1,63 +0,0 @@ -import { - Exo_2, - JetBrains_Mono, - Source_Sans_Pro, -} from "next/font/google"; - -import ClientContextWrapper from "components/clientContextWrapper"; -import Footer from "components/compFooter"; -import Navbar from "components/compNavbar"; - -import "styles/globals.css"; - -const exo2 = Exo_2({ - weight: ["300", "400", "600", "700"], - style: ["normal", "italic"], - display: "auto", - subsets: ["latin", "latin-ext"], - variable: "--font-exo2", -}); -const sourceSansPro = Source_Sans_Pro({ - weight: ["300", "400", "600", "700"], - style: ["normal", "italic"], - display: "auto", - subsets: ["latin", "latin-ext"], - variable: "--font-source-sans-pro", -}); -const jetBrainsMono = JetBrains_Mono({ - weight: ["300", "400", "600", "700"], - style: ["normal", "italic"], - display: "auto", - subsets: ["latin", "latin-ext"], - variable: "--font-jetbrains-mono", -}); - -type Props = { - children: React.ReactNode; -}; - -function RootLayout({ children }: Props) { - return ( - - - -
- -
- {children} -
-
-
-
- - - ); -} - -export default RootLayout; diff --git a/src/app/loading.tsx b/src/app/loading.tsx deleted file mode 100644 index 1c1a47b..0000000 --- a/src/app/loading.tsx +++ /dev/null @@ -1,38 +0,0 @@ -function RootLoading() { - return ( -
-
-
-
-
-
-
-
- ); -} - -export default RootLoading; diff --git a/src/app/not-found.tsx b/src/app/not-found.tsx deleted file mode 100644 index fe138f8..0000000 --- a/src/app/not-found.tsx +++ /dev/null @@ -1,37 +0,0 @@ -import Link from "next/link"; - -function NotFound() { - return ( -
- {/* Image placeholder */} -
- Placeholder Image -
- -
-

404

-

- The file or folder you are trying to access does - not exist or has been deleted. -

- - - -
-
- ); -} - -export default NotFound; diff --git a/src/app/opengraph-image.tsx b/src/app/opengraph-image.tsx deleted file mode 100644 index d19fd85..0000000 --- a/src/app/opengraph-image.tsx +++ /dev/null @@ -1,160 +0,0 @@ -import { ImageResponse } from "next/server"; - -import { Constant } from "types/general/constant"; - -import apiConfig from "config/api.config"; -import siteConfig from "config/site.config"; - -export const runtime = "edge"; - -export const alt = siteConfig.siteName; -export const size = { - width: 1200, - height: 630, -}; -export const contentType = "image/png"; - -export default async function Image() { - const fetchBannerData = fetch( - `${apiConfig.basePath}/api/files`, - { - headers: { - [Constant.cookieMaster]: process.env - .MASTER_KEY as string, - }, - }, - ).then((res) => res.json()); - const fetchFontBold = fetch( - `${apiConfig.basePath}/fonts/Exo2-Bold.ttf`, - ).then((res) => res.arrayBuffer()); - const fetchFontRegular = fetch( - `${apiConfig.basePath}/fonts/Exo2-Regular.ttf`, - ).then((res) => res.arrayBuffer()); - - const [dataFetch, fontBold, fontRegular] = - await Promise.all([ - fetchBannerData, - fetchFontBold, - fetchFontRegular, - ]); - - if (!dataFetch.data.isBannerExists) { - return new ImageResponse( - ( - {alt} - ), - { - ...size, - }, - ); - } - - return new ImageResponse( - ( -
-
- {""} -
-
-
- {""} -
-
- {siteConfig.siteName} -
-
- {siteConfig.siteDescription} -
-
-
- {""} -
- -
-
Powered by
- {""} -
- next-gdrive-index -
-
-
- ), - { - ...size, - fonts: [ - { - name: "Exo2", - data: fontRegular, - weight: 400, - style: "normal", - }, - { - name: "Exo2", - data: fontBold, - weight: 700, - style: "normal", - }, - ], - }, - ); -} diff --git a/src/app/opengraph/[...path]/route.tsx b/src/app/opengraph/[...path]/route.tsx deleted file mode 100644 index 00f9378..0000000 --- a/src/app/opengraph/[...path]/route.tsx +++ /dev/null @@ -1,228 +0,0 @@ -import { - ImageResponse, - NextRequest, - NextResponse, -} from "next/server"; - -import createErrorPayload from "utils/apiHelper/createErrorPayload"; -import ExtendedError from "utils/generalHelper/extendedError"; - -import { API_Response } from "types/api"; -import { - FileResponse, - FilesResponse, -} from "types/api/files"; -import { - FilePath, - ValidateFilePathResponse, -} from "types/api/path"; -import { RequestContext } from "types/general"; -import { Constant } from "types/general/constant"; - -import apiConfig from "config/api.config"; -import siteConfig from "config/site.config"; - -export const runtime = "edge"; - -export const alt = siteConfig.siteName; -export const size = { - width: 1200, - height: 630, -}; - -export async function GET( - request: NextRequest, - { params }: RequestContext<"path", string[]>, -) { - const _start = Date.now(); - const { path } = params; - - try { - const pathValidation = await fetch( - `${apiConfig.basePath}/api/validate/${path.join( - "/", - )}`, - { - headers: { - [Constant.cookieMaster]: process.env - .MASTER_KEY as string, - }, - }, - ).then( - (res) => - res.json() as Promise< - API_Response - >, - ); - if (!pathValidation.success) { - throw new ExtendedError( - Constant.apiFileNotFound, - 404, - "notFound", - "Can't find the file you're looking for.", - ); - } - - const targetFile = pathValidation.data?.[ - pathValidation.data.length - 1 - ] as FilePath; - - const fetchFile = fetch( - `${apiConfig.basePath}/api/files/${targetFile.encryptedId}`, - { - headers: { - [Constant.cookieMaster]: process.env - .MASTER_KEY as string, - }, - }, - ).then( - (res) => - res.json() as Promise< - API_Response - >, - ); - const fetchFontBold = fetch( - `${apiConfig.basePath}/fonts/Exo2-Bold.ttf`, - ).then((res) => res.arrayBuffer()); - const fetchFontRegular = fetch( - `${apiConfig.basePath}/fonts/Exo2-Regular.ttf`, - ).then((res) => res.arrayBuffer()); - - const [file, fontBold, fontRegular] = await Promise.all( - [fetchFile, fetchFontBold, fetchFontRegular], - ); - - if ( - targetFile.mimeType === - "application/vnd.google-apps.folder" && - !(file.data as FilesResponse).isBannerExists - ) { - return new ImageResponse( - ( - {alt} - ), - { - ...size, - }, - ); - } - - return new ImageResponse( - ( -
-
- {""} -
-
-
- {""} -
-
- {siteConfig.siteName} -
-
- {targetFile.name} -
-
-
- {""} -
- -
-
Powered by
- {""} -
- next-gdrive-index -
-
-
- ), - { - ...size, - fonts: [ - { - name: "Exo2", - data: fontRegular, - weight: 400, - style: "normal", - }, - { - name: "Exo2", - data: fontBold, - weight: 700, - style: "normal", - }, - ], - }, - ); - } catch (error: any) { - const payload = createErrorPayload( - error, - "GET /opengraph", - _start, - ); - return NextResponse.json(payload, { - status: payload.code, - }); - } -} diff --git a/src/app/page.tsx b/src/app/page.tsx deleted file mode 100644 index 1fb5f25..0000000 --- a/src/app/page.tsx +++ /dev/null @@ -1,144 +0,0 @@ -import { Metadata } from "next"; -import { cookies } from "next/headers"; -import { notFound, redirect } from "next/navigation"; - -import Breadcrumb from "components/compBreadcrumb"; -import FileLayout from "components/compFileLayout"; -import CompReadmeRender from "components/compReadmeRender"; -import SwitchLayout from "components/compSwitchLayout"; - -import { handleError } from "utils/generalHelper/axiosFetch"; - -import { API_Error, API_Response } from "types/api"; -import { FilesResponse } from "types/api/files"; -import { ValidateFilePathResponse } from "types/api/path"; -import { Constant } from "types/general/constant"; - -import apiConfig from "config/api.config"; -import siteConfig from "config/site.config"; - -export const metadata: Metadata = { - metadataBase: new URL(apiConfig.basePath), - title: siteConfig.siteName, - description: siteConfig.siteDescription, - alternates: { - canonical: "/", - }, - openGraph: { - title: siteConfig.siteName, - description: siteConfig.siteDescription, - url: `/`, - siteName: siteConfig.siteName, - }, - twitter: { - title: siteConfig.siteName, - description: siteConfig.siteDescription, - card: "summary_large_image", - site: siteConfig.siteName, - }, -}; - -async function RootPage() { - const passwordCookies = - cookies().get(Constant.cookiePassword)?.value ?? ""; - - const getPathValidation = fetch( - `${apiConfig.basePath}/api/validate`, - { - credentials: "include", - headers: { - Cookie: `${Constant.cookiePassword}=${passwordCookies}`, - }, - }, - ).then( - (res) => - res.json() as Promise< - API_Response - >, - ); - - const getFilesData = fetch( - `${apiConfig.basePath}/api/files`, - { - credentials: "include", - headers: { - Cookie: `${Constant.cookiePassword}=${passwordCookies}`, - }, - }, - ).then( - (res) => - res.json() as Promise>, - ); - - const [pathValidation, filesData] = await Promise.all([ - getPathValidation, - getFilesData, - ]); - - if (!pathValidation.success) { - const errorData = pathValidation as API_Error; - if (errorData.code === 401) { - const protectedPath = errorData.reason - .split('"')[1] - .split('"')[0]; - redirect( - `/password?redirect=/&path=${protectedPath}`, - ); - } - if (errorData.code === 404) { - notFound(); - } - const payload = handleError(errorData); - throw new Error(payload); - } - if (!filesData.success) { - const errorData = filesData as API_Error; - const payload = handleError(errorData); - throw new Error(payload); - } - - return ( -
-
- - -
- -
- -
- - {filesData.data?.isReadmeExists && - filesData.data?.readmeContent && ( -
- -
- )} -
- ); -} - -export default RootPage; diff --git a/src/app/password/page.tsx b/src/app/password/page.tsx deleted file mode 100644 index 6088bc1..0000000 --- a/src/app/password/page.tsx +++ /dev/null @@ -1,67 +0,0 @@ -import { Metadata } from "next"; -import { redirect } from "next/navigation"; - -import CompPassword from "components/compPassword"; - -import apiConfig from "config/api.config"; -import siteConfig from "config/site.config"; - -type Props = { - searchParams: { - [key: string]: string | string[] | undefined; - }; -}; - -export const metadata: Metadata = { - metadataBase: new URL(apiConfig.basePath), - title: siteConfig.siteName, - description: siteConfig.siteDescription, - alternates: { - canonical: "/", - }, - openGraph: { - title: siteConfig.siteName, - description: siteConfig.siteDescription, - url: `/`, - siteName: siteConfig.siteName, - }, - twitter: { - title: siteConfig.siteName, - description: siteConfig.siteDescription, - card: "summary_large_image", - site: siteConfig.siteName, - }, -}; - -function Password({ searchParams }: Props) { - if ( - searchParams["redirect"] === undefined || - searchParams["path"] === undefined - ) { - redirect("/"); - } - - return ( -
- {/* Image placeholder */} -
- Placeholder Image -
- - -
- ); -} - -export default Password; diff --git a/src/app/robots.txt b/src/app/robots.txt deleted file mode 100644 index 77470cb..0000000 --- a/src/app/robots.txt +++ /dev/null @@ -1,2 +0,0 @@ -User-agent: * -Disallow: / \ No newline at end of file diff --git a/src/app/twitter-image.tsx b/src/app/twitter-image.tsx deleted file mode 100644 index d19fd85..0000000 --- a/src/app/twitter-image.tsx +++ /dev/null @@ -1,160 +0,0 @@ -import { ImageResponse } from "next/server"; - -import { Constant } from "types/general/constant"; - -import apiConfig from "config/api.config"; -import siteConfig from "config/site.config"; - -export const runtime = "edge"; - -export const alt = siteConfig.siteName; -export const size = { - width: 1200, - height: 630, -}; -export const contentType = "image/png"; - -export default async function Image() { - const fetchBannerData = fetch( - `${apiConfig.basePath}/api/files`, - { - headers: { - [Constant.cookieMaster]: process.env - .MASTER_KEY as string, - }, - }, - ).then((res) => res.json()); - const fetchFontBold = fetch( - `${apiConfig.basePath}/fonts/Exo2-Bold.ttf`, - ).then((res) => res.arrayBuffer()); - const fetchFontRegular = fetch( - `${apiConfig.basePath}/fonts/Exo2-Regular.ttf`, - ).then((res) => res.arrayBuffer()); - - const [dataFetch, fontBold, fontRegular] = - await Promise.all([ - fetchBannerData, - fetchFontBold, - fetchFontRegular, - ]); - - if (!dataFetch.data.isBannerExists) { - return new ImageResponse( - ( - {alt} - ), - { - ...size, - }, - ); - } - - return new ImageResponse( - ( -
-
- {""} -
-
-
- {""} -
-
- {siteConfig.siteName} -
-
- {siteConfig.siteDescription} -
-
-
- {""} -
- -
-
Powered by
- {""} -
- next-gdrive-index -
-
-
- ), - { - ...size, - fonts: [ - { - name: "Exo2", - data: fontRegular, - weight: 400, - style: "normal", - }, - { - name: "Exo2", - data: fontBold, - weight: 700, - style: "normal", - }, - ], - }, - ); -} diff --git a/src/components/Alert/index.tsx b/src/components/Alert/index.tsx new file mode 100644 index 0000000..d167df1 --- /dev/null +++ b/src/components/Alert/index.tsx @@ -0,0 +1,53 @@ +import { Icon, IconifyIcon } from "@iconify/react"; +import { twMerge } from "tailwind-merge"; + +interface AlertProps { + variant?: "success" | "error" | "warning" | "info"; + icon?: string | IconifyIcon; + title?: string; + message: string; + className?: string; +} +export default function Alert(props: AlertProps) { + const { + variant = "info", + icon, + title, + message, + className, + } = props; + return ( +
+ {(icon || title) && ( +
+ {icon && ( + + )} + {title && ( + + {title} + + )} +
+ )} +

{message}

+
+ ); +} diff --git a/src/components/Breadcrumb/index.tsx b/src/components/Breadcrumb/index.tsx new file mode 100644 index 0000000..06437d4 --- /dev/null +++ b/src/components/Breadcrumb/index.tsx @@ -0,0 +1,165 @@ +import { Icon, IconifyIcon } from "@iconify/react"; +import Link from "next/link"; +import { useRouter } from "next/router"; +import { Fragment, useEffect, useState } from "react"; + +import ButtonIcon from "components/ButtonIcon"; +import ClickAway from "components/ClickAway"; + +interface BreadcrumbProps { + paths: Record<"label" | "path", string>[]; + separator?: string | IconifyIcon; + maxPath?: number; +} + +export default function Breadcrumb(props: BreadcrumbProps) { + const router = useRouter(); + const { + paths, + separator = "ion:chevron-forward", + maxPath = 2, + } = props; + const [breadcrumbPaths, setBreadcrumbPaths] = + useState[]>(paths); + const [isPathSliced, setIsPathSliced] = + useState(false); + const [hiddenPaths, setHiddenPaths] = useState< + Record<"label" | "path", string>[] + >([]); + const [menuAnchor, setMenuAnchor] = + useState(null); + + const [menuOpen, setMenuOpen] = useState(false); + + useEffect(() => { + if (paths.length > maxPath) { + const newPaths = paths.slice( + paths.length - maxPath, + paths.length, + ); + const hiddenPaths = paths.slice( + 0, + paths.length - maxPath, + ); + setBreadcrumbPaths(newPaths); + setIsPathSliced(true); + setHiddenPaths(hiddenPaths); + } else { + setBreadcrumbPaths(paths); + setIsPathSliced(false); + } + }, [paths, maxPath]); + + return ( + <> +
+ + + {/* */} + + {isPathSliced && ( + <> + + { + e.preventDefault(); + e.stopPropagation(); + setMenuOpen(!menuOpen); + }} + /> + {/* ... */} + + )} + {breadcrumbPaths.map((path, index) => ( + + + + {decodeURIComponent(path.label)} + + + ))} +
+ + { + e.preventDefault(); + e.stopPropagation(); + setMenuOpen(false); + }} + className={`w-screen h-screen z-30 fixed top-0 left-0 transition-smooth backdrop-blur-none ${ + menuOpen + ? "opacity-100 pointer-events-auto" + : "opacity-0 pointer-events-none" + }`} + > +
+
+ {hiddenPaths.map((path, index) => ( + + {decodeURIComponent(path.label)} + + ))} +
+
+
+ + ); +} diff --git a/src/components/Button/index.tsx b/src/components/Button/index.tsx new file mode 100644 index 0000000..8f77660 --- /dev/null +++ b/src/components/Button/index.tsx @@ -0,0 +1,121 @@ +import { Icon, IconifyIcon } from "@iconify/react"; +import { ReactNode } from "react"; +import { twMerge } from "tailwind-merge"; + +interface ButtonProps + extends React.ButtonHTMLAttributes { + fullWidth?: boolean; + variant?: + | "primary" + | "accent" + | "success" + | "danger" + | "warning" + | "info" + | "transparent"; + size?: "small" | "medium" | "large"; + pill?: boolean; + square?: boolean; + rounded?: "none" | "small" | "medium" | "large"; + startIcon?: string | IconifyIcon; + endIcon?: string | IconifyIcon; + children: ReactNode; + loading?: boolean; + className?: string; +} + +export default function Button(props: ButtonProps) { + const { + fullWidth = false, + variant = "primary", + size = "medium", + pill = false, + square = false, + rounded = "none", + loading = false, + startIcon, + endIcon, + children, + className, + ...rest + } = props; + + return ( + + ); +} diff --git a/src/components/ButtonGroup/index.tsx b/src/components/ButtonGroup/index.tsx new file mode 100644 index 0000000..cdfec8d --- /dev/null +++ b/src/components/ButtonGroup/index.tsx @@ -0,0 +1,36 @@ +import { ReactNode } from "react"; +import { twMerge } from "tailwind-merge"; + +interface ButtonGroupProps { + children: ReactNode; + fullWidth?: boolean; + rounded?: "none" | "small" | "medium" | "large"; + className?: string; +} + +export default function ButtonGroup( + props: ButtonGroupProps, +) { + const { + children, + fullWidth = false, + rounded = "large", + className, + } = props; + + return ( +
+ {children} +
+ ); +} diff --git a/src/components/ButtonIcon/index.tsx b/src/components/ButtonIcon/index.tsx new file mode 100644 index 0000000..b1fbd2f --- /dev/null +++ b/src/components/ButtonIcon/index.tsx @@ -0,0 +1,58 @@ +import { Icon, IconifyIcon } from "@iconify/react"; +import { ForwardRefRenderFunction, forwardRef } from "react"; +import { twMerge } from "tailwind-merge"; + +interface ButtonIconProps extends React.ButtonHTMLAttributes { + icon: string | IconifyIcon; + size?: "small" | "medium" | "large"; + variant?: "primary" | "accent" | "success" | "danger" | "warning" | "info" | "transparent"; + className?: string; +} + +const ButtonIcon: ForwardRefRenderFunction = (props, ref) => { + const { icon, size = "medium", variant = "primary", className, ...rest } = props; + let iconSize = 24; + switch (size) { + case "small": + iconSize = 16; + break; + case "medium": + iconSize = 24; + break; + case "large": + iconSize = 32; + } + + return ( + + ); +}; + +export default forwardRef(ButtonIcon); diff --git a/src/components/ClickAway/index.tsx b/src/components/ClickAway/index.tsx new file mode 100644 index 0000000..d0785ae --- /dev/null +++ b/src/components/ClickAway/index.tsx @@ -0,0 +1,38 @@ +import { ReactNode, useEffect } from "react"; +import { twMerge } from "tailwind-merge"; + +interface ClickAwayProps extends React.HTMLAttributes { + children: ReactNode; + open: boolean; + onClickAway: (e: any) => void; + className?: string; +} +export default function ClickAway(props: ClickAwayProps) { + const { children, open, onClickAway, className, ...rest } = props; + + useEffect(() => { + const body = document.querySelector("body"); + const isScrollbarRendered = document.documentElement.clientHeight < document.documentElement.scrollHeight; + const isMobile = window.matchMedia("(max-width: 768px)").matches; + if (open && isScrollbarRendered) { + body?.style.setProperty("overflow", "hidden"); + if (!isMobile) body?.style.setProperty("padding-right", "4px"); + } else { + body?.style.removeProperty("overflow"); + if (!isMobile) body?.style.removeProperty("padding-right"); + } + }, [open]); + + return ( +
+ {children} +
+ ); +} diff --git a/src/components/File/GridItem/index.tsx b/src/components/File/GridItem/index.tsx new file mode 100644 index 0000000..138a845 --- /dev/null +++ b/src/components/File/GridItem/index.tsx @@ -0,0 +1,233 @@ +import { Icon } from "@iconify/react"; +import Link from "next/link"; +import { useRouter } from "next/router"; +import { useEffect, useState } from "react"; +import { toast } from "react-toastify"; + +import ButtonIcon from "components/ButtonIcon"; +import ClickAway from "components/ClickAway"; +import Tooltip from "components/Tooltip"; + +import bytesToReadable from "utils/bytesFormat"; +import { stripExtension } from "utils/filesHelper"; +import { generatedDownloadLink } from "utils/generateDownloadLink"; +import { getPreviewIcon } from "utils/previewHelper"; +import { createDownloadToken } from "utils/tokenHelper"; + +import { IGDriveFiles } from "types/api/files"; + +interface ListItemProps { + file: IGDriveFiles; + isProtected: boolean; +} +export default function ListItem(props: ListItemProps) { + const router = useRouter(); + const [menuOpen, setMenuOpen] = useState(false); + const [menuAnchor, setMenuAnchor] = useState(); + + const [fileInfo, setFileInfo] = useState([]); + const [extensionInfo, setExtensionInfo] = useState([]); + const [filePath, setFilePath] = useState(""); + + useEffect(() => { + const currentPath = router.asPath.slice(1); + const filePath = props.file.name; + const path = [currentPath, encodeURIComponent(filePath)].join("/"); + + // If start with /, remove it + if (path.startsWith("/")) { + setFilePath(path.slice(1)); + } else { + setFilePath(path); + } + }, [router.asPath, props.file.name]); + + useEffect(() => { + const info = []; + const extInfo = []; + props.file.modifiedTime && + info.push( + new Date(props.file.modifiedTime).toLocaleDateString("default", { + year: "numeric", + month: "short", + day: "numeric", + }), + ); + props.file.size && info.push(bytesToReadable(props.file.size)); + props.file.mimeType && props.file.mimeType.includes("folder") && extInfo.push("Folder"); + props.file.fileExtension && extInfo.push(props.file.fileExtension.toUpperCase()); + setExtensionInfo(extInfo); + setFileInfo(info); + }, [props.file]); + + const handleCopyFileLink = () => { + try { + const url = `${window.location.origin}/${filePath}`; + navigator.clipboard.writeText(url); + toast.success("Download URL copied to clipboard."); + } catch (error: any) { + toast.error("Failed to copy Download URL to clipboard."); + console.error(error.message); + } finally { + setMenuOpen(false); + } + }; + const handleCopyDownloadLink = (file: IGDriveFiles, isProtected: boolean = false) => { + try { + const url = generatedDownloadLink(file, isProtected, true, isProtected ? createDownloadToken() : undefined); + navigator.clipboard.writeText(url); + toast.success("Download URL copied to clipboard."); + } catch (error: any) { + toast.error("Failed to copy Download URL to clipboard."); + console.error(error.message); + } finally { + setMenuOpen(false); + } + }; + const handleDownload = (file: IGDriveFiles, isProtected: boolean = false) => { + window.open( + generatedDownloadLink(file, isProtected, true, isProtected ? createDownloadToken() : undefined), + "_blank", + ); + setMenuOpen(false); + }; + + return ( + <> + +
+ {props.file.thumbnailLink && + (props.file.mimeType.startsWith("video") || props.file.mimeType.startsWith("image")) ? ( + {props.file.name} + ) : ( + + )} +
+ + {props.file.fileExtension ? stripExtension(props.file.name, props.file.fileExtension) : props.file.name} + {" "} +
+ {extensionInfo.join(" ・ ")} +
+
+ {fileInfo.join(" ・ ")} +
+
+
+
+ + { + e.preventDefault(); + e.stopPropagation(); + setMenuOpen(!menuOpen); + }} + /> + +
+ + + { + e.preventDefault(); + e.stopPropagation(); + setMenuOpen(false); + }} + className={`w-screen h-screen z-30 fixed top-0 left-0 transition-smooth backdrop-blur-none ${ + menuOpen ? "opacity-100 pointer-events-auto" : "opacity-0 pointer-events-none" + }`} + > +
+
+ {props.file.mimeType.includes("folder") ? ( + <> +
+ + Copy folder link +
+ + ) : ( + <> +
+ + Copy file link +
+
handleCopyDownloadLink(props.file, props.isProtected)} + > + + Copy download link +
+
+
handleDownload(props.file, props.isProtected)} + > + + Download +
+ + )} +
+
+ + + ); +} diff --git a/src/components/File/ListItem/index.tsx b/src/components/File/ListItem/index.tsx new file mode 100644 index 0000000..9c1e2f0 --- /dev/null +++ b/src/components/File/ListItem/index.tsx @@ -0,0 +1,232 @@ +import { Icon } from "@iconify/react"; +import Link from "next/link"; +import { useRouter } from "next/router"; +import { useEffect, useState } from "react"; +import { toast } from "react-toastify"; + +import ButtonIcon from "components/ButtonIcon"; +import ClickAway from "components/ClickAway"; +import Tooltip from "components/Tooltip"; + +import bytesToReadable from "utils/bytesFormat"; +import { stripExtension } from "utils/filesHelper"; +import { generatedDownloadLink } from "utils/generateDownloadLink"; +import { getPreviewIcon } from "utils/previewHelper"; +import { createDownloadToken } from "utils/tokenHelper"; + +import { IGDriveFiles } from "types/api/files"; + +interface ListItemProps { + file: IGDriveFiles; + isProtected: boolean; +} +export default function ListItem(props: ListItemProps) { + const router = useRouter(); + const [menuOpen, setMenuOpen] = useState(false); + const [menuAnchor, setMenuAnchor] = useState(); + + const [fileInfo, setFileInfo] = useState([]); + const [extensionInfo, setExtensionInfo] = useState([]); + const [filePath, setFilePath] = useState(""); + + useEffect(() => { + const currentPath = router.asPath.slice(1); + const filePath = props.file.name; + const path = [currentPath, encodeURIComponent(filePath)].join("/"); + + // If start with /, remove it + if (path.startsWith("/")) { + setFilePath(path.slice(1)); + } else { + setFilePath(path); + } + }, [router.asPath, props.file.name]); + + useEffect(() => { + const info = []; + const extInfo = []; + props.file.modifiedTime && + info.push( + new Date(props.file.modifiedTime).toLocaleDateString("default", { + year: "numeric", + month: "short", + day: "numeric", + }), + ); + props.file.size && info.push(bytesToReadable(props.file.size)); + props.file.mimeType && props.file.mimeType.includes("folder") && extInfo.push("Folder"); + props.file.fileExtension && extInfo.push(props.file.fileExtension.toUpperCase()); + setExtensionInfo(extInfo); + setFileInfo(info); + }, [props.file]); + + const handleCopyFileLink = () => { + try { + const url = `${window.location.origin}/${filePath}`; + navigator.clipboard.writeText(url); + toast.success("Download URL copied to clipboard."); + } catch (error: any) { + toast.error("Failed to copy Download URL to clipboard."); + console.error(error.message); + } finally { + setMenuOpen(false); + } + }; + const handleCopyDownloadLink = (file: IGDriveFiles, isProtected: boolean = false) => { + try { + const url = generatedDownloadLink(file, isProtected, true, isProtected ? createDownloadToken() : undefined); + navigator.clipboard.writeText(url); + toast.success("Download URL copied to clipboard."); + } catch (error: any) { + toast.error("Failed to copy Download URL to clipboard."); + console.error(error.message); + } finally { + setMenuOpen(false); + } + }; + const handleDownload = (file: IGDriveFiles, isProtected: boolean = false) => { + window.open( + generatedDownloadLink(file, isProtected, true, isProtected ? createDownloadToken() : undefined), + "_blank", + ); + setMenuOpen(false); + }; + + return ( + <> + +
+ {props.file.thumbnailLink && + (props.file.mimeType.startsWith("video") || props.file.mimeType.startsWith("image")) ? ( + {props.file.name} + ) : ( + + )} +
+ + {props.file.fileExtension ? stripExtension(props.file.name, props.file.fileExtension) : props.file.name} + {" "} +
+ {extensionInfo.join(" ・ ")} +
+
+ {fileInfo.join(" ・ ")} +
+
+
+
+ + { + e.preventDefault(); + e.stopPropagation(); + setMenuOpen(!menuOpen); + }} + /> + +
+ + + { + e.preventDefault(); + e.stopPropagation(); + setMenuOpen(false); + }} + className={`w-screen h-screen z-30 fixed top-0 left-0 transition-smooth backdrop-blur-none ${ + menuOpen ? "opacity-100 pointer-events-auto" : "opacity-0 pointer-events-none" + }`} + > +
+
+ {props.file.mimeType.includes("folder") ? ( + <> +
+ + Copy folder link +
+ + ) : ( + <> +
+ + Copy file link +
+
handleCopyDownloadLink(props.file, props.isProtected)} + > + + Copy download link +
+
+
handleDownload(props.file, props.isProtected)} + > + + Download +
+ + )} +
+
+ + + ); +} diff --git a/src/components/Layout/Explorer/Grid.tsx b/src/components/Layout/Explorer/Grid.tsx new file mode 100644 index 0000000..2747965 --- /dev/null +++ b/src/components/Layout/Explorer/Grid.tsx @@ -0,0 +1,34 @@ +import GridItem from "components/File/GridItem"; + +import { IGDriveFiles } from "types/api/files"; + +interface GridViewProps { + data: { + file: IGDriveFiles | null; + files: IGDriveFiles[]; + folders: IGDriveFiles[]; + pageToken: string | null; + }; + isProtected: boolean; +} + +export default function ViewGrid(props: GridViewProps) { + return ( +
+ {props.data.folders.map((folder) => ( + + ))} + {props.data.files.map((file) => ( + + ))} +
+ ); +} diff --git a/src/components/Layout/Explorer/List.tsx b/src/components/Layout/Explorer/List.tsx new file mode 100644 index 0000000..4d85893 --- /dev/null +++ b/src/components/Layout/Explorer/List.tsx @@ -0,0 +1,34 @@ +import ListItem from "components/File/ListItem"; + +import { IGDriveFiles } from "types/api/files"; + +interface ViewListProps { + data: { + file: IGDriveFiles | null; + files: IGDriveFiles[]; + folders: IGDriveFiles[]; + pageToken: string | null; + }; + isProtected: boolean; +} + +export default function ViewList(props: ViewListProps) { + return ( +
+ {props.data.folders.map((folder) => ( + + ))} + {props.data.files.map((file) => ( + + ))} +
+ ); +} diff --git a/src/components/Layout/Explorer/index.tsx b/src/components/Layout/Explorer/index.tsx new file mode 100644 index 0000000..1a2478f --- /dev/null +++ b/src/components/Layout/Explorer/index.tsx @@ -0,0 +1,240 @@ +import axios from "axios"; +import gIndexConfig from "config"; +import { useRouter } from "next/router"; +import { poppins } from "pages/_app"; +import { ReactNode, useCallback, useEffect, useState } from "react"; +import { twMerge } from "tailwind-merge"; + +import Breadcrumb from "components/Breadcrumb"; +import Button from "components/Button"; +import Markdown from "components/Markdown"; + +import { addNewPassword } from "utils/passwordHelper"; + +import { IGDriveFiles } from "types/api/files"; +import { APIGetFileResponse } from "types/api/response"; +import { Constant } from "types/constant"; + +import Header from "../Header"; +import PasswordLayout from "../Password"; +import ViewGrid from "./Grid"; +import ViewList from "./List"; + +const Loading = () => ( +
+
+
+ {gIndexConfig.siteConfig.siteName} +
+
+ Loading view... +
+
+); + +interface ExplorerLayoutProps { + data: { + file: IGDriveFiles | null; + files: IGDriveFiles[]; + folders: IGDriveFiles[]; + pageToken: string | null; + }; + readmeFile: string | null; + isProtected: boolean; + isFileProtected?: boolean; + encryptedId?: string; +} + +export default function ExplorerLayout(props: ExplorerLayoutProps) { + const router = useRouter(); + const [data, setData] = useState(props.data); + const [view, setView] = useState<"grid" | "list">(() => { + const viewType = localStorage.getItem(Constant.storage_ViewType); + if (!viewType) { + localStorage.setItem(Constant.storage_ViewType, "list"); + return "list"; + } + if (viewType === "grid") { + return "grid"; + } else { + return "list"; + } + }); + const [isViewLoading, setIsViewLoading] = useState(false); + const [isButtonLoading, setIsButtonLoading] = useState(false); + const [ViewComponent, setViewComponent] = useState( + , + ); + const [showPasswordLayout, setShowPasswordLayout] = useState(props.isProtected); + const [breadcrumbPaths, setBreadcrumbPaths] = useState[]>([]); + + useEffect(() => { + new Promise(async (resolve) => { + if (view === "list") { + setViewComponent( + , + ); + } else if (view === "grid") { + setViewComponent( + , + ); + } + + await new Promise((resolve) => setTimeout(resolve, 50)); + resolve(true); + }).then(() => { + setIsViewLoading(false); + }); + + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [view, data]); + useEffect(() => { + setShowPasswordLayout(props.isProtected); + }, [props.isProtected]); + + useEffect(() => { + const paths = router.asPath.split("/").filter((path) => path !== ""); + const newPaths: Record<"label" | "path", string>[] = []; + paths.forEach((path, index) => { + newPaths.push({ + label: path, + path: `/${paths.slice(0, index + 1).join("/")}`, + }); + }); + + setBreadcrumbPaths(newPaths); + }, [router]); + + const handleChangeView = useCallback( + (view: "grid" | "list") => { + setIsViewLoading(true); + setView(view); + localStorage.setItem(Constant.storage_ViewType, view); + }, + [setView], + ); + const handleLoadNextPage = useCallback( + async (e: React.MouseEvent) => { + e.preventDefault(); + setIsButtonLoading(true); + if (!data.pageToken) { + setIsButtonLoading(false); + return; + } + const newData = await axios.get("/api/getData", { + params: { + encryptedId: props.encryptedId, + pageToken: data.pageToken, + }, + }); + setData((prev) => ({ + ...prev, + files: [...prev.files, ...newData.data.data.files], + folders: [...prev.folders, ...newData.data.data.folders], + pageToken: newData.data.data.pageToken, + })); + setIsButtonLoading(false); + }, + [data, props.encryptedId], + ); + + return ( +
+ {/* Top */} +
+ +
+ + {/* Header */} + {!showPasswordLayout && ( +
+ {/* Breadcrumb */} + +
+ )} + + {/* Content */} + {showPasswordLayout ? ( + { + const cookie = + document.cookie.split(";").find((cookie) => cookie.startsWith(`${Constant.cookies_SitePassword}=`)) ?? + undefined; + addNewPassword(decodeURIComponent(router.asPath), password, cookie?.split("=")[1] ?? undefined); + router.reload(); + }} + /> + ) : ( +
+
+ {isViewLoading ? ( + + ) : ( +
+ {data.files.length || data.folders.length ? ( + <>{ViewComponent} + ) : ( +
+ Can't find any files or folders in this directory +
+ )} + + {data.pageToken && ( + + )} +
+ )} +
+ {props.readmeFile && ( +
+
+ +
+
+ )} +
+ )} +
+ ); +} diff --git a/src/components/Layout/Header/index.tsx b/src/components/Layout/Header/index.tsx new file mode 100644 index 0000000..b01ddcf --- /dev/null +++ b/src/components/Layout/Header/index.tsx @@ -0,0 +1,259 @@ +import { Icon } from "@iconify/react"; +import axios from "axios"; +import gIndexConfig from "config"; +import Link from "next/link"; +import { useEffect, useRef, useState } from "react"; + +import Button from "components/Button"; +import ButtonGroup from "components/ButtonGroup"; +import ButtonIcon from "components/ButtonIcon"; +import Modal from "components/Modal"; +import Tooltip from "components/Tooltip"; + +import bytesToReadable from "utils/bytesFormat"; +import { getPreviewIcon } from "utils/previewHelper"; + +import { IGDriveFiles } from "types/api/files"; +import { APISearchResponse } from "types/api/response"; + +interface HeaderProps { + viewSelector?: { + view: "grid" | "list"; + setView: (view: "grid" | "list") => void; + }; + showPasswordLayout?: boolean; +} + +export default function Header(props: HeaderProps) { + const inputRef = useRef(null); + const [searchModalOpen, setSearchModalOpen] = useState(false); + const [searchQuery, setSearchQuery] = useState(""); + const [debouncedSearchQuery, setDebouncedSearchQuery] = useState(""); + const [axiosCancelToken, setAxiosCancelToken] = useState | null>(null); // eslint-disable-line + const [searchLoading, setSearchLoading] = useState(false); + const [searchResults, setSearchResults] = useState<(IGDriveFiles & { redirect: string })[]>([]); + + useEffect(() => { + if (!searchQuery) { + setSearchLoading(false); + return; + } + setSearchLoading(true); + if (axiosCancelToken) { + axiosCancelToken.cancel(); + } + const timeout = setTimeout(() => { + setDebouncedSearchQuery(searchQuery); + }, 500); + + return () => clearTimeout(timeout); + + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [searchQuery]); + + useEffect(() => { + if (!searchModalOpen) { + setSearchResults([]); + setSearchQuery(""); + setSearchLoading(false); + } + }, [searchModalOpen]); + + useEffect(() => { + if (!debouncedSearchQuery) { + setSearchLoading(false); + setSearchResults([]); + return; + } + + const source = axios.CancelToken.source(); + setAxiosCancelToken(source); + + axios + .get("/api/search", { + params: { + query: debouncedSearchQuery, + }, + cancelToken: source.token, + }) + .then((res) => { + setSearchResults(res.data.files); + }) + .catch((err) => { + if (axios.isCancel(err)) { + return; + } else { + console.error(err); + throw new Error(err); + } + }) + .finally(() => { + setSearchLoading(false); + }); + + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [debouncedSearchQuery]); + + return ( + <> +
+

{gIndexConfig.siteConfig.siteName}

+ + {!props.showPasswordLayout && ( +
+ {props.viewSelector && ( + + + + + )} + + + { + setSearchModalOpen(true); + setTimeout(() => { + inputRef.current?.focus(); + }, 100); + }} + /> + +
+ )} +
+ {!props.showPasswordLayout && props.viewSelector && ( +
+ + + + +
+ )} + + setSearchModalOpen(false)} + title='Search' + > +
+ setSearchQuery(e.target.value)} + /> + + {searchLoading ? ( +
+
+ {gIndexConfig.siteConfig.siteName} +
+
+ Searching file... +
+ ) : ( +
+ {searchResults.length === 0 ? ( +
+ No results found +
+ ) : ( + <> + {searchResults.map((file) => ( + + {file.thumbnailLink && + (file.mimeType.startsWith("video") || file.mimeType.startsWith("image")) ? ( + {file.name} + ) : ( + + )} +
+ {file.name} +
+ + {[ + file.mimeType && file.mimeType.includes("folder") && "Folder", + file.fileExtension && file.fileExtension.toUpperCase(), + ] + .filter((item) => item) + .join(" ・ ")} + +
+
+ + {[ + new Date(file.modifiedTime).toLocaleDateString("default", { + year: "numeric", + month: "short", + day: "numeric", + }), + file.size ? bytesToReadable(file.size) : undefined, + ] + .filter((item) => item) + .join(" ・ ")} + +
+
+ + ))} + + )} +
+ )} +
+ + + ); +} diff --git a/src/components/Layout/Loader/index.tsx b/src/components/Layout/Loader/index.tsx new file mode 100644 index 0000000..6a71790 --- /dev/null +++ b/src/components/Layout/Loader/index.tsx @@ -0,0 +1,188 @@ +import gIndexConfig from "config"; +import { NextSeo, NextSeoProps } from "next-seo"; +import { useRouter } from "next/router"; +import { ReactNode, useEffect, useState } from "react"; + +import { + addNewPassword, + checkPathPassword, +} from "utils/passwordHelper"; + +import { Constant } from "types/constant"; + +import PasswordLayout from "../Password"; + +interface LoaderLayoutProps + extends React.HTMLAttributes { + children: ReactNode; + seo?: NextSeoProps; +} + +export default function LoaderLayout( + props: LoaderLayoutProps, +) { + const router = useRouter(); + const { children, seo, className, ...rest } = props; + const sitePassword = + process.env.NEXT_PUBLIC_SITE_PASSWORD; + + const [isLoading, setIsLoading] = useState(true); + const [isPasswordUnlocked, setIsPasswordUnlocked] = + useState( + gIndexConfig.siteConfig.privateIndex ? false : true, + ); + + const handlePrivateIndexCheck = () => { + const cookie = + document.cookie + .split(";") + .find((cookie) => + cookie.startsWith( + `${Constant.cookies_SitePassword}=`, + ), + ) ?? undefined; + if (cookie) { + const password = cookie.split("=")[1]; + if (!password) return setIsPasswordUnlocked(false); + if (!sitePassword) + throw new Error("Can't find site password"); + + const valid = checkPathPassword( + "site-wide", + password, + sitePassword as string, + ); + if (valid) return setIsPasswordUnlocked(true); + } + }; + + useEffect(() => { + setIsLoading(true); + new Promise((resolve) => + resolve(handlePrivateIndexCheck()), + ).then(() => setIsLoading(false)); + // eslint-disable-next-line react-hooks/exhaustive-deps + }, []); + + useEffect(() => { + const routeChangeStart = () => setIsLoading(true); + const routeChangeComplete = () => { + handlePrivateIndexCheck(); + setIsLoading(false); + }; + + router.events.on("routeChangeStart", routeChangeStart); + router.events.on( + "routeChangeComplete", + routeChangeComplete, + ); + router.events.on( + "routeChangeError", + routeChangeComplete, + ); + + return () => { + router.events.off( + "routeChangeStart", + routeChangeStart, + ); + router.events.off( + "routeChangeComplete", + routeChangeComplete, + ); + router.events.off( + "routeChangeError", + routeChangeComplete, + ); + }; + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [router.events]); + + return ( + <> + + {isLoading ? ( +
+
+
+ {gIndexConfig.siteConfig.siteName} +
+
+ Validating path... +
+
+ ) : ( +
+ {gIndexConfig.siteConfig.privateIndex && + !isPasswordUnlocked ? ( + { + const cookie = + document.cookie + .split(";") + .find((cookie) => + cookie.startsWith( + `${Constant.cookies_SitePassword}=`, + ), + ) ?? undefined; + addNewPassword( + "site-wide", + password, + cookie?.split("=")[1] ?? undefined, + ); + setIsLoading(true); + const validPassword = () => { + const cookie = + document.cookie + .split(";") + .find((cookie) => + cookie.startsWith( + `${Constant.cookies_SitePassword}=`, + ), + ) ?? undefined; + if (cookie) { + const password = cookie.split("=")[1]; + if (!password) return false; + if (!sitePassword) + throw new Error( + "Can't find site password", + ); + + const valid = checkPathPassword( + "site-wide", + password, + sitePassword as string, + ); + return valid; + } + }; + new Promise((resolve) => + resolve(validPassword()), + ) + .then((data) => { + if (data) { + setIsPasswordUnlocked(true); + } else { + setIsPasswordUnlocked(false); + } + }) + .finally(() => setIsLoading(false)); + }} + /> + ) : ( + <>{children} + )} +
+ )} + + ); +} diff --git a/src/components/Layout/Password/index.tsx b/src/components/Layout/Password/index.tsx new file mode 100644 index 0000000..67bfa4e --- /dev/null +++ b/src/components/Layout/Password/index.tsx @@ -0,0 +1,88 @@ +import { Icon } from "@iconify/react"; +import { useRouter } from "next/router"; +import { useState } from "react"; + +import Button from "components/Button"; +import ButtonIcon from "components/ButtonIcon"; + +interface PasswordLayoutProps { + onSubmitted: (password: string) => void; + path: string; +} +export default function PasswordLayout( + props: PasswordLayoutProps, +) { + const router = useRouter(); + const [showPassword, setShowPassword] = + useState(false); + const [password, setPassword] = useState(""); + const [pending, setPending] = useState(false); + + return ( +
+
+ You don't have access +
+ +
+ + The folder / file you are trying to access is + protected with a password. + +
+          {props.path}
+        
+ Please enter the password to continue: +
+
{ + e.preventDefault(); + props.onSubmitted(password); + setPending(true); + }} + className='w-full max-w-lg flex items-center border border-primary-500 rounded-lg' + > +
+ setPassword(e.target.value)} + /> + setShowPassword(!showPassword)} + /> +
+ +
+
+ ); +} diff --git a/src/components/Layout/Preview/index.tsx b/src/components/Layout/Preview/index.tsx new file mode 100644 index 0000000..51cbfae --- /dev/null +++ b/src/components/Layout/Preview/index.tsx @@ -0,0 +1,319 @@ +import { Icon } from "@iconify/react"; +import gIndexConfig from "config"; +import Link from "next/link"; +import { useRouter } from "next/router"; +import { poppins } from "pages/_app"; +import { ReactNode, useEffect, useMemo, useState } from "react"; +import { toast } from "react-toastify"; +import { twMerge } from "tailwind-merge"; + +import Breadcrumb from "components/Breadcrumb"; +import Button from "components/Button"; + +import bytesToReadable from "utils/bytesFormat"; +import { durationToReadable } from "utils/durationFormat"; +import { decryptData } from "utils/encryptionHelper/hash"; +import { generatedDownloadLink } from "utils/generateDownloadLink"; +import { addNewPassword } from "utils/passwordHelper"; +import { getPreviewComponent } from "utils/previewHelper"; +import { createDownloadToken } from "utils/tokenHelper"; + +import { IGDriveFiles } from "types/api/files"; +import { Constant } from "types/constant"; + +import PasswordLayout from "../Password"; + +const Loading = () => ( +
+
+
+ {gIndexConfig.siteConfig.siteName} +
+
+ Loading view... +
+
+); + +interface PreviewLayoutProps { + data: { + file: IGDriveFiles | null; + files: IGDriveFiles[]; + folders: IGDriveFiles[]; + pageToken: string | null; + }; + isProtected: boolean; + isFileProtected: boolean; + encryptedId?: string; +} + +export default function PreviewLayout(props: PreviewLayoutProps) { + const router = useRouter(); + const [data, setData] = useState(props.data); + const [isViewLoading, setIsViewLoading] = useState(false); + const [PreviewComponent, setPreviewComponent] = useState(); + const [showPasswordLayout, setShowPasswordLayout] = useState(props.isProtected); + const [breadcrumbPaths, setBreadcrumbPaths] = useState[]>([]); + const [downloadToken] = useState(() => { + if (gIndexConfig.apiConfig.allowDownloadProtectedFile) return null; + + if (props.isFileProtected) { + return createDownloadToken(); + } else { + return null; + } + }); + const [expiredIn, setExpiredIn] = useState(""); + + const fileMetadata = useMemo< + { + key: string; + label: string; + value: string | number | null; + }[] + >(() => { + const metadata = []; + if (data.file) { + if (data.file.name) + metadata.push({ + key: "name", + label: "Name", + value: data.file.name, + }); + if (data.file.mimeType) + metadata.push({ + key: "mimeType", + label: "Type", + value: data.file.mimeType, + }); + if (data.file.modifiedTime) + metadata.push({ + key: "modifiedTime", + label: "Last Modified", + value: new Date(data.file.modifiedTime).toLocaleDateString("default", { + year: "numeric", + month: "short", + day: "numeric", + }), + }); + if (data.file.size) + metadata.push({ + key: "size", + label: "Size", + value: bytesToReadable(data.file.size), + }); + if (data.file.imageMediaMetadata && data.file.imageMediaMetadata.width && data.file.imageMediaMetadata.height) + metadata.push({ + key: "imageMediaMetadata", + label: "Dimension", + value: `${data.file.imageMediaMetadata.width}x${data.file.imageMediaMetadata.height}`, + }); + if (data.file.videoMediaMetadata) + metadata.push( + { + key: "videoMediaMetadata", + label: "Dimension", + value: `${data.file.videoMediaMetadata.width}x${data.file.videoMediaMetadata.height}`, + }, + { + key: "videoMediaMetadata", + label: "Duration", + value: durationToReadable(data.file.videoMediaMetadata.durationMillis), + }, + ); + } + + return metadata; + }, [data.file]); + + useEffect(() => { + if (!downloadToken) return; + const interval = setInterval(() => { + const expiredAt = Number(decryptData(downloadToken)); + const date = new Date(expiredAt); + const now = new Date(); + const diff = date.getTime() - now.getTime(); + + const hours = Math.floor(diff / 1000 / 60 / 60); + const minutes = Math.floor(diff / 1000 / 60) % 60; + const seconds = Math.floor(diff / 1000) % 60; + + setExpiredIn(`${hours}:${minutes}:${seconds}`); + }, 1000); + + return () => clearInterval(interval); + }, [downloadToken]); + + useEffect(() => { + new Promise(async (resolve) => { + const Preview = getPreviewComponent(props.data.file?.fileExtension ?? "unknown", props.data.file?.mimeType ?? ""); + setPreviewComponent(); + + await new Promise((resolve) => setTimeout(resolve, 50)); + resolve(true); + }).then(() => { + setIsViewLoading(false); + }); + + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [data]); + useEffect(() => { + setShowPasswordLayout(props.isProtected); + }, [props.isProtected]); + + useEffect(() => { + const paths = router.asPath.split("/").filter((path) => path !== ""); + const newPaths: Record<"label" | "path", string>[] = []; + paths.forEach((path, index) => { + newPaths.push({ + label: path, + path: `/${paths.slice(0, index + 1).join("/")}`, + }); + }); + + setBreadcrumbPaths(newPaths); + }, [router]); + + return ( +
+ {/* Top */} +
+

{gIndexConfig.siteConfig.siteName}

+ + {!showPasswordLayout && ( +
+ {/* Disable until figure out how to search from root */} + {/* + + */} +
+ )} +
+ +
+ + {/* Header */} + {!showPasswordLayout && ( +
+ {/* Breadcrumb */} + +
+ )} + + {/* Content */} + {showPasswordLayout ? ( + { + const cookie = + document.cookie.split(";").find((cookie) => cookie.startsWith(`${Constant.cookies_SitePassword}=`)) ?? + undefined; + addNewPassword(decodeURIComponent(router.asPath), password, cookie?.split("=")[1] ?? undefined); + router.reload(); + }} + /> + ) : ( +
+
+ {isViewLoading ? ( + + ) : ( +
+
+ {PreviewComponent} +
+
+ )} +
+
+
+
+
+ +

File info

+
+ +
+ +
+ {fileMetadata.map((item) => ( +
+ {item.label} +

{item.value ?? "-"}

+
+ ))} +
+
+ +
+ + + + +
+
+ {generatedDownloadLink(data.file!, props.isFileProtected, true, downloadToken)} +
+
+ {!gIndexConfig.apiConfig.allowDownloadProtectedFile && props.isFileProtected && ( + + This file is inside protected folder. +
+ Download link will be expired in {expiredIn}. +
+ )} +
+
+
+
+ )} +
+ ); +} diff --git a/src/components/Markdown/index.tsx b/src/components/Markdown/index.tsx new file mode 100644 index 0000000..ff7ccd4 --- /dev/null +++ b/src/components/Markdown/index.tsx @@ -0,0 +1,113 @@ +import { jetbrainsMono } from "pages/_app"; +import { useRef, useState } from "react"; +import ReactMarkdown from "react-markdown"; +import { toast } from "react-toastify"; +import rehypeKatex from "rehype-katex"; +import rehypePrism from "rehype-prism-plus"; +import rehypeRaw from "rehype-raw"; +import remarkGfm from "remark-gfm"; +import remarkMath from "remark-math"; +import remarkSlug from "remark-slug"; +import remarkToc from "remark-toc"; + +import Button from "components/Button"; + +import "styles/highlight.css"; +import "styles/markdown.css"; + +interface PreProps extends React.HTMLAttributes {} +function PreComponent(props: PreProps) { + const codeRef = useRef(null); + const [showCopy, setShowCopy] = useState(false); + const [isCopied, setIsCopied] = useState(false); + const [isError, setIsError] = useState(false); + const [copyTimeout, setCopyTimeout] = useState(); + + const handleCopy = () => { + if (!codeRef.current) return; + if (copyTimeout) clearTimeout(copyTimeout); + try { + navigator.clipboard.writeText(codeRef.current.textContent as string); + setIsError(false); + setIsCopied(true); + setCopyTimeout( + setTimeout(() => { + setIsCopied(false); + }, 2000), + ); + toast.success("Code copied to clipboard"); + } catch (error: any) { + setIsCopied(false); + setIsError(true); + setCopyTimeout( + setTimeout(() => { + setIsError(false); + }, 2000), + ); + toast.error("Failed to copy code to clipboard"); + } + }; + + return ( +
{ + setShowCopy(true); + }} + onMouseLeave={() => { + setShowCopy(false); + setIsCopied(false); + setIsError(false); + }} + > +
+ +
+
+        {props.children}
+      
+
+ ); +} + +interface MarkdownProps { + content: string; +} +export default function Markdown(props: MarkdownProps) { + return ( +
+ ( + + {children} + + ), + }} + > + {props.content} + +
+ ); +} diff --git a/src/components/Modal/index.tsx b/src/components/Modal/index.tsx new file mode 100644 index 0000000..bc519ff --- /dev/null +++ b/src/components/Modal/index.tsx @@ -0,0 +1,124 @@ +import { ReactNode, useEffect, useState } from "react"; + +import ButtonIcon from "components/ButtonIcon"; +import ClickAway from "components/ClickAway"; + +interface ModalProps { + children: ReactNode; + open: boolean; + onClose: () => void; + title: string; + footer?: ReactNode; + keepMounted?: boolean; +} + +export default function Modal(props: ModalProps) { + let DELAY = 10; + + const [showModal, setShowModal] = useState(props.open); + const [keepMounted, setKeepMounted] = useState(false); + const [shouldRender, setShouldRender] = useState(false); + + const [shouldUnmount, setShouldUnmount] = useState(true); + + useEffect(() => { + const handleClose = (e: KeyboardEvent) => { + if (e.key === "Escape") { + props.onClose(); + } + }; + window.addEventListener("keydown", handleClose); + return () => { + window.removeEventListener("keydown", handleClose); + }; + }, [props]); + + useEffect(() => { + let timeoutId: NodeJS.Timeout; + if (showModal && !shouldRender) { + timeoutId = setTimeout(() => { + setShouldRender(true); + }, DELAY); + } else if (!showModal && shouldRender) { + timeoutId = setTimeout(() => { + setShouldRender(false); + }, DELAY); + } + + return () => { + clearTimeout(timeoutId); + }; + }, [showModal, shouldRender, DELAY]); + + useEffect(() => { + setShowModal(props.open); + if (props.open) setShouldUnmount(false); + }, [props.open]); + + useEffect(() => { + if (showModal && props.keepMounted) setKeepMounted(true); + }, [showModal, props.keepMounted]); + + const handleClose = () => { + setShowModal(false); + if (!keepMounted) setKeepMounted(false); + props.onClose(); + }; + + // useEffect(() => { + // if (!showModal && !keepMounted && shouldRender) { + // const timeout = setTimeout(() => { + // setShouldUnmount(true); + // }, 250); + // return () => { + // clearTimeout(timeout); + // }; + // } else { + // setShouldUnmount(false); + // } + // }, [showModal, keepMounted, shouldRender, DELAY]); + if (shouldUnmount) return null; + + return ( + { + if (!showModal && !keepMounted) { + setShouldUnmount(true); + } else { + setShouldUnmount(false); + } + }} + > +
{ + e.stopPropagation(); + }} + > +
+ {/* Header */} +
+ {props.title} + +
+ +
+ + {/* Body */} +
{props.children}
+ + {/* Footer */} + {props.footer &&
{props.footer}
} +
+
+ + ); +} diff --git a/src/components/Preview/Audio.tsx b/src/components/Preview/Audio.tsx new file mode 100644 index 0000000..7aa1d46 --- /dev/null +++ b/src/components/Preview/Audio.tsx @@ -0,0 +1,31 @@ +import { useState } from "react"; +import AudioPlayer from "react-h5-audio-player"; +import "react-h5-audio-player/lib/styles.css"; + +import { generatedDownloadLink } from "utils/generateDownloadLink"; + +import { PreviewProps } from "types/api/files"; + +import ErrorPreview from "./Error"; + +export default function AudioPreview(props: PreviewProps) { + const [isError, setIsError] = useState(false); + + return ( +
+ {isError ? ( + + ) : ( + setIsError(true)} + /> + )} +
+ ); +} diff --git a/src/components/Preview/Code.tsx b/src/components/Preview/Code.tsx new file mode 100644 index 0000000..20e3e5d --- /dev/null +++ b/src/components/Preview/Code.tsx @@ -0,0 +1,55 @@ +import axios from "axios"; +import gIndexConfig from "config"; +import { useEffect, useState } from "react"; + +import Markdown from "components/Markdown"; + +import { generatedDownloadLink } from "utils/generateDownloadLink"; + +import { PreviewProps } from "types/api/files"; + +import ErrorPreview from "./Error"; + +export default function CodePreview(props: PreviewProps) { + const [isLoading, setIsLoading] = useState(true); + const [isError, setIsError] = useState(false); + const [content, setContent] = useState(""); + + useEffect(() => { + axios + .get(generatedDownloadLink(props.file, false)) + .then((res) => { + const isObject = typeof res.data === "object"; + setContent( + `\`\`\`${props.file.fileExtension}\n${isObject ? JSON.stringify(res.data, null, 2) : res.data}\`\`\``, + ); + setIsLoading(false); + }) + .catch((err) => { + console.error(err); + setIsError(true); + }); + }, [props.file, props.file.fileExtension]); + + return ( +
+ {isLoading ? ( +
+
+
+ {gIndexConfig.siteConfig.siteName} +
+
+ Loading content... +
+
+ ) : ( + <>{isError ? : } + )} +
+ ); +} diff --git a/src/components/Preview/Document.tsx b/src/components/Preview/Document.tsx new file mode 100644 index 0000000..5345074 --- /dev/null +++ b/src/components/Preview/Document.tsx @@ -0,0 +1,59 @@ +import DocViewer, { DocViewerRenderers } from "@cyntler/react-doc-viewer"; +import gIndexConfig from "config"; + +import { generatedDownloadLink } from "utils/generateDownloadLink"; + +import { PreviewProps } from "types/api/files"; + +import ErrorPreview from "./Error"; + +function LoadingRender() { + return ( +
+
+
+ {gIndexConfig.siteConfig.siteName} +
+
+ Loading content... +
+
+ ); +} +function ErrorRender() { + return ; +} + +export default function DocumentPreview(props: PreviewProps) { + return ( +
+ +
+ ); +} diff --git a/src/components/Preview/Error.tsx b/src/components/Preview/Error.tsx new file mode 100644 index 0000000..5bd6203 --- /dev/null +++ b/src/components/Preview/Error.tsx @@ -0,0 +1,24 @@ +interface ErrorPreviewProps { + error?: string; +} +export default function ErrorPreview(props: ErrorPreviewProps) { + return ( +
+

Failed to load file preview

+ + Error has been occured while loading preview, it may be caused by{" "} + invalid file type or{" "} + network error. +
+ You can try again later or download the file to view. +
+ + {props.error && ( + <> + Error details + {props.error} + + )} +
+ ); +} diff --git a/src/components/Preview/Image.tsx b/src/components/Preview/Image.tsx new file mode 100644 index 0000000..e7abfc4 --- /dev/null +++ b/src/components/Preview/Image.tsx @@ -0,0 +1,82 @@ +import gIndexConfig from "config"; +import { useEffect, useState } from "react"; + +import { generatedDownloadLink } from "utils/generateDownloadLink"; + +import { PreviewProps } from "types/api/files"; + +import ErrorPreview from "./Error"; + +export default function ImagePreview(props: PreviewProps) { + const [imgSrc, setImgSrc] = useState(""); + const [isLoading, setIsLoading] = useState(true); + const [isError, setIsError] = useState(false); + const [errorMessage, setErrorMessage] = useState(""); + + useEffect(() => { + setIsError(false); + setIsLoading(true); + + const timeout = setTimeout(() => { + setIsError(true); + setErrorMessage("Image took too long to load"); + return; + }, 15000); + + fetch(generatedDownloadLink(props.file, false)) + .then((res) => { + if (!res.ok) throw new Error(res.statusText); + return res.blob(); + }) + .then((blob) => { + const reader = new FileReader(); + reader.onload = () => { + setImgSrc(reader.result as string); + }; + reader.readAsDataURL(blob); + }) + .catch((err) => { + console.error(err); + setIsError(true); + setErrorMessage(err.message); + }) + .finally(() => { + setIsLoading(false); + clearTimeout(timeout); + }); + + return () => clearTimeout(timeout); + }, [props.file]); + + return ( + <> + {isLoading ? ( +
+
+
+ {gIndexConfig.siteConfig.siteName} +
+
+ Loading image... +
+
+ ) : ( + <> + {isError ? ( + + ) : ( + {props.file.name} + )} + + )} + + ); +} diff --git a/src/components/Preview/Manga.tsx b/src/components/Preview/Manga.tsx new file mode 100644 index 0000000..f5827a1 --- /dev/null +++ b/src/components/Preview/Manga.tsx @@ -0,0 +1,122 @@ +import axios from "axios"; +import gIndexConfig from "config"; +import JSZip from "jszip"; +import { useCallback, useEffect, useState } from "react"; + +import ButtonIcon from "components/ButtonIcon"; + +import { generatedDownloadLink } from "utils/generateDownloadLink"; + +import { PreviewProps } from "types/api/files"; + +import ErrorPreview from "./Error"; + +export default function MangaPreview(props: PreviewProps) { + const [maxPageIndex, setMaxPageIndex] = useState(4); + const [isLoading, setIsLoading] = useState(true); + const [isError, setIsError] = useState(false); + const [viewPageIndex, setViewPageIndex] = useState(0); + const [images, setImages] = useState([]); + const [viewSize, setViewSize] = useState<"fit" | "full">("fit"); + + useEffect(() => { + const mangaImages: string[] = []; + axios + .get(generatedDownloadLink(props.file, false, false, null, true), { + responseType: "blob", + }) + .then(async (res) => { + const zipData = await JSZip.loadAsync(res.data); + for (let i = 0; i <= maxPageIndex; i++) { + const file = zipData.file(Object.keys(zipData.files)[i]); + if (file) { + const blob = await file.async("blob"); + const reader = new FileReader(); + reader.onload = () => { + mangaImages.push(reader.result as string); + }; + reader.readAsDataURL(blob); + } + } + setImages(mangaImages); + }) + .catch((err) => { + console.error(err); + setIsError(true); + }) + .finally(() => { + setIsLoading(false); + }); + }, [props.file, maxPageIndex]); + + const handleCurrentView = useCallback( + (pageNumber: number) => { + if (pageNumber < 0 || pageNumber > maxPageIndex) return; + setViewPageIndex(pageNumber); + }, + [maxPageIndex], + ); + + return ( +
+
+ Preview only shows the first 5 pages. Please download the file to view the rest. +
+ {isLoading ? ( +
+
+
+ {gIndexConfig.siteConfig.siteName} +
+
+ Loading content... +
+
+ ) : ( + <> + {isError ? ( + + ) : ( +
+
+ {`${props.file.name} + setViewSize(viewSize === "fit" ? "full" : "fit")} + /> +
+
+ handleCurrentView(viewPageIndex - 1)} + disabled={viewPageIndex === 0} + /> + + {viewPageIndex + 1} / {maxPageIndex + 1} + + handleCurrentView(viewPageIndex + 1)} + disabled={viewPageIndex === maxPageIndex} + /> +
+
+ )} + + )} +
+ ); +} diff --git a/src/components/Preview/Rich.tsx b/src/components/Preview/Rich.tsx new file mode 100644 index 0000000..e6f4ccb --- /dev/null +++ b/src/components/Preview/Rich.tsx @@ -0,0 +1,52 @@ +import axios from "axios"; +import gIndexConfig from "config"; +import { useEffect, useState } from "react"; + +import Markdown from "components/Markdown"; + +import { generatedDownloadLink } from "utils/generateDownloadLink"; + +import { PreviewProps } from "types/api/files"; + +import ErrorPreview from "./Error"; + +export default function RichPreview(props: PreviewProps) { + const [isLoading, setIsLoading] = useState(true); + const [isError, setIsError] = useState(false); + const [content, setContent] = useState(""); + + useEffect(() => { + axios + .get(generatedDownloadLink(props.file)) + .then((res) => { + setContent(res.data); + setIsLoading(false); + }) + .catch((err) => { + console.error(err); + setIsError(true); + }); + }, [props.file]); + + return ( +
+ {isLoading ? ( +
+
+
+ {gIndexConfig.siteConfig.siteName} +
+
+ Loading content... +
+
+ ) : ( + <>{isError ? : } + )} +
+ ); +} diff --git a/src/components/Preview/Unknown.tsx b/src/components/Preview/Unknown.tsx new file mode 100644 index 0000000..2878d84 --- /dev/null +++ b/src/components/Preview/Unknown.tsx @@ -0,0 +1,12 @@ +export default function UnknownPreview() { + return ( +
+

File preview not available

+ + This file type is not supported for preview. +
+ You can download the file to view. +
+
+ ); +} diff --git a/src/components/Preview/Video.tsx b/src/components/Preview/Video.tsx new file mode 100644 index 0000000..a854ccc --- /dev/null +++ b/src/components/Preview/Video.tsx @@ -0,0 +1,36 @@ +import { useState } from "react"; +import ReactPlayer from "react-player"; + +import { generatedDownloadLink } from "utils/generateDownloadLink"; + +import { PreviewProps } from "types/api/files"; + +import ErrorPreview from "./Error"; + +export default function VideoPreview(props: PreviewProps) { + const [isError, setIsError] = useState(false); + + return ( +
+ {isError ? ( + + ) : ( + ( +
{children}
+ )} + style={{ + width: "100%", + height: "100%", + maxHeight: "60vh", + }} + onError={() => setIsError(true)} + /> + )} +
+ ); +} diff --git a/src/components/Tooltip/index.tsx b/src/components/Tooltip/index.tsx new file mode 100644 index 0000000..b285931 --- /dev/null +++ b/src/components/Tooltip/index.tsx @@ -0,0 +1,99 @@ +import { ReactNode, useEffect, useRef, useState } from "react"; +import { Popper, PopperProps } from "react-popper"; + +interface TooltipProps { + children: ReactNode; + content: ReactNode; + placement?: PopperProps["placement"]; + delay?: number; +} +export default function Tooltip(props: TooltipProps) { + const [refElement, setRefElement] = useState(null); + const [showTooltip, setShowTooltip] = useState(false); + const timeoutRef = useRef(null); + + useEffect(() => { + function handleMouseEnter() { + if (props.delay) { + timeoutRef.current = window.setTimeout(() => { + setShowTooltip(true); + }, props.delay); + } else { + setShowTooltip(true); + } + } + + function handleMouseLeave() { + if (props.delay) { + window.clearTimeout(timeoutRef.current ?? undefined); + } + setShowTooltip(false); + } + + function handleScroll() { + setShowTooltip(false); + } + + if (refElement) { + refElement.addEventListener("mouseenter", handleMouseEnter); + refElement.addEventListener("mouseleave", handleMouseLeave); + refElement.addEventListener("click", handleMouseLeave); + window.addEventListener("scroll", handleScroll); + } + + return () => { + if (refElement) { + refElement.removeEventListener("mouseenter", handleMouseEnter); + refElement.removeEventListener("mouseleave", handleMouseLeave); + refElement.removeEventListener("click", handleMouseLeave); + window.removeEventListener("scroll", handleScroll); + } + }; + }, [refElement, props.delay]); + + return ( + <> +
{props.children}
+ { + const { height, width, x, y } = state.rects.reference; + const { innerHeight, innerWidth } = window; + state.styles.popper = { + ...state.styles.popper, + visibility: height + y > innerHeight || width + x > innerWidth ? "hidden" : "visible", + }; + }, + }, + ]} + referenceElement={refElement as HTMLElement} + strategy='absolute' + > + {({ ref, style, placement }) => ( +
+ {props.content} +
+ )} +
+ + ); +} diff --git a/src/config/api.config.js b/src/config/api.config.js deleted file mode 100644 index 4f129bf..0000000 --- a/src/config/api.config.js +++ /dev/null @@ -1,74 +0,0 @@ -module.exports = { - // Client ID are safe to expose - client_id: - "126409166174-l0f9hdblsrmhkt9jeue9m8o93skfs1sr.apps.googleusercontent.com", - - /** - * Change this value to match your platform. - */ - basePath: - process.env.NODE_ENV === "production" - ? `https://${process.env.NEXT_PUBLIC_VERCEL_URL}` - : "http://localhost:5000", - - /** - * Hashed key used for getting protected file for metadata - */ - masterKey: - "640e3e38dd31aec254f214ba38541a82ddb615e73ce9c6129f33ef549b154ab9", - - files: { - query: ["trashed = false"], - field: - "id, name, mimeType, thumbnailLink, fileExtension, modifiedTime, size, imageMediaMetadata, videoMediaMetadata, webContentLink, iconLink, trashed", - orderBy: "folder, name asc, modifiedTime desc", - /** - * Special file names that will be used for certain purposes - * These files will be ignored when searching for files - * and will be hidden from the file list - */ - specialFile: { - password: ".password", - readme: ".readme.md", - /** - * Banner are used for generating custom open graph image for folder - * By default, all folder will use the og.png inside public folder - */ - banner: ".banner", - }, - hiddenFiles: [".password", ".readme.md", ".banner"], - itemsPerPage: 50, - searchResult: 10, - /** - * Starting point of the drive - * U̶s̶e̶ ̶'̶r̶o̶o̶t̶'̶ ̶t̶o̶ ̶u̶s̶e̶ ̶M̶y̶ ̶D̶r̶i̶v̶e̶ ̶a̶s̶ ̶s̶t̶a̶r̶t̶i̶n̶g̶ ̶p̶o̶i̶n̶t̶ - * O̶r̶ ̶u̶s̶e̶ ̶f̶o̶l̶d̶e̶r̶ ̶i̶d̶ ̶t̶o̶ ̶u̶s̶e̶ ̶a̶ ̶s̶p̶e̶c̶i̶f̶i̶c̶ ̶f̶o̶l̶d̶e̶r̶ ̶a̶s̶ ̶s̶t̶a̶r̶t̶i̶n̶g̶ ̶p̶o̶i̶n̶t̶ - * Since service account can't access 'root' folder, we need to use folder id - * Why using service account? Since refresh token always expired, I need to use service account to make sure the app always work - */ - rootFolder: "1KgPV6QB1GYT8fmn2uTfbtr9rDXqcRR0j", - download: { - /** - * Allow user to download protected file without password - * If this set to false, the download link will have temporary token to download the files - * If this set to true, the download link will be permanent - * Default: false - */ - allowProtectedFile: false, - temporaryTokenDuration: 60 * 60, // 1 hour - /** - * If you're using Vercel, the max response size is 4.5MB - * https://vercel.com/docs/platform/limits#serverless-function-payload-size-limit - * If you're using another platform that has different limit, - * change this value to match your platform. - * Set to 0 to disable limit - */ - maxFileSize: 4 * 1024 * 1024, - }, - }, - - /** - * https://web.dev/uses-long-cache-ttl/ - */ - cacheControl: "s-maxage=60, stale-while-revalidate", -}; diff --git a/src/config/gIndex.config.ts b/src/config/gIndex.config.ts new file mode 100644 index 0000000..06fe9d1 --- /dev/null +++ b/src/config/gIndex.config.ts @@ -0,0 +1,203 @@ +import colors from "tailwindcss/colors"; + +const config: gIndexConfig = { + version: "1.0.0", + /** + * Base path of the app, used for generating links + * If you're not using Vercel, you need to change this to your domain name + * + * 2023/09/10: This is not used anymore, edit via env variable instead + * + * @default process.env.NEXT_PUBLIC_VERCEL_URL + */ + basePath: + process.env.NODE_ENV === "development" ? "http://localhost:3000" : `https://${process.env.NEXT_PUBLIC_VERCEL_URL}`, + + /** + * Hashed key for fetching protected files / folders from the server + * This key will bypass the file / folder password + * + * 2023/09/10: This is not used anymore + */ + masterKey: "masterkey", + + /** + * How long the cache will be stored in the browser + * Used for all pages and api routes + * Default is 5 minutes (300/60 = 5min) + * + * @default "max-age=300, s-maxage=300, stale-while-revalidate, public" + */ + cacheControl: "max-age=300, s-maxage=300, stale-while-revalidate, public", + + apiConfig: { + /** + * Starting point of the drive. + * Will be used for '/' route. + * + * Since service account can't access 'root' folder + * You need to create a new folder and share it with the service account + * Then, copy the folder id and paste it here + */ + rootFolder: "1KgPV6QB1GYT8fmn2uTfbtr9rDXqcRR0j", + + defaultQuery: ["trashed = false", "(not mimeType contains 'google-apps' or mimeType contains 'folder')"], + defaultField: + "id, name, mimeType, thumbnailLink, fileExtension, modifiedTime, size, imageMediaMetadata, videoMediaMetadata, webContentLink, trashed", + defaultOrder: "folder, name asc, modifiedTime desc", + itemsPerPage: 50, + searchResult: 5, + + /** + * Special file name that will be used for certain purposes + * These files will be ignored when searching for files + * and will be hidden from the files list by default + */ + specialFile: { + password: ".password", + readme: ".readme.md", + /** + * Banner will be used for opengraph image for folder + * By default, all folder will use default og image + */ + banner: ".banner", + }, + hiddenFiles: [".password", ".readme.md", ".banner"], + + /** + * Allow user to download protected file without password. + * If this set to false, download link will have temporary token attached to it + * If this set to true, user can download the file without password as long as they have the link + * + * Default: false + */ + allowDownloadProtectedFile: false, + /** + * Duration in hours. + * + * Default: 6 hours + */ + temporaryTokenDuration: 6, + + /** + * Maximum file size that can be downloaded via api routes + * If it's larger than this, it will be redirected to the file url + * + * If you're using Vercel, they have a limit of ~4 - ~4.5MB response size + * ref: https://vercel.com/docs/platform/limits#serverless-function-payload-size-limit + * If you're using another platform, you can match the limit with your platform + * Or you can set this to 0 to disable the limit + * + * Default: 4MB + */ + maxFileSize: 4 * 1024 * 1024, + }, + + siteConfig: { + /** + * This value will be used for metadata + */ + siteName: "next-gdrive-index", + siteDescription: "A simple file browser for Google Drive", + siteIcon: "/flaticon.svg", + favIcon: "/favicon.svg", + twitterHandle: "@mbaharip_", + + /** + * Tailwind color name. + * Ref: https://tailwindcss.com/docs/customizing-colors + */ + defaultAccentColor: "teal", + + /** + * Site wide password protection + * If this is set, all files and folders will be protected by this password + * + * The site password are set from Environment Variable (NEXT_GDRIVE_INDEX_PASSWORD) + * It's because I don't want to store sensitive data in the code + */ + privateIndex: false, + + /** + * Example item: + * { + * icon: string, // icon name from iconify (https://icon-sets.iconify.design/) + * name: string, + * href: string, + * external?: boolean + * } + */ + navbarItems: [ + { + icon: "ion:document-text", + name: "Documentation", + href: "https://github.com/mbahArip/next-gdrive-index/wiki", + external: true, + }, + { + icon: "ion:logo-github", + name: "Github", + href: "https://www.github.com/mbaharip", + external: true, + }, + { + icon: "ion:logo-paypal", + name: "Buy me a coffee", + href: "https://www.paypal.me/mbaharip", + external: true, + }, + { + icon: "ion:mail", + name: "Contact", + href: "mailto:support@mbaharip.com", + }, + ], + }, +}; + +export default config; + +interface gIndexConfig { + version: string; + basePath: string; + masterKey: string; + cacheControl: string; + + apiConfig: { + rootFolder: string; + defaultQuery: string[]; + defaultField: string; + defaultOrder: string; + itemsPerPage: number; + searchResult: number; + + specialFile: { + password: string; + readme: string; + banner: string; + }; + hiddenFiles: string[]; + + allowDownloadProtectedFile: boolean; + temporaryTokenDuration: number; + maxFileSize: number; + }; + siteConfig: { + siteName: string; + siteDescription: string; + siteIcon: string; + favIcon: string; + twitterHandle: string; + + defaultAccentColor: keyof typeof colors; + + privateIndex: boolean; + + navbarItems: { + icon: string; + name: string; + href: string; + external?: boolean; + }[]; + }; +} diff --git a/src/config/site.config.js b/src/config/site.config.js deleted file mode 100644 index 0233ca3..0000000 --- a/src/config/site.config.js +++ /dev/null @@ -1,82 +0,0 @@ -import { - BsEnvelopeAt, - BsGithub, - BsPaypal, -} from "react-icons/bs"; - -const config = { - /* Site MetaData */ - siteName: "mbahArip Stash", - siteDescription: - "Personal Stash of mbahArip, a place to store my files.", - - /* General */ - /** - * Site wide password protection - */ - privateIndex: false, - indexPassword: - "640e3e38dd31aec254f214ba38541a82ddb615e73ce9c6129f33ef549b154ab9", - - navbar: { - /** - * Title beside the logo - * If not set, will be using `siteName` instead - */ - title: "", - links: [ - { - icon: BsGithub, - name: "GitHub", - href: "https://www.github.com/mbaharip", - newTab: true, - }, - { - icon: BsPaypal, - name: "Donate", - href: "https://www.paypal.me/mbaharip", - newTab: true, - }, - { - icon: BsEnvelopeAt, - name: "Email", - href: "mailto:support@mbaharip.com", - }, - { - name: "Main Website", - href: "https://www.mbaharip.com", - newTab: true, - }, - ], - }, - files: { - /** - * Limit breadcrumb to specific depth - * 0 = Unlimited - * 1 = Only show current file - * 2 = Show current file and its parent - * 3 = Show current file, its parent and grandparent - * and so on. - * Default: 2 - */ - breadcrumbDepth: 2, - breadcrumbLimiter: "/", - /** - * Limit thumbnail to specific file group - * Refer to typeGroup on /src/utils/fileHelper/fileGroup.ts:1 - * Will use google drive thumbnailLink - * If thumbnailLink not available, will use Icon instead - */ - allowThumbnailFileType: ["image", "video", "pdf"], - }, - footer: { - /** - * Footer text will be rendered as - * {year} {footerText} - next-gdrive-index ❤️ - */ - text: "mbahArip Stash", - renderYear: true, - }, -}; - -export default config; diff --git a/src/middleware.ts b/src/middleware.ts new file mode 100644 index 0000000..ba55683 --- /dev/null +++ b/src/middleware.ts @@ -0,0 +1,6 @@ +import type { NextRequest } from "next/server"; +import { NextResponse } from "next/server"; + +export function middleware(request: NextRequest) { + return NextResponse.next(); +} diff --git a/src/pages/404.tsx b/src/pages/404.tsx new file mode 100644 index 0000000..5e403f0 --- /dev/null +++ b/src/pages/404.tsx @@ -0,0 +1,45 @@ +import Link from "next/link"; + +import Button from "components/Button"; +import LoaderLayout from "components/Layout/Loader"; + +export default function NotFoundPage() { + return ( + +
+
+ Page not found +
+ +
+ + The page you are trying to access is not found. + + + Please check the URL or go back to the homepage. + + +
+ + + +
+
+
+
+ ); +} diff --git a/src/pages/[...path]/index.tsx b/src/pages/[...path]/index.tsx new file mode 100644 index 0000000..12c293d --- /dev/null +++ b/src/pages/[...path]/index.tsx @@ -0,0 +1,254 @@ +import axios from "axios"; +import gIndexConfig from "config"; +import { GetServerSidePropsContext } from "next"; +import { useRouter } from "next/router"; +import { useEffect, useState } from "react"; + +import ExplorerLayout from "components/Layout/Explorer"; +import LoaderLayout from "components/Layout/Loader"; +import PasswordLayout from "components/Layout/Password"; +import PreviewLayout from "components/Layout/Preview"; + +import { decryptData, encryptData } from "utils/encryptionHelper/hash"; +import gdrive from "utils/gdriveInstance"; +import { addNewPassword, checkPathPassword } from "utils/passwordHelper"; + +import { IGDriveFiles } from "types/api/files"; +import { APIGetFileResponse, APIGetPasswordResponse, APIGetReadmeResponse } from "types/api/response"; +import { Constant } from "types/constant"; + +interface FilePathPageProps { + mappedEncryptedPath: Record<"name" | "id" | "mimeType", string>[]; +} +interface StateDataProps { + file: IGDriveFiles | null; + files: IGDriveFiles[]; + folders: IGDriveFiles[]; + pageToken: string | null; +} +export default function FilePathPage(props: FilePathPageProps) { + const router = useRouter(); + const [data, setData] = useState({ + file: null, + files: [], + folders: [], + pageToken: null, + }); + const [readmeFile, setReadmeFile] = useState(null); + const [isProtected, setIsProtected] = useState(false); + const [nearestProtected, setNearestProtected] = useState(""); + const [isFileProtected, setIsFileProtected] = useState(false); + const [isFile, setIsFile] = useState(false); + const [isLoadingData, setIsLoadingData] = useState(true); + useEffect(() => { + setIsLoadingData(true); + + const lastPathMimeType = props.mappedEncryptedPath[props.mappedEncryptedPath.length - 1].mimeType; + let isLastPathFile = false; + if (lastPathMimeType === "application/vnd.google-apps.folder") { + isLastPathFile = false; + setIsFile(false); + } else { + isLastPathFile = true; + setIsFile(true); + } + + const _getPassword = axios.get("/api/getPassword", { + params: { + path: encryptData(JSON.stringify(props.mappedEncryptedPath)), + }, + }); + const _getData = axios.get("/api/getData", { + params: { + encryptedId: props.mappedEncryptedPath[props.mappedEncryptedPath.length - 1].id, + isFile: isLastPathFile ? "1" : undefined, + }, + }); + const _getReadme = axios.get("/api/getReadme", { + params: { + encryptedId: props.mappedEncryptedPath[props.mappedEncryptedPath.length - 1].id, + }, + }); + + Promise.all([_getPassword, _getData, _getReadme]) + .then(async ([passwordData, fileData, readmeData]) => { + // Check password + if (passwordData.data.data.length) { + let isPathProtected = true; + const savedPasswordCookie = + document.cookie.split(";").find((cookie) => cookie.startsWith(`${Constant.cookies_SitePassword}=`)) ?? + undefined; + const savedPasswordValue = savedPasswordCookie?.split("=")[1] ?? undefined; + + if (savedPasswordValue) { + // Check only nearest path + const nearestPassword = passwordData.data.data[passwordData.data.data.length - 1]; + setNearestProtected(nearestPassword.relativePath); + const isPasswordValid = checkPathPassword( + nearestPassword.relativePath, + savedPasswordValue, + decryptData(nearestPassword.password), + ); + if (isPasswordValid) { + isPathProtected = false; + } + } + + setIsProtected(isPathProtected); + setIsFileProtected(true); + } + + // Assign files + setData(fileData.data.data); + + // Fetch readme + setReadmeFile(readmeData.data.data); + }) + .catch((err) => { + console.error(err); + throw new Error(err); + }) + .finally(() => { + setIsLoadingData(false); + }); + + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [props.mappedEncryptedPath]); + + return ( + + {isLoadingData ? ( +
+
+
+ {gIndexConfig.siteConfig.siteName} +
+
+ Fetching {isFile ? "file info" : "folder contents"}... +
+
+ ) : ( + <> + {isProtected ? ( + { + const cookie = + document.cookie.split(";").find((cookie) => cookie.startsWith(`${Constant.cookies_SitePassword}=`)) ?? + undefined; + addNewPassword(decodeURIComponent(nearestProtected), password, cookie?.split("=")[1] ?? undefined); + router.reload(); + }} + /> + ) : ( + <> + {isFile ? ( + + ) : ( + + )} + + )} + + )} + + ); +} + +export async function getServerSideProps(context: GetServerSidePropsContext) { + const { path } = context.params as { path: string[] }; + + const fetchRootId = gdrive.files.get({ + fileId: gIndexConfig.apiConfig.rootFolder, + fields: "id", + }); + const fetchPathId = path.map(async (path) => { + const query = ["trashed = false", `name = '${path}'`]; + const fetchFolderContents = await gdrive.files.list({ + q: `${query.join(" and ")}`, + fields: "files(id, name, mimeType, parents)", + }); + + if (!fetchFolderContents.data.files?.length) { + return { + path, + data: [], + }; + } + + return { + path, + data: fetchFolderContents.data.files.map((file) => ({ + id: file.id, + parents: file.parents?.[0], + mimeType: file.mimeType, + })), + }; + }); + + const [rootId, pathId] = await Promise.all([fetchRootId, Promise.all(fetchPathId)]); + + if (pathId.some((path) => !path.data.length)) { + return { + notFound: true, + }; + } + + const selectedPath: string[] = []; + const mappedPath: Record<"name" | "id" | "mimeType", string>[] = []; + const rejectedPath: string[] = []; + + // Check path validity + pathId.forEach((path, index) => { + let checkPath = + index === 0 + ? path.data.find((file) => file.parents === rootId.data.id) + : path.data.find((file) => file.parents === selectedPath[index - 1]); + if (!checkPath) { + rejectedPath.push(path.path); + return; + } + selectedPath.push(checkPath.id as string); + mappedPath.push({ + name: path.path, + id: checkPath.id as string, + mimeType: checkPath.mimeType as string, + }); + }); + if (rejectedPath.length) { + return { + notFound: true, + }; + } + + return { + props: { + mappedEncryptedPath: mappedPath.map((path) => ({ + name: path.name, + id: encryptData(path.id), + mimeType: path.mimeType, + })), + }, + }; +} diff --git a/src/pages/_app.tsx b/src/pages/_app.tsx new file mode 100644 index 0000000..487b15c --- /dev/null +++ b/src/pages/_app.tsx @@ -0,0 +1,339 @@ +import { Icon } from "@iconify/react"; +import gIndexConfig from "config"; +import { DefaultSeo } from "next-seo"; +import { AppProps } from "next/app"; +import { JetBrains_Mono, Kanit, Poppins } from "next/font/google"; +import Link from "next/link"; +import { useRouter } from "next/router"; +import { useEffect, useState } from "react"; +import { ToastContainer } from "react-toastify"; +import "react-toastify/dist/ReactToastify.css"; +import { twMerge } from "tailwind-merge"; +import twColor from "tailwindcss/colors"; + +import Button from "components/Button"; +import ButtonGroup from "components/ButtonGroup"; +import ButtonIcon from "components/ButtonIcon"; +import ClickAway from "components/ClickAway"; +import Modal from "components/Modal"; +import Tooltip from "components/Tooltip"; + +import hexToRgb from "utils/hexToRGB"; +import { removeAllPassword } from "utils/passwordHelper"; + +import "styles/globals.css"; + +const kanit = Kanit({ + display: "auto", + weight: ["300", "400", "500", "600", "700", "800", "900"], + subsets: ["latin-ext", "latin"], + preload: true, +}); +export const poppins = Poppins({ + display: "auto", + weight: ["300", "400", "500", "600", "700", "800", "900"], + subsets: ["latin-ext", "latin"], + preload: true, +}); +export const jetbrainsMono = JetBrains_Mono({ + display: "auto", + weight: ["300", "400", "500", "600", "700", "800"], + subsets: ["latin-ext", "latin"], + style: ["normal", "italic"], + preload: true, +}); + +export default function App({ Component, pageProps }: AppProps) { + const router = useRouter(); + + const [accentColor] = useState( + gIndexConfig.siteConfig.defaultAccentColor as keyof typeof twColor, + ); + + const [showToTopButton, setShowToTopButton] = useState(false); + const [isMobileMenuOpen, setIsMobileMenuOpen] = useState(false); + const [clearPasswordModalOpen, setClearPasswordModalOpen] = useState(false); + + useEffect(() => { + const handleScroll = () => { + if (window.scrollY > 150) { + setShowToTopButton(true); + } else { + setShowToTopButton(false); + } + }; + window.addEventListener("scroll", handleScroll); + return () => window.removeEventListener("scroll", handleScroll); + }, []); + + const handleClearPassword = () => { + removeAllPassword(); + setClearPasswordModalOpen(false); + router.reload(); + }; + + useEffect(() => { + const colorObject = twColor[accentColor]; + Object.keys(colorObject).forEach((key) => { + document.documentElement.style.setProperty( + `--accent-${key}`, + hexToRgb(colorObject[key as keyof typeof colorObject]), + ); + }); + }, [accentColor]); + + return ( +
+ + + +
+
+ +
+ +
+ + Powered by{" "} + + next-gdrive-index + + +
+
+ + + + {/* To the top */} + window.scrollTo({ top: 0, behavior: "smooth" })} + /> + + {/* Clear password */} + setClearPasswordModalOpen(false)} + title='Clear password' + > +
+
+ Are you sure you want to clear your password? + + You will need to re-enter your password to access protected folders / files. + +
+ + + + +
+
+
+ ); +} diff --git a/src/pages/_document.tsx b/src/pages/_document.tsx new file mode 100644 index 0000000..97f5e1e --- /dev/null +++ b/src/pages/_document.tsx @@ -0,0 +1,19 @@ +import gIndexConfig from "config"; +import { Head, Html, Main, NextScript } from "next/document"; + +export default function Document() { + return ( + + + + + +
+ + + + ); +} diff --git a/src/pages/index.tsx b/src/pages/index.tsx new file mode 100644 index 0000000..50e0c2c --- /dev/null +++ b/src/pages/index.tsx @@ -0,0 +1,87 @@ +import axios from "axios"; +import gIndexConfig from "config"; +import { useRouter } from "next/router"; +import { useEffect, useState } from "react"; + +import ExplorerLayout from "components/Layout/Explorer"; +import LoaderLayout from "components/Layout/Loader"; + +import { IGDriveFiles } from "types/api/files"; +import { + APIGetFileResponse, + APIGetReadmeResponse, +} from "types/api/response"; + +interface StateDataProps { + file: IGDriveFiles | null; + files: IGDriveFiles[]; + folders: IGDriveFiles[]; + pageToken: string | null; +} +export default function RootPage() { + const router = useRouter(); + const [data, setData] = useState({ + file: null, + files: [], + folders: [], + pageToken: null, + }); + const [readmeFile, setReadmeFile] = useState< + string | null + >(null); + const [isLoadingData, setIsLoadingData] = + useState(true); + + useEffect(() => { + setIsLoadingData(true); + const _getData = + axios.get("/api/getData"); + const _getReadme = axios.get( + "/api/getReadme", + ); + + Promise.all([_getData, _getReadme]) + .then(([fileData, readmeData]) => { + // Assign files + setData(fileData.data.data); + + // Fetch readme + setReadmeFile(readmeData.data.data); + }) + .catch((err) => { + console.error(err); + throw new Error(err); + }) + .finally(() => { + setIsLoadingData(false); + }); + }, []); + + return ( + + {isLoadingData ? ( +
+
+
+ {gIndexConfig.siteConfig.siteName} +
+
+ Fetching folder contents... +
+
+ ) : ( + + )} + + ); +} diff --git a/src/styles/globals.css b/src/styles/globals.css index ae04854..555d43f 100644 --- a/src/styles/globals.css +++ b/src/styles/globals.css @@ -3,249 +3,54 @@ @tailwind utilities; :root { - --animation-duration: 300ms; - --animation-timing: cubic-bezier(0.4, 0, 0.2, 1); + --animation-duration: 300ms; + --animation-timing: cubic-bezier(0.4, 0, 0.2, 1); + + --accent-50: 240 249 255; + --accent-100: 224 242 254; + --accent-200: 186 230 253; + --accent-300: 125 211 252; + --accent-400: 56 189 248; + --accent-500: 14 165 233; + --accent-600: 2 132 199; + --accent-700: 3 105 161; + --accent-800: 7 89 133; + --accent-900: 12 74 110; + --accent-950: 8 47 73; } -html, body { - margin: 0; - padding: 0; - box-sizing: border-box; +html, +body { + margin: 0; + padding: 0; + box-sizing: border-box; } -* { - @apply outline outline-red-500/0 !important; -} - -/* Base */ @layer base { - html { - @apply text-sm tablet:text-base; - } + * { + @apply outline-none; + @apply focus-visible:outline-2 focus-visible:-outline-offset-1 focus-visible:outline-accent-500; + } - * { - @apply focus:outline focus:outline-blue-400 focus:rounded; - @apply dark:focus:outline-blue-600; - } + html, + body { + @apply bg-primary-950; + } - /* Scrollbar */ - ::-webkit-scrollbar { - @apply w-1.5; - } + ::-webkit-scrollbar { + @apply h-1 w-1; + } - html ::-webkit-scrollbar-track { - @apply bg-zinc-100 rounded; - } + ::-webkit-scrollbar-track { + @apply bg-primary-950; + } - html ::-webkit-scrollbar-thumb { - @apply bg-zinc-400 rounded; - } + ::-webkit-scrollbar-thumb { + @apply bg-primary-600 hover:bg-primary-500; + } - html ::-webkit-scrollbar-thumb:hover { - @apply bg-zinc-500; - } - - html.dark ::-webkit-scrollbar-track { - @apply bg-zinc-500; - } - - html.dark ::-webkit-scrollbar-thumb { - @apply bg-zinc-900; - } - - html.dark ::-webkit-scrollbar-thumb:hover { - @apply bg-zinc-800; - } - - /* Text */ - a, .interactive { - @apply opacity-90; - @apply hover:opacity-100; - @apply transition-opacity duration-[var(--animation-duration)] ease-[var(--animation-timing)]; - } - - a[role='url'] { - @apply opacity-100 text-blue-600; - @apply hover:text-blue-500; - @apply active:text-blue-700; - @apply focus:underline; - @apply dark:text-blue-500; - @apply dark:hover:text-blue-400; - @apply dark:active:text-blue-600; - @apply transition-colors duration-[var(--animation-duration)] ease-[var(--animation-timing)]; - } - - button { - @apply bg-blue-600 text-zinc-100 px-4 py-2 opacity-100; - @apply rounded-xl focus:rounded-xl active:rounded-xl; - @apply hover:bg-blue-500 hover:text-zinc-100; - @apply active:bg-blue-700 active:text-zinc-100; - @apply focus:outline-none; - @apply dark:bg-blue-500 dark:text-zinc-100; - @apply dark:hover:bg-blue-400 dark:hover:text-zinc-100; - @apply dark:active:bg-blue-600 dark:active:text-zinc-100; - @apply transition-colors duration-[var(--animation-duration)] ease-[var(--animation-timing)]; - } - - button.ghost { - @apply bg-transparent border border-blue-600 px-4 py-2 rounded-xl opacity-100; - @apply hover:bg-blue-100; - @apply active:bg-blue-200; - @apply focus:outline-none; - @apply dark:border-blue-500; - @apply dark:hover:bg-blue-800; - @apply dark:active:bg-blue-900; - @apply transition-colors duration-[var(--animation-duration)] ease-[var(--animation-timing)]; - } - - button.link { - @apply bg-transparent px-4 py-2 rounded-xl opacity-100; - @apply hover:bg-blue-100; - @apply active:bg-blue-200; - @apply focus:outline-none; - @apply dark:hover:bg-blue-800; - @apply dark:active:bg-blue-900; - @apply transition-colors duration-[var(--animation-duration)] ease-[var(--animation-timing)]; - } - - span { - @apply text-base leading-normal; - } - - h1, h2, h3 { - @apply font-bold; - } - - h4, h5, h6 { - @apply font-semibold; - } - - h1 { - @apply text-4xl tablet:text-5xl; - } - - h2 { - @apply text-3xl tablet:text-4xl; - } - - h3 { - @apply text-2xl tablet:text-3xl; - } - - h4 { - @apply text-xl tablet:text-2xl; - } - - h5 { - @apply text-lg tablet:text-xl; - } - - h6 { - @apply text-base tablet:text-lg; - } - - input { - @apply bg-zinc-100 px-4 py-2; - @apply rounded-lg focus:rounded-lg; - @apply border; - @apply border-zinc-400 hover:border-blue-300 active:border-blue-400; - @apply dark:bg-zinc-900; - @apply dark:border-zinc-600 dark:hover:border-blue-400 dark:active:border-blue-500; - @apply transition-colors duration-[var(--animation-duration)] ease-[var(--animation-timing)]; - } + input::-ms-reveal, + input::-ms-clear { + @apply hidden; + } } - -@layer components { - div.layoutDropdown { - @apply rounded-lg pr-2 pl-4 py-1 cursor-pointer; - @apply flex items-center justify-between gap-8; - @apply text-sm tablet:text-base; - @apply border; - @apply border-zinc-400 hover:border-blue-300 active:border-blue-400; - @apply bg-zinc-100 hover:bg-zinc-200 active:bg-zinc-50; - @apply dark:border-zinc-600 dark:hover:border-blue-400 dark:active:border-blue-500; - @apply dark:bg-zinc-900 dark:hover:bg-zinc-800 dark:active:bg-zinc-950; - @apply disabled:border-zinc-300 dark:disabled:border-zinc-700; - @apply disabled:bg-zinc-400 dark:disabled:bg-zinc-800; - @apply disabled:text-zinc-500; - @apply transition duration-[var(--animation-duration)] ease-[var(--animation-timing)]; - } - - div.layoutOption { - @apply rounded-lg overflow-hidden; - @apply justify-center; - @apply text-sm tablet:text-base; - @apply border; - @apply border-blue-400; - @apply bg-zinc-200; - @apply dark:border-blue-500; - @apply dark:bg-zinc-800; - @apply transition duration-[var(--animation-duration)] ease-[var(--animation-timing)]; - } - - div.layoutItem { - @apply flex items-center justify-start gap-2 pr-2 pl-4 py-1 h-full w-full cursor-pointer; - @apply bg-zinc-100 hover:bg-blue-300/25 focus:bg-zinc-50; - @apply dark:bg-zinc-900 dark:hover:bg-blue-400/25 dark:focus:bg-zinc-950; - } - - div.layoutItem[data-active="true"] { - @apply bg-blue-300 cursor-default; - @apply dark:bg-blue-400; - } - - div.card { - @apply rounded-lg p-4; - @apply flex flex-col items-center justify-between gap-4; - @apply text-sm tablet:text-base; - @apply border; - @apply border-zinc-400; - @apply bg-zinc-100; - @apply dark:border-zinc-600; - @apply dark:bg-zinc-900; - } - - div.file { - @apply rounded-lg p-2 cursor-pointer w-full; - @apply flex items-center gap-2; - @apply text-sm tablet:text-base; - @apply border; - @apply border-zinc-400 hover:border-blue-300 active:border-blue-400; - @apply bg-zinc-100 hover:bg-zinc-200 active:bg-zinc-50; - @apply dark:border-zinc-600 dark:hover:border-blue-400 dark:active:border-blue-500; - @apply dark:bg-zinc-900 dark:hover:bg-zinc-800 dark:active:bg-zinc-950; - @apply transition duration-[var(--animation-duration)] ease-[var(--animation-timing)]; - } - - div.file-list { - @apply rounded-lg p-2 cursor-pointer w-full; - @apply gap-2; - @apply text-sm tablet:text-base; - @apply bg-zinc-100 hover:bg-zinc-200 active:bg-zinc-50; - @apply dark:bg-zinc-900 dark:hover:bg-zinc-800 dark:active:bg-zinc-950; - @apply transition duration-[var(--animation-duration)] ease-[var(--animation-timing)]; - } -} - -/* Utility */ -@layer utilities { - .global-duration { - @apply duration-[var(--animation-duration)] ease-[var(--animation-timing)]; - } - - .divider-horizontal { - @apply w-full h-px rounded-lg; - @apply bg-zinc-400; - @apply dark:border-zinc-600; - } - - .divider-vertical { - @apply h-full w-px rounded-lg; - @apply bg-zinc-400; - @apply dark:border-zinc-600; - } - - .skeleton { - @apply rounded-lg bg-zinc-400 dark:bg-zinc-700 animate-pulse; - } -} \ No newline at end of file diff --git a/src/styles/highlight.css b/src/styles/highlight.css index abef881..8ad652f 100644 --- a/src/styles/highlight.css +++ b/src/styles/highlight.css @@ -1,129 +1,139 @@ :root { - /** + /** * One Light theme for prism.js * Based on Atom's One Light theme: https://github.com/atom/atom/tree/master/packages/one-light-syntax */ - /* From colors.less */ - --mono-1: hsl(230, 8%, 24%); - --mono-2: hsl(230, 6%, 44%); - --mono-3: hsl(230, 4%, 64%); - --hue-1: hsl(198, 99%, 37%); - --hue-2: hsl(221, 87%, 60%); - --hue-3: hsl(301, 63%, 40%); - --hue-4: hsl(119, 34%, 47%); - --hue-5: hsl(5, 74%, 59%); - --hue-5-2: hsl(344, 84%, 43%); - --hue-6: hsl(35, 99%, 36%); - --hue-6-2: hsl(35, 99%, 40%); - --syntax-fg: hsl(230, 8%, 24%); - --syntax-bg: hsl(230, 1%, 98%); - --syntax-gutter: hsl(230, 1%, 62%); - --syntax-guide: hsla(230, 8%, 24%, 0.2); - --syntax-accent: hsl(230, 100%, 66%); - /* From syntax-variables.less */ - --syntax-selection-color: hsl(230, 1%, 90%); - --syntax-gutter-background-color-selected: hsl(230, 1%, 90%); - --syntax-cursor-line: hsla(230, 8%, 24%, 0.05); + /* From colors.less */ + --mono-1: hsl(230, 8%, 24%); + --mono-2: hsl(230, 6%, 44%); + --mono-3: hsl(230, 4%, 64%); + --hue-1: hsl(198, 99%, 37%); + --hue-2: hsl(221, 87%, 60%); + --hue-3: hsl(301, 63%, 40%); + --hue-4: hsl(119, 34%, 47%); + --hue-5: hsl(5, 74%, 59%); + --hue-5-2: hsl(344, 84%, 43%); + --hue-6: hsl(35, 99%, 36%); + --hue-6-2: hsl(35, 99%, 40%); + --syntax-fg: hsl(230, 8%, 24%); + --syntax-bg: hsl(230, 1%, 98%); + --syntax-gutter: hsl(230, 1%, 62%); + --syntax-guide: hsla(230, 8%, 24%, 0.2); + --syntax-accent: hsl(230, 100%, 66%); + /* From syntax-variables.less */ + --syntax-selection-color: hsl(230, 1%, 90%); + --syntax-gutter-background-color-selected: hsl( + 230, + 1%, + 90% + ); + --syntax-cursor-line: hsla(230, 8%, 24%, 0.05); } -body.dark { - /** +body { + /** * One Dark theme for prism.js * Based on Atom's One Dark theme: https://github.com/atom/atom/tree/master/packages/one-dark-syntax */ - /* From colors.less */ - --mono-1: hsl(220, 14%, 71%); - --mono-2: hsl(220, 9%, 55%); - --mono-3: hsl(220, 10%, 40%); - --hue-1: hsl(187, 47%, 55%); - --hue-2: hsl(207, 82%, 66%); - --hue-3: hsl(286, 60%, 67%); - --hue-4: hsl(95, 38%, 62%); - --hue-5: hsl(355, 65%, 65%); - --hue-5-2: hsl(5, 48%, 51%); - --hue-6: hsl(29, 54%, 61%); - --hue-6-2: hsl(39, 67%, 69%); - --syntax-fg: hsl(220, 14%, 71%); - --syntax-bg: hsl(220, 13%, 18%); - --syntax-gutter: hsl(220, 14%, 45%); - --syntax-guide: hsla(220, 14%, 71%, 0.15); - --syntax-accent: hsl(220, 100%, 66%); - /* From syntax-variables.less */ - --syntax-selection-color: hsl(220, 13%, 28%); - --syntax-gutter-background-color-selected: hsl(220, 13%, 26%); - --syntax-cursor-line: hsla(220, 100%, 80%, 0.04); + /* From colors.less */ + --mono-1: hsl(220, 14%, 71%); + --mono-2: hsl(220, 9%, 55%); + --mono-3: hsl(220, 10%, 40%); + --hue-1: hsl(187, 47%, 55%); + --hue-2: hsl(207, 82%, 66%); + --hue-3: hsl(286, 60%, 67%); + --hue-4: hsl(95, 38%, 62%); + --hue-5: hsl(355, 65%, 65%); + --hue-5-2: hsl(5, 48%, 51%); + --hue-6: hsl(29, 54%, 61%); + --hue-6-2: hsl(39, 67%, 69%); + --syntax-fg: hsl(220, 14%, 71%); + --syntax-bg: hsl(220, 13%, 18%); + --syntax-gutter: hsl(220, 14%, 45%); + --syntax-guide: hsla(220, 14%, 71%, 0.15); + --syntax-accent: hsl(220, 100%, 66%); + /* From syntax-variables.less */ + --syntax-selection-color: hsl(220, 13%, 28%); + --syntax-gutter-background-color-selected: hsl( + 220, + 13%, + 26% + ); + --syntax-cursor-line: hsla(220, 100%, 80%, 0.04); } code[class*="language-"], -pre[class*="language-"], pre { - background: var(--syntax-bg); - color: var(--syntax-fg); - text-shadow: 0 1px rgba(0, 0, 0, 0); - font-size: inherit; - direction: ltr; - text-align: left; - white-space: pre; - word-spacing: normal; - word-break: normal; - line-height: 1.5; - -moz-tab-size: 2; - tab-size: 2; - -webkit-hyphens: none; - -moz-hyphens: none; - -ms-hyphens: none; - hyphens: none; +pre[class*="language-"], +pre { + background: var(--syntax-bg); + color: var(--syntax-fg); + text-shadow: 0 1px rgba(0, 0, 0, 0); + font-size: inherit; + direction: ltr; + text-align: left; + white-space: pre; + word-spacing: normal; + word-break: normal; + line-height: 1.5; + -moz-tab-size: 2; + tab-size: 2; + -webkit-hyphens: none; + -moz-hyphens: none; + -ms-hyphens: none; + hyphens: none; } /* Selection */ code[class*="language-"]::-moz-selection, code[class*="language-"] *::-moz-selection, pre[class*="language-"] *::-moz-selection { - background: var(--syntax-selection-color); - color: inherit; - text-shadow: none; + background: var(--syntax-selection-color); + color: inherit; + text-shadow: none; } code[class*="language-"]::selection, code[class*="language-"] *::selection, pre[class*="language-"] *::selection { - background: var(--syntax-selection-color); - color: inherit; - text-shadow: none; + background: var(--syntax-selection-color); + color: inherit; + text-shadow: none; } /* Code blocks */ -pre[class*="language-"], pre { - padding: 1em; - margin: 0.5em 0; - overflow: auto; - border-radius: 0.3em; +pre[class*="language-"], +pre { + padding: 1em; + margin: 0.5em 0; + overflow: auto; + border-radius: 0.3em; } /* Inline code */ :not(pre) > code[class*="language-"] { - padding: 0.2em 0.3em; - border-radius: 0.3em; - white-space: normal; + padding: 0.2em 0.3em; + border-radius: 0.3em; + white-space: normal; } /* Print */ @media print { - code[class*="language-"], - pre[class*="language-"] { - text-shadow: none; - } + code[class*="language-"], + pre[class*="language-"] { + text-shadow: none; + } } .token.comment, .token.prolog, .token.cdata { - color: var(--mono-3); + color: var(--mono-3); } .token.doctype, .token.punctuation, .token.entity { - color: var(--syntax-fg); + color: var(--syntax-fg); } .token.attr-name, @@ -132,11 +142,11 @@ pre[class*="language-"], pre { .token.constant, .token.number, .token.atrule { - color: var(--hue-6); + color: var(--hue-6); } .token.keyword { - color: var(--hue-3); + color: var(--hue-3); } .token.property, @@ -144,7 +154,7 @@ pre[class*="language-"], pre { .token.symbol, .token.deleted, .token.important { - color: var(--hue-5); + color: var(--hue-5); } .token.selector, @@ -155,123 +165,130 @@ pre[class*="language-"], pre { .token.regex, .token.attr-value, .token.attr-value > .token.punctuation { - color: var(--hue-4); + color: var(--hue-4); } .token.variable, .token.operator, .token.function { - color: var(--hue-2); + color: var(--hue-2); } .token.url { - color: var(--hue-1); + color: var(--hue-1); } /* HTML overrides */ .token.attr-value > .token.punctuation.attr-equals, .token.special-attr > .token.attr-value > .token.value.css { - color: var(--syntax-fg); + color: var(--syntax-fg); } /* CSS overrides */ .language-css .token.selector { - color: var(--hue-5); + color: var(--hue-5); } .language-css .token.property { - color: var(--syntax-fg); + color: var(--syntax-fg); } .language-css .token.function, .language-css .token.url > .token.function { - color: var(--hue-1); + color: var(--hue-1); } .language-css .token.url > .token.string.url { - color: var(--hue-4); + color: var(--hue-4); } .language-css .token.important, .language-css .token.atrule .token.rule { - color: var(--hue-3); + color: var(--hue-3); } /* JS overrides */ .language-javascript .token.operator { - color: var(--hue-3); + color: var(--hue-3); } -.language-javascript .token.template-string > .token.interpolation > .token.interpolation-punctuation.punctuation { - color: var(--hue-5-2); +.language-javascript + .token.template-string + > .token.interpolation + > .token.interpolation-punctuation.punctuation { + color: var(--hue-5-2); } /* JSON overrides */ .language-json .token.operator { - color: var(--syntax-fg); + color: var(--syntax-fg); } .language-json .token.null.keyword { - color: var(--hue-6); + color: var(--hue-6); } /* MD overrides */ .language-markdown .token.url, .language-markdown .token.url > .token.operator, -.language-markdown .token.url-reference.url > .token.string { - color: var(--syntax-fg); +.language-markdown + .token.url-reference.url + > .token.string { + color: var(--syntax-fg); } .language-markdown .token.url > .token.content { - color: var(--hue-2); + color: var(--hue-2); } .language-markdown .token.url > .token.url, .language-markdown .token.url-reference.url { - color: var(--hue-1); + color: var(--hue-1); } .language-markdown .token.blockquote.punctuation, .language-markdown .token.hr.punctuation { - color: var(--mono-3); - font-style: italic; + color: var(--mono-3); + font-style: italic; } .language-markdown .token.code-snippet { - color: var(--hue-4); + color: var(--hue-4); } .language-markdown .token.bold .token.content { - color: var(--hue-6); + color: var(--hue-6); } .language-markdown .token.italic .token.content { - color: var(--hue-3); + color: var(--hue-3); } .language-markdown .token.strike .token.content, .language-markdown .token.strike .token.punctuation, .language-markdown .token.list.punctuation, -.language-markdown .token.title.important > .token.punctuation { - color: var(--hue-5); +.language-markdown + .token.title.important + > .token.punctuation { + color: var(--hue-5); } /* General */ .token.bold { - font-weight: bold; + font-weight: bold; } .token.comment, .token.italic { - font-style: italic; + font-style: italic; } .token.entity { - cursor: help; + cursor: help; } .token.namespace { - opacity: 0.8; + opacity: 0.8; } /* Plugin overrides */ @@ -282,69 +299,96 @@ pre[class*="language-"], pre { .token.token.cr:before, .token.token.lf:before, .token.token.space:before { - color: var(--syntax-guide); - text-shadow: none; + color: var(--syntax-guide); + text-shadow: none; } /* Toolbar plugin overrides */ /* Space out all buttons and move them away from the right edge of the code block */ div.code-toolbar > .toolbar.toolbar > .toolbar-item { - margin-right: 0.4em; + margin-right: 0.4em; } /* Styling the buttons */ -div.code-toolbar > .toolbar.toolbar > .toolbar-item > button, +div.code-toolbar + > .toolbar.toolbar + > .toolbar-item + > button, div.code-toolbar > .toolbar.toolbar > .toolbar-item > a, div.code-toolbar > .toolbar.toolbar > .toolbar-item > span { - background: var(--syntax-gutter-background-color-selected); - color: var(--mono-2); - padding: 0.1em 0.4em; - border-radius: 0.3em; + background: var( + --syntax-gutter-background-color-selected + ); + color: var(--mono-2); + padding: 0.1em 0.4em; + border-radius: 0.3em; } -div.code-toolbar > .toolbar.toolbar > .toolbar-item > button:hover, -div.code-toolbar > .toolbar.toolbar > .toolbar-item > button:focus, -div.code-toolbar > .toolbar.toolbar > .toolbar-item > a:hover, -div.code-toolbar > .toolbar.toolbar > .toolbar-item > a:focus, -div.code-toolbar > .toolbar.toolbar > .toolbar-item > span:hover, -div.code-toolbar > .toolbar.toolbar > .toolbar-item > span:focus { - background: var(--syntax-selection-color); - color: var(--syntax-fg); +div.code-toolbar + > .toolbar.toolbar + > .toolbar-item + > button:hover, +div.code-toolbar + > .toolbar.toolbar + > .toolbar-item + > button:focus, +div.code-toolbar + > .toolbar.toolbar + > .toolbar-item + > a:hover, +div.code-toolbar + > .toolbar.toolbar + > .toolbar-item + > a:focus, +div.code-toolbar + > .toolbar.toolbar + > .toolbar-item + > span:hover, +div.code-toolbar + > .toolbar.toolbar + > .toolbar-item + > span:focus { + background: var(--syntax-selection-color); + color: var(--syntax-fg); } /* Line Highlight plugin overrides */ /* The highlighted line itself */ .line-highlight.line-highlight { - background: var(--syntax-cursor-line); + background: var(--syntax-cursor-line); } /* Default line numbers in Line Highlight plugin */ .line-highlight.line-highlight:before, .line-highlight.line-highlight[data-end]:after { - background: var(--syntax-gutter-background-color-selected); - color: var(--syntax-fg); - padding: 0.1em 0.6em; - border-radius: 0.3em; - box-shadow: 0 2px 0 0 rgba(0, 0, 0, 0.2); /* same as Toolbar plugin default */ + background: var( + --syntax-gutter-background-color-selected + ); + color: var(--syntax-fg); + padding: 0.1em 0.6em; + border-radius: 0.3em; + box-shadow: 0 2px 0 0 rgba(0, 0, 0, 0.2); /* same as Toolbar plugin default */ } /* Hovering over a linkable line number (in the gutter area) */ /* Requires Line Numbers plugin as well */ -pre[id].linkable-line-numbers.linkable-line-numbers span.line-numbers-rows > span:hover:before { - background-color: var(--syntax-cursor-line); +pre[id].linkable-line-numbers.linkable-line-numbers + span.line-numbers-rows + > span:hover:before { + background-color: var(--syntax-cursor-line); } /* Line Numbers and Command Line plugins overrides */ /* Line separating gutter from coding area */ .line-numbers.line-numbers .line-numbers-rows, .command-line .command-line-prompt { - border-right-color: var(--syntax-guide); + border-right-color: var(--syntax-guide); } /* Stuff in the gutter */ .line-numbers .line-numbers-rows > span:before, .command-line .command-line-prompt > span:before { - color: var(--syntax-gutter); + color: var(--syntax-gutter); } /* Match Braces plugin overrides */ @@ -352,65 +396,111 @@ pre[id].linkable-line-numbers.linkable-line-numbers span.line-numbers-rows > spa .rainbow-braces .token.token.punctuation.brace-level-1, .rainbow-braces .token.token.punctuation.brace-level-5, .rainbow-braces .token.token.punctuation.brace-level-9 { - color: var(--hue-5); + color: var(--hue-5); } .rainbow-braces .token.token.punctuation.brace-level-2, .rainbow-braces .token.token.punctuation.brace-level-6, .rainbow-braces .token.token.punctuation.brace-level-10 { - color: var(--hue-4); + color: var(--hue-4); } .rainbow-braces .token.token.punctuation.brace-level-3, .rainbow-braces .token.token.punctuation.brace-level-7, .rainbow-braces .token.token.punctuation.brace-level-11 { - color: var(--hue-2); + color: var(--hue-2); } .rainbow-braces .token.token.punctuation.brace-level-4, .rainbow-braces .token.token.punctuation.brace-level-8, .rainbow-braces .token.token.punctuation.brace-level-12 { - color: var(--hue-3); + color: var(--hue-3); } /* Diff Highlight plugin overrides */ /* Taken from https://github.com/atom/github/blob/master/styles/variables.less */ pre.diff-highlight > code .token.token.deleted:not(.prefix), -pre > code.diff-highlight .token.token.deleted:not(.prefix) { - background-color: hsla(353, 100%, 66%, 0.15); +pre + > code.diff-highlight + .token.token.deleted:not(.prefix) { + background-color: hsla(353, 100%, 66%, 0.15); } -pre.diff-highlight > code .token.token.deleted:not(.prefix)::-moz-selection, -pre.diff-highlight > code .token.token.deleted:not(.prefix) *::-moz-selection, -pre > code.diff-highlight .token.token.deleted:not(.prefix)::-moz-selection, -pre > code.diff-highlight .token.token.deleted:not(.prefix) *::-moz-selection { - background-color: hsla(353, 95%, 66%, 0.25); +pre.diff-highlight + > code + .token.token.deleted:not(.prefix)::-moz-selection, +pre.diff-highlight + > code + .token.token.deleted:not(.prefix) + *::-moz-selection, +pre + > code.diff-highlight + .token.token.deleted:not(.prefix)::-moz-selection, +pre + > code.diff-highlight + .token.token.deleted:not(.prefix) + *::-moz-selection { + background-color: hsla(353, 95%, 66%, 0.25); } -pre.diff-highlight > code .token.token.deleted:not(.prefix)::selection, -pre.diff-highlight > code .token.token.deleted:not(.prefix) *::selection, -pre > code.diff-highlight .token.token.deleted:not(.prefix)::selection, -pre > code.diff-highlight .token.token.deleted:not(.prefix) *::selection { - background-color: hsla(353, 95%, 66%, 0.25); +pre.diff-highlight + > code + .token.token.deleted:not(.prefix)::selection, +pre.diff-highlight + > code + .token.token.deleted:not(.prefix) + *::selection, +pre + > code.diff-highlight + .token.token.deleted:not(.prefix)::selection, +pre + > code.diff-highlight + .token.token.deleted:not(.prefix) + *::selection { + background-color: hsla(353, 95%, 66%, 0.25); } -pre.diff-highlight > code .token.token.inserted:not(.prefix), -pre > code.diff-highlight .token.token.inserted:not(.prefix) { - background-color: hsla(137, 100%, 55%, 0.15); +pre.diff-highlight + > code + .token.token.inserted:not(.prefix), +pre + > code.diff-highlight + .token.token.inserted:not(.prefix) { + background-color: hsla(137, 100%, 55%, 0.15); } -pre.diff-highlight > code .token.token.inserted:not(.prefix)::-moz-selection, -pre.diff-highlight > code .token.token.inserted:not(.prefix) *::-moz-selection, -pre > code.diff-highlight .token.token.inserted:not(.prefix)::-moz-selection, -pre > code.diff-highlight .token.token.inserted:not(.prefix) *::-moz-selection { - background-color: hsla(135, 73%, 55%, 0.25); +pre.diff-highlight + > code + .token.token.inserted:not(.prefix)::-moz-selection, +pre.diff-highlight + > code + .token.token.inserted:not(.prefix) + *::-moz-selection, +pre + > code.diff-highlight + .token.token.inserted:not(.prefix)::-moz-selection, +pre + > code.diff-highlight + .token.token.inserted:not(.prefix) + *::-moz-selection { + background-color: hsla(135, 73%, 55%, 0.25); } -pre.diff-highlight > code .token.token.inserted:not(.prefix)::selection, -pre.diff-highlight > code .token.token.inserted:not(.prefix) *::selection, -pre > code.diff-highlight .token.token.inserted:not(.prefix)::selection, -pre > code.diff-highlight .token.token.inserted:not(.prefix) *::selection { - background-color: hsla(135, 73%, 55%, 0.25); +pre.diff-highlight + > code + .token.token.inserted:not(.prefix)::selection, +pre.diff-highlight + > code + .token.token.inserted:not(.prefix) + *::selection, +pre + > code.diff-highlight + .token.token.inserted:not(.prefix)::selection, +pre + > code.diff-highlight + .token.token.inserted:not(.prefix) + *::selection { + background-color: hsla(135, 73%, 55%, 0.25); } /* Previewers plugin overrides */ @@ -418,48 +508,48 @@ pre > code.diff-highlight .token.token.inserted:not(.prefix) *::selection { /* Border around popup */ .prism-previewer.prism-previewer:before, .prism-previewer-gradient.prism-previewer-gradient div { - border-color: hsl(224, 13%, 17%); + border-color: hsl(224, 13%, 17%); } /* Angle and time should remain as circles and are hence not included */ .prism-previewer-color.prism-previewer-color:before, .prism-previewer-gradient.prism-previewer-gradient div, .prism-previewer-easing.prism-previewer-easing:before { - border-radius: 0.3em; + border-radius: 0.3em; } /* Triangles pointing to the code */ .prism-previewer.prism-previewer:after { - border-top-color: hsl(224, 13%, 17%); + border-top-color: hsl(224, 13%, 17%); } .prism-previewer-flipped.prism-previewer-flipped.after { - border-bottom-color: hsl(224, 13%, 17%); + border-bottom-color: hsl(224, 13%, 17%); } /* Background colour within the popup */ .prism-previewer-angle.prism-previewer-angle:before, .prism-previewer-time.prism-previewer-time:before, .prism-previewer-easing.prism-previewer-easing { - background: hsl(219, 13%, 22%); + background: hsl(219, 13%, 22%); } /* For angle, this is the positive area (eg. 90deg will display one quadrant in this colour) */ /* For time, this is the alternate colour */ .prism-previewer-angle.prism-previewer-angle circle, .prism-previewer-time.prism-previewer-time circle { - stroke: var(--syntax-fg); - stroke-opacity: 1; + stroke: var(--syntax-fg); + stroke-opacity: 1; } /* Stroke colours of the handle, direction point, and vector itself */ .prism-previewer-easing.prism-previewer-easing circle, .prism-previewer-easing.prism-previewer-easing path, .prism-previewer-easing.prism-previewer-easing line { - stroke: var(--syntax-fg); + stroke: var(--syntax-fg); } /* Fill colour of the handle */ .prism-previewer-easing.prism-previewer-easing circle { - fill: transparent; + fill: transparent; } diff --git a/src/styles/markdown.css b/src/styles/markdown.css index cec8069..97b0b01 100644 --- a/src/styles/markdown.css +++ b/src/styles/markdown.css @@ -1,90 +1,107 @@ @tailwind components; @layer components { - .markdown { - @apply leading-normal text-inherit bg-inherit; - } + .markdown { + @apply bg-inherit text-base leading-relaxed tracking-wide; + } + .markdown p { + @apply leading-loose; + } - .markdown p { - @apply leading-loose; - } + .markdown h1 { + @apply text-4xl font-medium; + } + .markdown h2 { + @apply text-3xl font-medium; + } + .markdown h3 { + @apply text-2xl font-medium; + } + .markdown h4 { + @apply text-xl font-medium; + } + .markdown h5 { + @apply text-lg font-medium; + } + .markdown h6 { + @apply text-base; + } - .markdown h1, .markdown h2, .markdown h3 { - @apply my-4 border-b-2 tablet:border-b-4 border-b-zinc-400 dark:border-b-zinc-700 first-letter:capitalize; - } + .markdown h1, + .markdown h2, + .markdown h3 { + @apply my-4 border-b-2 border-b-primary-700 first-letter:capitalize; + } - .markdown code:not(pre code) { - @apply bg-zinc-300 dark:bg-zinc-700 px-2 leading-normal rounded-lg; - } + .markdown code:not(pre code) { + @apply rounded-md bg-primary-800 px-2 py-0.5 leading-normal; + } - .markdown code { - @apply font-code; - } + .markdown a { + @apply text-accent-500 opacity-80 transition-smooth hover:opacity-100; + } - .markdown a { - @apply text-blue-500 dark:text-blue-400; - } + .markdown p { + @apply whitespace-normal; + } - .markdown p { - @apply whitespace-normal; - } + .markdown img { + @apply rounded-lg; + } - .markdown img { - @apply rounded-lg; - } + .markdown ul { + @apply list-disc leading-loose; + } - .markdown ul { - @apply list-disc leading-loose; - } + .markdown ol { + @apply list-decimal leading-loose; + } - .markdown ol { - @apply list-decimal leading-loose; - } + .markdown li { + @apply ml-8; + } - .markdown li { - @apply ml-8; - } + .markdown table { + @apply mb-4 block w-full border-collapse border-spacing-0 overflow-auto; + } - .markdown table { - @apply block w-full overflow-auto border-collapse mb-4 border-spacing-0; - } + .markdown table th, + .markdown table td { + @apply border border-primary-700 px-2 py-1; + } - .markdown table th, .markdown table td { - @apply py-1 px-3 border border-zinc-500 dark:border-zinc-500; - } + .markdown table th { + @apply bg-primary-950 text-primary-50; + } - .markdown table th { - @apply bg-zinc-100 dark:bg-zinc-900 text-zinc-900 dark:text-zinc-100; - } + .markdown table tr { + @apply bg-primary-900; + } - .markdown table tr { - @apply bg-zinc-100 dark:bg-zinc-900; - } + .markdown table tr:nth-child(2n) { + @apply bg-primary-800; + } - .markdown table tr:nth-child(2n) { - @apply bg-zinc-200 dark:bg-zinc-800; - } + .markdown ul.contains-task-list { + @apply list-none; + } - .markdown ul.contains-task-list { - @apply list-none; - } + .markdown ul.contains-task-list li { + @apply ml-1 flex items-center; + } - .markdown ul.contains-task-list li { - @apply ml-1 flex items-center; - } + .markdown input[type="checkbox"] { + @apply mr-2 aspect-square h-4 w-4 rounded-full p-2; + @apply appearance-none border border-primary-500; + @apply disabled:bg-primary-600 disabled:checked:bg-accent-400; + } - .markdown input[type="checkbox"] { - @apply mr-2 w-4 h-4 aspect-square p-2; - @apply appearance-none border border-zinc-500; - @apply disabled:bg-zinc-200 dark:disabled:bg-zinc-700 disabled:checked:bg-blue-500 dark:disabled:checked:bg-blue-400; - } + .markdown blockquote { + @apply my-2 rounded-r-md border-l-4 border-l-info-500 bg-primary-800 py-4 pl-2; + } - .markdown blockquote { - @apply pl-2 border-l-4 border-l-zinc-500; - } - - .markdown hr { - @apply my-4 border-t-0 border-b-2 tablet:border-b-4 border-b-zinc-400 dark:border-b-zinc-700; - } -} \ No newline at end of file + .markdown hr { + @apply my-4 border-b border-t-0 border-b-primary-500; + } +} diff --git a/src/types/api/files.ts b/src/types/api/files.ts index c030d67..c46e117 100644 --- a/src/types/api/files.ts +++ b/src/types/api/files.ts @@ -1,13 +1,25 @@ -import { drive_v3 } from "googleapis"; +export interface IGDriveFiles { + mimeType: string; + encryptedId: string; + name: string; + trashed: boolean; + modifiedTime: Date | string; + fileExtension?: string; + encryptedWebContentLink?: string; + size?: number; + thumbnailLink?: string; + imageMediaMetadata?: { + width: number; + height: number; + rotation: number; + } | null; + videoMediaMetadata?: { + width: number; + height: number; + durationMillis: number; + } | null; +} -export type FilesResponse = { - folders: drive_v3.Schema$File[]; - files: drive_v3.Schema$File[]; - isReadmeExists?: boolean; - readmeContent?: string; - isBannerExists?: boolean; - nextPageToken?: string; -}; - -export type FileResponse = drive_v3.Schema$File; -export type SearchResponse = drive_v3.Schema$File[]; +export interface PreviewProps { + file: IGDriveFiles; +} diff --git a/src/types/api/index.ts b/src/types/api/index.ts deleted file mode 100644 index 851bbd3..0000000 --- a/src/types/api/index.ts +++ /dev/null @@ -1,16 +0,0 @@ -export interface API_Response { - success: boolean; - timestamp: string; - responseTime?: number; - data?: T; -} - -export interface API_Error { - success: boolean; - timestamp: string; - responseTime?: number; - code: number; - message: string; - category: string; - reason: string; -} diff --git a/src/types/api/path.ts b/src/types/api/path.ts deleted file mode 100644 index d1026fe..0000000 --- a/src/types/api/path.ts +++ /dev/null @@ -1,7 +0,0 @@ -export type FilePath = { - name: string; - encryptedId: string; - mimeType: string; -}; - -export type ValidateFilePathResponse = FilePath[]; diff --git a/src/types/api/response.ts b/src/types/api/response.ts new file mode 100644 index 0000000..dcc66b6 --- /dev/null +++ b/src/types/api/response.ts @@ -0,0 +1,53 @@ +import { IGDriveFiles } from "./files"; + +interface APIResponse { + timestamp: number; + responseTime: number; +} + +export interface ErrorResponse extends APIResponse { + error: { + code: number; + message: string; + reason?: string; + }; +} + +export interface APIValidateResponse extends APIResponse { + path: string; + valid: boolean; +} + +export interface APIFilesResponse extends APIResponse { + folders: IGDriveFiles[]; + files: IGDriveFiles[]; + nextPageToken?: string; + readmeExists: boolean; + bannerExists: boolean; + passwordExists: boolean; +} + +export interface APIFileResponse extends APIResponse { + file: IGDriveFiles; +} + +export interface APIGetPasswordResponse extends APIResponse { + data: { + relativePath: string; + password: string; + }[]; +} +export interface APIGetFileResponse extends APIResponse { + data: { + file: IGDriveFiles | null; + files: IGDriveFiles[]; + folders: IGDriveFiles[]; + pageToken: string | null; + }; +} +export interface APIGetReadmeResponse extends APIResponse { + data: string | null; +} +export interface APISearchResponse extends APIResponse { + files: (IGDriveFiles & { redirect: string })[]; +} diff --git a/src/types/constant.ts b/src/types/constant.ts new file mode 100644 index 0000000..cea69cb --- /dev/null +++ b/src/types/constant.ts @@ -0,0 +1,4 @@ +export enum Constant { + cookies_SitePassword = "next-gdrive-index-password", + storage_ViewType = "next-gdrive-index-view-type", +} diff --git a/src/types/general/constant.ts b/src/types/general/constant.ts deleted file mode 100644 index 3c61c83..0000000 --- a/src/types/general/constant.ts +++ /dev/null @@ -1,31 +0,0 @@ -export enum Constant { - // API - apiFileNotFound = "File not found", - apiNotAuthorized = "You are not authorized to access this resource", - apiNoResponse = "No response from server", - apiBadRequest = "Bad request", - apiInternalError = "Internal server error", - - reasonNotFound = "Can't find file you requested. It may have been deleted or you may not have permission to access it.", - - cookiePassword = "next-gdrive-password", - cookieMaster = "x-gdrive-key", - - type_folder = "Folder", - type_3d = "3D Model", - type_audio = "Audio", - type_archive = "Archive", - type_rich_text = "Document", - type_officeWord = "Document", - type_officeExcel = "Document", - type_officePowerPoint = "Document", - type_pdf = "Document", - type_database = "Database", - type_image = "Image", - type_code = "Code", - type_text = "Text", - type_video = "Video", - type_font = "Font", - type_default = "Unknown", - type_binary = "Binary", -} diff --git a/src/types/general/index.ts b/src/types/general/index.ts deleted file mode 100644 index 898ac01..0000000 --- a/src/types/general/index.ts +++ /dev/null @@ -1,8 +0,0 @@ -export type RequestContext< - N extends string, - T = unknown, -> = { - params: { - [K in N]: T; - }; -}; diff --git a/src/utils/apiHelper/createErrorPayload.ts b/src/utils/apiHelper/createErrorPayload.ts deleted file mode 100644 index c6eef9a..0000000 --- a/src/utils/apiHelper/createErrorPayload.ts +++ /dev/null @@ -1,32 +0,0 @@ -import { API_Error } from "types/api"; -import { Constant } from "types/general/constant"; - -function createErrorPayload( - error: any, - path: string, - requestStart: number = Date.now(), -): API_Error { - console.error(`Error @${path}: `, error.message); - - const payload: API_Error = { - success: false, - timestamp: new Date().toISOString(), - responseTime: Date.now() - requestStart, - code: error.code || 500, - message: Constant.apiInternalError, - category: "internalError", - reason: error.message || Constant.apiInternalError, - }; - - if ("extendedMessage" in error) { - console.log("Reason: ", error.reason); - payload.message = error.message; - payload.category = error.category || "internalError"; - payload.reason = - error.reason || Constant.apiInternalError; - } - - return payload; -} - -export default createErrorPayload; diff --git a/src/utils/apiHelper/gdrive.ts b/src/utils/apiHelper/gdrive.ts deleted file mode 100644 index ca44284..0000000 --- a/src/utils/apiHelper/gdrive.ts +++ /dev/null @@ -1,52 +0,0 @@ -import { drive_v3, google } from "googleapis"; - -import apiConfig from "config/api.config"; - -//TODO: Move client_secret and refresh_token to config after setup page is done -const config = { - client_id: apiConfig.client_id, - client_secret: process.env.DRIVE_CLIENT_SECRET, - refresh_token: process.env.DRIVE_REFRESH_TOKEN, -}; - -const serviceAccountConfig = { - email: process.env.DRIVE_SERVICE_EMAIL, - key: (process.env.DRIVE_SERVICE_KEY as string).replace( - /\\n/g, - "\n", - ), - projectId: process.env.DRIVE_SERVICE_PROJECT_ID, - clientId: process.env.DRIVE_SERVICE_CLIENT, - scopes: ["https://www.googleapis.com/auth/drive"], -}; - -//TODO: Refetch token if it's become invalid -let gdrive: drive_v3.Drive | undefined; - -const oauth2Client = new google.auth.OAuth2({ - clientId: config.client_id, - clientSecret: config.client_secret as string, - eagerRefreshThresholdMillis: 10000, - redirectUri: "http://localhost", -}); -oauth2Client.setCredentials({ - refresh_token: config.refresh_token as string, -}); - -const serviceAccountAuth = new google.auth.GoogleAuth({ - credentials: { - type: "service_account", - private_key: serviceAccountConfig.key, - client_email: serviceAccountConfig.email, - client_id: serviceAccountConfig.clientId, - }, - projectId: serviceAccountConfig.projectId, - scopes: serviceAccountConfig.scopes, -}); - -gdrive = google.drive({ - version: "v3", - auth: serviceAccountAuth, -}); - -export default gdrive as drive_v3.Drive; diff --git a/src/utils/apiHelper/getSearchParams.ts b/src/utils/apiHelper/getSearchParams.ts index 96c46cf..3e67593 100644 --- a/src/utils/apiHelper/getSearchParams.ts +++ b/src/utils/apiHelper/getSearchParams.ts @@ -1,10 +1,4 @@ -/** - * Get search params from url string, and return it as object - * @param url - Request url - * @param key - Key to get from the url - * @returns Object containing the key and value - */ -function getSearchParams( +export default function getSearchParams( url: string, key: string | string[], ): Record { @@ -13,11 +7,9 @@ function getSearchParams( return { [key]: searchParams.get(key) }; } else { const result: Record = {}; - key.forEach((k) => { + for (const k of key) { result[k] = searchParams.get(k); - }); + } return result; } } - -export default getSearchParams; diff --git a/src/utils/apiHelper/privateIndexProtection.ts b/src/utils/apiHelper/privateIndexProtection.ts new file mode 100644 index 0000000..f11ada6 --- /dev/null +++ b/src/utils/apiHelper/privateIndexProtection.ts @@ -0,0 +1,45 @@ +import { NextRequest } from "next/server"; + +import ExtendedError from "utils/extendedError"; +import { checkPathPassword } from "utils/passwordHelper"; + +import { Constant } from "types/constant"; + +export default async function privateIndexProtection( + request: NextRequest, +) { + const cookies = request.cookies.get( + Constant.cookies_SitePassword, + ); + if (!cookies) { + throw new ExtendedError( + "Unauthorized", + 401, + "No password found", + ); + } + + const password = cookies.value; + const sitePassword = + process.env.NEXT_PUBLIC_SITE_PASSWORD; + console.log(sitePassword); + if (!sitePassword) { + throw new ExtendedError( + "Internal Server Error", + 500, + "Can't find site password. Please check your environment variable", + ); + } + const valid = checkPathPassword( + "site-wide", + password, + sitePassword, + ); + if (!valid) { + throw new ExtendedError( + "Unauthorized", + 401, + "Invalid password", + ); + } +} diff --git a/src/utils/bytesFormat.ts b/src/utils/bytesFormat.ts new file mode 100644 index 0000000..89e3326 --- /dev/null +++ b/src/utils/bytesFormat.ts @@ -0,0 +1,8 @@ +export default function bytesToReadable(bytes: number) { + const sizes = ["Bytes", "KB", "MB", "GB", "TB"]; + if (bytes === 0) return "0 Byte"; + const i = Math.floor(Math.log(bytes) / Math.log(1024)); + return ( + Math.round(bytes / Math.pow(1024, i)) + " " + sizes[i] + ); +} diff --git a/src/utils/durationFormat.ts b/src/utils/durationFormat.ts new file mode 100644 index 0000000..c8fdb10 --- /dev/null +++ b/src/utils/durationFormat.ts @@ -0,0 +1,23 @@ +export function durationToReadable( + durationMillis: number, +): string { + const duration = durationMillis / 1000; + const hours = Math.floor(duration / 3600); + const minutes = Math.floor((duration % 3600) / 60); + const seconds = Math.floor(duration % 60); + + const hStr = + hours > 0 + ? `${hours.toString().padStart(2, "0")}:` + : ""; + const mStr = + minutes > 0 + ? `${minutes.toString().padStart(2, "0")}:` + : ""; + const sStr = + seconds > 0 + ? `${seconds.toString().padStart(2, "0")}` + : "00"; + + return `${hStr}${mStr}${sStr}`; +} diff --git a/src/utils/encryptionHelper/createEncryptionKey.ts b/src/utils/encryptionHelper/createEncryptionKey.ts deleted file mode 100644 index 34855c8..0000000 --- a/src/utils/encryptionHelper/createEncryptionKey.ts +++ /dev/null @@ -1,26 +0,0 @@ -import crypto from "crypto"; - -function createEncryptionKey( - password: string, -): Promise { - return new Promise((resolve, reject) => { - const salt = crypto.randomBytes(16); // generate a random salt - const iterations = 100000; // number of PBKDF2 iterations - const keyLength = 32; // desired key length in bytes - - crypto.pbkdf2( - password, - salt, - iterations, - keyLength, - "sha256", - (err, derivedKey) => { - if (err) throw reject(err); - const encryptionKey = derivedKey.toString("hex"); - resolve(encryptionKey); - }, - ); - }); -} - -export default createEncryptionKey; diff --git a/src/utils/encryptionHelper/generateRandomEncryptionKey.ts b/src/utils/encryptionHelper/generateRandomEncryptionKey.ts deleted file mode 100644 index e797751..0000000 --- a/src/utils/encryptionHelper/generateRandomEncryptionKey.ts +++ /dev/null @@ -1,14 +0,0 @@ -import crypto from "crypto"; - -function generateRandomEncryptionKey(): Promise { - return new Promise((resolve, reject) => { - crypto.randomBytes(32, (err, buffer) => { - if (err) { - reject(err); - } - resolve(buffer.toString("hex")); - }); - }); -} - -export default generateRandomEncryptionKey; diff --git a/src/utils/encryptionHelper/hash.ts b/src/utils/encryptionHelper/hash.ts new file mode 100644 index 0000000..dd7e354 --- /dev/null +++ b/src/utils/encryptionHelper/hash.ts @@ -0,0 +1,44 @@ +import crypto from "crypto"; + +const generateKey = () => { + const env = process.env.NEXT_PUBLIC_ENCRYPTION_KEY; + let data = !env + ? "next-drive-index" + : env.length < 16 + ? env.padEnd(16, "0") + : env.length > 16 + ? env.slice(0, 16) + : env; + return data; +}; +const key = generateKey(); +const iv = Buffer.from(key); + +export function encryptData(data: string): string { + const cipher = crypto.createCipheriv( + "aes-128-cbc", + key, + iv, + ); + return Buffer.concat([ + cipher.update(data, "utf-8"), + cipher.final(), + ]).toString("hex"); +} + +export function decryptData(hash: string): string { + try { + const decipher = crypto.createDecipheriv( + "aes-128-cbc", + key, + iv, + ); + + return Buffer.concat([ + decipher.update(hash, "hex"), + decipher.final(), + ]).toString("utf-8"); + } catch (error) { + return ""; + } +} diff --git a/src/utils/encryptionHelper/longEncryption.ts b/src/utils/encryptionHelper/longEncryption.ts deleted file mode 100644 index a799a41..0000000 --- a/src/utils/encryptionHelper/longEncryption.ts +++ /dev/null @@ -1,52 +0,0 @@ -import crypto from "crypto"; - -function encrypt( - data: string, - key: string = process.env - .NEXT_PUBLIC_ENCRYPTION_KEY as string, -): string { - const iv = crypto.randomBytes(16); - const cipher = crypto.createCipheriv( - "aes-256-cbc", - Buffer.from(key, "hex"), - iv, - ); - const encrypted = Buffer.concat([ - cipher.update(data), - cipher.final(), - ]); - - return ( - iv.toString("hex") + ":" + encrypted.toString("hex") - ); -} - -function decrypt( - encryptedData: string, - key: string = process.env - .NEXT_PUBLIC_ENCRYPTION_KEY as string, -): string { - if (!encryptedData) return ""; - - const [ivString, encryptedString] = - encryptedData.split(":"); - const iv = Buffer.from(ivString, "hex"); - const encrypted = Buffer.from(encryptedString, "hex"); - const decipher = crypto.createDecipheriv( - "aes-256-cbc", - Buffer.from(key, "hex"), - iv, - ); - const decrypted = Buffer.concat([ - decipher.update(encrypted), - decipher.final(), - ]); - - return decrypted.toString(); -} - -const longEncryption = { - encrypt, - decrypt, -}; -export default longEncryption; diff --git a/src/utils/encryptionHelper/passwordHash.ts b/src/utils/encryptionHelper/passwordHash.ts deleted file mode 100644 index 0a33ccf..0000000 --- a/src/utils/encryptionHelper/passwordHash.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { createHash } from "crypto"; - -function encode(text: string): string { - return createHash("sha256").update(text).digest("hex"); -} - -function verify(text: string, hash: string): boolean { - return encode(text) === hash; -} - -function compare(hash1: string, hash2: string): boolean { - return hash1 === hash2; -} - -const passwordHash = { - encode, - verify, - compare, -}; - -export default passwordHash; diff --git a/src/utils/encryptionHelper/shortEncryption.ts b/src/utils/encryptionHelper/shortEncryption.ts deleted file mode 100644 index 19645bb..0000000 --- a/src/utils/encryptionHelper/shortEncryption.ts +++ /dev/null @@ -1,44 +0,0 @@ -import crypto from "crypto"; - -const key = - (process.env.NEXT_PUBLIC_ENCRYPTION_KEY as string).slice( - 0, - 16, - ) || ""; -const iv = Buffer.from(key); - -function encrypt(data: string): string { - const cipher = crypto.createCipheriv( - "aes-128-cbc", - key, - iv, - ); - const encrypted = Buffer.concat([ - cipher.update(data, "utf-8"), - cipher.final(), - ]); - return encrypted.toString("hex"); -} - -function decrypt(encryptedData: string): string { - if (!encryptedData) return ""; - - const decipher = crypto.createDecipheriv( - "aes-128-cbc", - key, - iv, - ); - const decrypted = Buffer.concat([ - decipher.update(encryptedData, "hex"), - decipher.final(), - ]); - - return decrypted.toString(); -} - -const shortEncryption = { - encrypt, - decrypt, -}; - -export default shortEncryption; diff --git a/src/utils/generalHelper/extendedError.ts b/src/utils/extendedError.ts similarity index 62% rename from src/utils/generalHelper/extendedError.ts rename to src/utils/extendedError.ts index 1f2b4e0..283ccfd 100644 --- a/src/utils/generalHelper/extendedError.ts +++ b/src/utils/extendedError.ts @@ -1,19 +1,12 @@ class ExtendedError extends Error { public extendedMessage?: string; public code?: number; - public category?: string; public reason?: string; - constructor( - msg: string, - code: number, - category: string, - reason: string, - ) { + constructor(msg: string, code: number, reason: string) { super(msg); this.extendedMessage = msg; this.code = code; - this.category = category; this.reason = reason; } } diff --git a/src/utils/fileHelper/fileGroup.ts b/src/utils/fileHelper/fileGroup.ts deleted file mode 100644 index 456a81e..0000000 --- a/src/utils/fileHelper/fileGroup.ts +++ /dev/null @@ -1,18 +0,0 @@ -export const typeGroup = { - "3d": "3d", // model preview - "audio": "audio", // audio preview - "archive": "archive", // default preview - "rich_text": "rich_text", // markdown preview - "officeWord": "officeWord", // office preview - "officeExcel": "officeExcel", // office preview - "officePowerPoint": "officePowerPoint", // office preview - "pdf": "pdf", // pdf preview - "database": "database", // default preview - "image": "image", // image preview - "code": "code", // code preview - "text": "text", // text preview - "video": "video", // video preview - "font": "font", // default preview - "default": "default", // default preview - "binary": "binary", // default preview -}; diff --git a/src/utils/fileHelper/formatDate.ts b/src/utils/fileHelper/formatDate.ts deleted file mode 100644 index be4be24..0000000 --- a/src/utils/fileHelper/formatDate.ts +++ /dev/null @@ -1,19 +0,0 @@ -function getLocale() { - if (typeof window === "undefined") return "en-US"; - if (window.navigator.languages) - return window.navigator.languages[0]; - return window.navigator.language; -} - -function formatDate(date: Date, locale = getLocale()) { - return new Intl.DateTimeFormat(locale, { - year: "numeric", - month: "long", - day: "numeric", - hour: "numeric", - minute: "numeric", - hour12: false, - }).format(date); -} - -export default formatDate; diff --git a/src/utils/fileHelper/formatDuration.ts b/src/utils/fileHelper/formatDuration.ts deleted file mode 100644 index 79a1722..0000000 --- a/src/utils/fileHelper/formatDuration.ts +++ /dev/null @@ -1,23 +0,0 @@ -function formatDuration(milliseconds: string | number) { - let ms: number = milliseconds as number; - if (typeof milliseconds === "string") { - ms = Number(milliseconds); - } - - const totalSec = Math.floor(ms / 1000); - const hours = Math.floor(totalSec / 3600); - const minutes = Math.floor((totalSec % 3600) / 60); - const seconds = totalSec % 60; - - const hourString = hours > 0 ? `${hours}:` : ""; - const minuteString = - minutes > 0 - ? `${String(minutes).padStart(2, "0")}:` - : "00:"; - const secondString = - seconds > 0 ? String(seconds).padStart(2, "0") : "00"; - - return `${hourString}${minuteString}${secondString}`; -} - -export default formatDuration; diff --git a/src/utils/fileHelper/formatSize.ts b/src/utils/fileHelper/formatSize.ts deleted file mode 100644 index a38be2e..0000000 --- a/src/utils/fileHelper/formatSize.ts +++ /dev/null @@ -1,28 +0,0 @@ -function formatSize(bytes: number | string) { - let b: number = - typeof bytes === "string" ? parseInt(bytes) : bytes; - if (b === 0) return "0 Bytes"; - - const k = 1024; - const dm = 2; - const sizes = [ - "Bytes", - "KB", - "MB", - "GB", - "TB", - "PB", - "EB", - "ZB", - "YB", - ]; - const i = Math.floor(Math.log(b) / Math.log(k)); - - return ( - parseFloat((b / Math.pow(k, i)).toFixed(dm)) + - " " + - sizes[i] - ); -} - -export default formatSize; diff --git a/src/utils/fileHelper/iconMap.ts b/src/utils/fileHelper/iconMap.ts deleted file mode 100644 index bd44bd4..0000000 --- a/src/utils/fileHelper/iconMap.ts +++ /dev/null @@ -1,60 +0,0 @@ -import { IconType } from "react-icons"; -import { - BsBoxFill, - BsDatabaseFill, - BsFileEarmarkBinaryFill, - BsFileEarmarkCodeFill, - BsFileEarmarkFill, - BsFileEarmarkFontFill, - BsFileEarmarkImageFill, - BsFileEarmarkMusicFill, - BsFileEarmarkPdfFill, - BsFileEarmarkPlayFill, - BsFileEarmarkRichtextFill, - BsFileEarmarkSlidesFill, - BsFileEarmarkSpreadsheetFill, - BsFileEarmarkTextFill, - BsFileEarmarkWordFill, - BsFileEarmarkZipFill, -} from "react-icons/bs"; - -import { typeGroup } from "./fileGroup"; -import { extensionMap, overlapVideo } from "./typeMap"; - -const iconMap: Record = { - "3d": BsBoxFill, - "archive": BsFileEarmarkZipFill, - "audio": BsFileEarmarkMusicFill, - "rich_text": BsFileEarmarkRichtextFill, - "officeWord": BsFileEarmarkWordFill, - "officeExcel": BsFileEarmarkSpreadsheetFill, - "officePowerPoint": BsFileEarmarkSlidesFill, - "pdf": BsFileEarmarkPdfFill, - "database": BsDatabaseFill, - "image": BsFileEarmarkImageFill, - "code": BsFileEarmarkCodeFill, - "text": BsFileEarmarkTextFill, - "video": BsFileEarmarkPlayFill, - "font": BsFileEarmarkFontFill, - "default": BsFileEarmarkFill, - "binary": BsFileEarmarkBinaryFill, -}; - -function getFileIcon( - extension: string, - mimeType?: string, -): IconType { - if (overlapVideo.includes(extension)) { - const isVideo = !!mimeType?.includes("video"); - if (isVideo) { - return iconMap["video"]; - } - } - - const iconGroup = - extensionMap[extension as keyof typeof extensionMap] || - typeGroup.default; - return iconMap[iconGroup as keyof typeof typeGroup]; -} - -export default getFileIcon; diff --git a/src/utils/fileHelper/trigger.ts b/src/utils/fileHelper/trigger.ts deleted file mode 100644 index 075f202..0000000 --- a/src/utils/fileHelper/trigger.ts +++ /dev/null @@ -1,20 +0,0 @@ -import ExtendedError from "utils/generalHelper/extendedError"; - -async function triggerError(code?: number) { - throw new ExtendedError( - "Trigger Error", - code || 500, - "triggerError", - "This is a test error", - ); -} - -async function triggerLoading(ms: number) { - return new Promise((resolve) => setTimeout(resolve, ms)); -} - -const trigger = { - error: triggerError, - loading: triggerLoading, -}; -export default trigger; diff --git a/src/utils/fileHelper/typeMap.ts b/src/utils/fileHelper/typeMap.ts deleted file mode 100644 index 5926d4a..0000000 --- a/src/utils/fileHelper/typeMap.ts +++ /dev/null @@ -1,126 +0,0 @@ -import { typeGroup } from "utils/fileHelper/fileGroup"; - -export const extensionMap: Record = { - "fbx": typeGroup["3d"], - "obj": typeGroup["3d"], - "stl": typeGroup["3d"], - "gltf": typeGroup["3d"], - "glb": typeGroup["3d"], - - "flac": typeGroup.audio, - "m4a": typeGroup.audio, - "mp3": typeGroup.audio, - "ogg": typeGroup.audio, // Check for audio or video - "wav": typeGroup.audio, - - "7z": typeGroup.archive, - "bz2": typeGroup.archive, - "gz": typeGroup.archive, - "rar": typeGroup.archive, - "tar": typeGroup.archive, - "zip": typeGroup.archive, - - "md": typeGroup.rich_text, - "txt": typeGroup.text, - "pdf": typeGroup.pdf, - - "doc": typeGroup.officeWord, - "docx": typeGroup.officeWord, - "xls": typeGroup.officeExcel, - "xlsx": typeGroup.officeExcel, - "ppt": typeGroup.officePowerPoint, - "pptx": typeGroup.officePowerPoint, - - "db": typeGroup.database, - "dbf": typeGroup.database, - "mdb": typeGroup.database, - "pdb": typeGroup.database, - "sql": typeGroup.database, - "csv": typeGroup.database, - "tsv": typeGroup.database, - - "bmp": typeGroup.image, - "gif": typeGroup.image, - "jpg": typeGroup.image, - "jpeg": typeGroup.image, - "png": typeGroup.image, - "svg": typeGroup.image, - "webp": typeGroup.image, - - "c": typeGroup.code, - "cpp": typeGroup.code, - "cs": typeGroup.code, - "css": typeGroup.code, - "go": typeGroup.code, - "h": typeGroup.code, - "html": typeGroup.code, - "ini": typeGroup.code, - "java": typeGroup.code, - "js": typeGroup.code, - "json": typeGroup.code, - "jsx": typeGroup.code, - "php": typeGroup.code, - "py": typeGroup.code, - "rb": typeGroup.code, - "rs": typeGroup.code, - "rust": typeGroup.code, - "sass": typeGroup.code, - "scss": typeGroup.code, - "sh": typeGroup.code, - "swift": typeGroup.code, - "ts": typeGroup.code, - "tsx": typeGroup.code, - "xml": typeGroup.code, - "yaml": typeGroup.code, - "vue": typeGroup.code, - "toml": typeGroup.code, - - "mp4": typeGroup.video, - "webm": typeGroup.video, - "3gp": typeGroup.video, - "mpeg": typeGroup.video, - "mpg": typeGroup.video, - "ogg-vid": typeGroup.video, - "ts-vid": typeGroup.video, - "mov": typeGroup.video, - "mkv": typeGroup.video, - - "woff": typeGroup.font, - "woff2": typeGroup.font, - "ttf": typeGroup.font, - "otf": typeGroup.font, - - "dat": typeGroup.binary, - "bin": typeGroup.binary, - "exe": typeGroup.binary, - "dll": typeGroup.binary, - "msi": typeGroup.binary, -}; -export const overlapVideo = ["ogg", "ts"]; - -function getFileGroup( - extension: string, - mimeType?: string, -): keyof typeof typeGroup { - if (overlapVideo.includes(extension)) { - const isVideo = !!mimeType?.startsWith("video"); - if (isVideo) { - return "video"; - } - } - - if (mimeType) { - const group = mimeType.split("/")[0]; - if (group in typeGroup) { - return group as keyof typeof typeGroup; - } - } - - const group = extensionMap[ - extension - ] as keyof typeof typeGroup; - - return typeGroup[group] ? group : "default"; -} - -export default getFileGroup; diff --git a/src/utils/filesHelper.ts b/src/utils/filesHelper.ts new file mode 100644 index 0000000..6e4d34a --- /dev/null +++ b/src/utils/filesHelper.ts @@ -0,0 +1,10 @@ +export function stripExtension( + filename: string, + ext: string, +): string { + // Make sure the extension is lowercase and also remove the dot + const extension = ext.toLowerCase().replace(/^\./, ""); + return filename.toLowerCase().endsWith(extension) + ? filename.slice(0, -extension.length - 1) + : filename; +} diff --git a/src/utils/gdriveInstance.ts b/src/utils/gdriveInstance.ts new file mode 100644 index 0000000..3e8e2eb --- /dev/null +++ b/src/utils/gdriveInstance.ts @@ -0,0 +1,61 @@ +import { drive_v3, google } from "googleapis"; + +const base64Decode = (data: string) => { + const buff = Buffer.from(data, "base64"); + return buff.toString("ascii"); +}; + +const serviceB64: { + type: string; + project_id: string; + private_key_id: string; + private_key: string; + client_email: string; + client_id: string; + auth_uri: string; + token_uri: string; + auth_provider_x509_cert_url: string; + client_x509_cert_url: string; + universe_domain: string; +} = JSON.parse( + base64Decode(process.env.GD_SERVICE_B64 as string), +); +// const serviceAccount = { +// email: process.env.GD_SERVICE_EMAIL, +// key: (process.env.GD_SERVICE_PVKEY as string).replace( +// /\\n/g, +// "\n", +// ), +// projectId: process.env.GD_SERVICE_PROJECT_ID, +// clientId: process.env.GD_SERVICE_CLIENT_ID, +// scopes: ["https://www.googleapis.com/auth/drive"], +// }; +const serviceAccount = { + email: serviceB64.client_email, + key: serviceB64.private_key, + projectId: serviceB64.project_id, + clientId: serviceB64.client_id, + scopes: ["https://www.googleapis.com/auth/drive"], +}; + +let gdrive: drive_v3.Drive | undefined; + +const serviceAccountAuth = new google.auth.GoogleAuth({ + credentials: { + type: "service_account", + private_key: serviceAccount.key, + client_email: serviceAccount.email, + client_id: serviceAccount.clientId, + }, + projectId: serviceAccount.projectId, + scopes: serviceAccount.scopes, +}); + +if (!gdrive) { + gdrive = google.drive({ + version: "v3", + auth: serviceAccountAuth, + }); +} + +export default gdrive as drive_v3.Drive; diff --git a/src/utils/generalHelper/axiosFetch.ts b/src/utils/generalHelper/axiosFetch.ts deleted file mode 100644 index f72502d..0000000 --- a/src/utils/generalHelper/axiosFetch.ts +++ /dev/null @@ -1,84 +0,0 @@ -import axios, { AxiosError } from "axios"; -import { notFound } from "next/navigation"; - -import ExtendedError from "utils/generalHelper/extendedError"; - -import { API_Error } from "types/api"; -import { Constant } from "types/general/constant"; - -import apiConfig from "config/api.config"; - -const AxiosFetch = axios.create({ - baseURL: apiConfig.basePath, - maxRate: 5, - timeout: 10000, -}); - -AxiosFetch.interceptors.response.use( - (response) => response, - (error: AxiosError) => { - if (error.response) { - const payload = JSON.stringify( - new ExtendedError( - error.response.data.message, - error.response.data.code, - error.response.data.category, - error.response.data.reason, - ), - ); - return Promise.reject(payload); - } else if (error.request) { - const payload = JSON.stringify( - new ExtendedError( - Constant.apiNoResponse, - 500, - "noResponse", - error.message, - ), - ); - return Promise.reject(payload); - } else { - const payload = JSON.stringify( - new ExtendedError( - Constant.apiBadRequest, - 400, - "badRequest", - error.message, - ), - ); - return Promise.reject(payload); - } - }, -); - -export function fetchData( - url: RequestInfo | URL, - config?: RequestInit, -) { - const isRelativeUrl = - typeof url === "string" && url.startsWith("/"); - const fullPath = isRelativeUrl - ? `${apiConfig.basePath}${url}` - : url; - - return fetch(fullPath, config) - .then((res) => res.json()) - .then((res) => res as D); -} - -export function handleError(error: API_Error) { - const errorData = error as API_Error; - if (errorData.code === 404) { - notFound(); - } - return JSON.stringify( - new ExtendedError( - errorData.message, - errorData.code, - errorData.category, - errorData.reason, - ), - ); -} - -export default AxiosFetch; diff --git a/src/utils/generateDownloadLink.ts b/src/utils/generateDownloadLink.ts new file mode 100644 index 0000000..4479541 --- /dev/null +++ b/src/utils/generateDownloadLink.ts @@ -0,0 +1,39 @@ +import { IGDriveFiles } from "types/api/files"; + +import { encryptData } from "./encryptionHelper/hash"; + +/** + * Generate download link for the file, so I don't have to repeat the code. + * Since it's contains encrypted object, I hope this function will make it easier to read and maintain. + * + * @param {IGDriveFiles} file - File object from GDrive API response. + * @param {boolean} [isProtected = false] - Is the file inside password protected folder or not. + * @param {boolean} [includeHost = false] - Include host name or not. + * @param {string} [token] - Download token for protected file. + * @param {string} [disableLimit] - Disable file size limit. + * @returns {string} URL to download the file. + */ +export function generatedDownloadLink( + file: IGDriveFiles, + isProtected: boolean = false, + includeHost: boolean = false, + token?: string | null, + disableLimit?: boolean, +): string { + const data: Record<"id" | "isProtected", string | boolean> = { + id: file.encryptedId, + isProtected, + }; + const encryptedData = encryptData(JSON.stringify(data, null, 0)); + // let url = `/api/download/${encryptedData}/${file.name}`; + + const url = new URL(`/api/download/${encryptedData}/${file.name}`, window.location.origin); + if (token) url.searchParams.append("token", token); + if (disableLimit) url.searchParams.append("disableLimit", "true"); + + // if (includeHost) url = `${window.location.origin}${url}`; + // if (token) url = `${url}?token=${token}`; + // if (disableLimit) url = `${url}&disableLimit=true`; + + return url.toString(); +} diff --git a/src/utils/hexToRGB.ts b/src/utils/hexToRGB.ts new file mode 100644 index 0000000..ed4de09 --- /dev/null +++ b/src/utils/hexToRGB.ts @@ -0,0 +1,18 @@ +/** + * Converts a hex color code to an RGB value. + * + * @param {string} hex - The hex color code to convert. + * @returns {string} The RGB value of the hex color code. + */ +export default function hexToRgb(hex: string): string { + // Remove the # character from the beginning of the hex code + hex = hex.replace("#", ""); + + // Convert the hex code to RGB values + const r = parseInt(hex.substring(0, 2), 16); + const g = parseInt(hex.substring(2, 4), 16); + const b = parseInt(hex.substring(4, 6), 16); + + // Return the RGB value as a string + return `${r} ${g} ${b}`; +} diff --git a/src/utils/passwordHelper.ts b/src/utils/passwordHelper.ts new file mode 100644 index 0000000..b8d66ca --- /dev/null +++ b/src/utils/passwordHelper.ts @@ -0,0 +1,77 @@ +import { Constant } from "types/constant"; + +import { + decryptData, + encryptData, +} from "./encryptionHelper/hash"; + +/** + * Check if the password is correct for the given path + * @param cookies - cookies value + * @param path - The path to check + * @param password - The password to check + * @returns true if the password is correct, false otherwise + */ +export function checkPathPassword( + path: string, + cookies: string, + password: string, +): boolean { + try { + const validCookieToken = decryptData(cookies); + const cookieTokenJSON = JSON.parse(validCookieToken); + if (!cookieTokenJSON[path]) return false; + return cookieTokenJSON[path] === password; + } catch (error: any) { + console.error(error.message); + return false; + } +} + +/** + * Create a new password for the given path + * @param cookies - cookies value + * @param path - The path to add + * @param password - The password to add + * @returns The new cookies token + */ +export function addNewPassword( + path: string, + password: string, + cookies?: string, + server: boolean = false, +): string | void { + try { + let cookieTokenJSON: any = {}; + if (cookies) { + const validCookieToken = decryptData(cookies); + cookieTokenJSON = JSON.parse(validCookieToken); + } + cookieTokenJSON[path] = password; + const encryptedCookieToken = encryptData( + JSON.stringify(cookieTokenJSON), + ); + + // Set cookie for 5 years + const expires = new Date( + Date.now() + 5 * 365 * 24 * 60 * 60 * 1000, + ).toUTCString(); + if (!server) { + document.cookie = `${Constant.cookies_SitePassword}=${encryptedCookieToken}; expires=${expires}; path=/; SameSite=Strict;`; + } else { + return `${Constant.cookies_SitePassword}=${encryptedCookieToken}; expires=${expires}; path=/; SameSite=Strict;`; + } + } catch (error: any) { + removeAllPassword(); + throw new Error( + "Failed to add new password, it's likely because the encryption key are changed. Please refresh the page and try again.", + ); + } +} + +/** + * Remove all password + */ +export function removeAllPassword() { + document.cookie = `${Constant.cookies_SitePassword}=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/;`; +} diff --git a/src/utils/previewHelper.ts b/src/utils/previewHelper.ts new file mode 100644 index 0000000..da6dd02 --- /dev/null +++ b/src/utils/previewHelper.ts @@ -0,0 +1,110 @@ +import AudioPreview from "components/Preview/Audio"; +import CodePreview from "components/Preview/Code"; +import DocumentPreview from "components/Preview/Document"; +import ImagePreview from "components/Preview/Image"; +import MangaPreview from "components/Preview/Manga"; +import RichPreview from "components/Preview/Rich"; +import UnknownPreview from "components/Preview/Unknown"; +import VideoPreview from "components/Preview/Video"; + +import { PreviewProps } from "types/api/files"; + +type FileTypes = "image" | "video" | "audio" | "markdown" | "pdf" | "document" | "code" | "text" | "manga"; +const extensionsMap: Record = { + image: ["png", "jpg", "jpeg", "gif", "webp", "svg", "ico", "bmp", "avif"], + video: ["mp4", "mkv", "webm", "avi", "mov", "flv", "wmv", "mpg", "mpeg", "m4v", "3gp"], + audio: ["mp3", "ogg", "wav", "flac", "m4a", "wma", "aac"], + markdown: ["md"], + pdf: ["pdf"], + document: ["doc", "docx", "xls", "xlsx", "ppt", "pptx"], + code: [ + "html", + "css", + "js", + "ts", + "tsx", + "jsx", + "vue", + "py", + "php", + "go", + "java", + "c", + "cpp", + "h", + "hpp", + "cs", + "swift", + "kt", + "vb", + "rs", + "rb", + "pl", + "sh", + "sql", + "json", + "xml", + "yml", + "yaml", + "toml", + "ini", + "cfg", + "env", + "lock", + ], + text: ["txt"], + manga: ["cbz"], +}; + +const previewMap: Record JSX.Element> = { + image: ImagePreview, + audio: AudioPreview, + video: VideoPreview, + markdown: RichPreview, + pdf: DocumentPreview, + document: DocumentPreview, + code: CodePreview, + text: CodePreview, + manga: MangaPreview, + unknown: UnknownPreview, +}; +const iconMap: Record = { + image: "ion:image", + audio: "ion:musical-notes", + video: "ion:videocam", + markdown: "ion:document-text", + pdf: "ion:document-text", + document: "ion:document-text", + code: "ion:code-slash", + text: "ion:document-text", + manga: "ion:ion:book", + unknown: "ion:document", +}; + +export function getPreviewComponent(fileExtension: string, mimeType: string) { + if (fileExtension === "ts") { + if (mimeType.includes("video")) { + return previewMap["video"]; + } else { + return previewMap["code"]; + } + } + const type = Object.keys(extensionsMap).find((key) => + extensionsMap[key as keyof typeof extensionsMap].includes(fileExtension), + ); + return previewMap[type as keyof typeof previewMap] ?? previewMap["unknown"]; +} + +export function getPreviewIcon(fileExtension: string, mimeType: string) { + if (fileExtension === "ts") { + if (mimeType.includes("video")) { + return iconMap["video"]; + } else { + return iconMap["code"]; + } + } + const type = Object.keys(extensionsMap).find((key) => + extensionsMap[key as keyof typeof extensionsMap].includes(fileExtension), + ); + return iconMap[type as keyof typeof iconMap] ?? iconMap["unknown"]; +} diff --git a/src/utils/tokenHelper.ts b/src/utils/tokenHelper.ts new file mode 100644 index 0000000..8866129 --- /dev/null +++ b/src/utils/tokenHelper.ts @@ -0,0 +1,26 @@ +import gIndexConfig from "config"; + +import { + decryptData, + encryptData, +} from "./encryptionHelper/hash"; + +export function createDownloadToken( + durationH: number = gIndexConfig.apiConfig + .temporaryTokenDuration, +) { + const duration = durationH * 60 * 60 * 1000; + const expiredAt = Date.now() + duration; + return encryptData(expiredAt.toString()); +} + +export function isDownloadTokenValid( + token: string, +): boolean { + try { + const expiredAt = Number(decryptData(token)); + return expiredAt > Date.now(); + } catch (e) { + return false; + } +} diff --git a/tailwind.config.js b/tailwind.config.js index a7d1491..177cde8 100644 --- a/tailwind.config.js +++ b/tailwind.config.js @@ -1,4 +1,54 @@ -const defaultTheme = require("tailwindcss/defaultTheme"); +const defaultColors = require("tailwindcss/colors"); + +const colors = { + inherit: "inherit", + transparent: "transparent", + white: "#ffffff", + black: "#000000", + primary: defaultColors.neutral, + accent: { + 50: "rgb(var(--accent-50) / )", + 100: "rgb(var(--accent-100) / )", + 200: "rgb(var(--accent-200) / )", + 300: "rgb(var(--accent-300) / )", + 400: "rgb(var(--accent-400) / )", + 500: "rgb(var(--accent-500) / )", + 600: "rgb(var(--accent-600) / )", + 700: "rgb(var(--accent-700) / )", + 800: "rgb(var(--accent-800) / )", + 900: "rgb(var(--accent-900) / )", + 950: "rgb(var(--accent-950) / )", + }, + + success: { + ...defaultColors.emerald, + main: defaultColors.emerald[600], + hover: defaultColors.emerald[500], + active: defaultColors.emerald[700], + text: defaultColors.emerald[50], + }, + warning: { + ...defaultColors.amber, + main: defaultColors.amber[600], + hover: defaultColors.amber[500], + active: defaultColors.amber[700], + text: defaultColors.amber[50], + }, + danger: { + ...defaultColors.red, + main: defaultColors.red[600], + hover: defaultColors.red[500], + active: defaultColors.red[700], + text: defaultColors.red[50], + }, + info: { + ...defaultColors.blue, + main: defaultColors.blue[600], + hover: defaultColors.blue[500], + active: defaultColors.blue[700], + text: defaultColors.blue[50], + }, +}; /** @type {import('tailwindcss').Config} */ module.exports = { @@ -9,12 +59,13 @@ module.exports = { ], darkMode: "class", theme: { + colors, extend: { minHeight: { - dynamic: "100vh", + dynamic: "100dvh", }, minWidth: { - dynamic: "100vw", + dynamic: "100dvw", }, height: { dynamic: "100dvh", @@ -22,39 +73,32 @@ module.exports = { width: { dynamic: "100dvw", }, - fontFamily: { - body: [ - "var(--font-exo2)", - ...defaultTheme.fontFamily.sans, - ], - docs: [ - "var(--font-source-sans-pro", - ...defaultTheme.fontFamily.sans, - ], - code: [ - "var(--font-jetbrains-mono)", - ...defaultTheme.fontFamily.mono, - ], - }, screens: { mobile: "320px", tablet: "768px", - desktop: "1024px", + desktop: "1280px", }, backgroundImage: { - "gradient-radial": - "radial-gradient(var(--tw-gradient-stops))", - "gradient-conic": - "conic-gradient(from 180deg at 50% 50%, var(--tw-gradient-stops))", - "checkerboard": - "repeating-linear-gradient(45deg, #71717a, #71717a 25%, #52525b 25%, #52525b 50%)", // zinc-500 - zinc-600 - "checkerboard-dark": - "repeating-linear-gradient(45deg, #71717a, #71717a 25%, #a1a1aa 25%, #a1a1aa 50%)", // zinc-500 - zinc-400 + "gradient-radial": "radial-gradient(var(--tw-gradient-stops))", + "gradient-conic": "conic-gradient(from 180deg at 50% 50%, var(--tw-gradient-stops))", + "checkerboard": "repeating-linear-gradient(45deg, #71717a, #71717a 25%, #52525b 25%, #52525b 50%)", // zinc-500 - zinc-600 + "checkerboard-dark": "repeating-linear-gradient(45deg, #71717a, #71717a 25%, #a1a1aa 25%, #a1a1aa 50%)", // zinc-500 - zinc-400 }, backgroundSize: { checkerboard: "128px 128px", }, }, }, - plugins: [require("@tailwindcss/typography")], + plugins: [ + require("@tailwindcss/typography"), + function ({ addUtilities }) { + const newUtilities = { + ".transition-smooth": { + transitionDuration: "250ms", + transitionTimingFunction: "cubic-bezier(0.4, 0, 0.2, 1)", + }, + }; + addUtilities(newUtilities); + }, + ], }; diff --git a/tsconfig.json b/tsconfig.json index a841d2f..13d7194 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,12 +1,7 @@ { "compilerOptions": { "target": "es5", - "lib": [ - "dom", - "dom.iterable", - "esnext", - "es2019" - ], + "lib": ["dom", "dom.iterable", "esnext", "es2019"], "allowJs": true, "skipLibCheck": true, "strict": true, @@ -21,28 +16,17 @@ "incremental": true, "baseUrl": "./src", "paths": { - // "@/*": ["./src/*"], - "components/*": [ - "app/(__components)/*" - ], - "config/*": [ - "config/*" - ], - "hooks/*": [ - "hooks/*" - ], - "styles/*": [ - "styles/*" - ], - "utils/*": [ - "utils/*" - ], - "types/*": [ - "types/*" - ], - "context/*": [ - "context/*" - ] + // "@/*": ["./src/*"], + // "components/*": [ + // "app/(__components)/*" + // ], + "components/*": ["components/*"], + "config": ["config/gIndex.config.ts"], + "hooks/*": ["hooks/*"], + "styles/*": ["styles/*"], + "utils/*": ["utils/*"], + "types/*": ["types/*"], + "context/*": ["context/*"] }, "plugins": [ { @@ -59,6 +43,8 @@ ], "exclude": [ "node_modules", - ".next" + ".next", + "**/*/_legacy/**/*", + "**/*/_app/**/*" ] } diff --git a/yarn.lock b/yarn.lock index 888abce..458a793 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,12 +2,18 @@ # yarn lockfile v1 -"@babel/code-frame@^7.16.7", "@babel/code-frame@^7.21.4": - version "7.21.4" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.21.4.tgz#d0fa9e4413aca81f2b23b9442797bda1826edb39" - integrity sha512-LYvhNKfwWSPpocw8GI7gpK2nq3HSDuEPC/uSYaALSJu9xjsalaaYFOq0Pwt5KmVqwEbZlDu81aLXwBOmD/Fv9g== +"@aashutoshrathi/word-wrap@^1.2.3": + version "1.2.6" + resolved "https://registry.yarnpkg.com/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz#bd9154aec9983f77b3a034ecaa015c2e4201f6cf" + integrity sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA== + +"@babel/code-frame@^7.16.7", "@babel/code-frame@^7.22.13", "@babel/code-frame@^7.22.5": + version "7.22.13" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.22.13.tgz#e3c1c099402598483b7a8c46a721d1038803755e" + integrity sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w== dependencies: - "@babel/highlight" "^7.18.6" + "@babel/highlight" "^7.22.13" + chalk "^2.4.2" "@babel/generator@7.17.7": version "7.17.7" @@ -19,81 +25,134 @@ source-map "^0.5.0" "@babel/generator@^7.17.3": - version "7.21.9" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.21.9.tgz#3a1b706e07d836e204aee0650e8ee878d3aaa241" - integrity sha512-F3fZga2uv09wFdEjEQIJxXALXfz0+JaOb7SabvVMmjHxeVTuGW8wgE8Vp1Hd7O+zMTYtcfEISGRzPkeiaPPsvg== + version "7.22.10" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.22.10.tgz#c92254361f398e160645ac58831069707382b722" + integrity sha512-79KIf7YiWjjdZ81JnLujDRApWtl7BxTqWD88+FFdQEIOG8LJ0etDOM7CXuIgGJa55sGOwZVwuEsaLEm0PJ5/+A== dependencies: - "@babel/types" "^7.21.5" + "@babel/types" "^7.22.10" "@jridgewell/gen-mapping" "^0.3.2" "@jridgewell/trace-mapping" "^0.3.17" jsesc "^2.5.1" -"@babel/helper-environment-visitor@^7.16.7": - version "7.21.5" - resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.21.5.tgz#c769afefd41d171836f7cb63e295bedf689d48ba" - integrity sha512-IYl4gZ3ETsWocUWgsFZLM5i1BYx9SoemminVEXadgLBa9TdeorzgLKm8wWLA6J1N/kT3Kch8XIk1laNzYoHKvQ== - -"@babel/helper-function-name@^7.16.7": - version "7.21.0" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.21.0.tgz#d552829b10ea9f120969304023cd0645fa00b1b4" - integrity sha512-HfK1aMRanKHpxemaY2gqBmL04iAPOPRj7DxtNbiDOrJK+gdwkiNRVpCpUJYbUT+aZyemKN8brqTOxzCaG6ExRg== +"@babel/generator@^7.22.15": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.22.15.tgz#1564189c7ec94cb8f77b5e8a90c4d200d21b2339" + integrity sha512-Zu9oWARBqeVOW0dZOjXc3JObrzuqothQ3y/n1kUtrjCoCPLkXUwMvOo/F/TCfoHMbWIFlWwpZtkZVb9ga4U2pA== dependencies: - "@babel/template" "^7.20.7" - "@babel/types" "^7.21.0" + "@babel/types" "^7.22.15" + "@jridgewell/gen-mapping" "^0.3.2" + "@jridgewell/trace-mapping" "^0.3.17" + jsesc "^2.5.1" -"@babel/helper-hoist-variables@^7.16.7": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz#d4d2c8fb4baeaa5c68b99cc8245c56554f926678" - integrity sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q== +"@babel/helper-annotate-as-pure@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz#e7f06737b197d580a01edf75d97e2c8be99d3882" + integrity sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg== dependencies: - "@babel/types" "^7.18.6" + "@babel/types" "^7.22.5" -"@babel/helper-split-export-declaration@^7.16.7": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz#7367949bc75b20c6d5a5d4a97bba2824ae8ef075" - integrity sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA== +"@babel/helper-environment-visitor@^7.16.7", "@babel/helper-environment-visitor@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.5.tgz#f06dd41b7c1f44e1f8da6c4055b41ab3a09a7e98" + integrity sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q== + +"@babel/helper-function-name@^7.16.7", "@babel/helper-function-name@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.22.5.tgz#ede300828905bb15e582c037162f99d5183af1be" + integrity sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ== dependencies: - "@babel/types" "^7.18.6" + "@babel/template" "^7.22.5" + "@babel/types" "^7.22.5" -"@babel/helper-string-parser@^7.21.5": - version "7.21.5" - resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.21.5.tgz#2b3eea65443c6bdc31c22d037c65f6d323b6b2bd" - integrity sha512-5pTUx3hAJaZIdW99sJ6ZUUgWq/Y+Hja7TowEnLNMm1VivRgZQL3vpBY3qUACVsvw+yQU6+YgfBVmcbLaZtrA1w== - -"@babel/helper-validator-identifier@^7.16.7", "@babel/helper-validator-identifier@^7.18.6", "@babel/helper-validator-identifier@^7.19.1": - version "7.19.1" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz#7eea834cf32901ffdc1a7ee555e2f9c27e249ca2" - integrity sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w== - -"@babel/highlight@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.18.6.tgz#81158601e93e2563795adcbfbdf5d64be3f2ecdf" - integrity sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g== +"@babel/helper-hoist-variables@^7.16.7", "@babel/helper-hoist-variables@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz#c01a007dac05c085914e8fb652b339db50d823bb" + integrity sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw== dependencies: - "@babel/helper-validator-identifier" "^7.18.6" - chalk "^2.0.0" + "@babel/types" "^7.22.5" + +"@babel/helper-module-imports@^7.0.0", "@babel/helper-module-imports@^7.22.5": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz#16146307acdc40cc00c3b2c647713076464bdbf0" + integrity sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w== + dependencies: + "@babel/types" "^7.22.15" + +"@babel/helper-plugin-utils@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz#dd7ee3735e8a313b9f7b05a773d892e88e6d7295" + integrity sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg== + +"@babel/helper-split-export-declaration@^7.16.7", "@babel/helper-split-export-declaration@^7.22.6": + version "7.22.6" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz#322c61b7310c0997fe4c323955667f18fcefb91c" + integrity sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g== + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-string-parser@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz#533f36457a25814cf1df6488523ad547d784a99f" + integrity sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw== + +"@babel/helper-validator-identifier@^7.16.7", "@babel/helper-validator-identifier@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz#9544ef6a33999343c8740fa51350f30eeaaaf193" + integrity sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ== + +"@babel/helper-validator-identifier@^7.22.15": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.15.tgz#601fa28e4cc06786c18912dca138cec73b882044" + integrity sha512-4E/F9IIEi8WR94324mbDUMo074YTheJmd7eZF5vITTeYchqAi6sYXRLHUVsmkdmY4QjfKTcB2jB7dVP3NaBElQ== + +"@babel/highlight@^7.22.13": + version "7.22.13" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.22.13.tgz#9cda839e5d3be9ca9e8c26b6dd69e7548f0cbf16" + integrity sha512-C/BaXcnnvBCmHTpz/VGZ8jgtE2aYlW4hxDhseJAWZb7gqGM/qtCK6iZUb0TyKFf7BOUsBH7Q7fkRsDRhg1XklQ== + dependencies: + "@babel/helper-validator-identifier" "^7.22.5" + chalk "^2.4.2" js-tokens "^4.0.0" -"@babel/parser@^7.17.3", "@babel/parser@^7.20.5", "@babel/parser@^7.21.9": - version "7.21.9" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.21.9.tgz#ab18ea3b85b4bc33ba98a8d4c2032c557d23cf14" - integrity sha512-q5PNg/Bi1OpGgx5jYlvWZwAorZepEudDMCLtj967aeS7WMont7dUZI46M2XwcIQqvUlMxWfdLFu4S/qSxeUu5g== +"@babel/parser@^7.17.3", "@babel/parser@^7.20.5", "@babel/parser@^7.22.5": + version "7.22.14" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.22.14.tgz#c7de58e8de106e88efca42ce17f0033209dfd245" + integrity sha512-1KucTHgOvaw/LzCVrEOAyXkr9rQlp0A1HiHRYnSUE9dmb8PvPW7o5sscg+5169r54n3vGlbx6GevTE/Iw/P3AQ== -"@babel/runtime@^7.10.2", "@babel/runtime@^7.11.2", "@babel/runtime@^7.16.7", "@babel/runtime@^7.17.8", "@babel/runtime@^7.20.7": - version "7.21.5" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.21.5.tgz#8492dddda9644ae3bda3b45eabe87382caee7200" - integrity sha512-8jI69toZqqcsnqGGqwGS4Qb1VwLOEp4hz+CXPywcvjs60u3B4Pom/U/7rm4W8tMOYEB+E9wgD0mW1l3r8qlI9Q== - dependencies: - regenerator-runtime "^0.13.11" +"@babel/parser@^7.22.16": + version "7.22.16" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.22.16.tgz#180aead7f247305cce6551bea2720934e2fa2c95" + integrity sha512-+gPfKv8UWeKKeJTUxe59+OobVcrYHETCsORl61EmSkmgymguYk/X5bp7GuUIXaFsc6y++v8ZxPsLSSuujqDphA== -"@babel/template@^7.20.7": - version "7.21.9" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.21.9.tgz#bf8dad2859130ae46088a99c1f265394877446fb" - integrity sha512-MK0X5k8NKOuWRamiEfc3KEJiHMTkGZNUjzMipqCGDDc6ijRl/B7RGSKVGncu4Ro/HdyzzY6cmoXuKI2Gffk7vQ== +"@babel/plugin-syntax-jsx@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.22.5.tgz#a6b68e84fb76e759fc3b93e901876ffabbe1d918" + integrity sha512-gvyP4hZrgrs/wWMaocvxZ44Hw0b3W8Pe+cMxc8V1ULQ07oh8VNbIRaoD1LRZVTvD+0nieDKjfgKg89sD7rrKrg== dependencies: - "@babel/code-frame" "^7.21.4" - "@babel/parser" "^7.21.9" - "@babel/types" "^7.21.5" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/runtime@^7.0.0", "@babel/runtime@^7.10.2": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.22.15.tgz#38f46494ccf6cf020bd4eed7124b425e83e523b8" + integrity sha512-T0O+aa+4w0u06iNmapipJXMV4HoUir03hpx3/YqXXhu9xim3w+dVphjFWl1OH8NbZHw5Lbm9k45drDkgq2VNNA== + dependencies: + regenerator-runtime "^0.14.0" + +"@babel/runtime@^7.20.7": + version "7.22.11" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.22.11.tgz#7a9ba3bbe406ad6f9e8dd4da2ece453eb23a77a4" + integrity sha512-ee7jVNlWN09+KftVOu9n7S8gQzD/Z6hN/I8VBRXW4P1+Xe7kJGXMwu8vds4aGIMHZnNbdpSWCfZZtinytpcAvA== + dependencies: + regenerator-runtime "^0.14.0" + +"@babel/template@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.22.5.tgz#0c8c4d944509875849bd0344ff0050756eefc6ec" + integrity sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw== + dependencies: + "@babel/code-frame" "^7.22.5" + "@babel/parser" "^7.22.5" + "@babel/types" "^7.22.5" "@babel/traverse@7.17.3": version "7.17.3" @@ -111,6 +170,22 @@ debug "^4.1.0" globals "^11.1.0" +"@babel/traverse@^7.4.5": + version "7.22.17" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.22.17.tgz#b23c203ab3707e3be816043081b4a994fcacec44" + integrity sha512-xK4Uwm0JnAMvxYZxOVecss85WxTEIbTa7bnGyf/+EgCL5Zt3U7htUpEOWv9detPlamGKuRzCqw74xVglDWpPdg== + dependencies: + "@babel/code-frame" "^7.22.13" + "@babel/generator" "^7.22.15" + "@babel/helper-environment-visitor" "^7.22.5" + "@babel/helper-function-name" "^7.22.5" + "@babel/helper-hoist-variables" "^7.22.5" + "@babel/helper-split-export-declaration" "^7.22.6" + "@babel/parser" "^7.22.16" + "@babel/types" "^7.22.17" + debug "^4.1.0" + globals "^11.1.0" + "@babel/types@7.17.0": version "7.17.0" resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.17.0.tgz#a826e368bccb6b3d84acd76acad5c0d87342390b" @@ -119,78 +194,57 @@ "@babel/helper-validator-identifier" "^7.16.7" to-fast-properties "^2.0.0" -"@babel/types@^7.17.0", "@babel/types@^7.18.6", "@babel/types@^7.21.0", "@babel/types@^7.21.5": - version "7.21.5" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.21.5.tgz#18dfbd47c39d3904d5db3d3dc2cc80bedb60e5b6" - integrity sha512-m4AfNvVF2mVC/F7fDEdH2El3HzUg9It/XsCxZiOTTA3m3qYfcSVSbTfM6Q9xG+hYDniZssYhlXKKUMD5m8tF4Q== +"@babel/types@^7.17.0", "@babel/types@^7.22.10", "@babel/types@^7.22.5": + version "7.22.11" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.22.11.tgz#0e65a6a1d4d9cbaa892b2213f6159485fe632ea2" + integrity sha512-siazHiGuZRz9aB9NpHy9GOs9xiQPKnMzgdr493iI1M67vRXpnEq8ZOOKzezC5q7zwuQ6sDhdSp4SD9ixKSqKZg== dependencies: - "@babel/helper-string-parser" "^7.21.5" - "@babel/helper-validator-identifier" "^7.19.1" + "@babel/helper-string-parser" "^7.22.5" + "@babel/helper-validator-identifier" "^7.22.5" to-fast-properties "^2.0.0" -"@chevrotain/cst-dts-gen@10.5.0": - version "10.5.0" - resolved "https://registry.yarnpkg.com/@chevrotain/cst-dts-gen/-/cst-dts-gen-10.5.0.tgz#922ebd8cc59d97241bb01b1b17561a5c1ae0124e" - integrity sha512-lhmC/FyqQ2o7pGK4Om+hzuDrm9rhFYIJ/AXoQBeongmn870Xeb0L6oGEiuR8nohFNL5sMaQEJWCxr1oIVIVXrw== +"@babel/types@^7.22.15", "@babel/types@^7.22.17": + version "7.22.17" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.22.17.tgz#f753352c4610ffddf9c8bc6823f9ff03e2303eee" + integrity sha512-YSQPHLFtQNE5xN9tHuZnzu8vPr61wVTBZdfv1meex1NBosa4iT05k/Jw06ddJugi4bk7The/oSwQGFcksmEJQg== dependencies: - "@chevrotain/gast" "10.5.0" - "@chevrotain/types" "10.5.0" - lodash "4.17.21" + "@babel/helper-string-parser" "^7.22.5" + "@babel/helper-validator-identifier" "^7.22.15" + to-fast-properties "^2.0.0" -"@chevrotain/gast@10.5.0": - version "10.5.0" - resolved "https://registry.yarnpkg.com/@chevrotain/gast/-/gast-10.5.0.tgz#e4e614bc46d17a8892742f38e56cd33f1f3ad162" - integrity sha512-pXdMJ9XeDAbgOWKuD1Fldz4ieCs6+nLNmyVhe2gZVqoO7v8HXuHYs5OV2EzUtbuai37TlOAQHrTDvxMnvMJz3A== +"@cyntler/react-doc-viewer@^1.13.0": + version "1.13.0" + resolved "https://registry.yarnpkg.com/@cyntler/react-doc-viewer/-/react-doc-viewer-1.13.0.tgz#8685c2112aa76f4e0a4ead054f1c1e1a9ecce03d" + integrity sha512-skrgvgpRQw7yhS8VmHP6vkBU9HiWAkvwQYNY1u7JZWOSN6Tro/iKZzrZ8Fv/cOheAnhliHxWbj1TZeMz4b+A9Q== dependencies: - "@chevrotain/types" "10.5.0" - lodash "4.17.21" + "@types/mustache" "^4.2.2" + "@types/papaparse" "^5.3.5" + mustache "^4.2.0" + papaparse "^5.3.2" + react-pdf "5.7.2" + styled-components "^5.3.6" -"@chevrotain/types@10.5.0": - version "10.5.0" - resolved "https://registry.yarnpkg.com/@chevrotain/types/-/types-10.5.0.tgz#52a97d74a8cfbc197f054636d93ecd8912d33d21" - integrity sha512-f1MAia0x/pAVPWH/T73BJVyO2XU5tI4/iE7cnxb7tqdNTNhQI3Uq3XkqcoteTmD4t1aM0LbHCJOhgIDn07kl2A== - -"@chevrotain/utils@10.5.0": - version "10.5.0" - resolved "https://registry.yarnpkg.com/@chevrotain/utils/-/utils-10.5.0.tgz#0ee36f65b49b447fbac71b9e5af5c5c6c98ac057" - integrity sha512-hBzuU5+JjB2cqNZyszkDHZgOSrUUT8V3dhgRl8Q9Gp6dAj/H5+KILGjbhDpc3Iy9qmqlm/akuOI2ut9VUtzJxQ== - -"@colors/colors@1.5.0": - version "1.5.0" - resolved "https://registry.yarnpkg.com/@colors/colors/-/colors-1.5.0.tgz#bb504579c1cae923e6576a4f5da43d25f97bdbd9" - integrity sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ== - -"@cypress/request@^2.88.10": - version "2.88.11" - resolved "https://registry.yarnpkg.com/@cypress/request/-/request-2.88.11.tgz#5a4c7399bc2d7e7ed56e92ce5acb620c8b187047" - integrity sha512-M83/wfQ1EkspjkE2lNWNV5ui2Cv7UCv1swW1DqljahbzLVWltcsexQh8jYtuS/vzFXP+HySntGM83ZXA9fn17w== +"@emotion/is-prop-valid@^1.1.0": + version "1.2.1" + resolved "https://registry.yarnpkg.com/@emotion/is-prop-valid/-/is-prop-valid-1.2.1.tgz#23116cf1ed18bfeac910ec6436561ecb1a3885cc" + integrity sha512-61Mf7Ufx4aDxx1xlDeOm8aFFigGHE4z+0sKCa+IHCeZKiyP9RLD0Mmx7m8b9/Cf37f7NAvQOOJAbQQGVr5uERw== dependencies: - aws-sign2 "~0.7.0" - aws4 "^1.8.0" - caseless "~0.12.0" - combined-stream "~1.0.6" - extend "~3.0.2" - forever-agent "~0.6.1" - form-data "~2.3.2" - http-signature "~1.3.6" - is-typedarray "~1.0.0" - isstream "~0.1.2" - json-stringify-safe "~5.0.1" - mime-types "~2.1.19" - performance-now "^2.1.0" - qs "~6.10.3" - safe-buffer "^5.1.2" - tough-cookie "~2.5.0" - tunnel-agent "^0.6.0" - uuid "^8.3.2" + "@emotion/memoize" "^0.8.1" -"@cypress/xvfb@^1.2.4": - version "1.2.4" - resolved "https://registry.yarnpkg.com/@cypress/xvfb/-/xvfb-1.2.4.tgz#2daf42e8275b39f4aa53c14214e557bd14e7748a" - integrity sha512-skbBzPggOVYCbnGgV+0dmBdW/s77ZkAOXIC1knS8NagwDjBrNC1LuXtQJeiN6l+m7lzmHtaoUw/ctJKdqkG57Q== - dependencies: - debug "^3.1.0" - lodash.once "^4.1.1" +"@emotion/memoize@^0.8.1": + version "0.8.1" + resolved "https://registry.yarnpkg.com/@emotion/memoize/-/memoize-0.8.1.tgz#c1ddb040429c6d21d38cc945fe75c818cfb68e17" + integrity sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA== + +"@emotion/stylis@^0.8.4": + version "0.8.5" + resolved "https://registry.yarnpkg.com/@emotion/stylis/-/stylis-0.8.5.tgz#deacb389bd6ee77d1e7fcaccce9e16c5c7e78e04" + integrity sha512-h6KtPihKFn3T9fuIrwvXXUOwlx3rfUvfZIcP5a6rh8Y7zjE3O06hT5Ss4S/YI1AYhuZ1kjaE/5EaOOI2NqSylQ== + +"@emotion/unitless@^0.7.4": + version "0.7.5" + resolved "https://registry.yarnpkg.com/@emotion/unitless/-/unitless-0.7.5.tgz#77211291c1900a700b8a78cfafda3160d76949ed" + integrity sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg== "@eslint-community/eslint-utils@^4.2.0": version "4.4.0" @@ -200,18 +254,18 @@ eslint-visitor-keys "^3.3.0" "@eslint-community/regexpp@^4.4.0": - version "4.5.1" - resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.5.1.tgz#cdd35dce4fa1a89a4fd42b1599eb35b3af408884" - integrity sha512-Z5ba73P98O1KUYCCJTUeVpja9RcGoMdncZ6T49FCUl2lN38JtCJ+3WgIDBv0AuY4WChU5PmtJmOCTlN6FZTFKQ== + version "4.8.0" + resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.8.0.tgz#11195513186f68d42fbf449f9a7136b2c0c92005" + integrity sha512-JylOEEzDiOryeUnFbQz+oViCXS0KsvR1mvHkoMiu5+UiBvy+RYX7tzlIIIEstF/gVa2tj9AQXk3dgnxv6KxhFg== "@eslint/eslintrc@^2.0.2": - version "2.0.3" - resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-2.0.3.tgz#4910db5505f4d503f27774bf356e3704818a0331" - integrity sha512-+5gy6OQfk+xx3q0d6jGZZC3f3KzAkXc/IanVxd1is/VIIziRqqt3ongQz0FiTUXqTk0c7aDB3OaFuKnuSoJicQ== + version "2.1.2" + resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-2.1.2.tgz#c6936b4b328c64496692f76944e755738be62396" + integrity sha512-+wvgpDsrB1YqAMdEUCcnTlpfVBH7Vqn6A/NT3D8WVXFIaKMlErPIZT3oCIAVCOtarRpMtelZLqJeU3t7WY6X6g== dependencies: ajv "^6.12.4" debug "^4.3.2" - espree "^9.5.2" + espree "^9.6.0" globals "^13.19.0" ignore "^5.2.0" import-fresh "^3.2.1" @@ -224,10 +278,15 @@ resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.38.0.tgz#73a8a0d8aa8a8e6fe270431c5e72ae91b5337892" integrity sha512-IoD2MfUnOV58ghIHCiil01PcohxjbYR/qCxsoC+xNgUwh1EY8jOOrYmu3d3a71+tJJ23uscEV4X2HJWMsPJu4g== +"@faker-js/faker@^8.0.2": + version "8.0.2" + resolved "https://registry.yarnpkg.com/@faker-js/faker/-/faker-8.0.2.tgz#bab698c5d3da9c52744e966e0e3eedb6c8b05c37" + integrity sha512-Uo3pGspElQW91PCvKSIAXoEgAUlRnH29sX2/p89kg7sP1m2PzCufHINd0FhTXQf6DYGiUlVncdSPa2F9wxed2A== + "@humanwhocodes/config-array@^0.11.8": - version "0.11.8" - resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.11.8.tgz#03595ac2075a4dc0f191cc2131de14fbd7d410b9" - integrity sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g== + version "0.11.11" + resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.11.11.tgz#88a04c570dbbc7dd943e4712429c3df09bc32844" + integrity sha512-N2brEuAadi0CcdeMXUkhbZB84eskAc8MEX1By6qEchoVywSgXPIjou4rYsl0V3Hj0ZnuGycGCjdNgockbzeWNA== dependencies: "@humanwhocodes/object-schema" "^1.2.1" debug "^4.1.1" @@ -253,6 +312,18 @@ resolved "https://registry.yarnpkg.com/@iconify/react/-/react-3.2.2.tgz#ab5241dc01562076bae3b0c22238aff7e5f029cc" integrity sha512-z3+Jno3VcJzgNHsN5mEvYMsgCkOZkydqdIwOxjXh45+i2Vs9RGH68Y52vt39izwFSfuYUXhaW+1u7m7+IhCn/g== +"@iconify/react@^4.1.1": + version "4.1.1" + resolved "https://registry.yarnpkg.com/@iconify/react/-/react-4.1.1.tgz#da1bf03cdca9427f07cf22cf5b63fa8f02db4722" + integrity sha512-jed14EjvKjee8mc0eoscGxlg7mSQRkwQG3iX3cPBCO7UlOjz0DtlvTqxqEcHUJGh+z1VJ31Yhu5B9PxfO0zbdg== + dependencies: + "@iconify/types" "^2.0.0" + +"@iconify/types@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@iconify/types/-/types-2.0.0.tgz#ab0e9ea681d6c8a1214f30cd741fe3a20cc57f57" + integrity sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg== + "@jridgewell/gen-mapping@^0.3.2": version "0.3.3" resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz#7e02e6eb5df901aaedb08514203b096614024098" @@ -262,90 +333,131 @@ "@jridgewell/sourcemap-codec" "^1.4.10" "@jridgewell/trace-mapping" "^0.3.9" -"@jridgewell/resolve-uri@3.1.0": - version "3.1.0" - resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz#2203b118c157721addfe69d47b70465463066d78" - integrity sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w== +"@jridgewell/resolve-uri@^3.1.0": + version "3.1.1" + resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz#c08679063f279615a3326583ba3a90d1d82cc721" + integrity sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA== "@jridgewell/set-array@^1.0.1": version "1.1.2" resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.2.tgz#7c6cf998d6d20b914c0a55a91ae928ff25965e72" integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw== -"@jridgewell/sourcemap-codec@1.4.14": - version "1.4.14" - resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz#add4c98d341472a289190b424efbdb096991bb24" - integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw== - -"@jridgewell/sourcemap-codec@^1.4.10": +"@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14": version "1.4.15" resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32" integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== "@jridgewell/trace-mapping@^0.3.17", "@jridgewell/trace-mapping@^0.3.9": - version "0.3.18" - resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz#25783b2086daf6ff1dcb53c9249ae480e4dd4cd6" - integrity sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA== + version "0.3.19" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.19.tgz#f8a3249862f91be48d3127c3cfe992f79b4b8811" + integrity sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw== dependencies: - "@jridgewell/resolve-uri" "3.1.0" - "@jridgewell/sourcemap-codec" "1.4.14" + "@jridgewell/resolve-uri" "^3.1.0" + "@jridgewell/sourcemap-codec" "^1.4.14" -"@next/env@13.4.4": - version "13.4.4" - resolved "https://registry.yarnpkg.com/@next/env/-/env-13.4.4.tgz#46b620f6bef97fe67a1566bf570dbb791d40c50a" - integrity sha512-q/y7VZj/9YpgzDe64Zi6rY1xPizx80JjlU2BTevlajtaE3w1LqweH1gGgxou2N7hdFosXHjGrI4OUvtFXXhGLg== +"@mdx-js/loader@^2.3.0": + version "2.3.0" + resolved "https://registry.yarnpkg.com/@mdx-js/loader/-/loader-2.3.0.tgz#56a6b07eb0027b6407e953a97c52bd8619601161" + integrity sha512-IqsscXh7Q3Rzb+f5DXYk0HU71PK+WuFsEhf+mSV3fOhpLcEpgsHvTQ2h0T6TlZ5gHOaBeFjkXwB52by7ypMyNg== + dependencies: + "@mdx-js/mdx" "^2.0.0" + source-map "^0.7.0" -"@next/eslint-plugin-next@13.4.3": - version "13.4.3" - resolved "https://registry.yarnpkg.com/@next/eslint-plugin-next/-/eslint-plugin-next-13.4.3.tgz#9f3b9dedc8da57436e45d736f5fc6646e93a2656" - integrity sha512-5B0uOnh7wyUY9vNNdIA6NUvWozhrZaTMZOzdirYAefqD0ZBK5C/h3+KMYdCKrR7JrXGvVpWnHtv54b3dCzwICA== +"@mdx-js/mdx@^2.0.0": + version "2.3.0" + resolved "https://registry.yarnpkg.com/@mdx-js/mdx/-/mdx-2.3.0.tgz#d65d8c3c28f3f46bb0e7cb3bf7613b39980671a9" + integrity sha512-jLuwRlz8DQfQNiUCJR50Y09CGPq3fLtmtUQfVrj79E0JWu3dvsVcxVIcfhR5h0iXu+/z++zDrYeiJqifRynJkA== + dependencies: + "@types/estree-jsx" "^1.0.0" + "@types/mdx" "^2.0.0" + estree-util-build-jsx "^2.0.0" + estree-util-is-identifier-name "^2.0.0" + estree-util-to-js "^1.1.0" + estree-walker "^3.0.0" + hast-util-to-estree "^2.0.0" + markdown-extensions "^1.0.0" + periscopic "^3.0.0" + remark-mdx "^2.0.0" + remark-parse "^10.0.0" + remark-rehype "^10.0.0" + unified "^10.0.0" + unist-util-position-from-estree "^1.0.0" + unist-util-stringify-position "^3.0.0" + unist-util-visit "^4.0.0" + vfile "^5.0.0" + +"@mdx-js/react@^2.3.0": + version "2.3.0" + resolved "https://registry.yarnpkg.com/@mdx-js/react/-/react-2.3.0.tgz#4208bd6d70f0d0831def28ef28c26149b03180b3" + integrity sha512-zQH//gdOmuu7nt2oJR29vFhDv88oGPmVw6BggmrHeMI+xgEkp1B2dX9/bMBSYtK0dyLX/aOmesKS09g222K1/g== + dependencies: + "@types/mdx" "^2.0.0" + "@types/react" ">=16" + +"@next/env@13.4.19": + version "13.4.19" + resolved "https://registry.yarnpkg.com/@next/env/-/env-13.4.19.tgz#46905b4e6f62da825b040343cbc233144e9578d3" + integrity sha512-FsAT5x0jF2kkhNkKkukhsyYOrRqtSxrEhfliniIq0bwWbuXLgyt3Gv0Ml+b91XwjwArmuP7NxCiGd++GGKdNMQ== + +"@next/eslint-plugin-next@13.4.19": + version "13.4.19" + resolved "https://registry.yarnpkg.com/@next/eslint-plugin-next/-/eslint-plugin-next-13.4.19.tgz#93d130c37b47fd120f6d111aee36a60611148df1" + integrity sha512-N/O+zGb6wZQdwu6atMZHbR7T9Np5SUFUjZqCbj0sXm+MwQO35M8TazVB4otm87GkXYs2l6OPwARd3/PUWhZBVQ== dependencies: glob "7.1.7" -"@next/swc-darwin-arm64@13.4.4": - version "13.4.4" - resolved "https://registry.yarnpkg.com/@next/swc-darwin-arm64/-/swc-darwin-arm64-13.4.4.tgz#8c14083c2478e2a9a8d140cce5900f76b75667ff" - integrity sha512-xfjgXvp4KalNUKZMHmsFxr1Ug+aGmmO6NWP0uoh4G3WFqP/mJ1xxfww0gMOeMeSq/Jyr5k7DvoZ2Pv+XOITTtw== +"@next/mdx@^13.4.19": + version "13.4.19" + resolved "https://registry.yarnpkg.com/@next/mdx/-/mdx-13.4.19.tgz#6c7c0c2cdd14fc728afa3336805bc8c8428d2b31" + integrity sha512-EaWA30YxAqFcyQYNxCoL9/TCcZP1Nk6pvW0vf1M54qDAkAGiloWQqyttVKVbRz+qOYk92he6mBB4ej/7pmEinQ== + dependencies: + source-map "^0.7.0" -"@next/swc-darwin-x64@13.4.4": - version "13.4.4" - resolved "https://registry.yarnpkg.com/@next/swc-darwin-x64/-/swc-darwin-x64-13.4.4.tgz#5fe01c65c80fcb833c8789fd70f074ea99893864" - integrity sha512-ZY9Ti1hkIwJsxGus3nlubIkvYyB0gNOYxKrfsOrLEqD0I2iCX8D7w8v6QQZ2H+dDl6UT29oeEUdDUNGk4UEpfg== +"@next/swc-darwin-arm64@13.4.19": + version "13.4.19" + resolved "https://registry.yarnpkg.com/@next/swc-darwin-arm64/-/swc-darwin-arm64-13.4.19.tgz#77ad462b5ced4efdc26cb5a0053968d2c7dac1b6" + integrity sha512-vv1qrjXeGbuF2mOkhkdxMDtv9np7W4mcBtaDnHU+yJG+bBwa6rYsYSCI/9Xm5+TuF5SbZbrWO6G1NfTh1TMjvQ== -"@next/swc-linux-arm64-gnu@13.4.4": - version "13.4.4" - resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-13.4.4.tgz#f2e071f38e8a6cdadf507cc5d28956f73360d064" - integrity sha512-+KZnDeMShYkpkqAvGCEDeqYTRADJXc6SY1jWXz+Uo6qWQO/Jd9CoyhTJwRSxvQA16MoYzvILkGaDqirkRNctyA== +"@next/swc-darwin-x64@13.4.19": + version "13.4.19" + resolved "https://registry.yarnpkg.com/@next/swc-darwin-x64/-/swc-darwin-x64-13.4.19.tgz#aebe38713a4ce536ee5f2a291673e14b715e633a" + integrity sha512-jyzO6wwYhx6F+7gD8ddZfuqO4TtpJdw3wyOduR4fxTUCm3aLw7YmHGYNjS0xRSYGAkLpBkH1E0RcelyId6lNsw== -"@next/swc-linux-arm64-musl@13.4.4": - version "13.4.4" - resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-13.4.4.tgz#23bf75c544e54562bc24ec1be036e4bd9cf89e2c" - integrity sha512-evC1twrny2XDT4uOftoubZvW3EG0zs0ZxMwEtu/dDGVRO5n5pT48S8qqEIBGBUZYu/Xx4zzpOkIxx1vpWdE+9A== +"@next/swc-linux-arm64-gnu@13.4.19": + version "13.4.19" + resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-13.4.19.tgz#ec54db65b587939c7b94f9a84800f003a380f5a6" + integrity sha512-vdlnIlaAEh6H+G6HrKZB9c2zJKnpPVKnA6LBwjwT2BTjxI7e0Hx30+FoWCgi50e+YO49p6oPOtesP9mXDRiiUg== -"@next/swc-linux-x64-gnu@13.4.4": - version "13.4.4" - resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-13.4.4.tgz#bd42590950a01957952206f89cf5622e7c9e4196" - integrity sha512-PX706XcCHr2FfkyhP2lpf+pX/tUvq6/ke7JYnnr0ykNdEMo+sb7cC/o91gnURh4sPYSiZJhsF2gbIqg9rciOHQ== +"@next/swc-linux-arm64-musl@13.4.19": + version "13.4.19" + resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-13.4.19.tgz#1f5e2c1ea6941e7d530d9f185d5d64be04279d86" + integrity sha512-aU0HkH2XPgxqrbNRBFb3si9Ahu/CpaR5RPmN2s9GiM9qJCiBBlZtRTiEca+DC+xRPyCThTtWYgxjWHgU7ZkyvA== -"@next/swc-linux-x64-musl@13.4.4": - version "13.4.4" - resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-13.4.4.tgz#907d81feb1abec3daec0ecb61e3f39b56e7aeafe" - integrity sha512-TKUUx3Ftd95JlHV6XagEnqpT204Y+IsEa3awaYIjayn0MOGjgKZMZibqarK3B1FsMSPaieJf2FEAcu9z0yT5aA== +"@next/swc-linux-x64-gnu@13.4.19": + version "13.4.19" + resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-13.4.19.tgz#96b0882492a2f7ffcce747846d3680730f69f4d1" + integrity sha512-htwOEagMa/CXNykFFeAHHvMJeqZfNQEoQvHfsA4wgg5QqGNqD5soeCer4oGlCol6NGUxknrQO6VEustcv+Md+g== -"@next/swc-win32-arm64-msvc@13.4.4": - version "13.4.4" - resolved "https://registry.yarnpkg.com/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-13.4.4.tgz#1d754d2bb10bdf9907c0acc83711438697c3b5fe" - integrity sha512-FP8AadgSq4+HPtim7WBkCMGbhr5vh9FePXiWx9+YOdjwdQocwoCK5ZVC3OW8oh3TWth6iJ0AXJ/yQ1q1cwSZ3A== +"@next/swc-linux-x64-musl@13.4.19": + version "13.4.19" + resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-13.4.19.tgz#f276b618afa321d2f7b17c81fc83f429fb0fd9d8" + integrity sha512-4Gj4vvtbK1JH8ApWTT214b3GwUh9EKKQjY41hH/t+u55Knxi/0wesMzwQRhppK6Ddalhu0TEttbiJ+wRcoEj5Q== -"@next/swc-win32-ia32-msvc@13.4.4": - version "13.4.4" - resolved "https://registry.yarnpkg.com/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-13.4.4.tgz#77b2c7f7534b675d46e46301869e08d504d23956" - integrity sha512-3WekVmtuA2MCdcAOrgrI+PuFiFURtSyyrN1I3UPtS0ckR2HtLqyqmS334Eulf15g1/bdwMteePdK363X/Y9JMg== +"@next/swc-win32-arm64-msvc@13.4.19": + version "13.4.19" + resolved "https://registry.yarnpkg.com/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-13.4.19.tgz#1599ae0d401da5ffca0947823dac577697cce577" + integrity sha512-bUfDevQK4NsIAHXs3/JNgnvEY+LRyneDN788W2NYiRIIzmILjba7LaQTfihuFawZDhRtkYCv3JDC3B4TwnmRJw== -"@next/swc-win32-x64-msvc@13.4.4": - version "13.4.4" - resolved "https://registry.yarnpkg.com/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-13.4.4.tgz#faab69239f8a9d0be7cd473e65f5a07735ef7b0e" - integrity sha512-AHRITu/CrlQ+qzoqQtEMfaTu7GHaQ6bziQln/pVWpOYC1wU+Mq6VQQFlsDtMCnDztPZtppAXdvvbNS7pcfRzlw== +"@next/swc-win32-ia32-msvc@13.4.19": + version "13.4.19" + resolved "https://registry.yarnpkg.com/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-13.4.19.tgz#55cdd7da90818f03e4da16d976f0cb22045d16fd" + integrity sha512-Y5kikILFAr81LYIFaw6j/NrOtmiM4Sf3GtOc0pn50ez2GCkr+oejYuKGcwAwq3jiTKuzF6OF4iT2INPoxRycEA== + +"@next/swc-win32-x64-msvc@13.4.19": + version "13.4.19" + resolved "https://registry.yarnpkg.com/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-13.4.19.tgz#648f79c4e09279212ac90d871646ae12d80cdfce" + integrity sha512-YzA78jBDXMYiINdPdJJwGgPNT3YqBNNGhsthsDoWHL9p24tEJn9ViQf/ZqTbwSpX/RrkPupLfuuTH2sf73JBAw== "@nodelib/fs.scandir@2.1.5": version "2.1.5" @@ -368,121 +480,15 @@ "@nodelib/fs.scandir" "2.1.5" fastq "^1.6.0" -"@pkgr/utils@^2.3.1": - version "2.4.0" - resolved "https://registry.yarnpkg.com/@pkgr/utils/-/utils-2.4.0.tgz#b6373d2504aedaf2fc7cdf2d13ab1f48fa5f12d5" - integrity sha512-2OCURAmRtdlL8iUDTypMrrxfwe8frXTeXaxGsVOaYtc/wrUyk8Z/0OBetM7cdlsy7ZFWlMX72VogKeh+A4Xcjw== - dependencies: - cross-spawn "^7.0.3" - fast-glob "^3.2.12" - is-glob "^4.0.3" - open "^9.1.0" - picocolors "^1.0.0" - tslib "^2.5.0" - -"@react-spring/animated@~9.6.1": - version "9.6.1" - resolved "https://registry.yarnpkg.com/@react-spring/animated/-/animated-9.6.1.tgz#ccc626d847cbe346f5f8815d0928183c647eb425" - integrity sha512-ls/rJBrAqiAYozjLo5EPPLLOb1LM0lNVQcXODTC1SMtS6DbuBCPaKco5svFUQFMP2dso3O+qcC4k9FsKc0KxMQ== - dependencies: - "@react-spring/shared" "~9.6.1" - "@react-spring/types" "~9.6.1" - -"@react-spring/core@~9.6.1": - version "9.6.1" - resolved "https://registry.yarnpkg.com/@react-spring/core/-/core-9.6.1.tgz#ebe07c20682b360b06af116ea24e2b609e778c10" - integrity sha512-3HAAinAyCPessyQNNXe5W0OHzRfa8Yo5P748paPcmMowZ/4sMfaZ2ZB6e5x5khQI8NusOHj8nquoutd6FRY5WQ== - dependencies: - "@react-spring/animated" "~9.6.1" - "@react-spring/rafz" "~9.6.1" - "@react-spring/shared" "~9.6.1" - "@react-spring/types" "~9.6.1" - -"@react-spring/rafz@~9.6.1": - version "9.6.1" - resolved "https://registry.yarnpkg.com/@react-spring/rafz/-/rafz-9.6.1.tgz#d71aafb92b78b24e4ff84639f52745afc285c38d" - integrity sha512-v6qbgNRpztJFFfSE3e2W1Uz+g8KnIBs6SmzCzcVVF61GdGfGOuBrbjIcp+nUz301awVmREKi4eMQb2Ab2gGgyQ== - -"@react-spring/shared@~9.6.1": - version "9.6.1" - resolved "https://registry.yarnpkg.com/@react-spring/shared/-/shared-9.6.1.tgz#4e2e4296910656c02bd9fd54c559702bc836ac4e" - integrity sha512-PBFBXabxFEuF8enNLkVqMC9h5uLRBo6GQhRMQT/nRTnemVENimgRd+0ZT4yFnAQ0AxWNiJfX3qux+bW2LbG6Bw== - dependencies: - "@react-spring/rafz" "~9.6.1" - "@react-spring/types" "~9.6.1" - -"@react-spring/three@~9.6.1": - version "9.6.1" - resolved "https://registry.yarnpkg.com/@react-spring/three/-/three-9.6.1.tgz#095fcd1dc6509127c33c14486d88289b89baeb9d" - integrity sha512-Tyw2YhZPKJAX3t2FcqvpLRb71CyTe1GvT3V+i+xJzfALgpk10uPGdGaQQ5Xrzmok1340DAeg2pR/MCfaW7b8AA== - dependencies: - "@react-spring/animated" "~9.6.1" - "@react-spring/core" "~9.6.1" - "@react-spring/shared" "~9.6.1" - "@react-spring/types" "~9.6.1" - -"@react-spring/types@~9.6.1": - version "9.6.1" - resolved "https://registry.yarnpkg.com/@react-spring/types/-/types-9.6.1.tgz#913d3a68c5cbc1124fdb18eff919432f7b6abdde" - integrity sha512-POu8Mk0hIU3lRXB3bGIGe4VHIwwDsQyoD1F394OK7STTiX9w4dG3cTLljjYswkQN+hDSHRrj4O36kuVa7KPU8Q== - -"@react-three/drei@^9.66.1": - version "9.68.3" - resolved "https://registry.yarnpkg.com/@react-three/drei/-/drei-9.68.3.tgz#93ceea62b44202153ac93db7f98ff37943b0255e" - integrity sha512-u+70dPPiM1rfJ/Wd4lbbyaC0QbQwvQd1NuMfIE78UzvMtOI8LjVLJNmdvzhAfcEL+RuqQlboSgd2/NjcLv9aDQ== - dependencies: - "@babel/runtime" "^7.11.2" - "@react-spring/three" "~9.6.1" - "@use-gesture/react" "^10.2.24" - camera-controls "^2.3.1" - detect-gpu "^5.0.14" - glsl-noise "^0.0.0" - lodash.clamp "^4.0.3" - lodash.omit "^4.5.0" - lodash.pick "^4.4.0" - maath "^0.5.2" - meshline "^3.1.6" - react-composer "^5.0.3" - react-merge-refs "^1.1.0" - stats.js "^0.17.0" - suspend-react "^0.0.8" - three-mesh-bvh "^0.5.23" - three-stdlib "^2.21.8" - troika-three-text "^0.47.1" - utility-types "^3.10.0" - zustand "^3.5.13" - -"@react-three/fiber@^8.13.0": - version "8.13.0" - resolved "https://registry.yarnpkg.com/@react-three/fiber/-/fiber-8.13.0.tgz#c9eabe60f2276a66d7ce9a3b927083894f4202f9" - integrity sha512-hPFzFNgikEMyEbL+NpSA7q+UWZxInrrkJldWaCR2w34Fwf20x9p68bsyN0/yn9oM2VlWoJcJjR8hw1tN9AxHuA== - dependencies: - "@babel/runtime" "^7.17.8" - "@types/react-reconciler" "^0.26.7" - its-fine "^1.0.6" - react-reconciler "^0.27.0" - react-use-measure "^2.1.1" - scheduler "^0.21.0" - suspend-react "^0.0.8" - zustand "^3.7.1" - -"@resvg/resvg-wasm@2.4.1": - version "2.4.1" - resolved "https://registry.yarnpkg.com/@resvg/resvg-wasm/-/resvg-wasm-2.4.1.tgz#88f7a08107bf5ea691b016e55e6db955c85d845c" - integrity sha512-yi6R0HyHtsoWTRA06Col4WoDs7SvlXU3DLMNP2bdAgs7HK18dTEVl1weXgxRzi8gwLteGUbIg29zulxIB3GSdg== +"@popperjs/core@^2.11.8": + version "2.11.8" + resolved "https://registry.yarnpkg.com/@popperjs/core/-/core-2.11.8.tgz#6b79032e760a0899cd4204710beede972a3a185f" + integrity sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A== "@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" - integrity sha512-sXo/qW2/pAcmT43VoRKOJbDOfV3cYpq3szSVfIThQXNt+E4DfKj361vaAt3c88U5tPUxzEswam7GW48PJqtKAg== - -"@shuding/opentype.js@1.4.0-beta.0": - version "1.4.0-beta.0" - resolved "https://registry.yarnpkg.com/@shuding/opentype.js/-/opentype.js-1.4.0-beta.0.tgz#5d1e7e9e056f546aad41df1c5043f8f85d39e24b" - integrity sha512-3NgmNyH3l/Hv6EvsWJbsvpcpUba6R8IREQ83nH83cyakCw7uM1arZKNfHwv1Wz6jgqrF/j4x5ELvR6PnK9nTcA== - dependencies: - fflate "^0.7.3" - string.prototype.codepointat "^0.2.1" + version "1.3.3" + resolved "https://registry.yarnpkg.com/@rushstack/eslint-patch/-/eslint-patch-1.3.3.tgz#16ab6c727d8c2020a5b6e4a176a243ecd88d8d69" + integrity sha512-0xd7qez0AQ+MbHatZTlI1gu5vkG8r7MYRUJAHPAHJBmGLs16zpkrpAVLvjQKQOqaXPDUBwOiJzNc00znHSCVBw== "@swc/helpers@0.5.1": version "0.5.1" @@ -502,9 +508,9 @@ postcss-selector-parser "6.0.10" "@trivago/prettier-plugin-sort-imports@^4.1.1": - version "4.1.1" - resolved "https://registry.yarnpkg.com/@trivago/prettier-plugin-sort-imports/-/prettier-plugin-sort-imports-4.1.1.tgz#71c3c1ae770c3738b6fc85710714844477574ffd" - integrity sha512-dQ2r2uzNr1x6pJsuh/8x0IRA3CBUB+pWEW3J/7N98axqt7SQSm+2fy0FLNXvXGg77xEDC7KHxJlHfLYyi7PDcw== + version "4.2.0" + resolved "https://registry.yarnpkg.com/@trivago/prettier-plugin-sort-imports/-/prettier-plugin-sort-imports-4.2.0.tgz#b240366f9e2bda8e14edb18b14ea084e0ec25968" + integrity sha512-YBepjbt+ZNBVmN3ev1amQH3lWCmHyt5qTbLCp/syXJRu/Kw2koXh44qayB1gMRxcL/gV8egmjN5xWSrYyfUtyw== dependencies: "@babel/generator" "7.17.7" "@babel/parser" "^7.20.5" @@ -513,6 +519,13 @@ javascript-natural-sort "0.7.1" lodash "^4.17.21" +"@types/acorn@^4.0.0": + version "4.0.6" + resolved "https://registry.yarnpkg.com/@types/acorn/-/acorn-4.0.6.tgz#d61ca5480300ac41a7d973dd5b84d0a591154a22" + integrity sha512-veQTnWP+1D/xbxVrPC3zHnCZRjSrKfhbMUlEA43iMZLu7EsnTtkJklIuwrCPbOi8YkvDQAiW05VQQFvvz9oieQ== + dependencies: + "@types/estree" "*" + "@types/cors@^2.8.13": version "2.8.13" resolved "https://registry.yarnpkg.com/@types/cors/-/cors-2.8.13.tgz#b8ade22ba455a1b8cb3b5d3f35910fd204f84f94" @@ -521,23 +534,40 @@ "@types/node" "*" "@types/debug@^4.0.0": - version "4.1.7" - resolved "https://registry.yarnpkg.com/@types/debug/-/debug-4.1.7.tgz#7cc0ea761509124709b8b2d1090d8f6c17aadb82" - integrity sha512-9AonUzyTjXXhEOa0DnqpzZi6VHlqKMswga9EXjpXnnqxwLtdvPPtlO8evrI5D9S6asFRCQ6v+wpiUKbw+vKqyg== + version "4.1.8" + resolved "https://registry.yarnpkg.com/@types/debug/-/debug-4.1.8.tgz#cef723a5d0a90990313faec2d1e22aee5eecb317" + integrity sha512-/vPO1EPOs306Cvhwv7KfVfYvOJqA/S/AXjaHQiJboCZzcNDb+TIJFN9/2C9DZ//ijSKWioNyUxD792QmDJ+HKQ== dependencies: "@types/ms" "*" +"@types/estree-jsx@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@types/estree-jsx/-/estree-jsx-1.0.0.tgz#7bfc979ab9f692b492017df42520f7f765e98df1" + integrity sha512-3qvGd0z8F2ENTGr/GG1yViqfiKmRfrXVx5sJyHGFu3z7m5g5utCQtGp/g29JnjflhtQJBv1WDQukHiT58xPcYQ== + dependencies: + "@types/estree" "*" + +"@types/estree@*", "@types/estree@^1.0.0": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.1.tgz#aa22750962f3bf0e79d753d3cc067f010c95f194" + integrity sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA== + "@types/extend@^3.0.0": version "3.0.1" resolved "https://registry.yarnpkg.com/@types/extend/-/extend-3.0.1.tgz#923dc2d707d944382433e01d6cc0c69030ab2c75" integrity sha512-R1g/VyKFFI2HLC1QGAeTtCBWCo6n75l41OnsVYNbmKG+kempOESaodf6BeJyUM3Q0rKa/NQcTHbB2+66lNnxLw== "@types/hast@^2.0.0", "@types/hast@^2.3.2": - version "2.3.4" - resolved "https://registry.yarnpkg.com/@types/hast/-/hast-2.3.4.tgz#8aa5ef92c117d20d974a82bdfb6a648b08c0bafc" - integrity sha512-wLEm0QvaoawEDoTRwzTXp4b4jpwiJDvR5KMnFnVodm3scufTlBOWRD6N1OBf9TZMhjlNsSfcO5V+7AF4+Vy+9g== + version "2.3.5" + resolved "https://registry.yarnpkg.com/@types/hast/-/hast-2.3.5.tgz#08caac88b44d0fdd04dc17a19142355f43bd8a7a" + integrity sha512-SvQi0L/lNpThgPoleH53cdjB3y9zpLlVjRbqB3rH8hx1jiRSBGAhyjV3H+URFjNVRqt2EdYNrbZE5IsGlNfpRg== dependencies: - "@types/unist" "*" + "@types/unist" "^2" + +"@types/json-schema@^7.0.8": + version "7.0.12" + resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.12.tgz#d70faba7039d5fca54c83c7dbab41051d2b6f6cb" + integrity sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA== "@types/json5@^0.0.29": version "0.0.29" @@ -557,16 +587,21 @@ integrity sha512-+2FW2CcT0K3P+JMR8YG846bmDwplKUTsWgT2ENwdQ1UdVfRk3GQrh6Mi4sTopy30gI8Uau5CEqHTDZ6YvWIUPA== "@types/katex@^0.16.0": - version "0.16.0" - resolved "https://registry.yarnpkg.com/@types/katex/-/katex-0.16.0.tgz#0e640df3647fe237212be863e1f5111eb9754f93" - integrity sha512-hz+S3nV6Mym5xPbT9fnO8dDhBFQguMYpY0Ipxv06JMi1ORgnEM4M1ymWDUhUNer3ElLmT583opRo4RzxKmh9jw== + version "0.16.2" + resolved "https://registry.yarnpkg.com/@types/katex/-/katex-0.16.2.tgz#aa56983b722ccbc4aa81d11d117aa9c687b69b73" + integrity sha512-dHsSjSlU/EWEEbeNADr3FtZZOAXPkFPUO457QCnoNqcZQXNqNEu/svQd0Nritvd3wNff4vvC/f4e6xgX3Llt8A== "@types/mdast@^3.0.0": - version "3.0.11" - resolved "https://registry.yarnpkg.com/@types/mdast/-/mdast-3.0.11.tgz#dc130f7e7d9306124286f6d6cee40cf4d14a3dc0" - integrity sha512-Y/uImid8aAwrEA24/1tcRZwpxX3pIFTSilcNDKSPn+Y2iDywSEachzRuvgAYYLR3wpGXAsMbv5lvKLDZLeYPAw== + version "3.0.12" + resolved "https://registry.yarnpkg.com/@types/mdast/-/mdast-3.0.12.tgz#beeb511b977c875a5b0cc92eab6fcac2f0895514" + integrity sha512-DT+iNIRNX884cx0/Q1ja7NyUPpZuv0KPyL5rGNxm1WC1OtHstl7n4Jb7nk+xacNShQMbczJjt8uFzznpp6kYBg== dependencies: - "@types/unist" "*" + "@types/unist" "^2" + +"@types/mdx@^2.0.0": + version "2.0.7" + resolved "https://registry.yarnpkg.com/@types/mdx/-/mdx-2.0.7.tgz#c7482e995673e01b83f8e96df83b3843ea76401f" + integrity sha512-BG4tyr+4amr3WsSEmHn/fXPqaCba/AYZ7dsaQTiavihQunHSIxk+uAtqsjvicNpyHN6cm+B9RVrUOtW9VzIKHw== "@types/mime-types@^2.1.1": version "2.1.1" @@ -578,30 +613,27 @@ resolved "https://registry.yarnpkg.com/@types/ms/-/ms-0.7.31.tgz#31b7ca6407128a3d2bbc27fe2d21b345397f6197" integrity sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA== +"@types/mustache@^4.2.2": + version "4.2.2" + resolved "https://registry.yarnpkg.com/@types/mustache/-/mustache-4.2.2.tgz#825bf5c214c3ab84d0b23fef2c8eb898f3ff8717" + integrity sha512-MUSpfpW0yZbTgjekDbH0shMYBUD+X/uJJJMm9LXN1d5yjl5lCY1vN/eWKD6D1tOtjA6206K0zcIPnUaFMurdNA== + "@types/node@*": - version "20.2.1" - resolved "https://registry.yarnpkg.com/@types/node/-/node-20.2.1.tgz#de559d4b33be9a808fd43372ccee822c70f39704" - integrity sha512-DqJociPbZP1lbZ5SQPk4oag6W7AyaGMO6gSfRwq3PWl4PXTwJpRQJhDq4W0kzrg3w6tJ1SwlvGZ5uKFHY13LIg== + version "20.5.7" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.5.7.tgz#4b8ecac87fbefbc92f431d09c30e176fc0a7c377" + integrity sha512-dP7f3LdZIysZnmvP3ANJYTSwg+wLLl8p7RqniVlV7j+oXSXAbt9h0WIBFmJy5inWZoX9wZN6eXx+YXd9Rh3RBA== "@types/node@18.15.11": version "18.15.11" resolved "https://registry.yarnpkg.com/@types/node/-/node-18.15.11.tgz#b3b790f09cb1696cffcec605de025b088fa4225f" integrity sha512-E5Kwq2n4SbMzQOn6wnmBjuK9ouqlURrcZDVfbo9ftDDTFt3nk7ZKK4GMOzoYgnpQJKcxwQw+lGaBvvlMo0qN/Q== -"@types/node@^14.14.31": - version "14.18.47" - resolved "https://registry.yarnpkg.com/@types/node/-/node-14.18.47.tgz#89a56b05804d136cb99bf2f823bb00814a889aae" - integrity sha512-OuJi8bIng4wYHHA3YpKauL58dZrPxro3d0tabPHyiNF8rKfGKuVfr83oFlPLmKri1cX+Z3cJP39GXmnqkP11Gw== - -"@types/nprogress@^0.2.0": - version "0.2.0" - resolved "https://registry.yarnpkg.com/@types/nprogress/-/nprogress-0.2.0.tgz#86c593682d4199212a0509cc3c4d562bbbd6e45f" - integrity sha512-1cYJrqq9GezNFPsWTZpFut/d4CjpZqA0vhqDUPFWYKF1oIyBz5qnoYMzR+0C/T96t3ebLAC1SSnwrVOm5/j74A== - -"@types/offscreencanvas@^2019.6.4": - version "2019.7.0" - resolved "https://registry.yarnpkg.com/@types/offscreencanvas/-/offscreencanvas-2019.7.0.tgz#e4a932069db47bb3eabeb0b305502d01586fa90d" - integrity sha512-PGcyveRIpL1XIqK8eBsmRBt76eFgtzuPiSTyKHZxnGemp2yzGzWpjYKAfK3wIMiU7eH+851yEpiuP8JZerTmWg== +"@types/papaparse@^5.3.5": + version "5.3.8" + resolved "https://registry.yarnpkg.com/@types/papaparse/-/papaparse-5.3.8.tgz#6b4b5156183987b4d1816fec45bbc6aad40e337e" + integrity sha512-ArKIEOOWULbhi53wkAiRy1ze4wvrTfhpAj7Yfzva+EkmX2sV8PpFB+xqzJfzXNzK4me95FJH9QZt5NXFVGzOoQ== + dependencies: + "@types/node" "*" "@types/parse5@^6.0.0": version "6.0.3" @@ -625,24 +657,10 @@ dependencies: "@types/react" "*" -"@types/react-reconciler@^0.26.7": - version "0.26.7" - resolved "https://registry.yarnpkg.com/@types/react-reconciler/-/react-reconciler-0.26.7.tgz#0c4643f30821ae057e401b0d9037e03e8e9b2a36" - integrity sha512-mBDYl8x+oyPX/VBb3E638N0B7xG+SPk/EAMcVPeexqus/5aTpTphQi0curhhshOqRrc9t6OPoJfEUkbymse/lQ== - dependencies: - "@types/react" "*" - -"@types/react-reconciler@^0.28.0": - version "0.28.2" - resolved "https://registry.yarnpkg.com/@types/react-reconciler/-/react-reconciler-0.28.2.tgz#f16b0e8cc4748af70ca975eaaace0d79582c71fa" - integrity sha512-8tu6lHzEgYPlfDf/J6GOQdIc+gs+S2yAqlby3zTsB3SP2svlqTYe5fwZNtZyfactP74ShooP2vvi1BOp9ZemWw== - dependencies: - "@types/react" "*" - -"@types/react@*": - version "18.2.6" - resolved "https://registry.yarnpkg.com/@types/react/-/react-18.2.6.tgz#5cd53ee0d30ffc193b159d3516c8c8ad2f19d571" - integrity sha512-wRZClXn//zxCFW+ye/D2qY65UsYP1Fpex2YXorHc8awoNamkMZSvBxwxdYVInsHOZZd2Ppq8isnSzJL5Mpf8OA== +"@types/react@*", "@types/react@>=16": + version "18.2.21" + resolved "https://registry.yarnpkg.com/@types/react/-/react-18.2.21.tgz#774c37fd01b522d0b91aed04811b58e4e0514ed9" + integrity sha512-neFKG/sBAwGxHgXiIxnbm3/AAVQ/cMRS93hvBpg8xYRbeQSPVABp9U2bRnPf0iI4+Ucdv3plSxKK+3CW2ENJxA== dependencies: "@types/prop-types" "*" "@types/scheduler" "*" @@ -662,16 +680,6 @@ resolved "https://registry.yarnpkg.com/@types/scheduler/-/scheduler-0.16.3.tgz#cef09e3ec9af1d63d2a6cc5b383a737e24e6dcf5" integrity sha512-5cJ8CB4yAx7BH1oMvdU0Jh9lrEXyPkar6F9G/ERswkCuvP4KQZfZkSjcMbAICCpQTN4OuZn8tz0HiKv9TGZgrQ== -"@types/sinonjs__fake-timers@8.1.1": - version "8.1.1" - resolved "https://registry.yarnpkg.com/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-8.1.1.tgz#b49c2c70150141a15e0fa7e79cf1f92a72934ce3" - integrity sha512-0kSuKjAS0TrGLJ0M/+8MaFkGsQhZpB6pxOmvS3K8FYI72K//YmdfoW9X2qPsAKh1mkwxGD5zib9s1FIFed6E8g== - -"@types/sizzle@^2.3.2": - version "2.3.3" - resolved "https://registry.yarnpkg.com/@types/sizzle/-/sizzle-2.3.3.tgz#ff5e2f1902969d305225a047c8a0fd5c915cebef" - integrity sha512-JYM8x9EGF163bEyhdJBpR2QX1R5naCJHC8ucJylJ3w9/CVBaskdQ8WqBf8MmQrd1kRvp/a4TS8HJ+bxzR7ZJYQ== - "@types/stats.js@*": version "0.17.0" resolved "https://registry.yarnpkg.com/@types/stats.js/-/stats.js-0.17.0.tgz#0ed81d48e03b590c24da85540c1d952077a9fe20" @@ -687,109 +695,70 @@ fflate "~0.6.9" lil-gui "~0.17.0" -"@types/unist@*", "@types/unist@^2.0.0": - version "2.0.6" - resolved "https://registry.yarnpkg.com/@types/unist/-/unist-2.0.6.tgz#250a7b16c3b91f672a24552ec64678eeb1d3a08d" - integrity sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ== +"@types/unist@^2", "@types/unist@^2.0.0": + version "2.0.8" + resolved "https://registry.yarnpkg.com/@types/unist/-/unist-2.0.8.tgz#bb197b9639aa1a04cf464a617fe800cccd92ad5c" + integrity sha512-d0XxK3YTObnWVp6rZuev3c49+j4Lo8g4L1ZRm9z5L0xpoZycUPshHgczK5gsUMaZOstjVYYi09p5gYvUtfChYw== "@types/webxr@*": - version "0.5.2" - resolved "https://registry.yarnpkg.com/@types/webxr/-/webxr-0.5.2.tgz#5d9627b0ffe223aa3b166de7112ac8a9460dc54f" - integrity sha512-szL74BnIcok9m7QwYtVmQ+EdIKwbjPANudfuvDrAF8Cljg9MKUlIoc1w5tjj9PMpeSH3U1Xnx//czQybJ0EfSw== + version "0.5.4" + resolved "https://registry.yarnpkg.com/@types/webxr/-/webxr-0.5.4.tgz#3d55a6427f9281d456843d754c99bf7804657fe3" + integrity sha512-41gfGLTtqXZhcmoDlLDHqMJDuwAMwhHwXf9Q2job3TUBsvkNfPNI/3IWVEtLH4tyY1ElWtfwIaoNeqeEX238/Q== -"@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== +"@typescript-eslint/parser@^5.4.2 || ^6.0.0": + version "6.5.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-6.5.0.tgz#3d6ed231c5e307c5f5f4a0d86893ec01e92b8c77" + integrity sha512-LMAVtR5GN8nY0G0BadkG0XIe4AcNMeyEy3DyhKGAh9k4pLSMBO7rF29JvDBpZGCmp5Pgz5RLHP6eCpSYZJQDuQ== dependencies: - "@types/node" "*" - -"@typescript-eslint/parser@^5.42.0": - version "5.59.6" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.59.6.tgz#bd36f71f5a529f828e20b627078d3ed6738dbb40" - integrity sha512-7pCa6al03Pv1yf/dUg/s1pXz/yGMUBAw5EeWqNTFiSueKvRNonze3hma3lhdsOrQcaOXhbk5gKu2Fludiho9VA== - dependencies: - "@typescript-eslint/scope-manager" "5.59.6" - "@typescript-eslint/types" "5.59.6" - "@typescript-eslint/typescript-estree" "5.59.6" + "@typescript-eslint/scope-manager" "6.5.0" + "@typescript-eslint/types" "6.5.0" + "@typescript-eslint/typescript-estree" "6.5.0" + "@typescript-eslint/visitor-keys" "6.5.0" debug "^4.3.4" -"@typescript-eslint/scope-manager@5.59.6": - version "5.59.6" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.59.6.tgz#d43a3687aa4433868527cfe797eb267c6be35f19" - integrity sha512-gLbY3Le9Dxcb8KdpF0+SJr6EQ+hFGYFl6tVY8VxLPFDfUZC7BHFw+Vq7bM5lE9DwWPfx4vMWWTLGXgpc0mAYyQ== +"@typescript-eslint/scope-manager@6.5.0": + version "6.5.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-6.5.0.tgz#f2cb20895aaad41b3ad27cc3a338ce8598f261c5" + integrity sha512-A8hZ7OlxURricpycp5kdPTH3XnjG85UpJS6Fn4VzeoH4T388gQJ/PGP4ole5NfKt4WDVhmLaQ/dBLNDC4Xl/Kw== dependencies: - "@typescript-eslint/types" "5.59.6" - "@typescript-eslint/visitor-keys" "5.59.6" + "@typescript-eslint/types" "6.5.0" + "@typescript-eslint/visitor-keys" "6.5.0" -"@typescript-eslint/types@5.59.6": - version "5.59.6" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.59.6.tgz#5a6557a772af044afe890d77c6a07e8c23c2460b" - integrity sha512-tH5lBXZI7T2MOUgOWFdVNUILsI02shyQvfzG9EJkoONWugCG77NDDa1EeDGw7oJ5IvsTAAGVV8I3Tk2PNu9QfA== +"@typescript-eslint/types@6.5.0": + version "6.5.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-6.5.0.tgz#f4e55cfd99ac5346ea772770bf212a3e689a8f04" + integrity sha512-eqLLOEF5/lU8jW3Bw+8auf4lZSbbljHR2saKnYqON12G/WsJrGeeDHWuQePoEf9ro22+JkbPfWQwKEC5WwLQ3w== -"@typescript-eslint/typescript-estree@5.59.6": - version "5.59.6" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.59.6.tgz#2fb80522687bd3825504925ea7e1b8de7bb6251b" - integrity sha512-vW6JP3lMAs/Tq4KjdI/RiHaaJSO7IUsbkz17it/Rl9Q+WkQ77EOuOnlbaU8kKfVIOJxMhnRiBG+olE7f3M16DA== +"@typescript-eslint/typescript-estree@6.5.0": + version "6.5.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-6.5.0.tgz#1cef6bc822585e9ef89d88834bc902d911d747ed" + integrity sha512-q0rGwSe9e5Kk/XzliB9h2LBc9tmXX25G0833r7kffbl5437FPWb2tbpIV9wAATebC/018pGa9fwPDuvGN+LxWQ== dependencies: - "@typescript-eslint/types" "5.59.6" - "@typescript-eslint/visitor-keys" "5.59.6" + "@typescript-eslint/types" "6.5.0" + "@typescript-eslint/visitor-keys" "6.5.0" debug "^4.3.4" globby "^11.1.0" is-glob "^4.0.3" - semver "^7.3.7" - tsutils "^3.21.0" + semver "^7.5.4" + ts-api-utils "^1.0.1" -"@typescript-eslint/visitor-keys@5.59.6": - version "5.59.6" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.59.6.tgz#673fccabf28943847d0c8e9e8d008e3ada7be6bb" - integrity sha512-zEfbFLzB9ETcEJ4HZEEsCR9HHeNku5/Qw1jSS5McYJv5BR+ftYXwFFAH5Al+xkGaZEqowMwl7uoJjQb1YSPF8Q== +"@typescript-eslint/visitor-keys@6.5.0": + version "6.5.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-6.5.0.tgz#1a6f474a0170a447b76f0699ce6700110fd11436" + integrity sha512-yCB/2wkbv3hPsh02ZS8dFQnij9VVQXJMN/gbQsaaY+zxALkZnxa/wagvLEFsAWMPv7d7lxQmNsIzGU1w/T/WyA== dependencies: - "@typescript-eslint/types" "5.59.6" - eslint-visitor-keys "^3.3.0" + "@typescript-eslint/types" "6.5.0" + eslint-visitor-keys "^3.4.1" -"@upstash/redis@^1.20.4": - version "1.20.6" - resolved "https://registry.yarnpkg.com/@upstash/redis/-/redis-1.20.6.tgz#3d5773f2b463b19f612b6373fe516e6200a1762d" - integrity sha512-q1izaYEUsq/WiXNOjf4oOjFZe8fIeBSZN8d5cEyOD4nem+zxc4jccieorQQrNlEahKPE1ZYLzVEkMODRUfch2g== - dependencies: - isomorphic-fetch "^3.0.0" - -"@use-gesture/core@10.2.26": - version "10.2.26" - resolved "https://registry.yarnpkg.com/@use-gesture/core/-/core-10.2.26.tgz#c2fc4aa7d36cee7319a98a898b0698c66b01663e" - integrity sha512-NyFpQ3iID9iFBROXyyvU1D0NK+t+dP+WAVByhCvqHUenpxLD2NlRLVRpoK3XGGwksr6mU3PvZ2Nm4q0q+gLJPA== - -"@use-gesture/react@^10.2.24": - version "10.2.26" - resolved "https://registry.yarnpkg.com/@use-gesture/react/-/react-10.2.26.tgz#593549fed30ebcac71cfd197993eaede0795c098" - integrity sha512-0QhaE5mhaQbFlip4MX7n1nwCX8gax6Da1LsP2fZ/BU6xW9zyEmV6NX7DPelDxq1rr2NiBJh30vx9RIp80YeA/A== - dependencies: - "@use-gesture/core" "10.2.26" - -"@vercel/og@^0.5.4": - version "0.5.4" - resolved "https://registry.yarnpkg.com/@vercel/og/-/og-0.5.4.tgz#71de6335b94d0032b325936337c0259d85b9de19" - integrity sha512-o4Zjgw66HPtfGFYG4CFcKfnCcK6qCY+3FC6g22Z1SdAN5jN8XjbHCh3hRVHH5IGBQp8mxH941EcH53KimAm+wg== - dependencies: - "@resvg/resvg-wasm" "2.4.1" - satori "0.7.2" - yoga-wasm-web "0.3.3" - -"@webgpu/glslang@^0.0.15": - version "0.0.15" - resolved "https://registry.yarnpkg.com/@webgpu/glslang/-/glslang-0.0.15.tgz#f5ccaf6015241e6175f4b90906b053f88483d1f2" - integrity sha512-niT+Prh3Aff8Uf1MVBVUsaNjFj9rJAKDXuoHIKiQbB+6IUP/3J3JIhBNyZ7lDhytvXxw6ppgnwKZdDJ08UMj4Q== - -acorn-jsx@^5.3.2: +acorn-jsx@^5.0.0, acorn-jsx@^5.3.2: version "5.3.2" resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== -acorn@^8.8.0: - version "8.8.2" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.8.2.tgz#1b2f25db02af965399b9776b0c2c391276d37c4a" - integrity sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw== +acorn@^8.0.0, acorn@^8.9.0: + version "8.10.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.10.0.tgz#8be5b3907a67221a81ab23c7889c4c5526b62ec5" + integrity sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw== agent-base@6: version "6.0.2" @@ -798,15 +767,12 @@ agent-base@6: dependencies: debug "4" -aggregate-error@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.1.0.tgz#92670ff50f5359bdb7a3e0d40d0ec30c5737687a" - integrity sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA== - dependencies: - clean-stack "^2.0.0" - indent-string "^4.0.0" +ajv-keywords@^3.5.2: + version "3.5.2" + resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.5.2.tgz#31f29da5ab6e00d1c2d329acf7b5929614d5014d" + integrity sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ== -ajv@^6.10.0, ajv@^6.12.4: +ajv@^6.10.0, ajv@^6.12.4, ajv@^6.12.5: version "6.12.6" resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== @@ -816,18 +782,6 @@ ajv@^6.10.0, ajv@^6.12.4: json-schema-traverse "^0.4.1" uri-js "^4.2.2" -ansi-colors@^4.1.1: - version "4.1.3" - resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.3.tgz#37611340eb2243e70cc604cad35d63270d48781b" - integrity sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw== - -ansi-escapes@^4.3.0: - version "4.3.2" - resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e" - integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== - dependencies: - type-fest "^0.21.3" - ansi-regex@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" @@ -840,7 +794,7 @@ ansi-styles@^3.2.1: dependencies: color-convert "^1.9.0" -ansi-styles@^4.0.0, ansi-styles@^4.1.0: +ansi-styles@^4.1.0: version "4.3.0" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== @@ -860,11 +814,6 @@ anymatch@~3.1.2: normalize-path "^3.0.0" picomatch "^2.0.4" -arch@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/arch/-/arch-2.2.0.tgz#1bc47818f305764f23ab3306b0bfc086c5a29d11" - integrity sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ== - arg@^5.0.2: version "5.0.2" resolved "https://registry.yarnpkg.com/arg/-/arg-5.0.2.tgz#c81433cc427c92c4dcf4865142dbca6f15acd59c" @@ -876,11 +825,11 @@ argparse@^2.0.1: integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== aria-query@^5.1.3: - version "5.1.3" - resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-5.1.3.tgz#19db27cd101152773631396f7a95a3b58c22c35e" - integrity sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ== + version "5.3.0" + resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-5.3.0.tgz#650c569e41ad90b51b3d7df5e5eed1c7549c103e" + integrity sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A== dependencies: - deep-equal "^2.0.5" + dequal "^2.0.3" array-buffer-byte-length@^1.0.0: version "1.0.0" @@ -890,7 +839,7 @@ array-buffer-byte-length@^1.0.0: call-bind "^1.0.2" is-array-buffer "^3.0.1" -array-includes@^3.1.5, array-includes@^3.1.6: +array-includes@^3.1.6: version "3.1.6" resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.6.tgz#9e9e720e194f198266ba9e18c29e6a9b0e4b225f" integrity sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw== @@ -906,6 +855,17 @@ array-union@^2.1.0: resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== +array.prototype.findlastindex@^1.2.2: + version "1.2.3" + resolved "https://registry.yarnpkg.com/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.3.tgz#b37598438f97b579166940814e2c0493a4f50207" + integrity sha512-LzLoiOMAxvy+Gd3BAq3B7VeIgPdo+Q8hthvKtXybMvRV0jrXfJM/t8mw7nNlpEcVlVUnCnM2KSX4XU5HmpodOA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + es-shim-unscopables "^1.0.0" + get-intrinsic "^1.2.1" + array.prototype.flat@^1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.3.1.tgz#ffc6576a7ca3efc2f46a143b9d1dda9b4b3cf5e2" @@ -937,48 +897,45 @@ array.prototype.tosorted@^1.1.1: es-shim-unscopables "^1.0.0" get-intrinsic "^1.1.3" +arraybuffer.prototype.slice@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.1.tgz#9b5ea3868a6eebc30273da577eb888381c0044bb" + integrity sha512-09x0ZWFEjj4WD8PDbykUwo3t9arLn8NIzmmYEJFpYekOAQjpkGSyrQhNoRTcwwcFRu+ycWF78QZ63oWTqSjBcw== + dependencies: + array-buffer-byte-length "^1.0.0" + call-bind "^1.0.2" + define-properties "^1.2.0" + get-intrinsic "^1.2.1" + is-array-buffer "^3.0.2" + is-shared-array-buffer "^1.0.2" + arrify@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/arrify/-/arrify-2.0.1.tgz#c9655e9331e0abcd588d2a7cad7e9956f66701fa" integrity sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug== -asn1@~0.2.3: - version "0.2.6" - resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.6.tgz#0d3a7bb6e64e02a90c0303b31f292868ea09a08d" - integrity sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ== - dependencies: - safer-buffer "~2.1.0" - -assert-plus@1.0.0, assert-plus@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" - integrity sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw== - ast-types-flow@^0.0.7: version "0.0.7" resolved "https://registry.yarnpkg.com/ast-types-flow/-/ast-types-flow-0.0.7.tgz#f70b735c6bca1a5c9c22d982c3e39e7feba3bdad" integrity sha512-eBvWn1lvIApYMhzQMsu9ciLfkBY499mFZlNqG+/9WR7PVlroQw0vG30cOQQbaKz3sCEc44TAOu2ykzqXSNnwag== -astral-regex@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31" - integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ== +astring@^1.8.0: + version "1.8.6" + resolved "https://registry.yarnpkg.com/astring/-/astring-1.8.6.tgz#2c9c157cf1739d67561c56ba896e6948f6b93731" + integrity sha512-ISvCdHdlTDlH5IpxQJIex7BWBywFWgjJSVdwst+/iQCoEYnyOaQ95+X1JGshuBjGp6nxKUy1jMgE3zPqN7fQdg== -async@^3.2.0: - version "3.2.4" - resolved "https://registry.yarnpkg.com/async/-/async-3.2.4.tgz#2d22e00f8cddeb5fde5dd33522b56d1cf569a81c" - integrity sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ== +asynciterator.prototype@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/asynciterator.prototype/-/asynciterator.prototype-1.0.0.tgz#8c5df0514936cdd133604dfcc9d3fb93f09b2b62" + integrity sha512-wwHYEIS0Q80f5mosx3L/dfG5t5rjEa9Ft51GTaNt862EnpyGHpgz2RkZvLPp1oF5TnAiTohkEKVEu8pQPJI7Vg== + dependencies: + has-symbols "^1.0.3" asynckit@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== -at-least-node@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/at-least-node/-/at-least-node-1.0.0.tgz#602cd4b46e844ad4effc92a8011a3c46e0238dc2" - integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg== - autoprefixer@10.4.14: version "10.4.14" resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-10.4.14.tgz#e28d49902f8e759dd25b153264e862df2705f79d" @@ -996,36 +953,37 @@ available-typed-arrays@^1.0.5: resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz#92f95616501069d07d10edb2fc37d3e1c65123b7" integrity sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw== -aws-sign2@~0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" - integrity sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA== - -aws4@^1.8.0: - version "1.12.0" - resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.12.0.tgz#ce1c9d143389679e253b314241ea9aa5cec980d3" - integrity sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg== - axe-core@^4.6.2: - version "4.7.1" - resolved "https://registry.yarnpkg.com/axe-core/-/axe-core-4.7.1.tgz#04392c9ccb3d7d7c5d2f8684f148d56d3442f33d" - integrity sha512-sCXXUhA+cljomZ3ZAwb8i1p3oOlkABzPy08ZDAoGcYuvtBPlQ1Ytde129ArXyHWDhfeewq7rlx9F+cUx2SSlkg== + version "4.7.2" + resolved "https://registry.yarnpkg.com/axe-core/-/axe-core-4.7.2.tgz#040a7342b20765cb18bb50b628394c21bccc17a0" + integrity sha512-zIURGIS1E1Q4pcrMjp+nnEh+16G56eG/MUllJH8yEvw7asDo7Ac9uhC9KIH5jzpITueEZolfYglnCGIuSBz39g== axios@^1.3.5: - version "1.4.0" - resolved "https://registry.yarnpkg.com/axios/-/axios-1.4.0.tgz#38a7bf1224cd308de271146038b551d725f0be1f" - integrity sha512-S4XCWMEmzvo64T9GfvQDOXgYRDJ/wsSZc7Jvdgx5u1sd0JwsuPLqb3SYmusag+edF6ziyMensPVqLTSc1PiSEA== + version "1.5.0" + resolved "https://registry.yarnpkg.com/axios/-/axios-1.5.0.tgz#f02e4af823e2e46a9768cfc74691fdd0517ea267" + integrity sha512-D4DdjDo5CY50Qms0qGQTTw6Q44jl7zRwY7bthds06pUGfChBCTcQs+N743eFWGEd6pRTMd6A+I87aWyFV5wiZQ== dependencies: follow-redirects "^1.15.0" form-data "^4.0.0" proxy-from-env "^1.1.0" axobject-query@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/axobject-query/-/axobject-query-3.1.1.tgz#3b6e5c6d4e43ca7ba51c5babf99d22a9c68485e1" - integrity sha512-goKlv8DZrK9hUh975fnHzhNIO4jUnFCfv/dszV5VwUGDFjI6vQ2VwoyjYjYNEbBE8AH87TduWP5uyDR1D+Iteg== + version "3.2.1" + resolved "https://registry.yarnpkg.com/axobject-query/-/axobject-query-3.2.1.tgz#39c378a6e3b06ca679f29138151e45b2b32da62a" + integrity sha512-jsyHu61e6N4Vbz/v18DHwWYKK0bSWLqn47eeDSKPB7m8tqMHF9YJ+mhIk2lVteyZrY8tnSj/jHOv4YiTCuCJgg== dependencies: - deep-equal "^2.0.5" + dequal "^2.0.3" + +"babel-plugin-styled-components@>= 1.12.0": + version "2.1.4" + resolved "https://registry.yarnpkg.com/babel-plugin-styled-components/-/babel-plugin-styled-components-2.1.4.tgz#9a1f37c7f32ef927b4b008b529feb4a2c82b1092" + integrity sha512-Xgp9g+A/cG47sUyRwwYxGM4bR/jDRg5N6it/8+HxCnbT5XNKSKDT9xm4oag/osgqjC2It/vH0yXsomOG6k558g== + dependencies: + "@babel/helper-annotate-as-pure" "^7.22.5" + "@babel/helper-module-imports" "^7.22.5" + "@babel/plugin-syntax-jsx" "^7.22.5" + lodash "^4.17.21" + picomatch "^2.3.1" bail@^2.0.0: version "2.0.2" @@ -1037,62 +995,26 @@ 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@0.0.8: - version "0.0.8" - resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-0.0.8.tgz#1101e9544f4a76b1bc3b26d452ca96d7a35e7978" - integrity sha512-3XSA2cR/h/73EzlXXdU6YNycmYI7+kicTxks4eJg2g39biHR84slg2+des+p7iHYhbRg/udIS4TD53WabcOUkw== - -base64-js@^1.3.0, base64-js@^1.3.1: +base64-js@^1.3.0: version "1.5.1" resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== -bcrypt-pbkdf@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e" - integrity sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w== - dependencies: - tweetnacl "^0.14.3" - -bidi-js@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/bidi-js/-/bidi-js-1.0.2.tgz#1a497a762c2ddea377429d2649c9ce0f8a91527f" - integrity sha512-rzSy/k7WdX5zOyeHHCOixGXbCHkyogkxPKL2r8QtzHmVQDiWCXUWa18bLdMWT9CYMLOYTjWpTHawuev2ouYJVw== - dependencies: - require-from-string "^2.0.2" - -big-integer@^1.6.44: - version "1.6.51" - resolved "https://registry.yarnpkg.com/big-integer/-/big-integer-1.6.51.tgz#0df92a5d9880560d3ff2d5fd20245c889d130686" - integrity sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg== +big.js@^5.2.2: + version "5.2.2" + resolved "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328" + integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ== bignumber.js@^9.0.0: - version "9.1.1" - resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-9.1.1.tgz#c4df7dc496bd849d4c9464344c1aa74228b4dac6" - integrity sha512-pHm4LsMJ6lzgNGVfZHjMoO8sdoRhOzOH4MLmY65Jg70bpxCKu5iOHNJyfF6OyvYw7t8Fpf35RuzUyqnQsj8Vig== + version "9.1.2" + resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-9.1.2.tgz#b7c4242259c008903b13707983b5f4bbd31eda0c" + integrity sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug== binary-extensions@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== -blob-util@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/blob-util/-/blob-util-2.0.2.tgz#3b4e3c281111bb7f11128518006cdc60b403a1eb" - integrity sha512-T7JQa+zsXXEa6/8ZhHcQEW1UFfVM49Ts65uBkFL6fz2QmrElqmbajIDJvuA0tEhRe5eIjpV9ZF+0RfZR9voJFQ== - -bluebird@^3.7.2: - version "3.7.2" - resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" - integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== - -bplist-parser@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/bplist-parser/-/bplist-parser-0.2.0.tgz#43a9d183e5bf9d545200ceac3e712f79ebbe8d0e" - integrity sha512-z0M+byMThzQmD9NILRniCUXYsYpjwnlO8N5uCFaCqIOpqRsJCrQL9NK3JsD67CN5a08nF5oIL2bD6loTdHOuKw== - dependencies: - big-integer "^1.6.44" - brace-expansion@^1.1.7: version "1.1.11" resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" @@ -1109,40 +1031,20 @@ braces@^3.0.2, braces@~3.0.2: fill-range "^7.0.1" browserslist@^4.21.5: - version "4.21.5" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.21.5.tgz#75c5dae60063ee641f977e00edd3cfb2fb7af6a7" - integrity sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w== + version "4.21.10" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.21.10.tgz#dbbac576628c13d3b2231332cb2ec5a46e015bb0" + integrity sha512-bipEBdZfVH5/pwrvqc+Ub0kUPVfGUhlKxbvfD+z1BDnPEO/X98ruXGA1WP5ASpAFKan7Qr6j736IacbZQuAlKQ== dependencies: - caniuse-lite "^1.0.30001449" - electron-to-chromium "^1.4.284" - node-releases "^2.0.8" - update-browserslist-db "^1.0.10" - -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== + caniuse-lite "^1.0.30001517" + electron-to-chromium "^1.4.477" + node-releases "^2.0.13" + update-browserslist-db "^1.0.11" buffer-equal-constant-time@1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz#f8e71132f7ffe6e01a5c9697a4c6f3e48d5cc819" integrity sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA== -buffer@^5.6.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" - -bundle-name@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/bundle-name/-/bundle-name-3.0.0.tgz#ba59bcc9ac785fb67ccdbf104a2bf60c099f0e1a" - integrity sha512-PKA4BeSvBpQKQ8iPOGCSiell+N8P+Tf1DlwqmYhpe2gAhKPHn8EYOxVT+ShuGmhg8lN8XiSlS80yiExKXrURlw== - dependencies: - run-applescript "^5.0.0" - busboy@1.6.0: version "1.6.0" resolved "https://registry.yarnpkg.com/busboy/-/busboy-1.6.0.tgz#966ea36a9502e43cdb9146962523b92f531f6893" @@ -1150,11 +1052,6 @@ busboy@1.6.0: dependencies: streamsearch "^1.1.0" -cachedir@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/cachedir/-/cachedir-2.3.0.tgz#0c75892a052198f0b21c7c1804d8331edfcae0e8" - integrity sha512-A+Fezp4zxnit6FanDmv9EqXNAi3vt9DWp51/71UEhXukb7QUuvtv9344h91dyAxuTLoSYJFU299qzR3tzwPAhw== - 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" @@ -1178,27 +1075,17 @@ camelize@^1.0.0: resolved "https://registry.yarnpkg.com/camelize/-/camelize-1.0.1.tgz#89b7e16884056331a35d6b5ad064332c91daa6c3" integrity sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ== -camera-controls@^2.3.1: - version "2.3.5" - resolved "https://registry.yarnpkg.com/camera-controls/-/camera-controls-2.3.5.tgz#db00c6d0dfc6538b499ef94e47f31f5da81e7e83" - integrity sha512-T4AcGyUL4Dn2VIxEX5R+vDvrWNY4KqHziPwzUMca4zKCawf5KMbbcmVbuhUzohzm2DxTcr5gm5gNSmCXWVTyWQ== - -caniuse-lite@^1.0.30001406, caniuse-lite@^1.0.30001449, caniuse-lite@^1.0.30001464: - version "1.0.30001488" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001488.tgz#d19d7b6e913afae3e98f023db97c19e9ddc5e91f" - integrity sha512-NORIQuuL4xGpIy6iCCQGN4iFjlBXtfKWIenlUuyZJumLRIindLb7wXM+GO8erEhb7vXfcnf4BAg2PrSDN5TNLQ== - -caseless@~0.12.0: - version "0.12.0" - resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" - integrity sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw== +caniuse-lite@^1.0.30001406, caniuse-lite@^1.0.30001464, caniuse-lite@^1.0.30001517: + version "1.0.30001525" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001525.tgz#d2e8fdec6116ffa36284ca2c33ef6d53612fe1c8" + integrity sha512-/3z+wB4icFt3r0USMwxujAqRvaD/B7rvGTsKhbhSQErVrJvkZCLhgNLJxU8MevahQVH6hCU9FsHdNUFbiwmE7Q== ccount@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/ccount/-/ccount-2.0.1.tgz#17a3bf82302e0870d6da43a01311a8bc02a3ecf5" integrity sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg== -chalk@^2.0.0: +chalk@^2.4.2: version "2.4.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== @@ -1207,7 +1094,7 @@ chalk@^2.0.0: escape-string-regexp "^1.0.5" supports-color "^5.3.0" -chalk@^4.0.0, chalk@^4.1.0: +chalk@^4.0.0: version "4.1.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== @@ -1215,6 +1102,11 @@ chalk@^4.0.0, chalk@^4.1.0: ansi-styles "^4.1.0" supports-color "^7.1.0" +character-entities-html4@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/character-entities-html4/-/character-entities-html4-2.1.0.tgz#1f1adb940c971a4b22ba39ddca6b618dc6e56b2b" + integrity sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA== + character-entities-legacy@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz#76bc83a90738901d7bc223a9e93759fdd560125b" @@ -1230,23 +1122,6 @@ character-reference-invalid@^2.0.0: resolved "https://registry.yarnpkg.com/character-reference-invalid/-/character-reference-invalid-2.0.1.tgz#85c66b041e43b47210faf401278abf808ac45cb9" integrity sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw== -check-more-types@^2.24.0: - version "2.24.0" - resolved "https://registry.yarnpkg.com/check-more-types/-/check-more-types-2.24.0.tgz#1420ffb10fd444dcfc79b43891bbfffd32a84600" - integrity sha512-Pj779qHxV2tuapviy1bSZNEL1maXr13bPYpsvSDB68HlYcYuhlDrmGd63i0JHMCLKzc7rUSNIrpdJlhVlNwrxA== - -chevrotain@^10.1.2: - version "10.5.0" - resolved "https://registry.yarnpkg.com/chevrotain/-/chevrotain-10.5.0.tgz#9c1dc62ef0753bb562dbe521b5f72d041bad624e" - integrity sha512-Pkv5rBY3+CsHOYfV5g/Vs5JY9WTHHDEKOlohI2XeygaZhUeqhAlldZ8Hz9cRmxu709bvS08YzxHdTPHhffc13A== - dependencies: - "@chevrotain/cst-dts-gen" "10.5.0" - "@chevrotain/gast" "10.5.0" - "@chevrotain/types" "10.5.0" - "@chevrotain/utils" "10.5.0" - lodash "4.17.21" - regexp-to-ast "0.5.0" - chokidar@^3.5.3: version "3.5.3" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd" @@ -1262,40 +1137,6 @@ chokidar@^3.5.3: optionalDependencies: fsevents "~2.3.2" -ci-info@^3.2.0: - version "3.8.0" - resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.8.0.tgz#81408265a5380c929f0bc665d62256628ce9ef91" - integrity sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw== - -clean-stack@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" - integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== - -cli-cursor@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-3.1.0.tgz#264305a7ae490d1d03bf0c9ba7c925d1753af307" - integrity sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw== - dependencies: - restore-cursor "^3.1.0" - -cli-table3@~0.6.1: - version "0.6.3" - resolved "https://registry.yarnpkg.com/cli-table3/-/cli-table3-0.6.3.tgz#61ab765aac156b52f222954ffc607a6f01dbeeb2" - integrity sha512-w5Jac5SykAeZJKntOxJCrm63Eg5/4dhMWIcuTbo9rpE+brgaSZo0RuNJZeOyMgsUdhDeojvgyQLmjI+K50ZGyg== - dependencies: - string-width "^4.2.0" - optionalDependencies: - "@colors/colors" "1.5.0" - -cli-truncate@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/cli-truncate/-/cli-truncate-2.1.0.tgz#c39e28bf05edcde5be3b98992a22deed5a2b93c7" - integrity sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg== - dependencies: - slice-ansi "^3.0.0" - string-width "^4.2.0" - client-only@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/client-only/-/client-only-0.0.1.tgz#38bba5d403c41ab150bff64a95c85013cf73bca1" @@ -1330,12 +1171,7 @@ color-name@^1.1.4, color-name@~1.1.4: resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== -colorette@^2.0.16: - version "2.0.20" - resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.20.tgz#9eb793e6833067f7235902fcd3b09917a000a95a" - integrity sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w== - -combined-stream@^1.0.6, combined-stream@^1.0.8, combined-stream@~1.0.6: +combined-stream@^1.0.8: version "1.0.8" resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== @@ -1352,40 +1188,22 @@ commander@^4.0.0: resolved "https://registry.yarnpkg.com/commander/-/commander-4.1.1.tgz#9fd602bd936294e9e9ef46a3f4d6964044b18068" integrity sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA== -commander@^6.2.1: - version "6.2.1" - resolved "https://registry.yarnpkg.com/commander/-/commander-6.2.1.tgz#0792eb682dfbc325999bb2b84fddddba110ac73c" - integrity sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA== - commander@^8.3.0: version "8.3.0" resolved "https://registry.yarnpkg.com/commander/-/commander-8.3.0.tgz#4837ea1b2da67b9c616a67afbb0fafee567bca66" integrity sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww== -common-tags@^1.8.0: - version "1.8.2" - resolved "https://registry.yarnpkg.com/common-tags/-/common-tags-1.8.2.tgz#94ebb3c076d26032745fd54face7f688ef5ac9c6" - integrity sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA== - concat-map@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== -core-util-is@1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" - integrity sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ== +core-util-is@~1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" + integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== -cors@^2.8.5: - version "2.8.5" - resolved "https://registry.yarnpkg.com/cors/-/cors-2.8.5.tgz#eac11da51592dd86b9f06f6e7ac293b3df875d29" - integrity sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g== - dependencies: - object-assign "^4" - vary "^1" - -cross-spawn@^7.0.0, cross-spawn@^7.0.2, cross-spawn@^7.0.3: +cross-spawn@^7.0.2: version "7.0.3" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== @@ -1394,16 +1212,6 @@ cross-spawn@^7.0.0, cross-spawn@^7.0.2, cross-spawn@^7.0.3: shebang-command "^2.0.0" which "^2.0.1" -css-background-parser@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/css-background-parser/-/css-background-parser-0.1.0.tgz#48a17f7fe6d4d4f1bca3177ddf16c5617950741b" - integrity sha512-2EZLisiZQ+7m4wwur/qiYJRniHX4K5Tc9w93MT3AS0WS1u5kaZ4FKXlOTBhOjc+CgEgPiGY+fX1yWD8UwpEqUA== - -css-box-shadow@1.0.0-3: - version "1.0.0-3" - resolved "https://registry.yarnpkg.com/css-box-shadow/-/css-box-shadow-1.0.0-3.tgz#9eaeb7140947bf5d649fc49a19e4bbaa5f602713" - integrity sha512-9jaqR6e7Ohds+aWwmhe6wILJ99xYQbfmK9QQB9CcMjDbTxPZjwEmUQpU91OG05Xgm8BahT5fW+svbsQGjS/zPg== - css-color-keywords@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/css-color-keywords/-/css-color-keywords-1.0.0.tgz#fea2616dc676b2962686b3af8dbdbe180b244e05" @@ -1428,76 +1236,11 @@ csstype@^3.0.2: resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.2.tgz#1d4bf9d572f11c14031f0436e1c10bc1f571f50b" integrity sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ== -cypress@^12.10.0: - version "12.12.0" - resolved "https://registry.yarnpkg.com/cypress/-/cypress-12.12.0.tgz#0da622a34c970d8699ca6562d8e905ed7ce33c77" - integrity sha512-UU5wFQ7SMVCR/hyKok/KmzG6fpZgBHHfrXcHzDmPHWrT+UUetxFzQgt7cxCszlwfozckzwkd22dxMwl/vNkWRw== - dependencies: - "@cypress/request" "^2.88.10" - "@cypress/xvfb" "^1.2.4" - "@types/node" "^14.14.31" - "@types/sinonjs__fake-timers" "8.1.1" - "@types/sizzle" "^2.3.2" - arch "^2.2.0" - blob-util "^2.0.2" - bluebird "^3.7.2" - buffer "^5.6.0" - cachedir "^2.3.0" - chalk "^4.1.0" - check-more-types "^2.24.0" - cli-cursor "^3.1.0" - cli-table3 "~0.6.1" - commander "^6.2.1" - common-tags "^1.8.0" - dayjs "^1.10.4" - debug "^4.3.4" - enquirer "^2.3.6" - eventemitter2 "6.4.7" - execa "4.1.0" - executable "^4.1.1" - extract-zip "2.0.1" - figures "^3.2.0" - fs-extra "^9.1.0" - getos "^3.2.1" - is-ci "^3.0.0" - is-installed-globally "~0.4.0" - lazy-ass "^1.6.0" - listr2 "^3.8.3" - lodash "^4.17.21" - log-symbols "^4.0.0" - minimist "^1.2.8" - ospath "^1.2.2" - pretty-bytes "^5.6.0" - proxy-from-env "1.0.0" - request-progress "^3.0.0" - semver "^7.3.2" - supports-color "^8.1.1" - tmp "~0.2.1" - untildify "^4.0.0" - yauzl "^2.10.0" - damerau-levenshtein@^1.0.8: version "1.0.8" resolved "https://registry.yarnpkg.com/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz#b43d286ccbd36bc5b2f7ed41caf2d0aba1f8a6e7" integrity sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA== -dashdash@^1.12.0: - version "1.14.1" - resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" - integrity sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g== - dependencies: - assert-plus "^1.0.0" - -dayjs@^1.10.4: - version "1.11.7" - resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.11.7.tgz#4b296922642f70999544d1144a2c25730fce63e2" - integrity sha512-+Yw9U6YO5TQohxLcIkrXBeY73WP3ejHWVvx8XCk3gxvQDCTEmS48ZrSZCKciI7Bhl/uCMyxYtE9UqRILmFphkQ== - -debounce@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/debounce/-/debounce-1.2.1.tgz#38881d8f4166a5c5848020c11827b834bcb3e0a5" - integrity sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug== - debug@4, debug@^4.0.0, debug@^4.1.0, 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" @@ -1505,7 +1248,7 @@ debug@4, debug@^4.0.0, debug@^4.1.0, debug@^4.1.1, debug@^4.3.2, debug@^4.3.4: dependencies: ms "2.1.2" -debug@^3.1.0, debug@^3.2.7: +debug@^3.2.7: version "3.2.7" resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== @@ -1519,30 +1262,6 @@ decode-named-character-reference@^1.0.0: dependencies: character-entities "^2.0.0" -deep-equal@^2.0.5: - version "2.2.1" - resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-2.2.1.tgz#c72ab22f3a7d3503a4ca87dde976fe9978816739" - integrity sha512-lKdkdV6EOGoVn65XaOsPdH4rMxTZOnmFyuIkMjM1i5HHCbfjC97dawgTAy0deYNfuqUqW+Q5VrVaQYtUpSd6yQ== - dependencies: - array-buffer-byte-length "^1.0.0" - call-bind "^1.0.2" - es-get-iterator "^1.1.3" - get-intrinsic "^1.2.0" - is-arguments "^1.1.1" - is-array-buffer "^3.0.2" - is-date-object "^1.0.5" - is-regex "^1.1.4" - is-shared-array-buffer "^1.0.2" - isarray "^2.0.5" - object-is "^1.1.5" - object-keys "^1.1.1" - object.assign "^4.1.4" - regexp.prototype.flags "^1.5.0" - side-channel "^1.0.4" - which-boxed-primitive "^1.0.2" - which-collection "^1.0.1" - which-typed-array "^1.1.9" - deep-is@^0.1.3: version "0.1.4" resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" @@ -1553,29 +1272,6 @@ deepmerge@^4.0.0: resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.3.1.tgz#44b5f2147cd3b00d4b56137685966f26fd25dd4a" integrity sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A== -default-browser-id@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/default-browser-id/-/default-browser-id-3.0.0.tgz#bee7bbbef1f4e75d31f98f4d3f1556a14cea790c" - integrity sha512-OZ1y3y0SqSICtE8DE4S8YOE9UZOJ8wO16fKWVP5J1Qz42kV9jcnMVFrEE/noXb/ss3Q4pZIH79kxofzyNNtUNA== - dependencies: - bplist-parser "^0.2.0" - untildify "^4.0.0" - -default-browser@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/default-browser/-/default-browser-4.0.0.tgz#53c9894f8810bf86696de117a6ce9085a3cbc7da" - integrity sha512-wX5pXO1+BrhMkSbROFsyxUm0i/cJEScyNhA4PPxc41ICuv05ZZB/MX28s8aZx6xjmatvebIapF6hLEKEcpneUA== - dependencies: - bundle-name "^3.0.0" - default-browser-id "^3.0.0" - execa "^7.1.1" - titleize "^3.0.0" - -define-lazy-prop@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz#dbb19adfb746d7fc6d734a06b72f4a00d021255f" - integrity sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg== - define-properties@^1.1.3, define-properties@^1.1.4, define-properties@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.0.tgz#52988570670c9eacedd8064f4a990f2405849bd5" @@ -1589,18 +1285,11 @@ delayed-stream@~1.0.0: resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== -dequal@^2.0.0: +dequal@^2.0.0, dequal@^2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/dequal/-/dequal-2.0.3.tgz#2644214f1997d39ed0ee0ece72335490a7ac67be" integrity sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA== -detect-gpu@^5.0.14: - version "5.0.24" - resolved "https://registry.yarnpkg.com/detect-gpu/-/detect-gpu-5.0.24.tgz#3a8c6dbcb0395c82da1eff3c3ae9ea1dd37c89e9" - integrity sha512-cI+WJujCzsJDlYKhcildTtG7YZmWsvMSFH6+gnozHp/R+Wr/WtR361e2PFQ3oDLo8Ek2xy5Buaiv2ucAI2D1qg== - dependencies: - webgl-constants "^1.1.1" - didyoumean@^1.2.2: version "1.2.2" resolved "https://registry.yarnpkg.com/didyoumean/-/didyoumean-1.2.2.tgz#989346ffe9e839b4555ecf5666edea0d3e8ad037" @@ -1637,19 +1326,6 @@ doctrine@^3.0.0: dependencies: esutils "^2.0.2" -draco3d@^1.4.1: - version "1.5.6" - resolved "https://registry.yarnpkg.com/draco3d/-/draco3d-1.5.6.tgz#0d570a9792e3a3a9fafbfea065b692940441c626" - integrity sha512-+3NaRjWktb5r61ZFoDejlykPEFKT5N/LkbXsaddlw6xNSXBanUYpFc2AXXpbJDilPHazcSreU/DpQIaxfX0NfQ== - -ecc-jsbn@~0.1.1: - version "0.1.2" - resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9" - integrity sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw== - dependencies: - jsbn "~0.1.0" - safer-buffer "^2.1.0" - ecdsa-sig-formatter@1.0.11, ecdsa-sig-formatter@^1.0.11: version "1.0.11" resolved "https://registry.yarnpkg.com/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz#ae0f0fa2d85045ef14a817daa3ce9acd0489e5bf" @@ -1657,26 +1333,21 @@ ecdsa-sig-formatter@1.0.11, ecdsa-sig-formatter@^1.0.11: dependencies: safe-buffer "^5.0.1" -electron-to-chromium@^1.4.284: - version "1.4.401" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.401.tgz#cbd2c332c4a833e9e8d2ec5b3a6cd85ec6920907" - integrity sha512-AswqHsYyEbfSn0x87n31Na/xttUqEAg7NUjpiyxC20MaWKLyadOYHMzyLdF78N1iw+FK8/2KHLpZxRdyRILgtA== - -emoji-regex@^10.2.1: - version "10.2.1" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-10.2.1.tgz#a41c330d957191efd3d9dfe6e1e8e1e9ab048b3f" - integrity sha512-97g6QgOk8zlDRdgq1WxwgTMgEWGVAQvB5Fdpgc1MkNy56la5SKP9GsMXKDOdqwn90/41a8yPwIGk1Y6WVbeMQA== - -emoji-regex@^8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" - integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== +electron-to-chromium@^1.4.477: + version "1.4.508" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.508.tgz#5641ff2f5ba11df4bd960fe6a2f9f70aa8b9af96" + integrity sha512-FFa8QKjQK/A5QuFr2167myhMesGrhlOBD+3cYNxO9/S4XzHEXesyTD/1/xF644gC8buFPz3ca6G1LOQD0tZrrg== emoji-regex@^9.2.2: version "9.2.2" resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72" integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== +emojis-list@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-3.0.0.tgz#5570662046ad29e2e916e71aae260abdff4f6a78" + integrity sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q== + encoding@^0.1.13: version "0.1.13" resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.13.tgz#56574afdd791f54a8e9b2785c0582a2d26210fa9" @@ -1684,45 +1355,32 @@ encoding@^0.1.13: dependencies: iconv-lite "^0.6.2" -end-of-stream@^1.1.0: - 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.12.0: - version "5.14.0" - resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.14.0.tgz#0b6c676c8a3266c99fa281e4433a706f5c0c61c4" - integrity sha512-+DCows0XNwLDcUhbFJPdlQEVnT2zXlCv7hPxemTz86/O+B/hCQ+mb7ydkPKiflpVraqLPCAfu7lDy+hBXueojw== + version "5.15.0" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz#1af946c7d93603eb88e9896cee4904dc012e9c35" + integrity sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg== dependencies: graceful-fs "^4.2.4" tapable "^2.2.0" -enquirer@^2.3.6: - version "2.3.6" - resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.3.6.tgz#2a7fe5dd634a1e4125a975ec994ff5456dc3734d" - integrity sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg== - dependencies: - ansi-colors "^4.1.1" - entities@^4.4.0: version "4.5.0" resolved "https://registry.yarnpkg.com/entities/-/entities-4.5.0.tgz#5d268ea5e7113ec74c4d033b79ea5a35a488fb48" integrity sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw== -es-abstract@^1.19.0, es-abstract@^1.20.4: - version "1.21.2" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.21.2.tgz#a56b9695322c8a185dc25975aa3b8ec31d0e7eff" - integrity sha512-y/B5POM2iBnIxCiernH1G7rC9qQoM77lLIMQLuob0zhp8C56Po81+2Nj0WFKnd0pNReDTnkYryc+zhOzpEIROg== +es-abstract@^1.20.4, es-abstract@^1.22.1: + version "1.22.1" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.22.1.tgz#8b4e5fc5cefd7f1660f0f8e1a52900dfbc9d9ccc" + integrity sha512-ioRRcXMO6OFyRpyzV3kE1IIBd4WG5/kltnzdxSCqoP8CMGs/Li+M1uF5o7lOkZVFjDs+NLesthnF66Pg/0q0Lw== dependencies: array-buffer-byte-length "^1.0.0" + arraybuffer.prototype.slice "^1.0.1" available-typed-arrays "^1.0.5" call-bind "^1.0.2" es-set-tostringtag "^2.0.1" es-to-primitive "^1.2.1" function.prototype.name "^1.1.5" - get-intrinsic "^1.2.0" + get-intrinsic "^1.2.1" get-symbol-description "^1.0.0" globalthis "^1.0.3" gopd "^1.0.1" @@ -1742,29 +1400,38 @@ es-abstract@^1.19.0, es-abstract@^1.20.4: object-inspect "^1.12.3" object-keys "^1.1.1" object.assign "^4.1.4" - regexp.prototype.flags "^1.4.3" + regexp.prototype.flags "^1.5.0" + safe-array-concat "^1.0.0" safe-regex-test "^1.0.0" string.prototype.trim "^1.2.7" string.prototype.trimend "^1.0.6" string.prototype.trimstart "^1.0.6" + typed-array-buffer "^1.0.0" + typed-array-byte-length "^1.0.0" + typed-array-byte-offset "^1.0.0" typed-array-length "^1.0.4" unbox-primitive "^1.0.2" - which-typed-array "^1.1.9" + which-typed-array "^1.1.10" -es-get-iterator@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/es-get-iterator/-/es-get-iterator-1.1.3.tgz#3ef87523c5d464d41084b2c3c9c214f1199763d6" - integrity sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw== +es-iterator-helpers@^1.0.12: + version "1.0.14" + resolved "https://registry.yarnpkg.com/es-iterator-helpers/-/es-iterator-helpers-1.0.14.tgz#19cd7903697d97e21198f3293b55e8985791c365" + integrity sha512-JgtVnwiuoRuzLvqelrvN3Xu7H9bu2ap/kQ2CrM62iidP8SKuD99rWU3CJy++s7IVL2qb/AjXPGR/E7i9ngd/Cw== dependencies: + asynciterator.prototype "^1.0.0" call-bind "^1.0.2" - get-intrinsic "^1.1.3" + define-properties "^1.2.0" + es-abstract "^1.22.1" + es-set-tostringtag "^2.0.1" + function-bind "^1.1.1" + get-intrinsic "^1.2.1" + globalthis "^1.0.3" + has-property-descriptors "^1.0.0" + has-proto "^1.0.1" has-symbols "^1.0.3" - is-arguments "^1.1.1" - is-map "^2.0.2" - is-set "^2.0.2" - is-string "^1.0.7" - isarray "^2.0.5" - stop-iteration-iterator "^1.0.0" + internal-slot "^1.0.5" + iterator.prototype "^1.1.0" + safe-array-concat "^1.0.0" es-set-tostringtag@^2.0.1: version "2.0.1" @@ -1812,44 +1479,43 @@ escape-string-regexp@^5.0.0: integrity sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw== eslint-config-next@^13.4.3: - version "13.4.3" - resolved "https://registry.yarnpkg.com/eslint-config-next/-/eslint-config-next-13.4.3.tgz#15fccfddd69a2634e8939dba6a428362e09cbb21" - integrity sha512-1lXwdFi29fKxzeugof/TUE7lpHyJQt5+U4LaUHyvQfHjvsWO77vFNicJv5sX6k0VDVSbnfz0lw+avxI+CinbMg== + version "13.4.19" + resolved "https://registry.yarnpkg.com/eslint-config-next/-/eslint-config-next-13.4.19.tgz#f46be9d4bd9e52755f846338456132217081d7f8" + integrity sha512-WE8367sqMnjhWHvR5OivmfwENRQ1ixfNE9hZwQqNCsd+iM3KnuMc1V8Pt6ytgjxjf23D+xbesADv9x3xaKfT3g== dependencies: - "@next/eslint-plugin-next" "13.4.3" + "@next/eslint-plugin-next" "13.4.19" "@rushstack/eslint-patch" "^1.1.3" - "@typescript-eslint/parser" "^5.42.0" + "@typescript-eslint/parser" "^5.4.2 || ^6.0.0" eslint-import-resolver-node "^0.3.6" eslint-import-resolver-typescript "^3.5.2" eslint-plugin-import "^2.26.0" eslint-plugin-jsx-a11y "^6.5.1" eslint-plugin-react "^7.31.7" - eslint-plugin-react-hooks "^4.5.0" + eslint-plugin-react-hooks "^4.5.0 || 5.0.0-canary-7118f5dd7-20230705" eslint-import-resolver-node@^0.3.6, eslint-import-resolver-node@^0.3.7: - version "0.3.7" - resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.7.tgz#83b375187d412324a1963d84fa664377a23eb4d7" - integrity sha512-gozW2blMLJCeFpBwugLTGyvVjNoeo1knonXAcatC6bjPBZitotxdWf7Gimr25N4c0AAOo4eOUfaG82IJPDpqCA== + version "0.3.9" + resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz#d4eaac52b8a2e7c3cd1903eb00f7e053356118ac" + integrity sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g== dependencies: debug "^3.2.7" - is-core-module "^2.11.0" - resolve "^1.22.1" + is-core-module "^2.13.0" + resolve "^1.22.4" eslint-import-resolver-typescript@^3.5.2: - version "3.5.5" - resolved "https://registry.yarnpkg.com/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.5.5.tgz#0a9034ae7ed94b254a360fbea89187b60ea7456d" - integrity sha512-TdJqPHs2lW5J9Zpe17DZNQuDnox4xo2o+0tE7Pggain9Rbc19ik8kFtXdxZ250FVx2kF4vlt2RSf4qlUpG7bhw== + version "3.6.0" + resolved "https://registry.yarnpkg.com/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.6.0.tgz#36f93e1eb65a635e688e16cae4bead54552e3bbd" + integrity sha512-QTHR9ddNnn35RTxlaEnx2gCxqFlF2SEN0SE2d17SqwyM7YOSI2GHWRYp5BiRkObTUNYPupC/3Fq2a0PpT+EKpg== dependencies: debug "^4.3.4" enhanced-resolve "^5.12.0" eslint-module-utils "^2.7.4" + fast-glob "^3.3.1" get-tsconfig "^4.5.0" - globby "^13.1.3" is-core-module "^2.11.0" is-glob "^4.0.3" - synckit "^0.8.5" -eslint-module-utils@^2.7.4: +eslint-module-utils@^2.7.4, eslint-module-utils@^2.8.0: version "2.8.0" resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.8.0.tgz#e439fee65fc33f6bba630ff621efc38ec0375c49" integrity sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw== @@ -1857,25 +1523,27 @@ eslint-module-utils@^2.7.4: debug "^3.2.7" eslint-plugin-import@^2.26.0: - version "2.27.5" - resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.27.5.tgz#876a6d03f52608a3e5bb439c2550588e51dd6c65" - integrity sha512-LmEt3GVofgiGuiE+ORpnvP+kAm3h6MLZJ4Q5HCyHADofsb4VzXFsRiWj3c0OFiV+3DWFh0qg3v9gcPlfc3zRow== + version "2.28.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.28.1.tgz#63b8b5b3c409bfc75ebaf8fb206b07ab435482c4" + integrity sha512-9I9hFlITvOV55alzoKBI+K9q74kv0iKMeY6av5+umsNwayt59fz692daGyjR+oStBQgx6nwR9rXldDev3Clw+A== dependencies: array-includes "^3.1.6" + array.prototype.findlastindex "^1.2.2" array.prototype.flat "^1.3.1" array.prototype.flatmap "^1.3.1" debug "^3.2.7" doctrine "^2.1.0" eslint-import-resolver-node "^0.3.7" - eslint-module-utils "^2.7.4" + eslint-module-utils "^2.8.0" has "^1.0.3" - is-core-module "^2.11.0" + is-core-module "^2.13.0" is-glob "^4.0.3" minimatch "^3.1.2" + object.fromentries "^2.0.6" + object.groupby "^1.0.0" object.values "^1.1.6" - resolve "^1.22.1" - semver "^6.3.0" - tsconfig-paths "^3.14.1" + semver "^6.3.1" + tsconfig-paths "^3.14.2" eslint-plugin-jsx-a11y@^6.5.1: version "6.7.1" @@ -1899,20 +1567,21 @@ eslint-plugin-jsx-a11y@^6.5.1: object.fromentries "^2.0.6" semver "^6.3.0" -eslint-plugin-react-hooks@^4.5.0: +"eslint-plugin-react-hooks@^4.5.0 || 5.0.0-canary-7118f5dd7-20230705": version "4.6.0" resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz#4c3e697ad95b77e93f8646aaa1630c1ba607edd3" integrity sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g== eslint-plugin-react@^7.31.7: - version "7.32.2" - resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.32.2.tgz#e71f21c7c265ebce01bcbc9d0955170c55571f10" - integrity sha512-t2fBMa+XzonrrNkyVirzKlvn5RXzzPwRHtMvLAtVZrt8oxgnTQaYbU6SXTOO1mwQgp1y5+toMSKInnzGr0Knqg== + version "7.33.2" + resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.33.2.tgz#69ee09443ffc583927eafe86ffebb470ee737608" + integrity sha512-73QQMKALArI8/7xGLNI/3LylrEYrlKZSb5C9+q3OtOewTnMQi5cT+aE9E41sLCmli3I9PGGmD1yiZydyo4FEPw== dependencies: array-includes "^3.1.6" array.prototype.flatmap "^1.3.1" array.prototype.tosorted "^1.1.1" doctrine "^2.1.0" + es-iterator-helpers "^1.0.12" estraverse "^5.3.0" jsx-ast-utils "^2.4.1 || ^3.0.0" minimatch "^3.1.2" @@ -1922,21 +1591,21 @@ eslint-plugin-react@^7.31.7: object.values "^1.1.6" prop-types "^15.8.1" resolve "^2.0.0-next.4" - semver "^6.3.0" + semver "^6.3.1" string.prototype.matchall "^4.0.8" eslint-scope@^7.1.1: - version "7.2.0" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.2.0.tgz#f21ebdafda02352f103634b96dd47d9f81ca117b" - integrity sha512-DYj5deGlHBfMt15J7rdtyKNq/Nqlv5KfU4iodrQ019XESsRnwXH9KAE0y3cwtUHDo2ob7CypAnCqefh6vioWRw== + version "7.2.2" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.2.2.tgz#deb4f92563390f32006894af62a22dba1c46423f" + integrity sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg== dependencies: esrecurse "^4.3.0" estraverse "^5.2.0" eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.0, eslint-visitor-keys@^3.4.1: - version "3.4.1" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz#c22c48f48942d08ca824cc526211ae400478a994" - integrity sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA== + version "3.4.3" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz#0cd72fe8550e3c2eae156a96a4dddcd1c8ac5800" + integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== eslint@8.38.0: version "8.38.0" @@ -1984,12 +1653,12 @@ eslint@8.38.0: strip-json-comments "^3.1.0" text-table "^0.2.0" -espree@^9.5.1, espree@^9.5.2: - version "9.5.2" - resolved "https://registry.yarnpkg.com/espree/-/espree-9.5.2.tgz#e994e7dc33a082a7a82dceaf12883a829353215b" - integrity sha512-7OASN1Wma5fum5SrNhFMAMJxOUAbhyfQ8dQ//PJaJbNw0URTPWqIghHWt1MmAANKhHZIYOHruW4Kw4ruUWOdGw== +espree@^9.5.1, espree@^9.6.0: + version "9.6.1" + resolved "https://registry.yarnpkg.com/espree/-/espree-9.6.1.tgz#a2a17b8e434690a5432f2f8018ce71d331a48c6f" + integrity sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ== dependencies: - acorn "^8.8.0" + acorn "^8.9.0" acorn-jsx "^5.3.2" eslint-visitor-keys "^3.4.1" @@ -2012,103 +1681,70 @@ estraverse@^5.1.0, estraverse@^5.2.0, estraverse@^5.3.0: resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== +estree-util-attach-comments@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/estree-util-attach-comments/-/estree-util-attach-comments-2.1.1.tgz#ee44f4ff6890ee7dfb3237ac7810154c94c63f84" + integrity sha512-+5Ba/xGGS6mnwFbXIuQiDPTbuTxuMCooq3arVv7gPZtYpjp+VXH/NkHAP35OOefPhNG/UGqU3vt/LTABwcHX0w== + dependencies: + "@types/estree" "^1.0.0" + +estree-util-build-jsx@^2.0.0: + version "2.2.2" + resolved "https://registry.yarnpkg.com/estree-util-build-jsx/-/estree-util-build-jsx-2.2.2.tgz#32f8a239fb40dc3f3dca75bb5dcf77a831e4e47b" + integrity sha512-m56vOXcOBuaF+Igpb9OPAy7f9w9OIkb5yhjsZuaPm7HoGi4oTOQi0h2+yZ+AtKklYFZ+rPC4n0wYCJCEU1ONqg== + dependencies: + "@types/estree-jsx" "^1.0.0" + estree-util-is-identifier-name "^2.0.0" + estree-walker "^3.0.0" + +estree-util-is-identifier-name@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/estree-util-is-identifier-name/-/estree-util-is-identifier-name-2.1.0.tgz#fb70a432dcb19045e77b05c8e732f1364b4b49b2" + integrity sha512-bEN9VHRyXAUOjkKVQVvArFym08BTWB0aJPppZZr0UNyAqWsLaVfAqP7hbaTJjzHifmB5ebnR8Wm7r7yGN/HonQ== + +estree-util-to-js@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/estree-util-to-js/-/estree-util-to-js-1.2.0.tgz#0f80d42443e3b13bd32f7012fffa6f93603f4a36" + integrity sha512-IzU74r1PK5IMMGZXUVZbmiu4A1uhiPgW5hm1GjcOfr4ZzHaMPpLNJjR7HjXiIOzi25nZDrgFTobHTkV5Q6ITjA== + dependencies: + "@types/estree-jsx" "^1.0.0" + astring "^1.8.0" + source-map "^0.7.0" + +estree-util-visit@^1.0.0: + version "1.2.1" + resolved "https://registry.yarnpkg.com/estree-util-visit/-/estree-util-visit-1.2.1.tgz#8bc2bc09f25b00827294703835aabee1cc9ec69d" + integrity sha512-xbgqcrkIVbIG+lI/gzbvd9SGTJL4zqJKBFttUl5pP27KhAjtMKbX/mQXJ7qgyXpMgVy/zvpm0xoQQaGL8OloOw== + dependencies: + "@types/estree-jsx" "^1.0.0" + "@types/unist" "^2.0.0" + +estree-walker@^3.0.0: + version "3.0.3" + resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-3.0.3.tgz#67c3e549ec402a487b4fc193d1953a524752340d" + integrity sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g== + dependencies: + "@types/estree" "^1.0.0" + esutils@^2.0.2: version "2.0.3" resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== -eventemitter2@6.4.7: - version "6.4.7" - resolved "https://registry.yarnpkg.com/eventemitter2/-/eventemitter2-6.4.7.tgz#a7f6c4d7abf28a14c1ef3442f21cb306a054271d" - integrity sha512-tYUSVOGeQPKt/eC1ABfhHy5Xd96N3oIijJvN3O9+TsC28T5V9yX9oEfEK5faP0EFSNVOG97qtAS68GBrQB2hDg== - -execa@4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/execa/-/execa-4.1.0.tgz#4e5491ad1572f2f17a77d388c6c857135b22847a" - integrity sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA== - dependencies: - cross-spawn "^7.0.0" - get-stream "^5.0.0" - human-signals "^1.1.1" - is-stream "^2.0.0" - merge-stream "^2.0.0" - npm-run-path "^4.0.0" - onetime "^5.1.0" - signal-exit "^3.0.2" - strip-final-newline "^2.0.0" - -execa@^5.0.0: - version "5.1.1" - resolved "https://registry.yarnpkg.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd" - integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg== - dependencies: - cross-spawn "^7.0.3" - get-stream "^6.0.0" - human-signals "^2.1.0" - is-stream "^2.0.0" - merge-stream "^2.0.0" - npm-run-path "^4.0.1" - onetime "^5.1.2" - signal-exit "^3.0.3" - strip-final-newline "^2.0.0" - -execa@^7.1.1: - version "7.1.1" - resolved "https://registry.yarnpkg.com/execa/-/execa-7.1.1.tgz#3eb3c83d239488e7b409d48e8813b76bb55c9c43" - integrity sha512-wH0eMf/UXckdUYnO21+HDztteVv05rq2GXksxT4fCGeHkBhw1DROXh40wcjMcRqDOWE7iPJ4n3M7e2+YFP+76Q== - dependencies: - cross-spawn "^7.0.3" - get-stream "^6.0.1" - human-signals "^4.3.0" - is-stream "^3.0.0" - merge-stream "^2.0.0" - npm-run-path "^5.1.0" - onetime "^6.0.0" - signal-exit "^3.0.7" - strip-final-newline "^3.0.0" - -executable@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/executable/-/executable-4.1.1.tgz#41532bff361d3e57af4d763b70582db18f5d133c" - integrity sha512-8iA79xD3uAch729dUG8xaaBBFGaEa0wdD2VkYLFHwlqosEj/jT66AzcreRDSgV7ehnNLBW2WR5jIXwGKjVdTLg== - dependencies: - pify "^2.2.0" - -extend@^3.0.0, extend@^3.0.2, extend@~3.0.2: +extend@^3.0.0, extend@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== -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" - -extsprintf@1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" - integrity sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g== - -extsprintf@^1.2.0: - version "1.4.1" - resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.1.tgz#8d172c064867f235c0c84a596806d279bf4bcc07" - integrity sha512-Wrk35e8ydCKDj/ArClo1VrPVmN8zph5V4AtHwIuHhvMXsKf73UT3BOD+azBIW+3wOJ4FhEH7zyaJCFvChjYvMA== - 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" integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== -fast-glob@^3.2.11, fast-glob@^3.2.12, fast-glob@^3.2.9: - version "3.2.12" - resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.12.tgz#7f39ec99c2e6ab030337142da9e0c18f37afae80" - integrity sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w== +fast-glob@^3.2.12, fast-glob@^3.2.9, fast-glob@^3.3.1: + version "3.3.1" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.1.tgz#784b4e897340f3dbbef17413b3f11acf03c874c4" + integrity sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg== dependencies: "@nodelib/fs.stat" "^2.0.2" "@nodelib/fs.walk" "^1.2.3" @@ -2138,30 +1774,11 @@ 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" - -fflate@^0.6.9, fflate@~0.6.9: +fflate@~0.6.9: version "0.6.10" resolved "https://registry.yarnpkg.com/fflate/-/fflate-0.6.10.tgz#5f40f9659205936a2d18abf88b2e7781662b6d43" integrity sha512-IQrh3lEPM93wVCEczc9SaAOvkmcoQn/G8Bo1e8ZPlY3X3bnAxWaBdvTdvM1hP62iZp0BXWDy4vTAy4fF0+Dlpg== -fflate@^0.7.3: - version "0.7.4" - resolved "https://registry.yarnpkg.com/fflate/-/fflate-0.7.4.tgz#61587e5d958fdabb5a9368a302c25363f4f69f50" - integrity sha512-5u2V/CDW15QM1XbbgS+0DfPxVB+jUKhWEKuuFuHncbk3tEEqzmoXL+2KyOFuKGqOnmdIy0/davWF1CkuwtibCw== - -figures@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/figures/-/figures-3.2.0.tgz#625c18bd293c604dc4a8ddb2febf0c88341746af" - integrity sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg== - dependencies: - escape-string-regexp "^1.0.5" - 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" @@ -2169,6 +1786,14 @@ file-entry-cache@^6.0.1: dependencies: flat-cache "^3.0.4" +file-loader@^6.0.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/file-loader/-/file-loader-6.2.0.tgz#baef7cf8e1840df325e4390b4484879480eebe4d" + integrity sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw== + dependencies: + loader-utils "^2.0.0" + schema-utils "^3.0.0" + fill-range@^7.0.1: version "7.0.1" resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" @@ -2185,14 +1810,15 @@ find-up@^5.0.0: path-exists "^4.0.0" flat-cache@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.0.4.tgz#61b0338302b2fe9f957dcc32fc2a87f1c3048b11" - integrity sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg== + version "3.1.0" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.1.0.tgz#0e54ab4a1a60fe87e2946b6b00657f1c99e1af3f" + integrity sha512-OHx4Qwrrt0E4jEIcI5/Xb+f+QmJYNj2rrK8wiIdQOIrB9WrrJL8cjZvXdXuBTkkEwEqLycb5BeZDV1o2i9bTew== dependencies: - flatted "^3.1.0" + flatted "^3.2.7" + keyv "^4.5.3" rimraf "^3.0.2" -flatted@^3.1.0: +flatted@^3.2.7: version "3.2.7" resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.7.tgz#609f39207cb614b89d0765b477cb2d437fbf9787" integrity sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ== @@ -2209,11 +1835,6 @@ for-each@^0.3.3: dependencies: is-callable "^1.1.3" -forever-agent@~0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" - integrity sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw== - form-data@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.0.tgz#93919daeaf361ee529584b9b31664dc12c9fa452" @@ -2223,29 +1844,10 @@ form-data@^4.0.0: combined-stream "^1.0.8" mime-types "^2.1.12" -form-data@~2.3.2: - version "2.3.3" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6" - integrity sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ== - dependencies: - asynckit "^0.4.0" - combined-stream "^1.0.6" - mime-types "^2.1.12" - 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-extra@^9.1.0: - version "9.1.0" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.1.0.tgz#5954460c764a8da2094ba3554bf839e6b9a7c86d" - 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" + version "4.3.6" + resolved "https://registry.yarnpkg.com/fraction.js/-/fraction.js-4.3.6.tgz#e9e3acec6c9a28cf7bc36cbe35eea4ceb2c5c92d" + integrity sha512-n2aZ9tNfYDwaHhvFTkhFErqOMIb8uyzSQ+vGJBjZyanAKZVbGUQ1sngfk9FdkBw7G26O7AgNjLcecLffD1c7eg== fs.realpath@^1.0.0: version "1.0.0" @@ -2253,9 +1855,9 @@ fs.realpath@^1.0.0: integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== fsevents@~2.3.2: - version "2.3.2" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" - integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== + version "2.3.3" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" + integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== function-bind@^1.1.1: version "1.1.1" @@ -2263,39 +1865,39 @@ function-bind@^1.1.1: integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== function.prototype.name@^1.1.5: - version "1.1.5" - resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.5.tgz#cce0505fe1ffb80503e6f9e46cc64e46a12a9621" - integrity sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA== + version "1.1.6" + resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.6.tgz#cdf315b7d90ee77a4c6ee216c3c3362da07533fd" + integrity sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg== dependencies: call-bind "^1.0.2" - define-properties "^1.1.3" - es-abstract "^1.19.0" - functions-have-names "^1.2.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + functions-have-names "^1.2.3" -functions-have-names@^1.2.2, functions-have-names@^1.2.3: +functions-have-names@^1.2.3: version "1.2.3" resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834" integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== gaxios@^5.0.0, gaxios@^5.0.1: - version "5.1.0" - resolved "https://registry.yarnpkg.com/gaxios/-/gaxios-5.1.0.tgz#133b77b45532be71eec72012b7e97c2320b6140a" - integrity sha512-aezGIjb+/VfsJtIcHGcBSerNEDdfdHeMros+RbYbGpmonKWQCOVOes0LVZhn1lDtIgq55qq0HaxymIoae3Fl/A== + version "5.1.3" + resolved "https://registry.yarnpkg.com/gaxios/-/gaxios-5.1.3.tgz#f7fa92da0fe197c846441e5ead2573d4979e9013" + integrity sha512-95hVgBRgEIRQQQHIbnxBXeHbW4TqFk4ZDJW7wmVtvYar72FdhRIo1UGOLS2eRAKCPEdPBWu+M7+A33D9CdX9rA== dependencies: extend "^3.0.2" https-proxy-agent "^5.0.0" is-stream "^2.0.0" - node-fetch "^2.6.7" + node-fetch "^2.6.9" -gcp-metadata@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/gcp-metadata/-/gcp-metadata-5.2.0.tgz#b4772e9c5976241f5d3e69c4f446c906d25506ec" - integrity sha512-aFhhvvNycky2QyhG+dcfEdHBF0FRbYcf39s6WNHUDysKSrbJ5vuFbjydxBcmewtXeV248GP8dWT3ByPNxsyHCw== +gcp-metadata@^5.3.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/gcp-metadata/-/gcp-metadata-5.3.0.tgz#6f45eb473d0cb47d15001476b48b663744d25408" + integrity sha512-FNTkdNEnBdlqF2oatizolQqNANMrcqJt6AAYt99B3y1aLLC8Hc5IOBb+ZnnzllodEEf6xMBp6wRcBbc16fa65w== dependencies: gaxios "^5.0.0" json-bigint "^1.0.0" -get-intrinsic@^1.0.2, get-intrinsic@^1.1.1, get-intrinsic@^1.1.3, get-intrinsic@^1.2.0: +get-intrinsic@^1.0.2, get-intrinsic@^1.1.1, get-intrinsic@^1.1.3, get-intrinsic@^1.2.0, get-intrinsic@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.1.tgz#d295644fed4505fc9cde952c37ee12b477a83d82" integrity sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw== @@ -2305,18 +1907,6 @@ get-intrinsic@^1.0.2, get-intrinsic@^1.1.1, get-intrinsic@^1.1.3, get-intrinsic@ has-proto "^1.0.1" has-symbols "^1.0.3" -get-stream@^5.0.0, 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-stream@^6.0.0, get-stream@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" - integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== - 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" @@ -2326,23 +1916,11 @@ get-symbol-description@^1.0.0: get-intrinsic "^1.1.1" get-tsconfig@^4.5.0: - version "4.5.0" - resolved "https://registry.yarnpkg.com/get-tsconfig/-/get-tsconfig-4.5.0.tgz#6d52d1c7b299bd3ee9cd7638561653399ac77b0f" - integrity sha512-MjhiaIWCJ1sAU4pIQ5i5OfOuHHxVo1oYeNsWTON7jxYkod8pHocXeh+SSbmu5OZZZK73B6cbJ2XADzXehLyovQ== - -getos@^3.2.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/getos/-/getos-3.2.1.tgz#0134d1f4e00eb46144c5a9c0ac4dc087cbb27dc5" - integrity sha512-U56CfOK17OKgTVqozZjUKNdkfEv6jk5WISBJ8SHoagjE6L69zOwl3Z+O8myjY9MEW3i2HPWQBt/LTbCgcC973Q== + version "4.7.0" + resolved "https://registry.yarnpkg.com/get-tsconfig/-/get-tsconfig-4.7.0.tgz#06ce112a1463e93196aa90320c35df5039147e34" + integrity sha512-pmjiZ7xtB8URYm74PlGJozDNyhvsVLUcpBa8DZBG3bWHwaHa9bPiRpiSfovw+fjhwONSCWKRyk+JQHEGZmMrzw== dependencies: - async "^3.2.0" - -getpass@^0.1.1: - version "0.1.7" - resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" - integrity sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng== - dependencies: - assert-plus "^1.0.0" + resolve-pkg-maps "^1.0.0" github-slugger@^1.0.0: version "1.5.0" @@ -2368,6 +1946,11 @@ glob-parent@^6.0.2: dependencies: is-glob "^4.0.3" +glob-to-regexp@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz#c75297087c851b9a578bd217dd59a92f59fe546e" + integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw== + glob@7.1.6: version "7.1.6" resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" @@ -2404,22 +1987,15 @@ glob@^7.1.3: once "^1.3.0" path-is-absolute "^1.0.0" -global-dirs@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/global-dirs/-/global-dirs-3.0.1.tgz#0c488971f066baceda21447aecb1a8b911d22485" - integrity sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA== - dependencies: - ini "2.0.0" - globals@^11.1.0: version "11.12.0" resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== globals@^13.19.0: - version "13.20.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-13.20.0.tgz#ea276a1e508ffd4f1612888f9d1bad1e2717bf82" - integrity sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ== + version "13.21.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-13.21.0.tgz#163aae12f34ef502f5153cfbdd3600f36c63c571" + integrity sha512-ybyme3s4yy/t/3s35bewwXKOf7cvzfreG2lH0lZl0JB7I4GxRP2ghxOK/Nb9EkRXdbBXZLfq/p/0W2JUONB/Gg== dependencies: type-fest "^0.20.2" @@ -2442,33 +2018,17 @@ globby@^11.1.0: merge2 "^1.4.1" slash "^3.0.0" -globby@^13.1.3: - version "13.1.4" - resolved "https://registry.yarnpkg.com/globby/-/globby-13.1.4.tgz#2f91c116066bcec152465ba36e5caa4a13c01317" - integrity sha512-iui/IiiW+QrJ1X1hKH5qwlMQyv34wJAYwH1vrf8b9kBA4sNiif3gKsMHa+BrdnOpEudWjpotfa7LrTzB1ERS/g== - dependencies: - dir-glob "^3.0.1" - fast-glob "^3.2.11" - ignore "^5.2.0" - merge2 "^1.4.1" - slash "^4.0.0" - -glsl-noise@^0.0.0: - version "0.0.0" - resolved "https://registry.yarnpkg.com/glsl-noise/-/glsl-noise-0.0.0.tgz#367745f3a33382c0eeec4cb54b7e99cfc1d7670b" - integrity sha512-b/ZCF6amfAUb7dJM/MxRs7AetQEahYzJ8PtgfrmEdtw6uyGOr+ZSGtgjFm6mfsBkxJ4d2W7kg+Nlqzqvn3Bc0w== - google-auth-library@^8.0.2: - version "8.8.0" - resolved "https://registry.yarnpkg.com/google-auth-library/-/google-auth-library-8.8.0.tgz#2e17494431cef56b571420d483a4debff6c481cd" - integrity sha512-0iJn7IDqObDG5Tu9Tn2WemmJ31ksEa96IyK0J0OZCpTh6CrC6FrattwKX87h3qKVuprCJpdOGKc1Xi8V0kMh8Q== + version "8.9.0" + resolved "https://registry.yarnpkg.com/google-auth-library/-/google-auth-library-8.9.0.tgz#15a271eb2ec35d43b81deb72211bd61b1ef14dd0" + integrity sha512-f7aQCJODJFmYWN6PeNKzgvy9LI2tYmXnzpNDHEjG5sDNPgGb2FXQyTBnXeSH+PAtpKESFD+LmHw3Ox3mN7e1Fg== dependencies: arrify "^2.0.0" base64-js "^1.3.0" ecdsa-sig-formatter "^1.0.11" fast-text-encoding "^1.0.0" gaxios "^5.0.0" - gcp-metadata "^5.2.0" + gcp-metadata "^5.3.0" gtoken "^6.1.0" jws "^4.0.0" lru-cache "^6.0.0" @@ -2507,7 +2067,7 @@ gopd@^1.0.1: dependencies: get-intrinsic "^1.1.3" -graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.4: +graceful-fs@^4.1.2, graceful-fs@^4.2.4: 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== @@ -2646,12 +2206,26 @@ hast-util-raw@^7.2.0: web-namespaces "^2.0.0" zwitch "^2.0.0" -hast-util-sanitize@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/hast-util-sanitize/-/hast-util-sanitize-4.1.0.tgz#d90f8521f5083547095c5c63a7e03150303e0286" - integrity sha512-Hd9tU0ltknMGRDv+d6Ro/4XKzBqQnP/EZrpiTbpFYfXv/uOhWeKc+2uajcbEvAEH98VZd7eII2PiXm13RihnLw== +hast-util-to-estree@^2.0.0: + version "2.3.3" + resolved "https://registry.yarnpkg.com/hast-util-to-estree/-/hast-util-to-estree-2.3.3.tgz#da60142ffe19a6296923ec222aba73339c8bf470" + integrity sha512-ihhPIUPxN0v0w6M5+IiAZZrn0LH2uZomeWwhn7uP7avZC6TE7lIiEh2yBMPr5+zi1aUCXq6VoYRgs2Bw9xmycQ== dependencies: + "@types/estree" "^1.0.0" + "@types/estree-jsx" "^1.0.0" "@types/hast" "^2.0.0" + "@types/unist" "^2.0.0" + comma-separated-tokens "^2.0.0" + estree-util-attach-comments "^2.0.0" + estree-util-is-identifier-name "^2.0.0" + hast-util-whitespace "^2.0.0" + mdast-util-mdx-expression "^1.0.0" + mdast-util-mdxjs-esm "^1.0.0" + property-information "^6.0.0" + space-separated-tokens "^2.0.0" + style-to-object "^0.4.1" + unist-util-position "^4.0.0" + zwitch "^2.0.0" hast-util-to-parse5@^7.0.0: version "7.1.0" @@ -2698,25 +2272,18 @@ hastscript@^7.0.0: property-information "^6.0.0" space-separated-tokens "^2.0.0" -hex-rgb@^4.1.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/hex-rgb/-/hex-rgb-4.3.0.tgz#af5e974e83bb2fefe44d55182b004ec818c07776" - integrity sha512-Ox1pJVrDCyGHMG9CFg1tmrRUMRPRsAWYc/PinY0XzJU4K7y7vjNoLKIQ7BR5UJMCxNN8EM1MNDmHWA/B3aZUuw== +hoist-non-react-statics@^3.0.0: + version "3.3.2" + resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz#ece0acaf71d62c2969c2ec59feff42a4b1a85b45" + integrity sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw== + dependencies: + react-is "^16.7.0" html-void-elements@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/html-void-elements/-/html-void-elements-2.0.1.tgz#29459b8b05c200b6c5ee98743c41b979d577549f" integrity sha512-0quDb7s97CfemeJAnW9wC0hw78MtW7NU3hqtCD75g2vFlDLt36llsYD7uB7SUzojLMP24N5IatXf7ylGXiGG9A== -http-signature@~1.3.6: - version "1.3.6" - resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.3.6.tgz#cb6fbfdf86d1c974f343be94e87f7fc128662cf9" - integrity sha512-3adrsD6zqo4GsTqtO7FyrejHNv+NgiIfAfv68+jVlFmSr9OGy7zrxONceFRLKvnnZA5jbxQBX1u9PpB6Wi32Gw== - dependencies: - assert-plus "^1.0.0" - jsprim "^2.0.2" - sshpk "^1.14.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" @@ -2725,21 +2292,6 @@ https-proxy-agent@^5.0.0: agent-base "6" debug "4" -human-signals@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-1.1.1.tgz#c5b1cd14f50aeae09ab6c59fe63ba3395fe4dfa3" - integrity sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw== - -human-signals@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" - integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== - -human-signals@^4.3.0: - version "4.3.1" - resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-4.3.1.tgz#ab7f811e851fca97ffbd2c1fe9a958964de321b2" - integrity sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ== - iconv-lite@^0.6.2: version "0.6.3" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501" @@ -2747,16 +2299,16 @@ iconv-lite@^0.6.2: dependencies: safer-buffer ">= 2.1.2 < 3.0.0" -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" integrity sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ== +immediate@~3.0.5: + version "3.0.6" + resolved "https://registry.yarnpkg.com/immediate/-/immediate-3.0.6.tgz#9db1dbd0faf8de6fbe0f5dd5e56bb606280de69b" + integrity sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ== + import-fresh@^3.0.0, import-fresh@^3.2.1: version "3.3.0" resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" @@ -2770,11 +2322,6 @@ imurmurhash@^0.1.4: resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== -indent-string@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" - integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== - inflight@^1.0.4: version "1.0.6" resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" @@ -2783,22 +2330,17 @@ inflight@^1.0.4: once "^1.3.0" wrappy "1" -inherits@2: +inherits@2, inherits@~2.0.3: version "2.0.4" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== -ini@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/ini/-/ini-2.0.0.tgz#e5fd556ecdd5726be978fa1001862eacb0a94bc5" - integrity sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA== - inline-style-parser@0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/inline-style-parser/-/inline-style-parser-0.1.1.tgz#ec8a3b429274e9c0a1f1c4ffa9453a7fef72cea1" integrity sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q== -internal-slot@^1.0.3, internal-slot@^1.0.4, internal-slot@^1.0.5: +internal-slot@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.5.tgz#f2a2ee21f668f8627a4667f309dc0f4fb6674986" integrity sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ== @@ -2820,14 +2362,6 @@ is-alphanumerical@^2.0.0: is-alphabetical "^2.0.0" is-decimal "^2.0.0" -is-arguments@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.1.1.tgz#15b3f88fda01f2a97fec84ca761a560f123efa9b" - integrity sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA== - dependencies: - call-bind "^1.0.2" - has-tostringtag "^1.0.0" - is-array-buffer@^3.0.1, is-array-buffer@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/is-array-buffer/-/is-array-buffer-3.0.2.tgz#f2653ced8412081638ecb0ebbd0c41c6e0aecbbe" @@ -2837,6 +2371,13 @@ is-array-buffer@^3.0.1, is-array-buffer@^3.0.2: get-intrinsic "^1.2.0" is-typed-array "^1.1.10" +is-async-function@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-async-function/-/is-async-function-2.0.0.tgz#8e4418efd3e5d3a6ebb0164c05ef5afb69aa9646" + integrity sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA== + dependencies: + has-tostringtag "^1.0.0" + is-bigint@^1.0.1: version "1.0.4" resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.4.tgz#08147a1875bc2b32005d41ccd8291dffc6691df3" @@ -2869,17 +2410,10 @@ is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.7: resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== -is-ci@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-3.0.1.tgz#db6ecbed1bd659c43dac0f45661e7674103d1867" - integrity sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ== - dependencies: - ci-info "^3.2.0" - -is-core-module@^2.11.0, is-core-module@^2.9.0: - version "2.12.1" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.12.1.tgz#0c0b6885b6f80011c71541ce15c8d66cf5a4f9fd" - integrity sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg== +is-core-module@^2.11.0, is-core-module@^2.13.0, is-core-module@^2.9.0: + version "2.13.0" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.13.0.tgz#bb52aa6e2cbd49a30c2ba68c42bf3435ba6072db" + integrity sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ== dependencies: has "^1.0.3" @@ -2895,25 +2429,24 @@ is-decimal@^2.0.0: resolved "https://registry.yarnpkg.com/is-decimal/-/is-decimal-2.0.1.tgz#9469d2dc190d0214fd87d78b78caecc0cc14eef7" integrity sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A== -is-docker@^2.0.0: - version "2.2.1" - resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.2.1.tgz#33eeabe23cfe86f14bde4408a02c0cfb853acdaa" - integrity sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ== - -is-docker@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-3.0.0.tgz#90093aa3106277d8a77a5910dbae71747e15a200" - integrity sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ== - is-extglob@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== -is-fullwidth-code-point@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" - integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== +is-finalizationregistry@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-finalizationregistry/-/is-finalizationregistry-1.0.2.tgz#c8749b65f17c133313e661b1289b95ad3dbd62e6" + integrity sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw== + dependencies: + call-bind "^1.0.2" + +is-generator-function@^1.0.10: + version "1.0.10" + resolved "https://registry.yarnpkg.com/is-generator-function/-/is-generator-function-1.0.10.tgz#f1558baf1ac17e0deea7c0415c438351ff2b3c72" + integrity sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A== + dependencies: + has-tostringtag "^1.0.0" is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: version "4.0.3" @@ -2927,22 +2460,7 @@ is-hexadecimal@^2.0.0: resolved "https://registry.yarnpkg.com/is-hexadecimal/-/is-hexadecimal-2.0.1.tgz#86b5bf668fca307498d319dfc03289d781a90027" integrity sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg== -is-inside-container@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-inside-container/-/is-inside-container-1.0.0.tgz#e81fba699662eb31dbdaf26766a61d4814717ea4" - integrity sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA== - dependencies: - is-docker "^3.0.0" - -is-installed-globally@~0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/is-installed-globally/-/is-installed-globally-0.4.0.tgz#9a0fd407949c30f86eb6959ef1b7994ed0b7b520" - integrity sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ== - dependencies: - global-dirs "^3.0.0" - is-path-inside "^3.0.2" - -is-map@^2.0.1, is-map@^2.0.2: +is-map@^2.0.1: version "2.0.2" resolved "https://registry.yarnpkg.com/is-map/-/is-map-2.0.2.tgz#00922db8c9bf73e81b7a335827bc2a43f2b91127" integrity sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg== @@ -2964,7 +2482,7 @@ is-number@^7.0.0: resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== -is-path-inside@^3.0.2, is-path-inside@^3.0.3: +is-path-inside@^3.0.3: version "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== @@ -2974,6 +2492,13 @@ is-plain-obj@^4.0.0: resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-4.1.0.tgz#d65025edec3657ce032fd7db63c97883eaed71f0" integrity sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg== +is-reference@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/is-reference/-/is-reference-3.0.1.tgz#d400f4260f7e55733955e60d361d827eb4d3b831" + integrity sha512-baJJdQLiYaJdvFbJqXrcGv3WU3QCzBlUcI5QhbesIm6/xPsvmO+2CDoi/GMOFBQEQm+PXkwOPrp9KK5ozZsp2w== + dependencies: + "@types/estree" "*" + is-regex@^1.1.4: version "1.1.4" resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958" @@ -2982,7 +2507,7 @@ is-regex@^1.1.4: call-bind "^1.0.2" has-tostringtag "^1.0.0" -is-set@^2.0.1, is-set@^2.0.2: +is-set@^2.0.1: version "2.0.2" resolved "https://registry.yarnpkg.com/is-set/-/is-set-2.0.2.tgz#90755fa4c2562dc1c5d4024760d6119b94ca18ec" integrity sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g== @@ -2999,11 +2524,6 @@ is-stream@^2.0.0: resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== -is-stream@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-3.0.0.tgz#e6bfd7aa6bef69f4f472ce9bb681e3e57b4319ac" - integrity sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA== - is-string@^1.0.5, is-string@^1.0.7: version "1.0.7" resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.7.tgz#0dd12bf2006f255bb58f695110eff7491eebc0fd" @@ -3019,25 +2539,11 @@ is-symbol@^1.0.2, is-symbol@^1.0.3: has-symbols "^1.0.2" is-typed-array@^1.1.10, is-typed-array@^1.1.9: - version "1.1.10" - resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.10.tgz#36a5b5cb4189b575d1a3e4b08536bfb485801e3f" - integrity sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A== + version "1.1.12" + resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.12.tgz#d0bab5686ef4a76f7a73097b95470ab199c57d4a" + integrity sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg== dependencies: - available-typed-arrays "^1.0.5" - call-bind "^1.0.2" - for-each "^0.3.3" - gopd "^1.0.1" - has-tostringtag "^1.0.0" - -is-typedarray@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" - integrity sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA== - -is-unicode-supported@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7" - integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== + which-typed-array "^1.1.11" is-weakmap@^2.0.1: version "2.0.1" @@ -3059,42 +2565,30 @@ is-weakset@^2.0.1: call-bind "^1.0.2" get-intrinsic "^1.1.1" -is-wsl@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-2.2.0.tgz#74a4c76e77ca9fd3f932f290c17ea326cd157271" - integrity sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww== - dependencies: - is-docker "^2.0.0" - isarray@^2.0.5: version "2.0.5" resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.5.tgz#8af1e4c1221244cc62459faf38940d4e644a5723" integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw== +isarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ== + isexe@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== -isomorphic-fetch@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/isomorphic-fetch/-/isomorphic-fetch-3.0.0.tgz#0267b005049046d2421207215d45d6a262b8b8b4" - integrity sha512-qvUtwJ3j6qwsF3jLxkZ72qCgjMysPzDfeV240JHiGZsANBYd+EEuu35v7dfrJ9Up0Ak07D7GGSkGhCHTqg/5wA== - dependencies: - node-fetch "^2.6.1" - whatwg-fetch "^3.4.1" - -isstream@~0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" - integrity sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g== - -its-fine@^1.0.6: +iterator.prototype@^1.1.0: version "1.1.1" - resolved "https://registry.yarnpkg.com/its-fine/-/its-fine-1.1.1.tgz#e74b93fddd487441f978a50f64f0f5af4d2fc38e" - integrity sha512-v1Ia1xl20KbuSGlwoaGsW0oxsw8Be+TrXweidxD9oT/1lAh6O3K3/GIM95Tt6WCiv6W+h2M7RB1TwdoAjQyyKw== + resolved "https://registry.yarnpkg.com/iterator.prototype/-/iterator.prototype-1.1.1.tgz#ab5b790e23ec00658f5974e032a2b05188bd3a5c" + integrity sha512-9E+nePc8C9cnQldmNl6bgpTY6zI4OPRZd97fhJ/iVZ1GifIUDVV5F6x1nEDqpe8KaMEZGT4xgrwKQDxXnjOIZQ== dependencies: - "@types/react-reconciler" "^0.28.0" + define-properties "^1.2.0" + get-intrinsic "^1.2.1" + has-symbols "^1.0.3" + reflect.getprototypeof "^1.0.3" javascript-natural-sort@0.7.1: version "0.7.1" @@ -3102,14 +2596,14 @@ javascript-natural-sort@0.7.1: integrity sha512-nO6jcEfZWQXDhOiBtG2KvKyEptz7RVbpGP4vTD2hLBdmNQSsCiicO2Ioinv6UI4y9ukqnBpy+XZ9H6uLNgJTlw== jiti@^1.17.2: - version "1.18.2" - resolved "https://registry.yarnpkg.com/jiti/-/jiti-1.18.2.tgz#80c3ef3d486ebf2450d9335122b32d121f2a83cd" - integrity sha512-QAdOptna2NYiSSpv0O/BwoHBSmz4YhpzJHyi+fnMRTXFjp7B8i/YG5Z8IfusxB1ufjcD2Sre1F3R+nX3fvy7gg== + version "1.19.3" + resolved "https://registry.yarnpkg.com/jiti/-/jiti-1.19.3.tgz#ef554f76465b3c2b222dc077834a71f0d4a37569" + integrity sha512-5eEbBDQT/jF1xg6l36P+mWGGoH9Spuy0PCdSr2dtWRDGC6ph/w9ZCL4lmESW8f8F7MwT3XKescfP0wnZWAKL9w== js-sdsl@^4.1.4: - version "4.4.0" - resolved "https://registry.yarnpkg.com/js-sdsl/-/js-sdsl-4.4.0.tgz#8b437dbe642daa95760400b602378ed8ffea8430" - integrity sha512-FfVSdx6pJ41Oa+CF7RDaFmTnCaFhua+SNYQX74riGOpl96x+2jQCqEfQ2bnXu/5DPCqlRuiqyvTJM0Qjz26IVg== + version "4.4.2" + resolved "https://registry.yarnpkg.com/js-sdsl/-/js-sdsl-4.4.2.tgz#2e3c031b1f47d3aca8b775532e3ebb0818e7f847" + integrity sha512-dwXFwByc/ajSV6m5bcKAPwe4yDDF6D614pxmIi5odytzxRlwqF6nwoiCek80Ixc7Cvma5awClxrzFtxCQvcM8w== "js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: version "4.0.0" @@ -3123,11 +2617,6 @@ js-yaml@^4.1.0: dependencies: argparse "^2.0.1" -jsbn@~0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" - integrity sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg== - jsesc@^2.5.1: version "2.5.2" resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" @@ -3140,26 +2629,21 @@ json-bigint@^1.0.0: dependencies: bignumber.js "^9.0.0" +json-buffer@3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.1.tgz#9338802a30d3b6605fbe0613e094008ca8c05a13" + integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ== + json-schema-traverse@^0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== -json-schema@0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.4.0.tgz#f7de4cf6efab838ebaeb3236474cbba5a1930ab5" - integrity sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA== - json-stable-stringify-without-jsonify@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== -json-stringify-safe@~5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" - integrity sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA== - json5@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.2.tgz#63d98d60f21b313b77c4d6da18bfa69d80e1d593" @@ -3167,42 +2651,46 @@ json5@^1.0.2: 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" +json5@^2.1.2: + version "2.2.3" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" + integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== jsonwebtoken@^9.0.0: - version "9.0.0" - resolved "https://registry.yarnpkg.com/jsonwebtoken/-/jsonwebtoken-9.0.0.tgz#d0faf9ba1cc3a56255fe49c0961a67e520c1926d" - integrity sha512-tuGfYXxkQGDPnLJ7SibiQgVgeDgfbPq2k2ICcbgqW8WxWLBAxKQM/ZCu/IT8SOSwmaYl4dpTFCW5xZv7YbbWUw== + version "9.0.2" + resolved "https://registry.yarnpkg.com/jsonwebtoken/-/jsonwebtoken-9.0.2.tgz#65ff91f4abef1784697d40952bb1998c504caaf3" + integrity sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ== dependencies: jws "^3.2.2" - lodash "^4.17.21" + lodash.includes "^4.3.0" + lodash.isboolean "^3.0.3" + lodash.isinteger "^4.0.4" + lodash.isnumber "^3.0.3" + lodash.isplainobject "^4.0.6" + lodash.isstring "^4.0.1" + lodash.once "^4.0.0" ms "^2.1.1" - semver "^7.3.8" - -jsprim@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-2.0.2.tgz#77ca23dbcd4135cd364800d22ff82c2185803d4d" - integrity sha512-gqXddjPqQ6G40VdnI6T6yObEC+pDNvyP95wdQhkWkg7crHH3km5qP1FsOXEkzEQwnz6gz5qGTn1c2Y52wP3OyQ== - dependencies: - assert-plus "1.0.0" - extsprintf "1.3.0" - json-schema "0.4.0" - verror "1.10.0" + semver "^7.5.4" "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" - integrity sha512-fYQHZTZ8jSfmWZ0iyzfwiU4WDX4HpHbMCZ3gPlWYiCl3BoeOTsqKBqnTVfH2rYT7eP5c3sVbeSPHnnJOaTrWiw== + version "3.3.5" + resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz#4766bd05a8e2a11af222becd19e15575e52a853a" + integrity sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ== dependencies: - array-includes "^3.1.5" - object.assign "^4.1.3" + array-includes "^3.1.6" + array.prototype.flat "^1.3.1" + object.assign "^4.1.4" + object.values "^1.1.6" + +jszip@^3.10.1: + version "3.10.1" + resolved "https://registry.yarnpkg.com/jszip/-/jszip-3.10.1.tgz#34aee70eb18ea1faec2f589208a157d1feb091c2" + integrity sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g== + dependencies: + lie "~3.3.0" + pako "~1.0.2" + readable-stream "~2.3.6" + setimmediate "^1.0.5" jwa@^1.4.1: version "1.4.1" @@ -3239,22 +2727,24 @@ jws@^4.0.0: safe-buffer "^5.0.1" katex@^0.16.0: - version "0.16.7" - resolved "https://registry.yarnpkg.com/katex/-/katex-0.16.7.tgz#36be1d4ed96e8afdc5863407e70f8fb250aeafd5" - integrity sha512-Xk9C6oGKRwJTfqfIbtr0Kes9OSv6IFsuhFGc7tW4urlpMJtuh+7YhzU6YEG9n8gmWKcMAFzkp7nr+r69kV0zrA== + version "0.16.8" + resolved "https://registry.yarnpkg.com/katex/-/katex-0.16.8.tgz#89b453f40e8557f423f31a1009e9298dd99d5ceb" + integrity sha512-ftuDnJbcbOckGY11OO+zg3OofESlbR5DRl2cmN8HeWeeFIV7wTXvAOx8kEjZjobhA+9wh2fbKeO6cdcA9Mnovg== dependencies: commander "^8.3.0" +keyv@^4.5.3: + version "4.5.3" + resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.3.tgz#00873d2b046df737963157bd04f294ca818c9c25" + integrity sha512-QCiSav9WaX1PgETJ+SpNnx2PRRapJ/oRSXM4VO5OGYGSjrxbKPVFVhB3l2OCbLCk329N8qyAtsJjSjvVBWzEug== + dependencies: + json-buffer "3.0.1" + kleur@^4.0.3: version "4.1.5" resolved "https://registry.yarnpkg.com/kleur/-/kleur-4.1.5.tgz#95106101795f7050c6c650f350c683febddb1780" integrity sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ== -ktx-parse@^0.4.5: - version "0.4.5" - resolved "https://registry.yarnpkg.com/ktx-parse/-/ktx-parse-0.4.5.tgz#79905e22281a9d3e602b2ff522df1ee7d1813aa6" - integrity sha512-MK3FOody4TXbFf8Yqv7EBbySw7aPvEcPX++Ipt6Sox+/YMFvR5xaTyhfNSk1AEmMy+RYIw81ctN4IMxCB8OAlg== - 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" @@ -3267,11 +2757,6 @@ language-tags@=1.0.5: dependencies: language-subtag-registry "~0.3.2" -lazy-ass@^1.6.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/lazy-ass/-/lazy-ass-1.6.0.tgz#7999655e8646c17f089fdd187d150d3324d54513" - integrity sha512-cc8oEVoctTvsFZ/Oje/kGnHbpWHYBe8IAJe4C0QNc3t8uM/0Y8+erSz/7Y1ALuXTEZTMvxXwO6YbX1ey3ujiZw== - levn@^0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" @@ -3280,6 +2765,13 @@ levn@^0.4.1: prelude-ls "^1.2.1" type-check "~0.4.0" +lie@~3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/lie/-/lie-3.3.0.tgz#dcf82dee545f46074daf200c7c1c5a08e0f40f6a" + integrity sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ== + dependencies: + immediate "~3.0.5" + lil-gui@~0.17.0: version "0.17.0" resolved "https://registry.yarnpkg.com/lil-gui/-/lil-gui-0.17.0.tgz#b41ae55d0023fcd9185f7395a218db0f58189663" @@ -3290,38 +2782,25 @@ lilconfig@^2.0.5, lilconfig@^2.0.6: resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-2.1.0.tgz#78e23ac89ebb7e1bfbf25b18043de756548e7f52" integrity sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ== -linebreak@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/linebreak/-/linebreak-1.1.0.tgz#831cf378d98bced381d8ab118f852bd50d81e46b" - integrity sha512-MHp03UImeVhB7XZtjd0E4n6+3xr5Dq/9xI/5FptGk5FrbDR3zagPa2DS6U8ks/3HjbKWG9Q1M2ufOzxV2qLYSQ== - dependencies: - base64-js "0.0.8" - unicode-trie "^2.0.0" - lines-and-columns@^1.1.6: version "1.2.4" resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== -listr2@^3.8.3: - version "3.14.0" - resolved "https://registry.yarnpkg.com/listr2/-/listr2-3.14.0.tgz#23101cc62e1375fd5836b248276d1d2b51fdbe9e" - integrity sha512-TyWI8G99GX9GjE54cJ+RrNMcIFBfwMPxc3XTFiAYGN4s10hWROGtOg7+O6u6LE3mNkyld7RSLE6nrKBvTfcs3g== - dependencies: - cli-truncate "^2.1.0" - colorette "^2.0.16" - log-update "^4.0.0" - p-map "^4.0.0" - rfdc "^1.3.0" - rxjs "^7.5.1" - through "^2.3.8" - wrap-ansi "^7.0.0" - load-script@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/load-script/-/load-script-1.0.0.tgz#0491939e0bee5643ee494a7e3da3d2bac70c6ca4" integrity sha512-kPEjMFtZvwL9TaZo0uZ2ml+Ye9HUMmPwbYRJ324qF9tqMejwykJ5ggTyvzmrbBeapCAbk98BSbTeovHEEP1uCA== +loader-utils@^2.0.0: + version "2.0.4" + resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-2.0.4.tgz#8b5cb38b5c34a9a018ee1fc0e6a066d1dfcc528c" + integrity sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw== + dependencies: + big.js "^5.2.2" + emojis-list "^3.0.0" + json5 "^2.1.2" + locate-path@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" @@ -3334,65 +2813,57 @@ lodash.castarray@^4.4.0: resolved "https://registry.yarnpkg.com/lodash.castarray/-/lodash.castarray-4.4.0.tgz#c02513515e309daddd4c24c60cfddcf5976d9115" integrity sha512-aVx8ztPv7/2ULbArGJ2Y42bG1mEQ5mGjpdvrbJcJFU3TbYybe+QlLS4pst9zV52ymy2in1KpFPiZnAOATxD4+Q== -lodash.clamp@^4.0.3: - version "4.0.3" - resolved "https://registry.yarnpkg.com/lodash.clamp/-/lodash.clamp-4.0.3.tgz#5c24bedeeeef0753560dc2b4cb4671f90a6ddfaa" - integrity sha512-HvzRFWjtcguTW7yd8NJBshuNaCa8aqNFtnswdT7f/cMd/1YKy5Zzoq4W/Oxvnx9l7aeY258uSdDfM793+eLsVg== +lodash.includes@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/lodash.includes/-/lodash.includes-4.3.0.tgz#60bb98a87cb923c68ca1e51325483314849f553f" + integrity sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w== + +lodash.isboolean@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz#6c2e171db2a257cd96802fd43b01b20d5f5870f6" + integrity sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg== + +lodash.isinteger@^4.0.4: + version "4.0.4" + resolved "https://registry.yarnpkg.com/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz#619c0af3d03f8b04c31f5882840b77b11cd68343" + integrity sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA== + +lodash.isnumber@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz#3ce76810c5928d03352301ac287317f11c0b1ffc" + integrity sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw== lodash.isplainobject@^4.0.6: version "4.0.6" resolved "https://registry.yarnpkg.com/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz#7c526a52d89b45c45cc690b88163be0497f550cb" integrity sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA== +lodash.isstring@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/lodash.isstring/-/lodash.isstring-4.0.1.tgz#d527dfb5456eca7cc9bb95d5daeaf88ba54a5451" + integrity sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw== + lodash.merge@^4.6.2: version "4.6.2" resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== -lodash.omit@^4.5.0: - version "4.5.0" - resolved "https://registry.yarnpkg.com/lodash.omit/-/lodash.omit-4.5.0.tgz#6eb19ae5a1ee1dd9df0b969e66ce0b7fa30b5e60" - integrity sha512-XeqSp49hNGmlkj2EJlfrQFIzQ6lXdNro9sddtQzcJY8QaoC2GO0DT7xaIokHeyM+mIT0mPMlPvkYzg2xCuHdZg== - -lodash.once@^4.1.1: +lodash.once@^4.0.0: version "4.1.1" resolved "https://registry.yarnpkg.com/lodash.once/-/lodash.once-4.1.1.tgz#0dd3971213c7c56df880977d504c88fb471a97ac" integrity sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg== -lodash.pick@^4.4.0: - version "4.4.0" - resolved "https://registry.yarnpkg.com/lodash.pick/-/lodash.pick-4.4.0.tgz#52f05610fff9ded422611441ed1fc123a03001b3" - integrity sha512-hXt6Ul/5yWjfklSGvLQl8vM//l3FtyHZeuelpzK6mm99pNvN9yTDruNZPEJZD1oWrqo+izBmB7oUfWgcCX7s4Q== - -lodash@4.17.21, lodash@^4.17.21: +lodash@^4.17.21: version "4.17.21" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== -log-symbols@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.1.0.tgz#3fbdbb95b4683ac9fc785111e792e558d4abd503" - integrity sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg== - dependencies: - chalk "^4.1.0" - is-unicode-supported "^0.1.0" - -log-update@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/log-update/-/log-update-4.0.0.tgz#589ecd352471f2a1c0c570287543a64dfd20e0a1" - integrity sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg== - dependencies: - ansi-escapes "^4.3.0" - cli-cursor "^3.1.0" - slice-ansi "^4.0.0" - wrap-ansi "^6.2.0" - longest-streak@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/longest-streak/-/longest-streak-3.1.0.tgz#62fa67cd958742a1574af9f39866364102d90cd4" integrity sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g== -loose-envify@^1.1.0, loose-envify@^1.4.0: +loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== @@ -3406,10 +2877,20 @@ lru-cache@^6.0.0: dependencies: yallist "^4.0.0" -maath@^0.5.2: - version "0.5.3" - resolved "https://registry.yarnpkg.com/maath/-/maath-0.5.3.tgz#777a1f9b8463c6ffb199ea43406874a357c0cd58" - integrity sha512-ut63A4zTd9abtpi+sOHW1fPWPtAFrjK0E17eAthx1k93W/T2cWLKV5oaswyotJVDvvW1EXSdokAqhK5KOu0Qdw== +make-cancellable-promise@^1.0.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/make-cancellable-promise/-/make-cancellable-promise-1.3.1.tgz#3bd89704c75afe6251cdd6a82baca1fcfbd2c792" + integrity sha512-DWOzWdO3xhY5ESjVR+wVFy03rpt0ZccS4bunccNwngoX6rllKlMZm6S9ZnJ5nMuDDweqDMjtaO0g6tZeh+cCUA== + +make-event-props@^1.1.0: + version "1.6.1" + resolved "https://registry.yarnpkg.com/make-event-props/-/make-event-props-1.6.1.tgz#1d587017c3f1f3b42719b775af93d5253656ccdd" + integrity sha512-JhvWq/iz1BvlmnPvLJjXv+xnMPJZuychrDC68V+yCGQJn5chcA8rLGKo5EP1XwIKVrigSXKLmbeXAGkf36wdCQ== + +markdown-extensions@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/markdown-extensions/-/markdown-extensions-1.1.1.tgz#fea03b539faeaee9b4ef02a3769b455b189f7fc3" + integrity sha512-WWC0ZuMzCyDHYCasEGs4IPvLyTGftYwh6wIEOULOF0HXcqZlhwRzrK0w2VUlxWA98xnvb/jszw4ZSkJ6ADpM6Q== markdown-table@^3.0.0: version "3.0.3" @@ -3435,10 +2916,10 @@ mdast-util-find-and-replace@^2.0.0: unist-util-is "^5.0.0" unist-util-visit-parents "^5.0.0" -mdast-util-from-markdown@^1.0.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/mdast-util-from-markdown/-/mdast-util-from-markdown-1.3.0.tgz#0214124154f26154a2b3f9d401155509be45e894" - integrity sha512-HN3W1gRIuN/ZW295c7zi7g9lVBllMgZE40RxCX37wrTPWXCWtpvOZdfnuK+1WNpvZje6XuJeI3Wnb4TJEUem+g== +mdast-util-from-markdown@^1.0.0, mdast-util-from-markdown@^1.1.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/mdast-util-from-markdown/-/mdast-util-from-markdown-1.3.1.tgz#9421a5a247f10d31d2faed2a30df5ec89ceafcf0" + integrity sha512-4xTO/M8c82qBcnQc1tgpNtubGUW/Y1tBQ1B0i5CtSoelOLKFYlElIr3bvgREYYO5iRqbMY1YuqZng0GVOI8Qww== dependencies: "@types/mdast" "^3.0.0" "@types/unist" "^2.0.0" @@ -3520,13 +3001,56 @@ mdast-util-math@^2.0.0: longest-streak "^3.0.0" mdast-util-to-markdown "^1.3.0" -mdast-util-newline-to-break@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/mdast-util-newline-to-break/-/mdast-util-newline-to-break-1.0.0.tgz#a42699874a9240dc89bfcf256d3ff3036856abba" - integrity sha512-491LcYv3gbGhhCrLoeALncQmega2xPh+m3gbsIhVsOX4sw85+ShLFPvPyibxc1Swx/6GtzxgVodq+cGa/47ULg== +mdast-util-mdx-expression@^1.0.0: + version "1.3.2" + resolved "https://registry.yarnpkg.com/mdast-util-mdx-expression/-/mdast-util-mdx-expression-1.3.2.tgz#d027789e67524d541d6de543f36d51ae2586f220" + integrity sha512-xIPmR5ReJDu/DHH1OoIT1HkuybIfRGYRywC+gJtI7qHjCJp/M9jrmBEJW22O8lskDWm562BX2W8TiAwRTb0rKA== dependencies: + "@types/estree-jsx" "^1.0.0" + "@types/hast" "^2.0.0" "@types/mdast" "^3.0.0" - mdast-util-find-and-replace "^2.0.0" + mdast-util-from-markdown "^1.0.0" + mdast-util-to-markdown "^1.0.0" + +mdast-util-mdx-jsx@^2.0.0: + version "2.1.4" + resolved "https://registry.yarnpkg.com/mdast-util-mdx-jsx/-/mdast-util-mdx-jsx-2.1.4.tgz#7c1f07f10751a78963cfabee38017cbc8b7786d1" + integrity sha512-DtMn9CmVhVzZx3f+optVDF8yFgQVt7FghCRNdlIaS3X5Bnym3hZwPbg/XW86vdpKjlc1PVj26SpnLGeJBXD3JA== + dependencies: + "@types/estree-jsx" "^1.0.0" + "@types/hast" "^2.0.0" + "@types/mdast" "^3.0.0" + "@types/unist" "^2.0.0" + ccount "^2.0.0" + mdast-util-from-markdown "^1.1.0" + mdast-util-to-markdown "^1.3.0" + parse-entities "^4.0.0" + stringify-entities "^4.0.0" + unist-util-remove-position "^4.0.0" + unist-util-stringify-position "^3.0.0" + vfile-message "^3.0.0" + +mdast-util-mdx@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/mdast-util-mdx/-/mdast-util-mdx-2.0.1.tgz#49b6e70819b99bb615d7223c088d295e53bb810f" + integrity sha512-38w5y+r8nyKlGvNjSEqWrhG0w5PmnRA+wnBvm+ulYCct7nsGYhFVb0lljS9bQav4psDAS1eGkP2LMVcZBi/aqw== + dependencies: + mdast-util-from-markdown "^1.0.0" + mdast-util-mdx-expression "^1.0.0" + mdast-util-mdx-jsx "^2.0.0" + mdast-util-mdxjs-esm "^1.0.0" + mdast-util-to-markdown "^1.0.0" + +mdast-util-mdxjs-esm@^1.0.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/mdast-util-mdxjs-esm/-/mdast-util-mdxjs-esm-1.3.1.tgz#645d02cd607a227b49721d146fd81796b2e2d15b" + integrity sha512-SXqglS0HrEvSdUEfoXFtcg7DRl7S2cwOXc7jkuusG472Mmjag34DUDeOJUZtl+BVnyeO1frIgVpHlNRWc2gk/w== + dependencies: + "@types/estree-jsx" "^1.0.0" + "@types/hast" "^2.0.0" + "@types/mdast" "^3.0.0" + mdast-util-from-markdown "^1.0.0" + mdast-util-to-markdown "^1.0.0" mdast-util-phrasing@^3.0.0: version "3.0.1" @@ -3589,25 +3113,27 @@ memoize-one@^5.1.1: resolved "https://registry.yarnpkg.com/memoize-one/-/memoize-one-5.2.1.tgz#8337aa3c4335581839ec01c3d594090cebe8f00e" integrity sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q== -merge-stream@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" - integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== +merge-class-names@^1.1.1: + version "1.4.2" + resolved "https://registry.yarnpkg.com/merge-class-names/-/merge-class-names-1.4.2.tgz#78d6d95ab259e7e647252a7988fd25a27d5a8835" + integrity sha512-bOl98VzwCGi25Gcn3xKxnR5p/WrhWFQB59MS/aGENcmUc6iSm96yrFDF0XSNurX9qN4LbJm0R9kfvsQ17i8zCw== + +merge-refs@^1.0.0: + version "1.2.1" + resolved "https://registry.yarnpkg.com/merge-refs/-/merge-refs-1.2.1.tgz#abddc800375395a4a4eb5c45ebf2a52557fdbe34" + integrity sha512-pRPz39HQz2xzHdXAGvtJ9S8aEpNgpUjzb5yPC3ytozodmsHg+9nqgRs7/YOmn9fM/TLzntAC8AdGTidKxOq9TQ== + dependencies: + "@types/react" "*" merge2@^1.3.0, merge2@^1.4.1: version "1.4.1" resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== -meshline@^3.1.6: - version "3.1.6" - resolved "https://registry.yarnpkg.com/meshline/-/meshline-3.1.6.tgz#eee67d9b0fd9841652cc1dc2d3833093ae8e68ca" - integrity sha512-8JZJOdaL5oz3PI/upG8JvP/5FfzYUOhrkJ8np/WKvXzl0/PZ2V9pqTvCIjSKv+w9ccg2xb+yyBhXAwt6ier3ug== - micromark-core-commonmark@^1.0.0, micromark-core-commonmark@^1.0.1: - version "1.0.6" - resolved "https://registry.yarnpkg.com/micromark-core-commonmark/-/micromark-core-commonmark-1.0.6.tgz#edff4c72e5993d93724a3c206970f5a15b0585ad" - integrity sha512-K+PkJTxqjFfSNkfAhp4GB+cZPfQd6dxtTXnf+RjZOV7T4EEXnvgzOcnp+eSTmpGk9d1S9sL6/lqrgSNn/s0HZA== + version "1.1.0" + resolved "https://registry.yarnpkg.com/micromark-core-commonmark/-/micromark-core-commonmark-1.1.0.tgz#1386628df59946b2d39fb2edfd10f3e8e0a75bb8" + integrity sha512-BgHO1aRbolh2hcrzL2d1La37V0Aoz73ymF8rAcKnohLy93titmv62E0gP8Hrx9PKcKrqCZ1BbLGbP3bEhoXYlw== dependencies: decode-named-character-reference "^1.0.0" micromark-factory-destination "^1.0.0" @@ -3627,9 +3153,9 @@ micromark-core-commonmark@^1.0.0, micromark-core-commonmark@^1.0.1: uvu "^0.5.0" micromark-extension-gfm-autolink-literal@^1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-1.0.4.tgz#3a8af48264be47138654ab0b8700a8e22785ef07" - integrity sha512-WCssN+M9rUyfHN5zPBn3/f0mIA7tqArHL/EKbv3CZK+LT2rG77FEikIQEqBkv46fOqXQK4NEW/Pc7Z27gshpeg== + version "1.0.5" + resolved "https://registry.yarnpkg.com/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-1.0.5.tgz#5853f0e579bbd8ef9e39a7c0f0f27c5a063a66e7" + integrity sha512-z3wJSLrDf8kRDOh2qBtoTRD53vJ+CWIyo7uyZuxf/JAbNJjiHsOpG1y5wxk8drtv3ETAHutCu6N3thkOOgueWg== dependencies: micromark-util-character "^1.0.0" micromark-util-sanitize-uri "^1.0.0" @@ -3637,9 +3163,9 @@ micromark-extension-gfm-autolink-literal@^1.0.0: micromark-util-types "^1.0.0" micromark-extension-gfm-footnote@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/micromark-extension-gfm-footnote/-/micromark-extension-gfm-footnote-1.1.0.tgz#73e3db823db9defef25f68074cb4cf4bb9cf6a8c" - integrity sha512-RWYce7j8+c0n7Djzv5NzGEGitNNYO3uj+h/XYMdS/JinH1Go+/Qkomg/rfxExFzYTiydaV6GLeffGO5qcJbMPA== + version "1.1.2" + resolved "https://registry.yarnpkg.com/micromark-extension-gfm-footnote/-/micromark-extension-gfm-footnote-1.1.2.tgz#05e13034d68f95ca53c99679040bc88a6f92fe2e" + integrity sha512-Yxn7z7SxgyGWRNa4wzf8AhYYWNrwl5q1Z8ii+CSTTIqVkmGZF1CElX2JI8g5yGoM3GAman9/PVCUFUSJ0kB/8Q== dependencies: micromark-core-commonmark "^1.0.0" micromark-factory-space "^1.0.0" @@ -3651,9 +3177,9 @@ micromark-extension-gfm-footnote@^1.0.0: uvu "^0.5.0" micromark-extension-gfm-strikethrough@^1.0.0: - version "1.0.5" - resolved "https://registry.yarnpkg.com/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-1.0.5.tgz#4db40b87d674a6fe1d00d59ac91118e4f5960f12" - integrity sha512-X0oI5eYYQVARhiNfbETy7BfLSmSilzN1eOuoRnrf9oUNsPRrWOAe9UqSizgw1vNxQBfOwL+n2610S3bYjVNi7w== + version "1.0.7" + resolved "https://registry.yarnpkg.com/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-1.0.7.tgz#c8212c9a616fa3bf47cb5c711da77f4fdc2f80af" + integrity sha512-sX0FawVE1o3abGk3vRjOH50L5TTLr3b5XMqnP9YDRb34M0v5OoZhG+OHFz1OffZ9dlwgpTBKaT4XW/AsUVnSDw== dependencies: micromark-util-chunked "^1.0.0" micromark-util-classify-character "^1.0.0" @@ -3663,9 +3189,9 @@ micromark-extension-gfm-strikethrough@^1.0.0: uvu "^0.5.0" micromark-extension-gfm-table@^1.0.0: - version "1.0.6" - resolved "https://registry.yarnpkg.com/micromark-extension-gfm-table/-/micromark-extension-gfm-table-1.0.6.tgz#22b2b18dff9db39bdb29d6017e53bdd370672c8e" - integrity sha512-92pq7Q+T+4kXH4M6kL+pc8WU23Z9iuhcqmtYFWdFWjm73ZscFpH2xE28+XFpGWlvgq3LUwcN0XC0PGCicYFpgA== + version "1.0.7" + resolved "https://registry.yarnpkg.com/micromark-extension-gfm-table/-/micromark-extension-gfm-table-1.0.7.tgz#dcb46074b0c6254c3fc9cc1f6f5002c162968008" + integrity sha512-3ZORTHtcSnMQEKtAOsBQ9/oHp9096pI/UvdPtN7ehKvrmZZ2+bbWhi0ln+I9drmwXMt5boocn6OlwQzNXeVeqw== dependencies: micromark-factory-space "^1.0.0" micromark-util-character "^1.0.0" @@ -3681,9 +3207,9 @@ micromark-extension-gfm-tagfilter@^1.0.0: micromark-util-types "^1.0.0" micromark-extension-gfm-task-list-item@^1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-1.0.4.tgz#4b66d87847de40cef2b5ceddb9f9629a6dfe7472" - integrity sha512-9XlIUUVnYXHsFF2HZ9jby4h3npfX10S1coXTnV035QGPgrtNYQq3J6IfIvcCIUAJrrqBVi5BqA/LmaOMJqPwMQ== + version "1.0.5" + resolved "https://registry.yarnpkg.com/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-1.0.5.tgz#b52ce498dc4c69b6a9975abafc18f275b9dde9f4" + integrity sha512-RMFXl2uQ0pNQy6Lun2YBYT9g9INXtWJULgbt01D/x8/6yJ2qpKyzdZD3pi6UIkzF++Da49xAelVKUeUMqd5eIQ== dependencies: micromark-factory-space "^1.0.0" micromark-util-character "^1.0.0" @@ -3706,9 +3232,9 @@ micromark-extension-gfm@^2.0.0: micromark-util-types "^1.0.0" micromark-extension-math@^2.0.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/micromark-extension-math/-/micromark-extension-math-2.1.1.tgz#9a2901d32a275a433e66e452ea48f4996fabf18b" - integrity sha512-4rTUTTwHuXNL/sHy/LpmTEku+YOJIK4VYdILxv8bRI4unSpfdd/UzOv/DBV2KqgBeGQiyA3vmsARrKS7WQWwxw== + version "2.1.2" + resolved "https://registry.yarnpkg.com/micromark-extension-math/-/micromark-extension-math-2.1.2.tgz#52c70cc8266cd20ada1ef5a479bfed9a19b789bf" + integrity sha512-es0CcOV89VNS9wFmyn+wyFTKweXGW4CEvdaAca6SWRWPyYCbBisnjaHLjWO4Nszuiud84jCpkHsqAJoa768Pvg== dependencies: "@types/katex" "^0.16.0" katex "^0.16.0" @@ -3718,48 +3244,127 @@ micromark-extension-math@^2.0.0: micromark-util-types "^1.0.0" uvu "^0.5.0" +micromark-extension-mdx-expression@^1.0.0: + version "1.0.8" + resolved "https://registry.yarnpkg.com/micromark-extension-mdx-expression/-/micromark-extension-mdx-expression-1.0.8.tgz#5bc1f5fd90388e8293b3ef4f7c6f06c24aff6314" + integrity sha512-zZpeQtc5wfWKdzDsHRBY003H2Smg+PUi2REhqgIhdzAa5xonhP03FcXxqFSerFiNUr5AWmHpaNPQTBVOS4lrXw== + dependencies: + "@types/estree" "^1.0.0" + micromark-factory-mdx-expression "^1.0.0" + micromark-factory-space "^1.0.0" + micromark-util-character "^1.0.0" + micromark-util-events-to-acorn "^1.0.0" + micromark-util-symbol "^1.0.0" + micromark-util-types "^1.0.0" + uvu "^0.5.0" + +micromark-extension-mdx-jsx@^1.0.0: + version "1.0.5" + resolved "https://registry.yarnpkg.com/micromark-extension-mdx-jsx/-/micromark-extension-mdx-jsx-1.0.5.tgz#e72d24b7754a30d20fb797ece11e2c4e2cae9e82" + integrity sha512-gPH+9ZdmDflbu19Xkb8+gheqEDqkSpdCEubQyxuz/Hn8DOXiXvrXeikOoBA71+e8Pfi0/UYmU3wW3H58kr7akA== + dependencies: + "@types/acorn" "^4.0.0" + "@types/estree" "^1.0.0" + estree-util-is-identifier-name "^2.0.0" + micromark-factory-mdx-expression "^1.0.0" + micromark-factory-space "^1.0.0" + micromark-util-character "^1.0.0" + micromark-util-symbol "^1.0.0" + micromark-util-types "^1.0.0" + uvu "^0.5.0" + vfile-message "^3.0.0" + +micromark-extension-mdx-md@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/micromark-extension-mdx-md/-/micromark-extension-mdx-md-1.0.1.tgz#595d4b2f692b134080dca92c12272ab5b74c6d1a" + integrity sha512-7MSuj2S7xjOQXAjjkbjBsHkMtb+mDGVW6uI2dBL9snOBCbZmoNgDAeZ0nSn9j3T42UE/g2xVNMn18PJxZvkBEA== + dependencies: + micromark-util-types "^1.0.0" + +micromark-extension-mdxjs-esm@^1.0.0: + version "1.0.5" + resolved "https://registry.yarnpkg.com/micromark-extension-mdxjs-esm/-/micromark-extension-mdxjs-esm-1.0.5.tgz#e4f8be9c14c324a80833d8d3a227419e2b25dec1" + integrity sha512-xNRBw4aoURcyz/S69B19WnZAkWJMxHMT5hE36GtDAyhoyn/8TuAeqjFJQlwk+MKQsUD7b3l7kFX+vlfVWgcX1w== + dependencies: + "@types/estree" "^1.0.0" + micromark-core-commonmark "^1.0.0" + micromark-util-character "^1.0.0" + micromark-util-events-to-acorn "^1.0.0" + micromark-util-symbol "^1.0.0" + micromark-util-types "^1.0.0" + unist-util-position-from-estree "^1.1.0" + uvu "^0.5.0" + vfile-message "^3.0.0" + +micromark-extension-mdxjs@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/micromark-extension-mdxjs/-/micromark-extension-mdxjs-1.0.1.tgz#f78d4671678d16395efeda85170c520ee795ded8" + integrity sha512-7YA7hF6i5eKOfFUzZ+0z6avRG52GpWR8DL+kN47y3f2KhxbBZMhmxe7auOeaTBrW2DenbbZTf1ea9tA2hDpC2Q== + dependencies: + acorn "^8.0.0" + acorn-jsx "^5.0.0" + micromark-extension-mdx-expression "^1.0.0" + micromark-extension-mdx-jsx "^1.0.0" + micromark-extension-mdx-md "^1.0.0" + micromark-extension-mdxjs-esm "^1.0.0" + micromark-util-combine-extensions "^1.0.0" + micromark-util-types "^1.0.0" + micromark-factory-destination@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/micromark-factory-destination/-/micromark-factory-destination-1.0.0.tgz#fef1cb59ad4997c496f887b6977aa3034a5a277e" - integrity sha512-eUBA7Rs1/xtTVun9TmV3gjfPz2wEwgK5R5xcbIM5ZYAtvGF6JkyaDsj0agx8urXnO31tEO6Ug83iVH3tdedLnw== + version "1.1.0" + resolved "https://registry.yarnpkg.com/micromark-factory-destination/-/micromark-factory-destination-1.1.0.tgz#eb815957d83e6d44479b3df640f010edad667b9f" + integrity sha512-XaNDROBgx9SgSChd69pjiGKbV+nfHGDPVYFs5dOoDd7ZnMAE+Cuu91BCpsY8RT2NP9vo/B8pds2VQNCLiu0zhg== dependencies: micromark-util-character "^1.0.0" micromark-util-symbol "^1.0.0" micromark-util-types "^1.0.0" micromark-factory-label@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/micromark-factory-label/-/micromark-factory-label-1.0.2.tgz#6be2551fa8d13542fcbbac478258fb7a20047137" - integrity sha512-CTIwxlOnU7dEshXDQ+dsr2n+yxpP0+fn271pu0bwDIS8uqfFcumXpj5mLn3hSC8iw2MUr6Gx8EcKng1dD7i6hg== + version "1.1.0" + resolved "https://registry.yarnpkg.com/micromark-factory-label/-/micromark-factory-label-1.1.0.tgz#cc95d5478269085cfa2a7282b3de26eb2e2dec68" + integrity sha512-OLtyez4vZo/1NjxGhcpDSbHQ+m0IIGnT8BoPamh+7jVlzLJBH98zzuCoUeMxvM6WsNeh8wx8cKvqLiPHEACn0w== dependencies: micromark-util-character "^1.0.0" micromark-util-symbol "^1.0.0" micromark-util-types "^1.0.0" uvu "^0.5.0" +micromark-factory-mdx-expression@^1.0.0: + version "1.0.9" + resolved "https://registry.yarnpkg.com/micromark-factory-mdx-expression/-/micromark-factory-mdx-expression-1.0.9.tgz#57ba4571b69a867a1530f34741011c71c73a4976" + integrity sha512-jGIWzSmNfdnkJq05c7b0+Wv0Kfz3NJ3N4cBjnbO4zjXIlxJr+f8lk+5ZmwFvqdAbUy2q6B5rCY//g0QAAaXDWA== + dependencies: + "@types/estree" "^1.0.0" + micromark-util-character "^1.0.0" + micromark-util-events-to-acorn "^1.0.0" + micromark-util-symbol "^1.0.0" + micromark-util-types "^1.0.0" + unist-util-position-from-estree "^1.0.0" + uvu "^0.5.0" + vfile-message "^3.0.0" + micromark-factory-space@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/micromark-factory-space/-/micromark-factory-space-1.0.0.tgz#cebff49968f2b9616c0fcb239e96685cb9497633" - integrity sha512-qUmqs4kj9a5yBnk3JMLyjtWYN6Mzfcx8uJfi5XAveBniDevmZasdGBba5b4QsvRcAkmvGo5ACmSUmyGiKTLZew== + version "1.1.0" + resolved "https://registry.yarnpkg.com/micromark-factory-space/-/micromark-factory-space-1.1.0.tgz#c8f40b0640a0150751d3345ed885a080b0d15faf" + integrity sha512-cRzEj7c0OL4Mw2v6nwzttyOZe8XY/Z8G0rzmWQZTBi/jjwyw/U4uqKtUORXQrR5bAZZnbTI/feRV/R7hc4jQYQ== dependencies: micromark-util-character "^1.0.0" micromark-util-types "^1.0.0" micromark-factory-title@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/micromark-factory-title/-/micromark-factory-title-1.0.2.tgz#7e09287c3748ff1693930f176e1c4a328382494f" - integrity sha512-zily+Nr4yFqgMGRKLpTVsNl5L4PMu485fGFDOQJQBl2NFpjGte1e86zC0da93wf97jrc4+2G2GQudFMHn3IX+A== + version "1.1.0" + resolved "https://registry.yarnpkg.com/micromark-factory-title/-/micromark-factory-title-1.1.0.tgz#dd0fe951d7a0ac71bdc5ee13e5d1465ad7f50ea1" + integrity sha512-J7n9R3vMmgjDOCY8NPw55jiyaQnH5kBdV2/UXCtZIpnHH3P6nHUKaH7XXEYuWwx/xUJcawa8plLBEjMPU24HzQ== dependencies: micromark-factory-space "^1.0.0" micromark-util-character "^1.0.0" micromark-util-symbol "^1.0.0" micromark-util-types "^1.0.0" - uvu "^0.5.0" micromark-factory-whitespace@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/micromark-factory-whitespace/-/micromark-factory-whitespace-1.0.0.tgz#e991e043ad376c1ba52f4e49858ce0794678621c" - integrity sha512-Qx7uEyahU1lt1RnsECBiuEbfr9INjQTGa6Err+gF3g0Tx4YEviPbqqGKNv/NrBaE7dVHdn1bVZKM/n5I/Bak7A== + version "1.1.0" + resolved "https://registry.yarnpkg.com/micromark-factory-whitespace/-/micromark-factory-whitespace-1.1.0.tgz#798fb7489f4c8abafa7ca77eed6b5745853c9705" + integrity sha512-v2WlmiymVSp5oMg+1Q0N1Lxmt6pMhIHD457whWM7/GUlEks1hI9xj5w3zbc4uuMKXGisksZk8DzP2UyGbGqNsQ== dependencies: micromark-factory-space "^1.0.0" micromark-util-character "^1.0.0" @@ -3767,48 +3372,48 @@ micromark-factory-whitespace@^1.0.0: micromark-util-types "^1.0.0" micromark-util-character@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/micromark-util-character/-/micromark-util-character-1.1.0.tgz#d97c54d5742a0d9611a68ca0cd4124331f264d86" - integrity sha512-agJ5B3unGNJ9rJvADMJ5ZiYjBRyDpzKAOk01Kpi1TKhlT1APx3XZk6eN7RtSz1erbWHC2L8T3xLZ81wdtGRZzg== + version "1.2.0" + resolved "https://registry.yarnpkg.com/micromark-util-character/-/micromark-util-character-1.2.0.tgz#4fedaa3646db249bc58caeb000eb3549a8ca5dcc" + integrity sha512-lXraTwcX3yH/vMDaFWCQJP1uIszLVebzUa3ZHdrgxr7KEU/9mL4mVgCpGbyhvNLNlauROiNUq7WN5u7ndbY6xg== dependencies: micromark-util-symbol "^1.0.0" micromark-util-types "^1.0.0" micromark-util-chunked@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/micromark-util-chunked/-/micromark-util-chunked-1.0.0.tgz#5b40d83f3d53b84c4c6bce30ed4257e9a4c79d06" - integrity sha512-5e8xTis5tEZKgesfbQMKRCyzvffRRUX+lK/y+DvsMFdabAicPkkZV6gO+FEWi9RfuKKoxxPwNL+dFF0SMImc1g== + version "1.1.0" + resolved "https://registry.yarnpkg.com/micromark-util-chunked/-/micromark-util-chunked-1.1.0.tgz#37a24d33333c8c69a74ba12a14651fd9ea8a368b" + integrity sha512-Ye01HXpkZPNcV6FiyoW2fGZDUw4Yc7vT0E9Sad83+bEDiCJ1uXu0S3mr8WLpsz3HaG3x2q0HM6CTuPdcZcluFQ== dependencies: micromark-util-symbol "^1.0.0" micromark-util-classify-character@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/micromark-util-classify-character/-/micromark-util-classify-character-1.0.0.tgz#cbd7b447cb79ee6997dd274a46fc4eb806460a20" - integrity sha512-F8oW2KKrQRb3vS5ud5HIqBVkCqQi224Nm55o5wYLzY/9PwHGXC01tr3d7+TqHHz6zrKQ72Okwtvm/xQm6OVNZA== + version "1.1.0" + resolved "https://registry.yarnpkg.com/micromark-util-classify-character/-/micromark-util-classify-character-1.1.0.tgz#6a7f8c8838e8a120c8e3c4f2ae97a2bff9190e9d" + integrity sha512-SL0wLxtKSnklKSUplok1WQFoGhUdWYKggKUiqhX+Swala+BtptGCu5iPRc+xvzJ4PXE/hwM3FNXsfEVgoZsWbw== dependencies: micromark-util-character "^1.0.0" micromark-util-symbol "^1.0.0" micromark-util-types "^1.0.0" micromark-util-combine-extensions@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/micromark-util-combine-extensions/-/micromark-util-combine-extensions-1.0.0.tgz#91418e1e74fb893e3628b8d496085639124ff3d5" - integrity sha512-J8H058vFBdo/6+AsjHp2NF7AJ02SZtWaVUjsayNFeAiydTxUwViQPxN0Hf8dp4FmCQi0UUFovFsEyRSUmFH3MA== + version "1.1.0" + resolved "https://registry.yarnpkg.com/micromark-util-combine-extensions/-/micromark-util-combine-extensions-1.1.0.tgz#192e2b3d6567660a85f735e54d8ea6e3952dbe84" + integrity sha512-Q20sp4mfNf9yEqDL50WwuWZHUrCO4fEyeDCnMGmG5Pr0Cz15Uo7KBs6jq+dq0EgX4DPwwrh9m0X+zPV1ypFvUA== dependencies: micromark-util-chunked "^1.0.0" micromark-util-types "^1.0.0" micromark-util-decode-numeric-character-reference@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-1.0.0.tgz#dcc85f13b5bd93ff8d2868c3dba28039d490b946" - integrity sha512-OzO9AI5VUtrTD7KSdagf4MWgHMtET17Ua1fIpXTpuhclCqD8egFWo85GxSGvxgkGS74bEahvtM0WP0HjvV0e4w== + version "1.1.0" + resolved "https://registry.yarnpkg.com/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-1.1.0.tgz#b1e6e17009b1f20bc652a521309c5f22c85eb1c6" + integrity sha512-m9V0ExGv0jB1OT21mrWcuf4QhP46pH1KkfWy9ZEezqHKAxkj4mPCy3nIH1rkbdMlChLHX531eOrymlwyZIf2iw== dependencies: micromark-util-symbol "^1.0.0" micromark-util-decode-string@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/micromark-util-decode-string/-/micromark-util-decode-string-1.0.2.tgz#942252ab7a76dec2dbf089cc32505ee2bc3acf02" - integrity sha512-DLT5Ho02qr6QWVNYbRZ3RYOSSWWFuH3tJexd3dgN1odEuPNxCngTCXJum7+ViRAd9BbdxCvMToPOD/IvVhzG6Q== + version "1.1.0" + resolved "https://registry.yarnpkg.com/micromark-util-decode-string/-/micromark-util-decode-string-1.1.0.tgz#dc12b078cba7a3ff690d0203f95b5d5537f2809c" + integrity sha512-YphLGCK8gM1tG1bd54azwyrQRjCFcmgj2S2GoJDNnh4vYtnL38JS8M4gpxzOPNyHdNEpheyWXCTnnTDY3N+NVQ== dependencies: decode-named-character-reference "^1.0.0" micromark-util-character "^1.0.0" @@ -3816,42 +3421,56 @@ micromark-util-decode-string@^1.0.0: micromark-util-symbol "^1.0.0" micromark-util-encode@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/micromark-util-encode/-/micromark-util-encode-1.0.1.tgz#2c1c22d3800870ad770ece5686ebca5920353383" - integrity sha512-U2s5YdnAYexjKDel31SVMPbfi+eF8y1U4pfiRW/Y8EFVCy/vgxk/2wWTxzcqE71LHtCuCzlBDRU2a5CQ5j+mQA== + version "1.1.0" + resolved "https://registry.yarnpkg.com/micromark-util-encode/-/micromark-util-encode-1.1.0.tgz#92e4f565fd4ccb19e0dcae1afab9a173bbeb19a5" + integrity sha512-EuEzTWSTAj9PA5GOAs992GzNh2dGQO52UvAbtSOMvXTxv3Criqb6IOzJUBCmEqrrXSblJIJBbFFv6zPxpreiJw== + +micromark-util-events-to-acorn@^1.0.0: + version "1.2.3" + resolved "https://registry.yarnpkg.com/micromark-util-events-to-acorn/-/micromark-util-events-to-acorn-1.2.3.tgz#a4ab157f57a380e646670e49ddee97a72b58b557" + integrity sha512-ij4X7Wuc4fED6UoLWkmo0xJQhsktfNh1J0m8g4PbIMPlx+ek/4YdW5mvbye8z/aZvAPUoxgXHrwVlXAPKMRp1w== + dependencies: + "@types/acorn" "^4.0.0" + "@types/estree" "^1.0.0" + "@types/unist" "^2.0.0" + estree-util-visit "^1.0.0" + micromark-util-symbol "^1.0.0" + micromark-util-types "^1.0.0" + uvu "^0.5.0" + vfile-message "^3.0.0" micromark-util-html-tag-name@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/micromark-util-html-tag-name/-/micromark-util-html-tag-name-1.1.0.tgz#eb227118befd51f48858e879b7a419fc0df20497" - integrity sha512-BKlClMmYROy9UiV03SwNmckkjn8QHVaWkqoAqzivabvdGcwNGMMMH/5szAnywmsTBUzDsU57/mFi0sp4BQO6dA== + version "1.2.0" + resolved "https://registry.yarnpkg.com/micromark-util-html-tag-name/-/micromark-util-html-tag-name-1.2.0.tgz#48fd7a25826f29d2f71479d3b4e83e94829b3588" + integrity sha512-VTQzcuQgFUD7yYztuQFKXT49KghjtETQ+Wv/zUjGSGBioZnkA4P1XXZPT1FHeJA6RwRXSF47yvJ1tsJdoxwO+Q== micromark-util-normalize-identifier@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-1.0.0.tgz#4a3539cb8db954bbec5203952bfe8cedadae7828" - integrity sha512-yg+zrL14bBTFrQ7n35CmByWUTFsgst5JhA4gJYoty4Dqzj4Z4Fr/DHekSS5aLfH9bdlfnSvKAWsAgJhIbogyBg== + version "1.1.0" + resolved "https://registry.yarnpkg.com/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-1.1.0.tgz#7a73f824eb9f10d442b4d7f120fecb9b38ebf8b7" + integrity sha512-N+w5vhqrBihhjdpM8+5Xsxy71QWqGn7HYNUvch71iV2PM7+E3uWGox1Qp90loa1ephtCxG2ftRV/Conitc6P2Q== dependencies: micromark-util-symbol "^1.0.0" micromark-util-resolve-all@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/micromark-util-resolve-all/-/micromark-util-resolve-all-1.0.0.tgz#a7c363f49a0162e931960c44f3127ab58f031d88" - integrity sha512-CB/AGk98u50k42kvgaMM94wzBqozSzDDaonKU7P7jwQIuH2RU0TeBqGYJz2WY1UdihhjweivStrJ2JdkdEmcfw== + version "1.1.0" + resolved "https://registry.yarnpkg.com/micromark-util-resolve-all/-/micromark-util-resolve-all-1.1.0.tgz#4652a591ee8c8fa06714c9b54cd6c8e693671188" + integrity sha512-b/G6BTMSg+bX+xVCshPTPyAu2tmA0E4X98NSR7eIbeC6ycCqCeE7wjfDIgzEbkzdEVJXRtOG4FbEm/uGbCRouA== dependencies: micromark-util-types "^1.0.0" micromark-util-sanitize-uri@^1.0.0, micromark-util-sanitize-uri@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-1.1.0.tgz#f12e07a85106b902645e0364feb07cf253a85aee" - integrity sha512-RoxtuSCX6sUNtxhbmsEFQfWzs8VN7cTctmBPvYivo98xb/kDEoTCtJQX5wyzIYEmk/lvNFTat4hL8oW0KndFpg== + version "1.2.0" + resolved "https://registry.yarnpkg.com/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-1.2.0.tgz#613f738e4400c6eedbc53590c67b197e30d7f90d" + integrity sha512-QO4GXv0XZfWey4pYFndLUKEAktKkG5kZTdUNaTAkzbuJxn2tNBOr+QtxR2XpWaMhbImT2dPzyLrPXLlPhph34A== dependencies: micromark-util-character "^1.0.0" micromark-util-encode "^1.0.0" micromark-util-symbol "^1.0.0" micromark-util-subtokenize@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/micromark-util-subtokenize/-/micromark-util-subtokenize-1.0.2.tgz#ff6f1af6ac836f8bfdbf9b02f40431760ad89105" - integrity sha512-d90uqCnXp/cy4G881Ub4psE57Sf8YD0pim9QdjCRNjfas2M1u6Lbt+XZK9gnHL2XFhnozZiEdCa9CNfXSfQ6xA== + version "1.1.0" + resolved "https://registry.yarnpkg.com/micromark-util-subtokenize/-/micromark-util-subtokenize-1.1.0.tgz#941c74f93a93eaf687b9054aeb94642b0e92edb1" + integrity sha512-kUQHyzRoxvZO2PuLzMt2P/dwVsTiivCK8icYTeR+3WgbuPqfHgPPy7nFKbeqRivBvn/3N3GBiNC+JRTMSxEC7A== dependencies: micromark-util-chunked "^1.0.0" micromark-util-symbol "^1.0.0" @@ -3859,19 +3478,19 @@ micromark-util-subtokenize@^1.0.0: uvu "^0.5.0" micromark-util-symbol@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/micromark-util-symbol/-/micromark-util-symbol-1.0.1.tgz#b90344db62042ce454f351cf0bebcc0a6da4920e" - integrity sha512-oKDEMK2u5qqAptasDAwWDXq0tG9AssVwAx3E9bBF3t/shRIGsWIRG+cGafs2p/SnDSOecnt6hZPCE2o6lHfFmQ== + version "1.1.0" + resolved "https://registry.yarnpkg.com/micromark-util-symbol/-/micromark-util-symbol-1.1.0.tgz#813cd17837bdb912d069a12ebe3a44b6f7063142" + integrity sha512-uEjpEYY6KMs1g7QfJ2eX1SQEV+ZT4rUD3UcF6l57acZvLNK7PBZL+ty82Z1qhK1/yXIY4bdx04FKMgR0g4IAag== micromark-util-types@^1.0.0, micromark-util-types@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/micromark-util-types/-/micromark-util-types-1.0.2.tgz#f4220fdb319205812f99c40f8c87a9be83eded20" - integrity sha512-DCfg/T8fcrhrRKTPjRrw/5LLvdGV7BHySf/1LOZx7TzWZdYRjogNtyNq885z3nNallwr3QUKARjqvHqX1/7t+w== + version "1.1.0" + resolved "https://registry.yarnpkg.com/micromark-util-types/-/micromark-util-types-1.1.0.tgz#e6676a8cae0bb86a2171c498167971886cb7e283" + integrity sha512-ukRBgie8TIAcacscVHSiddHjO4k/q3pnedmzMQ4iwDcK0FtFCohKOlFbaOL/mPgfnPsL3C1ZyxJa4sbWrBl3jg== micromark@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/micromark/-/micromark-3.1.0.tgz#eeba0fe0ac1c9aaef675157b52c166f125e89f62" - integrity sha512-6Mj0yHLdUZjHnOPgr5xfWIMqMWS12zDN6iws9SLuSz76W8jTtAv24MN4/CL7gJrl5vtxGInkkqDv/JIoRsQOvA== + version "3.2.0" + resolved "https://registry.yarnpkg.com/micromark/-/micromark-3.2.0.tgz#1af9fef3f995ea1ea4ac9c7e2f19c48fd5c006e9" + integrity sha512-uD66tJj54JLYq0De10AhWycZWGQNUvDI55xPgk2sQM5kn1JYlhbCMTtEeT27+vAhW2FBQxLlOmS3pmA7/2z4aA== dependencies: "@types/debug" "^4.0.0" debug "^4.0.0" @@ -3904,23 +3523,13 @@ mime-db@1.52.0: resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== -mime-types@^2.1.12, mime-types@^2.1.35, mime-types@~2.1.19: +mime-types@^2.1.12: version "2.1.35" resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== dependencies: mime-db "1.52.0" -mimic-fn@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" - integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== - -mimic-fn@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-4.0.0.tgz#60a90550d5cb0b239cca65d893b1a53b29871ecc" - integrity sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw== - minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" @@ -3928,16 +3537,11 @@ minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: dependencies: brace-expansion "^1.1.7" -minimist@^1.2.0, minimist@^1.2.6, minimist@^1.2.8: +minimist@^1.2.0, minimist@^1.2.6: version "1.2.8" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== -mmd-parser@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/mmd-parser/-/mmd-parser-1.0.4.tgz#87cc05782cb5974ca854f0303fc5147bc9d690e7" - integrity sha512-Qi0VCU46t2IwfGv5KF0+D/t9cizcDug7qnNoy9Ggk7aucp0tssV8IwTMkBlDbm+VqAf3cdQHTCARKSsuS2MYFg== - mri@^1.1.0: version "1.2.0" resolved "https://registry.yarnpkg.com/mri/-/mri-1.2.0.tgz#6721480fec2a11a4889861115a48b6cbe7cc8f0b" @@ -3953,6 +3557,11 @@ ms@^2.1.1: resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== +mustache@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/mustache/-/mustache-4.2.0.tgz#e5892324d60a12ec9c2a73359edca52972bf6f64" + integrity sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ== + mz@^2.7.0: version "2.7.0" resolved "https://registry.yarnpkg.com/mz/-/mz-2.7.0.tgz#95008057a56cafadc2bc63dde7f9ff6955948e32" @@ -3972,47 +3581,39 @@ natural-compare@^1.4.0: resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== -next-seo@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/next-seo/-/next-seo-6.0.0.tgz#4568dc61a44dbdf5fe5ff44156cd0ff8804889a2" - integrity sha512-jKKt1p1z4otMA28AyeoAONixVjdYmgFCWwpEFtu+DwRHQDllVX3RjtyXbuCQiUZEfQ9rFPBpAI90vDeLZlMBdg== +next-seo@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/next-seo/-/next-seo-6.1.0.tgz#b60b06958cc77e7ed56f0a61b2d6cd0afed88ebb" + integrity sha512-iMBpFoJsR5zWhguHJvsoBDxDSmdYTHtnVPB1ij+CD0NReQCP78ZxxbdL9qkKIf4oEuZEqZkrjAQLB0bkII7RYA== -next@^13.4.4: - version "13.4.4" - resolved "https://registry.yarnpkg.com/next/-/next-13.4.4.tgz#d1027c8d77f4c51be0b39f671b4820db03c93e60" - integrity sha512-C5S0ysM0Ily9McL4Jb48nOQHT1BukOWI59uC3X/xCMlYIh9rJZCv7nzG92J6e1cOBqQbKovlpgvHWFmz4eKKEA== +next@^13.4.13: + version "13.4.19" + resolved "https://registry.yarnpkg.com/next/-/next-13.4.19.tgz#2326e02aeedee2c693d4f37b90e4f0ed6882b35f" + integrity sha512-HuPSzzAbJ1T4BD8e0bs6B9C1kWQ6gv8ykZoRWs5AQoiIuqbGHHdQO7Ljuvg05Q0Z24E2ABozHe6FxDvI6HfyAw== dependencies: - "@next/env" "13.4.4" + "@next/env" "13.4.19" "@swc/helpers" "0.5.1" busboy "1.6.0" caniuse-lite "^1.0.30001406" postcss "8.4.14" styled-jsx "5.1.1" + watchpack "2.4.0" zod "3.21.4" optionalDependencies: - "@next/swc-darwin-arm64" "13.4.4" - "@next/swc-darwin-x64" "13.4.4" - "@next/swc-linux-arm64-gnu" "13.4.4" - "@next/swc-linux-arm64-musl" "13.4.4" - "@next/swc-linux-x64-gnu" "13.4.4" - "@next/swc-linux-x64-musl" "13.4.4" - "@next/swc-win32-arm64-msvc" "13.4.4" - "@next/swc-win32-ia32-msvc" "13.4.4" - "@next/swc-win32-x64-msvc" "13.4.4" + "@next/swc-darwin-arm64" "13.4.19" + "@next/swc-darwin-x64" "13.4.19" + "@next/swc-linux-arm64-gnu" "13.4.19" + "@next/swc-linux-arm64-musl" "13.4.19" + "@next/swc-linux-x64-gnu" "13.4.19" + "@next/swc-linux-x64-musl" "13.4.19" + "@next/swc-win32-arm64-msvc" "13.4.19" + "@next/swc-win32-ia32-msvc" "13.4.19" + "@next/swc-win32-x64-msvc" "13.4.19" -nextjs-progressbar@^0.0.16: - version "0.0.16" - resolved "https://registry.yarnpkg.com/nextjs-progressbar/-/nextjs-progressbar-0.0.16.tgz#d2c1e54ffc2c6d52b64282c0d764a44241fbc36e" - integrity sha512-GV0fD38EMD3vSDCmkq+tObmoup6QA91a6a9MxGuhJZuRk/9TNsrHGnIQQQ/sggkMkXuT4fBgF6jRjFwScDT3zA== - dependencies: - "@types/nprogress" "^0.2.0" - nprogress "^0.2.0" - prop-types "^15.8.1" - -node-fetch@^2.6.1, node-fetch@^2.6.7: - version "2.6.11" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.11.tgz#cde7fc71deef3131ef80a738919f999e6edfff25" - integrity sha512-4I6pdBY1EthSqDmJkiNk3JIT8cswwR9nfeW/cPdUagJYEQG7R95WRH74wpz7ma8Gh/9dI9FP+OU+0E4FvtA55w== +node-fetch@^2.6.9: + version "2.7.0" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.7.0.tgz#d0f0fa6e3e2dc1d27efcd8ad99d550bda94d187d" + integrity sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A== dependencies: whatwg-url "^5.0.0" @@ -4021,10 +3622,10 @@ node-forge@^1.3.1: resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-1.3.1.tgz#be8da2af243b2417d5f646a770663a92b7e9ded3" integrity sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA== -node-releases@^2.0.8: - version "2.0.10" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.10.tgz#c311ebae3b6a148c89b1813fd7c4d3c024ef537f" - integrity sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w== +node-releases@^2.0.13: + version "2.0.13" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.13.tgz#d5ed1627c23e3461e819b02e57b75e4899b1c81d" + integrity sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ== normalize-path@^3.0.0, normalize-path@~3.0.0: version "3.0.0" @@ -4036,26 +3637,7 @@ normalize-range@^0.1.2: resolved "https://registry.yarnpkg.com/normalize-range/-/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942" integrity sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA== -npm-run-path@^4.0.0, npm-run-path@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" - integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== - dependencies: - path-key "^3.0.0" - -npm-run-path@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-5.1.0.tgz#bc62f7f3f6952d9894bd08944ba011a6ee7b7e00" - integrity sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q== - dependencies: - path-key "^4.0.0" - -nprogress@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/nprogress/-/nprogress-0.2.0.tgz#cb8f34c53213d895723fcbab907e9422adbcafb1" - integrity sha512-I19aIingLgR1fmhftnbWWO3dXc0hSxqHQHQb3H8m+K3TnEn/iSeTZZOyvKXWqQESMwuUVnatlCnZdLBZZt2VSA== - -object-assign@^4, object-assign@^4.0.1, object-assign@^4.1.1: +object-assign@^4.0.1, object-assign@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== @@ -4070,20 +3652,12 @@ object-inspect@^1.12.3, object-inspect@^1.9.0: resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.3.tgz#ba62dffd67ee256c8c086dfae69e016cd1f198b9" integrity sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g== -object-is@^1.1.5: - version "1.1.5" - resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.1.5.tgz#b9deeaa5fc7f1846a0faecdceec138e5778f53ac" - integrity sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.3" - object-keys@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== -object.assign@^4.1.3, object.assign@^4.1.4: +object.assign@^4.1.4: version "4.1.4" resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.4.tgz#9673c7c7c351ab8c4d0b516f4343ebf4dfb7799f" integrity sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ== @@ -4094,95 +3668,68 @@ object.assign@^4.1.3, object.assign@^4.1.4: object-keys "^1.1.1" object.entries@^1.1.6: - version "1.1.6" - resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.6.tgz#9737d0e5b8291edd340a3e3264bb8a3b00d5fa23" - integrity sha512-leTPzo4Zvg3pmbQ3rDK69Rl8GQvIqMWubrkxONG9/ojtFE2rD9fjMKfSI5BxW3osRH1m6VdzmqK8oAY9aT4x5w== + version "1.1.7" + resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.7.tgz#2b47760e2a2e3a752f39dd874655c61a7f03c131" + integrity sha512-jCBs/0plmPsOnrKAfFQXRG2NFjlhZgjjcBLSmTnEhU8U6vVTsVe8ANeQJCHTl3gSsI4J+0emOoCgoKlmQPMgmA== dependencies: call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" + define-properties "^1.2.0" + es-abstract "^1.22.1" object.fromentries@^2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.6.tgz#cdb04da08c539cffa912dcd368b886e0904bfa73" - integrity sha512-VciD13dswC4j1Xt5394WR4MzmAQmlgN72phd/riNp9vtD7tp4QQWJ0R4wvclXcafgcYK8veHRed2W6XeGBvcfg== + version "2.0.7" + resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.7.tgz#71e95f441e9a0ea6baf682ecaaf37fa2a8d7e616" + integrity sha512-UPbPHML6sL8PI/mOqPwsH4G6iyXcCGzLin8KvEPenOZN5lpCNBZZQ+V62vdjB1mQHrmqGQt5/OJzemUA+KJmEA== dependencies: call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" + define-properties "^1.2.0" + es-abstract "^1.22.1" + +object.groupby@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/object.groupby/-/object.groupby-1.0.1.tgz#d41d9f3c8d6c778d9cbac86b4ee9f5af103152ee" + integrity sha512-HqaQtqLnp/8Bn4GL16cj+CUYbnpe1bh0TtEaWvybszDG4tgxCJuRpV8VGuvNaI1fAnI4lUJzDG55MXcOH4JZcQ== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + get-intrinsic "^1.2.1" object.hasown@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/object.hasown/-/object.hasown-1.1.2.tgz#f919e21fad4eb38a57bc6345b3afd496515c3f92" - integrity sha512-B5UIT3J1W+WuWIU55h0mjlwaqxiE5vYENJXIXZ4VFe05pNYrkKuK0U/6aFcb0pKywYJh7IhfoqUfKVmrJJHZHw== + version "1.1.3" + resolved "https://registry.yarnpkg.com/object.hasown/-/object.hasown-1.1.3.tgz#6a5f2897bb4d3668b8e79364f98ccf971bda55ae" + integrity sha512-fFI4VcYpRHvSLXxP7yiZOMAd331cPfd2p7PFDVbgUsYOfCT3tICVqXWngbjr4m49OvsBwUBQ6O2uQoJvy3RexA== dependencies: - define-properties "^1.1.4" - es-abstract "^1.20.4" + define-properties "^1.2.0" + es-abstract "^1.22.1" object.values@^1.1.6: - version "1.1.6" - resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.6.tgz#4abbaa71eba47d63589d402856f908243eea9b1d" - integrity sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw== + version "1.1.7" + resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.7.tgz#617ed13272e7e1071b43973aa1655d9291b8442a" + integrity sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng== dependencies: call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" + define-properties "^1.2.0" + es-abstract "^1.22.1" -once@^1.3.0, once@^1.3.1, once@^1.4.0: +once@^1.3.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== dependencies: wrappy "1" -onetime@^5.1.0, onetime@^5.1.2: - version "5.1.2" - resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" - integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== - dependencies: - mimic-fn "^2.1.0" - -onetime@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/onetime/-/onetime-6.0.0.tgz#7c24c18ed1fd2e9bca4bd26806a33613c77d34b4" - integrity sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ== - dependencies: - mimic-fn "^4.0.0" - -open@^9.1.0: - version "9.1.0" - resolved "https://registry.yarnpkg.com/open/-/open-9.1.0.tgz#684934359c90ad25742f5a26151970ff8c6c80b6" - integrity sha512-OS+QTnw1/4vrf+9hh1jc1jnYjzSG4ttTBB8UxOwAnInG3Uo4ssetzC1ihqaIHjLJnA5GGlRl6QlZXOTQhRBUvg== - dependencies: - default-browser "^4.0.0" - define-lazy-prop "^3.0.0" - is-inside-container "^1.0.0" - is-wsl "^2.2.0" - -opentype.js@^1.3.3: - version "1.3.4" - resolved "https://registry.yarnpkg.com/opentype.js/-/opentype.js-1.3.4.tgz#1c0e72e46288473cc4a4c6a2dc60fd7fe6020d77" - integrity sha512-d2JE9RP/6uagpQAVtJoF0pJJA/fgai89Cc50Yp0EJHk+eLp6QQ7gBoblsnubRULNY132I0J1QKMJ+JTbMqz4sw== - dependencies: - string.prototype.codepointat "^0.2.1" - tiny-inflate "^1.0.3" - optionator@^0.9.1: - version "0.9.1" - resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.1.tgz#4f236a6373dae0566a6d43e1326674f50c291499" - integrity sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw== + version "0.9.3" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.3.tgz#007397d44ed1872fdc6ed31360190f81814e2c64" + integrity sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg== dependencies: + "@aashutoshrathi/word-wrap" "^1.2.3" deep-is "^0.1.3" fast-levenshtein "^2.0.6" levn "^0.4.1" prelude-ls "^1.2.1" type-check "^0.4.0" - word-wrap "^1.2.3" - -ospath@^1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/ospath/-/ospath-1.2.2.tgz#1276639774a3f8ef2572f7fe4280e0ea4550c07b" - integrity sha512-o6E5qJV5zkAbIDNhGSIlyOhScKXgQrSRMilfph0clDfM0nEnBOlKlH4sWDmG95BW/CvwNz0vmm7dJVtU2KlMiA== p-limit@^3.0.2: version "3.1.0" @@ -4198,17 +3745,15 @@ p-locate@^5.0.0: dependencies: p-limit "^3.0.2" -p-map@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/p-map/-/p-map-4.0.0.tgz#bb2f95a5eda2ec168ec9274e06a747c3e2904d2b" - integrity sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ== - dependencies: - aggregate-error "^3.0.0" +pako@~1.0.2: + version "1.0.11" + resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.11.tgz#6c9599d340d54dfd3946380252a35705a6b992bf" + integrity sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw== -pako@^0.2.5: - version "0.2.9" - resolved "https://registry.yarnpkg.com/pako/-/pako-0.2.9.tgz#f3f7522f4ef782348da8161bad9ecfd51bf83a75" - integrity sha512-NUcwaKxUxWrZLpDG+z/xZaCgQITkA/Dv4V/T6bw7VON6l1Xz/VnrBqrYjZQ12TamKHzITTfOEIYUj48y2KXImA== +papaparse@^5.3.2: + version "5.4.1" + resolved "https://registry.yarnpkg.com/papaparse/-/papaparse-5.4.1.tgz#f45c0f871853578bd3a30f92d96fdcfb6ebea127" + integrity sha512-HipMsgJkZu8br23pW15uvo6sib6wne/4woLZPlFf3rpDyMe9ywEXUsuD7+6K9PRkJlVT51j/sCOYDKGGS3ZJrw== parent-module@^1.0.0: version "1.0.1" @@ -4217,14 +3762,6 @@ parent-module@^1.0.0: dependencies: callsites "^3.0.0" -parse-css-color@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/parse-css-color/-/parse-css-color-0.2.1.tgz#b687a583f2e42e66ffdfce80a570706966e807c9" - integrity sha512-bwS/GGIFV3b6KS4uwpzCFj4w297Yl3uqnSgIPsoQkx7GMLROXfMnWvxfNkL0oh8HVhZA4hvJoEoEIqonfJ3BWg== - dependencies: - color-name "^1.1.4" - hex-rgb "^4.1.0" - parse-entities@^4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/parse-entities/-/parse-entities-4.0.1.tgz#4e2a01111fb1c986549b944af39eeda258fc9e4e" @@ -4266,16 +3803,11 @@ path-is-absolute@^1.0.0: resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== -path-key@^3.0.0, path-key@^3.1.0: +path-key@^3.1.0: version "3.1.1" resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== -path-key@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/path-key/-/path-key-4.0.0.tgz#295588dc3aee64154f877adb9d780b81c554bf18" - integrity sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ== - path-parse@^1.0.7: version "1.0.7" resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" @@ -4286,15 +3818,19 @@ 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== +pdfjs-dist@2.12.313: + version "2.12.313" + resolved "https://registry.yarnpkg.com/pdfjs-dist/-/pdfjs-dist-2.12.313.tgz#62f2273737bb956267ae2e02cdfaddcb1099819c" + integrity sha512-1x6iXO4Qnv6Eb+YFdN5JdUzt4pAkxSp3aLAYPX93eQCyg/m7QFzXVWJHJVtoW48CI8HCXju4dSkhQZwoheL5mA== -performance-now@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" - integrity sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow== +periscopic@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/periscopic/-/periscopic-3.1.0.tgz#7e9037bf51c5855bd33b48928828db4afa79d97a" + integrity sha512-vKiQ8RRtkl9P+r/+oefh25C3fhybptkHKCZSPlcXiJux2tJF55GnEj3BVn4A5gKfq9NWWXXrxkHBwVPUfH0opw== + dependencies: + "@types/estree" "^1.0.0" + estree-walker "^3.0.0" + is-reference "^3.0.0" picocolors@^1.0.0: version "1.0.0" @@ -4306,15 +3842,15 @@ picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.3.1: resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== -pify@^2.2.0, pify@^2.3.0: +pify@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" integrity sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog== pirates@^4.0.1: - version "4.0.5" - resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.5.tgz#feec352ea5c3268fb23a37c702ab1699f35a5f3b" - integrity sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ== + version "4.0.6" + resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.6.tgz#3018ae32ecfcff6c29ba2267cbf21166ac1f36b9" + integrity sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg== postcss-import@^14.1.0: version "14.1.0" @@ -4387,19 +3923,14 @@ postcss@8.4.22: source-map-js "^1.0.2" postcss@^8.0.9: - version "8.4.23" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.23.tgz#df0aee9ac7c5e53e1075c24a3613496f9e6552ab" - integrity sha512-bQ3qMcpF6A/YjR55xtoTr0jGOlnPOKAIMdOWiv0EIT6HVPEaJiJB4NLljSbiHoC2RX7DN5Uvjtpbg1NPdwv1oA== + version "8.4.29" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.29.tgz#33bc121cf3b3688d4ddef50be869b2a54185a1dd" + integrity sha512-cbI+jaqIeu/VGqXEarWkRCCffhjgXc0qjBtXpqJhTBohMUjUQnbBr0xqX3vEKudc4iviTewcJo5ajcec5+wdJw== dependencies: nanoid "^3.3.6" picocolors "^1.0.0" source-map-js "^1.0.2" -potpack@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/potpack/-/potpack-1.0.2.tgz#23b99e64eb74f5741ffe7656b5b5c4ddce8dfc14" - integrity sha512-choctRBIV9EMT9WGAZHn3V7t0Z2pMQyl0EZE6pFc/6ml3ssw7Dlf/oAOvFwjm1HVsqfQN8GfeFyJ+d8tRzqueQ== - prelude-ls@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" @@ -4415,12 +3946,12 @@ prettier@^2.8.7: resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.8.8.tgz#e8c5d7e98a4305ffe3de2e1fc4aca1a71c28b1da" integrity sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q== -pretty-bytes@^5.6.0: - version "5.6.0" - resolved "https://registry.yarnpkg.com/pretty-bytes/-/pretty-bytes-5.6.0.tgz#356256f643804773c82f64723fe78c92c62beaeb" - integrity sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg== +process-nextick-args@~2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" + integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== -prop-types@^15.0.0, prop-types@^15.6.0, prop-types@^15.7.2, prop-types@^15.8.1: +prop-types@^15.0.0, prop-types@^15.6.2, prop-types@^15.7.2, prop-types@^15.8.1: version "15.8.1" resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.8.1.tgz#67d87bf1a694f48435cf332c24af10214a3140b5" integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg== @@ -4434,30 +3965,12 @@ property-information@^6.0.0: resolved "https://registry.yarnpkg.com/property-information/-/property-information-6.2.0.tgz#b74f522c31c097b5149e3c3cb8d7f3defd986a1d" integrity sha512-kma4U7AFCTwpqq5twzC1YVIDXSqg6qQK6JN0smOw8fgRy1OkMi0CYSzFmsy6dnqSenamAtj0CyXMUJ1Mf6oROg== -proxy-from-env@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.0.0.tgz#33c50398f70ea7eb96d21f7b817630a55791c7ee" - integrity sha512-F2JHgJQ1iqwnHDcQjVBsq3n/uoaFL+iPW/eAeL7kVxy/2RrWaN4WroKjjvbsoRtv0ftelNyC01bjRhn/bhcf4A== - 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== -psl@^1.1.28: - version "1.9.0" - resolved "https://registry.yarnpkg.com/psl/-/psl-1.9.0.tgz#d0df2a137f00794565fcaf3b2c00cd09f8d5a5a7" - integrity sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag== - -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, punycode@^2.1.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== @@ -4469,13 +3982,6 @@ qs@^6.7.0: dependencies: side-channel "^1.0.4" -qs@~6.10.3: - version "6.10.5" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.10.5.tgz#974715920a80ff6a262264acd2c7e6c2a53282b4" - integrity sha512-O5RlPh0VFtR78y79rgcgKK4wbAI0C5zGVLztOIdpWX6ep368q5Hv6XRxDvXuZ9q3C6v+e3n8UfZZJw7IIG27eQ== - dependencies: - side-channel "^1.0.4" - queue-microtask@^1.2.2: version "1.2.3" resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" @@ -4486,13 +3992,6 @@ quick-lru@^5.1.1: resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-5.1.1.tgz#366493e6b3e42a3a6885e2e99d18f80fb7a8c932" integrity sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA== -react-composer@^5.0.3: - version "5.0.3" - resolved "https://registry.yarnpkg.com/react-composer/-/react-composer-5.0.3.tgz#7beb9513da5e8687f4f434ea1333ef36a4f3091b" - integrity sha512-1uWd07EME6XZvMfapwZmc7NgCZqDemcvicRi3wMJzXsQLvZ3L7fTHVyPy1bZdnWXM4iPjYuNE+uJ41MLKeTtnA== - dependencies: - prop-types "^15.6.0" - react-dom@^18.2.0: version "18.2.0" resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-18.2.0.tgz#22aaf38708db2674ed9ada224ca4aa708d821e3d" @@ -4515,26 +4014,16 @@ react-h5-audio-player@^3.8.6: "@iconify/icons-mdi" "~1.1.0" "@iconify/react" "^3.1.3" -react-icons@4.8.1-snapshot.2: - version "4.8.1-snapshot.2" - resolved "https://registry.yarnpkg.com/react-icons/-/react-icons-4.8.1-snapshot.2.tgz#336ecd15cacd99c799df4e7a244e2f99c5703432" - integrity sha512-EC41ETSFRtpAuwstiDw/8rkjWbw13TQAQDIQDckCOnAgf1bPcXOx+OLUzCNpNd4sPwl/P8dSFqTwSUYybYWmJQ== - -react-is@^16.13.1: +react-is@^16.13.1, react-is@^16.7.0: version "16.13.1" resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== -react-is@^18.0.0: +react-is@^18.0.0, react-is@^18.2.0: version "18.2.0" resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.2.0.tgz#199431eeaaa2e09f86427efbb4f1473edb47609b" integrity sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w== -react-loading@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/react-loading/-/react-loading-2.0.3.tgz#e8138fb0c3e4674e481b320802ac7048ae14ffb9" - integrity sha512-Vdqy79zq+bpeWJqC+xjltUjuGApyoItPgL0vgVfcJHhqwU7bAMKzysfGW/ADu6i0z0JiOCRJjo+IkFNkRNbA3A== - react-markdown@^8.0.7: version "8.0.7" resolved "https://registry.yarnpkg.com/react-markdown/-/react-markdown-8.0.7.tgz#c8dbd1b9ba5f1c5e7e5f2a44de465a3caafdf89b" @@ -4556,15 +4045,26 @@ react-markdown@^8.0.7: unist-util-visit "^4.0.0" vfile "^5.0.0" -react-merge-refs@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/react-merge-refs/-/react-merge-refs-1.1.0.tgz#73d88b892c6c68cbb7a66e0800faa374f4c38b06" - integrity sha512-alTKsjEL0dKH/ru1Iyn7vliS2QRcBp9zZPGoWxUOvRGWPUYgjo+V01is7p04It6KhgrzhJGnIj9GgX8W4bZoCQ== +react-pdf@5.7.2: + version "5.7.2" + resolved "https://registry.yarnpkg.com/react-pdf/-/react-pdf-5.7.2.tgz#c458dedf7983822668b40dcac1eae052c1f6e056" + integrity sha512-hdDwvf007V0i2rPCqQVS1fa70CXut17SN3laJYlRHzuqcu8sLLjEoeXihty6c0Ev5g1mw31b8OT8EwRw1s8C4g== + dependencies: + "@babel/runtime" "^7.0.0" + file-loader "^6.0.0" + make-cancellable-promise "^1.0.0" + make-event-props "^1.1.0" + merge-class-names "^1.1.1" + merge-refs "^1.0.0" + pdfjs-dist "2.12.313" + prop-types "^15.6.2" + tiny-invariant "^1.0.0" + tiny-warning "^1.0.0" -react-player@^2.12.0: - version "2.12.0" - resolved "https://registry.yarnpkg.com/react-player/-/react-player-2.12.0.tgz#2fc05dbfec234c829292fbca563b544064bd14f0" - integrity sha512-rymLRz/2GJJD+Wc01S7S+i9pGMFYnNmQibR2gVE3KmHJCBNN8BhPAlOPTGZtn1uKpJ6p4RPLlzPQ1OLreXd8gw== +react-player@^2.13.0: + version "2.13.0" + resolved "https://registry.yarnpkg.com/react-player/-/react-player-2.13.0.tgz#b6fb252bf70574608ac711f6c83d7057c8fb0c14" + integrity sha512-gkY7ZdbVFztlKFFhCPcnDrFQm+L399b8fhWsKatZ+b2wpKJwfUHBXQFMRxqYQGT0ic1/wQ7D7EZEWy7ZBqk2pw== dependencies: deepmerge "^4.0.0" load-script "^1.0.0" @@ -4572,28 +4072,21 @@ react-player@^2.12.0: prop-types "^15.7.2" react-fast-compare "^3.0.1" -react-reconciler@^0.27.0: - version "0.27.0" - resolved "https://registry.yarnpkg.com/react-reconciler/-/react-reconciler-0.27.0.tgz#360124fdf2d76447c7491ee5f0e04503ed9acf5b" - integrity sha512-HmMDKciQjYmBRGuuhIaKA1ba/7a+UsM5FzOZsMO2JYHt9Jh8reCb7j1eDC95NOyUlKM9KRyvdx0flBuDvYSBoA== +react-popper@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/react-popper/-/react-popper-2.3.0.tgz#17891c620e1320dce318bad9fede46a5f71c70ba" + integrity sha512-e1hj8lL3uM+sgSR4Lxzn5h1GxBlpa4CQz0XLF8kx4MDrDRWY0Ena4c97PUeSX9i5W3UAfDP0z0FXCTQkoXUl3Q== dependencies: - loose-envify "^1.1.0" - scheduler "^0.21.0" + react-fast-compare "^3.0.1" + warning "^4.0.2" -react-toastify@^9.1.2: +react-toastify@^9.1.3: version "9.1.3" resolved "https://registry.yarnpkg.com/react-toastify/-/react-toastify-9.1.3.tgz#1e798d260d606f50e0fab5ee31daaae1d628c5ff" integrity sha512-fPfb8ghtn/XMxw3LkxQBk3IyagNpF/LIKjOBflbexr2AWxAH1MJgvnESwEwBn9liLFXgTKWgBSdZpw9m4OTHTg== dependencies: clsx "^1.1.1" -react-use-measure@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/react-use-measure/-/react-use-measure-2.1.1.tgz#5824537f4ee01c9469c45d5f7a8446177c6cc4ba" - integrity sha512-nocZhN26cproIiIduswYpV5y5lQpSQS1y/4KuvUCjSKmw7ZWIS/+g3aFnX3WdBkyuGUtTLif3UTqnLLhbDoQig== - dependencies: - debounce "^1.2.1" - react@^18.2.0: version "18.2.0" resolved "https://registry.yarnpkg.com/react/-/react-18.2.0.tgz#555bd98592883255fa00de14f1151a917b5d77d5" @@ -4608,6 +4101,19 @@ read-cache@^1.0.0: dependencies: pify "^2.3.0" +readable-stream@~2.3.6: + version "2.3.8" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.8.tgz#91125e8042bba1b9887f49345f6277027ce8be9b" + integrity sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA== + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.3" + isarray "~1.0.0" + process-nextick-args "~2.0.0" + safe-buffer "~5.1.1" + string_decoder "~1.1.1" + util-deprecate "~1.0.1" + readdirp@~3.6.0: version "3.6.0" resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" @@ -4615,7 +4121,19 @@ readdirp@~3.6.0: dependencies: picomatch "^2.2.1" -refractor@^4.7.0: +reflect.getprototypeof@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/reflect.getprototypeof/-/reflect.getprototypeof-1.0.4.tgz#aaccbf41aca3821b87bb71d9dcbc7ad0ba50a3f3" + integrity sha512-ECkTw8TmJwW60lOTR+ZkODISW6RQ8+2CL3COqtiJKLd6MmB45hN51HprHFziKLGkAuTGQhBb91V8cy+KHlaCjw== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + get-intrinsic "^1.2.1" + globalthis "^1.0.3" + which-builtin-type "^1.1.3" + +refractor@^4.8.0: version "4.8.1" resolved "https://registry.yarnpkg.com/refractor/-/refractor-4.8.1.tgz#fbdd889333a3d86c9c864479622855c9b38e9d42" integrity sha512-/fk5sI0iTgFYlmVGYVew90AoYnNMP6pooClx/XKqyeeCQXrL0Kvgn8V0VEht5ccdljbzzF1i3Q213gcntkRExg== @@ -4625,17 +4143,12 @@ refractor@^4.7.0: hastscript "^7.0.0" parse-entities "^4.0.0" -regenerator-runtime@^0.13.11: - version "0.13.11" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz#f6dca3e7ceec20590d07ada785636a90cdca17f9" - integrity sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg== +regenerator-runtime@^0.14.0: + version "0.14.0" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.14.0.tgz#5e19d68eb12d486f797e15a3c6a918f7cec5eb45" + integrity sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA== -regexp-to-ast@0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/regexp-to-ast/-/regexp-to-ast-0.5.0.tgz#56c73856bee5e1fef7f73a00f1473452ab712a24" - integrity sha512-tlbJqcMHnPKI9zSrystikWKwHkBqu2a/Sgw01h3zFjvYrMxEDYHzzoMZnUrbIfpTFEsoRnnviOXNCzFiSc54Qw== - -regexp.prototype.flags@^1.4.3, regexp.prototype.flags@^1.5.0: +regexp.prototype.flags@^1.5.0: version "1.5.0" resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz#fe7ce25e7e4cca8db37b6634c8a2c7009199b9cb" integrity sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA== @@ -4644,7 +4157,7 @@ regexp.prototype.flags@^1.4.3, regexp.prototype.flags@^1.5.0: define-properties "^1.2.0" functions-have-names "^1.2.3" -rehype-katex@^6.0.2: +rehype-katex@^6.0.3: version "6.0.3" resolved "https://registry.yarnpkg.com/rehype-katex/-/rehype-katex-6.0.3.tgz#83e5b929b0967978e9491c02117f55be3594d7e1" integrity sha512-ByZlRwRUcWegNbF70CVRm2h/7xy7jQ3R9LaY4VVSvjnoVWwWVhNL60DiZsBpC5tSzYQOCvDbzncIpIjPZWodZA== @@ -4657,28 +4170,28 @@ rehype-katex@^6.0.2: unist-util-visit "^4.0.0" rehype-parse@^8.0.2: - version "8.0.4" - resolved "https://registry.yarnpkg.com/rehype-parse/-/rehype-parse-8.0.4.tgz#3d17c9ff16ddfef6bbcc8e6a25a99467b482d688" - integrity sha512-MJJKONunHjoTh4kc3dsM1v3C9kGrrxvA3U8PxZlP2SjH8RNUSrb+lF7Y0KVaUDnGH2QZ5vAn7ulkiajM9ifuqg== + version "8.0.5" + resolved "https://registry.yarnpkg.com/rehype-parse/-/rehype-parse-8.0.5.tgz#ccffc21e08e288c7846614f8dc1dc23d603a4a80" + integrity sha512-Ds3RglaY/+clEX2U2mHflt7NlMA72KspZ0JLUJgBBLpRddBcEw3H8uYZQliQriku22NZpYMfjDdSgHcjxue24A== dependencies: "@types/hast" "^2.0.0" hast-util-from-parse5 "^7.0.0" parse5 "^6.0.0" unified "^10.0.0" -rehype-prism-plus@^1.5.1: - version "1.5.1" - resolved "https://registry.yarnpkg.com/rehype-prism-plus/-/rehype-prism-plus-1.5.1.tgz#b5f4eb3c789a13ffe874c81039665e144bcb1cae" - integrity sha512-mowYefSfrIkMMxkb0fwuEXlvc5nA9b1vQ6mzujM81Qx28RI0mo7jCHsBZ2tJ4eIJKXdFn+EdPkZZBGB10K02vg== +rehype-prism-plus@^1.6.3: + version "1.6.3" + resolved "https://registry.yarnpkg.com/rehype-prism-plus/-/rehype-prism-plus-1.6.3.tgz#8bf23a4cfc3419349770bb9064a91bdab04fae86" + integrity sha512-F6tn376zimnvy+xW0bSnryul+rvVL7NhDIkavc9kAuzDx5zIZW04A6jdXPkcFBhojcqZB8b6pHt6CLqiUx+Tbw== dependencies: hast-util-to-string "^2.0.0" parse-numeric-range "^1.3.0" - refractor "^4.7.0" + refractor "^4.8.0" rehype-parse "^8.0.2" unist-util-filter "^4.0.0" unist-util-visit "^4.0.0" -rehype-raw@^6.1.1: +rehype-raw@6.1.1: version "6.1.1" resolved "https://registry.yarnpkg.com/rehype-raw/-/rehype-raw-6.1.1.tgz#81bbef3793bd7abacc6bf8335879d1b6c868c9d4" integrity sha512-d6AKtisSRtDRX4aSPsJGTfnzrX2ZkHQLE5kiUuGOeEoLpbEulFF4hj0mLPbsa+7vmguDKOVVEQdHKDSwoaIDsQ== @@ -4687,24 +4200,6 @@ rehype-raw@^6.1.1: hast-util-raw "^7.2.0" unified "^10.0.0" -rehype-sanitize@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/rehype-sanitize/-/rehype-sanitize-5.0.1.tgz#dac01a7417bdd329260c74c74449697b4be5eb56" - integrity sha512-da/jIOjq8eYt/1r9GN6GwxIR3gde7OZ+WV8pheu1tL8K0D9KxM2AyMh+UEfke+FfdM3PvGHeYJU0Td5OWa7L5A== - dependencies: - "@types/hast" "^2.0.0" - hast-util-sanitize "^4.0.0" - unified "^10.0.0" - -remark-breaks@^3.0.2: - version "3.0.3" - resolved "https://registry.yarnpkg.com/remark-breaks/-/remark-breaks-3.0.3.tgz#660e6c995e954e5abdd95bf77df6f1402cb911ef" - integrity sha512-C7VkvcUp1TPUc2eAYzsPdaUh8Xj4FSbQnYA5A9f80diApLZscTDeG7efiWP65W8hV2sEy3JuGVU0i6qr5D8Hug== - dependencies: - "@types/mdast" "^3.0.0" - mdast-util-newline-to-break "^1.0.0" - unified "^10.0.0" - remark-gfm@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/remark-gfm/-/remark-gfm-3.0.1.tgz#0b180f095e3036545e9dddac0e8df3fa5cfee54f" @@ -4725,6 +4220,14 @@ remark-math@^5.1.1: micromark-extension-math "^2.0.0" unified "^10.0.0" +remark-mdx@^2.0.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/remark-mdx/-/remark-mdx-2.3.0.tgz#efe678025a8c2726681bde8bf111af4a93943db4" + integrity sha512-g53hMkpM0I98MU266IzDFMrTD980gNF3BJnkyFcmN+dD873mQeD5rdMO3Y2X+x8umQfbSE0PcoEDl7ledSA+2g== + dependencies: + mdast-util-mdx "^2.0.0" + micromark-extension-mdxjs "^1.0.0" + remark-parse@^10.0.0: version "10.0.2" resolved "https://registry.yarnpkg.com/remark-parse/-/remark-parse-10.0.2.tgz#ca241fde8751c2158933f031a4e3efbaeb8bc262" @@ -4765,29 +4268,22 @@ remark-toc@^8.0.1: mdast-util-toc "^6.0.0" unified "^10.0.0" -request-progress@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/request-progress/-/request-progress-3.0.0.tgz#4ca754081c7fec63f505e4faa825aa06cd669dbe" - integrity sha512-MnWzEHHaxHO2iWiQuHrUPBi/1WeBf5PkxQqNyNvLl9VAYSdXkP8tQ3pBSeCPD+yw0v0Aq1zosWLz0BdeXpWwZg== - dependencies: - throttleit "^1.0.0" - -require-from-string@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" - integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== - resolve-from@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== -resolve@^1.1.7, resolve@^1.22.1: - version "1.22.2" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.2.tgz#0ed0943d4e301867955766c9f3e1ae6d01c6845f" - integrity sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g== +resolve-pkg-maps@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz#616b3dc2c57056b5588c31cdf4b3d64db133720f" + integrity sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw== + +resolve@^1.1.7, resolve@^1.22.1, resolve@^1.22.4: + version "1.22.4" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.4.tgz#1dc40df46554cdaf8948a486a10f6ba1e2026c34" + integrity sha512-PXNdCiPqDqeUou+w1C2eTQbNfxKSuMxqTCuvlmmMsk1NWHL5fRrhY6Pl0qEYYc6+QqGClco1Qj8XnjPego4wfg== dependencies: - is-core-module "^2.11.0" + is-core-module "^2.13.0" path-parse "^1.0.7" supports-preserve-symlinks-flag "^1.0.0" @@ -4800,38 +4296,18 @@ resolve@^2.0.0-next.4: path-parse "^1.0.7" supports-preserve-symlinks-flag "^1.0.0" -restore-cursor@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e" - integrity sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA== - dependencies: - onetime "^5.1.0" - signal-exit "^3.0.2" - reusify@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== -rfdc@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/rfdc/-/rfdc-1.3.0.tgz#d0b7c441ab2720d05dc4cf26e01c89631d9da08b" - integrity sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA== - -rimraf@^3.0.0, rimraf@^3.0.2: +rimraf@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== dependencies: glob "^7.1.3" -run-applescript@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/run-applescript/-/run-applescript-5.0.0.tgz#e11e1c932e055d5c6b40d98374e0268d9b11899c" - integrity sha512-XcT5rBksx1QdIhlFOCtgZkB99ZEouFZ1E2Kc2LHqNW13U3/74YGdkQRmThTwxy4QIyookibDKYZOPqX//6BlAg== - dependencies: - execa "^5.0.0" - run-parallel@^1.1.9: version "1.2.0" resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" @@ -4839,13 +4315,6 @@ run-parallel@^1.1.9: dependencies: queue-microtask "^1.2.2" -rxjs@^7.5.1: - version "7.8.1" - resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.8.1.tgz#6f6f3d99ea8044291efd92e7c7fcf562c4057543" - integrity sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg== - dependencies: - tslib "^2.1.0" - sade@^1.7.3: version "1.8.1" resolved "https://registry.yarnpkg.com/sade/-/sade-1.8.1.tgz#0a78e81d658d394887be57d2a409bf703a3b2701" @@ -4853,11 +4322,26 @@ sade@^1.7.3: dependencies: mri "^1.1.0" -safe-buffer@^5.0.1, safe-buffer@^5.1.2: +safe-array-concat@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/safe-array-concat/-/safe-array-concat-1.0.0.tgz#2064223cba3c08d2ee05148eedbc563cd6d84060" + integrity sha512-9dVEFruWIsnie89yym+xWTAYASdpw3CJV7Li/6zBewGf9z2i1j31rP6jnY0pHEO4QZh6N0K11bFjWmdR8UGdPQ== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.2.0" + has-symbols "^1.0.3" + isarray "^2.0.5" + +safe-buffer@^5.0.1: version "5.2.1" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== +safe-buffer@~5.1.0, safe-buffer@~5.1.1: + version "5.1.2" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" + integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== + safe-regex-test@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/safe-regex-test/-/safe-regex-test-1.0.0.tgz#793b874d524eb3640d1873aad03596db2d4f2295" @@ -4867,33 +4351,11 @@ safe-regex-test@^1.0.0: get-intrinsic "^1.1.3" is-regex "^1.1.4" -"safer-buffer@>= 2.1.2 < 3.0.0", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: +"safer-buffer@>= 2.1.2 < 3.0.0": version "2.1.2" resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== -satori@0.7.2: - version "0.7.2" - resolved "https://registry.yarnpkg.com/satori/-/satori-0.7.2.tgz#1d935f3520ad22009b7b19e4c2e73c55660d6534" - integrity sha512-Eltg0/i3OEbBLaveCnYi2j+p0J9Bb5rmDMXddq4Zy0/NYHbpTkPIlPYGgb+DKamhmvXhiGvWGiFdqHVjJCaCpA== - dependencies: - "@shuding/opentype.js" "1.4.0-beta.0" - css-background-parser "^0.1.0" - css-box-shadow "1.0.0-3" - css-to-react-native "^3.0.0" - emoji-regex "^10.2.1" - linebreak "^1.1.0" - parse-css-color "^0.2.1" - postcss-value-parser "^4.2.0" - yoga-wasm-web "^0.3.3" - -scheduler@^0.21.0: - version "0.21.0" - resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.21.0.tgz#6fd2532ff5a6d877b6edb12f00d8ab7e8f308820" - integrity sha512-1r87x5fz9MXqswA2ERLo0EbOAU74DpIUO090gIasYTqlVoJeMcl+Z1Rg7WHz+qtPujhS/hGIt9kxZOYBV3faRQ== - dependencies: - loose-envify "^1.1.0" - scheduler@^0.23.0: version "0.23.0" resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.23.0.tgz#ba8041afc3d30eb206a487b6b384002e4e61fdfe" @@ -4901,18 +4363,37 @@ scheduler@^0.23.0: dependencies: loose-envify "^1.1.0" -semver@^6.3.0: - version "6.3.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" - integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== +schema-utils@^3.0.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-3.3.0.tgz#f50a88877c3c01652a15b622ae9e9795df7a60fe" + integrity sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg== + dependencies: + "@types/json-schema" "^7.0.8" + ajv "^6.12.5" + ajv-keywords "^3.5.2" -semver@^7.3.2, semver@^7.3.7, semver@^7.3.8: - version "7.5.1" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.1.tgz#c90c4d631cf74720e46b21c1d37ea07edfab91ec" - integrity sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw== +semver@^6.3.0, semver@^6.3.1: + version "6.3.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" + integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== + +semver@^7.5.4: + version "7.5.4" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.4.tgz#483986ec4ed38e1c6c48c34894a9182dbff68a6e" + integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA== dependencies: lru-cache "^6.0.0" +setimmediate@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" + integrity sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA== + +shallowequal@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/shallowequal/-/shallowequal-1.1.0.tgz#188d521de95b9087404fd4dcb68b13df0ae4e7f8" + integrity sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ== + shebang-command@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" @@ -4934,39 +4415,11 @@ side-channel@^1.0.4: get-intrinsic "^1.0.2" object-inspect "^1.9.0" -signal-exit@^3.0.2, signal-exit@^3.0.3, signal-exit@^3.0.7: - version "3.0.7" - resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" - integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== - slash@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== -slash@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/slash/-/slash-4.0.0.tgz#2422372176c4c6c5addb5e2ada885af984b396a7" - integrity sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew== - -slice-ansi@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-3.0.0.tgz#31ddc10930a1b7e0b67b08c96c2f49b77a789787" - integrity sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ== - dependencies: - ansi-styles "^4.0.0" - astral-regex "^2.0.0" - is-fullwidth-code-point "^3.0.0" - -slice-ansi@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-4.0.0.tgz#500e8dd0fd55b05815086255b3195adf2a45fe6b" - integrity sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ== - dependencies: - ansi-styles "^4.0.0" - astral-regex "^2.0.0" - is-fullwidth-code-point "^3.0.0" - source-map-js@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c" @@ -4977,69 +4430,33 @@ source-map@^0.5.0: resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" integrity sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ== +source-map@^0.7.0: + version "0.7.4" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.4.tgz#a9bbe705c9d8846f4e08ff6765acf0f1b0898656" + integrity sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA== + space-separated-tokens@^2.0.0: version "2.0.2" resolved "https://registry.yarnpkg.com/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz#1ecd9d2350a3844572c3f4a312bceb018348859f" integrity sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q== -sshpk@^1.14.1: - version "1.17.0" - resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.17.0.tgz#578082d92d4fe612b13007496e543fa0fbcbe4c5" - integrity sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ== - dependencies: - asn1 "~0.2.3" - assert-plus "^1.0.0" - bcrypt-pbkdf "^1.0.0" - dashdash "^1.12.0" - ecc-jsbn "~0.1.1" - getpass "^0.1.1" - jsbn "~0.1.0" - safer-buffer "^2.0.2" - tweetnacl "~0.14.0" - -stats.js@^0.17.0: - version "0.17.0" - resolved "https://registry.yarnpkg.com/stats.js/-/stats.js-0.17.0.tgz#b1c3dc46d94498b578b7fd3985b81ace7131cc7d" - integrity sha512-hNKz8phvYLPEcRkeG1rsGmV5ChMjKDAWU7/OJJdDErPBNChQXxCo3WZurGpnWc6gZhAzEPFad1aVgyOANH1sMw== - -stop-iteration-iterator@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz#6a60be0b4ee757d1ed5254858ec66b10c49285e4" - integrity sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ== - dependencies: - internal-slot "^1.0.4" - streamsearch@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/streamsearch/-/streamsearch-1.1.0.tgz#404dd1e2247ca94af554e841a8ef0eaa238da764" integrity sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg== -string-width@^4.1.0, string-width@^4.2.0: - version "4.2.3" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" - integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== - dependencies: - emoji-regex "^8.0.0" - is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.1" - -string.prototype.codepointat@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/string.prototype.codepointat/-/string.prototype.codepointat-0.2.1.tgz#004ad44c8afc727527b108cd462b4d971cd469bc" - integrity sha512-2cBVCj6I4IOvEnjgO/hWqXjqBGsY+zwPmHl12Srk9IXSZ56Jwwmy+66XO5Iut/oQVR7t5ihYdLB0GMa4alEUcg== - string.prototype.matchall@^4.0.8: - version "4.0.8" - resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.8.tgz#3bf85722021816dcd1bf38bb714915887ca79fd3" - integrity sha512-6zOCOcJ+RJAQshcTvXPHoxoQGONa3e/Lqx90wUA+wEzX78sg5Bo+1tQo4N0pohS0erG9qtCqJDjNCQBjeWVxyg== + version "4.0.9" + resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.9.tgz#148779de0f75d36b13b15885fec5cadde994520d" + integrity sha512-6i5hL3MqG/K2G43mWXWgP+qizFW/QH/7kCNN13JrJS5q48FN5IKksLDscexKP3dnmB6cdm9jlNgAsWNLpSykmA== dependencies: call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" - get-intrinsic "^1.1.3" + define-properties "^1.2.0" + es-abstract "^1.22.1" + get-intrinsic "^1.2.1" has-symbols "^1.0.3" - internal-slot "^1.0.3" - regexp.prototype.flags "^1.4.3" + internal-slot "^1.0.5" + regexp.prototype.flags "^1.5.0" side-channel "^1.0.4" string.prototype.trim@^1.2.7: @@ -5069,7 +4486,22 @@ string.prototype.trimstart@^1.0.6: define-properties "^1.1.4" es-abstract "^1.20.4" -strip-ansi@^6.0.0, strip-ansi@^6.0.1: +string_decoder@~1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" + integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== + dependencies: + safe-buffer "~5.1.0" + +stringify-entities@^4.0.0: + version "4.0.3" + resolved "https://registry.yarnpkg.com/stringify-entities/-/stringify-entities-4.0.3.tgz#cfabd7039d22ad30f3cc435b0ca2c1574fc88ef8" + integrity sha512-BP9nNHMhhfcMbiuQKCqMjhDP5yBCAxsPu4pHFFzJ6Alo9dZgY4VLDPutXqIjpRiMoKdp7Av85Gr73Q5uH9k7+g== + dependencies: + character-entities-html4 "^2.0.0" + character-entities-legacy "^3.0.0" + +strip-ansi@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== @@ -5081,28 +4513,34 @@ strip-bom@^3.0.0: resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" integrity sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA== -strip-final-newline@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" - integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== - -strip-final-newline@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-3.0.0.tgz#52894c313fbff318835280aed60ff71ebf12b8fd" - integrity sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw== - strip-json-comments@^3.1.0, strip-json-comments@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== -style-to-object@^0.4.0: - version "0.4.1" - resolved "https://registry.yarnpkg.com/style-to-object/-/style-to-object-0.4.1.tgz#53cf856f7cf7f172d72939d9679556469ba5de37" - integrity sha512-HFpbb5gr2ypci7Qw+IOhnP2zOU7e77b+rzM+wTzXzfi1PrtBCX0E7Pk4wL4iTLnhzZ+JgEGAhX81ebTg/aYjQw== +style-to-object@^0.4.0, style-to-object@^0.4.1: + version "0.4.2" + resolved "https://registry.yarnpkg.com/style-to-object/-/style-to-object-0.4.2.tgz#a8247057111dea8bd3b8a1a66d2d0c9cf9218a54" + integrity sha512-1JGpfPB3lo42ZX8cuPrheZbfQ6kqPPnPHlKMyeRYtfKD+0jG+QsXgXN57O/dvJlzlB2elI6dGmrPnl5VPQFPaA== dependencies: inline-style-parser "0.1.1" +styled-components@^5.3.6: + version "5.3.11" + resolved "https://registry.yarnpkg.com/styled-components/-/styled-components-5.3.11.tgz#9fda7bf1108e39bf3f3e612fcc18170dedcd57a8" + integrity sha512-uuzIIfnVkagcVHv9nE0VPlHPSCmXIUGKfJ42LNjxCCTDTL5sgnJ8Z7GZBq0EnLYGln77tPpEpExt2+qa+cZqSw== + dependencies: + "@babel/helper-module-imports" "^7.0.0" + "@babel/traverse" "^7.4.5" + "@emotion/is-prop-valid" "^1.1.0" + "@emotion/stylis" "^0.8.4" + "@emotion/unitless" "^0.7.4" + babel-plugin-styled-components ">= 1.12.0" + css-to-react-native "^3.0.0" + hoist-non-react-statics "^3.0.0" + shallowequal "^1.1.0" + supports-color "^5.5.0" + styled-jsx@5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/styled-jsx/-/styled-jsx-5.1.1.tgz#839a1c3aaacc4e735fed0781b8619ea5d0009d1f" @@ -5111,9 +4549,9 @@ styled-jsx@5.1.1: client-only "0.0.1" sucrase@^3.29.0: - version "3.32.0" - resolved "https://registry.yarnpkg.com/sucrase/-/sucrase-3.32.0.tgz#c4a95e0f1e18b6847127258a75cf360bc568d4a7" - integrity sha512-ydQOU34rpSyj2TGyz4D2p8rbktIOZ8QY9s+DGLvFU1i5pWJE8vkpruCjGCMHsdXwnD7JDcS+noSwM/a7zyNFDQ== + version "3.34.0" + resolved "https://registry.yarnpkg.com/sucrase/-/sucrase-3.34.0.tgz#1e0e2d8fcf07f8b9c3569067d92fbd8690fb576f" + integrity sha512-70/LQEZ07TEcxiU2dz51FKaE6hCTWC6vr7FOk3Gr0U60C3shtAN+H+BFr9XlYe5xqf3RA8nrc+VIwzCfnxuXJw== dependencies: "@jridgewell/gen-mapping" "^0.3.2" commander "^4.0.0" @@ -5123,7 +4561,7 @@ sucrase@^3.29.0: pirates "^4.0.1" ts-interface-checker "^0.1.9" -supports-color@^5.3.0: +supports-color@^5.3.0, supports-color@^5.5.0: version "5.5.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== @@ -5137,37 +4575,15 @@ supports-color@^7.1.0: dependencies: has-flag "^4.0.0" -supports-color@^8.1.1: - version "8.1.1" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" - integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== - dependencies: - has-flag "^4.0.0" - supports-preserve-symlinks-flag@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== -suspend-react@^0.0.8: - version "0.0.8" - resolved "https://registry.yarnpkg.com/suspend-react/-/suspend-react-0.0.8.tgz#b0740c1386b4eb652f17affe4339915ee268bd31" - integrity sha512-ZC3r8Hu1y0dIThzsGw0RLZplnX9yXwfItcvaIzJc2VQVi8TGyGDlu92syMB5ulybfvGLHAI5Ghzlk23UBPF8xg== - -swr@^2.1.3: - version "2.1.5" - resolved "https://registry.yarnpkg.com/swr/-/swr-2.1.5.tgz#688effa719c03f6d35c66decbb0f8e79c7190399" - integrity sha512-/OhfZMcEpuz77KavXST5q6XE9nrOBOVcBLWjMT+oAE/kQHyE3PASrevXCtQDZ8aamntOfFkbVJp7Il9tNBQWrw== - dependencies: - use-sync-external-store "^1.2.0" - -synckit@^0.8.5: - version "0.8.5" - resolved "https://registry.yarnpkg.com/synckit/-/synckit-0.8.5.tgz#b7f4358f9bb559437f9f167eb6bc46b3c9818fa3" - integrity sha512-L1dapNV6vu2s/4Sputv8xGsCdAVlb5nRDMFU/E27D44l5U6cw1g0dGd45uLc+OXjNMmF4ntiMdCimzcjFKQI8Q== - dependencies: - "@pkgr/utils" "^2.3.1" - tslib "^2.5.0" +tailwind-merge@^1.14.0: + version "1.14.0" + resolved "https://registry.yarnpkg.com/tailwind-merge/-/tailwind-merge-1.14.0.tgz#e677f55d864edc6794562c63f5001f45093cdb8b" + integrity sha512-3mFKyCo/MBcgyOTlrY8T7odzZFx+w+qKSMAmdFzRvqBfLlSigU6TZnlFHK0lkMwj9Bj8OYU+9yW9lmGuS0QEnQ== tailwindcss@3.3.1: version "3.3.1" @@ -5223,59 +4639,15 @@ thenify-all@^1.0.0: dependencies: any-promise "^1.0.0" -three-mesh-bvh@^0.5.23: - version "0.5.24" - resolved "https://registry.yarnpkg.com/three-mesh-bvh/-/three-mesh-bvh-0.5.24.tgz#56dd27ad35bfbafacedaba4a4d567723bbdd686c" - integrity sha512-VTIgfjz8aFoPKTQoMIQQv9jJD4ybFRZuKKE1/kqy78FQcuHQ0+iIWv7C5cSb2inlvs7bNMVY3yRx3RXGZfrvzQ== +tiny-invariant@^1.0.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/tiny-invariant/-/tiny-invariant-1.3.1.tgz#8560808c916ef02ecfd55e66090df23a4b7aa642" + integrity sha512-AD5ih2NlSssTCwsMznbvwMZpJ1cbhkGd2uueNxzv2jDlEeZdU04JQfRnggJQ8DrcVBGjAsCKwFBbDlVNtEMlzw== -three-stdlib@^2.21.8: - version "2.21.11" - resolved "https://registry.yarnpkg.com/three-stdlib/-/three-stdlib-2.21.11.tgz#ee058f1522edf17f994b4a80307568dd553bd52e" - integrity sha512-fFeaMOc3lpup4A/FrSKHmp/PNYmyxyV8dzMorJpYyZBdIGAn5BmokGSN9ei8t7Wv9thxCW+VLaxA6csxTl5MYg== - dependencies: - "@babel/runtime" "^7.16.7" - "@types/offscreencanvas" "^2019.6.4" - "@webgpu/glslang" "^0.0.15" - chevrotain "^10.1.2" - draco3d "^1.4.1" - fflate "^0.6.9" - ktx-parse "^0.4.5" - mmd-parser "^1.0.4" - opentype.js "^1.3.3" - potpack "^1.0.1" - zstddec "^0.0.2" - -three@^0.152.0: - version "0.152.2" - resolved "https://registry.yarnpkg.com/three/-/three-0.152.2.tgz#2ee0f2c504d31a4bc29b45495c12bded9fda7bfc" - integrity sha512-Ff9zIpSfkkqcBcpdiFo2f35vA9ZucO+N8TNacJOqaEE6DrB0eufItVMib8bK8Pcju/ZNT6a7blE1GhTpkdsILw== - -throttleit@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/throttleit/-/throttleit-1.0.0.tgz#9e785836daf46743145a5984b6268d828528ac6c" - integrity sha512-rkTVqu6IjfQ/6+uNuuc3sZek4CEYxTJom3IktzgdSxcZqdARuebbA/f4QmAxMQIxqq9ZLEUkSYqvuk1I6VKq4g== - -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-inflate@^1.0.0, tiny-inflate@^1.0.3: +tiny-warning@^1.0.0: version "1.0.3" - resolved "https://registry.yarnpkg.com/tiny-inflate/-/tiny-inflate-1.0.3.tgz#122715494913a1805166aaf7c93467933eea26c4" - integrity sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw== - -titleize@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/titleize/-/titleize-3.0.0.tgz#71c12eb7fdd2558aa8a44b0be83b8a76694acd53" - integrity sha512-KxVu8EYHDPBdUYdKZdKtU2aj2XfEx9AfjXxE/Aj0vT06w2icA09Vus1rh6eSu1y01akYg6BjIK/hxyLJINoMLQ== - -tmp@~0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.2.1.tgz#8457fc3037dcf4719c251367a1af6500ee1ccf14" - integrity sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ== - dependencies: - rimraf "^3.0.0" + resolved "https://registry.yarnpkg.com/tiny-warning/-/tiny-warning-1.0.3.tgz#94a30db453df4c643d0fd566060d60a875d84754" + integrity sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA== to-fast-properties@^2.0.0: version "2.0.0" @@ -5289,14 +4661,6 @@ to-regex-range@^5.0.1: dependencies: is-number "^7.0.0" -tough-cookie@~2.5.0: - version "2.5.0" - resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.5.0.tgz#cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2" - integrity sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g== - dependencies: - psl "^1.1.28" - punycode "^2.1.1" - tr46@~0.0.3: version "0.0.3" resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" @@ -5307,37 +4671,22 @@ trim-lines@^3.0.0: resolved "https://registry.yarnpkg.com/trim-lines/-/trim-lines-3.0.1.tgz#d802e332a07df861c48802c04321017b1bd87338" integrity sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg== -troika-three-text@^0.47.1: - version "0.47.2" - resolved "https://registry.yarnpkg.com/troika-three-text/-/troika-three-text-0.47.2.tgz#fdf89059c010563bb829262b20c41f69ca79b712" - integrity sha512-qylT0F+U7xGs+/PEf3ujBdJMYWbn0Qci0kLqI5BJG2kW1wdg4T1XSxneypnF05DxFqJhEzuaOR9S2SjiyknMng== - dependencies: - bidi-js "^1.0.2" - troika-three-utils "^0.47.2" - troika-worker-utils "^0.47.2" - webgl-sdf-generator "1.1.1" - -troika-three-utils@^0.47.2: - version "0.47.2" - resolved "https://registry.yarnpkg.com/troika-three-utils/-/troika-three-utils-0.47.2.tgz#af49ca694245dce631963d5fefe4e8e1b8af9044" - integrity sha512-/28plhCxfKtH7MSxEGx8e3b/OXU5A0xlwl+Sbdp0H8FXUHKZDoksduEKmjQayXYtxAyuUiCRunYIv/8Vi7aiyg== - -troika-worker-utils@^0.47.2: - version "0.47.2" - resolved "https://registry.yarnpkg.com/troika-worker-utils/-/troika-worker-utils-0.47.2.tgz#e7c5de5f37d56c072b13fa8112bb844e048ff46c" - integrity sha512-mzss4MeyzUkYBppn4x5cdAqrhBHFEuVmMMgLMTyFV23x6GvQMyo+/R5E5Lsbrt7WSt5RfvewjcwD1DChRTA9lA== - trough@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/trough/-/trough-2.1.0.tgz#0f7b511a4fde65a46f18477ab38849b22c554876" integrity sha512-AqTiAOLcj85xS7vQ8QkAV41hPDIJ71XJB4RCUrzo/1GM2CQwhkJGaf9Hgr7BOugMRpgGUrqRg/DrBDl4H40+8g== +ts-api-utils@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/ts-api-utils/-/ts-api-utils-1.0.2.tgz#7c094f753b6705ee4faee25c3c684ade52d66d99" + integrity sha512-Cbu4nIqnEdd+THNEsBdkolnOXhg0I8XteoHaEKgvsxpsbWda4IsUut2c187HxywQCvveojow0Dgw/amxtSKVkQ== + ts-interface-checker@^0.1.9: version "0.1.13" resolved "https://registry.yarnpkg.com/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz#784fd3d679722bc103b1b4b8030bcddb5db2a699" integrity sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA== -tsconfig-paths@^3.14.1: +tsconfig-paths@^3.14.2: version "3.14.2" resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz#6e32f1f79412decd261f92d633a9dc1cfa99f088" integrity sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g== @@ -5347,34 +4696,10 @@ tsconfig-paths@^3.14.1: minimist "^1.2.6" strip-bom "^3.0.0" -tslib@^1.8.1: - version "1.14.1" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" - integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== - -tslib@^2.1.0, tslib@^2.4.0, tslib@^2.5.0: - version "2.5.2" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.5.2.tgz#1b6f07185c881557b0ffa84b111a0106989e8338" - integrity sha512-5svOrSA2w3iGFDs1HibEVBGbDrAY82bFQ3HZ3ixB+88nsbsWQoKqDRb5UBYAUPEzbBn6dAp5gRNXglySbx1MlA== - -tsutils@^3.21.0: - version "3.21.0" - resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.21.0.tgz#b48717d394cea6c1e096983eed58e9d61715b623" - integrity sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA== - dependencies: - tslib "^1.8.1" - -tunnel-agent@^0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" - integrity sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w== - dependencies: - safe-buffer "^5.0.1" - -tweetnacl@^0.14.3, tweetnacl@~0.14.0: - version "0.14.5" - resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" - integrity sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA== +tslib@^2.4.0: + version "2.6.2" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.2.tgz#703ac29425e7b37cd6fd456e92404d46d1f3e4ae" + integrity sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q== type-check@^0.4.0, type-check@~0.4.0: version "0.4.0" @@ -5388,10 +4713,35 @@ type-fest@^0.20.2: resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== -type-fest@^0.21.3: - version "0.21.3" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37" - integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== +typed-array-buffer@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz#18de3e7ed7974b0a729d3feecb94338d1472cd60" + integrity sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.2.1" + is-typed-array "^1.1.10" + +typed-array-byte-length@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz#d787a24a995711611fb2b87a4052799517b230d0" + integrity sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA== + dependencies: + call-bind "^1.0.2" + for-each "^0.3.3" + has-proto "^1.0.1" + is-typed-array "^1.1.10" + +typed-array-byte-offset@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz#cbbe89b51fdef9cd6aaf07ad4707340abbc4ea0b" + integrity sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg== + dependencies: + available-typed-arrays "^1.0.5" + call-bind "^1.0.2" + for-each "^0.3.3" + has-proto "^1.0.1" + is-typed-array "^1.1.10" typed-array-length@^1.0.4: version "1.0.4" @@ -5417,14 +4767,6 @@ unbox-primitive@^1.0.2: has-symbols "^1.0.3" which-boxed-primitive "^1.0.2" -unicode-trie@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/unicode-trie/-/unicode-trie-2.0.0.tgz#8fd8845696e2e14a8b67d78fa9e0dd2cad62fec8" - integrity sha512-x7bc76x0bm4prf1VLg79uhAzKw8DVboClSN5VxJuQ+LKDOVEW9CdH+VY7SP+vX7xCYQqzzgQpFqz15zeLvAtZQ== - dependencies: - pako "^0.2.5" - tiny-inflate "^1.0.0" - unified@^10.0.0: version "10.1.2" resolved "https://registry.yarnpkg.com/unified/-/unified-10.1.2.tgz#b1d64e55dafe1f0b98bb6c719881103ecf6c86df" @@ -5467,6 +4809,13 @@ unist-util-is@^5.0.0: dependencies: "@types/unist" "^2.0.0" +unist-util-position-from-estree@^1.0.0, unist-util-position-from-estree@^1.1.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/unist-util-position-from-estree/-/unist-util-position-from-estree-1.1.2.tgz#8ac2480027229de76512079e377afbcabcfcce22" + integrity sha512-poZa0eXpS+/XpoQwGwl79UUdea4ol2ZuCYguVaJS4qzIOMDzbqz8a3erUCOmubSZkaOuGamb3tX790iwOIROww== + dependencies: + "@types/unist" "^2.0.0" + unist-util-position@^4.0.0: version "4.0.4" resolved "https://registry.yarnpkg.com/unist-util-position/-/unist-util-position-4.0.4.tgz#93f6d8c7d6b373d9b825844645877c127455f037" @@ -5506,17 +4855,7 @@ unist-util-visit@^4.0.0: unist-util-is "^5.0.0" unist-util-visit-parents "^5.1.1" -universalify@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.0.tgz#75a4984efedc4b08975c5aeb73f530d02df25717" - integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ== - -untildify@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/untildify/-/untildify-4.0.0.tgz#2bc947b953652487e4600949fb091e3ae8cd919b" - integrity sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw== - -update-browserslist-db@^1.0.10: +update-browserslist-db@^1.0.11: version "1.0.11" resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz#9a2a641ad2907ae7b3616506f4b977851db5b940" integrity sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA== @@ -5536,26 +4875,11 @@ url-template@^2.0.8: resolved "https://registry.yarnpkg.com/url-template/-/url-template-2.0.8.tgz#fc565a3cccbff7730c775f5641f9555791439f21" integrity sha512-XdVKMF4SJ0nP/O7XIPB0JwAEuT9lDIYnNsK8yGVe43y0AWoKeJNdv3ZNWh7ksJ6KqQFjOO6ox/VEitLnaVNufw== -use-sync-external-store@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz#7dbefd6ef3fe4e767a0cf5d7287aacfb5846928a" - integrity sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA== - -util-deprecate@^1.0.2: +util-deprecate@^1.0.2, util-deprecate@~1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== -utility-types@^3.10.0: - version "3.10.0" - resolved "https://registry.yarnpkg.com/utility-types/-/utility-types-3.10.0.tgz#ea4148f9a741015f05ed74fd615e1d20e6bed82b" - integrity sha512-O11mqxmi7wMKCo6HKFt5AhO4BwY3VV68YU07tgxfz8zJTIxr4BpsezN49Ffwy9j3ZpwwJp4fkRwjRzq3uWE6Rg== - -uuid@^8.3.2: - version "8.3.2" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" - integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== - uuid@^9.0.0: version "9.0.0" resolved "https://registry.yarnpkg.com/uuid/-/uuid-9.0.0.tgz#592f550650024a38ceb0c562f2f6aa435761efb5" @@ -5571,20 +4895,6 @@ uvu@^0.5.0: kleur "^4.0.3" sade "^1.7.3" -vary@^1: - version "1.1.2" - resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" - integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg== - -verror@1.10.0: - version "1.10.0" - resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" - integrity sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw== - dependencies: - assert-plus "^1.0.0" - core-util-is "1.0.2" - extsprintf "^1.2.0" - vfile-location@^4.0.0: version "4.1.0" resolved "https://registry.yarnpkg.com/vfile-location/-/vfile-location-4.1.0.tgz#69df82fb9ef0a38d0d02b90dd84620e120050dd0" @@ -5611,31 +4921,31 @@ vfile@^5.0.0: unist-util-stringify-position "^3.0.0" vfile-message "^3.0.0" +warning@^4.0.2: + version "4.0.3" + resolved "https://registry.yarnpkg.com/warning/-/warning-4.0.3.tgz#16e9e077eb8a86d6af7d64aa1e05fd85b4678ca3" + integrity sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w== + dependencies: + loose-envify "^1.0.0" + +watchpack@2.4.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.4.0.tgz#fa33032374962c78113f93c7f2fb4c54c9862a5d" + integrity sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg== + dependencies: + glob-to-regexp "^0.4.1" + graceful-fs "^4.1.2" + web-namespaces@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/web-namespaces/-/web-namespaces-2.0.1.tgz#1010ff7c650eccb2592cebeeaf9a1b253fd40692" integrity sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ== -webgl-constants@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/webgl-constants/-/webgl-constants-1.1.1.tgz#f9633ee87fea56647a60b9ce735cbdfb891c6855" - integrity sha512-LkBXKjU5r9vAW7Gcu3T5u+5cvSvh5WwINdr0C+9jpzVB41cjQAP5ePArDtk/WHYdVj0GefCgM73BA7FlIiNtdg== - -webgl-sdf-generator@1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/webgl-sdf-generator/-/webgl-sdf-generator-1.1.1.tgz#3e1b422b3d87cd3cc77f2602c9db63bc0f6accbd" - integrity sha512-9Z0JcMTFxeE+b2x1LJTdnaT8rT8aEp7MVxkNwoycNmJWwPdzoXzMh0BjJSh/AEFP+KPYZUli814h8bJZFIZ2jA== - webidl-conversions@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ== -whatwg-fetch@^3.4.1: - version "3.6.2" - resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-3.6.2.tgz#dced24f37f2624ed0281725d51d0e2e3fe677f8c" - integrity sha512-bJlen0FcuU/0EMLrdbJ7zOnW6ITZLrZMIarMUVmdKtsGvZna8vxKYaexICWPfZ8qwf9fzNq+UEIZrnSaApt6RA== - whatwg-url@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" @@ -5655,6 +4965,24 @@ which-boxed-primitive@^1.0.2: is-string "^1.0.5" is-symbol "^1.0.3" +which-builtin-type@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/which-builtin-type/-/which-builtin-type-1.1.3.tgz#b1b8443707cc58b6e9bf98d32110ff0c2cbd029b" + integrity sha512-YmjsSMDBYsM1CaFiayOVT06+KJeXf0o5M/CAd4o1lTadFAtacTUM49zoYxr/oroopFDfhvN6iEcBxUyc3gvKmw== + dependencies: + function.prototype.name "^1.1.5" + has-tostringtag "^1.0.0" + is-async-function "^2.0.0" + is-date-object "^1.0.5" + is-finalizationregistry "^1.0.2" + is-generator-function "^1.0.10" + is-regex "^1.1.4" + is-weakref "^1.0.2" + isarray "^2.0.5" + which-boxed-primitive "^1.0.2" + which-collection "^1.0.1" + which-typed-array "^1.1.9" + which-collection@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/which-collection/-/which-collection-1.0.1.tgz#70eab71ebbbd2aefaf32f917082fc62cdcb70906" @@ -5665,17 +4993,16 @@ which-collection@^1.0.1: is-weakmap "^2.0.1" is-weakset "^2.0.1" -which-typed-array@^1.1.9: - version "1.1.9" - resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.9.tgz#307cf898025848cf995e795e8423c7f337efbde6" - integrity sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA== +which-typed-array@^1.1.10, which-typed-array@^1.1.11, which-typed-array@^1.1.9: + version "1.1.11" + resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.11.tgz#99d691f23c72aab6768680805a271b69761ed61a" + integrity sha512-qe9UWWpkeG5yzZ0tNYxDmd7vo58HDBc39mZ0xWWpolAGADdFOzkfamWLDxkOWcvHQKVmdTyQdLD4NOfjLWTKew== dependencies: available-typed-arrays "^1.0.5" call-bind "^1.0.2" for-each "^0.3.3" gopd "^1.0.1" has-tostringtag "^1.0.0" - is-typed-array "^1.1.10" which@^2.0.1: version "2.0.2" @@ -5684,29 +5011,6 @@ which@^2.0.1: dependencies: isexe "^2.0.0" -word-wrap@^1.2.3: - version "1.2.3" - resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" - integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== - -wrap-ansi@^6.2.0: - version "6.2.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53" - integrity sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA== - dependencies: - ansi-styles "^4.0.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" - -wrap-ansi@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" - integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== - dependencies: - ansi-styles "^4.0.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" - wrappy@1: version "1.0.2" resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" @@ -5722,39 +5026,16 @@ 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" integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== -yoga-wasm-web@0.3.3, yoga-wasm-web@^0.3.3: - version "0.3.3" - resolved "https://registry.yarnpkg.com/yoga-wasm-web/-/yoga-wasm-web-0.3.3.tgz#eb8e9fcb18e5e651994732f19a220cb885d932ba" - integrity sha512-N+d4UJSJbt/R3wqY7Coqs5pcV0aUj2j9IaQ3rNj9bVCLld8tTGKRa2USARjnvZJWVx1NDmQev8EknoczaOQDOA== - zod@3.21.4: version "3.21.4" resolved "https://registry.yarnpkg.com/zod/-/zod-3.21.4.tgz#10882231d992519f0a10b5dd58a38c9dabbb64db" integrity sha512-m46AKbrzKVzOzs/DZgVnG5H55N1sv1M8qZU3A8RIKbs3mrACDNeIOeilDymVb2HdmP8uwshOCF4uJ8uM9rCqJw== -zstddec@^0.0.2: - version "0.0.2" - resolved "https://registry.yarnpkg.com/zstddec/-/zstddec-0.0.2.tgz#57e2f28dd1ff56b750e07d158a43f0611ad9eeb4" - integrity sha512-DCo0oxvcvOTGP/f5FA6tz2Z6wF+FIcEApSTu0zV5sQgn9hoT5lZ9YRAKUraxt9oP7l4e8TnNdi8IZTCX6WCkwA== - -zustand@^3.5.13, zustand@^3.7.1: - version "3.7.2" - resolved "https://registry.yarnpkg.com/zustand/-/zustand-3.7.2.tgz#7b44c4f4a5bfd7a8296a3957b13e1c346f42514d" - integrity sha512-PIJDIZKtokhof+9+60cpockVOq05sJzHCriyvaLBmEJixseQ1a5Kdov6fWZfWOu5SK9c+FhH1jU0tntLxRJYMA== - zwitch@^2.0.0: version "2.0.4" resolved "https://registry.yarnpkg.com/zwitch/-/zwitch-2.0.4.tgz#c827d4b0acb76fc3e685a4c6ec2902d51070e9d7"