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 @@

-## 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 && (
-
-
- {isNextPageLoading
- ? "Loading data..."
- : "Load more"}
-
-
- )}
-
-
-
- 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.videoMediaMetadata && (
-
-
- {file.videoMediaMetadata.durationMillis && (
-
- {formatDuration(
- file.videoMediaMetadata
- .durationMillis,
- )}
-
- )}
-
- )}
- >
- ) : (
-
-
-
- )}
-
-
-
-
- {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.videoMediaMetadata && (
-
-
-
- )}
-
- ) : (
-
- )}
-
-
- {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.title || siteConfig.siteName}
-
-
-
-
-
- {siteConfig.navbar.links.map((link) => (
-
- {link.icon && }
- {link.name}
-
- ))}
-
-
-
-
-
-
- setTheme(theme === "dark" ? "light" : "dark")
- }
- >
-
-
-
-
{
- const confirm = window.confirm(
- "Are you sure you want to clear all password?",
- );
- if (confirm) {
- clearPassword();
- window.location.reload();
- }
- }}
- >
-
-
-
-
-
-
-
- {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.
-
-
-
-
- );
-}
-
-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.
-
-
-
Go back to home
-
-
-
- );
-}
-
-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(
- (
-
- ),
- {
- ...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(
- (
-
- ),
- {
- ...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(
- (
-
- ),
- {
- ...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"
+ }`}
+ >
+
+
+ >
+ );
+}
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 (
+
+ {props.loading ? (
+
+ ) : (
+ <>
+ {startIcon && (
+
+ )}
+ {children}
+ {endIcon && (
+
+ )}
+ >
+ )}
+
+ );
+}
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.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"
+ }`}
+ >
+
+
+ >
+ );
+}
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.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"
+ }`}
+ >
+
+
+ >
+ );
+}
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 = () => (
+
+
+
+
+
+
+
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 && (
+
+ Load more...
+
+ )}
+
+ )}
+
+ {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 && (
+
+ props.viewSelector?.setView("list")}
+ >
+ List view
+
+ props.viewSelector?.setView("grid")}
+ >
+ Grid view
+
+
+ )}
+
+
+ {
+ setSearchModalOpen(true);
+ setTimeout(() => {
+ inputRef.current?.focus();
+ }, 100);
+ }}
+ />
+
+
+ )}
+
+ {!props.showPasswordLayout && props.viewSelector && (
+
+
+ props.viewSelector?.setView("list")}
+ >
+ List view
+
+ props.viewSelector?.setView("grid")}
+ >
+ Grid view
+
+
+
+ )}
+
+ setSearchModalOpen(false)}
+ title='Search'
+ >
+
+
setSearchQuery(e.target.value)}
+ />
+
+ {searchLoading ? (
+
+
+
+
+
+
Searching file...
+
+ ) : (
+
+ {searchResults.length === 0 ? (
+
+ No results found
+
+ ) : (
+ <>
+ {searchResults.map((file) => (
+
+ {file.thumbnailLink &&
+ (file.mimeType.startsWith("video") || file.mimeType.startsWith("image")) ? (
+
+ ) : (
+
+ )}
+
+
{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 ? (
+
+
+
+
+
+
+
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 (
+
+
+
+
+
+
+
+ The folder / file you are trying to access is
+ protected with a password.
+
+
+ {props.path}
+
+
Please enter the password to continue:
+
+
+
+ );
+}
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 = () => (
+
+
+
+
+
+
+
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 ?? "-"}
+
+ ))}
+
+
+
+
+
+
+ Download
+
+
+
{
+ try {
+ const url = generatedDownloadLink(data.file!, props.isFileProtected, true, downloadToken);
+ navigator.clipboard.writeText(url);
+ toast.success("URL copied to clipboard.");
+ } catch (error: any) {
+ toast.error("Failed to copy URL to clipboard.");
+ console.error(error.message);
+ }
+ }}
+ >
+ Copy URL
+
+
+
+ {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);
+ }}
+ >
+
+ {
+ handleCopy();
+ }}
+ >
+ {isCopied ? "Copied!" : isError ? "Failed to copy" : "Copy"}
+
+
+
+ {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 ? (
+
+
+
+
+
+
+
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 (
+
+
+
+
+
+
+
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 ? (
+
+
+
+
+
+
+
Loading image...
+
+
+ ) : (
+ <>
+ {isError ? (
+
+ ) : (
+
+ )}
+ >
+ )}
+ >
+ );
+}
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 ? (
+
+
+
+
+
+
+
Loading content...
+
+
+ ) : (
+ <>
+ {isError ? (
+
+ ) : (
+
+
+
+
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 ? (
+
+
+
+
+
+
+
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 (
+
+
+
+
+
+
+
+
+ The page you are trying to access is not found.
+
+
+ Please check the URL or go back to the homepage.
+
+
+
+
+
+ Go back to 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 ? (
+
+
+
+
+
+
+
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 (
+
+
+
+
+
setIsMobileMenuOpen(false)}
+ >
+
+
+
+
+
+ {gIndexConfig.siteConfig.navbarItems.map((link) => (
+
+
+
+
+
+ ))}
+
+
+ setClearPasswordModalOpen(true)}
+ />
+
+
+
+ setIsMobileMenuOpen((prev) => !prev)}
+ >
+
+
+
+
+
+ setIsMobileMenuOpen(false)}
+ className={`transition-smooth w-full h-screen block tablet:hidden absolute top-0 z-40 ${
+ isMobileMenuOpen ? "opacity-100 pointer-events-auto" : "opacity-0 pointer-events-none"
+ }`}
+ >
+
+
+ {gIndexConfig.siteConfig.navbarItems.map((link) => (
+ {
+ // If href === current page, prevent default
+ if (router.pathname === link.href) {
+ e.preventDefault();
+ }
+ e.stopPropagation();
+ setIsMobileMenuOpen(false);
+ }}
+ >
+
+ {link.name}
+
+ ))}
+ setClearPasswordModalOpen(true)}
+ rounded='large'
+ startIcon={"ion:log-out"}
+ className='mt-4'
+ >
+ Clear password
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 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.
+
+
+
+ setClearPasswordModalOpen(false)}
+ >
+ Cancel
+
+
+ Clear password
+
+
+
+
+
+ );
+}
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 ? (
+
+
+
+
+
+
+
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"