diff --git a/.dockerignore b/.dockerignore
index 4abae2b..615017f 100644
--- a/.dockerignore
+++ b/.dockerignore
@@ -1,3 +1,9 @@
+Dockerfile
+.github
+.vscode
+*.md
+
+#### gitignore below
# Nuxt dev/build outputs
.output
.data
@@ -8,6 +14,7 @@ dist
# Node dependencies
node_modules
+.yarn
# Logs
logs
@@ -24,3 +31,13 @@ logs
!.env.example
.data
+
+
+# deploy template
+deploy-template/*
+
+!deploy-template/compose.yml
+
+# generated prisma client
+/prisma/client
+/prisma/validate
diff --git a/.env.example b/.env.example
index bae34f6..7d708ff 100644
--- a/.env.example
+++ b/.env.example
@@ -1,8 +1,5 @@
DATABASE_URL="postgres://drop:drop@127.0.0.1:5432/drop"
-CLIENT_CERTIFICATES="./.data/ca"
-
-FS_BACKEND_PATH="./.data/objects"
-
GIANT_BOMB_API_KEY=""
+EXTERNAL_URL="http://localhost:3000"
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index 1ae20e5..f04182e 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -1,6 +1,15 @@
name: CI
-on: [pull_request, push]
+on:
+ push:
+ branches:
+ - develop
+ pull_request:
+ branches:
+ - develop
+
+permissions:
+ contents: read
jobs:
typecheck:
diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
index 2422087..8045e05 100644
--- a/.github/workflows/release.yml
+++ b/.github/workflows/release.yml
@@ -20,8 +20,29 @@ jobs:
uses: actions/checkout@v4
with:
submodules: true
+ fetch-depth: 3 # fix for when this gets triggered by tag
+ fetch-tags: true
+ ref: ${{ github.ref }}
token: ${{ secrets.GITHUB_TOKEN }}
+ - name: Determine final version
+ id: get_final_ver
+ run: |
+ BASE_VER=v$(jq -r '.version' package.json)
+ TODAY=$(date +'%Y.%m.%d')
+
+ echo "Today will be: $TODAY"
+ echo "today=$TODAY" >> $GITHUB_OUTPUT
+
+ if [[ "${{ github.event_name }}" == "release" ]]; then
+ FINAL_VER="$BASE_VER"
+ else
+ FINAL_VER="${BASE_VER}-nightly.$TODAY"
+ fi
+
+ echo "Drop's release tag will be: $FINAL_VER"
+ echo "final_ver=$FINAL_VER" >> $GITHUB_OUTPUT
+
- name: Set up QEMU
uses: docker/setup-qemu-action@v3
@@ -46,6 +67,7 @@ jobs:
ghcr.io/drop-OSS/drop
tags: |
type=schedule,pattern=nightly
+ type=schedule,pattern=nightly.${{ steps.get_final_ver.outputs.today }}
type=semver,pattern=v{{version}}
type=semver,pattern=v{{major}}.{{minor}}
type=semver,pattern=v{{major}}
@@ -55,14 +77,33 @@ jobs:
# set latest tag for stable releases
type=raw,value=latest,enable=${{ github.event_name == 'release' && github.event.release.prerelease == false }}
+ - name: Cache
+ uses: actions/cache@v4
+ id: cache
+ with:
+ path: cache-mount
+ key: cache-mount-${{ hashFiles('Dockerfile') }}
+
+ - name: Restore Docker cache mounts
+ uses: reproducible-containers/buildkit-cache-dance@v3
+ with:
+ builder: ${{ steps.setup-buildx.outputs.name }}
+ cache-dir: cache-mount
+ dockerfile: Dockerfile
+ skip-extraction: ${{ steps.cache.outputs.cache-hit }}
+
- name: Build and push image
id: build-and-push
uses: docker/build-push-action@v6
with:
context: .
push: true
+ provenance: mode=max
+ sbom: true
tags: ${{ steps.meta.outputs.tags }}
labels: ${{ steps.meta.outputs.labels }}
platforms: linux/amd64,linux/arm64
cache-from: type=gha
cache-to: type=gha,mode=max
+ build-args: |
+ BUILD_DROP_VERSION=${{ steps.get_final_ver.outputs.final_ver }}
diff --git a/.gitignore b/.gitignore
index 705c5c9..7188be1 100644
--- a/.gitignore
+++ b/.gitignore
@@ -33,4 +33,5 @@ deploy-template/*
!deploy-template/compose.yml
# generated prisma client
-/prisma/client
\ No newline at end of file
+/prisma/client
+/prisma/validate
\ No newline at end of file
diff --git a/.gitmodules b/.gitmodules
index 222a086..e24bb0c 100644
--- a/.gitmodules
+++ b/.gitmodules
@@ -1,3 +1,3 @@
[submodule "drop-base"]
path = drop-base
- url = https://github.com/Drop-OSS/drop-base.git
\ No newline at end of file
+ url = https://github.com/Drop-OSS/drop-base.git
diff --git a/.prettierignore b/.prettierignore
index 1e7121f..3c9727c 100644
--- a/.prettierignore
+++ b/.prettierignore
@@ -1 +1 @@
-drop-base/
+drop-base/
\ No newline at end of file
diff --git a/.vscode/extensions.json b/.vscode/extensions.json
new file mode 100644
index 0000000..2fc7cb9
--- /dev/null
+++ b/.vscode/extensions.json
@@ -0,0 +1,12 @@
+{
+ "recommendations": [
+ "lokalise.i18n-ally",
+ "esbenp.prettier-vscode",
+ "Prisma.prisma",
+ "bradlc.vscode-tailwindcss",
+ "Vue.volar",
+ "arktypeio.arkdark",
+ "EditorConfig.EditorConfig",
+ "dbaeumer.vscode-eslint"
+ ]
+}
diff --git a/.vscode/settings.json b/.vscode/settings.json
index e426a5e..76d084c 100644
--- a/.vscode/settings.json
+++ b/.vscode/settings.json
@@ -17,5 +17,21 @@
"strings": "on"
},
// prioritize ArkType's "type" for autoimports
- "typescript.preferences.autoImportSpecifierExcludeRegexes": ["^(node:)?os$"]
+ "typescript.preferences.autoImportSpecifierExcludeRegexes": ["^(node:)?os$"],
+ // i18n Ally settings
+ "i18n-ally.sortKeys": true,
+ "i18n-ally.keepFulfilled": true,
+ "i18n-ally.extract.autoDetect": true,
+ "i18n-ally.localesPaths": ["i18n", "i18n/locales"],
+ "i18n-ally.keystyle": "nested",
+ "i18n-ally.extract.ignored": [
+ "string >= 14",
+ "string.alphanumeric >= 5",
+ "/api/v1/admin/import/version/preload?id=${encodeURIComponent(\n gameId,\n )}&version=${encodeURIComponent(version)}"
+ ],
+ "i18n-ally.extract.ignoredByFiles": {
+ "pages/admin/library/sources/index.vue": ["Filesystem"],
+ "components/NewsArticleCreateButton.vue": ["[", "`", "Enter"],
+ "server/api/v1/auth/signin/simple.post.ts": ["boolean | undefined"]
+ }
}
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index 3d883ae..9055675 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -16,11 +16,15 @@ you would make is not already covered.
- [Reporting Issues](#reporting-issues)
- [You have a problem](#you-have-a-problem)
- [You have a suggestion](#you-have-a-suggestion)
+- [Development](#development)
+ - [Note: `--optional` flag is **REQUIRED**](#note-optional-flag-is-required)
+ - [Tech Stack](#tech-stack)
- [Submitting Pull Requests](#submitting-pull-requests)
- [Getting started](#getting-started)
- [You have a solution](#you-have-a-solution)
- [You have an addition](#you-have-an-addition)
- [Use the Search, Luke](#use-the-search-luke)
+- [Translation](#translation)
- [Commit Guidelines](#commit-guidelines)
- [Format](#format)
- [Style](#style)
@@ -65,6 +69,31 @@ If you find one, comment on it, so we know more people are supporting it.
If not, you can go ahead and create an issue. Please copy to anyone relevant (e.g. plugin
maintainers) by mentioning their GitHub handle (starting with `@`) in your message.
+## Development
+
+To get started with development, you need `yarn` and `docker compose` installed (or know how to set up a PostgreSQL database).
+
+Steps:
+
+1. Run `git submodule update --init --recursive` to setup submodules
+1. Copy the `.env.example` to `.env` and add any api keys you need to use (e.g. for the Giant Bomb API)
+ - You can find other configuration options in the [documentation](https://docs.droposs.org/)
+1. Create the `.data` directory with `mkdir .data`
+1. Ensure that your user owns the `.data` directory with `sudo chown -R $(id -u $(whoami))`
+1. Open up a terminal and navigate to `dev-tools`, and run `docker compose up`
+1. Open up another terminal in the root directory of the project and run `yarn` and then `yarn prisma migrate dev` to setup the database
+1. Run `yarn dev` to start the development server
+
+As part of the first-time bootstrap, Drop creates an invitation with the fixed id of 'admin'. So, to create an admin account, go to:
+
+http://localhost:3000/auth/register?id=admin
+
+### Tech Stack
+
+This repo uses the Nuxt 3 + TailwindCSS stack, with the `yarn` package manager.
+
+For the database, Drop uses Prisma connected to PostgreSQL.
+
## Submitting Pull Requests
### Getting started
@@ -130,6 +159,10 @@ and [create an issue](#reporting-issues) or [submit a PR](#submitting-pull-reque
---
+## Translation
+
+If you want to help translate Drop, we would love to have your help! You can do so on our [weblate instance](https://translate.droposs.org/engage/drop/). Please make sure to **read** the [message format syntax](https://vue-i18n.intlify.dev/guide/essentials/syntax.html) page before starting. We use this special syntax to enable high quality translations, and failure to do so may result in your translations **causing errors** in Drop.
+
## Commit Guidelines
Drop uses the [Conventional Commits](https://www.conventionalcommits.org/en/v1.0.0/)
@@ -144,7 +177,6 @@ type(scope)!: subject
```
- `type`: the type of the commit is one of the following:
-
- `feat`: new features.
- `fix`: bug fixes.
- `docs`: documentation changes.
@@ -161,7 +193,6 @@ type(scope)!: subject
- `scope`: section of the codebase that the commit makes changes to. If it makes changes to
many sections, or if no section in particular is modified, leave blank without the parentheses.
Examples:
-
- Commit that changes the `git` plugin:
```
@@ -175,7 +206,6 @@ type(scope)!: subject
```
For changes to plugins or themes, the scope should be the plugin or theme name:
-
- ✅ `fix(agnoster): commit subject`
- ❌ `fix(theme/agnoster): commit subject`
@@ -205,7 +235,6 @@ type(scope)!: subject
to specify other details, you can use the commit body, but it won't be visible.
Formatting tricks: the commit subject may contain:
-
- Links to related issues or PRs by writing `#issue`. This will be highlighted by the changelog tool:
```
diff --git a/Dockerfile b/Dockerfile
index 128e0d0..d562926 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -1,30 +1,56 @@
-# pull pre-configured and updated build environment
-FROM debian:testing-20250317-slim AS build-system
+# syntax=docker/dockerfile:1
+### Unified deps builder
+# FROM node:lts-alpine AS deps
+# WORKDIR /app
+# COPY package.json yarn.lock ./
+# RUN --mount=type=cache,target=/root/.yarn YARN_CACHE_FOLDER=/root/.yarn yarn install --network-timeout 1000000 --ignore-scripts
+
+### Build for app
+FROM node:lts-alpine AS build-system
# setup workdir - has to be the same filepath as app because fuckin' Prisma
WORKDIR /app
-# install dependencies and build
-RUN apt-get update -y
-RUN apt-get install node-corepack -y
-RUN corepack enable
+ENV NODE_ENV=production
+ENV NUXT_TELEMETRY_DISABLED=1
+# ENV YARN_CACHE_FOLDER=/root/.yarn
+
+# add git so drop can determine its git ref at build
+# pnpm for build
+RUN apk add --no-cache git pnpm
+
+# copy deps and rest of project files
+# COPY --from=deps /app/node_modules ./node_modules
COPY . .
-RUN NUXT_TELEMETRY_DISABLED=1 yarn install --network-timeout 1000000
-RUN NUXT_TELEMETRY_DISABLED=1 yarn prisma generate
-RUN NUXT_TELEMETRY_DISABLED=1 yarn build
-# create run environment for Drop
-FROM node:lts-slim AS run-system
+ARG BUILD_DROP_VERSION
+ARG BUILD_GIT_REF
+# build
+RUN pnpm import
+RUN pnpm install --shamefully-hoist
+RUN pnpm run build
+# RUN --mount=type=cache,target=/root/.yarn yarn postinstall && yarn build
+
+### create run environment for Drop
+FROM node:lts-alpine AS run-system
WORKDIR /app
+ENV NODE_ENV=production
+ENV NUXT_TELEMETRY_DISABLED=1
+
+# RUN --mount=type=cache,target=/root/.yarn YARN_CACHE_FOLDER=/root/.yarn yarn add --network-timeout 1000000 --no-lockfile --ignore-scripts prisma@6.11.1
+RUN apk add --no-cache pnpm
+RUN pnpm install prisma@6.11.1
+# init prisma to download all required files
+RUN pnpm prisma init
+
+COPY --from=build-system /app/package.json ./
COPY --from=build-system /app/.output ./app
COPY --from=build-system /app/prisma ./prisma
-COPY --from=build-system /app/package.json ./
COPY --from=build-system /app/build ./startup
-# OpenSSL as a dependency for Drop (TODO: seperate build environment)
-RUN apt-get update -y && apt-get install -y openssl
-RUN yarn global add prisma@6.7.0
+ENV LIBRARY="/library"
+ENV DATA="/data"
-CMD ["/app/startup/launch.sh"]
\ No newline at end of file
+CMD ["sh", "/app/startup/launch.sh"]
diff --git a/README.md b/README.md
index ca881d9..33cc5d0 100644
--- a/README.md
+++ b/README.md
@@ -6,72 +6,32 @@
# Drop
[](https://droposs.org)
+[](https://docs.droposs.org/)
+[](https://forum.droposs.org)
[](LICENSE)
[](https://discord.gg/ACq4qZp4a9)
[](https://opencollective.com/drop-oss)
+[
+](https://translate.droposs.org/engage/drop/)
-Drop is an open-source game distribution platform, like GameVault or Steam. It's designed to distribute and shared DRM-free game quickly, all while being incredibly flexible, beautiful and fast.
+Drop is an open-source game distribution platform, similar to GameVault or Steam. It's designed to distribute and share DRM-free games quickly, all while being incredibly flexible, beautiful, and fast.
+
+
+
+
## Philosophy
-1. Drop is flexible. While abstractions and interfaces can make the codebase more complicated, the flexibility is worth it.
-2. Drop is secure. The nature of Drop means an instance can never be accessible without authentication. In line with #1, Drop also supports a huge variety of authentication mechanisms, from a username/password to SSO.
-3. Drop is user-friendly. The interface is designed to be clean and simple to use, with complexity available to the users who want it.
+1. Drop is flexible. While abstractions and interfaces can complicate the codebase, the flexibility is worth it.
+2. Drop is secure. The nature of Drop means an instance can never be accessible without authentication. In line with #1, Drop also supports a huge variety of authentication mechanisms, from username/password to SSO.
+3. Drop is user-friendly. The interface is designed to be clean and simple to use, with advanced features available to users who want them.
## Deployment
-To just deploy Drop, we've set up a simple docker compose file in deploy-template.
-
-1. Generate a [GiantBomb API Key](https://www.giantbomb.com/api/)
-2. Navigate to the deploy-template directory in your terminal (`cd deploy-template`)
-3. Edit the compose.yml file (`nano compose.yml`) and copy your GiamtBomb API Key into the GIANT_BOMB_API_KEY environment variable
-4. Run `docker compose up -d`
-
-Your drop server should now be running. To register the admin user, navigate to http://your.drop.server.ip:3000/register?id=admin
-and fill in the required forms
-
-### Adding a game
-
-To add a game to the drop library, do as follows:
-
-1. Ensure that the current user owns the library folder with `sudo chown -R $(id -u $(whoami)) library`
-2. `cd library`
-3. `mkdir ` with the name of the game which you would like to register
-4. `cd `
-5. `mkdir ` Upload files for the specific game version to this folder
-6. Navigate to http://your.drop.server.ip:3000/
-7. Import game metadata (uses GiantBomb API Key) by selecting the game and specifying which entry to import
-8. Navigate to http://your.drop.server.ip:3000/admin/library
-9. You should see the game which you have just imported listed in this menu. There should be a notification that "Drop has detected you have new verions of this game to import". Select import here.
-10. Select the game version to import and thus fill in fields as required.
-
-## Tech Stack
-
-This repo uses the Nuxt 3 + TailwindCSS stack, with the `yarn` package manager.
-
-For the database, Drop uses Prisma connected to PostgreSQL.
-
-## Development
-
-To get started with development, you need `yarn --optional` and `docker compose` installed (or know how to set up a PostgreSQL database).
-
-### Note: `--optional` flag is **REQUIRED**
-
-Drop uses a utility package called droplet that's written in Rust. It has builts for Linux (GNU) and Windows, and they are set up as optional packages. `npm` installs these by default, but `yarn` needs the `--optional` flag.
-
-Steps:
-
-1. Run `git submodule update --init --recursive` to setup submodules
-1. Copy the `.env.example` to `.env` and add your GiantBomb metadata key (more metadata providers coming)
-1. Create the `.data` directory with `mkdir .data`
-1. Ensure that your user owns the `.data` directory with `sudo chown -R $(id -u $(whoami))`
-1. Open up a terminal and navigate to `dev-tools`, and run `docker compose up`
-1. Open up another terminal in the root directory of the project and run `yarn` and then `yarn dev` to start the dev server
-
-As part of the first-time bootstrap, Drop creates an invitation with the fixed id of 'admin'. So, to create an admin account, go to:
-
-http://localhost:3000/auth/register?id=admin
+See our documentation on how to [deploy Drop](https://docs.droposs.org/docs/guides/quickstart) for more information.
## Contributing
-Please see the [in-depth contributing guide](CONTRIBUTING.md)
+Please see the [in-depth contributing guide](CONTRIBUTING.md). The guide includes information on how to set up the project, how to contribute code, how to report issues, and even how to effectively translate Drop.
+
+[](https://translate.droposs.org/engage/drop/)
diff --git a/app.vue b/app.vue
index c70e804..26c93ff 100644
--- a/app.vue
+++ b/app.vue
@@ -4,10 +4,52 @@
+
+
+ {{
+ $t("errors.externalUrl.title")
+ }}
+ {{
+ $t("errors.externalUrl.subtitle")
+ }}
+
+
hideExternalURL()">
+
+
+
diff --git a/pages/store/[id]/index.vue b/pages/store/[id]/index.vue
index cc6943f..4bcd942 100644
--- a/pages/store/[id]/index.vue
+++ b/pages/store/[id]/index.vue
@@ -44,7 +44,7 @@
type="button"
class="inline-flex items-center gap-x-2 rounded-md bg-zinc-800 px-3 py-1 text-sm font-semibold font-display text-white shadow-sm hover:bg-zinc-700 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-blue-600 duration-200 hover:scale-105 active:scale-95"
>
- Open in Admin Dashboard
+ {{ $t("store.openAdminDashboard") }}
- Released
+ {{ $t("store.released") }}
- {{
- DateTime.fromISO(game.mReleased).toFormat("d MMMM, yyyy")
- }}
+
+ {{ $d(new Date(game.mReleased), "short") }}
+
- Platform(s)
+ {{ $t("store.platform", platforms.length) }}
coming soon{{ $t("store.commingSoon") }}
@@ -90,7 +90,7 @@
- Rating
+ {{ $t("store.rating") }}
- ({{ game.mReviewCount }} reviews) {{
+ $t("store.reviews", [rating._sum.mReviewCount ?? 0])
+ }}
+
+
+
+
+ {{ $t("store.tags") }}
+
+
+
+ {{ tag.name }}
+
+ {{ $t("store.noTags") }}
+
+
+
+
+ {{ $t("store.developers", game.developers.length) }}
+
+
+
+ {{ developer.mName }}
+
+ {{ $t("store.noDevelopers") }}
+
+
+
+
+ {{ $t("store.publishers", game.publishers.length) }}
+
+
+
+ {{ publisher.mName }}
+
+ {{ $t("store.noPublishers") }}
@@ -131,7 +197,7 @@
- No images
+ {{ $t("store.noImages") }}
@@ -162,7 +228,9 @@
Click to read {{ showPreview ? "more" : "less" }} {{
+ showPreview ? $t("store.readMore") : $t("store.readLess")
+ }}
@@ -176,10 +244,7 @@
diff --git a/pages/store/c/[id]/index.vue b/pages/store/c/[id]/index.vue
new file mode 100644
index 0000000..b5dfd54
--- /dev/null
+++ b/pages/store/c/[id]/index.vue
@@ -0,0 +1,65 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ company.mName }}
+
+
+ {{ company.mShortDescription }}
+
+
+
+
+
+
+
+
+
diff --git a/pages/store/index.vue b/pages/store/index.vue
index 7cd01f9..656e4ed 100644
--- a/pages/store/index.vue
+++ b/pages/store/index.vue
@@ -24,14 +24,16 @@
>
- Recently added
+ {{ $t("store.featured") }}
{{ game.mName }}
-
+
{{ game.mShortDescription }}
@@ -41,7 +43,7 @@
Check it out {{ $t("store.lookAt") }}
@@ -57,52 +59,46 @@
- no game
+ {{ $t("store.noFeatured") }}
+
+
+
+
+
+
+
-
-
-
- Recently released
-
-
Explore more →
-
-
-
-
-
-
-
-
- Recently updated
-
-
Explore more →
-
-
-
-
+
diff --git a/pages/store/t/[id]/index.vue b/pages/store/t/[id]/index.vue
new file mode 100644
index 0000000..d692004
--- /dev/null
+++ b/pages/store/t/[id]/index.vue
@@ -0,0 +1,48 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ tag.name }}
+
+
+
+
+
+
+
+
+
diff --git a/plugins/error-handler.ts b/plugins/error-handler.ts
new file mode 100644
index 0000000..62bab5e
--- /dev/null
+++ b/plugins/error-handler.ts
@@ -0,0 +1,5 @@
+export default defineNuxtPlugin((nuxtApp) => {
+ nuxtApp.hook("vue:error", (error, instance, info) => {
+ console.error(info, error, instance);
+ });
+});
diff --git a/prisma/migrations/20250511154134_add_tags_to_games/migration.sql b/prisma/migrations/20250511154134_add_tags_to_games/migration.sql
new file mode 100644
index 0000000..fb10131
--- /dev/null
+++ b/prisma/migrations/20250511154134_add_tags_to_games/migration.sql
@@ -0,0 +1,16 @@
+-- CreateTable
+CREATE TABLE "_GameToTag" (
+ "A" TEXT NOT NULL,
+ "B" TEXT NOT NULL,
+
+ CONSTRAINT "_GameToTag_AB_pkey" PRIMARY KEY ("A","B")
+);
+
+-- CreateIndex
+CREATE INDEX "_GameToTag_B_index" ON "_GameToTag"("B");
+
+-- AddForeignKey
+ALTER TABLE "_GameToTag" ADD CONSTRAINT "_GameToTag_A_fkey" FOREIGN KEY ("A") REFERENCES "Game"("id") ON DELETE CASCADE ON UPDATE CASCADE;
+
+-- AddForeignKey
+ALTER TABLE "_GameToTag" ADD CONSTRAINT "_GameToTag_B_fkey" FOREIGN KEY ("B") REFERENCES "Tag"("id") ON DELETE CASCADE ON UPDATE CASCADE;
diff --git a/prisma/migrations/20250514193830_allow_notification_nonce_reuse_per_user/migration.sql b/prisma/migrations/20250514193830_allow_notification_nonce_reuse_per_user/migration.sql
new file mode 100644
index 0000000..035b237
--- /dev/null
+++ b/prisma/migrations/20250514193830_allow_notification_nonce_reuse_per_user/migration.sql
@@ -0,0 +1,11 @@
+/*
+ Warnings:
+
+ - A unique constraint covering the columns `[userId,nonce]` on the table `Notification` will be added. If there are existing duplicate values, this will fail.
+
+*/
+-- DropIndex
+DROP INDEX "Notification_nonce_key";
+
+-- CreateIndex
+CREATE UNIQUE INDEX "Notification_userId_nonce_key" ON "Notification"("userId", "nonce");
diff --git a/prisma/migrations/20250515021331_add_game_ratings/migration.sql b/prisma/migrations/20250515021331_add_game_ratings/migration.sql
new file mode 100644
index 0000000..52a2f5f
--- /dev/null
+++ b/prisma/migrations/20250515021331_add_game_ratings/migration.sql
@@ -0,0 +1,41 @@
+/*
+ Warnings:
+
+ - You are about to drop the column `mReviewCount` on the `Game` table. All the data in the column will be lost.
+ - You are about to drop the column `mReviewRating` on the `Game` table. All the data in the column will be lost.
+
+*/
+-- AlterEnum
+-- This migration adds more than one value to an enum.
+-- With PostgreSQL versions 11 and earlier, this is not possible
+-- in a single migration. This can be worked around by creating
+-- multiple migrations, each migration adding only one value to
+-- the enum.
+
+
+ALTER TYPE "MetadataSource" ADD VALUE 'Metacritic';
+ALTER TYPE "MetadataSource" ADD VALUE 'OpenCritic';
+
+-- AlterTable
+ALTER TABLE "Game" DROP COLUMN "mReviewCount",
+DROP COLUMN "mReviewRating";
+
+-- CreateTable
+CREATE TABLE "GameRating" (
+ "id" TEXT NOT NULL,
+ "metadataSource" "MetadataSource" NOT NULL,
+ "metadataId" TEXT NOT NULL,
+ "created" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
+ "mReviewCount" INTEGER NOT NULL,
+ "mReviewRating" DOUBLE PRECISION NOT NULL,
+ "mReviewHref" TEXT,
+ "gameId" TEXT NOT NULL,
+
+ CONSTRAINT "GameRating_pkey" PRIMARY KEY ("id")
+);
+
+-- CreateIndex
+CREATE UNIQUE INDEX "GameRating_metadataSource_metadataId_key" ON "GameRating"("metadataSource", "metadataId");
+
+-- AddForeignKey
+ALTER TABLE "GameRating" ADD CONSTRAINT "GameRating_gameId_fkey" FOREIGN KEY ("gameId") REFERENCES "Game"("id") ON DELETE CASCADE ON UPDATE CASCADE;
diff --git a/prisma/migrations/20250515043254_add_acls_to_notifications/migration.sql b/prisma/migrations/20250515043254_add_acls_to_notifications/migration.sql
new file mode 100644
index 0000000..2f6fdd8
--- /dev/null
+++ b/prisma/migrations/20250515043254_add_acls_to_notifications/migration.sql
@@ -0,0 +1,2 @@
+-- AlterTable
+ALTER TABLE "Notification" ADD COLUMN "acls" TEXT[];
diff --git a/prisma/migrations/20250601022736_add_database_library/migration.sql b/prisma/migrations/20250601022736_add_database_library/migration.sql
new file mode 100644
index 0000000..e51f2fa
--- /dev/null
+++ b/prisma/migrations/20250601022736_add_database_library/migration.sql
@@ -0,0 +1,53 @@
+/*
+ Warnings:
+
+ - You are about to drop the `ClientPeerAPIConfiguration` table. If the table is not empty, all the data it contains will be lost.
+
+*/
+-- CreateEnum
+CREATE TYPE "LibraryBackend" AS ENUM ('Filesystem');
+
+-- AlterEnum
+ALTER TYPE "ClientCapabilities" ADD VALUE 'trackPlaytime';
+
+-- DropForeignKey
+ALTER TABLE "ClientPeerAPIConfiguration" DROP CONSTRAINT "ClientPeerAPIConfiguration_clientId_fkey";
+
+-- AlterTable
+ALTER TABLE "Screenshot" ALTER COLUMN "private" DROP DEFAULT;
+
+-- DropTable
+DROP TABLE "ClientPeerAPIConfiguration";
+
+-- CreateTable
+CREATE TABLE "Library" (
+ "id" TEXT NOT NULL,
+ "name" TEXT NOT NULL,
+ "backend" "LibraryBackend" NOT NULL,
+ "options" JSONB NOT NULL,
+
+ CONSTRAINT "Library_pkey" PRIMARY KEY ("id")
+);
+
+-- CreateTable
+CREATE TABLE "Playtime" (
+ "gameId" TEXT NOT NULL,
+ "userId" TEXT NOT NULL,
+ "seconds" INTEGER NOT NULL,
+ "updatedAt" TIMESTAMPTZ(6) NOT NULL,
+ "createdAt" TIMESTAMPTZ(6) NOT NULL DEFAULT CURRENT_TIMESTAMP,
+
+ CONSTRAINT "Playtime_pkey" PRIMARY KEY ("gameId","userId")
+);
+
+-- CreateIndex
+CREATE INDEX "Playtime_userId_idx" ON "Playtime"("userId");
+
+-- CreateIndex
+CREATE INDEX "Screenshot_userId_idx" ON "Screenshot"("userId");
+
+-- AddForeignKey
+ALTER TABLE "Playtime" ADD CONSTRAINT "Playtime_gameId_fkey" FOREIGN KEY ("gameId") REFERENCES "Game"("id") ON DELETE CASCADE ON UPDATE CASCADE;
+
+-- AddForeignKey
+ALTER TABLE "Playtime" ADD CONSTRAINT "Playtime_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE;
diff --git a/prisma/migrations/20250601032211_add_library_relation_to_game/migration.sql b/prisma/migrations/20250601032211_add_library_relation_to_game/migration.sql
new file mode 100644
index 0000000..e50aac1
--- /dev/null
+++ b/prisma/migrations/20250601032211_add_library_relation_to_game/migration.sql
@@ -0,0 +1,17 @@
+/*
+Warnings:
+
+- You are about to drop the column `libraryBasePath` on the `Game` table. All the data in the column will be lost.
+
+*/
+-- DropIndex
+DROP INDEX "Game_libraryBasePath_key";
+
+-- AlterTable
+ALTER TABLE "Game" RENAME COLUMN "libraryBasePath" TO "libraryPath";
+
+ALTER TABLE "Game" ADD COLUMN "libraryId" TEXT;
+
+-- AddForeignKey
+ALTER TABLE "Game"
+ADD CONSTRAINT "Game_libraryId_fkey" FOREIGN KEY ("libraryId") REFERENCES "Library" ("id") ON DELETE SET NULL ON UPDATE CASCADE;
\ No newline at end of file
diff --git a/prisma/migrations/20250601032938_add_unique_constraint/migration.sql b/prisma/migrations/20250601032938_add_unique_constraint/migration.sql
new file mode 100644
index 0000000..f460020
--- /dev/null
+++ b/prisma/migrations/20250601032938_add_unique_constraint/migration.sql
@@ -0,0 +1,8 @@
+/*
+ Warnings:
+
+ - A unique constraint covering the columns `[libraryId,libraryPath]` on the table `Game` will be added. If there are existing duplicate values, this will fail.
+
+*/
+-- CreateIndex
+CREATE UNIQUE INDEX "Game_libraryId_libraryPath_key" ON "Game"("libraryId", "libraryPath");
diff --git a/prisma/migrations/20250606013242_add_tasks_to_database/migration.sql b/prisma/migrations/20250606013242_add_tasks_to_database/migration.sql
new file mode 100644
index 0000000..e3aa449
--- /dev/null
+++ b/prisma/migrations/20250606013242_add_tasks_to_database/migration.sql
@@ -0,0 +1,14 @@
+-- CreateTable
+CREATE TABLE "Task" (
+ "id" TEXT NOT NULL,
+ "taskGroup" TEXT NOT NULL,
+ "started" TIMESTAMP(3) NOT NULL,
+ "ended" TIMESTAMP(3) NOT NULL,
+ "success" BOOLEAN NOT NULL,
+ "error" JSONB,
+ "progress" DOUBLE PRECISION NOT NULL,
+ "log" TEXT[],
+ "acls" TEXT[],
+
+ CONSTRAINT "Task_pkey" PRIMARY KEY ("id")
+);
diff --git a/prisma/migrations/20250606023802_add_name_to_task/migration.sql b/prisma/migrations/20250606023802_add_name_to_task/migration.sql
new file mode 100644
index 0000000..db4f781
--- /dev/null
+++ b/prisma/migrations/20250606023802_add_name_to_task/migration.sql
@@ -0,0 +1,8 @@
+/*
+ Warnings:
+
+ - Added the required column `name` to the `Task` table without a default value. This is not possible if the table is not empty.
+
+*/
+-- AlterTable
+ALTER TABLE "Task" ADD COLUMN "name" TEXT NOT NULL;
diff --git a/prisma/migrations/20250608010030_delete_user_cascade/migration.sql b/prisma/migrations/20250608010030_delete_user_cascade/migration.sql
new file mode 100644
index 0000000..d9e569a
--- /dev/null
+++ b/prisma/migrations/20250608010030_delete_user_cascade/migration.sql
@@ -0,0 +1,41 @@
+-- DropForeignKey
+ALTER TABLE "APIToken" DROP CONSTRAINT "APIToken_userId_fkey";
+
+-- DropForeignKey
+ALTER TABLE "Article" DROP CONSTRAINT "Article_authorId_fkey";
+
+-- DropForeignKey
+ALTER TABLE "Client" DROP CONSTRAINT "Client_userId_fkey";
+
+-- DropForeignKey
+ALTER TABLE "Collection" DROP CONSTRAINT "Collection_userId_fkey";
+
+-- DropForeignKey
+ALTER TABLE "LinkedAuthMec" DROP CONSTRAINT "LinkedAuthMec_userId_fkey";
+
+-- DropForeignKey
+ALTER TABLE "Notification" DROP CONSTRAINT "Notification_userId_fkey";
+
+-- DropForeignKey
+ALTER TABLE "Session" DROP CONSTRAINT "Session_userId_fkey";
+
+-- AddForeignKey
+ALTER TABLE "LinkedAuthMec" ADD CONSTRAINT "LinkedAuthMec_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE;
+
+-- AddForeignKey
+ALTER TABLE "APIToken" ADD CONSTRAINT "APIToken_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE;
+
+-- AddForeignKey
+ALTER TABLE "Session" ADD CONSTRAINT "Session_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE;
+
+-- AddForeignKey
+ALTER TABLE "Client" ADD CONSTRAINT "Client_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE;
+
+-- AddForeignKey
+ALTER TABLE "Collection" ADD CONSTRAINT "Collection_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE;
+
+-- AddForeignKey
+ALTER TABLE "Article" ADD CONSTRAINT "Article_authorId_fkey" FOREIGN KEY ("authorId") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE;
+
+-- AddForeignKey
+ALTER TABLE "Notification" ADD CONSTRAINT "Notification_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE;
diff --git a/prisma/migrations/20250621205541_add_show_title_description_on_game_panel/migration.sql b/prisma/migrations/20250621205541_add_show_title_description_on_game_panel/migration.sql
new file mode 100644
index 0000000..c0cd66d
--- /dev/null
+++ b/prisma/migrations/20250621205541_add_show_title_description_on_game_panel/migration.sql
@@ -0,0 +1,2 @@
+-- AlterTable
+ALTER TABLE "ApplicationSettings" ADD COLUMN "showGamePanelTextDecoration" BOOLEAN NOT NULL DEFAULT true;
diff --git a/prisma/migrations/20250702102624_add_flat_fs_provider/migration.sql b/prisma/migrations/20250702102624_add_flat_fs_provider/migration.sql
new file mode 100644
index 0000000..355bd24
--- /dev/null
+++ b/prisma/migrations/20250702102624_add_flat_fs_provider/migration.sql
@@ -0,0 +1,2 @@
+-- AlterEnum
+ALTER TYPE "LibraryBackend" ADD VALUE 'FlatFilesystem';
diff --git a/prisma/migrations/20250720070939_static_genres/migration.sql b/prisma/migrations/20250720070939_static_genres/migration.sql
new file mode 100644
index 0000000..df31459
--- /dev/null
+++ b/prisma/migrations/20250720070939_static_genres/migration.sql
@@ -0,0 +1,5 @@
+-- CreateEnum
+CREATE TYPE "Genre" AS ENUM ('Action', 'Strategy', 'Sports', 'Adventure', 'Roleplay', 'Racing', 'Simulation', 'Educational', 'Fighting', 'Shooter', 'RealTimeStrategy', 'CardGame', 'BoardGame', 'Compilation', 'MMORPG', 'MinigameCollection', 'Puzzle', 'MusicRhythm');
+
+-- AlterTable
+ALTER TABLE "Game" ADD COLUMN "genres" "Genre"[];
diff --git a/prisma/migrations/20250721053244_update_genre_names/migration.sql b/prisma/migrations/20250721053244_update_genre_names/migration.sql
new file mode 100644
index 0000000..63accfe
--- /dev/null
+++ b/prisma/migrations/20250721053244_update_genre_names/migration.sql
@@ -0,0 +1,14 @@
+/*
+ Warnings:
+
+ - The values [RealTimeStrategy,CardGame,BoardGame,MinigameCollection,MusicRhythm] on the enum `Genre` will be removed. If these variants are still used in the database, this will fail.
+
+*/
+-- AlterEnum
+BEGIN;
+CREATE TYPE "Genre_new" AS ENUM ('Action', 'Strategy', 'Sports', 'Adventure', 'Roleplay', 'Racing', 'Simulation', 'Educational', 'Fighting', 'Shooter', 'RTS', 'Card', 'Board', 'Compilation', 'MMORPG', 'Minigames', 'Puzzle', 'Rhythm');
+ALTER TABLE "Game" ALTER COLUMN "genres" TYPE "Genre_new"[] USING ("genres"::text::"Genre_new"[]);
+ALTER TYPE "Genre" RENAME TO "Genre_old";
+ALTER TYPE "Genre_new" RENAME TO "Genre";
+DROP TYPE "Genre_old";
+COMMIT;
diff --git a/prisma/migrations/20250721053514_add_featured/migration.sql b/prisma/migrations/20250721053514_add_featured/migration.sql
new file mode 100644
index 0000000..89aeeb4
--- /dev/null
+++ b/prisma/migrations/20250721053514_add_featured/migration.sql
@@ -0,0 +1,2 @@
+-- AlterTable
+ALTER TABLE "Game" ADD COLUMN "featured" BOOLEAN NOT NULL DEFAULT false;
diff --git a/prisma/migrations/20250721061200_remove_genres/migration.sql b/prisma/migrations/20250721061200_remove_genres/migration.sql
new file mode 100644
index 0000000..4f4f1df
--- /dev/null
+++ b/prisma/migrations/20250721061200_remove_genres/migration.sql
@@ -0,0 +1,11 @@
+/*
+ Warnings:
+
+ - You are about to drop the column `genres` on the `Game` table. All the data in the column will be lost.
+
+*/
+-- AlterTable
+ALTER TABLE "Game" DROP COLUMN "genres";
+
+-- DropEnum
+DROP TYPE "Genre";
diff --git a/prisma/migrations/20250721062509_add_pg_trgm/migration.sql b/prisma/migrations/20250721062509_add_pg_trgm/migration.sql
new file mode 100644
index 0000000..567fbd0
--- /dev/null
+++ b/prisma/migrations/20250721062509_add_pg_trgm/migration.sql
@@ -0,0 +1,5 @@
+-- Add pg_trgm
+CREATE EXTENSION pg_trgm;
+
+-- Create index for tag names
+-- CREATE INDEX trgm_tag_name ON "Tag" USING GIST (name gist_trgm_ops(siglen=32));
\ No newline at end of file
diff --git a/prisma/migrations/20250721063518_add_index_for_tag_name/migration.sql b/prisma/migrations/20250721063518_add_index_for_tag_name/migration.sql
new file mode 100644
index 0000000..02b93b5
--- /dev/null
+++ b/prisma/migrations/20250721063518_add_index_for_tag_name/migration.sql
@@ -0,0 +1,2 @@
+-- CreateIndex
+CREATE INDEX "Tag_name_idx" ON "Tag" USING GIST ("name" gist_trgm_ops(siglen=32));
diff --git a/prisma/migrations/20250721070713_split_game_and_news_tags/migration.sql b/prisma/migrations/20250721070713_split_game_and_news_tags/migration.sql
new file mode 100644
index 0000000..cbd80c5
--- /dev/null
+++ b/prisma/migrations/20250721070713_split_game_and_news_tags/migration.sql
@@ -0,0 +1,87 @@
+/*
+ Warnings:
+
+ - You are about to drop the `Tag` table. If the table is not empty, all the data it contains will be lost.
+ - You are about to drop the `_ArticleToTag` table. If the table is not empty, all the data it contains will be lost.
+ - You are about to drop the `_GameToTag` table. If the table is not empty, all the data it contains will be lost.
+
+*/
+-- DropForeignKey
+ALTER TABLE "_ArticleToTag" DROP CONSTRAINT "_ArticleToTag_A_fkey";
+
+-- DropForeignKey
+ALTER TABLE "_ArticleToTag" DROP CONSTRAINT "_ArticleToTag_B_fkey";
+
+-- DropForeignKey
+ALTER TABLE "_GameToTag" DROP CONSTRAINT "_GameToTag_A_fkey";
+
+-- DropForeignKey
+ALTER TABLE "_GameToTag" DROP CONSTRAINT "_GameToTag_B_fkey";
+
+-- DropTable
+DROP TABLE "Tag";
+
+-- DropTable
+DROP TABLE "_ArticleToTag";
+
+-- DropTable
+DROP TABLE "_GameToTag";
+
+-- CreateTable
+CREATE TABLE "GameTag" (
+ "id" TEXT NOT NULL,
+ "name" TEXT NOT NULL,
+
+ CONSTRAINT "GameTag_pkey" PRIMARY KEY ("id")
+);
+
+-- CreateTable
+CREATE TABLE "NewsTag" (
+ "id" TEXT NOT NULL,
+ "name" TEXT NOT NULL,
+
+ CONSTRAINT "NewsTag_pkey" PRIMARY KEY ("id")
+);
+
+-- CreateTable
+CREATE TABLE "_GameToGameTag" (
+ "A" TEXT NOT NULL,
+ "B" TEXT NOT NULL,
+
+ CONSTRAINT "_GameToGameTag_AB_pkey" PRIMARY KEY ("A","B")
+);
+
+-- CreateTable
+CREATE TABLE "_ArticleToNewsTag" (
+ "A" TEXT NOT NULL,
+ "B" TEXT NOT NULL,
+
+ CONSTRAINT "_ArticleToNewsTag_AB_pkey" PRIMARY KEY ("A","B")
+);
+
+-- CreateIndex
+CREATE UNIQUE INDEX "GameTag_name_key" ON "GameTag"("name");
+
+-- CreateIndex
+CREATE INDEX "GameTag_name_idx" ON "GameTag" USING GIST ("name" gist_trgm_ops(siglen=32));
+
+-- CreateIndex
+CREATE UNIQUE INDEX "NewsTag_name_key" ON "NewsTag"("name");
+
+-- CreateIndex
+CREATE INDEX "_GameToGameTag_B_index" ON "_GameToGameTag"("B");
+
+-- CreateIndex
+CREATE INDEX "_ArticleToNewsTag_B_index" ON "_ArticleToNewsTag"("B");
+
+-- AddForeignKey
+ALTER TABLE "_GameToGameTag" ADD CONSTRAINT "_GameToGameTag_A_fkey" FOREIGN KEY ("A") REFERENCES "Game"("id") ON DELETE CASCADE ON UPDATE CASCADE;
+
+-- AddForeignKey
+ALTER TABLE "_GameToGameTag" ADD CONSTRAINT "_GameToGameTag_B_fkey" FOREIGN KEY ("B") REFERENCES "GameTag"("id") ON DELETE CASCADE ON UPDATE CASCADE;
+
+-- AddForeignKey
+ALTER TABLE "_ArticleToNewsTag" ADD CONSTRAINT "_ArticleToNewsTag_A_fkey" FOREIGN KEY ("A") REFERENCES "Article"("id") ON DELETE CASCADE ON UPDATE CASCADE;
+
+-- AddForeignKey
+ALTER TABLE "_ArticleToNewsTag" ADD CONSTRAINT "_ArticleToNewsTag_B_fkey" FOREIGN KEY ("B") REFERENCES "NewsTag"("id") ON DELETE CASCADE ON UPDATE CASCADE;
diff --git a/prisma/migrations/20250801035031_add_delete_casacde/migration.sql b/prisma/migrations/20250801035031_add_delete_casacde/migration.sql
new file mode 100644
index 0000000..645377a
--- /dev/null
+++ b/prisma/migrations/20250801035031_add_delete_casacde/migration.sql
@@ -0,0 +1,11 @@
+-- DropForeignKey
+ALTER TABLE "Game" DROP CONSTRAINT "Game_libraryId_fkey";
+
+-- DropIndex
+DROP INDEX "GameTag_name_idx";
+
+-- CreateIndex
+CREATE INDEX "GameTag_name_idx" ON "GameTag" USING GIST ("name" gist_trgm_ops(siglen=32));
+
+-- AddForeignKey
+ALTER TABLE "Game" ADD CONSTRAINT "Game_libraryId_fkey" FOREIGN KEY ("libraryId") REFERENCES "Library"("id") ON DELETE CASCADE ON UPDATE CASCADE;
diff --git a/prisma/migrations/20250815014713_use_task_id_started_composite_id/migration.sql b/prisma/migrations/20250815014713_use_task_id_started_composite_id/migration.sql
new file mode 100644
index 0000000..7f096a1
--- /dev/null
+++ b/prisma/migrations/20250815014713_use_task_id_started_composite_id/migration.sql
@@ -0,0 +1,15 @@
+/*
+ Warnings:
+
+ - The primary key for the `Task` table will be changed. If it partially fails, the table could be left without primary key constraint.
+
+*/
+-- DropIndex
+DROP INDEX "GameTag_name_idx";
+
+-- AlterTable
+ALTER TABLE "Task" DROP CONSTRAINT "Task_pkey",
+ADD CONSTRAINT "Task_pkey" PRIMARY KEY ("id", "started");
+
+-- CreateIndex
+CREATE INDEX "GameTag_name_idx" ON "GameTag" USING GIST ("name" gist_trgm_ops(siglen=32));
diff --git a/prisma/migrations/20250823005001_add_api_token_expiry/migration.sql b/prisma/migrations/20250823005001_add_api_token_expiry/migration.sql
new file mode 100644
index 0000000..c028e99
--- /dev/null
+++ b/prisma/migrations/20250823005001_add_api_token_expiry/migration.sql
@@ -0,0 +1,8 @@
+-- DropIndex
+DROP INDEX "GameTag_name_idx";
+
+-- AlterTable
+ALTER TABLE "APIToken" ADD COLUMN "expiresAt" TIMESTAMP(3);
+
+-- CreateIndex
+CREATE INDEX "GameTag_name_idx" ON "GameTag" USING GIST ("name" gist_trgm_ops(siglen=32));
diff --git a/prisma/models/app.prisma b/prisma/models/app.prisma
index 492c265..338af50 100644
--- a/prisma/models/app.prisma
+++ b/prisma/models/app.prisma
@@ -1,11 +1,13 @@
model ApplicationSettings {
timestamp DateTime @id @default(now())
- metadataProviders String[]
+ metadataProviders String[]
saveSlotCountLimit Int @default(5)
saveSlotSizeLimit Float @default(10) // MB
saveSlotHistoryLimit Int @default(3)
+
+ showGamePanelTextDecoration Boolean @default(true)
}
enum Platform {
@@ -13,3 +15,18 @@ enum Platform {
Linux @map("linux")
macOS @map("macos")
}
+
+enum LibraryBackend {
+ Filesystem
+ FlatFilesystem
+}
+
+model Library {
+ id String @id @default(uuid())
+ name String
+
+ backend LibraryBackend
+ options Json
+
+ games Game[]
+}
diff --git a/prisma/models/auth.prisma b/prisma/models/auth.prisma
index 2ff00de..8749cf6 100644
--- a/prisma/models/auth.prisma
+++ b/prisma/models/auth.prisma
@@ -11,7 +11,7 @@ model LinkedAuthMec {
version Int @default(1)
credentials Json
- user User @relation(fields: [userId], references: [id])
+ user User @relation(fields: [userId], references: [id], onDelete: Cascade)
@@id([userId, mec])
}
@@ -38,13 +38,15 @@ model APIToken {
name String
userId String?
- user User? @relation(fields: [userId], references: [id])
+ user User? @relation(fields: [userId], references: [id], onDelete: Cascade)
clientId String?
client Client? @relation(fields: [clientId], references: [id], onDelete: Cascade)
acls String[]
+ expiresAt DateTime?
+
@@index([token])
}
@@ -62,7 +64,7 @@ model Session {
expiresAt DateTime
userId String
- user User? @relation(fields: [userId], references: [id])
+ user User? @relation(fields: [userId], references: [id], onDelete: Cascade)
data Json // misc extra data
}
diff --git a/prisma/models/client.prisma b/prisma/models/client.prisma
index acff358..6dd7208 100644
--- a/prisma/models/client.prisma
+++ b/prisma/models/client.prisma
@@ -1,32 +1,22 @@
enum ClientCapabilities {
- PeerAPI @map("peerAPI") // other clients can use the HTTP API to P2P with this client
- UserStatus @map("userStatus") // this client can report this user's status (playing, online, etc etc)
- CloudSaves @map("cloudSaves") // ability to save to save slots
+ PeerAPI @map("peerAPI") // other clients can use the HTTP API to P2P with this client
+ UserStatus @map("userStatus") // this client can report this user's status (playing, online, etc etc)
+ CloudSaves @map("cloudSaves") // ability to save to save slots
+ TrackPlaytime @map("trackPlaytime") // ability to track user playtime
}
// References a device
model Client {
- id String @id @default(uuid())
- userId String
- user User @relation(fields: [userId], references: [id])
+ id String @id @default(uuid())
+ userId String
+ user User @relation(fields: [userId], references: [id], onDelete: Cascade)
- capabilities ClientCapabilities[]
+ capabilities ClientCapabilities[]
- name String
- platform Platform
- lastConnected DateTime
+ name String
+ platform Platform
+ lastConnected DateTime
- peerAPI ClientPeerAPIConfiguration?
-
- lastAccessedSaves SaveSlot[]
- tokens APIToken[]
-}
-
-model ClientPeerAPIConfiguration {
- id String @id @default(uuid())
-
- clientId String @unique
- client Client @relation(fields: [clientId], references: [id])
-
- endpoints String[]
+ lastAccessedSaves SaveSlot[]
+ tokens APIToken[]
}
diff --git a/prisma/models/collection.prisma b/prisma/models/collection.prisma
index 179ada5..5c8411c 100644
--- a/prisma/models/collection.prisma
+++ b/prisma/models/collection.prisma
@@ -4,7 +4,7 @@ model Collection {
isDefault Boolean @default(false)
userId String
- user User @relation(fields: [userId], references: [id])
+ user User @relation(fields: [userId], references: [id], onDelete: Cascade)
entries CollectionEntry[]
}
diff --git a/prisma/models/content.prisma b/prisma/models/content.prisma
index daaada3..3ab28be 100644
--- a/prisma/models/content.prisma
+++ b/prisma/models/content.prisma
@@ -1,129 +1,184 @@
enum MetadataSource {
- Manual
- GiantBomb
- PCGamingWiki
- IGDB
+ Manual
+ GiantBomb
+ PCGamingWiki
+ IGDB
+ Metacritic
+ OpenCritic
}
model Game {
- id String @id @default(uuid())
+ id String @id @default(uuid())
- metadataSource MetadataSource
- metadataId String
- created DateTime @default(now())
+ metadataSource MetadataSource
+ metadataId String
+ created DateTime @default(now())
- // Any field prefixed with m is filled in from metadata
- // Acts as a cache so we can search and filter it
- mName String // Name of game
- mShortDescription String // Short description
- mDescription String // Supports markdown
- mReleased DateTime // When the game was released
+ // Any field prefixed with m is filled in from metadata
+ // Acts as a cache so we can search and filter it
+ mName String // Name of game
+ mShortDescription String // Short description
+ mDescription String // Supports markdown
+ mReleased DateTime // When the game was released
- mReviewCount Int
- mReviewRating Float // 0 to 1
+ ratings GameRating[]
- mIconObjectId String // linked to objects in s3
- mBannerObjectId String // linked to objects in s3
- mCoverObjectId String
- mImageCarouselObjectIds String[] // linked to below array
- mImageLibraryObjectIds String[] // linked to objects in s3
+ featured Boolean @default(false)
- versions GameVersion[]
- libraryBasePath String @unique // Base dir for all the game versions
+ mIconObjectId String // linked to objects in s3
+ mBannerObjectId String // linked to objects in s3
+ mCoverObjectId String
+ mImageCarouselObjectIds String[] // linked to below array
+ mImageLibraryObjectIds String[] // linked to objects in s3
- collections CollectionEntry[]
- saves SaveSlot[]
- screenshots Screenshot[]
+ versions GameVersion[]
- developers Company[] @relation(name: "developers")
- publishers Company[] @relation(name: "publishers")
+ // These fields will not be optional in the next version
+ // Any game without a library ID will be assigned one at startup, based on the defaults
+ libraryId String?
+ library Library? @relation(fields: [libraryId], references: [id], onDelete: Cascade, onUpdate: Cascade)
+ libraryPath String
- @@unique([metadataSource, metadataId], name: "metadataKey")
+ collections CollectionEntry[]
+ saves SaveSlot[]
+ screenshots Screenshot[]
+ tags GameTag[]
+ playtime Playtime[]
+
+ developers Company[] @relation(name: "developers")
+ publishers Company[] @relation(name: "publishers")
+
+ @@unique([metadataSource, metadataId], name: "metadataKey")
+ @@unique([libraryId, libraryPath], name: "libraryKey")
+}
+
+model GameTag {
+ id String @id @default(uuid())
+ name String @unique
+
+ games Game[]
+
+ @@index([name(ops: raw("gist_trgm_ops(siglen=32)"))], type: Gist)
+}
+
+
+model GameRating {
+ id String @id @default(uuid())
+
+ metadataSource MetadataSource
+ metadataId String
+ created DateTime @default(now())
+
+ mReviewCount Int
+ mReviewRating Float // 0 to 1
+
+ mReviewHref String?
+
+ game Game @relation(fields: [gameId], references: [id], onDelete: Cascade)
+ gameId String
+
+ @@unique([metadataSource, metadataId], name: "metadataKey")
}
// A particular set of files that relate to the version
model GameVersion {
- gameId String
- game Game @relation(fields: [gameId], references: [id], onDelete: Cascade)
- versionName String // Sub directory for the game files
+ gameId String
+ game Game @relation(fields: [gameId], references: [id], onDelete: Cascade)
+ versionName String // Sub directory for the game files
- created DateTime @default(now())
+ created DateTime @default(now())
- platform Platform
+ platform Platform
- launchCommand String @default("") // Command to run to start. Platform-specific. Windows games on Linux will wrap this command in Proton/Wine
- launchArgs String[]
- setupCommand String @default("") // Command to setup game (dependencies and such)
- setupArgs String[]
- onlySetup Boolean @default(false)
+ launchCommand String @default("") // Command to run to start. Platform-specific. Windows games on Linux will wrap this command in Proton/Wine
+ launchArgs String[]
+ setupCommand String @default("") // Command to setup game (dependencies and such)
+ setupArgs String[]
+ onlySetup Boolean @default(false)
- umuIdOverride String?
+ umuIdOverride String?
- dropletManifest Json // Results from droplet
+ dropletManifest Json // Results from droplet
- versionIndex Int
- delta Boolean @default(false)
+ versionIndex Int
+ delta Boolean @default(false)
- @@id([gameId, versionName])
+ @@id([gameId, versionName])
}
// A save slot for a game
model SaveSlot {
- gameId String
- game Game @relation(fields: [gameId], references: [id], onDelete: Cascade)
- userId String
- user User @relation(fields: [userId], references: [id], onDelete: Cascade)
- index Int
+ gameId String
+ game Game @relation(fields: [gameId], references: [id], onDelete: Cascade)
+ userId String
+ user User @relation(fields: [userId], references: [id], onDelete: Cascade)
+ index Int
- createdAt DateTime @default(now())
- playtime Float @default(0) // hours
+ createdAt DateTime @default(now())
+ playtime Float @default(0) // hours
- lastUsedClientId String?
- lastUsedClient Client? @relation(fields: [lastUsedClientId], references: [id])
+ lastUsedClientId String?
+ lastUsedClient Client? @relation(fields: [lastUsedClientId], references: [id])
- historyObjectIds String[] // list of objects
- historyChecksums String[] // list of hashes
+ historyObjectIds String[] // list of objects
+ historyChecksums String[] // list of hashes
- @@id([gameId, userId, index], name: "id")
+ @@id([gameId, userId, index], name: "id")
}
model Screenshot {
- id String @id @default(uuid())
+ id String @id @default(uuid())
- gameId String
- game Game @relation(fields: [gameId], references: [id], onDelete: Cascade)
- userId String
- user User @relation(fields: [userId], references: [id], onDelete: Cascade)
+ gameId String
+ game Game @relation(fields: [gameId], references: [id], onDelete: Cascade)
+ userId String
+ user User @relation(fields: [userId], references: [id], onDelete: Cascade)
- objectId String
- private Boolean @default(true)
+ objectId String
+ private Boolean // if other users can see
- createdAt DateTime @default(now()) @db.Timestamptz(0)
+ createdAt DateTime @default(now()) @db.Timestamptz(0)
- @@index([gameId, userId])
+ @@index([gameId, userId])
+ @@index([userId])
+}
+
+model Playtime {
+ gameId String
+ game Game @relation(fields: [gameId], references: [id], onDelete: Cascade)
+ userId String
+ user User @relation(fields: [userId], references: [id], onDelete: Cascade)
+
+ seconds Int // seconds user has spent playing the game
+
+ updatedAt DateTime @updatedAt @db.Timestamptz(6)
+ createdAt DateTime @default(now()) @db.Timestamptz(6)
+
+ @@id([gameId, userId])
+ @@index([userId])
}
model Company {
- id String @id @default(uuid())
+ id String @id @default(uuid())
- metadataSource MetadataSource
- metadataId String
- metadataOriginalQuery String
+ metadataSource MetadataSource
+ metadataId String
+ metadataOriginalQuery String
- mName String
- mShortDescription String
- mDescription String
- mLogoObjectId String
- mBannerObjectId String
- mWebsite String
+ mName String
+ mShortDescription String
+ mDescription String
+ mLogoObjectId String
+ mBannerObjectId String
+ mWebsite String
- developed Game[] @relation(name: "developers")
- published Game[] @relation(name: "publishers")
+ developed Game[] @relation(name: "developers")
+ published Game[] @relation(name: "publishers")
- @@unique([metadataSource, metadataId], name: "metadataKey")
+ @@unique([metadataSource, metadataId], name: "metadataKey")
}
model ObjectHash {
- id String @id
- hash String
+ id String @id
+ hash String
}
diff --git a/prisma/models/news.prisma b/prisma/models/news.prisma
index dcc25ec..496994f 100644
--- a/prisma/models/news.prisma
+++ b/prisma/models/news.prisma
@@ -1,4 +1,4 @@
-model Tag {
+model NewsTag {
id String @id @default(uuid())
name String @unique
@@ -11,11 +11,11 @@ model Article {
description String
content String @db.Text
- tags Tag[]
+ tags NewsTag[]
imageObjectId String? // Object ID
publishedAt DateTime @default(now())
- author User? @relation(fields: [authorId], references: [id]) // Optional, if no user, it's a system post
+ author User? @relation(fields: [authorId], references: [id], onDelete: Cascade) // Optional, if no user, it's a system post
authorId String?
}
diff --git a/prisma/models/task.prisma b/prisma/models/task.prisma
new file mode 100644
index 0000000..9edac6f
--- /dev/null
+++ b/prisma/models/task.prisma
@@ -0,0 +1,17 @@
+model Task {
+ id String
+ taskGroup String
+ name String
+
+ started DateTime
+ ended DateTime
+
+ success Boolean
+ error Json?
+ progress Float
+ log String[]
+
+ acls String[]
+
+ @@id([id, started])
+}
diff --git a/prisma/models/user.prisma b/prisma/models/user.prisma
index 20f1c60..e3a1938 100644
--- a/prisma/models/user.prisma
+++ b/prisma/models/user.prisma
@@ -19,15 +19,17 @@ model User {
saves SaveSlot[]
screenshots Screenshot[]
+ playtime Playtime[]
}
model Notification {
id String @id @default(uuid())
- nonce String? @unique
+ nonce String?
userId String
- user User @relation(fields: [userId], references: [id])
+ user User @relation(fields: [userId], references: [id], onDelete: Cascade)
+ acls String[]
created DateTime @default(now())
title String
@@ -35,4 +37,6 @@ model Notification {
actions String[]
read Boolean @default(false)
+
+ @@unique([userId, nonce])
}
diff --git a/prisma/schema.prisma b/prisma/schema.prisma
index 7765176..8fc2d88 100644
--- a/prisma/schema.prisma
+++ b/prisma/schema.prisma
@@ -1,14 +1,24 @@
// This is your Prisma schema file,
// learn more about it in the docs: https://pris.ly/d/prisma-schema
+// see https://github.com/prisma/prisma/issues/27486 why driverAdapters can't be used
+// TLDR: vite removes it during bundling it or something like that
generator client {
provider = "prisma-client"
output = "client"
- moduleFormat = "esm"
- previewFeatures = ["fullTextSearchPostgres"]
+ previewFeatures = ["fullTextSearchPostgres", "relationJoins"]
binaryTargets = ["native", "debian-openssl-3.0.x"]
}
+/**
+ * generator arktype {
+ * provider = "yarn prismark"
+ * output = "./validate"
+ * fileName = "schema.ts"
+ * nullish = true
+ * }
+ */
+
datasource db {
provider = "postgresql"
url = env("DATABASE_URL")
diff --git a/public/game-panel-placeholder.png b/public/game-panel-placeholder.png
new file mode 100644
index 0000000..4a7989b
Binary files /dev/null and b/public/game-panel-placeholder.png differ
diff --git a/public/robots.txt b/public/robots.txt
index 8b13789..1f53798 100644
--- a/public/robots.txt
+++ b/public/robots.txt
@@ -1 +1,2 @@
-
+User-agent: *
+Disallow: /
diff --git a/public/wallpapers/news-placeholder.jpg b/public/wallpapers/news-placeholder.jpg
new file mode 100644
index 0000000..4cb9046
Binary files /dev/null and b/public/wallpapers/news-placeholder.jpg differ
diff --git a/server/api/v1/admin/auth/index.get.ts b/server/api/v1/admin/auth/index.get.ts
index 75ffc2c..4ea1523 100644
--- a/server/api/v1/admin/auth/index.get.ts
+++ b/server/api/v1/admin/auth/index.get.ts
@@ -1,11 +1,13 @@
-import { AuthMec } from "~/prisma/client";
+import { AuthMec } from "~/prisma/client/enums";
import aclManager from "~/server/internal/acls";
-import { enabledAuthManagers } from "~/server/plugins/04.auth-init";
+import authManager from "~/server/internal/auth";
export default defineEventHandler(async (h3) => {
- const allowed = await aclManager.allowSystemACL(h3, ["auth:read"]);
+ const allowed = await aclManager.allowSystemACL(h3, ["auth:read", "setup"]);
if (!allowed) throw createError({ statusCode: 403 });
+ const enabledAuthManagers = authManager.getAuthProviders();
+
const authData = {
[AuthMec.Simple]: enabledAuthManagers.Simple,
[AuthMec.OpenID]:
diff --git a/server/api/v1/admin/auth/invitation/index.delete.ts b/server/api/v1/admin/auth/invitation/index.delete.ts
index 381dea3..195aae5 100644
--- a/server/api/v1/admin/auth/invitation/index.delete.ts
+++ b/server/api/v1/admin/auth/invitation/index.delete.ts
@@ -1,20 +1,22 @@
+import { type } from "arktype";
+import { readDropValidatedBody, throwingArktype } from "~/server/arktype";
import aclManager from "~/server/internal/acls";
import prisma from "~/server/internal/db/database";
-export default defineEventHandler(async (h3) => {
+const DeleteInvite = type({
+ id: "string",
+}).configure(throwingArktype);
+
+export default defineEventHandler<{
+ body: typeof DeleteInvite.infer;
+}>(async (h3) => {
const allowed = await aclManager.allowSystemACL(h3, [
"auth:simple:invitation:delete",
]);
if (!allowed) throw createError({ statusCode: 403 });
- const body = await readBody(h3);
- const id = body.id;
- if (!id)
- throw createError({
- statusCode: 400,
- statusMessage: "id required for deletion",
- });
+ const body = await readDropValidatedBody(h3, DeleteInvite);
- await prisma.invitation.delete({ where: { id: id } });
+ await prisma.invitation.delete({ where: { id: body.id } });
return {};
});
diff --git a/server/api/v1/admin/auth/invitation/index.get.ts b/server/api/v1/admin/auth/invitation/index.get.ts
index e0b6881..0724e49 100644
--- a/server/api/v1/admin/auth/invitation/index.get.ts
+++ b/server/api/v1/admin/auth/invitation/index.get.ts
@@ -1,5 +1,7 @@
import aclManager from "~/server/internal/acls";
+import { systemConfig } from "~/server/internal/config/sys-conf";
import prisma from "~/server/internal/db/database";
+import taskHandler from "~/server/internal/tasks";
export default defineEventHandler(async (h3) => {
const allowed = await aclManager.allowSystemACL(h3, [
@@ -7,8 +9,15 @@ export default defineEventHandler(async (h3) => {
]);
if (!allowed) throw createError({ statusCode: 403 });
- await runTask("cleanup:invitations");
+ await taskHandler.runTaskGroupByName("cleanup:invitations");
+ const externalUrl = systemConfig.getExternalUrl();
const invitations = await prisma.invitation.findMany({});
- return invitations;
+
+ return invitations.map((invitation) => {
+ return {
+ ...invitation,
+ inviteUrl: `${externalUrl}/auth/register?id=${invitation.id}`,
+ };
+ });
});
diff --git a/server/api/v1/admin/auth/invitation/index.post.ts b/server/api/v1/admin/auth/invitation/index.post.ts
index 015557e..69d3649 100644
--- a/server/api/v1/admin/auth/invitation/index.post.ts
+++ b/server/api/v1/admin/auth/invitation/index.post.ts
@@ -1,41 +1,31 @@
+import { readDropValidatedBody, throwingArktype } from "~/server/arktype";
import aclManager from "~/server/internal/acls";
import prisma from "~/server/internal/db/database";
+import { SharedRegisterValidator } from "../../../auth/signup/simple.post";
+import { systemConfig } from "~/server/internal/config/sys-conf";
+
+const CreateInvite = SharedRegisterValidator.partial()
+ .and({
+ expires: "string",
+ isAdmin: "boolean = false",
+ })
+ .configure(throwingArktype);
export default defineEventHandler(async (h3) => {
const allowed = await aclManager.allowSystemACL(h3, [
"auth:simple:invitation:new",
+ "setup",
]);
if (!allowed) throw createError({ statusCode: 403 });
- const body = await readBody(h3);
- const isAdmin = body.isAdmin;
- const username = body.username;
- const email = body.email;
- const expires = body.expires;
-
- if (!expires)
- throw createError({ statusCode: 400, statusMessage: "No expires field." });
- if (isAdmin !== undefined && typeof isAdmin !== "boolean")
- throw createError({
- statusCode: 400,
- statusMessage: "isAdmin must be a boolean",
- });
-
- const expiresDate = new Date(expires);
- if (!(expiresDate instanceof Date && !isNaN(expiresDate.getTime())))
- throw createError({
- statusCode: 400,
- statusMessage: "Invalid expires date",
- });
+ const body = await readDropValidatedBody(h3, CreateInvite);
const invitation = await prisma.invitation.create({
- data: {
- isAdmin: isAdmin,
- username: username,
- email: email,
- expires: expiresDate,
- },
+ data: body,
});
- return invitation;
+ return {
+ ...invitation,
+ inviteUrl: `${systemConfig.getExternalUrl()}/auth/register?id=${invitation.id}`,
+ };
});
diff --git a/server/api/v1/admin/company/[id]/banner.post.ts b/server/api/v1/admin/company/[id]/banner.post.ts
new file mode 100644
index 0000000..0c8744a
--- /dev/null
+++ b/server/api/v1/admin/company/[id]/banner.post.ts
@@ -0,0 +1,51 @@
+import aclManager from "~/server/internal/acls";
+import prisma from "~/server/internal/db/database";
+import objectHandler from "~/server/internal/objects";
+import { handleFileUpload } from "~/server/internal/utils/handlefileupload";
+
+export default defineEventHandler(async (h3) => {
+ const allowed = await aclManager.allowSystemACL(h3, ["company:update"]);
+ if (!allowed) throw createError({ statusCode: 403 });
+
+ const companyId = getRouterParam(h3, "id")!;
+ const company = await prisma.company.findUnique({
+ where: {
+ id: companyId,
+ },
+ });
+
+ if (!company)
+ throw createError({ statusCode: 400, statusMessage: "Invalid company id" });
+
+ const result = await handleFileUpload(h3, {}, ["internal:read"], 1);
+ if (!result)
+ throw createError({
+ statusCode: 400,
+ statusMessage: "File upload required (multipart form)",
+ });
+
+ const [ids, , pull, dump] = result;
+ const id = ids.at(0);
+ if (!id)
+ throw createError({
+ statusCode: 400,
+ statusMessage: "Upload at least one file.",
+ });
+
+ try {
+ await objectHandler.deleteAsSystem(company.mBannerObjectId);
+ await prisma.company.update({
+ where: {
+ id: companyId,
+ },
+ data: {
+ mBannerObjectId: id,
+ },
+ });
+ await pull();
+ } catch {
+ await dump();
+ }
+
+ return { id: id };
+});
diff --git a/server/api/v1/admin/company/[id]/game.delete.ts b/server/api/v1/admin/company/[id]/game.delete.ts
new file mode 100644
index 0000000..0a9fe21
--- /dev/null
+++ b/server/api/v1/admin/company/[id]/game.delete.ts
@@ -0,0 +1,37 @@
+import { type } from "arktype";
+import { readDropValidatedBody, throwingArktype } from "~/server/arktype";
+import aclManager from "~/server/internal/acls";
+import prisma from "~/server/internal/db/database";
+
+const GameDelete = type({
+ id: "string",
+}).configure(throwingArktype);
+
+export default defineEventHandler(async (h3) => {
+ const allowed = await aclManager.allowSystemACL(h3, ["company:update"]);
+ if (!allowed) throw createError({ statusCode: 403 });
+
+ const companyId = getRouterParam(h3, "id")!;
+
+ const body = await readDropValidatedBody(h3, GameDelete);
+
+ await prisma.game.update({
+ where: {
+ id: body.id,
+ },
+ data: {
+ publishers: {
+ disconnect: {
+ id: companyId,
+ },
+ },
+ developers: {
+ disconnect: {
+ id: companyId,
+ },
+ },
+ },
+ });
+
+ return;
+});
diff --git a/server/api/v1/admin/company/[id]/game.patch.ts b/server/api/v1/admin/company/[id]/game.patch.ts
new file mode 100644
index 0000000..9e0260f
--- /dev/null
+++ b/server/api/v1/admin/company/[id]/game.patch.ts
@@ -0,0 +1,37 @@
+import { type } from "arktype";
+import { readDropValidatedBody, throwingArktype } from "~/server/arktype";
+import aclManager from "~/server/internal/acls";
+import prisma from "~/server/internal/db/database";
+
+const GamePatch = type({
+ action: "'developed' | 'published'",
+ enabled: "boolean",
+ id: "string",
+}).configure(throwingArktype);
+
+export default defineEventHandler(async (h3) => {
+ const allowed = await aclManager.allowSystemACL(h3, ["company:update"]);
+ if (!allowed) throw createError({ statusCode: 403 });
+
+ const companyId = getRouterParam(h3, "id")!;
+
+ const body = await readDropValidatedBody(h3, GamePatch);
+
+ const action = body.action === "developed" ? "developers" : "publishers";
+ const actionType = body.enabled ? "connect" : "disconnect";
+
+ await prisma.game.update({
+ where: {
+ id: body.id,
+ },
+ data: {
+ [action]: {
+ [actionType]: {
+ id: companyId,
+ },
+ },
+ },
+ });
+
+ return;
+});
diff --git a/server/api/v1/admin/company/[id]/game.post.ts b/server/api/v1/admin/company/[id]/game.post.ts
new file mode 100644
index 0000000..f873118
--- /dev/null
+++ b/server/api/v1/admin/company/[id]/game.post.ts
@@ -0,0 +1,69 @@
+import { type } from "arktype";
+import { readDropValidatedBody, throwingArktype } from "~/server/arktype";
+import aclManager from "~/server/internal/acls";
+import prisma from "~/server/internal/db/database";
+
+const GamePost = type({
+ published: "boolean",
+ developed: "boolean",
+ id: "string",
+}).configure(throwingArktype);
+
+export default defineEventHandler(async (h3) => {
+ const allowed = await aclManager.allowSystemACL(h3, ["company:update"]);
+ if (!allowed) throw createError({ statusCode: 403 });
+
+ const companyId = getRouterParam(h3, "id")!;
+
+ const body = await readDropValidatedBody(h3, GamePost);
+
+ if (!body.published && !body.developed)
+ throw createError({
+ statusCode: 400,
+ statusMessage: "Must be related (either developed or published).",
+ });
+
+ const publisherConnect = body.published
+ ? {
+ publishers: {
+ connect: {
+ id: companyId,
+ },
+ },
+ }
+ : undefined;
+
+ const developerConnect = body.developed
+ ? {
+ developers: {
+ connect: {
+ id: companyId,
+ },
+ },
+ }
+ : undefined;
+
+ const game = await prisma.game.update({
+ where: {
+ id: body.id,
+ },
+ data: {
+ ...publisherConnect,
+ ...developerConnect,
+ },
+ include: {
+ publishers: {
+ select: {
+ id: true,
+ },
+ },
+ developers: {
+ select: {
+ id: true,
+ },
+ },
+ },
+ });
+
+ return game;
+});
diff --git a/server/api/v1/admin/company/[id]/icon.post.ts b/server/api/v1/admin/company/[id]/icon.post.ts
new file mode 100644
index 0000000..0a4cefd
--- /dev/null
+++ b/server/api/v1/admin/company/[id]/icon.post.ts
@@ -0,0 +1,51 @@
+import aclManager from "~/server/internal/acls";
+import prisma from "~/server/internal/db/database";
+import objectHandler from "~/server/internal/objects";
+import { handleFileUpload } from "~/server/internal/utils/handlefileupload";
+
+export default defineEventHandler(async (h3) => {
+ const allowed = await aclManager.allowSystemACL(h3, ["company:update"]);
+ if (!allowed) throw createError({ statusCode: 403 });
+
+ const companyId = getRouterParam(h3, "id")!;
+ const company = await prisma.company.findUnique({
+ where: {
+ id: companyId,
+ },
+ });
+
+ if (!company)
+ throw createError({ statusCode: 400, statusMessage: "Invalid company id" });
+
+ const result = await handleFileUpload(h3, {}, ["internal:read"], 1);
+ if (!result)
+ throw createError({
+ statusCode: 400,
+ statusMessage: "File upload required (multipart form)",
+ });
+
+ const [ids, , pull, dump] = result;
+ const id = ids.at(0);
+ if (!id)
+ throw createError({
+ statusCode: 400,
+ statusMessage: "Upload at least one file.",
+ });
+
+ try {
+ await objectHandler.deleteAsSystem(company.mLogoObjectId);
+ await prisma.company.update({
+ where: {
+ id: companyId,
+ },
+ data: {
+ mLogoObjectId: id,
+ },
+ });
+ await pull();
+ } catch {
+ await dump();
+ }
+
+ return { id: id };
+});
diff --git a/server/api/v1/admin/company/[id]/index.delete.ts b/server/api/v1/admin/company/[id]/index.delete.ts
new file mode 100644
index 0000000..b27d393
--- /dev/null
+++ b/server/api/v1/admin/company/[id]/index.delete.ts
@@ -0,0 +1,14 @@
+import aclManager from "~/server/internal/acls";
+import prisma from "~/server/internal/db/database";
+
+export default defineEventHandler(async (h3) => {
+ const allowed = await aclManager.allowSystemACL(h3, ["company:delete"]);
+ if (!allowed) throw createError({ statusCode: 403 });
+
+ const id = getRouterParam(h3, "id")!;
+
+ const company = await prisma.company.deleteMany({ where: { id } });
+ if (company.count == 0)
+ throw createError({ statusCode: 404, statusMessage: "Company not found" });
+ return;
+});
diff --git a/server/api/v1/admin/company/[id]/index.get.ts b/server/api/v1/admin/company/[id]/index.get.ts
new file mode 100644
index 0000000..50c4115
--- /dev/null
+++ b/server/api/v1/admin/company/[id]/index.get.ts
@@ -0,0 +1,54 @@
+import aclManager from "~/server/internal/acls";
+import prisma from "~/server/internal/db/database";
+
+export default defineEventHandler(async (h3) => {
+ const allowed = await aclManager.allowSystemACL(h3, ["company:read"]);
+ if (!allowed) throw createError({ statusCode: 403 });
+
+ const id = getRouterParam(h3, "id")!;
+
+ const company = await prisma.company.findUnique({
+ where: { id },
+ include: {
+ published: {
+ select: {
+ id: true,
+ },
+ },
+ developed: {
+ select: {
+ id: true,
+ },
+ },
+ },
+ });
+ if (!company)
+ throw createError({ statusCode: 404, statusMessage: "Company not found" });
+ const games = await prisma.game.findMany({
+ where: {
+ OR: [
+ {
+ developers: {
+ some: {
+ id: company.id,
+ },
+ },
+ },
+ {
+ publishers: {
+ some: {
+ id: company.id,
+ },
+ },
+ },
+ ],
+ },
+ distinct: ["id"],
+ });
+ const companyFlatten = {
+ ...company,
+ developed: company.developed.map((e) => e.id),
+ published: company.published.map((e) => e.id),
+ };
+ return { company: companyFlatten, games };
+});
diff --git a/server/api/v1/admin/company/[id]/index.patch.ts b/server/api/v1/admin/company/[id]/index.patch.ts
new file mode 100644
index 0000000..74511e2
--- /dev/null
+++ b/server/api/v1/admin/company/[id]/index.patch.ts
@@ -0,0 +1,23 @@
+import aclManager from "~/server/internal/acls";
+import prisma from "~/server/internal/db/database";
+
+export default defineEventHandler(async (h3) => {
+ const allowed = await aclManager.allowSystemACL(h3, ["company:update"]);
+ if (!allowed) throw createError({ statusCode: 403 });
+
+ const body = await readBody(h3);
+ const id = getRouterParam(h3, "id")!;
+
+ const restOfTheBody = { ...body };
+ delete restOfTheBody["id"];
+
+ const newObj = await prisma.company.update({
+ where: {
+ id: id,
+ },
+ data: restOfTheBody,
+ // I would put a select here, but it would be based on the body, and muck up the types
+ });
+
+ return newObj;
+});
diff --git a/server/api/v1/admin/company/index.get.ts b/server/api/v1/admin/company/index.get.ts
new file mode 100644
index 0000000..dac5ae2
--- /dev/null
+++ b/server/api/v1/admin/company/index.get.ts
@@ -0,0 +1,10 @@
+import aclManager from "~/server/internal/acls";
+import prisma from "~/server/internal/db/database";
+
+export default defineEventHandler(async (h3) => {
+ const allowed = await aclManager.allowSystemACL(h3, ["company:read"]);
+ if (!allowed) throw createError({ statusCode: 403 });
+
+ const companies = await prisma.company.findMany({});
+ return companies;
+});
diff --git a/server/api/v1/admin/company/index.post.ts b/server/api/v1/admin/company/index.post.ts
new file mode 100644
index 0000000..cbea4a1
--- /dev/null
+++ b/server/api/v1/admin/company/index.post.ts
@@ -0,0 +1,47 @@
+import { type } from "arktype";
+import { readDropValidatedBody, throwingArktype } from "~/server/arktype";
+import aclManager from "~/server/internal/acls";
+import * as jdenticon from "jdenticon";
+import { ObjectTransactionalHandler } from "~/server/internal/objects/transactional";
+import prisma from "~/server/internal/db/database";
+import { MetadataSource } from "~/prisma/client/enums";
+
+const CompanyCreate = type({
+ name: "string",
+ description: "string",
+ website: "string",
+}).configure(throwingArktype);
+
+export default defineEventHandler(async (h3) => {
+ const allowed = await aclManager.allowSystemACL(h3, ["company:create"]);
+ if (!allowed) throw createError({ statusCode: 403 });
+
+ const body = await readDropValidatedBody(h3, CompanyCreate);
+ const obj = new ObjectTransactionalHandler();
+ const [register, pull, _] = obj.new({}, ["internal:read"]);
+
+ const icon = jdenticon.toPng(body.name, 512);
+ const logoId = register(icon);
+
+ const banner = jdenticon.toPng(body.description, 1024);
+ const bannerId = register(banner);
+
+ const company = await prisma.company.create({
+ data: {
+ metadataSource: MetadataSource.Manual,
+ metadataId: crypto.randomUUID(),
+ metadataOriginalQuery: "",
+
+ mName: body.name,
+ mShortDescription: body.description,
+ mDescription: "",
+ mLogoObjectId: logoId,
+ mBannerObjectId: bannerId,
+ mWebsite: body.website,
+ },
+ });
+
+ await pull();
+
+ return company;
+});
diff --git a/server/api/v1/admin/game/index.delete.ts b/server/api/v1/admin/game/[id]/index.delete.ts
similarity index 67%
rename from server/api/v1/admin/game/index.delete.ts
rename to server/api/v1/admin/game/[id]/index.delete.ts
index 6775177..2a0645d 100644
--- a/server/api/v1/admin/game/index.delete.ts
+++ b/server/api/v1/admin/game/[id]/index.delete.ts
@@ -5,13 +5,7 @@ export default defineEventHandler(async (h3) => {
const allowed = await aclManager.allowSystemACL(h3, ["game:delete"]);
if (!allowed) throw createError({ statusCode: 403 });
- const query = getQuery(h3);
- const gameId = query.id?.toString();
- if (!gameId)
- throw createError({
- statusCode: 400,
- statusMessage: "Missing id in query",
- });
+ const gameId = getRouterParam(h3, "id")!;
await prisma.game.delete({
where: {
diff --git a/server/api/v1/admin/game/[id]/index.get.ts b/server/api/v1/admin/game/[id]/index.get.ts
new file mode 100644
index 0000000..faf0f1c
--- /dev/null
+++ b/server/api/v1/admin/game/[id]/index.get.ts
@@ -0,0 +1,37 @@
+import aclManager from "~/server/internal/acls";
+import prisma from "~/server/internal/db/database";
+import libraryManager from "~/server/internal/library";
+
+export default defineEventHandler(async (h3) => {
+ const allowed = await aclManager.allowSystemACL(h3, ["game:read"]);
+ if (!allowed) throw createError({ statusCode: 403 });
+
+ const gameId = getRouterParam(h3, "id")!;
+
+ const game = await prisma.game.findUnique({
+ where: {
+ id: gameId,
+ },
+ include: {
+ versions: {
+ orderBy: {
+ versionIndex: "asc",
+ },
+ omit: {
+ dropletManifest: true,
+ },
+ },
+ tags: true,
+ },
+ });
+
+ if (!game || !game.libraryId)
+ throw createError({ statusCode: 404, statusMessage: "Game ID not found" });
+
+ const unimportedVersions = await libraryManager.fetchUnimportedGameVersions(
+ game.libraryId,
+ game.libraryPath,
+ );
+
+ return { game, unimportedVersions };
+});
diff --git a/server/api/v1/admin/game/index.patch.ts b/server/api/v1/admin/game/[id]/index.patch.ts
similarity index 84%
rename from server/api/v1/admin/game/index.patch.ts
rename to server/api/v1/admin/game/[id]/index.patch.ts
index 238dc8e..410adee 100644
--- a/server/api/v1/admin/game/index.patch.ts
+++ b/server/api/v1/admin/game/[id]/index.patch.ts
@@ -6,9 +6,7 @@ export default defineEventHandler(async (h3) => {
if (!allowed) throw createError({ statusCode: 403 });
const body = await readBody(h3);
- const id = body.id;
- if (!id)
- throw createError({ statusCode: 400, statusMessage: "Missing id in body" });
+ const id = getRouterParam(h3, "id")!;
const restOfTheBody = { ...body };
delete restOfTheBody["id"];
diff --git a/server/api/v1/admin/game/metadata.post.ts b/server/api/v1/admin/game/[id]/metadata.post.ts
similarity index 57%
rename from server/api/v1/admin/game/metadata.post.ts
rename to server/api/v1/admin/game/[id]/metadata.post.ts
index 59b7dd2..cd1dcbc 100644
--- a/server/api/v1/admin/game/metadata.post.ts
+++ b/server/api/v1/admin/game/[id]/metadata.post.ts
@@ -1,3 +1,4 @@
+import type { Prisma } from "~/prisma/client/client";
import aclManager from "~/server/internal/acls";
import prisma from "~/server/internal/db/database";
import { handleFileUpload } from "~/server/internal/utils/handlefileupload";
@@ -13,39 +14,49 @@ export default defineEventHandler(async (h3) => {
statusMessage: "This endpoint requires multipart form data.",
});
- const uploadResult = await handleFileUpload(h3, {}, ["internal:read"]);
+ const gameId = getRouterParam(h3, "id")!;
+
+ const uploadResult = await handleFileUpload(h3, {}, ["internal:read"], 1);
if (!uploadResult)
throw createError({
statusCode: 400,
statusMessage: "Failed to upload file",
});
- const [id, options, pull, dump] = uploadResult;
+ const [ids, options, pull, dump] = uploadResult;
+
+ const id = ids.at(0);
// handleFileUpload reads the rest of the options for us.
const name = options.name;
const description = options.description;
- const gameId = options.id;
- if (!id || !name || !description) {
+ const updateModel: Prisma.GameUpdateInput = {
+ mName: name,
+ mShortDescription: description,
+ };
+
+ // handle if user uploaded new icon
+ if (id) {
+ updateModel.mIconObjectId = id;
+ await pull();
+ } else {
dump();
-
- throw createError({
- statusCode: 400,
- statusMessage: "Nothing has changed",
- });
}
- await pull();
+ // If the API call doesn't provide values, don't set them
+ for (const [key, value] of Object.entries(updateModel)) {
+ if (value === undefined) {
+ // eslint-disable-next-line @typescript-eslint/no-dynamic-delete
+ delete updateModel[key as keyof typeof updateModel];
+ }
+ }
+
const newObject = await prisma.game.update({
where: {
id: gameId,
},
- data: {
- mIconObjectId: id,
- mName: name,
- mShortDescription: description,
- },
+ data: updateModel,
});
return newObject;
diff --git a/server/api/v1/admin/game/[id]/tags.patch.ts b/server/api/v1/admin/game/[id]/tags.patch.ts
new file mode 100644
index 0000000..d7192ad
--- /dev/null
+++ b/server/api/v1/admin/game/[id]/tags.patch.ts
@@ -0,0 +1,29 @@
+import { type } from "arktype";
+import { readDropValidatedBody, throwingArktype } from "~/server/arktype";
+import aclManager from "~/server/internal/acls";
+import prisma from "~/server/internal/db/database";
+
+const PatchTags = type({
+ tags: "string[]",
+}).configure(throwingArktype);
+
+export default defineEventHandler(async (h3) => {
+ const allowed = await aclManager.allowSystemACL(h3, ["game:update"]);
+ if (!allowed) throw createError({ statusCode: 403 });
+
+ const body = await readDropValidatedBody(h3, PatchTags);
+ const id = getRouterParam(h3, "id")!;
+
+ await prisma.game.update({
+ where: {
+ id,
+ },
+ data: {
+ tags: {
+ connect: body.tags.map((e) => ({ id: e })),
+ },
+ },
+ });
+
+ return;
+});
diff --git a/server/api/v1/admin/game/image/index.delete.ts b/server/api/v1/admin/game/image/index.delete.ts
index 3558584..d89ae76 100644
--- a/server/api/v1/admin/game/image/index.delete.ts
+++ b/server/api/v1/admin/game/image/index.delete.ts
@@ -1,21 +1,25 @@
import aclManager from "~/server/internal/acls";
import prisma from "~/server/internal/db/database";
import objectHandler from "~/server/internal/objects";
+import { type } from "arktype";
+import { readDropValidatedBody, throwingArktype } from "~/server/arktype";
-export default defineEventHandler(async (h3) => {
+const DeleteGameImage = type({
+ gameId: "string",
+ imageId: "string",
+}).configure(throwingArktype);
+
+export default defineEventHandler<{
+ body: typeof DeleteGameImage.infer;
+}>(async (h3) => {
const allowed = await aclManager.allowSystemACL(h3, ["game:image:delete"]);
if (!allowed) throw createError({ statusCode: 403 });
- const body = await readBody(h3);
+ const body = await readDropValidatedBody(h3, DeleteGameImage);
+
const gameId = body.gameId;
const imageId = body.imageId;
- if (!gameId || !imageId)
- throw createError({
- statusCode: 400,
- statusMessage: "Missing gameId or imageId in body",
- });
-
const game = await prisma.game.findUnique({
where: {
id: gameId,
diff --git a/server/api/v1/admin/game/image/index.post.ts b/server/api/v1/admin/game/image/index.post.ts
index 7ff453d..e230e9f 100644
--- a/server/api/v1/admin/game/image/index.post.ts
+++ b/server/api/v1/admin/game/image/index.post.ts
@@ -20,8 +20,8 @@ export default defineEventHandler(async (h3) => {
statusMessage: "Failed to upload file",
});
- const [id, options, pull, dump] = uploadResult;
- if (!id) {
+ const [ids, options, pull, dump] = uploadResult;
+ if (ids.length == 0) {
dump();
throw createError({
statusCode: 400,
@@ -48,7 +48,7 @@ export default defineEventHandler(async (h3) => {
},
data: {
mImageLibraryObjectIds: {
- push: id,
+ push: ids,
},
},
});
diff --git a/server/api/v1/admin/game/index.get.ts b/server/api/v1/admin/game/index.get.ts
index 5e3979d..c7ca363 100644
--- a/server/api/v1/admin/game/index.get.ts
+++ b/server/api/v1/admin/game/index.get.ts
@@ -1,44 +1,16 @@
import aclManager from "~/server/internal/acls";
import prisma from "~/server/internal/db/database";
-import libraryManager from "~/server/internal/library";
export default defineEventHandler(async (h3) => {
const allowed = await aclManager.allowSystemACL(h3, ["game:read"]);
if (!allowed) throw createError({ statusCode: 403 });
- const query = getQuery(h3);
- const gameId = query.id?.toString();
- if (!gameId)
- throw createError({
- statusCode: 400,
- statusMessage: "Missing id in query",
- });
-
- const game = await prisma.game.findUnique({
- where: {
- id: gameId,
- },
- include: {
- versions: {
- orderBy: {
- versionIndex: "asc",
- },
- select: {
- versionIndex: true,
- versionName: true,
- platform: true,
- delta: true,
- },
- },
+ return await prisma.game.findMany({
+ select: {
+ id: true,
+ mName: true,
+ mShortDescription: true,
+ mIconObjectId: true,
},
});
-
- if (!game)
- throw createError({ statusCode: 404, statusMessage: "Game ID not found" });
-
- const unimportedVersions = await libraryManager.fetchUnimportedVersions(
- game.id,
- );
-
- return { game, unimportedVersions };
});
diff --git a/server/api/v1/admin/game/version/index.delete.ts b/server/api/v1/admin/game/version/index.delete.ts
index 79aa04d..caf4242 100644
--- a/server/api/v1/admin/game/version/index.delete.ts
+++ b/server/api/v1/admin/game/version/index.delete.ts
@@ -1,27 +1,34 @@
+import { type } from "arktype";
+import { readDropValidatedBody, throwingArktype } from "~/server/arktype";
import aclManager from "~/server/internal/acls";
import prisma from "~/server/internal/db/database";
-export default defineEventHandler(async (h3) => {
- const allowed = await aclManager.allowSystemACL(h3, ["game:version:delete"]);
- if (!allowed) throw createError({ statusCode: 403 });
+const DeleteVersion = type({
+ id: "string",
+ versionName: "string",
+}).configure(throwingArktype);
- const body = await readBody(h3);
- const gameId = body.id.toString();
- const version = body.versionName.toString();
- if (!gameId || !version)
- throw createError({
- statusCode: 400,
- statusMessage: "Missing ID or versionName in body",
+export default defineEventHandler<{ body: typeof DeleteVersion }>(
+ async (h3) => {
+ const allowed = await aclManager.allowSystemACL(h3, [
+ "game:version:delete",
+ ]);
+ if (!allowed) throw createError({ statusCode: 403 });
+
+ const body = await readDropValidatedBody(h3, DeleteVersion);
+
+ const gameId = body.id.toString();
+ const version = body.versionName.toString();
+
+ await prisma.gameVersion.delete({
+ where: {
+ gameId_versionName: {
+ gameId: gameId,
+ versionName: version,
+ },
+ },
});
- await prisma.gameVersion.delete({
- where: {
- gameId_versionName: {
- gameId: gameId,
- versionName: version,
- },
- },
- });
-
- return {};
-});
+ return {};
+ },
+);
diff --git a/server/api/v1/admin/game/version/index.patch.ts b/server/api/v1/admin/game/version/index.patch.ts
index 7509cd5..54e0547 100644
--- a/server/api/v1/admin/game/version/index.patch.ts
+++ b/server/api/v1/admin/game/version/index.patch.ts
@@ -1,41 +1,72 @@
+import { type } from "arktype";
+import { readDropValidatedBody, throwingArktype } from "~/server/arktype";
import aclManager from "~/server/internal/acls";
import prisma from "~/server/internal/db/database";
-export default defineEventHandler(async (h3) => {
- const allowed = await aclManager.allowSystemACL(h3, ["game:version:update"]);
- if (!allowed) throw createError({ statusCode: 403 });
+const UpdateVersionOrder = type({
+ id: "string",
+ versions: "string[]",
+}).configure(throwingArktype);
- const body = await readBody(h3);
- const gameId = body.id?.toString();
- // We expect an array of the version names for this game
- const versions: string[] | undefined = body.versions;
- if (!gameId || !versions || !Array.isArray(versions))
- throw createError({
- statusCode: 400,
- statusMessage: "Missing id, versions or versions is not an array",
+export default defineEventHandler<{ body: typeof UpdateVersionOrder }>(
+ async (h3) => {
+ const allowed = await aclManager.allowSystemACL(h3, [
+ "game:version:update",
+ ]);
+ if (!allowed) throw createError({ statusCode: 403 });
+
+ const body = await readDropValidatedBody(h3, UpdateVersionOrder);
+ const gameId = body.id;
+ // We expect an array of the version names for this game
+ const unsortedVersions = await prisma.gameVersion.findMany({
+ where: {
+ versionName: { in: body.versions },
+ },
+ select: {
+ versionName: true,
+ versionIndex: true,
+ delta: true,
+ platform: true,
+ },
});
- const newVersions = await prisma.$transaction(
- versions.map((versionName, versionIndex) =>
- prisma.gameVersion.update({
- where: {
- gameId_versionName: {
- gameId: gameId,
- versionName: versionName,
- },
- },
- data: {
- versionIndex: versionIndex,
- },
- select: {
- versionIndex: true,
- versionName: true,
- platform: true,
- delta: true,
- },
- }),
- ),
- );
+ const versions = body.versions
+ .map((e) => unsortedVersions.find((v) => v.versionName === e))
+ .filter((e) => e !== undefined);
- return newVersions;
-});
+ if (versions.length !== unsortedVersions.length)
+ throw createError({
+ statusCode: 500,
+ statusMessage: "Sorting versions yielded less results, somehow.",
+ });
+
+ // Validate the new order
+ const has: { [key: string]: boolean } = {};
+ for (const version of versions) {
+ if (version.delta && !has[version.platform])
+ throw createError({
+ statusCode: 400,
+ statusMessage: `"${version.versionName}" requires a base version to apply the delta to.`,
+ });
+ has[version.platform] = true;
+ }
+
+ await prisma.$transaction(
+ versions.map((version, versionIndex) =>
+ prisma.gameVersion.update({
+ where: {
+ gameId_versionName: {
+ gameId: gameId,
+ versionName: version.versionName,
+ },
+ },
+ data: {
+ versionIndex: versionIndex,
+ },
+ }),
+ ),
+ );
+
+ return versions;
+ },
+);
diff --git a/server/api/v1/admin/import/game/index.get.ts b/server/api/v1/admin/import/game/index.get.ts
index c913bdc..8ef65fb 100644
--- a/server/api/v1/admin/import/game/index.get.ts
+++ b/server/api/v1/admin/import/game/index.get.ts
@@ -5,6 +5,14 @@ export default defineEventHandler(async (h3) => {
const allowed = await aclManager.allowSystemACL(h3, ["import:game:read"]);
if (!allowed) throw createError({ statusCode: 403 });
- const unimportedGames = await libraryManager.fetchAllUnimportedGames();
- return { unimportedGames };
+ const unimportedGames = await libraryManager.fetchUnimportedGames();
+ const libraries = Object.fromEntries(
+ (await libraryManager.fetchLibraries()).map((e) => [e.id, e]),
+ );
+ const iterableUnimportedGames = Object.entries(unimportedGames)
+ .map(([libraryId, gameArray]) =>
+ gameArray.map((e) => ({ game: e, library: libraries[libraryId] })),
+ )
+ .flat();
+ return { unimportedGames: iterableUnimportedGames };
});
diff --git a/server/api/v1/admin/import/game/index.post.ts b/server/api/v1/admin/import/game/index.post.ts
index 7f39f52..e3e3247 100644
--- a/server/api/v1/admin/import/game/index.post.ts
+++ b/server/api/v1/admin/import/game/index.post.ts
@@ -1,37 +1,53 @@
+import { type } from "arktype";
+import { readDropValidatedBody, throwingArktype } from "~/server/arktype";
import aclManager from "~/server/internal/acls";
import libraryManager from "~/server/internal/library";
import metadataHandler from "~/server/internal/metadata";
-import type {
- GameMetadataSearchResult,
- GameMetadataSource,
-} from "~/server/internal/metadata/types";
-export default defineEventHandler(async (h3) => {
- const allowed = await aclManager.allowSystemACL(h3, ["import:game:new"]);
- if (!allowed) throw createError({ statusCode: 403 });
+const ImportGameBody = type({
+ library: "string",
+ path: "string",
+ ["metadata?"]: {
+ id: "string",
+ sourceId: "string",
+ name: "string",
+ },
+}).configure(throwingArktype);
- const body = await readBody(h3);
+export default defineEventHandler<{ body: typeof ImportGameBody.infer }>(
+ async (h3) => {
+ const allowed = await aclManager.allowSystemACL(h3, ["import:game:new"]);
+ if (!allowed) throw createError({ statusCode: 403 });
- const path = body.path;
- const metadata = body.metadata as GameMetadataSearchResult &
- GameMetadataSource;
- if (!path)
- throw createError({
- statusCode: 400,
- statusMessage: "Path missing from body",
- });
+ const { library, path, metadata } = await readDropValidatedBody(
+ h3,
+ ImportGameBody,
+ );
- const validPath = await libraryManager.checkUnimportedGamePath(path);
- if (!validPath)
- throw createError({
- statusCode: 400,
- statusMessage: "Invalid unimported game path",
- });
+ if (!path)
+ throw createError({
+ statusCode: 400,
+ statusMessage: "Path missing from body",
+ });
- if (!metadata || !metadata.id || !metadata.sourceId) {
- console.log(metadata);
- return await metadataHandler.createGameWithoutMetadata(path);
- } else {
- return await metadataHandler.createGame(metadata, path);
- }
-});
+ const valid = await libraryManager.checkUnimportedGamePath(library, path);
+ if (!valid)
+ throw createError({
+ statusCode: 400,
+ statusMessage: "Invalid library or game.",
+ });
+
+ const taskId = metadata
+ ? await metadataHandler.createGame(metadata, library, path)
+ : await metadataHandler.createGameWithoutMetadata(library, path);
+
+ if (!taskId)
+ throw createError({
+ statusCode: 400,
+ statusMessage:
+ "Duplicate metadata import. Please chose a different game or metadata provider.",
+ });
+
+ return { taskId };
+ },
+);
diff --git a/server/api/v1/admin/import/version/index.get.ts b/server/api/v1/admin/import/version/index.get.ts
index 8687b94..893d295 100644
--- a/server/api/v1/admin/import/version/index.get.ts
+++ b/server/api/v1/admin/import/version/index.get.ts
@@ -1,4 +1,5 @@
import aclManager from "~/server/internal/acls";
+import prisma from "~/server/internal/db/database";
import libraryManager from "~/server/internal/library";
export default defineEventHandler(async (h3) => {
@@ -13,8 +14,17 @@ export default defineEventHandler(async (h3) => {
statusMessage: "Missing id in request params",
});
- const unimportedVersions =
- await libraryManager.fetchUnimportedVersions(gameId);
+ const game = await prisma.game.findUnique({
+ where: { id: gameId },
+ select: { libraryId: true, libraryPath: true },
+ });
+ if (!game || !game.libraryId)
+ throw createError({ statusCode: 404, statusMessage: "Game not found" });
+
+ const unimportedVersions = await libraryManager.fetchUnimportedGameVersions(
+ game.libraryId,
+ game.libraryPath,
+ );
if (!unimportedVersions)
throw createError({ statusCode: 400, statusMessage: "Invalid game ID" });
diff --git a/server/api/v1/admin/import/version/index.post.ts b/server/api/v1/admin/import/version/index.post.ts
index 6ec7b3e..ab9ad1c 100644
--- a/server/api/v1/admin/import/version/index.post.ts
+++ b/server/api/v1/admin/import/version/index.post.ts
@@ -1,33 +1,40 @@
+import { type } from "arktype";
+import { readDropValidatedBody, throwingArktype } from "~/server/arktype";
import aclManager from "~/server/internal/acls";
import prisma from "~/server/internal/db/database";
import libraryManager from "~/server/internal/library";
import { parsePlatform } from "~/server/internal/utils/parseplatform";
+const ImportVersion = type({
+ id: "string",
+ version: "string",
+
+ platform: "string",
+ launch: "string = ''",
+ launchArgs: "string = ''",
+ setup: "string = ''",
+ setupArgs: "string = ''",
+ onlySetup: "boolean = false",
+ delta: "boolean = false",
+ umuId: "string = ''",
+}).configure(throwingArktype);
+
export default defineEventHandler(async (h3) => {
const allowed = await aclManager.allowSystemACL(h3, ["import:version:new"]);
if (!allowed) throw createError({ statusCode: 403 });
- const body = await readBody(h3);
- const gameId = body.id;
- const versionName = body.version;
-
- const platform = body.platform as string | undefined;
- const launch = (body.launch ?? "") as string;
- const launchArgs = (body.launchArgs ?? "") as string;
- const setup = (body.setup ?? "") as string;
- const setupArgs = (body.setupArgs ?? "") as string;
- const onlySetup = body.onlySetup ?? (false as boolean);
- const delta = (body.delta ?? false) as boolean;
- const umuId = (body.umuId ?? "") as string;
-
- if (!gameId || !versionName)
- throw createError({
- statusCode: 400,
- statusMessage: "Game ID and version are required.",
- });
-
- if (!platform)
- throw createError({ statusCode: 400, statusMessage: "Missing platform." });
+ const {
+ id,
+ version,
+ platform,
+ launch,
+ launchArgs,
+ setup,
+ setupArgs,
+ onlySetup,
+ delta,
+ umuId,
+ } = await readDropValidatedBody(h3, ImportVersion);
const platformParsed = parsePlatform(platform);
if (!platformParsed)
@@ -35,7 +42,7 @@ export default defineEventHandler(async (h3) => {
if (delta) {
const validOverlayVersions = await prisma.gameVersion.count({
- where: { gameId: gameId, platform: platformParsed, delta: false },
+ where: { gameId: id, platform: platformParsed, delta: false },
});
if (validOverlayVersions == 0)
throw createError({
@@ -45,12 +52,6 @@ export default defineEventHandler(async (h3) => {
});
}
- if (umuId && typeof umuId !== "string")
- throw createError({
- statusCode: 400,
- statusMessage: "If specified, UMU ID must be a string.",
- });
-
if (onlySetup) {
if (!setup)
throw createError({
@@ -61,12 +62,12 @@ export default defineEventHandler(async (h3) => {
if (!delta && !launch)
throw createError({
statusCode: 400,
- statusMessage: "Startup executable is required for non-update versions",
+ statusMessage: "Launch executable is required for non-update versions",
});
}
// startup & delta require more complex checking logic
- const taskId = await libraryManager.importVersion(gameId, versionName, {
+ const taskId = await libraryManager.importVersion(id, version, {
platform,
onlySetup,
diff --git a/server/api/v1/admin/index.get.ts b/server/api/v1/admin/index.get.ts
new file mode 100644
index 0000000..9d52d0f
--- /dev/null
+++ b/server/api/v1/admin/index.get.ts
@@ -0,0 +1,7 @@
+import aclManager from "~/server/internal/acls";
+
+export default defineEventHandler(async (h3) => {
+ const allowed = await aclManager.allowSystemACL(h3, []);
+ if (!allowed) return false;
+ return true;
+});
diff --git a/server/api/v1/admin/library/index.get.ts b/server/api/v1/admin/library/index.get.ts
index 192a7c2..5df358b 100644
--- a/server/api/v1/admin/library/index.get.ts
+++ b/server/api/v1/admin/library/index.get.ts
@@ -5,10 +5,11 @@ export default defineEventHandler(async (h3) => {
const allowed = await aclManager.allowSystemACL(h3, ["library:read"]);
if (!allowed) throw createError({ statusCode: 403 });
- const unimportedGames = await libraryManager.fetchAllUnimportedGames();
+ const unimportedGames = await libraryManager.fetchUnimportedGames();
const games = await libraryManager.fetchGamesWithStatus();
+ const libraries = await libraryManager.fetchLibraries();
// Fetch other library data here
- return { unimportedGames, games };
+ return { unimportedGames, games, hasLibraries: libraries.length > 0 };
});
diff --git a/server/api/v1/admin/library/sources/index.delete.ts b/server/api/v1/admin/library/sources/index.delete.ts
new file mode 100644
index 0000000..165a9b2
--- /dev/null
+++ b/server/api/v1/admin/library/sources/index.delete.ts
@@ -0,0 +1,29 @@
+import { type } from "arktype";
+import { readDropValidatedBody, throwingArktype } from "~/server/arktype";
+import aclManager from "~/server/internal/acls";
+import prisma from "~/server/internal/db/database";
+import libraryManager from "~/server/internal/library";
+
+const DeleteLibrarySource = type({
+ id: "string",
+}).configure(throwingArktype);
+
+export default defineEventHandler<{ body: typeof DeleteLibrarySource.infer }>(
+ async (h3) => {
+ const allowed = await aclManager.allowSystemACL(h3, [
+ "library:sources:delete",
+ "setup",
+ ]);
+ if (!allowed) throw createError({ statusCode: 403 });
+
+ const body = await readDropValidatedBody(h3, DeleteLibrarySource);
+
+ await prisma.library.delete({
+ where: {
+ id: body.id,
+ },
+ });
+
+ libraryManager.removeLibrary(body.id);
+ },
+);
diff --git a/server/api/v1/admin/library/sources/index.get.ts b/server/api/v1/admin/library/sources/index.get.ts
new file mode 100644
index 0000000..bf56134
--- /dev/null
+++ b/server/api/v1/admin/library/sources/index.get.ts
@@ -0,0 +1,19 @@
+import type { LibraryModel } from "~/prisma/client/models";
+import aclManager from "~/server/internal/acls";
+import libraryManager from "~/server/internal/library";
+
+export type WorkingLibrarySource = LibraryModel & { working: boolean };
+
+export default defineEventHandler(async (h3) => {
+ const allowed = await aclManager.allowSystemACL(h3, [
+ "library:sources:read",
+ "setup",
+ ]);
+ if (!allowed) throw createError({ statusCode: 403 });
+
+ const sources = await libraryManager.fetchLibraries();
+
+ // Fetch other library data here
+
+ return sources;
+});
diff --git a/server/api/v1/admin/library/sources/index.patch.ts b/server/api/v1/admin/library/sources/index.patch.ts
new file mode 100644
index 0000000..f098b7a
--- /dev/null
+++ b/server/api/v1/admin/library/sources/index.patch.ts
@@ -0,0 +1,68 @@
+import { type } from "arktype";
+import { readDropValidatedBody, throwingArktype } from "~/server/arktype";
+import aclManager from "~/server/internal/acls";
+import prisma from "~/server/internal/db/database";
+import libraryManager from "~/server/internal/library";
+import { libraryConstructors } from "~/server/plugins/05.library-init";
+import type { WorkingLibrarySource } from "./index.get";
+
+const UpdateLibrarySource = type({
+ id: "string",
+ name: "string",
+ options: "object",
+}).configure(throwingArktype);
+
+export default defineEventHandler<{ body: typeof UpdateLibrarySource.infer }>(
+ async (h3) => {
+ const allowed = await aclManager.allowSystemACL(h3, [
+ "library:sources:update",
+ "setup",
+ ]);
+ if (!allowed) throw createError({ statusCode: 403 });
+
+ const body = await readDropValidatedBody(h3, UpdateLibrarySource);
+
+ const source = await prisma.library.findUnique({ where: { id: body.id } });
+ if (!source)
+ throw createError({
+ statusCode: 400,
+ statusMessage: "Library source not found",
+ });
+
+ const constructor = libraryConstructors[source.backend];
+
+ try {
+ const newLibrary = constructor(body.options, source.id);
+
+ // Test we can actually use it
+ if ((await newLibrary.listGames()) === undefined) {
+ throw "Library failed to fetch games.";
+ }
+
+ const updatedSource = await prisma.library.update({
+ where: {
+ id: source.id,
+ },
+ data: {
+ name: body.name,
+ options: body.options,
+ },
+ });
+
+ await libraryManager.removeLibrary(source.id);
+ await libraryManager.addLibrary(newLibrary);
+
+ const workingSource: WorkingLibrarySource = {
+ ...updatedSource,
+ working: true,
+ };
+
+ return workingSource;
+ } catch (e) {
+ throw createError({
+ statusCode: 400,
+ statusMessage: `Failed to create source: ${e}`,
+ });
+ }
+ },
+);
diff --git a/server/api/v1/admin/library/sources/index.post.ts b/server/api/v1/admin/library/sources/index.post.ts
new file mode 100644
index 0000000..ae32b75
--- /dev/null
+++ b/server/api/v1/admin/library/sources/index.post.ts
@@ -0,0 +1,70 @@
+import { type } from "arktype";
+import { randomUUID } from "crypto";
+import { LibraryBackend } from "~/prisma/client/enums";
+import { readDropValidatedBody, throwingArktype } from "~/server/arktype";
+import aclManager from "~/server/internal/acls";
+import prisma from "~/server/internal/db/database";
+import libraryManager from "~/server/internal/library";
+import { libraryConstructors } from "~/server/plugins/05.library-init";
+import type { WorkingLibrarySource } from "./index.get";
+
+const CreateLibrarySource = type({
+ name: "string",
+ backend: "string",
+ options: "object",
+}).configure(throwingArktype);
+
+export default defineEventHandler<{ body: typeof CreateLibrarySource.infer }>(
+ async (h3) => {
+ const allowed = await aclManager.allowSystemACL(h3, [
+ "library:sources:new",
+ "setup",
+ ]);
+ if (!allowed) throw createError({ statusCode: 403 });
+
+ const body = await readDropValidatedBody(h3, CreateLibrarySource);
+ const backend = Object.values(LibraryBackend).find(
+ (e) => e == body.backend,
+ );
+ if (!backend)
+ throw createError({
+ statusCode: 400,
+ statusMessage: "Invalid source backend.",
+ });
+
+ const constructor = libraryConstructors[backend];
+
+ try {
+ const id = randomUUID();
+ const library = constructor(body.options, id);
+
+ // Test we can actually use it
+ if ((await library.listGames()) === undefined) {
+ throw "Library failed to fetch games.";
+ }
+
+ const source = await prisma.library.create({
+ data: {
+ id,
+ name: body.name,
+ backend,
+ options: body.options,
+ },
+ });
+
+ await libraryManager.addLibrary(library);
+
+ const workingSource: WorkingLibrarySource = {
+ ...source,
+ working: true,
+ };
+
+ return workingSource;
+ } catch (e) {
+ throw createError({
+ statusCode: 400,
+ statusMessage: `Failed to create source: ${e}`,
+ });
+ }
+ },
+);
diff --git a/server/api/v1/admin/news/index.post.ts b/server/api/v1/admin/news/index.post.ts
index 5e3286e..fb09c2e 100644
--- a/server/api/v1/admin/news/index.post.ts
+++ b/server/api/v1/admin/news/index.post.ts
@@ -1,8 +1,16 @@
+import { ArkErrors, type } from "arktype";
import { defineEventHandler, createError } from "h3";
import aclManager from "~/server/internal/acls";
import newsManager from "~/server/internal/news";
import { handleFileUpload } from "~/server/internal/utils/handlefileupload";
+const CreateNews = type({
+ title: "string",
+ description: "string",
+ content: "string",
+ tags: "string = '[]'",
+});
+
export default defineEventHandler(async (h3) => {
const allowed = await aclManager.allowSystemACL(h3, ["news:create"]);
if (!allowed) throw createError({ statusCode: 403 });
@@ -14,34 +22,36 @@ export default defineEventHandler(async (h3) => {
statusMessage: "This endpoint requires multipart form data.",
});
- const uploadResult = await handleFileUpload(h3, {}, ["internal:read"]);
+ const uploadResult = await handleFileUpload(h3, {}, ["internal:read"], 1);
if (!uploadResult)
throw createError({
statusCode: 400,
statusMessage: "Failed to upload file",
});
- const [imageId, options, pull, _dump] = uploadResult;
+ const [imageIds, options, pull, _dump] = uploadResult;
- const title = options.title;
- const description = options.description;
- const content = options.content;
- const tags = options.tags ? (JSON.parse(options.tags) as string[]) : [];
+ const body = await CreateNews(options);
+ if (body instanceof ArkErrors)
+ throw createError({ statusCode: 400, statusMessage: body.summary });
- if (!title || !description || !content)
+ const parsedTags = JSON.parse(body.tags);
+ if (typeof parsedTags !== "object" || !Array.isArray(parsedTags))
throw createError({
statusCode: 400,
- statusMessage: "Missing or invalid title, description or content.",
+ statusMessage: "Tags must be an array",
});
+ const imageId = imageIds.at(0);
+
const article = await newsManager.create({
- title: title,
- description: description,
- content: content,
+ title: body.title,
+ description: body.description,
+ content: body.content,
- tags: tags,
+ tags: parsedTags,
- ...(imageId && { image: imageId }),
+ ...(imageId && { imageObjectId: imageId }),
authorId: "system",
});
diff --git a/server/api/v1/admin/settings/dummy-data.get.ts b/server/api/v1/admin/settings/dummy-data.get.ts
new file mode 100644
index 0000000..6f62372
--- /dev/null
+++ b/server/api/v1/admin/settings/dummy-data.get.ts
@@ -0,0 +1,11 @@
+import aclManager from "~/server/internal/acls";
+import prisma from "~/server/internal/db/database";
+
+export default defineEventHandler(async (h3) => {
+ const allowed = await aclManager.getUserACL(h3, ["settings:read"]);
+ if (!allowed) throw createError({ statusCode: 403 });
+
+ const game = await prisma.game.findFirst();
+
+ return { game };
+});
diff --git a/server/api/v1/admin/settings/index.patch.ts b/server/api/v1/admin/settings/index.patch.ts
new file mode 100644
index 0000000..ef99441
--- /dev/null
+++ b/server/api/v1/admin/settings/index.patch.ts
@@ -0,0 +1,23 @@
+import { type } from "arktype";
+import { applicationSettings } from "~/server/internal/config/application-configuration";
+import { readDropValidatedBody } from "~/server/arktype";
+import { defineEventHandler, createError } from "h3";
+import aclManager from "~/server/internal/acls";
+
+const UpdateSettings = type({
+ showGamePanelTextDecoration: "boolean",
+});
+
+export default defineEventHandler<{ body: typeof UpdateSettings.infer }>(
+ async (h3) => {
+ const allowed = await aclManager.allowSystemACL(h3, ["settings:update"]);
+ if (!allowed) throw createError({ statusCode: 403 });
+
+ const body = await readDropValidatedBody(h3, UpdateSettings);
+
+ await applicationSettings.set(
+ "showGamePanelTextDecoration",
+ body.showGamePanelTextDecoration,
+ );
+ },
+);
diff --git a/server/api/v1/admin/tags/[id]/index.delete.ts b/server/api/v1/admin/tags/[id]/index.delete.ts
new file mode 100644
index 0000000..4279257
--- /dev/null
+++ b/server/api/v1/admin/tags/[id]/index.delete.ts
@@ -0,0 +1,14 @@
+import aclManager from "~/server/internal/acls";
+import prisma from "~/server/internal/db/database";
+
+export default defineEventHandler(async (h3) => {
+ const allowed = await aclManager.allowSystemACL(h3, ["tags:delete"]);
+ if (!allowed) throw createError({ statusCode: 403 });
+
+ const id = getRouterParam(h3, "id")!;
+
+ const tag = await prisma.gameTag.deleteMany({ where: { id } });
+ if (tag.count == 0)
+ throw createError({ statusCode: 404, statusMessage: "Tag not found" });
+ return;
+});
diff --git a/server/api/v1/admin/tags/index.get.ts b/server/api/v1/admin/tags/index.get.ts
new file mode 100644
index 0000000..d8f1c1e
--- /dev/null
+++ b/server/api/v1/admin/tags/index.get.ts
@@ -0,0 +1,10 @@
+import aclManager from "~/server/internal/acls";
+import prisma from "~/server/internal/db/database";
+
+export default defineEventHandler(async (h3) => {
+ const allowed = await aclManager.allowSystemACL(h3, ["tags:read"]);
+ if (!allowed) throw createError({ statusCode: 403 });
+
+ const tags = await prisma.gameTag.findMany({ orderBy: { name: "asc" } });
+ return tags;
+});
diff --git a/server/api/v1/admin/tags/index.post.ts b/server/api/v1/admin/tags/index.post.ts
new file mode 100644
index 0000000..15698e7
--- /dev/null
+++ b/server/api/v1/admin/tags/index.post.ts
@@ -0,0 +1,22 @@
+import { type } from "arktype";
+import { readDropValidatedBody, throwingArktype } from "~/server/arktype";
+import aclManager from "~/server/internal/acls";
+import prisma from "~/server/internal/db/database";
+
+const CreateTag = type({
+ name: "string",
+}).configure(throwingArktype);
+
+export default defineEventHandler(async (h3) => {
+ const allowed = await aclManager.allowSystemACL(h3, ["tags:read"]);
+ if (!allowed) throw createError({ statusCode: 403 });
+
+ const body = await readDropValidatedBody(h3, CreateTag);
+
+ const tag = await prisma.gameTag.create({
+ data: {
+ ...body,
+ },
+ });
+ return tag;
+});
diff --git a/server/api/v1/admin/task/index.get.ts b/server/api/v1/admin/task/index.get.ts
new file mode 100644
index 0000000..690dce8
--- /dev/null
+++ b/server/api/v1/admin/task/index.get.ts
@@ -0,0 +1,37 @@
+import aclManager from "~/server/internal/acls";
+import prisma from "~/server/internal/db/database";
+import type { TaskMessage } from "~/server/internal/tasks";
+import taskHandler from "~/server/internal/tasks";
+
+export default defineEventHandler(async (h3) => {
+ const allowed = await aclManager.allowSystemACL(h3, ["task:read"]);
+ if (!allowed) throw createError({ statusCode: 403 });
+ const allAcls = await aclManager.fetchAllACLs(h3);
+ if (!allAcls)
+ throw createError({
+ statusCode: 403,
+ statusMessage: "Somehow no ACLs on authenticated request.",
+ });
+
+ const runningTasks = (await taskHandler.runningTasks()).map((e) => e.id);
+ const historicalTasks = (await prisma.task.findMany({
+ where: {
+ OR: [
+ {
+ acls: { hasSome: allAcls },
+ },
+ {
+ acls: { isEmpty: true },
+ },
+ ],
+ },
+ orderBy: {
+ ended: "desc",
+ },
+ take: 10,
+ })) as Array;
+ const dailyTasks = await taskHandler.dailyTasks();
+ const weeklyTasks = await taskHandler.weeklyTasks();
+
+ return { runningTasks, historicalTasks, dailyTasks, weeklyTasks };
+});
diff --git a/server/api/v1/admin/task/index.post.ts b/server/api/v1/admin/task/index.post.ts
new file mode 100644
index 0000000..dc28190
--- /dev/null
+++ b/server/api/v1/admin/task/index.post.ts
@@ -0,0 +1,31 @@
+import { type } from "arktype";
+import { readDropValidatedBody, throwingArktype } from "~/server/arktype";
+import aclManager from "~/server/internal/acls";
+import taskHandler from "~/server/internal/tasks";
+import type { TaskGroup } from "~/server/internal/tasks/group";
+import { taskGroups } from "~/server/internal/tasks/group";
+
+const StartTask = type({
+ taskGroup: type("string"),
+}).configure(throwingArktype);
+
+export default defineEventHandler(async (h3) => {
+ const allowed = await aclManager.allowSystemACL(h3, ["task:start"]);
+ if (!allowed) throw createError({ statusCode: 403 });
+
+ const body = await readDropValidatedBody(h3, StartTask);
+ const taskGroup = body.taskGroup as TaskGroup;
+ if (!taskGroups[taskGroup])
+ throw createError({
+ statusCode: 400,
+ statusMessage: "Invalid task group.",
+ });
+
+ const task = await taskHandler.runTaskGroupByName(taskGroup);
+ if (!task)
+ throw createError({
+ statusCode: 500,
+ statusMessage: "Could not start task.",
+ });
+ return { id: task };
+});
diff --git a/server/api/v1/admin/token/[id]/index.delete.ts b/server/api/v1/admin/token/[id]/index.delete.ts
new file mode 100644
index 0000000..1e33730
--- /dev/null
+++ b/server/api/v1/admin/token/[id]/index.delete.ts
@@ -0,0 +1,23 @@
+import { APITokenMode } from "~/prisma/client/enums";
+import aclManager from "~/server/internal/acls";
+import prisma from "~/server/internal/db/database";
+
+export default defineEventHandler(async (h3) => {
+ const allowed = await aclManager.allowSystemACL(h3, []); // No ACLs only allows session authentication
+ if (!allowed) throw createError({ statusCode: 403 });
+
+ const id = h3.context.params?.id;
+ if (!id)
+ throw createError({
+ statusCode: 400,
+ statusMessage: "No id in router params",
+ });
+
+ const deleted = await prisma.aPIToken.delete({
+ where: { id: id, mode: APITokenMode.System },
+ })!;
+ if (!deleted)
+ throw createError({ statusCode: 404, statusMessage: "Token not found" });
+
+ return;
+});
diff --git a/server/api/v1/admin/token/acls.get.ts b/server/api/v1/admin/token/acls.get.ts
new file mode 100644
index 0000000..09b4e0f
--- /dev/null
+++ b/server/api/v1/admin/token/acls.get.ts
@@ -0,0 +1,9 @@
+import aclManager from "~/server/internal/acls";
+import { systemACLDescriptions } from "~/server/internal/acls/descriptions";
+
+export default defineEventHandler(async (h3) => {
+ const allowed = await aclManager.allowSystemACL(h3, []); // No ACLs only allows session authentication
+ if (!allowed) throw createError({ statusCode: 403 });
+
+ return systemACLDescriptions;
+});
diff --git a/server/api/v1/admin/token/index.get.ts b/server/api/v1/admin/token/index.get.ts
new file mode 100644
index 0000000..2438a4b
--- /dev/null
+++ b/server/api/v1/admin/token/index.get.ts
@@ -0,0 +1,15 @@
+import { APITokenMode } from "~/prisma/client/enums";
+import aclManager from "~/server/internal/acls";
+import prisma from "~/server/internal/db/database";
+
+export default defineEventHandler(async (h3) => {
+ const allowed = await aclManager.allowSystemACL(h3, []); // No ACLs only allows session authentication
+ if (!allowed) throw createError({ statusCode: 403 });
+
+ const tokens = await prisma.aPIToken.findMany({
+ where: { mode: APITokenMode.System },
+ omit: { token: true },
+ });
+
+ return tokens;
+});
diff --git a/server/api/v1/admin/token/index.post.ts b/server/api/v1/admin/token/index.post.ts
new file mode 100644
index 0000000..421fe8d
--- /dev/null
+++ b/server/api/v1/admin/token/index.post.ts
@@ -0,0 +1,38 @@
+import { type } from "arktype";
+import { APITokenMode } from "~/prisma/client/enums";
+import { readDropValidatedBody, throwingArktype } from "~/server/arktype";
+import aclManager, { systemACLs } from "~/server/internal/acls";
+import prisma from "~/server/internal/db/database";
+
+const CreateToken = type({
+ name: "string",
+ acls: "string[] > 0",
+ expiry: "string.date.iso.parse?",
+}).configure(throwingArktype);
+
+export default defineEventHandler(async (h3) => {
+ const allowed = await aclManager.allowSystemACL(h3, []); // No ACLs only allows session authentication
+ if (!allowed) throw createError({ statusCode: 403 });
+
+ const body = await readDropValidatedBody(h3, CreateToken);
+
+ const invalidACLs = body.acls.filter(
+ (e) => systemACLs.findIndex((v) => e == v) == -1,
+ );
+ if (invalidACLs.length > 0)
+ throw createError({
+ statusCode: 400,
+ statusMessage: `Invalid ACLs: ${invalidACLs.join(", ")}`,
+ });
+
+ const token = await prisma.aPIToken.create({
+ data: {
+ mode: APITokenMode.System,
+ name: body.name,
+ acls: body.acls,
+ expiresAt: body.expiry ?? null,
+ },
+ });
+
+ return token;
+});
diff --git a/server/api/v1/admin/users/[id]/index.delete.ts b/server/api/v1/admin/users/[id]/index.delete.ts
new file mode 100644
index 0000000..c514817
--- /dev/null
+++ b/server/api/v1/admin/users/[id]/index.delete.ts
@@ -0,0 +1,31 @@
+import { defineEventHandler, createError } from "h3";
+import aclManager from "~/server/internal/acls";
+import prisma from "~/server/internal/db/database";
+
+export default defineEventHandler(async (h3) => {
+ const allowed = await aclManager.allowSystemACL(h3, ["user:delete"]);
+ if (!allowed)
+ throw createError({
+ statusCode: 403,
+ });
+
+ const userId = h3.context.params?.id;
+ if (!userId) {
+ throw createError({
+ statusCode: 400,
+ message: "No userId in route.",
+ });
+ }
+ if (userId === "system")
+ throw createError({
+ statusCode: 400,
+ statusMessage: "Cannot interact with system user.",
+ });
+
+ const user = await prisma.user.findUnique({ where: { id: userId } });
+ if (!user)
+ throw createError({ statusCode: 404, statusMessage: "User not found." });
+
+ await prisma.user.delete({ where: { id: userId } });
+ return { success: true };
+});
diff --git a/server/api/v1/auth/index.get.ts b/server/api/v1/auth/index.get.ts
index 1bf368d..1582f1b 100644
--- a/server/api/v1/auth/index.get.ts
+++ b/server/api/v1/auth/index.get.ts
@@ -1,9 +1,5 @@
-import { enabledAuthManagers } from "~/server/plugins/04.auth-init";
+import authManager from "~/server/internal/auth";
export default defineEventHandler(() => {
- const authManagers = Object.entries(enabledAuthManagers)
- .filter((e) => !!e[1])
- .map((e) => e[0]);
-
- return authManagers;
+ return authManager.getEnabledAuthProviders();
});
diff --git a/server/api/v1/auth/signin/simple.post.ts b/server/api/v1/auth/signin/simple.post.ts
index 42eacdf..3e4ca03 100644
--- a/server/api/v1/auth/signin/simple.post.ts
+++ b/server/api/v1/auth/signin/simple.post.ts
@@ -1,13 +1,13 @@
-import { AuthMec } from "~/prisma/client";
+import { AuthMec } from "~/prisma/client/enums";
import type { JsonArray } from "@prisma/client/runtime/library";
import { type } from "arktype";
import prisma from "~/server/internal/db/database";
-import {
+import sessionHandler from "~/server/internal/session";
+import authManager, {
checkHashArgon2,
checkHashBcrypt,
-} from "~/server/internal/security/simple";
-import sessionHandler from "~/server/internal/session";
-import { enabledAuthManagers } from "~/server/plugins/04.auth-init";
+} from "~/server/internal/auth";
+import { logger } from "~/server/internal/logging";
const signinValidator = type({
username: "string",
@@ -15,17 +15,21 @@ const signinValidator = type({
"rememberMe?": "boolean | undefined",
});
-export default defineEventHandler(async (h3) => {
- if (!enabledAuthManagers.Simple)
+export default defineEventHandler<{
+ body: typeof signinValidator.infer;
+}>(async (h3) => {
+ const t = await useTranslation(h3);
+
+ if (!authManager.getAuthProviders().Simple)
throw createError({
statusCode: 403,
- statusMessage: "Sign in method not enabled",
+ statusMessage: t("errors.auth.method.signinDisabled"),
});
const body = signinValidator(await readBody(h3));
if (body instanceof type.errors) {
// hover out.summary to see validation errors
- console.error(body.summary);
+ logger.error(body.summary);
throw createError({
statusCode: 400,
@@ -53,14 +57,13 @@ export default defineEventHandler(async (h3) => {
if (!authMek)
throw createError({
statusCode: 401,
- statusMessage: "Invalid username or password.",
+ statusMessage: t("errors.auth.invalidUserOrPass"),
});
if (!authMek.user.enabled)
throw createError({
statusCode: 403,
- statusMessage:
- "Invalid or disabled account. Please contact the server administrator.",
+ statusMessage: t("errors.auth.disabled"),
});
// LEGACY bcrypt
@@ -70,15 +73,14 @@ export default defineEventHandler(async (h3) => {
if (!hash)
throw createError({
- statusCode: 403,
- statusMessage:
- "Invalid password state. Please contact the server administrator.",
+ statusCode: 500,
+ statusMessage: t("errors.auth.invalidPassState"),
});
if (!(await checkHashBcrypt(body.password, hash)))
throw createError({
statusCode: 401,
- statusMessage: "Invalid username or password.",
+ statusMessage: t("errors.auth.invalidUserOrPass"),
});
// TODO: send user to forgot password screen or something to force them to change their password to new system
@@ -91,14 +93,13 @@ export default defineEventHandler(async (h3) => {
if (!hash || typeof hash !== "string")
throw createError({
statusCode: 500,
- statusMessage:
- "Invalid password state. Please contact the server administrator.",
+ statusMessage: t("errors.auth.invalidPassState"),
});
if (!(await checkHashArgon2(body.password, hash)))
throw createError({
statusCode: 401,
- statusMessage: "Invalid username or password.",
+ statusMessage: t("errors.auth.invalidUserOrPass"),
});
await sessionHandler.signin(h3, authMek.userId, body.rememberMe);
diff --git a/server/api/v1/auth/signup/simple.get.ts b/server/api/v1/auth/signup/simple.get.ts
index 82bff3a..ad6c496 100644
--- a/server/api/v1/auth/signup/simple.get.ts
+++ b/server/api/v1/auth/signup/simple.get.ts
@@ -1,21 +1,30 @@
import prisma from "~/server/internal/db/database";
+import taskHandler from "~/server/internal/tasks";
+import authManager from "~/server/internal/auth";
export default defineEventHandler(async (h3) => {
+ const t = await useTranslation(h3);
+
+ if (!authManager.getAuthProviders().Simple)
+ throw createError({
+ statusCode: 403,
+ statusMessage: t("errors.auth.method.signinDisabled"),
+ });
+
const query = getQuery(h3);
const id = query.id?.toString();
if (!id)
throw createError({
statusCode: 400,
- statusMessage: "id required in fetching invitation",
+ statusMessage: t("errors.auth.inviteIdRequired"),
});
-
- await runTask("cleanup:invitations");
+ taskHandler.runTaskGroupByName("cleanup:invitations");
const invitation = await prisma.invitation.findUnique({ where: { id: id } });
if (!invitation)
throw createError({
statusCode: 404,
- statusMessage: "Invalid or expired invitation",
+ statusMessage: t("errors.auth.invalidInvite"),
});
return invitation;
diff --git a/server/api/v1/auth/signup/simple.post.ts b/server/api/v1/auth/signup/simple.post.ts
index ade27c1..8434f65 100644
--- a/server/api/v1/auth/signup/simple.post.ts
+++ b/server/api/v1/auth/signup/simple.post.ts
@@ -1,48 +1,45 @@
-import { AuthMec } from "~/prisma/client";
+import { AuthMec } from "~/prisma/client/enums";
import prisma from "~/server/internal/db/database";
-import { createHashArgon2 } from "~/server/internal/security/simple";
+import authManager, { createHashArgon2 } from "~/server/internal/auth";
import * as jdenticon from "jdenticon";
import objectHandler from "~/server/internal/objects";
import { type } from "arktype";
import { randomUUID } from "node:crypto";
+import { throwingArktype } from "~/server/arktype";
-const userValidator = type({
+export const SharedRegisterValidator = type({
username: "string >= 5",
email: "string.email",
- password: "string >= 14",
- "displayName?": "string | undefined",
});
-export default defineEventHandler(async (h3) => {
- const body = await readBody(h3);
+const CreateUserValidator = SharedRegisterValidator.and({
+ invitation: "string",
+ password: "string >= 14",
+ "displayName?": "string | undefined",
+}).configure(throwingArktype);
- const invitationId = body.invitation;
- if (!invitationId)
+export default defineEventHandler<{
+ body: typeof CreateUserValidator.infer;
+}>(async (h3) => {
+ const t = await useTranslation(h3);
+
+ if (!authManager.getAuthProviders().Simple)
throw createError({
- statusCode: 401,
- statusMessage: "Invalid or expired invitation.",
+ statusCode: 403,
+ statusMessage: t("errors.auth.method.signinDisabled"),
});
+ const user = await readValidatedBody(h3, CreateUserValidator);
+
const invitation = await prisma.invitation.findUnique({
- where: { id: invitationId },
+ where: { id: user.invitation },
});
if (!invitation)
throw createError({
statusCode: 401,
- statusMessage: "Invalid or expired invitation.",
+ statusMessage: t("errors.auth.invalidInvite"),
});
- const user = userValidator(body);
- if (user instanceof type.errors) {
- // hover out.summary to see validation errors
- console.error(user.summary);
-
- throw createError({
- statusCode: 400,
- statusMessage: user.summary,
- });
- }
-
// reuse items from invite
if (invitation.username !== null) user.username = invitation.username;
if (invitation.email !== null) user.email = invitation.email;
@@ -53,7 +50,7 @@ export default defineEventHandler(async (h3) => {
if (existing > 0)
throw createError({
statusCode: 400,
- statusMessage: "Username already taken.",
+ statusMessage: t("errors.auth.usernameTaken"),
});
const userId = randomUUID();
@@ -86,7 +83,7 @@ export default defineEventHandler(async (h3) => {
user: true,
},
}),
- prisma.invitation.delete({ where: { id: invitationId } }),
+ prisma.invitation.delete({ where: { id: user.invitation } }),
]);
return linkMec.user;
diff --git a/server/api/v1/client/auth/callback/index.post.ts b/server/api/v1/client/auth/callback/index.post.ts
index b08a57b..bc63be7 100644
--- a/server/api/v1/client/auth/callback/index.post.ts
+++ b/server/api/v1/client/auth/callback/index.post.ts
@@ -8,13 +8,19 @@ export default defineEventHandler(async (h3) => {
const body = await readBody(h3);
const clientId = await body.id;
- const data = await clientHandler.fetchClientMetadata(clientId);
- if (!data)
+ const client = await clientHandler.fetchClient(clientId);
+ if (!client)
throw createError({
statusCode: 400,
statusMessage: "Invalid or expired client ID.",
});
+ if (client.userId != user.userId)
+ throw createError({
+ statusCode: 403,
+ statusMessage: "Not allowed to authorize this client.",
+ });
+
const token = await clientHandler.generateAuthToken(clientId);
return {
diff --git a/server/api/v1/client/auth/code/index.get.ts b/server/api/v1/client/auth/code/index.get.ts
new file mode 100644
index 0000000..74bc6e8
--- /dev/null
+++ b/server/api/v1/client/auth/code/index.get.ts
@@ -0,0 +1,21 @@
+import clientHandler from "~/server/internal/clients/handler";
+import sessionHandler from "~/server/internal/session";
+
+export default defineEventHandler(async (h3) => {
+ const user = await sessionHandler.getSession(h3);
+ if (!user) throw createError({ statusCode: 403 });
+
+ const query = getQuery(h3);
+ const code = query.code?.toString()?.toUpperCase();
+ if (!code)
+ throw createError({
+ statusCode: 400,
+ statusMessage: "Code required in query params.",
+ });
+
+ const clientId = await clientHandler.fetchClientIdByCode(code);
+ if (!clientId)
+ throw createError({ statusCode: 400, statusMessage: "Invalid code." });
+
+ return clientId;
+});
diff --git a/server/api/v1/client/auth/code/index.post.ts b/server/api/v1/client/auth/code/index.post.ts
new file mode 100644
index 0000000..593b773
--- /dev/null
+++ b/server/api/v1/client/auth/code/index.post.ts
@@ -0,0 +1,35 @@
+import clientHandler from "~/server/internal/clients/handler";
+import sessionHandler from "~/server/internal/session";
+
+export default defineEventHandler(async (h3) => {
+ const user = await sessionHandler.getSession(h3);
+ if (!user) throw createError({ statusCode: 403 });
+
+ const body = await readBody(h3);
+ const clientId = await body.id;
+
+ const client = await clientHandler.fetchClient(clientId);
+ if (!client)
+ throw createError({
+ statusCode: 400,
+ statusMessage: "Invalid or expired client ID.",
+ });
+
+ if (client.userId != user.userId)
+ throw createError({
+ statusCode: 403,
+ statusMessage: "Not allowed to authorize this client.",
+ });
+
+ if (!client.peer)
+ throw createError({
+ statusCode: 500,
+ statusMessage: "No client listening for authorization.",
+ });
+
+ const token = await clientHandler.generateAuthToken(clientId);
+
+ await clientHandler.sendAuthToken(clientId, token);
+
+ return;
+});
diff --git a/server/api/v1/client/auth/code/ws.get.ts b/server/api/v1/client/auth/code/ws.get.ts
new file mode 100644
index 0000000..637d8df
--- /dev/null
+++ b/server/api/v1/client/auth/code/ws.get.ts
@@ -0,0 +1,25 @@
+import type { FetchError } from "ofetch";
+import clientHandler from "~/server/internal/clients/handler";
+
+export default defineWebSocketHandler({
+ async open(peer) {
+ try {
+ const h3 = { headers: peer.request?.headers ?? new Headers() };
+ const code = h3.headers.get("Authorization");
+ if (!code)
+ throw createError({
+ statusCode: 400,
+ statusMessage: "Code required in Authorization header.",
+ });
+ await clientHandler.connectCodeListener(code, peer);
+ } catch (e) {
+ peer.send(
+ JSON.stringify({
+ type: "error",
+ value: (e as FetchError)?.statusMessage,
+ }),
+ );
+ peer.close();
+ }
+ },
+});
diff --git a/server/api/v1/client/auth/callback/index.get.ts b/server/api/v1/client/auth/index.get.ts
similarity index 71%
rename from server/api/v1/client/auth/callback/index.get.ts
rename to server/api/v1/client/auth/index.get.ts
index d954534..92cf16c 100644
--- a/server/api/v1/client/auth/callback/index.get.ts
+++ b/server/api/v1/client/auth/index.get.ts
@@ -13,14 +13,20 @@ export default defineEventHandler(async (h3) => {
statusMessage: "Provide client ID in request params as 'id'",
});
- const data = await clientHandler.fetchClientMetadata(providedClientId);
- if (!data)
+ const client = await clientHandler.fetchClient(providedClientId);
+ if (!client)
throw createError({
statusCode: 404,
statusMessage: "Request not found.",
});
+ if (client.userId && user.userId !== client.userId)
+ throw createError({
+ statusCode: 400,
+ statusMessage: "Client already claimed.",
+ });
+
await clientHandler.attachUserId(providedClientId, user.userId);
- return data;
+ return client.data;
});
diff --git a/server/api/v1/client/auth/initiate.post.ts b/server/api/v1/client/auth/initiate.post.ts
index 39de29b..64186b5 100644
--- a/server/api/v1/client/auth/initiate.post.ts
+++ b/server/api/v1/client/auth/initiate.post.ts
@@ -1,17 +1,28 @@
-import clientHandler from "~/server/internal/clients/handler";
+import { type } from "arktype";
+import { readDropValidatedBody, throwingArktype } from "~/server/arktype";
+import type {
+ CapabilityConfiguration,
+ InternalClientCapability,
+} from "~/server/internal/clients/capabilities";
+import capabilityManager, {
+ validCapabilities,
+} from "~/server/internal/clients/capabilities";
+import clientHandler, { AuthMode } from "~/server/internal/clients/handler";
import { parsePlatform } from "~/server/internal/utils/parseplatform";
+const ClientAuthInitiate = type({
+ name: "string",
+ platform: "string",
+ capabilities: "object",
+ mode: type.valueOf(AuthMode).default(AuthMode.Callback),
+}).configure(throwingArktype);
+
export default defineEventHandler(async (h3) => {
- const body = await readBody(h3);
+ const body = await readDropValidatedBody(h3, ClientAuthInitiate);
- const name = body.name;
const platformRaw = body.platform;
-
- if (!name || !platformRaw)
- throw createError({
- statusCode: 400,
- statusMessage: "Missing name or platform in body",
- });
+ const capabilities: Partial =
+ body.capabilities ?? {};
const platform = parsePlatform(platformRaw);
if (!platform)
@@ -20,7 +31,41 @@ export default defineEventHandler(async (h3) => {
statusMessage: "Invalid or unsupported platform",
});
- const clientId = await clientHandler.initiate({ name, platform });
+ const capabilityIterable = Object.entries(capabilities) as Array<
+ [InternalClientCapability, object]
+ >;
+ if (
+ capabilityIterable.length > 0 &&
+ capabilityIterable
+ .map(([capability]) => validCapabilities.find((v) => capability == v))
+ .filter((e) => e).length == 0
+ )
+ throw createError({
+ statusCode: 400,
+ statusMessage: "Invalid capabilities.",
+ });
- return `/client/${clientId}/callback`;
+ if (
+ capabilityIterable.length > 0 &&
+ capabilityIterable.filter(
+ ([capability, configuration]) =>
+ !capabilityManager.validateCapabilityConfiguration(
+ capability,
+ configuration,
+ ),
+ ).length > 0
+ )
+ throw createError({
+ statusCode: 400,
+ statusMessage: "Invalid capability configuration.",
+ });
+
+ const result = await clientHandler.initiate({
+ name: body.name,
+ platform,
+ capabilities,
+ mode: body.mode,
+ });
+
+ return result;
});
diff --git a/server/api/v1/client/capability/index.post.ts b/server/api/v1/client/capability/index.post.ts
index 0123860..a33f690 100644
--- a/server/api/v1/client/capability/index.post.ts
+++ b/server/api/v1/client/capability/index.post.ts
@@ -55,6 +55,7 @@ export default defineClientEventHandler(
title: `"${client.name}" can now access ${capability}`,
description: `A device called "${client.name}" now has access to your ${capability}.`,
actions: ["Review|/account/devices"],
+ acls: ["user:clients:read"],
});
return {};
diff --git a/server/api/v1/client/chunk.get.ts b/server/api/v1/client/chunk.get.ts
index bc78468..030b796 100644
--- a/server/api/v1/client/chunk.get.ts
+++ b/server/api/v1/client/chunk.get.ts
@@ -1,11 +1,16 @@
+import cacheHandler from "~/server/internal/cache";
+import { defineClientEventHandler } from "~/server/internal/clients/event-handler";
import prisma from "~/server/internal/db/database";
-import fs from "fs";
-import path from "path";
import libraryManager from "~/server/internal/library";
const chunkSize = 1024 * 1024 * 64;
-export default defineEventHandler(async (h3) => {
+const gameLookupCache = cacheHandler.createCache<{
+ libraryId: string | null;
+ libraryPath: string;
+}>("downloadGameLookupCache");
+
+export default defineClientEventHandler(async (h3) => {
const query = getQuery(h3);
const gameId = query.id?.toString();
const versionName = query.version?.toString();
@@ -18,36 +23,40 @@ export default defineEventHandler(async (h3) => {
statusMessage: "Invalid chunk arguments",
});
- const game = await prisma.game.findUnique({
- where: {
- id: gameId,
- },
- select: {
- libraryBasePath: true,
- },
- });
- if (!game)
- throw createError({ statusCode: 400, statusMessage: "Invalid game ID" });
+ let game = await gameLookupCache.getItem(gameId);
+ if (!game) {
+ game = await prisma.game.findUnique({
+ where: {
+ id: gameId,
+ },
+ select: {
+ libraryId: true,
+ libraryPath: true,
+ },
+ });
+ if (!game || !game.libraryId)
+ throw createError({ statusCode: 400, statusMessage: "Invalid game ID" });
- const versionDir = path.join(
- libraryManager.fetchLibraryPath(),
- game.libraryBasePath,
- versionName,
- );
- if (!fs.existsSync(versionDir))
+ await gameLookupCache.setItem(gameId, game);
+ }
+
+ if (!game.libraryId)
throw createError({
- statusCode: 400,
- statusMessage: "Invalid version name",
+ statusCode: 500,
+ statusMessage: "Somehow, we got here.",
});
- const gameFile = path.join(versionDir, filename);
- if (!fs.existsSync(gameFile))
- throw createError({ statusCode: 400, statusMessage: "Invalid game file" });
-
- const gameFileStats = fs.statSync(gameFile);
+ const peek = await libraryManager.peekFile(
+ game.libraryId,
+ game.libraryPath,
+ versionName,
+ filename,
+ );
+ if (!peek)
+ throw createError({ status: 400, statusMessage: "Failed to peek file" });
const start = chunkIndex * chunkSize;
- const end = Math.min((chunkIndex + 1) * chunkSize, gameFileStats.size);
+ const end = Math.min((chunkIndex + 1) * chunkSize, peek.size);
const currentChunkSize = end - start;
setHeader(h3, "Content-Length", currentChunkSize);
@@ -57,7 +66,18 @@ export default defineEventHandler(async (h3) => {
statusMessage: "Invalid chunk index",
});
- const gameReadStream = fs.createReadStream(gameFile, { start, end: end - 1 }); // end needs to be offset by 1
+ const gameReadStream = await libraryManager.readFile(
+ game.libraryId,
+ game.libraryPath,
+ versionName,
+ filename,
+ { start, end },
+ );
+ if (!gameReadStream)
+ throw createError({
+ statusCode: 400,
+ statusMessage: "Failed to create stream",
+ });
- return gameReadStream;
+ return sendStream(h3, gameReadStream);
});
diff --git a/server/api/v1/client/peer/index.get.ts b/server/api/v1/client/peer/index.get.ts
deleted file mode 100644
index c37d8cd..0000000
--- a/server/api/v1/client/peer/index.get.ts
+++ /dev/null
@@ -1,20 +0,0 @@
-import { ClientCapabilities } from "~/prisma/client";
-import { defineClientEventHandler } from "~/server/internal/clients/event-handler";
-import headscaleManager from "~/server/internal/p2p/headscale";
-
-export default defineClientEventHandler(async (h3, { fetchClient }) => {
- const client = await fetchClient();
- if (!client.capabilities.includes(ClientCapabilities.PeerAPI))
- throw createError({
- statusCode: 403,
- statusMessage: "Capability not allowed.",
- });
-
- if (!headscaleManager.enabled())
- throw createError({
- statusCode: 500,
- statusMessage: "Peer network not available.",
- });
-
- return headscaleManager.configuration();
-});
diff --git a/server/api/v1/client/peer/index.post.ts b/server/api/v1/client/peer/index.post.ts
deleted file mode 100644
index 775a7f4..0000000
--- a/server/api/v1/client/peer/index.post.ts
+++ /dev/null
@@ -1,26 +0,0 @@
-import { ClientCapabilities } from "~/prisma/client";
-import { defineClientEventHandler } from "~/server/internal/clients/event-handler";
-import headscaleManager from "~/server/internal/p2p/headscale";
-
-export default defineClientEventHandler(
- async (h3, { fetchClient, fetchUser }) => {
- const client = await fetchClient();
- if (!client.capabilities.includes(ClientCapabilities.PeerAPI))
- throw createError({
- statusCode: 403,
- statusMessage: "Capability not allowed.",
- });
-
- if (!headscaleManager.enabled())
- throw createError({
- statusCode: 500,
- statusMessage: "Peer network not available.",
- });
-
- const user = await fetchUser();
-
- const key = await headscaleManager.createPreauthKey(user, client);
-
- return key;
- },
-);
diff --git a/server/api/v1/client/saves/[gameid]/[slotindex]/index.delete.ts b/server/api/v1/client/saves/[gameid]/[slotindex]/index.delete.ts
index 103dbd7..0f36008 100644
--- a/server/api/v1/client/saves/[gameid]/[slotindex]/index.delete.ts
+++ b/server/api/v1/client/saves/[gameid]/[slotindex]/index.delete.ts
@@ -1,4 +1,4 @@
-import { ClientCapabilities } from "~/prisma/client";
+import { ClientCapabilities } from "~/prisma/client/enums";
import { defineClientEventHandler } from "~/server/internal/clients/event-handler";
import prisma from "~/server/internal/db/database";
diff --git a/server/api/v1/client/saves/[gameid]/[slotindex]/index.get.ts b/server/api/v1/client/saves/[gameid]/[slotindex]/index.get.ts
index d4633a7..1ea38ae 100644
--- a/server/api/v1/client/saves/[gameid]/[slotindex]/index.get.ts
+++ b/server/api/v1/client/saves/[gameid]/[slotindex]/index.get.ts
@@ -1,4 +1,4 @@
-import { ClientCapabilities } from "~/prisma/client";
+import { ClientCapabilities } from "~/prisma/client/enums";
import { defineClientEventHandler } from "~/server/internal/clients/event-handler";
import prisma from "~/server/internal/db/database";
diff --git a/server/api/v1/client/saves/[gameid]/[slotindex]/push.post.ts b/server/api/v1/client/saves/[gameid]/[slotindex]/push.post.ts
index 0572e7a..8034b81 100644
--- a/server/api/v1/client/saves/[gameid]/[slotindex]/push.post.ts
+++ b/server/api/v1/client/saves/[gameid]/[slotindex]/push.post.ts
@@ -1,4 +1,4 @@
-import { ClientCapabilities } from "~/prisma/client";
+import { ClientCapabilities } from "~/prisma/client/enums";
import { defineClientEventHandler } from "~/server/internal/clients/event-handler";
import prisma from "~/server/internal/db/database";
import saveManager from "~/server/internal/saves";
diff --git a/server/api/v1/client/saves/[gameid]/index.get.ts b/server/api/v1/client/saves/[gameid]/index.get.ts
index bf2a864..53ce8a5 100644
--- a/server/api/v1/client/saves/[gameid]/index.get.ts
+++ b/server/api/v1/client/saves/[gameid]/index.get.ts
@@ -1,4 +1,4 @@
-import { ClientCapabilities } from "~/prisma/client";
+import { ClientCapabilities } from "~/prisma/client/enums";
import { defineClientEventHandler } from "~/server/internal/clients/event-handler";
import prisma from "~/server/internal/db/database";
diff --git a/server/api/v1/client/saves/[gameid]/index.post.ts b/server/api/v1/client/saves/[gameid]/index.post.ts
index a605170..91193ce 100644
--- a/server/api/v1/client/saves/[gameid]/index.post.ts
+++ b/server/api/v1/client/saves/[gameid]/index.post.ts
@@ -1,4 +1,4 @@
-import { ClientCapabilities } from "~/prisma/client";
+import { ClientCapabilities } from "~/prisma/client/enums";
import { defineClientEventHandler } from "~/server/internal/clients/event-handler";
import { applicationSettings } from "~/server/internal/config/application-configuration";
import prisma from "~/server/internal/db/database";
diff --git a/server/api/v1/client/saves/index.get.ts b/server/api/v1/client/saves/index.get.ts
index 6241bae..506151e 100644
--- a/server/api/v1/client/saves/index.get.ts
+++ b/server/api/v1/client/saves/index.get.ts
@@ -1,4 +1,4 @@
-import { ClientCapabilities } from "~/prisma/client";
+import { ClientCapabilities } from "~/prisma/client/enums";
import { defineClientEventHandler } from "~/server/internal/clients/event-handler";
import prisma from "~/server/internal/db/database";
diff --git a/server/api/v1/client/saves/settings.get.ts b/server/api/v1/client/saves/settings.get.ts
index 296bfa4..05c3026 100644
--- a/server/api/v1/client/saves/settings.get.ts
+++ b/server/api/v1/client/saves/settings.get.ts
@@ -1,4 +1,4 @@
-import { ClientCapabilities } from "~/prisma/client";
+import { ClientCapabilities } from "~/prisma/client/enums";
import { defineClientEventHandler } from "~/server/internal/clients/event-handler";
import { applicationSettings } from "~/server/internal/config/application-configuration";
diff --git a/server/api/v1/client/user/webtoken.post.ts b/server/api/v1/client/user/webtoken.post.ts
index dbc5bbb..eda744f 100644
--- a/server/api/v1/client/user/webtoken.post.ts
+++ b/server/api/v1/client/user/webtoken.post.ts
@@ -1,4 +1,4 @@
-import { APITokenMode } from "~/prisma/client";
+import { APITokenMode } from "~/prisma/client/enums";
import { DateTime } from "luxon";
import type { UserACL } from "~/server/internal/acls";
import { defineClientEventHandler } from "~/server/internal/clients/event-handler";
diff --git a/server/api/v1/companies/[id]/index.get.ts b/server/api/v1/companies/[id]/index.get.ts
new file mode 100644
index 0000000..a326371
--- /dev/null
+++ b/server/api/v1/companies/[id]/index.get.ts
@@ -0,0 +1,23 @@
+import aclManager from "~/server/internal/acls";
+import prisma from "~/server/internal/db/database";
+
+export default defineEventHandler(async (h3) => {
+ const userId = await aclManager.getUserIdACL(h3, ["store:read"]);
+ if (!userId) throw createError({ statusCode: 403 });
+
+ const companyId = getRouterParam(h3, "id");
+ if (!companyId)
+ throw createError({
+ statusCode: 400,
+ statusMessage: "Missing gameId in route params (somehow...?)",
+ });
+
+ const company = await prisma.company.findUnique({
+ where: { id: companyId },
+ });
+
+ if (!company)
+ throw createError({ statusCode: 404, statusMessage: "Company not found" });
+
+ return { company };
+});
diff --git a/server/api/v1/games/[id]/index.get.ts b/server/api/v1/games/[id]/index.get.ts
index d7c1ed8..029b9b2 100644
--- a/server/api/v1/games/[id]/index.get.ts
+++ b/server/api/v1/games/[id]/index.get.ts
@@ -16,11 +16,40 @@ export default defineEventHandler(async (h3) => {
where: { id: gameId },
include: {
versions: true,
+ publishers: {
+ select: {
+ id: true,
+ mName: true,
+ mShortDescription: true,
+ mLogoObjectId: true,
+ },
+ },
+ developers: {
+ select: {
+ id: true,
+ mName: true,
+ mShortDescription: true,
+ mLogoObjectId: true,
+ },
+ },
+ tags: true,
},
});
if (!game)
throw createError({ statusCode: 404, statusMessage: "Game not found" });
- return game;
+ const rating = await prisma.gameRating.aggregate({
+ where: {
+ gameId: game.id,
+ },
+ _avg: {
+ mReviewRating: true,
+ },
+ _sum: {
+ mReviewCount: true,
+ },
+ });
+
+ return { game, rating };
});
diff --git a/server/api/v1/index.get.ts b/server/api/v1/index.get.ts
index 37b2372..4d25388 100644
--- a/server/api/v1/index.get.ts
+++ b/server/api/v1/index.get.ts
@@ -1,5 +1,10 @@
+import { systemConfig } from "~/server/internal/config/sys-conf";
+
export default defineEventHandler((_h3) => {
return {
appName: "Drop",
+ version: systemConfig.getDropVersion(),
+ gitRef: `#${systemConfig.getGitRef()}`,
+ external: systemConfig.getExternalUrl(),
};
});
diff --git a/server/api/v1/notifications/index.get.ts b/server/api/v1/notifications/index.get.ts
index 8797aa8..982d520 100644
--- a/server/api/v1/notifications/index.get.ts
+++ b/server/api/v1/notifications/index.get.ts
@@ -5,17 +5,19 @@ export default defineEventHandler(async (h3) => {
const userId = await aclManager.getUserIdACL(h3, ["notifications:read"]);
if (!userId) throw createError({ statusCode: 403 });
- const userIds = [userId];
- const hasSystemPerms = await aclManager.allowSystemACL(h3, [
- "notifications:mark",
- ]);
- if (hasSystemPerms) {
- userIds.push("system");
- }
+ const acls = await aclManager.fetchAllACLs(h3);
+ if (!acls)
+ throw createError({
+ statusCode: 500,
+ statusMessage: "Got userId but no ACLs - what?",
+ });
const notifications = await prisma.notification.findMany({
where: {
- userId: { in: userIds },
+ userId,
+ acls: {
+ hasSome: acls,
+ },
},
orderBy: {
created: "desc", // Newest first
diff --git a/server/api/v1/notifications/readall.post.ts b/server/api/v1/notifications/readall.post.ts
index 2ee4773..0e4c8c7 100644
--- a/server/api/v1/notifications/readall.post.ts
+++ b/server/api/v1/notifications/readall.post.ts
@@ -5,17 +5,19 @@ export default defineEventHandler(async (h3) => {
const userId = await aclManager.getUserIdACL(h3, ["notifications:mark"]);
if (!userId) throw createError({ statusCode: 403 });
- const userIds = [userId];
- const hasSystemPerms = await aclManager.allowSystemACL(h3, [
- "notifications:mark",
- ]);
- if (hasSystemPerms) {
- userIds.push("system");
- }
+ const acls = await aclManager.fetchAllACLs(h3);
+ if (!acls)
+ throw createError({
+ statusCode: 500,
+ statusMessage: "Got userId but no ACLs - what?",
+ });
await prisma.notification.updateMany({
where: {
- userId: { in: userIds },
+ userId,
+ acls: {
+ hasSome: acls,
+ },
},
data: {
read: true,
diff --git a/server/api/v1/notifications/ws.get.ts b/server/api/v1/notifications/ws.get.ts
index 58db068..2f86d7c 100644
--- a/server/api/v1/notifications/ws.get.ts
+++ b/server/api/v1/notifications/ws.get.ts
@@ -1,5 +1,6 @@
import notificationSystem from "~/server/internal/notifications";
import aclManager from "~/server/internal/acls";
+import { logger } from "~/server/internal/logging";
// TODO add web socket sessions for horizontal scaling
// Peer ID to user ID
@@ -14,27 +15,22 @@ export default defineWebSocketHandler({
return;
}
- const userIds = [userId];
-
- const hasSystemPerms = await aclManager.allowSystemACL(h3, [
- "notifications:listen",
- ]);
- if (hasSystemPerms) {
- userIds.push("system");
+ const acls = await aclManager.fetchAllACLs(h3);
+ if (!acls) {
+ peer.send("unauthenticated");
+ return;
}
socketSessions.set(peer.id, userId);
- for (const listenUserId of userIds) {
- notificationSystem.listen(listenUserId, peer.id, (notification) => {
- peer.send(JSON.stringify(notification));
- });
- }
+ notificationSystem.listen(userId, acls, peer.id, (notification) => {
+ peer.send(JSON.stringify(notification));
+ });
},
async close(peer, _details) {
const userId = socketSessions.get(peer.id);
if (!userId) {
- console.log(`skipping websocket close for ${peer.id}`);
+ logger.info(`skipping websocket close for ${peer.id}`);
return;
}
diff --git a/server/api/v1/object/[id]/index.delete.ts b/server/api/v1/object/[id]/index.delete.ts
index ba8f568..fbdd5ee 100644
--- a/server/api/v1/object/[id]/index.delete.ts
+++ b/server/api/v1/object/[id]/index.delete.ts
@@ -1,12 +1,15 @@
import aclManager from "~/server/internal/acls";
import objectHandler from "~/server/internal/objects";
+import sanitize from "sanitize-filename";
export default defineEventHandler(async (h3) => {
- const id = getRouterParam(h3, "id");
- if (!id) throw createError({ statusCode: 400, statusMessage: "Invalid ID" });
+ const unsafeId = getRouterParam(h3, "id");
+ if (!unsafeId)
+ throw createError({ statusCode: 400, statusMessage: "Invalid ID" });
const userId = await aclManager.getUserIdACL(h3, ["object:delete"]);
+ const id = sanitize(unsafeId);
const result = await objectHandler.deleteWithPermission(id, userId);
return { success: result };
});
diff --git a/server/api/v1/object/[id]/index.get.ts b/server/api/v1/object/[id]/index.get.ts
index 6a7ec84..649bfcd 100644
--- a/server/api/v1/object/[id]/index.get.ts
+++ b/server/api/v1/object/[id]/index.get.ts
@@ -1,12 +1,15 @@
import aclManager from "~/server/internal/acls";
import objectHandler from "~/server/internal/objects";
+import sanitize from "sanitize-filename";
export default defineEventHandler(async (h3) => {
- const id = getRouterParam(h3, "id");
- if (!id) throw createError({ statusCode: 400, statusMessage: "Invalid ID" });
+ const unsafeId = getRouterParam(h3, "id");
+ if (!unsafeId)
+ throw createError({ statusCode: 400, statusMessage: "Invalid ID" });
const userId = await aclManager.getUserIdACL(h3, ["object:read"]);
+ const id = sanitize(unsafeId);
const object = await objectHandler.fetchWithPermissions(id, userId);
if (!object)
throw createError({ statusCode: 404, statusMessage: "Object not found" });
diff --git a/server/api/v1/object/[id]/index.head.ts b/server/api/v1/object/[id]/index.head.ts
index b3f836e..e762de5 100644
--- a/server/api/v1/object/[id]/index.head.ts
+++ b/server/api/v1/object/[id]/index.head.ts
@@ -1,13 +1,16 @@
import aclManager from "~/server/internal/acls";
import objectHandler from "~/server/internal/objects";
+import sanitize from "sanitize-filename";
// this request method is purely used by the browser to check if etag values are still valid
export default defineEventHandler(async (h3) => {
- const id = getRouterParam(h3, "id");
- if (!id) throw createError({ statusCode: 400, statusMessage: "Invalid ID" });
+ const unsafeId = getRouterParam(h3, "id");
+ if (!unsafeId)
+ throw createError({ statusCode: 400, statusMessage: "Invalid ID" });
const userId = await aclManager.getUserIdACL(h3, ["object:read"]);
+ const id = sanitize(unsafeId);
const object = await objectHandler.fetchWithPermissions(id, userId);
if (!object)
throw createError({ statusCode: 404, statusMessage: "Object not found" });
diff --git a/server/api/v1/object/[id]/index.post.ts b/server/api/v1/object/[id]/index.post.ts
index ef58453..e6779ff 100644
--- a/server/api/v1/object/[id]/index.post.ts
+++ b/server/api/v1/object/[id]/index.post.ts
@@ -1,9 +1,11 @@
import aclManager from "~/server/internal/acls";
import objectHandler from "~/server/internal/objects";
+import sanitize from "sanitize-filename";
export default defineEventHandler(async (h3) => {
- const id = getRouterParam(h3, "id");
- if (!id) throw createError({ statusCode: 400, statusMessage: "Invalid ID" });
+ const unsafeId = getRouterParam(h3, "id");
+ if (!unsafeId)
+ throw createError({ statusCode: 400, statusMessage: "Invalid ID" });
const body = await readRawBody(h3, "binary");
if (!body)
@@ -15,6 +17,7 @@ export default defineEventHandler(async (h3) => {
const userId = await aclManager.getUserIdACL(h3, ["object:update"]);
const buffer = Buffer.from(body);
+ const id = sanitize(unsafeId);
const result = await objectHandler.writeWithPermissions(
id,
async () => buffer,
diff --git a/server/api/v1/screenshots/[id]/index.delete.ts b/server/api/v1/screenshots/[id]/index.delete.ts
new file mode 100644
index 0000000..41e2bf5
--- /dev/null
+++ b/server/api/v1/screenshots/[id]/index.delete.ts
@@ -0,0 +1,29 @@
+// get a specific screenshot
+import aclManager from "~/server/internal/acls";
+import screenshotManager from "~/server/internal/screenshots";
+import sanitize from "sanitize-filename";
+
+export default defineEventHandler(async (h3) => {
+ const userId = await aclManager.getUserIdACL(h3, ["screenshots:delete"]);
+ if (!userId) throw createError({ statusCode: 403 });
+
+ const unsafeId = getRouterParam(h3, "id");
+ if (!unsafeId)
+ throw createError({
+ statusCode: 400,
+ statusMessage: "Missing screenshot ID",
+ });
+
+ const screenshotId = sanitize(unsafeId);
+ const result = await screenshotManager.get(screenshotId);
+ if (!result)
+ throw createError({
+ statusCode: 404,
+ });
+ if (result.userId !== userId)
+ throw createError({
+ statusCode: 404,
+ });
+
+ await screenshotManager.delete(screenshotId);
+});
diff --git a/server/api/v1/screenshots/[id]/index.get.ts b/server/api/v1/screenshots/[id]/index.get.ts
new file mode 100644
index 0000000..79d569a
--- /dev/null
+++ b/server/api/v1/screenshots/[id]/index.get.ts
@@ -0,0 +1,27 @@
+// get a specific screenshot
+import aclManager from "~/server/internal/acls";
+import screenshotManager from "~/server/internal/screenshots";
+import sanitize from "sanitize-filename";
+
+export default defineEventHandler(async (h3) => {
+ const userId = await aclManager.getUserIdACL(h3, ["screenshots:read"]);
+ if (!userId) throw createError({ statusCode: 403 });
+
+ const unsafeId = getRouterParam(h3, "id");
+ if (!unsafeId)
+ throw createError({
+ statusCode: 400,
+ statusMessage: "Missing screenshot ID",
+ });
+
+ const result = await screenshotManager.get(sanitize(unsafeId));
+ if (!result)
+ throw createError({
+ statusCode: 404,
+ });
+ if (result.userId !== userId)
+ throw createError({
+ statusCode: 404,
+ });
+ return result;
+});
diff --git a/server/api/v1/screenshots/game/[id]/index.get.ts b/server/api/v1/screenshots/game/[id]/index.get.ts
new file mode 100644
index 0000000..71addae
--- /dev/null
+++ b/server/api/v1/screenshots/game/[id]/index.get.ts
@@ -0,0 +1,18 @@
+// get all user screenshots by game
+import aclManager from "~/server/internal/acls";
+import screenshotManager from "~/server/internal/screenshots";
+
+export default defineEventHandler(async (h3) => {
+ const userId = await aclManager.getUserIdACL(h3, ["screenshots:read"]);
+ if (!userId) throw createError({ statusCode: 403 });
+
+ const gameId = getRouterParam(h3, "id");
+ if (!gameId)
+ throw createError({
+ statusCode: 400,
+ statusMessage: "Missing game ID",
+ });
+
+ const results = await screenshotManager.getUserAllByGame(userId, gameId);
+ return results;
+});
diff --git a/server/api/v1/screenshots/game/[id]/index.post.ts b/server/api/v1/screenshots/game/[id]/index.post.ts
new file mode 100644
index 0000000..c06b815
--- /dev/null
+++ b/server/api/v1/screenshots/game/[id]/index.post.ts
@@ -0,0 +1,27 @@
+// create new screenshot
+import aclManager from "~/server/internal/acls";
+import prisma from "~/server/internal/db/database";
+import screenshotManager from "~/server/internal/screenshots";
+
+// TODO: make defineClientEventHandler instead?
+// only clients will be upload screenshots yea??
+export default defineEventHandler(async (h3) => {
+ const userId = await aclManager.getUserIdACL(h3, ["screenshots:new"]);
+ if (!userId) throw createError({ statusCode: 403 });
+
+ const gameId = getRouterParam(h3, "id");
+ if (!gameId)
+ throw createError({
+ statusCode: 400,
+ statusMessage: "Missing game ID",
+ });
+
+ const game = await prisma.game.findUnique({
+ where: { id: gameId },
+ select: { id: true },
+ });
+ if (!game)
+ throw createError({ statusCode: 400, statusMessage: "Invalid game ID" });
+
+ await screenshotManager.upload(userId, gameId, h3.node.req);
+});
diff --git a/server/api/v1/screenshots/index.get.ts b/server/api/v1/screenshots/index.get.ts
new file mode 100644
index 0000000..97b9f93
--- /dev/null
+++ b/server/api/v1/screenshots/index.get.ts
@@ -0,0 +1,11 @@
+// get all user screenshots
+import aclManager from "~/server/internal/acls";
+import screenshotManager from "~/server/internal/screenshots";
+
+export default defineEventHandler(async (h3) => {
+ const userId = await aclManager.getUserIdACL(h3, ["screenshots:read"]);
+ if (!userId) throw createError({ statusCode: 403 });
+
+ const results = await screenshotManager.getUserAll(userId);
+ return results;
+});
diff --git a/server/api/v1/settings/index.get.ts b/server/api/v1/settings/index.get.ts
new file mode 100644
index 0000000..dea2604
--- /dev/null
+++ b/server/api/v1/settings/index.get.ts
@@ -0,0 +1,13 @@
+import aclManager from "~/server/internal/acls";
+import { applicationSettings } from "~/server/internal/config/application-configuration";
+
+export default defineEventHandler(async (h3) => {
+ const allowed = await aclManager.getUserACL(h3, ["settings:read"]);
+ if (!allowed) throw createError({ statusCode: 403 });
+
+ const showGamePanelTextDecoration = await applicationSettings.get(
+ "showGamePanelTextDecoration",
+ );
+
+ return { showGamePanelTextDecoration };
+});
diff --git a/server/api/v1/setup.post.ts b/server/api/v1/setup.post.ts
new file mode 100644
index 0000000..acd83f6
--- /dev/null
+++ b/server/api/v1/setup.post.ts
@@ -0,0 +1,20 @@
+import { APITokenMode } from "~/prisma/client/enums";
+import aclManager from "~/server/internal/acls";
+import prisma from "~/server/internal/db/database";
+
+export default defineEventHandler(async (h3) => {
+ const allowed = await aclManager.allowSystemACL(h3, ["setup"]);
+ if (!allowed)
+ throw createError({
+ statusCode: 403,
+ statusMessage: "Must use a setup token.",
+ });
+ await prisma.aPIToken.deleteMany({
+ where: {
+ mode: APITokenMode.System,
+ acls: {
+ hasSome: ["setup"],
+ },
+ },
+ });
+});
diff --git a/server/api/v1/store/recent.get.ts b/server/api/v1/store/featured.get.ts
similarity index 94%
rename from server/api/v1/store/recent.get.ts
rename to server/api/v1/store/featured.get.ts
index f4bb39a..fb353e4 100644
--- a/server/api/v1/store/recent.get.ts
+++ b/server/api/v1/store/featured.get.ts
@@ -6,6 +6,9 @@ export default defineEventHandler(async (h3) => {
if (!userId) throw createError({ statusCode: 403 });
const games = await prisma.game.findMany({
+ where: {
+ featured: true,
+ },
select: {
id: true,
mName: true,
@@ -28,7 +31,6 @@ export default defineEventHandler(async (h3) => {
orderBy: {
created: "desc",
},
- take: 8,
});
return games;
diff --git a/server/api/v1/store/index.get.ts b/server/api/v1/store/index.get.ts
new file mode 100644
index 0000000..9a61e67
--- /dev/null
+++ b/server/api/v1/store/index.get.ts
@@ -0,0 +1,122 @@
+import { ArkErrors, type } from "arktype";
+import type { Prisma } from "~/prisma/client/client";
+import aclManager from "~/server/internal/acls";
+import prisma from "~/server/internal/db/database";
+import { parsePlatform } from "~/server/internal/utils/parseplatform";
+
+const StoreRead = type({
+ skip: type("string")
+ .pipe((s) => Number.parseInt(s))
+ .default("0"),
+ take: type("string")
+ .pipe((s) => Number.parseInt(s))
+ .default("10"),
+
+ tags: "string?",
+ platform: "string?",
+
+ company: "string?",
+ companyActions: "string = 'published,developed'",
+
+ sort: "'default' | 'newest' | 'recent' = 'default'",
+});
+
+export default defineEventHandler(async (h3) => {
+ const userId = await aclManager.getUserIdACL(h3, ["store:read"]);
+ if (!userId) throw createError({ statusCode: 403 });
+
+ const query = getQuery(h3);
+ const options = StoreRead(query);
+ if (options instanceof ArkErrors)
+ throw createError({ statusCode: 400, statusMessage: options.summary });
+
+ /**
+ * Generic filters
+ */
+ const tagFilter = options.tags
+ ? {
+ tags: {
+ some: {
+ id: {
+ in: options.tags.split(","),
+ },
+ },
+ },
+ }
+ : undefined;
+ const platformFilter = options.platform
+ ? {
+ versions: {
+ some: {
+ platform: {
+ in: options.platform
+ .split(",")
+ .map(parsePlatform)
+ .filter((e) => e !== undefined),
+ },
+ },
+ },
+ }
+ : undefined;
+
+ /**
+ * Company filtering
+ */
+ const companyActions = options.companyActions.split(",");
+ const developedFilter = companyActions.includes("developed")
+ ? {
+ developers: {
+ some: {
+ id: options.company!,
+ },
+ },
+ }
+ : undefined;
+ const publishedFilter = companyActions.includes("published")
+ ? {
+ publishers: {
+ some: {
+ id: options.company!,
+ },
+ },
+ }
+ : undefined;
+ const companyFilter = options.company
+ ? ({
+ OR: [developedFilter, publishedFilter].filter((e) => e !== undefined),
+ } satisfies Prisma.GameWhereInput)
+ : undefined;
+
+ /**
+ * Query
+ */
+
+ const finalFilter: Prisma.GameWhereInput = {
+ ...tagFilter,
+ ...platformFilter,
+ ...companyFilter,
+ };
+
+ const sort: Prisma.GameOrderByWithRelationInput = {};
+ switch (options.sort) {
+ case "default":
+ case "newest":
+ sort.mReleased = "desc";
+ break;
+ case "recent":
+ sort.created = "desc";
+ break;
+ }
+
+ const [results, count] = await prisma.$transaction([
+ prisma.game.findMany({
+ skip: options.skip,
+ take: Math.min(options.take, 50),
+ where: finalFilter,
+ orderBy: sort,
+ }),
+ prisma.game.count({ where: finalFilter }),
+ ]);
+
+ return { results, count };
+});
diff --git a/server/api/v1/store/released.get.ts b/server/api/v1/store/tags.get.ts
similarity index 52%
rename from server/api/v1/store/released.get.ts
rename to server/api/v1/store/tags.get.ts
index 37c729c..07f4030 100644
--- a/server/api/v1/store/released.get.ts
+++ b/server/api/v1/store/tags.get.ts
@@ -2,15 +2,9 @@ import aclManager from "~/server/internal/acls";
import prisma from "~/server/internal/db/database";
export default defineEventHandler(async (h3) => {
- const userId = await aclManager.getUserACL(h3, ["store:read"]);
+ const userId = await aclManager.getUserIdACL(h3, ["store:read"]);
if (!userId) throw createError({ statusCode: 403 });
- const games = await prisma.game.findMany({
- orderBy: {
- mReleased: "desc",
- },
- take: 12,
- });
-
- return games;
+ const tags = await prisma.gameTag.findMany({ orderBy: { name: "asc" } });
+ return tags;
});
diff --git a/server/api/v1/store/updated.get.ts b/server/api/v1/store/updated.get.ts
deleted file mode 100644
index 520033e..0000000
--- a/server/api/v1/store/updated.get.ts
+++ /dev/null
@@ -1,28 +0,0 @@
-import aclManager from "~/server/internal/acls";
-import prisma from "~/server/internal/db/database";
-
-export default defineEventHandler(async (h3) => {
- const userId = await aclManager.getUserACL(h3, ["store:read"]);
- if (!userId) throw createError({ statusCode: 403 });
-
- const versions = await prisma.gameVersion.findMany({
- where: {
- versionIndex: {
- gte: 1,
- },
- },
- select: {
- game: true,
- },
- orderBy: {
- created: "desc",
- },
- take: 12,
- });
-
- const games = versions
- .map((e) => e.game)
- .filter((v, i, a) => a.findIndex((e) => e.id === v.id) === i);
-
- return games;
-});
diff --git a/server/api/v1/tags/[id]/index.get.ts b/server/api/v1/tags/[id]/index.get.ts
new file mode 100644
index 0000000..5d5d686
--- /dev/null
+++ b/server/api/v1/tags/[id]/index.get.ts
@@ -0,0 +1,23 @@
+import aclManager from "~/server/internal/acls";
+import prisma from "~/server/internal/db/database";
+
+export default defineEventHandler(async (h3) => {
+ const userId = await aclManager.getUserIdACL(h3, ["store:read"]);
+ if (!userId) throw createError({ statusCode: 403 });
+
+ const tagId = getRouterParam(h3, "id");
+ if (!tagId)
+ throw createError({
+ statusCode: 400,
+ statusMessage: "Missing gameId in route params (somehow...?)",
+ });
+
+ const tag = await prisma.gameTag.findUnique({
+ where: { id: tagId },
+ });
+
+ if (!tag)
+ throw createError({ statusCode: 404, statusMessage: "Tag not found" });
+
+ return { tag };
+});
diff --git a/server/api/v1/token.get.ts b/server/api/v1/token.get.ts
new file mode 100644
index 0000000..1ce5320
--- /dev/null
+++ b/server/api/v1/token.get.ts
@@ -0,0 +1,6 @@
+import aclManager from "~/server/internal/acls";
+
+export default defineEventHandler(async (h3) => {
+ const acls = await aclManager.fetchAllACLs(h3);
+ return acls;
+});
diff --git a/server/api/v1/user/token/[id]/index.delete.ts b/server/api/v1/user/token/[id]/index.delete.ts
index b98ae98..54d1be1 100644
--- a/server/api/v1/user/token/[id]/index.delete.ts
+++ b/server/api/v1/user/token/[id]/index.delete.ts
@@ -1,4 +1,4 @@
-import { APITokenMode } from "~/prisma/client";
+import { APITokenMode } from "~/prisma/client/enums";
import aclManager from "~/server/internal/acls";
import prisma from "~/server/internal/db/database";
diff --git a/server/api/v1/user/token/index.get.ts b/server/api/v1/user/token/index.get.ts
index 349ac76..cff1b85 100644
--- a/server/api/v1/user/token/index.get.ts
+++ b/server/api/v1/user/token/index.get.ts
@@ -1,4 +1,4 @@
-import { APITokenMode } from "~/prisma/client";
+import { APITokenMode } from "~/prisma/client/enums";
import aclManager from "~/server/internal/acls";
import prisma from "~/server/internal/db/database";
diff --git a/server/api/v1/user/token/index.post.ts b/server/api/v1/user/token/index.post.ts
index 54376d3..aafacf3 100644
--- a/server/api/v1/user/token/index.post.ts
+++ b/server/api/v1/user/token/index.post.ts
@@ -1,30 +1,22 @@
-import { APITokenMode } from "~/prisma/client";
+import { type } from "arktype";
+import { APITokenMode } from "~/prisma/client/enums";
+import { readDropValidatedBody, throwingArktype } from "~/server/arktype";
import aclManager, { userACLs } from "~/server/internal/acls";
import prisma from "~/server/internal/db/database";
+const CreateToken = type({
+ name: "string",
+ acls: "string[] > 0",
+ expiry: "string.date.iso.parse?",
+}).configure(throwingArktype);
+
export default defineEventHandler(async (h3) => {
const userId = await aclManager.getUserIdACL(h3, []); // No ACLs only allows session authentication
if (!userId) throw createError({ statusCode: 403 });
- const body = await readBody(h3);
- const name: string = body.name;
- const acls: string[] = body.acls;
+ const body = await readDropValidatedBody(h3, CreateToken);
- if (!name || typeof name !== "string")
- throw createError({
- statusCode: 400,
- statusMessage: "Token name required",
- });
- if (!acls || !Array.isArray(acls))
- throw createError({ statusCode: 400, statusMessage: "ACLs required" });
-
- if (acls.length == 0)
- throw createError({
- statusCode: 400,
- statusMessage: "Token requires more than zero ACLs",
- });
-
- const invalidACLs = acls.filter(
+ const invalidACLs = body.acls.filter(
(e) => userACLs.findIndex((v) => e == v) == -1,
);
if (invalidACLs.length > 0)
@@ -36,9 +28,10 @@ export default defineEventHandler(async (h3) => {
const token = await prisma.aPIToken.create({
data: {
mode: APITokenMode.User,
- name: name,
+ name: body.name,
userId: userId,
- acls: acls,
+ acls: body.acls,
+ expiresAt: body.expiry ?? null,
},
});
diff --git a/server/api/v2/client/chunk.post.ts b/server/api/v2/client/chunk.post.ts
new file mode 100644
index 0000000..8402203
--- /dev/null
+++ b/server/api/v2/client/chunk.post.ts
@@ -0,0 +1,86 @@
+import { type } from "arktype";
+import { readDropValidatedBody, throwingArktype } from "~/server/arktype";
+import contextManager from "~/server/internal/downloads/coordinator";
+import libraryManager from "~/server/internal/library";
+import { logger } from "~/server/internal/logging";
+
+const GetChunk = type({
+ context: "string",
+ files: type({
+ filename: "string",
+ chunkIndex: "number",
+ }).array(),
+}).configure(throwingArktype);
+
+export default defineEventHandler(async (h3) => {
+ const body = await readDropValidatedBody(h3, GetChunk);
+
+ const context = await contextManager.fetchContext(body.context);
+ if (!context)
+ throw createError({
+ statusCode: 400,
+ statusMessage: "Invalid download context.",
+ });
+
+ const streamFiles = [];
+
+ for (const file of body.files) {
+ const manifestFile = context.manifest[file.filename];
+ if (!manifestFile)
+ throw createError({
+ statusCode: 400,
+ statusMessage: `Unknown file: ${file.filename}`,
+ });
+
+ const start = manifestFile.lengths
+ .slice(0, file.chunkIndex)
+ .reduce((a, b) => a + b, 0);
+ const end = start + manifestFile.lengths[file.chunkIndex];
+
+ streamFiles.push({ filename: file.filename, start, end });
+ }
+
+ setHeader(
+ h3,
+ "Content-Lengths",
+ streamFiles.map((e) => e.end - e.start).join(","),
+ ); // Non-standard header, but we're cool like that 😎
+
+ for (const file of streamFiles) {
+ const gameReadStream = await libraryManager.readFile(
+ context.libraryId,
+ context.libraryPath,
+ context.versionName,
+ file.filename,
+ { start: file.start, end: file.end },
+ );
+ if (!gameReadStream)
+ throw createError({
+ statusCode: 500,
+ statusMessage: "Failed to create read stream",
+ });
+ let length = 0;
+ await gameReadStream.pipeTo(
+ new WritableStream({
+ write(chunk) {
+ h3.node.res.write(chunk);
+ length += chunk.length;
+ },
+ }),
+ );
+
+ if (length != file.end - file.start) {
+ logger.warn(
+ `failed to read enough from ${file.filename}. read ${length}, required: ${file.end - file.start}`,
+ );
+ throw createError({
+ statusCode: 500,
+ statusMessage: "Failed to read enough from stream.",
+ });
+ }
+ }
+
+ await h3.node.res.end();
+
+ return;
+});
diff --git a/server/api/v2/client/context.post.ts b/server/api/v2/client/context.post.ts
new file mode 100644
index 0000000..e54356a
--- /dev/null
+++ b/server/api/v2/client/context.post.ts
@@ -0,0 +1,22 @@
+import { type } from "arktype";
+import { readDropValidatedBody, throwingArktype } from "~/server/arktype";
+import { defineClientEventHandler } from "~/server/internal/clients/event-handler";
+import contextManager from "~/server/internal/downloads/coordinator";
+
+const CreateContext = type({
+ game: "string",
+ version: "string",
+}).configure(throwingArktype);
+
+export default defineClientEventHandler(async (h3) => {
+ const body = await readDropValidatedBody(h3, CreateContext);
+
+ const context = await contextManager.createContext(body.game, body.version);
+ if (!context)
+ throw createError({
+ statusCode: 400,
+ statusMessage: "Invalid game or version",
+ });
+
+ return { context };
+});
diff --git a/server/arktype.ts b/server/arktype.ts
new file mode 100644
index 0000000..466851e
--- /dev/null
+++ b/server/arktype.ts
@@ -0,0 +1,52 @@
+import { ArkErrors } from "arktype";
+import { configure } from "arktype/config";
+import type { H3Event } from "h3";
+
+export const throwingArktype = configure({
+ onFail: (errors) => errors.throw(),
+ actual: () => "",
+});
+
+// be sure to specify both the runtime and static configs
+
+declare global {
+ interface ArkEnv {
+ onFail: typeof throwingArktype.onFail;
+ }
+}
+
+export async function readDropValidatedBody(
+ event: H3Event,
+ validate: (data: object) => T,
+): Promise {
+ const body = await readBody(event);
+ try {
+ // Delete all values that are 'null'
+ if (typeof body === "object" && !Array.isArray(body) && body !== null) {
+ for (const [key, value] of Object.entries(body) as Array<
+ [string, unknown]
+ >) {
+ if (value === null) {
+ // eslint-disable-next-line @typescript-eslint/no-dynamic-delete
+ delete body[key];
+ }
+ }
+ }
+ return validate(body);
+ } catch (e) {
+ const t = await useTranslation(event);
+
+ if (e instanceof ArkErrors) {
+ throw createError({
+ statusCode: 400,
+ statusMessage: t("errors.invalidBody", [e.summary]),
+ });
+ }
+ throw createError({
+ statusCode: 400,
+ statusMessage: t("errors.invalidBody", [
+ e instanceof Error ? e.message : `${e}`,
+ ]),
+ });
+ }
+}
diff --git a/server/internal/acls/descriptions.ts b/server/internal/acls/descriptions.ts
index d5ac10a..af1a007 100644
--- a/server/internal/acls/descriptions.ts
+++ b/server/internal/acls/descriptions.ts
@@ -19,9 +19,13 @@ export const userACLDescriptions: ObjectFromList = {
"notifications:read": "Fetch this account's notifications.",
"notifications:mark": "Mark notifications as read for this account.",
- "notifications:listen": "Connect to a websocket to recieve notifications.",
+ "notifications:listen": "Connect to a websocket to receive notifications.",
"notifications:delete": "Delete this account's notifications.",
+ "screenshots:new": "Create screenshots for this account",
+ "screenshots:read": "Read all screenshots for this account",
+ "screenshots:delete": "Delete a screenshot for this account",
+
"collections:new": "Create collections for this account.",
"collections:read": "Fetch all collections (including library).",
"collections:delete": "Delete a collection for this account.",
@@ -32,12 +36,17 @@ export const userACLDescriptions: ObjectFromList = {
"library:remove": "Remove a game from your library.",
"clients:read": "Read the clients connected to this account",
- "clients:revoke": "",
+ "clients:revoke": "Remove clients connected to this account",
"news:read": "Read the server's news articles.",
+
+ "settings:read": "Read system settings.",
};
export const systemACLDescriptions: ObjectFromList = {
+ setup:
+ "All permissions required to setup a new Drop instance (setup wizard).",
+
"auth:read":
"Fetch the list of enabled authentication mechanisms configured.",
"auth:simple:invitation:read": "Fetch simple auth invitations.",
@@ -45,6 +54,11 @@ export const systemACLDescriptions: ObjectFromList = {
"auth:simple:invitation:delete": "Delete a simple auth invitation.",
"library:read": "Fetch a list of all games on this instance.",
+ "library:sources:read":
+ "Fetch a list of all library sources on this instance",
+ "library:sources:new": "Create a new library source.",
+ "library:sources:update": "Update existing library sources.",
+ "library:sources:delete": "Delete library sources.",
"notifications:read": "Read system notifications.",
"notifications:mark": "Mark system notifications as read.",
@@ -59,6 +73,11 @@ export const systemACLDescriptions: ObjectFromList = {
"game:image:new": "Upload an image for a game.",
"game:image:delete": "Delete an image for a game.",
+ "company:read": "Fetch companies.",
+ "company:create": "Create a new company.",
+ "company:update": "Update existing companies.",
+ "company:delete": "Delete companies.",
+
"import:version:read":
"Fetch versions to be imported, and information about versions to be imported.",
"import:version:new": "Import a game version.",
@@ -66,9 +85,22 @@ export const systemACLDescriptions: ObjectFromList = {
"Fetch games to be imported, and search the metadata for games.",
"import:game:new": "Import a game.",
+ "tags:read": "Fetch all tags",
+ "tags:create": "Create a tag",
+ "tags:delete": "Delete a tag",
+
"user:read": "Fetch any user's information.",
+ "user:delete": "Delete a user.",
"news:read": "Read news articles.",
"news:create": "Create a new news article.",
"news:delete": "Delete a news article.",
+
+ "task:read": "Read all tasks currently running on server.",
+ "task:start": "Manually execute scheduled tasks.",
+
+ "maintenance:read":
+ "Read tasks and maintenance information, like updates available and cleanup.",
+
+ "settings:update": "Update system settings.",
};
diff --git a/server/internal/acls/index.ts b/server/internal/acls/index.ts
index 6f42ddc..d6997c5 100644
--- a/server/internal/acls/index.ts
+++ b/server/internal/acls/index.ts
@@ -1,4 +1,4 @@
-import { APITokenMode } from "~/prisma/client";
+import { APITokenMode } from "~/prisma/client/enums";
import prisma from "../db/database";
import sessionHandler from "../session";
import type { MinimumRequestObject } from "~/server/h3";
@@ -17,6 +17,10 @@ export const userACLs = [
"notifications:listen",
"notifications:delete",
+ "screenshots:new",
+ "screenshots:read",
+ "screenshots:delete",
+
"collections:new",
"collections:read",
"collections:delete",
@@ -29,12 +33,16 @@ export const userACLs = [
"clients:revoke",
"news:read",
+
+ "settings:read",
] as const;
const userACLPrefix = "user:";
export type UserACL = Array<(typeof userACLs)[number]>;
export const systemACLs = [
+ "setup",
+
"auth:read",
"auth:simple:invitation:read",
"auth:simple:invitation:new",
@@ -46,6 +54,11 @@ export const systemACLs = [
"notifications:delete",
"library:read",
+ "library:sources:read",
+ "library:sources:new",
+ "library:sources:update",
+ "library:sources:delete",
+
"game:read",
"game:update",
"game:delete",
@@ -54,6 +67,11 @@ export const systemACLs = [
"game:image:new",
"game:image:delete",
+ "company:read",
+ "company:update",
+ "company:create",
+ "company:delete",
+
"import:version:read",
"import:version:new",
@@ -61,15 +79,31 @@ export const systemACLs = [
"import:game:new",
"user:read",
+ "user:delete",
"news:read",
"news:create",
"news:delete",
+
+ "tags:read",
+ "tags:create",
+ "tags:delete",
+
+ "task:read",
+ "task:start",
+
+ "maintenance:read",
+
+ "settings:update",
] as const;
const systemACLPrefix = "system:";
export type SystemACL = Array<(typeof systemACLs)[number]>;
+export type GlobalACL =
+ | `${typeof systemACLPrefix}${(typeof systemACLs)[number]}`
+ | `${typeof userACLPrefix}${(typeof userACLs)[number]}`;
+
class ACLManager {
private getAuthorizationToken(request: MinimumRequestObject) {
const [type, token] =
@@ -79,6 +113,12 @@ class ACLManager {
return token;
}
+ /**
+ * Get userId and require one of the specified acls
+ * @param request
+ * @param acls
+ * @returns
+ */
async getUserIdACL(request: MinimumRequestObject | undefined, acls: UserACL) {
if (!request)
throw new Error("Native web requests not available - weird deployment?");
@@ -105,9 +145,6 @@ class ACLManager {
if (tokenACLIndex != -1) return token.userId;
}
- console.log(token);
- console.log(acls);
-
return undefined;
}
@@ -132,9 +169,11 @@ class ACLManager {
const user = await prisma.user.findUnique({
where: { id: userSession.userId },
});
- if (!user) return false;
- if (user.admin) return true;
- return false;
+ if (user) {
+ if (!user) return false;
+ if (user.admin) return true;
+ return false;
+ }
}
const authorizationToken = this.getAuthorizationToken(request);
@@ -144,6 +183,10 @@ class ACLManager {
});
if (!token) return false;
if (token.mode != APITokenMode.System) return false;
+
+ // If empty, we just want to check we are an admin *at all*, not specific ACLs
+ if (acls.length == 0) return true;
+
for (const acl of acls) {
const tokenACLIndex = token.acls.findIndex((e) => e == acl);
if (tokenACLIndex != -1) return true;
@@ -173,6 +216,38 @@ class ACLManager {
return true;
}
+
+ async fetchAllACLs(
+ request: MinimumRequestObject,
+ ): Promise {
+ const userSession = await sessionHandler.getSession(request);
+ if (!userSession) {
+ const authorizationToken = this.getAuthorizationToken(request);
+ if (!authorizationToken) return undefined;
+ const token = await prisma.aPIToken.findUnique({
+ where: { token: authorizationToken },
+ });
+ if (!token) return undefined;
+ return token.acls as GlobalACL[];
+ }
+
+ const user = await prisma.user.findUnique({
+ where: { id: userSession.userId },
+ select: {
+ admin: true,
+ },
+ });
+ if (!user)
+ throw new Error("User session without user - did something break?");
+
+ const acls = userACLs.map((e) => `${userACLPrefix}${e}`);
+
+ if (user.admin) {
+ acls.push(...systemACLs.map((e) => `${systemACLPrefix}${e}`));
+ }
+
+ return acls as GlobalACL[];
+ }
}
export const aclManager = new ACLManager();
diff --git a/server/internal/auth/index.ts b/server/internal/auth/index.ts
new file mode 100644
index 0000000..ee9cadc
--- /dev/null
+++ b/server/internal/auth/index.ts
@@ -0,0 +1,63 @@
+import { AuthMec } from "~/prisma/client/enums";
+import { OIDCManager } from "./oidc";
+import { logger } from "~/server/internal/logging";
+
+class AuthManager {
+ private authProviders: {
+ [AuthMec.Simple]: boolean;
+ [AuthMec.OpenID]: OIDCManager | undefined;
+ } = {
+ [AuthMec.Simple]: false,
+ [AuthMec.OpenID]: undefined,
+ };
+
+ private initFuncs: {
+ [K in keyof typeof this.authProviders]: () => Promise;
+ } = {
+ [AuthMec.OpenID]: OIDCManager.prototype.create,
+ [AuthMec.Simple]: async () => {
+ const disabled = process.env.DISABLE_SIMPLE_AUTH as string | undefined;
+ return !disabled;
+ },
+ };
+
+ constructor() {
+ logger.info("AuthManager initialized");
+ }
+
+ async init() {
+ for (const [key, init] of Object.entries(this.initFuncs)) {
+ try {
+ const object = await init();
+ if (!object) break;
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
+ (this.authProviders as any)[key] = object;
+ logger.info(`enabled auth: ${key}`);
+ } catch (e) {
+ logger.warn(e);
+ }
+ }
+
+ // Add every other auth mechanism here, and fall back to simple if none of them are enabled
+ if (!this.authProviders[AuthMec.OpenID]) {
+ this.authProviders[AuthMec.Simple] = true;
+ }
+ }
+
+ getAuthProviders() {
+ return this.authProviders;
+ }
+
+ getEnabledAuthProviders() {
+ const authManagers = Object.entries(this.authProviders)
+ .filter((e) => !!e[1])
+ .map((e) => e[0]);
+
+ return authManagers;
+ }
+}
+
+const authManager = new AuthManager();
+export default authManager;
+
+export * from "./passwordHash";
diff --git a/server/internal/oidc/index.ts b/server/internal/auth/oidc/index.ts
similarity index 90%
rename from server/internal/oidc/index.ts
rename to server/internal/auth/oidc/index.ts
index 24c4e33..4508d48 100644
--- a/server/internal/oidc/index.ts
+++ b/server/internal/auth/oidc/index.ts
@@ -1,9 +1,12 @@
import { randomUUID } from "crypto";
-import prisma from "../db/database";
-import { AuthMec } from "~/prisma/client";
-import objectHandler from "../objects";
+import prisma from "../../db/database";
+import type { UserModel } from "~/prisma/client/models";
+import { AuthMec } from "~/prisma/client/enums";
+import objectHandler from "../../objects";
import type { Readable } from "stream";
import * as jdenticon from "jdenticon";
+import { systemConfig } from "../../config/sys-conf";
+import { logger } from "~/server/internal/logging";
interface OIDCWellKnown {
authorization_endpoint: string;
@@ -12,10 +15,15 @@ interface OIDCWellKnown {
scopes_supported: string[];
}
+interface OIDCAuthSessionOptions {
+ redirect: string | undefined;
+}
+
interface OIDCAuthSession {
redirectUrl: string;
callbackUrl: string;
state: string;
+ options: OIDCAuthSessionOptions;
}
interface OIDCUserInfo {
@@ -112,7 +120,7 @@ export class OIDCManager {
const clientId = process.env.OIDC_CLIENT_ID as string | undefined;
const clientSecret = process.env.OIDC_CLIENT_SECRET as string | undefined;
- const externalUrl = process.env.EXTERNAL_URL as string | undefined;
+ const externalUrl = systemConfig.getExternalUrl();
if (!clientId || !clientSecret)
throw new Error("Missing client ID or secret for OIDC");
@@ -132,7 +140,7 @@ export class OIDCManager {
};
}
- generateAuthSession(): OIDCAuthSession {
+ generateAuthSession(options?: OIDCAuthSessionOptions): OIDCAuthSession {
const stateKey = randomUUID();
const normalisedUrl = new URL(
@@ -148,12 +156,16 @@ export class OIDCManager {
redirectUrl: finalUrl,
callbackUrl: redirectUrl,
state: stateKey,
+ options: options ?? { redirect: undefined },
};
this.signinStateTable[stateKey] = session;
return session;
}
- async authorize(code: string, state: string) {
+ async authorize(
+ code: string,
+ state: string,
+ ): Promise<{ user: UserModel; options: OIDCAuthSessionOptions } | string> {
const session = this.signinStateTable[state];
if (!session) return "Invalid state parameter";
@@ -191,9 +203,11 @@ export class OIDCManager {
const user = await this.fetchOrCreateUser(userinfo);
- return user;
+ if (typeof user === "string") return user;
+
+ return { user, options: session.options };
} catch (e) {
- console.error(e);
+ logger.error(e);
return `Request to identity provider failed: ${e}`;
}
}
diff --git a/server/internal/security/simple.ts b/server/internal/auth/passwordHash.ts
similarity index 100%
rename from server/internal/security/simple.ts
rename to server/internal/auth/passwordHash.ts
diff --git a/server/internal/clients/README.md b/server/internal/clients/README.md
index 0d15850..3007720 100644
--- a/server/internal/clients/README.md
+++ b/server/internal/clients/README.md
@@ -16,7 +16,7 @@ Server sends redirect to `drop://handshake/[id]/[token]`, where the token is an
## 3. Client requests certificates
-Client makes request: `POST /api/v1/client/auth/handshake` with the token recieved in the previous step.
+Client makes request: `POST /api/v1/client/auth/handshake` with the token received in the previous step.
The server uses it's CA to generate a public-private key pair, the CN of the client ID. It then sends that pair, plus the CA's public key, to the client, which stores it all.
diff --git a/server/internal/clients/capabilities.ts b/server/internal/clients/capabilities.ts
index 9837fd6..868a9f6 100644
--- a/server/internal/clients/capabilities.ts
+++ b/server/internal/clients/capabilities.ts
@@ -1,8 +1,6 @@
import type { EnumDictionary } from "../utils/types";
-import https from "https";
-import { useCertificateAuthority } from "~/server/plugins/ca";
import prisma from "../db/database";
-import { ClientCapabilities } from "~/prisma/client";
+import { ClientCapabilities } from "~/prisma/client/enums";
// These values are technically mapped to the database,
// but Typescript/Prisma doesn't let me link them
@@ -12,12 +10,13 @@ export enum InternalClientCapability {
PeerAPI = "peerAPI",
UserStatus = "userStatus",
CloudSaves = "cloudSaves",
+ TrackPlaytime = "trackPlaytime",
}
export const validCapabilities = Object.values(InternalClientCapability);
export type CapabilityConfiguration = {
- [InternalClientCapability.PeerAPI]: { endpoints: string[] };
+ [InternalClientCapability.PeerAPI]: object;
[InternalClientCapability.UserStatus]: object;
[InternalClientCapability.CloudSaves]: object;
};
@@ -27,6 +26,7 @@ class CapabilityManager {
InternalClientCapability,
(configuration: object) => Promise
> = {
+ /*
[InternalClientCapability.PeerAPI]: async (rawConfiguration) => {
const configuration =
rawConfiguration as CapabilityConfiguration[InternalClientCapability.PeerAPI];
@@ -71,14 +71,16 @@ class CapabilityManager {
valid = true;
break;
} catch {
- /* empty */
}
}
return valid;
},
+ */
+ [InternalClientCapability.PeerAPI]: async () => true,
[InternalClientCapability.UserStatus]: async () => true, // No requirements for user status
[InternalClientCapability.CloudSaves]: async () => true, // No requirements for cloud saves
+ [InternalClientCapability.TrackPlaytime]: async () => true,
};
async validateCapabilityConfiguration(
@@ -92,7 +94,7 @@ class CapabilityManager {
async upsertClientCapability(
capability: InternalClientCapability,
- rawCapability: object,
+ rawCapabilityConfiguration: object,
clientId: string,
) {
const upsertFunctions: EnumDictionary<
@@ -100,8 +102,7 @@ class CapabilityManager {
() => Promise | void
> = {
[InternalClientCapability.PeerAPI]: async function () {
- const configuration =
- rawCapability as CapabilityConfiguration[InternalClientCapability.PeerAPI];
+ // const configuration =rawCapability as CapabilityConfiguration[InternalClientCapability.PeerAPI];
const currentClient = await prisma.client.findUnique({
where: { id: clientId },
@@ -110,6 +111,7 @@ class CapabilityManager {
},
});
if (!currentClient) throw new Error("Invalid client ID");
+ /*
if (currentClient.capabilities.includes(ClientCapabilities.PeerAPI)) {
await prisma.clientPeerAPIConfiguration.update({
where: { clientId },
@@ -126,6 +128,7 @@ class CapabilityManager {
endpoints: configuration.endpoints,
},
});
+ */
await prisma.client.update({
where: { id: clientId },
@@ -159,6 +162,28 @@ class CapabilityManager {
},
});
},
+ [InternalClientCapability.TrackPlaytime]: async function () {
+ const currentClient = await prisma.client.findUnique({
+ where: { id: clientId },
+ select: {
+ capabilities: true,
+ },
+ });
+ if (!currentClient) throw new Error("Invalid client ID");
+ if (
+ currentClient.capabilities.includes(ClientCapabilities.TrackPlaytime)
+ )
+ return;
+
+ await prisma.client.update({
+ where: { id: clientId },
+ data: {
+ capabilities: {
+ push: ClientCapabilities.TrackPlaytime,
+ },
+ },
+ });
+ },
};
await upsertFunctions[capability]();
}
diff --git a/server/internal/clients/event-handler.ts b/server/internal/clients/event-handler.ts
index 6fdab1c..dfbdf0d 100644
--- a/server/internal/clients/event-handler.ts
+++ b/server/internal/clients/event-handler.ts
@@ -1,4 +1,4 @@
-import type { Client, User } from "~/prisma/client";
+import type { ClientModel, UserModel } from "~/prisma/client/models";
import type { EventHandlerRequest, H3Event } from "h3";
import droplet from "@drop-oss/droplet";
import prisma from "../db/database";
@@ -11,8 +11,8 @@ export type EventHandlerFunction = (
type ClientUtils = {
clientId: string;
- fetchClient: () => Promise;
- fetchUser: () => Promise;
+ fetchClient: () => Promise;
+ fetchUser: () => Promise;
};
const NONCE_LENIENCE = 30_000;
diff --git a/server/internal/clients/handler.ts b/server/internal/clients/handler.ts
index ecc1e45..eaae288 100644
--- a/server/internal/clients/handler.ts
+++ b/server/internal/clients/handler.ts
@@ -1,11 +1,24 @@
import { randomUUID } from "node:crypto";
import prisma from "../db/database";
-import type { Platform } from "~/prisma/client";
+import type { Platform } from "~/prisma/client/enums";
import { useCertificateAuthority } from "~/server/plugins/ca";
+import type {
+ CapabilityConfiguration,
+ InternalClientCapability,
+} from "./capabilities";
+import capabilityManager from "./capabilities";
+import type { PeerImpl } from "../tasks";
+
+export enum AuthMode {
+ Callback = "callback",
+ Code = "code",
+}
export interface ClientMetadata {
name: string;
platform: Platform;
+ capabilities: Partial;
+ mode: AuthMode;
}
export class ClientHandler {
@@ -16,8 +29,10 @@ export class ClientHandler {
data: ClientMetadata;
userId?: string;
authToken?: string;
+ peer?: PeerImpl;
}
>();
+ private codeClientMap = new Map();
async initiate(metadata: ClientMetadata) {
const clientId = randomUUID();
@@ -26,14 +41,61 @@ export class ClientHandler {
data: metadata,
timeout: setTimeout(
() => {
- if (this.temporaryClientTable.has(clientId))
+ const client = this.temporaryClientTable.get(clientId);
+ if (client) {
+ if (client.peer) {
+ client.peer.send(
+ JSON.stringify({ type: "error", value: "Request timed out." }),
+ );
+ client.peer.close();
+ }
this.temporaryClientTable.delete(clientId);
+ }
+
+ const code = this.codeClientMap
+ .entries()
+ .find(([_, v]) => v === clientId);
+ if (code) this.codeClientMap.delete(code[0]);
},
1000 * 60 * 10,
), // 10 minutes
});
- return clientId;
+ switch (metadata.mode) {
+ case AuthMode.Callback:
+ return `/client/authorize/${clientId}`;
+ case AuthMode.Code: {
+ const code = randomUUID()
+ .replaceAll(/-/g, "")
+ .slice(0, 7)
+ .toUpperCase();
+ this.codeClientMap.set(code, clientId);
+ return code;
+ }
+ }
+ }
+
+ async connectCodeListener(code: string, peer: PeerImpl) {
+ const clientId = this.codeClientMap.get(code);
+ if (!clientId)
+ throw createError({
+ statusCode: 403,
+ statusMessage: "Invalid or unknown code.",
+ });
+ const metadata = this.temporaryClientTable.get(clientId);
+ if (!metadata)
+ throw createError({ statusCode: 500, statusMessage: "Broken code." });
+ if (metadata.peer)
+ throw createError({
+ statusCode: 400,
+ statusMessage: "Pre-existing listener for this code.",
+ });
+ metadata.peer = peer;
+ this.temporaryClientTable.set(clientId, metadata);
+ }
+
+ async fetchClientIdByCode(code: string) {
+ return this.codeClientMap.get(code);
}
async fetchClientMetadata(clientId: string) {
@@ -62,6 +124,23 @@ export class ClientHandler {
return token;
}
+ async sendAuthToken(clientId: string, token: string) {
+ const client = this.temporaryClientTable.get(clientId);
+ if (!client)
+ throw createError({
+ statusCode: 500,
+ statusMessage: "Corrupted code, please restart the process.",
+ });
+ if (!client.peer)
+ throw createError({
+ statusCode: 400,
+ statusMessage: "Client has not connected yet. Please try again later.",
+ });
+ await client.peer.send(
+ JSON.stringify({ type: "token", value: `${clientId}/${token}` }),
+ );
+ }
+
async fetchClientMetadataByToken(token: string) {
return this.temporaryClientTable
.entries()
@@ -75,7 +154,7 @@ export class ClientHandler {
if (!metadata) throw new Error("Invalid client ID");
if (!metadata.userId) throw new Error("Un-authorized client ID");
- return await prisma.client.create({
+ const client = await prisma.client.create({
data: {
id: id,
userId: metadata.userId,
@@ -87,6 +166,20 @@ export class ClientHandler {
lastConnected: new Date(),
},
});
+
+ for (const [capability, configuration] of Object.entries(
+ metadata.data.capabilities,
+ )) {
+ await capabilityManager.upsertClientCapability(
+ capability as InternalClientCapability,
+ configuration,
+ client.id,
+ );
+ }
+
+ this.temporaryClientTable.delete(id);
+
+ return client;
}
async removeClient(id: string) {
diff --git a/server/internal/config/application-configuration.ts b/server/internal/config/application-configuration.ts
index 1d16f56..697702e 100644
--- a/server/internal/config/application-configuration.ts
+++ b/server/internal/config/application-configuration.ts
@@ -1,15 +1,15 @@
-import type { ApplicationSettings } from "~/prisma/client";
+import type { ApplicationSettingsModel } from "~/prisma/client/models";
import prisma from "../db/database";
class ApplicationConfiguration {
// Reference to the currently selected application configuration
- private currentApplicationSettings: ApplicationSettings | undefined =
+ private currentApplicationSettings: ApplicationSettingsModel | undefined =
undefined;
private async save() {
await this.init();
- const deepAppConfigCopy: Omit & {
+ const deepAppConfigCopy: Omit & {
timestamp?: Date;
} = JSON.parse(JSON.stringify(this.currentApplicationSettings));
@@ -56,9 +56,9 @@ class ApplicationConfiguration {
this.currentApplicationSettings = latestState;
}
- async set(
+ async set(
key: T,
- value: ApplicationSettings[T],
+ value: ApplicationSettingsModel[T],
) {
await this.init();
if (!this.currentApplicationSettings)
@@ -71,9 +71,9 @@ class ApplicationConfiguration {
}
}
- async get(
+ async get(
key: T,
- ): Promise {
+ ): Promise {
await this.init();
if (!this.currentApplicationSettings)
throw new Error("Somehow, failed to initialise application settings");
diff --git a/server/internal/config/sys-conf.ts b/server/internal/config/sys-conf.ts
index 0d0b5e2..70e0904 100644
--- a/server/internal/config/sys-conf.ts
+++ b/server/internal/config/sys-conf.ts
@@ -1,9 +1,24 @@
-import path from "path";
+import normalizeUrl from "normalize-url";
class SystemConfig {
private libraryFolder = process.env.LIBRARY ?? "./.data/library";
private dataFolder = process.env.DATA ?? "./.data/data";
- private headscaleFolder = path.join(this.dataFolder, "headscale");
+
+ private externalUrl = normalizeUrl(
+ process.env.EXTERNAL_URL ?? "http://localhost:3000",
+ { stripWWW: false },
+ );
+ private dropVersion;
+ private gitRef;
+
+ private checkForUpdates = getUpdateCheckConfig();
+
+ constructor() {
+ // get drop version and git ref from nuxt config
+ const config = useRuntimeConfig();
+ this.dropVersion = config.dropVersion;
+ this.gitRef = config.gitRef;
+ }
getLibraryFolder() {
return this.libraryFolder;
@@ -13,9 +28,44 @@ class SystemConfig {
return this.dataFolder;
}
- getHeadscaleFolder() {
- return this.headscaleFolder;
+ getDropVersion() {
+ return this.dropVersion;
+ }
+
+ getGitRef() {
+ return this.gitRef;
+ }
+
+ shouldCheckForUpdates() {
+ return this.checkForUpdates;
+ }
+
+ getExternalUrl() {
+ return this.externalUrl;
}
}
export const systemConfig = new SystemConfig();
+
+/**
+ * Gets the configuration for checking updates based on various conditions
+ * @returns true if updates should be checked, false otherwise.
+ */
+function getUpdateCheckConfig(): boolean {
+ const envCheckUpdates = process.env.CHECK_FOR_UPDATES;
+
+ // Check environment variable
+ if (envCheckUpdates !== undefined) {
+ // if explicitly set to true or false, return that value
+ if (envCheckUpdates.toLocaleLowerCase() === "true") {
+ return true;
+ } else if (envCheckUpdates.toLocaleLowerCase() === "false") {
+ return false;
+ }
+ } else if (process.env.NODE_ENV === "production") {
+ // default to true in production
+ return true;
+ }
+
+ return false;
+}
diff --git a/server/internal/consts.ts b/server/internal/consts.ts
new file mode 100644
index 0000000..e7ab1cb
--- /dev/null
+++ b/server/internal/consts.ts
@@ -0,0 +1 @@
+export const DROP_VERSION = "0.3.1";
diff --git a/server/internal/db/database.ts b/server/internal/db/database.ts
index 2c847c7..fe12a0c 100644
--- a/server/internal/db/database.ts
+++ b/server/internal/db/database.ts
@@ -1,7 +1,11 @@
-import { PrismaClient } from "~/prisma/client";
+import { PrismaClient } from "~/prisma/client/client";
+// import { PrismaPg } from "@prisma/adapter-pg";
const prismaClientSingleton = () => {
- return new PrismaClient({});
+ // const adapter = new PrismaPg({ connectionString: process.env.DATABASE_URL });
+ // const prisma = new PrismaClient({ adapter });
+ const prisma = new PrismaClient();
+ return prisma;
};
declare const globalThis: {
diff --git a/server/internal/downloads/coordinator.ts b/server/internal/downloads/coordinator.ts
index 6a247b1..bc2dfe5 100644
--- a/server/internal/downloads/coordinator.ts
+++ b/server/internal/downloads/coordinator.ts
@@ -1,9 +1,68 @@
-/*
-The download co-ordinator's job is to keep track of all the currently online clients.
+import prisma from "../db/database";
+import type { DropManifest } from "./manifest";
-When a client signs on and registers itself as a peer
+const TIMEOUT = 1000 * 60 * 60 * 1; // 1 hour
-*/
+class DownloadContextManager {
+ private contexts: Map<
+ string,
+ {
+ timeout: Date;
+ manifest: DropManifest;
+ versionName: string;
+ libraryId: string;
+ libraryPath: string;
+ }
+ > = new Map();
-// eslint-disable-next-line @typescript-eslint/no-extraneous-class, @typescript-eslint/no-unused-vars
-class DownloadCoordinator {}
+ async createContext(game: string, versionName: string) {
+ const version = await prisma.gameVersion.findUnique({
+ where: {
+ gameId_versionName: {
+ gameId: game,
+ versionName,
+ },
+ },
+ include: {
+ game: {
+ select: {
+ libraryId: true,
+ libraryPath: true,
+ },
+ },
+ },
+ });
+ if (!version) return undefined;
+
+ const contextId = crypto.randomUUID();
+ this.contexts.set(contextId, {
+ timeout: new Date(),
+ manifest: JSON.parse(version.dropletManifest as string) as DropManifest,
+ versionName,
+ libraryId: version.game.libraryId!,
+ libraryPath: version.game.libraryPath,
+ });
+
+ return contextId;
+ }
+
+ async fetchContext(contextId: string) {
+ const context = this.contexts.get(contextId);
+ if (!context) return undefined;
+ context.timeout = new Date();
+ this.contexts.set(contextId, context);
+ return context;
+ }
+
+ async cleanup() {
+ for (const key of this.contexts.keys()) {
+ const context = this.contexts.get(key)!;
+ if (context.timeout.getTime() < Date.now() - TIMEOUT) {
+ this.contexts.delete(key);
+ }
+ }
+ }
+}
+
+export const contextManager = new DownloadContextManager();
+export default contextManager;
diff --git a/server/internal/downloads/manifest.ts b/server/internal/downloads/manifest.ts
index af7599c..2fc25ae 100644
--- a/server/internal/downloads/manifest.ts
+++ b/server/internal/downloads/manifest.ts
@@ -1,11 +1,11 @@
-import type { GameVersion } from "~/prisma/client";
+import type { GameVersionModel } from "~/prisma/client/models";
import prisma from "../db/database";
export type DropChunk = {
permissions: number;
ids: string[];
checksums: string[];
- lengths: string[];
+ lengths: number[];
};
export type DropManifest = {
@@ -54,7 +54,7 @@ class ManifestGenerator {
// Local function because eventual caching
async generateManifest(gameId: string, versionName: string) {
- const versions: GameVersion[] = [];
+ const versions: GameVersionModel[] = [];
const baseVersion = await prisma.gameVersion.findUnique({
where: {
diff --git a/server/internal/library/index.ts b/server/internal/library/index.ts
index 6556702..c6807c5 100644
--- a/server/internal/library/index.ts
+++ b/server/internal/library/index.ts
@@ -5,75 +5,123 @@
* It also provides the endpoints with information about unmatched games
*/
-import fs from "fs";
import path from "path";
import prisma from "../db/database";
-import type { GameVersion } from "~/prisma/client";
import { fuzzy } from "fast-fuzzy";
-import { recursivelyReaddir } from "../utils/recursivedirs";
import taskHandler from "../tasks";
import { parsePlatform } from "../utils/parseplatform";
-import droplet from "@drop-oss/droplet";
import notificationSystem from "../notifications";
-import { systemConfig } from "../config/sys-conf";
+import { GameNotFoundError, type LibraryProvider } from "./provider";
+import { logger } from "../logging";
+import type { GameModel } from "~/prisma/client/models";
+import { createHash } from "node:crypto";
+
+export function createGameImportTaskId(libraryId: string, libraryPath: string) {
+ return createHash("md5")
+ .update(`import:${libraryId}:${libraryPath}`)
+ .digest("hex");
+}
+
+export function createVersionImportTaskId(gameId: string, versionName: string) {
+ return createHash("md5")
+ .update(`import:${gameId}:${versionName}`)
+ .digest("hex");
+}
class LibraryManager {
- private basePath: string;
+ private libraries: Map> = new Map();
- constructor() {
- this.basePath = systemConfig.getLibraryFolder();
- fs.mkdirSync(this.basePath, { recursive: true });
+ addLibrary(library: LibraryProvider) {
+ this.libraries.set(library.id(), library);
}
- fetchLibraryPath() {
- return this.basePath;
+ removeLibrary(id: string) {
+ this.libraries.delete(id);
}
- async fetchAllUnimportedGames() {
- const dirs = fs.readdirSync(this.basePath).filter((e) => {
- const fullDir = path.join(this.basePath, e);
- return fs.lstatSync(fullDir).isDirectory();
- });
+ async fetchLibraries() {
+ const libraries = await prisma.library.findMany({});
+ const libraryWithMetadata = libraries.map((e) => ({
+ ...e,
+ working: this.libraries.has(e.id),
+ }));
+ return libraryWithMetadata;
+ }
- const validGames = await prisma.game.findMany({
+ async fetchGamesByLibrary() {
+ const results: { [key: string]: { [key: string]: GameModel } } = {};
+ const games = await prisma.game.findMany({});
+ for (const game of games) {
+ const libraryId = game.libraryId!;
+ const libraryPath = game.libraryPath!;
+
+ results[libraryId] ??= {};
+ results[libraryId][libraryPath] = game;
+ }
+
+ return results;
+ }
+
+ async fetchUnimportedGames() {
+ const unimportedGames: { [key: string]: string[] } = {};
+ const instanceGames = await this.fetchGamesByLibrary();
+
+ for (const [id, library] of this.libraries.entries()) {
+ const providerGames = await library.listGames();
+ const providerUnimportedGames = providerGames.filter(
+ (libraryPath) =>
+ !instanceGames[id]?.[libraryPath] &&
+ !taskHandler.hasTask(createGameImportTaskId(id, libraryPath)),
+ );
+ unimportedGames[id] = providerUnimportedGames;
+ }
+
+ return unimportedGames;
+ }
+
+ async fetchUnimportedGameVersions(libraryId: string, libraryPath: string) {
+ const provider = this.libraries.get(libraryId);
+ if (!provider) return undefined;
+ const game = await prisma.game.findUnique({
where: {
- libraryBasePath: { in: dirs },
+ libraryKey: {
+ libraryId,
+ libraryPath,
+ },
},
select: {
- libraryBasePath: true,
+ id: true,
+ versions: true,
},
});
- const validGameDirs = validGames.map((e) => e.libraryBasePath);
+ if (!game) return undefined;
- const unregisteredGames = dirs.filter((e) => !validGameDirs.includes(e));
-
- return unregisteredGames;
- }
-
- async fetchUnimportedGameVersions(
- libraryBasePath: string,
- versions: Array,
- ) {
- const gameDir = path.join(this.basePath, libraryBasePath);
- const versionsDirs = fs.readdirSync(gameDir);
- const importedVersionDirs = versions.map((e) => e.versionName);
- const unimportedVersions = versionsDirs.filter(
- (e) => !importedVersionDirs.includes(e),
- );
-
- return unimportedVersions;
+ try {
+ const versions = await provider.listVersions(libraryPath);
+ const unimportedVersions = versions.filter(
+ (e) =>
+ game.versions.findIndex((v) => v.versionName == e) == -1 &&
+ !taskHandler.hasTask(createVersionImportTaskId(game.id, e)),
+ );
+ return unimportedVersions;
+ } catch (e) {
+ if (e instanceof GameNotFoundError) {
+ logger.warn(e);
+ return undefined;
+ }
+ throw e;
+ }
}
async fetchGamesWithStatus() {
const games = await prisma.game.findMany({
- select: {
- id: true,
- versions: true,
- mName: true,
- mShortDescription: true,
- metadataSource: true,
- mIconObjectId: true,
- libraryBasePath: true,
+ include: {
+ versions: {
+ select: {
+ versionName: true,
+ },
+ },
+ library: true,
},
orderBy: {
mName: "asc",
@@ -81,64 +129,39 @@ class LibraryManager {
});
return await Promise.all(
- games.map(async (e) => ({
- game: e,
- status: {
- noVersions: e.versions.length == 0,
- unimportedVersions: await this.fetchUnimportedGameVersions(
- e.libraryBasePath,
- e.versions,
- ),
- },
- })),
+ games.map(async (e) => {
+ const versions = await this.fetchUnimportedGameVersions(
+ e.libraryId ?? "",
+ e.libraryPath,
+ );
+ return {
+ game: e,
+ status: versions
+ ? {
+ noVersions: e.versions.length == 0,
+ unimportedVersions: versions,
+ }
+ : ("offline" as const),
+ };
+ }),
);
}
- async fetchUnimportedVersions(gameId: string) {
- const game = await prisma.game.findUnique({
- where: { id: gameId },
- select: {
- versions: {
- select: {
- versionName: true,
- },
- },
- libraryBasePath: true,
- },
- });
-
- if (!game) return undefined;
- const targetDir = path.join(this.basePath, game.libraryBasePath);
- if (!fs.existsSync(targetDir))
- throw new Error(
- "Game in database, but no physical directory? Something is very very wrong...",
- );
- const versions = fs.readdirSync(targetDir);
- const validVersions = versions.filter((versionDir) => {
- const versionPath = path.join(targetDir, versionDir);
- const stat = fs.statSync(versionPath);
- return stat.isDirectory();
- });
- const currentVersions = game.versions.map((e) => e.versionName);
-
- const unimportedVersions = validVersions.filter(
- (e) => !currentVersions.includes(e),
- );
- return unimportedVersions;
- }
-
+ /**
+ * Fetches recommendations and extra data about the version. Doesn't actually check if it's been imported.
+ * @param gameId
+ * @param versionName
+ * @returns
+ */
async fetchUnimportedVersionInformation(gameId: string, versionName: string) {
const game = await prisma.game.findUnique({
where: { id: gameId },
- select: { libraryBasePath: true, mName: true },
+ select: { libraryPath: true, libraryId: true, mName: true },
});
- if (!game) return undefined;
- const targetDir = path.join(
- this.basePath,
- game.libraryBasePath,
- versionName,
- );
- if (!fs.existsSync(targetDir)) return undefined;
+ if (!game || !game.libraryId) return undefined;
+
+ const library = this.libraries.get(game.libraryId);
+ if (!library) return undefined;
const fileExts: { [key: string]: string[] } = {
Linux: [
@@ -148,11 +171,10 @@ class LibraryManager {
".sh",
// No extension is common for Linux binaries
"",
+ // AppImages
+ ".appimage",
],
- Windows: [
- // Pretty much the only one
- ".exe",
- ],
+ Windows: [".exe", ".bat"],
macOS: [
// App files
".app",
@@ -165,19 +187,19 @@ class LibraryManager {
match: number;
}> = [];
- const files = recursivelyReaddir(targetDir, 2);
- for (const file of files) {
- const filename = path.basename(file);
- const dotLocation = file.lastIndexOf(".");
- const ext = dotLocation == -1 ? "" : file.slice(dotLocation);
+ const files = await library.versionReaddir(game.libraryPath, versionName);
+ for (const filename of files) {
+ const basename = path.basename(filename);
+ const dotLocation = filename.lastIndexOf(".");
+ const ext =
+ dotLocation == -1 ? "" : filename.slice(dotLocation).toLowerCase();
for (const [platform, checkExts] of Object.entries(fileExts)) {
for (const checkExt of checkExts) {
if (checkExt != ext) continue;
- const fuzzyValue = fuzzy(filename, game.mName);
- const relative = path.relative(targetDir, file);
+ const fuzzyValue = fuzzy(basename, game.mName);
options.push({
- filename: relative,
- platform: platform,
+ filename,
+ platform,
match: fuzzyValue,
});
}
@@ -190,17 +212,24 @@ class LibraryManager {
}
// Checks are done in least to most expensive order
- async checkUnimportedGamePath(targetPath: string) {
- const targetDir = path.join(this.basePath, targetPath);
- if (!fs.existsSync(targetDir)) return false;
-
+ async checkUnimportedGamePath(libraryId: string, libraryPath: string) {
const hasGame =
- (await prisma.game.count({ where: { libraryBasePath: targetPath } })) > 0;
+ (await prisma.game.count({
+ where: { libraryId, libraryPath },
+ })) > 0;
if (hasGame) return false;
return true;
}
+ /*
+ Game creation happens in metadata, because it's primarily a metadata object
+
+ async createGame(libraryId: string, libraryPath: string, game: Omit) {
+
+ }
+ */
+
async importVersion(
gameId: string,
versionName: string,
@@ -217,46 +246,42 @@ class LibraryManager {
umuId: string;
},
) {
- const taskId = `import:${gameId}:${versionName}`;
+ const taskId = createVersionImportTaskId(gameId, versionName);
const platform = parsePlatform(metadata.platform);
if (!platform) return undefined;
const game = await prisma.game.findUnique({
where: { id: gameId },
- select: { mName: true, libraryBasePath: true },
+ select: { mName: true, libraryId: true, libraryPath: true },
});
- if (!game) return undefined;
+ if (!game || !game.libraryId) return undefined;
- const baseDir = path.join(this.basePath, game.libraryBasePath, versionName);
- if (!fs.existsSync(baseDir)) return undefined;
+ const library = this.libraries.get(game.libraryId);
+ if (!library) return undefined;
taskHandler.create({
id: taskId,
+ taskGroup: "import:game",
name: `Importing version ${versionName} for ${game.mName}`,
acls: ["system:import:version:read"],
- async run({ progress, log }) {
+ async run({ progress, logger }) {
// First, create the manifest via droplet.
// This takes up 90% of our progress, so we wrap it in a *0.9
- const manifest = await new Promise((resolve, reject) => {
- droplet.generateManifest(
- baseDir,
- (err, value) => {
- if (err) return reject(err);
- progress(value * 0.9);
- },
- (err, line) => {
- if (err) return reject(err);
- log(line);
- },
- (err, manifest) => {
- if (err) return reject(err);
- resolve(manifest);
- },
- );
- });
+ const manifest = await library.generateDropletManifest(
+ game.libraryPath,
+ versionName,
+ (err, value) => {
+ if (err) throw err;
+ progress(value * 0.9);
+ },
+ (err, value) => {
+ if (err) throw err;
+ logger.info(value);
+ },
+ );
- log("Created manifest successfully!");
+ logger.info("Created manifest successfully!");
const currentIndex = await prisma.gameVersion.count({
where: { gameId: gameId },
@@ -299,13 +324,14 @@ class LibraryManager {
});
}
- log("Successfully created version!");
+ logger.info("Successfully created version!");
notificationSystem.systemPush({
nonce: `version-create-${gameId}-${versionName}`,
title: `'${game.mName}' ('${versionName}') finished importing.`,
description: `Drop finished importing version ${versionName} for ${game.mName}.`,
actions: [`View|/admin/library/${gameId}`],
+ acls: ["system:import:version:read"],
});
progress(100);
@@ -314,6 +340,29 @@ class LibraryManager {
return taskId;
}
+
+ async peekFile(
+ libraryId: string,
+ game: string,
+ version: string,
+ filename: string,
+ ) {
+ const library = this.libraries.get(libraryId);
+ if (!library) return undefined;
+ return await library.peekFile(game, version, filename);
+ }
+
+ async readFile(
+ libraryId: string,
+ game: string,
+ version: string,
+ filename: string,
+ options?: { start?: number; end?: number },
+ ) {
+ const library = this.libraries.get(libraryId);
+ if (!library) return undefined;
+ return await library.readFile(game, version, filename, options);
+ }
}
export const libraryManager = new LibraryManager();
diff --git a/server/internal/library/provider.ts b/server/internal/library/provider.ts
new file mode 100644
index 0000000..b5cb64b
--- /dev/null
+++ b/server/internal/library/provider.ts
@@ -0,0 +1,63 @@
+import type { LibraryBackend } from "~/prisma/client/enums";
+
+export abstract class LibraryProvider {
+ constructor(_config: CFG, _id: string) {
+ throw new Error("Library doesn't have a proper constructor");
+ }
+
+ /**
+ * @returns ID of the current library provider (fs, smb, s3, etc)
+ */
+ abstract type(): LibraryBackend;
+
+ /**
+ * @returns the specific ID of this current provider
+ */
+ abstract id(): string;
+
+ /**
+ * @returns list of (usually) top-level game folder names
+ */
+ abstract listGames(): Promise;
+
+ /**
+ * @param game folder name of the game to list versions for
+ * @returns list of version folder names
+ */
+ abstract listVersions(game: string): Promise;
+
+ /**
+ * @param game folder name of the game
+ * @param version folder name of the version
+ * @returns recursive list of all files in version, relative to the version folder (e.g. ./setup.exe)
+ */
+ abstract versionReaddir(game: string, version: string): Promise;
+
+ /**
+ * @param game folder name of the game
+ * @param version folder name of the version
+ * @returns string of JSON of the droplet manifest
+ */
+ abstract generateDropletManifest(
+ game: string,
+ version: string,
+ progress: (err: Error | null, v: number) => void,
+ log: (err: Error | null, v: string) => void,
+ ): Promise;
+
+ abstract peekFile(
+ game: string,
+ version: string,
+ filename: string,
+ ): Promise<{ size: number } | undefined>;
+
+ abstract readFile(
+ game: string,
+ version: string,
+ filename: string,
+ options?: { start?: number; end?: number },
+ ): Promise;
+}
+
+export class GameNotFoundError extends Error {}
+export class VersionNotFoundError extends Error {}
diff --git a/server/internal/library/providers/filesystem.ts b/server/internal/library/providers/filesystem.ts
new file mode 100644
index 0000000..de59b46
--- /dev/null
+++ b/server/internal/library/providers/filesystem.ts
@@ -0,0 +1,125 @@
+import { ArkErrors, type } from "arktype";
+import {
+ GameNotFoundError,
+ VersionNotFoundError,
+ type LibraryProvider,
+} from "../provider";
+import { LibraryBackend } from "~/prisma/client/enums";
+import fs from "fs";
+import path from "path";
+import droplet, { DropletHandler } from "@drop-oss/droplet";
+
+export const FilesystemProviderConfig = type({
+ baseDir: "string",
+});
+
+export const DROPLET_HANDLER = new DropletHandler();
+
+export class FilesystemProvider
+ implements LibraryProvider
+{
+ private config: typeof FilesystemProviderConfig.infer;
+ private myId: string;
+
+ constructor(rawConfig: unknown, id: string) {
+ const config = FilesystemProviderConfig(rawConfig);
+ if (config instanceof ArkErrors) {
+ throw new Error(
+ `Failed to create filesystem provider: ${config.summary}`,
+ );
+ }
+
+ this.myId = id;
+ this.config = config;
+
+ if (!fs.existsSync(this.config.baseDir))
+ throw "Base directory does not exist.";
+ }
+
+ id(): string {
+ return this.myId;
+ }
+
+ type(): LibraryBackend {
+ return LibraryBackend.Filesystem;
+ }
+
+ async listGames(): Promise {
+ const dirs = fs.readdirSync(this.config.baseDir);
+ const folderDirs = dirs.filter((e) => {
+ const fullDir = path.join(this.config.baseDir, e);
+ return fs.lstatSync(fullDir).isDirectory();
+ });
+ return folderDirs;
+ }
+
+ async listVersions(game: string): Promise {
+ const gameDir = path.join(this.config.baseDir, game);
+ if (!fs.existsSync(gameDir)) throw new GameNotFoundError();
+ const versionDirs = fs.readdirSync(gameDir);
+ const validVersionDirs = versionDirs.filter((e) => {
+ const fullDir = path.join(this.config.baseDir, game, e);
+ return DROPLET_HANDLER.hasBackendForPath(fullDir);
+ });
+ return validVersionDirs;
+ }
+
+ async versionReaddir(game: string, version: string): Promise {
+ const versionDir = path.join(this.config.baseDir, game, version);
+ if (!fs.existsSync(versionDir)) throw new VersionNotFoundError();
+ return DROPLET_HANDLER.listFiles(versionDir);
+ }
+
+ async generateDropletManifest(
+ game: string,
+ version: string,
+ progress: (err: Error | null, v: number) => void,
+ log: (err: Error | null, v: string) => void,
+ ): Promise {
+ const versionDir = path.join(this.config.baseDir, game, version);
+ if (!fs.existsSync(versionDir)) throw new VersionNotFoundError();
+ const manifest = await new Promise((r, j) =>
+ droplet.generateManifest(
+ DROPLET_HANDLER,
+ versionDir,
+ progress,
+ log,
+ (err, result) => {
+ if (err) return j(err);
+ r(result);
+ },
+ ),
+ );
+ return manifest;
+ }
+
+ async peekFile(game: string, version: string, filename: string) {
+ const filepath = path.join(this.config.baseDir, game, version);
+ if (!fs.existsSync(filepath)) return undefined;
+ const stat = DROPLET_HANDLER.peekFile(filepath, filename);
+ return { size: Number(stat) };
+ }
+
+ async readFile(
+ game: string,
+ version: string,
+ filename: string,
+ options?: { start?: number; end?: number },
+ ) {
+ const filepath = path.join(this.config.baseDir, game, version);
+ if (!fs.existsSync(filepath)) return undefined;
+ let stream;
+ while (!(stream instanceof ReadableStream)) {
+ const v = DROPLET_HANDLER.readFile(
+ filepath,
+ filename,
+ options?.start ? BigInt(options.start) : undefined,
+ options?.end ? BigInt(options.end) : undefined,
+ );
+ if (!v) return undefined;
+ stream = v.getStream() as ReadableStream;
+ }
+
+ return stream;
+ }
+}
diff --git a/server/internal/library/providers/flat.ts b/server/internal/library/providers/flat.ts
new file mode 100644
index 0000000..9ebb5ef
--- /dev/null
+++ b/server/internal/library/providers/flat.ts
@@ -0,0 +1,116 @@
+import { ArkErrors, type } from "arktype";
+import type { LibraryProvider } from "../provider";
+import { VersionNotFoundError } from "../provider";
+import { LibraryBackend } from "~/prisma/client/enums";
+import fs from "fs";
+import path from "path";
+import droplet from "@drop-oss/droplet";
+import { DROPLET_HANDLER } from "./filesystem";
+
+export const FlatFilesystemProviderConfig = type({
+ baseDir: "string",
+});
+
+export class FlatFilesystemProvider
+ implements LibraryProvider
+{
+ private config: typeof FlatFilesystemProviderConfig.infer;
+ private myId: string;
+
+ constructor(rawConfig: unknown, id: string) {
+ const config = FlatFilesystemProviderConfig(rawConfig);
+ if (config instanceof ArkErrors) {
+ throw new Error(
+ `Failed to create filesystem provider: ${config.summary}`,
+ );
+ }
+
+ this.myId = id;
+ this.config = config;
+
+ if (!fs.existsSync(this.config.baseDir))
+ throw "Base directory does not exist.";
+ }
+
+ type() {
+ return LibraryBackend.FlatFilesystem;
+ }
+ id() {
+ return this.myId;
+ }
+
+ /**
+ * These are basically our versions, but also our games.
+ * @returns list of valid games
+ */
+ async listGames() {
+ const versionDirs = fs.readdirSync(this.config.baseDir);
+ const validVersionDirs = versionDirs.filter((e) => {
+ const fullDir = path.join(this.config.baseDir, e);
+ return DROPLET_HANDLER.hasBackendForPath(fullDir);
+ });
+ return validVersionDirs;
+ }
+
+ /**
+ * Doesn't do anything, just returns "default"
+ * @param _game Ignored
+ * @returns
+ */
+ async listVersions(_game: string) {
+ return ["default"];
+ }
+
+ async versionReaddir(game: string, _version: string) {
+ const versionDir = path.join(this.config.baseDir, game);
+ if (!fs.existsSync(versionDir)) throw new VersionNotFoundError();
+ return DROPLET_HANDLER.listFiles(versionDir);
+ }
+
+ async generateDropletManifest(
+ game: string,
+ _version: string,
+ progress: (err: Error | null, v: number) => void,
+ log: (err: Error | null, v: string) => void,
+ ) {
+ const versionDir = path.join(this.config.baseDir, game);
+ if (!fs.existsSync(versionDir)) throw new VersionNotFoundError();
+ const manifest = await new Promise((r, j) =>
+ droplet.generateManifest(
+ DROPLET_HANDLER,
+ versionDir,
+ progress,
+ log,
+ (err, result) => {
+ if (err) return j(err);
+ r(result);
+ },
+ ),
+ );
+ return manifest;
+ }
+ async peekFile(game: string, _version: string, filename: string) {
+ const filepath = path.join(this.config.baseDir, game);
+ if (!fs.existsSync(filepath)) return undefined;
+ const stat = DROPLET_HANDLER.peekFile(filepath, filename);
+ return { size: Number(stat) };
+ }
+ async readFile(
+ game: string,
+ _version: string,
+ filename: string,
+ options?: { start?: number; end?: number },
+ ) {
+ const filepath = path.join(this.config.baseDir, game);
+ if (!fs.existsSync(filepath)) return undefined;
+ const stream = DROPLET_HANDLER.readFile(
+ filepath,
+ filename,
+ options?.start ? BigInt(options.start) : undefined,
+ options?.end ? BigInt(options.end) : undefined,
+ );
+ if (!stream) return undefined;
+
+ return stream.getStream();
+ }
+}
diff --git a/server/internal/logging/index.ts b/server/internal/logging/index.ts
new file mode 100644
index 0000000..1c81d89
--- /dev/null
+++ b/server/internal/logging/index.ts
@@ -0,0 +1,14 @@
+import pino from "pino";
+import pinoPretty from "pino-pretty";
+
+// call pino pretty so that it isn't excluded from the build
+pinoPretty();
+
+export const logger = pino({
+ transport: {
+ target: "pino-pretty",
+ options: {
+ colorize: true,
+ },
+ },
+});
diff --git a/server/internal/metadata/giantbomb.ts b/server/internal/metadata/giantbomb.ts
index d617f0c..aa7e6d6 100644
--- a/server/internal/metadata/giantbomb.ts
+++ b/server/internal/metadata/giantbomb.ts
@@ -1,5 +1,5 @@
-import type { Company } from "~/prisma/client";
-import { MetadataSource } from "~/prisma/client";
+import type { CompanyModel } from "~/prisma/client/models";
+import { MetadataSource } from "~/prisma/client/enums";
import type { MetadataProvider } from ".";
import { MissingMetadataProviderConfig } from ".";
import type {
@@ -8,11 +8,12 @@ import type {
GameMetadata,
_FetchCompanyMetadataParams,
CompanyMetadata,
+ GameMetadataRating,
} from "./types";
-import type { AxiosRequestConfig } from "axios";
-import axios from "axios";
+import axios, { type AxiosRequestConfig } from "axios";
import TurndownService from "turndown";
import { DateTime } from "luxon";
+import type { TaskRunContext } from "../tasks";
interface GiantBombResponseType {
error: "OK" | string;
@@ -60,6 +61,22 @@ interface GameResult {
tags: string; // If it's "All Images", art, otherwise screenshot
original: string;
}>;
+
+ reviews?: Array<{
+ api_detail_url: string;
+ }>;
+
+ genres?: Array<{
+ name: string;
+ id: number;
+ }>;
+}
+
+interface ReviewResult {
+ deck: string;
+ score: number; // Out of 5
+ reviewer: string;
+ site_detail_url: string;
}
interface CompanySearchResult {
@@ -154,12 +171,12 @@ export class GiantBombProvider implements MetadataProvider {
return mapped;
}
- async fetchGame({
- id,
- publisher,
- developer,
- createObject,
- }: _FetchGameMetadataParams): Promise {
+ async fetchGame(
+ { id, publisher, developer, createObject }: _FetchGameMetadataParams,
+ context?: TaskRunContext,
+ ): Promise {
+ context?.logger.info("Using GiantBomb provider");
+
const result = await this.request("game", id, {});
const gameData = result.data.results;
@@ -167,24 +184,40 @@ export class GiantBombProvider implements MetadataProvider {
? this.turndown.turndown(gameData.description)
: gameData.deck;
- const publishers: Company[] = [];
+ const publishers: CompanyModel[] = [];
if (gameData.publishers) {
for (const pub of gameData.publishers) {
+ context?.logger.info(`Importing publisher "${pub.name}"`);
+
const res = await publisher(pub.name);
- if (res === undefined) continue;
+ if (res === undefined) {
+ context?.logger.warn(`Failed to import publisher "${pub}"`);
+ continue;
+ }
+ context?.logger.info(`Imported publisher "${pub.name}"`);
publishers.push(res);
}
}
- const developers: Company[] = [];
+ context?.progress(35);
+
+ const developers: CompanyModel[] = [];
if (gameData.developers) {
for (const dev of gameData.developers) {
+ context?.logger.info(`Importing developer "${dev.name}"`);
+
const res = await developer(dev.name);
- if (res === undefined) continue;
+ if (res === undefined) {
+ context?.logger.warn(`Failed to import developer "${dev}"`);
+ continue;
+ }
+ context?.logger.info(`Imported developer "${dev}"`);
developers.push(res);
}
}
+ context?.progress(70);
+
const icon = createObject(gameData.image.icon_url);
const banner = createObject(gameData.image.screen_large_url);
@@ -192,13 +225,32 @@ export class GiantBombProvider implements MetadataProvider {
const images = [banner, ...imageURLs.map(createObject)];
+ context?.logger.info(`Found all images. Total of ${images.length + 1}.`);
+
const releaseDate = gameData.original_release_date
? DateTime.fromISO(gameData.original_release_date).toJSDate()
- : DateTime.fromISO(
- `${gameData.expected_release_year ?? new Date().getFullYear()}-${
- gameData.expected_release_month ?? 1
- }-${gameData.expected_release_day ?? 1}`,
- ).toJSDate();
+ : new Date();
+
+ context?.progress(85);
+
+ const reviews: GameMetadataRating[] = [];
+ if (gameData.reviews) {
+ context?.logger.info("Found reviews, importing...");
+ for (const { api_detail_url } of gameData.reviews) {
+ const reviewId = api_detail_url.split("/").at(-2);
+ if (!reviewId) continue;
+ const review = await this.request("review", reviewId, {});
+ reviews.push({
+ metadataSource: MetadataSource.GiantBomb,
+ metadataId: reviewId,
+ mReviewCount: 1,
+ mReviewRating: review.data.results.score / 5,
+ mReviewHref: review.data.results.site_detail_url,
+ });
+ }
+ }
+
+ const tags = (gameData.genres ?? []).map((e) => e.name);
const metadata: GameMetadata = {
id: gameData.guid,
@@ -207,8 +259,9 @@ export class GiantBombProvider implements MetadataProvider {
description: longDescription,
released: releaseDate,
- reviewCount: 0,
- reviewRating: 0,
+ tags,
+
+ reviews,
publishers,
developers,
@@ -219,12 +272,15 @@ export class GiantBombProvider implements MetadataProvider {
images,
};
+ context?.logger.info("GiantBomb provider finished.");
+ context?.progress(100);
+
return metadata;
}
async fetchCompany({
query,
createObject,
- }: _FetchCompanyMetadataParams): Promise {
+ }: _FetchCompanyMetadataParams): Promise {
const results = await this.request>(
"search",
"",
@@ -235,7 +291,7 @@ export class GiantBombProvider implements MetadataProvider {
const company =
results.data.results.find((e) => e.name == query) ??
results.data.results.at(0);
- if (!company) throw new Error(`No results for "${query}"`);
+ if (!company) return undefined;
const longDescription = company.description
? this.turndown.turndown(company.description)
diff --git a/server/internal/metadata/igdb.ts b/server/internal/metadata/igdb.ts
index 1970d89..52e47b2 100644
--- a/server/internal/metadata/igdb.ts
+++ b/server/internal/metadata/igdb.ts
@@ -1,5 +1,5 @@
-import type { Company } from "~/prisma/client";
-import { MetadataSource } from "~/prisma/client";
+import type { CompanyModel } from "~/prisma/client/models";
+import { MetadataSource } from "~/prisma/client/enums";
import type { MetadataProvider } from ".";
import { MissingMetadataProviderConfig } from ".";
import type {
@@ -12,6 +12,9 @@ import type {
import type { AxiosRequestConfig } from "axios";
import axios from "axios";
import { DateTime } from "luxon";
+import * as jdenticon from "jdenticon";
+import type { TaskRunContext } from "../tasks";
+import { logger } from "~/server/internal/logging";
type IGDBID = number;
@@ -31,6 +34,12 @@ interface IGDBItem {
id: IGDBID;
}
+interface IGDBGenre extends IGDBItem {
+ name: string;
+ slug: string;
+ url: string;
+}
+
// denotes role a company had in a game
interface IGDBInvolvedCompany extends IGDBItem {
company: IGDBID;
@@ -68,8 +77,8 @@ interface IGDBCover extends IGDBItem {
interface IGDBSearchStub extends IGDBItem {
name: string;
- cover: IGDBID;
- first_release_date: number; // unix timestamp
+ cover?: IGDBID;
+ first_release_date?: number; // unix timestamp
summary: string;
}
@@ -155,7 +164,7 @@ export class IGDBProvider implements MetadataProvider {
}
private async authWithTwitch() {
- console.log("authorizing with twitch");
+ logger.info("IGDB authorizing with twitch");
const params = new URLSearchParams({
client_id: this.clientId,
client_secret: this.clientSecret,
@@ -168,10 +177,17 @@ export class IGDBProvider implements MetadataProvider {
method: "POST",
});
+ if (response.status !== 200)
+ throw new Error(
+ `Error in IDGB \nStatus Code: ${response.status}\n${response.data}`,
+ );
+
this.accessToken = response.data.access_token;
this.accessTokenExpiry = DateTime.now().plus({
seconds: response.data.expires_in,
});
+
+ logger.info("IDGB done authorizing with twitch");
}
private async refreshCredentials() {
@@ -231,6 +247,11 @@ export class IGDBProvider implements MetadataProvider {
}
private async _getMediaInternal(mediaID: IGDBID, type: string) {
+ if (mediaID === undefined)
+ throw new Error(
+ `IGDB mediaID when getting item of type ${type} was undefined`,
+ );
+
const body = `where id = ${mediaID}; fields url;`;
const response = await this.request(type, body);
@@ -244,6 +265,7 @@ export class IGDBProvider implements MetadataProvider {
result = `https:${cover.url}`;
}
});
+
return result;
}
@@ -263,6 +285,32 @@ export class IGDBProvider implements MetadataProvider {
return msg.length > len ? msg.substring(0, 280) + "..." : msg;
}
+ private async _getGenreInternal(genreID: IGDBID) {
+ if (genreID === undefined) throw new Error(`IGDB genreID was undefined`);
+
+ const body = `where id = ${genreID}; fields slug,name,url;`;
+ const response = await this.request("genres", body);
+
+ let result = "";
+
+ response.forEach((genre) => {
+ result = genre.name;
+ });
+
+ return result;
+ }
+
+ private async getGenres(genres: IGDBID[] | undefined): Promise {
+ if (genres === undefined) return [];
+
+ const results: string[] = [];
+ for (const genre of genres) {
+ results.push(await this._getGenreInternal(genre));
+ }
+
+ return results;
+ }
+
name() {
return "IGDB";
}
@@ -276,101 +324,166 @@ export class IGDBProvider implements MetadataProvider {
const results: GameMetadataSearchResult[] = [];
for (let i = 0; i < response.length; i++) {
+ let icon = "";
+ const cover = response[i].cover;
+ if (cover !== undefined) {
+ icon = await this.getCoverURL(cover);
+ } else {
+ icon = "";
+ }
+
+ const firstReleaseDate = response[i].first_release_date;
results.push({
id: "" + response[i].id,
name: response[i].name,
- icon: await this.getCoverURL(response[i].cover),
+ icon,
description: response[i].summary,
- year: DateTime.fromSeconds(response[i].first_release_date).year,
+ year:
+ firstReleaseDate === undefined
+ ? 0
+ : DateTime.fromSeconds(firstReleaseDate).year,
});
}
return results;
}
- async fetchGame({
- id,
- publisher,
- developer,
- createObject,
- }: _FetchGameMetadataParams): Promise {
+ async fetchGame(
+ { id, publisher, developer, createObject }: _FetchGameMetadataParams,
+ context?: TaskRunContext,
+ ): Promise {
const body = `where id = ${id}; fields *;`;
- const response = await this.request("games", body);
+ const currentGame = (await this.request("games", body)).at(0);
+ if (!currentGame) throw new Error("No game found on IGDB with that id");
- for (let i = 0; i < response.length; i++) {
- const icon = createObject(await this.getCoverURL(response[i].cover));
- let banner = "";
+ context?.logger.info("Using IDGB provider.");
- const images = [icon];
- for (const art of response[i]?.artworks ?? []) {
- // if banner not set
- if (banner.length <= 0) {
- banner = createObject(await this.getArtworkURL(art));
- images.push(banner);
- } else {
- images.push(createObject(await this.getArtworkURL(art)));
- }
+ let iconRaw;
+ const cover = currentGame.cover;
+
+ if (cover !== undefined) {
+ context?.logger.info("Found cover URL, using...");
+ iconRaw = await this.getCoverURL(cover);
+ } else {
+ context?.logger.info("Missing cover URL, using fallback...");
+ iconRaw = jdenticon.toPng(id, 512);
+ }
+
+ const icon = createObject(iconRaw);
+ let banner;
+
+ const images = [icon];
+ for (const art of currentGame.artworks ?? []) {
+ const objectId = createObject(await this.getArtworkURL(art));
+ if (!banner) {
+ banner = objectId;
}
+ images.push(objectId);
+ }
- const publishers: Company[] = [];
- const developers: Company[] = [];
- for (const involvedCompany of response[i]?.involved_companies ?? []) {
- // get details about the involved company
- const involved_company_response =
- await this.request(
- "involved_companies",
- `where id = ${involvedCompany}; fields *;`,
+ if (!banner) {
+ banner = createObject(jdenticon.toPng(id, 512));
+ }
+
+ context?.progress(20);
+
+ const publishers: CompanyModel[] = [];
+ const developers: CompanyModel[] = [];
+ for (const involvedCompany of currentGame.involved_companies ?? []) {
+ // get details about the involved company
+ const involved_company_response = await this.request(
+ "involved_companies",
+ `where id = ${involvedCompany}; fields *;`,
+ );
+ for (const foundInvolved of involved_company_response) {
+ // now we need to get the actual company so we can get the name
+ const findCompanyResponse = await this.request<
+ { name: string } & IGDBItem
+ >("companies", `where id = ${foundInvolved.company}; fields name;`);
+
+ for (const company of findCompanyResponse) {
+ context?.logger.info(
+ `Found involved company "${company.name}" as: ${foundInvolved.developer ? "developer, " : ""}${foundInvolved.publisher ? "publisher" : ""}`,
);
- for (const foundInvolved of involved_company_response) {
- // now we need to get the actual company so we can get the name
- const findCompanyResponse = await this.request<
- { name: string } & IGDBItem
- >("companies", `where id = ${foundInvolved.company}; fields name;`);
- for (const company of findCompanyResponse) {
- // if company was a dev or publisher
- // CANNOT use else since a company can be both
- if (foundInvolved.developer) {
- const res = await developer(company.name);
- if (res === undefined) continue;
- developers.push(res);
+ // if company was a dev or publisher
+ // CANNOT use else since a company can be both
+ if (foundInvolved.developer) {
+ const res = await developer(company.name);
+ if (res === undefined) {
+ context?.logger.warn(
+ `Failed to import developer "${company.name}"`,
+ );
+ continue;
}
- if (foundInvolved.publisher) {
- const res = await publisher(company.name);
- if (res === undefined) continue;
- publishers.push(res);
+ context?.logger.info(`Imported developer "${company.name}"`);
+ developers.push(res);
+ }
+
+ if (foundInvolved.publisher) {
+ const res = await publisher(company.name);
+ if (res === undefined) {
+ context?.logger.warn(
+ `Failed to import publisher "${company.name}"`,
+ );
+ continue;
}
+ context?.logger.info(`Imported publisher "${company.name}"`);
+ publishers.push(res);
}
}
}
-
- return {
- id: "" + response[i].id,
- name: response[i].name,
- shortDescription: this.trimMessage(response[i].summary, 280),
- description: response[i].summary,
- released: DateTime.fromSeconds(
- response[i].first_release_date,
- ).toJSDate(),
-
- reviewCount: response[i]?.total_rating_count ?? 0,
- reviewRating: (response[i]?.total_rating ?? 0) / 100,
-
- publishers: [],
- developers: [],
-
- icon,
- bannerId: banner,
- coverId: icon,
- images,
- };
}
- throw new Error("No game found on igdb with that id");
+ context?.progress(80);
+
+ const firstReleaseDate = currentGame.first_release_date;
+ const released =
+ firstReleaseDate === undefined
+ ? new Date()
+ : DateTime.fromSeconds(firstReleaseDate).toJSDate();
+
+ const review = {
+ metadataId: currentGame.id.toString(),
+ metadataSource: MetadataSource.IGDB,
+ mReviewCount: currentGame.total_rating_count ?? 0,
+ mReviewRating: (currentGame.total_rating ?? 0) / 100,
+ mReviewHref: currentGame.url,
+ };
+
+ const genres = await this.getGenres(currentGame.genres);
+
+ const deck = this.trimMessage(currentGame.summary, 280);
+
+ const metadata = {
+ id: currentGame.id.toString(),
+ name: currentGame.name,
+ shortDescription: deck,
+ description: currentGame.summary,
+ released,
+
+ genres,
+ reviews: [review],
+
+ publishers,
+ developers,
+
+ tags: [],
+
+ icon,
+ bannerId: banner,
+ coverId: icon,
+ images,
+ };
+
+ context?.logger.info("IGDB provider finished.");
+ context?.progress(100);
+
+ return metadata;
}
async fetchCompany({
query,
createObject,
- }: _FetchCompanyMetadataParams): Promise {
+ }: _FetchCompanyMetadataParams): Promise {
const response = await this.request(
"companies",
`where name = "${query}"; fields *; limit 1;`,
@@ -404,6 +517,6 @@ export class IGDBProvider implements MetadataProvider {
return metadata;
}
- throw new Error(`igdb failed to find publisher/developer ${query}`);
+ return undefined;
}
}
diff --git a/server/internal/metadata/index.ts b/server/internal/metadata/index.ts
index 9c1f03f..88025e8 100644
--- a/server/internal/metadata/index.ts
+++ b/server/internal/metadata/index.ts
@@ -1,4 +1,5 @@
-import { MetadataSource } from "~/prisma/client";
+import type { Prisma } from "~/prisma/client/client";
+import { MetadataSource } from "~/prisma/client/enums";
import prisma from "../db/database";
import type {
_FetchGameMetadataParams,
@@ -7,9 +8,18 @@ import type {
GameMetadataSearchResult,
InternalGameMetadataResult,
CompanyMetadata,
+ GameMetadataRating,
} from "./types";
import { ObjectTransactionalHandler } from "../objects/transactional";
import { PriorityListIndexed } from "../utils/prioritylist";
+import { systemConfig } from "../config/sys-conf";
+import type { TaskRunContext } from "../tasks";
+import taskHandler, { wrapTaskContext } from "../tasks";
+import { randomUUID } from "crypto";
+import { fuzzy } from "fast-fuzzy";
+import { logger } from "~/server/internal/logging";
+import { createGameImportTaskId } from "../library";
+import type { GameTagModel } from "~/prisma/client/models";
export class MissingMetadataProviderConfig extends Error {
private providerName: string;
@@ -25,16 +35,20 @@ export class MissingMetadataProviderConfig extends Error {
}
// TODO: add useragent to all outbound api calls (best practice)
-export const DropUserAgent = "Drop/0.2";
+export const DropUserAgent = `Drop/${systemConfig.getDropVersion()}`;
export abstract class MetadataProvider {
abstract name(): string;
abstract source(): MetadataSource;
abstract search(query: string): Promise;
- abstract fetchGame(params: _FetchGameMetadataParams): Promise;
+ abstract fetchGame(
+ params: _FetchGameMetadataParams,
+ taskRunContext?: TaskRunContext,
+ ): Promise;
abstract fetchCompany(
params: _FetchCompanyMetadataParams,
+ taskRunContext?: TaskRunContext,
): Promise;
}
@@ -79,7 +93,7 @@ export class MetadataHandler {
);
resolve(mappedResults);
} catch (e) {
- console.warn(e);
+ logger.warn(e);
reject(e);
}
});
@@ -90,29 +104,72 @@ export class MetadataHandler {
const successfulResults = results
.filter((result) => result.status === "fulfilled")
.map((result) => result.value)
- .flat();
+ .flat()
+ .map((result) => {
+ const match = fuzzy(query, result.name);
+ return { ...result, fuzzy: match };
+ })
+ .sort((a, b) => b.fuzzy - a.fuzzy);
return successfulResults;
}
- async createGameWithoutMetadata(libraryBasePath: string) {
+ async createGameWithoutMetadata(libraryId: string, libraryPath: string) {
return await this.createGame(
{
id: "",
- name: libraryBasePath,
- icon: "",
- description: "",
- year: 0,
- sourceId: "manual",
- sourceName: "Manual",
+ name: libraryPath,
+ sourceId: MetadataSource.Manual,
},
- libraryBasePath,
+ libraryId,
+ libraryPath,
);
}
+ private async parseTags(tags: string[]) {
+ const results: Array = [];
+
+ for (const tag of tags) {
+ const rawResults: GameTagModel[] =
+ await prisma.$queryRaw`SELECT * FROM "GameTag" WHERE SIMILARITY(name, ${tag}) > 0.45;`;
+ let resultTag = rawResults.at(0);
+ if (!resultTag) {
+ resultTag = await prisma.gameTag.create({
+ data: {
+ name: tag,
+ },
+ });
+ }
+ results.push(resultTag);
+ }
+
+ return results;
+ }
+
+ private parseRatings(ratings: GameMetadataRating[]) {
+ const results: Array = [];
+
+ ratings.forEach((r) => {
+ results.push({
+ where: {
+ metadataKey: {
+ metadataId: r.metadataId,
+ metadataSource: r.metadataSource,
+ },
+ },
+ create: {
+ ...r,
+ },
+ });
+ });
+
+ return results;
+ }
+
async createGame(
- result: InternalGameMetadataResult,
- libraryBasePath: string,
+ result: { sourceId: string; id: string; name: string },
+ libraryId: string,
+ libraryPath: string,
) {
const provider = this.providers.get(result.sourceId);
if (!provider)
@@ -126,61 +183,104 @@ export class MetadataHandler {
},
},
});
- if (existing) return existing;
+ if (existing) return undefined;
- const [createObject, pullObjects, dumpObjects] = this.objectHandler.new(
- {},
- ["internal:read"],
- );
+ const gameId = randomUUID();
- let metadata: GameMetadata | undefined = undefined;
- try {
- metadata = await provider.fetchGame({
- id: result.id,
- name: result.name,
- // wrap in anonymous functions to keep references to this
- publisher: (name: string) => this.fetchCompany(name),
- developer: (name: string) => this.fetchCompany(name),
- createObject,
- });
- } catch (e) {
- dumpObjects();
- throw e;
- }
+ const taskId = createGameImportTaskId(libraryId, libraryPath);
+ await taskHandler.create({
+ name: `Import game "${result.name}" (${libraryPath})`,
+ id: taskId,
+ taskGroup: "import:game",
+ acls: ["system:import:game:read"],
+ async run(context) {
+ const { progress, logger } = context;
- const game = await prisma.game.create({
- data: {
- metadataSource: provider.source(),
- metadataId: metadata.id,
+ progress(0);
- mName: metadata.name,
- mShortDescription: metadata.shortDescription,
- mDescription: metadata.description,
+ const [createObject, pullObjects, dumpObjects] =
+ metadataHandler.objectHandler.new(
+ {},
+ ["internal:read"],
+ wrapTaskContext(context, {
+ min: 60,
+ max: 95,
+ prefix: "[object import] ",
+ }),
+ );
- mReviewCount: metadata.reviewCount,
- mReviewRating: metadata.reviewRating,
- mReleased: metadata.released,
+ let metadata: GameMetadata | undefined = undefined;
+ try {
+ metadata = await provider.fetchGame(
+ {
+ id: result.id,
+ name: result.name,
+ // wrap in anonymous functions to keep references to this
+ publisher: (name: string) => metadataHandler.fetchCompany(name),
+ developer: (name: string) => metadataHandler.fetchCompany(name),
+ createObject,
+ },
+ wrapTaskContext(context, {
+ min: 0,
+ max: 60,
+ prefix: "[metadata import] ",
+ }),
+ );
+ } catch (e) {
+ dumpObjects();
+ throw e;
+ }
- mIconObjectId: metadata.icon,
- mBannerObjectId: metadata.bannerId,
- mCoverObjectId: metadata.coverId,
- mImageLibraryObjectIds: metadata.images,
+ context?.progress(60);
- publishers: {
- connect: metadata.publishers,
- },
- developers: {
- connect: metadata.developers,
- },
+ logger.info(`Successfully fetched all metadata.`);
+ logger.info(`Importing objects...`);
- libraryBasePath,
+ await pullObjects();
+
+ progress(95);
+
+ await prisma.game.create({
+ data: {
+ id: gameId,
+ metadataSource: provider.source(),
+ metadataId: metadata.id,
+
+ mName: metadata.name,
+ mShortDescription: metadata.shortDescription,
+ mDescription: metadata.description,
+ mReleased: metadata.released,
+
+ mIconObjectId: metadata.icon,
+ mBannerObjectId: metadata.bannerId,
+ mCoverObjectId: metadata.coverId,
+ mImageLibraryObjectIds: metadata.images,
+
+ publishers: {
+ connect: metadata.publishers,
+ },
+ developers: {
+ connect: metadata.developers,
+ },
+
+ ratings: {
+ connectOrCreate: metadataHandler.parseRatings(metadata.reviews),
+ },
+ tags: {
+ connect: await metadataHandler.parseTags(metadata.tags),
+ },
+
+ libraryId,
+ libraryPath,
+ },
+ });
+
+ logger.info(`Finished game import.`);
+ progress(100);
},
});
- // relate companies to game
- await pullObjects();
-
- return game;
+ return taskId;
}
// Careful with this function, it has no typechecking
@@ -210,16 +310,19 @@ export class MetadataHandler {
);
}
} catch (e) {
- console.warn(e);
+ logger.warn(e);
dumpObjects();
continue;
}
- // If we're successful
- await pullObjects();
-
- const object = await prisma.company.create({
- data: {
+ const object = await prisma.company.upsert({
+ where: {
+ metadataKey: {
+ metadataSource: provider.source(),
+ metadataId: result.id,
+ },
+ },
+ create: {
metadataSource: provider.source(),
metadataId: result.id,
metadataOriginalQuery: query,
@@ -231,14 +334,18 @@ export class MetadataHandler {
mBannerObjectId: result.banner,
mWebsite: result.website,
},
+ update: {},
});
+ if (object.mLogoObjectId == result.logo) {
+ // We created, and didn't update
+ // So pull objects
+ await pullObjects();
+ }
+
return object;
}
- // throw new Error(
- // `No metadata provider found a ${databaseName} for "${query}"`,
- // );
return undefined;
}
}
diff --git a/server/internal/metadata/manual.ts b/server/internal/metadata/manual.ts
index fb3786c..4dde413 100644
--- a/server/internal/metadata/manual.ts
+++ b/server/internal/metadata/manual.ts
@@ -1,4 +1,4 @@
-import { MetadataSource } from "~/prisma/client";
+import { MetadataSource } from "~/prisma/client/enums";
import type { MetadataProvider } from ".";
import type {
_FetchGameMetadataParams,
@@ -26,15 +26,15 @@ export class ManualMetadataProvider implements MetadataProvider {
const iconId = createObject(icon);
return {
- id: "manual",
+ id: crypto.randomUUID(),
name,
shortDescription: "Default description.",
description: "# Default description.",
released: new Date(),
publishers: [],
developers: [],
- reviewCount: 0,
- reviewRating: 0,
+ tags: [],
+ reviews: [],
icon: iconId,
coverId: iconId,
@@ -44,7 +44,7 @@ export class ManualMetadataProvider implements MetadataProvider {
}
async fetchCompany(
_params: _FetchCompanyMetadataParams,
- ): Promise {
- throw new Error("Method not implemented.");
+ ): Promise {
+ return undefined;
}
}
diff --git a/server/internal/metadata/pcgamingwiki.ts b/server/internal/metadata/pcgamingwiki.ts
index 5ebce0c..ab965bc 100644
--- a/server/internal/metadata/pcgamingwiki.ts
+++ b/server/internal/metadata/pcgamingwiki.ts
@@ -1,5 +1,5 @@
-import type { Company } from "~/prisma/client";
-import { MetadataSource } from "~/prisma/client";
+import type { CompanyModel } from "~/prisma/client/models";
+import { MetadataSource } from "~/prisma/client/enums";
import type { MetadataProvider } from ".";
import type {
GameMetadataSearchResult,
@@ -7,11 +7,33 @@ import type {
GameMetadata,
_FetchCompanyMetadataParams,
CompanyMetadata,
+ GameMetadataRating,
} from "./types";
import type { AxiosRequestConfig } from "axios";
import axios from "axios";
import * as jdenticon from "jdenticon";
import { DateTime } from "luxon";
+import * as cheerio from "cheerio";
+import { type } from "arktype";
+import type { TaskRunContext } from "../tasks";
+import { logger } from "~/server/internal/logging";
+
+interface PCGamingWikiParseRawPage {
+ parse: {
+ title: string;
+ pageid: number;
+ revid: number;
+ displaytitle: string;
+ // array of links
+ externallinks: string[];
+ // array of wiki file names
+ images: string[];
+ text: {
+ // rendered page contents
+ "*": string;
+ };
+ };
+}
interface PCGamingWikiPage {
PageID: string;
@@ -25,12 +47,19 @@ interface PCGamingWikiSearchStub extends PCGamingWikiPage {
}
interface PCGamingWikiGame extends PCGamingWikiSearchStub {
- Developers: string | null;
- Genres: string | null;
- Publishers: string | null;
- Themes: string | null;
+ Developers: string | string[] | null;
+ Publishers: string | string[] | null;
+
+ // TODO: save this somewhere, maybe a tag?
Series: string | null;
- Modes: string | null;
+
+ // tags
+ Perspectives: string | string[] | null; // ie: First-person
+ Genres: string | string[] | null; // ie: Action, FPS
+ "Art styles": string | string[] | null; // ie: Stylized
+ Themes: string | string[] | null; // ie: Post-apocalyptic, Sci-fi, Space
+ Modes: string | string[] | null; // ie: Singleplayer, Multiplayer
+ Pacing: string | string[] | null; // ie: Real-time
}
interface PCGamingWikiCompany extends PCGamingWikiPage {
@@ -55,6 +84,14 @@ interface PCGamingWikiCargoResult {
};
}
+type StringArrayKeys = {
+ [K in keyof T]: T[K] extends string | string[] | null ? K : never;
+}[keyof T];
+
+const ratingProviderReview = type({
+ rating: "string.integer.parse",
+});
+
// Api Docs: https://www.pcgamingwiki.com/wiki/PCGamingWiki:API
// Good tool for helping build cargo queries: https://www.pcgamingwiki.com/wiki/Special:CargoQuery
export class PCGamingWikiProvider implements MetadataProvider {
@@ -75,20 +112,161 @@ export class PCGamingWikiProvider implements MetadataProvider {
url: finalURL,
baseURL: "",
};
- const response = await axios.request>(
+ const response = await axios.request(
Object.assign({}, options, overlay),
);
if (response.status !== 200)
throw new Error(
- `Error in pcgamingwiki \nStatus Code: ${response.status}`,
+ `Error in pcgamingwiki \nStatus Code: ${response.status}\n${response.data}`,
);
- else if (response.data.error !== undefined)
- throw new Error(`Error in pcgamingwiki, malformed query`);
return response;
}
+ private async cargoQuery(
+ query: URLSearchParams,
+ options?: AxiosRequestConfig,
+ ) {
+ const response = await this.request>(
+ query,
+ options,
+ );
+ if (response.data.error !== undefined)
+ throw new Error(`Error in pcgamingwiki cargo query`);
+ return response;
+ }
+
+ /**
+ * Gets the raw wiki page for parsing,
+ * requested values are to be considered unstable as compared to cargo queries
+ * @param pageID
+ * @returns
+ */
+ private async getPageContent(pageID: string) {
+ const searchParams = new URLSearchParams({
+ action: "parse",
+ format: "json",
+ pageid: pageID,
+ });
+ const res = await this.request(searchParams);
+ const $ = cheerio.load(res.data.parse.text["*"]);
+ // get intro based on 'introduction' class
+ const introductionEle = $(".introduction").first();
+ // remove citations from intro
+ introductionEle.find("sup").remove();
+
+ const infoBoxEle = $(".template-infobox").first();
+ const receptionEle = infoBoxEle
+ .find(".template-infobox-header")
+ .filter((_, el) => $(el).text().trim() === "Reception");
+
+ const receptionResults: (GameMetadataRating | undefined)[] = [];
+ if (receptionEle.length > 0) {
+ // we have a match!
+
+ const ratingElements = infoBoxEle.find(".template-infobox-type");
+
+ // TODO: cleanup this ratnest
+ const parseIdFromHref = (href: string): string | undefined => {
+ const url = new URL(href);
+ const opencriticRegex = /^\/game\/(\d+)\/.+$/;
+ switch (url.hostname.toLocaleLowerCase()) {
+ case "www.metacritic.com": {
+ // https://www.metacritic.com/game/elden-ring/critic-reviews/?platform=pc
+ return url.pathname
+ .replace("/game/", "")
+ .replace("/critic-reviews", "")
+ .replace(/\/$/, "");
+ }
+ case "opencritic.com": {
+ // https://opencritic.com/game/12090/elden-ring
+ let id = "unknown";
+ let matches;
+ if ((matches = opencriticRegex.exec(url.pathname)) !== null) {
+ matches.forEach((match, _groupIndex) => {
+ // logger.log(`Found match, group ${_groupIndex}: ${match}`);
+ id = match;
+ });
+ }
+
+ if (id === "unknown") {
+ return undefined;
+ }
+ return id;
+ }
+ case "www.igdb.com": {
+ // https://www.igdb.com/games/elden-ring
+ return url.pathname.replace("/games/", "").replace(/\/$/, "");
+ }
+ default: {
+ logger.warn("Pcgamingwiki, unknown host", url.hostname);
+ return undefined;
+ }
+ }
+ };
+ const getRating = (
+ source: MetadataSource,
+ ): GameMetadataRating | undefined => {
+ const providerEle = ratingElements.filter(
+ (_, el) =>
+ $(el).text().trim().toLocaleLowerCase() ===
+ source.toLocaleLowerCase(),
+ );
+ if (providerEle.length > 0) {
+ // get info associated with provider
+ const reviewEle = providerEle
+ .first()
+ .parent()
+ .find(".template-infobox-info")
+ .find("a")
+ .first();
+
+ const href = reviewEle.attr("href");
+ if (!href) {
+ logger.info(
+ `pcgamingwiki: failed to properly get review href for ${source}`,
+ );
+ return undefined;
+ }
+ const ratingObj = ratingProviderReview({
+ rating: reviewEle.text().trim(),
+ });
+ if (ratingObj instanceof type.errors) {
+ logger.info(
+ "pcgamingwiki: failed to properly get review rating",
+ ratingObj.summary,
+ );
+ return undefined;
+ }
+
+ const id = parseIdFromHref(href);
+ if (!id) return undefined;
+
+ return {
+ mReviewHref: href,
+ metadataId: id,
+ metadataSource: source,
+ mReviewCount: 0,
+ // make float within 0 to 1
+ mReviewRating: ratingObj.rating / 100,
+ };
+ }
+
+ return undefined;
+ };
+ receptionResults.push(getRating(MetadataSource.Metacritic));
+ receptionResults.push(getRating(MetadataSource.IGDB));
+ receptionResults.push(getRating(MetadataSource.OpenCritic));
+ }
+
+ return {
+ shortIntro: introductionEle.find("p").first().text().trim(),
+ introduction: introductionEle.text().trim(),
+ reception: receptionResults,
+ };
+ }
+
async search(query: string) {
const searchParams = new URLSearchParams({
action: "cargoquery",
@@ -99,43 +277,58 @@ export class PCGamingWikiProvider implements MetadataProvider {
format: "json",
});
- const res = await this.request(searchParams);
+ const response =
+ await this.cargoQuery(searchParams);
- const mapped = res.data.cargoquery.map((result) => {
+ const results: GameMetadataSearchResult[] = [];
+ for (const result of response.data.cargoquery) {
const game = result.title;
+ const pageContent = await this.getPageContent(game.PageID);
- const metadata: GameMetadataSearchResult = {
+ results.push({
id: game.PageID,
name: game.PageName,
icon: game["Cover URL"] ?? "",
- description: "", // TODO: need to render the `Introduction` template somehow (or we could just hardcode it)
+ description: pageContent.shortIntro,
year:
game.Released !== null && game.Released.length > 0
? // sometimes will provide multiple dates
this.parseTS(game.Released).year
: 0,
- };
- return metadata;
- });
+ });
+ }
- return mapped;
+ return results;
}
/**
- * Parses the specific format that the wiki returns when specifying a company
- * @param companyStr
+ * Parses the specific format that the wiki returns when specifying an array
+ * @param input string or array
* @returns
*/
- private parseCompanyStr(companyStr: string): string[] {
- const results: string[] = [];
- // provides the string as a list of companies
- // ie: "Company:Digerati Distribution,Company:Greylock Studio"
- const items = companyStr.split(",");
+ private parseWikiStringArray(input: string | string[]): string[] {
+ const cleanStr = (str: string): string => {
+ // remove any dumb prefixes we don't care about
+ return str.replace("Company:", "").trim();
+ };
- items.forEach((item) => {
- // remove the `Company:` and trim and whitespace
- results.push(item.replace("Company:", "").trim());
- });
+ // input can provides the string as a list
+ // ie: "Company:Digerati Distribution,Company:Greylock Studio"
+ // or as an array, sometimes the array has empty values
+
+ const results: string[] = [];
+ if (Array.isArray(input)) {
+ input.forEach((c) => {
+ const clean = cleanStr(c);
+ if (clean !== "") results.push(clean);
+ });
+ } else {
+ const items = input.split(",");
+ items.forEach((item) => {
+ const clean = cleanStr(item);
+ if (clean !== "") results.push(clean);
+ });
+ }
return results;
}
@@ -156,65 +349,111 @@ export class PCGamingWikiProvider implements MetadataProvider {
return websiteStr.replaceAll(/\[|]/g, "").split(" ")[0] ?? "";
}
- async fetchGame({
- id,
- name,
- publisher,
- developer,
- createObject,
- }: _FetchGameMetadataParams): Promise {
+ private compileTags(game: PCGamingWikiGame): string[] {
+ const results: string[] = [];
+
+ const properties: StringArrayKeys[] = [
+ "Art styles",
+ "Genres",
+ "Modes",
+ "Pacing",
+ "Perspectives",
+ "Themes",
+ ];
+
+ // loop through all above keys, get the tags they contain
+ properties.forEach((p) => {
+ if (game[p] === null) return;
+
+ results.push(...this.parseWikiStringArray(game[p]));
+ });
+
+ return results;
+ }
+
+ async fetchGame(
+ { id, name, publisher, developer, createObject }: _FetchGameMetadataParams,
+ context?: TaskRunContext,
+ ): Promise {
+ context?.logger.info("Using PCGamingWiki provider");
+ context?.progress(0);
+
const searchParams = new URLSearchParams({
action: "cargoquery",
tables: "Infobox_game",
fields:
- "Infobox_game._pageID=PageID,Infobox_game._pageName=PageName,Infobox_game.Cover_URL,Infobox_game.Developers,Infobox_game.Released,Infobox_game.Genres,Infobox_game.Publishers,Infobox_game.Themes,Infobox_game.Series,Infobox_game.Modes",
+ "Infobox_game._pageID=PageID,Infobox_game._pageName=PageName,Infobox_game.Cover_URL,Infobox_game.Developers,Infobox_game.Released,Infobox_game.Genres,Infobox_game.Publishers,Infobox_game.Themes,Infobox_game.Series,Infobox_game.Modes,Infobox_game.Perspectives,Infobox_game.Art_styles,Infobox_game.Pacing",
where: `Infobox_game._pageID="${id}"`,
format: "json",
});
- const res = await this.request(searchParams);
+ const [res, pageContent] = await Promise.all([
+ this.cargoQuery(searchParams),
+ this.getPageContent(id),
+ ]);
if (res.data.cargoquery.length < 1)
throw new Error("Error in pcgamingwiki, no game");
const game = res.data.cargoquery[0].title;
- const publishers: Company[] = [];
+ const publishers: CompanyModel[] = [];
if (game.Publishers !== null) {
- const pubListClean = this.parseCompanyStr(game.Publishers);
+ context?.logger.info("Found publishers, importing...");
+ const pubListClean = this.parseWikiStringArray(game.Publishers);
for (const pub of pubListClean) {
+ context?.logger.info(`Importing publisher "${pub}"...`);
+
const res = await publisher(pub);
- if (res === undefined) continue;
+ if (res === undefined) {
+ context?.logger.warn(`Failed to import publisher "${pub}"`);
+ continue;
+ }
+ context?.logger.info(`Imported publisher "${pub}"`);
+ // add to publishers
publishers.push(res);
}
}
- const developers: Company[] = [];
+ context?.progress(40);
+
+ const developers: CompanyModel[] = [];
if (game.Developers !== null) {
- const devListClean = this.parseCompanyStr(game.Developers);
+ context?.logger.info("Found developers, importing...");
+ const devListClean = this.parseWikiStringArray(game.Developers);
for (const dev of devListClean) {
+ context?.logger.info(`Importing developer "${dev}"...`);
const res = await developer(dev);
- if (res === undefined) continue;
+ if (res === undefined) {
+ context?.logger.warn(`Failed to import developer "${dev}"`);
+ continue;
+ }
+ context?.logger.info(`Imported developer "${dev}"`);
developers.push(res);
}
}
- const icon =
+ context?.progress(80);
+
+ const icon = createObject(
game["Cover URL"] !== null
- ? createObject(game["Cover URL"])
- : createObject(jdenticon.toPng(name, 512));
+ ? game["Cover URL"]
+ : jdenticon.toPng(name, 512),
+ );
+
+ const released = game.Released
+ ? DateTime.fromISO(game.Released.split(";")[0]).toJSDate()
+ : new Date();
const metadata: GameMetadata = {
id: game.PageID,
name: game.PageName,
- shortDescription: "", // TODO: (again) need to render the `Introduction` template somehow (or we could just hardcode it)
- description: "",
- released: game.Released
- ? DateTime.fromISO(game.Released.split(";")[0]).toJSDate()
- : new Date(),
+ shortDescription: pageContent.shortIntro,
+ description: pageContent.introduction,
+ released,
- reviewCount: 0,
- reviewRating: 0,
+ tags: this.compileTags(game),
+ reviews: pageContent.reception.filter((v) => typeof v !== "undefined"),
publishers,
developers,
@@ -224,13 +463,16 @@ export class PCGamingWikiProvider implements MetadataProvider {
images: [icon],
};
+ context?.logger.info("PCGamingWiki provider finished.");
+ context?.progress(100);
+
return metadata;
}
async fetchCompany({
query,
createObject,
- }: _FetchCompanyMetadataParams): Promise {
+ }: _FetchCompanyMetadataParams): Promise {
const searchParams = new URLSearchParams({
action: "cargoquery",
tables: "Company",
@@ -240,16 +482,16 @@ export class PCGamingWikiProvider implements MetadataProvider {
format: "json",
});
- const res = await this.request(searchParams);
+ const res = await this.cargoQuery(searchParams);
- // TODO: replace
+ // TODO: replace with company logo
const icon = createObject(jdenticon.toPng(query, 512));
for (let i = 0; i < res.data.cargoquery.length; i++) {
const company = res.data.cargoquery[i].title;
const fixedCompanyName =
- this.parseCompanyStr(company.PageName)[0] ?? company.PageName;
+ this.parseWikiStringArray(company.PageName)[0] ?? company.PageName;
const metadata: CompanyMetadata = {
id: company.PageID,
@@ -264,6 +506,6 @@ export class PCGamingWikiProvider implements MetadataProvider {
return metadata;
}
- throw new Error(`pcgamingwiki failed to find publisher/developer ${query}`);
+ return undefined;
}
}
diff --git a/server/internal/metadata/types.d.ts b/server/internal/metadata/types.d.ts
index 22f30f8..b5286a7 100644
--- a/server/internal/metadata/types.d.ts
+++ b/server/internal/metadata/types.d.ts
@@ -1,4 +1,4 @@
-import type { Company } from "~/prisma/client";
+import type { Company, GameRating } from "~/prisma/client";
import type { TransactionDataType } from "../objects/transactional";
import type { ObjectReference } from "../objects/objectHandler";
@@ -18,6 +18,15 @@ export interface GameMetadataSource {
export type InternalGameMetadataResult = GameMetadataSearchResult &
GameMetadataSource;
+export type GameMetadataRating = Pick<
+ GameRating,
+ | "metadataSource"
+ | "metadataId"
+ | "mReviewCount"
+ | "mReviewHref"
+ | "mReviewRating"
+>;
+
export interface GameMetadata {
id: string;
name: string;
@@ -30,8 +39,9 @@ export interface GameMetadata {
publishers: Company[];
developers: Company[];
- reviewCount: number;
- reviewRating: number;
+ tags: string[];
+
+ reviews: GameMetadataRating[];
// Created with another utility function
icon: ObjectReference;
diff --git a/server/internal/news/index.ts b/server/internal/news/index.ts
index a0ea696..00725eb 100644
--- a/server/internal/news/index.ts
+++ b/server/internal/news/index.ts
@@ -8,7 +8,7 @@ class NewsManager {
description: string;
tags: string[];
authorId: string;
- image?: string;
+ imageObjectId?: string;
}) {
return await prisma.article.create({
data: {
@@ -23,7 +23,7 @@ class NewsManager {
})),
},
- ...(data.image && { image: data.image }),
+ ...(data.imageObjectId && { imageObjectId: data.imageObjectId }),
author: {
connect: {
id: data.authorId,
diff --git a/server/internal/notifications/index.ts b/server/internal/notifications/index.ts
index 930f317..5585087 100644
--- a/server/internal/notifications/index.ts
+++ b/server/internal/notifications/index.ts
@@ -1,32 +1,42 @@
/*
-The notification system handles the recieving, creation and sending of notifications in Drop
+The notification system handles the receiving, creation and sending of notifications in Drop
Design goals:
1. Nonce-based notifications; notifications should only be created once
2. Real-time; use websocket listeners to keep clients up-to-date
*/
-import type { Notification } from "~/prisma/client";
+import type { NotificationModel } from "~/prisma/client/models";
import prisma from "../db/database";
+import type { GlobalACL } from "../acls";
+// type Optional = Pick, K> & Omit;
+
+// TODO: document notification action format
export type NotificationCreateArgs = Pick<
- Notification,
+ NotificationModel,
"title" | "description" | "actions" | "nonce"
->;
+> & { acls: Array };
class NotificationSystem {
+ // userId to acl to listenerId
private listeners = new Map<
string,
- Map void>
+ Map<
+ string,
+ { callback: (notification: NotificationModel) => void; acls: GlobalACL[] }
+ >
>();
listen(
userId: string,
+ acls: Array,
id: string,
- callback: (notification: Notification) => void,
+ callback: (notification: NotificationModel) => void,
) {
- this.listeners.set(userId, new Map());
- this.listeners.get(userId)?.set(id, callback);
+ if (!this.listeners.has(userId)) this.listeners.set(userId, new Map());
+ // eslint-disable-next-line @typescript-eslint/no-extra-non-null-assertion
+ this.listeners.get(userId)!!.set(id, { callback, acls });
this.catchupListener(userId, id);
}
@@ -36,23 +46,30 @@ class NotificationSystem {
}
private async catchupListener(userId: string, id: string) {
- const callback = this.listeners.get(userId)?.get(id);
- if (!callback)
+ const listener = this.listeners.get(userId)?.get(id);
+ if (!listener)
throw new Error("Failed to catch-up listener: callback does not exist");
const notifications = await prisma.notification.findMany({
- where: { userId: userId },
+ where: { userId: userId, acls: { hasSome: listener.acls } },
orderBy: {
created: "asc", // Oldest first, because they arrive in reverse order
},
});
for (const notification of notifications) {
- await callback(notification);
+ await listener.callback(notification);
}
}
- private async pushNotification(userId: string, notification: Notification) {
- for (const listener of this.listeners.get(userId) ?? []) {
- await listener[1](notification);
+ private async pushNotification(
+ userId: string,
+ notification: NotificationModel,
+ ) {
+ for (const [_, listener] of this.listeners.get(userId) ?? []) {
+ const hasSome =
+ notification.acls.findIndex(
+ (e) => listener.acls.findIndex((v) => v === e) != -1,
+ ) != -1;
+ if (hasSome) await listener.callback(notification);
}
}
@@ -61,14 +78,18 @@ class NotificationSystem {
throw new Error("No nonce in notificationCreateArgs");
const notification = await prisma.notification.upsert({
where: {
- nonce: notificationCreateArgs.nonce,
+ userId_nonce: {
+ nonce: notificationCreateArgs.nonce,
+ userId,
+ },
},
update: {
- userId: userId,
+ // we don't need to update the userid right?
+ // userId: userId,
...notificationCreateArgs,
},
create: {
- userId: userId,
+ userId,
...notificationCreateArgs,
},
});
@@ -76,6 +97,27 @@ class NotificationSystem {
await this.pushNotification(userId, notification);
}
+ /**
+ * Internal call to batch push notifications to many users
+ * @param notificationCreateArgs
+ * @param users
+ */
+ private async _pushMany(
+ notificationCreateArgs: NotificationCreateArgs,
+ users: { id: string }[],
+ ) {
+ const res: Promise[] = [];
+ for (const user of users) {
+ res.push(this.push(user.id, notificationCreateArgs));
+ }
+ // wait for all notifications to pass
+ await Promise.all(res);
+ }
+
+ /**
+ * Send a notification to all users
+ * @param notificationCreateArgs
+ */
async pushAll(notificationCreateArgs: NotificationCreateArgs) {
const users = await prisma.user.findMany({
where: { id: { not: "system" } },
@@ -84,13 +126,27 @@ class NotificationSystem {
},
});
- for (const user of users) {
- await this.push(user.id, notificationCreateArgs);
- }
+ await this._pushMany(notificationCreateArgs, users);
}
+ /**
+ * Send a notification to all system level users
+ * @param notificationCreateArgs
+ * @returns
+ */
async systemPush(notificationCreateArgs: NotificationCreateArgs) {
- return await this.push("system", notificationCreateArgs);
+ const users = await prisma.user.findMany({
+ where: {
+ id: { not: "system" },
+ // no reason to send to any users other then admins rn
+ admin: true,
+ },
+ select: {
+ id: true,
+ },
+ });
+
+ await this._pushMany(notificationCreateArgs, users);
}
}
diff --git a/server/internal/objects/fsBackend.ts b/server/internal/objects/fsBackend.ts
index 34e0800..aedab6a 100644
--- a/server/internal/objects/fsBackend.ts
+++ b/server/internal/objects/fsBackend.ts
@@ -1,5 +1,5 @@
import type { ObjectMetadata, ObjectReference, Source } from "./objectHandler";
-import { ObjectBackend } from "./objectHandler";
+import { ObjectBackend, objectMetadata } from "./objectHandler";
import fs from "fs";
import path from "path";
@@ -8,12 +8,17 @@ import { createHash } from "crypto";
import prisma from "../db/database";
import cacheHandler from "../cache";
import { systemConfig } from "../config/sys-conf";
+import { type } from "arktype";
+import { logger } from "~/server/internal/logging";
+import type pino from "pino";
export class FsObjectBackend extends ObjectBackend {
private baseObjectPath: string;
private baseMetadataPath: string;
private hashStore = new FsHashStore();
+ private metadataCache =
+ cacheHandler.createCache("ObjectMetadata");
constructor() {
super();
@@ -99,17 +104,30 @@ export class FsObjectBackend extends ObjectBackend {
const objectPath = path.join(this.baseObjectPath, id);
if (!fs.existsSync(objectPath)) return true;
fs.rmSync(objectPath);
- // remove item from cache
+ const metadataPath = path.join(this.baseMetadataPath, `${id}.json`);
+ if (!fs.existsSync(metadataPath)) return true;
+ fs.rmSync(metadataPath);
+ // remove item from caches
+ await this.metadataCache.remove(id);
await this.hashStore.delete(id);
return true;
}
async fetchMetadata(
id: ObjectReference,
): Promise {
+ const cacheResult = await this.metadataCache.get(id);
+ if (cacheResult !== null) return cacheResult;
+
const metadataPath = path.join(this.baseMetadataPath, `${id}.json`);
if (!fs.existsSync(metadataPath)) return undefined;
- const metadata = JSON.parse(fs.readFileSync(metadataPath, "utf-8"));
- return metadata as ObjectMetadata;
+ const metadataRaw = JSON.parse(fs.readFileSync(metadataPath, "utf-8"));
+ const metadata = objectMetadata(metadataRaw);
+ if (metadata instanceof type.errors) {
+ logger.error("FsObjectBackend#fetchMetadata", metadata.summary);
+ return undefined;
+ }
+ await this.metadataCache.set(id, metadata);
+ return metadata;
}
async writeMetadata(
id: ObjectReference,
@@ -118,6 +136,7 @@ export class FsObjectBackend extends ObjectBackend {
const metadataPath = path.join(this.baseMetadataPath, `${id}.json`);
if (!fs.existsSync(metadataPath)) return false;
fs.writeFileSync(metadataPath, JSON.stringify(metadata));
+ await this.metadataCache.set(id, metadata);
return true;
}
async fetchHash(id: ObjectReference): Promise {
@@ -153,9 +172,38 @@ export class FsObjectBackend extends ObjectBackend {
await store.save(id, hashResult);
return typeof hashResult;
}
+
async listAll(): Promise {
return fs.readdirSync(this.baseObjectPath);
}
+
+ async cleanupMetadata(taskLogger: pino.Logger) {
+ const cleanupLogger = taskLogger ?? logger;
+
+ const metadataFiles = fs.readdirSync(this.baseMetadataPath);
+ const objects = await this.listAll();
+
+ const extraFiles = metadataFiles.filter(
+ (file) => !objects.includes(file.replace(/\.json$/, "")),
+ );
+ cleanupLogger.info(
+ `[FsObjectBackend#cleanupMetadata]: Found ${extraFiles.length} metadata files without corresponding objects.`,
+ );
+ for (const file of extraFiles) {
+ const filePath = path.join(this.baseMetadataPath, file);
+ try {
+ fs.rmSync(filePath);
+ cleanupLogger.info(
+ `[FsObjectBackend#cleanupMetadata]: Removed ${file}`,
+ );
+ } catch (error) {
+ cleanupLogger.error(
+ `[FsObjectBackend#cleanupMetadata]: Failed to remove ${file}`,
+ error,
+ );
+ }
+ }
+ }
}
class FsHashStore {
diff --git a/server/internal/objects/objectHandler.ts b/server/internal/objects/objectHandler.ts
index edbf8ad..21ec619 100644
--- a/server/internal/objects/objectHandler.ts
+++ b/server/internal/objects/objectHandler.ts
@@ -14,17 +14,23 @@
* anotherUserId:write
*/
+import { type } from "arktype";
import { parse as getMimeTypeBuffer } from "file-type-mime";
+import type pino from "pino";
import type { Writable } from "stream";
import { Readable } from "stream";
import { getMimeType as getMimeTypeStream } from "stream-mime-type";
export type ObjectReference = string;
-export type ObjectMetadata = {
- mime: string;
- permissions: string[];
- userMetadata: { [key: string]: string };
-};
+
+export const objectMetadata = type({
+ mime: "string",
+ permissions: "string[]",
+ userMetadata: {
+ "[string]": "string",
+ },
+});
+export type ObjectMetadata = typeof objectMetadata.infer;
export enum ObjectPermission {
Read = "read",
@@ -66,6 +72,7 @@ export abstract class ObjectBackend {
): Promise;
abstract fetchHash(id: ObjectReference): Promise;
abstract listAll(): Promise;
+ abstract cleanupMetadata(taskLogger: pino.Logger): Promise;
}
export class ObjectHandler {
@@ -188,7 +195,7 @@ export class ObjectHandler {
* @returns
* @description If we need to fetch a remote resource, it doesn't make sense
* to immediately fetch the object, *then* check permissions.
- * Instead the caller can pass a simple anonymous funciton, like
+ * Instead the caller can pass a simple anonymous function, like
* () => $dropFetch('/my-image');
* And if we actually have permission to write, it fetches it then.
*/
@@ -252,4 +259,13 @@ export class ObjectHandler {
async listAll() {
return await this.backend.listAll();
}
+
+ /**
+ * Purges metadata for objects that no longer exist
+ * This is useful for cleaning up metadata files that are left behinds
+ * @returns
+ */
+ async cleanupMetadata(taskLogger: pino.Logger) {
+ return await this.backend.cleanupMetadata(taskLogger);
+ }
}
diff --git a/server/internal/objects/transactional.ts b/server/internal/objects/transactional.ts
index 3155aba..bac9475 100644
--- a/server/internal/objects/transactional.ts
+++ b/server/internal/objects/transactional.ts
@@ -5,6 +5,7 @@ This is used as a utility in metadata handling, so we only fetch the objects if
import type { Readable } from "stream";
import { randomUUID } from "node:crypto";
import objectHandler from ".";
+import type { TaskRunContext } from "../tasks";
export type TransactionDataType = string | Readable | Buffer;
type TransactionTable = Map; // ID to data
@@ -20,6 +21,7 @@ export class ObjectTransactionalHandler {
new(
metadata: { [key: string]: string },
permissions: Array,
+ context?: TaskRunContext,
): [Register, Pull, Dump] {
const transactionId = randomUUID();
@@ -35,7 +37,16 @@ export class ObjectTransactionalHandler {
const pull = async () => {
const transaction = this.record.get(transactionId);
if (!transaction) return;
+
+ let progress = 0;
+ const increment = 100 / transaction.size;
+
for (const [id, data] of transaction) {
+ if (typeof data === "string") {
+ context?.logger.info(`Importing object from "${data}"`);
+ } else {
+ context?.logger.info(`Importing raw object...`);
+ }
await objectHandler.createFromSource(
id,
() => {
@@ -47,6 +58,8 @@ export class ObjectTransactionalHandler {
metadata,
permissions,
);
+ progress += increment;
+ context?.progress(progress);
}
};
diff --git a/server/internal/p2p/headscale.ts b/server/internal/p2p/headscale.ts
deleted file mode 100644
index 2472334..0000000
--- a/server/internal/p2p/headscale.ts
+++ /dev/null
@@ -1,82 +0,0 @@
-import type { HeadscaleService } from "@drop-oss/headscalez";
-import { HeadscaleControlService, startHeadscale } from "@drop-oss/headscalez";
-import { systemConfig } from "../config/sys-conf";
-import type { Client, User } from "~/prisma/client";
-
-export class HeadscaleManager {
- private controlURL?: string;
- private headscaleService?: HeadscaleService;
- private headscaleClient?: HeadscaleControlService;
-
- constructor() {
- this.setup();
- }
-
- async setup() {
- const externalUrl = process.env.CONTROL_URL;
- if (externalUrl) {
- this.controlURL = externalUrl;
- const headscale = await startHeadscale({
- externalUrl,
- dir: systemConfig.getHeadscaleFolder(),
- });
- this.headscaleService = headscale;
- this.headscaleClient = new HeadscaleControlService(headscale);
- }
- }
-
- enabled() {
- return !!this.headscaleService;
- }
-
- configuration() {
- if (!this.controlURL) throw new Error("Headscale not available");
- return {
- controlURL: this.controlURL,
- };
- }
-
- private async fetchUser(user: User) {
- if (!this.headscaleClient)
- throw new Error("Headscale client not available");
- const { response } = await this.headscaleClient.client.listUsers({
- id: 0n,
- name: user.id,
- email: "",
- });
-
- if (response.users.length == 0) {
- const { response } = await this.headscaleClient.client.createUser({
- name: user.id,
- displayName: user.displayName,
- email: user.email,
- pictureUrl: user.profilePictureObjectId,
- });
-
- if (!response.user) throw new Error("Could not create user");
-
- return response.user;
- }
-
- return response.users[0];
- }
-
- async createPreauthKey(user: User, client: Client) {
- if (!this.headscaleClient)
- throw new Error("Headscale client not available");
-
- const headscaleUser = await this.fetchUser(user);
- const { response } = await this.headscaleClient.client.createPreAuthKey({
- user: headscaleUser.name,
- reusable: false,
- ephemeral: false,
- aclTags: ["client", `user:${user.id}`, `client:${client.id}`],
- });
-
- if (!response.preAuthKey) throw new Error("Could not create pre-auth key");
- return response.preAuthKey;
- }
-}
-
-export const headscaleManager = new HeadscaleManager();
-export default headscaleManager;
diff --git a/server/internal/screenshots/index.ts b/server/internal/screenshots/index.ts
index e8b4911..b41ac03 100644
--- a/server/internal/screenshots/index.ts
+++ b/server/internal/screenshots/index.ts
@@ -5,6 +5,11 @@ import stream from "node:stream/promises";
import prisma from "../db/database";
class ScreenshotManager {
+ /**
+ * Gets a specific screenshot
+ * @param id
+ * @returns
+ */
async get(id: string) {
return await prisma.screenshot.findUnique({
where: {
@@ -13,7 +18,27 @@ class ScreenshotManager {
});
}
- async getAllByGame(gameId: string, userId: string) {
+ /**
+ * Get all user screenshots
+ * @param userId
+ * @returns
+ */
+ async getUserAll(userId: string) {
+ const results = await prisma.screenshot.findMany({
+ where: {
+ userId,
+ },
+ });
+ return results;
+ }
+
+ /**
+ * Get all user screenshots in a specific game
+ * @param userId
+ * @param gameId
+ * @returns
+ */
+ async getUserAllByGame(userId: string, gameId: string) {
const results = await prisma.screenshot.findMany({
where: {
gameId,
@@ -23,17 +48,35 @@ class ScreenshotManager {
return results;
}
+ /**
+ * Delete a specific screenshot
+ * @param id
+ */
async delete(id: string) {
- await prisma.screenshot.delete({
+ const deletedScreenshot = await prisma.screenshot.delete({
where: {
id,
},
});
+ await objectHandler.deleteAsSystem(deletedScreenshot.objectId);
}
- async upload(gameId: string, userId: string, inputStream: IncomingMessage) {
+ /**
+ * Allows a user to upload a screenshot
+ * @param userId
+ * @param gameId
+ * @param inputStream
+ */
+ async upload(userId: string, gameId: string, inputStream: IncomingMessage) {
const objectId = randomUUID();
- const saveStream = await objectHandler.createWithStream(objectId, {}, []);
+ const saveStream = await objectHandler.createWithStream(
+ objectId,
+ {
+ // TODO: set createAt to the time screenshot was taken
+ createdAt: new Date().toISOString(),
+ },
+ [`${userId}:read`], // This is a system tracked object, so we don't want users to have direct write access to it
+ );
if (!saveStream)
throw createError({
statusCode: 500,
@@ -43,12 +86,12 @@ class ScreenshotManager {
// pipe into object store
await stream.pipeline(inputStream, saveStream);
- // TODO: set createAt to the time screenshot was taken
await prisma.screenshot.create({
data: {
gameId,
userId,
objectId,
+ private: true,
},
});
}
diff --git a/server/internal/tasks/group.ts b/server/internal/tasks/group.ts
new file mode 100644
index 0000000..f914272
--- /dev/null
+++ b/server/internal/tasks/group.ts
@@ -0,0 +1,22 @@
+export const taskGroups = {
+ "cleanup:invitations": {
+ concurrency: false,
+ },
+ "cleanup:objects": {
+ concurrency: false,
+ },
+ "cleanup:sessions": {
+ concurrency: false,
+ },
+ "check:update": {
+ concurrency: false,
+ },
+ "import:game": {
+ concurrency: true,
+ },
+ debug: {
+ concurrency: true,
+ },
+} as const;
+
+export type TaskGroup = keyof typeof taskGroups;
diff --git a/server/internal/tasks/index.ts b/server/internal/tasks/index.ts
index 7bba7d0..54433a9 100644
--- a/server/internal/tasks/index.ts
+++ b/server/internal/tasks/index.ts
@@ -1,35 +1,102 @@
import droplet from "@drop-oss/droplet";
import type { MinimumRequestObject } from "~/server/h3";
+import type { GlobalACL } from "../acls";
import aclManager from "../acls";
+import cleanupInvites from "./registry/invitations";
+import cleanupSessions from "./registry/sessions";
+import checkUpdate from "./registry/update";
+import cleanupObjects from "./registry/objects";
+import { taskGroups, type TaskGroup } from "./group";
+import prisma from "../db/database";
+import { type } from "arktype";
+import pino from "pino";
+import { logger } from "~/server/internal/logging";
+import { Writable } from "node:stream";
+
+// a task that has been run
+type FinishedTask = {
+ success: boolean;
+ progress: number;
+ log: string[];
+ error: { title: string; description: string } | undefined;
+ name: string;
+ taskGroup: TaskGroup;
+ acls: string[];
+
+ // ISO timestamp of when the task started
+ startTime: string;
+ // ISO timestamp of when the task ended
+ endTime: string | undefined;
+};
+
+// a currently running task in the pool
+type TaskPoolEntry = FinishedTask & {
+ clients: Map;
+};
+
/**
* The TaskHandler setups up two-way connections to web clients and manages the state for them
* This allows long-running tasks (like game imports and such) to report progress, success and error states
* easily without re-inventing the wheel every time.
*/
-
-type TaskRegistryEntry = {
- success: boolean;
- progress: number;
- log: string[];
- error: { title: string; description: string } | undefined;
- clients: Map;
- name: string;
- acls: string[];
-};
-
class TaskHandler {
- // TODO: make these maps, using objects like this has performance impacts
- // https://typescript-eslint.io/rules/no-dynamic-delete/
- private taskRegistry = new Map();
- private clientRegistry = new Map();
- startTasks: (() => void)[] = [];
+ // registry of scheduled tasks to be created
+ private taskCreators: Map Task> = new Map();
+
+ // list of all currently running tasks
+ private taskPool = new Map();
+ // list of all clients currently connected to tasks
+ private clientRegistry = new Map();
+
+ private dailyScheduledTasks: TaskGroup[] = [
+ "cleanup:invitations",
+ "cleanup:sessions",
+ "check:update",
+ "debug",
+ ];
+ private weeklyScheduledTasks: TaskGroup[] = ["cleanup:objects"];
+
+ constructor() {
+ // register the cleanup invitations task
+ this.saveScheduledTask(cleanupInvites);
+ this.saveScheduledTask(cleanupSessions);
+ this.saveScheduledTask(checkUpdate);
+ this.saveScheduledTask(cleanupObjects);
+ //this.saveScheduledTask(debug);
+ }
+
+ /**
+ * Saves scheduled task to the registry
+ * @param createTask
+ */
+ private saveScheduledTask(task: DropTask) {
+ this.taskCreators.set(task.taskGroup, task.build);
+ }
+
+ async create(task: Task) {
+ if (this.hasTask(task.id)) throw new Error("Task with ID already exists.");
- create(task: Task) {
let updateCollectTimeout: NodeJS.Timeout | undefined;
let updateCollectResolves: Array<(value: unknown) => void> = [];
let logOffset: number = 0;
+ // if taskgroup disallows concurrency
+ if (!taskGroups[task.taskGroup].concurrency) {
+ for (const existingTask of this.taskPool.values()) {
+ // if a task is already running, we don't want to start another
+ if (existingTask.taskGroup === task.taskGroup) {
+ // TODO: handle this more gracefully, maybe with a queue? should be configurable
+ logger.warn(
+ `Task group ${task.taskGroup} does not allow concurrent tasks. Task ${task.id} will not be started.`,
+ );
+ throw new Error(
+ `Task group ${task.taskGroup} does not allow concurrent tasks.`,
+ );
+ }
+ }
+ }
+
const updateAllClients = (reset = false) =>
new Promise((r) => {
if (updateCollectTimeout) {
@@ -37,7 +104,7 @@ class TaskHandler {
return;
}
updateCollectTimeout = setTimeout(() => {
- const taskEntry = this.taskRegistry.get(task.id);
+ const taskEntry = this.taskPool.get(task.id);
if (!taskEntry) return;
const taskMessage: TaskMessage = {
@@ -66,38 +133,81 @@ class TaskHandler {
}, 100);
});
+ const taskPool = this.taskPool;
+
+ // Custom writable stream to capture logs
+ const logStream = new Writable({
+ objectMode: true,
+ write(chunk, encoding, callback) {
+ try {
+ // chunk is a stringified JSON log line
+ const logObj = JSON.parse(chunk.toString());
+ const taskEntry = taskPool.get(task.id);
+ if (taskEntry) {
+ taskEntry.log.push(JSON.stringify(logObj));
+ updateAllClients();
+ }
+ } catch (e) {
+ // fallback: ignore or log error
+ logger.error("Failed to parse log chunk", {
+ error: e,
+ chunk: chunk,
+ });
+ }
+ callback();
+ },
+ });
+
+ // Use pino with the custom stream
+ const taskLogger = pino(
+ {
+ // You can configure timestamp, level, etc. here
+ timestamp: pino.stdTimeFunctions.isoTime,
+ base: null, // Remove pid/hostname if not needed
+ formatters: {
+ level(label) {
+ return {
+ level: label,
+ };
+ },
+ },
+ },
+ logStream,
+ );
+
const progress = (progress: number) => {
- const taskEntry = this.taskRegistry.get(task.id);
+ if (progress < 0 || progress > 100) {
+ logger.error("Progress must be between 0 and 100", { progress });
+ return;
+ }
+ const taskEntry = this.taskPool.get(task.id);
if (!taskEntry) return;
taskEntry.progress = progress;
+ // log(`Progress: ${progress}%`);
updateAllClients();
};
- const log = (entry: string) => {
- const taskEntry = this.taskRegistry.get(task.id);
- if (!taskEntry) return;
- taskEntry.log.push(entry);
- updateAllClients();
- };
-
- this.taskRegistry.set(task.id, {
+ this.taskPool.set(task.id, {
name: task.name,
+ taskGroup: task.taskGroup,
success: false,
progress: 0,
error: undefined,
log: [],
clients: new Map(),
acls: task.acls,
+ startTime: new Date().toISOString(),
+ endTime: undefined,
});
- updateAllClients(true);
+ await updateAllClients(true);
droplet.callAltThreadFunc(async () => {
- const taskEntry = this.taskRegistry.get(task.id);
+ const taskEntry = this.taskPool.get(task.id);
if (!taskEntry) throw new Error("No task entry");
try {
- await task.run({ progress, log });
+ await task.run({ progress, logger: taskLogger });
taskEntry.success = true;
} catch (error: unknown) {
taskEntry.success = false;
@@ -106,13 +216,35 @@ class TaskHandler {
description: (error as string).toString(),
};
}
+
+ taskEntry.endTime = new Date().toISOString();
await updateAllClients();
for (const clientId of taskEntry.clients.keys()) {
if (!this.clientRegistry.get(clientId)) continue;
this.disconnect(clientId, task.id);
}
- this.taskRegistry.delete(task.id);
+
+ await prisma.task.create({
+ data: {
+ id: task.id,
+ taskGroup: taskEntry.taskGroup,
+ name: taskEntry.name,
+
+ started: taskEntry.startTime,
+ ended: taskEntry.endTime,
+
+ success: taskEntry.success,
+ progress: taskEntry.progress,
+ log: taskEntry.log,
+
+ acls: taskEntry.acls,
+
+ ...(taskEntry.error ? { error: taskEntry.error } : undefined),
+ },
+ });
+
+ this.taskPool.delete(task.id);
});
}
@@ -122,7 +254,12 @@ class TaskHandler {
peer: PeerImpl,
request: MinimumRequestObject,
) {
- const task = this.taskRegistry.get(taskId);
+ const task =
+ this.taskPool.get(taskId) ??
+ (await prisma.task.findFirst({
+ where: { id: taskId },
+ orderBy: { started: "desc" },
+ }));
if (!task) {
peer.send(
`error/${taskId}/Unknown task/Drop couldn't find the task you're looking for.`,
@@ -132,7 +269,7 @@ class TaskHandler {
const allowed = await aclManager.hasACL(request, task.acls);
if (!allowed) {
- console.warn("user does not have necessary ACLs");
+ // logger.warn("user does not have necessary ACLs");
peer.send(
`error/${taskId}/Unknown task/Drop couldn't find the task you're looking for.`,
);
@@ -140,13 +277,17 @@ class TaskHandler {
}
this.clientRegistry.set(clientId, peer);
- task.clients.set(clientId, true); // Uniquely insert client to avoid sending duplicate traffic
+ if ("clients" in task) {
+ task.clients.set(clientId, true); // Uniquely insert client to avoid sending duplicate traffic
+ }
const catchupMessage: TaskMessage = {
id: taskId,
name: task.name,
success: task.success,
- error: task.error,
+ error: task.error as unknown as
+ | { title: string; description: string }
+ | undefined,
log: task.log,
progress: task.progress,
};
@@ -160,8 +301,8 @@ class TaskHandler {
}
disconnectAll(id: string) {
- for (const taskId of this.taskRegistry.keys()) {
- this.taskRegistry.get(taskId)?.clients.delete(id);
+ for (const taskId of this.taskPool.keys()) {
+ this.taskPool.get(taskId)?.clients.delete(id);
this.sendDisconnectEvent(id, taskId);
}
@@ -169,13 +310,13 @@ class TaskHandler {
}
disconnect(id: string, taskId: string) {
- const task = this.taskRegistry.get(taskId);
+ const task = this.taskPool.get(taskId);
if (!task) return false;
task.clients.delete(id);
this.sendDisconnectEvent(id, taskId);
- const allClientIds = this.taskRegistry
+ const allClientIds = this.taskPool
.values()
.toArray()
.map((e) => e.clients.keys().toArray())
@@ -187,18 +328,126 @@ class TaskHandler {
return true;
}
+
+ runningTasks() {
+ return this.taskPool
+ .entries()
+ .map(([id, value]) => ({ ...value, id, log: undefined }))
+ .toArray();
+ }
+
+ hasTask(id: string) {
+ return this.taskPool.has(id);
+ }
+
+ dailyTasks() {
+ return this.dailyScheduledTasks;
+ }
+
+ weeklyTasks() {
+ return this.weeklyScheduledTasks;
+ }
+
+ async runTaskGroupByName(name: TaskGroup) {
+ const taskConstructor = this.taskCreators.get(name);
+ if (!taskConstructor) {
+ logger.warn(`No task found for group ${name}`);
+ return;
+ }
+ const task = taskConstructor();
+ await this.create(task);
+ return task.id;
+ }
+
+ /**
+ * Runs all daily tasks that are scheduled to run once a day.
+ */
+ async triggerDailyTasks() {
+ for (const taskGroup of this.dailyScheduledTasks) {
+ const mostRecent = await prisma.task.findFirst({
+ where: {
+ taskGroup,
+ },
+ orderBy: {
+ ended: "desc",
+ },
+ });
+ if (mostRecent) {
+ const currentTime = Date.now();
+ const lastRun = mostRecent.ended.getTime();
+ const difference = currentTime - lastRun;
+ if (difference < 1000 * 60 * 60 * 24) {
+ // If it's been less than one day
+ continue; // skip
+ }
+ }
+ await this.runTaskGroupByName(taskGroup);
+ }
+
+ // After running daily tasks, trigger weekly tasks as well
+ await this.triggerWeeklyTasks();
+ }
+
+ private async triggerWeeklyTasks() {
+ for (const taskGroup of this.weeklyScheduledTasks) {
+ const mostRecent = await prisma.task.findFirst({
+ where: {
+ taskGroup,
+ },
+ orderBy: {
+ ended: "desc",
+ },
+ });
+ if (mostRecent) {
+ const currentTime = Date.now();
+ const lastRun = mostRecent.ended.getTime();
+ const difference = currentTime - lastRun;
+ if (difference < 1000 * 60 * 60 * 24 * 7) {
+ // If it's been less than one week
+ continue; // skip
+ }
+ }
+ await this.runTaskGroupByName(taskGroup);
+ }
+ }
}
export type TaskRunContext = {
progress: (progress: number) => void;
- log: (message: string) => void;
+ logger: typeof logger;
};
+export function wrapTaskContext(
+ context: TaskRunContext,
+ options: { min: number; max: number; prefix: string },
+): TaskRunContext {
+ const child = context.logger.child({
+ prefix: options.prefix,
+ });
+
+ return {
+ progress(progress) {
+ if (progress > 100 || progress < 0) {
+ logger.warn("[wrapTaskContext] progress must be between 0 and 100");
+ }
+
+ // I was too tired to figure this out
+ // https://stackoverflow.com/a/929107
+ const oldRange = 100;
+ const newRange = options.max - options.min;
+ const adjustedProgress = (progress * newRange) / oldRange + options.min;
+ return context.progress(adjustedProgress);
+ },
+ logger: child,
+ };
+}
+
export interface Task {
id: string;
+ taskGroup: TaskGroup;
name: string;
run: (context: TaskRunContext) => Promise;
- acls: string[];
+ acls: GlobalACL[];
}
export type TaskMessage = {
@@ -206,14 +455,73 @@ export type TaskMessage = {
name: string;
success: boolean;
progress: number;
- error: undefined | { title: string; description: string };
+ error: null | undefined | { title: string; description: string };
log: string[];
reset?: boolean;
};
export type PeerImpl = {
send: (message: string) => void;
+ close: () => void;
};
+export interface BuildTask {
+ buildId: () => string;
+ taskGroup: TaskGroup;
+ name: string;
+ run: (context: TaskRunContext) => Promise;
+ acls: GlobalACL[];
+}
+
+interface DropTask {
+ taskGroup: TaskGroup;
+ build: () => Task;
+}
+
+export const TaskLog = type({
+ timestamp: "string",
+ message: "string",
+ level: "string",
+});
+
+// /**
+// * Create a log message with a timestamp in the format YYYY-MM-DD HH:mm:ss.SSS UTC
+// * @param message
+// * @returns
+// */
+// function msgWithTimestamp(message: string): string {
+// const now = new Date();
+
+// const pad = (n: number, width = 2) => n.toString().padStart(width, "0");
+
+// const year = now.getUTCFullYear();
+// const month = pad(now.getUTCMonth() + 1);
+// const day = pad(now.getUTCDate());
+
+// const hours = pad(now.getUTCHours());
+// const minutes = pad(now.getUTCMinutes());
+// const seconds = pad(now.getUTCSeconds());
+// const milliseconds = pad(now.getUTCMilliseconds(), 3);
+
+// const log: typeof TaskLog.infer = {
+// timestamp: `${year}-${month}-${day} ${hours}:${minutes}:${seconds}.${milliseconds} UTC`,
+// message,
+// };
+// return JSON.stringify(log);
+// }
+
+export function defineDropTask(buildTask: BuildTask): DropTask {
+ return {
+ taskGroup: buildTask.taskGroup,
+ build: () => ({
+ id: buildTask.buildId(),
+ taskGroup: buildTask.taskGroup,
+ name: buildTask.name,
+ run: buildTask.run,
+ acls: buildTask.acls,
+ }),
+ };
+}
+
export const taskHandler = new TaskHandler();
export default taskHandler;
diff --git a/server/internal/tasks/registry/debug.ts b/server/internal/tasks/registry/debug.ts
new file mode 100644
index 0000000..9cd8a4a
--- /dev/null
+++ b/server/internal/tasks/registry/debug.ts
@@ -0,0 +1,18 @@
+import { defineDropTask } from "..";
+
+export default defineDropTask({
+ buildId: () => `debug:${new Date().toISOString()}`,
+ name: "Debug Task",
+ acls: ["system:maintenance:read"],
+ taskGroup: "debug",
+ async run({ progress, logger }) {
+ const amount = 1000;
+ for (let i = 0; i < amount; i++) {
+ progress((i / amount) * 100);
+ logger.info(`dajksdkajd ${i}`);
+ logger.warn("warning");
+ logger.error("error\nmultiline and stuff\nwoah more lines");
+ await new Promise((r) => setTimeout(r, 1500));
+ }
+ },
+});
diff --git a/server/internal/tasks/registry/invitations.ts b/server/internal/tasks/registry/invitations.ts
new file mode 100644
index 0000000..a247f7b
--- /dev/null
+++ b/server/internal/tasks/registry/invitations.ts
@@ -0,0 +1,25 @@
+import prisma from "~/server/internal/db/database";
+import { defineDropTask } from "..";
+
+export default defineDropTask({
+ buildId: () => `cleanup:invitations:${new Date().toISOString()}`,
+ name: "Cleanup Invitations",
+ acls: ["system:maintenance:read"],
+ taskGroup: "cleanup:invitations",
+ async run({ progress, logger }) {
+ logger.info("Cleaning invitations");
+
+ const now = new Date();
+
+ await prisma.invitation.deleteMany({
+ where: {
+ expires: {
+ lt: now,
+ },
+ },
+ });
+
+ logger.info("Done");
+ progress(100);
+ },
+});
diff --git a/server/tasks/cleanup/objects.ts b/server/internal/tasks/registry/objects.ts
similarity index 62%
rename from server/tasks/cleanup/objects.ts
rename to server/internal/tasks/registry/objects.ts
index 62955dc..63a5e71 100644
--- a/server/tasks/cleanup/objects.ts
+++ b/server/internal/tasks/registry/objects.ts
@@ -1,5 +1,6 @@
import prisma from "~/server/internal/db/database";
import objectHandler from "~/server/internal/objects";
+import { defineDropTask } from "..";
type FieldReferenceMap = {
[modelName: string]: {
@@ -9,29 +10,51 @@ type FieldReferenceMap = {
};
};
-export default defineTask({
- meta: {
- name: "cleanup:objects",
- },
- async run() {
- console.log("[Task cleanup:objects]: Cleaning unreferenced objects");
+export default defineDropTask({
+ buildId: () => `cleanup:objects:${new Date().toISOString()}`,
+ name: "Cleanup Objects",
+ acls: ["system:maintenance:read"],
+ taskGroup: "cleanup:objects",
+ async run({ progress, logger }) {
+ logger.info("Cleaning unreferenced objects");
+ // get all objects
const objects = await objectHandler.listAll();
- console.log(
- `[Task cleanup:objects]: searching for ${objects.length} objects`,
- );
- console.log(objects);
- const results = await findUnreferencedStrings(objects, buildRefMap());
- console.log(
- `[Task cleanup:objects]: found ${results.length} Unreferenced objects`,
- );
- console.log(results);
+ logger.info(`searching for ${objects.length} objects`);
+ progress(30);
- console.log("[Task cleanup:objects]: Done");
- return { result: true };
+ // find unreferenced objects
+ const refMap = buildRefMap();
+ logger.info("Building reference map");
+ logger.info(
+ `Found ${Object.keys(refMap).length} models with reference fields`,
+ );
+ logger.info("Searching for unreferenced objects");
+ const unrefedObjects = await findUnreferencedStrings(objects, refMap);
+ logger.info(`found ${unrefedObjects.length} Unreferenced objects`);
+ // logger.info(unrefedObjects);
+ progress(60);
+
+ // remove objects
+ const deletePromises: Promise[] = [];
+ for (const obj of unrefedObjects) {
+ logger.info(`Deleting object ${obj}`);
+ deletePromises.push(objectHandler.deleteAsSystem(obj));
+ }
+ await Promise.all(deletePromises);
+
+ // Remove any possible leftover metadata
+ await objectHandler.cleanupMetadata(logger);
+
+ logger.info("Done");
+ progress(100);
},
});
+/**
+ * Builds a map of Prisma models and their fields that may contain object IDs
+ * @returns
+ */
function buildRefMap(): FieldReferenceMap {
const tables = Object.keys(prisma).filter(
(v) => !(v.startsWith("$") || v.startsWith("_") || v === "constructor"),
@@ -59,6 +82,12 @@ function buildRefMap(): FieldReferenceMap {
return result;
}
+/**
+ * Searches all models for a given id in their fields
+ * @param id
+ * @param fieldRefMap
+ * @returns
+ */
async function isReferencedInModelFields(
id: string,
fieldRefMap: FieldReferenceMap,
@@ -111,6 +140,12 @@ async function isReferencedInModelFields(
return false;
}
+/**
+ * Takes a list of objects and checks if they are referenced in any model fields
+ * @param objects
+ * @param fieldRefMap
+ * @returns
+ */
async function findUnreferencedStrings(
objects: string[],
fieldRefMap: FieldReferenceMap,
diff --git a/server/internal/tasks/registry/sessions.ts b/server/internal/tasks/registry/sessions.ts
new file mode 100644
index 0000000..6839829
--- /dev/null
+++ b/server/internal/tasks/registry/sessions.ts
@@ -0,0 +1,15 @@
+import sessionHandler from "~/server/internal/session";
+import { defineDropTask } from "..";
+
+export default defineDropTask({
+ buildId: () => `cleanup:sessions:${new Date().toISOString()}`,
+ name: "Cleanup Sessions",
+ acls: ["system:maintenance:read"],
+ taskGroup: "cleanup:sessions",
+ async run({ progress, logger }) {
+ logger.info("Cleaning up sessions");
+ await sessionHandler.cleanupSessions();
+ logger.info("Done");
+ progress(100);
+ },
+});
diff --git a/server/internal/tasks/registry/update.ts b/server/internal/tasks/registry/update.ts
new file mode 100644
index 0000000..452fd19
--- /dev/null
+++ b/server/internal/tasks/registry/update.ts
@@ -0,0 +1,100 @@
+import { type } from "arktype";
+import * as semver from "semver";
+import { defineDropTask } from "..";
+import { systemConfig } from "../../config/sys-conf";
+import notificationSystem from "../../notifications";
+
+const latestRelease = type({
+ url: "string", // api url for specific release
+ html_url: "string", // user facing url
+ id: "number", // release id
+ tag_name: "string", // tag used for release
+ name: "string", // release name
+ draft: "boolean",
+ prerelease: "boolean",
+ created_at: "string",
+ published_at: "string",
+});
+
+export default defineDropTask({
+ buildId: () => `check:update:${new Date().toISOString()}`,
+ name: "Check for Update",
+ acls: ["system:maintenance:read"],
+ taskGroup: "check:update",
+ async run({ progress, logger }) {
+ // TODO: maybe implement some sort of rate limit thing to prevent this from calling github api a bunch in the event of crashloop or whatever?
+ // probably will require custom task scheduler for object cleanup anyway, so something to thing about
+
+ if (!systemConfig.shouldCheckForUpdates()) {
+ logger.info("Update check is disabled by configuration");
+ progress(100);
+ return;
+ }
+
+ logger.info("Checking for update");
+
+ const currVerStr = systemConfig.getDropVersion();
+ const currVer = semver.coerce(currVerStr);
+ if (currVer === null) {
+ const msg = "Drop provided a invalid semver tag";
+ logger.info(msg);
+ throw new Error(msg);
+ }
+ progress(30);
+
+ const response = await fetch(
+ "https://api.github.com/repos/Drop-OSS/drop/releases/latest",
+ );
+ progress(50);
+
+ // if response failed somehow
+ if (!response.ok) {
+ logger.info("Failed to check for update ", {
+ status: response.status,
+ body: response.body,
+ });
+
+ throw new Error(
+ `Failed to check for update: ${response.status} ${response.body}`,
+ );
+ }
+
+ // parse and validate response
+ const resJson = await response.json();
+ const body = latestRelease(resJson);
+ if (body instanceof type.errors) {
+ logger.info(body.summary);
+ logger.info("GitHub Api response" + JSON.stringify(resJson));
+ throw new Error(
+ `GitHub Api response did not match expected schema: ${body.summary}`,
+ );
+ }
+
+ // parse remote version
+ const latestVer = semver.coerce(body.tag_name);
+ if (latestVer === null) {
+ const msg = "Github Api returned invalid semver tag";
+ logger.info(msg);
+ throw new Error(msg);
+ }
+ progress(70);
+
+ // TODO: handle prerelease identifiers https://github.com/npm/node-semver#prerelease-identifiers
+ // check if is newer version
+ if (semver.gt(latestVer, currVer)) {
+ logger.info("Update available");
+ notificationSystem.systemPush({
+ nonce: `drop-update-available-${currVer}-to-${latestVer}`,
+ title: `Update available to v${latestVer}`,
+ description: `A new version of Drop is available v${latestVer}`,
+ actions: [`View|${body.html_url}`],
+ acls: ["system:notifications:read"],
+ });
+ } else {
+ logger.info("no update available");
+ }
+
+ logger.info("Done");
+ progress(100);
+ },
+});
diff --git a/server/internal/utils/handlefileupload.ts b/server/internal/utils/handlefileupload.ts
index e5fe80c..4e36c44 100644
--- a/server/internal/utils/handlefileupload.ts
+++ b/server/internal/utils/handlefileupload.ts
@@ -6,23 +6,21 @@ export async function handleFileUpload(
h3: H3Event,
metadata: { [key: string]: string },
permissions: Array,
-): Promise<
- [string | undefined, { [key: string]: string }, Pull, Dump] | undefined
-> {
+ max = -1,
+): Promise<[string[], { [key: string]: string }, Pull, Dump] | undefined> {
const formData = await readMultipartFormData(h3);
if (!formData) return undefined;
const transactionalHandler = new ObjectTransactionalHandler();
const [add, pull, dump] = transactionalHandler.new(metadata, permissions);
const options: { [key: string]: string } = {};
- let id;
+ const ids = [];
for (const entry of formData) {
if (entry.filename) {
- // Only pick one file
- if (id) continue;
+ if (max > 0 && ids.length >= max) continue;
// Add file to transaction handler so we can void it later if we error out
- id = add(entry.data);
+ ids.push(add(entry.data));
continue;
}
if (!entry.name) continue;
@@ -30,5 +28,5 @@ export async function handleFileUpload(
options[entry.name] = entry.data.toString("utf-8");
}
- return [id, options, pull, dump];
+ return [ids, options, pull, dump];
}
diff --git a/server/internal/utils/parseplatform.ts b/server/internal/utils/parseplatform.ts
index fd69e38..5a00e95 100644
--- a/server/internal/utils/parseplatform.ts
+++ b/server/internal/utils/parseplatform.ts
@@ -1,4 +1,4 @@
-import { Platform } from "~/prisma/client";
+import { Platform } from "~/prisma/client/enums";
export function parsePlatform(platform: string) {
switch (platform.toLowerCase()) {
diff --git a/server/middleware/latency.ts b/server/middleware/latency.ts
new file mode 100644
index 0000000..cfa2508
--- /dev/null
+++ b/server/middleware/latency.ts
@@ -0,0 +1,3 @@
+export default defineEventHandler(async () => {
+ // await new Promise((r) => setTimeout(r, 700));
+});
diff --git a/server/plugins/01.system-init.ts b/server/plugins/01.system-init.ts
index a28edbe..edffdcc 100644
--- a/server/plugins/01.system-init.ts
+++ b/server/plugins/01.system-init.ts
@@ -3,7 +3,7 @@ import prisma from "~/server/internal/db/database";
export default defineNitroPlugin(async (_nitro) => {
// Ensure system user exists
// The system user owns any user-based code
- // that we want to re-use for the app
+ // that we want to reuse for the app
// e.g. notifications
await prisma.user.upsert({
where: {
diff --git a/server/plugins/02.setup-admin.ts b/server/plugins/02.setup-admin.ts
index 1d4a128..25a8704 100644
--- a/server/plugins/02.setup-admin.ts
+++ b/server/plugins/02.setup-admin.ts
@@ -1,6 +1,18 @@
+import { APITokenMode } from "~/prisma/client/enums";
import prisma from "~/server/internal/db/database";
+import { systemConfig } from "../internal/config/sys-conf";
+import { logger } from "../internal/logging";
export default defineNitroPlugin(async (_nitro) => {
+ await prisma.aPIToken.deleteMany({
+ where: {
+ acls: {
+ hasSome: ["setup"],
+ },
+ mode: APITokenMode.System,
+ },
+ });
+
const userCount = await prisma.user.count({
where: { id: { not: "system" } },
});
@@ -10,18 +22,14 @@ export default defineNitroPlugin(async (_nitro) => {
// but has not been configured
// so it should be in-place
- // Create admin invitation
- await prisma.invitation.upsert({
- where: {
- id: "admin",
- },
- create: {
- id: "admin",
- isAdmin: true,
- expires: new Date("4096-01-01"),
- },
- update: {
- isAdmin: true,
+ const token = await prisma.aPIToken.create({
+ data: {
+ name: "Setup Wizard",
+ mode: APITokenMode.System,
+ acls: ["setup"],
},
});
+
+ const setupUrl = `${systemConfig.getExternalUrl()}/setup?token=${token.token}`;
+ logger.info(`Open ${setupUrl} in a browser to get started with Drop.`);
});
diff --git a/server/plugins/03.metadata-init.ts b/server/plugins/03.metadata-init.ts
index aa47bf3..c9f2616 100644
--- a/server/plugins/03.metadata-init.ts
+++ b/server/plugins/03.metadata-init.ts
@@ -5,6 +5,7 @@ import { GiantBombProvider } from "../internal/metadata/giantbomb";
import { IGDBProvider } from "../internal/metadata/igdb";
import { ManualMetadataProvider } from "../internal/metadata/manual";
import { PCGamingWikiProvider } from "../internal/metadata/pcgamingwiki";
+import { logger } from "~/server/internal/logging";
export default defineNitroPlugin(async (_nitro) => {
const metadataProviders = [
@@ -21,9 +22,9 @@ export default defineNitroPlugin(async (_nitro) => {
const id = prov.source();
providers.set(id, prov);
- console.log(`enabled metadata provider: ${prov.name()}`);
+ logger.info(`enabled metadata provider: ${prov.name()}`);
} catch (e) {
- console.warn(`skipping metadata provider setup: ${e}`);
+ logger.warn(`skipping metadata provider setup: ${e}`);
}
}
@@ -35,7 +36,7 @@ export default defineNitroPlugin(async (_nitro) => {
const priority = max * 2 - index; // Offset by the length --- (max - index) + max
const provider = providers.get(providerId);
if (!provider) {
- console.warn(`failed to add existing metadata provider: ${providerId}`);
+ logger.warn(`failed to add existing metadata provider: ${providerId}`);
continue;
}
metadataHandler.addProvider(provider, priority);
diff --git a/server/plugins/04.auth-init.ts b/server/plugins/04.auth-init.ts
index 1c0bc24..a2f3e5b 100644
--- a/server/plugins/04.auth-init.ts
+++ b/server/plugins/04.auth-init.ts
@@ -1,39 +1,5 @@
-import { AuthMec } from "~/prisma/client";
-import { OIDCManager } from "../internal/oidc";
-
-export const enabledAuthManagers: {
- [AuthMec.Simple]: boolean;
- [AuthMec.OpenID]: OIDCManager | undefined;
-} = {
- [AuthMec.Simple]: false,
- [AuthMec.OpenID]: undefined,
-};
-
-const initFunctions: {
- [K in keyof typeof enabledAuthManagers]: () => Promise;
-} = {
- [AuthMec.OpenID]: OIDCManager.prototype.create,
- [AuthMec.Simple]: async () => {
- const disabled = process.env.DISABLE_SIMPLE_AUTH as string | undefined;
- return !disabled;
- },
-};
+import authManager from "~/server/internal/auth";
export default defineNitroPlugin(async () => {
- for (const [key, init] of Object.entries(initFunctions)) {
- try {
- const object = await init();
- if (!object) break;
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
- (enabledAuthManagers as any)[key] = object;
- console.log(`enabled auth: ${key}`);
- } catch (e) {
- console.warn(e);
- }
- }
-
- // Add every other auth mechanism here, and fall back to simple if none of them are enabled
- if (!enabledAuthManagers[AuthMec.OpenID]) {
- enabledAuthManagers[AuthMec.Simple] = true;
- }
+ await authManager.init();
});
diff --git a/server/plugins/05.library-init.ts b/server/plugins/05.library-init.ts
new file mode 100644
index 0000000..9891b51
--- /dev/null
+++ b/server/plugins/05.library-init.ts
@@ -0,0 +1,90 @@
+import { LibraryBackend } from "~/prisma/client/enums";
+import prisma from "../internal/db/database";
+import type { JsonValue } from "@prisma/client/runtime/library";
+import type { LibraryProvider } from "../internal/library/provider";
+import type { FilesystemProviderConfig } from "../internal/library/providers/filesystem";
+import { FilesystemProvider } from "../internal/library/providers/filesystem";
+import libraryManager from "../internal/library";
+import path from "path";
+import { FlatFilesystemProvider } from "../internal/library/providers/flat";
+import { logger } from "~/server/internal/logging";
+
+export const libraryConstructors: {
+ [key in LibraryBackend]: (
+ value: JsonValue,
+ id: string,
+ ) => LibraryProvider;
+} = {
+ Filesystem: function (
+ value: JsonValue,
+ id: string,
+ ): LibraryProvider {
+ return new FilesystemProvider(value, id);
+ },
+ FlatFilesystem: function (
+ value: JsonValue,
+ id: string,
+ ): LibraryProvider {
+ return new FlatFilesystemProvider(value, id);
+ },
+};
+
+export default defineNitroPlugin(async () => {
+ let successes = 0;
+ const libraries = await prisma.library.findMany({});
+
+ // Add migration handler
+ const legacyPath = process.env.LIBRARY;
+ if (legacyPath && libraries.length == 0) {
+ const options: typeof FilesystemProviderConfig.infer = {
+ baseDir: path.resolve(legacyPath),
+ };
+
+ const library = await prisma.library.create({
+ data: {
+ name: "Auto-created",
+ backend: LibraryBackend.Filesystem,
+ options,
+ },
+ });
+
+ libraries.push(library);
+
+ // Update all existing games
+ await prisma.game.updateMany({
+ where: {
+ libraryId: null,
+ },
+ data: {
+ libraryId: library.id,
+ },
+ });
+ }
+
+ // Delete all games that don't have a library provider after the legacy handler
+ // (leftover from a bug)
+ await prisma.game.deleteMany({
+ where: {
+ libraryId: null,
+ },
+ });
+
+ for (const library of libraries) {
+ const constructor = libraryConstructors[library.backend];
+ try {
+ const provider = constructor(library.options, library.id);
+ libraryManager.addLibrary(provider);
+ successes++;
+ } catch (e) {
+ logger.warn(
+ `Failed to create library (${library.id}) of type ${library.backend}:\n ${e}`,
+ );
+ }
+ }
+
+ if (successes == 0) {
+ logger.warn(
+ "No library was successfully initialised. Please check for errors. If you have just set up an instance, this is normal.",
+ );
+ }
+});
diff --git a/server/plugins/redirect.ts b/server/plugins/redirect.ts
deleted file mode 100644
index 8218a0c..0000000
--- a/server/plugins/redirect.ts
+++ /dev/null
@@ -1,27 +0,0 @@
-import { H3Error } from "h3";
-import sessionHandler from "../internal/session";
-
-export default defineNitroPlugin((nitro) => {
- nitro.hooks.hook("error", async (error, { event }) => {
- if (!event) return;
-
- // Don't handle for API routes
- if (event.path.startsWith("/api")) return;
- if (event.path.startsWith("/auth")) return;
-
- // Make sure it's a web error
- if (!(error instanceof H3Error)) return;
-
- switch (error.statusCode) {
- case 401:
- case 403: {
- const user = await sessionHandler.getSession(event);
- if (user) break;
- return sendRedirect(
- event,
- `/auth/signin?redirect=${encodeURIComponent(event.path)}`,
- );
- }
- }
- });
-});
diff --git a/server/plugins/tasks.ts b/server/plugins/tasks.ts
index 3c8dde4..3a31fd5 100644
--- a/server/plugins/tasks.ts
+++ b/server/plugins/tasks.ts
@@ -1,7 +1,4 @@
export default defineNitroPlugin(async (_nitro) => {
// all tasks we should run on server boot
- await Promise.all([
- runTask("cleanup:invitations"),
- runTask("cleanup:sessions"),
- ]);
+ await runTask("dailyTasks");
});
diff --git a/server/routes/auth/callback/oidc.get.ts b/server/routes/auth/callback/oidc.get.ts
index e2a6854..5aba8fd 100644
--- a/server/routes/auth/callback/oidc.get.ts
+++ b/server/routes/auth/callback/oidc.get.ts
@@ -1,7 +1,16 @@
import sessionHandler from "~/server/internal/session";
-import { enabledAuthManagers } from "~/server/plugins/04.auth-init";
+import authManager from "~/server/internal/auth";
+
+defineRouteMeta({
+ openAPI: {
+ tags: ["Auth"],
+ description: "OIDC Signin callback",
+ parameters: [],
+ },
+});
export default defineEventHandler(async (h3) => {
+ const enabledAuthManagers = authManager.getAuthProviders();
if (!enabledAuthManagers.OpenID) return sendRedirect(h3, "/auth/signin");
const manager = enabledAuthManagers.OpenID;
@@ -21,15 +30,19 @@ export default defineEventHandler(async (h3) => {
statusMessage: "No state in query params.",
});
- const user = await manager.authorize(code, state);
+ const result = await manager.authorize(code, state);
- if (typeof user === "string")
+ if (typeof result === "string")
throw createError({
statusCode: 403,
- statusMessage: `Failed to sign in: "${user}". Please try again.`,
+ statusMessage: `Failed to sign in: "${result}". Please try again.`,
});
- await sessionHandler.signin(h3, user.id, true);
+ await sessionHandler.signin(h3, result.user.id, true);
+
+ if (result.options.redirect) {
+ return sendRedirect(h3, result.options.redirect);
+ }
return sendRedirect(h3, "/");
});
diff --git a/server/routes/auth/oidc.get.ts b/server/routes/auth/oidc.get.ts
index be3cf94..8ba7c74 100644
--- a/server/routes/auth/oidc.get.ts
+++ b/server/routes/auth/oidc.get.ts
@@ -1,10 +1,25 @@
-import { enabledAuthManagers } from "~/server/plugins/04.auth-init";
+import authManager from "~/server/internal/auth";
+
+defineRouteMeta({
+ openAPI: {
+ tags: ["Auth"],
+ description: "OIDC Signin redirect",
+ parameters: [],
+ },
+});
export default defineEventHandler((h3) => {
- if (!enabledAuthManagers.OpenID) return sendRedirect(h3, "/auth/signin");
+ const redirect = getQuery(h3).redirect?.toString();
+
+ const enabledAuthManagers = authManager.getAuthProviders();
+ if (!enabledAuthManagers.OpenID)
+ return sendRedirect(
+ h3,
+ `/auth/signin${redirect ? `?redirect=${encodeURIComponent(redirect)}` : ""}`,
+ );
const manager = enabledAuthManagers.OpenID;
- const { redirectUrl } = manager.generateAuthSession();
+ const { redirectUrl } = manager.generateAuthSession({ redirect });
return sendRedirect(h3, redirectUrl);
});
diff --git a/server/routes/auth/signout.get.ts b/server/routes/auth/signout.get.ts
index ebeb6f7..3f0b277 100644
--- a/server/routes/auth/signout.get.ts
+++ b/server/routes/auth/signout.get.ts
@@ -1,5 +1,13 @@
import sessionHandler from "../../internal/session";
+defineRouteMeta({
+ openAPI: {
+ tags: ["Auth"],
+ description: "Tells server to deauthorize this session",
+ parameters: [],
+ },
+});
+
export default defineEventHandler(async (h3) => {
await sessionHandler.signout(h3);
diff --git a/server/tasks/cleanup/invitations.ts b/server/tasks/cleanup/invitations.ts
deleted file mode 100644
index b2afc45..0000000
--- a/server/tasks/cleanup/invitations.ts
+++ /dev/null
@@ -1,23 +0,0 @@
-import prisma from "~/server/internal/db/database";
-
-export default defineTask({
- meta: {
- name: "cleanup:invitations",
- },
- async run() {
- console.log("[Task cleanup:invitations]: Cleaning invitations");
-
- const now = new Date();
-
- await prisma.invitation.deleteMany({
- where: {
- expires: {
- lt: now,
- },
- },
- });
-
- console.log("[Task cleanup:invitations]: Done");
- return { result: true };
- },
-});
diff --git a/server/tasks/cleanup/sessions.ts b/server/tasks/cleanup/sessions.ts
deleted file mode 100644
index b613a72..0000000
--- a/server/tasks/cleanup/sessions.ts
+++ /dev/null
@@ -1,13 +0,0 @@
-import sessionHandler from "~/server/internal/session";
-
-export default defineTask({
- meta: {
- name: "cleanup:sessions",
- },
- async run() {
- console.log("[Task cleanup:sessions]: Cleaning up sessions");
- await sessionHandler.cleanupSessions();
- console.log("[Task cleanup:sessions]: Done");
- return { result: true };
- },
-});
diff --git a/server/tasks/dailyTasks.ts b/server/tasks/dailyTasks.ts
new file mode 100644
index 0000000..e36735c
--- /dev/null
+++ b/server/tasks/dailyTasks.ts
@@ -0,0 +1,12 @@
+import taskHandler from "~/server/internal/tasks";
+
+export default defineTask({
+ meta: {
+ name: "dailyTasks",
+ },
+ async run() {
+ await taskHandler.triggerDailyTasks();
+
+ return {};
+ },
+});
diff --git a/server/tasks/downloadCleanup.ts b/server/tasks/downloadCleanup.ts
new file mode 100644
index 0000000..7509531
--- /dev/null
+++ b/server/tasks/downloadCleanup.ts
@@ -0,0 +1,11 @@
+import contextManager from "../internal/downloads/coordinator";
+
+export default defineTask({
+ meta: {
+ name: "downloadCleanup",
+ },
+ async run() {
+ await contextManager.cleanup();
+ return { result: true };
+ },
+});
diff --git a/utils/parseTaskLog.ts b/utils/parseTaskLog.ts
new file mode 100644
index 0000000..93f1e21
--- /dev/null
+++ b/utils/parseTaskLog.ts
@@ -0,0 +1,31 @@
+import type { TaskLog } from "~/server/internal/tasks";
+
+const labelNumberMap = {
+ 100: "silent",
+ 60: "fatal",
+ 50: "error",
+ 40: "warn",
+ 30: "info",
+ 20: "debug",
+ 10: "trace",
+ 0: "off",
+};
+
+export function parseTaskLog(
+ logStr?: string | undefined,
+): typeof TaskLog.infer {
+ if (!logStr) return { message: "", timestamp: "", level: "" };
+ const log = JSON.parse(logStr);
+
+ if (typeof log.level === "number") {
+ log.level = labelNumberMap[
+ log.level as keyof typeof labelNumberMap
+ ] as string;
+ }
+
+ return {
+ message: log.msg,
+ timestamp: log.time,
+ level: log.level,
+ };
+}
diff --git a/yarn.lock b/yarn.lock
index 68fcd2c..5878256 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -2,7 +2,7 @@
# yarn lockfile v1
-"@ampproject/remapping@^2.2.0":
+"@ampproject/remapping@^2.2.0", "@ampproject/remapping@^2.3.0":
version "2.3.0"
resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.3.0.tgz#ed441b6fa600072520ce18b43d2c8cc8caecc7f4"
integrity sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==
@@ -10,257 +10,274 @@
"@jridgewell/gen-mapping" "^0.3.5"
"@jridgewell/trace-mapping" "^0.3.24"
-"@antfu/install-pkg@^1.0.0":
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/@antfu/install-pkg/-/install-pkg-1.0.0.tgz#2912a150fc8b35ec912f583f90074ee98f64d66a"
- integrity sha512-xvX6P/lo1B3ej0OsaErAjqgFYzYVcJpamjLAFLYh9vRJngBrMoUG7aVnrGTeqM7yxbyTD5p3F2+0/QUEh8Vzhw==
+"@antfu/install-pkg@^1.1.0":
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/@antfu/install-pkg/-/install-pkg-1.1.0.tgz#78fa036be1a6081b5a77a5cf59f50c7752b6ba26"
+ integrity sha512-MGQsmw10ZyI+EJo45CdSER4zEb+p31LpDAFp2Z3gkSd1yqVZGi0Ebx++YTEMonJy4oChEMLsxZ64j8FH6sSqtQ==
dependencies:
- package-manager-detector "^0.2.8"
- tinyexec "^0.3.2"
+ package-manager-detector "^1.3.0"
+ tinyexec "^1.0.1"
-"@apidevtools/json-schema-ref-parser@^11.7.0":
- version "11.9.3"
- resolved "https://registry.yarnpkg.com/@apidevtools/json-schema-ref-parser/-/json-schema-ref-parser-11.9.3.tgz#0e0c9061fc41cf03737d499a4e6a8299fdd2bfa7"
- integrity sha512-60vepv88RwcJtSHrD6MjIL6Ta3SOYbgfnkHb+ppAVK+o9mXprRtulx7VlRl3lN3bbvysAfCS7WMVfhUYemB0IQ==
+"@apidevtools/json-schema-ref-parser@^14.1.1":
+ version "14.1.1"
+ resolved "https://registry.yarnpkg.com/@apidevtools/json-schema-ref-parser/-/json-schema-ref-parser-14.1.1.tgz#0bae59809b7848c7a89dc6bb2f3bb980b7c290b1"
+ integrity sha512-uGF1YGOzzD50L7HLNWclXmsEhQflw8/zZHIz0/AzkJrKL5r9PceUipZxR/cp/8veTk4TVfdDJLyIwXLjaP5ePg==
dependencies:
- "@jsdevtools/ono" "^7.1.3"
"@types/json-schema" "^7.0.15"
js-yaml "^4.1.0"
-"@ark/schema@0.45.5":
- version "0.45.5"
- resolved "https://registry.yarnpkg.com/@ark/schema/-/schema-0.45.5.tgz#77374cae18e86e169492e8a4c9747148bfb13596"
- integrity sha512-RW25FuQRcn4Mc33auOkEL1CLuyj86LmI5YGeuhYYrxEQqK23D99m5T+MGBuOSAbECBtQ8VnI4BaC5Hbb7Ly6tQ==
+"@ark/schema@0.46.0":
+ version "0.46.0"
+ resolved "https://registry.yarnpkg.com/@ark/schema/-/schema-0.46.0.tgz#81a1a0dc1ff0f2faa098cba05de505a174bdc64e"
+ integrity sha512-c2UQdKgP2eqqDArfBqQIJppxJHvNNXuQPeuSPlDML4rjw+f1cu0qAlzOG4b8ujgm9ctIDWwhpyw6gjG5ledIVQ==
dependencies:
- "@ark/util" "0.45.5"
+ "@ark/util" "0.46.0"
-"@ark/util@0.45.5":
- version "0.45.5"
- resolved "https://registry.yarnpkg.com/@ark/util/-/util-0.45.5.tgz#7742fa3973bfeea253442a44b51a0ea492c43e51"
- integrity sha512-BbuDOKJJYZ2dzZDNhBavkhgGD2hv4/idEhXpEPA5weOlE9/kU7XwAvEWn74tCuySHrD7peDqe2Ct/EDUlM40qg==
+"@ark/util@0.46.0":
+ version "0.46.0"
+ resolved "https://registry.yarnpkg.com/@ark/util/-/util-0.46.0.tgz#aee240bdaf413793e5ca4c4e8e3707aa965f4be3"
+ integrity sha512-JPy/NGWn/lvf1WmGCPw2VGpBg5utZraE84I7wli18EDF3p3zc/e9WolT35tINeZO3l7C77SjqRJeAUoT0CvMRg==
-"@babel/code-frame@^7.26.2":
- version "7.26.2"
- resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.26.2.tgz#4b5fab97d33338eff916235055f0ebc21e573a85"
- integrity sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==
+"@babel/code-frame@^7.26.2", "@babel/code-frame@^7.27.1":
+ version "7.27.1"
+ resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.27.1.tgz#200f715e66d52a23b221a9435534a91cc13ad5be"
+ integrity sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==
dependencies:
- "@babel/helper-validator-identifier" "^7.25.9"
+ "@babel/helper-validator-identifier" "^7.27.1"
js-tokens "^4.0.0"
- picocolors "^1.0.0"
+ picocolors "^1.1.1"
-"@babel/compat-data@^7.26.8":
- version "7.26.8"
- resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.26.8.tgz#821c1d35641c355284d4a870b8a4a7b0c141e367"
- integrity sha512-oH5UPLMWR3L2wEFLnFJ1TZXqHufiTKAiLfqw5zkhS4dKXLJ10yVztfil/twG8EDTA4F/tvVNw9nOl4ZMslB8rQ==
+"@babel/compat-data@^7.27.2":
+ version "7.28.0"
+ resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.28.0.tgz#9fc6fd58c2a6a15243cd13983224968392070790"
+ integrity sha512-60X7qkglvrap8mn1lh2ebxXdZYtUcpd7gsmy9kLaBJ4i/WdY8PqTSdxyA8qraikqKQK5C1KRBKXqznrVapyNaw==
-"@babel/core@^7.25.2", "@babel/core@^7.26.7":
- version "7.26.10"
- resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.26.10.tgz#5c876f83c8c4dcb233ee4b670c0606f2ac3000f9"
- integrity sha512-vMqyb7XCDMPvJFFOaT9kxtiRh42GwlZEg1/uIgtZshS5a/8OaduUfCi7kynKgc3Tw/6Uo2D+db9qBttghhmxwQ==
+"@babel/core@^7.25.2", "@babel/core@^7.27.1":
+ version "7.28.0"
+ resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.28.0.tgz#55dad808d5bf3445a108eefc88ea3fdf034749a4"
+ integrity sha512-UlLAnTPrFdNGoFtbSXwcGFQBtQZJCNjaN6hQNP3UPvuNXT1i82N26KL3dZeIpNalWywr9IuQuncaAfUaS1g6sQ==
dependencies:
"@ampproject/remapping" "^2.2.0"
- "@babel/code-frame" "^7.26.2"
- "@babel/generator" "^7.26.10"
- "@babel/helper-compilation-targets" "^7.26.5"
- "@babel/helper-module-transforms" "^7.26.0"
- "@babel/helpers" "^7.26.10"
- "@babel/parser" "^7.26.10"
- "@babel/template" "^7.26.9"
- "@babel/traverse" "^7.26.10"
- "@babel/types" "^7.26.10"
+ "@babel/code-frame" "^7.27.1"
+ "@babel/generator" "^7.28.0"
+ "@babel/helper-compilation-targets" "^7.27.2"
+ "@babel/helper-module-transforms" "^7.27.3"
+ "@babel/helpers" "^7.27.6"
+ "@babel/parser" "^7.28.0"
+ "@babel/template" "^7.27.2"
+ "@babel/traverse" "^7.28.0"
+ "@babel/types" "^7.28.0"
convert-source-map "^2.0.0"
debug "^4.1.0"
gensync "^1.0.0-beta.2"
json5 "^2.2.3"
semver "^6.3.1"
-"@babel/generator@^7.25.0", "@babel/generator@^7.26.10", "@babel/generator@^7.27.0":
- version "7.27.0"
- resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.27.0.tgz#764382b5392e5b9aff93cadb190d0745866cbc2c"
- integrity sha512-VybsKvpiN1gU1sdMZIp7FcqphVVKEwcuj02x73uvcHE0PTihx1nlBcowYWhDwjpoAXRv43+gDzyggGnn1XZhVw==
+"@babel/generator@^7.25.0", "@babel/generator@^7.28.0":
+ version "7.28.0"
+ resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.28.0.tgz#9cc2f7bd6eb054d77dc66c2664148a0c5118acd2"
+ integrity sha512-lJjzvrbEeWrhB4P3QBsH7tey117PjLZnDbLiQEKjQ/fNJTjuq4HSqgFA+UNSwZT8D7dxxbnuSBMsa1lrWzKlQg==
dependencies:
- "@babel/parser" "^7.27.0"
- "@babel/types" "^7.27.0"
- "@jridgewell/gen-mapping" "^0.3.5"
- "@jridgewell/trace-mapping" "^0.3.25"
+ "@babel/parser" "^7.28.0"
+ "@babel/types" "^7.28.0"
+ "@jridgewell/gen-mapping" "^0.3.12"
+ "@jridgewell/trace-mapping" "^0.3.28"
jsesc "^3.0.2"
-"@babel/helper-annotate-as-pure@^7.25.9":
- version "7.25.9"
- resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.25.9.tgz#d8eac4d2dc0d7b6e11fa6e535332e0d3184f06b4"
- integrity sha512-gv7320KBUFJz1RnylIg5WWYPRXKZ884AGkYpgpWW02TH66Dl+HaC1t1CKd0z3R4b6hdYEcmrNZHUmfCP+1u3/g==
+"@babel/helper-annotate-as-pure@^7.27.1", "@babel/helper-annotate-as-pure@^7.27.3":
+ version "7.27.3"
+ resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.27.3.tgz#f31fd86b915fc4daf1f3ac6976c59be7084ed9c5"
+ integrity sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==
dependencies:
- "@babel/types" "^7.25.9"
+ "@babel/types" "^7.27.3"
-"@babel/helper-compilation-targets@^7.26.5":
- version "7.27.0"
- resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.0.tgz#de0c753b1cd1d9ab55d473c5a5cf7170f0a81880"
- integrity sha512-LVk7fbXml0H2xH34dFzKQ7TDZ2G4/rVTOrq9V+icbbadjbVxxeFeDsNHv2SrZeWoA+6ZiTyWYWtScEIW07EAcA==
+"@babel/helper-compilation-targets@^7.27.2":
+ version "7.27.2"
+ resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz#46a0f6efab808d51d29ce96858dd10ce8732733d"
+ integrity sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==
dependencies:
- "@babel/compat-data" "^7.26.8"
- "@babel/helper-validator-option" "^7.25.9"
+ "@babel/compat-data" "^7.27.2"
+ "@babel/helper-validator-option" "^7.27.1"
browserslist "^4.24.0"
lru-cache "^5.1.1"
semver "^6.3.1"
-"@babel/helper-create-class-features-plugin@^7.27.0":
- version "7.27.0"
- resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.27.0.tgz#518fad6a307c6a96f44af14912b2c20abe9bfc30"
- integrity sha512-vSGCvMecvFCd/BdpGlhpXYNhhC4ccxyvQWpbGL4CWbvfEoLFWUZuSuf7s9Aw70flgQF+6vptvgK2IfOnKlRmBg==
+"@babel/helper-create-class-features-plugin@^7.27.1":
+ version "7.27.1"
+ resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.27.1.tgz#5bee4262a6ea5ddc852d0806199eb17ca3de9281"
+ integrity sha512-QwGAmuvM17btKU5VqXfb+Giw4JcN0hjuufz3DYnpeVDvZLAObloM77bhMXiqry3Iio+Ai4phVRDwl6WU10+r5A==
dependencies:
- "@babel/helper-annotate-as-pure" "^7.25.9"
- "@babel/helper-member-expression-to-functions" "^7.25.9"
- "@babel/helper-optimise-call-expression" "^7.25.9"
- "@babel/helper-replace-supers" "^7.26.5"
- "@babel/helper-skip-transparent-expression-wrappers" "^7.25.9"
- "@babel/traverse" "^7.27.0"
+ "@babel/helper-annotate-as-pure" "^7.27.1"
+ "@babel/helper-member-expression-to-functions" "^7.27.1"
+ "@babel/helper-optimise-call-expression" "^7.27.1"
+ "@babel/helper-replace-supers" "^7.27.1"
+ "@babel/helper-skip-transparent-expression-wrappers" "^7.27.1"
+ "@babel/traverse" "^7.27.1"
semver "^6.3.1"
-"@babel/helper-member-expression-to-functions@^7.25.9":
- version "7.25.9"
- resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.25.9.tgz#9dfffe46f727005a5ea29051ac835fb735e4c1a3"
- integrity sha512-wbfdZ9w5vk0C0oyHqAJbc62+vet5prjj01jjJ8sKn3j9h3MQQlflEdXYvuqRWjHnM12coDEqiC1IRCi0U/EKwQ==
+"@babel/helper-globals@^7.28.0":
+ version "7.28.0"
+ resolved "https://registry.yarnpkg.com/@babel/helper-globals/-/helper-globals-7.28.0.tgz#b9430df2aa4e17bc28665eadeae8aa1d985e6674"
+ integrity sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==
+
+"@babel/helper-member-expression-to-functions@^7.27.1":
+ version "7.27.1"
+ resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.27.1.tgz#ea1211276be93e798ce19037da6f06fbb994fa44"
+ integrity sha512-E5chM8eWjTp/aNoVpcbfM7mLxu9XGLWYise2eBKGQomAk/Mb4XoxyqXTZbuTohbsl8EKqdlMhnDI2CCLfcs9wA==
dependencies:
- "@babel/traverse" "^7.25.9"
- "@babel/types" "^7.25.9"
+ "@babel/traverse" "^7.27.1"
+ "@babel/types" "^7.27.1"
-"@babel/helper-module-imports@^7.25.9":
- version "7.25.9"
- resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.25.9.tgz#e7f8d20602ebdbf9ebbea0a0751fb0f2a4141715"
- integrity sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==
+"@babel/helper-module-imports@^7.25.9", "@babel/helper-module-imports@^7.27.1":
+ version "7.27.1"
+ resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz#7ef769a323e2655e126673bb6d2d6913bbead204"
+ integrity sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==
dependencies:
- "@babel/traverse" "^7.25.9"
- "@babel/types" "^7.25.9"
+ "@babel/traverse" "^7.27.1"
+ "@babel/types" "^7.27.1"
-"@babel/helper-module-transforms@^7.26.0":
- version "7.26.0"
- resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.26.0.tgz#8ce54ec9d592695e58d84cd884b7b5c6a2fdeeae"
- integrity sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==
+"@babel/helper-module-transforms@^7.27.3":
+ version "7.27.3"
+ resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.27.3.tgz#db0bbcfba5802f9ef7870705a7ef8788508ede02"
+ integrity sha512-dSOvYwvyLsWBeIRyOeHXp5vPj5l1I011r52FM1+r1jCERv+aFXYk4whgQccYEGYxK2H3ZAIA8nuPkQ0HaUo3qg==
dependencies:
- "@babel/helper-module-imports" "^7.25.9"
- "@babel/helper-validator-identifier" "^7.25.9"
- "@babel/traverse" "^7.25.9"
+ "@babel/helper-module-imports" "^7.27.1"
+ "@babel/helper-validator-identifier" "^7.27.1"
+ "@babel/traverse" "^7.27.3"
-"@babel/helper-optimise-call-expression@^7.25.9":
- version "7.25.9"
- resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.25.9.tgz#3324ae50bae7e2ab3c33f60c9a877b6a0146b54e"
- integrity sha512-FIpuNaz5ow8VyrYcnXQTDRGvV6tTjkNtCK/RYNDXGSLlUD6cBuQTSw43CShGxjvfBTfcUA/r6UhUCbtYqkhcuQ==
+"@babel/helper-optimise-call-expression@^7.27.1":
+ version "7.27.1"
+ resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.27.1.tgz#c65221b61a643f3e62705e5dd2b5f115e35f9200"
+ integrity sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw==
dependencies:
- "@babel/types" "^7.25.9"
+ "@babel/types" "^7.27.1"
-"@babel/helper-plugin-utils@^7.25.9", "@babel/helper-plugin-utils@^7.26.5":
- version "7.26.5"
- resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.26.5.tgz#18580d00c9934117ad719392c4f6585c9333cc35"
- integrity sha512-RS+jZcRdZdRFzMyr+wcsaqOmld1/EqTghfaBGQQd/WnRdzdlvSZ//kF7U8VQTxf1ynZ4cjUcYgjVGx13ewNPMg==
+"@babel/helper-plugin-utils@^7.26.5", "@babel/helper-plugin-utils@^7.27.1":
+ version "7.27.1"
+ resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz#ddb2f876534ff8013e6c2b299bf4d39b3c51d44c"
+ integrity sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==
-"@babel/helper-replace-supers@^7.26.5":
- version "7.26.5"
- resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.26.5.tgz#6cb04e82ae291dae8e72335dfe438b0725f14c8d"
- integrity sha512-bJ6iIVdYX1YooY2X7w1q6VITt+LnUILtNk7zT78ykuwStx8BauCzxvFqFaHjOpW1bVnSUM1PN1f0p5P21wHxvg==
+"@babel/helper-replace-supers@^7.27.1":
+ version "7.27.1"
+ resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.27.1.tgz#b1ed2d634ce3bdb730e4b52de30f8cccfd692bc0"
+ integrity sha512-7EHz6qDZc8RYS5ElPoShMheWvEgERonFCs7IAonWLLUTXW59DP14bCZt89/GKyreYn8g3S83m21FelHKbeDCKA==
dependencies:
- "@babel/helper-member-expression-to-functions" "^7.25.9"
- "@babel/helper-optimise-call-expression" "^7.25.9"
- "@babel/traverse" "^7.26.5"
+ "@babel/helper-member-expression-to-functions" "^7.27.1"
+ "@babel/helper-optimise-call-expression" "^7.27.1"
+ "@babel/traverse" "^7.27.1"
-"@babel/helper-skip-transparent-expression-wrappers@^7.25.9":
- version "7.25.9"
- resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.25.9.tgz#0b2e1b62d560d6b1954893fd2b705dc17c91f0c9"
- integrity sha512-K4Du3BFa3gvyhzgPcntrkDgZzQaq6uozzcpGbOO1OEJaI+EJdqWIMTLgFgQf6lrfiDFo5FU+BxKepI9RmZqahA==
+"@babel/helper-skip-transparent-expression-wrappers@^7.27.1":
+ version "7.27.1"
+ resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.27.1.tgz#62bb91b3abba8c7f1fec0252d9dbea11b3ee7a56"
+ integrity sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg==
dependencies:
- "@babel/traverse" "^7.25.9"
- "@babel/types" "^7.25.9"
+ "@babel/traverse" "^7.27.1"
+ "@babel/types" "^7.27.1"
-"@babel/helper-string-parser@^7.25.9":
- version "7.25.9"
- resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz#1aabb72ee72ed35789b4bbcad3ca2862ce614e8c"
- integrity sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==
+"@babel/helper-string-parser@^7.27.1":
+ version "7.27.1"
+ resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz#54da796097ab19ce67ed9f88b47bb2ec49367687"
+ integrity sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==
-"@babel/helper-validator-identifier@^7.25.9":
- version "7.25.9"
- resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz#24b64e2c3ec7cd3b3c547729b8d16871f22cbdc7"
- integrity sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==
+"@babel/helper-validator-identifier@^7.27.1":
+ version "7.27.1"
+ resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz#a7054dcc145a967dd4dc8fee845a57c1316c9df8"
+ integrity sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==
-"@babel/helper-validator-option@^7.25.9":
- version "7.25.9"
- resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.25.9.tgz#86e45bd8a49ab7e03f276577f96179653d41da72"
- integrity sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==
+"@babel/helper-validator-option@^7.27.1":
+ version "7.27.1"
+ resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz#fa52f5b1e7db1ab049445b421c4471303897702f"
+ integrity sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==
-"@babel/helpers@^7.26.10":
- version "7.27.0"
- resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.27.0.tgz#53d156098defa8243eab0f32fa17589075a1b808"
- integrity sha512-U5eyP/CTFPuNE3qk+WZMxFkp/4zUzdceQlfzf7DdGdhp+Fezd7HD+i8Y24ZuTMKX3wQBld449jijbGq6OdGNQg==
+"@babel/helpers@^7.27.6":
+ version "7.28.2"
+ resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.28.2.tgz#80f0918fecbfebea9af856c419763230040ee850"
+ integrity sha512-/V9771t+EgXz62aCcyofnQhGM8DQACbRhvzKFsXKC9QM+5MadF8ZmIm0crDMaz3+o0h0zXfJnd4EhbYbxsrcFw==
dependencies:
- "@babel/template" "^7.27.0"
- "@babel/types" "^7.27.0"
+ "@babel/template" "^7.27.2"
+ "@babel/types" "^7.28.2"
-"@babel/parser@^7.25.3", "@babel/parser@^7.25.4", "@babel/parser@^7.26.10", "@babel/parser@^7.26.9", "@babel/parser@^7.27.0":
- version "7.27.0"
- resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.27.0.tgz#3d7d6ee268e41d2600091cbd4e145ffee85a44ec"
- integrity sha512-iaepho73/2Pz7w2eMS0Q5f83+0RKI7i4xmiYeBmDzfRVbQtTOG7Ts0S4HzJVsTMGI9keU8rNfuZr8DKfSt7Yyg==
+"@babel/parser@^7.22.5", "@babel/parser@^7.24.6", "@babel/parser@^7.25.3", "@babel/parser@^7.25.4", "@babel/parser@^7.26.7", "@babel/parser@^7.26.9", "@babel/parser@^7.27.0", "@babel/parser@^7.27.2", "@babel/parser@^7.27.7", "@babel/parser@^7.28.0":
+ version "7.28.0"
+ resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.28.0.tgz#979829fbab51a29e13901e5a80713dbcb840825e"
+ integrity sha512-jVZGvOxOuNSsuQuLRTh13nU0AogFlw32w/MT+LV6D3sP5WdbW61E77RnkbaO2dUvmPAYrBDJXGn5gGS6tH4j8g==
dependencies:
- "@babel/types" "^7.27.0"
+ "@babel/types" "^7.28.0"
"@babel/plugin-syntax-jsx@^7.25.9":
- version "7.25.9"
- resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.25.9.tgz#a34313a178ea56f1951599b929c1ceacee719290"
- integrity sha512-ld6oezHQMZsZfp6pWtbjaNDF2tiiCYYDqQszHt5VV437lewP9aSi2Of99CK0D0XB21k7FLgnLcmQKyKzynfeAA==
+ version "7.27.1"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.27.1.tgz#2f9beb5eff30fa507c5532d107daac7b888fa34c"
+ integrity sha512-y8YTNIeKoyhGd9O0Jiyzyyqk8gdjnumGTQPsz0xOZOQ2RmkVJeZ1vmmfIvFEKqucBG6axJGBZDE/7iI5suUI/w==
dependencies:
- "@babel/helper-plugin-utils" "^7.25.9"
+ "@babel/helper-plugin-utils" "^7.27.1"
-"@babel/plugin-syntax-typescript@^7.25.9":
- version "7.25.9"
- resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.25.9.tgz#67dda2b74da43727cf21d46cf9afef23f4365399"
- integrity sha512-hjMgRy5hb8uJJjUcdWunWVcoi9bGpJp8p5Ol1229PoN6aytsLwNMgmdftO23wnCLMfVmTwZDWMPNq/D1SY60JQ==
+"@babel/plugin-syntax-typescript@^7.27.1":
+ version "7.27.1"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.27.1.tgz#5147d29066a793450f220c63fa3a9431b7e6dd18"
+ integrity sha512-xfYCBMxveHrRMnAWl1ZlPXOZjzkN82THFvLhQhFXFt81Z5HnN+EtUkZhv/zcKpmT3fzmWZB0ywiBrbC3vogbwQ==
dependencies:
- "@babel/helper-plugin-utils" "^7.25.9"
+ "@babel/helper-plugin-utils" "^7.27.1"
-"@babel/plugin-transform-typescript@^7.26.7":
- version "7.27.0"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.27.0.tgz#a29fd3481da85601c7e34091296e9746d2cccba8"
- integrity sha512-fRGGjO2UEGPjvEcyAZXRXAS8AfdaQoq7HnxAbJoAoW10B9xOKesmmndJv+Sym2a+9FHWZ9KbyyLCe9s0Sn5jtg==
+"@babel/plugin-transform-typescript@^7.27.1":
+ version "7.28.0"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.28.0.tgz#796cbd249ab56c18168b49e3e1d341b72af04a6b"
+ integrity sha512-4AEiDEBPIZvLQaWlc9liCavE0xRM0dNca41WtBeM3jgFptfUOSG9z0uteLhq6+3rq+WB6jIvUwKDTpXEHPJ2Vg==
dependencies:
- "@babel/helper-annotate-as-pure" "^7.25.9"
- "@babel/helper-create-class-features-plugin" "^7.27.0"
- "@babel/helper-plugin-utils" "^7.26.5"
- "@babel/helper-skip-transparent-expression-wrappers" "^7.25.9"
- "@babel/plugin-syntax-typescript" "^7.25.9"
+ "@babel/helper-annotate-as-pure" "^7.27.3"
+ "@babel/helper-create-class-features-plugin" "^7.27.1"
+ "@babel/helper-plugin-utils" "^7.27.1"
+ "@babel/helper-skip-transparent-expression-wrappers" "^7.27.1"
+ "@babel/plugin-syntax-typescript" "^7.27.1"
-"@babel/template@^7.26.9", "@babel/template@^7.27.0":
- version "7.27.0"
- resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.27.0.tgz#b253e5406cc1df1c57dcd18f11760c2dbf40c0b4"
- integrity sha512-2ncevenBqXI6qRMukPlXwHKHchC7RyMuu4xv5JBXRfOGVcTy1mXCD12qrp7Jsoxll1EV3+9sE4GugBVRjT2jFA==
- dependencies:
- "@babel/code-frame" "^7.26.2"
- "@babel/parser" "^7.27.0"
- "@babel/types" "^7.27.0"
+"@babel/runtime@^7.14.0":
+ version "7.28.2"
+ resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.28.2.tgz#2ae5a9d51cc583bd1f5673b3bb70d6d819682473"
+ integrity sha512-KHp2IflsnGywDjBWDkR9iEqiWSpc8GIi0lgTT3mOElT0PP1tG26P4tmFI2YvAdzgq9RGyoHZQEIEdZy6Ec5xCA==
-"@babel/traverse@^7.25.3", "@babel/traverse@^7.25.9", "@babel/traverse@^7.26.10", "@babel/traverse@^7.26.5", "@babel/traverse@^7.26.9", "@babel/traverse@^7.27.0":
- version "7.27.0"
- resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.27.0.tgz#11d7e644779e166c0442f9a07274d02cd91d4a70"
- integrity sha512-19lYZFzYVQkkHkl4Cy4WrAVcqBkgvV2YM2TU3xG6DIwO7O3ecbDPfW3yM3bjAGcqcQHi+CCtjMR3dIEHxsd6bA==
+"@babel/template@^7.26.9", "@babel/template@^7.27.2":
+ version "7.27.2"
+ resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.27.2.tgz#fa78ceed3c4e7b63ebf6cb39e5852fca45f6809d"
+ integrity sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==
dependencies:
- "@babel/code-frame" "^7.26.2"
- "@babel/generator" "^7.27.0"
- "@babel/parser" "^7.27.0"
- "@babel/template" "^7.27.0"
- "@babel/types" "^7.27.0"
+ "@babel/code-frame" "^7.27.1"
+ "@babel/parser" "^7.27.2"
+ "@babel/types" "^7.27.1"
+
+"@babel/traverse@^7.25.3", "@babel/traverse@^7.26.9", "@babel/traverse@^7.27.1", "@babel/traverse@^7.27.3", "@babel/traverse@^7.28.0":
+ version "7.28.0"
+ resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.28.0.tgz#518aa113359b062042379e333db18380b537e34b"
+ integrity sha512-mGe7UK5wWyh0bKRfupsUchrQGqvDbZDbKJw+kcRGSmdHVYrv+ltd0pnpDTVpiTqnaBru9iEvA8pz8W46v0Amwg==
+ dependencies:
+ "@babel/code-frame" "^7.27.1"
+ "@babel/generator" "^7.28.0"
+ "@babel/helper-globals" "^7.28.0"
+ "@babel/parser" "^7.28.0"
+ "@babel/template" "^7.27.2"
+ "@babel/types" "^7.28.0"
debug "^4.3.1"
- globals "^11.1.0"
-"@babel/types@^7.25.4", "@babel/types@^7.25.9", "@babel/types@^7.26.10", "@babel/types@^7.26.8", "@babel/types@^7.26.9", "@babel/types@^7.27.0":
- version "7.27.0"
- resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.27.0.tgz#ef9acb6b06c3173f6632d993ecb6d4ae470b4559"
- integrity sha512-H45s8fVLYjbhFH62dIJ3WtmJ6RSPt/3DRO0ZcT2SUiYiQyz3BLVb9ADEnLl91m74aQPS3AzzeajZHYOalWe3bg==
+"@babel/types@7.28.0":
+ version "7.28.0"
+ resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.28.0.tgz#2fd0159a6dc7353933920c43136335a9b264d950"
+ integrity sha512-jYnje+JyZG5YThjHiF28oT4SIZLnYOcSBb6+SDaFIyzDVSkXQmQQYclJ2R+YxcdmK0AX6x1E5OQNtuh3jHDrUg==
dependencies:
- "@babel/helper-string-parser" "^7.25.9"
- "@babel/helper-validator-identifier" "^7.25.9"
+ "@babel/helper-string-parser" "^7.27.1"
+ "@babel/helper-validator-identifier" "^7.27.1"
-"@capsizecss/metrics@^2.1.1":
- version "2.2.0"
- resolved "https://registry.yarnpkg.com/@capsizecss/metrics/-/metrics-2.2.0.tgz#f8cad1e2911e2e1bb16c2cb69da41be8f5c9b31b"
- integrity sha512-DkFIser1KbGxWyG2hhQQeCit72TnOQDx5pr9bkA7+XlIy7qv+4lYtslH3bidVxm2qkY2guAgypSIPYuQQuk70A==
+"@babel/types@^7.25.4", "@babel/types@^7.26.8", "@babel/types@^7.26.9", "@babel/types@^7.27.1", "@babel/types@^7.27.3", "@babel/types@^7.28.0", "@babel/types@^7.28.2":
+ version "7.28.2"
+ resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.28.2.tgz#da9db0856a9a88e0a13b019881d7513588cf712b"
+ integrity sha512-ruv7Ae4J5dUYULmeXw1gmb7rYRz57OWCPM57pHojnLq/3Z1CK2lNSLTCVjxVk1F/TZHwOZZrOWi0ur95BbLxNQ==
+ dependencies:
+ "@babel/helper-string-parser" "^7.27.1"
+ "@babel/helper-validator-identifier" "^7.27.1"
-"@capsizecss/unpack@^2.0.1":
+"@capsizecss/metrics@^3.5.0":
+ version "3.5.0"
+ resolved "https://registry.yarnpkg.com/@capsizecss/metrics/-/metrics-3.5.0.tgz#80b4b36d00651288e568c46e7b7c2f4e7d187b6f"
+ integrity sha512-Ju2I/Qn3c1OaU8FgeW4Tc22D4C9NwyVfKzNmzst59bvxBjPoLYNZMqFYn+HvCtn4MpXwiaDtCE8fNuQLpdi9yA==
+
+"@capsizecss/unpack@^2.4.0":
version "2.4.0"
resolved "https://registry.yarnpkg.com/@capsizecss/unpack/-/unpack-2.4.0.tgz#db93ee886b8016c155ba7934c7adbe42a9734f13"
integrity sha512-GrSU71meACqcmIUxPYOJvGKF0yryjN/L1aCuE9DViCTJI7bfkjgYDPD1zbNDcINJwSSP6UaBZY9GAbYDO7re0Q==
@@ -269,20 +286,20 @@
cross-fetch "^3.0.4"
fontkit "^2.0.2"
-"@clack/core@0.4.1":
- version "0.4.1"
- resolved "https://registry.yarnpkg.com/@clack/core/-/core-0.4.1.tgz#36c8aed3f4904060a39275817e804e7a8ffb7e1c"
- integrity sha512-Pxhij4UXg8KSr7rPek6Zowm+5M22rbd2g1nfojHJkxp5YkFqiZ2+YLEM/XGVIzvGOcM0nqjIFxrpDwWRZYWYjA==
+"@clack/core@0.5.0":
+ version "0.5.0"
+ resolved "https://registry.yarnpkg.com/@clack/core/-/core-0.5.0.tgz#970df024a927d6af90111667a0384e233b5ffa1a"
+ integrity sha512-p3y0FIOwaYRUPRcMO7+dlmLh8PSRcrjuTndsiA0WAFbWES0mLZlrjVoBRZ9DzkPFJZG6KGkJmoEAY0ZcVWTkow==
dependencies:
picocolors "^1.0.0"
sisteransi "^1.0.5"
-"@clack/prompts@^0.10.0":
- version "0.10.0"
- resolved "https://registry.yarnpkg.com/@clack/prompts/-/prompts-0.10.0.tgz#3fb268c1eb9b4fc6bc5952744273e7a0cb01995a"
- integrity sha512-H3rCl6CwW1NdQt9rE3n373t7o5cthPv7yUoxF2ytZvyvlJv89C5RYMJu83Hed8ODgys5vpBU0GKxIRG83jd8NQ==
+"@clack/prompts@^0.11.0":
+ version "0.11.0"
+ resolved "https://registry.yarnpkg.com/@clack/prompts/-/prompts-0.11.0.tgz#5c0218f2b46626a50d72d8a485681eb8d94bd2a7"
+ integrity sha512-pMN5FcrEw9hUkZA4f+zLlzivQSeQf5dRGJjSUbvVYDLvpKCdQx5OaknvKzgbtXOizhP+SJJJjqEbOe55uKKfAw==
dependencies:
- "@clack/core" "0.4.1"
+ "@clack/core" "0.5.0"
picocolors "^1.0.0"
sisteransi "^1.0.5"
@@ -293,257 +310,396 @@
dependencies:
mime "^3.0.0"
-"@drop-oss/droplet-darwin-arm64@0.7.2":
- version "0.7.2"
- resolved "https://registry.yarnpkg.com/@drop-oss/droplet-darwin-arm64/-/droplet-darwin-arm64-0.7.2.tgz#fb714d3bf83dbf5e0ee6068ce2fdc74652a9d073"
- integrity sha512-g1IiaSWYd+NDhyRbEKxSxrKFieJV/bwijcFfzP5VLHbTohDu5zJLe6Exc/IXbIb+Ex70Rfsk8Sf9n1zfHCD+Fg==
+"@colors/colors@1.6.0", "@colors/colors@^1.6.0":
+ version "1.6.0"
+ resolved "https://registry.yarnpkg.com/@colors/colors/-/colors-1.6.0.tgz#ec6cd237440700bc23ca23087f513c75508958b0"
+ integrity sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA==
-"@drop-oss/droplet-darwin-universal@0.7.2":
- version "0.7.2"
- resolved "https://registry.yarnpkg.com/@drop-oss/droplet-darwin-universal/-/droplet-darwin-universal-0.7.2.tgz#237d70fab92b892e4d40855d13fd54ad55cf026e"
- integrity sha512-wVVkMi0uwOob876xNFc37/5dGusKjlsWc4Z9bTUtTGeWo9gx5BkEpHBRrwD9NBAklr0Eu7Kmin3niB7pfx9vTw==
+"@dabh/diagnostics@^2.0.2":
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/@dabh/diagnostics/-/diagnostics-2.0.3.tgz#7f7e97ee9a725dffc7808d93668cc984e1dc477a"
+ integrity sha512-hrlQOIi7hAfzsMqlGSFyVucrx38O+j6wiGOf//H2ecvIEqYN4ADBSS2iLMh5UFyDunCNniUIPk/q3riFv45xRA==
+ dependencies:
+ colorspace "1.1.x"
+ enabled "2.0.x"
+ kuler "^2.0.0"
-"@drop-oss/droplet-darwin-x64@0.7.2":
- version "0.7.2"
- resolved "https://registry.yarnpkg.com/@drop-oss/droplet-darwin-x64/-/droplet-darwin-x64-0.7.2.tgz#ed12ced467ff38f7eb2419b0ae6b1c508d828b84"
- integrity sha512-/p53OVesFG1Q/3+kYImitduGvZFfrfyVgdW+twoy+DYTX5EE1XZKaLZs2PSnbFSnnFJTmWvfnGqN5s+Dh12AKw==
+"@dependents/detective-less@^5.0.1":
+ version "5.0.1"
+ resolved "https://registry.yarnpkg.com/@dependents/detective-less/-/detective-less-5.0.1.tgz#e6c5b502f0d26a81da4170c1ccd848a6eaa68470"
+ integrity sha512-Y6+WUMsTFWE5jb20IFP4YGa5IrGY/+a/FbOSjDF/wz9gepU2hwCYSXRHP/vPwBvwcY3SVMASt4yXxbXNXigmZQ==
+ dependencies:
+ gonzales-pe "^4.3.0"
+ node-source-walk "^7.0.1"
-"@drop-oss/droplet-linux-arm-gnueabihf@0.7.2":
- version "0.7.2"
- resolved "https://registry.yarnpkg.com/@drop-oss/droplet-linux-arm-gnueabihf/-/droplet-linux-arm-gnueabihf-0.7.2.tgz#2fb0bfae2cb5fd08942d4f490f25046f006123ce"
- integrity sha512-hZtkKhgMkSqhueOEBRBZlSWE6uawM9M31gPmajrYHNOEnnmt8oUtZriPvC1ffZwZnQb4LL7IMGUZmXTl6guZXQ==
+"@discordapp/twemoji@^16.0.1":
+ version "16.0.1"
+ resolved "https://registry.yarnpkg.com/@discordapp/twemoji/-/twemoji-16.0.1.tgz#8af227ed1243e65d12582850ff94f287f9d2cb0d"
+ integrity sha512-figLiBWzjS5cyrAjLaGjM8AAaowO3qvK8rg5bA2dElB4qsaPMvBVlFDMO2d3x+nC1igt7kgWH4dvNmvvUHUF8w==
+ dependencies:
+ "@twemoji/parser" "16.0.0"
+ fs-extra "^8.0.1"
+ jsonfile "^5.0.0"
+ universalify "^0.1.2"
-"@drop-oss/droplet-linux-arm-musleabihf@0.7.2":
- version "0.7.2"
- resolved "https://registry.yarnpkg.com/@drop-oss/droplet-linux-arm-musleabihf/-/droplet-linux-arm-musleabihf-0.7.2.tgz#cbf54f5ff271a9e4601f6f6489cb6f630c6e9cbc"
- integrity sha512-FBy8GE06mWSlv/t3d7iOF2wP9jvvPTePwPpIQyMpmEOz5MmdwF3/PFFncV4WcmxQ/RHUhIrZ3M9Dfq8WCiXPgw==
+"@drop-oss/droplet-darwin-arm64@3.0.1":
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/@drop-oss/droplet-darwin-arm64/-/droplet-darwin-arm64-3.0.1.tgz#37acbeaedcf28623c18b545aa2ed9205533a7128"
+ integrity sha512-LXe8vsXUBL96boI78H6oXpSaPVwF4cCwJ5l/QVtsOWMebNo6gk9wICDZ+5IoR/Ol32t1a1lk+DjbD1zeGenPxg==
-"@drop-oss/droplet-linux-arm64-gnu@0.7.2":
- version "0.7.2"
- resolved "https://registry.yarnpkg.com/@drop-oss/droplet-linux-arm64-gnu/-/droplet-linux-arm64-gnu-0.7.2.tgz#96062bf8a63de742995d89b782fa7e11f26d984f"
- integrity sha512-Ev+WOUwazMgzz3tcHZefCaELSQ/dUJA795eXiNp0jDFRhddeybulxabte9hM9XjP5Yg/pZ0GpenWMjcWvxVaIQ==
+"@drop-oss/droplet-darwin-universal@3.0.1":
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/@drop-oss/droplet-darwin-universal/-/droplet-darwin-universal-3.0.1.tgz#8e90214758ae03e2e37501a107e5a8acaeec6d32"
+ integrity sha512-Mf2gjC24u6s8djV/3slZvwdr4+h0qBu2OYXBUSDfR4H/VJwV5TstnWVKF+U8d1hjmHE9eLO8elbGNnpQmSoTOQ==
-"@drop-oss/droplet-linux-arm64-musl@0.7.2":
- version "0.7.2"
- resolved "https://registry.yarnpkg.com/@drop-oss/droplet-linux-arm64-musl/-/droplet-linux-arm64-musl-0.7.2.tgz#cabb0305e3337dc8fabe4d46d21756fe2d93bde6"
- integrity sha512-uJ0oOjPNNsNrqc8kJhlOxetz+lYb1QUOIKyKjpmTKVHYjNXj8bvc/FSDYwQjCPRs0r9qrEszF8hW6lsibQ92/g==
+"@drop-oss/droplet-darwin-x64@3.0.1":
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/@drop-oss/droplet-darwin-x64/-/droplet-darwin-x64-3.0.1.tgz#602cf4e7cb1ceda4ef95673f61542025b9215e9a"
+ integrity sha512-4IIDl/E+hzZ2Vt9m4FMPlZEXwj1EwE6qXyUidACK6TTFqpjLpsEHKuhv1FOxGyJ8qkvagtyPCc+cs1TxoZD6FA==
-"@drop-oss/droplet-linux-riscv64-gnu@0.7.2":
- version "0.7.2"
- resolved "https://registry.yarnpkg.com/@drop-oss/droplet-linux-riscv64-gnu/-/droplet-linux-riscv64-gnu-0.7.2.tgz#5ea5b99df8677def14da6099dec9577433736655"
- integrity sha512-5xdbTvEs8MiOL3ren+QyCXvcLmKWa7NSAehdunaD82qIwV19Xz+/C7OC1jN2zGgAQ0TBM/HcbkmWITNEQB7Oiw==
+"@drop-oss/droplet-linux-arm64-gnu@3.0.1":
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/@drop-oss/droplet-linux-arm64-gnu/-/droplet-linux-arm64-gnu-3.0.1.tgz#a49d1998229fafbd42ac4b8fc5f67754ab1ac49c"
+ integrity sha512-klGvlLf1xSMT3iYsIAaBbmbir1ZJWtcVyOMUlsfc1lkJ8mgyB+PrW4BsnYj7Pp4G34n7WsOChjC8TdJDBBuBWg==
-"@drop-oss/droplet-linux-x64-gnu@0.7.2":
- version "0.7.2"
- resolved "https://registry.yarnpkg.com/@drop-oss/droplet-linux-x64-gnu/-/droplet-linux-x64-gnu-0.7.2.tgz#244f137f6f301c307414e43b7cbd42fbd3e3247f"
- integrity sha512-xM7tEzAR/yGFpO3C3lLpyOiqCD84MqwXQS6I1aR+z7IU+tAVwX1JYmu4HYGw1pxPCHpK/9w8NtAwzgSiw5d2jQ==
+"@drop-oss/droplet-linux-arm64-musl@3.0.1":
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/@drop-oss/droplet-linux-arm64-musl/-/droplet-linux-arm64-musl-3.0.1.tgz#3e0ffee4f0aba051c244236aecdb5c1221c1b999"
+ integrity sha512-oOjvGETlrJGC1RlNhUoVS9N89Rn/0DqBauVz3BBFjJTKSd5jU3/gLzwgmfkKDGVEU5lyGPAn2WQroiESEG9wdA==
-"@drop-oss/droplet-linux-x64-musl@0.7.2":
- version "0.7.2"
- resolved "https://registry.yarnpkg.com/@drop-oss/droplet-linux-x64-musl/-/droplet-linux-x64-musl-0.7.2.tgz#37bc2d079cc63949bd5ac5194be65cb9c769feb0"
- integrity sha512-s9YbnqPQhz468py49icPO74ezXF+EGKt7DX9vMs7XIp2Uyz+pWejRkerSj70WTypy5UcSNgcIBOB6kfD/FMMAQ==
+"@drop-oss/droplet-linux-riscv64-gnu@3.0.1":
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/@drop-oss/droplet-linux-riscv64-gnu/-/droplet-linux-riscv64-gnu-3.0.1.tgz#2208f1a038d54ced68d1537c4daa964b115d4e5c"
+ integrity sha512-Zf3gUsWq9Hqb275MOi7PJDhmJz7Qa/Y1XMen880bxPaOeDFqFOoKUxUr2/qv1MYp6tT3zO27NprGsHirYWqsyA==
-"@drop-oss/droplet-win32-arm64-msvc@0.7.2":
- version "0.7.2"
- resolved "https://registry.yarnpkg.com/@drop-oss/droplet-win32-arm64-msvc/-/droplet-win32-arm64-msvc-0.7.2.tgz#c0a6048b9dc89596bf230346c5bbe86fcdc27009"
- integrity sha512-E0isKXZIt/mFUAfziZ9hat84uol4hWHcEZ86xxfz4L8/wljrKU7Vbw9yaYznk4FvKRHnwoccymtOTLrSq2Ju4Q==
+"@drop-oss/droplet-linux-x64-gnu@3.0.1":
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/@drop-oss/droplet-linux-x64-gnu/-/droplet-linux-x64-gnu-3.0.1.tgz#ffe2e39f978d32858a003f0c28614a8a4d1bdeef"
+ integrity sha512-sskblycJdtNJVnRHjPHhwHkQUfQNaDIWDzXOzEaBPOcDKqYA7od7VMDAseqBkrKDn7l8bBUtRXFAipdsO8hffw==
-"@drop-oss/droplet-win32-x64-msvc@0.7.2":
- version "0.7.2"
- resolved "https://registry.yarnpkg.com/@drop-oss/droplet-win32-x64-msvc/-/droplet-win32-x64-msvc-0.7.2.tgz#2835e05bcf9923eb23e04b94c298520ecb6299d0"
- integrity sha512-O5t2B/3Ld+17q1qDPVds3V/Ex2as2l8piVBgEKIkEL51wJYu7ucwMwWrfdMWKXRn17Fl5ueeujZLuD3iySRkLw==
+"@drop-oss/droplet-linux-x64-musl@3.0.1":
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/@drop-oss/droplet-linux-x64-musl/-/droplet-linux-x64-musl-3.0.1.tgz#4bd501eeeddfdaf3c49e6508cc1798419b0c78cc"
+ integrity sha512-lh+1M6UAf5+ET1/ZEFRsB3shFHjkT/9Ql9akr/vyUue91TWPmP71meqVkCugWDhP6lxBt56jg2VVrJfmPAsK6w==
-"@drop-oss/droplet@^0.7.2":
- version "0.7.2"
- resolved "https://registry.yarnpkg.com/@drop-oss/droplet/-/droplet-0.7.2.tgz#a914dbee85cb3b3a0c9dd90d9cebec5bb0575bce"
- integrity sha512-XxKUuRMYMdTVT4IaetNRN07iUpHJkXdS1LKfPBDrNkjszfG0SGjqCd1PVw7p6ugPWdezS8ygGODR6c/cAOQ4kw==
+"@drop-oss/droplet-win32-arm64-msvc@3.0.1":
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/@drop-oss/droplet-win32-arm64-msvc/-/droplet-win32-arm64-msvc-3.0.1.tgz#9308c75d22773fbb78bba0286c101870b3eaf5f6"
+ integrity sha512-caQDPoDNJyyJXUEijw+hGTy0wmCrW5efTqBwnvMcQ282EOilg1d5WeJ31pfEcuLYF4MK1t9uaLcG6jZ9YLtzEQ==
+
+"@drop-oss/droplet-win32-x64-msvc@3.0.1":
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/@drop-oss/droplet-win32-x64-msvc/-/droplet-win32-x64-msvc-3.0.1.tgz#3f50f1328bd7aafd8dfe7edd0413f13217cbc9ce"
+ integrity sha512-bp8KwewF/T3JkVeJWkg86U3b0cGQD9i8k92x6HYPtnF5nLPAb2UIUEJgmYYFNPFe36RECBV7PIIG0ujdT1ELQw==
+
+"@drop-oss/droplet@3.0.1":
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/@drop-oss/droplet/-/droplet-3.0.1.tgz#e7f6772aa1f94010d41086fc8a1f396a5d392184"
+ integrity sha512-YhtgpwNqEHO8R03yf9Xb5LXuaLWkQvY+2lxOD1PwzpGI5V9PKlDE+x1IJBmdBF5bDPDGk9MxQidGtnYQuAEBEA==
optionalDependencies:
- "@drop-oss/droplet-darwin-arm64" "0.7.2"
- "@drop-oss/droplet-darwin-universal" "0.7.2"
- "@drop-oss/droplet-darwin-x64" "0.7.2"
- "@drop-oss/droplet-linux-arm-gnueabihf" "0.7.2"
- "@drop-oss/droplet-linux-arm-musleabihf" "0.7.2"
- "@drop-oss/droplet-linux-arm64-gnu" "0.7.2"
- "@drop-oss/droplet-linux-arm64-musl" "0.7.2"
- "@drop-oss/droplet-linux-riscv64-gnu" "0.7.2"
- "@drop-oss/droplet-linux-x64-gnu" "0.7.2"
- "@drop-oss/droplet-linux-x64-musl" "0.7.2"
- "@drop-oss/droplet-win32-arm64-msvc" "0.7.2"
- "@drop-oss/droplet-win32-x64-msvc" "0.7.2"
+ "@drop-oss/droplet-darwin-arm64" "3.0.1"
+ "@drop-oss/droplet-darwin-universal" "3.0.1"
+ "@drop-oss/droplet-darwin-x64" "3.0.1"
+ "@drop-oss/droplet-linux-arm64-gnu" "3.0.1"
+ "@drop-oss/droplet-linux-arm64-musl" "3.0.1"
+ "@drop-oss/droplet-linux-riscv64-gnu" "3.0.1"
+ "@drop-oss/droplet-linux-x64-gnu" "3.0.1"
+ "@drop-oss/droplet-linux-x64-musl" "3.0.1"
+ "@drop-oss/droplet-win32-arm64-msvc" "3.0.1"
+ "@drop-oss/droplet-win32-x64-msvc" "3.0.1"
-"@drop-oss/headscalez@0.0.4":
- version "0.0.4"
- resolved "https://registry.yarnpkg.com/@drop-oss/headscalez/-/headscalez-0.0.4.tgz#7558fbbc542d93fb0c69bdcf48917bdae676c62d"
- integrity sha512-vdDq6Qe/T5S0FKKYdnBXvOh53wGs8nxy6O3ACVyUjTbTGkDn3z5og4joh5TxoAOFodPHRLCihVuroiymS7yNTg==
+"@emnapi/core@^1.4.3":
+ version "1.4.5"
+ resolved "https://registry.yarnpkg.com/@emnapi/core/-/core-1.4.5.tgz#bfbb0cbbbb9f96ec4e2c4fd917b7bbe5495ceccb"
+ integrity sha512-XsLw1dEOpkSX/WucdqUhPWP7hDxSvZiY+fsUC14h+FtQ2Ifni4znbBt8punRX+Uj2JG/uDb8nEHVKvrVlvdZ5Q==
dependencies:
- "@protobuf-ts/grpcweb-transport" "^2.10.0"
- "@protobuf-ts/runtime" "^2.10.0"
- "@protobuf-ts/runtime-rpc" "^2.10.0"
- execa "^9.5.3"
- fs-extra "^11.3.0"
- node-graceful-shutdown "^1.1.5"
- ofetch "^1.4.1"
-
-"@emnapi/core@^1.4.0":
- version "1.4.0"
- resolved "https://registry.yarnpkg.com/@emnapi/core/-/core-1.4.0.tgz#8844b02d799198158ac1fea21ae2bc81b881da9a"
- integrity sha512-H+N/FqT07NmLmt6OFFtDfwe8PNygprzBikrEMyQfgqSmT0vzE515Pz7R8izwB9q/zsH/MA64AKoul3sA6/CzVg==
- dependencies:
- "@emnapi/wasi-threads" "1.0.1"
+ "@emnapi/wasi-threads" "1.0.4"
tslib "^2.4.0"
-"@emnapi/runtime@^1.2.0", "@emnapi/runtime@^1.4.0":
- version "1.4.0"
- resolved "https://registry.yarnpkg.com/@emnapi/runtime/-/runtime-1.4.0.tgz#8f509bf1059a5551c8fe829a1c4e91db35fdfbee"
- integrity sha512-64WYIf4UYcdLnbKn/umDlNjQDSS8AgZrI/R9+x5ilkUVFxXcA1Ebl+gQLc/6mERA4407Xof0R7wEyEuj091CVw==
+"@emnapi/runtime@^1.4.3":
+ version "1.4.5"
+ resolved "https://registry.yarnpkg.com/@emnapi/runtime/-/runtime-1.4.5.tgz#c67710d0661070f38418b6474584f159de38aba9"
+ integrity sha512-++LApOtY0pEEz1zrd9vy1/zXVaVJJ/EbAF3u0fXIzPJEDtnITsBGbbK0EkM72amhl/R5b+5xx0Y/QhcVOpuulg==
dependencies:
tslib "^2.4.0"
-"@emnapi/wasi-threads@1.0.1":
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/@emnapi/wasi-threads/-/wasi-threads-1.0.1.tgz#d7ae71fd2166b1c916c6cd2d0df2ef565a2e1a5b"
- integrity sha512-iIBu7mwkq4UQGeMEM8bLwNK962nXdhodeScX4slfQnRhEMMzvYivHhutCIk8uojvmASXXPC2WNEjwxFWk72Oqw==
+"@emnapi/wasi-threads@1.0.4", "@emnapi/wasi-threads@^1.0.2":
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/@emnapi/wasi-threads/-/wasi-threads-1.0.4.tgz#703fc094d969e273b1b71c292523b2f792862bf4"
+ integrity sha512-PJR+bOmMOPH8AtcTGAyYNiuJ3/Fcoj2XN/gBEWzDIKh254XO+mM9XoXHk5GNEhodxeMznbg7BlRojVbKN+gC6g==
dependencies:
tslib "^2.4.0"
-"@es-joy/jsdoccomment@~0.49.0":
- version "0.49.0"
- resolved "https://registry.yarnpkg.com/@es-joy/jsdoccomment/-/jsdoccomment-0.49.0.tgz#e5ec1eda837c802eca67d3b29e577197f14ba1db"
- integrity sha512-xjZTSFgECpb9Ohuk5yMX5RhUEbfeQcuOp8IF60e+wyzWEF0M5xeSgqsfLtvPEX8BIyOX9saZqzuGPmZ8oWc+5Q==
+"@es-joy/jsdoccomment@~0.52.0":
+ version "0.52.0"
+ resolved "https://registry.yarnpkg.com/@es-joy/jsdoccomment/-/jsdoccomment-0.52.0.tgz#106945b6d1abed89597aa104b80ff8f9fb7038a6"
+ integrity sha512-BXuN7BII+8AyNtn57euU2Yxo9yA/KUDNzrpXyi3pfqKmBhhysR6ZWOebFh3vyPoqA3/j1SOvGgucElMGwlXing==
dependencies:
+ "@types/estree" "^1.0.8"
+ "@typescript-eslint/types" "^8.34.1"
comment-parser "1.4.1"
esquery "^1.6.0"
jsdoc-type-pratt-parser "~4.1.0"
-"@esbuild/aix-ppc64@0.25.2":
- version "0.25.2"
- resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.25.2.tgz#b87036f644f572efb2b3c75746c97d1d2d87ace8"
- integrity sha512-wCIboOL2yXZym2cgm6mlA742s9QeJ8DjGVaL39dLN4rRwrOgOyYSnOaFPhKZGLb2ngj4EyfAFjsNJwPXZvseag==
+"@esbuild/aix-ppc64@0.25.5":
+ version "0.25.5"
+ resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.25.5.tgz#4e0f91776c2b340e75558f60552195f6fad09f18"
+ integrity sha512-9o3TMmpmftaCMepOdA5k/yDw8SfInyzWWTjYTFCX3kPSDJMROQTb8jg+h9Cnwnmm1vOzvxN7gIfB5V2ewpjtGA==
-"@esbuild/android-arm64@0.25.2":
- version "0.25.2"
- resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.25.2.tgz#5ca7dc20a18f18960ad8d5e6ef5cf7b0a256e196"
- integrity sha512-5ZAX5xOmTligeBaeNEPnPaeEuah53Id2tX4c2CVP3JaROTH+j4fnfHCkr1PjXMd78hMst+TlkfKcW/DlTq0i4w==
+"@esbuild/aix-ppc64@0.25.8":
+ version "0.25.8"
+ resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.25.8.tgz#a1414903bb38027382f85f03dda6065056757727"
+ integrity sha512-urAvrUedIqEiFR3FYSLTWQgLu5tb+m0qZw0NBEasUeo6wuqatkMDaRT+1uABiGXEu5vqgPd7FGE1BhsAIy9QVA==
-"@esbuild/android-arm@0.25.2":
- version "0.25.2"
- resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.25.2.tgz#3c49f607b7082cde70c6ce0c011c362c57a194ee"
- integrity sha512-NQhH7jFstVY5x8CKbcfa166GoV0EFkaPkCKBQkdPJFvo5u+nGXLEH/ooniLb3QI8Fk58YAx7nsPLozUWfCBOJA==
+"@esbuild/android-arm64@0.25.5":
+ version "0.25.5"
+ resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.25.5.tgz#bc766407f1718923f6b8079c8c61bf86ac3a6a4f"
+ integrity sha512-VGzGhj4lJO+TVGV1v8ntCZWJktV7SGCs3Pn1GRWI1SBFtRALoomm8k5E9Pmwg3HOAal2VDc2F9+PM/rEY6oIDg==
-"@esbuild/android-x64@0.25.2":
- version "0.25.2"
- resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.25.2.tgz#8a00147780016aff59e04f1036e7cb1b683859e2"
- integrity sha512-Ffcx+nnma8Sge4jzddPHCZVRvIfQ0kMsUsCMcJRHkGJ1cDmhe4SsrYIjLUKn1xpHZybmOqCWwB0zQvsjdEHtkg==
+"@esbuild/android-arm64@0.25.8":
+ version "0.25.8"
+ resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.25.8.tgz#c859994089e9767224269884061f89dae6fb51c6"
+ integrity sha512-OD3p7LYzWpLhZEyATcTSJ67qB5D+20vbtr6vHlHWSQYhKtzUYrETuWThmzFpZtFsBIxRvhO07+UgVA9m0i/O1w==
-"@esbuild/darwin-arm64@0.25.2":
- version "0.25.2"
- resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.25.2.tgz#486efe7599a8d90a27780f2bb0318d9a85c6c423"
- integrity sha512-MpM6LUVTXAzOvN4KbjzU/q5smzryuoNjlriAIx+06RpecwCkL9JpenNzpKd2YMzLJFOdPqBpuub6eVRP5IgiSA==
+"@esbuild/android-arm@0.25.5":
+ version "0.25.5"
+ resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.25.5.tgz#4290d6d3407bae3883ad2cded1081a234473ce26"
+ integrity sha512-AdJKSPeEHgi7/ZhuIPtcQKr5RQdo6OO2IL87JkianiMYMPbCtot9fxPbrMiBADOWWm3T2si9stAiVsGbTQFkbA==
-"@esbuild/darwin-x64@0.25.2":
- version "0.25.2"
- resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.25.2.tgz#95ee222aacf668c7a4f3d7ee87b3240a51baf374"
- integrity sha512-5eRPrTX7wFyuWe8FqEFPG2cU0+butQQVNcT4sVipqjLYQjjh8a8+vUTfgBKM88ObB85ahsnTwF7PSIt6PG+QkA==
+"@esbuild/android-arm@0.25.8":
+ version "0.25.8"
+ resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.25.8.tgz#96a8f2ca91c6cd29ea90b1af79d83761c8ba0059"
+ integrity sha512-RONsAvGCz5oWyePVnLdZY/HHwA++nxYWIX1atInlaW6SEkwq6XkP3+cb825EUcRs5Vss/lGh/2YxAb5xqc07Uw==
-"@esbuild/freebsd-arm64@0.25.2":
- version "0.25.2"
- resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.2.tgz#67efceda8554b6fc6a43476feba068fb37fa2ef6"
- integrity sha512-mLwm4vXKiQ2UTSX4+ImyiPdiHjiZhIaE9QvC7sw0tZ6HoNMjYAqQpGyui5VRIi5sGd+uWq940gdCbY3VLvsO1w==
+"@esbuild/android-x64@0.25.5":
+ version "0.25.5"
+ resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.25.5.tgz#40c11d9cbca4f2406548c8a9895d321bc3b35eff"
+ integrity sha512-D2GyJT1kjvO//drbRT3Hib9XPwQeWd9vZoBJn+bu/lVsOZ13cqNdDeqIF/xQ5/VmWvMduP6AmXvylO/PIc2isw==
-"@esbuild/freebsd-x64@0.25.2":
- version "0.25.2"
- resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.25.2.tgz#88a9d7ecdd3adadbfe5227c2122d24816959b809"
- integrity sha512-6qyyn6TjayJSwGpm8J9QYYGQcRgc90nmfdUb0O7pp1s4lTY+9D0H9O02v5JqGApUyiHOtkz6+1hZNvNtEhbwRQ==
+"@esbuild/android-x64@0.25.8":
+ version "0.25.8"
+ resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.25.8.tgz#a3a626c4fec4a024a9fa8c7679c39996e92916f0"
+ integrity sha512-yJAVPklM5+4+9dTeKwHOaA+LQkmrKFX96BM0A/2zQrbS6ENCmxc4OVoBs5dPkCCak2roAD+jKCdnmOqKszPkjA==
-"@esbuild/linux-arm64@0.25.2":
- version "0.25.2"
- resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.25.2.tgz#87be1099b2bbe61282333b084737d46bc8308058"
- integrity sha512-gq/sjLsOyMT19I8obBISvhoYiZIAaGF8JpeXu1u8yPv8BE5HlWYobmlsfijFIZ9hIVGYkbdFhEqC0NvM4kNO0g==
+"@esbuild/darwin-arm64@0.25.5":
+ version "0.25.5"
+ resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.25.5.tgz#49d8bf8b1df95f759ac81eb1d0736018006d7e34"
+ integrity sha512-GtaBgammVvdF7aPIgH2jxMDdivezgFu6iKpmT+48+F8Hhg5J/sfnDieg0aeG/jfSvkYQU2/pceFPDKlqZzwnfQ==
-"@esbuild/linux-arm@0.25.2":
- version "0.25.2"
- resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.25.2.tgz#72a285b0fe64496e191fcad222185d7bf9f816f6"
- integrity sha512-UHBRgJcmjJv5oeQF8EpTRZs/1knq6loLxTsjc3nxO9eXAPDLcWW55flrMVc97qFPbmZP31ta1AZVUKQzKTzb0g==
+"@esbuild/darwin-arm64@0.25.8":
+ version "0.25.8"
+ resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.25.8.tgz#a5e1252ca2983d566af1c0ea39aded65736fc66d"
+ integrity sha512-Jw0mxgIaYX6R8ODrdkLLPwBqHTtYHJSmzzd+QeytSugzQ0Vg4c5rDky5VgkoowbZQahCbsv1rT1KW72MPIkevw==
-"@esbuild/linux-ia32@0.25.2":
- version "0.25.2"
- resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.25.2.tgz#337a87a4c4dd48a832baed5cbb022be20809d737"
- integrity sha512-bBYCv9obgW2cBP+2ZWfjYTU+f5cxRoGGQ5SeDbYdFCAZpYWrfjjfYwvUpP8MlKbP0nwZ5gyOU/0aUzZ5HWPuvQ==
+"@esbuild/darwin-x64@0.25.5":
+ version "0.25.5"
+ resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.25.5.tgz#e27a5d92a14886ef1d492fd50fc61a2d4d87e418"
+ integrity sha512-1iT4FVL0dJ76/q1wd7XDsXrSW+oLoquptvh4CLR4kITDtqi2e/xwXwdCVH8hVHU43wgJdsq7Gxuzcs6Iq/7bxQ==
-"@esbuild/linux-loong64@0.25.2":
- version "0.25.2"
- resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.25.2.tgz#1b81aa77103d6b8a8cfa7c094ed3d25c7579ba2a"
- integrity sha512-SHNGiKtvnU2dBlM5D8CXRFdd+6etgZ9dXfaPCeJtz+37PIUlixvlIhI23L5khKXs3DIzAn9V8v+qb1TRKrgT5w==
+"@esbuild/darwin-x64@0.25.8":
+ version "0.25.8"
+ resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.25.8.tgz#5271b0df2bb12ce8df886704bfdd1c7cc01385d2"
+ integrity sha512-Vh2gLxxHnuoQ+GjPNvDSDRpoBCUzY4Pu0kBqMBDlK4fuWbKgGtmDIeEC081xi26PPjn+1tct+Bh8FjyLlw1Zlg==
-"@esbuild/linux-mips64el@0.25.2":
- version "0.25.2"
- resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.25.2.tgz#afbe380b6992e7459bf7c2c3b9556633b2e47f30"
- integrity sha512-hDDRlzE6rPeoj+5fsADqdUZl1OzqDYow4TB4Y/3PlKBD0ph1e6uPHzIQcv2Z65u2K0kpeByIyAjCmjn1hJgG0Q==
+"@esbuild/freebsd-arm64@0.25.5":
+ version "0.25.5"
+ resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.5.tgz#97cede59d638840ca104e605cdb9f1b118ba0b1c"
+ integrity sha512-nk4tGP3JThz4La38Uy/gzyXtpkPW8zSAmoUhK9xKKXdBCzKODMc2adkB2+8om9BDYugz+uGV7sLmpTYzvmz6Sw==
-"@esbuild/linux-ppc64@0.25.2":
- version "0.25.2"
- resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.25.2.tgz#6bf8695cab8a2b135cca1aa555226dc932d52067"
- integrity sha512-tsHu2RRSWzipmUi9UBDEzc0nLc4HtpZEI5Ba+Omms5456x5WaNuiG3u7xh5AO6sipnJ9r4cRWQB2tUjPyIkc6g==
+"@esbuild/freebsd-arm64@0.25.8":
+ version "0.25.8"
+ resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.8.tgz#d0a0e7fdf19733b8bb1566b81df1aa0bb7e46ada"
+ integrity sha512-YPJ7hDQ9DnNe5vxOm6jaie9QsTwcKedPvizTVlqWG9GBSq+BuyWEDazlGaDTC5NGU4QJd666V0yqCBL2oWKPfA==
-"@esbuild/linux-riscv64@0.25.2":
- version "0.25.2"
- resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.25.2.tgz#43c2d67a1a39199fb06ba978aebb44992d7becc3"
- integrity sha512-k4LtpgV7NJQOml/10uPU0s4SAXGnowi5qBSjaLWMojNCUICNu7TshqHLAEbkBdAszL5TabfvQ48kK84hyFzjnw==
+"@esbuild/freebsd-x64@0.25.5":
+ version "0.25.5"
+ resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.25.5.tgz#71c77812042a1a8190c3d581e140d15b876b9c6f"
+ integrity sha512-PrikaNjiXdR2laW6OIjlbeuCPrPaAl0IwPIaRv+SMV8CiM8i2LqVUHFC1+8eORgWyY7yhQY+2U2fA55mBzReaw==
-"@esbuild/linux-s390x@0.25.2":
- version "0.25.2"
- resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.25.2.tgz#419e25737ec815c6dce2cd20d026e347cbb7a602"
- integrity sha512-GRa4IshOdvKY7M/rDpRR3gkiTNp34M0eLTaC1a08gNrh4u488aPhuZOCpkF6+2wl3zAN7L7XIpOFBhnaE3/Q8Q==
+"@esbuild/freebsd-x64@0.25.8":
+ version "0.25.8"
+ resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.25.8.tgz#2de8b2e0899d08f1cb1ef3128e159616e7e85343"
+ integrity sha512-MmaEXxQRdXNFsRN/KcIimLnSJrk2r5H8v+WVafRWz5xdSVmWLoITZQXcgehI2ZE6gioE6HirAEToM/RvFBeuhw==
-"@esbuild/linux-x64@0.25.2":
- version "0.25.2"
- resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.25.2.tgz#22451f6edbba84abe754a8cbd8528ff6e28d9bcb"
- integrity sha512-QInHERlqpTTZ4FRB0fROQWXcYRD64lAoiegezDunLpalZMjcUcld3YzZmVJ2H/Cp0wJRZ8Xtjtj0cEHhYc/uUg==
+"@esbuild/linux-arm64@0.25.5":
+ version "0.25.5"
+ resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.25.5.tgz#f7b7c8f97eff8ffd2e47f6c67eb5c9765f2181b8"
+ integrity sha512-Z9kfb1v6ZlGbWj8EJk9T6czVEjjq2ntSYLY2cw6pAZl4oKtfgQuS4HOq41M/BcoLPzrUbNd+R4BXFyH//nHxVg==
-"@esbuild/netbsd-arm64@0.25.2":
- version "0.25.2"
- resolved "https://registry.yarnpkg.com/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.2.tgz#744affd3b8d8236b08c5210d828b0698a62c58ac"
- integrity sha512-talAIBoY5M8vHc6EeI2WW9d/CkiO9MQJ0IOWX8hrLhxGbro/vBXJvaQXefW2cP0z0nQVTdQ/eNyGFV1GSKrxfw==
+"@esbuild/linux-arm64@0.25.8":
+ version "0.25.8"
+ resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.25.8.tgz#a4209efadc0c2975716458484a4e90c237c48ae9"
+ integrity sha512-WIgg00ARWv/uYLU7lsuDK00d/hHSfES5BzdWAdAig1ioV5kaFNrtK8EqGcUBJhYqotlUByUKz5Qo6u8tt7iD/w==
-"@esbuild/netbsd-x64@0.25.2":
- version "0.25.2"
- resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.25.2.tgz#dbbe7521fd6d7352f34328d676af923fc0f8a78f"
- integrity sha512-voZT9Z+tpOxrvfKFyfDYPc4DO4rk06qamv1a/fkuzHpiVBMOhpjK+vBmWM8J1eiB3OLSMFYNaOaBNLXGChf5tg==
+"@esbuild/linux-arm@0.25.5":
+ version "0.25.5"
+ resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.25.5.tgz#2a0be71b6cd8201fa559aea45598dffabc05d911"
+ integrity sha512-cPzojwW2okgh7ZlRpcBEtsX7WBuqbLrNXqLU89GxWbNt6uIg78ET82qifUy3W6OVww6ZWobWub5oqZOVtwolfw==
-"@esbuild/openbsd-arm64@0.25.2":
- version "0.25.2"
- resolved "https://registry.yarnpkg.com/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.2.tgz#f9caf987e3e0570500832b487ce3039ca648ce9f"
- integrity sha512-dcXYOC6NXOqcykeDlwId9kB6OkPUxOEqU+rkrYVqJbK2hagWOMrsTGsMr8+rW02M+d5Op5NNlgMmjzecaRf7Tg==
+"@esbuild/linux-arm@0.25.8":
+ version "0.25.8"
+ resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.25.8.tgz#ccd9e291c24cd8d9142d819d463e2e7200d25b19"
+ integrity sha512-FuzEP9BixzZohl1kLf76KEVOsxtIBFwCaLupVuk4eFVnOZfU+Wsn+x5Ryam7nILV2pkq2TqQM9EZPsOBuMC+kg==
-"@esbuild/openbsd-x64@0.25.2":
- version "0.25.2"
- resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.25.2.tgz#d2bb6a0f8ffea7b394bb43dfccbb07cabd89f768"
- integrity sha512-t/TkWwahkH0Tsgoq1Ju7QfgGhArkGLkF1uYz8nQS/PPFlXbP5YgRpqQR3ARRiC2iXoLTWFxc6DJMSK10dVXluw==
+"@esbuild/linux-ia32@0.25.5":
+ version "0.25.5"
+ resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.25.5.tgz#763414463cd9ea6fa1f96555d2762f9f84c61783"
+ integrity sha512-sQ7l00M8bSv36GLV95BVAdhJ2QsIbCuCjh/uYrWiMQSUuV+LpXwIqhgJDcvMTj+VsQmqAHL2yYaasENvJ7CDKA==
-"@esbuild/sunos-x64@0.25.2":
- version "0.25.2"
- resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.25.2.tgz#49b437ed63fe333b92137b7a0c65a65852031afb"
- integrity sha512-cfZH1co2+imVdWCjd+D1gf9NjkchVhhdpgb1q5y6Hcv9TP6Zi9ZG/beI3ig8TvwT9lH9dlxLq5MQBBgwuj4xvA==
+"@esbuild/linux-ia32@0.25.8":
+ version "0.25.8"
+ resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.25.8.tgz#006ad1536d0c2b28fb3a1cf0b53bcb85aaf92c4d"
+ integrity sha512-A1D9YzRX1i+1AJZuFFUMP1E9fMaYY+GnSQil9Tlw05utlE86EKTUA7RjwHDkEitmLYiFsRd9HwKBPEftNdBfjg==
-"@esbuild/win32-arm64@0.25.2":
- version "0.25.2"
- resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.25.2.tgz#081424168463c7d6c7fb78f631aede0c104373cf"
- integrity sha512-7Loyjh+D/Nx/sOTzV8vfbB3GJuHdOQyrOryFdZvPHLf42Tk9ivBU5Aedi7iyX+x6rbn2Mh68T4qq1SDqJBQO5Q==
+"@esbuild/linux-loong64@0.25.5":
+ version "0.25.5"
+ resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.25.5.tgz#428cf2213ff786a502a52c96cf29d1fcf1eb8506"
+ integrity sha512-0ur7ae16hDUC4OL5iEnDb0tZHDxYmuQyhKhsPBV8f99f6Z9KQM02g33f93rNH5A30agMS46u2HP6qTdEt6Q1kg==
-"@esbuild/win32-ia32@0.25.2":
- version "0.25.2"
- resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.25.2.tgz#3f9e87143ddd003133d21384944a6c6cadf9693f"
- integrity sha512-WRJgsz9un0nqZJ4MfhabxaD9Ft8KioqU3JMinOTvobbX6MOSUigSBlogP8QB3uxpJDsFS6yN+3FDBdqE5lg9kg==
+"@esbuild/linux-loong64@0.25.8":
+ version "0.25.8"
+ resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.25.8.tgz#127b3fbfb2c2e08b1397e985932f718f09a8f5c4"
+ integrity sha512-O7k1J/dwHkY1RMVvglFHl1HzutGEFFZ3kNiDMSOyUrB7WcoHGf96Sh+64nTRT26l3GMbCW01Ekh/ThKM5iI7hQ==
-"@esbuild/win32-x64@0.25.2":
- version "0.25.2"
- resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.25.2.tgz#839f72c2decd378f86b8f525e1979a97b920c67d"
- integrity sha512-kM3HKb16VIXZyIeVrM1ygYmZBKybX8N4p754bw390wGO3Tf2j4L2/WYL+4suWujpgf6GBYs3jv7TyUivdd05JA==
+"@esbuild/linux-mips64el@0.25.5":
+ version "0.25.5"
+ resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.25.5.tgz#5cbcc7fd841b4cd53358afd33527cd394e325d96"
+ integrity sha512-kB/66P1OsHO5zLz0i6X0RxlQ+3cu0mkxS3TKFvkb5lin6uwZ/ttOkP3Z8lfR9mJOBk14ZwZ9182SIIWFGNmqmg==
-"@eslint-community/eslint-utils@^4.2.0", "@eslint-community/eslint-utils@^4.4.0", "@eslint-community/eslint-utils@^4.5.1":
- version "4.5.1"
- resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.5.1.tgz#b0fc7e06d0c94f801537fd4237edc2706d3b8e4c"
- integrity sha512-soEIOALTfTK6EjmKMMoLugwaP0rzkad90iIWd1hMO9ARkSAyjfMfkRRhLvD5qH7vvM0Cg72pieUfR6yh6XxC4w==
+"@esbuild/linux-mips64el@0.25.8":
+ version "0.25.8"
+ resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.25.8.tgz#837d1449517791e3fa7d82675a2d06d9f56cb340"
+ integrity sha512-uv+dqfRazte3BzfMp8PAQXmdGHQt2oC/y2ovwpTteqrMx2lwaksiFZ/bdkXJC19ttTvNXBuWH53zy/aTj1FgGw==
+
+"@esbuild/linux-ppc64@0.25.5":
+ version "0.25.5"
+ resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.25.5.tgz#0d954ab39ce4f5e50f00c4f8c4fd38f976c13ad9"
+ integrity sha512-UZCmJ7r9X2fe2D6jBmkLBMQetXPXIsZjQJCjgwpVDz+YMcS6oFR27alkgGv3Oqkv07bxdvw7fyB71/olceJhkQ==
+
+"@esbuild/linux-ppc64@0.25.8":
+ version "0.25.8"
+ resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.25.8.tgz#aa2e3bd93ab8df084212f1895ca4b03c42d9e0fe"
+ integrity sha512-GyG0KcMi1GBavP5JgAkkstMGyMholMDybAf8wF5A70CALlDM2p/f7YFE7H92eDeH/VBtFJA5MT4nRPDGg4JuzQ==
+
+"@esbuild/linux-riscv64@0.25.5":
+ version "0.25.5"
+ resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.25.5.tgz#0e7dd30730505abd8088321e8497e94b547bfb1e"
+ integrity sha512-kTxwu4mLyeOlsVIFPfQo+fQJAV9mh24xL+y+Bm6ej067sYANjyEw1dNHmvoqxJUCMnkBdKpvOn0Ahql6+4VyeA==
+
+"@esbuild/linux-riscv64@0.25.8":
+ version "0.25.8"
+ resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.25.8.tgz#a340620e31093fef72767dd28ab04214b3442083"
+ integrity sha512-rAqDYFv3yzMrq7GIcen3XP7TUEG/4LK86LUPMIz6RT8A6pRIDn0sDcvjudVZBiiTcZCY9y2SgYX2lgK3AF+1eg==
+
+"@esbuild/linux-s390x@0.25.5":
+ version "0.25.5"
+ resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.25.5.tgz#5669af81327a398a336d7e40e320b5bbd6e6e72d"
+ integrity sha512-K2dSKTKfmdh78uJ3NcWFiqyRrimfdinS5ErLSn3vluHNeHVnBAFWC8a4X5N+7FgVE1EjXS1QDZbpqZBjfrqMTQ==
+
+"@esbuild/linux-s390x@0.25.8":
+ version "0.25.8"
+ resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.25.8.tgz#ddfed266c8c13f5efb3105a0cd47f6dcd0e79e71"
+ integrity sha512-Xutvh6VjlbcHpsIIbwY8GVRbwoviWT19tFhgdA7DlenLGC/mbc3lBoVb7jxj9Z+eyGqvcnSyIltYUrkKzWqSvg==
+
+"@esbuild/linux-x64@0.25.5":
+ version "0.25.5"
+ resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.25.5.tgz#b2357dd153aa49038967ddc1ffd90c68a9d2a0d4"
+ integrity sha512-uhj8N2obKTE6pSZ+aMUbqq+1nXxNjZIIjCjGLfsWvVpy7gKCOL6rsY1MhRh9zLtUtAI7vpgLMK6DxjO8Qm9lJw==
+
+"@esbuild/linux-x64@0.25.8":
+ version "0.25.8"
+ resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.25.8.tgz#9a4f78c75c051e8c060183ebb39a269ba936a2ac"
+ integrity sha512-ASFQhgY4ElXh3nDcOMTkQero4b1lgubskNlhIfJrsH5OKZXDpUAKBlNS0Kx81jwOBp+HCeZqmoJuihTv57/jvQ==
+
+"@esbuild/netbsd-arm64@0.25.5":
+ version "0.25.5"
+ resolved "https://registry.yarnpkg.com/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.5.tgz#53b4dfb8fe1cee93777c9e366893bd3daa6ba63d"
+ integrity sha512-pwHtMP9viAy1oHPvgxtOv+OkduK5ugofNTVDilIzBLpoWAM16r7b/mxBvfpuQDpRQFMfuVr5aLcn4yveGvBZvw==
+
+"@esbuild/netbsd-arm64@0.25.8":
+ version "0.25.8"
+ resolved "https://registry.yarnpkg.com/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.8.tgz#902c80e1d678047926387230bc037e63e00697d0"
+ integrity sha512-d1KfruIeohqAi6SA+gENMuObDbEjn22olAR7egqnkCD9DGBG0wsEARotkLgXDu6c4ncgWTZJtN5vcgxzWRMzcw==
+
+"@esbuild/netbsd-x64@0.25.5":
+ version "0.25.5"
+ resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.25.5.tgz#a0206f6314ce7dc8713b7732703d0f58de1d1e79"
+ integrity sha512-WOb5fKrvVTRMfWFNCroYWWklbnXH0Q5rZppjq0vQIdlsQKuw6mdSihwSo4RV/YdQ5UCKKvBy7/0ZZYLBZKIbwQ==
+
+"@esbuild/netbsd-x64@0.25.8":
+ version "0.25.8"
+ resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.25.8.tgz#2d9eb4692add2681ff05a14ce99de54fbed7079c"
+ integrity sha512-nVDCkrvx2ua+XQNyfrujIG38+YGyuy2Ru9kKVNyh5jAys6n+l44tTtToqHjino2My8VAY6Lw9H7RI73XFi66Cg==
+
+"@esbuild/openbsd-arm64@0.25.5":
+ version "0.25.5"
+ resolved "https://registry.yarnpkg.com/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.5.tgz#2a796c87c44e8de78001d808c77d948a21ec22fd"
+ integrity sha512-7A208+uQKgTxHd0G0uqZO8UjK2R0DDb4fDmERtARjSHWxqMTye4Erz4zZafx7Di9Cv+lNHYuncAkiGFySoD+Mw==
+
+"@esbuild/openbsd-arm64@0.25.8":
+ version "0.25.8"
+ resolved "https://registry.yarnpkg.com/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.8.tgz#89c3b998c6de739db38ab7fb71a8a76b3fa84a45"
+ integrity sha512-j8HgrDuSJFAujkivSMSfPQSAa5Fxbvk4rgNAS5i3K+r8s1X0p1uOO2Hl2xNsGFppOeHOLAVgYwDVlmxhq5h+SQ==
+
+"@esbuild/openbsd-x64@0.25.5":
+ version "0.25.5"
+ resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.25.5.tgz#28d0cd8909b7fa3953af998f2b2ed34f576728f0"
+ integrity sha512-G4hE405ErTWraiZ8UiSoesH8DaCsMm0Cay4fsFWOOUcz8b8rC6uCvnagr+gnioEjWn0wC+o1/TAHt+It+MpIMg==
+
+"@esbuild/openbsd-x64@0.25.8":
+ version "0.25.8"
+ resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.25.8.tgz#2f01615cf472b0e48c077045cfd96b5c149365cc"
+ integrity sha512-1h8MUAwa0VhNCDp6Af0HToI2TJFAn1uqT9Al6DJVzdIBAd21m/G0Yfc77KDM3uF3T/YaOgQq3qTJHPbTOInaIQ==
+
+"@esbuild/openharmony-arm64@0.25.8":
+ version "0.25.8"
+ resolved "https://registry.yarnpkg.com/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.8.tgz#a201f720cd2c3ebf9a6033fcc3feb069a54b509a"
+ integrity sha512-r2nVa5SIK9tSWd0kJd9HCffnDHKchTGikb//9c7HX+r+wHYCpQrSgxhlY6KWV1nFo1l4KFbsMlHk+L6fekLsUg==
+
+"@esbuild/sunos-x64@0.25.5":
+ version "0.25.5"
+ resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.25.5.tgz#a28164f5b997e8247d407e36c90d3fd5ddbe0dc5"
+ integrity sha512-l+azKShMy7FxzY0Rj4RCt5VD/q8mG/e+mDivgspo+yL8zW7qEwctQ6YqKX34DTEleFAvCIUviCFX1SDZRSyMQA==
+
+"@esbuild/sunos-x64@0.25.8":
+ version "0.25.8"
+ resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.25.8.tgz#07046c977985a3334667f19e6ab3a01a80862afb"
+ integrity sha512-zUlaP2S12YhQ2UzUfcCuMDHQFJyKABkAjvO5YSndMiIkMimPmxA+BYSBikWgsRpvyxuRnow4nS5NPnf9fpv41w==
+
+"@esbuild/win32-arm64@0.25.5":
+ version "0.25.5"
+ resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.25.5.tgz#6eadbead38e8bd12f633a5190e45eff80e24007e"
+ integrity sha512-O2S7SNZzdcFG7eFKgvwUEZ2VG9D/sn/eIiz8XRZ1Q/DO5a3s76Xv0mdBzVM5j5R639lXQmPmSo0iRpHqUUrsxw==
+
+"@esbuild/win32-arm64@0.25.8":
+ version "0.25.8"
+ resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.25.8.tgz#4a5470caf0d16127c05d4833d4934213c69392d1"
+ integrity sha512-YEGFFWESlPva8hGL+zvj2z/SaK+pH0SwOM0Nc/d+rVnW7GSTFlLBGzZkuSU9kFIGIo8q9X3ucpZhu8PDN5A2sQ==
+
+"@esbuild/win32-ia32@0.25.5":
+ version "0.25.5"
+ resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.25.5.tgz#bab6288005482f9ed2adb9ded7e88eba9a62cc0d"
+ integrity sha512-onOJ02pqs9h1iMJ1PQphR+VZv8qBMQ77Klcsqv9CNW2w6yLqoURLcgERAIurY6QE63bbLuqgP9ATqajFLK5AMQ==
+
+"@esbuild/win32-ia32@0.25.8":
+ version "0.25.8"
+ resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.25.8.tgz#3de3e8470b7b328d99dbc3e9ec1eace207e5bbc4"
+ integrity sha512-hiGgGC6KZ5LZz58OL/+qVVoZiuZlUYlYHNAmczOm7bs2oE1XriPFi5ZHHrS8ACpV5EjySrnoCKmcbQMN+ojnHg==
+
+"@esbuild/win32-x64@0.25.5":
+ version "0.25.5"
+ resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.25.5.tgz#7fc114af5f6563f19f73324b5d5ff36ece0803d1"
+ integrity sha512-TXv6YnJ8ZMVdX+SXWVBo/0p8LTcrUYngpWjvm91TMjjBQii7Oz11Lw5lbDV5Y0TzuhSJHwiH4hEtC1I42mMS0g==
+
+"@esbuild/win32-x64@0.25.8":
+ version "0.25.8"
+ resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.25.8.tgz#610d7ea539d2fcdbe39237b5cc175eb2c4451f9c"
+ integrity sha512-cn3Yr7+OaaZq1c+2pe+8yxC8E144SReCQjN6/2ynubzYjvyqZjTXfQJpAcQpsdJq3My7XADANiYGHoFC69pLQw==
+
+"@eslint-community/eslint-utils@^4.2.0", "@eslint-community/eslint-utils@^4.4.0", "@eslint-community/eslint-utils@^4.7.0":
+ version "4.7.0"
+ resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.7.0.tgz#607084630c6c033992a082de6e6fbc1a8b52175a"
+ integrity sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw==
dependencies:
eslint-visitor-keys "^3.4.3"
@@ -553,60 +709,53 @@
integrity sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==
"@eslint/compat@^1.2.5":
- version "1.2.8"
- resolved "https://registry.yarnpkg.com/@eslint/compat/-/compat-1.2.8.tgz#6baa38061ca8850199bf5a322afab34537ba3621"
- integrity sha512-LqCYHdWL/QqKIJuZ/ucMAv8d4luKGs4oCPgpt8mWztQAtPrHfXKQ/XAUc8ljCHAfJCn6SvkpTcGt5Tsh8saowA==
+ version "1.3.1"
+ resolved "https://registry.yarnpkg.com/@eslint/compat/-/compat-1.3.1.tgz#19f62ee48896d38f8eab591bee2a25dd69abc273"
+ integrity sha512-k8MHony59I5EPic6EQTCNOuPoVBnoYXkP+20xvwFjN7t0qI3ImyvyBgg+hIVPwC8JaxVjjUZld+cLfBLFDLucg==
-"@eslint/config-array@^0.20.0":
- version "0.20.0"
- resolved "https://registry.yarnpkg.com/@eslint/config-array/-/config-array-0.20.0.tgz#7a1232e82376712d3340012a2f561a2764d1988f"
- integrity sha512-fxlS1kkIjx8+vy2SjuCB94q3htSNrufYTXubwiBFeaQHbH6Ipi43gFJq2zCMt6PHhImH3Xmr0NksKDvchWlpQQ==
+"@eslint/config-array@^0.21.0":
+ version "0.21.0"
+ resolved "https://registry.yarnpkg.com/@eslint/config-array/-/config-array-0.21.0.tgz#abdbcbd16b124c638081766392a4d6b509f72636"
+ integrity sha512-ENIdc4iLu0d93HeYirvKmrzshzofPw6VkZRKQGe9Nv46ZnWUzcF1xV01dcvEg/1wXUR61OmmlSfyeyO7EvjLxQ==
dependencies:
"@eslint/object-schema" "^2.1.6"
debug "^4.3.1"
minimatch "^3.1.2"
-"@eslint/config-helpers@^0.2.0":
- version "0.2.1"
- resolved "https://registry.yarnpkg.com/@eslint/config-helpers/-/config-helpers-0.2.1.tgz#26042c028d1beee5ce2235a7929b91c52651646d"
- integrity sha512-RI17tsD2frtDu/3dmI7QRrD4bedNKPM08ziRYaC5AhkGrzIAJelm9kJU1TznK+apx6V+cqRz8tfpEeG3oIyjxw==
+"@eslint/config-helpers@^0.3.0":
+ version "0.3.0"
+ resolved "https://registry.yarnpkg.com/@eslint/config-helpers/-/config-helpers-0.3.0.tgz#3e09a90dfb87e0005c7694791e58e97077271286"
+ integrity sha512-ViuymvFmcJi04qdZeDc2whTHryouGcDlaxPqarTD0ZE10ISpxGUVZGZDx4w01upyIynL3iu6IXH2bS1NhclQMw==
-"@eslint/config-inspector@^1.0.2":
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/@eslint/config-inspector/-/config-inspector-1.0.2.tgz#2e2dee499eb66ba61211d793b849319aec64b3e3"
- integrity sha512-lPo4ijqq/xA2eVXpfc9jdTN4Y1YTFLBXF1TpgxGqwBFymrpSl5IbxEPcEq7v82xv94EuQsGCqzI/QVMZ16cafg==
+"@eslint/config-inspector@^1.1.0":
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/@eslint/config-inspector/-/config-inspector-1.1.0.tgz#965ce2a9fdad28f11e63077248068bb4c94a9f7d"
+ integrity sha512-DQGzRGV6jKujyxxCPlhwwyzq3HTW/NbFX9A4npPjW0+0A3KemxYJWZdwqJn4rauPsRUpJ8yuh5uOyMCChrnFsg==
dependencies:
"@nodelib/fs.walk" "^3.0.1"
- ansis "^3.17.0"
+ ansis "^4.1.0"
bundle-require "^5.1.0"
cac "^6.7.14"
chokidar "^4.0.3"
- debug "^4.4.0"
- esbuild "^0.25.0"
+ debug "^4.4.1"
+ esbuild "^0.25.5"
find-up "^7.0.0"
get-port-please "^3.1.2"
- h3 "^1.15.1"
+ h3 "^1.15.3"
mlly "^1.7.4"
mrmime "^2.0.1"
- open "^10.1.0"
- tinyglobby "^0.2.12"
- ws "^8.18.1"
+ open "^10.1.2"
+ tinyglobby "^0.2.14"
+ ws "^8.18.2"
-"@eslint/core@^0.12.0":
- version "0.12.0"
- resolved "https://registry.yarnpkg.com/@eslint/core/-/core-0.12.0.tgz#5f960c3d57728be9f6c65bd84aa6aa613078798e"
- integrity sha512-cmrR6pytBuSMTaBweKoGMwu3EiHiEC+DoyupPmlZ0HxBJBtIxwe+j/E4XPIKNx+Q74c8lXKPwYawBf5glsTkHg==
+"@eslint/core@^0.15.0", "@eslint/core@^0.15.1":
+ version "0.15.1"
+ resolved "https://registry.yarnpkg.com/@eslint/core/-/core-0.15.1.tgz#d530d44209cbfe2f82ef86d6ba08760196dd3b60"
+ integrity sha512-bkOp+iumZCCbt1K1CmWf0R9pM5yKpDv+ZXtvSyQpudrI9kuFLp+bM2WOPXImuD/ceQuaa8f5pj93Y7zyECIGNA==
dependencies:
"@types/json-schema" "^7.0.15"
-"@eslint/core@^0.13.0":
- version "0.13.0"
- resolved "https://registry.yarnpkg.com/@eslint/core/-/core-0.13.0.tgz#bf02f209846d3bf996f9e8009db62df2739b458c"
- integrity sha512-yfkgDw1KR66rkT5A8ci4irzDysN7FRpq3ttJolR88OqQikAWqwA8j5VZyas+vjyBNFIJ7MfybJ9plMILI2UrCw==
- dependencies:
- "@types/json-schema" "^7.0.15"
-
-"@eslint/eslintrc@^3.3.1":
+"@eslint/eslintrc@^3.0.0", "@eslint/eslintrc@^3.3.1":
version "3.3.1"
resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-3.3.1.tgz#e55f7f1dd400600dd066dbba349c4c0bac916964"
integrity sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==
@@ -621,22 +770,22 @@
minimatch "^3.1.2"
strip-json-comments "^3.1.1"
-"@eslint/js@9.24.0", "@eslint/js@^9.23.0":
- version "9.24.0"
- resolved "https://registry.yarnpkg.com/@eslint/js/-/js-9.24.0.tgz#685277980bb7bf84ecc8e4e133ccdda7545a691e"
- integrity sha512-uIY/y3z0uvOGX8cp1C2fiC4+ZmBhp6yZWkojtHL1YEMnRt1Y63HB9TM17proGEmeG7HeUY+UP36F0aknKYTpYA==
+"@eslint/js@9.31.0", "@eslint/js@^9.31.0":
+ version "9.31.0"
+ resolved "https://registry.yarnpkg.com/@eslint/js/-/js-9.31.0.tgz#adb1f39953d8c475c4384b67b67541b0d7206ed8"
+ integrity sha512-LOm5OVt7D4qiKCqoiPbA7LWmI+tbw1VbTUowBcUMgQSuM6poJufkFkYDcQpo5KfgD39TnNySV26QjOh7VFpSyw==
"@eslint/object-schema@^2.1.6":
version "2.1.6"
resolved "https://registry.yarnpkg.com/@eslint/object-schema/-/object-schema-2.1.6.tgz#58369ab5b5b3ca117880c0f6c0b0f32f6950f24f"
integrity sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==
-"@eslint/plugin-kit@^0.2.7":
- version "0.2.8"
- resolved "https://registry.yarnpkg.com/@eslint/plugin-kit/-/plugin-kit-0.2.8.tgz#47488d8f8171b5d4613e833313f3ce708e3525f8"
- integrity sha512-ZAoA40rNMPwSm+AeHpCq8STiNAwzWLJuP8Xv4CHIc9wv/PSuExjMrmjfYNj682vW0OOiZ1HKxzvjQr9XZIisQA==
+"@eslint/plugin-kit@^0.3.1", "@eslint/plugin-kit@^0.3.3":
+ version "0.3.4"
+ resolved "https://registry.yarnpkg.com/@eslint/plugin-kit/-/plugin-kit-0.3.4.tgz#c6b9f165e94bf4d9fdd493f1c028a94aaf5fc1cc"
+ integrity sha512-Ul5l+lHEcw3L5+k8POx6r74mxEYKG5kOb6Xpy2gCRW6zweT6TEhAf8vhxGgjhqrd/VO/Dirhsb+1hNpD1ue9hw==
dependencies:
- "@eslint/core" "^0.13.0"
+ "@eslint/core" "^0.15.1"
levn "^0.4.1"
"@fastify/accept-negotiator@^1.1.0":
@@ -644,6 +793,11 @@
resolved "https://registry.yarnpkg.com/@fastify/accept-negotiator/-/accept-negotiator-1.1.0.tgz#c1c66b3b771c09742a54dd5bc87c582f6b0630ff"
integrity sha512-OIHZrb2ImZ7XG85HXOONLcJWGosv7sIvM2ifAPQVhg9Lv7qdmMBNVaai4QTdyuaqbKM5eO6sLSQOYI7wEQeCJQ==
+"@fastify/busboy@^3.1.1":
+ version "3.1.1"
+ resolved "https://registry.yarnpkg.com/@fastify/busboy/-/busboy-3.1.1.tgz#af3aea7f1e52ec916d8b5c9dcc0f09d4c060a3fc"
+ integrity sha512-5DGmA8FTdB2XbDeEwc/5ZXBl6UbBAyBOOLlPuBnZ/N1SwdH9Ii+cOX3tBROlDgcTXxjOYnLMVoKk9+FXAw0CJw==
+
"@headlessui/vue@^1.7.23":
version "1.7.23"
resolved "https://registry.yarnpkg.com/@headlessui/vue/-/vue-1.7.23.tgz#7fe19dbeca35de9e6270c82c78c4864e6a6f7391"
@@ -680,128 +834,159 @@
integrity sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==
"@humanwhocodes/retry@^0.4.2":
- version "0.4.2"
- resolved "https://registry.yarnpkg.com/@humanwhocodes/retry/-/retry-0.4.2.tgz#1860473de7dfa1546767448f333db80cb0ff2161"
- integrity sha512-xeO57FpIu4p1Ri3Jq/EXq4ClRm86dVF2z/+kvFnyqVYRavTZmaFaUBbWCOuuTh0o/g7DSsk6kc2vrS4Vl5oPOQ==
+ version "0.4.3"
+ resolved "https://registry.yarnpkg.com/@humanwhocodes/retry/-/retry-0.4.3.tgz#c2b9d2e374ee62c586d3adbea87199b1d7a7a6ba"
+ integrity sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==
-"@img/sharp-darwin-arm64@0.33.5":
- version "0.33.5"
- resolved "https://registry.yarnpkg.com/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.33.5.tgz#ef5b5a07862805f1e8145a377c8ba6e98813ca08"
- integrity sha512-UT4p+iz/2H4twwAoLCqfA9UH5pI6DggwKEGuaPy7nCVQ8ZsiY5PIcrRvD1DzuY3qYL07NtIQcWnBSY/heikIFQ==
- optionalDependencies:
- "@img/sharp-libvips-darwin-arm64" "1.0.4"
-
-"@img/sharp-darwin-x64@0.33.5":
- version "0.33.5"
- resolved "https://registry.yarnpkg.com/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.33.5.tgz#e03d3451cd9e664faa72948cc70a403ea4063d61"
- integrity sha512-fyHac4jIc1ANYGRDxtiqelIbdWkIuQaI84Mv45KvGRRxSAa7o7d1ZKAOBaYbnepLC1WqxfpimdeWfvqqSGwR2Q==
- optionalDependencies:
- "@img/sharp-libvips-darwin-x64" "1.0.4"
-
-"@img/sharp-libvips-darwin-arm64@1.0.4":
- version "1.0.4"
- resolved "https://registry.yarnpkg.com/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.0.4.tgz#447c5026700c01a993c7804eb8af5f6e9868c07f"
- integrity sha512-XblONe153h0O2zuFfTAbQYAX2JhYmDHeWikp1LM9Hul9gVPjFY427k6dFEcOL72O01QxQsWi761svJ/ev9xEDg==
-
-"@img/sharp-libvips-darwin-x64@1.0.4":
- version "1.0.4"
- resolved "https://registry.yarnpkg.com/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.0.4.tgz#e0456f8f7c623f9dbfbdc77383caa72281d86062"
- integrity sha512-xnGR8YuZYfJGmWPvmlunFaWJsb9T/AO2ykoP3Fz/0X5XV2aoYBPkX6xqCQvUTKKiLddarLaxpzNe+b1hjeWHAQ==
-
-"@img/sharp-libvips-linux-arm64@1.0.4":
- version "1.0.4"
- resolved "https://registry.yarnpkg.com/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.0.4.tgz#979b1c66c9a91f7ff2893556ef267f90ebe51704"
- integrity sha512-9B+taZ8DlyyqzZQnoeIvDVR/2F4EbMepXMc/NdVbkzsJbzkUjhXv/70GQJ7tdLA4YJgNP25zukcxpX2/SueNrA==
-
-"@img/sharp-libvips-linux-arm@1.0.5":
- version "1.0.5"
- resolved "https://registry.yarnpkg.com/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.0.5.tgz#99f922d4e15216ec205dcb6891b721bfd2884197"
- integrity sha512-gvcC4ACAOPRNATg/ov8/MnbxFDJqf/pDePbBnuBDcjsI8PssmjoKMAz4LtLaVi+OnSb5FK/yIOamqDwGmXW32g==
-
-"@img/sharp-libvips-linux-s390x@1.0.4":
- version "1.0.4"
- resolved "https://registry.yarnpkg.com/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.0.4.tgz#f8a5eb1f374a082f72b3f45e2fb25b8118a8a5ce"
- integrity sha512-u7Wz6ntiSSgGSGcjZ55im6uvTrOxSIS8/dgoVMoiGE9I6JAfU50yH5BoDlYA1tcuGS7g/QNtetJnxA6QEsCVTA==
-
-"@img/sharp-libvips-linux-x64@1.0.4":
- version "1.0.4"
- resolved "https://registry.yarnpkg.com/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.0.4.tgz#d4c4619cdd157774906e15770ee119931c7ef5e0"
- integrity sha512-MmWmQ3iPFZr0Iev+BAgVMb3ZyC4KeFc3jFxnNbEPas60e1cIfevbtuyf9nDGIzOaW9PdnDciJm+wFFaTlj5xYw==
-
-"@img/sharp-libvips-linuxmusl-arm64@1.0.4":
- version "1.0.4"
- resolved "https://registry.yarnpkg.com/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.0.4.tgz#166778da0f48dd2bded1fa3033cee6b588f0d5d5"
- integrity sha512-9Ti+BbTYDcsbp4wfYib8Ctm1ilkugkA/uscUn6UXK1ldpC1JjiXbLfFZtRlBhjPZ5o1NCLiDbg8fhUPKStHoTA==
-
-"@img/sharp-libvips-linuxmusl-x64@1.0.4":
- version "1.0.4"
- resolved "https://registry.yarnpkg.com/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.0.4.tgz#93794e4d7720b077fcad3e02982f2f1c246751ff"
- integrity sha512-viYN1KX9m+/hGkJtvYYp+CCLgnJXwiQB39damAO7WMdKWlIhmYTfHjwSbQeUK/20vY154mwezd9HflVFM1wVSw==
-
-"@img/sharp-linux-arm64@0.33.5":
- version "0.33.5"
- resolved "https://registry.yarnpkg.com/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.33.5.tgz#edb0697e7a8279c9fc829a60fc35644c4839bb22"
- integrity sha512-JMVv+AMRyGOHtO1RFBiJy/MBsgz0x4AWrT6QoEVVTyh1E39TrCUpTRI7mx9VksGX4awWASxqCYLCV4wBZHAYxA==
- optionalDependencies:
- "@img/sharp-libvips-linux-arm64" "1.0.4"
-
-"@img/sharp-linux-arm@0.33.5":
- version "0.33.5"
- resolved "https://registry.yarnpkg.com/@img/sharp-linux-arm/-/sharp-linux-arm-0.33.5.tgz#422c1a352e7b5832842577dc51602bcd5b6f5eff"
- integrity sha512-JTS1eldqZbJxjvKaAkxhZmBqPRGmxgu+qFKSInv8moZ2AmT5Yib3EQ1c6gp493HvrvV8QgdOXdyaIBrhvFhBMQ==
- optionalDependencies:
- "@img/sharp-libvips-linux-arm" "1.0.5"
-
-"@img/sharp-linux-s390x@0.33.5":
- version "0.33.5"
- resolved "https://registry.yarnpkg.com/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.33.5.tgz#f5c077926b48e97e4a04d004dfaf175972059667"
- integrity sha512-y/5PCd+mP4CA/sPDKl2961b+C9d+vPAveS33s6Z3zfASk2j5upL6fXVPZi7ztePZ5CuH+1kW8JtvxgbuXHRa4Q==
- optionalDependencies:
- "@img/sharp-libvips-linux-s390x" "1.0.4"
-
-"@img/sharp-linux-x64@0.33.5":
- version "0.33.5"
- resolved "https://registry.yarnpkg.com/@img/sharp-linux-x64/-/sharp-linux-x64-0.33.5.tgz#d806e0afd71ae6775cc87f0da8f2d03a7c2209cb"
- integrity sha512-opC+Ok5pRNAzuvq1AG0ar+1owsu842/Ab+4qvU879ippJBHvyY5n2mxF1izXqkPYlGuP/M556uh53jRLJmzTWA==
- optionalDependencies:
- "@img/sharp-libvips-linux-x64" "1.0.4"
-
-"@img/sharp-linuxmusl-arm64@0.33.5":
- version "0.33.5"
- resolved "https://registry.yarnpkg.com/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.33.5.tgz#252975b915894fb315af5deea174651e208d3d6b"
- integrity sha512-XrHMZwGQGvJg2V/oRSUfSAfjfPxO+4DkiRh6p2AFjLQztWUuY/o8Mq0eMQVIY7HJ1CDQUJlxGGZRw1a5bqmd1g==
- optionalDependencies:
- "@img/sharp-libvips-linuxmusl-arm64" "1.0.4"
-
-"@img/sharp-linuxmusl-x64@0.33.5":
- version "0.33.5"
- resolved "https://registry.yarnpkg.com/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.33.5.tgz#3f4609ac5d8ef8ec7dadee80b560961a60fd4f48"
- integrity sha512-WT+d/cgqKkkKySYmqoZ8y3pxx7lx9vVejxW/W4DOFMYVSkErR+w7mf2u8m/y4+xHe7yY9DAXQMWQhpnMuFfScw==
- optionalDependencies:
- "@img/sharp-libvips-linuxmusl-x64" "1.0.4"
-
-"@img/sharp-wasm32@0.33.5":
- version "0.33.5"
- resolved "https://registry.yarnpkg.com/@img/sharp-wasm32/-/sharp-wasm32-0.33.5.tgz#6f44f3283069d935bb5ca5813153572f3e6f61a1"
- integrity sha512-ykUW4LVGaMcU9lu9thv85CbRMAwfeadCJHRsg2GmeRa/cJxsVY9Rbd57JcMxBkKHag5U/x7TSBpScF4U8ElVzg==
+"@intlify/bundle-utils@^10.0.1":
+ version "10.0.1"
+ resolved "https://registry.yarnpkg.com/@intlify/bundle-utils/-/bundle-utils-10.0.1.tgz#6416e1c327bcc3b3579d803dc9bbe0d30ec0b012"
+ integrity sha512-WkaXfSevtpgtUR4t8K2M6lbR7g03mtOxFeh+vXp5KExvPqS12ppaRj1QxzwRuRI5VUto54A22BjKoBMLyHILWQ==
dependencies:
- "@emnapi/runtime" "^1.2.0"
+ "@intlify/message-compiler" "^11.1.2"
+ "@intlify/shared" "^11.1.2"
+ acorn "^8.8.2"
+ escodegen "^2.1.0"
+ estree-walker "^2.0.2"
+ jsonc-eslint-parser "^2.3.0"
+ mlly "^1.2.0"
+ source-map-js "^1.0.1"
+ yaml-eslint-parser "^1.2.2"
-"@img/sharp-win32-ia32@0.33.5":
- version "0.33.5"
- resolved "https://registry.yarnpkg.com/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.33.5.tgz#1a0c839a40c5351e9885628c85f2e5dfd02b52a9"
- integrity sha512-T36PblLaTwuVJ/zw/LaH0PdZkRz5rd3SmMHX8GSmR7vtNSP5Z6bQkExdSK7xGWyxLw4sUknBuugTelgw2faBbQ==
+"@intlify/core-base@10.0.8":
+ version "10.0.8"
+ resolved "https://registry.yarnpkg.com/@intlify/core-base/-/core-base-10.0.8.tgz#2fcf46bab72d4daa8575eb11e04a549ea4030ac3"
+ integrity sha512-FoHslNWSoHjdUBLy35bpm9PV/0LVI/DSv9L6Km6J2ad8r/mm0VaGg06C40FqlE8u2ADcGUM60lyoU7Myo4WNZQ==
+ dependencies:
+ "@intlify/message-compiler" "10.0.8"
+ "@intlify/shared" "10.0.8"
-"@img/sharp-win32-x64@0.33.5":
- version "0.33.5"
- resolved "https://registry.yarnpkg.com/@img/sharp-win32-x64/-/sharp-win32-x64-0.33.5.tgz#56f00962ff0c4e0eb93d34a047d29fa995e3e342"
- integrity sha512-MpY/o8/8kj+EcnxwvrP4aTJSWw/aZ7JIGR4aBeZkZw5B7/Jn+tY9/VNwtcoGmdT7GfggGIU4kygOMSbYnOrAbg==
+"@intlify/core-base@^11.0.0":
+ version "11.1.11"
+ resolved "https://registry.yarnpkg.com/@intlify/core-base/-/core-base-11.1.11.tgz#e36893a7d37a3a75fae30977fc58c1d8cf3c853f"
+ integrity sha512-1Z0N8jTfkcD2Luq9HNZt+GmjpFe4/4PpZF3AOzoO1u5PTtSuXZcfhwBatywbfE2ieB/B5QHIoOFmCXY2jqVKEQ==
+ dependencies:
+ "@intlify/message-compiler" "11.1.11"
+ "@intlify/shared" "11.1.11"
+
+"@intlify/core@^10.0.3":
+ version "10.0.8"
+ resolved "https://registry.yarnpkg.com/@intlify/core/-/core-10.0.8.tgz#ab7b38cd5930d076e20ad320ee7324e2497e729f"
+ integrity sha512-2BbgN0aeuYHOHe7kVlTr2XxyrnLQZ/4/Y0Pw8luU67723+AqVYqxB7ZG1FzLCVNwAmzdVZMjKzFpgOzdUSdBfw==
+ dependencies:
+ "@intlify/core-base" "10.0.8"
+ "@intlify/shared" "10.0.8"
+
+"@intlify/eslint-plugin-vue-i18n@^4.0.1":
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/@intlify/eslint-plugin-vue-i18n/-/eslint-plugin-vue-i18n-4.0.1.tgz#c7d0c6379b2daea6270b641ea860720e720115dc"
+ integrity sha512-xZKG7EvMvvumK9sdpnt6Dxa/dxV6/05/hRXIgJc0XI4l0+QUnyfdz5qXEvDm21T+OQsFN0CK/C+p0Fpra2wscQ==
+ dependencies:
+ "@eslint/eslintrc" "^3.0.0"
+ "@intlify/core-base" "^11.0.0"
+ "@intlify/message-compiler" "^11.0.0"
+ debug "^4.3.4"
+ eslint-compat-utils "^0.6.0"
+ glob "^10.3.3"
+ globals "^16.0.0"
+ ignore "^7.0.0"
+ import-fresh "^3.3.0"
+ is-language-code "^3.1.0"
+ js-yaml "^4.1.0"
+ json5 "^2.2.3"
+ lodash "^4.17.21"
+ parse5 "^7.1.2"
+ semver "^7.5.4"
+ synckit "^0.10.0"
+
+"@intlify/h3@^0.6.1":
+ version "0.6.1"
+ resolved "https://registry.yarnpkg.com/@intlify/h3/-/h3-0.6.1.tgz#ded9e5f71864f63e4ee50923dff53389dea7ff41"
+ integrity sha512-hFMcqWXCoFNZkraa+JF7wzByGdE0vGi8rUs7CTFrE4hE3X2u9QcelH8VRO8mPgJDH+TgatzvrVp6iZsWVluk2A==
+ dependencies:
+ "@intlify/core" "^10.0.3"
+ "@intlify/utils" "^0.13.0"
+
+"@intlify/message-compiler@10.0.8":
+ version "10.0.8"
+ resolved "https://registry.yarnpkg.com/@intlify/message-compiler/-/message-compiler-10.0.8.tgz#48aee742916f8aaa43945682f32bec1c9e73e2f8"
+ integrity sha512-DV+sYXIkHVd5yVb2mL7br/NEUwzUoLBsMkV3H0InefWgmYa34NLZUvMCGi5oWX+Hqr2Y2qUxnVrnOWF4aBlgWg==
+ dependencies:
+ "@intlify/shared" "10.0.8"
+ source-map-js "^1.0.2"
+
+"@intlify/message-compiler@11.1.11", "@intlify/message-compiler@^11.0.0", "@intlify/message-compiler@^11.1.2":
+ version "11.1.11"
+ resolved "https://registry.yarnpkg.com/@intlify/message-compiler/-/message-compiler-11.1.11.tgz#ba10641f86af0e991ac9def0385bd345c8f150fb"
+ integrity sha512-7PC6neomoc/z7a8JRjPBbu0T2TzR2MQuY5kn2e049MP7+o32Ve7O8husylkA7K9fQRe4iNXZWTPnDJ6vZdtS1Q==
+ dependencies:
+ "@intlify/shared" "11.1.11"
+ source-map-js "^1.0.2"
+
+"@intlify/shared@10.0.8", "@intlify/shared@^10.0.0", "@intlify/shared@^10.0.7":
+ version "10.0.8"
+ resolved "https://registry.yarnpkg.com/@intlify/shared/-/shared-10.0.8.tgz#5f8019919dea8695b2e345257fc0cda7665d8ef9"
+ integrity sha512-BcmHpb5bQyeVNrptC3UhzpBZB/YHHDoEREOUERrmF2BRxsyOEuRrq+Z96C/D4+2KJb8kuHiouzAei7BXlG0YYw==
+
+"@intlify/shared@11.1.11", "@intlify/shared@^11.1.2":
+ version "11.1.11"
+ resolved "https://registry.yarnpkg.com/@intlify/shared/-/shared-11.1.11.tgz#6bba3b86617c05767356e4ca939c9e300563a083"
+ integrity sha512-RIBFTIqxZSsxUqlcyoR7iiC632bq7kkOwYvZlvcVObHfrF4NhuKc4FKvu8iPCrEO+e3XsY7/UVpfgzg+M7ETzA==
+
+"@intlify/unplugin-vue-i18n@^6.0.8":
+ version "6.0.8"
+ resolved "https://registry.yarnpkg.com/@intlify/unplugin-vue-i18n/-/unplugin-vue-i18n-6.0.8.tgz#2162dced28b01f7ea471b577ba10ecc4ba523d0d"
+ integrity sha512-Vvm3KhjE6TIBVUQAk37rBiaYy2M5OcWH0ZcI1XKEsOTeN1o0bErk+zeuXmcrcMc/73YggfI8RoxOUz9EB/69JQ==
+ dependencies:
+ "@eslint-community/eslint-utils" "^4.4.0"
+ "@intlify/bundle-utils" "^10.0.1"
+ "@intlify/shared" "^11.1.2"
+ "@intlify/vue-i18n-extensions" "^8.0.0"
+ "@rollup/pluginutils" "^5.1.0"
+ "@typescript-eslint/scope-manager" "^8.13.0"
+ "@typescript-eslint/typescript-estree" "^8.13.0"
+ debug "^4.3.3"
+ fast-glob "^3.2.12"
+ js-yaml "^4.1.0"
+ json5 "^2.2.3"
+ pathe "^1.0.0"
+ picocolors "^1.0.0"
+ source-map-js "^1.0.2"
+ unplugin "^1.1.0"
+ vue "^3.4"
+
+"@intlify/utils@^0.13.0":
+ version "0.13.0"
+ resolved "https://registry.yarnpkg.com/@intlify/utils/-/utils-0.13.0.tgz#bea7014796b633a9f4d312833642d33b38755cba"
+ integrity sha512-8i3uRdAxCGzuHwfmHcVjeLQBtysQB2aXl/ojoagDut5/gY5lvWCQ2+cnl2TiqE/fXj/D8EhWG/SLKA7qz4a3QA==
+
+"@intlify/vue-i18n-extensions@^8.0.0":
+ version "8.0.0"
+ resolved "https://registry.yarnpkg.com/@intlify/vue-i18n-extensions/-/vue-i18n-extensions-8.0.0.tgz#84adc3f40829ee144f056b774a77d838ce3f5034"
+ integrity sha512-w0+70CvTmuqbskWfzeYhn0IXxllr6mU+IeM2MU0M+j9OW64jkrvqY+pYFWrUnIIC9bEdij3NICruicwd5EgUuQ==
+ dependencies:
+ "@babel/parser" "^7.24.6"
+ "@intlify/shared" "^10.0.0"
+ "@vue/compiler-dom" "^3.2.45"
+ vue-i18n "^10.0.0"
"@ioredis/commands@^1.1.1":
version "1.2.0"
resolved "https://registry.yarnpkg.com/@ioredis/commands/-/commands-1.2.0.tgz#6d61b3097470af1fdbbe622795b8921d42018e11"
integrity sha512-Sx1pU8EM64o2BrqNpEO1CNLtKQwyhuXuqyfH7oGKCk+1a33d2r5saW8zNwm3j6BTExtjrv2BxTgzzkMwts6vGg==
+"@isaacs/balanced-match@^4.0.1":
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/@isaacs/balanced-match/-/balanced-match-4.0.1.tgz#3081dadbc3460661b751e7591d7faea5df39dd29"
+ integrity sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ==
+
+"@isaacs/brace-expansion@^5.0.0":
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/@isaacs/brace-expansion/-/brace-expansion-5.0.0.tgz#4b3dabab7d8e75a429414a96bd67bf4c1d13e0f3"
+ integrity sha512-ZT55BDLV0yv0RBm2czMiZ+SqCGO7AvmOM3G/w2xhVPH+te0aKgFjmBvGlL1dH+ql2tgGO3MVrbb3jCKyvpgnxA==
+ dependencies:
+ "@isaacs/balanced-match" "^4.0.1"
+
"@isaacs/cliui@^8.0.2":
version "8.0.2"
resolved "https://registry.yarnpkg.com/@isaacs/cliui/-/cliui-8.0.2.tgz#b37667b7bc181c168782259bab42474fbf52b550"
@@ -821,13 +1006,12 @@
dependencies:
minipass "^7.0.4"
-"@jridgewell/gen-mapping@^0.3.5":
- version "0.3.8"
- resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz#4f0e06362e01362f823d348f1872b08f666d8142"
- integrity sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==
+"@jridgewell/gen-mapping@^0.3.12", "@jridgewell/gen-mapping@^0.3.5":
+ version "0.3.12"
+ resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.12.tgz#2234ce26c62889f03db3d7fea43c1932ab3e927b"
+ integrity sha512-OuLGC46TjB5BbN1dH8JULVVZY4WTdkF7tV9Ys6wLL1rubZnCMstOhNHueU5bLCrnRuDhKPDM4g6sw4Bel5Gzqg==
dependencies:
- "@jridgewell/set-array" "^1.2.1"
- "@jridgewell/sourcemap-codec" "^1.4.10"
+ "@jridgewell/sourcemap-codec" "^1.5.0"
"@jridgewell/trace-mapping" "^0.3.24"
"@jridgewell/resolve-uri@^3.1.0":
@@ -835,37 +1019,27 @@
resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz#7a0ee601f60f99a20c7c7c5ff0c80388c1189bd6"
integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==
-"@jridgewell/set-array@^1.2.1":
- version "1.2.1"
- resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.2.1.tgz#558fb6472ed16a4c850b889530e6b36438c49280"
- integrity sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==
-
"@jridgewell/source-map@^0.3.3":
- version "0.3.6"
- resolved "https://registry.yarnpkg.com/@jridgewell/source-map/-/source-map-0.3.6.tgz#9d71ca886e32502eb9362c9a74a46787c36df81a"
- integrity sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==
+ version "0.3.10"
+ resolved "https://registry.yarnpkg.com/@jridgewell/source-map/-/source-map-0.3.10.tgz#a35714446a2e84503ff9bfe66f1d1d4846f2075b"
+ integrity sha512-0pPkgz9dY+bijgistcTTJ5mR+ocqRXLuhXHYdzoMmmoJ2C9S46RCm2GMUbatPEUK9Yjy26IrAy8D/M00lLkv+Q==
dependencies:
"@jridgewell/gen-mapping" "^0.3.5"
"@jridgewell/trace-mapping" "^0.3.25"
-"@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14", "@jridgewell/sourcemap-codec@^1.5.0":
- version "1.5.0"
- resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz#3188bcb273a414b0d215fd22a58540b989b9409a"
- integrity sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==
+"@jridgewell/sourcemap-codec@^1.4.14", "@jridgewell/sourcemap-codec@^1.5.0":
+ version "1.5.4"
+ resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.4.tgz#7358043433b2e5da569aa02cbc4c121da3af27d7"
+ integrity sha512-VT2+G1VQs/9oz078bLrYbecdZKs912zQlkelYpuf+SXF+QvZDYJlbx/LSx+meSAwdDFnF8FVXW92AVjjkVmgFw==
-"@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.25":
- version "0.3.25"
- resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz#15f190e98895f3fc23276ee14bc76b675c2e50f0"
- integrity sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==
+"@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.25", "@jridgewell/trace-mapping@^0.3.28":
+ version "0.3.29"
+ resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.29.tgz#a58d31eaadaf92c6695680b2e1d464a9b8fbf7fc"
+ integrity sha512-uw6guiW/gcAGPDhLmd77/6lW8QLeiV5RUTsAX46Db6oLhGaVj4lhnPwb184s1bkc8kdVg/+h988dro8GRDpmYQ==
dependencies:
"@jridgewell/resolve-uri" "^3.1.0"
"@jridgewell/sourcemap-codec" "^1.4.14"
-"@jsdevtools/ono@^7.1.3":
- version "7.1.3"
- resolved "https://registry.yarnpkg.com/@jsdevtools/ono/-/ono-7.1.3.tgz#9df03bbd7c696a5c58885c34aa06da41c8543796"
- integrity sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg==
-
"@kwsites/file-exists@^1.1.1":
version "1.1.1"
resolved "https://registry.yarnpkg.com/@kwsites/file-exists/-/file-exists-1.1.1.tgz#ad1efcac13e1987d8dbaf235ef3be5b0d96faa99"
@@ -878,6 +1052,14 @@
resolved "https://registry.yarnpkg.com/@kwsites/promise-deferred/-/promise-deferred-1.1.1.tgz#8ace5259254426ccef57f3175bc64ed7095ed919"
integrity sha512-GaHYm+c0O9MjZRu0ongGBRbinu8gVAMd2UZjji6jVmqKtZluZnptXGWhz1E8j8D2HJ3f/yMxKAUC0b+57wncIw==
+"@lobomfz/prismark@0.0.3":
+ version "0.0.3"
+ resolved "https://registry.yarnpkg.com/@lobomfz/prismark/-/prismark-0.0.3.tgz#8b4eb34963e96cf3fff01432e62de22f184f2f2d"
+ integrity sha512-g2xfR/F+sRBRUhWYlpUkafqZjqsQBetjfzdWvQndRU4wdoavn3zblM3OQwb7vrsrKB6Wmbs+DtLGaD5XBQ2v8A==
+ dependencies:
+ "@prisma/generator-helper" "^6.5.0"
+ arktype "^2.1.9"
+
"@mapbox/node-pre-gyp@^2.0.0":
version "2.0.0"
resolved "https://registry.yarnpkg.com/@mapbox/node-pre-gyp/-/node-pre-gyp-2.0.0.tgz#16d1d9049c0218820da81a12ae084e7fe67790d1"
@@ -896,26 +1078,129 @@
resolved "https://registry.yarnpkg.com/@mixmark-io/domino/-/domino-2.2.0.tgz#4e8ec69bf1afeb7a14f0628b7e2c0f35bdb336c3"
integrity sha512-Y28PR25bHXUg88kCV7nivXrP2Nj2RueZ3/l/jdx6J9f8J4nsEGcgX0Qe6lt7Pa+J79+kPiJU3LguR6O/6zrLOw==
-"@napi-rs/wasm-runtime@^0.2.7", "@napi-rs/wasm-runtime@^0.2.8":
- version "0.2.8"
- resolved "https://registry.yarnpkg.com/@napi-rs/wasm-runtime/-/wasm-runtime-0.2.8.tgz#642e8390ee78ed21d6b79c467aa610e249224ed6"
- integrity sha512-OBlgKdX7gin7OIq4fadsjpg+cp2ZphvAIKucHsNfTdJiqdOmOEwQd/bHi0VwNrcw5xpBJyUw6cK/QilCqy1BSg==
+"@miyaneee/rollup-plugin-json5@^1.2.0":
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/@miyaneee/rollup-plugin-json5/-/rollup-plugin-json5-1.2.0.tgz#a0995e55bfcf055aea0c9c73e0b2dcac120e036e"
+ integrity sha512-JjTIaXZp9WzhUHpElrqPnl1AzBi/rvRs065F71+aTmlqvTMVkdbjZ8vfFl4nRlgJy+TPBw69ZK4pwFdmOAt4aA==
dependencies:
- "@emnapi/core" "^1.4.0"
- "@emnapi/runtime" "^1.4.0"
- "@tybys/wasm-util" "^0.9.0"
+ "@rollup/pluginutils" "^5.1.0"
+ json5 "^2.2.3"
-"@netlify/functions@^3.0.2":
- version "3.0.4"
- resolved "https://registry.yarnpkg.com/@netlify/functions/-/functions-3.0.4.tgz#0668f0cb5995948624f8f597c29b4bcf0b1eb7fc"
- integrity sha512-Ox8+ABI+nsLK+c4/oC5dpquXuEIjzfTlJrdQKgQijCsDQoje7inXFAtKDLvvaGvuvE+PVpMLwQcIUL6P9Ob1hQ==
+"@napi-rs/wasm-runtime@^0.2.11", "@napi-rs/wasm-runtime@^0.2.9":
+ version "0.2.12"
+ resolved "https://registry.yarnpkg.com/@napi-rs/wasm-runtime/-/wasm-runtime-0.2.12.tgz#3e78a8b96e6c33a6c517e1894efbd5385a7cb6f2"
+ integrity sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ==
dependencies:
- "@netlify/serverless-functions-api" "1.36.0"
+ "@emnapi/core" "^1.4.3"
+ "@emnapi/runtime" "^1.4.3"
+ "@tybys/wasm-util" "^0.10.0"
-"@netlify/serverless-functions-api@1.36.0":
- version "1.36.0"
- resolved "https://registry.yarnpkg.com/@netlify/serverless-functions-api/-/serverless-functions-api-1.36.0.tgz#e7e9ce83d059c4c845440ec861a7e69c0d800bfa"
- integrity sha512-z6okREyK8in0486a22Oro0k+YsuyEjDXJt46FpgeOgXqKJ9ElM8QPll0iuLBkpbH33ENiNbIPLd1cuClRQnhiw==
+"@netlify/binary-info@^1.0.0":
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/@netlify/binary-info/-/binary-info-1.0.0.tgz#cd0d86fb783fb03e52067f0cd284865e57be86c8"
+ integrity sha512-4wMPu9iN3/HL97QblBsBay3E1etIciR84izI3U+4iALY+JHCrI+a2jO0qbAZ/nxKoegypYEaiiqWXylm+/zfrw==
+
+"@netlify/blobs@9.1.2":
+ version "9.1.2"
+ resolved "https://registry.yarnpkg.com/@netlify/blobs/-/blobs-9.1.2.tgz#8589b5bbf45fd4b2a3815722de546108c2917f85"
+ integrity sha512-7dMjExSH4zj4ShvLem49mE3mf0K171Tx2pV4WDWhJbRUWW3SJIR2qntz0LvUGS97N5HO1SmnzrgWUhEXCsApiw==
+ dependencies:
+ "@netlify/dev-utils" "2.2.0"
+ "@netlify/runtime-utils" "1.3.1"
+
+"@netlify/dev-utils@2.2.0":
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/@netlify/dev-utils/-/dev-utils-2.2.0.tgz#c3451174c15dc836cf0381a50896532291e597b4"
+ integrity sha512-5XUvZuffe3KetyhbWwd4n2ktd7wraocCYw10tlM+/u/95iAz29GjNiuNxbCD1T6Bn1MyGc4QLVNKOWhzJkVFAw==
+ dependencies:
+ "@whatwg-node/server" "^0.9.60"
+ chokidar "^4.0.1"
+ decache "^4.6.2"
+ dot-prop "9.0.0"
+ env-paths "^3.0.0"
+ find-up "7.0.0"
+ lodash.debounce "^4.0.8"
+ netlify "^13.3.5"
+ parse-gitignore "^2.0.0"
+ uuid "^11.1.0"
+ write-file-atomic "^6.0.0"
+
+"@netlify/functions@^3.1.10":
+ version "3.1.10"
+ resolved "https://registry.yarnpkg.com/@netlify/functions/-/functions-3.1.10.tgz#d2254e428428617db66d44d4a4b5cab294f826ec"
+ integrity sha512-sI93kcJ2cUoMgDRPnrEm0lZhuiDVDqM6ngS/UbHTApIH3+eg3yZM5p/0SDFQQq9Bad0/srFmgBmTdXushzY5kg==
+ dependencies:
+ "@netlify/blobs" "9.1.2"
+ "@netlify/dev-utils" "2.2.0"
+ "@netlify/serverless-functions-api" "1.41.2"
+ "@netlify/zip-it-and-ship-it" "^12.1.0"
+ cron-parser "^4.9.0"
+ decache "^4.6.2"
+ extract-zip "^2.0.1"
+ is-stream "^4.0.1"
+ jwt-decode "^4.0.0"
+ lambda-local "^2.2.0"
+ read-package-up "^11.0.0"
+ source-map-support "^0.5.21"
+
+"@netlify/open-api@^2.37.0":
+ version "2.37.0"
+ resolved "https://registry.yarnpkg.com/@netlify/open-api/-/open-api-2.37.0.tgz#fe2896f993d07e1a881a671b121d0f0dbae6a3c2"
+ integrity sha512-zXnRFkxgNsalSgU8/vwTWnav3R+8KG8SsqHxqaoJdjjJtnZR7wo3f+qqu4z+WtZ/4V7fly91HFUwZ6Uz2OdW7w==
+
+"@netlify/runtime-utils@1.3.1":
+ version "1.3.1"
+ resolved "https://registry.yarnpkg.com/@netlify/runtime-utils/-/runtime-utils-1.3.1.tgz#b2d9dc9716f4f6ece39cf1ab034cb6245caae8a3"
+ integrity sha512-7/vIJlMYrPJPlEW84V2yeRuG3QBu66dmlv9neTmZ5nXzwylhBEOhy11ai+34A8mHCSZI4mKns25w3HM9kaDdJg==
+
+"@netlify/serverless-functions-api@1.41.2":
+ version "1.41.2"
+ resolved "https://registry.yarnpkg.com/@netlify/serverless-functions-api/-/serverless-functions-api-1.41.2.tgz#268016647b33be93d30bbe86757b6a1495f30510"
+ integrity sha512-pfCkH50JV06SGMNsNPjn8t17hOcId4fA881HeYQgMBOrewjsw4csaYgHEnCxCEu24Y5x75E2ULbFpqm9CvRCqw==
+
+"@netlify/serverless-functions-api@^2.1.3":
+ version "2.1.3"
+ resolved "https://registry.yarnpkg.com/@netlify/serverless-functions-api/-/serverless-functions-api-2.1.3.tgz#fe1bec094e88e018da84ea8898f3fa0d81462a48"
+ integrity sha512-bNlN/hpND8xFQzpjyKxm6vJayD+bPBlOvs4lWihE7WULrphuH1UuFsoVE5386bNNGH8Rs1IH01AFsl7ALQgOlQ==
+
+"@netlify/zip-it-and-ship-it@^12.1.0":
+ version "12.2.1"
+ resolved "https://registry.yarnpkg.com/@netlify/zip-it-and-ship-it/-/zip-it-and-ship-it-12.2.1.tgz#83e911e4f54dd00031028e772fdf851e8cb807a5"
+ integrity sha512-zAr+8Tg80y/sUbhdUkZsq4Uy1IMzkSB6H/sKRMrDQ2NJx4uPgf5X5jMdg9g2FljNcxzpfJwc1Gg4OXQrjD0Z4A==
+ dependencies:
+ "@babel/parser" "^7.22.5"
+ "@babel/types" "7.28.0"
+ "@netlify/binary-info" "^1.0.0"
+ "@netlify/serverless-functions-api" "^2.1.3"
+ "@vercel/nft" "0.29.4"
+ archiver "^7.0.0"
+ common-path-prefix "^3.0.0"
+ copy-file "^11.0.0"
+ es-module-lexer "^1.0.0"
+ esbuild "0.25.5"
+ execa "^8.0.0"
+ fast-glob "^3.3.3"
+ filter-obj "^6.0.0"
+ find-up "^7.0.0"
+ is-builtin-module "^3.1.0"
+ is-path-inside "^4.0.0"
+ junk "^4.0.0"
+ locate-path "^7.0.0"
+ merge-options "^3.0.4"
+ minimatch "^9.0.0"
+ normalize-path "^3.0.0"
+ p-map "^7.0.0"
+ path-exists "^5.0.0"
+ precinct "^12.0.0"
+ require-package-name "^2.0.1"
+ resolve "^2.0.0-next.1"
+ semver "^7.3.8"
+ tmp-promise "^3.0.2"
+ toml "^3.0.0"
+ unixify "^1.0.0"
+ urlpattern-polyfill "8.0.2"
+ yargs "^17.0.0"
+ zod "^3.23.8"
"@nodelib/fs.scandir@2.1.5":
version "2.1.5"
@@ -959,20 +1244,22 @@
"@nodelib/fs.scandir" "4.0.1"
fastq "^1.15.0"
-"@nuxt/cli@^3.24.0":
- version "3.24.1"
- resolved "https://registry.yarnpkg.com/@nuxt/cli/-/cli-3.24.1.tgz#7a864e3133506859254547dc221fab2f11b852a6"
- integrity sha512-dWoB3gZj2H04x58QWNWpshQUxjsf0TB6Ppy7YKswS5hGtQkOlQ5k85f133+Bg50TJqzNuZ3OUMRduftppdJjrg==
+"@nuxt/cli@^3.25.1":
+ version "3.26.4"
+ resolved "https://registry.yarnpkg.com/@nuxt/cli/-/cli-3.26.4.tgz#cf4e13831b364b4b7296212c2fe204c60fe25667"
+ integrity sha512-PeZcH7ghQxIcCaKyu+So3qGEjKG18TN1ic4jKvKFQouNgzPSVfvZAeBOHU4znEuDFp/wmoN5EliyHO4HaSs+rw==
dependencies:
- c12 "^3.0.3"
- chokidar "^4.0.3"
+ c12 "^3.1.0"
citty "^0.1.6"
clipboardy "^4.0.0"
+ confbox "^0.2.2"
consola "^3.4.2"
defu "^6.1.4"
+ exsolve "^1.0.7"
fuse.js "^7.1.0"
+ get-port-please "^3.2.0"
giget "^2.0.0"
- h3 "^1.15.1"
+ h3 "^1.15.3"
httpxy "^0.1.7"
jiti "^2.4.2"
listhen "^1.9.0"
@@ -981,58 +1268,57 @@
ohash "^2.0.11"
pathe "^2.0.3"
perfect-debounce "^1.0.0"
- pkg-types "^2.1.0"
+ pkg-types "^2.2.0"
scule "^1.3.0"
- semver "^7.7.1"
- std-env "^3.8.1"
+ semver "^7.7.2"
+ std-env "^3.9.0"
tinyexec "^1.0.1"
- ufo "^1.5.4"
- youch "^4.1.0-beta.6"
+ ufo "^1.6.1"
+ youch "^4.1.0-beta.10"
"@nuxt/devalue@^2.0.2":
version "2.0.2"
resolved "https://registry.yarnpkg.com/@nuxt/devalue/-/devalue-2.0.2.tgz#5749f04df13bda4c863338d8dabaf370f45ef7c7"
integrity sha512-GBzP8zOc7CGWyFQS6dv1lQz8VVpz5C2yRszbXufwG/9zhStTIH50EtD87NmWbTMwXDvZLNg8GIpb1UFdH93JCA==
-"@nuxt/devtools-kit@2.3.2", "@nuxt/devtools-kit@^2.2.1", "@nuxt/devtools-kit@^2.3.2":
- version "2.3.2"
- resolved "https://registry.yarnpkg.com/@nuxt/devtools-kit/-/devtools-kit-2.3.2.tgz#81dc6d3a2a08f22a58068d9557ac333ba662ae27"
- integrity sha512-K0citnz9bSecPCLl4jGfE5I5St+E9XtDmOvYqq3ranGZGZ2Mvs5RwgUkaOrn4rulvUmBGBl7Exwh5YX9PONrEQ==
+"@nuxt/devtools-kit@2.6.2", "@nuxt/devtools-kit@^2.4.0", "@nuxt/devtools-kit@^2.6.2":
+ version "2.6.2"
+ resolved "https://registry.yarnpkg.com/@nuxt/devtools-kit/-/devtools-kit-2.6.2.tgz#c215976aaa6e404b018ad19ce7fbda5d570ed63d"
+ integrity sha512-esErdMQ0u3wXXogKQ3IE2m0fxv52w6CzPsfsXF4o5ZVrUQrQaH58ygupDAQTYdlGTgtqmEA6KkHTGG5cM6yxeg==
dependencies:
- "@nuxt/kit" "^3.16.1"
- "@nuxt/schema" "^3.16.1"
+ "@nuxt/kit" "^3.17.6"
execa "^8.0.1"
-"@nuxt/devtools-wizard@2.3.2":
- version "2.3.2"
- resolved "https://registry.yarnpkg.com/@nuxt/devtools-wizard/-/devtools-wizard-2.3.2.tgz#1f6d6fdfcf2eb4416a4d4a0066bdb74fc409883d"
- integrity sha512-vrGjcb7O/ojrWM9FXjAyWgMLUTkb9bmQUCXc//wZw8YnJLR/hmmvo0XFwmz31BN7nMLZaMpUclROdlhRSPNf1Q==
+"@nuxt/devtools-wizard@2.6.2":
+ version "2.6.2"
+ resolved "https://registry.yarnpkg.com/@nuxt/devtools-wizard/-/devtools-wizard-2.6.2.tgz#db657bd759cf853f441497ec62d05c7d48712d89"
+ integrity sha512-s1eYYKi2eZu2ZUPQrf22C0SceWs5/C3c3uow/DVunD304Um/Tj062xM9E4p1B9L8yjaq8t0Gtyu/YvZdo/reyg==
dependencies:
consola "^3.4.2"
- diff "^7.0.0"
+ diff "^8.0.2"
execa "^8.0.1"
magicast "^0.3.5"
pathe "^2.0.3"
- pkg-types "^2.1.0"
+ pkg-types "^2.2.0"
prompts "^2.4.2"
- semver "^7.7.1"
+ semver "^7.7.2"
-"@nuxt/devtools@^2.3.2":
- version "2.3.2"
- resolved "https://registry.yarnpkg.com/@nuxt/devtools/-/devtools-2.3.2.tgz#cfaf7a38abca8369eeea4303d04ce6711adcab80"
- integrity sha512-MMx7pUW0aPDRmhe3jy91srEiFWq/Q70rjbGoHhzpVosuvyvy/fi0oKOFQqN5V4V7jJLiEx4HAoD0QdqP0I6xBA==
+"@nuxt/devtools@^2.6.2":
+ version "2.6.2"
+ resolved "https://registry.yarnpkg.com/@nuxt/devtools/-/devtools-2.6.2.tgz#f2476bb4ada9cd9d3f3bc28f47a54bc3c2238244"
+ integrity sha512-pqcSDPv1I+8fxa6FvhAxVrfcN/sXYLOBe9scTLbRQOVLTO0pHzryayho678qNKiwWGgj/rcjEDr6IZCgwqOCfA==
dependencies:
- "@nuxt/devtools-kit" "2.3.2"
- "@nuxt/devtools-wizard" "2.3.2"
- "@nuxt/kit" "^3.16.1"
- "@vue/devtools-core" "^7.7.2"
- "@vue/devtools-kit" "^7.7.2"
- birpc "^2.3.0"
+ "@nuxt/devtools-kit" "2.6.2"
+ "@nuxt/devtools-wizard" "2.6.2"
+ "@nuxt/kit" "^3.17.6"
+ "@vue/devtools-core" "^7.7.7"
+ "@vue/devtools-kit" "^7.7.7"
+ birpc "^2.4.0"
consola "^3.4.2"
- destr "^2.0.3"
+ destr "^2.0.5"
error-stack-parser-es "^1.0.5"
execa "^8.0.1"
- fast-npm-meta "^0.3.1"
+ fast-npm-meta "^0.4.4"
get-port-please "^3.1.2"
hookable "^5.5.3"
image-meta "^0.2.1"
@@ -1044,95 +1330,96 @@
ohash "^2.0.11"
pathe "^2.0.3"
perfect-debounce "^1.0.0"
- pkg-types "^2.1.0"
- semver "^7.7.1"
- simple-git "^3.27.0"
+ pkg-types "^2.2.0"
+ semver "^7.7.2"
+ simple-git "^3.28.0"
sirv "^3.0.1"
structured-clone-es "^1.0.0"
- tinyglobby "^0.2.12"
- vite-plugin-inspect "^11.0.0"
- vite-plugin-vue-tracer "^0.1.3"
+ tinyglobby "^0.2.14"
+ vite-plugin-inspect "^11.3.0"
+ vite-plugin-vue-tracer "^1.0.0"
which "^5.0.0"
- ws "^8.18.1"
+ ws "^8.18.3"
-"@nuxt/eslint-config@1.3.0":
- version "1.3.0"
- resolved "https://registry.yarnpkg.com/@nuxt/eslint-config/-/eslint-config-1.3.0.tgz#b24dae6aa3b7024a22d0bf9662adca4a5952cf9e"
- integrity sha512-m0ebtmjyAiPVctBn+YijVst3WA2tQ6s/YJT4Dr33bTiSVvl+sFapxvAV+YOTyS4WECCBtjTAct61gamjbiahPg==
+"@nuxt/eslint-config@1.7.1":
+ version "1.7.1"
+ resolved "https://registry.yarnpkg.com/@nuxt/eslint-config/-/eslint-config-1.7.1.tgz#3118c116be62d24c2d917c559fba43a6e0c9404a"
+ integrity sha512-xY9CNA24LGiauNw2h1L76iw/SFChEIojqQQM5UgGU+nfRfAZaitfumsmqhMXa6tTdnbF+uf6EpumaMdk3LNRpg==
dependencies:
- "@antfu/install-pkg" "^1.0.0"
- "@clack/prompts" "^0.10.0"
- "@eslint/js" "^9.23.0"
- "@nuxt/eslint-plugin" "1.3.0"
- "@stylistic/eslint-plugin" "^4.2.0"
- "@typescript-eslint/eslint-plugin" "^8.28.0"
- "@typescript-eslint/parser" "^8.28.0"
+ "@antfu/install-pkg" "^1.1.0"
+ "@clack/prompts" "^0.11.0"
+ "@eslint/js" "^9.31.0"
+ "@nuxt/eslint-plugin" "1.7.1"
+ "@stylistic/eslint-plugin" "^5.2.1"
+ "@typescript-eslint/eslint-plugin" "^8.38.0"
+ "@typescript-eslint/parser" "^8.38.0"
eslint-config-flat-gitignore "^2.1.0"
- eslint-flat-config-utils "^2.0.1"
+ eslint-flat-config-utils "^2.1.0"
eslint-merge-processors "^2.0.0"
- eslint-plugin-import-x "^4.9.4"
- eslint-plugin-jsdoc "^50.6.9"
- eslint-plugin-regexp "^2.7.0"
- eslint-plugin-unicorn "^58.0.0"
- eslint-plugin-vue "^10.0.0"
+ eslint-plugin-import-lite "^0.3.0"
+ eslint-plugin-import-x "^4.16.1"
+ eslint-plugin-jsdoc "^51.4.1"
+ eslint-plugin-regexp "^2.9.0"
+ eslint-plugin-unicorn "^60.0.0"
+ eslint-plugin-vue "^10.3.0"
eslint-processor-vue-blocks "^2.0.0"
- globals "^16.0.0"
+ globals "^16.3.0"
local-pkg "^1.1.1"
pathe "^2.0.3"
- vue-eslint-parser "^10.1.1"
+ vue-eslint-parser "^10.2.0"
-"@nuxt/eslint-plugin@1.3.0":
- version "1.3.0"
- resolved "https://registry.yarnpkg.com/@nuxt/eslint-plugin/-/eslint-plugin-1.3.0.tgz#043ad787bb20cebbf59182e5fadf048ba0f8cec6"
- integrity sha512-XrBSM81/nqMg4t4/iI2ZzSWlqz6v2IHmgQHobVuRASFI4b4fPRMoAl46CEGoDs8TgK7RBOJ1BziJ64c7Icos0g==
+"@nuxt/eslint-plugin@1.7.1":
+ version "1.7.1"
+ resolved "https://registry.yarnpkg.com/@nuxt/eslint-plugin/-/eslint-plugin-1.7.1.tgz#be49606b09ff291d54df5b293426981f681f74cb"
+ integrity sha512-az7qM8g95JPI8SO4c7lcbab3DVQPsNxCVik+b4XwtpEhxtkW0BEq3VFCmM5aZbFhmV4qE5TOCl7LA4Saq4lhGQ==
dependencies:
- "@typescript-eslint/types" "^8.28.0"
- "@typescript-eslint/utils" "^8.28.0"
+ "@typescript-eslint/types" "^8.38.0"
+ "@typescript-eslint/utils" "^8.38.0"
"@nuxt/eslint@^1.3.0":
- version "1.3.0"
- resolved "https://registry.yarnpkg.com/@nuxt/eslint/-/eslint-1.3.0.tgz#3a2ce21f47a72a3f04d4ae8715cbdbe158667c03"
- integrity sha512-0jdXePVFIzK4firlSS9CJTa9zlyPKJ0/t1Ny2/8pkssfNEhVA1B4RQpMDuvQ40QPcgMpeCdtNhQxHaIxyD/QLg==
+ version "1.7.1"
+ resolved "https://registry.yarnpkg.com/@nuxt/eslint/-/eslint-1.7.1.tgz#4983593169a97108a154480f464319c71e2025f5"
+ integrity sha512-/kbtRE6+kSDR+WxR/aL64E7ov58VUSsbwwOdS55R7f8ZjIReF+hfVBGA8CxXHo0LgIGTmoQbz7km4Nx+sGhxQw==
dependencies:
- "@eslint/config-inspector" "^1.0.2"
- "@nuxt/devtools-kit" "^2.3.2"
- "@nuxt/eslint-config" "1.3.0"
- "@nuxt/eslint-plugin" "1.3.0"
- "@nuxt/kit" "^3.16.1"
+ "@eslint/config-inspector" "^1.1.0"
+ "@nuxt/devtools-kit" "^2.6.2"
+ "@nuxt/eslint-config" "1.7.1"
+ "@nuxt/eslint-plugin" "1.7.1"
+ "@nuxt/kit" "^4.0.1"
chokidar "^4.0.3"
- eslint-flat-config-utils "^2.0.1"
- eslint-typegen "^2.1.0"
+ eslint-flat-config-utils "^2.1.0"
+ eslint-typegen "^2.2.1"
find-up "^7.0.0"
- get-port-please "^3.1.2"
+ get-port-please "^3.2.0"
mlly "^1.7.4"
pathe "^2.0.3"
- unimport "^4.1.3"
+ unimport "^5.2.0"
"@nuxt/fonts@^0.11.0":
- version "0.11.0"
- resolved "https://registry.yarnpkg.com/@nuxt/fonts/-/fonts-0.11.0.tgz#a9ae5d3467f29cb3c863b1c4f8c1f0a20388fc3e"
- integrity sha512-YdQqJDm+B9A6hyhralFcUXMCLdQZTKuqHPpAeD6Gb3uYLxfVYVyKKxc5Ch0n656u1mp9CaPaeK4CkDAQDgxAbQ==
+ version "0.11.4"
+ resolved "https://registry.yarnpkg.com/@nuxt/fonts/-/fonts-0.11.4.tgz#21c0ef65cc841a33610cd2abe16e6f551c013d37"
+ integrity sha512-GbLavsC+9FejVwY+KU4/wonJsKhcwOZx/eo4EuV57C4osnF/AtEmev8xqI0DNlebMEhEGZbu1MGwDDDYbeR7Bw==
dependencies:
- "@nuxt/devtools-kit" "^2.2.1"
- "@nuxt/kit" "^3.16.0"
- consola "^3.4.0"
+ "@nuxt/devtools-kit" "^2.4.0"
+ "@nuxt/kit" "^3.17.3"
+ consola "^3.4.2"
css-tree "^3.1.0"
defu "^6.1.4"
- esbuild "^0.25.0"
- fontaine "^0.5.0"
- h3 "^1.15.1"
+ esbuild "^0.25.4"
+ fontaine "^0.6.0"
+ h3 "^1.15.3"
jiti "^2.4.2"
- magic-regexp "^0.8.0"
+ magic-regexp "^0.10.0"
magic-string "^0.30.17"
node-fetch-native "^1.6.6"
ohash "^2.0.11"
pathe "^2.0.3"
sirv "^3.0.1"
- tinyglobby "^0.2.12"
- ufo "^1.5.4"
- unifont "^0.1.7"
- unplugin "^2.2.0"
- unstorage "^1.15.0"
+ tinyglobby "^0.2.13"
+ ufo "^1.6.1"
+ unifont "^0.4.1"
+ unplugin "^2.3.3"
+ unstorage "^1.16.0"
"@nuxt/image@^1.10.0":
version "1.10.0"
@@ -1152,81 +1439,71 @@
optionalDependencies:
ipx "^2.1.0"
-"@nuxt/kit@3.16.2":
- version "3.16.2"
- resolved "https://registry.yarnpkg.com/@nuxt/kit/-/kit-3.16.2.tgz#9fbb2ef3bd9ebeb499b4cc5215e2f857c54b75d7"
- integrity sha512-K1SAUo2vweTfudKZzjKsZ5YJoxPLTspR5qz5+G61xtZreLpsdpDYfBseqsIAl5VFLJuszeRpWQ01jP9LfQ6Ksw==
+"@nuxt/kit@3.17.7", "@nuxt/kit@^3.11.2", "@nuxt/kit@^3.12.4", "@nuxt/kit@^3.13.2", "@nuxt/kit@^3.15.4", "@nuxt/kit@^3.16.0", "@nuxt/kit@^3.17.2", "@nuxt/kit@^3.17.3", "@nuxt/kit@^3.17.6":
+ version "3.17.7"
+ resolved "https://registry.yarnpkg.com/@nuxt/kit/-/kit-3.17.7.tgz#2c6123c0495ac4b8f1c9b6207744a8d13c8da8ee"
+ integrity sha512-JLno3ur7Pix2o/StxIMlEHRkMawA6h7uzjZBDgxdeKXRWTYY8ID9YekSkN4PBlEFGXBfCBOcPd5+YqcyBUAMkw==
dependencies:
- c12 "^3.0.2"
+ c12 "^3.0.4"
consola "^3.4.2"
defu "^6.1.4"
- destr "^2.0.3"
+ destr "^2.0.5"
errx "^0.1.0"
- exsolve "^1.0.4"
- globby "^14.1.0"
- ignore "^7.0.3"
+ exsolve "^1.0.7"
+ ignore "^7.0.5"
jiti "^2.4.2"
klona "^2.0.6"
knitwork "^1.2.0"
mlly "^1.7.4"
ohash "^2.0.11"
pathe "^2.0.3"
- pkg-types "^2.1.0"
+ pkg-types "^2.2.0"
scule "^1.3.0"
- semver "^7.7.1"
- std-env "^3.8.1"
- ufo "^1.5.4"
+ semver "^7.7.2"
+ std-env "^3.9.0"
+ tinyglobby "^0.2.14"
+ ufo "^1.6.1"
unctx "^2.4.1"
- unimport "^4.1.3"
+ unimport "^5.1.0"
untyped "^2.0.0"
-"@nuxt/kit@^3.11.2", "@nuxt/kit@^3.12.4", "@nuxt/kit@^3.13.2", "@nuxt/kit@^3.15.4", "@nuxt/kit@^3.16.0", "@nuxt/kit@^3.16.1":
- version "3.16.1"
- resolved "https://registry.yarnpkg.com/@nuxt/kit/-/kit-3.16.1.tgz#7acc5457b83fc2c7ecb25d728d83899eef4464d4"
- integrity sha512-Perby8hJGUeCWad5oTVXb/Ibvp18ZCUC5PxHHu+acMDmVfnxSo48yqk7qNd09VkTF3LEzoEjNZpmW2ZWN0ry7A==
+"@nuxt/kit@^4.0.1":
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/@nuxt/kit/-/kit-4.0.1.tgz#15d1ab3e36f963fdd4f19106ef3212fee6230002"
+ integrity sha512-9vYpbuK3xcVhuDq+NyoLhbAolV/bEESaozFOMutl0jhrODcNWFrJ8wQSZIt9yxcFXUgXgUa2ms31qaUEpXrykw==
dependencies:
- c12 "^3.0.2"
+ c12 "^3.1.0"
consola "^3.4.2"
defu "^6.1.4"
- destr "^2.0.3"
+ destr "^2.0.5"
errx "^0.1.0"
- exsolve "^1.0.4"
- globby "^14.1.0"
- ignore "^7.0.3"
+ exsolve "^1.0.7"
+ ignore "^7.0.5"
jiti "^2.4.2"
klona "^2.0.6"
- knitwork "^1.2.0"
mlly "^1.7.4"
ohash "^2.0.11"
pathe "^2.0.3"
- pkg-types "^2.1.0"
+ pkg-types "^2.2.0"
scule "^1.3.0"
- semver "^7.7.1"
- std-env "^3.8.1"
- ufo "^1.5.4"
+ semver "^7.7.2"
+ std-env "^3.9.0"
+ tinyglobby "^0.2.14"
+ ufo "^1.6.1"
unctx "^2.4.1"
- unimport "^4.1.2"
+ unimport "^5.1.0"
untyped "^2.0.0"
-"@nuxt/schema@3.16.2":
- version "3.16.2"
- resolved "https://registry.yarnpkg.com/@nuxt/schema/-/schema-3.16.2.tgz#9231d6c8a6212670fcc0d2a348418e26f7d832df"
- integrity sha512-2HZPM372kuI/uw9VU/hOoYuzv803oZAtyoEKC5dQCQTKAQ293AjypF3WljMXUSReFS/hcbBSgGzYUPHr3Qo+pg==
+"@nuxt/schema@3.17.7":
+ version "3.17.7"
+ resolved "https://registry.yarnpkg.com/@nuxt/schema/-/schema-3.17.7.tgz#20a8d17423c411c5d369341595d8d6455532cbe7"
+ integrity sha512-c22IE/ECvjUScFyOJH/0VnSf5izDLmwkrCRlZKNhHzcNZUBFe5mCE5BM28QSVRSLGcC/mqg5POyNjf2tRwf+/w==
dependencies:
+ "@vue/shared" "^3.5.17"
consola "^3.4.2"
defu "^6.1.4"
pathe "^2.0.3"
- std-env "^3.8.1"
-
-"@nuxt/schema@^3.16.1":
- version "3.16.1"
- resolved "https://registry.yarnpkg.com/@nuxt/schema/-/schema-3.16.1.tgz#685ef851d127d0d5401bd5121b3adf1c3d2723e2"
- integrity sha512-Ri8bmT6MljpVR4DlXf9+acfgGaI4OTEdAzJU5aF2rJS78abtpnBxjXBG65kuhoL1LUlfKppDl8fTkUw5LM2JXQ==
- dependencies:
- consola "^3.4.2"
- defu "^6.1.4"
- pathe "^2.0.3"
- std-env "^3.8.1"
+ std-env "^3.9.0"
"@nuxt/telemetry@^2.6.6":
version "2.6.6"
@@ -1246,25 +1523,25 @@
rc9 "^2.1.2"
std-env "^3.8.1"
-"@nuxt/vite-builder@3.16.2":
- version "3.16.2"
- resolved "https://registry.yarnpkg.com/@nuxt/vite-builder/-/vite-builder-3.16.2.tgz#0897a01d0371859caa356030be9bef9510f7d518"
- integrity sha512-HjK3iZb5GAC4hADOkl2ayn2uNUG4K4qizJ7ud4crHLPw6WHPeT/RhB3j7PpsyRftBnHhlZCsL4Gj/i3rmdcVJw==
+"@nuxt/vite-builder@3.17.7":
+ version "3.17.7"
+ resolved "https://registry.yarnpkg.com/@nuxt/vite-builder/-/vite-builder-3.17.7.tgz#a0886306bc8a2f7584d0e2c2fdf20436531ab8e5"
+ integrity sha512-XZEte9SMgONWsChKXOrK9/X8TqcSToXy6S9GzxJF199QKUpfsOJy+gZrjOWHS+WrIWdkBmiKBl11kvh8lCIpzA==
dependencies:
- "@nuxt/kit" "3.16.2"
+ "@nuxt/kit" "3.17.7"
"@rollup/plugin-replace" "^6.0.2"
- "@vitejs/plugin-vue" "^5.2.3"
- "@vitejs/plugin-vue-jsx" "^4.1.2"
+ "@vitejs/plugin-vue" "^5.2.4"
+ "@vitejs/plugin-vue-jsx" "^4.2.0"
autoprefixer "^10.4.21"
consola "^3.4.2"
- cssnano "^7.0.6"
+ cssnano "^7.0.7"
defu "^6.1.4"
- esbuild "^0.25.2"
+ esbuild "^0.25.6"
escape-string-regexp "^5.0.0"
- exsolve "^1.0.4"
+ exsolve "^1.0.7"
externality "^1.0.2"
get-port-please "^3.1.2"
- h3 "^1.15.1"
+ h3 "^1.15.3"
jiti "^2.4.2"
knitwork "^1.2.0"
magic-string "^0.30.17"
@@ -1273,69 +1550,196 @@
ohash "^2.0.11"
pathe "^2.0.3"
perfect-debounce "^1.0.0"
- pkg-types "^2.1.0"
- postcss "^8.5.3"
- rollup-plugin-visualizer "^5.14.0"
- std-env "^3.8.1"
- ufo "^1.5.4"
- unenv "^2.0.0-rc.15"
- unplugin "^2.2.2"
- vite "^6.2.4"
- vite-node "^3.1.1"
- vite-plugin-checker "^0.9.1"
+ pkg-types "^2.2.0"
+ postcss "^8.5.6"
+ rollup-plugin-visualizer "^6.0.3"
+ std-env "^3.9.0"
+ ufo "^1.6.1"
+ unenv "^2.0.0-rc.18"
+ vite "^6.3.5"
+ vite-node "^3.2.4"
+ vite-plugin-checker "^0.10.0"
vue-bundle-renderer "^2.1.1"
-"@oxc-parser/binding-darwin-arm64@0.56.5":
- version "0.56.5"
- resolved "https://registry.yarnpkg.com/@oxc-parser/binding-darwin-arm64/-/binding-darwin-arm64-0.56.5.tgz#deac354d144b85dac8db4db3379d0bad63b2ac75"
- integrity sha512-rj4WZqQVJQgLnGnDu2ciIOC5SqcBPc4x11RN0NwuedSGzny5mtBdNVLwt0+8iB15lIjrOKg5pjYJ8GQVPca5HA==
-
-"@oxc-parser/binding-darwin-x64@0.56.5":
- version "0.56.5"
- resolved "https://registry.yarnpkg.com/@oxc-parser/binding-darwin-x64/-/binding-darwin-x64-0.56.5.tgz#9cfabdc1dc69642926a9165310e85a1fff50b9d8"
- integrity sha512-Rr7aMkqcxGIM6fgkpaj9SJj0u1O1g+AT7mJwmdi5PLSQRPR4CkDKfztEnAj5k+d2blWvh9nPZH8G0OCwxIHk1Q==
-
-"@oxc-parser/binding-linux-arm-gnueabihf@0.56.5":
- version "0.56.5"
- resolved "https://registry.yarnpkg.com/@oxc-parser/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-0.56.5.tgz#61220508c18571ec6db98f15f3f2221e3c26e742"
- integrity sha512-jcFCThrWUt5k1GM43tdmI1m2dEnWUPPHHTWKBJbZBXzXLrJJzkqv5OU87Spf1004rYj9swwpa13kIldFwMzglA==
-
-"@oxc-parser/binding-linux-arm64-gnu@0.56.5":
- version "0.56.5"
- resolved "https://registry.yarnpkg.com/@oxc-parser/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-0.56.5.tgz#a8fdb2287458c56889aeeed2b352a342a51bf539"
- integrity sha512-zo/9RDgWvugKxCpHHcAC5EW0AqoEvODJ4Iv4aT1Xonv6kcydbyPSXJBQhhZUvTXTAFIlQKl6INHl+Xki9Qs3fw==
-
-"@oxc-parser/binding-linux-arm64-musl@0.56.5":
- version "0.56.5"
- resolved "https://registry.yarnpkg.com/@oxc-parser/binding-linux-arm64-musl/-/binding-linux-arm64-musl-0.56.5.tgz#9f5876f7f7e8541996a228408997a3c5b88948b4"
- integrity sha512-SCIqrL5apVbrtMoqOpKX/Ez+c46WmW0Tyhtu+Xby281biH+wYu70m+fux9ZsGmbHc2ojd4FxUcaUdCZtb5uTOQ==
-
-"@oxc-parser/binding-linux-x64-gnu@0.56.5":
- version "0.56.5"
- resolved "https://registry.yarnpkg.com/@oxc-parser/binding-linux-x64-gnu/-/binding-linux-x64-gnu-0.56.5.tgz#07b6b201e50368611b3e258cebea380a2020c8e4"
- integrity sha512-I2mpX35NWo83hay4wrnzFLk3VuGK1BBwHaqvEdqsCode8iG8slYJRJPICVbCEWlkR3rotlTQ+608JcRU0VqZ5Q==
-
-"@oxc-parser/binding-linux-x64-musl@0.56.5":
- version "0.56.5"
- resolved "https://registry.yarnpkg.com/@oxc-parser/binding-linux-x64-musl/-/binding-linux-x64-musl-0.56.5.tgz#5462efaa752ce93055d905078ad02d317a8867a1"
- integrity sha512-xfzUHGYOh3PGWZdBuY5r1czvE8EGWPAmhTWHqkw3/uAfUVWN/qrrLjMojiaiWyUgl/9XIFg05m5CJH9dnngh5Q==
-
-"@oxc-parser/binding-wasm32-wasi@0.56.5":
- version "0.56.5"
- resolved "https://registry.yarnpkg.com/@oxc-parser/binding-wasm32-wasi/-/binding-wasm32-wasi-0.56.5.tgz#c446240cb34fe19324c528a18b9ad635983026c1"
- integrity sha512-+z3Ofmc1v5kcu8fXgG5vn7T1f52P47ceTTmTXsm5HPY7rq5EMYRUaBnxH6cesXwY1OVVCwYlIZbCiy8Pm1w8zQ==
+"@nuxtjs/i18n@^9.5.5":
+ version "9.5.6"
+ resolved "https://registry.yarnpkg.com/@nuxtjs/i18n/-/i18n-9.5.6.tgz#10462d372e72f56760814ace4d6d2c740d81cf6d"
+ integrity sha512-PhrQtJT6Di9uoslL5BTrBFqntFlfCaUKlO3T9ORJwmWFdowPqQeFjQ9OjVbKA6TNWr3kQhDqLbIcGlhbuG1USQ==
dependencies:
- "@napi-rs/wasm-runtime" "^0.2.7"
+ "@intlify/h3" "^0.6.1"
+ "@intlify/shared" "^10.0.7"
+ "@intlify/unplugin-vue-i18n" "^6.0.8"
+ "@intlify/utils" "^0.13.0"
+ "@miyaneee/rollup-plugin-json5" "^1.2.0"
+ "@nuxt/kit" "^3.17.2"
+ "@oxc-parser/wasm" "^0.60.0"
+ "@rollup/plugin-yaml" "^4.1.2"
+ "@vue/compiler-sfc" "^3.5.13"
+ debug "^4.4.0"
+ defu "^6.1.4"
+ esbuild "^0.25.1"
+ estree-walker "^3.0.3"
+ h3 "^1.15.1"
+ knitwork "^1.2.0"
+ magic-string "^0.30.17"
+ mlly "^1.7.4"
+ oxc-parser "^0.70.0"
+ pathe "^2.0.3"
+ typescript "^5.6.2"
+ ufo "^1.5.4"
+ unplugin "^2.2.2"
+ unplugin-vue-router "^0.12.0"
+ vue-i18n "^10.0.7"
+ vue-router "^4.5.1"
-"@oxc-parser/binding-win32-arm64-msvc@0.56.5":
- version "0.56.5"
- resolved "https://registry.yarnpkg.com/@oxc-parser/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-0.56.5.tgz#9d6f3131344e78fd0367aa6c4c9ab07f2e1d7a69"
- integrity sha512-pRg8QrbMh8PgnXBreiONoJBR306u+JN19BXQC7oKIaG4Zxt9Mn8XIyuhUv3ytqjLudSiG2ERWQUoCGLs+yfW0A==
+"@oxc-parser/binding-android-arm64@0.76.0":
+ version "0.76.0"
+ resolved "https://registry.yarnpkg.com/@oxc-parser/binding-android-arm64/-/binding-android-arm64-0.76.0.tgz#2bf8524add42f7a399ea0da9ae8e764bb9aeb61b"
+ integrity sha512-1XJW/16CDmF5bHE7LAyPPmEEVnxSadDgdJz+xiLqBrmC4lfAeuAfRw3HlOygcPGr+AJsbD4Z5sFJMkwjbSZlQg==
-"@oxc-parser/binding-win32-x64-msvc@0.56.5":
- version "0.56.5"
- resolved "https://registry.yarnpkg.com/@oxc-parser/binding-win32-x64-msvc/-/binding-win32-x64-msvc-0.56.5.tgz#97abddb929e894f07e2eaba3f64959f89749aa47"
- integrity sha512-VALZNcuyw/6rwsxOACQ2YS6rey2d/ym4cNfXqJrHB/MZduAPj4xvij72gHGu3Ywm31KVGLVWk/mrMRiM9CINcA==
+"@oxc-parser/binding-darwin-arm64@0.70.0":
+ version "0.70.0"
+ resolved "https://registry.yarnpkg.com/@oxc-parser/binding-darwin-arm64/-/binding-darwin-arm64-0.70.0.tgz#60765c91612a72914a272723503ab64fdc7cea49"
+ integrity sha512-pIi7L9PnsBctS/ruW6JQVSYRJkh76PblBN46uQxpBfVsM57c1s4HGZlmGysQWbdmQTFDZW+SmH3u0JpmDLF0+A==
+
+"@oxc-parser/binding-darwin-arm64@0.76.0":
+ version "0.76.0"
+ resolved "https://registry.yarnpkg.com/@oxc-parser/binding-darwin-arm64/-/binding-darwin-arm64-0.76.0.tgz#e253b72b235dd6600449a5907e355f167a92a986"
+ integrity sha512-yoQwSom8xsB+JdGsPUU0xxmxLKiF2kdlrK7I56WtGKZilixuBf/TmOwNYJYLRWkBoW5l2/pDZOhBm2luwmLiLw==
+
+"@oxc-parser/binding-darwin-x64@0.70.0":
+ version "0.70.0"
+ resolved "https://registry.yarnpkg.com/@oxc-parser/binding-darwin-x64/-/binding-darwin-x64-0.70.0.tgz#6807a789f4e46fc079aaa28e836141e57f1dfc1e"
+ integrity sha512-EbKqtOHzZR56ZFC5HHg6XrYneFAJmpLC1Z6FSgbI061Ley1atAViQg7S6Agm9wAcPpns+BeFJqXEBx/y3MKa2w==
+
+"@oxc-parser/binding-darwin-x64@0.76.0":
+ version "0.76.0"
+ resolved "https://registry.yarnpkg.com/@oxc-parser/binding-darwin-x64/-/binding-darwin-x64-0.76.0.tgz#4490fd095ed0564f48938ca4f8cf3f00f7afeb1a"
+ integrity sha512-uRIopPLvr3pf2Xj7f5LKyCuqzIU6zOS+zEIR8UDYhcgJyZHnvBkfrYnfcztyIcrGdQehrFUi3uplmI09E7RdiQ==
+
+"@oxc-parser/binding-freebsd-x64@0.70.0":
+ version "0.70.0"
+ resolved "https://registry.yarnpkg.com/@oxc-parser/binding-freebsd-x64/-/binding-freebsd-x64-0.70.0.tgz#249072ebeaec38166e08b7245986ee8bc70cafaa"
+ integrity sha512-MVUaOMEUVE8q3nsWtEo589h++V5wAdqTbCRa9WY4Yuyxska4xcuJQk/kDNCx+n92saS7Luk+b20O9+VCI03c+A==
+
+"@oxc-parser/binding-freebsd-x64@0.76.0":
+ version "0.76.0"
+ resolved "https://registry.yarnpkg.com/@oxc-parser/binding-freebsd-x64/-/binding-freebsd-x64-0.76.0.tgz#b1a448bfc52bec9523a7aa3958476ed8f391c367"
+ integrity sha512-a0EOFvnOd2FqmDSvH6uWLROSlU6KV/JDKbsYDA/zRLyKcG6HCsmFnPsp8iV7/xr9WMbNgyJi6R5IMpePQlUq7Q==
+
+"@oxc-parser/binding-linux-arm-gnueabihf@0.70.0":
+ version "0.70.0"
+ resolved "https://registry.yarnpkg.com/@oxc-parser/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-0.70.0.tgz#66be9f0c09adea967192a1f5baed47232f89b1cc"
+ integrity sha512-8N4JTYTgKiRHlMUDAdzKs6iEC57a8ex408VgKoLD/Fl+Un79qOti3S9sotdnWSdH/BsDQeO5NW+PKaqFBTw+hA==
+
+"@oxc-parser/binding-linux-arm-gnueabihf@0.76.0":
+ version "0.76.0"
+ resolved "https://registry.yarnpkg.com/@oxc-parser/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-0.76.0.tgz#4a8f1fc55582bc2a045dd79242d4fb18f1af2560"
+ integrity sha512-ikRYDHL3fOdZwfJKmcdqjlLgkeNZ3Ez0qM8wAev5zlHZ+lY/Ig7qG5SCqPlvuTu+nNQ6zrFFaKvvt69EBKXU/g==
+
+"@oxc-parser/binding-linux-arm-musleabihf@0.70.0":
+ version "0.70.0"
+ resolved "https://registry.yarnpkg.com/@oxc-parser/binding-linux-arm-musleabihf/-/binding-linux-arm-musleabihf-0.70.0.tgz#8fe8513130a507291fc28be79ad6788dcb7f8ed8"
+ integrity sha512-Bsu+YvtgWuSfSDJTHMF5APZBOtvddR0GiHyrL0yaXDwaYvAL/E7XcoSK2GdmKTpw+J8nk5IlejEXlQliPo52pQ==
+
+"@oxc-parser/binding-linux-arm-musleabihf@0.76.0":
+ version "0.76.0"
+ resolved "https://registry.yarnpkg.com/@oxc-parser/binding-linux-arm-musleabihf/-/binding-linux-arm-musleabihf-0.76.0.tgz#bcd4f29ce158b1a817178c2e6962d1b51e9dc5ae"
+ integrity sha512-dtRv5J5MRCLR7x39K8ufIIW4svIc7gYFUaI0YFXmmeOBhK/K2t/CkguPnDroKtsmXIPHDRtmJ1JJYzNcgJl6Wg==
+
+"@oxc-parser/binding-linux-arm64-gnu@0.70.0":
+ version "0.70.0"
+ resolved "https://registry.yarnpkg.com/@oxc-parser/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-0.70.0.tgz#5bbc468f295a6a136f39f409d2e0bbb7a118fcf4"
+ integrity sha512-tDzHWKexJPHR+qSiuAFoZ1v8EgCd4ggBNbjJHkcIHsoYKnsKaT1+uE9xfW9UhI1mhv2lo1JJ9n9og2yDTGxSeA==
+
+"@oxc-parser/binding-linux-arm64-gnu@0.76.0":
+ version "0.76.0"
+ resolved "https://registry.yarnpkg.com/@oxc-parser/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-0.76.0.tgz#a398c29fc1d5a9cf16025a366fd2cca2a0cab097"
+ integrity sha512-IE4iiiggFH2snagQxHrY5bv6dDpRMMat+vdlMN/ibonA65eOmRLp8VLTXnDiNrcla/itJ1L9qGABHNKU+SnE8g==
+
+"@oxc-parser/binding-linux-arm64-musl@0.70.0":
+ version "0.70.0"
+ resolved "https://registry.yarnpkg.com/@oxc-parser/binding-linux-arm64-musl/-/binding-linux-arm64-musl-0.70.0.tgz#80b6b7d58241d13d351a2db61ad1f6a75332e394"
+ integrity sha512-BJ+N25UWmHU624558ojSTnht3uFL00jV1c8qk1hnKf4cl6+ovFcoktRWAWSBlgLEP8tLlu8qgIhz875tMj2PkQ==
+
+"@oxc-parser/binding-linux-arm64-musl@0.76.0":
+ version "0.76.0"
+ resolved "https://registry.yarnpkg.com/@oxc-parser/binding-linux-arm64-musl/-/binding-linux-arm64-musl-0.76.0.tgz#35c3236396a70dfb071f5a92764b23acca9f6357"
+ integrity sha512-wi9zQPMDHrBuRuT7Iurfidc9qlZh7cKa5vfYzOWNBCaqJdgxmNOFzvYen02wVUxSWGKhpiPHxrPX0jdRyJ8Npg==
+
+"@oxc-parser/binding-linux-riscv64-gnu@0.70.0":
+ version "0.70.0"
+ resolved "https://registry.yarnpkg.com/@oxc-parser/binding-linux-riscv64-gnu/-/binding-linux-riscv64-gnu-0.70.0.tgz#96366b6abcbb8737271da551cd569b30883cc358"
+ integrity sha512-nxu22nVuPA2xy1cxvBC0D5mVl0myqStOw3XBkVkDViNL01iPyuEFJd5VsM0GqsgrXvF95H/jrbMd+XWnto924g==
+
+"@oxc-parser/binding-linux-riscv64-gnu@0.76.0":
+ version "0.76.0"
+ resolved "https://registry.yarnpkg.com/@oxc-parser/binding-linux-riscv64-gnu/-/binding-linux-riscv64-gnu-0.76.0.tgz#0e3e6567e78bcab5f29376d17512c428cdd7db64"
+ integrity sha512-0tqqu1pqPee2lLGY8vtYlX1L415fFn89e0a3yp4q5N9f03j1rRs0R31qesTm3bt/UK8HYjECZ+56FCVPs2MEMQ==
+
+"@oxc-parser/binding-linux-s390x-gnu@0.70.0":
+ version "0.70.0"
+ resolved "https://registry.yarnpkg.com/@oxc-parser/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-0.70.0.tgz#8314032cefa6168fe25a4d621568d9cb6777d0ab"
+ integrity sha512-AQ6Xj97lYRxHZl94cZIHJxT5M1qkeEi+vQe+e7M2lAtjcURl8cwhZmWKSv4rt4BQRVfO3ys0bY8AgIh4eFJiqw==
+
+"@oxc-parser/binding-linux-s390x-gnu@0.76.0":
+ version "0.76.0"
+ resolved "https://registry.yarnpkg.com/@oxc-parser/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-0.76.0.tgz#a37496f6b9f2976c40daba44e3b521822323d210"
+ integrity sha512-y36Hh1a5TA+oIGtlc8lT7N9vdHXBlhBetQJW0p457KbiVQ7jF7AZkaPWhESkjHWAsTVKD2OjCa9ZqfaqhSI0FQ==
+
+"@oxc-parser/binding-linux-x64-gnu@0.70.0":
+ version "0.70.0"
+ resolved "https://registry.yarnpkg.com/@oxc-parser/binding-linux-x64-gnu/-/binding-linux-x64-gnu-0.70.0.tgz#0ab2bdf656a11a97cd9dc6cafc140cbe4b8b15e6"
+ integrity sha512-RIxaVsIxtG90CoX6/Okij8itaMrJp4SEJm1pSL0pz3hGo0yur3Il9M1mmGvOpW+avY8uHdwXIvf2qMnnTKZuoQ==
+
+"@oxc-parser/binding-linux-x64-gnu@0.76.0":
+ version "0.76.0"
+ resolved "https://registry.yarnpkg.com/@oxc-parser/binding-linux-x64-gnu/-/binding-linux-x64-gnu-0.76.0.tgz#ea13a10abe105f8ef29a36ae0285de7ed69488de"
+ integrity sha512-7/acaG9htovp3gp/J0kHgbItQTuHctl+rbqPPqZ9DRBYTz8iV8kv3QN8t8Or8i/hOmOjfZp9McDoSU1duoR4/A==
+
+"@oxc-parser/binding-linux-x64-musl@0.70.0":
+ version "0.70.0"
+ resolved "https://registry.yarnpkg.com/@oxc-parser/binding-linux-x64-musl/-/binding-linux-x64-musl-0.70.0.tgz#99c7b4e168581c457a5371a9d26f2a7096780f7a"
+ integrity sha512-B3S0G4TlZ+WLdQq4mSQtt2ZW0MAkKWc8dla17tZY86kcXvvCWwACvj7I27Z/nSlb7uJOdRZS9/r6Gw0uAARNVQ==
+
+"@oxc-parser/binding-linux-x64-musl@0.76.0":
+ version "0.76.0"
+ resolved "https://registry.yarnpkg.com/@oxc-parser/binding-linux-x64-musl/-/binding-linux-x64-musl-0.76.0.tgz#6733905918333044865cb4d1e42988741fc54dc0"
+ integrity sha512-AxFt0reY6Q2rfudABmMTFGR8tFFr58NlH2rRBQgcj+F+iEwgJ+jMwAPhXd2y1I2zaI8GspuahedUYQinqxWqjA==
+
+"@oxc-parser/binding-wasm32-wasi@0.70.0":
+ version "0.70.0"
+ resolved "https://registry.yarnpkg.com/@oxc-parser/binding-wasm32-wasi/-/binding-wasm32-wasi-0.70.0.tgz#6352acd7f8613edcc40af9ea5aedf5ba975e16aa"
+ integrity sha512-QN8yxH7eHXTqed8Oo7ZUzOWn6hixXa8EVINLy21eLU9isoifSPKMswSmCXHxsM2L5rIIvzoaKfghGOru1mMQbw==
+ dependencies:
+ "@napi-rs/wasm-runtime" "^0.2.9"
+
+"@oxc-parser/binding-wasm32-wasi@0.76.0":
+ version "0.76.0"
+ resolved "https://registry.yarnpkg.com/@oxc-parser/binding-wasm32-wasi/-/binding-wasm32-wasi-0.76.0.tgz#c47b50591e25b63d6d2ba7c34b5a71fa39c0a608"
+ integrity sha512-wHdkHdhf6AWBoO8vs5cpoR6zEFY1rB+fXWtq6j/xb9j/lu1evlujRVMkh8IM/M/pOUIrNkna3nzST/mRImiveQ==
+ dependencies:
+ "@napi-rs/wasm-runtime" "^0.2.11"
+
+"@oxc-parser/binding-win32-arm64-msvc@0.70.0":
+ version "0.70.0"
+ resolved "https://registry.yarnpkg.com/@oxc-parser/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-0.70.0.tgz#5665291efe1e5138bd0cd81fe306ba0584a737f2"
+ integrity sha512-6k8/s78g0GQKqrxk4F0wYj32NBF9oSP6089e6BeuIRQ9l+Zh0cuI6unJeLzXNszxmlqq84xmf/tmP3MSDG43Uw==
+
+"@oxc-parser/binding-win32-arm64-msvc@0.76.0":
+ version "0.76.0"
+ resolved "https://registry.yarnpkg.com/@oxc-parser/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-0.76.0.tgz#3bd03fe4bfe792e9de2e6c492036c85314593b05"
+ integrity sha512-G7ZlEWcb2hNwCK3qalzqJoyB6HaTigQ/GEa7CU8sAJ/WwMdG/NnPqiC9IqpEAEy1ARSo4XMALfKbKNuqbSs5mg==
+
+"@oxc-parser/binding-win32-x64-msvc@0.70.0":
+ version "0.70.0"
+ resolved "https://registry.yarnpkg.com/@oxc-parser/binding-win32-x64-msvc/-/binding-win32-x64-msvc-0.70.0.tgz#5243514c36da3fe34da7eb8e4e133a2a6f31a451"
+ integrity sha512-nd9o1QtEvupaJZ3Wn7PfsuC00n31NNRQZ5+Mui6Q0ZyDzp+obqPUSbSt7xh9Dy0c5zgtYMk8WY4n/VBJY2VvTQ==
+
+"@oxc-parser/binding-win32-x64-msvc@0.76.0":
+ version "0.76.0"
+ resolved "https://registry.yarnpkg.com/@oxc-parser/binding-win32-x64-msvc/-/binding-win32-x64-msvc-0.76.0.tgz#3dbef82283f871c9cb59325c9daf4f740d11a6e9"
+ integrity sha512-0jLzzmnu8/mqNhKBnNS2lFUbPEzRdj5ReiZwHGHpjma0+ullmmwP2AqSEqx3ssHDK9CpcEMdKOK2LsbCfhHKIA==
"@oxc-parser/wasm@^0.60.0":
version "0.60.0"
@@ -1344,16 +1748,21 @@
dependencies:
"@oxc-project/types" "^0.60.0"
-"@oxc-project/types@^0.56.5":
- version "0.56.5"
- resolved "https://registry.yarnpkg.com/@oxc-project/types/-/types-0.56.5.tgz#ff3f2a2b09e493e3eab6c8e403de2eb02c3efe67"
- integrity sha512-skY3kOJwp22W4RkaadH1hZ3hqFHjkRrIIE0uQ4VUg+/Chvbl+2pF+B55IrIk2dgsKXS57YEUsJuN6I6s4rgFjA==
-
"@oxc-project/types@^0.60.0":
version "0.60.0"
resolved "https://registry.yarnpkg.com/@oxc-project/types/-/types-0.60.0.tgz#ffd6e3575e9dca16dfb2efb71d6e68788edb23d0"
integrity sha512-prhfNnb3ATFHOCv7mzKFfwLij5RzoUz6Y1n525ZhCEqfq5wreCXL+DyVoq3ShukPo7q45ZjYIdjFUgjj+WKzng==
+"@oxc-project/types@^0.70.0":
+ version "0.70.0"
+ resolved "https://registry.yarnpkg.com/@oxc-project/types/-/types-0.70.0.tgz#72564fe077b66dfa2c47207ec5c005faed309c08"
+ integrity sha512-ngyLUpUjO3dpqygSRQDx7nMx8+BmXbWOU4oIwTJFV2MVIDG7knIZwgdwXlQWLg3C3oxg1lS7ppMtPKqKFb7wzw==
+
+"@oxc-project/types@^0.76.0":
+ version "0.76.0"
+ resolved "https://registry.yarnpkg.com/@oxc-project/types/-/types-0.76.0.tgz#89ae800d774ccb344278fc17ab6c15348da8b995"
+ integrity sha512-CH3THIrSViKal8yV/Wh3FK0pFhp40nzW1MUDCik9fNuid2D/7JJXKJnfFOAvMxInGXDlvmgT6ACAzrl47TqzkQ==
+
"@parcel/watcher-android-arm64@2.5.1":
version "2.5.1"
resolved "https://registry.yarnpkg.com/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.5.1.tgz#507f836d7e2042f798c7d07ad19c3546f9848ac1"
@@ -1462,125 +1871,118 @@
resolved "https://registry.yarnpkg.com/@pkgjs/parseargs/-/parseargs-0.11.0.tgz#a77ea742fab25775145434eb1d2328cf5013ac33"
integrity sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==
-"@pkgr/core@^0.1.0":
- version "0.1.2"
- resolved "https://registry.yarnpkg.com/@pkgr/core/-/core-0.1.2.tgz#1cf95080bb7072fafaa3cb13b442fab4695c3893"
- integrity sha512-fdDH1LSGfZdTH2sxdpVMw31BanV28K/Gry0cVFxaNP77neJSkd82mM8ErPNYs9e+0O7SdHBLTDzDgwUuy18RnQ==
-
-"@pkgr/core@^0.2.1":
- version "0.2.1"
- resolved "https://registry.yarnpkg.com/@pkgr/core/-/core-0.2.1.tgz#6d083acfddae21fb329c8df8c94bf895ce7d0c15"
- integrity sha512-VzgHzGblFmUeBmmrk55zPyrQIArQN4vujc9shWytaPdB3P7qhi0cpaiKIr7tlCmFv2lYUwnLospIqjL9ZSAhhg==
-
-"@pkgr/core@^0.2.3":
- version "0.2.4"
- resolved "https://registry.yarnpkg.com/@pkgr/core/-/core-0.2.4.tgz#d897170a2b0ba51f78a099edccd968f7b103387c"
- integrity sha512-ROFF39F6ZrnzSUEmQQZUar0Jt4xVoP9WnDRdWwF4NNcXs3xBTLgBUDoOwW141y1jP+S8nahIbdxbFC7IShw9Iw==
+"@pkgr/core@^0.2.0":
+ version "0.2.9"
+ resolved "https://registry.yarnpkg.com/@pkgr/core/-/core-0.2.9.tgz#d229a7b7f9dac167a156992ef23c7f023653f53b"
+ integrity sha512-QNqXyfVS2wm9hweSYD2O7F0G06uurj9kZ96TRQE5Y9hU7+tgdZwIkbAKc5Ocy1HxEY2kuDQa6cQ1WRs/O5LFKA==
"@polka/url@^1.0.0-next.24":
- version "1.0.0-next.28"
- resolved "https://registry.yarnpkg.com/@polka/url/-/url-1.0.0-next.28.tgz#d45e01c4a56f143ee69c54dd6b12eade9e270a73"
- integrity sha512-8LduaNlMZGwdZ6qWrKlfa+2M4gahzFkprZiAt2TF8uS0qQgBizKXpXURqvTJ4WtmupWxaLqjRb2UCTe72mu+Aw==
+ version "1.0.0-next.29"
+ resolved "https://registry.yarnpkg.com/@polka/url/-/url-1.0.0-next.29.tgz#5a40109a1ab5f84d6fd8fc928b19f367cbe7e7b1"
+ integrity sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==
-"@poppinss/colors@^4.1.4":
- version "4.1.4"
- resolved "https://registry.yarnpkg.com/@poppinss/colors/-/colors-4.1.4.tgz#ba0188a0ad3d249175f7291f9a051eba74ed180e"
- integrity sha512-FA+nTU8p6OcSH4tLDY5JilGYr1bVWHpNmcLr7xmMEdbWmKHa+3QZ+DqefrXKmdjO/brHTnQZo20lLSjaO7ydog==
+"@poppinss/colors@^4.1.4", "@poppinss/colors@^4.1.5":
+ version "4.1.5"
+ resolved "https://registry.yarnpkg.com/@poppinss/colors/-/colors-4.1.5.tgz#09273b845a4816f5fd9c53c78a3bc656650fe18f"
+ integrity sha512-FvdDqtcRCtz6hThExcFOgW0cWX+xwSMWcRuQe5ZEb2m7cVQOAVZOIMt+/v9RxGiD9/OY16qJBXK4CVKWAPalBw==
dependencies:
kleur "^4.1.5"
-"@poppinss/dumper@^0.6.3":
- version "0.6.3"
- resolved "https://registry.yarnpkg.com/@poppinss/dumper/-/dumper-0.6.3.tgz#0639be63ed59aaf3e11bfe0b17de71a26fc1bac3"
- integrity sha512-iombbn8ckOixMtuV1p3f8jN6vqhXefNjJttoPaJDMeIk/yIGhkkL3OrHkEjE9SRsgoAx1vBUU2GtgggjvA5hCA==
+"@poppinss/dumper@^0.6.3", "@poppinss/dumper@^0.6.4":
+ version "0.6.4"
+ resolved "https://registry.yarnpkg.com/@poppinss/dumper/-/dumper-0.6.4.tgz#b902ff0b2850f5367f947ffdb2d7154f22856d43"
+ integrity sha512-iG0TIdqv8xJ3Lt9O8DrPRxw1MRLjNpoqiSGU03P/wNLP/s0ra0udPJ1J2Tx5M0J3H/cVyEgpbn8xUKRY9j59kQ==
dependencies:
- "@poppinss/colors" "^4.1.4"
- "@sindresorhus/is" "^7.0.1"
+ "@poppinss/colors" "^4.1.5"
+ "@sindresorhus/is" "^7.0.2"
supports-color "^10.0.0"
-"@poppinss/exception@^1.2.0":
- version "1.2.1"
- resolved "https://registry.yarnpkg.com/@poppinss/exception/-/exception-1.2.1.tgz#8a5f2120fabb64a99772166d537d8a97490209ff"
- integrity sha512-aQypoot0HPSJa6gDPEPTntc1GT6QINrSbgRlRhadGW2WaYqUK3tK4Bw9SBMZXhmxd3GeAlZjVcODHgiu+THY7A==
+"@poppinss/exception@^1.2.2":
+ version "1.2.2"
+ resolved "https://registry.yarnpkg.com/@poppinss/exception/-/exception-1.2.2.tgz#8d30d42e126c54fe84e997433e4dcac610090743"
+ integrity sha512-m7bpKCD4QMlFCjA/nKTs23fuvoVFoA83brRKmObCUNmi/9tVu8Ve3w4YQAnJu4q3Tjf5fr685HYIC/IA2zHRSg==
-"@prisma/client@^6.7.0":
- version "6.7.0"
- resolved "https://registry.yarnpkg.com/@prisma/client/-/client-6.7.0.tgz#69f913b0a8cfb6aa5de5dca6aa57bfd4e91e7e95"
- integrity sha512-+k61zZn1XHjbZul8q6TdQLpuI/cvyfil87zqK2zpreNIXyXtpUv3+H/oM69hcsFcZXaokHJIzPAt5Z8C8eK2QA==
+"@prisma/client@^6.11.1":
+ version "6.12.0"
+ resolved "https://registry.yarnpkg.com/@prisma/client/-/client-6.12.0.tgz#e855c76fbad75b9b28ce7879be47bfeaba8ff588"
+ integrity sha512-wn98bJ3Cj6edlF4jjpgXwbnQIo/fQLqqQHPk2POrZPxTlhY3+n90SSIF3LMRVa8VzRFC/Gec3YKJRxRu+AIGVA==
-"@prisma/config@6.7.0":
- version "6.7.0"
- resolved "https://registry.yarnpkg.com/@prisma/config/-/config-6.7.0.tgz#ae80b889ba1facc308ecca2009aa6dfbe92c28db"
- integrity sha512-di8QDdvSz7DLUi3OOcCHSwxRNeW7jtGRUD2+Z3SdNE3A+pPiNT8WgUJoUyOwJmUr5t+JA2W15P78C/N+8RXrOA==
+"@prisma/config@6.12.0":
+ version "6.12.0"
+ resolved "https://registry.yarnpkg.com/@prisma/config/-/config-6.12.0.tgz#365af09f162b59516b4e63153dd0238b50461b6d"
+ integrity sha512-HovZWzhWEMedHxmjefQBRZa40P81N7/+74khKFz9e1AFjakcIQdXgMWKgt20HaACzY+d1LRBC+L4tiz71t9fkg==
dependencies:
- esbuild ">=0.12 <1"
- esbuild-register "3.6.0"
+ jiti "2.4.2"
-"@prisma/debug@6.7.0":
- version "6.7.0"
- resolved "https://registry.yarnpkg.com/@prisma/debug/-/debug-6.7.0.tgz#a955174e4f481b0ca5d7c0fd458ef848432afd59"
- integrity sha512-RabHn9emKoYFsv99RLxvfG2GHzWk2ZI1BuVzqYtmMSIcuGboHY5uFt3Q3boOREM9de6z5s3bQoyKeWnq8Fz22w==
+"@prisma/debug@6.12.0":
+ version "6.12.0"
+ resolved "https://registry.yarnpkg.com/@prisma/debug/-/debug-6.12.0.tgz#15a6a0941624cb0adf20e0df978bbcc85e3c6518"
+ integrity sha512-plbz6z72orcqr0eeio7zgUrZj5EudZUpAeWkFTA/DDdXEj28YHDXuiakvR6S7sD6tZi+jiwQEJAPeV6J6m/tEQ==
-"@prisma/engines-version@6.7.0-36.3cff47a7f5d65c3ea74883f1d736e41d68ce91ed":
- version "6.7.0-36.3cff47a7f5d65c3ea74883f1d736e41d68ce91ed"
- resolved "https://registry.yarnpkg.com/@prisma/engines-version/-/engines-version-6.7.0-36.3cff47a7f5d65c3ea74883f1d736e41d68ce91ed.tgz#4ec7c8ee187924a910ec244e3790412d1069d723"
- integrity sha512-EvpOFEWf1KkJpDsBCrih0kg3HdHuaCnXmMn7XFPObpFTzagK1N0Q0FMnYPsEhvARfANP5Ok11QyoTIRA2hgJTA==
+"@prisma/dmmf@6.12.0":
+ version "6.12.0"
+ resolved "https://registry.yarnpkg.com/@prisma/dmmf/-/dmmf-6.12.0.tgz#fcb94347d1a96db675a18e4d558bf44a37dee737"
+ integrity sha512-vL8zy61mi9Mv+w5qLvtF9hrhGu4rUZqhSpWWTxx1nengr1Wi7JfKkjJGBiCT79hSurq3oMC71iGAScyqwvi4Fg==
-"@prisma/engines@6.7.0":
- version "6.7.0"
- resolved "https://registry.yarnpkg.com/@prisma/engines/-/engines-6.7.0.tgz#291835aa5df84e9c33a1cfe1566e639909d46627"
- integrity sha512-3wDMesnOxPrOsq++e5oKV9LmIiEazFTRFZrlULDQ8fxdub5w4NgRBoxtWbvXmj2nJVCnzuz6eFix3OhIqsZ1jw==
+"@prisma/engines-version@6.12.0-15.8047c96bbd92db98a2abc7c9323ce77c02c89dbc":
+ version "6.12.0-15.8047c96bbd92db98a2abc7c9323ce77c02c89dbc"
+ resolved "https://registry.yarnpkg.com/@prisma/engines-version/-/engines-version-6.12.0-15.8047c96bbd92db98a2abc7c9323ce77c02c89dbc.tgz#db1d677728e1231669e8031ae5f23c393daa3fab"
+ integrity sha512-70vhecxBJlRr06VfahDzk9ow4k1HIaSfVUT3X0/kZoHCMl9zbabut4gEXAyzJZxaCGi5igAA7SyyfBI//mmkbQ==
+
+"@prisma/engines@6.12.0":
+ version "6.12.0"
+ resolved "https://registry.yarnpkg.com/@prisma/engines/-/engines-6.12.0.tgz#a264ac99ec87e95f8b4b276691d43e2ec3306956"
+ integrity sha512-4BRZZUaAuB4p0XhTauxelvFs7IllhPmNLvmla0bO1nkECs8n/o1pUvAVbQ/VOrZR5DnF4HED0PrGai+rIOVePA==
dependencies:
- "@prisma/debug" "6.7.0"
- "@prisma/engines-version" "6.7.0-36.3cff47a7f5d65c3ea74883f1d736e41d68ce91ed"
- "@prisma/fetch-engine" "6.7.0"
- "@prisma/get-platform" "6.7.0"
+ "@prisma/debug" "6.12.0"
+ "@prisma/engines-version" "6.12.0-15.8047c96bbd92db98a2abc7c9323ce77c02c89dbc"
+ "@prisma/fetch-engine" "6.12.0"
+ "@prisma/get-platform" "6.12.0"
-"@prisma/fetch-engine@6.7.0":
- version "6.7.0"
- resolved "https://registry.yarnpkg.com/@prisma/fetch-engine/-/fetch-engine-6.7.0.tgz#c8bc042ee6438d62d5bf77aafa6c56cf0002c5d8"
- integrity sha512-zLlAGnrkmioPKJR4Yf7NfW3hftcvqeNNEHleMZK9yX7RZSkhmxacAYyfGsCcqRt47jiZ7RKdgE0Wh2fWnm7WsQ==
+"@prisma/fetch-engine@6.12.0":
+ version "6.12.0"
+ resolved "https://registry.yarnpkg.com/@prisma/fetch-engine/-/fetch-engine-6.12.0.tgz#231515dde53dd8efc36e79837729456d2b3e71f1"
+ integrity sha512-EamoiwrK46rpWaEbLX9aqKDPOd8IyLnZAkiYXFNuq0YsU0Z8K09/rH8S7feOWAVJ3xzeSgcEJtBlVDrajM9Sag==
dependencies:
- "@prisma/debug" "6.7.0"
- "@prisma/engines-version" "6.7.0-36.3cff47a7f5d65c3ea74883f1d736e41d68ce91ed"
- "@prisma/get-platform" "6.7.0"
+ "@prisma/debug" "6.12.0"
+ "@prisma/engines-version" "6.12.0-15.8047c96bbd92db98a2abc7c9323ce77c02c89dbc"
+ "@prisma/get-platform" "6.12.0"
-"@prisma/get-platform@6.7.0":
- version "6.7.0"
- resolved "https://registry.yarnpkg.com/@prisma/get-platform/-/get-platform-6.7.0.tgz#967f21f8ad966b941dcb47b153b84958655390d1"
- integrity sha512-i9IH5lO4fQwnMLvQLYNdgVh9TK3PuWBfQd7QLk/YurnAIg+VeADcZDbmhAi4XBBDD+hDif9hrKyASu0hbjwabw==
+"@prisma/generator-helper@^6.5.0":
+ version "6.12.0"
+ resolved "https://registry.yarnpkg.com/@prisma/generator-helper/-/generator-helper-6.12.0.tgz#8cafbd8ad2e21ce320ebcda59c4b85e9d8a0dfa9"
+ integrity sha512-Bu8AuZJ7xBkmTUHiAL545sc0R5h9HSCnk3NF0POTh8GOMg3JnSoBJUQXVT2z97vkQ8NhtnqEJUlGwkDTbn8pKw==
dependencies:
- "@prisma/debug" "6.7.0"
+ "@prisma/debug" "6.12.0"
+ "@prisma/dmmf" "6.12.0"
+ "@prisma/generator" "6.12.0"
-"@protobuf-ts/grpcweb-transport@^2.10.0":
- version "2.10.0"
- resolved "https://registry.yarnpkg.com/@protobuf-ts/grpcweb-transport/-/grpcweb-transport-2.10.0.tgz#c09f29694ec7dc4fc1107a0bf30d359325939311"
- integrity sha512-VUyD+8kn4XEfWoEiKjAsWX5XWkt8Gfdp/uquS17yt9hdfMBVx3o5tlXX5ylwfWhcIjbRvkf7WHEEdS2wMuq86Q==
+"@prisma/generator@6.12.0":
+ version "6.12.0"
+ resolved "https://registry.yarnpkg.com/@prisma/generator/-/generator-6.12.0.tgz#c831cb6cb4534566d03d446d30072fc7a0626480"
+ integrity sha512-zHZQKfKNwCp/XweIEuzQG2o4N5AxxWwa9W/QjOP0IFrphjPOTYvsEg8fYqboJDGVAspwY9crT8sppoz5kUovsA==
+
+"@prisma/get-platform@6.12.0":
+ version "6.12.0"
+ resolved "https://registry.yarnpkg.com/@prisma/get-platform/-/get-platform-6.12.0.tgz#b41845b87426b64358018d752b14e9a2c8cb7bc4"
+ integrity sha512-nRerTGhTlgyvcBlyWgt8OLNIV7QgJS2XYXMJD1hysorMCuLAjuDDuoxmVt7C2nLxbuxbWPp7OuFRHC23HqD9dA==
dependencies:
- "@protobuf-ts/runtime" "^2.10.0"
- "@protobuf-ts/runtime-rpc" "^2.10.0"
+ "@prisma/debug" "6.12.0"
-"@protobuf-ts/runtime-rpc@^2.10.0":
- version "2.10.0"
- resolved "https://registry.yarnpkg.com/@protobuf-ts/runtime-rpc/-/runtime-rpc-2.10.0.tgz#68de8dcc369e56579569a4deafd394cf4683dc66"
- integrity sha512-8CS/XPv3+pMK4v8UKhtCdvbS4h9l7aqlteKdRt0/UbIKZ8n0qHj6hX8cBhz2ngvohxCOS0N08zPr9aCLBNhW3Q==
- dependencies:
- "@protobuf-ts/runtime" "^2.10.0"
-
-"@protobuf-ts/runtime@^2.10.0":
- version "2.10.0"
- resolved "https://registry.yarnpkg.com/@protobuf-ts/runtime/-/runtime-2.10.0.tgz#bc90f632647ff2ae72887546ddf3d193f3f43d98"
- integrity sha512-ypYwGg9Pn3W/2lZ7/HW60hONGuSdzphvOY8Dq7LeNttymDe0y3LaTUUMRpuGqOT6FfrWEMnfQbyqU8AAreo8wA==
+"@rolldown/pluginutils@^1.0.0-beta.9":
+ version "1.0.0-beta.29"
+ resolved "https://registry.yarnpkg.com/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.29.tgz#f8fc9a8788757dccba0d3b7fee93183621773d4c"
+ integrity sha512-NIJgOsMjbxAXvoGq/X0gD7VPMQ8j9g0BiDaNjVNVjvl+iKXxL3Jre0v31RmBYeLEmkbj2s02v8vFTbUXi5XS2Q==
"@rollup/plugin-alias@^5.1.1":
version "5.1.1"
resolved "https://registry.yarnpkg.com/@rollup/plugin-alias/-/plugin-alias-5.1.1.tgz#53601d88cda8b1577aa130b4a6e452283605bf26"
integrity sha512-PR9zDb+rOzkRb2VD+EuKB7UC41vU5DIwZ5qqCpk0KJudcWAyi8rvYOhS7+L5aZCspw1stTViLgN5v6FF1p5cgQ==
-"@rollup/plugin-commonjs@^28.0.3":
- version "28.0.3"
- resolved "https://registry.yarnpkg.com/@rollup/plugin-commonjs/-/plugin-commonjs-28.0.3.tgz#44c2cc7c955c6113b96696b55e6bc2446bd67913"
- integrity sha512-pyltgilam1QPdn+Zd9gaCfOLcnjMEJ9gV+bTw6/r73INdvzf1ah9zLIJBm+kW7R6IUFIQ1YO+VqZtYxZNWFPEQ==
+"@rollup/plugin-commonjs@^28.0.6":
+ version "28.0.6"
+ resolved "https://registry.yarnpkg.com/@rollup/plugin-commonjs/-/plugin-commonjs-28.0.6.tgz#32425f28832a1831c4388b71541ef229ef34cd4c"
+ integrity sha512-XSQB1K7FUU5QP+3lOQmVCE3I0FcbbNvmNT4VJSj93iUjayaARrTQeoRdiYQoftAJBLrR9t2agwAd3ekaTgHNlw==
dependencies:
"@rollup/pluginutils" "^5.0.1"
commondir "^1.0.1"
@@ -1634,155 +2036,155 @@
smob "^1.0.0"
terser "^5.17.4"
-"@rollup/pluginutils@^5.0.1", "@rollup/pluginutils@^5.1.0", "@rollup/pluginutils@^5.1.3", "@rollup/pluginutils@^5.1.4":
- version "5.1.4"
- resolved "https://registry.yarnpkg.com/@rollup/pluginutils/-/pluginutils-5.1.4.tgz#bb94f1f9eaaac944da237767cdfee6c5b2262d4a"
- integrity sha512-USm05zrsFxYLPdWWq+K3STlWiT/3ELn3RcV5hJMghpeAIhxfsUIg6mt12CBJBInWMV4VneoV7SfGv8xIwo2qNQ==
+"@rollup/plugin-yaml@^4.1.2":
+ version "4.1.2"
+ resolved "https://registry.yarnpkg.com/@rollup/plugin-yaml/-/plugin-yaml-4.1.2.tgz#a3b4cd5793dfd374b815c60183f5adf21bf1ff66"
+ integrity sha512-RpupciIeZMUqhgFE97ba0s98mOFS7CWzN3EJNhJkqSv9XLlWYtwVdtE6cDw6ASOF/sZVFS7kRJXftaqM2Vakdw==
+ dependencies:
+ "@rollup/pluginutils" "^5.0.1"
+ js-yaml "^4.1.0"
+ tosource "^2.0.0-alpha.3"
+
+"@rollup/pluginutils@^5.0.1", "@rollup/pluginutils@^5.1.0", "@rollup/pluginutils@^5.1.3":
+ version "5.2.0"
+ resolved "https://registry.yarnpkg.com/@rollup/pluginutils/-/pluginutils-5.2.0.tgz#eac25ca5b0bdda4ba735ddaca5fbf26bd435f602"
+ integrity sha512-qWJ2ZTbmumwiLFomfzTyt5Kng4hwPi9rwCYN4SHb6eaRU1KNO4ccxINHr/VhH4GgPlt1XfSTLX2LBTme8ne4Zw==
dependencies:
"@types/estree" "^1.0.0"
estree-walker "^2.0.2"
picomatch "^4.0.2"
-"@rollup/rollup-android-arm-eabi@4.38.0":
- version "4.38.0"
- resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.38.0.tgz#6ba67cc0f3a2d7e3a208256a349c2cb2798f57be"
- integrity sha512-ldomqc4/jDZu/xpYU+aRxo3V4mGCV9HeTgUBANI3oIQMOL+SsxB+S2lxMpkFp5UamSS3XuTMQVbsS24R4J4Qjg==
+"@rollup/rollup-android-arm-eabi@4.45.1":
+ version "4.45.1"
+ resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.45.1.tgz#8560592f0dcf43b8cb0949af9f1d916205148d12"
+ integrity sha512-NEySIFvMY0ZQO+utJkgoMiCAjMrGvnbDLHvcmlA33UXJpYBCvlBEbMMtV837uCkS+plG2umfhn0T5mMAxGrlRA==
-"@rollup/rollup-android-arm64@4.38.0":
- version "4.38.0"
- resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.38.0.tgz#c8806f88fd6727d3cf144c4ffb00f40d451b6618"
- integrity sha512-VUsgcy4GhhT7rokwzYQP+aV9XnSLkkhlEJ0St8pbasuWO/vwphhZQxYEKUP3ayeCYLhk6gEtacRpYP/cj3GjyQ==
+"@rollup/rollup-android-arm64@4.45.1":
+ version "4.45.1"
+ resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.45.1.tgz#6bfb777bbce998691b6fd3e916b05cd46392d020"
+ integrity sha512-ujQ+sMXJkg4LRJaYreaVx7Z/VMgBBd89wGS4qMrdtfUFZ+TSY5Rs9asgjitLwzeIbhwdEhyj29zhst3L1lKsRQ==
-"@rollup/rollup-darwin-arm64@4.38.0":
- version "4.38.0"
- resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.38.0.tgz#c4654989b97bba0de7205cf5b3342984d4451d5a"
- integrity sha512-buA17AYXlW9Rn091sWMq1xGUvWQFOH4N1rqUxGJtEQzhChxWjldGCCup7r/wUnaI6Au8sKXpoh0xg58a7cgcpg==
+"@rollup/rollup-darwin-arm64@4.45.1":
+ version "4.45.1"
+ resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.45.1.tgz#7efce10220293a22e7b7b595d05d8b8400a7bcf3"
+ integrity sha512-FSncqHvqTm3lC6Y13xncsdOYfxGSLnP+73k815EfNmpewPs+EyM49haPS105Rh4aF5mJKywk9X0ogzLXZzN9lA==
-"@rollup/rollup-darwin-x64@4.38.0":
- version "4.38.0"
- resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.38.0.tgz#77ee357aeeefe3fe8bee33df18c240e391450476"
- integrity sha512-Mgcmc78AjunP1SKXl624vVBOF2bzwNWFPMP4fpOu05vS0amnLcX8gHIge7q/lDAHy3T2HeR0TqrriZDQS2Woeg==
+"@rollup/rollup-darwin-x64@4.45.1":
+ version "4.45.1"
+ resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.45.1.tgz#c617a8ece21050bfbea299c126767d2e70cfa79a"
+ integrity sha512-2/vVn/husP5XI7Fsf/RlhDaQJ7x9zjvC81anIVbr4b/f0xtSmXQTFcGIQ/B1cXIYM6h2nAhJkdMHTnD7OtQ9Og==
-"@rollup/rollup-freebsd-arm64@4.38.0":
- version "4.38.0"
- resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.38.0.tgz#ac8028c99221d1cef22788adda465077d5926911"
- integrity sha512-zzJACgjLbQTsscxWqvrEQAEh28hqhebpRz5q/uUd1T7VTwUNZ4VIXQt5hE7ncs0GrF+s7d3S4on4TiXUY8KoQA==
+"@rollup/rollup-freebsd-arm64@4.45.1":
+ version "4.45.1"
+ resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.45.1.tgz#5a6af0a9acf82162d2910933649ae24fc0ea3ecb"
+ integrity sha512-4g1kaDxQItZsrkVTdYQ0bxu4ZIQ32cotoQbmsAnW1jAE4XCMbcBPDirX5fyUzdhVCKgPcrwWuucI8yrVRBw2+g==
-"@rollup/rollup-freebsd-x64@4.38.0":
- version "4.38.0"
- resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.38.0.tgz#64376ff0e1541cd8677e74898782ec4935277e02"
- integrity sha512-hCY/KAeYMCyDpEE4pTETam0XZS4/5GXzlLgpi5f0IaPExw9kuB+PDTOTLuPtM10TlRG0U9OSmXJ+Wq9J39LvAg==
+"@rollup/rollup-freebsd-x64@4.45.1":
+ version "4.45.1"
+ resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.45.1.tgz#ae9709463560196fc275bd0da598668a2e341023"
+ integrity sha512-L/6JsfiL74i3uK1Ti2ZFSNsp5NMiM4/kbbGEcOCps99aZx3g8SJMO1/9Y0n/qKlWZfn6sScf98lEOUe2mBvW9A==
-"@rollup/rollup-linux-arm-gnueabihf@4.38.0":
- version "4.38.0"
- resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.38.0.tgz#7de1584c09adcac08f90d1e500c679c428b6eb36"
- integrity sha512-mimPH43mHl4JdOTD7bUMFhBdrg6f9HzMTOEnzRmXbOZqjijCw8LA5z8uL6LCjxSa67H2xiLFvvO67PT05PRKGg==
+"@rollup/rollup-linux-arm-gnueabihf@4.45.1":
+ version "4.45.1"
+ resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.45.1.tgz#6ec52661764dbd54c19d6520a403aa385a5c0fbf"
+ integrity sha512-RkdOTu2jK7brlu+ZwjMIZfdV2sSYHK2qR08FUWcIoqJC2eywHbXr0L8T/pONFwkGukQqERDheaGTeedG+rra6Q==
-"@rollup/rollup-linux-arm-musleabihf@4.38.0":
- version "4.38.0"
- resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.38.0.tgz#1d5d0f28d93cdc37d60c381c6bbe649bed4960d5"
- integrity sha512-tPiJtiOoNuIH8XGG8sWoMMkAMm98PUwlriOFCCbZGc9WCax+GLeVRhmaxjJtz6WxrPKACgrwoZ5ia/uapq3ZVg==
+"@rollup/rollup-linux-arm-musleabihf@4.45.1":
+ version "4.45.1"
+ resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.45.1.tgz#fd33ba4a43ef8419e96811236493d19436271923"
+ integrity sha512-3kJ8pgfBt6CIIr1o+HQA7OZ9mp/zDk3ctekGl9qn/pRBgrRgfwiffaUmqioUGN9hv0OHv2gxmvdKOkARCtRb8Q==
-"@rollup/rollup-linux-arm64-gnu@4.38.0":
- version "4.38.0"
- resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.38.0.tgz#a97f73a43a374e44bef4a9ed84899c26454831ea"
- integrity sha512-wZco59rIVuB0tjQS0CSHTTUcEde+pXQWugZVxWaQFdQQ1VYub/sTrNdY76D1MKdN2NB48JDuGABP6o6fqos8mA==
+"@rollup/rollup-linux-arm64-gnu@4.45.1":
+ version "4.45.1"
+ resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.45.1.tgz#933b3d99b73c9d7bf4506cab0d5d313c7e74fd2d"
+ integrity sha512-k3dOKCfIVixWjG7OXTCOmDfJj3vbdhN0QYEqB+OuGArOChek22hn7Uy5A/gTDNAcCy5v2YcXRJ/Qcnm4/ma1xw==
-"@rollup/rollup-linux-arm64-musl@4.38.0":
- version "4.38.0"
- resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.38.0.tgz#00e3b646a7976752052ebc72d005808b9e7f2801"
- integrity sha512-fQgqwKmW0REM4LomQ+87PP8w8xvU9LZfeLBKybeli+0yHT7VKILINzFEuggvnV9M3x1Ed4gUBmGUzCo/ikmFbQ==
+"@rollup/rollup-linux-arm64-musl@4.45.1":
+ version "4.45.1"
+ resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.45.1.tgz#dbe9ae24ee9e97b75662fddcb69eb7f23c89280a"
+ integrity sha512-PmI1vxQetnM58ZmDFl9/Uk2lpBBby6B6rF4muJc65uZbxCs0EA7hhKCk2PKlmZKuyVSHAyIw3+/SiuMLxKxWog==
-"@rollup/rollup-linux-loongarch64-gnu@4.38.0":
- version "4.38.0"
- resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.38.0.tgz#0d6dcaa3671cf987faace4b34ab7320ee3c18b65"
- integrity sha512-hz5oqQLXTB3SbXpfkKHKXLdIp02/w3M+ajp8p4yWOWwQRtHWiEOCKtc9U+YXahrwdk+3qHdFMDWR5k+4dIlddg==
+"@rollup/rollup-linux-loongarch64-gnu@4.45.1":
+ version "4.45.1"
+ resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.45.1.tgz#818c5a071eec744436dbcdd76fe9c3c869dc9a8d"
+ integrity sha512-9UmI0VzGmNJ28ibHW2GpE2nF0PBQqsyiS4kcJ5vK+wuwGnV5RlqdczVocDSUfGX/Na7/XINRVoUgJyFIgipoRg==
-"@rollup/rollup-linux-powerpc64le-gnu@4.38.0":
- version "4.38.0"
- resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.38.0.tgz#54c2d7a4d86767001475f0157c408fd042f7fd8f"
- integrity sha512-NXqygK/dTSibQ+0pzxsL3r4Xl8oPqVoWbZV9niqOnIHV/J92fe65pOir0xjkUZDRSPyFRvu+4YOpJF9BZHQImw==
+"@rollup/rollup-linux-powerpc64le-gnu@4.45.1":
+ version "4.45.1"
+ resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.45.1.tgz#6b8591def27d886fa147fb0340126c7d6682a7e4"
+ integrity sha512-7nR2KY8oEOUTD3pBAxIBBbZr0U7U+R9HDTPNy+5nVVHDXI4ikYniH1oxQz9VoB5PbBU1CZuDGHkLJkd3zLMWsg==
-"@rollup/rollup-linux-riscv64-gnu@4.38.0":
- version "4.38.0"
- resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.38.0.tgz#8cb565417b29851a0c549614898bdab689f23187"
- integrity sha512-GEAIabR1uFyvf/jW/5jfu8gjM06/4kZ1W+j1nWTSSB3w6moZEBm7iBtzwQ3a1Pxos2F7Gz+58aVEnZHU295QTg==
+"@rollup/rollup-linux-riscv64-gnu@4.45.1":
+ version "4.45.1"
+ resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.45.1.tgz#f1861ac4ee8da64e0b0d23853ff26fe2baa876cf"
+ integrity sha512-nlcl3jgUultKROfZijKjRQLUu9Ma0PeNv/VFHkZiKbXTBQXhpytS8CIj5/NfBeECZtY2FJQubm6ltIxm/ftxpw==
-"@rollup/rollup-linux-riscv64-musl@4.38.0":
- version "4.38.0"
- resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.38.0.tgz#8bc00b75fd07b15c35a54b41a5f052c01dbf925b"
- integrity sha512-9EYTX+Gus2EGPbfs+fh7l95wVADtSQyYw4DfSBcYdUEAmP2lqSZY0Y17yX/3m5VKGGJ4UmIH5LHLkMJft3bYoA==
+"@rollup/rollup-linux-riscv64-musl@4.45.1":
+ version "4.45.1"
+ resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.45.1.tgz#320c961401a923b374e358664527b188e374e1ae"
+ integrity sha512-HJV65KLS51rW0VY6rvZkiieiBnurSzpzore1bMKAhunQiECPuxsROvyeaot/tcK3A3aGnI+qTHqisrpSgQrpgA==
-"@rollup/rollup-linux-s390x-gnu@4.38.0":
- version "4.38.0"
- resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.38.0.tgz#1fe4a88b97e36d64dbf1f01cfa7842d269a094cf"
- integrity sha512-Mpp6+Z5VhB9VDk7RwZXoG2qMdERm3Jw07RNlXHE0bOnEeX+l7Fy4bg+NxfyN15ruuY3/7Vrbpm75J9QHFqj5+Q==
+"@rollup/rollup-linux-s390x-gnu@4.45.1":
+ version "4.45.1"
+ resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.45.1.tgz#1763eed3362b50b6164d3f0947486c03cc7e616d"
+ integrity sha512-NITBOCv3Qqc6hhwFt7jLV78VEO/il4YcBzoMGGNxznLgRQf43VQDae0aAzKiBeEPIxnDrACiMgbqjuihx08OOw==
-"@rollup/rollup-linux-x64-gnu@4.38.0":
- version "4.38.0"
- resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.38.0.tgz#11c32c463e68a86e279cda090a9405a7558f9406"
- integrity sha512-vPvNgFlZRAgO7rwncMeE0+8c4Hmc+qixnp00/Uv3ht2x7KYrJ6ERVd3/R0nUtlE6/hu7/HiiNHJ/rP6knRFt1w==
+"@rollup/rollup-linux-x64-gnu@4.45.1":
+ version "4.45.1"
+ resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.45.1.tgz#0d4c8d0b8f801902f0844a40a9d981a0179f4971"
+ integrity sha512-+E/lYl6qu1zqgPEnTrs4WysQtvc/Sh4fC2nByfFExqgYrqkKWp1tWIbe+ELhixnenSpBbLXNi6vbEEJ8M7fiHw==
-"@rollup/rollup-linux-x64-musl@4.38.0":
- version "4.38.0"
- resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.38.0.tgz#520c2a8547672ec6c56a6833f6d38e9380d63dc7"
- integrity sha512-q5Zv+goWvQUGCaL7fU8NuTw8aydIL/C9abAVGCzRReuj5h30TPx4LumBtAidrVOtXnlB+RZkBtExMsfqkMfb8g==
+"@rollup/rollup-linux-x64-musl@4.45.1":
+ version "4.45.1"
+ resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.45.1.tgz#ec30bb48b5fe22a3aaba98072f2d5b7139e1a8eb"
+ integrity sha512-a6WIAp89p3kpNoYStITT9RbTbTnqarU7D8N8F2CV+4Cl9fwCOZraLVuVFvlpsW0SbIiYtEnhCZBPLoNdRkjQFw==
-"@rollup/rollup-win32-arm64-msvc@4.38.0":
- version "4.38.0"
- resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.38.0.tgz#d27ab565009357014c9f2d6393ee58bd63a63cb8"
- integrity sha512-u/Jbm1BU89Vftqyqbmxdq14nBaQjQX1HhmsdBWqSdGClNaKwhjsg5TpW+5Ibs1mb8Es9wJiMdl86BcmtUVXNZg==
+"@rollup/rollup-win32-arm64-msvc@4.45.1":
+ version "4.45.1"
+ resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.45.1.tgz#27a6e48d1502e8e4bed96bedfb533738655874f2"
+ integrity sha512-T5Bi/NS3fQiJeYdGvRpTAP5P02kqSOpqiopwhj0uaXB6nzs5JVi2XMJb18JUSKhCOX8+UE1UKQufyD6Or48dJg==
-"@rollup/rollup-win32-ia32-msvc@4.38.0":
- version "4.38.0"
- resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.38.0.tgz#6c02847c60fcc7a6d74e00a60f350d079558d84d"
- integrity sha512-mqu4PzTrlpNHHbu5qleGvXJoGgHpChBlrBx/mEhTPpnAL1ZAYFlvHD7rLK839LLKQzqEQMFJfGrrOHItN4ZQqA==
+"@rollup/rollup-win32-ia32-msvc@4.45.1":
+ version "4.45.1"
+ resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.45.1.tgz#a2fbad3bec20ff879f3fd51720adf33692ca8f3d"
+ integrity sha512-lxV2Pako3ujjuUe9jiU3/s7KSrDfH6IgTSQOnDWr9aJ92YsFd7EurmClK0ly/t8dzMkDtd04g60WX6yl0sGfdw==
-"@rollup/rollup-win32-x64-msvc@4.38.0":
- version "4.38.0"
- resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.38.0.tgz#38197da22c1af7b6b5d1cc7541757379193b8e83"
- integrity sha512-jjqy3uWlecfB98Psxb5cD6Fny9Fupv9LrDSPTQZUROqjvZmcCqNu4UMl7qqhlUUGpwiAkotj6GYu4SZdcr/nLw==
+"@rollup/rollup-win32-x64-msvc@4.45.1":
+ version "4.45.1"
+ resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.45.1.tgz#e5085c6d13da15b4c5133cd2a6bb11f25b6bb77a"
+ integrity sha512-M/fKi4sasCdM8i0aWJjCSFm2qEnYRR8AMLG2kxp6wD13+tMGA4Z1tVAuHkNRjud5SW2EM3naLuK35w9twvf6aA==
-"@sec-ant/readable-stream@^0.4.1":
- version "0.4.1"
- resolved "https://registry.yarnpkg.com/@sec-ant/readable-stream/-/readable-stream-0.4.1.tgz#60de891bb126abfdc5410fdc6166aca065f10a0c"
- integrity sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg==
-
-"@sindresorhus/is@^7.0.1":
- version "7.0.1"
- resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-7.0.1.tgz#693cd0bfa7fdc71a3386b72088b660fb70851927"
- integrity sha512-QWLl2P+rsCJeofkDNIT3WFmb6NrRud1SUYW8dIhXK/46XFV8Q/g7Bsvib0Askb0reRLe+WYPeeE+l5cH7SlkuQ==
+"@sindresorhus/is@^7.0.2":
+ version "7.0.2"
+ resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-7.0.2.tgz#a0df078a8d29f9741503c5a9c302de474ec8564a"
+ integrity sha512-d9xRovfKNz1SKieM0qJdO+PQonjnnIfSNWfHYnBSJ9hkjm0ZPw6HlxscDXYstp3z+7V2GOFHc+J0CYrYTjqCJw==
"@sindresorhus/merge-streams@^2.1.0":
version "2.3.0"
resolved "https://registry.yarnpkg.com/@sindresorhus/merge-streams/-/merge-streams-2.3.0.tgz#719df7fb41766bc143369eaa0dd56d8dc87c9958"
integrity sha512-LtoMMhxAlorcGhmFYI+LhPgbPZCkgP6ra1YL604EeF6U98pLlQ3iWIGMdWSC+vWmPBWBNgmDBAhnAobLROJmwg==
-"@sindresorhus/merge-streams@^4.0.0":
- version "4.0.0"
- resolved "https://registry.yarnpkg.com/@sindresorhus/merge-streams/-/merge-streams-4.0.0.tgz#abb11d99aeb6d27f1b563c38147a72d50058e339"
- integrity sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ==
-
"@speed-highlight/core@^1.2.7":
version "1.2.7"
resolved "https://registry.yarnpkg.com/@speed-highlight/core/-/core-1.2.7.tgz#eeaa7c1e7198559abbb98e4acbc93d108d35f2d3"
integrity sha512-0dxmVj4gxg3Jg879kvFS/msl4s9F3T9UXC1InxgOf7t5NvcPD97u/WTA5vL/IxWHMn7qSxBozqrnnE2wvl1m8g==
-"@stylistic/eslint-plugin@^4.2.0":
- version "4.2.0"
- resolved "https://registry.yarnpkg.com/@stylistic/eslint-plugin/-/eslint-plugin-4.2.0.tgz#7860ea84aa7ee3b21757907b863eb62f4f8b0455"
- integrity sha512-8hXezgz7jexGHdo5WN6JBEIPHCSFyyU4vgbxevu4YLVS5vl+sxqAAGyXSzfNDyR6xMNSH5H1x67nsXcYMOHtZA==
+"@stylistic/eslint-plugin@^5.2.1":
+ version "5.2.2"
+ resolved "https://registry.yarnpkg.com/@stylistic/eslint-plugin/-/eslint-plugin-5.2.2.tgz#a1cb24f17263e1dcb2d5c94069dc3ae7af1eb9ce"
+ integrity sha512-bE2DUjruqXlHYP3Q2Gpqiuj2bHq7/88FnuaS0FjeGGLCy+X6a07bGVuwtiOYnPSLHR6jmx5Bwdv+j7l8H+G97A==
dependencies:
- "@typescript-eslint/utils" "^8.23.0"
- eslint-visitor-keys "^4.2.0"
- espree "^10.3.0"
+ "@eslint-community/eslint-utils" "^4.7.0"
+ "@typescript-eslint/types" "^8.37.0"
+ eslint-visitor-keys "^4.2.1"
+ espree "^10.4.0"
estraverse "^5.3.0"
- picomatch "^4.0.2"
+ picomatch "^4.0.3"
"@swc/helpers@^0.5.12":
- version "0.5.15"
- resolved "https://registry.yarnpkg.com/@swc/helpers/-/helpers-0.5.15.tgz#79efab344c5819ecf83a43f3f9f811fc84b516d7"
- integrity sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==
+ version "0.5.17"
+ resolved "https://registry.yarnpkg.com/@swc/helpers/-/helpers-0.5.17.tgz#5a7be95ac0f0bf186e7e6e890e7a6f6cda6ce971"
+ integrity sha512-5IKx/Y13RsYd+sauPb2x+U/xZikHjolzfuDgTAl/Tdf3Q8rslRvC19NKDLgAJQ6wsqADk10ntlv08nPFw/gO/A==
dependencies:
tslib "^2.8.0"
@@ -1793,86 +2195,106 @@
dependencies:
mini-svg-data-uri "^1.2.3"
-"@tailwindcss/node@4.0.17":
- version "4.0.17"
- resolved "https://registry.yarnpkg.com/@tailwindcss/node/-/node-4.0.17.tgz#c40a29035ceb40b7de38e155b5dacfda20dd47e9"
- integrity sha512-LIdNwcqyY7578VpofXyqjH6f+3fP4nrz7FBLki5HpzqjYfXdF2m/eW18ZfoKePtDGg90Bvvfpov9d2gy5XVCbg==
+"@tailwindcss/node@4.1.11":
+ version "4.1.11"
+ resolved "https://registry.yarnpkg.com/@tailwindcss/node/-/node-4.1.11.tgz#d626af65fc9872e5e9d8884791d7e3856e945359"
+ integrity sha512-yzhzuGRmv5QyU9qLNg4GTlYI6STedBWRE7NjxP45CsFYYq9taI0zJXZBMqIC/c8fViNLhmrbpSFS57EoxUmD6Q==
dependencies:
+ "@ampproject/remapping" "^2.3.0"
enhanced-resolve "^5.18.1"
jiti "^2.4.2"
- tailwindcss "4.0.17"
+ lightningcss "1.30.1"
+ magic-string "^0.30.17"
+ source-map-js "^1.2.1"
+ tailwindcss "4.1.11"
-"@tailwindcss/oxide-android-arm64@4.0.17":
- version "4.0.17"
- resolved "https://registry.yarnpkg.com/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.0.17.tgz#f8e1bb04c3af8923f39d3ddf3a3a52d2a398b29b"
- integrity sha512-3RfO0ZK64WAhop+EbHeyxGThyDr/fYhxPzDbEQjD2+v7ZhKTb2svTWy+KK+J1PHATus2/CQGAGp7pHY/8M8ugg==
+"@tailwindcss/oxide-android-arm64@4.1.11":
+ version "4.1.11"
+ resolved "https://registry.yarnpkg.com/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.1.11.tgz#1f387d8302f011b61c226deb0c3a1d2bd79c6915"
+ integrity sha512-3IfFuATVRUMZZprEIx9OGDjG3Ou3jG4xQzNTvjDoKmU9JdmoCohQJ83MYd0GPnQIu89YoJqvMM0G3uqLRFtetg==
-"@tailwindcss/oxide-darwin-arm64@4.0.17":
- version "4.0.17"
- resolved "https://registry.yarnpkg.com/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.0.17.tgz#345ff836e24f57ab4ae3837e677ecc80ca964e8b"
- integrity sha512-e1uayxFQCCDuzTk9s8q7MC5jFN42IY7nzcr5n0Mw/AcUHwD6JaBkXnATkD924ZsHyPDvddnusIEvkgLd2CiREg==
+"@tailwindcss/oxide-darwin-arm64@4.1.11":
+ version "4.1.11"
+ resolved "https://registry.yarnpkg.com/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.1.11.tgz#acd35ffb7e4eae83d0a3fe2f8ea36cfcc9b21f7e"
+ integrity sha512-ESgStEOEsyg8J5YcMb1xl8WFOXfeBmrhAwGsFxxB2CxY9evy63+AtpbDLAyRkJnxLy2WsD1qF13E97uQyP1lfQ==
-"@tailwindcss/oxide-darwin-x64@4.0.17":
- version "4.0.17"
- resolved "https://registry.yarnpkg.com/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.0.17.tgz#b16698d42a29ed8e26b9b6063afceefdbe4dd9dd"
- integrity sha512-d6z7HSdOKfXQ0HPlVx1jduUf/YtBuCCtEDIEFeBCzgRRtDsUuRtofPqxIVaSCUTOk5+OfRLonje6n9dF6AH8wQ==
+"@tailwindcss/oxide-darwin-x64@4.1.11":
+ version "4.1.11"
+ resolved "https://registry.yarnpkg.com/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.1.11.tgz#a0022312993a3893d6ff0312d6e3c83c4636fef4"
+ integrity sha512-EgnK8kRchgmgzG6jE10UQNaH9Mwi2n+yw1jWmof9Vyg2lpKNX2ioe7CJdf9M5f8V9uaQxInenZkOxnTVL3fhAw==
-"@tailwindcss/oxide-freebsd-x64@4.0.17":
- version "4.0.17"
- resolved "https://registry.yarnpkg.com/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.0.17.tgz#4b92d981ff70fb354959c3e517a25e3590f2037d"
- integrity sha512-EjrVa6lx3wzXz3l5MsdOGtYIsRjgs5Mru6lDv4RuiXpguWeOb3UzGJ7vw7PEzcFadKNvNslEQqoAABeMezprxQ==
+"@tailwindcss/oxide-freebsd-x64@4.1.11":
+ version "4.1.11"
+ resolved "https://registry.yarnpkg.com/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.1.11.tgz#dd8e55eb0b88fe7995b8148c0e0ae5fa27092d22"
+ integrity sha512-xdqKtbpHs7pQhIKmqVpxStnY1skuNh4CtbcyOHeX1YBE0hArj2romsFGb6yUmzkq/6M24nkxDqU8GYrKrz+UcA==
-"@tailwindcss/oxide-linux-arm-gnueabihf@4.0.17":
- version "4.0.17"
- resolved "https://registry.yarnpkg.com/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.0.17.tgz#94154c6f4174b375b3bedc9fecf88e7c55072aaa"
- integrity sha512-65zXfCOdi8wuaY0Ye6qMR5LAXokHYtrGvo9t/NmxvSZtCCitXV/gzJ/WP5ksXPhff1SV5rov0S+ZIZU+/4eyCQ==
+"@tailwindcss/oxide-linux-arm-gnueabihf@4.1.11":
+ version "4.1.11"
+ resolved "https://registry.yarnpkg.com/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.1.11.tgz#02ee99090988847d3f13d277679012cbffcdde37"
+ integrity sha512-ryHQK2eyDYYMwB5wZL46uoxz2zzDZsFBwfjssgB7pzytAeCCa6glsiJGjhTEddq/4OsIjsLNMAiMlHNYnkEEeg==
-"@tailwindcss/oxide-linux-arm64-gnu@4.0.17":
- version "4.0.17"
- resolved "https://registry.yarnpkg.com/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.0.17.tgz#11614d3642ab9eb8b42a0bf28e952a833801a09b"
- integrity sha512-+aaq6hJ8ioTdbJV5IA1WjWgLmun4T7eYLTvJIToiXLHy5JzUERRbIZjAcjgK9qXMwnvuu7rqpxzej+hGoEcG5g==
+"@tailwindcss/oxide-linux-arm64-gnu@4.1.11":
+ version "4.1.11"
+ resolved "https://registry.yarnpkg.com/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.1.11.tgz#4837559c102bebe65089879f6a0278ed473b4813"
+ integrity sha512-mYwqheq4BXF83j/w75ewkPJmPZIqqP1nhoghS9D57CLjsh3Nfq0m4ftTotRYtGnZd3eCztgbSPJ9QhfC91gDZQ==
-"@tailwindcss/oxide-linux-arm64-musl@4.0.17":
- version "4.0.17"
- resolved "https://registry.yarnpkg.com/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.0.17.tgz#5dc1826d103d8082e9d3f3fe4d3180bf8cf80163"
- integrity sha512-/FhWgZCdUGAeYHYnZKekiOC0aXFiBIoNCA0bwzkICiMYS5Rtx2KxFfMUXQVnl4uZRblG5ypt5vpPhVaXgGk80w==
+"@tailwindcss/oxide-linux-arm64-musl@4.1.11":
+ version "4.1.11"
+ resolved "https://registry.yarnpkg.com/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.1.11.tgz#bec465112a13a1383558ff36afdf28b8a8cb9021"
+ integrity sha512-m/NVRFNGlEHJrNVk3O6I9ggVuNjXHIPoD6bqay/pubtYC9QIdAMpS+cswZQPBLvVvEF6GtSNONbDkZrjWZXYNQ==
-"@tailwindcss/oxide-linux-x64-gnu@4.0.17":
- version "4.0.17"
- resolved "https://registry.yarnpkg.com/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.0.17.tgz#1d50848d4b21d528f63f470ae7239db2624dc6bb"
- integrity sha512-gELJzOHK6GDoIpm/539Golvk+QWZjxQcbkKq9eB2kzNkOvrP0xc5UPgO9bIMNt1M48mO8ZeNenCMGt6tfkvVBg==
+"@tailwindcss/oxide-linux-x64-gnu@4.1.11":
+ version "4.1.11"
+ resolved "https://registry.yarnpkg.com/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.1.11.tgz#f9e47e6aa67ff77f32f7412bc9698d4278e101bf"
+ integrity sha512-YW6sblI7xukSD2TdbbaeQVDysIm/UPJtObHJHKxDEcW2exAtY47j52f8jZXkqE1krdnkhCMGqP3dbniu1Te2Fg==
-"@tailwindcss/oxide-linux-x64-musl@4.0.17":
- version "4.0.17"
- resolved "https://registry.yarnpkg.com/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.0.17.tgz#ac1d476927a89f862c67937e9369edaf6eccb592"
- integrity sha512-68NwxcJrZn94IOW4TysMIbYv5AlM6So1luTlbYUDIGnKma1yTFGBRNEJ+SacJ3PZE2rgcTBNRHX1TB4EQ/XEHw==
+"@tailwindcss/oxide-linux-x64-musl@4.1.11":
+ version "4.1.11"
+ resolved "https://registry.yarnpkg.com/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.1.11.tgz#7d6e8adcfb9bc84d8e2e2e8781d661edb9e41ba8"
+ integrity sha512-e3C/RRhGunWYNC3aSF7exsQkdXzQ/M+aYuZHKnw4U7KQwTJotnWsGOIVih0s2qQzmEzOFIJ3+xt7iq67K/p56Q==
-"@tailwindcss/oxide-win32-arm64-msvc@4.0.17":
- version "4.0.17"
- resolved "https://registry.yarnpkg.com/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.0.17.tgz#f30694a6bea7f84c4b367b2af81085cb3bf569bc"
- integrity sha512-AkBO8efP2/7wkEXkNlXzRD4f/7WerqKHlc6PWb5v0jGbbm22DFBLbIM19IJQ3b+tNewQZa+WnPOaGm0SmwMNjw==
+"@tailwindcss/oxide-wasm32-wasi@4.1.11":
+ version "4.1.11"
+ resolved "https://registry.yarnpkg.com/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.1.11.tgz#a1762f4939c6ebaa824696fda2fd7db1b85fbed2"
+ integrity sha512-Xo1+/GU0JEN/C/dvcammKHzeM6NqKovG+6921MR6oadee5XPBaKOumrJCXvopJ/Qb5TH7LX/UAywbqrP4lax0g==
+ dependencies:
+ "@emnapi/core" "^1.4.3"
+ "@emnapi/runtime" "^1.4.3"
+ "@emnapi/wasi-threads" "^1.0.2"
+ "@napi-rs/wasm-runtime" "^0.2.11"
+ "@tybys/wasm-util" "^0.9.0"
+ tslib "^2.8.0"
-"@tailwindcss/oxide-win32-x64-msvc@4.0.17":
- version "4.0.17"
- resolved "https://registry.yarnpkg.com/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.0.17.tgz#ac86a140bbe205c1285d20f6c490b3b51598fdc0"
- integrity sha512-7/DTEvXcoWlqX0dAlcN0zlmcEu9xSermuo7VNGX9tJ3nYMdo735SHvbrHDln1+LYfF6NhJ3hjbpbjkMOAGmkDg==
+"@tailwindcss/oxide-win32-arm64-msvc@4.1.11":
+ version "4.1.11"
+ resolved "https://registry.yarnpkg.com/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.1.11.tgz#70ba392dca0fa3707ebe27d2bd6ac3e69d35e3b7"
+ integrity sha512-UgKYx5PwEKrac3GPNPf6HVMNhUIGuUh4wlDFR2jYYdkX6pL/rn73zTq/4pzUm8fOjAn5L8zDeHp9iXmUGOXZ+w==
-"@tailwindcss/oxide@4.0.17":
- version "4.0.17"
- resolved "https://registry.yarnpkg.com/@tailwindcss/oxide/-/oxide-4.0.17.tgz#8b496d8645508fd8f39035930e05b5674f1817f2"
- integrity sha512-B4OaUIRD2uVrULpAD1Yksx2+wNarQr2rQh65nXqaqbLY1jCd8fO+3KLh/+TH4Hzh2NTHQvgxVbPdUDOtLk7vAw==
+"@tailwindcss/oxide-win32-x64-msvc@4.1.11":
+ version "4.1.11"
+ resolved "https://registry.yarnpkg.com/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.1.11.tgz#cdcb9eea9225a346c0695f67f621990b0534763f"
+ integrity sha512-YfHoggn1j0LK7wR82TOucWc5LDCguHnoS879idHekmmiR7g9HUtMw9MI0NHatS28u/Xlkfi9w5RJWgz2Dl+5Qg==
+
+"@tailwindcss/oxide@4.1.11":
+ version "4.1.11"
+ resolved "https://registry.yarnpkg.com/@tailwindcss/oxide/-/oxide-4.1.11.tgz#569b668c99c337b7b8204bc5b6a833429755a05b"
+ integrity sha512-Q69XzrtAhuyfHo+5/HMgr1lAiPP/G40OMFAnws7xcFEYqcypZmdW8eGXaOUIeOl1dzPJBPENXgbjsOyhg2nkrg==
+ dependencies:
+ detect-libc "^2.0.4"
+ tar "^7.4.3"
optionalDependencies:
- "@tailwindcss/oxide-android-arm64" "4.0.17"
- "@tailwindcss/oxide-darwin-arm64" "4.0.17"
- "@tailwindcss/oxide-darwin-x64" "4.0.17"
- "@tailwindcss/oxide-freebsd-x64" "4.0.17"
- "@tailwindcss/oxide-linux-arm-gnueabihf" "4.0.17"
- "@tailwindcss/oxide-linux-arm64-gnu" "4.0.17"
- "@tailwindcss/oxide-linux-arm64-musl" "4.0.17"
- "@tailwindcss/oxide-linux-x64-gnu" "4.0.17"
- "@tailwindcss/oxide-linux-x64-musl" "4.0.17"
- "@tailwindcss/oxide-win32-arm64-msvc" "4.0.17"
- "@tailwindcss/oxide-win32-x64-msvc" "4.0.17"
+ "@tailwindcss/oxide-android-arm64" "4.1.11"
+ "@tailwindcss/oxide-darwin-arm64" "4.1.11"
+ "@tailwindcss/oxide-darwin-x64" "4.1.11"
+ "@tailwindcss/oxide-freebsd-x64" "4.1.11"
+ "@tailwindcss/oxide-linux-arm-gnueabihf" "4.1.11"
+ "@tailwindcss/oxide-linux-arm64-gnu" "4.1.11"
+ "@tailwindcss/oxide-linux-arm64-musl" "4.1.11"
+ "@tailwindcss/oxide-linux-x64-gnu" "4.1.11"
+ "@tailwindcss/oxide-linux-x64-musl" "4.1.11"
+ "@tailwindcss/oxide-wasm32-wasi" "4.1.11"
+ "@tailwindcss/oxide-win32-arm64-msvc" "4.1.11"
+ "@tailwindcss/oxide-win32-x64-msvc" "4.1.11"
"@tailwindcss/typography@^0.5.15":
version "0.5.16"
@@ -1885,26 +2307,25 @@
postcss-selector-parser "6.0.10"
"@tailwindcss/vite@^4.0.6":
- version "4.0.17"
- resolved "https://registry.yarnpkg.com/@tailwindcss/vite/-/vite-4.0.17.tgz#57d710e96a3d73aa0e54093d480eb0f9466a82fb"
- integrity sha512-HJbBYDlDVg5cvYZzECb6xwc1IDCEM3uJi3hEZp3BjZGCNGJcTsnCpan+z+VMW0zo6gR0U6O6ElqU1OoZ74Dhww==
+ version "4.1.11"
+ resolved "https://registry.yarnpkg.com/@tailwindcss/vite/-/vite-4.1.11.tgz#9af1c9d328b31e67c6a0657500bcaa78be6df9f7"
+ integrity sha512-RHYhrR3hku0MJFRV+fN2gNbDNEh3dwKvY8XJvTxCSXeMOsCRSr+uKvDWQcbizrHgjML6ZmTE5OwMrl5wKcujCw==
dependencies:
- "@tailwindcss/node" "4.0.17"
- "@tailwindcss/oxide" "4.0.17"
- lightningcss "1.29.2"
- tailwindcss "4.0.17"
+ "@tailwindcss/node" "4.1.11"
+ "@tailwindcss/oxide" "4.1.11"
+ tailwindcss "4.1.11"
-"@tanstack/virtual-core@3.13.5":
- version "3.13.5"
- resolved "https://registry.yarnpkg.com/@tanstack/virtual-core/-/virtual-core-3.13.5.tgz#0128ac36b027e44a5b63e38bf6b01e50008b7aff"
- integrity sha512-gMLNylxhJdUlfRR1G3U9rtuwUh2IjdrrniJIDcekVJN3/3i+bluvdMi3+eodnxzJq5nKnxnigo9h0lIpaqV6HQ==
+"@tanstack/virtual-core@3.13.12":
+ version "3.13.12"
+ resolved "https://registry.yarnpkg.com/@tanstack/virtual-core/-/virtual-core-3.13.12.tgz#1dff176df9cc8f93c78c5e46bcea11079b397578"
+ integrity sha512-1YBOJfRHV4sXUmWsFSf5rQor4Ss82G8dQWLRbnk3GA4jeP8hQt1hxXh0tmflpC0dz3VgEv/1+qwPyLeWkQuPFA==
"@tanstack/vue-virtual@^3.0.0-beta.60":
- version "3.13.5"
- resolved "https://registry.yarnpkg.com/@tanstack/vue-virtual/-/vue-virtual-3.13.5.tgz#8d2123863e2fb4b6d49637797fd1c80753ddff08"
- integrity sha512-1hhUA6CUjmKc5JDyKLcYOV6mI631FaKKxXh77Ja4UtIy6EOofYaLPk8vVgvK6vLMUSfHR2vI3ZpPY9ibyX60SA==
+ version "3.13.12"
+ resolved "https://registry.yarnpkg.com/@tanstack/vue-virtual/-/vue-virtual-3.13.12.tgz#a66daac9e6822ce4bcba76a3954937440697c264"
+ integrity sha512-vhF7kEU9EXWXh+HdAwKJ2m3xaOnTTmgcdXcF2pim8g4GvI7eRrk2YRuV5nUlZnd/NbCIX4/Ja2OZu5EjJL06Ww==
dependencies:
- "@tanstack/virtual-core" "3.13.5"
+ "@tanstack/virtual-core" "3.13.12"
"@tokenizer/token@^0.3.0":
version "0.3.0"
@@ -1916,6 +2337,18 @@
resolved "https://registry.yarnpkg.com/@trysound/sax/-/sax-0.2.0.tgz#cccaab758af56761eb7bf37af6f03f326dd798ad"
integrity sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==
+"@twemoji/parser@16.0.0":
+ version "16.0.0"
+ resolved "https://registry.yarnpkg.com/@twemoji/parser/-/parser-16.0.0.tgz#289f610ed73204f46141a94180566cf3c1f86f81"
+ integrity sha512-jmuIjkp3OIaEemwMy3sArBwZSuZkRqmueGwRe2Zk4cFzbUJISFBJSZLDUUBNIgq3c+nY49ideYN2OiII6JUqwA==
+
+"@tybys/wasm-util@^0.10.0":
+ version "0.10.0"
+ resolved "https://registry.yarnpkg.com/@tybys/wasm-util/-/wasm-util-0.10.0.tgz#2fd3cd754b94b378734ce17058d0507c45c88369"
+ integrity sha512-VyyPYFlOMNylG45GoAe0xDoLwWuowvf92F9kySqzYh8vmYm7D2u4iUJKa1tOUpS70Ku13ASrOkS4ScXFsTaCNQ==
+ dependencies:
+ tslib "^2.4.0"
+
"@tybys/wasm-util@^0.9.0":
version "0.9.0"
resolved "https://registry.yarnpkg.com/@tybys/wasm-util/-/wasm-util-0.9.0.tgz#3e75eb00604c8d6db470bf18c37b7d984a0e3355"
@@ -1937,15 +2370,10 @@
dependencies:
"@types/ms" "*"
-"@types/doctrine@^0.0.9":
- version "0.0.9"
- resolved "https://registry.yarnpkg.com/@types/doctrine/-/doctrine-0.0.9.tgz#d86a5f452a15e3e3113b99e39616a9baa0f9863f"
- integrity sha512-eOIHzCUSH7SMfonMG1LsC2f8vxBFtho6NGBznK41R84YzPuvSBzrhEps33IsQiOW9+VL6NQ9DbjQJznk/S4uRA==
-
-"@types/estree@*", "@types/estree@1.0.7", "@types/estree@^1.0.0", "@types/estree@^1.0.6":
- version "1.0.7"
- resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.7.tgz#4158d3105276773d5b7695cd4834b1722e4f37a8"
- integrity sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==
+"@types/estree@*", "@types/estree@1.0.8", "@types/estree@^1.0.0", "@types/estree@^1.0.6", "@types/estree@^1.0.8":
+ version "1.0.8"
+ resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.8.tgz#958b91c991b1867ced318bedea0e215ee050726e"
+ integrity sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==
"@types/json-schema@^7.0.15":
version "7.0.15"
@@ -1963,18 +2391,18 @@
integrity sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==
"@types/node@*":
- version "22.13.14"
- resolved "https://registry.yarnpkg.com/@types/node/-/node-22.13.14.tgz#70d84ec91013dcd2ba2de35532a5a14c2b4cc912"
- integrity sha512-Zs/Ollc1SJ8nKUAgc7ivOEdIBM8JAKgrqqUYi2J997JuKO7/tpQC+WCetQ1sypiKCQWHdvdg9wBNpUPEWZae7w==
+ version "24.1.0"
+ resolved "https://registry.yarnpkg.com/@types/node/-/node-24.1.0.tgz#0993f7dc31ab5cc402d112315b463e383d68a49c"
+ integrity sha512-ut5FthK5moxFKH2T1CUOC6ctR67rQRvvHdFLCD2Ql6KXmMuCrjsSsRI9UsLCm9M18BMwClv4pn327UvB7eeO1w==
dependencies:
- undici-types "~6.20.0"
+ undici-types "~7.8.0"
"@types/node@^22.13.16":
- version "22.13.16"
- resolved "https://registry.yarnpkg.com/@types/node/-/node-22.13.16.tgz#802cff8e4c3b3fc7461c2adcc92d73d89779edad"
- integrity sha512-15tM+qA4Ypml/N7kyRdvfRjBQT2RL461uF1Bldn06K0Nzn1lY3nAPgHlsVrJxdZ9WhZiW0Fmc1lOYMtDsAuB3w==
+ version "22.16.5"
+ resolved "https://registry.yarnpkg.com/@types/node/-/node-22.16.5.tgz#cc46ac3994cd957000d0c11095a0b1dae2ea2368"
+ integrity sha512-bJFoMATwIGaxxx8VJPeM8TonI8t579oRvgAuT8zFugJsJZgzqv0Fu8Mhp68iecjzG7cnN3mO2dJQ5uUM2EFrgQ==
dependencies:
- undici-types "~6.20.0"
+ undici-types "~6.21.0"
"@types/normalize-package-data@^2.4.3":
version "2.4.4"
@@ -1982,190 +2410,251 @@
integrity sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==
"@types/parse-path@^7.0.0":
- version "7.0.3"
- resolved "https://registry.yarnpkg.com/@types/parse-path/-/parse-path-7.0.3.tgz#cec2da2834ab58eb2eb579122d9a1fc13bd7ef36"
- integrity sha512-LriObC2+KYZD3FzCrgWGv/qufdUy4eXrxcLgQMfYXgPbLIecKIsVBaQgUPmxSSLcjmYbDTQbMgr6qr6l/eb7Bg==
+ version "7.1.0"
+ resolved "https://registry.yarnpkg.com/@types/parse-path/-/parse-path-7.1.0.tgz#1bdddfe4fb2038e76c7e622234a97d6a050a1be3"
+ integrity sha512-EULJ8LApcVEPbrfND0cRQqutIOdiIgJ1Mgrhpy755r14xMohPTEpkV/k28SJvuOs9bHRFW8x+KeDAEPiGQPB9Q==
+ dependencies:
+ parse-path "*"
"@types/resolve@1.20.2":
version "1.20.2"
resolved "https://registry.yarnpkg.com/@types/resolve/-/resolve-1.20.2.tgz#97d26e00cd4a0423b4af620abecf3e6f442b7975"
integrity sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==
+"@types/semver@^7.7.0":
+ version "7.7.0"
+ resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.7.0.tgz#64c441bdae033b378b6eef7d0c3d77c329b9378e"
+ integrity sha512-k107IF4+Xr7UHjwDc7Cfd6PRQfbdkiRabXGRjo07b4WyPahFBZCZ1sE+BNxYIJPPg73UkfOsVOLwqVc/6ETrIA==
+
+"@types/triple-beam@^1.3.2":
+ version "1.3.5"
+ resolved "https://registry.yarnpkg.com/@types/triple-beam/-/triple-beam-1.3.5.tgz#74fef9ffbaa198eb8b588be029f38b00299caa2c"
+ integrity sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw==
+
"@types/turndown@^5.0.5":
version "5.0.5"
resolved "https://registry.yarnpkg.com/@types/turndown/-/turndown-5.0.5.tgz#614de24fc9ace4d8c0d9483ba81dc8c1976dd26f"
integrity sha512-TL2IgGgc7B5j78rIccBtlYAnkuv8nUQqhQc+DSYV5j9Be9XOcm/SKOVRuA47xAVI3680Tk9B1d8flK2GWT2+4w==
-"@typescript-eslint/eslint-plugin@^8.28.0":
- version "8.29.1"
- resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.29.1.tgz#593639d9bb5239b2d877d65757b7e2c9100a2e84"
- integrity sha512-ba0rr4Wfvg23vERs3eB+P3lfj2E+2g3lhWcCVukUuhtcdUx5lSIFZlGFEBHKr+3zizDa/TvZTptdNHVZWAkSBg==
+"@types/web-bluetooth@^0.0.21":
+ version "0.0.21"
+ resolved "https://registry.yarnpkg.com/@types/web-bluetooth/-/web-bluetooth-0.0.21.tgz#525433c784aed9b457aaa0ee3d92aeb71f346b63"
+ integrity sha512-oIQLCGWtcFZy2JW77j9k8nHzAOpqMHLQejDA48XXMWH6tjCQHz5RCFz1bzsmROyL6PUm+LLnUiI4BCn221inxA==
+
+"@types/yauzl@^2.9.1":
+ version "2.10.3"
+ resolved "https://registry.yarnpkg.com/@types/yauzl/-/yauzl-2.10.3.tgz#e9b2808b4f109504a03cda958259876f61017999"
+ integrity sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==
+ dependencies:
+ "@types/node" "*"
+
+"@typescript-eslint/eslint-plugin@^8.38.0":
+ version "8.38.0"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.38.0.tgz#6e5220d16f2691ab6d983c1737dd5b36e17641b7"
+ integrity sha512-CPoznzpuAnIOl4nhj4tRr4gIPj5AfKgkiJmGQDaq+fQnRJTYlcBjbX3wbciGmpoPf8DREufuPRe1tNMZnGdanA==
dependencies:
"@eslint-community/regexpp" "^4.10.0"
- "@typescript-eslint/scope-manager" "8.29.1"
- "@typescript-eslint/type-utils" "8.29.1"
- "@typescript-eslint/utils" "8.29.1"
- "@typescript-eslint/visitor-keys" "8.29.1"
+ "@typescript-eslint/scope-manager" "8.38.0"
+ "@typescript-eslint/type-utils" "8.38.0"
+ "@typescript-eslint/utils" "8.38.0"
+ "@typescript-eslint/visitor-keys" "8.38.0"
graphemer "^1.4.0"
- ignore "^5.3.1"
+ ignore "^7.0.0"
natural-compare "^1.4.0"
- ts-api-utils "^2.0.1"
+ ts-api-utils "^2.1.0"
-"@typescript-eslint/parser@^8.28.0":
- version "8.29.1"
- resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-8.29.1.tgz#10bf37411be0a199c27b6515726e22fe8d3df8d0"
- integrity sha512-zczrHVEqEaTwh12gWBIJWj8nx+ayDcCJs06yoNMY0kwjMWDM6+kppljY+BxWI06d2Ja+h4+WdufDcwMnnMEWmg==
+"@typescript-eslint/parser@^8.38.0":
+ version "8.38.0"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-8.38.0.tgz#6723a5ea881e1777956b1045cba30be5ea838293"
+ integrity sha512-Zhy8HCvBUEfBECzIl1PKqF4p11+d0aUJS1GeUiuqK9WmOug8YCmC4h4bjyBvMyAMI9sbRczmrYL5lKg/YMbrcQ==
dependencies:
- "@typescript-eslint/scope-manager" "8.29.1"
- "@typescript-eslint/types" "8.29.1"
- "@typescript-eslint/typescript-estree" "8.29.1"
- "@typescript-eslint/visitor-keys" "8.29.1"
+ "@typescript-eslint/scope-manager" "8.38.0"
+ "@typescript-eslint/types" "8.38.0"
+ "@typescript-eslint/typescript-estree" "8.38.0"
+ "@typescript-eslint/visitor-keys" "8.38.0"
debug "^4.3.4"
-"@typescript-eslint/scope-manager@8.29.1":
- version "8.29.1"
- resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-8.29.1.tgz#cfdfd4144f20c38b9d3e430efd6480e297ef52f6"
- integrity sha512-2nggXGX5F3YrsGN08pw4XpMLO1Rgtnn4AzTegC2MDesv6q3QaTU5yU7IbS1tf1IwCR0Hv/1EFygLn9ms6LIpDA==
+"@typescript-eslint/project-service@8.38.0":
+ version "8.38.0"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/project-service/-/project-service-8.38.0.tgz#4900771f943163027fd7d2020a062892056b5e2f"
+ integrity sha512-dbK7Jvqcb8c9QfH01YB6pORpqX1mn5gDZc9n63Ak/+jD67oWXn3Gs0M6vddAN+eDXBCS5EmNWzbSxsn9SzFWWg==
dependencies:
- "@typescript-eslint/types" "8.29.1"
- "@typescript-eslint/visitor-keys" "8.29.1"
-
-"@typescript-eslint/type-utils@8.29.1":
- version "8.29.1"
- resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-8.29.1.tgz#653dfff5c1711bc920a6a46a5a2c274899f00179"
- integrity sha512-DkDUSDwZVCYN71xA4wzySqqcZsHKic53A4BLqmrWFFpOpNSoxX233lwGu/2135ymTCR04PoKiEEEvN1gFYg4Tw==
- dependencies:
- "@typescript-eslint/typescript-estree" "8.29.1"
- "@typescript-eslint/utils" "8.29.1"
+ "@typescript-eslint/tsconfig-utils" "^8.38.0"
+ "@typescript-eslint/types" "^8.38.0"
debug "^4.3.4"
- ts-api-utils "^2.0.1"
-"@typescript-eslint/types@8.29.1", "@typescript-eslint/types@^8.28.0":
- version "8.29.1"
- resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-8.29.1.tgz#984ed1283fedbfb41d3993a9abdcb7b299971500"
- integrity sha512-VT7T1PuJF1hpYC3AGm2rCgJBjHL3nc+A/bhOp9sGMKfi5v0WufsX/sHCFBfNTx2F+zA6qBc/PD0/kLRLjdt8mQ==
-
-"@typescript-eslint/typescript-estree@8.29.1":
- version "8.29.1"
- resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-8.29.1.tgz#4ac085665ed5390d11c0e3426427978570e3b747"
- integrity sha512-l1enRoSaUkQxOQnbi0KPUtqeZkSiFlqrx9/3ns2rEDhGKfTa+88RmXqedC1zmVTOWrLc2e6DEJrTA51C9iLH5g==
+"@typescript-eslint/scope-manager@8.38.0", "@typescript-eslint/scope-manager@^8.13.0":
+ version "8.38.0"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-8.38.0.tgz#5a0efcb5c9cf6e4121b58f87972f567c69529226"
+ integrity sha512-WJw3AVlFFcdT9Ri1xs/lg8LwDqgekWXWhH3iAF+1ZM+QPd7oxQ6jvtW/JPwzAScxitILUIFs0/AnQ/UWHzbATQ==
dependencies:
- "@typescript-eslint/types" "8.29.1"
- "@typescript-eslint/visitor-keys" "8.29.1"
+ "@typescript-eslint/types" "8.38.0"
+ "@typescript-eslint/visitor-keys" "8.38.0"
+
+"@typescript-eslint/tsconfig-utils@8.38.0", "@typescript-eslint/tsconfig-utils@^8.38.0":
+ version "8.38.0"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.38.0.tgz#6de4ce224a779601a8df667db56527255c42c4d0"
+ integrity sha512-Lum9RtSE3EroKk/bYns+sPOodqb2Fv50XOl/gMviMKNvanETUuUcC9ObRbzrJ4VSd2JalPqgSAavwrPiPvnAiQ==
+
+"@typescript-eslint/type-utils@8.38.0":
+ version "8.38.0"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-8.38.0.tgz#a56cd84765fa6ec135fe252b5db61e304403a85b"
+ integrity sha512-c7jAvGEZVf0ao2z+nnz8BUaHZD09Agbh+DY7qvBQqLiz8uJzRgVPj5YvOh8I8uEiH8oIUGIfHzMwUcGVco/SJg==
+ dependencies:
+ "@typescript-eslint/types" "8.38.0"
+ "@typescript-eslint/typescript-estree" "8.38.0"
+ "@typescript-eslint/utils" "8.38.0"
+ debug "^4.3.4"
+ ts-api-utils "^2.1.0"
+
+"@typescript-eslint/types@8.38.0", "@typescript-eslint/types@^8.34.0", "@typescript-eslint/types@^8.34.1", "@typescript-eslint/types@^8.35.0", "@typescript-eslint/types@^8.37.0", "@typescript-eslint/types@^8.38.0":
+ version "8.38.0"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-8.38.0.tgz#297351c994976b93c82ac0f0e206c8143aa82529"
+ integrity sha512-wzkUfX3plUqij4YwWaJyqhiPE5UCRVlFpKn1oCRn2O1bJ592XxWJj8ROQ3JD5MYXLORW84063z3tZTb/cs4Tyw==
+
+"@typescript-eslint/typescript-estree@8.38.0", "@typescript-eslint/typescript-estree@^8.13.0", "@typescript-eslint/typescript-estree@^8.23.0":
+ version "8.38.0"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-8.38.0.tgz#82262199eb6778bba28a319e25ad05b1158957df"
+ integrity sha512-fooELKcAKzxux6fA6pxOflpNS0jc+nOQEEOipXFNjSlBS6fqrJOVY/whSn70SScHrcJ2LDsxWrneFoWYSVfqhQ==
+ dependencies:
+ "@typescript-eslint/project-service" "8.38.0"
+ "@typescript-eslint/tsconfig-utils" "8.38.0"
+ "@typescript-eslint/types" "8.38.0"
+ "@typescript-eslint/visitor-keys" "8.38.0"
debug "^4.3.4"
fast-glob "^3.3.2"
is-glob "^4.0.3"
minimatch "^9.0.4"
semver "^7.6.0"
- ts-api-utils "^2.0.1"
+ ts-api-utils "^2.1.0"
-"@typescript-eslint/utils@8.29.1", "@typescript-eslint/utils@^8.23.0", "@typescript-eslint/utils@^8.28.0", "@typescript-eslint/utils@^8.29.0":
- version "8.29.1"
- resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-8.29.1.tgz#3d206c8c8def3527a8eb0588e94e3e60f7e167c9"
- integrity sha512-QAkFEbytSaB8wnmB+DflhUPz6CLbFWE2SnSCrRMEa+KnXIzDYbpsn++1HGvnfAsUY44doDXmvRkO5shlM/3UfA==
+"@typescript-eslint/utils@8.38.0", "@typescript-eslint/utils@^8.38.0":
+ version "8.38.0"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-8.38.0.tgz#5f10159899d30eb92ba70e642ca6f754bddbf15a"
+ integrity sha512-hHcMA86Hgt+ijJlrD8fX0j1j8w4C92zue/8LOPAFioIno+W0+L7KqE8QZKCcPGc/92Vs9x36w/4MPTJhqXdyvg==
dependencies:
- "@eslint-community/eslint-utils" "^4.4.0"
- "@typescript-eslint/scope-manager" "8.29.1"
- "@typescript-eslint/types" "8.29.1"
- "@typescript-eslint/typescript-estree" "8.29.1"
+ "@eslint-community/eslint-utils" "^4.7.0"
+ "@typescript-eslint/scope-manager" "8.38.0"
+ "@typescript-eslint/types" "8.38.0"
+ "@typescript-eslint/typescript-estree" "8.38.0"
-"@typescript-eslint/visitor-keys@8.29.1":
- version "8.29.1"
- resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-8.29.1.tgz#9b74e5098c71138d42bbf2178fbe4dfad45d6b9a"
- integrity sha512-RGLh5CRaUEf02viP5c1Vh1cMGffQscyHe7HPAzGpfmfflFg1wUz2rYxd+OZqwpeypYvZ8UxSxuIpF++fmOzEcg==
+"@typescript-eslint/visitor-keys@8.38.0":
+ version "8.38.0"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-8.38.0.tgz#a9765a527b082cb8fc60fd8a16e47c7ad5b60ea5"
+ integrity sha512-pWrTcoFNWuwHlA9CvlfSsGWs14JxfN1TH25zM5L7o0pRLhsoZkDnTsXfQRJBEWJoV5DL0jf+Z+sxiud+K0mq1g==
dependencies:
- "@typescript-eslint/types" "8.29.1"
- eslint-visitor-keys "^4.2.0"
+ "@typescript-eslint/types" "8.38.0"
+ eslint-visitor-keys "^4.2.1"
-"@unhead/vue@^2.0.2":
- version "2.0.5"
- resolved "https://registry.yarnpkg.com/@unhead/vue/-/vue-2.0.5.tgz#7c34b598cf1a3381bda6b43ea4edd2483ca575fd"
- integrity sha512-csjNmBHvJGzSestlpApOpgxqaTdXSN2zwNIPFuWB+C4rtLX4x3+Tm7C5rQwU0iYy3CNJGjJT9cCcSyV55Jg4EQ==
+"@unhead/vue@^2.0.12":
+ version "2.0.12"
+ resolved "https://registry.yarnpkg.com/@unhead/vue/-/vue-2.0.12.tgz#65b4b3d61f928d6969ff33728d53311c5b31c8ee"
+ integrity sha512-WFaiCVbBd39FK6Bx3GQskhgT9s45Vjx6dRQegYheVwU1AnF+FAfJVgWbrl21p6fRJcLAFp0xDz6wE18JYBM0eQ==
dependencies:
hookable "^5.5.3"
- unhead "2.0.5"
+ unhead "2.0.12"
-"@unrs/resolver-binding-darwin-arm64@1.4.1":
- version "1.4.1"
- resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-darwin-arm64/-/resolver-binding-darwin-arm64-1.4.1.tgz#56a6638f202eff593dab780cc7b45ea020489dc6"
- integrity sha512-8Tv+Bsd0BjGwfEedIyor4inw8atppRxM5BdUnIt+3mAm/QXUm7Dw74CHnXpfZKXkp07EXJGiA8hStqCINAWhdw==
+"@unrs/resolver-binding-android-arm-eabi@1.11.1":
+ version "1.11.1"
+ resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-android-arm-eabi/-/resolver-binding-android-arm-eabi-1.11.1.tgz#9f5b04503088e6a354295e8ea8fe3cb99e43af81"
+ integrity sha512-ppLRUgHVaGRWUx0R0Ut06Mjo9gBaBkg3v/8AxusGLhsIotbBLuRk51rAzqLC8gq6NyyAojEXglNjzf6R948DNw==
-"@unrs/resolver-binding-darwin-x64@1.4.1":
- version "1.4.1"
- resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-darwin-x64/-/resolver-binding-darwin-x64-1.4.1.tgz#9b935596b19fe249a4823af84e1949605fe084b8"
- integrity sha512-X8c3PhWziEMKAzZz+YAYWfwawi5AEgzy/hmfizAB4C70gMHLKmInJcp1270yYAOs7z07YVFI220pp50z24Jk3A==
+"@unrs/resolver-binding-android-arm64@1.11.1":
+ version "1.11.1"
+ resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-android-arm64/-/resolver-binding-android-arm64-1.11.1.tgz#7414885431bd7178b989aedc4d25cccb3865bc9f"
+ integrity sha512-lCxkVtb4wp1v+EoN+HjIG9cIIzPkX5OtM03pQYkG+U5O/wL53LC4QbIeazgiKqluGeVEeBlZahHalCaBvU1a2g==
-"@unrs/resolver-binding-freebsd-x64@1.4.1":
- version "1.4.1"
- resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-freebsd-x64/-/resolver-binding-freebsd-x64-1.4.1.tgz#72bc9ae0299aad59bb07c53776f1f470f4457528"
- integrity sha512-UUr/nREy1UdtxXQnmLaaTXFGOcGxPwNIzeJdb3KXai3TKtC1UgNOB9s8KOA4TaxOUBR/qVgL5BvBwmUjD5yuVA==
+"@unrs/resolver-binding-darwin-arm64@1.11.1":
+ version "1.11.1"
+ resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-darwin-arm64/-/resolver-binding-darwin-arm64-1.11.1.tgz#b4a8556f42171fb9c9f7bac8235045e82aa0cbdf"
+ integrity sha512-gPVA1UjRu1Y/IsB/dQEsp2V1pm44Of6+LWvbLc9SDk1c2KhhDRDBUkQCYVWe6f26uJb3fOK8saWMgtX8IrMk3g==
-"@unrs/resolver-binding-linux-arm-gnueabihf@1.4.1":
- version "1.4.1"
- resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-linux-arm-gnueabihf/-/resolver-binding-linux-arm-gnueabihf-1.4.1.tgz#82921377ff7e20b28ca26f636b2231fe449d4a53"
- integrity sha512-e3pII53dEeS8inkX6A1ad2UXE0nuoWCqik4kOxaDnls0uJUq0ntdj5d9IYd+bv5TDwf9DSge/xPOvCmRYH+Tsw==
+"@unrs/resolver-binding-darwin-x64@1.11.1":
+ version "1.11.1"
+ resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-darwin-x64/-/resolver-binding-darwin-x64-1.11.1.tgz#fd4d81257b13f4d1a083890a6a17c00de571f0dc"
+ integrity sha512-cFzP7rWKd3lZaCsDze07QX1SC24lO8mPty9vdP+YVa3MGdVgPmFc59317b2ioXtgCMKGiCLxJ4HQs62oz6GfRQ==
-"@unrs/resolver-binding-linux-arm-musleabihf@1.4.1":
- version "1.4.1"
- resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-linux-arm-musleabihf/-/resolver-binding-linux-arm-musleabihf-1.4.1.tgz#9b315738ecd677f9caa93717891016636a2ee820"
- integrity sha512-e/AKKd9gR+HNmVyDEPI/PIz2t0DrA3cyonHNhHVjrkxe8pMCiYiqhtn1+h+yIpHUtUlM6Y1FNIdivFa+r7wrEQ==
+"@unrs/resolver-binding-freebsd-x64@1.11.1":
+ version "1.11.1"
+ resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-freebsd-x64/-/resolver-binding-freebsd-x64-1.11.1.tgz#d2513084d0f37c407757e22f32bd924a78cfd99b"
+ integrity sha512-fqtGgak3zX4DCB6PFpsH5+Kmt/8CIi4Bry4rb1ho6Av2QHTREM+47y282Uqiu3ZRF5IQioJQ5qWRV6jduA+iGw==
-"@unrs/resolver-binding-linux-arm64-gnu@1.4.1":
- version "1.4.1"
- resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-linux-arm64-gnu/-/resolver-binding-linux-arm64-gnu-1.4.1.tgz#98e1bba4f7c7761fdea4ed5effc0a5ad6954cc79"
- integrity sha512-vtIu34luF1jRktlHtiwm2mjuE8oJCsFiFr8hT5+tFQdqFKjPhbJXn83LswKsOhy0GxAEevpXDI4xxEwkjuXIPA==
+"@unrs/resolver-binding-linux-arm-gnueabihf@1.11.1":
+ version "1.11.1"
+ resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-linux-arm-gnueabihf/-/resolver-binding-linux-arm-gnueabihf-1.11.1.tgz#844d2605d057488d77fab09705f2866b86164e0a"
+ integrity sha512-u92mvlcYtp9MRKmP+ZvMmtPN34+/3lMHlyMj7wXJDeXxuM0Vgzz0+PPJNsro1m3IZPYChIkn944wW8TYgGKFHw==
-"@unrs/resolver-binding-linux-arm64-musl@1.4.1":
- version "1.4.1"
- resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-linux-arm64-musl/-/resolver-binding-linux-arm64-musl-1.4.1.tgz#62fb410adcf82b6513891639ef74f7e0339bb681"
- integrity sha512-H3PaOuGyhFXiyJd+09uPhGl4gocmhyi1BRzvsP8Lv5AQO3p3/ZY7WjV4t2NkBksm9tMjf3YbOVHyPWi2eWsNYw==
+"@unrs/resolver-binding-linux-arm-musleabihf@1.11.1":
+ version "1.11.1"
+ resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-linux-arm-musleabihf/-/resolver-binding-linux-arm-musleabihf-1.11.1.tgz#204892995cefb6bd1d017d52d097193bc61ddad3"
+ integrity sha512-cINaoY2z7LVCrfHkIcmvj7osTOtm6VVT16b5oQdS4beibX2SYBwgYLmqhBjA1t51CarSaBuX5YNsWLjsqfW5Cw==
-"@unrs/resolver-binding-linux-ppc64-gnu@1.4.1":
- version "1.4.1"
- resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-linux-ppc64-gnu/-/resolver-binding-linux-ppc64-gnu-1.4.1.tgz#0a0d7bc9eb5ff70678f266a8ee80a464ebbec0e3"
- integrity sha512-4+GmJcaaFntCi1S01YByqp8wLMjV/FyQyHVGm0vedIhL1Vfx7uHkz/sZmKsidRwokBGuxi92GFmSzqT2O8KcNA==
+"@unrs/resolver-binding-linux-arm64-gnu@1.11.1":
+ version "1.11.1"
+ resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-linux-arm64-gnu/-/resolver-binding-linux-arm64-gnu-1.11.1.tgz#023eb0c3aac46066a10be7a3f362e7b34f3bdf9d"
+ integrity sha512-34gw7PjDGB9JgePJEmhEqBhWvCiiWCuXsL9hYphDF7crW7UgI05gyBAi6MF58uGcMOiOqSJ2ybEeCvHcq0BCmQ==
-"@unrs/resolver-binding-linux-s390x-gnu@1.4.1":
- version "1.4.1"
- resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-linux-s390x-gnu/-/resolver-binding-linux-s390x-gnu-1.4.1.tgz#02c9dd02ac1c6192253749cc7fca35b9d7a249bd"
- integrity sha512-6RDQVCmtFYTlhy89D5ixTqo9bTQqFhvNN0Ey1wJs5r+01Dq15gPHRXv2jF2bQATtMrOfYwv+R2ZR9ew1N1N3YQ==
+"@unrs/resolver-binding-linux-arm64-musl@1.11.1":
+ version "1.11.1"
+ resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-linux-arm64-musl/-/resolver-binding-linux-arm64-musl-1.11.1.tgz#9e6f9abb06424e3140a60ac996139786f5d99be0"
+ integrity sha512-RyMIx6Uf53hhOtJDIamSbTskA99sPHS96wxVE/bJtePJJtpdKGXO1wY90oRdXuYOGOTuqjT8ACccMc4K6QmT3w==
-"@unrs/resolver-binding-linux-x64-gnu@1.4.1":
- version "1.4.1"
- resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-linux-x64-gnu/-/resolver-binding-linux-x64-gnu-1.4.1.tgz#83fa32f5da9a5f3143185b2d0bc2ad95e4a7a102"
- integrity sha512-XpU9uzIkD86+19NjCXxlVPISMUrVXsXo5htxtuG+uJ59p5JauSRZsIxQxzzfKzkxEjdvANPM/lS1HFoX6A6QeA==
+"@unrs/resolver-binding-linux-ppc64-gnu@1.11.1":
+ version "1.11.1"
+ resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-linux-ppc64-gnu/-/resolver-binding-linux-ppc64-gnu-1.11.1.tgz#b111417f17c9d1b02efbec8e08398f0c5527bb44"
+ integrity sha512-D8Vae74A4/a+mZH0FbOkFJL9DSK2R6TFPC9M+jCWYia/q2einCubX10pecpDiTmkJVUH+y8K3BZClycD8nCShA==
-"@unrs/resolver-binding-linux-x64-musl@1.4.1":
- version "1.4.1"
- resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-linux-x64-musl/-/resolver-binding-linux-x64-musl-1.4.1.tgz#32405d987943b4fd621f783f33fad700e3ac2d0f"
- integrity sha512-3CDjG/spbTKCSHl66QP2ekHSD+H34i7utuDIM5gzoNBcZ1gTO0Op09Wx5cikXnhORRf9+HyDWzm37vU1PLSM1A==
+"@unrs/resolver-binding-linux-riscv64-gnu@1.11.1":
+ version "1.11.1"
+ resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-linux-riscv64-gnu/-/resolver-binding-linux-riscv64-gnu-1.11.1.tgz#92ffbf02748af3e99873945c9a8a5ead01d508a9"
+ integrity sha512-frxL4OrzOWVVsOc96+V3aqTIQl1O2TjgExV4EKgRY09AJ9leZpEg8Ak9phadbuX0BA4k8U5qtvMSQQGGmaJqcQ==
-"@unrs/resolver-binding-wasm32-wasi@1.4.1":
- version "1.4.1"
- resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-wasm32-wasi/-/resolver-binding-wasm32-wasi-1.4.1.tgz#21d18351367e3bfe035636df05153d7f08823568"
- integrity sha512-50tYhvbCTnuzMn7vmP8IV2UKF7ITo1oihygEYq9wW2DUb/Y+QMqBHJUSCABRngATjZ4shOK6f2+s0gQX6ElENQ==
+"@unrs/resolver-binding-linux-riscv64-musl@1.11.1":
+ version "1.11.1"
+ resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-linux-riscv64-musl/-/resolver-binding-linux-riscv64-musl-1.11.1.tgz#0bec6f1258fc390e6b305e9ff44256cb207de165"
+ integrity sha512-mJ5vuDaIZ+l/acv01sHoXfpnyrNKOk/3aDoEdLO/Xtn9HuZlDD6jKxHlkN8ZhWyLJsRBxfv9GYM2utQ1SChKew==
+
+"@unrs/resolver-binding-linux-s390x-gnu@1.11.1":
+ version "1.11.1"
+ resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-linux-s390x-gnu/-/resolver-binding-linux-s390x-gnu-1.11.1.tgz#577843a084c5952f5906770633ccfb89dac9bc94"
+ integrity sha512-kELo8ebBVtb9sA7rMe1Cph4QHreByhaZ2QEADd9NzIQsYNQpt9UkM9iqr2lhGr5afh885d/cB5QeTXSbZHTYPg==
+
+"@unrs/resolver-binding-linux-x64-gnu@1.11.1":
+ version "1.11.1"
+ resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-linux-x64-gnu/-/resolver-binding-linux-x64-gnu-1.11.1.tgz#36fb318eebdd690f6da32ac5e0499a76fa881935"
+ integrity sha512-C3ZAHugKgovV5YvAMsxhq0gtXuwESUKc5MhEtjBpLoHPLYM+iuwSj3lflFwK3DPm68660rZ7G8BMcwSro7hD5w==
+
+"@unrs/resolver-binding-linux-x64-musl@1.11.1":
+ version "1.11.1"
+ resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-linux-x64-musl/-/resolver-binding-linux-x64-musl-1.11.1.tgz#bfb9af75f783f98f6a22c4244214efe4df1853d6"
+ integrity sha512-rV0YSoyhK2nZ4vEswT/QwqzqQXw5I6CjoaYMOX0TqBlWhojUf8P94mvI7nuJTeaCkkds3QE4+zS8Ko+GdXuZtA==
+
+"@unrs/resolver-binding-wasm32-wasi@1.11.1":
+ version "1.11.1"
+ resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-wasm32-wasi/-/resolver-binding-wasm32-wasi-1.11.1.tgz#752c359dd875684b27429500d88226d7cc72f71d"
+ integrity sha512-5u4RkfxJm+Ng7IWgkzi3qrFOvLvQYnPBmjmZQ8+szTK/b31fQCnleNl1GgEt7nIsZRIf5PLhPwT0WM+q45x/UQ==
dependencies:
- "@napi-rs/wasm-runtime" "^0.2.8"
+ "@napi-rs/wasm-runtime" "^0.2.11"
-"@unrs/resolver-binding-win32-arm64-msvc@1.4.1":
- version "1.4.1"
- resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-win32-arm64-msvc/-/resolver-binding-win32-arm64-msvc-1.4.1.tgz#563563b9ea7761dd7d20603792b518c4924d6f50"
- integrity sha512-KyJiIne/AqV4IW0wyQO34wSMuJwy3VxVQOfIXIPyQ/Up6y/zi2P/WwXb78gHsLiGRUqCA9LOoCX+6dQZde0g1g==
+"@unrs/resolver-binding-win32-arm64-msvc@1.11.1":
+ version "1.11.1"
+ resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-win32-arm64-msvc/-/resolver-binding-win32-arm64-msvc-1.11.1.tgz#ce5735e600e4c2fbb409cd051b3b7da4a399af35"
+ integrity sha512-nRcz5Il4ln0kMhfL8S3hLkxI85BXs3o8EYoattsJNdsX4YUU89iOkVn7g0VHSRxFuVMdM4Q1jEpIId1Ihim/Uw==
-"@unrs/resolver-binding-win32-ia32-msvc@1.4.1":
- version "1.4.1"
- resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-win32-ia32-msvc/-/resolver-binding-win32-ia32-msvc-1.4.1.tgz#c734d9389fe57912b5b3b05aa000d9cb6771ceee"
- integrity sha512-y2NUD7pygrBolN2NoXUrwVqBpKPhF8DiSNE5oB5/iFO49r2DpoYqdj5HPb3F42fPBH5qNqj6Zg63+xCEzAD2hw==
+"@unrs/resolver-binding-win32-ia32-msvc@1.11.1":
+ version "1.11.1"
+ resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-win32-ia32-msvc/-/resolver-binding-win32-ia32-msvc-1.11.1.tgz#72fc57bc7c64ec5c3de0d64ee0d1810317bc60a6"
+ integrity sha512-DCEI6t5i1NmAZp6pFonpD5m7i6aFrpofcp4LA2i8IIq60Jyo28hamKBxNrZcyOwVOZkgsRp9O2sXWBWP8MnvIQ==
-"@unrs/resolver-binding-win32-x64-msvc@1.4.1":
- version "1.4.1"
- resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-win32-x64-msvc/-/resolver-binding-win32-x64-msvc-1.4.1.tgz#e32c666092bc419fd7c3e28fea7c74292aaa94a3"
- integrity sha512-hVXaObGI2lGFmrtT77KSbPQ3I+zk9IU500wobjk0+oX59vg/0VqAzABNtt3YSQYgXTC2a/LYxekLfND/wlt0yQ==
+"@unrs/resolver-binding-win32-x64-msvc@1.11.1":
+ version "1.11.1"
+ resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-win32-x64-msvc/-/resolver-binding-win32-x64-msvc-1.11.1.tgz#538b1e103bf8d9864e7b85cc96fa8d6fb6c40777"
+ integrity sha512-lrW200hZdbfRtztbygyaq/6jP6AKE8qQN2KvPcJ+x7wiD038YtnYtZ82IMNJ69GJibV7bwL3y9FgK+5w/pYt6g==
-"@vercel/nft@^0.29.2":
- version "0.29.2"
- resolved "https://registry.yarnpkg.com/@vercel/nft/-/nft-0.29.2.tgz#0a852a67f5f24ee7c55139f065d46175688fcbbb"
- integrity sha512-A/Si4mrTkQqJ6EXJKv5EYCDQ3NL6nJXxG8VGXePsaiQigsomHYQC9xSpX8qGk7AEZk4b1ssbYIqJ0ISQQ7bfcA==
+"@vercel/nft@0.29.4", "@vercel/nft@^0.29.4":
+ version "0.29.4"
+ resolved "https://registry.yarnpkg.com/@vercel/nft/-/nft-0.29.4.tgz#e56b07d193776bcf67b31ac4da065ceb8e8d362e"
+ integrity sha512-6lLqMNX3TuycBPABycx7A9F1bHQR7kiQln6abjFbPrf5C/05qHM9M5E4PeTE59c7z8g6vHnx1Ioihb2AQl7BTA==
dependencies:
"@mapbox/node-pre-gyp" "^2.0.0"
"@rollup/pluginutils" "^5.1.3"
@@ -2180,41 +2669,53 @@
picomatch "^4.0.2"
resolve-from "^5.0.0"
-"@vitejs/plugin-vue-jsx@^4.1.2":
- version "4.1.2"
- resolved "https://registry.yarnpkg.com/@vitejs/plugin-vue-jsx/-/plugin-vue-jsx-4.1.2.tgz#7ab813bcba9a514a2bdee5b0e17c30d6e420c748"
- integrity sha512-4Rk0GdE0QCdsIkuMmWeg11gmM4x8UmTnZR/LWPm7QJ7+BsK4tq08udrN0isrrWqz5heFy9HLV/7bOLgFS8hUjA==
+"@vitejs/plugin-vue-jsx@^4.2.0":
+ version "4.2.0"
+ resolved "https://registry.yarnpkg.com/@vitejs/plugin-vue-jsx/-/plugin-vue-jsx-4.2.0.tgz#2738ec05d4705ed553a107342017192e37351640"
+ integrity sha512-DSTrmrdLp+0LDNF77fqrKfx7X0ErRbOcUAgJL/HbSesqQwoUvUQ4uYQqaex+rovqgGcoPqVk+AwUh3v9CuiYIw==
dependencies:
- "@babel/core" "^7.26.7"
- "@babel/plugin-transform-typescript" "^7.26.7"
- "@vue/babel-plugin-jsx" "^1.2.5"
+ "@babel/core" "^7.27.1"
+ "@babel/plugin-transform-typescript" "^7.27.1"
+ "@rolldown/pluginutils" "^1.0.0-beta.9"
+ "@vue/babel-plugin-jsx" "^1.4.0"
-"@vitejs/plugin-vue@^5.2.3":
- version "5.2.3"
- resolved "https://registry.yarnpkg.com/@vitejs/plugin-vue/-/plugin-vue-5.2.3.tgz#71a8fc82d4d2e425af304c35bf389506f674d89b"
- integrity sha512-IYSLEQj4LgZZuoVpdSUCw3dIynTWQgPlaRP6iAvMle4My0HdYwr5g5wQAfwOeHQBmYwEkqF70nRpSilr6PoUDg==
+"@vitejs/plugin-vue@^5.2.4":
+ version "5.2.4"
+ resolved "https://registry.yarnpkg.com/@vitejs/plugin-vue/-/plugin-vue-5.2.4.tgz#9e8a512eb174bfc2a333ba959bbf9de428d89ad8"
+ integrity sha512-7Yx/SXSOcQq5HiiV3orevHUFn+pmMB4cgbEkDYgnkUWb0WfeQ/wa2yFv6D5ICiCQOVpjA7vYDXrC7AGO8yjDHA==
-"@volar/language-core@2.4.12", "@volar/language-core@~2.4.11":
- version "2.4.12"
- resolved "https://registry.yarnpkg.com/@volar/language-core/-/language-core-2.4.12.tgz#98c8424f8d81a9cad1760a587b1c6db27d05f0cc"
- integrity sha512-RLrFdXEaQBWfSnYGVxvR2WrO6Bub0unkdHYIdC31HzIEqATIuuhRRzYu76iGPZ6OtA4Au1SnW0ZwIqPP217YhA==
+"@volar/language-core@2.4.20":
+ version "2.4.20"
+ resolved "https://registry.yarnpkg.com/@volar/language-core/-/language-core-2.4.20.tgz#be6d4efc6bb2f77d6c01bbbb3ef53661a869e0d0"
+ integrity sha512-dRDF1G33xaAIDqR6+mXUIjXYdu9vzSxlMGfMEwBxQsfY/JMUEXSpLTR057oTKlUQ2nIvCmP9k94A8h8z2VrNSA==
dependencies:
- "@volar/source-map" "2.4.12"
+ "@volar/source-map" "2.4.20"
-"@volar/source-map@2.4.12":
- version "2.4.12"
- resolved "https://registry.yarnpkg.com/@volar/source-map/-/source-map-2.4.12.tgz#7cc8c6b1b134a2215f06c91ad011d94eef81b0ed"
- integrity sha512-bUFIKvn2U0AWojOaqf63ER0N/iHIBYZPpNGogfLPQ68F5Eet6FnLlyho7BS0y2HJ1jFhSif7AcuTx1TqsCzRzw==
+"@volar/source-map@2.4.20":
+ version "2.4.20"
+ resolved "https://registry.yarnpkg.com/@volar/source-map/-/source-map-2.4.20.tgz#55ff844410d8d670ef2c3722e2717223edbf8717"
+ integrity sha512-mVjmFQH8mC+nUaVwmbxoYUy8cww+abaO8dWzqPUjilsavjxH0jCJ3Mp8HFuHsdewZs2c+SP+EO7hCd8Z92whJg==
-"@volar/typescript@~2.4.11":
- version "2.4.12"
- resolved "https://registry.yarnpkg.com/@volar/typescript/-/typescript-2.4.12.tgz#8c638c23cab89ab131cdcd2d6f2a51768caaa015"
- integrity sha512-HJB73OTJDgPc80K30wxi3if4fSsZZAOScbj2fcicMuOPoOkcf9NNAINb33o+DzhBdF9xTKC1gnPmIRDous5S0g==
+"@volar/typescript@2.4.20":
+ version "2.4.20"
+ resolved "https://registry.yarnpkg.com/@volar/typescript/-/typescript-2.4.20.tgz#c388d6fe5ee31ddeb5338d01dbbfc71054065a7c"
+ integrity sha512-Oc4DczPwQyXcVbd+5RsNEqX6ia0+w3p+klwdZQ6ZKhFjWoBP9PCPQYlKYRi/tDemWphW93P/Vv13vcE9I9D2GQ==
dependencies:
- "@volar/language-core" "2.4.12"
+ "@volar/language-core" "2.4.20"
path-browserify "^1.0.1"
vscode-uri "^3.0.8"
+"@vue-macros/common@3.0.0-beta.15":
+ version "3.0.0-beta.15"
+ resolved "https://registry.yarnpkg.com/@vue-macros/common/-/common-3.0.0-beta.15.tgz#6c4404759e2c01429c93589ae4c282725d519175"
+ integrity sha512-DMgq/rIh1H20WYNWU7krIbEfJRYDDhy7ix64GlT4AVUJZZWCZ5pxiYVJR3A3GmWQPkn7Pg7i3oIiGqu4JGC65w==
+ dependencies:
+ "@vue/compiler-sfc" "^3.5.17"
+ ast-kit "^2.1.0"
+ local-pkg "^1.1.1"
+ magic-string-ast "^1.0.0"
+ unplugin-utils "^0.2.4"
+
"@vue-macros/common@^1.16.1":
version "1.16.1"
resolved "https://registry.yarnpkg.com/@vue-macros/common/-/common-1.16.1.tgz#dac7ebc57ded4d6fb19d7f9a83d2973971d9fa65"
@@ -2232,7 +2733,7 @@
resolved "https://registry.yarnpkg.com/@vue/babel-helper-vue-transform-on/-/babel-helper-vue-transform-on-1.4.0.tgz#616020488692a9c42a613280d62ed1b727045d95"
integrity sha512-mCokbouEQ/ocRce/FpKCRItGo+013tHg7tixg3DUNS+6bmIchPt66012kBMm476vyEIJPafrvOf4E5OYj3shSw==
-"@vue/babel-plugin-jsx@^1.2.5":
+"@vue/babel-plugin-jsx@^1.4.0":
version "1.4.0"
resolved "https://registry.yarnpkg.com/@vue/babel-plugin-jsx/-/babel-plugin-jsx-1.4.0.tgz#c155c795ce980edf46aa6feceed93945a95ca658"
integrity sha512-9zAHmwgMWlaN6qRKdrg1uKsBKHvnUU+Py+MOCTuYZBoZsopa90Di10QRjB+YPnVss0BZbG/H5XFwJY1fTxJWhA==
@@ -2258,47 +2759,47 @@
"@babel/parser" "^7.26.9"
"@vue/compiler-sfc" "^3.5.13"
-"@vue/compiler-core@3.5.13":
- version "3.5.13"
- resolved "https://registry.yarnpkg.com/@vue/compiler-core/-/compiler-core-3.5.13.tgz#b0ae6c4347f60c03e849a05d34e5bf747c9bda05"
- integrity sha512-oOdAkwqUfW1WqpwSYJce06wvt6HljgY3fGeM9NcVA1HaYOij3mZG9Rkysn0OHuyUAGMbEbARIpsG+LPVlBJ5/Q==
+"@vue/compiler-core@3.5.18":
+ version "3.5.18"
+ resolved "https://registry.yarnpkg.com/@vue/compiler-core/-/compiler-core-3.5.18.tgz#521a138cdd970d9bfd27e42168d12f77a04b2074"
+ integrity sha512-3slwjQrrV1TO8MoXgy3aynDQ7lslj5UqDxuHnrzHtpON5CBinhWjJETciPngpin/T3OuW3tXUf86tEurusnztw==
dependencies:
- "@babel/parser" "^7.25.3"
- "@vue/shared" "3.5.13"
+ "@babel/parser" "^7.28.0"
+ "@vue/shared" "3.5.18"
entities "^4.5.0"
estree-walker "^2.0.2"
- source-map-js "^1.2.0"
+ source-map-js "^1.2.1"
-"@vue/compiler-dom@3.5.13", "@vue/compiler-dom@^3.5.0":
- version "3.5.13"
- resolved "https://registry.yarnpkg.com/@vue/compiler-dom/-/compiler-dom-3.5.13.tgz#bb1b8758dbc542b3658dda973b98a1c9311a8a58"
- integrity sha512-ZOJ46sMOKUjO3e94wPdCzQ6P1Lx/vhp2RSvfaab88Ajexs0AHeV0uasYhi99WPaogmBlRHNRuly8xV75cNTMDA==
+"@vue/compiler-dom@3.5.18", "@vue/compiler-dom@^3.2.45", "@vue/compiler-dom@^3.5.0":
+ version "3.5.18"
+ resolved "https://registry.yarnpkg.com/@vue/compiler-dom/-/compiler-dom-3.5.18.tgz#e13504492c3061ec5bbe6a2e789f15261d4f03a7"
+ integrity sha512-RMbU6NTU70++B1JyVJbNbeFkK+A+Q7y9XKE2EM4NLGm2WFR8x9MbAtWxPPLdm0wUkuZv9trpwfSlL6tjdIa1+A==
dependencies:
- "@vue/compiler-core" "3.5.13"
- "@vue/shared" "3.5.13"
+ "@vue/compiler-core" "3.5.18"
+ "@vue/shared" "3.5.18"
-"@vue/compiler-sfc@3.5.13", "@vue/compiler-sfc@^3.5.13":
- version "3.5.13"
- resolved "https://registry.yarnpkg.com/@vue/compiler-sfc/-/compiler-sfc-3.5.13.tgz#461f8bd343b5c06fac4189c4fef8af32dea82b46"
- integrity sha512-6VdaljMpD82w6c2749Zhf5T9u5uLBWKnVue6XWxprDobftnletJ8+oel7sexFfM3qIxNmVE7LSFGTpv6obNyaQ==
+"@vue/compiler-sfc@3.5.18", "@vue/compiler-sfc@^3.5.13", "@vue/compiler-sfc@^3.5.17":
+ version "3.5.18"
+ resolved "https://registry.yarnpkg.com/@vue/compiler-sfc/-/compiler-sfc-3.5.18.tgz#ba1e849561337d809937994cdaf900539542eeca"
+ integrity sha512-5aBjvGqsWs+MoxswZPoTB9nSDb3dhd1x30xrrltKujlCxo48j8HGDNj3QPhF4VIS0VQDUrA1xUfp2hEa+FNyXA==
dependencies:
- "@babel/parser" "^7.25.3"
- "@vue/compiler-core" "3.5.13"
- "@vue/compiler-dom" "3.5.13"
- "@vue/compiler-ssr" "3.5.13"
- "@vue/shared" "3.5.13"
+ "@babel/parser" "^7.28.0"
+ "@vue/compiler-core" "3.5.18"
+ "@vue/compiler-dom" "3.5.18"
+ "@vue/compiler-ssr" "3.5.18"
+ "@vue/shared" "3.5.18"
estree-walker "^2.0.2"
- magic-string "^0.30.11"
- postcss "^8.4.48"
- source-map-js "^1.2.0"
+ magic-string "^0.30.17"
+ postcss "^8.5.6"
+ source-map-js "^1.2.1"
-"@vue/compiler-ssr@3.5.13":
- version "3.5.13"
- resolved "https://registry.yarnpkg.com/@vue/compiler-ssr/-/compiler-ssr-3.5.13.tgz#e771adcca6d3d000f91a4277c972a996d07f43ba"
- integrity sha512-wMH6vrYHxQl/IybKJagqbquvxpWCuVYpoUJfCqFZwa/JY1GdATAQ+TgVtgrwwMZ0D07QhA99rs/EAAWfvG6KpA==
+"@vue/compiler-ssr@3.5.18":
+ version "3.5.18"
+ resolved "https://registry.yarnpkg.com/@vue/compiler-ssr/-/compiler-ssr-3.5.18.tgz#aecde0b0bff268a9c9014ba66799307c4a784328"
+ integrity sha512-xM16Ak7rSWHkM3m22NlmcdIM+K4BMyFARAfV9hYFl+SFuRzrZ3uGMNW05kA5pmeMa0X9X963Kgou7ufdbpOP9g==
dependencies:
- "@vue/compiler-dom" "3.5.13"
- "@vue/shared" "3.5.13"
+ "@vue/compiler-dom" "3.5.18"
+ "@vue/shared" "3.5.18"
"@vue/compiler-vue2@^2.7.16":
version "2.7.16"
@@ -2308,99 +2809,171 @@
de-indent "^1.0.2"
he "^1.2.0"
-"@vue/devtools-api@^6.6.4":
+"@vue/devtools-api@^6.5.0", "@vue/devtools-api@^6.6.4":
version "6.6.4"
resolved "https://registry.yarnpkg.com/@vue/devtools-api/-/devtools-api-6.6.4.tgz#cbe97fe0162b365edc1dba80e173f90492535343"
integrity sha512-sGhTPMuXqZ1rVOk32RylztWkfXTRhuS7vgAKv0zjqk8gbsHkJ7xfFf+jbySxt7tWObEJwyKaHMikV/WGDiQm8g==
-"@vue/devtools-core@^7.7.2":
- version "7.7.2"
- resolved "https://registry.yarnpkg.com/@vue/devtools-core/-/devtools-core-7.7.2.tgz#fbba7714b4cecd4e4b80e1b68c249b013c6ea6a7"
- integrity sha512-lexREWj1lKi91Tblr38ntSsy6CvI8ba7u+jmwh2yruib/ltLUcsIzEjCnrkh1yYGGIKXbAuYV2tOG10fGDB9OQ==
+"@vue/devtools-core@^7.7.7":
+ version "7.7.7"
+ resolved "https://registry.yarnpkg.com/@vue/devtools-core/-/devtools-core-7.7.7.tgz#9885e2ecb7b462cca8e629d9cff0ab00bfd30d63"
+ integrity sha512-9z9TLbfC+AjAi1PQyWX+OErjIaJmdFlbDHcD+cAMYKY6Bh5VlsAtCeGyRMrXwIlMEQPukvnWt3gZBLwTAIMKzQ==
dependencies:
- "@vue/devtools-kit" "^7.7.2"
- "@vue/devtools-shared" "^7.7.2"
+ "@vue/devtools-kit" "^7.7.7"
+ "@vue/devtools-shared" "^7.7.7"
mitt "^3.0.1"
- nanoid "^5.0.9"
- pathe "^2.0.2"
- vite-hot-client "^0.2.4"
+ nanoid "^5.1.0"
+ pathe "^2.0.3"
+ vite-hot-client "^2.0.4"
-"@vue/devtools-kit@^7.7.2":
- version "7.7.2"
- resolved "https://registry.yarnpkg.com/@vue/devtools-kit/-/devtools-kit-7.7.2.tgz#3315bd5b144f98c7b84c2f44270b445644ec8f10"
- integrity sha512-CY0I1JH3Z8PECbn6k3TqM1Bk9ASWxeMtTCvZr7vb+CHi+X/QwQm5F1/fPagraamKMAHVfuuCbdcnNg1A4CYVWQ==
+"@vue/devtools-kit@^7.7.7":
+ version "7.7.7"
+ resolved "https://registry.yarnpkg.com/@vue/devtools-kit/-/devtools-kit-7.7.7.tgz#41a64f9526e9363331c72405544df020ce2e3641"
+ integrity sha512-wgoZtxcTta65cnZ1Q6MbAfePVFxfM+gq0saaeytoph7nEa7yMXoi6sCPy4ufO111B9msnw0VOWjPEFCXuAKRHA==
dependencies:
- "@vue/devtools-shared" "^7.7.2"
- birpc "^0.2.19"
+ "@vue/devtools-shared" "^7.7.7"
+ birpc "^2.3.0"
hookable "^5.5.3"
mitt "^3.0.1"
perfect-debounce "^1.0.0"
speakingurl "^14.0.1"
- superjson "^2.2.1"
+ superjson "^2.2.2"
-"@vue/devtools-shared@^7.7.2":
- version "7.7.2"
- resolved "https://registry.yarnpkg.com/@vue/devtools-shared/-/devtools-shared-7.7.2.tgz#b11b143820130a32d8ce5737e264d06ab6d62f40"
- integrity sha512-uBFxnp8gwW2vD6FrJB8JZLUzVb6PNRG0B0jBnHsOH8uKyva2qINY8PTF5Te4QlTbMDqU5K6qtJDr6cNsKWhbOA==
+"@vue/devtools-shared@^7.7.7":
+ version "7.7.7"
+ resolved "https://registry.yarnpkg.com/@vue/devtools-shared/-/devtools-shared-7.7.7.tgz#ff14aa8c1262ebac8c0397d3b09f767cd489750c"
+ integrity sha512-+udSj47aRl5aKb0memBvcUG9koarqnxNM5yjuREvqwK6T3ap4mn3Zqqc17QrBFTqSMjr3HK1cvStEZpMDpfdyw==
dependencies:
rfdc "^1.4.1"
-"@vue/language-core@2.2.8":
- version "2.2.8"
- resolved "https://registry.yarnpkg.com/@vue/language-core/-/language-core-2.2.8.tgz#05befa390399fbd4409bc703ee0520b8ac1b7088"
- integrity sha512-rrzB0wPGBvcwaSNRriVWdNAbHQWSf0NlGqgKHK5mEkXpefjUlVRP62u03KvwZpvKVjRnBIQ/Lwre+Mx9N6juUQ==
+"@vue/language-core@3.0.4":
+ version "3.0.4"
+ resolved "https://registry.yarnpkg.com/@vue/language-core/-/language-core-3.0.4.tgz#aa080a96d385ad8e23a801265cf80225ac4be414"
+ integrity sha512-BvueED4LfBCSNH66eeUQk37MQCb7hjdezzGgxniM0LbriW53AJIyLorgshAtStmjfsAuOCcTl/c1b+nz/ye8xQ==
dependencies:
- "@volar/language-core" "~2.4.11"
+ "@volar/language-core" "2.4.20"
"@vue/compiler-dom" "^3.5.0"
"@vue/compiler-vue2" "^2.7.16"
"@vue/shared" "^3.5.0"
- alien-signals "^1.0.3"
- minimatch "^9.0.3"
+ alien-signals "^2.0.5"
muggle-string "^0.4.1"
path-browserify "^1.0.1"
+ picomatch "^4.0.2"
-"@vue/reactivity@3.5.13":
- version "3.5.13"
- resolved "https://registry.yarnpkg.com/@vue/reactivity/-/reactivity-3.5.13.tgz#b41ff2bb865e093899a22219f5b25f97b6fe155f"
- integrity sha512-NaCwtw8o48B9I6L1zl2p41OHo/2Z4wqYGGIK1Khu5T7yxrn+ATOixn/Udn2m+6kZKB/J7cuT9DbWWhRxqixACg==
+"@vue/reactivity@3.5.18":
+ version "3.5.18"
+ resolved "https://registry.yarnpkg.com/@vue/reactivity/-/reactivity-3.5.18.tgz#fe32166e3938832c54b4134e60e9b58ca7d9bdb4"
+ integrity sha512-x0vPO5Imw+3sChLM5Y+B6G1zPjwdOri9e8V21NnTnlEvkxatHEH5B5KEAJcjuzQ7BsjGrKtfzuQ5eQwXh8HXBg==
dependencies:
- "@vue/shared" "3.5.13"
+ "@vue/shared" "3.5.18"
-"@vue/runtime-core@3.5.13":
- version "3.5.13"
- resolved "https://registry.yarnpkg.com/@vue/runtime-core/-/runtime-core-3.5.13.tgz#1fafa4bf0b97af0ebdd9dbfe98cd630da363a455"
- integrity sha512-Fj4YRQ3Az0WTZw1sFe+QDb0aXCerigEpw418pw1HBUKFtnQHWzwojaukAs2X/c9DQz4MQ4bsXTGlcpGxU/RCIw==
+"@vue/runtime-core@3.5.18":
+ version "3.5.18"
+ resolved "https://registry.yarnpkg.com/@vue/runtime-core/-/runtime-core-3.5.18.tgz#9e9ae8b9491548b53d0cea2bf25746d27c52e191"
+ integrity sha512-DUpHa1HpeOQEt6+3nheUfqVXRog2kivkXHUhoqJiKR33SO4x+a5uNOMkV487WPerQkL0vUuRvq/7JhRgLW3S+w==
dependencies:
- "@vue/reactivity" "3.5.13"
- "@vue/shared" "3.5.13"
+ "@vue/reactivity" "3.5.18"
+ "@vue/shared" "3.5.18"
-"@vue/runtime-dom@3.5.13":
- version "3.5.13"
- resolved "https://registry.yarnpkg.com/@vue/runtime-dom/-/runtime-dom-3.5.13.tgz#610fc795de9246300e8ae8865930d534e1246215"
- integrity sha512-dLaj94s93NYLqjLiyFzVs9X6dWhTdAlEAciC3Moq7gzAc13VJUdCnjjRurNM6uTLFATRHexHCTu/Xp3eW6yoog==
+"@vue/runtime-dom@3.5.18":
+ version "3.5.18"
+ resolved "https://registry.yarnpkg.com/@vue/runtime-dom/-/runtime-dom-3.5.18.tgz#1150952d1048b5822e4f1dd8aed24665cbb22107"
+ integrity sha512-YwDj71iV05j4RnzZnZtGaXwPoUWeRsqinblgVJwR8XTXYZ9D5PbahHQgsbmzUvCWNF6x7siQ89HgnX5eWkr3mw==
dependencies:
- "@vue/reactivity" "3.5.13"
- "@vue/runtime-core" "3.5.13"
- "@vue/shared" "3.5.13"
+ "@vue/reactivity" "3.5.18"
+ "@vue/runtime-core" "3.5.18"
+ "@vue/shared" "3.5.18"
csstype "^3.1.3"
-"@vue/server-renderer@3.5.13":
- version "3.5.13"
- resolved "https://registry.yarnpkg.com/@vue/server-renderer/-/server-renderer-3.5.13.tgz#429ead62ee51de789646c22efe908e489aad46f7"
- integrity sha512-wAi4IRJV/2SAW3htkTlB+dHeRmpTiVIK1OGLWV1yeStVSebSQQOwGwIq0D3ZIoBj2C2qpgz5+vX9iEBkTdk5YA==
+"@vue/server-renderer@3.5.18":
+ version "3.5.18"
+ resolved "https://registry.yarnpkg.com/@vue/server-renderer/-/server-renderer-3.5.18.tgz#e9fa267b95b3a1d8cddca762377e5de2ae9122bd"
+ integrity sha512-PvIHLUoWgSbDG7zLHqSqaCoZvHi6NNmfVFOqO+OnwvqMz/tqQr3FuGWS8ufluNddk7ZLBJYMrjcw1c6XzR12mA==
dependencies:
- "@vue/compiler-ssr" "3.5.13"
- "@vue/shared" "3.5.13"
+ "@vue/compiler-ssr" "3.5.18"
+ "@vue/shared" "3.5.18"
-"@vue/shared@3.5.13", "@vue/shared@^3.5.0", "@vue/shared@^3.5.13":
- version "3.5.13"
- resolved "https://registry.yarnpkg.com/@vue/shared/-/shared-3.5.13.tgz#87b309a6379c22b926e696893237826f64339b6f"
- integrity sha512-/hnE/qP5ZoGpol0a5mDi45bOd7t3tjYJBjsgCsivow7D48cJeV5l05RD82lPqi7gRiphZM37rnhW1l6ZoCNNnQ==
+"@vue/shared@3.5.18", "@vue/shared@^3.5.0", "@vue/shared@^3.5.13", "@vue/shared@^3.5.17":
+ version "3.5.18"
+ resolved "https://registry.yarnpkg.com/@vue/shared/-/shared-3.5.18.tgz#529f24a88d3ed678d50fd5c07455841fbe8ac95e"
+ integrity sha512-cZy8Dq+uuIXbxCZpuLd2GJdeSO/lIzIspC2WtkqIpje5QyFbvLaI5wZtdUjLHjGZrlVX6GilejatWwVYYRc8tA==
+
+"@vueuse/core@13.6.0":
+ version "13.6.0"
+ resolved "https://registry.yarnpkg.com/@vueuse/core/-/core-13.6.0.tgz#4137f63dc4cef2ff8ae74ee146d6b6070d707878"
+ integrity sha512-DJbD5fV86muVmBgS9QQPddVX7d9hWYswzlf4bIyUD2dj8GC46R1uNClZhVAmsdVts4xb2jwp1PbpuiA50Qee1A==
+ dependencies:
+ "@types/web-bluetooth" "^0.0.21"
+ "@vueuse/metadata" "13.6.0"
+ "@vueuse/shared" "13.6.0"
+
+"@vueuse/metadata@13.6.0":
+ version "13.6.0"
+ resolved "https://registry.yarnpkg.com/@vueuse/metadata/-/metadata-13.6.0.tgz#49196025c96c7daeb591c20a54b61cc336af99b6"
+ integrity sha512-rnIH7JvU7NjrpexTsl2Iwv0V0yAx9cw7+clymjKuLSXG0QMcLD0LDgdNmXic+qL0SGvgSVPEpM9IDO/wqo1vkQ==
+
+"@vueuse/nuxt@13.6.0":
+ version "13.6.0"
+ resolved "https://registry.yarnpkg.com/@vueuse/nuxt/-/nuxt-13.6.0.tgz#96dfa26021bc17e1c5020c1c42ba425a9d00112f"
+ integrity sha512-zOZ5XkA7Svsx90934UWwKUsThAjKSD48Ks/mjEzl2gJm5d5zYJg+CJxPi7Wv5XECtCBOX18GpmTKqanWlbA1aQ==
+ dependencies:
+ "@nuxt/kit" "^4.0.1"
+ "@vueuse/core" "13.6.0"
+ "@vueuse/metadata" "13.6.0"
+ local-pkg "^1.1.1"
+
+"@vueuse/shared@13.6.0":
+ version "13.6.0"
+ resolved "https://registry.yarnpkg.com/@vueuse/shared/-/shared-13.6.0.tgz#872fdbd725fb4e3a12bd5aab85af9a5db0b1e481"
+ integrity sha512-pDykCSoS2T3fsQrYqf9SyF0QXWHmcGPQ+qiOVjlYSzlWd9dgppB2bFSM1GgKKkt7uzn0BBMV3IbJsUfHG2+BCg==
+
+"@whatwg-node/disposablestack@^0.0.6":
+ version "0.0.6"
+ resolved "https://registry.yarnpkg.com/@whatwg-node/disposablestack/-/disposablestack-0.0.6.tgz#2064a1425ea66194def6df0c7a1851b6939c82bb"
+ integrity sha512-LOtTn+JgJvX8WfBVJtF08TGrdjuFzGJc4mkP8EdDI8ADbvO7kiexYep1o8dwnt0okb0jYclCDXF13xU7Ge4zSw==
+ dependencies:
+ "@whatwg-node/promise-helpers" "^1.0.0"
+ tslib "^2.6.3"
+
+"@whatwg-node/fetch@^0.10.5":
+ version "0.10.9"
+ resolved "https://registry.yarnpkg.com/@whatwg-node/fetch/-/fetch-0.10.9.tgz#ac7b5fe966c7df0f124695a40dce8fc63ea97f07"
+ integrity sha512-2TaXKmjy53cybNtaAtzbPOzwIPkjXbzvZcimnaJxQwYXKSC8iYnWoZOyT4+CFt8w0KDieg5J5dIMNzUrW/UZ5g==
+ dependencies:
+ "@whatwg-node/node-fetch" "^0.7.22"
+ urlpattern-polyfill "^10.0.0"
+
+"@whatwg-node/node-fetch@^0.7.22":
+ version "0.7.22"
+ resolved "https://registry.yarnpkg.com/@whatwg-node/node-fetch/-/node-fetch-0.7.22.tgz#9f56970ce0abd2a2680e5d22cff0ea871eeb4f85"
+ integrity sha512-h4GGjGF2vH3kGJ/fEOeg9Xfu4ncoyRwFcjGIxr/5dTBgZNVwq888byIsZ+XXRDJnNnRlzVVVQDcqrZpY2yctGA==
+ dependencies:
+ "@fastify/busboy" "^3.1.1"
+ "@whatwg-node/disposablestack" "^0.0.6"
+ "@whatwg-node/promise-helpers" "^1.3.2"
+ tslib "^2.6.3"
+
+"@whatwg-node/promise-helpers@^1.0.0", "@whatwg-node/promise-helpers@^1.2.2", "@whatwg-node/promise-helpers@^1.3.2":
+ version "1.3.2"
+ resolved "https://registry.yarnpkg.com/@whatwg-node/promise-helpers/-/promise-helpers-1.3.2.tgz#3b54987ad6517ef6db5920c66a6f0dada606587d"
+ integrity sha512-Nst5JdK47VIl9UcGwtv2Rcgyn5lWtZ0/mhRQ4G8NN2isxpq2TO30iqHzmwoJycjWuyUfg3GFXqP/gFHXeV57IA==
+ dependencies:
+ tslib "^2.6.3"
+
+"@whatwg-node/server@^0.9.60":
+ version "0.9.71"
+ resolved "https://registry.yarnpkg.com/@whatwg-node/server/-/server-0.9.71.tgz#5715011b58ab8a0a8abb25759a426ff50d2dce4b"
+ integrity sha512-ueFCcIPaMgtuYDS9u0qlUoEvj6GiSsKrwnOLPp9SshqjtcRaR1IEHRjoReq3sXNydsF5i0ZnmuYgXq9dV53t0g==
+ dependencies:
+ "@whatwg-node/disposablestack" "^0.0.6"
+ "@whatwg-node/fetch" "^0.10.5"
+ "@whatwg-node/promise-helpers" "^1.2.2"
+ tslib "^2.6.3"
abbrev@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-3.0.0.tgz#c29a6337e167ac61a84b41b80461b29c5c271a27"
- integrity sha512-+/kfrslGQ7TNV2ecmQwMJj/B65g5KVq1/L3SGVZ3tCYGqlzFuFCGBZJtMP99wH3NpEUyAjn0zPdPUg0D+DwrOA==
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-3.0.1.tgz#8ac8b3b5024d31464fe2a5feeea9f4536bf44025"
+ integrity sha512-AO2ac6pjRB3SJmGJo+v5/aK6Omggp6fsLrs6wN9bd35ulu4cCwaAU9+7ZhXjeqHVkaHThLuzH0nZr0YpCDhygg==
abort-controller@^3.0.0:
version "3.0.0"
@@ -2419,15 +2992,15 @@ acorn-jsx@^5.3.2:
resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937"
integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==
-acorn@^8.14.0, acorn@^8.14.1, acorn@^8.6.0, acorn@^8.8.2:
- version "8.14.1"
- resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.14.1.tgz#721d5dc10f7d5b5609a891773d47731796935dfb"
- integrity sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==
+acorn@^8.14.0, acorn@^8.14.1, acorn@^8.15.0, acorn@^8.5.0, acorn@^8.6.0, acorn@^8.8.2, acorn@^8.9.0:
+ version "8.15.0"
+ resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.15.0.tgz#a360898bc415edaac46c8241f6383975b930b816"
+ integrity sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==
agent-base@^7.1.2:
- version "7.1.3"
- resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-7.1.3.tgz#29435eb821bc4194633a5b89e5bc4703bafc25a1"
- integrity sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==
+ version "7.1.4"
+ resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-7.1.4.tgz#e3cd76d4c548ee895d3c3fd8dc1f6c5b9032e7a8"
+ integrity sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==
ajv@^6.12.4:
version "6.12.6"
@@ -2439,10 +3012,10 @@ ajv@^6.12.4:
json-schema-traverse "^0.4.1"
uri-js "^4.2.2"
-alien-signals@^1.0.3:
- version "1.0.13"
- resolved "https://registry.yarnpkg.com/alien-signals/-/alien-signals-1.0.13.tgz#8d6db73462f742ee6b89671fbd8c37d0b1727a7e"
- integrity sha512-OGj9yyTnJEttvzhTUWuscOvtqxq5vrhF7vL9oS0xJ2mK0ItPYP1/y+vCFebfxoEyAz0++1AIwJ5CMr+Fk3nDmg==
+alien-signals@^2.0.5:
+ version "2.0.5"
+ resolved "https://registry.yarnpkg.com/alien-signals/-/alien-signals-2.0.5.tgz#7528fc28de7cd76ccb6aad1d46d5b5635ce10805"
+ integrity sha512-PdJB6+06nUNAClInE3Dweq7/2xVAYM64vvvS1IHVHSJmgeOtEdrAGyp7Z2oJtYm0B342/Exd2NT0uMJaThcjLQ==
ansi-regex@^5.0.1:
version "5.0.1"
@@ -2466,12 +3039,12 @@ ansi-styles@^6.1.0:
resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-6.2.1.tgz#0e62320cf99c21afff3b3012192546aacbfb05c5"
integrity sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==
-ansis@^3.16.0, ansis@^3.17.0:
- version "3.17.0"
- resolved "https://registry.yarnpkg.com/ansis/-/ansis-3.17.0.tgz#fa8d9c2a93fe7d1177e0c17f9eeb562a58a832d7"
- integrity sha512-0qWUglt9JEqLFr3w1I1pbrChn1grhaiAR2ocX1PP/flRmxgtwTzPFFFnfIlD6aMOLQZgSuCRlidD70lvx8yhzg==
+ansis@^4.1.0:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/ansis/-/ansis-4.1.0.tgz#cd43ecd3f814f37223e518291c0e0b04f2915a0d"
+ integrity sha512-BGcItUBWSMRgOCe+SVZJ+S7yTRG0eGt9cXAHev72yuGcY23hnLA7Bky5L/xLyPINoSN95geovfBkqoTlNZYa7w==
-anymatch@^3.1.3:
+anymatch@^3.1.3, anymatch@~3.1.2:
version "3.1.3"
resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e"
integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==
@@ -2492,7 +3065,7 @@ archiver-utils@^5.0.0, archiver-utils@^5.0.2:
normalize-path "^3.0.0"
readable-stream "^4.0.0"
-archiver@^7.0.1:
+archiver@^7.0.0, archiver@^7.0.1:
version "7.0.1"
resolved "https://registry.yarnpkg.com/archiver/-/archiver-7.0.1.tgz#c9d91c350362040b8927379c7aa69c0655122f61"
integrity sha512-ZcbTaIqJOfCc03QwD468Unz/5Ir8ATtvAHsK+FdXbDIbGfihqh9mrvdcYunQzqn4HrvWWaFyaxJhGZagaJJpPQ==
@@ -2510,36 +3083,49 @@ are-docs-informative@^0.0.2:
resolved "https://registry.yarnpkg.com/are-docs-informative/-/are-docs-informative-0.0.2.tgz#387f0e93f5d45280373d387a59d34c96db321963"
integrity sha512-ixiS0nLNNG5jNQzgZJNoUpBKdo9yTYZMGJ+QgT2jmjR7G7+QHRCc4v6LQ3NgE7EBJq+o0ams3waJwkrlBom8Ig==
-argon2@^0.41.1:
- version "0.41.1"
- resolved "https://registry.yarnpkg.com/argon2/-/argon2-0.41.1.tgz#30ce6b013e273bc7e92c558d40e66d35e5e8c63b"
- integrity sha512-dqCW8kJXke8Ik+McUcMDltrbuAWETPyU6iq+4AhxqKphWi7pChB/Zgd/Tp/o8xRLbg8ksMj46F/vph9wnxpTzQ==
+argon2@^0.43.0:
+ version "0.43.1"
+ resolved "https://registry.yarnpkg.com/argon2/-/argon2-0.43.1.tgz#8155ae67fd4ca2a7364364ca3e45e0d8fbbc0ee9"
+ integrity sha512-TfOzvDWUaQPurCT1hOwIeFNkgrAJDpbBGBGWDgzDsm11nNhImc13WhdGdCU6K7brkp8VpeY07oGtSex0Wmhg8w==
dependencies:
"@phc/format" "^1.0.0"
- node-addon-api "^8.1.0"
- node-gyp-build "^4.8.1"
+ node-addon-api "^8.4.0"
+ node-gyp-build "^4.8.4"
argparse@^2.0.1:
version "2.0.1"
resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38"
integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==
-arktype@^2.1.10:
- version "2.1.15"
- resolved "https://registry.yarnpkg.com/arktype/-/arktype-2.1.15.tgz#d21a09bc0404473e8aa7d943c4e817666a0650ca"
- integrity sha512-ro31NmDxOEFysUjSQL4O9Q12sQuobImqXyqQbWzK7LNB/gvfflnZyeNBsysZYf5HP3pY39P9EgynMYiyqbJQ1g==
+arktype@^2.1.10, arktype@^2.1.9:
+ version "2.1.20"
+ resolved "https://registry.yarnpkg.com/arktype/-/arktype-2.1.20.tgz#dd46726b0faf23c2753369876c77bb037e7089d9"
+ integrity sha512-IZCEEXaJ8g+Ijd59WtSYwtjnqXiwM8sWQ5EjGamcto7+HVN9eK0C4p0zDlCuAwWhpqr6fIBkxPuYDl4/Mcj/+Q==
dependencies:
- "@ark/schema" "0.45.5"
- "@ark/util" "0.45.5"
+ "@ark/schema" "0.46.0"
+ "@ark/util" "0.46.0"
ast-kit@^1.0.1, ast-kit@^1.4.0:
- version "1.4.2"
- resolved "https://registry.yarnpkg.com/ast-kit/-/ast-kit-1.4.2.tgz#75d3706c12549573c7de9e7c38ed04fb7d0cc10f"
- integrity sha512-lvGehj1XsrIoQrD5CfPduIzQbcpuX2EPjlk/vDMDQF9U9HLRB6WwMTdighj5n52hdhh8xg9VgPTU7Q25MuJ/rw==
+ version "1.4.3"
+ resolved "https://registry.yarnpkg.com/ast-kit/-/ast-kit-1.4.3.tgz#030f1bfb55bd72d426dc1d0ba82a8de5c75acd7c"
+ integrity sha512-MdJqjpodkS5J149zN0Po+HPshkTdUyrvF7CKTafUgv69vBSPtncrj+3IiUgqdd7ElIEkbeXCsEouBUwLrw9Ilg==
dependencies:
- "@babel/parser" "^7.26.9"
+ "@babel/parser" "^7.27.0"
pathe "^2.0.3"
+ast-kit@^2.0.0, ast-kit@^2.1.0:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/ast-kit/-/ast-kit-2.1.1.tgz#b6b44e160b8fcc3781cfe0f382713ecefb061ea5"
+ integrity sha512-mfh6a7gKXE8pDlxTvqIc/syH/P3RkzbOF6LeHdcKztLEzYe6IMsRCL7N8vI7hqTGWNxpkCuuRTpT21xNWqhRtQ==
+ dependencies:
+ "@babel/parser" "^7.27.7"
+ pathe "^2.0.3"
+
+ast-module-types@^6.0.1:
+ version "6.0.1"
+ resolved "https://registry.yarnpkg.com/ast-module-types/-/ast-module-types-6.0.1.tgz#4b4ca0251c57b815bab62604dcb22f8c903e2523"
+ integrity sha512-WHw67kLXYbZuHTmcdbIrVArCq5wxo6NEuj3hiYAWr8mwJeC+C2mMCIBIWCiDoCye/OF/xelc+teJ1ERoWmnEIA==
+
ast-walker-scope@^0.6.2:
version "0.6.2"
resolved "https://registry.yarnpkg.com/ast-walker-scope/-/ast-walker-scope-0.6.2.tgz#b827e8949c129802f76fe0f142e95fd7efda57dc"
@@ -2548,12 +3134,20 @@ ast-walker-scope@^0.6.2:
"@babel/parser" "^7.25.3"
ast-kit "^1.0.1"
+ast-walker-scope@^0.8.1:
+ version "0.8.1"
+ resolved "https://registry.yarnpkg.com/ast-walker-scope/-/ast-walker-scope-0.8.1.tgz#2994ba9ed550fdfa57cee274e4fc34053a5495e5"
+ integrity sha512-72XOdbzQCMKERvFrxAykatn2pu7osPNq/sNUzwcHdWzwPvOsNpPqkawfDXVvQbA2RT+ivtsMNjYdojTUZitt1A==
+ dependencies:
+ "@babel/parser" "^7.27.2"
+ ast-kit "^2.0.0"
+
async-sema@^3.1.1:
version "3.1.1"
resolved "https://registry.yarnpkg.com/async-sema/-/async-sema-3.1.1.tgz#e527c08758a0f8f6f9f15f799a173ff3c40ea808"
integrity sha512-tLRNUXati5MFePdAk8dw7Qt7DpxPB60ofAgn8WRhW6a2rcimZnYBP9oxHiv0OHy+Wz7kPMG+t4LGdt31+4EmGg==
-async@^3.2.4:
+async@^3.2.3, async@^3.2.4:
version "3.2.6"
resolved "https://registry.yarnpkg.com/async/-/async-3.2.6.tgz#1b0728e14929d51b85b449b7f06e27c1145e38ce"
integrity sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==
@@ -2563,6 +3157,11 @@ asynckit@^0.4.0:
resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79"
integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==
+atomic-sleep@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/atomic-sleep/-/atomic-sleep-1.0.0.tgz#eb85b77a601fc932cfe432c5acd364a9e2c9075b"
+ integrity sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==
+
autoprefixer@^10.4.20, autoprefixer@^10.4.21:
version "10.4.21"
resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-10.4.21.tgz#77189468e7a8ad1d9a37fbc08efc9f480cf0a95d"
@@ -2576,12 +3175,12 @@ autoprefixer@^10.4.20, autoprefixer@^10.4.21:
postcss-value-parser "^4.2.0"
axios@^1.7.7:
- version "1.8.4"
- resolved "https://registry.yarnpkg.com/axios/-/axios-1.8.4.tgz#78990bb4bc63d2cae072952d374835950a82f447"
- integrity sha512-eBSYY4Y68NNlHbHBMdeDmKNtDgXWhQsJcGqzO3iLUM0GraQFSS9cVgPX5I9b3lbdFKyYoAEGAZF1DwhTaljNAw==
+ version "1.11.0"
+ resolved "https://registry.yarnpkg.com/axios/-/axios-1.11.0.tgz#c2ec219e35e414c025b2095e8b8280278478fdb6"
+ integrity sha512-1Lx3WLFQWm3ooKDYZD1eXmoGO9fxYQjrycfHFC8P0sCfQVXyROp0p9PFWBehewBOdCwHc+f/b8I0fMto5eSfwA==
dependencies:
follow-redirects "^1.15.6"
- form-data "^4.0.0"
+ form-data "^4.0.4"
proxy-from-env "^1.1.0"
b4a@^1.6.4:
@@ -2595,14 +3194,14 @@ balanced-match@^1.0.0:
integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==
bare-events@^2.2.0, bare-events@^2.5.4:
- version "2.5.4"
- resolved "https://registry.yarnpkg.com/bare-events/-/bare-events-2.5.4.tgz#16143d435e1ed9eafd1ab85f12b89b3357a41745"
- integrity sha512-+gFfDkR8pj4/TrWCGUGWmJIkBwuxPS5F+a5yWjOHQt2hHvNZd5YLzadjmDUtFmMM4y429bnKLa8bYBMHcYdnQA==
+ version "2.6.0"
+ resolved "https://registry.yarnpkg.com/bare-events/-/bare-events-2.6.0.tgz#11d9506da109e363a2f3af050fbb005ccdb3ee8f"
+ integrity sha512-EKZ5BTXYExaNqi3I3f9RtEsaI/xBSGjE0XZCZilPzFAV/goswFHuPd9jEZlPIZ/iNZJwDSao9qRiScySz7MbQg==
bare-fs@^4.0.1:
- version "4.0.2"
- resolved "https://registry.yarnpkg.com/bare-fs/-/bare-fs-4.0.2.tgz#a879c7b5d9242663ef80d75d6b99c2c6701664d6"
- integrity sha512-S5mmkMesiduMqnz51Bfh0Et9EX0aTCJxhsI4bvzFFLs8Z1AV8RDHadfY5CyLwdoLHgXbNBEN1gQcbEtGwuvixw==
+ version "4.1.6"
+ resolved "https://registry.yarnpkg.com/bare-fs/-/bare-fs-4.1.6.tgz#0925521e7310f65cb1f154cab264f0b647a7cdef"
+ integrity sha512-25RsLF33BqooOEFNdMcEhMpJy8EoR88zSMrnOQOaM3USnOK2VmaJ1uaQEwPA6AQjrv1lXChScosN6CzbwbO9OQ==
dependencies:
bare-events "^2.5.4"
bare-path "^3.0.0"
@@ -2644,6 +3243,11 @@ bcryptjs@*, bcryptjs@^3.0.2:
resolved "https://registry.yarnpkg.com/bcryptjs/-/bcryptjs-3.0.2.tgz#caadcca1afefe372ed6e20f86db8e8546361c1ca"
integrity sha512-k38b3XOZKv60C4E2hVsXTolJWfkGRMbILBIe2IBITXciy5bOsTKot5kDrf3ZfufQtQOUN5mXceUEpU1rTl9Uog==
+binary-extensions@^2.0.0:
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.3.0.tgz#f6e14a97858d327252200242d4ccfe522c445522"
+ integrity sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==
+
bindings@^1.4.0:
version "1.5.0"
resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.5.0.tgz#10353c9e945334bc0511a6d90b38fbc7c9c504df"
@@ -2651,15 +3255,10 @@ bindings@^1.4.0:
dependencies:
file-uri-to-path "1.0.0"
-birpc@^0.2.19:
- version "0.2.19"
- resolved "https://registry.yarnpkg.com/birpc/-/birpc-0.2.19.tgz#cdd183a4a70ba103127d49765b4a71349da5a0ca"
- integrity sha512-5WeXXAvTmitV1RqJFppT5QtUiz2p1mRSYU000Jkft5ZUCLJIk4uQriYNO50HknxKwM6jd8utNc66K1qGIwwWBQ==
-
-birpc@^2.0.19, birpc@^2.3.0:
- version "2.3.0"
- resolved "https://registry.yarnpkg.com/birpc/-/birpc-2.3.0.tgz#e5a402dc785ef952a2383ef3cfc075e0842f3e8c"
- integrity sha512-ijbtkn/F3Pvzb6jHypHRyve2QApOCZDR25D/VnkY2G/lBNcXCTsnsCxgY4k4PkVB7zfwzYbY3O9Lcqe3xufS5g==
+birpc@^2.3.0, birpc@^2.4.0:
+ version "2.5.0"
+ resolved "https://registry.yarnpkg.com/birpc/-/birpc-2.5.0.tgz#3a014e54c17eceba0ce15738d484ea371dbf6527"
+ integrity sha512-VSWO/W6nNQdyP520F1mhf+Lc2f8pjGQOtoHHm7Ze8Go1kX7akpVIrtTa0fn+HB0QJEDVacl6aO08YE0PgXfdnQ==
bl@^4.0.3:
version "4.1.0"
@@ -2681,21 +3280,21 @@ boolbase@^1.0.0:
integrity sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==
brace-expansion@^1.1.7:
- version "1.1.11"
- resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd"
- integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==
+ version "1.1.12"
+ resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.12.tgz#ab9b454466e5a8cc3a187beaad580412a9c5b843"
+ integrity sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==
dependencies:
balanced-match "^1.0.0"
concat-map "0.0.1"
brace-expansion@^2.0.1:
- version "2.0.1"
- resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae"
- integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.2.tgz#54fc53237a613d854c7bd37463aad17df87214e7"
+ integrity sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==
dependencies:
balanced-match "^1.0.0"
-braces@^3.0.3:
+braces@^3.0.3, braces@~3.0.2:
version "3.0.3"
resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.3.tgz#490332f40919452272d55a8480adc0c441358789"
integrity sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==
@@ -2709,21 +3308,26 @@ brotli@^1.3.2:
dependencies:
base64-js "^1.1.2"
-browserslist@^4.0.0, browserslist@^4.23.3, browserslist@^4.24.0, browserslist@^4.24.4:
- version "4.24.4"
- resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.24.4.tgz#c6b2865a3f08bcb860a0e827389003b9fe686e4b"
- integrity sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==
+browserslist@^4.0.0, browserslist@^4.24.0, browserslist@^4.24.4, browserslist@^4.25.1:
+ version "4.25.1"
+ resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.25.1.tgz#ba9e8e6f298a1d86f829c9b975e07948967bb111"
+ integrity sha512-KGj0KoOMXLpSNkkEI6Z6mShmQy0bc1I+T7K9N81k4WWMrfz+6fQ6es80B/YLAeRoKvjYE1YSHHOW1qe9xIVzHw==
dependencies:
- caniuse-lite "^1.0.30001688"
- electron-to-chromium "^1.5.73"
+ caniuse-lite "^1.0.30001726"
+ electron-to-chromium "^1.5.173"
node-releases "^2.0.19"
- update-browserslist-db "^1.1.1"
+ update-browserslist-db "^1.1.3"
buffer-crc32@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-1.0.0.tgz#a10993b9055081d55304bd9feb4a072de179f405"
integrity sha512-Db1SbgBS/fg/392AblrMJk97KggmvYhr4pB5ZIMTWtaivCPMWLkmb7m21cJvpvgK+J3nsU2CmmixNBZx4vFj/w==
+buffer-crc32@~0.2.3:
+ version "0.2.13"
+ resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242"
+ integrity sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==
+
buffer-from@^1.0.0:
version "1.1.2"
resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5"
@@ -2745,6 +3349,11 @@ buffer@^6.0.3:
base64-js "^1.3.1"
ieee754 "^1.2.1"
+builtin-modules@^3.3.0:
+ version "3.3.0"
+ resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-3.3.0.tgz#cae62812b89801e9656336e46223e030386be7b6"
+ integrity sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==
+
builtin-modules@^5.0.0:
version "5.0.0"
resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-5.0.0.tgz#9be95686dedad2e9eed05592b07733db87dcff1a"
@@ -2764,40 +3373,22 @@ bundle-require@^5.1.0:
dependencies:
load-tsconfig "^0.2.3"
-c12@^3.0.2:
- version "3.0.2"
- resolved "https://registry.yarnpkg.com/c12/-/c12-3.0.2.tgz#5ceba55cf081ff4cf95b22c593c80b34cf1f3d2e"
- integrity sha512-6Tzk1/TNeI3WBPpK0j/Ss4+gPj3PUJYbWl/MWDJBThFvwNGNkXtd7Cz8BJtD4aRwoGHtzQD0SnxamgUiBH0/Nw==
- dependencies:
- chokidar "^4.0.3"
- confbox "^0.1.8"
- defu "^6.1.4"
- dotenv "^16.4.7"
- exsolve "^1.0.0"
- giget "^2.0.0"
- jiti "^2.4.2"
- ohash "^2.0.5"
- pathe "^2.0.3"
- perfect-debounce "^1.0.0"
- pkg-types "^2.0.0"
- rc9 "^2.1.2"
-
-c12@^3.0.3:
- version "3.0.3"
- resolved "https://registry.yarnpkg.com/c12/-/c12-3.0.3.tgz#4d6d4d35f084606ff616d1bcae60e6676eacd4bd"
- integrity sha512-uC3MacKBb0Z15o5QWCHvHWj5Zv34pGQj9P+iXKSpTuSGFS0KKhUWf4t9AJ+gWjYOdmWCPEGpEzm8sS0iqbpo1w==
+c12@^3.0.4, c12@^3.1.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/c12/-/c12-3.1.0.tgz#9e237970e1d3b74ebae51d25945cb59664c12c89"
+ integrity sha512-uWoS8OU1MEIsOv8p/5a82c3H31LsWVR5qiyXVfBNOzfffjUWtPnhAb4BYI2uG2HfGmZmFjCtui5XNWaps+iFuw==
dependencies:
chokidar "^4.0.3"
confbox "^0.2.2"
defu "^6.1.4"
- dotenv "^16.4.7"
- exsolve "^1.0.4"
+ dotenv "^16.6.1"
+ exsolve "^1.0.7"
giget "^2.0.0"
jiti "^2.4.2"
ohash "^2.0.11"
pathe "^2.0.3"
perfect-debounce "^1.0.0"
- pkg-types "^2.1.0"
+ pkg-types "^2.2.0"
rc9 "^2.1.2"
cac@^6.7.14:
@@ -2813,6 +3404,19 @@ call-bind-apply-helpers@^1.0.1, call-bind-apply-helpers@^1.0.2:
es-errors "^1.3.0"
function-bind "^1.1.2"
+call-bound@^1.0.2:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/call-bound/-/call-bound-1.0.4.tgz#238de935d2a2a692928c538c7ccfa91067fd062a"
+ integrity sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==
+ dependencies:
+ call-bind-apply-helpers "^1.0.2"
+ get-intrinsic "^1.3.0"
+
+callsite@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/callsite/-/callsite-1.0.0.tgz#280398e5d664bd74038b6f0905153e6e8af1bc20"
+ integrity sha512-0vdNRFXn5q+dtOqjfFtmtlI9N2eVZ7LMyEV2iKC5mEEFvSg/69Ml6b/WU2qF8W1nLRa0wiSrDT3Y5jOHZCwKPQ==
+
callsites@^3.0.0:
version "3.1.0"
resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73"
@@ -2828,10 +3432,10 @@ caniuse-api@^3.0.0:
lodash.memoize "^4.1.2"
lodash.uniq "^4.5.0"
-caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001688, caniuse-lite@^1.0.30001702:
- version "1.0.30001707"
- resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001707.tgz#c5e104d199e6f4355a898fcd995a066c7eb9bf41"
- integrity sha512-3qtRjw/HQSMlDWf+X79N206fepf4SOOU6SQLMaq/0KkZLmSjPxAkBOQQ+FxbHKfHmYLZFfdWsO3KA90ceHPSnw==
+caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001702, caniuse-lite@^1.0.30001726:
+ version "1.0.30001727"
+ resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001727.tgz#22e9706422ad37aa50556af8c10e40e2d93a8b85"
+ integrity sha512-pB68nIHmbN6L/4C6MH1DokyR3bYqFwjaSs/sWDHGj4CTcFtQUQMuJftVwWkXq7mNWOybD3KhUv3oWHoGxgP14Q==
canvas-renderer@~2.2.0:
version "2.2.1"
@@ -2848,12 +3452,61 @@ chalk@^4.0.0:
ansi-styles "^4.1.0"
supports-color "^7.1.0"
+change-case@^5.4.4:
+ version "5.4.4"
+ resolved "https://registry.yarnpkg.com/change-case/-/change-case-5.4.4.tgz#0d52b507d8fb8f204343432381d1a6d7bff97a02"
+ integrity sha512-HRQyTk2/YPEkt9TnUPbOpr64Uw3KOicFWPVBb+xiHvd6eBx/qPr9xqfBFDT8P2vWsvvz4jbEkfDe71W3VyNu2w==
+
character-entities@^2.0.0:
version "2.0.2"
resolved "https://registry.yarnpkg.com/character-entities/-/character-entities-2.0.2.tgz#2d09c2e72cd9523076ccb21157dff66ad43fcc22"
integrity sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==
-chokidar@^4.0.0, chokidar@^4.0.3:
+cheerio-select@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/cheerio-select/-/cheerio-select-2.1.0.tgz#4d8673286b8126ca2a8e42740d5e3c4884ae21b4"
+ integrity sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==
+ dependencies:
+ boolbase "^1.0.0"
+ css-select "^5.1.0"
+ css-what "^6.1.0"
+ domelementtype "^2.3.0"
+ domhandler "^5.0.3"
+ domutils "^3.0.1"
+
+cheerio@^1.0.0:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/cheerio/-/cheerio-1.1.2.tgz#26af77e89336c81c63ea83197f868b4cbd351369"
+ integrity sha512-IkxPpb5rS/d1IiLbHMgfPuS0FgiWTtFIm/Nj+2woXDLTZ7fOT2eqzgYbdMlLweqlHbsZjxEChoVK+7iph7jyQg==
+ dependencies:
+ cheerio-select "^2.1.0"
+ dom-serializer "^2.0.0"
+ domhandler "^5.0.3"
+ domutils "^3.2.2"
+ encoding-sniffer "^0.2.1"
+ htmlparser2 "^10.0.0"
+ parse5 "^7.3.0"
+ parse5-htmlparser2-tree-adapter "^7.1.0"
+ parse5-parser-stream "^7.1.2"
+ undici "^7.12.0"
+ whatwg-mimetype "^4.0.0"
+
+chokidar@^3.6.0:
+ version "3.6.0"
+ resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.6.0.tgz#197c6cc669ef2a8dc5e7b4d97ee4e092c3eb0d5b"
+ integrity sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==
+ dependencies:
+ anymatch "~3.1.2"
+ braces "~3.0.2"
+ glob-parent "~5.1.2"
+ is-binary-path "~2.1.0"
+ is-glob "~4.0.1"
+ normalize-path "~3.0.0"
+ readdirp "~3.6.0"
+ optionalDependencies:
+ fsevents "~2.3.2"
+
+chokidar@^4.0.0, chokidar@^4.0.1, chokidar@^4.0.3:
version "4.0.3"
resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-4.0.3.tgz#7be37a4c03c9aee1ecfe862a4a23b2c70c205d30"
integrity sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==
@@ -2870,10 +3523,10 @@ chownr@^3.0.0:
resolved "https://registry.yarnpkg.com/chownr/-/chownr-3.0.0.tgz#9855e64ecd240a9cc4267ce8a4aa5d24a1da15e4"
integrity sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==
-ci-info@^4.2.0:
- version "4.2.0"
- resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-4.2.0.tgz#cbd21386152ebfe1d56f280a3b5feccbd96764c7"
- integrity sha512-cYY9mypksY8NRqgDB1XD1RiJL338v/551niynFTGkZOO2LHuB2OmOYxDIe/ttN9AHwrqdum1360G3ald0W9kCg==
+ci-info@^4.3.0:
+ version "4.3.0"
+ resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-4.3.0.tgz#c39b1013f8fdbd28cd78e62318357d02da160cd7"
+ integrity sha512-l+2bNRMiQgcfILUi33labAZYIWlH1kWDp+ecNo5iisRKrbm0xcRyCww71/YU0Fkw0mAFpz9bJayXPjey6vkmaQ==
citty@^0.1.5, citty@^0.1.6:
version "0.1.6"
@@ -2917,6 +3570,13 @@ cluster-key-slot@^1.1.0:
resolved "https://registry.yarnpkg.com/cluster-key-slot/-/cluster-key-slot-1.1.2.tgz#88ddaa46906e303b5de30d3153b7d9fe0a0c19ac"
integrity sha512-RMr0FhtfXemyinomL4hrWcYJxmX6deFdCxpJzhDttxgO1+bcCnkk+9drydLVDmAMG7NE6aN/fl4F7ucU/90gAA==
+color-convert@^1.9.3:
+ version "1.9.3"
+ resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8"
+ integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==
+ dependencies:
+ color-name "1.1.3"
+
color-convert@^2.0.1:
version "2.0.1"
resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3"
@@ -2924,12 +3584,17 @@ color-convert@^2.0.1:
dependencies:
color-name "~1.1.4"
-color-name@^1.0.0, color-name@~1.1.4:
+color-name@1.1.3:
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25"
+ integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==
+
+color-name@^1.0.0, color-name@^1.1.4, 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:
+color-string@^1.6.0, 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==
@@ -2937,6 +3602,14 @@ color-string@^1.9.0:
color-name "^1.0.0"
simple-swizzle "^0.2.2"
+color@^3.1.3:
+ version "3.2.1"
+ resolved "https://registry.yarnpkg.com/color/-/color-3.2.1.tgz#3544dc198caf4490c3ecc9a790b54fe9ff45e164"
+ integrity sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==
+ dependencies:
+ color-convert "^1.9.3"
+ color-string "^1.6.0"
+
color@^4.2.3:
version "4.2.3"
resolved "https://registry.yarnpkg.com/color/-/color-4.2.3.tgz#d781ecb5e57224ee43ea9627560107c0e0c6463a"
@@ -2950,6 +3623,19 @@ colord@^2.9.3:
resolved "https://registry.yarnpkg.com/colord/-/colord-2.9.3.tgz#4f8ce919de456f1d5c1c368c307fe20f3e59fb43"
integrity sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==
+colorette@^2.0.7:
+ version "2.0.20"
+ resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.20.tgz#9eb793e6833067f7235902fcd3b09917a000a95a"
+ integrity sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==
+
+colorspace@1.1.x:
+ version "1.1.4"
+ resolved "https://registry.yarnpkg.com/colorspace/-/colorspace-1.1.4.tgz#8d442d1186152f60453bf8070cd66eb364e59243"
+ integrity sha512-BgvKJiuVu1igBUF2kEjRCZXol6wiiGbY5ipL/oVPwm0BL9sIpMIzM8IK7vwuxIIzOXMV3Ey5w+vxhm0rR/TN8w==
+ dependencies:
+ color "^3.1.3"
+ text-hex "1.0.x"
+
combined-stream@^1.0.8:
version "1.0.8"
resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f"
@@ -2957,6 +3643,21 @@ combined-stream@^1.0.8:
dependencies:
delayed-stream "~1.0.0"
+commander@^10.0.1:
+ version "10.0.1"
+ resolved "https://registry.yarnpkg.com/commander/-/commander-10.0.1.tgz#881ee46b4f77d1c1dccc5823433aa39b022cbe06"
+ integrity sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==
+
+commander@^11.1.0:
+ version "11.1.0"
+ resolved "https://registry.yarnpkg.com/commander/-/commander-11.1.0.tgz#62fdce76006a68e5c1ab3314dc92e800eb83d906"
+ integrity sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==
+
+commander@^12.1.0:
+ version "12.1.0"
+ resolved "https://registry.yarnpkg.com/commander/-/commander-12.1.0.tgz#01423b36f501259fdaac4d0e4d60c96c991585d3"
+ integrity sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==
+
commander@^2.20.0, commander@^2.20.3:
version "2.20.3"
resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33"
@@ -2967,20 +3668,25 @@ commander@^7.2.0:
resolved "https://registry.yarnpkg.com/commander/-/commander-7.2.0.tgz#a36cb57d0b501ce108e4d20559a150a391d97ab7"
integrity sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==
-comment-parser@1.4.1, comment-parser@^1.4.0:
+comment-parser@1.4.1, comment-parser@^1.4.0, comment-parser@^1.4.1:
version "1.4.1"
resolved "https://registry.yarnpkg.com/comment-parser/-/comment-parser-1.4.1.tgz#bdafead37961ac079be11eb7ec65c4d021eaf9cc"
integrity sha512-buhp5kePrmda3vhc5B9t7pUQXAb2Tnd0qgpkIhPhkHXxJpiPJ11H0ZEU0oBpJ2QztSbzG/ZxMj/CHsYJqRHmyg==
+common-path-prefix@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/common-path-prefix/-/common-path-prefix-3.0.0.tgz#7d007a7e07c58c4b4d5f433131a19141b29f11e0"
+ integrity sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==
+
commondir@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b"
integrity sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==
-compatx@^0.1.8:
- version "0.1.8"
- resolved "https://registry.yarnpkg.com/compatx/-/compatx-0.1.8.tgz#af6f61910ade6ce1073c0fdff23c786bcd75c026"
- integrity sha512-jcbsEAR81Bt5s1qOFymBufmCbXCXbk0Ql+K5ouj6gCyx2yHlu6AgmGIi9HxfKixpUDO5bCFJUHQ5uM6ecbTebw==
+compatx@^0.2.0:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/compatx/-/compatx-0.2.0.tgz#76bae4e221c8de3da795f52b2e0b67003735b313"
+ integrity sha512-6gLRNt4ygsi5NyMVhceOCFv14CIdDFN7fQjX1U4+47qVE/+kjPoXMK65KWK+dWxmFzMTuKazoQ9sch6pM0p5oA==
compress-commons@^6.0.2:
version "6.0.2"
@@ -3003,11 +3709,6 @@ confbox@^0.1.8:
resolved "https://registry.yarnpkg.com/confbox/-/confbox-0.1.8.tgz#820d73d3b3c82d9bd910652c5d4d599ef8ff8b06"
integrity sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==
-confbox@^0.2.1:
- version "0.2.1"
- resolved "https://registry.yarnpkg.com/confbox/-/confbox-0.2.1.tgz#ae39f2c99699afa451d00206479f15f9a1208a8b"
- integrity sha512-hkT3yDPFbs95mNCy1+7qNKC6Pro+/ibzYxtM2iqEigpf0sVw+bg4Zh9/snjsBcf990vfIsg5+1U7VyiyBb3etg==
-
confbox@^0.2.2:
version "0.2.2"
resolved "https://registry.yarnpkg.com/confbox/-/confbox-0.2.2.tgz#8652f53961c74d9e081784beed78555974a9c110"
@@ -3045,12 +3746,20 @@ copy-anything@^3.0.2:
dependencies:
is-what "^4.1.8"
-core-js-compat@^3.41.0:
- version "3.41.0"
- resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.41.0.tgz#4cdfce95f39a8f27759b667cf693d96e5dda3d17"
- integrity sha512-RFsU9LySVue9RTwdDVX/T0e2Y6jRYWXERKElIjpuEOEnxaXffI0X7RUwVzfYLfzuLXSNJDYoRYUAmRUcyln20A==
+copy-file@^11.0.0:
+ version "11.0.0"
+ resolved "https://registry.yarnpkg.com/copy-file/-/copy-file-11.0.0.tgz#903f0a5a34e5534eaf775352ac9381359c13f258"
+ integrity sha512-mFsNh/DIANLqFt5VHZoGirdg7bK5+oTWlhnGu6tgRhzBlnEKWaPX2xrFaLltii/6rmhqFMJqffUgknuRdpYlHw==
dependencies:
- browserslist "^4.24.4"
+ graceful-fs "^4.2.11"
+ p-event "^6.0.0"
+
+core-js-compat@^3.44.0:
+ version "3.44.0"
+ resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.44.0.tgz#62b9165b97e4cbdb8bca16b14818e67428b4a0f8"
+ integrity sha512-JepmAj2zfl6ogy34qfWtcE7nHKAJnKsQFRn++scjVS2bZFllwptzw61BZcZFYBPpUznLfAvh0LGhxKppk04ClA==
+ dependencies:
+ browserslist "^4.25.1"
core-util-is@~1.0.0:
version "1.0.3"
@@ -3070,10 +3779,17 @@ crc32-stream@^6.0.0:
crc-32 "^1.2.0"
readable-stream "^4.0.0"
-croner@^9.0.0:
- version "9.0.0"
- resolved "https://registry.yarnpkg.com/croner/-/croner-9.0.0.tgz#1db62160142cf32eb22622e9ae27ba29156883f7"
- integrity sha512-onMB0OkDjkXunhdW9htFjEhqrD54+M94i6ackoUkjHKbRnXdyEyKRelp4nJ1kAz32+s27jP1FsebpJCVl0BsvA==
+cron-parser@^4.9.0:
+ version "4.9.0"
+ resolved "https://registry.yarnpkg.com/cron-parser/-/cron-parser-4.9.0.tgz#0340694af3e46a0894978c6f52a6dbb5c0f11ad5"
+ integrity sha512-p0SaNjrHOnQeR8/VnfGbmg9te2kfyYSQ7Sc/j/6DtPL3JQvKxmjO9TSjNFpujqV3vEYYBvNNvXSxzyksBWAx1Q==
+ dependencies:
+ luxon "^3.2.1"
+
+croner@^9.1.0:
+ version "9.1.0"
+ resolved "https://registry.yarnpkg.com/croner/-/croner-9.1.0.tgz#94ccbba2570bca329f60f36ec19875dccf9a63aa"
+ integrity sha512-p9nwwR4qyT5W996vBZhdvBCnMhicY5ytZkR4D1Xj0wuTDEiMnjwR57Q3RXYY/s0EpX6Ay3vgIcfaR+ewGHsi+g==
cross-fetch@^3.0.4:
version "3.2.0"
@@ -3091,10 +3807,10 @@ cross-spawn@^7.0.3, cross-spawn@^7.0.6:
shebang-command "^2.0.0"
which "^2.0.1"
-"crossws@>=0.2.0 <0.4.0", crossws@^0.3.3, crossws@^0.3.4:
- version "0.3.4"
- resolved "https://registry.yarnpkg.com/crossws/-/crossws-0.3.4.tgz#06164c6495ea99152ea7557c99310b52d9be9b29"
- integrity sha512-uj0O1ETYX1Bh6uSgktfPvwDiPYGQ3aI4qVsaC/LWpkIzGj1nUYm5FK3K+t11oOlpN01lGbprFCH4wBlKdJjVgw==
+"crossws@>=0.2.0 <0.4.0", crossws@^0.3.4, crossws@^0.3.5:
+ version "0.3.5"
+ resolved "https://registry.yarnpkg.com/crossws/-/crossws-0.3.5.tgz#daad331d44148ea6500098bc858869f3a5ab81a6"
+ integrity sha512-ojKiDvcmByhwa8YYqbQI/hg7MEU0NC03+pSdEq4ZUnZR9xXpwk7E43SMNGkn+JxJGPFtNvQ48+vV2p+P1ml5PA==
dependencies:
uncrypto "^0.1.3"
@@ -3104,9 +3820,9 @@ css-declaration-sorter@^7.2.0:
integrity sha512-h70rUM+3PNFuaBDTLe8wF/cdWu+dOZmb7pJt8Z2sedYbAcQVQV/tEchueg3GWxwqS0cxtbxmaHEdkNACqcvsow==
css-select@^5.1.0:
- version "5.1.0"
- resolved "https://registry.yarnpkg.com/css-select/-/css-select-5.1.0.tgz#b8ebd6554c3637ccc76688804ad3f6a6fdaea8a6"
- integrity sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==
+ version "5.2.2"
+ resolved "https://registry.yarnpkg.com/css-select/-/css-select-5.2.2.tgz#01b6e8d163637bb2dd6c982ca4ed65863682786e"
+ integrity sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw==
dependencies:
boolbase "^1.0.0"
css-what "^6.1.0"
@@ -3122,7 +3838,7 @@ css-tree@^2.3.1:
mdn-data "2.0.30"
source-map-js "^1.0.1"
-css-tree@^3.0.0, css-tree@^3.1.0:
+css-tree@^3.0.0, css-tree@^3.0.1, css-tree@^3.1.0:
version "3.1.0"
resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-3.1.0.tgz#7aabc035f4e66b5c86f54570d55e05b1346eb0fd"
integrity sha512-0eW44TGN5SQXU1mWSkKwFstI/22X2bG1nYzZTYMAWjylYURhse752YgbE4Cx46AC+bAvI+/dYTPRk1LqSUnu6w==
@@ -3139,9 +3855,9 @@ css-tree@~2.2.0:
source-map-js "^1.0.1"
css-what@^6.1.0:
- version "6.1.0"
- resolved "https://registry.yarnpkg.com/css-what/-/css-what-6.1.0.tgz#fb5effcf76f1ddea2c81bdfaa4de44e79bac70f4"
- integrity sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==
+ version "6.2.2"
+ resolved "https://registry.yarnpkg.com/css-what/-/css-what-6.2.2.tgz#cdcc8f9b6977719fdfbd1de7aec24abf756b9dea"
+ integrity sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==
cssesc@^3.0.0:
version "3.0.0"
@@ -3153,54 +3869,54 @@ cssfilter@0.0.10:
resolved "https://registry.yarnpkg.com/cssfilter/-/cssfilter-0.0.10.tgz#c6d2672632a2e5c83e013e6864a42ce8defd20ae"
integrity sha512-FAaLDaplstoRsDR8XGYH51znUN0UY7nMc6Z9/fvE8EXGwvJE9hu7W2vHwx1+bd6gCYnln9nLbzxFTrcO9YQDZw==
-cssnano-preset-default@^7.0.6:
- version "7.0.6"
- resolved "https://registry.yarnpkg.com/cssnano-preset-default/-/cssnano-preset-default-7.0.6.tgz#0220fa7507478369aa2a226bac03e1204cd024c1"
- integrity sha512-ZzrgYupYxEvdGGuqL+JKOY70s7+saoNlHSCK/OGn1vB2pQK8KSET8jvenzItcY+kA7NoWvfbb/YhlzuzNKjOhQ==
+cssnano-preset-default@^7.0.8:
+ version "7.0.8"
+ resolved "https://registry.yarnpkg.com/cssnano-preset-default/-/cssnano-preset-default-7.0.8.tgz#a2e380cb73931dc817fa360217840b2e377463ee"
+ integrity sha512-d+3R2qwrUV3g4LEMOjnndognKirBZISylDZAF/TPeCWVjEwlXS2e4eN4ICkoobRe7pD3H6lltinKVyS1AJhdjQ==
dependencies:
- browserslist "^4.23.3"
+ browserslist "^4.25.1"
css-declaration-sorter "^7.2.0"
- cssnano-utils "^5.0.0"
- postcss-calc "^10.0.2"
- postcss-colormin "^7.0.2"
- postcss-convert-values "^7.0.4"
- postcss-discard-comments "^7.0.3"
- postcss-discard-duplicates "^7.0.1"
- postcss-discard-empty "^7.0.0"
- postcss-discard-overridden "^7.0.0"
- postcss-merge-longhand "^7.0.4"
- postcss-merge-rules "^7.0.4"
- postcss-minify-font-values "^7.0.0"
- postcss-minify-gradients "^7.0.0"
- postcss-minify-params "^7.0.2"
- postcss-minify-selectors "^7.0.4"
- postcss-normalize-charset "^7.0.0"
- postcss-normalize-display-values "^7.0.0"
- postcss-normalize-positions "^7.0.0"
- postcss-normalize-repeat-style "^7.0.0"
- postcss-normalize-string "^7.0.0"
- postcss-normalize-timing-functions "^7.0.0"
- postcss-normalize-unicode "^7.0.2"
- postcss-normalize-url "^7.0.0"
- postcss-normalize-whitespace "^7.0.0"
- postcss-ordered-values "^7.0.1"
- postcss-reduce-initial "^7.0.2"
- postcss-reduce-transforms "^7.0.0"
- postcss-svgo "^7.0.1"
- postcss-unique-selectors "^7.0.3"
+ cssnano-utils "^5.0.1"
+ postcss-calc "^10.1.1"
+ postcss-colormin "^7.0.4"
+ postcss-convert-values "^7.0.6"
+ postcss-discard-comments "^7.0.4"
+ postcss-discard-duplicates "^7.0.2"
+ postcss-discard-empty "^7.0.1"
+ postcss-discard-overridden "^7.0.1"
+ postcss-merge-longhand "^7.0.5"
+ postcss-merge-rules "^7.0.6"
+ postcss-minify-font-values "^7.0.1"
+ postcss-minify-gradients "^7.0.1"
+ postcss-minify-params "^7.0.4"
+ postcss-minify-selectors "^7.0.5"
+ postcss-normalize-charset "^7.0.1"
+ postcss-normalize-display-values "^7.0.1"
+ postcss-normalize-positions "^7.0.1"
+ postcss-normalize-repeat-style "^7.0.1"
+ postcss-normalize-string "^7.0.1"
+ postcss-normalize-timing-functions "^7.0.1"
+ postcss-normalize-unicode "^7.0.4"
+ postcss-normalize-url "^7.0.1"
+ postcss-normalize-whitespace "^7.0.1"
+ postcss-ordered-values "^7.0.2"
+ postcss-reduce-initial "^7.0.4"
+ postcss-reduce-transforms "^7.0.1"
+ postcss-svgo "^7.1.0"
+ postcss-unique-selectors "^7.0.4"
-cssnano-utils@^5.0.0:
- version "5.0.0"
- resolved "https://registry.yarnpkg.com/cssnano-utils/-/cssnano-utils-5.0.0.tgz#b53a0343dd5d21012911882db6ae7d2eae0e3687"
- integrity sha512-Uij0Xdxc24L6SirFr25MlwC2rCFX6scyUmuKpzI+JQ7cyqDEwD42fJ0xfB3yLfOnRDU5LKGgjQ9FA6LYh76GWQ==
+cssnano-utils@^5.0.1:
+ version "5.0.1"
+ resolved "https://registry.yarnpkg.com/cssnano-utils/-/cssnano-utils-5.0.1.tgz#f529e9aa0d7930512ca45b9e2ddb8d6b9092eb30"
+ integrity sha512-ZIP71eQgG9JwjVZsTPSqhc6GHgEr53uJ7tK5///VfyWj6Xp2DBmixWHqJgPno+PqATzn48pL42ww9x5SSGmhZg==
-cssnano@^7.0.6:
- version "7.0.6"
- resolved "https://registry.yarnpkg.com/cssnano/-/cssnano-7.0.6.tgz#63d54fd42bc017f6aaed69e47d9aaef85b7850ec"
- integrity sha512-54woqx8SCbp8HwvNZYn68ZFAepuouZW4lTwiMVnBErM3VkO7/Sd4oTOt3Zz3bPx3kxQ36aISppyXj2Md4lg8bw==
+cssnano@^7.0.7:
+ version "7.1.0"
+ resolved "https://registry.yarnpkg.com/cssnano/-/cssnano-7.1.0.tgz#f1a89ac4753982aebe5ae9583f3e9ad6645aded5"
+ integrity sha512-Pu3rlKkd0ZtlCUzBrKL1Z4YmhKppjC1H9jo7u1o4qaKqyhvixFgu5qLyNIAOjSTg9DjVPtUqdROq2EfpVMEe+w==
dependencies:
- cssnano-preset-default "^7.0.6"
- lilconfig "^3.1.2"
+ cssnano-preset-default "^7.0.8"
+ lilconfig "^3.1.3"
csso@^5.0.5:
version "5.0.5"
@@ -3214,41 +3930,44 @@ csstype@^3.1.3:
resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.3.tgz#d80ff294d114fb0e6ac500fbf85b60137d7eff81"
integrity sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==
-db0@^0.3.1:
- version "0.3.1"
- resolved "https://registry.yarnpkg.com/db0/-/db0-0.3.1.tgz#84366f06cd9a154545b077be5cb955e4ac278314"
- integrity sha512-3RogPLE2LLq6t4YiFCREyl572aBjkfMvfwPyN51df00TbPbryL3XqBYuJ/j6mgPssPK8AKfYdLxizaO5UG10sA==
+data-uri-to-buffer@^4.0.0:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz#d8feb2b2881e6a4f58c2e08acfd0e2834e26222e"
+ integrity sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==
+
+dateformat@^4.6.3:
+ version "4.6.3"
+ resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-4.6.3.tgz#556fa6497e5217fedb78821424f8a1c22fa3f4b5"
+ integrity sha512-2P0p0pFGzHS5EMnhdxQi7aJN+iMheud0UhG4dlE1DLAlvL8JHjJJTX/CSm4JXwV0Ka5nGk3zC5mcb5bUQUxxMA==
+
+db0@^0.3.2:
+ version "0.3.2"
+ resolved "https://registry.yarnpkg.com/db0/-/db0-0.3.2.tgz#f2f19a547ac5519714a510edf0f93daf61ff7e47"
+ integrity sha512-xzWNQ6jk/+NtdfLyXEipbX55dmDSeteLFt/ayF+wZUU5bzKgmrDOxmInUTbyVRp46YwnJdkDA1KhB7WIXFofJw==
de-indent@^1.0.2:
version "1.0.2"
resolved "https://registry.yarnpkg.com/de-indent/-/de-indent-1.0.2.tgz#b2038e846dc33baa5796128d0804b455b8c1e21d"
integrity sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==
-debug@2.6.9:
- version "2.6.9"
- resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f"
- integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==
- dependencies:
- ms "2.0.0"
-
-debug@4, debug@^4.0.0, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4, debug@^4.3.5, debug@^4.3.6, debug@^4.4.0:
- version "4.4.0"
- resolved "https://registry.yarnpkg.com/debug/-/debug-4.4.0.tgz#2b3f2aea2ffeb776477460267377dc8710faba8a"
- integrity sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==
+debug@4, debug@^4.0.0, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.3, debug@^4.3.4, debug@^4.3.5, debug@^4.4.0, debug@^4.4.1:
+ version "4.4.1"
+ resolved "https://registry.yarnpkg.com/debug/-/debug-4.4.1.tgz#e5a8bc6cbc4c6cd3e64308b0693a3d4fa550189b"
+ integrity sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==
dependencies:
ms "^2.1.3"
-debug@^3.2.7:
- version "3.2.7"
- resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a"
- integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==
+decache@^4.6.2:
+ version "4.6.2"
+ resolved "https://registry.yarnpkg.com/decache/-/decache-4.6.2.tgz#c1df1325a2f36d53922e08f33380f083148199cd"
+ integrity sha512-2LPqkLeu8XWHU8qNCS3kcF6sCcb5zIzvWaAHYSvPfwhdd7mHuah29NssMzrTYyHN4F5oFy2ko9OBYxegtU0FEw==
dependencies:
- ms "^2.1.1"
+ callsite "^1.0.0"
decode-named-character-reference@^1.0.0:
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/decode-named-character-reference/-/decode-named-character-reference-1.1.0.tgz#5d6ce68792808901210dac42a8e9853511e2b8bf"
- integrity sha512-Wy+JTSbFThEOXQIR2L6mxJvEs+veIzpmqD7ynWxMXGpnk3smkHQOp6forLdHsKpAMW9iJpaBBIxz285t1n1C3w==
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/decode-named-character-reference/-/decode-named-character-reference-1.2.0.tgz#25c32ae6dd5e21889549d40f676030e9514cc0ed"
+ integrity sha512-c6fcElNV6ShtZXmsgNgFFV5tVX2PaV4g+MOAkb8eXHvn6sryJBrZa9r0zV6+dtTyoCKxtDy5tyQ5ZwQuidtd+Q==
dependencies:
character-entities "^2.0.0"
@@ -3322,25 +4041,96 @@ dequal@^2.0.0:
resolved "https://registry.yarnpkg.com/dequal/-/dequal-2.0.3.tgz#2644214f1997d39ed0ee0ece72335490a7ac67be"
integrity sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==
-destr@^2.0.2, destr@^2.0.3:
- version "2.0.3"
- resolved "https://registry.yarnpkg.com/destr/-/destr-2.0.3.tgz#7f9e97cb3d16dbdca7be52aca1644ce402cfe449"
- integrity sha512-2N3BOUU4gYMpTP24s5rF5iP7BDr7uNTCs4ozw3kf/eKfvWSIu93GEBi5m427YoyJoeOzQ5smuu4nNAPGb8idSQ==
-
-destroy@1.2.0:
- version "1.2.0"
- resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015"
- integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==
+destr@^2.0.2, destr@^2.0.3, destr@^2.0.5:
+ version "2.0.5"
+ resolved "https://registry.yarnpkg.com/destr/-/destr-2.0.5.tgz#7d112ff1b925fb8d2079fac5bdb4a90973b51fdb"
+ integrity sha512-ugFTXCtDZunbzasqBxrK93Ik/DRYsO6S/fedkWEMKqt04xZ4csmnmwGDBAb07QWNaGMAmnTIemsYZCksjATwsA==
detect-libc@^1.0.3:
version "1.0.3"
resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b"
integrity sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==
-detect-libc@^2.0.0, detect-libc@^2.0.2, detect-libc@^2.0.3:
- version "2.0.3"
- resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-2.0.3.tgz#f0cd503b40f9939b894697d19ad50895e30cf700"
- integrity sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==
+detect-libc@^2.0.0, detect-libc@^2.0.2, detect-libc@^2.0.3, detect-libc@^2.0.4:
+ version "2.0.4"
+ resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-2.0.4.tgz#f04715b8ba815e53b4d8109655b6508a6865a7e8"
+ integrity sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA==
+
+detective-amd@^6.0.1:
+ version "6.0.1"
+ resolved "https://registry.yarnpkg.com/detective-amd/-/detective-amd-6.0.1.tgz#71eb13b5d9b17222d7b4de3fb89a8e684d8b9a23"
+ integrity sha512-TtyZ3OhwUoEEIhTFoc1C9IyJIud3y+xYkSRjmvCt65+ycQuc3VcBrPRTMWoO/AnuCyOB8T5gky+xf7Igxtjd3g==
+ dependencies:
+ ast-module-types "^6.0.1"
+ escodegen "^2.1.0"
+ get-amd-module-type "^6.0.1"
+ node-source-walk "^7.0.1"
+
+detective-cjs@^6.0.1:
+ version "6.0.1"
+ resolved "https://registry.yarnpkg.com/detective-cjs/-/detective-cjs-6.0.1.tgz#4fb81a67337630811409abb2148b2b622cacbdcd"
+ integrity sha512-tLTQsWvd2WMcmn/60T2inEJNhJoi7a//PQ7DwRKEj1yEeiQs4mrONgsUtEJKnZmrGWBBmE0kJ1vqOG/NAxwaJw==
+ dependencies:
+ ast-module-types "^6.0.1"
+ node-source-walk "^7.0.1"
+
+detective-es6@^5.0.1:
+ version "5.0.1"
+ resolved "https://registry.yarnpkg.com/detective-es6/-/detective-es6-5.0.1.tgz#f0c026bc9b767a243e57ef282f4343fcf3b8ec4e"
+ integrity sha512-XusTPuewnSUdoxRSx8OOI6xIA/uld/wMQwYsouvFN2LAg7HgP06NF1lHRV3x6BZxyL2Kkoih4ewcq8hcbGtwew==
+ dependencies:
+ node-source-walk "^7.0.1"
+
+detective-postcss@^7.0.1:
+ version "7.0.1"
+ resolved "https://registry.yarnpkg.com/detective-postcss/-/detective-postcss-7.0.1.tgz#f5822d8988339fb56851fcdb079d51fbcff114db"
+ integrity sha512-bEOVpHU9picRZux5XnwGsmCN4+8oZo7vSW0O0/Enq/TO5R2pIAP2279NsszpJR7ocnQt4WXU0+nnh/0JuK4KHQ==
+ dependencies:
+ is-url "^1.2.4"
+ postcss-values-parser "^6.0.2"
+
+detective-sass@^6.0.1:
+ version "6.0.1"
+ resolved "https://registry.yarnpkg.com/detective-sass/-/detective-sass-6.0.1.tgz#fcf5aa51bebf7b721807be418418470ee2409f8a"
+ integrity sha512-jSGPO8QDy7K7pztUmGC6aiHkexBQT4GIH+mBAL9ZyBmnUIOFbkfZnO8wPRRJFP/QP83irObgsZHCoDHZ173tRw==
+ dependencies:
+ gonzales-pe "^4.3.0"
+ node-source-walk "^7.0.1"
+
+detective-scss@^5.0.1:
+ version "5.0.1"
+ resolved "https://registry.yarnpkg.com/detective-scss/-/detective-scss-5.0.1.tgz#6a7f792dc9c0e8cfc0d252a50ba26a6df12596a7"
+ integrity sha512-MAyPYRgS6DCiS6n6AoSBJXLGVOydsr9huwXORUlJ37K3YLyiN0vYHpzs3AdJOgHobBfispokoqrEon9rbmKacg==
+ dependencies:
+ gonzales-pe "^4.3.0"
+ node-source-walk "^7.0.1"
+
+detective-stylus@^5.0.1:
+ version "5.0.1"
+ resolved "https://registry.yarnpkg.com/detective-stylus/-/detective-stylus-5.0.1.tgz#57d54a0b405305ee16655e42008b38a827a9f179"
+ integrity sha512-Dgn0bUqdGbE3oZJ+WCKf8Dmu7VWLcmRJGc6RCzBgG31DLIyai9WAoEhYRgIHpt/BCRMrnXLbGWGPQuBUrnF0TA==
+
+detective-typescript@^14.0.0:
+ version "14.0.0"
+ resolved "https://registry.yarnpkg.com/detective-typescript/-/detective-typescript-14.0.0.tgz#3cf429652eb7d7d2be2c050ac47af957a559527d"
+ integrity sha512-pgN43/80MmWVSEi5LUuiVvO/0a9ss5V7fwVfrJ4QzAQRd3cwqU1SfWGXJFcNKUqoD5cS+uIovhw5t/0rSeC5Mw==
+ dependencies:
+ "@typescript-eslint/typescript-estree" "^8.23.0"
+ ast-module-types "^6.0.1"
+ node-source-walk "^7.0.1"
+
+detective-vue2@^2.2.0:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/detective-vue2/-/detective-vue2-2.2.0.tgz#35fd1d39e261b064aca9fcaf20e136c76877482a"
+ integrity sha512-sVg/t6O2z1zna8a/UIV6xL5KUa2cMTQbdTIIvqNM0NIPswp52fe43Nwmbahzj3ww4D844u/vC2PYfiGLvD3zFA==
+ dependencies:
+ "@dependents/detective-less" "^5.0.1"
+ "@vue/compiler-sfc" "^3.5.13"
+ detective-es6 "^5.0.1"
+ detective-sass "^6.0.1"
+ detective-scss "^5.0.1"
+ detective-stylus "^5.0.1"
+ detective-typescript "^14.0.0"
devalue@^5.1.1:
version "5.1.1"
@@ -3359,17 +4149,10 @@ dfa@^1.2.0:
resolved "https://registry.yarnpkg.com/dfa/-/dfa-1.2.0.tgz#96ac3204e2d29c49ea5b57af8d92c2ae12790657"
integrity sha512-ED3jP8saaweFTjeGX8HQPjeC1YYyZs98jGNZx6IiBvxW7JG5v492kamAQB3m2wop07CvU/RQmzcKr6bgcC5D/Q==
-diff@^7.0.0:
- version "7.0.0"
- resolved "https://registry.yarnpkg.com/diff/-/diff-7.0.0.tgz#3fb34d387cd76d803f6eebea67b921dab0182a9a"
- integrity sha512-PJWHUb1RFevKCwaFA9RlG5tCd+FO5iRh9A8HEtkmBH2Li03iJriB6m6JIN4rGz3K3JLawI7/veA1xzRKP6ISBw==
-
-doctrine@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961"
- integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==
- dependencies:
- esutils "^2.0.2"
+diff@^8.0.2:
+ version "8.0.2"
+ resolved "https://registry.yarnpkg.com/diff/-/diff-8.0.2.tgz#712156a6dd288e66ebb986864e190c2fc9eddfae"
+ integrity sha512-sSuxWU5j5SR9QQji/o2qMvqRNYRDOcBTgsJ/DeCf4iSN4gW+gNMXM7wFIP+fdXZxoNiAnHUTGjCr+TSWXdRDKg==
dom-serializer@^2.0.0:
version "2.0.0"
@@ -3392,7 +4175,7 @@ domhandler@^5.0.2, domhandler@^5.0.3:
dependencies:
domelementtype "^2.3.0"
-domutils@^3.0.1:
+domutils@^3.0.1, domutils@^3.2.1, domutils@^3.2.2:
version "3.2.2"
resolved "https://registry.yarnpkg.com/domutils/-/domutils-3.2.2.tgz#edbfe2b668b0c1d97c24baf0f1062b132221bc78"
integrity sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==
@@ -3401,17 +4184,17 @@ domutils@^3.0.1:
domelementtype "^2.3.0"
domhandler "^5.0.3"
-dot-prop@^9.0.0:
+dot-prop@9.0.0, dot-prop@^9.0.0:
version "9.0.0"
resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-9.0.0.tgz#bae5982fe6dc6b8fddb92efef4f2ddff26779e92"
integrity sha512-1gxPBJpI/pcjQhKgIU91II6Wkay+dLcN3M6rf2uwP8hRur3HtQXjVrdAK3sjC0piaEuxzMwjXChcETiJl47lAQ==
dependencies:
type-fest "^4.18.2"
-dotenv@^16.4.7:
- version "16.4.7"
- resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.4.7.tgz#0e20c5b82950140aa99be360a8a5f52335f53c26"
- integrity sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ==
+dotenv@^16.3.1, dotenv@^16.4.7, dotenv@^16.6.1:
+ version "16.6.1"
+ resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.6.1.tgz#773f0e69527a8315c7285d5ee73c4459d20a8020"
+ integrity sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==
dunder-proto@^1.0.1:
version "1.0.1"
@@ -3437,10 +4220,10 @@ ee-first@1.1.1:
resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d"
integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==
-electron-to-chromium@^1.5.73:
- version "1.5.128"
- resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.128.tgz#8ea537b369c32527b3cc47df7973bffe5d3c2980"
- integrity sha512-bo1A4HH/NS522Ws0QNFIzyPcyUUNV/yyy70Ho1xqfGYzPUme2F/xr4tlEOuM6/A538U1vDA7a4XfCd1CKRegKQ==
+electron-to-chromium@^1.5.173:
+ version "1.5.191"
+ resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.191.tgz#8ae49a471447b1ceaf1d4d183a9000082f52363c"
+ integrity sha512-xcwe9ELcuxYLUFqZZxL19Z6HVKcvNkIwhbHUz7L3us6u12yR+7uY89dSl570f/IqNthx8dAw3tojG7i4Ni4tDA==
emoji-regex@^8.0.0:
version "8.0.0"
@@ -3452,27 +4235,35 @@ emoji-regex@^9.2.2:
resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72"
integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==
-encodeurl@~1.0.2:
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59"
- integrity sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==
+enabled@2.0.x:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/enabled/-/enabled-2.0.0.tgz#f9dd92ec2d6f4bbc0d5d1e64e21d61cd4665e7c2"
+ integrity sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==
-encodeurl@~2.0.0:
+encodeurl@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-2.0.0.tgz#7b8ea898077d7e409d3ac45474ea38eaf0857a58"
integrity sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==
+encoding-sniffer@^0.2.1:
+ version "0.2.1"
+ resolved "https://registry.yarnpkg.com/encoding-sniffer/-/encoding-sniffer-0.2.1.tgz#396ec97ac22ce5a037ba44af1992ac9d46a7b819"
+ integrity sha512-5gvq20T6vfpekVtqrYQsSCFZ1wEg5+wW0/QaZMWkFr6BqD3NfKs0rLCx4rrVlSWJeZb5NBJgVLswK/w2MWU+Gw==
+ dependencies:
+ iconv-lite "^0.6.3"
+ whatwg-encoding "^3.1.1"
+
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==
+ version "1.4.5"
+ resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.5.tgz#7344d711dea40e0b74abc2ed49778743ccedb08c"
+ integrity sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==
dependencies:
once "^1.4.0"
enhanced-resolve@^5.14.1, enhanced-resolve@^5.18.1:
- version "5.18.1"
- resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.18.1.tgz#728ab082f8b7b6836de51f1637aab5d3b9568faf"
- integrity sha512-ZSW3ma5GkcQBIpwZTSRAI8N71Uuwgs93IezB7mf7R60tC8ZbJideoDNKjHn2O9KIlx6rkGTTEk1xUCK2E1Y2Yg==
+ version "5.18.2"
+ resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.18.2.tgz#7903c5b32ffd4b2143eeb4b92472bd68effd5464"
+ integrity sha512-6Jw4sE1maoRJo3q8MsSIn2onJFbLTOjY9hlx4DZXmOKvLRd1Ok2kXmAGXaafL2+ijsJZ1ClYbl/pmqr9+k4iUQ==
dependencies:
graceful-fs "^4.2.4"
tapable "^2.2.0"
@@ -3482,6 +4273,16 @@ entities@^4.2.0, entities@^4.5.0:
resolved "https://registry.yarnpkg.com/entities/-/entities-4.5.0.tgz#5d268ea5e7113ec74c4d033b79ea5a35a488fb48"
integrity sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==
+entities@^6.0.0:
+ version "6.0.1"
+ resolved "https://registry.yarnpkg.com/entities/-/entities-6.0.1.tgz#c28c34a43379ca7f61d074130b2f5f7020a30694"
+ integrity sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==
+
+env-paths@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/env-paths/-/env-paths-3.0.0.tgz#2f1e89c2f6dbd3408e1b1711dd82d62e317f58da"
+ integrity sha512-dtJUTepzMW3Lm/NPxRf3wP4642UWhjL2sQxc+ym2YMj1m/H2zDNQOlezafzkHwn6sMstjHTwG6iQQsctDW/b1A==
+
error-stack-parser-es@^1.0.5:
version "1.0.5"
resolved "https://registry.yarnpkg.com/error-stack-parser-es/-/error-stack-parser-es-1.0.5.tgz#e6a1655dd12f39bb3a85bf4c7088187d78740327"
@@ -3502,10 +4303,10 @@ es-errors@^1.3.0:
resolved "https://registry.yarnpkg.com/es-errors/-/es-errors-1.3.0.tgz#05f75a25dab98e4fb1dcd5e1472c0546d5057c8f"
integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==
-es-module-lexer@^1.5.3, es-module-lexer@^1.6.0:
- version "1.6.0"
- resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-1.6.0.tgz#da49f587fd9e68ee2404fe4e256c0c7d3a81be21"
- integrity sha512-qqnD1yMU6tk/jnaMosogGySTZP8YtUgAffA9nMN+E/rjxcfRQ6IEk7IiozUjgxKoFHBGjTLnrHB/YC45r/59EQ==
+es-module-lexer@^1.0.0, es-module-lexer@^1.7.0:
+ version "1.7.0"
+ resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-1.7.0.tgz#9159601561880a85f2734560a9099b2c31e5372a"
+ integrity sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==
es-object-atoms@^1.0.0, es-object-atoms@^1.1.1:
version "1.1.1"
@@ -3524,50 +4325,75 @@ es-set-tostringtag@^2.1.0:
has-tostringtag "^1.0.2"
hasown "^2.0.2"
-esbuild-register@3.6.0:
- version "3.6.0"
- resolved "https://registry.yarnpkg.com/esbuild-register/-/esbuild-register-3.6.0.tgz#cf270cfa677baebbc0010ac024b823cbf723a36d"
- integrity sha512-H2/S7Pm8a9CL1uhp9OvjwrBh5Pvx0H8qVOxNu8Wed9Y7qv56MPtq+GGM8RJpq6glYJn9Wspr8uw7l55uyinNeg==
- dependencies:
- debug "^4.3.4"
-
-"esbuild@>=0.12 <1", esbuild@^0.25.0, esbuild@^0.25.1, esbuild@^0.25.2:
- version "0.25.2"
- resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.25.2.tgz#55a1d9ebcb3aa2f95e8bba9e900c1a5061bc168b"
- integrity sha512-16854zccKPnC+toMywC+uKNeYSv+/eXkevRAfwRD/G9Cleq66m8XFIrigkbvauLLlCfDL45Q2cWegSg53gGBnQ==
+esbuild@0.25.5:
+ version "0.25.5"
+ resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.25.5.tgz#71075054993fdfae76c66586f9b9c1f8d7edd430"
+ integrity sha512-P8OtKZRv/5J5hhz0cUAdu/cLuPIKXpQl1R9pZtvmHWQvrAUVd0UNIPT4IB4W3rNOqVO0rlqHmCIbSwxh/c9yUQ==
optionalDependencies:
- "@esbuild/aix-ppc64" "0.25.2"
- "@esbuild/android-arm" "0.25.2"
- "@esbuild/android-arm64" "0.25.2"
- "@esbuild/android-x64" "0.25.2"
- "@esbuild/darwin-arm64" "0.25.2"
- "@esbuild/darwin-x64" "0.25.2"
- "@esbuild/freebsd-arm64" "0.25.2"
- "@esbuild/freebsd-x64" "0.25.2"
- "@esbuild/linux-arm" "0.25.2"
- "@esbuild/linux-arm64" "0.25.2"
- "@esbuild/linux-ia32" "0.25.2"
- "@esbuild/linux-loong64" "0.25.2"
- "@esbuild/linux-mips64el" "0.25.2"
- "@esbuild/linux-ppc64" "0.25.2"
- "@esbuild/linux-riscv64" "0.25.2"
- "@esbuild/linux-s390x" "0.25.2"
- "@esbuild/linux-x64" "0.25.2"
- "@esbuild/netbsd-arm64" "0.25.2"
- "@esbuild/netbsd-x64" "0.25.2"
- "@esbuild/openbsd-arm64" "0.25.2"
- "@esbuild/openbsd-x64" "0.25.2"
- "@esbuild/sunos-x64" "0.25.2"
- "@esbuild/win32-arm64" "0.25.2"
- "@esbuild/win32-ia32" "0.25.2"
- "@esbuild/win32-x64" "0.25.2"
+ "@esbuild/aix-ppc64" "0.25.5"
+ "@esbuild/android-arm" "0.25.5"
+ "@esbuild/android-arm64" "0.25.5"
+ "@esbuild/android-x64" "0.25.5"
+ "@esbuild/darwin-arm64" "0.25.5"
+ "@esbuild/darwin-x64" "0.25.5"
+ "@esbuild/freebsd-arm64" "0.25.5"
+ "@esbuild/freebsd-x64" "0.25.5"
+ "@esbuild/linux-arm" "0.25.5"
+ "@esbuild/linux-arm64" "0.25.5"
+ "@esbuild/linux-ia32" "0.25.5"
+ "@esbuild/linux-loong64" "0.25.5"
+ "@esbuild/linux-mips64el" "0.25.5"
+ "@esbuild/linux-ppc64" "0.25.5"
+ "@esbuild/linux-riscv64" "0.25.5"
+ "@esbuild/linux-s390x" "0.25.5"
+ "@esbuild/linux-x64" "0.25.5"
+ "@esbuild/netbsd-arm64" "0.25.5"
+ "@esbuild/netbsd-x64" "0.25.5"
+ "@esbuild/openbsd-arm64" "0.25.5"
+ "@esbuild/openbsd-x64" "0.25.5"
+ "@esbuild/sunos-x64" "0.25.5"
+ "@esbuild/win32-arm64" "0.25.5"
+ "@esbuild/win32-ia32" "0.25.5"
+ "@esbuild/win32-x64" "0.25.5"
+
+esbuild@^0.25.0, esbuild@^0.25.1, esbuild@^0.25.4, esbuild@^0.25.5, esbuild@^0.25.6:
+ version "0.25.8"
+ resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.25.8.tgz#482d42198b427c9c2f3a81b63d7663aecb1dda07"
+ integrity sha512-vVC0USHGtMi8+R4Kz8rt6JhEWLxsv9Rnu/lGYbPR8u47B+DCBksq9JarW0zOO7bs37hyOK1l2/oqtbciutL5+Q==
+ optionalDependencies:
+ "@esbuild/aix-ppc64" "0.25.8"
+ "@esbuild/android-arm" "0.25.8"
+ "@esbuild/android-arm64" "0.25.8"
+ "@esbuild/android-x64" "0.25.8"
+ "@esbuild/darwin-arm64" "0.25.8"
+ "@esbuild/darwin-x64" "0.25.8"
+ "@esbuild/freebsd-arm64" "0.25.8"
+ "@esbuild/freebsd-x64" "0.25.8"
+ "@esbuild/linux-arm" "0.25.8"
+ "@esbuild/linux-arm64" "0.25.8"
+ "@esbuild/linux-ia32" "0.25.8"
+ "@esbuild/linux-loong64" "0.25.8"
+ "@esbuild/linux-mips64el" "0.25.8"
+ "@esbuild/linux-ppc64" "0.25.8"
+ "@esbuild/linux-riscv64" "0.25.8"
+ "@esbuild/linux-s390x" "0.25.8"
+ "@esbuild/linux-x64" "0.25.8"
+ "@esbuild/netbsd-arm64" "0.25.8"
+ "@esbuild/netbsd-x64" "0.25.8"
+ "@esbuild/openbsd-arm64" "0.25.8"
+ "@esbuild/openbsd-x64" "0.25.8"
+ "@esbuild/openharmony-arm64" "0.25.8"
+ "@esbuild/sunos-x64" "0.25.8"
+ "@esbuild/win32-arm64" "0.25.8"
+ "@esbuild/win32-ia32" "0.25.8"
+ "@esbuild/win32-x64" "0.25.8"
escalade@^3.1.1, escalade@^3.2.0:
version "3.2.0"
resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.2.0.tgz#011a3f69856ba189dffa7dc8fcce99d2a87903e5"
integrity sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==
-escape-html@~1.0.3:
+escape-html@^1.0.3:
version "1.0.3"
resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988"
integrity sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==
@@ -3587,6 +4413,24 @@ escape-string-regexp@^5.0.0:
resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz#4683126b500b61762f2dbebace1806e8be31b1c8"
integrity sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==
+escodegen@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-2.1.0.tgz#ba93bbb7a43986d29d6041f99f5262da773e2e17"
+ integrity sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==
+ dependencies:
+ esprima "^4.0.1"
+ estraverse "^5.2.0"
+ esutils "^2.0.2"
+ optionalDependencies:
+ source-map "~0.6.1"
+
+eslint-compat-utils@^0.6.0:
+ version "0.6.5"
+ resolved "https://registry.yarnpkg.com/eslint-compat-utils/-/eslint-compat-utils-0.6.5.tgz#6b06350a1c947c4514cfa64a170a6bfdbadc7ec2"
+ integrity sha512-vAUHYzue4YAa2hNACjB8HvUQj5yehAZgiClyFVVom9cP8z5NSFq3PwB/TtJslN2zAMgRX6FCFCjYBbQh71g5RQ==
+ dependencies:
+ semver "^7.5.4"
+
eslint-config-flat-gitignore@^2.1.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/eslint-config-flat-gitignore/-/eslint-config-flat-gitignore-2.1.0.tgz#8b93caa703977f04dee11e4c3c8303432462921c"
@@ -3594,80 +4438,74 @@ eslint-config-flat-gitignore@^2.1.0:
dependencies:
"@eslint/compat" "^1.2.5"
-eslint-config-prettier@^10.1.5:
- version "10.1.5"
- resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-10.1.5.tgz#00c18d7225043b6fbce6a665697377998d453782"
- integrity sha512-zc1UmCpNltmVY34vuLRV61r1K27sWuX39E+uyUnY8xS2Bex88VV9cugG+UZbRSRGtGyFboj+D8JODyme1plMpw==
+eslint-config-prettier@^10.1.1:
+ version "10.1.8"
+ resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-10.1.8.tgz#15734ce4af8c2778cc32f0b01b37b0b5cd1ecb97"
+ integrity sha512-82GZUjRS0p/jganf6q1rEO25VSoHH0hKPCTrgillPjdI/3bgBhAE1QzHrHTizjpRvy6pGAvKjDJtk2pF9NDq8w==
-eslint-flat-config-utils@^2.0.1:
- version "2.0.1"
- resolved "https://registry.yarnpkg.com/eslint-flat-config-utils/-/eslint-flat-config-utils-2.0.1.tgz#a953109da31df91ab25cac39f67e90c6c50171d5"
- integrity sha512-brf0eAgQ6JlKj3bKfOTuuI7VcCZvi8ZCD1MMTVoEvS/d38j8cByZViLFALH/36+eqB17ukmfmKq3bWzGvizejA==
+eslint-flat-config-utils@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/eslint-flat-config-utils/-/eslint-flat-config-utils-2.1.0.tgz#ddb7f71493d33bd2459dadd3a79f81943910214b"
+ integrity sha512-6fjOJ9tS0k28ketkUcQ+kKptB4dBZY2VijMZ9rGn8Cwnn1SH0cZBoPXT8AHBFHxmHcLFQK9zbELDinZ2Mr1rng==
dependencies:
- pathe "^2.0.2"
+ pathe "^2.0.3"
-eslint-import-resolver-node@^0.3.9:
- 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==
+eslint-import-context@^0.1.9:
+ version "0.1.9"
+ resolved "https://registry.yarnpkg.com/eslint-import-context/-/eslint-import-context-0.1.9.tgz#967b0b2f0a90ef4b689125e088f790f0b7756dbe"
+ integrity sha512-K9Hb+yRaGAGUbwjhFNHvSmmkZs9+zbuoe3kFQ4V1wYjrepUFYM2dZAfNtjbbj3qsPfUfsA68Bx/ICWQMi+C8Eg==
dependencies:
- debug "^3.2.7"
- is-core-module "^2.13.0"
- resolve "^1.22.4"
+ get-tsconfig "^4.10.1"
+ stable-hash-x "^0.2.0"
eslint-merge-processors@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/eslint-merge-processors/-/eslint-merge-processors-2.0.0.tgz#f1e02bd863962fab7fd038c293979283e61b473c"
integrity sha512-sUuhSf3IrJdGooquEUB5TNpGNpBoQccbnaLHsb1XkBLUPPqCNivCpY05ZcpCOiV9uHwO2yxXEWVczVclzMxYlA==
-eslint-plugin-import-x@^4.9.4:
- version "4.10.2"
- resolved "https://registry.yarnpkg.com/eslint-plugin-import-x/-/eslint-plugin-import-x-4.10.2.tgz#41bee5d2c69776c79221dd09fa56bd2006ac31d4"
- integrity sha512-jO3Y6+zBUyTX5MVbbLSzoz6fe65t+WEBaXStRLM4EBhZWbuSwAH3cLwARtM0Yp4zRtZGp9sL2zzK7G9JkHR8LA==
+eslint-plugin-import-lite@^0.3.0:
+ version "0.3.0"
+ resolved "https://registry.yarnpkg.com/eslint-plugin-import-lite/-/eslint-plugin-import-lite-0.3.0.tgz#78fb6df41ed6e4ddfa40706ebe7a35563d4173d0"
+ integrity sha512-dkNBAL6jcoCsXZsQ/Tt2yXmMDoNt5NaBh/U7yvccjiK8cai6Ay+MK77bMykmqQA2bTF6lngaLCDij6MTO3KkvA==
dependencies:
- "@pkgr/core" "^0.2.1"
- "@types/doctrine" "^0.0.9"
- "@typescript-eslint/utils" "^8.29.0"
- debug "^4.4.0"
- doctrine "^3.0.0"
- eslint-import-resolver-node "^0.3.9"
- get-tsconfig "^4.10.0"
+ "@eslint-community/eslint-utils" "^4.7.0"
+ "@typescript-eslint/types" "^8.34.0"
+
+eslint-plugin-import-x@^4.16.1:
+ version "4.16.1"
+ resolved "https://registry.yarnpkg.com/eslint-plugin-import-x/-/eslint-plugin-import-x-4.16.1.tgz#a96ee1ad5ba6816f9a5573a9617935011a24c4df"
+ integrity sha512-vPZZsiOKaBAIATpFE2uMI4w5IRwdv/FpQ+qZZMR4E+PeOcM4OeoEbqxRMnywdxP19TyB/3h6QBB0EWon7letSQ==
+ dependencies:
+ "@typescript-eslint/types" "^8.35.0"
+ comment-parser "^1.4.1"
+ debug "^4.4.1"
+ eslint-import-context "^0.1.9"
is-glob "^4.0.3"
minimatch "^9.0.3 || ^10.0.1"
- semver "^7.7.1"
- stable-hash "^0.0.5"
- tslib "^2.8.1"
- unrs-resolver "^1.4.1"
+ semver "^7.7.2"
+ stable-hash-x "^0.2.0"
+ unrs-resolver "^1.9.2"
-eslint-plugin-jsdoc@^50.6.9:
- version "50.6.9"
- resolved "https://registry.yarnpkg.com/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-50.6.9.tgz#b4afc06110958b9c525456b6c4348bf14e21c298"
- integrity sha512-7/nHu3FWD4QRG8tCVqcv+BfFtctUtEDWc29oeDXB4bwmDM2/r1ndl14AG/2DUntdqH7qmpvdemJKwb3R97/QEw==
+eslint-plugin-jsdoc@^51.4.1:
+ version "51.4.1"
+ resolved "https://registry.yarnpkg.com/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-51.4.1.tgz#a512460da6ba328ac3be0c3e7b2aaa4633175625"
+ integrity sha512-y4CA9OkachG8v5nAtrwvcvjIbdcKgSyS6U//IfQr4FZFFyeBFwZFf/tfSsMr46mWDJgidZjBTqoCRlXywfFBMg==
dependencies:
- "@es-joy/jsdoccomment" "~0.49.0"
+ "@es-joy/jsdoccomment" "~0.52.0"
are-docs-informative "^0.0.2"
comment-parser "1.4.1"
- debug "^4.3.6"
+ debug "^4.4.1"
escape-string-regexp "^4.0.0"
- espree "^10.1.0"
+ espree "^10.4.0"
esquery "^1.6.0"
- parse-imports "^2.1.1"
- semver "^7.6.3"
+ parse-imports-exports "^0.2.4"
+ semver "^7.7.2"
spdx-expression-parse "^4.0.0"
- synckit "^0.9.1"
-eslint-plugin-prettier@^5.4.0:
- version "5.4.0"
- resolved "https://registry.yarnpkg.com/eslint-plugin-prettier/-/eslint-plugin-prettier-5.4.0.tgz#54d4748904e58eaf1ffe26c4bffa4986ca7f952b"
- integrity sha512-BvQOvUhkVQM1i63iMETK9Hjud9QhqBnbtT1Zc642p9ynzBuCe5pybkOnvqZIBypXmMlsGcnU4HZ8sCTPfpAexA==
- dependencies:
- prettier-linter-helpers "^1.0.0"
- synckit "^0.11.0"
-
-eslint-plugin-regexp@^2.7.0:
- version "2.7.0"
- resolved "https://registry.yarnpkg.com/eslint-plugin-regexp/-/eslint-plugin-regexp-2.7.0.tgz#84fa2d2b122e343f596cfb83ed8a5517a1dfef2a"
- integrity sha512-U8oZI77SBtH8U3ulZ05iu0qEzIizyEDXd+BWHvyVxTOjGwcDcvy/kEpgFG4DYca2ByRLiVPFZ2GeH7j1pdvZTA==
+eslint-plugin-regexp@^2.9.0:
+ version "2.9.0"
+ resolved "https://registry.yarnpkg.com/eslint-plugin-regexp/-/eslint-plugin-regexp-2.9.0.tgz#0783be374e68c7a7af98543334fd4f8572949e3f"
+ integrity sha512-9WqJMnOq8VlE/cK+YAo9C9YHhkOtcEtEk9d12a+H7OSZFwlpI6stiHmYPGa2VE0QhTzodJyhlyprUaXDZLgHBw==
dependencies:
"@eslint-community/eslint-utils" "^4.2.0"
"@eslint-community/regexpp" "^4.11.0"
@@ -3677,33 +4515,34 @@ eslint-plugin-regexp@^2.7.0:
regexp-ast-analysis "^0.7.1"
scslre "^0.3.0"
-eslint-plugin-unicorn@^58.0.0:
- version "58.0.0"
- resolved "https://registry.yarnpkg.com/eslint-plugin-unicorn/-/eslint-plugin-unicorn-58.0.0.tgz#38c12a59537312eeb9cb1cd747afe038db4bda41"
- integrity sha512-fc3iaxCm9chBWOHPVjn+Czb/wHS0D2Mko7wkOdobqo9R2bbFObc4LyZaLTNy0mhZOP84nKkLhTUQxlLOZ7EjKw==
+eslint-plugin-unicorn@^60.0.0:
+ version "60.0.0"
+ resolved "https://registry.yarnpkg.com/eslint-plugin-unicorn/-/eslint-plugin-unicorn-60.0.0.tgz#68f712bcb17e94bd176cce7312647ba1d1409c3c"
+ integrity sha512-QUzTefvP8stfSXsqKQ+vBQSEsXIlAiCduS/V1Em+FKgL9c21U/IIm20/e3MFy1jyCf14tHAhqC1sX8OTy6VUCg==
dependencies:
- "@babel/helper-validator-identifier" "^7.25.9"
- "@eslint-community/eslint-utils" "^4.5.1"
- "@eslint/plugin-kit" "^0.2.7"
- ci-info "^4.2.0"
+ "@babel/helper-validator-identifier" "^7.27.1"
+ "@eslint-community/eslint-utils" "^4.7.0"
+ "@eslint/plugin-kit" "^0.3.3"
+ change-case "^5.4.4"
+ ci-info "^4.3.0"
clean-regexp "^1.0.0"
- core-js-compat "^3.41.0"
+ core-js-compat "^3.44.0"
esquery "^1.6.0"
- globals "^16.0.0"
+ find-up-simple "^1.0.1"
+ globals "^16.3.0"
indent-string "^5.0.0"
is-builtin-module "^5.0.0"
jsesc "^3.1.0"
pluralize "^8.0.0"
- read-package-up "^11.0.0"
regexp-tree "^0.1.27"
regjsparser "^0.12.0"
- semver "^7.7.1"
+ semver "^7.7.2"
strip-indent "^4.0.0"
-eslint-plugin-vue@^10.0.0:
- version "10.0.0"
- resolved "https://registry.yarnpkg.com/eslint-plugin-vue/-/eslint-plugin-vue-10.0.0.tgz#42707bfb8c4490b0b1a4be6f11a416fb16c3d11c"
- integrity sha512-XKckedtajqwmaX6u1VnECmZ6xJt+YvlmMzBPZd+/sI3ub2lpYZyFnsyWo7c3nMOQKJQudeyk1lw/JxdgeKT64w==
+eslint-plugin-vue@^10.3.0:
+ version "10.3.0"
+ resolved "https://registry.yarnpkg.com/eslint-plugin-vue/-/eslint-plugin-vue-10.3.0.tgz#d8fb96d06bc71829177fe81590489117b9540c17"
+ integrity sha512-A0u9snqjCfYaPnqqOaH6MBLVWDUIN4trXn8J3x67uDcXvR7X6Ut8p16N+nYhMCQ9Y7edg2BIRGzfyZsY0IdqoQ==
dependencies:
"@eslint-community/eslint-utils" "^4.4.0"
natural-compare "^1.4.0"
@@ -3717,45 +4556,45 @@ eslint-processor-vue-blocks@^2.0.0:
resolved "https://registry.yarnpkg.com/eslint-processor-vue-blocks/-/eslint-processor-vue-blocks-2.0.0.tgz#b06a2e2bdefda75792e9fc9f00a9de305e657472"
integrity sha512-u4W0CJwGoWY3bjXAuFpc/b6eK3NQEI8MoeW7ritKj3G3z/WtHrKjkqf+wk8mPEy5rlMGS+k6AZYOw2XBoN/02Q==
-eslint-scope@^8.2.0, eslint-scope@^8.3.0:
- version "8.3.0"
- resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-8.3.0.tgz#10cd3a918ffdd722f5f3f7b5b83db9b23c87340d"
- integrity sha512-pUNxi75F8MJ/GdeKtVLSbYg4ZI34J6C0C7sbL4YOp2exGwen7ZsuBqKzUhXd0qMQ362yET3z+uPwKeg/0C2XCQ==
+eslint-scope@^8.2.0, eslint-scope@^8.4.0:
+ version "8.4.0"
+ resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-8.4.0.tgz#88e646a207fad61436ffa39eb505147200655c82"
+ integrity sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==
dependencies:
esrecurse "^4.3.0"
estraverse "^5.2.0"
-eslint-typegen@^2.1.0:
- version "2.1.0"
- resolved "https://registry.yarnpkg.com/eslint-typegen/-/eslint-typegen-2.1.0.tgz#d06e64b2f3a5f158586d94b9477f7c4368552ce3"
- integrity sha512-tY9TTx07InS+mQ/+zYnCMHkdsS00GPaQy84PwHiQd2XWwXIptRExKcz1kI8eG1CGg1sBs9mONwSfbGMbvI4fNA==
+eslint-typegen@^2.2.1:
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/eslint-typegen/-/eslint-typegen-2.3.0.tgz#abc45b3d34bab723a0b8af5384aeacc5b92ec1c9"
+ integrity sha512-azYgAvhlz1AyTpeLfVSKcrNJInuIsRrcUrOcHmEl8T9oMKesePVUPrF8gRgE6azV8CAlFzxJDTyaXAAbA/BYiA==
dependencies:
- json-schema-to-typescript-lite "^14.1.0"
+ json-schema-to-typescript-lite "^15.0.0"
ohash "^2.0.11"
-eslint-visitor-keys@^3.4.3:
+eslint-visitor-keys@^3.0.0, eslint-visitor-keys@^3.4.1, eslint-visitor-keys@^3.4.3:
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-visitor-keys@^4.2.0:
- version "4.2.0"
- resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz#687bacb2af884fcdda8a6e7d65c606f46a14cd45"
- integrity sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==
+eslint-visitor-keys@^4.2.0, eslint-visitor-keys@^4.2.1:
+ version "4.2.1"
+ resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz#4cfea60fe7dd0ad8e816e1ed026c1d5251b512c1"
+ integrity sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==
eslint@^9.24.0:
- version "9.24.0"
- resolved "https://registry.yarnpkg.com/eslint/-/eslint-9.24.0.tgz#9a7f2e6cb2de81c405ab244b02f4584c79dc6bee"
- integrity sha512-eh/jxIEJyZrvbWRe4XuVclLPDYSYYYgLy5zXGGxD6j8zjSAxFEzI2fL/8xNq6O2yKqVt+eF2YhV+hxjV6UKXwQ==
+ version "9.31.0"
+ resolved "https://registry.yarnpkg.com/eslint/-/eslint-9.31.0.tgz#9a488e6da75bbe05785cd62e43c5ea99356d21ba"
+ integrity sha512-QldCVh/ztyKJJZLr4jXNUByx3gR+TDYZCRXEktiZoUR3PGy4qCmSbkxcIle8GEwGpb5JBZazlaJ/CxLidXdEbQ==
dependencies:
"@eslint-community/eslint-utils" "^4.2.0"
"@eslint-community/regexpp" "^4.12.1"
- "@eslint/config-array" "^0.20.0"
- "@eslint/config-helpers" "^0.2.0"
- "@eslint/core" "^0.12.0"
+ "@eslint/config-array" "^0.21.0"
+ "@eslint/config-helpers" "^0.3.0"
+ "@eslint/core" "^0.15.0"
"@eslint/eslintrc" "^3.3.1"
- "@eslint/js" "9.24.0"
- "@eslint/plugin-kit" "^0.2.7"
+ "@eslint/js" "9.31.0"
+ "@eslint/plugin-kit" "^0.3.1"
"@humanfs/node" "^0.16.6"
"@humanwhocodes/module-importer" "^1.0.1"
"@humanwhocodes/retry" "^0.4.2"
@@ -3766,9 +4605,9 @@ eslint@^9.24.0:
cross-spawn "^7.0.6"
debug "^4.3.2"
escape-string-regexp "^4.0.0"
- eslint-scope "^8.3.0"
- eslint-visitor-keys "^4.2.0"
- espree "^10.3.0"
+ eslint-scope "^8.4.0"
+ eslint-visitor-keys "^4.2.1"
+ espree "^10.4.0"
esquery "^1.5.0"
esutils "^2.0.2"
fast-deep-equal "^3.1.3"
@@ -3784,14 +4623,28 @@ eslint@^9.24.0:
natural-compare "^1.4.0"
optionator "^0.9.3"
-espree@^10.0.1, espree@^10.1.0, espree@^10.3.0:
- version "10.3.0"
- resolved "https://registry.yarnpkg.com/espree/-/espree-10.3.0.tgz#29267cf5b0cb98735b65e64ba07e0ed49d1eed8a"
- integrity sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==
+espree@^10.0.1, espree@^10.3.0, espree@^10.4.0:
+ version "10.4.0"
+ resolved "https://registry.yarnpkg.com/espree/-/espree-10.4.0.tgz#d54f4949d4629005a1fa168d937c3ff1f7e2a837"
+ integrity sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==
dependencies:
- acorn "^8.14.0"
+ acorn "^8.15.0"
acorn-jsx "^5.3.2"
- eslint-visitor-keys "^4.2.0"
+ eslint-visitor-keys "^4.2.1"
+
+espree@^9.0.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.9.0"
+ acorn-jsx "^5.3.2"
+ eslint-visitor-keys "^3.4.1"
+
+esprima@^4.0.1:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71"
+ integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==
esquery@^1.5.0, esquery@^1.6.0:
version "1.6.0"
@@ -3829,7 +4682,7 @@ esutils@^2.0.2:
resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64"
integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==
-etag@^1.8.1, etag@~1.8.1:
+etag@^1.8.1:
version "1.8.1"
resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887"
integrity sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==
@@ -3844,7 +4697,7 @@ events@^3.3.0:
resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400"
integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==
-execa@^8.0.1:
+execa@^8.0.0, execa@^8.0.1:
version "8.0.1"
resolved "https://registry.yarnpkg.com/execa/-/execa-8.0.1.tgz#51f6a5943b580f963c3ca9c6321796db8cc39b8c"
integrity sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==
@@ -3859,33 +4712,15 @@ execa@^8.0.1:
signal-exit "^4.1.0"
strip-final-newline "^3.0.0"
-execa@^9.5.3:
- version "9.5.3"
- resolved "https://registry.yarnpkg.com/execa/-/execa-9.5.3.tgz#aa9b6e92ea6692b88a240efc260ca30489b33e2a"
- integrity sha512-QFNnTvU3UjgWFy8Ef9iDHvIdcgZ344ebkwYx4/KLbR+CKQA4xBaHzv+iRpp86QfMHP8faFQLh8iOc57215y4Rg==
- dependencies:
- "@sindresorhus/merge-streams" "^4.0.0"
- cross-spawn "^7.0.3"
- figures "^6.1.0"
- get-stream "^9.0.0"
- human-signals "^8.0.0"
- is-plain-obj "^4.1.0"
- is-stream "^4.0.1"
- npm-run-path "^6.0.0"
- pretty-ms "^9.0.0"
- signal-exit "^4.1.0"
- strip-final-newline "^4.0.0"
- yoctocolors "^2.0.0"
-
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==
-exsolve@^1.0.0, exsolve@^1.0.1, exsolve@^1.0.4:
- version "1.0.4"
- resolved "https://registry.yarnpkg.com/exsolve/-/exsolve-1.0.4.tgz#7de5c75af82ecd15998328fbf5f2295883be3a39"
- integrity sha512-xsZH6PXaER4XoV+NiT7JHp1bJodJVT+cxeSH1G0f0tlT0lJqYuHUP3bUx2HtfTDvOagMINYp8rsqusxud3RXhw==
+exsolve@^1.0.5, exsolve@^1.0.7:
+ version "1.0.7"
+ resolved "https://registry.yarnpkg.com/exsolve/-/exsolve-1.0.7.tgz#3b74e4c7ca5c5f9a19c3626ca857309fa99f9e9e"
+ integrity sha512-VO5fQUzZtI6C+vx4w/4BWJpg3s/5l+6pRQEHzFRM8WFi4XffSP1Z+4qi7GbjWbvRQEbdIco5mIMq+zX4rPuLrw==
externality@^1.0.2:
version "1.0.2"
@@ -3897,16 +4732,27 @@ externality@^1.0.2:
pathe "^1.1.1"
ufo "^1.1.2"
+extract-zip@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/extract-zip/-/extract-zip-2.0.1.tgz#663dca56fe46df890d5f131ef4a06d22bb8ba13a"
+ integrity sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==
+ dependencies:
+ debug "^4.1.1"
+ get-stream "^5.1.0"
+ yauzl "^2.10.0"
+ optionalDependencies:
+ "@types/yauzl" "^2.9.1"
+
+fast-copy@^3.0.2:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/fast-copy/-/fast-copy-3.0.2.tgz#59c68f59ccbcac82050ba992e0d5c389097c9d35"
+ integrity sha512-dl0O9Vhju8IrcLndv2eU4ldt1ftXMqqfgN4H1cpmGV7P6jeB9FwpN9a2c8DPGE1Ys88rNUJVYDHq73CGAGOPfQ==
+
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-diff@^1.1.2:
- version "1.3.0"
- resolved "https://registry.yarnpkg.com/fast-diff/-/fast-diff-1.3.0.tgz#ece407fa550a64d638536cd727e129c61616e0f0"
- integrity sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==
-
fast-fifo@^1.2.0, fast-fifo@^1.3.2:
version "1.3.2"
resolved "https://registry.yarnpkg.com/fast-fifo/-/fast-fifo-1.3.2.tgz#286e31de96eb96d38a97899815740ba2a4f3640c"
@@ -3919,7 +4765,7 @@ fast-fuzzy@^1.12.0:
dependencies:
graphemesplit "^2.4.1"
-fast-glob@^3.3.2, fast-glob@^3.3.3:
+fast-glob@^3.2.12, fast-glob@^3.3.2, fast-glob@^3.3.3:
version "3.3.3"
resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.3.tgz#d06d585ce8dba90a16b0505c543c3ccfb3aeb818"
integrity sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==
@@ -3940,10 +4786,20 @@ fast-levenshtein@^2.0.6:
resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917"
integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==
-fast-npm-meta@^0.3.1:
- version "0.3.1"
- resolved "https://registry.yarnpkg.com/fast-npm-meta/-/fast-npm-meta-0.3.1.tgz#26ee0fcecda0cce2d76e0d2ffe611317c3d64338"
- integrity sha512-W9gVhqRyz2O3j20I0nFmYEyaMC/046oaMRxxAQ0w6noakfbhpLmlIXmnnqSOmVVuJZ6x5hOPVwlv7PocuawZsw==
+fast-npm-meta@^0.4.4:
+ version "0.4.4"
+ resolved "https://registry.yarnpkg.com/fast-npm-meta/-/fast-npm-meta-0.4.4.tgz#c62dc674a8d337189ce0ea1f3a1137e3d9144ea8"
+ integrity sha512-cq8EVW3jpX1U3dO1AYanz2BJ6n9ITQgCwE1xjNwI5jO2a9erE369OZNO8Wt/Wbw8YHhCD/dimH9BxRsY+6DinA==
+
+fast-redact@^3.1.1:
+ version "3.5.0"
+ resolved "https://registry.yarnpkg.com/fast-redact/-/fast-redact-3.5.0.tgz#e9ea02f7e57d0cd8438180083e93077e496285e4"
+ integrity sha512-dwsoQlS7h9hMeYUq1W++23NDcBLV4KqONnITDV9DjfS3q1SgDGVrBdvvTLUotWtPSD7asWDV9/CmsZPy8Hf70A==
+
+fast-safe-stringify@^2.1.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz#c406a83b6e70d9e35ce3b30a81141df30aeba884"
+ integrity sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==
fastq@^1.15.0, fastq@^1.6.0:
version "1.19.1"
@@ -3952,17 +4808,30 @@ fastq@^1.15.0, fastq@^1.6.0:
dependencies:
reusify "^1.0.4"
-fdir@^6.2.0, fdir@^6.4.3:
- version "6.4.3"
- resolved "https://registry.yarnpkg.com/fdir/-/fdir-6.4.3.tgz#011cdacf837eca9b811c89dbb902df714273db72"
- integrity sha512-PMXmW2y1hDDfTSRc9gaXIuCCRpuoz3Kaz8cUelp3smouvfT632ozg2vrT6lJsHKKOF59YLbOGfAWGUcKEfRMQw==
-
-figures@^6.1.0:
- version "6.1.0"
- resolved "https://registry.yarnpkg.com/figures/-/figures-6.1.0.tgz#935479f51865fa7479f6fa94fc6fc7ac14e62c4a"
- integrity sha512-d+l3qxjSesT4V7v2fh+QnmFnUWv9lSpjarhShNTgBOfA0ttejbQUAlHLitbjkoRiDulW0OPoQPYIGhIC8ohejg==
+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:
- is-unicode-supported "^2.0.0"
+ pend "~1.2.0"
+
+fdir@^6.2.0, fdir@^6.4.4, fdir@^6.4.6:
+ version "6.4.6"
+ resolved "https://registry.yarnpkg.com/fdir/-/fdir-6.4.6.tgz#2b268c0232697063111bbf3f64810a2a741ba281"
+ integrity sha512-hiFoqpyZcfNm1yc4u8oWCf9A2c4D3QjCrks3zmoVKVxpQRzmPNar1hUJcBG2RQHvEVGDN+Jm81ZheVLAQMK6+w==
+
+fecha@^4.2.0:
+ version "4.2.3"
+ resolved "https://registry.yarnpkg.com/fecha/-/fecha-4.2.3.tgz#4d9ccdbc61e8629b259fdca67e65891448d569fd"
+ integrity sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==
+
+fetch-blob@^3.1.2, fetch-blob@^3.1.4:
+ version "3.2.0"
+ resolved "https://registry.yarnpkg.com/fetch-blob/-/fetch-blob-3.2.0.tgz#f09b8d4bbd45adc6f0c20b7e787e793e309dcce9"
+ integrity sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==
+ dependencies:
+ node-domexception "^1.0.0"
+ web-streams-polyfill "^3.0.3"
file-entry-cache@^8.0.0:
version "8.0.0"
@@ -3972,9 +4841,9 @@ file-entry-cache@^8.0.0:
flat-cache "^4.0.0"
file-type-mime@^0.4.3:
- version "0.4.6"
- resolved "https://registry.yarnpkg.com/file-type-mime/-/file-type-mime-0.4.6.tgz#890c548c9c10320ee23c4b59d1feb9a0f415f19c"
- integrity sha512-5jlSZixW0z7Avy9DsORN6U8bFs6l0G3jnLxp4CcDNo7Z3AlXAR9ArUVqkv/DlhTHQo8kBbRCWGtULdTejFEf1w==
+ version "0.4.7"
+ resolved "https://registry.yarnpkg.com/file-type-mime/-/file-type-mime-0.4.7.tgz#9ce43e2630b3f5623f765220d6a48c2633d38c1d"
+ integrity sha512-qrewzVfFZo8Z9jbrEQMeUeBuqhoWxp5pWOJ6X3U4MrNVu3fKVe9y55U8uMstBFN/9PLYxvf+nW4bqGBul5FNBg==
file-type@^18.2.0:
version "18.7.0"
@@ -3997,11 +4866,25 @@ fill-range@^7.1.1:
dependencies:
to-regex-range "^5.0.1"
-find-up-simple@^1.0.0:
+filter-obj@^6.0.0:
+ version "6.1.0"
+ resolved "https://registry.yarnpkg.com/filter-obj/-/filter-obj-6.1.0.tgz#58725ceed8f0de54b432d74b6a3eb149453d7ed0"
+ integrity sha512-xdMtCAODmPloU9qtmPcdBV9Kd27NtMse+4ayThxqIHUES5Z2S6bGpap5PpdmNM56ub7y3i1eyr+vJJIIgWGKmA==
+
+find-up-simple@^1.0.0, find-up-simple@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/find-up-simple/-/find-up-simple-1.0.1.tgz#18fb90ad49e45252c4d7fca56baade04fa3fca1e"
integrity sha512-afd4O7zpqHeRyg4PfDQsXmlDe2PfdHtJt6Akt8jOWaApLOZk5JXs6VMR29lz03pRe9mpykrRCYIYxaJYcfpncQ==
+find-up@7.0.0, find-up@^7.0.0:
+ version "7.0.0"
+ resolved "https://registry.yarnpkg.com/find-up/-/find-up-7.0.0.tgz#e8dec1455f74f78d888ad65bf7ca13dd2b4e66fb"
+ integrity sha512-YyZM99iHrqLKjmt4LJDj58KI+fYyufRLBSYcqycxf//KpBk9FoewoGX0450m9nB44qrZnovzC2oeP5hUibxc/g==
+ dependencies:
+ locate-path "^7.2.0"
+ path-exists "^5.0.0"
+ unicorn-magic "^0.1.0"
+
find-up@^5.0.0:
version "5.0.0"
resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc"
@@ -4010,15 +4893,6 @@ find-up@^5.0.0:
locate-path "^6.0.0"
path-exists "^4.0.0"
-find-up@^7.0.0:
- version "7.0.0"
- resolved "https://registry.yarnpkg.com/find-up/-/find-up-7.0.0.tgz#e8dec1455f74f78d888ad65bf7ca13dd2b4e66fb"
- integrity sha512-YyZM99iHrqLKjmt4LJDj58KI+fYyufRLBSYcqycxf//KpBk9FoewoGX0450m9nB44qrZnovzC2oeP5hUibxc/g==
- dependencies:
- locate-path "^7.2.0"
- path-exists "^5.0.0"
- unicorn-magic "^0.1.0"
-
flat-cache@^4.0.0:
version "4.0.1"
resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-4.0.1.tgz#0ece39fcb14ee012f4b0410bd33dd9c1f011127c"
@@ -4032,23 +4906,29 @@ flatted@^3.2.9:
resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.3.3.tgz#67c8fad95454a7c7abebf74bb78ee74a44023358"
integrity sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==
+fn.name@1.x.x:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/fn.name/-/fn.name-1.1.0.tgz#26cad8017967aea8731bc42961d04a3d5988accc"
+ integrity sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==
+
follow-redirects@^1.15.6:
version "1.15.9"
resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.9.tgz#a604fa10e443bf98ca94228d9eebcc2e8a2c8ee1"
integrity sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==
-fontaine@^0.5.0:
- version "0.5.0"
- resolved "https://registry.yarnpkg.com/fontaine/-/fontaine-0.5.0.tgz#0b01e6ef841da0eb6077430813812c2a22fc1987"
- integrity sha512-vPDSWKhVAfTx4hRKT777+N6Szh2pAosAuzLpbppZ6O3UdD/1m6OlHjNcC3vIbgkRTIcLjzySLHXzPeLO2rE8cA==
+fontaine@^0.6.0:
+ version "0.6.0"
+ resolved "https://registry.yarnpkg.com/fontaine/-/fontaine-0.6.0.tgz#ce90d22119935f841390b5d8d9795d9dd0e749bf"
+ integrity sha512-cfKqzB62GmztJhwJ0YXtzNsmpqKAcFzTqsakJ//5COTzbou90LU7So18U+4D8z+lDXr4uztaAUZBonSoPDcj1w==
dependencies:
- "@capsizecss/metrics" "^2.1.1"
- "@capsizecss/unpack" "^2.0.1"
- magic-regexp "^0.8.0"
- magic-string "^0.30.8"
- pathe "^1.1.2"
- ufo "^1.4.0"
- unplugin "^1.8.3"
+ "@capsizecss/metrics" "^3.5.0"
+ "@capsizecss/unpack" "^2.4.0"
+ css-tree "^3.1.0"
+ magic-regexp "^0.10.0"
+ magic-string "^0.30.17"
+ pathe "^2.0.3"
+ ufo "^1.6.1"
+ unplugin "^2.3.2"
fontkit@^2.0.2:
version "2.0.4"
@@ -4073,25 +4953,33 @@ foreground-child@^3.1.0:
cross-spawn "^7.0.6"
signal-exit "^4.0.1"
-form-data@^4.0.0:
- version "4.0.2"
- resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.2.tgz#35cabbdd30c3ce73deb2c42d3c8d3ed9ca51794c"
- integrity sha512-hGfm/slu0ZabnNt4oaRZ6uREyfCj6P4fT/n6A1rGV+Z0VdGXjfOhVUpkn6qVQONHGIFwmveGXyDs75+nr6FM8w==
+form-data@^4.0.4:
+ version "4.0.4"
+ resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.4.tgz#784cdcce0669a9d68e94d11ac4eea98088edd2c4"
+ integrity sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==
dependencies:
asynckit "^0.4.0"
combined-stream "^1.0.8"
es-set-tostringtag "^2.1.0"
+ hasown "^2.0.2"
mime-types "^2.1.12"
+formdata-polyfill@^4.0.10:
+ version "4.0.10"
+ resolved "https://registry.yarnpkg.com/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz#24807c31c9d402e002ab3d8c720144ceb8848423"
+ integrity sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==
+ dependencies:
+ fetch-blob "^3.1.2"
+
fraction.js@^4.3.7:
version "4.3.7"
resolved "https://registry.yarnpkg.com/fraction.js/-/fraction.js-4.3.7.tgz#06ca0085157e42fda7f9e726e79fefc4068840f7"
integrity sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==
-fresh@0.5.2:
- version "0.5.2"
- resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7"
- integrity sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==
+fresh@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/fresh/-/fresh-2.0.0.tgz#8dd7df6a1b3a1b3a5cf186c05a5dd267622635a4"
+ integrity sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==
fs-constants@^1.0.0:
version "1.0.0"
@@ -4107,7 +4995,16 @@ fs-extra@^11.3.0:
jsonfile "^6.0.1"
universalify "^2.0.0"
-fsevents@2.3.3, fsevents@~2.3.2, fsevents@~2.3.3:
+fs-extra@^8.0.1:
+ version "8.1.0"
+ resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-8.1.0.tgz#49d43c45a88cd9677668cb7be1b46efdb8d2e1c0"
+ integrity sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==
+ dependencies:
+ graceful-fs "^4.2.0"
+ jsonfile "^4.0.0"
+ universalify "^0.1.0"
+
+fsevents@~2.3.2, fsevents@~2.3.3:
version "2.3.3"
resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6"
integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==
@@ -4127,12 +5024,20 @@ gensync@^1.0.0-beta.2:
resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0"
integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==
+get-amd-module-type@^6.0.1:
+ version "6.0.1"
+ resolved "https://registry.yarnpkg.com/get-amd-module-type/-/get-amd-module-type-6.0.1.tgz#191f479ae8706c246b52bf402fbe1bb0965d9f1e"
+ integrity sha512-MtjsmYiCXcYDDrGqtNbeIYdAl85n+5mSv2r3FbzER/YV3ZILw4HNNIw34HuV5pyl0jzs6GFYU1VHVEefhgcNHQ==
+ dependencies:
+ ast-module-types "^6.0.1"
+ node-source-walk "^7.0.1"
+
get-caller-file@^2.0.5:
version "2.0.5"
resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e"
integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==
-get-intrinsic@^1.2.6:
+get-intrinsic@^1.2.5, get-intrinsic@^1.2.6, get-intrinsic@^1.3.0:
version "1.3.0"
resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.3.0.tgz#743f0e3b6964a93a5491ed1bffaae054d7f98d01"
integrity sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==
@@ -4148,10 +5053,10 @@ get-intrinsic@^1.2.6:
hasown "^2.0.2"
math-intrinsics "^1.1.0"
-get-port-please@^3.1.2:
- version "3.1.2"
- resolved "https://registry.yarnpkg.com/get-port-please/-/get-port-please-3.1.2.tgz#502795e56217128e4183025c89a48c71652f4e49"
- integrity sha512-Gxc29eLs1fbn6LQ4jSU4vXjlwyZhF5HsGuMAa7gqBP4Rw4yxxltyDUuF5MBclFzDTXO+ACchGQoeela4DSfzdQ==
+get-port-please@^3.1.2, get-port-please@^3.2.0:
+ version "3.2.0"
+ resolved "https://registry.yarnpkg.com/get-port-please/-/get-port-please-3.2.0.tgz#0ce3cee194c448ac640ec39dc357a500f5d7d2bb"
+ integrity sha512-I9QVvBw5U/hw3RmWpYKRumUeaDgxTPd401x364rLmWBJcOQ753eov1eTgzDqRG9bqFIfDc7gfzcQEWrUri3o1A==
get-proto@^1.0.1:
version "1.0.1"
@@ -4161,23 +5066,22 @@ get-proto@^1.0.1:
dunder-proto "^1.0.1"
es-object-atoms "^1.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@^8.0.1:
version "8.0.1"
resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-8.0.1.tgz#def9dfd71742cd7754a7761ed43749a27d02eca2"
integrity sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==
-get-stream@^9.0.0:
- version "9.0.1"
- resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-9.0.1.tgz#95157d21df8eb90d1647102b63039b1df60ebd27"
- integrity sha512-kVCxPF3vQM/N0B1PmoqVUqgHP+EeVjmZSQn+1oCRPxd2P21P2F19lIgbR3HBosbB1PUhOAoctJnfEn2GbN2eZA==
- dependencies:
- "@sec-ant/readable-stream" "^0.4.1"
- is-stream "^4.0.1"
-
-get-tsconfig@^4.10.0:
- version "4.10.0"
- resolved "https://registry.yarnpkg.com/get-tsconfig/-/get-tsconfig-4.10.0.tgz#403a682b373a823612475a4c2928c7326fc0f6bb"
- integrity sha512-kGzZ3LWWQcGIAmg6iWvXn0ei6WDtV26wzHRMwDSzmAbcXrTEXxHy6IehI6/4eT6VRKyMP1eF1VqwrVUmE/LR7A==
+get-tsconfig@^4.10.1:
+ version "4.10.1"
+ resolved "https://registry.yarnpkg.com/get-tsconfig/-/get-tsconfig-4.10.1.tgz#d34c1c01f47d65a606c37aa7a177bc3e56ab4b2e"
+ integrity sha512-auHyJ4AgMz7vgS8Hp3N6HXSmlMdUyhSUrfBF16w153rxtLIEOE+HGqaBppczZvnHLqQJfiHotCYpNhl0lUROFQ==
dependencies:
resolve-pkg-maps "^1.0.0"
@@ -4193,27 +5097,27 @@ giget@^2.0.0:
nypm "^0.6.0"
pathe "^2.0.3"
-git-up@^8.0.0:
- version "8.0.1"
- resolved "https://registry.yarnpkg.com/git-up/-/git-up-8.0.1.tgz#2a82cfbc77b5eb04074ab1e48593911981654fc7"
- integrity sha512-2XFu1uNZMSjkyetaF+8rqn6P0XqpMq/C+2ycjI6YwrIKcszZ5/WR4UubxjN0lILOKqLkLaHDaCr2B6fP1cke6g==
+git-up@^8.1.0:
+ version "8.1.1"
+ resolved "https://registry.yarnpkg.com/git-up/-/git-up-8.1.1.tgz#06262adadb89a4a614d2922d803a0eda054be8c5"
+ integrity sha512-FDenSF3fVqBYSaJoYy1KSc2wosx0gCvKP+c+PRBht7cAaiCeQlBtfBDX9vgnNOHmdePlSFITVcn4pFfcgNvx3g==
dependencies:
is-ssh "^1.4.0"
parse-url "^9.2.0"
git-url-parse@^16.0.1:
- version "16.0.1"
- resolved "https://registry.yarnpkg.com/git-url-parse/-/git-url-parse-16.0.1.tgz#8a2b15ceafd29342e42a3d056a771fb9007bf5ae"
- integrity sha512-mcD36GrhAzX5JVOsIO52qNpgRyFzYWRbU1VSRFCvJt1IJvqfvH427wWw/CFqkWvjVPtdG5VTx4MKUeC5GeFPDQ==
+ version "16.1.0"
+ resolved "https://registry.yarnpkg.com/git-url-parse/-/git-url-parse-16.1.0.tgz#3bb6f378a2ba2903c4d8b1cdec004aa85a7ab66f"
+ integrity sha512-cPLz4HuK86wClEW7iDdeAKcCVlWXmrLpb2L+G9goW0Z1dtpNS6BXXSOckUTlJT/LDQViE1QZKstNORzHsLnobw==
dependencies:
- git-up "^8.0.0"
+ git-up "^8.1.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, glob-parent@~5.1.2:
version "5.1.2"
resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4"
integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==
@@ -4227,7 +5131,7 @@ glob-parent@^6.0.2:
dependencies:
is-glob "^4.0.3"
-glob@^10.0.0, glob@^10.3.7, glob@^10.4.5:
+glob@^10.0.0, glob@^10.3.3, glob@^10.4.5:
version "10.4.5"
resolved "https://registry.yarnpkg.com/glob/-/glob-10.4.5.tgz#f4d9f0b90ffdbab09c9d77f5f29b4262517b0956"
integrity sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==
@@ -4246,20 +5150,15 @@ global-directory@^4.0.1:
dependencies:
ini "4.1.1"
-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@^14.0.0:
version "14.0.0"
resolved "https://registry.yarnpkg.com/globals/-/globals-14.0.0.tgz#898d7413c29babcf6bafe56fcadded858ada724e"
integrity sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==
-globals@^16.0.0:
- version "16.0.0"
- resolved "https://registry.yarnpkg.com/globals/-/globals-16.0.0.tgz#3d7684652c5c4fbd086ec82f9448214da49382d8"
- integrity sha512-iInW14XItCXET01CQFqudPOWP2jYMl7T+QRQT+UNcR/iQncN/F0UNpgd76iFkBPgNQb4+X3LV9tLJYzwh+Gl3A==
+globals@^16.0.0, globals@^16.3.0:
+ version "16.3.0"
+ resolved "https://registry.yarnpkg.com/globals/-/globals-16.3.0.tgz#66118e765ddaf9e2d880f7e17658543f93f1f667"
+ integrity sha512-bqWEnJ1Nt3neqx2q5SFfGS8r/ahumIakg3HcwtNlrVlwXIeNumWn/c7Pn/wKzGhf6SaW6H6uWXLqC30STCMchQ==
globby@^14.1.0:
version "14.1.0"
@@ -4273,12 +5172,19 @@ globby@^14.1.0:
slash "^5.1.0"
unicorn-magic "^0.3.0"
+gonzales-pe@^4.3.0:
+ version "4.3.0"
+ resolved "https://registry.yarnpkg.com/gonzales-pe/-/gonzales-pe-4.3.0.tgz#fe9dec5f3c557eead09ff868c65826be54d067b3"
+ integrity sha512-otgSPpUmdWJ43VXyiNgEYE4luzHCL2pz4wQ0OnDluC6Eg4Ko3Vexy/SrSynglw/eR+OhkzmqFCZa/OFa/RgAOQ==
+ dependencies:
+ minimist "^1.2.5"
+
gopd@^1.2.0:
version "1.2.0"
resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.2.0.tgz#89f56b8217bdbc8802bd299df6d7f1081d7e51a1"
integrity sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==
-graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.4, graceful-fs@^4.2.9:
+graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.11, graceful-fs@^4.2.4, graceful-fs@^4.2.9:
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==
@@ -4303,19 +5209,19 @@ gzip-size@^7.0.0:
dependencies:
duplexer "^0.1.2"
-h3@^1.10.0, h3@^1.12.0, h3@^1.15.0, h3@^1.15.1:
- version "1.15.1"
- resolved "https://registry.yarnpkg.com/h3/-/h3-1.15.1.tgz#59d6f70d7ef619fad74ecdf465a08fff898033bb"
- integrity sha512-+ORaOBttdUm1E2Uu/obAyCguiI7MbBvsLTndc3gyK3zU+SYLoZXlyCP9Xgy0gikkGufFLTZXCXD6+4BsufnmHA==
+h3@^1.10.0, h3@^1.12.0, h3@^1.15.1, h3@^1.15.3:
+ version "1.15.3"
+ resolved "https://registry.yarnpkg.com/h3/-/h3-1.15.3.tgz#e242ec6a7692a45caed3e4a73710cede4fb8d863"
+ integrity sha512-z6GknHqyX0h9aQaTx22VZDf6QyZn+0Nh+Ym8O/u0SGSkyF5cuTJYKlc8MkzW3Nzf9LE1ivcpmYC3FUGpywhuUQ==
dependencies:
cookie-es "^1.2.2"
- crossws "^0.3.3"
+ crossws "^0.3.4"
defu "^6.1.4"
- destr "^2.0.3"
+ destr "^2.0.5"
iron-webcrypto "^1.2.1"
node-mock-http "^1.0.0"
radix3 "^1.1.2"
- ufo "^1.5.4"
+ ufo "^1.6.1"
uncrypto "^0.1.3"
has-flag@^4.0.0:
@@ -4347,6 +5253,11 @@ he@^1.2.0:
resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f"
integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==
+help-me@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/help-me/-/help-me-5.0.0.tgz#b1ebe63b967b74060027c2ac61f9be12d354a6f6"
+ integrity sha512-7xgomUX6ADmcYzFik0HzAxh/73YlKR9bmFzf51CZwR+b6YtzU2m0u49hQCqV6SvlqIqsaxovfwdvbnsw3b/zpg==
+
hookable@^5.5.3:
version "5.5.3"
resolved "https://registry.yarnpkg.com/hookable/-/hookable-5.5.3.tgz#6cfc358984a1ef991e2518cb9ed4a778bbd3215d"
@@ -4359,7 +5270,17 @@ hosted-git-info@^7.0.0:
dependencies:
lru-cache "^10.0.1"
-http-errors@2.0.0:
+htmlparser2@^10.0.0:
+ version "10.0.0"
+ resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-10.0.0.tgz#77ad249037b66bf8cc99c6e286ef73b83aeb621d"
+ integrity sha512-TwAZM+zE5Tq3lrEHvOlvwgj1XLWQCtaaibSN11Q+gGBAS7Y1uZSWwXXRe4iF6OXnaq1riyQAPFOBtYc77Mxq0g==
+ dependencies:
+ domelementtype "^2.3.0"
+ domhandler "^5.0.3"
+ domutils "^3.2.1"
+ entities "^6.0.0"
+
+http-errors@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-2.0.0.tgz#b7774a1486ef73cf7667ac9ae0858c012c57b9d3"
integrity sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==
@@ -4393,25 +5314,27 @@ human-signals@^5.0.0:
resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-5.0.0.tgz#42665a284f9ae0dade3ba41ebc37eb4b852f3a28"
integrity sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==
-human-signals@^8.0.0:
- version "8.0.1"
- resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-8.0.1.tgz#f08bb593b6d1db353933d06156cedec90abe51fb"
- integrity sha512-eKCa6bwnJhvxj14kZk5NCPc6Hb6BdsU9DZcOnmQKSnO1VKrfV0zCvtttPZUsBvjmNDn8rpcJfpwSYnHBjc95MQ==
+iconv-lite@0.6.3, iconv-lite@^0.6.3:
+ version "0.6.3"
+ resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501"
+ integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==
+ dependencies:
+ safer-buffer ">= 2.1.2 < 3.0.0"
ieee754@^1.1.13, ieee754@^1.2.1:
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, ignore@^5.3.1:
+ignore@^5.2.0:
version "5.3.2"
resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.2.tgz#3cd40e729f3643fd87cb04e50bf0eb722bc596f5"
integrity sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==
-ignore@^7.0.3:
- version "7.0.3"
- resolved "https://registry.yarnpkg.com/ignore/-/ignore-7.0.3.tgz#397ef9315dfe0595671eefe8b633fec6943ab733"
- integrity sha512-bAH5jbK/F3T3Jls4I0SO1hmPR0dKU0a7+SY6n1yzRtG54FLO8d6w/nxLFX2Nb7dBu6cCWXPaAME6cYqFUMmuCA==
+ignore@^7.0.0, ignore@^7.0.3, ignore@^7.0.5:
+ version "7.0.5"
+ resolved "https://registry.yarnpkg.com/ignore/-/ignore-7.0.5.tgz#4cb5f6cd7d4c7ab0365738c7aea888baa6d7efd9"
+ integrity sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==
image-meta@^0.2.0, image-meta@^0.2.1:
version "0.2.1"
@@ -4419,11 +5342,11 @@ image-meta@^0.2.0, image-meta@^0.2.1:
integrity sha512-K6acvFaelNxx8wc2VjbIzXKDVB0Khs0QT35U6NkGfTdCmjLNcO2945m7RFNR9/RPVFm48hq7QPzK8uGH18HCGw==
immutable@^5.0.2:
- version "5.1.1"
- resolved "https://registry.yarnpkg.com/immutable/-/immutable-5.1.1.tgz#d4cb552686f34b076b3dcf23c4384c04424d8354"
- integrity sha512-3jatXi9ObIsPGr3N5hGw/vWWcTkq6hUYhpQz4k0wLC+owqWi/LiugIw9x0EdNZ2yGedKN/HzePiBvaJRXa0Ujg==
+ version "5.1.3"
+ resolved "https://registry.yarnpkg.com/immutable/-/immutable-5.1.3.tgz#e6486694c8b76c37c063cca92399fa64098634d4"
+ integrity sha512-+chQdDfvscSF1SJqv2gn4SRO2ZyS3xL3r7IW/wWEEzrzLisnOlKiQu5ytC/BVNcS15C39WT2Hg/bjKjDMcu+zg==
-import-fresh@^3.2.1:
+import-fresh@^3.2.1, import-fresh@^3.3.0:
version "3.3.1"
resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.1.tgz#9cecb56503c0ada1f2741dbbd6546e4b13b57ccf"
integrity sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==
@@ -4431,16 +5354,16 @@ import-fresh@^3.2.1:
parent-module "^1.0.0"
resolve-from "^4.0.0"
-impound@^0.2.2:
- version "0.2.2"
- resolved "https://registry.yarnpkg.com/impound/-/impound-0.2.2.tgz#29a1040ee2742ec02a593f07204928611518715f"
- integrity sha512-9CNg+Ly8QjH4FwCUoE9nl1zeqY1NPK1s1P6Btp4L8lJxn8oZLN/0p6RZhitnyEL0BnVWrcVPfbs0Q3x+O/ucHg==
+impound@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/impound/-/impound-1.0.0.tgz#42a011b33ddcce550c801210eb36b24a691ac941"
+ integrity sha512-8lAJ+1Arw2sMaZ9HE2ZmL5zOcMnt18s6+7Xqgq2aUVy4P1nlzAyPtzCDxsk51KVFwHEEdc6OWvUyqwHwhRYaug==
dependencies:
- "@rollup/pluginutils" "^5.1.4"
- mlly "^1.7.4"
- mocked-exports "^0.1.0"
+ exsolve "^1.0.5"
+ mocked-exports "^0.1.1"
pathe "^2.0.3"
- unplugin "^2.2.0"
+ unplugin "^2.3.2"
+ unplugin-utils "^0.2.4"
imurmurhash@^0.1.4:
version "0.1.4"
@@ -4452,10 +5375,10 @@ indent-string@^5.0.0:
resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-5.0.0.tgz#4fd2980fccaf8622d14c64d694f4cf33c81951a5"
integrity sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==
-index-to-position@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/index-to-position/-/index-to-position-1.0.0.tgz#baca236eb6e8c2b750b9225313c31751f84ef357"
- integrity sha512-sCO7uaLVhRJ25vz1o8s9IFM3nVS4DkuQnyjMwiQPKvQuBYBDmb8H7zx8ki7nVh4HJQOdVWebyvLE0qt+clruxA==
+index-to-position@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/index-to-position/-/index-to-position-1.1.0.tgz#2e50bd54c8040bdd6d9b3d95ec2a8fedf86b4d44"
+ integrity sha512-XPdx9Dq4t9Qk1mTMbWONJqU7boCoumEH7fRET37HX5+khDUl3J2W6PdALxhILYlIYx2amlwYcRPp28p0tSiojg==
inherits@2.0.4, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.3:
version "2.0.4"
@@ -4472,10 +5395,10 @@ ini@~1.3.0:
resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c"
integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==
-ioredis@^5.6.0:
- version "5.6.0"
- resolved "https://registry.yarnpkg.com/ioredis/-/ioredis-5.6.0.tgz#faa2a27132f8a05c0ddfef400b01d1326df211a0"
- integrity sha512-tBZlIIWbndeWBWCXWZiqtOF/yxf6yZX3tAlTJ7nfo5jhd6dctNxF7QnYlZLZ1a0o0pDoen7CgZqO+zjNaFbJAg==
+ioredis@^5.6.1:
+ version "5.6.1"
+ resolved "https://registry.yarnpkg.com/ioredis/-/ioredis-5.6.1.tgz#1ed7dc9131081e77342503425afceaf7357ae599"
+ integrity sha512-UxC0Yv1Y4WRJiGQxQkP0hfdL0/5/6YvdfOOClRgJ0qppSarkhneSa6UvkMkms0AkdGimSH3Ikqm+6mkMmX7vGA==
dependencies:
"@ioredis/commands" "^1.1.1"
cluster-key-slot "^1.1.0"
@@ -4488,9 +5411,9 @@ ioredis@^5.6.0:
standard-as-callback "^2.1.0"
ipx@^2.1.0:
- version "2.1.0"
- resolved "https://registry.yarnpkg.com/ipx/-/ipx-2.1.0.tgz#235d37f789b6c5100f34a0bb3b3bef9852af4d76"
- integrity sha512-AVnPGXJ8L41vjd11Z4akIF2yd14636Klxul3tBySxHA6PKfCOQPxBDkCFK5zcWh0z/keR6toh1eg8qzdBVUgdA==
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/ipx/-/ipx-2.1.1.tgz#3c309a3ae364f2c56ddb152cb6d14ba7c5767567"
+ integrity sha512-XuM9FEGOT+/45mfAWZ5ykwkZ/oE7vWpd1iWjRffMWlwAYIRzb/xD6wZhQ4BzmPMX6Ov5dqK0wUyD0OEN9oWT6g==
dependencies:
"@fastify/accept-negotiator" "^1.1.0"
citty "^0.1.5"
@@ -4519,6 +5442,20 @@ is-arrayish@^0.3.1:
resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.3.2.tgz#4574a2ae56f7ab206896fb431eaeed066fdf8f03"
integrity sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==
+is-binary-path@~2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09"
+ integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==
+ dependencies:
+ binary-extensions "^2.0.0"
+
+is-builtin-module@^3.1.0:
+ version "3.2.1"
+ resolved "https://registry.yarnpkg.com/is-builtin-module/-/is-builtin-module-3.2.1.tgz#f03271717d8654cfcaf07ab0463faa3571581169"
+ integrity sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==
+ dependencies:
+ builtin-modules "^3.3.0"
+
is-builtin-module@^5.0.0:
version "5.0.0"
resolved "https://registry.yarnpkg.com/is-builtin-module/-/is-builtin-module-5.0.0.tgz#19df4b9c7451149b68176b0e06d18646db6308dd"
@@ -4553,7 +5490,7 @@ is-fullwidth-code-point@^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-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3:
+is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1:
version "4.0.3"
resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084"
integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==
@@ -4575,6 +5512,13 @@ is-installed-globally@^1.0.0:
global-directory "^4.0.1"
is-path-inside "^4.0.0"
+is-language-code@^3.1.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/is-language-code/-/is-language-code-3.1.0.tgz#b2386b49227e7010636f16d0c2c681ca40136ab5"
+ integrity sha512-zJdQ3QTeLye+iphMeK3wks+vXSRFKh68/Pnlw7aOfApFSEIOhYa8P9vwwa6QrImNNBMJTiL1PpYF0f4BxDuEgA==
+ dependencies:
+ "@babel/runtime" "^7.14.0"
+
is-module@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/is-module/-/is-module-1.0.0.tgz#3258fb69f78c14d5b815d664336b4cffb6441591"
@@ -4590,10 +5534,10 @@ is-path-inside@^4.0.0:
resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-4.0.0.tgz#805aeb62c47c1b12fc3fd13bfb3ed1e7430071db"
integrity sha512-lJJV/5dYS+RcL8uQdBDW9c9uWFLLBNRyFhnAKXw5tVqLlKZ4RMGZKv+YQ/IA3OhD+RpbJa1LLFM1FQPGyIXvOA==
-is-plain-obj@^4.1.0:
- version "4.1.0"
- resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-4.1.0.tgz#d65025edec3657ce032fd7db63c97883eaed71f0"
- integrity sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==
+is-plain-obj@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-2.1.0.tgz#45e42e37fccf1f40da8e5f76ee21515840c09287"
+ integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==
is-reference@1.2.1:
version "1.2.1"
@@ -4609,7 +5553,7 @@ is-ssh@^1.4.0:
dependencies:
protocols "^2.0.1"
-is-stream@^2.0.1:
+is-stream@^2.0.0, is-stream@^2.0.1:
version "2.0.1"
resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077"
integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==
@@ -4624,10 +5568,15 @@ is-stream@^4.0.1:
resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-4.0.1.tgz#375cf891e16d2e4baec250b85926cffc14720d9b"
integrity sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A==
-is-unicode-supported@^2.0.0:
- version "2.1.0"
- resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-2.1.0.tgz#09f0ab0de6d3744d48d265ebb98f65d11f2a9b3a"
- integrity sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==
+is-url-superb@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/is-url-superb/-/is-url-superb-4.0.0.tgz#b54d1d2499bb16792748ac967aa3ecb41a33a8c2"
+ integrity sha512-GI+WjezhPPcbM+tqE9LnmsY5qqjwHzTvjJ36wxYX5ujNXefSUJ/T17r5bqDV8yLhcgB59KTPNOc9O9cmHTPWsA==
+
+is-url@^1.2.4:
+ version "1.2.4"
+ resolved "https://registry.yarnpkg.com/is-url/-/is-url-1.2.4.tgz#04a4df46d28c4cff3d73d01ff06abeb318a1aa52"
+ integrity sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww==
is-what@^4.1.8:
version "4.1.16"
@@ -4686,11 +5635,21 @@ jdenticon@^3.3.0:
dependencies:
canvas-renderer "~2.2.0"
-jiti@^2.1.2, jiti@^2.4.2:
+jiti@2.4.2:
version "2.4.2"
resolved "https://registry.yarnpkg.com/jiti/-/jiti-2.4.2.tgz#d19b7732ebb6116b06e2038da74a55366faef560"
integrity sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A==
+jiti@^2.1.2, jiti@^2.4.2:
+ version "2.5.1"
+ resolved "https://registry.yarnpkg.com/jiti/-/jiti-2.5.1.tgz#bd099c1c2be1c59bbea4e5adcd127363446759d0"
+ integrity sha512-twQoecYPiVA5K/h6SxtORw/Bs3ar+mLUtoPSc7iMXzQzK8d7eJ/R09wmTwAjiamETn1cXYPGfNnu7DMoHgu12w==
+
+joycon@^3.1.1:
+ version "3.1.1"
+ resolved "https://registry.yarnpkg.com/joycon/-/joycon-3.1.1.tgz#bce8596d6ae808f8b68168f5fc69280996894f03"
+ integrity sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==
+
js-base64@^3.6.0:
version "3.7.7"
resolved "https://registry.yarnpkg.com/js-base64/-/js-base64-3.7.7.tgz#e51b84bf78fbf5702b9541e2cb7bfcb893b43e79"
@@ -4733,12 +5692,12 @@ json-buffer@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-to-typescript-lite@^14.1.0:
- version "14.1.0"
- resolved "https://registry.yarnpkg.com/json-schema-to-typescript-lite/-/json-schema-to-typescript-lite-14.1.0.tgz#a35624a2d783e5e125631a3d25ac4c2fb96dd191"
- integrity sha512-b8K6P3aiLgiYKYcHacgZKrwPXPyjekqRPV5vkNfBt0EoohcOSXEbcuGzgi6KQmsAhuy5Mh2KMxofXodRhMxURA==
+json-schema-to-typescript-lite@^15.0.0:
+ version "15.0.0"
+ resolved "https://registry.yarnpkg.com/json-schema-to-typescript-lite/-/json-schema-to-typescript-lite-15.0.0.tgz#94b0bdc301f479fc7eca6d02ddaca16394e9356d"
+ integrity sha512-5mMORSQm9oTLyjM4mWnyNBi2T042Fhg1/0gCIB6X8U/LVpM2A+Nmj2yEyArqVouDmFThDxpEXcnTgSrjkGJRFA==
dependencies:
- "@apidevtools/json-schema-ref-parser" "^11.7.0"
+ "@apidevtools/json-schema-ref-parser" "^14.1.1"
"@types/json-schema" "^7.0.15"
json-schema-traverse@^0.4.1:
@@ -4756,6 +5715,32 @@ json5@^2.2.3:
resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283"
integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==
+jsonc-eslint-parser@^2.3.0:
+ version "2.4.0"
+ resolved "https://registry.yarnpkg.com/jsonc-eslint-parser/-/jsonc-eslint-parser-2.4.0.tgz#74ded53f9d716e8d0671bd167bf5391f452d5461"
+ integrity sha512-WYDyuc/uFcGp6YtM2H0uKmUwieOuzeE/5YocFJLnLfclZ4inf3mRn8ZVy1s7Hxji7Jxm6Ss8gqpexD/GlKoGgg==
+ dependencies:
+ acorn "^8.5.0"
+ eslint-visitor-keys "^3.0.0"
+ espree "^9.0.0"
+ semver "^7.3.5"
+
+jsonfile@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb"
+ integrity sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==
+ optionalDependencies:
+ graceful-fs "^4.1.6"
+
+jsonfile@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-5.0.0.tgz#e6b718f73da420d612823996fdf14a03f6ff6922"
+ integrity sha512-NQRZ5CRo74MhMMC3/3r5g2k4fjodJ/wh8MxjFbCViWKFjxrnudWSY5vomh+23ZaXzAS7J3fBZIR2dV6WbmfM0w==
+ dependencies:
+ universalify "^0.1.2"
+ optionalDependencies:
+ graceful-fs "^4.1.6"
+
jsonfile@^6.0.1:
version "6.1.0"
resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae"
@@ -4765,6 +5750,16 @@ jsonfile@^6.0.1:
optionalDependencies:
graceful-fs "^4.1.6"
+junk@^4.0.0:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/junk/-/junk-4.0.1.tgz#7ee31f876388c05177fe36529ee714b07b50fbed"
+ integrity sha512-Qush0uP+G8ZScpGMZvHUiRfI0YBWuB3gVBYlI0v0vvOJt5FLicco+IkP0a50LqTTQhmts/m6tP5SWE+USyIvcQ==
+
+jwt-decode@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/jwt-decode/-/jwt-decode-4.0.0.tgz#2270352425fd413785b2faf11f6e755c5151bd4b"
+ integrity sha512-+KJGIyHgkGuIq3IEBNftfhW/LfWhXUIY6OmyVWjliu5KH1y0fw7VQ8YndE2O4qZdMSd9SqbnC8GOcZEy0Om7sA==
+
keyv@^4.5.4:
version "4.5.4"
resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.4.tgz#a879a99e29452f942439f2a405e3af8b31d4de93"
@@ -4792,6 +5787,20 @@ knitwork@^1.0.0, knitwork@^1.2.0:
resolved "https://registry.yarnpkg.com/knitwork/-/knitwork-1.2.0.tgz#3cc92e76249aeb35449cfbed3f31c6df8444db3f"
integrity sha512-xYSH7AvuQ6nXkq42x0v5S8/Iry+cfulBz/DJQzhIyESdLD7425jXsPy4vn5cCXU+HhRN2kVw51Vd1K6/By4BQg==
+kuler@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/kuler/-/kuler-2.0.0.tgz#e2c570a3800388fb44407e851531c1d670b061b3"
+ integrity sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==
+
+lambda-local@^2.2.0:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/lambda-local/-/lambda-local-2.2.0.tgz#733d183a4c3f2b16c6499b9ea72cec2f13278eef"
+ integrity sha512-bPcgpIXbHnVGfI/omZIlgucDqlf4LrsunwoKue5JdZeGybt8L6KyJz2Zu19ffuZwIwLj2NAI2ZyaqNT6/cetcg==
+ dependencies:
+ commander "^10.0.1"
+ dotenv "^16.3.1"
+ winston "^3.10.0"
+
launch-editor@^2.10.0:
version "2.10.0"
resolved "https://registry.yarnpkg.com/launch-editor/-/launch-editor-2.10.0.tgz#5ca3edfcb9667df1e8721310f3a40f1127d4bc42"
@@ -4815,75 +5824,75 @@ levn@^0.4.1:
prelude-ls "^1.2.1"
type-check "~0.4.0"
-lightningcss-darwin-arm64@1.29.2:
- version "1.29.2"
- resolved "https://registry.yarnpkg.com/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.29.2.tgz#6ceff38b01134af48e859394e1ca21e5d49faae6"
- integrity sha512-cK/eMabSViKn/PG8U/a7aCorpeKLMlK0bQeNHmdb7qUnBkNPnL+oV5DjJUo0kqWsJUapZsM4jCfYItbqBDvlcA==
+lightningcss-darwin-arm64@1.30.1:
+ version "1.30.1"
+ resolved "https://registry.yarnpkg.com/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.30.1.tgz#3d47ce5e221b9567c703950edf2529ca4a3700ae"
+ integrity sha512-c8JK7hyE65X1MHMN+Viq9n11RRC7hgin3HhYKhrMyaXflk5GVplZ60IxyoVtzILeKr+xAJwg6zK6sjTBJ0FKYQ==
-lightningcss-darwin-x64@1.29.2:
- version "1.29.2"
- resolved "https://registry.yarnpkg.com/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.29.2.tgz#891b6f9e57682d794223c33463ca66d3af3fb038"
- integrity sha512-j5qYxamyQw4kDXX5hnnCKMf3mLlHvG44f24Qyi2965/Ycz829MYqjrVg2H8BidybHBp9kom4D7DR5VqCKDXS0w==
+lightningcss-darwin-x64@1.30.1:
+ version "1.30.1"
+ resolved "https://registry.yarnpkg.com/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.30.1.tgz#e81105d3fd6330860c15fe860f64d39cff5fbd22"
+ integrity sha512-k1EvjakfumAQoTfcXUcHQZhSpLlkAuEkdMBsI/ivWw9hL+7FtilQc0Cy3hrx0AAQrVtQAbMI7YjCgYgvn37PzA==
-lightningcss-freebsd-x64@1.29.2:
- version "1.29.2"
- resolved "https://registry.yarnpkg.com/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.29.2.tgz#8a95f9ab73b2b2b0beefe1599fafa8b058938495"
- integrity sha512-wDk7M2tM78Ii8ek9YjnY8MjV5f5JN2qNVO+/0BAGZRvXKtQrBC4/cn4ssQIpKIPP44YXw6gFdpUF+Ps+RGsCwg==
+lightningcss-freebsd-x64@1.30.1:
+ version "1.30.1"
+ resolved "https://registry.yarnpkg.com/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.30.1.tgz#a0e732031083ff9d625c5db021d09eb085af8be4"
+ integrity sha512-kmW6UGCGg2PcyUE59K5r0kWfKPAVy4SltVeut+umLCFoJ53RdCUWxcRDzO1eTaxf/7Q2H7LTquFHPL5R+Gjyig==
-lightningcss-linux-arm-gnueabihf@1.29.2:
- version "1.29.2"
- resolved "https://registry.yarnpkg.com/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.29.2.tgz#5c60bbf92b39d7ed51e363f7b98a7111bf5914a1"
- integrity sha512-IRUrOrAF2Z+KExdExe3Rz7NSTuuJ2HvCGlMKoquK5pjvo2JY4Rybr+NrKnq0U0hZnx5AnGsuFHjGnNT14w26sg==
+lightningcss-linux-arm-gnueabihf@1.30.1:
+ version "1.30.1"
+ resolved "https://registry.yarnpkg.com/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.30.1.tgz#1f5ecca6095528ddb649f9304ba2560c72474908"
+ integrity sha512-MjxUShl1v8pit+6D/zSPq9S9dQ2NPFSQwGvxBCYaBYLPlCWuPh9/t1MRS8iUaR8i+a6w7aps+B4N0S1TYP/R+Q==
-lightningcss-linux-arm64-gnu@1.29.2:
- version "1.29.2"
- resolved "https://registry.yarnpkg.com/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.29.2.tgz#e73d7608c4cce034c3654e5e8b53be74846224de"
- integrity sha512-KKCpOlmhdjvUTX/mBuaKemp0oeDIBBLFiU5Fnqxh1/DZ4JPZi4evEH7TKoSBFOSOV3J7iEmmBaw/8dpiUvRKlQ==
+lightningcss-linux-arm64-gnu@1.30.1:
+ version "1.30.1"
+ resolved "https://registry.yarnpkg.com/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.30.1.tgz#eee7799726103bffff1e88993df726f6911ec009"
+ integrity sha512-gB72maP8rmrKsnKYy8XUuXi/4OctJiuQjcuqWNlJQ6jZiWqtPvqFziskH3hnajfvKB27ynbVCucKSm2rkQp4Bw==
-lightningcss-linux-arm64-musl@1.29.2:
- version "1.29.2"
- resolved "https://registry.yarnpkg.com/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.29.2.tgz#a95a18d5a909831c092e0a8d2de4b9ac1a8db151"
- integrity sha512-Q64eM1bPlOOUgxFmoPUefqzY1yV3ctFPE6d/Vt7WzLW4rKTv7MyYNky+FWxRpLkNASTnKQUaiMJ87zNODIrrKQ==
+lightningcss-linux-arm64-musl@1.30.1:
+ version "1.30.1"
+ resolved "https://registry.yarnpkg.com/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.30.1.tgz#f2e4b53f42892feeef8f620cbb889f7c064a7dfe"
+ integrity sha512-jmUQVx4331m6LIX+0wUhBbmMX7TCfjF5FoOH6SD1CttzuYlGNVpA7QnrmLxrsub43ClTINfGSYyHe2HWeLl5CQ==
-lightningcss-linux-x64-gnu@1.29.2:
- version "1.29.2"
- resolved "https://registry.yarnpkg.com/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.29.2.tgz#551ca07e565394928642edee92acc042e546cb78"
- integrity sha512-0v6idDCPG6epLXtBH/RPkHvYx74CVziHo6TMYga8O2EiQApnUPZsbR9nFNrg2cgBzk1AYqEd95TlrsL7nYABQg==
+lightningcss-linux-x64-gnu@1.30.1:
+ version "1.30.1"
+ resolved "https://registry.yarnpkg.com/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.30.1.tgz#2fc7096224bc000ebb97eea94aea248c5b0eb157"
+ integrity sha512-piWx3z4wN8J8z3+O5kO74+yr6ze/dKmPnI7vLqfSqI8bccaTGY5xiSGVIJBDd5K5BHlvVLpUB3S2YCfelyJ1bw==
-lightningcss-linux-x64-musl@1.29.2:
- version "1.29.2"
- resolved "https://registry.yarnpkg.com/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.29.2.tgz#2fd164554340831bce50285b57101817850dd258"
- integrity sha512-rMpz2yawkgGT8RULc5S4WiZopVMOFWjiItBT7aSfDX4NQav6M44rhn5hjtkKzB+wMTRlLLqxkeYEtQ3dd9696w==
+lightningcss-linux-x64-musl@1.30.1:
+ version "1.30.1"
+ resolved "https://registry.yarnpkg.com/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.30.1.tgz#66dca2b159fd819ea832c44895d07e5b31d75f26"
+ integrity sha512-rRomAK7eIkL+tHY0YPxbc5Dra2gXlI63HL+v1Pdi1a3sC+tJTcFrHX+E86sulgAXeI7rSzDYhPSeHHjqFhqfeQ==
-lightningcss-win32-arm64-msvc@1.29.2:
- version "1.29.2"
- resolved "https://registry.yarnpkg.com/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.29.2.tgz#da43ea49fafc5d2de38e016f1a8539d5eed98318"
- integrity sha512-nL7zRW6evGQqYVu/bKGK+zShyz8OVzsCotFgc7judbt6wnB2KbiKKJwBE4SGoDBQ1O94RjW4asrCjQL4i8Fhbw==
+lightningcss-win32-arm64-msvc@1.30.1:
+ version "1.30.1"
+ resolved "https://registry.yarnpkg.com/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.30.1.tgz#7d8110a19d7c2d22bfdf2f2bb8be68e7d1b69039"
+ integrity sha512-mSL4rqPi4iXq5YVqzSsJgMVFENoa4nGTT/GjO2c0Yl9OuQfPsIfncvLrEW6RbbB24WtZ3xP/2CCmI3tNkNV4oA==
-lightningcss-win32-x64-msvc@1.29.2:
- version "1.29.2"
- resolved "https://registry.yarnpkg.com/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.29.2.tgz#ddefaa099a39b725b2f5bbdcb9fc718435cc9797"
- integrity sha512-EdIUW3B2vLuHmv7urfzMI/h2fmlnOQBk1xlsDxkN1tCWKjNFjfLhGxYk8C8mzpSfr+A6jFFIi8fU6LbQGsRWjA==
+lightningcss-win32-x64-msvc@1.30.1:
+ version "1.30.1"
+ resolved "https://registry.yarnpkg.com/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.30.1.tgz#fd7dd008ea98494b85d24b4bea016793f2e0e352"
+ integrity sha512-PVqXh48wh4T53F/1CCu8PIPCxLzWyCnn/9T5W1Jpmdy5h9Cwd+0YQS6/LwhHXSafuc61/xg9Lv5OrCby6a++jg==
-lightningcss@1.29.2:
- version "1.29.2"
- resolved "https://registry.yarnpkg.com/lightningcss/-/lightningcss-1.29.2.tgz#f5f0fd6e63292a232697e6fe709da5b47624def3"
- integrity sha512-6b6gd/RUXKaw5keVdSEtqFVdzWnU5jMxTUjA2bVcMNPLwSQ08Sv/UodBVtETLCn7k4S1Ibxwh7k68IwLZPgKaA==
+lightningcss@1.30.1:
+ version "1.30.1"
+ resolved "https://registry.yarnpkg.com/lightningcss/-/lightningcss-1.30.1.tgz#78e979c2d595bfcb90d2a8c0eb632fe6c5bfed5d"
+ integrity sha512-xi6IyHML+c9+Q3W0S4fCQJOym42pyurFiJUHEcEyHS0CeKzia4yZDEsLlqOFykxOdHpNy0NmvVO31vcSqAxJCg==
dependencies:
detect-libc "^2.0.3"
optionalDependencies:
- lightningcss-darwin-arm64 "1.29.2"
- lightningcss-darwin-x64 "1.29.2"
- lightningcss-freebsd-x64 "1.29.2"
- lightningcss-linux-arm-gnueabihf "1.29.2"
- lightningcss-linux-arm64-gnu "1.29.2"
- lightningcss-linux-arm64-musl "1.29.2"
- lightningcss-linux-x64-gnu "1.29.2"
- lightningcss-linux-x64-musl "1.29.2"
- lightningcss-win32-arm64-msvc "1.29.2"
- lightningcss-win32-x64-msvc "1.29.2"
+ lightningcss-darwin-arm64 "1.30.1"
+ lightningcss-darwin-x64 "1.30.1"
+ lightningcss-freebsd-x64 "1.30.1"
+ lightningcss-linux-arm-gnueabihf "1.30.1"
+ lightningcss-linux-arm64-gnu "1.30.1"
+ lightningcss-linux-arm64-musl "1.30.1"
+ lightningcss-linux-x64-gnu "1.30.1"
+ lightningcss-linux-x64-musl "1.30.1"
+ lightningcss-win32-arm64-msvc "1.30.1"
+ lightningcss-win32-x64-msvc "1.30.1"
-lilconfig@^3.1.2:
+lilconfig@^3.1.3:
version "3.1.3"
resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-3.1.3.tgz#a1bcfd6257f9585bf5ae14ceeebb7b559025e4c4"
integrity sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==
@@ -4933,18 +5942,28 @@ locate-path@^6.0.0:
dependencies:
p-locate "^5.0.0"
-locate-path@^7.2.0:
+locate-path@^7.0.0, locate-path@^7.2.0:
version "7.2.0"
resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-7.2.0.tgz#69cb1779bd90b35ab1e771e1f2f89a202c2a8a8a"
integrity sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==
dependencies:
p-locate "^6.0.0"
+lodash-es@^4.17.21:
+ version "4.17.21"
+ resolved "https://registry.yarnpkg.com/lodash-es/-/lodash-es-4.17.21.tgz#43e626c46e6591b7750beb2b50117390c609e3ee"
+ integrity sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==
+
lodash.castarray@^4.4.0:
version "4.4.0"
resolved "https://registry.yarnpkg.com/lodash.castarray/-/lodash.castarray-4.4.0.tgz#c02513515e309daddd4c24c60cfddcf5976d9115"
integrity sha512-aVx8ztPv7/2ULbArGJ2Y42bG1mEQ5mGjpdvrbJcJFU3TbYybe+QlLS4pst9zV52ymy2in1KpFPiZnAOATxD4+Q==
+lodash.debounce@^4.0.8:
+ version "4.0.8"
+ resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af"
+ integrity sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==
+
lodash.defaults@^4.2.0:
version "4.2.0"
resolved "https://registry.yarnpkg.com/lodash.defaults/-/lodash.defaults-4.2.0.tgz#d09178716ffea4dde9e5fb7b37f6f0802274580c"
@@ -4980,6 +5999,18 @@ lodash@^4.17.15, lodash@^4.17.21:
resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c"
integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==
+logform@^2.7.0:
+ version "2.7.0"
+ resolved "https://registry.yarnpkg.com/logform/-/logform-2.7.0.tgz#cfca97528ef290f2e125a08396805002b2d060d1"
+ integrity sha512-TFYA4jnP7PVbmlBIfhlSe+WKxs9dklXMTEGcBCIvLhE/Tn3H6Gk1norupVW7m5Cnd4bLcr08AytbyV/xj7f/kQ==
+ dependencies:
+ "@colors/colors" "1.6.0"
+ "@types/triple-beam" "^1.3.2"
+ fecha "^4.2.0"
+ ms "^2.1.1"
+ safe-stable-stringify "^2.3.1"
+ triple-beam "^1.3.0"
+
lru-cache@^10.0.1, lru-cache@^10.2.0, lru-cache@^10.4.3:
version "10.4.3"
resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.4.3.tgz#410fc8a17b70e598013df257c2446b7f3383f119"
@@ -4992,23 +6023,23 @@ lru-cache@^5.1.1:
dependencies:
yallist "^3.0.2"
-luxon@^3.6.1:
- version "3.6.1"
- resolved "https://registry.yarnpkg.com/luxon/-/luxon-3.6.1.tgz#d283ffc4c0076cb0db7885ec6da1c49ba97e47b0"
- integrity sha512-tJLxrKJhO2ukZ5z0gyjY1zPh3Rh88Ej9P7jNrZiHMUXHae1yvI2imgOZtL1TO8TW6biMMKfTtAOoEJANgtWBMQ==
+luxon@^3.2.1, luxon@^3.6.1:
+ version "3.7.1"
+ resolved "https://registry.yarnpkg.com/luxon/-/luxon-3.7.1.tgz#9bd09aa84a56afb00c57ea78a8ec5bd16eb24ec0"
+ integrity sha512-RkRWjA926cTvz5rAb1BqyWkKbbjzCGchDUIKMCUvNi17j6f6j8uHGDV82Aqcqtzd+icoYpELmG3ksgGiFNNcNg==
-magic-regexp@^0.8.0:
- version "0.8.0"
- resolved "https://registry.yarnpkg.com/magic-regexp/-/magic-regexp-0.8.0.tgz#c67de16456522a83672c22aa408b774facfd882e"
- integrity sha512-lOSLWdE156csDYwCTIGiAymOLN7Epu/TU5e/oAnISZfU6qP+pgjkE+xbVjVn3yLPKN8n1G2yIAYTAM5KRk6/ow==
+magic-regexp@^0.10.0:
+ version "0.10.0"
+ resolved "https://registry.yarnpkg.com/magic-regexp/-/magic-regexp-0.10.0.tgz#78b4421a50d2b7a67129bf2c424a333927c3a0e5"
+ integrity sha512-Uly1Bu4lO1hwHUW0CQeSWuRtzCMNO00CmXtS8N6fyvB3B979GOEEeAkiTUDsmbYLAbvpUS/Kt5c4ibosAzVyVg==
dependencies:
estree-walker "^3.0.3"
- magic-string "^0.30.8"
- mlly "^1.6.1"
+ magic-string "^0.30.12"
+ mlly "^1.7.2"
regexp-tree "^0.1.27"
type-level-regexp "~0.1.17"
- ufo "^1.4.0"
- unplugin "^1.8.3"
+ ufo "^1.5.4"
+ unplugin "^2.0.0"
magic-string-ast@^0.7.0:
version "0.7.1"
@@ -5017,7 +6048,14 @@ magic-string-ast@^0.7.0:
dependencies:
magic-string "^0.30.17"
-magic-string@^0.30.11, magic-string@^0.30.17, magic-string@^0.30.3, magic-string@^0.30.8:
+magic-string-ast@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/magic-string-ast/-/magic-string-ast-1.0.0.tgz#a42baa26a30e3368dd0b6c7d66eda4f6577abb42"
+ integrity sha512-8rbuNizut2gW94kv7pqgt0dvk+AHLPVIm0iJtpSgQJ9dx21eWx5SBel8z3jp1xtC0j6/iyK3AWGhAR1H61s7LA==
+ dependencies:
+ magic-string "^0.30.17"
+
+magic-string@^0.30.11, magic-string@^0.30.12, magic-string@^0.30.17, magic-string@^0.30.3, magic-string@^0.30.8:
version "0.30.17"
resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.30.17.tgz#450a449673d2460e5bbcfba9a61916a1714c7453"
integrity sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==
@@ -5053,6 +6091,13 @@ mdn-data@2.12.2:
resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.12.2.tgz#9ae6c41a9e65adf61318b32bff7b64fbfb13f8cf"
integrity sha512-IEn+pegP1aManZuckezWCO+XZQDplx1366JoVhTpMpBB1sPey/SbveZQUosKiKiGYjg1wH4pMlNgXbCiYgihQA==
+merge-options@^3.0.4:
+ version "3.0.4"
+ resolved "https://registry.yarnpkg.com/merge-options/-/merge-options-3.0.4.tgz#84709c2aa2a4b24c1981f66c179fe5565cc6dbb7"
+ integrity sha512-2Sug1+knBjkaMsMgf1ctR1Ujx+Ayku4EdJN4Z+C2+JzoeF7A3OZ9KM2GY0CpQS51NR61LTurMJrRKPhSs3ZRTQ==
+ dependencies:
+ is-plain-obj "^2.1.0"
+
merge-stream@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60"
@@ -5063,6 +6108,11 @@ merge2@^1.3.0:
resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae"
integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==
+micro-api-client@^3.3.0:
+ version "3.3.0"
+ resolved "https://registry.yarnpkg.com/micro-api-client/-/micro-api-client-3.3.0.tgz#52dd567d322f10faffe63d19d4feeac4e4ffd215"
+ integrity sha512-y0y6CUB9RLVsy3kfgayU28746QrNMpSm9O/AYGNsBgOkJr/X/Jk0VLGoO8Ude7Bpa8adywzF+MzXNZRFRsNPhg==
+
micromark-core-commonmark@^2.0.0:
version "2.0.3"
resolved "https://registry.yarnpkg.com/micromark-core-commonmark/-/micromark-core-commonmark-2.0.3.tgz#c691630e485021a68cf28dbc2b2ca27ebf678cd4"
@@ -5260,6 +6310,11 @@ mime-db@1.52.0:
resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70"
integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==
+mime-db@^1.54.0:
+ version "1.54.0"
+ resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.54.0.tgz#cddb3ee4f9c64530dff640236661d42cb6a314f5"
+ integrity sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==
+
mime-types@^2.1.12, mime-types@^2.1.35:
version "2.1.35"
resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a"
@@ -5267,20 +6322,22 @@ mime-types@^2.1.12, mime-types@^2.1.35:
dependencies:
mime-db "1.52.0"
-mime@1.6.0:
- version "1.6.0"
- resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1"
- integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==
+mime-types@^3.0.1:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-3.0.1.tgz#b1d94d6997a9b32fd69ebaed0db73de8acb519ce"
+ integrity sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==
+ dependencies:
+ mime-db "^1.54.0"
mime@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/mime/-/mime-3.0.0.tgz#b374550dca3a0c18443b0c950a6a58f1931cf7a7"
integrity sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==
-mime@^4.0.6:
- version "4.0.6"
- resolved "https://registry.yarnpkg.com/mime/-/mime-4.0.6.tgz#ca83bec0bcf2a02353d0e02da99be05603d04839"
- integrity sha512-4rGt7rvQHBbaSOF9POGkk1ocRP16Md1x36Xma8sz8h8/vfCUI2OtEIeCqe4Ofes853x4xDoPiFLIT47J5fI/7A==
+mime@^4.0.7:
+ version "4.0.7"
+ resolved "https://registry.yarnpkg.com/mime/-/mime-4.0.7.tgz#0b7a98b08c63bd3c10251e797d67840c9bde9f13"
+ integrity sha512-2OfDPL+e03E0LrXaGYOtTFIYhiuzep94NSsuhrNULq+stylcJedcHdzHtz0atMUuGwJfFYs0YL5xeC/Ca2x0eQ==
mimic-fn@^4.0.0:
version "4.0.0"
@@ -5316,7 +6373,7 @@ minimatch@^5.1.0:
dependencies:
brace-expansion "^2.0.1"
-minimatch@^9.0.3, minimatch@^9.0.4:
+minimatch@^9.0.0, minimatch@^9.0.4:
version "9.0.5"
resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.5.tgz#d74f9dd6b57d83d8e98cfb82133b03978bc929e5"
integrity sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==
@@ -5324,13 +6381,13 @@ minimatch@^9.0.3, minimatch@^9.0.4:
brace-expansion "^2.0.1"
"minimatch@^9.0.3 || ^10.0.1":
- version "10.0.1"
- resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-10.0.1.tgz#ce0521856b453c86e25f2c4c0d03e6ff7ddc440b"
- integrity sha512-ethXTt3SGGR+95gudmqJ1eNhRO7eGEGIgYA9vnPatK4/etz2MEVDno5GMCibdMTuBMyElzIlgxMna3K94XDIDQ==
+ version "10.0.3"
+ resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-10.0.3.tgz#cf7a0314a16c4d9ab73a7730a0e8e3c3502d47aa"
+ integrity sha512-IPZ167aShDZZUMdRk66cyQAW3qr0WzbHkPdMYa8bzZhlHhO3jALbKdxcaak7W9FfT2rZNpQuUu4Od7ILEpXSaw==
dependencies:
- brace-expansion "^2.0.1"
+ "@isaacs/brace-expansion" "^5.0.0"
-minimist@^1.2.0, minimist@^1.2.3:
+minimist@^1.2.0, minimist@^1.2.3, minimist@^1.2.5, minimist@^1.2.6:
version "1.2.8"
resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c"
integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==
@@ -5341,12 +6398,11 @@ minimist@^1.2.0, minimist@^1.2.3:
integrity sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==
minizlib@^3.0.1:
- version "3.0.1"
- resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-3.0.1.tgz#46d5329d1eb3c83924eff1d3b858ca0a31581012"
- integrity sha512-umcy022ILvb5/3Djuu8LWeqUa8D68JaBzlttKeMWen48SjabqS3iY5w/vzeMzMUNhLDifyhbOwKDSznB1vvrwg==
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-3.0.2.tgz#f33d638eb279f664439aa38dc5f91607468cb574"
+ integrity sha512-oG62iEk+CYt5Xj2YqI5Xi9xWUeZhDI8jjQmC5oThVH5JGCTgIjr7ciJDzC7MBzYd//WvR1OTmP5Q38Q8ShQtVA==
dependencies:
- minipass "^7.0.4"
- rimraf "^5.0.5"
+ minipass "^7.1.2"
mitt@^3.0.1:
version "3.0.1"
@@ -5363,7 +6419,7 @@ mkdirp@^3.0.1:
resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-3.0.1.tgz#e44e4c5607fb279c168241713cc6e0fea9adcb50"
integrity sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==
-mlly@^1.3.0, mlly@^1.6.1, mlly@^1.7.1, mlly@^1.7.4:
+mlly@^1.2.0, mlly@^1.3.0, mlly@^1.6.1, mlly@^1.7.1, mlly@^1.7.2, mlly@^1.7.4:
version "1.7.4"
resolved "https://registry.yarnpkg.com/mlly/-/mlly-1.7.4.tgz#3d7295ea2358ec7a271eaa5d000a0f84febe100f"
integrity sha512-qmdSIPC4bDJXgZTCR7XosJiNKySV7O215tsPtDN9iEO/7q/76b/ijtgRu/+epFXSJhijtTCCGp3DWS549P3xKw==
@@ -5373,22 +6429,25 @@ mlly@^1.3.0, mlly@^1.6.1, mlly@^1.7.1, mlly@^1.7.4:
pkg-types "^1.3.0"
ufo "^1.5.4"
-mocked-exports@^0.1.0, mocked-exports@^0.1.1:
+mocked-exports@^0.1.1:
version "0.1.1"
resolved "https://registry.yarnpkg.com/mocked-exports/-/mocked-exports-0.1.1.tgz#6916efea9a9dd0f4abd6a0a72526f56a76c966ea"
integrity sha512-aF7yRQr/Q0O2/4pIXm6PZ5G+jAd7QS4Yu8m+WEeEHGnbo+7mE36CbLSDQiXYV8bVL3NfmdeqPJct0tUlnjVSnA==
+module-definition@^6.0.1:
+ version "6.0.1"
+ resolved "https://registry.yarnpkg.com/module-definition/-/module-definition-6.0.1.tgz#47e73144cc5a9aa31f3380166fddf8e962ccb2e4"
+ integrity sha512-FeVc50FTfVVQnolk/WQT8MX+2WVcDnTGiq6Wo+/+lJ2ET1bRVi3HG3YlJUfqagNMc/kUlFSoR96AJkxGpKz13g==
+ dependencies:
+ ast-module-types "^6.0.1"
+ node-source-walk "^7.0.1"
+
mrmime@^2.0.0, mrmime@^2.0.1:
version "2.0.1"
resolved "https://registry.yarnpkg.com/mrmime/-/mrmime-2.0.1.tgz#bc3e87f7987853a54c9850eeb1f1078cd44adddc"
integrity sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==
-ms@2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8"
- integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==
-
-ms@2.1.3, ms@^2.1.1, ms@^2.1.3:
+ms@^2.1.1, ms@^2.1.3:
version "2.1.3"
resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2"
integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==
@@ -5398,12 +6457,12 @@ muggle-string@^0.4.1:
resolved "https://registry.yarnpkg.com/muggle-string/-/muggle-string-0.4.1.tgz#3b366bd43b32f809dc20659534dd30e7c8a0d328"
integrity sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==
-nanoid@^3.3.8:
+nanoid@^3.3.11:
version "3.3.11"
resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.11.tgz#4f4f112cefbe303202f2199838128936266d185b"
integrity sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==
-nanoid@^5.0.9:
+nanoid@^5.1.0:
version "5.1.5"
resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-5.1.5.tgz#f7597f9d9054eb4da9548cdd53ca70f1790e87de"
integrity sha512-Ir/+ZpE9fDsNH0hQ3C68uyThDXzYcim2EqcZ8zn8Chtt1iylPT9xXJB0kPCnqzgcEGikO9RxSrh63MsmVCU7Fw==
@@ -5418,6 +6477,11 @@ napi-build-utils@^2.0.0:
resolved "https://registry.yarnpkg.com/napi-build-utils/-/napi-build-utils-2.0.0.tgz#13c22c0187fcfccce1461844136372a47ddc027e"
integrity sha512-GEbrYkbfF7MoNaoh2iGG84Mnf/WZfB0GdGEsM8wz7Expx/LlWf5U8t9nvJKXSp3qr5IsEbK04cBGhol/KwOsWA==
+napi-postinstall@^0.3.0:
+ version "0.3.2"
+ resolved "https://registry.yarnpkg.com/napi-postinstall/-/napi-postinstall-0.3.2.tgz#03c62080e88b311c4d7423b0f15f0c920bbcc626"
+ integrity sha512-tWVJxJHmBWLy69PvO96TZMZDrzmw5KeiZBz3RHmiM2XZ9grBJ2WgMAFVVg25nqp3ZjTFUs2Ftw1JhscL3Teliw==
+
napi-wasm@^1.1.0:
version "1.1.3"
resolved "https://registry.yarnpkg.com/napi-wasm/-/napi-wasm-1.1.3.tgz#7bb95c88e6561f84880bb67195437b1cfbe99224"
@@ -5428,87 +6492,99 @@ natural-compare@^1.4.0:
resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7"
integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==
-nitropack@^2.11.8:
- version "2.11.8"
- resolved "https://registry.yarnpkg.com/nitropack/-/nitropack-2.11.8.tgz#8a4d7f1b403341cb9ee931e1716e81d0078a73c4"
- integrity sha512-ummTu4R8Lhd1nO3nWrW7eeiHA2ey3ntbWFKkYakm4rcbvT6meWp+oykyrYBNFQKhobQl9CydmUWlCyztYXFPJw==
+netlify@^13.3.5:
+ version "13.3.5"
+ resolved "https://registry.yarnpkg.com/netlify/-/netlify-13.3.5.tgz#b3b44dfff378654eeb2968bc0f43c21e6a38abda"
+ integrity sha512-Nc3loyVASW59W+8fLDZT1lncpG7llffyZ2o0UQLx/Fr20i7P8oP+lE7+TEcFvXj9IUWU6LjB9P3BH+iFGyp+mg==
+ dependencies:
+ "@netlify/open-api" "^2.37.0"
+ lodash-es "^4.17.21"
+ micro-api-client "^3.3.0"
+ node-fetch "^3.0.0"
+ p-wait-for "^5.0.0"
+ qs "^6.9.6"
+
+nitropack@^2.11.12, nitropack@^2.11.13:
+ version "2.12.4"
+ resolved "https://registry.yarnpkg.com/nitropack/-/nitropack-2.12.4.tgz#eade37b69d2233b3068c6d11a970de6252a6f094"
+ integrity sha512-MPmPRJWTeH03f/NmpN4q3iI3Woik4uaaWIoX34W3gMJiW06Vm1te/lPzuu5EXpXOK7Q2m3FymGMPXcExqih96Q==
dependencies:
"@cloudflare/kv-asset-handler" "^0.4.0"
- "@netlify/functions" "^3.0.2"
+ "@netlify/functions" "^3.1.10"
"@rollup/plugin-alias" "^5.1.1"
- "@rollup/plugin-commonjs" "^28.0.3"
+ "@rollup/plugin-commonjs" "^28.0.6"
"@rollup/plugin-inject" "^5.0.5"
"@rollup/plugin-json" "^6.1.0"
"@rollup/plugin-node-resolve" "^16.0.1"
"@rollup/plugin-replace" "^6.0.2"
"@rollup/plugin-terser" "^0.4.4"
- "@vercel/nft" "^0.29.2"
+ "@vercel/nft" "^0.29.4"
archiver "^7.0.1"
- c12 "^3.0.2"
+ c12 "^3.1.0"
chokidar "^4.0.3"
citty "^0.1.6"
- compatx "^0.1.8"
- confbox "^0.2.1"
+ compatx "^0.2.0"
+ confbox "^0.2.2"
consola "^3.4.2"
cookie-es "^2.0.0"
- croner "^9.0.0"
- crossws "^0.3.4"
- db0 "^0.3.1"
+ croner "^9.1.0"
+ crossws "^0.3.5"
+ db0 "^0.3.2"
defu "^6.1.4"
- destr "^2.0.3"
+ destr "^2.0.5"
dot-prop "^9.0.0"
- esbuild "^0.25.1"
+ esbuild "^0.25.6"
escape-string-regexp "^5.0.0"
etag "^1.8.1"
- exsolve "^1.0.4"
+ exsolve "^1.0.7"
globby "^14.1.0"
gzip-size "^7.0.0"
- h3 "^1.15.1"
+ h3 "^1.15.3"
hookable "^5.5.3"
httpxy "^0.1.7"
- ioredis "^5.6.0"
+ ioredis "^5.6.1"
jiti "^2.4.2"
klona "^2.0.6"
knitwork "^1.2.0"
listhen "^1.9.0"
magic-string "^0.30.17"
magicast "^0.3.5"
- mime "^4.0.6"
+ mime "^4.0.7"
mlly "^1.7.4"
node-fetch-native "^1.6.6"
- node-mock-http "^1.0.0"
+ node-mock-http "^1.0.1"
ofetch "^1.4.1"
ohash "^2.0.11"
pathe "^2.0.3"
perfect-debounce "^1.0.0"
- pkg-types "^2.1.0"
+ pkg-types "^2.2.0"
pretty-bytes "^6.1.1"
radix3 "^1.1.2"
- rollup "^4.36.0"
- rollup-plugin-visualizer "^5.14.0"
+ rollup "^4.45.0"
+ rollup-plugin-visualizer "^6.0.3"
scule "^1.3.0"
- semver "^7.7.1"
+ semver "^7.7.2"
serve-placeholder "^2.0.2"
- serve-static "^1.16.2"
+ serve-static "^2.2.0"
source-map "^0.7.4"
- std-env "^3.8.1"
- ufo "^1.5.4"
- ultrahtml "^1.5.3"
+ std-env "^3.9.0"
+ ufo "^1.6.1"
+ ultrahtml "^1.6.0"
uncrypto "^0.1.3"
unctx "^2.4.1"
- unenv "^2.0.0-rc.15"
- unimport "^4.1.2"
+ unenv "^2.0.0-rc.18"
+ unimport "^5.1.0"
unplugin-utils "^0.2.4"
- unstorage "^1.15.0"
+ unstorage "^1.16.1"
untyped "^2.0.0"
unwasm "^0.3.9"
- youch "^4.1.0-beta.6"
- youch-core "^0.3.2"
+ youch "4.1.0-beta.8"
+ youch-core "^0.3.3"
node-abi@^3.3.0:
- version "3.74.0"
- resolved "https://registry.yarnpkg.com/node-abi/-/node-abi-3.74.0.tgz#5bfb4424264eaeb91432d2adb9da23c63a301ed0"
- integrity sha512-c5XK0MjkGBrQPGYG24GBADZud0NCbznxNx0ZkS+ebUTrmV1qTDxPxSL8zEAPURXSbLRWVexxmP4986BziahL5w==
+ version "3.75.0"
+ resolved "https://registry.yarnpkg.com/node-abi/-/node-abi-3.75.0.tgz#2f929a91a90a0d02b325c43731314802357ed764"
+ integrity sha512-OhYaY5sDsIka7H7AtijtI9jwGYLyl29eQn/W623DiN/MIv5sUqc4g7BIDThX+gb7di9f6xK02nkp8sdfFWZLTg==
dependencies:
semver "^7.3.5"
@@ -5522,10 +6598,15 @@ node-addon-api@^7.0.0:
resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-7.1.1.tgz#1aba6693b0f255258a049d621329329322aad558"
integrity sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==
-node-addon-api@^8.1.0:
- version "8.3.1"
- resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-8.3.1.tgz#53bc8a4f8dbde3de787b9828059da94ba9fd4eed"
- integrity sha512-lytcDEdxKjGJPTLEfW4mYMigRezMlyJY8W4wxJK8zE533Jlb8L8dRuObJFWg2P+AuOIxoCgKF+2Oq4d4Zd0OUA==
+node-addon-api@^8.4.0:
+ version "8.5.0"
+ resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-8.5.0.tgz#c91b2d7682fa457d2e1c388150f0dff9aafb8f3f"
+ integrity sha512-/bRZty2mXUIFY/xU5HLvveNHlswNJej+RnxBjOMkidWfwZzgTbPG1E3K5TOxRLOR+5hX7bSofy8yf1hZevMS8A==
+
+node-domexception@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/node-domexception/-/node-domexception-1.0.0.tgz#6888db46a1f71c0b76b3f7555016b63fe64766e5"
+ integrity sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==
node-fetch-native@^1.6.4, node-fetch-native@^1.6.6:
version "1.6.6"
@@ -5539,31 +6620,42 @@ node-fetch@^2.6.7, node-fetch@^2.7.0:
dependencies:
whatwg-url "^5.0.0"
+node-fetch@^3.0.0:
+ version "3.3.2"
+ resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-3.3.2.tgz#d1e889bacdf733b4ff3b2b243eb7a12866a0b78b"
+ integrity sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==
+ dependencies:
+ data-uri-to-buffer "^4.0.0"
+ fetch-blob "^3.1.4"
+ formdata-polyfill "^4.0.10"
+
node-forge@^1.3.1:
version "1.3.1"
resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-1.3.1.tgz#be8da2af243b2417d5f646a770663a92b7e9ded3"
integrity sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==
-node-graceful-shutdown@^1.1.5:
- version "1.1.5"
- resolved "https://registry.yarnpkg.com/node-graceful-shutdown/-/node-graceful-shutdown-1.1.5.tgz#2c5b405a27d712a409e69b67dfe215d30154faff"
- integrity sha512-tlz8XpPr+pqrEGWFNLtMwd0HdFsCAKp5NCmMvwcTZTA0hyrVd7gkKbivDcSM5uYB1331/cEjNTtmVtqKy8OSBw==
-
-node-gyp-build@^4.2.2, node-gyp-build@^4.8.1:
+node-gyp-build@^4.2.2, node-gyp-build@^4.8.4:
version "4.8.4"
resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.8.4.tgz#8a70ee85464ae52327772a90d66c6077a900cfc8"
integrity sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==
-node-mock-http@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/node-mock-http/-/node-mock-http-1.0.0.tgz#4b32cd509c7f46d844e68ea93fb8be405a18a42a"
- integrity sha512-0uGYQ1WQL1M5kKvGRXWQ3uZCHtLTO8hln3oBjIusM75WoesZ909uQJs/Hb946i2SS+Gsrhkaa6iAO17jRIv6DQ==
+node-mock-http@^1.0.0, node-mock-http@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/node-mock-http/-/node-mock-http-1.0.1.tgz#29b4e0b08d786acadda450e8c159d3e652b3cbfd"
+ integrity sha512-0gJJgENizp4ghds/Ywu2FCmcRsgBTmRQzYPZm61wy+Em2sBarSka0OhQS5huLBg6od1zkNpnWMCZloQDFVvOMQ==
node-releases@^2.0.19:
version "2.0.19"
resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.19.tgz#9e445a52950951ec4d177d843af370b411caf314"
integrity sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==
+node-source-walk@^7.0.1:
+ version "7.0.1"
+ resolved "https://registry.yarnpkg.com/node-source-walk/-/node-source-walk-7.0.1.tgz#3e4ab8d065377228fd038af7b2d4fb58f61defd3"
+ integrity sha512-3VW/8JpPqPvnJvseXowjZcirPisssnBuDikk6JIZ8jQzF7KJQX52iPFX4RYYxLycYH7IbMRSPUOga/esVjy5Yg==
+ dependencies:
+ "@babel/parser" "^7.26.7"
+
nopt@^8.0.0:
version "8.1.0"
resolved "https://registry.yarnpkg.com/nopt/-/nopt-8.1.0.tgz#b11d38caf0f8643ce885818518064127f602eae3"
@@ -5580,7 +6672,14 @@ normalize-package-data@^6.0.0:
semver "^7.3.5"
validate-npm-package-license "^3.0.4"
-normalize-path@^3.0.0:
+normalize-path@^2.1.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9"
+ integrity sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w==
+ dependencies:
+ remove-trailing-separator "^1.0.1"
+
+normalize-path@^3.0.0, normalize-path@~3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65"
integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==
@@ -5590,6 +6689,11 @@ 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==
+normalize-url@^8.0.2:
+ version "8.0.2"
+ resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-8.0.2.tgz#3b343a42f837e4dae2b01917c04e8de3782e9170"
+ integrity sha512-Ee/R3SyN4BuynXcnTaekmaVdbDAEiNrHqjQIA37mHU8G9pf7aaAD4ZX3XjBLo6rsdcxA/gtkcNYZLt30ACgynw==
+
npm-run-path@^5.1.0:
version "5.3.0"
resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-5.3.0.tgz#e23353d0ebb9317f174e93417e4a4d82d0249e9f"
@@ -5634,39 +6738,37 @@ nuxt-security@2.2.0:
unplugin-remove "^1.0.3"
xss "^1.0.14"
-nuxt@^3.16.2:
- version "3.16.2"
- resolved "https://registry.yarnpkg.com/nuxt/-/nuxt-3.16.2.tgz#d25211e3026754993bb770a0c6f2af939ff4ecdf"
- integrity sha512-yjIC/C4HW8Pd+m0ACGliEF0HnimXYGYvUzjOsTiLQKkDDt2T+djyZ+pCl9BfhQBA8rYmnsym2jUI+ubjv1iClw==
+nuxt@^3.17.4:
+ version "3.17.7"
+ resolved "https://registry.yarnpkg.com/nuxt/-/nuxt-3.17.7.tgz#1b5f43dbbe86052b4ca45be376ebb392ed4401d8"
+ integrity sha512-1xl1HcKIbDHpNMW6pXhVhSM5Po51FW14mooyw5ZK5G+wMb0P+uzI/f7xmlaRkBv5Q8ZzUIH6gVUh3KyiucLn+w==
dependencies:
- "@nuxt/cli" "^3.24.0"
+ "@nuxt/cli" "^3.25.1"
"@nuxt/devalue" "^2.0.2"
- "@nuxt/devtools" "^2.3.2"
- "@nuxt/kit" "3.16.2"
- "@nuxt/schema" "3.16.2"
+ "@nuxt/devtools" "^2.6.2"
+ "@nuxt/kit" "3.17.7"
+ "@nuxt/schema" "3.17.7"
"@nuxt/telemetry" "^2.6.6"
- "@nuxt/vite-builder" "3.16.2"
- "@oxc-parser/wasm" "^0.60.0"
- "@unhead/vue" "^2.0.2"
- "@vue/shared" "^3.5.13"
- c12 "^3.0.2"
+ "@nuxt/vite-builder" "3.17.7"
+ "@unhead/vue" "^2.0.12"
+ "@vue/shared" "^3.5.17"
+ c12 "^3.0.4"
chokidar "^4.0.3"
- compatx "^0.1.8"
+ compatx "^0.2.0"
consola "^3.4.2"
cookie-es "^2.0.0"
defu "^6.1.4"
- destr "^2.0.3"
+ destr "^2.0.5"
devalue "^5.1.1"
errx "^0.1.0"
- esbuild "^0.25.2"
+ esbuild "^0.25.6"
escape-string-regexp "^5.0.0"
estree-walker "^3.0.3"
- exsolve "^1.0.4"
- globby "^14.1.0"
- h3 "^1.15.1"
+ exsolve "^1.0.7"
+ h3 "^1.15.3"
hookable "^5.5.3"
- ignore "^7.0.3"
- impound "^0.2.2"
+ ignore "^7.0.5"
+ impound "^1.0.0"
jiti "^2.4.2"
klona "^2.0.6"
knitwork "^1.2.0"
@@ -5674,34 +6776,34 @@ nuxt@^3.16.2:
mlly "^1.7.4"
mocked-exports "^0.1.1"
nanotar "^0.2.0"
- nitropack "^2.11.8"
+ nitropack "^2.11.13"
nypm "^0.6.0"
ofetch "^1.4.1"
ohash "^2.0.11"
on-change "^5.0.1"
- oxc-parser "^0.56.3"
+ oxc-parser "^0.76.0"
pathe "^2.0.3"
perfect-debounce "^1.0.0"
- pkg-types "^2.1.0"
+ pkg-types "^2.2.0"
radix3 "^1.1.2"
scule "^1.3.0"
- semver "^7.7.1"
- std-env "^3.8.1"
+ semver "^7.7.2"
+ std-env "^3.9.0"
strip-literal "^3.0.0"
- tinyglobby "0.2.12"
- ufo "^1.5.4"
- ultrahtml "^1.5.3"
+ tinyglobby "0.2.14"
+ ufo "^1.6.1"
+ ultrahtml "^1.6.0"
uncrypto "^0.1.3"
unctx "^2.4.1"
- unimport "^4.1.3"
- unplugin "^2.2.2"
- unplugin-vue-router "^0.12.0"
- unstorage "^1.15.0"
+ unimport "^5.1.0"
+ unplugin "^2.3.5"
+ unplugin-vue-router "^0.14.0"
+ unstorage "^1.16.0"
untyped "^2.0.0"
- vue "^3.5.13"
+ vue "^3.5.17"
vue-bundle-renderer "^2.1.1"
vue-devtools-stub "^0.1.0"
- vue-router "^4.5.0"
+ vue-router "^4.5.1"
nypm@^0.6.0:
version "0.6.0"
@@ -5714,6 +6816,11 @@ nypm@^0.6.0:
pkg-types "^2.0.0"
tinyexec "^0.3.2"
+object-inspect@^1.13.3:
+ version "1.13.4"
+ resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.4.tgz#8375265e21bc20d0fa582c22e1b13485d6e00213"
+ integrity sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==
+
ofetch@^1.3.3, ofetch@^1.4.1:
version "1.4.1"
resolved "https://registry.yarnpkg.com/ofetch/-/ofetch-1.4.1.tgz#b6bf6b0d75ba616cef6519dd8b6385a8bae480ec"
@@ -5723,12 +6830,7 @@ ofetch@^1.3.3, ofetch@^1.4.1:
node-fetch-native "^1.6.4"
ufo "^1.5.4"
-ohash@^1.1.4:
- version "1.1.6"
- resolved "https://registry.yarnpkg.com/ohash/-/ohash-1.1.6.tgz#9ff7b0271d7076290794537d68ec2b40a60d133e"
- integrity sha512-TBu7PtV8YkAZn0tSxobKY2n2aAQva936lhRrj6957aDaCf9IEtqsKbgMzXE/F/sjqYOwmrukeORHNLe5glk7Cg==
-
-ohash@^2.0.11, ohash@^2.0.4, ohash@^2.0.5:
+ohash@^2.0.0, ohash@^2.0.11:
version "2.0.11"
resolved "https://registry.yarnpkg.com/ohash/-/ohash-2.0.11.tgz#60b11e8cff62ca9dee88d13747a5baa145f5900b"
integrity sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ==
@@ -5738,7 +6840,12 @@ on-change@^5.0.1:
resolved "https://registry.yarnpkg.com/on-change/-/on-change-5.0.1.tgz#ced60d262211eee41043e7479515b4875d1744ef"
integrity sha512-n7THCP7RkyReRSLkJb8kUWoNsxUIBxTkIp3JKno+sEz6o/9AJ3w3P9fzQkITEkMwyTKJjZciF3v/pVoouxZZMg==
-on-finished@2.4.1:
+on-exit-leak-free@^2.1.0:
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/on-exit-leak-free/-/on-exit-leak-free-2.1.2.tgz#fed195c9ebddb7d9e4c3842f93f281ac8dadd3b8"
+ integrity sha512-0eJJY6hXLGf1udHwfNftBqH+g73EU4B504nZeKpz1sYRKafAghwxEJunB2O7rDZkL4PGfsMVnTXZ2EjibbqcsA==
+
+on-finished@^2.4.1:
version "2.4.1"
resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.4.1.tgz#58c8c44116e54845ad57f14ab10b03533184ac3f"
integrity sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==
@@ -5752,6 +6859,13 @@ once@^1.3.1, once@^1.4.0:
dependencies:
wrappy "1"
+one-time@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/one-time/-/one-time-1.0.0.tgz#e06bc174aed214ed58edede573b433bbf827cb45"
+ integrity sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g==
+ dependencies:
+ fn.name "1.x.x"
+
onetime@^6.0.0:
version "6.0.0"
resolved "https://registry.yarnpkg.com/onetime/-/onetime-6.0.0.tgz#7c24c18ed1fd2e9bca4bd26806a33613c77d34b4"
@@ -5759,17 +6873,17 @@ onetime@^6.0.0:
dependencies:
mimic-fn "^4.0.0"
-open@^10.1.0:
- version "10.1.0"
- resolved "https://registry.yarnpkg.com/open/-/open-10.1.0.tgz#a7795e6e5d519abe4286d9937bb24b51122598e1"
- integrity sha512-mnkeQ1qP5Ue2wd+aivTD3NHd/lZ96Lu0jgf0pwktLPtx6cTZiH7tyeGRRHs0zX0rbrahXPnXlUnbeXyaBBuIaw==
+open@^10.1.2:
+ version "10.2.0"
+ resolved "https://registry.yarnpkg.com/open/-/open-10.2.0.tgz#b9d855be007620e80b6fb05fac98141fe62db73c"
+ integrity sha512-YgBpdJHPyQ2UE5x+hlSXcnejzAvD0b22U2OuAP+8OnlJT+PjWPxtgmGqKKc+RgTM63U9gN0YzrYc71R2WT/hTA==
dependencies:
default-browser "^5.2.1"
define-lazy-prop "^3.0.0"
is-inside-container "^1.0.0"
- is-wsl "^3.1.0"
+ wsl-utils "^0.1.0"
-open@^8.4.0:
+open@^8.0.0:
version "8.4.2"
resolved "https://registry.yarnpkg.com/open/-/open-8.4.2.tgz#5b5ffe2a8f793dcd2aad73e550cb87b59cb084f9"
integrity sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==
@@ -5790,23 +6904,57 @@ optionator@^0.9.3:
type-check "^0.4.0"
word-wrap "^1.2.5"
-oxc-parser@^0.56.3:
- version "0.56.5"
- resolved "https://registry.yarnpkg.com/oxc-parser/-/oxc-parser-0.56.5.tgz#1b8763325d6c3d215af72ee46462d65695f845ca"
- integrity sha512-MNT32sqiTFeSbQZP2WZIRQ/mlIpNNq4sua+/4hBG4qT5aef2iQe+1/BjezZURPlvucZeSfN1Y6b60l7OgBdyUA==
+oxc-parser@^0.70.0:
+ version "0.70.0"
+ resolved "https://registry.yarnpkg.com/oxc-parser/-/oxc-parser-0.70.0.tgz#695586d0fa2a245a6bde6891a626ecb4d552b503"
+ integrity sha512-YbqTuQDDIYwQF/li0VFK5uTbmHV4jWFeQQONkPdf77vz+JMiq7SusmcSVZ4hBrGM+3WyLdKH5S7spnvz4XVVzQ==
dependencies:
- "@oxc-project/types" "^0.56.5"
+ "@oxc-project/types" "^0.70.0"
optionalDependencies:
- "@oxc-parser/binding-darwin-arm64" "0.56.5"
- "@oxc-parser/binding-darwin-x64" "0.56.5"
- "@oxc-parser/binding-linux-arm-gnueabihf" "0.56.5"
- "@oxc-parser/binding-linux-arm64-gnu" "0.56.5"
- "@oxc-parser/binding-linux-arm64-musl" "0.56.5"
- "@oxc-parser/binding-linux-x64-gnu" "0.56.5"
- "@oxc-parser/binding-linux-x64-musl" "0.56.5"
- "@oxc-parser/binding-wasm32-wasi" "0.56.5"
- "@oxc-parser/binding-win32-arm64-msvc" "0.56.5"
- "@oxc-parser/binding-win32-x64-msvc" "0.56.5"
+ "@oxc-parser/binding-darwin-arm64" "0.70.0"
+ "@oxc-parser/binding-darwin-x64" "0.70.0"
+ "@oxc-parser/binding-freebsd-x64" "0.70.0"
+ "@oxc-parser/binding-linux-arm-gnueabihf" "0.70.0"
+ "@oxc-parser/binding-linux-arm-musleabihf" "0.70.0"
+ "@oxc-parser/binding-linux-arm64-gnu" "0.70.0"
+ "@oxc-parser/binding-linux-arm64-musl" "0.70.0"
+ "@oxc-parser/binding-linux-riscv64-gnu" "0.70.0"
+ "@oxc-parser/binding-linux-s390x-gnu" "0.70.0"
+ "@oxc-parser/binding-linux-x64-gnu" "0.70.0"
+ "@oxc-parser/binding-linux-x64-musl" "0.70.0"
+ "@oxc-parser/binding-wasm32-wasi" "0.70.0"
+ "@oxc-parser/binding-win32-arm64-msvc" "0.70.0"
+ "@oxc-parser/binding-win32-x64-msvc" "0.70.0"
+
+oxc-parser@^0.76.0:
+ version "0.76.0"
+ resolved "https://registry.yarnpkg.com/oxc-parser/-/oxc-parser-0.76.0.tgz#041650d3be1b6f31ee74b5c0f8987a6818fa85fd"
+ integrity sha512-l98B2e9evuhES7zN99rb1QGhbzx25829TJFaKi2j0ib3/K/G5z1FdGYz6HZkrU3U8jdH7v2FC8mX1j2l9JrOUg==
+ dependencies:
+ "@oxc-project/types" "^0.76.0"
+ optionalDependencies:
+ "@oxc-parser/binding-android-arm64" "0.76.0"
+ "@oxc-parser/binding-darwin-arm64" "0.76.0"
+ "@oxc-parser/binding-darwin-x64" "0.76.0"
+ "@oxc-parser/binding-freebsd-x64" "0.76.0"
+ "@oxc-parser/binding-linux-arm-gnueabihf" "0.76.0"
+ "@oxc-parser/binding-linux-arm-musleabihf" "0.76.0"
+ "@oxc-parser/binding-linux-arm64-gnu" "0.76.0"
+ "@oxc-parser/binding-linux-arm64-musl" "0.76.0"
+ "@oxc-parser/binding-linux-riscv64-gnu" "0.76.0"
+ "@oxc-parser/binding-linux-s390x-gnu" "0.76.0"
+ "@oxc-parser/binding-linux-x64-gnu" "0.76.0"
+ "@oxc-parser/binding-linux-x64-musl" "0.76.0"
+ "@oxc-parser/binding-wasm32-wasi" "0.76.0"
+ "@oxc-parser/binding-win32-arm64-msvc" "0.76.0"
+ "@oxc-parser/binding-win32-x64-msvc" "0.76.0"
+
+p-event@^6.0.0:
+ version "6.0.1"
+ resolved "https://registry.yarnpkg.com/p-event/-/p-event-6.0.1.tgz#8f62a1e3616d4bc01fce3abda127e0383ef4715b"
+ integrity sha512-Q6Bekk5wpzW5qIyUP4gdMEujObYstZl6DMMOSenwBvV0BlE5LkDwkjs5yHbZmdCEq2o4RJx4tE1vwxFVf2FG1w==
+ dependencies:
+ p-timeout "^6.1.2"
p-limit@^3.0.2:
version "3.1.0"
@@ -5836,22 +6984,32 @@ p-locate@^6.0.0:
dependencies:
p-limit "^4.0.0"
+p-map@^7.0.0, p-map@^7.0.3:
+ version "7.0.3"
+ resolved "https://registry.yarnpkg.com/p-map/-/p-map-7.0.3.tgz#7ac210a2d36f81ec28b736134810f7ba4418cdb6"
+ integrity sha512-VkndIv2fIB99swvQoA65bm+fsmt6UNdGeIB0oxBs+WhAhdh08QA04JXpI7rbB9r08/nkbysKoya9rtDERYOYMA==
+
+p-timeout@^6.0.0, p-timeout@^6.1.2:
+ version "6.1.4"
+ resolved "https://registry.yarnpkg.com/p-timeout/-/p-timeout-6.1.4.tgz#418e1f4dd833fa96a2e3f532547dd2abdb08dbc2"
+ integrity sha512-MyIV3ZA/PmyBN/ud8vV9XzwTrNtR4jFrObymZYnZqMmW0zA8Z17vnT0rBgFE/TlohB+YCHqXMgZzb3Csp49vqg==
+
+p-wait-for@^5.0.0:
+ version "5.0.2"
+ resolved "https://registry.yarnpkg.com/p-wait-for/-/p-wait-for-5.0.2.tgz#1546a15e64accf1897377cb1507fa4c756fffe96"
+ integrity sha512-lwx6u1CotQYPVju77R+D0vFomni/AqRfqLmqQ8hekklqZ6gAY9rONh7lBQ0uxWMkC2AuX9b2DVAl8To0NyP1JA==
+ dependencies:
+ p-timeout "^6.0.0"
+
package-json-from-dist@^1.0.0:
version "1.0.1"
resolved "https://registry.yarnpkg.com/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz#4f1471a010827a86f94cfd9b0727e36d267de505"
integrity sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==
-package-manager-detector@^0.2.8:
- version "0.2.11"
- resolved "https://registry.yarnpkg.com/package-manager-detector/-/package-manager-detector-0.2.11.tgz#3af0b34f99d86d24af0a0620603d2e1180d05c9c"
- integrity sha512-BEnLolu+yuz22S56CU1SUKq3XC3PkwD5wv4ikR4MfGvnRVcmzXR9DwSlW2fEamyTPyXHomBJRzgapeuBvRNzJQ==
- dependencies:
- quansync "^0.2.7"
-
-package-manager-detector@^1.1.0:
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/package-manager-detector/-/package-manager-detector-1.1.0.tgz#2c9f19adb9835d0b9e9baaab484a020d4ee07b87"
- integrity sha512-Y8f9qUlBzW8qauJjd/eu6jlpJZsuPJm2ZAV0cDVd420o4EdpH5RPdoCv+60/TdJflGatr4sDfpAL6ArWZbM5tA==
+package-manager-detector@^1.1.0, package-manager-detector@^1.3.0:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/package-manager-detector/-/package-manager-detector-1.3.0.tgz#b42d641c448826e03c2b354272456a771ce453c0"
+ integrity sha512-ZsEbbZORsyHuO00lY1kV3/t72yp6Ysay6Pd17ZAlNGuGwmWDLCJxFpRs0IzfXfj1o4icJOkUEioexFHzyPurSQ==
pako@^0.2.5:
version "0.2.9"
@@ -5865,35 +7023,39 @@ parent-module@^1.0.0:
dependencies:
callsites "^3.0.0"
-parse-imports@^2.1.1:
- version "2.2.1"
- resolved "https://registry.yarnpkg.com/parse-imports/-/parse-imports-2.2.1.tgz#0a6e8b5316beb5c9905f50eb2bbb8c64a4805642"
- integrity sha512-OL/zLggRp8mFhKL0rNORUTR4yBYujK/uU+xZL+/0Rgm2QE4nLO9v8PzEweSJEbMGKmDRjJE4R3IMJlL2di4JeQ==
+parse-gitignore@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/parse-gitignore/-/parse-gitignore-2.0.0.tgz#81156b265115c507129f3faea067b8476da3b642"
+ integrity sha512-RmVuCHWsfu0QPNW+mraxh/xjQVw/lhUCUru8Zni3Ctq3AoMhpDTq0OVdKS6iesd6Kqb7viCV3isAL43dciOSog==
+
+parse-imports-exports@^0.2.4:
+ version "0.2.4"
+ resolved "https://registry.yarnpkg.com/parse-imports-exports/-/parse-imports-exports-0.2.4.tgz#e3fb3b5e264cfb55c25b5dfcbe7f410f8dc4e7af"
+ integrity sha512-4s6vd6dx1AotCx/RCI2m7t7GCh5bDRUtGNvRfHSP2wbBQdMi67pPe7mtzmgwcaQ8VKK/6IB7Glfyu3qdZJPybQ==
dependencies:
- es-module-lexer "^1.5.3"
- slashes "^3.0.12"
+ parse-statements "1.0.11"
parse-json@^8.0.0:
- version "8.2.0"
- resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-8.2.0.tgz#794a590dcf54588ec2282ce6065f15121fa348a0"
- integrity sha512-eONBZy4hm2AgxjNFd8a4nyDJnzUAH0g34xSQAwWEVGCjdZ4ZL7dKZBfq267GWP/JaS9zW62Xs2FeAdDvpHHJGQ==
+ version "8.3.0"
+ resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-8.3.0.tgz#88a195a2157025139a2317a4f2f9252b61304ed5"
+ integrity sha512-ybiGyvspI+fAoRQbIPRddCcSTV9/LsJbf0e/S85VLowVGzRmokfneg2kwVW/KU5rOXrPSbF1qAKPMgNTqqROQQ==
dependencies:
"@babel/code-frame" "^7.26.2"
- index-to-position "^1.0.0"
- type-fest "^4.37.0"
+ index-to-position "^1.1.0"
+ type-fest "^4.39.1"
-parse-ms@^4.0.0:
- version "4.0.0"
- resolved "https://registry.yarnpkg.com/parse-ms/-/parse-ms-4.0.0.tgz#c0c058edd47c2a590151a718990533fd62803df4"
- integrity sha512-TXfryirbmq34y8QBwgqCVLi+8oA3oWx2eAnSn62ITyEhEYaWRlVZ2DvMM9eZbMs/RfxPu/PK/aBLyGj4IrqMHw==
-
-parse-path@^7.0.0:
- version "7.0.1"
- resolved "https://registry.yarnpkg.com/parse-path/-/parse-path-7.0.1.tgz#ae548cd36315fd8881a3610eae99fa08123ee0e2"
- integrity sha512-6ReLMptznuuOEzLoGEa+I1oWRSj2Zna5jLWC+l6zlfAI4dbbSaIES29ThzuPkbhNahT65dWzfoZEO6cfJw2Ksg==
+parse-path@*, parse-path@^7.0.0:
+ version "7.1.0"
+ resolved "https://registry.yarnpkg.com/parse-path/-/parse-path-7.1.0.tgz#41fb513cb122831807a4c7b29c8727947a09d8c6"
+ integrity sha512-EuCycjZtfPcjWk7KTksnJ5xPMvWGA/6i4zrLYhRG0hGvC3GPU/jGUj3Cy+ZR0v30duV3e23R95T1lE2+lsndSw==
dependencies:
protocols "^2.0.0"
+parse-statements@1.0.11:
+ version "1.0.11"
+ resolved "https://registry.yarnpkg.com/parse-statements/-/parse-statements-1.0.11.tgz#8787c5d383ae5746568571614be72b0689584344"
+ integrity sha512-HlsyYdMBnbPQ9Jr/VgJ1YF4scnldvJpJxCVx6KgqPL4dxppsWrJHCIIxQXMJrqGnsRkNPATbeMJ8Yxu7JMsYcA==
+
parse-url@^9.2.0:
version "9.2.0"
resolved "https://registry.yarnpkg.com/parse-url/-/parse-url-9.2.0.tgz#d75da32b3bbade66e4eb0763fb4851d27526b97b"
@@ -5902,7 +7064,29 @@ parse-url@^9.2.0:
"@types/parse-path" "^7.0.0"
parse-path "^7.0.0"
-parseurl@~1.3.3:
+parse5-htmlparser2-tree-adapter@^7.1.0:
+ version "7.1.0"
+ resolved "https://registry.yarnpkg.com/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.1.0.tgz#b5a806548ed893a43e24ccb42fbb78069311e81b"
+ integrity sha512-ruw5xyKs6lrpo9x9rCZqZZnIUntICjQAd0Wsmp396Ul9lN/h+ifgVV1x1gZHi8euej6wTfpqX8j+BFQxF0NS/g==
+ dependencies:
+ domhandler "^5.0.3"
+ parse5 "^7.0.0"
+
+parse5-parser-stream@^7.1.2:
+ version "7.1.2"
+ resolved "https://registry.yarnpkg.com/parse5-parser-stream/-/parse5-parser-stream-7.1.2.tgz#d7c20eadc37968d272e2c02660fff92dd27e60e1"
+ integrity sha512-JyeQc9iwFLn5TbvvqACIF/VXG6abODeB3Fwmv/TGdLk2LfbWkaySGY72at4+Ty7EkPZj854u4CrICqNk2qIbow==
+ dependencies:
+ parse5 "^7.0.0"
+
+parse5@^7.0.0, parse5@^7.1.2, parse5@^7.3.0:
+ version "7.3.0"
+ resolved "https://registry.yarnpkg.com/parse5/-/parse5-7.3.0.tgz#d7e224fa72399c7a175099f45fc2ad024b05ec05"
+ integrity sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==
+ dependencies:
+ entities "^6.0.0"
+
+parseurl@^1.3.3:
version "1.3.3"
resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4"
integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==
@@ -5965,6 +7149,11 @@ peek-readable@^5.1.3:
resolved "https://registry.yarnpkg.com/peek-readable/-/peek-readable-5.4.2.tgz#aff1e1ba27a7d6911ddb103f35252ffc1787af49"
integrity sha512-peBp3qZyuS6cNIJ2akRNG1uo1WJ1d0wTxg/fxMdZ0BqCVhx242bSFHM9eNqflfJVS9SsgkzgT/1UgnsurBOTMg==
+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==
+
perfect-debounce@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/perfect-debounce/-/perfect-debounce-1.0.0.tgz#9c2e8bc30b169cc984a58b7d5b28049839591d2a"
@@ -5975,15 +7164,63 @@ picocolors@^1.0.0, picocolors@^1.1.1:
resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.1.1.tgz#3d321af3eab939b083c8f929a1d12cda81c26b6b"
integrity sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==
-picomatch@^2.0.4, picomatch@^2.3.1:
+picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.3.1:
version "2.3.1"
resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42"
integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==
-picomatch@^4.0.2:
- version "4.0.2"
- resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-4.0.2.tgz#77c742931e8f3b8820946c76cd0c1f13730d1dab"
- integrity sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==
+picomatch@^4.0.2, picomatch@^4.0.3:
+ version "4.0.3"
+ resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-4.0.3.tgz#796c76136d1eead715db1e7bad785dedd695a042"
+ integrity sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==
+
+pino-abstract-transport@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/pino-abstract-transport/-/pino-abstract-transport-2.0.0.tgz#de241578406ac7b8a33ce0d77ae6e8a0b3b68a60"
+ integrity sha512-F63x5tizV6WCh4R6RHyi2Ml+M70DNRXt/+HANowMflpgGFMAym/VKm6G7ZOQRjqN7XbGxK1Lg9t6ZrtzOaivMw==
+ dependencies:
+ split2 "^4.0.0"
+
+pino-pretty@^13.0.0:
+ version "13.0.0"
+ resolved "https://registry.yarnpkg.com/pino-pretty/-/pino-pretty-13.0.0.tgz#21d57fe940e34f2e279905d7dba2d7e2c4f9bf17"
+ integrity sha512-cQBBIVG3YajgoUjo1FdKVRX6t9XPxwB9lcNJVD5GCnNM4Y6T12YYx8c6zEejxQsU0wrg9TwmDulcE9LR7qcJqA==
+ dependencies:
+ colorette "^2.0.7"
+ dateformat "^4.6.3"
+ fast-copy "^3.0.2"
+ fast-safe-stringify "^2.1.1"
+ help-me "^5.0.0"
+ joycon "^3.1.1"
+ minimist "^1.2.6"
+ on-exit-leak-free "^2.1.0"
+ pino-abstract-transport "^2.0.0"
+ pump "^3.0.0"
+ secure-json-parse "^2.4.0"
+ sonic-boom "^4.0.1"
+ strip-json-comments "^3.1.1"
+
+pino-std-serializers@^7.0.0:
+ version "7.0.0"
+ resolved "https://registry.yarnpkg.com/pino-std-serializers/-/pino-std-serializers-7.0.0.tgz#7c625038b13718dbbd84ab446bd673dc52259e3b"
+ integrity sha512-e906FRY0+tV27iq4juKzSYPbUj2do2X2JX4EzSca1631EB2QJQUqGbDuERal7LCtOpxl6x3+nvo9NPZcmjkiFA==
+
+pino@^9.7.0:
+ version "9.7.0"
+ resolved "https://registry.yarnpkg.com/pino/-/pino-9.7.0.tgz#ff7cd86eb3103ee620204dbd5ca6ffda8b53f645"
+ integrity sha512-vnMCM6xZTb1WDmLvtG2lE/2p+t9hDEIvTWJsu6FejkE62vB7gDhvzrpFR4Cw2to+9JNQxVnkAKVPA1KPB98vWg==
+ dependencies:
+ atomic-sleep "^1.0.0"
+ fast-redact "^3.1.1"
+ on-exit-leak-free "^2.1.0"
+ pino-abstract-transport "^2.0.0"
+ pino-std-serializers "^7.0.0"
+ process-warning "^5.0.0"
+ quick-format-unescaped "^4.0.3"
+ real-require "^0.2.0"
+ safe-stable-stringify "^2.3.1"
+ sonic-boom "^4.0.1"
+ thread-stream "^3.0.0"
pkg-types@^1.0.3, pkg-types@^1.3.0:
version "1.3.1"
@@ -5994,13 +7231,13 @@ pkg-types@^1.0.3, pkg-types@^1.3.0:
mlly "^1.7.4"
pathe "^2.0.1"
-pkg-types@^2.0.0, pkg-types@^2.0.1, pkg-types@^2.1.0:
- version "2.1.0"
- resolved "https://registry.yarnpkg.com/pkg-types/-/pkg-types-2.1.0.tgz#70c9e1b9c74b63fdde749876ee0aa007ea9edead"
- integrity sha512-wmJwA+8ihJixSoHKxZJRBQG1oY8Yr9pGLzRmSsNms0iNWyHHAlZCa7mmKiFR10YPZuz/2k169JiS/inOjBCZ2A==
+pkg-types@^2.0.0, pkg-types@^2.0.1, pkg-types@^2.2.0:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/pkg-types/-/pkg-types-2.2.0.tgz#049bf404f82a66c465200149457acf0c5fb0fb2d"
+ integrity sha512-2SM/GZGAEkPp3KWORxQZns4M+WSeXbC2HEvmOIJe3Cmiv6ieAJvdVhDldtHqM5J1Y7MrR1XhkBT/rMlhh9FdqQ==
dependencies:
- confbox "^0.2.1"
- exsolve "^1.0.1"
+ confbox "^0.2.2"
+ exsolve "^1.0.7"
pathe "^2.0.3"
pluralize@^8.0.0:
@@ -6008,7 +7245,7 @@ pluralize@^8.0.0:
resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-8.0.0.tgz#1a6fa16a38d12a1901e0320fa017051c539ce3b1"
integrity sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==
-postcss-calc@^10.0.2:
+postcss-calc@^10.1.1:
version "10.1.1"
resolved "https://registry.yarnpkg.com/postcss-calc/-/postcss-calc-10.1.1.tgz#52b385f2e628239686eb6e3a16207a43f36064ca"
integrity sha512-NYEsLHh8DgG/PRH2+G9BTuUdtf9ViS+vdoQ0YA5OQdGsfN4ztiwtDWNtBl9EKeqNMFnIu8IKZ0cLxEQ5r5KVMw==
@@ -6016,179 +7253,179 @@ postcss-calc@^10.0.2:
postcss-selector-parser "^7.0.0"
postcss-value-parser "^4.2.0"
-postcss-colormin@^7.0.2:
- version "7.0.2"
- resolved "https://registry.yarnpkg.com/postcss-colormin/-/postcss-colormin-7.0.2.tgz#6f3c53c13158168669f45adc3926f35cb240ef8e"
- integrity sha512-YntRXNngcvEvDbEjTdRWGU606eZvB5prmHG4BF0yLmVpamXbpsRJzevyy6MZVyuecgzI2AWAlvFi8DAeCqwpvA==
+postcss-colormin@^7.0.4:
+ version "7.0.4"
+ resolved "https://registry.yarnpkg.com/postcss-colormin/-/postcss-colormin-7.0.4.tgz#12b5ed701bc860d58e5267a51679415939563bdb"
+ integrity sha512-ziQuVzQZBROpKpfeDwmrG+Vvlr0YWmY/ZAk99XD+mGEBuEojoFekL41NCsdhyNUtZI7DPOoIWIR7vQQK9xwluw==
dependencies:
- browserslist "^4.23.3"
+ browserslist "^4.25.1"
caniuse-api "^3.0.0"
colord "^2.9.3"
postcss-value-parser "^4.2.0"
-postcss-convert-values@^7.0.4:
- version "7.0.4"
- resolved "https://registry.yarnpkg.com/postcss-convert-values/-/postcss-convert-values-7.0.4.tgz#fc13ecedded6365f3c794b502dbcf77d298da12c"
- integrity sha512-e2LSXPqEHVW6aoGbjV9RsSSNDO3A0rZLCBxN24zvxF25WknMPpX8Dm9UxxThyEbaytzggRuZxaGXqaOhxQ514Q==
+postcss-convert-values@^7.0.6:
+ version "7.0.6"
+ resolved "https://registry.yarnpkg.com/postcss-convert-values/-/postcss-convert-values-7.0.6.tgz#aece10411e05409c221263cd77deb4e6ad2c483e"
+ integrity sha512-MD/eb39Mr60hvgrqpXsgbiqluawYg/8K4nKsqRsuDX9f+xN1j6awZCUv/5tLH8ak3vYp/EMXwdcnXvfZYiejCQ==
dependencies:
- browserslist "^4.23.3"
+ browserslist "^4.25.1"
postcss-value-parser "^4.2.0"
-postcss-discard-comments@^7.0.3:
- version "7.0.3"
- resolved "https://registry.yarnpkg.com/postcss-discard-comments/-/postcss-discard-comments-7.0.3.tgz#9c414e8ee99d3514ad06a3465ccc20ec1dbce780"
- integrity sha512-q6fjd4WU4afNhWOA2WltHgCbkRhZPgQe7cXF74fuVB/ge4QbM9HEaOIzGSiMvM+g/cOsNAUGdf2JDzqA2F8iLA==
+postcss-discard-comments@^7.0.4:
+ version "7.0.4"
+ resolved "https://registry.yarnpkg.com/postcss-discard-comments/-/postcss-discard-comments-7.0.4.tgz#9aded15cf437d14ee02b7589ee911b780cd73ffb"
+ integrity sha512-6tCUoql/ipWwKtVP/xYiFf1U9QgJ0PUvxN7pTcsQ8Ns3Fnwq1pU5D5s1MhT/XySeLq6GXNvn37U46Ded0TckWg==
dependencies:
- postcss-selector-parser "^6.1.2"
+ postcss-selector-parser "^7.1.0"
-postcss-discard-duplicates@^7.0.1:
+postcss-discard-duplicates@^7.0.2:
+ version "7.0.2"
+ resolved "https://registry.yarnpkg.com/postcss-discard-duplicates/-/postcss-discard-duplicates-7.0.2.tgz#9cf3e659d4f94b046eef6f93679490c0250a8e4e"
+ integrity sha512-eTonaQvPZ/3i1ASDHOKkYwAybiM45zFIc7KXils4mQmHLqIswXD9XNOKEVxtTFnsmwYzF66u4LMgSr0abDlh5w==
+
+postcss-discard-empty@^7.0.1:
version "7.0.1"
- resolved "https://registry.yarnpkg.com/postcss-discard-duplicates/-/postcss-discard-duplicates-7.0.1.tgz#f87f2fe47d8f01afb1e98361c1db3ce1e8afd1a3"
- integrity sha512-oZA+v8Jkpu1ct/xbbrntHRsfLGuzoP+cpt0nJe5ED2FQF8n8bJtn7Bo28jSmBYwqgqnqkuSXJfSUEE7if4nClQ==
+ resolved "https://registry.yarnpkg.com/postcss-discard-empty/-/postcss-discard-empty-7.0.1.tgz#b6c57e8b5c69023169abea30dceb93f98a2ffd9f"
+ integrity sha512-cFrJKZvcg/uxB6Ijr4l6qmn3pXQBna9zyrPC+sK0zjbkDUZew+6xDltSF7OeB7rAtzaaMVYSdbod+sZOCWnMOg==
-postcss-discard-empty@^7.0.0:
- version "7.0.0"
- resolved "https://registry.yarnpkg.com/postcss-discard-empty/-/postcss-discard-empty-7.0.0.tgz#218829d1ef0a5d5142dd62f0aa60e00e599d2033"
- integrity sha512-e+QzoReTZ8IAwhnSdp/++7gBZ/F+nBq9y6PomfwORfP7q9nBpK5AMP64kOt0bA+lShBFbBDcgpJ3X4etHg4lzA==
+postcss-discard-overridden@^7.0.1:
+ version "7.0.1"
+ resolved "https://registry.yarnpkg.com/postcss-discard-overridden/-/postcss-discard-overridden-7.0.1.tgz#bd9c9bc5e4548d3b6e67e7f8d64f2c9d745ae2a0"
+ integrity sha512-7c3MMjjSZ/qYrx3uc1940GSOzN1Iqjtlqe8uoSg+qdVPYyRb0TILSqqmtlSFuE4mTDECwsm397Ya7iXGzfF7lg==
-postcss-discard-overridden@^7.0.0:
- version "7.0.0"
- resolved "https://registry.yarnpkg.com/postcss-discard-overridden/-/postcss-discard-overridden-7.0.0.tgz#b123ea51e3d4e1d0a254cf71eaff1201926d319c"
- integrity sha512-GmNAzx88u3k2+sBTZrJSDauR0ccpE24omTQCVmaTTZFz1du6AasspjaUPMJ2ud4RslZpoFKyf+6MSPETLojc6w==
-
-postcss-merge-longhand@^7.0.4:
- version "7.0.4"
- resolved "https://registry.yarnpkg.com/postcss-merge-longhand/-/postcss-merge-longhand-7.0.4.tgz#a52d0662b4b29420f3b64a8d5b0ac5133d8db776"
- integrity sha512-zer1KoZA54Q8RVHKOY5vMke0cCdNxMP3KBfDerjH/BYHh4nCIh+1Yy0t1pAEQF18ac/4z3OFclO+ZVH8azjR4A==
+postcss-merge-longhand@^7.0.5:
+ version "7.0.5"
+ resolved "https://registry.yarnpkg.com/postcss-merge-longhand/-/postcss-merge-longhand-7.0.5.tgz#e1b126e92f583815482e8b1e82c47d2435a20421"
+ integrity sha512-Kpu5v4Ys6QI59FxmxtNB/iHUVDn9Y9sYw66D6+SZoIk4QTz1prC4aYkhIESu+ieG1iylod1f8MILMs1Em3mmIw==
dependencies:
postcss-value-parser "^4.2.0"
- stylehacks "^7.0.4"
+ stylehacks "^7.0.5"
-postcss-merge-rules@^7.0.4:
- version "7.0.4"
- resolved "https://registry.yarnpkg.com/postcss-merge-rules/-/postcss-merge-rules-7.0.4.tgz#648cc864d3121e6ec72c2a4f08df1cc801e60ce8"
- integrity sha512-ZsaamiMVu7uBYsIdGtKJ64PkcQt6Pcpep/uO90EpLS3dxJi6OXamIobTYcImyXGoW0Wpugh7DSD3XzxZS9JCPg==
+postcss-merge-rules@^7.0.6:
+ version "7.0.6"
+ resolved "https://registry.yarnpkg.com/postcss-merge-rules/-/postcss-merge-rules-7.0.6.tgz#f5a0cabf6423b1370ba76d5363dfe44776f1e619"
+ integrity sha512-2jIPT4Tzs8K87tvgCpSukRQ2jjd+hH6Bb8rEEOUDmmhOeTcqDg5fEFK8uKIu+Pvc3//sm3Uu6FRqfyv7YF7+BQ==
dependencies:
- browserslist "^4.23.3"
+ browserslist "^4.25.1"
caniuse-api "^3.0.0"
- cssnano-utils "^5.0.0"
- postcss-selector-parser "^6.1.2"
+ cssnano-utils "^5.0.1"
+ postcss-selector-parser "^7.1.0"
-postcss-minify-font-values@^7.0.0:
- version "7.0.0"
- resolved "https://registry.yarnpkg.com/postcss-minify-font-values/-/postcss-minify-font-values-7.0.0.tgz#d16a75a2548e000779566b3568fc874ee5d0aa17"
- integrity sha512-2ckkZtgT0zG8SMc5aoNwtm5234eUx1GGFJKf2b1bSp8UflqaeFzR50lid4PfqVI9NtGqJ2J4Y7fwvnP/u1cQog==
+postcss-minify-font-values@^7.0.1:
+ version "7.0.1"
+ resolved "https://registry.yarnpkg.com/postcss-minify-font-values/-/postcss-minify-font-values-7.0.1.tgz#6fb4770131b31fd5a2014bd84e32f386a3406664"
+ integrity sha512-2m1uiuJeTplll+tq4ENOQSzB8LRnSUChBv7oSyFLsJRtUgAAJGP6LLz0/8lkinTgxrmJSPOEhgY1bMXOQ4ZXhQ==
dependencies:
postcss-value-parser "^4.2.0"
-postcss-minify-gradients@^7.0.0:
- version "7.0.0"
- resolved "https://registry.yarnpkg.com/postcss-minify-gradients/-/postcss-minify-gradients-7.0.0.tgz#f6d84456e6d49164a55d0e45bb1b1809c6cf0959"
- integrity sha512-pdUIIdj/C93ryCHew0UgBnL2DtUS3hfFa5XtERrs4x+hmpMYGhbzo6l/Ir5de41O0GaKVpK1ZbDNXSY6GkXvtg==
+postcss-minify-gradients@^7.0.1:
+ version "7.0.1"
+ resolved "https://registry.yarnpkg.com/postcss-minify-gradients/-/postcss-minify-gradients-7.0.1.tgz#933cb642dd00df397237c17194f37dcbe4cad739"
+ integrity sha512-X9JjaysZJwlqNkJbUDgOclyG3jZEpAMOfof6PUZjPnPrePnPG62pS17CjdM32uT1Uq1jFvNSff9l7kNbmMSL2A==
dependencies:
colord "^2.9.3"
- cssnano-utils "^5.0.0"
+ cssnano-utils "^5.0.1"
postcss-value-parser "^4.2.0"
-postcss-minify-params@^7.0.2:
- version "7.0.2"
- resolved "https://registry.yarnpkg.com/postcss-minify-params/-/postcss-minify-params-7.0.2.tgz#264a76e25f202d8b5ca5290569c0e8c3ac599dfe"
- integrity sha512-nyqVLu4MFl9df32zTsdcLqCFfE/z2+f8GE1KHPxWOAmegSo6lpV2GNy5XQvrzwbLmiU7d+fYay4cwto1oNdAaQ==
- dependencies:
- browserslist "^4.23.3"
- cssnano-utils "^5.0.0"
- postcss-value-parser "^4.2.0"
-
-postcss-minify-selectors@^7.0.4:
+postcss-minify-params@^7.0.4:
version "7.0.4"
- resolved "https://registry.yarnpkg.com/postcss-minify-selectors/-/postcss-minify-selectors-7.0.4.tgz#2b69c99ec48a1c223fce4840609d9c53340a11f5"
- integrity sha512-JG55VADcNb4xFCf75hXkzc1rNeURhlo7ugf6JjiiKRfMsKlDzN9CXHZDyiG6x/zGchpjQS+UAgb1d4nqXqOpmA==
+ resolved "https://registry.yarnpkg.com/postcss-minify-params/-/postcss-minify-params-7.0.4.tgz#665848c0674c5ff59e054e63e052339738cbc6a3"
+ integrity sha512-3OqqUddfH8c2e7M35W6zIwv7jssM/3miF9cbCSb1iJiWvtguQjlxZGIHK9JRmc8XAKmE2PFGtHSM7g/VcW97sw==
+ dependencies:
+ browserslist "^4.25.1"
+ cssnano-utils "^5.0.1"
+ postcss-value-parser "^4.2.0"
+
+postcss-minify-selectors@^7.0.5:
+ version "7.0.5"
+ resolved "https://registry.yarnpkg.com/postcss-minify-selectors/-/postcss-minify-selectors-7.0.5.tgz#d8c89eeeb208705ab4127a464d1f54a3bc22cae3"
+ integrity sha512-x2/IvofHcdIrAm9Q+p06ZD1h6FPcQ32WtCRVodJLDR+WMn8EVHI1kvLxZuGKz/9EY5nAmI6lIQIrpo4tBy5+ug==
dependencies:
cssesc "^3.0.0"
- postcss-selector-parser "^6.1.2"
+ postcss-selector-parser "^7.1.0"
-postcss-normalize-charset@^7.0.0:
- version "7.0.0"
- resolved "https://registry.yarnpkg.com/postcss-normalize-charset/-/postcss-normalize-charset-7.0.0.tgz#92244ae73c31bf8f8885d5f16ff69e857ac6c001"
- integrity sha512-ABisNUXMeZeDNzCQxPxBCkXexvBrUHV+p7/BXOY+ulxkcjUZO0cp8ekGBwvIh2LbCwnWbyMPNJVtBSdyhM2zYQ==
-
-postcss-normalize-display-values@^7.0.0:
- version "7.0.0"
- resolved "https://registry.yarnpkg.com/postcss-normalize-display-values/-/postcss-normalize-display-values-7.0.0.tgz#01fb50e5e97ef8935363629bea5a6d3b3aac1342"
- integrity sha512-lnFZzNPeDf5uGMPYgGOw7v0BfB45+irSRz9gHQStdkkhiM0gTfvWkWB5BMxpn0OqgOQuZG/mRlZyJxp0EImr2Q==
- dependencies:
- postcss-value-parser "^4.2.0"
-
-postcss-normalize-positions@^7.0.0:
- version "7.0.0"
- resolved "https://registry.yarnpkg.com/postcss-normalize-positions/-/postcss-normalize-positions-7.0.0.tgz#4eebd7c9d3dde40c97b8047cad38124fc844c463"
- integrity sha512-I0yt8wX529UKIGs2y/9Ybs2CelSvItfmvg/DBIjTnoUSrPxSV7Z0yZ8ShSVtKNaV/wAY+m7bgtyVQLhB00A1NQ==
- dependencies:
- postcss-value-parser "^4.2.0"
-
-postcss-normalize-repeat-style@^7.0.0:
- version "7.0.0"
- resolved "https://registry.yarnpkg.com/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-7.0.0.tgz#0cb784655d5714d29bd3bda6dee2fb628aa7227b"
- integrity sha512-o3uSGYH+2q30ieM3ppu9GTjSXIzOrRdCUn8UOMGNw7Af61bmurHTWI87hRybrP6xDHvOe5WlAj3XzN6vEO8jLw==
- dependencies:
- postcss-value-parser "^4.2.0"
-
-postcss-normalize-string@^7.0.0:
- version "7.0.0"
- resolved "https://registry.yarnpkg.com/postcss-normalize-string/-/postcss-normalize-string-7.0.0.tgz#a119d3e63a9614570d8413d572fb9fc8c6a64e8c"
- integrity sha512-w/qzL212DFVOpMy3UGyxrND+Kb0fvCiBBujiaONIihq7VvtC7bswjWgKQU/w4VcRyDD8gpfqUiBQ4DUOwEJ6Qg==
- dependencies:
- postcss-value-parser "^4.2.0"
-
-postcss-normalize-timing-functions@^7.0.0:
- version "7.0.0"
- resolved "https://registry.yarnpkg.com/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-7.0.0.tgz#99d0ee8c4b23b7f4355fafb91385833b9b07108b"
- integrity sha512-tNgw3YV0LYoRwg43N3lTe3AEWZ66W7Dh7lVEpJbHoKOuHc1sLrzMLMFjP8SNULHaykzsonUEDbKedv8C+7ej6g==
- dependencies:
- postcss-value-parser "^4.2.0"
-
-postcss-normalize-unicode@^7.0.2:
- version "7.0.2"
- resolved "https://registry.yarnpkg.com/postcss-normalize-unicode/-/postcss-normalize-unicode-7.0.2.tgz#095f8d36ea29adfdf494069c1de101112992a713"
- integrity sha512-ztisabK5C/+ZWBdYC+Y9JCkp3M9qBv/XFvDtSw0d/XwfT3UaKeW/YTm/MD/QrPNxuecia46vkfEhewjwcYFjkg==
- dependencies:
- browserslist "^4.23.3"
- postcss-value-parser "^4.2.0"
-
-postcss-normalize-url@^7.0.0:
- version "7.0.0"
- resolved "https://registry.yarnpkg.com/postcss-normalize-url/-/postcss-normalize-url-7.0.0.tgz#c88cb7cf8952d3ff631e4eba924e7b060ca802f6"
- integrity sha512-+d7+PpE+jyPX1hDQZYG+NaFD+Nd2ris6r8fPTBAjE8z/U41n/bib3vze8x7rKs5H1uEw5ppe9IojewouHk0klQ==
- dependencies:
- postcss-value-parser "^4.2.0"
-
-postcss-normalize-whitespace@^7.0.0:
- version "7.0.0"
- resolved "https://registry.yarnpkg.com/postcss-normalize-whitespace/-/postcss-normalize-whitespace-7.0.0.tgz#46b025f0bea72139ddee63015619b0c21cebd845"
- integrity sha512-37/toN4wwZErqohedXYqWgvcHUGlT8O/m2jVkAfAe9Bd4MzRqlBmXrJRePH0e9Wgnz2X7KymTgTOaaFizQe3AQ==
- dependencies:
- postcss-value-parser "^4.2.0"
-
-postcss-ordered-values@^7.0.1:
+postcss-normalize-charset@^7.0.1:
version "7.0.1"
- resolved "https://registry.yarnpkg.com/postcss-ordered-values/-/postcss-ordered-values-7.0.1.tgz#8b4b5b8070ca7756bd49f07d5edf274b8f6782e0"
- integrity sha512-irWScWRL6nRzYmBOXReIKch75RRhNS86UPUAxXdmW/l0FcAsg0lvAXQCby/1lymxn/o0gVa6Rv/0f03eJOwHxw==
+ resolved "https://registry.yarnpkg.com/postcss-normalize-charset/-/postcss-normalize-charset-7.0.1.tgz#bccc3f7c5f4440883608eea8b444c8f41ce55ff6"
+ integrity sha512-sn413ofhSQHlZFae//m9FTOfkmiZ+YQXsbosqOWRiVQncU2BA3daX3n0VF3cG6rGLSFVc5Di/yns0dFfh8NFgQ==
+
+postcss-normalize-display-values@^7.0.1:
+ version "7.0.1"
+ resolved "https://registry.yarnpkg.com/postcss-normalize-display-values/-/postcss-normalize-display-values-7.0.1.tgz#feb40277d89a7f677b67a84cac999f0306e38235"
+ integrity sha512-E5nnB26XjSYz/mGITm6JgiDpAbVuAkzXwLzRZtts19jHDUBFxZ0BkXAehy0uimrOjYJbocby4FVswA/5noOxrQ==
dependencies:
- cssnano-utils "^5.0.0"
postcss-value-parser "^4.2.0"
-postcss-reduce-initial@^7.0.2:
- version "7.0.2"
- resolved "https://registry.yarnpkg.com/postcss-reduce-initial/-/postcss-reduce-initial-7.0.2.tgz#3dc085347a5943e18547d4b0aa5bd4ff5a93b2c5"
- integrity sha512-pOnu9zqQww7dEKf62Nuju6JgsW2V0KRNBHxeKohU+JkHd/GAH5uvoObqFLqkeB2n20mr6yrlWDvo5UBU5GnkfA==
+postcss-normalize-positions@^7.0.1:
+ version "7.0.1"
+ resolved "https://registry.yarnpkg.com/postcss-normalize-positions/-/postcss-normalize-positions-7.0.1.tgz#c771c0d33034455205f060b999d8557c2308d22c"
+ integrity sha512-pB/SzrIP2l50ZIYu+yQZyMNmnAcwyYb9R1fVWPRxm4zcUFCY2ign7rcntGFuMXDdd9L2pPNUgoODDk91PzRZuQ==
dependencies:
- browserslist "^4.23.3"
+ postcss-value-parser "^4.2.0"
+
+postcss-normalize-repeat-style@^7.0.1:
+ version "7.0.1"
+ resolved "https://registry.yarnpkg.com/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-7.0.1.tgz#05fe4d838eedbd996436c5cab78feef9bb1ae57b"
+ integrity sha512-NsSQJ8zj8TIDiF0ig44Byo3Jk9e4gNt9x2VIlJudnQQ5DhWAHJPF4Tr1ITwyHio2BUi/I6Iv0HRO7beHYOloYQ==
+ dependencies:
+ postcss-value-parser "^4.2.0"
+
+postcss-normalize-string@^7.0.1:
+ version "7.0.1"
+ resolved "https://registry.yarnpkg.com/postcss-normalize-string/-/postcss-normalize-string-7.0.1.tgz#0f111e7b5dfb6de6ab19f09d9e1c16fabeee232f"
+ integrity sha512-QByrI7hAhsoze992kpbMlJSbZ8FuCEc1OT9EFbZ6HldXNpsdpZr+YXC5di3UEv0+jeZlHbZcoCADgb7a+lPmmQ==
+ dependencies:
+ postcss-value-parser "^4.2.0"
+
+postcss-normalize-timing-functions@^7.0.1:
+ version "7.0.1"
+ resolved "https://registry.yarnpkg.com/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-7.0.1.tgz#7b645a36f113fec49d95d56386c9980316c71216"
+ integrity sha512-bHifyuuSNdKKsnNJ0s8fmfLMlvsQwYVxIoUBnowIVl2ZAdrkYQNGVB4RxjfpvkMjipqvbz0u7feBZybkl/6NJg==
+ dependencies:
+ postcss-value-parser "^4.2.0"
+
+postcss-normalize-unicode@^7.0.4:
+ version "7.0.4"
+ resolved "https://registry.yarnpkg.com/postcss-normalize-unicode/-/postcss-normalize-unicode-7.0.4.tgz#9fd8d1d1e931b60ed946556e4d657b5879e3ee00"
+ integrity sha512-LvIURTi1sQoZqj8mEIE8R15yvM+OhbR1avynMtI9bUzj5gGKR/gfZFd8O7VMj0QgJaIFzxDwxGl/ASMYAkqO8g==
+ dependencies:
+ browserslist "^4.25.1"
+ postcss-value-parser "^4.2.0"
+
+postcss-normalize-url@^7.0.1:
+ version "7.0.1"
+ resolved "https://registry.yarnpkg.com/postcss-normalize-url/-/postcss-normalize-url-7.0.1.tgz#d6471a22b6747ce93d7038c16eb9f1ba8b307e25"
+ integrity sha512-sUcD2cWtyK1AOL/82Fwy1aIVm/wwj5SdZkgZ3QiUzSzQQofrbq15jWJ3BA7Z+yVRwamCjJgZJN0I9IS7c6tgeQ==
+ dependencies:
+ postcss-value-parser "^4.2.0"
+
+postcss-normalize-whitespace@^7.0.1:
+ version "7.0.1"
+ resolved "https://registry.yarnpkg.com/postcss-normalize-whitespace/-/postcss-normalize-whitespace-7.0.1.tgz#ab8e9ff1f3213f3f3851c0a7d0e4ce4716777cea"
+ integrity sha512-vsbgFHMFQrJBJKrUFJNZ2pgBeBkC2IvvoHjz1to0/0Xk7sII24T0qFOiJzG6Fu3zJoq/0yI4rKWi7WhApW+EFA==
+ dependencies:
+ postcss-value-parser "^4.2.0"
+
+postcss-ordered-values@^7.0.2:
+ version "7.0.2"
+ resolved "https://registry.yarnpkg.com/postcss-ordered-values/-/postcss-ordered-values-7.0.2.tgz#0e803fbb9601e254270481772252de9a8c905f48"
+ integrity sha512-AMJjt1ECBffF7CEON/Y0rekRLS6KsePU6PRP08UqYW4UGFRnTXNrByUzYK1h8AC7UWTZdQ9O3Oq9kFIhm0SFEw==
+ dependencies:
+ cssnano-utils "^5.0.1"
+ postcss-value-parser "^4.2.0"
+
+postcss-reduce-initial@^7.0.4:
+ version "7.0.4"
+ resolved "https://registry.yarnpkg.com/postcss-reduce-initial/-/postcss-reduce-initial-7.0.4.tgz#ebe8b4c85990efaa5a1accfc77f41f23cfa66187"
+ integrity sha512-rdIC9IlMBn7zJo6puim58Xd++0HdbvHeHaPgXsimMfG1ijC5A9ULvNLSE0rUKVJOvNMcwewW4Ga21ngyJjY/+Q==
+ dependencies:
+ browserslist "^4.25.1"
caniuse-api "^3.0.0"
-postcss-reduce-transforms@^7.0.0:
- version "7.0.0"
- resolved "https://registry.yarnpkg.com/postcss-reduce-transforms/-/postcss-reduce-transforms-7.0.0.tgz#0386080a14e5faad9f8eda33375b79fe7c4f9677"
- integrity sha512-pnt1HKKZ07/idH8cpATX/ujMbtOGhUfE+m8gbqwJE05aTaNw8gbo34a2e3if0xc0dlu75sUOiqvwCGY3fzOHew==
+postcss-reduce-transforms@^7.0.1:
+ version "7.0.1"
+ resolved "https://registry.yarnpkg.com/postcss-reduce-transforms/-/postcss-reduce-transforms-7.0.1.tgz#f87111264b0dfa07e1f708d7e6401578707be5d6"
+ integrity sha512-MhyEbfrm+Mlp/36hvZ9mT9DaO7dbncU0CvWI8V93LRkY6IYlu38OPg3FObnuKTUxJ4qA8HpurdQOo5CyqqO76g==
dependencies:
postcss-value-parser "^4.2.0"
@@ -6200,7 +7437,7 @@ postcss-selector-parser@6.0.10:
cssesc "^3.0.0"
util-deprecate "^1.0.2"
-postcss-selector-parser@^6.0.15, postcss-selector-parser@^6.1.2:
+postcss-selector-parser@^6.0.15:
version "6.1.2"
resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz#27ecb41fb0e3b6ba7a1ec84fff347f734c7929de"
integrity sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==
@@ -6208,7 +7445,7 @@ postcss-selector-parser@^6.0.15, postcss-selector-parser@^6.1.2:
cssesc "^3.0.0"
util-deprecate "^1.0.2"
-postcss-selector-parser@^7.0.0:
+postcss-selector-parser@^7.0.0, postcss-selector-parser@^7.1.0:
version "7.1.0"
resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz#4d6af97eba65d73bc4d84bcb343e865d7dd16262"
integrity sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==
@@ -6216,32 +7453,41 @@ postcss-selector-parser@^7.0.0:
cssesc "^3.0.0"
util-deprecate "^1.0.2"
-postcss-svgo@^7.0.1:
- version "7.0.1"
- resolved "https://registry.yarnpkg.com/postcss-svgo/-/postcss-svgo-7.0.1.tgz#2b63571d8e9568384df334bac9917baff4d23f58"
- integrity sha512-0WBUlSL4lhD9rA5k1e5D8EN5wCEyZD6HJk0jIvRxl+FDVOMlJ7DePHYWGGVc5QRqrJ3/06FTXM0bxjmJpmTPSA==
+postcss-svgo@^7.1.0:
+ version "7.1.0"
+ resolved "https://registry.yarnpkg.com/postcss-svgo/-/postcss-svgo-7.1.0.tgz#7eb6764a643ac2699bf56eef6d2676d428ed4542"
+ integrity sha512-KnAlfmhtoLz6IuU3Sij2ycusNs4jPW+QoFE5kuuUOK8awR6tMxZQrs5Ey3BUz7nFCzT3eqyFgqkyrHiaU2xx3w==
dependencies:
postcss-value-parser "^4.2.0"
- svgo "^3.3.2"
+ svgo "^4.0.0"
-postcss-unique-selectors@^7.0.3:
- version "7.0.3"
- resolved "https://registry.yarnpkg.com/postcss-unique-selectors/-/postcss-unique-selectors-7.0.3.tgz#483fc11215b23d517d5d9bbe5833d9915619ca33"
- integrity sha512-J+58u5Ic5T1QjP/LDV9g3Cx4CNOgB5vz+kM6+OxHHhFACdcDeKhBXjQmB7fnIZM12YSTvsL0Opwco83DmacW2g==
+postcss-unique-selectors@^7.0.4:
+ version "7.0.4"
+ resolved "https://registry.yarnpkg.com/postcss-unique-selectors/-/postcss-unique-selectors-7.0.4.tgz#625ad1c808bdf322fab6c027ae8d4f2637140995"
+ integrity sha512-pmlZjsmEAG7cHd7uK3ZiNSW6otSZ13RHuZ/4cDN/bVglS5EpF2r2oxY99SuOHa8m7AWoBCelTS3JPpzsIs8skQ==
dependencies:
- postcss-selector-parser "^6.1.2"
+ postcss-selector-parser "^7.1.0"
postcss-value-parser@^4.2.0:
version "4.2.0"
resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz#723c09920836ba6d3e5af019f92bc0971c02e514"
integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==
-postcss@^8.4.47, postcss@^8.4.48, postcss@^8.5.3:
- version "8.5.3"
- resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.5.3.tgz#1463b6f1c7fb16fe258736cba29a2de35237eafb"
- integrity sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==
+postcss-values-parser@^6.0.2:
+ version "6.0.2"
+ resolved "https://registry.yarnpkg.com/postcss-values-parser/-/postcss-values-parser-6.0.2.tgz#636edc5b86c953896f1bb0d7a7a6615df00fb76f"
+ integrity sha512-YLJpK0N1brcNJrs9WatuJFtHaV9q5aAOj+S4DI5S7jgHlRfm0PIbDCAFRYMQD5SHq7Fy6xsDhyutgS0QOAs0qw==
dependencies:
- nanoid "^3.3.8"
+ color-name "^1.1.4"
+ is-url-superb "^4.0.0"
+ quote-unquote "^1.0.0"
+
+postcss@^8.5.1, postcss@^8.5.3, postcss@^8.5.6:
+ version "8.5.6"
+ resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.5.6.tgz#2825006615a619b4f62a9e7426cc120b349a8f3c"
+ integrity sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==
+ dependencies:
+ nanoid "^3.3.11"
picocolors "^1.1.1"
source-map-js "^1.2.1"
@@ -6263,50 +7509,60 @@ prebuild-install@^7.1.1:
tar-fs "^2.0.0"
tunnel-agent "^0.6.0"
+precinct@^12.0.0:
+ version "12.2.0"
+ resolved "https://registry.yarnpkg.com/precinct/-/precinct-12.2.0.tgz#6ab18f48034cc534f2c8fedb318f19a11bcd171b"
+ integrity sha512-NFBMuwIfaJ4SocE9YXPU/n4AcNSoFMVFjP72nvl3cx69j/ke61/hPOWFREVxLkFhhEGnA8ZuVfTqJBa+PK3b5w==
+ dependencies:
+ "@dependents/detective-less" "^5.0.1"
+ commander "^12.1.0"
+ detective-amd "^6.0.1"
+ detective-cjs "^6.0.1"
+ detective-es6 "^5.0.1"
+ detective-postcss "^7.0.1"
+ detective-sass "^6.0.1"
+ detective-scss "^5.0.1"
+ detective-stylus "^5.0.1"
+ detective-typescript "^14.0.0"
+ detective-vue2 "^2.2.0"
+ module-definition "^6.0.1"
+ node-source-walk "^7.0.1"
+ postcss "^8.5.1"
+ typescript "^5.7.3"
+
prelude-ls@^1.2.1:
version "1.2.1"
resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396"
integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==
-prettier-linter-helpers@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz#d23d41fe1375646de2d0104d3454a3008802cf7b"
- integrity sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==
- dependencies:
- fast-diff "^1.1.2"
-
prettier@^3.5.3:
- version "3.5.3"
- resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.5.3.tgz#4fc2ce0d657e7a02e602549f053b239cb7dfe1b5"
- integrity sha512-QQtaxnoDJeAkDvDKWCLiwIXkTgRhwYDEQCghU9Z6q03iyek/rxRh/2lC3HB7P8sWT2xC/y5JDctPLBIGzHKbhw==
+ version "3.6.2"
+ resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.6.2.tgz#ccda02a1003ebbb2bfda6f83a074978f608b9393"
+ integrity sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ==
pretty-bytes@^6.1.1:
version "6.1.1"
resolved "https://registry.yarnpkg.com/pretty-bytes/-/pretty-bytes-6.1.1.tgz#38cd6bb46f47afbf667c202cfc754bffd2016a3b"
integrity sha512-mQUvGU6aUFQ+rNvTIAcZuWGRT9a6f6Yrg9bHs4ImKF+HZCEK+plBvnAZYSIQztknZF2qnzNtr6F8s0+IuptdlQ==
-pretty-ms@^9.0.0:
- version "9.2.0"
- resolved "https://registry.yarnpkg.com/pretty-ms/-/pretty-ms-9.2.0.tgz#e14c0aad6493b69ed63114442a84133d7e560ef0"
- integrity sha512-4yf0QO/sllf/1zbZWYnvWw3NxCQwLXKzIj0G849LSufP15BXKM0rbD2Z3wVnkMfjdn/CB0Dpp444gYAACdsplg==
+prisma@^6.11.1:
+ version "6.12.0"
+ resolved "https://registry.yarnpkg.com/prisma/-/prisma-6.12.0.tgz#4f5416c27b6f18df89c6fe42c9fb0e52f8fedc9a"
+ integrity sha512-pmV7NEqQej9WjizN6RSNIwf7Y+jeh9mY1JEX2WjGxJi4YZWexClhde1yz/FuvAM+cTwzchcMytu2m4I6wPkIzg==
dependencies:
- parse-ms "^4.0.0"
-
-prisma@^6.7.0:
- version "6.7.0"
- resolved "https://registry.yarnpkg.com/prisma/-/prisma-6.7.0.tgz#7890e352bde11f6ec3018802d3fc1bcbe0027bd2"
- integrity sha512-vArg+4UqnQ13CVhc2WUosemwh6hr6cr6FY2uzDvCIFwH8pu8BXVv38PktoMLVjtX7sbYThxbnZF5YiR8sN2clw==
- dependencies:
- "@prisma/config" "6.7.0"
- "@prisma/engines" "6.7.0"
- optionalDependencies:
- fsevents "2.3.3"
+ "@prisma/config" "6.12.0"
+ "@prisma/engines" "6.12.0"
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==
+process-warning@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/process-warning/-/process-warning-5.0.0.tgz#566e0bf79d1dff30a72d8bbbe9e8ecefe8d378d7"
+ integrity sha512-a39t9ApHNx2L4+HBnQKqxxHNs1r7KF+Intd8Q/g1bUh6q0WIp9voPXJ/x0j+ZL45KF1pJd9+q2jLIRMfvEshkA==
+
process@^0.11.10:
version "0.11.10"
resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182"
@@ -6331,9 +7587,9 @@ proxy-from-env@^1.1.0:
integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==
pump@^3.0.0:
- version "3.0.2"
- resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.2.tgz#836f3edd6bc2ee599256c924ffe0d88573ddcbf8"
- integrity sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==
+ version "3.0.3"
+ resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.3.tgz#151d979f1a29668dc0025ec589a455b53282268d"
+ integrity sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA==
dependencies:
end-of-stream "^1.1.0"
once "^1.3.1"
@@ -6343,7 +7599,14 @@ punycode@^2.1.0:
resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5"
integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==
-quansync@^0.2.7, quansync@^0.2.8:
+qs@^6.9.6:
+ version "6.14.0"
+ resolved "https://registry.yarnpkg.com/qs/-/qs-6.14.0.tgz#c63fa40680d2c5c941412a0e899c89af60c0a930"
+ integrity sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==
+ dependencies:
+ side-channel "^1.1.0"
+
+quansync@^0.2.8:
version "0.2.10"
resolved "https://registry.yarnpkg.com/quansync/-/quansync-0.2.10.tgz#32053cf166fa36511aae95fc49796116f2dc20e1"
integrity sha512-t41VRkMYbkHyCYmOvx/6URnN80H7k4X0lLdBMGsz+maAwrJQYB1djpV6vHrQIBE0WBSGqhtEHrK9U3DWWH8v7A==
@@ -6353,6 +7616,16 @@ queue-microtask@^1.2.2:
resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243"
integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==
+quick-format-unescaped@^4.0.3:
+ version "4.0.4"
+ resolved "https://registry.yarnpkg.com/quick-format-unescaped/-/quick-format-unescaped-4.0.4.tgz#93ef6dd8d3453cbc7970dd614fad4c5954d6b5a7"
+ integrity sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==
+
+quote-unquote@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/quote-unquote/-/quote-unquote-1.0.0.tgz#67a9a77148effeaf81a4d428404a710baaac8a0b"
+ integrity sha512-twwRO/ilhlG/FIgYeKGFqyHhoEhqgnKVkcmqMKi2r524gz3ZbDTcyFt38E9xjJI2vT+KbRNHVbnJ/e0I25Azwg==
+
radix3@^1.1.2:
version "1.1.2"
resolved "https://registry.yarnpkg.com/radix3/-/radix3-1.1.2.tgz#fd27d2af3896c6bf4bcdfab6427c69c2afc69ec0"
@@ -6365,7 +7638,7 @@ randombytes@^2.1.0:
dependencies:
safe-buffer "^5.1.0"
-range-parser@~1.2.1:
+range-parser@^1.2.1:
version "1.2.1"
resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031"
integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==
@@ -6408,7 +7681,7 @@ read-pkg@^9.0.0:
type-fest "^4.6.0"
unicorn-magic "^0.1.0"
-readable-stream@3, readable-stream@^3.1.1, readable-stream@^3.4.0:
+readable-stream@3, readable-stream@^3.1.1, readable-stream@^3.4.0, readable-stream@^3.6.2:
version "3.6.2"
resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967"
integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==
@@ -6460,6 +7733,18 @@ readdirp@^4.0.1:
resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-4.1.2.tgz#eb85801435fbf2a7ee58f19e0921b068fc69948d"
integrity sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==
+readdirp@~3.6.0:
+ version "3.6.0"
+ resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7"
+ integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==
+ dependencies:
+ picomatch "^2.2.1"
+
+real-require@^0.2.0:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/real-require/-/real-require-0.2.0.tgz#209632dea1810be2ae063a6ac084fee7e33fba78"
+ integrity sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg==
+
redis-errors@^1.0.0, redis-errors@^1.2.0:
version "1.2.0"
resolved "https://registry.yarnpkg.com/redis-errors/-/redis-errors-1.2.0.tgz#eb62d2adb15e4eaf4610c04afe1529384250abad"
@@ -6499,11 +7784,21 @@ regjsparser@^0.12.0:
dependencies:
jsesc "~3.0.2"
+remove-trailing-separator@^1.0.1:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef"
+ integrity sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw==
+
require-directory@^2.1.1:
version "2.1.1"
resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42"
integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==
+require-package-name@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/require-package-name/-/require-package-name-2.0.1.tgz#c11e97276b65b8e2923f75dabf5fb2ef0c3841b9"
+ integrity sha512-uuoJ1hU/k6M0779t3VMVIYpb2VMJk05cehCaABFhXaibcbvfgR8wKiozLjVFSzJPmQMRqIcO0HMyTFqfV09V6Q==
+
resolve-from@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6"
@@ -6519,7 +7814,7 @@ resolve-pkg-maps@^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.22.1, resolve@^1.22.4:
+resolve@^1.22.1:
version "1.22.10"
resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.10.tgz#b663e83ffb09bbf2386944736baae803029b8b39"
integrity sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==
@@ -6528,6 +7823,15 @@ resolve@^1.22.1, resolve@^1.22.4:
path-parse "^1.0.7"
supports-preserve-symlinks-flag "^1.0.0"
+resolve@^2.0.0-next.1:
+ version "2.0.0-next.5"
+ resolved "https://registry.yarnpkg.com/resolve/-/resolve-2.0.0-next.5.tgz#6b0ec3107e671e52b68cd068ef327173b90dc03c"
+ integrity sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==
+ dependencies:
+ is-core-module "^2.13.0"
+ path-parse "^1.0.7"
+ supports-preserve-symlinks-flag "^1.0.0"
+
restructure@^3.0.0:
version "3.0.2"
resolved "https://registry.yarnpkg.com/restructure/-/restructure-3.0.2.tgz#e6b2fad214f78edee21797fa8160fef50eb9b49a"
@@ -6543,50 +7847,43 @@ rfdc@^1.4.1:
resolved "https://registry.yarnpkg.com/rfdc/-/rfdc-1.4.1.tgz#778f76c4fb731d93414e8f925fbecf64cce7f6ca"
integrity sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==
-rimraf@^5.0.5:
- version "5.0.10"
- resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-5.0.10.tgz#23b9843d3dc92db71f96e1a2ce92e39fd2a8221c"
- integrity sha512-l0OE8wL34P4nJH/H2ffoaniAokM2qSmrtXHmlpvYr5AVVX8msAyW0l8NVJFDxlSK4u3Uh/f41cQheDVdnYijwQ==
+rollup-plugin-visualizer@^6.0.3:
+ version "6.0.3"
+ resolved "https://registry.yarnpkg.com/rollup-plugin-visualizer/-/rollup-plugin-visualizer-6.0.3.tgz#d05bd17e358a6d04bf593cf73556219c9c6d8dad"
+ integrity sha512-ZU41GwrkDcCpVoffviuM9Clwjy5fcUxlz0oMoTXTYsK+tcIFzbdacnrr2n8TXcHxbGKKXtOdjxM2HUS4HjkwIw==
dependencies:
- glob "^10.3.7"
-
-rollup-plugin-visualizer@^5.14.0:
- version "5.14.0"
- resolved "https://registry.yarnpkg.com/rollup-plugin-visualizer/-/rollup-plugin-visualizer-5.14.0.tgz#be82d43fb3c644e396e2d50ac8a53d354022d57c"
- integrity sha512-VlDXneTDaKsHIw8yzJAFWtrzguoJ/LnQ+lMpoVfYJ3jJF4Ihe5oYLAqLklIK/35lgUY+1yEzCkHyZ1j4A5w5fA==
- dependencies:
- open "^8.4.0"
+ open "^8.0.0"
picomatch "^4.0.2"
source-map "^0.7.4"
yargs "^17.5.1"
-rollup@^4.30.1, rollup@^4.36.0:
- version "4.38.0"
- resolved "https://registry.yarnpkg.com/rollup/-/rollup-4.38.0.tgz#e1ef4939aef0e1295f750ae4f73d1c8b7fc3abb8"
- integrity sha512-5SsIRtJy9bf1ErAOiFMFzl64Ex9X5V7bnJ+WlFMb+zmP459OSWCEG7b0ERZ+PEU7xPt4OG3RHbrp1LJlXxYTrw==
+rollup@^4.34.9, rollup@^4.40.0, rollup@^4.45.0:
+ version "4.45.1"
+ resolved "https://registry.yarnpkg.com/rollup/-/rollup-4.45.1.tgz#d0ef72a8d0a9210d832f9c3c5f3b6a2aa4b0ba64"
+ integrity sha512-4iya7Jb76fVpQyLoiVpzUrsjQ12r3dM7fIVz+4NwoYvZOShknRmiv+iu9CClZml5ZLGb0XMcYLutK6w9tgxHDw==
dependencies:
- "@types/estree" "1.0.7"
+ "@types/estree" "1.0.8"
optionalDependencies:
- "@rollup/rollup-android-arm-eabi" "4.38.0"
- "@rollup/rollup-android-arm64" "4.38.0"
- "@rollup/rollup-darwin-arm64" "4.38.0"
- "@rollup/rollup-darwin-x64" "4.38.0"
- "@rollup/rollup-freebsd-arm64" "4.38.0"
- "@rollup/rollup-freebsd-x64" "4.38.0"
- "@rollup/rollup-linux-arm-gnueabihf" "4.38.0"
- "@rollup/rollup-linux-arm-musleabihf" "4.38.0"
- "@rollup/rollup-linux-arm64-gnu" "4.38.0"
- "@rollup/rollup-linux-arm64-musl" "4.38.0"
- "@rollup/rollup-linux-loongarch64-gnu" "4.38.0"
- "@rollup/rollup-linux-powerpc64le-gnu" "4.38.0"
- "@rollup/rollup-linux-riscv64-gnu" "4.38.0"
- "@rollup/rollup-linux-riscv64-musl" "4.38.0"
- "@rollup/rollup-linux-s390x-gnu" "4.38.0"
- "@rollup/rollup-linux-x64-gnu" "4.38.0"
- "@rollup/rollup-linux-x64-musl" "4.38.0"
- "@rollup/rollup-win32-arm64-msvc" "4.38.0"
- "@rollup/rollup-win32-ia32-msvc" "4.38.0"
- "@rollup/rollup-win32-x64-msvc" "4.38.0"
+ "@rollup/rollup-android-arm-eabi" "4.45.1"
+ "@rollup/rollup-android-arm64" "4.45.1"
+ "@rollup/rollup-darwin-arm64" "4.45.1"
+ "@rollup/rollup-darwin-x64" "4.45.1"
+ "@rollup/rollup-freebsd-arm64" "4.45.1"
+ "@rollup/rollup-freebsd-x64" "4.45.1"
+ "@rollup/rollup-linux-arm-gnueabihf" "4.45.1"
+ "@rollup/rollup-linux-arm-musleabihf" "4.45.1"
+ "@rollup/rollup-linux-arm64-gnu" "4.45.1"
+ "@rollup/rollup-linux-arm64-musl" "4.45.1"
+ "@rollup/rollup-linux-loongarch64-gnu" "4.45.1"
+ "@rollup/rollup-linux-powerpc64le-gnu" "4.45.1"
+ "@rollup/rollup-linux-riscv64-gnu" "4.45.1"
+ "@rollup/rollup-linux-riscv64-musl" "4.45.1"
+ "@rollup/rollup-linux-s390x-gnu" "4.45.1"
+ "@rollup/rollup-linux-x64-gnu" "4.45.1"
+ "@rollup/rollup-linux-x64-musl" "4.45.1"
+ "@rollup/rollup-win32-arm64-msvc" "4.45.1"
+ "@rollup/rollup-win32-ia32-msvc" "4.45.1"
+ "@rollup/rollup-win32-x64-msvc" "4.45.1"
fsevents "~2.3.2"
run-applescript@^7.0.0:
@@ -6611,10 +7908,27 @@ safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@~5.2.0:
resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6"
integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==
+safe-stable-stringify@^2.3.1:
+ version "2.5.0"
+ resolved "https://registry.yarnpkg.com/safe-stable-stringify/-/safe-stable-stringify-2.5.0.tgz#4ca2f8e385f2831c432a719b108a3bf7af42a1dd"
+ integrity sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==
+
+"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==
+
+sanitize-filename@^1.6.3:
+ version "1.6.3"
+ resolved "https://registry.yarnpkg.com/sanitize-filename/-/sanitize-filename-1.6.3.tgz#755ebd752045931977e30b2025d340d7c9090378"
+ integrity sha512-y/52Mcy7aw3gRm7IrcGDFx/bCk4AhRh2eI9luHOQM86nZsqwiRkkq2GekHXBBD+SmPidc8i2PqtYZl+pWJ8Oeg==
+ dependencies:
+ truncate-utf8-bytes "^1.0.0"
+
sass@^1.79.4:
- version "1.86.0"
- resolved "https://registry.yarnpkg.com/sass/-/sass-1.86.0.tgz#f49464fb6237a903a93f4e8760ef6e37a5030114"
- integrity sha512-zV8vGUld/+mP4KbMLJMX7TyGCuUp7hnkOScgCMsWuHtns8CWBoz+vmEhoGMXsaJrbUP8gj+F1dLvVe79sK8UdA==
+ version "1.89.2"
+ resolved "https://registry.yarnpkg.com/sass/-/sass-1.89.2.tgz#a771716aeae774e2b529f72c0ff2dfd46c9de10e"
+ integrity sha512-xCmtksBKd/jdJ9Bt9p7nPKiuqrlBMBuuGkQlkhZjjQk3Ty48lv93k5Dq6OPkKt4XwxDJ7tvlfrTa1MPA9bf+QA==
dependencies:
chokidar "^4.0.0"
immutable "^5.0.2"
@@ -6622,6 +7936,11 @@ sass@^1.79.4:
optionalDependencies:
"@parcel/watcher" "^2.4.1"
+sax@^1.4.1:
+ version "1.4.1"
+ resolved "https://registry.yarnpkg.com/sax/-/sax-1.4.1.tgz#44cc8988377f126304d3b3fc1010c733b929ef0f"
+ integrity sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==
+
scslre@^0.3.0:
version "0.3.0"
resolved "https://registry.yarnpkg.com/scslre/-/scslre-0.3.0.tgz#c3211e9bfc5547fc86b1eabaa34ed1a657060155"
@@ -6636,34 +7955,37 @@ scule@^1.3.0:
resolved "https://registry.yarnpkg.com/scule/-/scule-1.3.0.tgz#6efbd22fd0bb801bdcc585c89266a7d2daa8fbd3"
integrity sha512-6FtHJEvt+pVMIB9IBY+IcCJ6Z5f1iQnytgyfKMhDKgmzYG+TeH/wx1y3l27rshSbLiSanrR9ffZDrEsmjlQF2g==
+secure-json-parse@^2.4.0:
+ version "2.7.0"
+ resolved "https://registry.yarnpkg.com/secure-json-parse/-/secure-json-parse-2.7.0.tgz#5a5f9cd6ae47df23dba3151edd06855d47e09862"
+ integrity sha512-6aU+Rwsezw7VR8/nyvKTx8QpWH9FrcYiXXlqC4z5d5XQBDRqtbfsRjnwGyqbi3gddNtWHuEk9OANUotL26qKUw==
+
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.3.5, semver@^7.5.3, semver@^7.5.4, semver@^7.6.0, semver@^7.6.3, semver@^7.7.1:
- version "7.7.1"
- resolved "https://registry.yarnpkg.com/semver/-/semver-7.7.1.tgz#abd5098d82b18c6c81f6074ff2647fd3e7220c9f"
- integrity sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==
+semver@^7.3.5, semver@^7.3.8, semver@^7.5.3, semver@^7.5.4, semver@^7.6.0, semver@^7.6.3, semver@^7.7.1, semver@^7.7.2:
+ version "7.7.2"
+ resolved "https://registry.yarnpkg.com/semver/-/semver-7.7.2.tgz#67d99fdcd35cec21e6f8b87a7fd515a33f982b58"
+ integrity sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==
-send@0.19.0:
- version "0.19.0"
- resolved "https://registry.yarnpkg.com/send/-/send-0.19.0.tgz#bbc5a388c8ea6c048967049dbeac0e4a3f09d7f8"
- integrity sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==
+send@^1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/send/-/send-1.2.0.tgz#32a7554fb777b831dfa828370f773a3808d37212"
+ integrity sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw==
dependencies:
- debug "2.6.9"
- depd "2.0.0"
- destroy "1.2.0"
- encodeurl "~1.0.2"
- escape-html "~1.0.3"
- etag "~1.8.1"
- fresh "0.5.2"
- http-errors "2.0.0"
- mime "1.6.0"
- ms "2.1.3"
- on-finished "2.4.1"
- range-parser "~1.2.1"
- statuses "2.0.1"
+ debug "^4.3.5"
+ encodeurl "^2.0.0"
+ escape-html "^1.0.3"
+ etag "^1.8.1"
+ fresh "^2.0.0"
+ http-errors "^2.0.0"
+ mime-types "^3.0.1"
+ ms "^2.1.3"
+ on-finished "^2.4.1"
+ range-parser "^1.2.1"
+ statuses "^2.0.1"
serialize-javascript@^6.0.1:
version "6.0.2"
@@ -6679,15 +8001,15 @@ serve-placeholder@^2.0.2:
dependencies:
defu "^6.1.4"
-serve-static@^1.16.2:
- version "1.16.2"
- resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.16.2.tgz#b6a5343da47f6bdd2673848bf45754941e803296"
- integrity sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==
+serve-static@^2.2.0:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-2.2.0.tgz#9c02564ee259bdd2251b82d659a2e7e1938d66f9"
+ integrity sha512-61g9pCh0Vnh7IutZjtLGGpTA355+OPn2TyDv/6ivP2h/AdAVX9azsoxmg2/M6nZeQZNYBEwIcsne1mJd9oQItQ==
dependencies:
- encodeurl "~2.0.0"
- escape-html "~1.0.3"
- parseurl "~1.3.3"
- send "0.19.0"
+ encodeurl "^2.0.0"
+ escape-html "^1.0.3"
+ parseurl "^1.3.3"
+ send "^1.2.0"
setprototypeof@1.2.0:
version "1.2.0"
@@ -6708,35 +8030,6 @@ sharp@^0.32.6:
tar-fs "^3.0.4"
tunnel-agent "^0.6.0"
-sharp@^0.33.5:
- version "0.33.5"
- resolved "https://registry.yarnpkg.com/sharp/-/sharp-0.33.5.tgz#13e0e4130cc309d6a9497596715240b2ec0c594e"
- integrity sha512-haPVm1EkS9pgvHrQ/F3Xy+hgcuMV0Wm9vfIBSiwZ05k+xgb0PkBQpGsAA/oWdDobNaZTH5ppvHtzCFbnSEwHVw==
- dependencies:
- color "^4.2.3"
- detect-libc "^2.0.3"
- semver "^7.6.3"
- optionalDependencies:
- "@img/sharp-darwin-arm64" "0.33.5"
- "@img/sharp-darwin-x64" "0.33.5"
- "@img/sharp-libvips-darwin-arm64" "1.0.4"
- "@img/sharp-libvips-darwin-x64" "1.0.4"
- "@img/sharp-libvips-linux-arm" "1.0.5"
- "@img/sharp-libvips-linux-arm64" "1.0.4"
- "@img/sharp-libvips-linux-s390x" "1.0.4"
- "@img/sharp-libvips-linux-x64" "1.0.4"
- "@img/sharp-libvips-linuxmusl-arm64" "1.0.4"
- "@img/sharp-libvips-linuxmusl-x64" "1.0.4"
- "@img/sharp-linux-arm" "0.33.5"
- "@img/sharp-linux-arm64" "0.33.5"
- "@img/sharp-linux-s390x" "0.33.5"
- "@img/sharp-linux-x64" "0.33.5"
- "@img/sharp-linuxmusl-arm64" "0.33.5"
- "@img/sharp-linuxmusl-x64" "0.33.5"
- "@img/sharp-wasm32" "0.33.5"
- "@img/sharp-win32-ia32" "0.33.5"
- "@img/sharp-win32-x64" "0.33.5"
-
shebang-command@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea"
@@ -6750,9 +8043,49 @@ shebang-regex@^3.0.0:
integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==
shell-quote@^1.8.1:
- version "1.8.2"
- resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.8.2.tgz#d2d83e057959d53ec261311e9e9b8f51dcb2934a"
- integrity sha512-AzqKpGKjrj7EM6rKVQEPpB288oCfnrEIuyoT9cyF4nmGa7V8Zk6f7RRqYisX8X9m+Q7bd632aZW4ky7EhbQztA==
+ version "1.8.3"
+ resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.8.3.tgz#55e40ef33cf5c689902353a3d8cd1a6725f08b4b"
+ integrity sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==
+
+side-channel-list@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/side-channel-list/-/side-channel-list-1.0.0.tgz#10cb5984263115d3b7a0e336591e290a830af8ad"
+ integrity sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==
+ dependencies:
+ es-errors "^1.3.0"
+ object-inspect "^1.13.3"
+
+side-channel-map@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/side-channel-map/-/side-channel-map-1.0.1.tgz#d6bb6b37902c6fef5174e5f533fab4c732a26f42"
+ integrity sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==
+ dependencies:
+ call-bound "^1.0.2"
+ es-errors "^1.3.0"
+ get-intrinsic "^1.2.5"
+ object-inspect "^1.13.3"
+
+side-channel-weakmap@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz#11dda19d5368e40ce9ec2bdc1fb0ecbc0790ecea"
+ integrity sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==
+ dependencies:
+ call-bound "^1.0.2"
+ es-errors "^1.3.0"
+ get-intrinsic "^1.2.5"
+ object-inspect "^1.13.3"
+ side-channel-map "^1.0.1"
+
+side-channel@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.1.0.tgz#c3fcff9c4da932784873335ec9765fa94ff66bc9"
+ integrity sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==
+ dependencies:
+ es-errors "^1.3.0"
+ object-inspect "^1.13.3"
+ side-channel-list "^1.0.0"
+ side-channel-map "^1.0.1"
+ side-channel-weakmap "^1.0.2"
signal-exit@^4.0.1, signal-exit@^4.1.0:
version "4.1.0"
@@ -6773,14 +8106,14 @@ simple-get@^4.0.0, simple-get@^4.0.1:
once "^1.3.1"
simple-concat "^1.0.0"
-simple-git@^3.27.0:
- version "3.27.0"
- resolved "https://registry.yarnpkg.com/simple-git/-/simple-git-3.27.0.tgz#f4b09e807bda56a4a3968f635c0e4888d3decbd5"
- integrity sha512-ivHoFS9Yi9GY49ogc6/YAi3Fl9ROnF4VyubNylgCkA+RVqLaKWnDSzXOVzya8csELIaWaYNutsEuAhZrtOjozA==
+simple-git@^3.28.0:
+ version "3.28.0"
+ resolved "https://registry.yarnpkg.com/simple-git/-/simple-git-3.28.0.tgz#c6345b2e387880f8450788a1e388573366ae48ac"
+ integrity sha512-Rs/vQRwsn1ILH1oBUy8NucJlXmnnLeLCfcvbSehkPzbv3wwoFWIdtfd6Ndo6ZPhlPsCZ60CPI4rxurnwAa+a2w==
dependencies:
"@kwsites/file-exists" "^1.1.1"
"@kwsites/promise-deferred" "^1.1.1"
- debug "^4.3.5"
+ debug "^4.4.0"
simple-swizzle@^0.2.2:
version "0.2.2"
@@ -6808,27 +8141,29 @@ slash@^5.1.0:
resolved "https://registry.yarnpkg.com/slash/-/slash-5.1.0.tgz#be3adddcdf09ac38eebe8dcdc7b1a57a75b095ce"
integrity sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==
-slashes@^3.0.12:
- version "3.0.12"
- resolved "https://registry.yarnpkg.com/slashes/-/slashes-3.0.12.tgz#3d664c877ad542dc1509eaf2c50f38d483a6435a"
- integrity sha512-Q9VME8WyGkc7pJf6QEkj3wE+2CnvZMI+XJhwdTPR8Z/kWQRXi7boAWLDibRPyHRTUTPx5FaU7MsyrjI3yLB4HA==
-
smob@^1.0.0:
version "1.5.0"
resolved "https://registry.yarnpkg.com/smob/-/smob-1.5.0.tgz#85d79a1403abf128d24d3ebc1cdc5e1a9548d3ab"
integrity sha512-g6T+p7QO8npa+/hNx9ohv1E5pVCmWrVCUzUXJyLdMmftX6ER0oiWY/w9knEonLpnOp6b6FenKnMfR8gqwWdwig==
+sonic-boom@^4.0.1:
+ version "4.2.0"
+ resolved "https://registry.yarnpkg.com/sonic-boom/-/sonic-boom-4.2.0.tgz#e59a525f831210fa4ef1896428338641ac1c124d"
+ integrity sha512-INb7TM37/mAcsGmc9hyyI6+QR3rR1zVRu36B0NeGXKnOOLiZOfER5SA+N7X7k3yUYRzLWafduTDvJAfDswwEww==
+ dependencies:
+ atomic-sleep "^1.0.0"
+
sortablejs@1.14.0:
version "1.14.0"
resolved "https://registry.yarnpkg.com/sortablejs/-/sortablejs-1.14.0.tgz#6d2e17ccbdb25f464734df621d4f35d4ab35b3d8"
integrity sha512-pBXvQCs5/33fdN1/39pPL0NZF20LeRbLQ5jtnheIPN9JQAaufGjKdWduZn4U7wCtVuzKhmRkI0DFYHYRbB2H1w==
-"source-map-js@>=0.6.2 <2.0.0", source-map-js@^1.0.1, source-map-js@^1.2.0, source-map-js@^1.2.1:
+"source-map-js@>=0.6.2 <2.0.0", source-map-js@^1.0.1, source-map-js@^1.0.2, source-map-js@^1.2.0, source-map-js@^1.2.1:
version "1.2.1"
resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.2.1.tgz#1ce5650fddd87abc099eda37dcff024c2667ae46"
integrity sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==
-source-map-support@~0.5.20:
+source-map-support@^0.5.21, source-map-support@~0.5.20:
version "0.5.21"
resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f"
integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==
@@ -6836,15 +8171,15 @@ source-map-support@~0.5.20:
buffer-from "^1.0.0"
source-map "^0.6.0"
-source-map@^0.6.0:
+source-map@^0.6.0, source-map@~0.6.1:
version "0.6.1"
resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263"
integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==
source-map@^0.7.4:
- version "0.7.4"
- resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.4.tgz#a9bbe705c9d8846f4e08ff6765acf0f1b0898656"
- integrity sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==
+ version "0.7.6"
+ resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.6.tgz#a3658ab87e5b6429c8a1f3ba0083d4c61ca3ef02"
+ integrity sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==
spdx-correct@^3.0.0:
version "3.2.0"
@@ -6885,10 +8220,20 @@ speakingurl@^14.0.1:
resolved "https://registry.yarnpkg.com/speakingurl/-/speakingurl-14.0.1.tgz#f37ec8ddc4ab98e9600c1c9ec324a8c48d772a53"
integrity sha512-1POYv7uv2gXoyGFpBCmpDVSNV74IfsWlDW216UPjbWufNf+bSU6GdbDsxdcxtfwb4xlI3yxzOTKClUosxARYrQ==
-stable-hash@^0.0.5:
- version "0.0.5"
- resolved "https://registry.yarnpkg.com/stable-hash/-/stable-hash-0.0.5.tgz#94e8837aaeac5b4d0f631d2972adef2924b40269"
- integrity sha512-+L3ccpzibovGXFK+Ap/f8LOS0ahMrHTf3xu7mMLSpEGU0EO9ucaysSylKo9eRDFNhWve/y275iPmIZ4z39a9iA==
+split2@^4.0.0:
+ version "4.2.0"
+ resolved "https://registry.yarnpkg.com/split2/-/split2-4.2.0.tgz#c9c5920904d148bab0b9f67145f245a86aadbfa4"
+ integrity sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==
+
+stable-hash-x@^0.2.0:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/stable-hash-x/-/stable-hash-x-0.2.0.tgz#dfd76bfa5d839a7470125c6a6b3c8b22061793e9"
+ integrity sha512-o3yWv49B/o4QZk5ZcsALc6t0+eCelPc44zZsLtCQnZPDwFpDYSWcDnrv2TtMmMbQ7uKo3J0HTURCqckw23czNQ==
+
+stack-trace@0.0.x:
+ version "0.0.10"
+ resolved "https://registry.yarnpkg.com/stack-trace/-/stack-trace-0.0.10.tgz#547c70b347e8d32b4e108ea1a2a159e5fdde19c0"
+ integrity sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==
standard-as-callback@^2.1.0:
version "2.1.0"
@@ -6900,10 +8245,15 @@ statuses@2.0.1:
resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63"
integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==
-std-env@^3.7.0, std-env@^3.8.1:
- version "3.8.1"
- resolved "https://registry.yarnpkg.com/std-env/-/std-env-3.8.1.tgz#2b81c631c62e3d0b964b87f099b8dcab6c9a5346"
- integrity sha512-vj5lIj3Mwf9D79hBkltk5qmkFI+biIKWS2IBxEyEU3AX1tUf7AoL8nSazCOiiqQsGKIq01SClsKEzweu34uwvA==
+statuses@^2.0.1:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.2.tgz#8f75eecef765b5e1cfcdc080da59409ed424e382"
+ integrity sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==
+
+std-env@^3.7.0, std-env@^3.8.1, std-env@^3.9.0:
+ version "3.9.0"
+ resolved "https://registry.yarnpkg.com/std-env/-/std-env-3.9.0.tgz#1a6f7243b339dca4c9fd55e1c7504c77ef23e8f1"
+ integrity sha512-UGvjygr6F6tpH7o2qyqR6QYpwraIjKSdtzyBdyytFOHmPZY917kwdwLG0RbOjWOnKmnm3PeHjaoLLMie7kPLQw==
stream-head@^3.0.0:
version "3.0.0"
@@ -6922,9 +8272,9 @@ stream-mime-type@^2.0.0:
stream-head "^3.0.0"
streamx@^2.15.0, streamx@^2.21.0:
- version "2.22.0"
- resolved "https://registry.yarnpkg.com/streamx/-/streamx-2.22.0.tgz#cd7b5e57c95aaef0ff9b2aef7905afa62ec6e4a7"
- integrity sha512-sLh1evHOzBy/iWRiR6d1zRcLao4gGZr3C1kzNz4fopCOKJb6xD9ub8Mpi9Mr1R6id5o43S+d93fI48UC5uM9aw==
+ version "2.22.1"
+ resolved "https://registry.yarnpkg.com/streamx/-/streamx-2.22.1.tgz#c97cbb0ce18da4f4db5a971dc9ab68ff5dc7f5a5"
+ integrity sha512-znKXEBxfatz2GBNK02kRnCXjV+AA4kjZIUxeWSr3UGirZMJfTE9uiwKHobnbgxWyL/JWro8tTq+vOqAK1/qbSA==
dependencies:
fast-fifo "^1.3.2"
text-decoder "^1.1.0"
@@ -6998,11 +8348,6 @@ strip-final-newline@^3.0.0:
resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-3.0.0.tgz#52894c313fbff318835280aed60ff71ebf12b8fd"
integrity sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==
-strip-final-newline@^4.0.0:
- version "4.0.0"
- resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-4.0.0.tgz#35a369ec2ac43df356e3edd5dcebb6429aa1fa5c"
- integrity sha512-aulFJcD6YK8V1G7iRB5tigAP4TsHBZZrOV8pjV++zdUwmeV8uzbY7yn6h9MswN62adStNZFuCIx4haBnRuMDaw==
-
strip-indent@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-4.0.0.tgz#b41379433dd06f5eae805e21d631e07ee670d853"
@@ -7040,15 +8385,15 @@ structured-clone-es@^1.0.0:
resolved "https://registry.yarnpkg.com/structured-clone-es/-/structured-clone-es-1.0.0.tgz#cc37f73c519c0d9e5d8d8efd3a7a9250207e688d"
integrity sha512-FL8EeKFFyNQv5cMnXI31CIMCsFarSVI2bF0U0ImeNE3g/F1IvJQyqzOXxPBRXiwQfyBTlbNe88jh1jFW0O/jiQ==
-stylehacks@^7.0.4:
- version "7.0.4"
- resolved "https://registry.yarnpkg.com/stylehacks/-/stylehacks-7.0.4.tgz#9c21f7374f4bccc0082412b859b3c89d77d3277c"
- integrity sha512-i4zfNrGMt9SB4xRK9L83rlsFCgdGANfeDAYacO1pkqcE7cRHPdWHwnKZVz7WY17Veq/FvyYsRAU++Ga+qDFIww==
+stylehacks@^7.0.5:
+ version "7.0.6"
+ resolved "https://registry.yarnpkg.com/stylehacks/-/stylehacks-7.0.6.tgz#b52653ec54b4d902268df4be5db5e16f18822b31"
+ integrity sha512-iitguKivmsueOmTO0wmxURXBP8uqOO+zikLGZ7Mm9e/94R4w5T999Js2taS/KBOnQ/wdC3jN3vNSrkGDrlnqQg==
dependencies:
- browserslist "^4.23.3"
- postcss-selector-parser "^6.1.2"
+ browserslist "^4.25.1"
+ postcss-selector-parser "^7.1.0"
-superjson@^2.2.1:
+superjson@^2.2.2:
version "2.2.2"
resolved "https://registry.yarnpkg.com/superjson/-/superjson-2.2.2.tgz#9d52bf0bf6b5751a3c3472f1292e714782ba3173"
integrity sha512-5JRxVqC8I8NuOUjzBbvVJAKNM8qoVuH0O77h4WInc/qC2q5IreqKxYwgkga3PfA22OayK2ikceb/B26dztPl+Q==
@@ -7072,7 +8417,7 @@ supports-preserve-symlinks-flag@^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==
-svgo@^3.2.0, svgo@^3.3.2:
+svgo@^3.2.0:
version "3.3.2"
resolved "https://registry.yarnpkg.com/svgo/-/svgo-3.3.2.tgz#ad58002652dffbb5986fc9716afe52d869ecbda8"
integrity sha512-OoohrmuUlBs8B8o6MB2Aevn+pRIH9zDALSR+6hhqVfa6fRwG/Qw9VUMSMW9VNg2CFc/MTIfabtdOVl9ODIJjpw==
@@ -7085,41 +8430,46 @@ svgo@^3.2.0, svgo@^3.3.2:
csso "^5.0.5"
picocolors "^1.0.0"
-synckit@^0.11.0:
- version "0.11.4"
- resolved "https://registry.yarnpkg.com/synckit/-/synckit-0.11.4.tgz#48972326b59723fc15b8d159803cf8302b545d59"
- integrity sha512-Q/XQKRaJiLiFIBNN+mndW7S/RHxvwzuZS6ZwmRzUBqJBv/5QIKCEwkBC8GBf8EQJKYnaFs0wOZbKTXBPj8L9oQ==
+svgo@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/svgo/-/svgo-4.0.0.tgz#17e0fa2eaccf429e0ec0d2179169abde9ba8ad3d"
+ integrity sha512-VvrHQ+9uniE+Mvx3+C9IEe/lWasXCU0nXMY2kZeLrHNICuRiC8uMPyM14UEaMOFA5mhyQqEkB02VoQ16n3DLaw==
dependencies:
- "@pkgr/core" "^0.2.3"
- tslib "^2.8.1"
+ commander "^11.1.0"
+ css-select "^5.1.0"
+ css-tree "^3.0.1"
+ css-what "^6.1.0"
+ csso "^5.0.5"
+ picocolors "^1.1.1"
+ sax "^1.4.1"
-synckit@^0.9.1:
- version "0.9.2"
- resolved "https://registry.yarnpkg.com/synckit/-/synckit-0.9.2.tgz#a3a935eca7922d48b9e7d6c61822ee6c3ae4ec62"
- integrity sha512-vrozgXDQwYO72vHjUb/HnFbQx1exDjoKzqx23aXEg2a9VIg2TSFZ8FmeZpTjUCFMYw7mpX4BE2SFu8wI7asYsw==
+synckit@^0.10.0:
+ version "0.10.4"
+ resolved "https://registry.yarnpkg.com/synckit/-/synckit-0.10.4.tgz#a8af59be664d324be5271e86146075f6e93d5fe9"
+ integrity sha512-2SG1TnJGjMkD4+gblONMGYSrwAzYi+ymOitD+Jb/iMYm57nH20PlkVeMQRah3yDMKEa0QQYUF/QPWpdW7C6zNg==
dependencies:
- "@pkgr/core" "^0.1.0"
- tslib "^2.6.2"
+ "@pkgr/core" "^0.2.0"
+ tslib "^2.8.1"
system-architecture@^0.1.0:
version "0.1.0"
resolved "https://registry.yarnpkg.com/system-architecture/-/system-architecture-0.1.0.tgz#71012b3ac141427d97c67c56bc7921af6bff122d"
integrity sha512-ulAk51I9UVUyJgxlv9M6lFot2WP3e7t8Kz9+IS6D4rVba1tR9kON+Ey69f+1R4Q8cd45Lod6a4IcJIxnzGc/zA==
-tailwindcss@4.0.17, tailwindcss@^4.0.0:
- version "4.0.17"
- resolved "https://registry.yarnpkg.com/tailwindcss/-/tailwindcss-4.0.17.tgz#44332e28d4213385727b6199e07ab296d8bdfa42"
- integrity sha512-OErSiGzRa6rLiOvaipsDZvLMSpsBZ4ysB4f0VKGXUrjw2jfkJRd6kjRKV2+ZmTCNvwtvgdDam5D7w6WXsdLJZw==
+tailwindcss@4.1.11, tailwindcss@^4.0.0:
+ version "4.1.11"
+ resolved "https://registry.yarnpkg.com/tailwindcss/-/tailwindcss-4.1.11.tgz#799af3e98c19c5baaefafc6e0c16304a0e684854"
+ integrity sha512-2E9TBm6MDD/xKYe+dvJZAmg3yxIEDNRc0jwlNyDg/4Fil2QcSLjFKGVff0lAf1jjeaArlG/M75Ey/EYr/OJtBA==
tapable@^2.2.0:
- version "2.2.1"
- resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.1.tgz#1967a73ef4060a82f12ab96af86d52fdb76eeca0"
- integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==
+ version "2.2.2"
+ resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.2.tgz#ab4984340d30cb9989a490032f086dbb8b56d872"
+ integrity sha512-Re10+NauLTMCudc7T5WLFLAwDhQ0JWdrMK+9B2M8zR5hRExKmsRDCBA7/aV/pNJFltmBFO5BAMlQFi/vq3nKOg==
tar-fs@^2.0.0:
- version "2.1.2"
- resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-2.1.2.tgz#425f154f3404cb16cb8ff6e671d45ab2ed9596c5"
- integrity sha512-EsaAXwxmx8UB7FRKqeozqEPop69DXcmYwTQwXvyAPF352HJsPdkVhvTaDPYqfNgruveJIJy3TA2l+2zj8LJIJA==
+ version "2.1.3"
+ resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-2.1.3.tgz#fb3b8843a26b6f13a08e606f7922875eb1fbbf92"
+ integrity sha512-090nwYJDmlhwFwEW3QQl+vaNnxsO2yVsd45eTKRBzSzu+hlb1w2K9inVq5b0ngXuLVqQ4ApvsUHHnu/zQNkWAg==
dependencies:
chownr "^1.1.1"
mkdirp-classic "^0.5.2"
@@ -7127,9 +8477,9 @@ tar-fs@^2.0.0:
tar-stream "^2.1.4"
tar-fs@^3.0.4:
- version "3.0.8"
- resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-3.0.8.tgz#8f62012537d5ff89252d01e48690dc4ebed33ab7"
- integrity sha512-ZoROL70jptorGAlgAYiLoBLItEKw/fUxg9BSYK/dF/GAGYFJOJJJMvjPAKDJraCXFwadD456FCuvLWgfhMsPwg==
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-3.1.0.tgz#4675e2254d81410e609d91581a762608de999d25"
+ integrity sha512-5Mty5y/sOF1YWj1J6GiBodjlDc05CUR8PKXrsnFAiSG0xA+GHeWLovaZPYUDXkH/1iKRf2+M5+OrRgzC7O9b7w==
dependencies:
pump "^3.0.0"
tar-stream "^3.1.5"
@@ -7157,7 +8507,7 @@ tar-stream@^3.0.0, tar-stream@^3.1.5:
fast-fifo "^1.2.0"
streamx "^2.15.0"
-tar@^7.4.0:
+tar@^7.4.0, tar@^7.4.3:
version "7.4.3"
resolved "https://registry.yarnpkg.com/tar/-/tar-7.4.3.tgz#88bbe9286a3fcd900e94592cda7a22b192e80571"
integrity sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw==
@@ -7170,12 +8520,12 @@ tar@^7.4.0:
yallist "^5.0.0"
terser@^5.17.4:
- version "5.39.0"
- resolved "https://registry.yarnpkg.com/terser/-/terser-5.39.0.tgz#0e82033ed57b3ddf1f96708d123cca717d86ca3a"
- integrity sha512-LBAhFyLho16harJoWMg/nZsQYgTrg5jXOn2nCYjRUcZZEdE3qa2zb8QEDRUGVZBW4rlazf2fxkg8tztybTaqWw==
+ version "5.43.1"
+ resolved "https://registry.yarnpkg.com/terser/-/terser-5.43.1.tgz#88387f4f9794ff1a29e7ad61fb2932e25b4fdb6d"
+ integrity sha512-+6erLbBm0+LROX2sPXlUYx/ux5PyE9K/a92Wrt6oA+WDAoFTdpHE5tCYCI5PNzq2y8df4rA+QgHLJuR4jNymsg==
dependencies:
"@jridgewell/source-map" "^0.3.3"
- acorn "^8.8.2"
+ acorn "^8.14.0"
commander "^2.20.0"
source-map-support "~0.5.20"
@@ -7186,6 +8536,18 @@ text-decoder@^1.1.0:
dependencies:
b4a "^1.6.4"
+text-hex@1.0.x:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/text-hex/-/text-hex-1.0.0.tgz#69dc9c1b17446ee79a92bf5b884bb4b9127506f5"
+ integrity sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==
+
+thread-stream@^3.0.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/thread-stream/-/thread-stream-3.1.0.tgz#4b2ef252a7c215064507d4ef70c05a5e2d34c4f1"
+ integrity sha512-OqyPZ9u96VohAyMfJykzmivOrY2wfMSf3C5TtFJVgN+Hm6aj+voFhlK+kZEIv2FBh1X6Xp3DlnCOfEQ3B2J86A==
+ dependencies:
+ real-require "^0.2.0"
+
through2@4.0.2:
version "4.0.2"
resolved "https://registry.yarnpkg.com/through2/-/through2-4.0.2.tgz#a7ce3ac2a7a8b0b966c80e7c49f0484c3b239764"
@@ -7213,14 +8575,26 @@ tinyexec@^1.0.1:
resolved "https://registry.yarnpkg.com/tinyexec/-/tinyexec-1.0.1.tgz#70c31ab7abbb4aea0a24f55d120e5990bfa1e0b1"
integrity sha512-5uC6DDlmeqiOwCPmK9jMSdOuZTh8bU39Ys6yidB+UTt5hfZUPGAypSgFRiEp+jbi9qH40BLDvy85jIU88wKSqw==
-tinyglobby@0.2.12, tinyglobby@^0.2.12:
- version "0.2.12"
- resolved "https://registry.yarnpkg.com/tinyglobby/-/tinyglobby-0.2.12.tgz#ac941a42e0c5773bd0b5d08f32de82e74a1a61b5"
- integrity sha512-qkf4trmKSIiMTs/E63cxH+ojC2unam7rJ0WrauAzpT3ECNTxGRMlaXxVbfxMUC/w0LaYk6jQ4y/nGR9uBO3tww==
+tinyglobby@0.2.14, tinyglobby@^0.2.13, tinyglobby@^0.2.14:
+ version "0.2.14"
+ resolved "https://registry.yarnpkg.com/tinyglobby/-/tinyglobby-0.2.14.tgz#5280b0cf3f972b050e74ae88406c0a6a58f4079d"
+ integrity sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==
dependencies:
- fdir "^6.4.3"
+ fdir "^6.4.4"
picomatch "^4.0.2"
+tmp-promise@^3.0.2:
+ version "3.0.3"
+ resolved "https://registry.yarnpkg.com/tmp-promise/-/tmp-promise-3.0.3.tgz#60a1a1cc98c988674fcbfd23b6e3367bdeac4ce7"
+ integrity sha512-RwM7MoPojPxsOBYnyd2hy0bxtIlVrihNs9pj5SUvY8Zz1sQcQG2tG1hSr8PDxfgEB8RNKDhqbIlroIarSNDNsQ==
+ dependencies:
+ tmp "^0.2.0"
+
+tmp@^0.2.0:
+ version "0.2.4"
+ resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.2.4.tgz#c6db987a2ccc97f812f17137b36af2b6521b0d13"
+ integrity sha512-UdiSoX6ypifLmrfQ/XfiawN6hkjSBpCjhKxxZcWlUUmoXLaCKQU0bx4HF/tdDK2uzRuchf1txGvrWBzYREssoQ==
+
to-regex-range@^5.0.1:
version "5.0.1"
resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4"
@@ -7241,6 +8615,16 @@ token-types@^5.0.1:
"@tokenizer/token" "^0.3.0"
ieee754 "^1.2.1"
+toml@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/toml/-/toml-3.0.0.tgz#342160f1af1904ec9d204d03a5d61222d762c5ee"
+ integrity sha512-y/mWCZinnvxjTKYhJ+pYxwD0mRLVvOtdS2Awbgxln6iEnt4rk0yBxeSBHkGJcPucRiG0e55mwWp+g/05rsrd6w==
+
+tosource@^2.0.0-alpha.3:
+ version "2.0.0-alpha.3"
+ resolved "https://registry.yarnpkg.com/tosource/-/tosource-2.0.0-alpha.3.tgz#ef385dac9092e009bf25c018838ddaae436daeb6"
+ integrity sha512-KAB2lrSS48y91MzFPFuDg4hLbvDiyTjOVgaK7Erw+5AmZXNq4sFRVn8r6yxSLuNs15PaokrDRpS61ERY9uZOug==
+
totalist@^3.0.0:
version "3.0.1"
resolved "https://registry.yarnpkg.com/totalist/-/totalist-3.0.1.tgz#ba3a3d600c915b1a97872348f79c127475f6acf8"
@@ -7251,12 +8635,24 @@ tr46@~0.0.3:
resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a"
integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==
-ts-api-utils@^2.0.1:
+triple-beam@^1.3.0:
+ version "1.4.1"
+ resolved "https://registry.yarnpkg.com/triple-beam/-/triple-beam-1.4.1.tgz#6fde70271dc6e5d73ca0c3b24e2d92afb7441984"
+ integrity sha512-aZbgViZrg1QNcG+LULa7nhZpJTZSLm/mXnHXnbAbjmN5aSa0y7V+wvv6+4WaBtpISJzThKy+PIPxc1Nq1EJ9mg==
+
+truncate-utf8-bytes@^1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/truncate-utf8-bytes/-/truncate-utf8-bytes-1.0.2.tgz#405923909592d56f78a5818434b0b78489ca5f2b"
+ integrity sha512-95Pu1QXQvruGEhv62XCMO3Mm90GscOCClvrIUwCM0PYOXK3kaF3l3sIHxx71ThJfcbM2O5Au6SO3AWCSEfW4mQ==
+ dependencies:
+ utf8-byte-length "^1.0.1"
+
+ts-api-utils@^2.1.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/ts-api-utils/-/ts-api-utils-2.1.0.tgz#595f7094e46eed364c13fd23e75f9513d29baf91"
integrity sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==
-tslib@^2.4.0, tslib@^2.6.2, tslib@^2.8.0, tslib@^2.8.1:
+tslib@^2.4.0, tslib@^2.6.3, tslib@^2.8.0, tslib@^2.8.1:
version "2.8.1"
resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.8.1.tgz#612efe4ed235d567e8aba5f2a5fab70280ade83f"
integrity sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==
@@ -7282,35 +8678,30 @@ type-check@^0.4.0, type-check@~0.4.0:
dependencies:
prelude-ls "^1.2.1"
-type-fest@^4.18.2:
- version "4.38.0"
- resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-4.38.0.tgz#659fa14d1a71c2811400aa3b5272627e0c1e6b96"
- integrity sha512-2dBz5D5ycHIoliLYLi0Q2V7KRaDlH0uWIvmk7TYlAg5slqwiPv1ezJdZm1QEM0xgk29oYWMCbIG7E6gHpvChlg==
-
-type-fest@^4.37.0, type-fest@^4.6.0:
- version "4.39.1"
- resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-4.39.1.tgz#7521f6944e279abaf79cf60cfbc4823f4858083e"
- integrity sha512-uW9qzd66uyHYxwyVBYiwS4Oi0qZyUqwjU+Oevr6ZogYiXt99EOYtwvzMSLw1c3lYo2HzJsep/NB23iEVEgjG/w==
+type-fest@^4.18.2, type-fest@^4.39.1, type-fest@^4.6.0:
+ version "4.41.0"
+ resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-4.41.0.tgz#6ae1c8e5731273c2bf1f58ad39cbae2c91a46c58"
+ integrity sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==
type-level-regexp@~0.1.17:
version "0.1.17"
resolved "https://registry.yarnpkg.com/type-level-regexp/-/type-level-regexp-0.1.17.tgz#ec1bf7dd65b85201f9863031d6f023bdefc2410f"
integrity sha512-wTk4DH3cxwk196uGLK/E9pE45aLfeKJacKmcEgEOA/q5dnPGNxXt0cfYdFxb57L+sEpf1oJH4Dnx/pnRcku9jg==
-typescript@^5.8.3:
+typescript@^5.6.2, typescript@^5.7.3, typescript@^5.8.3:
version "5.8.3"
resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.8.3.tgz#92f8a3e5e3cf497356f4178c34cd65a7f5e8440e"
integrity sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==
-ufo@^1.1.2, ufo@^1.3.2, ufo@^1.4.0, ufo@^1.5.4:
- version "1.5.4"
- resolved "https://registry.yarnpkg.com/ufo/-/ufo-1.5.4.tgz#16d6949674ca0c9e0fbbae1fa20a71d7b1ded754"
- integrity sha512-UsUk3byDzKd04EyoZ7U4DOlxQaD14JUKQl6/P7wiX4FNvUfm3XL246n9W5AmqwW5RSFJ27NAuM0iLscAOYUiGQ==
+ufo@^1.1.2, ufo@^1.3.2, ufo@^1.5.4, ufo@^1.6.1:
+ version "1.6.1"
+ resolved "https://registry.yarnpkg.com/ufo/-/ufo-1.6.1.tgz#ac2db1d54614d1b22c1d603e3aef44a85d8f146b"
+ integrity sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA==
-ultrahtml@^1.5.3:
- version "1.5.3"
- resolved "https://registry.yarnpkg.com/ultrahtml/-/ultrahtml-1.5.3.tgz#e7a903a4b28a0e49b71b0801b444050bb0a369c7"
- integrity sha512-GykOvZwgDWZlTQMtp5jrD4BVL+gNn2NVlVafjcFUJ7taY20tqYdwdoWBFy6GBJsNTZe1GkGPkSl5knQAjtgceg==
+ultrahtml@^1.6.0:
+ version "1.6.0"
+ resolved "https://registry.yarnpkg.com/ultrahtml/-/ultrahtml-1.6.0.tgz#0d1aad7bbfeae512438d30e799c11622127a1ac8"
+ integrity sha512-R9fBn90VTJrqqLDwyMph+HGne8eqY1iPfYhPzZrvKpIfwkWZbcYlfpsb8B9dTvBfpy1/hqAD7Wi8EKfP9e8zdw==
uncrypto@^0.1.3:
version "0.1.3"
@@ -7332,26 +8723,36 @@ unctx@^2.4.1:
magic-string "^0.30.17"
unplugin "^2.1.0"
-undici-types@~6.20.0:
- version "6.20.0"
- resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-6.20.0.tgz#8171bf22c1f588d1554d55bf204bc624af388433"
- integrity sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==
+undici-types@~6.21.0:
+ version "6.21.0"
+ resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-6.21.0.tgz#691d00af3909be93a7faa13be61b3a5b50ef12cb"
+ integrity sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==
-unenv@^2.0.0-rc.15:
- version "2.0.0-rc.15"
- resolved "https://registry.yarnpkg.com/unenv/-/unenv-2.0.0-rc.15.tgz#7fe427b6634f00bda1ade4fecdbc6b2dd7af63be"
- integrity sha512-J/rEIZU8w6FOfLNz/hNKsnY+fFHWnu9MH4yRbSZF3xbbGHovcetXPs7sD+9p8L6CeNC//I9bhRYAOsBt2u7/OA==
+undici-types@~7.8.0:
+ version "7.8.0"
+ resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-7.8.0.tgz#de00b85b710c54122e44fbfd911f8d70174cd294"
+ integrity sha512-9UJ2xGDvQ43tYyVMpuHlsgApydB8ZKfVYTsLDhXkFL/6gfkp+U8xTGdh8pMJv1SpZna0zxG1DwsKZsreLbXBxw==
+
+undici@^7.12.0:
+ version "7.12.0"
+ resolved "https://registry.yarnpkg.com/undici/-/undici-7.12.0.tgz#e93244fa49383e8a0e1a4295048fd454541c7ccb"
+ integrity sha512-GrKEsc3ughskmGA9jevVlIOPMiiAHJ4OFUtaAH+NhfTUSiZ1wMPIQqQvAJUrJspFXJt3EBWgpAeoHEDVT1IBug==
+
+unenv@^2.0.0-rc.18:
+ version "2.0.0-rc.18"
+ resolved "https://registry.yarnpkg.com/unenv/-/unenv-2.0.0-rc.18.tgz#967e9c797e2221a4b03879f48e3a15efaeb96c4b"
+ integrity sha512-O0oVQVJ2X3Q8H4HITJr4e2cWxMYBeZ+p8S25yoKCxVCgDWtIJDcgwWNonYz12tI3ylVQCRyPV/Bdq0KJeXo7AA==
dependencies:
defu "^6.1.4"
- exsolve "^1.0.4"
+ exsolve "^1.0.7"
ohash "^2.0.11"
pathe "^2.0.3"
- ufo "^1.5.4"
+ ufo "^1.6.1"
-unhead@2.0.5:
- version "2.0.5"
- resolved "https://registry.yarnpkg.com/unhead/-/unhead-2.0.5.tgz#66ad4b3bddbcb19d90eff38bf680e1407c04075e"
- integrity sha512-bG4wyp+KuW+ivQYtTQvnvtMM55ziIrQ9Yq1/VAm099buBgH0CoBWgu39jkSUoE4oZ4Qki8SsnMbq2gL0h3/sUA==
+unhead@2.0.12:
+ version "2.0.12"
+ resolved "https://registry.yarnpkg.com/unhead/-/unhead-2.0.12.tgz#70ad5a098890c8de493994b3ee354bc84f173264"
+ integrity sha512-5oo0lwz81XDXCmrHGzgmbaNOxM8R9MZ3FkEs2ROHeW8e16xsrv7qXykENlISrcxr3RLPHQEsD1b6js9P2Oj/Ow==
dependencies:
hookable "^5.5.3"
@@ -7381,39 +8782,51 @@ unicorn-magic@^0.3.0:
resolved "https://registry.yarnpkg.com/unicorn-magic/-/unicorn-magic-0.3.0.tgz#4efd45c85a69e0dd576d25532fbfa22aa5c8a104"
integrity sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==
-unifont@^0.1.7:
- version "0.1.7"
- resolved "https://registry.yarnpkg.com/unifont/-/unifont-0.1.7.tgz#17b09cc6c98c10660a13b7d8fa582097ba2c20c7"
- integrity sha512-UyN6r/TUyl69iW/jhXaCtuwA6bP9ZSLhVViwgP8LH9EHRGk5FyIMDxvClqD5z2BV6MI9GMATzd0dyLqFxKkUmQ==
+unifont@^0.4.1:
+ version "0.4.1"
+ resolved "https://registry.yarnpkg.com/unifont/-/unifont-0.4.1.tgz#b434984e11c8490929daa6a70c84c95d5459a004"
+ integrity sha512-zKSY9qO8svWYns+FGKjyVdLvpGPwqmsCjeJLN1xndMiqxHWBAhoWDMYMG960MxeV48clBmG+fDP59dHY1VoZvg==
dependencies:
css-tree "^3.0.0"
- ohash "^1.1.4"
+ ohash "^2.0.0"
-unimport@^4.1.2, unimport@^4.1.3:
- version "4.1.3"
- resolved "https://registry.yarnpkg.com/unimport/-/unimport-4.1.3.tgz#938f37f90faa6f29dd156ded98f1990bd5acee50"
- integrity sha512-H+IVJ7rAkE3b+oC8rSJ2FsPaVsweeMC8eKZc+C6Mz7+hxDF45AnrY/tVCNRBvzMwWNcJEV67WdAVcal27iMjOw==
+unimport@^5.1.0, unimport@^5.2.0:
+ version "5.2.0"
+ resolved "https://registry.yarnpkg.com/unimport/-/unimport-5.2.0.tgz#bb0277d268e56b2a65655e8147f5998b4cb782cf"
+ integrity sha512-bTuAMMOOqIAyjV4i4UH7P07pO+EsVxmhOzQ2YJ290J6mkLUdozNhb5I/YoOEheeNADC03ent3Qj07X0fWfUpmw==
dependencies:
- acorn "^8.14.1"
+ acorn "^8.15.0"
escape-string-regexp "^5.0.0"
estree-walker "^3.0.3"
local-pkg "^1.1.1"
magic-string "^0.30.17"
mlly "^1.7.4"
pathe "^2.0.3"
- picomatch "^4.0.2"
- pkg-types "^2.1.0"
+ picomatch "^4.0.3"
+ pkg-types "^2.2.0"
scule "^1.3.0"
strip-literal "^3.0.0"
- tinyglobby "^0.2.12"
- unplugin "^2.2.2"
+ tinyglobby "^0.2.14"
+ unplugin "^2.3.5"
unplugin-utils "^0.2.4"
+universalify@^0.1.0, universalify@^0.1.2:
+ version "0.1.2"
+ resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66"
+ integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==
+
universalify@^2.0.0:
version "2.0.1"
resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.1.tgz#168efc2180964e6386d061e094df61afe239b18d"
integrity sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==
+unixify@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/unixify/-/unixify-1.0.0.tgz#3a641c8c2ffbce4da683a5c70f03a462940c2090"
+ integrity sha512-6bc58dPYhCMHHuwxldQxO3RRNZ4eCogZ/st++0+fcC1nr0jiGUtAdBJ2qzmLQWSxbtz42pWt4QQMiZ9HvZf5cg==
+ dependencies:
+ normalize-path "^2.1.1"
+
unplugin-remove@^1.0.3:
version "1.0.3"
resolved "https://registry.yarnpkg.com/unplugin-remove/-/unplugin-remove-1.0.3.tgz#daf24110c2a0f5f679bb72aed9418078b1008043"
@@ -7427,7 +8840,7 @@ unplugin-remove@^1.0.3:
magic-string "^0.30.11"
unplugin "^1.12.0"
-unplugin-utils@^0.2.0, unplugin-utils@^0.2.3, unplugin-utils@^0.2.4:
+unplugin-utils@^0.2.3, unplugin-utils@^0.2.4:
version "0.2.4"
resolved "https://registry.yarnpkg.com/unplugin-utils/-/unplugin-utils-0.2.4.tgz#56e4029a6906645a10644f8befc404b06d5d24d0"
integrity sha512-8U/MtpkPkkk3Atewj1+RcKIjb5WBimZ/WSLhhR3w6SsIj8XJuKTacSP8g+2JhfSGw0Cb125Y+2zA/IzJZDVbhA==
@@ -7456,7 +8869,27 @@ unplugin-vue-router@^0.12.0:
unplugin-utils "^0.2.3"
yaml "^2.7.0"
-unplugin@^1.10.0, unplugin@^1.12.0, unplugin@^1.8.3:
+unplugin-vue-router@^0.14.0:
+ version "0.14.0"
+ resolved "https://registry.yarnpkg.com/unplugin-vue-router/-/unplugin-vue-router-0.14.0.tgz#84de65620741b3b76a5a7b049e2491b873e1fc93"
+ integrity sha512-ipjunvS5e2aFHBAUFuLbHl2aHKbXXXBhTxGT9wZx66fNVPdEQzVVitF8nODr1plANhTTa3UZ+DQu9uyLngMzoQ==
+ dependencies:
+ "@vue-macros/common" "3.0.0-beta.15"
+ ast-walker-scope "^0.8.1"
+ chokidar "^4.0.3"
+ fast-glob "^3.3.3"
+ json5 "^2.2.3"
+ local-pkg "^1.1.1"
+ magic-string "^0.30.17"
+ mlly "^1.7.4"
+ pathe "^2.0.3"
+ picomatch "^4.0.2"
+ scule "^1.3.0"
+ unplugin "^2.3.5"
+ unplugin-utils "^0.2.4"
+ yaml "^2.8.0"
+
+unplugin@^1.1.0, unplugin@^1.10.0, unplugin@^1.12.0:
version "1.16.1"
resolved "https://registry.yarnpkg.com/unplugin/-/unplugin-1.16.1.tgz#a844d2e3c3b14a4ac2945c42be80409321b61199"
integrity sha512-4/u/j4FrCKdi17jaxuJA0jClGxB1AvU2hw/IuayPc4ay1XGaJs/rbb4v5WKwAjNifjmXK9PIFyuPiaK8azyR9w==
@@ -7464,48 +8897,55 @@ unplugin@^1.10.0, unplugin@^1.12.0, unplugin@^1.8.3:
acorn "^8.14.0"
webpack-virtual-modules "^0.6.2"
-unplugin@^2.1.0, unplugin@^2.2.0, unplugin@^2.2.2:
- version "2.2.2"
- resolved "https://registry.yarnpkg.com/unplugin/-/unplugin-2.2.2.tgz#82f8c638ba944f6135e99ae5a8dc9eba9601b4a8"
- integrity sha512-Qp+iiD+qCRnUek+nDoYvtWX7tfnYyXsrOnJ452FRTgOyKmTM7TUJ3l+PLPJOOWPTUyKISKp4isC5JJPSXUjGgw==
+unplugin@^2.0.0, unplugin@^2.1.0, unplugin@^2.2.0, unplugin@^2.2.2, unplugin@^2.3.2, unplugin@^2.3.3, unplugin@^2.3.5:
+ version "2.3.5"
+ resolved "https://registry.yarnpkg.com/unplugin/-/unplugin-2.3.5.tgz#c689d806e2a15c95aeb794f285356c6bcdea4a2e"
+ integrity sha512-RyWSb5AHmGtjjNQ6gIlA67sHOsWpsbWpwDokLwTcejVdOjEkJZh7QKu14J00gDDVSh8kGH4KYC/TNBceXFZhtw==
dependencies:
acorn "^8.14.1"
+ picomatch "^4.0.2"
webpack-virtual-modules "^0.6.2"
-unrs-resolver@^1.4.1:
- version "1.4.1"
- resolved "https://registry.yarnpkg.com/unrs-resolver/-/unrs-resolver-1.4.1.tgz#da01a5ca745a431b109af6798a775d9c4ba4ae0d"
- integrity sha512-MhPB3wBI5BR8TGieTb08XuYlE8oFVEXdSAgat3psdlRyejl8ojQ8iqPcjh094qCZ1r+TnkxzP6BeCd/umfHckQ==
+unrs-resolver@^1.9.2:
+ version "1.11.1"
+ resolved "https://registry.yarnpkg.com/unrs-resolver/-/unrs-resolver-1.11.1.tgz#be9cd8686c99ef53ecb96df2a473c64d304048a9"
+ integrity sha512-bSjt9pjaEBnNiGgc9rUiHGKv5l4/TGzDmYw3RhnkJGtLhbnnA/5qJj7x3dNDCRx/PJxu774LlH8lCOlB4hEfKg==
+ dependencies:
+ napi-postinstall "^0.3.0"
optionalDependencies:
- "@unrs/resolver-binding-darwin-arm64" "1.4.1"
- "@unrs/resolver-binding-darwin-x64" "1.4.1"
- "@unrs/resolver-binding-freebsd-x64" "1.4.1"
- "@unrs/resolver-binding-linux-arm-gnueabihf" "1.4.1"
- "@unrs/resolver-binding-linux-arm-musleabihf" "1.4.1"
- "@unrs/resolver-binding-linux-arm64-gnu" "1.4.1"
- "@unrs/resolver-binding-linux-arm64-musl" "1.4.1"
- "@unrs/resolver-binding-linux-ppc64-gnu" "1.4.1"
- "@unrs/resolver-binding-linux-s390x-gnu" "1.4.1"
- "@unrs/resolver-binding-linux-x64-gnu" "1.4.1"
- "@unrs/resolver-binding-linux-x64-musl" "1.4.1"
- "@unrs/resolver-binding-wasm32-wasi" "1.4.1"
- "@unrs/resolver-binding-win32-arm64-msvc" "1.4.1"
- "@unrs/resolver-binding-win32-ia32-msvc" "1.4.1"
- "@unrs/resolver-binding-win32-x64-msvc" "1.4.1"
+ "@unrs/resolver-binding-android-arm-eabi" "1.11.1"
+ "@unrs/resolver-binding-android-arm64" "1.11.1"
+ "@unrs/resolver-binding-darwin-arm64" "1.11.1"
+ "@unrs/resolver-binding-darwin-x64" "1.11.1"
+ "@unrs/resolver-binding-freebsd-x64" "1.11.1"
+ "@unrs/resolver-binding-linux-arm-gnueabihf" "1.11.1"
+ "@unrs/resolver-binding-linux-arm-musleabihf" "1.11.1"
+ "@unrs/resolver-binding-linux-arm64-gnu" "1.11.1"
+ "@unrs/resolver-binding-linux-arm64-musl" "1.11.1"
+ "@unrs/resolver-binding-linux-ppc64-gnu" "1.11.1"
+ "@unrs/resolver-binding-linux-riscv64-gnu" "1.11.1"
+ "@unrs/resolver-binding-linux-riscv64-musl" "1.11.1"
+ "@unrs/resolver-binding-linux-s390x-gnu" "1.11.1"
+ "@unrs/resolver-binding-linux-x64-gnu" "1.11.1"
+ "@unrs/resolver-binding-linux-x64-musl" "1.11.1"
+ "@unrs/resolver-binding-wasm32-wasi" "1.11.1"
+ "@unrs/resolver-binding-win32-arm64-msvc" "1.11.1"
+ "@unrs/resolver-binding-win32-ia32-msvc" "1.11.1"
+ "@unrs/resolver-binding-win32-x64-msvc" "1.11.1"
-unstorage@^1.10.1, unstorage@^1.15.0:
- version "1.15.0"
- resolved "https://registry.yarnpkg.com/unstorage/-/unstorage-1.15.0.tgz#d1f23cba0901c5317d15a751a299e50fbb637674"
- integrity sha512-m40eHdGY/gA6xAPqo8eaxqXgBuzQTlAKfmB1iF7oCKXE1HfwHwzDJBywK+qQGn52dta+bPlZluPF7++yR3p/bg==
+unstorage@^1.10.1, unstorage@^1.15.0, unstorage@^1.16.0, unstorage@^1.16.1:
+ version "1.16.1"
+ resolved "https://registry.yarnpkg.com/unstorage/-/unstorage-1.16.1.tgz#b2c25d05610a64de7be61e54f61ec79c5f9ba43c"
+ integrity sha512-gdpZ3guLDhz+zWIlYP1UwQ259tG5T5vYRzDaHMkQ1bBY1SQPutvZnrRjTFaWUUpseErJIgAZS51h6NOcZVZiqQ==
dependencies:
anymatch "^3.1.3"
chokidar "^4.0.3"
- destr "^2.0.3"
- h3 "^1.15.0"
+ destr "^2.0.5"
+ h3 "^1.15.3"
lru-cache "^10.4.3"
node-fetch-native "^1.6.6"
ofetch "^1.4.1"
- ufo "^1.5.4"
+ ufo "^1.6.1"
untun@^0.1.3:
version "0.1.3"
@@ -7539,7 +8979,7 @@ unwasm@^0.3.9:
pkg-types "^1.0.3"
unplugin "^1.10.0"
-update-browserslist-db@^1.1.1:
+update-browserslist-db@^1.1.3:
version "1.1.3"
resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz#348377dd245216f9e7060ff50b15a1b740b75420"
integrity sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==
@@ -7559,11 +8999,31 @@ uri-js@^4.2.2:
dependencies:
punycode "^2.1.0"
+urlpattern-polyfill@8.0.2:
+ version "8.0.2"
+ resolved "https://registry.yarnpkg.com/urlpattern-polyfill/-/urlpattern-polyfill-8.0.2.tgz#99f096e35eff8bf4b5a2aa7d58a1523d6ebc7ce5"
+ integrity sha512-Qp95D4TPJl1kC9SKigDcqgyM2VDVO4RiJc2d4qe5GrYm+zbIQCWWKAFaJNQ4BhdFeDGwBmAxqJBwWSJDb9T3BQ==
+
+urlpattern-polyfill@^10.0.0:
+ version "10.1.0"
+ resolved "https://registry.yarnpkg.com/urlpattern-polyfill/-/urlpattern-polyfill-10.1.0.tgz#1b2517e614136c73ba32948d5e7a3a063cba8e74"
+ integrity sha512-IGjKp/o0NL3Bso1PymYURCJxMPNAf/ILOpendP9f5B6e1rTJgdgiOvgfoT8VxCAdY+Wisb9uhGaJJf3yZ2V9nw==
+
+utf8-byte-length@^1.0.1:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/utf8-byte-length/-/utf8-byte-length-1.0.5.tgz#f9f63910d15536ee2b2d5dd4665389715eac5c1e"
+ integrity sha512-Xn0w3MtiQ6zoz2vFyUVruaCL53O/DwUvkEeOvj+uulMm0BkUGYWmBYVyElqZaSLhY6ZD0ulfU3aBra2aVT4xfA==
+
util-deprecate@^1.0.1, 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==
+uuid@^11.1.0:
+ version "11.1.0"
+ resolved "https://registry.yarnpkg.com/uuid/-/uuid-11.1.0.tgz#9549028be1753bb934fc96e2bca09bb4105ae912"
+ integrity sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A==
+
validate-npm-package-license@^3.0.4:
version "3.0.4"
resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a"
@@ -7572,95 +9032,107 @@ validate-npm-package-license@^3.0.4:
spdx-correct "^3.0.0"
spdx-expression-parse "^3.0.0"
-vite-dev-rpc@^1.0.7:
- version "1.0.7"
- resolved "https://registry.yarnpkg.com/vite-dev-rpc/-/vite-dev-rpc-1.0.7.tgz#e81567c4e5b7e7d8074af56a2120bd0ea61cbdb7"
- integrity sha512-FxSTEofDbUi2XXujCA+hdzCDkXFG1PXktMjSk1efq9Qb5lOYaaM9zNSvKvPPF7645Bak79kSp1PTooMW2wktcA==
+vite-dev-rpc@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/vite-dev-rpc/-/vite-dev-rpc-1.1.0.tgz#a54be63cc4dbb127bce1360e4b12d9038087c204"
+ integrity sha512-pKXZlgoXGoE8sEKiKJSng4hI1sQ4wi5YT24FCrwrLt6opmkjlqPPVmiPWWJn8M8byMxRGzp1CrFuqQs4M/Z39A==
dependencies:
- birpc "^2.0.19"
- vite-hot-client "^2.0.4"
+ birpc "^2.4.0"
+ vite-hot-client "^2.1.0"
-vite-hot-client@^0.2.4:
- version "0.2.4"
- resolved "https://registry.yarnpkg.com/vite-hot-client/-/vite-hot-client-0.2.4.tgz#c88789f1615cf4e95690cd5fca98b2e449a29637"
- integrity sha512-a1nzURqO7DDmnXqabFOliz908FRmIppkBKsJthS8rbe8hBEXwEwe4C3Pp33Z1JoFCYfVL4kTOMLKk0ZZxREIeA==
+vite-hot-client@^2.0.4, vite-hot-client@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/vite-hot-client/-/vite-hot-client-2.1.0.tgz#88f8469875e0121eae2f460cbf35cb528c049961"
+ integrity sha512-7SpgZmU7R+dDnSmvXE1mfDtnHLHQSisdySVR7lO8ceAXvM0otZeuQQ6C8LrS5d/aYyP/QZ0hI0L+dIPrm4YlFQ==
-vite-hot-client@^2.0.4:
- version "2.0.4"
- resolved "https://registry.yarnpkg.com/vite-hot-client/-/vite-hot-client-2.0.4.tgz#db383e0337c758fbabf14dad26f9a1bcb9e9e175"
- integrity sha512-W9LOGAyGMrbGArYJN4LBCdOC5+Zwh7dHvOHC0KmGKkJhsOzaKbpo/jEjpPKVHIW0/jBWj8RZG0NUxfgA8BxgAg==
-
-vite-node@^3.1.1:
- version "3.1.1"
- resolved "https://registry.yarnpkg.com/vite-node/-/vite-node-3.1.1.tgz#ad186c07859a6e5fca7c7f563e55fb11b16557bc"
- integrity sha512-V+IxPAE2FvXpTCHXyNem0M+gWm6J7eRyWPR6vYoG/Gl+IscNOjXzztUhimQgTxaAoUoj40Qqimaa0NLIOOAH4w==
+vite-node@^3.2.4:
+ version "3.2.4"
+ resolved "https://registry.yarnpkg.com/vite-node/-/vite-node-3.2.4.tgz#f3676d94c4af1e76898c162c92728bca65f7bb07"
+ integrity sha512-EbKSKh+bh1E1IFxeO0pg1n4dvoOTt0UDiXMd/qn++r98+jPO1xtJilvXldeuQ8giIB5IkpjCgMleHMNEsGH6pg==
dependencies:
cac "^6.7.14"
- debug "^4.4.0"
- es-module-lexer "^1.6.0"
+ debug "^4.4.1"
+ es-module-lexer "^1.7.0"
pathe "^2.0.3"
- vite "^5.0.0 || ^6.0.0"
+ vite "^5.0.0 || ^6.0.0 || ^7.0.0-0"
-vite-plugin-checker@^0.9.1:
- version "0.9.1"
- resolved "https://registry.yarnpkg.com/vite-plugin-checker/-/vite-plugin-checker-0.9.1.tgz#9f2166047848cc9199ff05e61d12d0480b680604"
- integrity sha512-neH3CSNWdkZ+zi+WPt/0y5+IO2I0UAI0NX6MaXqU/KxN1Lz6np/7IooRB6VVAMBa4nigqm1GRF6qNa4+EL5jDQ==
+vite-plugin-checker@^0.10.0:
+ version "0.10.1"
+ resolved "https://registry.yarnpkg.com/vite-plugin-checker/-/vite-plugin-checker-0.10.1.tgz#03ea1a341e86d9ba750ed43d8a7296cf8de0d2ee"
+ integrity sha512-imiBsmYTPdjQHIZiEi5BhJ7K8Z/kCjTFMn+Qa4+5ao/a4Yql4yWFcf81FDJqlMiM57iY4Q3Z7PdoEe4KydULYQ==
dependencies:
- "@babel/code-frame" "^7.26.2"
+ "@babel/code-frame" "^7.27.1"
chokidar "^4.0.3"
npm-run-path "^6.0.0"
picocolors "^1.1.1"
picomatch "^4.0.2"
strip-ansi "^7.1.0"
tiny-invariant "^1.3.3"
- tinyglobby "^0.2.12"
+ tinyglobby "^0.2.14"
vscode-uri "^3.1.0"
-vite-plugin-inspect@^11.0.0:
- version "11.0.0"
- resolved "https://registry.yarnpkg.com/vite-plugin-inspect/-/vite-plugin-inspect-11.0.0.tgz#7417875e1e17e066847392e018031d47b48ca987"
- integrity sha512-Q0RDNcMs1mbI2yGRwOzSapnnA6NFO0j88+Vb8pJX0iYMw34WczwKJi3JgheItDhbWRq/CLUR0cs+ajZpcUaIFQ==
+vite-plugin-inspect@^11.3.0:
+ version "11.3.0"
+ resolved "https://registry.yarnpkg.com/vite-plugin-inspect/-/vite-plugin-inspect-11.3.0.tgz#7fbd961a382942e7af5be39da1acdc0f9360f8a6"
+ integrity sha512-vmt7K1WVKQkuiwvsM6e5h3HDJ2pSWTnzoj+JP9Kvu3Sh2G+nFap1F1V7tqpyA4qFxM1GQ84ryffWFGQrwShERQ==
dependencies:
- ansis "^3.16.0"
- debug "^4.4.0"
+ ansis "^4.1.0"
+ debug "^4.4.1"
error-stack-parser-es "^1.0.5"
- ohash "^2.0.4"
- open "^10.1.0"
+ ohash "^2.0.11"
+ open "^10.1.2"
perfect-debounce "^1.0.0"
sirv "^3.0.1"
- unplugin-utils "^0.2.0"
- vite-dev-rpc "^1.0.7"
+ unplugin-utils "^0.2.4"
+ vite-dev-rpc "^1.1.0"
-vite-plugin-vue-tracer@^0.1.3:
- version "0.1.3"
- resolved "https://registry.yarnpkg.com/vite-plugin-vue-tracer/-/vite-plugin-vue-tracer-0.1.3.tgz#6639050fd946aa911f89efd80120fea6e49fd830"
- integrity sha512-+fN6oo0//dwZP9Ax9gRKeUroCqpQ43P57qlWgL0ljCIxAs+Rpqn/L4anIPZPgjDPga5dZH+ZJsshbF0PNJbm3Q==
+vite-plugin-static-copy@^3.1.2:
+ version "3.1.2"
+ resolved "https://registry.yarnpkg.com/vite-plugin-static-copy/-/vite-plugin-static-copy-3.1.2.tgz#5d5e6ce965e5da6a326d47a5feb5033d52db43ca"
+ integrity sha512-aVmYOzptLVOI2b1jL+cmkF7O6uhRv1u5fvOkQgbohWZp2CbR22kn9ZqkCUIt9umKF7UhdbsEpshn1rf4720QFg==
+ dependencies:
+ chokidar "^3.6.0"
+ fs-extra "^11.3.0"
+ p-map "^7.0.3"
+ picocolors "^1.1.1"
+ tinyglobby "^0.2.14"
+
+vite-plugin-vue-tracer@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/vite-plugin-vue-tracer/-/vite-plugin-vue-tracer-1.0.0.tgz#2b664b72bf0be2fd1cd37eec617f4ffb49ac1473"
+ integrity sha512-a+UB9IwGx5uwS4uG/a9kM6fCMnxONDkOTbgCUbhFpiGhqfxrrC1+9BibV7sWwUnwj1Dg6MnRxG0trLgUZslDXA==
dependencies:
estree-walker "^3.0.3"
- exsolve "^1.0.4"
+ exsolve "^1.0.7"
magic-string "^0.30.17"
pathe "^2.0.3"
source-map-js "^1.2.1"
-"vite@^5.0.0 || ^6.0.0":
- version "6.2.3"
- resolved "https://registry.yarnpkg.com/vite/-/vite-6.2.3.tgz#249e92d32886981ab46bc1f049ac72abc6fa81e2"
- integrity sha512-IzwM54g4y9JA/xAeBPNaDXiBF8Jsgl3VBQ2YQ/wOY6fyW3xMdSoltIV3Bo59DErdqdE6RxUfv8W69DvUorE4Eg==
+"vite@^5.0.0 || ^6.0.0 || ^7.0.0-0":
+ version "7.0.6"
+ resolved "https://registry.yarnpkg.com/vite/-/vite-7.0.6.tgz#7866ccb176db4bbeec0adfb3f907f077881591d0"
+ integrity sha512-MHFiOENNBd+Bd9uvc8GEsIzdkn1JxMmEeYX35tI3fv0sJBUTfW5tQsoaOwuY4KhBI09A3dUJ/DXf2yxPVPUceg==
dependencies:
esbuild "^0.25.0"
- postcss "^8.5.3"
- rollup "^4.30.1"
+ fdir "^6.4.6"
+ picomatch "^4.0.3"
+ postcss "^8.5.6"
+ rollup "^4.40.0"
+ tinyglobby "^0.2.14"
optionalDependencies:
fsevents "~2.3.3"
-vite@^6.2.4:
- version "6.2.5"
- resolved "https://registry.yarnpkg.com/vite/-/vite-6.2.5.tgz#d093b5fe8eb96e594761584a966ab13f24457820"
- integrity sha512-j023J/hCAa4pRIUH6J9HemwYfjB5llR2Ps0CWeikOtdR8+pAURAk0DoJC5/mm9kd+UgdnIy7d6HE4EAvlYhPhA==
+vite@^6.3.5:
+ version "6.3.5"
+ resolved "https://registry.yarnpkg.com/vite/-/vite-6.3.5.tgz#fec73879013c9c0128c8d284504c6d19410d12a3"
+ integrity sha512-cZn6NDFE7wdTpINgs++ZJ4N49W2vRp8LCKrn3Ob1kYNtOo21vfDoaV5GzBfLU4MovSAB8uNRm4jgzVQZ+mBzPQ==
dependencies:
esbuild "^0.25.0"
+ fdir "^6.4.4"
+ picomatch "^4.0.2"
postcss "^8.5.3"
- rollup "^4.30.1"
+ rollup "^4.34.9"
+ tinyglobby "^0.2.13"
optionalDependencies:
fsevents "~2.3.3"
@@ -7681,62 +9153,70 @@ vue-devtools-stub@^0.1.0:
resolved "https://registry.yarnpkg.com/vue-devtools-stub/-/vue-devtools-stub-0.1.0.tgz#a65b9485edecd4273cedcb8102c739b83add2c81"
integrity sha512-RutnB7X8c5hjq39NceArgXg28WZtZpGc3+J16ljMiYnFhKvd8hITxSWQSQ5bvldxMDU6gG5mkxl1MTQLXckVSQ==
-vue-eslint-parser@^10.1.1:
- version "10.1.3"
- resolved "https://registry.yarnpkg.com/vue-eslint-parser/-/vue-eslint-parser-10.1.3.tgz#96457823a5915a62001798cfd9cc15a89067bf81"
- integrity sha512-dbCBnd2e02dYWsXoqX5yKUZlOt+ExIpq7hmHKPb5ZqKcjf++Eo0hMseFTZMLKThrUk61m+Uv6A2YSBve6ZvuDQ==
+vue-eslint-parser@^10.2.0:
+ version "10.2.0"
+ resolved "https://registry.yarnpkg.com/vue-eslint-parser/-/vue-eslint-parser-10.2.0.tgz#cb53f89b14c7f5bf6a95c9532e3b2961ab619d61"
+ integrity sha512-CydUvFOQKD928UzZhTp4pr2vWz1L+H99t7Pkln2QSPdvmURT0MoC4wUccfCnuEaihNsu9aYYyk+bep8rlfkUXw==
dependencies:
debug "^4.4.0"
eslint-scope "^8.2.0"
eslint-visitor-keys "^4.2.0"
espree "^10.3.0"
esquery "^1.6.0"
- lodash "^4.17.21"
semver "^7.6.3"
-vue-router@^4.5.0, vue-router@latest:
- version "4.5.0"
- resolved "https://registry.yarnpkg.com/vue-router/-/vue-router-4.5.0.tgz#58fc5fe374e10b6018f910328f756c3dae081f14"
- integrity sha512-HDuk+PuH5monfNuY+ct49mNmkCRK4xJAV9Ts4z9UFc4rzdDnxQLyCMGGc8pKhZhHTVzfanpNwB/lwqevcBwI4w==
+vue-i18n@^10.0.0, vue-i18n@^10.0.7:
+ version "10.0.8"
+ resolved "https://registry.yarnpkg.com/vue-i18n/-/vue-i18n-10.0.8.tgz#adce21f875b29589c8bd602eb28b5c6ad2d85c97"
+ integrity sha512-mIjy4utxMz9lMMo6G9vYePv7gUFt4ztOMhY9/4czDJxZ26xPeJ49MAGa9wBAE3XuXbYCrtVPmPxNjej7JJJkZQ==
+ dependencies:
+ "@intlify/core-base" "10.0.8"
+ "@intlify/shared" "10.0.8"
+ "@vue/devtools-api" "^6.5.0"
+
+vue-router@^4.5.1, vue-router@latest:
+ version "4.5.1"
+ resolved "https://registry.yarnpkg.com/vue-router/-/vue-router-4.5.1.tgz#47bffe2d3a5479d2886a9a244547a853aa0abf69"
+ integrity sha512-ogAF3P97NPm8fJsE4by9dwSYtDwXIY1nFY9T6DyQnGHd1E2Da94w9JIolpe42LJGIl0DwOHBi8TcRPlPGwbTtw==
dependencies:
"@vue/devtools-api" "^6.6.4"
-vue-tsc@^2.2.8:
- version "2.2.8"
- resolved "https://registry.yarnpkg.com/vue-tsc/-/vue-tsc-2.2.8.tgz#7c8e1bd9333d25241a7f9988eedf08c65483158c"
- integrity sha512-jBYKBNFADTN+L+MdesNX/TB3XuDSyaWynKMDgR+yCSln0GQ9Tfb7JS2lr46s2LiFUT1WsmfWsSvIElyxzOPqcQ==
+vue-tsc@^3.0.1:
+ version "3.0.4"
+ resolved "https://registry.yarnpkg.com/vue-tsc/-/vue-tsc-3.0.4.tgz#f04f07a84046c923133ec588ef89ae1300e64e1a"
+ integrity sha512-kZmSEjGtROApVBuaIcoprrXZsFNGon5ggkTJokmhQ/H1hMzCFRPQ0Ed8IHYFsmYJYvHBcdmEQVGVcRuxzPzNbw==
dependencies:
- "@volar/typescript" "~2.4.11"
- "@vue/language-core" "2.2.8"
+ "@volar/typescript" "2.4.20"
+ "@vue/language-core" "3.0.4"
vue3-carousel-nuxt@^1.1.5:
- version "1.1.5"
- resolved "https://registry.yarnpkg.com/vue3-carousel-nuxt/-/vue3-carousel-nuxt-1.1.5.tgz#c12d521d2ab16da7cbe3778d097262cfca1117c0"
- integrity sha512-Ee9gB1gA9WDPk+1Dxg5vb0N/xWkDwDmvAdwZJ2y+NV+yyBbKiyaZHTjpfWy57TuLeqKVWHyzv+RbDVn85l7mQw==
+ version "1.1.6"
+ resolved "https://registry.yarnpkg.com/vue3-carousel-nuxt/-/vue3-carousel-nuxt-1.1.6.tgz#71764a4833f4d865a02bd4236541ef70d3ab44b1"
+ integrity sha512-y5CTJBj3HryL0l+8pzvXyWHTj/SUiBYChsces5GMyKQoad2yMXsdofzpKSrTquoCgrd1hWHUO2DBnN6ougA0Gg==
dependencies:
"@nuxt/kit" "^3.12.4"
- vue3-carousel "^0.13.0"
-
-vue3-carousel@^0.13.0:
- version "0.13.0"
- resolved "https://registry.yarnpkg.com/vue3-carousel/-/vue3-carousel-0.13.0.tgz#cfacf7eae610a41fad4c3aba56ddb49a7776f416"
- integrity sha512-vio91KI4mVMlCDbVhGzW9nIyYqxu0moqroPR/OrJeaCvAK3SJYxqvH36a4/t1oEJYJsTgh+IuNiNi6c+7DVKZg==
+ vue3-carousel "^0.15.0"
vue3-carousel@^0.15.0:
- version "0.15.0"
- resolved "https://registry.yarnpkg.com/vue3-carousel/-/vue3-carousel-0.15.0.tgz#6a666566779dd30027a857ec0d92bfef97f15b27"
- integrity sha512-yYBBEdmvsMNlgKivVHiFMKV7TlWDoMEiVLA+Vb31t1JEQILAQYADMDYYuE9mp6OSGEQpCBgt8e/EpO2MZlQhcw==
+ version "0.15.1"
+ resolved "https://registry.yarnpkg.com/vue3-carousel/-/vue3-carousel-0.15.1.tgz#df8ab7e8545730783555007e400a290497404ef2"
+ integrity sha512-nV2ChLZtgAOikmls8WaVe37vO4Wagk4RYawePHIvXrFtduFnQODyzPx8MmXaAb6l+ka72yAi04ZeCyciiyJMyA==
-vue@^3.5.13, vue@latest:
- version "3.5.13"
- resolved "https://registry.yarnpkg.com/vue/-/vue-3.5.13.tgz#9f760a1a982b09c0c04a867903fc339c9f29ec0a"
- integrity sha512-wmeiSMxkZCSc+PM2w2VRsOYAZC8GdipNFRTsLSfodVqI9mbejKeXEGr8SckuLnrQPGe3oJN5c3K0vpoU9q/wCQ==
+vue3-carousel@^0.16.0:
+ version "0.16.0"
+ resolved "https://registry.yarnpkg.com/vue3-carousel/-/vue3-carousel-0.16.0.tgz#2b15a2ed83082eb3b91d3375d637c6d90d82d8d2"
+ integrity sha512-IKRKtvHP8gNDRHSzINXwFbJ/Zy2HS+Gv2lXPnAEop6pxsvB17+fz2WQlNZ6ytilLkM5DOu/jXPoDQi/xy17bjg==
+
+vue@^3.4, vue@^3.5.17, vue@latest:
+ version "3.5.18"
+ resolved "https://registry.yarnpkg.com/vue/-/vue-3.5.18.tgz#3d622425ad1391a2b0138323211ec784f4415686"
+ integrity sha512-7W4Y4ZbMiQ3SEo+m9lnoNpV9xG7QVMLa+/0RFwwiAVkeYoyGXqWE85jabU4pllJNUzqfLShJ5YLptewhCWUgNA==
dependencies:
- "@vue/compiler-dom" "3.5.13"
- "@vue/compiler-sfc" "3.5.13"
- "@vue/runtime-dom" "3.5.13"
- "@vue/server-renderer" "3.5.13"
- "@vue/shared" "3.5.13"
+ "@vue/compiler-dom" "3.5.18"
+ "@vue/compiler-sfc" "3.5.18"
+ "@vue/runtime-dom" "3.5.18"
+ "@vue/server-renderer" "3.5.18"
+ "@vue/shared" "3.5.18"
vuedraggable@^4.1.0:
version "4.1.0"
@@ -7745,6 +9225,11 @@ vuedraggable@^4.1.0:
dependencies:
sortablejs "1.14.0"
+web-streams-polyfill@^3.0.3:
+ version "3.3.3"
+ resolved "https://registry.yarnpkg.com/web-streams-polyfill/-/web-streams-polyfill-3.3.3.tgz#2073b91a2fdb1fbfbd401e7de0ac9f8214cecb4b"
+ integrity sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==
+
webidl-conversions@^3.0.0:
version "3.0.1"
resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871"
@@ -7755,6 +9240,18 @@ webpack-virtual-modules@^0.6.2:
resolved "https://registry.yarnpkg.com/webpack-virtual-modules/-/webpack-virtual-modules-0.6.2.tgz#057faa9065c8acf48f24cb57ac0e77739ab9a7e8"
integrity sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==
+whatwg-encoding@^3.1.1:
+ version "3.1.1"
+ resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-3.1.1.tgz#d0f4ef769905d426e1688f3e34381a99b60b76e5"
+ integrity sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==
+ dependencies:
+ iconv-lite "0.6.3"
+
+whatwg-mimetype@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-4.0.0.tgz#bc1bf94a985dc50388d54a9258ac405c3ca2fc0a"
+ integrity sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==
+
whatwg-url@^5.0.0:
version "5.0.0"
resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d"
@@ -7777,6 +9274,32 @@ which@^5.0.0:
dependencies:
isexe "^3.1.1"
+winston-transport@^4.9.0:
+ version "4.9.0"
+ resolved "https://registry.yarnpkg.com/winston-transport/-/winston-transport-4.9.0.tgz#3bba345de10297654ea6f33519424560003b3bf9"
+ integrity sha512-8drMJ4rkgaPo1Me4zD/3WLfI/zPdA9o2IipKODunnGDcuqbHwjsbB79ylv04LCGGzU0xQ6vTznOMpQGaLhhm6A==
+ dependencies:
+ logform "^2.7.0"
+ readable-stream "^3.6.2"
+ triple-beam "^1.3.0"
+
+winston@^3.10.0:
+ version "3.17.0"
+ resolved "https://registry.yarnpkg.com/winston/-/winston-3.17.0.tgz#74b8665ce9b4ea7b29d0922cfccf852a08a11423"
+ integrity sha512-DLiFIXYC5fMPxaRg832S6F5mJYvePtmO5G9v9IgUFPhXm9/GkXarH/TUrBAVzhTCzAj9anE/+GjrgXp/54nOgw==
+ dependencies:
+ "@colors/colors" "^1.6.0"
+ "@dabh/diagnostics" "^2.0.2"
+ async "^3.2.3"
+ is-stream "^2.0.0"
+ logform "^2.7.0"
+ one-time "^1.0.0"
+ readable-stream "^3.4.0"
+ safe-stable-stringify "^2.3.1"
+ stack-trace "0.0.x"
+ triple-beam "^1.3.0"
+ winston-transport "^4.9.0"
+
word-wrap@^1.2.5:
version "1.2.5"
resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.5.tgz#d2c45c6dd4fbce621a66f136cbe328afd0410b34"
@@ -7814,10 +9337,25 @@ wrappy@1:
resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f"
integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==
-ws@^8.18.1:
- version "8.18.1"
- resolved "https://registry.yarnpkg.com/ws/-/ws-8.18.1.tgz#ea131d3784e1dfdff91adb0a4a116b127515e3cb"
- integrity sha512-RKW2aJZMXeMxVpnZ6bck+RswznaxmzdULiBr6KY7XkTnW8uvt0iT9H5DkHUChXrc+uurzwa0rVI16n/Xzjdz1w==
+write-file-atomic@^6.0.0:
+ version "6.0.0"
+ resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-6.0.0.tgz#e9c89c8191b3ef0606bc79fb92681aa1aa16fa93"
+ integrity sha512-GmqrO8WJ1NuzJ2DrziEI2o57jKAVIQNf8a18W3nCYU3H7PNWqCCVTeH6/NQE93CIllIgQS98rrmVkYgTX9fFJQ==
+ dependencies:
+ imurmurhash "^0.1.4"
+ signal-exit "^4.0.1"
+
+ws@^8.18.2, ws@^8.18.3:
+ version "8.18.3"
+ resolved "https://registry.yarnpkg.com/ws/-/ws-8.18.3.tgz#b56b88abffde62791c639170400c93dcb0c95472"
+ integrity sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==
+
+wsl-utils@^0.1.0:
+ version "0.1.0"
+ resolved "https://registry.yarnpkg.com/wsl-utils/-/wsl-utils-0.1.0.tgz#8783d4df671d4d50365be2ee4c71917a0557baab"
+ integrity sha512-h3Fbisa2nKGPxCpm89Hk33lBLsnaGBvctQopaBSOW/uIs6FTe1ATyAnKFJrzVs9vpGdsTe73WF3V4lIsk4Gacw==
+ dependencies:
+ is-wsl "^3.1.0"
xml-name-validator@^4.0.0:
version "4.0.0"
@@ -7847,17 +9385,25 @@ yallist@^5.0.0:
resolved "https://registry.yarnpkg.com/yallist/-/yallist-5.0.0.tgz#00e2de443639ed0d78fd87de0d27469fbcffb533"
integrity sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==
-yaml@^2.7.0:
- version "2.7.1"
- resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.7.1.tgz#44a247d1b88523855679ac7fa7cda6ed7e135cf6"
- integrity sha512-10ULxpnOCQXxJvBgxsn9ptjq6uviG/htZKk9veJGhlqn3w/DxQ631zFF+nlQXLwmImeS5amR2dl2U8sg6U9jsQ==
+yaml-eslint-parser@^1.2.2:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/yaml-eslint-parser/-/yaml-eslint-parser-1.3.0.tgz#975dd11f8349e18c15c88b0e41a6d0b0377969cd"
+ integrity sha512-E/+VitOorXSLiAqtTd7Yqax0/pAS3xaYMP+AUUJGOK1OZG3rhcj9fcJOM5HJ2VrP1FrStVCWr1muTfQCdj4tAA==
+ dependencies:
+ eslint-visitor-keys "^3.0.0"
+ yaml "^2.0.0"
+
+yaml@^2.0.0, yaml@^2.7.0, yaml@^2.8.0:
+ version "2.8.0"
+ resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.8.0.tgz#15f8c9866211bdc2d3781a0890e44d4fa1a5fff6"
+ integrity sha512-4lLa/EcQCB0cJkyts+FpIRx5G/llPxfP6VQU5KByHEhLxY3IJCH0f0Hy1MHI8sClTvsIb8qwRJ6R/ZdlDJ/leQ==
yargs-parser@^21.1.1:
version "21.1.1"
resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35"
integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==
-yargs@^17.5.1:
+yargs@^17.0.0, yargs@^17.5.1:
version "17.7.2"
resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.2.tgz#991df39aca675a192b816e1e0363f9d75d2aa269"
integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==
@@ -7870,6 +9416,14 @@ yargs@^17.5.1:
y18n "^5.0.5"
yargs-parser "^21.1.1"
+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"
@@ -7880,29 +9434,36 @@ yocto-queue@^1.0.0:
resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-1.2.1.tgz#36d7c4739f775b3cbc28e6136e21aa057adec418"
integrity sha512-AyeEbWOu/TAXdxlV9wmGcR0+yh2j3vYPGOECcIj2S7MkrLyC7ne+oye2BKTItt0ii2PHk4cDy+95+LshzbXnGg==
-yoctocolors@^2.0.0:
- version "2.1.1"
- resolved "https://registry.yarnpkg.com/yoctocolors/-/yoctocolors-2.1.1.tgz#e0167474e9fbb9e8b3ecca738deaa61dd12e56fc"
- integrity sha512-GQHQqAopRhwU8Kt1DDM8NjibDXHC8eoh1erhGAJPEyveY9qqVeXvVikNKrDz69sHowPMorbPUrH/mx8c50eiBQ==
-
-youch-core@^0.3.1, youch-core@^0.3.2:
- version "0.3.2"
- resolved "https://registry.yarnpkg.com/youch-core/-/youch-core-0.3.2.tgz#b8d473857cceb06f9ef5a9fd6c1038c80f132570"
- integrity sha512-fusrlIMLeRvTFYLUjJ9KzlGC3N+6MOPJ68HNj/yJv2nz7zq8t4HEviLms2gkdRPUS7F5rZ5n+pYx9r88m6IE1g==
+youch-core@^0.3.1, youch-core@^0.3.3:
+ version "0.3.3"
+ resolved "https://registry.yarnpkg.com/youch-core/-/youch-core-0.3.3.tgz#c5d3d85aeea0d8bc7b36e9764ed3f14b7ceddc7d"
+ integrity sha512-ho7XuGjLaJ2hWHoK8yFnsUGy2Y5uDpqSTq1FkHLK4/oqKtyUU1AFbOOxY4IpC9f0fTLjwYbslUz0Po5BpD1wrA==
dependencies:
- "@poppinss/exception" "^1.2.0"
+ "@poppinss/exception" "^1.2.2"
error-stack-parser-es "^1.0.5"
-youch@^4.1.0-beta.6:
- version "4.1.0-beta.6"
- resolved "https://registry.yarnpkg.com/youch/-/youch-4.1.0-beta.6.tgz#cdac0d912244c79a9f6c6e156e0caaba9904c958"
- integrity sha512-y1aNsEeoLXnWb6pI9TvfNPIxySyo4Un3OGxKn7rsNj8+tgSquzXEWkzfA5y6gU0fvzmQgvx3JBn/p51qQ8Xg9A==
+youch@4.1.0-beta.8:
+ version "4.1.0-beta.8"
+ resolved "https://registry.yarnpkg.com/youch/-/youch-4.1.0-beta.8.tgz#439124c40b9c5f42722b604ef071966cbbb18192"
+ integrity sha512-rY2A2lSF7zC+l7HH9Mq+83D1dLlsPnEvy8jTouzaptDZM6geqZ3aJe/b7ULCwRURPtWV3vbDjA2DDMdoBol0HQ==
dependencies:
+ "@poppinss/colors" "^4.1.4"
"@poppinss/dumper" "^0.6.3"
"@speed-highlight/core" "^1.2.7"
cookie "^1.0.2"
youch-core "^0.3.1"
+youch@^4.1.0-beta.10:
+ version "4.1.0-beta.10"
+ resolved "https://registry.yarnpkg.com/youch/-/youch-4.1.0-beta.10.tgz#94702059e0ba7668025f5cd1b5e5c0f3eb0e83c2"
+ integrity sha512-rLfVLB4FgQneDr0dv1oddCVZmKjcJ6yX6mS4pU82Mq/Dt9a3cLZQ62pDBL4AUO+uVrCvtWz3ZFUL2HFAFJ/BXQ==
+ dependencies:
+ "@poppinss/colors" "^4.1.5"
+ "@poppinss/dumper" "^0.6.4"
+ "@speed-highlight/core" "^1.2.7"
+ cookie "^1.0.2"
+ youch-core "^0.3.3"
+
zip-stream@^6.0.1:
version "6.0.1"
resolved "https://registry.yarnpkg.com/zip-stream/-/zip-stream-6.0.1.tgz#e141b930ed60ccaf5d7fa9c8260e0d1748a2bbfb"
@@ -7911,3 +9472,8 @@ zip-stream@^6.0.1:
archiver-utils "^5.0.0"
compress-commons "^6.0.2"
readable-stream "^4.0.0"
+
+zod@^3.23.8:
+ version "3.25.76"
+ resolved "https://registry.yarnpkg.com/zod/-/zod-3.25.76.tgz#26841c3f6fd22a6a2760e7ccb719179768471e34"
+ integrity sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==