summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormisskey-release-bot[bot] <157398866+misskey-release-bot[bot]@users.noreply.github.com>2025-12-06 12:22:58 +0000
committerGitHub <noreply@github.com>2025-12-06 12:22:58 +0000
commite40c84f31df0202351c5585d3edbca000846b73b (patch)
tree548eafb27b758c55de2e750a0ef9efbe3f056357
parentMerge pull request #16840 from misskey-dev/develop (diff)
parentRelease: 2025.12.0 (diff)
downloadmisskey-e40c84f31df0202351c5585d3edbca000846b73b.tar.gz
misskey-e40c84f31df0202351c5585d3edbca000846b73b.tar.bz2
misskey-e40c84f31df0202351c5585d3edbca000846b73b.zip
Merge pull request #16916 from misskey-dev/develop
Release: 2025.12.0
-rw-r--r--.config/example.yml4
-rw-r--r--.devcontainer/devcontainer.json2
-rw-r--r--.github/workflows/get-backend-memory.yml87
-rw-r--r--.github/workflows/lint.yml7
-rw-r--r--.github/workflows/locale.yml29
-rw-r--r--.github/workflows/report-backend-memory.yml122
-rw-r--r--.node-version2
-rw-r--r--.vscode/settings.json1
-rw-r--r--CHANGELOG.md14
-rw-r--r--Dockerfile4
-rw-r--r--README.md2
-rw-r--r--locales/es-ES.yml54
-rw-r--r--locales/generateDTS.js232
-rw-r--r--locales/index.js93
-rw-r--r--locales/it-IT.yml16
-rw-r--r--locales/package.json3
-rw-r--r--locales/verify.js53
-rw-r--r--locales/zh-CN.yml4
-rw-r--r--package.json33
-rw-r--r--packages/backend/.swcrc7
-rw-r--r--packages/backend/assets/misc/bios.css (renamed from packages/backend/src/server/web/bios.css)0
-rw-r--r--packages/backend/assets/misc/bios.js (renamed from packages/backend/src/server/web/bios.js)0
-rw-r--r--packages/backend/assets/misc/cli.css (renamed from packages/backend/src/server/web/cli.css)0
-rw-r--r--packages/backend/assets/misc/cli.js (renamed from packages/backend/src/server/web/cli.js)0
-rw-r--r--packages/backend/assets/misc/error.css (renamed from packages/backend/src/server/web/error.css)0
-rw-r--r--packages/backend/assets/misc/error.js (renamed from packages/backend/src/server/web/error.js)0
-rw-r--r--packages/backend/assets/misc/flush.js46
-rw-r--r--packages/backend/assets/misc/info-card.css35
-rw-r--r--packages/backend/jest.config.cjs2
-rw-r--r--packages/backend/jsconfig.json13
-rw-r--r--packages/backend/migration/1745378064470-composite-note-index.js8
-rw-r--r--packages/backend/migration/1746949539915-migrateSomeConfigFileSettingsToMeta.js8
-rw-r--r--packages/backend/migration/js/migration-config.js31
-rw-r--r--packages/backend/ormconfig.js5
-rw-r--r--packages/backend/package.json158
-rw-r--r--packages/backend/scripts/compile_config.js54
-rw-r--r--packages/backend/scripts/dev.mjs2
-rw-r--r--packages/backend/scripts/measure-memory.mjs152
-rw-r--r--packages/backend/src/@types/redis-lock.d.ts13
-rw-r--r--packages/backend/src/boot/master.ts5
-rw-r--r--packages/backend/src/boot/worker.ts5
-rw-r--r--packages/backend/src/config.ts26
-rw-r--r--packages/backend/src/core/AppLockService.ts44
-rw-r--r--packages/backend/src/core/CoreModule.ts6
-rw-r--r--packages/backend/src/core/FetchInstanceMetadataService.ts28
-rw-r--r--packages/backend/src/core/MfmService.ts340
-rw-r--r--packages/backend/src/core/NotificationService.ts4
-rw-r--r--packages/backend/src/core/WebAuthnService.ts1
-rw-r--r--packages/backend/src/core/activitypub/ApInboxService.ts14
-rw-r--r--packages/backend/src/core/activitypub/ApMfmService.ts8
-rw-r--r--packages/backend/src/core/activitypub/ApRendererService.ts26
-rw-r--r--packages/backend/src/core/activitypub/ApRequestService.ts28
-rw-r--r--packages/backend/src/core/activitypub/models/ApNoteService.ts9
-rw-r--r--packages/backend/src/core/chart/charts/active-users.ts9
-rw-r--r--packages/backend/src/core/chart/charts/ap-request.ts9
-rw-r--r--packages/backend/src/core/chart/charts/drive.ts9
-rw-r--r--packages/backend/src/core/chart/charts/federation.ts9
-rw-r--r--packages/backend/src/core/chart/charts/instance.ts9
-rw-r--r--packages/backend/src/core/chart/charts/notes.ts9
-rw-r--r--packages/backend/src/core/chart/charts/per-user-drive.ts9
-rw-r--r--packages/backend/src/core/chart/charts/per-user-following.ts9
-rw-r--r--packages/backend/src/core/chart/charts/per-user-notes.ts9
-rw-r--r--packages/backend/src/core/chart/charts/per-user-pv.ts9
-rw-r--r--packages/backend/src/core/chart/charts/per-user-reactions.ts9
-rw-r--r--packages/backend/src/core/chart/charts/test-grouped.ts9
-rw-r--r--packages/backend/src/core/chart/charts/test-intersection.ts9
-rw-r--r--packages/backend/src/core/chart/charts/test-unique.ts9
-rw-r--r--packages/backend/src/core/chart/charts/test.ts9
-rw-r--r--packages/backend/src/core/chart/charts/users.ts9
-rw-r--r--packages/backend/src/core/entities/NoteEntityService.ts15
-rw-r--r--packages/backend/src/misc/distributed-lock.ts49
-rw-r--r--packages/backend/src/misc/escape-html.ts13
-rw-r--r--packages/backend/src/misc/json-stringify-html-safe.ts18
-rw-r--r--packages/backend/src/misc/should-hide-note-by-time.ts29
-rw-r--r--packages/backend/src/queue/QueueProcessorService.ts44
-rw-r--r--packages/backend/src/queue/processors/ExportClipsProcessorService.ts64
-rw-r--r--packages/backend/src/queue/processors/ExportFavoritesProcessorService.ts34
-rw-r--r--packages/backend/src/server/ServerModule.ts2
-rw-r--r--packages/backend/src/server/ServerService.ts2
-rw-r--r--packages/backend/src/server/api/ApiCallService.ts16
-rw-r--r--packages/backend/src/server/api/endpoints/i/update.ts11
-rw-r--r--packages/backend/src/server/oauth/OAuth2ProviderService.ts73
-rw-r--r--packages/backend/src/server/web/ClientServerService.ts202
-rw-r--r--packages/backend/src/server/web/HtmlTemplateService.ts105
-rw-r--r--packages/backend/src/server/web/UrlPreviewService.ts7
-rw-r--r--packages/backend/src/server/web/views/_.ts49
-rw-r--r--packages/backend/src/server/web/views/_splash.tsx26
-rw-r--r--packages/backend/src/server/web/views/announcement.pug21
-rw-r--r--packages/backend/src/server/web/views/announcement.tsx41
-rw-r--r--packages/backend/src/server/web/views/base-embed.pug71
-rw-r--r--packages/backend/src/server/web/views/base-embed.tsx88
-rw-r--r--packages/backend/src/server/web/views/base.pug100
-rw-r--r--packages/backend/src/server/web/views/base.tsx108
-rw-r--r--packages/backend/src/server/web/views/bios.pug20
-rw-r--r--packages/backend/src/server/web/views/bios.tsx35
-rw-r--r--packages/backend/src/server/web/views/channel.pug19
-rw-r--r--packages/backend/src/server/web/views/channel.tsx40
-rw-r--r--packages/backend/src/server/web/views/cli.pug21
-rw-r--r--packages/backend/src/server/web/views/cli.tsx37
-rw-r--r--packages/backend/src/server/web/views/clip.pug35
-rw-r--r--packages/backend/src/server/web/views/clip.tsx59
-rw-r--r--packages/backend/src/server/web/views/error.pug71
-rw-r--r--packages/backend/src/server/web/views/error.tsx89
-rw-r--r--packages/backend/src/server/web/views/flash.pug35
-rw-r--r--packages/backend/src/server/web/views/flash.tsx59
-rw-r--r--packages/backend/src/server/web/views/flush.pug51
-rw-r--r--packages/backend/src/server/web/views/flush.tsx23
-rw-r--r--packages/backend/src/server/web/views/gallery-post.pug41
-rw-r--r--packages/backend/src/server/web/views/gallery-post.tsx65
-rw-r--r--packages/backend/src/server/web/views/info-card.pug50
-rw-r--r--packages/backend/src/server/web/views/info-card.tsx40
-rw-r--r--packages/backend/src/server/web/views/note.pug62
-rw-r--r--packages/backend/src/server/web/views/note.tsx94
-rw-r--r--packages/backend/src/server/web/views/oauth.pug11
-rw-r--r--packages/backend/src/server/web/views/oauth.tsx37
-rw-r--r--packages/backend/src/server/web/views/page.pug35
-rw-r--r--packages/backend/src/server/web/views/page.tsx64
-rw-r--r--packages/backend/src/server/web/views/reversi-game.pug20
-rw-r--r--packages/backend/src/server/web/views/reversi-game.tsx37
-rw-r--r--packages/backend/src/server/web/views/user.pug44
-rw-r--r--packages/backend/src/server/web/views/user.tsx74
-rw-r--r--packages/backend/test-federation/.config/dummy.yml2
-rw-r--r--packages/backend/test-federation/.config/example.config.json29
-rw-r--r--packages/backend/test-federation/.config/example.default.yml22
-rw-r--r--packages/backend/test-federation/compose.a.yml4
-rw-r--r--packages/backend/test-federation/compose.b.yml4
-rw-r--r--packages/backend/test-federation/compose.tpl.yml16
-rw-r--r--packages/backend/test-federation/compose.yml12
-rw-r--r--packages/backend/test-federation/setup.sh2
-rw-r--r--packages/backend/test-federation/tsconfig.json4
-rw-r--r--packages/backend/test-server/tsconfig.json2
-rw-r--r--packages/backend/test/e2e/exports.ts33
-rw-r--r--packages/backend/test/e2e/fetch-resource.ts2
-rw-r--r--packages/backend/test/e2e/oauth.ts14
-rw-r--r--packages/backend/test/jest.setup.ts1
-rw-r--r--packages/backend/test/tsconfig.json2
-rw-r--r--packages/backend/test/unit/AnnouncementService.ts4
-rw-r--r--packages/backend/test/unit/ApMfmService.ts5
-rw-r--r--packages/backend/test/unit/CaptchaService.ts2
-rw-r--r--packages/backend/test/unit/DriveService.ts2
-rw-r--r--packages/backend/test/unit/FileInfoService.ts6
-rw-r--r--packages/backend/test/unit/MfmService.ts10
-rw-r--r--packages/backend/test/unit/RelayService.ts4
-rw-r--r--packages/backend/test/unit/RoleService.ts6
-rw-r--r--packages/backend/test/unit/S3Service.ts4
-rw-r--r--packages/backend/test/unit/SigninWithPasskeyApiService.ts4
-rw-r--r--packages/backend/test/unit/chart.ts19
-rw-r--r--packages/backend/test/unit/misc/should-hide-note-by-time.ts136
-rw-r--r--packages/backend/test/unit/queue/processors/CheckModeratorsActivityProcessorService.ts2
-rw-r--r--packages/backend/test/utils.ts6
-rw-r--r--packages/backend/tsconfig.json8
-rw-r--r--packages/frontend-builder/locale-inliner.ts2
-rw-r--r--packages/frontend-builder/locale-inliner/apply-with-locale.ts2
-rw-r--r--packages/frontend-builder/package.json7
-rw-r--r--packages/frontend-embed/build.ts2
-rw-r--r--packages/frontend-embed/package.json33
-rw-r--r--packages/frontend-embed/public/loader/boot.js (renamed from packages/backend/src/server/web/boot.embed.js)0
-rw-r--r--packages/frontend-embed/public/loader/style.css (renamed from packages/backend/src/server/web/style.embed.css)0
-rw-r--r--packages/frontend-embed/src/components/I18n.vue4
-rw-r--r--packages/frontend-embed/src/i18n.ts2
-rw-r--r--packages/frontend-embed/vite.config.ts4
-rw-r--r--packages/frontend-shared/js/i18n.ts2
-rw-r--r--packages/frontend-shared/js/locale.ts2
-rw-r--r--packages/frontend-shared/js/store-boot-errors.ts2
-rw-r--r--packages/frontend-shared/package.json9
-rw-r--r--packages/frontend/.storybook/preload-locale.ts2
-rw-r--r--packages/frontend/build.ts2
-rw-r--r--packages/frontend/lib/vite-plugin-watch-locales.ts18
-rw-r--r--packages/frontend/package.json55
-rw-r--r--packages/frontend/public/loader/boot.js (renamed from packages/backend/src/server/web/boot.js)0
-rw-r--r--packages/frontend/public/loader/style.css (renamed from packages/backend/src/server/web/style.css)0
-rw-r--r--packages/frontend/src/components/MkMediaImage.vue18
-rw-r--r--packages/frontend/src/components/global/I18n.vue4
-rw-r--r--packages/frontend/src/components/global/StackingRouterView.vue1
-rw-r--r--packages/frontend/src/i18n.ts2
-rw-r--r--packages/frontend/src/theme.ts4
-rw-r--r--packages/frontend/test/aiscript/api.test.ts15
-rw-r--r--packages/frontend/test/i18n.test.ts2
-rw-r--r--packages/frontend/test/init.ts6
-rw-r--r--packages/frontend/vite.config.ts6
-rw-r--r--packages/i18n/README.md5
-rw-r--r--packages/i18n/build.ts163
-rw-r--r--packages/i18n/eslint.config.js35
-rw-r--r--packages/i18n/package.json46
-rw-r--r--packages/i18n/scripts/generateLocaleInterface.ts153
-rw-r--r--packages/i18n/scripts/verify.ts70
-rw-r--r--packages/i18n/src/autogen/locale.ts (renamed from locales/index.d.ts)15
-rw-r--r--packages/i18n/src/const.ts41
-rw-r--r--packages/i18n/src/index.ts130
-rw-r--r--packages/i18n/src/types.ts14
-rw-r--r--packages/i18n/tsconfig.eslint.json8
-rw-r--r--packages/i18n/tsconfig.json14
-rw-r--r--packages/icons-subsetter/package.json4
-rw-r--r--packages/misskey-bubble-game/package.json4
-rw-r--r--packages/misskey-js/package.json8
-rw-r--r--packages/misskey-reversi/package.json4
-rw-r--r--packages/sw/build.js3
-rw-r--r--packages/sw/package.json3
-rw-r--r--packages/sw/src/scripts/lang.ts2
-rw-r--r--packages/sw/src/sw.ts2
-rw-r--r--pnpm-lock.yaml4196
-rw-r--r--pnpm-workspace.yaml2
-rw-r--r--scripts/build-assets.mjs82
-rw-r--r--scripts/changelog-checker/package-lock.json122
-rw-r--r--scripts/changelog-checker/package.json8
-rw-r--r--scripts/clean-all.js3
-rw-r--r--scripts/clean.js1
-rw-r--r--scripts/dev.mjs18
208 files changed, 6032 insertions, 4137 deletions
diff --git a/.config/example.yml b/.config/example.yml
index 489cceec34..1a6b0f5b4b 100644
--- a/.config/example.yml
+++ b/.config/example.yml
@@ -110,10 +110,10 @@ port: 3000
# Changes how the server interpret the origin IP of the request.
#
# Any format supported by Fastify is accepted.
-# Default: trust all proxies (i.e. trustProxy: true)
+# Default: do not trust any proxies (i.e. trustProxy: false)
# See: https://fastify.dev/docs/latest/reference/server/#trustproxy
#
-# trustProxy: 1
+# trustProxy: false
# ┌──────────────────────────┐
#───┘ PostgreSQL configuration └────────────────────────────────
diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json
index e800743469..514abdfb20 100644
--- a/.devcontainer/devcontainer.json
+++ b/.devcontainer/devcontainer.json
@@ -5,7 +5,7 @@
"workspaceFolder": "/workspace",
"features": {
"ghcr.io/devcontainers/features/node:1": {
- "version": "24.10.0"
+ "version": "22.15.0"
},
"ghcr.io/devcontainers-extra/features/pnpm:2": {
"version": "10.10.0"
diff --git a/.github/workflows/get-backend-memory.yml b/.github/workflows/get-backend-memory.yml
new file mode 100644
index 0000000000..458f303f0f
--- /dev/null
+++ b/.github/workflows/get-backend-memory.yml
@@ -0,0 +1,87 @@
+# this name is used in report-backend-memory.yml so be careful when change name
+name: Get backend memory usage
+
+on:
+ pull_request:
+ branches:
+ - master
+ - develop
+ paths:
+ - packages/backend/**
+ - packages/misskey-js/**
+ - .github/workflows/get-backend-memory.yml
+
+jobs:
+ get-memory-usage:
+ runs-on: ubuntu-latest
+ permissions:
+ contents: read
+
+ strategy:
+ matrix:
+ memory-json-name: [memory-base.json, memory-head.json]
+ include:
+ - memory-json-name: memory-base.json
+ ref: ${{ github.base_ref }}
+ - memory-json-name: memory-head.json
+ ref: refs/pull/${{ github.event.number }}/merge
+
+ services:
+ postgres:
+ image: postgres:18
+ ports:
+ - 54312:5432
+ env:
+ POSTGRES_DB: test-misskey
+ POSTGRES_HOST_AUTH_METHOD: trust
+ redis:
+ image: redis:7
+ ports:
+ - 56312:6379
+
+ steps:
+ - uses: actions/checkout@v4.3.0
+ with:
+ ref: ${{ matrix.ref }}
+ submodules: true
+ - name: Setup pnpm
+ uses: pnpm/action-setup@v4.2.0
+ - name: Use Node.js
+ uses: actions/setup-node@v4.4.0
+ with:
+ node-version-file: '.node-version'
+ cache: 'pnpm'
+ - run: pnpm i --frozen-lockfile
+ - name: Check pnpm-lock.yaml
+ run: git diff --exit-code pnpm-lock.yaml
+ - name: Copy Configure
+ run: cp .github/misskey/test.yml .config/default.yml
+ - name: Compile Configure
+ run: pnpm compile-config
+ - name: Build
+ run: pnpm build
+ - name: Run migrations
+ run: pnpm --filter backend migrate
+ - name: Measure memory usage
+ run: |
+ # Start the server and measure memory usage
+ node packages/backend/scripts/measure-memory.mjs > ${{ matrix.memory-json-name }}
+ - name: Upload Artifact
+ uses: actions/upload-artifact@v4
+ with:
+ name: memory-artifact-${{ matrix.memory-json-name }}
+ path: ${{ matrix.memory-json-name }}
+
+ save-pr-number:
+ runs-on: ubuntu-latest
+ permissions: {}
+ steps:
+ - name: Save PR number
+ env:
+ PR_NUMBER: ${{ github.event.number }}
+ run: |
+ echo "$PR_NUMBER" > ./pr_number
+ - uses: actions/upload-artifact@v4
+ with:
+ name: memory-artifact-pr-number
+ path: pr_number
diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml
index d80c56f032..33a1ccbc76 100644
--- a/.github/workflows/lint.yml
+++ b/.github/workflows/lint.yml
@@ -111,10 +111,5 @@ jobs:
node-version-file: '.node-version'
cache: 'pnpm'
- run: pnpm i --frozen-lockfile
- - run: pnpm --filter misskey-js run build
- if: ${{ matrix.workspace == 'backend' || matrix.workspace == 'frontend' || matrix.workspace == 'sw' }}
- - run: pnpm --filter misskey-reversi run build
- if: ${{ matrix.workspace == 'backend' || matrix.workspace == 'frontend' }}
- - run: pnpm --filter misskey-bubble-game run build
- if: ${{ matrix.workspace == 'frontend' }}
+ - run: pnpm --filter "${{ matrix.workspace }}^..." run build
- run: pnpm --filter ${{ matrix.workspace }} run typecheck
diff --git a/.github/workflows/locale.yml b/.github/workflows/locale.yml
index e63d83997b..d75335f38f 100644
--- a/.github/workflows/locale.yml
+++ b/.github/workflows/locale.yml
@@ -3,10 +3,12 @@ name: Lint
on:
push:
paths:
+ - packages/i18n/**
- locales/**
- .github/workflows/locale.yml
pull_request:
paths:
+ - packages/i18n/**
- locales/**
- .github/workflows/locale.yml
jobs:
@@ -14,15 +16,18 @@ jobs:
runs-on: ubuntu-latest
continue-on-error: true
steps:
- - uses: actions/checkout@v4.3.0
- with:
- fetch-depth: 0
- submodules: true
- - name: Setup pnpm
- uses: pnpm/action-setup@v4.2.0
- - uses: actions/setup-node@v4.4.0
- with:
- node-version-file: '.node-version'
- cache: 'pnpm'
- - run: pnpm i --frozen-lockfile
- - run: cd locales && node verify.js
+ - uses: actions/checkout@v4.3.0
+ with:
+ fetch-depth: 0
+ submodules: true
+ - name: Setup pnpm
+ uses: pnpm/action-setup@v4.2.0
+ - uses: actions/setup-node@v4.4.0
+ with:
+ node-version-file: ".node-version"
+ cache: "pnpm"
+ - run: pnpm i --frozen-lockfile
+ - run: pnpm --filter i18n build
+ - name: Verify Locales
+ working-directory: ./packages/i18n
+ run: pnpm run verify
diff --git a/.github/workflows/report-backend-memory.yml b/.github/workflows/report-backend-memory.yml
new file mode 100644
index 0000000000..ede43cc645
--- /dev/null
+++ b/.github/workflows/report-backend-memory.yml
@@ -0,0 +1,122 @@
+name: Report backend memory
+
+on:
+ workflow_run:
+ types: [completed]
+ workflows:
+ - Get backend memory usage # get-backend-memory.yml
+
+jobs:
+ compare-memory:
+ runs-on: ubuntu-latest
+ if: ${{ github.event.workflow_run.conclusion == 'success' }}
+ permissions:
+ pull-requests: write
+
+ steps:
+ - name: Download artifact
+ uses: actions/github-script@v7.1.0
+ with:
+ script: |
+ const fs = require('fs');
+ let allArtifacts = await github.rest.actions.listWorkflowRunArtifacts({
+ owner: context.repo.owner,
+ repo: context.repo.repo,
+ run_id: context.payload.workflow_run.id,
+ });
+ let matchArtifacts = allArtifacts.data.artifacts.filter((artifact) => {
+ return artifact.name.startsWith("memory-artifact-") || artifact.name == "memory-artifact"
+ });
+ await Promise.all(matchArtifacts.map(async (artifact) => {
+ let download = await github.rest.actions.downloadArtifact({
+ owner: context.repo.owner,
+ repo: context.repo.repo,
+ artifact_id: artifact.id,
+ archive_format: 'zip',
+ });
+ await fs.promises.writeFile(`${process.env.GITHUB_WORKSPACE}/${artifact.name}.zip`, Buffer.from(download.data));
+ }));
+ - name: Extract all artifacts
+ run: |
+ find . -mindepth 1 -maxdepth 1 -type f -name '*.zip' -exec unzip {} -d artifacts ';'
+ ls -la artifacts/
+ - name: Load PR Number
+ id: load-pr-num
+ run: echo "pr-number=$(cat artifacts/pr_number)" >> "$GITHUB_OUTPUT"
+
+ - name: Output base
+ run: cat ./artifacts/memory-base.json
+ - name: Output head
+ run: cat ./artifacts/memory-head.json
+ - name: Compare memory usage
+ id: compare
+ run: |
+ BASE_MEMORY=$(cat ./artifacts/memory-base.json)
+ HEAD_MEMORY=$(cat ./artifacts/memory-head.json)
+
+ BASE_RSS=$(echo "$BASE_MEMORY" | jq -r '.memory.rss // 0')
+ HEAD_RSS=$(echo "$HEAD_MEMORY" | jq -r '.memory.rss // 0')
+
+ # Calculate difference
+ if [ "$BASE_RSS" -gt 0 ] && [ "$HEAD_RSS" -gt 0 ]; then
+ DIFF=$((HEAD_RSS - BASE_RSS))
+ DIFF_PERCENT=$(echo "scale=2; ($DIFF * 100) / $BASE_RSS" | bc)
+
+ # Convert to MB for readability
+ BASE_MB=$(echo "scale=2; $BASE_RSS / 1048576" | bc)
+ HEAD_MB=$(echo "scale=2; $HEAD_RSS / 1048576" | bc)
+ DIFF_MB=$(echo "scale=2; $DIFF / 1048576" | bc)
+
+ echo "base_mb=$BASE_MB" >> "$GITHUB_OUTPUT"
+ echo "head_mb=$HEAD_MB" >> "$GITHUB_OUTPUT"
+ echo "diff_mb=$DIFF_MB" >> "$GITHUB_OUTPUT"
+ echo "diff_percent=$DIFF_PERCENT" >> "$GITHUB_OUTPUT"
+ echo "has_data=true" >> "$GITHUB_OUTPUT"
+
+ # Determine if this is a significant change (more than 5% increase)
+ if [ "$(echo "$DIFF_PERCENT > 5" | bc)" -eq 1 ]; then
+ echo "significant_increase=true" >> "$GITHUB_OUTPUT"
+ else
+ echo "significant_increase=false" >> "$GITHUB_OUTPUT"
+ fi
+ else
+ echo "has_data=false" >> "$GITHUB_OUTPUT"
+ fi
+ - id: build-comment
+ name: Build memory comment
+ run: |
+ HEADER="## Backend Memory Usage Comparison"
+ FOOTER="[See workflow logs for details](https://github.com/${GITHUB_REPOSITORY}/actions/runs/${GITHUB_RUN_ID})"
+
+ echo "$HEADER" > ./output.md
+ echo >> ./output.md
+
+ if [ "${{ steps.compare.outputs.has_data }}" == "true" ]; then
+ echo "| Metric | base | head | Diff |" >> ./output.md
+ echo "|--------|------|------|------|" >> ./output.md
+ echo "| RSS | ${{ steps.compare.outputs.base_mb }} MB | ${{ steps.compare.outputs.head_mb }} MB | ${{ steps.compare.outputs.diff_mb }} MB (${{ steps.compare.outputs.diff_percent }}%) |" >> ./output.md
+ echo >> ./output.md
+
+ if [ "${{ steps.compare.outputs.significant_increase }}" == "true" ]; then
+ echo "⚠️ **Warning**: Memory usage has increased by more than 5%. Please verify this is not an unintended change." >> ./output.md
+ echo >> ./output.md
+ fi
+ else
+ echo "Could not retrieve memory usage data." >> ./output.md
+ echo >> ./output.md
+ fi
+
+ echo "$FOOTER" >> ./output.md
+ - uses: thollander/actions-comment-pull-request@v2
+ with:
+ pr_number: ${{ steps.load-pr-num.outputs.pr-number }}
+ comment_tag: show_memory_diff
+ filePath: ./output.md
+ - name: Tell error to PR
+ uses: thollander/actions-comment-pull-request@v2
+ if: failure() && steps.load-pr-num.outputs.pr-number
+ with:
+ pr_number: ${{ steps.load-pr-num.outputs.pr-number }}
+ comment_tag: show_memory_diff_error
+ message: |
+ An error occurred while comparing backend memory usage. See [workflow logs](https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }}) for details.
diff --git a/.node-version b/.node-version
index 21651351e2..b8ffd70759 100644
--- a/.node-version
+++ b/.node-version
@@ -1 +1 @@
-24.10.0
+22.15.0
diff --git a/.vscode/settings.json b/.vscode/settings.json
index 5f36a32af4..2d11d24db2 100644
--- a/.vscode/settings.json
+++ b/.vscode/settings.json
@@ -3,6 +3,7 @@
"**/node_modules": true
},
"typescript.tsdk": "node_modules/typescript/lib",
+ "typescript.enablePromptUseWorkspaceTsdk": true,
"files.associations": {
"*.test.ts": "typescript"
},
diff --git a/CHANGELOG.md b/CHANGELOG.md
index fb0f115058..383af2bf02 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,17 @@
+## 2025.12.0
+
+### Note
+- configの`trustProxy`のデフォルト値を`false`に変更しました。アップデート前に現在のconfigをご確認の上、必要に応じて値を変更してください。
+
+### Client
+- Fix: stacking router viewで連続して戻る操作を行うと何も表示されなくなる問題を修正
+
+### Server
+- Enhance: メモリ使用量を削減しました
+- Enhance: ActivityPubアクティビティを送信する際のパフォーマンス向上
+- Enhance: 依存関係の更新
+- Fix: セキュリティに関する修正
+
## 2025.11.1
### Client
diff --git a/Dockerfile b/Dockerfile
index 20e24d1dc2..02739d9ca2 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -1,6 +1,6 @@
# syntax = docker/dockerfile:1.4
-ARG NODE_VERSION=24.10.0-bookworm
+ARG NODE_VERSION=22.15.0-bookworm
# build assets & compile TypeScript
@@ -24,6 +24,7 @@ COPY --link ["packages/frontend-shared/package.json", "./packages/frontend-share
COPY --link ["packages/frontend/package.json", "./packages/frontend/"]
COPY --link ["packages/frontend-embed/package.json", "./packages/frontend-embed/"]
COPY --link ["packages/frontend-builder/package.json", "./packages/frontend-builder/"]
+COPY --link ["packages/i18n/package.json", "./packages/i18n/"]
COPY --link ["packages/icons-subsetter/package.json", "./packages/icons-subsetter/"]
COPY --link ["packages/sw/package.json", "./packages/sw/"]
COPY --link ["packages/misskey-js/package.json", "./packages/misskey-js/"]
@@ -101,6 +102,7 @@ COPY --chown=misskey:misskey --from=native-builder /misskey/packages/misskey-js/
COPY --chown=misskey:misskey --from=native-builder /misskey/packages/misskey-reversi/built ./packages/misskey-reversi/built
COPY --chown=misskey:misskey --from=native-builder /misskey/packages/misskey-bubble-game/built ./packages/misskey-bubble-game/built
COPY --chown=misskey:misskey --from=native-builder /misskey/packages/backend/built ./packages/backend/built
+COPY --chown=misskey:misskey --from=native-builder /misskey/packages/i18n/built ./packages/i18n/built
COPY --chown=misskey:misskey --from=native-builder /misskey/fluent-emojis /misskey/fluent-emojis
COPY --chown=misskey:misskey . ./
diff --git a/README.md b/README.md
index 92e8fef639..a73102d713 100644
--- a/README.md
+++ b/README.md
@@ -24,6 +24,8 @@
<a href="https://www.patreon.com/syuilo">
<img src="https://custom-icon-badges.herokuapp.com/badge/become_a-patron-F96854?logoColor=F96854&style=for-the-badge&logo=patreon&labelColor=363B40" alt="become a patron"/></a>
+[![Ask DeepWiki](https://deepwiki.com/badge.svg)](https://deepwiki.com/misskey-dev/misskey)
+
</div>
## Thanks
diff --git a/locales/es-ES.yml b/locales/es-ES.yml
index 147c60b0be..259dcadd2c 100644
--- a/locales/es-ES.yml
+++ b/locales/es-ES.yml
@@ -128,7 +128,7 @@ pinnedNote: "Nota fijada"
pinned: "Fijar al perfil"
you: "Tú"
clickToShow: "Haz clic para verlo"
-sensitive: "Marcado como sensible"
+sensitive: "Marcado como sensible (NSFW)"
add: "Agregar"
reaction: "Reacción"
reactions: "Reacciones"
@@ -143,7 +143,7 @@ rememberNoteVisibility: "Recordar visibilidad"
attachCancel: "Quitar adjunto"
deleteFile: "Eliminar archivo"
markAsSensitive: "Marcar como sensible"
-unmarkAsSensitive: "Desmarcar como sensible"
+unmarkAsSensitive: "No marcar como sensible"
enterFileName: "Introduce el nombre del archivo"
mute: "Silenciar"
unmute: "Dejar de silenciar"
@@ -319,10 +319,10 @@ remoteUserCaution: "Para el usuario remoto, la información está incompleta"
activity: "Actividad"
images: "Imágenes"
image: "Imágenes"
-birthday: "Fecha de nacimiento"
+birthday: "Cumpleaños"
yearsOld: "{age} años"
registeredDate: "Fecha de registro"
-location: "Lugar"
+location: "Ubicación"
theme: "Tema"
themeForLightMode: "Tema para usar en Modo Linterna"
themeForDarkMode: "Tema para usar en Modo Oscuro"
@@ -353,7 +353,7 @@ emptyFolder: "La carpeta está vacía"
dropHereToUpload: "Arrastra los archivos aquí para subirlos."
unableToDelete: "No se puede borrar"
inputNewFileName: "Ingrese un nuevo nombre de archivo"
-inputNewDescription: "Ingrese nueva descripción"
+inputNewDescription: "Introducir un nuevo texto alternativo"
inputNewFolderName: "Ingrese un nuevo nombre de la carpeta"
circularReferenceFolder: "La carpeta de destino es una sub-carpeta de la carpeta que quieres mover."
hasChildFilesOrFolders: "No se puede borrar esta carpeta. No está vacía."
@@ -579,7 +579,7 @@ objectStorageSetPublicRead: "Seleccionar \"public-read\" al subir "
s3ForcePathStyleDesc: "Si s3ForcePathStyle esta habilitado el nombre del bucket debe ser especificado como parte de la URL en lugar del nombre de host en la URL. Puede ser necesario activar esta opción cuando se utilice, por ejemplo, Minio en un servidor propio."
serverLogs: "Registros del servidor"
deleteAll: "Eliminar todos"
-showFixedPostForm: "Mostrar el formulario de las entradas encima de la línea de tiempo"
+showFixedPostForm: "Visualizar la ventana de publicación en la parte superior de la línea de tiempo."
showFixedPostFormInChannel: "Mostrar el formulario de publicación por encima de la cronología (Canales)"
withRepliesByDefaultForNewlyFollowed: "Incluir por defecto respuestas de usuarios recién seguidos en la línea de tiempo"
newNoteRecived: "Tienes una nota nueva"
@@ -706,7 +706,7 @@ userSaysSomethingAbout: "{name} dijo algo sobre {word}"
makeActive: "Activar"
display: "Apariencia"
copy: "Copiar"
-copiedToClipboard: "Texto copiado al portapapeles"
+copiedToClipboard: "Copiado al portapapeles"
metrics: "Métricas"
overview: "Resumen"
logs: "Registros"
@@ -715,7 +715,7 @@ database: "Base de datos"
channel: "Canal"
create: "Crear"
notificationSetting: "Ajustes de Notificaciones"
-notificationSettingDesc: "Por favor elija el tipo de notificación a mostrar"
+notificationSettingDesc: "Por favor elige el tipo de notificación a mostrar"
useGlobalSetting: "Usar ajustes globales"
useGlobalSettingDesc: "Al activarse, se usará la configuración de notificaciones de la cuenta, al desactivarse se pueden hacer configuraciones particulares."
other: "Otro"
@@ -747,7 +747,7 @@ system: "Sistema"
switchUi: "Cambiar interfaz de usuario"
desktop: "Escritorio"
clip: "Clip"
-createNew: "Crear"
+createNew: "Crear Nuevo"
optional: "Opcional"
createNewClip: "Crear clip nuevo"
unclip: "Quitar clip"
@@ -844,7 +844,7 @@ jumpToSpecifiedDate: "Saltar a una fecha específica"
showingPastTimeline: "Mostrar líneas de tiempo antiguas"
clear: "Limpiar"
markAllAsRead: "Marcar todo como leído"
-goBack: "Deseleccionar"
+goBack: "Anterior"
unlikeConfirm: "¿Quitar como favorito?"
fullView: "Vista completa"
quitFullView: "quitar vista completa"
@@ -1203,8 +1203,8 @@ iHaveReadXCarefullyAndAgree: "He leído el texto {x} y estoy de acuerdo"
dialog: "Diálogo"
icon: "Avatar"
forYou: "Para ti"
-currentAnnouncements: "Anuncios actuales"
-pastAnnouncements: "Anuncios anteriores"
+currentAnnouncements: "Avisos actuales"
+pastAnnouncements: "Avisos anteriores"
youHaveUnreadAnnouncements: "Hay anuncios sin leer"
useSecurityKey: "Por favor, sigue las instrucciones de tu dispositivo o navegador para usar tu clave de seguridad o tu clave de paso."
replies: "Responder"
@@ -1412,8 +1412,8 @@ _imageEditing:
filename: "Nombre de archivo"
filename_without_ext: "Nombre del archivo sin la extensión"
year: "Año de rodaje"
- month: "Mes de rodaje"
- day: "Día de rodaje"
+ month: "Mes de la fotografía"
+ day: "Día de la fotografía"
hour: "Hora"
minute: "Minuto"
second: "Segundo"
@@ -1427,9 +1427,9 @@ _imageEditing:
gps_lat: "Latitud"
gps_long: "Longitud"
_imageFrameEditor:
- title: "Edición de Fotograma"
+ title: "Edición de Fotos"
tip: "Decora tus imágenes con marcos y etiquetas que contengan metadatos."
- header: "Cabezal"
+ header: "Título"
footer: "Pie de página"
borderThickness: "Ancho del borde"
labelThickness: "Ancho de la etiqueta"
@@ -1456,8 +1456,8 @@ _compression:
medium: "Tamaño mediano"
small: "Tamaño pequeño"
_order:
- newest: "Los más recientes primero"
- oldest: "Los más antiguos primero"
+ newest: "Más reciente primero"
+ oldest: "Más antiguos primero"
_chat:
messages: "Mensajes"
noMessagesYet: "Aún no hay mensajes"
@@ -1511,7 +1511,7 @@ _emojiPalette:
palettes: "Paleta\n"
enableSyncBetweenDevicesForPalettes: "Activar la sincronización de paletas entre dispositivos"
paletteForMain: "Paleta principal"
- paletteForReaction: "Paleta de reacción"
+ paletteForReaction: "Paleta utilizada para las reacciones"
_settings:
driveBanner: "Puedes gestionar y configurar la unidad, comprobar su uso y configurar los ajustes de carga de archivos."
pluginBanner: "Puedes ampliar las funciones del cliente con plugins. Puedes instalar plugins, configurarlos y gestionarlos individualmente."
@@ -1523,7 +1523,7 @@ _settings:
accountData: "Datos de la cuenta"
accountDataBanner: "Exportación e importación para gestionar los datos de la cuenta."
muteAndBlockBanner: "Puedes configurar y gestionar ajustes para ocultar contenidos y restringir acciones a usuarios específicos."
- accessibilityBanner: "Puedes personalizar los visuales y el comportamiento del cliente, y configurar los ajustes para optimizar el uso."
+ accessibilityBanner: "Puedes personalizar el aspecto y el comportamiento del cliente y configurar los ajustes para optimizar su uso."
privacyBanner: "Puedes configurar opciones relacionadas con la privacidad de la cuenta, como la visibilidad del contenido, la posibilidad de descubrir la cuenta y la aprobación de seguimiento."
securityBanner: "Puedes configurar opciones relacionadas con la seguridad de la cuenta, como la contraseña, los métodos de inicio de sesión, las aplicaciones de autenticación y Passkeys."
preferencesBanner: "Puedes configurar el comportamiento general del cliente según tus preferencias."
@@ -1540,7 +1540,7 @@ _settings:
ifOff: "Si está desactivado"
enableSyncThemesBetweenDevices: "Sincronizar los temas instalados entre dispositivos."
enablePullToRefresh: "Tirar para actualizar"
- enablePullToRefresh_description: "Si utiliza un ratón, arrastre mientras pulsa la rueda de desplazamiento."
+ enablePullToRefresh_description: "Si utilizas un ratón, arrastra mientras pulsas la rueda de desplazamiento."
realtimeMode_description: "Establece una conexión con el servidor y actualiza el contenido en tiempo real. Esto puede aumentar el tráfico y el consumo de memoria."
contentsUpdateFrequency: "Frecuencia de adquisición del contenido."
contentsUpdateFrequency_description: "Cuanto mayor sea el valor, más se actualiza el contenido, pero disminuye el rendimiento y aumenta el tráfico y el consumo de memoria."
@@ -1685,7 +1685,7 @@ _initialTutorial:
followers: "Visible solo para seguidores. Sólo tus seguidores podrán ver la nota, y no podrá ser renotada por otras personas."
direct: "Visible sólo para usuarios específicos, y el destinatario será notificado. Puede usarse como alternativa a la mensajería directa."
doNotSendConfidencialOnDirect1: "¡Ten cuidado cuando vayas a enviar información sensible!"
- doNotSendConfidencialOnDirect2: "Los administradores del servidor pueden leer lo que escribes. Ten cuidado cuando envíes información sensible en notas directas en servidores no confiables."
+ doNotSendConfidencialOnDirect2: "Los administradores del servidor, también llamado instancia, pueden leer lo que escribes. Ten cuidado cuando envíes información sensible en notas directas en servidores o instancias no confiables."
localOnly: "Publicando con esta opción seleccionada, la nota no se federará hacia otros servidores. Los usuarios de otros servidores no podrán ver estas notas directamente, sin importar los ajustes seleccionados más arriba."
_cw:
title: "Alerta de contenido (CW)"
@@ -2156,7 +2156,7 @@ _accountDelete:
started: "El proceso de eliminación ha comenzado."
inProgress: "La eliminación está en proceso."
_ad:
- back: "Deseleccionar"
+ back: "Anterior"
reduceFrequencyOfThisAd: "Mostrar menos este anuncio."
hide: "No mostrar"
timezoneinfo: "El día de la semana está determidado por la zona horaria del servidor."
@@ -2299,7 +2299,7 @@ _theme:
indicator: "Indicador"
panel: "Panel"
shadow: "Sombra"
- header: "Cabezal"
+ header: "Título"
navBg: "Fondo de la barra lateral"
navFg: "Texto de la barra lateral"
navActive: "Texto de la barra lateral (activo)"
@@ -2610,10 +2610,10 @@ _profile:
name: "Nombre"
username: "Nombre de usuario"
description: "Descripción"
- youCanIncludeHashtags: "Puedes añadir hashtags"
+ youCanIncludeHashtags: "También puedes incluir hashtags en tu biografía"
metadata: "información adicional"
metadataEdit: "Editar información adicional"
- metadataDescription: "Muestra la información adicional en el perfil"
+ metadataDescription: "Usando esto puedes mostrar campos de información adicionales en tu perfil."
metadataLabel: "Etiqueta"
metadataContent: "Contenido"
changeAvatar: "Cambiar avatar"
@@ -2771,7 +2771,7 @@ _notification:
follow: "Siguiendo"
mention: "Menciones"
reply: "Respuestas"
- renote: "Renotar"
+ renote: "Renotas"
quote: "Citar"
reaction: "Reacción"
pollEnded: "La encuesta terminó"
diff --git a/locales/generateDTS.js b/locales/generateDTS.js
deleted file mode 100644
index ab0613cc82..0000000000
--- a/locales/generateDTS.js
+++ /dev/null
@@ -1,232 +0,0 @@
-import * as fs from 'node:fs';
-import { fileURLToPath } from 'node:url';
-import { dirname } from 'node:path';
-import * as yaml from 'js-yaml';
-import ts from 'typescript';
-
-const __filename = fileURLToPath(import.meta.url);
-const __dirname = dirname(__filename);
-const parameterRegExp = /\{(\w+)\}/g;
-
-function createMemberType(item) {
- if (typeof item !== 'string') {
- return ts.factory.createTypeLiteralNode(createMembers(item));
- }
- const parameters = Array.from(
- item.matchAll(parameterRegExp),
- ([, parameter]) => parameter,
- );
- return parameters.length
- ? ts.factory.createTypeReferenceNode(
- ts.factory.createIdentifier('ParameterizedString'),
- [
- ts.factory.createUnionTypeNode(
- parameters.map((parameter) =>
- ts.factory.createStringLiteral(parameter),
- ),
- ),
- ],
- )
- : ts.factory.createKeywordTypeNode(ts.SyntaxKind.StringKeyword);
-}
-
-function createMembers(record) {
- return Object.entries(record).map(([k, v]) => {
- const node = ts.factory.createPropertySignature(
- undefined,
- ts.factory.createStringLiteral(k),
- undefined,
- createMemberType(v),
- );
- if (typeof v === 'string') {
- ts.addSyntheticLeadingComment(
- node,
- ts.SyntaxKind.MultiLineCommentTrivia,
- `*
- * ${v.replace(/\n/g, '\n * ')}
- `,
- true,
- );
- }
- return node;
- });
-}
-
-export default function generateDTS() {
- const locale = yaml.load(fs.readFileSync(`${__dirname}/ja-JP.yml`, 'utf-8'));
- const members = createMembers(locale);
- const elements = [
- ts.factory.createVariableStatement(
- [ts.factory.createToken(ts.SyntaxKind.DeclareKeyword)],
- ts.factory.createVariableDeclarationList(
- [
- ts.factory.createVariableDeclaration(
- ts.factory.createIdentifier('kParameters'),
- undefined,
- ts.factory.createTypeOperatorNode(
- ts.SyntaxKind.UniqueKeyword,
- ts.factory.createKeywordTypeNode(ts.SyntaxKind.SymbolKeyword),
- ),
- undefined,
- ),
- ],
- ts.NodeFlags.Const,
- ),
- ),
- ts.factory.createTypeAliasDeclaration(
- [ts.factory.createToken(ts.SyntaxKind.ExportKeyword)],
- ts.factory.createIdentifier('ParameterizedString'),
- [
- ts.factory.createTypeParameterDeclaration(
- undefined,
- ts.factory.createIdentifier('T'),
- ts.factory.createKeywordTypeNode(ts.SyntaxKind.StringKeyword),
- ts.factory.createKeywordTypeNode(ts.SyntaxKind.StringKeyword),
- ),
- ],
- ts.factory.createIntersectionTypeNode([
- ts.factory.createKeywordTypeNode(ts.SyntaxKind.StringKeyword),
- ts.factory.createTypeLiteralNode([
- ts.factory.createPropertySignature(
- undefined,
- ts.factory.createComputedPropertyName(
- ts.factory.createIdentifier('kParameters'),
- ),
- undefined,
- ts.factory.createTypeReferenceNode(
- ts.factory.createIdentifier('T'),
- undefined,
- ),
- ),
- ])
- ]),
- ),
- ts.factory.createInterfaceDeclaration(
- [ts.factory.createToken(ts.SyntaxKind.ExportKeyword)],
- ts.factory.createIdentifier('ILocale'),
- undefined,
- undefined,
- [
- ts.factory.createIndexSignature(
- undefined,
- [
- ts.factory.createParameterDeclaration(
- undefined,
- undefined,
- ts.factory.createIdentifier('_'),
- undefined,
- ts.factory.createKeywordTypeNode(ts.SyntaxKind.StringKeyword),
- undefined,
- ),
- ],
- ts.factory.createUnionTypeNode([
- ts.factory.createKeywordTypeNode(ts.SyntaxKind.StringKeyword),
- ts.factory.createTypeReferenceNode(
- ts.factory.createIdentifier('ParameterizedString'),
- ),
- ts.factory.createTypeReferenceNode(
- ts.factory.createIdentifier('ILocale'),
- undefined,
- ),
- ]),
- ),
- ],
- ),
- ts.factory.createInterfaceDeclaration(
- [ts.factory.createToken(ts.SyntaxKind.ExportKeyword)],
- ts.factory.createIdentifier('Locale'),
- undefined,
- [
- ts.factory.createHeritageClause(ts.SyntaxKind.ExtendsKeyword, [
- ts.factory.createExpressionWithTypeArguments(
- ts.factory.createIdentifier('ILocale'),
- undefined,
- ),
- ]),
- ],
- members,
- ),
- ts.factory.createVariableStatement(
- [ts.factory.createToken(ts.SyntaxKind.DeclareKeyword)],
- ts.factory.createVariableDeclarationList(
- [
- ts.factory.createVariableDeclaration(
- ts.factory.createIdentifier('locales'),
- undefined,
- ts.factory.createTypeLiteralNode([
- ts.factory.createIndexSignature(
- undefined,
- [
- ts.factory.createParameterDeclaration(
- undefined,
- undefined,
- ts.factory.createIdentifier('lang'),
- undefined,
- ts.factory.createKeywordTypeNode(
- ts.SyntaxKind.StringKeyword,
- ),
- undefined,
- ),
- ],
- ts.factory.createTypeReferenceNode(
- ts.factory.createIdentifier('Locale'),
- undefined,
- ),
- ),
- ]),
- undefined,
- ),
- ],
- ts.NodeFlags.Const,
- ),
- ),
- ts.factory.createFunctionDeclaration(
- [ts.factory.createModifier(ts.SyntaxKind.ExportKeyword)],
- undefined,
- ts.factory.createIdentifier('build'),
- undefined,
- [],
- ts.factory.createTypeReferenceNode(
- ts.factory.createIdentifier('Locale'),
- undefined,
- ),
- undefined,
- ),
- ts.factory.createExportDefault(ts.factory.createIdentifier('locales')),
- ];
- ts.addSyntheticLeadingComment(
- elements[0],
- ts.SyntaxKind.MultiLineCommentTrivia,
- ' eslint-disable ',
- true,
- );
- ts.addSyntheticLeadingComment(
- elements[0],
- ts.SyntaxKind.SingleLineCommentTrivia,
- ' This file is generated by locales/generateDTS.js',
- true,
- );
- ts.addSyntheticLeadingComment(
- elements[0],
- ts.SyntaxKind.SingleLineCommentTrivia,
- ' Do not edit this file directly.',
- true,
- );
- const printed = ts
- .createPrinter({
- newLine: ts.NewLineKind.LineFeed,
- })
- .printList(
- ts.ListFormat.MultiLine,
- ts.factory.createNodeArray(elements),
- ts.createSourceFile(
- 'index.d.ts',
- '',
- ts.ScriptTarget.ESNext,
- true,
- ts.ScriptKind.TS,
- ),
- );
-
- fs.writeFileSync(`${__dirname}/index.d.ts`, printed, 'utf-8');
-}
diff --git a/locales/index.js b/locales/index.js
deleted file mode 100644
index 6d9cf4796b..0000000000
--- a/locales/index.js
+++ /dev/null
@@ -1,93 +0,0 @@
-/**
- * Languages Loader
- */
-
-import * as fs from 'node:fs';
-import * as yaml from 'js-yaml';
-
-const merge = (...args) => args.reduce((a, c) => ({
- ...a,
- ...c,
- ...Object.entries(a)
- .filter(([k]) => c && typeof c[k] === 'object')
- .reduce((a, [k, v]) => (a[k] = merge(v, c[k]), a), {})
-}), {});
-
-const languages = [
- 'ar-SA',
- 'ca-ES',
- 'cs-CZ',
- 'da-DK',
- 'de-DE',
- 'en-US',
- 'es-ES',
- 'fr-FR',
- 'id-ID',
- 'it-IT',
- 'ja-JP',
- 'ja-KS',
- 'kab-KAB',
- 'kn-IN',
- 'ko-KR',
- 'nl-NL',
- 'no-NO',
- 'pl-PL',
- 'pt-PT',
- 'ru-RU',
- 'sk-SK',
- 'th-TH',
- 'tr-TR',
- 'ug-CN',
- 'uk-UA',
- 'vi-VN',
- 'zh-CN',
- 'zh-TW',
-];
-
-const primaries = {
- 'en': 'US',
- 'ja': 'JP',
- 'zh': 'CN',
-};
-
-// 何故か文字列にバックスペース文字が混入することがあり、YAMLが壊れるので取り除く
-const clean = (text) => text.replace(new RegExp(String.fromCodePoint(0x08), 'g'), '');
-
-export function build() {
- // vitestの挙動を調整するため、一度ローカル変数化する必要がある
- // https://github.com/vitest-dev/vitest/issues/3988#issuecomment-1686599577
- // https://github.com/misskey-dev/misskey/pull/14057#issuecomment-2192833785
- const metaUrl = import.meta.url;
- const locales = languages.reduce((a, c) => (a[c] = yaml.load(clean(fs.readFileSync(new URL(`${c}.yml`, metaUrl), 'utf-8'))) || {}, a), {});
-
- // 空文字列が入ることがあり、フォールバックが動作しなくなるのでプロパティごと消す
- const removeEmpty = (obj) => {
- for (const [k, v] of Object.entries(obj)) {
- if (v === '') {
- delete obj[k];
- } else if (typeof v === 'object') {
- removeEmpty(v);
- }
- }
- return obj;
- };
- removeEmpty(locales);
-
- return Object.entries(locales)
- .reduce((a, [k, v]) => (a[k] = (() => {
- const [lang] = k.split('-');
- switch (k) {
- case 'ja-JP': return v;
- case 'ja-KS':
- case 'en-US': return merge(locales['ja-JP'], v);
- default: return merge(
- locales['ja-JP'],
- locales['en-US'],
- locales[`${lang}-${primaries[lang]}`] ?? {},
- v
- );
- }
- })(), a), {});
-}
-
-export default build();
diff --git a/locales/it-IT.yml b/locales/it-IT.yml
index e3cffed3a1..3b918e9c9f 100644
--- a/locales/it-IT.yml
+++ b/locales/it-IT.yml
@@ -83,6 +83,8 @@ files: "Allegati"
download: "Scarica"
driveFileDeleteConfirm: "Vuoi davvero eliminare il file \"{name}\", e le Note a cui è stato allegato?"
unfollowConfirm: "Vuoi davvero togliere il Following a {name}?"
+cancelFollowRequestConfirm: "Vuoi annullare la tua richiesta di follow inviata a {name}?"
+rejectFollowRequestConfirm: "Vuoi rifiutare la richiesta di follow ricevuta da {name}?"
exportRequested: "Hai richiesto un'esportazione, e potrebbe volerci tempo. Quando sarà compiuta, il file verrà aggiunto direttamente al Drive."
importRequested: "Hai richiesto un'importazione. Potrebbe richiedere un po' di tempo."
lists: "Liste"
@@ -2350,13 +2352,13 @@ _ago:
yearsAgo: "{n} anni fa"
invalid: "Niente da visualizzare"
_timeIn:
- seconds: "Dopo {n} secondi"
- minutes: "Dopo {n} minuti"
- hours: "Dopo {n} ore"
- days: "Dopo {n} giorni"
- weeks: "Dopo {n} settimane"
- months: "Dopo {n} mesi"
- years: "Dopo {n} anni"
+ seconds: "Tra {n} secondi"
+ minutes: "Tra {n} minuti"
+ hours: "Tra {n} ore"
+ days: "Tra {n} giorni"
+ weeks: "Tra {n} settimane"
+ months: "Tra {n} mesi"
+ years: "Tra {n} anni"
_time:
second: "s"
minute: "min"
diff --git a/locales/package.json b/locales/package.json
deleted file mode 100644
index bedb411a91..0000000000
--- a/locales/package.json
+++ /dev/null
@@ -1,3 +0,0 @@
-{
- "type": "module"
-}
diff --git a/locales/verify.js b/locales/verify.js
deleted file mode 100644
index a8e9875d6e..0000000000
--- a/locales/verify.js
+++ /dev/null
@@ -1,53 +0,0 @@
-import locales from './index.js';
-
-let valid = true;
-
-function writeError(type, lang, tree, data) {
- process.stderr.write(JSON.stringify({ type, lang, tree, data }));
- process.stderr.write('\n');
- valid = false;
-}
-
-function verify(expected, actual, lang, trace) {
- for (let key in expected) {
- if (!Object.prototype.hasOwnProperty.call(actual, key)) {
- continue;
- }
- if (typeof expected[key] === 'object') {
- if (typeof actual[key] !== 'object') {
- writeError('mismatched_type', lang, trace ? `${trace}.${key}` : key, { expected: 'object', actual: typeof actual[key] });
- continue;
- }
- verify(expected[key], actual[key], lang, trace ? `${trace}.${key}` : key);
- } else if (typeof expected[key] === 'string') {
- switch (typeof actual[key]) {
- case 'object':
- writeError('mismatched_type', lang, trace ? `${trace}.${key}` : key, { expected: 'string', actual: 'object' });
- break;
- case 'undefined':
- continue;
- case 'string':
- const expectedParameters = new Set(expected[key].match(/\{[^}]+\}/g)?.map((s) => s.slice(1, -1)));
- const actualParameters = new Set(actual[key].match(/\{[^}]+\}/g)?.map((s) => s.slice(1, -1)));
- for (let parameter of expectedParameters) {
- if (!actualParameters.has(parameter)) {
- writeError('missing_parameter', lang, trace ? `${trace}.${key}` : key, { parameter });
- }
- }
- }
- }
- }
-}
-
-const { ['ja-JP']: original, ...verifiees } = locales;
-
-for (let lang in verifiees) {
- if (!Object.prototype.hasOwnProperty.call(locales, lang)) {
- continue;
- }
- verify(original, verifiees[lang], lang);
-}
-
-if (!valid) {
- process.exit(1);
-}
diff --git a/locales/zh-CN.yml b/locales/zh-CN.yml
index fcad02f241..c5eb96fbb3 100644
--- a/locales/zh-CN.yml
+++ b/locales/zh-CN.yml
@@ -877,7 +877,7 @@ noInquiryUrlWarning: "尚未设置联络地址。"
noBotProtectionWarning: "尚未设置 Bot 防御。"
configure: "设置"
postToGallery: "创建新图集"
-postToHashtag: "投稿到这个标签"
+postToHashtag: "发布至该话题"
gallery: "图集"
recentPosts: "最新发布"
popularPosts: "热门投稿"
@@ -3146,7 +3146,7 @@ _selfXssPrevention:
description3: "详情请看这里。{link}"
_followRequest:
recieved: "收到的请求"
- sent: "已发送的请求"
+ sent: "发送的请求"
_remoteLookupErrors:
_federationNotAllowed:
title: "无法与此服务器通信"
diff --git a/package.json b/package.json
index bcbd1315f9..40542046eb 100644
--- a/package.json
+++ b/package.json
@@ -1,33 +1,36 @@
{
"name": "misskey",
- "version": "2025.11.1",
+ "version": "2025.12.0",
"codename": "nasubi",
"repository": {
"type": "git",
"url": "https://github.com/misskey-dev/misskey.git"
},
- "packageManager": "pnpm@10.22.0",
+ "packageManager": "pnpm@10.24.0",
"workspaces": [
- "packages/frontend-shared",
- "packages/frontend",
- "packages/frontend-embed",
- "packages/icons-subsetter",
- "packages/backend",
- "packages/sw",
"packages/misskey-js",
+ "packages/i18n",
"packages/misskey-reversi",
- "packages/misskey-bubble-game"
+ "packages/misskey-bubble-game",
+ "packages/icons-subsetter",
+ "packages/frontend-shared",
+ "packages/frontend-builder",
+ "packages/sw",
+ "packages/backend",
+ "packages/frontend",
+ "packages/frontend-embed"
],
"private": true,
"scripts": {
+ "compile-config": "cd packages/backend && pnpm compile-config",
"build-pre": "node ./scripts/build-pre.js",
"build-assets": "node ./scripts/build-assets.mjs",
"build": "pnpm build-pre && pnpm -r build && pnpm build-assets",
"build-storybook": "pnpm --filter frontend build-storybook",
"build-misskey-js-with-types": "pnpm build-pre && pnpm --filter backend... --filter=!misskey-js build && pnpm --filter backend generate-api-json --no-build && ncp packages/backend/built/api.json packages/misskey-js/generator/api.json && pnpm --filter misskey-js update-autogen-code && pnpm --filter misskey-js build && pnpm --filter misskey-js api",
- "start": "pnpm check:connect && cd packages/backend && node ./built/boot/entry.js",
- "start:inspect": "cd packages/backend && node --inspect ./built/boot/entry.js",
- "start:test": "ncp ./.github/misskey/test.yml ./.config/test.yml && cd packages/backend && cross-env NODE_ENV=test node ./built/boot/entry.js",
+ "start": "pnpm check:connect && cd packages/backend && pnpm compile-config && node ./built/boot/entry.js",
+ "start:inspect": "cd packages/backend && pnpm compile-config && node --inspect ./built/boot/entry.js",
+ "start:test": "ncp ./.github/misskey/test.yml ./.config/test.yml && cd packages/backend && cross-env NODE_ENV=test pnpm compile-config && cross-env NODE_ENV=test node ./built/boot/entry.js",
"cli": "cd packages/backend && pnpm cli",
"init": "pnpm migrate",
"migrate": "cd packages/backend && pnpm migrate",
@@ -74,12 +77,12 @@
"@typescript-eslint/eslint-plugin": "8.47.0",
"@typescript-eslint/parser": "8.47.0",
"cross-env": "10.1.0",
- "cypress": "15.6.0",
+ "cypress": "15.7.0",
"eslint": "9.39.1",
"globals": "16.5.0",
"ncp": "2.0.0",
- "pnpm": "10.22.0",
- "start-server-and-test": "2.1.2"
+ "pnpm": "10.24.0",
+ "start-server-and-test": "2.1.3"
},
"optionalDependencies": {
"@tensorflow/tfjs-core": "4.22.0"
diff --git a/packages/backend/.swcrc b/packages/backend/.swcrc
index f4bf7a4d2a..7e1767a67a 100644
--- a/packages/backend/.swcrc
+++ b/packages/backend/.swcrc
@@ -3,12 +3,17 @@
"jsc": {
"parser": {
"syntax": "typescript",
+ "jsx": true,
"dynamicImport": true,
"decorators": true
},
"transform": {
"legacyDecorator": true,
- "decoratorMetadata": true
+ "decoratorMetadata": true,
+ "react": {
+ "runtime": "automatic",
+ "importSource": "@kitajs/html"
+ }
},
"experimental": {
"keepImportAssertions": true
diff --git a/packages/backend/src/server/web/bios.css b/packages/backend/assets/misc/bios.css
index 91d1af10b4..91d1af10b4 100644
--- a/packages/backend/src/server/web/bios.css
+++ b/packages/backend/assets/misc/bios.css
diff --git a/packages/backend/src/server/web/bios.js b/packages/backend/assets/misc/bios.js
index 9ff5dca72a..9ff5dca72a 100644
--- a/packages/backend/src/server/web/bios.js
+++ b/packages/backend/assets/misc/bios.js
diff --git a/packages/backend/src/server/web/cli.css b/packages/backend/assets/misc/cli.css
index 4e6136d59c..4e6136d59c 100644
--- a/packages/backend/src/server/web/cli.css
+++ b/packages/backend/assets/misc/cli.css
diff --git a/packages/backend/src/server/web/cli.js b/packages/backend/assets/misc/cli.js
index 30ee77f4d9..30ee77f4d9 100644
--- a/packages/backend/src/server/web/cli.js
+++ b/packages/backend/assets/misc/cli.js
diff --git a/packages/backend/src/server/web/error.css b/packages/backend/assets/misc/error.css
index 803bd1b4b5..803bd1b4b5 100644
--- a/packages/backend/src/server/web/error.css
+++ b/packages/backend/assets/misc/error.css
diff --git a/packages/backend/src/server/web/error.js b/packages/backend/assets/misc/error.js
index 4838dd6ef3..4838dd6ef3 100644
--- a/packages/backend/src/server/web/error.js
+++ b/packages/backend/assets/misc/error.js
diff --git a/packages/backend/assets/misc/flush.js b/packages/backend/assets/misc/flush.js
new file mode 100644
index 0000000000..991b8ea808
--- /dev/null
+++ b/packages/backend/assets/misc/flush.js
@@ -0,0 +1,46 @@
+(async () => {
+ const msg = document.getElementById('msg');
+ const successText = `\nSuccess Flush! <a href="/">Back to Misskey</a>\n成功しました。<a href="/">Misskeyを開き直してください。</a>`;
+
+ if (!document.cookie) {
+ message('Your site data is fully cleared by your browser.');
+ message(successText);
+ } else {
+ message('Your browser does not support Clear-Site-Data header. Start opportunistic flushing.');
+ try {
+ localStorage.clear();
+ message('localStorage cleared.');
+
+ const idbPromises = ['MisskeyClient', 'keyval-store'].map((name, i, arr) => new Promise((res, rej) => {
+ const delidb = indexedDB.deleteDatabase(name);
+ delidb.onsuccess = () => res(message(`indexedDB "${name}" cleared. (${i + 1}/${arr.length})`));
+ delidb.onerror = e => rej(e)
+ }));
+
+ await Promise.all(idbPromises);
+
+ if (navigator.serviceWorker.controller) {
+ navigator.serviceWorker.controller.postMessage('clear');
+ await navigator.serviceWorker.getRegistrations()
+ .then(registrations => {
+ return Promise.all(registrations.map(registration => registration.unregister()));
+ })
+ .catch(e => { throw new Error(e) });
+ }
+
+ message(successText);
+ } catch (e) {
+ message(`\n${e}\n\nFlush Failed. <a href="/flush">Please retry.</a>\n失敗しました。<a href="/flush">もう一度試してみてください。</a>`);
+ message(`\nIf you retry more than 3 times, try manually clearing the browser cache or contact to instance admin.\n3回以上試しても失敗する場合、ブラウザのキャッシュを手動で消去し、それでもだめならインスタンス管理者に連絡してみてください。\n`)
+
+ console.error(e);
+ setTimeout(() => {
+ location = '/';
+ }, 10000)
+ }
+ }
+
+ function message(text) {
+ msg.insertAdjacentHTML('beforeend', `<p>[${(new Date()).toString()}] ${text.replace(/\n/g,'<br>')}</p>`)
+ }
+})();
diff --git a/packages/backend/assets/misc/info-card.css b/packages/backend/assets/misc/info-card.css
new file mode 100644
index 0000000000..3e27223cc5
--- /dev/null
+++ b/packages/backend/assets/misc/info-card.css
@@ -0,0 +1,35 @@
+html,
+body {
+ margin: 0;
+ padding: 0;
+ min-height: 100vh;
+ background: #fff;
+}
+
+#a {
+ display: block;
+}
+
+#banner {
+ background-size: cover;
+ background-position: center center;
+}
+
+#title {
+ display: inline-block;
+ margin: 24px;
+ padding: 0.5em 0.8em;
+ color: #fff;
+ background: rgba(0, 0, 0, 0.5);
+ font-weight: bold;
+ font-size: 1.3em;
+}
+
+#content {
+ overflow: auto;
+ color: #353c3e;
+}
+
+#description {
+ margin: 24px;
+}
diff --git a/packages/backend/jest.config.cjs b/packages/backend/jest.config.cjs
index 5a4aa4e15a..22ffbbee5c 100644
--- a/packages/backend/jest.config.cjs
+++ b/packages/backend/jest.config.cjs
@@ -205,7 +205,7 @@ module.exports = {
// Whether to use watchman for file crawling
// watchman: true,
- extensionsToTreatAsEsm: ['.ts'],
+ extensionsToTreatAsEsm: ['.ts', '.tsx'],
testTimeout: 60000,
diff --git a/packages/backend/jsconfig.json b/packages/backend/jsconfig.json
deleted file mode 100644
index 1230aadd12..0000000000
--- a/packages/backend/jsconfig.json
+++ /dev/null
@@ -1,13 +0,0 @@
-{
- "compilerOptions": {
- "target": "es6",
- "module": "commonjs",
- "allowSyntheticDefaultImports": true
- },
- "exclude": [
- "node_modules",
- "jspm_packages",
- "tmp",
- "temp"
- ]
-}
diff --git a/packages/backend/migration/1745378064470-composite-note-index.js b/packages/backend/migration/1745378064470-composite-note-index.js
index 12108a6b3c..576bf7d19a 100644
--- a/packages/backend/migration/1745378064470-composite-note-index.js
+++ b/packages/backend/migration/1745378064470-composite-note-index.js
@@ -3,14 +3,14 @@
* SPDX-License-Identifier: AGPL-3.0-only
*/
-import { isConcurrentIndexMigrationEnabled } from "./js/migration-config.js";
+const isConcurrentIndexMigrationEnabled = process.env.MISSKEY_MIGRATION_CREATE_INDEX_CONCURRENTLY === '1';
export class CompositeNoteIndex1745378064470 {
name = 'CompositeNoteIndex1745378064470';
- transaction = isConcurrentIndexMigrationEnabled() ? false : undefined;
+ transaction = isConcurrentIndexMigrationEnabled ? false : undefined;
async up(queryRunner) {
- const concurrently = isConcurrentIndexMigrationEnabled();
+ const concurrently = isConcurrentIndexMigrationEnabled;
if (concurrently) {
const hasValidIndex = await queryRunner.query(`SELECT indisvalid FROM pg_index INNER JOIN pg_class ON pg_index.indexrelid = pg_class.oid WHERE pg_class.relname = 'IDX_724b311e6f883751f261ebe378'`);
@@ -29,7 +29,7 @@ export class CompositeNoteIndex1745378064470 {
}
async down(queryRunner) {
- const mayConcurrently = isConcurrentIndexMigrationEnabled() ? 'CONCURRENTLY' : '';
+ const mayConcurrently = isConcurrentIndexMigrationEnabled ? 'CONCURRENTLY' : '';
await queryRunner.query(`DROP INDEX IF EXISTS "IDX_724b311e6f883751f261ebe378"`);
await queryRunner.query(`CREATE INDEX ${mayConcurrently} "IDX_5b87d9d19127bd5d92026017a7" ON "note" ("userId")`);
}
diff --git a/packages/backend/migration/1746949539915-migrateSomeConfigFileSettingsToMeta.js b/packages/backend/migration/1746949539915-migrateSomeConfigFileSettingsToMeta.js
index 3243f43b91..cb8bb33459 100644
--- a/packages/backend/migration/1746949539915-migrateSomeConfigFileSettingsToMeta.js
+++ b/packages/backend/migration/1746949539915-migrateSomeConfigFileSettingsToMeta.js
@@ -3,17 +3,15 @@
* SPDX-License-Identifier: AGPL-3.0-only
*/
-import {loadConfig} from "./js/migration-config.js";
export class MigrateSomeConfigFileSettingsToMeta1746949539915 {
name = 'MigrateSomeConfigFileSettingsToMeta1746949539915'
async up(queryRunner) {
- const config = loadConfig();
// $1 cannot be used in ALTER TABLE queries
- await queryRunner.query(`ALTER TABLE "meta" ADD "proxyRemoteFiles" boolean NOT NULL DEFAULT ${config.proxyRemoteFiles}`);
- await queryRunner.query(`ALTER TABLE "meta" ADD "signToActivityPubGet" boolean NOT NULL DEFAULT ${config.signToActivityPubGet}`);
- await queryRunner.query(`ALTER TABLE "meta" ADD "allowExternalApRedirect" boolean NOT NULL DEFAULT ${!config.disallowExternalApRedirect}`);
+ await queryRunner.query(`ALTER TABLE "meta" ADD "proxyRemoteFiles" boolean NOT NULL DEFAULT TRUE`);
+ await queryRunner.query(`ALTER TABLE "meta" ADD "signToActivityPubGet" boolean NOT NULL DEFAULT TRUE`);
+ await queryRunner.query(`ALTER TABLE "meta" ADD "allowExternalApRedirect" boolean NOT NULL DEFAULT TRUE`);
}
async down(queryRunner) {
diff --git a/packages/backend/migration/js/migration-config.js b/packages/backend/migration/js/migration-config.js
deleted file mode 100644
index 853735661b..0000000000
--- a/packages/backend/migration/js/migration-config.js
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * SPDX-FileCopyrightText: syuilo and misskey-project
- * SPDX-License-Identifier: AGPL-3.0-only
- */
-
-import { path as configYamlPath } from '../../built/config.js';
-import * as yaml from 'js-yaml';
-import fs from "node:fs";
-
-export function isConcurrentIndexMigrationEnabled() {
- return process.env.MISSKEY_MIGRATION_CREATE_INDEX_CONCURRENTLY === '1';
-}
-
-let loadedConfigCache = undefined;
-
-function loadConfigInternal() {
- const config = yaml.load(fs.readFileSync(configYamlPath, 'utf-8'));
-
- return {
- disallowExternalApRedirect: Boolean(config.disallowExternalApRedirect ?? false),
- proxyRemoteFiles: Boolean(config.proxyRemoteFiles ?? false),
- signToActivityPubGet: Boolean(config.signToActivityPubGet ?? true),
- }
-}
-
-export function loadConfig() {
- if (loadedConfigCache === undefined) {
- loadedConfigCache = loadConfigInternal();
- }
- return loadedConfigCache;
-}
diff --git a/packages/backend/ormconfig.js b/packages/backend/ormconfig.js
index f979c36ad7..dabc0893f4 100644
--- a/packages/backend/ormconfig.js
+++ b/packages/backend/ormconfig.js
@@ -1,7 +1,8 @@
import { DataSource } from 'typeorm';
import { loadConfig } from './built/config.js';
import { entities } from './built/postgres.js';
-import { isConcurrentIndexMigrationEnabled } from "./migration/js/migration-config.js";
+
+const isConcurrentIndexMigrationEnabled = process.env.MISSKEY_MIGRATION_CREATE_INDEX_CONCURRENTLY === '1';
const config = loadConfig();
@@ -15,5 +16,5 @@ export default new DataSource({
extra: config.db.extra,
entities: entities,
migrations: ['migration/*.js'],
- migrationsTransactionMode: isConcurrentIndexMigrationEnabled() ? 'each' : 'all',
+ migrationsTransactionMode: isConcurrentIndexMigrationEnabled ? 'each' : 'all',
});
diff --git a/packages/backend/package.json b/packages/backend/package.json
index 95ebdbdd3c..40aa2f82a2 100644
--- a/packages/backend/package.json
+++ b/packages/backend/package.json
@@ -7,50 +7,51 @@
"node": "^22.15.0 || ^24.10.0"
},
"scripts": {
- "start": "node ./built/boot/entry.js",
- "start:inspect": "node --inspect ./built/boot/entry.js",
- "start:test": "cross-env NODE_ENV=test node ./built/boot/entry.js",
- "migrate": "pnpm typeorm migration:run -d ormconfig.js",
- "revert": "pnpm typeorm migration:revert -d ormconfig.js",
- "cli": "node ./built/boot/cli.js",
- "check:connect": "node ./scripts/check_connect.js",
+ "start": "pnpm compile-config && node ./built/boot/entry.js",
+ "start:inspect": "pnpm compile-config && node --inspect ./built/boot/entry.js",
+ "start:test": "cross-env NODE_ENV=test pnpm compile-config && cross-env NODE_ENV=test node ./built/boot/entry.js",
+ "migrate": "pnpm compile-config && pnpm typeorm migration:run -d ormconfig.js",
+ "revert": "pnpm compile-config && pnpm typeorm migration:revert -d ormconfig.js",
+ "cli": "pnpm compile-config && node ./built/boot/cli.js",
+ "check:connect": "pnpm compile-config && node ./scripts/check_connect.js",
+ "compile-config": "node ./scripts/compile_config.js",
"build": "swc src -d built -D --strip-leading-paths",
"build:test": "swc test-server -d built-test -D --config-file test-server/.swcrc --strip-leading-paths",
"watch:swc": "swc src -d built -D -w --strip-leading-paths",
"build:tsc": "tsc -p tsconfig.json && tsc-alias -p tsconfig.json",
- "watch": "node ./scripts/watch.mjs",
+ "watch": "pnpm compile-config && node ./scripts/watch.mjs",
"restart": "pnpm build && pnpm start",
- "dev": "node ./scripts/dev.mjs",
+ "dev": "pnpm compile-config && node ./scripts/dev.mjs",
"typecheck": "tsc --noEmit && tsc -p test --noEmit && tsc -p test-federation --noEmit",
"eslint": "eslint --quiet \"{src,test-federation}/**/*.ts\"",
"lint": "pnpm typecheck && pnpm eslint",
- "jest": "cross-env NODE_ENV=test node ./jest.js --forceExit --config jest.config.unit.cjs",
- "jest:e2e": "cross-env NODE_ENV=test node ./jest.js --forceExit --config jest.config.e2e.cjs",
- "jest:fed": "node ./jest.js --forceExit --config jest.config.fed.cjs",
- "jest-and-coverage": "cross-env NODE_ENV=test node ./jest.js --coverage --forceExit --config jest.config.unit.cjs",
- "jest-and-coverage:e2e": "cross-env NODE_ENV=test node ./jest.js --coverage --forceExit --config jest.config.e2e.cjs",
- "jest-clear": "cross-env NODE_ENV=test node ./jest.js --clearCache",
+ "jest": "cross-env NODE_ENV=test pnpm compile-config && cross-env NODE_ENV=test node ./jest.js --forceExit --config jest.config.unit.cjs",
+ "jest:e2e": "cross-env NODE_ENV=test pnpm compile-config && cross-env NODE_ENV=test node ./jest.js --forceExit --config jest.config.e2e.cjs",
+ "jest:fed": "pnpm compile-config && node ./jest.js --forceExit --config jest.config.fed.cjs",
+ "jest-and-coverage": "cross-env NODE_ENV=test pnpm compile-config && cross-env NODE_ENV=test node ./jest.js --coverage --forceExit --config jest.config.unit.cjs",
+ "jest-and-coverage:e2e": "cross-env NODE_ENV=test pnpm compile-config && cross-env NODE_ENV=test node ./jest.js --coverage --forceExit --config jest.config.e2e.cjs",
+ "jest-clear": "cross-env NODE_ENV=test pnpm compile-config && cross-env NODE_ENV=test node ./jest.js --clearCache",
"test": "pnpm jest",
"test:e2e": "pnpm build && pnpm build:test && pnpm jest:e2e",
"test:fed": "pnpm jest:fed",
"test-and-coverage": "pnpm jest-and-coverage",
"test-and-coverage:e2e": "pnpm build && pnpm build:test && pnpm jest-and-coverage:e2e",
"check-migrations": "node scripts/check_migrations_clean.js",
- "generate-api-json": "node ./scripts/generate_api_json.js"
+ "generate-api-json": "pnpm compile-config && node ./scripts/generate_api_json.js"
},
"optionalDependencies": {
"@swc/core-android-arm64": "1.3.11",
- "@swc/core-darwin-arm64": "1.15.2",
- "@swc/core-darwin-x64": "1.15.2",
+ "@swc/core-darwin-arm64": "1.15.3",
+ "@swc/core-darwin-x64": "1.15.3",
"@swc/core-freebsd-x64": "1.3.11",
- "@swc/core-linux-arm-gnueabihf": "1.15.2",
- "@swc/core-linux-arm64-gnu": "1.15.2",
- "@swc/core-linux-arm64-musl": "1.15.2",
- "@swc/core-linux-x64-gnu": "1.15.2",
- "@swc/core-linux-x64-musl": "1.15.2",
- "@swc/core-win32-arm64-msvc": "1.15.2",
- "@swc/core-win32-ia32-msvc": "1.15.2",
- "@swc/core-win32-x64-msvc": "1.15.2",
+ "@swc/core-linux-arm-gnueabihf": "1.15.3",
+ "@swc/core-linux-arm64-gnu": "1.15.3",
+ "@swc/core-linux-arm64-musl": "1.15.3",
+ "@swc/core-linux-x64-gnu": "1.15.3",
+ "@swc/core-linux-x64-musl": "1.15.3",
+ "@swc/core-win32-arm64-msvc": "1.15.3",
+ "@swc/core-win32-ia32-msvc": "1.15.3",
+ "@swc/core-win32-x64-msvc": "1.15.3",
"@tensorflow/tfjs": "4.22.0",
"@tensorflow/tfjs-node": "4.22.0",
"bufferutil": "4.0.9",
@@ -70,106 +71,100 @@
"utf-8-validate": "6.0.5"
},
"dependencies": {
- "@aws-sdk/client-s3": "3.936.0",
- "@aws-sdk/lib-storage": "3.936.0",
+ "@aws-sdk/client-s3": "3.940.0",
+ "@aws-sdk/lib-storage": "3.940.0",
"@discordapp/twemoji": "16.0.1",
"@fastify/accepts": "5.0.3",
"@fastify/cookie": "11.0.2",
- "@fastify/cors": "10.1.0",
+ "@fastify/cors": "11.1.0",
"@fastify/express": "4.0.2",
- "@fastify/http-proxy": "10.0.2",
+ "@fastify/http-proxy": "11.3.0",
"@fastify/multipart": "9.3.0",
"@fastify/static": "8.3.0",
- "@fastify/view": "10.0.2",
+ "@kitajs/html": "4.2.11",
"@misskey-dev/sharp-read-bmp": "1.2.0",
"@misskey-dev/summaly": "5.2.5",
- "@napi-rs/canvas": "0.1.82",
+ "@napi-rs/canvas": "0.1.83",
"@nestjs/common": "11.1.9",
"@nestjs/core": "11.1.9",
"@nestjs/testing": "11.1.9",
"@peertube/http-signature": "1.7.0",
- "@sentry/node": "10.26.0",
- "@sentry/profiling-node": "10.26.0",
- "@simplewebauthn/server": "12.0.0",
- "@sinonjs/fake-timers": "11.3.1",
- "@smithy/node-http-handler": "2.5.0",
+ "@sentry/node": "10.27.0",
+ "@sentry/profiling-node": "10.27.0",
+ "@simplewebauthn/server": "13.2.2",
+ "@sinonjs/fake-timers": "15.0.0",
+ "@smithy/node-http-handler": "4.4.5",
"@swc/cli": "0.7.9",
- "@swc/core": "1.15.2",
+ "@swc/core": "1.15.3",
"@twemoji/parser": "16.0.0",
"@types/redis-info": "3.0.3",
"accepts": "1.3.8",
"ajv": "8.17.1",
"archiver": "7.0.1",
"async-mutex": "0.5.0",
- "bcryptjs": "2.4.3",
+ "bcryptjs": "3.0.3",
"blurhash": "2.0.5",
- "body-parser": "1.20.3",
- "bullmq": "5.63.2",
+ "body-parser": "2.2.1",
+ "bullmq": "5.65.0",
"cacheable-lookup": "7.0.0",
- "cbor": "9.0.2",
+ "cbor": "10.0.11",
"chalk": "5.6.2",
"chalk-template": "1.1.2",
"chokidar": "4.0.3",
- "color-convert": "2.0.1",
- "content-disposition": "0.5.4",
- "date-fns": "2.30.0",
+ "color-convert": "3.1.3",
+ "content-disposition": "1.0.1",
+ "date-fns": "4.1.0",
"deep-email-validator": "0.1.21",
"fastify": "5.6.2",
"fastify-raw-body": "5.0.0",
- "feed": "4.2.2",
+ "feed": "5.1.0",
"file-type": "21.1.1",
"fluent-ffmpeg": "2.1.3",
"form-data": "4.0.5",
- "got": "14.6.4",
- "happy-dom": "20.0.10",
+ "got": "14.6.5",
"hpagent": "1.2.0",
- "htmlescape": "1.1.1",
"http-link-header": "1.1.3",
+ "i18n": "workspace:*",
"ioredis": "5.8.2",
"ip-cidr": "4.0.2",
- "ipaddr.js": "2.2.0",
- "is-svg": "5.1.0",
- "js-yaml": "4.1.1",
- "jsdom": "26.1.0",
+ "ipaddr.js": "2.3.0",
+ "is-svg": "6.1.0",
"json5": "2.2.3",
- "jsonld": "8.3.3",
+ "jsonld": "9.0.0",
"jsrsasign": "11.1.0",
"juice": "11.0.3",
"meilisearch": "0.54.0",
"mfm-js": "0.25.0",
- "microformats-parser": "2.0.4",
- "mime-types": "2.1.35",
+ "mime-types": "3.0.2",
"misskey-js": "workspace:*",
"misskey-reversi": "workspace:*",
"ms": "3.0.0-canary.202508261828",
"nanoid": "5.1.6",
"nested-property": "4.0.0",
"node-fetch": "3.3.2",
- "nodemailer": "7.0.10",
+ "node-html-parser": "7.0.1",
+ "nodemailer": "7.0.11",
"nsfwjs": "4.2.0",
"oauth": "0.10.2",
"oauth2orize": "1.12.0",
"oauth2orize-pkce": "0.1.2",
"os-utils": "0.0.14",
"otpauth": "9.4.1",
- "parse5": "7.3.0",
"pg": "8.16.3",
- "pkce-challenge": "4.1.0",
+ "pkce-challenge": "5.0.1",
"probe-image-size": "7.2.3",
"promise-limit": "2.7.0",
- "pug": "3.0.3",
"qrcode": "1.5.4",
"random-seed": "0.3.0",
"ratelimiter": "3.4.1",
"re2": "1.22.3",
"redis-info": "3.1.0",
- "redis-lock": "0.1.4",
"reflect-metadata": "0.2.2",
"rename": "1.0.4",
"rss-parser": "3.13.0",
"rxjs": "7.8.2",
"sanitize-html": "2.17.0",
- "secure-json-parse": "3.0.2",
+ "secure-json-parse": "4.1.0",
"semver": "7.7.3",
"sharp": "0.33.5",
"slacc": "0.0.10",
@@ -182,7 +177,7 @@
"tsconfig-paths": "4.2.0",
"typeorm": "0.3.27",
"typescript": "5.9.3",
- "ulid": "2.4.0",
+ "ulid": "3.0.1",
"vary": "1.1.2",
"web-push": "3.6.7",
"ws": "8.18.3",
@@ -190,33 +185,29 @@
},
"devDependencies": {
"@jest/globals": "29.7.0",
- "@nestjs/platform-express": "10.4.20",
- "@sentry/vue": "10.26.0",
+ "@kitajs/ts-html-plugin": "4.1.3",
+ "@nestjs/platform-express": "11.1.9",
+ "@sentry/vue": "10.27.0",
"@simplewebauthn/types": "12.0.0",
"@swc/jest": "0.2.39",
"@types/accepts": "1.3.7",
- "@types/archiver": "6.0.4",
- "@types/bcryptjs": "2.4.6",
+ "@types/archiver": "7.0.0",
"@types/body-parser": "1.19.6",
"@types/color-convert": "2.0.4",
"@types/content-disposition": "0.5.9",
"@types/fluent-ffmpeg": "2.1.28",
- "@types/htmlescape": "1.1.3",
"@types/http-link-header": "1.0.7",
"@types/jest": "29.5.14",
- "@types/js-yaml": "4.0.9",
- "@types/jsdom": "21.1.7",
"@types/jsonld": "1.5.15",
"@types/jsrsasign": "10.5.15",
- "@types/mime-types": "2.1.4",
- "@types/ms": "0.7.34",
+ "@types/mime-types": "3.0.1",
+ "@types/ms": "2.1.0",
"@types/node": "24.10.1",
- "@types/nodemailer": "6.4.21",
+ "@types/nodemailer": "7.0.4",
"@types/oauth": "0.9.6",
"@types/oauth2orize": "1.11.5",
"@types/oauth2orize-pkce": "0.1.2",
"@types/pg": "8.15.6",
- "@types/pug": "2.0.10",
"@types/qrcode": "1.5.6",
"@types/random-seed": "0.3.5",
"@types/ratelimiter": "3.4.6",
@@ -224,25 +215,28 @@
"@types/sanitize-html": "2.16.0",
"@types/semver": "7.7.1",
"@types/simple-oauth2": "5.0.7",
- "@types/sinonjs__fake-timers": "8.1.5",
+ "@types/sinonjs__fake-timers": "15.0.1",
"@types/supertest": "6.0.3",
"@types/tinycolor2": "1.4.6",
"@types/tmp": "0.2.6",
"@types/vary": "1.1.3",
"@types/web-push": "3.6.4",
"@types/ws": "8.18.1",
- "@typescript-eslint/eslint-plugin": "8.47.0",
- "@typescript-eslint/parser": "8.47.0",
+ "@typescript-eslint/eslint-plugin": "8.48.0",
+ "@typescript-eslint/parser": "8.48.0",
"aws-sdk-client-mock": "4.1.0",
- "cross-env": "7.0.3",
+ "cross-env": "10.1.0",
"eslint-plugin-import": "2.32.0",
- "execa": "8.0.1",
- "fkill": "9.0.0",
+ "execa": "9.6.0",
+ "fkill": "10.0.1",
"jest": "29.7.0",
"jest-mock": "29.7.0",
+ "jest-util": "29.7.0",
+ "js-yaml": "4.1.1",
"nodemon": "3.1.11",
- "pid-port": "1.0.2",
+ "pid-port": "2.0.0",
"simple-oauth2": "5.1.0",
- "supertest": "7.1.4"
+ "supertest": "7.1.4",
+ "vite": "7.2.4"
}
}
diff --git a/packages/backend/scripts/compile_config.js b/packages/backend/scripts/compile_config.js
new file mode 100644
index 0000000000..e78fa3dc9f
--- /dev/null
+++ b/packages/backend/scripts/compile_config.js
@@ -0,0 +1,54 @@
+/*
+ * SPDX-FileCopyrightText: syuilo and misskey-project
+ * SPDX-License-Identifier: AGPL-3.0-only
+ */
+
+/**
+ * YAMLファイルをJSONファイルに変換するスクリプト
+ * ビルド前に実行し、ランタイムにjs-yamlを含まないようにする
+ */
+
+import fs from 'node:fs';
+import { resolve, dirname } from 'node:path';
+import { fileURLToPath } from 'node:url';
+import yaml from 'js-yaml';
+
+const _filename = fileURLToPath(import.meta.url);
+const _dirname = dirname(_filename);
+
+const configDir = resolve(_dirname, '../../../.config');
+const OUTPUT_PATH = resolve(_dirname, '../../../built/.config.json');
+
+// TODO: yamlのパースに失敗したときのエラーハンドリング
+
+/**
+ * YAMLファイルをJSONファイルに変換
+ * @param {string} ymlPath - YAMLファイルのパス
+ */
+function yamlToJson(ymlPath) {
+ if (!fs.existsSync(ymlPath)) {
+ console.warn(`YAML file not found: ${ymlPath}`);
+ return;
+ }
+
+ console.log(`${ymlPath} → ${OUTPUT_PATH}`);
+
+ const yamlContent = fs.readFileSync(ymlPath, 'utf-8');
+ const jsonContent = yaml.load(yamlContent);
+ if (!fs.existsSync(dirname(OUTPUT_PATH))) {
+ fs.mkdirSync(dirname(OUTPUT_PATH), { recursive: true });
+ }
+ fs.writeFileSync(OUTPUT_PATH, JSON.stringify({
+ '_NOTE_': 'This file is auto-generated from YAML file. DO NOT EDIT.',
+ ...jsonContent,
+ }), 'utf-8');
+}
+
+if (process.env.MISSKEY_CONFIG_YML) {
+ const customYmlPath = resolve(configDir, process.env.MISSKEY_CONFIG_YML);
+ yamlToJson(customYmlPath);
+} else {
+ yamlToJson(resolve(configDir, process.env.NODE_ENV === 'test' ? 'test.yml' : 'default.yml'));
+}
+
+console.log('Configuration compiled ✓');
diff --git a/packages/backend/scripts/dev.mjs b/packages/backend/scripts/dev.mjs
index 023eb7eae6..db96eaf976 100644
--- a/packages/backend/scripts/dev.mjs
+++ b/packages/backend/scripts/dev.mjs
@@ -42,7 +42,7 @@ async function killProc() {
'./node_modules/nodemon/bin/nodemon.js',
[
'-w', 'src',
- '-e', 'ts,js,mjs,cjs,json,pug',
+ '-e', 'ts,js,mjs,cjs,tsx,json,pug',
'--exec', 'pnpm', 'run', 'build',
],
{
diff --git a/packages/backend/scripts/measure-memory.mjs b/packages/backend/scripts/measure-memory.mjs
new file mode 100644
index 0000000000..017252d7ec
--- /dev/null
+++ b/packages/backend/scripts/measure-memory.mjs
@@ -0,0 +1,152 @@
+/*
+ * SPDX-FileCopyrightText: syuilo and misskey-project
+ * SPDX-License-Identifier: AGPL-3.0-only
+ */
+
+/**
+ * This script starts the Misskey backend server, waits for it to be ready,
+ * measures memory usage, and outputs the result as JSON.
+ *
+ * Usage: node scripts/measure-memory.mjs
+ */
+
+import { fork } from 'node:child_process';
+import { setTimeout } from 'node:timers/promises';
+import { fileURLToPath } from 'node:url';
+import { dirname, join } from 'node:path';
+
+const __filename = fileURLToPath(import.meta.url);
+const __dirname = dirname(__filename);
+
+const STARTUP_TIMEOUT = 120000; // 120 seconds timeout for server startup
+const MEMORY_SETTLE_TIME = 10000; // Wait 10 seconds after startup for memory to settle
+
+async function measureMemory() {
+ const startTime = Date.now();
+
+ // Start the Misskey backend server using fork to enable IPC
+ const serverProcess = fork(join(__dirname, '../built/boot/entry.js'), [], {
+ cwd: join(__dirname, '..'),
+ env: {
+ ...process.env,
+ NODE_ENV: 'test',
+ },
+ stdio: ['pipe', 'pipe', 'pipe', 'ipc'],
+ });
+
+ let serverReady = false;
+
+ // Listen for the 'ok' message from the server indicating it's ready
+ serverProcess.on('message', (message) => {
+ if (message === 'ok') {
+ serverReady = true;
+ }
+ });
+
+ // Handle server output
+ serverProcess.stdout?.on('data', (data) => {
+ process.stderr.write(`[server stdout] ${data}`);
+ });
+
+ serverProcess.stderr?.on('data', (data) => {
+ process.stderr.write(`[server stderr] ${data}`);
+ });
+
+ // Handle server error
+ serverProcess.on('error', (err) => {
+ process.stderr.write(`[server error] ${err}\n`);
+ });
+
+ // Wait for server to be ready or timeout
+ const startupStartTime = Date.now();
+ while (!serverReady) {
+ if (Date.now() - startupStartTime > STARTUP_TIMEOUT) {
+ serverProcess.kill('SIGTERM');
+ throw new Error('Server startup timeout');
+ }
+ await setTimeout(100);
+ }
+
+ const startupTime = Date.now() - startupStartTime;
+ process.stderr.write(`Server started in ${startupTime}ms\n`);
+
+ // Wait for memory to settle
+ await setTimeout(MEMORY_SETTLE_TIME);
+
+ // Get memory usage from the server process via /proc
+ const pid = serverProcess.pid;
+ let memoryInfo;
+
+ try {
+ const fs = await import('node:fs/promises');
+
+ // Read /proc/[pid]/status for detailed memory info
+ const status = await fs.readFile(`/proc/${pid}/status`, 'utf-8');
+ const vmRssMatch = status.match(/VmRSS:\s+(\d+)\s+kB/);
+ const vmDataMatch = status.match(/VmData:\s+(\d+)\s+kB/);
+ const vmSizeMatch = status.match(/VmSize:\s+(\d+)\s+kB/);
+
+ memoryInfo = {
+ rss: vmRssMatch ? parseInt(vmRssMatch[1], 10) * 1024 : null,
+ heapUsed: vmDataMatch ? parseInt(vmDataMatch[1], 10) * 1024 : null,
+ vmSize: vmSizeMatch ? parseInt(vmSizeMatch[1], 10) * 1024 : null,
+ };
+ } catch (err) {
+ // Fallback: use ps command
+ process.stderr.write(`Warning: Could not read /proc/${pid}/status: ${err}\n`);
+
+ const { execSync } = await import('node:child_process');
+ try {
+ const ps = execSync(`ps -o rss= -p ${pid}`, { encoding: 'utf-8' });
+ const rssKb = parseInt(ps.trim(), 10);
+ memoryInfo = {
+ rss: rssKb * 1024,
+ heapUsed: null,
+ vmSize: null,
+ };
+ } catch {
+ memoryInfo = {
+ rss: null,
+ heapUsed: null,
+ vmSize: null,
+ error: 'Could not measure memory',
+ };
+ }
+ }
+
+ // Stop the server
+ serverProcess.kill('SIGTERM');
+
+ // Wait for process to exit
+ let exited = false;
+ await new Promise((resolve) => {
+ serverProcess.on('exit', () => {
+ exited = true;
+ resolve(undefined);
+ });
+ // Force kill after 10 seconds if not exited
+ setTimeout(10000).then(() => {
+ if (!exited) {
+ serverProcess.kill('SIGKILL');
+ }
+ resolve(undefined);
+ });
+ });
+
+ const result = {
+ timestamp: new Date().toISOString(),
+ startupTimeMs: startupTime,
+ memory: memoryInfo,
+ };
+
+ // Output as JSON to stdout
+ console.log(JSON.stringify(result, null, 2));
+}
+
+measureMemory().catch((err) => {
+ console.error(JSON.stringify({
+ error: err.message,
+ timestamp: new Date().toISOString(),
+ }));
+ process.exit(1);
+});
diff --git a/packages/backend/src/@types/redis-lock.d.ts b/packages/backend/src/@types/redis-lock.d.ts
deleted file mode 100644
index b037cde5ee..0000000000
--- a/packages/backend/src/@types/redis-lock.d.ts
+++ /dev/null
@@ -1,13 +0,0 @@
-/*
- * SPDX-FileCopyrightText: syuilo and misskey-project
- * SPDX-License-Identifier: AGPL-3.0-only
- */
-
-declare module 'redis-lock' {
- import type Redis from 'ioredis';
-
- type Lock = (lockName: string, timeout?: number, taskToPerform?: () => Promise<void>) => void;
- function redisLock(client: Redis.Redis, retryDelay: number): Lock;
-
- export = redisLock;
-}
diff --git a/packages/backend/src/boot/master.ts b/packages/backend/src/boot/master.ts
index 5ec362fb34..4776d0d412 100644
--- a/packages/backend/src/boot/master.ts
+++ b/packages/backend/src/boot/master.ts
@@ -10,8 +10,6 @@ import * as os from 'node:os';
import cluster from 'node:cluster';
import chalk from 'chalk';
import chalkTemplate from 'chalk-template';
-import * as Sentry from '@sentry/node';
-import { nodeProfilingIntegration } from '@sentry/profiling-node';
import Logger from '@/logger.js';
import { loadConfig } from '@/config.js';
import type { Config } from '@/config.js';
@@ -74,6 +72,9 @@ export async function masterMain() {
bootLogger.succ('Misskey initialized');
if (config.sentryForBackend) {
+ const Sentry = await import('@sentry/node');
+ const { nodeProfilingIntegration } = await import('@sentry/profiling-node');
+
Sentry.init({
integrations: [
...(config.sentryForBackend.enableNodeProfiling ? [nodeProfilingIntegration()] : []),
diff --git a/packages/backend/src/boot/worker.ts b/packages/backend/src/boot/worker.ts
index 5d4a15b29f..3feb6fd199 100644
--- a/packages/backend/src/boot/worker.ts
+++ b/packages/backend/src/boot/worker.ts
@@ -4,8 +4,6 @@
*/
import cluster from 'node:cluster';
-import * as Sentry from '@sentry/node';
-import { nodeProfilingIntegration } from '@sentry/profiling-node';
import { envOption } from '@/env.js';
import { loadConfig } from '@/config.js';
import { jobQueue, server } from './common.js';
@@ -17,6 +15,9 @@ export async function workerMain() {
const config = loadConfig();
if (config.sentryForBackend) {
+ const Sentry = await import('@sentry/node');
+ const { nodeProfilingIntegration } = await import('@sentry/profiling-node');
+
Sentry.init({
integrations: [
...(config.sentryForBackend.enableNodeProfiling ? [nodeProfilingIntegration()] : []),
diff --git a/packages/backend/src/config.ts b/packages/backend/src/config.ts
index fdf6fe18e2..f9852d3578 100644
--- a/packages/backend/src/config.ts
+++ b/packages/backend/src/config.ts
@@ -6,11 +6,11 @@
import * as fs from 'node:fs';
import { fileURLToPath } from 'node:url';
import { dirname, resolve } from 'node:path';
-import * as yaml from 'js-yaml';
import { type FastifyServerOptions } from 'fastify';
import type * as Sentry from '@sentry/node';
import type * as SentryVue from '@sentry/vue';
import type { RedisOptions } from 'ioredis';
+import type { ManifestChunk } from 'vite';
type RedisOptionsSource = Partial<RedisOptions> & {
host: string;
@@ -187,9 +187,9 @@ export type Config = {
authUrl: string;
driveUrl: string;
userAgent: string;
- frontendEntry: { file: string | null };
+ frontendEntry: ManifestChunk;
frontendManifestExists: boolean;
- frontendEmbedEntry: { file: string | null };
+ frontendEmbedEntry: ManifestChunk;
frontendEmbedManifestExists: boolean;
mediaProxy: string;
externalMediaProxyEnabled: boolean;
@@ -217,21 +217,15 @@ export type FulltextSearchProvider = 'sqlLike' | 'sqlPgroonga' | 'meilisearch';
const _filename = fileURLToPath(import.meta.url);
const _dirname = dirname(_filename);
-/**
- * Path of configuration directory
- */
-const dir = `${_dirname}/../../../.config`;
+const compiledConfigFilePathForTest = resolve(_dirname, '../../../built/._config_.json');
-/**
- * Path of configuration file
- */
-export const path = process.env.MISSKEY_CONFIG_YML
- ? resolve(dir, process.env.MISSKEY_CONFIG_YML)
- : process.env.NODE_ENV === 'test'
- ? resolve(dir, 'test.yml')
- : resolve(dir, 'default.yml');
+export const compiledConfigFilePath = fs.existsSync(compiledConfigFilePathForTest) ? compiledConfigFilePathForTest : resolve(_dirname, '../../../built/.config.json');
export function loadConfig(): Config {
+ if (!fs.existsSync(compiledConfigFilePath)) {
+ throw new Error('Compiled configuration file not found. Try running \'pnpm compile-config\'.');
+ }
+
const meta = JSON.parse(fs.readFileSync(`${_dirname}/../../../built/meta.json`, 'utf-8'));
const frontendManifestExists = fs.existsSync(_dirname + '/../../../built/_frontend_vite_/manifest.json');
@@ -243,7 +237,7 @@ export function loadConfig(): Config {
JSON.parse(fs.readFileSync(`${_dirname}/../../../built/_frontend_embed_vite_/manifest.json`, 'utf-8'))
: { 'src/boot.ts': { file: null } };
- const config = yaml.load(fs.readFileSync(path, 'utf-8')) as Source;
+ const config = JSON.parse(fs.readFileSync(compiledConfigFilePath, 'utf-8')) as Source;
const url = tryCreateUrl(config.url ?? process.env.MISSKEY_URL ?? '');
const version = meta.version;
diff --git a/packages/backend/src/core/AppLockService.ts b/packages/backend/src/core/AppLockService.ts
deleted file mode 100644
index bd2749cb87..0000000000
--- a/packages/backend/src/core/AppLockService.ts
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * SPDX-FileCopyrightText: syuilo and misskey-project
- * SPDX-License-Identifier: AGPL-3.0-only
- */
-
-import { promisify } from 'node:util';
-import { Inject, Injectable } from '@nestjs/common';
-import redisLock from 'redis-lock';
-import * as Redis from 'ioredis';
-import { DI } from '@/di-symbols.js';
-import { bindThis } from '@/decorators.js';
-
-/**
- * Retry delay (ms) for lock acquisition
- */
-const retryDelay = 100;
-
-@Injectable()
-export class AppLockService {
- private lock: (key: string, timeout?: number, _?: (() => Promise<void>) | undefined) => Promise<() => void>;
-
- constructor(
- @Inject(DI.redis)
- private redisClient: Redis.Redis,
- ) {
- this.lock = promisify(redisLock(this.redisClient, retryDelay));
- }
-
- /**
- * Get AP Object lock
- * @param uri AP object ID
- * @param timeout Lock timeout (ms), The timeout releases previous lock.
- * @returns Unlock function
- */
- @bindThis
- public getApLock(uri: string, timeout = 30 * 1000): Promise<() => void> {
- return this.lock(`ap-object:${uri}`, timeout);
- }
-
- @bindThis
- public getChartInsertLock(lockKey: string, timeout = 30 * 1000): Promise<() => void> {
- return this.lock(`chart-insert:${lockKey}`, timeout);
- }
-}
diff --git a/packages/backend/src/core/CoreModule.ts b/packages/backend/src/core/CoreModule.ts
index 8c8d22c77d..87575ca59a 100644
--- a/packages/backend/src/core/CoreModule.ts
+++ b/packages/backend/src/core/CoreModule.ts
@@ -21,7 +21,6 @@ import { AccountUpdateService } from './AccountUpdateService.js';
import { AiService } from './AiService.js';
import { AnnouncementService } from './AnnouncementService.js';
import { AntennaService } from './AntennaService.js';
-import { AppLockService } from './AppLockService.js';
import { AchievementService } from './AchievementService.js';
import { AvatarDecorationService } from './AvatarDecorationService.js';
import { CaptchaService } from './CaptchaService.js';
@@ -166,7 +165,6 @@ const $AccountUpdateService: Provider = { provide: 'AccountUpdateService', useEx
const $AiService: Provider = { provide: 'AiService', useExisting: AiService };
const $AnnouncementService: Provider = { provide: 'AnnouncementService', useExisting: AnnouncementService };
const $AntennaService: Provider = { provide: 'AntennaService', useExisting: AntennaService };
-const $AppLockService: Provider = { provide: 'AppLockService', useExisting: AppLockService };
const $AchievementService: Provider = { provide: 'AchievementService', useExisting: AchievementService };
const $AvatarDecorationService: Provider = { provide: 'AvatarDecorationService', useExisting: AvatarDecorationService };
const $CaptchaService: Provider = { provide: 'CaptchaService', useExisting: CaptchaService };
@@ -320,7 +318,6 @@ const $ApQuestionService: Provider = { provide: 'ApQuestionService', useExisting
AiService,
AnnouncementService,
AntennaService,
- AppLockService,
AchievementService,
AvatarDecorationService,
CaptchaService,
@@ -470,7 +467,6 @@ const $ApQuestionService: Provider = { provide: 'ApQuestionService', useExisting
$AiService,
$AnnouncementService,
$AntennaService,
- $AppLockService,
$AchievementService,
$AvatarDecorationService,
$CaptchaService,
@@ -621,7 +617,6 @@ const $ApQuestionService: Provider = { provide: 'ApQuestionService', useExisting
AiService,
AnnouncementService,
AntennaService,
- AppLockService,
AchievementService,
AvatarDecorationService,
CaptchaService,
@@ -770,7 +765,6 @@ const $ApQuestionService: Provider = { provide: 'ApQuestionService', useExisting
$AiService,
$AnnouncementService,
$AntennaService,
- $AppLockService,
$AchievementService,
$AvatarDecorationService,
$CaptchaService,
diff --git a/packages/backend/src/core/FetchInstanceMetadataService.ts b/packages/backend/src/core/FetchInstanceMetadataService.ts
index ce3af7c774..955f7035d7 100644
--- a/packages/backend/src/core/FetchInstanceMetadataService.ts
+++ b/packages/backend/src/core/FetchInstanceMetadataService.ts
@@ -5,9 +5,9 @@
import { URL } from 'node:url';
import { Inject, Injectable } from '@nestjs/common';
-import { JSDOM } from 'jsdom';
import tinycolor from 'tinycolor2';
import * as Redis from 'ioredis';
+import * as htmlParser from 'node-html-parser';
import type { MiInstance } from '@/models/Instance.js';
import type Logger from '@/logger.js';
import { DI } from '@/di-symbols.js';
@@ -15,7 +15,6 @@ import { LoggerService } from '@/core/LoggerService.js';
import { HttpRequestService } from '@/core/HttpRequestService.js';
import { bindThis } from '@/decorators.js';
import { FederatedInstanceService } from '@/core/FederatedInstanceService.js';
-import type { DOMWindow } from 'jsdom';
type NodeInfo = {
openRegistrations?: unknown;
@@ -59,7 +58,7 @@ export class FetchInstanceMetadataService {
return await this.redisClient.set(
`fetchInstanceMetadata:mutex:v2:${host}`, '1',
'EX', 30, // 30秒したら自動でロック解除 https://github.com/misskey-dev/misskey/issues/13506#issuecomment-1975375395
- 'GET' // 古い値を返す(なかったらnull)
+ 'GET', // 古い値を返す(なかったらnull)
);
}
@@ -181,15 +180,14 @@ export class FetchInstanceMetadataService {
}
@bindThis
- private async fetchDom(instance: MiInstance): Promise<Document> {
+ private async fetchDom(instance: MiInstance): Promise<htmlParser.HTMLElement> {
this.logger.info(`Fetching HTML of ${instance.host} ...`);
const url = 'https://' + instance.host;
const html = await this.httpRequestService.getHtml(url);
- const { window } = new JSDOM(html);
- const doc = window.document;
+ const doc = htmlParser.parse(html);
return doc;
}
@@ -206,12 +204,12 @@ export class FetchInstanceMetadataService {
}
@bindThis
- private async fetchFaviconUrl(instance: MiInstance, doc: Document | null): Promise<string | null> {
+ private async fetchFaviconUrl(instance: MiInstance, doc: htmlParser.HTMLElement | null): Promise<string | null> {
const url = 'https://' + instance.host;
if (doc) {
// https://github.com/misskey-dev/misskey/pull/8220#issuecomment-1025104043
- const href = Array.from(doc.getElementsByTagName('link')).reverse().find(link => link.relList.contains('icon'))?.href;
+ const href = Array.from(doc.getElementsByTagName('link')).reverse().find(link => link.attributes.rel === 'icon')?.attributes.href;
if (href) {
return (new URL(href, url)).href;
@@ -232,7 +230,7 @@ export class FetchInstanceMetadataService {
}
@bindThis
- private async fetchIconUrl(instance: MiInstance, doc: Document | null, manifest: Record<string, any> | null): Promise<string | null> {
+ private async fetchIconUrl(instance: MiInstance, doc: htmlParser.HTMLElement | null, manifest: Record<string, any> | null): Promise<string | null> {
if (manifest && manifest.icons && manifest.icons.length > 0 && manifest.icons[0].src) {
const url = 'https://' + instance.host;
return (new URL(manifest.icons[0].src, url)).href;
@@ -246,9 +244,9 @@ export class FetchInstanceMetadataService {
// https://github.com/misskey-dev/misskey/pull/8220/files/0ec4eba22a914e31b86874f12448f88b3e58dd5a#r796487559
const href =
[
- links.find(link => link.relList.contains('apple-touch-icon-precomposed'))?.href,
- links.find(link => link.relList.contains('apple-touch-icon'))?.href,
- links.find(link => link.relList.contains('icon'))?.href,
+ links.find(link => link.attributes.rel?.split(/\s+/).includes('apple-touch-icon-precomposed'))?.attributes.href,
+ links.find(link => link.attributes.rel?.split(/\s+/).includes('apple-touch-icon'))?.attributes.href,
+ links.find(link => link.attributes.rel?.split(/\s+/).includes('icon'))?.attributes.href,
]
.find(href => href);
@@ -261,7 +259,7 @@ export class FetchInstanceMetadataService {
}
@bindThis
- private async getThemeColor(info: NodeInfo | null, doc: Document | null, manifest: Record<string, any> | null): Promise<string | null> {
+ private async getThemeColor(info: NodeInfo | null, doc: htmlParser.HTMLElement | null, manifest: Record<string, any> | null): Promise<string | null> {
const themeColor = info?.metadata?.themeColor ?? doc?.querySelector('meta[name="theme-color"]')?.getAttribute('content') ?? manifest?.theme_color;
if (themeColor) {
@@ -273,7 +271,7 @@ export class FetchInstanceMetadataService {
}
@bindThis
- private async getSiteName(info: NodeInfo | null, doc: Document | null, manifest: Record<string, any> | null): Promise<string | null> {
+ private async getSiteName(info: NodeInfo | null, doc: htmlParser.HTMLElement | null, manifest: Record<string, any> | null): Promise<string | null> {
if (info && info.metadata) {
if (typeof info.metadata.nodeName === 'string') {
return info.metadata.nodeName;
@@ -298,7 +296,7 @@ export class FetchInstanceMetadataService {
}
@bindThis
- private async getDescription(info: NodeInfo | null, doc: Document | null, manifest: Record<string, any> | null): Promise<string | null> {
+ private async getDescription(info: NodeInfo | null, doc: htmlParser.HTMLElement | null, manifest: Record<string, any> | null): Promise<string | null> {
if (info && info.metadata) {
if (typeof info.metadata.nodeDescription === 'string') {
return info.metadata.nodeDescription;
diff --git a/packages/backend/src/core/MfmService.ts b/packages/backend/src/core/MfmService.ts
index 28d980f718..b9f1c62d9d 100644
--- a/packages/backend/src/core/MfmService.ts
+++ b/packages/backend/src/core/MfmService.ts
@@ -5,26 +5,19 @@
import { URL } from 'node:url';
import { Inject, Injectable } from '@nestjs/common';
-import * as parse5 from 'parse5';
-import { type Document, type HTMLParagraphElement, Window, XMLSerializer } from 'happy-dom';
+import * as htmlParser from 'node-html-parser';
import { DI } from '@/di-symbols.js';
import type { Config } from '@/config.js';
import { intersperse } from '@/misc/prelude/array.js';
import { normalizeForSearch } from '@/misc/normalize-for-search.js';
import type { IMentionedRemoteUsers } from '@/models/Note.js';
import { bindThis } from '@/decorators.js';
-import type { DefaultTreeAdapterMap } from 'parse5';
+import { escapeHtml } from '@/misc/escape-html.js';
import type * as mfm from 'mfm-js';
-const treeAdapter = parse5.defaultTreeAdapter;
-type Node = DefaultTreeAdapterMap['node'];
-type ChildNode = DefaultTreeAdapterMap['childNode'];
-
const urlRegex = /^https?:\/\/[\w\/:%#@$&?!()\[\]~.,=+\-]+/;
const urlRegexFull = /^https?:\/\/[\w\/:%#@$&?!()\[\]~.,=+\-]+$/;
-export type Appender = (document: Document, body: HTMLParagraphElement) => void;
-
@Injectable()
export class MfmService {
constructor(
@@ -40,68 +33,68 @@ export class MfmService {
const normalizedHashtagNames = hashtagNames == null ? undefined : new Set<string>(hashtagNames.map(x => normalizeForSearch(x)));
- const dom = parse5.parseFragment(html);
+ const doc = htmlParser.parse(`<div>${html}</div>`);
let text = '';
- for (const n of dom.childNodes) {
+ for (const n of doc.childNodes) {
analyze(n);
}
return text.trim();
- function getText(node: Node): string {
- if (treeAdapter.isTextNode(node)) return node.value;
- if (!treeAdapter.isElementNode(node)) return '';
- if (node.nodeName === 'br') return '\n';
+ function getText(node: htmlParser.Node): string {
+ if (node instanceof htmlParser.TextNode) return node.textContent;
+ if (!(node instanceof htmlParser.HTMLElement)) return '';
+ if (node.tagName === 'BR') return '\n';
- if (node.childNodes) {
+ if (node.childNodes != null) {
return node.childNodes.map(n => getText(n)).join('');
}
return '';
}
- function appendChildren(childNodes: ChildNode[]): void {
- if (childNodes) {
+ function analyzeChildren(childNodes: htmlParser.Node[] | null): void {
+ if (childNodes != null) {
for (const n of childNodes) {
analyze(n);
}
}
}
- function analyze(node: Node) {
- if (treeAdapter.isTextNode(node)) {
- text += node.value;
+ function analyze(node: htmlParser.Node) {
+ if (node instanceof htmlParser.TextNode) {
+ text += node.textContent;
return;
}
// Skip comment or document type node
- if (!treeAdapter.isElementNode(node)) {
+ if (!(node instanceof htmlParser.HTMLElement)) {
return;
}
- switch (node.nodeName) {
- case 'br': {
+ switch (node.tagName) {
+ case 'BR': {
text += '\n';
break;
}
- case 'a': {
+ case 'A': {
const txt = getText(node);
- const rel = node.attrs.find(x => x.name === 'rel');
- const href = node.attrs.find(x => x.name === 'href');
+ const rel = node.attributes.rel;
+ const href = node.attributes.href;
// ハッシュタグ
- if (normalizedHashtagNames && href && normalizedHashtagNames.has(normalizeForSearch(txt))) {
+ if (normalizedHashtagNames && href != null && normalizedHashtagNames.has(normalizeForSearch(txt))) {
text += txt;
// メンション
- } else if (txt.startsWith('@') && !(rel && rel.value.startsWith('me '))) {
+ } else if (txt.startsWith('@') && !(rel != null && rel.startsWith('me '))) {
const part = txt.split('@');
if (part.length === 2 && href) {
//#region ホスト名部分が省略されているので復元する
- const acct = `${txt}@${(new URL(href.value)).hostname}`;
+ const acct = `${txt}@${(new URL(href)).hostname}`;
text += acct;
//#endregion
} else if (part.length === 3) {
@@ -116,17 +109,17 @@ export class MfmService {
if (!href) {
return txt;
}
- if (!txt || txt === href.value) { // #6383: Missing text node
- if (href.value.match(urlRegexFull)) {
- return href.value;
+ if (!txt || txt === href) { // #6383: Missing text node
+ if (href.match(urlRegexFull)) {
+ return href;
} else {
- return `<${href.value}>`;
+ return `<${href}>`;
}
}
- if (href.value.match(urlRegex) && !href.value.match(urlRegexFull)) {
- return `[${txt}](<${href.value}>)`; // #6846
+ if (href.match(urlRegex) && !href.match(urlRegexFull)) {
+ return `[${txt}](<${href}>)`; // #6846
} else {
- return `[${txt}](${href.value})`;
+ return `[${txt}](${href})`;
}
};
@@ -135,60 +128,64 @@ export class MfmService {
break;
}
- case 'h1': {
+ case 'H1': {
text += '【';
- appendChildren(node.childNodes);
+ analyzeChildren(node.childNodes);
text += '】\n';
break;
}
- case 'b':
- case 'strong': {
+ case 'B':
+ case 'STRONG': {
text += '**';
- appendChildren(node.childNodes);
+ analyzeChildren(node.childNodes);
text += '**';
break;
}
- case 'small': {
+ case 'SMALL': {
text += '<small>';
- appendChildren(node.childNodes);
+ analyzeChildren(node.childNodes);
text += '</small>';
break;
}
- case 's':
- case 'del': {
+ case 'S':
+ case 'DEL': {
text += '~~';
- appendChildren(node.childNodes);
+ analyzeChildren(node.childNodes);
text += '~~';
break;
}
- case 'i':
- case 'em': {
+ case 'I':
+ case 'EM': {
text += '<i>';
- appendChildren(node.childNodes);
+ analyzeChildren(node.childNodes);
text += '</i>';
break;
}
- case 'ruby': {
+ case 'RUBY': {
let ruby: [string, string][] = [];
for (const child of node.childNodes) {
- if (child.nodeName === 'rp') {
+ if ((child instanceof htmlParser.TextNode) && !/\s|\[|\]/.test(child.textContent)) {
+ ruby.push([child.textContent, '']);
continue;
}
- if (treeAdapter.isTextNode(child) && !/\s|\[|\]/.test(child.value)) {
- ruby.push([child.value, '']);
+
+ if (!(child instanceof htmlParser.HTMLElement)) continue;
+
+ if (child.tagName === 'RP') {
continue;
}
- if (child.nodeName === 'rt' && ruby.length > 0) {
+
+ if (child.tagName === 'RT' && ruby.length > 0) {
const rt = getText(child);
if (/\s|\[|\]/.test(rt)) {
// If any space is included in rt, it is treated as a normal text
ruby = [];
- appendChildren(node.childNodes);
+ analyzeChildren(node.childNodes);
break;
} else {
ruby.at(-1)![1] = rt;
@@ -197,7 +194,7 @@ export class MfmService {
}
// If any other element is included in ruby, it is treated as a normal text
ruby = [];
- appendChildren(node.childNodes);
+ analyzeChildren(node.childNodes);
break;
}
for (const [base, rt] of ruby) {
@@ -207,26 +204,30 @@ export class MfmService {
}
// block code (<pre><code>)
- case 'pre': {
- if (node.childNodes.length === 1 && node.childNodes[0].nodeName === 'code') {
+ case 'PRE': {
+ if (node.childNodes.length === 1 && (node.childNodes[0] instanceof htmlParser.HTMLElement) && node.childNodes[0].tagName === 'CODE') {
text += '\n```\n';
text += getText(node.childNodes[0]);
text += '\n```\n';
+ } else if (node.childNodes.length === 1 && (node.childNodes[0] instanceof htmlParser.TextNode) && node.childNodes[0].textContent.startsWith('<code>') && node.childNodes[0].textContent.endsWith('</code>')) {
+ text += '\n```\n';
+ text += node.childNodes[0].textContent.slice(6, -7);
+ text += '\n```\n';
} else {
- appendChildren(node.childNodes);
+ analyzeChildren(node.childNodes);
}
break;
}
// inline code (<code>)
- case 'code': {
+ case 'CODE': {
text += '`';
- appendChildren(node.childNodes);
+ analyzeChildren(node.childNodes);
text += '`';
break;
}
- case 'blockquote': {
+ case 'BLOCKQUOTE': {
const t = getText(node);
if (t) {
text += '\n> ';
@@ -235,33 +236,33 @@ export class MfmService {
break;
}
- case 'p':
- case 'h2':
- case 'h3':
- case 'h4':
- case 'h5':
- case 'h6': {
+ case 'P':
+ case 'H2':
+ case 'H3':
+ case 'H4':
+ case 'H5':
+ case 'H6': {
text += '\n\n';
- appendChildren(node.childNodes);
+ analyzeChildren(node.childNodes);
break;
}
// other block elements
- case 'div':
- case 'header':
- case 'footer':
- case 'article':
- case 'li':
- case 'dt':
- case 'dd': {
+ case 'DIV':
+ case 'HEADER':
+ case 'FOOTER':
+ case 'ARTICLE':
+ case 'LI':
+ case 'DT':
+ case 'DD': {
text += '\n';
- appendChildren(node.childNodes);
+ analyzeChildren(node.childNodes);
break;
}
default: // includes inline elements
{
- appendChildren(node.childNodes);
+ analyzeChildren(node.childNodes);
break;
}
}
@@ -269,52 +270,35 @@ export class MfmService {
}
@bindThis
- public toHtml(nodes: mfm.MfmNode[] | null, mentionedRemoteUsers: IMentionedRemoteUsers = [], additionalAppenders: Appender[] = []) {
+ public toHtml(nodes: mfm.MfmNode[] | null, mentionedRemoteUsers: IMentionedRemoteUsers = [], extraHtml: string | null = null) {
if (nodes == null) {
return null;
}
- const { happyDOM, window } = new Window();
-
- const doc = window.document;
-
- const body = doc.createElement('p');
-
- function appendChildren(children: mfm.MfmNode[], targetElement: any): void {
- if (children) {
- for (const child of children.map(x => (handlers as any)[x.type](x))) targetElement.appendChild(child);
- }
+ function toHtml(children?: mfm.MfmNode[]): string {
+ if (children == null) return '';
+ return children.map(x => handlers[x.type](x)).join('');
}
function fnDefault(node: mfm.MfmFn) {
- const el = doc.createElement('i');
- appendChildren(node.children, el);
- return el;
+ return `<i>${toHtml(node.children)}</i>`;
}
- const handlers: { [K in mfm.MfmNode['type']]: (node: mfm.NodeType<K>) => any } = {
+ const handlers = {
bold: (node) => {
- const el = doc.createElement('b');
- appendChildren(node.children, el);
- return el;
+ return `<b>${toHtml(node.children)}</b>`;
},
small: (node) => {
- const el = doc.createElement('small');
- appendChildren(node.children, el);
- return el;
+ return `<small>${toHtml(node.children)}</small>`;
},
strike: (node) => {
- const el = doc.createElement('del');
- appendChildren(node.children, el);
- return el;
+ return `<del>${toHtml(node.children)}</del>`;
},
italic: (node) => {
- const el = doc.createElement('i');
- appendChildren(node.children, el);
- return el;
+ return `<i>${toHtml(node.children)}</i>`;
},
fn: (node) => {
@@ -323,10 +307,7 @@ export class MfmService {
const text = node.children[0].type === 'text' ? node.children[0].props.text : '';
try {
const date = new Date(parseInt(text, 10) * 1000);
- const el = doc.createElement('time');
- el.setAttribute('datetime', date.toISOString());
- el.textContent = date.toISOString();
- return el;
+ return `<time datetime="${escapeHtml(date.toISOString())}">${escapeHtml(date.toISOString())}</time>`;
} catch (err) {
return fnDefault(node);
}
@@ -336,21 +317,9 @@ export class MfmService {
if (node.children.length === 1) {
const child = node.children[0];
const text = child.type === 'text' ? child.props.text : '';
- const rubyEl = doc.createElement('ruby');
- const rtEl = doc.createElement('rt');
- // ruby未対応のHTMLサニタイザーを通したときにルビが「劉備(りゅうび)」となるようにする
- const rpStartEl = doc.createElement('rp');
- rpStartEl.appendChild(doc.createTextNode('('));
- const rpEndEl = doc.createElement('rp');
- rpEndEl.appendChild(doc.createTextNode(')'));
-
- rubyEl.appendChild(doc.createTextNode(text.split(' ')[0]));
- rtEl.appendChild(doc.createTextNode(text.split(' ')[1]));
- rubyEl.appendChild(rpStartEl);
- rubyEl.appendChild(rtEl);
- rubyEl.appendChild(rpEndEl);
- return rubyEl;
+ // ruby未対応のHTMLサニタイザーを通したときにルビが「対象テキスト(ルビテキスト)」にフォールバックするようにする
+ return `<ruby>${escapeHtml(text.split(' ')[0])}<rp>(</rp><rt>${escapeHtml(text.split(' ')[1])}</rt><rp>)</rp></ruby>`;
} else {
const rt = node.children.at(-1);
@@ -359,21 +328,9 @@ export class MfmService {
}
const text = rt.type === 'text' ? rt.props.text : '';
- const rubyEl = doc.createElement('ruby');
- const rtEl = doc.createElement('rt');
-
- // ruby未対応のHTMLサニタイザーを通したときにルビが「劉備(りゅうび)」となるようにする
- const rpStartEl = doc.createElement('rp');
- rpStartEl.appendChild(doc.createTextNode('('));
- const rpEndEl = doc.createElement('rp');
- rpEndEl.appendChild(doc.createTextNode(')'));
- appendChildren(node.children.slice(0, node.children.length - 1), rubyEl);
- rtEl.appendChild(doc.createTextNode(text.trim()));
- rubyEl.appendChild(rpStartEl);
- rubyEl.appendChild(rtEl);
- rubyEl.appendChild(rpEndEl);
- return rubyEl;
+ // ruby未対応のHTMLサニタイザーを通したときにルビが「対象テキスト(ルビテキスト)」にフォールバックするようにする
+ return `<ruby>${toHtml(node.children.slice(0, node.children.length - 1))}<rp>(</rp><rt>${escapeHtml(text.trim())}</rt><rp>)</rp></ruby>`;
}
}
@@ -384,125 +341,98 @@ export class MfmService {
},
blockCode: (node) => {
- const pre = doc.createElement('pre');
- const inner = doc.createElement('code');
- inner.textContent = node.props.code;
- pre.appendChild(inner);
- return pre;
+ return `<pre><code>${escapeHtml(node.props.code)}</code></pre>`;
},
center: (node) => {
- const el = doc.createElement('div');
- appendChildren(node.children, el);
- return el;
+ return `<div style="text-align: center;">${toHtml(node.children)}</div>`;
},
emojiCode: (node) => {
- return doc.createTextNode(`\u200B:${node.props.name}:\u200B`);
+ return `\u200B:${escapeHtml(node.props.name)}:\u200B`;
},
unicodeEmoji: (node) => {
- return doc.createTextNode(node.props.emoji);
+ return node.props.emoji;
},
hashtag: (node) => {
- const a = doc.createElement('a');
- a.setAttribute('href', `${this.config.url}/tags/${node.props.hashtag}`);
- a.textContent = `#${node.props.hashtag}`;
- a.setAttribute('rel', 'tag');
- return a;
+ return `<a href="${escapeHtml(`${this.config.url}/tags/${encodeURIComponent(node.props.hashtag)}`)}" rel="tag">#${escapeHtml(node.props.hashtag)}</a>`;
},
inlineCode: (node) => {
- const el = doc.createElement('code');
- el.textContent = node.props.code;
- return el;
+ return `<code>${escapeHtml(node.props.code)}</code>`;
},
mathInline: (node) => {
- const el = doc.createElement('code');
- el.textContent = node.props.formula;
- return el;
+ return `<code>${escapeHtml(node.props.formula)}</code>`;
},
mathBlock: (node) => {
- const el = doc.createElement('code');
- el.textContent = node.props.formula;
- return el;
+ return `<pre><code>${escapeHtml(node.props.formula)}</code></pre>`;
},
link: (node) => {
- const a = doc.createElement('a');
- a.setAttribute('href', node.props.url);
- appendChildren(node.children, a);
- return a;
+ try {
+ const url = new URL(node.props.url);
+ return `<a href="${escapeHtml(url.href)}">${toHtml(node.children)}</a>`;
+ } catch (err) {
+ return `[${toHtml(node.children)}](${escapeHtml(node.props.url)})`;
+ }
},
mention: (node) => {
- const a = doc.createElement('a');
const { username, host, acct } = node.props;
const remoteUserInfo = mentionedRemoteUsers.find(remoteUser => remoteUser.username.toLowerCase() === username.toLowerCase() && remoteUser.host?.toLowerCase() === host?.toLowerCase());
- a.setAttribute('href', remoteUserInfo
+ const href = remoteUserInfo
? (remoteUserInfo.url ? remoteUserInfo.url : remoteUserInfo.uri)
- : `${this.config.url}/${acct.endsWith(`@${this.config.url}`) ? acct.substring(0, acct.length - this.config.url.length - 1) : acct}`);
- a.className = 'u-url mention';
- a.textContent = acct;
- return a;
+ : `${this.config.url}/${acct.endsWith(`@${this.config.url}`) ? acct.substring(0, acct.length - this.config.url.length - 1) : acct}`;
+ try {
+ const url = new URL(href);
+ return `<a href="${escapeHtml(url.href)}" class="u-url mention">${escapeHtml(acct)}</a>`;
+ } catch (err) {
+ return escapeHtml(acct);
+ }
},
quote: (node) => {
- const el = doc.createElement('blockquote');
- appendChildren(node.children, el);
- return el;
+ return `<blockquote>${toHtml(node.children)}</blockquote>`;
},
text: (node) => {
if (!node.props.text.match(/[\r\n]/)) {
- return doc.createTextNode(node.props.text);
+ return escapeHtml(node.props.text);
}
- const el = doc.createElement('span');
- const nodes = node.props.text.split(/\r\n|\r|\n/).map(x => doc.createTextNode(x));
+ let html = '';
+
+ const lines = node.props.text.split(/\r\n|\r|\n/).map(x => escapeHtml(x));
- for (const x of intersperse<FIXME | 'br'>('br', nodes)) {
- el.appendChild(x === 'br' ? doc.createElement('br') : x);
+ for (const x of intersperse<FIXME | 'br'>('br', lines)) {
+ html += x === 'br' ? '<br />' : x;
}
- return el;
+ return html;
},
url: (node) => {
- const a = doc.createElement('a');
- a.setAttribute('href', node.props.url);
- a.textContent = node.props.url;
- return a;
+ try {
+ const url = new URL(node.props.url);
+ return `<a href="${escapeHtml(url.href)}">${escapeHtml(node.props.url)}</a>`;
+ } catch (err) {
+ return escapeHtml(node.props.url);
+ }
},
search: (node) => {
- const a = doc.createElement('a');
- a.setAttribute('href', `https://www.google.com/search?q=${node.props.query}`);
- a.textContent = node.props.content;
- return a;
+ return `<a href="${escapeHtml(`https://www.google.com/search?q=${encodeURIComponent(node.props.query)}`)}">${escapeHtml(node.props.content)}</a>`;
},
plain: (node) => {
- const el = doc.createElement('span');
- appendChildren(node.children, el);
- return el;
+ return `<span>${toHtml(node.children)}</span>`;
},
- };
-
- appendChildren(nodes, body);
-
- for (const additionalAppender of additionalAppenders) {
- additionalAppender(doc, body);
- }
-
- // Remove the unnecessary namespace
- const serialized = new XMLSerializer().serializeToString(body).replace(/^\s*<p xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">/, '<p>');
-
- happyDOM.close().catch(err => {});
+ } satisfies { [K in mfm.MfmNode['type']]: (node: mfm.NodeType<K>) => string } as { [K in mfm.MfmNode['type']]: (node: mfm.MfmNode) => string };
- return serialized;
+ return `${toHtml(nodes)}${extraHtml ?? ''}`;
}
}
diff --git a/packages/backend/src/core/NotificationService.ts b/packages/backend/src/core/NotificationService.ts
index eeade4569b..310ffec7ce 100644
--- a/packages/backend/src/core/NotificationService.ts
+++ b/packages/backend/src/core/NotificationService.ts
@@ -202,7 +202,7 @@ export class NotificationService implements OnApplicationShutdown {
}
// TODO
- //const locales = await import('../../../../locales/index.js');
+ //const locales = await import('i18n');
// TODO: locale ファイルをクライアント用とサーバー用で分けたい
@@ -271,7 +271,7 @@ export class NotificationService implements OnApplicationShutdown {
let untilTime = untilId ? this.toXListId(untilId) : null;
let notifications: MiNotification[];
- for (;;) {
+ for (; ;) {
let notificationsRes: [id: string, fields: string[]][];
// sinceidのみの場合は古い順、そうでない場合は新しい順。 QueryService.makePaginationQueryも参照
diff --git a/packages/backend/src/core/WebAuthnService.ts b/packages/backend/src/core/WebAuthnService.ts
index 372e1e2ab7..31c8d67c60 100644
--- a/packages/backend/src/core/WebAuthnService.ts
+++ b/packages/backend/src/core/WebAuthnService.ts
@@ -66,7 +66,6 @@ export class WebAuthnService {
userID: isoUint8Array.fromUTF8String(userId),
userName: userName,
userDisplayName: userDisplayName,
- attestationType: 'indirect',
excludeCredentials: keys.map(key => (<{ id: string; transports?: AuthenticatorTransportFuture[]; }>{
id: key.id,
transports: key.transports ?? undefined,
diff --git a/packages/backend/src/core/activitypub/ApInboxService.ts b/packages/backend/src/core/activitypub/ApInboxService.ts
index e88f60b806..81637580e3 100644
--- a/packages/backend/src/core/activitypub/ApInboxService.ts
+++ b/packages/backend/src/core/activitypub/ApInboxService.ts
@@ -5,6 +5,7 @@
import { Inject, Injectable } from '@nestjs/common';
import { In } from 'typeorm';
+import * as Redis from 'ioredis';
import { DI } from '@/di-symbols.js';
import type { Config } from '@/config.js';
import { UserFollowingService } from '@/core/UserFollowingService.js';
@@ -14,8 +15,8 @@ import { NotePiningService } from '@/core/NotePiningService.js';
import { UserBlockingService } from '@/core/UserBlockingService.js';
import { NoteDeleteService } from '@/core/NoteDeleteService.js';
import { NoteCreateService } from '@/core/NoteCreateService.js';
+import { acquireApObjectLock } from '@/misc/distributed-lock.js';
import { concat, toArray, toSingle, unique } from '@/misc/prelude/array.js';
-import { AppLockService } from '@/core/AppLockService.js';
import type Logger from '@/logger.js';
import { IdService } from '@/core/IdService.js';
import { StatusError } from '@/misc/status-error.js';
@@ -48,8 +49,8 @@ export class ApInboxService {
@Inject(DI.config)
private config: Config,
- @Inject(DI.meta)
- private meta: MiMeta,
+ @Inject(DI.redis)
+ private redisClient: Redis.Redis,
@Inject(DI.usersRepository)
private usersRepository: UsersRepository,
@@ -76,7 +77,6 @@ export class ApInboxService {
private userBlockingService: UserBlockingService,
private noteCreateService: NoteCreateService,
private noteDeleteService: NoteDeleteService,
- private appLockService: AppLockService,
private apResolverService: ApResolverService,
private apDbResolverService: ApDbResolverService,
private apLoggerService: ApLoggerService,
@@ -311,7 +311,7 @@ export class ApInboxService {
// アナウンス先が許可されているかチェック
if (!this.utilityService.isFederationAllowedUri(uri)) return;
- const unlock = await this.appLockService.getApLock(uri);
+ const unlock = await acquireApObjectLock(this.redisClient, uri);
try {
// 既に同じURIを持つものが登録されていないかチェック
@@ -438,7 +438,7 @@ export class ApInboxService {
}
}
- const unlock = await this.appLockService.getApLock(uri);
+ const unlock = await acquireApObjectLock(this.redisClient, uri);
try {
const exist = await this.apNoteService.fetchNote(note);
@@ -522,7 +522,7 @@ export class ApInboxService {
private async deleteNote(actor: MiRemoteUser, uri: string): Promise<string> {
this.logger.info(`Deleting the Note: ${uri}`);
- const unlock = await this.appLockService.getApLock(uri);
+ const unlock = await acquireApObjectLock(this.redisClient, uri);
try {
const note = await this.apDbResolverService.getNoteFromApId(uri);
diff --git a/packages/backend/src/core/activitypub/ApMfmService.ts b/packages/backend/src/core/activitypub/ApMfmService.ts
index f4c07e472c..a928ed5ccf 100644
--- a/packages/backend/src/core/activitypub/ApMfmService.ts
+++ b/packages/backend/src/core/activitypub/ApMfmService.ts
@@ -5,7 +5,7 @@
import { Injectable } from '@nestjs/common';
import * as mfm from 'mfm-js';
-import { MfmService, Appender } from '@/core/MfmService.js';
+import { MfmService } from '@/core/MfmService.js';
import type { MiNote } from '@/models/Note.js';
import { bindThis } from '@/decorators.js';
import { extractApHashtagObjects } from './models/tag.js';
@@ -25,17 +25,17 @@ export class ApMfmService {
}
@bindThis
- public getNoteHtml(note: Pick<MiNote, 'text' | 'mentionedRemoteUsers'>, additionalAppender: Appender[] = []) {
+ public getNoteHtml(note: Pick<MiNote, 'text' | 'mentionedRemoteUsers'>, extraHtml: string | null = null) {
let noMisskeyContent = false;
const srcMfm = (note.text ?? '');
const parsed = mfm.parse(srcMfm);
- if (!additionalAppender.length && parsed.every(n => ['text', 'unicodeEmoji', 'emojiCode', 'mention', 'hashtag', 'url'].includes(n.type))) {
+ if (extraHtml == null && parsed.every(n => ['text', 'unicodeEmoji', 'emojiCode', 'mention', 'hashtag', 'url'].includes(n.type))) {
noMisskeyContent = true;
}
- const content = this.mfmService.toHtml(parsed, JSON.parse(note.mentionedRemoteUsers), additionalAppender);
+ const content = this.mfmService.toHtml(parsed, JSON.parse(note.mentionedRemoteUsers), extraHtml);
return {
content,
diff --git a/packages/backend/src/core/activitypub/ApRendererService.ts b/packages/backend/src/core/activitypub/ApRendererService.ts
index 55521d6e3a..4570977c5d 100644
--- a/packages/backend/src/core/activitypub/ApRendererService.ts
+++ b/packages/backend/src/core/activitypub/ApRendererService.ts
@@ -19,7 +19,7 @@ import type { MiEmoji } from '@/models/Emoji.js';
import type { MiPoll } from '@/models/Poll.js';
import type { MiPollVote } from '@/models/PollVote.js';
import { UserKeypairService } from '@/core/UserKeypairService.js';
-import { MfmService, type Appender } from '@/core/MfmService.js';
+import { MfmService } from '@/core/MfmService.js';
import { UserEntityService } from '@/core/entities/UserEntityService.js';
import { DriveFileEntityService } from '@/core/entities/DriveFileEntityService.js';
import type { MiUserKeypair } from '@/models/UserKeypair.js';
@@ -28,6 +28,7 @@ import { bindThis } from '@/decorators.js';
import { CustomEmojiService } from '@/core/CustomEmojiService.js';
import { IdService } from '@/core/IdService.js';
import { UtilityService } from '@/core/UtilityService.js';
+import { escapeHtml } from '@/misc/escape-html.js';
import { JsonLdService } from './JsonLdService.js';
import { ApMfmService } from './ApMfmService.js';
import { CONTEXT } from './misc/contexts.js';
@@ -384,7 +385,7 @@ export class ApRendererService {
inReplyTo = null;
}
- let quote;
+ let quote: string | undefined;
if (note.renoteId) {
const renote = await this.notesRepository.findOneBy({ id: note.renoteId });
@@ -430,29 +431,18 @@ export class ApRendererService {
poll = await this.pollsRepository.findOneBy({ noteId: note.id });
}
- const apAppend: Appender[] = [];
+ let extraHtml: string | null = null;
- if (quote) {
+ if (quote != null) {
// Append quote link as `<br><br><span class="quote-inline">RE: <a href="...">...</a></span>`
- // the claas name `quote-inline` is used in non-misskey clients for styling quote notes.
+ // the class name `quote-inline` is used in non-misskey clients for styling quote notes.
// For compatibility, the span part should be kept as possible.
- apAppend.push((doc, body) => {
- body.appendChild(doc.createElement('br'));
- body.appendChild(doc.createElement('br'));
- const span = doc.createElement('span');
- span.className = 'quote-inline';
- span.appendChild(doc.createTextNode('RE: '));
- const link = doc.createElement('a');
- link.setAttribute('href', quote);
- link.textContent = quote;
- span.appendChild(link);
- body.appendChild(span);
- });
+ extraHtml = `<br><br><span class="quote-inline">RE: <a href="${escapeHtml(quote)}">${escapeHtml(quote)}</a></span>`;
}
const summary = note.cw === '' ? String.fromCharCode(0x200B) : note.cw;
- const { content, noMisskeyContent } = this.apMfmService.getNoteHtml(note, apAppend);
+ const { content, noMisskeyContent } = this.apMfmService.getNoteHtml(note, extraHtml);
const emojis = await this.getEmojis(note.emojis);
const apemojis = emojis.filter(emoji => !emoji.localOnly).map(emoji => this.renderEmoji(emoji));
diff --git a/packages/backend/src/core/activitypub/ApRequestService.ts b/packages/backend/src/core/activitypub/ApRequestService.ts
index 61d328ccac..49298a1d22 100644
--- a/packages/backend/src/core/activitypub/ApRequestService.ts
+++ b/packages/backend/src/core/activitypub/ApRequestService.ts
@@ -6,7 +6,7 @@
import * as crypto from 'node:crypto';
import { URL } from 'node:url';
import { Inject, Injectable } from '@nestjs/common';
-import { Window } from 'happy-dom';
+import * as htmlParser from 'node-html-parser';
import { DI } from '@/di-symbols.js';
import type { Config } from '@/config.js';
import type { MiUser } from '@/models/User.js';
@@ -215,29 +215,9 @@ export class ApRequestService {
_followAlternate === true
) {
const html = await res.text();
- const { window, happyDOM } = new Window({
- settings: {
- disableJavaScriptEvaluation: true,
- disableJavaScriptFileLoading: true,
- disableCSSFileLoading: true,
- disableComputedStyleRendering: true,
- handleDisabledFileLoadingAsSuccess: true,
- navigation: {
- disableMainFrameNavigation: true,
- disableChildFrameNavigation: true,
- disableChildPageNavigation: true,
- disableFallbackToSetURL: true,
- },
- timer: {
- maxTimeout: 0,
- maxIntervalTime: 0,
- maxIntervalIterations: 0,
- },
- },
- });
- const document = window.document;
+
try {
- document.documentElement.innerHTML = html;
+ const document = htmlParser.parse(html);
const alternate = document.querySelector('head > link[rel="alternate"][type="application/activity+json"]');
if (alternate) {
@@ -248,8 +228,6 @@ export class ApRequestService {
}
} catch (e) {
// something went wrong parsing the HTML, ignore the whole thing
- } finally {
- happyDOM.close().catch(err => {});
}
}
//#endregion
diff --git a/packages/backend/src/core/activitypub/models/ApNoteService.ts b/packages/backend/src/core/activitypub/models/ApNoteService.ts
index 8abacd293f..214d32f67f 100644
--- a/packages/backend/src/core/activitypub/models/ApNoteService.ts
+++ b/packages/backend/src/core/activitypub/models/ApNoteService.ts
@@ -5,14 +5,15 @@
import { forwardRef, Inject, Injectable } from '@nestjs/common';
import { In } from 'typeorm';
+import * as Redis from 'ioredis';
import { DI } from '@/di-symbols.js';
import type { PollsRepository, EmojisRepository, MiMeta } from '@/models/_.js';
import type { Config } from '@/config.js';
import type { MiRemoteUser } from '@/models/User.js';
import type { MiNote } from '@/models/Note.js';
+import { acquireApObjectLock } from '@/misc/distributed-lock.js';
import { toArray, toSingle, unique } from '@/misc/prelude/array.js';
import type { MiEmoji } from '@/models/Emoji.js';
-import { AppLockService } from '@/core/AppLockService.js';
import type { MiDriveFile } from '@/models/DriveFile.js';
import { NoteCreateService } from '@/core/NoteCreateService.js';
import type Logger from '@/logger.js';
@@ -48,6 +49,9 @@ export class ApNoteService {
@Inject(DI.meta)
private meta: MiMeta,
+ @Inject(DI.redis)
+ private redisClient: Redis.Redis,
+
@Inject(DI.pollsRepository)
private pollsRepository: PollsRepository,
@@ -67,7 +71,6 @@ export class ApNoteService {
private apMentionService: ApMentionService,
private apImageService: ApImageService,
private apQuestionService: ApQuestionService,
- private appLockService: AppLockService,
private pollService: PollService,
private noteCreateService: NoteCreateService,
private apDbResolverService: ApDbResolverService,
@@ -354,7 +357,7 @@ export class ApNoteService {
throw new StatusError('blocked host', 451);
}
- const unlock = await this.appLockService.getApLock(uri);
+ const unlock = await acquireApObjectLock(this.redisClient, uri);
try {
//#region このサーバーに既に登録されていたらそれを返す
diff --git a/packages/backend/src/core/chart/charts/active-users.ts b/packages/backend/src/core/chart/charts/active-users.ts
index 05905f3782..7b9840af87 100644
--- a/packages/backend/src/core/chart/charts/active-users.ts
+++ b/packages/backend/src/core/chart/charts/active-users.ts
@@ -5,11 +5,12 @@
import { Injectable, Inject } from '@nestjs/common';
import { DataSource } from 'typeorm';
-import { AppLockService } from '@/core/AppLockService.js';
+import * as Redis from 'ioredis';
import type { MiUser } from '@/models/User.js';
import { DI } from '@/di-symbols.js';
import { bindThis } from '@/decorators.js';
import { IdService } from '@/core/IdService.js';
+import { acquireChartInsertLock } from '@/misc/distributed-lock.js';
import Chart from '../core.js';
import { ChartLoggerService } from '../ChartLoggerService.js';
import { name, schema } from './entities/active-users.js';
@@ -28,11 +29,13 @@ export default class ActiveUsersChart extends Chart<typeof schema> { // eslint-d
@Inject(DI.db)
private db: DataSource,
- private appLockService: AppLockService,
+ @Inject(DI.redis)
+ private redisClient: Redis.Redis,
+
private chartLoggerService: ChartLoggerService,
private idService: IdService,
) {
- super(db, (k) => appLockService.getChartInsertLock(k), chartLoggerService.logger, name, schema);
+ super(db, (k) => acquireChartInsertLock(redisClient, k), chartLoggerService.logger, name, schema);
}
protected async tickMajor(): Promise<Partial<KVs<typeof schema>>> {
diff --git a/packages/backend/src/core/chart/charts/ap-request.ts b/packages/backend/src/core/chart/charts/ap-request.ts
index 04e771a95b..ed790de7b5 100644
--- a/packages/backend/src/core/chart/charts/ap-request.ts
+++ b/packages/backend/src/core/chart/charts/ap-request.ts
@@ -5,9 +5,10 @@
import { Injectable, Inject } from '@nestjs/common';
import { DataSource } from 'typeorm';
-import { AppLockService } from '@/core/AppLockService.js';
+import * as Redis from 'ioredis';
import { DI } from '@/di-symbols.js';
import { bindThis } from '@/decorators.js';
+import { acquireChartInsertLock } from '@/misc/distributed-lock.js';
import Chart from '../core.js';
import { ChartLoggerService } from '../ChartLoggerService.js';
import { name, schema } from './entities/ap-request.js';
@@ -22,10 +23,12 @@ export default class ApRequestChart extends Chart<typeof schema> { // eslint-dis
@Inject(DI.db)
private db: DataSource,
- private appLockService: AppLockService,
+ @Inject(DI.redis)
+ private redisClient: Redis.Redis,
+
private chartLoggerService: ChartLoggerService,
) {
- super(db, (k) => appLockService.getChartInsertLock(k), chartLoggerService.logger, name, schema);
+ super(db, (k) => acquireChartInsertLock(redisClient, k), chartLoggerService.logger, name, schema);
}
protected async tickMajor(): Promise<Partial<KVs<typeof schema>>> {
diff --git a/packages/backend/src/core/chart/charts/drive.ts b/packages/backend/src/core/chart/charts/drive.ts
index 613e074a9f..782873809a 100644
--- a/packages/backend/src/core/chart/charts/drive.ts
+++ b/packages/backend/src/core/chart/charts/drive.ts
@@ -5,10 +5,11 @@
import { Injectable, Inject } from '@nestjs/common';
import { DataSource } from 'typeorm';
+import * as Redis from 'ioredis';
import type { MiDriveFile } from '@/models/DriveFile.js';
-import { AppLockService } from '@/core/AppLockService.js';
import { DI } from '@/di-symbols.js';
import { bindThis } from '@/decorators.js';
+import { acquireChartInsertLock } from '@/misc/distributed-lock.js';
import Chart from '../core.js';
import { ChartLoggerService } from '../ChartLoggerService.js';
import { name, schema } from './entities/drive.js';
@@ -23,10 +24,12 @@ export default class DriveChart extends Chart<typeof schema> { // eslint-disable
@Inject(DI.db)
private db: DataSource,
- private appLockService: AppLockService,
+ @Inject(DI.redis)
+ private redisClient: Redis.Redis,
+
private chartLoggerService: ChartLoggerService,
) {
- super(db, (k) => appLockService.getChartInsertLock(k), chartLoggerService.logger, name, schema);
+ super(db, (k) => acquireChartInsertLock(redisClient, k), chartLoggerService.logger, name, schema);
}
protected async tickMajor(): Promise<Partial<KVs<typeof schema>>> {
diff --git a/packages/backend/src/core/chart/charts/federation.ts b/packages/backend/src/core/chart/charts/federation.ts
index c9b43cc66d..b7a7f640b8 100644
--- a/packages/backend/src/core/chart/charts/federation.ts
+++ b/packages/backend/src/core/chart/charts/federation.ts
@@ -5,10 +5,11 @@
import { Injectable, Inject } from '@nestjs/common';
import { DataSource } from 'typeorm';
+import * as Redis from 'ioredis';
import type { FollowingsRepository, InstancesRepository, MiMeta } from '@/models/_.js';
-import { AppLockService } from '@/core/AppLockService.js';
import { DI } from '@/di-symbols.js';
import { bindThis } from '@/decorators.js';
+import { acquireChartInsertLock } from '@/misc/distributed-lock.js';
import Chart from '../core.js';
import { ChartLoggerService } from '../ChartLoggerService.js';
import { name, schema } from './entities/federation.js';
@@ -26,16 +27,18 @@ export default class FederationChart extends Chart<typeof schema> { // eslint-di
@Inject(DI.meta)
private meta: MiMeta,
+ @Inject(DI.redis)
+ private redisClient: Redis.Redis,
+
@Inject(DI.followingsRepository)
private followingsRepository: FollowingsRepository,
@Inject(DI.instancesRepository)
private instancesRepository: InstancesRepository,
- private appLockService: AppLockService,
private chartLoggerService: ChartLoggerService,
) {
- super(db, (k) => appLockService.getChartInsertLock(k), chartLoggerService.logger, name, schema);
+ super(db, (k) => acquireChartInsertLock(redisClient, k), chartLoggerService.logger, name, schema);
}
protected async tickMajor(): Promise<Partial<KVs<typeof schema>>> {
diff --git a/packages/backend/src/core/chart/charts/instance.ts b/packages/backend/src/core/chart/charts/instance.ts
index 97f3bc6f2b..b1657e0a0b 100644
--- a/packages/backend/src/core/chart/charts/instance.ts
+++ b/packages/backend/src/core/chart/charts/instance.ts
@@ -5,13 +5,14 @@
import { Injectable, Inject } from '@nestjs/common';
import { DataSource } from 'typeorm';
+import * as Redis from 'ioredis';
import type { DriveFilesRepository, FollowingsRepository, UsersRepository, NotesRepository } from '@/models/_.js';
import type { MiDriveFile } from '@/models/DriveFile.js';
import type { MiNote } from '@/models/Note.js';
-import { AppLockService } from '@/core/AppLockService.js';
import { DI } from '@/di-symbols.js';
import { UtilityService } from '@/core/UtilityService.js';
import { bindThis } from '@/decorators.js';
+import { acquireChartInsertLock } from '@/misc/distributed-lock.js';
import Chart from '../core.js';
import { ChartLoggerService } from '../ChartLoggerService.js';
import { name, schema } from './entities/instance.js';
@@ -26,6 +27,9 @@ export default class InstanceChart extends Chart<typeof schema> { // eslint-disa
@Inject(DI.db)
private db: DataSource,
+ @Inject(DI.redis)
+ private redisClient: Redis.Redis,
+
@Inject(DI.usersRepository)
private usersRepository: UsersRepository,
@@ -39,10 +43,9 @@ export default class InstanceChart extends Chart<typeof schema> { // eslint-disa
private followingsRepository: FollowingsRepository,
private utilityService: UtilityService,
- private appLockService: AppLockService,
private chartLoggerService: ChartLoggerService,
) {
- super(db, (k) => appLockService.getChartInsertLock(k), chartLoggerService.logger, name, schema, true);
+ super(db, (k) => acquireChartInsertLock(redisClient, k), chartLoggerService.logger, name, schema, true);
}
protected async tickMajor(group: string): Promise<Partial<KVs<typeof schema>>> {
diff --git a/packages/backend/src/core/chart/charts/notes.ts b/packages/backend/src/core/chart/charts/notes.ts
index f763b5fffa..aa64e2329a 100644
--- a/packages/backend/src/core/chart/charts/notes.ts
+++ b/packages/backend/src/core/chart/charts/notes.ts
@@ -5,11 +5,12 @@
import { Injectable, Inject } from '@nestjs/common';
import { Not, IsNull, DataSource } from 'typeorm';
+import * as Redis from 'ioredis';
import type { NotesRepository } from '@/models/_.js';
import type { MiNote } from '@/models/Note.js';
-import { AppLockService } from '@/core/AppLockService.js';
import { DI } from '@/di-symbols.js';
import { bindThis } from '@/decorators.js';
+import { acquireChartInsertLock } from '@/misc/distributed-lock.js';
import Chart from '../core.js';
import { ChartLoggerService } from '../ChartLoggerService.js';
import { name, schema } from './entities/notes.js';
@@ -24,13 +25,15 @@ export default class NotesChart extends Chart<typeof schema> { // eslint-disable
@Inject(DI.db)
private db: DataSource,
+ @Inject(DI.redis)
+ private redisClient: Redis.Redis,
+
@Inject(DI.notesRepository)
private notesRepository: NotesRepository,
- private appLockService: AppLockService,
private chartLoggerService: ChartLoggerService,
) {
- super(db, (k) => appLockService.getChartInsertLock(k), chartLoggerService.logger, name, schema);
+ super(db, (k) => acquireChartInsertLock(redisClient, k), chartLoggerService.logger, name, schema);
}
protected async tickMajor(): Promise<Partial<KVs<typeof schema>>> {
diff --git a/packages/backend/src/core/chart/charts/per-user-drive.ts b/packages/backend/src/core/chart/charts/per-user-drive.ts
index 404964d8b7..f7e92aecea 100644
--- a/packages/backend/src/core/chart/charts/per-user-drive.ts
+++ b/packages/backend/src/core/chart/charts/per-user-drive.ts
@@ -5,12 +5,13 @@
import { Injectable, Inject } from '@nestjs/common';
import { DataSource } from 'typeorm';
+import * as Redis from 'ioredis';
import type { DriveFilesRepository } from '@/models/_.js';
import type { MiDriveFile } from '@/models/DriveFile.js';
-import { AppLockService } from '@/core/AppLockService.js';
import { DI } from '@/di-symbols.js';
import { DriveFileEntityService } from '@/core/entities/DriveFileEntityService.js';
import { bindThis } from '@/decorators.js';
+import { acquireChartInsertLock } from '@/misc/distributed-lock.js';
import Chart from '../core.js';
import { ChartLoggerService } from '../ChartLoggerService.js';
import { name, schema } from './entities/per-user-drive.js';
@@ -25,14 +26,16 @@ export default class PerUserDriveChart extends Chart<typeof schema> { // eslint-
@Inject(DI.db)
private db: DataSource,
+ @Inject(DI.redis)
+ private redisClient: Redis.Redis,
+
@Inject(DI.driveFilesRepository)
private driveFilesRepository: DriveFilesRepository,
- private appLockService: AppLockService,
private driveFileEntityService: DriveFileEntityService,
private chartLoggerService: ChartLoggerService,
) {
- super(db, (k) => appLockService.getChartInsertLock(k), chartLoggerService.logger, name, schema, true);
+ super(db, (k) => acquireChartInsertLock(redisClient, k), chartLoggerService.logger, name, schema, true);
}
protected async tickMajor(group: string): Promise<Partial<KVs<typeof schema>>> {
diff --git a/packages/backend/src/core/chart/charts/per-user-following.ts b/packages/backend/src/core/chart/charts/per-user-following.ts
index 588ac638de..ea431a5131 100644
--- a/packages/backend/src/core/chart/charts/per-user-following.ts
+++ b/packages/backend/src/core/chart/charts/per-user-following.ts
@@ -5,12 +5,13 @@
import { Injectable, Inject } from '@nestjs/common';
import { Not, IsNull, DataSource } from 'typeorm';
+import * as Redis from 'ioredis';
import type { MiUser } from '@/models/User.js';
-import { AppLockService } from '@/core/AppLockService.js';
import { DI } from '@/di-symbols.js';
import { UserEntityService } from '@/core/entities/UserEntityService.js';
import type { FollowingsRepository } from '@/models/_.js';
import { bindThis } from '@/decorators.js';
+import { acquireChartInsertLock } from '@/misc/distributed-lock.js';
import Chart from '../core.js';
import { ChartLoggerService } from '../ChartLoggerService.js';
import { name, schema } from './entities/per-user-following.js';
@@ -25,14 +26,16 @@ export default class PerUserFollowingChart extends Chart<typeof schema> { // esl
@Inject(DI.db)
private db: DataSource,
+ @Inject(DI.redis)
+ private redisClient: Redis.Redis,
+
@Inject(DI.followingsRepository)
private followingsRepository: FollowingsRepository,
- private appLockService: AppLockService,
private userEntityService: UserEntityService,
private chartLoggerService: ChartLoggerService,
) {
- super(db, (k) => appLockService.getChartInsertLock(k), chartLoggerService.logger, name, schema, true);
+ super(db, (k) => acquireChartInsertLock(redisClient, k), chartLoggerService.logger, name, schema, true);
}
protected async tickMajor(group: string): Promise<Partial<KVs<typeof schema>>> {
diff --git a/packages/backend/src/core/chart/charts/per-user-notes.ts b/packages/backend/src/core/chart/charts/per-user-notes.ts
index e4900772bb..824d60042d 100644
--- a/packages/backend/src/core/chart/charts/per-user-notes.ts
+++ b/packages/backend/src/core/chart/charts/per-user-notes.ts
@@ -5,12 +5,13 @@
import { Injectable, Inject } from '@nestjs/common';
import { DataSource } from 'typeorm';
+import * as Redis from 'ioredis';
import type { MiUser } from '@/models/User.js';
import type { MiNote } from '@/models/Note.js';
-import { AppLockService } from '@/core/AppLockService.js';
import { DI } from '@/di-symbols.js';
import type { NotesRepository } from '@/models/_.js';
import { bindThis } from '@/decorators.js';
+import { acquireChartInsertLock } from '@/misc/distributed-lock.js';
import Chart from '../core.js';
import { ChartLoggerService } from '../ChartLoggerService.js';
import { name, schema } from './entities/per-user-notes.js';
@@ -25,13 +26,15 @@ export default class PerUserNotesChart extends Chart<typeof schema> { // eslint-
@Inject(DI.db)
private db: DataSource,
+ @Inject(DI.redis)
+ private redisClient: Redis.Redis,
+
@Inject(DI.notesRepository)
private notesRepository: NotesRepository,
- private appLockService: AppLockService,
private chartLoggerService: ChartLoggerService,
) {
- super(db, (k) => appLockService.getChartInsertLock(k), chartLoggerService.logger, name, schema, true);
+ super(db, (k) => acquireChartInsertLock(redisClient, k), chartLoggerService.logger, name, schema, true);
}
protected async tickMajor(group: string): Promise<Partial<KVs<typeof schema>>> {
diff --git a/packages/backend/src/core/chart/charts/per-user-pv.ts b/packages/backend/src/core/chart/charts/per-user-pv.ts
index 31708fefa8..b3e1b2cea1 100644
--- a/packages/backend/src/core/chart/charts/per-user-pv.ts
+++ b/packages/backend/src/core/chart/charts/per-user-pv.ts
@@ -5,10 +5,11 @@
import { Injectable, Inject } from '@nestjs/common';
import { DataSource } from 'typeorm';
+import * as Redis from 'ioredis';
import type { MiUser } from '@/models/User.js';
-import { AppLockService } from '@/core/AppLockService.js';
import { DI } from '@/di-symbols.js';
import { bindThis } from '@/decorators.js';
+import { acquireChartInsertLock } from '@/misc/distributed-lock.js';
import Chart from '../core.js';
import { ChartLoggerService } from '../ChartLoggerService.js';
import { name, schema } from './entities/per-user-pv.js';
@@ -23,10 +24,12 @@ export default class PerUserPvChart extends Chart<typeof schema> { // eslint-dis
@Inject(DI.db)
private db: DataSource,
- private appLockService: AppLockService,
+ @Inject(DI.redis)
+ private redisClient: Redis.Redis,
+
private chartLoggerService: ChartLoggerService,
) {
- super(db, (k) => appLockService.getChartInsertLock(k), chartLoggerService.logger, name, schema, true);
+ super(db, (k) => acquireChartInsertLock(redisClient, k), chartLoggerService.logger, name, schema, true);
}
protected async tickMajor(): Promise<Partial<KVs<typeof schema>>> {
diff --git a/packages/backend/src/core/chart/charts/per-user-reactions.ts b/packages/backend/src/core/chart/charts/per-user-reactions.ts
index c29c4d2870..7bc1d9e7fa 100644
--- a/packages/backend/src/core/chart/charts/per-user-reactions.ts
+++ b/packages/backend/src/core/chart/charts/per-user-reactions.ts
@@ -5,12 +5,13 @@
import { Injectable, Inject } from '@nestjs/common';
import { DataSource } from 'typeorm';
+import * as Redis from 'ioredis';
import type { MiUser } from '@/models/User.js';
import type { MiNote } from '@/models/Note.js';
-import { AppLockService } from '@/core/AppLockService.js';
import { DI } from '@/di-symbols.js';
import { UserEntityService } from '@/core/entities/UserEntityService.js';
import { bindThis } from '@/decorators.js';
+import { acquireChartInsertLock } from '@/misc/distributed-lock.js';
import Chart from '../core.js';
import { ChartLoggerService } from '../ChartLoggerService.js';
import { name, schema } from './entities/per-user-reactions.js';
@@ -25,11 +26,13 @@ export default class PerUserReactionsChart extends Chart<typeof schema> { // esl
@Inject(DI.db)
private db: DataSource,
- private appLockService: AppLockService,
+ @Inject(DI.redis)
+ private redisClient: Redis.Redis,
+
private userEntityService: UserEntityService,
private chartLoggerService: ChartLoggerService,
) {
- super(db, (k) => appLockService.getChartInsertLock(k), chartLoggerService.logger, name, schema, true);
+ super(db, (k) => acquireChartInsertLock(redisClient, k), chartLoggerService.logger, name, schema, true);
}
protected async tickMajor(group: string): Promise<Partial<KVs<typeof schema>>> {
diff --git a/packages/backend/src/core/chart/charts/test-grouped.ts b/packages/backend/src/core/chart/charts/test-grouped.ts
index 7a2844f4ed..8dd1a5d996 100644
--- a/packages/backend/src/core/chart/charts/test-grouped.ts
+++ b/packages/backend/src/core/chart/charts/test-grouped.ts
@@ -5,10 +5,11 @@
import { Injectable, Inject } from '@nestjs/common';
import { DataSource } from 'typeorm';
-import { AppLockService } from '@/core/AppLockService.js';
+import * as Redis from 'ioredis';
import { DI } from '@/di-symbols.js';
import Logger from '@/logger.js';
import { bindThis } from '@/decorators.js';
+import { acquireChartInsertLock } from '@/misc/distributed-lock.js';
import Chart from '../core.js';
import { name, schema } from './entities/test-grouped.js';
import type { KVs } from '../core.js';
@@ -24,10 +25,12 @@ export default class TestGroupedChart extends Chart<typeof schema> { // eslint-d
@Inject(DI.db)
private db: DataSource,
- private appLockService: AppLockService,
+ @Inject(DI.redis)
+ private redisClient: Redis.Redis,
+
logger: Logger,
) {
- super(db, (k) => appLockService.getChartInsertLock(k), logger, name, schema, true);
+ super(db, (k) => acquireChartInsertLock(redisClient, k), logger, name, schema, true);
}
protected async tickMajor(group: string): Promise<Partial<KVs<typeof schema>>> {
diff --git a/packages/backend/src/core/chart/charts/test-intersection.ts b/packages/backend/src/core/chart/charts/test-intersection.ts
index b8d0556c9f..23b8649cce 100644
--- a/packages/backend/src/core/chart/charts/test-intersection.ts
+++ b/packages/backend/src/core/chart/charts/test-intersection.ts
@@ -5,10 +5,11 @@
import { Injectable, Inject } from '@nestjs/common';
import { DataSource } from 'typeorm';
-import { AppLockService } from '@/core/AppLockService.js';
+import * as Redis from 'ioredis';
import { DI } from '@/di-symbols.js';
import Logger from '@/logger.js';
import { bindThis } from '@/decorators.js';
+import { acquireChartInsertLock } from '@/misc/distributed-lock.js';
import Chart from '../core.js';
import { name, schema } from './entities/test-intersection.js';
import type { KVs } from '../core.js';
@@ -22,10 +23,12 @@ export default class TestIntersectionChart extends Chart<typeof schema> { // esl
@Inject(DI.db)
private db: DataSource,
- private appLockService: AppLockService,
+ @Inject(DI.redis)
+ private redisClient: Redis.Redis,
+
logger: Logger,
) {
- super(db, (k) => appLockService.getChartInsertLock(k), logger, name, schema);
+ super(db, (k) => acquireChartInsertLock(redisClient, k), logger, name, schema);
}
protected async tickMajor(): Promise<Partial<KVs<typeof schema>>> {
diff --git a/packages/backend/src/core/chart/charts/test-unique.ts b/packages/backend/src/core/chart/charts/test-unique.ts
index f94e008059..b84dd419ba 100644
--- a/packages/backend/src/core/chart/charts/test-unique.ts
+++ b/packages/backend/src/core/chart/charts/test-unique.ts
@@ -5,10 +5,11 @@
import { Injectable, Inject } from '@nestjs/common';
import { DataSource } from 'typeorm';
-import { AppLockService } from '@/core/AppLockService.js';
+import * as Redis from 'ioredis';
import { DI } from '@/di-symbols.js';
import Logger from '@/logger.js';
import { bindThis } from '@/decorators.js';
+import { acquireChartInsertLock } from '@/misc/distributed-lock.js';
import Chart from '../core.js';
import { name, schema } from './entities/test-unique.js';
import type { KVs } from '../core.js';
@@ -22,10 +23,12 @@ export default class TestUniqueChart extends Chart<typeof schema> { // eslint-di
@Inject(DI.db)
private db: DataSource,
- private appLockService: AppLockService,
+ @Inject(DI.redis)
+ private redisClient: Redis.Redis,
+
logger: Logger,
) {
- super(db, (k) => appLockService.getChartInsertLock(k), logger, name, schema);
+ super(db, (k) => acquireChartInsertLock(redisClient, k), logger, name, schema);
}
protected async tickMajor(): Promise<Partial<KVs<typeof schema>>> {
diff --git a/packages/backend/src/core/chart/charts/test.ts b/packages/backend/src/core/chart/charts/test.ts
index a90dc8f99b..0e95ce9239 100644
--- a/packages/backend/src/core/chart/charts/test.ts
+++ b/packages/backend/src/core/chart/charts/test.ts
@@ -5,10 +5,11 @@
import { Injectable, Inject } from '@nestjs/common';
import { DataSource } from 'typeorm';
-import { AppLockService } from '@/core/AppLockService.js';
+import * as Redis from 'ioredis';
import { DI } from '@/di-symbols.js';
import Logger from '@/logger.js';
import { bindThis } from '@/decorators.js';
+import { acquireChartInsertLock } from '@/misc/distributed-lock.js';
import Chart from '../core.js';
import { name, schema } from './entities/test.js';
import type { KVs } from '../core.js';
@@ -24,10 +25,12 @@ export default class TestChart extends Chart<typeof schema> { // eslint-disable-
@Inject(DI.db)
private db: DataSource,
- private appLockService: AppLockService,
+ @Inject(DI.redis)
+ private redisClient: Redis.Redis,
+
logger: Logger,
) {
- super(db, (k) => appLockService.getChartInsertLock(k), logger, name, schema);
+ super(db, (k) => acquireChartInsertLock(redisClient, k), logger, name, schema);
}
protected async tickMajor(): Promise<Partial<KVs<typeof schema>>> {
diff --git a/packages/backend/src/core/chart/charts/users.ts b/packages/backend/src/core/chart/charts/users.ts
index d148fc629b..4471c1df23 100644
--- a/packages/backend/src/core/chart/charts/users.ts
+++ b/packages/backend/src/core/chart/charts/users.ts
@@ -5,12 +5,13 @@
import { Injectable, Inject } from '@nestjs/common';
import { Not, IsNull, DataSource } from 'typeorm';
+import * as Redis from 'ioredis';
import type { MiUser } from '@/models/User.js';
-import { AppLockService } from '@/core/AppLockService.js';
import { DI } from '@/di-symbols.js';
import { UserEntityService } from '@/core/entities/UserEntityService.js';
import type { UsersRepository } from '@/models/_.js';
import { bindThis } from '@/decorators.js';
+import { acquireChartInsertLock } from '@/misc/distributed-lock.js';
import Chart from '../core.js';
import { ChartLoggerService } from '../ChartLoggerService.js';
import { name, schema } from './entities/users.js';
@@ -25,14 +26,16 @@ export default class UsersChart extends Chart<typeof schema> { // eslint-disable
@Inject(DI.db)
private db: DataSource,
+ @Inject(DI.redis)
+ private redisClient: Redis.Redis,
+
@Inject(DI.usersRepository)
private usersRepository: UsersRepository,
- private appLockService: AppLockService,
private userEntityService: UserEntityService,
private chartLoggerService: ChartLoggerService,
) {
- super(db, (k) => appLockService.getChartInsertLock(k), chartLoggerService.logger, name, schema);
+ super(db, (k) => acquireChartInsertLock(redisClient, k), chartLoggerService.logger, name, schema);
}
protected async tickMajor(): Promise<Partial<KVs<typeof schema>>> {
diff --git a/packages/backend/src/core/entities/NoteEntityService.ts b/packages/backend/src/core/entities/NoteEntityService.ts
index 6871ba2c72..e7847ba74e 100644
--- a/packages/backend/src/core/entities/NoteEntityService.ts
+++ b/packages/backend/src/core/entities/NoteEntityService.ts
@@ -15,6 +15,7 @@ import type { UsersRepository, NotesRepository, FollowingsRepository, PollsRepos
import { bindThis } from '@/decorators.js';
import { DebounceLoader } from '@/misc/loader.js';
import { IdService } from '@/core/IdService.js';
+import { shouldHideNoteByTime } from '@/misc/should-hide-note-by-time.js';
import { ReactionsBufferingService } from '@/core/ReactionsBufferingService.js';
import type { OnModuleInit } from '@nestjs/common';
import type { CustomEmojiService } from '../CustomEmojiService.js';
@@ -116,12 +117,7 @@ export class NoteEntityService implements OnModuleInit {
private treatVisibility(packedNote: Packed<'Note'>): Packed<'Note'>['visibility'] {
if (packedNote.visibility === 'public' || packedNote.visibility === 'home') {
const followersOnlyBefore = packedNote.user.makeNotesFollowersOnlyBefore;
- if ((followersOnlyBefore != null)
- && (
- (followersOnlyBefore <= 0 && (Date.now() - new Date(packedNote.createdAt).getTime() > 0 - (followersOnlyBefore * 1000)))
- || (followersOnlyBefore > 0 && (new Date(packedNote.createdAt).getTime() < followersOnlyBefore * 1000))
- )
- ) {
+ if (shouldHideNoteByTime(followersOnlyBefore, packedNote.createdAt)) {
packedNote.visibility = 'followers';
}
}
@@ -141,12 +137,7 @@ export class NoteEntityService implements OnModuleInit {
if (!hide) {
const hiddenBefore = packedNote.user.makeNotesHiddenBefore;
- if ((hiddenBefore != null)
- && (
- (hiddenBefore <= 0 && (Date.now() - new Date(packedNote.createdAt).getTime() > 0 - (hiddenBefore * 1000)))
- || (hiddenBefore > 0 && (new Date(packedNote.createdAt).getTime() < hiddenBefore * 1000))
- )
- ) {
+ if (shouldHideNoteByTime(hiddenBefore, packedNote.createdAt)) {
hide = true;
}
}
diff --git a/packages/backend/src/misc/distributed-lock.ts b/packages/backend/src/misc/distributed-lock.ts
new file mode 100644
index 0000000000..93bd741f62
--- /dev/null
+++ b/packages/backend/src/misc/distributed-lock.ts
@@ -0,0 +1,49 @@
+/*
+ * SPDX-FileCopyrightText: syuilo and misskey-project
+ * SPDX-License-Identifier: AGPL-3.0-only
+ */
+
+import * as Redis from 'ioredis';
+
+export async function acquireDistributedLock(
+ redis: Redis.Redis,
+ name: string,
+ timeout: number,
+ maxRetries: number,
+ retryInterval: number,
+): Promise<() => Promise<void>> {
+ const lockKey = `lock:${name}`;
+ const identifier = Math.random().toString(36).slice(2);
+
+ let retries = 0;
+ while (retries < maxRetries) {
+ const result = await redis.set(lockKey, identifier, 'PX', timeout, 'NX');
+ if (result === 'OK') {
+ return async () => {
+ const currentIdentifier = await redis.get(lockKey);
+ if (currentIdentifier === identifier) {
+ await redis.del(lockKey);
+ }
+ };
+ }
+
+ await new Promise(resolve => setTimeout(resolve, retryInterval));
+ retries++;
+ }
+
+ throw new Error(`Failed to acquire lock ${name}`);
+}
+
+export function acquireApObjectLock(
+ redis: Redis.Redis,
+ uri: string,
+): Promise<() => Promise<void>> {
+ return acquireDistributedLock(redis, `ap-object:${uri}`, 30 * 1000, 50, 100);
+}
+
+export function acquireChartInsertLock(
+ redis: Redis.Redis,
+ name: string,
+): Promise<() => Promise<void>> {
+ return acquireDistributedLock(redis, `chart-insert:${name}`, 30 * 1000, 50, 500);
+}
diff --git a/packages/backend/src/misc/escape-html.ts b/packages/backend/src/misc/escape-html.ts
new file mode 100644
index 0000000000..819aeeed52
--- /dev/null
+++ b/packages/backend/src/misc/escape-html.ts
@@ -0,0 +1,13 @@
+/*
+ * SPDX-FileCopyrightText: syuilo and misskey-project
+ * SPDX-License-Identifier: AGPL-3.0-only
+ */
+
+export function escapeHtml(text: string): string {
+ return text
+ .replace(/&/g, '&amp;')
+ .replace(/</g, '&lt;')
+ .replace(/>/g, '&gt;')
+ .replace(/"/g, '&quot;')
+ .replace(/'/g, '&#039;');
+}
diff --git a/packages/backend/src/misc/json-stringify-html-safe.ts b/packages/backend/src/misc/json-stringify-html-safe.ts
new file mode 100644
index 0000000000..aac12d57db
--- /dev/null
+++ b/packages/backend/src/misc/json-stringify-html-safe.ts
@@ -0,0 +1,18 @@
+/*
+ * SPDX-FileCopyrightText: syuilo and misskey-project
+ * SPDX-License-Identifier: AGPL-3.0-only
+ */
+
+const ESCAPE_LOOKUP = {
+ '&': '\\u0026',
+ '>': '\\u003e',
+ '<': '\\u003c',
+ '\u2028': '\\u2028',
+ '\u2029': '\\u2029',
+} as Record<string, string>;
+
+const ESCAPE_REGEX = /[&><\u2028\u2029]/g;
+
+export function htmlSafeJsonStringify(obj: any): string {
+ return JSON.stringify(obj).replace(ESCAPE_REGEX, x => ESCAPE_LOOKUP[x]);
+}
diff --git a/packages/backend/src/misc/should-hide-note-by-time.ts b/packages/backend/src/misc/should-hide-note-by-time.ts
new file mode 100644
index 0000000000..ea1951e66c
--- /dev/null
+++ b/packages/backend/src/misc/should-hide-note-by-time.ts
@@ -0,0 +1,29 @@
+/*
+ * SPDX-FileCopyrightText: syuilo and misskey-project
+ * SPDX-License-Identifier: AGPL-3.0-only
+ */
+
+/**
+ * ノートが指定された時間条件に基づいて非表示対象かどうかを判定する
+ * @param hiddenBefore 非表示条件(負の値: 作成からの経過秒数、正の値: UNIXタイムスタンプ秒、null: 判定しない)
+ * @param createdAt ノートの作成日時(ISO 8601形式の文字列 または Date オブジェクト)
+ * @returns 非表示にすべき場合は true
+ */
+export function shouldHideNoteByTime(hiddenBefore: number | null | undefined, createdAt: string | Date): boolean {
+ if (hiddenBefore == null) {
+ return false;
+ }
+
+ const createdAtTime = typeof createdAt === 'string' ? new Date(createdAt).getTime() : createdAt.getTime();
+
+ if (hiddenBefore <= 0) {
+ // 負の値: 作成からの経過時間(秒)で判定
+ const elapsedSeconds = (Date.now() - createdAtTime) / 1000;
+ const hideAfterSeconds = Math.abs(hiddenBefore);
+ return elapsedSeconds >= hideAfterSeconds;
+ } else {
+ // 正の値: 絶対的なタイムスタンプ(秒)で判定
+ const createdAtSeconds = createdAtTime / 1000;
+ return createdAtSeconds <= hiddenBefore;
+ }
+}
diff --git a/packages/backend/src/queue/QueueProcessorService.ts b/packages/backend/src/queue/QueueProcessorService.ts
index 642d3fc8ad..306fdb41f6 100644
--- a/packages/backend/src/queue/QueueProcessorService.ts
+++ b/packages/backend/src/queue/QueueProcessorService.ts
@@ -5,7 +5,6 @@
import { Inject, Injectable, OnApplicationShutdown } from '@nestjs/common';
import * as Bull from 'bullmq';
-import * as Sentry from '@sentry/node';
import type { Config } from '@/config.js';
import { DI } from '@/di-symbols.js';
import type Logger from '@/logger.js';
@@ -157,6 +156,13 @@ export class QueueProcessorService implements OnApplicationShutdown {
};
}
+ let Sentry: typeof import('@sentry/node') | undefined;
+ if (Sentry != null) {
+ import('@sentry/node').then((mod) => {
+ Sentry = mod;
+ });
+ }
+
//#region system
{
const processer = (job: Bull.Job) => {
@@ -175,7 +181,7 @@ export class QueueProcessorService implements OnApplicationShutdown {
};
this.systemQueueWorker = new Bull.Worker(QUEUE.SYSTEM, (job) => {
- if (this.config.sentryForBackend) {
+ if (Sentry != null) {
return Sentry.startSpan({ name: 'Queue: System: ' + job.name }, () => processer(job));
} else {
return processer(job);
@@ -192,7 +198,7 @@ export class QueueProcessorService implements OnApplicationShutdown {
.on('completed', (job, result) => logger.debug(`completed(${result}) id=${job.id}`))
.on('failed', (job, err: Error) => {
logger.error(`failed(${err.name}: ${err.message}) id=${job?.id ?? '?'}`, { job: renderJob(job), e: renderError(err) });
- if (config.sentryForBackend) {
+ if (Sentry != null) {
Sentry.captureMessage(`Queue: System: ${job?.name ?? '?'}: ${err.name}: ${err.message}`, {
level: 'error',
extra: { job, err },
@@ -232,7 +238,7 @@ export class QueueProcessorService implements OnApplicationShutdown {
};
this.dbQueueWorker = new Bull.Worker(QUEUE.DB, (job) => {
- if (this.config.sentryForBackend) {
+ if (Sentry != null) {
return Sentry.startSpan({ name: 'Queue: DB: ' + job.name }, () => processer(job));
} else {
return processer(job);
@@ -249,7 +255,7 @@ export class QueueProcessorService implements OnApplicationShutdown {
.on('completed', (job, result) => logger.debug(`completed(${result}) id=${job.id}`))
.on('failed', (job, err) => {
logger.error(`failed(${err.name}: ${err.message}) id=${job?.id ?? '?'}`, { job: renderJob(job), e: renderError(err) });
- if (config.sentryForBackend) {
+ if (Sentry != null) {
Sentry.captureMessage(`Queue: DB: ${job?.name ?? '?'}: ${err.name}: ${err.message}`, {
level: 'error',
extra: { job, err },
@@ -264,7 +270,7 @@ export class QueueProcessorService implements OnApplicationShutdown {
//#region deliver
{
this.deliverQueueWorker = new Bull.Worker(QUEUE.DELIVER, (job) => {
- if (this.config.sentryForBackend) {
+ if (Sentry != null) {
return Sentry.startSpan({ name: 'Queue: Deliver' }, () => this.deliverProcessorService.process(job));
} else {
return this.deliverProcessorService.process(job);
@@ -289,7 +295,7 @@ export class QueueProcessorService implements OnApplicationShutdown {
.on('completed', (job, result) => logger.debug(`completed(${result}) ${getJobInfo(job, true)} to=${job.data.to}`))
.on('failed', (job, err) => {
logger.error(`failed(${err.name}: ${err.message}) ${getJobInfo(job)} to=${job ? job.data.to : '-'}`);
- if (config.sentryForBackend) {
+ if (Sentry != null) {
Sentry.captureMessage(`Queue: Deliver: ${err.name}: ${err.message}`, {
level: 'error',
extra: { job, err },
@@ -304,7 +310,7 @@ export class QueueProcessorService implements OnApplicationShutdown {
//#region inbox
{
this.inboxQueueWorker = new Bull.Worker(QUEUE.INBOX, (job) => {
- if (this.config.sentryForBackend) {
+ if (Sentry != null) {
return Sentry.startSpan({ name: 'Queue: Inbox' }, () => this.inboxProcessorService.process(job));
} else {
return this.inboxProcessorService.process(job);
@@ -329,7 +335,7 @@ export class QueueProcessorService implements OnApplicationShutdown {
.on('completed', (job, result) => logger.debug(`completed(${result}) ${getJobInfo(job, true)}`))
.on('failed', (job, err) => {
logger.error(`failed(${err.name}: ${err.message}) ${getJobInfo(job)} activity=${job ? (job.data.activity ? job.data.activity.id : 'none') : '-'}`, { job: renderJob(job), e: renderError(err) });
- if (config.sentryForBackend) {
+ if (Sentry != null) {
Sentry.captureMessage(`Queue: Inbox: ${err.name}: ${err.message}`, {
level: 'error',
extra: { job, err },
@@ -344,7 +350,7 @@ export class QueueProcessorService implements OnApplicationShutdown {
//#region user-webhook deliver
{
this.userWebhookDeliverQueueWorker = new Bull.Worker(QUEUE.USER_WEBHOOK_DELIVER, (job) => {
- if (this.config.sentryForBackend) {
+ if (Sentry != null) {
return Sentry.startSpan({ name: 'Queue: UserWebhookDeliver' }, () => this.userWebhookDeliverProcessorService.process(job));
} else {
return this.userWebhookDeliverProcessorService.process(job);
@@ -369,7 +375,7 @@ export class QueueProcessorService implements OnApplicationShutdown {
.on('completed', (job, result) => logger.debug(`completed(${result}) ${getJobInfo(job, true)} to=${job.data.to}`))
.on('failed', (job, err) => {
logger.error(`failed(${err.name}: ${err.message}) ${getJobInfo(job)} to=${job ? job.data.to : '-'}`);
- if (config.sentryForBackend) {
+ if (Sentry != null) {
Sentry.captureMessage(`Queue: UserWebhookDeliver: ${err.name}: ${err.message}`, {
level: 'error',
extra: { job, err },
@@ -384,7 +390,7 @@ export class QueueProcessorService implements OnApplicationShutdown {
//#region system-webhook deliver
{
this.systemWebhookDeliverQueueWorker = new Bull.Worker(QUEUE.SYSTEM_WEBHOOK_DELIVER, (job) => {
- if (this.config.sentryForBackend) {
+ if (Sentry != null) {
return Sentry.startSpan({ name: 'Queue: SystemWebhookDeliver' }, () => this.systemWebhookDeliverProcessorService.process(job));
} else {
return this.systemWebhookDeliverProcessorService.process(job);
@@ -409,7 +415,7 @@ export class QueueProcessorService implements OnApplicationShutdown {
.on('completed', (job, result) => logger.debug(`completed(${result}) ${getJobInfo(job, true)} to=${job.data.to}`))
.on('failed', (job, err) => {
logger.error(`failed(${err.name}: ${err.message}) ${getJobInfo(job)} to=${job ? job.data.to : '-'}`);
- if (config.sentryForBackend) {
+ if (Sentry != null) {
Sentry.captureMessage(`Queue: SystemWebhookDeliver: ${err.name}: ${err.message}`, {
level: 'error',
extra: { job, err },
@@ -434,7 +440,7 @@ export class QueueProcessorService implements OnApplicationShutdown {
};
this.relationshipQueueWorker = new Bull.Worker(QUEUE.RELATIONSHIP, (job) => {
- if (this.config.sentryForBackend) {
+ if (Sentry != null) {
return Sentry.startSpan({ name: 'Queue: Relationship: ' + job.name }, () => processer(job));
} else {
return processer(job);
@@ -456,7 +462,7 @@ export class QueueProcessorService implements OnApplicationShutdown {
.on('completed', (job, result) => logger.debug(`completed(${result}) id=${job.id}`))
.on('failed', (job, err) => {
logger.error(`failed(${err.name}: ${err.message}) id=${job?.id ?? '?'}`, { job: renderJob(job), e: renderError(err) });
- if (config.sentryForBackend) {
+ if (Sentry != null) {
Sentry.captureMessage(`Queue: Relationship: ${job?.name ?? '?'}: ${err.name}: ${err.message}`, {
level: 'error',
extra: { job, err },
@@ -479,7 +485,7 @@ export class QueueProcessorService implements OnApplicationShutdown {
};
this.objectStorageQueueWorker = new Bull.Worker(QUEUE.OBJECT_STORAGE, (job) => {
- if (this.config.sentryForBackend) {
+ if (Sentry != null) {
return Sentry.startSpan({ name: 'Queue: ObjectStorage: ' + job.name }, () => processer(job));
} else {
return processer(job);
@@ -497,7 +503,7 @@ export class QueueProcessorService implements OnApplicationShutdown {
.on('completed', (job, result) => logger.debug(`completed(${result}) id=${job.id}`))
.on('failed', (job, err) => {
logger.error(`failed(${err.name}: ${err.message}) id=${job?.id ?? '?'}`, { job: renderJob(job), e: renderError(err) });
- if (config.sentryForBackend) {
+ if (Sentry != null) {
Sentry.captureMessage(`Queue: ObjectStorage: ${job?.name ?? '?'}: ${err.name}: ${err.message}`, {
level: 'error',
extra: { job, err },
@@ -512,7 +518,7 @@ export class QueueProcessorService implements OnApplicationShutdown {
//#region ended poll notification
{
this.endedPollNotificationQueueWorker = new Bull.Worker(QUEUE.ENDED_POLL_NOTIFICATION, (job) => {
- if (this.config.sentryForBackend) {
+ if (Sentry != null) {
return Sentry.startSpan({ name: 'Queue: EndedPollNotification' }, () => this.endedPollNotificationProcessorService.process(job));
} else {
return this.endedPollNotificationProcessorService.process(job);
@@ -527,7 +533,7 @@ export class QueueProcessorService implements OnApplicationShutdown {
//#region post scheduled note
{
this.postScheduledNoteQueueWorker = new Bull.Worker(QUEUE.POST_SCHEDULED_NOTE, async (job) => {
- if (this.config.sentryForBackend) {
+ if (Sentry != null) {
return Sentry.startSpan({ name: 'Queue: PostScheduledNote' }, () => this.postScheduledNoteProcessorService.process(job));
} else {
return this.postScheduledNoteProcessorService.process(job);
diff --git a/packages/backend/src/queue/processors/ExportClipsProcessorService.ts b/packages/backend/src/queue/processors/ExportClipsProcessorService.ts
index 486dc4c01f..be7d4e9e21 100644
--- a/packages/backend/src/queue/processors/ExportClipsProcessorService.ts
+++ b/packages/backend/src/queue/processors/ExportClipsProcessorService.ts
@@ -5,21 +5,20 @@
import * as fs from 'node:fs';
import { Writable } from 'node:stream';
-import { Inject, Injectable, StreamableFile } from '@nestjs/common';
-import { MoreThan } from 'typeorm';
+import { Inject, Injectable } from '@nestjs/common';
import { format as dateFormat } from 'date-fns';
import { DI } from '@/di-symbols.js';
-import type { ClipNotesRepository, ClipsRepository, MiClip, MiClipNote, MiUser, NotesRepository, PollsRepository, UsersRepository } from '@/models/_.js';
+import type { ClipNotesRepository, ClipsRepository, MiClip, MiClipNote, MiUser, PollsRepository, UsersRepository } from '@/models/_.js';
import type Logger from '@/logger.js';
import { DriveService } from '@/core/DriveService.js';
import { createTemp } from '@/misc/create-temp.js';
import type { MiPoll } from '@/models/Poll.js';
import type { MiNote } from '@/models/Note.js';
import { bindThis } from '@/decorators.js';
-import { DriveFileEntityService } from '@/core/entities/DriveFileEntityService.js';
-import { Packed } from '@/misc/json-schema.js';
import { IdService } from '@/core/IdService.js';
import { NotificationService } from '@/core/NotificationService.js';
+import { QueryService } from '@/core/QueryService.js';
+import { shouldHideNoteByTime } from '@/misc/should-hide-note-by-time.js';
import { QueueLoggerService } from '../QueueLoggerService.js';
import type * as Bull from 'bullmq';
import type { DbJobDataWithUser } from '../types.js';
@@ -43,6 +42,7 @@ export class ExportClipsProcessorService {
private driveService: DriveService,
private queueLoggerService: QueueLoggerService,
+ private queryService: QueryService,
private idService: IdService,
private notificationService: NotificationService,
) {
@@ -100,16 +100,16 @@ export class ExportClipsProcessorService {
});
while (true) {
- const clips = await this.clipsRepository.find({
- where: {
- userId: user.id,
- ...(cursor ? { id: MoreThan(cursor) } : {}),
- },
- take: 100,
- order: {
- id: 1,
- },
- });
+ const query = this.clipsRepository.createQueryBuilder('clip')
+ .where('clip.userId = :userId', { userId: user.id })
+ .orderBy('clip.id', 'ASC')
+ .take(100);
+
+ if (cursor) {
+ query.andWhere('clip.id > :cursor', { cursor });
+ }
+
+ const clips = await query.getMany();
if (clips.length === 0) {
job.updateProgress(100);
@@ -124,7 +124,7 @@ export class ExportClipsProcessorService {
const isFirst = exportedClipsCount === 0;
await writer.write(isFirst ? content : ',\n' + content);
- await this.processClipNotes(writer, clip.id);
+ await this.processClipNotes(writer, clip.id, user.id);
await writer.write(']}');
exportedClipsCount++;
@@ -134,22 +134,25 @@ export class ExportClipsProcessorService {
}
}
- async processClipNotes(writer: WritableStreamDefaultWriter, clipId: string): Promise<void> {
+ async processClipNotes(writer: WritableStreamDefaultWriter, clipId: string, userId: string): Promise<void> {
let exportedClipNotesCount = 0;
let cursor: MiClipNote['id'] | null = null;
while (true) {
- const clipNotes = await this.clipNotesRepository.find({
- where: {
- clipId,
- ...(cursor ? { id: MoreThan(cursor) } : {}),
- },
- take: 100,
- order: {
- id: 1,
- },
- relations: ['note', 'note.user'],
- }) as (MiClipNote & { note: MiNote & { user: MiUser } })[];
+ const query = this.clipNotesRepository.createQueryBuilder('clipNote')
+ .leftJoinAndSelect('clipNote.note', 'note')
+ .leftJoinAndSelect('note.user', 'user')
+ .where('clipNote.clipId = :clipId', { clipId })
+ .orderBy('clipNote.id', 'ASC')
+ .take(100);
+
+ if (cursor) {
+ query.andWhere('clipNote.id > :cursor', { cursor });
+ }
+
+ this.queryService.generateVisibilityQuery(query, { id: userId });
+
+ const clipNotes = await query.getMany() as (MiClipNote & { note: MiNote & { user: MiUser } })[];
if (clipNotes.length === 0) {
break;
@@ -158,6 +161,11 @@ export class ExportClipsProcessorService {
cursor = clipNotes.at(-1)?.id ?? null;
for (const clipNote of clipNotes) {
+ const noteCreatedAt = this.idService.parse(clipNote.note.id).date;
+ if (shouldHideNoteByTime(clipNote.note.user.makeNotesHiddenBefore, noteCreatedAt)) {
+ continue;
+ }
+
let poll: MiPoll | undefined;
if (clipNote.note.hasPoll) {
poll = await this.pollsRepository.findOneByOrFail({ noteId: clipNote.note.id });
diff --git a/packages/backend/src/queue/processors/ExportFavoritesProcessorService.ts b/packages/backend/src/queue/processors/ExportFavoritesProcessorService.ts
index 7918c8ccb5..87a8ded307 100644
--- a/packages/backend/src/queue/processors/ExportFavoritesProcessorService.ts
+++ b/packages/backend/src/queue/processors/ExportFavoritesProcessorService.ts
@@ -5,7 +5,6 @@
import * as fs from 'node:fs';
import { Inject, Injectable } from '@nestjs/common';
-import { MoreThan } from 'typeorm';
import { format as dateFormat } from 'date-fns';
import { DI } from '@/di-symbols.js';
import type { MiNoteFavorite, NoteFavoritesRepository, PollsRepository, MiUser, UsersRepository } from '@/models/_.js';
@@ -17,6 +16,8 @@ import type { MiNote } from '@/models/Note.js';
import { bindThis } from '@/decorators.js';
import { IdService } from '@/core/IdService.js';
import { NotificationService } from '@/core/NotificationService.js';
+import { QueryService } from '@/core/QueryService.js';
+import { shouldHideNoteByTime } from '@/misc/should-hide-note-by-time.js';
import { QueueLoggerService } from '../QueueLoggerService.js';
import type * as Bull from 'bullmq';
import type { DbJobDataWithUser } from '../types.js';
@@ -37,6 +38,7 @@ export class ExportFavoritesProcessorService {
private driveService: DriveService,
private queueLoggerService: QueueLoggerService,
+ private queryService: QueryService,
private idService: IdService,
private notificationService: NotificationService,
) {
@@ -83,17 +85,20 @@ export class ExportFavoritesProcessorService {
});
while (true) {
- const favorites = await this.noteFavoritesRepository.find({
- where: {
- userId: user.id,
- ...(cursor ? { id: MoreThan(cursor) } : {}),
- },
- take: 100,
- order: {
- id: 1,
- },
- relations: ['note', 'note.user'],
- }) as (MiNoteFavorite & { note: MiNote & { user: MiUser } })[];
+ const query = this.noteFavoritesRepository.createQueryBuilder('favorite')
+ .leftJoinAndSelect('favorite.note', 'note')
+ .leftJoinAndSelect('note.user', 'user')
+ .where('favorite.userId = :userId', { userId: user.id })
+ .orderBy('favorite.id', 'ASC')
+ .take(100);
+
+ if (cursor) {
+ query.andWhere('favorite.id > :cursor', { cursor });
+ }
+
+ this.queryService.generateVisibilityQuery(query, { id: user.id });
+
+ const favorites = await query.getMany() as (MiNoteFavorite & { note: MiNote & { user: MiUser } })[];
if (favorites.length === 0) {
job.updateProgress(100);
@@ -103,6 +108,11 @@ export class ExportFavoritesProcessorService {
cursor = favorites.at(-1)?.id ?? null;
for (const favorite of favorites) {
+ const noteCreatedAt = this.idService.parse(favorite.note.id).date;
+ if (shouldHideNoteByTime(favorite.note.user.makeNotesHiddenBefore, noteCreatedAt)) {
+ continue;
+ }
+
let poll: MiPoll | undefined;
if (favorite.note.hasPoll) {
poll = await this.pollsRepository.findOneByOrFail({ noteId: favorite.note.id });
diff --git a/packages/backend/src/server/ServerModule.ts b/packages/backend/src/server/ServerModule.ts
index 0223650329..111421472d 100644
--- a/packages/backend/src/server/ServerModule.ts
+++ b/packages/backend/src/server/ServerModule.ts
@@ -25,6 +25,7 @@ import { SignupApiService } from './api/SignupApiService.js';
import { StreamingApiServerService } from './api/StreamingApiServerService.js';
import { OpenApiServerService } from './api/openapi/OpenApiServerService.js';
import { ClientServerService } from './web/ClientServerService.js';
+import { HtmlTemplateService } from './web/HtmlTemplateService.js';
import { FeedService } from './web/FeedService.js';
import { UrlPreviewService } from './web/UrlPreviewService.js';
import { ClientLoggerService } from './web/ClientLoggerService.js';
@@ -58,6 +59,7 @@ import { SigninWithPasskeyApiService } from './api/SigninWithPasskeyApiService.j
providers: [
ClientServerService,
ClientLoggerService,
+ HtmlTemplateService,
FeedService,
HealthServerService,
UrlPreviewService,
diff --git a/packages/backend/src/server/ServerService.ts b/packages/backend/src/server/ServerService.ts
index 1286b4dad6..4e05322b12 100644
--- a/packages/backend/src/server/ServerService.ts
+++ b/packages/backend/src/server/ServerService.ts
@@ -75,7 +75,7 @@ export class ServerService implements OnApplicationShutdown {
@bindThis
public async launch(): Promise<void> {
const fastify = Fastify({
- trustProxy: this.config.trustProxy ?? true,
+ trustProxy: this.config.trustProxy ?? false,
logger: false,
});
this.#fastify = fastify;
diff --git a/packages/backend/src/server/api/ApiCallService.ts b/packages/backend/src/server/api/ApiCallService.ts
index 7a4af407a3..27c79ab438 100644
--- a/packages/backend/src/server/api/ApiCallService.ts
+++ b/packages/backend/src/server/api/ApiCallService.ts
@@ -7,7 +7,6 @@ import { randomUUID } from 'node:crypto';
import * as fs from 'node:fs';
import * as stream from 'node:stream/promises';
import { Inject, Injectable } from '@nestjs/common';
-import * as Sentry from '@sentry/node';
import { DI } from '@/di-symbols.js';
import { getIpHash } from '@/misc/get-ip-hash.js';
import type { MiLocalUser, MiUser } from '@/models/User.js';
@@ -37,6 +36,7 @@ export class ApiCallService implements OnApplicationShutdown {
private logger: Logger;
private userIpHistories: Map<MiUser['id'], Set<string>>;
private userIpHistoriesClearIntervalId: NodeJS.Timeout;
+ private Sentry: typeof import('@sentry/node') | null = null;
constructor(
@Inject(DI.meta)
@@ -59,6 +59,12 @@ export class ApiCallService implements OnApplicationShutdown {
this.userIpHistoriesClearIntervalId = setInterval(() => {
this.userIpHistories.clear();
}, 1000 * 60 * 60);
+
+ if (this.config.sentryForBackend) {
+ import('@sentry/node').then((Sentry) => {
+ this.Sentry = Sentry;
+ });
+ }
}
#sendApiError(reply: FastifyReply, err: ApiError): void {
@@ -120,8 +126,8 @@ export class ApiCallService implements OnApplicationShutdown {
},
});
- if (this.config.sentryForBackend) {
- Sentry.captureMessage(`Internal error occurred in ${ep.name}: ${err.message}`, {
+ if (this.Sentry != null) {
+ this.Sentry.captureMessage(`Internal error occurred in ${ep.name}: ${err.message}`, {
level: 'error',
user: {
id: userId,
@@ -432,8 +438,8 @@ export class ApiCallService implements OnApplicationShutdown {
}
// API invoking
- if (this.config.sentryForBackend) {
- return await Sentry.startSpan({
+ if (this.Sentry != null) {
+ return await this.Sentry.startSpan({
name: 'API: ' + ep.name,
}, () => ep.exec(data, user, token, file, request.ip, request.headers)
.catch((err: Error) => this.#onExecError(ep, data, err, user?.id)));
diff --git a/packages/backend/src/server/api/endpoints/i/update.ts b/packages/backend/src/server/api/endpoints/i/update.ts
index 113a09cb14..9971a1ea4d 100644
--- a/packages/backend/src/server/api/endpoints/i/update.ts
+++ b/packages/backend/src/server/api/endpoints/i/update.ts
@@ -7,7 +7,7 @@ import RE2 from 're2';
import * as mfm from 'mfm-js';
import { Inject, Injectable } from '@nestjs/common';
import ms from 'ms';
-import { JSDOM } from 'jsdom';
+import * as htmlParser from 'node-html-parser';
import { extractCustomEmojisFromMfm } from '@/misc/extract-custom-emojis-from-mfm.js';
import { extractHashtags } from '@/misc/extract-hashtags.js';
import * as Acct from '@/misc/acct.js';
@@ -569,16 +569,15 @@ export default class extends Endpoint<typeof meta, typeof paramDef> { // eslint-
try {
const html = await this.httpRequestService.getHtml(url);
- const { window } = new JSDOM(html);
- const doc: Document = window.document;
+ const doc = htmlParser.parse(html);
const myLink = `${this.config.url}/@${user.username}`;
const aEls = Array.from(doc.getElementsByTagName('a'));
const linkEls = Array.from(doc.getElementsByTagName('link'));
- const includesMyLink = aEls.some(a => a.href === myLink);
- const includesRelMeLinks = [...aEls, ...linkEls].some(link => link.rel === 'me' && link.href === myLink);
+ const includesMyLink = aEls.some(a => a.attributes.href === myLink);
+ const includesRelMeLinks = [...aEls, ...linkEls].some(link => link.attributes.rel?.split(/\s+/).includes('me') && link.attributes.href === myLink);
if (includesMyLink || includesRelMeLinks) {
await this.userProfilesRepository.createQueryBuilder('profile').update()
@@ -588,8 +587,6 @@ export default class extends Endpoint<typeof meta, typeof paramDef> { // eslint-
})
.execute();
}
-
- window.close();
} catch (err) {
// なにもしない
}
diff --git a/packages/backend/src/server/oauth/OAuth2ProviderService.ts b/packages/backend/src/server/oauth/OAuth2ProviderService.ts
index cdd7102666..d2391c43ab 100644
--- a/packages/backend/src/server/oauth/OAuth2ProviderService.ts
+++ b/packages/backend/src/server/oauth/OAuth2ProviderService.ts
@@ -6,18 +6,15 @@
import dns from 'node:dns/promises';
import { fileURLToPath } from 'node:url';
import { Inject, Injectable } from '@nestjs/common';
-import { JSDOM } from 'jsdom';
+import * as htmlParser from 'node-html-parser';
import httpLinkHeader from 'http-link-header';
import ipaddr from 'ipaddr.js';
import oauth2orize, { type OAuth2, AuthorizationError, ValidateFunctionArity2, OAuth2Req, MiddlewareRequest } from 'oauth2orize';
import oauth2Pkce from 'oauth2orize-pkce';
import fastifyCors from '@fastify/cors';
-import fastifyView from '@fastify/view';
-import pug from 'pug';
import bodyParser from 'body-parser';
import fastifyExpress from '@fastify/express';
import { verifyChallenge } from 'pkce-challenge';
-import { mf2 } from 'microformats-parser';
import { permissions as kinds } from 'misskey-js';
import { secureRndstr } from '@/misc/secure-rndstr.js';
import { HttpRequestService } from '@/core/HttpRequestService.js';
@@ -32,6 +29,8 @@ import { MemoryKVCache } from '@/misc/cache.js';
import { LoggerService } from '@/core/LoggerService.js';
import Logger from '@/logger.js';
import { StatusError } from '@/misc/status-error.js';
+import { HtmlTemplateService } from '@/server/web/HtmlTemplateService.js';
+import { OAuthPage } from '@/server/web/views/oauth.js';
import type { ServerResponse } from 'node:http';
import type { FastifyInstance } from 'fastify';
@@ -98,6 +97,32 @@ interface ClientInformation {
logo: string | null;
}
+function parseMicroformats(doc: htmlParser.HTMLElement, baseUrl: string, id: string): { name: string | null; logo: string | null; } {
+ let name: string | null = null;
+ let logo: string | null = null;
+
+ const hApp = doc.querySelector('.h-app');
+ if (hApp == null) return { name, logo };
+
+ const nameEl = hApp.querySelector('.p-name');
+ if (nameEl != null) {
+ const href = nameEl.attributes.href || nameEl.attributes.src;
+ if (href != null && new URL(href, baseUrl).toString() === new URL(id).toString()) {
+ name = nameEl.textContent.trim();
+ }
+ }
+
+ const logoEl = hApp.querySelector('.u-logo');
+ if (logoEl != null) {
+ const href = logoEl.attributes.href || logoEl.attributes.src;
+ if (href != null) {
+ logo = new URL(href, baseUrl).toString();
+ }
+ }
+
+ return { name, logo };
+}
+
// https://indieauth.spec.indieweb.org/#client-information-discovery
// "Authorization servers SHOULD support parsing the [h-app] Microformat from the client_id,
// and if there is an [h-app] with a url property matching the client_id URL,
@@ -120,24 +145,19 @@ async function discoverClientInformation(logger: Logger, httpRequestService: Htt
}
const text = await res.text();
- const fragment = JSDOM.fragment(text);
+ const doc = htmlParser.parse(`<div>${text}</div>`);
- redirectUris.push(...[...fragment.querySelectorAll<HTMLLinkElement>('link[rel=redirect_uri][href]')].map(el => el.href));
+ redirectUris.push(...[...doc.querySelectorAll('link[rel=redirect_uri][href]')].map(el => el.attributes.href));
let name = id;
let logo: string | null = null;
if (text) {
- const microformats = mf2(text, { baseUrl: res.url });
- const correspondingProperties = microformats.items.find(item => item.type?.includes('h-app') && item.properties.url.includes(id));
- if (correspondingProperties) {
- const nameProperty = correspondingProperties.properties.name?.[0];
- if (typeof nameProperty === 'string') {
- name = nameProperty;
- }
- const logoProperty = correspondingProperties.properties.logo?.[0];
- if (typeof logoProperty === 'string') {
- logo = logoProperty;
- }
+ const microformats = parseMicroformats(doc, res.url, id);
+ if (typeof microformats.name === 'string') {
+ name = microformats.name;
+ }
+ if (typeof microformats.logo === 'string') {
+ logo = microformats.logo;
}
}
@@ -253,6 +273,7 @@ export class OAuth2ProviderService {
private usersRepository: UsersRepository,
private cacheService: CacheService,
loggerService: LoggerService,
+ private htmlTemplateService: HtmlTemplateService,
) {
this.#logger = loggerService.getLogger('oauth');
@@ -386,24 +407,16 @@ export class OAuth2ProviderService {
this.#logger.info(`Rendering authorization page for "${oauth2.client.name}"`);
reply.header('Cache-Control', 'no-store');
- return await reply.view('oauth', {
+ return await HtmlTemplateService.replyHtml(reply, OAuthPage({
+ ...await this.htmlTemplateService.getCommonData(),
transactionId: oauth2.transactionID,
clientName: oauth2.client.name,
- clientLogo: oauth2.client.logo,
- scope: oauth2.req.scope.join(' '),
- });
+ clientLogo: oauth2.client.logo ?? undefined,
+ scope: oauth2.req.scope,
+ }));
});
fastify.post('/decision', async () => { });
- fastify.register(fastifyView, {
- root: fileURLToPath(new URL('../web/views', import.meta.url)),
- engine: { pug },
- defaultContext: {
- version: this.config.version,
- config: this.config,
- },
- });
-
await fastify.register(fastifyExpress);
fastify.use('/authorize', this.#server.authorize(((areq, done) => {
(async (): Promise<Parameters<typeof done>> => {
diff --git a/packages/backend/src/server/web/ClientServerService.ts b/packages/backend/src/server/web/ClientServerService.ts
index f9d904f3cd..bcea935409 100644
--- a/packages/backend/src/server/web/ClientServerService.ts
+++ b/packages/backend/src/server/web/ClientServerService.ts
@@ -9,21 +9,16 @@ import { fileURLToPath } from 'node:url';
import { Inject, Injectable } from '@nestjs/common';
import ms from 'ms';
import sharp from 'sharp';
-import pug from 'pug';
import { In, IsNull } from 'typeorm';
import fastifyStatic from '@fastify/static';
-import fastifyView from '@fastify/view';
import fastifyProxy from '@fastify/http-proxy';
import vary from 'vary';
-import htmlSafeJsonStringify from 'htmlescape';
import type { Config } from '@/config.js';
-import { getNoteSummary } from '@/misc/get-note-summary.js';
import { DI } from '@/di-symbols.js';
import * as Acct from '@/misc/acct.js';
import { UserEntityService } from '@/core/entities/UserEntityService.js';
import { NoteEntityService } from '@/core/entities/NoteEntityService.js';
import { PageEntityService } from '@/core/entities/PageEntityService.js';
-import { MetaEntityService } from '@/core/entities/MetaEntityService.js';
import { GalleryPostEntityService } from '@/core/entities/GalleryPostEntityService.js';
import { ClipEntityService } from '@/core/entities/ClipEntityService.js';
import { ChannelEntityService } from '@/core/entities/ChannelEntityService.js';
@@ -42,14 +37,33 @@ import type {
} from '@/models/_.js';
import type Logger from '@/logger.js';
import { handleRequestRedirectToOmitSearch } from '@/misc/fastify-hook-handlers.js';
+import { htmlSafeJsonStringify } from '@/misc/json-stringify-html-safe.js';
import { bindThis } from '@/decorators.js';
import { FlashEntityService } from '@/core/entities/FlashEntityService.js';
-import { RoleService } from '@/core/RoleService.js';
import { ReversiGameEntityService } from '@/core/entities/ReversiGameEntityService.js';
import { AnnouncementEntityService } from '@/core/entities/AnnouncementEntityService.js';
import { FeedService } from './FeedService.js';
import { UrlPreviewService } from './UrlPreviewService.js';
import { ClientLoggerService } from './ClientLoggerService.js';
+import { HtmlTemplateService } from './HtmlTemplateService.js';
+
+import { BasePage } from './views/base.js';
+import { UserPage } from './views/user.js';
+import { NotePage } from './views/note.js';
+import { PagePage } from './views/page.js';
+import { ClipPage } from './views/clip.js';
+import { FlashPage } from './views/flash.js';
+import { GalleryPostPage } from './views/gallery-post.js';
+import { ChannelPage } from './views/channel.js';
+import { ReversiGamePage } from './views/reversi-game.js';
+import { AnnouncementPage } from './views/announcement.js';
+import { BaseEmbed } from './views/base-embed.js';
+import { InfoCardPage } from './views/info-card.js';
+import { BiosPage } from './views/bios.js';
+import { CliPage } from './views/cli.js';
+import { FlushPage } from './views/flush.js';
+import { ErrorPage } from './views/error.js';
+
import type { FastifyError, FastifyInstance, FastifyPluginOptions, FastifyReply } from 'fastify';
const _filename = fileURLToPath(import.meta.url);
@@ -108,7 +122,6 @@ export class ClientServerService {
private userEntityService: UserEntityService,
private noteEntityService: NoteEntityService,
private pageEntityService: PageEntityService,
- private metaEntityService: MetaEntityService,
private galleryPostEntityService: GalleryPostEntityService,
private clipEntityService: ClipEntityService,
private channelEntityService: ChannelEntityService,
@@ -116,7 +129,7 @@ export class ClientServerService {
private announcementEntityService: AnnouncementEntityService,
private urlPreviewService: UrlPreviewService,
private feedService: FeedService,
- private roleService: RoleService,
+ private htmlTemplateService: HtmlTemplateService,
private clientLoggerService: ClientLoggerService,
) {
//this.createServer = this.createServer.bind(this);
@@ -183,37 +196,9 @@ export class ClientServerService {
}
@bindThis
- private async generateCommonPugData(meta: MiMeta) {
- return {
- instanceName: meta.name ?? 'Misskey',
- icon: meta.iconUrl,
- appleTouchIcon: meta.app512IconUrl,
- themeColor: meta.themeColor,
- serverErrorImageUrl: meta.serverErrorImageUrl ?? 'https://xn--931a.moe/assets/error.jpg',
- infoImageUrl: meta.infoImageUrl ?? 'https://xn--931a.moe/assets/info.jpg',
- notFoundImageUrl: meta.notFoundImageUrl ?? 'https://xn--931a.moe/assets/not-found.jpg',
- instanceUrl: this.config.url,
- metaJson: htmlSafeJsonStringify(await this.metaEntityService.packDetailed(meta)),
- now: Date.now(),
- federationEnabled: this.meta.federation !== 'none',
- };
- }
-
- @bindThis
public createServer(fastify: FastifyInstance, options: FastifyPluginOptions, done: (err?: Error) => void) {
const configUrl = new URL(this.config.url);
- fastify.register(fastifyView, {
- root: _dirname + '/views',
- engine: {
- pug: pug,
- },
- defaultContext: {
- version: this.config.version,
- config: this.config,
- },
- });
-
fastify.addHook('onRequest', (request, reply, done) => {
// クリックジャッキング防止のためiFrameの中に入れられないようにする
reply.header('X-Frame-Options', 'DENY');
@@ -414,16 +399,15 @@ export class ClientServerService {
//#endregion
- const renderBase = async (reply: FastifyReply, data: { [key: string]: any } = {}) => {
+ const renderBase = async (reply: FastifyReply, data: Partial<Parameters<typeof BasePage>[0]> = {}) => {
reply.header('Cache-Control', 'public, max-age=30');
- return await reply.view('base', {
- img: this.meta.bannerUrl,
- url: this.config.url,
+ return await HtmlTemplateService.replyHtml(reply, BasePage({
+ img: this.meta.bannerUrl ?? undefined,
title: this.meta.name ?? 'Misskey',
- desc: this.meta.description,
- ...await this.generateCommonPugData(this.meta),
+ desc: this.meta.description ?? undefined,
+ ...await this.htmlTemplateService.getCommonData(),
...data,
- });
+ }));
};
// URL preview endpoint
@@ -505,11 +489,6 @@ export class ClientServerService {
)
) {
const profile = await this.userProfilesRepository.findOneByOrFail({ userId: user.id });
- const me = profile.fields
- ? profile.fields
- .filter(filed => filed.value != null && filed.value.match(/^https?:/))
- .map(field => field.value)
- : [];
reply.header('Cache-Control', 'public, max-age=15');
if (profile.preventAiLearning) {
@@ -522,15 +501,15 @@ export class ClientServerService {
userProfile: profile,
});
- return await reply.view('user', {
- user, profile, me,
- avatarUrl: _user.avatarUrl,
+ return await HtmlTemplateService.replyHtml(reply, UserPage({
+ user: _user,
+ profile,
sub: request.params.sub,
- ...await this.generateCommonPugData(this.meta),
- clientCtx: htmlSafeJsonStringify({
+ ...await this.htmlTemplateService.getCommonData(),
+ clientCtxJson: htmlSafeJsonStringify({
user: _user,
}),
- });
+ }));
} else {
// リモートユーザーなので
// モデレータがAPI経由で参照可能にするために404にはしない
@@ -581,17 +560,14 @@ export class ClientServerService {
reply.header('X-Robots-Tag', 'noimageai');
reply.header('X-Robots-Tag', 'noai');
}
- return await reply.view('note', {
+ return await HtmlTemplateService.replyHtml(reply, NotePage({
note: _note,
profile,
- avatarUrl: _note.user.avatarUrl,
- // TODO: Let locale changeable by instance setting
- summary: getNoteSummary(_note),
- ...await this.generateCommonPugData(this.meta),
- clientCtx: htmlSafeJsonStringify({
+ ...await this.htmlTemplateService.getCommonData(),
+ clientCtxJson: htmlSafeJsonStringify({
note: _note,
}),
- });
+ }));
} else {
return await renderBase(reply);
}
@@ -624,12 +600,11 @@ export class ClientServerService {
reply.header('X-Robots-Tag', 'noimageai');
reply.header('X-Robots-Tag', 'noai');
}
- return await reply.view('page', {
+ return await HtmlTemplateService.replyHtml(reply, PagePage({
page: _page,
profile,
- avatarUrl: _page.user.avatarUrl,
- ...await this.generateCommonPugData(this.meta),
- });
+ ...await this.htmlTemplateService.getCommonData(),
+ }));
} else {
return await renderBase(reply);
}
@@ -649,12 +624,11 @@ export class ClientServerService {
reply.header('X-Robots-Tag', 'noimageai');
reply.header('X-Robots-Tag', 'noai');
}
- return await reply.view('flash', {
+ return await HtmlTemplateService.replyHtml(reply, FlashPage({
flash: _flash,
profile,
- avatarUrl: _flash.user.avatarUrl,
- ...await this.generateCommonPugData(this.meta),
- });
+ ...await this.htmlTemplateService.getCommonData(),
+ }));
} else {
return await renderBase(reply);
}
@@ -674,15 +648,14 @@ export class ClientServerService {
reply.header('X-Robots-Tag', 'noimageai');
reply.header('X-Robots-Tag', 'noai');
}
- return await reply.view('clip', {
+ return await HtmlTemplateService.replyHtml(reply, ClipPage({
clip: _clip,
profile,
- avatarUrl: _clip.user.avatarUrl,
- ...await this.generateCommonPugData(this.meta),
- clientCtx: htmlSafeJsonStringify({
+ ...await this.htmlTemplateService.getCommonData(),
+ clientCtxJson: htmlSafeJsonStringify({
clip: _clip,
}),
- });
+ }));
} else {
return await renderBase(reply);
}
@@ -700,12 +673,11 @@ export class ClientServerService {
reply.header('X-Robots-Tag', 'noimageai');
reply.header('X-Robots-Tag', 'noai');
}
- return await reply.view('gallery-post', {
- post: _post,
+ return await HtmlTemplateService.replyHtml(reply, GalleryPostPage({
+ galleryPost: _post,
profile,
- avatarUrl: _post.user.avatarUrl,
- ...await this.generateCommonPugData(this.meta),
- });
+ ...await this.htmlTemplateService.getCommonData(),
+ }));
} else {
return await renderBase(reply);
}
@@ -720,10 +692,10 @@ export class ClientServerService {
if (channel) {
const _channel = await this.channelEntityService.pack(channel);
reply.header('Cache-Control', 'public, max-age=15');
- return await reply.view('channel', {
+ return await HtmlTemplateService.replyHtml(reply, ChannelPage({
channel: _channel,
- ...await this.generateCommonPugData(this.meta),
- });
+ ...await this.htmlTemplateService.getCommonData(),
+ }));
} else {
return await renderBase(reply);
}
@@ -738,10 +710,10 @@ export class ClientServerService {
if (game) {
const _game = await this.reversiGameEntityService.packDetail(game);
reply.header('Cache-Control', 'public, max-age=3600');
- return await reply.view('reversi-game', {
- game: _game,
- ...await this.generateCommonPugData(this.meta),
- });
+ return await HtmlTemplateService.replyHtml(reply, ReversiGamePage({
+ reversiGame: _game,
+ ...await this.htmlTemplateService.getCommonData(),
+ }));
} else {
return await renderBase(reply);
}
@@ -757,10 +729,10 @@ export class ClientServerService {
if (announcement) {
const _announcement = await this.announcementEntityService.pack(announcement);
reply.header('Cache-Control', 'public, max-age=3600');
- return await reply.view('announcement', {
+ return await HtmlTemplateService.replyHtml(reply, AnnouncementPage({
announcement: _announcement,
- ...await this.generateCommonPugData(this.meta),
- });
+ ...await this.htmlTemplateService.getCommonData(),
+ }));
} else {
return await renderBase(reply);
}
@@ -793,13 +765,13 @@ export class ClientServerService {
const _user = await this.userEntityService.pack(user);
reply.header('Cache-Control', 'public, max-age=3600');
- return await reply.view('base-embed', {
+ return await HtmlTemplateService.replyHtml(reply, BaseEmbed({
title: this.meta.name ?? 'Misskey',
- ...await this.generateCommonPugData(this.meta),
- embedCtx: htmlSafeJsonStringify({
+ ...await this.htmlTemplateService.getCommonData(),
+ embedCtxJson: htmlSafeJsonStringify({
user: _user,
}),
- });
+ }));
});
fastify.get<{ Params: { note: string; } }>('/embed/notes/:note', async (request, reply) => {
@@ -819,13 +791,13 @@ export class ClientServerService {
const _note = await this.noteEntityService.pack(note, null, { detail: true });
reply.header('Cache-Control', 'public, max-age=3600');
- return await reply.view('base-embed', {
+ return await HtmlTemplateService.replyHtml(reply, BaseEmbed({
title: this.meta.name ?? 'Misskey',
- ...await this.generateCommonPugData(this.meta),
- embedCtx: htmlSafeJsonStringify({
+ ...await this.htmlTemplateService.getCommonData(),
+ embedCtxJson: htmlSafeJsonStringify({
note: _note,
}),
- });
+ }));
});
fastify.get<{ Params: { clip: string; } }>('/embed/clips/:clip', async (request, reply) => {
@@ -840,48 +812,46 @@ export class ClientServerService {
const _clip = await this.clipEntityService.pack(clip);
reply.header('Cache-Control', 'public, max-age=3600');
- return await reply.view('base-embed', {
+ return await HtmlTemplateService.replyHtml(reply, BaseEmbed({
title: this.meta.name ?? 'Misskey',
- ...await this.generateCommonPugData(this.meta),
- embedCtx: htmlSafeJsonStringify({
+ ...await this.htmlTemplateService.getCommonData(),
+ embedCtxJson: htmlSafeJsonStringify({
clip: _clip,
}),
- });
+ }));
});
fastify.get('/embed/*', async (request, reply) => {
reply.removeHeader('X-Frame-Options');
reply.header('Cache-Control', 'public, max-age=3600');
- return await reply.view('base-embed', {
+ return await HtmlTemplateService.replyHtml(reply, BaseEmbed({
title: this.meta.name ?? 'Misskey',
- ...await this.generateCommonPugData(this.meta),
- });
+ ...await this.htmlTemplateService.getCommonData(),
+ }));
});
fastify.get('/_info_card_', async (request, reply) => {
reply.removeHeader('X-Frame-Options');
- return await reply.view('info-card', {
+ return await HtmlTemplateService.replyHtml(reply, InfoCardPage({
version: this.config.version,
- host: this.config.host,
+ config: this.config,
meta: this.meta,
- originalUsersCount: await this.usersRepository.countBy({ host: IsNull() }),
- originalNotesCount: await this.notesRepository.countBy({ userHost: IsNull() }),
- });
+ }));
});
//#endregion
fastify.get('/bios', async (request, reply) => {
- return await reply.view('bios', {
+ return await HtmlTemplateService.replyHtml(reply, BiosPage({
version: this.config.version,
- });
+ }));
});
fastify.get('/cli', async (request, reply) => {
- return await reply.view('cli', {
+ return await HtmlTemplateService.replyHtml(reply, CliPage({
version: this.config.version,
- });
+ }));
});
const override = (source: string, target: string, depth = 0) =>
@@ -904,7 +874,7 @@ export class ClientServerService {
reply.header('Clear-Site-Data', '"*"');
}
reply.header('Set-Cookie', 'http-flush-failed=1; Path=/flush; Max-Age=60');
- return await reply.view('flush');
+ return await HtmlTemplateService.replyHtml(reply, FlushPage());
});
// streamingに非WebSocketリクエストが来た場合にbase htmlをキャシュ付きで返すと、Proxy等でそのパスがキャッシュされておかしくなる
@@ -930,10 +900,10 @@ export class ClientServerService {
});
reply.code(500);
reply.header('Cache-Control', 'max-age=10, must-revalidate');
- return await reply.view('error', {
+ return await HtmlTemplateService.replyHtml(reply, ErrorPage({
code: error.code,
id: errId,
- });
+ }));
});
done();
diff --git a/packages/backend/src/server/web/HtmlTemplateService.ts b/packages/backend/src/server/web/HtmlTemplateService.ts
new file mode 100644
index 0000000000..8ff985530d
--- /dev/null
+++ b/packages/backend/src/server/web/HtmlTemplateService.ts
@@ -0,0 +1,105 @@
+/*
+ * SPDX-FileCopyrightText: syuilo and misskey-project
+ * SPDX-License-Identifier: AGPL-3.0-only
+ */
+
+import { dirname } from 'node:path';
+import { fileURLToPath } from 'node:url';
+import { promises as fsp } from 'node:fs';
+import { languages } from 'i18n/const';
+import { Injectable, Inject } from '@nestjs/common';
+import { DI } from '@/di-symbols.js';
+import { bindThis } from '@/decorators.js';
+import { htmlSafeJsonStringify } from '@/misc/json-stringify-html-safe.js';
+import { MetaEntityService } from '@/core/entities/MetaEntityService.js';
+import type { FastifyReply } from 'fastify';
+import type { Config } from '@/config.js';
+import type { MiMeta } from '@/models/Meta.js';
+import type { CommonData } from './views/_.js';
+
+const _filename = fileURLToPath(import.meta.url);
+const _dirname = dirname(_filename);
+
+const frontendVitePublic = `${_dirname}/../../../../frontend/public/`;
+const frontendEmbedVitePublic = `${_dirname}/../../../../frontend-embed/public/`;
+
+@Injectable()
+export class HtmlTemplateService {
+ private frontendBootloadersFetched = false;
+ public frontendBootloaderJs: string | null = null;
+ public frontendBootloaderCss: string | null = null;
+ public frontendEmbedBootloaderJs: string | null = null;
+ public frontendEmbedBootloaderCss: string | null = null;
+
+ constructor(
+ @Inject(DI.config)
+ private config: Config,
+
+ @Inject(DI.meta)
+ private meta: MiMeta,
+
+ private metaEntityService: MetaEntityService,
+ ) {
+ }
+
+ @bindThis
+ private async prepareFrontendBootloaders() {
+ if (this.frontendBootloadersFetched) return;
+ this.frontendBootloadersFetched = true;
+
+ const [bootJs, bootCss, embedBootJs, embedBootCss] = await Promise.all([
+ fsp.readFile(`${frontendVitePublic}loader/boot.js`, 'utf-8').catch(() => null),
+ fsp.readFile(`${frontendVitePublic}loader/style.css`, 'utf-8').catch(() => null),
+ fsp.readFile(`${frontendEmbedVitePublic}loader/boot.js`, 'utf-8').catch(() => null),
+ fsp.readFile(`${frontendEmbedVitePublic}loader/style.css`, 'utf-8').catch(() => null),
+ ]);
+
+ if (bootJs != null) {
+ this.frontendBootloaderJs = bootJs;
+ }
+
+ if (bootCss != null) {
+ this.frontendBootloaderCss = bootCss;
+ }
+
+ if (embedBootJs != null) {
+ this.frontendEmbedBootloaderJs = embedBootJs;
+ }
+
+ if (embedBootCss != null) {
+ this.frontendEmbedBootloaderCss = embedBootCss;
+ }
+ }
+
+ @bindThis
+ public async getCommonData(): Promise<CommonData> {
+ await this.prepareFrontendBootloaders();
+
+ return {
+ version: this.config.version,
+ config: this.config,
+ langs: [...languages],
+ instanceName: this.meta.name ?? 'Misskey',
+ icon: this.meta.iconUrl,
+ appleTouchIcon: this.meta.app512IconUrl,
+ themeColor: this.meta.themeColor,
+ serverErrorImageUrl: this.meta.serverErrorImageUrl ?? 'https://xn--931a.moe/assets/error.jpg',
+ infoImageUrl: this.meta.infoImageUrl ?? 'https://xn--931a.moe/assets/info.jpg',
+ notFoundImageUrl: this.meta.notFoundImageUrl ?? 'https://xn--931a.moe/assets/not-found.jpg',
+ instanceUrl: this.config.url,
+ metaJson: htmlSafeJsonStringify(await this.metaEntityService.packDetailed(this.meta)),
+ now: Date.now(),
+ federationEnabled: this.meta.federation !== 'none',
+ frontendBootloaderJs: this.frontendBootloaderJs,
+ frontendBootloaderCss: this.frontendBootloaderCss,
+ frontendEmbedBootloaderJs: this.frontendEmbedBootloaderJs,
+ frontendEmbedBootloaderCss: this.frontendEmbedBootloaderCss,
+ };
+ }
+
+ public static async replyHtml(reply: FastifyReply, html: string | Promise<string>) {
+ reply.header('Content-Type', 'text/html; charset=utf-8');
+ const _html = await html;
+ return reply.send(_html);
+ }
+}
diff --git a/packages/backend/src/server/web/UrlPreviewService.ts b/packages/backend/src/server/web/UrlPreviewService.ts
index b9a4015031..bd1dbb430c 100644
--- a/packages/backend/src/server/web/UrlPreviewService.ts
+++ b/packages/backend/src/server/web/UrlPreviewService.ts
@@ -4,8 +4,7 @@
*/
import { Inject, Injectable } from '@nestjs/common';
-import { summaly } from '@misskey-dev/summaly';
-import { SummalyResult } from '@misskey-dev/summaly/built/summary.js';
+import type { SummalyResult } from '@misskey-dev/summaly/built/summary.js';
import { DI } from '@/di-symbols.js';
import type { Config } from '@/config.js';
import { HttpRequestService } from '@/core/HttpRequestService.js';
@@ -113,7 +112,7 @@ export class UrlPreviewService {
}
}
- private fetchSummary(url: string, meta: MiMeta, lang?: string): Promise<SummalyResult> {
+ private async fetchSummary(url: string, meta: MiMeta, lang?: string): Promise<SummalyResult> {
const agent = this.config.proxy
? {
http: this.httpRequestService.httpAgent,
@@ -121,6 +120,8 @@ export class UrlPreviewService {
}
: undefined;
+ const { summaly } = await import('@misskey-dev/summaly');
+
return summaly(url, {
followRedirects: this.meta.urlPreviewAllowRedirect,
lang: lang ?? 'ja-JP',
diff --git a/packages/backend/src/server/web/views/_.ts b/packages/backend/src/server/web/views/_.ts
new file mode 100644
index 0000000000..ac7418f362
--- /dev/null
+++ b/packages/backend/src/server/web/views/_.ts
@@ -0,0 +1,49 @@
+/*
+ * SPDX-FileCopyrightText: syuilo and misskey-project
+ * SPDX-License-Identifier: AGPL-3.0-only
+ */
+
+import type { Config } from '@/config.js';
+
+export const comment = `<!--
+ _____ _ _
+ | |_|___ ___| |_ ___ _ _
+ | | | | |_ -|_ -| '_| -_| | |
+ |_|_|_|_|___|___|_,_|___|_ |
+ |___|
+ Thank you for using Misskey!
+ If you are reading this message... how about joining the development?
+ https://github.com/misskey-dev/misskey
+
+-->`;
+
+export const defaultDescription = '✨🌎✨ A interplanetary communication platform ✨🚀✨';
+
+export type MinimumCommonData = {
+ version: string;
+ config: Config;
+};
+
+export type CommonData = MinimumCommonData & {
+ langs: string[];
+ instanceName: string;
+ icon: string | null;
+ appleTouchIcon: string | null;
+ themeColor: string | null;
+ serverErrorImageUrl: string;
+ infoImageUrl: string;
+ notFoundImageUrl: string;
+ instanceUrl: string;
+ now: number;
+ federationEnabled: boolean;
+ frontendBootloaderJs: string | null;
+ frontendBootloaderCss: string | null;
+ frontendEmbedBootloaderJs: string | null;
+ frontendEmbedBootloaderCss: string | null;
+ metaJson?: string;
+ clientCtxJson?: string;
+};
+
+export type CommonPropsMinimum<T = Record<string, any>> = MinimumCommonData & T;
+
+export type CommonProps<T = Record<string, any>> = CommonData & T;
diff --git a/packages/backend/src/server/web/views/_splash.tsx b/packages/backend/src/server/web/views/_splash.tsx
new file mode 100644
index 0000000000..ea79b8d61d
--- /dev/null
+++ b/packages/backend/src/server/web/views/_splash.tsx
@@ -0,0 +1,26 @@
+/*
+ * SPDX-FileCopyrightText: syuilo and misskey-project
+ * SPDX-License-Identifier: AGPL-3.0-only
+ */
+
+export function Splash(props: {
+ icon?: string | null;
+}) {
+ return (
+ <div id="splash">
+ <img id="splashIcon" src={props.icon || '/static-assets/splash.png'} />
+ <div id="splashSpinner">
+ <svg class="spinner bg" viewBox="0 0 152 152" xmlns="http://www.w3.org/2000/svg">
+ <g transform="matrix(1,0,0,1,12,12)">
+ <circle cx="64" cy="64" r="64" style="fill:none;stroke:currentColor;stroke-width:24px;"/>
+ </g>
+ </svg>
+ <svg class="spinner fg" viewBox="0 0 152 152" xmlns="http://www.w3.org/2000/svg">
+ <g transform="matrix(1,0,0,1,12,12)">
+ <path d="M128,64C128,28.654 99.346,0 64,0C99.346,0 128,28.654 128,64Z" style="fill:none;stroke:currentColor;stroke-width:24px;"/>
+ </g>
+ </svg>
+ </div>
+ </div>
+ );
+}
diff --git a/packages/backend/src/server/web/views/announcement.pug b/packages/backend/src/server/web/views/announcement.pug
deleted file mode 100644
index 7a4052e8a4..0000000000
--- a/packages/backend/src/server/web/views/announcement.pug
+++ /dev/null
@@ -1,21 +0,0 @@
-extends ./base
-
-block vars
- - const title = announcement.title;
- - const description = announcement.text.length > 100 ? announcement.text.slice(0, 100) + '…' : announcement.text;
- - const url = `${config.url}/announcements/${announcement.id}`;
-
-block title
- = `${title} | ${instanceName}`
-
-block desc
- meta(name='description' content=description)
-
-block og
- meta(property='og:type' content='article')
- meta(property='og:title' content= title)
- meta(property='og:description' content= description)
- meta(property='og:url' content= url)
- if announcement.imageUrl
- meta(property='og:image' content=announcement.imageUrl)
- meta(property='twitter:card' content='summary_large_image')
diff --git a/packages/backend/src/server/web/views/announcement.tsx b/packages/backend/src/server/web/views/announcement.tsx
new file mode 100644
index 0000000000..bc1c808177
--- /dev/null
+++ b/packages/backend/src/server/web/views/announcement.tsx
@@ -0,0 +1,41 @@
+/*
+ * SPDX-FileCopyrightText: syuilo and misskey-project
+ * SPDX-License-Identifier: AGPL-3.0-only
+ */
+
+import type { Packed } from '@/misc/json-schema.js';
+import type { CommonProps } from '@/server/web/views/_.js';
+import { Layout } from '@/server/web/views/base.js';
+
+export function AnnouncementPage(props: CommonProps<{
+ announcement: Packed<'Announcement'>;
+}>) {
+ const description = props.announcement.text.length > 100 ? props.announcement.text.slice(0, 100) + '…' : props.announcement.text;
+
+ function ogBlock() {
+ return (
+ <>
+ <meta property="og:type" content="article" />
+ <meta property="og:title" content={props.announcement.title} />
+ <meta property="og:description" content={description} />
+ <meta property="og:url" content={`${props.config.url}/announcements/${props.announcement.id}`} />
+ {props.announcement.imageUrl ? (
+ <>
+ <meta property="og:image" content={props.announcement.imageUrl} />
+ <meta property="twitter:card" content="summary_large_image" />
+ </>
+ ) : null}
+ </>
+ );
+ }
+
+ return (
+ <Layout
+ {...props}
+ title={`${props.announcement.title} | ${props.instanceName}`}
+ desc={description}
+ ogSlot={ogBlock()}
+ >
+ </Layout>
+ );
+}
diff --git a/packages/backend/src/server/web/views/base-embed.pug b/packages/backend/src/server/web/views/base-embed.pug
deleted file mode 100644
index 29de86b8b6..0000000000
--- a/packages/backend/src/server/web/views/base-embed.pug
+++ /dev/null
@@ -1,71 +0,0 @@
-block vars
-
-block loadClientEntry
- - const entry = config.frontendEmbedEntry;
-
-doctype html
-
-html(class='embed')
-
- head
- meta(charset='utf-8')
- meta(name='application-name' content='Misskey')
- meta(name='referrer' content='origin')
- meta(name='theme-color' content= themeColor || '#86b300')
- meta(name='theme-color-orig' content= themeColor || '#86b300')
- meta(property='og:site_name' content= instanceName || 'Misskey')
- meta(property='instance_url' content= instanceUrl)
- meta(name='viewport' content='width=device-width, initial-scale=1')
- meta(name='format-detection' content='telephone=no,date=no,address=no,email=no,url=no')
- link(rel='icon' href= icon || '/favicon.ico')
- link(rel='apple-touch-icon' href= appleTouchIcon || '/apple-touch-icon.png')
-
- if !config.frontendEmbedManifestExists
- script(type="module" src="/embed_vite/@vite/client")
-
- if Array.isArray(entry.css)
- each href in entry.css
- link(rel='stylesheet' href=`/embed_vite/${href}`)
-
- title
- block title
- = title || 'Misskey'
-
- block meta
- meta(name='robots' content='noindex')
-
- style
- include ../style.embed.css
-
- script.
- var VERSION = "#{version}";
- var CLIENT_ENTRY = !{JSON.stringify(entry.file)};
-
- script(type='application/json' id='misskey_meta' data-generated-at=now)
- != metaJson
-
- script(type='application/json' id='misskey_embedCtx' data-generated-at=now)
- != embedCtx
-
- script
- include ../boot.embed.js
-
- body
- noscript: p
- | JavaScriptを有効にしてください
- br
- | Please turn on your JavaScript
- div#splash
- img#splashIcon(src= icon || '/static-assets/splash.png')
- div#splashSpinner
- <svg class="spinner bg" viewBox="0 0 152 152" xmlns="http://www.w3.org/2000/svg">
- <g transform="matrix(1,0,0,1,12,12)">
- <circle cx="64" cy="64" r="64" style="fill:none;stroke:currentColor;stroke-width:24px;"/>
- </g>
- </svg>
- <svg class="spinner fg" viewBox="0 0 152 152" xmlns="http://www.w3.org/2000/svg">
- <g transform="matrix(1,0,0,1,12,12)">
- <path d="M128,64C128,28.654 99.346,0 64,0C99.346,0 128,28.654 128,64Z" style="fill:none;stroke:currentColor;stroke-width:24px;"/>
- </g>
- </svg>
- block content
diff --git a/packages/backend/src/server/web/views/base-embed.tsx b/packages/backend/src/server/web/views/base-embed.tsx
new file mode 100644
index 0000000000..011b66592e
--- /dev/null
+++ b/packages/backend/src/server/web/views/base-embed.tsx
@@ -0,0 +1,88 @@
+/*
+ * SPDX-FileCopyrightText: syuilo and misskey-project
+ * SPDX-License-Identifier: AGPL-3.0-only
+ */
+
+import { comment } from '@/server/web/views/_.js';
+import type { CommonProps } from '@/server/web/views/_.js';
+import { Splash } from '@/server/web/views/_splash.js';
+import type { PropsWithChildren, Children } from '@kitajs/html';
+
+export function BaseEmbed(props: PropsWithChildren<CommonProps<{
+ title?: string;
+ noindex?: boolean;
+ desc?: string;
+ img?: string;
+ serverErrorImageUrl?: string;
+ infoImageUrl?: string;
+ notFoundImageUrl?: string;
+ metaJson?: string;
+ embedCtxJson?: string;
+
+ titleSlot?: Children;
+ metaSlot?: Children;
+}>>) {
+ const now = Date.now();
+
+ // 変数名をsafeで始めることでエラーをスキップ
+ const safeMetaJson = props.metaJson;
+ const safeEmbedCtxJson = props.embedCtxJson;
+
+ return (
+ <>
+ {'<!DOCTYPE html>'}
+ {comment}
+ <html>
+ <head>
+ <meta charset="UTF-8" />
+ <meta name="application-name" content="Misskey" />
+ <meta name="referer" content="origin" />
+ <meta name="theme-color" content={props.themeColor ?? '#86b300'} />
+ <meta name="theme-color-orig" content={props.themeColor ?? '#86b300'} />
+ <meta property="og:site_name" content={props.instanceName || 'Misskey'} />
+ <meta property="instance_url" content={props.instanceUrl} />
+ <meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1, maximum-scale=1, user-scalable=no, viewport-fit=cover" />
+ <meta name="format-detection" content="telephone=no,date=no,address=no,email=no,url=no" />
+ <link rel="icon" href={props.icon ?? '/favicon.ico'} />
+ <link rel="apple-touch-icon" href={props.appleTouchIcon ?? '/apple-touch-icon.png'} />
+
+ {!props.config.frontendEmbedManifestExists ? <script type="module" src="/embed_vite/@vite/client"></script> : null}
+
+ {props.config.frontendEmbedEntry.css != null ? props.config.frontendEmbedEntry.css.map((href) => (
+ <link rel="stylesheet" href={`/embed_vite/${href}`} />
+ )) : null}
+
+ {props.titleSlot ?? <title safe>{props.title || 'Misskey'}</title>}
+
+ {props.metaSlot}
+
+ <meta name="robots" content="noindex" />
+
+ {props.frontendEmbedBootloaderCss != null ? <style safe>{props.frontendEmbedBootloaderCss}</style> : <link rel="stylesheet" href="/embed_vite/loader/style.css" />}
+
+ <script>
+ const VERSION = '{props.version}';
+ const CLIENT_ENTRY = {JSON.stringify(props.config.frontendEmbedEntry.file)};
+ const LANGS = {JSON.stringify(props.langs)};
+ </script>
+
+ {safeMetaJson != null ? <script type="application/json" id="misskey_meta" data-generated-at={now}>{safeMetaJson}</script> : null}
+ {safeEmbedCtxJson != null ? <script type="application/json" id="misskey_embedCtx" data-generated-at={now}>{safeEmbedCtxJson}</script> : null}
+
+ {props.frontendEmbedBootloaderJs != null ? <script>{props.frontendEmbedBootloaderJs}</script> : <script src="/embed_vite/loader/boot.js"></script>}
+ </head>
+ <body>
+ <noscript>
+ <p>
+ JavaScriptを有効にしてください<br />
+ Please turn on your JavaScript
+ </p>
+ </noscript>
+ <Splash icon={props.icon} />
+ {props.children}
+ </body>
+ </html>
+ </>
+ );
+}
+
diff --git a/packages/backend/src/server/web/views/base.pug b/packages/backend/src/server/web/views/base.pug
deleted file mode 100644
index 46b365a9c7..0000000000
--- a/packages/backend/src/server/web/views/base.pug
+++ /dev/null
@@ -1,100 +0,0 @@
-block vars
-
-block loadClientEntry
- - const entry = config.frontendEntry;
- - const baseUrl = config.url;
-
-doctype html
-
-//
- -
- _____ _ _
- | |_|___ ___| |_ ___ _ _
- | | | | |_ -|_ -| '_| -_| | |
- |_|_|_|_|___|___|_,_|___|_ |
- |___|
- Thank you for using Misskey!
- If you are reading this message... how about joining the development?
- https://github.com/misskey-dev/misskey
-
-
-html
-
- head
- meta(charset='utf-8')
- meta(name='application-name' content='Misskey')
- meta(name='referrer' content='origin')
- meta(name='theme-color' content= themeColor || '#86b300')
- meta(name='theme-color-orig' content= themeColor || '#86b300')
- meta(property='og:site_name' content= instanceName || 'Misskey')
- meta(property='instance_url' content= instanceUrl)
- meta(name='viewport' content='width=device-width, initial-scale=1, minimum-scale=1, maximum-scale=1, user-scalable=no, viewport-fit=cover')
- meta(name='format-detection' content='telephone=no,date=no,address=no,email=no,url=no')
- link(rel='icon' href= icon || '/favicon.ico')
- link(rel='apple-touch-icon' href= appleTouchIcon || '/apple-touch-icon.png')
- link(rel='manifest' href='/manifest.json')
- link(rel='search' type='application/opensearchdescription+xml' title=(title || "Misskey") href=`${baseUrl}/opensearch.xml`)
- link(rel='prefetch' href=serverErrorImageUrl)
- link(rel='prefetch' href=infoImageUrl)
- link(rel='prefetch' href=notFoundImageUrl)
-
- if !config.frontendManifestExists
- script(type="module" src="/vite/@vite/client")
-
- if Array.isArray(entry.css)
- each href in entry.css
- link(rel='stylesheet' href=`/vite/${href}`)
-
- title
- block title
- = title || 'Misskey'
-
- if noindex
- meta(name='robots' content='noindex')
-
- block desc
- meta(name='description' content= desc || '✨🌎✨ A interplanetary communication platform ✨🚀✨')
-
- block meta
-
- block og
- meta(property='og:title' content= title || 'Misskey')
- meta(property='og:description' content= desc || '✨🌎✨ A interplanetary communication platform ✨🚀✨')
- meta(property='og:image' content= img)
- meta(property='twitter:card' content='summary')
-
- style
- include ../style.css
-
- script.
- var VERSION = "#{version}";
- var CLIENT_ENTRY = !{JSON.stringify(entry.file)};
-
- script(type='application/json' id='misskey_meta' data-generated-at=now)
- != metaJson
-
- script(type='application/json' id='misskey_clientCtx' data-generated-at=now)
- != clientCtx
-
- script
- include ../boot.js
-
- body
- noscript: p
- | JavaScriptを有効にしてください
- br
- | Please turn on your JavaScript
- div#splash
- img#splashIcon(src= icon || '/static-assets/splash.png')
- div#splashSpinner
- <svg class="spinner bg" viewBox="0 0 152 152" xmlns="http://www.w3.org/2000/svg">
- <g transform="matrix(1,0,0,1,12,12)">
- <circle cx="64" cy="64" r="64" style="fill:none;stroke:currentColor;stroke-width:24px;"/>
- </g>
- </svg>
- <svg class="spinner fg" viewBox="0 0 152 152" xmlns="http://www.w3.org/2000/svg">
- <g transform="matrix(1,0,0,1,12,12)">
- <path d="M128,64C128,28.654 99.346,0 64,0C99.346,0 128,28.654 128,64Z" style="fill:none;stroke:currentColor;stroke-width:24px;"/>
- </g>
- </svg>
- block content
diff --git a/packages/backend/src/server/web/views/base.tsx b/packages/backend/src/server/web/views/base.tsx
new file mode 100644
index 0000000000..6fa3395fb8
--- /dev/null
+++ b/packages/backend/src/server/web/views/base.tsx
@@ -0,0 +1,108 @@
+/*
+ * SPDX-FileCopyrightText: syuilo and misskey-project
+ * SPDX-License-Identifier: AGPL-3.0-only
+ */
+
+import { comment, defaultDescription } from '@/server/web/views/_.js';
+import { Splash } from '@/server/web/views/_splash.js';
+import type { CommonProps } from '@/server/web/views/_.js';
+import type { PropsWithChildren, Children } from '@kitajs/html';
+
+export function Layout(props: PropsWithChildren<CommonProps<{
+ title?: string;
+ noindex?: boolean;
+ desc?: string;
+ img?: string;
+ serverErrorImageUrl?: string;
+ infoImageUrl?: string;
+ notFoundImageUrl?: string;
+ metaJson?: string;
+ clientCtxJson?: string;
+
+ titleSlot?: Children;
+ descSlot?: Children;
+ metaSlot?: Children;
+ ogSlot?: Children;
+}>>) {
+ const now = Date.now();
+
+ // 変数名をsafeで始めることでエラーをスキップ
+ const safeMetaJson = props.metaJson;
+ const safeClientCtxJson = props.clientCtxJson;
+
+ return (
+ <>
+ {'<!DOCTYPE html>'}
+ {comment}
+ <html>
+ <head>
+ <meta charset="UTF-8" />
+ <meta name="application-name" content="Misskey" />
+ <meta name="referer" content="origin" />
+ <meta name="theme-color" content={props.themeColor ?? '#86b300'} />
+ <meta name="theme-color-orig" content={props.themeColor ?? '#86b300'} />
+ <meta property="og:site_name" content={props.instanceName || 'Misskey'} />
+ <meta property="instance_url" content={props.instanceUrl} />
+ <meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1, maximum-scale=1, user-scalable=no, viewport-fit=cover" />
+ <meta name="format-detection" content="telephone=no,date=no,address=no,email=no,url=no" />
+ <link rel="icon" href={props.icon || '/favicon.ico'} />
+ <link rel="apple-touch-icon" href={props.appleTouchIcon || '/apple-touch-icon.png'} />
+ <link rel="manifest" href="/manifest.json" />
+ <link rel="search" type="application/opensearchdescription+xml" title={props.title || 'Misskey'} href={`${props.config.url}/opensearch.xml`} />
+ {props.serverErrorImageUrl != null ? <link rel="prefetch" as="image" href={props.serverErrorImageUrl} /> : null}
+ {props.infoImageUrl != null ? <link rel="prefetch" as="image" href={props.infoImageUrl} /> : null}
+ {props.notFoundImageUrl != null ? <link rel="prefetch" as="image" href={props.notFoundImageUrl} /> : null}
+
+ {!props.config.frontendManifestExists ? <script type="module" src="/vite/@vite/client"></script> : null}
+
+ {props.config.frontendEntry.css != null ? props.config.frontendEntry.css.map((href) => (
+ <link rel="stylesheet" href={`/vite/${href}`} />
+ )) : null}
+
+ {props.titleSlot ?? <title safe>{props.title || 'Misskey'}</title>}
+
+ {props.noindex ? <meta name="robots" content="noindex" /> : null}
+
+ {props.descSlot ?? (props.desc != null ? <meta name="description" content={props.desc || defaultDescription} /> : null)}
+
+ {props.metaSlot}
+
+ {props.ogSlot ?? (
+ <>
+ <meta property="og:title" content={props.title || 'Misskey'} />
+ <meta property="og:description" content={props.desc || defaultDescription} />
+ {props.img != null ? <meta property="og:image" content={props.img} /> : null}
+ <meta property="twitter:card" content="summary" />
+ </>
+ )}
+
+ {props.frontendBootloaderCss != null ? <style safe>{props.frontendBootloaderCss}</style> : <link rel="stylesheet" href="/vite/loader/style.css" />}
+
+ <script>
+ const VERSION = '{props.version}';
+ const CLIENT_ENTRY = {JSON.stringify(props.config.frontendEntry.file)};
+ const LANGS = {JSON.stringify(props.langs)};
+ </script>
+
+ {safeMetaJson != null ? <script type="application/json" id="misskey_meta" data-generated-at={now}>{safeMetaJson}</script> : null}
+ {safeClientCtxJson != null ? <script type="application/json" id="misskey_clientCtx" data-generated-at={now}>{safeClientCtxJson}</script> : null}
+
+ {props.frontendBootloaderJs != null ? <script>{props.frontendBootloaderJs}</script> : <script src="/vite/loader/boot.js"></script>}
+ </head>
+ <body>
+ <noscript>
+ <p>
+ JavaScriptを有効にしてください<br />
+ Please turn on your JavaScript
+ </p>
+ </noscript>
+ <Splash icon={props.icon} />
+ {props.children}
+ </body>
+ </html>
+ </>
+ );
+}
+
+export { Layout as BasePage };
+
diff --git a/packages/backend/src/server/web/views/bios.pug b/packages/backend/src/server/web/views/bios.pug
deleted file mode 100644
index 39a151a29b..0000000000
--- a/packages/backend/src/server/web/views/bios.pug
+++ /dev/null
@@ -1,20 +0,0 @@
-doctype html
-
-html
-
- head
- meta(charset='utf-8')
- meta(name='application-name' content='Misskey')
- title Misskey Repair Tool
- style
- include ../bios.css
- script
- include ../bios.js
-
- body
- header
- h1 Misskey Repair Tool #{version}
- main
- div.tabs
- button#ls edit local storage
- div#content
diff --git a/packages/backend/src/server/web/views/bios.tsx b/packages/backend/src/server/web/views/bios.tsx
new file mode 100644
index 0000000000..9010de8d75
--- /dev/null
+++ b/packages/backend/src/server/web/views/bios.tsx
@@ -0,0 +1,35 @@
+/*
+ * SPDX-FileCopyrightText: syuilo and misskey-project
+ * SPDX-License-Identifier: AGPL-3.0-only
+ */
+
+export function BiosPage(props: {
+ version: string;
+}) {
+ return (
+ <>
+ {'<!DOCTYPE html>'}
+ <html>
+ <head>
+ <meta charset="UTF-8" />
+ <meta name="application-name" content="Misskey" />
+ <title>Misskey Repair Tool</title>
+ <link rel="stylesheet" href="/static-assets/misc/bios.css" />
+ </head>
+
+ <body>
+ <header>
+ <h1 safe>Misskey Repair Tool {props.version}</h1>
+ </header>
+ <main>
+ <div class="tabs">
+ <button id="ls">edit local storage</button>
+ </div>
+ <div id="content"></div>
+ </main>
+ <script src="/static-assets/misc/bios.js"></script>
+ </body>
+ </html>
+ </>
+ );
+}
diff --git a/packages/backend/src/server/web/views/channel.pug b/packages/backend/src/server/web/views/channel.pug
deleted file mode 100644
index c514025e0b..0000000000
--- a/packages/backend/src/server/web/views/channel.pug
+++ /dev/null
@@ -1,19 +0,0 @@
-extends ./base
-
-block vars
- - const title = channel.name;
- - const url = `${config.url}/channels/${channel.id}`;
-
-block title
- = `${title} | ${instanceName}`
-
-block desc
- meta(name='description' content= channel.description)
-
-block og
- meta(property='og:type' content='article')
- meta(property='og:title' content= title)
- meta(property='og:description' content= channel.description)
- meta(property='og:url' content= url)
- meta(property='og:image' content= channel.bannerUrl)
- meta(property='twitter:card' content='summary')
diff --git a/packages/backend/src/server/web/views/channel.tsx b/packages/backend/src/server/web/views/channel.tsx
new file mode 100644
index 0000000000..7d8123ea85
--- /dev/null
+++ b/packages/backend/src/server/web/views/channel.tsx
@@ -0,0 +1,40 @@
+/*
+ * SPDX-FileCopyrightText: syuilo and misskey-project
+ * SPDX-License-Identifier: AGPL-3.0-only
+ */
+
+import type { Packed } from '@/misc/json-schema.js';
+import type { CommonProps } from '@/server/web/views/_.js';
+import { Layout } from '@/server/web/views/base.js';
+
+export function ChannelPage(props: CommonProps<{
+ channel: Packed<'Channel'>;
+}>) {
+
+ function ogBlock() {
+ return (
+ <>
+ <meta property="og:type" content="website" />
+ <meta property="og:title" content={props.channel.name} />
+ {props.channel.description != null ? <meta property="og:description" content={props.channel.description} /> : null}
+ <meta property="og:url" content={`${props.config.url}/channels/${props.channel.id}`} />
+ {props.channel.bannerUrl ? (
+ <>
+ <meta property="og:image" content={props.channel.bannerUrl} />
+ <meta property="twitter:card" content="summary" />
+ </>
+ ) : null}
+ </>
+ );
+ }
+
+ return (
+ <Layout
+ {...props}
+ title={`${props.channel.name} | ${props.instanceName}`}
+ desc={props.channel.description ?? undefined}
+ ogSlot={ogBlock()}
+ >
+ </Layout>
+ );
+}
diff --git a/packages/backend/src/server/web/views/cli.pug b/packages/backend/src/server/web/views/cli.pug
deleted file mode 100644
index d2cf7c4335..0000000000
--- a/packages/backend/src/server/web/views/cli.pug
+++ /dev/null
@@ -1,21 +0,0 @@
-doctype html
-
-html
-
- head
- meta(charset='utf-8')
- meta(name='application-name' content='Misskey')
- title Misskey Cli
- style
- include ../cli.css
- script
- include ../cli.js
-
- body
- header
- h1 Misskey Cli #{version}
- main
- div#form
- textarea#text
- button#submit submit
- div#tl
diff --git a/packages/backend/src/server/web/views/cli.tsx b/packages/backend/src/server/web/views/cli.tsx
new file mode 100644
index 0000000000..009d982b35
--- /dev/null
+++ b/packages/backend/src/server/web/views/cli.tsx
@@ -0,0 +1,37 @@
+/*
+ * SPDX-FileCopyrightText: syuilo and misskey-project
+ * SPDX-License-Identifier: AGPL-3.0-only
+ */
+
+export function CliPage(props: {
+ version: string;
+}) {
+ return (
+ <>
+ {'<!DOCTYPE html>'}
+ <html>
+ <head>
+ <meta charset="UTF-8" />
+ <meta name="application-name" content="Misskey" />
+ <title>Misskey CLI Tool</title>
+
+ <link rel="stylesheet" href="/static-assets/misc/cli.css" />
+ </head>
+
+ <body>
+ <header>
+ <h1 safe>Misskey CLI {props.version}</h1>
+ </header>
+ <main>
+ <div id="form">
+ <textarea id="text"></textarea>
+ <button id="submit">Submit</button>
+ </div>
+ <div id="tl"></div>
+ </main>
+ <script src="/static-assets/misc/cli.js"></script>
+ </body>
+ </html>
+ </>
+ );
+}
diff --git a/packages/backend/src/server/web/views/clip.pug b/packages/backend/src/server/web/views/clip.pug
deleted file mode 100644
index 5a0018803a..0000000000
--- a/packages/backend/src/server/web/views/clip.pug
+++ /dev/null
@@ -1,35 +0,0 @@
-extends ./base
-
-block vars
- - const user = clip.user;
- - const title = clip.name;
- - const url = `${config.url}/clips/${clip.id}`;
-
-block title
- = `${title} | ${instanceName}`
-
-block desc
- meta(name='description' content= clip.description)
-
-block og
- meta(property='og:type' content='article')
- meta(property='og:title' content= title)
- meta(property='og:description' content= clip.description)
- meta(property='og:url' content= url)
- meta(property='og:image' content= avatarUrl)
- meta(property='twitter:card' content='summary')
-
-block meta
- if profile.noCrawle
- meta(name='robots' content='noindex')
- if profile.preventAiLearning
- meta(name='robots' content='noimageai')
- meta(name='robots' content='noai')
-
- meta(name='misskey:user-username' content=user.username)
- meta(name='misskey:user-id' content=user.id)
- meta(name='misskey:clip-id' content=clip.id)
-
- // todo
- if user.twitter
- meta(name='twitter:creator' content=`@${user.twitter.screenName}`)
diff --git a/packages/backend/src/server/web/views/clip.tsx b/packages/backend/src/server/web/views/clip.tsx
new file mode 100644
index 0000000000..c3cc505e35
--- /dev/null
+++ b/packages/backend/src/server/web/views/clip.tsx
@@ -0,0 +1,59 @@
+/*
+ * SPDX-FileCopyrightText: syuilo and misskey-project
+ * SPDX-License-Identifier: AGPL-3.0-only
+ */
+
+import type { Packed } from '@/misc/json-schema.js';
+import type { MiUserProfile } from '@/models/UserProfile.js';
+import type { CommonProps } from '@/server/web/views/_.js';
+import { Layout } from '@/server/web/views/base.js';
+
+export function ClipPage(props: CommonProps<{
+ clip: Packed<'Clip'>;
+ profile: MiUserProfile;
+}>) {
+ function ogBlock() {
+ return (
+ <>
+ <meta property="og:type" content="article" />
+ <meta property="og:title" content={props.clip.name} />
+ {props.clip.description != null ? <meta property="og:description" content={props.clip.description} /> : null}
+ <meta property="og:url" content={`${props.config.url}/clips/${props.clip.id}`} />
+ {props.clip.user.avatarUrl ? (
+ <>
+ <meta property="og:image" content={props.clip.user.avatarUrl} />
+ <meta property="twitter:card" content="summary" />
+ </>
+ ) : null}
+ </>
+ );
+ }
+
+ function metaBlock() {
+ return (
+ <>
+ {props.profile.noCrawle ? <meta name="robots" content="noindex" /> : null}
+ {props.profile.preventAiLearning ? (
+ <>
+ <meta name="robots" content="noimageai" />
+ <meta name="robots" content="noai" />
+ </>
+ ) : null}
+ <meta name="misskey:user-username" content={props.clip.user.username} />
+ <meta name="misskey:user-id" content={props.clip.user.id} />
+ <meta name="misskey:clip-id" content={props.clip.id} />
+ </>
+ );
+ }
+
+ return (
+ <Layout
+ {...props}
+ title={`${props.clip.name} | ${props.instanceName}`}
+ desc={props.clip.description ?? ''}
+ metaSlot={metaBlock()}
+ ogSlot={ogBlock()}
+ >
+ </Layout>
+ );
+}
diff --git a/packages/backend/src/server/web/views/error.pug b/packages/backend/src/server/web/views/error.pug
deleted file mode 100644
index 6a78d1878c..0000000000
--- a/packages/backend/src/server/web/views/error.pug
+++ /dev/null
@@ -1,71 +0,0 @@
-doctype html
-
-//
- -
- _____ _ _
- | |_|___ ___| |_ ___ _ _
- | | | | |_ -|_ -| '_| -_| | |
- |_|_|_|_|___|___|_,_|___|_ |
- |___|
- Thank you for using Misskey!
- If you are reading this message... how about joining the development?
- https://github.com/misskey-dev/misskey
-
-
-html
-
- head
- meta(charset='utf-8')
- meta(name='viewport' content='width=device-width, initial-scale=1')
- meta(name='application-name' content='Misskey')
- meta(name='referrer' content='origin')
-
- title
- block title
- = 'An error has occurred... | Misskey'
-
- style
- include ../error.css
-
- script
- include ../error.js
-
-body
- svg.icon-warning(xmlns="http://www.w3.org/2000/svg", viewBox="0 0 24 24", stroke-width="2", stroke="currentColor", fill="none", stroke-linecap="round", stroke-linejoin="round")
- path(stroke="none", d="M0 0h24v24H0z", fill="none")
- path(d="M12 9v2m0 4v.01")
- path(d="M5 19h14a2 2 0 0 0 1.84 -2.75l-7.1 -12.25a2 2 0 0 0 -3.5 0l-7.1 12.25a2 2 0 0 0 1.75 2.75")
-
- h1(data-i18n="title") Failed to initialize Misskey
-
- button.button-big(onclick="location.reload();")
- span.button-label-big(data-i18n-reload) Reload
-
- p(data-i18n="serverError") If reloading after a period of time does not resolve the problem, contact the server administrator with the following ERROR ID.
-
- div#errors
- code.
- ERROR CODE: #{code}
- ERROR ID: #{id}
-
- p
- b(data-i18n="solution") The following actions may solve the problem.
-
- p(data-i18n="solution1") Update your os and browser
- p(data-i18n="solution2") Disable an adblocker
- p(data-i18n="solution3") Clear your browser cache
- p(data-i18n="solution4") (Tor Browser) Set dom.webaudio.enabled to true
-
- details(style="color: #86b300;")
- summary(data-i18n="otherOption") Other options
- a(href="/flush")
- button.button-small
- span.button-label-small(data-i18n="otherOption1") Clear preferences and cache
- br
- a(href="/cli")
- button.button-small
- span.button-label-small(data-i18n="otherOption2") Start the simple client
- br
- a(href="/bios")
- button.button-small
- span.button-label-small(data-i18n="otherOption3") Start the repair tool
diff --git a/packages/backend/src/server/web/views/error.tsx b/packages/backend/src/server/web/views/error.tsx
new file mode 100644
index 0000000000..9d0e60aa30
--- /dev/null
+++ b/packages/backend/src/server/web/views/error.tsx
@@ -0,0 +1,89 @@
+/*
+ * SPDX-FileCopyrightText: syuilo and misskey-project
+ * SPDX-License-Identifier: AGPL-3.0-only
+ */
+
+import { comment } from '@/server/web/views/_.js';
+import type { CommonPropsMinimum } from '@/server/web/views/_.js';
+
+export function ErrorPage(props: {
+ title?: string;
+ code: string;
+ id: string;
+}) {
+ return (
+ <>
+ {'<!DOCTYPE html>'}
+ {comment}
+ <html>
+ <head>
+ <meta charset="UTF-8" />
+ <meta name="application-name" content="Misskey" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+ <meta name="referrer" content="origin" />
+ <title safe>{props.title ?? 'An error has occurred... | Misskey'}</title>
+ <link rel="stylesheet" href="/static-assets/misc/error.css" />
+ <script src="/static-assets/misc/error.js"></script>
+ </head>
+ <body>
+ <svg
+ class="icon-warning"
+ xmlns="http://www.w3.org/2000/svg"
+ viewBox="0 0 24 24"
+ stroke-width="2"
+ stroke="currentColor"
+ fill="none"
+ stroke-linecap="round"
+ stroke-linejoin="round"
+ >
+ <path stroke="none" d="M0 0h24v24H0z" fill="none" />
+ <path d="M12 9v2m0 4v.01" />
+ <path d="M5 19h14a2 2 0 0 0 1.84 -2.75l-7.1 -12.25a2 2 0 0 0 -3.5 0l-7.1 12.25a2 2 0 0 0 1.75 2.75" />
+ </svg>
+ <h1 data-i18n="title">Failed to initialize Misskey</h1>
+
+ <button class="button-big" onclick="location.reload();">
+ <span class="button-label-big" data-i18n="reload">Reload</span>
+ </button>
+
+ <p data-i18n="serverError">
+ If reloading after a period of time does not resolve the problem, contact the server administrator with the following ERROR ID.
+ </p>
+
+ <div id="errors">
+ <code safe>
+ ERROR CODE: {props.code}<br />
+ ERROR ID: {props.id}
+ </code>
+ </div>
+
+ <p><b data-i18n="solution">The following actions may solve the problem.</b></p>
+
+ <p data-i18n="solution1">Update your os and browser</p>
+ <p data-i18n="solution2">Disable an adblocker</p>
+ <p data-i18n="solution3">Clear your browser cache</p>
+ <p data-i18n="solution4">(Tor Browser) Set dom.webaudio.enabled to true</p>
+
+ <details style="color: #86b300;">
+ <summary data-i18n="otherOption">Other options</summary>
+ <a href="/flush">
+ <button class="button-small">
+ <span class="button-label-small" data-i18n="otherOption1">Clear preferences and cache</span>
+ </button>
+ </a>
+ <a href="/cli">
+ <button class="button-small">
+ <span class="button-label-small" data-i18n="otherOption2">Start the simple client</span>
+ </button>
+ </a>
+ <a href="/bios">
+ <button class="button-small">
+ <span class="button-label-small" data-i18n="otherOption3">Start the repair tool</span>
+ </button>
+ </a>
+ </details>
+ </body>
+ </html>
+ </>
+ );
+}
diff --git a/packages/backend/src/server/web/views/flash.pug b/packages/backend/src/server/web/views/flash.pug
deleted file mode 100644
index 1549aa7906..0000000000
--- a/packages/backend/src/server/web/views/flash.pug
+++ /dev/null
@@ -1,35 +0,0 @@
-extends ./base
-
-block vars
- - const user = flash.user;
- - const title = flash.title;
- - const url = `${config.url}/play/${flash.id}`;
-
-block title
- = `${title} | ${instanceName}`
-
-block desc
- meta(name='description' content= flash.summary)
-
-block og
- meta(property='og:type' content='article')
- meta(property='og:title' content= title)
- meta(property='og:description' content= flash.summary)
- meta(property='og:url' content= url)
- meta(property='og:image' content= avatarUrl)
- meta(property='twitter:card' content='summary')
-
-block meta
- if profile.noCrawle
- meta(name='robots' content='noindex')
- if profile.preventAiLearning
- meta(name='robots' content='noimageai')
- meta(name='robots' content='noai')
-
- meta(name='misskey:user-username' content=user.username)
- meta(name='misskey:user-id' content=user.id)
- meta(name='misskey:flash-id' content=flash.id)
-
- // todo
- if user.twitter
- meta(name='twitter:creator' content=`@${user.twitter.screenName}`)
diff --git a/packages/backend/src/server/web/views/flash.tsx b/packages/backend/src/server/web/views/flash.tsx
new file mode 100644
index 0000000000..25a6b2c0ae
--- /dev/null
+++ b/packages/backend/src/server/web/views/flash.tsx
@@ -0,0 +1,59 @@
+/*
+ * SPDX-FileCopyrightText: syuilo and misskey-project
+ * SPDX-License-Identifier: AGPL-3.0-only
+ */
+
+import type { Packed } from '@/misc/json-schema.js';
+import type { MiUserProfile } from '@/models/UserProfile.js';
+import type { CommonProps } from '@/server/web/views/_.js';
+import { Layout } from '@/server/web/views/base.js';
+
+export function FlashPage(props: CommonProps<{
+ flash: Packed<'Flash'>;
+ profile: MiUserProfile;
+}>) {
+ function ogBlock() {
+ return (
+ <>
+ <meta property="og:type" content="article" />
+ <meta property="og:title" content={props.flash.title} />
+ <meta property="og:description" content={props.flash.summary} />
+ <meta property="og:url" content={`${props.config.url}/play/${props.flash.id}`} />
+ {props.flash.user.avatarUrl ? (
+ <>
+ <meta property="og:image" content={props.flash.user.avatarUrl} />
+ <meta property="twitter:card" content="summary" />
+ </>
+ ) : null}
+ </>
+ );
+ }
+
+ function metaBlock() {
+ return (
+ <>
+ {props.profile.noCrawle ? <meta name="robots" content="noindex" /> : null}
+ {props.profile.preventAiLearning ? (
+ <>
+ <meta name="robots" content="noimageai" />
+ <meta name="robots" content="noai" />
+ </>
+ ) : null}
+ <meta name="misskey:user-username" content={props.flash.user.username} />
+ <meta name="misskey:user-id" content={props.flash.user.id} />
+ <meta name="misskey:flash-id" content={props.flash.id} />
+ </>
+ );
+ }
+
+ return (
+ <Layout
+ {...props}
+ title={`${props.flash.title} | ${props.instanceName}`}
+ desc={props.flash.summary}
+ metaSlot={metaBlock()}
+ ogSlot={ogBlock()}
+ >
+ </Layout>
+ );
+}
diff --git a/packages/backend/src/server/web/views/flush.pug b/packages/backend/src/server/web/views/flush.pug
deleted file mode 100644
index 7884495d08..0000000000
--- a/packages/backend/src/server/web/views/flush.pug
+++ /dev/null
@@ -1,51 +0,0 @@
-doctype html
-
-html
- #msg
- script.
- const msg = document.getElementById('msg');
- const successText = `\nSuccess Flush! <a href="/">Back to Misskey</a>\n成功しました。<a href="/">Misskeyを開き直してください。</a>`;
-
- if (!document.cookie) {
- message('Your site data is fully cleared by your browser.');
- message(successText);
- } else {
- message('Your browser does not support Clear-Site-Data header. Start opportunistic flushing.');
- (async function() {
- try {
- localStorage.clear();
- message('localStorage cleared.');
-
- const idbPromises = ['MisskeyClient', 'keyval-store'].map((name, i, arr) => new Promise((res, rej) => {
- const delidb = indexedDB.deleteDatabase(name);
- delidb.onsuccess = () => res(message(`indexedDB "${name}" cleared. (${i + 1}/${arr.length})`));
- delidb.onerror = e => rej(e)
- }));
-
- await Promise.all(idbPromises);
-
- if (navigator.serviceWorker.controller) {
- navigator.serviceWorker.controller.postMessage('clear');
- await navigator.serviceWorker.getRegistrations()
- .then(registrations => {
- return Promise.all(registrations.map(registration => registration.unregister()));
- })
- .catch(e => { throw new Error(e) });
- }
-
- message(successText);
- } catch (e) {
- message(`\n${e}\n\nFlush Failed. <a href="/flush">Please retry.</a>\n失敗しました。<a href="/flush">もう一度試してみてください。</a>`);
- message(`\nIf you retry more than 3 times, try manually clearing the browser cache or contact to instance admin.\n3回以上試しても失敗する場合、ブラウザのキャッシュを手動で消去し、それでもだめならインスタンス管理者に連絡してみてください。\n`)
-
- console.error(e);
- setTimeout(() => {
- location = '/';
- }, 10000)
- }
- })();
- }
-
- function message(text) {
- msg.insertAdjacentHTML('beforeend', `<p>[${(new Date()).toString()}] ${text.replace(/\n/g,'<br>')}</p>`)
- }
diff --git a/packages/backend/src/server/web/views/flush.tsx b/packages/backend/src/server/web/views/flush.tsx
new file mode 100644
index 0000000000..f3fdc8fcb0
--- /dev/null
+++ b/packages/backend/src/server/web/views/flush.tsx
@@ -0,0 +1,23 @@
+/*
+ * SPDX-FileCopyrightText: syuilo and misskey-project
+ * SPDX-License-Identifier: AGPL-3.0-only
+ */
+
+export function FlushPage(props?: {}) {
+ return (
+ <>
+ {'<!DOCTYPE html>'}
+ <html>
+ <head>
+ <meta charset="UTF-8" />
+ <meta name="application-name" content="Misskey" />
+ <title>Clear preferences and cache</title>
+ </head>
+ <body>
+ <div id="msg"></div>
+ <script src="/static-assets/misc/flush.js"></script>
+ </body>
+ </html>
+ </>
+ );
+}
diff --git a/packages/backend/src/server/web/views/gallery-post.pug b/packages/backend/src/server/web/views/gallery-post.pug
deleted file mode 100644
index 9ae25d9ac8..0000000000
--- a/packages/backend/src/server/web/views/gallery-post.pug
+++ /dev/null
@@ -1,41 +0,0 @@
-extends ./base
-
-block vars
- - const user = post.user;
- - const title = post.title;
- - const url = `${config.url}/gallery/${post.id}`;
-
-block title
- = `${title} | ${instanceName}`
-
-block desc
- meta(name='description' content= post.description)
-
-block og
- meta(property='og:type' content='article')
- meta(property='og:title' content= title)
- meta(property='og:description' content= post.description)
- meta(property='og:url' content= url)
- if post.isSensitive
- meta(property='og:image' content= avatarUrl)
- meta(property='twitter:card' content='summary')
- else
- meta(property='og:image' content= post.files[0].thumbnailUrl)
- meta(property='twitter:card' content='summary_large_image')
-
-block meta
- if user.host || profile.noCrawle
- meta(name='robots' content='noindex')
- if profile.preventAiLearning
- meta(name='robots' content='noimageai')
- meta(name='robots' content='noai')
-
- meta(name='misskey:user-username' content=user.username)
- meta(name='misskey:user-id' content=user.id)
-
- // todo
- if user.twitter
- meta(name='twitter:creator' content=`@${user.twitter.screenName}`)
-
- if !user.host
- link(rel='alternate' href=url type='application/activity+json')
diff --git a/packages/backend/src/server/web/views/gallery-post.tsx b/packages/backend/src/server/web/views/gallery-post.tsx
new file mode 100644
index 0000000000..2bec2de930
--- /dev/null
+++ b/packages/backend/src/server/web/views/gallery-post.tsx
@@ -0,0 +1,65 @@
+/*
+ * SPDX-FileCopyrightText: syuilo and misskey-project
+ * SPDX-License-Identifier: AGPL-3.0-only
+ */
+
+import type { Packed } from '@/misc/json-schema.js';
+import type { MiUserProfile } from '@/models/UserProfile.js';
+import type { CommonProps } from '@/server/web/views/_.js';
+import { Layout } from '@/server/web/views/base.js';
+
+export function GalleryPostPage(props: CommonProps<{
+ galleryPost: Packed<'GalleryPost'>;
+ profile: MiUserProfile;
+}>) {
+ function ogBlock() {
+ return (
+ <>
+ <meta property="og:type" content="article" />
+ <meta property="og:title" content={props.galleryPost.title} />
+ {props.galleryPost.description != null ? <meta property="og:description" content={props.galleryPost.description} /> : null}
+ <meta property="og:url" content={`${props.config.url}/gallery/${props.galleryPost.id}`} />
+ {props.galleryPost.isSensitive && props.galleryPost.user.avatarUrl ? (
+ <>
+ <meta property="og:image" content={props.galleryPost.user.avatarUrl} />
+ <meta property="twitter:card" content="summary" />
+ </>
+ ) : null}
+ {!props.galleryPost.isSensitive && props.galleryPost.files != null ? (
+ <>
+ <meta property="og:image" content={props.galleryPost.files[0]!.thumbnailUrl ?? props.galleryPost.files[0]!.url} />
+ <meta property="twitter:card" content="summary_large_image" />
+ </>
+ ) : null}
+ </>
+ );
+ }
+
+ function metaBlock() {
+ return (
+ <>
+ {props.profile.noCrawle ? <meta name="robots" content="noindex" /> : null}
+ {props.profile.preventAiLearning ? (
+ <>
+ <meta name="robots" content="noimageai" />
+ <meta name="robots" content="noai" />
+ </>
+ ) : null}
+ <meta name="misskey:user-username" content={props.galleryPost.user.username} />
+ <meta name="misskey:user-id" content={props.galleryPost.user.id} />
+ <meta name="misskey:gallery-post-id" content={props.galleryPost.id} />
+ </>
+ );
+ }
+
+ return (
+ <Layout
+ {...props}
+ title={`${props.galleryPost.title} | ${props.instanceName}`}
+ desc={props.galleryPost.description ?? ''}
+ metaSlot={metaBlock()}
+ ogSlot={ogBlock()}
+ >
+ </Layout>
+ );
+}
diff --git a/packages/backend/src/server/web/views/info-card.pug b/packages/backend/src/server/web/views/info-card.pug
deleted file mode 100644
index 2a4954ec8b..0000000000
--- a/packages/backend/src/server/web/views/info-card.pug
+++ /dev/null
@@ -1,50 +0,0 @@
-doctype html
-
-html
-
- head
- meta(charset='utf-8')
- meta(name='application-name' content='Misskey')
- title= meta.name || host
- style.
- html, body {
- margin: 0;
- padding: 0;
- min-height: 100vh;
- background: #fff;
- }
-
- #a {
- display: block;
- }
-
- #banner {
- background-size: cover;
- background-position: center center;
- }
-
- #title {
- display: inline-block;
- margin: 24px;
- padding: 0.5em 0.8em;
- color: #fff;
- background: rgba(0, 0, 0, 0.5);
- font-weight: bold;
- font-size: 1.3em;
- }
-
- #content {
- overflow: auto;
- color: #353c3e;
- }
-
- #description {
- margin: 24px;
- }
-
- body
- a#a(href=`https://${host}` target="_blank")
- header#banner(style=`background-image: url(${meta.bannerUrl})`)
- div#title= meta.name || host
- div#content
- div#description!= meta.description
diff --git a/packages/backend/src/server/web/views/info-card.tsx b/packages/backend/src/server/web/views/info-card.tsx
new file mode 100644
index 0000000000..27be4c69e8
--- /dev/null
+++ b/packages/backend/src/server/web/views/info-card.tsx
@@ -0,0 +1,40 @@
+/*
+ * SPDX-FileCopyrightText: syuilo and misskey-project
+ * SPDX-License-Identifier: AGPL-3.0-only
+ */
+
+import { comment, CommonPropsMinimum } from '@/server/web/views/_.js';
+import type { MiMeta } from '@/models/Meta.js';
+
+export function InfoCardPage(props: CommonPropsMinimum<{
+ meta: MiMeta;
+}>) {
+ // 変数名をsafeで始めることでエラーをスキップ
+ const safeDescription = props.meta.description;
+
+ return (
+ <>
+ {'<!DOCTYPE html>'}
+ {comment}
+ <html>
+ <head>
+ <meta charset="UTF-8" />
+ <meta name="application-name" content="Misskey" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+ <title safe>{props.meta.name ?? props.config.url}</title>
+ <link rel="stylesheet" href="/static-assets/misc/info-card.css" />
+ </head>
+ <body>
+ <a id="a" href={props.config.url} target="_blank" rel="noopener noreferrer">
+ <header id="banner" style={props.meta.bannerUrl != null ? `background-image: url(${props.meta.bannerUrl});` : ''}>
+ <div id="title" safe>{props.meta.name ?? props.config.url}</div>
+ </header>
+ </a>
+ <div id="content">
+ <div id="description">{safeDescription}</div>
+ </div>
+ </body>
+ </html>
+ </>
+ );
+}
diff --git a/packages/backend/src/server/web/views/note.pug b/packages/backend/src/server/web/views/note.pug
deleted file mode 100644
index ea1993aed0..0000000000
--- a/packages/backend/src/server/web/views/note.pug
+++ /dev/null
@@ -1,62 +0,0 @@
-extends ./base
-
-block vars
- - const user = note.user;
- - const title = user.name ? `${user.name} (@${user.username}${user.host ? `@${user.host}` : ''})` : `@${user.username}${user.host ? `@${user.host}` : ''}`;
- - const url = `${config.url}/notes/${note.id}`;
- - const isRenote = note.renote && note.text == null && note.fileIds.length == 0 && note.poll == null;
- - const images = (note.files || []).filter(file => file.type.startsWith('image/') && !file.isSensitive)
- - const videos = (note.files || []).filter(file => file.type.startsWith('video/') && !file.isSensitive)
-
-block title
- = `${title} | ${instanceName}`
-
-block desc
- meta(name='description' content= summary)
-
-block og
- meta(property='og:type' content='article')
- meta(property='og:title' content= title)
- meta(property='og:description' content= summary)
- meta(property='og:url' content= url)
- if videos.length
- each video in videos
- meta(property='og:video:url' content= video.url)
- meta(property='og:video:secure_url' content= video.url)
- meta(property='og:video:type' content= video.type)
- // FIXME: add width and height
- // FIXME: add embed player for Twitter
- if images.length
- meta(property='twitter:card' content='summary_large_image')
- each image in images
- meta(property='og:image' content= image.url)
- else
- meta(property='twitter:card' content='summary')
- meta(property='og:image' content= avatarUrl)
-
-
-block meta
- if user.host || isRenote || profile.noCrawle
- meta(name='robots' content='noindex')
- if profile.preventAiLearning
- meta(name='robots' content='noimageai')
- meta(name='robots' content='noai')
-
- meta(name='misskey:user-username' content=user.username)
- meta(name='misskey:user-id' content=user.id)
- meta(name='misskey:note-id' content=note.id)
-
- // todo
- if user.twitter
- meta(name='twitter:creator' content=`@${user.twitter.screenName}`)
-
- if note.prev
- link(rel='prev' href=`${config.url}/notes/${note.prev}`)
- if note.next
- link(rel='next' href=`${config.url}/notes/${note.next}`)
-
- if federationEnabled
- if !user.host
- link(rel='alternate' href=url type='application/activity+json')
- if note.uri
- link(rel='alternate' href=note.uri type='application/activity+json')
diff --git a/packages/backend/src/server/web/views/note.tsx b/packages/backend/src/server/web/views/note.tsx
new file mode 100644
index 0000000000..803c3d2537
--- /dev/null
+++ b/packages/backend/src/server/web/views/note.tsx
@@ -0,0 +1,94 @@
+/*
+ * SPDX-FileCopyrightText: syuilo and misskey-project
+ * SPDX-License-Identifier: AGPL-3.0-only
+ */
+
+import type { Packed } from '@/misc/json-schema.js';
+import type { MiUserProfile } from '@/models/UserProfile.js';
+import type { CommonProps } from '@/server/web/views/_.js';
+import { Layout } from '@/server/web/views/base.js';
+import { isRenotePacked } from '@/misc/is-renote.js';
+import { getNoteSummary } from '@/misc/get-note-summary.js';
+
+export function NotePage(props: CommonProps<{
+ note: Packed<'Note'>;
+ profile: MiUserProfile;
+}>) {
+ const title = props.note.user.name ? `${props.note.user.name} (@${props.note.user.username}${props.note.user.host ? `@${props.note.user.host}` : ''})` : `@${props.note.user.username}${props.note.user.host ? `@${props.note.user.host}` : ''}`
+ const isRenote = isRenotePacked(props.note);
+ const images = (props.note.files ?? []).filter(f => f.type.startsWith('image/'));
+ const videos = (props.note.files ?? []).filter(f => f.type.startsWith('video/'));
+ const summary = getNoteSummary(props.note);
+
+ function ogBlock() {
+ return (
+ <>
+ <meta property="og:type" content="article" />
+ <meta property="og:title" content={title} />
+ <meta property="og:description" content={summary} />
+ <meta property="og:url" content={`${props.config.url}/notes/${props.note.id}`} />
+ {videos.map(video => (
+ <>
+ <meta property="og:video:url" content={video.url} />
+ <meta property="og:video:secure_url" content={video.url} />
+ <meta property="og:video:type" content={video.type} />
+ {video.thumbnailUrl ? <meta property="og:video:image" content={video.thumbnailUrl} /> : null}
+ {video.properties.width != null ? <meta property="og:video:width" content={video.properties.width.toString()} /> : null}
+ {video.properties.height != null ? <meta property="og:video:height" content={video.properties.height.toString()} /> : null}
+ </>
+ ))}
+ {images.length > 0 ? (
+ <>
+ <meta property="twitter:card" content="summary_large_image" />
+ {images.map(image => (
+ <>
+ <meta property="og:image" content={image.url} />
+ {image.properties.width != null ? <meta property="og:image:width" content={image.properties.width.toString()} /> : null}
+ {image.properties.height != null ? <meta property="og:image:height" content={image.properties.height.toString()} /> : null}
+ </>
+ ))}
+ </>
+ ) : (
+ <>
+ <meta property="twitter:card" content="summary" />
+ <meta property="og:image" content={props.note.user.avatarUrl} />
+ </>
+ )}
+ </>
+ );
+ }
+
+ function metaBlock() {
+ return (
+ <>
+ {props.note.user.host != null || isRenote || props.profile.noCrawle ? <meta name="robots" content="noindex" /> : null}
+ {props.profile.preventAiLearning ? (
+ <>
+ <meta name="robots" content="noimageai" />
+ <meta name="robots" content="noai" />
+ </>
+ ) : null}
+ <meta name="misskey:user-username" content={props.note.user.username} />
+ <meta name="misskey:user-id" content={props.note.user.id} />
+ <meta name="misskey:note-id" content={props.note.id} />
+
+ {props.federationEnabled ? (
+ <>
+ {props.note.user.host == null ? <link rel="alternate" type="application/activity+json" href={`${props.config.url}/notes/${props.note.id}`} /> : null}
+ {props.note.uri != null ? <link rel="alternate" type="application/activity+json" href={props.note.uri} /> : null}
+ </>
+ ) : null}
+ </>
+ );
+ }
+
+ return (
+ <Layout
+ {...props}
+ title={`${title} | ${props.instanceName}`}
+ desc={summary}
+ metaSlot={metaBlock()}
+ ogSlot={ogBlock()}
+ ></Layout>
+ )
+}
diff --git a/packages/backend/src/server/web/views/oauth.pug b/packages/backend/src/server/web/views/oauth.pug
deleted file mode 100644
index 4195ccc3a3..0000000000
--- a/packages/backend/src/server/web/views/oauth.pug
+++ /dev/null
@@ -1,11 +0,0 @@
-extends ./base
-
-block meta
- //- Should be removed by the page when it loads, so that it won't needlessly
- //- stay when user navigates away via the navigation bar
- //- XXX: Remove navigation bar in auth page?
- meta(name='misskey:oauth:transaction-id' content=transactionId)
- meta(name='misskey:oauth:client-name' content=clientName)
- if clientLogo
- meta(name='misskey:oauth:client-logo' content=clientLogo)
- meta(name='misskey:oauth:scope' content=scope)
diff --git a/packages/backend/src/server/web/views/oauth.tsx b/packages/backend/src/server/web/views/oauth.tsx
new file mode 100644
index 0000000000..d12b0d15fd
--- /dev/null
+++ b/packages/backend/src/server/web/views/oauth.tsx
@@ -0,0 +1,37 @@
+/*
+ * SPDX-FileCopyrightText: syuilo and misskey-project
+ * SPDX-License-Identifier: AGPL-3.0-only
+ */
+
+import type { CommonProps } from '@/server/web/views/_.js';
+import { Layout } from '@/server/web/views/base.js';
+
+export function OAuthPage(props: CommonProps<{
+ transactionId: string;
+ clientName: string;
+ clientLogo?: string;
+ scope: string[];
+}>) {
+
+ //- Should be removed by the page when it loads, so that it won't needlessly
+ //- stay when user navigates away via the navigation bar
+ //- XXX: Remove navigation bar in auth page?
+ function metaBlock() {
+ return (
+ <>
+ <meta name="misskey:oauth:transaction-id" content={props.transactionId} />
+ <meta name="misskey:oauth:client-name" content={props.clientName} />
+ {props.clientLogo ? <meta name="misskey:oauth:client-logo" content={props.clientLogo} /> : null}
+ <meta name="misskey:oauth:scope" content={props.scope.join(' ')} />
+ </>
+ );
+ }
+
+ return (
+ <Layout
+ {...props}
+ metaSlot={metaBlock()}
+ >
+ </Layout>
+ );
+}
diff --git a/packages/backend/src/server/web/views/page.pug b/packages/backend/src/server/web/views/page.pug
deleted file mode 100644
index 03c50eca8a..0000000000
--- a/packages/backend/src/server/web/views/page.pug
+++ /dev/null
@@ -1,35 +0,0 @@
-extends ./base
-
-block vars
- - const user = page.user;
- - const title = page.title;
- - const url = `${config.url}/@${user.username}/pages/${page.name}`;
-
-block title
- = `${title} | ${instanceName}`
-
-block desc
- meta(name='description' content= page.summary)
-
-block og
- meta(property='og:type' content='article')
- meta(property='og:title' content= title)
- meta(property='og:description' content= page.summary)
- meta(property='og:url' content= url)
- meta(property='og:image' content= page.eyeCatchingImage ? page.eyeCatchingImage.thumbnailUrl : avatarUrl)
- meta(property='twitter:card' content= page.eyeCatchingImage ? 'summary_large_image' : 'summary')
-
-block meta
- if profile.noCrawle
- meta(name='robots' content='noindex')
- if profile.preventAiLearning
- meta(name='robots' content='noimageai')
- meta(name='robots' content='noai')
-
- meta(name='misskey:user-username' content=user.username)
- meta(name='misskey:user-id' content=user.id)
- meta(name='misskey:page-id' content=page.id)
-
- // todo
- if user.twitter
- meta(name='twitter:creator' content=`@${user.twitter.screenName}`)
diff --git a/packages/backend/src/server/web/views/page.tsx b/packages/backend/src/server/web/views/page.tsx
new file mode 100644
index 0000000000..d0484612df
--- /dev/null
+++ b/packages/backend/src/server/web/views/page.tsx
@@ -0,0 +1,64 @@
+/*
+ * SPDX-FileCopyrightText: syuilo and misskey-project
+ * SPDX-License-Identifier: AGPL-3.0-only
+ */
+
+import type { Packed } from '@/misc/json-schema.js';
+import type { MiUserProfile } from '@/models/UserProfile.js';
+import type { CommonProps } from '@/server/web/views/_.js';
+import { Layout } from '@/server/web/views/base.js';
+
+export function PagePage(props: CommonProps<{
+ page: Packed<'Page'>;
+ profile: MiUserProfile;
+}>) {
+ function ogBlock() {
+ return (
+ <>
+ <meta property="og:type" content="article" />
+ <meta property="og:title" content={props.page.title} />
+ {props.page.summary != null ? <meta property="og:description" content={props.page.summary} /> : null}
+ <meta property="og:url" content={`${props.config.url}/pages/${props.page.id}`} />
+ {props.page.eyeCatchingImage != null ? (
+ <>
+ <meta property="og:image" content={props.page.eyeCatchingImage.thumbnailUrl ?? props.page.eyeCatchingImage.url} />
+ <meta property="twitter:card" content="summary_large_image" />
+ </>
+ ) : props.page.user.avatarUrl ? (
+ <>
+ <meta property="og:image" content={props.page.user.avatarUrl} />
+ <meta property="twitter:card" content="summary" />
+ </>
+ ) : null}
+ </>
+ );
+ }
+
+ function metaBlock() {
+ return (
+ <>
+ {props.profile.noCrawle ? <meta name="robots" content="noindex" /> : null}
+ {props.profile.preventAiLearning ? (
+ <>
+ <meta name="robots" content="noimageai" />
+ <meta name="robots" content="noai" />
+ </>
+ ) : null}
+ <meta name="misskey:user-username" content={props.page.user.username} />
+ <meta name="misskey:user-id" content={props.page.user.id} />
+ <meta name="misskey:page-id" content={props.page.id} />
+ </>
+ );
+ }
+
+ return (
+ <Layout
+ {...props}
+ title={`${props.page.title} | ${props.instanceName}`}
+ desc={props.page.summary ?? ''}
+ metaSlot={metaBlock()}
+ ogSlot={ogBlock()}
+ >
+ </Layout>
+ );
+}
diff --git a/packages/backend/src/server/web/views/reversi-game.pug b/packages/backend/src/server/web/views/reversi-game.pug
deleted file mode 100644
index 0b5ffb2bb0..0000000000
--- a/packages/backend/src/server/web/views/reversi-game.pug
+++ /dev/null
@@ -1,20 +0,0 @@
-extends ./base
-
-block vars
- - const user1 = game.user1;
- - const user2 = game.user2;
- - const title = `${user1.username} vs ${user2.username}`;
- - const url = `${config.url}/reversi/g/${game.id}`;
-
-block title
- = `${title} | ${instanceName}`
-
-block desc
- meta(name='description' content='⚫⚪Misskey Reversi⚪⚫')
-
-block og
- meta(property='og:type' content='article')
- meta(property='og:title' content= title)
- meta(property='og:description' content='⚫⚪Misskey Reversi⚪⚫')
- meta(property='og:url' content= url)
- meta(property='twitter:card' content='summary')
diff --git a/packages/backend/src/server/web/views/reversi-game.tsx b/packages/backend/src/server/web/views/reversi-game.tsx
new file mode 100644
index 0000000000..22609311fd
--- /dev/null
+++ b/packages/backend/src/server/web/views/reversi-game.tsx
@@ -0,0 +1,37 @@
+/*
+ * SPDX-FileCopyrightText: syuilo and misskey-project
+ * SPDX-License-Identifier: AGPL-3.0-only
+ */
+
+import type { Packed } from '@/misc/json-schema.js';
+import type { CommonProps } from '@/server/web/views/_.js';
+import { Layout } from '@/server/web/views/base.js';
+
+export function ReversiGamePage(props: CommonProps<{
+ reversiGame: Packed<'ReversiGameDetailed'>;
+}>) {
+ const title = `${props.reversiGame.user1.username} vs ${props.reversiGame.user2.username}`;
+ const description = `⚫⚪Misskey Reversi⚪⚫`;
+
+ function ogBlock() {
+ return (
+ <>
+ <meta property="og:type" content="article" />
+ <meta property="og:title" content={title} />
+ <meta property="og:description" content={description} />
+ <meta property="og:url" content={`${props.config.url}/reversi/g/${props.reversiGame.id}`} />
+ <meta property="twitter:card" content="summary" />
+ </>
+ );
+ }
+
+ return (
+ <Layout
+ {...props}
+ title={`${title} | ${props.instanceName}`}
+ desc={description}
+ ogSlot={ogBlock()}
+ >
+ </Layout>
+ );
+}
diff --git a/packages/backend/src/server/web/views/user.pug b/packages/backend/src/server/web/views/user.pug
deleted file mode 100644
index b9f740f5b6..0000000000
--- a/packages/backend/src/server/web/views/user.pug
+++ /dev/null
@@ -1,44 +0,0 @@
-extends ./base
-
-block vars
- - const title = user.name ? `${user.name} (@${user.username}${user.host ? `@${user.host}` : ''})` : `@${user.username}${user.host ? `@${user.host}` : ''}`;
- - const url = `${config.url}/@${(user.host ? `${user.username}@${user.host}` : user.username)}`;
-
-block title
- = `${title} | ${instanceName}`
-
-block desc
- meta(name='description' content= profile.description)
-
-block og
- meta(property='og:type' content='blog')
- meta(property='og:title' content= title)
- meta(property='og:description' content= profile.description)
- meta(property='og:url' content= url)
- meta(property='og:image' content= avatarUrl)
- meta(property='twitter:card' content='summary')
-
-block meta
- if user.host || profile.noCrawle
- meta(name='robots' content='noindex')
- if profile.preventAiLearning
- meta(name='robots' content='noimageai')
- meta(name='robots' content='noai')
-
- meta(name='misskey:user-username' content=user.username)
- meta(name='misskey:user-id' content=user.id)
-
- if profile.twitter
- meta(name='twitter:creator' content=`@${profile.twitter.screenName}`)
-
- if !sub
- if federationEnabled
- if !user.host
- link(rel='alternate' href=`${config.url}/users/${user.id}` type='application/activity+json')
- if user.uri
- link(rel='alternate' href=user.uri type='application/activity+json')
- if profile.url
- link(rel='alternate' href=profile.url type='text/html')
-
- each m in me
- link(rel='me' href=`${m}`)
diff --git a/packages/backend/src/server/web/views/user.tsx b/packages/backend/src/server/web/views/user.tsx
new file mode 100644
index 0000000000..76c2633ab9
--- /dev/null
+++ b/packages/backend/src/server/web/views/user.tsx
@@ -0,0 +1,74 @@
+/*
+ * SPDX-FileCopyrightText: syuilo and misskey-project
+ * SPDX-License-Identifier: AGPL-3.0-only
+ */
+
+import type { Packed } from '@/misc/json-schema.js';
+import type { MiUserProfile } from '@/models/UserProfile.js';
+import type { CommonProps } from '@/server/web/views/_.js';
+import { Layout } from '@/server/web/views/base.js';
+
+export function UserPage(props: CommonProps<{
+ user: Packed<'UserDetailed'>;
+ profile: MiUserProfile;
+ sub?: string;
+}>) {
+ const title = props.user.name ? `${props.user.name} (@${props.user.username}${props.user.host ? `@${props.user.host}` : ''})` : `@${props.user.username}${props.user.host ? `@${props.user.host}` : ''}`;
+ const me = props.profile.fields
+ ? props.profile.fields
+ .filter(field => field.value != null && field.value.match(/^https?:/))
+ .map(field => field.value)
+ : [];
+
+ function ogBlock() {
+ return (
+ <>
+ <meta property="og:type" content="blog" />
+ <meta property="og:title" content={title} />
+ {props.user.description != null ? <meta property="og:description" content={props.user.description} /> : null}
+ <meta property="og:url" content={`${props.config.url}/@${props.user.username}`} />
+ <meta property="og:image" content={props.user.avatarUrl} />
+ <meta property="twitter:card" content="summary" />
+ </>
+ );
+ }
+
+ function metaBlock() {
+ return (
+ <>
+ {props.user.host != null || props.profile.noCrawle ? <meta name="robots" content="noindex" /> : null}
+ {props.profile.preventAiLearning ? (
+ <>
+ <meta name="robots" content="noimageai" />
+ <meta name="robots" content="noai" />
+ </>
+ ) : null}
+ <meta name="misskey:user-username" content={props.user.username} />
+ <meta name="misskey:user-id" content={props.user.id} />
+
+ {props.sub == null && props.federationEnabled ? (
+ <>
+ {props.user.host == null ? <link rel="alternate" type="application/activity+json" href={`${props.config.url}/users/${props.user.id}`} /> : null}
+ {props.user.uri != null ? <link rel="alternate" type="application/activity+json" href={props.user.uri} /> : null}
+ {props.profile.url != null ? <link rel="alternate" type="text/html" href={props.profile.url} /> : null}
+ </>
+ ) : null}
+
+ {me.map((url) => (
+ <link rel="me" href={url} />
+ ))}
+ </>
+ );
+ }
+
+ return (
+ <Layout
+ {...props}
+ title={`${props.user.name || props.user.username} (@${props.user.username}) | ${props.instanceName}`}
+ desc={props.user.description ?? ''}
+ metaSlot={metaBlock()}
+ ogSlot={ogBlock()}
+ >
+ </Layout>
+ );
+}
diff --git a/packages/backend/test-federation/.config/dummy.yml b/packages/backend/test-federation/.config/dummy.yml
new file mode 100644
index 0000000000..841cab9783
--- /dev/null
+++ b/packages/backend/test-federation/.config/dummy.yml
@@ -0,0 +1,2 @@
+url: https://example.com/
+port: 3000
diff --git a/packages/backend/test-federation/.config/example.config.json b/packages/backend/test-federation/.config/example.config.json
new file mode 100644
index 0000000000..2035d1a200
--- /dev/null
+++ b/packages/backend/test-federation/.config/example.config.json
@@ -0,0 +1,29 @@
+{
+ "url": "https://${HOST}/",
+ "port": 3000,
+ "db": {
+ "host": "db.${HOST}",
+ "port": 5432,
+ "db": "misskey",
+ "user": "postgres",
+ "pass": "postgres"
+ },
+ "dbReplications": false,
+ "trustProxy": true,
+ "redis": {
+ "host": "redis.test",
+ "port": 6379
+ },
+ "id": "aidx",
+ "proxyBypassHosts": [
+ "api.deepl.com",
+ "api-free.deepl.com",
+ "www.recaptcha.net",
+ "hcaptcha.com",
+ "challenges.cloudflare.com"
+ ],
+ "allowedPrivateNetworks": [
+ "127.0.0.1/32",
+ "172.20.0.0/16"
+ ]
+}
diff --git a/packages/backend/test-federation/.config/example.default.yml b/packages/backend/test-federation/.config/example.default.yml
deleted file mode 100644
index fd20613885..0000000000
--- a/packages/backend/test-federation/.config/example.default.yml
+++ /dev/null
@@ -1,22 +0,0 @@
-url: https://${HOST}/
-port: 3000
-db:
- host: db.${HOST}
- port: 5432
- db: misskey
- user: postgres
- pass: postgres
-dbReplications: false
-redis:
- host: redis.test
- port: 6379
-id: 'aidx'
-proxyBypassHosts:
- - api.deepl.com
- - api-free.deepl.com
- - www.recaptcha.net
- - hcaptcha.com
- - challenges.cloudflare.com
-allowedPrivateNetworks:
- - 127.0.0.1/32
- - 172.20.0.0/16
diff --git a/packages/backend/test-federation/compose.a.yml b/packages/backend/test-federation/compose.a.yml
index 6a305b404c..4fd4eb3851 100644
--- a/packages/backend/test-federation/compose.a.yml
+++ b/packages/backend/test-federation/compose.a.yml
@@ -37,8 +37,8 @@ services:
- internal_network_a
volumes:
- type: bind
- source: ./.config/a.test.default.yml
- target: /misskey/.config/default.yml
+ source: ./.config/a.test.config.json
+ target: /misskey/built/._config_.json
read_only: true
db.a.test:
diff --git a/packages/backend/test-federation/compose.b.yml b/packages/backend/test-federation/compose.b.yml
index 1158b53bae..753da22822 100644
--- a/packages/backend/test-federation/compose.b.yml
+++ b/packages/backend/test-federation/compose.b.yml
@@ -37,8 +37,8 @@ services:
- internal_network_b
volumes:
- type: bind
- source: ./.config/b.test.default.yml
- target: /misskey/.config/default.yml
+ source: ./.config/b.test.config.json
+ target: /misskey/built/._config_.json
read_only: true
db.b.test:
diff --git a/packages/backend/test-federation/compose.tpl.yml b/packages/backend/test-federation/compose.tpl.yml
index 92b986736d..1404345e2a 100644
--- a/packages/backend/test-federation/compose.tpl.yml
+++ b/packages/backend/test-federation/compose.tpl.yml
@@ -21,6 +21,10 @@ services:
- type: bind
source: ../../../built
target: /misskey/built
+ read_only: false
+ - type: bind
+ source: ./.config/dummy.yml
+ target: /misskey/.config/default.yml
read_only: true
- type: bind
source: ../assets
@@ -43,6 +47,10 @@ services:
target: /misskey/packages/backend/package.json
read_only: true
- type: bind
+ source: ../scripts/compile_config.js
+ target: /misskey/packages/backend/scripts/compile_config.js
+ read_only: true
+ - type: bind
source: ../../misskey-js/built
target: /misskey/packages/misskey-js/built
read_only: true
@@ -51,6 +59,14 @@ services:
target: /misskey/packages/misskey-js/package.json
read_only: true
- type: bind
+ source: ../../i18n/built
+ target: /misskey/packages/i18n/built
+ read_only: true
+ - type: bind
+ source: ../../i18n/package.json
+ target: /misskey/packages/i18n/package.json
+ read_only: true
+ - type: bind
source: ../../misskey-reversi/built
target: /misskey/packages/misskey-reversi/built
read_only: true
diff --git a/packages/backend/test-federation/compose.yml b/packages/backend/test-federation/compose.yml
index 330cc33854..25475a89ab 100644
--- a/packages/backend/test-federation/compose.yml
+++ b/packages/backend/test-federation/compose.yml
@@ -55,6 +55,10 @@ services:
target: /misskey/packages/backend/jest.js
read_only: true
- type: bind
+ source: ../scripts/compile_config.js
+ target: /misskey/packages/backend/scripts/compile_config.js
+ read_only: true
+ - type: bind
source: ../../misskey-js/built
target: /misskey/packages/misskey-js/built
read_only: true
@@ -63,6 +67,14 @@ services:
target: /misskey/packages/misskey-js/package.json
read_only: true
- type: bind
+ source: ../../i18n/built
+ target: /misskey/packages/i18n/built
+ read_only: true
+ - type: bind
+ source: ../../i18n/package.json
+ target: /misskey/packages/i18n/package.json
+ read_only: true
+ - type: bind
source: ../../../package.json
target: /misskey/package.json
read_only: true
diff --git a/packages/backend/test-federation/setup.sh b/packages/backend/test-federation/setup.sh
index 1bc3a2a87c..15aa2eee7f 100644
--- a/packages/backend/test-federation/setup.sh
+++ b/packages/backend/test-federation/setup.sh
@@ -28,7 +28,7 @@ function generate {
-days 500
if [ ! -f .config/docker.env ]; then cp .config/example.docker.env .config/docker.env; fi
if [ ! -f .config/$1.conf ]; then sed "s/\${HOST}/$1/g" .config/example.conf > .config/$1.conf; fi
- if [ ! -f .config/$1.default.yml ]; then sed "s/\${HOST}/$1/g" .config/example.default.yml > .config/$1.default.yml; fi
+ if [ ! -f .config/$1.default.yml ]; then sed "s/\${HOST}/$1/g" .config/example.config.json > .config/$1.config.json; fi
}
generate a.test
diff --git a/packages/backend/test-federation/tsconfig.json b/packages/backend/test-federation/tsconfig.json
index 3a1cb3b9f3..8e74a62e81 100644
--- a/packages/backend/test-federation/tsconfig.json
+++ b/packages/backend/test-federation/tsconfig.json
@@ -13,12 +13,12 @@
/* Language and Environment */
"target": "ESNext", /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */
// "lib": [], /* Specify a set of bundled library declaration files that describe the target runtime environment. */
- // "jsx": "preserve", /* Specify what JSX code is generated. */
+ "jsx": "react-jsx", /* Specify what JSX code is generated. */
// "experimentalDecorators": true, /* Enable experimental support for legacy experimental decorators. */
// "emitDecoratorMetadata": true, /* Emit design-type metadata for decorated declarations in source files. */
// "jsxFactory": "", /* Specify the JSX factory function used when targeting React JSX emit, e.g. 'React.createElement' or 'h'. */
// "jsxFragmentFactory": "", /* Specify the JSX Fragment reference used for fragments when targeting React JSX emit e.g. 'React.Fragment' or 'Fragment'. */
- // "jsxImportSource": "", /* Specify module specifier used to import the JSX factory functions when using 'jsx: react-jsx*'. */
+ "jsxImportSource": "@kitajs/html", /* Specify module specifier used to import the JSX factory functions when using 'jsx: react-jsx*'. */
// "reactNamespace": "", /* Specify the object invoked for 'createElement'. This only applies when targeting 'react' JSX emit. */
// "noLib": true, /* Disable including any library files, including the default lib.d.ts. */
// "useDefineForClassFields": true, /* Emit ECMAScript-standard-compliant class fields. */
diff --git a/packages/backend/test-server/tsconfig.json b/packages/backend/test-server/tsconfig.json
index 10313699c2..7ed7c10ed7 100644
--- a/packages/backend/test-server/tsconfig.json
+++ b/packages/backend/test-server/tsconfig.json
@@ -23,6 +23,8 @@
"emitDecoratorMetadata": true,
"resolveJsonModule": true,
"isolatedModules": true,
+ "jsx": "react-jsx",
+ "jsxImportSource": "@kitajs/html",
"rootDir": "../src",
"baseUrl": "./",
"paths": {
diff --git a/packages/backend/test/e2e/exports.ts b/packages/backend/test/e2e/exports.ts
index 4bcecc9716..19433f3c88 100644
--- a/packages/backend/test/e2e/exports.ts
+++ b/packages/backend/test/e2e/exports.ts
@@ -16,7 +16,7 @@ describe('export-clips', () => {
let bob: misskey.entities.SignupResponse;
// XXX: Any better way to get the result?
- async function pollFirstDriveFile() {
+ async function pollFirstDriveFile(): Promise<any> {
while (true) {
const files = (await api('drive/files', {}, alice)).body;
if (!files.length) {
@@ -168,7 +168,36 @@ describe('export-clips', () => {
assert.strictEqual(exported[1].clipNotes[0].note.text, 'baz2');
});
- test('Clipping other user\'s note', async () => {
+ test('Clipping other user\'s note (followers only notes are excluded when not following)', async () => {
+ const res = await api('clips/create', {
+ name: 'kawaii',
+ description: 'kawaii',
+ }, alice);
+ assert.strictEqual(res.status, 200);
+ const clip = res.body;
+
+ const note = await post(bob, {
+ text: 'baz',
+ visibility: 'followers',
+ });
+
+ const res2 = await api('clips/add-note', {
+ clipId: clip.id,
+ noteId: note.id,
+ }, alice);
+ assert.strictEqual(res2.status, 204);
+
+ const res3 = await api('i/export-clips', {}, alice);
+ assert.strictEqual(res3.status, 204);
+
+ const exported = await pollFirstDriveFile();
+ assert.strictEqual(exported[0].clipNotes.length, 0);
+ });
+
+ test('Clipping other user\'s note (followers only notes are included when following)', async () => {
+ // Alice follows Bob
+ await api('following/create', { userId: bob.id }, alice);
+
const res = await api('clips/create', {
name: 'kawaii',
description: 'kawaii',
diff --git a/packages/backend/test/e2e/fetch-resource.ts b/packages/backend/test/e2e/fetch-resource.ts
index bef98893c6..f00843de10 100644
--- a/packages/backend/test/e2e/fetch-resource.ts
+++ b/packages/backend/test/e2e/fetch-resource.ts
@@ -73,7 +73,7 @@ describe('Webリソース', () => {
};
const metaTag = (res: SimpleGetResponse, key: string, superkey = 'name'): string => {
- return res.body.window.document.querySelector('meta[' + superkey + '="' + key + '"]')?.content;
+ return res.body.querySelector('meta[' + superkey + '="' + key + '"]')?.attributes.content;
};
beforeAll(async () => {
diff --git a/packages/backend/test/e2e/oauth.ts b/packages/backend/test/e2e/oauth.ts
index f639f90ea6..96a6311a5a 100644
--- a/packages/backend/test/e2e/oauth.ts
+++ b/packages/backend/test/e2e/oauth.ts
@@ -19,7 +19,7 @@ import {
ResourceOwnerPassword,
} from 'simple-oauth2';
import pkceChallenge from 'pkce-challenge';
-import { JSDOM } from 'jsdom';
+import * as htmlParser from 'node-html-parser';
import Fastify, { type FastifyInstance, type FastifyReply } from 'fastify';
import { api, port, sendEnvUpdateRequest, signup } from '../utils.js';
import type * as misskey from 'misskey-js';
@@ -73,11 +73,11 @@ const clientConfig: ModuleOptions<'client_id'> = {
};
function getMeta(html: string): { transactionId: string | undefined, clientName: string | undefined, clientLogo: string | undefined } {
- const fragment = JSDOM.fragment(html);
+ const doc = htmlParser.parse(`<div>${html}</div>`);
return {
- transactionId: fragment.querySelector<HTMLMetaElement>('meta[name="misskey:oauth:transaction-id"]')?.content,
- clientName: fragment.querySelector<HTMLMetaElement>('meta[name="misskey:oauth:client-name"]')?.content,
- clientLogo: fragment.querySelector<HTMLMetaElement>('meta[name="misskey:oauth:client-logo"]')?.content,
+ transactionId: doc.querySelector('meta[name="misskey:oauth:transaction-id"]')?.attributes.content,
+ clientName: doc.querySelector('meta[name="misskey:oauth:client-name"]')?.attributes.content,
+ clientLogo: doc.querySelector('meta[name="misskey:oauth:client-logo"]')?.attributes.content,
};
}
@@ -148,7 +148,7 @@ function assertIndirectError(response: Response, error: string): void {
async function assertDirectError(response: Response, status: number, error: string): Promise<void> {
assert.strictEqual(response.status, status);
- const data = await response.json();
+ const data = await response.json() as any;
assert.strictEqual(data.error, error);
}
@@ -704,7 +704,7 @@ describe('OAuth', () => {
const response = await fetch(new URL('.well-known/oauth-authorization-server', host));
assert.strictEqual(response.status, 200);
- const body = await response.json();
+ const body = await response.json() as any;
assert.strictEqual(body.issuer, 'http://misskey.local');
assert.ok(body.scopes_supported.includes('write:notes'));
});
diff --git a/packages/backend/test/jest.setup.ts b/packages/backend/test/jest.setup.ts
index 7c6dd6a55f..9185f58acb 100644
--- a/packages/backend/test/jest.setup.ts
+++ b/packages/backend/test/jest.setup.ts
@@ -9,3 +9,4 @@ beforeAll(async () => {
await initTestDb(false);
await sendEnvResetRequest();
});
+
diff --git a/packages/backend/test/tsconfig.json b/packages/backend/test/tsconfig.json
index 2b562acda8..c6754c4802 100644
--- a/packages/backend/test/tsconfig.json
+++ b/packages/backend/test/tsconfig.json
@@ -23,6 +23,8 @@
"emitDecoratorMetadata": true,
"resolveJsonModule": true,
"isolatedModules": true,
+ "jsx": "react-jsx",
+ "jsxImportSource": "@kitajs/html",
"baseUrl": "./",
"paths": {
"@/*": ["../src/*"]
diff --git a/packages/backend/test/unit/AnnouncementService.ts b/packages/backend/test/unit/AnnouncementService.ts
index 0b24f109f8..b3f7f426fe 100644
--- a/packages/backend/test/unit/AnnouncementService.ts
+++ b/packages/backend/test/unit/AnnouncementService.ts
@@ -26,7 +26,7 @@ import { GlobalEventService } from '@/core/GlobalEventService.js';
import { ModerationLogService } from '@/core/ModerationLogService.js';
import { secureRndstr } from '@/misc/secure-rndstr.js';
import type { TestingModule } from '@nestjs/testing';
-import type { MockFunctionMetadata } from 'jest-mock';
+import type { MockMetadata } from 'jest-mock';
const moduleMocker = new ModuleMocker(global);
@@ -84,7 +84,7 @@ describe('AnnouncementService', () => {
log: jest.fn(),
};
} else if (typeof token === 'function') {
- const mockMetadata = moduleMocker.getMetadata(token) as MockFunctionMetadata<any, any>;
+ const mockMetadata = moduleMocker.getMetadata(token) as MockMetadata<any, any>;
const Mock = moduleMocker.generateFromMetadata(mockMetadata);
return new Mock();
}
diff --git a/packages/backend/test/unit/ApMfmService.ts b/packages/backend/test/unit/ApMfmService.ts
index e81a321c9b..93efa5d7d3 100644
--- a/packages/backend/test/unit/ApMfmService.ts
+++ b/packages/backend/test/unit/ApMfmService.ts
@@ -9,7 +9,6 @@ import { Test } from '@nestjs/testing';
import { CoreModule } from '@/core/CoreModule.js';
import { ApMfmService } from '@/core/activitypub/ApMfmService.js';
import { GlobalModule } from '@/GlobalModule.js';
-import { MiNote } from '@/models/Note.js';
describe('ApMfmService', () => {
let apMfmService: ApMfmService;
@@ -31,7 +30,7 @@ describe('ApMfmService', () => {
const { content, noMisskeyContent } = apMfmService.getNoteHtml(note);
assert.equal(noMisskeyContent, true, 'noMisskeyContent');
- assert.equal(content, '<p>テキスト <a href="http://misskey.local/tags/タグ" rel="tag">#タグ</a> <a href="http://misskey.local/@mention" class="u-url mention">@mention</a> 🍊 ​:emoji:​ <a href="https://example.com">https://example.com</a></p>', 'content');
+ assert.equal(content, 'テキスト <a href="http://misskey.local/tags/%E3%82%BF%E3%82%B0" rel="tag">#タグ</a> <a href="http://misskey.local/@mention" class="u-url mention">@mention</a> 🍊 ​:emoji:​ <a href="https://example.com/">https://example.com</a>', 'content');
});
test('Provide _misskey_content for MFM', () => {
@@ -43,7 +42,7 @@ describe('ApMfmService', () => {
const { content, noMisskeyContent } = apMfmService.getNoteHtml(note);
assert.equal(noMisskeyContent, false, 'noMisskeyContent');
- assert.equal(content, '<p><i>foo</i></p>', 'content');
+ assert.equal(content, '<i>foo</i>', 'content');
});
});
});
diff --git a/packages/backend/test/unit/CaptchaService.ts b/packages/backend/test/unit/CaptchaService.ts
index 51b70b05a1..24bb81118e 100644
--- a/packages/backend/test/unit/CaptchaService.ts
+++ b/packages/backend/test/unit/CaptchaService.ts
@@ -446,7 +446,7 @@ describe('CaptchaService', () => {
if (!res.success) {
expect(res.error.code).toBe(code);
}
- expect(metaService.update).not.toBeCalled();
+ expect(metaService.update).not.toHaveBeenCalled();
}
describe('invalidParameters', () => {
diff --git a/packages/backend/test/unit/DriveService.ts b/packages/backend/test/unit/DriveService.ts
index 964c65ccaa..48b108fbba 100644
--- a/packages/backend/test/unit/DriveService.ts
+++ b/packages/backend/test/unit/DriveService.ts
@@ -53,7 +53,7 @@ describe('DriveService', () => {
s3Mock.on(DeleteObjectCommand)
.rejects(new InvalidObjectState({ $metadata: {}, message: '' }));
- await expect(driveService.deleteObjectStorageFile('unexpected')).rejects.toThrowError(Error);
+ await expect(driveService.deleteObjectStorageFile('unexpected')).rejects.toThrow(Error);
});
test('delete a file with no valid key', async () => {
diff --git a/packages/backend/test/unit/FileInfoService.ts b/packages/backend/test/unit/FileInfoService.ts
index 29bd03a201..28a2a971f4 100644
--- a/packages/backend/test/unit/FileInfoService.ts
+++ b/packages/backend/test/unit/FileInfoService.ts
@@ -17,7 +17,7 @@ import { FileInfo, FileInfoService } from '@/core/FileInfoService.js';
import { AiService } from '@/core/AiService.js';
import { LoggerService } from '@/core/LoggerService.js';
import type { TestingModule } from '@nestjs/testing';
-import type { MockFunctionMetadata } from 'jest-mock';
+import type { MockMetadata } from 'jest-mock';
const _filename = fileURLToPath(import.meta.url);
const _dirname = dirname(_filename);
@@ -34,7 +34,7 @@ describe('FileInfoService', () => {
delete fi.sensitive;
delete fi.blurhash;
delete fi.porn;
-
+
return fi;
}
@@ -54,7 +54,7 @@ describe('FileInfoService', () => {
// return { };
//}
if (typeof token === 'function') {
- const mockMetadata = moduleMocker.getMetadata(token) as MockFunctionMetadata<any, any>;
+ const mockMetadata = moduleMocker.getMetadata(token) as MockMetadata<any, any>;
const Mock = moduleMocker.generateFromMetadata(mockMetadata);
return new Mock();
}
diff --git a/packages/backend/test/unit/MfmService.ts b/packages/backend/test/unit/MfmService.ts
index 7350da3cae..2f5f3745de 100644
--- a/packages/backend/test/unit/MfmService.ts
+++ b/packages/backend/test/unit/MfmService.ts
@@ -24,25 +24,25 @@ describe('MfmService', () => {
describe('toHtml', () => {
test('br', () => {
const input = 'foo\nbar\nbaz';
- const output = '<p><span>foo<br />bar<br />baz</span></p>';
+ const output = 'foo<br />bar<br />baz';
assert.equal(mfmService.toHtml(mfm.parse(input)), output);
});
test('br alt', () => {
const input = 'foo\r\nbar\rbaz';
- const output = '<p><span>foo<br />bar<br />baz</span></p>';
+ const output = 'foo<br />bar<br />baz';
assert.equal(mfmService.toHtml(mfm.parse(input)), output);
});
test('Do not generate unnecessary span', () => {
const input = 'foo $[tada bar]';
- const output = '<p>foo <i>bar</i></p>';
+ const output = 'foo <i>bar</i>';
assert.equal(mfmService.toHtml(mfm.parse(input)), output);
});
test('escape', () => {
const input = '```\n<p>Hello, world!</p>\n```';
- const output = '<p><pre><code>&lt;p&gt;Hello, world!&lt;/p&gt;</code></pre></p>';
+ const output = '<pre><code>&lt;p&gt;Hello, world!&lt;/p&gt;</code></pre>';
assert.equal(mfmService.toHtml(mfm.parse(input)), output);
});
});
@@ -118,7 +118,7 @@ describe('MfmService', () => {
assert.deepStrictEqual(mfmService.fromHtml('<p>a <ruby>Misskey<rp>(</rp><rt>ミス キー</rt><rp>)</rp> b</ruby> c</p>'), 'a Misskey(ミス キー) b c');
assert.deepStrictEqual(
mfmService.fromHtml('<p>a <ruby>Misskey<rp>(</rp><rt>ミスキー</rt><rp>)</rp>Misskey<rp>(</rp><rt>ミス キー</rt><rp>)</rp>Misskey<rp>(</rp><rt>ミスキー</rt><rp>)</rp></ruby> b</p>'),
- 'a Misskey(ミスキー)Misskey(ミス キー)Misskey(ミスキー) b'
+ 'a Misskey(ミスキー)Misskey(ミス キー)Misskey(ミスキー) b',
);
});
diff --git a/packages/backend/test/unit/RelayService.ts b/packages/backend/test/unit/RelayService.ts
index 074430dd31..bee580d0c7 100644
--- a/packages/backend/test/unit/RelayService.ts
+++ b/packages/backend/test/unit/RelayService.ts
@@ -9,7 +9,7 @@ import { jest } from '@jest/globals';
import { Test } from '@nestjs/testing';
import { ModuleMocker } from 'jest-mock';
import type { TestingModule } from '@nestjs/testing';
-import type { MockFunctionMetadata } from 'jest-mock';
+import type { MockMetadata } from 'jest-mock';
import { ApRendererService } from '@/core/activitypub/ApRendererService.js';
import { UserEntityService } from '@/core/entities/UserEntityService.js';
import { IdService } from '@/core/IdService.js';
@@ -45,7 +45,7 @@ describe('RelayService', () => {
return { deliver: jest.fn() };
}
if (typeof token === 'function') {
- const mockMetadata = moduleMocker.getMetadata(token) as MockFunctionMetadata<any, any>;
+ const mockMetadata = moduleMocker.getMetadata(token) as MockMetadata<any, any>;
const Mock = moduleMocker.generateFromMetadata(mockMetadata);
return new Mock();
}
diff --git a/packages/backend/test/unit/RoleService.ts b/packages/backend/test/unit/RoleService.ts
index 71090c8be6..9b17b1fbb9 100644
--- a/packages/backend/test/unit/RoleService.ts
+++ b/packages/backend/test/unit/RoleService.ts
@@ -11,7 +11,7 @@ import { ModuleMocker } from 'jest-mock';
import { Test } from '@nestjs/testing';
import * as lolex from '@sinonjs/fake-timers';
import type { TestingModule } from '@nestjs/testing';
-import type { MockFunctionMetadata } from 'jest-mock';
+import type { MockMetadata } from 'jest-mock';
import { GlobalModule } from '@/GlobalModule.js';
import { RoleService } from '@/core/RoleService.js';
import {
@@ -104,6 +104,8 @@ describe('RoleService', () => {
beforeEach(async () => {
clock = lolex.install({
+ // https://github.com/sinonjs/sinon/issues/2620
+ toFake: Object.keys(lolex.timers).filter((key) => !['nextTick', 'queueMicrotask'].includes(key)) as lolex.FakeMethod[],
now: new Date(),
shouldClearNativeTimers: true,
});
@@ -135,7 +137,7 @@ describe('RoleService', () => {
return { fetch: jest.fn() };
}
if (typeof token === 'function') {
- const mockMetadata = moduleMocker.getMetadata(token) as MockFunctionMetadata<any, any>;
+ const mockMetadata = moduleMocker.getMetadata(token) as MockMetadata<any, any>;
const Mock = moduleMocker.generateFromMetadata(mockMetadata);
return new Mock();
}
diff --git a/packages/backend/test/unit/S3Service.ts b/packages/backend/test/unit/S3Service.ts
index 151f3b826a..6e7e5a8b59 100644
--- a/packages/backend/test/unit/S3Service.ts
+++ b/packages/backend/test/unit/S3Service.ts
@@ -72,7 +72,7 @@ describe('S3Service', () => {
Bucket: 'fake',
Key: 'fake',
Body: 'x',
- })).rejects.toThrowError(Error);
+ })).rejects.toThrow(Error);
});
test('upload a large file error', async () => {
@@ -82,7 +82,7 @@ describe('S3Service', () => {
Bucket: 'fake',
Key: 'fake',
Body: 'x'.repeat(8 * 1024 * 1024 + 1), // デフォルトpartSizeにしている 8 * 1024 * 1024 を越えるサイズ
- })).rejects.toThrowError(Error);
+ })).rejects.toThrow(Error);
});
});
});
diff --git a/packages/backend/test/unit/SigninWithPasskeyApiService.ts b/packages/backend/test/unit/SigninWithPasskeyApiService.ts
index 0687ed8437..8ef46024ac 100644
--- a/packages/backend/test/unit/SigninWithPasskeyApiService.ts
+++ b/packages/backend/test/unit/SigninWithPasskeyApiService.ts
@@ -9,7 +9,7 @@ import { Test, TestingModule } from '@nestjs/testing';
import { FastifyReply, FastifyRequest } from 'fastify';
import { AuthenticationResponseJSON } from '@simplewebauthn/types';
import { HttpHeader } from 'fastify/types/utils.js';
-import { MockFunctionMetadata, ModuleMocker } from 'jest-mock';
+import { MockMetadata, ModuleMocker } from 'jest-mock';
import { MiUser } from '@/models/User.js';
import { MiUserProfile, UserProfilesRepository, UsersRepository } from '@/models/_.js';
import { IdService } from '@/core/IdService.js';
@@ -95,7 +95,7 @@ describe('SigninWithPasskeyApiService', () => {
],
}).useMocker((token) => {
if (typeof token === 'function') {
- const mockMetadata = moduleMocker.getMetadata(token) as MockFunctionMetadata<any, any>;
+ const mockMetadata = moduleMocker.getMetadata(token) as MockMetadata<any, any>;
const Mock = moduleMocker.generateFromMetadata(mockMetadata);
return new Mock();
}
diff --git a/packages/backend/test/unit/chart.ts b/packages/backend/test/unit/chart.ts
index 9dedd3a79d..364a2c2fbd 100644
--- a/packages/backend/test/unit/chart.ts
+++ b/packages/backend/test/unit/chart.ts
@@ -9,6 +9,7 @@ import * as assert from 'assert';
import { jest } from '@jest/globals';
import * as lolex from '@sinonjs/fake-timers';
import { DataSource } from 'typeorm';
+import * as Redis from 'ioredis';
import TestChart from '@/core/chart/charts/test.js';
import TestGroupedChart from '@/core/chart/charts/test-grouped.js';
import TestUniqueChart from '@/core/chart/charts/test-unique.js';
@@ -18,16 +19,16 @@ import { entity as TestGroupedChartEntity } from '@/core/chart/charts/entities/t
import { entity as TestUniqueChartEntity } from '@/core/chart/charts/entities/test-unique.js';
import { entity as TestIntersectionChartEntity } from '@/core/chart/charts/entities/test-intersection.js';
import { loadConfig } from '@/config.js';
-import type { AppLockService } from '@/core/AppLockService.js';
import Logger from '@/logger.js';
describe('Chart', () => {
const config = loadConfig();
- const appLockService = {
- getChartInsertLock: () => () => Promise.resolve(() => {}),
- } as unknown as jest.Mocked<AppLockService>;
let db: DataSource | undefined;
+ let redisClient = {
+ set: () => Promise.resolve('OK'),
+ get: () => Promise.resolve(null),
+ } as unknown as jest.Mocked<Redis.Redis>;
let testChart: TestChart;
let testGroupedChart: TestGroupedChart;
@@ -64,12 +65,14 @@ describe('Chart', () => {
await db.initialize();
const logger = new Logger('chart'); // TODO: モックにする
- testChart = new TestChart(db, appLockService, logger);
- testGroupedChart = new TestGroupedChart(db, appLockService, logger);
- testUniqueChart = new TestUniqueChart(db, appLockService, logger);
- testIntersectionChart = new TestIntersectionChart(db, appLockService, logger);
+ testChart = new TestChart(db, redisClient, logger);
+ testGroupedChart = new TestGroupedChart(db, redisClient, logger);
+ testUniqueChart = new TestUniqueChart(db, redisClient, logger);
+ testIntersectionChart = new TestIntersectionChart(db, redisClient, logger);
clock = lolex.install({
+ // https://github.com/sinonjs/sinon/issues/2620
+ toFake: Object.keys(lolex.timers).filter((key) => !['nextTick', 'queueMicrotask'].includes(key)) as lolex.FakeMethod[],
now: new Date(Date.UTC(2000, 0, 1, 0, 0, 0)),
shouldClearNativeTimers: true,
});
diff --git a/packages/backend/test/unit/misc/should-hide-note-by-time.ts b/packages/backend/test/unit/misc/should-hide-note-by-time.ts
new file mode 100644
index 0000000000..1c463c82c6
--- /dev/null
+++ b/packages/backend/test/unit/misc/should-hide-note-by-time.ts
@@ -0,0 +1,136 @@
+/*
+ * SPDX-FileCopyrightText: syuilo and misskey-project
+ * SPDX-License-Identifier: AGPL-3.0-only
+ */
+
+import { describe, expect, test, beforeEach, afterEach } from '@jest/globals';
+import * as lolex from '@sinonjs/fake-timers';
+import { shouldHideNoteByTime } from '@/misc/should-hide-note-by-time.js';
+
+describe('misc:should-hide-note-by-time', () => {
+ let clock: lolex.InstalledClock;
+ const epoch = Date.UTC(2000, 0, 1, 0, 0, 0);
+
+ beforeEach(() => {
+ clock = lolex.install({
+ // https://github.com/sinonjs/sinon/issues/2620
+ toFake: Object.keys(lolex.timers).filter((key) => !['nextTick', 'queueMicrotask'].includes(key)) as lolex.FakeMethod[],
+ now: new Date(epoch),
+ shouldClearNativeTimers: true,
+ });
+ });
+
+ afterEach(() => {
+ clock.uninstall();
+ });
+
+ describe('hiddenBefore が null または undefined の場合', () => {
+ test('hiddenBefore が null のときは false を返す(非表示機能が有効でない)', () => {
+ const createdAt = new Date(epoch - 86400000); // 1 day ago
+ expect(shouldHideNoteByTime(null, createdAt)).toBe(false);
+ });
+
+ test('hiddenBefore が undefined のときは false を返す(非表示機能が有効でない)', () => {
+ const createdAt = new Date(epoch - 86400000); // 1 day ago
+ expect(shouldHideNoteByTime(undefined, createdAt)).toBe(false);
+ });
+ });
+
+ describe('相対時間モード (hiddenBefore <= 0)', () => {
+ test('閾値内に作成されたノートは false を返す(作成からの経過時間がまだ短い→表示)', () => {
+ const hiddenBefore = -86400; // 1 day in seconds
+ const createdAt = new Date(epoch - 3600000); // 1 hour ago
+ expect(shouldHideNoteByTime(hiddenBefore, createdAt)).toBe(false);
+ });
+
+ test('閾値を超えて作成されたノートは true を返す(指定期間以上経過している→非表示)', () => {
+ const hiddenBefore = -86400; // 1 day in seconds
+ const createdAt = new Date(epoch - 172800000); // 2 days ago
+ expect(shouldHideNoteByTime(hiddenBefore, createdAt)).toBe(true);
+ });
+
+ test('ちょうど閾値で作成されたノートは true を返す(閾値に達したら非表示)', () => {
+ const hiddenBefore = -86400; // 1 day in seconds
+ const createdAt = new Date(epoch - 86400000); // exactly 1 day ago
+ expect(shouldHideNoteByTime(hiddenBefore, createdAt)).toBe(true);
+ });
+
+ test('異なる相対時間値で判定できる(1時間設定と3時間設定の異なる結果)', () => {
+ const createdAt = new Date(epoch - 7200000); // 2 hours ago
+ expect(shouldHideNoteByTime(-3600, createdAt)).toBe(true); // 1時間経過→非表示
+ expect(shouldHideNoteByTime(-10800, createdAt)).toBe(false); // 3時間未経過→表示
+ });
+
+ test('ISO 8601 形式の文字列の createdAt に対応できる(文字列でも正しく判定)', () => {
+ const createdAtString = new Date(epoch - 86400000).toISOString();
+ const hiddenBefore = -86400; // 1 day in seconds
+ expect(shouldHideNoteByTime(hiddenBefore, createdAtString)).toBe(true);
+ });
+
+ test('hiddenBefore が 0 の場合に対応できる(0秒以上経過で非表示→ほぼ全て非表示)', () => {
+ const hiddenBefore = 0;
+ const createdAt = new Date(epoch - 1); // 1ms ago
+ expect(shouldHideNoteByTime(hiddenBefore, createdAt)).toBe(true);
+ });
+ });
+
+ describe('絶対時間モード (hiddenBefore > 0)', () => {
+ test('閾値タイムスタンプより後に作成されたノートは false を返す(指定日時より後→表示)', () => {
+ const thresholdSeconds = Math.floor(epoch / 1000);
+ const createdAt = new Date(epoch + 3600000); // 1 hour from epoch
+ expect(shouldHideNoteByTime(thresholdSeconds, createdAt)).toBe(false);
+ });
+
+ test('閾値タイムスタンプより前に作成されたノートは true を返す(指定日時より前→非表示)', () => {
+ const thresholdSeconds = Math.floor(epoch / 1000);
+ const createdAt = new Date(epoch - 3600000); // 1 hour ago
+ expect(shouldHideNoteByTime(thresholdSeconds, createdAt)).toBe(true);
+ });
+
+ test('ちょうど閾値タイムスタンプで作成されたノートは true を返す(指定日時に達したら非表示)', () => {
+ const thresholdSeconds = Math.floor(epoch / 1000);
+ const createdAt = new Date(epoch); // exactly epoch
+ expect(shouldHideNoteByTime(thresholdSeconds, createdAt)).toBe(true);
+ });
+
+ test('ISO 8601 形式の文字列の createdAt に対応できる(文字列でも正しく判定)', () => {
+ const thresholdSeconds = Math.floor(epoch / 1000);
+ const createdAtString = new Date(epoch - 3600000).toISOString();
+ expect(shouldHideNoteByTime(thresholdSeconds, createdAtString)).toBe(true);
+ });
+
+ test('異なる閾値タイムスタンプで判定できる(2021年設定と現在より1時間前設定の異なる結果)', () => {
+ const thresholdSeconds = Math.floor((epoch - 86400000) / 1000); // 1 day ago
+ const createdAtBefore = new Date(epoch - 172800000); // 2 days ago
+ const createdAtAfter = new Date(epoch - 3600000); // 1 hour ago
+ expect(shouldHideNoteByTime(thresholdSeconds, createdAtBefore)).toBe(true); // 閾値より前→非表示
+ expect(shouldHideNoteByTime(thresholdSeconds, createdAtAfter)).toBe(false); // 閾値より後→表示
+ });
+ });
+
+ describe('エッジケース', () => {
+ test('相対時間モードで非常に古いノートに対応できる(非常に古い→閾値超→非表示)', () => {
+ const hiddenBefore = -1; // hide notes older than 1 second
+ const createdAt = new Date(epoch - 1000000); // very old
+ expect(shouldHideNoteByTime(hiddenBefore, createdAt)).toBe(true);
+ });
+
+ test('相対時間モードで非常に新しいノートに対応できる(非常に新しい→閾値未満→表示)', () => {
+ const hiddenBefore = -86400; // 1 day
+ const createdAt = new Date(epoch - 1); // 1ms ago
+ expect(shouldHideNoteByTime(hiddenBefore, createdAt)).toBe(false);
+ });
+
+ test('大きなタイムスタンプ値に対応できる(未来の日時を指定→現在のノートは全て非表示)', () => {
+ const thresholdSeconds = Math.floor(epoch / 1000) + 86400; // 1 day from epoch
+ const createdAt = new Date(epoch); // created epoch
+ expect(shouldHideNoteByTime(thresholdSeconds, createdAt)).toBe(true);
+ });
+
+ test('小さな相対時間値に対応できる(1秒設定で2秒前→非表示)', () => {
+ const hiddenBefore = -1; // 1 second
+ const createdAt = new Date(epoch - 2000); // 2 seconds ago
+ expect(shouldHideNoteByTime(hiddenBefore, createdAt)).toBe(true);
+ });
+ });
+});
diff --git a/packages/backend/test/unit/queue/processors/CheckModeratorsActivityProcessorService.ts b/packages/backend/test/unit/queue/processors/CheckModeratorsActivityProcessorService.ts
index 211846eef2..01a36c9fef 100644
--- a/packages/backend/test/unit/queue/processors/CheckModeratorsActivityProcessorService.ts
+++ b/packages/backend/test/unit/queue/processors/CheckModeratorsActivityProcessorService.ts
@@ -141,6 +141,8 @@ describe('CheckModeratorsActivityProcessorService', () => {
beforeEach(async () => {
clock = lolex.install({
+ // https://github.com/sinonjs/sinon/issues/2620
+ toFake: Object.keys(lolex.timers).filter((key) => !['nextTick', 'queueMicrotask'].includes(key)) as lolex.FakeMethod[],
now: new Date(baseDate),
shouldClearNativeTimers: true,
});
diff --git a/packages/backend/test/utils.ts b/packages/backend/test/utils.ts
index daae7b9643..ecca28b5af 100644
--- a/packages/backend/test/utils.ts
+++ b/packages/backend/test/utils.ts
@@ -10,8 +10,8 @@ import { randomUUID } from 'node:crypto';
import { inspect } from 'node:util';
import WebSocket, { ClientOptions } from 'ws';
import fetch, { File, RequestInit, type Headers } from 'node-fetch';
+import * as htmlParser from 'node-html-parser';
import { DataSource } from 'typeorm';
-import { JSDOM } from 'jsdom';
import { type Response } from 'node-fetch';
import Fastify from 'fastify';
import { entities } from '../src/postgres.js';
@@ -468,7 +468,7 @@ export function makeStreamCatcher<T>(
export type SimpleGetResponse = {
status: number,
- body: any | JSDOM | null,
+ body: any | null,
type: string | null,
location: string | null
};
@@ -499,7 +499,7 @@ export const simpleGet = async (path: string, accept = '*/*', cookie: any = unde
const body =
jsonTypes.includes(res.headers.get('content-type') ?? '') ? await res.json() :
- htmlTypes.includes(res.headers.get('content-type') ?? '') ? new JSDOM(await res.text()) :
+ htmlTypes.includes(res.headers.get('content-type') ?? '') ? htmlParser.parse(await res.text()) :
await bodyExtractor(res);
return {
diff --git a/packages/backend/tsconfig.json b/packages/backend/tsconfig.json
index 2b15a5cc7a..25584e475d 100644
--- a/packages/backend/tsconfig.json
+++ b/packages/backend/tsconfig.json
@@ -23,12 +23,17 @@
"emitDecoratorMetadata": true,
"resolveJsonModule": true,
"isolatedModules": true,
+ "jsx": "react-jsx",
+ "jsxImportSource": "@kitajs/html",
"rootDir": "./src",
"baseUrl": "./",
"paths": {
"@/*": ["./src/*"]
},
"outDir": "./built",
+ "plugins": [
+ {"name": "@kitajs/ts-html-plugin"}
+ ],
"types": [
"node"
],
@@ -43,7 +48,8 @@
},
"compileOnSave": false,
"include": [
- "./src/**/*.ts"
+ "./src/**/*.ts",
+ "./src/**/*.tsx"
],
"exclude": [
"./src/**/*.test.ts"
diff --git a/packages/frontend-builder/locale-inliner.ts b/packages/frontend-builder/locale-inliner.ts
index 9bef465eeb..191d7250a6 100644
--- a/packages/frontend-builder/locale-inliner.ts
+++ b/packages/frontend-builder/locale-inliner.ts
@@ -10,7 +10,7 @@ import { collectModifications } from './locale-inliner/collect-modifications.js'
import { applyWithLocale } from './locale-inliner/apply-with-locale.js';
import { blankLogger } from './logger.js';
import type { Logger } from './logger.js';
-import type { Locale } from '../../locales/index.js';
+import type { Locale } from 'i18n';
import type { Manifest as ViteManifest } from 'vite';
export class LocaleInliner {
diff --git a/packages/frontend-builder/locale-inliner/apply-with-locale.ts b/packages/frontend-builder/locale-inliner/apply-with-locale.ts
index 5e601cdf12..78851d3029 100644
--- a/packages/frontend-builder/locale-inliner/apply-with-locale.ts
+++ b/packages/frontend-builder/locale-inliner/apply-with-locale.ts
@@ -5,7 +5,7 @@
import MagicString from 'magic-string';
import { assertNever } from '../utils.js';
-import type { Locale, ILocale } from '../../../locales/index.js';
+import type { ILocale, Locale } from 'i18n';
import type { TextModification } from '../locale-inliner.js';
import type { Logger } from '../logger.js';
diff --git a/packages/frontend-builder/package.json b/packages/frontend-builder/package.json
index ef5c8e0367..36c32b915d 100644
--- a/packages/frontend-builder/package.json
+++ b/packages/frontend-builder/package.json
@@ -12,14 +12,15 @@
"devDependencies": {
"@types/estree": "1.0.8",
"@types/node": "24.10.1",
- "@typescript-eslint/eslint-plugin": "8.47.0",
- "@typescript-eslint/parser": "8.47.0",
+ "@typescript-eslint/eslint-plugin": "8.48.0",
+ "@typescript-eslint/parser": "8.48.0",
"rollup": "4.53.3",
"typescript": "5.9.3"
},
"dependencies": {
+ "i18n": "workspace:*",
"estree-walker": "3.0.3",
"magic-string": "0.30.21",
- "vite": "7.2.2"
+ "vite": "7.2.4"
}
}
diff --git a/packages/frontend-embed/build.ts b/packages/frontend-embed/build.ts
index 737233a4d0..4e1f588802 100644
--- a/packages/frontend-embed/build.ts
+++ b/packages/frontend-embed/build.ts
@@ -2,7 +2,7 @@ import * as fs from 'fs/promises';
import url from 'node:url';
import path from 'node:path';
import { execa } from 'execa';
-import locales from '../../locales/index.js';
+import locales from 'i18n';
import { LocaleInliner } from '../frontend-builder/locale-inliner.js'
import { createLogger } from '../frontend-builder/logger';
diff --git a/packages/frontend-embed/package.json b/packages/frontend-embed/package.json
index 7bfd32686c..6122f2cab6 100644
--- a/packages/frontend-embed/package.json
+++ b/packages/frontend-embed/package.json
@@ -11,12 +11,13 @@
},
"dependencies": {
"@discordapp/twemoji": "16.0.1",
+ "i18n": "workspace:*",
"@rollup/plugin-json": "6.1.0",
"@rollup/plugin-replace": "6.0.3",
"@rollup/pluginutils": "5.3.0",
"@twemoji/parser": "16.0.0",
"@vitejs/plugin-vue": "6.0.2",
- "@vue/compiler-sfc": "3.5.24",
+ "@vue/compiler-sfc": "3.5.25",
"astring": "1.9.0",
"buraha": "0.0.1",
"estree-walker": "3.0.3",
@@ -27,15 +28,15 @@
"misskey-js": "workspace:*",
"punycode.js": "2.3.1",
"rollup": "4.53.3",
- "sass": "1.94.1",
- "shiki": "3.15.0",
+ "sass": "1.94.2",
+ "shiki": "3.17.0",
"tinycolor2": "1.6.0",
"tsc-alias": "1.8.16",
"tsconfig-paths": "4.2.0",
"typescript": "5.9.3",
"uuid": "13.0.0",
- "vite": "7.2.2",
- "vue": "3.5.24"
+ "vite": "7.2.4",
+ "vue": "3.5.25"
},
"devDependencies": {
"@misskey-dev/summaly": "5.2.5",
@@ -47,26 +48,26 @@
"@types/punycode.js": "npm:@types/punycode@2.1.4",
"@types/tinycolor2": "1.4.6",
"@types/ws": "8.18.1",
- "@typescript-eslint/eslint-plugin": "8.47.0",
- "@typescript-eslint/parser": "8.47.0",
- "@vitest/coverage-v8": "3.2.4",
- "@vue/runtime-core": "3.5.24",
+ "@typescript-eslint/eslint-plugin": "8.48.0",
+ "@typescript-eslint/parser": "8.48.0",
+ "@vitest/coverage-v8": "4.0.14",
+ "@vue/runtime-core": "3.5.25",
"acorn": "8.15.0",
"cross-env": "10.1.0",
"eslint-plugin-import": "2.32.0",
- "eslint-plugin-vue": "10.5.1",
+ "eslint-plugin-vue": "10.6.2",
"fast-glob": "3.3.3",
- "happy-dom": "20.0.10",
+ "happy-dom": "20.0.11",
"intersection-observer": "0.12.2",
"micromatch": "4.0.8",
- "msw": "2.12.2",
+ "msw": "2.12.3",
"nodemon": "3.1.11",
- "prettier": "3.6.2",
- "start-server-and-test": "2.1.2",
+ "prettier": "3.7.1",
+ "start-server-and-test": "2.1.3",
"tsx": "4.20.6",
"vite-plugin-turbosnap": "1.0.3",
- "vue-component-type-helpers": "3.1.4",
+ "vue-component-type-helpers": "3.1.5",
"vue-eslint-parser": "10.2.0",
- "vue-tsc": "3.1.4"
+ "vue-tsc": "3.1.5"
}
}
diff --git a/packages/backend/src/server/web/boot.embed.js b/packages/frontend-embed/public/loader/boot.js
index ba6366b3db..ba6366b3db 100644
--- a/packages/backend/src/server/web/boot.embed.js
+++ b/packages/frontend-embed/public/loader/boot.js
diff --git a/packages/backend/src/server/web/style.embed.css b/packages/frontend-embed/public/loader/style.css
index 0911d562bf..0911d562bf 100644
--- a/packages/backend/src/server/web/style.embed.css
+++ b/packages/frontend-embed/public/loader/style.css
diff --git a/packages/frontend-embed/src/components/I18n.vue b/packages/frontend-embed/src/components/I18n.vue
index b621110ec9..9866e50958 100644
--- a/packages/frontend-embed/src/components/I18n.vue
+++ b/packages/frontend-embed/src/components/I18n.vue
@@ -9,7 +9,7 @@ SPDX-License-Identifier: AGPL-3.0-only
<script setup lang="ts" generic="T extends string | ParameterizedString">
import { computed, h } from 'vue';
-import type { ParameterizedString } from '../../../../locales/index.js';
+import type { ParameterizedString } from 'i18n';
const props = withDefaults(defineProps<{
src: T;
@@ -25,7 +25,7 @@ const slots = defineSlots<T extends ParameterizedString<infer R> ? { [K in R]: (
const parsed = computed(() => {
let str = props.src as string;
const value: (string | { arg: string; })[] = [];
- for (;;) {
+ for (; ;) {
const nextBracketOpen = str.indexOf('{');
const nextBracketClose = str.indexOf('}');
diff --git a/packages/frontend-embed/src/i18n.ts b/packages/frontend-embed/src/i18n.ts
index 0b2b206b7e..6a3a18df17 100644
--- a/packages/frontend-embed/src/i18n.ts
+++ b/packages/frontend-embed/src/i18n.ts
@@ -6,7 +6,7 @@
import { markRaw } from 'vue';
import { I18n } from '@@/js/i18n.js';
import { locale } from '@@/js/locale.js';
-import type { Locale } from '../../../locales/index.js';
+import type { Locale } from 'i18n';
export const i18n = markRaw(new I18n<Locale>(locale, _DEV_));
diff --git a/packages/frontend-embed/vite.config.ts b/packages/frontend-embed/vite.config.ts
index db4afb43a7..9e5c24f9d4 100644
--- a/packages/frontend-embed/vite.config.ts
+++ b/packages/frontend-embed/vite.config.ts
@@ -1,10 +1,10 @@
import path from 'path';
import pluginVue from '@vitejs/plugin-vue';
-import { type UserConfig, defineConfig } from 'vite';
+import { defineConfig, type UserConfig } from 'vite';
import * as yaml from 'js-yaml';
import { promises as fsp } from 'fs';
-import locales from '../../locales/index.js';
+import locales from 'i18n';
import meta from '../../package.json';
import packageInfo from './package.json' with { type: 'json' };
import pluginJson5 from './vite.json5.js';
diff --git a/packages/frontend-shared/js/i18n.ts b/packages/frontend-shared/js/i18n.ts
index 3b103c4714..a42450ee88 100644
--- a/packages/frontend-shared/js/i18n.ts
+++ b/packages/frontend-shared/js/i18n.ts
@@ -3,7 +3,7 @@
* SPDX-License-Identifier: AGPL-3.0-only
*/
-import type { ILocale, ParameterizedString } from '../../../locales/index.js';
+import type { ILocale, ParameterizedString } from 'i18n';
// eslint-disable-next-line @typescript-eslint/no-explicit-any
type TODO = any;
diff --git a/packages/frontend-shared/js/locale.ts b/packages/frontend-shared/js/locale.ts
index 87e3922fd9..38584fbed6 100644
--- a/packages/frontend-shared/js/locale.ts
+++ b/packages/frontend-shared/js/locale.ts
@@ -4,7 +4,7 @@
*/
import { lang, version } from '@@/js/config.js';
-import type { Locale } from '../../../locales/index.js';
+import type { Locale } from 'i18n';
// ここはビルド時に const locale = JSON.parse("...") みたいな感じで置き換えられるので top-level await は消える
export let locale: Locale = await window.fetch(`/assets/locales/${lang}.${version}.json`).then(r => r.json(), () => null);
diff --git a/packages/frontend-shared/js/store-boot-errors.ts b/packages/frontend-shared/js/store-boot-errors.ts
index 31e6248445..2741339165 100644
--- a/packages/frontend-shared/js/store-boot-errors.ts
+++ b/packages/frontend-shared/js/store-boot-errors.ts
@@ -3,7 +3,7 @@
* SPDX-License-Identifier: AGPL-3.0-only
*/
-import type { Locale } from '../../../locales/index.js';
+import type { Locale } from 'i18n';
type BootLoaderLocaleBody = Locale['_bootErrors'] & { reload: Locale['reload'] };
diff --git a/packages/frontend-shared/package.json b/packages/frontend-shared/package.json
index af4a6cb67e..baf5c561d8 100644
--- a/packages/frontend-shared/package.json
+++ b/packages/frontend-shared/package.json
@@ -22,10 +22,10 @@
},
"devDependencies": {
"@types/node": "24.10.1",
- "@typescript-eslint/eslint-plugin": "8.47.0",
- "@typescript-eslint/parser": "8.47.0",
+ "@typescript-eslint/eslint-plugin": "8.48.0",
+ "@typescript-eslint/parser": "8.48.0",
"esbuild": "0.27.0",
- "eslint-plugin-vue": "10.5.1",
+ "eslint-plugin-vue": "10.6.2",
"nodemon": "3.1.11",
"typescript": "5.9.3",
"vue-eslint-parser": "10.2.0"
@@ -34,7 +34,8 @@
"js-built"
],
"dependencies": {
+ "i18n": "workspace:*",
"misskey-js": "workspace:*",
- "vue": "3.5.24"
+ "vue": "3.5.25"
}
}
diff --git a/packages/frontend/.storybook/preload-locale.ts b/packages/frontend/.storybook/preload-locale.ts
index c823ff9bee..42918b44f3 100644
--- a/packages/frontend/.storybook/preload-locale.ts
+++ b/packages/frontend/.storybook/preload-locale.ts
@@ -4,7 +4,7 @@
*/
import { writeFile } from 'node:fs/promises';
-import locales from '../../../locales/index.js';
+import locales from 'i18n';
await writeFile(
new URL('locale.ts', import.meta.url),
diff --git a/packages/frontend/build.ts b/packages/frontend/build.ts
index 0401c2b9ba..0f605c745b 100644
--- a/packages/frontend/build.ts
+++ b/packages/frontend/build.ts
@@ -2,7 +2,7 @@ import * as fs from 'fs/promises';
import url from 'node:url';
import path from 'node:path';
import { execa } from 'execa';
-import locales from '../../locales/index.js';
+import locales from 'i18n';
import { LocaleInliner } from '../frontend-builder/locale-inliner.js'
import { createLogger } from '../frontend-builder/logger';
diff --git a/packages/frontend/lib/vite-plugin-watch-locales.ts b/packages/frontend/lib/vite-plugin-watch-locales.ts
index 8e209d27bd..372e9039d5 100644
--- a/packages/frontend/lib/vite-plugin-watch-locales.ts
+++ b/packages/frontend/lib/vite-plugin-watch-locales.ts
@@ -4,7 +4,7 @@
*/
import path from 'node:path'
-import locales from '../../../locales/index.js';
+import locales from 'i18n';
const localesDir = path.resolve(__dirname, '../../../locales')
@@ -13,14 +13,14 @@ const localesDir = path.resolve(__dirname, '../../../locales')
* @returns {import('vite').Plugin}
*/
export default function pluginWatchLocales() {
- return {
- name: 'watch-locales',
+ return {
+ name: 'watch-locales',
- configureServer(server) {
- const localeYmlPaths = Object.keys(locales).map(locale => path.join(localesDir, `${locale}.yml`));
+ configureServer(server) {
+ const localeYmlPaths = Object.keys(locales).map(locale => path.join(localesDir, `${locale}.yml`));
- // watcherにパスを追加
- server.watcher.add(localeYmlPaths);
+ // watcherにパスを追加
+ server.watcher.add(localeYmlPaths);
server.watcher.on('change', (filePath) => {
if (localeYmlPaths.includes(filePath)) {
@@ -31,6 +31,6 @@ export default function pluginWatchLocales() {
})
}
});
- },
- };
+ },
+ };
}
diff --git a/packages/frontend/package.json b/packages/frontend/package.json
index b6906e130a..c9d49201c4 100644
--- a/packages/frontend/package.json
+++ b/packages/frontend/package.json
@@ -20,16 +20,17 @@
"@discordapp/twemoji": "16.0.1",
"@github/webauthn-json": "2.1.1",
"@mcaptcha/vanilla-glue": "0.1.0-alpha-3",
+ "i18n": "workspace:*",
"@misskey-dev/browser-image-resizer": "2024.1.0",
"@rollup/plugin-json": "6.1.0",
"@rollup/plugin-replace": "6.0.3",
"@rollup/pluginutils": "5.3.0",
- "@sentry/vue": "10.26.0",
+ "@sentry/vue": "10.27.0",
"@syuilo/aiscript": "1.2.0",
"@syuilo/aiscript-0-19-0": "npm:@syuilo/aiscript@^0.19.0",
"@twemoji/parser": "16.0.0",
"@vitejs/plugin-vue": "6.0.2",
- "@vue/compiler-sfc": "3.5.24",
+ "@vue/compiler-sfc": "3.5.25",
"aiscript-vscode": "github:aiscript-dev/aiscript-vscode#v0.1.15",
"analytics": "0.8.19",
"astring": "1.9.0",
@@ -58,7 +59,7 @@
"json5": "2.2.3",
"magic-string": "0.30.21",
"matter-js": "0.20.0",
- "mediabunny": "1.25.0",
+ "mediabunny": "1.25.3",
"mfm-js": "0.25.0",
"misskey-bubble-game": "workspace:*",
"misskey-js": "workspace:*",
@@ -69,8 +70,8 @@
"qr-scanner": "1.4.2",
"rollup": "4.53.3",
"sanitize-html": "2.17.0",
- "sass": "1.94.1",
- "shiki": "3.15.0",
+ "sass": "1.94.2",
+ "shiki": "3.17.0",
"strict-event-emitter-types": "2.0.0",
"textarea-caret": "3.1.0",
"three": "0.181.2",
@@ -80,8 +81,8 @@
"tsconfig-paths": "4.2.0",
"typescript": "5.9.3",
"v-code-diff": "1.13.1",
- "vite": "7.2.2",
- "vue": "3.5.24",
+ "vite": "7.2.4",
+ "vue": "3.5.25",
"vuedraggable": "next",
"wanakana": "5.3.1"
},
@@ -89,7 +90,7 @@
"@misskey-dev/summaly": "5.2.5",
"@storybook/addon-essentials": "8.6.14",
"@storybook/addon-interactions": "8.6.14",
- "@storybook/addon-links": "9.1.16",
+ "@storybook/addon-links": "10.1.0",
"@storybook/addon-mdx-gfm": "8.6.14",
"@storybook/addon-storysource": "8.6.14",
"@storybook/blocks": "8.6.14",
@@ -97,13 +98,13 @@
"@storybook/core-events": "8.6.14",
"@storybook/manager-api": "8.6.14",
"@storybook/preview-api": "8.6.14",
- "@storybook/react": "9.1.16",
- "@storybook/react-vite": "9.1.16",
+ "@storybook/react": "10.1.0",
+ "@storybook/react-vite": "10.1.0",
"@storybook/test": "8.6.14",
"@storybook/theming": "8.6.14",
"@storybook/types": "8.6.14",
- "@storybook/vue3": "9.1.16",
- "@storybook/vue3-vite": "9.1.16",
+ "@storybook/vue3": "10.1.0",
+ "@storybook/vue3-vite": "10.1.0",
"@tabler/icons-webfont": "3.35.0",
"@testing-library/vue": "8.1.0",
"@types/canvas-confetti": "1.9.0",
@@ -117,38 +118,38 @@
"@types/throttle-debounce": "5.0.2",
"@types/tinycolor2": "1.4.6",
"@types/ws": "8.18.1",
- "@typescript-eslint/eslint-plugin": "8.47.0",
- "@typescript-eslint/parser": "8.47.0",
- "@vitest/coverage-v8": "3.2.4",
- "@vue/compiler-core": "3.5.24",
- "@vue/runtime-core": "3.5.24",
+ "@typescript-eslint/eslint-plugin": "8.48.0",
+ "@typescript-eslint/parser": "8.48.0",
+ "@vitest/coverage-v8": "4.0.14",
+ "@vue/compiler-core": "3.5.25",
+ "@vue/runtime-core": "3.5.25",
"acorn": "8.15.0",
"cross-env": "10.1.0",
- "cypress": "15.6.0",
+ "cypress": "15.7.0",
"eslint-plugin-import": "2.32.0",
- "eslint-plugin-vue": "10.5.1",
+ "eslint-plugin-vue": "10.6.2",
"fast-glob": "3.3.3",
- "happy-dom": "20.0.10",
+ "happy-dom": "20.0.11",
"intersection-observer": "0.12.2",
"micromatch": "4.0.8",
"minimatch": "10.1.1",
- "msw": "2.12.2",
+ "msw": "2.12.3",
"msw-storybook-addon": "2.0.6",
"nodemon": "3.1.11",
- "prettier": "3.6.2",
+ "prettier": "3.7.1",
"react": "19.2.0",
"react-dom": "19.2.0",
"seedrandom": "3.0.5",
- "start-server-and-test": "2.1.2",
- "storybook": "9.1.16",
+ "start-server-and-test": "2.1.3",
+ "storybook": "10.1.0",
"storybook-addon-misskey-theme": "github:misskey-dev/storybook-addon-misskey-theme",
"tsx": "4.20.6",
"vite-plugin-glsl": "1.5.4",
"vite-plugin-turbosnap": "1.0.3",
- "vitest": "3.2.4",
+ "vitest": "4.0.14",
"vitest-fetch-mock": "0.4.5",
- "vue-component-type-helpers": "3.1.4",
+ "vue-component-type-helpers": "3.1.5",
"vue-eslint-parser": "10.2.0",
- "vue-tsc": "3.1.4"
+ "vue-tsc": "3.1.5"
}
}
diff --git a/packages/backend/src/server/web/boot.js b/packages/frontend/public/loader/boot.js
index ab4b158287..ab4b158287 100644
--- a/packages/backend/src/server/web/boot.js
+++ b/packages/frontend/public/loader/boot.js
diff --git a/packages/backend/src/server/web/style.css b/packages/frontend/public/loader/style.css
index 8e63a2ea66..8e63a2ea66 100644
--- a/packages/backend/src/server/web/style.css
+++ b/packages/frontend/public/loader/style.css
diff --git a/packages/frontend/src/components/MkMediaImage.vue b/packages/frontend/src/components/MkMediaImage.vue
index 99ea606a11..f59d15d9a2 100644
--- a/packages/frontend/src/components/MkMediaImage.vue
+++ b/packages/frontend/src/components/MkMediaImage.vue
@@ -233,16 +233,18 @@ function showMenu(ev: MouseEvent) {
.hide {
display: block;
position: absolute;
- border-radius: 6px;
- background-color: var(--MI_THEME-fg);
- color: hsl(from var(--MI_THEME-accent) h s calc(l + 10));
+ background-color: rgba(0, 0, 0, 0.3);
+ -webkit-backdrop-filter: var(--MI-blur, blur(15px));
+ backdrop-filter: var(--MI-blur, blur(15px));
+ border-radius: 0 0 0 9px;
+ color: #fff;
font-size: 12px;
opacity: .5;
padding: 5px 8px;
text-align: center;
cursor: pointer;
- top: 12px;
- right: 12px;
+ top: 0;
+ right: 0;
}
.hiddenTextWrapper {
@@ -272,17 +274,17 @@ html[data-color-scheme=light] .visible {
.menu {
display: block;
position: absolute;
- border-radius: 999px;
background-color: rgba(0, 0, 0, 0.3);
-webkit-backdrop-filter: var(--MI-blur, blur(15px));
backdrop-filter: var(--MI-blur, blur(15px));
+ border-radius: 9px 0 0 0;
color: #fff;
font-size: 0.8em;
width: 28px;
height: 28px;
text-align: center;
- bottom: 10px;
- right: 10px;
+ bottom: 0;
+ right: 0;
}
.imageContainer {
diff --git a/packages/frontend/src/components/global/I18n.vue b/packages/frontend/src/components/global/I18n.vue
index 6b7723e6ac..9866e50958 100644
--- a/packages/frontend/src/components/global/I18n.vue
+++ b/packages/frontend/src/components/global/I18n.vue
@@ -9,7 +9,7 @@ SPDX-License-Identifier: AGPL-3.0-only
<script setup lang="ts" generic="T extends string | ParameterizedString">
import { computed, h } from 'vue';
-import type { ParameterizedString } from '../../../../../locales/index.js';
+import type { ParameterizedString } from 'i18n';
const props = withDefaults(defineProps<{
src: T;
@@ -25,7 +25,7 @@ const slots = defineSlots<T extends ParameterizedString<infer R> ? { [K in R]: (
const parsed = computed(() => {
let str = props.src as string;
const value: (string | { arg: string; })[] = [];
- for (;;) {
+ for (; ;) {
const nextBracketOpen = str.indexOf('{');
const nextBracketClose = str.indexOf('}');
diff --git a/packages/frontend/src/components/global/StackingRouterView.vue b/packages/frontend/src/components/global/StackingRouterView.vue
index 4c56767608..d52dd9b89d 100644
--- a/packages/frontend/src/components/global/StackingRouterView.vue
+++ b/packages/frontend/src/components/global/StackingRouterView.vue
@@ -74,6 +74,7 @@ function mount() {
}
function back() {
+ if (tabs.value.length <= 1) return; // transitionの関係でタブが1つの状態でbackが呼ばれることがある
const prev = tabs.value[tabs.value.length - 2];
tabs.value = [...tabs.value.slice(0, tabs.value.length - 1)];
router?.replaceByPath(prev.fullPath);
diff --git a/packages/frontend/src/i18n.ts b/packages/frontend/src/i18n.ts
index 0b2b206b7e..6a3a18df17 100644
--- a/packages/frontend/src/i18n.ts
+++ b/packages/frontend/src/i18n.ts
@@ -6,7 +6,7 @@
import { markRaw } from 'vue';
import { I18n } from '@@/js/i18n.js';
import { locale } from '@@/js/locale.js';
-import type { Locale } from '../../../locales/index.js';
+import type { Locale } from 'i18n';
export const i18n = markRaw(new I18n<Locale>(locale, _DEV_));
diff --git a/packages/frontend/src/theme.ts b/packages/frontend/src/theme.ts
index fc3f5f55f2..e001bed8f3 100644
--- a/packages/frontend/src/theme.ts
+++ b/packages/frontend/src/theme.ts
@@ -144,7 +144,9 @@ export function applyTheme(theme: Theme, persist = true) {
if (theme.id === currentThemeId && miLocalStorage.getItem('themeCachedVersion') === version) return;
currentThemeId = theme.id;
- if (window.document.startViewTransition != null) {
+ // visibilityStateがhiddenな状態でstartViewTransitionするとブラウザによってはエラーになる
+ // 通常hiddenな時に呼ばれることはないが、iOSのPWAだとアプリ切り替え時に(何故か)hiddenな状態で(何故か)一瞬デバイスのダークモード判定が変わりapplyThemeが呼ばれる場合がある
+ if (window.document.startViewTransition != null && window.document.visibilityState === 'visible') {
window.document.documentElement.classList.add('_themeChanging_');
try {
window.document.startViewTransition(async () => {
diff --git a/packages/frontend/test/aiscript/api.test.ts b/packages/frontend/test/aiscript/api.test.ts
index 34f880286c..292ec7ca77 100644
--- a/packages/frontend/test/aiscript/api.test.ts
+++ b/packages/frontend/test/aiscript/api.test.ts
@@ -8,7 +8,6 @@ import { aiScriptReadline, createAiScriptEnv } from '@/aiscript/api.js';
import { errors, Interpreter, Parser, values } from '@syuilo/aiscript';
import {
afterAll,
- afterEach,
beforeAll,
beforeEach,
describe,
@@ -80,8 +79,9 @@ describe('AiScript common API', () => {
});
describe('readline', () => {
- afterEach(() => {
+ beforeEach(() => {
vi.restoreAllMocks();
+ vi.clearAllMocks();
});
test.sequential('ok', async () => {
@@ -176,8 +176,9 @@ describe('AiScript common API', () => {
});
describe('dialog', () => {
- afterEach(() => {
+ beforeEach(() => {
vi.restoreAllMocks();
+ vi.clearAllMocks();
});
test.sequential('ok', async () => {
@@ -215,8 +216,9 @@ describe('AiScript common API', () => {
});
describe('confirm', () => {
- afterEach(() => {
+ beforeEach(() => {
vi.restoreAllMocks();
+ vi.clearAllMocks();
});
test.sequential('ok', async () => {
@@ -272,8 +274,9 @@ describe('AiScript common API', () => {
});
describe('api', () => {
- afterEach(() => {
+ beforeEach(() => {
vi.restoreAllMocks();
+ vi.clearAllMocks();
});
test.sequential('successful', async () => {
@@ -347,7 +350,7 @@ describe('AiScript common API', () => {
miLocalStorage.removeItem('aiscript:widget:key');
});
- afterEach(() => {
+ beforeEach(() => {
miLocalStorage.removeItem('aiscript:widget:key');
});
diff --git a/packages/frontend/test/i18n.test.ts b/packages/frontend/test/i18n.test.ts
index a51dfc6c4e..14b89f898d 100644
--- a/packages/frontend/test/i18n.test.ts
+++ b/packages/frontend/test/i18n.test.ts
@@ -5,7 +5,7 @@
import { describe, expect, it } from 'vitest';
import { I18n } from '../../frontend-shared/js/i18n.js'; // @@で参照できなかったので
-import type { ParameterizedString } from '../../../locales/index.js';
+import type { ParameterizedString } from 'i18n';
// TODO: このテストはfrontend-sharedに移動する
diff --git a/packages/frontend/test/init.ts b/packages/frontend/test/init.ts
index e38338cf95..28848f6c2f 100644
--- a/packages/frontend/test/init.ts
+++ b/packages/frontend/test/init.ts
@@ -7,13 +7,13 @@ import { vi } from 'vitest';
import createFetchMock from 'vitest-fetch-mock';
import type { Ref } from 'vue';
import { ref } from 'vue';
+// Set i18n
+import locales from 'i18n';
+import { updateI18n } from '@/i18n.js';
const fetchMocker = createFetchMock(vi);
fetchMocker.enableMocks();
-// Set i18n
-import locales from '../../../locales/index.js';
-import { updateI18n } from '@/i18n.js';
updateI18n(locales['en-US']);
// XXX: misskey-js panics if WebSocket is not defined
diff --git a/packages/frontend/vite.config.ts b/packages/frontend/vite.config.ts
index 6f320e99c9..c9c20b23ea 100644
--- a/packages/frontend/vite.config.ts
+++ b/packages/frontend/vite.config.ts
@@ -2,18 +2,18 @@ import path from 'path';
import pluginReplace from '@rollup/plugin-replace';
import pluginVue from '@vitejs/plugin-vue';
import pluginGlsl from 'vite-plugin-glsl';
-import { defineConfig } from 'vite';
import type { UserConfig } from 'vite';
+import { defineConfig } from 'vite';
import * as yaml from 'js-yaml';
import { promises as fsp } from 'fs';
-import locales from '../../locales/index.js';
+import locales from 'i18n';
import meta from '../../package.json';
import packageInfo from './package.json' with { type: 'json' };
import pluginUnwindCssModuleClassName from './lib/rollup-plugin-unwind-css-module-class-name.js';
import pluginJson5 from './vite.json5.js';
-import pluginCreateSearchIndex from './lib/vite-plugin-create-search-index.js';
import type { Options as SearchIndexOptions } from './lib/vite-plugin-create-search-index.js';
+import pluginCreateSearchIndex from './lib/vite-plugin-create-search-index.js';
import pluginWatchLocales from './lib/vite-plugin-watch-locales.js';
import { pluginRemoveUnrefI18n } from '../frontend-builder/rollup-plugin-remove-unref-i18n.js';
diff --git a/packages/i18n/README.md b/packages/i18n/README.md
new file mode 100644
index 0000000000..1013b84ea6
--- /dev/null
+++ b/packages/i18n/README.md
@@ -0,0 +1,5 @@
+# Misskey i18n
+
+Misskey の言語ファイル本体 (ja-JP.yml など) はリポジトリ直下の `/locales` に置かれており、そこから Crowdin 連携やビルド資産が生成されます。
+
+このパッケージは Misskey モノレポ内で、これらの言語ファイルを共通で扱うためのヘルパー群や型情報をまとめる位置づけです。バックエンド / フロントエンド / Service Worker など各パッケージが同じ翻訳データと型定義を利用できるようにすることを目的としており、npm での外部配布は想定していません。
diff --git a/packages/i18n/build.ts b/packages/i18n/build.ts
new file mode 100644
index 0000000000..a6bbf7dc63
--- /dev/null
+++ b/packages/i18n/build.ts
@@ -0,0 +1,163 @@
+/*
+ * SPDX-FileCopyrightText: syuilo and misskey-project
+ * SPDX-License-Identifier: AGPL-3.0-only
+ */
+
+import fs from 'node:fs';
+import { fileURLToPath } from 'node:url';
+import { dirname, resolve } from 'node:path';
+import { watch as chokidarWatch } from 'chokidar';
+import * as esbuild from 'esbuild';
+import { build } from 'esbuild';
+import { execa } from 'execa';
+import { globSync } from 'glob';
+import { generateLocaleInterface } from './scripts/generateLocaleInterface.js';
+import type { BuildOptions, BuildResult, Plugin, PluginBuild } from 'esbuild';
+
+const _filename = fileURLToPath(import.meta.url);
+const _dirname = dirname(_filename);
+const _package = JSON.parse(fs.readFileSync(_dirname + '/package.json', 'utf-8'));
+const _rootPackageDir = resolve(_dirname, '../../');
+const _rootPackage = JSON.parse(fs.readFileSync(resolve(_rootPackageDir, 'package.json'), 'utf-8'));
+const _frontendLocalesDir = resolve(_dirname, '../../built/_frontend_dist_/locales');
+const _localesDir = resolve(_rootPackageDir, 'locales');
+
+const entryPoints = globSync('./src/**/**.{ts,tsx}');
+
+const options: BuildOptions = {
+ entryPoints,
+ minify: process.env.NODE_ENV === 'production',
+ sourceRoot: 'src',
+ outdir: './built',
+ target: 'es2022',
+ platform: 'node',
+ format: 'esm',
+ sourcemap: 'linked',
+};
+
+// コマンドライン引数を取得
+const args = process.argv.slice(2).map(arg => arg.toLowerCase());
+
+// built配下をすべて削除する
+if (!args.includes('--no-clean')) {
+ fs.rmSync('./built', { recursive: true, force: true });
+}
+
+if (args.includes('--watch')) {
+ await watchSrc();
+} else {
+ await buildSrc();
+}
+
+function copyLocales(): void {
+ const srcDir = _localesDir;
+ const destDir = resolve(_dirname, 'built/locales');
+
+ fs.mkdirSync(destDir, { recursive: true });
+
+ const files = fs.readdirSync(srcDir).filter(f => f.endsWith('.yml'));
+ for (const file of files) {
+ fs.copyFileSync(resolve(srcDir, file), resolve(destDir, file));
+ }
+ console.log(`[${_package.name}] locales copied (${files.length} files).`);
+}
+
+/**
+ * フロントエンド用の locale JSON を書き出す
+ * Service Worker が HTTP 経由で取得するために必要
+ */
+async function writeFrontendLocalesJson(): Promise<void> {
+ // 動的 import でビルド済みモジュールから読み込み(循環参照回避)
+ const { writeFrontendLocalesJson: write } = await import('./built/index.js');
+ await write(_frontendLocalesDir, _rootPackage.version);
+ console.log(`[${_package.name}] frontend locales JSON written to ${_frontendLocalesDir}`);
+}
+
+async function buildSrc(): Promise<void> {
+ console.log(`[${_package.name}] start building...`);
+
+ await generateLocaleInterface(_localesDir);
+
+ await build(options)
+ .then(() => {
+ console.log(`[${_package.name}] build succeeded.`);
+ })
+ .catch((err) => {
+ process.stderr.write(err.stderr);
+ process.exit(1);
+ });
+
+ copyLocales();
+ await writeFrontendLocalesJson();
+
+ if (process.env.NODE_ENV === 'production') {
+ console.log(`[${_package.name}] skip building d.ts because NODE_ENV is production.`);
+ } else {
+ await buildDts();
+ }
+
+ console.log(`[${_package.name}] finish building.`);
+}
+
+function buildDts(): Promise<unknown> {
+ return execa(
+ 'tsc',
+ [
+ '--project', 'tsconfig.json',
+ '--rootDir', 'src',
+ '--outDir', 'built',
+ '--declaration', 'true',
+ '--emitDeclarationOnly', 'true',
+ ],
+ {
+ stdout: process.stdout,
+ stderr: process.stderr,
+ },
+ );
+}
+
+async function watchSrc(): Promise<void> {
+ const localesWatcher = chokidarWatch(_localesDir, {
+ ignoreInitial: true,
+ });
+ localesWatcher.on('all', async (event, path) => {
+ if (!path.endsWith('.yml')) return;
+ console.log(`[${_package.name}] locales changed: ${event} ${path}`);
+ copyLocales();
+ await writeFrontendLocalesJson();
+ await generateLocaleInterface(_localesDir);
+ });
+
+ const plugins: Plugin[] = [{
+ name: 'gen-dts',
+ setup(build: PluginBuild) {
+ build.onStart(() => {
+ console.log(`[${_package.name}] detect changed...`);
+ });
+ build.onEnd(async (result: BuildResult) => {
+ if (result.errors.length > 0) {
+ console.error(`[${_package.name}] watch build failed:`, result);
+ return;
+ }
+ await buildDts();
+ });
+ },
+ }];
+
+ console.log(`[${_package.name}] start watching...`);
+
+ const context = await esbuild.context({ ...options, plugins });
+ await context.watch();
+
+ await new Promise((resolve, reject) => {
+ process.on('SIGHUP', resolve);
+ process.on('SIGINT', resolve);
+ process.on('SIGTERM', resolve);
+ process.on('uncaughtException', reject);
+ process.on('exit', resolve);
+ }).finally(async () => {
+ await context.dispose();
+ await localesWatcher.close();
+ console.log(`[${_package.name}] finish watching.`);
+ });
+}
diff --git a/packages/i18n/eslint.config.js b/packages/i18n/eslint.config.js
new file mode 100644
index 0000000000..f18bc4a4be
--- /dev/null
+++ b/packages/i18n/eslint.config.js
@@ -0,0 +1,35 @@
+import tsParser from '@typescript-eslint/parser';
+import sharedConfig from '../shared/eslint.config.js';
+
+// eslint-disable-next-line import/no-default-export
+export default [
+ ...sharedConfig,
+ {
+ ignores: [
+ '**/node_modules',
+ 'built',
+ 'coverage',
+ 'vitest.config.ts',
+ 'test',
+ 'test-d',
+ 'generator',
+ ],
+ },
+ {
+ files: ['**/*.ts', '**/*.tsx'],
+ languageOptions: {
+ parserOptions: {
+ parser: tsParser,
+ project: ['./tsconfig.eslint.json'],
+ sourceType: 'module',
+ tsconfigRootDir: import.meta.dirname,
+ },
+ },
+ },
+ {
+ files: ['src/autogen/**/*.ts', 'src/autogen/**/*.tsx'],
+ rules: {
+ '@stylistic/indent': 'off',
+ },
+ },
+];
diff --git a/packages/i18n/package.json b/packages/i18n/package.json
new file mode 100644
index 0000000000..6ba41632e8
--- /dev/null
+++ b/packages/i18n/package.json
@@ -0,0 +1,46 @@
+{
+ "name": "i18n",
+ "type": "module",
+ "private": true,
+ "main": "./built/index.js",
+ "types": "./built/index.d.ts",
+ "exports": {
+ ".": {
+ "types": "./built/index.d.ts",
+ "import": "./built/index.js"
+ },
+ "./const": {
+ "types": "./built/const.d.ts",
+ "import": "./built/const.js"
+ }
+ },
+ "scripts": {
+ "generate": "tsx scripts/generateLocaleInterface.ts",
+ "verify": "tsx scripts/verify.ts",
+ "build": "tsx ./build.ts",
+ "watch": "nodemon -w package.json -e json --exec \"tsx ./build.ts --watch\"",
+ "tsd": "tsd",
+ "typecheck": "tsc --noEmit",
+ "lint": "pnpm typecheck && pnpm eslint",
+ "lint:fix": "pnpm eslint --fix"
+ },
+ "files": [
+ "built"
+ ],
+ "devDependencies": {
+ "@types/js-yaml": "4.0.9",
+ "@types/node": "24.10.1",
+ "@typescript-eslint/eslint-plugin": "8.47.0",
+ "@typescript-eslint/parser": "8.47.0",
+ "chokidar": "4.0.3",
+ "esbuild": "0.27.0",
+ "execa": "9.6.0",
+ "glob": "11.1.0",
+ "nodemon": "3.1.11",
+ "tsx": "4.20.6",
+ "typescript": "5.9.3"
+ },
+ "dependencies": {
+ "js-yaml": "4.1.1"
+ }
+}
diff --git a/packages/i18n/scripts/generateLocaleInterface.ts b/packages/i18n/scripts/generateLocaleInterface.ts
new file mode 100644
index 0000000000..1c0f5c6a79
--- /dev/null
+++ b/packages/i18n/scripts/generateLocaleInterface.ts
@@ -0,0 +1,153 @@
+/*
+ * SPDX-FileCopyrightText: syuilo and misskey-project
+ * SPDX-License-Identifier: AGPL-3.0-only
+ */
+
+import * as fs from 'node:fs';
+import { fileURLToPath } from 'node:url';
+import { dirname, resolve } from 'node:path';
+import * as yaml from 'js-yaml';
+import ts from 'typescript';
+
+const __filename = fileURLToPath(import.meta.url);
+const __dirname = dirname(__filename);
+const parameterRegExp = /\{(\w+)\}/g;
+
+interface LocaleRecord {
+ [key: string]: string | LocaleRecord;
+}
+
+function createMemberType(item: string | LocaleRecord): ts.TypeNode {
+ if (typeof item !== 'string') {
+ return ts.factory.createTypeLiteralNode(createMembers(item));
+ }
+ const parameters = Array.from(
+ item.matchAll(parameterRegExp),
+ ([, parameter]) => parameter,
+ );
+ return parameters.length
+ ? ts.factory.createTypeReferenceNode(
+ ts.factory.createIdentifier('ParameterizedString'),
+ [
+ ts.factory.createUnionTypeNode(
+ parameters.map((parameter) =>
+ ts.factory.createLiteralTypeNode(ts.factory.createStringLiteral(parameter)),
+ ),
+ ),
+ ],
+ )
+ : ts.factory.createKeywordTypeNode(ts.SyntaxKind.StringKeyword);
+}
+
+function createMembers(record: LocaleRecord): ts.TypeElement[] {
+ return Object.entries(record).map(([k, v]) => {
+ const node = ts.factory.createPropertySignature(
+ undefined,
+ ts.factory.createStringLiteral(k),
+ undefined,
+ createMemberType(v),
+ );
+ if (typeof v === 'string') {
+ ts.addSyntheticLeadingComment(
+ node,
+ ts.SyntaxKind.MultiLineCommentTrivia,
+ `*
+ * ${v.replace(/\n/g, '\n * ')}
+ `,
+ true,
+ );
+ }
+ return node;
+ });
+}
+
+export async function generateLocaleInterface(localesDir: string): Promise<void> {
+ const locale = yaml.load(fs.readFileSync(`${localesDir}/ja-JP.yml`, 'utf-8').toString()) as LocaleRecord;
+ const members = createMembers(locale);
+
+ const elements: ts.Statement[] = [
+ ts.factory.createImportDeclaration(
+ undefined,
+ ts.factory.createImportClause(
+ false,
+ undefined,
+ ts.factory.createNamedImports([
+ ts.factory.createImportSpecifier(
+ true,
+ undefined,
+ ts.factory.createIdentifier('ILocale'),
+ ),
+ ts.factory.createImportSpecifier(
+ true,
+ undefined,
+ ts.factory.createIdentifier('ParameterizedString'),
+ ),
+ ]),
+ ),
+ ts.factory.createStringLiteral('../types.js'),
+ undefined,
+ ),
+ ts.factory.createInterfaceDeclaration(
+ [ts.factory.createToken(ts.SyntaxKind.ExportKeyword)],
+ ts.factory.createIdentifier('Locale'),
+ undefined,
+ [
+ ts.factory.createHeritageClause(ts.SyntaxKind.ExtendsKeyword, [
+ ts.factory.createExpressionWithTypeArguments(
+ ts.factory.createIdentifier('ILocale'),
+ undefined,
+ ),
+ ]),
+ ],
+ members,
+ ),
+ ];
+
+ ts.addSyntheticLeadingComment(
+ elements[0],
+ ts.SyntaxKind.MultiLineCommentTrivia,
+ ' eslint-disable ',
+ true,
+ );
+ ts.addSyntheticLeadingComment(
+ elements[0],
+ ts.SyntaxKind.SingleLineCommentTrivia,
+ ' This file is generated by scripts/generateLocaleInterface.ts',
+ true,
+ );
+ ts.addSyntheticLeadingComment(
+ elements[0],
+ ts.SyntaxKind.SingleLineCommentTrivia,
+ ' Do not edit this file directly.',
+ true,
+ );
+
+ const printed = ts
+ .createPrinter({
+ newLine: ts.NewLineKind.LineFeed,
+ })
+ .printList(
+ ts.ListFormat.MultiLine,
+ ts.factory.createNodeArray(elements),
+ ts.createSourceFile(
+ 'locale.ts',
+ '',
+ ts.ScriptTarget.ESNext,
+ true,
+ ts.ScriptKind.TS,
+ ),
+ );
+
+ const autogenDir = `${__dirname}/../src/autogen`;
+ fs.mkdirSync(autogenDir, { recursive: true });
+
+ // 一瞬ファイルが存在しなくなって途切れる→不安定になるらしいので、リネームで対処
+ fs.writeFileSync(`${autogenDir}/_locale.ts`, printed, 'utf-8');
+ fs.renameSync(`${autogenDir}/_locale.ts`, `${autogenDir}/locale.ts`);
+}
+
+// スクリプトとして直接実行された場合
+const isMain = import.meta.url === `file://${process.argv[1]}`;
+if (isMain) {
+ await generateLocaleInterface(resolve(__dirname, '../../../locales'));
+}
diff --git a/packages/i18n/scripts/verify.ts b/packages/i18n/scripts/verify.ts
new file mode 100644
index 0000000000..877966e49f
--- /dev/null
+++ b/packages/i18n/scripts/verify.ts
@@ -0,0 +1,70 @@
+/*
+ * SPDX-FileCopyrightText: syuilo and misskey-project
+ * SPDX-License-Identifier: AGPL-3.0-only
+ */
+
+let valid = true;
+
+interface LocaleRecord {
+ [key: string]: string | LocaleRecord;
+}
+
+interface ErrorData {
+ expected?: string;
+ actual?: string;
+ parameter?: string;
+}
+
+function writeError(type: string, lang: string, tree: string, data: ErrorData): void {
+ process.stderr.write(JSON.stringify({ type, lang, tree, data }));
+ process.stderr.write('\n');
+ valid = false;
+}
+
+function verify(expected: LocaleRecord, actual: LocaleRecord, lang: string, trace?: string): void {
+ for (const key in expected) {
+ if (!Object.prototype.hasOwnProperty.call(actual, key)) {
+ continue;
+ }
+ if (typeof expected[key] === 'object') {
+ if (typeof actual[key] !== 'object') {
+ writeError('mismatched_type', lang, trace ? `${trace}.${key}` : key, { expected: 'object', actual: typeof actual[key] });
+ continue;
+ }
+ verify(expected[key] as LocaleRecord, actual[key] as LocaleRecord, lang, trace ? `${trace}.${key}` : key);
+ } else if (typeof expected[key] === 'string') {
+ switch (typeof actual[key]) {
+ case 'object':
+ writeError('mismatched_type', lang, trace ? `${trace}.${key}` : key, { expected: 'string', actual: 'object' });
+ break;
+ case 'undefined':
+ continue;
+ case 'string': {
+ const expectedParameters = new Set((expected[key] as string).match(/\{[^}]+\}/g)?.map((s) => s.slice(1, -1)));
+ const actualParameters = new Set((actual[key] as string).match(/\{[^}]+\}/g)?.map((s) => s.slice(1, -1)));
+ for (const parameter of expectedParameters) {
+ if (!actualParameters.has(parameter)) {
+ writeError('missing_parameter', lang, trace ? `${trace}.${key}` : key, { parameter });
+ }
+ }
+ }
+ }
+ }
+ }
+}
+
+// index.tsはtsのまま動かすことを想定していない(ビルド成果物を外部に公開する).
+// よってビルド後のものを検証する
+const locales = await import('../built/index.js');
+const { 'ja-JP': original, ...verifiees } = locales as unknown as Record<string, LocaleRecord>;
+
+for (const lang in verifiees) {
+ if (!Object.prototype.hasOwnProperty.call(locales, lang)) {
+ continue;
+ }
+ verify(original, verifiees[lang], lang);
+}
+
+if (!valid) {
+ process.exit(1);
+}
diff --git a/locales/index.d.ts b/packages/i18n/src/autogen/locale.ts
index 7f0efd22e8..8f94aab555 100644
--- a/locales/index.d.ts
+++ b/packages/i18n/src/autogen/locale.ts
@@ -1,13 +1,7 @@
/* eslint-disable */
-// This file is generated by locales/generateDTS.js
+// This file is generated by scripts/generateLocaleInterface.ts
// Do not edit this file directly.
-declare const kParameters: unique symbol;
-export type ParameterizedString<T extends string = string> = string & {
- [kParameters]: T;
-};
-export interface ILocale {
- [_: string]: string | ParameterizedString | ILocale;
-}
+import { type ILocale, type ParameterizedString } from "../types.js";
export interface Locale extends ILocale {
/**
* 日本語
@@ -13089,8 +13083,3 @@ export interface Locale extends ILocale {
"mfm": string;
};
}
-declare const locales: {
- [lang: string]: Locale;
-};
-export function build(): Locale;
-export default locales;
diff --git a/packages/i18n/src/const.ts b/packages/i18n/src/const.ts
new file mode 100644
index 0000000000..bb690e7542
--- /dev/null
+++ b/packages/i18n/src/const.ts
@@ -0,0 +1,41 @@
+/*
+ * SPDX-FileCopyrightText: syuilo and misskey-project
+ * SPDX-License-Identifier: AGPL-3.0-only
+ */
+
+export const languages = [
+ 'ar-SA',
+ 'ca-ES',
+ 'cs-CZ',
+ 'da-DK',
+ 'de-DE',
+ 'en-US',
+ 'es-ES',
+ 'fr-FR',
+ 'id-ID',
+ 'it-IT',
+ 'ja-JP',
+ 'ja-KS',
+ 'kab-KAB',
+ 'kn-IN',
+ 'ko-KR',
+ 'nl-NL',
+ 'no-NO',
+ 'pl-PL',
+ 'pt-PT',
+ 'ru-RU',
+ 'sk-SK',
+ 'th-TH',
+ 'tr-TR',
+ 'ug-CN',
+ 'uk-UA',
+ 'vi-VN',
+ 'zh-CN',
+ 'zh-TW',
+] as const;
+
+export const primaries = {
+ 'en': 'US',
+ 'ja': 'JP',
+ 'zh': 'CN',
+} as const satisfies Record<string, string>;
diff --git a/packages/i18n/src/index.ts b/packages/i18n/src/index.ts
new file mode 100644
index 0000000000..21d215159f
--- /dev/null
+++ b/packages/i18n/src/index.ts
@@ -0,0 +1,130 @@
+/*
+ * SPDX-FileCopyrightText: syuilo and misskey-project
+ * SPDX-License-Identifier: AGPL-3.0-only
+ */
+
+/**
+ * Languages Loader
+ */
+
+import * as fs from 'node:fs';
+import * as yaml from 'js-yaml';
+import { languages, primaries } from './const.js';
+import type { Locale } from './autogen/locale.js';
+import type { ILocale, ParameterizedString } from './types.js';
+
+type Language = typeof languages[number];
+
+type PrimaryLang = keyof typeof primaries;
+
+type Locales = Record<Language, ILocale>;
+
+/**
+ * オブジェクトを再帰的にマージする
+ */
+function merge<T extends ILocale>(...args: (T | ILocale | undefined)[]): T {
+ return args.reduce<ILocale>((a, c) => ({
+ ...a,
+ ...c,
+ ...Object.entries(a)
+ .filter(([k]) => c && typeof c[k] === 'object')
+ .reduce<Record<string, ILocale[string]>>((acc, [k, v]) => {
+ acc[k] = merge(v as ILocale, (c as ILocale)[k] as ILocale);
+ return acc;
+ }, {}),
+ }), {} as ILocale) as T;
+}
+
+/**
+ * 何故か文字列にバックスペース文字が混入することがあり、YAMLが壊れるので取り除く
+ */
+function clean (text: string) {
+ return text.replace(new RegExp(String.fromCodePoint(0x08), 'g'), '');
+}
+
+/**
+ * 空文字列が入ることがあり、フォールバックが動作しなくなるのでプロパティごと消す
+ */
+function removeEmpty<T extends ILocale>(obj: T): T {
+ for (const [k, v] of Object.entries(obj)) {
+ if (v === '') {
+ delete obj[k];
+ } else if (typeof v === 'object') {
+ removeEmpty(v as ILocale);
+ }
+ }
+ return obj;
+}
+
+function build(): Record<Language, Locale> {
+ // vitestの挙動を調整するため、一度ローカル変数化する必要がある
+ // https://github.com/vitest-dev/vitest/issues/3988#issuecomment-1686599577
+ // https://github.com/misskey-dev/misskey/pull/14057#issuecomment-2192833785
+ const metaUrl = import.meta.url;
+ const locales = languages.reduce<Locales>((a, lang) => {
+ a[lang] = (yaml.load(clean(fs.readFileSync(new URL(`./locales/${lang}.yml`, metaUrl), 'utf-8'))) ?? {}) as ILocale;
+ return a;
+ }, {} as Locales);
+
+ removeEmpty(locales);
+
+ return Object.entries(locales).reduce<Record<Language, Locale>>((a, [k, v]) => {
+ const lang = k.split('-')[0];
+ const key = k as Language;
+
+ switch (key) {
+ case 'ja-JP':
+ a[key] = v as Locale;
+ break;
+ case 'ja-KS':
+ case 'en-US':
+ a[key] = merge<Locale>(locales['ja-JP'] as Locale, v);
+ break;
+ default: {
+ const primaryLang = lang as PrimaryLang;
+ const primaryKey = (lang in primaries ? `${lang}-${primaries[primaryLang]}` : undefined) as Language | undefined;
+ a[key] = merge<Locale>(
+ locales['ja-JP'] as Locale,
+ locales['en-US'],
+ primaryKey ? locales[primaryKey] : {},
+ v,
+ );
+ break;
+ }
+ }
+
+ return a;
+ }, {} as Record<Language, Locale>);
+}
+
+const locales = build() as {
+ [lang: string]: Locale;
+};
+
+/**
+ * フロントエンド用の locale JSON を書き出す
+ * Service Worker が HTTP 経由で取得するために必要
+ * @param destDir 出力先ディレクトリ(例: built/_frontend_dist_/locales)
+ * @param version バージョン文字列(ファイル名とJSON内に埋め込まれる)
+ */
+async function writeFrontendLocalesJson(destDir: string, version: string): Promise<void> {
+ const { mkdir, writeFile } = await import('node:fs/promises');
+ const { resolve } = await import('node:path');
+
+ await mkdir(destDir, { recursive: true });
+
+ const builtLocales = build();
+ const v = { '_version_': version };
+
+ for (const [lang, locale] of Object.entries(builtLocales)) {
+ await writeFile(
+ resolve(destDir, `${lang}.${version}.json`),
+ JSON.stringify({ ...locale, ...v }),
+ 'utf-8',
+ );
+ }
+}
+
+export { locales, languages, build, writeFrontendLocalesJson };
+export type { Language, Locale, ILocale, ParameterizedString };
+export default locales;
diff --git a/packages/i18n/src/types.ts b/packages/i18n/src/types.ts
new file mode 100644
index 0000000000..cf9568e792
--- /dev/null
+++ b/packages/i18n/src/types.ts
@@ -0,0 +1,14 @@
+/*
+ * SPDX-FileCopyrightText: syuilo and misskey-project
+ * SPDX-License-Identifier: AGPL-3.0-only
+ */
+
+declare const kParameters: unique symbol;
+
+export type ParameterizedString<T extends string = string> = string & {
+ [kParameters]: T;
+};
+
+export interface ILocale {
+ [_: string]: string | ParameterizedString | ILocale;
+}
diff --git a/packages/i18n/tsconfig.eslint.json b/packages/i18n/tsconfig.eslint.json
new file mode 100644
index 0000000000..5aea206cd1
--- /dev/null
+++ b/packages/i18n/tsconfig.eslint.json
@@ -0,0 +1,8 @@
+{
+ "extends": "./tsconfig.json",
+ "include": [
+ "src/**/*.ts",
+ "scripts/**/*.ts",
+ "build.ts"
+ ]
+} \ No newline at end of file
diff --git a/packages/i18n/tsconfig.json b/packages/i18n/tsconfig.json
new file mode 100644
index 0000000000..31cd39b8ba
--- /dev/null
+++ b/packages/i18n/tsconfig.json
@@ -0,0 +1,14 @@
+{
+ "compilerOptions": {
+ "target": "ESNext",
+ "module": "NodeNext",
+ "moduleResolution": "NodeNext",
+ "esModuleInterop": true,
+ "forceConsistentCasingInFileNames": true,
+ "strict": true,
+ "skipLibCheck": true
+ },
+ "include": [
+ "src/**/*.ts"
+ ]
+} \ No newline at end of file
diff --git a/packages/icons-subsetter/package.json b/packages/icons-subsetter/package.json
index 9ca6ee35cb..2c6eac150b 100644
--- a/packages/icons-subsetter/package.json
+++ b/packages/icons-subsetter/package.json
@@ -13,8 +13,8 @@
"devDependencies": {
"@types/node": "24.10.1",
"@types/wawoff2": "1.0.2",
- "@typescript-eslint/eslint-plugin": "8.47.0",
- "@typescript-eslint/parser": "8.47.0"
+ "@typescript-eslint/eslint-plugin": "8.48.0",
+ "@typescript-eslint/parser": "8.48.0"
},
"dependencies": {
"@tabler/icons-webfont": "3.35.0",
diff --git a/packages/misskey-bubble-game/package.json b/packages/misskey-bubble-game/package.json
index 5d3f386c96..8dd68aec44 100644
--- a/packages/misskey-bubble-game/package.json
+++ b/packages/misskey-bubble-game/package.json
@@ -27,8 +27,8 @@
"@types/matter-js": "0.20.2",
"@types/node": "24.10.1",
"@types/seedrandom": "3.0.8",
- "@typescript-eslint/eslint-plugin": "8.47.0",
- "@typescript-eslint/parser": "8.47.0",
+ "@typescript-eslint/eslint-plugin": "8.48.0",
+ "@typescript-eslint/parser": "8.48.0",
"esbuild": "0.27.0",
"execa": "9.6.0",
"glob": "11.1.0",
diff --git a/packages/misskey-js/package.json b/packages/misskey-js/package.json
index a961f2a25c..1c0e6ceee6 100644
--- a/packages/misskey-js/package.json
+++ b/packages/misskey-js/package.json
@@ -1,7 +1,7 @@
{
"type": "module",
"name": "misskey-js",
- "version": "2025.11.1",
+ "version": "2025.12.0",
"description": "Misskey SDK for JavaScript",
"license": "MIT",
"main": "./built/index.js",
@@ -37,11 +37,11 @@
"directory": "packages/misskey-js"
},
"devDependencies": {
- "@microsoft/api-extractor": "7.55.0",
+ "@microsoft/api-extractor": "7.55.1",
"@types/node": "24.10.1",
"@typescript-eslint/eslint-plugin": "8.47.0",
"@typescript-eslint/parser": "8.47.0",
- "@vitest/coverage-v8": "4.0.10",
+ "@vitest/coverage-v8": "4.0.13",
"esbuild": "0.27.0",
"execa": "9.6.0",
"glob": "13.0.0",
@@ -49,7 +49,7 @@
"nodemon": "3.1.11",
"tsd": "0.33.0",
"typescript": "5.9.3",
- "vitest": "4.0.10",
+ "vitest": "4.0.13",
"vitest-websocket-mock": "0.5.0"
},
"files": [
diff --git a/packages/misskey-reversi/package.json b/packages/misskey-reversi/package.json
index 1e733ecbf4..30eace87fe 100644
--- a/packages/misskey-reversi/package.json
+++ b/packages/misskey-reversi/package.json
@@ -25,8 +25,8 @@
},
"devDependencies": {
"@types/node": "24.10.1",
- "@typescript-eslint/eslint-plugin": "8.47.0",
- "@typescript-eslint/parser": "8.47.0",
+ "@typescript-eslint/eslint-plugin": "8.48.0",
+ "@typescript-eslint/parser": "8.48.0",
"esbuild": "0.27.0",
"execa": "9.6.0",
"glob": "11.1.0",
diff --git a/packages/sw/build.js b/packages/sw/build.js
index a9c2e428c0..d5ca028da5 100644
--- a/packages/sw/build.js
+++ b/packages/sw/build.js
@@ -7,8 +7,9 @@
import { fileURLToPath } from 'node:url';
import * as esbuild from 'esbuild';
-import locales from '../../locales/index.js';
+import locales from 'i18n';
import meta from '../../package.json' with { type: 'json' };
+
const watch = process.argv[2]?.includes('watch');
const __dirname = fileURLToPath(new URL('.', import.meta.url));
diff --git a/packages/sw/package.json b/packages/sw/package.json
index 51d78511c2..b6b03adb54 100644
--- a/packages/sw/package.json
+++ b/packages/sw/package.json
@@ -9,12 +9,13 @@
"lint": "pnpm typecheck && pnpm eslint"
},
"dependencies": {
+ "i18n": "workspace:*",
"esbuild": "0.27.0",
"idb-keyval": "6.2.2",
"misskey-js": "workspace:*"
},
"devDependencies": {
- "@typescript-eslint/parser": "8.47.0",
+ "@typescript-eslint/parser": "8.48.0",
"@typescript/lib-webworker": "npm:@types/serviceworker@0.0.74",
"eslint-plugin-import": "2.32.0",
"nodemon": "3.1.11",
diff --git a/packages/sw/src/scripts/lang.ts b/packages/sw/src/scripts/lang.ts
index 3000160e41..40b6aa4e7b 100644
--- a/packages/sw/src/scripts/lang.ts
+++ b/packages/sw/src/scripts/lang.ts
@@ -8,7 +8,7 @@
*/
import { get, set } from 'idb-keyval';
import { I18n } from '@@/js/i18n.js';
-import type { Locale } from '../../../../locales/index.js';
+import type { Locale } from 'i18n';
class SwLang {
public cacheName = `mk-cache-${_VERSION_}`;
diff --git a/packages/sw/src/sw.ts b/packages/sw/src/sw.ts
index 298af4b4b6..5cece73401 100644
--- a/packages/sw/src/sw.ts
+++ b/packages/sw/src/sw.ts
@@ -7,7 +7,7 @@ import { get } from 'idb-keyval';
import * as Misskey from 'misskey-js';
import type { PushNotificationDataMap } from '@/types.js';
import type { I18n } from '@@/js/i18n.js';
-import type { Locale } from '../../../locales/index.js';
+import type { Locale } from 'i18n';
import { createEmptyNotification, createNotification } from '@/scripts/create-notification.js';
import { swLang } from '@/scripts/lang.js';
import * as swos from '@/scripts/operations.js';
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 61aaec6947..c9fa1c4a01 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -69,8 +69,8 @@ importers:
specifier: 10.1.0
version: 10.1.0
cypress:
- specifier: 15.6.0
- version: 15.6.0
+ specifier: 15.7.0
+ version: 15.7.0
eslint:
specifier: 9.39.1
version: 9.39.1
@@ -81,11 +81,11 @@ importers:
specifier: 2.0.0
version: 2.0.0
pnpm:
- specifier: 10.22.0
- version: 10.22.0
+ specifier: 10.24.0
+ version: 10.24.0
start-server-and-test:
- specifier: 2.1.2
- version: 2.1.2
+ specifier: 2.1.3
+ version: 2.1.3
optionalDependencies:
'@tensorflow/tfjs-core':
specifier: 4.22.0
@@ -94,11 +94,11 @@ importers:
packages/backend:
dependencies:
'@aws-sdk/client-s3':
- specifier: 3.936.0
- version: 3.936.0
+ specifier: 3.940.0
+ version: 3.940.0
'@aws-sdk/lib-storage':
- specifier: 3.936.0
- version: 3.936.0(@aws-sdk/client-s3@3.936.0)
+ specifier: 3.940.0
+ version: 3.940.0(@aws-sdk/client-s3@3.940.0)
'@discordapp/twemoji':
specifier: 16.0.1
version: 16.0.1
@@ -109,23 +109,23 @@ importers:
specifier: 11.0.2
version: 11.0.2
'@fastify/cors':
- specifier: 10.1.0
- version: 10.1.0
+ specifier: 11.1.0
+ version: 11.1.0
'@fastify/express':
specifier: 4.0.2
version: 4.0.2
'@fastify/http-proxy':
- specifier: 10.0.2
- version: 10.0.2(bufferutil@4.0.9)(utf-8-validate@6.0.5)
+ specifier: 11.3.0
+ version: 11.3.0(bufferutil@4.0.9)(utf-8-validate@6.0.5)
'@fastify/multipart':
specifier: 9.3.0
version: 9.3.0
'@fastify/static':
specifier: 8.3.0
version: 8.3.0
- '@fastify/view':
- specifier: 10.0.2
- version: 10.0.2
+ '@kitajs/html':
+ specifier: 4.2.11
+ version: 4.2.11
'@misskey-dev/sharp-read-bmp':
specifier: 1.2.0
version: 1.2.0
@@ -133,41 +133,41 @@ importers:
specifier: 5.2.5
version: 5.2.5
'@napi-rs/canvas':
- specifier: 0.1.82
- version: 0.1.82
+ specifier: 0.1.83
+ version: 0.1.83
'@nestjs/common':
specifier: 11.1.9
version: 11.1.9(reflect-metadata@0.2.2)(rxjs@7.8.2)
'@nestjs/core':
specifier: 11.1.9
- version: 11.1.9(@nestjs/common@11.1.9(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/platform-express@10.4.20)(reflect-metadata@0.2.2)(rxjs@7.8.2)
+ version: 11.1.9(@nestjs/common@11.1.9(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/platform-express@11.1.9)(reflect-metadata@0.2.2)(rxjs@7.8.2)
'@nestjs/testing':
specifier: 11.1.9
- version: 11.1.9(@nestjs/common@11.1.9(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.9)(@nestjs/platform-express@10.4.20)
+ version: 11.1.9(@nestjs/common@11.1.9(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.9)(@nestjs/platform-express@11.1.9)
'@peertube/http-signature':
specifier: 1.7.0
version: 1.7.0
'@sentry/node':
- specifier: 10.26.0
- version: 10.26.0
+ specifier: 10.27.0
+ version: 10.27.0
'@sentry/profiling-node':
- specifier: 10.26.0
- version: 10.26.0
+ specifier: 10.27.0
+ version: 10.27.0
'@simplewebauthn/server':
- specifier: 12.0.0
- version: 12.0.0(encoding@0.1.13)
+ specifier: 13.2.2
+ version: 13.2.2
'@sinonjs/fake-timers':
- specifier: 11.3.1
- version: 11.3.1
+ specifier: 15.0.0
+ version: 15.0.0
'@smithy/node-http-handler':
- specifier: 2.5.0
- version: 2.5.0
+ specifier: 4.4.5
+ version: 4.4.5
'@swc/cli':
specifier: 0.7.9
- version: 0.7.9(@swc/core@1.15.2)(chokidar@4.0.3)
+ version: 0.7.9(@swc/core@1.15.3)(chokidar@4.0.3)
'@swc/core':
- specifier: 1.15.2
- version: 1.15.2
+ specifier: 1.15.3
+ version: 1.15.3
'@twemoji/parser':
specifier: 16.0.0
version: 16.0.0
@@ -187,23 +187,23 @@ importers:
specifier: 0.5.0
version: 0.5.0
bcryptjs:
- specifier: 2.4.3
- version: 2.4.3
+ specifier: 3.0.3
+ version: 3.0.3
blurhash:
specifier: 2.0.5
version: 2.0.5
body-parser:
- specifier: 1.20.3
- version: 1.20.3
+ specifier: 2.2.1
+ version: 2.2.1
bullmq:
- specifier: 5.63.2
- version: 5.63.2
+ specifier: 5.65.0
+ version: 5.65.0
cacheable-lookup:
specifier: 7.0.0
version: 7.0.0
cbor:
- specifier: 9.0.2
- version: 9.0.2
+ specifier: 10.0.11
+ version: 10.0.11
chalk:
specifier: 5.6.2
version: 5.6.2
@@ -214,14 +214,14 @@ importers:
specifier: 4.0.3
version: 4.0.3
color-convert:
- specifier: 2.0.1
- version: 2.0.1
+ specifier: 3.1.3
+ version: 3.1.3
content-disposition:
- specifier: 0.5.4
- version: 0.5.4
+ specifier: 1.0.1
+ version: 1.0.1
date-fns:
- specifier: 2.30.0
- version: 2.30.0
+ specifier: 4.1.0
+ version: 4.1.0
deep-email-validator:
specifier: 0.1.21
version: 0.1.21
@@ -232,8 +232,8 @@ importers:
specifier: 5.0.0
version: 5.0.0
feed:
- specifier: 4.2.2
- version: 4.2.2
+ specifier: 5.1.0
+ version: 5.1.0
file-type:
specifier: 21.1.1
version: 21.1.1
@@ -244,20 +244,17 @@ importers:
specifier: 4.0.5
version: 4.0.5
got:
- specifier: 14.6.4
- version: 14.6.4
- happy-dom:
- specifier: 20.0.10
- version: 20.0.10
+ specifier: 14.6.5
+ version: 14.6.5
hpagent:
specifier: 1.2.0
version: 1.2.0
- htmlescape:
- specifier: 1.1.1
- version: 1.1.1
http-link-header:
specifier: 1.1.3
version: 1.1.3
+ i18n:
+ specifier: workspace:*
+ version: link:../i18n
ioredis:
specifier: 5.8.2
version: 5.8.2
@@ -265,23 +262,17 @@ importers:
specifier: 4.0.2
version: 4.0.2
ipaddr.js:
- specifier: 2.2.0
- version: 2.2.0
+ specifier: 2.3.0
+ version: 2.3.0
is-svg:
- specifier: 5.1.0
- version: 5.1.0
- js-yaml:
- specifier: 4.1.1
- version: 4.1.1
- jsdom:
- specifier: 26.1.0
- version: 26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5)
+ specifier: 6.1.0
+ version: 6.1.0
json5:
specifier: 2.2.3
version: 2.2.3
jsonld:
- specifier: 8.3.3
- version: 8.3.3(web-streams-polyfill@3.3.3)
+ specifier: 9.0.0
+ version: 9.0.0
jsrsasign:
specifier: 11.1.0
version: 11.1.0
@@ -294,12 +285,9 @@ importers:
mfm-js:
specifier: 0.25.0
version: 0.25.0
- microformats-parser:
- specifier: 2.0.4
- version: 2.0.4
mime-types:
- specifier: 2.1.35
- version: 2.1.35
+ specifier: 3.0.2
+ version: 3.0.2
misskey-js:
specifier: workspace:*
version: link:../misskey-js
@@ -318,9 +306,12 @@ importers:
node-fetch:
specifier: 3.3.2
version: 3.3.2
+ node-html-parser:
+ specifier: 7.0.1
+ version: 7.0.1
nodemailer:
- specifier: 7.0.10
- version: 7.0.10
+ specifier: 7.0.11
+ version: 7.0.11
nsfwjs:
specifier: 4.2.0
version: 4.2.0(@tensorflow/tfjs@4.22.0(encoding@0.1.13)(seedrandom@3.0.5))(buffer@6.0.3)
@@ -339,24 +330,18 @@ importers:
otpauth:
specifier: 9.4.1
version: 9.4.1
- parse5:
- specifier: 7.3.0
- version: 7.3.0
pg:
specifier: 8.16.3
version: 8.16.3
pkce-challenge:
- specifier: 4.1.0
- version: 4.1.0
+ specifier: 5.0.1
+ version: 5.0.1
probe-image-size:
specifier: 7.2.3
version: 7.2.3
promise-limit:
specifier: 2.7.0
version: 2.7.0
- pug:
- specifier: 3.0.3
- version: 3.0.3
qrcode:
specifier: 1.5.4
version: 1.5.4
@@ -372,9 +357,6 @@ importers:
redis-info:
specifier: 3.1.0
version: 3.1.0
- redis-lock:
- specifier: 0.1.4
- version: 0.1.4
reflect-metadata:
specifier: 0.2.2
version: 0.2.2
@@ -391,8 +373,8 @@ importers:
specifier: 2.17.0
version: 2.17.0
secure-json-parse:
- specifier: 3.0.2
- version: 3.0.2
+ specifier: 4.1.0
+ version: 4.1.0
semver:
specifier: 7.7.3
version: 7.7.3
@@ -430,8 +412,8 @@ importers:
specifier: 5.9.3
version: 5.9.3
ulid:
- specifier: 2.4.0
- version: 2.4.0
+ specifier: 3.0.1
+ version: 3.0.1
vary:
specifier: 1.1.2
version: 1.1.2
@@ -448,27 +430,27 @@ importers:
'@jest/globals':
specifier: 29.7.0
version: 29.7.0
+ '@kitajs/ts-html-plugin':
+ specifier: 4.1.3
+ version: 4.1.3(@kitajs/html@4.2.11)(typescript@5.9.3)
'@nestjs/platform-express':
- specifier: 10.4.20
- version: 10.4.20(@nestjs/common@11.1.9(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.9)
+ specifier: 11.1.9
+ version: 11.1.9(@nestjs/common@11.1.9(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.9)
'@sentry/vue':
- specifier: 10.26.0
- version: 10.26.0(vue@3.5.24(typescript@5.9.3))
+ specifier: 10.27.0
+ version: 10.27.0(vue@3.5.25(typescript@5.9.3))
'@simplewebauthn/types':
specifier: 12.0.0
version: 12.0.0
'@swc/jest':
specifier: 0.2.39
- version: 0.2.39(@swc/core@1.15.2)
+ version: 0.2.39(@swc/core@1.15.3)
'@types/accepts':
specifier: 1.3.7
version: 1.3.7
'@types/archiver':
- specifier: 6.0.4
- version: 6.0.4
- '@types/bcryptjs':
- specifier: 2.4.6
- version: 2.4.6
+ specifier: 7.0.0
+ version: 7.0.0
'@types/body-parser':
specifier: 1.19.6
version: 1.19.6
@@ -481,21 +463,12 @@ importers:
'@types/fluent-ffmpeg':
specifier: 2.1.28
version: 2.1.28
- '@types/htmlescape':
- specifier: 1.1.3
- version: 1.1.3
'@types/http-link-header':
specifier: 1.0.7
version: 1.0.7
'@types/jest':
specifier: 29.5.14
version: 29.5.14
- '@types/js-yaml':
- specifier: 4.0.9
- version: 4.0.9
- '@types/jsdom':
- specifier: 21.1.7
- version: 21.1.7
'@types/jsonld':
specifier: 1.5.15
version: 1.5.15
@@ -503,17 +476,17 @@ importers:
specifier: 10.5.15
version: 10.5.15
'@types/mime-types':
- specifier: 2.1.4
- version: 2.1.4
+ specifier: 3.0.1
+ version: 3.0.1
'@types/ms':
- specifier: 0.7.34
- version: 0.7.34
+ specifier: 2.1.0
+ version: 2.1.0
'@types/node':
specifier: 24.10.1
version: 24.10.1
'@types/nodemailer':
- specifier: 6.4.21
- version: 6.4.21
+ specifier: 7.0.4
+ version: 7.0.4
'@types/oauth':
specifier: 0.9.6
version: 0.9.6
@@ -526,9 +499,6 @@ importers:
'@types/pg':
specifier: 8.15.6
version: 8.15.6
- '@types/pug':
- specifier: 2.0.10
- version: 2.0.10
'@types/qrcode':
specifier: 1.5.6
version: 1.5.6
@@ -551,8 +521,8 @@ importers:
specifier: 5.0.7
version: 5.0.7
'@types/sinonjs__fake-timers':
- specifier: 8.1.5
- version: 8.1.5
+ specifier: 15.0.1
+ version: 15.0.1
'@types/supertest':
specifier: 6.0.3
version: 6.0.3
@@ -572,81 +542,90 @@ importers:
specifier: 8.18.1
version: 8.18.1
'@typescript-eslint/eslint-plugin':
- specifier: 8.47.0
- version: 8.47.0(@typescript-eslint/parser@8.47.0(eslint@9.39.1)(typescript@5.9.3))(eslint@9.39.1)(typescript@5.9.3)
+ specifier: 8.48.0
+ version: 8.48.0(@typescript-eslint/parser@8.48.0(eslint@9.39.1)(typescript@5.9.3))(eslint@9.39.1)(typescript@5.9.3)
'@typescript-eslint/parser':
- specifier: 8.47.0
- version: 8.47.0(eslint@9.39.1)(typescript@5.9.3)
+ specifier: 8.48.0
+ version: 8.48.0(eslint@9.39.1)(typescript@5.9.3)
aws-sdk-client-mock:
specifier: 4.1.0
version: 4.1.0
cross-env:
- specifier: 7.0.3
- version: 7.0.3
+ specifier: 10.1.0
+ version: 10.1.0
eslint-plugin-import:
specifier: 2.32.0
- version: 2.32.0(@typescript-eslint/parser@8.47.0(eslint@9.39.1)(typescript@5.9.3))(eslint@9.39.1)
+ version: 2.32.0(@typescript-eslint/parser@8.48.0(eslint@9.39.1)(typescript@5.9.3))(eslint@9.39.1)
execa:
- specifier: 8.0.1
- version: 8.0.1
+ specifier: 9.6.0
+ version: 9.6.0
fkill:
- specifier: 9.0.0
- version: 9.0.0
+ specifier: 10.0.1
+ version: 10.0.1
jest:
specifier: 29.7.0
version: 29.7.0(@types/node@24.10.1)
jest-mock:
specifier: 29.7.0
version: 29.7.0
+ jest-util:
+ specifier: 29.7.0
+ version: 29.7.0
+ js-yaml:
+ specifier: 4.1.1
+ version: 4.1.1
nodemon:
specifier: 3.1.11
version: 3.1.11
pid-port:
- specifier: 1.0.2
- version: 1.0.2
+ specifier: 2.0.0
+ version: 2.0.0
simple-oauth2:
specifier: 5.1.0
version: 5.1.0
supertest:
specifier: 7.1.4
version: 7.1.4
+ vite:
+ specifier: 7.2.4
+ version: 7.2.4(@types/node@24.10.1)(sass@1.94.2)(terser@5.44.1)(tsx@4.20.6)
optionalDependencies:
'@swc/core-android-arm64':
specifier: 1.3.11
version: 1.3.11
'@swc/core-darwin-arm64':
- specifier: 1.15.2
- version: 1.15.2
+ specifier: 1.15.3
+ version: 1.15.3
'@swc/core-darwin-x64':
- specifier: 1.15.2
- version: 1.15.2
+ specifier: 1.15.3
+ version: 1.15.3
'@swc/core-freebsd-x64':
specifier: 1.3.11
version: 1.3.11
'@swc/core-linux-arm-gnueabihf':
- specifier: 1.15.2
- version: 1.15.2
+ specifier: 1.15.3
+ version: 1.15.3
'@swc/core-linux-arm64-gnu':
- specifier: 1.15.2
- version: 1.15.2
+ specifier: 1.15.3
+ version: 1.15.3
'@swc/core-linux-arm64-musl':
- specifier: 1.15.2
- version: 1.15.2
+ specifier: 1.15.3
+ version: 1.15.3
'@swc/core-linux-x64-gnu':
- specifier: 1.15.2
- version: 1.15.2
+ specifier: 1.15.3
+ version: 1.15.3
'@swc/core-linux-x64-musl':
- specifier: 1.15.2
- version: 1.15.2
+ specifier: 1.15.3
+ version: 1.15.3
'@swc/core-win32-arm64-msvc':
- specifier: 1.15.2
- version: 1.15.2
+ specifier: 1.15.3
+ version: 1.15.3
'@swc/core-win32-ia32-msvc':
- specifier: 1.15.2
- version: 1.15.2
+ specifier: 1.15.3
+ version: 1.15.3
'@swc/core-win32-x64-msvc':
- specifier: 1.15.2
- version: 1.15.2
+ specifier: 1.15.3
+ version: 1.15.3
'@tensorflow/tfjs':
specifier: 4.22.0
version: 4.22.0(encoding@0.1.13)(seedrandom@3.0.5)
@@ -726,8 +705,8 @@ importers:
specifier: 5.3.0
version: 5.3.0(rollup@4.53.3)
'@sentry/vue':
- specifier: 10.26.0
- version: 10.26.0(vue@3.5.24(typescript@5.9.3))
+ specifier: 10.27.0
+ version: 10.27.0(vue@3.5.25(typescript@5.9.3))
'@syuilo/aiscript':
specifier: 1.2.0
version: 1.2.0
@@ -739,10 +718,10 @@ importers:
version: 16.0.0
'@vitejs/plugin-vue':
specifier: 6.0.2
- version: 6.0.2(vite@7.2.2(@types/node@24.10.1)(sass@1.94.1)(terser@5.44.1)(tsx@4.20.6))(vue@3.5.24(typescript@5.9.3))
+ version: 6.0.2(vite@7.2.4(@types/node@24.10.1)(sass@1.94.2)(terser@5.44.1)(tsx@4.20.6))(vue@3.5.25(typescript@5.9.3))
'@vue/compiler-sfc':
- specifier: 3.5.24
- version: 3.5.24
+ specifier: 3.5.25
+ version: 3.5.25
aiscript-vscode:
specifier: github:aiscript-dev/aiscript-vscode#v0.1.15
version: https://codeload.github.com/aiscript-dev/aiscript-vscode/tar.gz/c3cde89e79a41d93540cf8a48cd619c3f2dcb1b7
@@ -803,6 +782,9 @@ importers:
frontend-shared:
specifier: workspace:*
version: link:../frontend-shared
+ i18n:
+ specifier: workspace:*
+ version: link:../i18n
icons-subsetter:
specifier: workspace:*
version: link:../icons-subsetter
@@ -828,8 +810,8 @@ importers:
specifier: 0.20.0
version: 0.20.0
mediabunny:
- specifier: 1.25.0
- version: 1.25.0
+ specifier: 1.25.3
+ version: 1.25.3
mfm-js:
specifier: 0.25.0
version: 0.25.0
@@ -861,11 +843,11 @@ importers:
specifier: 2.17.0
version: 2.17.0
sass:
- specifier: 1.94.1
- version: 1.94.1
+ specifier: 1.94.2
+ version: 1.94.2
shiki:
- specifier: 3.15.0
- version: 3.15.0
+ specifier: 3.17.0
+ version: 3.17.0
strict-event-emitter-types:
specifier: 2.0.0
version: 2.0.0
@@ -892,16 +874,16 @@ importers:
version: 5.9.3
v-code-diff:
specifier: 1.13.1
- version: 1.13.1(vue@3.5.24(typescript@5.9.3))
+ version: 1.13.1(vue@3.5.25(typescript@5.9.3))
vite:
- specifier: 7.2.2
- version: 7.2.2(@types/node@24.10.1)(sass@1.94.1)(terser@5.44.1)(tsx@4.20.6)
+ specifier: 7.2.4
+ version: 7.2.4(@types/node@24.10.1)(sass@1.94.2)(terser@5.44.1)(tsx@4.20.6)
vue:
- specifier: 3.5.24
- version: 3.5.24(typescript@5.9.3)
+ specifier: 3.5.25
+ version: 3.5.25(typescript@5.9.3)
vuedraggable:
specifier: next
- version: 4.1.0(vue@3.5.24(typescript@5.9.3))
+ version: 4.1.0(vue@3.5.25(typescript@5.9.3))
wanakana:
specifier: 5.3.1
version: 5.3.1
@@ -911,61 +893,61 @@ importers:
version: 5.2.5
'@storybook/addon-essentials':
specifier: 8.6.14
- version: 8.6.14(@types/react@19.2.2)(storybook@9.1.16(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(msw@2.12.2(@types/node@24.10.1)(typescript@5.9.3))(prettier@3.6.2)(utf-8-validate@6.0.5)(vite@7.2.2(@types/node@24.10.1)(sass@1.94.1)(terser@5.44.1)(tsx@4.20.6)))
+ version: 8.6.14(@types/react@19.2.2)(storybook@10.1.0(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(prettier@3.7.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(utf-8-validate@6.0.5))
'@storybook/addon-interactions':
specifier: 8.6.14
- version: 8.6.14(storybook@9.1.16(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(msw@2.12.2(@types/node@24.10.1)(typescript@5.9.3))(prettier@3.6.2)(utf-8-validate@6.0.5)(vite@7.2.2(@types/node@24.10.1)(sass@1.94.1)(terser@5.44.1)(tsx@4.20.6)))
+ version: 8.6.14(storybook@10.1.0(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(prettier@3.7.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(utf-8-validate@6.0.5))
'@storybook/addon-links':
- specifier: 9.1.16
- version: 9.1.16(react@19.2.0)(storybook@9.1.16(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(msw@2.12.2(@types/node@24.10.1)(typescript@5.9.3))(prettier@3.6.2)(utf-8-validate@6.0.5)(vite@7.2.2(@types/node@24.10.1)(sass@1.94.1)(terser@5.44.1)(tsx@4.20.6)))
+ specifier: 10.1.0
+ version: 10.1.0(react@19.2.0)(storybook@10.1.0(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(prettier@3.7.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(utf-8-validate@6.0.5))
'@storybook/addon-mdx-gfm':
specifier: 8.6.14
- version: 8.6.14(storybook@9.1.16(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(msw@2.12.2(@types/node@24.10.1)(typescript@5.9.3))(prettier@3.6.2)(utf-8-validate@6.0.5)(vite@7.2.2(@types/node@24.10.1)(sass@1.94.1)(terser@5.44.1)(tsx@4.20.6)))
+ version: 8.6.14(storybook@10.1.0(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(prettier@3.7.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(utf-8-validate@6.0.5))
'@storybook/addon-storysource':
specifier: 8.6.14
- version: 8.6.14(storybook@9.1.16(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(msw@2.12.2(@types/node@24.10.1)(typescript@5.9.3))(prettier@3.6.2)(utf-8-validate@6.0.5)(vite@7.2.2(@types/node@24.10.1)(sass@1.94.1)(terser@5.44.1)(tsx@4.20.6)))
+ version: 8.6.14(storybook@10.1.0(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(prettier@3.7.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(utf-8-validate@6.0.5))
'@storybook/blocks':
specifier: 8.6.14
- version: 8.6.14(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(storybook@9.1.16(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(msw@2.12.2(@types/node@24.10.1)(typescript@5.9.3))(prettier@3.6.2)(utf-8-validate@6.0.5)(vite@7.2.2(@types/node@24.10.1)(sass@1.94.1)(terser@5.44.1)(tsx@4.20.6)))
+ version: 8.6.14(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(storybook@10.1.0(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(prettier@3.7.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(utf-8-validate@6.0.5))
'@storybook/components':
specifier: 8.6.14
- version: 8.6.14(storybook@9.1.16(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(msw@2.12.2(@types/node@24.10.1)(typescript@5.9.3))(prettier@3.6.2)(utf-8-validate@6.0.5)(vite@7.2.2(@types/node@24.10.1)(sass@1.94.1)(terser@5.44.1)(tsx@4.20.6)))
+ version: 8.6.14(storybook@10.1.0(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(prettier@3.7.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(utf-8-validate@6.0.5))
'@storybook/core-events':
specifier: 8.6.14
- version: 8.6.14(storybook@9.1.16(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(msw@2.12.2(@types/node@24.10.1)(typescript@5.9.3))(prettier@3.6.2)(utf-8-validate@6.0.5)(vite@7.2.2(@types/node@24.10.1)(sass@1.94.1)(terser@5.44.1)(tsx@4.20.6)))
+ version: 8.6.14(storybook@10.1.0(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(prettier@3.7.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(utf-8-validate@6.0.5))
'@storybook/manager-api':
specifier: 8.6.14
- version: 8.6.14(storybook@9.1.16(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(msw@2.12.2(@types/node@24.10.1)(typescript@5.9.3))(prettier@3.6.2)(utf-8-validate@6.0.5)(vite@7.2.2(@types/node@24.10.1)(sass@1.94.1)(terser@5.44.1)(tsx@4.20.6)))
+ version: 8.6.14(storybook@10.1.0(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(prettier@3.7.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(utf-8-validate@6.0.5))
'@storybook/preview-api':
specifier: 8.6.14
- version: 8.6.14(storybook@9.1.16(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(msw@2.12.2(@types/node@24.10.1)(typescript@5.9.3))(prettier@3.6.2)(utf-8-validate@6.0.5)(vite@7.2.2(@types/node@24.10.1)(sass@1.94.1)(terser@5.44.1)(tsx@4.20.6)))
+ version: 8.6.14(storybook@10.1.0(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(prettier@3.7.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(utf-8-validate@6.0.5))
'@storybook/react':
- specifier: 9.1.16
- version: 9.1.16(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(storybook@9.1.16(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(msw@2.12.2(@types/node@24.10.1)(typescript@5.9.3))(prettier@3.6.2)(utf-8-validate@6.0.5)(vite@7.2.2(@types/node@24.10.1)(sass@1.94.1)(terser@5.44.1)(tsx@4.20.6)))(typescript@5.9.3)
+ specifier: 10.1.0
+ version: 10.1.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(storybook@10.1.0(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(prettier@3.7.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(utf-8-validate@6.0.5))(typescript@5.9.3)
'@storybook/react-vite':
- specifier: 9.1.16
- version: 9.1.16(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(rollup@4.53.3)(storybook@9.1.16(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(msw@2.12.2(@types/node@24.10.1)(typescript@5.9.3))(prettier@3.6.2)(utf-8-validate@6.0.5)(vite@7.2.2(@types/node@24.10.1)(sass@1.94.1)(terser@5.44.1)(tsx@4.20.6)))(typescript@5.9.3)(vite@7.2.2(@types/node@24.10.1)(sass@1.94.1)(terser@5.44.1)(tsx@4.20.6))
+ specifier: 10.1.0
+ version: 10.1.0(esbuild@0.27.0)(msw@2.12.3(@types/node@24.10.1)(typescript@5.9.3))(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(rollup@4.53.3)(storybook@10.1.0(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(prettier@3.7.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(utf-8-validate@6.0.5))(typescript@5.9.3)(vite@7.2.4(@types/node@24.10.1)(sass@1.94.2)(terser@5.44.1)(tsx@4.20.6))
'@storybook/test':
specifier: 8.6.14
- version: 8.6.14(storybook@9.1.16(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(msw@2.12.2(@types/node@24.10.1)(typescript@5.9.3))(prettier@3.6.2)(utf-8-validate@6.0.5)(vite@7.2.2(@types/node@24.10.1)(sass@1.94.1)(terser@5.44.1)(tsx@4.20.6)))
+ version: 8.6.14(storybook@10.1.0(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(prettier@3.7.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(utf-8-validate@6.0.5))
'@storybook/theming':
specifier: 8.6.14
- version: 8.6.14(storybook@9.1.16(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(msw@2.12.2(@types/node@24.10.1)(typescript@5.9.3))(prettier@3.6.2)(utf-8-validate@6.0.5)(vite@7.2.2(@types/node@24.10.1)(sass@1.94.1)(terser@5.44.1)(tsx@4.20.6)))
+ version: 8.6.14(storybook@10.1.0(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(prettier@3.7.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(utf-8-validate@6.0.5))
'@storybook/types':
specifier: 8.6.14
- version: 8.6.14(storybook@9.1.16(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(msw@2.12.2(@types/node@24.10.1)(typescript@5.9.3))(prettier@3.6.2)(utf-8-validate@6.0.5)(vite@7.2.2(@types/node@24.10.1)(sass@1.94.1)(terser@5.44.1)(tsx@4.20.6)))
+ version: 8.6.14(storybook@10.1.0(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(prettier@3.7.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(utf-8-validate@6.0.5))
'@storybook/vue3':
- specifier: 9.1.16
- version: 9.1.16(storybook@9.1.16(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(msw@2.12.2(@types/node@24.10.1)(typescript@5.9.3))(prettier@3.6.2)(utf-8-validate@6.0.5)(vite@7.2.2(@types/node@24.10.1)(sass@1.94.1)(terser@5.44.1)(tsx@4.20.6)))(vue@3.5.24(typescript@5.9.3))
+ specifier: 10.1.0
+ version: 10.1.0(storybook@10.1.0(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(prettier@3.7.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(utf-8-validate@6.0.5))(vue@3.5.25(typescript@5.9.3))
'@storybook/vue3-vite':
- specifier: 9.1.16
- version: 9.1.16(storybook@9.1.16(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(msw@2.12.2(@types/node@24.10.1)(typescript@5.9.3))(prettier@3.6.2)(utf-8-validate@6.0.5)(vite@7.2.2(@types/node@24.10.1)(sass@1.94.1)(terser@5.44.1)(tsx@4.20.6)))(vite@7.2.2(@types/node@24.10.1)(sass@1.94.1)(terser@5.44.1)(tsx@4.20.6))(vue@3.5.24(typescript@5.9.3))
+ specifier: 10.1.0
+ version: 10.1.0(esbuild@0.27.0)(msw@2.12.3(@types/node@24.10.1)(typescript@5.9.3))(rollup@4.53.3)(storybook@10.1.0(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(prettier@3.7.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(utf-8-validate@6.0.5))(vite@7.2.4(@types/node@24.10.1)(sass@1.94.2)(terser@5.44.1)(tsx@4.20.6))(vue@3.5.25(typescript@5.9.3))
'@tabler/icons-webfont':
specifier: 3.35.0
version: 3.35.0
'@testing-library/vue':
specifier: 8.1.0
- version: 8.1.0(@vue/compiler-sfc@3.5.24)(vue@3.5.24(typescript@5.9.3))
+ version: 8.1.0(@vue/compiler-sfc@3.5.25)(vue@3.5.25(typescript@5.9.3))
'@types/canvas-confetti':
specifier: 1.9.0
version: 1.9.0
@@ -1000,20 +982,20 @@ importers:
specifier: 8.18.1
version: 8.18.1
'@typescript-eslint/eslint-plugin':
- specifier: 8.47.0
- version: 8.47.0(@typescript-eslint/parser@8.47.0(eslint@9.39.1)(typescript@5.9.3))(eslint@9.39.1)(typescript@5.9.3)
+ specifier: 8.48.0
+ version: 8.48.0(@typescript-eslint/parser@8.48.0(eslint@9.39.1)(typescript@5.9.3))(eslint@9.39.1)(typescript@5.9.3)
'@typescript-eslint/parser':
- specifier: 8.47.0
- version: 8.47.0(eslint@9.39.1)(typescript@5.9.3)
+ specifier: 8.48.0
+ version: 8.48.0(eslint@9.39.1)(typescript@5.9.3)
'@vitest/coverage-v8':
- specifier: 3.2.4
- version: 3.2.4(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.10.1)(happy-dom@20.0.10)(jsdom@27.2.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(msw@2.12.2(@types/node@24.10.1)(typescript@5.9.3))(sass@1.94.1)(terser@5.44.1)(tsx@4.20.6))
+ specifier: 4.0.14
+ version: 4.0.14(vitest@4.0.14(@opentelemetry/api@1.9.0)(@types/node@24.10.1)(happy-dom@20.0.11)(jsdom@27.2.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(msw@2.12.3(@types/node@24.10.1)(typescript@5.9.3))(sass@1.94.2)(terser@5.44.1)(tsx@4.20.6))
'@vue/compiler-core':
- specifier: 3.5.24
- version: 3.5.24
+ specifier: 3.5.25
+ version: 3.5.25
'@vue/runtime-core':
- specifier: 3.5.24
- version: 3.5.24
+ specifier: 3.5.25
+ version: 3.5.25
acorn:
specifier: 8.15.0
version: 8.15.0
@@ -1021,20 +1003,20 @@ importers:
specifier: 10.1.0
version: 10.1.0
cypress:
- specifier: 15.6.0
- version: 15.6.0
+ specifier: 15.7.0
+ version: 15.7.0
eslint-plugin-import:
specifier: 2.32.0
- version: 2.32.0(@typescript-eslint/parser@8.47.0(eslint@9.39.1)(typescript@5.9.3))(eslint@9.39.1)
+ version: 2.32.0(@typescript-eslint/parser@8.48.0(eslint@9.39.1)(typescript@5.9.3))(eslint@9.39.1)
eslint-plugin-vue:
- specifier: 10.5.1
- version: 10.5.1(@stylistic/eslint-plugin@5.5.0(eslint@9.39.1))(@typescript-eslint/parser@8.47.0(eslint@9.39.1)(typescript@5.9.3))(eslint@9.39.1)(vue-eslint-parser@10.2.0(eslint@9.39.1))
+ specifier: 10.6.2
+ version: 10.6.2(@stylistic/eslint-plugin@5.5.0(eslint@9.39.1))(@typescript-eslint/parser@8.48.0(eslint@9.39.1)(typescript@5.9.3))(eslint@9.39.1)(vue-eslint-parser@10.2.0(eslint@9.39.1))
fast-glob:
specifier: 3.3.3
version: 3.3.3
happy-dom:
- specifier: 20.0.10
- version: 20.0.10
+ specifier: 20.0.11
+ version: 20.0.11
intersection-observer:
specifier: 0.12.2
version: 0.12.2
@@ -1045,17 +1027,17 @@ importers:
specifier: 10.1.1
version: 10.1.1
msw:
- specifier: 2.12.2
- version: 2.12.2(@types/node@24.10.1)(typescript@5.9.3)
+ specifier: 2.12.3
+ version: 2.12.3(@types/node@24.10.1)(typescript@5.9.3)
msw-storybook-addon:
specifier: 2.0.6
- version: 2.0.6(msw@2.12.2(@types/node@24.10.1)(typescript@5.9.3))
+ version: 2.0.6(msw@2.12.3(@types/node@24.10.1)(typescript@5.9.3))
nodemon:
specifier: 3.1.11
version: 3.1.11
prettier:
- specifier: 3.6.2
- version: 3.6.2
+ specifier: 3.7.1
+ version: 3.7.1
react:
specifier: 19.2.0
version: 19.2.0
@@ -1066,50 +1048,53 @@ importers:
specifier: 3.0.5
version: 3.0.5
start-server-and-test:
- specifier: 2.1.2
- version: 2.1.2
+ specifier: 2.1.3
+ version: 2.1.3
storybook:
- specifier: 9.1.16
- version: 9.1.16(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(msw@2.12.2(@types/node@24.10.1)(typescript@5.9.3))(prettier@3.6.2)(utf-8-validate@6.0.5)(vite@7.2.2(@types/node@24.10.1)(sass@1.94.1)(terser@5.44.1)(tsx@4.20.6))
+ specifier: 10.1.0
+ version: 10.1.0(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(prettier@3.7.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(utf-8-validate@6.0.5)
storybook-addon-misskey-theme:
specifier: github:misskey-dev/storybook-addon-misskey-theme
- version: https://codeload.github.com/misskey-dev/storybook-addon-misskey-theme/tar.gz/cf583db098365b2ccc81a82f63ca9c93bc32b640(199cee10961aa3cfbc20370674a11145)
+ version: https://codeload.github.com/misskey-dev/storybook-addon-misskey-theme/tar.gz/cf583db098365b2ccc81a82f63ca9c93bc32b640(e133727417d7e5d8da2127d0903bc90b)
tsx:
specifier: 4.20.6
version: 4.20.6
vite-plugin-glsl:
specifier: 1.5.4
- version: 1.5.4(@rollup/pluginutils@5.3.0(rollup@4.53.3))(esbuild@0.25.11)(vite@7.2.2(@types/node@24.10.1)(sass@1.94.1)(terser@5.44.1)(tsx@4.20.6))
+ version: 1.5.4(@rollup/pluginutils@5.3.0(rollup@4.53.3))(esbuild@0.27.0)(vite@7.2.4(@types/node@24.10.1)(sass@1.94.2)(terser@5.44.1)(tsx@4.20.6))
vite-plugin-turbosnap:
specifier: 1.0.3
version: 1.0.3
vitest:
- specifier: 3.2.4
- version: 3.2.4(@types/debug@4.1.12)(@types/node@24.10.1)(happy-dom@20.0.10)(jsdom@27.2.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(msw@2.12.2(@types/node@24.10.1)(typescript@5.9.3))(sass@1.94.1)(terser@5.44.1)(tsx@4.20.6)
+ specifier: 4.0.14
+ version: 4.0.14(@opentelemetry/api@1.9.0)(@types/node@24.10.1)(happy-dom@20.0.11)(jsdom@27.2.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(msw@2.12.3(@types/node@24.10.1)(typescript@5.9.3))(sass@1.94.2)(terser@5.44.1)(tsx@4.20.6)
vitest-fetch-mock:
specifier: 0.4.5
- version: 0.4.5(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.10.1)(happy-dom@20.0.10)(jsdom@27.2.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(msw@2.12.2(@types/node@24.10.1)(typescript@5.9.3))(sass@1.94.1)(terser@5.44.1)(tsx@4.20.6))
+ version: 0.4.5(vitest@4.0.14(@opentelemetry/api@1.9.0)(@types/node@24.10.1)(happy-dom@20.0.11)(jsdom@27.2.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(msw@2.12.3(@types/node@24.10.1)(typescript@5.9.3))(sass@1.94.2)(terser@5.44.1)(tsx@4.20.6))
vue-component-type-helpers:
- specifier: 3.1.4
- version: 3.1.4
+ specifier: 3.1.5
+ version: 3.1.5
vue-eslint-parser:
specifier: 10.2.0
version: 10.2.0(eslint@9.39.1)
vue-tsc:
- specifier: 3.1.4
- version: 3.1.4(typescript@5.9.3)
+ specifier: 3.1.5
+ version: 3.1.5(typescript@5.9.3)
packages/frontend-builder:
dependencies:
estree-walker:
specifier: 3.0.3
version: 3.0.3
+ i18n:
+ specifier: workspace:*
+ version: link:../i18n
magic-string:
specifier: 0.30.21
version: 0.30.21
vite:
- specifier: 7.2.2
- version: 7.2.2(@types/node@24.10.1)(sass@1.94.1)(terser@5.44.1)(tsx@4.20.6)
+ specifier: 7.2.4
+ version: 7.2.4(@types/node@24.10.1)(sass@1.94.2)(terser@5.44.1)(tsx@4.20.6)
devDependencies:
'@types/estree':
specifier: 1.0.8
@@ -1118,11 +1103,11 @@ importers:
specifier: 24.10.1
version: 24.10.1
'@typescript-eslint/eslint-plugin':
- specifier: 8.47.0
- version: 8.47.0(@typescript-eslint/parser@8.47.0(eslint@9.39.1)(typescript@5.9.3))(eslint@9.39.1)(typescript@5.9.3)
+ specifier: 8.48.0
+ version: 8.48.0(@typescript-eslint/parser@8.48.0(eslint@9.39.1)(typescript@5.9.3))(eslint@9.39.1)(typescript@5.9.3)
'@typescript-eslint/parser':
- specifier: 8.47.0
- version: 8.47.0(eslint@9.39.1)(typescript@5.9.3)
+ specifier: 8.48.0
+ version: 8.48.0(eslint@9.39.1)(typescript@5.9.3)
rollup:
specifier: 4.53.3
version: 4.53.3
@@ -1149,10 +1134,10 @@ importers:
version: 16.0.0
'@vitejs/plugin-vue':
specifier: 6.0.2
- version: 6.0.2(vite@7.2.2(@types/node@24.10.1)(sass@1.94.1)(terser@5.44.1)(tsx@4.20.6))(vue@3.5.24(typescript@5.9.3))
+ version: 6.0.2(vite@7.2.4(@types/node@24.10.1)(sass@1.94.2)(terser@5.44.1)(tsx@4.20.6))(vue@3.5.25(typescript@5.9.3))
'@vue/compiler-sfc':
- specifier: 3.5.24
- version: 3.5.24
+ specifier: 3.5.25
+ version: 3.5.25
astring:
specifier: 1.9.0
version: 1.9.0
@@ -1165,6 +1150,9 @@ importers:
frontend-shared:
specifier: workspace:*
version: link:../frontend-shared
+ i18n:
+ specifier: workspace:*
+ version: link:../i18n
icons-subsetter:
specifier: workspace:*
version: link:../icons-subsetter
@@ -1184,11 +1172,11 @@ importers:
specifier: 4.53.3
version: 4.53.3
sass:
- specifier: 1.94.1
- version: 1.94.1
+ specifier: 1.94.2
+ version: 1.94.2
shiki:
- specifier: 3.15.0
- version: 3.15.0
+ specifier: 3.17.0
+ version: 3.17.0
tinycolor2:
specifier: 1.6.0
version: 1.6.0
@@ -1205,11 +1193,11 @@ importers:
specifier: 13.0.0
version: 13.0.0
vite:
- specifier: 7.2.2
- version: 7.2.2(@types/node@24.10.1)(sass@1.94.1)(terser@5.44.1)(tsx@4.20.6)
+ specifier: 7.2.4
+ version: 7.2.4(@types/node@24.10.1)(sass@1.94.2)(terser@5.44.1)(tsx@4.20.6)
vue:
- specifier: 3.5.24
- version: 3.5.24(typescript@5.9.3)
+ specifier: 3.5.25
+ version: 3.5.25(typescript@5.9.3)
devDependencies:
'@misskey-dev/summaly':
specifier: 5.2.5
@@ -1219,7 +1207,7 @@ importers:
version: 3.35.0
'@testing-library/vue':
specifier: 8.1.0
- version: 8.1.0(@vue/compiler-sfc@3.5.24)(vue@3.5.24(typescript@5.9.3))
+ version: 8.1.0(@vue/compiler-sfc@3.5.25)(vue@3.5.25(typescript@5.9.3))
'@types/estree':
specifier: 1.0.8
version: 1.0.8
@@ -1239,17 +1227,17 @@ importers:
specifier: 8.18.1
version: 8.18.1
'@typescript-eslint/eslint-plugin':
- specifier: 8.47.0
- version: 8.47.0(@typescript-eslint/parser@8.47.0(eslint@9.39.1)(typescript@5.9.3))(eslint@9.39.1)(typescript@5.9.3)
+ specifier: 8.48.0
+ version: 8.48.0(@typescript-eslint/parser@8.48.0(eslint@9.39.1)(typescript@5.9.3))(eslint@9.39.1)(typescript@5.9.3)
'@typescript-eslint/parser':
- specifier: 8.47.0
- version: 8.47.0(eslint@9.39.1)(typescript@5.9.3)
+ specifier: 8.48.0
+ version: 8.48.0(eslint@9.39.1)(typescript@5.9.3)
'@vitest/coverage-v8':
- specifier: 3.2.4
- version: 3.2.4(vitest@4.0.10(@types/debug@4.1.12)(@types/node@24.10.1)(happy-dom@20.0.10)(jsdom@27.2.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(msw@2.12.2(@types/node@24.10.1)(typescript@5.9.3))(sass@1.94.1)(terser@5.44.1)(tsx@4.20.6))
+ specifier: 4.0.14
+ version: 4.0.14(vitest@4.0.14(@opentelemetry/api@1.9.0)(@types/node@24.10.1)(happy-dom@20.0.11)(jsdom@27.2.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(msw@2.12.3(@types/node@24.10.1)(typescript@5.9.3))(sass@1.94.2)(terser@5.44.1)(tsx@4.20.6))
'@vue/runtime-core':
- specifier: 3.5.24
- version: 3.5.24
+ specifier: 3.5.25
+ version: 3.5.25
acorn:
specifier: 8.15.0
version: 8.15.0
@@ -1258,16 +1246,16 @@ importers:
version: 10.1.0
eslint-plugin-import:
specifier: 2.32.0
- version: 2.32.0(@typescript-eslint/parser@8.47.0(eslint@9.39.1)(typescript@5.9.3))(eslint@9.39.1)
+ version: 2.32.0(@typescript-eslint/parser@8.48.0(eslint@9.39.1)(typescript@5.9.3))(eslint@9.39.1)
eslint-plugin-vue:
- specifier: 10.5.1
- version: 10.5.1(@stylistic/eslint-plugin@5.5.0(eslint@9.39.1))(@typescript-eslint/parser@8.47.0(eslint@9.39.1)(typescript@5.9.3))(eslint@9.39.1)(vue-eslint-parser@10.2.0(eslint@9.39.1))
+ specifier: 10.6.2
+ version: 10.6.2(@stylistic/eslint-plugin@5.5.0(eslint@9.39.1))(@typescript-eslint/parser@8.48.0(eslint@9.39.1)(typescript@5.9.3))(eslint@9.39.1)(vue-eslint-parser@10.2.0(eslint@9.39.1))
fast-glob:
specifier: 3.3.3
version: 3.3.3
happy-dom:
- specifier: 20.0.10
- version: 20.0.10
+ specifier: 20.0.11
+ version: 20.0.11
intersection-observer:
specifier: 0.12.2
version: 0.12.2
@@ -1275,17 +1263,17 @@ importers:
specifier: 4.0.8
version: 4.0.8
msw:
- specifier: 2.12.2
- version: 2.12.2(@types/node@24.10.1)(typescript@5.9.3)
+ specifier: 2.12.3
+ version: 2.12.3(@types/node@24.10.1)(typescript@5.9.3)
nodemon:
specifier: 3.1.11
version: 3.1.11
prettier:
- specifier: 3.6.2
- version: 3.6.2
+ specifier: 3.7.1
+ version: 3.7.1
start-server-and-test:
- specifier: 2.1.2
- version: 2.1.2
+ specifier: 2.1.3
+ version: 2.1.3
tsx:
specifier: 4.20.6
version: 4.20.6
@@ -1293,39 +1281,42 @@ importers:
specifier: 1.0.3
version: 1.0.3
vue-component-type-helpers:
- specifier: 3.1.4
- version: 3.1.4
+ specifier: 3.1.5
+ version: 3.1.5
vue-eslint-parser:
specifier: 10.2.0
version: 10.2.0(eslint@9.39.1)
vue-tsc:
- specifier: 3.1.4
- version: 3.1.4(typescript@5.9.3)
+ specifier: 3.1.5
+ version: 3.1.5(typescript@5.9.3)
packages/frontend-shared:
dependencies:
+ i18n:
+ specifier: workspace:*
+ version: link:../i18n
misskey-js:
specifier: workspace:*
version: link:../misskey-js
vue:
- specifier: 3.5.24
- version: 3.5.24(typescript@5.9.3)
+ specifier: 3.5.25
+ version: 3.5.25(typescript@5.9.3)
devDependencies:
'@types/node':
specifier: 24.10.1
version: 24.10.1
'@typescript-eslint/eslint-plugin':
- specifier: 8.47.0
- version: 8.47.0(@typescript-eslint/parser@8.47.0(eslint@9.39.1)(typescript@5.9.3))(eslint@9.39.1)(typescript@5.9.3)
+ specifier: 8.48.0
+ version: 8.48.0(@typescript-eslint/parser@8.48.0(eslint@9.39.1)(typescript@5.9.3))(eslint@9.39.1)(typescript@5.9.3)
'@typescript-eslint/parser':
- specifier: 8.47.0
- version: 8.47.0(eslint@9.39.1)(typescript@5.9.3)
+ specifier: 8.48.0
+ version: 8.48.0(eslint@9.39.1)(typescript@5.9.3)
esbuild:
specifier: 0.27.0
version: 0.27.0
eslint-plugin-vue:
- specifier: 10.5.1
- version: 10.5.1(@stylistic/eslint-plugin@5.5.0(eslint@9.39.1))(@typescript-eslint/parser@8.47.0(eslint@9.39.1)(typescript@5.9.3))(eslint@9.39.1)(vue-eslint-parser@10.2.0(eslint@9.39.1))
+ specifier: 10.6.2
+ version: 10.6.2(@stylistic/eslint-plugin@5.5.0(eslint@9.39.1))(@typescript-eslint/parser@8.48.0(eslint@9.39.1)(typescript@5.9.3))(eslint@9.39.1)(vue-eslint-parser@10.2.0(eslint@9.39.1))
nodemon:
specifier: 3.1.11
version: 3.1.11
@@ -1336,6 +1327,46 @@ importers:
specifier: 10.2.0
version: 10.2.0(eslint@9.39.1)
+ packages/i18n:
+ dependencies:
+ js-yaml:
+ specifier: 4.1.1
+ version: 4.1.1
+ devDependencies:
+ '@types/js-yaml':
+ specifier: 4.0.9
+ version: 4.0.9
+ '@types/node':
+ specifier: 24.10.1
+ version: 24.10.1
+ '@typescript-eslint/eslint-plugin':
+ specifier: 8.47.0
+ version: 8.47.0(@typescript-eslint/parser@8.47.0(eslint@9.39.1)(typescript@5.9.3))(eslint@9.39.1)(typescript@5.9.3)
+ '@typescript-eslint/parser':
+ specifier: 8.47.0
+ version: 8.47.0(eslint@9.39.1)(typescript@5.9.3)
+ chokidar:
+ specifier: 4.0.3
+ version: 4.0.3
+ esbuild:
+ specifier: 0.27.0
+ version: 0.27.0
+ execa:
+ specifier: 9.6.0
+ version: 9.6.0
+ glob:
+ specifier: 11.1.0
+ version: 11.1.0
+ nodemon:
+ specifier: 3.1.11
+ version: 3.1.11
+ tsx:
+ specifier: 4.20.6
+ version: 4.20.6
+ typescript:
+ specifier: 5.9.3
+ version: 5.9.3
+
packages/icons-subsetter:
dependencies:
'@tabler/icons-webfont':
@@ -1364,11 +1395,11 @@ importers:
specifier: 1.0.2
version: 1.0.2
'@typescript-eslint/eslint-plugin':
- specifier: 8.47.0
- version: 8.47.0(@typescript-eslint/parser@8.47.0(eslint@9.39.1)(typescript@5.9.3))(eslint@9.39.1)(typescript@5.9.3)
+ specifier: 8.48.0
+ version: 8.48.0(@typescript-eslint/parser@8.48.0(eslint@9.39.1)(typescript@5.9.3))(eslint@9.39.1)(typescript@5.9.3)
'@typescript-eslint/parser':
- specifier: 8.47.0
- version: 8.47.0(eslint@9.39.1)(typescript@5.9.3)
+ specifier: 8.48.0
+ version: 8.48.0(eslint@9.39.1)(typescript@5.9.3)
packages/misskey-bubble-game:
dependencies:
@@ -1392,11 +1423,11 @@ importers:
specifier: 3.0.8
version: 3.0.8
'@typescript-eslint/eslint-plugin':
- specifier: 8.47.0
- version: 8.47.0(@typescript-eslint/parser@8.47.0(eslint@9.39.1)(typescript@5.9.3))(eslint@9.39.1)(typescript@5.9.3)
+ specifier: 8.48.0
+ version: 8.48.0(@typescript-eslint/parser@8.48.0(eslint@9.39.1)(typescript@5.9.3))(eslint@9.39.1)(typescript@5.9.3)
'@typescript-eslint/parser':
- specifier: 8.47.0
- version: 8.47.0(eslint@9.39.1)(typescript@5.9.3)
+ specifier: 8.48.0
+ version: 8.48.0(eslint@9.39.1)(typescript@5.9.3)
esbuild:
specifier: 0.27.0
version: 0.27.0
@@ -1426,8 +1457,8 @@ importers:
version: 4.4.0
devDependencies:
'@microsoft/api-extractor':
- specifier: 7.55.0
- version: 7.55.0(@types/node@24.10.1)
+ specifier: 7.55.1
+ version: 7.55.1(@types/node@24.10.1)
'@types/node':
specifier: 24.10.1
version: 24.10.1
@@ -1438,8 +1469,8 @@ importers:
specifier: 8.47.0
version: 8.47.0(eslint@9.39.1)(typescript@5.9.3)
'@vitest/coverage-v8':
- specifier: 4.0.10
- version: 4.0.10(vitest@4.0.10(@types/debug@4.1.12)(@types/node@24.10.1)(happy-dom@20.0.10)(jsdom@27.2.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(msw@2.12.2(@types/node@24.10.1)(typescript@5.9.3))(sass@1.94.1)(terser@5.44.1)(tsx@4.20.6))
+ specifier: 4.0.13
+ version: 4.0.13(vitest@4.0.13(@opentelemetry/api@1.9.0)(@types/debug@4.1.12)(@types/node@24.10.1)(happy-dom@20.0.11)(jsdom@27.2.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(msw@2.12.3(@types/node@24.10.1)(typescript@5.9.3))(sass@1.94.2)(terser@5.44.1)(tsx@4.20.6))
esbuild:
specifier: 0.27.0
version: 0.27.0
@@ -1462,11 +1493,11 @@ importers:
specifier: 5.9.3
version: 5.9.3
vitest:
- specifier: 4.0.10
- version: 4.0.10(@types/debug@4.1.12)(@types/node@24.10.1)(happy-dom@20.0.10)(jsdom@27.2.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(msw@2.12.2(@types/node@24.10.1)(typescript@5.9.3))(sass@1.94.1)(terser@5.44.1)(tsx@4.20.6)
+ specifier: 4.0.13
+ version: 4.0.13(@opentelemetry/api@1.9.0)(@types/debug@4.1.12)(@types/node@24.10.1)(happy-dom@20.0.11)(jsdom@27.2.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(msw@2.12.3(@types/node@24.10.1)(typescript@5.9.3))(sass@1.94.2)(terser@5.44.1)(tsx@4.20.6)
vitest-websocket-mock:
specifier: 0.5.0
- version: 0.5.0(vitest@4.0.10(@types/debug@4.1.12)(@types/node@24.10.1)(happy-dom@20.0.10)(jsdom@27.2.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(msw@2.12.2(@types/node@24.10.1)(typescript@5.9.3))(sass@1.94.1)(terser@5.44.1)(tsx@4.20.6))
+ version: 0.5.0(vitest@4.0.13(@opentelemetry/api@1.9.0)(@types/debug@4.1.12)(@types/node@24.10.1)(happy-dom@20.0.11)(jsdom@27.2.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(msw@2.12.3(@types/node@24.10.1)(typescript@5.9.3))(sass@1.94.2)(terser@5.44.1)(tsx@4.20.6))
packages/misskey-js/generator:
devDependencies:
@@ -1511,11 +1542,11 @@ importers:
specifier: 24.10.1
version: 24.10.1
'@typescript-eslint/eslint-plugin':
- specifier: 8.47.0
- version: 8.47.0(@typescript-eslint/parser@8.47.0(eslint@9.39.1)(typescript@5.9.3))(eslint@9.39.1)(typescript@5.9.3)
+ specifier: 8.48.0
+ version: 8.48.0(@typescript-eslint/parser@8.48.0(eslint@9.39.1)(typescript@5.9.3))(eslint@9.39.1)(typescript@5.9.3)
'@typescript-eslint/parser':
- specifier: 8.47.0
- version: 8.47.0(eslint@9.39.1)(typescript@5.9.3)
+ specifier: 8.48.0
+ version: 8.48.0(eslint@9.39.1)(typescript@5.9.3)
esbuild:
specifier: 0.27.0
version: 0.27.0
@@ -1537,6 +1568,9 @@ importers:
esbuild:
specifier: 0.27.0
version: 0.27.0
+ i18n:
+ specifier: workspace:*
+ version: link:../i18n
idb-keyval:
specifier: 6.2.2
version: 6.2.2
@@ -1545,14 +1579,14 @@ importers:
version: link:../misskey-js
devDependencies:
'@typescript-eslint/parser':
- specifier: 8.47.0
- version: 8.47.0(eslint@9.39.1)(typescript@5.9.3)
+ specifier: 8.48.0
+ version: 8.48.0(eslint@9.39.1)(typescript@5.9.3)
'@typescript/lib-webworker':
specifier: npm:@types/serviceworker@0.0.74
version: '@types/serviceworker@0.0.74'
eslint-plugin-import:
specifier: 2.32.0
- version: 2.32.0(@typescript-eslint/parser@8.47.0(eslint@9.39.1)(typescript@5.9.3))(eslint@9.39.1)
+ version: 2.32.0(@typescript-eslint/parser@8.48.0(eslint@9.39.1)(typescript@5.9.3))(eslint@9.39.1)
nodemon:
specifier: 3.1.11
version: 3.1.11
@@ -1568,10 +1602,6 @@ packages:
'@adobe/css-tools@4.4.4':
resolution: {integrity: sha512-Elp+iwUx5rN5+Y8xLt5/GRoG20WGoDCQ/1Fb+1LiGtvwbDavuSk0jhD/eZdckHAuzcDzccnkv+rEjyWfRx18gg==}
- '@ampproject/remapping@2.3.0':
- resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==}
- engines: {node: '>=6.0.0'}
-
'@analytics/cookie-utils@0.2.14':
resolution: {integrity: sha512-x51x2cLqvP5Fb1ydgNvTCX+SVv0ALK/yTNwp/53++yk4kLhxb850krWtQ4aASN0612oXrIGotwfmdJIttnLiPQ==}
@@ -1608,11 +1638,8 @@ packages:
'@apm-js-collab/tracing-hooks@0.3.1':
resolution: {integrity: sha512-Vu1CbmPURlN5fTboVuKMoJjbO5qcq9fA5YXpskx3dXe/zTBvjODFoerw+69rVBlRLrJpwPqSDqEuJDEKIrTldw==}
- '@asamuzakjp/css-color@3.2.0':
- resolution: {integrity: sha512-K1A6z8tS3XsmCMM86xoWdn7Fkdn9m6RSVtocUrJYIwZnFVkng/PvkEoWtOWmP+Scc6saYWHWZYbndEEXxl24jw==}
-
- '@asamuzakjp/css-color@4.1.0':
- resolution: {integrity: sha512-9xiBAtLn4aNsa4mDnpovJvBn72tNEIACyvlqaNJ+ADemR+yeMJWnBudOi2qGDviJa7SwcDOU/TRh5dnET7qk0w==}
+ '@asamuzakjp/css-color@4.0.5':
+ resolution: {integrity: sha512-lMrXidNhPGsDjytDy11Vwlb6OIGrT3CmLg3VWNFyWkLWtijKl7xjvForlh8vuj0SHGjgl4qZEQzUmYTeQA2JFQ==}
'@asamuzakjp/dom-selector@6.7.4':
resolution: {integrity: sha512-buQDjkm+wDPXd6c13534URWZqbz0RP5PAhXZ+LIoa5LgwInT9HVJvGIJivg75vi8I13CxDGdTnz+aY5YUJlIAA==}
@@ -1643,59 +1670,99 @@ packages:
'@aws-crypto/util@5.2.0':
resolution: {integrity: sha512-4RkU9EsI6ZpBve5fseQlGNUWKMa1RLPQ1dnjnQoe07ldfIzcsGb5hC5W0Dm7u423KWzawlrpbjXBrXCEv9zazQ==}
- '@aws-sdk/client-s3@3.936.0':
- resolution: {integrity: sha512-dnzZAkJDa9tdCxhqdnh37hdizJkernoFn0rufWahziOEmf0Yv9+mLeqR4qDmsAGUMuD1jFCmPR97FaCoh10mZg==}
+ '@aws-sdk/client-s3@3.940.0':
+ resolution: {integrity: sha512-Wi4qnBT6shRRMXuuTgjMFTU5mu2KFWisgcigEMPptjPGUtJvBVi4PTGgS64qsLoUk/obqDAyOBOfEtRZ2ddC2w==}
engines: {node: '>=18.0.0'}
- '@aws-sdk/client-ses@3.936.0':
- resolution: {integrity: sha512-2toHYwRkcYGasPHYGwOwaIAa2Api/uFhmL3px0Tyt4bne2ilqhSwq+6a/0UVMd8JYwWaLMJolTbWKFt2jUlmGg==}
+ '@aws-sdk/client-sesv2@3.938.0':
+ resolution: {integrity: sha512-GW07FQuZkW5ASm0WP+CWLetcortqup9l3+p1OlvuUN3rLBIzlWRqYd5Nf2GTS72sPbaNowE3dYJXCtwu1IlLuQ==}
engines: {node: '>=18.0.0'}
'@aws-sdk/client-sso@3.936.0':
resolution: {integrity: sha512-0G73S2cDqYwJVvqL08eakj79MZG2QRaB56Ul8/Ps9oQxllr7DMI1IQ/N3j3xjxgpq/U36pkoFZ8aK1n7Sbr3IQ==}
engines: {node: '>=18.0.0'}
+ '@aws-sdk/client-sso@3.940.0':
+ resolution: {integrity: sha512-SdqJGWVhmIURvCSgkDditHRO+ozubwZk9aCX9MK8qxyOndhobCndW1ozl3hX9psvMAo9Q4bppjuqy/GHWpjB+A==}
+ engines: {node: '>=18.0.0'}
+
'@aws-sdk/core@3.936.0':
resolution: {integrity: sha512-eGJ2ySUMvgtOziHhDRDLCrj473RJoL4J1vPjVM3NrKC/fF3/LoHjkut8AAnKmrW6a2uTzNKubigw8dEnpmpERw==}
engines: {node: '>=18.0.0'}
+ '@aws-sdk/core@3.940.0':
+ resolution: {integrity: sha512-KsGD2FLaX5ngJao1mHxodIVU9VYd1E8810fcYiGwO1PFHDzf5BEkp6D9IdMeQwT8Q6JLYtiiT1Y/o3UCScnGoA==}
+ engines: {node: '>=18.0.0'}
+
'@aws-sdk/credential-provider-env@3.936.0':
resolution: {integrity: sha512-dKajFuaugEA5i9gCKzOaVy9uTeZcApE+7Z5wdcZ6j40523fY1a56khDAUYkCfwqa7sHci4ccmxBkAo+fW1RChA==}
engines: {node: '>=18.0.0'}
+ '@aws-sdk/credential-provider-env@3.940.0':
+ resolution: {integrity: sha512-/G3l5/wbZYP2XEQiOoIkRJmlv15f1P3MSd1a0gz27lHEMrOJOGq66rF1Ca4OJLzapWt3Fy9BPrZAepoAX11kMw==}
+ engines: {node: '>=18.0.0'}
+
'@aws-sdk/credential-provider-http@3.936.0':
resolution: {integrity: sha512-5FguODLXG1tWx/x8fBxH+GVrk7Hey2LbXV5h9SFzYCx/2h50URBm0+9hndg0Rd23+xzYe14F6SI9HA9c1sPnjg==}
engines: {node: '>=18.0.0'}
+ '@aws-sdk/credential-provider-http@3.940.0':
+ resolution: {integrity: sha512-dOrc03DHElNBD6N9Okt4U0zhrG4Wix5QUBSZPr5VN8SvmjD9dkrrxOkkJaMCl/bzrW7kbQEp7LuBdbxArMmOZQ==}
+ engines: {node: '>=18.0.0'}
+
'@aws-sdk/credential-provider-ini@3.936.0':
resolution: {integrity: sha512-TbUv56ERQQujoHcLMcfL0Q6bVZfYF83gu/TjHkVkdSlHPOIKaG/mhE2XZSQzXv1cud6LlgeBbfzVAxJ+HPpffg==}
engines: {node: '>=18.0.0'}
+ '@aws-sdk/credential-provider-ini@3.940.0':
+ resolution: {integrity: sha512-gn7PJQEzb/cnInNFTOaDoCN/hOKqMejNmLof1W5VW95Qk0TPO52lH8R4RmJPnRrwFMswOWswTOpR1roKNLIrcw==}
+ engines: {node: '>=18.0.0'}
+
'@aws-sdk/credential-provider-login@3.936.0':
resolution: {integrity: sha512-8DVrdRqPyUU66gfV7VZNToh56ZuO5D6agWrkLQE/xbLJOm2RbeRgh6buz7CqV8ipRd6m+zCl9mM4F3osQLZn8Q==}
engines: {node: '>=18.0.0'}
+ '@aws-sdk/credential-provider-login@3.940.0':
+ resolution: {integrity: sha512-fOKC3VZkwa9T2l2VFKWRtfHQPQuISqqNl35ZhcXjWKVwRwl/o7THPMkqI4XwgT2noGa7LLYVbWMwnsgSsBqglg==}
+ engines: {node: '>=18.0.0'}
+
'@aws-sdk/credential-provider-node@3.936.0':
resolution: {integrity: sha512-rk/2PCtxX9xDsQW8p5Yjoca3StqmQcSfkmD7nQ61AqAHL1YgpSQWqHE+HjfGGiHDYKG7PvE33Ku2GyA7lEIJAw==}
engines: {node: '>=18.0.0'}
+ '@aws-sdk/credential-provider-node@3.940.0':
+ resolution: {integrity: sha512-M8NFAvgvO6xZjiti5kztFiAYmSmSlG3eUfr4ZHSfXYZUA/KUdZU/D6xJyaLnU8cYRWBludb6K9XPKKVwKfqm4g==}
+ engines: {node: '>=18.0.0'}
+
'@aws-sdk/credential-provider-process@3.936.0':
resolution: {integrity: sha512-GpA4AcHb96KQK2PSPUyvChvrsEKiLhQ5NWjeef2IZ3Jc8JoosiedYqp6yhZR+S8cTysuvx56WyJIJc8y8OTrLA==}
engines: {node: '>=18.0.0'}
+ '@aws-sdk/credential-provider-process@3.940.0':
+ resolution: {integrity: sha512-pILBzt5/TYCqRsJb7vZlxmRIe0/T+FZPeml417EK75060ajDGnVJjHcuVdLVIeKoTKm9gmJc9l45gon6PbHyUQ==}
+ engines: {node: '>=18.0.0'}
+
'@aws-sdk/credential-provider-sso@3.936.0':
resolution: {integrity: sha512-wHlEAJJvtnSyxTfNhN98JcU4taA1ED2JvuI2eePgawqBwS/Tzi0mhED1lvNIaWOkjfLd+nHALwszGrtJwEq4yQ==}
engines: {node: '>=18.0.0'}
+ '@aws-sdk/credential-provider-sso@3.940.0':
+ resolution: {integrity: sha512-q6JMHIkBlDCOMnA3RAzf8cGfup+8ukhhb50fNpghMs1SNBGhanmaMbZSgLigBRsPQW7fOk2l8jnzdVLS+BB9Uw==}
+ engines: {node: '>=18.0.0'}
+
'@aws-sdk/credential-provider-web-identity@3.936.0':
resolution: {integrity: sha512-v3qHAuoODkoRXsAF4RG+ZVO6q2P9yYBT4GMpMEfU9wXVNn7AIfwZgTwzSUfnjNiGva5BKleWVpRpJ9DeuLFbUg==}
engines: {node: '>=18.0.0'}
- '@aws-sdk/lib-storage@3.936.0':
- resolution: {integrity: sha512-56X4b/w8omhowteTHu5+lQy/c6s3N+EFmdcJisanUZtorr6l4NFrqCXGBTwo8dIEwzJ7gdDRoyMFH0iTBeerPQ==}
+ '@aws-sdk/credential-provider-web-identity@3.940.0':
+ resolution: {integrity: sha512-9QLTIkDJHHaYL0nyymO41H8g3ui1yz6Y3GmAN1gYQa6plXisuFBnGAbmKVj7zNvjWaOKdF0dV3dd3AFKEDoJ/w==}
+ engines: {node: '>=18.0.0'}
+
+ '@aws-sdk/lib-storage@3.940.0':
+ resolution: {integrity: sha512-4pHgz9tuFJNSy/qoTbW5FqXPjoR4B18jB656UsE+TP5GWd7EPx7m4F0EUwIsD3OF5+KPiiyICi8zkxOs7erfQw==}
engines: {node: '>=18.0.0'}
peerDependencies:
- '@aws-sdk/client-s3': ^3.936.0
+ '@aws-sdk/client-s3': ^3.940.0
'@aws-sdk/middleware-bucket-endpoint@3.936.0':
resolution: {integrity: sha512-XLSVVfAorUxZh6dzF+HTOp4R1B5EQcdpGcPliWr0KUj2jukgjZEcqbBmjyMF/p9bmyQsONX80iURF1HLAlW0qg==}
@@ -1705,8 +1772,8 @@ packages:
resolution: {integrity: sha512-Eb4ELAC23bEQLJmUMYnPWcjD3FZIsmz2svDiXEcxRkQU9r7NRID7pM7C5NPH94wOfiCk0b2Y8rVyFXW0lGQwbA==}
engines: {node: '>=18.0.0'}
- '@aws-sdk/middleware-flexible-checksums@3.936.0':
- resolution: {integrity: sha512-l3GG6CrSQtMCM6fWY7foV3JQv0WJWT+3G6PSP3Ceb/KEE/5Lz5PrYFXTBf+bVoYL1b0bGjGajcgAXpstBmtHtQ==}
+ '@aws-sdk/middleware-flexible-checksums@3.940.0':
+ resolution: {integrity: sha512-WdsxDAVj5qaa5ApAP+JbpCOMHFGSmzjs2Y2OBSbWPeR9Ew7t/Okj+kUub94QJPsgzhvU1/cqNejhsw5VxeFKSQ==}
engines: {node: '>=18.0.0'}
'@aws-sdk/middleware-host-header@3.936.0':
@@ -1729,6 +1796,10 @@ packages:
resolution: {integrity: sha512-UQs/pVq4cOygsnKON0pOdSKIWkfgY0dzq4h+fR+xHi/Ng3XzxPJhWeAE6tDsKrcyQc1X8UdSbS70XkfGYr5hng==}
engines: {node: '>=18.0.0'}
+ '@aws-sdk/middleware-sdk-s3@3.940.0':
+ resolution: {integrity: sha512-JYkLjgS1wLoKHJ40G63+afM1ehmsPsjcmrHirKh8+kSCx4ip7+nL1e/twV4Zicxr8RJi9Y0Ahq5mDvneilDDKQ==}
+ engines: {node: '>=18.0.0'}
+
'@aws-sdk/middleware-ssec@3.936.0':
resolution: {integrity: sha512-/GLC9lZdVp05ozRik5KsuODR/N7j+W+2TbfdFL3iS+7un+gnP6hC8RDOZd6WhpZp7drXQ9guKiTAxkZQwzS8DA==}
engines: {node: '>=18.0.0'}
@@ -1737,10 +1808,18 @@ packages:
resolution: {integrity: sha512-YB40IPa7K3iaYX0lSnV9easDOLPLh+fJyUDF3BH8doX4i1AOSsYn86L4lVldmOaSX+DwiaqKHpvk4wPBdcIPWw==}
engines: {node: '>=18.0.0'}
+ '@aws-sdk/middleware-user-agent@3.940.0':
+ resolution: {integrity: sha512-nJbLrUj6fY+l2W2rIB9P4Qvpiy0tnTdg/dmixRxrU1z3e8wBdspJlyE+AZN4fuVbeL6rrRrO/zxQC1bB3cw5IA==}
+ engines: {node: '>=18.0.0'}
+
'@aws-sdk/nested-clients@3.936.0':
resolution: {integrity: sha512-eyj2tz1XmDSLSZQ5xnB7cLTVKkSJnYAEoNDSUNhzWPxrBDYeJzIbatecOKceKCU8NBf8gWWZCK/CSY0mDxMO0A==}
engines: {node: '>=18.0.0'}
+ '@aws-sdk/nested-clients@3.940.0':
+ resolution: {integrity: sha512-x0mdv6DkjXqXEcQj3URbCltEzW6hoy/1uIL+i8gExP6YKrnhiZ7SzuB4gPls2UOpK5UqLiqXjhRLfBb1C9i4Dw==}
+ engines: {node: '>=18.0.0'}
+
'@aws-sdk/region-config-resolver@3.936.0':
resolution: {integrity: sha512-wOKhzzWsshXGduxO4pqSiNyL9oUtk4BEvjWm9aaq6Hmfdoydq6v6t0rAGHWPjFwy9z2haovGRi3C8IxdMB4muw==}
engines: {node: '>=18.0.0'}
@@ -1749,10 +1828,18 @@ packages:
resolution: {integrity: sha512-8qS0GFUqkmwO7JZ0P8tdluBmt1UTfYUah8qJXGzNh9n1Pcb0AIeT117cCSiCUtwk+gDbJvd4hhRIhJCNr5wgjg==}
engines: {node: '>=18.0.0'}
+ '@aws-sdk/signature-v4-multi-region@3.940.0':
+ resolution: {integrity: sha512-ugHZEoktD/bG6mdgmhzLDjMP2VrYRAUPRPF1DpCyiZexkH7DCU7XrSJyXMvkcf0DHV+URk0q2sLf/oqn1D2uYw==}
+ engines: {node: '>=18.0.0'}
+
'@aws-sdk/token-providers@3.936.0':
resolution: {integrity: sha512-vvw8+VXk0I+IsoxZw0mX9TMJawUJvEsg3EF7zcCSetwhNPAU8Xmlhv7E/sN/FgSmm7b7DsqKoW6rVtQiCs1PWQ==}
engines: {node: '>=18.0.0'}
+ '@aws-sdk/token-providers@3.940.0':
+ resolution: {integrity: sha512-k5qbRe/ZFjW9oWEdzLIa2twRVIEx7p/9rutofyrRysrtEnYh3HAWCngAnwbgKMoiwa806UzcTRx0TjyEpnKcCg==}
+ engines: {node: '>=18.0.0'}
+
'@aws-sdk/types@3.936.0':
resolution: {integrity: sha512-uz0/VlMd2pP5MepdrHizd+T+OKfyK4r3OA9JI+L/lPKg0YFQosdJNCKisr6o70E3dh8iMpFYxF1UN/4uZsyARg==}
engines: {node: '>=18.0.0'}
@@ -1781,6 +1868,15 @@ packages:
aws-crt:
optional: true
+ '@aws-sdk/util-user-agent-node@3.940.0':
+ resolution: {integrity: sha512-dlD/F+L/jN26I8Zg5x0oDGJiA+/WEQmnSE27fi5ydvYnpfQLwThtQo9SsNS47XSR/SOULaaoC9qx929rZuo74A==}
+ engines: {node: '>=18.0.0'}
+ peerDependencies:
+ aws-crt: '>=1.0.0'
+ peerDependenciesMeta:
+ aws-crt:
+ optional: true
+
'@aws-sdk/xml-builder@3.930.0':
resolution: {integrity: sha512-YIfkD17GocxdmlUVc3ia52QhcWuRIUJonbF8A2CYfcWNV3HzvAqpcPeC0bYUhkK+8e8YO1ARnLKZQE0TlwzorA==}
engines: {node: '>=18.0.0'}
@@ -2043,9 +2139,9 @@ packages:
'@cypress/xvfb@1.2.4':
resolution: {integrity: sha512-skbBzPggOVYCbnGgV+0dmBdW/s77ZkAOXIC1knS8NagwDjBrNC1LuXtQJeiN6l+m7lzmHtaoUw/ctJKdqkG57Q==}
- '@digitalbazaar/http-client@3.4.1':
- resolution: {integrity: sha512-Ahk1N+s7urkgj7WvvUND5f8GiWEPfUw0D41hdElaqLgu8wZScI8gdI0q+qWw5N1d35x7GCRH2uk9mi+Uzo9M3g==}
- engines: {node: '>=14.0'}
+ '@digitalbazaar/http-client@4.2.0':
+ resolution: {integrity: sha512-OGju/GYp0V72qlZ/Pd4jGEwqBwT/Za/tw+Z3AC7lgMheGqsbhTZrtc5iLz9z59G/Q53QyE2fnjHV8N9wjBpiWA==}
+ engines: {node: '>=18.0'}
'@discordapp/twemoji@16.0.1':
resolution: {integrity: sha512-figLiBWzjS5cyrAjLaGjM8AAaowO3qvK8rg5bA2dElB4qsaPMvBVlFDMO2d3x+nC1igt7kgWH4dvNmvvUHUF8w==}
@@ -2428,18 +2524,14 @@ packages:
'@fastify/ajv-compiler@4.0.5':
resolution: {integrity: sha512-KoWKW+MhvfTRWL4qrhUwAAZoaChluo0m0vbiJlGMt2GXvL4LVPQEjt8kSpHI3IBq5Rez8fg+XeH3cneztq+C7A==}
- '@fastify/busboy@2.1.1':
- resolution: {integrity: sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==}
- engines: {node: '>=14'}
-
'@fastify/busboy@3.2.0':
resolution: {integrity: sha512-m9FVDXU3GT2ITSe0UaMA5rU3QkfC/UXtCU8y0gSN/GugTqtVldOBWIB5V6V3sbmenVZUIpU6f+mPEO2+m5iTaA==}
'@fastify/cookie@11.0.2':
resolution: {integrity: sha512-GWdwdGlgJxyvNv+QcKiGNevSspMQXncjMZ1J8IvuDQk0jvkzgWWZFNC2En3s+nHndZBGV8IbLwOI/sxCZw/mzA==}
- '@fastify/cors@10.1.0':
- resolution: {integrity: sha512-MZyBCBJtII60CU9Xme/iE4aEy8G7QpzGR8zkdXZkDFt7ElEMachbE61tfhAG/bvSaULlqlf0huMT12T7iqEmdQ==}
+ '@fastify/cors@11.1.0':
+ resolution: {integrity: sha512-sUw8ed8wP2SouWZTIbA7V2OQtMNpLj2W6qJOYhNdcmINTu6gsxVYXjQiM9mdi8UUDlcoDDJ/W2syPo1WB2QjYA==}
'@fastify/deepmerge@3.1.0':
resolution: {integrity: sha512-lCVONBQINyNhM6LLezB6+2afusgEYR4G8xenMsfe+AT+iZ7Ca6upM5Ha8UkZuYSnuMw3GWl/BiPXnLMi/gSxuQ==}
@@ -2456,8 +2548,8 @@ packages:
'@fastify/forwarded@3.0.1':
resolution: {integrity: sha512-JqDochHFqXs3C3Ml3gOY58zM7OqO9ENqPo0UqAjAjH8L01fRZqwX9iLeX34//kiJubF7r2ZQHtBRU36vONbLlw==}
- '@fastify/http-proxy@10.0.2':
- resolution: {integrity: sha512-3IlTjOu9xtX5UPd/ZxY3ebYb6caINuBlr7iyVxYmh3zZLV0K5ted8yfU9UCNXVNs33RwbXD2RhDucc3z5BNgEA==}
+ '@fastify/http-proxy@11.3.0':
+ resolution: {integrity: sha512-FXFxkdTlXqVI11fqlxmHqOPzIo0elBA60o3bfdh2seD44KWOBBzelzCVgs1OelrxuADCyWUQp2ZxA2wp3mqQMg==}
'@fastify/merge-json-schemas@0.2.1':
resolution: {integrity: sha512-OA3KGBCy6KtIvLf8DINC5880o5iBlDX4SxzLQS8HorJAbqluzLRn80UXU0bxZn7UOFhFgpRJDasfwn9nG4FG4A==}
@@ -2468,8 +2560,8 @@ packages:
'@fastify/proxy-addr@5.1.0':
resolution: {integrity: sha512-INS+6gh91cLUjB+PVHfu1UqcB76Sqtpyp7bnL+FYojhjygvOPA9ctiD/JDKsyD9Xgu4hUhCSJBPig/w7duNajw==}
- '@fastify/reply-from@11.0.2':
- resolution: {integrity: sha512-VcHhe01PsHuVX2eVrkoskCs+pwNPgVfOOpwQJnSo3AwIKtISm0VCFB7bycQjHfxAuPYgkrI6ZvYoovdHx4sVMA==}
+ '@fastify/reply-from@12.4.0':
+ resolution: {integrity: sha512-2MGQ3c/Sf3YKs6/YNwZgk7v6udDeA4AmlqeaxKHVFg/0ZPN2T1AjtU0SZ8VmIZsxZXQVOlhjR43oVydbuqm8SQ==}
'@fastify/send@4.1.0':
resolution: {integrity: sha512-TMYeQLCBSy2TOFmV95hQWkiTYgC/SEx7vMdV+wnZVX4tt8VBLKzmH8vV9OzJehV0+XBfg+WxPMt5wp+JBUKsVw==}
@@ -2477,8 +2569,8 @@ packages:
'@fastify/static@8.3.0':
resolution: {integrity: sha512-yKxviR5PH1OKNnisIzZKmgZSus0r2OZb8qCSbqmw34aolT4g3UlzYfeBRym+HJ1J471CR8e2ldNub4PubD1coA==}
- '@fastify/view@10.0.2':
- resolution: {integrity: sha512-tGjXFyDUMj5a+E8BBrQ2wpsVnpOfMq3cqy4WD8pnjWPE/HGNItBASUPoPUcX/QjPhxfuZZTYv2XdCmKXdcMZPw==}
+ '@file-type/xml@0.4.4':
+ resolution: {integrity: sha512-NhCyXoHlVZ8TqM476hyzwGJ24+D5IPSaZhmrPj7qXnEVb3q6jrFzA3mM9TBpknKSI9EuQeGTKRg2DXGUwvBBoQ==}
'@github/webauthn-json@2.1.1':
resolution: {integrity: sha512-XrftRn4z75SnaJOmZQbt7Mk+IIjqVHw+glDGOxuHwXkZBZh/MBoRS7MHjSZMDaLhT4RjN2VqiEU7EOYleuJWSQ==}
@@ -2835,6 +2927,17 @@ packages:
'@keyv/serialize@1.1.1':
resolution: {integrity: sha512-dXn3FZhPv0US+7dtJsIi2R+c7qWYiReoEh5zUntWCf4oSpMNib8FDhSoed6m3QyZdx5hK7iLFkYk3rNxwt8vTA==}
+ '@kitajs/html@4.2.11':
+ resolution: {integrity: sha512-gOe+zzCZKN2fPT1FUK32mHsr21ILcAOUUux/yDqQthInW8egN8RuxVp+zP3KhwWETVACkurBiKV9RWuNw+ceiw==}
+ engines: {node: '>=12'}
+
+ '@kitajs/ts-html-plugin@4.1.3':
+ resolution: {integrity: sha512-NlYrID5yMxfRKiO1eiiSC4MWveKe0ffoCJOZm4idNOqwimmLXr0g1NmvCcquOU2XLRrgzynxZqw6rhwR5CY5Nw==}
+ hasBin: true
+ peerDependencies:
+ '@kitajs/html': ^4.2.10
+ typescript: ^5.6.2
+
'@kurkle/color@0.3.4':
resolution: {integrity: sha512-M5UknZPHRu3DEDWoipU6sE8PdkZ6Z/S+v4dD+Ke8IaNlpdSQah50lz1KtcFBa2vsdOnwbbnxJwVM4wty6udA5w==}
@@ -2865,11 +2968,11 @@ packages:
'@types/react': '>=16'
react: '>=16'
- '@microsoft/api-extractor-model@7.32.0':
- resolution: {integrity: sha512-QIVJSreb8fGGJy1Qx0yzGVXxvHJN1WXgkFNHFheVv1iBJNqgvp+xeT3ienJmRwXmPPc5Es/cxBrXtKZJR3i7iw==}
+ '@microsoft/api-extractor-model@7.32.1':
+ resolution: {integrity: sha512-u4yJytMYiUAnhcNQcZDTh/tVtlrzKlyKrQnLOV+4Qr/5gV+cpufWzCYAB1Q23URFqD6z2RoL2UYncM9xJVGNKA==}
- '@microsoft/api-extractor@7.55.0':
- resolution: {integrity: sha512-TYc5OtAK/9E3HGgd2bIfSjQDYIwPc0dysf9rPiwXZGsq916I6W2oww9bhm1OxPOeg6rMfOX3PoroGd7oCryYog==}
+ '@microsoft/api-extractor@7.55.1':
+ resolution: {integrity: sha512-l8Z+8qrLkZFM3HM95Dbpqs6G39fpCa7O5p8A7AkA6hSevxkgwsOlLrEuPv0ADOyj5dI1Af5WVDiwpKG/ya5G3w==}
hasBin: true
'@microsoft/tsdoc-config@0.18.0':
@@ -2933,73 +3036,73 @@ packages:
resolution: {integrity: sha512-EFd6cVbHsgLa6wa4RljGj6Wk75qoHxUSyc5asLyyPSyuhIcdS2Q3Phw6ImS1q+CkALthJRShiYfKANcQMuMqsQ==}
engines: {node: '>=18'}
- '@napi-rs/canvas-android-arm64@0.1.82':
- resolution: {integrity: sha512-bvZhN0iI54ouaQOrgJV96H2q7J3ZoufnHf4E1fUaERwW29Rz4rgicohnAg4venwBJZYjGl5Yl3CGmlAl1LZowQ==}
+ '@napi-rs/canvas-android-arm64@0.1.83':
+ resolution: {integrity: sha512-TbKM2fh9zXjqFIU8bgMfzG7rkrIYdLKMafgPhFoPwKrpWk1glGbWP7LEu8Y/WrMDqTGFdRqUmuX89yQEzZbkiw==}
engines: {node: '>= 10'}
cpu: [arm64]
os: [android]
- '@napi-rs/canvas-darwin-arm64@0.1.82':
- resolution: {integrity: sha512-InuBHKCyuFqhNwNr4gpqazo5Xp6ltKflqOLiROn4hqAS8u21xAHyYCJRgHwd+a5NKmutFTaRWeUIT/vxWbU/iw==}
+ '@napi-rs/canvas-darwin-arm64@0.1.83':
+ resolution: {integrity: sha512-gp8IDVUloPUmkepHly4xRUOfUJSFNvA4jR7ZRF5nk3YcGzegSFGeICiT4PnYyPgSKEhYAFe1Y2XNy0Mp6Tu8mQ==}
engines: {node: '>= 10'}
cpu: [arm64]
os: [darwin]
- '@napi-rs/canvas-darwin-x64@0.1.82':
- resolution: {integrity: sha512-aQGV5Ynn96onSXcuvYb2y7TRXD/t4CL2EGmnGqvLyeJX1JLSNisKQlWN/1bPDDXymZYSdUqbXehj5qzBlOx+RQ==}
+ '@napi-rs/canvas-darwin-x64@0.1.83':
+ resolution: {integrity: sha512-r4ZJxiP9OgUbdGZhPDEXD3hQ0aIPcVaywtcTXvamYxTU/SWKAbKVhFNTtpRe1J30oQ25gWyxTkUKSBgUkNzdnw==}
engines: {node: '>= 10'}
cpu: [x64]
os: [darwin]
- '@napi-rs/canvas-linux-arm-gnueabihf@0.1.82':
- resolution: {integrity: sha512-YIUpmHWeHGGRhWitT1KJkgj/JPXPfc9ox8oUoyaGPxolLGPp5AxJkq8wIg8CdFGtutget968dtwmx71m8o3h5g==}
+ '@napi-rs/canvas-linux-arm-gnueabihf@0.1.83':
+ resolution: {integrity: sha512-Uc6aSB05qH1r+9GUDxIE6F5ZF7L0nTFyyzq8ublWUZhw8fEGK8iy931ff1ByGFT04+xHJad1kBcL4R1ZEV8z7Q==}
engines: {node: '>= 10'}
cpu: [arm]
os: [linux]
- '@napi-rs/canvas-linux-arm64-gnu@0.1.82':
- resolution: {integrity: sha512-AwLzwLBgmvk7kWeUgItOUor/QyG31xqtD26w1tLpf4yE0hiXTGp23yc669aawjB6FzgIkjh1NKaNS52B7/qEBQ==}
+ '@napi-rs/canvas-linux-arm64-gnu@0.1.83':
+ resolution: {integrity: sha512-eEeaJA7V5KOFq7W0GtoRVbd3ak8UZpK+XLkCgUiFGtlunNw+ZZW9Cr/92MXflGe7o3SqqMUg+f975LPxO/vsOQ==}
engines: {node: '>= 10'}
cpu: [arm64]
os: [linux]
libc: [glibc]
- '@napi-rs/canvas-linux-arm64-musl@0.1.82':
- resolution: {integrity: sha512-moZWuqepAwWBffdF4JDadt8TgBD02iMhG6I1FHZf8xO20AsIp9rB+p0B8Zma2h2vAF/YMjeFCDmW5un6+zZz9g==}
+ '@napi-rs/canvas-linux-arm64-musl@0.1.83':
+ resolution: {integrity: sha512-cAvonp5XpbatVGegF9lMQNchs3z5RH6EtamRVnQvtoRtwbzOMcdzwuLBqDBQxQF79MFbuZNkWj3YRJjZCjHVzw==}
engines: {node: '>= 10'}
cpu: [arm64]
os: [linux]
libc: [musl]
- '@napi-rs/canvas-linux-riscv64-gnu@0.1.82':
- resolution: {integrity: sha512-w9++2df2kG9eC9LWYIHIlMLuhIrKGQYfUxs97CwgxYjITeFakIRazI9LYWgVzEc98QZ9x9GQvlicFsrROV59MQ==}
+ '@napi-rs/canvas-linux-riscv64-gnu@0.1.83':
+ resolution: {integrity: sha512-WFUPQ9qZy31vmLxIJ3MfmHw+R2g/mLCgk8zmh7maJW8snV3vLPA7pZfIS65Dc61EVDp1vaBskwQ2RqPPzwkaew==}
engines: {node: '>= 10'}
cpu: [riscv64]
os: [linux]
libc: [glibc]
- '@napi-rs/canvas-linux-x64-gnu@0.1.82':
- resolution: {integrity: sha512-lZulOPwrRi6hEg/17CaqdwWEUfOlIJuhXxincx1aVzsVOCmyHf+xFq4i6liJl1P+x2v6Iz2Z/H5zHvXJCC7Bwg==}
+ '@napi-rs/canvas-linux-x64-gnu@0.1.83':
+ resolution: {integrity: sha512-X9YwIjsuy50WwOyYeNhEHjKHO8rrfH9M4U8vNqLuGmqsZdKua/GrUhdQGdjq7lTgdY3g4+Ta5jF8MzAa7UAs/g==}
engines: {node: '>= 10'}
cpu: [x64]
os: [linux]
libc: [glibc]
- '@napi-rs/canvas-linux-x64-musl@0.1.82':
- resolution: {integrity: sha512-Be9Wf5RTv1w6GXlTph55K3PH3vsAh1Ax4T1FQY1UYM0QfD0yrwGdnJ8/fhqw7dEgMjd59zIbjJQC8C3msbGn5g==}
+ '@napi-rs/canvas-linux-x64-musl@0.1.83':
+ resolution: {integrity: sha512-Vv2pLWQS8EnlSM1bstJ7vVhKA+mL4+my4sKUIn/bgIxB5O90dqiDhQjUDLP+5xn9ZMestRWDt3tdQEkGAmzq/A==}
engines: {node: '>= 10'}
cpu: [x64]
os: [linux]
libc: [musl]
- '@napi-rs/canvas-win32-x64-msvc@0.1.82':
- resolution: {integrity: sha512-LN/i8VrvxTDmEEK1c10z2cdOTkWT76LlTGtyZe5Kr1sqoSomKeExAjbilnu1+oee5lZUgS5yfZ2LNlVhCeARuw==}
+ '@napi-rs/canvas-win32-x64-msvc@0.1.83':
+ resolution: {integrity: sha512-K1TtjbScfRNYhq8dengLLufXGbtEtWdUXPV505uLFPovyGHzDUGXLFP/zUJzj6xWXwgUjHNLgEPIt7mye0zr6Q==}
engines: {node: '>= 10'}
cpu: [x64]
os: [win32]
- '@napi-rs/canvas@0.1.82':
- resolution: {integrity: sha512-FGjyUBoF0sl1EenSiE4UV2WYu76q6F9GSYedq5EiOCOyGYoQ/Owulcv6rd7v/tWOpljDDtefXXIaOCJrVKem4w==}
+ '@napi-rs/canvas@0.1.83':
+ resolution: {integrity: sha512-f9GVB9VNc9vn/nroc9epXRNkVpvNPZh69+qzLJIm9DfruxFqX0/jsXG46OGWAJgkO4mN0HvFHjRROMXKVmPszg==}
engines: {node: '>= 10'}
'@napi-rs/nice-android-arm-eabi@1.1.1':
@@ -3146,11 +3249,11 @@ packages:
'@nestjs/websockets':
optional: true
- '@nestjs/platform-express@10.4.20':
- resolution: {integrity: sha512-rh97mX3rimyf4xLMLHuTOBKe6UD8LOJ14VlJ1F/PTd6C6ZK9Ak6EHuJvdaGcSFQhd3ZMBh3I6CuujKGW9pNdIg==}
+ '@nestjs/platform-express@11.1.9':
+ resolution: {integrity: sha512-GVd3+0lO0mJq2m1kl9hDDnVrX3Nd4oH3oDfklz0pZEVEVS0KVSp63ufHq2Lu9cyPdSBuelJr9iPm2QQ1yX+Kmw==}
peerDependencies:
- '@nestjs/common': ^10.0.0
- '@nestjs/core': ^10.0.0
+ '@nestjs/common': ^11.0.0
+ '@nestjs/core': ^11.0.0
'@nestjs/testing@11.1.9':
resolution: {integrity: sha512-UFxerBDdb0RUNxQNj25pvkvNE7/vxKhXYWBt3QuwBFnYISzRIzhVlyIqLfoV5YI3zV0m0Nn4QAn1KM0zzwfEng==}
@@ -3206,14 +3309,10 @@ packages:
'@open-draft/until@2.1.0':
resolution: {integrity: sha512-U69T3ItWHvLwGg5eJ0n3I62nWuE6ilHlmz7zM0npLBRvPRd7e6NYmg54vvRtP5mZG7kZqZCFVdsTWo7BPtBujg==}
- '@opentelemetry/api-logs@0.204.0':
- resolution: {integrity: sha512-DqxY8yoAaiBPivoJD4UtgrMS8gEmzZ5lnaxzPojzLVHBGqPxgWm4zcuvcUHZiqQ6kRX2Klel2r9y8cA2HAtqpw==}
+ '@opentelemetry/api-logs@0.208.0':
+ resolution: {integrity: sha512-CjruKY9V6NMssL/T1kAFgzosF1v9o6oeN+aX5JB/C/xPNtmgIJqcXHG7fA82Ou1zCpWGl4lROQUKwUNE1pMCyg==}
engines: {node: '>=8.0.0'}
- '@opentelemetry/api-logs@0.57.2':
- resolution: {integrity: sha512-uIX52NnTM0iBh84MShlpouI7UKqkZ7MrUszTmaypHBu4r7NofznSnQRfJ+uUeDtQDj6w8eFGg5KBLDAwAPz1+A==}
- engines: {node: '>=14'}
-
'@opentelemetry/api@1.9.0':
resolution: {integrity: sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==}
engines: {node: '>=8.0.0'}
@@ -3224,162 +3323,150 @@ packages:
peerDependencies:
'@opentelemetry/api': '>=1.0.0 <1.10.0'
- '@opentelemetry/core@2.1.0':
- resolution: {integrity: sha512-RMEtHsxJs/GiHHxYT58IY57UXAQTuUnZVco6ymDEqTNlJKTimM4qPUPVe8InNFyBjhHBEAx4k3Q8LtNayBsbUQ==}
- engines: {node: ^18.19.0 || >=20.6.0}
- peerDependencies:
- '@opentelemetry/api': '>=1.0.0 <1.10.0'
-
'@opentelemetry/core@2.2.0':
resolution: {integrity: sha512-FuabnnUm8LflnieVxs6eP7Z383hgQU4W1e3KJS6aOG3RxWxcHyBxH8fDMHNgu/gFx/M2jvTOW/4/PHhLz6bjWw==}
engines: {node: ^18.19.0 || >=20.6.0}
peerDependencies:
'@opentelemetry/api': '>=1.0.0 <1.10.0'
- '@opentelemetry/instrumentation-amqplib@0.51.0':
- resolution: {integrity: sha512-XGmjYwjVRktD4agFnWBWQXo9SiYHKBxR6Ag3MLXwtLE4R99N3a08kGKM5SC1qOFKIELcQDGFEFT9ydXMH00Luw==}
+ '@opentelemetry/instrumentation-amqplib@0.55.0':
+ resolution: {integrity: sha512-5ULoU8p+tWcQw5PDYZn8rySptGSLZHNX/7srqo2TioPnAAcvTy6sQFQXsNPrAnyRRtYGMetXVyZUy5OaX1+IfA==}
engines: {node: ^18.19.0 || >=20.6.0}
peerDependencies:
'@opentelemetry/api': ^1.3.0
- '@opentelemetry/instrumentation-connect@0.48.0':
- resolution: {integrity: sha512-OMjc3SFL4pC16PeK+tDhwP7MRvDPalYCGSvGqUhX5rASkI2H0RuxZHOWElYeXkV0WP+70Gw6JHWac/2Zqwmhdw==}
+ '@opentelemetry/instrumentation-connect@0.52.0':
+ resolution: {integrity: sha512-GXPxfNB5szMbV3I9b7kNWSmQBoBzw7MT0ui6iU/p+NIzVx3a06Ri2cdQO7tG9EKb4aKSLmfX9Cw5cKxXqX6Ohg==}
engines: {node: ^18.19.0 || >=20.6.0}
peerDependencies:
'@opentelemetry/api': ^1.3.0
- '@opentelemetry/instrumentation-dataloader@0.22.0':
- resolution: {integrity: sha512-bXnTcwtngQsI1CvodFkTemrrRSQjAjZxqHVc+CJZTDnidT0T6wt3jkKhnsjU/Kkkc0lacr6VdRpCu2CUWa0OKw==}
+ '@opentelemetry/instrumentation-dataloader@0.26.0':
+ resolution: {integrity: sha512-P2BgnFfTOarZ5OKPmYfbXfDFjQ4P9WkQ1Jji7yH5/WwB6Wm/knynAoA1rxbjWcDlYupFkyT0M1j6XLzDzy0aCA==}
engines: {node: ^18.19.0 || >=20.6.0}
peerDependencies:
'@opentelemetry/api': ^1.3.0
- '@opentelemetry/instrumentation-express@0.53.0':
- resolution: {integrity: sha512-r/PBafQmFYRjuxLYEHJ3ze1iBnP2GDA1nXOSS6E02KnYNZAVjj6WcDA1MSthtdAUUK0XnotHvvWM8/qz7DMO5A==}
+ '@opentelemetry/instrumentation-express@0.57.0':
+ resolution: {integrity: sha512-HAdx/o58+8tSR5iW+ru4PHnEejyKrAy9fYFhlEI81o10nYxrGahnMAHWiSjhDC7UQSY3I4gjcPgSKQz4rm/asg==}
engines: {node: ^18.19.0 || >=20.6.0}
peerDependencies:
'@opentelemetry/api': ^1.3.0
- '@opentelemetry/instrumentation-fs@0.24.0':
- resolution: {integrity: sha512-HjIxJ6CBRD770KNVaTdMXIv29Sjz4C1kPCCK5x1Ujpc6SNnLGPqUVyJYZ3LUhhnHAqdbrl83ogVWjCgeT4Q0yw==}
+ '@opentelemetry/instrumentation-fs@0.28.0':
+ resolution: {integrity: sha512-FFvg8fq53RRXVBRHZViP+EMxMR03tqzEGpuq55lHNbVPyFklSVfQBN50syPhK5UYYwaStx0eyCtHtbRreusc5g==}
engines: {node: ^18.19.0 || >=20.6.0}
peerDependencies:
'@opentelemetry/api': ^1.3.0
- '@opentelemetry/instrumentation-generic-pool@0.48.0':
- resolution: {integrity: sha512-TLv/On8pufynNR+pUbpkyvuESVASZZKMlqCm4bBImTpXKTpqXaJJ3o/MUDeMlM91rpen+PEv2SeyOKcHCSlgag==}
+ '@opentelemetry/instrumentation-generic-pool@0.52.0':
+ resolution: {integrity: sha512-ISkNcv5CM2IwvsMVL31Tl61/p2Zm2I2NAsYq5SSBgOsOndT0TjnptjufYVScCnD5ZLD1tpl4T3GEYULLYOdIdQ==}
engines: {node: ^18.19.0 || >=20.6.0}
peerDependencies:
'@opentelemetry/api': ^1.3.0
- '@opentelemetry/instrumentation-graphql@0.52.0':
- resolution: {integrity: sha512-3fEJ8jOOMwopvldY16KuzHbRhPk8wSsOTSF0v2psmOCGewh6ad+ZbkTx/xyUK9rUdUMWAxRVU0tFpj4Wx1vkPA==}
+ '@opentelemetry/instrumentation-graphql@0.56.0':
+ resolution: {integrity: sha512-IPvNk8AFoVzTAM0Z399t34VDmGDgwT6rIqCUug8P9oAGerl2/PEIYMPOl/rerPGu+q8gSWdmbFSjgg7PDVRd3Q==}
engines: {node: ^18.19.0 || >=20.6.0}
peerDependencies:
'@opentelemetry/api': ^1.3.0
- '@opentelemetry/instrumentation-hapi@0.51.0':
- resolution: {integrity: sha512-qyf27DaFNL1Qhbo/da+04MSCw982B02FhuOS5/UF+PMhM61CcOiu7fPuXj8TvbqyReQuJFljXE6UirlvoT/62g==}
+ '@opentelemetry/instrumentation-hapi@0.55.0':
+ resolution: {integrity: sha512-prqAkRf9e4eEpy4G3UcR32prKE8NLNlA90TdEU1UsghOTg0jUvs40Jz8LQWFEs5NbLbXHYGzB4CYVkCI8eWEVQ==}
engines: {node: ^18.19.0 || >=20.6.0}
peerDependencies:
'@opentelemetry/api': ^1.3.0
- '@opentelemetry/instrumentation-http@0.204.0':
- resolution: {integrity: sha512-1afJYyGRA4OmHTv0FfNTrTAzoEjPQUYgd+8ih/lX0LlZBnGio/O80vxA0lN3knsJPS7FiDrsDrWq25K7oAzbkw==}
+ '@opentelemetry/instrumentation-http@0.208.0':
+ resolution: {integrity: sha512-rhmK46DRWEbQQB77RxmVXGyjs6783crXCnFjYQj+4tDH/Kpv9Rbg3h2kaNyp5Vz2emF1f9HOQQvZoHzwMWOFZQ==}
engines: {node: ^18.19.0 || >=20.6.0}
peerDependencies:
'@opentelemetry/api': ^1.3.0
- '@opentelemetry/instrumentation-ioredis@0.52.0':
- resolution: {integrity: sha512-rUvlyZwI90HRQPYicxpDGhT8setMrlHKokCtBtZgYxQWRF5RBbG4q0pGtbZvd7kyseuHbFpA3I/5z7M8b/5ywg==}
+ '@opentelemetry/instrumentation-ioredis@0.56.0':
+ resolution: {integrity: sha512-XSWeqsd3rKSsT3WBz/JKJDcZD4QYElZEa0xVdX8f9dh4h4QgXhKRLorVsVkK3uXFbC2sZKAS2Ds+YolGwD83Dg==}
engines: {node: ^18.19.0 || >=20.6.0}
peerDependencies:
'@opentelemetry/api': ^1.3.0
- '@opentelemetry/instrumentation-kafkajs@0.14.0':
- resolution: {integrity: sha512-kbB5yXS47dTIdO/lfbbXlzhvHFturbux4EpP0+6H78Lk0Bn4QXiZQW7rmZY1xBCY16mNcCb8Yt0mhz85hTnSVA==}
+ '@opentelemetry/instrumentation-kafkajs@0.18.0':
+ resolution: {integrity: sha512-KCL/1HnZN5zkUMgPyOxfGjLjbXjpd4odDToy+7c+UsthIzVLFf99LnfIBE8YSSrYE4+uS7OwJMhvhg3tWjqMBg==}
engines: {node: ^18.19.0 || >=20.6.0}
peerDependencies:
'@opentelemetry/api': ^1.3.0
- '@opentelemetry/instrumentation-knex@0.49.0':
- resolution: {integrity: sha512-NKsRRT27fbIYL4Ix+BjjP8h4YveyKc+2gD6DMZbr5R5rUeDqfC8+DTfIt3c3ex3BIc5Vvek4rqHnN7q34ZetLQ==}
+ '@opentelemetry/instrumentation-knex@0.53.0':
+ resolution: {integrity: sha512-xngn5cH2mVXFmiT1XfQ1aHqq1m4xb5wvU6j9lSgLlihJ1bXzsO543cpDwjrZm2nMrlpddBf55w8+bfS4qDh60g==}
engines: {node: ^18.19.0 || >=20.6.0}
peerDependencies:
'@opentelemetry/api': ^1.3.0
- '@opentelemetry/instrumentation-koa@0.52.0':
- resolution: {integrity: sha512-JJSBYLDx/mNSy8Ibi/uQixu2rH0bZODJa8/cz04hEhRaiZQoeJ5UrOhO/mS87IdgVsHrnBOsZ6vDu09znupyuA==}
+ '@opentelemetry/instrumentation-koa@0.57.0':
+ resolution: {integrity: sha512-3JS8PU/D5E3q295mwloU2v7c7/m+DyCqdu62BIzWt+3u9utjxC9QS7v6WmUNuoDN3RM+Q+D1Gpj13ERo+m7CGg==}
engines: {node: ^18.19.0 || >=20.6.0}
peerDependencies:
- '@opentelemetry/api': ^1.3.0
+ '@opentelemetry/api': ^1.9.0
- '@opentelemetry/instrumentation-lru-memoizer@0.49.0':
- resolution: {integrity: sha512-ctXu+O/1HSadAxtjoEg2w307Z5iPyLOMM8IRNwjaKrIpNAthYGSOanChbk1kqY6zU5CrpkPHGdAT6jk8dXiMqw==}
+ '@opentelemetry/instrumentation-lru-memoizer@0.53.0':
+ resolution: {integrity: sha512-LDwWz5cPkWWr0HBIuZUjslyvijljTwmwiItpMTHujaULZCxcYE9eU44Qf/pbVC8TulT0IhZi+RoGvHKXvNhysw==}
engines: {node: ^18.19.0 || >=20.6.0}
peerDependencies:
'@opentelemetry/api': ^1.3.0
- '@opentelemetry/instrumentation-mongodb@0.57.0':
- resolution: {integrity: sha512-KD6Rg0KSHWDkik+qjIOWoksi1xqSpix8TSPfquIK1DTmd9OTFb5PHmMkzJe16TAPVEuElUW8gvgP59cacFcrMQ==}
+ '@opentelemetry/instrumentation-mongodb@0.61.0':
+ resolution: {integrity: sha512-OV3i2DSoY5M/pmLk+68xr5RvkHU8DRB3DKMzYJdwDdcxeLs62tLbkmRyqJZsYf3Ht7j11rq35pHOWLuLzXL7pQ==}
engines: {node: ^18.19.0 || >=20.6.0}
peerDependencies:
'@opentelemetry/api': ^1.3.0
- '@opentelemetry/instrumentation-mongoose@0.51.0':
- resolution: {integrity: sha512-gwWaAlhhV2By7XcbyU3DOLMvzsgeaymwP/jktDC+/uPkCmgB61zurwqOQdeiRq9KAf22Y2dtE5ZLXxytJRbEVA==}
+ '@opentelemetry/instrumentation-mongoose@0.55.0':
+ resolution: {integrity: sha512-5afj0HfF6aM6Nlqgu6/PPHFk8QBfIe3+zF9FGpX76jWPS0/dujoEYn82/XcLSaW5LPUDW8sni+YeK0vTBNri+w==}
engines: {node: ^18.19.0 || >=20.6.0}
peerDependencies:
'@opentelemetry/api': ^1.3.0
- '@opentelemetry/instrumentation-mysql2@0.51.0':
- resolution: {integrity: sha512-zT2Wg22Xn43RyfU3NOUmnFtb5zlDI0fKcijCj9AcK9zuLZ4ModgtLXOyBJSSfO+hsOCZSC1v/Fxwj+nZJFdzLQ==}
+ '@opentelemetry/instrumentation-mysql2@0.55.0':
+ resolution: {integrity: sha512-0cs8whQG55aIi20gnK8B7cco6OK6N+enNhW0p5284MvqJ5EPi+I1YlWsWXgzv/V2HFirEejkvKiI4Iw21OqDWg==}
engines: {node: ^18.19.0 || >=20.6.0}
peerDependencies:
'@opentelemetry/api': ^1.3.0
- '@opentelemetry/instrumentation-mysql@0.50.0':
- resolution: {integrity: sha512-duKAvMRI3vq6u9JwzIipY9zHfikN20bX05sL7GjDeLKr2qV0LQ4ADtKST7KStdGcQ+MTN5wghWbbVdLgNcB3rA==}
+ '@opentelemetry/instrumentation-mysql@0.54.0':
+ resolution: {integrity: sha512-bqC1YhnwAeWmRzy1/Xf9cDqxNG2d/JDkaxnqF5N6iJKN1eVWI+vg7NfDkf52/Nggp3tl1jcC++ptC61BD6738A==}
engines: {node: ^18.19.0 || >=20.6.0}
peerDependencies:
'@opentelemetry/api': ^1.3.0
- '@opentelemetry/instrumentation-pg@0.57.0':
- resolution: {integrity: sha512-dWLGE+r5lBgm2A8SaaSYDE3OKJ/kwwy5WLyGyzor8PLhUL9VnJRiY6qhp4njwhnljiLtzeffRtG2Mf/YyWLeTw==}
+ '@opentelemetry/instrumentation-pg@0.61.0':
+ resolution: {integrity: sha512-UeV7KeTnRSM7ECHa3YscoklhUtTQPs6V6qYpG283AB7xpnPGCUCUfECFT9jFg6/iZOQTt3FHkB1wGTJCNZEvPw==}
engines: {node: ^18.19.0 || >=20.6.0}
peerDependencies:
'@opentelemetry/api': ^1.3.0
- '@opentelemetry/instrumentation-redis@0.53.0':
- resolution: {integrity: sha512-WUHV8fr+8yo5RmzyU7D5BIE1zwiaNQcTyZPwtxlfr7px6NYYx7IIpSihJK7WA60npWynfxxK1T67RAVF0Gdfjg==}
+ '@opentelemetry/instrumentation-redis@0.57.0':
+ resolution: {integrity: sha512-bCxTHQFXzrU3eU1LZnOZQ3s5LURxQPDlU3/upBzlWY77qOI1GZuGofazj3jtzjctMJeBEJhNwIFEgRPBX1kp/Q==}
engines: {node: ^18.19.0 || >=20.6.0}
peerDependencies:
'@opentelemetry/api': ^1.3.0
- '@opentelemetry/instrumentation-tedious@0.23.0':
- resolution: {integrity: sha512-3TMTk/9VtlRonVTaU4tCzbg4YqW+Iq/l5VnN2e5whP6JgEg/PKfrGbqQ+CxQWNLfLaQYIUgEZqAn5gk/inh1uQ==}
+ '@opentelemetry/instrumentation-tedious@0.27.0':
+ resolution: {integrity: sha512-jRtyUJNZppPBjPae4ZjIQ2eqJbcRaRfJkr0lQLHFmOU/no5A6e9s1OHLd5XZyZoBJ/ymngZitanyRRA5cniseA==}
engines: {node: ^18.19.0 || >=20.6.0}
peerDependencies:
'@opentelemetry/api': ^1.3.0
- '@opentelemetry/instrumentation-undici@0.15.0':
- resolution: {integrity: sha512-sNFGA/iCDlVkNjzTzPRcudmI11vT/WAfAguRdZY9IspCw02N4WSC72zTuQhSMheh2a1gdeM9my1imnKRvEEvEg==}
+ '@opentelemetry/instrumentation-undici@0.19.0':
+ resolution: {integrity: sha512-Pst/RhR61A2OoZQZkn6OLpdVpXp6qn3Y92wXa6umfJe9rV640r4bc6SWvw4pPN6DiQqPu2c8gnSSZPDtC6JlpQ==}
engines: {node: ^18.19.0 || >=20.6.0}
peerDependencies:
'@opentelemetry/api': ^1.7.0
- '@opentelemetry/instrumentation@0.204.0':
- resolution: {integrity: sha512-vV5+WSxktzoMP8JoYWKeopChy6G3HKk4UQ2hESCRDUUTZqQ3+nM3u8noVG0LmNfRWwcFBnbZ71GKC7vaYYdJ1g==}
+ '@opentelemetry/instrumentation@0.208.0':
+ resolution: {integrity: sha512-Eju0L4qWcQS+oXxi6pgh7zvE2byogAkcsVv0OjHF/97iOz1N/aKE6etSGowYkie+YA1uo6DNwdSxaaNnLvcRlA==}
engines: {node: ^18.19.0 || >=20.6.0}
peerDependencies:
'@opentelemetry/api': ^1.3.0
- '@opentelemetry/instrumentation@0.57.2':
- resolution: {integrity: sha512-BdBGhQBh8IjZ2oIIX6F2/Q3LKm/FDDKi6ccYKcBTeilh6SNdNKveDOLk73BkSJjQLJk6qe4Yh+hHw1UPhCDdrg==}
- engines: {node: '>=14'}
- peerDependencies:
- '@opentelemetry/api': ^1.3.0
-
'@opentelemetry/redis-common@0.38.2':
resolution: {integrity: sha512-1BCcU93iwSRZvDAgwUxC/DV4T/406SkMfxGqu5ojc3AvNI+I9GhV7v0J1HljsczuuhcnFLYqD5VmwVXfCGHzxA==}
engines: {node: ^18.19.0 || >=20.6.0}
@@ -3500,18 +3587,40 @@ packages:
'@peculiar/asn1-android@2.6.0':
resolution: {integrity: sha512-cBRCKtYPF7vJGN76/yG8VbxRcHLPF3HnkoHhKOZeHpoVtbMYfY9ROKtH3DtYUY9m8uI1Mh47PRhHf2hSK3xcSQ==}
+ '@peculiar/asn1-cms@2.6.0':
+ resolution: {integrity: sha512-2uZqP+ggSncESeUF/9Su8rWqGclEfEiz1SyU02WX5fUONFfkjzS2Z/F1Li0ofSmf4JqYXIOdCAZqIXAIBAT1OA==}
+
+ '@peculiar/asn1-csr@2.6.0':
+ resolution: {integrity: sha512-BeWIu5VpTIhfRysfEp73SGbwjjoLL/JWXhJ/9mo4vXnz3tRGm+NGm3KNcRzQ9VMVqwYS2RHlolz21svzRXIHPQ==}
+
'@peculiar/asn1-ecc@2.6.0':
resolution: {integrity: sha512-FF3LMGq6SfAOwUG2sKpPXblibn6XnEIKa+SryvUl5Pik+WR9rmRA3OCiwz8R3lVXnYnyRkSZsSLdml8H3UiOcw==}
+ '@peculiar/asn1-pfx@2.6.0':
+ resolution: {integrity: sha512-rtUvtf+tyKGgokHHmZzeUojRZJYPxoD/jaN1+VAB4kKR7tXrnDCA/RAWXAIhMJJC+7W27IIRGe9djvxKgsldCQ==}
+
+ '@peculiar/asn1-pkcs8@2.6.0':
+ resolution: {integrity: sha512-KyQ4D8G/NrS7Fw3XCJrngxmjwO/3htnA0lL9gDICvEQ+GJ+EPFqldcJQTwPIdvx98Tua+WjkdKHSC0/Km7T+lA==}
+
+ '@peculiar/asn1-pkcs9@2.6.0':
+ resolution: {integrity: sha512-b78OQ6OciW0aqZxdzliXGYHASeCvvw5caqidbpQRYW2mBtXIX2WhofNXTEe7NyxTb0P6J62kAAWLwn0HuMF1Fw==}
+
'@peculiar/asn1-rsa@2.6.0':
resolution: {integrity: sha512-Nu4C19tsrTsCp9fDrH+sdcOKoVfdfoQQ7S3VqjJU6vedR7tY3RLkQ5oguOIB3zFW33USDUuYZnPEQYySlgha4w==}
'@peculiar/asn1-schema@2.6.0':
resolution: {integrity: sha512-xNLYLBFTBKkCzEZIw842BxytQQATQv+lDTCEMZ8C196iJcJJMBUZxrhSTxLaohMyKK8QlzRNTRkUmanucnDSqg==}
+ '@peculiar/asn1-x509-attr@2.6.0':
+ resolution: {integrity: sha512-MuIAXFX3/dc8gmoZBkwJWxUWOSvG4MMDntXhrOZpJVMkYX+MYc/rUAU2uJOved9iJEoiUx7//3D8oG83a78UJA==}
+
'@peculiar/asn1-x509@2.6.0':
resolution: {integrity: sha512-uzYbPEpoQiBoTq0/+jZtpM6Gq6zADBx+JNFP3yqRgziWBxQ/Dt/HcuvRfm9zJTPdRcBqPNdaRHTVwpyiq6iNMA==}
+ '@peculiar/x509@1.14.2':
+ resolution: {integrity: sha512-r2w1Hg6pODDs0zfAKHkSS5HLkOLSeburtcgwvlLLWWCixw+MmW3U6kD5ddyvc2Y2YdbGuVwCF2S2ASoU1cFAag==}
+ engines: {node: '>=22.0.0'}
+
'@peertube/http-signature@1.7.0':
resolution: {integrity: sha512-aGQIwo6/sWtyyqhVK4e1MtxYz4N1X8CNt6SOtCc+Wnczs5S5ONaLHDDR8LYaGn0MgOwvGgXyuZ5sJIfd7iyoUw==}
engines: {node: '>=0.10'}
@@ -3523,8 +3632,8 @@ packages:
resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==}
engines: {node: '>=14'}
- '@prisma/instrumentation@6.15.0':
- resolution: {integrity: sha512-6TXaH6OmDkMOQvOxwLZ8XS51hU2v4A3vmE2pSijCIiGRJYyNeMcL6nMHQMyYdZRD8wl7LF3Wzc+AMPMV/9Oo7A==}
+ '@prisma/instrumentation@6.19.0':
+ resolution: {integrity: sha512-QcuYy25pkXM8BJ37wVFBO7Zh34nyRV1GOb2n3lPkkbRYfl4hWl3PTcImP41P0KrzVXfa/45p6eVCos27x3exIg==}
peerDependencies:
'@opentelemetry/api': ^1.8
@@ -3708,8 +3817,8 @@ packages:
'@rtsao/scc@1.1.0':
resolution: {integrity: sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==}
- '@rushstack/node-core-library@5.18.0':
- resolution: {integrity: sha512-XDebtBdw5S3SuZIt+Ra2NieT8kQ3D2Ow1HxhDQ/2soinswnOu9e7S69VSwTOLlQnx5mpWbONu+5JJjDxMAb6Fw==}
+ '@rushstack/node-core-library@5.19.0':
+ resolution: {integrity: sha512-BxAopbeWBvNJ6VGiUL+5lbJXywTdsnMeOS8j57Cn/xY10r6sV/gbsTlfYKjzVCUBZATX2eRzJHSMCchsMTGN6A==}
peerDependencies:
'@types/node': '*'
peerDependenciesMeta:
@@ -3727,81 +3836,81 @@ packages:
'@rushstack/rig-package@0.6.0':
resolution: {integrity: sha512-ZQmfzsLE2+Y91GF15c65L/slMRVhF6Hycq04D4TwtdGaUAbIXXg9c5pKA5KFU7M4QMaihoobp9JJYpYcaY3zOw==}
- '@rushstack/terminal@0.19.3':
- resolution: {integrity: sha512-0P8G18gK9STyO+CNBvkKPnWGMxESxecTYqOcikHOVIHXa9uAuTK+Fw8TJq2Gng1w7W6wTC9uPX6hGNvrMll2wA==}
+ '@rushstack/terminal@0.19.4':
+ resolution: {integrity: sha512-f4XQk02CrKfrMgyOfhYd3qWI944dLC21S4I/LUhrlAP23GTMDNG6EK5effQtFkISwUKCgD9vMBrJZaPSUquxWQ==}
peerDependencies:
'@types/node': '*'
peerDependenciesMeta:
'@types/node':
optional: true
- '@rushstack/ts-command-line@5.1.3':
- resolution: {integrity: sha512-Kdv0k/BnnxIYFlMVC1IxrIS0oGQd4T4b7vKfx52Y2+wk2WZSDFIvedr7JrhenzSlm3ou5KwtoTGTGd5nbODRug==}
+ '@rushstack/ts-command-line@5.1.4':
+ resolution: {integrity: sha512-H0I6VdJ6sOUbktDFpP2VW5N29w8v4hRoNZOQz02vtEi6ZTYL1Ju8u+TcFiFawUDrUsx/5MQTUhd79uwZZVwVlA==}
'@sec-ant/readable-stream@0.4.1':
resolution: {integrity: sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg==}
- '@sentry-internal/browser-utils@10.26.0':
- resolution: {integrity: sha512-rPg1+JZlfp912pZONQAWZzbSaZ9L6R2VrMcCEa+2e2Gqk9um4b+LqF5RQWZsbt5Z0n0azSy/KQ6zAe/zTPXSOg==}
+ '@sentry-internal/browser-utils@10.27.0':
+ resolution: {integrity: sha512-17tO6AXP+rmVQtLJ3ROQJF2UlFmvMWp7/8RDT5x9VM0w0tY31z8Twc0gw2KA7tcDxa5AaHDUbf9heOf+R6G6ow==}
engines: {node: '>=18'}
- '@sentry-internal/feedback@10.26.0':
- resolution: {integrity: sha512-0vk9eQP0CXD7Y2WkcCIWHaAqnXOAi18/GupgWLnbB2kuQVYVtStWxtW+OWRe8W/XwSnZ5m6JBTVeokuk/O16DQ==}
+ '@sentry-internal/feedback@10.27.0':
+ resolution: {integrity: sha512-UecsIDJcv7VBwycge/MDvgSRxzevDdcItE1i0KSwlPz00rVVxLY9kV28PJ4I2E7r6/cIaP9BkbWegCEcv09NuA==}
engines: {node: '>=18'}
'@sentry-internal/node-cpu-profiler@2.2.0':
resolution: {integrity: sha512-oLHVYurqZfADPh5hvmQYS5qx8t0UZzT2u6+/68VXsFruQEOnYJTODKgU3BVLmemRs3WE6kCJjPeFdHVYOQGSzQ==}
engines: {node: '>=18'}
- '@sentry-internal/replay-canvas@10.26.0':
- resolution: {integrity: sha512-vs7d/P+8M1L1JVAhhJx2wo15QDhqAipnEQvuRZ6PV7LUcS1un9/Vx49FMxpIkx6JcKADJVwtXrS1sX2hoNT/kw==}
+ '@sentry-internal/replay-canvas@10.27.0':
+ resolution: {integrity: sha512-inhsRYSVBpu3BI1kZphXj6uB59baJpYdyHeIPCiTfdFNBE5tngNH0HS/aedZ1g9zICw290lwvpuyrWJqp4VBng==}
engines: {node: '>=18'}
- '@sentry-internal/replay@10.26.0':
- resolution: {integrity: sha512-FMySQnY2/p0dVtFUBgUO+aMdK2ovqnd7Q/AkvMQUsN/5ulyj6KZx3JX3CqOqRtAr1izoCe4Kh2pi5t//sQmvsg==}
+ '@sentry-internal/replay@10.27.0':
+ resolution: {integrity: sha512-tKSzHq1hNzB619Ssrqo25cqdQJ84R3xSSLsUWEnkGO/wcXJvpZy94gwdoS+KmH18BB1iRRRGtnMxZcUkiPSesw==}
engines: {node: '>=18'}
- '@sentry/browser@10.26.0':
- resolution: {integrity: sha512-uvV4hnkt8bh8yP0disJ0fszy8FdnkyGtzyIVKdeQZbNUefwbDhd3H0KJrAHhJ5ocULMH3B+dipdPmw2QXbEflg==}
+ '@sentry/browser@10.27.0':
+ resolution: {integrity: sha512-G8q362DdKp9y1b5qkQEmhTFzyWTOVB0ps1rflok0N6bVA75IEmSDX1pqJsNuY3qy14VsVHYVwQBJQsNltQLS0g==}
engines: {node: '>=18'}
- '@sentry/core@10.26.0':
- resolution: {integrity: sha512-TjDe5QI37SLuV0q3nMOH8JcPZhv2e85FALaQMIhRILH9Ce6G7xW5GSjmH91NUVq8yc3XtiqYlz/EenEZActc4Q==}
+ '@sentry/core@10.27.0':
+ resolution: {integrity: sha512-Zc68kdH7tWTDtDbV1zWIbo3Jv0fHAU2NsF5aD2qamypKgfSIMSbWVxd22qZyDBkaX8gWIPm/0Sgx6aRXRBXrYQ==}
engines: {node: '>=18'}
- '@sentry/node-core@10.26.0':
- resolution: {integrity: sha512-7OrHVn8XAsq9mMVMlpL18XTKQEVcLOJSo0n2M7QGKfFk/OfVtSFMcUWGqN1qhYtT9aMTr2bjtR5+BI33djnNTQ==}
+ '@sentry/node-core@10.27.0':
+ resolution: {integrity: sha512-Dzo1I64Psb7AkpyKVUlR9KYbl4wcN84W4Wet3xjLmVKMgrCo2uAT70V4xIacmoMH5QLZAx0nGfRy9yRCd4nzBg==}
engines: {node: '>=18'}
peerDependencies:
'@opentelemetry/api': ^1.9.0
- '@opentelemetry/context-async-hooks': ^1.30.1 || ^2.1.0
- '@opentelemetry/core': ^1.30.1 || ^2.1.0
+ '@opentelemetry/context-async-hooks': ^1.30.1 || ^2.1.0 || ^2.2.0
+ '@opentelemetry/core': ^1.30.1 || ^2.1.0 || ^2.2.0
'@opentelemetry/instrumentation': '>=0.57.1 <1'
- '@opentelemetry/resources': ^1.30.1 || ^2.1.0
- '@opentelemetry/sdk-trace-base': ^1.30.1 || ^2.1.0
+ '@opentelemetry/resources': ^1.30.1 || ^2.1.0 || ^2.2.0
+ '@opentelemetry/sdk-trace-base': ^1.30.1 || ^2.1.0 || ^2.2.0
'@opentelemetry/semantic-conventions': ^1.37.0
- '@sentry/node@10.26.0':
- resolution: {integrity: sha512-VUwNoKYhRpnHQSj9lty1TgooO+1wcpS1V0K87HU8sZEas5gx3Ujiouk5ocPjlgbKreoYOApgOnEEIq5W/hfQcQ==}
+ '@sentry/node@10.27.0':
+ resolution: {integrity: sha512-1cQZ4+QqV9juW64Jku1SMSz+PoZV+J59lotz4oYFvCNYzex8hRAnDKvNiKW1IVg5mEEkz98mg1fvcUtiw7GTiQ==}
engines: {node: '>=18'}
- '@sentry/opentelemetry@10.26.0':
- resolution: {integrity: sha512-ASJdOwn6NwMH2ZeBrnGJI+l/xkJp1AOiQ5FWkvTqLc/vHX+r3PDMO7c+koecY+LiZxSzZF4IV8sALXfOh6UnwA==}
+ '@sentry/opentelemetry@10.27.0':
+ resolution: {integrity: sha512-z2vXoicuGiqlRlgL9HaYJgkin89ncMpNQy0Kje6RWyhpzLe8BRgUXlgjux7WrSrcbopDdC1OttSpZsJ/Wjk7fg==}
engines: {node: '>=18'}
peerDependencies:
'@opentelemetry/api': ^1.9.0
- '@opentelemetry/context-async-hooks': ^1.30.1 || ^2.1.0
- '@opentelemetry/core': ^1.30.1 || ^2.1.0
- '@opentelemetry/sdk-trace-base': ^1.30.1 || ^2.1.0
+ '@opentelemetry/context-async-hooks': ^1.30.1 || ^2.1.0 || ^2.2.0
+ '@opentelemetry/core': ^1.30.1 || ^2.1.0 || ^2.2.0
+ '@opentelemetry/sdk-trace-base': ^1.30.1 || ^2.1.0 || ^2.2.0
'@opentelemetry/semantic-conventions': ^1.37.0
- '@sentry/profiling-node@10.26.0':
- resolution: {integrity: sha512-NgfKgrJc39q/khkWZFph1tiZ1uUadtL8VrBTe+7eB/vogPAuEJa+eH/oCS3/M+Pu2fal61MoCw+2qHDH5JDxQQ==}
+ '@sentry/profiling-node@10.27.0':
+ resolution: {integrity: sha512-IMUdgNaiT7aji6/VDF5F1noY8LPpF3yFD6BjomQz72h0KeUrN/88S5MZNjcY7ZpW7wvI2yahUDLkMk11ScSMXQ==}
engines: {node: '>=18'}
hasBin: true
- '@sentry/vue@10.26.0':
- resolution: {integrity: sha512-KfgELqzuFc8beeYbx6u3Ed5l8Lj/iG0h8AgQ7YjK3FANsuwwFRioycwnoEMIJbEuKC9V3iRSHXk2W5Dgt1WWqw==}
+ '@sentry/vue@10.27.0':
+ resolution: {integrity: sha512-vQVxnw59jRe5WsdB9ad/WpMPQ93QXE6Y0JEy01xIRcDlQ1pXp5wuxLkKGuTfvjdQzVUGIBLr0CgIqRAmPRymVg==}
engines: {node: '>=18'}
peerDependencies:
pinia: 2.x || 3.x
@@ -3810,23 +3919,23 @@ packages:
pinia:
optional: true
- '@shikijs/core@3.15.0':
- resolution: {integrity: sha512-8TOG6yG557q+fMsSVa8nkEDOZNTSxjbbR8l6lF2gyr6Np+jrPlslqDxQkN6rMXCECQ3isNPZAGszAfYoJOPGlg==}
+ '@shikijs/core@3.17.0':
+ resolution: {integrity: sha512-/HjeOnbc62C+n33QFNFrAhUlIADKwfuoS50Ht0pxujxP4QjZAlFp5Q+OkDo531SCTzivx5T18khwyBdKoPdkuw==}
- '@shikijs/engine-javascript@3.15.0':
- resolution: {integrity: sha512-ZedbOFpopibdLmvTz2sJPJgns8Xvyabe2QbmqMTz07kt1pTzfEvKZc5IqPVO/XFiEbbNyaOpjPBkkr1vlwS+qg==}
+ '@shikijs/engine-javascript@3.17.0':
+ resolution: {integrity: sha512-WwF99xdP8KfuDrIbT4wxyypfhoIxMeeOCp1AiuvzzZ6JT5B3vIuoclL8xOuuydA6LBeeNXUF/XV5zlwwex1jlA==}
- '@shikijs/engine-oniguruma@3.15.0':
- resolution: {integrity: sha512-HnqFsV11skAHvOArMZdLBZZApRSYS4LSztk2K3016Y9VCyZISnlYUYsL2hzlS7tPqKHvNqmI5JSUJZprXloMvA==}
+ '@shikijs/engine-oniguruma@3.17.0':
+ resolution: {integrity: sha512-flSbHZAiOZDNTrEbULY8DLWavu/TyVu/E7RChpLB4WvKX4iHMfj80C6Hi3TjIWaQtHOW0KC6kzMcuB5TO1hZ8Q==}
- '@shikijs/langs@3.15.0':
- resolution: {integrity: sha512-WpRvEFvkVvO65uKYW4Rzxs+IG0gToyM8SARQMtGGsH4GDMNZrr60qdggXrFOsdfOVssG/QQGEl3FnJ3EZ+8w8A==}
+ '@shikijs/langs@3.17.0':
+ resolution: {integrity: sha512-icmur2n5Ojb+HAiQu6NEcIIJ8oWDFGGEpiqSCe43539Sabpx7Y829WR3QuUW2zjTM4l6V8Sazgb3rrHO2orEAw==}
- '@shikijs/themes@3.15.0':
- resolution: {integrity: sha512-8ow2zWb1IDvCKjYb0KiLNrK4offFdkfNVPXb1OZykpLCzRU6j+efkY+Y7VQjNlNFXonSw+4AOdGYtmqykDbRiQ==}
+ '@shikijs/themes@3.17.0':
+ resolution: {integrity: sha512-/xEizMHLBmMHwtx4JuOkRf3zwhWD2bmG5BRr0IPjpcWpaq4C3mYEuTk/USAEglN0qPrTwEHwKVpSu/y2jhferA==}
- '@shikijs/types@3.15.0':
- resolution: {integrity: sha512-BnP+y/EQnhihgHy4oIAN+6FFtmfTekwOLsQbRw9hOKwqgNy8Bdsjq8B05oAt/ZgvIWWFrshV71ytOrlPfYjIJw==}
+ '@shikijs/types@3.17.0':
+ resolution: {integrity: sha512-wjLVfutYWVUnxAjsWEob98xgyaGv0dTEnMZDruU5mRjVN7szcGOfgO+997W2yR6odp+1PtSBNeSITRRTfUzK/g==}
'@shikijs/vscode-textmate@10.0.2':
resolution: {integrity: sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==}
@@ -3840,8 +3949,8 @@ packages:
'@sideway/pinpoint@2.0.0':
resolution: {integrity: sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==}
- '@simplewebauthn/server@12.0.0':
- resolution: {integrity: sha512-aJdTe9GikOk40U7Q5Mm/Sqkxcq4a2oPZAcLcnyqMyFqrUaOS6vdsZW8/H3Mnsw9umcr88pcgB7kozPPt+5wOBw==}
+ '@simplewebauthn/server@13.2.2':
+ resolution: {integrity: sha512-HcWLW28yTMGXpwE9VLx9J+N2KEUaELadLrkPEEI9tpI5la70xNEVEsu/C+m3u7uoq4FulLqZQhgBCzR9IZhFpA==}
engines: {node: '>=20.0.0'}
'@simplewebauthn/types@12.0.0':
@@ -3875,22 +3984,18 @@ packages:
'@sinonjs/fake-timers@11.2.2':
resolution: {integrity: sha512-G2piCSxQ7oWOxwGSAyFHfPIsyeJGXYtc6mFbnFA+kRXkiEnTl8c/8jul2S329iFBnDI9HGoeWWAZvuvOkZccgw==}
- '@sinonjs/fake-timers@11.3.1':
- resolution: {integrity: sha512-EVJO7nW5M/F5Tur0Rf2z/QoMo+1Ia963RiMtapiQrEWvY0iBUvADo8Beegwjpnle5BHkyHuoxSTW3jF43H1XRA==}
-
'@sinonjs/fake-timers@13.0.5':
resolution: {integrity: sha512-36/hTbH2uaWuGVERyC6da9YwGWnzUZXuPro/F2LfsdOsLnCojz/iSH8MxUt/FD2S5XBSVPhmArFUXcpCQ2Hkiw==}
+ '@sinonjs/fake-timers@15.0.0':
+ resolution: {integrity: sha512-dlUB2oL+hDIYkIq/OWFBDhQAuU6kDey3eeMiYpVb7UXHhkMq/r1HloKXAbJwJZpYWkFWsydLjMqDpueMUEOjXQ==}
+
'@sinonjs/samsam@8.0.3':
resolution: {integrity: sha512-hw6HbX+GyVZzmaYNh82Ecj1vdGZrqVIn/keDTg63IgAwiQPO+xCz99uG6Woqgb4tM0mUiFENKZ4cqd7IX94AXQ==}
'@sinonjs/text-encoding@0.7.3':
resolution: {integrity: sha512-DE427ROAphMQzU4ENbliGYrBSYPXF+TtLg9S8vzeA+OF4ZKzoDdzfL8sxuMUGS/lgRhM6j1URSk9ghf7Xo1tyA==}
- '@smithy/abort-controller@2.2.0':
- resolution: {integrity: sha512-wRlta7GuLWpTqtFfGo+nZyOO1vEvewdNR1R4rTxpC8XU6vG/NDyrFBhwLZsqg1NUoR1noVaXJPC/7ZK47QCySw==}
- engines: {node: '>=14.0.0'}
-
'@smithy/abort-controller@4.2.5':
resolution: {integrity: sha512-j7HwVkBw68YW8UmFRcjZOmssE77Rvk0GWAIN1oFBhsaovQmZWYCIcGa9/pwRB0ExI8Sk9MWNALTjftjHZea7VA==}
engines: {node: '>=18.0.0'}
@@ -3991,10 +4096,6 @@ packages:
resolution: {integrity: sha512-UTurh1C4qkVCtqggI36DGbLB2Kv8UlcFdMXDcWMbqVY2uRg0XmT9Pb4Vj6oSQ34eizO1fvR0RnFV4Axw4IrrAg==}
engines: {node: '>=18.0.0'}
- '@smithy/node-http-handler@2.5.0':
- resolution: {integrity: sha512-mVGyPBzkkGQsPoxQUbxlEfRjrj6FPyA3u3u2VXGr9hT8wilsoQdZdvKpMBFMB8Crfhv5dNkKHIW0Yyuc7eABqA==}
- engines: {node: '>=14.0.0'}
-
'@smithy/node-http-handler@4.4.5':
resolution: {integrity: sha512-CMnzM9R2WqlqXQGtIlsHMEZfXKJVTIrqCNoSd/QpAyp+Dw0a1Vps13l6ma1fH8g7zSPNsA59B/kWgeylFuA/lw==}
engines: {node: '>=18.0.0'}
@@ -4003,18 +4104,10 @@ packages:
resolution: {integrity: sha512-8iLN1XSE1rl4MuxvQ+5OSk/Zb5El7NJZ1td6Tn+8dQQHIjp59Lwl6bd0+nzw6SKm2wSSriH2v/I9LPzUic7EOg==}
engines: {node: '>=18.0.0'}
- '@smithy/protocol-http@3.3.0':
- resolution: {integrity: sha512-Xy5XK1AFWW2nlY/biWZXu6/krgbaf2dg0q492D8M5qthsnU2H+UgFeZLbM76FnH7s6RO/xhQRkj+T6KBO3JzgQ==}
- engines: {node: '>=14.0.0'}
-
'@smithy/protocol-http@5.3.5':
resolution: {integrity: sha512-RlaL+sA0LNMp03bf7XPbFmT5gN+w3besXSWMkA8rcmxLSVfiEXElQi4O2IWwPfxzcHkxqrwBFMbngB8yx/RvaQ==}
engines: {node: '>=18.0.0'}
- '@smithy/querystring-builder@2.2.0':
- resolution: {integrity: sha512-L1kSeviUWL+emq3CUVSgdogoM/D9QMFaqxL/dd0X7PCNWmPXqt+ExtrBjqT0V7HLN03Vs9SuiLrG3zy3JGnE5A==}
- engines: {node: '>=14.0.0'}
-
'@smithy/querystring-builder@4.2.5':
resolution: {integrity: sha512-y98otMI1saoajeik2kLfGyRp11e5U/iJYH/wLCh3aTV/XutbGT9nziKGkgCaMD1ghK7p6htHMm6b6scl9JRUWg==}
engines: {node: '>=18.0.0'}
@@ -4039,10 +4132,6 @@ packages:
resolution: {integrity: sha512-8xgq3LgKDEFoIrLWBho/oYKyWByw9/corz7vuh1upv7ZBm0ZMjGYBhbn6v643WoIqA9UTcx5A5htEp/YatUwMA==}
engines: {node: '>=18.0.0'}
- '@smithy/types@2.12.0':
- resolution: {integrity: sha512-QwYgloJ0sVNBeBuBs65cIkTbfzV/Q6ZNPCJ99EICFEdJYG50nGIY/uYXp+TbsdJReIuPr0a0kXmCvren3MbRRw==}
- engines: {node: '>=14.0.0'}
-
'@smithy/types@4.9.0':
resolution: {integrity: sha512-MvUbdnXDTwykR8cB1WZvNNwqoWVaTRA0RLlLmf/cIFNMM2cKWz01X4Ly6SMC4Kks30r8tT3Cty0jmeWfiuyHTA==}
engines: {node: '>=18.0.0'}
@@ -4103,10 +4192,6 @@ packages:
resolution: {integrity: sha512-qWw/UM59TiaFrPevefOZ8CNBKbYEP6wBAIlLqxn3VAIo9rgnTNc4ASbVrqDmhuwI87usnjhdQrxodzAGFFzbRQ==}
engines: {node: '>=18.0.0'}
- '@smithy/util-uri-escape@2.2.0':
- resolution: {integrity: sha512-jtmJMyt1xMD/d8OtbVJ2gFZOSKc+ueYJZPW20ULW1GOp/q/YIM0wNh+u8ZFao9UaIGz4WoPW8hC64qlWLIfoDA==}
- engines: {node: '>=14.0.0'}
-
'@smithy/util-uri-escape@4.2.0':
resolution: {integrity: sha512-igZpCKV9+E/Mzrpq6YacdTQ0qTiLm85gD6N/IrmyDvQFA4UnU3d5g3m8tMT/6zG/vVkWSU+VxeUyGonL62DuxA==}
engines: {node: '>=18.0.0'}
@@ -4168,11 +4253,11 @@ packages:
peerDependencies:
storybook: ^8.6.14
- '@storybook/addon-links@9.1.16':
- resolution: {integrity: sha512-21SJAEuOX4Fh/5VSeakuiJJeSH2ezXBia0cZMTkKYz6GOtoojeGigo3tuebVlsn9myqnkMZxiufnnRa7Zne8vg==}
+ '@storybook/addon-links@10.1.0':
+ resolution: {integrity: sha512-05ssgNYu81v0wYtm2TmltBV0jQxyYJ4tYBo5GaSuqfaiU4JTOfW5Xfjm6+QG1TOc6EkB6h/MMhK3f3+/e97Gyw==}
peerDependencies:
- react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta
- storybook: ^9.1.16
+ react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0
+ storybook: ^10.1.0
peerDependenciesMeta:
react:
optional: true
@@ -4219,10 +4304,10 @@ packages:
react-dom:
optional: true
- '@storybook/builder-vite@9.1.16':
- resolution: {integrity: sha512-CyvYA5w1BKeSVaRavKi+euWxLffshq0v9Rz/5E9MKCitbYtjwkDH6UMIYmcbTs906mEBuYqrbz3nygDP0ppodw==}
+ '@storybook/builder-vite@10.1.0':
+ resolution: {integrity: sha512-5vVg8kZozI4Lg2voHdimm34jlEf6MrP9QzXS795dVA/KIR9BCVUzVw+yQBT9jRDWnp6Q4XbzqfILih/TVeh7iA==}
peerDependencies:
- storybook: ^9.1.16
+ storybook: ^10.1.0
vite: ^5.0.0 || ^6.0.0 || ^7.0.0
'@storybook/components@8.6.14':
@@ -4235,16 +4320,29 @@ packages:
peerDependencies:
storybook: ^8.2.0 || ^8.3.0-0 || ^8.4.0-0 || ^8.5.0-0 || ^8.6.0-0
+ '@storybook/csf-plugin@10.1.0':
+ resolution: {integrity: sha512-oApFTBUlHusihoejKmlunprNA2BDpEBmBBx+PcCMzTpUbEiZNI95ZeGrlBuuEepF5dIpAIPAQQD09FibmkQlBQ==}
+ peerDependencies:
+ esbuild: '*'
+ rollup: '*'
+ storybook: ^10.1.0
+ vite: '*'
+ webpack: '*'
+ peerDependenciesMeta:
+ esbuild:
+ optional: true
+ rollup:
+ optional: true
+ vite:
+ optional: true
+ webpack:
+ optional: true
+
'@storybook/csf-plugin@8.6.14':
resolution: {integrity: sha512-dErtc9teAuN+eelN8FojzFE635xlq9cNGGGEu0WEmMUQ4iJ8pingvBO1N8X3scz4Ry7KnxX++NNf3J3gpxS8qQ==}
peerDependencies:
storybook: ^8.6.14
- '@storybook/csf-plugin@9.1.16':
- resolution: {integrity: sha512-GKlNNlmWeFBQxhQY5hZOSnFGbeKq69jal0dYNWoSImTjor28eYRHb9iQkDzRpijLPizBaB9MlxLsLrgFDp7adA==}
- peerDependencies:
- storybook: ^9.1.16
-
'@storybook/global@5.0.0':
resolution: {integrity: sha512-FcOqPAXACP0I3oJ/ws6/rrPT9WGhu915Cg8D02a9YxLo0DE9zI+a9A5gRGvmQ09fiWPukqI8ZAEoQEdWUKMQdQ==}
@@ -4255,6 +4353,12 @@ packages:
react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta
react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta
+ '@storybook/icons@2.0.1':
+ resolution: {integrity: sha512-/smVjw88yK3CKsiuR71vNgWQ9+NuY2L+e8X7IMrFjexjm6ZR8ULrV2DRkTA61aV6ryefslzHEGDInGpnNeIocg==}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0
+ react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0
+
'@storybook/instrumenter@8.6.14':
resolution: {integrity: sha512-iG4MlWCcz1L7Yu8AwgsnfVAmMbvyRSk700Mfy2g4c8y5O+Cv1ejshE1LBBsCwHgkuqU0H4R0qu4g23+6UnUemQ==}
peerDependencies:
@@ -4270,6 +4374,13 @@ packages:
peerDependencies:
storybook: ^8.2.0 || ^8.3.0-0 || ^8.4.0-0 || ^8.5.0-0 || ^8.6.0-0
+ '@storybook/react-dom-shim@10.1.0':
+ resolution: {integrity: sha512-Zb86jWk3ch33lkCmsgqqqsv5q0ePk1wg2wAurM0BMQUAKTLPebdBvwC8esBsti8fp2ZGv0eNbJDGg3qzWYr/Uw==}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0
+ react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0
+ storybook: ^10.1.0
+
'@storybook/react-dom-shim@8.6.14':
resolution: {integrity: sha512-0hixr3dOy3f3M+HBofp3jtMQMS+sqzjKNgl7Arfuj3fvjmyXOks/yGjDImySR4imPtEllvPZfhiQNlejheaInw==}
peerDependencies:
@@ -4277,29 +4388,20 @@ packages:
react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta
storybook: ^8.6.14
- '@storybook/react-dom-shim@9.1.16':
- resolution: {integrity: sha512-MsI4qTxdT6lMXQmo3IXhw3EaCC+vsZboyEZBx4pOJ+K/5cDJ6ZoQ3f0d4yGpVhumDxaxlnNAg954+f8WWXE1rQ==}
- peerDependencies:
- react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta
- react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta
- storybook: ^9.1.16
-
- '@storybook/react-vite@9.1.16':
- resolution: {integrity: sha512-WRKSq0XfQ/Qx66aKisQCfa/1UKwN9HjVbY6xrmsX7kI5zBdITxIcKInq6PWoPv91SJD7+Et956yX+F86R1aEXw==}
- engines: {node: '>=20.0.0'}
+ '@storybook/react-vite@10.1.0':
+ resolution: {integrity: sha512-gFLTU92QQ69saFzQGeIRysQ1G2o3DSWWuG07JRj03493H9USKhvzHo88utKZ2BQP/H93UgcEwy6Ms5psIS3AUA==}
peerDependencies:
- react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta
- react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta
- storybook: ^9.1.16
+ react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0
+ react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0
+ storybook: ^10.1.0
vite: ^5.0.0 || ^6.0.0 || ^7.0.0
- '@storybook/react@9.1.16':
- resolution: {integrity: sha512-M/SkHJJdtiGpodBJq9+DYmSkEOD+VqlPxKI+FvbHESTNs//1IgqFIjEWetd8quhd9oj/gvo4ICBAPu+UmD6M9w==}
- engines: {node: '>=20.0.0'}
+ '@storybook/react@10.1.0':
+ resolution: {integrity: sha512-6Uc3SmUhUlAcNjl8PevnLplZC7HtcE2tz6NEPJWYt3KAb7D11bDZB7BD7jGOU9edE+vRXsTHUUPmaxJpWQ+5nQ==}
peerDependencies:
- react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta
- react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta
- storybook: ^9.1.16
+ react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0
+ react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0
+ storybook: ^10.1.0
typescript: '>= 4.9.x'
peerDependenciesMeta:
typescript:
@@ -4325,18 +4427,16 @@ packages:
peerDependencies:
storybook: ^8.2.0 || ^8.3.0-0 || ^8.4.0-0 || ^8.5.0-0 || ^8.6.0-0
- '@storybook/vue3-vite@9.1.16':
- resolution: {integrity: sha512-ucuqiW4guWXoxRo6DEYmuWWlMixKD1o+NEMwr3viOPO46lM4K7PQHg8HCz8Kg22tCOYCXYdf5KXWexTv7d6ZFQ==}
- engines: {node: '>=20.0.0'}
+ '@storybook/vue3-vite@10.1.0':
+ resolution: {integrity: sha512-RqJNOc+VnEXbFVenF+73tpNtyUTC6AYMR6ugOShL9i4HEhd+YnPFlWSE7Rf7WOhQvjGH3o3JHnIxYbElG8mp6w==}
peerDependencies:
- storybook: ^9.1.16
+ storybook: ^10.1.0
vite: ^5.0.0 || ^6.0.0 || ^7.0.0
- '@storybook/vue3@9.1.16':
- resolution: {integrity: sha512-ScSDbhe5pgs+Q+oi+pHrXAph/MWvok8euW8Vp+j4P7JPf+5iFaCEL2AyXApb0gPa6Txl1mT9NR7J8BlBa7PfbQ==}
- engines: {node: '>=20.0.0'}
+ '@storybook/vue3@10.1.0':
+ resolution: {integrity: sha512-XlPW+AOPbPcIUks1Qx3icUr/hTiLPyLsfA9OgJEQKH2n3A3lUwJ2PYArl//qBbN9p40jR9HBREmPzLUkvt2vuQ==}
peerDependencies:
- storybook: ^9.1.16
+ storybook: ^10.1.0
vue: ^3.0.0
'@stylistic/eslint-plugin@5.5.0':
@@ -4362,14 +4462,14 @@ packages:
cpu: [arm64]
os: [android]
- '@swc/core-darwin-arm64@1.15.2':
- resolution: {integrity: sha512-Ghyz4RJv4zyXzrUC1B2MLQBbppIB5c4jMZJybX2ebdEQAvryEKp3gq1kBksCNsatKGmEgXul88SETU19sMWcrw==}
+ '@swc/core-darwin-arm64@1.15.3':
+ resolution: {integrity: sha512-AXfeQn0CvcQ4cndlIshETx6jrAM45oeUrK8YeEY6oUZU/qzz0Id0CyvlEywxkWVC81Ajpd8TQQ1fW5yx6zQWkQ==}
engines: {node: '>=10'}
cpu: [arm64]
os: [darwin]
- '@swc/core-darwin-x64@1.15.2':
- resolution: {integrity: sha512-7n/PGJOcL2QoptzL42L5xFFfXY5rFxLHnuz1foU+4ruUTG8x2IebGhtwVTpaDN8ShEv2UZObBlT1rrXTba15Zw==}
+ '@swc/core-darwin-x64@1.15.3':
+ resolution: {integrity: sha512-p68OeCz1ui+MZYG4wmfJGvcsAcFYb6Sl25H9TxWl+GkBgmNimIiRdnypK9nBGlqMZAcxngNPtnG3kEMNnvoJ2A==}
engines: {node: '>=10'}
cpu: [x64]
os: [darwin]
@@ -4380,60 +4480,60 @@ packages:
cpu: [x64]
os: [freebsd]
- '@swc/core-linux-arm-gnueabihf@1.15.2':
- resolution: {integrity: sha512-ZUQVCfRJ9wimuxkStRSlLwqX4TEDmv6/J+E6FicGkQ6ssLMWoKDy0cAo93HiWt/TWEee5vFhFaSQYzCuBEGO6A==}
+ '@swc/core-linux-arm-gnueabihf@1.15.3':
+ resolution: {integrity: sha512-Nuj5iF4JteFgwrai97mUX+xUOl+rQRHqTvnvHMATL/l9xE6/TJfPBpd3hk/PVpClMXG3Uvk1MxUFOEzM1JrMYg==}
engines: {node: '>=10'}
cpu: [arm]
os: [linux]
- '@swc/core-linux-arm64-gnu@1.15.2':
- resolution: {integrity: sha512-GZh3pYBmfnpQ+JIg+TqLuz+pM+Mjsk5VOzi8nwKn/m+GvQBsxD5ectRtxuWUxMGNG8h0lMy4SnHRqdK3/iJl7A==}
+ '@swc/core-linux-arm64-gnu@1.15.3':
+ resolution: {integrity: sha512-2Nc/s8jE6mW2EjXWxO/lyQuLKShcmTrym2LRf5Ayp3ICEMX6HwFqB1EzDhwoMa2DcUgmnZIalesq2lG3krrUNw==}
engines: {node: '>=10'}
cpu: [arm64]
os: [linux]
libc: [glibc]
- '@swc/core-linux-arm64-musl@1.15.2':
- resolution: {integrity: sha512-5av6VYZZeneiYIodwzGMlnyVakpuYZryGzFIbgu1XP8wVylZxduEzup4eP8atiMDFmIm+s4wn8GySJmYqeJC0A==}
+ '@swc/core-linux-arm64-musl@1.15.3':
+ resolution: {integrity: sha512-j4SJniZ/qaZ5g8op+p1G9K1z22s/EYGg1UXIb3+Cg4nsxEpF5uSIGEE4mHUfA70L0BR9wKT2QF/zv3vkhfpX4g==}
engines: {node: '>=10'}
cpu: [arm64]
os: [linux]
libc: [musl]
- '@swc/core-linux-x64-gnu@1.15.2':
- resolution: {integrity: sha512-1nO/UfdCLuT/uE/7oB3EZgTeZDCIa6nL72cFEpdegnqpJVNDI6Qb8U4g/4lfVPkmHq2lvxQ0L+n+JdgaZLhrRA==}
+ '@swc/core-linux-x64-gnu@1.15.3':
+ resolution: {integrity: sha512-aKttAZnz8YB1VJwPQZtyU8Uk0BfMP63iDMkvjhJzRZVgySmqt/apWSdnoIcZlUoGheBrcqbMC17GGUmur7OT5A==}
engines: {node: '>=10'}
cpu: [x64]
os: [linux]
libc: [glibc]
- '@swc/core-linux-x64-musl@1.15.2':
- resolution: {integrity: sha512-Ksfrb0Tx310kr+TLiUOvB/I80lyZ3lSOp6cM18zmNRT/92NB4mW8oX2Jo7K4eVEI2JWyaQUAFubDSha2Q+439A==}
+ '@swc/core-linux-x64-musl@1.15.3':
+ resolution: {integrity: sha512-oe8FctPu1gnUsdtGJRO2rvOUIkkIIaHqsO9xxN0bTR7dFTlPTGi2Fhk1tnvXeyAvCPxLIcwD8phzKg6wLv9yug==}
engines: {node: '>=10'}
cpu: [x64]
os: [linux]
libc: [musl]
- '@swc/core-win32-arm64-msvc@1.15.2':
- resolution: {integrity: sha512-IzUb5RlMUY0r1A9IuJrQ7Tbts1wWb73/zXVXT8VhewbHGoNlBKE0qUhKMED6Tv4wDF+pmbtUJmKXDthytAvLmg==}
+ '@swc/core-win32-arm64-msvc@1.15.3':
+ resolution: {integrity: sha512-L9AjzP2ZQ/Xh58e0lTRMLvEDrcJpR7GwZqAtIeNLcTK7JVE+QineSyHp0kLkO1rttCHyCy0U74kDTj0dRz6raA==}
engines: {node: '>=10'}
cpu: [arm64]
os: [win32]
- '@swc/core-win32-ia32-msvc@1.15.2':
- resolution: {integrity: sha512-kCATEzuY2LP9AlbU2uScjcVhgnCAkRdu62vbce17Ro5kxEHxYWcugkveyBRS3AqZGtwAKYbMAuNloer9LS/hpw==}
+ '@swc/core-win32-ia32-msvc@1.15.3':
+ resolution: {integrity: sha512-B8UtogMzErUPDWUoKONSVBdsgKYd58rRyv2sHJWKOIMCHfZ22FVXICR4O/VwIYtlnZ7ahERcjayBHDlBZpR0aw==}
engines: {node: '>=10'}
cpu: [ia32]
os: [win32]
- '@swc/core-win32-x64-msvc@1.15.2':
- resolution: {integrity: sha512-iJaHeYCF4jTn7OEKSa3KRiuVFIVYts8jYjNmCdyz1u5g8HRyTDISD76r8+ljEOgm36oviRQvcXaw6LFp1m0yyA==}
+ '@swc/core-win32-x64-msvc@1.15.3':
+ resolution: {integrity: sha512-SpZKMR9QBTecHeqpzJdYEfgw30Oo8b/Xl6rjSzBt1g0ZsXyy60KLXrp6IagQyfTYqNYE/caDvwtF2FPn7pomog==}
engines: {node: '>=10'}
cpu: [x64]
os: [win32]
- '@swc/core@1.15.2':
- resolution: {integrity: sha512-OQm+yJdXxvSjqGeaWhP6Ia264ogifwAO7Q12uTDVYj/Ks4jBTI4JknlcjDRAXtRhqbWsfbZyK/5RtuIPyptk3w==}
+ '@swc/core@1.15.3':
+ resolution: {integrity: sha512-Qd8eBPkUFL4eAONgGjycZXj1jFCBW8Fd+xF0PzdTlBCWQIV1xnUT7B93wUANtW3KGjl3TRcOyxwSx/u/jyKw/Q==}
engines: {node: '>=10'}
peerDependencies:
'@swc/helpers': '>=0.5.17'
@@ -4575,8 +4675,8 @@ packages:
'@types/accepts@1.3.7':
resolution: {integrity: sha512-Pay9fq2lM2wXPWbteBsRAGiWH2hig4ZE2asK+mm7kUzlxRTfL961rj89I6zV/E3PcIkDqyuBEcMxFT7rccugeQ==}
- '@types/archiver@6.0.4':
- resolution: {integrity: sha512-ULdQpARQ3sz9WH4nb98mJDYA0ft2A8C4f4fovvUcFwINa1cgGjY36JCAYuP5YypRq4mco1lJp1/7jEMS2oR0Hg==}
+ '@types/archiver@7.0.0':
+ resolution: {integrity: sha512-/3vwGwx9n+mCQdYZ2IKGGHEFL30I96UgBlk8EtRDDFQ9uxM1l4O5Ci6r00EMAkiDaTqD9DQ6nVrWRICnBPtzzg==}
'@types/argparse@1.0.38':
resolution: {integrity: sha512-ebDJ9b0e702Yr7pWgB0jzm+CX4Srzz8RcXtLJDJB+BSccqMa36uyH/zUsSYao5+BD1ytv3k3rPYCq4mAE1hsXA==}
@@ -4596,9 +4696,6 @@ packages:
'@types/babel__traverse@7.28.0':
resolution: {integrity: sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==}
- '@types/bcryptjs@2.4.6':
- resolution: {integrity: sha512-9xlo6R2qDs5uixm0bcIqCeMCE6HiQsIyel9KQySStiyqNl2tnj2mP3DX1Nf56MD6KMenNNlBBsy3LJ7gUEQPXQ==}
-
'@types/body-parser@1.19.6':
resolution: {integrity: sha512-HLFeCYgz89uk22N5Qg3dvGvsv46B8GLvKKo1zKG4NybA8U2DiEO3w9lqGg29t/tfLRJpJ6iQxnVw4OnB7MoM9g==}
@@ -4656,8 +4753,8 @@ packages:
'@types/express-serve-static-core@5.1.0':
resolution: {integrity: sha512-jnHMsrd0Mwa9Cf4IdOzbz543y4XJepXrbia2T4b6+spXC2We3t1y6K44D3mR8XMFSXMCf3/l7rCgddfx7UNVBA==}
- '@types/express@5.0.5':
- resolution: {integrity: sha512-LuIQOcb6UmnF7C1PCFmEU1u2hmiHL43fgFQX67sN3H4Z+0Yk0Neo++mFsBjhOAuLzvlQeqAAkeDOZrJs9rzumQ==}
+ '@types/express@5.0.4':
+ resolution: {integrity: sha512-g64dbryHk7loCIrsa0R3shBnEu5p6LPJ09bu9NG58+jz+cRUjFrc3Bz0kNQ7j9bXeCsrRDvNET1G54P/GJkAyA==}
'@types/fluent-ffmpeg@2.1.28':
resolution: {integrity: sha512-5ovxsDwBcPfJ+eYs1I/ZpcYCnkce7pvH9AHSvrZllAp1ZPpTRDZAFjF3TRFbukxSgIYTTNYePbS0rKUmaxVbXw==}
@@ -4671,9 +4768,6 @@ packages:
'@types/hast@3.0.4':
resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==}
- '@types/htmlescape@1.1.3':
- resolution: {integrity: sha512-tuC81YJXGUe0q8WRtBNW+uyx79rkkzWK651ALIXXYq5/u/IxjX4iHneGF2uUqzsNp+F+9J2mFZOv9jiLTtIq0w==}
-
'@types/http-cache-semantics@4.0.4':
resolution: {integrity: sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==}
@@ -4698,9 +4792,6 @@ packages:
'@types/js-yaml@4.0.9':
resolution: {integrity: sha512-k4MGaQl5TGo/iipqb2UDG2UwjXziSWkh0uysQelTlJpX1qGlpUZYm8PnO4DxG1qBomtJUdYJ6qR6xdIah10JLg==}
- '@types/jsdom@21.1.7':
- resolution: {integrity: sha512-yOriVnggzrnQ3a9OKOCxaVuSug3w3/SbOj5i7VwXWZEyUNl3bLF9V3MfxGbZKuwqJOQyRfqXyROBB1CoZLFWzA==}
-
'@types/json-schema@7.0.15':
resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==}
@@ -4731,8 +4822,8 @@ packages:
'@types/micromatch@4.0.10':
resolution: {integrity: sha512-5jOhFDElqr4DKTrTEbnW8DZ4Hz5LRUEmyrGpCMrD/NphYv3nUnaF08xmSLx1rGGnyEs/kFnhiw6dCgcDqMr5PQ==}
- '@types/mime-types@2.1.4':
- resolution: {integrity: sha512-lfU4b34HOri+kAY5UheuFMWPDOI+OPceBSHZKp69gEyTL/mmJ4cnU6Y/rlme3UL3GyOn6Y42hyIEw0/q8sWx5w==}
+ '@types/mime-types@3.0.1':
+ resolution: {integrity: sha512-xRMsfuQbnRq1Ef+C+RKaENOxXX87Ygl38W1vDfPHRku02TgQr+Qd8iivLtAMcR0KF5/29xlnFihkTlbqFrGOVQ==}
'@types/mime@1.3.5':
resolution: {integrity: sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==}
@@ -4740,8 +4831,8 @@ packages:
'@types/minimist@1.2.5':
resolution: {integrity: sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==}
- '@types/ms@0.7.34':
- resolution: {integrity: sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==}
+ '@types/ms@2.1.0':
+ resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==}
'@types/mysql@2.15.27':
resolution: {integrity: sha512-YfWiV16IY0OeBfBCk8+hXKmdTKrKlwKN1MNKAPBu5JYxLwBEZl7QzeEpGnlZb3VMGJrrGmB84gXiH+ofs/TezA==}
@@ -4755,8 +4846,8 @@ packages:
'@types/node@24.10.1':
resolution: {integrity: sha512-GNWcUTRBgIRJD5zj+Tq0fKOJ5XZajIiBroOF0yvj2bSU1WvNdYS/dn9UxwsujGW4JX06dnHyjV2y9rRaybH0iQ==}
- '@types/nodemailer@6.4.21':
- resolution: {integrity: sha512-Eix+sb/Nj28MNnWvO2X1OLrk5vuD4C9SMnb2Vf4itWnxphYeSceqkFX7IdmxTzn+dvmnNz7paMbg4Uc60wSfJg==}
+ '@types/nodemailer@7.0.4':
+ resolution: {integrity: sha512-ee8fxWqOchH+Hv6MDDNNy028kwvVnLplrStm4Zf/3uHWw5zzo8FoYYeffpJtGs2wWysEumMH0ZIdMGMY1eMAow==}
'@types/normalize-package-data@2.4.4':
resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==}
@@ -4779,15 +4870,9 @@ packages:
'@types/pg-pool@2.0.6':
resolution: {integrity: sha512-TaAUE5rq2VQYxab5Ts7WZhKNmuN78Q6PiFonTDdpbx8a1H0M1vhy3rhiMjl+e2iHmogyMw7jZF4FrE6eJUy5HQ==}
- '@types/pg@8.15.5':
- resolution: {integrity: sha512-LF7lF6zWEKxuT3/OR8wAZGzkg4ENGXFNyiV/JeOt9z5B+0ZVwbql9McqX5c/WStFq1GaGso7H1AzP/qSzmlCKQ==}
-
'@types/pg@8.15.6':
resolution: {integrity: sha512-NoaMtzhxOrubeL/7UZuNTrejB4MPAJ0RpxZqXQf2qXuVlTPuG6Y8p4u9dKRaue4yjmC7ZhzVO2/Yyyn25znrPQ==}
- '@types/pug@2.0.10':
- resolution: {integrity: sha512-Sk/uYFOBAB7mb74XcpizmH0KOR2Pv3D2Hmrh1Dmy5BmK3MpdSa5kqZcg6EKBdklU0bFXX9gCfzvpnyUehrPIuA==}
-
'@types/punycode@2.1.4':
resolution: {integrity: sha512-trzh6NzBnq8yw5e35f8xe8VTYjqM3NE7bohBtvDVf/dtUer3zYTLK1Ka3DG3p7bdtoaOHZucma6FfVKlQ134pQ==}
@@ -4845,21 +4930,18 @@ packages:
'@types/serviceworker@0.0.74':
resolution: {integrity: sha512-HNt7NJHrjGtCmI3h1+rsb1g/ZY0iy5KaeenfEV7zAWPSaCs49hEUvgH++V1BHNwlLfB3sbjPh3pSiNixfYjb1w==}
- '@types/shimmer@1.2.0':
- resolution: {integrity: sha512-UE7oxhQLLd9gub6JKIAhDq06T0F6FnztwMNRvYgjeQSBeMc1ZG/tA47EwfduvkuQS8apbkM/lpLpWsaCeYsXVg==}
-
'@types/simple-oauth2@5.0.7':
resolution: {integrity: sha512-8JbWVJbiTSBQP/7eiyGKyXWAqp3dKQZpaA+pdW16FCi32ujkzRMG8JfjoAzdWt6W8U591ZNdHcPtP2D7ILTKuA==}
'@types/sinon@17.0.4':
resolution: {integrity: sha512-RHnIrhfPO3+tJT0s7cFaXGZvsL4bbR3/k7z3P312qMS4JaS2Tk+KiwiLx1S0rQ56ERj00u1/BtdyVd0FY+Pdew==}
+ '@types/sinonjs__fake-timers@15.0.1':
+ resolution: {integrity: sha512-Ko2tjWJq8oozHzHV+reuvS5KYIRAokHnGbDwGh/J64LntgpbuylF74ipEL24HCyRjf9FOlBiBHWBR1RlVKsI1w==}
+
'@types/sinonjs__fake-timers@8.1.1':
resolution: {integrity: sha512-0kSuKjAS0TrGLJ0M/+8MaFkGsQhZpB6pxOmvS3K8FYI72K//YmdfoW9X2qPsAKh1mkwxGD5zib9s1FIFed6E8g==}
- '@types/sinonjs__fake-timers@8.1.5':
- resolution: {integrity: sha512-mQkU2jY8jJEF7YHjHvsQO8+3ughTL1mcnn96igfhONmR+fUPSKIkefQYpSe8bsly2Ep7oQbn/6VG5/9/0qcArQ==}
-
'@types/sizzle@2.3.10':
resolution: {integrity: sha512-TC0dmN0K8YcWEAEfiPi5gJP14eJe30TTGjkvek3iM/1NdHHsdCA/Td6GvNndMOo/iSnIsZ4HuuhrYPDAmbxzww==}
@@ -4887,9 +4969,6 @@ packages:
'@types/tmp@0.2.6':
resolution: {integrity: sha512-chhaNf2oKHlRkDGt+tiKE2Z5aJ6qalm7Z9rlLdBwmOiAAf09YQvvoLXjWK4HWPF1xU/fqvMgfNfpVoBscA/tKA==}
- '@types/tough-cookie@4.0.5':
- resolution: {integrity: sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==}
-
'@types/unist@3.0.3':
resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==}
@@ -4914,8 +4993,8 @@ packages:
'@types/yargs-parser@21.0.3':
resolution: {integrity: sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==}
- '@types/yargs@17.0.35':
- resolution: {integrity: sha512-qUHkeCyQFxMXg79wQfTtfndEC+N9ZZg76HJftDJp+qH2tV7Gj4OJi7l+PiWwJ+pWtW8GwSmqsDj/oymhrTWXjg==}
+ '@types/yargs@17.0.34':
+ resolution: {integrity: sha512-KExbHVa92aJpw9WDQvzBaGVE2/Pz+pLZQloT2hjL8IqsZnV62rlPOYvNnLmf/L2dyllfVUOVBj64M0z/46eR2A==}
'@types/yauzl@2.10.3':
resolution: {integrity: sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==}
@@ -4928,6 +5007,14 @@ packages:
eslint: ^8.57.0 || ^9.0.0
typescript: '>=4.8.4 <6.0.0'
+ '@typescript-eslint/eslint-plugin@8.48.0':
+ resolution: {integrity: sha512-XxXP5tL1txl13YFtrECECQYeZjBZad4fyd3cFV4a19LkAY/bIp9fev3US4S5fDVV2JaYFiKAZ/GRTOLer+mbyQ==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+ peerDependencies:
+ '@typescript-eslint/parser': ^8.48.0
+ eslint: ^8.57.0 || ^9.0.0
+ typescript: '>=4.8.4 <6.0.0'
+
'@typescript-eslint/parser@8.47.0':
resolution: {integrity: sha512-lJi3PfxVmo0AkEY93ecfN+r8SofEqZNGByvHAI3GBLrvt1Cw6H5k1IM02nSzu0RfUafr2EvFSw0wAsZgubNplQ==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
@@ -4935,22 +5022,45 @@ packages:
eslint: ^8.57.0 || ^9.0.0
typescript: '>=4.8.4 <6.0.0'
+ '@typescript-eslint/parser@8.48.0':
+ resolution: {integrity: sha512-jCzKdm/QK0Kg4V4IK/oMlRZlY+QOcdjv89U2NgKHZk1CYTj82/RVSx1mV/0gqCVMJ/DA+Zf/S4NBWNF8GQ+eqQ==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+ peerDependencies:
+ eslint: ^8.57.0 || ^9.0.0
+ typescript: '>=4.8.4 <6.0.0'
+
'@typescript-eslint/project-service@8.47.0':
resolution: {integrity: sha512-2X4BX8hUeB5JcA1TQJ7GjcgulXQ+5UkNb0DL8gHsHUHdFoiCTJoYLTpib3LtSDPZsRET5ygN4qqIWrHyYIKERA==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies:
typescript: '>=4.8.4 <6.0.0'
+ '@typescript-eslint/project-service@8.48.0':
+ resolution: {integrity: sha512-Ne4CTZyRh1BecBf84siv42wv5vQvVmgtk8AuiEffKTUo3DrBaGYZueJSxxBZ8fjk/N3DrgChH4TOdIOwOwiqqw==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+ peerDependencies:
+ typescript: '>=4.8.4 <6.0.0'
+
'@typescript-eslint/scope-manager@8.47.0':
resolution: {integrity: sha512-a0TTJk4HXMkfpFkL9/WaGTNuv7JWfFTQFJd6zS9dVAjKsojmv9HT55xzbEpnZoY+VUb+YXLMp+ihMLz/UlZfDg==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+ '@typescript-eslint/scope-manager@8.48.0':
+ resolution: {integrity: sha512-uGSSsbrtJrLduti0Q1Q9+BF1/iFKaxGoQwjWOIVNJv0o6omrdyR8ct37m4xIl5Zzpkp69Kkmvom7QFTtue89YQ==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
'@typescript-eslint/tsconfig-utils@8.47.0':
resolution: {integrity: sha512-ybUAvjy4ZCL11uryalkKxuT3w3sXJAuWhOoGS3T/Wu+iUu1tGJmk5ytSY8gbdACNARmcYEB0COksD2j6hfGK2g==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies:
typescript: '>=4.8.4 <6.0.0'
+ '@typescript-eslint/tsconfig-utils@8.48.0':
+ resolution: {integrity: sha512-WNebjBdFdyu10sR1M4OXTt2OkMd5KWIL+LLfeH9KhgP+jzfDV/LI3eXzwJ1s9+Yc0Kzo2fQCdY/OpdusCMmh6w==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+ peerDependencies:
+ typescript: '>=4.8.4 <6.0.0'
+
'@typescript-eslint/type-utils@8.47.0':
resolution: {integrity: sha512-QC9RiCmZ2HmIdCEvhd1aJELBlD93ErziOXXlHEZyuBo3tBiAZieya0HLIxp+DoDWlsQqDawyKuNEhORyku+P8A==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
@@ -4958,16 +5068,33 @@ packages:
eslint: ^8.57.0 || ^9.0.0
typescript: '>=4.8.4 <6.0.0'
+ '@typescript-eslint/type-utils@8.48.0':
+ resolution: {integrity: sha512-zbeVaVqeXhhab6QNEKfK96Xyc7UQuoFWERhEnj3mLVnUWrQnv15cJNseUni7f3g557gm0e46LZ6IJ4NJVOgOpw==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+ peerDependencies:
+ eslint: ^8.57.0 || ^9.0.0
+ typescript: '>=4.8.4 <6.0.0'
+
'@typescript-eslint/types@8.47.0':
resolution: {integrity: sha512-nHAE6bMKsizhA2uuYZbEbmp5z2UpffNrPEqiKIeN7VsV6UY/roxanWfoRrf6x/k9+Obf+GQdkm0nPU+vnMXo9A==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+ '@typescript-eslint/types@8.48.0':
+ resolution: {integrity: sha512-cQMcGQQH7kwKoVswD1xdOytxQR60MWKM1di26xSUtxehaDs/32Zpqsu5WJlXTtTTqyAVK8R7hvsUnIXRS+bjvA==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
'@typescript-eslint/typescript-estree@8.47.0':
resolution: {integrity: sha512-k6ti9UepJf5NpzCjH31hQNLHQWupTRPhZ+KFF8WtTuTpy7uHPfeg2NM7cP27aCGajoEplxJDFVCEm9TGPYyiVg==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies:
typescript: '>=4.8.4 <6.0.0'
+ '@typescript-eslint/typescript-estree@8.48.0':
+ resolution: {integrity: sha512-ljHab1CSO4rGrQIAyizUS6UGHHCiAYhbfcIZ1zVJr5nMryxlXMVWS3duFPSKvSUbFPwkXMFk1k0EMIjub4sRRQ==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+ peerDependencies:
+ typescript: '>=4.8.4 <6.0.0'
+
'@typescript-eslint/utils@8.47.0':
resolution: {integrity: sha512-g7XrNf25iL4TJOiPqatNuaChyqt49a/onq5YsJ9+hXeugK+41LVg7AxikMfM02PC6jbNtZLCJj6AUcQXJS/jGQ==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
@@ -4975,10 +5102,21 @@ packages:
eslint: ^8.57.0 || ^9.0.0
typescript: '>=4.8.4 <6.0.0'
+ '@typescript-eslint/utils@8.48.0':
+ resolution: {integrity: sha512-yTJO1XuGxCsSfIVt1+1UrLHtue8xz16V8apzPYI06W0HbEbEWHxHXgZaAgavIkoh+GeV6hKKd5jm0sS6OYxWXQ==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+ peerDependencies:
+ eslint: ^8.57.0 || ^9.0.0
+ typescript: '>=4.8.4 <6.0.0'
+
'@typescript-eslint/visitor-keys@8.47.0':
resolution: {integrity: sha512-SIV3/6eftCy1bNzCQoPmbWsRLujS8t5iDIZ4spZOBHqrM+yfX2ogg8Tt3PDTAVKw3sSCiUgg30uOAvK2r9zGjQ==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+ '@typescript-eslint/visitor-keys@8.48.0':
+ resolution: {integrity: sha512-T0XJMaRPOH3+LBbAfzR2jalckP1MSG/L9eUtY0DEzUyVaXJ/t6zN0nR7co5kz0Jko/nkSYCBRkz1djvjajVTTg==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
'@ungap/structured-clone@1.3.0':
resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==}
@@ -4989,20 +5127,20 @@ packages:
vite: ^5.0.0 || ^6.0.0 || ^7.0.0
vue: ^3.2.25
- '@vitest/coverage-v8@3.2.4':
- resolution: {integrity: sha512-EyF9SXU6kS5Ku/U82E259WSnvg6c8KTjppUncuNdm5QHpe17mwREHnjDzozC8x9MZ0xfBUFSaLkRv4TMA75ALQ==}
+ '@vitest/coverage-v8@4.0.13':
+ resolution: {integrity: sha512-w77N6bmtJ3CFnL/YHiYotwW/JI3oDlR3K38WEIqegRfdMSScaYxwYKB/0jSNpOTZzUjQkG8HHEz4sdWQMWpQ5g==}
peerDependencies:
- '@vitest/browser': 3.2.4
- vitest: 3.2.4
+ '@vitest/browser': 4.0.13
+ vitest: 4.0.13
peerDependenciesMeta:
'@vitest/browser':
optional: true
- '@vitest/coverage-v8@4.0.10':
- resolution: {integrity: sha512-g+brmtoKa/sAeIohNJnnWhnHtU6GuqqVOSQ4SxDIPcgZWZyhJs5RmF5LpqXs8Kq64lANP+vnbn5JLzhLj/G56g==}
+ '@vitest/coverage-v8@4.0.14':
+ resolution: {integrity: sha512-EYHLqN/BY6b47qHH7gtMxAg++saoGmsjWmAq9MlXxAz4M0NcHh9iOyKhBZyU4yxZqOd8Xnqp80/5saeitz4Cng==}
peerDependencies:
- '@vitest/browser': 4.0.10
- vitest: 4.0.10
+ '@vitest/browser': 4.0.14
+ vitest: 4.0.14
peerDependenciesMeta:
'@vitest/browser':
optional: true
@@ -5013,8 +5151,11 @@ packages:
'@vitest/expect@3.2.4':
resolution: {integrity: sha512-Io0yyORnB6sikFlt8QW5K7slY4OjqNX9jmJQ02QDda8lyM6B5oNgVWoSoKPac8/kgnCUzuHQKrSLtu/uOqqrig==}
- '@vitest/expect@4.0.10':
- resolution: {integrity: sha512-3QkTX/lK39FBNwARCQRSQr0TP9+ywSdxSX+LgbJ2M1WmveXP72anTbnp2yl5fH+dU6SUmBzNMrDHs80G8G2DZg==}
+ '@vitest/expect@4.0.13':
+ resolution: {integrity: sha512-zYtcnNIBm6yS7Gpr7nFTmq8ncowlMdOJkWLqYvhr/zweY6tFbDkDi8BPPOeHxEtK1rSI69H7Fd4+1sqvEGli6w==}
+
+ '@vitest/expect@4.0.14':
+ resolution: {integrity: sha512-RHk63V3zvRiYOWAV0rGEBRO820ce17hz7cI2kDmEdfQsBjT2luEKB5tCOc91u1oSQoUOZkSv3ZyzkdkSLD7lKw==}
'@vitest/mocker@3.2.4':
resolution: {integrity: sha512-46ryTE9RZO/rfDd7pEqFl7etuyzekzEhUbTW3BvmeO/BcCMEgq59BKhek3dXDWgAj4oMK6OZi+vRr1wPW6qjEQ==}
@@ -5027,8 +5168,19 @@ packages:
vite:
optional: true
- '@vitest/mocker@4.0.10':
- resolution: {integrity: sha512-e2OfdexYkjkg8Hh3L9NVEfbwGXq5IZbDovkf30qW2tOh7Rh9sVtmSr2ztEXOFbymNxS4qjzLXUQIvATvN4B+lg==}
+ '@vitest/mocker@4.0.13':
+ resolution: {integrity: sha512-eNCwzrI5djoauklwP1fuslHBjrbR8rqIVbvNlAnkq1OTa6XT+lX68mrtPirNM9TnR69XUPt4puBCx2Wexseylg==}
+ peerDependencies:
+ msw: ^2.4.9
+ vite: ^6.0.0 || ^7.0.0-0
+ peerDependenciesMeta:
+ msw:
+ optional: true
+ vite:
+ optional: true
+
+ '@vitest/mocker@4.0.14':
+ resolution: {integrity: sha512-RzS5NujlCzeRPF1MK7MXLiEFpkIXeMdQ+rN3Kk3tDI9j0mtbr7Nmuq67tpkOJQpgyClbOltCXMjLZicJHsH5Cg==}
peerDependencies:
msw: ^2.4.9
vite: ^6.0.0 || ^7.0.0-0
@@ -5047,20 +5199,23 @@ packages:
'@vitest/pretty-format@3.2.4':
resolution: {integrity: sha512-IVNZik8IVRJRTr9fxlitMKeJeXFFFN0JaB9PHPGQ8NKQbGpfjlTx9zO4RefN8gp7eqjNy8nyK3NZmBzOPeIxtA==}
- '@vitest/pretty-format@4.0.10':
- resolution: {integrity: sha512-99EQbpa/zuDnvVjthwz5bH9o8iPefoQZ63WV8+bsRJZNw3qQSvSltfut8yu1Jc9mqOYi7pEbsKxYTi/rjaq6PA==}
+ '@vitest/pretty-format@4.0.13':
+ resolution: {integrity: sha512-ooqfze8URWbI2ozOeLDMh8YZxWDpGXoeY3VOgcDnsUxN0jPyPWSUvjPQWqDGCBks+opWlN1E4oP1UYl3C/2EQA==}
+
+ '@vitest/pretty-format@4.0.14':
+ resolution: {integrity: sha512-SOYPgujB6TITcJxgd3wmsLl+wZv+fy3av2PpiPpsWPZ6J1ySUYfScfpIt2Yv56ShJXR2MOA6q2KjKHN4EpdyRQ==}
- '@vitest/runner@3.2.4':
- resolution: {integrity: sha512-oukfKT9Mk41LreEW09vt45f8wx7DordoWUZMYdY/cyAk7w5TWkTRCNZYF7sX7n2wB7jyGAl74OxgwhPgKaqDMQ==}
+ '@vitest/runner@4.0.13':
+ resolution: {integrity: sha512-9IKlAru58wcVaWy7hz6qWPb2QzJTKt+IOVKjAx5vb5rzEFPTL6H4/R9BMvjZ2ppkxKgTrFONEJFtzvnyEpiT+A==}
- '@vitest/runner@4.0.10':
- resolution: {integrity: sha512-EXU2iSkKvNwtlL8L8doCpkyclw0mc/t4t9SeOnfOFPyqLmQwuceMPA4zJBa6jw0MKsZYbw7kAn+gl7HxrlB8UQ==}
+ '@vitest/runner@4.0.14':
+ resolution: {integrity: sha512-BsAIk3FAqxICqREbX8SetIteT8PiaUL/tgJjmhxJhCsigmzzH8xeadtp7LRnTpCVzvf0ib9BgAfKJHuhNllKLw==}
- '@vitest/snapshot@3.2.4':
- resolution: {integrity: sha512-dEYtS7qQP2CjU27QBC5oUOxLE/v5eLkGqPE0ZKEIDGMs4vKWe7IjgLOeauHsR0D5YuuycGRO5oSRXnwnmA78fQ==}
+ '@vitest/snapshot@4.0.13':
+ resolution: {integrity: sha512-hb7Usvyika1huG6G6l191qu1urNPsq1iFc2hmdzQY3F5/rTgqQnwwplyf8zoYHkpt7H6rw5UfIw6i/3qf9oSxQ==}
- '@vitest/snapshot@4.0.10':
- resolution: {integrity: sha512-2N4X2ZZl7kZw0qeGdQ41H0KND96L3qX1RgwuCfy6oUsF2ISGD/HpSbmms+CkIOsQmg2kulwfhJ4CI0asnZlvkg==}
+ '@vitest/snapshot@4.0.14':
+ resolution: {integrity: sha512-aQVBfT1PMzDSA16Y3Fp45a0q8nKexx6N5Amw3MX55BeTeZpoC08fGqEZqVmPcqN0ueZsuUQ9rriPMhZ3Mu19Ag==}
'@vitest/spy@2.0.5':
resolution: {integrity: sha512-c/jdthAhvJdpfVuaexSrnawxZz6pywlTPe84LUB2m/4t3rl2fTo9NFGBG4oWgaD+FTgDDV8hJ/nibT7IfH3JfA==}
@@ -5068,8 +5223,11 @@ packages:
'@vitest/spy@3.2.4':
resolution: {integrity: sha512-vAfasCOe6AIK70iP5UD11Ac4siNUNJ9i/9PZ3NKx07sG6sUxeag1LWdNrMWeKKYBLlzuK+Gn65Yd5nyL6ds+nw==}
- '@vitest/spy@4.0.10':
- resolution: {integrity: sha512-AsY6sVS8OLb96GV5RoG8B6I35GAbNrC49AO+jNRF9YVGb/g9t+hzNm1H6kD0NDp8tt7VJLs6hb7YMkDXqu03iw==}
+ '@vitest/spy@4.0.13':
+ resolution: {integrity: sha512-hSu+m4se0lDV5yVIcNWqjuncrmBgwaXa2utFLIrBkQCQkt+pSwyZTPFQAZiiF/63j8jYa8uAeUZ3RSfcdWaYWw==}
+
+ '@vitest/spy@4.0.14':
+ resolution: {integrity: sha512-JmAZT1UtZooO0tpY3GRyiC/8W7dCs05UOq9rfsUUgEZEdq+DuHLmWhPsrTt0TiW7WYeL/hXpaE07AZ2RCk44hg==}
'@vitest/utils@2.0.5':
resolution: {integrity: sha512-d8HKbqIcya+GR67mkZbrzhS5kKhtp8dQLcmRZLGTscGVg7yImT82cIrhtn2L8+VujWcy6KZweApgNmPsTAO/UQ==}
@@ -5080,8 +5238,11 @@ packages:
'@vitest/utils@3.2.4':
resolution: {integrity: sha512-fB2V0JFrQSMsCo9HiSq3Ezpdv4iYaXRG1Sx8edX3MwxfyNn83mKiGzOcH+Fkxt4MHxr3y42fQi1oeAInqgX2QA==}
- '@vitest/utils@4.0.10':
- resolution: {integrity: sha512-kOuqWnEwZNtQxMKg3WmPK1vmhZu9WcoX69iwWjVz+jvKTsF1emzsv3eoPcDr6ykA3qP2bsCQE7CwqfNtAVzsmg==}
+ '@vitest/utils@4.0.13':
+ resolution: {integrity: sha512-ydozWyQ4LZuu8rLp47xFUWis5VOKMdHjXCWhs1LuJsTNKww+pTHQNK4e0assIB9K80TxFyskENL6vCu3j34EYA==}
+
+ '@vitest/utils@4.0.14':
+ resolution: {integrity: sha512-hLqXZKAWNg8pI+SQXyXxWCTOpA3MvsqcbVeNgSi8x/CSN2wi26dSzn1wrOhmCmFjEvN9p8/kLFRHa6PI8jHazw==}
'@volar/language-core@2.4.15':
resolution: {integrity: sha512-3VHw+QZU0ZG9IuQmzT68IyN4hZNd9GchGPhbD9+pa8CVv7rnoOZwo7T8weIbrRmihqy3ATpdfXFnqRrfPVK6CA==}
@@ -5104,14 +5265,20 @@ packages:
'@vue/compiler-core@3.5.24':
resolution: {integrity: sha512-eDl5H57AOpNakGNAkFDH+y7kTqrQpJkZFXhWZQGyx/5Wh7B1uQYvcWkvZi11BDhscPgj8N7XV3oRwiPnx1Vrig==}
+ '@vue/compiler-core@3.5.25':
+ resolution: {integrity: sha512-vay5/oQJdsNHmliWoZfHPoVZZRmnSWhug0BYT34njkYTPqClh3DNWLkZNJBVSjsNMrg0CCrBfoKkjZQPM/QVUw==}
+
'@vue/compiler-dom@3.5.24':
resolution: {integrity: sha512-1QHGAvs53gXkWdd3ZMGYuvQFXHW4ksKWPG8HP8/2BscrbZ0brw183q2oNWjMrSWImYLHxHrx1ItBQr50I/q2zw==}
- '@vue/compiler-sfc@3.5.24':
- resolution: {integrity: sha512-8EG5YPRgmTB+YxYBM3VXy8zHD9SWHUJLIGPhDovo3Z8VOgvP+O7UP5vl0J4BBPWYD9vxtBabzW1EuEZ+Cqs14g==}
+ '@vue/compiler-dom@3.5.25':
+ resolution: {integrity: sha512-4We0OAcMZsKgYoGlMjzYvaoErltdFI2/25wqanuTu+S4gismOTRTBPi4IASOjxWdzIwrYSjnqONfKvuqkXzE2Q==}
- '@vue/compiler-ssr@3.5.24':
- resolution: {integrity: sha512-trOvMWNBMQ/odMRHW7Ae1CdfYx+7MuiQu62Jtu36gMLXcaoqKvAyh+P73sYG9ll+6jLB6QPovqoKGGZROzkFFg==}
+ '@vue/compiler-sfc@3.5.25':
+ resolution: {integrity: sha512-PUgKp2rn8fFsI++lF2sO7gwO2d9Yj57Utr5yEsDf3GNaQcowCLKL7sf+LvVFvtJDXUp/03+dC6f2+LCv5aK1ag==}
+
+ '@vue/compiler-ssr@3.5.25':
+ resolution: {integrity: sha512-ritPSKLBcParnsKYi+GNtbdbrIE1mtuFEJ4U1sWeuOMlIziK5GtOL85t5RhsNy4uWIXPgk+OUdpnXiTdzn8o3A==}
'@vue/compiler-vue2@2.7.16':
resolution: {integrity: sha512-qYC3Psj9S/mfu9uVi5WvNZIzq+xnXMhOwbTFKKDD7b1lhpnn71jXSFdTQ+WsIEk0ONCd7VV2IMm7ONl6tbQ86A==}
@@ -5124,31 +5291,34 @@ packages:
typescript:
optional: true
- '@vue/language-core@3.1.4':
- resolution: {integrity: sha512-n/58wm8SkmoxMWkUNUH/PwoovWe4hmdyPJU2ouldr3EPi1MLoS7iDN46je8CsP95SnVBs2axInzRglPNKvqMcg==}
+ '@vue/language-core@3.1.5':
+ resolution: {integrity: sha512-FMcqyzWN+sYBeqRMWPGT2QY0mUasZMVIuHvmb5NT3eeqPrbHBYtCP8JWEUCDCgM+Zr62uuWY/qoeBrPrzfa78w==}
peerDependencies:
typescript: '*'
peerDependenciesMeta:
typescript:
optional: true
- '@vue/reactivity@3.5.24':
- resolution: {integrity: sha512-BM8kBhtlkkbnyl4q+HiF5R5BL0ycDPfihowulm02q3WYp2vxgPcJuZO866qa/0u3idbMntKEtVNuAUp5bw4teg==}
+ '@vue/reactivity@3.5.25':
+ resolution: {integrity: sha512-5xfAypCQepv4Jog1U4zn8cZIcbKKFka3AgWHEFQeK65OW+Ys4XybP6z2kKgws4YB43KGpqp5D/K3go2UPPunLA==}
- '@vue/runtime-core@3.5.24':
- resolution: {integrity: sha512-RYP/byyKDgNIqfX/gNb2PB55dJmM97jc9wyF3jK7QUInYKypK2exmZMNwnjueWwGceEkP6NChd3D2ZVEp9undQ==}
+ '@vue/runtime-core@3.5.25':
+ resolution: {integrity: sha512-Z751v203YWwYzy460bzsYQISDfPjHTl+6Zzwo/a3CsAf+0ccEjQ8c+0CdX1WsumRTHeywvyUFtW6KvNukT/smA==}
- '@vue/runtime-dom@3.5.24':
- resolution: {integrity: sha512-Z8ANhr/i0XIluonHVjbUkjvn+CyrxbXRIxR7wn7+X7xlcb7dJsfITZbkVOeJZdP8VZwfrWRsWdShH6pngMxRjw==}
+ '@vue/runtime-dom@3.5.25':
+ resolution: {integrity: sha512-a4WrkYFbb19i9pjkz38zJBg8wa/rboNERq3+hRRb0dHiJh13c+6kAbgqCPfMaJ2gg4weWD3APZswASOfmKwamA==}
- '@vue/server-renderer@3.5.24':
- resolution: {integrity: sha512-Yh2j2Y4G/0/4z/xJ1Bad4mxaAk++C2v4kaa8oSYTMJBJ00/ndPuxCnWeot0/7/qafQFLh5pr6xeV6SdMcE/G1w==}
+ '@vue/server-renderer@3.5.25':
+ resolution: {integrity: sha512-UJaXR54vMG61i8XNIzTSf2Q7MOqZHpp8+x3XLGtE3+fL+nQd+k7O5+X3D/uWrnQXOdMw5VPih+Uremcw+u1woQ==}
peerDependencies:
- vue: 3.5.24
+ vue: 3.5.25
'@vue/shared@3.5.24':
resolution: {integrity: sha512-9cwHL2EsJBdi8NY22pngYYWzkTDhld6fAD6jlaeloNGciNSJL6bLpbxVgXl96X00Jtc6YWQv96YA/0sxex/k1A==}
+ '@vue/shared@3.5.25':
+ resolution: {integrity: sha512-AbOPdQQnAnzs58H2FrrDxYj/TJfmeS2jdfEEhgiKINy+bnOANmVizIEgq1r+C5zsbs6l1CCQxtcj71rwNQ4jWg==}
+
'@vue/test-utils@2.4.6':
resolution: {integrity: sha512-FMxEjOpYNYiFe0GkaHsnJPXFHxQ6m4t8vI/ElPGpMWxZKpmRvQ33OIrvRXemy6yha03RxhOlQuy+gZMC3CQSow==}
@@ -5221,6 +5391,10 @@ packages:
resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==}
engines: {node: '>= 0.6'}
+ accepts@2.0.0:
+ resolution: {integrity: sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==}
+ engines: {node: '>= 0.6'}
+
acorn-import-attributes@1.9.5:
resolution: {integrity: sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==}
peerDependencies:
@@ -5261,10 +5435,6 @@ packages:
resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==}
engines: {node: '>=8'}
- aggregate-error@5.0.0:
- resolution: {integrity: sha512-gOsf2YwSlleG6IjRYG2A7k0HmBMEo6qVNk9Bp/EaLgAJT5ngH6PXbqa4ItvnEwCm/velL5jAnQgsHsWnjhGmvw==}
- engines: {node: '>=18'}
-
aiscript-vscode@https://codeload.github.com/aiscript-dev/aiscript-vscode/tar.gz/c3cde89e79a41d93540cf8a48cd619c3f2dcb1b7:
resolution: {tarball: https://codeload.github.com/aiscript-dev/aiscript-vscode/tar.gz/c3cde89e79a41d93540cf8a48cd619c3f2dcb1b7}
version: 0.1.15
@@ -5559,8 +5729,8 @@ packages:
balanced-match@1.0.2:
resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==}
- bare-events@2.8.2:
- resolution: {integrity: sha512-riJjyv1/mHLIPX4RwiK+oW9/4c3TEUeORHKefKAKnZ5kyslbN+HXowtbaVEqt4IMUB7OXlfixcs6gsFeo/jhiQ==}
+ bare-events@2.8.1:
+ resolution: {integrity: sha512-oxSAxTS1hRfnyit2CL5QpAOS5ixfBjj6ex3yTNvXyY/kE719jQ/IjuESJBK2w5v4wwQRAHGseVJXx9QBYOtFGQ==}
peerDependencies:
bare-abort-controller: '*'
peerDependenciesMeta:
@@ -5577,12 +5747,9 @@ packages:
bcrypt-pbkdf@1.0.2:
resolution: {integrity: sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==}
- bcryptjs@2.4.3:
- resolution: {integrity: sha512-V/Hy/X9Vt7f3BbPJEi8BdVFMByHi+jNXrYkW3huaybV/kQ0KJg0Y6PkEMbn+zeT+i+SiKZ/HMqJGIIt4LZDqNQ==}
-
- better-opn@3.0.2:
- resolution: {integrity: sha512-aVNobHnJqLiUelTaHat9DZ1qM2w0C0Eym4LPI/3JxOnSokGVdsl1T1kN7TFvsEAD8G47A6VKQ0TVHqbBnYMJlQ==}
- engines: {node: '>=12.0.0'}
+ bcryptjs@3.0.3:
+ resolution: {integrity: sha512-GlF5wPWnSa/X5LKM1o0wz0suXIINz1iHRLvTS+sLyi7XPbe5ycmYI3DlZqVGZZtDgl4DmasFg7gOB3JYbphV5g==}
+ hasBin: true
bidi-js@1.0.3:
resolution: {integrity: sha512-RKshQI1R3YQ+n9YJz2QQ147P66ELpa1FQEg20Dk8oW9t2KgLbpDLLp9aGZ7y8WHSshDknG0bknqGw5/tyCs5tw==}
@@ -5611,6 +5778,10 @@ packages:
resolution: {integrity: sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==}
engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16}
+ body-parser@2.2.1:
+ resolution: {integrity: sha512-nfDwkulwiZYQIGwxdy0RUmowMhKcFVcYXUU7m4QlKYim1rUtg83xm2yjZ40QjDuc291AJjjeSc9b++AWHSgSHw==}
+ engines: {node: '>=18'}
+
boolbase@1.0.0:
resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==}
@@ -5664,8 +5835,8 @@ packages:
resolution: {integrity: sha512-WDtdLmJvAuNNPzByAYpRo2rF1Mmradw6gvWsQKf63476DDXmomT9zUiGypLcG4ibIM67vhAj8jJRdbmEws2Aqw==}
engines: {node: '>=6.14.2'}
- bullmq@5.63.2:
- resolution: {integrity: sha512-c1K5gcAh0a+C9lcRXaA1GePDYtmUywCH1pNXkUlZ8lFlqQnrtKyZpcr5aZJcjyZVx6y7t5259ru+ttJFNUQ5kw==}
+ bullmq@5.65.0:
+ resolution: {integrity: sha512-fyOcyf2ad4zrNmE18vdF/ie7DrW0TwhLt5e0DkqDxbRpDNiUdYqgp2QZJW2ntnUN08T2mDMC4deUUhF2UOAmeQ==}
buraha@0.0.1:
resolution: {integrity: sha512-G563A0mTbzknm2jDaNxfZuNKIdeArs8T+XQN6t+KbmgnOoevXSXhKDkyf8Md/36Jrx99ikwbCag37VGe3myExQ==}
@@ -5682,10 +5853,6 @@ packages:
resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==}
engines: {node: '>= 0.8'}
- cac@6.7.14:
- resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==}
- engines: {node: '>=8'}
-
cacache@19.0.1:
resolution: {integrity: sha512-hdsUxulXCi5STId78vRVYEtDAjq99ICAUktLTeTYsLoTE6Z8dS0c8pWNCxwdrk9YfJeobDZc2Y186hD/5ZQgFQ==}
engines: {node: ^18.17.0 || >=20.5.0}
@@ -5740,8 +5907,9 @@ packages:
caniuse-lite@1.0.30001755:
resolution: {integrity: sha512-44V+Jm6ctPj7R52Na4TLi3Zri4dWUljJd+RDm+j8LtNCc/ihLCT+X1TzoOAkRETEWqjuLnh9581Tl80FvK7jVA==}
- canonicalize@1.0.8:
- resolution: {integrity: sha512-0CNTVCLZggSh7bc5VkX5WWPWO+cyZbNd07IHIsSXLia/eAq+r836hgk+8BKoEh7949Mda87VUOitx5OddVj64A==}
+ canonicalize@2.1.0:
+ resolution: {integrity: sha512-F705O3xrsUtgt98j7leetNhTWPe+5S72rlL5O4jA1pKqBVQ/dT1O1D6PFxmSXvc0SUOinWS57DKx0I3CHrXJHQ==}
+ hasBin: true
canvas-confetti@1.9.4:
resolution: {integrity: sha512-yxQbJkAVrFXWNbTUjPqjF7G+g6pDotOUHGbkZq2NELZUMDpiJ85rIEazVb8GTaAptNW2miJAXbs1BtioA251Pw==}
@@ -5749,9 +5917,9 @@ packages:
caseless@0.12.0:
resolution: {integrity: sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==}
- cbor@9.0.2:
- resolution: {integrity: sha512-JPypkxsB10s9QOWwa6zwPzqE1Md3vqpPc+cai4sAecuCsRyAtAl/pMyhPlMbT/xtPnm2dznJZYRLui57qiRhaQ==}
- engines: {node: '>=16'}
+ cbor@10.0.11:
+ resolution: {integrity: sha512-vIwORDd/WyB8Nc23o2zNN5RrtFGlR6Fca61TtjkUXueI3Jf2DOZDl1zsshvBntZ3wZHBM9ztjnkXSmzQDaq3WA==}
+ engines: {node: '>=20'}
ccount@2.0.1:
resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==}
@@ -5882,10 +6050,6 @@ packages:
resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==}
engines: {node: '>=6'}
- clean-stack@5.3.0:
- resolution: {integrity: sha512-9ngPTOhYGQqNVSfeJkYXHmF7AGWp4/nN5D/QqNQs3Dvxd1Kk/WpjHfNujKHYUQ/5CoGyOyFNoWSPk5afzP0QVg==}
- engines: {node: '>=14.16'}
-
cli-cursor@3.1.0:
resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==}
engines: {node: '>=8'}
@@ -5912,6 +6076,10 @@ packages:
resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==}
engines: {node: '>=12'}
+ cliui@9.0.1:
+ resolution: {integrity: sha512-k7ndgKhwoQveBL+/1tqGJYNz097I7WOvwbmmU2AR5+magtbjPWQTS1C5vzGkBC8Ym8UWRzfKUzUUqFLypY4Q+w==}
+ engines: {node: '>=20'}
+
cluster-key-slot@1.1.2:
resolution: {integrity: sha512-RMr0FhtfXemyinomL4hrWcYJxmX6deFdCxpJzhDttxgO1+bcCnkk+9drydLVDmAMG7NE6aN/fl4F7ucU/90gAA==}
engines: {node: '>=0.10.0'}
@@ -5927,9 +6095,17 @@ packages:
resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==}
engines: {node: '>=7.0.0'}
+ color-convert@3.1.3:
+ resolution: {integrity: sha512-fasDH2ont2GqF5HpyO4w0+BcewlhHEZOFn9c1ckZdHpJ56Qb7MHhH/IcJZbBGgvdtwdwNbLvxiBEdg336iA9Sg==}
+ engines: {node: '>=14.6'}
+
color-name@1.1.4:
resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==}
+ color-name@2.1.0:
+ resolution: {integrity: sha512-1bPaDNFm0axzE4MEAzKPuqKWeRaT43U/hyxKPBdqTfmPF+d6n7FSoTFxLVULUJOmiLp01KjhIPPH+HrXZJN4Rg==}
+ engines: {node: '>=12.20'}
+
color-string@1.9.1:
resolution: {integrity: sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==}
@@ -6026,6 +6202,10 @@ packages:
resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==}
engines: {node: '>= 0.6'}
+ content-disposition@1.0.1:
+ resolution: {integrity: sha512-oIXISMynqSqm241k6kcQ5UwttDILMK4BiurCfGEREw6+X9jkkpEe5T9FZaApyLGGOnFuyMWZpdolTXMtvEJ08Q==}
+ engines: {node: '>=18'}
+
content-type@1.0.5:
resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==}
engines: {node: '>= 0.6'}
@@ -6036,6 +6216,10 @@ packages:
cookie-signature@1.0.6:
resolution: {integrity: sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==}
+ cookie-signature@1.2.2:
+ resolution: {integrity: sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==}
+ engines: {node: '>=6.6.0'}
+
cookie@0.7.1:
resolution: {integrity: sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==}
engines: {node: '>= 0.6'}
@@ -6086,14 +6270,6 @@ packages:
engines: {node: '>=20'}
hasBin: true
- cross-env@7.0.3:
- resolution: {integrity: sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==}
- engines: {node: '>=10.14', npm: '>=6', yarn: '>=1'}
- hasBin: true
-
- cross-fetch@4.1.0:
- resolution: {integrity: sha512-uKm5PU+MHTootlWEY+mZ4vvXoCn4fLQxT9dSc1sXVMSFkINTJVN8cAQROpwcKm8bJ/c7rgZVIBWzH5T78sNZZw==}
-
cross-spawn@7.0.6:
resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==}
engines: {node: '>= 8'}
@@ -6149,10 +6325,6 @@ packages:
resolution: {integrity: sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==}
engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0, npm: '>=7.0.0'}
- cssstyle@4.6.0:
- resolution: {integrity: sha512-2z+rWdzbbSZv6/rhtvzvqeZQHrBaqgogqt85sqFNbabZOuFbCVFb8kPeEtZjiKkbrm395irpNKiYeFeLiQnFPg==}
- engines: {node: '>=18'}
-
cssstyle@5.3.3:
resolution: {integrity: sha512-OytmFH+13/QXONJcC75QNdMtKpceNk3u8ThBjyyYjkEcy/ekBwR1mMAuNvi3gdBPW3N5TlCzQ0WZw8H0lN/bDw==}
engines: {node: '>=20'}
@@ -6160,8 +6332,8 @@ packages:
csstype@3.2.3:
resolution: {integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==}
- cypress@15.6.0:
- resolution: {integrity: sha512-Vqo66GG1vpxZ7H1oDX9umfmzA3nF7Wy80QAc3VjwPREO5zTY4d1xfQFNPpOWleQl9vpdmR2z1liliOcYlRX6rQ==}
+ cypress@15.7.0:
+ resolution: {integrity: sha512-1C81zKxnQckYm2XGi37rPV4rN0bzUoWhydhKdOyshJn5gJKszEx5as9VLSZI0jp0ye49QxmnbU4TtMpcD+OmGQ==}
engines: {node: ^20.1.0 || ^22.0.0 || >=24.0.0}
hasBin: true
@@ -6173,10 +6345,6 @@ packages:
resolution: {integrity: sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==}
engines: {node: '>= 12'}
- data-urls@5.0.0:
- resolution: {integrity: sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg==}
- engines: {node: '>=18'}
-
data-urls@6.0.0:
resolution: {integrity: sha512-BnBS08aLUM+DKamupXs3w2tJJoqU+AkaE/+6vQxi/G/DPmIZFJJp9Dkb1kM03AZx8ADehDUZgsNxju3mPXZYIA==}
engines: {node: '>=20'}
@@ -6193,10 +6361,6 @@ packages:
resolution: {integrity: sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==}
engines: {node: '>= 0.4'}
- date-fns@2.30.0:
- resolution: {integrity: sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==}
- engines: {node: '>=0.11'}
-
date-fns@4.1.0:
resolution: {integrity: sha512-Ukq0owbQXxa/U3EGtsdVBkR1w7KOQ5gIBqdH2hkvknzZPYvBxb/aa6E8L7tmjFtkwZBu3UXBbjIgPo/Ez4xaNg==}
@@ -6299,10 +6463,6 @@ packages:
resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==}
engines: {node: '>= 0.4'}
- define-lazy-prop@2.0.0:
- resolution: {integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==}
- engines: {node: '>=8'}
-
define-properties@1.2.1:
resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==}
engines: {node: '>= 0.4'}
@@ -6456,12 +6616,19 @@ packages:
resolution: {integrity: sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==}
engines: {node: '>=12'}
+ emoji-regex@10.6.0:
+ resolution: {integrity: sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==}
+
emoji-regex@8.0.0:
resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==}
emoji-regex@9.2.2:
resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==}
+ empathic@2.0.0:
+ resolution: {integrity: sha512-i6UzDscO/XfAcNYD75CfICkmfLedpyPDdozrLMmQc5ORaQcdMoc21OnlEylMIqI7U8eniKrPMxxtj8k0vhmJhA==}
+ engines: {node: '>=14'}
+
encodeurl@1.0.2:
resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==}
engines: {node: '>= 0.8'}
@@ -6551,11 +6718,6 @@ packages:
es6-promisify@5.0.0:
resolution: {integrity: sha512-C+d6UdsYDk0lMebHNR4S2NybQMMngAOnOwYBQjTOiv0MkoJMP0Myw2mgpDLBcpfCmRLxyFqYhS/CfOENq4SJhQ==}
- esbuild-register@3.6.0:
- resolution: {integrity: sha512-H2/S7Pm8a9CL1uhp9OvjwrBh5Pvx0H8qVOxNu8Wed9Y7qv56MPtq+GGM8RJpq6glYJn9Wspr8uw7l55uyinNeg==}
- peerDependencies:
- esbuild: '>=0.12 <1'
-
esbuild@0.25.11:
resolution: {integrity: sha512-KohQwyzrKTQmhXDW1PjCv3Tyspn9n5GcY2RTDqeORIdIJY8yKIF7sTSopFmn/wpMPW4rdPXI0UE5LJLuq3bx0Q==}
engines: {node: '>=18'}
@@ -6634,8 +6796,8 @@ packages:
'@typescript-eslint/parser':
optional: true
- eslint-plugin-vue@10.5.1:
- resolution: {integrity: sha512-SbR9ZBUFKgvWAbq3RrdCtWaW0IKm6wwUiApxf3BVTNfqUIo4IQQmreMg2iHFJJ6C/0wss3LXURBJ1OwS/MhFcQ==}
+ eslint-plugin-vue@10.6.2:
+ resolution: {integrity: sha512-nA5yUs/B1KmKzvC42fyD0+l9Yd+LtEpVhWRbXuDj0e+ZURcTtyRbMDWUeJmTAh2wC6jC83raS63anNM2YT3NPw==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies:
'@stylistic/eslint-plugin': ^2.0.0 || ^3.0.0 || ^4.0.0 || ^5.0.0
@@ -6746,10 +6908,6 @@ packages:
resolution: {integrity: sha512-QVWlX2e50heYJcCPG0iWtf8r0xjEYfz/OYLGDYH+IyjWezzPNxz63qNFOu0l4YftGWuizFVZHHs8PrLU5p2IDA==}
engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
- execa@8.0.1:
- resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==}
- engines: {node: '>=16.17'}
-
execa@9.6.0:
resolution: {integrity: sha512-jpWzZ1ZhwUmeWRhS7Qv3mhpOhLfwI+uAX4e5fOcXqwMR7EcJ0pj2kV1CVzHVMX/LphnKWD3LObjZCoJ71lKpHw==}
engines: {node: ^18.19.0 || >=20.5.0}
@@ -6780,6 +6938,10 @@ packages:
resolution: {integrity: sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==}
engines: {node: '>= 0.10.0'}
+ express@5.1.0:
+ resolution: {integrity: sha512-DT9ck5YIRU+8GYzzU5kT3eHGA5iL+1Zd0EutOmTE9Dtk+Tvuzd23VBU+ec7HPNSTxXYO55gPV/hq4pSBJDjFpA==}
+ engines: {node: '>= 18'}
+
ext-list@2.2.2:
resolution: {integrity: sha512-u+SQgsubraE6zItfVA0tBuCBhfU9ogSRnsvygI7wht9TS510oLkBRXBsqopeUG/GBOIQyKZO9wjTqIu/sf5zFA==}
engines: {node: '>=0.10.0'}
@@ -6800,8 +6962,8 @@ packages:
resolution: {integrity: sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==}
engines: {'0': node >=0.6.0}
- fast-content-type-parse@2.0.1:
- resolution: {integrity: sha512-nGqtvLrj5w0naR6tDPfB4cUmYCqouzyQiz6C5y/LtcDllJdrcc6WaWW6iXyIIOErTa/XRybj28aasdn4LkVk6Q==}
+ fast-content-type-parse@3.0.0:
+ resolution: {integrity: sha512-ZvLdcY8P+N8mGQJahJV5G4U88CSvT1rP8ApL6uETe88MBXrBHAkZlSEySdUlyztF7ccb+Znos3TFqaepHxdhBg==}
fast-decode-uri-component@1.0.1:
resolution: {integrity: sha512-WKgKWg5eUxvRZGwW8FvfbaH7AXSh2cL+3j5fMGzUMCxWBJ3dV3a7Wz8y2f/uQ0e3B6WmodD3oS54jTQ9HVTIIg==}
@@ -6834,10 +6996,6 @@ packages:
fast-uri@3.1.0:
resolution: {integrity: sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==}
- fast-xml-parser@4.5.3:
- resolution: {integrity: sha512-RKihhV+SHsIUGXObeVy9AXiBbFwkVk7Syp8XgwN5U3JV416+Gwp/GO9i0JYKmikykgz/UHRrrV4ROuZEo/T0ig==}
- hasBin: true
-
fast-xml-parser@5.2.5:
resolution: {integrity: sha512-pfX9uG9Ki0yekDHx2SiuRIyFdyAr1kMIMitPvb0YBo8SUfKvia7w7FIyd/l6av85pFYRhZscS75MwMnbvY+hcQ==}
hasBin: true
@@ -6870,9 +7028,9 @@ packages:
picomatch:
optional: true
- feed@4.2.2:
- resolution: {integrity: sha512-u5/sxGfiMfZNtJ3OvQpXcvotFpYkL0n9u9mM2vkui2nGo8b4wvDkJ8gAkYqbA8QpGyFCv3RK0Z+Iv+9veCS9bQ==}
- engines: {node: '>=0.4.0'}
+ feed@5.1.0:
+ resolution: {integrity: sha512-qGNhgYygnefSkAHHrNHqC7p3R8J0/xQDS/cYUud8er/qD9EFGWyCdUDfULHTJQN1d3H3WprzVwMc9MfB4J50Wg==}
+ engines: {node: '>=20', pnpm: '>=10'}
fetch-blob@3.2.0:
resolution: {integrity: sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==}
@@ -6921,13 +7079,14 @@ packages:
resolution: {integrity: sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==}
engines: {node: '>= 0.8'}
+ finalhandler@2.1.0:
+ resolution: {integrity: sha512-/t88Ty3d5JWQbWYgaOGCCYfXRwV1+be02WqYYlL6h0lEiUAMPM8o8qKGO01YIkOHzka2up08wvgYD0mDiI+q3Q==}
+ engines: {node: '>= 0.8'}
+
find-my-way@9.3.0:
resolution: {integrity: sha512-eRoFWQw+Yv2tuYlK2pjFS2jGXSxSppAs3hSQjfxVKxM5amECzIgYYc1FEI8ZmhSh/Ig+FrKEz43NLRKJjYCZVg==}
engines: {node: '>=20'}
- find-package-json@1.2.0:
- resolution: {integrity: sha512-+SOGcLGYDJHtyqHd87ysBhmaeQ95oWspDKnMXBrnQ9Eq4OkLNqejgoaD8xVWu6GPa0B6roa6KinCMEMcVeqONw==}
-
find-up@4.1.0:
resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==}
engines: {node: '>=8'}
@@ -6936,17 +7095,13 @@ packages:
resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==}
engines: {node: '>=10'}
- find-up@7.0.0:
- resolution: {integrity: sha512-YyZM99iHrqLKjmt4LJDj58KI+fYyufRLBSYcqycxf//KpBk9FoewoGX0450m9nB44qrZnovzC2oeP5hUibxc/g==}
- engines: {node: '>=18'}
-
find-versions@5.1.0:
resolution: {integrity: sha512-+iwzCJ7C5v5KgcBuueqVoNiHVoQpwiUK5XFLjf0affFTep+Wcw93tPvmb8tqujDNmzhBDPddnWV/qgWSXgq+Hg==}
engines: {node: '>=12'}
- fkill@9.0.0:
- resolution: {integrity: sha512-MdYSsbdCaIRjzo5edthZtWmEZVMfr1qrtYZUHIdO3swCE+CoZA8S5l0s4jDsYlTa9ZiXv0pTgpzE7s4N8NeUOA==}
- engines: {node: '>=18'}
+ fkill@10.0.1:
+ resolution: {integrity: sha512-ecaskrAMoRXdtrGEQI/NyEJ3ZoZrMUVPb3EPNMrSqP/Tb08ZN22KqMJN24cDgNJ+ddkQR8W6cJRMvF9+nnZg6A==}
+ engines: {node: '>=20'}
flat-cache@4.0.1:
resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==}
@@ -7011,6 +7166,10 @@ packages:
resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==}
engines: {node: '>= 0.6'}
+ fresh@2.0.0:
+ resolution: {integrity: sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==}
+ engines: {node: '>= 0.8'}
+
from@0.1.7:
resolution: {integrity: sha512-twe20eF1OxVxp/ML/kq2p1uc6KvFK/+vs8WjEbeKmV2He22MKm7YF2ANIt+EOqhJ5L3K/SuuPhk0hWQDjOM23g==}
@@ -7069,6 +7228,10 @@ packages:
resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==}
engines: {node: 6.* || 8.* || >= 10.*}
+ get-east-asian-width@1.4.0:
+ resolution: {integrity: sha512-QZjmEOC+IT1uk6Rx0sX22V6uHWVwbdbxf1faPqJ1QhLdGgsRGCZoyaQBm/piRdJy/D2um6hM1UP7ZEeQ4EkP+Q==}
+ engines: {node: '>=18'}
+
get-intrinsic@1.3.0:
resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==}
engines: {node: '>= 0.4'}
@@ -7089,10 +7252,6 @@ packages:
resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==}
engines: {node: '>=10'}
- get-stream@8.0.1:
- resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==}
- engines: {node: '>=16'}
-
get-stream@9.0.1:
resolution: {integrity: sha512-kVCxPF3vQM/N0B1PmoqVUqgHP+EeVjmZSQn+1oCRPxd2P21P2F19lIgbR3HBosbB1PUhOAoctJnfEn2GbN2eZA==}
engines: {node: '>=18'}
@@ -7169,8 +7328,8 @@ packages:
resolution: {integrity: sha512-XfBk1CxOOScDcMr9O1yKkNaQyy865NbYs+F7dr4H0LZMVgCj2Le59k6PqbNHoL5ToeaEQUYh6c6yMfVcc6SJxA==}
engines: {node: '>=16'}
- got@14.6.4:
- resolution: {integrity: sha512-DjsLab39NUMf5iYlK9asVCkHMhaA2hEhrlmf+qXRhjEivuuBHWYbjmty9DA3OORUwZgENTB+6vSmY2ZW8gFHVw==}
+ got@14.6.5:
+ resolution: {integrity: sha512-Su87c0NNeg97de1sO02gy9I8EmE7DCJ1gzcFLcgGpYeq2PnLg4xz73MWrp6HjqbSsjb6Glf4UBDW6JNyZA6uSg==}
engines: {node: '>=20'}
graceful-fs@4.2.11:
@@ -7187,8 +7346,8 @@ packages:
resolution: {integrity: sha512-tSQXBXS/MWQOn/RKckawJ61vvsDpCom87JgxiYdGwHdOa0ht0vzUWDlfioofFCRU0L+6NGDt6XzbgoJvZkMeRQ==}
engines: {node: '>=0.8.0'}
- happy-dom@20.0.10:
- resolution: {integrity: sha512-6umCCHcjQrhP5oXhrHQQvLB0bwb1UzHAHdsXy+FjtKoYjUhmNZsQL8NivwM1vDvNEChJabVrUYxUnp/ZdYmy2g==}
+ happy-dom@20.0.11:
+ resolution: {integrity: sha512-QsCdAUHAmiDeKeaNojb1OHOPF7NjcWPBR7obdu3NwH2a/oyQaLg5d0aaCy/9My6CdPChYF07dvz5chaXBGaD4g==}
engines: {node: '>=20.0.0'}
hard-rejection@2.1.0:
@@ -7280,10 +7439,6 @@ packages:
html-void-elements@3.0.0:
resolution: {integrity: sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==}
- htmlescape@1.1.1:
- resolution: {integrity: sha512-eVcrzgbR4tim7c7soKQKtxa/kQM4TzjnlU83rcZ9bHU6t31ehfV7SktN6McWgwPWg+JYMA/O3qpGxBvFq1z2Jg==}
- engines: {node: '>=0.10'}
-
htmlparser2@10.0.0:
resolution: {integrity: sha512-TwAZM+zE5Tq3lrEHvOlvwgj1XLWQCtaaibSN11Q+gGBAS7Y1uZSWwXXRe4iF6OXnaq1riyQAPFOBtYc77Mxq0g==}
@@ -7347,10 +7502,6 @@ packages:
resolution: {integrity: sha512-rQLskxnM/5OCldHo+wNXbpVgDn5A17CUoKX+7Sokwaknlq7CdSnphy0W39GU8dw59XiCXmFXDg4fRuckQRKewQ==}
engines: {node: '>=12.20.0'}
- human-signals@5.0.0:
- resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==}
- engines: {node: '>=16.17.0'}
-
human-signals@8.0.1:
resolution: {integrity: sha512-eKCa6bwnJhvxj14kZk5NCPc6Hb6BdsU9DZcOnmQKSnO1VKrfV0zCvtttPZUsBvjmNDn8rpcJfpwSYnHBjc95MQ==}
engines: {node: '>=18.18.0'}
@@ -7395,8 +7546,8 @@ packages:
resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==}
engines: {node: '>=6'}
- import-in-the-middle@1.15.0:
- resolution: {integrity: sha512-bpQy+CrsRmYmoPMAE/0G33iwRqwW4ouqdRg8jgbH3aKuCtOc8lxgmYXg2dMM92CRiGP660EtBcymH/eVUpCSaA==}
+ import-in-the-middle@2.0.0:
+ resolution: {integrity: sha512-yNZhyQYqXpkT0AKq3F3KLasUSK4fHvebNH5hOsKQw2dhGSALvQ4U0BqUc5suziKvydO5u5hgN2hy1RJaho8U5A==}
import-lazy@4.0.0:
resolution: {integrity: sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==}
@@ -7415,10 +7566,6 @@ packages:
resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==}
engines: {node: '>=8'}
- indent-string@5.0.0:
- resolution: {integrity: sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==}
- engines: {node: '>=12'}
-
index-to-position@1.2.0:
resolution: {integrity: sha512-Yg7+ztRkqslMAS2iFaU+Oa4KTSidr63OsFGlOrJoW981kIYO3CGCS3wA95P1mUi/IVSJkn0D479KTJpVpvFNuw==}
engines: {node: '>=18'}
@@ -7462,8 +7609,8 @@ packages:
ios-haptics@0.1.4:
resolution: {integrity: sha512-94FJcSuvmhe4mHTX4Uauj+/2yhs56m4BLkRScy1vNvkv7H1cSjsvfT+olc1sYOUqWlPhtVttAFBHex0cY9CE7Q==}
- ip-address@10.1.0:
- resolution: {integrity: sha512-XXADHxXmvT9+CRxhXg56LJovE+bmWnEWB78LB83VZTprKTmaC5QfruXocxzTZ2Kl0DNwKuBdlIhjL8LeY8Sf8Q==}
+ ip-address@10.0.1:
+ resolution: {integrity: sha512-NWv9YLW4PoW2B7xtzaS3NCot75m6nK7Icdv0o3lfMceJVRfSoQwqD4wEH5rLwoKJwUiZ/rfpiVBhnaF0FK4HoA==}
engines: {node: '>= 12'}
ip-address@9.0.5:
@@ -7482,8 +7629,8 @@ packages:
resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==}
engines: {node: '>= 0.10'}
- ipaddr.js@2.2.0:
- resolution: {integrity: sha512-Ag3wB2o37wslZS19hZqorUnrnzSkpOVy+IiiDEiTqNubEYpYuHWIf6K4psgN2ZWKExS4xhVCrRVfb/wfW8fWJA==}
+ ipaddr.js@2.3.0:
+ resolution: {integrity: sha512-Zv/pA+ciVFbCSBBjGfaKUya/CcGmUHzTydLMaTwrUUEM2DIEO3iZvueGxmacvmN50fGpGVKeTXpb2LcYQxeVdg==}
engines: {node: '>= 10'}
irregular-plurals@3.5.0:
@@ -7532,11 +7679,6 @@ packages:
resolution: {integrity: sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==}
engines: {node: '>= 0.4'}
- is-docker@2.2.1:
- resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==}
- engines: {node: '>=8'}
- hasBin: true
-
is-expression@4.0.0:
resolution: {integrity: sha512-zMIXX63sxzG3XrkHkrAPvm/OVZVSCPNkwMHU8oTX7/U3AL78I0QXCEICXUM13BIa8TYGZ68PiTKfQz3yaTNr4A==}
@@ -7612,6 +7754,9 @@ packages:
is-promise@2.2.2:
resolution: {integrity: sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==}
+ is-promise@4.0.0:
+ resolution: {integrity: sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==}
+
is-regex@1.2.1:
resolution: {integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==}
engines: {node: '>= 0.4'}
@@ -7640,9 +7785,9 @@ packages:
resolution: {integrity: sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==}
engines: {node: '>= 0.4'}
- is-svg@5.1.0:
- resolution: {integrity: sha512-uVg5yifaTxHoefNf5Jcx+i9RZe2OBYd/UStp1umx+EERa4xGRa3LLGXjoEph43qUORC0qkafUgrXZ6zzK89yGA==}
- engines: {node: '>=14.16'}
+ is-svg@6.1.0:
+ resolution: {integrity: sha512-i7YPdvYuSCYcaLQrKwt8cvKTlwHcdA6Hp8N9SO3Q5jIzo8x6kH3N47W0BvPP7NdxVBmIHx7X9DK36czYYW7lHg==}
+ engines: {node: '>=20'}
is-symbol@1.1.1:
resolution: {integrity: sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==}
@@ -7675,10 +7820,6 @@ packages:
resolution: {integrity: sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==}
engines: {node: '>= 0.4'}
- is-wsl@2.2.0:
- resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==}
- engines: {node: '>=8'}
-
isarray@1.0.0:
resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==}
@@ -7917,15 +8058,6 @@ packages:
resolution: {integrity: sha512-/kmVISmrwVwtyYU40iQUOp3SUPk2dhNCMsZBQX0R1/jZ8maaXJ/oZIzUOiyOqcgtLnETFKYChbJ5iDC/eWmFHg==}
engines: {node: '>=0.1.90'}
- jsdom@26.1.0:
- resolution: {integrity: sha512-Cvc9WUhxSMEo4McES3P7oK3QaXldCfNWp7pl2NNeiIFlCoLr3kfq9kb1fxftiwk1FLV7CvpvDfonxtzUDeSOPg==}
- engines: {node: '>=18'}
- peerDependencies:
- canvas: ^3.0.0
- peerDependenciesMeta:
- canvas:
- optional: true
-
jsdom@27.2.0:
resolution: {integrity: sha512-454TI39PeRDW1LgpyLPyURtB4Zx1tklSr6+OFOipsxGUH1WMTvk6C65JQdrj455+DP2uJ1+veBEHTGFKWVLFoA==}
engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0}
@@ -7985,9 +8117,9 @@ packages:
jsonfile@6.2.0:
resolution: {integrity: sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==}
- jsonld@8.3.3:
- resolution: {integrity: sha512-9YcilrF+dLfg9NTEof/mJLMtbdX1RJ8dbWtJgE00cMOIohb1lIyJl710vFiTaiHTl6ZYODJuBd32xFvUhmv3kg==}
- engines: {node: '>=14'}
+ jsonld@9.0.0:
+ resolution: {integrity: sha512-pjMIdkXfC1T2wrX9B9i2uXhGdyCmgec3qgMht+TDj+S0qX3bjWMQUfL7NeqEhuRTi8G5ESzmL9uGlST7nzSEWg==}
+ engines: {node: '>=18'}
jsonpointer@5.0.1:
resolution: {integrity: sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==}
@@ -8035,19 +8167,9 @@ packages:
resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==}
engines: {node: '>=6'}
- ky-universal@0.11.0:
- resolution: {integrity: sha512-65KyweaWvk+uKKkCrfAf+xqN2/epw1IJDtlyCPxYffFCMR8u1sp2U65NtWpnozYfZxQ6IUzIlvUcw+hQ82U2Xw==}
- engines: {node: '>=14.16'}
- peerDependencies:
- ky: '>=0.31.4'
- web-streams-polyfill: '>=3.2.1'
- peerDependenciesMeta:
- web-streams-polyfill:
- optional: true
-
- ky@0.33.3:
- resolution: {integrity: sha512-CasD9OCEQSFIam2U8efFK81Yeg8vNMTBUqtMOHlrcWQHqUX3HeCl9Dr31u4toV7emlH8Mymk5+9p0lL6mKb/Xw==}
- engines: {node: '>=14.16'}
+ ky@1.14.0:
+ resolution: {integrity: sha512-Rczb6FMM6JT0lvrOlP5WUOCB7s9XKxzwgErzhKlKde1bEV90FXplV1o87fpt4PU/asJFiqjYJxAJyzJhcrxOsQ==}
+ engines: {node: '>=18'}
lazy-ass@1.6.0:
resolution: {integrity: sha512-cc8oEVoctTvsFZ/Oje/kGnHbpWHYBe8IAJe4C0QNc3t8uM/0Y8+erSz/7Y1ALuXTEZTMvxXwO6YbX1ey3ujiZw==}
@@ -8096,10 +8218,6 @@ packages:
resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==}
engines: {node: '>=10'}
- locate-path@7.2.0:
- resolution: {integrity: sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==}
- engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
-
lodash.defaults@4.2.0:
resolution: {integrity: sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==}
@@ -8171,9 +8289,6 @@ packages:
magic-string@0.30.21:
resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==}
- magicast@0.3.5:
- resolution: {integrity: sha512-L0WhttDl+2BOsybvEOLK7fW3UA0OQ0IQ2d6Zl2x/a6vVRs3bAY0ECOSHHeL5jD+SbOpOCUEi0y1DgHEn9Qn1AQ==}
-
magicast@0.5.1:
resolution: {integrity: sha512-xrHS24IxaLrvuo613F719wvOIv9xPHFWQHuvGUBmPnCA/3MQxKI3b+r7n1jAoDHmsbC5bRhTZYR77invLAxVnw==}
@@ -8265,8 +8380,12 @@ packages:
resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==}
engines: {node: '>= 0.6'}
- mediabunny@1.25.0:
- resolution: {integrity: sha512-ozaqk6zS2Vbf3+3+OoxKfnCVeZRcv5PO8DgQtBrM5vpWIbpEK+kMVV6pgfo4mC3XtMwvQEMbhj3zEf0LNklh9w==}
+ media-typer@1.1.0:
+ resolution: {integrity: sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==}
+ engines: {node: '>= 0.8'}
+
+ mediabunny@1.25.3:
+ resolution: {integrity: sha512-+LDXv/kybsElRQCmMlrdbKmPNvegeIyouGeOUzW5DJ8+M56H4G6wyEL2AJ1A45UcOB+U62qJMV7tuFO9S7yA7g==}
meilisearch@0.54.0:
resolution: {integrity: sha512-b1bwJAEfj8C6hgSN88+/LvW3pe3nWC+thBS2seAbPZGakf/vzsLqppgZquiomzCr2GhU7U7H289625qhYe3rbw==}
@@ -8284,6 +8403,10 @@ packages:
merge-descriptors@1.0.3:
resolution: {integrity: sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==}
+ merge-descriptors@2.0.0:
+ resolution: {integrity: sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==}
+ engines: {node: '>=18'}
+
merge-stream@2.0.0:
resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==}
@@ -8298,10 +8421,6 @@ packages:
mfm-js@0.25.0:
resolution: {integrity: sha512-JoK5TOtswXIvZSZ9hUEL+ZkcNV4onu/DtkaKeXK846+sJBBF8DvxYmPutt7nPaRDsUMmJGr64PNVMFpMGdk3hw==}
- microformats-parser@2.0.4:
- resolution: {integrity: sha512-DA2yt3uz2JjupBGoNvaG9ngBP5vSTI1ky2yhxBai/RnQrlzo+gEzuCdvwIIjj2nh3uVPDybTP5u7uua7pOa6LA==}
- engines: {node: '>=18'}
-
micromark-core-commonmark@2.0.3:
resolution: {integrity: sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==}
@@ -8402,6 +8521,10 @@ packages:
resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==}
engines: {node: '>= 0.6'}
+ mime-types@3.0.2:
+ resolution: {integrity: sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==}
+ engines: {node: '>=18'}
+
mime@1.6.0:
resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==}
engines: {node: '>=4'}
@@ -8519,9 +8642,6 @@ packages:
engines: {node: '>=10'}
hasBin: true
- mnemonist@0.40.0:
- resolution: {integrity: sha512-kdd8AFNig2AD5Rkih7EPCXhu/iMvwevQFX/uEiGhZyPZi7fHqOoF4V4kHLpCfysxXMgQ4B52kdPMCwARshKvEg==}
-
mock-socket@9.3.1:
resolution: {integrity: sha512-qxBgB7Qa2sEQgHFjj0dSigq7fX4k6Saisd5Nelwp2q8mlbAFh5dHV9JTTlF8viYJLSSWgMCZFUom8PJcMNBoJw==}
engines: {node: '>= 8'}
@@ -8551,8 +8671,8 @@ packages:
peerDependencies:
msw: ^2.0.0
- msw@2.12.2:
- resolution: {integrity: sha512-Fsr8AR5Yu6C0thoWa1Z8qGBFQLDvLsWlAn/v3CNLiUizoRqBYArK3Ex3thXpMWRr1Li5/MKLOEZ5mLygUmWi1A==}
+ msw@2.12.3:
+ resolution: {integrity: sha512-/5rpGC0eK8LlFqsHaBmL19/PVKxu/CCt8pO1vzp9X6SDLsRDh/Ccudkf3Ur5lyaKxJz9ndAx+LaThdv0ySqB6A==}
engines: {node: '>=18'}
hasBin: true
peerDependencies:
@@ -8669,14 +8789,17 @@ packages:
engines: {node: ^18.17.0 || >=20.5.0}
hasBin: true
+ node-html-parser@7.0.1:
+ resolution: {integrity: sha512-KGtmPY2kS0thCWGK0VuPyOS+pBKhhe8gXztzA2ilAOhbUbxa9homF1bOyKvhGzMLXUoRds9IOmr/v5lr/lqNmA==}
+
node-int64@0.4.0:
resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==}
node-releases@2.0.27:
resolution: {integrity: sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==}
- nodemailer@7.0.10:
- resolution: {integrity: sha512-Us/Se1WtT0ylXgNFfyFSx4LElllVLJXQjWi2Xz17xWw7amDKO2MLtFnVp1WACy7GkVGs+oBlRopVNUzlrGSw1w==}
+ nodemailer@7.0.11:
+ resolution: {integrity: sha512-gnXhNRE0FNhD7wPSCGhdNh46Hs6nm+uTyg+Kq0cZukNQiYdnCsoQjodNP9BQVG9XrcK/v6/MgpAPBUFyzh9pvw==}
engines: {node: '>=6.0.0'}
nodemon@3.1.11:
@@ -8743,9 +8866,6 @@ packages:
nth-check@2.1.1:
resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==}
- nwsapi@2.2.22:
- resolution: {integrity: sha512-ujSMe1OWVn55euT1ihwCI1ZcAaAU3nxUiDwfDQldc51ZXaB9m2AyOn6/jh1BLe2t/G8xd6uKG1UBF2aZJeg2SQ==}
-
oauth2orize-pkce@0.1.2:
resolution: {integrity: sha512-grto2UYhXHi9GLE3IBgBBbV87xci55+bCyjpVuxKyzol6I5Rg0K1MiTuXE+JZk54R86SG2wqXODMiZYHraPpxw==}
@@ -8788,13 +8908,13 @@ packages:
resolution: {integrity: sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==}
engines: {node: '>= 0.4'}
- obliterator@2.0.5:
- resolution: {integrity: sha512-42CPE9AhahZRsMNslczq0ctAEtqk8Eka26QofnqC346BZdHDySk3LWka23LI7ULIw11NmltpiLagIq8gBozxTw==}
-
oblivious-set@2.0.0:
resolution: {integrity: sha512-QOUH5Xrsced9fKXaQTjWoDGKeS/Or7E2jB0FN63N4mkAO4qJdB7WR7e6qWAOHM5nk25FJ8TGjhP7DH4l6vFVLg==}
engines: {node: '>=16'}
+ obug@2.1.1:
+ resolution: {integrity: sha512-uTqF9MuPraAQ+IsnPf366RG4cP9RtUi7MLO1N3KEc+wb0a6yKpeL0lmk2IB1jY5KHPAlTc6T/JRdC/YqxHNwkQ==}
+
on-exit-leak-free@2.1.2:
resolution: {integrity: sha512-0eJJY6hXLGf1udHwfNftBqH+g73EU4B504nZeKpz1sYRKafAghwxEJunB2O7rDZkL4PGfsMVnTXZ2EjibbqcsA==}
engines: {node: '>=14.0.0'}
@@ -8817,12 +8937,8 @@ packages:
oniguruma-parser@0.12.1:
resolution: {integrity: sha512-8Unqkvk1RYc6yq2WBYRj4hdnsAxVze8i7iPfQr8e4uSP3tRv0rpZcbGUDvxfQQcdwHt/e9PrMvGCsa8OqG9X3w==}
- oniguruma-to-es@4.3.3:
- resolution: {integrity: sha512-rPiZhzC3wXwE59YQMRDodUwwT9FZ9nNBwQQfsd1wfdtlKEyCdRV0avrTcSZ5xlIvGRVPd/cx6ZN45ECmS39xvg==}
-
- open@8.4.2:
- resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==}
- engines: {node: '>=12'}
+ oniguruma-to-es@4.3.4:
+ resolution: {integrity: sha512-3VhUGN3w2eYxnTzHn+ikMI+fp/96KoRSVK9/kMTcFqj1NRDh2IhQCKvYxDnWePKRXY/AqH+Fuiyb7VHSzBjHfA==}
openapi-types@12.1.3:
resolution: {integrity: sha512-N4YtSYJqghVu4iek2ZUvcN/0aqH1kRDuNqzcycDxhOUpg7GdvLa2F3DgS6yBNhInhv2r/6I0Flkn7CqL8+nIcw==}
@@ -8873,10 +8989,6 @@ packages:
resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==}
engines: {node: '>=10'}
- p-limit@4.0.0:
- resolution: {integrity: sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==}
- engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
-
p-locate@4.1.0:
resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==}
engines: {node: '>=8'}
@@ -8885,16 +8997,12 @@ packages:
resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==}
engines: {node: '>=10'}
- p-locate@6.0.0:
- resolution: {integrity: sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==}
- engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
-
p-map@4.0.0:
resolution: {integrity: sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==}
engines: {node: '>=10'}
- p-map@7.0.4:
- resolution: {integrity: sha512-tkAQEw8ysMzmkhgw8k+1U/iPhWNhykKnSk4Rd5zLoPJCuJaGRPo6YposrZgaxHKzDHdDWWZvE/Sk7hsL2X/CpQ==}
+ p-map@7.0.3:
+ resolution: {integrity: sha512-VkndIv2fIB99swvQoA65bm+fsmt6UNdGeIB0oxBs+WhAhdh08QA04JXpI7rbB9r08/nkbysKoya9rtDERYOYMA==}
engines: {node: '>=18'}
p-queue@6.6.2:
@@ -8954,10 +9062,6 @@ packages:
resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==}
engines: {node: '>=8'}
- path-exists@5.0.0:
- resolution: {integrity: sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==}
- engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
-
path-is-absolute@1.0.1:
resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==}
engines: {node: '>=0.10.0'}
@@ -9059,9 +9163,9 @@ packages:
resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==}
engines: {node: '>=12'}
- pid-port@1.0.2:
- resolution: {integrity: sha512-Khqp07zX8IJpmIg56bHrLxS3M0iSL4cq6wnMq8YE7r/hSw3Kn4QxYS6QJg8Bs22Z7CSVj7eSsxFuigYVIFWmjg==}
- engines: {node: '>=18'}
+ pid-port@2.0.0:
+ resolution: {integrity: sha512-EDmfRxLl6lkhPjDI+19l5pkII89xVsiCP3aGjS808f7M16DyCKSXEWthD/hjyDLn5I4gKqTVw7hSgdvdXRJDTw==}
+ engines: {node: '>=20'}
pify@2.3.0:
resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==}
@@ -9084,8 +9188,8 @@ packages:
piscina@4.9.2:
resolution: {integrity: sha512-Fq0FERJWFEUpB4eSY59wSNwXD4RYqR+nR/WiEVcZW8IWfVBxJJafcgTEZDQo8k3w0sUarJ8RyVbbUF4GQ2LGbQ==}
- pkce-challenge@4.1.0:
- resolution: {integrity: sha512-ZBmhE1C9LcPoH9XZSdwiPtbPHZROwAnMy+kIFQVrnMCxY4Cudlz3gBOpzilgc0jOgRaiT3sIWfpMomW2ar2orQ==}
+ pkce-challenge@5.0.1:
+ resolution: {integrity: sha512-wQ0b/W4Fr01qtpHlqSqspcj3EhBvimsdh0KlHhH8HRZnMsEa0ea2fTULOXOS9ccQr3om+GcGRk4e+isrZWV8qQ==}
engines: {node: '>=16.20.0'}
pkg-dir@4.2.0:
@@ -9108,8 +9212,8 @@ packages:
resolution: {integrity: sha512-40QW5YalBNfQo5yRYmiw7Yz6TKKVr3h6970B2YE+3fQpsWcrbj1PzJgxeJ19DRQjhMbKPIuMY8rFaXc8moolVw==}
engines: {node: '>=10.13.0'}
- pnpm@10.22.0:
- resolution: {integrity: sha512-vwSe/plbKPUn/StBrgR0zikYb37cs79UUIe9Yfu+uyv3U2LRMH/aCcLSiOHkmXh6wS1Py2F6l0cYpgUfLu50HA==}
+ pnpm@10.24.0:
+ resolution: {integrity: sha512-Af+K5xtEGZA7ZcYPstydNM+LtuBtA73hEu8496NNaQTEJLpmvqXNzxKJAjC/OflYBHMUDtnJRv7zKLblI4o0Wg==}
engines: {node: '>=18.12'}
hasBin: true
@@ -9271,10 +9375,6 @@ packages:
peerDependencies:
postcss: ^8.4.32
- postcss-selector-parser@6.1.2:
- resolution: {integrity: sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==}
- engines: {node: '>=4'}
-
postcss-selector-parser@7.1.0:
resolution: {integrity: sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==}
engines: {node: '>=4'}
@@ -9318,8 +9418,8 @@ packages:
resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==}
engines: {node: '>= 0.8.0'}
- prettier@3.6.2:
- resolution: {integrity: sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ==}
+ prettier@3.7.1:
+ resolution: {integrity: sha512-RWKXE4qB3u5Z6yz7omJkjWwmTfLdcbv44jUVHC5NpfXwFGzvpQM798FGv/6WNK879tc+Cn0AAyherCl1KjbyZQ==}
engines: {node: '>=14'}
hasBin: true
@@ -9405,6 +9505,10 @@ packages:
resolution: {integrity: sha512-OPS9kEJYVmiO48u/B9qneqhkMvgCxT+Tm28VCEJpheTpl8cJ0ffZRRNgS5mrQRTrX5yRTpaJ+hRDeefXYmmorQ==}
engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
+ ps-list@9.0.0:
+ resolution: {integrity: sha512-lxMEoIL/BQlk2KunFzxwUPwMvjFH7x7cmvzSLsSHpyMXl9FFfLUlfKrYwFc4wx/ZaIxxuXC4n8rjQ1CX/tkXVQ==}
+ engines: {node: '>=20'}
+
ps-tree@1.2.0:
resolution: {integrity: sha512-0VnamPPYHl4uaU/nSFeZZpR21QAWRz+sRv4iW9+v/GS/J5U5iZB5BNN6J0RMoOvdx2gWM2+ZFMIm58q24e4UYA==}
engines: {node: '>= 0.10'}
@@ -9530,9 +9634,9 @@ packages:
resolution: {integrity: sha512-9G8cA+tuMS75+6G/TzW8OtLzmBDMo8p1JRxN5AZ+LAp8uxGA8V8GZm4GQ4/N5QNQEnLmg6SS7wyuSmbKepiKqA==}
engines: {node: '>= 0.10'}
- rdf-canonize@3.4.0:
- resolution: {integrity: sha512-fUeWjrkOO0t1rg7B2fdyDTvngj+9RlUyL92vOdiB7c0FPguWVsniIMjEtHH+meLBO9rzkUlUzBVXgWrjI8P9LA==}
- engines: {node: '>=12'}
+ rdf-canonize@5.0.0:
+ resolution: {integrity: sha512-g8OUrgMXAR9ys/ZuJVfBr05sPPoMA7nHIVs8VEvg9QwM5W4GR2qSFEEHjsyHF1eWlBaf8Ev40WNjQFQ+nJTO3w==}
+ engines: {node: '>=18'}
re2@1.22.3:
resolution: {integrity: sha512-002aE82U91DiaUA16U6vbiJusvPXn1OWiQukOxJkVUTXbzrSuQbFNHYKcGw8QK/uifRCfjl2Hd/vXYDanKkmaQ==}
@@ -9609,10 +9713,6 @@ packages:
redis-info@3.1.0:
resolution: {integrity: sha512-ER4L9Sh/vm63DkIE0bkSjxluQlioBiBgf5w1UuldaW/3vPcecdljVDisZhmnCMvsxHNiARTTDDHGg9cGwTfrKg==}
- redis-lock@0.1.4:
- resolution: {integrity: sha512-7/+zu86XVQfJVx1nHTzux5reglDiyUCDwmW7TSlvVezfhH2YLc/Rc8NE0ejQG+8/0lwKzm29/u/4+ogKeLosiA==}
- engines: {node: '>=0.6'}
-
redis-parser@3.0.0:
resolution: {integrity: sha512-DJnGAeenTdpMEH6uAJRK/uiyEIH9WVsUmoLwzudwGJUwZPp80PDBWPHXSAGNPwNvIXAbe7MSUB1zQFugFml66A==}
engines: {node: '>=4'}
@@ -9663,9 +9763,9 @@ packages:
resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==}
engines: {node: '>=0.10.0'}
- require-in-the-middle@7.5.2:
- resolution: {integrity: sha512-gAZ+kLqBdHarXB64XpAe2VCjB7rIRv+mU8tfRWziHRJ5umKsIHN2tLLv6EtMw7WCdP19S0ERVMldNvxYCHnhSQ==}
- engines: {node: '>=8.6.0'}
+ require-in-the-middle@8.0.1:
+ resolution: {integrity: sha512-QT7FVMXfWOYFbeRBF6nu+I6tr2Tf3u0q8RIEjNob/heKY/nh7drD/k7eeMFmSQgnTtCzLDcCu/XEnpW2wk4xCQ==}
+ engines: {node: '>=9.3.0 || >=8.10.0 <9.0.0'}
require-main-filename@2.0.0:
resolution: {integrity: sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==}
@@ -9742,8 +9842,9 @@ packages:
engines: {node: '>=18.0.0', npm: '>=8.0.0'}
hasBin: true
- rrweb-cssom@0.8.0:
- resolution: {integrity: sha512-guoltQEx+9aMf2gDZ0s62EcV8lsXR+0w8915TC3ITdn2YueuNjdAYh/levpU9nFaoChh9RUS5ZdQMrKfVEN9tw==}
+ router@2.2.0:
+ resolution: {integrity: sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==}
+ engines: {node: '>= 18'}
rss-parser@3.13.0:
resolution: {integrity: sha512-7jWUBV5yGN3rqMMj7CZufl/291QAhvrrGpDNE4k/02ZchL0npisiYYqULF71jCEKoIiHvK/Q2e6IkDwPziT7+w==}
@@ -9785,8 +9886,8 @@ packages:
sanitize-html@2.17.0:
resolution: {integrity: sha512-dLAADUSS8rBwhaevT12yCezvioCA+bmUTPH/u57xKPT8d++voeYE6HeluA/bPbQ15TwDBG2ii+QZIEmYx8VdxA==}
- sass@1.94.1:
- resolution: {integrity: sha512-/YVm5FRQaRlr3oNh2LLFYne1PdPlRZGyKnHh1sLleOqLcohTR4eUUvBjBIqkl1fEXd1MGOHgzJGJh+LgTtV4KQ==}
+ sass@1.94.2:
+ resolution: {integrity: sha512-N+7WK20/wOr7CzA2snJcUSSNTCzeCGUTFY3OgeQP3mZ1aj9NMQ0mSTXwlrnd89j33zzQJGqIN52GIOmYrfq46A==}
engines: {node: '>=14.0.0'}
hasBin: true
@@ -9803,9 +9904,6 @@ packages:
secure-json-parse@2.7.0:
resolution: {integrity: sha512-6aU+Rwsezw7VR8/nyvKTx8QpWH9FrcYiXXlqC4z5d5XQBDRqtbfsRjnwGyqbi3gddNtWHuEk9OANUotL26qKUw==}
- secure-json-parse@3.0.2:
- resolution: {integrity: sha512-H6nS2o8bWfpFEV6U38sOSjS7bTbdgbCGU9wEM6W14P5H0QOsz94KCusifV44GpHDTu2nqZbuDNhTzu+mjDSw1w==}
-
secure-json-parse@4.1.0:
resolution: {integrity: sha512-l4KnYfEyqYJxDwlNVyRfO2E4NTHfMKAWdUuA8J0yve2Dz/E/PdBepY03RvyJpssIpRFwJoCD55wA+mEDs6ByWA==}
@@ -9846,15 +9944,23 @@ packages:
resolution: {integrity: sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==}
engines: {node: '>= 0.8.0'}
+ send@1.2.0:
+ resolution: {integrity: sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw==}
+ engines: {node: '>= 18'}
+
serve-static@1.16.2:
resolution: {integrity: sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==}
engines: {node: '>= 0.8.0'}
+ serve-static@2.2.0:
+ resolution: {integrity: sha512-61g9pCh0Vnh7IutZjtLGGpTA355+OPn2TyDv/6ivP2h/AdAVX9azsoxmg2/M6nZeQZNYBEwIcsne1mJd9oQItQ==}
+ engines: {node: '>= 18'}
+
set-blocking@2.0.0:
resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==}
- set-cookie-parser@2.7.2:
- resolution: {integrity: sha512-oeM1lpU/UvhTxw+g3cIfxXHyJRc/uidd3yK1P242gzHds0udQBYzs3y8j4gCCW+ZJ7ad0yctld8RYO+bdurlvw==}
+ set-cookie-parser@2.7.1:
+ resolution: {integrity: sha512-IOc8uWeOZgnb3ptbCURJWNjWUPcO3ZnTTdzsurqERrP6nPyv+paC55vJM0LpOlT2ne+Ix+9+CRG1MNLlyZ4GjQ==}
set-function-length@1.2.2:
resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==}
@@ -9891,11 +9997,8 @@ packages:
resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==}
engines: {node: '>=8'}
- shiki@3.15.0:
- resolution: {integrity: sha512-kLdkY6iV3dYbtPwS9KXU7mjfmDm25f5m0IPNFnaXO7TBPcvbUOY72PYXSuSqDzwp+vlH/d7MXpHlKO/x+QoLXw==}
-
- shimmer@1.2.1:
- resolution: {integrity: sha512-sQTKC1Re/rM6XyFM6fIAGHRPVGvyXfgzIDvzoq608vM+jeyVD0Tu1E6Np0Kc2zAIFWIj963V2800iF/9LPieQw==}
+ shiki@3.17.0:
+ resolution: {integrity: sha512-lUZfWsyW7czITYTdo/Tb6ZM4VfyXlzmKYBQBjTz+pBzPPkP08RgIt00Ls1Z50Cl3SfwJsue6WbJeF3UgqLVI9Q==}
side-channel-list@1.0.0:
resolution: {integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==}
@@ -10134,8 +10237,8 @@ packages:
standard-as-callback@2.1.0:
resolution: {integrity: sha512-qoRRSyROncaz1z0mvYqIE4lCd9p2R90i6GxW3uZv5ucSu8tU7B5HXUP1gG8pVZsYNVaXjk8ClXHPttLyxAL48A==}
- start-server-and-test@2.1.2:
- resolution: {integrity: sha512-OIjfo3G6QV9Sh6IlMqj58oZwVhPVuU/l6uVACG7YNE9kAfDvcYoPThtb0NNT3tZMMC3wOYbXnC15yiCSNFkdRg==}
+ start-server-and-test@2.1.3:
+ resolution: {integrity: sha512-k4EcbNjeg0odaDkAMlIeDVDByqX9PIgL4tivgP2tES6Zd8o+4pTq/HgbWCyA3VHIoZopB+wGnNPKYGGSByNriQ==}
engines: {node: '>=16'}
hasBin: true
@@ -10173,8 +10276,8 @@ packages:
react-dom:
optional: true
- storybook@9.1.16:
- resolution: {integrity: sha512-339U14K6l46EFyRvaPS2ZlL7v7Pb+LlcXT8KAETrGPxq8v1sAjj2HAOB6zrlAK3M+0+ricssfAwsLCwt7Eg8TQ==}
+ storybook@10.1.0:
+ resolution: {integrity: sha512-RCTybwtyQaKRoU1Z8rWGv5h6ZN3+HelSM0WMMWKBsKgXZkpQ00vro1kd/tWILawxNiU2YS9Zo+4On5hx2Rm+8w==}
hasBin: true
peerDependencies:
prettier: ^2 || ^3
@@ -10220,6 +10323,10 @@ packages:
resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==}
engines: {node: '>=12'}
+ string-width@7.2.0:
+ resolution: {integrity: sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==}
+ engines: {node: '>=18'}
+
string.prototype.trim@1.2.10:
resolution: {integrity: sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==}
engines: {node: '>= 0.4'}
@@ -10287,12 +10394,6 @@ packages:
resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==}
engines: {node: '>=8'}
- strip-literal@3.1.0:
- resolution: {integrity: sha512-8r3mkIM/2+PpjHoOtiAW8Rg3jJLHaV7xPwG+YRGrv6FP0wwk/toTpATxWYOW0BKdWwl82VT2tFYi5DlROa0Mxg==}
-
- strnum@1.1.2:
- resolution: {integrity: sha512-vrN+B7DBIoTTZjnPNewwhx6cBA/H+IS7rfW68n7XxC1y7uoiGQBxaKzqucGUgavX15dJgiGztLJ8vxuEzwqBdA==}
-
strnum@2.1.1:
resolution: {integrity: sha512-7ZvoFTiCnGxBtDqJ//Cu6fWtZtc7Y3x+QOirG15wztbdngGSkht27o2pyGWrVy0b4WAy3jbKmnoK6g5VlVNUUw==}
@@ -10358,6 +10459,10 @@ packages:
os: [darwin, linux, win32, freebsd, openbsd, netbsd, sunos, android]
hasBin: true
+ tagged-tag@1.0.0:
+ resolution: {integrity: sha512-yEFYrVhod+hdNyx7g5Bnkkb0G6si8HJurOoOEgC8B/O0uXLHlaey/65KRv6cuWBNhBgHKAROVpc7QyYqE5gFng==}
+ engines: {node: '>=20'}
+
tar-stream@3.1.7:
resolution: {integrity: sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==}
@@ -10382,10 +10487,6 @@ packages:
resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==}
engines: {node: '>=8'}
- test-exclude@7.0.1:
- resolution: {integrity: sha512-pFYqmTw68LXVjeWJMST4+borgQP2AyMNbg1BpZh9LbyhUeNkeaPF9gzfPGUAnSMV3qPYdWUwDIjjCLiSDOl7vg==}
- engines: {node: '>=18'}
-
text-decoder@1.2.3:
resolution: {integrity: sha512-3/o9z3X0X0fTupwsYvR03pJ/DjWuqqrfwBgTQzdWDiQSm9KitAyz/9WqsT2JQW7KV2m+bC2ol/zqpW37NHxLaA==}
@@ -10427,10 +10528,6 @@ packages:
resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==}
engines: {node: '>=12.0.0'}
- tinypool@1.1.1:
- resolution: {integrity: sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg==}
- engines: {node: ^18.0.0 || >=20.0.0}
-
tinyrainbow@1.2.0:
resolution: {integrity: sha512-weEDEq7Z5eTHPDh4xjX789+fHfF+P8boiFB+0vbWzpbnbsEr/GRaohi/uMKxg8RZMXnl1ItAi/IUHWMsjDV7kQ==}
engines: {node: '>=14.0.0'}
@@ -10513,10 +10610,6 @@ packages:
tr46@0.0.3:
resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==}
- tr46@5.1.1:
- resolution: {integrity: sha512-hdF5ZgjTqgAntKkklYw0R03MG2x/bSzTtkxmIRw/sTNV8YXsCJ1tfLAX23lhxhHJlEf3CRCOCGGWw3vI3GaSPw==}
- engines: {node: '>=18'}
-
tr46@6.0.0:
resolution: {integrity: sha512-bLVMLPtstlZ4iMQHpFHTR7GAGj2jxi8Dg0s2h2MafAE4uSWF98FC/3MomU51iQAMf8/qDUbKWf5GxuvvVcXEhw==}
engines: {node: '>=20'}
@@ -10568,6 +10661,9 @@ packages:
engines: {node: '>=14.16'}
hasBin: true
+ tslib@1.14.1:
+ resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==}
+
tslib@2.8.1:
resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==}
@@ -10576,6 +10672,10 @@ packages:
engines: {node: '>=18.0.0'}
hasBin: true
+ tsyringe@4.10.0:
+ resolution: {integrity: sha512-axr3IdNuVIxnaK5XGEUFTu3YmAQ6lllgrvqfEoR16g/HGnYY/6We4oWENtAnzK6/LpJ2ur9PAb80RBt7/U4ugw==}
+ engines: {node: '>= 6.0.0'}
+
tunnel-agent@0.6.0:
resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==}
@@ -10618,10 +10718,18 @@ packages:
resolution: {integrity: sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==}
engines: {node: '>=16'}
+ type-fest@5.2.0:
+ resolution: {integrity: sha512-xxCJm+Bckc6kQBknN7i9fnP/xobQRsRQxR01CztFkp/h++yfVxUUcmMgfR2HttJx/dpWjS9ubVuyspJv24Q9DA==}
+ engines: {node: '>=20'}
+
type-is@1.6.18:
resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==}
engines: {node: '>= 0.6'}
+ type-is@2.0.1:
+ resolution: {integrity: sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==}
+ engines: {node: '>= 0.6'}
+
typed-array-buffer@1.0.3:
resolution: {integrity: sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==}
engines: {node: '>= 0.4'}
@@ -10718,8 +10826,8 @@ packages:
resolution: {integrity: sha512-rvKSBiC5zqCCiDZ9kAOszZcDvdAHwwIKJG33Ykj43OKcWsnmcBRL09YTU4nOeHZ8Y2a7l1MgTd08SBe9A8Qj6A==}
engines: {node: '>=18'}
- ulid@2.4.0:
- resolution: {integrity: sha512-fIRiVTJNcSRmXKPZtGzFQv9WRrZ3M9eoptl/teFJvjOzmpU+/K/JH6HZ8deBfb5vMEpicJcLn7JmvdknlMq7Zg==}
+ ulid@3.0.1:
+ resolution: {integrity: sha512-dPJyqPzx8preQhqq24bBG1YNkvigm87K8kVEHCD+ruZg24t6IFEFv00xMWfxcC4djmFtiTLdFuADn4+DOz6R7Q==}
hasBin: true
unbox-primitive@1.1.0:
@@ -10738,10 +10846,6 @@ packages:
undici-types@7.16.0:
resolution: {integrity: sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==}
- undici@5.29.0:
- resolution: {integrity: sha512-raqeBD6NQK4SkWhQzeYKd1KmIG6dllBOTt55Rmkt4HtI9mwdWtJljnrXjAFUBLTSN67HWrOIZ3EPF4kjUw80Bg==}
- engines: {node: '>=14.0'}
-
undici@6.22.0:
resolution: {integrity: sha512-hU/10obOIu62MGYjdskASR3CUAiYaFTtC9Pa6vHyf//mAipSvSQg6od2CnJswq7fvzNS3zJhxoRkgNVaHurWKw==}
engines: {node: '>=18.17'}
@@ -10750,10 +10854,6 @@ packages:
resolution: {integrity: sha512-QEg3HPMll0o3t2ourKwOeUAZ159Kn9mx5pnzHRQO8+Wixmh88YdZRiIwat0iNzNNXn0yoEtXJqFpyW7eM8BV7g==}
engines: {node: '>=20.18.1'}
- unicorn-magic@0.1.0:
- resolution: {integrity: sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==}
- engines: {node: '>=18'}
-
unicorn-magic@0.3.0:
resolution: {integrity: sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==}
engines: {node: '>=18'}
@@ -10803,6 +10903,10 @@ packages:
resolution: {integrity: sha512-4/u/j4FrCKdi17jaxuJA0jClGxB1AvU2hw/IuayPc4ay1XGaJs/rbb4v5WKwAjNifjmXK9PIFyuPiaK8azyR9w==}
engines: {node: '>=14.0.0'}
+ unplugin@2.3.10:
+ resolution: {integrity: sha512-6NCPkv1ClwH+/BGE9QeoTIl09nuiAt0gS28nn1PvYXsGKRwM2TCbFA2QiilmehPDTXIe684k4rZI1yl3A1PCUw==}
+ engines: {node: '>=18.12.0'}
+
until-async@3.0.2:
resolution: {integrity: sha512-IiSk4HlzAMqTUseHHe3VhIGyuFmN90zMTpD3Z3y8jeQbzLIq500MVM7Jq2vUAnTKAFPJrqwkzr6PoTcPhGcOiw==}
@@ -10819,6 +10923,11 @@ packages:
uri-js@4.4.1:
resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==}
+ use-sync-external-store@1.6.0:
+ resolution: {integrity: sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w==}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0
+
utf-8-validate@6.0.5:
resolution: {integrity: sha512-EYZR+OpIXp9Y1eG1iueg8KRsY8TuT8VNgnanZ0uA3STqhHQTLwbl+WX76/9X5OY12yQubymBpaBSmMPkSTQcKA==}
engines: {node: '>=6.14.2'}
@@ -10880,11 +10989,6 @@ packages:
vfile@6.0.3:
resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==}
- vite-node@3.2.4:
- resolution: {integrity: sha512-EbKSKh+bh1E1IFxeO0pg1n4dvoOTt0UDiXMd/qn++r98+jPO1xtJilvXldeuQ8giIB5IkpjCgMleHMNEsGH6pg==}
- engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0}
- hasBin: true
-
vite-plugin-glsl@1.5.4:
resolution: {integrity: sha512-EUmwL+IDK+dGDAlaKm89++k8aJ4qmHjLQxrngww3GLOOAQ4aZ48o9YR1ie7XPe08iDWlG+9Uh5V7oiZcXTUbyA==}
engines: {node: '>= 20.17.0', npm: '>= 10.8.3'}
@@ -10901,8 +11005,8 @@ packages:
vite-plugin-turbosnap@1.0.3:
resolution: {integrity: sha512-p4D8CFVhZS412SyQX125qxyzOgIFouwOcvjZWk6bQbNPR1wtaEzFT6jZxAjf1dejlGqa6fqHcuCvQea6EWUkUA==}
- vite@7.2.2:
- resolution: {integrity: sha512-BxAKBWmIbrDgrokdGZH1IgkIk/5mMHDreLDmCJ0qpyJaAteP8NvMhkwr/ZCQNqNH97bw/dANTE9PDzqwJghfMQ==}
+ vite@7.2.4:
+ resolution: {integrity: sha512-NL8jTlbo0Tn4dUEXEsUg8KeyG/Lkmc4Fnzb8JXN/Ykm9G4HNImjtABMJgkQoVjOBN/j2WAwDTRytdqJbZsah7w==}
engines: {node: ^20.19.0 || >=22.12.0}
hasBin: true
peerDependencies:
@@ -10952,26 +11056,35 @@ packages:
peerDependencies:
vitest: '>=3'
- vitest@3.2.4:
- resolution: {integrity: sha512-LUCP5ev3GURDysTWiP47wRRUpLKMOfPh+yKTx3kVIEiu5KOMeqzpnYNsKyOoVrULivR8tLcks4+lga33Whn90A==}
- engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0}
+ vitest@4.0.13:
+ resolution: {integrity: sha512-QSD4I0fN6uZQfftryIXuqvqgBxTvJ3ZNkF6RWECd82YGAYAfhcppBLFXzXJHQAAhVFyYEuFTrq6h0hQqjB7jIQ==}
+ engines: {node: ^20.0.0 || ^22.0.0 || >=24.0.0}
hasBin: true
peerDependencies:
'@edge-runtime/vm': '*'
+ '@opentelemetry/api': ^1.9.0
'@types/debug': ^4.1.12
- '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0
- '@vitest/browser': 3.2.4
- '@vitest/ui': 3.2.4
+ '@types/node': ^20.0.0 || ^22.0.0 || >=24.0.0
+ '@vitest/browser-playwright': 4.0.13
+ '@vitest/browser-preview': 4.0.13
+ '@vitest/browser-webdriverio': 4.0.13
+ '@vitest/ui': 4.0.13
happy-dom: '*'
jsdom: '*'
peerDependenciesMeta:
'@edge-runtime/vm':
optional: true
+ '@opentelemetry/api':
+ optional: true
'@types/debug':
optional: true
'@types/node':
optional: true
- '@vitest/browser':
+ '@vitest/browser-playwright':
+ optional: true
+ '@vitest/browser-preview':
+ optional: true
+ '@vitest/browser-webdriverio':
optional: true
'@vitest/ui':
optional: true
@@ -10980,24 +11093,24 @@ packages:
jsdom:
optional: true
- vitest@4.0.10:
- resolution: {integrity: sha512-2Fqty3MM9CDwOVet/jaQalYlbcjATZwPYGcqpiYQqgQ/dLC7GuHdISKgTYIVF/kaishKxLzleKWWfbSDklyIKg==}
+ vitest@4.0.14:
+ resolution: {integrity: sha512-d9B2J9Cm9dN9+6nxMnnNJKJCtcyKfnHj15N6YNJfaFHRLua/d3sRKU9RuKmO9mB0XdFtUizlxfz/VPbd3OxGhw==}
engines: {node: ^20.0.0 || ^22.0.0 || >=24.0.0}
hasBin: true
peerDependencies:
'@edge-runtime/vm': '*'
- '@types/debug': ^4.1.12
+ '@opentelemetry/api': ^1.9.0
'@types/node': ^20.0.0 || ^22.0.0 || >=24.0.0
- '@vitest/browser-playwright': 4.0.10
- '@vitest/browser-preview': 4.0.10
- '@vitest/browser-webdriverio': 4.0.10
- '@vitest/ui': 4.0.10
+ '@vitest/browser-playwright': 4.0.14
+ '@vitest/browser-preview': 4.0.14
+ '@vitest/browser-webdriverio': 4.0.14
+ '@vitest/ui': 4.0.14
happy-dom: '*'
jsdom: '*'
peerDependenciesMeta:
'@edge-runtime/vm':
optional: true
- '@types/debug':
+ '@opentelemetry/api':
optional: true
'@types/node':
optional: true
@@ -11046,8 +11159,8 @@ packages:
vue-component-type-helpers@2.2.12:
resolution: {integrity: sha512-YbGqHZ5/eW4SnkPNR44mKVc6ZKQoRs/Rux1sxC6rdwXb4qpbOSYfDr9DsTHolOTGmIKgM9j141mZbBeg05R1pw==}
- vue-component-type-helpers@3.1.4:
- resolution: {integrity: sha512-Uws7Ew1OzTTqHW8ZVl/qLl/HB+jf08M0NdFONbVWAx0N4gMLK8yfZDgeB77hDnBmaigWWEn5qP8T9BG59jIeyQ==}
+ vue-component-type-helpers@3.1.5:
+ resolution: {integrity: sha512-7V3yJuNWW7/1jxCcI1CswnpDsvs02Qcx/N43LkV+ZqhLj2PKj50slUflHAroNkN4UWiYfzMUUUXiNuv9khmSpQ==}
vue-demi@0.14.10:
resolution: {integrity: sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==}
@@ -11076,14 +11189,14 @@ packages:
peerDependencies:
vue: '>=2'
- vue-tsc@3.1.4:
- resolution: {integrity: sha512-GsRJxttj4WkmXW/zDwYPGMJAN3np/4jTzoDFQTpTsI5Vg/JKMWamBwamlmLihgSVHO66y9P7GX+uoliYxeI4Hw==}
+ vue-tsc@3.1.5:
+ resolution: {integrity: sha512-L/G9IUjOWhBU0yun89rv8fKqmKC+T0HfhrFjlIml71WpfBv9eb4E9Bev8FMbyueBIU9vxQqbd+oOsVcDa5amGw==}
hasBin: true
peerDependencies:
typescript: '>=5.0.0'
- vue@3.5.24:
- resolution: {integrity: sha512-uTHDOpVQTMjcGgrqFPSb8iO2m1DUvo+WbGqoXQz8Y1CeBYQ0FXf2z1gLRaBtHjlRz7zZUBHxjVB5VTLzYkvftg==}
+ vue@3.5.25:
+ resolution: {integrity: sha512-YLVdgv2K13WJ6n+kD5owehKtEXwdwXuj2TTyJMsO7pSeKw2bfRNZGjhB7YzrpbMYj5b5QsUebHpOqR3R3ziy/g==}
peerDependencies:
typescript: '*'
peerDependenciesMeta:
@@ -11099,9 +11212,9 @@ packages:
resolution: {integrity: sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==}
engines: {node: '>=18'}
- wait-on@8.0.5:
- resolution: {integrity: sha512-J3WlS0txVHkhLRb2FsmRg3dkMTCV1+M6Xra3Ho7HzZDHpE7DCOnoSoCJsZotrmW3uRMhvIJGSKUKrh/MeF4iag==}
- engines: {node: '>=12.0.0'}
+ wait-on@9.0.3:
+ resolution: {integrity: sha512-13zBnyYvFDW1rBvWiJ6Av3ymAaq8EDQuvxZnPIw3g04UqGi4TyoIJABmfJ6zrvKo9yeFQExNkOk7idQbDJcuKA==}
+ engines: {node: '>=20.0.0'}
hasBin: true
walker@1.0.8:
@@ -11131,10 +11244,6 @@ packages:
webidl-conversions@3.0.1:
resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==}
- webidl-conversions@7.0.0:
- resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==}
- engines: {node: '>=12'}
-
webidl-conversions@8.0.0:
resolution: {integrity: sha512-n4W4YFyz5JzOfQeA8oN7dUYpR+MBP3PIUsn2jLjWXwK5ASUzt0Jc/A5sAUZoCYFJRGF0FBKJ+1JjN43rNdsQzA==}
engines: {node: '>=20'}
@@ -11154,10 +11263,6 @@ packages:
resolution: {integrity: sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==}
engines: {node: '>=18'}
- whatwg-url@14.2.0:
- resolution: {integrity: sha512-De72GdQZzNTUBBChsXueQUnPKDkg/5A5zp7pFDuQAj5UFoENpiACU0wlCvzpAGnTkj++ihpKwKyYewn/XNUbKw==}
- engines: {node: '>=18'}
-
whatwg-url@15.1.0:
resolution: {integrity: sha512-2ytDk0kiEj/yu90JOAp44PVPUkO9+jVhyf+SybKlRHSDlvOOZhdPIrr7xTH64l4WixO2cP+wQIcgujkGBPPz6g==}
engines: {node: '>=20'}
@@ -11226,6 +11331,10 @@ packages:
resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==}
engines: {node: '>=12'}
+ wrap-ansi@9.0.2:
+ resolution: {integrity: sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==}
+ engines: {node: '>=18'}
+
wrappy@1.0.2:
resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==}
@@ -11307,6 +11416,10 @@ packages:
resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==}
engines: {node: '>=12'}
+ yargs-parser@22.0.0:
+ resolution: {integrity: sha512-rwu/ClNdSMpkSrUb+d6BRsSkLUq1fmfsY6TOpYzTwvwkg1/NRG85KBy3kq++A8LKQwX6lsu+aWad+2khvuXrqw==}
+ engines: {node: ^20.19.0 || ^22.12.0 || >=23}
+
yargs@15.4.1:
resolution: {integrity: sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==}
engines: {node: '>=8'}
@@ -11319,6 +11432,10 @@ packages:
resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==}
engines: {node: '>=12'}
+ yargs@18.0.0:
+ resolution: {integrity: sha512-4UEqdc2RYGHZc7Doyqkrqiln3p9X2DZVxaGbwhn2pi7MrRagKaOcIKe8L3OxYcbhXLgLFUS3zAYuQjKBQgmuNg==}
+ engines: {node: ^20.19.0 || ^22.12.0 || >=23}
+
yauzl@2.10.0:
resolution: {integrity: sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==}
@@ -11330,10 +11447,6 @@ packages:
resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==}
engines: {node: '>=10'}
- yocto-queue@1.2.2:
- resolution: {integrity: sha512-4LCcse/U2MHZ63HAJVE+v71o7yOdIe4cZ70Wpf8D/IyjDKYQLV5GD46B+hSTjJsvV5PztjvHoU580EftxjDZFQ==}
- engines: {node: '>=12.20'}
-
yoctocolors-cjs@2.1.3:
resolution: {integrity: sha512-U/PBtDf35ff0D8X8D0jfdzHYEPFxAI7jJlxZXwCSez5M3190m+QobIfh+sWDWSHMCWWJN2AWamkegn6vr6YBTw==}
engines: {node: '>=18'}
@@ -11356,11 +11469,6 @@ snapshots:
'@adobe/css-tools@4.4.4': {}
- '@ampproject/remapping@2.3.0':
- dependencies:
- '@jridgewell/gen-mapping': 0.3.13
- '@jridgewell/trace-mapping': 0.3.31
-
'@analytics/cookie-utils@0.2.14':
dependencies:
'@analytics/global-storage-utils': 0.1.9
@@ -11412,15 +11520,7 @@ snapshots:
transitivePeerDependencies:
- supports-color
- '@asamuzakjp/css-color@3.2.0':
- dependencies:
- '@csstools/css-calc': 2.1.4(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4)
- '@csstools/css-color-parser': 3.1.0(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4)
- '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4)
- '@csstools/css-tokenizer': 3.0.4
- lru-cache: 10.4.3
-
- '@asamuzakjp/css-color@4.1.0':
+ '@asamuzakjp/css-color@4.0.5':
dependencies:
'@csstools/css-calc': 2.1.4(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4)
'@csstools/css-color-parser': 3.1.0(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4)
@@ -11488,29 +11588,29 @@ snapshots:
'@smithy/util-utf8': 2.3.0
tslib: 2.8.1
- '@aws-sdk/client-s3@3.936.0':
+ '@aws-sdk/client-s3@3.940.0':
dependencies:
'@aws-crypto/sha1-browser': 5.2.0
'@aws-crypto/sha256-browser': 5.2.0
'@aws-crypto/sha256-js': 5.2.0
- '@aws-sdk/core': 3.936.0
- '@aws-sdk/credential-provider-node': 3.936.0
+ '@aws-sdk/core': 3.940.0
+ '@aws-sdk/credential-provider-node': 3.940.0
'@aws-sdk/middleware-bucket-endpoint': 3.936.0
'@aws-sdk/middleware-expect-continue': 3.936.0
- '@aws-sdk/middleware-flexible-checksums': 3.936.0
+ '@aws-sdk/middleware-flexible-checksums': 3.940.0
'@aws-sdk/middleware-host-header': 3.936.0
'@aws-sdk/middleware-location-constraint': 3.936.0
'@aws-sdk/middleware-logger': 3.936.0
'@aws-sdk/middleware-recursion-detection': 3.936.0
- '@aws-sdk/middleware-sdk-s3': 3.936.0
+ '@aws-sdk/middleware-sdk-s3': 3.940.0
'@aws-sdk/middleware-ssec': 3.936.0
- '@aws-sdk/middleware-user-agent': 3.936.0
+ '@aws-sdk/middleware-user-agent': 3.940.0
'@aws-sdk/region-config-resolver': 3.936.0
- '@aws-sdk/signature-v4-multi-region': 3.936.0
+ '@aws-sdk/signature-v4-multi-region': 3.940.0
'@aws-sdk/types': 3.936.0
'@aws-sdk/util-endpoints': 3.936.0
'@aws-sdk/util-user-agent-browser': 3.936.0
- '@aws-sdk/util-user-agent-node': 3.936.0
+ '@aws-sdk/util-user-agent-node': 3.940.0
'@smithy/config-resolver': 4.4.3
'@smithy/core': 3.18.5
'@smithy/eventstream-serde-browser': 4.2.5
@@ -11548,7 +11648,7 @@ snapshots:
transitivePeerDependencies:
- aws-crt
- '@aws-sdk/client-ses@3.936.0':
+ '@aws-sdk/client-sesv2@3.938.0':
dependencies:
'@aws-crypto/sha256-browser': 5.2.0
'@aws-crypto/sha256-js': 5.2.0
@@ -11559,6 +11659,7 @@ snapshots:
'@aws-sdk/middleware-recursion-detection': 3.936.0
'@aws-sdk/middleware-user-agent': 3.936.0
'@aws-sdk/region-config-resolver': 3.936.0
+ '@aws-sdk/signature-v4-multi-region': 3.936.0
'@aws-sdk/types': 3.936.0
'@aws-sdk/util-endpoints': 3.936.0
'@aws-sdk/util-user-agent-browser': 3.936.0
@@ -11588,7 +11689,6 @@ snapshots:
'@smithy/util-middleware': 4.2.5
'@smithy/util-retry': 4.2.5
'@smithy/util-utf8': 4.2.0
- '@smithy/util-waiter': 4.2.5
tslib: 2.8.1
transitivePeerDependencies:
- aws-crt
@@ -11636,6 +11736,49 @@ snapshots:
transitivePeerDependencies:
- aws-crt
+ '@aws-sdk/client-sso@3.940.0':
+ dependencies:
+ '@aws-crypto/sha256-browser': 5.2.0
+ '@aws-crypto/sha256-js': 5.2.0
+ '@aws-sdk/core': 3.940.0
+ '@aws-sdk/middleware-host-header': 3.936.0
+ '@aws-sdk/middleware-logger': 3.936.0
+ '@aws-sdk/middleware-recursion-detection': 3.936.0
+ '@aws-sdk/middleware-user-agent': 3.940.0
+ '@aws-sdk/region-config-resolver': 3.936.0
+ '@aws-sdk/types': 3.936.0
+ '@aws-sdk/util-endpoints': 3.936.0
+ '@aws-sdk/util-user-agent-browser': 3.936.0
+ '@aws-sdk/util-user-agent-node': 3.940.0
+ '@smithy/config-resolver': 4.4.3
+ '@smithy/core': 3.18.5
+ '@smithy/fetch-http-handler': 5.3.6
+ '@smithy/hash-node': 4.2.5
+ '@smithy/invalid-dependency': 4.2.5
+ '@smithy/middleware-content-length': 4.2.5
+ '@smithy/middleware-endpoint': 4.3.12
+ '@smithy/middleware-retry': 4.4.12
+ '@smithy/middleware-serde': 4.2.6
+ '@smithy/middleware-stack': 4.2.5
+ '@smithy/node-config-provider': 4.3.5
+ '@smithy/node-http-handler': 4.4.5
+ '@smithy/protocol-http': 5.3.5
+ '@smithy/smithy-client': 4.9.8
+ '@smithy/types': 4.9.0
+ '@smithy/url-parser': 4.2.5
+ '@smithy/util-base64': 4.3.0
+ '@smithy/util-body-length-browser': 4.2.0
+ '@smithy/util-body-length-node': 4.2.1
+ '@smithy/util-defaults-mode-browser': 4.3.11
+ '@smithy/util-defaults-mode-node': 4.2.14
+ '@smithy/util-endpoints': 3.2.5
+ '@smithy/util-middleware': 4.2.5
+ '@smithy/util-retry': 4.2.5
+ '@smithy/util-utf8': 4.2.0
+ tslib: 2.8.1
+ transitivePeerDependencies:
+ - aws-crt
+
'@aws-sdk/core@3.936.0':
dependencies:
'@aws-sdk/types': 3.936.0
@@ -11652,6 +11795,22 @@ snapshots:
'@smithy/util-utf8': 4.2.0
tslib: 2.8.1
+ '@aws-sdk/core@3.940.0':
+ dependencies:
+ '@aws-sdk/types': 3.936.0
+ '@aws-sdk/xml-builder': 3.930.0
+ '@smithy/core': 3.18.5
+ '@smithy/node-config-provider': 4.3.5
+ '@smithy/property-provider': 4.2.5
+ '@smithy/protocol-http': 5.3.5
+ '@smithy/signature-v4': 5.3.5
+ '@smithy/smithy-client': 4.9.8
+ '@smithy/types': 4.9.0
+ '@smithy/util-base64': 4.3.0
+ '@smithy/util-middleware': 4.2.5
+ '@smithy/util-utf8': 4.2.0
+ tslib: 2.8.1
+
'@aws-sdk/credential-provider-env@3.936.0':
dependencies:
'@aws-sdk/core': 3.936.0
@@ -11660,6 +11819,14 @@ snapshots:
'@smithy/types': 4.9.0
tslib: 2.8.1
+ '@aws-sdk/credential-provider-env@3.940.0':
+ dependencies:
+ '@aws-sdk/core': 3.940.0
+ '@aws-sdk/types': 3.936.0
+ '@smithy/property-provider': 4.2.5
+ '@smithy/types': 4.9.0
+ tslib: 2.8.1
+
'@aws-sdk/credential-provider-http@3.936.0':
dependencies:
'@aws-sdk/core': 3.936.0
@@ -11673,6 +11840,19 @@ snapshots:
'@smithy/util-stream': 4.5.6
tslib: 2.8.1
+ '@aws-sdk/credential-provider-http@3.940.0':
+ dependencies:
+ '@aws-sdk/core': 3.940.0
+ '@aws-sdk/types': 3.936.0
+ '@smithy/fetch-http-handler': 5.3.6
+ '@smithy/node-http-handler': 4.4.5
+ '@smithy/property-provider': 4.2.5
+ '@smithy/protocol-http': 5.3.5
+ '@smithy/smithy-client': 4.9.8
+ '@smithy/types': 4.9.0
+ '@smithy/util-stream': 4.5.6
+ tslib: 2.8.1
+
'@aws-sdk/credential-provider-ini@3.936.0':
dependencies:
'@aws-sdk/core': 3.936.0
@@ -11692,6 +11872,25 @@ snapshots:
transitivePeerDependencies:
- aws-crt
+ '@aws-sdk/credential-provider-ini@3.940.0':
+ dependencies:
+ '@aws-sdk/core': 3.940.0
+ '@aws-sdk/credential-provider-env': 3.940.0
+ '@aws-sdk/credential-provider-http': 3.940.0
+ '@aws-sdk/credential-provider-login': 3.940.0
+ '@aws-sdk/credential-provider-process': 3.940.0
+ '@aws-sdk/credential-provider-sso': 3.940.0
+ '@aws-sdk/credential-provider-web-identity': 3.940.0
+ '@aws-sdk/nested-clients': 3.940.0
+ '@aws-sdk/types': 3.936.0
+ '@smithy/credential-provider-imds': 4.2.5
+ '@smithy/property-provider': 4.2.5
+ '@smithy/shared-ini-file-loader': 4.4.0
+ '@smithy/types': 4.9.0
+ tslib: 2.8.1
+ transitivePeerDependencies:
+ - aws-crt
+
'@aws-sdk/credential-provider-login@3.936.0':
dependencies:
'@aws-sdk/core': 3.936.0
@@ -11705,6 +11904,19 @@ snapshots:
transitivePeerDependencies:
- aws-crt
+ '@aws-sdk/credential-provider-login@3.940.0':
+ dependencies:
+ '@aws-sdk/core': 3.940.0
+ '@aws-sdk/nested-clients': 3.940.0
+ '@aws-sdk/types': 3.936.0
+ '@smithy/property-provider': 4.2.5
+ '@smithy/protocol-http': 5.3.5
+ '@smithy/shared-ini-file-loader': 4.4.0
+ '@smithy/types': 4.9.0
+ tslib: 2.8.1
+ transitivePeerDependencies:
+ - aws-crt
+
'@aws-sdk/credential-provider-node@3.936.0':
dependencies:
'@aws-sdk/credential-provider-env': 3.936.0
@@ -11722,6 +11934,23 @@ snapshots:
transitivePeerDependencies:
- aws-crt
+ '@aws-sdk/credential-provider-node@3.940.0':
+ dependencies:
+ '@aws-sdk/credential-provider-env': 3.940.0
+ '@aws-sdk/credential-provider-http': 3.940.0
+ '@aws-sdk/credential-provider-ini': 3.940.0
+ '@aws-sdk/credential-provider-process': 3.940.0
+ '@aws-sdk/credential-provider-sso': 3.940.0
+ '@aws-sdk/credential-provider-web-identity': 3.940.0
+ '@aws-sdk/types': 3.936.0
+ '@smithy/credential-provider-imds': 4.2.5
+ '@smithy/property-provider': 4.2.5
+ '@smithy/shared-ini-file-loader': 4.4.0
+ '@smithy/types': 4.9.0
+ tslib: 2.8.1
+ transitivePeerDependencies:
+ - aws-crt
+
'@aws-sdk/credential-provider-process@3.936.0':
dependencies:
'@aws-sdk/core': 3.936.0
@@ -11731,6 +11960,15 @@ snapshots:
'@smithy/types': 4.9.0
tslib: 2.8.1
+ '@aws-sdk/credential-provider-process@3.940.0':
+ dependencies:
+ '@aws-sdk/core': 3.940.0
+ '@aws-sdk/types': 3.936.0
+ '@smithy/property-provider': 4.2.5
+ '@smithy/shared-ini-file-loader': 4.4.0
+ '@smithy/types': 4.9.0
+ tslib: 2.8.1
+
'@aws-sdk/credential-provider-sso@3.936.0':
dependencies:
'@aws-sdk/client-sso': 3.936.0
@@ -11744,6 +11982,19 @@ snapshots:
transitivePeerDependencies:
- aws-crt
+ '@aws-sdk/credential-provider-sso@3.940.0':
+ dependencies:
+ '@aws-sdk/client-sso': 3.940.0
+ '@aws-sdk/core': 3.940.0
+ '@aws-sdk/token-providers': 3.940.0
+ '@aws-sdk/types': 3.936.0
+ '@smithy/property-provider': 4.2.5
+ '@smithy/shared-ini-file-loader': 4.4.0
+ '@smithy/types': 4.9.0
+ tslib: 2.8.1
+ transitivePeerDependencies:
+ - aws-crt
+
'@aws-sdk/credential-provider-web-identity@3.936.0':
dependencies:
'@aws-sdk/core': 3.936.0
@@ -11756,9 +12007,21 @@ snapshots:
transitivePeerDependencies:
- aws-crt
- '@aws-sdk/lib-storage@3.936.0(@aws-sdk/client-s3@3.936.0)':
+ '@aws-sdk/credential-provider-web-identity@3.940.0':
+ dependencies:
+ '@aws-sdk/core': 3.940.0
+ '@aws-sdk/nested-clients': 3.940.0
+ '@aws-sdk/types': 3.936.0
+ '@smithy/property-provider': 4.2.5
+ '@smithy/shared-ini-file-loader': 4.4.0
+ '@smithy/types': 4.9.0
+ tslib: 2.8.1
+ transitivePeerDependencies:
+ - aws-crt
+
+ '@aws-sdk/lib-storage@3.940.0(@aws-sdk/client-s3@3.940.0)':
dependencies:
- '@aws-sdk/client-s3': 3.936.0
+ '@aws-sdk/client-s3': 3.940.0
'@smithy/abort-controller': 4.2.5
'@smithy/middleware-endpoint': 4.3.12
'@smithy/smithy-client': 4.9.8
@@ -11784,12 +12047,12 @@ snapshots:
'@smithy/types': 4.9.0
tslib: 2.8.1
- '@aws-sdk/middleware-flexible-checksums@3.936.0':
+ '@aws-sdk/middleware-flexible-checksums@3.940.0':
dependencies:
'@aws-crypto/crc32': 5.2.0
'@aws-crypto/crc32c': 5.2.0
'@aws-crypto/util': 5.2.0
- '@aws-sdk/core': 3.936.0
+ '@aws-sdk/core': 3.940.0
'@aws-sdk/types': 3.936.0
'@smithy/is-array-buffer': 4.2.0
'@smithy/node-config-provider': 4.3.5
@@ -11844,6 +12107,23 @@ snapshots:
'@smithy/util-utf8': 4.2.0
tslib: 2.8.1
+ '@aws-sdk/middleware-sdk-s3@3.940.0':
+ dependencies:
+ '@aws-sdk/core': 3.940.0
+ '@aws-sdk/types': 3.936.0
+ '@aws-sdk/util-arn-parser': 3.893.0
+ '@smithy/core': 3.18.5
+ '@smithy/node-config-provider': 4.3.5
+ '@smithy/protocol-http': 5.3.5
+ '@smithy/signature-v4': 5.3.5
+ '@smithy/smithy-client': 4.9.8
+ '@smithy/types': 4.9.0
+ '@smithy/util-config-provider': 4.2.0
+ '@smithy/util-middleware': 4.2.5
+ '@smithy/util-stream': 4.5.6
+ '@smithy/util-utf8': 4.2.0
+ tslib: 2.8.1
+
'@aws-sdk/middleware-ssec@3.936.0':
dependencies:
'@aws-sdk/types': 3.936.0
@@ -11860,6 +12140,16 @@ snapshots:
'@smithy/types': 4.9.0
tslib: 2.8.1
+ '@aws-sdk/middleware-user-agent@3.940.0':
+ dependencies:
+ '@aws-sdk/core': 3.940.0
+ '@aws-sdk/types': 3.936.0
+ '@aws-sdk/util-endpoints': 3.936.0
+ '@smithy/core': 3.18.5
+ '@smithy/protocol-http': 5.3.5
+ '@smithy/types': 4.9.0
+ tslib: 2.8.1
+
'@aws-sdk/nested-clients@3.936.0':
dependencies:
'@aws-crypto/sha256-browser': 5.2.0
@@ -11903,6 +12193,49 @@ snapshots:
transitivePeerDependencies:
- aws-crt
+ '@aws-sdk/nested-clients@3.940.0':
+ dependencies:
+ '@aws-crypto/sha256-browser': 5.2.0
+ '@aws-crypto/sha256-js': 5.2.0
+ '@aws-sdk/core': 3.940.0
+ '@aws-sdk/middleware-host-header': 3.936.0
+ '@aws-sdk/middleware-logger': 3.936.0
+ '@aws-sdk/middleware-recursion-detection': 3.936.0
+ '@aws-sdk/middleware-user-agent': 3.940.0
+ '@aws-sdk/region-config-resolver': 3.936.0
+ '@aws-sdk/types': 3.936.0
+ '@aws-sdk/util-endpoints': 3.936.0
+ '@aws-sdk/util-user-agent-browser': 3.936.0
+ '@aws-sdk/util-user-agent-node': 3.940.0
+ '@smithy/config-resolver': 4.4.3
+ '@smithy/core': 3.18.5
+ '@smithy/fetch-http-handler': 5.3.6
+ '@smithy/hash-node': 4.2.5
+ '@smithy/invalid-dependency': 4.2.5
+ '@smithy/middleware-content-length': 4.2.5
+ '@smithy/middleware-endpoint': 4.3.12
+ '@smithy/middleware-retry': 4.4.12
+ '@smithy/middleware-serde': 4.2.6
+ '@smithy/middleware-stack': 4.2.5
+ '@smithy/node-config-provider': 4.3.5
+ '@smithy/node-http-handler': 4.4.5
+ '@smithy/protocol-http': 5.3.5
+ '@smithy/smithy-client': 4.9.8
+ '@smithy/types': 4.9.0
+ '@smithy/url-parser': 4.2.5
+ '@smithy/util-base64': 4.3.0
+ '@smithy/util-body-length-browser': 4.2.0
+ '@smithy/util-body-length-node': 4.2.1
+ '@smithy/util-defaults-mode-browser': 4.3.11
+ '@smithy/util-defaults-mode-node': 4.2.14
+ '@smithy/util-endpoints': 3.2.5
+ '@smithy/util-middleware': 4.2.5
+ '@smithy/util-retry': 4.2.5
+ '@smithy/util-utf8': 4.2.0
+ tslib: 2.8.1
+ transitivePeerDependencies:
+ - aws-crt
+
'@aws-sdk/region-config-resolver@3.936.0':
dependencies:
'@aws-sdk/types': 3.936.0
@@ -11920,6 +12253,15 @@ snapshots:
'@smithy/types': 4.9.0
tslib: 2.8.1
+ '@aws-sdk/signature-v4-multi-region@3.940.0':
+ dependencies:
+ '@aws-sdk/middleware-sdk-s3': 3.940.0
+ '@aws-sdk/types': 3.936.0
+ '@smithy/protocol-http': 5.3.5
+ '@smithy/signature-v4': 5.3.5
+ '@smithy/types': 4.9.0
+ tslib: 2.8.1
+
'@aws-sdk/token-providers@3.936.0':
dependencies:
'@aws-sdk/core': 3.936.0
@@ -11932,6 +12274,18 @@ snapshots:
transitivePeerDependencies:
- aws-crt
+ '@aws-sdk/token-providers@3.940.0':
+ dependencies:
+ '@aws-sdk/core': 3.940.0
+ '@aws-sdk/nested-clients': 3.940.0
+ '@aws-sdk/types': 3.936.0
+ '@smithy/property-provider': 4.2.5
+ '@smithy/shared-ini-file-loader': 4.4.0
+ '@smithy/types': 4.9.0
+ tslib: 2.8.1
+ transitivePeerDependencies:
+ - aws-crt
+
'@aws-sdk/types@3.936.0':
dependencies:
'@smithy/types': 4.9.0
@@ -11968,6 +12322,14 @@ snapshots:
'@smithy/types': 4.9.0
tslib: 2.8.1
+ '@aws-sdk/util-user-agent-node@3.940.0':
+ dependencies:
+ '@aws-sdk/middleware-user-agent': 3.940.0
+ '@aws-sdk/types': 3.936.0
+ '@smithy/node-config-provider': 4.3.5
+ '@smithy/types': 4.9.0
+ tslib: 2.8.1
+
'@aws-sdk/xml-builder@3.930.0':
dependencies:
'@smithy/types': 4.9.0
@@ -12241,12 +12603,14 @@ snapshots:
'@cropper/utils@2.1.0': {}
- '@csstools/color-helpers@5.1.0': {}
+ '@csstools/color-helpers@5.1.0':
+ optional: true
'@csstools/css-calc@2.1.4(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4)':
dependencies:
'@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4)
'@csstools/css-tokenizer': 3.0.4
+ optional: true
'@csstools/css-color-parser@3.1.0(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4)':
dependencies:
@@ -12254,15 +12618,18 @@ snapshots:
'@csstools/css-calc': 2.1.4(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4)
'@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4)
'@csstools/css-tokenizer': 3.0.4
+ optional: true
'@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4)':
dependencies:
'@csstools/css-tokenizer': 3.0.4
+ optional: true
'@csstools/css-syntax-patches-for-csstree@1.0.16':
optional: true
- '@csstools/css-tokenizer@3.0.4': {}
+ '@csstools/css-tokenizer@3.0.4':
+ optional: true
'@cypress/request@3.0.9':
dependencies:
@@ -12292,13 +12659,10 @@ snapshots:
transitivePeerDependencies:
- supports-color
- '@digitalbazaar/http-client@3.4.1(web-streams-polyfill@3.3.3)':
+ '@digitalbazaar/http-client@4.2.0':
dependencies:
- ky: 0.33.3
- ky-universal: 0.11.0(ky@0.33.3)(web-streams-polyfill@3.3.3)
- undici: 5.29.0
- transitivePeerDependencies:
- - web-streams-polyfill
+ ky: 1.14.0
+ undici: 6.22.0
'@discordapp/twemoji@16.0.1':
dependencies:
@@ -12539,8 +12903,6 @@ snapshots:
ajv-formats: 3.0.1(ajv@8.17.1)
fast-uri: 3.1.0
- '@fastify/busboy@2.1.1': {}
-
'@fastify/busboy@3.2.0': {}
'@fastify/cookie@11.0.2':
@@ -12548,10 +12910,10 @@ snapshots:
cookie: 1.0.2
fastify-plugin: 5.1.0
- '@fastify/cors@10.1.0':
+ '@fastify/cors@11.1.0':
dependencies:
fastify-plugin: 5.1.0
- mnemonist: 0.40.0
+ toad-cache: 3.7.0
'@fastify/deepmerge@3.1.0': {}
@@ -12570,9 +12932,9 @@ snapshots:
'@fastify/forwarded@3.0.1': {}
- '@fastify/http-proxy@10.0.2(bufferutil@4.0.9)(utf-8-validate@6.0.5)':
+ '@fastify/http-proxy@11.3.0(bufferutil@4.0.9)(utf-8-validate@6.0.5)':
dependencies:
- '@fastify/reply-from': 11.0.2
+ '@fastify/reply-from': 12.4.0
fast-querystring: 1.1.2
fastify-plugin: 5.1.0
ws: 8.18.3(bufferutil@4.0.9)(utf-8-validate@6.0.5)
@@ -12595,17 +12957,17 @@ snapshots:
'@fastify/proxy-addr@5.1.0':
dependencies:
'@fastify/forwarded': 3.0.1
- ipaddr.js: 2.2.0
+ ipaddr.js: 2.3.0
- '@fastify/reply-from@11.0.2':
+ '@fastify/reply-from@12.4.0':
dependencies:
'@fastify/error': 4.2.0
end-of-stream: 1.4.5
- fast-content-type-parse: 2.0.1
+ fast-content-type-parse: 3.0.0
fast-querystring: 1.1.2
fastify-plugin: 5.1.0
toad-cache: 3.7.0
- undici: 6.22.0
+ undici: 7.16.0
'@fastify/send@4.1.0':
dependencies:
@@ -12624,10 +12986,10 @@ snapshots:
fastq: 1.19.1
glob: 11.1.0
- '@fastify/view@10.0.2':
+ '@file-type/xml@0.4.4':
dependencies:
- fastify-plugin: 5.1.0
- toad-cache: 3.7.0
+ sax: 1.4.3
+ strtok3: 10.3.4
'@github/webauthn-json@2.1.1': {}
@@ -12986,7 +13348,7 @@ snapshots:
'@types/istanbul-lib-coverage': 2.0.6
'@types/istanbul-reports': 3.0.4
'@types/node': 24.10.1
- '@types/yargs': 17.0.35
+ '@types/yargs': 17.0.34
chalk: 4.1.2
'@jest/types@30.2.0':
@@ -12996,15 +13358,15 @@ snapshots:
'@types/istanbul-lib-coverage': 2.0.6
'@types/istanbul-reports': 3.0.4
'@types/node': 24.10.1
- '@types/yargs': 17.0.35
+ '@types/yargs': 17.0.34
chalk: 4.1.2
- '@joshwooding/vite-plugin-react-docgen-typescript@0.6.1(typescript@5.9.3)(vite@7.2.2(@types/node@24.10.1)(sass@1.94.1)(terser@5.44.1)(tsx@4.20.6))':
+ '@joshwooding/vite-plugin-react-docgen-typescript@0.6.1(typescript@5.9.3)(vite@7.2.4(@types/node@24.10.1)(sass@1.94.2)(terser@5.44.1)(tsx@4.20.6))':
dependencies:
glob: 10.5.0
magic-string: 0.30.21
react-docgen-typescript: 2.4.0(typescript@5.9.3)
- vite: 7.2.2(@types/node@24.10.1)(sass@1.94.1)(terser@5.44.1)(tsx@4.20.6)
+ vite: 7.2.4(@types/node@24.10.1)(sass@1.94.2)(terser@5.44.1)(tsx@4.20.6)
optionalDependencies:
typescript: 5.9.3
@@ -13034,6 +13396,18 @@ snapshots:
'@keyv/serialize@1.1.1': {}
+ '@kitajs/html@4.2.11':
+ dependencies:
+ csstype: 3.2.3
+
+ '@kitajs/ts-html-plugin@4.1.3(@kitajs/html@4.2.11)(typescript@5.9.3)':
+ dependencies:
+ '@kitajs/html': 4.2.11
+ chalk: 5.6.2
+ tslib: 2.8.1
+ typescript: 5.9.3
+ yargs: 18.0.0
+
'@kurkle/color@0.3.4': {}
'@levischuck/tiny-cbor@0.2.11': {}
@@ -13070,23 +13444,23 @@ snapshots:
'@types/react': 19.2.2
react: 19.2.0
- '@microsoft/api-extractor-model@7.32.0(@types/node@24.10.1)':
+ '@microsoft/api-extractor-model@7.32.1(@types/node@24.10.1)':
dependencies:
'@microsoft/tsdoc': 0.16.0
'@microsoft/tsdoc-config': 0.18.0
- '@rushstack/node-core-library': 5.18.0(@types/node@24.10.1)
+ '@rushstack/node-core-library': 5.19.0(@types/node@24.10.1)
transitivePeerDependencies:
- '@types/node'
- '@microsoft/api-extractor@7.55.0(@types/node@24.10.1)':
+ '@microsoft/api-extractor@7.55.1(@types/node@24.10.1)':
dependencies:
- '@microsoft/api-extractor-model': 7.32.0(@types/node@24.10.1)
+ '@microsoft/api-extractor-model': 7.32.1(@types/node@24.10.1)
'@microsoft/tsdoc': 0.16.0
'@microsoft/tsdoc-config': 0.18.0
- '@rushstack/node-core-library': 5.18.0(@types/node@24.10.1)
+ '@rushstack/node-core-library': 5.19.0(@types/node@24.10.1)
'@rushstack/rig-package': 0.6.0
- '@rushstack/terminal': 0.19.3(@types/node@24.10.1)
- '@rushstack/ts-command-line': 5.1.3(@types/node@24.10.1)
+ '@rushstack/terminal': 0.19.4(@types/node@24.10.1)
+ '@rushstack/ts-command-line': 5.1.4(@types/node@24.10.1)
diff: 8.0.2
lodash: 4.17.21
minimatch: 10.0.3
@@ -13129,7 +13503,7 @@ snapshots:
dependencies:
cheerio: 1.1.2
escape-regexp: 0.0.1
- got: 14.6.4
+ got: 14.6.5
html-entities: 2.6.0
iconv-lite: 0.7.0
jschardet: 3.1.4
@@ -13162,48 +13536,48 @@ snapshots:
outvariant: 1.4.3
strict-event-emitter: 0.5.1
- '@napi-rs/canvas-android-arm64@0.1.82':
+ '@napi-rs/canvas-android-arm64@0.1.83':
optional: true
- '@napi-rs/canvas-darwin-arm64@0.1.82':
+ '@napi-rs/canvas-darwin-arm64@0.1.83':
optional: true
- '@napi-rs/canvas-darwin-x64@0.1.82':
+ '@napi-rs/canvas-darwin-x64@0.1.83':
optional: true
- '@napi-rs/canvas-linux-arm-gnueabihf@0.1.82':
+ '@napi-rs/canvas-linux-arm-gnueabihf@0.1.83':
optional: true
- '@napi-rs/canvas-linux-arm64-gnu@0.1.82':
+ '@napi-rs/canvas-linux-arm64-gnu@0.1.83':
optional: true
- '@napi-rs/canvas-linux-arm64-musl@0.1.82':
+ '@napi-rs/canvas-linux-arm64-musl@0.1.83':
optional: true
- '@napi-rs/canvas-linux-riscv64-gnu@0.1.82':
+ '@napi-rs/canvas-linux-riscv64-gnu@0.1.83':
optional: true
- '@napi-rs/canvas-linux-x64-gnu@0.1.82':
+ '@napi-rs/canvas-linux-x64-gnu@0.1.83':
optional: true
- '@napi-rs/canvas-linux-x64-musl@0.1.82':
+ '@napi-rs/canvas-linux-x64-musl@0.1.83':
optional: true
- '@napi-rs/canvas-win32-x64-msvc@0.1.82':
+ '@napi-rs/canvas-win32-x64-msvc@0.1.83':
optional: true
- '@napi-rs/canvas@0.1.82':
+ '@napi-rs/canvas@0.1.83':
optionalDependencies:
- '@napi-rs/canvas-android-arm64': 0.1.82
- '@napi-rs/canvas-darwin-arm64': 0.1.82
- '@napi-rs/canvas-darwin-x64': 0.1.82
- '@napi-rs/canvas-linux-arm-gnueabihf': 0.1.82
- '@napi-rs/canvas-linux-arm64-gnu': 0.1.82
- '@napi-rs/canvas-linux-arm64-musl': 0.1.82
- '@napi-rs/canvas-linux-riscv64-gnu': 0.1.82
- '@napi-rs/canvas-linux-x64-gnu': 0.1.82
- '@napi-rs/canvas-linux-x64-musl': 0.1.82
- '@napi-rs/canvas-win32-x64-msvc': 0.1.82
+ '@napi-rs/canvas-android-arm64': 0.1.83
+ '@napi-rs/canvas-darwin-arm64': 0.1.83
+ '@napi-rs/canvas-darwin-x64': 0.1.83
+ '@napi-rs/canvas-linux-arm-gnueabihf': 0.1.83
+ '@napi-rs/canvas-linux-arm64-gnu': 0.1.83
+ '@napi-rs/canvas-linux-arm64-musl': 0.1.83
+ '@napi-rs/canvas-linux-riscv64-gnu': 0.1.83
+ '@napi-rs/canvas-linux-x64-gnu': 0.1.83
+ '@napi-rs/canvas-linux-x64-musl': 0.1.83
+ '@napi-rs/canvas-win32-x64-msvc': 0.1.83
'@napi-rs/nice-android-arm-eabi@1.1.1':
optional: true
@@ -13289,7 +13663,7 @@ snapshots:
transitivePeerDependencies:
- supports-color
- '@nestjs/core@11.1.9(@nestjs/common@11.1.9(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/platform-express@10.4.20)(reflect-metadata@0.2.2)(rxjs@7.8.2)':
+ '@nestjs/core@11.1.9(@nestjs/common@11.1.9(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/platform-express@11.1.9)(reflect-metadata@0.2.2)(rxjs@7.8.2)':
dependencies:
'@nestjs/common': 11.1.9(reflect-metadata@0.2.2)(rxjs@7.8.2)
'@nuxt/opencollective': 0.4.1
@@ -13301,27 +13675,27 @@ snapshots:
tslib: 2.8.1
uid: 2.0.2
optionalDependencies:
- '@nestjs/platform-express': 10.4.20(@nestjs/common@11.1.9(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.9)
+ '@nestjs/platform-express': 11.1.9(@nestjs/common@11.1.9(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.9)
- '@nestjs/platform-express@10.4.20(@nestjs/common@11.1.9(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.9)':
+ '@nestjs/platform-express@11.1.9(@nestjs/common@11.1.9(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.9)':
dependencies:
'@nestjs/common': 11.1.9(reflect-metadata@0.2.2)(rxjs@7.8.2)
- '@nestjs/core': 11.1.9(@nestjs/common@11.1.9(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/platform-express@10.4.20)(reflect-metadata@0.2.2)(rxjs@7.8.2)
- body-parser: 1.20.3
+ '@nestjs/core': 11.1.9(@nestjs/common@11.1.9(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/platform-express@11.1.9)(reflect-metadata@0.2.2)(rxjs@7.8.2)
cors: 2.8.5
- express: 4.21.2
+ express: 5.1.0
multer: 2.0.2
+ path-to-regexp: 8.3.0
tslib: 2.8.1
transitivePeerDependencies:
- supports-color
- '@nestjs/testing@11.1.9(@nestjs/common@11.1.9(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.9)(@nestjs/platform-express@10.4.20)':
+ '@nestjs/testing@11.1.9(@nestjs/common@11.1.9(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.9)(@nestjs/platform-express@11.1.9)':
dependencies:
'@nestjs/common': 11.1.9(reflect-metadata@0.2.2)(rxjs@7.8.2)
- '@nestjs/core': 11.1.9(@nestjs/common@11.1.9(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/platform-express@10.4.20)(reflect-metadata@0.2.2)(rxjs@7.8.2)
+ '@nestjs/core': 11.1.9(@nestjs/common@11.1.9(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/platform-express@11.1.9)(reflect-metadata@0.2.2)(rxjs@7.8.2)
tslib: 2.8.1
optionalDependencies:
- '@nestjs/platform-express': 10.4.20(@nestjs/common@11.1.9(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.9)
+ '@nestjs/platform-express': 11.1.9(@nestjs/common@11.1.9(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.9)
'@noble/hashes@1.8.0': {}
@@ -13366,11 +13740,7 @@ snapshots:
'@open-draft/until@2.1.0': {}
- '@opentelemetry/api-logs@0.204.0':
- dependencies:
- '@opentelemetry/api': 1.9.0
-
- '@opentelemetry/api-logs@0.57.2':
+ '@opentelemetry/api-logs@0.208.0':
dependencies:
'@opentelemetry/api': 1.9.0
@@ -13380,224 +13750,202 @@ snapshots:
dependencies:
'@opentelemetry/api': 1.9.0
- '@opentelemetry/core@2.1.0(@opentelemetry/api@1.9.0)':
- dependencies:
- '@opentelemetry/api': 1.9.0
- '@opentelemetry/semantic-conventions': 1.38.0
-
'@opentelemetry/core@2.2.0(@opentelemetry/api@1.9.0)':
dependencies:
'@opentelemetry/api': 1.9.0
'@opentelemetry/semantic-conventions': 1.38.0
- '@opentelemetry/instrumentation-amqplib@0.51.0(@opentelemetry/api@1.9.0)':
+ '@opentelemetry/instrumentation-amqplib@0.55.0(@opentelemetry/api@1.9.0)':
dependencies:
'@opentelemetry/api': 1.9.0
'@opentelemetry/core': 2.2.0(@opentelemetry/api@1.9.0)
- '@opentelemetry/instrumentation': 0.204.0(@opentelemetry/api@1.9.0)
- '@opentelemetry/semantic-conventions': 1.38.0
+ '@opentelemetry/instrumentation': 0.208.0(@opentelemetry/api@1.9.0)
transitivePeerDependencies:
- supports-color
- '@opentelemetry/instrumentation-connect@0.48.0(@opentelemetry/api@1.9.0)':
+ '@opentelemetry/instrumentation-connect@0.52.0(@opentelemetry/api@1.9.0)':
dependencies:
'@opentelemetry/api': 1.9.0
'@opentelemetry/core': 2.2.0(@opentelemetry/api@1.9.0)
- '@opentelemetry/instrumentation': 0.204.0(@opentelemetry/api@1.9.0)
+ '@opentelemetry/instrumentation': 0.208.0(@opentelemetry/api@1.9.0)
'@opentelemetry/semantic-conventions': 1.38.0
'@types/connect': 3.4.38
transitivePeerDependencies:
- supports-color
- '@opentelemetry/instrumentation-dataloader@0.22.0(@opentelemetry/api@1.9.0)':
+ '@opentelemetry/instrumentation-dataloader@0.26.0(@opentelemetry/api@1.9.0)':
dependencies:
'@opentelemetry/api': 1.9.0
- '@opentelemetry/instrumentation': 0.204.0(@opentelemetry/api@1.9.0)
+ '@opentelemetry/instrumentation': 0.208.0(@opentelemetry/api@1.9.0)
transitivePeerDependencies:
- supports-color
- '@opentelemetry/instrumentation-express@0.53.0(@opentelemetry/api@1.9.0)':
+ '@opentelemetry/instrumentation-express@0.57.0(@opentelemetry/api@1.9.0)':
dependencies:
'@opentelemetry/api': 1.9.0
'@opentelemetry/core': 2.2.0(@opentelemetry/api@1.9.0)
- '@opentelemetry/instrumentation': 0.204.0(@opentelemetry/api@1.9.0)
+ '@opentelemetry/instrumentation': 0.208.0(@opentelemetry/api@1.9.0)
'@opentelemetry/semantic-conventions': 1.38.0
transitivePeerDependencies:
- supports-color
- '@opentelemetry/instrumentation-fs@0.24.0(@opentelemetry/api@1.9.0)':
+ '@opentelemetry/instrumentation-fs@0.28.0(@opentelemetry/api@1.9.0)':
dependencies:
'@opentelemetry/api': 1.9.0
'@opentelemetry/core': 2.2.0(@opentelemetry/api@1.9.0)
- '@opentelemetry/instrumentation': 0.204.0(@opentelemetry/api@1.9.0)
+ '@opentelemetry/instrumentation': 0.208.0(@opentelemetry/api@1.9.0)
transitivePeerDependencies:
- supports-color
- '@opentelemetry/instrumentation-generic-pool@0.48.0(@opentelemetry/api@1.9.0)':
+ '@opentelemetry/instrumentation-generic-pool@0.52.0(@opentelemetry/api@1.9.0)':
dependencies:
'@opentelemetry/api': 1.9.0
- '@opentelemetry/instrumentation': 0.204.0(@opentelemetry/api@1.9.0)
+ '@opentelemetry/instrumentation': 0.208.0(@opentelemetry/api@1.9.0)
transitivePeerDependencies:
- supports-color
- '@opentelemetry/instrumentation-graphql@0.52.0(@opentelemetry/api@1.9.0)':
+ '@opentelemetry/instrumentation-graphql@0.56.0(@opentelemetry/api@1.9.0)':
dependencies:
'@opentelemetry/api': 1.9.0
- '@opentelemetry/instrumentation': 0.204.0(@opentelemetry/api@1.9.0)
+ '@opentelemetry/instrumentation': 0.208.0(@opentelemetry/api@1.9.0)
transitivePeerDependencies:
- supports-color
- '@opentelemetry/instrumentation-hapi@0.51.0(@opentelemetry/api@1.9.0)':
+ '@opentelemetry/instrumentation-hapi@0.55.0(@opentelemetry/api@1.9.0)':
dependencies:
'@opentelemetry/api': 1.9.0
'@opentelemetry/core': 2.2.0(@opentelemetry/api@1.9.0)
- '@opentelemetry/instrumentation': 0.204.0(@opentelemetry/api@1.9.0)
+ '@opentelemetry/instrumentation': 0.208.0(@opentelemetry/api@1.9.0)
'@opentelemetry/semantic-conventions': 1.38.0
transitivePeerDependencies:
- supports-color
- '@opentelemetry/instrumentation-http@0.204.0(@opentelemetry/api@1.9.0)':
+ '@opentelemetry/instrumentation-http@0.208.0(@opentelemetry/api@1.9.0)':
dependencies:
'@opentelemetry/api': 1.9.0
- '@opentelemetry/core': 2.1.0(@opentelemetry/api@1.9.0)
- '@opentelemetry/instrumentation': 0.204.0(@opentelemetry/api@1.9.0)
+ '@opentelemetry/core': 2.2.0(@opentelemetry/api@1.9.0)
+ '@opentelemetry/instrumentation': 0.208.0(@opentelemetry/api@1.9.0)
'@opentelemetry/semantic-conventions': 1.38.0
forwarded-parse: 2.1.2
transitivePeerDependencies:
- supports-color
- '@opentelemetry/instrumentation-ioredis@0.52.0(@opentelemetry/api@1.9.0)':
+ '@opentelemetry/instrumentation-ioredis@0.56.0(@opentelemetry/api@1.9.0)':
dependencies:
'@opentelemetry/api': 1.9.0
- '@opentelemetry/instrumentation': 0.204.0(@opentelemetry/api@1.9.0)
+ '@opentelemetry/instrumentation': 0.208.0(@opentelemetry/api@1.9.0)
'@opentelemetry/redis-common': 0.38.2
- '@opentelemetry/semantic-conventions': 1.38.0
transitivePeerDependencies:
- supports-color
- '@opentelemetry/instrumentation-kafkajs@0.14.0(@opentelemetry/api@1.9.0)':
+ '@opentelemetry/instrumentation-kafkajs@0.18.0(@opentelemetry/api@1.9.0)':
dependencies:
'@opentelemetry/api': 1.9.0
- '@opentelemetry/instrumentation': 0.204.0(@opentelemetry/api@1.9.0)
+ '@opentelemetry/instrumentation': 0.208.0(@opentelemetry/api@1.9.0)
'@opentelemetry/semantic-conventions': 1.38.0
transitivePeerDependencies:
- supports-color
- '@opentelemetry/instrumentation-knex@0.49.0(@opentelemetry/api@1.9.0)':
+ '@opentelemetry/instrumentation-knex@0.53.0(@opentelemetry/api@1.9.0)':
dependencies:
'@opentelemetry/api': 1.9.0
- '@opentelemetry/instrumentation': 0.204.0(@opentelemetry/api@1.9.0)
+ '@opentelemetry/instrumentation': 0.208.0(@opentelemetry/api@1.9.0)
'@opentelemetry/semantic-conventions': 1.38.0
transitivePeerDependencies:
- supports-color
- '@opentelemetry/instrumentation-koa@0.52.0(@opentelemetry/api@1.9.0)':
+ '@opentelemetry/instrumentation-koa@0.57.0(@opentelemetry/api@1.9.0)':
dependencies:
'@opentelemetry/api': 1.9.0
'@opentelemetry/core': 2.2.0(@opentelemetry/api@1.9.0)
- '@opentelemetry/instrumentation': 0.204.0(@opentelemetry/api@1.9.0)
+ '@opentelemetry/instrumentation': 0.208.0(@opentelemetry/api@1.9.0)
'@opentelemetry/semantic-conventions': 1.38.0
transitivePeerDependencies:
- supports-color
- '@opentelemetry/instrumentation-lru-memoizer@0.49.0(@opentelemetry/api@1.9.0)':
+ '@opentelemetry/instrumentation-lru-memoizer@0.53.0(@opentelemetry/api@1.9.0)':
dependencies:
'@opentelemetry/api': 1.9.0
- '@opentelemetry/instrumentation': 0.204.0(@opentelemetry/api@1.9.0)
+ '@opentelemetry/instrumentation': 0.208.0(@opentelemetry/api@1.9.0)
transitivePeerDependencies:
- supports-color
- '@opentelemetry/instrumentation-mongodb@0.57.0(@opentelemetry/api@1.9.0)':
+ '@opentelemetry/instrumentation-mongodb@0.61.0(@opentelemetry/api@1.9.0)':
dependencies:
'@opentelemetry/api': 1.9.0
- '@opentelemetry/instrumentation': 0.204.0(@opentelemetry/api@1.9.0)
- '@opentelemetry/semantic-conventions': 1.38.0
+ '@opentelemetry/instrumentation': 0.208.0(@opentelemetry/api@1.9.0)
transitivePeerDependencies:
- supports-color
- '@opentelemetry/instrumentation-mongoose@0.51.0(@opentelemetry/api@1.9.0)':
+ '@opentelemetry/instrumentation-mongoose@0.55.0(@opentelemetry/api@1.9.0)':
dependencies:
'@opentelemetry/api': 1.9.0
'@opentelemetry/core': 2.2.0(@opentelemetry/api@1.9.0)
- '@opentelemetry/instrumentation': 0.204.0(@opentelemetry/api@1.9.0)
- '@opentelemetry/semantic-conventions': 1.38.0
+ '@opentelemetry/instrumentation': 0.208.0(@opentelemetry/api@1.9.0)
transitivePeerDependencies:
- supports-color
- '@opentelemetry/instrumentation-mysql2@0.51.0(@opentelemetry/api@1.9.0)':
+ '@opentelemetry/instrumentation-mysql2@0.55.0(@opentelemetry/api@1.9.0)':
dependencies:
'@opentelemetry/api': 1.9.0
- '@opentelemetry/instrumentation': 0.204.0(@opentelemetry/api@1.9.0)
+ '@opentelemetry/instrumentation': 0.208.0(@opentelemetry/api@1.9.0)
'@opentelemetry/semantic-conventions': 1.38.0
'@opentelemetry/sql-common': 0.41.2(@opentelemetry/api@1.9.0)
transitivePeerDependencies:
- supports-color
- '@opentelemetry/instrumentation-mysql@0.50.0(@opentelemetry/api@1.9.0)':
+ '@opentelemetry/instrumentation-mysql@0.54.0(@opentelemetry/api@1.9.0)':
dependencies:
'@opentelemetry/api': 1.9.0
- '@opentelemetry/instrumentation': 0.204.0(@opentelemetry/api@1.9.0)
- '@opentelemetry/semantic-conventions': 1.38.0
+ '@opentelemetry/instrumentation': 0.208.0(@opentelemetry/api@1.9.0)
'@types/mysql': 2.15.27
transitivePeerDependencies:
- supports-color
- '@opentelemetry/instrumentation-pg@0.57.0(@opentelemetry/api@1.9.0)':
+ '@opentelemetry/instrumentation-pg@0.61.0(@opentelemetry/api@1.9.0)':
dependencies:
'@opentelemetry/api': 1.9.0
'@opentelemetry/core': 2.2.0(@opentelemetry/api@1.9.0)
- '@opentelemetry/instrumentation': 0.204.0(@opentelemetry/api@1.9.0)
+ '@opentelemetry/instrumentation': 0.208.0(@opentelemetry/api@1.9.0)
'@opentelemetry/semantic-conventions': 1.38.0
'@opentelemetry/sql-common': 0.41.2(@opentelemetry/api@1.9.0)
- '@types/pg': 8.15.5
+ '@types/pg': 8.15.6
'@types/pg-pool': 2.0.6
transitivePeerDependencies:
- supports-color
- '@opentelemetry/instrumentation-redis@0.53.0(@opentelemetry/api@1.9.0)':
+ '@opentelemetry/instrumentation-redis@0.57.0(@opentelemetry/api@1.9.0)':
dependencies:
'@opentelemetry/api': 1.9.0
- '@opentelemetry/instrumentation': 0.204.0(@opentelemetry/api@1.9.0)
+ '@opentelemetry/instrumentation': 0.208.0(@opentelemetry/api@1.9.0)
'@opentelemetry/redis-common': 0.38.2
'@opentelemetry/semantic-conventions': 1.38.0
transitivePeerDependencies:
- supports-color
- '@opentelemetry/instrumentation-tedious@0.23.0(@opentelemetry/api@1.9.0)':
+ '@opentelemetry/instrumentation-tedious@0.27.0(@opentelemetry/api@1.9.0)':
dependencies:
'@opentelemetry/api': 1.9.0
- '@opentelemetry/instrumentation': 0.204.0(@opentelemetry/api@1.9.0)
- '@opentelemetry/semantic-conventions': 1.38.0
+ '@opentelemetry/instrumentation': 0.208.0(@opentelemetry/api@1.9.0)
'@types/tedious': 4.0.14
transitivePeerDependencies:
- supports-color
- '@opentelemetry/instrumentation-undici@0.15.0(@opentelemetry/api@1.9.0)':
+ '@opentelemetry/instrumentation-undici@0.19.0(@opentelemetry/api@1.9.0)':
dependencies:
'@opentelemetry/api': 1.9.0
'@opentelemetry/core': 2.2.0(@opentelemetry/api@1.9.0)
- '@opentelemetry/instrumentation': 0.204.0(@opentelemetry/api@1.9.0)
- transitivePeerDependencies:
- - supports-color
-
- '@opentelemetry/instrumentation@0.204.0(@opentelemetry/api@1.9.0)':
- dependencies:
- '@opentelemetry/api': 1.9.0
- '@opentelemetry/api-logs': 0.204.0
- import-in-the-middle: 1.15.0
- require-in-the-middle: 7.5.2
+ '@opentelemetry/instrumentation': 0.208.0(@opentelemetry/api@1.9.0)
+ '@opentelemetry/semantic-conventions': 1.38.0
transitivePeerDependencies:
- supports-color
- '@opentelemetry/instrumentation@0.57.2(@opentelemetry/api@1.9.0)':
+ '@opentelemetry/instrumentation@0.208.0(@opentelemetry/api@1.9.0)':
dependencies:
'@opentelemetry/api': 1.9.0
- '@opentelemetry/api-logs': 0.57.2
- '@types/shimmer': 1.2.0
- import-in-the-middle: 1.15.0
- require-in-the-middle: 7.5.2
- semver: 7.7.3
- shimmer: 1.2.1
+ '@opentelemetry/api-logs': 0.208.0
+ import-in-the-middle: 2.0.0
+ require-in-the-middle: 8.0.1
transitivePeerDependencies:
- supports-color
@@ -13694,6 +14042,21 @@ snapshots:
asn1js: 3.0.6
tslib: 2.8.1
+ '@peculiar/asn1-cms@2.6.0':
+ dependencies:
+ '@peculiar/asn1-schema': 2.6.0
+ '@peculiar/asn1-x509': 2.6.0
+ '@peculiar/asn1-x509-attr': 2.6.0
+ asn1js: 3.0.6
+ tslib: 2.8.1
+
+ '@peculiar/asn1-csr@2.6.0':
+ dependencies:
+ '@peculiar/asn1-schema': 2.6.0
+ '@peculiar/asn1-x509': 2.6.0
+ asn1js: 3.0.6
+ tslib: 2.8.1
+
'@peculiar/asn1-ecc@2.6.0':
dependencies:
'@peculiar/asn1-schema': 2.6.0
@@ -13701,6 +14064,33 @@ snapshots:
asn1js: 3.0.6
tslib: 2.8.1
+ '@peculiar/asn1-pfx@2.6.0':
+ dependencies:
+ '@peculiar/asn1-cms': 2.6.0
+ '@peculiar/asn1-pkcs8': 2.6.0
+ '@peculiar/asn1-rsa': 2.6.0
+ '@peculiar/asn1-schema': 2.6.0
+ asn1js: 3.0.6
+ tslib: 2.8.1
+
+ '@peculiar/asn1-pkcs8@2.6.0':
+ dependencies:
+ '@peculiar/asn1-schema': 2.6.0
+ '@peculiar/asn1-x509': 2.6.0
+ asn1js: 3.0.6
+ tslib: 2.8.1
+
+ '@peculiar/asn1-pkcs9@2.6.0':
+ dependencies:
+ '@peculiar/asn1-cms': 2.6.0
+ '@peculiar/asn1-pfx': 2.6.0
+ '@peculiar/asn1-pkcs8': 2.6.0
+ '@peculiar/asn1-schema': 2.6.0
+ '@peculiar/asn1-x509': 2.6.0
+ '@peculiar/asn1-x509-attr': 2.6.0
+ asn1js: 3.0.6
+ tslib: 2.8.1
+
'@peculiar/asn1-rsa@2.6.0':
dependencies:
'@peculiar/asn1-schema': 2.6.0
@@ -13714,6 +14104,13 @@ snapshots:
pvtsutils: 1.3.6
tslib: 2.8.1
+ '@peculiar/asn1-x509-attr@2.6.0':
+ dependencies:
+ '@peculiar/asn1-schema': 2.6.0
+ '@peculiar/asn1-x509': 2.6.0
+ asn1js: 3.0.6
+ tslib: 2.8.1
+
'@peculiar/asn1-x509@2.6.0':
dependencies:
'@peculiar/asn1-schema': 2.6.0
@@ -13721,6 +14118,20 @@ snapshots:
pvtsutils: 1.3.6
tslib: 2.8.1
+ '@peculiar/x509@1.14.2':
+ dependencies:
+ '@peculiar/asn1-cms': 2.6.0
+ '@peculiar/asn1-csr': 2.6.0
+ '@peculiar/asn1-ecc': 2.6.0
+ '@peculiar/asn1-pkcs9': 2.6.0
+ '@peculiar/asn1-rsa': 2.6.0
+ '@peculiar/asn1-schema': 2.6.0
+ '@peculiar/asn1-x509': 2.6.0
+ pvtsutils: 1.3.6
+ reflect-metadata: 0.2.2
+ tslib: 2.8.1
+ tsyringe: 4.10.0
+
'@peertube/http-signature@1.7.0':
dependencies:
assert-plus: 1.0.0
@@ -13732,10 +14143,10 @@ snapshots:
'@pkgjs/parseargs@0.11.0':
optional: true
- '@prisma/instrumentation@6.15.0(@opentelemetry/api@1.9.0)':
+ '@prisma/instrumentation@6.19.0(@opentelemetry/api@1.9.0)':
dependencies:
'@opentelemetry/api': 1.9.0
- '@opentelemetry/instrumentation': 0.57.2(@opentelemetry/api@1.9.0)
+ '@opentelemetry/instrumentation': 0.208.0(@opentelemetry/api@1.9.0)
transitivePeerDependencies:
- supports-color
@@ -13875,7 +14286,7 @@ snapshots:
'@rtsao/scc@1.1.0': {}
- '@rushstack/node-core-library@5.18.0(@types/node@24.10.1)':
+ '@rushstack/node-core-library@5.19.0(@types/node@24.10.1)':
dependencies:
ajv: 8.13.0
ajv-draft-04: 1.0.0(ajv@8.13.0)
@@ -13897,17 +14308,17 @@ snapshots:
resolve: 1.22.11
strip-json-comments: 3.1.1
- '@rushstack/terminal@0.19.3(@types/node@24.10.1)':
+ '@rushstack/terminal@0.19.4(@types/node@24.10.1)':
dependencies:
- '@rushstack/node-core-library': 5.18.0(@types/node@24.10.1)
+ '@rushstack/node-core-library': 5.19.0(@types/node@24.10.1)
'@rushstack/problem-matcher': 0.1.1(@types/node@24.10.1)
supports-color: 8.1.1
optionalDependencies:
'@types/node': 24.10.1
- '@rushstack/ts-command-line@5.1.3(@types/node@24.10.1)':
+ '@rushstack/ts-command-line@5.1.4(@types/node@24.10.1)':
dependencies:
- '@rushstack/terminal': 0.19.3(@types/node@24.10.1)
+ '@rushstack/terminal': 0.19.4(@types/node@24.10.1)
'@types/argparse': 1.0.38
argparse: 1.0.10
string-argv: 0.3.2
@@ -13916,145 +14327,145 @@ snapshots:
'@sec-ant/readable-stream@0.4.1': {}
- '@sentry-internal/browser-utils@10.26.0':
+ '@sentry-internal/browser-utils@10.27.0':
dependencies:
- '@sentry/core': 10.26.0
+ '@sentry/core': 10.27.0
- '@sentry-internal/feedback@10.26.0':
+ '@sentry-internal/feedback@10.27.0':
dependencies:
- '@sentry/core': 10.26.0
+ '@sentry/core': 10.27.0
'@sentry-internal/node-cpu-profiler@2.2.0':
dependencies:
detect-libc: 2.1.2
node-abi: 3.85.0
- '@sentry-internal/replay-canvas@10.26.0':
+ '@sentry-internal/replay-canvas@10.27.0':
dependencies:
- '@sentry-internal/replay': 10.26.0
- '@sentry/core': 10.26.0
+ '@sentry-internal/replay': 10.27.0
+ '@sentry/core': 10.27.0
- '@sentry-internal/replay@10.26.0':
+ '@sentry-internal/replay@10.27.0':
dependencies:
- '@sentry-internal/browser-utils': 10.26.0
- '@sentry/core': 10.26.0
+ '@sentry-internal/browser-utils': 10.27.0
+ '@sentry/core': 10.27.0
- '@sentry/browser@10.26.0':
+ '@sentry/browser@10.27.0':
dependencies:
- '@sentry-internal/browser-utils': 10.26.0
- '@sentry-internal/feedback': 10.26.0
- '@sentry-internal/replay': 10.26.0
- '@sentry-internal/replay-canvas': 10.26.0
- '@sentry/core': 10.26.0
+ '@sentry-internal/browser-utils': 10.27.0
+ '@sentry-internal/feedback': 10.27.0
+ '@sentry-internal/replay': 10.27.0
+ '@sentry-internal/replay-canvas': 10.27.0
+ '@sentry/core': 10.27.0
- '@sentry/core@10.26.0': {}
+ '@sentry/core@10.27.0': {}
- '@sentry/node-core@10.26.0(@opentelemetry/api@1.9.0)(@opentelemetry/context-async-hooks@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/core@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/instrumentation@0.204.0(@opentelemetry/api@1.9.0))(@opentelemetry/resources@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.38.0)':
+ '@sentry/node-core@10.27.0(@opentelemetry/api@1.9.0)(@opentelemetry/context-async-hooks@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/core@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/instrumentation@0.208.0(@opentelemetry/api@1.9.0))(@opentelemetry/resources@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.38.0)':
dependencies:
'@apm-js-collab/tracing-hooks': 0.3.1
'@opentelemetry/api': 1.9.0
'@opentelemetry/context-async-hooks': 2.2.0(@opentelemetry/api@1.9.0)
'@opentelemetry/core': 2.2.0(@opentelemetry/api@1.9.0)
- '@opentelemetry/instrumentation': 0.204.0(@opentelemetry/api@1.9.0)
+ '@opentelemetry/instrumentation': 0.208.0(@opentelemetry/api@1.9.0)
'@opentelemetry/resources': 2.2.0(@opentelemetry/api@1.9.0)
'@opentelemetry/sdk-trace-base': 2.2.0(@opentelemetry/api@1.9.0)
'@opentelemetry/semantic-conventions': 1.38.0
- '@sentry/core': 10.26.0
- '@sentry/opentelemetry': 10.26.0(@opentelemetry/api@1.9.0)(@opentelemetry/context-async-hooks@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/core@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.38.0)
- import-in-the-middle: 1.15.0
+ '@sentry/core': 10.27.0
+ '@sentry/opentelemetry': 10.27.0(@opentelemetry/api@1.9.0)(@opentelemetry/context-async-hooks@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/core@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.38.0)
+ import-in-the-middle: 2.0.0
transitivePeerDependencies:
- supports-color
- '@sentry/node@10.26.0':
+ '@sentry/node@10.27.0':
dependencies:
'@opentelemetry/api': 1.9.0
'@opentelemetry/context-async-hooks': 2.2.0(@opentelemetry/api@1.9.0)
'@opentelemetry/core': 2.2.0(@opentelemetry/api@1.9.0)
- '@opentelemetry/instrumentation': 0.204.0(@opentelemetry/api@1.9.0)
- '@opentelemetry/instrumentation-amqplib': 0.51.0(@opentelemetry/api@1.9.0)
- '@opentelemetry/instrumentation-connect': 0.48.0(@opentelemetry/api@1.9.0)
- '@opentelemetry/instrumentation-dataloader': 0.22.0(@opentelemetry/api@1.9.0)
- '@opentelemetry/instrumentation-express': 0.53.0(@opentelemetry/api@1.9.0)
- '@opentelemetry/instrumentation-fs': 0.24.0(@opentelemetry/api@1.9.0)
- '@opentelemetry/instrumentation-generic-pool': 0.48.0(@opentelemetry/api@1.9.0)
- '@opentelemetry/instrumentation-graphql': 0.52.0(@opentelemetry/api@1.9.0)
- '@opentelemetry/instrumentation-hapi': 0.51.0(@opentelemetry/api@1.9.0)
- '@opentelemetry/instrumentation-http': 0.204.0(@opentelemetry/api@1.9.0)
- '@opentelemetry/instrumentation-ioredis': 0.52.0(@opentelemetry/api@1.9.0)
- '@opentelemetry/instrumentation-kafkajs': 0.14.0(@opentelemetry/api@1.9.0)
- '@opentelemetry/instrumentation-knex': 0.49.0(@opentelemetry/api@1.9.0)
- '@opentelemetry/instrumentation-koa': 0.52.0(@opentelemetry/api@1.9.0)
- '@opentelemetry/instrumentation-lru-memoizer': 0.49.0(@opentelemetry/api@1.9.0)
- '@opentelemetry/instrumentation-mongodb': 0.57.0(@opentelemetry/api@1.9.0)
- '@opentelemetry/instrumentation-mongoose': 0.51.0(@opentelemetry/api@1.9.0)
- '@opentelemetry/instrumentation-mysql': 0.50.0(@opentelemetry/api@1.9.0)
- '@opentelemetry/instrumentation-mysql2': 0.51.0(@opentelemetry/api@1.9.0)
- '@opentelemetry/instrumentation-pg': 0.57.0(@opentelemetry/api@1.9.0)
- '@opentelemetry/instrumentation-redis': 0.53.0(@opentelemetry/api@1.9.0)
- '@opentelemetry/instrumentation-tedious': 0.23.0(@opentelemetry/api@1.9.0)
- '@opentelemetry/instrumentation-undici': 0.15.0(@opentelemetry/api@1.9.0)
+ '@opentelemetry/instrumentation': 0.208.0(@opentelemetry/api@1.9.0)
+ '@opentelemetry/instrumentation-amqplib': 0.55.0(@opentelemetry/api@1.9.0)
+ '@opentelemetry/instrumentation-connect': 0.52.0(@opentelemetry/api@1.9.0)
+ '@opentelemetry/instrumentation-dataloader': 0.26.0(@opentelemetry/api@1.9.0)
+ '@opentelemetry/instrumentation-express': 0.57.0(@opentelemetry/api@1.9.0)
+ '@opentelemetry/instrumentation-fs': 0.28.0(@opentelemetry/api@1.9.0)
+ '@opentelemetry/instrumentation-generic-pool': 0.52.0(@opentelemetry/api@1.9.0)
+ '@opentelemetry/instrumentation-graphql': 0.56.0(@opentelemetry/api@1.9.0)
+ '@opentelemetry/instrumentation-hapi': 0.55.0(@opentelemetry/api@1.9.0)
+ '@opentelemetry/instrumentation-http': 0.208.0(@opentelemetry/api@1.9.0)
+ '@opentelemetry/instrumentation-ioredis': 0.56.0(@opentelemetry/api@1.9.0)
+ '@opentelemetry/instrumentation-kafkajs': 0.18.0(@opentelemetry/api@1.9.0)
+ '@opentelemetry/instrumentation-knex': 0.53.0(@opentelemetry/api@1.9.0)
+ '@opentelemetry/instrumentation-koa': 0.57.0(@opentelemetry/api@1.9.0)
+ '@opentelemetry/instrumentation-lru-memoizer': 0.53.0(@opentelemetry/api@1.9.0)
+ '@opentelemetry/instrumentation-mongodb': 0.61.0(@opentelemetry/api@1.9.0)
+ '@opentelemetry/instrumentation-mongoose': 0.55.0(@opentelemetry/api@1.9.0)
+ '@opentelemetry/instrumentation-mysql': 0.54.0(@opentelemetry/api@1.9.0)
+ '@opentelemetry/instrumentation-mysql2': 0.55.0(@opentelemetry/api@1.9.0)
+ '@opentelemetry/instrumentation-pg': 0.61.0(@opentelemetry/api@1.9.0)
+ '@opentelemetry/instrumentation-redis': 0.57.0(@opentelemetry/api@1.9.0)
+ '@opentelemetry/instrumentation-tedious': 0.27.0(@opentelemetry/api@1.9.0)
+ '@opentelemetry/instrumentation-undici': 0.19.0(@opentelemetry/api@1.9.0)
'@opentelemetry/resources': 2.2.0(@opentelemetry/api@1.9.0)
'@opentelemetry/sdk-trace-base': 2.2.0(@opentelemetry/api@1.9.0)
'@opentelemetry/semantic-conventions': 1.38.0
- '@prisma/instrumentation': 6.15.0(@opentelemetry/api@1.9.0)
- '@sentry/core': 10.26.0
- '@sentry/node-core': 10.26.0(@opentelemetry/api@1.9.0)(@opentelemetry/context-async-hooks@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/core@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/instrumentation@0.204.0(@opentelemetry/api@1.9.0))(@opentelemetry/resources@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.38.0)
- '@sentry/opentelemetry': 10.26.0(@opentelemetry/api@1.9.0)(@opentelemetry/context-async-hooks@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/core@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.38.0)
- import-in-the-middle: 1.15.0
+ '@prisma/instrumentation': 6.19.0(@opentelemetry/api@1.9.0)
+ '@sentry/core': 10.27.0
+ '@sentry/node-core': 10.27.0(@opentelemetry/api@1.9.0)(@opentelemetry/context-async-hooks@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/core@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/instrumentation@0.208.0(@opentelemetry/api@1.9.0))(@opentelemetry/resources@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.38.0)
+ '@sentry/opentelemetry': 10.27.0(@opentelemetry/api@1.9.0)(@opentelemetry/context-async-hooks@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/core@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.38.0)
+ import-in-the-middle: 2.0.0
minimatch: 9.0.5
transitivePeerDependencies:
- supports-color
- '@sentry/opentelemetry@10.26.0(@opentelemetry/api@1.9.0)(@opentelemetry/context-async-hooks@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/core@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.38.0)':
+ '@sentry/opentelemetry@10.27.0(@opentelemetry/api@1.9.0)(@opentelemetry/context-async-hooks@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/core@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.38.0)':
dependencies:
'@opentelemetry/api': 1.9.0
'@opentelemetry/context-async-hooks': 2.2.0(@opentelemetry/api@1.9.0)
'@opentelemetry/core': 2.2.0(@opentelemetry/api@1.9.0)
'@opentelemetry/sdk-trace-base': 2.2.0(@opentelemetry/api@1.9.0)
'@opentelemetry/semantic-conventions': 1.38.0
- '@sentry/core': 10.26.0
+ '@sentry/core': 10.27.0
- '@sentry/profiling-node@10.26.0':
+ '@sentry/profiling-node@10.27.0':
dependencies:
'@sentry-internal/node-cpu-profiler': 2.2.0
- '@sentry/core': 10.26.0
- '@sentry/node': 10.26.0
+ '@sentry/core': 10.27.0
+ '@sentry/node': 10.27.0
transitivePeerDependencies:
- supports-color
- '@sentry/vue@10.26.0(vue@3.5.24(typescript@5.9.3))':
+ '@sentry/vue@10.27.0(vue@3.5.25(typescript@5.9.3))':
dependencies:
- '@sentry/browser': 10.26.0
- '@sentry/core': 10.26.0
- vue: 3.5.24(typescript@5.9.3)
+ '@sentry/browser': 10.27.0
+ '@sentry/core': 10.27.0
+ vue: 3.5.25(typescript@5.9.3)
- '@shikijs/core@3.15.0':
+ '@shikijs/core@3.17.0':
dependencies:
- '@shikijs/types': 3.15.0
+ '@shikijs/types': 3.17.0
'@shikijs/vscode-textmate': 10.0.2
'@types/hast': 3.0.4
hast-util-to-html: 9.0.5
- '@shikijs/engine-javascript@3.15.0':
+ '@shikijs/engine-javascript@3.17.0':
dependencies:
- '@shikijs/types': 3.15.0
+ '@shikijs/types': 3.17.0
'@shikijs/vscode-textmate': 10.0.2
- oniguruma-to-es: 4.3.3
+ oniguruma-to-es: 4.3.4
- '@shikijs/engine-oniguruma@3.15.0':
+ '@shikijs/engine-oniguruma@3.17.0':
dependencies:
- '@shikijs/types': 3.15.0
+ '@shikijs/types': 3.17.0
'@shikijs/vscode-textmate': 10.0.2
- '@shikijs/langs@3.15.0':
+ '@shikijs/langs@3.17.0':
dependencies:
- '@shikijs/types': 3.15.0
+ '@shikijs/types': 3.17.0
- '@shikijs/themes@3.15.0':
+ '@shikijs/themes@3.17.0':
dependencies:
- '@shikijs/types': 3.15.0
+ '@shikijs/types': 3.17.0
- '@shikijs/types@3.15.0':
+ '@shikijs/types@3.17.0':
dependencies:
'@shikijs/vscode-textmate': 10.0.2
'@types/hast': 3.0.4
@@ -14069,7 +14480,7 @@ snapshots:
'@sideway/pinpoint@2.0.0': {}
- '@simplewebauthn/server@12.0.0(encoding@0.1.13)':
+ '@simplewebauthn/server@13.2.2':
dependencies:
'@hexagon/base64': 1.1.28
'@levischuck/tiny-cbor': 0.2.11
@@ -14078,10 +14489,7 @@ snapshots:
'@peculiar/asn1-rsa': 2.6.0
'@peculiar/asn1-schema': 2.6.0
'@peculiar/asn1-x509': 2.6.0
- '@simplewebauthn/types': 12.0.0
- cross-fetch: 4.1.0(encoding@0.1.13)
- transitivePeerDependencies:
- - encoding
+ '@peculiar/x509': 1.14.2
'@simplewebauthn/types@12.0.0': {}
@@ -14107,11 +14515,11 @@ snapshots:
dependencies:
'@sinonjs/commons': 3.0.1
- '@sinonjs/fake-timers@11.3.1':
+ '@sinonjs/fake-timers@13.0.5':
dependencies:
'@sinonjs/commons': 3.0.1
- '@sinonjs/fake-timers@13.0.5':
+ '@sinonjs/fake-timers@15.0.0':
dependencies:
'@sinonjs/commons': 3.0.1
@@ -14122,11 +14530,6 @@ snapshots:
'@sinonjs/text-encoding@0.7.3': {}
- '@smithy/abort-controller@2.2.0':
- dependencies:
- '@smithy/types': 2.12.0
- tslib: 2.8.1
-
'@smithy/abort-controller@4.2.5':
dependencies:
'@smithy/types': 4.9.0
@@ -14295,14 +14698,6 @@ snapshots:
'@smithy/types': 4.9.0
tslib: 2.8.1
- '@smithy/node-http-handler@2.5.0':
- dependencies:
- '@smithy/abort-controller': 2.2.0
- '@smithy/protocol-http': 3.3.0
- '@smithy/querystring-builder': 2.2.0
- '@smithy/types': 2.12.0
- tslib: 2.8.1
-
'@smithy/node-http-handler@4.4.5':
dependencies:
'@smithy/abort-controller': 4.2.5
@@ -14316,22 +14711,11 @@ snapshots:
'@smithy/types': 4.9.0
tslib: 2.8.1
- '@smithy/protocol-http@3.3.0':
- dependencies:
- '@smithy/types': 2.12.0
- tslib: 2.8.1
-
'@smithy/protocol-http@5.3.5':
dependencies:
'@smithy/types': 4.9.0
tslib: 2.8.1
- '@smithy/querystring-builder@2.2.0':
- dependencies:
- '@smithy/types': 2.12.0
- '@smithy/util-uri-escape': 2.2.0
- tslib: 2.8.1
-
'@smithy/querystring-builder@4.2.5':
dependencies:
'@smithy/types': 4.9.0
@@ -14373,10 +14757,6 @@ snapshots:
'@smithy/util-stream': 4.5.6
tslib: 2.8.1
- '@smithy/types@2.12.0':
- dependencies:
- tslib: 2.8.1
-
'@smithy/types@4.9.0':
dependencies:
tslib: 2.8.1
@@ -14464,10 +14844,6 @@ snapshots:
'@smithy/util-utf8': 4.2.0
tslib: 2.8.1
- '@smithy/util-uri-escape@2.2.0':
- dependencies:
- tslib: 2.8.1
-
'@smithy/util-uri-escape@4.2.0':
dependencies:
tslib: 2.8.1
@@ -14496,147 +14872,157 @@ snapshots:
'@standard-schema/spec@1.0.0': {}
- '@storybook/addon-actions@8.6.14(storybook@9.1.16(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(msw@2.12.2(@types/node@24.10.1)(typescript@5.9.3))(prettier@3.6.2)(utf-8-validate@6.0.5)(vite@7.2.2(@types/node@24.10.1)(sass@1.94.1)(terser@5.44.1)(tsx@4.20.6)))':
+ '@storybook/addon-actions@8.6.14(storybook@10.1.0(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(prettier@3.7.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(utf-8-validate@6.0.5))':
dependencies:
'@storybook/global': 5.0.0
'@types/uuid': 9.0.8
dequal: 2.0.3
polished: 4.3.1
- storybook: 9.1.16(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(msw@2.12.2(@types/node@24.10.1)(typescript@5.9.3))(prettier@3.6.2)(utf-8-validate@6.0.5)(vite@7.2.2(@types/node@24.10.1)(sass@1.94.1)(terser@5.44.1)(tsx@4.20.6))
+ storybook: 10.1.0(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(prettier@3.7.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(utf-8-validate@6.0.5)
uuid: 9.0.1
- '@storybook/addon-backgrounds@8.6.14(storybook@9.1.16(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(msw@2.12.2(@types/node@24.10.1)(typescript@5.9.3))(prettier@3.6.2)(utf-8-validate@6.0.5)(vite@7.2.2(@types/node@24.10.1)(sass@1.94.1)(terser@5.44.1)(tsx@4.20.6)))':
+ '@storybook/addon-backgrounds@8.6.14(storybook@10.1.0(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(prettier@3.7.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(utf-8-validate@6.0.5))':
dependencies:
'@storybook/global': 5.0.0
memoizerific: 1.11.3
- storybook: 9.1.16(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(msw@2.12.2(@types/node@24.10.1)(typescript@5.9.3))(prettier@3.6.2)(utf-8-validate@6.0.5)(vite@7.2.2(@types/node@24.10.1)(sass@1.94.1)(terser@5.44.1)(tsx@4.20.6))
+ storybook: 10.1.0(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(prettier@3.7.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(utf-8-validate@6.0.5)
ts-dedent: 2.2.0
- '@storybook/addon-controls@8.6.14(storybook@9.1.16(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(msw@2.12.2(@types/node@24.10.1)(typescript@5.9.3))(prettier@3.6.2)(utf-8-validate@6.0.5)(vite@7.2.2(@types/node@24.10.1)(sass@1.94.1)(terser@5.44.1)(tsx@4.20.6)))':
+ '@storybook/addon-controls@8.6.14(storybook@10.1.0(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(prettier@3.7.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(utf-8-validate@6.0.5))':
dependencies:
'@storybook/global': 5.0.0
dequal: 2.0.3
- storybook: 9.1.16(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(msw@2.12.2(@types/node@24.10.1)(typescript@5.9.3))(prettier@3.6.2)(utf-8-validate@6.0.5)(vite@7.2.2(@types/node@24.10.1)(sass@1.94.1)(terser@5.44.1)(tsx@4.20.6))
+ storybook: 10.1.0(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(prettier@3.7.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(utf-8-validate@6.0.5)
ts-dedent: 2.2.0
- '@storybook/addon-docs@8.6.14(@types/react@19.2.2)(storybook@9.1.16(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(msw@2.12.2(@types/node@24.10.1)(typescript@5.9.3))(prettier@3.6.2)(utf-8-validate@6.0.5)(vite@7.2.2(@types/node@24.10.1)(sass@1.94.1)(terser@5.44.1)(tsx@4.20.6)))':
+ '@storybook/addon-docs@8.6.14(@types/react@19.2.2)(storybook@10.1.0(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(prettier@3.7.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(utf-8-validate@6.0.5))':
dependencies:
'@mdx-js/react': 3.1.1(@types/react@19.2.2)(react@19.2.0)
- '@storybook/blocks': 8.6.14(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(storybook@9.1.16(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(msw@2.12.2(@types/node@24.10.1)(typescript@5.9.3))(prettier@3.6.2)(utf-8-validate@6.0.5)(vite@7.2.2(@types/node@24.10.1)(sass@1.94.1)(terser@5.44.1)(tsx@4.20.6)))
- '@storybook/csf-plugin': 8.6.14(storybook@9.1.16(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(msw@2.12.2(@types/node@24.10.1)(typescript@5.9.3))(prettier@3.6.2)(utf-8-validate@6.0.5)(vite@7.2.2(@types/node@24.10.1)(sass@1.94.1)(terser@5.44.1)(tsx@4.20.6)))
- '@storybook/react-dom-shim': 8.6.14(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(storybook@9.1.16(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(msw@2.12.2(@types/node@24.10.1)(typescript@5.9.3))(prettier@3.6.2)(utf-8-validate@6.0.5)(vite@7.2.2(@types/node@24.10.1)(sass@1.94.1)(terser@5.44.1)(tsx@4.20.6)))
+ '@storybook/blocks': 8.6.14(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(storybook@10.1.0(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(prettier@3.7.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(utf-8-validate@6.0.5))
+ '@storybook/csf-plugin': 8.6.14(storybook@10.1.0(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(prettier@3.7.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(utf-8-validate@6.0.5))
+ '@storybook/react-dom-shim': 8.6.14(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(storybook@10.1.0(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(prettier@3.7.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(utf-8-validate@6.0.5))
react: 19.2.0
react-dom: 19.2.0(react@19.2.0)
- storybook: 9.1.16(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(msw@2.12.2(@types/node@24.10.1)(typescript@5.9.3))(prettier@3.6.2)(utf-8-validate@6.0.5)(vite@7.2.2(@types/node@24.10.1)(sass@1.94.1)(terser@5.44.1)(tsx@4.20.6))
+ storybook: 10.1.0(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(prettier@3.7.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(utf-8-validate@6.0.5)
ts-dedent: 2.2.0
transitivePeerDependencies:
- '@types/react'
- '@storybook/addon-essentials@8.6.14(@types/react@19.2.2)(storybook@9.1.16(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(msw@2.12.2(@types/node@24.10.1)(typescript@5.9.3))(prettier@3.6.2)(utf-8-validate@6.0.5)(vite@7.2.2(@types/node@24.10.1)(sass@1.94.1)(terser@5.44.1)(tsx@4.20.6)))':
+ '@storybook/addon-essentials@8.6.14(@types/react@19.2.2)(storybook@10.1.0(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(prettier@3.7.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(utf-8-validate@6.0.5))':
dependencies:
- '@storybook/addon-actions': 8.6.14(storybook@9.1.16(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(msw@2.12.2(@types/node@24.10.1)(typescript@5.9.3))(prettier@3.6.2)(utf-8-validate@6.0.5)(vite@7.2.2(@types/node@24.10.1)(sass@1.94.1)(terser@5.44.1)(tsx@4.20.6)))
- '@storybook/addon-backgrounds': 8.6.14(storybook@9.1.16(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(msw@2.12.2(@types/node@24.10.1)(typescript@5.9.3))(prettier@3.6.2)(utf-8-validate@6.0.5)(vite@7.2.2(@types/node@24.10.1)(sass@1.94.1)(terser@5.44.1)(tsx@4.20.6)))
- '@storybook/addon-controls': 8.6.14(storybook@9.1.16(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(msw@2.12.2(@types/node@24.10.1)(typescript@5.9.3))(prettier@3.6.2)(utf-8-validate@6.0.5)(vite@7.2.2(@types/node@24.10.1)(sass@1.94.1)(terser@5.44.1)(tsx@4.20.6)))
- '@storybook/addon-docs': 8.6.14(@types/react@19.2.2)(storybook@9.1.16(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(msw@2.12.2(@types/node@24.10.1)(typescript@5.9.3))(prettier@3.6.2)(utf-8-validate@6.0.5)(vite@7.2.2(@types/node@24.10.1)(sass@1.94.1)(terser@5.44.1)(tsx@4.20.6)))
- '@storybook/addon-highlight': 8.6.14(storybook@9.1.16(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(msw@2.12.2(@types/node@24.10.1)(typescript@5.9.3))(prettier@3.6.2)(utf-8-validate@6.0.5)(vite@7.2.2(@types/node@24.10.1)(sass@1.94.1)(terser@5.44.1)(tsx@4.20.6)))
- '@storybook/addon-measure': 8.6.14(storybook@9.1.16(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(msw@2.12.2(@types/node@24.10.1)(typescript@5.9.3))(prettier@3.6.2)(utf-8-validate@6.0.5)(vite@7.2.2(@types/node@24.10.1)(sass@1.94.1)(terser@5.44.1)(tsx@4.20.6)))
- '@storybook/addon-outline': 8.6.14(storybook@9.1.16(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(msw@2.12.2(@types/node@24.10.1)(typescript@5.9.3))(prettier@3.6.2)(utf-8-validate@6.0.5)(vite@7.2.2(@types/node@24.10.1)(sass@1.94.1)(terser@5.44.1)(tsx@4.20.6)))
- '@storybook/addon-toolbars': 8.6.14(storybook@9.1.16(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(msw@2.12.2(@types/node@24.10.1)(typescript@5.9.3))(prettier@3.6.2)(utf-8-validate@6.0.5)(vite@7.2.2(@types/node@24.10.1)(sass@1.94.1)(terser@5.44.1)(tsx@4.20.6)))
- '@storybook/addon-viewport': 8.6.14(storybook@9.1.16(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(msw@2.12.2(@types/node@24.10.1)(typescript@5.9.3))(prettier@3.6.2)(utf-8-validate@6.0.5)(vite@7.2.2(@types/node@24.10.1)(sass@1.94.1)(terser@5.44.1)(tsx@4.20.6)))
- storybook: 9.1.16(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(msw@2.12.2(@types/node@24.10.1)(typescript@5.9.3))(prettier@3.6.2)(utf-8-validate@6.0.5)(vite@7.2.2(@types/node@24.10.1)(sass@1.94.1)(terser@5.44.1)(tsx@4.20.6))
+ '@storybook/addon-actions': 8.6.14(storybook@10.1.0(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(prettier@3.7.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(utf-8-validate@6.0.5))
+ '@storybook/addon-backgrounds': 8.6.14(storybook@10.1.0(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(prettier@3.7.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(utf-8-validate@6.0.5))
+ '@storybook/addon-controls': 8.6.14(storybook@10.1.0(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(prettier@3.7.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(utf-8-validate@6.0.5))
+ '@storybook/addon-docs': 8.6.14(@types/react@19.2.2)(storybook@10.1.0(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(prettier@3.7.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(utf-8-validate@6.0.5))
+ '@storybook/addon-highlight': 8.6.14(storybook@10.1.0(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(prettier@3.7.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(utf-8-validate@6.0.5))
+ '@storybook/addon-measure': 8.6.14(storybook@10.1.0(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(prettier@3.7.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(utf-8-validate@6.0.5))
+ '@storybook/addon-outline': 8.6.14(storybook@10.1.0(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(prettier@3.7.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(utf-8-validate@6.0.5))
+ '@storybook/addon-toolbars': 8.6.14(storybook@10.1.0(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(prettier@3.7.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(utf-8-validate@6.0.5))
+ '@storybook/addon-viewport': 8.6.14(storybook@10.1.0(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(prettier@3.7.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(utf-8-validate@6.0.5))
+ storybook: 10.1.0(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(prettier@3.7.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(utf-8-validate@6.0.5)
ts-dedent: 2.2.0
transitivePeerDependencies:
- '@types/react'
- '@storybook/addon-highlight@8.6.14(storybook@9.1.16(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(msw@2.12.2(@types/node@24.10.1)(typescript@5.9.3))(prettier@3.6.2)(utf-8-validate@6.0.5)(vite@7.2.2(@types/node@24.10.1)(sass@1.94.1)(terser@5.44.1)(tsx@4.20.6)))':
+ '@storybook/addon-highlight@8.6.14(storybook@10.1.0(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(prettier@3.7.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(utf-8-validate@6.0.5))':
dependencies:
'@storybook/global': 5.0.0
- storybook: 9.1.16(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(msw@2.12.2(@types/node@24.10.1)(typescript@5.9.3))(prettier@3.6.2)(utf-8-validate@6.0.5)(vite@7.2.2(@types/node@24.10.1)(sass@1.94.1)(terser@5.44.1)(tsx@4.20.6))
+ storybook: 10.1.0(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(prettier@3.7.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(utf-8-validate@6.0.5)
- '@storybook/addon-interactions@8.6.14(storybook@9.1.16(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(msw@2.12.2(@types/node@24.10.1)(typescript@5.9.3))(prettier@3.6.2)(utf-8-validate@6.0.5)(vite@7.2.2(@types/node@24.10.1)(sass@1.94.1)(terser@5.44.1)(tsx@4.20.6)))':
+ '@storybook/addon-interactions@8.6.14(storybook@10.1.0(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(prettier@3.7.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(utf-8-validate@6.0.5))':
dependencies:
'@storybook/global': 5.0.0
- '@storybook/instrumenter': 8.6.14(storybook@9.1.16(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(msw@2.12.2(@types/node@24.10.1)(typescript@5.9.3))(prettier@3.6.2)(utf-8-validate@6.0.5)(vite@7.2.2(@types/node@24.10.1)(sass@1.94.1)(terser@5.44.1)(tsx@4.20.6)))
- '@storybook/test': 8.6.14(storybook@9.1.16(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(msw@2.12.2(@types/node@24.10.1)(typescript@5.9.3))(prettier@3.6.2)(utf-8-validate@6.0.5)(vite@7.2.2(@types/node@24.10.1)(sass@1.94.1)(terser@5.44.1)(tsx@4.20.6)))
+ '@storybook/instrumenter': 8.6.14(storybook@10.1.0(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(prettier@3.7.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(utf-8-validate@6.0.5))
+ '@storybook/test': 8.6.14(storybook@10.1.0(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(prettier@3.7.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(utf-8-validate@6.0.5))
polished: 4.3.1
- storybook: 9.1.16(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(msw@2.12.2(@types/node@24.10.1)(typescript@5.9.3))(prettier@3.6.2)(utf-8-validate@6.0.5)(vite@7.2.2(@types/node@24.10.1)(sass@1.94.1)(terser@5.44.1)(tsx@4.20.6))
+ storybook: 10.1.0(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(prettier@3.7.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(utf-8-validate@6.0.5)
ts-dedent: 2.2.0
- '@storybook/addon-links@9.1.16(react@19.2.0)(storybook@9.1.16(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(msw@2.12.2(@types/node@24.10.1)(typescript@5.9.3))(prettier@3.6.2)(utf-8-validate@6.0.5)(vite@7.2.2(@types/node@24.10.1)(sass@1.94.1)(terser@5.44.1)(tsx@4.20.6)))':
+ '@storybook/addon-links@10.1.0(react@19.2.0)(storybook@10.1.0(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(prettier@3.7.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(utf-8-validate@6.0.5))':
dependencies:
'@storybook/global': 5.0.0
- storybook: 9.1.16(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(msw@2.12.2(@types/node@24.10.1)(typescript@5.9.3))(prettier@3.6.2)(utf-8-validate@6.0.5)(vite@7.2.2(@types/node@24.10.1)(sass@1.94.1)(terser@5.44.1)(tsx@4.20.6))
+ storybook: 10.1.0(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(prettier@3.7.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(utf-8-validate@6.0.5)
optionalDependencies:
react: 19.2.0
- '@storybook/addon-mdx-gfm@8.6.14(storybook@9.1.16(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(msw@2.12.2(@types/node@24.10.1)(typescript@5.9.3))(prettier@3.6.2)(utf-8-validate@6.0.5)(vite@7.2.2(@types/node@24.10.1)(sass@1.94.1)(terser@5.44.1)(tsx@4.20.6)))':
+ '@storybook/addon-mdx-gfm@8.6.14(storybook@10.1.0(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(prettier@3.7.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(utf-8-validate@6.0.5))':
dependencies:
remark-gfm: 4.0.1
- storybook: 9.1.16(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(msw@2.12.2(@types/node@24.10.1)(typescript@5.9.3))(prettier@3.6.2)(utf-8-validate@6.0.5)(vite@7.2.2(@types/node@24.10.1)(sass@1.94.1)(terser@5.44.1)(tsx@4.20.6))
+ storybook: 10.1.0(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(prettier@3.7.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(utf-8-validate@6.0.5)
ts-dedent: 2.2.0
transitivePeerDependencies:
- supports-color
- '@storybook/addon-measure@8.6.14(storybook@9.1.16(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(msw@2.12.2(@types/node@24.10.1)(typescript@5.9.3))(prettier@3.6.2)(utf-8-validate@6.0.5)(vite@7.2.2(@types/node@24.10.1)(sass@1.94.1)(terser@5.44.1)(tsx@4.20.6)))':
+ '@storybook/addon-measure@8.6.14(storybook@10.1.0(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(prettier@3.7.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(utf-8-validate@6.0.5))':
dependencies:
'@storybook/global': 5.0.0
- storybook: 9.1.16(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(msw@2.12.2(@types/node@24.10.1)(typescript@5.9.3))(prettier@3.6.2)(utf-8-validate@6.0.5)(vite@7.2.2(@types/node@24.10.1)(sass@1.94.1)(terser@5.44.1)(tsx@4.20.6))
+ storybook: 10.1.0(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(prettier@3.7.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(utf-8-validate@6.0.5)
tiny-invariant: 1.3.3
- '@storybook/addon-outline@8.6.14(storybook@9.1.16(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(msw@2.12.2(@types/node@24.10.1)(typescript@5.9.3))(prettier@3.6.2)(utf-8-validate@6.0.5)(vite@7.2.2(@types/node@24.10.1)(sass@1.94.1)(terser@5.44.1)(tsx@4.20.6)))':
+ '@storybook/addon-outline@8.6.14(storybook@10.1.0(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(prettier@3.7.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(utf-8-validate@6.0.5))':
dependencies:
'@storybook/global': 5.0.0
- storybook: 9.1.16(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(msw@2.12.2(@types/node@24.10.1)(typescript@5.9.3))(prettier@3.6.2)(utf-8-validate@6.0.5)(vite@7.2.2(@types/node@24.10.1)(sass@1.94.1)(terser@5.44.1)(tsx@4.20.6))
+ storybook: 10.1.0(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(prettier@3.7.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(utf-8-validate@6.0.5)
ts-dedent: 2.2.0
- '@storybook/addon-storysource@8.6.14(storybook@9.1.16(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(msw@2.12.2(@types/node@24.10.1)(typescript@5.9.3))(prettier@3.6.2)(utf-8-validate@6.0.5)(vite@7.2.2(@types/node@24.10.1)(sass@1.94.1)(terser@5.44.1)(tsx@4.20.6)))':
+ '@storybook/addon-storysource@8.6.14(storybook@10.1.0(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(prettier@3.7.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(utf-8-validate@6.0.5))':
dependencies:
- '@storybook/source-loader': 8.6.14(storybook@9.1.16(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(msw@2.12.2(@types/node@24.10.1)(typescript@5.9.3))(prettier@3.6.2)(utf-8-validate@6.0.5)(vite@7.2.2(@types/node@24.10.1)(sass@1.94.1)(terser@5.44.1)(tsx@4.20.6)))
+ '@storybook/source-loader': 8.6.14(storybook@10.1.0(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(prettier@3.7.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(utf-8-validate@6.0.5))
estraverse: 5.3.0
- storybook: 9.1.16(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(msw@2.12.2(@types/node@24.10.1)(typescript@5.9.3))(prettier@3.6.2)(utf-8-validate@6.0.5)(vite@7.2.2(@types/node@24.10.1)(sass@1.94.1)(terser@5.44.1)(tsx@4.20.6))
+ storybook: 10.1.0(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(prettier@3.7.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(utf-8-validate@6.0.5)
tiny-invariant: 1.3.3
- '@storybook/addon-toolbars@8.6.14(storybook@9.1.16(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(msw@2.12.2(@types/node@24.10.1)(typescript@5.9.3))(prettier@3.6.2)(utf-8-validate@6.0.5)(vite@7.2.2(@types/node@24.10.1)(sass@1.94.1)(terser@5.44.1)(tsx@4.20.6)))':
+ '@storybook/addon-toolbars@8.6.14(storybook@10.1.0(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(prettier@3.7.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(utf-8-validate@6.0.5))':
dependencies:
- storybook: 9.1.16(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(msw@2.12.2(@types/node@24.10.1)(typescript@5.9.3))(prettier@3.6.2)(utf-8-validate@6.0.5)(vite@7.2.2(@types/node@24.10.1)(sass@1.94.1)(terser@5.44.1)(tsx@4.20.6))
+ storybook: 10.1.0(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(prettier@3.7.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(utf-8-validate@6.0.5)
- '@storybook/addon-viewport@8.6.14(storybook@9.1.16(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(msw@2.12.2(@types/node@24.10.1)(typescript@5.9.3))(prettier@3.6.2)(utf-8-validate@6.0.5)(vite@7.2.2(@types/node@24.10.1)(sass@1.94.1)(terser@5.44.1)(tsx@4.20.6)))':
+ '@storybook/addon-viewport@8.6.14(storybook@10.1.0(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(prettier@3.7.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(utf-8-validate@6.0.5))':
dependencies:
memoizerific: 1.11.3
- storybook: 9.1.16(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(msw@2.12.2(@types/node@24.10.1)(typescript@5.9.3))(prettier@3.6.2)(utf-8-validate@6.0.5)(vite@7.2.2(@types/node@24.10.1)(sass@1.94.1)(terser@5.44.1)(tsx@4.20.6))
+ storybook: 10.1.0(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(prettier@3.7.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(utf-8-validate@6.0.5)
- '@storybook/blocks@8.6.14(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(storybook@9.1.16(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(msw@2.12.2(@types/node@24.10.1)(typescript@5.9.3))(prettier@3.6.2)(utf-8-validate@6.0.5)(vite@7.2.2(@types/node@24.10.1)(sass@1.94.1)(terser@5.44.1)(tsx@4.20.6)))':
+ '@storybook/blocks@8.6.14(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(storybook@10.1.0(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(prettier@3.7.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(utf-8-validate@6.0.5))':
dependencies:
'@storybook/icons': 1.6.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
- storybook: 9.1.16(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(msw@2.12.2(@types/node@24.10.1)(typescript@5.9.3))(prettier@3.6.2)(utf-8-validate@6.0.5)(vite@7.2.2(@types/node@24.10.1)(sass@1.94.1)(terser@5.44.1)(tsx@4.20.6))
+ storybook: 10.1.0(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(prettier@3.7.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(utf-8-validate@6.0.5)
ts-dedent: 2.2.0
optionalDependencies:
react: 19.2.0
react-dom: 19.2.0(react@19.2.0)
- '@storybook/builder-vite@9.1.16(storybook@9.1.16(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(msw@2.12.2(@types/node@24.10.1)(typescript@5.9.3))(prettier@3.6.2)(utf-8-validate@6.0.5)(vite@7.2.2(@types/node@24.10.1)(sass@1.94.1)(terser@5.44.1)(tsx@4.20.6)))(vite@7.2.2(@types/node@24.10.1)(sass@1.94.1)(terser@5.44.1)(tsx@4.20.6))':
+ '@storybook/builder-vite@10.1.0(esbuild@0.27.0)(msw@2.12.3(@types/node@24.10.1)(typescript@5.9.3))(rollup@4.53.3)(storybook@10.1.0(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(prettier@3.7.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(utf-8-validate@6.0.5))(vite@7.2.4(@types/node@24.10.1)(sass@1.94.2)(terser@5.44.1)(tsx@4.20.6))':
dependencies:
- '@storybook/csf-plugin': 9.1.16(storybook@9.1.16(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(msw@2.12.2(@types/node@24.10.1)(typescript@5.9.3))(prettier@3.6.2)(utf-8-validate@6.0.5)(vite@7.2.2(@types/node@24.10.1)(sass@1.94.1)(terser@5.44.1)(tsx@4.20.6)))
- storybook: 9.1.16(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(msw@2.12.2(@types/node@24.10.1)(typescript@5.9.3))(prettier@3.6.2)(utf-8-validate@6.0.5)(vite@7.2.2(@types/node@24.10.1)(sass@1.94.1)(terser@5.44.1)(tsx@4.20.6))
+ '@storybook/csf-plugin': 10.1.0(esbuild@0.27.0)(rollup@4.53.3)(storybook@10.1.0(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(prettier@3.7.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(utf-8-validate@6.0.5))(vite@7.2.4(@types/node@24.10.1)(sass@1.94.2)(terser@5.44.1)(tsx@4.20.6))
+ '@vitest/mocker': 3.2.4(msw@2.12.3(@types/node@24.10.1)(typescript@5.9.3))(vite@7.2.4(@types/node@24.10.1)(sass@1.94.2)(terser@5.44.1)(tsx@4.20.6))
+ storybook: 10.1.0(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(prettier@3.7.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(utf-8-validate@6.0.5)
ts-dedent: 2.2.0
- vite: 7.2.2(@types/node@24.10.1)(sass@1.94.1)(terser@5.44.1)(tsx@4.20.6)
+ vite: 7.2.4(@types/node@24.10.1)(sass@1.94.2)(terser@5.44.1)(tsx@4.20.6)
+ transitivePeerDependencies:
+ - esbuild
+ - msw
+ - rollup
+ - webpack
- '@storybook/components@8.6.14(storybook@9.1.16(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(msw@2.12.2(@types/node@24.10.1)(typescript@5.9.3))(prettier@3.6.2)(utf-8-validate@6.0.5)(vite@7.2.2(@types/node@24.10.1)(sass@1.94.1)(terser@5.44.1)(tsx@4.20.6)))':
+ '@storybook/components@8.6.14(storybook@10.1.0(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(prettier@3.7.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(utf-8-validate@6.0.5))':
dependencies:
- storybook: 9.1.16(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(msw@2.12.2(@types/node@24.10.1)(typescript@5.9.3))(prettier@3.6.2)(utf-8-validate@6.0.5)(vite@7.2.2(@types/node@24.10.1)(sass@1.94.1)(terser@5.44.1)(tsx@4.20.6))
+ storybook: 10.1.0(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(prettier@3.7.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(utf-8-validate@6.0.5)
- '@storybook/core-events@8.6.14(storybook@9.1.16(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(msw@2.12.2(@types/node@24.10.1)(typescript@5.9.3))(prettier@3.6.2)(utf-8-validate@6.0.5)(vite@7.2.2(@types/node@24.10.1)(sass@1.94.1)(terser@5.44.1)(tsx@4.20.6)))':
+ '@storybook/core-events@8.6.14(storybook@10.1.0(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(prettier@3.7.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(utf-8-validate@6.0.5))':
dependencies:
- storybook: 9.1.16(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(msw@2.12.2(@types/node@24.10.1)(typescript@5.9.3))(prettier@3.6.2)(utf-8-validate@6.0.5)(vite@7.2.2(@types/node@24.10.1)(sass@1.94.1)(terser@5.44.1)(tsx@4.20.6))
+ storybook: 10.1.0(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(prettier@3.7.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(utf-8-validate@6.0.5)
- '@storybook/csf-plugin@8.6.14(storybook@9.1.16(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(msw@2.12.2(@types/node@24.10.1)(typescript@5.9.3))(prettier@3.6.2)(utf-8-validate@6.0.5)(vite@7.2.2(@types/node@24.10.1)(sass@1.94.1)(terser@5.44.1)(tsx@4.20.6)))':
+ '@storybook/csf-plugin@10.1.0(esbuild@0.27.0)(rollup@4.53.3)(storybook@10.1.0(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(prettier@3.7.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(utf-8-validate@6.0.5))(vite@7.2.4(@types/node@24.10.1)(sass@1.94.2)(terser@5.44.1)(tsx@4.20.6))':
dependencies:
- storybook: 9.1.16(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(msw@2.12.2(@types/node@24.10.1)(typescript@5.9.3))(prettier@3.6.2)(utf-8-validate@6.0.5)(vite@7.2.2(@types/node@24.10.1)(sass@1.94.1)(terser@5.44.1)(tsx@4.20.6))
- unplugin: 1.16.1
+ storybook: 10.1.0(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(prettier@3.7.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(utf-8-validate@6.0.5)
+ unplugin: 2.3.10
+ optionalDependencies:
+ esbuild: 0.27.0
+ rollup: 4.53.3
+ vite: 7.2.4(@types/node@24.10.1)(sass@1.94.2)(terser@5.44.1)(tsx@4.20.6)
- '@storybook/csf-plugin@9.1.16(storybook@9.1.16(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(msw@2.12.2(@types/node@24.10.1)(typescript@5.9.3))(prettier@3.6.2)(utf-8-validate@6.0.5)(vite@7.2.2(@types/node@24.10.1)(sass@1.94.1)(terser@5.44.1)(tsx@4.20.6)))':
+ '@storybook/csf-plugin@8.6.14(storybook@10.1.0(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(prettier@3.7.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(utf-8-validate@6.0.5))':
dependencies:
- storybook: 9.1.16(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(msw@2.12.2(@types/node@24.10.1)(typescript@5.9.3))(prettier@3.6.2)(utf-8-validate@6.0.5)(vite@7.2.2(@types/node@24.10.1)(sass@1.94.1)(terser@5.44.1)(tsx@4.20.6))
+ storybook: 10.1.0(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(prettier@3.7.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(utf-8-validate@6.0.5)
unplugin: 1.16.1
'@storybook/global@5.0.0': {}
@@ -14646,123 +15032,137 @@ snapshots:
react: 19.2.0
react-dom: 19.2.0(react@19.2.0)
- '@storybook/instrumenter@8.6.14(storybook@9.1.16(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(msw@2.12.2(@types/node@24.10.1)(typescript@5.9.3))(prettier@3.6.2)(utf-8-validate@6.0.5)(vite@7.2.2(@types/node@24.10.1)(sass@1.94.1)(terser@5.44.1)(tsx@4.20.6)))':
+ '@storybook/icons@2.0.1(react-dom@19.2.0(react@19.2.0))(react@19.2.0)':
+ dependencies:
+ react: 19.2.0
+ react-dom: 19.2.0(react@19.2.0)
+
+ '@storybook/instrumenter@8.6.14(storybook@10.1.0(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(prettier@3.7.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(utf-8-validate@6.0.5))':
dependencies:
'@storybook/global': 5.0.0
'@vitest/utils': 2.1.9
- storybook: 9.1.16(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(msw@2.12.2(@types/node@24.10.1)(typescript@5.9.3))(prettier@3.6.2)(utf-8-validate@6.0.5)(vite@7.2.2(@types/node@24.10.1)(sass@1.94.1)(terser@5.44.1)(tsx@4.20.6))
+ storybook: 10.1.0(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(prettier@3.7.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(utf-8-validate@6.0.5)
- '@storybook/manager-api@8.6.14(storybook@9.1.16(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(msw@2.12.2(@types/node@24.10.1)(typescript@5.9.3))(prettier@3.6.2)(utf-8-validate@6.0.5)(vite@7.2.2(@types/node@24.10.1)(sass@1.94.1)(terser@5.44.1)(tsx@4.20.6)))':
+ '@storybook/manager-api@8.6.14(storybook@10.1.0(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(prettier@3.7.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(utf-8-validate@6.0.5))':
dependencies:
- storybook: 9.1.16(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(msw@2.12.2(@types/node@24.10.1)(typescript@5.9.3))(prettier@3.6.2)(utf-8-validate@6.0.5)(vite@7.2.2(@types/node@24.10.1)(sass@1.94.1)(terser@5.44.1)(tsx@4.20.6))
+ storybook: 10.1.0(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(prettier@3.7.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(utf-8-validate@6.0.5)
- '@storybook/preview-api@8.6.14(storybook@9.1.16(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(msw@2.12.2(@types/node@24.10.1)(typescript@5.9.3))(prettier@3.6.2)(utf-8-validate@6.0.5)(vite@7.2.2(@types/node@24.10.1)(sass@1.94.1)(terser@5.44.1)(tsx@4.20.6)))':
+ '@storybook/preview-api@8.6.14(storybook@10.1.0(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(prettier@3.7.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(utf-8-validate@6.0.5))':
dependencies:
- storybook: 9.1.16(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(msw@2.12.2(@types/node@24.10.1)(typescript@5.9.3))(prettier@3.6.2)(utf-8-validate@6.0.5)(vite@7.2.2(@types/node@24.10.1)(sass@1.94.1)(terser@5.44.1)(tsx@4.20.6))
+ storybook: 10.1.0(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(prettier@3.7.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(utf-8-validate@6.0.5)
- '@storybook/react-dom-shim@8.6.14(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(storybook@9.1.16(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(msw@2.12.2(@types/node@24.10.1)(typescript@5.9.3))(prettier@3.6.2)(utf-8-validate@6.0.5)(vite@7.2.2(@types/node@24.10.1)(sass@1.94.1)(terser@5.44.1)(tsx@4.20.6)))':
+ '@storybook/react-dom-shim@10.1.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(storybook@10.1.0(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(prettier@3.7.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(utf-8-validate@6.0.5))':
dependencies:
react: 19.2.0
react-dom: 19.2.0(react@19.2.0)
- storybook: 9.1.16(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(msw@2.12.2(@types/node@24.10.1)(typescript@5.9.3))(prettier@3.6.2)(utf-8-validate@6.0.5)(vite@7.2.2(@types/node@24.10.1)(sass@1.94.1)(terser@5.44.1)(tsx@4.20.6))
+ storybook: 10.1.0(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(prettier@3.7.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(utf-8-validate@6.0.5)
- '@storybook/react-dom-shim@9.1.16(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(storybook@9.1.16(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(msw@2.12.2(@types/node@24.10.1)(typescript@5.9.3))(prettier@3.6.2)(utf-8-validate@6.0.5)(vite@7.2.2(@types/node@24.10.1)(sass@1.94.1)(terser@5.44.1)(tsx@4.20.6)))':
+ '@storybook/react-dom-shim@8.6.14(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(storybook@10.1.0(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(prettier@3.7.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(utf-8-validate@6.0.5))':
dependencies:
react: 19.2.0
react-dom: 19.2.0(react@19.2.0)
- storybook: 9.1.16(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(msw@2.12.2(@types/node@24.10.1)(typescript@5.9.3))(prettier@3.6.2)(utf-8-validate@6.0.5)(vite@7.2.2(@types/node@24.10.1)(sass@1.94.1)(terser@5.44.1)(tsx@4.20.6))
+ storybook: 10.1.0(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(prettier@3.7.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(utf-8-validate@6.0.5)
- '@storybook/react-vite@9.1.16(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(rollup@4.53.3)(storybook@9.1.16(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(msw@2.12.2(@types/node@24.10.1)(typescript@5.9.3))(prettier@3.6.2)(utf-8-validate@6.0.5)(vite@7.2.2(@types/node@24.10.1)(sass@1.94.1)(terser@5.44.1)(tsx@4.20.6)))(typescript@5.9.3)(vite@7.2.2(@types/node@24.10.1)(sass@1.94.1)(terser@5.44.1)(tsx@4.20.6))':
+ '@storybook/react-vite@10.1.0(esbuild@0.27.0)(msw@2.12.3(@types/node@24.10.1)(typescript@5.9.3))(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(rollup@4.53.3)(storybook@10.1.0(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(prettier@3.7.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(utf-8-validate@6.0.5))(typescript@5.9.3)(vite@7.2.4(@types/node@24.10.1)(sass@1.94.2)(terser@5.44.1)(tsx@4.20.6))':
dependencies:
- '@joshwooding/vite-plugin-react-docgen-typescript': 0.6.1(typescript@5.9.3)(vite@7.2.2(@types/node@24.10.1)(sass@1.94.1)(terser@5.44.1)(tsx@4.20.6))
+ '@joshwooding/vite-plugin-react-docgen-typescript': 0.6.1(typescript@5.9.3)(vite@7.2.4(@types/node@24.10.1)(sass@1.94.2)(terser@5.44.1)(tsx@4.20.6))
'@rollup/pluginutils': 5.3.0(rollup@4.53.3)
- '@storybook/builder-vite': 9.1.16(storybook@9.1.16(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(msw@2.12.2(@types/node@24.10.1)(typescript@5.9.3))(prettier@3.6.2)(utf-8-validate@6.0.5)(vite@7.2.2(@types/node@24.10.1)(sass@1.94.1)(terser@5.44.1)(tsx@4.20.6)))(vite@7.2.2(@types/node@24.10.1)(sass@1.94.1)(terser@5.44.1)(tsx@4.20.6))
- '@storybook/react': 9.1.16(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(storybook@9.1.16(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(msw@2.12.2(@types/node@24.10.1)(typescript@5.9.3))(prettier@3.6.2)(utf-8-validate@6.0.5)(vite@7.2.2(@types/node@24.10.1)(sass@1.94.1)(terser@5.44.1)(tsx@4.20.6)))(typescript@5.9.3)
- find-up: 7.0.0
+ '@storybook/builder-vite': 10.1.0(esbuild@0.27.0)(msw@2.12.3(@types/node@24.10.1)(typescript@5.9.3))(rollup@4.53.3)(storybook@10.1.0(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(prettier@3.7.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(utf-8-validate@6.0.5))(vite@7.2.4(@types/node@24.10.1)(sass@1.94.2)(terser@5.44.1)(tsx@4.20.6))
+ '@storybook/react': 10.1.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(storybook@10.1.0(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(prettier@3.7.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(utf-8-validate@6.0.5))(typescript@5.9.3)
+ empathic: 2.0.0
magic-string: 0.30.21
react: 19.2.0
react-docgen: 8.0.2
react-dom: 19.2.0(react@19.2.0)
resolve: 1.22.11
- storybook: 9.1.16(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(msw@2.12.2(@types/node@24.10.1)(typescript@5.9.3))(prettier@3.6.2)(utf-8-validate@6.0.5)(vite@7.2.2(@types/node@24.10.1)(sass@1.94.1)(terser@5.44.1)(tsx@4.20.6))
+ storybook: 10.1.0(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(prettier@3.7.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(utf-8-validate@6.0.5)
tsconfig-paths: 4.2.0
- vite: 7.2.2(@types/node@24.10.1)(sass@1.94.1)(terser@5.44.1)(tsx@4.20.6)
+ vite: 7.2.4(@types/node@24.10.1)(sass@1.94.2)(terser@5.44.1)(tsx@4.20.6)
transitivePeerDependencies:
+ - esbuild
+ - msw
- rollup
- supports-color
- typescript
+ - webpack
- '@storybook/react@9.1.16(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(storybook@9.1.16(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(msw@2.12.2(@types/node@24.10.1)(typescript@5.9.3))(prettier@3.6.2)(utf-8-validate@6.0.5)(vite@7.2.2(@types/node@24.10.1)(sass@1.94.1)(terser@5.44.1)(tsx@4.20.6)))(typescript@5.9.3)':
+ '@storybook/react@10.1.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(storybook@10.1.0(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(prettier@3.7.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(utf-8-validate@6.0.5))(typescript@5.9.3)':
dependencies:
'@storybook/global': 5.0.0
- '@storybook/react-dom-shim': 9.1.16(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(storybook@9.1.16(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(msw@2.12.2(@types/node@24.10.1)(typescript@5.9.3))(prettier@3.6.2)(utf-8-validate@6.0.5)(vite@7.2.2(@types/node@24.10.1)(sass@1.94.1)(terser@5.44.1)(tsx@4.20.6)))
+ '@storybook/react-dom-shim': 10.1.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(storybook@10.1.0(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(prettier@3.7.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(utf-8-validate@6.0.5))
react: 19.2.0
+ react-docgen: 8.0.2
react-dom: 19.2.0(react@19.2.0)
- storybook: 9.1.16(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(msw@2.12.2(@types/node@24.10.1)(typescript@5.9.3))(prettier@3.6.2)(utf-8-validate@6.0.5)(vite@7.2.2(@types/node@24.10.1)(sass@1.94.1)(terser@5.44.1)(tsx@4.20.6))
+ storybook: 10.1.0(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(prettier@3.7.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(utf-8-validate@6.0.5)
optionalDependencies:
typescript: 5.9.3
+ transitivePeerDependencies:
+ - supports-color
- '@storybook/source-loader@8.6.14(storybook@9.1.16(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(msw@2.12.2(@types/node@24.10.1)(typescript@5.9.3))(prettier@3.6.2)(utf-8-validate@6.0.5)(vite@7.2.2(@types/node@24.10.1)(sass@1.94.1)(terser@5.44.1)(tsx@4.20.6)))':
+ '@storybook/source-loader@8.6.14(storybook@10.1.0(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(prettier@3.7.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(utf-8-validate@6.0.5))':
dependencies:
es-toolkit: 1.42.0
estraverse: 5.3.0
- prettier: 3.6.2
- storybook: 9.1.16(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(msw@2.12.2(@types/node@24.10.1)(typescript@5.9.3))(prettier@3.6.2)(utf-8-validate@6.0.5)(vite@7.2.2(@types/node@24.10.1)(sass@1.94.1)(terser@5.44.1)(tsx@4.20.6))
+ prettier: 3.7.1
+ storybook: 10.1.0(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(prettier@3.7.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(utf-8-validate@6.0.5)
- '@storybook/test@8.6.14(storybook@9.1.16(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(msw@2.12.2(@types/node@24.10.1)(typescript@5.9.3))(prettier@3.6.2)(utf-8-validate@6.0.5)(vite@7.2.2(@types/node@24.10.1)(sass@1.94.1)(terser@5.44.1)(tsx@4.20.6)))':
+ '@storybook/test@8.6.14(storybook@10.1.0(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(prettier@3.7.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(utf-8-validate@6.0.5))':
dependencies:
'@storybook/global': 5.0.0
- '@storybook/instrumenter': 8.6.14(storybook@9.1.16(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(msw@2.12.2(@types/node@24.10.1)(typescript@5.9.3))(prettier@3.6.2)(utf-8-validate@6.0.5)(vite@7.2.2(@types/node@24.10.1)(sass@1.94.1)(terser@5.44.1)(tsx@4.20.6)))
+ '@storybook/instrumenter': 8.6.14(storybook@10.1.0(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(prettier@3.7.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(utf-8-validate@6.0.5))
'@testing-library/dom': 10.4.0
'@testing-library/jest-dom': 6.5.0
'@testing-library/user-event': 14.5.2(@testing-library/dom@10.4.0)
'@vitest/expect': 2.0.5
'@vitest/spy': 2.0.5
- storybook: 9.1.16(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(msw@2.12.2(@types/node@24.10.1)(typescript@5.9.3))(prettier@3.6.2)(utf-8-validate@6.0.5)(vite@7.2.2(@types/node@24.10.1)(sass@1.94.1)(terser@5.44.1)(tsx@4.20.6))
+ storybook: 10.1.0(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(prettier@3.7.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(utf-8-validate@6.0.5)
- '@storybook/theming@8.6.14(storybook@9.1.16(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(msw@2.12.2(@types/node@24.10.1)(typescript@5.9.3))(prettier@3.6.2)(utf-8-validate@6.0.5)(vite@7.2.2(@types/node@24.10.1)(sass@1.94.1)(terser@5.44.1)(tsx@4.20.6)))':
+ '@storybook/theming@8.6.14(storybook@10.1.0(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(prettier@3.7.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(utf-8-validate@6.0.5))':
dependencies:
- storybook: 9.1.16(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(msw@2.12.2(@types/node@24.10.1)(typescript@5.9.3))(prettier@3.6.2)(utf-8-validate@6.0.5)(vite@7.2.2(@types/node@24.10.1)(sass@1.94.1)(terser@5.44.1)(tsx@4.20.6))
+ storybook: 10.1.0(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(prettier@3.7.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(utf-8-validate@6.0.5)
- '@storybook/types@8.6.14(storybook@9.1.16(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(msw@2.12.2(@types/node@24.10.1)(typescript@5.9.3))(prettier@3.6.2)(utf-8-validate@6.0.5)(vite@7.2.2(@types/node@24.10.1)(sass@1.94.1)(terser@5.44.1)(tsx@4.20.6)))':
+ '@storybook/types@8.6.14(storybook@10.1.0(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(prettier@3.7.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(utf-8-validate@6.0.5))':
dependencies:
- storybook: 9.1.16(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(msw@2.12.2(@types/node@24.10.1)(typescript@5.9.3))(prettier@3.6.2)(utf-8-validate@6.0.5)(vite@7.2.2(@types/node@24.10.1)(sass@1.94.1)(terser@5.44.1)(tsx@4.20.6))
+ storybook: 10.1.0(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(prettier@3.7.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(utf-8-validate@6.0.5)
- '@storybook/vue3-vite@9.1.16(storybook@9.1.16(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(msw@2.12.2(@types/node@24.10.1)(typescript@5.9.3))(prettier@3.6.2)(utf-8-validate@6.0.5)(vite@7.2.2(@types/node@24.10.1)(sass@1.94.1)(terser@5.44.1)(tsx@4.20.6)))(vite@7.2.2(@types/node@24.10.1)(sass@1.94.1)(terser@5.44.1)(tsx@4.20.6))(vue@3.5.24(typescript@5.9.3))':
+ '@storybook/vue3-vite@10.1.0(esbuild@0.27.0)(msw@2.12.3(@types/node@24.10.1)(typescript@5.9.3))(rollup@4.53.3)(storybook@10.1.0(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(prettier@3.7.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(utf-8-validate@6.0.5))(vite@7.2.4(@types/node@24.10.1)(sass@1.94.2)(terser@5.44.1)(tsx@4.20.6))(vue@3.5.25(typescript@5.9.3))':
dependencies:
- '@storybook/builder-vite': 9.1.16(storybook@9.1.16(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(msw@2.12.2(@types/node@24.10.1)(typescript@5.9.3))(prettier@3.6.2)(utf-8-validate@6.0.5)(vite@7.2.2(@types/node@24.10.1)(sass@1.94.1)(terser@5.44.1)(tsx@4.20.6)))(vite@7.2.2(@types/node@24.10.1)(sass@1.94.1)(terser@5.44.1)(tsx@4.20.6))
- '@storybook/vue3': 9.1.16(storybook@9.1.16(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(msw@2.12.2(@types/node@24.10.1)(typescript@5.9.3))(prettier@3.6.2)(utf-8-validate@6.0.5)(vite@7.2.2(@types/node@24.10.1)(sass@1.94.1)(terser@5.44.1)(tsx@4.20.6)))(vue@3.5.24(typescript@5.9.3))
- find-package-json: 1.2.0
+ '@storybook/builder-vite': 10.1.0(esbuild@0.27.0)(msw@2.12.3(@types/node@24.10.1)(typescript@5.9.3))(rollup@4.53.3)(storybook@10.1.0(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(prettier@3.7.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(utf-8-validate@6.0.5))(vite@7.2.4(@types/node@24.10.1)(sass@1.94.2)(terser@5.44.1)(tsx@4.20.6))
+ '@storybook/vue3': 10.1.0(storybook@10.1.0(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(prettier@3.7.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(utf-8-validate@6.0.5))(vue@3.5.25(typescript@5.9.3))
magic-string: 0.30.21
- storybook: 9.1.16(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(msw@2.12.2(@types/node@24.10.1)(typescript@5.9.3))(prettier@3.6.2)(utf-8-validate@6.0.5)(vite@7.2.2(@types/node@24.10.1)(sass@1.94.1)(terser@5.44.1)(tsx@4.20.6))
+ storybook: 10.1.0(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(prettier@3.7.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(utf-8-validate@6.0.5)
typescript: 5.9.3
- vite: 7.2.2(@types/node@24.10.1)(sass@1.94.1)(terser@5.44.1)(tsx@4.20.6)
+ vite: 7.2.4(@types/node@24.10.1)(sass@1.94.2)(terser@5.44.1)(tsx@4.20.6)
vue-component-meta: 2.2.12(typescript@5.9.3)
- vue-docgen-api: 4.79.2(vue@3.5.24(typescript@5.9.3))
+ vue-docgen-api: 4.79.2(vue@3.5.25(typescript@5.9.3))
transitivePeerDependencies:
+ - esbuild
+ - msw
+ - rollup
- vue
+ - webpack
- '@storybook/vue3@9.1.16(storybook@9.1.16(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(msw@2.12.2(@types/node@24.10.1)(typescript@5.9.3))(prettier@3.6.2)(utf-8-validate@6.0.5)(vite@7.2.2(@types/node@24.10.1)(sass@1.94.1)(terser@5.44.1)(tsx@4.20.6)))(vue@3.5.24(typescript@5.9.3))':
+ '@storybook/vue3@10.1.0(storybook@10.1.0(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(prettier@3.7.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(utf-8-validate@6.0.5))(vue@3.5.25(typescript@5.9.3))':
dependencies:
'@storybook/global': 5.0.0
- storybook: 9.1.16(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(msw@2.12.2(@types/node@24.10.1)(typescript@5.9.3))(prettier@3.6.2)(utf-8-validate@6.0.5)(vite@7.2.2(@types/node@24.10.1)(sass@1.94.1)(terser@5.44.1)(tsx@4.20.6))
+ storybook: 10.1.0(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(prettier@3.7.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(utf-8-validate@6.0.5)
type-fest: 2.19.0
- vue: 3.5.24(typescript@5.9.3)
- vue-component-type-helpers: 3.1.4
+ vue: 3.5.25(typescript@5.9.3)
+ vue-component-type-helpers: 3.1.5
'@stylistic/eslint-plugin@5.5.0(eslint@9.39.1)':
dependencies:
'@eslint-community/eslint-utils': 4.9.0(eslint@9.39.1)
- '@typescript-eslint/types': 8.47.0
+ '@typescript-eslint/types': 8.48.0
eslint: 9.39.1
eslint-visitor-keys: 4.2.1
espree: 10.4.0
estraverse: 5.3.0
picomatch: 4.0.3
- '@swc/cli@0.7.9(@swc/core@1.15.2)(chokidar@4.0.3)':
+ '@swc/cli@0.7.9(@swc/core@1.15.3)(chokidar@4.0.3)':
dependencies:
- '@swc/core': 1.15.2
+ '@swc/core': 1.15.3
'@swc/counter': 0.1.3
'@xhmikosr/bin-wrapper': 13.2.0
commander: 8.3.0
@@ -14784,10 +15184,10 @@ snapshots:
'@swc/wasm': 1.2.130
optional: true
- '@swc/core-darwin-arm64@1.15.2':
+ '@swc/core-darwin-arm64@1.15.3':
optional: true
- '@swc/core-darwin-x64@1.15.2':
+ '@swc/core-darwin-x64@1.15.3':
optional: true
'@swc/core-freebsd-x64@1.3.11':
@@ -14795,52 +15195,52 @@ snapshots:
'@swc/wasm': 1.2.130
optional: true
- '@swc/core-linux-arm-gnueabihf@1.15.2':
+ '@swc/core-linux-arm-gnueabihf@1.15.3':
optional: true
- '@swc/core-linux-arm64-gnu@1.15.2':
+ '@swc/core-linux-arm64-gnu@1.15.3':
optional: true
- '@swc/core-linux-arm64-musl@1.15.2':
+ '@swc/core-linux-arm64-musl@1.15.3':
optional: true
- '@swc/core-linux-x64-gnu@1.15.2':
+ '@swc/core-linux-x64-gnu@1.15.3':
optional: true
- '@swc/core-linux-x64-musl@1.15.2':
+ '@swc/core-linux-x64-musl@1.15.3':
optional: true
- '@swc/core-win32-arm64-msvc@1.15.2':
+ '@swc/core-win32-arm64-msvc@1.15.3':
optional: true
- '@swc/core-win32-ia32-msvc@1.15.2':
+ '@swc/core-win32-ia32-msvc@1.15.3':
optional: true
- '@swc/core-win32-x64-msvc@1.15.2':
+ '@swc/core-win32-x64-msvc@1.15.3':
optional: true
- '@swc/core@1.15.2':
+ '@swc/core@1.15.3':
dependencies:
'@swc/counter': 0.1.3
'@swc/types': 0.1.25
optionalDependencies:
- '@swc/core-darwin-arm64': 1.15.2
- '@swc/core-darwin-x64': 1.15.2
- '@swc/core-linux-arm-gnueabihf': 1.15.2
- '@swc/core-linux-arm64-gnu': 1.15.2
- '@swc/core-linux-arm64-musl': 1.15.2
- '@swc/core-linux-x64-gnu': 1.15.2
- '@swc/core-linux-x64-musl': 1.15.2
- '@swc/core-win32-arm64-msvc': 1.15.2
- '@swc/core-win32-ia32-msvc': 1.15.2
- '@swc/core-win32-x64-msvc': 1.15.2
+ '@swc/core-darwin-arm64': 1.15.3
+ '@swc/core-darwin-x64': 1.15.3
+ '@swc/core-linux-arm-gnueabihf': 1.15.3
+ '@swc/core-linux-arm64-gnu': 1.15.3
+ '@swc/core-linux-arm64-musl': 1.15.3
+ '@swc/core-linux-x64-gnu': 1.15.3
+ '@swc/core-linux-x64-musl': 1.15.3
+ '@swc/core-win32-arm64-msvc': 1.15.3
+ '@swc/core-win32-ia32-msvc': 1.15.3
+ '@swc/core-win32-x64-msvc': 1.15.3
'@swc/counter@0.1.3': {}
- '@swc/jest@0.2.39(@swc/core@1.15.2)':
+ '@swc/jest@0.2.39(@swc/core@1.15.3)':
dependencies:
'@jest/create-cache-key-function': 30.2.0
- '@swc/core': 1.15.2
+ '@swc/core': 1.15.3
'@swc/counter': 0.1.3
jsonc-parser: 3.3.1
@@ -15000,14 +15400,14 @@ snapshots:
dependencies:
'@testing-library/dom': 10.4.0
- '@testing-library/vue@8.1.0(@vue/compiler-sfc@3.5.24)(vue@3.5.24(typescript@5.9.3))':
+ '@testing-library/vue@8.1.0(@vue/compiler-sfc@3.5.25)(vue@3.5.25(typescript@5.9.3))':
dependencies:
'@babel/runtime': 7.28.4
'@testing-library/dom': 9.3.4
'@vue/test-utils': 2.4.6
- vue: 3.5.24(typescript@5.9.3)
+ vue: 3.5.25(typescript@5.9.3)
optionalDependencies:
- '@vue/compiler-sfc': 3.5.24
+ '@vue/compiler-sfc': 3.5.25
'@tokenizer/inflate@0.2.7':
dependencies:
@@ -15042,7 +15442,7 @@ snapshots:
dependencies:
'@types/node': 24.10.1
- '@types/archiver@6.0.4':
+ '@types/archiver@7.0.0':
dependencies:
'@types/readdir-glob': 1.1.5
@@ -15071,8 +15471,6 @@ snapshots:
dependencies:
'@babel/types': 7.28.5
- '@types/bcryptjs@2.4.6': {}
-
'@types/body-parser@1.19.6':
dependencies:
'@types/connect': 3.4.38
@@ -15103,7 +15501,7 @@ snapshots:
'@types/debug@4.1.12':
dependencies:
- '@types/ms': 0.7.34
+ '@types/ms': 2.1.0
'@types/deep-eql@4.0.2': {}
@@ -15133,7 +15531,7 @@ snapshots:
'@types/range-parser': 1.2.7
'@types/send': 1.2.1
- '@types/express@5.0.5':
+ '@types/express@5.0.4':
dependencies:
'@types/body-parser': 1.19.6
'@types/express-serve-static-core': 5.1.0
@@ -15153,8 +15551,6 @@ snapshots:
dependencies:
'@types/unist': 3.0.3
- '@types/htmlescape@1.1.3': {}
-
'@types/http-cache-semantics@4.0.4': {}
'@types/http-errors@2.0.5': {}
@@ -15180,12 +15576,6 @@ snapshots:
'@types/js-yaml@4.0.9': {}
- '@types/jsdom@21.1.7':
- dependencies:
- '@types/node': 24.10.1
- '@types/tough-cookie': 4.0.5
- parse5: 7.3.0
-
'@types/json-schema@7.0.15': {}
'@types/json5@0.0.29': {}
@@ -15210,13 +15600,13 @@ snapshots:
dependencies:
'@types/braces': 3.0.5
- '@types/mime-types@2.1.4': {}
+ '@types/mime-types@3.0.1': {}
'@types/mime@1.3.5': {}
'@types/minimist@1.2.5': {}
- '@types/ms@0.7.34': {}
+ '@types/ms@2.1.0': {}
'@types/mysql@2.15.27':
dependencies:
@@ -15235,9 +15625,9 @@ snapshots:
dependencies:
undici-types: 7.16.0
- '@types/nodemailer@6.4.21':
+ '@types/nodemailer@7.0.4':
dependencies:
- '@aws-sdk/client-ses': 3.936.0
+ '@aws-sdk/client-sesv2': 3.938.0
'@types/node': 24.10.1
transitivePeerDependencies:
- aws-crt
@@ -15250,7 +15640,7 @@ snapshots:
'@types/oauth2orize@1.11.5':
dependencies:
- '@types/express': 5.0.5
+ '@types/express': 5.0.4
'@types/node': 24.10.1
'@types/oauth@0.9.6':
@@ -15265,20 +15655,12 @@ snapshots:
dependencies:
'@types/pg': 8.15.6
- '@types/pg@8.15.5':
- dependencies:
- '@types/node': 24.10.1
- pg-protocol: 1.10.3
- pg-types: 2.2.0
-
'@types/pg@8.15.6':
dependencies:
'@types/node': 24.10.1
pg-protocol: 1.10.3
pg-types: 2.2.0
- '@types/pug@2.0.10': {}
-
'@types/punycode@2.1.4': {}
'@types/qrcode@1.5.6':
@@ -15334,17 +15716,15 @@ snapshots:
'@types/serviceworker@0.0.74': {}
- '@types/shimmer@1.2.0': {}
-
'@types/simple-oauth2@5.0.7': {}
'@types/sinon@17.0.4':
dependencies:
- '@types/sinonjs__fake-timers': 8.1.5
+ '@types/sinonjs__fake-timers': 15.0.1
- '@types/sinonjs__fake-timers@8.1.1': {}
+ '@types/sinonjs__fake-timers@15.0.1': {}
- '@types/sinonjs__fake-timers@8.1.5': {}
+ '@types/sinonjs__fake-timers@8.1.1': {}
'@types/sizzle@2.3.10': {}
@@ -15374,8 +15754,6 @@ snapshots:
'@types/tmp@0.2.6': {}
- '@types/tough-cookie@4.0.5': {}
-
'@types/unist@3.0.3': {}
'@types/uuid@9.0.8': {}
@@ -15400,7 +15778,7 @@ snapshots:
'@types/yargs-parser@21.0.3': {}
- '@types/yargs@17.0.35':
+ '@types/yargs@17.0.34':
dependencies:
'@types/yargs-parser': 21.0.3
@@ -15426,6 +15804,23 @@ snapshots:
transitivePeerDependencies:
- supports-color
+ '@typescript-eslint/eslint-plugin@8.48.0(@typescript-eslint/parser@8.48.0(eslint@9.39.1)(typescript@5.9.3))(eslint@9.39.1)(typescript@5.9.3)':
+ dependencies:
+ '@eslint-community/regexpp': 4.12.2
+ '@typescript-eslint/parser': 8.48.0(eslint@9.39.1)(typescript@5.9.3)
+ '@typescript-eslint/scope-manager': 8.48.0
+ '@typescript-eslint/type-utils': 8.48.0(eslint@9.39.1)(typescript@5.9.3)
+ '@typescript-eslint/utils': 8.48.0(eslint@9.39.1)(typescript@5.9.3)
+ '@typescript-eslint/visitor-keys': 8.48.0
+ eslint: 9.39.1
+ graphemer: 1.4.0
+ ignore: 7.0.5
+ natural-compare: 1.4.0
+ ts-api-utils: 2.1.0(typescript@5.9.3)
+ typescript: 5.9.3
+ transitivePeerDependencies:
+ - supports-color
+
'@typescript-eslint/parser@8.47.0(eslint@9.39.1)(typescript@5.9.3)':
dependencies:
'@typescript-eslint/scope-manager': 8.47.0
@@ -15438,10 +15833,31 @@ snapshots:
transitivePeerDependencies:
- supports-color
+ '@typescript-eslint/parser@8.48.0(eslint@9.39.1)(typescript@5.9.3)':
+ dependencies:
+ '@typescript-eslint/scope-manager': 8.48.0
+ '@typescript-eslint/types': 8.48.0
+ '@typescript-eslint/typescript-estree': 8.48.0(typescript@5.9.3)
+ '@typescript-eslint/visitor-keys': 8.48.0
+ debug: 4.4.3(supports-color@10.2.2)
+ eslint: 9.39.1
+ typescript: 5.9.3
+ transitivePeerDependencies:
+ - supports-color
+
'@typescript-eslint/project-service@8.47.0(typescript@5.9.3)':
dependencies:
- '@typescript-eslint/tsconfig-utils': 8.47.0(typescript@5.9.3)
- '@typescript-eslint/types': 8.47.0
+ '@typescript-eslint/tsconfig-utils': 8.48.0(typescript@5.9.3)
+ '@typescript-eslint/types': 8.48.0
+ debug: 4.4.3(supports-color@10.2.2)
+ typescript: 5.9.3
+ transitivePeerDependencies:
+ - supports-color
+
+ '@typescript-eslint/project-service@8.48.0(typescript@5.9.3)':
+ dependencies:
+ '@typescript-eslint/tsconfig-utils': 8.48.0(typescript@5.9.3)
+ '@typescript-eslint/types': 8.48.0
debug: 4.4.3(supports-color@10.2.2)
typescript: 5.9.3
transitivePeerDependencies:
@@ -15452,10 +15868,19 @@ snapshots:
'@typescript-eslint/types': 8.47.0
'@typescript-eslint/visitor-keys': 8.47.0
+ '@typescript-eslint/scope-manager@8.48.0':
+ dependencies:
+ '@typescript-eslint/types': 8.48.0
+ '@typescript-eslint/visitor-keys': 8.48.0
+
'@typescript-eslint/tsconfig-utils@8.47.0(typescript@5.9.3)':
dependencies:
typescript: 5.9.3
+ '@typescript-eslint/tsconfig-utils@8.48.0(typescript@5.9.3)':
+ dependencies:
+ typescript: 5.9.3
+
'@typescript-eslint/type-utils@8.47.0(eslint@9.39.1)(typescript@5.9.3)':
dependencies:
'@typescript-eslint/types': 8.47.0
@@ -15468,8 +15893,22 @@ snapshots:
transitivePeerDependencies:
- supports-color
+ '@typescript-eslint/type-utils@8.48.0(eslint@9.39.1)(typescript@5.9.3)':
+ dependencies:
+ '@typescript-eslint/types': 8.48.0
+ '@typescript-eslint/typescript-estree': 8.48.0(typescript@5.9.3)
+ '@typescript-eslint/utils': 8.48.0(eslint@9.39.1)(typescript@5.9.3)
+ debug: 4.4.3(supports-color@10.2.2)
+ eslint: 9.39.1
+ ts-api-utils: 2.1.0(typescript@5.9.3)
+ typescript: 5.9.3
+ transitivePeerDependencies:
+ - supports-color
+
'@typescript-eslint/types@8.47.0': {}
+ '@typescript-eslint/types@8.48.0': {}
+
'@typescript-eslint/typescript-estree@8.47.0(typescript@5.9.3)':
dependencies:
'@typescript-eslint/project-service': 8.47.0(typescript@5.9.3)
@@ -15486,6 +15925,21 @@ snapshots:
transitivePeerDependencies:
- supports-color
+ '@typescript-eslint/typescript-estree@8.48.0(typescript@5.9.3)':
+ dependencies:
+ '@typescript-eslint/project-service': 8.48.0(typescript@5.9.3)
+ '@typescript-eslint/tsconfig-utils': 8.48.0(typescript@5.9.3)
+ '@typescript-eslint/types': 8.48.0
+ '@typescript-eslint/visitor-keys': 8.48.0
+ debug: 4.4.3(supports-color@10.2.2)
+ minimatch: 9.0.5
+ semver: 7.7.3
+ tinyglobby: 0.2.15
+ ts-api-utils: 2.1.0(typescript@5.9.3)
+ typescript: 5.9.3
+ transitivePeerDependencies:
+ - supports-color
+
'@typescript-eslint/utils@8.47.0(eslint@9.39.1)(typescript@5.9.3)':
dependencies:
'@eslint-community/eslint-utils': 4.9.0(eslint@9.39.1)
@@ -15497,71 +15951,66 @@ snapshots:
transitivePeerDependencies:
- supports-color
+ '@typescript-eslint/utils@8.48.0(eslint@9.39.1)(typescript@5.9.3)':
+ dependencies:
+ '@eslint-community/eslint-utils': 4.9.0(eslint@9.39.1)
+ '@typescript-eslint/scope-manager': 8.48.0
+ '@typescript-eslint/types': 8.48.0
+ '@typescript-eslint/typescript-estree': 8.48.0(typescript@5.9.3)
+ eslint: 9.39.1
+ typescript: 5.9.3
+ transitivePeerDependencies:
+ - supports-color
+
'@typescript-eslint/visitor-keys@8.47.0':
dependencies:
'@typescript-eslint/types': 8.47.0
eslint-visitor-keys: 4.2.1
+ '@typescript-eslint/visitor-keys@8.48.0':
+ dependencies:
+ '@typescript-eslint/types': 8.48.0
+ eslint-visitor-keys: 4.2.1
+
'@ungap/structured-clone@1.3.0': {}
- '@vitejs/plugin-vue@6.0.2(vite@7.2.2(@types/node@24.10.1)(sass@1.94.1)(terser@5.44.1)(tsx@4.20.6))(vue@3.5.24(typescript@5.9.3))':
+ '@vitejs/plugin-vue@6.0.2(vite@7.2.4(@types/node@24.10.1)(sass@1.94.2)(terser@5.44.1)(tsx@4.20.6))(vue@3.5.25(typescript@5.9.3))':
dependencies:
'@rolldown/pluginutils': 1.0.0-beta.50
- vite: 7.2.2(@types/node@24.10.1)(sass@1.94.1)(terser@5.44.1)(tsx@4.20.6)
- vue: 3.5.24(typescript@5.9.3)
+ vite: 7.2.4(@types/node@24.10.1)(sass@1.94.2)(terser@5.44.1)(tsx@4.20.6)
+ vue: 3.5.25(typescript@5.9.3)
- '@vitest/coverage-v8@3.2.4(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.10.1)(happy-dom@20.0.10)(jsdom@27.2.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(msw@2.12.2(@types/node@24.10.1)(typescript@5.9.3))(sass@1.94.1)(terser@5.44.1)(tsx@4.20.6))':
+ '@vitest/coverage-v8@4.0.13(vitest@4.0.13(@opentelemetry/api@1.9.0)(@types/debug@4.1.12)(@types/node@24.10.1)(happy-dom@20.0.11)(jsdom@27.2.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(msw@2.12.3(@types/node@24.10.1)(typescript@5.9.3))(sass@1.94.2)(terser@5.44.1)(tsx@4.20.6))':
dependencies:
- '@ampproject/remapping': 2.3.0
'@bcoe/v8-coverage': 1.0.2
+ '@vitest/utils': 4.0.13
ast-v8-to-istanbul: 0.3.8
debug: 4.4.3(supports-color@10.2.2)
istanbul-lib-coverage: 3.2.2
istanbul-lib-report: 3.0.1
istanbul-lib-source-maps: 5.0.6
istanbul-reports: 3.2.0
- magic-string: 0.30.21
- magicast: 0.3.5
+ magicast: 0.5.1
std-env: 3.10.0
- test-exclude: 7.0.1
- tinyrainbow: 2.0.0
- vitest: 3.2.4(@types/debug@4.1.12)(@types/node@24.10.1)(happy-dom@20.0.10)(jsdom@27.2.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(msw@2.12.2(@types/node@24.10.1)(typescript@5.9.3))(sass@1.94.1)(terser@5.44.1)(tsx@4.20.6)
+ tinyrainbow: 3.0.3
+ vitest: 4.0.13(@opentelemetry/api@1.9.0)(@types/debug@4.1.12)(@types/node@24.10.1)(happy-dom@20.0.11)(jsdom@27.2.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(msw@2.12.3(@types/node@24.10.1)(typescript@5.9.3))(sass@1.94.2)(terser@5.44.1)(tsx@4.20.6)
transitivePeerDependencies:
- supports-color
- '@vitest/coverage-v8@3.2.4(vitest@4.0.10(@types/debug@4.1.12)(@types/node@24.10.1)(happy-dom@20.0.10)(jsdom@27.2.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(msw@2.12.2(@types/node@24.10.1)(typescript@5.9.3))(sass@1.94.1)(terser@5.44.1)(tsx@4.20.6))':
+ '@vitest/coverage-v8@4.0.14(vitest@4.0.14(@opentelemetry/api@1.9.0)(@types/node@24.10.1)(happy-dom@20.0.11)(jsdom@27.2.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(msw@2.12.3(@types/node@24.10.1)(typescript@5.9.3))(sass@1.94.2)(terser@5.44.1)(tsx@4.20.6))':
dependencies:
- '@ampproject/remapping': 2.3.0
'@bcoe/v8-coverage': 1.0.2
+ '@vitest/utils': 4.0.14
ast-v8-to-istanbul: 0.3.8
- debug: 4.4.3(supports-color@10.2.2)
- istanbul-lib-coverage: 3.2.2
- istanbul-lib-report: 3.0.1
- istanbul-lib-source-maps: 5.0.6
- istanbul-reports: 3.2.0
- magic-string: 0.30.21
- magicast: 0.3.5
- std-env: 3.10.0
- test-exclude: 7.0.1
- tinyrainbow: 2.0.0
- vitest: 4.0.10(@types/debug@4.1.12)(@types/node@24.10.1)(happy-dom@20.0.10)(jsdom@27.2.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(msw@2.12.2(@types/node@24.10.1)(typescript@5.9.3))(sass@1.94.1)(terser@5.44.1)(tsx@4.20.6)
- transitivePeerDependencies:
- - supports-color
-
- '@vitest/coverage-v8@4.0.10(vitest@4.0.10(@types/debug@4.1.12)(@types/node@24.10.1)(happy-dom@20.0.10)(jsdom@27.2.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(msw@2.12.2(@types/node@24.10.1)(typescript@5.9.3))(sass@1.94.1)(terser@5.44.1)(tsx@4.20.6))':
- dependencies:
- '@bcoe/v8-coverage': 1.0.2
- '@vitest/utils': 4.0.10
- ast-v8-to-istanbul: 0.3.8
- debug: 4.4.3(supports-color@10.2.2)
istanbul-lib-coverage: 3.2.2
istanbul-lib-report: 3.0.1
istanbul-lib-source-maps: 5.0.6
istanbul-reports: 3.2.0
magicast: 0.5.1
+ obug: 2.1.1
std-env: 3.10.0
tinyrainbow: 3.0.3
- vitest: 4.0.10(@types/debug@4.1.12)(@types/node@24.10.1)(happy-dom@20.0.10)(jsdom@27.2.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(msw@2.12.2(@types/node@24.10.1)(typescript@5.9.3))(sass@1.94.1)(terser@5.44.1)(tsx@4.20.6)
+ vitest: 4.0.14(@opentelemetry/api@1.9.0)(@types/node@24.10.1)(happy-dom@20.0.11)(jsdom@27.2.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(msw@2.12.3(@types/node@24.10.1)(typescript@5.9.3))(sass@1.94.2)(terser@5.44.1)(tsx@4.20.6)
transitivePeerDependencies:
- supports-color
@@ -15580,32 +16029,50 @@ snapshots:
chai: 5.3.3
tinyrainbow: 2.0.0
- '@vitest/expect@4.0.10':
+ '@vitest/expect@4.0.13':
dependencies:
'@standard-schema/spec': 1.0.0
'@types/chai': 5.2.3
- '@vitest/spy': 4.0.10
- '@vitest/utils': 4.0.10
+ '@vitest/spy': 4.0.13
+ '@vitest/utils': 4.0.13
chai: 6.2.1
tinyrainbow: 3.0.3
- '@vitest/mocker@3.2.4(msw@2.12.2(@types/node@24.10.1)(typescript@5.9.3))(vite@7.2.2(@types/node@24.10.1)(sass@1.94.1)(terser@5.44.1)(tsx@4.20.6))':
+ '@vitest/expect@4.0.14':
+ dependencies:
+ '@standard-schema/spec': 1.0.0
+ '@types/chai': 5.2.3
+ '@vitest/spy': 4.0.14
+ '@vitest/utils': 4.0.14
+ chai: 6.2.1
+ tinyrainbow: 3.0.3
+
+ '@vitest/mocker@3.2.4(msw@2.12.3(@types/node@24.10.1)(typescript@5.9.3))(vite@7.2.4(@types/node@24.10.1)(sass@1.94.2)(terser@5.44.1)(tsx@4.20.6))':
dependencies:
'@vitest/spy': 3.2.4
estree-walker: 3.0.3
magic-string: 0.30.21
optionalDependencies:
- msw: 2.12.2(@types/node@24.10.1)(typescript@5.9.3)
- vite: 7.2.2(@types/node@24.10.1)(sass@1.94.1)(terser@5.44.1)(tsx@4.20.6)
+ msw: 2.12.3(@types/node@24.10.1)(typescript@5.9.3)
+ vite: 7.2.4(@types/node@24.10.1)(sass@1.94.2)(terser@5.44.1)(tsx@4.20.6)
- '@vitest/mocker@4.0.10(msw@2.12.2(@types/node@24.10.1)(typescript@5.9.3))(vite@7.2.2(@types/node@24.10.1)(sass@1.94.1)(terser@5.44.1)(tsx@4.20.6))':
+ '@vitest/mocker@4.0.13(msw@2.12.3(@types/node@24.10.1)(typescript@5.9.3))(vite@7.2.4(@types/node@24.10.1)(sass@1.94.2)(terser@5.44.1)(tsx@4.20.6))':
dependencies:
- '@vitest/spy': 4.0.10
+ '@vitest/spy': 4.0.13
estree-walker: 3.0.3
magic-string: 0.30.21
optionalDependencies:
- msw: 2.12.2(@types/node@24.10.1)(typescript@5.9.3)
- vite: 7.2.2(@types/node@24.10.1)(sass@1.94.1)(terser@5.44.1)(tsx@4.20.6)
+ msw: 2.12.3(@types/node@24.10.1)(typescript@5.9.3)
+ vite: 7.2.4(@types/node@24.10.1)(sass@1.94.2)(terser@5.44.1)(tsx@4.20.6)
+
+ '@vitest/mocker@4.0.14(msw@2.12.3(@types/node@24.10.1)(typescript@5.9.3))(vite@7.2.4(@types/node@24.10.1)(sass@1.94.2)(terser@5.44.1)(tsx@4.20.6))':
+ dependencies:
+ '@vitest/spy': 4.0.14
+ estree-walker: 3.0.3
+ magic-string: 0.30.21
+ optionalDependencies:
+ msw: 2.12.3(@types/node@24.10.1)(typescript@5.9.3)
+ vite: 7.2.4(@types/node@24.10.1)(sass@1.94.2)(terser@5.44.1)(tsx@4.20.6)
'@vitest/pretty-format@2.0.5':
dependencies:
@@ -15619,30 +16086,33 @@ snapshots:
dependencies:
tinyrainbow: 2.0.0
- '@vitest/pretty-format@4.0.10':
+ '@vitest/pretty-format@4.0.13':
dependencies:
tinyrainbow: 3.0.3
- '@vitest/runner@3.2.4':
+ '@vitest/pretty-format@4.0.14':
dependencies:
- '@vitest/utils': 3.2.4
+ tinyrainbow: 3.0.3
+
+ '@vitest/runner@4.0.13':
+ dependencies:
+ '@vitest/utils': 4.0.13
pathe: 2.0.3
- strip-literal: 3.1.0
- '@vitest/runner@4.0.10':
+ '@vitest/runner@4.0.14':
dependencies:
- '@vitest/utils': 4.0.10
+ '@vitest/utils': 4.0.14
pathe: 2.0.3
- '@vitest/snapshot@3.2.4':
+ '@vitest/snapshot@4.0.13':
dependencies:
- '@vitest/pretty-format': 3.2.4
+ '@vitest/pretty-format': 4.0.13
magic-string: 0.30.21
pathe: 2.0.3
- '@vitest/snapshot@4.0.10':
+ '@vitest/snapshot@4.0.14':
dependencies:
- '@vitest/pretty-format': 4.0.10
+ '@vitest/pretty-format': 4.0.14
magic-string: 0.30.21
pathe: 2.0.3
@@ -15654,7 +16124,9 @@ snapshots:
dependencies:
tinyspy: 4.0.4
- '@vitest/spy@4.0.10': {}
+ '@vitest/spy@4.0.13': {}
+
+ '@vitest/spy@4.0.14': {}
'@vitest/utils@2.0.5':
dependencies:
@@ -15675,9 +16147,14 @@ snapshots:
loupe: 3.2.1
tinyrainbow: 2.0.0
- '@vitest/utils@4.0.10':
+ '@vitest/utils@4.0.13':
+ dependencies:
+ '@vitest/pretty-format': 4.0.13
+ tinyrainbow: 3.0.3
+
+ '@vitest/utils@4.0.14':
dependencies:
- '@vitest/pretty-format': 4.0.10
+ '@vitest/pretty-format': 4.0.14
tinyrainbow: 3.0.3
'@volar/language-core@2.4.15':
@@ -15712,27 +16189,40 @@ snapshots:
estree-walker: 2.0.2
source-map-js: 1.2.1
+ '@vue/compiler-core@3.5.25':
+ dependencies:
+ '@babel/parser': 7.28.5
+ '@vue/shared': 3.5.25
+ entities: 4.5.0
+ estree-walker: 2.0.2
+ source-map-js: 1.2.1
+
'@vue/compiler-dom@3.5.24':
dependencies:
'@vue/compiler-core': 3.5.24
'@vue/shared': 3.5.24
- '@vue/compiler-sfc@3.5.24':
+ '@vue/compiler-dom@3.5.25':
+ dependencies:
+ '@vue/compiler-core': 3.5.25
+ '@vue/shared': 3.5.25
+
+ '@vue/compiler-sfc@3.5.25':
dependencies:
'@babel/parser': 7.28.5
- '@vue/compiler-core': 3.5.24
- '@vue/compiler-dom': 3.5.24
- '@vue/compiler-ssr': 3.5.24
- '@vue/shared': 3.5.24
+ '@vue/compiler-core': 3.5.25
+ '@vue/compiler-dom': 3.5.25
+ '@vue/compiler-ssr': 3.5.25
+ '@vue/shared': 3.5.25
estree-walker: 2.0.2
magic-string: 0.30.21
postcss: 8.5.6
source-map-js: 1.2.1
- '@vue/compiler-ssr@3.5.24':
+ '@vue/compiler-ssr@3.5.25':
dependencies:
- '@vue/compiler-dom': 3.5.24
- '@vue/shared': 3.5.24
+ '@vue/compiler-dom': 3.5.25
+ '@vue/shared': 3.5.25
'@vue/compiler-vue2@2.7.16':
dependencies:
@@ -15752,7 +16242,7 @@ snapshots:
optionalDependencies:
typescript: 5.9.3
- '@vue/language-core@3.1.4(typescript@5.9.3)':
+ '@vue/language-core@3.1.5(typescript@5.9.3)':
dependencies:
'@volar/language-core': 2.4.23
'@vue/compiler-dom': 3.5.24
@@ -15764,30 +16254,32 @@ snapshots:
optionalDependencies:
typescript: 5.9.3
- '@vue/reactivity@3.5.24':
+ '@vue/reactivity@3.5.25':
dependencies:
- '@vue/shared': 3.5.24
+ '@vue/shared': 3.5.25
- '@vue/runtime-core@3.5.24':
+ '@vue/runtime-core@3.5.25':
dependencies:
- '@vue/reactivity': 3.5.24
- '@vue/shared': 3.5.24
+ '@vue/reactivity': 3.5.25
+ '@vue/shared': 3.5.25
- '@vue/runtime-dom@3.5.24':
+ '@vue/runtime-dom@3.5.25':
dependencies:
- '@vue/reactivity': 3.5.24
- '@vue/runtime-core': 3.5.24
- '@vue/shared': 3.5.24
+ '@vue/reactivity': 3.5.25
+ '@vue/runtime-core': 3.5.25
+ '@vue/shared': 3.5.25
csstype: 3.2.3
- '@vue/server-renderer@3.5.24(vue@3.5.24(typescript@5.9.3))':
+ '@vue/server-renderer@3.5.25(vue@3.5.25(typescript@5.9.3))':
dependencies:
- '@vue/compiler-ssr': 3.5.24
- '@vue/shared': 3.5.24
- vue: 3.5.24(typescript@5.9.3)
+ '@vue/compiler-ssr': 3.5.25
+ '@vue/shared': 3.5.25
+ vue: 3.5.25(typescript@5.9.3)
'@vue/shared@3.5.24': {}
+ '@vue/shared@3.5.25': {}
+
'@vue/test-utils@2.4.6':
dependencies:
js-beautify: 1.15.4
@@ -15911,6 +16403,11 @@ snapshots:
mime-types: 2.1.35
negotiator: 0.6.3
+ accepts@2.0.0:
+ dependencies:
+ mime-types: 3.0.2
+ negotiator: 1.0.0
+
acorn-import-attributes@1.9.5(acorn@8.15.0):
dependencies:
acorn: 8.15.0
@@ -15945,11 +16442,6 @@ snapshots:
clean-stack: 2.2.0
indent-string: 4.0.0
- aggregate-error@5.0.0:
- dependencies:
- clean-stack: 5.3.0
- indent-string: 5.0.0
-
aiscript-vscode@https://codeload.github.com/aiscript-dev/aiscript-vscode/tar.gz/c3cde89e79a41d93540cf8a48cd619c3f2dcb1b7:
dependencies:
vscode-languageclient: 9.0.1
@@ -16307,7 +16799,7 @@ snapshots:
balanced-match@1.0.2: {}
- bare-events@2.8.2: {}
+ bare-events@2.8.1: {}
base64-js@1.5.1: {}
@@ -16317,11 +16809,7 @@ snapshots:
dependencies:
tweetnacl: 0.14.5
- bcryptjs@2.4.3: {}
-
- better-opn@3.0.2:
- dependencies:
- open: 8.4.2
+ bcryptjs@3.0.3: {}
bidi-js@1.0.3:
dependencies:
@@ -16364,6 +16852,20 @@ snapshots:
transitivePeerDependencies:
- supports-color
+ body-parser@2.2.1:
+ dependencies:
+ bytes: 3.1.2
+ content-type: 1.0.5
+ debug: 4.4.3(supports-color@10.2.2)
+ http-errors: 2.0.0
+ iconv-lite: 0.7.0
+ on-finished: 2.4.1
+ qs: 6.14.0
+ raw-body: 3.0.1
+ type-is: 2.0.1
+ transitivePeerDependencies:
+ - supports-color
+
boolbase@1.0.0: {}
bowser@2.12.1: {}
@@ -16428,7 +16930,7 @@ snapshots:
node-gyp-build: 4.8.4
optional: true
- bullmq@5.63.2:
+ bullmq@5.65.0:
dependencies:
cron-parser: 4.9.0
ioredis: 5.8.2
@@ -16450,8 +16952,6 @@ snapshots:
bytes@3.1.2: {}
- cac@6.7.14: {}
-
cacache@19.0.1:
dependencies:
'@npmcli/fs': 4.0.0
@@ -16462,7 +16962,7 @@ snapshots:
minipass-collect: 2.0.1
minipass-flush: 1.0.5
minipass-pipeline: 1.2.4
- p-map: 7.0.4
+ p-map: 7.0.3
ssri: 12.0.0
tar: 7.5.2
unique-filename: 4.0.0
@@ -16529,13 +17029,13 @@ snapshots:
caniuse-lite@1.0.30001755: {}
- canonicalize@1.0.8: {}
+ canonicalize@2.1.0: {}
canvas-confetti@1.9.4: {}
caseless@0.12.0: {}
- cbor@9.0.2:
+ cbor@10.0.11:
dependencies:
nofilter: 3.1.0
@@ -16664,10 +17164,6 @@ snapshots:
clean-stack@2.2.0: {}
- clean-stack@5.3.0:
- dependencies:
- escape-string-regexp: 5.0.0
-
cli-cursor@3.1.0:
dependencies:
restore-cursor: 3.1.0
@@ -16703,6 +17199,12 @@ snapshots:
strip-ansi: 6.0.1
wrap-ansi: 7.0.0
+ cliui@9.0.1:
+ dependencies:
+ string-width: 7.2.0
+ strip-ansi: 7.1.2
+ wrap-ansi: 9.0.2
+
cluster-key-slot@1.1.2: {}
co@4.6.0: {}
@@ -16713,8 +17215,14 @@ snapshots:
dependencies:
color-name: 1.1.4
+ color-convert@3.1.3:
+ dependencies:
+ color-name: 2.1.0
+
color-name@1.1.4: {}
+ color-name@2.1.0: {}
+
color-string@1.9.1:
dependencies:
color-name: 1.1.4
@@ -16799,12 +17307,16 @@ snapshots:
dependencies:
safe-buffer: 5.2.1
+ content-disposition@1.0.1: {}
+
content-type@1.0.5: {}
convert-source-map@2.0.0: {}
cookie-signature@1.0.6: {}
+ cookie-signature@1.2.2: {}
+
cookie@0.7.1: {}
cookie@1.0.2: {}
@@ -16858,16 +17370,6 @@ snapshots:
'@epic-web/invariant': 1.0.0
cross-spawn: 7.0.6
- cross-env@7.0.3:
- dependencies:
- cross-spawn: 7.0.6
-
- cross-fetch@4.1.0(encoding@0.1.13):
- dependencies:
- node-fetch: 2.7.0(encoding@0.1.13)
- transitivePeerDependencies:
- - encoding
-
cross-spawn@7.0.6:
dependencies:
path-key: 3.1.1
@@ -16950,21 +17452,16 @@ snapshots:
dependencies:
css-tree: 2.2.1
- cssstyle@4.6.0:
- dependencies:
- '@asamuzakjp/css-color': 3.2.0
- rrweb-cssom: 0.8.0
-
cssstyle@5.3.3:
dependencies:
- '@asamuzakjp/css-color': 4.1.0
+ '@asamuzakjp/css-color': 4.0.5
'@csstools/css-syntax-patches-for-csstree': 1.0.16
css-tree: 3.1.0
optional: true
csstype@3.2.3: {}
- cypress@15.6.0:
+ cypress@15.7.0:
dependencies:
'@cypress/request': 3.0.9
'@cypress/xvfb': 1.2.4(supports-color@8.1.1)
@@ -17002,7 +17499,6 @@ snapshots:
process: 0.11.10
proxy-from-env: 1.0.0
request-progress: 3.0.0
- semver: 7.7.3
supports-color: 8.1.1
systeminformation: 5.27.7
tmp: 0.2.5
@@ -17016,11 +17512,6 @@ snapshots:
data-uri-to-buffer@4.0.1: {}
- data-urls@5.0.0:
- dependencies:
- whatwg-mimetype: 4.0.0
- whatwg-url: 14.2.0
-
data-urls@6.0.0:
dependencies:
whatwg-mimetype: 4.0.0
@@ -17045,10 +17536,6 @@ snapshots:
es-errors: 1.3.0
is-data-view: 1.0.2
- date-fns@2.30.0:
- dependencies:
- '@babel/runtime': 7.28.4
-
date-fns@4.1.0: {}
dayjs@1.11.19: {}
@@ -17090,7 +17577,8 @@ snapshots:
decamelize@1.2.0: {}
- decimal.js@10.6.0: {}
+ decimal.js@10.6.0:
+ optional: true
decode-bmp@0.2.1:
dependencies:
@@ -17163,8 +17651,6 @@ snapshots:
es-errors: 1.3.0
gopd: 1.2.0
- define-lazy-prop@2.0.0: {}
-
define-properties@1.2.1:
dependencies:
define-data-property: 1.1.4
@@ -17304,10 +17790,14 @@ snapshots:
emittery@0.13.1: {}
+ emoji-regex@10.6.0: {}
+
emoji-regex@8.0.0: {}
emoji-regex@9.2.2: {}
+ empathic@2.0.0: {}
+
encodeurl@1.0.2: {}
encodeurl@2.0.0: {}
@@ -17453,13 +17943,6 @@ snapshots:
es6-promise: 4.2.8
optional: true
- esbuild-register@3.6.0(esbuild@0.25.11):
- dependencies:
- debug: 4.4.3(supports-color@10.2.2)
- esbuild: 0.25.11
- transitivePeerDependencies:
- - supports-color
-
esbuild@0.25.11:
optionalDependencies:
'@esbuild/aix-ppc64': 0.25.11
@@ -17563,6 +18046,16 @@ snapshots:
transitivePeerDependencies:
- supports-color
+ eslint-module-utils@2.12.1(@typescript-eslint/parser@8.48.0(eslint@9.39.1)(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint@9.39.1):
+ dependencies:
+ debug: 3.2.7(supports-color@8.1.1)
+ optionalDependencies:
+ '@typescript-eslint/parser': 8.48.0(eslint@9.39.1)(typescript@5.9.3)
+ eslint: 9.39.1
+ eslint-import-resolver-node: 0.3.9
+ transitivePeerDependencies:
+ - supports-color
+
eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.47.0(eslint@9.39.1)(typescript@5.9.3))(eslint@9.39.1):
dependencies:
'@rtsao/scc': 1.1.0
@@ -17592,19 +18085,48 @@ snapshots:
- eslint-import-resolver-webpack
- supports-color
- eslint-plugin-vue@10.5.1(@stylistic/eslint-plugin@5.5.0(eslint@9.39.1))(@typescript-eslint/parser@8.47.0(eslint@9.39.1)(typescript@5.9.3))(eslint@9.39.1)(vue-eslint-parser@10.2.0(eslint@9.39.1)):
+ eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.48.0(eslint@9.39.1)(typescript@5.9.3))(eslint@9.39.1):
+ dependencies:
+ '@rtsao/scc': 1.1.0
+ array-includes: 3.1.9
+ array.prototype.findlastindex: 1.2.6
+ array.prototype.flat: 1.3.3
+ array.prototype.flatmap: 1.3.3
+ debug: 3.2.7(supports-color@8.1.1)
+ doctrine: 2.1.0
+ eslint: 9.39.1
+ eslint-import-resolver-node: 0.3.9
+ eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.48.0(eslint@9.39.1)(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint@9.39.1)
+ hasown: 2.0.2
+ is-core-module: 2.16.1
+ is-glob: 4.0.3
+ minimatch: 3.1.2
+ object.fromentries: 2.0.8
+ object.groupby: 1.0.3
+ object.values: 1.2.1
+ semver: 6.3.1
+ string.prototype.trimend: 1.0.9
+ tsconfig-paths: 3.15.0
+ optionalDependencies:
+ '@typescript-eslint/parser': 8.48.0(eslint@9.39.1)(typescript@5.9.3)
+ transitivePeerDependencies:
+ - eslint-import-resolver-typescript
+ - eslint-import-resolver-webpack
+ - supports-color
+
+ eslint-plugin-vue@10.6.2(@stylistic/eslint-plugin@5.5.0(eslint@9.39.1))(@typescript-eslint/parser@8.48.0(eslint@9.39.1)(typescript@5.9.3))(eslint@9.39.1)(vue-eslint-parser@10.2.0(eslint@9.39.1)):
dependencies:
'@eslint-community/eslint-utils': 4.9.0(eslint@9.39.1)
eslint: 9.39.1
natural-compare: 1.4.0
nth-check: 2.1.1
- postcss-selector-parser: 6.1.2
+ postcss-selector-parser: 7.1.0
semver: 7.7.3
vue-eslint-parser: 10.2.0(eslint@9.39.1)
xml-name-validator: 4.0.0
optionalDependencies:
'@stylistic/eslint-plugin': 5.5.0(eslint@9.39.1)
- '@typescript-eslint/parser': 8.47.0(eslint@9.39.1)(typescript@5.9.3)
+ '@typescript-eslint/parser': 8.48.0(eslint@9.39.1)(typescript@5.9.3)
eslint-rule-docs@1.1.235: {}
@@ -17706,7 +18228,7 @@ snapshots:
events-universal@1.0.1:
dependencies:
- bare-events: 2.8.2
+ bare-events: 2.8.1
transitivePeerDependencies:
- bare-abort-controller
@@ -17748,18 +18270,6 @@ snapshots:
signal-exit: 3.0.7
strip-final-newline: 3.0.0
- execa@8.0.1:
- dependencies:
- cross-spawn: 7.0.6
- get-stream: 8.0.1
- human-signals: 5.0.0
- is-stream: 3.0.0
- merge-stream: 2.0.0
- npm-run-path: 5.3.0
- onetime: 6.0.0
- signal-exit: 4.1.0
- strip-final-newline: 3.0.0
-
execa@9.6.0:
dependencies:
'@sindresorhus/merge-streams': 4.0.0
@@ -17833,6 +18343,38 @@ snapshots:
transitivePeerDependencies:
- supports-color
+ express@5.1.0:
+ dependencies:
+ accepts: 2.0.0
+ body-parser: 2.2.1
+ content-disposition: 1.0.1
+ content-type: 1.0.5
+ cookie: 0.7.1
+ cookie-signature: 1.2.2
+ debug: 4.4.3(supports-color@10.2.2)
+ encodeurl: 2.0.0
+ escape-html: 1.0.3
+ etag: 1.8.1
+ finalhandler: 2.1.0
+ fresh: 2.0.0
+ http-errors: 2.0.0
+ merge-descriptors: 2.0.0
+ mime-types: 3.0.2
+ on-finished: 2.4.1
+ once: 1.4.0
+ parseurl: 1.3.3
+ proxy-addr: 2.0.7
+ qs: 6.14.0
+ range-parser: 1.2.1
+ router: 2.2.0
+ send: 1.2.0
+ serve-static: 2.2.0
+ statuses: 2.0.2
+ type-is: 2.0.1
+ vary: 1.1.2
+ transitivePeerDependencies:
+ - supports-color
+
ext-list@2.2.2:
dependencies:
mime-db: 1.54.0
@@ -17856,7 +18398,7 @@ snapshots:
extsprintf@1.3.0: {}
- fast-content-type-parse@2.0.1: {}
+ fast-content-type-parse@3.0.0: {}
fast-decode-uri-component@1.0.1: {}
@@ -17893,10 +18435,6 @@ snapshots:
fast-uri@3.1.0: {}
- fast-xml-parser@4.5.3:
- dependencies:
- strnum: 1.1.2
-
fast-xml-parser@5.2.5:
dependencies:
strnum: 2.1.1
@@ -17943,7 +18481,7 @@ snapshots:
optionalDependencies:
picomatch: 4.0.3
- feed@4.2.2:
+ feed@5.1.0:
dependencies:
xml-js: 1.6.11
@@ -18015,14 +18553,23 @@ snapshots:
transitivePeerDependencies:
- supports-color
+ finalhandler@2.1.0:
+ dependencies:
+ debug: 4.4.3(supports-color@10.2.2)
+ encodeurl: 2.0.0
+ escape-html: 1.0.3
+ on-finished: 2.4.1
+ parseurl: 1.3.3
+ statuses: 2.0.2
+ transitivePeerDependencies:
+ - supports-color
+
find-my-way@9.3.0:
dependencies:
fast-deep-equal: 3.1.3
fast-querystring: 1.1.2
safe-regex2: 5.0.0
- find-package-json@1.2.0: {}
-
find-up@4.1.0:
dependencies:
locate-path: 5.0.0
@@ -18033,23 +18580,16 @@ snapshots:
locate-path: 6.0.0
path-exists: 4.0.0
- find-up@7.0.0:
- dependencies:
- locate-path: 7.2.0
- path-exists: 5.0.0
- unicorn-magic: 0.1.0
-
find-versions@5.1.0:
dependencies:
semver-regex: 4.0.5
- fkill@9.0.0:
+ fkill@10.0.1:
dependencies:
- aggregate-error: 5.0.0
- execa: 8.0.1
- pid-port: 1.0.2
+ execa: 9.6.0
+ pid-port: 2.0.0
process-exists: 5.0.0
- ps-list: 8.1.1
+ ps-list: 9.0.0
taskkill: 5.0.0
flat-cache@4.0.1:
@@ -18107,6 +18647,8 @@ snapshots:
fresh@0.5.2: {}
+ fresh@2.0.0: {}
+
from@0.1.7: {}
fs-extra@11.3.2:
@@ -18174,6 +18716,8 @@ snapshots:
get-caller-file@2.0.5: {}
+ get-east-asian-width@1.4.0: {}
+
get-intrinsic@1.3.0:
dependencies:
call-bind-apply-helpers: 1.0.2
@@ -18200,8 +18744,6 @@ snapshots:
get-stream@6.0.1: {}
- get-stream@8.0.1: {}
-
get-stream@9.0.1:
dependencies:
'@sec-ant/readable-stream': 0.4.1
@@ -18307,7 +18849,7 @@ snapshots:
p-cancelable: 3.0.0
responselike: 3.0.0
- got@14.6.4:
+ got@14.6.5:
dependencies:
'@sindresorhus/is': 7.1.1
byte-counter: 0.1.0
@@ -18330,7 +18872,7 @@ snapshots:
hammerjs@2.0.8: {}
- happy-dom@20.0.10:
+ happy-dom@20.0.11:
dependencies:
'@types/node': 20.19.25
'@types/whatwg-mimetype': 3.0.2
@@ -18409,6 +18951,7 @@ snapshots:
html-encoding-sniffer@4.0.0:
dependencies:
whatwg-encoding: 3.1.1
+ optional: true
html-entities@2.6.0: {}
@@ -18416,8 +18959,6 @@ snapshots:
html-void-elements@3.0.0: {}
- htmlescape@1.1.1: {}
-
htmlparser2@10.0.0:
dependencies:
domelementtype: 2.3.0
@@ -18507,8 +19048,6 @@ snapshots:
human-signals@3.0.1: {}
- human-signals@5.0.0: {}
-
human-signals@8.0.1: {}
iconv-lite@0.4.24:
@@ -18544,7 +19083,7 @@ snapshots:
parent-module: 1.0.1
resolve-from: 4.0.0
- import-in-the-middle@1.15.0:
+ import-in-the-middle@2.0.0:
dependencies:
acorn: 8.15.0
acorn-import-attributes: 1.9.5(acorn@8.15.0)
@@ -18562,8 +19101,6 @@ snapshots:
indent-string@4.0.0: {}
- indent-string@5.0.0: {}
-
index-to-position@1.2.0: {}
inflight@1.0.6:
@@ -18609,7 +19146,7 @@ snapshots:
ios-haptics@0.1.4: {}
- ip-address@10.1.0: {}
+ ip-address@10.0.1: {}
ip-address@9.0.5:
dependencies:
@@ -18624,7 +19161,7 @@ snapshots:
ipaddr.js@1.9.1: {}
- ipaddr.js@2.2.0: {}
+ ipaddr.js@2.3.0: {}
irregular-plurals@3.5.0: {}
@@ -18677,8 +19214,6 @@ snapshots:
call-bound: 1.0.4
has-tostringtag: 1.0.2
- is-docker@2.2.1: {}
-
is-expression@4.0.0:
dependencies:
acorn: 7.4.1
@@ -18734,10 +19269,13 @@ snapshots:
is-plain-object@5.0.0: {}
- is-potential-custom-element-name@1.0.1: {}
+ is-potential-custom-element-name@1.0.1:
+ optional: true
is-promise@2.2.2: {}
+ is-promise@4.0.0: {}
+
is-regex@1.2.1:
dependencies:
call-bound: 1.0.4
@@ -18762,9 +19300,9 @@ snapshots:
call-bound: 1.0.4
has-tostringtag: 1.0.2
- is-svg@5.1.0:
+ is-svg@6.1.0:
dependencies:
- fast-xml-parser: 4.5.3
+ '@file-type/xml': 0.4.4
is-symbol@1.1.1:
dependencies:
@@ -18793,10 +19331,6 @@ snapshots:
call-bound: 1.0.4
get-intrinsic: 1.3.0
- is-wsl@2.2.0:
- dependencies:
- is-docker: 2.2.1
-
isarray@1.0.0: {}
isarray@2.0.5: {}
@@ -19231,33 +19765,6 @@ snapshots:
jschardet@3.1.4: {}
- jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5):
- dependencies:
- cssstyle: 4.6.0
- data-urls: 5.0.0
- decimal.js: 10.6.0
- html-encoding-sniffer: 4.0.0
- http-proxy-agent: 7.0.2
- https-proxy-agent: 7.0.6(supports-color@10.2.2)
- is-potential-custom-element-name: 1.0.1
- nwsapi: 2.2.22
- parse5: 7.3.0
- rrweb-cssom: 0.8.0
- saxes: 6.0.0
- symbol-tree: 3.2.4
- tough-cookie: 5.1.2
- w3c-xmlserializer: 5.0.0
- webidl-conversions: 7.0.0
- whatwg-encoding: 3.1.1
- whatwg-mimetype: 4.0.0
- whatwg-url: 14.2.0
- ws: 8.18.3(bufferutil@4.0.9)(utf-8-validate@6.0.5)
- xml-name-validator: 5.0.0
- transitivePeerDependencies:
- - bufferutil
- - supports-color
- - utf-8-validate
-
jsdom@27.2.0(bufferutil@4.0.9)(utf-8-validate@6.0.5):
dependencies:
'@acemir/cssom': 0.9.23
@@ -19330,14 +19837,12 @@ snapshots:
optionalDependencies:
graceful-fs: 4.2.11
- jsonld@8.3.3(web-streams-polyfill@3.3.3):
+ jsonld@9.0.0:
dependencies:
- '@digitalbazaar/http-client': 3.4.1(web-streams-polyfill@3.3.3)
- canonicalize: 1.0.8
+ '@digitalbazaar/http-client': 4.2.0
+ canonicalize: 2.1.0
lru-cache: 6.0.0
- rdf-canonize: 3.4.0
- transitivePeerDependencies:
- - web-streams-polyfill
+ rdf-canonize: 5.0.0
jsonpointer@5.0.1: {}
@@ -19396,15 +19901,7 @@ snapshots:
kleur@3.0.3: {}
- ky-universal@0.11.0(ky@0.33.3)(web-streams-polyfill@3.3.3):
- dependencies:
- abort-controller: 3.0.0
- ky: 0.33.3
- node-fetch: 3.3.2
- optionalDependencies:
- web-streams-polyfill: 3.3.3
-
- ky@0.33.3: {}
+ ky@1.14.0: {}
lazy-ass@1.6.0: {}
@@ -19423,7 +19920,7 @@ snapshots:
dependencies:
cookie: 1.0.2
process-warning: 4.0.1
- set-cookie-parser: 2.7.2
+ set-cookie-parser: 2.7.1
lilconfig@3.1.3: {}
@@ -19452,10 +19949,6 @@ snapshots:
dependencies:
p-locate: 5.0.0
- locate-path@7.2.0:
- dependencies:
- p-locate: 6.0.0
-
lodash.defaults@4.2.0: {}
lodash.isarguments@3.1.0: {}
@@ -19512,12 +20005,6 @@ snapshots:
dependencies:
'@jridgewell/sourcemap-codec': 1.5.5
- magicast@0.3.5:
- dependencies:
- '@babel/parser': 7.28.5
- '@babel/types': 7.28.5
- source-map-js: 1.2.1
-
magicast@0.5.1:
dependencies:
'@babel/parser': 7.28.5
@@ -19689,7 +20176,9 @@ snapshots:
media-typer@0.3.0: {}
- mediabunny@1.25.0:
+ media-typer@1.1.0: {}
+
+ mediabunny@1.25.3:
dependencies:
'@types/dom-mediacapture-transform': 0.1.11
'@types/dom-webcodecs': 0.1.13
@@ -19719,6 +20208,8 @@ snapshots:
merge-descriptors@1.0.3: {}
+ merge-descriptors@2.0.0: {}
+
merge-stream@2.0.0: {}
merge2@1.4.1: {}
@@ -19729,10 +20220,6 @@ snapshots:
dependencies:
'@twemoji/parser': 16.0.0
- microformats-parser@2.0.4:
- dependencies:
- parse5: 7.3.0
-
micromark-core-commonmark@2.0.3:
dependencies:
decode-named-character-reference: 1.2.0
@@ -19937,6 +20424,10 @@ snapshots:
dependencies:
mime-db: 1.52.0
+ mime-types@3.0.2:
+ dependencies:
+ mime-db: 1.54.0
+
mime@1.6.0: {}
mime@2.6.0: {}
@@ -20037,10 +20528,6 @@ snapshots:
mkdirp@1.0.4:
optional: true
- mnemonist@0.40.0:
- dependencies:
- obliterator: 2.0.5
-
mock-socket@9.3.1: {}
module-details-from-path@1.0.4: {}
@@ -20067,12 +20554,12 @@ snapshots:
optionalDependencies:
msgpackr-extract: 3.0.3
- msw-storybook-addon@2.0.6(msw@2.12.2(@types/node@24.10.1)(typescript@5.9.3)):
+ msw-storybook-addon@2.0.6(msw@2.12.3(@types/node@24.10.1)(typescript@5.9.3)):
dependencies:
is-node-process: 1.2.0
- msw: 2.12.2(@types/node@24.10.1)(typescript@5.9.3)
+ msw: 2.12.3(@types/node@24.10.1)(typescript@5.9.3)
- msw@2.12.2(@types/node@24.10.1)(typescript@5.9.3):
+ msw@2.12.3(@types/node@24.10.1)(typescript@5.9.3):
dependencies:
'@inquirer/confirm': 5.1.21(@types/node@24.10.1)
'@mswjs/interceptors': 0.40.0
@@ -20089,7 +20576,7 @@ snapshots:
statuses: 2.0.2
strict-event-emitter: 0.5.1
tough-cookie: 6.0.0
- type-fest: 4.41.0
+ type-fest: 5.2.0
until-async: 3.0.2
yargs: 17.7.2
optionalDependencies:
@@ -20169,6 +20656,7 @@ snapshots:
whatwg-url: 5.0.0
optionalDependencies:
encoding: 0.1.13
+ optional: true
node-fetch@3.3.2:
dependencies:
@@ -20199,11 +20687,16 @@ snapshots:
transitivePeerDependencies:
- supports-color
+ node-html-parser@7.0.1:
+ dependencies:
+ css-select: 5.2.2
+ he: 1.2.0
+
node-int64@0.4.0: {}
node-releases@2.0.27: {}
- nodemailer@7.0.10: {}
+ nodemailer@7.0.11: {}
nodemon@3.1.11:
dependencies:
@@ -20281,8 +20774,6 @@ snapshots:
dependencies:
boolbase: 1.0.0
- nwsapi@2.2.22: {}
-
oauth2orize-pkce@0.1.2: {}
oauth2orize@1.12.0:
@@ -20335,10 +20826,10 @@ snapshots:
define-properties: 1.2.1
es-object-atoms: 1.1.1
- obliterator@2.0.5: {}
-
oblivious-set@2.0.0: {}
+ obug@2.1.1: {}
+
on-exit-leak-free@2.1.2: {}
on-finished@2.4.1:
@@ -20359,18 +20850,12 @@ snapshots:
oniguruma-parser@0.12.1: {}
- oniguruma-to-es@4.3.3:
+ oniguruma-to-es@4.3.4:
dependencies:
oniguruma-parser: 0.12.1
regex: 6.0.1
regex-recursion: 6.0.2
- open@8.4.2:
- dependencies:
- define-lazy-prop: 2.0.0
- is-docker: 2.2.1
- is-wsl: 2.2.0
-
openapi-types@12.1.3: {}
openapi-typescript@7.10.1(typescript@5.9.3):
@@ -20422,10 +20907,6 @@ snapshots:
dependencies:
yocto-queue: 0.1.0
- p-limit@4.0.0:
- dependencies:
- yocto-queue: 1.2.2
-
p-locate@4.1.0:
dependencies:
p-limit: 2.3.0
@@ -20434,15 +20915,11 @@ snapshots:
dependencies:
p-limit: 3.1.0
- p-locate@6.0.0:
- dependencies:
- p-limit: 4.0.0
-
p-map@4.0.0:
dependencies:
aggregate-error: 3.1.0
- p-map@7.0.4: {}
+ p-map@7.0.3: {}
p-queue@6.6.2:
dependencies:
@@ -20502,8 +20979,6 @@ snapshots:
path-exists@4.0.0: {}
- path-exists@5.0.0: {}
-
path-is-absolute@1.0.1: {}
path-key@3.1.1: {}
@@ -20585,9 +21060,9 @@ snapshots:
picomatch@4.0.3: {}
- pid-port@1.0.2:
+ pid-port@2.0.0:
dependencies:
- execa: 8.0.1
+ execa: 9.6.0
pify@2.3.0: {}
@@ -20617,7 +21092,7 @@ snapshots:
optionalDependencies:
'@napi-rs/nice': 1.1.1
- pkce-challenge@4.1.0: {}
+ pkce-challenge@5.0.1: {}
pkg-dir@4.2.0:
dependencies:
@@ -20635,7 +21110,7 @@ snapshots:
pngjs@5.0.0: {}
- pnpm@10.22.0: {}
+ pnpm@10.24.0: {}
polished@4.3.1:
dependencies:
@@ -20781,11 +21256,6 @@ snapshots:
postcss: 8.5.6
postcss-value-parser: 4.2.0
- postcss-selector-parser@6.1.2:
- dependencies:
- cssesc: 3.0.0
- util-deprecate: 1.0.2
-
postcss-selector-parser@7.1.0:
dependencies:
cssesc: 3.0.0
@@ -20822,7 +21292,7 @@ snapshots:
prelude-ls@1.2.1: {}
- prettier@3.6.2: {}
+ prettier@3.7.1: {}
pretty-bytes@5.6.0: {}
@@ -20846,7 +21316,7 @@ snapshots:
dependencies:
'@chainsafe/is-ip': 2.1.0
ip-regex: 5.0.0
- ipaddr.js: 2.2.0
+ ipaddr.js: 2.3.0
netmask: 2.0.2
probe-image-size@7.2.3:
@@ -20905,6 +21375,8 @@ snapshots:
ps-list@8.1.1: {}
+ ps-list@9.0.0: {}
+
ps-tree@1.2.0:
dependencies:
event-stream: 3.3.4
@@ -21051,7 +21523,7 @@ snapshots:
iconv-lite: 0.7.0
unpipe: 1.0.0
- rdf-canonize@3.4.0:
+ rdf-canonize@5.0.0:
dependencies:
setimmediate: 1.0.5
@@ -21159,8 +21631,6 @@ snapshots:
dependencies:
lodash: 4.17.21
- redis-lock@0.1.4: {}
-
redis-parser@3.0.0:
dependencies:
redis-errors: 1.2.0
@@ -21239,11 +21709,10 @@ snapshots:
require-from-string@2.0.2: {}
- require-in-the-middle@7.5.2:
+ require-in-the-middle@8.0.1:
dependencies:
debug: 4.4.3(supports-color@10.2.2)
module-details-from-path: 1.0.4
- resolve: 1.22.11
transitivePeerDependencies:
- supports-color
@@ -21330,7 +21799,15 @@ snapshots:
'@rollup/rollup-win32-x64-msvc': 4.53.3
fsevents: 2.3.3
- rrweb-cssom@0.8.0: {}
+ router@2.2.0:
+ dependencies:
+ debug: 4.4.3(supports-color@10.2.2)
+ depd: 2.0.0
+ is-promise: 4.0.0
+ parseurl: 1.3.3
+ path-to-regexp: 8.3.0
+ transitivePeerDependencies:
+ - supports-color
rss-parser@3.13.0:
dependencies:
@@ -21385,7 +21862,7 @@ snapshots:
parse-srcset: 1.0.2
postcss: 8.5.6
- sass@1.94.1:
+ sass@1.94.2:
dependencies:
chokidar: 4.0.3
immutable: 5.1.4
@@ -21398,13 +21875,12 @@ snapshots:
saxes@6.0.0:
dependencies:
xmlchars: 2.2.0
+ optional: true
scheduler@0.27.0: {}
secure-json-parse@2.7.0: {}
- secure-json-parse@3.0.2: {}
-
secure-json-parse@4.1.0: {}
seedrandom@3.0.5: {}
@@ -21447,6 +21923,22 @@ snapshots:
transitivePeerDependencies:
- supports-color
+ send@1.2.0:
+ dependencies:
+ debug: 4.4.3(supports-color@10.2.2)
+ 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.2
+ ms: 2.1.3
+ on-finished: 2.4.1
+ range-parser: 1.2.1
+ statuses: 2.0.2
+ transitivePeerDependencies:
+ - supports-color
+
serve-static@1.16.2:
dependencies:
encodeurl: 2.0.0
@@ -21456,9 +21948,18 @@ snapshots:
transitivePeerDependencies:
- supports-color
+ serve-static@2.2.0:
+ dependencies:
+ encodeurl: 2.0.0
+ escape-html: 1.0.3
+ parseurl: 1.3.3
+ send: 1.2.0
+ transitivePeerDependencies:
+ - supports-color
+
set-blocking@2.0.0: {}
- set-cookie-parser@2.7.2: {}
+ set-cookie-parser@2.7.1: {}
set-function-length@1.2.2:
dependencies:
@@ -21524,19 +22025,17 @@ snapshots:
shebang-regex@3.0.0: {}
- shiki@3.15.0:
+ shiki@3.17.0:
dependencies:
- '@shikijs/core': 3.15.0
- '@shikijs/engine-javascript': 3.15.0
- '@shikijs/engine-oniguruma': 3.15.0
- '@shikijs/langs': 3.15.0
- '@shikijs/themes': 3.15.0
- '@shikijs/types': 3.15.0
+ '@shikijs/core': 3.17.0
+ '@shikijs/engine-javascript': 3.17.0
+ '@shikijs/engine-oniguruma': 3.17.0
+ '@shikijs/langs': 3.17.0
+ '@shikijs/themes': 3.17.0
+ '@shikijs/types': 3.17.0
'@shikijs/vscode-textmate': 10.0.2
'@types/hast': 3.0.4
- shimmer@1.2.1: {}
-
side-channel-list@1.0.0:
dependencies:
es-errors: 1.3.0
@@ -21682,7 +22181,7 @@ snapshots:
socks@2.8.7:
dependencies:
- ip-address: 10.1.0
+ ip-address: 10.0.1
smart-buffer: 4.2.0
sonic-boom@4.2.0:
@@ -21767,7 +22266,7 @@ snapshots:
standard-as-callback@2.1.0: {}
- start-server-and-test@2.1.2:
+ start-server-and-test@2.1.3:
dependencies:
arg: 5.0.2
bluebird: 3.7.2
@@ -21776,7 +22275,7 @@ snapshots:
execa: 5.1.1
lazy-ass: 1.6.0
ps-tree: 1.2.0
- wait-on: 8.0.5(debug@4.4.3)
+ wait-on: 9.0.3(debug@4.4.3)
transitivePeerDependencies:
- supports-color
@@ -21791,42 +22290,40 @@ snapshots:
es-errors: 1.3.0
internal-slot: 1.1.0
- storybook-addon-misskey-theme@https://codeload.github.com/misskey-dev/storybook-addon-misskey-theme/tar.gz/cf583db098365b2ccc81a82f63ca9c93bc32b640(199cee10961aa3cfbc20370674a11145):
+ storybook-addon-misskey-theme@https://codeload.github.com/misskey-dev/storybook-addon-misskey-theme/tar.gz/cf583db098365b2ccc81a82f63ca9c93bc32b640(e133727417d7e5d8da2127d0903bc90b):
dependencies:
- '@storybook/blocks': 8.6.14(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(storybook@9.1.16(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(msw@2.12.2(@types/node@24.10.1)(typescript@5.9.3))(prettier@3.6.2)(utf-8-validate@6.0.5)(vite@7.2.2(@types/node@24.10.1)(sass@1.94.1)(terser@5.44.1)(tsx@4.20.6)))
- '@storybook/components': 8.6.14(storybook@9.1.16(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(msw@2.12.2(@types/node@24.10.1)(typescript@5.9.3))(prettier@3.6.2)(utf-8-validate@6.0.5)(vite@7.2.2(@types/node@24.10.1)(sass@1.94.1)(terser@5.44.1)(tsx@4.20.6)))
- '@storybook/core-events': 8.6.14(storybook@9.1.16(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(msw@2.12.2(@types/node@24.10.1)(typescript@5.9.3))(prettier@3.6.2)(utf-8-validate@6.0.5)(vite@7.2.2(@types/node@24.10.1)(sass@1.94.1)(terser@5.44.1)(tsx@4.20.6)))
- '@storybook/manager-api': 8.6.14(storybook@9.1.16(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(msw@2.12.2(@types/node@24.10.1)(typescript@5.9.3))(prettier@3.6.2)(utf-8-validate@6.0.5)(vite@7.2.2(@types/node@24.10.1)(sass@1.94.1)(terser@5.44.1)(tsx@4.20.6)))
- '@storybook/preview-api': 8.6.14(storybook@9.1.16(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(msw@2.12.2(@types/node@24.10.1)(typescript@5.9.3))(prettier@3.6.2)(utf-8-validate@6.0.5)(vite@7.2.2(@types/node@24.10.1)(sass@1.94.1)(terser@5.44.1)(tsx@4.20.6)))
- '@storybook/theming': 8.6.14(storybook@9.1.16(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(msw@2.12.2(@types/node@24.10.1)(typescript@5.9.3))(prettier@3.6.2)(utf-8-validate@6.0.5)(vite@7.2.2(@types/node@24.10.1)(sass@1.94.1)(terser@5.44.1)(tsx@4.20.6)))
- '@storybook/types': 8.6.14(storybook@9.1.16(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(msw@2.12.2(@types/node@24.10.1)(typescript@5.9.3))(prettier@3.6.2)(utf-8-validate@6.0.5)(vite@7.2.2(@types/node@24.10.1)(sass@1.94.1)(terser@5.44.1)(tsx@4.20.6)))
+ '@storybook/blocks': 8.6.14(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(storybook@10.1.0(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(prettier@3.7.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(utf-8-validate@6.0.5))
+ '@storybook/components': 8.6.14(storybook@10.1.0(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(prettier@3.7.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(utf-8-validate@6.0.5))
+ '@storybook/core-events': 8.6.14(storybook@10.1.0(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(prettier@3.7.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(utf-8-validate@6.0.5))
+ '@storybook/manager-api': 8.6.14(storybook@10.1.0(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(prettier@3.7.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(utf-8-validate@6.0.5))
+ '@storybook/preview-api': 8.6.14(storybook@10.1.0(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(prettier@3.7.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(utf-8-validate@6.0.5))
+ '@storybook/theming': 8.6.14(storybook@10.1.0(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(prettier@3.7.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(utf-8-validate@6.0.5))
+ '@storybook/types': 8.6.14(storybook@10.1.0(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(prettier@3.7.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(utf-8-validate@6.0.5))
optionalDependencies:
react: 19.2.0
react-dom: 19.2.0(react@19.2.0)
- storybook@9.1.16(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(msw@2.12.2(@types/node@24.10.1)(typescript@5.9.3))(prettier@3.6.2)(utf-8-validate@6.0.5)(vite@7.2.2(@types/node@24.10.1)(sass@1.94.1)(terser@5.44.1)(tsx@4.20.6)):
+ storybook@10.1.0(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(prettier@3.7.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(utf-8-validate@6.0.5):
dependencies:
'@storybook/global': 5.0.0
+ '@storybook/icons': 2.0.1(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
'@testing-library/jest-dom': 6.9.1
'@testing-library/user-event': 14.6.1(@testing-library/dom@10.4.0)
'@vitest/expect': 3.2.4
- '@vitest/mocker': 3.2.4(msw@2.12.2(@types/node@24.10.1)(typescript@5.9.3))(vite@7.2.2(@types/node@24.10.1)(sass@1.94.1)(terser@5.44.1)(tsx@4.20.6))
'@vitest/spy': 3.2.4
- better-opn: 3.0.2
- esbuild: 0.25.11
- esbuild-register: 3.6.0(esbuild@0.25.11)
+ esbuild: 0.27.0
recast: 0.23.11
semver: 7.7.3
+ use-sync-external-store: 1.6.0(react@19.2.0)
ws: 8.18.3(bufferutil@4.0.9)(utf-8-validate@6.0.5)
optionalDependencies:
- prettier: 3.6.2
+ prettier: 3.7.1
transitivePeerDependencies:
- '@testing-library/dom'
- bufferutil
- - msw
- - supports-color
+ - react
+ - react-dom
- utf-8-validate
- - vite
stream-browserify@3.0.0:
dependencies:
@@ -21877,6 +22374,12 @@ snapshots:
emoji-regex: 9.2.2
strip-ansi: 7.1.2
+ string-width@7.2.0:
+ dependencies:
+ emoji-regex: 10.6.0
+ get-east-asian-width: 1.4.0
+ strip-ansi: 7.1.2
+
string.prototype.trim@1.2.10:
dependencies:
call-bind: 1.0.8
@@ -21948,12 +22451,6 @@ snapshots:
strip-json-comments@3.1.1: {}
- strip-literal@3.1.0:
- dependencies:
- js-tokens: 9.0.1
-
- strnum@1.1.2: {}
-
strnum@2.1.1: {}
strtok3@10.3.4:
@@ -22018,12 +22515,15 @@ snapshots:
picocolors: 1.1.1
sax: 1.4.3
- symbol-tree@3.2.4: {}
+ symbol-tree@3.2.4:
+ optional: true
systeminformation@5.27.11: {}
systeminformation@5.27.7: {}
+ tagged-tag@1.0.0: {}
+
tar-stream@3.1.7:
dependencies:
b4a: 1.7.3
@@ -22068,12 +22568,6 @@ snapshots:
glob: 7.2.3
minimatch: 3.1.2
- test-exclude@7.0.1:
- dependencies:
- '@istanbuljs/schema': 0.1.3
- glob: 10.5.0
- minimatch: 9.0.5
-
text-decoder@1.2.3:
dependencies:
b4a: 1.7.3
@@ -22112,8 +22606,6 @@ snapshots:
fdir: 6.5.0(picomatch@4.0.3)
picomatch: 4.0.3
- tinypool@1.1.1: {}
-
tinyrainbow@1.2.0: {}
tinyrainbow@2.0.0: {}
@@ -22176,10 +22668,6 @@ snapshots:
tr46@0.0.3: {}
- tr46@5.1.1:
- dependencies:
- punycode: 2.3.1
-
tr46@6.0.0:
dependencies:
punycode: 2.3.1
@@ -22236,6 +22724,8 @@ snapshots:
path-exists: 4.0.0
read-pkg-up: 7.0.1
+ tslib@1.14.1: {}
+
tslib@2.8.1: {}
tsx@4.20.6:
@@ -22245,6 +22735,10 @@ snapshots:
optionalDependencies:
fsevents: 2.3.3
+ tsyringe@4.10.0:
+ dependencies:
+ tslib: 1.14.1
+
tunnel-agent@0.6.0:
dependencies:
safe-buffer: 5.2.1
@@ -22271,11 +22765,21 @@ snapshots:
type-fest@4.41.0: {}
+ type-fest@5.2.0:
+ dependencies:
+ tagged-tag: 1.0.0
+
type-is@1.6.18:
dependencies:
media-typer: 0.3.0
mime-types: 2.1.35
+ type-is@2.0.1:
+ dependencies:
+ content-type: 1.0.5
+ media-typer: 1.1.0
+ mime-types: 3.0.2
+
typed-array-buffer@1.0.3:
dependencies:
call-bound: 1.0.4
@@ -22347,7 +22851,7 @@ snapshots:
uint8array-extras@1.5.0: {}
- ulid@2.4.0: {}
+ ulid@3.0.1: {}
unbox-primitive@1.1.0:
dependencies:
@@ -22367,16 +22871,10 @@ snapshots:
undici-types@7.16.0: {}
- undici@5.29.0:
- dependencies:
- '@fastify/busboy': 2.1.1
-
undici@6.22.0: {}
undici@7.16.0: {}
- unicorn-magic@0.1.0: {}
-
unicorn-magic@0.3.0: {}
unified@11.0.5:
@@ -22433,6 +22931,13 @@ snapshots:
acorn: 8.15.0
webpack-virtual-modules: 0.6.2
+ unplugin@2.3.10:
+ dependencies:
+ '@jridgewell/remapping': 2.3.5
+ acorn: 8.15.0
+ picomatch: 4.0.3
+ webpack-virtual-modules: 0.6.2
+
until-async@3.0.2: {}
untildify@4.0.0: {}
@@ -22447,6 +22952,10 @@ snapshots:
dependencies:
punycode: 2.3.1
+ use-sync-external-store@1.6.0(react@19.2.0):
+ dependencies:
+ react: 19.2.0
+
utf-8-validate@6.0.5:
dependencies:
node-gyp-build: 4.8.4
@@ -22464,13 +22973,13 @@ snapshots:
uuid@9.0.1: {}
- v-code-diff@1.13.1(vue@3.5.24(typescript@5.9.3)):
+ v-code-diff@1.13.1(vue@3.5.25(typescript@5.9.3)):
dependencies:
diff: 5.2.0
diff-match-patch: 1.0.5
highlight.js: 11.11.1
- vue: 3.5.24(typescript@5.9.3)
- vue-demi: 0.14.10(vue@3.5.24(typescript@5.9.3))
+ vue: 3.5.25(typescript@5.9.3)
+ vue-demi: 0.14.10(vue@3.5.25(typescript@5.9.3))
v8-to-istanbul@9.3.0:
dependencies:
@@ -22503,37 +23012,16 @@ snapshots:
'@types/unist': 3.0.3
vfile-message: 4.0.3
- vite-node@3.2.4(@types/node@24.10.1)(sass@1.94.1)(terser@5.44.1)(tsx@4.20.6):
+ vite-plugin-glsl@1.5.4(@rollup/pluginutils@5.3.0(rollup@4.53.3))(esbuild@0.27.0)(vite@7.2.4(@types/node@24.10.1)(sass@1.94.2)(terser@5.44.1)(tsx@4.20.6)):
dependencies:
- cac: 6.7.14
- debug: 4.4.3(supports-color@10.2.2)
- es-module-lexer: 1.7.0
- pathe: 2.0.3
- vite: 7.2.2(@types/node@24.10.1)(sass@1.94.1)(terser@5.44.1)(tsx@4.20.6)
- transitivePeerDependencies:
- - '@types/node'
- - jiti
- - less
- - lightningcss
- - sass
- - sass-embedded
- - stylus
- - sugarss
- - supports-color
- - terser
- - tsx
- - yaml
-
- vite-plugin-glsl@1.5.4(@rollup/pluginutils@5.3.0(rollup@4.53.3))(esbuild@0.25.11)(vite@7.2.2(@types/node@24.10.1)(sass@1.94.1)(terser@5.44.1)(tsx@4.20.6)):
- dependencies:
- vite: 7.2.2(@types/node@24.10.1)(sass@1.94.1)(terser@5.44.1)(tsx@4.20.6)
+ vite: 7.2.4(@types/node@24.10.1)(sass@1.94.2)(terser@5.44.1)(tsx@4.20.6)
optionalDependencies:
'@rollup/pluginutils': 5.3.0(rollup@4.53.3)
- esbuild: 0.25.11
+ esbuild: 0.27.0
vite-plugin-turbosnap@1.0.3: {}
- vite@7.2.2(@types/node@24.10.1)(sass@1.94.1)(terser@5.44.1)(tsx@4.20.6):
+ vite@7.2.4(@types/node@24.10.1)(sass@1.94.2)(terser@5.44.1)(tsx@4.20.6):
dependencies:
esbuild: 0.25.11
fdir: 6.5.0(picomatch@4.0.3)
@@ -22544,32 +23032,31 @@ snapshots:
optionalDependencies:
'@types/node': 24.10.1
fsevents: 2.3.3
- sass: 1.94.1
+ sass: 1.94.2
terser: 5.44.1
tsx: 4.20.6
- vitest-fetch-mock@0.4.5(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.10.1)(happy-dom@20.0.10)(jsdom@27.2.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(msw@2.12.2(@types/node@24.10.1)(typescript@5.9.3))(sass@1.94.1)(terser@5.44.1)(tsx@4.20.6)):
+ vitest-fetch-mock@0.4.5(vitest@4.0.14(@opentelemetry/api@1.9.0)(@types/node@24.10.1)(happy-dom@20.0.11)(jsdom@27.2.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(msw@2.12.3(@types/node@24.10.1)(typescript@5.9.3))(sass@1.94.2)(terser@5.44.1)(tsx@4.20.6)):
dependencies:
- vitest: 3.2.4(@types/debug@4.1.12)(@types/node@24.10.1)(happy-dom@20.0.10)(jsdom@27.2.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(msw@2.12.2(@types/node@24.10.1)(typescript@5.9.3))(sass@1.94.1)(terser@5.44.1)(tsx@4.20.6)
+ vitest: 4.0.14(@opentelemetry/api@1.9.0)(@types/node@24.10.1)(happy-dom@20.0.11)(jsdom@27.2.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(msw@2.12.3(@types/node@24.10.1)(typescript@5.9.3))(sass@1.94.2)(terser@5.44.1)(tsx@4.20.6)
- vitest-websocket-mock@0.5.0(vitest@4.0.10(@types/debug@4.1.12)(@types/node@24.10.1)(happy-dom@20.0.10)(jsdom@27.2.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(msw@2.12.2(@types/node@24.10.1)(typescript@5.9.3))(sass@1.94.1)(terser@5.44.1)(tsx@4.20.6)):
+ vitest-websocket-mock@0.5.0(vitest@4.0.13(@opentelemetry/api@1.9.0)(@types/debug@4.1.12)(@types/node@24.10.1)(happy-dom@20.0.11)(jsdom@27.2.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(msw@2.12.3(@types/node@24.10.1)(typescript@5.9.3))(sass@1.94.2)(terser@5.44.1)(tsx@4.20.6)):
dependencies:
'@vitest/utils': 3.2.4
mock-socket: 9.3.1
- vitest: 4.0.10(@types/debug@4.1.12)(@types/node@24.10.1)(happy-dom@20.0.10)(jsdom@27.2.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(msw@2.12.2(@types/node@24.10.1)(typescript@5.9.3))(sass@1.94.1)(terser@5.44.1)(tsx@4.20.6)
+ vitest: 4.0.13(@opentelemetry/api@1.9.0)(@types/debug@4.1.12)(@types/node@24.10.1)(happy-dom@20.0.11)(jsdom@27.2.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(msw@2.12.3(@types/node@24.10.1)(typescript@5.9.3))(sass@1.94.2)(terser@5.44.1)(tsx@4.20.6)
- vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.10.1)(happy-dom@20.0.10)(jsdom@27.2.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(msw@2.12.2(@types/node@24.10.1)(typescript@5.9.3))(sass@1.94.1)(terser@5.44.1)(tsx@4.20.6):
+ vitest@4.0.13(@opentelemetry/api@1.9.0)(@types/debug@4.1.12)(@types/node@24.10.1)(happy-dom@20.0.11)(jsdom@27.2.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(msw@2.12.3(@types/node@24.10.1)(typescript@5.9.3))(sass@1.94.2)(terser@5.44.1)(tsx@4.20.6):
dependencies:
- '@types/chai': 5.2.3
- '@vitest/expect': 3.2.4
- '@vitest/mocker': 3.2.4(msw@2.12.2(@types/node@24.10.1)(typescript@5.9.3))(vite@7.2.2(@types/node@24.10.1)(sass@1.94.1)(terser@5.44.1)(tsx@4.20.6))
- '@vitest/pretty-format': 3.2.4
- '@vitest/runner': 3.2.4
- '@vitest/snapshot': 3.2.4
- '@vitest/spy': 3.2.4
- '@vitest/utils': 3.2.4
- chai: 5.3.3
+ '@vitest/expect': 4.0.13
+ '@vitest/mocker': 4.0.13(msw@2.12.3(@types/node@24.10.1)(typescript@5.9.3))(vite@7.2.4(@types/node@24.10.1)(sass@1.94.2)(terser@5.44.1)(tsx@4.20.6))
+ '@vitest/pretty-format': 4.0.13
+ '@vitest/runner': 4.0.13
+ '@vitest/snapshot': 4.0.13
+ '@vitest/spy': 4.0.13
+ '@vitest/utils': 4.0.13
debug: 4.4.3(supports-color@10.2.2)
+ es-module-lexer: 1.7.0
expect-type: 1.2.2
magic-string: 0.30.21
pathe: 2.0.3
@@ -22578,15 +23065,14 @@ snapshots:
tinybench: 2.9.0
tinyexec: 0.3.2
tinyglobby: 0.2.15
- tinypool: 1.1.1
- tinyrainbow: 2.0.0
- vite: 7.2.2(@types/node@24.10.1)(sass@1.94.1)(terser@5.44.1)(tsx@4.20.6)
- vite-node: 3.2.4(@types/node@24.10.1)(sass@1.94.1)(terser@5.44.1)(tsx@4.20.6)
+ tinyrainbow: 3.0.3
+ vite: 7.2.4(@types/node@24.10.1)(sass@1.94.2)(terser@5.44.1)(tsx@4.20.6)
why-is-node-running: 2.3.0
optionalDependencies:
+ '@opentelemetry/api': 1.9.0
'@types/debug': 4.1.12
'@types/node': 24.10.1
- happy-dom: 20.0.10
+ happy-dom: 20.0.11
jsdom: 27.2.0(bufferutil@4.0.9)(utf-8-validate@6.0.5)
transitivePeerDependencies:
- jiti
@@ -22602,19 +23088,19 @@ snapshots:
- tsx
- yaml
- vitest@4.0.10(@types/debug@4.1.12)(@types/node@24.10.1)(happy-dom@20.0.10)(jsdom@27.2.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(msw@2.12.2(@types/node@24.10.1)(typescript@5.9.3))(sass@1.94.1)(terser@5.44.1)(tsx@4.20.6):
+ vitest@4.0.14(@opentelemetry/api@1.9.0)(@types/node@24.10.1)(happy-dom@20.0.11)(jsdom@27.2.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(msw@2.12.3(@types/node@24.10.1)(typescript@5.9.3))(sass@1.94.2)(terser@5.44.1)(tsx@4.20.6):
dependencies:
- '@vitest/expect': 4.0.10
- '@vitest/mocker': 4.0.10(msw@2.12.2(@types/node@24.10.1)(typescript@5.9.3))(vite@7.2.2(@types/node@24.10.1)(sass@1.94.1)(terser@5.44.1)(tsx@4.20.6))
- '@vitest/pretty-format': 4.0.10
- '@vitest/runner': 4.0.10
- '@vitest/snapshot': 4.0.10
- '@vitest/spy': 4.0.10
- '@vitest/utils': 4.0.10
- debug: 4.4.3(supports-color@10.2.2)
+ '@vitest/expect': 4.0.14
+ '@vitest/mocker': 4.0.14(msw@2.12.3(@types/node@24.10.1)(typescript@5.9.3))(vite@7.2.4(@types/node@24.10.1)(sass@1.94.2)(terser@5.44.1)(tsx@4.20.6))
+ '@vitest/pretty-format': 4.0.14
+ '@vitest/runner': 4.0.14
+ '@vitest/snapshot': 4.0.14
+ '@vitest/spy': 4.0.14
+ '@vitest/utils': 4.0.14
es-module-lexer: 1.7.0
expect-type: 1.2.2
magic-string: 0.30.21
+ obug: 2.1.1
pathe: 2.0.3
picomatch: 4.0.3
std-env: 3.10.0
@@ -22622,12 +23108,12 @@ snapshots:
tinyexec: 0.3.2
tinyglobby: 0.2.15
tinyrainbow: 3.0.3
- vite: 7.2.2(@types/node@24.10.1)(sass@1.94.1)(terser@5.44.1)(tsx@4.20.6)
+ vite: 7.2.4(@types/node@24.10.1)(sass@1.94.2)(terser@5.44.1)(tsx@4.20.6)
why-is-node-running: 2.3.0
optionalDependencies:
- '@types/debug': 4.1.12
+ '@opentelemetry/api': 1.9.0
'@types/node': 24.10.1
- happy-dom: 20.0.10
+ happy-dom: 20.0.11
jsdom: 27.2.0(bufferutil@4.0.9)(utf-8-validate@6.0.5)
transitivePeerDependencies:
- jiti
@@ -22638,7 +23124,6 @@ snapshots:
- sass-embedded
- stylus
- sugarss
- - supports-color
- terser
- tsx
- yaml
@@ -22673,18 +23158,18 @@ snapshots:
vue-component-type-helpers@2.2.12: {}
- vue-component-type-helpers@3.1.4: {}
+ vue-component-type-helpers@3.1.5: {}
- vue-demi@0.14.10(vue@3.5.24(typescript@5.9.3)):
+ vue-demi@0.14.10(vue@3.5.25(typescript@5.9.3)):
dependencies:
- vue: 3.5.24(typescript@5.9.3)
+ vue: 3.5.25(typescript@5.9.3)
- vue-docgen-api@4.79.2(vue@3.5.24(typescript@5.9.3)):
+ vue-docgen-api@4.79.2(vue@3.5.25(typescript@5.9.3)):
dependencies:
'@babel/parser': 7.28.5
'@babel/types': 7.28.5
'@vue/compiler-dom': 3.5.24
- '@vue/compiler-sfc': 3.5.24
+ '@vue/compiler-sfc': 3.5.25
ast-types: 0.16.1
esm-resolve: 1.0.11
hash-sum: 2.0.0
@@ -22692,8 +23177,8 @@ snapshots:
pug: 3.0.3
recast: 0.23.11
ts-map: 1.0.3
- vue: 3.5.24(typescript@5.9.3)
- vue-inbrowser-compiler-independent-utils: 4.71.1(vue@3.5.24(typescript@5.9.3))
+ vue: 3.5.25(typescript@5.9.3)
+ vue-inbrowser-compiler-independent-utils: 4.71.1(vue@3.5.25(typescript@5.9.3))
vue-eslint-parser@10.2.0(eslint@9.39.1):
dependencies:
@@ -22707,36 +23192,37 @@ snapshots:
transitivePeerDependencies:
- supports-color
- vue-inbrowser-compiler-independent-utils@4.71.1(vue@3.5.24(typescript@5.9.3)):
+ vue-inbrowser-compiler-independent-utils@4.71.1(vue@3.5.25(typescript@5.9.3)):
dependencies:
- vue: 3.5.24(typescript@5.9.3)
+ vue: 3.5.25(typescript@5.9.3)
- vue-tsc@3.1.4(typescript@5.9.3):
+ vue-tsc@3.1.5(typescript@5.9.3):
dependencies:
'@volar/typescript': 2.4.23
- '@vue/language-core': 3.1.4(typescript@5.9.3)
+ '@vue/language-core': 3.1.5(typescript@5.9.3)
typescript: 5.9.3
- vue@3.5.24(typescript@5.9.3):
+ vue@3.5.25(typescript@5.9.3):
dependencies:
- '@vue/compiler-dom': 3.5.24
- '@vue/compiler-sfc': 3.5.24
- '@vue/runtime-dom': 3.5.24
- '@vue/server-renderer': 3.5.24(vue@3.5.24(typescript@5.9.3))
- '@vue/shared': 3.5.24
+ '@vue/compiler-dom': 3.5.25
+ '@vue/compiler-sfc': 3.5.25
+ '@vue/runtime-dom': 3.5.25
+ '@vue/server-renderer': 3.5.25(vue@3.5.25(typescript@5.9.3))
+ '@vue/shared': 3.5.25
optionalDependencies:
typescript: 5.9.3
- vuedraggable@4.1.0(vue@3.5.24(typescript@5.9.3)):
+ vuedraggable@4.1.0(vue@3.5.25(typescript@5.9.3)):
dependencies:
sortablejs: 1.14.0
- vue: 3.5.24(typescript@5.9.3)
+ vue: 3.5.25(typescript@5.9.3)
w3c-xmlserializer@5.0.0:
dependencies:
xml-name-validator: 5.0.0
+ optional: true
- wait-on@8.0.5(debug@4.4.3):
+ wait-on@9.0.3(debug@4.4.3):
dependencies:
axios: 1.13.2(debug@4.4.3)
joi: 18.0.1
@@ -22778,8 +23264,6 @@ snapshots:
webidl-conversions@3.0.1: {}
- webidl-conversions@7.0.0: {}
-
webidl-conversions@8.0.0:
optional: true
@@ -22793,11 +23277,6 @@ snapshots:
whatwg-mimetype@4.0.0: {}
- whatwg-url@14.2.0:
- dependencies:
- tr46: 5.1.1
- webidl-conversions: 7.0.0
-
whatwg-url@15.1.0:
dependencies:
tr46: 6.0.0
@@ -22901,6 +23380,12 @@ snapshots:
string-width: 5.1.2
strip-ansi: 7.1.2
+ wrap-ansi@9.0.2:
+ dependencies:
+ ansi-styles: 6.2.3
+ string-width: 7.2.0
+ strip-ansi: 7.1.2
+
wrappy@1.0.2: {}
write-file-atomic@4.0.2:
@@ -22921,7 +23406,8 @@ snapshots:
xml-name-validator@4.0.0: {}
- xml-name-validator@5.0.0: {}
+ xml-name-validator@5.0.0:
+ optional: true
xml2js@0.5.0:
dependencies:
@@ -22930,7 +23416,8 @@ snapshots:
xmlbuilder@11.0.1: {}
- xmlchars@2.2.0: {}
+ xmlchars@2.2.0:
+ optional: true
xtend@4.0.2: {}
@@ -22955,6 +23442,8 @@ snapshots:
yargs-parser@21.1.1: {}
+ yargs-parser@22.0.0: {}
+
yargs@15.4.1:
dependencies:
cliui: 6.0.0
@@ -22989,6 +23478,15 @@ snapshots:
y18n: 5.0.8
yargs-parser: 21.1.1
+ yargs@18.0.0:
+ dependencies:
+ cliui: 9.0.1
+ escalade: 3.2.0
+ get-caller-file: 2.0.5
+ string-width: 7.2.0
+ y18n: 5.0.8
+ yargs-parser: 22.0.0
+
yauzl@2.10.0:
dependencies:
buffer-crc32: 0.2.13
@@ -23001,8 +23499,6 @@ snapshots:
yocto-queue@0.1.0: {}
- yocto-queue@1.2.2: {}
-
yoctocolors-cjs@2.1.3: {}
yoctocolors@2.1.2: {}
diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml
index 8f7fdf13c8..9d43518ff6 100644
--- a/pnpm-workspace.yaml
+++ b/pnpm-workspace.yaml
@@ -4,6 +4,7 @@ packages:
- packages/frontend
- packages/frontend-builder
- packages/frontend-embed
+ - packages/i18n
- packages/icons-subsetter
- packages/sw
- packages/misskey-js
@@ -14,6 +15,7 @@ onlyBuiltDependencies:
- '@nestjs/core'
- '@parcel/watcher'
- '@sentry/profiling-node'
+ - '@sentry-internal/node-cpu-profiler'
- '@swc/core'
- '@tensorflow/tfjs-node'
- bufferutil
diff --git a/scripts/build-assets.mjs b/scripts/build-assets.mjs
index e610a72380..0cfce02fef 100644
--- a/scripts/build-assets.mjs
+++ b/scripts/build-assets.mjs
@@ -6,14 +6,7 @@
import * as fs from 'node:fs/promises';
import * as path from 'node:path';
import { fileURLToPath } from 'node:url';
-import cssnano from 'cssnano';
import * as yaml from 'js-yaml';
-import postcss from 'postcss';
-import * as terser from 'terser';
-
-import { build as buildLocales } from '../locales/index.js';
-import generateDTS from '../locales/generateDTS.js';
-import meta from '../package.json' with { type: "json" };
import buildTarball from './tarball.mjs';
const configDir = fileURLToPath(new URL('../.config', import.meta.url));
@@ -23,86 +16,19 @@ const configPath = process.env.MISSKEY_CONFIG_YML
? path.resolve(configDir, 'test.yml')
: path.resolve(configDir, 'default.yml');
-let locales = buildLocales();
-
async function loadConfig() {
return fs.readFile(configPath, 'utf-8').then(data => yaml.load(data)).catch(() => null);
}
async function copyFrontendFonts() {
- await fs.cp('./packages/frontend/node_modules/three/examples/fonts', './built/_frontend_dist_/fonts', { dereference: true, recursive: true });
-}
-
-async function copyFrontendLocales() {
- generateDTS();
-
- await fs.mkdir('./built/_frontend_dist_/locales', { recursive: true });
-
- const v = { '_version_': meta.version };
-
- for (const [lang, locale] of Object.entries(locales)) {
- await fs.writeFile(`./built/_frontend_dist_/locales/${lang}.${meta.version}.json`, JSON.stringify({ ...locale, ...v }), 'utf-8');
- }
-}
-
-async function copyBackendViews() {
- await fs.cp('./packages/backend/src/server/web/views', './packages/backend/built/server/web/views', { recursive: true });
-}
-
-async function buildBackendScript() {
- await fs.mkdir('./packages/backend/built/server/web', { recursive: true });
-
- for (const file of [
- './packages/backend/src/server/web/boot.js',
- './packages/backend/src/server/web/boot.embed.js',
- './packages/backend/src/server/web/bios.js',
- './packages/backend/src/server/web/cli.js',
- './packages/backend/src/server/web/error.js',
- ]) {
- let source = await fs.readFile(file, { encoding: 'utf-8' });
- source = source.replaceAll('LANGS', JSON.stringify(Object.keys(locales)));
- const { code } = await terser.minify(source, { toplevel: true });
- await fs.writeFile(`./packages/backend/built/server/web/${path.basename(file)}`, code);
- }
-}
-
-async function buildBackendStyle() {
- await fs.mkdir('./packages/backend/built/server/web', { recursive: true });
-
- for (const file of [
- './packages/backend/src/server/web/style.css',
- './packages/backend/src/server/web/style.embed.css',
- './packages/backend/src/server/web/bios.css',
- './packages/backend/src/server/web/cli.css',
- './packages/backend/src/server/web/error.css'
- ]) {
- const source = await fs.readFile(file, { encoding: 'utf-8' });
- const { css } = await postcss([cssnano({ zindex: false })]).process(source, { from: undefined });
- await fs.writeFile(`./packages/backend/built/server/web/${path.basename(file)}`, css);
- }
+ await fs.cp('./packages/frontend/node_modules/three/examples/fonts', './built/_frontend_dist_/fonts', { dereference: true, recursive: true });
}
async function build() {
- await Promise.all([
- copyFrontendFonts(),
- copyFrontendLocales(),
- copyBackendViews(),
- buildBackendScript(),
- buildBackendStyle(),
+ await Promise.all([
+ copyFrontendFonts(),
loadConfig().then(config => config?.publishTarballInsteadOfProvideRepositoryUrl && buildTarball()),
- ]);
+ ]);
}
await build();
-
-if (process.argv.includes('--watch')) {
- const watcher = fs.watch('./locales');
- for await (const event of watcher) {
- const filename = event.filename?.replaceAll('\\', '/');
- if (/^[a-z]+-[A-Z]+\.yml/.test(filename)) {
- console.log(`update ${filename} ...`)
- locales = buildLocales();
- await copyFrontendLocales()
- }
- }
-}
diff --git a/scripts/changelog-checker/package-lock.json b/scripts/changelog-checker/package-lock.json
index f1d81e447b..cb18038f52 100644
--- a/scripts/changelog-checker/package-lock.json
+++ b/scripts/changelog-checker/package-lock.json
@@ -9,16 +9,16 @@
"version": "1.0.0",
"devDependencies": {
"@types/mdast": "4.0.4",
- "@types/node": "24.9.1",
- "@vitest/coverage-v8": "4.0.10",
+ "@types/node": "24.10.1",
+ "@vitest/coverage-v8": "4.0.14",
"mdast-util-to-string": "4.0.0",
"remark": "15.0.1",
"remark-parse": "11.0.0",
"typescript": "5.9.3",
"unified": "11.0.5",
- "vite": "7.2.2",
+ "vite": "7.2.4",
"vite-node": "5.2.0",
- "vitest": "4.0.10"
+ "vitest": "4.0.14"
}
},
"node_modules/@babel/helper-string-parser": {
@@ -898,9 +898,9 @@
"dev": true
},
"node_modules/@types/node": {
- "version": "24.9.1",
- "resolved": "https://registry.npmjs.org/@types/node/-/node-24.9.1.tgz",
- "integrity": "sha512-QoiaXANRkSXK6p0Duvt56W208du4P9Uye9hWLWgGMDTEoKPhuenzNcC4vGUmrNkiOKTlIrBoyNQYNpSwfEZXSg==",
+ "version": "24.10.1",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-24.10.1.tgz",
+ "integrity": "sha512-GNWcUTRBgIRJD5zj+Tq0fKOJ5XZajIiBroOF0yvj2bSU1WvNdYS/dn9UxwsujGW4JX06dnHyjV2y9rRaybH0iQ==",
"dev": true,
"license": "MIT",
"peer": true,
@@ -915,21 +915,21 @@
"dev": true
},
"node_modules/@vitest/coverage-v8": {
- "version": "4.0.10",
- "resolved": "https://registry.npmjs.org/@vitest/coverage-v8/-/coverage-v8-4.0.10.tgz",
- "integrity": "sha512-g+brmtoKa/sAeIohNJnnWhnHtU6GuqqVOSQ4SxDIPcgZWZyhJs5RmF5LpqXs8Kq64lANP+vnbn5JLzhLj/G56g==",
+ "version": "4.0.14",
+ "resolved": "https://registry.npmjs.org/@vitest/coverage-v8/-/coverage-v8-4.0.14.tgz",
+ "integrity": "sha512-EYHLqN/BY6b47qHH7gtMxAg++saoGmsjWmAq9MlXxAz4M0NcHh9iOyKhBZyU4yxZqOd8Xnqp80/5saeitz4Cng==",
"dev": true,
"license": "MIT",
"dependencies": {
"@bcoe/v8-coverage": "^1.0.2",
- "@vitest/utils": "4.0.10",
+ "@vitest/utils": "4.0.14",
"ast-v8-to-istanbul": "^0.3.8",
- "debug": "^4.4.3",
"istanbul-lib-coverage": "^3.2.2",
"istanbul-lib-report": "^3.0.1",
"istanbul-lib-source-maps": "^5.0.6",
"istanbul-reports": "^3.2.0",
"magicast": "^0.5.1",
+ "obug": "^2.1.1",
"std-env": "^3.10.0",
"tinyrainbow": "^3.0.3"
},
@@ -937,8 +937,8 @@
"url": "https://opencollective.com/vitest"
},
"peerDependencies": {
- "@vitest/browser": "4.0.10",
- "vitest": "4.0.10"
+ "@vitest/browser": "4.0.14",
+ "vitest": "4.0.14"
},
"peerDependenciesMeta": {
"@vitest/browser": {
@@ -947,16 +947,16 @@
}
},
"node_modules/@vitest/expect": {
- "version": "4.0.10",
- "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.0.10.tgz",
- "integrity": "sha512-3QkTX/lK39FBNwARCQRSQr0TP9+ywSdxSX+LgbJ2M1WmveXP72anTbnp2yl5fH+dU6SUmBzNMrDHs80G8G2DZg==",
+ "version": "4.0.14",
+ "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.0.14.tgz",
+ "integrity": "sha512-RHk63V3zvRiYOWAV0rGEBRO820ce17hz7cI2kDmEdfQsBjT2luEKB5tCOc91u1oSQoUOZkSv3ZyzkdkSLD7lKw==",
"dev": true,
"license": "MIT",
"dependencies": {
"@standard-schema/spec": "^1.0.0",
"@types/chai": "^5.2.2",
- "@vitest/spy": "4.0.10",
- "@vitest/utils": "4.0.10",
+ "@vitest/spy": "4.0.14",
+ "@vitest/utils": "4.0.14",
"chai": "^6.2.1",
"tinyrainbow": "^3.0.3"
},
@@ -965,13 +965,13 @@
}
},
"node_modules/@vitest/mocker": {
- "version": "4.0.10",
- "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.0.10.tgz",
- "integrity": "sha512-e2OfdexYkjkg8Hh3L9NVEfbwGXq5IZbDovkf30qW2tOh7Rh9sVtmSr2ztEXOFbymNxS4qjzLXUQIvATvN4B+lg==",
+ "version": "4.0.14",
+ "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.0.14.tgz",
+ "integrity": "sha512-RzS5NujlCzeRPF1MK7MXLiEFpkIXeMdQ+rN3Kk3tDI9j0mtbr7Nmuq67tpkOJQpgyClbOltCXMjLZicJHsH5Cg==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@vitest/spy": "4.0.10",
+ "@vitest/spy": "4.0.14",
"estree-walker": "^3.0.3",
"magic-string": "^0.30.21"
},
@@ -992,9 +992,9 @@
}
},
"node_modules/@vitest/pretty-format": {
- "version": "4.0.10",
- "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.0.10.tgz",
- "integrity": "sha512-99EQbpa/zuDnvVjthwz5bH9o8iPefoQZ63WV8+bsRJZNw3qQSvSltfut8yu1Jc9mqOYi7pEbsKxYTi/rjaq6PA==",
+ "version": "4.0.14",
+ "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.0.14.tgz",
+ "integrity": "sha512-SOYPgujB6TITcJxgd3wmsLl+wZv+fy3av2PpiPpsWPZ6J1ySUYfScfpIt2Yv56ShJXR2MOA6q2KjKHN4EpdyRQ==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -1005,13 +1005,13 @@
}
},
"node_modules/@vitest/runner": {
- "version": "4.0.10",
- "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-4.0.10.tgz",
- "integrity": "sha512-EXU2iSkKvNwtlL8L8doCpkyclw0mc/t4t9SeOnfOFPyqLmQwuceMPA4zJBa6jw0MKsZYbw7kAn+gl7HxrlB8UQ==",
+ "version": "4.0.14",
+ "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-4.0.14.tgz",
+ "integrity": "sha512-BsAIk3FAqxICqREbX8SetIteT8PiaUL/tgJjmhxJhCsigmzzH8xeadtp7LRnTpCVzvf0ib9BgAfKJHuhNllKLw==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@vitest/utils": "4.0.10",
+ "@vitest/utils": "4.0.14",
"pathe": "^2.0.3"
},
"funding": {
@@ -1019,13 +1019,13 @@
}
},
"node_modules/@vitest/snapshot": {
- "version": "4.0.10",
- "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-4.0.10.tgz",
- "integrity": "sha512-2N4X2ZZl7kZw0qeGdQ41H0KND96L3qX1RgwuCfy6oUsF2ISGD/HpSbmms+CkIOsQmg2kulwfhJ4CI0asnZlvkg==",
+ "version": "4.0.14",
+ "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-4.0.14.tgz",
+ "integrity": "sha512-aQVBfT1PMzDSA16Y3Fp45a0q8nKexx6N5Amw3MX55BeTeZpoC08fGqEZqVmPcqN0ueZsuUQ9rriPMhZ3Mu19Ag==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@vitest/pretty-format": "4.0.10",
+ "@vitest/pretty-format": "4.0.14",
"magic-string": "^0.30.21",
"pathe": "^2.0.3"
},
@@ -1034,9 +1034,9 @@
}
},
"node_modules/@vitest/spy": {
- "version": "4.0.10",
- "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.0.10.tgz",
- "integrity": "sha512-AsY6sVS8OLb96GV5RoG8B6I35GAbNrC49AO+jNRF9YVGb/g9t+hzNm1H6kD0NDp8tt7VJLs6hb7YMkDXqu03iw==",
+ "version": "4.0.14",
+ "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.0.14.tgz",
+ "integrity": "sha512-JmAZT1UtZooO0tpY3GRyiC/8W7dCs05UOq9rfsUUgEZEdq+DuHLmWhPsrTt0TiW7WYeL/hXpaE07AZ2RCk44hg==",
"dev": true,
"license": "MIT",
"funding": {
@@ -1044,13 +1044,13 @@
}
},
"node_modules/@vitest/utils": {
- "version": "4.0.10",
- "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.0.10.tgz",
- "integrity": "sha512-kOuqWnEwZNtQxMKg3WmPK1vmhZu9WcoX69iwWjVz+jvKTsF1emzsv3eoPcDr6ykA3qP2bsCQE7CwqfNtAVzsmg==",
+ "version": "4.0.14",
+ "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.0.14.tgz",
+ "integrity": "sha512-hLqXZKAWNg8pI+SQXyXxWCTOpA3MvsqcbVeNgSi8x/CSN2wi26dSzn1wrOhmCmFjEvN9p8/kLFRHa6PI8jHazw==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@vitest/pretty-format": "4.0.10",
+ "@vitest/pretty-format": "4.0.14",
"tinyrainbow": "^3.0.3"
},
"funding": {
@@ -2341,9 +2341,9 @@
}
},
"node_modules/vite": {
- "version": "7.2.2",
- "resolved": "https://registry.npmjs.org/vite/-/vite-7.2.2.tgz",
- "integrity": "sha512-BxAKBWmIbrDgrokdGZH1IgkIk/5mMHDreLDmCJ0qpyJaAteP8NvMhkwr/ZCQNqNH97bw/dANTE9PDzqwJghfMQ==",
+ "version": "7.2.4",
+ "resolved": "https://registry.npmjs.org/vite/-/vite-7.2.4.tgz",
+ "integrity": "sha512-NL8jTlbo0Tn4dUEXEsUg8KeyG/Lkmc4Fnzb8JXN/Ykm9G4HNImjtABMJgkQoVjOBN/j2WAwDTRytdqJbZsah7w==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -2439,24 +2439,24 @@
}
},
"node_modules/vitest": {
- "version": "4.0.10",
- "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.0.10.tgz",
- "integrity": "sha512-2Fqty3MM9CDwOVet/jaQalYlbcjATZwPYGcqpiYQqgQ/dLC7GuHdISKgTYIVF/kaishKxLzleKWWfbSDklyIKg==",
+ "version": "4.0.14",
+ "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.0.14.tgz",
+ "integrity": "sha512-d9B2J9Cm9dN9+6nxMnnNJKJCtcyKfnHj15N6YNJfaFHRLua/d3sRKU9RuKmO9mB0XdFtUizlxfz/VPbd3OxGhw==",
"dev": true,
"license": "MIT",
"peer": true,
"dependencies": {
- "@vitest/expect": "4.0.10",
- "@vitest/mocker": "4.0.10",
- "@vitest/pretty-format": "4.0.10",
- "@vitest/runner": "4.0.10",
- "@vitest/snapshot": "4.0.10",
- "@vitest/spy": "4.0.10",
- "@vitest/utils": "4.0.10",
- "debug": "^4.4.3",
+ "@vitest/expect": "4.0.14",
+ "@vitest/mocker": "4.0.14",
+ "@vitest/pretty-format": "4.0.14",
+ "@vitest/runner": "4.0.14",
+ "@vitest/snapshot": "4.0.14",
+ "@vitest/spy": "4.0.14",
+ "@vitest/utils": "4.0.14",
"es-module-lexer": "^1.7.0",
"expect-type": "^1.2.2",
"magic-string": "^0.30.21",
+ "obug": "^2.1.1",
"pathe": "^2.0.3",
"picomatch": "^4.0.3",
"std-env": "^3.10.0",
@@ -2478,12 +2478,12 @@
},
"peerDependencies": {
"@edge-runtime/vm": "*",
- "@types/debug": "^4.1.12",
+ "@opentelemetry/api": "^1.9.0",
"@types/node": "^20.0.0 || ^22.0.0 || >=24.0.0",
- "@vitest/browser-playwright": "4.0.10",
- "@vitest/browser-preview": "4.0.10",
- "@vitest/browser-webdriverio": "4.0.10",
- "@vitest/ui": "4.0.10",
+ "@vitest/browser-playwright": "4.0.14",
+ "@vitest/browser-preview": "4.0.14",
+ "@vitest/browser-webdriverio": "4.0.14",
+ "@vitest/ui": "4.0.14",
"happy-dom": "*",
"jsdom": "*"
},
@@ -2491,7 +2491,7 @@
"@edge-runtime/vm": {
"optional": true
},
- "@types/debug": {
+ "@opentelemetry/api": {
"optional": true
},
"@types/node": {
diff --git a/scripts/changelog-checker/package.json b/scripts/changelog-checker/package.json
index cbce64611e..3ca43d9001 100644
--- a/scripts/changelog-checker/package.json
+++ b/scripts/changelog-checker/package.json
@@ -10,15 +10,15 @@
},
"devDependencies": {
"@types/mdast": "4.0.4",
- "@types/node": "24.9.1",
- "@vitest/coverage-v8": "4.0.10",
+ "@types/node": "24.10.1",
+ "@vitest/coverage-v8": "4.0.14",
"mdast-util-to-string": "4.0.0",
"remark": "15.0.1",
"remark-parse": "11.0.0",
"typescript": "5.9.3",
"unified": "11.0.5",
- "vite": "7.2.2",
+ "vite": "7.2.4",
"vite-node": "5.2.0",
- "vitest": "4.0.10"
+ "vitest": "4.0.14"
}
}
diff --git a/scripts/clean-all.js b/scripts/clean-all.js
index 5a8f9eba23..839ea3ba1c 100644
--- a/scripts/clean-all.js
+++ b/scripts/clean-all.js
@@ -24,6 +24,9 @@ const fs = require('fs');
fs.rmSync(__dirname + '/../packages/sw/built', { recursive: true, force: true });
fs.rmSync(__dirname + '/../packages/sw/node_modules', { recursive: true, force: true });
+ fs.rmSync(__dirname + '/../packages/i18n/built', { recursive: true, force: true });
+ fs.rmSync(__dirname + '/../packages/i18n/node_modules', { recursive: true, force: true });
+
fs.rmSync(__dirname + '/../packages/misskey-js/built', { recursive: true, force: true });
fs.rmSync(__dirname + '/../packages/misskey-js/node_modules', { recursive: true, force: true });
diff --git a/scripts/clean.js b/scripts/clean.js
index 69a8df76af..5cce8bacab 100644
--- a/scripts/clean.js
+++ b/scripts/clean.js
@@ -11,6 +11,7 @@ const fs = require('fs');
fs.rmSync(__dirname + '/../packages/frontend/built', { recursive: true, force: true });
fs.rmSync(__dirname + '/../packages/frontend-embed/built', { recursive: true, force: true });
fs.rmSync(__dirname + '/../packages/icons-subsetter/built', { recursive: true, force: true });
+ fs.rmSync(__dirname + '/../packages/i18n/built', { recursive: true, force: true });
fs.rmSync(__dirname + '/../packages/sw/built', { recursive: true, force: true });
fs.rmSync(__dirname + '/../packages/misskey-js/built', { recursive: true, force: true });
fs.rmSync(__dirname + '/../packages/misskey-reversi/built', { recursive: true, force: true });
diff --git a/scripts/dev.mjs b/scripts/dev.mjs
index e500510b9e..b54004132a 100644
--- a/scripts/dev.mjs
+++ b/scripts/dev.mjs
@@ -16,6 +16,13 @@ await execa('pnpm', ['clean'], {
stderr: process.stderr,
});
+// アセットのビルドで依存しているので一番最初に必要
+await execa('pnpm', ['--filter', 'i18n', 'build'], {
+ cwd: _dirname + '/../',
+ stdout: process.stdout,
+ stderr: process.stderr,
+});
+
await Promise.all([
execa('pnpm', ['build-pre'], {
cwd: _dirname + '/../',
@@ -38,6 +45,11 @@ await Promise.all([
stdout: process.stdout,
stderr: process.stderr,
}),
+ execa('pnpm', ['--filter', 'misskey-js', 'build'], {
+ cwd: _dirname + '/../',
+ stdout: process.stdout,
+ stderr: process.stderr,
+ }),
]);
execa('pnpm', ['build-pre', '--watch'], {
@@ -88,6 +100,12 @@ execa('pnpm', ['--filter', 'misskey-js', 'watch', '--no-clean'], {
stderr: process.stderr,
});
+execa('pnpm', ['--filter', 'i18n', 'watch', '--no-clean'], {
+ cwd: _dirname + '/../',
+ stdout: process.stdout,
+ stderr: process.stderr,
+});
+
execa('pnpm', ['--filter', 'misskey-reversi', 'watch', '--no-clean'], {
cwd: _dirname + '/../',
stdout: process.stdout,