diff --git a/.eslintrc.json b/.eslintrc.json index 10a85fc..b049ab5 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -2,6 +2,9 @@ "globals": { "globalThis": true }, + "extends": ["next/core-web-vitals", "next", "prettier", "eslint:recommended"], "ignorePatterns": ["src/types/**"], - "extends": ["next/core-web-vitals", "next", "prettier", "eslint:recommended"] + "rules": { + "@next/next/no-img-element": "off" + } } diff --git a/.flake8 b/.flake8 new file mode 100644 index 0000000..6eac13c --- /dev/null +++ b/.flake8 @@ -0,0 +1,3 @@ +[flake8] +extend-ignore = E203 +max-line-length = 120 diff --git a/.github/workflows/lint.yml b/.github/workflows/ci.yml similarity index 52% rename from .github/workflows/lint.yml rename to .github/workflows/ci.yml index dfa0b9f..6e5f394 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/ci.yml @@ -2,6 +2,14 @@ name: CI on: push: + paths-ignore: + - README.md + - LICENSE + + pull_request: + paths-ignore: + - README.md + - LICENSE branches: - main @@ -19,7 +27,7 @@ jobs: registry-url: https://registry.yarnpkg.com - name: Cache Yarn dependencies - uses: actions/cache@v2 + uses: actions/cache@v3 with: path: | node_modules @@ -27,8 +35,21 @@ jobs: restore-keys: | ${{ runner.os }}-yarn- - - name: Install dependencies + - name: Install Yarn dependencies run: yarn install - - name: Lint + - name: Yarn Lint run: yarn lint + + - uses: actions/checkout@v3 + - name: Set up Python + uses: actions/setup-python@v4 + with: + python-version: 3.8 + cache: 'pip' + + - name: Install pip dependencies + run: python -m pip install --upgrade pip flake8 + + - name: Flake8 + run: flake8 api core diff --git a/api/index.py b/api/core/index.py similarity index 75% rename from api/index.py rename to api/core/index.py index 959a88a..8f38bd6 100644 --- a/api/index.py +++ b/api/core/index.py @@ -4,13 +4,11 @@ from dotenv import load_dotenv from flask import Flask, jsonify, request, send_file, session -# from flask_cors import CORS, cross_origin -from utils.wrappers import auth_required, destroy_build_session, session_keys - -from api.builder.compress import FileResponse, win_compress, x11_compress -from api.builder.cursor import store_cursors -from api.utils.parser import parse_download_params, parse_upload_formdata -from api.utils.token import decode_auth_header +from core.builder.compress import FileResponse, win_compress, x11_compress +from core.builder.cursor import store_cursors +from core.utils.parser import parse_download_params, parse_upload_formdata +from core.utils.token import decode_auth_header +from core.utils.wrappers import auth_required, destroy_build_session, session_keys load_dotenv() @@ -19,11 +17,9 @@ app.secret_key = os.getenv("FLASK_SECRET") app.config["SESSION_COOKIE_SAMESITE"] = "Lax" -# CORS(app, supports_credentials=True) -@app.route("/api/session", methods=["GET"]) -# @cross_origin(origins="*") +@app.route("/api/core/session", methods=["GET"]) def get_session(): auth = decode_auth_header() @@ -34,7 +30,7 @@ def get_session(): return jsonify({"id": auth.id, "role": auth.role}) -@app.route("/api/session", methods=["DELETE"]) +@app.route("/api/core/session", methods=["DELETE"]) def destroy_session(): k = session_keys["build"] id = session.get(k, None) @@ -45,7 +41,7 @@ def destroy_session(): return jsonify({"id": id}) -@app.route("/api/upload", methods=["POST"]) +@app.route("/api/core/upload", methods=["POST"]) @auth_required def upload_images(): errors: List[str] = [] @@ -68,7 +64,7 @@ def upload_images(): return jsonify({"status": 200, "id": id, "file": name, "error": None}) -@app.route("/api/download", methods=["GET"]) +@app.route("/api/core/download", methods=["GET"]) def download(): errors: List[str] = [] diff --git a/api/builder/compress.py b/core/builder/compress.py similarity index 93% rename from api/builder/compress.py rename to core/builder/compress.py index a89671f..407dc75 100644 --- a/api/builder/compress.py +++ b/core/builder/compress.py @@ -9,9 +9,9 @@ from clickgen.packer.windows import pack_win from clickgen.packer.x11 import pack_x11 -from api.builder.config import gsubtmp, gtmp -from api.builder.files import attach_files -from api.utils.parser import DownloadParams +from core.builder.config import gsubtmp, gtmp +from core.builder.files import attach_files +from core.utils.parser import DownloadParams @dataclass diff --git a/api/builder/config.py b/core/builder/config.py similarity index 100% rename from api/builder/config.py rename to core/builder/config.py diff --git a/api/builder/cursor.py b/core/builder/cursor.py similarity index 70% rename from api/builder/cursor.py rename to core/builder/cursor.py index f82c714..f867f44 100644 --- a/api/builder/cursor.py +++ b/core/builder/cursor.py @@ -1,15 +1,12 @@ import os from logging import Logger -from typing import List, Union +from typing import List from clickgen.parser import open_blob from clickgen.writer import to_win, to_x11 -from wand.api import library -from wand.color import Color -from wand.image import Image -from api.builder.config import configs, gsubtmp -from api.utils.parser import UploadFormData +from core.builder.config import configs, gsubtmp +from core.utils.parser import UploadFormData def store_cursors(sid: str, data: UploadFormData, logger: Logger): @@ -17,25 +14,12 @@ def store_cursors(sid: str, data: UploadFormData, logger: Logger): name = data.name platform = data.platform - frames = data.frames + pngs = data.frames size = data.size delay = data.delay - pngs: List[bytes] = [] - try: - for f in frames: - with Image() as image: - with Color("transparent") as background_color: - library.MagickSetBackgroundColor( - image.wand, background_color.resource - ) - image.read(blob=f.encode(), format="svg") - png = image.make_blob("png32") - if type(png) is bytes: - pngs.append(png) - - if not pngs: + if len(pngs) == 0: errors.append("Unable to convert SVG to PNG") return None, errors diff --git a/api/builder/files.py b/core/builder/files.py similarity index 98% rename from api/builder/files.py rename to core/builder/files.py index e667050..9230b8a 100644 --- a/api/builder/files.py +++ b/core/builder/files.py @@ -2,7 +2,7 @@ from pathlib import Path from typing import Literal -from api.utils.parser import DownloadParams +from core.utils.parser import DownloadParams README = """[::] Bibata Cursor TLDR; This cursor set is a masterpiece of cursors available on the internet, diff --git a/api/utils/parser.py b/core/utils/parser.py similarity index 94% rename from api/utils/parser.py rename to core/utils/parser.py index b5a32ef..249f35f 100644 --- a/api/utils/parser.py +++ b/core/utils/parser.py @@ -1,3 +1,4 @@ +import base64 from dataclasses import dataclass from logging import Logger from typing import List, Literal @@ -8,7 +9,7 @@ @dataclass class UploadFormData: name: str - frames: List[str] + frames: List[bytes] platform: str size: int delay: int @@ -22,7 +23,7 @@ def parse_upload_formdata(request: Request, logger: Logger): size: int = 0 delay: int = 0 platform: str = "" - frames: List[str] = [] + frames: List[bytes] = [] try: form_data = request.form.get("data") @@ -77,7 +78,8 @@ def parse_upload_formdata(request: Request, logger: Logger): f"Invalid 'frames[{i}]' type. It must be type 'string'" ) else: - frames.append(v) + base64_str = v[len("data:image/png;base64,") :] + frames.append(base64.b64decode(base64_str)) except Exception as e: errors.append(str(e)) diff --git a/api/utils/token.py b/core/utils/token.py similarity index 97% rename from api/utils/token.py rename to core/utils/token.py index 58e5d06..544c77f 100644 --- a/api/utils/token.py +++ b/core/utils/token.py @@ -68,7 +68,7 @@ def decode_auth_header(): auth_header = request.headers.get("Authorization") if auth_header and auth_header.startswith("Bearer "): - token = auth_header[len("Bearer ") :] # noqa: E203 + token = auth_header[len("Bearer ") :] try: auth = decode_token(token) if auth == "expired": diff --git a/api/utils/wrappers.py b/core/utils/wrappers.py similarity index 92% rename from api/utils/wrappers.py rename to core/utils/wrappers.py index a15b743..a1fce85 100644 --- a/api/utils/wrappers.py +++ b/core/utils/wrappers.py @@ -3,8 +3,8 @@ from flask import g, jsonify, session -from api.builder.config import gtmp -from api.utils.token import decode_auth_header +from core.builder.config import gtmp +from core.utils.token import decode_auth_header session_keys = {"build": "cbuid"} diff --git a/next.config.js b/next.config.js index c4093b8..b7c6091 100644 --- a/next.config.js +++ b/next.config.js @@ -1,24 +1,15 @@ +const devMode = process.env.NODE_ENV === 'development'; + /** @type {import('next').NextConfig} */ const nextConfig = { reactStrictMode: true, - images: { - remotePatterns: [ - { - protocol: 'https', - hostname: 'avatars.githubusercontent.com', - port: '', - pathname: '/u/**' - } - ] - }, rewrites: async () => { return [ { - source: '/api/core/:path*', - destination: - process.env.NODE_ENV === 'development' - ? 'http://localhost:5328/api/:path*' - : '/api/' + source: devMode ? '/api/core/:path*' : '/api/:path*', + destination: devMode + ? 'http://localhost:5328/api/core/:path*' + : '/api/:path*' } ]; } diff --git a/package.json b/package.json index c5c9405..065a376 100644 --- a/package.json +++ b/package.json @@ -3,7 +3,7 @@ "version": "1.0.0-alpha.0", "private": true, "scripts": { - "flask-dev": "pip3 install --upgrade pip && pip3 install -r requirements.txt && python3 -m flask --debug --app api/index run -p 5328 ", + "flask-dev": "pip3 install --upgrade pip && pip3 install -r requirements.txt && python3 -m flask --debug --app api/core/index run -p 5328 ", "next-dev": "next dev", "dev": "concurrently \"yarn next-dev\" \"yarn flask-dev\"", "prebuild": "node -p \"'export const LIB_VERSION = ' + JSON.stringify(require('./package.json').version) + ';'\" > src/version.ts", @@ -24,6 +24,7 @@ "next-auth": "^4.24.3", "react": "^18.2.0", "react-dom": "^18.2.0", + "sharp": "^0.32.6", "swr": "^2.2.4", "uuid": "^9.0.1" }, diff --git a/prisma/migrations/20231030101152_init/migration.sql b/prisma/migrations/20231112103941_init/migration.sql similarity index 100% rename from prisma/migrations/20231030101152_init/migration.sql rename to prisma/migrations/20231112103941_init/migration.sql diff --git a/requirements.txt b/requirements.txt index 586907f..655c338 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,7 +1,4 @@ -Flask==2.2.2 -Werkzeug==2.2.2 -Flask-Cors===4.0.0 +Flask==3.0.0 python-dotenv===1.0.0 PyJWT===2.8.0 -Wand===0.6.11 clickgen===2.1.9 diff --git a/src/app/(home)/layout.tsx b/src/app/(home)/layout.tsx index 59c90cf..33cb113 100644 --- a/src/app/(home)/layout.tsx +++ b/src/app/(home)/layout.tsx @@ -17,9 +17,9 @@ export const metadata: Metadata = { manifest: '/favicon/site.webmanifest' }; -interface Props { +type Props = { children: React.ReactNode; -} +}; export default function RootLayout({ children }: Props) { return ( diff --git a/src/app/(home)/studio/page.tsx b/src/app/(home)/studio/page.tsx index ce3bd0d..7be7e93 100644 --- a/src/app/(home)/studio/page.tsx +++ b/src/app/(home)/studio/page.tsx @@ -4,7 +4,6 @@ import { useEffect, useState } from 'react'; import { useSession } from 'next-auth/react'; import { TYPES, PREBUILT_COLORS, SIZES } from '@root/configs'; -import { useSecureStorage as useStorage } from '@hooks/useSecureStorage'; import { TypePicker } from '@components/TypePicker'; import { SizePicker } from '@components/SizePicker'; @@ -17,11 +16,11 @@ import { genAccessToken } from '@utils/auth/token'; import { Image } from 'bibata/core-api/types'; export default function StudioPage() { - const [type, setType] = useStorage('type', TYPES[0]); - const [cursorSize, setCursorSize] = useStorage('cursorSize', SIZES[0]); + const [type, setType] = useState(TYPES[0]); + const [cursorSize, setCursorSize] = useState(SIZES[0]); - const [colorName, setColorName] = useStorage('colorName', 'Amber'); - const [color, setColor] = useStorage('color', PREBUILT_COLORS[colorName]); + const [colorName, setColorName] = useState('Amber'); + const [color, setColor] = useState(PREBUILT_COLORS[colorName]); // eslint-disable-next-line no-unused-vars const [animationDelay, setAnimationDelay] = useState(15); @@ -37,13 +36,17 @@ export default function StudioPage() { setImagesCount(0); }; + const refreshToken = () => { + if (session?.user) { + setToken(genAccessToken(session.user)); + } else { + setToken(genAccessToken()); + } + }; + useEffect(() => { if (status !== 'loading') { - if (session?.accessToken) { - setToken(session.accessToken); - } else { - setToken(genAccessToken()); - } + refreshToken(); } }, [status, update]); // eslint-disable-line react-hooks/exhaustive-deps @@ -55,6 +58,7 @@ export default function StudioPage() { onClick={(v) => { resetImages(); setType(v); + refreshToken(); }} /> @@ -62,7 +66,10 @@ export default function StudioPage() { setCursorSize(s)} + onClick={(s) => { + setCursorSize(s); + refreshToken(); + }} /> @@ -74,6 +81,7 @@ export default function StudioPage() { resetImages(); setColorName(n); setColor(c); + refreshToken(); }} /> diff --git a/src/app/api/auth/[...nextauth]/route.ts b/src/app/api/auth/[...nextauth]/route.ts index 80697a9..b0787f4 100644 --- a/src/app/api/auth/[...nextauth]/route.ts +++ b/src/app/api/auth/[...nextauth]/route.ts @@ -1,19 +1,59 @@ import NextAuth, { AuthOptions } from 'next-auth'; import GithubProvider from 'next-auth/providers/github'; +import CredentialsProvider from 'next-auth/providers/credentials'; import { upsertUser } from '@services/user'; import { isSponsor } from '@utils/sponsor/is-sponsor'; -import { genAccessToken } from '@utils/auth/token'; import { DB_SEEDS } from '@root/configs'; -import { Role } from '@prisma/client'; +import { Role, User } from '@prisma/client'; + +const PREVIEW = process.env.VERCEL_ENV === 'preview'; const authOptions: AuthOptions = { providers: [ - GithubProvider({ - clientId: process.env.GITHUB_ID, - clientSecret: process.env.GITHUB_SECRET - }) + PREVIEW + ? CredentialsProvider({ + name: 'Credentials', + credentials: { + username: { + label: 'Username', + type: 'text', + placeholder: 'abdullah' + }, + password: { + label: 'Password', + type: 'password' + } + }, + async authorize(cred) { + try { + const user: User = { + id: '12345-12345-12345-12345', + userId: '9919', + login: 'abdullah', + name: 'Abdullah', + email: 'abdullah@example.com', + url: 'https://github.com/github', + avatarUrl: 'https://picsum.photos/400/400', + totalDownloadCount: 5, + index: 1, + role: 'USER', + createdAt: new Date(), + updatedAt: new Date() + }; + + if (cred?.username === 'abdullah') user.role = 'PRO'; + return user; + } catch { + return null; + } + } + }) + : GithubProvider({ + clientId: process.env.GITHUB_ID, + clientSecret: process.env.GITHUB_SECRET + }) ], secret: process.env.NEXTAUTH_SECRET, pages: { @@ -37,16 +77,16 @@ const authOptions: AuthOptions = { totalDownloadCount: role === 'USER' ? DB_SEEDS.FRESH_SIGNUP_DOWNLOADS : null }; - token.user = await upsertUser(user); + + if (!PREVIEW) { + token.user = await upsertUser(user); + } } return token; }, async session({ session, token }) { - if (token.user) { - session.accessToken = genAccessToken(token.user); - } return Promise.resolve({ ...session, user: { ...token.user } }); } } diff --git a/src/app/api/config.ts b/src/app/api/config.ts index 4d4f8fd..5344435 100644 --- a/src/app/api/config.ts +++ b/src/app/api/config.ts @@ -1,6 +1,7 @@ import { NextResponse } from 'next/server'; export const RESPONSES = { + // Core API related common Responses unauth: NextResponse.json( { status: 401, error: 'Unauthorized' }, { status: 401 } @@ -16,5 +17,15 @@ export const RESPONSES = { invalid_method: NextResponse.json( { status: 405, error: 'Method not allowed' }, { status: 405 } + ), + + // App API related common Responses + image_not_found: NextResponse.json( + { error: 'Image not found' }, + { status: 404 } + ), + internal_error: NextResponse.json( + { error: 'Internal Error' }, + { status: 500 } ) }; diff --git a/src/app/api/svg/[id]/route.ts b/src/app/api/svg/[id]/route.ts index 5274519..14f0c86 100644 --- a/src/app/api/svg/[id]/route.ts +++ b/src/app/api/svg/[id]/route.ts @@ -1,62 +1,48 @@ import { NextRequest, NextResponse } from 'next/server'; -import { Redis } from 'ioredis'; +import redis from '@services/redis'; import { FetchSVG } from '@utils/figma/fetch-svgs'; import { RESPONSES as res } from '@api/config'; type Param = { params: { id: string } }; -const NOT_FOUND = NextResponse.json( - { error: 'Image not found' }, - { status: 404 } -); - export async function GET(request: NextRequest, { params }: Param) { if (request.method === 'GET') { const id = params.id; const p = request.nextUrl.searchParams; - let display = false; let color: { [key: string]: string } = {}; - let size: number = 0; - - if (p.has('display')) display = true; - - if (!display) { - if (p.has('size')) size = Number(p.get('size')) || 0; - } - if (p.has('color')) color = JSON.parse(p.get('color') || ''); - const options = { color, size, display }; + let size: number = 256; + if (p.has('size')) size = Number(p.get('size')) || size; if (id) { try { - const redis = new Redis({ connectTimeout: 10000 }); - const api = new FetchSVG(); - const raw = await redis.get(id); - redis.quit(); - if (!raw) return NOT_FOUND; + + if (!raw) return res.image_not_found; const urls: string[] = JSON.parse(raw); - if (!urls) return NOT_FOUND; + if (!urls) return res.image_not_found; const data: string[] = []; + const api = new FetchSVG(); for (const url of urls) { - const img = await api.generateImage(url, options); - data.push(img); + const img = await api.generateImage(url, { color, size }); + data.push(`data:image/png;base64,${img!.toString('base64')}`); } if (data) { return NextResponse.json({ data }); } else { - return NOT_FOUND; + return res.image_not_found; } } catch (e) { - return NextResponse.json({ error: JSON.stringify(e) }, { status: 500 }); + console.error(e); + return res.internal_error; } } else { return NextResponse.json({ error: 'SVG id not found' }, { status: 404 }); diff --git a/src/app/api/cron/svgs/route.ts b/src/app/api/svg/fetch/route.ts similarity index 61% rename from src/app/api/cron/svgs/route.ts rename to src/app/api/svg/fetch/route.ts index fd57f61..4285348 100644 --- a/src/app/api/cron/svgs/route.ts +++ b/src/app/api/svg/fetch/route.ts @@ -1,5 +1,6 @@ import { NextRequest, NextResponse } from 'next/server'; -import { Redis } from 'ioredis'; + +import redis from '@services/redis'; import { FetchSVG } from '@utils/figma/fetch-svgs'; @@ -8,11 +9,13 @@ import { ApiError } from 'figma-api/lib/utils'; export async function GET(request: NextRequest) { if ( - request.headers.get('Authorization') !== `Bearer ${process.env.CRON_SECRET}` + request.headers.get('Authorization') !== + `Bearer ${process.env.SVG_FETCH_SECRET}` ) { return NextResponse.json({ error: 'Unauthorized' }, { status: 401 }); } const response = await update(); + return NextResponse.json( { fetchAt: Date.now(), ...response }, { status: 200 } @@ -20,20 +23,22 @@ export async function GET(request: NextRequest) { } const update = async () => { - const redis = new Redis({ connectTimeout: 10000 }); const fetcher = new FetchSVG(); + // Deleting old images + const keys = await redis.keys('i-*'); + if (keys.length > 0) { + const n = await redis.del(...keys); + console.log(`Deleted ${n} URLs.`); + } + try { for (const type of TYPES) { const svgs = await fetcher.fetchSVGs({ type }); - redis - .set(type, JSON.stringify(svgs)) - .then((v) => console.info(`Updated Type '${type}': ${v} `)) - .catch((e) => { - console.error(e); - redis.quit(); - return { error: JSON.stringify(e) }; - }); + await redis.del(type); + + const v = await redis.set(type, JSON.stringify(svgs)); + console.info(`Updated Type '${type}': ${v} `); let all_node_ids: string[] = []; for (let { node_ids } of svgs) { @@ -42,29 +47,22 @@ const update = async () => { const images = await fetcher.getSvgUrl(all_node_ids.join(',')); if (images) { - svgs.forEach(({ id, name, node_ids }) => { + for (let { id, name, node_ids } of svgs) { const urls = node_ids.map((nid) => images[nid]); if (urls) { - redis - .set(id, JSON.stringify(urls)) - .then((v) => console.info(`Updated '${name}': ${v} `)) - .catch((e) => { - console.error(e); - redis.quit(); - return { error: JSON.stringify(e) }; - }); + const v2 = await redis.set(id, JSON.stringify(urls)); + console.info(`Updated '${name}': ${v2} `); } else { - const error = `[Figma API] Unable to fetch '${name}' locations.`; - console.error(error); - return { error }; + return { + error: `[Figma API] Unable to fetch '${name}' locations.` + }; } - }); + } } else { return { error: `[Figma API] Unable to fetch '${type}' locations.` }; } } - redis.quit(); return; } catch (_e) { // @ts-ignore diff --git a/src/app/api/svg/route.ts b/src/app/api/svg/route.ts index 7534a29..03f6069 100644 --- a/src/app/api/svg/route.ts +++ b/src/app/api/svg/route.ts @@ -1,8 +1,10 @@ import { NextRequest, NextResponse } from 'next/server'; -import { Redis } from 'ioredis'; -import { RESPONSES as res } from '@api/config'; +import redis from '@services/redis'; + import { TYPES } from '@root/configs'; +import { RESPONSES as res } from '@api/config'; + import { SVG } from 'bibata/app'; export async function GET(request: NextRequest) { @@ -11,18 +13,21 @@ export async function GET(request: NextRequest) { if (type) { if (TYPES.includes(type)) { - const redis = new Redis({ connectTimeout: 10000 }); - const data: SVG[] = await redis - .get(type) - .then((s) => JSON.parse(s || '[]')); - redis.quit(); + try { + const data: SVG[] = await redis + .get(type) + .then((s) => JSON.parse(s || '[]')); - const error = data.length === 0 ? 'Unable to fetch SVG nodes' : null; + const error = data.length === 0 ? 'Unable to fetch SVG nodes' : null; - return NextResponse.json( - { error, data }, - { status: error ? 404 : 200 } - ); + return NextResponse.json( + { error, data }, + { status: error ? 404 : 200 } + ); + } catch (e) { + console.error(e); + return res.internal_error; + } } else { return NextResponse.json( { error: `No images found for '${type}'` }, diff --git a/src/components/ColorPicker/index.tsx b/src/components/ColorPicker/index.tsx index e43d8e9..be7504d 100644 --- a/src/components/ColorPicker/index.tsx +++ b/src/components/ColorPicker/index.tsx @@ -23,7 +23,7 @@ export const ColorPickerButton: React.FC = (props) => { return ( ); }; @@ -70,7 +73,7 @@ export const ColorPicker: React.FC = (props) => { return ( <>
-
+
{Object.entries(props.colors).map(([name, color], i) => ( = (props) => { return (
{props.title}
-
{props.children}
+
{props.children}
{ @@ -89,13 +89,13 @@ export const ColorPickerModal: React.FC = (props) => {
@@ -107,7 +107,7 @@ export const ColorPickerModal: React.FC = (props) => { watch={watchColor} />
-
+
= (props) => {
diff --git a/src/components/Cursors/card.tsx b/src/components/Cursors/card.tsx index 294e2eb..f1478df 100644 --- a/src/components/Cursors/card.tsx +++ b/src/components/Cursors/card.tsx @@ -52,7 +52,7 @@ export const CursorCard: React.FC = (props) => { const fetchSvg = async () => { try { - const url = `/api/svg/${props.svg.id}?color=${c}&display`; + const url = `/api/svg/${props.svg.id}?color=${c}`; let res = await fetch(url, { next: { revalidate: 360 } }); const json = await res.json(); @@ -89,48 +89,42 @@ export const CursorCard: React.FC = (props) => { }, [props.svg, loading, index, props.delay]); // eslint-disable-line react-hooks/exhaustive-deps useEffect(() => { - if (props.onLoad && !loading && frames) { - const codes: string[] = []; - - frames.forEach((f) => { - codes.push( - f.replace('width="100%" height="100%"', 'width="256" height="256"') - ); - }); - - if (codes.length > 0) { - props.onLoad({ name: props.svg.name, frames: codes }); - } + if (props.onLoad && !loading && frames.length > 0) { + props.onLoad({ name: props.svg.name, frames }); } }, [loading, frames]); // eslint-disable-line react-hooks/exhaustive-deps return ( -
-
- {!loading ? ( -
- {frames.length > 0 ? ( -
- ) : ( -
- )} -
- -
-

{props.svg.name}

+
+
+
+ {!loading ? ( +
+ {frames.length > 0 ? ( + + ) : ( + + )} +
+ ) : ( +
+ )} +
+ +
+

{props.svg.name}

+
); diff --git a/src/components/Cursors/index.tsx b/src/components/Cursors/index.tsx index 6ee5347..dcad0ea 100644 --- a/src/components/Cursors/index.tsx +++ b/src/components/Cursors/index.tsx @@ -52,8 +52,8 @@ export const Cursors: React.FC = (props) => { const svgs = res.data as SVG[]; return ( -
-
+
+
{svgs.map((e) => ( = (_props) => { const cards = Array.from(new Array(12), (_, i) => i + 1); return ( -
-
+
+
{cards.map((key) => ( -
-
-
+
+
+
+
+
))}
diff --git a/src/components/DownloadButton/Error.tsx b/src/components/DownloadButton/Error.tsx new file mode 100644 index 0000000..5a84c46 --- /dev/null +++ b/src/components/DownloadButton/Error.tsx @@ -0,0 +1,55 @@ +'use client'; + +export type ErrorLogs = { + text: string; + [k: string]: any; +}; + +import React from 'react'; +import Link from 'next/link'; + +import { bugReportTemplate } from '@utils/bug-report'; + +import { ErrorSVG } from './svgs'; + +import { BUG_REPORT_ENDPOINT } from '@root/configs'; + +type Props = { + logs: ErrorLogs; + onClick: () => void; +}; + +export const DownloadError: React.FC = (props) => { + return ( + <> + {props.logs.text && ( + <> +
+
+ +
+

{props.logs.text}

+
+ +
+ + Report Bug + + +
+ + )} + + ); +}; diff --git a/src/components/DownloadButton/Sponsor.tsx b/src/components/DownloadButton/Sponsor.tsx index 2e37052..872111c 100644 --- a/src/components/DownloadButton/Sponsor.tsx +++ b/src/components/DownloadButton/Sponsor.tsx @@ -2,7 +2,6 @@ import React from 'react'; import Link from 'next/link'; -import Image from 'next/legacy/image'; import useSWR from 'swr'; import Tooltip from '@components/Tooltip'; @@ -48,7 +47,7 @@ export const DownloadSponsor: React.FC = (props) => {
- = (props) => { const [lock, setLock] = useState(false); const [loadingText, setLoadingText] = useState('Preparing...'); - const [errorText, setErrorText] = useState(''); - const [errorLogs, setErrorLogs] = useState(null); + const [errorLogs, setErrorLogs] = useState({ text: '' }); const [showDropdown, setShowDropdown] = useState(false); const buttonRef = useRef(null); const dropdownRef = useRef(null); - const print_error = async (e: any) => { + const printError = async (e: any) => { if (process.env.NODE_ENV === 'development') console.error(e); }; + const updateErrorLogs = async (opt: { + text: string; + key: string; + error: any; + }) => { + setErrorLogs({ + ...errorLogs, + id: api.jwt?.id, + role: api.jwt?.role, + text: opt.text, + [opt.key]: opt.error + }); + }; + const processImages = async (imgs: Image[], options: ProcessOptions) => { for (const i of imgs) { setLoadingText(`Processing '${i.name}' ...`); @@ -75,6 +85,11 @@ export const DownloadButton: React.FC = (props) => { const upload = await api.uploadImages(formData); if (upload?.error) { + updateErrorLogs({ + key: 'upload', + error: upload.error, + text: 'Oops.. Processing Falied! Try Again.' + }); return upload; } } @@ -86,7 +101,7 @@ export const DownloadButton: React.FC = (props) => { document.body.appendChild(link); link.click(); link.parentNode?.removeChild(link); - setErrorText(''); + setErrorLogs({ text: '' }); }; const storeToDB = async (platform: string) => { @@ -107,20 +122,25 @@ export const DownloadButton: React.FC = (props) => { }) }); } catch (e) { - setErrorLogs(e); - print_error(e); + updateErrorLogs({ + key: 'count', + error: e, + text: 'Unexpected Internal Error.' + }); + printError(e); } }; const handleDownload = async (platform: Platform) => { setLoading(true); setLock(true); - setErrorLogs(null); - api.refreshSession(tokenRef.current); + setErrorLogs({ text: '' }); + + await api.refreshSession(tokenRef.current); const { count, total } = await getDownloadCounts(api.jwt?.token); if ((total && count >= total) || (count === 0 && total === 0)) { - setErrorText('Download Limit Exceeded.'); + setErrorLogs({ text: 'Download Limit Exceeded.' }); } else { const downloadUrl = api.downloadUrl(platform, name); @@ -137,21 +157,24 @@ export const DownloadButton: React.FC = (props) => { }); if (upload?.error) { - print_error(upload.error); - setErrorLogs(upload.error); - setErrorText('Oops.. Processing Falied! Try Again.'); + printError(upload.error); await api.refreshSession(); } else { setLoadingText( - `Packaging ${platform == 'win' ? 'Win Cursors' : 'XCursors'} ...` + `Packaging ${platform === 'win' ? 'Win Cursors' : 'XCursors'} ...` ); const download = await api.downloadable(platform, name); if (download?.error) { - print_error(download.error); - setErrorLogs(download.error); - setErrorText('Oops.. Packaging Failed! Try Again.'); + printError(download.error); + + updateErrorLogs({ + key: 'download', + error: download.error, + text: 'Oops.. Packaging Failed! Try Again.' + }); + await api.refreshSession(); } else { await storeToDB(platform); @@ -185,12 +208,13 @@ export const DownloadButton: React.FC = (props) => { }, []); useEffect(() => { - if (!lock) { - api.deleteSession(); - configRef.current = props.config; + if (lock === false) { tokenRef.current = props.token; + configRef.current = props.config; + + api.deleteSession(); } - }, [lock, props.token]); // eslint-disable-line react-hooks/exhaustive-deps + }, [lock, props.disabled, props.token]); // eslint-disable-line react-hooks/exhaustive-deps const busy = loading || props.disabled; @@ -199,7 +223,7 @@ export const DownloadButton: React.FC = (props) => {
) : ( <> @@ -36,11 +37,11 @@ export const Profile: React.FC = (props) => {
- {user?.login!}
diff --git a/src/components/NavBar/profile/svgs/github.tsx b/src/components/NavBar/profile/svgs/github.tsx new file mode 100644 index 0000000..00f5d89 --- /dev/null +++ b/src/components/NavBar/profile/svgs/github.tsx @@ -0,0 +1,19 @@ +'use client'; + +import React from 'react'; + +type Props = {}; + +// eslint-disable-next-line no-unused-vars +export const GitHubLogo: React.FC = (_props) => { + return ( + + + + ); +}; diff --git a/src/components/NavBar/profile/svgs/index.ts b/src/components/NavBar/profile/svgs/index.ts index 0025707..61da7c2 100644 --- a/src/components/NavBar/profile/svgs/index.ts +++ b/src/components/NavBar/profile/svgs/index.ts @@ -1,3 +1,5 @@ +import { GitHubLogo } from './github'; import { LogoutSVG } from './logout'; -export { LogoutSVG }; +export { GitHubLogo, LogoutSVG }; + diff --git a/src/components/NavBar/svgs/bibata.tsx b/src/components/NavBar/svgs/bibata.tsx new file mode 100644 index 0000000..6dd9609 --- /dev/null +++ b/src/components/NavBar/svgs/bibata.tsx @@ -0,0 +1,64 @@ +'use client'; + +import React from 'react'; + +type Props = {}; + +// eslint-disable-next-line no-unused-vars +export const BibataLogo: React.FC = (_props) => { + return ( + + + + + + + + + + + + + + + + + + + ); +}; diff --git a/src/components/NavBar/svgs/index.ts b/src/components/NavBar/svgs/index.ts index dc24ad5..cccfcb8 100644 --- a/src/components/NavBar/svgs/index.ts +++ b/src/components/NavBar/svgs/index.ts @@ -1,4 +1,4 @@ +import { BibataLogo } from './bibata'; import { ProBadge } from './pro'; -export { ProBadge }; - +export { BibataLogo, ProBadge }; diff --git a/src/services/redis.ts b/src/services/redis.ts new file mode 100644 index 0000000..c2c4ca3 --- /dev/null +++ b/src/services/redis.ts @@ -0,0 +1,6 @@ +import Redis from 'ioredis'; + +const client = new Redis(); + +export default client; + diff --git a/src/types/env.d.ts b/src/types/env.d.ts index 7151f13..c51dc1e 100644 --- a/src/types/env.d.ts +++ b/src/types/env.d.ts @@ -1,9 +1,13 @@ namespace NodeJS { interface ProcessEnv { + readonly VERCEL_ENV: 'preview' | 'development' | 'production'; + readonly NEXT_PUBLIC_VERCEL_URL: string; + + readonly NEXT_PUBLIC_JWT_SECRET: string; + readonly NEXTAUTH_SECRET: string; readonly FLASK_SECRET: string; readonly CRON_SECRET: string; - readonly NEXT_PUBLIC_JWT_SECRET: string; readonly GITHUB_ID: string; readonly GITHUB_SECRET: string; diff --git a/src/types/next-auth.d.ts b/src/types/next-auth.d.ts index 29beb99..c1e6393 100644 --- a/src/types/next-auth.d.ts +++ b/src/types/next-auth.d.ts @@ -1,7 +1,7 @@ -import { UserRole, DBUser } from 'bibata/misc'; - import NextAuth from 'next-auth'; +import { User as PrismaUser } from '@prisma/client'; + declare module 'next-auth' { interface Profile extends Profile { id: number; @@ -50,16 +50,15 @@ declare module 'next-auth' { }; } - interface User extends DBUser {} + interface User extends PrismaUser {} interface Session extends Session { - accessToken?: string; - user?: DBUser; + user?: PrismaUser; } } declare module 'next-auth/jwt' { interface JWT extends JWT { - user?: DBUser; + user?: PrismaUser; } } diff --git a/src/utils/figma/fetch-svgs.ts b/src/utils/figma/fetch-svgs.ts index 06a67ff..853418d 100644 --- a/src/utils/figma/fetch-svgs.ts +++ b/src/utils/figma/fetch-svgs.ts @@ -1,6 +1,8 @@ import { v4 } from 'uuid'; import * as Figma from 'figma-api'; +import sharp from 'sharp'; + import { SVG } from 'bibata/app'; export type FetchImageOptions = { @@ -8,7 +10,6 @@ export type FetchImageOptions = { [key: string]: string; }; size: number; - display: boolean; }; export class FetchSVG { @@ -29,7 +30,7 @@ export class FetchSVG { const entries: Figma.Node[] = []; - const groups = [type, 'Shared', 'Watch']; + const groups = [type, 'Shared', 'Wait']; page.children.forEach((e) => { if (e.type === 'GROUP' && groups.includes(e.name)) { @@ -46,7 +47,7 @@ export class FetchSVG { if (!node) { const id = v4(); - node = { id, name, node_ids: [], isAnimated: false }; + node = { id: `i-${id}`, name, node_ids: [], isAnimated: false }; svgs.push(node); } @@ -75,7 +76,7 @@ export class FetchSVG { } public async generateImage(url: string, options: FetchImageOptions) { - const { color, size, display } = options; + const { color, size } = options; let img = ''; @@ -90,20 +91,13 @@ export class FetchSVG { }); } - if (display) { - img = img.replace( - 'width="256" height="256"', - 'width="100%" height="100%"' - // `preserveAspectRatio="xMaxYMid meet" width="100%" height="100%"` - ); - } else if (size !== 0) { - img = img.replace( - 'width="256" height="256"', - `preserveAspectRatio="xMaxYMid meet" width="${size}" height="${size}"` - ); - } + return await sharp(Buffer.from(img)) + .resize(size, size) + .png() + .toBuffer() + .catch((e) => { + console.error(e); + }); } - - return img; } } diff --git a/vercel.json b/vercel.json index 311847d..3462b42 100644 --- a/vercel.json +++ b/vercel.json @@ -1,2 +1,8 @@ -{} - +{ + "routes": [ + { + "src": "/api/core/(.*)", + "dest": "/api/core/index.py" + } + ] +} diff --git a/yarn.lock b/yarn.lock index 71c64d2..4a4d700 100644 --- a/yarn.lock +++ b/yarn.lock @@ -107,62 +107,62 @@ "@jridgewell/resolve-uri" "^3.1.0" "@jridgewell/sourcemap-codec" "^1.4.14" -"@next/env@14.0.1": - version "14.0.1" - resolved "https://registry.yarnpkg.com/@next/env/-/env-14.0.1.tgz#7d03c9042c205a320aef2ea3f83c2d16b6825563" - integrity sha512-Ms8ZswqY65/YfcjrlcIwMPD7Rg/dVjdLapMcSHG26W6O67EJDF435ShW4H4LXi1xKO1oRc97tLXUpx8jpLe86A== +"@next/env@14.0.2": + version "14.0.2" + resolved "https://registry.yarnpkg.com/@next/env/-/env-14.0.2.tgz#c1fb535983bca768e7eccd7b9cf4636127fc6d25" + integrity sha512-HAW1sljizEaduEOes/m84oUqeIDAUYBR1CDwu2tobNlNDFP3cSm9d6QsOsGeNlIppU1p/p1+bWbYCbvwjFiceA== -"@next/eslint-plugin-next@14.0.1", "@next/eslint-plugin-next@^14.0.1": - version "14.0.1" - resolved "https://registry.yarnpkg.com/@next/eslint-plugin-next/-/eslint-plugin-next-14.0.1.tgz#6e587b76588a02d77267945b5d1f059a6c8fd9ca" - integrity sha512-bLjJMwXdzvhnQOnxvHoTTUh/+PYk6FF/DCgHi4BXwXCINer+o1ZYfL9aVeezj/oI7wqGJOqwGIXrlBvPbAId3w== +"@next/eslint-plugin-next@14.0.2", "@next/eslint-plugin-next@^14.0.1": + version "14.0.2" + resolved "https://registry.yarnpkg.com/@next/eslint-plugin-next/-/eslint-plugin-next-14.0.2.tgz#421799f46116d8032f1739ce5ce89822453c8f03" + integrity sha512-APrYFsXfAhnysycqxHcpg6Y4i7Ukp30GzVSZQRKT3OczbzkqGjt33vNhScmgoOXYBU1CfkwgtXmNxdiwv1jKmg== dependencies: glob "7.1.7" -"@next/swc-darwin-arm64@14.0.1": - version "14.0.1" - resolved "https://registry.yarnpkg.com/@next/swc-darwin-arm64/-/swc-darwin-arm64-14.0.1.tgz#75a5f872c4077ecd536d7496bc24f3d312d5dcd0" - integrity sha512-JyxnGCS4qT67hdOKQ0CkgFTp+PXub5W1wsGvIq98TNbF3YEIN7iDekYhYsZzc8Ov0pWEsghQt+tANdidITCLaw== - -"@next/swc-darwin-x64@14.0.1": - version "14.0.1" - resolved "https://registry.yarnpkg.com/@next/swc-darwin-x64/-/swc-darwin-x64-14.0.1.tgz#7d8498fc680cc8b4d5181bee336818c63779bc5e" - integrity sha512-625Z7bb5AyIzswF9hvfZWa+HTwFZw+Jn3lOBNZB87lUS0iuCYDHqk3ujuHCkiyPtSC0xFBtYDLcrZ11mF/ap3w== - -"@next/swc-linux-arm64-gnu@14.0.1": - version "14.0.1" - resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-14.0.1.tgz#184286794e67bed192de7dbb10d7f040c996f965" - integrity sha512-iVpn3KG3DprFXzVHM09kvb//4CNNXBQ9NB/pTm8LO+vnnnaObnzFdS5KM+w1okwa32xH0g8EvZIhoB3fI3mS1g== - -"@next/swc-linux-arm64-musl@14.0.1": - version "14.0.1" - resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-14.0.1.tgz#e8121b860ebc97a8d2a9113e5a42878430e749d5" - integrity sha512-mVsGyMxTLWZXyD5sen6kGOTYVOO67lZjLApIj/JsTEEohDDt1im2nkspzfV5MvhfS7diDw6Rp/xvAQaWZTv1Ww== - -"@next/swc-linux-x64-gnu@14.0.1": - version "14.0.1" - resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-14.0.1.tgz#cdc4276b11a10c892fd1cb7dd31e024064db9c3b" - integrity sha512-wMqf90uDWN001NqCM/auRl3+qVVeKfjJdT9XW+RMIOf+rhUzadmYJu++tp2y+hUbb6GTRhT+VjQzcgg/QTD9NQ== - -"@next/swc-linux-x64-musl@14.0.1": - version "14.0.1" - resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-14.0.1.tgz#4a194a484ceb34fd370e8d1af571493859fb2542" - integrity sha512-ol1X1e24w4j4QwdeNjfX0f+Nza25n+ymY0T2frTyalVczUmzkVD7QGgPTZMHfR1aLrO69hBs0G3QBYaj22J5GQ== - -"@next/swc-win32-arm64-msvc@14.0.1": - version "14.0.1" - resolved "https://registry.yarnpkg.com/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-14.0.1.tgz#71923debee50f98ef166b28cdb3ad7e7463e6598" - integrity sha512-WEmTEeWs6yRUEnUlahTgvZteh5RJc4sEjCQIodJlZZ5/VJwVP8p2L7l6VhzQhT4h7KvLx/Ed4UViBdne6zpIsw== - -"@next/swc-win32-ia32-msvc@14.0.1": - version "14.0.1" - resolved "https://registry.yarnpkg.com/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-14.0.1.tgz#b8f46da899c279fd65db76f0951849290c480ef9" - integrity sha512-oFpHphN4ygAgZUKjzga7SoH2VGbEJXZa/KL8bHCAwCjDWle6R1SpiGOdUdA8EJ9YsG1TYWpzY6FTbUA+iAJeww== - -"@next/swc-win32-x64-msvc@14.0.1": - version "14.0.1" - resolved "https://registry.yarnpkg.com/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-14.0.1.tgz#be3dd8b3729ec51c99ff04b51e2b235756d02b6e" - integrity sha512-FFp3nOJ/5qSpeWT0BZQ+YE1pSMk4IMpkME/1DwKBwhg4mJLB9L+6EXuJi4JEwaJdl5iN+UUlmUD3IsR1kx5fAg== +"@next/swc-darwin-arm64@14.0.2": + version "14.0.2" + resolved "https://registry.yarnpkg.com/@next/swc-darwin-arm64/-/swc-darwin-arm64-14.0.2.tgz#eba35a1425fee5d305903c85ae0d6d2b0d512c7b" + integrity sha512-i+jQY0fOb8L5gvGvojWyZMfQoQtDVB2kYe7fufOEiST6sicvzI2W5/EXo4lX5bLUjapHKe+nFxuVv7BA+Pd7LQ== + +"@next/swc-darwin-x64@14.0.2": + version "14.0.2" + resolved "https://registry.yarnpkg.com/@next/swc-darwin-x64/-/swc-darwin-x64-14.0.2.tgz#8adb4dfc3d596c0816da67df9b75603218cf2a42" + integrity sha512-zRCAO0d2hW6gBEa4wJaLn+gY8qtIqD3gYd9NjruuN98OCI6YyelmhWVVLlREjS7RYrm9OUQIp/iVJFeB6kP1hg== + +"@next/swc-linux-arm64-gnu@14.0.2": + version "14.0.2" + resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-14.0.2.tgz#1f88d066d44c9229a861815e3d449b0037dae14e" + integrity sha512-tSJmiaon8YaKsVhi7GgRizZoV0N1Sx5+i+hFTrCKKQN7s3tuqW0Rov+RYdPhAv/pJl4qiG+XfSX4eJXqpNg3dA== + +"@next/swc-linux-arm64-musl@14.0.2": + version "14.0.2" + resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-14.0.2.tgz#de9b2708abc35dd19429a662a11785d0c54d1ec7" + integrity sha512-dXJLMSEOwqJKcag1BeX1C+ekdPPJ9yXbWIt3nAadhbLx5CjACoB2NQj9Xcqu2tmdr5L6m34fR+fjGPs+ZVPLzA== + +"@next/swc-linux-x64-gnu@14.0.2": + version "14.0.2" + resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-14.0.2.tgz#64bd555dcbc7fd6c38cb86028baf7d7fc80bd4ac" + integrity sha512-WC9KAPSowj6as76P3vf1J3mf2QTm3Wv3FBzQi7UJ+dxWjK3MhHVWsWUo24AnmHx9qDcEtHM58okgZkXVqeLB+Q== + +"@next/swc-linux-x64-musl@14.0.2": + version "14.0.2" + resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-14.0.2.tgz#69e6abf0f516df69acbf663eeb8ed6fd8eebcc38" + integrity sha512-KSSAwvUcjtdZY4zJFa2f5VNJIwuEVnOSlqYqbQIawREJA+gUI6egeiRu290pXioQXnQHYYdXmnVNZ4M+VMB7KQ== + +"@next/swc-win32-arm64-msvc@14.0.2": + version "14.0.2" + resolved "https://registry.yarnpkg.com/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-14.0.2.tgz#82bc49af0986f4b2c113b5f223a559fc51b49b9d" + integrity sha512-2/O0F1SqJ0bD3zqNuYge0ok7OEWCQwk55RPheDYD0va5ij7kYwrFkq5ycCRN0TLjLfxSF6xI5NM6nC5ux7svEQ== + +"@next/swc-win32-ia32-msvc@14.0.2": + version "14.0.2" + resolved "https://registry.yarnpkg.com/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-14.0.2.tgz#2f1958ad82b7f7ec5da8ad8ac2f18ef7a8e7757f" + integrity sha512-vJI/x70Id0oN4Bq/R6byBqV1/NS5Dl31zC+lowO8SDu1fHmUxoAdILZR5X/sKbiJpuvKcCrwbYgJU8FF/Gh50Q== + +"@next/swc-win32-x64-msvc@14.0.2": + version "14.0.2" + resolved "https://registry.yarnpkg.com/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-14.0.2.tgz#629174f587beb640a431a4a3fe4e26d5d4f8de52" + integrity sha512-Ut4LXIUvC5m8pHTe2j0vq/YDnTEyq6RSR9vHYPqnELrDapPhLNz9Od/L5Ow3J8RNDWpEnfCiQXuVdfjlNEJ7ug== "@nodelib/fs.scandir@2.1.5": version "2.1.5" @@ -232,9 +232,9 @@ "@types/node" "*" "@types/node@*", "@types/node@^20.7.1": - version "20.8.10" - resolved "https://registry.yarnpkg.com/@types/node/-/node-20.8.10.tgz#a5448b895c753ae929c26ce85cab557c6d4a365e" - integrity sha512-TlgT8JntpcbmKUFzjhsyhGfP2fsiz1Mv56im6enJ905xG1DAYesxJaeSbGqQmAw8OWPdhyJGhGSQGKRNJ45u9w== + version "20.9.0" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.9.0.tgz#bfcdc230583aeb891cf51e73cfdaacdd8deae298" + integrity sha512-nekiGu2NDb1BcVofVcEKMIwzlx4NjHlcjhoxxKBNLtz15Y1z7MYf549DFvkHSId02Ax6kGwWntIBPC3l/JZcmw== dependencies: undici-types "~5.26.4" @@ -244,35 +244,35 @@ integrity sha512-5tabW/i+9mhrfEOUcLDu2xBPsHJ+X5Orqy9FKpale3SjDA17j5AEpYq5vfy3oAeAHGcvANRCO3NV3d2D6q3NiA== "@types/prop-types@*": - version "15.7.9" - resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.9.tgz#b6f785caa7ea1fe4414d9df42ee0ab67f23d8a6d" - integrity sha512-n1yyPsugYNSmHgxDFjicaI2+gCNjsBck8UX9kuofAKlc0h1bL+20oSF72KeNaW2DUlesbEVCFgyV2dPGTiY42g== + version "15.7.10" + resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.10.tgz#892afc9332c4d62a5ea7e897fe48ed2085bbb08a" + integrity sha512-mxSnDQxPqsZxmeShFH+uwQ4kO4gcJcGahjjMFeLbKE95IAZiiZyiEepGZjtXJ7hN/yfu0bu9xN2ajcU0JcxX6A== "@types/react-dom@^18.2.8": - version "18.2.14" - resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-18.2.14.tgz#c01ba40e5bb57fc1dc41569bb3ccdb19eab1c539" - integrity sha512-V835xgdSVmyQmI1KLV2BEIUgqEuinxp9O4G6g3FqO/SqLac049E53aysv0oEFD2kHfejeKU+ZqL2bcFWj9gLAQ== + version "18.2.15" + resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-18.2.15.tgz#921af67f9ee023ac37ea84b1bc0cc40b898ea522" + integrity sha512-HWMdW+7r7MR5+PZqJF6YFNSCtjz1T0dsvo/f1BV6HkV+6erD/nA7wd9NM00KVG83zf2nJ7uATPO9ttdIPvi3gg== dependencies: "@types/react" "*" "@types/react@*", "@types/react@^18.2.23": - version "18.2.36" - resolved "https://registry.yarnpkg.com/@types/react/-/react-18.2.36.tgz#bc68ffb4408e5d0c419b0760b2eaeec70aeeedb3" - integrity sha512-o9XFsHYLLZ4+sb9CWUYwHqFVoG61SesydF353vFMMsQziiyRu8np4n2OYMUSDZ8XuImxDr9c5tR7gidlH29Vnw== + version "18.2.37" + resolved "https://registry.yarnpkg.com/@types/react/-/react-18.2.37.tgz#0f03af69e463c0f19a356c2660dbca5d19c44cae" + integrity sha512-RGAYMi2bhRgEXT3f4B92WTohopH6bIXw05FuGlmJEnv/omEn190+QYEIYxIAuIBdKgboYYdVved2p1AxZVQnaw== dependencies: "@types/prop-types" "*" "@types/scheduler" "*" csstype "^3.0.2" "@types/scheduler@*": - version "0.16.5" - resolved "https://registry.yarnpkg.com/@types/scheduler/-/scheduler-0.16.5.tgz#4751153abbf8d6199babb345a52e1eb4167d64af" - integrity sha512-s/FPdYRmZR8SjLWGMCuax7r3qCWQw9QKHzXVukAuuIJkXkDRwp+Pu5LMIVFi0Fxbav35WURicYr8u1QsoybnQw== + version "0.16.6" + resolved "https://registry.yarnpkg.com/@types/scheduler/-/scheduler-0.16.6.tgz#eb26db6780c513de59bee0b869ef289ad3068711" + integrity sha512-Vlktnchmkylvc9SnwwwozTv04L/e1NykF5vgoQ0XTmI8DD+wxfjQuHuvHS3p0r2jz2x2ghPs2h1FVeDirIteWA== "@types/uuid@^9.0.6": - version "9.0.6" - resolved "https://registry.yarnpkg.com/@types/uuid/-/uuid-9.0.6.tgz#c91ae743d8344a54b2b0c691195f5ff5265f6dfb" - integrity sha512-BT2Krtx4xaO6iwzwMFUYvWBWkV2pr37zD68Vmp1CDV196MzczBRxuEpD6Pr395HAgebC/co7hOphs53r8V7jew== + version "9.0.7" + resolved "https://registry.yarnpkg.com/@types/uuid/-/uuid-9.0.7.tgz#b14cebc75455eeeb160d5fe23c2fcc0c64f724d8" + integrity sha512-WUtIVRUZ9i5dYXefDEAI7sh9/O7jGvHg7Df/5O/gtH3Yabe5odI3UWopVR1qbPXQtvOxWu3mM4XxlYeZtMWF4g== "@typescript-eslint/parser@^5.4.2 || ^6.0.0": version "6.10.0" @@ -526,16 +526,35 @@ axobject-query@^3.2.1: dependencies: dequal "^2.0.3" +b4a@^1.6.4: + version "1.6.4" + resolved "https://registry.yarnpkg.com/b4a/-/b4a-1.6.4.tgz#ef1c1422cae5ce6535ec191baeed7567443f36c9" + integrity sha512-fpWrvyVHEKyeEvbKZTVOeZF3VSKKWtJxFIxX/jaVPf+cLbGUSitjb49pHLqPV2BUNNZ0LcoeEGfE/YCpyDYHIw== + balanced-match@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== +base64-js@^1.3.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" + integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== + 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== +bl@^4.0.3: + version "4.1.0" + resolved "https://registry.yarnpkg.com/bl/-/bl-4.1.0.tgz#451535264182bec2fbbc83a62ab98cf11d9f7b3a" + integrity sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w== + dependencies: + buffer "^5.5.0" + inherits "^2.0.4" + readable-stream "^3.4.0" + brace-expansion@^1.1.7: version "1.1.11" resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" @@ -566,6 +585,14 @@ buffer-equal-constant-time@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.5.0: + version "5.7.1" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" + integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== + dependencies: + base64-js "^1.3.1" + ieee754 "^1.1.13" + busboy@1.6.0: version "1.6.0" resolved "https://registry.yarnpkg.com/busboy/-/busboy-1.6.0.tgz#966ea36a9502e43cdb9146962523b92f531f6893" @@ -620,6 +647,11 @@ chokidar@^3.5.3: optionalDependencies: fsevents "~2.3.2" +chownr@^1.1.1: + version "1.1.4" + resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b" + integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg== + client-only@0.0.1, client-only@^0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/client-only/-/client-only-0.0.1.tgz#38bba5d403c41ab150bff64a95c85013cf73bca1" @@ -646,11 +678,27 @@ color-convert@^2.0.1: dependencies: color-name "~1.1.4" -color-name@~1.1.4: +color-name@^1.0.0, color-name@~1.1.4: version "1.1.4" resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== +color-string@^1.9.0: + version "1.9.1" + resolved "https://registry.yarnpkg.com/color-string/-/color-string-1.9.1.tgz#4467f9146f036f855b764dfb5bf8582bf342c7a4" + integrity sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg== + dependencies: + color-name "^1.0.0" + simple-swizzle "^0.2.2" + +color@^4.2.3: + version "4.2.3" + resolved "https://registry.yarnpkg.com/color/-/color-4.2.3.tgz#d781ecb5e57224ee43ea9627560107c0e0c6463a" + integrity sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A== + dependencies: + color-convert "^2.0.1" + color-string "^1.9.0" + commander@^4.0.0: version "4.1.1" resolved "https://registry.yarnpkg.com/commander/-/commander-4.1.1.tgz#9fd602bd936294e9e9ef46a3f4d6964044b18068" @@ -726,6 +774,18 @@ debug@^4.1.1, debug@^4.3.2, debug@^4.3.4: dependencies: ms "2.1.2" +decompress-response@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-6.0.0.tgz#ca387612ddb7e104bd16d85aab00d5ecf09c66fc" + integrity sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ== + dependencies: + mimic-response "^3.1.0" + +deep-extend@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" + integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== + deep-is@^0.1.3: version "0.1.4" resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" @@ -759,6 +819,11 @@ dequal@^2.0.3: resolved "https://registry.yarnpkg.com/dequal/-/dequal-2.0.3.tgz#2644214f1997d39ed0ee0ece72335490a7ac67be" integrity sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA== +detect-libc@^2.0.0, detect-libc@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-2.0.2.tgz#8ccf2ba9315350e1241b88d0ac3b0e1fbd99605d" + integrity sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw== + didyoumean@^1.2.2: version "1.2.2" resolved "https://registry.yarnpkg.com/didyoumean/-/didyoumean-1.2.2.tgz#989346ffe9e839b4555ecf5666edea0d3e8ad037" @@ -798,9 +863,9 @@ ecdsa-sig-formatter@1.0.11: safe-buffer "^5.0.1" electron-to-chromium@^1.4.535: - version "1.4.576" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.576.tgz#0c6940fdc0d60f7e34bd742b29d8fa847c9294d1" - integrity sha512-yXsZyXJfAqzWk1WKryr0Wl0MN2D47xodPvEEwlVePBnhU5E7raevLQR+E6b9JAD3GfL/7MbAL9ZtWQQPcLx7wA== + version "1.4.581" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.581.tgz#23b684c67bf56d4284e95598c05a5d266653b6d8" + integrity sha512-6uhqWBIapTJUxgPTCHH9sqdbxIMPt7oXl0VcAL1kOtlU6aECdcMncCrX5Z7sHQ/invtrC9jUQUef7+HhO8vVFw== emoji-regex@^8.0.0: version "8.0.0" @@ -812,6 +877,13 @@ emoji-regex@^9.2.2: resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72" integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== +end-of-stream@^1.1.0, end-of-stream@^1.4.1: + version "1.4.4" + resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" + integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== + dependencies: + once "^1.4.0" + enhanced-resolve@^5.12.0: version "5.15.0" resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz#1af946c7d93603eb88e9896cee4904dc012e9c35" @@ -921,11 +993,11 @@ escape-string-regexp@^4.0.0: integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== eslint-config-next@^14.0.0: - version "14.0.1" - resolved "https://registry.yarnpkg.com/eslint-config-next/-/eslint-config-next-14.0.1.tgz#4e59cbaa1c1c72f6d7c4d9110b0902630493ef56" - integrity sha512-QfIFK2WD39H4WOespjgf6PLv9Bpsd7KGGelCtmq4l67nGvnlsGpuvj0hIT+aIy6p5gKH+lAChYILsyDlxP52yg== + version "14.0.2" + resolved "https://registry.yarnpkg.com/eslint-config-next/-/eslint-config-next-14.0.2.tgz#bbcd7af62ed9700d9dd74c1b8538fdb9495d46ce" + integrity sha512-CasWThlsyIcg/a+clU6KVOMTieuDhTztsrqvniP6AsRki9v7FnojTa7vKQOYM8QSOsQdZ/aElLD1Y2Oc8/PsIg== dependencies: - "@next/eslint-plugin-next" "14.0.1" + "@next/eslint-plugin-next" "14.0.2" "@rushstack/eslint-patch" "^1.3.3" "@typescript-eslint/parser" "^5.4.2 || ^6.0.0" eslint-import-resolver-node "^0.3.6" @@ -1133,11 +1205,21 @@ esutils@^2.0.2: resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== +expand-template@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/expand-template/-/expand-template-2.0.3.tgz#6e14b3fcee0f3a6340ecb57d2e8918692052a47c" + integrity sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg== + 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-fifo@^1.1.0, fast-fifo@^1.2.0: + version "1.3.2" + resolved "https://registry.yarnpkg.com/fast-fifo/-/fast-fifo-1.3.2.tgz#286e31de96eb96d38a97899815740ba2a4f3640c" + integrity sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ== + fast-glob@^3.2.9, fast-glob@^3.3.0, fast-glob@^3.3.1: version "3.3.2" resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.2.tgz#a904501e57cfdd2ffcded45e99a54fef55e46129" @@ -1227,6 +1309,11 @@ fraction.js@^4.3.6: resolved "https://registry.yarnpkg.com/fraction.js/-/fraction.js-4.3.7.tgz#06ca0085157e42fda7f9e726e79fefc4068840f7" integrity sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew== +fs-constants@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad" + integrity sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow== + fs.realpath@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" @@ -1287,6 +1374,11 @@ get-tsconfig@^4.5.0: dependencies: resolve-pkg-maps "^1.0.0" +github-from-package@0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/github-from-package/-/github-from-package-0.0.0.tgz#97fb5d96bfde8973313f20e8288ef9a167fa64ce" + integrity sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw== + glob-parent@^5.1.2, glob-parent@~5.1.2: version "5.1.2" resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" @@ -1426,6 +1518,11 @@ hasown@^2.0.0: dependencies: function-bind "^1.1.2" +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" @@ -1452,11 +1549,16 @@ inflight@^1.0.4: once "^1.3.0" wrappy "1" -inherits@2: +inherits@2, inherits@^2.0.3, inherits@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== +ini@~1.3.0: + version "1.3.8" + resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" + integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== + internal-slot@^1.0.5: version "1.0.6" resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.6.tgz#37e756098c4911c5e912b8edbf71ed3aa116f930" @@ -1490,6 +1592,11 @@ is-array-buffer@^3.0.1, is-array-buffer@^3.0.2: get-intrinsic "^1.2.0" is-typed-array "^1.1.10" +is-arrayish@^0.3.1: + version "0.3.2" + resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.3.2.tgz#4574a2ae56f7ab206896fb431eaeed066fdf8f03" + integrity sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ== + 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" @@ -1901,6 +2008,11 @@ micromatch@^4.0.4, micromatch@^4.0.5: braces "^3.0.2" picomatch "^2.3.1" +mimic-response@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-3.1.0.tgz#2d1d59af9c1b129815accc2c46a022a5ce1fa3c9" + integrity sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ== + 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" @@ -1908,11 +2020,16 @@ 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.0, minimist@^1.2.3, minimist@^1.2.6: version "1.2.8" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== +mkdirp-classic@^0.5.2, mkdirp-classic@^0.5.3: + version "0.5.3" + resolved "https://registry.yarnpkg.com/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz#fa10c9115cc6d8865be221ba47ee9bed78601113" + integrity sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A== + ms@2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" @@ -1937,15 +2054,20 @@ nanoid@^3.3.6: resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.7.tgz#d0c301a691bc8d54efa0a2226ccf3fe2fd656bd8" integrity sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g== +napi-build-utils@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/napi-build-utils/-/napi-build-utils-1.0.2.tgz#b1fddc0b2c46e380a0b7a76f984dd47c41a13806" + integrity sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg== + natural-compare@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== next-auth@^4.24.3: - version "4.24.4" - resolved "https://registry.yarnpkg.com/next-auth/-/next-auth-4.24.4.tgz#ec8aa72963c4c8d325ebc21f4c15e3b46647026e" - integrity sha512-5DGffi+OpkbU62vPQIJ1z+hFnmow+ec5Qrn9m6eoglIO51m0DlrmLxBduZEwKAYDEg9k2joi1yelgmq1vqK3aQ== + version "4.24.5" + resolved "https://registry.yarnpkg.com/next-auth/-/next-auth-4.24.5.tgz#1fd1bfc0603c61fd2ba6fd81b976af690edbf07e" + integrity sha512-3RafV3XbfIKk6rF6GlLE4/KxjTcuMCifqrmD+98ejFq73SRoj2rmzoca8u764977lH/Q7jo6Xu6yM+Re1Mz/Og== dependencies: "@babel/runtime" "^7.20.13" "@panva/hkdf" "^1.0.2" @@ -1958,11 +2080,11 @@ next-auth@^4.24.3: uuid "^8.3.2" next@^14.0.0: - version "14.0.1" - resolved "https://registry.yarnpkg.com/next/-/next-14.0.1.tgz#1375d94c5dc7af730234af48401be270e975cb22" - integrity sha512-s4YaLpE4b0gmb3ggtmpmV+wt+lPRuGtANzojMQ2+gmBpgX9w5fTbjsy6dXByBuENsdCX5pukZH/GxdFgO62+pA== + version "14.0.2" + resolved "https://registry.yarnpkg.com/next/-/next-14.0.2.tgz#02ba6a1656edf14d3913c7a3553026e9d6e083c7" + integrity sha512-jsAU2CkYS40GaQYOiLl9m93RTv2DA/tTJ0NRlmZIBIL87YwQ/xR8k796z7IqgM3jydI8G25dXvyYMC9VDIevIg== dependencies: - "@next/env" "14.0.1" + "@next/env" "14.0.2" "@swc/helpers" "0.5.2" busboy "1.6.0" caniuse-lite "^1.0.30001406" @@ -1970,15 +2092,27 @@ next@^14.0.0: styled-jsx "5.1.1" watchpack "2.4.0" optionalDependencies: - "@next/swc-darwin-arm64" "14.0.1" - "@next/swc-darwin-x64" "14.0.1" - "@next/swc-linux-arm64-gnu" "14.0.1" - "@next/swc-linux-arm64-musl" "14.0.1" - "@next/swc-linux-x64-gnu" "14.0.1" - "@next/swc-linux-x64-musl" "14.0.1" - "@next/swc-win32-arm64-msvc" "14.0.1" - "@next/swc-win32-ia32-msvc" "14.0.1" - "@next/swc-win32-x64-msvc" "14.0.1" + "@next/swc-darwin-arm64" "14.0.2" + "@next/swc-darwin-x64" "14.0.2" + "@next/swc-linux-arm64-gnu" "14.0.2" + "@next/swc-linux-arm64-musl" "14.0.2" + "@next/swc-linux-x64-gnu" "14.0.2" + "@next/swc-linux-x64-musl" "14.0.2" + "@next/swc-win32-arm64-msvc" "14.0.2" + "@next/swc-win32-ia32-msvc" "14.0.2" + "@next/swc-win32-x64-msvc" "14.0.2" + +node-abi@^3.3.0: + version "3.51.0" + resolved "https://registry.yarnpkg.com/node-abi/-/node-abi-3.51.0.tgz#970bf595ef5a26a271307f8a4befa02823d4e87d" + integrity sha512-SQkEP4hmNWjlniS5zdnfIXTk1x7Ome85RDzHlTbBtzE97Gfwz/Ipw4v/Ryk20DWIy3yCNVLVlGKApCnmvYoJbA== + dependencies: + semver "^7.3.5" + +node-addon-api@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-6.1.0.tgz#ac8470034e58e67d0c6f1204a18ae6995d9c0d76" + integrity sha512-+eawOlIgy680F0kBzPUNFhMZGtJ1YmqM6l4+Crf4IkImjYrO/mqPwRMh352g23uIaQKFItcQ64I7KMaJxHgAVA== node-releases@^2.0.13: version "2.0.13" @@ -2085,7 +2219,7 @@ oidc-token-hash@^5.0.3: resolved "https://registry.yarnpkg.com/oidc-token-hash/-/oidc-token-hash-5.0.3.tgz#9a229f0a1ce9d4fc89bcaee5478c97a889e7b7b6" integrity sha512-IF4PcGgzAr6XXSff26Sk/+P4KZFJVuHAJZj3wgO3vX2bMdNVp/QXTP3P7CEm9V1IdG8lDLY3HhiqpsE/nOwpPw== -once@^1.3.0: +once@^1.3.0, once@^1.3.1, once@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== @@ -2241,9 +2375,27 @@ preact-render-to-string@^5.1.19: pretty-format "^3.8.0" preact@^10.6.3: - version "10.18.2" - resolved "https://registry.yarnpkg.com/preact/-/preact-10.18.2.tgz#e3aeccc292aebbc2e0b76ed76570aa61dd5f75e4" - integrity sha512-X/K43vocUHDg0XhWVmTTMbec4LT/iBMh+csCEqJk+pJqegaXsvjdqN80ZZ3L+93azWCnWCZ+WGwYb8SplxeNjA== + version "10.19.1" + resolved "https://registry.yarnpkg.com/preact/-/preact-10.19.1.tgz#821b243a08ad4b71c77aa4f5a5035588e86c047e" + integrity sha512-ZSsUr6EFlwWH0btdXMj6+X+hJAZ1v+aUzKlfwBGokKB1ZO6Shz+D16LxQhM8f+E/UgkKbVe2tsWXtGTUMCkGpQ== + +prebuild-install@^7.1.1: + version "7.1.1" + resolved "https://registry.yarnpkg.com/prebuild-install/-/prebuild-install-7.1.1.tgz#de97d5b34a70a0c81334fd24641f2a1702352e45" + integrity sha512-jAXscXWMcCK8GgCoHOfIr0ODh5ai8mj63L2nWrjuAgXE6tDyYGnx4/8o/rCgU+B4JSyZBKbeZqzhtwtC3ovxjw== + dependencies: + detect-libc "^2.0.0" + expand-template "^2.0.3" + github-from-package "0.0.0" + minimist "^1.2.3" + mkdirp-classic "^0.5.3" + napi-build-utils "^1.0.1" + node-abi "^3.3.0" + pump "^3.0.0" + rc "^1.2.7" + simple-get "^4.0.0" + tar-fs "^2.0.0" + tunnel-agent "^0.6.0" prelude-ls@^1.2.1: version "1.2.1" @@ -2271,6 +2423,14 @@ prop-types@^15.8.1: object-assign "^4.1.1" react-is "^16.13.1" +pump@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" + integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" + punycode@^2.1.0: version "2.3.1" resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5" @@ -2281,6 +2441,21 @@ queue-microtask@^1.2.2: resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== +queue-tick@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/queue-tick/-/queue-tick-1.0.1.tgz#f6f07ac82c1fd60f82e098b417a80e52f1f4c142" + integrity sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag== + +rc@^1.2.7: + version "1.2.8" + resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" + integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== + dependencies: + deep-extend "^0.6.0" + ini "~1.3.0" + minimist "^1.2.0" + strip-json-comments "~2.0.1" + react-dom@^18.2.0: version "18.2.0" resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-18.2.0.tgz#22aaf38708db2674ed9ada224ca4aa708d821e3d" @@ -2308,6 +2483,15 @@ read-cache@^1.0.0: dependencies: pify "^2.3.0" +readable-stream@^3.1.1, readable-stream@^3.4.0: + version "3.6.2" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" + integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== + dependencies: + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.1" + readdirp@~3.6.0: version "3.6.0" resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" @@ -2422,7 +2606,7 @@ safe-array-concat@^1.0.1: has-symbols "^1.0.3" isarray "^2.0.5" -safe-buffer@^5.0.1: +safe-buffer@^5.0.1, safe-buffer@~5.2.0: version "5.2.1" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== @@ -2453,7 +2637,7 @@ semver@^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: +semver@^7.3.5, 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== @@ -2479,6 +2663,20 @@ set-function-name@^2.0.0, set-function-name@^2.0.1: functions-have-names "^1.2.3" has-property-descriptors "^1.0.0" +sharp@^0.32.6: + version "0.32.6" + resolved "https://registry.yarnpkg.com/sharp/-/sharp-0.32.6.tgz#6ad30c0b7cd910df65d5f355f774aa4fce45732a" + integrity sha512-KyLTWwgcR9Oe4d9HwCwNM2l7+J0dUQwn/yf7S0EnTtb0eVS4RxO0eUSvxPtzT4F3SY+C4K6fqdv/DO27sJ/v/w== + dependencies: + color "^4.2.3" + detect-libc "^2.0.2" + node-addon-api "^6.1.0" + prebuild-install "^7.1.1" + semver "^7.5.4" + simple-get "^4.0.1" + tar-fs "^3.0.4" + tunnel-agent "^0.6.0" + shebang-command@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" @@ -2505,6 +2703,27 @@ side-channel@^1.0.4: get-intrinsic "^1.0.2" object-inspect "^1.9.0" +simple-concat@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/simple-concat/-/simple-concat-1.0.1.tgz#f46976082ba35c2263f1c8ab5edfe26c41c9552f" + integrity sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q== + +simple-get@^4.0.0, simple-get@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/simple-get/-/simple-get-4.0.1.tgz#4a39db549287c979d352112fa03fd99fd6bc3543" + integrity sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA== + dependencies: + decompress-response "^6.0.0" + once "^1.3.1" + simple-concat "^1.0.0" + +simple-swizzle@^0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/simple-swizzle/-/simple-swizzle-0.2.2.tgz#a4da6b635ffcccca33f70d17cb92592de95e557a" + integrity sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg== + dependencies: + is-arrayish "^0.3.1" + slash@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" @@ -2530,6 +2749,14 @@ streamsearch@^1.1.0: resolved "https://registry.yarnpkg.com/streamsearch/-/streamsearch-1.1.0.tgz#404dd1e2247ca94af554e841a8ef0eaa238da764" integrity sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg== +streamx@^2.15.0: + version "2.15.4" + resolved "https://registry.yarnpkg.com/streamx/-/streamx-2.15.4.tgz#497b8102d076ae12b43c456e0bb16940d1ba0999" + integrity sha512-uSXKl88bibiUCQ1eMpItRljCzDENcDx18rsfDmV79r0e/ThfrAwxG4Y2FarQZ2G4/21xcOKmFFd1Hue+ZIDwHw== + dependencies: + fast-fifo "^1.1.0" + queue-tick "^1.0.1" + string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: version "4.2.3" resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" @@ -2581,6 +2808,13 @@ string.prototype.trimstart@^1.0.7: define-properties "^1.2.0" es-abstract "^1.22.1" +string_decoder@^1.1.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" + integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== + dependencies: + safe-buffer "~5.2.0" + strip-ansi@^6.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" @@ -2598,6 +2832,11 @@ strip-json-comments@^3.1.0, strip-json-comments@^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== +strip-json-comments@~2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" + integrity sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ== + styled-jsx@5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/styled-jsx/-/styled-jsx-5.1.1.tgz#839a1c3aaacc4e735fed0781b8619ea5d0009d1f" @@ -2678,6 +2917,45 @@ tapable@^2.2.0: resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.1.tgz#1967a73ef4060a82f12ab96af86d52fdb76eeca0" integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ== +tar-fs@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-2.1.1.tgz#489a15ab85f1f0befabb370b7de4f9eb5cbe8784" + integrity sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng== + dependencies: + chownr "^1.1.1" + mkdirp-classic "^0.5.2" + pump "^3.0.0" + tar-stream "^2.1.4" + +tar-fs@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-3.0.4.tgz#a21dc60a2d5d9f55e0089ccd78124f1d3771dbbf" + integrity sha512-5AFQU8b9qLfZCX9zp2duONhPmZv0hGYiBPJsyUdqMjzq/mqVpy/rEUSeHk1+YitmxugaptgBh5oDGU3VsAJq4w== + dependencies: + mkdirp-classic "^0.5.2" + pump "^3.0.0" + tar-stream "^3.1.5" + +tar-stream@^2.1.4: + version "2.2.0" + resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-2.2.0.tgz#acad84c284136b060dc3faa64474aa9aebd77287" + integrity sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ== + dependencies: + bl "^4.0.3" + end-of-stream "^1.4.1" + fs-constants "^1.0.0" + inherits "^2.0.3" + readable-stream "^3.1.1" + +tar-stream@^3.1.5: + version "3.1.6" + resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-3.1.6.tgz#6520607b55a06f4a2e2e04db360ba7d338cc5bab" + integrity sha512-B/UyjYwPpMBv+PaFSWAmtYjwdrlEaZQEhMIBFNC5oEG8lpiW8XjcSdmEaClj28ArfKScKHs2nshz3k2le6crsg== + dependencies: + b4a "^1.6.4" + fast-fifo "^1.2.0" + streamx "^2.15.0" + text-table@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" @@ -2734,6 +3012,13 @@ tslib@^2.1.0, tslib@^2.4.0: resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.2.tgz#703ac29425e7b37cd6fd456e92404d46d1f3e4ae" integrity sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q== +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" + type-check@^0.4.0, type-check@~0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" @@ -2825,7 +3110,7 @@ use-sync-external-store@^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.1, util-deprecate@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==