From 79901b18fb937f928f3fe24ee90fe6c19cc2392f Mon Sep 17 00:00:00 2001 From: better-salmon <132773930+better-salmon@users.noreply.github.com> Date: Thu, 20 Feb 2025 23:43:06 +0300 Subject: [PATCH 01/16] Migrate cache-testing app to module type --- .github/workflows/tests.yml | 2 +- ...ndler-local.mjs => cache-handler-local.js} | 0 ...mple.js => cache-handler-next-example.cjs} | 0 ...tack.mjs => cache-handler-redis-stack.cjs} | 10 +- .../cache-handler-redis-stack.js | 10 +- ...ngs.mjs => cache-handler-redis-strings.js} | 0 apps/cache-testing/cluster.config.js | 2 +- apps/cache-testing/create-instances.sh | 41 - apps/cache-testing/create-instances.ts | 67 + .../{next.config.mjs => next.config.js} | 2 +- apps/cache-testing/package.json | 9 +- apps/cache-testing/src/instrumentation.ts | 2 +- docs/cache-handler-docs/package.json | 8 +- internal/backend/package.json | 4 +- internal/eslint-config/next.js | 13 +- internal/eslint-config/package.json | 10 +- internal/next-common/package.json | 2 +- internal/next-lru-cache/package.json | 2 +- package.json | 6 +- packages/cache-handler/package.json | 4 +- packages/json-replacer-reviver/package.json | 4 +- packages/server/package.json | 4 +- pnpm-lock.yaml | 1378 +++++++++-------- turbo.json | 3 +- 24 files changed, 817 insertions(+), 766 deletions(-) rename apps/cache-testing/{cache-handler-local.mjs => cache-handler-local.js} (100%) rename apps/cache-testing/{cache-handler-next-example.js => cache-handler-next-example.cjs} (100%) rename apps/cache-testing/{cache-handler-redis-stack.mjs => cache-handler-redis-stack.cjs} (88%) rename apps/cache-testing/{cache-handler-redis-strings.mjs => cache-handler-redis-strings.js} (100%) delete mode 100755 apps/cache-testing/create-instances.sh create mode 100644 apps/cache-testing/create-instances.ts rename apps/cache-testing/{next.config.mjs => next.config.js} (91%) diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 63622269..073f6e9b 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -68,7 +68,7 @@ jobs: - name: Replace Path with Sed run: | if [ "${{ matrix.handler }}" == "redis-strings" ]; then - sed -i 's/cache-handler-redis-stack/cache-handler-redis-strings/g' apps/cache-testing/next.config.mjs + sed -i 's/cache-handler-redis-stack/cache-handler-redis-strings/g' apps/cache-testing/next.config.js sed -i 's/cache-handler-redis-stack/cache-handler-redis-strings/g' apps/cache-testing/src/instrumentation.ts fi diff --git a/apps/cache-testing/cache-handler-local.mjs b/apps/cache-testing/cache-handler-local.js similarity index 100% rename from apps/cache-testing/cache-handler-local.mjs rename to apps/cache-testing/cache-handler-local.js diff --git a/apps/cache-testing/cache-handler-next-example.js b/apps/cache-testing/cache-handler-next-example.cjs similarity index 100% rename from apps/cache-testing/cache-handler-next-example.js rename to apps/cache-testing/cache-handler-next-example.cjs diff --git a/apps/cache-testing/cache-handler-redis-stack.mjs b/apps/cache-testing/cache-handler-redis-stack.cjs similarity index 88% rename from apps/cache-testing/cache-handler-redis-stack.mjs rename to apps/cache-testing/cache-handler-redis-stack.cjs index 7ea08856..decb4bf6 100644 --- a/apps/cache-testing/cache-handler-redis-stack.mjs +++ b/apps/cache-testing/cache-handler-redis-stack.cjs @@ -1,9 +1,9 @@ // @ts-check -import { CacheHandler } from '@neshca/cache-handler'; -import createLruHandler from '@neshca/cache-handler/local-lru'; -import createRedisHandler from '@neshca/cache-handler/redis-stack'; -import { createClient } from 'redis'; +const { CacheHandler } = require('@neshca/cache-handler'); +const createLruHandler = require('@neshca/cache-handler/local-lru').default; +const createRedisHandler = require('@neshca/cache-handler/redis-stack').default; +const { createClient } = require('redis'); CacheHandler.onCreation(async () => { if (!process.env.REDIS_URL) { @@ -86,4 +86,4 @@ CacheHandler.onCreation(async () => { }; }); -export default CacheHandler; +module.exports = CacheHandler; diff --git a/apps/cache-testing/cache-handler-redis-stack.js b/apps/cache-testing/cache-handler-redis-stack.js index decb4bf6..7ea08856 100644 --- a/apps/cache-testing/cache-handler-redis-stack.js +++ b/apps/cache-testing/cache-handler-redis-stack.js @@ -1,9 +1,9 @@ // @ts-check -const { CacheHandler } = require('@neshca/cache-handler'); -const createLruHandler = require('@neshca/cache-handler/local-lru').default; -const createRedisHandler = require('@neshca/cache-handler/redis-stack').default; -const { createClient } = require('redis'); +import { CacheHandler } from '@neshca/cache-handler'; +import createLruHandler from '@neshca/cache-handler/local-lru'; +import createRedisHandler from '@neshca/cache-handler/redis-stack'; +import { createClient } from 'redis'; CacheHandler.onCreation(async () => { if (!process.env.REDIS_URL) { @@ -86,4 +86,4 @@ CacheHandler.onCreation(async () => { }; }); -module.exports = CacheHandler; +export default CacheHandler; diff --git a/apps/cache-testing/cache-handler-redis-strings.mjs b/apps/cache-testing/cache-handler-redis-strings.js similarity index 100% rename from apps/cache-testing/cache-handler-redis-strings.mjs rename to apps/cache-testing/cache-handler-redis-strings.js diff --git a/apps/cache-testing/cluster.config.js b/apps/cache-testing/cluster.config.js index 2c24f59d..3a6af430 100644 --- a/apps/cache-testing/cluster.config.js +++ b/apps/cache-testing/cluster.config.js @@ -1,4 +1,4 @@ -module.exports = { +export default { apps: [ { name: 'app', diff --git a/apps/cache-testing/create-instances.sh b/apps/cache-testing/create-instances.sh deleted file mode 100755 index d8403735..00000000 --- a/apps/cache-testing/create-instances.sh +++ /dev/null @@ -1,41 +0,0 @@ -#!/bin/bash - -# Set common paths -STANDALONE_DIR="$PWD/.next/standalone" -APP_DIR="$STANDALONE_DIR/apps/cache-testing" -PUBLIC_DIR="$PWD/public" -STATIC_DIR="$PWD/.next/static" -FETCH_CACHE_DIR="$PWD/.next/cache/fetch-cache" -INSTANCES_DIR="$PWD/.next/__instances" - -copy_dir() { - if ! cp -r "$1" "$2"; then - echo "Failed to copy from $1 to $2" - exit 1 - fi -} - -# Copy public directory to standalone app directory -copy_dir "$PUBLIC_DIR/" "$APP_DIR/public" - -# Copy static directory to standalone app/.next directory -copy_dir "$STATIC_DIR/" "$APP_DIR/.next/static" - -# Copy fetch cache directory to standalone app/.next directory -mkdir -p "$APP_DIR/.next/cache/fetch-cache/" -cp $FETCH_CACHE_DIR/* $APP_DIR/.next/cache/fetch-cache/ - -create_instance_dir() { - if ! mkdir -p "$INSTANCES_DIR/$1"; then - echo "Failed to create $INSTANCES_DIR/$1 directory" - exit 1 - fi -} - -# Create instance directories -create_instance_dir 3000 -create_instance_dir 3001 - -# Copy files from standalone directory to instance directories -copy_dir "$STANDALONE_DIR/." "$INSTANCES_DIR/3000" -copy_dir "$STANDALONE_DIR/." "$INSTANCES_DIR/3001" diff --git a/apps/cache-testing/create-instances.ts b/apps/cache-testing/create-instances.ts new file mode 100644 index 00000000..39b7de7a --- /dev/null +++ b/apps/cache-testing/create-instances.ts @@ -0,0 +1,67 @@ +import { cp, mkdir, readdir } from 'node:fs/promises'; +import path from 'node:path'; +import { fileURLToPath } from 'node:url'; + +const currentDir = path.dirname(fileURLToPath(import.meta.url)); + +// Set common paths +const STANDALONE_DIR = path.join(currentDir, '.next/standalone'); +const APP_DIR = path.join(STANDALONE_DIR, 'apps/cache-testing'); +const PUBLIC_DIR = path.join(currentDir, 'public'); +const STATIC_DIR = path.join(currentDir, '.next/static'); +const FETCH_CACHE_DIR = path.join(currentDir, '.next/cache/fetch-cache'); +const INSTANCES_DIR = path.join(currentDir, '.next/__instances'); + +async function copyDir(src: string, dest: string) { + try { + await cp(src, dest, { recursive: true }); + } catch (error) { + console.error(`Failed to copy from ${src} to ${dest}:`, error); + process.exit(1); + } +} + +async function createInstanceDir(port: string) { + try { + await mkdir(path.join(INSTANCES_DIR, port), { recursive: true }); + } catch (error) { + console.error( + `Failed to create ${path.join(INSTANCES_DIR, port)} directory:`, + error, + ); + process.exit(1); + } +} + +// Copy public directory to standalone app directory +await copyDir(PUBLIC_DIR, path.join(APP_DIR, 'public')); + +// Copy static directory to standalone app/.next directory +await copyDir(STATIC_DIR, path.join(APP_DIR, '.next/static')); + +try { + // Copy fetch cache directory to standalone app/.next directory + await mkdir(path.join(APP_DIR, '.next/cache/fetch-cache'), { + recursive: true, + }); + + const files = await readdir(FETCH_CACHE_DIR); + + if (files.length > 0) { + await copyDir( + FETCH_CACHE_DIR, + path.join(APP_DIR, '.next/cache/fetch-cache'), + ); + } +} catch (_error) { + // Ignore errors - directory might not exist or be empty + console.error('No fetch cache files to copy'); +} + +// Create instance directories +await createInstanceDir('3000'); +await createInstanceDir('3001'); + +// Copy files from standalone directory to instance directories +await copyDir(path.join(STANDALONE_DIR, '.'), path.join(INSTANCES_DIR, '3000')); +await copyDir(path.join(STANDALONE_DIR, '.'), path.join(INSTANCES_DIR, '3001')); diff --git a/apps/cache-testing/next.config.mjs b/apps/cache-testing/next.config.js similarity index 91% rename from apps/cache-testing/next.config.mjs rename to apps/cache-testing/next.config.js index 1d5968d5..852964d9 100644 --- a/apps/cache-testing/next.config.mjs +++ b/apps/cache-testing/next.config.js @@ -2,7 +2,7 @@ import path from 'node:path'; -const cacheHandler = path.resolve('./cache-handler-redis-stack.mjs'); +const cacheHandler = path.resolve('./cache-handler-redis-stack.js'); /** @type {import('next').NextConfig} */ const nextConfig = { diff --git a/apps/cache-testing/package.json b/apps/cache-testing/package.json index 682a4360..79161814 100644 --- a/apps/cache-testing/package.json +++ b/apps/cache-testing/package.json @@ -3,8 +3,9 @@ "version": "0.0.0", "private": true, "license": "MIT", + "type": "module", "scripts": { - "build": "next build && ./create-instances.sh", + "build": "next build && tsx create-instances.ts", "cluster:start": "pm2 start cluster.config.js --env production", "cluster:stop": "pm2 kill", "e2e": "playwright test --config=./playwright.config.ts", @@ -26,13 +27,13 @@ "@playwright/test": "1.50.1", "@repo/eslint-config": "workspace:*", "@repo/typescript-config": "workspace:*", - "@types/node": "22.13.1", + "@types/node": "22.13.4", "@types/react": "18.3.12", "@types/react-dom": "18.3.1", - "eslint": "9.20.0", + "eslint": "9.20.1", "fastify": "5.2.1", "pm2": "5.4.3", - "tsx": "4.19.2", + "tsx": "4.19.3", "typescript": "5.7.3" } } diff --git a/apps/cache-testing/src/instrumentation.ts b/apps/cache-testing/src/instrumentation.ts index 56fc1e52..903aebf7 100644 --- a/apps/cache-testing/src/instrumentation.ts +++ b/apps/cache-testing/src/instrumentation.ts @@ -3,7 +3,7 @@ export async function register() { const { registerInitialCache } = await import( '@neshca/cache-handler/instrumentation' ); - const CacheHandler = (await import('../cache-handler-redis-stack.mjs')) + const CacheHandler = (await import('../cache-handler-redis-stack.js')) .default; await registerInitialCache(CacheHandler); } diff --git a/docs/cache-handler-docs/package.json b/docs/cache-handler-docs/package.json index cd98d8d0..19def9d5 100644 --- a/docs/cache-handler-docs/package.json +++ b/docs/cache-handler-docs/package.json @@ -12,18 +12,18 @@ }, "dependencies": { "next": "15.1.6", - "nextra": "4.2.4", - "nextra-theme-docs": "4.2.4", + "nextra": "4.2.13", + "nextra-theme-docs": "4.2.13", "react": "19.0.0", "react-dom": "19.0.0" }, "devDependencies": { "@repo/eslint-config": "workspace:*", "@repo/typescript-config": "workspace:*", - "@types/node": "22.13.1", + "@types/node": "22.13.4", "@types/react": "19.0.8", "@types/react-dom": "19.0.3", - "eslint": "9.20.0", + "eslint": "9.20.1", "pagefind": "1.3.0", "serve": "14.2.4", "typescript": "5.7.3" diff --git a/internal/backend/package.json b/internal/backend/package.json index b41fcd8c..f3eb9b72 100644 --- a/internal/backend/package.json +++ b/internal/backend/package.json @@ -14,9 +14,9 @@ }, "devDependencies": { "@repo/typescript-config": "workspace:*", - "@types/node": "22.13.1", + "@types/node": "22.13.4", "pino-pretty": "13.0.0", - "tsx": "4.19.2", + "tsx": "4.19.3", "typescript": "5.7.3" } } diff --git a/internal/eslint-config/next.js b/internal/eslint-config/next.js index 1c180fa9..572a9a3e 100644 --- a/internal/eslint-config/next.js +++ b/internal/eslint-config/next.js @@ -10,12 +10,19 @@ import tseslint from 'typescript-eslint'; /** * A shared ESLint configuration for the repository. * - * @type {import("eslint").Linter.Config} + * @type {import("typescript-eslint").ConfigArray} * */ -export const nextJsConfig = [ +export const nextJsConfig = tseslint.config( js.configs.recommended, eslintConfigPrettier, ...tseslint.configs.recommended, + { + languageOptions: { + globals: { + ...globals.node, + }, + }, + }, { plugins: { turbo: turboPlugin, @@ -56,4 +63,4 @@ export const nextJsConfig = [ 'react/react-in-jsx-scope': 'off', }, }, -]; +); diff --git a/internal/eslint-config/package.json b/internal/eslint-config/package.json index 64df5e4e..e792fcb1 100644 --- a/internal/eslint-config/package.json +++ b/internal/eslint-config/package.json @@ -8,14 +8,14 @@ }, "devDependencies": { "@eslint/js": "9.20.0", - "@next/eslint-plugin-next": "15.1.6", - "eslint": "9.20.0", + "@next/eslint-plugin-next": "15.1.7", + "eslint": "9.20.1", "eslint-config-prettier": "10.0.1", "eslint-plugin-react": "7.37.4", "eslint-plugin-react-hooks": "5.1.0", - "eslint-plugin-turbo": "2.4.0", - "globals": "15.14.0", + "eslint-plugin-turbo": "2.4.2", + "globals": "16.0.0", "typescript": "5.7.3", - "typescript-eslint": "8.23.0" + "typescript-eslint": "8.24.1" } } diff --git a/internal/next-common/package.json b/internal/next-common/package.json index d8d570ac..f19eb15e 100644 --- a/internal/next-common/package.json +++ b/internal/next-common/package.json @@ -12,7 +12,7 @@ }, "devDependencies": { "@repo/typescript-config": "workspace:*", - "@types/node": "22.13.1", + "@types/node": "22.13.4", "typescript": "5.7.3" } } diff --git a/internal/next-lru-cache/package.json b/internal/next-lru-cache/package.json index 40554f48..c0f7287d 100644 --- a/internal/next-lru-cache/package.json +++ b/internal/next-lru-cache/package.json @@ -13,7 +13,7 @@ "devDependencies": { "@repo/next-common": "workspace:*", "@repo/typescript-config": "workspace:*", - "@types/node": "22.13.1", + "@types/node": "22.13.4", "typescript": "5.7.3" } } diff --git a/package.json b/package.json index 4b5c9156..304c72a2 100644 --- a/package.json +++ b/package.json @@ -26,10 +26,10 @@ }, "devDependencies": { "@biomejs/biome": "1.9.4", - "@changesets/cli": "2.27.12", - "prettier": "3.4.2", + "@changesets/cli": "2.28.1", + "prettier": "3.5.1", "prettier-plugin-packagejson": "2.5.8", - "turbo": "2.4.0" + "turbo": "2.4.2" }, "packageManager": "pnpm@10.2.1+sha512.398035c7bd696d0ba0b10a688ed558285329d27ea994804a52bad9167d8e3a72bcb993f9699585d3ca25779ac64949ef422757a6c31102c12ab932e5cbe5cc92", "engines": { diff --git a/packages/cache-handler/package.json b/packages/cache-handler/package.json index dbce7c73..3ad72db1 100644 --- a/packages/cache-handler/package.json +++ b/packages/cache-handler/package.json @@ -86,9 +86,9 @@ "@repo/next-common": "workspace:*", "@repo/next-lru-cache": "workspace:*", "@repo/typescript-config": "workspace:*", - "@types/node": "22.13.1", + "@types/node": "22.13.4", "tsup": "8.3.6", - "tsx": "4.19.2", + "tsx": "4.19.3", "typescript": "5.7.3" }, "peerDependencies": { diff --git a/packages/json-replacer-reviver/package.json b/packages/json-replacer-reviver/package.json index fa9b19b7..bd3a5d32 100644 --- a/packages/json-replacer-reviver/package.json +++ b/packages/json-replacer-reviver/package.json @@ -27,9 +27,9 @@ }, "devDependencies": { "@repo/typescript-config": "workspace:*", - "@types/node": "22.13.1", + "@types/node": "22.13.4", "tsup": "8.3.6", - "tsx": "4.19.2", + "tsx": "4.19.3", "typescript": "5.7.3" } } diff --git a/packages/server/package.json b/packages/server/package.json index 1ce0ee23..72589ab0 100644 --- a/packages/server/package.json +++ b/packages/server/package.json @@ -31,9 +31,9 @@ "@repo/next-common": "workspace:*", "@repo/next-lru-cache": "workspace:*", "@repo/typescript-config": "workspace:*", - "@types/node": "22.13.1", + "@types/node": "22.13.4", "tsup": "8.3.6", - "tsx": "4.19.2", + "tsx": "4.19.3", "typescript": "5.7.3" }, "distTags": [ diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index b75e0b23..6090f3af 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -12,17 +12,17 @@ importers: specifier: 1.9.4 version: 1.9.4 '@changesets/cli': - specifier: 2.27.12 - version: 2.27.12 + specifier: 2.28.1 + version: 2.28.1 prettier: - specifier: 3.4.2 - version: 3.4.2 + specifier: 3.5.1 + version: 3.5.1 prettier-plugin-packagejson: specifier: 2.5.8 - version: 2.5.8(prettier@3.4.2) + version: 2.5.8(prettier@3.5.1) turbo: - specifier: 2.4.0 - version: 2.4.0 + specifier: 2.4.2 + version: 2.4.2 apps/cache-testing: dependencies: @@ -55,8 +55,8 @@ importers: specifier: workspace:* version: link:../../internal/typescript-config '@types/node': - specifier: 22.13.1 - version: 22.13.1 + specifier: 22.13.4 + version: 22.13.4 '@types/react': specifier: 18.3.12 version: 18.3.12 @@ -64,8 +64,8 @@ importers: specifier: 18.3.1 version: 18.3.1 eslint: - specifier: 9.20.0 - version: 9.20.0 + specifier: 9.20.1 + version: 9.20.1 fastify: specifier: 5.2.1 version: 5.2.1 @@ -73,8 +73,8 @@ importers: specifier: 5.4.3 version: 5.4.3 tsx: - specifier: 4.19.2 - version: 4.19.2 + specifier: 4.19.3 + version: 4.19.3 typescript: specifier: 5.7.3 version: 5.7.3 @@ -85,11 +85,11 @@ importers: specifier: 15.1.6 version: 15.1.6(@playwright/test@1.50.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) nextra: - specifier: 4.2.4 - version: 4.2.4(acorn@8.14.0)(next@15.1.6(@playwright/test@1.50.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3) + specifier: 4.2.13 + version: 4.2.13(acorn@8.14.0)(next@15.1.6(@playwright/test@1.50.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3) nextra-theme-docs: - specifier: 4.2.4 - version: 4.2.4(@types/react@19.0.8)(next@15.1.6(@playwright/test@1.50.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(nextra@4.2.4(acorn@8.14.0)(next@15.1.6(@playwright/test@1.50.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3))(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + specifier: 4.2.13 + version: 4.2.13(@types/react@19.0.8)(next@15.1.6(@playwright/test@1.50.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(nextra@4.2.13(acorn@8.14.0)(next@15.1.6(@playwright/test@1.50.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3))(react-dom@19.0.0(react@19.0.0))(react@19.0.0) react: specifier: 19.0.0 version: 19.0.0 @@ -104,8 +104,8 @@ importers: specifier: workspace:* version: link:../../internal/typescript-config '@types/node': - specifier: 22.13.1 - version: 22.13.1 + specifier: 22.13.4 + version: 22.13.4 '@types/react': specifier: 19.0.8 version: 19.0.8 @@ -113,8 +113,8 @@ importers: specifier: 19.0.3 version: 19.0.3(@types/react@19.0.8) eslint: - specifier: 9.20.0 - version: 9.20.0 + specifier: 9.20.1 + version: 9.20.1 pagefind: specifier: 1.3.0 version: 1.3.0 @@ -138,14 +138,14 @@ importers: specifier: workspace:* version: link:../typescript-config '@types/node': - specifier: 22.13.1 - version: 22.13.1 + specifier: 22.13.4 + version: 22.13.4 pino-pretty: specifier: 13.0.0 version: 13.0.0 tsx: - specifier: 4.19.2 - version: 4.19.2 + specifier: 4.19.3 + version: 4.19.3 typescript: specifier: 5.7.3 version: 5.7.3 @@ -156,32 +156,32 @@ importers: specifier: 9.20.0 version: 9.20.0 '@next/eslint-plugin-next': - specifier: 15.1.6 - version: 15.1.6 + specifier: 15.1.7 + version: 15.1.7 eslint: - specifier: 9.20.0 - version: 9.20.0 + specifier: 9.20.1 + version: 9.20.1 eslint-config-prettier: specifier: 10.0.1 - version: 10.0.1(eslint@9.20.0) + version: 10.0.1(eslint@9.20.1) eslint-plugin-react: specifier: 7.37.4 - version: 7.37.4(eslint@9.20.0) + version: 7.37.4(eslint@9.20.1) eslint-plugin-react-hooks: specifier: 5.1.0 - version: 5.1.0(eslint@9.20.0) + version: 5.1.0(eslint@9.20.1) eslint-plugin-turbo: - specifier: 2.4.0 - version: 2.4.0(eslint@9.20.0)(turbo@2.4.0) + specifier: 2.4.2 + version: 2.4.2(eslint@9.20.1)(turbo@2.4.2) globals: - specifier: 15.14.0 - version: 15.14.0 + specifier: 16.0.0 + version: 16.0.0 typescript: specifier: 5.7.3 version: 5.7.3 typescript-eslint: - specifier: 8.23.0 - version: 8.23.0(eslint@9.20.0)(typescript@5.7.3) + specifier: 8.24.1 + version: 8.24.1(eslint@9.20.1)(typescript@5.7.3) internal/next-common: dependencies: @@ -193,8 +193,8 @@ importers: specifier: workspace:* version: link:../typescript-config '@types/node': - specifier: 22.13.1 - version: 22.13.1 + specifier: 22.13.4 + version: 22.13.4 typescript: specifier: 5.7.3 version: 5.7.3 @@ -212,8 +212,8 @@ importers: specifier: workspace:* version: link:../typescript-config '@types/node': - specifier: 22.13.1 - version: 22.13.1 + specifier: 22.13.4 + version: 22.13.4 typescript: specifier: 5.7.3 version: 5.7.3 @@ -245,14 +245,14 @@ importers: specifier: workspace:* version: link:../../internal/typescript-config '@types/node': - specifier: 22.13.1 - version: 22.13.1 + specifier: 22.13.4 + version: 22.13.4 tsup: specifier: 8.3.6 - version: 8.3.6(postcss@8.4.31)(tsx@4.19.2)(typescript@5.7.3)(yaml@2.7.0) + version: 8.3.6(postcss@8.4.31)(tsx@4.19.3)(typescript@5.7.3)(yaml@2.7.0) tsx: - specifier: 4.19.2 - version: 4.19.2 + specifier: 4.19.3 + version: 4.19.3 typescript: specifier: 5.7.3 version: 5.7.3 @@ -263,14 +263,14 @@ importers: specifier: workspace:* version: link:../../internal/typescript-config '@types/node': - specifier: 22.13.1 - version: 22.13.1 + specifier: 22.13.4 + version: 22.13.4 tsup: specifier: 8.3.6 - version: 8.3.6(postcss@8.4.31)(tsx@4.19.2)(typescript@5.7.3)(yaml@2.7.0) + version: 8.3.6(postcss@8.4.31)(tsx@4.19.3)(typescript@5.7.3)(yaml@2.7.0) tsx: - specifier: 4.19.2 - version: 4.19.2 + specifier: 4.19.3 + version: 4.19.3 typescript: specifier: 5.7.3 version: 5.7.3 @@ -294,14 +294,14 @@ importers: specifier: workspace:* version: link:../../internal/typescript-config '@types/node': - specifier: 22.13.1 - version: 22.13.1 + specifier: 22.13.4 + version: 22.13.4 tsup: specifier: 8.3.6 - version: 8.3.6(postcss@8.4.31)(tsx@4.19.2)(typescript@5.7.3)(yaml@2.7.0) + version: 8.3.6(postcss@8.4.31)(tsx@4.19.3)(typescript@5.7.3)(yaml@2.7.0) tsx: - specifier: 4.19.2 - version: 4.19.2 + specifier: 4.19.3 + version: 4.19.3 typescript: specifier: 5.7.3 version: 5.7.3 @@ -311,11 +311,11 @@ packages: '@antfu/install-pkg@1.0.0': resolution: {integrity: sha512-xvX6P/lo1B3ej0OsaErAjqgFYzYVcJpamjLAFLYh9vRJngBrMoUG7aVnrGTeqM7yxbyTD5p3F2+0/QUEh8Vzhw==} - '@antfu/utils@8.1.0': - resolution: {integrity: sha512-XPR7Jfwp0FFl/dFYPX8ZjpmU4/1mIXTjnZ1ba48BLMyKOV62/tiRjdsFcPs2hsYcSud4tzk7w3a3LjX8Fu3huA==} + '@antfu/utils@8.1.1': + resolution: {integrity: sha512-Mex9nXf9vR6AhcXmMrlz/HVgYYZpVGJ6YlPgwl7UnaFpnshXs6EK/oa5Gpf3CzENMjkvEx2tQtntGnb7UtSTOQ==} - '@babel/runtime@7.26.7': - resolution: {integrity: sha512-AOPI3D+a8dXnja+iwsUqGRjr1BbZIe771sXdapOtYI531gSqpi92vXivKcq2asu/DFpdl1ceFAKZyRzK2PCVcQ==} + '@babel/runtime@7.26.9': + resolution: {integrity: sha512-aA63XwOkcl4xxQa3HjPMqOP6LiK0ZDv3mUPYEFXkpHbaFjtGggE1A61FjFzJnB+p7/oy2gA8E+rcBNl/zC1tMg==} engines: {node: '>=6.9.0'} '@biomejs/biome@1.9.4': @@ -374,30 +374,30 @@ packages: '@braintree/sanitize-url@7.1.1': resolution: {integrity: sha512-i1L7noDNxtFyL5DmZafWy1wRVhGehQmzZaz1HiN5e7iylJMSZR7ekOV7NsIqa5qBldlLrsKv4HbgFUVlQrz8Mw==} - '@changesets/apply-release-plan@7.0.8': - resolution: {integrity: sha512-qjMUj4DYQ1Z6qHawsn7S71SujrExJ+nceyKKyI9iB+M5p9lCL55afuEd6uLBPRpLGWQwkwvWegDHtwHJb1UjpA==} + '@changesets/apply-release-plan@7.0.10': + resolution: {integrity: sha512-wNyeIJ3yDsVspYvHnEz1xQDq18D9ifed3lI+wxRQRK4pArUcuHgCTrHv0QRnnwjhVCQACxZ+CBih3wgOct6UXw==} - '@changesets/assemble-release-plan@6.0.5': - resolution: {integrity: sha512-IgvBWLNKZd6k4t72MBTBK3nkygi0j3t3zdC1zrfusYo0KpdsvnDjrMM9vPnTCLCMlfNs55jRL4gIMybxa64FCQ==} + '@changesets/assemble-release-plan@6.0.6': + resolution: {integrity: sha512-Frkj8hWJ1FRZiY3kzVCKzS0N5mMwWKwmv9vpam7vt8rZjLL1JMthdh6pSDVSPumHPshTTkKZ0VtNbE0cJHZZUg==} - '@changesets/changelog-git@0.2.0': - resolution: {integrity: sha512-bHOx97iFI4OClIT35Lok3sJAwM31VbUM++gnMBV16fdbtBhgYu4dxsphBF/0AZZsyAHMrnM0yFcj5gZM1py6uQ==} + '@changesets/changelog-git@0.2.1': + resolution: {integrity: sha512-x/xEleCFLH28c3bQeQIyeZf8lFXyDFVn1SgcBiR2Tw/r4IAWlk1fzxCEZ6NxQAjF2Nwtczoen3OA2qR+UawQ8Q==} - '@changesets/cli@2.27.12': - resolution: {integrity: sha512-9o3fOfHYOvBnyEn0mcahB7wzaA3P4bGJf8PNqGit5PKaMEFdsRixik+txkrJWd2VX+O6wRFXpxQL8j/1ANKE9g==} + '@changesets/cli@2.28.1': + resolution: {integrity: sha512-PiIyGRmSc6JddQJe/W1hRPjiN4VrMvb2VfQ6Uydy2punBioQrsxppyG5WafinKcW1mT0jOe/wU4k9Zy5ff21AA==} hasBin: true - '@changesets/config@3.0.5': - resolution: {integrity: sha512-QyXLSSd10GquX7hY0Mt4yQFMEeqnO5z/XLpbIr4PAkNNoQNKwDyiSrx4yd749WddusH1v3OSiA0NRAYmH/APpQ==} + '@changesets/config@3.1.1': + resolution: {integrity: sha512-bd+3Ap2TKXxljCggI0mKPfzCQKeV/TU4yO2h2C6vAihIo8tzseAn2e7klSuiyYYXvgu53zMN1OeYMIQkaQoWnA==} '@changesets/errors@0.2.0': resolution: {integrity: sha512-6BLOQUscTpZeGljvyQXlWOItQyU71kCdGz7Pi8H8zdw6BI0g3m43iL4xKUVPWtG+qrrL9DTjpdn8eYuCQSRpow==} - '@changesets/get-dependents-graph@2.1.2': - resolution: {integrity: sha512-sgcHRkiBY9i4zWYBwlVyAjEM9sAzs4wYVwJUdnbDLnVG3QwAaia1Mk5P8M7kraTOZN+vBET7n8KyB0YXCbFRLQ==} + '@changesets/get-dependents-graph@2.1.3': + resolution: {integrity: sha512-gphr+v0mv2I3Oxt19VdWRRUxq3sseyUpX9DaHpTUmLj92Y10AGy+XOtV+kbM6L/fDcpx7/ISDFK6T8A/P3lOdQ==} - '@changesets/get-release-plan@4.0.6': - resolution: {integrity: sha512-FHRwBkY7Eili04Y5YMOZb0ezQzKikTka4wL753vfUA5COSebt7KThqiuCN9BewE4/qFGgF/5t3AuzXx1/UAY4w==} + '@changesets/get-release-plan@4.0.8': + resolution: {integrity: sha512-MM4mq2+DQU1ZT7nqxnpveDMTkMBLnwNX44cX7NSxlXmr7f8hO6/S2MXNiXG54uf/0nYnefv0cfy4Czf/ZL/EKQ==} '@changesets/get-version-range-type@0.4.0': resolution: {integrity: sha512-hwawtob9DryoGTpixy1D3ZXbGgJu1Rhr+ySH2PvTLHvkZuQ7sRT4oQwMh0hbqZH1weAooedEjRsbrWcGLCeyVQ==} @@ -408,26 +408,26 @@ packages: '@changesets/logger@0.1.1': resolution: {integrity: sha512-OQtR36ZlnuTxKqoW4Sv6x5YIhOmClRd5pWsjZsddYxpWs517R0HkyiefQPIytCVh4ZcC5x9XaG8KTdd5iRQUfg==} - '@changesets/parse@0.4.0': - resolution: {integrity: sha512-TS/9KG2CdGXS27S+QxbZXgr8uPsP4yNJYb4BC2/NeFUj80Rni3TeD2qwWmabymxmrLo7JEsytXH1FbpKTbvivw==} + '@changesets/parse@0.4.1': + resolution: {integrity: sha512-iwksMs5Bf/wUItfcg+OXrEpravm5rEd9Bf4oyIPL4kVTmJQ7PNDSd6MDYkpSJR1pn7tz/k8Zf2DhTCqX08Ou+Q==} - '@changesets/pre@2.0.1': - resolution: {integrity: sha512-vvBJ/If4jKM4tPz9JdY2kGOgWmCowUYOi5Ycv8dyLnEE8FgpYYUo1mgJZxcdtGGP3aG8rAQulGLyyXGSLkIMTQ==} + '@changesets/pre@2.0.2': + resolution: {integrity: sha512-HaL/gEyFVvkf9KFg6484wR9s0qjAXlZ8qWPDkTyKF6+zqjBe/I2mygg3MbpZ++hdi0ToqNUF8cjj7fBy0dg8Ug==} - '@changesets/read@0.6.2': - resolution: {integrity: sha512-wjfQpJvryY3zD61p8jR87mJdyx2FIhEcdXhKUqkja87toMrP/3jtg/Yg29upN+N4Ckf525/uvV7a4tzBlpk6gg==} + '@changesets/read@0.6.3': + resolution: {integrity: sha512-9H4p/OuJ3jXEUTjaVGdQEhBdqoT2cO5Ts95JTFsQyawmKzpL8FnIeJSyhTDPW1MBRDnwZlHFEM9SpPwJDY5wIg==} - '@changesets/should-skip-package@0.1.1': - resolution: {integrity: sha512-H9LjLbF6mMHLtJIc/eHR9Na+MifJ3VxtgP/Y+XLn4BF7tDTEN1HNYtH6QMcjP1uxp9sjaFYmW8xqloaCi/ckTg==} + '@changesets/should-skip-package@0.1.2': + resolution: {integrity: sha512-qAK/WrqWLNCP22UDdBTMPH5f41elVDlsNyat180A33dWxuUDyNpg6fPi/FyTZwRriVjg0L8gnjJn2F9XAoF0qw==} '@changesets/types@4.1.0': resolution: {integrity: sha512-LDQvVDv5Kb50ny2s25Fhm3d9QSZimsoUGBsUioj6MC3qbMUCuC8GPIvk/M6IvXx3lYhAs0lwWUQLb+VIEUCECw==} - '@changesets/types@6.0.0': - resolution: {integrity: sha512-b1UkfNulgKoWfqyHtzKS5fOZYSJO+77adgL7DLRDr+/7jhChN+QcHnbjiQVOz/U+Ts3PGNySq7diAItzDgugfQ==} + '@changesets/types@6.1.0': + resolution: {integrity: sha512-rKQcJ+o1nKNgeoYRHKOS07tAMNd3YSN0uHaJOZYjBAgxfV7TUE7JE+z4BzZdQwb5hKaYbayKN5KrYV7ODb2rAA==} - '@changesets/write@0.3.2': - resolution: {integrity: sha512-kDxDrPNpUgsjDbWBvUo27PzKX4gqeKOlhibaOXDJA6kuBisGqNHv/HwGJrAu8U/dSf8ZEFIeHIPtvSlZI1kULw==} + '@changesets/write@0.4.0': + resolution: {integrity: sha512-CdTLvIOPiCNuH71pyDu3rA+Q0n65cmAbXnwWH84rKGiFumFzkmHNT8KHTMEchcxN+Kl8I54xGUhJ7l3E7X396Q==} '@chevrotain/cst-dts-gen@11.0.3': resolution: {integrity: sha512-BvIKpRLeS/8UbfxXxgC33xOumsacaeCKAjAeLyOn7Pcp95HiRbrpl14S+9vaZLolnbssPIUuiUd8IvgkRyt6NQ==} @@ -447,23 +447,17 @@ packages: '@emnapi/runtime@1.3.1': resolution: {integrity: sha512-kEBmG8KyqtxJZv+ygbEim+KCGtIq1fC22Ms3S4ziXmYKm8uyoLX0MHONVKwp+9opg390VaKRNt4a7A9NwmpNhw==} - '@esbuild/aix-ppc64@0.23.1': - resolution: {integrity: sha512-6VhYk1diRqrhBAqpJEdjASR/+WVRtfjpqKuNw11cLiaWpAT/Uu+nokB+UJnevzy/P9C/ty6AOe0dwueMrGh/iQ==} - engines: {node: '>=18'} - cpu: [ppc64] - os: [aix] - '@esbuild/aix-ppc64@0.24.2': resolution: {integrity: sha512-thpVCb/rhxE/BnMLQ7GReQLLN8q9qbHmI55F4489/ByVg2aQaQ6kbcLb6FHkocZzQhxc4gx0sCk0tJkKBFzDhA==} engines: {node: '>=18'} cpu: [ppc64] os: [aix] - '@esbuild/android-arm64@0.23.1': - resolution: {integrity: sha512-xw50ipykXcLstLeWH7WRdQuysJqejuAGPd30vd1i5zSyKK3WE+ijzHmLKxdiCMtH1pHz78rOg0BKSYOSB/2Khw==} + '@esbuild/aix-ppc64@0.25.0': + resolution: {integrity: sha512-O7vun9Sf8DFjH2UtqK8Ku3LkquL9SZL8OLY1T5NZkA34+wG3OQF7cl4Ql8vdNzM6fzBbYfLaiRLIOZ+2FOCgBQ==} engines: {node: '>=18'} - cpu: [arm64] - os: [android] + cpu: [ppc64] + os: [aix] '@esbuild/android-arm64@0.24.2': resolution: {integrity: sha512-cNLgeqCqV8WxfcTIOeL4OAtSmL8JjcN6m09XIgro1Wi7cF4t/THaWEa7eL5CMoMBdjoHOTh/vwTO/o2TRXIyzg==} @@ -471,10 +465,10 @@ packages: cpu: [arm64] os: [android] - '@esbuild/android-arm@0.23.1': - resolution: {integrity: sha512-uz6/tEy2IFm9RYOyvKl88zdzZfwEfKZmnX9Cj1BHjeSGNuGLuMD1kR8y5bteYmwqKm1tj8m4cb/aKEorr6fHWQ==} + '@esbuild/android-arm64@0.25.0': + resolution: {integrity: sha512-grvv8WncGjDSyUBjN9yHXNt+cq0snxXbDxy5pJtzMKGmmpPxeAmAhWxXI+01lU5rwZomDgD3kJwulEnhTRUd6g==} engines: {node: '>=18'} - cpu: [arm] + cpu: [arm64] os: [android] '@esbuild/android-arm@0.24.2': @@ -483,10 +477,10 @@ packages: cpu: [arm] os: [android] - '@esbuild/android-x64@0.23.1': - resolution: {integrity: sha512-nlN9B69St9BwUoB+jkyU090bru8L0NA3yFvAd7k8dNsVH8bi9a8cUAUSEcEEgTp2z3dbEDGJGfP6VUnkQnlReg==} + '@esbuild/android-arm@0.25.0': + resolution: {integrity: sha512-PTyWCYYiU0+1eJKmw21lWtC+d08JDZPQ5g+kFyxP0V+es6VPPSUhM6zk8iImp2jbV6GwjX4pap0JFbUQN65X1g==} engines: {node: '>=18'} - cpu: [x64] + cpu: [arm] os: [android] '@esbuild/android-x64@0.24.2': @@ -495,11 +489,11 @@ packages: cpu: [x64] os: [android] - '@esbuild/darwin-arm64@0.23.1': - resolution: {integrity: sha512-YsS2e3Wtgnw7Wq53XXBLcV6JhRsEq8hkfg91ESVadIrzr9wO6jJDMZnCQbHm1Guc5t/CdDiFSSfWP58FNuvT3Q==} + '@esbuild/android-x64@0.25.0': + resolution: {integrity: sha512-m/ix7SfKG5buCnxasr52+LI78SQ+wgdENi9CqyCXwjVR2X4Jkz+BpC3le3AoBPYTC9NHklwngVXvbJ9/Akhrfg==} engines: {node: '>=18'} - cpu: [arm64] - os: [darwin] + cpu: [x64] + os: [android] '@esbuild/darwin-arm64@0.24.2': resolution: {integrity: sha512-kj3AnYWc+CekmZnS5IPu9D+HWtUI49hbnyqk0FLEJDbzCIQt7hg7ucF1SQAilhtYpIujfaHr6O0UHlzzSPdOeA==} @@ -507,10 +501,10 @@ packages: cpu: [arm64] os: [darwin] - '@esbuild/darwin-x64@0.23.1': - resolution: {integrity: sha512-aClqdgTDVPSEGgoCS8QDG37Gu8yc9lTHNAQlsztQ6ENetKEO//b8y31MMu2ZaPbn4kVsIABzVLXYLhCGekGDqw==} + '@esbuild/darwin-arm64@0.25.0': + resolution: {integrity: sha512-mVwdUb5SRkPayVadIOI78K7aAnPamoeFR2bT5nszFUZ9P8UpK4ratOdYbZZXYSqPKMHfS1wdHCJk1P1EZpRdvw==} engines: {node: '>=18'} - cpu: [x64] + cpu: [arm64] os: [darwin] '@esbuild/darwin-x64@0.24.2': @@ -519,11 +513,11 @@ packages: cpu: [x64] os: [darwin] - '@esbuild/freebsd-arm64@0.23.1': - resolution: {integrity: sha512-h1k6yS8/pN/NHlMl5+v4XPfikhJulk4G+tKGFIOwURBSFzE8bixw1ebjluLOjfwtLqY0kewfjLSrO6tN2MgIhA==} + '@esbuild/darwin-x64@0.25.0': + resolution: {integrity: sha512-DgDaYsPWFTS4S3nWpFcMn/33ZZwAAeAFKNHNa1QN0rI4pUjgqf0f7ONmXf6d22tqTY+H9FNdgeaAa+YIFUn2Rg==} engines: {node: '>=18'} - cpu: [arm64] - os: [freebsd] + cpu: [x64] + os: [darwin] '@esbuild/freebsd-arm64@0.24.2': resolution: {integrity: sha512-UN8HXjtJ0k/Mj6a9+5u6+2eZ2ERD7Edt1Q9IZiB5UZAIdPnVKDoG7mdTVGhHJIeEml60JteamR3qhsr1r8gXvg==} @@ -531,10 +525,10 @@ packages: cpu: [arm64] os: [freebsd] - '@esbuild/freebsd-x64@0.23.1': - resolution: {integrity: sha512-lK1eJeyk1ZX8UklqFd/3A60UuZ/6UVfGT2LuGo3Wp4/z7eRTRYY+0xOu2kpClP+vMTi9wKOfXi2vjUpO1Ro76g==} + '@esbuild/freebsd-arm64@0.25.0': + resolution: {integrity: sha512-VN4ocxy6dxefN1MepBx/iD1dH5K8qNtNe227I0mnTRjry8tj5MRk4zprLEdG8WPyAPb93/e4pSgi1SoHdgOa4w==} engines: {node: '>=18'} - cpu: [x64] + cpu: [arm64] os: [freebsd] '@esbuild/freebsd-x64@0.24.2': @@ -543,11 +537,11 @@ packages: cpu: [x64] os: [freebsd] - '@esbuild/linux-arm64@0.23.1': - resolution: {integrity: sha512-/93bf2yxencYDnItMYV/v116zff6UyTjo4EtEQjUBeGiVpMmffDNUyD9UN2zV+V3LRV3/on4xdZ26NKzn6754g==} + '@esbuild/freebsd-x64@0.25.0': + resolution: {integrity: sha512-mrSgt7lCh07FY+hDD1TxiTyIHyttn6vnjesnPoVDNmDfOmggTLXRv8Id5fNZey1gl/V2dyVK1VXXqVsQIiAk+A==} engines: {node: '>=18'} - cpu: [arm64] - os: [linux] + cpu: [x64] + os: [freebsd] '@esbuild/linux-arm64@0.24.2': resolution: {integrity: sha512-7HnAD6074BW43YvvUmE/35Id9/NB7BeX5EoNkK9obndmZBUk8xmJJeU7DwmUeN7tkysslb2eSl6CTrYz6oEMQg==} @@ -555,10 +549,10 @@ packages: cpu: [arm64] os: [linux] - '@esbuild/linux-arm@0.23.1': - resolution: {integrity: sha512-CXXkzgn+dXAPs3WBwE+Kvnrf4WECwBdfjfeYHpMeVxWE0EceB6vhWGShs6wi0IYEqMSIzdOF1XjQ/Mkm5d7ZdQ==} + '@esbuild/linux-arm64@0.25.0': + resolution: {integrity: sha512-9QAQjTWNDM/Vk2bgBl17yWuZxZNQIF0OUUuPZRKoDtqF2k4EtYbpyiG5/Dk7nqeK6kIJWPYldkOcBqjXjrUlmg==} engines: {node: '>=18'} - cpu: [arm] + cpu: [arm64] os: [linux] '@esbuild/linux-arm@0.24.2': @@ -567,10 +561,10 @@ packages: cpu: [arm] os: [linux] - '@esbuild/linux-ia32@0.23.1': - resolution: {integrity: sha512-VTN4EuOHwXEkXzX5nTvVY4s7E/Krz7COC8xkftbbKRYAl96vPiUssGkeMELQMOnLOJ8k3BY1+ZY52tttZnHcXQ==} + '@esbuild/linux-arm@0.25.0': + resolution: {integrity: sha512-vkB3IYj2IDo3g9xX7HqhPYxVkNQe8qTK55fraQyTzTX/fxaDtXiEnavv9geOsonh2Fd2RMB+i5cbhu2zMNWJwg==} engines: {node: '>=18'} - cpu: [ia32] + cpu: [arm] os: [linux] '@esbuild/linux-ia32@0.24.2': @@ -579,10 +573,10 @@ packages: cpu: [ia32] os: [linux] - '@esbuild/linux-loong64@0.23.1': - resolution: {integrity: sha512-Vx09LzEoBa5zDnieH8LSMRToj7ir/Jeq0Gu6qJ/1GcBq9GkfoEAoXvLiW1U9J1qE/Y/Oyaq33w5p2ZWrNNHNEw==} + '@esbuild/linux-ia32@0.25.0': + resolution: {integrity: sha512-43ET5bHbphBegyeqLb7I1eYn2P/JYGNmzzdidq/w0T8E2SsYL1U6un2NFROFRg1JZLTzdCoRomg8Rvf9M6W6Gg==} engines: {node: '>=18'} - cpu: [loong64] + cpu: [ia32] os: [linux] '@esbuild/linux-loong64@0.24.2': @@ -591,10 +585,10 @@ packages: cpu: [loong64] os: [linux] - '@esbuild/linux-mips64el@0.23.1': - resolution: {integrity: sha512-nrFzzMQ7W4WRLNUOU5dlWAqa6yVeI0P78WKGUo7lg2HShq/yx+UYkeNSE0SSfSure0SqgnsxPvmAUu/vu0E+3Q==} + '@esbuild/linux-loong64@0.25.0': + resolution: {integrity: sha512-fC95c/xyNFueMhClxJmeRIj2yrSMdDfmqJnyOY4ZqsALkDrrKJfIg5NTMSzVBr5YW1jf+l7/cndBfP3MSDpoHw==} engines: {node: '>=18'} - cpu: [mips64el] + cpu: [loong64] os: [linux] '@esbuild/linux-mips64el@0.24.2': @@ -603,10 +597,10 @@ packages: cpu: [mips64el] os: [linux] - '@esbuild/linux-ppc64@0.23.1': - resolution: {integrity: sha512-dKN8fgVqd0vUIjxuJI6P/9SSSe/mB9rvA98CSH2sJnlZ/OCZWO1DJvxj8jvKTfYUdGfcq2dDxoKaC6bHuTlgcw==} + '@esbuild/linux-mips64el@0.25.0': + resolution: {integrity: sha512-nkAMFju7KDW73T1DdH7glcyIptm95a7Le8irTQNO/qtkoyypZAnjchQgooFUDQhNAy4iu08N79W4T4pMBwhPwQ==} engines: {node: '>=18'} - cpu: [ppc64] + cpu: [mips64el] os: [linux] '@esbuild/linux-ppc64@0.24.2': @@ -615,10 +609,10 @@ packages: cpu: [ppc64] os: [linux] - '@esbuild/linux-riscv64@0.23.1': - resolution: {integrity: sha512-5AV4Pzp80fhHL83JM6LoA6pTQVWgB1HovMBsLQ9OZWLDqVY8MVobBXNSmAJi//Csh6tcY7e7Lny2Hg1tElMjIA==} + '@esbuild/linux-ppc64@0.25.0': + resolution: {integrity: sha512-NhyOejdhRGS8Iwv+KKR2zTq2PpysF9XqY+Zk77vQHqNbo/PwZCzB5/h7VGuREZm1fixhs4Q/qWRSi5zmAiO4Fw==} engines: {node: '>=18'} - cpu: [riscv64] + cpu: [ppc64] os: [linux] '@esbuild/linux-riscv64@0.24.2': @@ -627,10 +621,10 @@ packages: cpu: [riscv64] os: [linux] - '@esbuild/linux-s390x@0.23.1': - resolution: {integrity: sha512-9ygs73tuFCe6f6m/Tb+9LtYxWR4c9yg7zjt2cYkjDbDpV/xVn+68cQxMXCjUpYwEkze2RcU/rMnfIXNRFmSoDw==} + '@esbuild/linux-riscv64@0.25.0': + resolution: {integrity: sha512-5S/rbP5OY+GHLC5qXp1y/Mx//e92L1YDqkiBbO9TQOvuFXM+iDqUNG5XopAnXoRH3FjIUDkeGcY1cgNvnXp/kA==} engines: {node: '>=18'} - cpu: [s390x] + cpu: [riscv64] os: [linux] '@esbuild/linux-s390x@0.24.2': @@ -639,10 +633,10 @@ packages: cpu: [s390x] os: [linux] - '@esbuild/linux-x64@0.23.1': - resolution: {integrity: sha512-EV6+ovTsEXCPAp58g2dD68LxoP/wK5pRvgy0J/HxPGB009omFPv3Yet0HiaqvrIrgPTBuC6wCH1LTOY91EO5hQ==} + '@esbuild/linux-s390x@0.25.0': + resolution: {integrity: sha512-XM2BFsEBz0Fw37V0zU4CXfcfuACMrppsMFKdYY2WuTS3yi8O1nFOhil/xhKTmE1nPmVyvQJjJivgDT+xh8pXJA==} engines: {node: '>=18'} - cpu: [x64] + cpu: [s390x] os: [linux] '@esbuild/linux-x64@0.24.2': @@ -651,16 +645,22 @@ packages: cpu: [x64] os: [linux] + '@esbuild/linux-x64@0.25.0': + resolution: {integrity: sha512-9yl91rHw/cpwMCNytUDxwj2XjFpxML0y9HAOH9pNVQDpQrBxHy01Dx+vaMu0N1CKa/RzBD2hB4u//nfc+Sd3Cw==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + '@esbuild/netbsd-arm64@0.24.2': resolution: {integrity: sha512-wuLK/VztRRpMt9zyHSazyCVdCXlpHkKm34WUyinD2lzK07FAHTq0KQvZZlXikNWkDGoT6x3TD51jKQ7gMVpopw==} engines: {node: '>=18'} cpu: [arm64] os: [netbsd] - '@esbuild/netbsd-x64@0.23.1': - resolution: {integrity: sha512-aevEkCNu7KlPRpYLjwmdcuNz6bDFiE7Z8XC4CPqExjTvrHugh28QzUXVOZtiYghciKUacNktqxdpymplil1beA==} + '@esbuild/netbsd-arm64@0.25.0': + resolution: {integrity: sha512-RuG4PSMPFfrkH6UwCAqBzauBWTygTvb1nxWasEJooGSJ/NwRw7b2HOwyRTQIU97Hq37l3npXoZGYMy3b3xYvPw==} engines: {node: '>=18'} - cpu: [x64] + cpu: [arm64] os: [netbsd] '@esbuild/netbsd-x64@0.24.2': @@ -669,11 +669,11 @@ packages: cpu: [x64] os: [netbsd] - '@esbuild/openbsd-arm64@0.23.1': - resolution: {integrity: sha512-3x37szhLexNA4bXhLrCC/LImN/YtWis6WXr1VESlfVtVeoFJBRINPJ3f0a/6LV8zpikqoUg4hyXw0sFBt5Cr+Q==} + '@esbuild/netbsd-x64@0.25.0': + resolution: {integrity: sha512-jl+qisSB5jk01N5f7sPCsBENCOlPiS/xptD5yxOx2oqQfyourJwIKLRA2yqWdifj3owQZCL2sn6o08dBzZGQzA==} engines: {node: '>=18'} - cpu: [arm64] - os: [openbsd] + cpu: [x64] + os: [netbsd] '@esbuild/openbsd-arm64@0.24.2': resolution: {integrity: sha512-YQbi46SBct6iKnszhSvdluqDmxCJA+Pu280Av9WICNwQmMxV7nLRHZfjQzwbPs3jeWnuAhE9Jy0NrnJ12Oz+0A==} @@ -681,10 +681,10 @@ packages: cpu: [arm64] os: [openbsd] - '@esbuild/openbsd-x64@0.23.1': - resolution: {integrity: sha512-aY2gMmKmPhxfU+0EdnN+XNtGbjfQgwZj43k8G3fyrDM/UdZww6xrWxmDkuz2eCZchqVeABjV5BpildOrUbBTqA==} + '@esbuild/openbsd-arm64@0.25.0': + resolution: {integrity: sha512-21sUNbq2r84YE+SJDfaQRvdgznTD8Xc0oc3p3iW/a1EVWeNj/SdUCbm5U0itZPQYRuRTW20fPMWMpcrciH2EJw==} engines: {node: '>=18'} - cpu: [x64] + cpu: [arm64] os: [openbsd] '@esbuild/openbsd-x64@0.24.2': @@ -693,11 +693,11 @@ packages: cpu: [x64] os: [openbsd] - '@esbuild/sunos-x64@0.23.1': - resolution: {integrity: sha512-RBRT2gqEl0IKQABT4XTj78tpk9v7ehp+mazn2HbUeZl1YMdaGAQqhapjGTCe7uw7y0frDi4gS0uHzhvpFuI1sA==} + '@esbuild/openbsd-x64@0.25.0': + resolution: {integrity: sha512-2gwwriSMPcCFRlPlKx3zLQhfN/2WjJ2NSlg5TKLQOJdV0mSxIcYNTMhk3H3ulL/cak+Xj0lY1Ym9ysDV1igceg==} engines: {node: '>=18'} cpu: [x64] - os: [sunos] + os: [openbsd] '@esbuild/sunos-x64@0.24.2': resolution: {integrity: sha512-hTdsW27jcktEvpwNHJU4ZwWFGkz2zRJUz8pvddmXPtXDzVKTTINmlmga3ZzwcuMpUvLw7JkLy9QLKyGpD2Yxig==} @@ -705,11 +705,11 @@ packages: cpu: [x64] os: [sunos] - '@esbuild/win32-arm64@0.23.1': - resolution: {integrity: sha512-4O+gPR5rEBe2FpKOVyiJ7wNDPA8nGzDuJ6gN4okSA1gEOYZ67N8JPk58tkWtdtPeLz7lBnY6I5L3jdsr3S+A6A==} + '@esbuild/sunos-x64@0.25.0': + resolution: {integrity: sha512-bxI7ThgLzPrPz484/S9jLlvUAHYMzy6I0XiU1ZMeAEOBcS0VePBFxh1JjTQt3Xiat5b6Oh4x7UC7IwKQKIJRIg==} engines: {node: '>=18'} - cpu: [arm64] - os: [win32] + cpu: [x64] + os: [sunos] '@esbuild/win32-arm64@0.24.2': resolution: {integrity: sha512-LihEQ2BBKVFLOC9ZItT9iFprsE9tqjDjnbulhHoFxYQtQfai7qfluVODIYxt1PgdoyQkz23+01rzwNwYfutxUQ==} @@ -717,10 +717,10 @@ packages: cpu: [arm64] os: [win32] - '@esbuild/win32-ia32@0.23.1': - resolution: {integrity: sha512-BcaL0Vn6QwCwre3Y717nVHZbAa4UBEigzFm6VdsVdT/MbZ38xoj1X9HPkZhbmaBGUD1W8vxAfffbDe8bA6AKnQ==} + '@esbuild/win32-arm64@0.25.0': + resolution: {integrity: sha512-ZUAc2YK6JW89xTbXvftxdnYy3m4iHIkDtK3CLce8wg8M2L+YZhIvO1DKpxrd0Yr59AeNNkTiic9YLf6FTtXWMw==} engines: {node: '>=18'} - cpu: [ia32] + cpu: [arm64] os: [win32] '@esbuild/win32-ia32@0.24.2': @@ -729,10 +729,10 @@ packages: cpu: [ia32] os: [win32] - '@esbuild/win32-x64@0.23.1': - resolution: {integrity: sha512-BHpFFeslkWrXWyUPnbKm+xYYVYruCinGcftSBaa8zoF9hZO4BcSCFUvHVTtzpIY6YzUnYtuEhZ+C9iEXjxnasg==} + '@esbuild/win32-ia32@0.25.0': + resolution: {integrity: sha512-eSNxISBu8XweVEWG31/JzjkIGbGIJN/TrRoiSVZwZ6pkC6VX4Im/WV2cz559/TXLcYbcrDN8JtKgd9DJVIo8GA==} engines: {node: '>=18'} - cpu: [x64] + cpu: [ia32] os: [win32] '@esbuild/win32-x64@0.24.2': @@ -741,6 +741,12 @@ packages: cpu: [x64] os: [win32] + '@esbuild/win32-x64@0.25.0': + resolution: {integrity: sha512-ZENoHJBxA20C2zFzh6AI4fT6RraMzjYw4xKWemRTRmRVtN9c5DcH9r/f2ihEkMjOW5eGgrwCslG/+Y/3bL+DHQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + '@eslint-community/eslint-utils@4.4.1': resolution: {integrity: sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -755,10 +761,6 @@ packages: resolution: {integrity: sha512-GNKqxfHG2ySmJOBSHg7LxeUx4xpuCoFjacmlCoYWEbaPXLwvfIjixRI12xCQZeULksQb23uiA8F40w5TojpV7w==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/core@0.10.0': - resolution: {integrity: sha512-gFHJ+xBOo4G3WRlR1e/3G8A6/KZAH6zcE/hkLRCZTi/B9avAG365QhFA8uOGzTMqgTghpn7/fSnscW++dpMSAw==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/core@0.11.0': resolution: {integrity: sha512-DWUB2pksgNEb6Bz2fggIy1wh6fGgZP4Xyy/Mt0QZPiloKKXerbqq9D3SBQTlCRYOrcRPu4vuz+CGjwdfqxnoWA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -775,8 +777,8 @@ packages: resolution: {integrity: sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/plugin-kit@0.2.5': - resolution: {integrity: sha512-lB05FkqEdUg2AA0xEbUz0SnkXT1LcCTa438W4IWTUh4hdOnVbQyOJ81OrDXsJk/LSiJHubgGEFoR5EHq1NsH1A==} + '@eslint/plugin-kit@0.2.6': + resolution: {integrity: sha512-+0TjwR1eAUdZtvv/ir1mGX+v0tUoR3VEPB8Up0LLJC+whRW0GgBBtpbOkg/a/U4Dxa6l5a3l9AJ1aWIQVyoWJA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@fastify/ajv-compiler@4.0.2': @@ -818,8 +820,8 @@ packages: '@floating-ui/utils@0.2.9': resolution: {integrity: sha512-MDWhGtE+eHw5JW7lq4qhc5yRLS11ERl1c7Z6Xd0a58DozHES6EnNNwUWbMiG4J9Cgj053Bhk8zvlhFYKVhULwg==} - '@formatjs/intl-localematcher@0.5.10': - resolution: {integrity: sha512-af3qATX+m4Rnd9+wHcjJ4w2ijq+rAVP3CCinJQvFv1kgSu1W6jypUmvleJxcewdxmutM8dmIRZFxO/IQBZmP2Q==} + '@formatjs/intl-localematcher@0.6.0': + resolution: {integrity: sha512-4rB4g+3hESy1bHSBG3tDFaMY2CH67iT7yne1e+0CLTsGLDcmoEWWpJjjpWVaYgYfYuohIRuo0E+N536gd2ZHZA==} '@headlessui/react@2.2.0': resolution: {integrity: sha512-RzCEg+LXsuI7mHiSomsu/gBJSjpupm6A1qIZ5sWjd7JhARNlMiSA4kKfJpCKwU9tE+zMRterhhrP74PvfJrpXQ==} @@ -844,8 +846,8 @@ packages: resolution: {integrity: sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==} engines: {node: '>=18.18'} - '@humanwhocodes/retry@0.4.1': - resolution: {integrity: sha512-c7hNEllBlenFTHBky65mhq8WD2kbN9Q6gk0bTk8lSBvc554jpXSkST1iePudpt7+A/AQvuHs9EMqjHDXMY1lrA==} + '@humanwhocodes/retry@0.4.2': + resolution: {integrity: sha512-xeO57FpIu4p1Ri3Jq/EXq4ClRm86dVF2z/+kvFnyqVYRavTZmaFaUBbWCOuuTh0o/g7DSsk6kc2vrS4Vl5oPOQ==} engines: {node: '>=18.18'} '@iconify/types@2.0.0': @@ -1087,8 +1089,8 @@ packages: '@next/env@15.1.6': resolution: {integrity: sha512-d9AFQVPEYNr+aqokIiPLNK/MTyt3DWa/dpKveiAaVccUadFbhFEvY6FXYX2LJO2Hv7PHnLBu2oWwB4uBuHjr/w==} - '@next/eslint-plugin-next@15.1.6': - resolution: {integrity: sha512-+slMxhTgILUntZDGNgsKEYHUvpn72WP1YTlkmEhS51vnVd7S9jEEy0n9YAMcI21vUG4akTw9voWH02lrClt/yw==} + '@next/eslint-plugin-next@15.1.7': + resolution: {integrity: sha512-kRP7RjSxfTO13NE317ek3mSGzoZlI33nc/i5hs1KaWpK+egs85xg0DJ4p32QEiHnR0mVjuUfhRIun7awqfL7pQ==} '@next/swc-darwin-arm64@14.2.15': resolution: {integrity: sha512-Rvh7KU9hOUBnZ9TJ28n2Oa7dD9cvDBKua9IKx7cfQQ0GoYUwg9ig31O2oMwH3wm+pE3IkAQ67ZobPfEgurPZIA==} @@ -1319,124 +1321,124 @@ packages: peerDependencies: '@redis/client': ^1.0.0 - '@rollup/rollup-android-arm-eabi@4.34.6': - resolution: {integrity: sha512-+GcCXtOQoWuC7hhX1P00LqjjIiS/iOouHXhMdiDSnq/1DGTox4SpUvO52Xm+div6+106r+TcvOeo/cxvyEyTgg==} + '@rollup/rollup-android-arm-eabi@4.34.8': + resolution: {integrity: sha512-q217OSE8DTp8AFHuNHXo0Y86e1wtlfVrXiAlwkIvGRQv9zbc6mE3sjIVfwI8sYUyNxwOg0j/Vm1RKM04JcWLJw==} cpu: [arm] os: [android] - '@rollup/rollup-android-arm64@4.34.6': - resolution: {integrity: sha512-E8+2qCIjciYUnCa1AiVF1BkRgqIGW9KzJeesQqVfyRITGQN+dFuoivO0hnro1DjT74wXLRZ7QF8MIbz+luGaJA==} + '@rollup/rollup-android-arm64@4.34.8': + resolution: {integrity: sha512-Gigjz7mNWaOL9wCggvoK3jEIUUbGul656opstjaUSGC3eT0BM7PofdAJaBfPFWWkXNVAXbaQtC99OCg4sJv70Q==} cpu: [arm64] os: [android] - '@rollup/rollup-darwin-arm64@4.34.6': - resolution: {integrity: sha512-z9Ib+OzqN3DZEjX7PDQMHEhtF+t6Mi2z/ueChQPLS/qUMKY7Ybn5A2ggFoKRNRh1q1T03YTQfBTQCJZiepESAg==} + '@rollup/rollup-darwin-arm64@4.34.8': + resolution: {integrity: sha512-02rVdZ5tgdUNRxIUrFdcMBZQoaPMrxtwSb+/hOfBdqkatYHR3lZ2A2EGyHq2sGOd0Owk80oV3snlDASC24He3Q==} cpu: [arm64] os: [darwin] - '@rollup/rollup-darwin-x64@4.34.6': - resolution: {integrity: sha512-PShKVY4u0FDAR7jskyFIYVyHEPCPnIQY8s5OcXkdU8mz3Y7eXDJPdyM/ZWjkYdR2m0izD9HHWA8sGcXn+Qrsyg==} + '@rollup/rollup-darwin-x64@4.34.8': + resolution: {integrity: sha512-qIP/elwR/tq/dYRx3lgwK31jkZvMiD6qUtOycLhTzCvrjbZ3LjQnEM9rNhSGpbLXVJYQ3rq39A6Re0h9tU2ynw==} cpu: [x64] os: [darwin] - '@rollup/rollup-freebsd-arm64@4.34.6': - resolution: {integrity: sha512-YSwyOqlDAdKqs0iKuqvRHLN4SrD2TiswfoLfvYXseKbL47ht1grQpq46MSiQAx6rQEN8o8URtpXARCpqabqxGQ==} + '@rollup/rollup-freebsd-arm64@4.34.8': + resolution: {integrity: sha512-IQNVXL9iY6NniYbTaOKdrlVP3XIqazBgJOVkddzJlqnCpRi/yAeSOa8PLcECFSQochzqApIOE1GHNu3pCz+BDA==} cpu: [arm64] os: [freebsd] - '@rollup/rollup-freebsd-x64@4.34.6': - resolution: {integrity: sha512-HEP4CgPAY1RxXwwL5sPFv6BBM3tVeLnshF03HMhJYCNc6kvSqBgTMmsEjb72RkZBAWIqiPUyF1JpEBv5XT9wKQ==} + '@rollup/rollup-freebsd-x64@4.34.8': + resolution: {integrity: sha512-TYXcHghgnCqYFiE3FT5QwXtOZqDj5GmaFNTNt3jNC+vh22dc/ukG2cG+pi75QO4kACohZzidsq7yKTKwq/Jq7Q==} cpu: [x64] os: [freebsd] - '@rollup/rollup-linux-arm-gnueabihf@4.34.6': - resolution: {integrity: sha512-88fSzjC5xeH9S2Vg3rPgXJULkHcLYMkh8faix8DX4h4TIAL65ekwuQMA/g2CXq8W+NJC43V6fUpYZNjaX3+IIg==} + '@rollup/rollup-linux-arm-gnueabihf@4.34.8': + resolution: {integrity: sha512-A4iphFGNkWRd+5m3VIGuqHnG3MVnqKe7Al57u9mwgbyZ2/xF9Jio72MaY7xxh+Y87VAHmGQr73qoKL9HPbXj1g==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm-musleabihf@4.34.6': - resolution: {integrity: sha512-wM4ztnutBqYFyvNeR7Av+reWI/enK9tDOTKNF+6Kk2Q96k9bwhDDOlnCUNRPvromlVXo04riSliMBs/Z7RteEg==} + '@rollup/rollup-linux-arm-musleabihf@4.34.8': + resolution: {integrity: sha512-S0lqKLfTm5u+QTxlFiAnb2J/2dgQqRy/XvziPtDd1rKZFXHTyYLoVL58M/XFwDI01AQCDIevGLbQrMAtdyanpA==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm64-gnu@4.34.6': - resolution: {integrity: sha512-9RyprECbRa9zEjXLtvvshhw4CMrRa3K+0wcp3KME0zmBe1ILmvcVHnypZ/aIDXpRyfhSYSuN4EPdCCj5Du8FIA==} + '@rollup/rollup-linux-arm64-gnu@4.34.8': + resolution: {integrity: sha512-jpz9YOuPiSkL4G4pqKrus0pn9aYwpImGkosRKwNi+sJSkz+WU3anZe6hi73StLOQdfXYXC7hUfsQlTnjMd3s1A==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-arm64-musl@4.34.6': - resolution: {integrity: sha512-qTmklhCTyaJSB05S+iSovfo++EwnIEZxHkzv5dep4qoszUMX5Ca4WM4zAVUMbfdviLgCSQOu5oU8YoGk1s6M9Q==} + '@rollup/rollup-linux-arm64-musl@4.34.8': + resolution: {integrity: sha512-KdSfaROOUJXgTVxJNAZ3KwkRc5nggDk+06P6lgi1HLv1hskgvxHUKZ4xtwHkVYJ1Rep4GNo+uEfycCRRxht7+Q==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-loongarch64-gnu@4.34.6': - resolution: {integrity: sha512-4Qmkaps9yqmpjY5pvpkfOerYgKNUGzQpFxV6rnS7c/JfYbDSU0y6WpbbredB5cCpLFGJEqYX40WUmxMkwhWCjw==} + '@rollup/rollup-linux-loongarch64-gnu@4.34.8': + resolution: {integrity: sha512-NyF4gcxwkMFRjgXBM6g2lkT58OWztZvw5KkV2K0qqSnUEqCVcqdh2jN4gQrTn/YUpAcNKyFHfoOZEer9nwo6uQ==} cpu: [loong64] os: [linux] - '@rollup/rollup-linux-powerpc64le-gnu@4.34.6': - resolution: {integrity: sha512-Zsrtux3PuaxuBTX/zHdLaFmcofWGzaWW1scwLU3ZbW/X+hSsFbz9wDIp6XvnT7pzYRl9MezWqEqKy7ssmDEnuQ==} + '@rollup/rollup-linux-powerpc64le-gnu@4.34.8': + resolution: {integrity: sha512-LMJc999GkhGvktHU85zNTDImZVUCJ1z/MbAJTnviiWmmjyckP5aQsHtcujMjpNdMZPT2rQEDBlJfubhs3jsMfw==} cpu: [ppc64] os: [linux] - '@rollup/rollup-linux-riscv64-gnu@4.34.6': - resolution: {integrity: sha512-aK+Zp+CRM55iPrlyKiU3/zyhgzWBxLVrw2mwiQSYJRobCURb781+XstzvA8Gkjg/hbdQFuDw44aUOxVQFycrAg==} + '@rollup/rollup-linux-riscv64-gnu@4.34.8': + resolution: {integrity: sha512-xAQCAHPj8nJq1PI3z8CIZzXuXCstquz7cIOL73HHdXiRcKk8Ywwqtx2wrIy23EcTn4aZ2fLJNBB8d0tQENPCmw==} cpu: [riscv64] os: [linux] - '@rollup/rollup-linux-s390x-gnu@4.34.6': - resolution: {integrity: sha512-WoKLVrY9ogmaYPXwTH326+ErlCIgMmsoRSx6bO+l68YgJnlOXhygDYSZe/qbUJCSiCiZAQ+tKm88NcWuUXqOzw==} + '@rollup/rollup-linux-s390x-gnu@4.34.8': + resolution: {integrity: sha512-DdePVk1NDEuc3fOe3dPPTb+rjMtuFw89gw6gVWxQFAuEqqSdDKnrwzZHrUYdac7A7dXl9Q2Vflxpme15gUWQFA==} cpu: [s390x] os: [linux] - '@rollup/rollup-linux-x64-gnu@4.34.6': - resolution: {integrity: sha512-Sht4aFvmA4ToHd2vFzwMFaQCiYm2lDFho5rPcvPBT5pCdC+GwHG6CMch4GQfmWTQ1SwRKS0dhDYb54khSrjDWw==} + '@rollup/rollup-linux-x64-gnu@4.34.8': + resolution: {integrity: sha512-8y7ED8gjxITUltTUEJLQdgpbPh1sUQ0kMTmufRF/Ns5tI9TNMNlhWtmPKKHCU0SilX+3MJkZ0zERYYGIVBYHIA==} cpu: [x64] os: [linux] - '@rollup/rollup-linux-x64-musl@4.34.6': - resolution: {integrity: sha512-zmmpOQh8vXc2QITsnCiODCDGXFC8LMi64+/oPpPx5qz3pqv0s6x46ps4xoycfUiVZps5PFn1gksZzo4RGTKT+A==} + '@rollup/rollup-linux-x64-musl@4.34.8': + resolution: {integrity: sha512-SCXcP0ZpGFIe7Ge+McxY5zKxiEI5ra+GT3QRxL0pMMtxPfpyLAKleZODi1zdRHkz5/BhueUrYtYVgubqe9JBNQ==} cpu: [x64] os: [linux] - '@rollup/rollup-win32-arm64-msvc@4.34.6': - resolution: {integrity: sha512-3/q1qUsO/tLqGBaD4uXsB6coVGB3usxw3qyeVb59aArCgedSF66MPdgRStUd7vbZOsko/CgVaY5fo2vkvPLWiA==} + '@rollup/rollup-win32-arm64-msvc@4.34.8': + resolution: {integrity: sha512-YHYsgzZgFJzTRbth4h7Or0m5O74Yda+hLin0irAIobkLQFRQd1qWmnoVfwmKm9TXIZVAD0nZ+GEb2ICicLyCnQ==} cpu: [arm64] os: [win32] - '@rollup/rollup-win32-ia32-msvc@4.34.6': - resolution: {integrity: sha512-oLHxuyywc6efdKVTxvc0135zPrRdtYVjtVD5GUm55I3ODxhU/PwkQFD97z16Xzxa1Fz0AEe4W/2hzRtd+IfpOA==} + '@rollup/rollup-win32-ia32-msvc@4.34.8': + resolution: {integrity: sha512-r3NRQrXkHr4uWy5TOjTpTYojR9XmF0j/RYgKCef+Ag46FWUTltm5ziticv8LdNsDMehjJ543x/+TJAek/xBA2w==} cpu: [ia32] os: [win32] - '@rollup/rollup-win32-x64-msvc@4.34.6': - resolution: {integrity: sha512-0PVwmgzZ8+TZ9oGBmdZoQVXflbvuwzN/HRclujpl4N/q3i+y0lqLw8n1bXA8ru3sApDjlmONaNAuYr38y1Kr9w==} + '@rollup/rollup-win32-x64-msvc@4.34.8': + resolution: {integrity: sha512-U0FaE5O1BCpZSeE6gBl3c5ObhePQSfk9vDRToMmTkbhCOgW4jqvtS5LGyQ76L1fH8sM0keRp4uDTsbjiUyjk0g==} cpu: [x64] os: [win32] - '@shikijs/core@2.3.2': - resolution: {integrity: sha512-s7vyL3LzUKm3Qwf36zRWlavX9BQMZTIq9B1almM63M5xBuSldnsTHCmsXzoF/Kyw4k7Xgas7yAyJz9VR/vcP1A==} + '@shikijs/core@2.5.0': + resolution: {integrity: sha512-uu/8RExTKtavlpH7XqnVYBrfBkUc20ngXiX9NSrBhOVZYv/7XQRKUyhtkeflY5QsxC0GbJThCerruZfsUaSldg==} - '@shikijs/engine-javascript@2.3.2': - resolution: {integrity: sha512-w3IEMu5HfL/OaJTsMbIfZ1HRPnWVYRANeDtmsdIIEgUOcLjzFJFQwlnkckGjKHekEzNqlMLbgB/twnfZ/EEAGg==} + '@shikijs/engine-javascript@2.5.0': + resolution: {integrity: sha512-VjnOpnQf8WuCEZtNUdjjwGUbtAVKuZkVQ/5cHy/tojVVRIRtlWMYVjyWhxOmIq05AlSOv72z7hRNRGVBgQOl0w==} - '@shikijs/engine-oniguruma@2.3.2': - resolution: {integrity: sha512-vikMY1TroyZXUHIXbMnvY/mjtOxMn+tavcfAeQPgWS9FHcgFSUoEtywF5B5sOLb9NXb8P2vb7odkh3nj15/00A==} + '@shikijs/engine-oniguruma@2.5.0': + resolution: {integrity: sha512-pGd1wRATzbo/uatrCIILlAdFVKdxImWJGQ5rFiB5VZi2ve5xj3Ax9jny8QvkaV93btQEwR/rSz5ERFpC5mKNIw==} - '@shikijs/langs@2.3.2': - resolution: {integrity: sha512-UqI6bSxFzhexIJficZLKeB1L2Sc3xoNiAV0yHpfbg5meck93du+EKQtsGbBv66Ki53XZPhnR/kYkOr85elIuFw==} + '@shikijs/langs@2.5.0': + resolution: {integrity: sha512-Qfrrt5OsNH5R+5tJ/3uYBBZv3SuGmnRPejV9IlIbFH3HTGLDlkqgHymAlzklVmKBjAaVmkPkyikAV/sQ1wSL+w==} - '@shikijs/themes@2.3.2': - resolution: {integrity: sha512-QAh7D/hhfYKHibkG2tti8vxNt3ekAH5EqkXJeJbTh7FGvTCWEI7BHqNCtMdjFvZ0vav5nvUgdvA7/HI7pfsB4w==} + '@shikijs/themes@2.5.0': + resolution: {integrity: sha512-wGrk+R8tJnO0VMzmUExHR+QdSaPUl/NKs+a4cQQRWyoc3YFbUzuLEi/KWK1hj+8BfHRKm2jNhhJck1dfstJpiw==} - '@shikijs/twoslash@2.3.2': - resolution: {integrity: sha512-eYLSPNKH7qWpoStesZlDix+Mdppb/VUBc7LFZyOwTvTzZ6H+DS3OMUDH0wndc6ZWYUR27cyDMtFZoBjyzxRL0A==} + '@shikijs/twoslash@2.5.0': + resolution: {integrity: sha512-OdyoZRbzTB80qHFHdaXT070OG9hiljxbsJMZmrMAPWXG2e4FV8wbC63VBM5BJXa1DH645nw20VX1MzASkO5V9g==} - '@shikijs/types@2.3.2': - resolution: {integrity: sha512-CBaMY+a3pepyC4SETi7+bSzO0f6hxEQJUUuS4uD7zppzjmrN4ZRtBqxaT+wOan26CR9eeJ5iBhc4qvWEwn7Eeg==} + '@shikijs/types@2.5.0': + resolution: {integrity: sha512-ygl5yhxki9ZLNuNpPitBWvcy9fsSKKaRuO4BAlMyagszQidxcpLAr0qiW/q43DtSIDxO6hEbtYLiFZNXO/hdGw==} - '@shikijs/vscode-textmate@10.0.1': - resolution: {integrity: sha512-fTIQwLF+Qhuws31iw7Ncl1R3HUDtGwIipiJ9iU+UsDUwMhegFcQKQHd51nZjb7CArq0MvON8rbgCGQYWHUKAdg==} + '@shikijs/vscode-textmate@10.0.2': + resolution: {integrity: sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==} '@swc/counter@0.1.3': resolution: {integrity: sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==} @@ -1599,8 +1601,8 @@ packages: '@types/node@12.20.55': resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} - '@types/node@22.13.1': - resolution: {integrity: sha512-jK8uzQlrvXqEU91UxiK5J7pKHyzgnI1Qnl0QDHIgVGuolJhRb9EEl28Cj9b3rGR8B2lhFCtvIm5os8lFnO/1Ew==} + '@types/node@22.13.4': + resolution: {integrity: sha512-ywP2X0DYtX3y08eFVx5fNIw7/uIv8hYUKgXoK8oayJlLnKcRfEYCxWMVE1XagUdVtCJlZT1AU4LXEABW+L1Peg==} '@types/prop-types@15.7.14': resolution: {integrity: sha512-gNMvNH49DJ7OJYv+KAKn0Xp45p8PLl6zo2YnvDIbTd4J6MER2BmWN49TG7n9LvkyihINxeKW8+3bfS2yDC9dzQ==} @@ -1628,51 +1630,51 @@ packages: '@types/unist@3.0.3': resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==} - '@typescript-eslint/eslint-plugin@8.23.0': - resolution: {integrity: sha512-vBz65tJgRrA1Q5gWlRfvoH+w943dq9K1p1yDBY2pc+a1nbBLZp7fB9+Hk8DaALUbzjqlMfgaqlVPT1REJdkt/w==} + '@typescript-eslint/eslint-plugin@8.24.1': + resolution: {integrity: sha512-ll1StnKtBigWIGqvYDVuDmXJHVH4zLVot1yQ4fJtLpL7qacwkxJc1T0bptqw+miBQ/QfUbhl1TcQ4accW5KUyA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: '@typescript-eslint/parser': ^8.0.0 || ^8.0.0-alpha.0 eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.8.0' - '@typescript-eslint/parser@8.23.0': - resolution: {integrity: sha512-h2lUByouOXFAlMec2mILeELUbME5SZRN/7R9Cw2RD2lRQQY08MWMM+PmVVKKJNK1aIwqTo9t/0CvOxwPbRIE2Q==} + '@typescript-eslint/parser@8.24.1': + resolution: {integrity: sha512-Tqoa05bu+t5s8CTZFaGpCH2ub3QeT9YDkXbPd3uQ4SfsLoh1/vv2GEYAioPoxCWJJNsenXlC88tRjwoHNts1oQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.8.0' - '@typescript-eslint/scope-manager@8.23.0': - resolution: {integrity: sha512-OGqo7+dXHqI7Hfm+WqkZjKjsiRtFUQHPdGMXzk5mYXhJUedO7e/Y7i8AK3MyLMgZR93TX4bIzYrfyVjLC+0VSw==} + '@typescript-eslint/scope-manager@8.24.1': + resolution: {integrity: sha512-OdQr6BNBzwRjNEXMQyaGyZzgg7wzjYKfX2ZBV3E04hUCBDv3GQCHiz9RpqdUIiVrMgJGkXm3tcEh4vFSHreS2Q==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/type-utils@8.23.0': - resolution: {integrity: sha512-iIuLdYpQWZKbiH+RkCGc6iu+VwscP5rCtQ1lyQ7TYuKLrcZoeJVpcLiG8DliXVkUxirW/PWlmS+d6yD51L9jvA==} + '@typescript-eslint/type-utils@8.24.1': + resolution: {integrity: sha512-/Do9fmNgCsQ+K4rCz0STI7lYB4phTtEXqqCAs3gZW0pnK7lWNkvWd5iW545GSmApm4AzmQXmSqXPO565B4WVrw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.8.0' - '@typescript-eslint/types@8.23.0': - resolution: {integrity: sha512-1sK4ILJbCmZOTt9k4vkoulT6/y5CHJ1qUYxqpF1K/DBAd8+ZUL4LlSCxOssuH5m4rUaaN0uS0HlVPvd45zjduQ==} + '@typescript-eslint/types@8.24.1': + resolution: {integrity: sha512-9kqJ+2DkUXiuhoiYIUvIYjGcwle8pcPpdlfkemGvTObzgmYfJ5d0Qm6jwb4NBXP9W1I5tss0VIAnWFumz3mC5A==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/typescript-estree@8.23.0': - resolution: {integrity: sha512-LcqzfipsB8RTvH8FX24W4UUFk1bl+0yTOf9ZA08XngFwMg4Kj8A+9hwz8Cr/ZS4KwHrmo9PJiLZkOt49vPnuvQ==} + '@typescript-eslint/typescript-estree@8.24.1': + resolution: {integrity: sha512-UPyy4MJ/0RE648DSKQe9g0VDSehPINiejjA6ElqnFaFIhI6ZEiZAkUI0D5MCk0bQcTf/LVqZStvQ6K4lPn/BRg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <5.8.0' - '@typescript-eslint/utils@8.23.0': - resolution: {integrity: sha512-uB/+PSo6Exu02b5ZEiVtmY6RVYO7YU5xqgzTIVZwTHvvK3HsL8tZZHFaTLFtRG3CsV4A5mhOv+NZx5BlhXPyIA==} + '@typescript-eslint/utils@8.24.1': + resolution: {integrity: sha512-OOcg3PMMQx9EXspId5iktsI3eMaXVwlhC8BvNnX6B5w9a4dVgpkQZuU8Hy67TolKcl+iFWq0XX+jbDGN4xWxjQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.8.0' - '@typescript-eslint/visitor-keys@8.23.0': - resolution: {integrity: sha512-oWWhcWDLwDfu++BGTZcmXWqpwtkwb5o7fxUIGksMQQDSdPW9prsSnfIOZMlsj4vBOSrcnjIUZMiIjODgGosFhQ==} + '@typescript-eslint/visitor-keys@8.24.1': + resolution: {integrity: sha512-EwVHlp5l+2vp8CoqJm9KikPZgi3gbdZAtabKT9KPShGeOcJhsv4Zdo3oc8T8I0uKEmYoU4ItyxbptjF08enaxg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@typescript/vfs@1.6.1': @@ -1908,8 +1910,8 @@ packages: resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} engines: {node: '>=8'} - call-bind-apply-helpers@1.0.1: - resolution: {integrity: sha512-BhYE+WDaywFg2TBWYNXAE+8B1ATnThNBqXHP5nQu0jWJdVvY2hvkpyB3qOmtmDePiS5/BDQ8wASEWGMWRG148g==} + call-bind-apply-helpers@1.0.2: + resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} engines: {node: '>= 0.4'} call-bind@1.0.8: @@ -1928,8 +1930,8 @@ packages: resolution: {integrity: sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw==} engines: {node: '>=14.16'} - caniuse-lite@1.0.30001698: - resolution: {integrity: sha512-xJ3km2oiG/MbNU8G6zIq6XRZ6HtAOVXsbOrP/blGazi52kc5Yy7b6sDA5O+FbROzRrV7BSTllLHuNvmawYUJjw==} + caniuse-lite@1.0.30001700: + resolution: {integrity: sha512-2S6XIXwaE7K7erT8dY+kLQcpa5ms63XlRkMkReXjle+kf6c5g38vyMl+Z5y8dSxOFDhcFe+nxnn261PLxBSQsQ==} ccount@2.0.1: resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} @@ -2450,8 +2452,9 @@ packages: resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} engines: {node: '>= 0.4'} - es-shim-unscopables@1.0.2: - resolution: {integrity: sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==} + es-shim-unscopables@1.1.0: + resolution: {integrity: sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==} + engines: {node: '>= 0.4'} es-to-primitive@1.3.0: resolution: {integrity: sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==} @@ -2463,13 +2466,13 @@ packages: esast-util-from-js@2.0.1: resolution: {integrity: sha512-8Ja+rNJ0Lt56Pcf3TAmpBZjmx8ZcK5Ts4cAzIOjsjevg9oSXJnl6SUQ2EevU8tv3h6ZLWmoKL5H4fgWvdvfETw==} - esbuild@0.23.1: - resolution: {integrity: sha512-VVNz/9Sa0bs5SELtn3f7qhJCDPCF5oMEl5cO9/SSinpE9hbPVvxbd572HH5AKiP7WD8INO53GgfDDhRjkylHEg==} + esbuild@0.24.2: + resolution: {integrity: sha512-+9egpBW8I3CD5XPe0n6BfT5fxLzxrlDzqydF3aviG+9ni1lDC/OvMHcxqEFV0+LANZG5R1bFMWfUrjVsdwxJvA==} engines: {node: '>=18'} hasBin: true - esbuild@0.24.2: - resolution: {integrity: sha512-+9egpBW8I3CD5XPe0n6BfT5fxLzxrlDzqydF3aviG+9ni1lDC/OvMHcxqEFV0+LANZG5R1bFMWfUrjVsdwxJvA==} + esbuild@0.25.0: + resolution: {integrity: sha512-BXq5mqc8ltbaN34cDqWuYKyNhX8D/Z0J1xdtdQ8UcIIIyJyz+ZMKUt58tF3SrZ85jcfN/PZYhjR5uDQAYNVbuw==} engines: {node: '>=18'} hasBin: true @@ -2504,8 +2507,8 @@ packages: peerDependencies: eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7 - eslint-plugin-turbo@2.4.0: - resolution: {integrity: sha512-qCgoRi/OTc1VMxab7+sdKiV1xlkY4qjK9sM+kS7+WogrB1DxLguJSQXvk4HA13SD5VmJsq+8FYOw5q4EUk6Ixg==} + eslint-plugin-turbo@2.4.2: + resolution: {integrity: sha512-67IZtvOFaWDnUmYMV3luRIE1kqL+ok5MxPEsIPUqH2vQggML7jmZFZx/P9jhXAoFH+pViEz5QEzDa2DBLHqzQg==} peerDependencies: eslint: '>6.6.0' turbo: '>2.0.0' @@ -2522,8 +2525,8 @@ packages: resolution: {integrity: sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - eslint@9.20.0: - resolution: {integrity: sha512-aL4F8167Hg4IvsW89ejnpTwx+B/UQRzJPGgbIOl+4XqffWsahVVsLEWoZvnrVuwpWmnRd7XeXmQI1zlKcFDteA==} + eslint@9.20.1: + resolution: {integrity: sha512-m1mM33o6dBUjxl2qb6wv6nGNwCAsns1eKtaQ4l/NPHeTvhiUPbtdfMyktxN4B3fgHIgsYh1VT3V9txblpQHq+g==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} hasBin: true peerDependencies: @@ -2708,8 +2711,8 @@ packages: resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} engines: {node: '>=16'} - flatted@3.3.2: - resolution: {integrity: sha512-AiwGJM8YcNOaobumgtng+6NHuOqC3A7MixFeDafM3X9cIUM+xUXoS5Vfgf+OihAYe20fxqNM9yPBXJzRtZ/4eA==} + flatted@3.3.3: + resolution: {integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==} follow-redirects@1.15.9: resolution: {integrity: sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==} @@ -2720,16 +2723,16 @@ packages: debug: optional: true - for-each@0.3.4: - resolution: {integrity: sha512-kKaIINnFpzW6ffJNDjjyjrk21BkDx38c0xa/klsT8VzLCaMEefv4ZTacrcVR4DmgTeBra++jMDAfS/tS799YDw==} + for-each@0.3.5: + resolution: {integrity: sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==} engines: {node: '>= 0.4'} foreground-child@3.3.0: resolution: {integrity: sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==} engines: {node: '>=14'} - form-data@4.0.1: - resolution: {integrity: sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==} + form-data@4.0.2: + resolution: {integrity: sha512-hGfm/slu0ZabnNt4oaRZ6uREyfCj6P4fT/n6A1rGV+Z0VdGXjfOhVUpkn6qVQONHGIFwmveGXyDs75+nr6FM8w==} engines: {node: '>= 6'} format@0.2.2: @@ -2832,8 +2835,12 @@ packages: resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} engines: {node: '>=18'} - globals@15.14.0: - resolution: {integrity: sha512-OkToC372DtlQeje9/zHIo5CT8lRP/FUgEOKBEhU4e0abL7J7CD24fD9ohiLN5hagG/kWCYj4K5oaxxtj2Z0Dig==} + globals@15.15.0: + resolution: {integrity: sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==} + engines: {node: '>=18'} + + globals@16.0.0: + resolution: {integrity: sha512-iInW14XItCXET01CQFqudPOWP2jYMl7T+QRQT+UNcR/iQncN/F0UNpgd76iFkBPgNQb4+X3LV9tLJYzwh+Gl3A==} engines: {node: '>=18'} globalthis@1.0.4: @@ -2893,8 +2900,8 @@ packages: hast-util-from-html@2.0.3: resolution: {integrity: sha512-CUSRHXyKjzHov8yKsQjGOElXy/3EKpyX56ELnkHH34vDVw1N1XSQ1ZcAvTyAPtGqLTuKP/uxM+aLkSPqF/EtMw==} - hast-util-from-parse5@8.0.2: - resolution: {integrity: sha512-SfMzfdAi/zAoZ1KkFEyyeXBn7u/ShQrfd675ZEE9M3qj+PMFX05xubzRyF76CCSJu8au9jgVxDV1+okFvgZU4A==} + hast-util-from-parse5@8.0.3: + resolution: {integrity: sha512-3kxEVkEKt0zvcZ3hCRYI8rqrgwtlIOFMWkbclACvjlDw8Li9S2hk/d51OI0nr/gIpdMHNepwgOKqZ/sy0Clpyg==} hast-util-is-element@3.0.0: resolution: {integrity: sha512-Val9mnv2IWpLbNPqc/pUem+a7Ipj2aHacCwgNfTiK0vJKl0LF+4Ba4+v1oPHFpf3bLYmreq0/l3Gud9S5OH42g==} @@ -2905,14 +2912,14 @@ packages: hast-util-raw@9.1.0: resolution: {integrity: sha512-Y8/SBAHkZGoNkpzqqfCldijcuUKh7/su31kEBp67cFY09Wy0mTRgtsLYsiIxMJxlu0f6AA5SUTbDR8K0rxnbUw==} - hast-util-to-estree@3.1.1: - resolution: {integrity: sha512-IWtwwmPskfSmma9RpzCappDUitC8t5jhAynHhc1m2+5trOgsrp7txscUSavc5Ic8PATyAjfrCK1wgtxh2cICVQ==} + hast-util-to-estree@3.1.2: + resolution: {integrity: sha512-94SDoKOfop5gP8RHyw4vV1aj+oChuD42g08BONGAaWFbbO6iaWUqxk7SWfGybgcVzhK16KifZr3zD2dqQgx3jQ==} - hast-util-to-html@9.0.4: - resolution: {integrity: sha512-wxQzXtdbhiwGAUKrnQJXlOPmHnEehzphwkK7aluUPQ+lEc1xefC8pblMgpp2w5ldBTEfveRIrADcrhGIWrlTDA==} + hast-util-to-html@9.0.5: + resolution: {integrity: sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw==} - hast-util-to-jsx-runtime@2.3.2: - resolution: {integrity: sha512-1ngXYb+V9UT5h+PxNRa1O1FYguZK/XL+gkeqvp7EdHlB9oHUG0eYRo/vY5inBdcqo3RkPMC58/H94HvkbfGdyg==} + hast-util-to-jsx-runtime@2.3.3: + resolution: {integrity: sha512-pdpkP8YD4v+qMKn2lnKSiJvZvb3FunDmFYQvVOsoO08+eTNWdaWKPMrC5wwNICtU3dQWHhElj5Sf5jPEnv4qJg==} hast-util-to-parse5@8.0.0: resolution: {integrity: sha512-3KKrV5ZVI8if87DVSi1vDeByYrkGzg4mEfeu4alwgmmIeARiBLKCZS2uw5Gb6nU9x9Yufyj3iudm6i7nl52PFw==} @@ -2926,8 +2933,8 @@ packages: hast-util-whitespace@3.0.0: resolution: {integrity: sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==} - hastscript@9.0.0: - resolution: {integrity: sha512-jzaLBGavEDKHrc5EfFImKN7nZKKBdSLIdGvCwDZ9TfzbF2ffXiov8CKE445L2Z1Ek2t/m4SKQ2j6Ipv7NyUolw==} + hastscript@9.0.1: + resolution: {integrity: sha512-g7df9rMFX/SPi34tyGCyUBREQoKkapwdY/T04Qn9TDWfHhAYt4/I0gMVirzK5wEzeUqIjEB+LXC/ypb7Aqno5w==} help-me@5.0.0: resolution: {integrity: sha512-7xgomUX6ADmcYzFik0HzAxh/73YlKR9bmFzf51CZwR+b6YtzU2m0u49hQCqV6SvlqIqsaxovfwdvbnsw3b/zpg==} @@ -2943,8 +2950,9 @@ packages: resolution: {integrity: sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==} engines: {node: '>= 14'} - human-id@1.0.2: - resolution: {integrity: sha512-UNopramDEhHJD+VR+ehk8rOslwSfByxPIZyJRfV739NDhN5LF1fa1MqnzKm2lGTQRjNrjK19Q5fhkgIfjlVUKw==} + human-id@4.1.1: + resolution: {integrity: sha512-3gKm/gCSUipeLsRYZbbdA1BD83lBoWUkZ7G9VFrhWPAU76KwYo5KR8V28bpoPm/ygy0x5/GCbpRQdY7VLYCoIg==} + hasBin: true human-signals@2.1.0: resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} @@ -3263,8 +3271,8 @@ packages: resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} engines: {node: '>= 0.8.0'} - light-my-request@6.5.1: - resolution: {integrity: sha512-0q82RyxIextuDtkA0UDofhPHIiQ2kmpa7fwElCSlm/8nQl36cDU1Cw+CAO90Es0lReH2HChClKL84I86Nc52hg==} + light-my-request@6.6.0: + resolution: {integrity: sha512-CHYbu8RtboSIoVsHZ6Ye4cj4Aw/yg2oAFimlF7mNvfDV192LR7nDiKtSIfCuLT7KokPSTn/9kfVLm5OGN0A28A==} lilconfig@3.1.3: resolution: {integrity: sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==} @@ -3353,8 +3361,8 @@ packages: mdast-util-gfm-autolink-literal@2.0.1: resolution: {integrity: sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ==} - mdast-util-gfm-footnote@2.0.0: - resolution: {integrity: sha512-5jOT2boTSVkMnQ7LTrd6n/18kqwjmuYqo7JUPe+tRCY6O7dAuTFMtTPauYYrMPpox9hlN0uOx/FL8XvEfG9/mQ==} + mdast-util-gfm-footnote@2.1.0: + resolution: {integrity: sha512-sqpDWlsHn7Ac9GNZQMeUzPQSMzR6Wv0WKRNvQRg0KqHh02fpTz69Qc1QSseNX29bhz1ROIyNyxExfawVKTm1GQ==} mdast-util-gfm-strikethrough@2.0.0: resolution: {integrity: sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==} @@ -3365,8 +3373,8 @@ packages: mdast-util-gfm-task-list-item@2.0.0: resolution: {integrity: sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==} - mdast-util-gfm@3.0.0: - resolution: {integrity: sha512-dgQEX5Amaq+DuUqf26jJqSK9qgixgd6rYDHAv4aTBuA92cTknZlKpPfa86Z/s8Dj8xsAQpFfBmPUHWJBWqS4Bw==} + mdast-util-gfm@3.1.0: + resolution: {integrity: sha512-0ulfdQOM3ysHhCJ1p06l0b0VKlhU0wuQs3thxZQagjcjPrlFRqY215uZGHHJan9GEAXd9MbfPjFJz+qMkVR6zQ==} mdast-util-math@3.0.0: resolution: {integrity: sha512-Tl9GBNeG/AhJnQM221bJR2HPvLOSnLE/T9cJI9tlc6zwQk2nPk/4f0cHkOdEixQPC/j8UtKDdITswvLAy1OZ1w==} @@ -3665,16 +3673,16 @@ packages: sass: optional: true - nextra-theme-docs@4.2.4: - resolution: {integrity: sha512-8xXn88EkIg9CLP/O+xcrze1fZFg3kzT2DW6auZYGbR+fruMbGAXcsqntJ+vOdbBPx/z4KjWMt6mWPiI5Whtrvw==} + nextra-theme-docs@4.2.13: + resolution: {integrity: sha512-PO+ltZFtKXe2Jt4hgdJi5JahQHOjt2qmz5wVSfhS+PZDMAuFCa0UubBvkCyQDF3YdKjUI2gJ8CW0fGw84yeseQ==} peerDependencies: next: '>=14' - nextra: 4.2.4 + nextra: 4.2.13 react: '>=18' react-dom: '>=18' - nextra@4.2.4: - resolution: {integrity: sha512-pB91o5jrgcIkkot79GbTtfg9qZtLtzzMJRzbeqeL+HSVGLFhj2urEAOPzpc47emvdmEjjNLyB7LQ8BcBZvrlxg==} + nextra@4.2.13: + resolution: {integrity: sha512-ZjcIuDXaZoMn8s11iXGCp0UHTYZp3xCS6JFZbyj8Fh+RIKh9ZZlD+e6YlmXkA7t71PVjDWoF5URwMW/r7dYNjQ==} engines: {node: '>=18'} peerDependencies: next: '>=14' @@ -3751,8 +3759,8 @@ packages: resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} engines: {node: '>=12'} - oniguruma-to-es@3.1.0: - resolution: {integrity: sha512-BJ3Jy22YlgejHSO7Fvmz1kKazlaPmRSUH+4adTDUS/dKQ4wLxI+gALZ8updbaux7/m7fIlpgOZ5fp/Inq5jUAw==} + oniguruma-to-es@3.1.1: + resolution: {integrity: sha512-bUH8SDvPkH3ho3dvwJwfonjlQ4R80vjyvrU8YpxuROddv55vAEJrTuCuCVUhhsHbtlD9tGGbaNApGQckXhS8iQ==} optionator@0.9.4: resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} @@ -3797,8 +3805,8 @@ packages: resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} engines: {node: '>=6'} - pac-proxy-agent@7.1.0: - resolution: {integrity: sha512-Z5FnLVVZSnX7WjBg0mhDtydeRZ1xMcATZThjySQUHqr+0ksP8kqaw23fNKkaaN/Z8gwLUs/W7xdl0I75eP2Xyw==} + pac-proxy-agent@7.2.0: + resolution: {integrity: sha512-TEB8ESquiLMc0lV8vcd5Ql/JAKAoyzHFXaStwjkzpOpC5Yv+pIzLfHvjTSdf3vpa2bMiUQrg9i6276yn8666aA==} engines: {node: '>= 14'} pac-resolver@7.0.1: @@ -3866,8 +3874,8 @@ packages: resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} engines: {node: '>=8'} - pathe@2.0.2: - resolution: {integrity: sha512-15Ztpk+nov8DR524R4BF7uEuzESgzUEAV4Ah7CUMNGXdE5ELuvxElxGXndBl32vMSsWa1jpNf22Z+Er3sKwq+w==} + pathe@2.0.3: + resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} picocolors@1.1.1: resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} @@ -3995,8 +4003,8 @@ packages: engines: {node: '>=10.13.0'} hasBin: true - prettier@3.4.2: - resolution: {integrity: sha512-e9MewbtFo+Fevyuxn/4rrcDAaq0IYxPGLvObpQjiZBMAzB9IGmzlnG9RZy3FFas+eBMu2vA0CszMeduow5dIuQ==} + prettier@3.5.1: + resolution: {integrity: sha512-hPpFQvHwL3Qv5AdRvBFMhnKo4tYxp0ReXiPn2bxkiohEX6mBeBwEpBSQTkD458RaaDKQMYSp4hX4UtfUTA5wDw==} engines: {node: '>=14'} hasBin: true @@ -4012,6 +4020,9 @@ packages: property-information@6.5.0: resolution: {integrity: sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig==} + property-information@7.0.0: + resolution: {integrity: sha512-7D/qOz/+Y4X/rzSB6jKxKUsQnphO046ei8qxG59mtM3RG3DHgTK81HrxrmoDVINJb8NKT5ZsRbwHvQ6B68Iyhg==} + proxy-agent@6.3.1: resolution: {integrity: sha512-Rb5RVBy1iyqOtNl15Cw/llpeLH8bsb37gM1FUfKQ+Wck6xHlbAhWGUFiTRHtkjqGTA5pSHz6+0hrPW/oECihPQ==} engines: {node: '>= 14'} @@ -4058,8 +4069,8 @@ packages: react-is@16.13.1: resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} - react-medium-image-zoom@5.2.13: - resolution: {integrity: sha512-KcBL4OsoUQJgIFh6vQgt/6sRGqDy6bQBcsbhGD2tsy4B5Pw3dWrboocVOyIm76RRALEZ6Qwp3EDvIvfEv0m5sg==} + react-medium-image-zoom@5.2.14: + resolution: {integrity: sha512-nfTVYcAUnBzXQpPDcZL+cG/e6UceYUIG+zDcnemL7jtAqbJjVVkA85RgneGtJeni12dTyiRPZVM6Szkmwd/o8w==} 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 @@ -4084,8 +4095,8 @@ packages: resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} engines: {node: '>=8.10.0'} - readdirp@4.1.1: - resolution: {integrity: sha512-h80JrZu/MHUZCyHu5ciuoI0+WxsCxzxJTILn6Fs8rxSnFPh+UVHYfeIxK1nVGugMqkfC4vJcBOYbkfkwYK0+gw==} + readdirp@4.1.2: + resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==} engines: {node: '>= 14.18.0'} reading-time@1.5.0: @@ -4158,8 +4169,8 @@ packages: remark-frontmatter@5.0.0: resolution: {integrity: sha512-XTFYvNASMe5iPN0719nPrdItC9aU0ssC4v14mH1BCi1u0n1gAocqcujWUrByftZTbLhRtiKRyjYTSIOcr69UVQ==} - remark-gfm@4.0.0: - resolution: {integrity: sha512-U92vJgBPkbw4Zfu/IiW2oTZLSL3Zpv+uI7My2eq8JxKgqraFdU8YUGicEJCEgSbeaG+QDFqIcwwfMTOEelPxuA==} + remark-gfm@4.0.1: + resolution: {integrity: sha512-1quofZ2RQ9EWdeN34S79+KExV1764+wCUGop5CPL1WGdD0ocPpu91lzPGbwWMECpEpd42kJGQwzRfyov9j4yNg==} remark-math@6.0.0: resolution: {integrity: sha512-MMqgnP74Igy+S3WwnhQ7kqGlEerTETXMvJhrUzDikVZ2/uogJCb+WHUg97hK9/jcfc0dkD73s3LN8zU49cTEtA==} @@ -4237,8 +4248,8 @@ packages: robust-predicates@3.0.2: resolution: {integrity: sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg==} - rollup@4.34.6: - resolution: {integrity: sha512-wc2cBWqJgkU3Iz5oztRkQbfVkbxoz5EhnCGOrnJvnLnQ7O0WhQUYyv18qQI79O8L7DdHrrlJNeCHd4VGpnaXKQ==} + rollup@4.34.8: + resolution: {integrity: sha512-489gTVMzAYdiZHFVA/ig/iYFllCcWFHMvUHI1rpFmkoUtRlQxqh6/yiNqnYibjMZ2b/+FUQwldG+aLsEt6bglQ==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true @@ -4349,8 +4360,8 @@ packages: resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} engines: {node: '>=8'} - shiki@2.3.2: - resolution: {integrity: sha512-UZhz/gsUz7DHFbQBOJP7eXqvKyYvMGramxQiSDc83M/7OkWm6OdVHAReEc3vMLh6L6TRhgL9dvhXz9XDkCDaaw==} + shiki@2.5.0: + resolution: {integrity: sha512-mI//trrsaiCIPsja5CNfsyNOqgAZUb6VpJA+340toL42UpzQlXpwRV9nch69X6gaUxrr9kaOOa6e3y3uAkGFxQ==} shimmer@1.2.1: resolution: {integrity: sha512-sQTKC1Re/rM6XyFM6fIAGHRPVGvyXfgzIDvzoq608vM+jeyVD0Tu1E6Np0Kc2zAIFWIj963V2800iF/9LPieQw==} @@ -4397,8 +4408,8 @@ packages: resolution: {integrity: sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw==} engines: {node: '>= 14'} - socks@2.8.3: - resolution: {integrity: sha512-l5x7VUUWbjVFbafGLxPWkYsHIhEvmF85tbIeFZWc8ZPtoMyybuEhL7Jye/ooC4/d48FgOjSJXgsF/AJPYCW8Zw==} + socks@2.8.4: + resolution: {integrity: sha512-D3YaD0aRxR3mEcqnidIs7ReYJFVzWdd6fXJYUM8ixcQcJRGTka/b3saV0KflYhyVJXKhb947GndU35SxYNResQ==} engines: {node: '>= 10.0.0', npm: '>= 3.0.0'} sonic-boom@4.2.0: @@ -4594,8 +4605,8 @@ packages: tinyexec@0.3.2: resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==} - tinyglobby@0.2.10: - resolution: {integrity: sha512-Zc+8eJlFMvgatPZTl6A9L/yht8QqdmUNtURHaKZLmKBE12hNPSrqNkUp2cs3M/UKmNVVAMFQYSjYIVHDjW5zew==} + tinyglobby@0.2.12: + resolution: {integrity: sha512-qkf4trmKSIiMTs/E63cxH+ojC2unam7rJ0WrauAzpT3ECNTxGRMlaXxVbfxMUC/w0LaYk6jQ4y/nGR9uBO3tww==} engines: {node: '>=12.0.0'} title@4.0.1: @@ -4665,43 +4676,43 @@ packages: typescript: optional: true - tsx@4.19.2: - resolution: {integrity: sha512-pOUl6Vo2LUq/bSa8S5q7b91cgNSjctn9ugq/+Mvow99qW6x/UZYwzxy/3NmqoT66eHYfCVvFvACC58UBPFf28g==} + tsx@4.19.3: + resolution: {integrity: sha512-4H8vUNGNjQ4V2EOoGw005+c+dGuPSnhpPBPHBtsZdGZBk/iJb4kguGlPWaZTZ3q5nMtFOEsY0nRDlh9PJyd6SQ==} engines: {node: '>=18.0.0'} hasBin: true - turbo-darwin-64@2.4.0: - resolution: {integrity: sha512-kVMScnPUa3R4n7woNmkR15kOY0aUwCLJcUyH5UC59ggKqr5HIHwweKYK8N1pwBQso0LQF4I9i93hIzfJguCcwQ==} + turbo-darwin-64@2.4.2: + resolution: {integrity: sha512-HFfemyWB60CJtEvVQj9yby5rkkWw9fLAdLtAPGtPQoU3tKh8t/uzCAZKso2aPVbib9vGUuGbPGoGpaRXdVhj5g==} cpu: [x64] os: [darwin] - turbo-darwin-arm64@2.4.0: - resolution: {integrity: sha512-8JObIpfun1guA7UlFR5jC/SOVm49lRscxMxfg5jZ5ABft79rhFC+ygN9AwAhGKv6W2DUhIh2xENkSgu4EDmUyg==} + turbo-darwin-arm64@2.4.2: + resolution: {integrity: sha512-uwSx1dsBSSFeEC0nxyx2O219FEsS/haiESaWwE9JI8mHkQK61s6w6fN2G586krKxyNam4AIxRltleL+O2Em94g==} cpu: [arm64] os: [darwin] - turbo-linux-64@2.4.0: - resolution: {integrity: sha512-xWDGGcRlBuGV7HXWAVuTY6vsQi4aZxGMAnuiuNDg8Ij1aHGohOM0RUsWMXjxz4vuJmjk9+/D6NQqHH3AJEXezg==} + turbo-linux-64@2.4.2: + resolution: {integrity: sha512-Fy/uL8z/LAYcPbm7a1LwFnTY9pIi5FAi12iuHsgB7zHjdh4eeIKS2NIg4nroAmTcUTUZ0/cVTo4bDOCUcS3aKw==} cpu: [x64] os: [linux] - turbo-linux-arm64@2.4.0: - resolution: {integrity: sha512-c3En99xMguc/Pdtk/rZP53LnDdw0W6lgUc04he8r8F+UHYSNvgzHh0WGXXmCC6lGbBH72kPhhGx4bAwyvi7dug==} + turbo-linux-arm64@2.4.2: + resolution: {integrity: sha512-AEA0d8h5W/K6iiXfEgiNwWt0yqRL1NpBs8zQCLdc4/L7WeYeJW3sORWX8zt7xhutF/KW9gTm8ehKpiK6cCIsAA==} cpu: [arm64] os: [linux] - turbo-windows-64@2.4.0: - resolution: {integrity: sha512-/gOORuOlyA8JDPzyA16CD3wvyRcuBFePa1URAnFUof9hXQmKxK0VvSDO79cYZFsJSchCKNJpckUS0gYxGsWwoA==} + turbo-windows-64@2.4.2: + resolution: {integrity: sha512-CybtIZ9wRgnnNFVN9En9G+rxsO+mwU81fvW4RpE8BWyNEkhQ8J28qYf4PaimueMxGHHp/28i/G7Kcdn2GAWG0g==} cpu: [x64] os: [win32] - turbo-windows-arm64@2.4.0: - resolution: {integrity: sha512-/DJIdTFijEMM5LSiEpSfarDOMOlYqJV+EzmppqWtHqDsOLF4hbbIBH9sJR6OOp5dURAu5eURBYdmvBRz9Lo6TA==} + turbo-windows-arm64@2.4.2: + resolution: {integrity: sha512-7V0yneVPL8Y3TgrkUIjw7Odmwu1tHnyIiPHFM7eFcA7U+H6hPXyCxge7nC3wOKfjhKCQqUm+Vf/k6kjmLz5G4g==} cpu: [arm64] os: [win32] - turbo@2.4.0: - resolution: {integrity: sha512-ah/yQp2oMif1X0u7fBJ4MLMygnkbKnW5O8SG6pJvloPCpHfFoZctkSVQiJ3VnvNTq71V2JJIdwmOeu1i34OQyg==} + turbo@2.4.2: + resolution: {integrity: sha512-Qxi0ioQCxMRUCcHKHZkTnYH8e7XCpNfg9QiJcyfWIc+ZXeaCjzV5rCGlbQlTXMAtI8qgfP8fZADv3CFtPwqdPQ==} hasBin: true tv4@1.3.0: @@ -4743,8 +4754,8 @@ packages: resolution: {integrity: sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==} engines: {node: '>= 0.4'} - typescript-eslint@8.23.0: - resolution: {integrity: sha512-/LBRo3HrXr5LxmrdYSOCvoAMm7p2jNizNfbIpCgvG4HMsnoprRUOce/+8VJ9BDYWW68rqIENE/haVLWPeFZBVQ==} + typescript-eslint@8.24.1: + resolution: {integrity: sha512-cw3rEdzDqBs70TIcb0Gdzbt6h11BSs2pS0yaq7hDWDBtCCSei1pPSUXE9qUdQ/Wm9NgFg8mKtMt1b8fTHIl1jA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 @@ -4947,8 +4958,8 @@ packages: peerDependencies: zod: ^3.18.0 - zod@3.24.1: - resolution: {integrity: sha512-muH7gBL9sI1nciMZV67X5fTKKBLtwpZ5VBp1vsOQzj1MhrBZ4wlVCm3gedKZWLp0Oyel8sIGfeiz54Su+OVT+A==} + zod@3.24.2: + resolution: {integrity: sha512-lY7CDW43ECgW9u1TcT3IoXHflywfVqDYze4waEz812jR/bZ8FHDsl7pFQoSZTz5N+2NqRXs8GBwnAwo3ZNxqhQ==} zustand@5.0.3: resolution: {integrity: sha512-14fwWQtU3pH4dE0dOpdMiWjddcH+QzKIgk1cl8epwSE7yag43k/AD/m4L6+K7DytAOr9gGBe3/EXj9g7cdostg==} @@ -4978,9 +4989,9 @@ snapshots: package-manager-detector: 0.2.9 tinyexec: 0.3.2 - '@antfu/utils@8.1.0': {} + '@antfu/utils@8.1.1': {} - '@babel/runtime@7.26.7': + '@babel/runtime@7.26.9': dependencies: regenerator-runtime: 0.14.1 @@ -5021,13 +5032,13 @@ snapshots: '@braintree/sanitize-url@7.1.1': {} - '@changesets/apply-release-plan@7.0.8': + '@changesets/apply-release-plan@7.0.10': dependencies: - '@changesets/config': 3.0.5 + '@changesets/config': 3.1.1 '@changesets/get-version-range-type': 0.4.0 '@changesets/git': 3.0.2 - '@changesets/should-skip-package': 0.1.1 - '@changesets/types': 6.0.0 + '@changesets/should-skip-package': 0.1.2 + '@changesets/types': 6.1.0 '@manypkg/get-packages': 1.1.3 detect-indent: 6.1.0 fs-extra: 7.0.1 @@ -5037,35 +5048,35 @@ snapshots: resolve-from: 5.0.0 semver: 7.7.1 - '@changesets/assemble-release-plan@6.0.5': + '@changesets/assemble-release-plan@6.0.6': dependencies: '@changesets/errors': 0.2.0 - '@changesets/get-dependents-graph': 2.1.2 - '@changesets/should-skip-package': 0.1.1 - '@changesets/types': 6.0.0 + '@changesets/get-dependents-graph': 2.1.3 + '@changesets/should-skip-package': 0.1.2 + '@changesets/types': 6.1.0 '@manypkg/get-packages': 1.1.3 semver: 7.7.1 - '@changesets/changelog-git@0.2.0': + '@changesets/changelog-git@0.2.1': dependencies: - '@changesets/types': 6.0.0 + '@changesets/types': 6.1.0 - '@changesets/cli@2.27.12': + '@changesets/cli@2.28.1': dependencies: - '@changesets/apply-release-plan': 7.0.8 - '@changesets/assemble-release-plan': 6.0.5 - '@changesets/changelog-git': 0.2.0 - '@changesets/config': 3.0.5 + '@changesets/apply-release-plan': 7.0.10 + '@changesets/assemble-release-plan': 6.0.6 + '@changesets/changelog-git': 0.2.1 + '@changesets/config': 3.1.1 '@changesets/errors': 0.2.0 - '@changesets/get-dependents-graph': 2.1.2 - '@changesets/get-release-plan': 4.0.6 + '@changesets/get-dependents-graph': 2.1.3 + '@changesets/get-release-plan': 4.0.8 '@changesets/git': 3.0.2 '@changesets/logger': 0.1.1 - '@changesets/pre': 2.0.1 - '@changesets/read': 0.6.2 - '@changesets/should-skip-package': 0.1.1 - '@changesets/types': 6.0.0 - '@changesets/write': 0.3.2 + '@changesets/pre': 2.0.2 + '@changesets/read': 0.6.3 + '@changesets/should-skip-package': 0.1.2 + '@changesets/types': 6.1.0 + '@changesets/write': 0.4.0 '@manypkg/get-packages': 1.1.3 ansi-colors: 4.1.3 ci-info: 3.9.0 @@ -5081,12 +5092,12 @@ snapshots: spawndamnit: 3.0.1 term-size: 2.2.1 - '@changesets/config@3.0.5': + '@changesets/config@3.1.1': dependencies: '@changesets/errors': 0.2.0 - '@changesets/get-dependents-graph': 2.1.2 + '@changesets/get-dependents-graph': 2.1.3 '@changesets/logger': 0.1.1 - '@changesets/types': 6.0.0 + '@changesets/types': 6.1.0 '@manypkg/get-packages': 1.1.3 fs-extra: 7.0.1 micromatch: 4.0.8 @@ -5095,20 +5106,20 @@ snapshots: dependencies: extendable-error: 0.1.7 - '@changesets/get-dependents-graph@2.1.2': + '@changesets/get-dependents-graph@2.1.3': dependencies: - '@changesets/types': 6.0.0 + '@changesets/types': 6.1.0 '@manypkg/get-packages': 1.1.3 picocolors: 1.1.1 semver: 7.7.1 - '@changesets/get-release-plan@4.0.6': + '@changesets/get-release-plan@4.0.8': dependencies: - '@changesets/assemble-release-plan': 6.0.5 - '@changesets/config': 3.0.5 - '@changesets/pre': 2.0.1 - '@changesets/read': 0.6.2 - '@changesets/types': 6.0.0 + '@changesets/assemble-release-plan': 6.0.6 + '@changesets/config': 3.1.1 + '@changesets/pre': 2.0.2 + '@changesets/read': 0.6.3 + '@changesets/types': 6.1.0 '@manypkg/get-packages': 1.1.3 '@changesets/get-version-range-type@0.4.0': {} @@ -5125,42 +5136,42 @@ snapshots: dependencies: picocolors: 1.1.1 - '@changesets/parse@0.4.0': + '@changesets/parse@0.4.1': dependencies: - '@changesets/types': 6.0.0 + '@changesets/types': 6.1.0 js-yaml: 3.14.1 - '@changesets/pre@2.0.1': + '@changesets/pre@2.0.2': dependencies: '@changesets/errors': 0.2.0 - '@changesets/types': 6.0.0 + '@changesets/types': 6.1.0 '@manypkg/get-packages': 1.1.3 fs-extra: 7.0.1 - '@changesets/read@0.6.2': + '@changesets/read@0.6.3': dependencies: '@changesets/git': 3.0.2 '@changesets/logger': 0.1.1 - '@changesets/parse': 0.4.0 - '@changesets/types': 6.0.0 + '@changesets/parse': 0.4.1 + '@changesets/types': 6.1.0 fs-extra: 7.0.1 p-filter: 2.1.0 picocolors: 1.1.1 - '@changesets/should-skip-package@0.1.1': + '@changesets/should-skip-package@0.1.2': dependencies: - '@changesets/types': 6.0.0 + '@changesets/types': 6.1.0 '@manypkg/get-packages': 1.1.3 '@changesets/types@4.1.0': {} - '@changesets/types@6.0.0': {} + '@changesets/types@6.1.0': {} - '@changesets/write@0.3.2': + '@changesets/write@0.4.0': dependencies: - '@changesets/types': 6.0.0 + '@changesets/types': 6.1.0 fs-extra: 7.0.1 - human-id: 1.0.2 + human-id: 4.1.1 prettier: 2.8.8 '@chevrotain/cst-dts-gen@11.0.3': @@ -5185,156 +5196,159 @@ snapshots: tslib: 2.8.1 optional: true - '@esbuild/aix-ppc64@0.23.1': - optional: true - '@esbuild/aix-ppc64@0.24.2': optional: true - '@esbuild/android-arm64@0.23.1': + '@esbuild/aix-ppc64@0.25.0': optional: true '@esbuild/android-arm64@0.24.2': optional: true - '@esbuild/android-arm@0.23.1': + '@esbuild/android-arm64@0.25.0': optional: true '@esbuild/android-arm@0.24.2': optional: true - '@esbuild/android-x64@0.23.1': + '@esbuild/android-arm@0.25.0': optional: true '@esbuild/android-x64@0.24.2': optional: true - '@esbuild/darwin-arm64@0.23.1': + '@esbuild/android-x64@0.25.0': optional: true '@esbuild/darwin-arm64@0.24.2': optional: true - '@esbuild/darwin-x64@0.23.1': + '@esbuild/darwin-arm64@0.25.0': optional: true '@esbuild/darwin-x64@0.24.2': optional: true - '@esbuild/freebsd-arm64@0.23.1': + '@esbuild/darwin-x64@0.25.0': optional: true '@esbuild/freebsd-arm64@0.24.2': optional: true - '@esbuild/freebsd-x64@0.23.1': + '@esbuild/freebsd-arm64@0.25.0': optional: true '@esbuild/freebsd-x64@0.24.2': optional: true - '@esbuild/linux-arm64@0.23.1': + '@esbuild/freebsd-x64@0.25.0': optional: true '@esbuild/linux-arm64@0.24.2': optional: true - '@esbuild/linux-arm@0.23.1': + '@esbuild/linux-arm64@0.25.0': optional: true '@esbuild/linux-arm@0.24.2': optional: true - '@esbuild/linux-ia32@0.23.1': + '@esbuild/linux-arm@0.25.0': optional: true '@esbuild/linux-ia32@0.24.2': optional: true - '@esbuild/linux-loong64@0.23.1': + '@esbuild/linux-ia32@0.25.0': optional: true '@esbuild/linux-loong64@0.24.2': optional: true - '@esbuild/linux-mips64el@0.23.1': + '@esbuild/linux-loong64@0.25.0': optional: true '@esbuild/linux-mips64el@0.24.2': optional: true - '@esbuild/linux-ppc64@0.23.1': + '@esbuild/linux-mips64el@0.25.0': optional: true '@esbuild/linux-ppc64@0.24.2': optional: true - '@esbuild/linux-riscv64@0.23.1': + '@esbuild/linux-ppc64@0.25.0': optional: true '@esbuild/linux-riscv64@0.24.2': optional: true - '@esbuild/linux-s390x@0.23.1': + '@esbuild/linux-riscv64@0.25.0': optional: true '@esbuild/linux-s390x@0.24.2': optional: true - '@esbuild/linux-x64@0.23.1': + '@esbuild/linux-s390x@0.25.0': optional: true '@esbuild/linux-x64@0.24.2': optional: true + '@esbuild/linux-x64@0.25.0': + optional: true + '@esbuild/netbsd-arm64@0.24.2': optional: true - '@esbuild/netbsd-x64@0.23.1': + '@esbuild/netbsd-arm64@0.25.0': optional: true '@esbuild/netbsd-x64@0.24.2': optional: true - '@esbuild/openbsd-arm64@0.23.1': + '@esbuild/netbsd-x64@0.25.0': optional: true '@esbuild/openbsd-arm64@0.24.2': optional: true - '@esbuild/openbsd-x64@0.23.1': + '@esbuild/openbsd-arm64@0.25.0': optional: true '@esbuild/openbsd-x64@0.24.2': optional: true - '@esbuild/sunos-x64@0.23.1': + '@esbuild/openbsd-x64@0.25.0': optional: true '@esbuild/sunos-x64@0.24.2': optional: true - '@esbuild/win32-arm64@0.23.1': + '@esbuild/sunos-x64@0.25.0': optional: true '@esbuild/win32-arm64@0.24.2': optional: true - '@esbuild/win32-ia32@0.23.1': + '@esbuild/win32-arm64@0.25.0': optional: true '@esbuild/win32-ia32@0.24.2': optional: true - '@esbuild/win32-x64@0.23.1': + '@esbuild/win32-ia32@0.25.0': optional: true '@esbuild/win32-x64@0.24.2': optional: true - '@eslint-community/eslint-utils@4.4.1(eslint@9.20.0)': + '@esbuild/win32-x64@0.25.0': + optional: true + + '@eslint-community/eslint-utils@4.4.1(eslint@9.20.1)': dependencies: - eslint: 9.20.0 + eslint: 9.20.1 eslint-visitor-keys: 3.4.3 '@eslint-community/regexpp@4.12.1': {} @@ -5347,10 +5361,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@eslint/core@0.10.0': - dependencies: - '@types/json-schema': 7.0.15 - '@eslint/core@0.11.0': dependencies: '@types/json-schema': 7.0.15 @@ -5373,9 +5383,9 @@ snapshots: '@eslint/object-schema@2.1.6': {} - '@eslint/plugin-kit@0.2.5': + '@eslint/plugin-kit@0.2.6': dependencies: - '@eslint/core': 0.10.0 + '@eslint/core': 0.11.0 levn: 0.4.1 '@fastify/ajv-compiler@4.0.2': @@ -5426,7 +5436,7 @@ snapshots: '@floating-ui/utils@0.2.9': {} - '@formatjs/intl-localematcher@0.5.10': + '@formatjs/intl-localematcher@0.6.0': dependencies: tslib: 2.8.1 @@ -5450,17 +5460,17 @@ snapshots: '@humanwhocodes/retry@0.3.1': {} - '@humanwhocodes/retry@0.4.1': {} + '@humanwhocodes/retry@0.4.2': {} '@iconify/types@2.0.0': {} '@iconify/utils@2.3.0': dependencies: '@antfu/install-pkg': 1.0.0 - '@antfu/utils': 8.1.0 + '@antfu/utils': 8.1.1 '@iconify/types': 2.0.0 debug: 4.4.0 - globals: 15.14.0 + globals: 15.15.0 kolorist: 1.8.0 local-pkg: 1.0.0 mlly: 1.7.4 @@ -5570,14 +5580,14 @@ snapshots: '@manypkg/find-root@1.1.0': dependencies: - '@babel/runtime': 7.26.7 + '@babel/runtime': 7.26.9 '@types/node': 12.20.55 find-up: 4.1.0 fs-extra: 8.1.0 '@manypkg/get-packages@1.1.3': dependencies: - '@babel/runtime': 7.26.7 + '@babel/runtime': 7.26.9 '@changesets/types': 4.1.0 '@manypkg/find-root': 1.1.0 fs-extra: 8.1.0 @@ -5595,7 +5605,7 @@ snapshots: estree-util-is-identifier-name: 3.0.0 estree-util-scope: 1.0.0 estree-walker: 3.0.3 - hast-util-to-jsx-runtime: 2.3.2 + hast-util-to-jsx-runtime: 2.3.3 markdown-extensions: 2.0.0 recma-build-jsx: 1.0.0 recma-jsx: 1.0.0(acorn@8.14.0) @@ -5681,7 +5691,7 @@ snapshots: '@next/env@15.1.6': {} - '@next/eslint-plugin-next@15.1.6': + '@next/eslint-plugin-next@15.1.7': dependencies: fast-glob: 3.3.1 @@ -5892,106 +5902,106 @@ snapshots: dependencies: '@redis/client': 1.6.0 - '@rollup/rollup-android-arm-eabi@4.34.6': + '@rollup/rollup-android-arm-eabi@4.34.8': optional: true - '@rollup/rollup-android-arm64@4.34.6': + '@rollup/rollup-android-arm64@4.34.8': optional: true - '@rollup/rollup-darwin-arm64@4.34.6': + '@rollup/rollup-darwin-arm64@4.34.8': optional: true - '@rollup/rollup-darwin-x64@4.34.6': + '@rollup/rollup-darwin-x64@4.34.8': optional: true - '@rollup/rollup-freebsd-arm64@4.34.6': + '@rollup/rollup-freebsd-arm64@4.34.8': optional: true - '@rollup/rollup-freebsd-x64@4.34.6': + '@rollup/rollup-freebsd-x64@4.34.8': optional: true - '@rollup/rollup-linux-arm-gnueabihf@4.34.6': + '@rollup/rollup-linux-arm-gnueabihf@4.34.8': optional: true - '@rollup/rollup-linux-arm-musleabihf@4.34.6': + '@rollup/rollup-linux-arm-musleabihf@4.34.8': optional: true - '@rollup/rollup-linux-arm64-gnu@4.34.6': + '@rollup/rollup-linux-arm64-gnu@4.34.8': optional: true - '@rollup/rollup-linux-arm64-musl@4.34.6': + '@rollup/rollup-linux-arm64-musl@4.34.8': optional: true - '@rollup/rollup-linux-loongarch64-gnu@4.34.6': + '@rollup/rollup-linux-loongarch64-gnu@4.34.8': optional: true - '@rollup/rollup-linux-powerpc64le-gnu@4.34.6': + '@rollup/rollup-linux-powerpc64le-gnu@4.34.8': optional: true - '@rollup/rollup-linux-riscv64-gnu@4.34.6': + '@rollup/rollup-linux-riscv64-gnu@4.34.8': optional: true - '@rollup/rollup-linux-s390x-gnu@4.34.6': + '@rollup/rollup-linux-s390x-gnu@4.34.8': optional: true - '@rollup/rollup-linux-x64-gnu@4.34.6': + '@rollup/rollup-linux-x64-gnu@4.34.8': optional: true - '@rollup/rollup-linux-x64-musl@4.34.6': + '@rollup/rollup-linux-x64-musl@4.34.8': optional: true - '@rollup/rollup-win32-arm64-msvc@4.34.6': + '@rollup/rollup-win32-arm64-msvc@4.34.8': optional: true - '@rollup/rollup-win32-ia32-msvc@4.34.6': + '@rollup/rollup-win32-ia32-msvc@4.34.8': optional: true - '@rollup/rollup-win32-x64-msvc@4.34.6': + '@rollup/rollup-win32-x64-msvc@4.34.8': optional: true - '@shikijs/core@2.3.2': + '@shikijs/core@2.5.0': dependencies: - '@shikijs/engine-javascript': 2.3.2 - '@shikijs/engine-oniguruma': 2.3.2 - '@shikijs/types': 2.3.2 - '@shikijs/vscode-textmate': 10.0.1 + '@shikijs/engine-javascript': 2.5.0 + '@shikijs/engine-oniguruma': 2.5.0 + '@shikijs/types': 2.5.0 + '@shikijs/vscode-textmate': 10.0.2 '@types/hast': 3.0.4 - hast-util-to-html: 9.0.4 + hast-util-to-html: 9.0.5 - '@shikijs/engine-javascript@2.3.2': + '@shikijs/engine-javascript@2.5.0': dependencies: - '@shikijs/types': 2.3.2 - '@shikijs/vscode-textmate': 10.0.1 - oniguruma-to-es: 3.1.0 + '@shikijs/types': 2.5.0 + '@shikijs/vscode-textmate': 10.0.2 + oniguruma-to-es: 3.1.1 - '@shikijs/engine-oniguruma@2.3.2': + '@shikijs/engine-oniguruma@2.5.0': dependencies: - '@shikijs/types': 2.3.2 - '@shikijs/vscode-textmate': 10.0.1 + '@shikijs/types': 2.5.0 + '@shikijs/vscode-textmate': 10.0.2 - '@shikijs/langs@2.3.2': + '@shikijs/langs@2.5.0': dependencies: - '@shikijs/types': 2.3.2 + '@shikijs/types': 2.5.0 - '@shikijs/themes@2.3.2': + '@shikijs/themes@2.5.0': dependencies: - '@shikijs/types': 2.3.2 + '@shikijs/types': 2.5.0 - '@shikijs/twoslash@2.3.2(typescript@5.7.3)': + '@shikijs/twoslash@2.5.0(typescript@5.7.3)': dependencies: - '@shikijs/core': 2.3.2 - '@shikijs/types': 2.3.2 + '@shikijs/core': 2.5.0 + '@shikijs/types': 2.5.0 twoslash: 0.2.12(typescript@5.7.3) transitivePeerDependencies: - supports-color - typescript - '@shikijs/types@2.3.2': + '@shikijs/types@2.5.0': dependencies: - '@shikijs/vscode-textmate': 10.0.1 + '@shikijs/vscode-textmate': 10.0.2 '@types/hast': 3.0.4 - '@shikijs/vscode-textmate@10.0.1': {} + '@shikijs/vscode-textmate@10.0.2': {} '@swc/counter@0.1.3': {} @@ -6182,7 +6192,7 @@ snapshots: '@types/node@12.20.55': {} - '@types/node@22.13.1': + '@types/node@22.13.4': dependencies: undici-types: 6.20.0 @@ -6212,15 +6222,15 @@ snapshots: '@types/unist@3.0.3': {} - '@typescript-eslint/eslint-plugin@8.23.0(@typescript-eslint/parser@8.23.0(eslint@9.20.0)(typescript@5.7.3))(eslint@9.20.0)(typescript@5.7.3)': + '@typescript-eslint/eslint-plugin@8.24.1(@typescript-eslint/parser@8.24.1(eslint@9.20.1)(typescript@5.7.3))(eslint@9.20.1)(typescript@5.7.3)': dependencies: '@eslint-community/regexpp': 4.12.1 - '@typescript-eslint/parser': 8.23.0(eslint@9.20.0)(typescript@5.7.3) - '@typescript-eslint/scope-manager': 8.23.0 - '@typescript-eslint/type-utils': 8.23.0(eslint@9.20.0)(typescript@5.7.3) - '@typescript-eslint/utils': 8.23.0(eslint@9.20.0)(typescript@5.7.3) - '@typescript-eslint/visitor-keys': 8.23.0 - eslint: 9.20.0 + '@typescript-eslint/parser': 8.24.1(eslint@9.20.1)(typescript@5.7.3) + '@typescript-eslint/scope-manager': 8.24.1 + '@typescript-eslint/type-utils': 8.24.1(eslint@9.20.1)(typescript@5.7.3) + '@typescript-eslint/utils': 8.24.1(eslint@9.20.1)(typescript@5.7.3) + '@typescript-eslint/visitor-keys': 8.24.1 + eslint: 9.20.1 graphemer: 1.4.0 ignore: 5.3.2 natural-compare: 1.4.0 @@ -6229,40 +6239,40 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.23.0(eslint@9.20.0)(typescript@5.7.3)': + '@typescript-eslint/parser@8.24.1(eslint@9.20.1)(typescript@5.7.3)': dependencies: - '@typescript-eslint/scope-manager': 8.23.0 - '@typescript-eslint/types': 8.23.0 - '@typescript-eslint/typescript-estree': 8.23.0(typescript@5.7.3) - '@typescript-eslint/visitor-keys': 8.23.0 + '@typescript-eslint/scope-manager': 8.24.1 + '@typescript-eslint/types': 8.24.1 + '@typescript-eslint/typescript-estree': 8.24.1(typescript@5.7.3) + '@typescript-eslint/visitor-keys': 8.24.1 debug: 4.4.0 - eslint: 9.20.0 + eslint: 9.20.1 typescript: 5.7.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/scope-manager@8.23.0': + '@typescript-eslint/scope-manager@8.24.1': dependencies: - '@typescript-eslint/types': 8.23.0 - '@typescript-eslint/visitor-keys': 8.23.0 + '@typescript-eslint/types': 8.24.1 + '@typescript-eslint/visitor-keys': 8.24.1 - '@typescript-eslint/type-utils@8.23.0(eslint@9.20.0)(typescript@5.7.3)': + '@typescript-eslint/type-utils@8.24.1(eslint@9.20.1)(typescript@5.7.3)': dependencies: - '@typescript-eslint/typescript-estree': 8.23.0(typescript@5.7.3) - '@typescript-eslint/utils': 8.23.0(eslint@9.20.0)(typescript@5.7.3) + '@typescript-eslint/typescript-estree': 8.24.1(typescript@5.7.3) + '@typescript-eslint/utils': 8.24.1(eslint@9.20.1)(typescript@5.7.3) debug: 4.4.0 - eslint: 9.20.0 + eslint: 9.20.1 ts-api-utils: 2.0.1(typescript@5.7.3) typescript: 5.7.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/types@8.23.0': {} + '@typescript-eslint/types@8.24.1': {} - '@typescript-eslint/typescript-estree@8.23.0(typescript@5.7.3)': + '@typescript-eslint/typescript-estree@8.24.1(typescript@5.7.3)': dependencies: - '@typescript-eslint/types': 8.23.0 - '@typescript-eslint/visitor-keys': 8.23.0 + '@typescript-eslint/types': 8.24.1 + '@typescript-eslint/visitor-keys': 8.24.1 debug: 4.4.0 fast-glob: 3.3.3 is-glob: 4.0.3 @@ -6273,20 +6283,20 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.23.0(eslint@9.20.0)(typescript@5.7.3)': + '@typescript-eslint/utils@8.24.1(eslint@9.20.1)(typescript@5.7.3)': dependencies: - '@eslint-community/eslint-utils': 4.4.1(eslint@9.20.0) - '@typescript-eslint/scope-manager': 8.23.0 - '@typescript-eslint/types': 8.23.0 - '@typescript-eslint/typescript-estree': 8.23.0(typescript@5.7.3) - eslint: 9.20.0 + '@eslint-community/eslint-utils': 4.4.1(eslint@9.20.1) + '@typescript-eslint/scope-manager': 8.24.1 + '@typescript-eslint/types': 8.24.1 + '@typescript-eslint/typescript-estree': 8.24.1(typescript@5.7.3) + eslint: 9.20.1 typescript: 5.7.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/visitor-keys@8.23.0': + '@typescript-eslint/visitor-keys@8.24.1': dependencies: - '@typescript-eslint/types': 8.23.0 + '@typescript-eslint/types': 8.24.1 eslint-visitor-keys: 4.2.0 '@typescript/vfs@1.6.1(typescript@5.7.3)': @@ -6404,21 +6414,21 @@ snapshots: es-abstract: 1.23.9 es-errors: 1.3.0 es-object-atoms: 1.1.1 - es-shim-unscopables: 1.0.2 + es-shim-unscopables: 1.1.0 array.prototype.flat@1.3.3: dependencies: call-bind: 1.0.8 define-properties: 1.2.1 es-abstract: 1.23.9 - es-shim-unscopables: 1.0.2 + es-shim-unscopables: 1.1.0 array.prototype.flatmap@1.3.3: dependencies: call-bind: 1.0.8 define-properties: 1.2.1 es-abstract: 1.23.9 - es-shim-unscopables: 1.0.2 + es-shim-unscopables: 1.1.0 array.prototype.tosorted@1.1.4: dependencies: @@ -6426,7 +6436,7 @@ snapshots: define-properties: 1.2.1 es-abstract: 1.23.9 es-errors: 1.3.0 - es-shim-unscopables: 1.0.2 + es-shim-unscopables: 1.1.0 arraybuffer.prototype.slice@1.0.4: dependencies: @@ -6468,7 +6478,7 @@ snapshots: axios@1.7.9: dependencies: follow-redirects: 1.15.9(debug@4.3.7) - form-data: 4.0.1 + form-data: 4.0.2 proxy-from-env: 1.1.0 transitivePeerDependencies: - debug @@ -6533,28 +6543,28 @@ snapshots: cac@6.7.14: {} - call-bind-apply-helpers@1.0.1: + call-bind-apply-helpers@1.0.2: dependencies: es-errors: 1.3.0 function-bind: 1.1.2 call-bind@1.0.8: dependencies: - call-bind-apply-helpers: 1.0.1 + call-bind-apply-helpers: 1.0.2 es-define-property: 1.0.1 get-intrinsic: 1.2.7 set-function-length: 1.2.2 call-bound@1.0.3: dependencies: - call-bind-apply-helpers: 1.0.1 + call-bind-apply-helpers: 1.0.2 get-intrinsic: 1.2.7 callsites@3.1.0: {} camelcase@7.0.1: {} - caniuse-lite@1.0.30001698: {} + caniuse-lite@1.0.30001700: {} ccount@2.0.1: {} @@ -6616,7 +6626,7 @@ snapshots: chokidar@4.0.3: dependencies: - readdirp: 4.1.1 + readdirp: 4.1.2 ci-info@3.9.0: {} @@ -7019,7 +7029,7 @@ snapshots: dunder-proto@1.0.1: dependencies: - call-bind-apply-helpers: 1.0.1 + call-bind-apply-helpers: 1.0.2 es-errors: 1.3.0 gopd: 1.2.0 @@ -7134,7 +7144,7 @@ snapshots: has-tostringtag: 1.0.2 hasown: 2.0.2 - es-shim-unscopables@1.0.2: + es-shim-unscopables@1.1.0: dependencies: hasown: 2.0.2 @@ -7158,33 +7168,6 @@ snapshots: esast-util-from-estree: 2.0.0 vfile-message: 4.0.2 - esbuild@0.23.1: - optionalDependencies: - '@esbuild/aix-ppc64': 0.23.1 - '@esbuild/android-arm': 0.23.1 - '@esbuild/android-arm64': 0.23.1 - '@esbuild/android-x64': 0.23.1 - '@esbuild/darwin-arm64': 0.23.1 - '@esbuild/darwin-x64': 0.23.1 - '@esbuild/freebsd-arm64': 0.23.1 - '@esbuild/freebsd-x64': 0.23.1 - '@esbuild/linux-arm': 0.23.1 - '@esbuild/linux-arm64': 0.23.1 - '@esbuild/linux-ia32': 0.23.1 - '@esbuild/linux-loong64': 0.23.1 - '@esbuild/linux-mips64el': 0.23.1 - '@esbuild/linux-ppc64': 0.23.1 - '@esbuild/linux-riscv64': 0.23.1 - '@esbuild/linux-s390x': 0.23.1 - '@esbuild/linux-x64': 0.23.1 - '@esbuild/netbsd-x64': 0.23.1 - '@esbuild/openbsd-arm64': 0.23.1 - '@esbuild/openbsd-x64': 0.23.1 - '@esbuild/sunos-x64': 0.23.1 - '@esbuild/win32-arm64': 0.23.1 - '@esbuild/win32-ia32': 0.23.1 - '@esbuild/win32-x64': 0.23.1 - esbuild@0.24.2: optionalDependencies: '@esbuild/aix-ppc64': 0.24.2 @@ -7213,6 +7196,34 @@ snapshots: '@esbuild/win32-ia32': 0.24.2 '@esbuild/win32-x64': 0.24.2 + esbuild@0.25.0: + optionalDependencies: + '@esbuild/aix-ppc64': 0.25.0 + '@esbuild/android-arm': 0.25.0 + '@esbuild/android-arm64': 0.25.0 + '@esbuild/android-x64': 0.25.0 + '@esbuild/darwin-arm64': 0.25.0 + '@esbuild/darwin-x64': 0.25.0 + '@esbuild/freebsd-arm64': 0.25.0 + '@esbuild/freebsd-x64': 0.25.0 + '@esbuild/linux-arm': 0.25.0 + '@esbuild/linux-arm64': 0.25.0 + '@esbuild/linux-ia32': 0.25.0 + '@esbuild/linux-loong64': 0.25.0 + '@esbuild/linux-mips64el': 0.25.0 + '@esbuild/linux-ppc64': 0.25.0 + '@esbuild/linux-riscv64': 0.25.0 + '@esbuild/linux-s390x': 0.25.0 + '@esbuild/linux-x64': 0.25.0 + '@esbuild/netbsd-arm64': 0.25.0 + '@esbuild/netbsd-x64': 0.25.0 + '@esbuild/openbsd-arm64': 0.25.0 + '@esbuild/openbsd-x64': 0.25.0 + '@esbuild/sunos-x64': 0.25.0 + '@esbuild/win32-arm64': 0.25.0 + '@esbuild/win32-ia32': 0.25.0 + '@esbuild/win32-x64': 0.25.0 + escape-string-regexp@4.0.0: {} escape-string-regexp@5.0.0: {} @@ -7225,15 +7236,15 @@ snapshots: optionalDependencies: source-map: 0.6.1 - eslint-config-prettier@10.0.1(eslint@9.20.0): + eslint-config-prettier@10.0.1(eslint@9.20.1): dependencies: - eslint: 9.20.0 + eslint: 9.20.1 - eslint-plugin-react-hooks@5.1.0(eslint@9.20.0): + eslint-plugin-react-hooks@5.1.0(eslint@9.20.1): dependencies: - eslint: 9.20.0 + eslint: 9.20.1 - eslint-plugin-react@7.37.4(eslint@9.20.0): + eslint-plugin-react@7.37.4(eslint@9.20.1): dependencies: array-includes: 3.1.8 array.prototype.findlast: 1.2.5 @@ -7241,7 +7252,7 @@ snapshots: array.prototype.tosorted: 1.1.4 doctrine: 2.1.0 es-iterator-helpers: 1.2.1 - eslint: 9.20.0 + eslint: 9.20.1 estraverse: 5.3.0 hasown: 2.0.2 jsx-ast-utils: 3.3.5 @@ -7255,11 +7266,11 @@ snapshots: string.prototype.matchall: 4.0.12 string.prototype.repeat: 1.0.0 - eslint-plugin-turbo@2.4.0(eslint@9.20.0)(turbo@2.4.0): + eslint-plugin-turbo@2.4.2(eslint@9.20.1)(turbo@2.4.2): dependencies: dotenv: 16.0.3 - eslint: 9.20.0 - turbo: 2.4.0 + eslint: 9.20.1 + turbo: 2.4.2 eslint-scope@8.2.0: dependencies: @@ -7270,18 +7281,18 @@ snapshots: eslint-visitor-keys@4.2.0: {} - eslint@9.20.0: + eslint@9.20.1: dependencies: - '@eslint-community/eslint-utils': 4.4.1(eslint@9.20.0) + '@eslint-community/eslint-utils': 4.4.1(eslint@9.20.1) '@eslint-community/regexpp': 4.12.1 '@eslint/config-array': 0.19.2 '@eslint/core': 0.11.0 '@eslint/eslintrc': 3.2.0 '@eslint/js': 9.20.0 - '@eslint/plugin-kit': 0.2.5 + '@eslint/plugin-kit': 0.2.6 '@humanfs/node': 0.16.6 '@humanwhocodes/module-importer': 1.0.1 - '@humanwhocodes/retry': 0.4.1 + '@humanwhocodes/retry': 0.4.2 '@types/estree': 1.0.6 '@types/json-schema': 7.0.15 ajv: 6.12.6 @@ -7477,7 +7488,7 @@ snapshots: avvio: 9.1.0 fast-json-stringify: 6.0.1 find-my-way: 9.2.0 - light-my-request: 6.5.1 + light-my-request: 6.6.0 pino: 9.6.0 process-warning: 4.0.1 rfdc: 1.4.1 @@ -7525,16 +7536,16 @@ snapshots: flat-cache@4.0.1: dependencies: - flatted: 3.3.2 + flatted: 3.3.3 keyv: 4.5.4 - flatted@3.3.2: {} + flatted@3.3.3: {} follow-redirects@1.15.9(debug@4.3.7): optionalDependencies: debug: 4.3.7 - for-each@0.3.4: + for-each@0.3.5: dependencies: is-callable: 1.2.7 @@ -7543,10 +7554,11 @@ snapshots: cross-spawn: 7.0.6 signal-exit: 4.1.0 - form-data@4.0.1: + form-data@4.0.2: dependencies: asynckit: 0.4.0 combined-stream: 1.0.8 + es-set-tostringtag: 2.1.0 mime-types: 2.1.35 format@0.2.2: {} @@ -7586,7 +7598,7 @@ snapshots: get-intrinsic@1.2.7: dependencies: - call-bind-apply-helpers: 1.0.1 + call-bind-apply-helpers: 1.0.2 es-define-property: 1.0.1 es-errors: 1.3.0 es-object-atoms: 1.1.1 @@ -7655,7 +7667,9 @@ snapshots: globals@14.0.0: {} - globals@15.14.0: {} + globals@15.15.0: {} + + globals@16.0.0: {} globalthis@1.0.4: dependencies: @@ -7704,7 +7718,7 @@ snapshots: hast-util-from-dom@5.0.1: dependencies: '@types/hast': 3.0.4 - hastscript: 9.0.0 + hastscript: 9.0.1 web-namespaces: 2.0.1 hast-util-from-html-isomorphic@2.0.0: @@ -7718,18 +7732,18 @@ snapshots: dependencies: '@types/hast': 3.0.4 devlop: 1.1.0 - hast-util-from-parse5: 8.0.2 + hast-util-from-parse5: 8.0.3 parse5: 7.2.1 vfile: 6.0.3 vfile-message: 4.0.2 - hast-util-from-parse5@8.0.2: + hast-util-from-parse5@8.0.3: dependencies: '@types/hast': 3.0.4 '@types/unist': 3.0.3 devlop: 1.1.0 - hastscript: 9.0.0 - property-information: 6.5.0 + hastscript: 9.0.1 + property-information: 7.0.0 vfile: 6.0.3 vfile-location: 5.0.3 web-namespaces: 2.0.1 @@ -7747,7 +7761,7 @@ snapshots: '@types/hast': 3.0.4 '@types/unist': 3.0.3 '@ungap/structured-clone': 1.3.0 - hast-util-from-parse5: 8.0.2 + hast-util-from-parse5: 8.0.3 hast-util-to-parse5: 8.0.0 html-void-elements: 3.0.0 mdast-util-to-hast: 13.2.0 @@ -7758,7 +7772,7 @@ snapshots: web-namespaces: 2.0.1 zwitch: 2.0.4 - hast-util-to-estree@3.1.1: + hast-util-to-estree@3.1.2: dependencies: '@types/estree': 1.0.6 '@types/estree-jsx': 1.0.5 @@ -7771,7 +7785,7 @@ snapshots: mdast-util-mdx-expression: 2.0.1 mdast-util-mdx-jsx: 3.2.0 mdast-util-mdxjs-esm: 2.0.1 - property-information: 6.5.0 + property-information: 7.0.0 space-separated-tokens: 2.0.2 style-to-object: 1.0.8 unist-util-position: 5.0.0 @@ -7779,7 +7793,7 @@ snapshots: transitivePeerDependencies: - supports-color - hast-util-to-html@9.0.4: + hast-util-to-html@9.0.5: dependencies: '@types/hast': 3.0.4 '@types/unist': 3.0.3 @@ -7788,12 +7802,12 @@ snapshots: hast-util-whitespace: 3.0.0 html-void-elements: 3.0.0 mdast-util-to-hast: 13.2.0 - property-information: 6.5.0 + property-information: 7.0.0 space-separated-tokens: 2.0.2 stringify-entities: 4.0.4 zwitch: 2.0.4 - hast-util-to-jsx-runtime@2.3.2: + hast-util-to-jsx-runtime@2.3.3: dependencies: '@types/estree': 1.0.6 '@types/hast': 3.0.4 @@ -7805,7 +7819,7 @@ snapshots: mdast-util-mdx-expression: 2.0.1 mdast-util-mdx-jsx: 3.2.0 mdast-util-mdxjs-esm: 2.0.1 - property-information: 6.5.0 + property-information: 7.0.0 space-separated-tokens: 2.0.2 style-to-object: 1.0.8 unist-util-position: 5.0.0 @@ -7838,12 +7852,12 @@ snapshots: dependencies: '@types/hast': 3.0.4 - hastscript@9.0.0: + hastscript@9.0.1: dependencies: '@types/hast': 3.0.4 comma-separated-tokens: 2.0.3 hast-util-parse-selector: 4.0.0 - property-information: 6.5.0 + property-information: 7.0.0 space-separated-tokens: 2.0.2 help-me@5.0.0: {} @@ -7864,7 +7878,7 @@ snapshots: transitivePeerDependencies: - supports-color - human-id@1.0.2: {} + human-id@4.1.1: {} human-signals@2.1.0: {} @@ -8167,7 +8181,7 @@ snapshots: prelude-ls: 1.2.1 type-check: 0.4.0 - light-my-request@6.5.1: + light-my-request@6.6.0: dependencies: cookie: 1.0.2 process-warning: 4.0.1 @@ -8274,7 +8288,7 @@ snapshots: mdast-util-find-and-replace: 3.0.2 micromark-util-character: 2.1.1 - mdast-util-gfm-footnote@2.0.0: + mdast-util-gfm-footnote@2.1.0: dependencies: '@types/mdast': 4.0.4 devlop: 1.1.0 @@ -8311,11 +8325,11 @@ snapshots: transitivePeerDependencies: - supports-color - mdast-util-gfm@3.0.0: + mdast-util-gfm@3.1.0: dependencies: mdast-util-from-markdown: 2.0.2 mdast-util-gfm-autolink-literal: 2.0.1 - mdast-util-gfm-footnote: 2.0.0 + mdast-util-gfm-footnote: 2.1.0 mdast-util-gfm-strikethrough: 2.0.0 mdast-util-gfm-table: 2.0.0 mdast-util-gfm-task-list-item: 2.0.0 @@ -8773,7 +8787,7 @@ snapshots: mlly@1.7.4: dependencies: acorn: 8.14.0 - pathe: 2.0.2 + pathe: 2.0.3 pkg-types: 1.3.1 ufo: 1.5.4 @@ -8821,7 +8835,7 @@ snapshots: '@next/env': 14.2.15 '@swc/helpers': 0.5.5 busboy: 1.6.0 - caniuse-lite: 1.0.30001698 + caniuse-lite: 1.0.30001700 graceful-fs: 4.2.11 postcss: 8.4.31 react: 18.3.1 @@ -8847,7 +8861,7 @@ snapshots: '@next/env': 14.2.15 '@swc/helpers': 0.5.5 busboy: 1.6.0 - caniuse-lite: 1.0.30001698 + caniuse-lite: 1.0.30001700 graceful-fs: 4.2.11 postcss: 8.4.31 react: 19.0.0 @@ -8874,7 +8888,7 @@ snapshots: '@swc/counter': 0.1.3 '@swc/helpers': 0.5.15 busboy: 1.6.0 - caniuse-lite: 1.0.30001698 + caniuse-lite: 1.0.30001700 postcss: 8.4.31 react: 19.0.0 react-dom: 19.0.0(react@19.0.0) @@ -8894,32 +8908,32 @@ snapshots: - '@babel/core' - babel-plugin-macros - nextra-theme-docs@4.2.4(@types/react@19.0.8)(next@15.1.6(@playwright/test@1.50.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(nextra@4.2.4(acorn@8.14.0)(next@15.1.6(@playwright/test@1.50.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3))(react-dom@19.0.0(react@19.0.0))(react@19.0.0): + nextra-theme-docs@4.2.13(@types/react@19.0.8)(next@15.1.6(@playwright/test@1.50.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(nextra@4.2.13(acorn@8.14.0)(next@15.1.6(@playwright/test@1.50.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3))(react-dom@19.0.0(react@19.0.0))(react@19.0.0): dependencies: '@headlessui/react': 2.2.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0) clsx: 2.1.1 next: 15.1.6(@playwright/test@1.50.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) next-themes: 0.4.4(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - nextra: 4.2.4(acorn@8.14.0)(next@15.1.6(@playwright/test@1.50.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3) + nextra: 4.2.13(acorn@8.14.0)(next@15.1.6(@playwright/test@1.50.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3) react: 19.0.0 react-compiler-runtime: 0.0.0-experimental-22c6e49-20241219(react@19.0.0) react-dom: 19.0.0(react@19.0.0) scroll-into-view-if-needed: 3.1.0 - zod: 3.24.1 - zod-validation-error: 3.4.0(zod@3.24.1) + zod: 3.24.2 + zod-validation-error: 3.4.0(zod@3.24.2) zustand: 5.0.3(@types/react@19.0.8)(react@19.0.0) transitivePeerDependencies: - '@types/react' - immer - use-sync-external-store - nextra@4.2.4(acorn@8.14.0)(next@15.1.6(@playwright/test@1.50.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3): + nextra@4.2.13(acorn@8.14.0)(next@15.1.6(@playwright/test@1.50.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3): dependencies: - '@formatjs/intl-localematcher': 0.5.10 + '@formatjs/intl-localematcher': 0.6.0 '@headlessui/react': 2.2.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0) '@mdx-js/mdx': 3.1.0(acorn@8.14.0) '@napi-rs/simple-git': 0.1.19 - '@shikijs/twoslash': 2.3.2(typescript@5.7.3) + '@shikijs/twoslash': 2.5.0(typescript@5.7.3) '@theguild/remark-mermaid': 0.2.0(react@19.0.0) '@theguild/remark-npm2yarn': 0.3.3 better-react-mathjax: 2.1.0(react@19.0.0) @@ -8928,34 +8942,34 @@ snapshots: estree-util-value-to-estree: 3.3.2 fast-glob: 3.3.3 github-slugger: 2.0.0 - hast-util-to-estree: 3.1.1 + hast-util-to-estree: 3.1.2 katex: 0.16.21 mdast-util-from-markdown: 2.0.2 - mdast-util-gfm: 3.0.0 + mdast-util-gfm: 3.1.0 mdast-util-to-hast: 13.2.0 negotiator: 1.0.0 next: 15.1.6(@playwright/test@1.50.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) react: 19.0.0 react-compiler-runtime: 0.0.0-experimental-22c6e49-20241219(react@19.0.0) react-dom: 19.0.0(react@19.0.0) - react-medium-image-zoom: 5.2.13(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + react-medium-image-zoom: 5.2.14(react-dom@19.0.0(react@19.0.0))(react@19.0.0) rehype-katex: 7.0.1 - rehype-pretty-code: 0.14.0(shiki@2.3.2) + rehype-pretty-code: 0.14.0(shiki@2.5.0) rehype-raw: 7.0.0 remark-frontmatter: 5.0.0 - remark-gfm: 4.0.0 + remark-gfm: 4.0.1 remark-math: 6.0.0 remark-reading-time: 2.0.1 remark-smartypants: 3.0.2 - shiki: 2.3.2 + shiki: 2.5.0 slash: 5.1.0 title: 4.0.1 unist-util-remove: 4.0.0 unist-util-visit: 5.0.0 unist-util-visit-children: 3.0.0 yaml: 2.7.0 - zod: 3.24.1 - zod-validation-error: 3.4.0(zod@3.24.1) + zod: 3.24.2 + zod-validation-error: 3.4.0(zod@3.24.2) transitivePeerDependencies: - acorn - supports-color @@ -9033,7 +9047,7 @@ snapshots: dependencies: mimic-fn: 4.0.0 - oniguruma-to-es@3.1.0: + oniguruma-to-es@3.1.1: dependencies: emoji-regex-xs: 1.0.0 regex: 6.0.1 @@ -9082,7 +9096,7 @@ snapshots: p-try@2.2.0: {} - pac-proxy-agent@7.1.0: + pac-proxy-agent@7.2.0: dependencies: '@tootallnate/quickjs-emscripten': 0.23.0 agent-base: 7.1.3 @@ -9164,7 +9178,7 @@ snapshots: path-type@4.0.0: {} - pathe@2.0.2: {} + pathe@2.0.3: {} picocolors@1.1.1: {} @@ -9225,7 +9239,7 @@ snapshots: dependencies: confbox: 0.1.8 mlly: 1.7.4 - pathe: 2.0.2 + pathe: 2.0.3 playwright-core@1.50.1: {} @@ -9317,12 +9331,12 @@ snapshots: possible-typed-array-names@1.1.0: {} - postcss-load-config@6.0.1(postcss@8.4.31)(tsx@4.19.2)(yaml@2.7.0): + postcss-load-config@6.0.1(postcss@8.4.31)(tsx@4.19.3)(yaml@2.7.0): dependencies: lilconfig: 3.1.3 optionalDependencies: postcss: 8.4.31 - tsx: 4.19.2 + tsx: 4.19.3 yaml: 2.7.0 postcss@8.4.31: @@ -9333,16 +9347,16 @@ snapshots: prelude-ls@1.2.1: {} - prettier-plugin-packagejson@2.5.8(prettier@3.4.2): + prettier-plugin-packagejson@2.5.8(prettier@3.5.1): dependencies: sort-package-json: 2.14.0 synckit: 0.9.2 optionalDependencies: - prettier: 3.4.2 + prettier: 3.5.1 prettier@2.8.8: {} - prettier@3.4.2: {} + prettier@3.5.1: {} process-warning@4.0.1: {} @@ -9358,6 +9372,8 @@ snapshots: property-information@6.5.0: {} + property-information@7.0.0: {} + proxy-agent@6.3.1: dependencies: agent-base: 7.1.3 @@ -9365,7 +9381,7 @@ snapshots: http-proxy-agent: 7.0.2 https-proxy-agent: 7.0.6 lru-cache: 7.18.3 - pac-proxy-agent: 7.1.0 + pac-proxy-agent: 7.2.0 proxy-from-env: 1.1.0 socks-proxy-agent: 8.0.5 transitivePeerDependencies: @@ -9410,7 +9426,7 @@ snapshots: react-is@16.13.1: {} - react-medium-image-zoom@5.2.13(react-dom@19.0.0(react@19.0.0))(react@19.0.0): + react-medium-image-zoom@5.2.14(react-dom@19.0.0(react@19.0.0))(react@19.0.0): dependencies: react: 19.0.0 react-dom: 19.0.0(react@19.0.0) @@ -9436,7 +9452,7 @@ snapshots: dependencies: picomatch: 2.3.1 - readdirp@4.1.1: {} + readdirp@4.1.2: {} reading-time@1.5.0: {} @@ -9538,13 +9554,13 @@ snapshots: hast-util-from-html: 2.0.3 unified: 11.0.5 - rehype-pretty-code@0.14.0(shiki@2.3.2): + rehype-pretty-code@0.14.0(shiki@2.5.0): dependencies: '@types/hast': 3.0.4 hast-util-to-string: 3.0.1 parse-numeric-range: 1.3.0 rehype-parse: 9.0.1 - shiki: 2.3.2 + shiki: 2.5.0 unified: 11.0.5 unist-util-visit: 5.0.0 @@ -9558,7 +9574,7 @@ snapshots: dependencies: '@types/estree': 1.0.6 '@types/hast': 3.0.4 - hast-util-to-estree: 3.1.1 + hast-util-to-estree: 3.1.2 transitivePeerDependencies: - supports-color @@ -9571,10 +9587,10 @@ snapshots: transitivePeerDependencies: - supports-color - remark-gfm@4.0.0: + remark-gfm@4.0.1: dependencies: '@types/mdast': 4.0.4 - mdast-util-gfm: 3.0.0 + mdast-util-gfm: 3.1.0 micromark-extension-gfm: 3.0.0 remark-parse: 11.0.0 remark-stringify: 11.0.0 @@ -9696,29 +9712,29 @@ snapshots: robust-predicates@3.0.2: {} - rollup@4.34.6: + rollup@4.34.8: dependencies: '@types/estree': 1.0.6 optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.34.6 - '@rollup/rollup-android-arm64': 4.34.6 - '@rollup/rollup-darwin-arm64': 4.34.6 - '@rollup/rollup-darwin-x64': 4.34.6 - '@rollup/rollup-freebsd-arm64': 4.34.6 - '@rollup/rollup-freebsd-x64': 4.34.6 - '@rollup/rollup-linux-arm-gnueabihf': 4.34.6 - '@rollup/rollup-linux-arm-musleabihf': 4.34.6 - '@rollup/rollup-linux-arm64-gnu': 4.34.6 - '@rollup/rollup-linux-arm64-musl': 4.34.6 - '@rollup/rollup-linux-loongarch64-gnu': 4.34.6 - '@rollup/rollup-linux-powerpc64le-gnu': 4.34.6 - '@rollup/rollup-linux-riscv64-gnu': 4.34.6 - '@rollup/rollup-linux-s390x-gnu': 4.34.6 - '@rollup/rollup-linux-x64-gnu': 4.34.6 - '@rollup/rollup-linux-x64-musl': 4.34.6 - '@rollup/rollup-win32-arm64-msvc': 4.34.6 - '@rollup/rollup-win32-ia32-msvc': 4.34.6 - '@rollup/rollup-win32-x64-msvc': 4.34.6 + '@rollup/rollup-android-arm-eabi': 4.34.8 + '@rollup/rollup-android-arm64': 4.34.8 + '@rollup/rollup-darwin-arm64': 4.34.8 + '@rollup/rollup-darwin-x64': 4.34.8 + '@rollup/rollup-freebsd-arm64': 4.34.8 + '@rollup/rollup-freebsd-x64': 4.34.8 + '@rollup/rollup-linux-arm-gnueabihf': 4.34.8 + '@rollup/rollup-linux-arm-musleabihf': 4.34.8 + '@rollup/rollup-linux-arm64-gnu': 4.34.8 + '@rollup/rollup-linux-arm64-musl': 4.34.8 + '@rollup/rollup-linux-loongarch64-gnu': 4.34.8 + '@rollup/rollup-linux-powerpc64le-gnu': 4.34.8 + '@rollup/rollup-linux-riscv64-gnu': 4.34.8 + '@rollup/rollup-linux-s390x-gnu': 4.34.8 + '@rollup/rollup-linux-x64-gnu': 4.34.8 + '@rollup/rollup-linux-x64-musl': 4.34.8 + '@rollup/rollup-win32-arm64-msvc': 4.34.8 + '@rollup/rollup-win32-ia32-msvc': 4.34.8 + '@rollup/rollup-win32-x64-msvc': 4.34.8 fsevents: 2.3.3 roughjs@4.6.6: @@ -9874,15 +9890,15 @@ snapshots: shebang-regex@3.0.0: {} - shiki@2.3.2: + shiki@2.5.0: dependencies: - '@shikijs/core': 2.3.2 - '@shikijs/engine-javascript': 2.3.2 - '@shikijs/engine-oniguruma': 2.3.2 - '@shikijs/langs': 2.3.2 - '@shikijs/themes': 2.3.2 - '@shikijs/types': 2.3.2 - '@shikijs/vscode-textmate': 10.0.1 + '@shikijs/core': 2.5.0 + '@shikijs/engine-javascript': 2.5.0 + '@shikijs/engine-oniguruma': 2.5.0 + '@shikijs/langs': 2.5.0 + '@shikijs/themes': 2.5.0 + '@shikijs/types': 2.5.0 + '@shikijs/vscode-textmate': 10.0.2 '@types/hast': 3.0.4 shimmer@1.2.1: {} @@ -9934,11 +9950,11 @@ snapshots: dependencies: agent-base: 7.1.3 debug: 4.4.0 - socks: 2.8.3 + socks: 2.8.4 transitivePeerDependencies: - supports-color - socks@2.8.3: + socks@2.8.4: dependencies: ip-address: 9.0.5 smart-buffer: 4.2.0 @@ -9958,7 +9974,7 @@ snapshots: is-plain-obj: 4.1.0 semver: 7.7.1 sort-object-keys: 1.1.3 - tinyglobby: 0.2.10 + tinyglobby: 0.2.12 source-map-js@1.2.1: {} @@ -10142,7 +10158,7 @@ snapshots: tinyexec@0.3.2: {} - tinyglobby@0.2.10: + tinyglobby@0.2.12: dependencies: fdir: 6.4.3(picomatch@4.0.2) picomatch: 4.0.2 @@ -10185,7 +10201,7 @@ snapshots: tslib@2.8.1: {} - tsup@8.3.6(postcss@8.4.31)(tsx@4.19.2)(typescript@5.7.3)(yaml@2.7.0): + tsup@8.3.6(postcss@8.4.31)(tsx@4.19.3)(typescript@5.7.3)(yaml@2.7.0): dependencies: bundle-require: 5.1.0(esbuild@0.24.2) cac: 6.7.14 @@ -10195,13 +10211,13 @@ snapshots: esbuild: 0.24.2 joycon: 3.1.1 picocolors: 1.1.1 - postcss-load-config: 6.0.1(postcss@8.4.31)(tsx@4.19.2)(yaml@2.7.0) + postcss-load-config: 6.0.1(postcss@8.4.31)(tsx@4.19.3)(yaml@2.7.0) resolve-from: 5.0.0 - rollup: 4.34.6 + rollup: 4.34.8 source-map: 0.8.0-beta.0 sucrase: 3.35.0 tinyexec: 0.3.2 - tinyglobby: 0.2.10 + tinyglobby: 0.2.12 tree-kill: 1.2.2 optionalDependencies: postcss: 8.4.31 @@ -10212,39 +10228,39 @@ snapshots: - tsx - yaml - tsx@4.19.2: + tsx@4.19.3: dependencies: - esbuild: 0.23.1 + esbuild: 0.25.0 get-tsconfig: 4.10.0 optionalDependencies: fsevents: 2.3.3 - turbo-darwin-64@2.4.0: + turbo-darwin-64@2.4.2: optional: true - turbo-darwin-arm64@2.4.0: + turbo-darwin-arm64@2.4.2: optional: true - turbo-linux-64@2.4.0: + turbo-linux-64@2.4.2: optional: true - turbo-linux-arm64@2.4.0: + turbo-linux-arm64@2.4.2: optional: true - turbo-windows-64@2.4.0: + turbo-windows-64@2.4.2: optional: true - turbo-windows-arm64@2.4.0: + turbo-windows-arm64@2.4.2: optional: true - turbo@2.4.0: + turbo@2.4.2: optionalDependencies: - turbo-darwin-64: 2.4.0 - turbo-darwin-arm64: 2.4.0 - turbo-linux-64: 2.4.0 - turbo-linux-arm64: 2.4.0 - turbo-windows-64: 2.4.0 - turbo-windows-arm64: 2.4.0 + turbo-darwin-64: 2.4.2 + turbo-darwin-arm64: 2.4.2 + turbo-linux-64: 2.4.2 + turbo-linux-arm64: 2.4.2 + turbo-windows-64: 2.4.2 + turbo-windows-arm64: 2.4.2 tv4@1.3.0: {} @@ -10278,7 +10294,7 @@ snapshots: typed-array-byte-length@1.0.3: dependencies: call-bind: 1.0.8 - for-each: 0.3.4 + for-each: 0.3.5 gopd: 1.2.0 has-proto: 1.2.0 is-typed-array: 1.1.15 @@ -10287,7 +10303,7 @@ snapshots: dependencies: available-typed-arrays: 1.0.7 call-bind: 1.0.8 - for-each: 0.3.4 + for-each: 0.3.5 gopd: 1.2.0 has-proto: 1.2.0 is-typed-array: 1.1.15 @@ -10296,18 +10312,18 @@ snapshots: typed-array-length@1.0.7: dependencies: call-bind: 1.0.8 - for-each: 0.3.4 + for-each: 0.3.5 gopd: 1.2.0 is-typed-array: 1.1.15 possible-typed-array-names: 1.1.0 reflect.getprototypeof: 1.0.10 - typescript-eslint@8.23.0(eslint@9.20.0)(typescript@5.7.3): + typescript-eslint@8.24.1(eslint@9.20.1)(typescript@5.7.3): dependencies: - '@typescript-eslint/eslint-plugin': 8.23.0(@typescript-eslint/parser@8.23.0(eslint@9.20.0)(typescript@5.7.3))(eslint@9.20.0)(typescript@5.7.3) - '@typescript-eslint/parser': 8.23.0(eslint@9.20.0)(typescript@5.7.3) - '@typescript-eslint/utils': 8.23.0(eslint@9.20.0)(typescript@5.7.3) - eslint: 9.20.0 + '@typescript-eslint/eslint-plugin': 8.24.1(@typescript-eslint/parser@8.24.1(eslint@9.20.1)(typescript@5.7.3))(eslint@9.20.1)(typescript@5.7.3) + '@typescript-eslint/parser': 8.24.1(eslint@9.20.1)(typescript@5.7.3) + '@typescript-eslint/utils': 8.24.1(eslint@9.20.1)(typescript@5.7.3) + eslint: 9.20.1 typescript: 5.7.3 transitivePeerDependencies: - supports-color @@ -10502,7 +10518,7 @@ snapshots: available-typed-arrays: 1.0.7 call-bind: 1.0.8 call-bound: 1.0.3 - for-each: 0.3.4 + for-each: 0.3.5 gopd: 1.2.0 has-tostringtag: 1.0.2 @@ -10542,11 +10558,11 @@ snapshots: yocto-queue@0.1.0: {} - zod-validation-error@3.4.0(zod@3.24.1): + zod-validation-error@3.4.0(zod@3.24.2): dependencies: - zod: 3.24.1 + zod: 3.24.2 - zod@3.24.1: {} + zod@3.24.2: {} zustand@5.0.3(@types/react@19.0.8)(react@19.0.0): optionalDependencies: diff --git a/turbo.json b/turbo.json index 01189b5f..67bff6c0 100644 --- a/turbo.json +++ b/turbo.json @@ -11,7 +11,8 @@ "REMOTE_CACHE_SERVER_BASE_URL", "SERVER_STARTED", "PORT", - "PPR_ENABLED" + "PPR_ENABLED", + "NEXT_PRIVATE_DEBUG_CACHE" ], "outputs": [".next/**", "!.next/cache/**", "dist/**", "out/**"] }, From 44b59239a615fb4c7b1f0991dcc1ebb9379a74f5 Mon Sep 17 00:00:00 2001 From: better-salmon <132773930+better-salmon@users.noreply.github.com> Date: Thu, 27 Feb 2025 22:58:19 +0300 Subject: [PATCH 02/16] Upgrade Next.js --- apps/cache-testing/package.json | 16 +- docs/cache-handler-docs/package.json | 10 +- internal/backend/package.json | 2 +- internal/eslint-config/package.json | 12 +- internal/next-common/package.json | 4 +- internal/next-lru-cache/package.json | 2 +- package.json | 12 +- packages/cache-handler/package.json | 12 +- packages/json-replacer-reviver/package.json | 4 +- packages/server/package.json | 10 +- pnpm-lock.yaml | 1247 ++++++------------- pnpm-workspace.yaml | 12 +- 12 files changed, 424 insertions(+), 919 deletions(-) diff --git a/apps/cache-testing/package.json b/apps/cache-testing/package.json index 79161814..e9f1e3f7 100644 --- a/apps/cache-testing/package.json +++ b/apps/cache-testing/package.json @@ -17,20 +17,20 @@ }, "dependencies": { "@neshca/cache-handler": "workspace:*", - "axios": "1.7.9", - "next": "14.2.15", - "react": "18.3.1", - "react-dom": "18.3.1", + "axios": "1.8.1", + "next": "15.2.0", + "react": "19.0.0", + "react-dom": "19.0.0", "redis": "4.7.0" }, "devDependencies": { "@playwright/test": "1.50.1", "@repo/eslint-config": "workspace:*", "@repo/typescript-config": "workspace:*", - "@types/node": "22.13.4", - "@types/react": "18.3.12", - "@types/react-dom": "18.3.1", - "eslint": "9.20.1", + "@types/node": "22.13.5", + "@types/react": "19.0.10", + "@types/react-dom": "19.0.4", + "eslint": "9.21.0", "fastify": "5.2.1", "pm2": "5.4.3", "tsx": "4.19.3", diff --git a/docs/cache-handler-docs/package.json b/docs/cache-handler-docs/package.json index 19def9d5..0a25e4aa 100644 --- a/docs/cache-handler-docs/package.json +++ b/docs/cache-handler-docs/package.json @@ -11,7 +11,7 @@ "start:docs": "serve out" }, "dependencies": { - "next": "15.1.6", + "next": "15.2.0", "nextra": "4.2.13", "nextra-theme-docs": "4.2.13", "react": "19.0.0", @@ -20,10 +20,10 @@ "devDependencies": { "@repo/eslint-config": "workspace:*", "@repo/typescript-config": "workspace:*", - "@types/node": "22.13.4", - "@types/react": "19.0.8", - "@types/react-dom": "19.0.3", - "eslint": "9.20.1", + "@types/node": "22.13.5", + "@types/react": "19.0.10", + "@types/react-dom": "19.0.4", + "eslint": "9.21.0", "pagefind": "1.3.0", "serve": "14.2.4", "typescript": "5.7.3" diff --git a/internal/backend/package.json b/internal/backend/package.json index f3eb9b72..b87ebd9f 100644 --- a/internal/backend/package.json +++ b/internal/backend/package.json @@ -14,7 +14,7 @@ }, "devDependencies": { "@repo/typescript-config": "workspace:*", - "@types/node": "22.13.4", + "@types/node": "22.13.5", "pino-pretty": "13.0.0", "tsx": "4.19.3", "typescript": "5.7.3" diff --git a/internal/eslint-config/package.json b/internal/eslint-config/package.json index e792fcb1..4c1bdfd4 100644 --- a/internal/eslint-config/package.json +++ b/internal/eslint-config/package.json @@ -7,15 +7,15 @@ "./next-js": "./next.js" }, "devDependencies": { - "@eslint/js": "9.20.0", - "@next/eslint-plugin-next": "15.1.7", - "eslint": "9.20.1", - "eslint-config-prettier": "10.0.1", + "@eslint/js": "9.21.0", + "@next/eslint-plugin-next": "15.2.0", + "eslint": "9.21.0", + "eslint-config-prettier": "10.0.2", "eslint-plugin-react": "7.37.4", "eslint-plugin-react-hooks": "5.1.0", - "eslint-plugin-turbo": "2.4.2", + "eslint-plugin-turbo": "2.4.4", "globals": "16.0.0", "typescript": "5.7.3", - "typescript-eslint": "8.24.1" + "typescript-eslint": "8.25.0" } } diff --git a/internal/next-common/package.json b/internal/next-common/package.json index f19eb15e..2392c3f3 100644 --- a/internal/next-common/package.json +++ b/internal/next-common/package.json @@ -8,11 +8,11 @@ "types": "./src/next-common.ts" }, "dependencies": { - "next": "14.2.15" + "next": "15.2.0" }, "devDependencies": { "@repo/typescript-config": "workspace:*", - "@types/node": "22.13.4", + "@types/node": "22.13.5", "typescript": "5.7.3" } } diff --git a/internal/next-lru-cache/package.json b/internal/next-lru-cache/package.json index c0f7287d..a9097839 100644 --- a/internal/next-lru-cache/package.json +++ b/internal/next-lru-cache/package.json @@ -13,7 +13,7 @@ "devDependencies": { "@repo/next-common": "workspace:*", "@repo/typescript-config": "workspace:*", - "@types/node": "22.13.4", + "@types/node": "22.13.5", "typescript": "5.7.3" } } diff --git a/package.json b/package.json index 304c72a2..5a50dd96 100644 --- a/package.json +++ b/package.json @@ -27,18 +27,12 @@ "devDependencies": { "@biomejs/biome": "1.9.4", "@changesets/cli": "2.28.1", - "prettier": "3.5.1", + "prettier": "3.5.2", "prettier-plugin-packagejson": "2.5.8", - "turbo": "2.4.2" + "turbo": "2.4.4" }, - "packageManager": "pnpm@10.2.1+sha512.398035c7bd696d0ba0b10a688ed558285329d27ea994804a52bad9167d8e3a72bcb993f9699585d3ca25779ac64949ef422757a6c31102c12ab932e5cbe5cc92", + "packageManager": "pnpm@10.5.2+sha512.da9dc28cd3ff40d0592188235ab25d3202add8a207afbedc682220e4a0029ffbff4562102b9e6e46b4e3f9e8bd53e6d05de48544b0c57d4b0179e22c76d1199b", "engines": { "node": ">=22.11.0" - }, - "pnpm": { - "onlyBuiltDependencies": [ - "@biomejs/biome", - "esbuild" - ] } } diff --git a/packages/cache-handler/package.json b/packages/cache-handler/package.json index 3ad72db1..63cabf06 100644 --- a/packages/cache-handler/package.json +++ b/packages/cache-handler/package.json @@ -86,17 +86,13 @@ "@repo/next-common": "workspace:*", "@repo/next-lru-cache": "workspace:*", "@repo/typescript-config": "workspace:*", - "@types/node": "22.13.4", - "tsup": "8.3.6", + "@types/node": "22.13.5", + "tsup": "8.4.0", "tsx": "4.19.3", "typescript": "5.7.3" }, "peerDependencies": { - "next": ">= 13.5.1 < 15", + "next": ">= 15 < 16", "redis": ">= 4.6" - }, - "distTags": [ - "next13.5", - "next14" - ] + } } diff --git a/packages/json-replacer-reviver/package.json b/packages/json-replacer-reviver/package.json index bd3a5d32..b9f7c8cb 100644 --- a/packages/json-replacer-reviver/package.json +++ b/packages/json-replacer-reviver/package.json @@ -27,8 +27,8 @@ }, "devDependencies": { "@repo/typescript-config": "workspace:*", - "@types/node": "22.13.4", - "tsup": "8.3.6", + "@types/node": "22.13.5", + "tsup": "8.4.0", "tsx": "4.19.3", "typescript": "5.7.3" } diff --git a/packages/server/package.json b/packages/server/package.json index 72589ab0..1035bfcc 100644 --- a/packages/server/package.json +++ b/packages/server/package.json @@ -31,13 +31,9 @@ "@repo/next-common": "workspace:*", "@repo/next-lru-cache": "workspace:*", "@repo/typescript-config": "workspace:*", - "@types/node": "22.13.4", - "tsup": "8.3.6", + "@types/node": "22.13.5", + "tsup": "8.4.0", "tsx": "4.19.3", "typescript": "5.7.3" - }, - "distTags": [ - "next13.5", - "next14" - ] + } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 6090f3af..9b6e112f 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -15,14 +15,14 @@ importers: specifier: 2.28.1 version: 2.28.1 prettier: - specifier: 3.5.1 - version: 3.5.1 + specifier: 3.5.2 + version: 3.5.2 prettier-plugin-packagejson: specifier: 2.5.8 - version: 2.5.8(prettier@3.5.1) + version: 2.5.8(prettier@3.5.2) turbo: - specifier: 2.4.2 - version: 2.4.2 + specifier: 2.4.4 + version: 2.4.4 apps/cache-testing: dependencies: @@ -30,17 +30,17 @@ importers: specifier: workspace:* version: link:../../packages/cache-handler axios: - specifier: 1.7.9 - version: 1.7.9 + specifier: 1.8.1 + version: 1.8.1 next: - specifier: 14.2.15 - version: 14.2.15(@playwright/test@1.50.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + specifier: 15.2.0 + version: 15.2.0(@playwright/test@1.50.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) react: - specifier: 18.3.1 - version: 18.3.1 + specifier: 19.0.0 + version: 19.0.0 react-dom: - specifier: 18.3.1 - version: 18.3.1(react@18.3.1) + specifier: 19.0.0 + version: 19.0.0(react@19.0.0) redis: specifier: 4.7.0 version: 4.7.0 @@ -55,17 +55,17 @@ importers: specifier: workspace:* version: link:../../internal/typescript-config '@types/node': - specifier: 22.13.4 - version: 22.13.4 + specifier: 22.13.5 + version: 22.13.5 '@types/react': - specifier: 18.3.12 - version: 18.3.12 + specifier: 19.0.10 + version: 19.0.10 '@types/react-dom': - specifier: 18.3.1 - version: 18.3.1 + specifier: 19.0.4 + version: 19.0.4(@types/react@19.0.10) eslint: - specifier: 9.20.1 - version: 9.20.1 + specifier: 9.21.0 + version: 9.21.0 fastify: specifier: 5.2.1 version: 5.2.1 @@ -82,14 +82,14 @@ importers: docs/cache-handler-docs: dependencies: next: - specifier: 15.1.6 - version: 15.1.6(@playwright/test@1.50.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + specifier: 15.2.0 + version: 15.2.0(@playwright/test@1.50.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) nextra: specifier: 4.2.13 - version: 4.2.13(acorn@8.14.0)(next@15.1.6(@playwright/test@1.50.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3) + version: 4.2.13(acorn@8.14.0)(next@15.2.0(@playwright/test@1.50.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3) nextra-theme-docs: specifier: 4.2.13 - version: 4.2.13(@types/react@19.0.8)(next@15.1.6(@playwright/test@1.50.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(nextra@4.2.13(acorn@8.14.0)(next@15.1.6(@playwright/test@1.50.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3))(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + version: 4.2.13(@types/react@19.0.10)(next@15.2.0(@playwright/test@1.50.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(nextra@4.2.13(acorn@8.14.0)(next@15.2.0(@playwright/test@1.50.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3))(react-dom@19.0.0(react@19.0.0))(react@19.0.0) react: specifier: 19.0.0 version: 19.0.0 @@ -104,17 +104,17 @@ importers: specifier: workspace:* version: link:../../internal/typescript-config '@types/node': - specifier: 22.13.4 - version: 22.13.4 + specifier: 22.13.5 + version: 22.13.5 '@types/react': - specifier: 19.0.8 - version: 19.0.8 + specifier: 19.0.10 + version: 19.0.10 '@types/react-dom': - specifier: 19.0.3 - version: 19.0.3(@types/react@19.0.8) + specifier: 19.0.4 + version: 19.0.4(@types/react@19.0.10) eslint: - specifier: 9.20.1 - version: 9.20.1 + specifier: 9.21.0 + version: 9.21.0 pagefind: specifier: 1.3.0 version: 1.3.0 @@ -138,8 +138,8 @@ importers: specifier: workspace:* version: link:../typescript-config '@types/node': - specifier: 22.13.4 - version: 22.13.4 + specifier: 22.13.5 + version: 22.13.5 pino-pretty: specifier: 13.0.0 version: 13.0.0 @@ -153,26 +153,26 @@ importers: internal/eslint-config: devDependencies: '@eslint/js': - specifier: 9.20.0 - version: 9.20.0 + specifier: 9.21.0 + version: 9.21.0 '@next/eslint-plugin-next': - specifier: 15.1.7 - version: 15.1.7 + specifier: 15.2.0 + version: 15.2.0 eslint: - specifier: 9.20.1 - version: 9.20.1 + specifier: 9.21.0 + version: 9.21.0 eslint-config-prettier: - specifier: 10.0.1 - version: 10.0.1(eslint@9.20.1) + specifier: 10.0.2 + version: 10.0.2(eslint@9.21.0) eslint-plugin-react: specifier: 7.37.4 - version: 7.37.4(eslint@9.20.1) + version: 7.37.4(eslint@9.21.0) eslint-plugin-react-hooks: specifier: 5.1.0 - version: 5.1.0(eslint@9.20.1) + version: 5.1.0(eslint@9.21.0) eslint-plugin-turbo: - specifier: 2.4.2 - version: 2.4.2(eslint@9.20.1)(turbo@2.4.2) + specifier: 2.4.4 + version: 2.4.4(eslint@9.21.0)(turbo@2.4.4) globals: specifier: 16.0.0 version: 16.0.0 @@ -180,21 +180,21 @@ importers: specifier: 5.7.3 version: 5.7.3 typescript-eslint: - specifier: 8.24.1 - version: 8.24.1(eslint@9.20.1)(typescript@5.7.3) + specifier: 8.25.0 + version: 8.25.0(eslint@9.21.0)(typescript@5.7.3) internal/next-common: dependencies: next: - specifier: 14.2.15 - version: 14.2.15(@playwright/test@1.50.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + specifier: 15.2.0 + version: 15.2.0(@playwright/test@1.50.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) devDependencies: '@repo/typescript-config': specifier: workspace:* version: link:../typescript-config '@types/node': - specifier: 22.13.4 - version: 22.13.4 + specifier: 22.13.5 + version: 22.13.5 typescript: specifier: 5.7.3 version: 5.7.3 @@ -212,8 +212,8 @@ importers: specifier: workspace:* version: link:../typescript-config '@types/node': - specifier: 22.13.4 - version: 22.13.4 + specifier: 22.13.5 + version: 22.13.5 typescript: specifier: 5.7.3 version: 5.7.3 @@ -229,8 +229,8 @@ importers: specifier: 10.4.3 version: 10.4.3 next: - specifier: '>= 13.5.1 < 15' - version: 14.2.15(@playwright/test@1.50.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + specifier: '>= 15 < 16' + version: 15.2.0(@playwright/test@1.50.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) redis: specifier: '>= 4.6' version: 4.7.0 @@ -245,11 +245,11 @@ importers: specifier: workspace:* version: link:../../internal/typescript-config '@types/node': - specifier: 22.13.4 - version: 22.13.4 + specifier: 22.13.5 + version: 22.13.5 tsup: - specifier: 8.3.6 - version: 8.3.6(postcss@8.4.31)(tsx@4.19.3)(typescript@5.7.3)(yaml@2.7.0) + specifier: 8.4.0 + version: 8.4.0(postcss@8.4.31)(tsx@4.19.3)(typescript@5.7.3)(yaml@2.7.0) tsx: specifier: 4.19.3 version: 4.19.3 @@ -263,11 +263,11 @@ importers: specifier: workspace:* version: link:../../internal/typescript-config '@types/node': - specifier: 22.13.4 - version: 22.13.4 + specifier: 22.13.5 + version: 22.13.5 tsup: - specifier: 8.3.6 - version: 8.3.6(postcss@8.4.31)(tsx@4.19.3)(typescript@5.7.3)(yaml@2.7.0) + specifier: 8.4.0 + version: 8.4.0(postcss@8.4.31)(tsx@4.19.3)(typescript@5.7.3)(yaml@2.7.0) tsx: specifier: 4.19.3 version: 4.19.3 @@ -294,11 +294,11 @@ importers: specifier: workspace:* version: link:../../internal/typescript-config '@types/node': - specifier: 22.13.4 - version: 22.13.4 + specifier: 22.13.5 + version: 22.13.5 tsup: - specifier: 8.3.6 - version: 8.3.6(postcss@8.4.31)(tsx@4.19.3)(typescript@5.7.3)(yaml@2.7.0) + specifier: 8.4.0 + version: 8.4.0(postcss@8.4.31)(tsx@4.19.3)(typescript@5.7.3)(yaml@2.7.0) tsx: specifier: 4.19.3 version: 4.19.3 @@ -447,300 +447,150 @@ packages: '@emnapi/runtime@1.3.1': resolution: {integrity: sha512-kEBmG8KyqtxJZv+ygbEim+KCGtIq1fC22Ms3S4ziXmYKm8uyoLX0MHONVKwp+9opg390VaKRNt4a7A9NwmpNhw==} - '@esbuild/aix-ppc64@0.24.2': - resolution: {integrity: sha512-thpVCb/rhxE/BnMLQ7GReQLLN8q9qbHmI55F4489/ByVg2aQaQ6kbcLb6FHkocZzQhxc4gx0sCk0tJkKBFzDhA==} - engines: {node: '>=18'} - cpu: [ppc64] - os: [aix] - '@esbuild/aix-ppc64@0.25.0': resolution: {integrity: sha512-O7vun9Sf8DFjH2UtqK8Ku3LkquL9SZL8OLY1T5NZkA34+wG3OQF7cl4Ql8vdNzM6fzBbYfLaiRLIOZ+2FOCgBQ==} engines: {node: '>=18'} cpu: [ppc64] os: [aix] - '@esbuild/android-arm64@0.24.2': - resolution: {integrity: sha512-cNLgeqCqV8WxfcTIOeL4OAtSmL8JjcN6m09XIgro1Wi7cF4t/THaWEa7eL5CMoMBdjoHOTh/vwTO/o2TRXIyzg==} - engines: {node: '>=18'} - cpu: [arm64] - os: [android] - '@esbuild/android-arm64@0.25.0': resolution: {integrity: sha512-grvv8WncGjDSyUBjN9yHXNt+cq0snxXbDxy5pJtzMKGmmpPxeAmAhWxXI+01lU5rwZomDgD3kJwulEnhTRUd6g==} engines: {node: '>=18'} cpu: [arm64] os: [android] - '@esbuild/android-arm@0.24.2': - resolution: {integrity: sha512-tmwl4hJkCfNHwFB3nBa8z1Uy3ypZpxqxfTQOcHX+xRByyYgunVbZ9MzUUfb0RxaHIMnbHagwAxuTL+tnNM+1/Q==} - engines: {node: '>=18'} - cpu: [arm] - os: [android] - '@esbuild/android-arm@0.25.0': resolution: {integrity: sha512-PTyWCYYiU0+1eJKmw21lWtC+d08JDZPQ5g+kFyxP0V+es6VPPSUhM6zk8iImp2jbV6GwjX4pap0JFbUQN65X1g==} engines: {node: '>=18'} cpu: [arm] os: [android] - '@esbuild/android-x64@0.24.2': - resolution: {integrity: sha512-B6Q0YQDqMx9D7rvIcsXfmJfvUYLoP722bgfBlO5cGvNVb5V/+Y7nhBE3mHV9OpxBf4eAS2S68KZztiPaWq4XYw==} - engines: {node: '>=18'} - cpu: [x64] - os: [android] - '@esbuild/android-x64@0.25.0': resolution: {integrity: sha512-m/ix7SfKG5buCnxasr52+LI78SQ+wgdENi9CqyCXwjVR2X4Jkz+BpC3le3AoBPYTC9NHklwngVXvbJ9/Akhrfg==} engines: {node: '>=18'} cpu: [x64] os: [android] - '@esbuild/darwin-arm64@0.24.2': - resolution: {integrity: sha512-kj3AnYWc+CekmZnS5IPu9D+HWtUI49hbnyqk0FLEJDbzCIQt7hg7ucF1SQAilhtYpIujfaHr6O0UHlzzSPdOeA==} - engines: {node: '>=18'} - cpu: [arm64] - os: [darwin] - '@esbuild/darwin-arm64@0.25.0': resolution: {integrity: sha512-mVwdUb5SRkPayVadIOI78K7aAnPamoeFR2bT5nszFUZ9P8UpK4ratOdYbZZXYSqPKMHfS1wdHCJk1P1EZpRdvw==} engines: {node: '>=18'} cpu: [arm64] os: [darwin] - '@esbuild/darwin-x64@0.24.2': - resolution: {integrity: sha512-WeSrmwwHaPkNR5H3yYfowhZcbriGqooyu3zI/3GGpF8AyUdsrrP0X6KumITGA9WOyiJavnGZUwPGvxvwfWPHIA==} - engines: {node: '>=18'} - cpu: [x64] - os: [darwin] - '@esbuild/darwin-x64@0.25.0': resolution: {integrity: sha512-DgDaYsPWFTS4S3nWpFcMn/33ZZwAAeAFKNHNa1QN0rI4pUjgqf0f7ONmXf6d22tqTY+H9FNdgeaAa+YIFUn2Rg==} engines: {node: '>=18'} cpu: [x64] os: [darwin] - '@esbuild/freebsd-arm64@0.24.2': - resolution: {integrity: sha512-UN8HXjtJ0k/Mj6a9+5u6+2eZ2ERD7Edt1Q9IZiB5UZAIdPnVKDoG7mdTVGhHJIeEml60JteamR3qhsr1r8gXvg==} - engines: {node: '>=18'} - cpu: [arm64] - os: [freebsd] - '@esbuild/freebsd-arm64@0.25.0': resolution: {integrity: sha512-VN4ocxy6dxefN1MepBx/iD1dH5K8qNtNe227I0mnTRjry8tj5MRk4zprLEdG8WPyAPb93/e4pSgi1SoHdgOa4w==} engines: {node: '>=18'} cpu: [arm64] os: [freebsd] - '@esbuild/freebsd-x64@0.24.2': - resolution: {integrity: sha512-TvW7wE/89PYW+IevEJXZ5sF6gJRDY/14hyIGFXdIucxCsbRmLUcjseQu1SyTko+2idmCw94TgyaEZi9HUSOe3Q==} - engines: {node: '>=18'} - cpu: [x64] - os: [freebsd] - '@esbuild/freebsd-x64@0.25.0': resolution: {integrity: sha512-mrSgt7lCh07FY+hDD1TxiTyIHyttn6vnjesnPoVDNmDfOmggTLXRv8Id5fNZey1gl/V2dyVK1VXXqVsQIiAk+A==} engines: {node: '>=18'} cpu: [x64] os: [freebsd] - '@esbuild/linux-arm64@0.24.2': - resolution: {integrity: sha512-7HnAD6074BW43YvvUmE/35Id9/NB7BeX5EoNkK9obndmZBUk8xmJJeU7DwmUeN7tkysslb2eSl6CTrYz6oEMQg==} - engines: {node: '>=18'} - cpu: [arm64] - os: [linux] - '@esbuild/linux-arm64@0.25.0': resolution: {integrity: sha512-9QAQjTWNDM/Vk2bgBl17yWuZxZNQIF0OUUuPZRKoDtqF2k4EtYbpyiG5/Dk7nqeK6kIJWPYldkOcBqjXjrUlmg==} engines: {node: '>=18'} cpu: [arm64] os: [linux] - '@esbuild/linux-arm@0.24.2': - resolution: {integrity: sha512-n0WRM/gWIdU29J57hJyUdIsk0WarGd6To0s+Y+LwvlC55wt+GT/OgkwoXCXvIue1i1sSNWblHEig00GBWiJgfA==} - engines: {node: '>=18'} - cpu: [arm] - os: [linux] - '@esbuild/linux-arm@0.25.0': resolution: {integrity: sha512-vkB3IYj2IDo3g9xX7HqhPYxVkNQe8qTK55fraQyTzTX/fxaDtXiEnavv9geOsonh2Fd2RMB+i5cbhu2zMNWJwg==} engines: {node: '>=18'} cpu: [arm] os: [linux] - '@esbuild/linux-ia32@0.24.2': - resolution: {integrity: sha512-sfv0tGPQhcZOgTKO3oBE9xpHuUqguHvSo4jl+wjnKwFpapx+vUDcawbwPNuBIAYdRAvIDBfZVvXprIj3HA+Ugw==} - engines: {node: '>=18'} - cpu: [ia32] - os: [linux] - '@esbuild/linux-ia32@0.25.0': resolution: {integrity: sha512-43ET5bHbphBegyeqLb7I1eYn2P/JYGNmzzdidq/w0T8E2SsYL1U6un2NFROFRg1JZLTzdCoRomg8Rvf9M6W6Gg==} engines: {node: '>=18'} cpu: [ia32] os: [linux] - '@esbuild/linux-loong64@0.24.2': - resolution: {integrity: sha512-CN9AZr8kEndGooS35ntToZLTQLHEjtVB5n7dl8ZcTZMonJ7CCfStrYhrzF97eAecqVbVJ7APOEe18RPI4KLhwQ==} - engines: {node: '>=18'} - cpu: [loong64] - os: [linux] - '@esbuild/linux-loong64@0.25.0': resolution: {integrity: sha512-fC95c/xyNFueMhClxJmeRIj2yrSMdDfmqJnyOY4ZqsALkDrrKJfIg5NTMSzVBr5YW1jf+l7/cndBfP3MSDpoHw==} engines: {node: '>=18'} cpu: [loong64] os: [linux] - '@esbuild/linux-mips64el@0.24.2': - resolution: {integrity: sha512-iMkk7qr/wl3exJATwkISxI7kTcmHKE+BlymIAbHO8xanq/TjHaaVThFF6ipWzPHryoFsesNQJPE/3wFJw4+huw==} - engines: {node: '>=18'} - cpu: [mips64el] - os: [linux] - '@esbuild/linux-mips64el@0.25.0': resolution: {integrity: sha512-nkAMFju7KDW73T1DdH7glcyIptm95a7Le8irTQNO/qtkoyypZAnjchQgooFUDQhNAy4iu08N79W4T4pMBwhPwQ==} engines: {node: '>=18'} cpu: [mips64el] os: [linux] - '@esbuild/linux-ppc64@0.24.2': - resolution: {integrity: sha512-shsVrgCZ57Vr2L8mm39kO5PPIb+843FStGt7sGGoqiiWYconSxwTiuswC1VJZLCjNiMLAMh34jg4VSEQb+iEbw==} - engines: {node: '>=18'} - cpu: [ppc64] - os: [linux] - '@esbuild/linux-ppc64@0.25.0': resolution: {integrity: sha512-NhyOejdhRGS8Iwv+KKR2zTq2PpysF9XqY+Zk77vQHqNbo/PwZCzB5/h7VGuREZm1fixhs4Q/qWRSi5zmAiO4Fw==} engines: {node: '>=18'} cpu: [ppc64] os: [linux] - '@esbuild/linux-riscv64@0.24.2': - resolution: {integrity: sha512-4eSFWnU9Hhd68fW16GD0TINewo1L6dRrB+oLNNbYyMUAeOD2yCK5KXGK1GH4qD/kT+bTEXjsyTCiJGHPZ3eM9Q==} - engines: {node: '>=18'} - cpu: [riscv64] - os: [linux] - '@esbuild/linux-riscv64@0.25.0': resolution: {integrity: sha512-5S/rbP5OY+GHLC5qXp1y/Mx//e92L1YDqkiBbO9TQOvuFXM+iDqUNG5XopAnXoRH3FjIUDkeGcY1cgNvnXp/kA==} engines: {node: '>=18'} cpu: [riscv64] os: [linux] - '@esbuild/linux-s390x@0.24.2': - resolution: {integrity: sha512-S0Bh0A53b0YHL2XEXC20bHLuGMOhFDO6GN4b3YjRLK//Ep3ql3erpNcPlEFed93hsQAjAQDNsvcK+hV90FubSw==} - engines: {node: '>=18'} - cpu: [s390x] - os: [linux] - '@esbuild/linux-s390x@0.25.0': resolution: {integrity: sha512-XM2BFsEBz0Fw37V0zU4CXfcfuACMrppsMFKdYY2WuTS3yi8O1nFOhil/xhKTmE1nPmVyvQJjJivgDT+xh8pXJA==} engines: {node: '>=18'} cpu: [s390x] os: [linux] - '@esbuild/linux-x64@0.24.2': - resolution: {integrity: sha512-8Qi4nQcCTbLnK9WoMjdC9NiTG6/E38RNICU6sUNqK0QFxCYgoARqVqxdFmWkdonVsvGqWhmm7MO0jyTqLqwj0Q==} - engines: {node: '>=18'} - cpu: [x64] - os: [linux] - '@esbuild/linux-x64@0.25.0': resolution: {integrity: sha512-9yl91rHw/cpwMCNytUDxwj2XjFpxML0y9HAOH9pNVQDpQrBxHy01Dx+vaMu0N1CKa/RzBD2hB4u//nfc+Sd3Cw==} engines: {node: '>=18'} cpu: [x64] os: [linux] - '@esbuild/netbsd-arm64@0.24.2': - resolution: {integrity: sha512-wuLK/VztRRpMt9zyHSazyCVdCXlpHkKm34WUyinD2lzK07FAHTq0KQvZZlXikNWkDGoT6x3TD51jKQ7gMVpopw==} - engines: {node: '>=18'} - cpu: [arm64] - os: [netbsd] - '@esbuild/netbsd-arm64@0.25.0': resolution: {integrity: sha512-RuG4PSMPFfrkH6UwCAqBzauBWTygTvb1nxWasEJooGSJ/NwRw7b2HOwyRTQIU97Hq37l3npXoZGYMy3b3xYvPw==} engines: {node: '>=18'} cpu: [arm64] os: [netbsd] - '@esbuild/netbsd-x64@0.24.2': - resolution: {integrity: sha512-VefFaQUc4FMmJuAxmIHgUmfNiLXY438XrL4GDNV1Y1H/RW3qow68xTwjZKfj/+Plp9NANmzbH5R40Meudu8mmw==} - engines: {node: '>=18'} - cpu: [x64] - os: [netbsd] - '@esbuild/netbsd-x64@0.25.0': resolution: {integrity: sha512-jl+qisSB5jk01N5f7sPCsBENCOlPiS/xptD5yxOx2oqQfyourJwIKLRA2yqWdifj3owQZCL2sn6o08dBzZGQzA==} engines: {node: '>=18'} cpu: [x64] os: [netbsd] - '@esbuild/openbsd-arm64@0.24.2': - resolution: {integrity: sha512-YQbi46SBct6iKnszhSvdluqDmxCJA+Pu280Av9WICNwQmMxV7nLRHZfjQzwbPs3jeWnuAhE9Jy0NrnJ12Oz+0A==} - engines: {node: '>=18'} - cpu: [arm64] - os: [openbsd] - '@esbuild/openbsd-arm64@0.25.0': resolution: {integrity: sha512-21sUNbq2r84YE+SJDfaQRvdgznTD8Xc0oc3p3iW/a1EVWeNj/SdUCbm5U0itZPQYRuRTW20fPMWMpcrciH2EJw==} engines: {node: '>=18'} cpu: [arm64] os: [openbsd] - '@esbuild/openbsd-x64@0.24.2': - resolution: {integrity: sha512-+iDS6zpNM6EnJyWv0bMGLWSWeXGN/HTaF/LXHXHwejGsVi+ooqDfMCCTerNFxEkM3wYVcExkeGXNqshc9iMaOA==} - engines: {node: '>=18'} - cpu: [x64] - os: [openbsd] - '@esbuild/openbsd-x64@0.25.0': resolution: {integrity: sha512-2gwwriSMPcCFRlPlKx3zLQhfN/2WjJ2NSlg5TKLQOJdV0mSxIcYNTMhk3H3ulL/cak+Xj0lY1Ym9ysDV1igceg==} engines: {node: '>=18'} cpu: [x64] os: [openbsd] - '@esbuild/sunos-x64@0.24.2': - resolution: {integrity: sha512-hTdsW27jcktEvpwNHJU4ZwWFGkz2zRJUz8pvddmXPtXDzVKTTINmlmga3ZzwcuMpUvLw7JkLy9QLKyGpD2Yxig==} - engines: {node: '>=18'} - cpu: [x64] - os: [sunos] - '@esbuild/sunos-x64@0.25.0': resolution: {integrity: sha512-bxI7ThgLzPrPz484/S9jLlvUAHYMzy6I0XiU1ZMeAEOBcS0VePBFxh1JjTQt3Xiat5b6Oh4x7UC7IwKQKIJRIg==} engines: {node: '>=18'} cpu: [x64] os: [sunos] - '@esbuild/win32-arm64@0.24.2': - resolution: {integrity: sha512-LihEQ2BBKVFLOC9ZItT9iFprsE9tqjDjnbulhHoFxYQtQfai7qfluVODIYxt1PgdoyQkz23+01rzwNwYfutxUQ==} - engines: {node: '>=18'} - cpu: [arm64] - os: [win32] - '@esbuild/win32-arm64@0.25.0': resolution: {integrity: sha512-ZUAc2YK6JW89xTbXvftxdnYy3m4iHIkDtK3CLce8wg8M2L+YZhIvO1DKpxrd0Yr59AeNNkTiic9YLf6FTtXWMw==} engines: {node: '>=18'} cpu: [arm64] os: [win32] - '@esbuild/win32-ia32@0.24.2': - resolution: {integrity: sha512-q+iGUwfs8tncmFC9pcnD5IvRHAzmbwQ3GPS5/ceCyHdjXubwQWI12MKWSNSMYLJMq23/IUCvJMS76PDqXe1fxA==} - engines: {node: '>=18'} - cpu: [ia32] - os: [win32] - '@esbuild/win32-ia32@0.25.0': resolution: {integrity: sha512-eSNxISBu8XweVEWG31/JzjkIGbGIJN/TrRoiSVZwZ6pkC6VX4Im/WV2cz559/TXLcYbcrDN8JtKgd9DJVIo8GA==} engines: {node: '>=18'} cpu: [ia32] os: [win32] - '@esbuild/win32-x64@0.24.2': - resolution: {integrity: sha512-7VTgWzgMGvup6aSqDPLiW5zHaxYJGTO4OokMjIlrCtf+VpEL+cXKtCvg723iguPYI5oaUNdS+/V7OU2gvXVWEg==} - engines: {node: '>=18'} - cpu: [x64] - os: [win32] - '@esbuild/win32-x64@0.25.0': resolution: {integrity: sha512-ZENoHJBxA20C2zFzh6AI4fT6RraMzjYw4xKWemRTRmRVtN9c5DcH9r/f2ihEkMjOW5eGgrwCslG/+Y/3bL+DHQ==} engines: {node: '>=18'} @@ -761,24 +611,24 @@ packages: resolution: {integrity: sha512-GNKqxfHG2ySmJOBSHg7LxeUx4xpuCoFjacmlCoYWEbaPXLwvfIjixRI12xCQZeULksQb23uiA8F40w5TojpV7w==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/core@0.11.0': - resolution: {integrity: sha512-DWUB2pksgNEb6Bz2fggIy1wh6fGgZP4Xyy/Mt0QZPiloKKXerbqq9D3SBQTlCRYOrcRPu4vuz+CGjwdfqxnoWA==} + '@eslint/core@0.12.0': + resolution: {integrity: sha512-cmrR6pytBuSMTaBweKoGMwu3EiHiEC+DoyupPmlZ0HxBJBtIxwe+j/E4XPIKNx+Q74c8lXKPwYawBf5glsTkHg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/eslintrc@3.2.0': - resolution: {integrity: sha512-grOjVNN8P3hjJn/eIETF1wwd12DdnwFDoyceUJLYYdkpbwq3nLi+4fqrTAONx7XDALqlL220wC/RHSC/QTI/0w==} + '@eslint/eslintrc@3.3.0': + resolution: {integrity: sha512-yaVPAiNAalnCZedKLdR21GOGILMLKPyqSLWaAjQFvYA2i/ciDi8ArYVr69Anohb6cH2Ukhqti4aFnYyPm8wdwQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/js@9.20.0': - resolution: {integrity: sha512-iZA07H9io9Wn836aVTytRaNqh00Sad+EamwOVJT12GTLw1VGMFV/4JaME+JjLtr9fiGaoWgYnS54wrfWsSs4oQ==} + '@eslint/js@9.21.0': + resolution: {integrity: sha512-BqStZ3HX8Yz6LvsF5ByXYrtigrV5AXADWLAGc7PH/1SxOb7/FIYYMszZZWiUou/GB9P2lXWk2SV4d+Z8h0nknw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@eslint/object-schema@2.1.6': resolution: {integrity: sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/plugin-kit@0.2.6': - resolution: {integrity: sha512-+0TjwR1eAUdZtvv/ir1mGX+v0tUoR3VEPB8Up0LLJC+whRW0GgBBtpbOkg/a/U4Dxa6l5a3l9AJ1aWIQVyoWJA==} + '@eslint/plugin-kit@0.2.7': + resolution: {integrity: sha512-JubJ5B2pJ4k4yGxaNLdbjrnk9d/iDz6/q8wOilpIowd6PJPgaxCuHBnBszq7Ce2TyMrywm5r4PnKm6V3iiZF+g==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@fastify/ajv-compiler@4.0.2': @@ -1083,113 +933,56 @@ packages: resolution: {integrity: sha512-jMxvwzkKzd3cXo2EB9GM2ic0eYo2rP/BS6gJt6HnWbsDO1O8GSD4k7o2Cpr2YERtMpGF/MGcDfsfj2EbQPtrXw==} engines: {node: '>= 10'} - '@next/env@14.2.15': - resolution: {integrity: sha512-S1qaj25Wru2dUpcIZMjxeMVSwkt8BK4dmWHHiBuRstcIyOsMapqT4A4jSB6onvqeygkSSmOkyny9VVx8JIGamQ==} + '@next/env@15.2.0': + resolution: {integrity: sha512-eMgJu1RBXxxqqnuRJQh5RozhskoNUDHBFybvi+Z+yK9qzKeG7dadhv/Vp1YooSZmCnegf7JxWuapV77necLZNA==} - '@next/env@15.1.6': - resolution: {integrity: sha512-d9AFQVPEYNr+aqokIiPLNK/MTyt3DWa/dpKveiAaVccUadFbhFEvY6FXYX2LJO2Hv7PHnLBu2oWwB4uBuHjr/w==} + '@next/eslint-plugin-next@15.2.0': + resolution: {integrity: sha512-jHFUG2OwmAuOASqq253RAEG/5BYcPHn27p1NoWZDCf4OdvdK0yRYWX92YKkL+Mk2s+GyJrmd/GATlL5b2IySpw==} - '@next/eslint-plugin-next@15.1.7': - resolution: {integrity: sha512-kRP7RjSxfTO13NE317ek3mSGzoZlI33nc/i5hs1KaWpK+egs85xg0DJ4p32QEiHnR0mVjuUfhRIun7awqfL7pQ==} - - '@next/swc-darwin-arm64@14.2.15': - resolution: {integrity: sha512-Rvh7KU9hOUBnZ9TJ28n2Oa7dD9cvDBKua9IKx7cfQQ0GoYUwg9ig31O2oMwH3wm+pE3IkAQ67ZobPfEgurPZIA==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [darwin] - - '@next/swc-darwin-arm64@15.1.6': - resolution: {integrity: sha512-u7lg4Mpl9qWpKgy6NzEkz/w0/keEHtOybmIl0ykgItBxEM5mYotS5PmqTpo+Rhg8FiOiWgwr8USxmKQkqLBCrw==} + '@next/swc-darwin-arm64@15.2.0': + resolution: {integrity: sha512-rlp22GZwNJjFCyL7h5wz9vtpBVuCt3ZYjFWpEPBGzG712/uL1bbSkS675rVAUCRZ4hjoTJ26Q7IKhr5DfJrHDA==} engines: {node: '>= 10'} cpu: [arm64] os: [darwin] - '@next/swc-darwin-x64@14.2.15': - resolution: {integrity: sha512-5TGyjFcf8ampZP3e+FyCax5zFVHi+Oe7sZyaKOngsqyaNEpOgkKB3sqmymkZfowy3ufGA/tUgDPPxpQx931lHg==} - engines: {node: '>= 10'} - cpu: [x64] - os: [darwin] - - '@next/swc-darwin-x64@15.1.6': - resolution: {integrity: sha512-x1jGpbHbZoZ69nRuogGL2MYPLqohlhnT9OCU6E6QFewwup+z+M6r8oU47BTeJcWsF2sdBahp5cKiAcDbwwK/lg==} + '@next/swc-darwin-x64@15.2.0': + resolution: {integrity: sha512-DiU85EqSHogCz80+sgsx90/ecygfCSGl5P3b4XDRVZpgujBm5lp4ts7YaHru7eVTyZMjHInzKr+w0/7+qDrvMA==} engines: {node: '>= 10'} cpu: [x64] os: [darwin] - '@next/swc-linux-arm64-gnu@14.2.15': - resolution: {integrity: sha512-3Bwv4oc08ONiQ3FiOLKT72Q+ndEMyLNsc/D3qnLMbtUYTQAmkx9E/JRu0DBpHxNddBmNT5hxz1mYBphJ3mfrrw==} + '@next/swc-linux-arm64-gnu@15.2.0': + resolution: {integrity: sha512-VnpoMaGukiNWVxeqKHwi8MN47yKGyki5q+7ql/7p/3ifuU2341i/gDwGK1rivk0pVYbdv5D8z63uu9yMw0QhpQ==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - '@next/swc-linux-arm64-gnu@15.1.6': - resolution: {integrity: sha512-jar9sFw0XewXsBzPf9runGzoivajeWJUc/JkfbLTC4it9EhU8v7tCRLH7l5Y1ReTMN6zKJO0kKAGqDk8YSO2bg==} + '@next/swc-linux-arm64-musl@15.2.0': + resolution: {integrity: sha512-ka97/ssYE5nPH4Qs+8bd8RlYeNeUVBhcnsNUmFM6VWEob4jfN9FTr0NBhXVi1XEJpj3cMfgSRW+LdE3SUZbPrw==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - '@next/swc-linux-arm64-musl@14.2.15': - resolution: {integrity: sha512-k5xf/tg1FBv/M4CMd8S+JL3uV9BnnRmoe7F+GWC3DxkTCD9aewFRH1s5rJ1zkzDa+Do4zyN8qD0N8c84Hu96FQ==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [linux] - - '@next/swc-linux-arm64-musl@15.1.6': - resolution: {integrity: sha512-+n3u//bfsrIaZch4cgOJ3tXCTbSxz0s6brJtU3SzLOvkJlPQMJ+eHVRi6qM2kKKKLuMY+tcau8XD9CJ1OjeSQQ==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [linux] - - '@next/swc-linux-x64-gnu@14.2.15': - resolution: {integrity: sha512-kE6q38hbrRbKEkkVn62reLXhThLRh6/TvgSP56GkFNhU22TbIrQDEMrO7j0IcQHcew2wfykq8lZyHFabz0oBrA==} + '@next/swc-linux-x64-gnu@15.2.0': + resolution: {integrity: sha512-zY1JduE4B3q0k2ZCE+DAF/1efjTXUsKP+VXRtrt/rJCTgDlUyyryx7aOgYXNc1d8gobys/Lof9P9ze8IyRDn7Q==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - '@next/swc-linux-x64-gnu@15.1.6': - resolution: {integrity: sha512-SpuDEXixM3PycniL4iVCLyUyvcl6Lt0mtv3am08sucskpG0tYkW1KlRhTgj4LI5ehyxriVVcfdoxuuP8csi3kQ==} + '@next/swc-linux-x64-musl@15.2.0': + resolution: {integrity: sha512-QqvLZpurBD46RhaVaVBepkVQzh8xtlUN00RlG4Iq1sBheNugamUNPuZEH1r9X1YGQo1KqAe1iiShF0acva3jHQ==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - '@next/swc-linux-x64-musl@14.2.15': - resolution: {integrity: sha512-PZ5YE9ouy/IdO7QVJeIcyLn/Rc4ml9M2G4y3kCM9MNf1YKvFY4heg3pVa/jQbMro+tP6yc4G2o9LjAz1zxD7tQ==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - - '@next/swc-linux-x64-musl@15.1.6': - resolution: {integrity: sha512-L4druWmdFSZIIRhF+G60API5sFB7suTbDRhYWSjiw0RbE+15igQvE2g2+S973pMGvwN3guw7cJUjA/TmbPWTHQ==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - - '@next/swc-win32-arm64-msvc@14.2.15': - resolution: {integrity: sha512-2raR16703kBvYEQD9HNLyb0/394yfqzmIeyp2nDzcPV4yPjqNUG3ohX6jX00WryXz6s1FXpVhsCo3i+g4RUX+g==} + '@next/swc-win32-arm64-msvc@15.2.0': + resolution: {integrity: sha512-ODZ0r9WMyylTHAN6pLtvUtQlGXBL9voljv6ujSlcsjOxhtXPI1Ag6AhZK0SE8hEpR1374WZZ5w33ChpJd5fsjw==} engines: {node: '>= 10'} cpu: [arm64] os: [win32] - '@next/swc-win32-arm64-msvc@15.1.6': - resolution: {integrity: sha512-s8w6EeqNmi6gdvM19tqKKWbCyOBvXFbndkGHl+c9YrzsLARRdCHsD9S1fMj8gsXm9v8vhC8s3N8rjuC/XrtkEg==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [win32] - - '@next/swc-win32-ia32-msvc@14.2.15': - resolution: {integrity: sha512-fyTE8cklgkyR1p03kJa5zXEaZ9El+kDNM5A+66+8evQS5e/6v0Gk28LqA0Jet8gKSOyP+OTm/tJHzMlGdQerdQ==} - engines: {node: '>= 10'} - cpu: [ia32] - os: [win32] - - '@next/swc-win32-x64-msvc@14.2.15': - resolution: {integrity: sha512-SzqGbsLsP9OwKNUG9nekShTwhj6JSB9ZLMWQ8g1gG6hdE5gQLncbnbymrwy2yVmH9nikSLYRYxYMFu78Ggp7/g==} - engines: {node: '>= 10'} - cpu: [x64] - os: [win32] - - '@next/swc-win32-x64-msvc@15.1.6': - resolution: {integrity: sha512-6xomMuu54FAFxttYr5PJbEfu96godcxBTRk1OhAvJq0/EnmFU/Ybiax30Snis4vdWZ9LGpf7Roy5fSs7v/5ROQ==} + '@next/swc-win32-x64-msvc@15.2.0': + resolution: {integrity: sha512-8+4Z3Z7xa13NdUuUAcpVNA6o76lNPniBd9Xbo02bwXQXnZgFvEopwY2at5+z7yHl47X9qbZpvwatZ2BRo3EdZw==} engines: {node: '>= 10'} cpu: [x64] os: [win32] @@ -1446,17 +1239,14 @@ packages: '@swc/helpers@0.5.15': resolution: {integrity: sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==} - '@swc/helpers@0.5.5': - resolution: {integrity: sha512-KGYxvIOXcceOAbEk4bi/dVLEK9z8sZ0uBB3Il5b1rhfClSpcX0yfRO0KmTkqR2cnQDymwLB+25ZyMzICg/cm/A==} - - '@tanstack/react-virtual@3.13.0': - resolution: {integrity: sha512-CchF0NlLIowiM2GxtsoKBkXA4uqSnY2KvnXo+kyUFD4a4ll6+J0qzoRsUPMwXV/H26lRsxgJIr/YmjYum2oEjg==} + '@tanstack/react-virtual@3.13.2': + resolution: {integrity: sha512-LceSUgABBKF6HSsHK2ZqHzQ37IKV/jlaWbHm+NyTa3/WNb/JZVcThDuTainf+PixltOOcFCYXwxbLpOX9sCx+g==} 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 - '@tanstack/virtual-core@3.13.0': - resolution: {integrity: sha512-NBKJP3OIdmZY3COJdWkSonr50FMVIi+aj5ZJ7hI/DTpEKg2RMfo/KvP8A3B/zOSpMgIe52B5E2yn7rryULzA6g==} + '@tanstack/virtual-core@3.13.2': + resolution: {integrity: sha512-Qzz4EgzMbO5gKrmqUondCjiHcuu4B1ftHb0pjCut661lXZdGoHeze9f/M8iwsK1t5LGR6aNuNGU7mxkowaW6RQ==} '@theguild/remark-mermaid@0.2.0': resolution: {integrity: sha512-o8n57TJy0OI4PCrNw8z6S+vpHtrwoQZzTA5Y3fL0U1NDRIoMg/78duWgEBFsCZcWM1G6zjE91yg1aKCsDwgE2Q==} @@ -1601,25 +1391,16 @@ packages: '@types/node@12.20.55': resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} - '@types/node@22.13.4': - resolution: {integrity: sha512-ywP2X0DYtX3y08eFVx5fNIw7/uIv8hYUKgXoK8oayJlLnKcRfEYCxWMVE1XagUdVtCJlZT1AU4LXEABW+L1Peg==} - - '@types/prop-types@15.7.14': - resolution: {integrity: sha512-gNMvNH49DJ7OJYv+KAKn0Xp45p8PLl6zo2YnvDIbTd4J6MER2BmWN49TG7n9LvkyihINxeKW8+3bfS2yDC9dzQ==} - - '@types/react-dom@18.3.1': - resolution: {integrity: sha512-qW1Mfv8taImTthu4KoXgDfLuk4bydU6Q/TkADnDWWHwi4NX4BR+LWfTp2sVmTqRrsHvyDDTelgelxJ+SsejKKQ==} + '@types/node@22.13.5': + resolution: {integrity: sha512-+lTU0PxZXn0Dr1NBtC7Y8cR21AJr87dLLU953CWA6pMxxv/UDc7jYAY90upcrie1nRcD6XNG5HOYEDtgW5TxAg==} - '@types/react-dom@19.0.3': - resolution: {integrity: sha512-0Knk+HJiMP/qOZgMyNFamlIjw9OFCsyC2ZbigmEEyXXixgre6IQpm/4V+r3qH4GC1JPvRJKInw+on2rV6YZLeA==} + '@types/react-dom@19.0.4': + resolution: {integrity: sha512-4fSQ8vWFkg+TGhePfUzVmat3eC14TXYSsiiDSLI0dVLsrm9gZFABjPy/Qu6TKgl1tq1Bu1yDsuQgY3A3DOjCcg==} peerDependencies: '@types/react': ^19.0.0 - '@types/react@18.3.12': - resolution: {integrity: sha512-D2wOSq/d6Agt28q7rSI3jhU7G6aiuzljDGZ2hTZHIkrTLUI+AF3WMeKkEZ9nN2fkBAlcktT6vcZjDFiIhMYEQw==} - - '@types/react@19.0.8': - resolution: {integrity: sha512-9P/o1IGdfmQxrujGbIMDyYaaCykhLKc0NGCtYcECNUr9UAaDe4gwvV9bR6tvd5Br1SG0j+PBpbKr2UYY8CwqSw==} + '@types/react@19.0.10': + resolution: {integrity: sha512-JuRQ9KXLEjaUNjTWpzuR231Z2WpIwczOkBEIvbHNCzQefFIT0L8IqE6NV6ULLyC1SI/i234JnDoMkfg+RjQj2g==} '@types/trusted-types@2.0.7': resolution: {integrity: sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==} @@ -1630,51 +1411,51 @@ packages: '@types/unist@3.0.3': resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==} - '@typescript-eslint/eslint-plugin@8.24.1': - resolution: {integrity: sha512-ll1StnKtBigWIGqvYDVuDmXJHVH4zLVot1yQ4fJtLpL7qacwkxJc1T0bptqw+miBQ/QfUbhl1TcQ4accW5KUyA==} + '@typescript-eslint/eslint-plugin@8.25.0': + resolution: {integrity: sha512-VM7bpzAe7JO/BFf40pIT1lJqS/z1F8OaSsUB3rpFJucQA4cOSuH2RVVVkFULN+En0Djgr29/jb4EQnedUo95KA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: '@typescript-eslint/parser': ^8.0.0 || ^8.0.0-alpha.0 eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.8.0' - '@typescript-eslint/parser@8.24.1': - resolution: {integrity: sha512-Tqoa05bu+t5s8CTZFaGpCH2ub3QeT9YDkXbPd3uQ4SfsLoh1/vv2GEYAioPoxCWJJNsenXlC88tRjwoHNts1oQ==} + '@typescript-eslint/parser@8.25.0': + resolution: {integrity: sha512-4gbs64bnbSzu4FpgMiQ1A+D+urxkoJk/kqlDJ2W//5SygaEiAP2B4GoS7TEdxgwol2el03gckFV9lJ4QOMiiHg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.8.0' - '@typescript-eslint/scope-manager@8.24.1': - resolution: {integrity: sha512-OdQr6BNBzwRjNEXMQyaGyZzgg7wzjYKfX2ZBV3E04hUCBDv3GQCHiz9RpqdUIiVrMgJGkXm3tcEh4vFSHreS2Q==} + '@typescript-eslint/scope-manager@8.25.0': + resolution: {integrity: sha512-6PPeiKIGbgStEyt4NNXa2ru5pMzQ8OYKO1hX1z53HMomrmiSB+R5FmChgQAP1ro8jMtNawz+TRQo/cSXrauTpg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/type-utils@8.24.1': - resolution: {integrity: sha512-/Do9fmNgCsQ+K4rCz0STI7lYB4phTtEXqqCAs3gZW0pnK7lWNkvWd5iW545GSmApm4AzmQXmSqXPO565B4WVrw==} + '@typescript-eslint/type-utils@8.25.0': + resolution: {integrity: sha512-d77dHgHWnxmXOPJuDWO4FDWADmGQkN5+tt6SFRZz/RtCWl4pHgFl3+WdYCn16+3teG09DY6XtEpf3gGD0a186g==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.8.0' - '@typescript-eslint/types@8.24.1': - resolution: {integrity: sha512-9kqJ+2DkUXiuhoiYIUvIYjGcwle8pcPpdlfkemGvTObzgmYfJ5d0Qm6jwb4NBXP9W1I5tss0VIAnWFumz3mC5A==} + '@typescript-eslint/types@8.25.0': + resolution: {integrity: sha512-+vUe0Zb4tkNgznQwicsvLUJgZIRs6ITeWSCclX1q85pR1iOiaj+4uZJIUp//Z27QWu5Cseiw3O3AR8hVpax7Aw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/typescript-estree@8.24.1': - resolution: {integrity: sha512-UPyy4MJ/0RE648DSKQe9g0VDSehPINiejjA6ElqnFaFIhI6ZEiZAkUI0D5MCk0bQcTf/LVqZStvQ6K4lPn/BRg==} + '@typescript-eslint/typescript-estree@8.25.0': + resolution: {integrity: sha512-ZPaiAKEZ6Blt/TPAx5Ot0EIB/yGtLI2EsGoY6F7XKklfMxYQyvtL+gT/UCqkMzO0BVFHLDlzvFqQzurYahxv9Q==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <5.8.0' - '@typescript-eslint/utils@8.24.1': - resolution: {integrity: sha512-OOcg3PMMQx9EXspId5iktsI3eMaXVwlhC8BvNnX6B5w9a4dVgpkQZuU8Hy67TolKcl+iFWq0XX+jbDGN4xWxjQ==} + '@typescript-eslint/utils@8.25.0': + resolution: {integrity: sha512-syqRbrEv0J1wywiLsK60XzHnQe/kRViI3zwFALrNEgnntn1l24Ra2KvOAWwWbWZ1lBZxZljPDGOq967dsl6fkA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.8.0' - '@typescript-eslint/visitor-keys@8.24.1': - resolution: {integrity: sha512-EwVHlp5l+2vp8CoqJm9KikPZgi3gbdZAtabKT9KPShGeOcJhsv4Zdo3oc8T8I0uKEmYoU4ItyxbptjF08enaxg==} + '@typescript-eslint/visitor-keys@8.25.0': + resolution: {integrity: sha512-kCYXKAum9CecGVHGij7muybDfTS2sD3t0L4bJsEZLkyrXUImiCTq1M3LG2SRtOhiHFwMR9wAFplpT6XHYjTkwQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@typescript/vfs@1.6.1': @@ -1841,8 +1622,8 @@ packages: avvio@9.1.0: resolution: {integrity: sha512-fYASnYi600CsH/j9EQov7lECAniYiBFiiAtBNuZYLA2leLe9qOvZzqYHFjtIj6gD2VMoMLP14834LFWvr4IfDw==} - axios@1.7.9: - resolution: {integrity: sha512-LhLcE7Hbiryz8oMDdDptSrWowmB4Bl6RCt6sIJKpRB4XtVf0iEgewX3au/pJqm+Py1kCASkb/FFKjxQaLtxJvw==} + axios@1.8.1: + resolution: {integrity: sha512-NN+fvwH/kV01dYUQ3PTOZns4LWtWhOFCAhQ/pHb88WQ1hNe5V/dvFwc4VJcDL11LT9xSX0QtsR8sWUuyOuOq7g==} bail@2.0.2: resolution: {integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==} @@ -1930,8 +1711,8 @@ packages: resolution: {integrity: sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw==} engines: {node: '>=14.16'} - caniuse-lite@1.0.30001700: - resolution: {integrity: sha512-2S6XIXwaE7K7erT8dY+kLQcpa5ms63XlRkMkReXjle+kf6c5g38vyMl+Z5y8dSxOFDhcFe+nxnn261PLxBSQsQ==} + caniuse-lite@1.0.30001701: + resolution: {integrity: sha512-faRs/AW3jA9nTwmJBSO1PQ6L/EOgsB5HMQQq4iCu5zhPgVVgO/pZRHlmatwijZKetFw8/Pr4q6dEN8sJuq8qTw==} ccount@2.0.1: resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} @@ -2125,8 +1906,8 @@ packages: peerDependencies: cytoscape: ^3.2.0 - cytoscape@3.31.0: - resolution: {integrity: sha512-zDGn1K/tfZwEnoGOcHc0H4XazqAAXAuDpcYw9mUnUjATjqljyCNGJv8uEvbvxGaGHaVshxMecyl6oc6uKzRfbw==} + cytoscape@3.31.1: + resolution: {integrity: sha512-Hx5Mtb1+hnmAKaZZ/7zL1Y5HTFYOjdDswZy/jD+1WINRU8KVi1B7+vlHdsTwY+VCFucTreoyu1RDzQJ9u0d2Hw==} engines: {node: '>=0.10'} d3-array@2.12.1: @@ -2466,11 +2247,6 @@ packages: esast-util-from-js@2.0.1: resolution: {integrity: sha512-8Ja+rNJ0Lt56Pcf3TAmpBZjmx8ZcK5Ts4cAzIOjsjevg9oSXJnl6SUQ2EevU8tv3h6ZLWmoKL5H4fgWvdvfETw==} - esbuild@0.24.2: - resolution: {integrity: sha512-+9egpBW8I3CD5XPe0n6BfT5fxLzxrlDzqydF3aviG+9ni1lDC/OvMHcxqEFV0+LANZG5R1bFMWfUrjVsdwxJvA==} - engines: {node: '>=18'} - hasBin: true - esbuild@0.25.0: resolution: {integrity: sha512-BXq5mqc8ltbaN34cDqWuYKyNhX8D/Z0J1xdtdQ8UcIIIyJyz+ZMKUt58tF3SrZ85jcfN/PZYhjR5uDQAYNVbuw==} engines: {node: '>=18'} @@ -2489,8 +2265,8 @@ packages: engines: {node: '>=6.0'} hasBin: true - eslint-config-prettier@10.0.1: - resolution: {integrity: sha512-lZBts941cyJyeaooiKxAtzoPHTN+GbQTJFAIdQbRhA4/8whaAraEh47Whw/ZFfrjNSnlAxqfm9i0XVAEkULjCw==} + eslint-config-prettier@10.0.2: + resolution: {integrity: sha512-1105/17ZIMjmCOJOPNfVdbXafLCLj3hPmkmB7dLgt7XsQ/zkxSuDerE/xgO3RxoHysR1N1whmquY0lSn2O0VLg==} hasBin: true peerDependencies: eslint: '>=7.0.0' @@ -2507,8 +2283,8 @@ packages: peerDependencies: eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7 - eslint-plugin-turbo@2.4.2: - resolution: {integrity: sha512-67IZtvOFaWDnUmYMV3luRIE1kqL+ok5MxPEsIPUqH2vQggML7jmZFZx/P9jhXAoFH+pViEz5QEzDa2DBLHqzQg==} + eslint-plugin-turbo@2.4.4: + resolution: {integrity: sha512-myEnQTjr3FkI0j1Fu0Mqnv1z8n0JW5iFTOUNzHaEevjzl+1uzMSsFwks/x8i3rGmI3EYtC1BY8K2B2pS0Vfx6w==} peerDependencies: eslint: '>6.6.0' turbo: '>2.0.0' @@ -2525,8 +2301,8 @@ packages: resolution: {integrity: sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - eslint@9.20.1: - resolution: {integrity: sha512-m1mM33o6dBUjxl2qb6wv6nGNwCAsns1eKtaQ4l/NPHeTvhiUPbtdfMyktxN4B3fgHIgsYh1VT3V9txblpQHq+g==} + eslint@9.21.0: + resolution: {integrity: sha512-KjeihdFqTPhOMXTt7StsDxriV4n66ueuF/jfPNC3j/lduHwr/ijDwJMsF+wyMJethgiKi5wniIE243vi07d3pg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} hasBin: true peerDependencies: @@ -2670,8 +2446,8 @@ packages: fastify@5.2.1: resolution: {integrity: sha512-rslrNBF67eg8/Gyn7P2URV8/6pz8kSAscFL4EThZJ8JBMaXacVdVE4hmUcnPNKERl5o/xTiBSLfdowBRhVF1WA==} - fastq@1.19.0: - resolution: {integrity: sha512-7SFSRCNjBQIZH/xZR3iy5iQYR8aGBE0h3VG6/cwlbrpdciNYBMotQav8c1XI3HjHH+NikUpP53nPdlZSdWmFzA==} + fastq@1.19.1: + resolution: {integrity: sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==} fault@2.0.1: resolution: {integrity: sha512-WtySTkS4OKev5JtpHXnib4Gxiurzh5NCGvWrFaZ34m6JehfTUhKZvn9njTfw48t6JumVQOmrKqpmGcdwxnhqBQ==} @@ -2727,8 +2503,8 @@ packages: resolution: {integrity: sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==} engines: {node: '>= 0.4'} - foreground-child@3.3.0: - resolution: {integrity: sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==} + foreground-child@3.3.1: + resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==} engines: {node: '>=14'} form-data@4.0.2: @@ -2771,8 +2547,8 @@ packages: resolution: {integrity: sha512-hymDOu5B53XvN4QT9dBmZxPX4CWhBPPLguTZ9MMFeFa/Kg0xWVfylOVNlJji/E7yTZWFd/q9GO5TxDLq156D7g==} engines: {node: '>= 4'} - get-intrinsic@1.2.7: - resolution: {integrity: sha512-VW6Pxhsrk0KAOqs3WEd0klDiF/+V7gQOpAvY1jVU/LHmaD/kQO4523aiJuikX/QAKYiW6x8Jh+RJej1almdtCA==} + get-intrinsic@1.3.0: + resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} engines: {node: '>= 0.4'} get-proto@1.0.1: @@ -2918,8 +2694,8 @@ packages: hast-util-to-html@9.0.5: resolution: {integrity: sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw==} - hast-util-to-jsx-runtime@2.3.3: - resolution: {integrity: sha512-pdpkP8YD4v+qMKn2lnKSiJvZvb3FunDmFYQvVOsoO08+eTNWdaWKPMrC5wwNICtU3dQWHhElj5Sf5jPEnv4qJg==} + hast-util-to-jsx-runtime@2.3.5: + resolution: {integrity: sha512-gHD+HoFxOMmmXLuq9f2dZDMQHVcplCVpMfBNRpJsF03yyLZvJGzsFORe8orVuYDX9k2w0VH0uF8oryFd1whqKQ==} hast-util-to-parse5@8.0.0: resolution: {integrity: sha512-3KKrV5ZVI8if87DVSi1vDeByYrkGzg4mEfeu4alwgmmIeARiBLKCZS2uw5Gb6nU9x9Yufyj3iudm6i7nl52PFw==} @@ -3285,8 +3061,8 @@ packages: resolution: {integrity: sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - local-pkg@1.0.0: - resolution: {integrity: sha512-bbgPw/wmroJsil/GgL4qjDzs5YLTBMQ99weRsok1XCDccQeehbHA/I1oRvk2NPtr7KGZgT/Y5tPRnAtMqeG2Kg==} + local-pkg@1.1.0: + resolution: {integrity: sha512-xbZBuX6gYIWrlLmZG43aAVer4ocntYO09vPy9lxd6Ns8DnR4U7N+IIeDkubinqFOHHzoMlPxTxwo0jhE7oYjAw==} engines: {node: '>=14'} locate-path@5.0.0: @@ -3416,8 +3192,8 @@ packages: mhchemparser@4.2.1: resolution: {integrity: sha512-kYmyrCirqJf3zZ9t/0wGgRZ4/ZJw//VwaRVGA75C4nhE60vtnIzhl9J9ndkX/h6hxSN7pjg/cE0VxbnNM+bnDQ==} - micromark-core-commonmark@2.0.2: - resolution: {integrity: sha512-FKjQKbxd1cibWMM1P9N+H8TwlgGgSkWZMmfuVucLCHaYqeSvJ0hFeHsIa65pA2nYbes0f8LDHPMrd9X7Ujxg9w==} + micromark-core-commonmark@2.0.3: + resolution: {integrity: sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==} micromark-extension-frontmatter@2.0.0: resolution: {integrity: sha512-C4AkuM3dA58cgZha7zVnuVxBhDsbttIMiytjgsM2XbHAB2faRVaHRle40558FBN+DJcrLNCoqG5mlrpdU4cRtg==} @@ -3515,17 +3291,17 @@ packages: micromark-util-sanitize-uri@2.0.1: resolution: {integrity: sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==} - micromark-util-subtokenize@2.0.4: - resolution: {integrity: sha512-N6hXjrin2GTJDe3MVjf5FuXpm12PGm80BrUAeub9XFXca8JZbP+oIwY4LJSVwFUCL1IPm/WwSVUN7goFHmSGGQ==} + micromark-util-subtokenize@2.1.0: + resolution: {integrity: sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA==} micromark-util-symbol@2.0.1: resolution: {integrity: sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==} - micromark-util-types@2.0.1: - resolution: {integrity: sha512-534m2WhVTddrcKVepwmVEVnUAmtrx9bfIjNoQHRqfnvdaHQiFytEhJoTgpWJvDEXCO5gLTQh3wYC1PgOJA4NSQ==} + micromark-util-types@2.0.2: + resolution: {integrity: sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==} - micromark@4.0.1: - resolution: {integrity: sha512-eBPdkcoCNvYcxQOAKAlceo5SNdzZWfF+FcSupREAzdAh9rRmE239CEQAiTwIgblwnoM8zzj35sZ5ZwvSEOF6Kw==} + micromark@4.0.2: + resolution: {integrity: sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA==} micromatch@4.0.8: resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} @@ -3634,26 +3410,8 @@ packages: react: ^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc react-dom: ^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc - next@14.2.15: - resolution: {integrity: sha512-h9ctmOokpoDphRvMGnwOJAedT6zKhwqyZML9mDtspgf4Rh3Pn7UTYKqePNoDvhsWBAO5GoPNYshnAUGIazVGmw==} - engines: {node: '>=18.17.0'} - hasBin: true - peerDependencies: - '@opentelemetry/api': ^1.1.0 - '@playwright/test': ^1.41.2 - react: ^18.2.0 - react-dom: ^18.2.0 - sass: ^1.3.0 - peerDependenciesMeta: - '@opentelemetry/api': - optional: true - '@playwright/test': - optional: true - sass: - optional: true - - next@15.1.6: - resolution: {integrity: sha512-Hch4wzbaX0vKQtalpXvUiw5sYivBy4cm5rzUKrBnUB/y436LGrvOUqYvlSeNVCWFO/770gDlltR9gqZH62ct4Q==} + next@15.2.0: + resolution: {integrity: sha512-VaiM7sZYX8KIAHBrRGSFytKknkrexNfGb8GlG6e93JqueCspuGte8i4ybn8z4ww1x3f2uzY4YpTaBEW4/hvsoQ==} engines: {node: ^18.18.0 || ^19.8.0 || >= 20.0.0} hasBin: true peerDependencies: @@ -4003,8 +3761,8 @@ packages: engines: {node: '>=10.13.0'} hasBin: true - prettier@3.5.1: - resolution: {integrity: sha512-hPpFQvHwL3Qv5AdRvBFMhnKo4tYxp0ReXiPn2bxkiohEX6mBeBwEpBSQTkD458RaaDKQMYSp4hX4UtfUTA5wDw==} + prettier@3.5.2: + resolution: {integrity: sha512-lc6npv5PH7hVqozBR7lkBNOGXV9vMwROAPlumdBkX0wTbbzPu/U1hk5yL8p2pt4Xoc+2mkT8t/sow2YrV/M5qg==} engines: {node: '>=14'} hasBin: true @@ -4037,6 +3795,9 @@ packages: resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} engines: {node: '>=6'} + quansync@0.2.2: + resolution: {integrity: sha512-PrJjqc5Sn6Jv3vlIA9LQs0XdyhCTWrFddMgNP8mGyh3OiMh6ofOES4PRIApcfOZ0wLE2jJN+5/2eyOvzTv9tqw==} + queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} @@ -4056,11 +3817,6 @@ packages: peerDependencies: react: ^17.0.0 || ^18.0.0 || ^19.0.0 - react-dom@18.3.1: - resolution: {integrity: sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==} - peerDependencies: - react: ^18.3.1 - react-dom@19.0.0: resolution: {integrity: sha512-4GV5sHFG0e/0AD4X+ySy6UJd3jVl1iNsNHdpad0qhABJ11twS3TTBnseqsKurKcsNqCEFeGL3uLpVChpIO3QfQ==} peerDependencies: @@ -4075,10 +3831,6 @@ packages: 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 - react@18.3.1: - resolution: {integrity: sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==} - engines: {node: '>=0.10.0'} - react@19.0.0: resolution: {integrity: sha512-V8AVnmPIICiWpGfm6GLzCR/W5FXLchHop40W4nXBmdlEceh16rCN8O8LNWm5bh5XUX91fh7KpA+W0TgMKmgTpQ==} engines: {node: '>=0.10.0'} @@ -4238,8 +3990,8 @@ packages: retext@9.0.0: resolution: {integrity: sha512-sbMDcpHCNjvlheSgMfEcVrZko3cDzdbe1x/e7G66dFp0Ff7Mldvi2uv6JkJQzdRcvLYE8CA8Oe8siQx8ZOgTcA==} - reusify@1.0.4: - resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} + reusify@1.1.0: + resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} rfdc@1.4.1: @@ -4296,9 +4048,6 @@ packages: sax@1.4.1: resolution: {integrity: sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==} - scheduler@0.23.2: - resolution: {integrity: sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==} - scheduler@0.25.0: resolution: {integrity: sha512-xFVuu11jh+xcO7JOAGJNOXld8/TcEHK/4CituBUeUb5hqxJLj9YuemAEuvm9gQ/+pgXYfbQuqAkiYu+u7YEsNA==} @@ -4529,19 +4278,6 @@ packages: style-to-object@1.0.8: resolution: {integrity: sha512-xT47I/Eo0rwJmaXC4oilDGDWLohVhR6o/xAQcPQN8q6QBuZVL8qMYL85kLmST5cPjAorwvqIA4qXTRQoYHaL6g==} - styled-jsx@5.1.1: - resolution: {integrity: sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw==} - engines: {node: '>= 12.0.0'} - peerDependencies: - '@babel/core': '*' - babel-plugin-macros: '*' - react: '>= 16.8.0 || 17.x.x || ^18.0.0-0' - peerDependenciesMeta: - '@babel/core': - optional: true - babel-plugin-macros: - optional: true - styled-jsx@5.1.6: resolution: {integrity: sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA==} engines: {node: '>= 12.0.0'} @@ -4657,8 +4393,8 @@ packages: tslib@2.8.1: resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} - tsup@8.3.6: - resolution: {integrity: sha512-XkVtlDV/58S9Ye0JxUUTcrQk4S+EqlOHKzg6Roa62rdjL1nGWNUstG0xgI4vanHdfIpjP448J8vlN0oK6XOJ5g==} + tsup@8.4.0: + resolution: {integrity: sha512-b+eZbPCjz10fRryaAA7C8xlIHnf8VnsaRqydheLIqwG/Mcpfk8Z5zp3HayX7GaTygkigHl5cBUs+IhcySiIexQ==} engines: {node: '>=18'} hasBin: true peerDependencies: @@ -4681,38 +4417,38 @@ packages: engines: {node: '>=18.0.0'} hasBin: true - turbo-darwin-64@2.4.2: - resolution: {integrity: sha512-HFfemyWB60CJtEvVQj9yby5rkkWw9fLAdLtAPGtPQoU3tKh8t/uzCAZKso2aPVbib9vGUuGbPGoGpaRXdVhj5g==} + turbo-darwin-64@2.4.4: + resolution: {integrity: sha512-5kPvRkLAfmWI0MH96D+/THnDMGXlFNmjeqNRj5grLKiry+M9pKj3pRuScddAXPdlxjO5Ptz06UNaOQrrYGTx1g==} cpu: [x64] os: [darwin] - turbo-darwin-arm64@2.4.2: - resolution: {integrity: sha512-uwSx1dsBSSFeEC0nxyx2O219FEsS/haiESaWwE9JI8mHkQK61s6w6fN2G586krKxyNam4AIxRltleL+O2Em94g==} + turbo-darwin-arm64@2.4.4: + resolution: {integrity: sha512-/gtHPqbGQXDFhrmy+Q/MFW2HUTUlThJ97WLLSe4bxkDrKHecDYhAjbZ4rN3MM93RV9STQb3Tqy4pZBtsd4DfCw==} cpu: [arm64] os: [darwin] - turbo-linux-64@2.4.2: - resolution: {integrity: sha512-Fy/uL8z/LAYcPbm7a1LwFnTY9pIi5FAi12iuHsgB7zHjdh4eeIKS2NIg4nroAmTcUTUZ0/cVTo4bDOCUcS3aKw==} + turbo-linux-64@2.4.4: + resolution: {integrity: sha512-SR0gri4k0bda56hw5u9VgDXLKb1Q+jrw4lM7WAhnNdXvVoep4d6LmnzgMHQQR12Wxl3KyWPbkz9d1whL6NTm2Q==} cpu: [x64] os: [linux] - turbo-linux-arm64@2.4.2: - resolution: {integrity: sha512-AEA0d8h5W/K6iiXfEgiNwWt0yqRL1NpBs8zQCLdc4/L7WeYeJW3sORWX8zt7xhutF/KW9gTm8ehKpiK6cCIsAA==} + turbo-linux-arm64@2.4.4: + resolution: {integrity: sha512-COXXwzRd3vslQIfJhXUklgEqlwq35uFUZ7hnN+AUyXx7hUOLIiD5NblL+ETrHnhY4TzWszrbwUMfe2BYWtaPQg==} cpu: [arm64] os: [linux] - turbo-windows-64@2.4.2: - resolution: {integrity: sha512-CybtIZ9wRgnnNFVN9En9G+rxsO+mwU81fvW4RpE8BWyNEkhQ8J28qYf4PaimueMxGHHp/28i/G7Kcdn2GAWG0g==} + turbo-windows-64@2.4.4: + resolution: {integrity: sha512-PV9rYNouGz4Ff3fd6sIfQy5L7HT9a4fcZoEv8PKRavU9O75G7PoDtm8scpHU10QnK0QQNLbE9qNxOAeRvF0fJg==} cpu: [x64] os: [win32] - turbo-windows-arm64@2.4.2: - resolution: {integrity: sha512-7V0yneVPL8Y3TgrkUIjw7Odmwu1tHnyIiPHFM7eFcA7U+H6hPXyCxge7nC3wOKfjhKCQqUm+Vf/k6kjmLz5G4g==} + turbo-windows-arm64@2.4.4: + resolution: {integrity: sha512-403sqp9t5sx6YGEC32IfZTVWkRAixOQomGYB8kEc6ZD+//LirSxzeCHCnM8EmSXw7l57U1G+Fb0kxgTcKPU/Lg==} cpu: [arm64] os: [win32] - turbo@2.4.2: - resolution: {integrity: sha512-Qxi0ioQCxMRUCcHKHZkTnYH8e7XCpNfg9QiJcyfWIc+ZXeaCjzV5rCGlbQlTXMAtI8qgfP8fZADv3CFtPwqdPQ==} + turbo@2.4.4: + resolution: {integrity: sha512-N9FDOVaY3yz0YCOhYIgOGYad7+m2ptvinXygw27WPLQvcZDl3+0Sa77KGVlLSiuPDChOUEnTKE9VJwLSi9BPGQ==} hasBin: true tv4@1.3.0: @@ -4754,8 +4490,8 @@ packages: resolution: {integrity: sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==} engines: {node: '>= 0.4'} - typescript-eslint@8.24.1: - resolution: {integrity: sha512-cw3rEdzDqBs70TIcb0Gdzbt6h11BSs2pS0yaq7hDWDBtCCSei1pPSUXE9qUdQ/Wm9NgFg8mKtMt1b8fTHIl1jA==} + typescript-eslint@8.25.0: + resolution: {integrity: sha512-TxRdQQLH4g7JkoFlYG3caW5v1S6kEkz8rqt80iQJZUYPq1zD1Ra7HfQBJJ88ABRaMvHAXnwRvRB4V+6sQ9xN5Q==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 @@ -5196,159 +4932,84 @@ snapshots: tslib: 2.8.1 optional: true - '@esbuild/aix-ppc64@0.24.2': - optional: true - '@esbuild/aix-ppc64@0.25.0': optional: true - '@esbuild/android-arm64@0.24.2': - optional: true - '@esbuild/android-arm64@0.25.0': optional: true - '@esbuild/android-arm@0.24.2': - optional: true - '@esbuild/android-arm@0.25.0': optional: true - '@esbuild/android-x64@0.24.2': - optional: true - '@esbuild/android-x64@0.25.0': optional: true - '@esbuild/darwin-arm64@0.24.2': - optional: true - '@esbuild/darwin-arm64@0.25.0': optional: true - '@esbuild/darwin-x64@0.24.2': - optional: true - '@esbuild/darwin-x64@0.25.0': optional: true - '@esbuild/freebsd-arm64@0.24.2': - optional: true - '@esbuild/freebsd-arm64@0.25.0': optional: true - '@esbuild/freebsd-x64@0.24.2': - optional: true - '@esbuild/freebsd-x64@0.25.0': optional: true - '@esbuild/linux-arm64@0.24.2': - optional: true - '@esbuild/linux-arm64@0.25.0': optional: true - '@esbuild/linux-arm@0.24.2': - optional: true - '@esbuild/linux-arm@0.25.0': optional: true - '@esbuild/linux-ia32@0.24.2': - optional: true - '@esbuild/linux-ia32@0.25.0': optional: true - '@esbuild/linux-loong64@0.24.2': - optional: true - '@esbuild/linux-loong64@0.25.0': optional: true - '@esbuild/linux-mips64el@0.24.2': - optional: true - '@esbuild/linux-mips64el@0.25.0': optional: true - '@esbuild/linux-ppc64@0.24.2': - optional: true - '@esbuild/linux-ppc64@0.25.0': optional: true - '@esbuild/linux-riscv64@0.24.2': - optional: true - '@esbuild/linux-riscv64@0.25.0': optional: true - '@esbuild/linux-s390x@0.24.2': - optional: true - '@esbuild/linux-s390x@0.25.0': optional: true - '@esbuild/linux-x64@0.24.2': - optional: true - '@esbuild/linux-x64@0.25.0': optional: true - '@esbuild/netbsd-arm64@0.24.2': - optional: true - '@esbuild/netbsd-arm64@0.25.0': optional: true - '@esbuild/netbsd-x64@0.24.2': - optional: true - '@esbuild/netbsd-x64@0.25.0': optional: true - '@esbuild/openbsd-arm64@0.24.2': - optional: true - '@esbuild/openbsd-arm64@0.25.0': optional: true - '@esbuild/openbsd-x64@0.24.2': - optional: true - '@esbuild/openbsd-x64@0.25.0': optional: true - '@esbuild/sunos-x64@0.24.2': - optional: true - '@esbuild/sunos-x64@0.25.0': optional: true - '@esbuild/win32-arm64@0.24.2': - optional: true - '@esbuild/win32-arm64@0.25.0': optional: true - '@esbuild/win32-ia32@0.24.2': - optional: true - '@esbuild/win32-ia32@0.25.0': optional: true - '@esbuild/win32-x64@0.24.2': - optional: true - '@esbuild/win32-x64@0.25.0': optional: true - '@eslint-community/eslint-utils@4.4.1(eslint@9.20.1)': + '@eslint-community/eslint-utils@4.4.1(eslint@9.21.0)': dependencies: - eslint: 9.20.1 + eslint: 9.21.0 eslint-visitor-keys: 3.4.3 '@eslint-community/regexpp@4.12.1': {} @@ -5361,11 +5022,11 @@ snapshots: transitivePeerDependencies: - supports-color - '@eslint/core@0.11.0': + '@eslint/core@0.12.0': dependencies: '@types/json-schema': 7.0.15 - '@eslint/eslintrc@3.2.0': + '@eslint/eslintrc@3.3.0': dependencies: ajv: 6.12.6 debug: 4.4.0 @@ -5379,13 +5040,13 @@ snapshots: transitivePeerDependencies: - supports-color - '@eslint/js@9.20.0': {} + '@eslint/js@9.21.0': {} '@eslint/object-schema@2.1.6': {} - '@eslint/plugin-kit@0.2.6': + '@eslint/plugin-kit@0.2.7': dependencies: - '@eslint/core': 0.11.0 + '@eslint/core': 0.12.0 levn: 0.4.1 '@fastify/ajv-compiler@4.0.2': @@ -5445,7 +5106,7 @@ snapshots: '@floating-ui/react': 0.26.28(react-dom@19.0.0(react@19.0.0))(react@19.0.0) '@react-aria/focus': 3.19.1(react-dom@19.0.0(react@19.0.0))(react@19.0.0) '@react-aria/interactions': 3.23.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@tanstack/react-virtual': 3.13.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@tanstack/react-virtual': 3.13.2(react-dom@19.0.0(react@19.0.0))(react@19.0.0) react: 19.0.0 react-dom: 19.0.0(react@19.0.0) @@ -5472,7 +5133,7 @@ snapshots: debug: 4.4.0 globals: 15.15.0 kolorist: 1.8.0 - local-pkg: 1.0.0 + local-pkg: 1.1.0 mlly: 1.7.4 transitivePeerDependencies: - supports-color @@ -5605,7 +5266,7 @@ snapshots: estree-util-is-identifier-name: 3.0.0 estree-util-scope: 1.0.0 estree-walker: 3.0.3 - hast-util-to-jsx-runtime: 2.3.3 + hast-util-to-jsx-runtime: 2.3.5 markdown-extensions: 2.0.0 recma-build-jsx: 1.0.0 recma-jsx: 1.0.0(acorn@8.14.0) @@ -5687,63 +5348,34 @@ snapshots: '@napi-rs/simple-git-win32-arm64-msvc': 0.1.19 '@napi-rs/simple-git-win32-x64-msvc': 0.1.19 - '@next/env@14.2.15': {} + '@next/env@15.2.0': {} - '@next/env@15.1.6': {} - - '@next/eslint-plugin-next@15.1.7': + '@next/eslint-plugin-next@15.2.0': dependencies: fast-glob: 3.3.1 - '@next/swc-darwin-arm64@14.2.15': - optional: true - - '@next/swc-darwin-arm64@15.1.6': - optional: true - - '@next/swc-darwin-x64@14.2.15': - optional: true - - '@next/swc-darwin-x64@15.1.6': - optional: true - - '@next/swc-linux-arm64-gnu@14.2.15': - optional: true - - '@next/swc-linux-arm64-gnu@15.1.6': - optional: true - - '@next/swc-linux-arm64-musl@14.2.15': - optional: true - - '@next/swc-linux-arm64-musl@15.1.6': - optional: true - - '@next/swc-linux-x64-gnu@14.2.15': - optional: true - - '@next/swc-linux-x64-gnu@15.1.6': + '@next/swc-darwin-arm64@15.2.0': optional: true - '@next/swc-linux-x64-musl@14.2.15': + '@next/swc-darwin-x64@15.2.0': optional: true - '@next/swc-linux-x64-musl@15.1.6': + '@next/swc-linux-arm64-gnu@15.2.0': optional: true - '@next/swc-win32-arm64-msvc@14.2.15': + '@next/swc-linux-arm64-musl@15.2.0': optional: true - '@next/swc-win32-arm64-msvc@15.1.6': + '@next/swc-linux-x64-gnu@15.2.0': optional: true - '@next/swc-win32-ia32-msvc@14.2.15': + '@next/swc-linux-x64-musl@15.2.0': optional: true - '@next/swc-win32-x64-msvc@14.2.15': + '@next/swc-win32-arm64-msvc@15.2.0': optional: true - '@next/swc-win32-x64-msvc@15.1.6': + '@next/swc-win32-x64-msvc@15.2.0': optional: true '@nodelib/fs.scandir@2.1.5': @@ -5756,7 +5388,7 @@ snapshots: '@nodelib/fs.walk@1.2.8': dependencies: '@nodelib/fs.scandir': 2.1.5 - fastq: 1.19.0 + fastq: 1.19.1 '@pagefind/darwin-arm64@1.3.0': optional: true @@ -6009,18 +5641,13 @@ snapshots: dependencies: tslib: 2.8.1 - '@swc/helpers@0.5.5': - dependencies: - '@swc/counter': 0.1.3 - tslib: 2.8.1 - - '@tanstack/react-virtual@3.13.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + '@tanstack/react-virtual@3.13.2(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: - '@tanstack/virtual-core': 3.13.0 + '@tanstack/virtual-core': 3.13.2 react: 19.0.0 react-dom: 19.0.0(react@19.0.0) - '@tanstack/virtual-core@3.13.0': {} + '@tanstack/virtual-core@3.13.2': {} '@theguild/remark-mermaid@0.2.0(react@19.0.0)': dependencies: @@ -6192,26 +5819,15 @@ snapshots: '@types/node@12.20.55': {} - '@types/node@22.13.4': + '@types/node@22.13.5': dependencies: undici-types: 6.20.0 - '@types/prop-types@15.7.14': {} - - '@types/react-dom@18.3.1': - dependencies: - '@types/react': 19.0.8 - - '@types/react-dom@19.0.3(@types/react@19.0.8)': + '@types/react-dom@19.0.4(@types/react@19.0.10)': dependencies: - '@types/react': 19.0.8 + '@types/react': 19.0.10 - '@types/react@18.3.12': - dependencies: - '@types/prop-types': 15.7.14 - csstype: 3.1.3 - - '@types/react@19.0.8': + '@types/react@19.0.10': dependencies: csstype: 3.1.3 @@ -6222,15 +5838,15 @@ snapshots: '@types/unist@3.0.3': {} - '@typescript-eslint/eslint-plugin@8.24.1(@typescript-eslint/parser@8.24.1(eslint@9.20.1)(typescript@5.7.3))(eslint@9.20.1)(typescript@5.7.3)': + '@typescript-eslint/eslint-plugin@8.25.0(@typescript-eslint/parser@8.25.0(eslint@9.21.0)(typescript@5.7.3))(eslint@9.21.0)(typescript@5.7.3)': dependencies: '@eslint-community/regexpp': 4.12.1 - '@typescript-eslint/parser': 8.24.1(eslint@9.20.1)(typescript@5.7.3) - '@typescript-eslint/scope-manager': 8.24.1 - '@typescript-eslint/type-utils': 8.24.1(eslint@9.20.1)(typescript@5.7.3) - '@typescript-eslint/utils': 8.24.1(eslint@9.20.1)(typescript@5.7.3) - '@typescript-eslint/visitor-keys': 8.24.1 - eslint: 9.20.1 + '@typescript-eslint/parser': 8.25.0(eslint@9.21.0)(typescript@5.7.3) + '@typescript-eslint/scope-manager': 8.25.0 + '@typescript-eslint/type-utils': 8.25.0(eslint@9.21.0)(typescript@5.7.3) + '@typescript-eslint/utils': 8.25.0(eslint@9.21.0)(typescript@5.7.3) + '@typescript-eslint/visitor-keys': 8.25.0 + eslint: 9.21.0 graphemer: 1.4.0 ignore: 5.3.2 natural-compare: 1.4.0 @@ -6239,40 +5855,40 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.24.1(eslint@9.20.1)(typescript@5.7.3)': + '@typescript-eslint/parser@8.25.0(eslint@9.21.0)(typescript@5.7.3)': dependencies: - '@typescript-eslint/scope-manager': 8.24.1 - '@typescript-eslint/types': 8.24.1 - '@typescript-eslint/typescript-estree': 8.24.1(typescript@5.7.3) - '@typescript-eslint/visitor-keys': 8.24.1 + '@typescript-eslint/scope-manager': 8.25.0 + '@typescript-eslint/types': 8.25.0 + '@typescript-eslint/typescript-estree': 8.25.0(typescript@5.7.3) + '@typescript-eslint/visitor-keys': 8.25.0 debug: 4.4.0 - eslint: 9.20.1 + eslint: 9.21.0 typescript: 5.7.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/scope-manager@8.24.1': + '@typescript-eslint/scope-manager@8.25.0': dependencies: - '@typescript-eslint/types': 8.24.1 - '@typescript-eslint/visitor-keys': 8.24.1 + '@typescript-eslint/types': 8.25.0 + '@typescript-eslint/visitor-keys': 8.25.0 - '@typescript-eslint/type-utils@8.24.1(eslint@9.20.1)(typescript@5.7.3)': + '@typescript-eslint/type-utils@8.25.0(eslint@9.21.0)(typescript@5.7.3)': dependencies: - '@typescript-eslint/typescript-estree': 8.24.1(typescript@5.7.3) - '@typescript-eslint/utils': 8.24.1(eslint@9.20.1)(typescript@5.7.3) + '@typescript-eslint/typescript-estree': 8.25.0(typescript@5.7.3) + '@typescript-eslint/utils': 8.25.0(eslint@9.21.0)(typescript@5.7.3) debug: 4.4.0 - eslint: 9.20.1 + eslint: 9.21.0 ts-api-utils: 2.0.1(typescript@5.7.3) typescript: 5.7.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/types@8.24.1': {} + '@typescript-eslint/types@8.25.0': {} - '@typescript-eslint/typescript-estree@8.24.1(typescript@5.7.3)': + '@typescript-eslint/typescript-estree@8.25.0(typescript@5.7.3)': dependencies: - '@typescript-eslint/types': 8.24.1 - '@typescript-eslint/visitor-keys': 8.24.1 + '@typescript-eslint/types': 8.25.0 + '@typescript-eslint/visitor-keys': 8.25.0 debug: 4.4.0 fast-glob: 3.3.3 is-glob: 4.0.3 @@ -6283,20 +5899,20 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.24.1(eslint@9.20.1)(typescript@5.7.3)': + '@typescript-eslint/utils@8.25.0(eslint@9.21.0)(typescript@5.7.3)': dependencies: - '@eslint-community/eslint-utils': 4.4.1(eslint@9.20.1) - '@typescript-eslint/scope-manager': 8.24.1 - '@typescript-eslint/types': 8.24.1 - '@typescript-eslint/typescript-estree': 8.24.1(typescript@5.7.3) - eslint: 9.20.1 + '@eslint-community/eslint-utils': 4.4.1(eslint@9.21.0) + '@typescript-eslint/scope-manager': 8.25.0 + '@typescript-eslint/types': 8.25.0 + '@typescript-eslint/typescript-estree': 8.25.0(typescript@5.7.3) + eslint: 9.21.0 typescript: 5.7.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/visitor-keys@8.24.1': + '@typescript-eslint/visitor-keys@8.25.0': dependencies: - '@typescript-eslint/types': 8.24.1 + '@typescript-eslint/types': 8.25.0 eslint-visitor-keys: 4.2.0 '@typescript/vfs@1.6.1(typescript@5.7.3)': @@ -6400,7 +6016,7 @@ snapshots: define-properties: 1.2.1 es-abstract: 1.23.9 es-object-atoms: 1.1.1 - get-intrinsic: 1.2.7 + get-intrinsic: 1.3.0 is-string: 1.1.1 array-iterate@2.0.1: {} @@ -6445,7 +6061,7 @@ snapshots: define-properties: 1.2.1 es-abstract: 1.23.9 es-errors: 1.3.0 - get-intrinsic: 1.2.7 + get-intrinsic: 1.3.0 is-array-buffer: 3.0.5 ast-types@0.13.4: @@ -6473,9 +6089,9 @@ snapshots: avvio@9.1.0: dependencies: '@fastify/error': 4.0.0 - fastq: 1.19.0 + fastq: 1.19.1 - axios@1.7.9: + axios@1.8.1: dependencies: follow-redirects: 1.15.9(debug@4.3.7) form-data: 4.0.2 @@ -6530,9 +6146,9 @@ snapshots: buffer-from@1.1.2: {} - bundle-require@5.1.0(esbuild@0.24.2): + bundle-require@5.1.0(esbuild@0.25.0): dependencies: - esbuild: 0.24.2 + esbuild: 0.25.0 load-tsconfig: 0.2.5 busboy@1.6.0: @@ -6552,19 +6168,19 @@ snapshots: dependencies: call-bind-apply-helpers: 1.0.2 es-define-property: 1.0.1 - get-intrinsic: 1.2.7 + get-intrinsic: 1.3.0 set-function-length: 1.2.2 call-bound@1.0.3: dependencies: call-bind-apply-helpers: 1.0.2 - get-intrinsic: 1.2.7 + get-intrinsic: 1.3.0 callsites@3.1.0: {} camelcase@7.0.1: {} - caniuse-lite@1.0.30001700: {} + caniuse-lite@1.0.30001701: {} ccount@2.0.1: {} @@ -6740,17 +6356,17 @@ snapshots: culvert@0.1.2: {} - cytoscape-cose-bilkent@4.1.0(cytoscape@3.31.0): + cytoscape-cose-bilkent@4.1.0(cytoscape@3.31.1): dependencies: cose-base: 1.0.3 - cytoscape: 3.31.0 + cytoscape: 3.31.1 - cytoscape-fcose@2.2.0(cytoscape@3.31.0): + cytoscape-fcose@2.2.0(cytoscape@3.31.1): dependencies: cose-base: 2.2.0 - cytoscape: 3.31.0 + cytoscape: 3.31.1 - cytoscape@3.31.0: {} + cytoscape@3.31.1: {} d3-array@2.12.1: dependencies: @@ -7072,7 +6688,7 @@ snapshots: es-set-tostringtag: 2.1.0 es-to-primitive: 1.3.0 function.prototype.name: 1.1.8 - get-intrinsic: 1.2.7 + get-intrinsic: 1.3.0 get-proto: 1.0.1 get-symbol-description: 1.1.0 globalthis: 1.0.4 @@ -7123,7 +6739,7 @@ snapshots: es-errors: 1.3.0 es-set-tostringtag: 2.1.0 function-bind: 1.1.2 - get-intrinsic: 1.2.7 + get-intrinsic: 1.3.0 globalthis: 1.0.4 gopd: 1.2.0 has-property-descriptors: 1.0.2 @@ -7140,7 +6756,7 @@ snapshots: es-set-tostringtag@2.1.0: dependencies: es-errors: 1.3.0 - get-intrinsic: 1.2.7 + get-intrinsic: 1.3.0 has-tostringtag: 1.0.2 hasown: 2.0.2 @@ -7168,34 +6784,6 @@ snapshots: esast-util-from-estree: 2.0.0 vfile-message: 4.0.2 - esbuild@0.24.2: - optionalDependencies: - '@esbuild/aix-ppc64': 0.24.2 - '@esbuild/android-arm': 0.24.2 - '@esbuild/android-arm64': 0.24.2 - '@esbuild/android-x64': 0.24.2 - '@esbuild/darwin-arm64': 0.24.2 - '@esbuild/darwin-x64': 0.24.2 - '@esbuild/freebsd-arm64': 0.24.2 - '@esbuild/freebsd-x64': 0.24.2 - '@esbuild/linux-arm': 0.24.2 - '@esbuild/linux-arm64': 0.24.2 - '@esbuild/linux-ia32': 0.24.2 - '@esbuild/linux-loong64': 0.24.2 - '@esbuild/linux-mips64el': 0.24.2 - '@esbuild/linux-ppc64': 0.24.2 - '@esbuild/linux-riscv64': 0.24.2 - '@esbuild/linux-s390x': 0.24.2 - '@esbuild/linux-x64': 0.24.2 - '@esbuild/netbsd-arm64': 0.24.2 - '@esbuild/netbsd-x64': 0.24.2 - '@esbuild/openbsd-arm64': 0.24.2 - '@esbuild/openbsd-x64': 0.24.2 - '@esbuild/sunos-x64': 0.24.2 - '@esbuild/win32-arm64': 0.24.2 - '@esbuild/win32-ia32': 0.24.2 - '@esbuild/win32-x64': 0.24.2 - esbuild@0.25.0: optionalDependencies: '@esbuild/aix-ppc64': 0.25.0 @@ -7236,15 +6824,15 @@ snapshots: optionalDependencies: source-map: 0.6.1 - eslint-config-prettier@10.0.1(eslint@9.20.1): + eslint-config-prettier@10.0.2(eslint@9.21.0): dependencies: - eslint: 9.20.1 + eslint: 9.21.0 - eslint-plugin-react-hooks@5.1.0(eslint@9.20.1): + eslint-plugin-react-hooks@5.1.0(eslint@9.21.0): dependencies: - eslint: 9.20.1 + eslint: 9.21.0 - eslint-plugin-react@7.37.4(eslint@9.20.1): + eslint-plugin-react@7.37.4(eslint@9.21.0): dependencies: array-includes: 3.1.8 array.prototype.findlast: 1.2.5 @@ -7252,7 +6840,7 @@ snapshots: array.prototype.tosorted: 1.1.4 doctrine: 2.1.0 es-iterator-helpers: 1.2.1 - eslint: 9.20.1 + eslint: 9.21.0 estraverse: 5.3.0 hasown: 2.0.2 jsx-ast-utils: 3.3.5 @@ -7266,11 +6854,11 @@ snapshots: string.prototype.matchall: 4.0.12 string.prototype.repeat: 1.0.0 - eslint-plugin-turbo@2.4.2(eslint@9.20.1)(turbo@2.4.2): + eslint-plugin-turbo@2.4.4(eslint@9.21.0)(turbo@2.4.4): dependencies: dotenv: 16.0.3 - eslint: 9.20.1 - turbo: 2.4.2 + eslint: 9.21.0 + turbo: 2.4.4 eslint-scope@8.2.0: dependencies: @@ -7281,15 +6869,15 @@ snapshots: eslint-visitor-keys@4.2.0: {} - eslint@9.20.1: + eslint@9.21.0: dependencies: - '@eslint-community/eslint-utils': 4.4.1(eslint@9.20.1) + '@eslint-community/eslint-utils': 4.4.1(eslint@9.21.0) '@eslint-community/regexpp': 4.12.1 '@eslint/config-array': 0.19.2 - '@eslint/core': 0.11.0 - '@eslint/eslintrc': 3.2.0 - '@eslint/js': 9.20.0 - '@eslint/plugin-kit': 0.2.6 + '@eslint/core': 0.12.0 + '@eslint/eslintrc': 3.3.0 + '@eslint/js': 9.21.0 + '@eslint/plugin-kit': 0.2.7 '@humanfs/node': 0.16.6 '@humanwhocodes/module-importer': 1.0.1 '@humanwhocodes/retry': 0.4.2 @@ -7496,9 +7084,9 @@ snapshots: semver: 7.7.1 toad-cache: 3.7.0 - fastq@1.19.0: + fastq@1.19.1: dependencies: - reusify: 1.0.4 + reusify: 1.1.0 fault@2.0.1: dependencies: @@ -7549,7 +7137,7 @@ snapshots: dependencies: is-callable: 1.2.7 - foreground-child@3.3.0: + foreground-child@3.3.1: dependencies: cross-spawn: 7.0.6 signal-exit: 4.1.0 @@ -7596,7 +7184,7 @@ snapshots: generic-pool@3.9.0: {} - get-intrinsic@1.2.7: + get-intrinsic@1.3.0: dependencies: call-bind-apply-helpers: 1.0.2 es-define-property: 1.0.1 @@ -7624,7 +7212,7 @@ snapshots: dependencies: call-bound: 1.0.3 es-errors: 1.3.0 - get-intrinsic: 1.2.7 + get-intrinsic: 1.3.0 get-tsconfig@4.10.0: dependencies: @@ -7658,7 +7246,7 @@ snapshots: glob@10.4.5: dependencies: - foreground-child: 3.3.0 + foreground-child: 3.3.1 jackspeak: 3.4.3 minimatch: 9.0.5 minipass: 7.1.2 @@ -7807,7 +7395,7 @@ snapshots: stringify-entities: 4.0.4 zwitch: 2.0.4 - hast-util-to-jsx-runtime@2.3.3: + hast-util-to-jsx-runtime@2.3.5: dependencies: '@types/estree': 1.0.6 '@types/hast': 3.0.4 @@ -7933,7 +7521,7 @@ snapshots: dependencies: call-bind: 1.0.8 call-bound: 1.0.3 - get-intrinsic: 1.2.7 + get-intrinsic: 1.3.0 is-arrayish@0.3.2: optional: true @@ -7968,7 +7556,7 @@ snapshots: is-data-view@1.0.2: dependencies: call-bound: 1.0.3 - get-intrinsic: 1.2.7 + get-intrinsic: 1.3.0 is-typed-array: 1.1.15 is-date-object@1.1.0: @@ -8067,7 +7655,7 @@ snapshots: is-weakset@2.0.4: dependencies: call-bound: 1.0.3 - get-intrinsic: 1.2.7 + get-intrinsic: 1.3.0 is-windows@1.0.2: {} @@ -8091,7 +7679,7 @@ snapshots: dependencies: define-data-property: 1.1.4 es-object-atoms: 1.1.1 - get-intrinsic: 1.2.7 + get-intrinsic: 1.3.0 get-proto: 1.0.1 has-symbols: 1.1.0 set-function-name: 2.0.2 @@ -8193,10 +7781,11 @@ snapshots: load-tsconfig@0.2.5: {} - local-pkg@1.0.0: + local-pkg@1.1.0: dependencies: mlly: 1.7.4 pkg-types: 1.3.1 + quansync: 0.2.2 locate-path@5.0.0: dependencies: @@ -8259,12 +7848,12 @@ snapshots: decode-named-character-reference: 1.0.2 devlop: 1.1.0 mdast-util-to-string: 4.0.0 - micromark: 4.0.1 + micromark: 4.0.2 micromark-util-decode-numeric-character-reference: 2.0.2 micromark-util-decode-string: 2.0.1 micromark-util-normalize-identifier: 2.0.1 micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.1 + micromark-util-types: 2.0.2 unist-util-stringify-position: 4.0.0 transitivePeerDependencies: - supports-color @@ -8441,9 +8030,9 @@ snapshots: '@iconify/utils': 2.3.0 '@mermaid-js/parser': 0.3.0 '@types/d3': 7.4.3 - cytoscape: 3.31.0 - cytoscape-cose-bilkent: 4.1.0(cytoscape@3.31.0) - cytoscape-fcose: 2.2.0(cytoscape@3.31.0) + cytoscape: 3.31.1 + cytoscape-cose-bilkent: 4.1.0(cytoscape@3.31.1) + cytoscape-fcose: 2.2.0(cytoscape@3.31.1) d3: 7.9.0 d3-sankey: 0.12.3 dagre-d3-es: 7.0.11 @@ -8462,7 +8051,7 @@ snapshots: mhchemparser@4.2.1: {} - micromark-core-commonmark@2.0.2: + micromark-core-commonmark@2.0.3: dependencies: decode-named-character-reference: 1.0.2 devlop: 1.1.0 @@ -8477,34 +8066,34 @@ snapshots: micromark-util-html-tag-name: 2.0.1 micromark-util-normalize-identifier: 2.0.1 micromark-util-resolve-all: 2.0.1 - micromark-util-subtokenize: 2.0.4 + micromark-util-subtokenize: 2.1.0 micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.1 + micromark-util-types: 2.0.2 micromark-extension-frontmatter@2.0.0: dependencies: fault: 2.0.1 micromark-util-character: 2.1.1 micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.1 + micromark-util-types: 2.0.2 micromark-extension-gfm-autolink-literal@2.1.0: dependencies: micromark-util-character: 2.1.1 micromark-util-sanitize-uri: 2.0.1 micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.1 + micromark-util-types: 2.0.2 micromark-extension-gfm-footnote@2.1.0: dependencies: devlop: 1.1.0 - micromark-core-commonmark: 2.0.2 + micromark-core-commonmark: 2.0.3 micromark-factory-space: 2.0.1 micromark-util-character: 2.1.1 micromark-util-normalize-identifier: 2.0.1 micromark-util-sanitize-uri: 2.0.1 micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.1 + micromark-util-types: 2.0.2 micromark-extension-gfm-strikethrough@2.1.0: dependencies: @@ -8513,7 +8102,7 @@ snapshots: micromark-util-classify-character: 2.0.1 micromark-util-resolve-all: 2.0.1 micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.1 + micromark-util-types: 2.0.2 micromark-extension-gfm-table@2.1.1: dependencies: @@ -8521,11 +8110,11 @@ snapshots: micromark-factory-space: 2.0.1 micromark-util-character: 2.1.1 micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.1 + micromark-util-types: 2.0.2 micromark-extension-gfm-tagfilter@2.0.0: dependencies: - micromark-util-types: 2.0.1 + micromark-util-types: 2.0.2 micromark-extension-gfm-task-list-item@2.1.0: dependencies: @@ -8533,7 +8122,7 @@ snapshots: micromark-factory-space: 2.0.1 micromark-util-character: 2.1.1 micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.1 + micromark-util-types: 2.0.2 micromark-extension-gfm@3.0.0: dependencies: @@ -8544,7 +8133,7 @@ snapshots: micromark-extension-gfm-tagfilter: 2.0.0 micromark-extension-gfm-task-list-item: 2.1.0 micromark-util-combine-extensions: 2.0.1 - micromark-util-types: 2.0.1 + micromark-util-types: 2.0.2 micromark-extension-math@3.1.0: dependencies: @@ -8554,7 +8143,7 @@ snapshots: micromark-factory-space: 2.0.1 micromark-util-character: 2.1.1 micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.1 + micromark-util-types: 2.0.2 micromark-extension-mdx-expression@3.0.0: dependencies: @@ -8565,7 +8154,7 @@ snapshots: micromark-util-character: 2.1.1 micromark-util-events-to-acorn: 2.0.2 micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.1 + micromark-util-types: 2.0.2 micromark-extension-mdx-jsx@3.0.1: dependencies: @@ -8578,22 +8167,22 @@ snapshots: micromark-util-character: 2.1.1 micromark-util-events-to-acorn: 2.0.2 micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.1 + micromark-util-types: 2.0.2 vfile-message: 4.0.2 micromark-extension-mdx-md@2.0.0: dependencies: - micromark-util-types: 2.0.1 + micromark-util-types: 2.0.2 micromark-extension-mdxjs-esm@3.0.0: dependencies: '@types/estree': 1.0.6 devlop: 1.1.0 - micromark-core-commonmark: 2.0.2 + micromark-core-commonmark: 2.0.3 micromark-util-character: 2.1.1 micromark-util-events-to-acorn: 2.0.2 micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.1 + micromark-util-types: 2.0.2 unist-util-position-from-estree: 2.0.0 vfile-message: 4.0.2 @@ -8606,20 +8195,20 @@ snapshots: micromark-extension-mdx-md: 2.0.0 micromark-extension-mdxjs-esm: 3.0.0 micromark-util-combine-extensions: 2.0.1 - micromark-util-types: 2.0.1 + micromark-util-types: 2.0.2 micromark-factory-destination@2.0.1: dependencies: micromark-util-character: 2.1.1 micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.1 + micromark-util-types: 2.0.2 micromark-factory-label@2.0.1: dependencies: devlop: 1.1.0 micromark-util-character: 2.1.1 micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.1 + micromark-util-types: 2.0.2 micromark-factory-mdx-expression@2.0.2: dependencies: @@ -8629,33 +8218,33 @@ snapshots: micromark-util-character: 2.1.1 micromark-util-events-to-acorn: 2.0.2 micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.1 + micromark-util-types: 2.0.2 unist-util-position-from-estree: 2.0.0 vfile-message: 4.0.2 micromark-factory-space@2.0.1: dependencies: micromark-util-character: 2.1.1 - micromark-util-types: 2.0.1 + micromark-util-types: 2.0.2 micromark-factory-title@2.0.1: dependencies: micromark-factory-space: 2.0.1 micromark-util-character: 2.1.1 micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.1 + micromark-util-types: 2.0.2 micromark-factory-whitespace@2.0.1: dependencies: micromark-factory-space: 2.0.1 micromark-util-character: 2.1.1 micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.1 + micromark-util-types: 2.0.2 micromark-util-character@2.1.1: dependencies: micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.1 + micromark-util-types: 2.0.2 micromark-util-chunked@2.0.1: dependencies: @@ -8665,12 +8254,12 @@ snapshots: dependencies: micromark-util-character: 2.1.1 micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.1 + micromark-util-types: 2.0.2 micromark-util-combine-extensions@2.0.1: dependencies: micromark-util-chunked: 2.0.1 - micromark-util-types: 2.0.1 + micromark-util-types: 2.0.2 micromark-util-decode-numeric-character-reference@2.0.2: dependencies: @@ -8693,7 +8282,7 @@ snapshots: devlop: 1.1.0 estree-util-visit: 2.0.0 micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.1 + micromark-util-types: 2.0.2 vfile-message: 4.0.2 micromark-util-html-tag-name@2.0.1: {} @@ -8704,7 +8293,7 @@ snapshots: micromark-util-resolve-all@2.0.1: dependencies: - micromark-util-types: 2.0.1 + micromark-util-types: 2.0.2 micromark-util-sanitize-uri@2.0.1: dependencies: @@ -8712,24 +8301,24 @@ snapshots: micromark-util-encode: 2.0.1 micromark-util-symbol: 2.0.1 - micromark-util-subtokenize@2.0.4: + micromark-util-subtokenize@2.1.0: dependencies: devlop: 1.1.0 micromark-util-chunked: 2.0.1 micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.1 + micromark-util-types: 2.0.2 micromark-util-symbol@2.0.1: {} - micromark-util-types@2.0.1: {} + micromark-util-types@2.0.2: {} - micromark@4.0.1: + micromark@4.0.2: dependencies: '@types/debug': 4.1.12 debug: 4.4.0 decode-named-character-reference: 1.0.2 devlop: 1.1.0 - micromark-core-commonmark: 2.0.2 + micromark-core-commonmark: 2.0.3 micromark-factory-space: 2.0.1 micromark-util-character: 2.1.1 micromark-util-chunked: 2.0.1 @@ -8739,9 +8328,9 @@ snapshots: micromark-util-normalize-identifier: 2.0.1 micromark-util-resolve-all: 2.0.1 micromark-util-sanitize-uri: 2.0.1 - micromark-util-subtokenize: 2.0.4 + micromark-util-subtokenize: 2.1.0 micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.1 + micromark-util-types: 2.0.2 transitivePeerDependencies: - supports-color @@ -8830,104 +8419,52 @@ snapshots: react: 19.0.0 react-dom: 19.0.0(react@19.0.0) - next@14.2.15(@playwright/test@1.50.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + next@15.2.0(@playwright/test@1.50.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0): dependencies: - '@next/env': 14.2.15 - '@swc/helpers': 0.5.5 - busboy: 1.6.0 - caniuse-lite: 1.0.30001700 - graceful-fs: 4.2.11 - postcss: 8.4.31 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - styled-jsx: 5.1.1(react@18.3.1) - optionalDependencies: - '@next/swc-darwin-arm64': 14.2.15 - '@next/swc-darwin-x64': 14.2.15 - '@next/swc-linux-arm64-gnu': 14.2.15 - '@next/swc-linux-arm64-musl': 14.2.15 - '@next/swc-linux-x64-gnu': 14.2.15 - '@next/swc-linux-x64-musl': 14.2.15 - '@next/swc-win32-arm64-msvc': 14.2.15 - '@next/swc-win32-ia32-msvc': 14.2.15 - '@next/swc-win32-x64-msvc': 14.2.15 - '@playwright/test': 1.50.1 - transitivePeerDependencies: - - '@babel/core' - - babel-plugin-macros - - next@14.2.15(@playwright/test@1.50.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0): - dependencies: - '@next/env': 14.2.15 - '@swc/helpers': 0.5.5 - busboy: 1.6.0 - caniuse-lite: 1.0.30001700 - graceful-fs: 4.2.11 - postcss: 8.4.31 - react: 19.0.0 - react-dom: 19.0.0(react@19.0.0) - styled-jsx: 5.1.1(react@19.0.0) - optionalDependencies: - '@next/swc-darwin-arm64': 14.2.15 - '@next/swc-darwin-x64': 14.2.15 - '@next/swc-linux-arm64-gnu': 14.2.15 - '@next/swc-linux-arm64-musl': 14.2.15 - '@next/swc-linux-x64-gnu': 14.2.15 - '@next/swc-linux-x64-musl': 14.2.15 - '@next/swc-win32-arm64-msvc': 14.2.15 - '@next/swc-win32-ia32-msvc': 14.2.15 - '@next/swc-win32-x64-msvc': 14.2.15 - '@playwright/test': 1.50.1 - transitivePeerDependencies: - - '@babel/core' - - babel-plugin-macros - - next@15.1.6(@playwright/test@1.50.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0): - dependencies: - '@next/env': 15.1.6 + '@next/env': 15.2.0 '@swc/counter': 0.1.3 '@swc/helpers': 0.5.15 busboy: 1.6.0 - caniuse-lite: 1.0.30001700 + caniuse-lite: 1.0.30001701 postcss: 8.4.31 react: 19.0.0 react-dom: 19.0.0(react@19.0.0) styled-jsx: 5.1.6(react@19.0.0) optionalDependencies: - '@next/swc-darwin-arm64': 15.1.6 - '@next/swc-darwin-x64': 15.1.6 - '@next/swc-linux-arm64-gnu': 15.1.6 - '@next/swc-linux-arm64-musl': 15.1.6 - '@next/swc-linux-x64-gnu': 15.1.6 - '@next/swc-linux-x64-musl': 15.1.6 - '@next/swc-win32-arm64-msvc': 15.1.6 - '@next/swc-win32-x64-msvc': 15.1.6 + '@next/swc-darwin-arm64': 15.2.0 + '@next/swc-darwin-x64': 15.2.0 + '@next/swc-linux-arm64-gnu': 15.2.0 + '@next/swc-linux-arm64-musl': 15.2.0 + '@next/swc-linux-x64-gnu': 15.2.0 + '@next/swc-linux-x64-musl': 15.2.0 + '@next/swc-win32-arm64-msvc': 15.2.0 + '@next/swc-win32-x64-msvc': 15.2.0 '@playwright/test': 1.50.1 sharp: 0.33.5 transitivePeerDependencies: - '@babel/core' - babel-plugin-macros - nextra-theme-docs@4.2.13(@types/react@19.0.8)(next@15.1.6(@playwright/test@1.50.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(nextra@4.2.13(acorn@8.14.0)(next@15.1.6(@playwright/test@1.50.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3))(react-dom@19.0.0(react@19.0.0))(react@19.0.0): + nextra-theme-docs@4.2.13(@types/react@19.0.10)(next@15.2.0(@playwright/test@1.50.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(nextra@4.2.13(acorn@8.14.0)(next@15.2.0(@playwright/test@1.50.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3))(react-dom@19.0.0(react@19.0.0))(react@19.0.0): dependencies: '@headlessui/react': 2.2.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0) clsx: 2.1.1 - next: 15.1.6(@playwright/test@1.50.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + next: 15.2.0(@playwright/test@1.50.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) next-themes: 0.4.4(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - nextra: 4.2.13(acorn@8.14.0)(next@15.1.6(@playwright/test@1.50.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3) + nextra: 4.2.13(acorn@8.14.0)(next@15.2.0(@playwright/test@1.50.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3) react: 19.0.0 react-compiler-runtime: 0.0.0-experimental-22c6e49-20241219(react@19.0.0) react-dom: 19.0.0(react@19.0.0) scroll-into-view-if-needed: 3.1.0 zod: 3.24.2 zod-validation-error: 3.4.0(zod@3.24.2) - zustand: 5.0.3(@types/react@19.0.8)(react@19.0.0) + zustand: 5.0.3(@types/react@19.0.10)(react@19.0.0) transitivePeerDependencies: - '@types/react' - immer - use-sync-external-store - nextra@4.2.13(acorn@8.14.0)(next@15.1.6(@playwright/test@1.50.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3): + nextra@4.2.13(acorn@8.14.0)(next@15.2.0(@playwright/test@1.50.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3): dependencies: '@formatjs/intl-localematcher': 0.6.0 '@headlessui/react': 2.2.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0) @@ -8948,7 +8485,7 @@ snapshots: mdast-util-gfm: 3.1.0 mdast-util-to-hast: 13.2.0 negotiator: 1.0.0 - next: 15.1.6(@playwright/test@1.50.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + next: 15.2.0(@playwright/test@1.50.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) react: 19.0.0 react-compiler-runtime: 0.0.0-experimental-22c6e49-20241219(react@19.0.0) react-dom: 19.0.0(react@19.0.0) @@ -9068,7 +8605,7 @@ snapshots: own-keys@1.0.1: dependencies: - get-intrinsic: 1.2.7 + get-intrinsic: 1.3.0 object-keys: 1.1.1 safe-push-apply: 1.0.0 @@ -9347,16 +8884,16 @@ snapshots: prelude-ls@1.2.1: {} - prettier-plugin-packagejson@2.5.8(prettier@3.5.1): + prettier-plugin-packagejson@2.5.8(prettier@3.5.2): dependencies: sort-package-json: 2.14.0 synckit: 0.9.2 optionalDependencies: - prettier: 3.5.1 + prettier: 3.5.2 prettier@2.8.8: {} - prettier@3.5.1: {} + prettier@3.5.2: {} process-warning@4.0.1: {} @@ -9396,6 +8933,8 @@ snapshots: punycode@2.3.1: {} + quansync@0.2.2: {} + queue-microtask@1.2.3: {} quick-format-unescaped@4.0.4: {} @@ -9413,12 +8952,6 @@ snapshots: dependencies: react: 19.0.0 - react-dom@18.3.1(react@18.3.1): - dependencies: - loose-envify: 1.4.0 - react: 18.3.1 - scheduler: 0.23.2 - react-dom@19.0.0(react@19.0.0): dependencies: react: 19.0.0 @@ -9431,10 +8964,6 @@ snapshots: react: 19.0.0 react-dom: 19.0.0(react@19.0.0) - react@18.3.1: - dependencies: - loose-envify: 1.4.0 - react@19.0.0: {} read-yaml-file@1.1.0: @@ -9504,7 +9033,7 @@ snapshots: es-abstract: 1.23.9 es-errors: 1.3.0 es-object-atoms: 1.1.1 - get-intrinsic: 1.2.7 + get-intrinsic: 1.3.0 get-proto: 1.0.1 which-builtin-type: 1.2.1 @@ -9618,7 +9147,7 @@ snapshots: dependencies: '@types/mdast': 4.0.4 mdast-util-from-markdown: 2.0.2 - micromark-util-types: 2.0.1 + micromark-util-types: 2.0.2 unified: 11.0.5 transitivePeerDependencies: - supports-color @@ -9706,7 +9235,7 @@ snapshots: retext-stringify: 4.0.0 unified: 11.0.5 - reusify@1.0.4: {} + reusify@1.1.0: {} rfdc@1.4.1: {} @@ -9756,7 +9285,7 @@ snapshots: dependencies: call-bind: 1.0.8 call-bound: 1.0.3 - get-intrinsic: 1.2.7 + get-intrinsic: 1.3.0 has-symbols: 1.1.0 isarray: 2.0.5 @@ -9785,10 +9314,6 @@ snapshots: sax@1.4.1: {} - scheduler@0.23.2: - dependencies: - loose-envify: 1.4.0 - scheduler@0.25.0: {} scroll-into-view-if-needed@3.1.0: @@ -9840,7 +9365,7 @@ snapshots: define-data-property: 1.1.4 es-errors: 1.3.0 function-bind: 1.1.2 - get-intrinsic: 1.2.7 + get-intrinsic: 1.3.0 gopd: 1.2.0 has-property-descriptors: 1.0.2 @@ -9912,14 +9437,14 @@ snapshots: dependencies: call-bound: 1.0.3 es-errors: 1.3.0 - get-intrinsic: 1.2.7 + get-intrinsic: 1.3.0 object-inspect: 1.13.4 side-channel-weakmap@1.0.2: dependencies: call-bound: 1.0.3 es-errors: 1.3.0 - get-intrinsic: 1.2.7 + get-intrinsic: 1.3.0 object-inspect: 1.13.4 side-channel-map: 1.0.1 @@ -10034,7 +9559,7 @@ snapshots: es-abstract: 1.23.9 es-errors: 1.3.0 es-object-atoms: 1.1.1 - get-intrinsic: 1.2.7 + get-intrinsic: 1.3.0 gopd: 1.2.0 has-symbols: 1.1.0 internal-slot: 1.1.0 @@ -10097,16 +9622,6 @@ snapshots: dependencies: inline-style-parser: 0.2.4 - styled-jsx@5.1.1(react@18.3.1): - dependencies: - client-only: 0.0.1 - react: 18.3.1 - - styled-jsx@5.1.1(react@19.0.0): - dependencies: - client-only: 0.0.1 - react: 19.0.0 - styled-jsx@5.1.6(react@19.0.0): dependencies: client-only: 0.0.1 @@ -10201,14 +9716,14 @@ snapshots: tslib@2.8.1: {} - tsup@8.3.6(postcss@8.4.31)(tsx@4.19.3)(typescript@5.7.3)(yaml@2.7.0): + tsup@8.4.0(postcss@8.4.31)(tsx@4.19.3)(typescript@5.7.3)(yaml@2.7.0): dependencies: - bundle-require: 5.1.0(esbuild@0.24.2) + bundle-require: 5.1.0(esbuild@0.25.0) cac: 6.7.14 chokidar: 4.0.3 consola: 3.4.0 debug: 4.4.0 - esbuild: 0.24.2 + esbuild: 0.25.0 joycon: 3.1.1 picocolors: 1.1.1 postcss-load-config: 6.0.1(postcss@8.4.31)(tsx@4.19.3)(yaml@2.7.0) @@ -10235,32 +9750,32 @@ snapshots: optionalDependencies: fsevents: 2.3.3 - turbo-darwin-64@2.4.2: + turbo-darwin-64@2.4.4: optional: true - turbo-darwin-arm64@2.4.2: + turbo-darwin-arm64@2.4.4: optional: true - turbo-linux-64@2.4.2: + turbo-linux-64@2.4.4: optional: true - turbo-linux-arm64@2.4.2: + turbo-linux-arm64@2.4.4: optional: true - turbo-windows-64@2.4.2: + turbo-windows-64@2.4.4: optional: true - turbo-windows-arm64@2.4.2: + turbo-windows-arm64@2.4.4: optional: true - turbo@2.4.2: + turbo@2.4.4: optionalDependencies: - turbo-darwin-64: 2.4.2 - turbo-darwin-arm64: 2.4.2 - turbo-linux-64: 2.4.2 - turbo-linux-arm64: 2.4.2 - turbo-windows-64: 2.4.2 - turbo-windows-arm64: 2.4.2 + turbo-darwin-64: 2.4.4 + turbo-darwin-arm64: 2.4.4 + turbo-linux-64: 2.4.4 + turbo-linux-arm64: 2.4.4 + turbo-windows-64: 2.4.4 + turbo-windows-arm64: 2.4.4 tv4@1.3.0: {} @@ -10318,12 +9833,12 @@ snapshots: possible-typed-array-names: 1.1.0 reflect.getprototypeof: 1.0.10 - typescript-eslint@8.24.1(eslint@9.20.1)(typescript@5.7.3): + typescript-eslint@8.25.0(eslint@9.21.0)(typescript@5.7.3): dependencies: - '@typescript-eslint/eslint-plugin': 8.24.1(@typescript-eslint/parser@8.24.1(eslint@9.20.1)(typescript@5.7.3))(eslint@9.20.1)(typescript@5.7.3) - '@typescript-eslint/parser': 8.24.1(eslint@9.20.1)(typescript@5.7.3) - '@typescript-eslint/utils': 8.24.1(eslint@9.20.1)(typescript@5.7.3) - eslint: 9.20.1 + '@typescript-eslint/eslint-plugin': 8.25.0(@typescript-eslint/parser@8.25.0(eslint@9.21.0)(typescript@5.7.3))(eslint@9.21.0)(typescript@5.7.3) + '@typescript-eslint/parser': 8.25.0(eslint@9.21.0)(typescript@5.7.3) + '@typescript-eslint/utils': 8.25.0(eslint@9.21.0)(typescript@5.7.3) + eslint: 9.21.0 typescript: 5.7.3 transitivePeerDependencies: - supports-color @@ -10564,9 +10079,9 @@ snapshots: zod@3.24.2: {} - zustand@5.0.3(@types/react@19.0.8)(react@19.0.0): + zustand@5.0.3(@types/react@19.0.10)(react@19.0.0): optionalDependencies: - '@types/react': 19.0.8 + '@types/react': 19.0.10 react: 19.0.0 zwitch@2.0.4: {} diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 11681b62..c61f11b2 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -1,5 +1,9 @@ packages: - - 'apps/*' - - 'packages/*' - - 'docs/cache-handler-docs' - - 'internal/*' + - apps/* + - packages/* + - docs/cache-handler-docs + - internal/* +onlyBuiltDependencies: + - '@biomejs/biome' + - esbuild + - sharp From a61b79c5242e2a2385390651c9ee150ccd4b5bf7 Mon Sep 17 00:00:00 2001 From: better-salmon <132773930+better-salmon@users.noreply.github.com> Date: Fri, 28 Feb 2025 00:32:56 +0300 Subject: [PATCH 03/16] Migrate to Next.js 15 --- .changeset/config.json | 1 - .github/dependabot.yml | 2 +- apps/cache-testing/next.config.js | 6 +- apps/cache-testing/package.json | 1 + .../no-params/dynamic-false/[slug]/page.tsx | 7 +- .../no-params/dynamic-true/[slug]/page.tsx | 7 +- .../src/app/app/no-params/ssr/200/page.tsx | 2 +- apps/cache-testing/src/app/app/ppr/page.tsx | 6 +- .../src/app/app/randomHex/[length]/page.tsx | 14 +- .../with-params/dynamic-false/[slug]/page.tsx | 13 +- .../with-params/dynamic-true/[slug]/page.tsx | 13 +- .../with-params/nesh-cache/[slug]/page.tsx | 45 --- .../unstable-cache/[slug]/page.tsx | 45 --- apps/cache-testing/src/app/layout.tsx | 2 +- .../src/components/cache-state-watcher.tsx | 2 +- .../src/components/pre-rendered-at.tsx | 2 +- .../src/components/restart-button.tsx | 2 +- .../src/components/revalidate-button.tsx | 2 +- apps/cache-testing/src/pages/_app.tsx | 5 +- .../src/pages/api/pages-cached-api.ts | 60 --- apps/cache-testing/src/pages/layout.tsx | 4 +- .../pages/no-paths/ssr-with-cache/200.tsx | 12 - .../src/pages/pages/randomHex/[length].tsx | 2 +- .../src/utils/common-app-page.tsx | 2 +- .../src/utils/common-pages-page.tsx | 2 +- .../src/utils/create-get-data.ts | 73 +--- ...-pages-get-get-server-side-props-cached.ts | 54 --- apps/cache-testing/tests/app.spec.ts | 25 -- apps/cache-testing/tests/pages.spec.ts | 203 ---------- biome.json | 2 +- docs/cache-handler-docs/src/app/layout.tsx | 1 - internal/eslint-config/next.js | 19 + internal/next-common/src/next-common.ts | 9 +- .../cache-types/next-cache-handler-value.ts | 23 +- internal/next-lru-cache/tsconfig.json | 5 +- package.json | 7 +- packages/cache-handler/src/cache-handler.ts | 17 +- .../cache-handler/src/functions/functions.ts | 2 - .../cache-handler/src/functions/nesh-cache.ts | 364 ------------------ .../src/functions/nesh-classic-cache.ts | 349 ----------------- packages/cache-handler/src/handlers/server.ts | 131 ------- .../instrumentation/register-initial-cache.ts | 14 +- packages/cache-handler/tsconfig.json | 1 + packages/json-replacer-reviver/.npmignore | 5 - packages/json-replacer-reviver/CHANGELOG.md | 43 --- packages/json-replacer-reviver/LICENSE | 21 - packages/json-replacer-reviver/README.md | 63 --- packages/json-replacer-reviver/package.json | 35 -- .../src/json-replacer-reviver.test.ts | 93 ----- .../src/json-replacer-reviver.ts | 151 -------- packages/json-replacer-reviver/tsconfig.json | 5 - packages/json-replacer-reviver/tsup.config.ts | 12 - packages/server/.npmignore | 5 - packages/server/CHANGELOG.md | 124 ------ packages/server/LICENSE | 21 - packages/server/README.md | 13 - packages/server/package.json | 39 -- packages/server/src/server.ts | 118 ------ packages/server/tsconfig.json | 10 - packages/server/tsup.config.ts | 15 - pnpm-lock.yaml | 75 ++-- 61 files changed, 158 insertions(+), 2248 deletions(-) delete mode 100644 apps/cache-testing/src/app/app/with-params/nesh-cache/[slug]/page.tsx delete mode 100644 apps/cache-testing/src/app/app/with-params/unstable-cache/[slug]/page.tsx delete mode 100644 apps/cache-testing/src/pages/api/pages-cached-api.ts delete mode 100644 apps/cache-testing/src/pages/pages/no-paths/ssr-with-cache/200.tsx delete mode 100644 apps/cache-testing/src/utils/create-pages-get-get-server-side-props-cached.ts delete mode 100644 packages/cache-handler/src/functions/functions.ts delete mode 100644 packages/cache-handler/src/functions/nesh-cache.ts delete mode 100644 packages/cache-handler/src/functions/nesh-classic-cache.ts delete mode 100644 packages/cache-handler/src/handlers/server.ts delete mode 100644 packages/json-replacer-reviver/.npmignore delete mode 100644 packages/json-replacer-reviver/CHANGELOG.md delete mode 100644 packages/json-replacer-reviver/LICENSE delete mode 100644 packages/json-replacer-reviver/README.md delete mode 100644 packages/json-replacer-reviver/package.json delete mode 100644 packages/json-replacer-reviver/src/json-replacer-reviver.test.ts delete mode 100644 packages/json-replacer-reviver/src/json-replacer-reviver.ts delete mode 100644 packages/json-replacer-reviver/tsconfig.json delete mode 100644 packages/json-replacer-reviver/tsup.config.ts delete mode 100644 packages/server/.npmignore delete mode 100644 packages/server/CHANGELOG.md delete mode 100644 packages/server/LICENSE delete mode 100644 packages/server/README.md delete mode 100644 packages/server/package.json delete mode 100644 packages/server/src/server.ts delete mode 100644 packages/server/tsconfig.json delete mode 100644 packages/server/tsup.config.ts diff --git a/.changeset/config.json b/.changeset/config.json index 722ecad8..d203f765 100644 --- a/.changeset/config.json +++ b/.changeset/config.json @@ -8,7 +8,6 @@ "baseBranch": "canary", "updateInternalDependencies": "patch", "ignore": [ - "@neshca/server", "@repo/backend", "@repo/cache-handler-docs", "@repo/cache-testing", diff --git a/.github/dependabot.yml b/.github/dependabot.yml index db15a3a9..94864067 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -10,7 +10,7 @@ updates: open-pull-requests-limit: 20 ignore: - dependency-name: 'lru-cache' - versions: ['11.x.x'] + versions: ['>=11.0.0'] groups: next-js: patterns: diff --git a/apps/cache-testing/next.config.js b/apps/cache-testing/next.config.js index 852964d9..e290176d 100644 --- a/apps/cache-testing/next.config.js +++ b/apps/cache-testing/next.config.js @@ -11,16 +11,12 @@ const nextConfig = { output: 'standalone', cacheHandler: process.env.NODE_ENV !== 'development' ? cacheHandler : undefined, + // outputFileTracingRoot: path.join(import.meta.dirname, '../../'), cacheMaxMemorySize: 0, // disable default in-memory caching experimental: { // PPR should only be configured via the PPR_ENABLED env variable due to conditional logic in tests. ppr: process.env.PPR_ENABLED === 'true', largePageDataBytes: 1024 * 1024, // 1MB - outputFileTracingRoot: path.join(import.meta.dirname, '../../'), - instrumentationHook: true, - }, - eslint: { - ignoreDuringBuilds: true, }, }; diff --git a/apps/cache-testing/package.json b/apps/cache-testing/package.json index e9f1e3f7..89082d92 100644 --- a/apps/cache-testing/package.json +++ b/apps/cache-testing/package.json @@ -30,6 +30,7 @@ "@types/node": "22.13.5", "@types/react": "19.0.10", "@types/react-dom": "19.0.4", + "dotenv-cli": "8.0.0", "eslint": "9.21.0", "fastify": "5.2.1", "pm2": "5.4.3", diff --git a/apps/cache-testing/src/app/app/no-params/dynamic-false/[slug]/page.tsx b/apps/cache-testing/src/app/app/no-params/dynamic-false/[slug]/page.tsx index 2ba46a75..5136b185 100644 --- a/apps/cache-testing/src/app/app/no-params/dynamic-false/[slug]/page.tsx +++ b/apps/cache-testing/src/app/app/no-params/dynamic-false/[slug]/page.tsx @@ -7,14 +7,15 @@ export const dynamicParams = false; export const revalidate = 5; -type PageParams = { params: { slug: string } }; +type PageParams = { params: Promise<{ slug: string }> }; const getData = createGetData('app/no-params/dynamic-false'); export default async function Index({ params, -}: PageParams): Promise { - const data = await getData(params.slug); +}: PageParams): Promise { + const resolvedParams = await params; + const data = await getData(resolvedParams.slug); if (!data) { notFound(); diff --git a/apps/cache-testing/src/app/app/no-params/dynamic-true/[slug]/page.tsx b/apps/cache-testing/src/app/app/no-params/dynamic-true/[slug]/page.tsx index dea0107a..d5c4c8a3 100644 --- a/apps/cache-testing/src/app/app/no-params/dynamic-true/[slug]/page.tsx +++ b/apps/cache-testing/src/app/app/no-params/dynamic-true/[slug]/page.tsx @@ -7,14 +7,15 @@ export const dynamicParams = true; export const revalidate = 5; -type PageParams = { params: { slug: string } }; +type PageParams = { params: Promise<{ slug: string }> }; const getData = createGetData('app/no-params/dynamic-true'); export default async function Index({ params, -}: PageParams): Promise { - const data = await getData(params.slug); +}: PageParams): Promise { + const resolvedParams = await params; + const data = await getData(resolvedParams.slug); if (!data) { notFound(); diff --git a/apps/cache-testing/src/app/app/no-params/ssr/200/page.tsx b/apps/cache-testing/src/app/app/no-params/ssr/200/page.tsx index 2ff60456..523e64a8 100644 --- a/apps/cache-testing/src/app/app/no-params/ssr/200/page.tsx +++ b/apps/cache-testing/src/app/app/no-params/ssr/200/page.tsx @@ -5,7 +5,7 @@ import { createGetData } from 'cache-testing/utils/create-get-data'; const getData = createGetData('app/no-params/ssr', undefined, 'no-store'); -export default async function Index(): Promise { +export default async function Index(): Promise { const data = await getData('200'); if (!data) { diff --git a/apps/cache-testing/src/app/app/ppr/page.tsx b/apps/cache-testing/src/app/app/ppr/page.tsx index 473c6cee..21e5eb2c 100644 --- a/apps/cache-testing/src/app/app/ppr/page.tsx +++ b/apps/cache-testing/src/app/app/ppr/page.tsx @@ -4,7 +4,7 @@ import { Suspense } from 'react'; import { formatTime } from 'cache-testing/utils/format-time'; import type { TimeBackendApiResponseJson } from 'cache-testing/utils/types'; -async function ActualData(): Promise { +async function ActualData(): Promise { noStore(); const response = await fetch('http://localhost:8081/time', { @@ -20,11 +20,11 @@ async function ActualData(): Promise { return
{formatTime(data.unixTimeMs)}
; } -function Skeleton(): JSX.Element { +function Skeleton(): React.ReactNode { return
Skeleton
; } -export default function Page(): JSX.Element { +export default function Page(): React.ReactNode { return (

Partial Prerendering

diff --git a/apps/cache-testing/src/app/app/randomHex/[length]/page.tsx b/apps/cache-testing/src/app/app/randomHex/[length]/page.tsx index 9241a6b9..e6f26554 100644 --- a/apps/cache-testing/src/app/app/randomHex/[length]/page.tsx +++ b/apps/cache-testing/src/app/app/randomHex/[length]/page.tsx @@ -7,15 +7,21 @@ import type { RandomHexPageProps } from 'cache-testing/utils/types'; const lengthSteps = new Array(5).fill(0).map((_, i) => 10 ** (i + 1)); -type PageParams = { params: { length: string } }; +type PageParams = { params: Promise<{ length: string }> }; -export function generateStaticParams(): PageParams['params'][] { +export async function generateStaticParams(): Promise< + { + length: string; + }[] +> { return lengthSteps.map((length) => ({ length: `${length}` })); } export default async function Page({ - params: { length }, -}: PageParams): Promise { + params, +}: PageParams): Promise { + const resolvedParams = await params; + const { length } = resolvedParams; const path = `/randomHex/app/${length}`; const url = new URL(path, 'http://localhost:8081'); diff --git a/apps/cache-testing/src/app/app/with-params/dynamic-false/[slug]/page.tsx b/apps/cache-testing/src/app/app/with-params/dynamic-false/[slug]/page.tsx index 2e3e47fc..e58b7049 100644 --- a/apps/cache-testing/src/app/app/with-params/dynamic-false/[slug]/page.tsx +++ b/apps/cache-testing/src/app/app/with-params/dynamic-false/[slug]/page.tsx @@ -3,7 +3,7 @@ import { notFound } from 'next/navigation'; import { CommonAppPage } from 'cache-testing/utils/common-app-page'; import { createGetData } from 'cache-testing/utils/create-get-data'; -type PageParams = { params: { slug: string } }; +type PageParams = { params: Promise<{ slug: string }> }; export const dynamicParams = false; @@ -11,7 +11,11 @@ export const revalidate = 5; const getData = createGetData('app/with-params/dynamic-false'); -export function generateStaticParams(): Promise { +export function generateStaticParams(): Promise< + { + slug: string; + }[] +> { return Promise.resolve([ { slug: '200' }, { slug: '404' }, @@ -21,8 +25,9 @@ export function generateStaticParams(): Promise { export default async function Index({ params, -}: PageParams): Promise { - const data = await getData(params.slug); +}: PageParams): Promise { + const resolvedParams = await params; + const data = await getData(resolvedParams.slug); if (!data) { notFound(); diff --git a/apps/cache-testing/src/app/app/with-params/dynamic-true/[slug]/page.tsx b/apps/cache-testing/src/app/app/with-params/dynamic-true/[slug]/page.tsx index adfc84b1..10124bab 100644 --- a/apps/cache-testing/src/app/app/with-params/dynamic-true/[slug]/page.tsx +++ b/apps/cache-testing/src/app/app/with-params/dynamic-true/[slug]/page.tsx @@ -3,7 +3,7 @@ import { notFound } from 'next/navigation'; import { CommonAppPage } from 'cache-testing/utils/common-app-page'; import { createGetData } from 'cache-testing/utils/create-get-data'; -type PageParams = { params: { slug: string } }; +type PageParams = { params: Promise<{ slug: string }> }; export const dynamicParams = true; @@ -11,7 +11,11 @@ export const revalidate = 5; const getData = createGetData('app/with-params/dynamic-true'); -export function generateStaticParams(): Promise { +export function generateStaticParams(): Promise< + { + slug: string; + }[] +> { return Promise.resolve([ { slug: '200' }, { slug: '404' }, @@ -21,8 +25,9 @@ export function generateStaticParams(): Promise { export default async function Index({ params, -}: PageParams): Promise { - const data = await getData(params.slug); +}: PageParams): Promise { + const resolvedParams = await params; + const data = await getData(resolvedParams.slug); if (!data) { notFound(); diff --git a/apps/cache-testing/src/app/app/with-params/nesh-cache/[slug]/page.tsx b/apps/cache-testing/src/app/app/with-params/nesh-cache/[slug]/page.tsx deleted file mode 100644 index 8698aa01..00000000 --- a/apps/cache-testing/src/app/app/with-params/nesh-cache/[slug]/page.tsx +++ /dev/null @@ -1,45 +0,0 @@ -import { notFound } from 'next/navigation'; - -import { CommonAppPage } from 'cache-testing/utils/common-app-page'; -import { createGetData } from 'cache-testing/utils/create-get-data'; - -type PageParams = { params: { slug: string } }; - -export const dynamicParams = true; - -export const revalidate = 5; - -const getData = createGetData( - 'app/with-params/nesh-cache', - revalidate, - 'nesh-cache', -); - -export function generateStaticParams(): Promise { - return Promise.resolve([ - { slug: '200' }, - { slug: '404' }, - { slug: 'alternate-200-404' }, - ]); -} - -export default async function Index({ - params, -}: PageParams): Promise { - const data = await getData(params.slug); - - if (!data) { - notFound(); - } - - const { count, path, time } = data; - - return ( - - ); -} diff --git a/apps/cache-testing/src/app/app/with-params/unstable-cache/[slug]/page.tsx b/apps/cache-testing/src/app/app/with-params/unstable-cache/[slug]/page.tsx deleted file mode 100644 index 931b54a3..00000000 --- a/apps/cache-testing/src/app/app/with-params/unstable-cache/[slug]/page.tsx +++ /dev/null @@ -1,45 +0,0 @@ -import { notFound } from 'next/navigation'; - -import { CommonAppPage } from 'cache-testing/utils/common-app-page'; -import { createGetData } from 'cache-testing/utils/create-get-data'; - -type PageParams = { params: { slug: string } }; - -export const dynamicParams = true; - -export const revalidate = 5; - -const getData = createGetData( - 'app/with-params/unstable-cache', - revalidate, - 'unstable-cache', -); - -export function generateStaticParams(): Promise { - return Promise.resolve([ - { slug: '200' }, - { slug: '404' }, - { slug: 'alternate-200-404' }, - ]); -} - -export default async function Index({ - params, -}: PageParams): Promise { - const data = await getData(params.slug); - - if (!data) { - notFound(); - } - - const { count, path, time } = data; - - return ( - - ); -} diff --git a/apps/cache-testing/src/app/layout.tsx b/apps/cache-testing/src/app/layout.tsx index 5c583197..43018e6a 100644 --- a/apps/cache-testing/src/app/layout.tsx +++ b/apps/cache-testing/src/app/layout.tsx @@ -12,7 +12,7 @@ export const metadata = { export default function RootLayout({ children, -}: PropsWithChildren): JSX.Element { +}: PropsWithChildren): React.ReactNode { return ( diff --git a/apps/cache-testing/src/components/cache-state-watcher.tsx b/apps/cache-testing/src/components/cache-state-watcher.tsx index 12e14290..b8e534b3 100644 --- a/apps/cache-testing/src/components/cache-state-watcher.tsx +++ b/apps/cache-testing/src/components/cache-state-watcher.tsx @@ -7,7 +7,7 @@ type CacheStateWatcherProps = { time: number; revalidateAfter: number }; export function CacheStateWatcher({ time, revalidateAfter, -}: CacheStateWatcherProps): JSX.Element { +}: CacheStateWatcherProps): React.ReactNode { const [cacheState, setCacheState] = useState(''); const [countDown, setCountDown] = useState(''); diff --git a/apps/cache-testing/src/components/pre-rendered-at.tsx b/apps/cache-testing/src/components/pre-rendered-at.tsx index 05e067fe..cd2b3ce1 100644 --- a/apps/cache-testing/src/components/pre-rendered-at.tsx +++ b/apps/cache-testing/src/components/pre-rendered-at.tsx @@ -5,7 +5,7 @@ type CacheStateWatcherProps = { time: number; isFallback?: boolean }; export function PreRenderedAt({ time, isFallback, -}: CacheStateWatcherProps): JSX.Element { +}: CacheStateWatcherProps): React.ReactNode { const preRenderTime = isFallback ? '' : formatTime(time, 3); return
Pre-rendered at {preRenderTime}
; diff --git a/apps/cache-testing/src/components/restart-button.tsx b/apps/cache-testing/src/components/restart-button.tsx index acf9ebfe..f5b16518 100644 --- a/apps/cache-testing/src/components/restart-button.tsx +++ b/apps/cache-testing/src/components/restart-button.tsx @@ -2,7 +2,7 @@ import { useState } from 'react'; -export function RestartButton(): JSX.Element { +export function RestartButton(): React.ReactNode { const [restartState, setRestartState] = useState(''); function restart(): void { diff --git a/apps/cache-testing/src/components/revalidate-button.tsx b/apps/cache-testing/src/components/revalidate-button.tsx index 99dd7943..a5b8e064 100644 --- a/apps/cache-testing/src/components/revalidate-button.tsx +++ b/apps/cache-testing/src/components/revalidate-button.tsx @@ -16,7 +16,7 @@ type RevalidateButtonPagesProps = { export function RevalidateButton({ nextApi, type, -}: RevalidateButtonAppProps | RevalidateButtonPagesProps): JSX.Element { +}: RevalidateButtonAppProps | RevalidateButtonPagesProps): React.ReactNode { const pathname = usePathname(); const [revalidation, setRevalidation] = useState(''); diff --git a/apps/cache-testing/src/pages/_app.tsx b/apps/cache-testing/src/pages/_app.tsx index ab2af1c9..2d5ad588 100644 --- a/apps/cache-testing/src/pages/_app.tsx +++ b/apps/cache-testing/src/pages/_app.tsx @@ -2,7 +2,10 @@ import type { AppProps } from 'next/app'; import Layout from './layout'; -export default function MyApp({ Component, pageProps }: AppProps): JSX.Element { +export default function MyApp({ + Component, + pageProps, +}: AppProps): React.ReactNode { return ( diff --git a/apps/cache-testing/src/pages/api/pages-cached-api.ts b/apps/cache-testing/src/pages/api/pages-cached-api.ts deleted file mode 100644 index 1f6f782c..00000000 --- a/apps/cache-testing/src/pages/api/pages-cached-api.ts +++ /dev/null @@ -1,60 +0,0 @@ -import { formatTime } from 'cache-testing/utils/format-time'; -import type { CountBackendApiResponseJson } from 'cache-testing/utils/types'; -import type { NextApiRequest, NextApiResponse } from 'next'; - -import { neshClassicCache } from '@neshca/cache-handler/functions'; - -export const config = { - runtime: 'nodejs', -}; - -const fetchWithCache = neshClassicCache(async (url: URL | string) => { - const result = await fetch(url); - - if (!result.ok) { - throw new Error('Failed to fetch'); - } - - const json = (await result.json()) as CountBackendApiResponseJson; - - return json; -}); - -export default async function handler( - request: NextApiRequest, - response: NextApiResponse, -): Promise { - if (request.method !== 'GET') { - return response.status(405).send(null); - } - - const path = request.url; - - const pathAndTag = '/count/pages/api/api/200'; - - const revalidate = 5; - - const url = new URL(pathAndTag, 'http://localhost:8081'); - - const result = await fetchWithCache( - { revalidate, tags: [String(path)], responseContext: response }, - url, - ); - - if (!result) { - return response.status(404).send(null); - } - - const parsedResult = result; - - response.json({ - props: { - count: parsedResult.count, - time: formatTime(parsedResult.unixTimeMs), - revalidateAfter: formatTime(parsedResult.unixTimeMs + revalidate * 1000), - timeMs: parsedResult.unixTimeMs, - revalidateAfterMs: parsedResult.unixTimeMs + revalidate * 1000, - path, - }, - }); -} diff --git a/apps/cache-testing/src/pages/layout.tsx b/apps/cache-testing/src/pages/layout.tsx index 991592db..7aff44f4 100644 --- a/apps/cache-testing/src/pages/layout.tsx +++ b/apps/cache-testing/src/pages/layout.tsx @@ -4,7 +4,9 @@ import { RestartButton } from 'cache-testing/components/restart-button'; import { RevalidateButton } from 'cache-testing/components/revalidate-button'; import 'cache-testing/globals.css'; -export default function Layout({ children }: PropsWithChildren): JSX.Element { +export default function Layout({ + children, +}: PropsWithChildren): React.ReactNode { return (
{children} diff --git a/apps/cache-testing/src/pages/pages/no-paths/ssr-with-cache/200.tsx b/apps/cache-testing/src/pages/pages/no-paths/ssr-with-cache/200.tsx deleted file mode 100644 index c5e1611a..00000000 --- a/apps/cache-testing/src/pages/pages/no-paths/ssr-with-cache/200.tsx +++ /dev/null @@ -1,12 +0,0 @@ -import { CommonPagesPage } from 'cache-testing/utils/common-pages-page'; -import { createPagesGetServerSideProps } from 'cache-testing/utils/create-pages-get-get-server-side-props-cached'; - -export const config = { - runtime: 'nodejs', -}; - -export const getServerSideProps = createPagesGetServerSideProps( - 'pages/no-paths/ssr-with-cache/200', -); - -export default CommonPagesPage; diff --git a/apps/cache-testing/src/pages/pages/randomHex/[length].tsx b/apps/cache-testing/src/pages/pages/randomHex/[length].tsx index bc183930..8243e74d 100644 --- a/apps/cache-testing/src/pages/pages/randomHex/[length].tsx +++ b/apps/cache-testing/src/pages/pages/randomHex/[length].tsx @@ -50,7 +50,7 @@ export function getStaticPaths(): Promise { export default function Page({ randomHex, unixTimeMs, -}: RandomHexPageProps): JSX.Element { +}: RandomHexPageProps): React.ReactNode { return (
{randomHex}
diff --git a/apps/cache-testing/src/utils/common-app-page.tsx b/apps/cache-testing/src/utils/common-app-page.tsx index e9bdc722..eb92bbc1 100644 --- a/apps/cache-testing/src/utils/common-app-page.tsx +++ b/apps/cache-testing/src/utils/common-app-page.tsx @@ -10,7 +10,7 @@ export function CommonAppPage({ revalidateAfter, time, path, -}: PageProps): JSX.Element { +}: PageProps): React.ReactNode { return (
diff --git a/apps/cache-testing/src/utils/common-pages-page.tsx b/apps/cache-testing/src/utils/common-pages-page.tsx index b963665e..7f5ec675 100644 --- a/apps/cache-testing/src/utils/common-pages-page.tsx +++ b/apps/cache-testing/src/utils/common-pages-page.tsx @@ -9,7 +9,7 @@ export function CommonPagesPage({ revalidateAfter, time, path, -}: PageProps): JSX.Element { +}: PageProps): React.ReactNode { const { isFallback } = useRouter(); return ( diff --git a/apps/cache-testing/src/utils/create-get-data.ts b/apps/cache-testing/src/utils/create-get-data.ts index 86565339..ffd44f9e 100644 --- a/apps/cache-testing/src/utils/create-get-data.ts +++ b/apps/cache-testing/src/utils/create-get-data.ts @@ -1,23 +1,10 @@ -import { neshCache } from '@neshca/cache-handler/functions'; -import axios from 'axios'; -import { unstable_cache } from 'next/cache'; import { normalizeSlug } from './normalize-slug'; import type { CountBackendApiResponseJson, PageProps } from './types'; -async function getViaAxios(url: URL) { - try { - return (await axios.get(url.href)).data; - } catch (_error) { - return null; - } -} - -const cachedAxios = neshCache(getViaAxios); - export function createGetData( path: string, revalidate?: number, - cache?: RequestCache | 'unstable-cache' | 'nesh-cache', + cache?: RequestCache, ) { return async function getData( slug: string, @@ -26,61 +13,19 @@ export function createGetData( const url = new URL(`/count${pathAndTag}`, 'http://localhost:8081'); - let parsedResult: CountBackendApiResponseJson; - const tags = [pathAndTag, 'whole-app-route']; - switch (cache) { - case 'unstable-cache': { - const cachedGet = unstable_cache(getViaAxios, tags, { - revalidate, - tags, - }); - - const data = await cachedGet(url); - - if (!data) { - return null; - } - - parsedResult = data; - - break; - } - case 'nesh-cache': { - const data = await cachedAxios( - { - revalidate, - tags, - }, - url, - ); + const result = await fetch(url, { + cache, + next: { revalidate, tags }, + }); - if (!data) { - return null; - } - - parsedResult = data; - - break; - } - - default: { - const result = await fetch(url, { - cache, - next: { revalidate, tags }, - }); - - if (!result.ok) { - return null; - } - - parsedResult = (await result.json()) as CountBackendApiResponseJson; - - break; - } + if (!result.ok) { + return null; } + const parsedResult = (await result.json()) as CountBackendApiResponseJson; + const newData = { count: parsedResult.count, path, diff --git a/apps/cache-testing/src/utils/create-pages-get-get-server-side-props-cached.ts b/apps/cache-testing/src/utils/create-pages-get-get-server-side-props-cached.ts deleted file mode 100644 index 28227aaa..00000000 --- a/apps/cache-testing/src/utils/create-pages-get-get-server-side-props-cached.ts +++ /dev/null @@ -1,54 +0,0 @@ -import type { GetServerSideProps, GetServerSidePropsResult } from 'next'; - -import { neshClassicCache } from '@neshca/cache-handler/functions'; -import type { CountBackendApiResponseJson, PageProps } from './types'; - -const fetchWithCache = neshClassicCache(async (url: URL | string) => { - const result = await fetch(url); - - if (!result.ok) { - throw new Error('Failed to fetch'); - } - - const json = (await result.json()) as CountBackendApiResponseJson; - - return json; -}); - -export function createPagesGetServerSideProps( - path: string, -): GetServerSideProps { - return async function getServerSideProps({ - res, - }): Promise> { - const pathAndTag = `/count/${path}`; - - const revalidate = 5; - - const url = new URL(pathAndTag, 'http://localhost:8081'); - - const result = await fetchWithCache( - { - revalidate, - tags: [`/${path}`], - responseContext: res, - }, - url, - ); - - if (!result) { - return { notFound: true }; - } - - const parsedResult = result; - - return { - props: { - count: parsedResult.count, - time: parsedResult.unixTimeMs, - revalidateAfter: revalidate * 1000, - path, - }, - }; - }; -} diff --git a/apps/cache-testing/tests/app.spec.ts b/apps/cache-testing/tests/app.spec.ts index 310721d5..f28eb6c4 100644 --- a/apps/cache-testing/tests/app.spec.ts +++ b/apps/cache-testing/tests/app.spec.ts @@ -438,28 +438,3 @@ test.describe('Routes', () => { expect(message).toBe('OK'); }); }); - -test.describe('unstable_cache', () => { - test('unstable_cache works', async ({ page, baseURL }) => { - const url = new URL( - '/app/with-params/unstable-cache/200', - `${baseURL}:3000`, - ); - - await page.goto(url.href); - - const valueFromPage = Number.parseInt( - (await page.getByTestId('data').innerText()).valueOf(), - 10, - ); - - await page.reload(); - - const valueFromPageAfterReload = Number.parseInt( - (await page.getByTestId('data').innerText()).valueOf(), - 10, - ); - - expect(valueFromPageAfterReload === valueFromPage).toBe(true); - }); -}); diff --git a/apps/cache-testing/tests/pages.spec.ts b/apps/cache-testing/tests/pages.spec.ts index 151954d8..6e84f87e 100644 --- a/apps/cache-testing/tests/pages.spec.ts +++ b/apps/cache-testing/tests/pages.spec.ts @@ -1,6 +1,5 @@ import Timers from 'node:timers/promises'; import { expect, test } from '@playwright/test'; -import { revalidateByApi } from './test-helpers'; const paths = [ '/pages/with-paths/fallback-blocking/200', @@ -419,205 +418,3 @@ test.describe('SSR', () => { expect(valueFromPageAfterReload - valueFromPage === 1).toBe(true); }); }); - -test.describe('SSR neshClassicCache', () => { - const path = '/pages/no-paths/ssr-with-cache/200'; - - test('If revalidate is called, then page should be fresh after reload', async ({ - page, - baseURL, - }) => { - const url = new URL(path, `${baseURL}:3000`); - - await page.goto(url.href); - - const response = await revalidateByApi(path, `${baseURL}:3000`); - - expect(response.revalidated).toBe(true); - - await page.reload(); - - await expect(page.getByTestId('cache-state')).toContainText('fresh'); - }); - - test('If revalidate is called on page A, then page B should be fresh on load and value must be updated', async ({ - context, - baseURL, - }) => { - const appAUrl = new URL(path, `${baseURL}:3000`); - - await revalidateByApi(path, `${baseURL}:3000`); - - const appA = await context.newPage(); - - await appA.goto(appAUrl.href); - - await expect(appA.getByTestId('cache-state')).toContainText('fresh'); - - const valueFromPageA = Number.parseInt( - (await appA.getByTestId('data').innerText()).valueOf(), - 10, - ); - - await revalidateByApi(path, `${baseURL}:3000`); - - const appBUrl = new URL(path, `${baseURL}:3001`); - - const appB = await context.newPage(); - - await appB.goto(appBUrl.href); - - await expect(appA.getByTestId('cache-state')).toContainText('fresh'); - - const valueFromPageB = Number.parseInt( - (await appB.getByTestId('data').innerText()).valueOf(), - 10, - ); - - expect(valueFromPageB - valueFromPageA === 1).toBe(true); - }); - - test('Page should be fresh after becoming stale and reloaded twice', async ({ - page, - baseURL, - }) => { - const url = new URL(path, `${baseURL}:3000`); - - await revalidateByApi(path, `${baseURL}:3000`); - - await page.goto(url.href); - - await expect(page.getByTestId('cache-state')).toContainText('fresh'); - - await expect(page.getByTestId('cache-state')).toContainText('stale', { - timeout: 7500, - }); - - await page.reload(); - - await expect(page.getByTestId('cache-state')).toContainText('stale'); - - await page.reload(); - - await expect(page.getByTestId('cache-state')).toContainText('fresh'); - }); -}); - -test.describe('API route neshClassicCache', () => { - const path = '/api/pages-cached-api'; - - test('If revalidate is called, then page should be fresh after reload', async ({ - baseURL, - }) => { - const url = new URL(path, `${baseURL}:3000`); - - const revalidateByApiResponse = await revalidateByApi( - path, - `${baseURL}:3000`, - ); - - expect(revalidateByApiResponse.revalidated).toBe(true); - - const response = await fetch(url.href); - - if (!response.ok) { - throw new Error('Failed to fetch'); - } - - const json = (await response.json()) as { - props: { count: number; timeMs: string; revalidateAfterMs: string }; - }; - - const time = Number.parseInt(json.props.timeMs, 10); - - const revalidateAfter = Number.parseInt(json.props.revalidateAfterMs, 10); - - expect(time < revalidateAfter).toBe(true); - }); - - test('If revalidate is called on page A, then page B should be fresh on load and value must be updated', async ({ - baseURL, - }) => { - const appAUrl = new URL(path, `${baseURL}:3000`); - - const appBUrl = new URL(path, `${baseURL}:3001`); - - await revalidateByApi(path, `${baseURL}:3000`); - - const appAResponse = await fetch(appAUrl.href); - - if (!appAResponse.ok) { - throw new Error('Failed to fetch'); - } - - const appAJson = (await appAResponse.json()) as { - props: { count: number; timeMs: string; revalidateAfterMs: string }; - }; - - const time = Number.parseInt(appAJson.props.timeMs, 10); - - const revalidateAfter = Number.parseInt( - appAJson.props.revalidateAfterMs, - 10, - ); - - expect(time < revalidateAfter).toBe(true); - - const appACount = appAJson.props.count; - - await revalidateByApi(path, `${baseURL}:3000`); - - const appBResponse = await fetch(appBUrl.href); - - if (!appBResponse.ok) { - throw new Error('Failed to fetch'); - } - - const appBJson = (await appBResponse.json()) as { - props: { count: number; timeMs: string; revalidateAfterMs: string }; - }; - - const appBCount = appBJson.props.count; - - expect(appBCount - appACount === 1).toBe(true); - }); - - test('Page should be fresh after becoming stale and reloaded twice', async ({ - baseURL, - }) => { - const url = new URL(path, `${baseURL}:3000`); - - await revalidateByApi(path, `${baseURL}:3000`); - - const response1 = await fetch(url.href); - - if (!response1.ok) { - throw new Error('Failed to fetch'); - } - - const json1 = (await response1.json()) as { - props: { count: number; timeMs: string; revalidateAfterMs: string }; - }; - - const time = Number.parseInt(json1.props.timeMs, 10); - - const revalidateAfter = Number.parseInt(json1.props.revalidateAfterMs, 10); - - expect(time < revalidateAfter).toBe(true); - - await Timers.setTimeout(revalidateAfter - Date.now()); - - await fetch(url.href); - const response2 = await fetch(url.href); - - if (!response2.ok) { - throw new Error('Failed to fetch'); - } - - const json2 = (await response2.json()) as { - props: { count: number; timeMs: string; revalidateAfterMs: string }; - }; - - expect(json2.props.count - json1.props.count === 1).toBe(true); - }); -}); diff --git a/biome.json b/biome.json index 0ea8c64a..68ac35ae 100644 --- a/biome.json +++ b/biome.json @@ -52,7 +52,7 @@ "formatter": { "quoteStyle": "single" }, - "globals": ["JSX"] + "globals": ["React"] }, "json": { "formatter": { diff --git a/docs/cache-handler-docs/src/app/layout.tsx b/docs/cache-handler-docs/src/app/layout.tsx index 86eb95e3..d3a4f09b 100644 --- a/docs/cache-handler-docs/src/app/layout.tsx +++ b/docs/cache-handler-docs/src/app/layout.tsx @@ -53,7 +53,6 @@ export default async function RootLayout({ docsRepositoryBase="https://github.com/caching-tools/next-shared-cache/tree/canary/docs/cache-handler-docs" footer={footer} > - {/* @ts-expect-error - will be fixed when all react types will be updated to v19*/} {children} diff --git a/internal/eslint-config/next.js b/internal/eslint-config/next.js index 572a9a3e..023ea3f1 100644 --- a/internal/eslint-config/next.js +++ b/internal/eslint-config/next.js @@ -42,6 +42,9 @@ export const nextJsConfig = tseslint.config( ...globals.serviceworker, }, }, + rules: { + 'react/prop-types': 'off', + }, }, { plugins: { @@ -63,4 +66,20 @@ export const nextJsConfig = tseslint.config( 'react/react-in-jsx-scope': 'off', }, }, + { + rules: { + '@typescript-eslint/no-unused-vars': [ + 'error', + { + args: 'all', + argsIgnorePattern: '^_', + caughtErrors: 'all', + caughtErrorsIgnorePattern: '^_', + destructuredArrayIgnorePattern: '^_', + varsIgnorePattern: '^_', + ignoreRestSiblings: true, + }, + ], + }, + }, ); diff --git a/internal/next-common/src/next-common.ts b/internal/next-common/src/next-common.ts index 532410bc..353f13f1 100644 --- a/internal/next-common/src/next-common.ts +++ b/internal/next-common/src/next-common.ts @@ -5,7 +5,10 @@ import type { CacheHandlerValue as NextCacheHandlerValue, } from 'next/dist/server/lib/incremental-cache'; import type FileSystemCache from 'next/dist/server/lib/incremental-cache/file-system-cache'; -import type { IncrementalCacheValue } from 'next/dist/server/response-cache/types'; +import type { + CachedRouteKind, + IncrementalCacheValue, +} from 'next/dist/server/response-cache/types'; export type { PrerenderManifest } from 'next/dist/build'; export type { @@ -21,6 +24,8 @@ export type { IncrementalCacheEntry, } from 'next/dist/server/response-cache/types'; +export { CachedRouteKind } from 'next/dist/server/response-cache/types.js'; + export type NextRouteMetadata = { status: number | undefined; headers: OutgoingHttpHeaders | undefined; @@ -126,7 +131,7 @@ type ExtractIncrementalCacheKind = T extends { kind: Kind } export type IncrementalCachedPageValue = ExtractIncrementalCacheKind< IncrementalCacheValue, - 'PAGE' + CachedRouteKind.PAGES >; export type TagsManifest = { diff --git a/internal/next-lru-cache/src/cache-types/next-cache-handler-value.ts b/internal/next-lru-cache/src/cache-types/next-cache-handler-value.ts index 5e18046f..14741588 100644 --- a/internal/next-lru-cache/src/cache-types/next-cache-handler-value.ts +++ b/internal/next-lru-cache/src/cache-types/next-cache-handler-value.ts @@ -1,4 +1,4 @@ -import type { CacheHandlerValue } from '@repo/next-common'; +import { type CacheHandlerValue, CachedRouteKind } from '@repo/next-common'; import type { LRUCache } from 'lru-cache'; import type { LruCacheOptions } from '../create-configured-cache'; @@ -11,31 +11,32 @@ function calculateObjectSize({ value }: CacheHandlerValue): number { } switch (value.kind) { - case 'REDIRECT': { + case CachedRouteKind.REDIRECT: { // Calculate size based on the length of the stringified props return JSON.stringify(value.props).length; } - case 'IMAGE': { + case CachedRouteKind.IMAGE: { // Throw a specific error for image kind throw new Error( 'Image kind should not be used for incremental-cache calculations.', ); } - case 'FETCH': { + case CachedRouteKind.FETCH: { // Calculate size based on the length of the stringified data return JSON.stringify(value.data || '').length; } - case 'ROUTE': { + case CachedRouteKind.APP_ROUTE: { // Size based on the length of the body return value.body.length; } + case CachedRouteKind.PAGES: { + return value.html.length + JSON.stringify(value.pageData).length; + } + case CachedRouteKind.APP_PAGE: { + return value.html.length + (value.rscData?.length || 0); + } default: { - // Rough estimate calculation for other types - // Combine HTML length and page data length - const pageDataLength = value.pageData - ? JSON.stringify(value.pageData).length - : 0; - return value.html.length + pageDataLength; + return 0; } } } diff --git a/internal/next-lru-cache/tsconfig.json b/internal/next-lru-cache/tsconfig.json index 9c5847bc..d0bcdc7d 100644 --- a/internal/next-lru-cache/tsconfig.json +++ b/internal/next-lru-cache/tsconfig.json @@ -1,5 +1,8 @@ { "extends": "@repo/typescript-config/base.json", "include": ["."], - "exclude": ["dist", "node_modules"] + "exclude": ["dist", "node_modules"], + "compilerOptions": { + "isolatedModules": false + } } diff --git a/package.json b/package.json index 5a50dd96..e1d43373 100644 --- a/package.json +++ b/package.json @@ -11,13 +11,14 @@ "changeset": "changeset", "ci:publish": "changeset publish", "ci:version": "changeset version && pnpm codestyle:fix", - "codestyle:check": "biome check . && pnpm prettier:check", - "codestyle:fix": "biome check --write . && pnpm prettier:fix", + "codestyle:check": "biome check . && pnpm prettier:check && pnpm eslint:check", + "codestyle:fix": "biome check --write . && pnpm prettier:fix && pnpm eslint:fix", "dev:docs": "turbo run dev:docs --filter=@repo/cache-handler-docs", - "dev:packages": "turbo run dev --filter=!@neshca/server", + "dev:packages": "turbo run dev", "e2e": "turbo run e2e", "eslint:check": "turbo run eslint:check", "eslint:fix": "turbo run eslint:fix", + "playwright:install": "pnpm -F @repo/cache-testing playwright:install", "prettier:check": "prettier --check **/*.{md,mdx,yml,json}", "prettier:fix": "prettier --write **/*.{md,mdx,yml,json}", "start:backend": "turbo run start --filter=@repo/backend", diff --git a/packages/cache-handler/src/cache-handler.ts b/packages/cache-handler/src/cache-handler.ts index 60528f8c..f33a9d39 100644 --- a/packages/cache-handler/src/cache-handler.ts +++ b/packages/cache-handler/src/cache-handler.ts @@ -13,6 +13,7 @@ import type { PrerenderManifest, Revalidate, } from '@repo/next-common'; +import { CachedRouteKind } from '@repo/next-common'; import { createValidatedAgeEstimationFunction } from './helpers/create-validated-age-estimation-function'; import { getTagsFromHeaders } from './helpers/get-tags-from-headers'; @@ -438,10 +439,9 @@ export class CacheHandler implements NextCacheHandler { lifespan: null, tags: [], value: { - kind: 'PAGE', + kind: CachedRouteKind.PAGES, html: pageHtmlFile, pageData, - postponed: undefined, headers: undefined, status: undefined, }, @@ -829,7 +829,7 @@ export class CacheHandler implements NextCacheHandler { async get( cacheKey: CacheHandlerParametersGet[0], - ctx: CacheHandlerParametersGet[1] = {}, + ctx: CacheHandlerParametersGet[1], ): Promise { await CacheHandler.#configureCacheHandler(); @@ -849,7 +849,7 @@ export class CacheHandler implements NextCacheHandler { implicitTags: softTags, }); - if (cachedData?.value?.kind === 'ROUTE') { + if (cachedData?.value?.kind === CachedRouteKind.APP_ROUTE) { cachedData.value.body = Buffer.from( cachedData.value.body as unknown as string, 'base64', @@ -904,11 +904,11 @@ export class CacheHandler implements NextCacheHandler { let value = incrementalCacheValue; switch (value?.kind) { - case 'PAGE': { + case CachedRouteKind.PAGES: { cacheHandlerValueTags = getTagsFromHeaders(value.headers ?? {}); break; } - case 'ROUTE': { + case CachedRouteKind.APP_ROUTE: { // create a new object to avoid mutating the original value value = { // replace the body with a base64 encoded string to save space @@ -934,7 +934,10 @@ export class CacheHandler implements NextCacheHandler { await CacheHandler.#mergedHandler.set(cacheKey, cacheHandlerValue); - if (hasFallbackFalse && cacheHandlerValue.value?.kind === 'PAGE') { + if ( + hasFallbackFalse && + cacheHandlerValue.value?.kind === CachedRouteKind.PAGES + ) { await CacheHandler.#writePagesRouterPage( cacheKey, cacheHandlerValue.value, diff --git a/packages/cache-handler/src/functions/functions.ts b/packages/cache-handler/src/functions/functions.ts deleted file mode 100644 index 14804052..00000000 --- a/packages/cache-handler/src/functions/functions.ts +++ /dev/null @@ -1,2 +0,0 @@ -export { neshCache } from './nesh-cache'; -export { neshClassicCache } from './nesh-classic-cache'; diff --git a/packages/cache-handler/src/functions/nesh-cache.ts b/packages/cache-handler/src/functions/nesh-cache.ts deleted file mode 100644 index 8d9ddee2..00000000 --- a/packages/cache-handler/src/functions/nesh-cache.ts +++ /dev/null @@ -1,364 +0,0 @@ -import assert from 'node:assert/strict'; -import { - type IncrementalCacheEntry, - NEXT_CACHE_IMPLICIT_TAG_ID, - type Revalidate, -} from '@repo/next-common'; -import { - type StaticGenerationStore, - staticGenerationAsyncStorage, -} from 'next/dist/client/components/static-generation-async-storage.external.js'; -import { TIME_ONE_YEAR } from '../constants'; - -function getDerivedTags(pathname: string): string[] { - const derivedTags: string[] = ['/layout']; - - if (!pathname.startsWith('/')) { - return derivedTags; - } - - const pathnameParts = pathname.split('/'); - - for (let i = 1; i < pathnameParts.length + 1; i++) { - let curPathname = pathnameParts.slice(0, i).join('/'); - - if (curPathname) { - if (!(curPathname.endsWith('/page') || curPathname.endsWith('/route'))) { - curPathname = `${curPathname}${curPathname.endsWith('/') ? '' : '/'}layout`; - } - - derivedTags.push(curPathname); - } - } - - return derivedTags; -} - -function addImplicitTags(staticGenerationStore: StaticGenerationStore) { - const newTags: string[] = []; - - const { pagePath, urlPathname } = staticGenerationStore; - - if (!Array.isArray(staticGenerationStore.tags)) { - staticGenerationStore.tags = []; - } - - if (pagePath) { - const derivedTags = getDerivedTags(pagePath); - - for (let tag of derivedTags) { - tag = `${NEXT_CACHE_IMPLICIT_TAG_ID}${tag}`; - if (!staticGenerationStore.tags?.includes(tag)) { - staticGenerationStore.tags.push(tag); - } - newTags.push(tag); - } - } - - if (urlPathname) { - const parsedPathname = new URL(urlPathname, 'http://n').pathname; - - const tag = `${NEXT_CACHE_IMPLICIT_TAG_ID}${parsedPathname}`; - if (!staticGenerationStore.tags?.includes(tag)) { - staticGenerationStore.tags.push(tag); - } - newTags.push(tag); - } - - return newTags; -} - -/** - * Serializes the given arguments into a string representation. - * - * @param object - The arguments to be serialized. - * - * @returns The serialized string representation of the arguments. - */ -function serializeArguments(object: object): string { - return JSON.stringify(object); -} - -/** - * Serializes the given object into a string representation. - * - * @param object - The object to be serialized. - * - * @returns The serialized string representation of the object. - */ -function serializeResult(object: object): string { - return Buffer.from(JSON.stringify(object), 'utf-8').toString('base64'); -} - -/** - * Deserializes a string representation of an object into its original form. - * - * @param string - The string representation of the object. - * - * @returns The deserialized object. - */ -function deserializeResult(string: string): T { - return JSON.parse(Buffer.from(string, 'base64').toString('utf-8')); -} - -/** - * @template Arguments - The type of the arguments passed to the callback function. - * - * @template Result - The type of the value returned by the callback function. - */ -type Callback = ( - ...args: Arguments -) => Result; - -/** - * An object containing options for the cache. - */ -type NeshCacheOptions = { - /** - * An array of tags to associate with the cached result. - * Tags are used to revalidate the cache using the `revalidateTag` function. - */ - tags?: string[]; - /** - * The revalidation interval in seconds. - * Must be a positive integer or `false` to disable revalidation. - * - * @default revalidate // of the current route - */ - revalidate?: Revalidate; - /** - * A custom cache key to be used instead of creating one from the arguments. - */ - cacheKey?: string; - /** - * A function that serializes the arguments passed to the callback function. - * Use it to create a cache key. - * - * @default (args) => JSON.stringify(args) - * - * @param callbackArguments - The arguments passed to the callback function. - */ - argumentsSerializer?(callbackArguments: Arguments): string; - /** - * - * A function that serializes the result of the callback function. - * - * @default (result) => Buffer.from(JSON.stringify(result)).toString('base64') - * - * @param result - The result of the callback function. - */ - resultSerializer?(result: Result): string; - /** - * A function that deserializes the string representation of the result of the callback function. - * - * @default (string) => JSON.parse(Buffer.from(string, 'base64').toString('utf-8')) - * - * @param string - The string representation of the result of the callback function. - */ - resultDeserializer?(string: string): Result; -}; - -/** - * An object containing common options for the cache. - */ -type CommonNeshCacheOptions = Omit< - NeshCacheOptions, - 'cacheKey' ->; - -/** - * Experimental implementation of the "`unstable_cache`" function with more control over caching. - * - * The API may change in the future. Use with caution. - * - * Caches the result of a callback function and returns a cached version if available. - * If not available, it executes the callback function, caches the result, and returns it. - * - * @param callback - The callback function to be cached. - * - * @param options - An object containing options for the cache. - * - * @param options.tags - An array of tags to associate with the cached result. - * Tags are used to revalidate the cache using the `revalidateTag` function. - * - * @param options.revalidate - The revalidation interval in seconds. - * Must be a positive integer or `false` to disable revalidation. - * Defaults to `export const revalidate = time;` in the current route. - * - * @param options.argumentsSerializer - A function that serializes the arguments passed to the callback function. - * Use it to create a cache key. Defaults to `JSON.stringify(args)`. - * - * @param options.resultSerializer - A function that serializes the result of the callback function. - * Defaults to `Buffer.from(JSON.stringify(data)).toString('base64')`. - * - * @param options.resultDeserializer - A function that deserializes the string representation of the result of the callback function. - * Defaults to `JSON.parse(Buffer.from(data, 'base64').toString('utf-8'))`. - * - * @returns The callback wrapped in a caching function. - * First argument is the cache options which can be used to override the common options. - * In addition, there is a `cacheKey` option that can be used to provide a custom cache key. - * - * @throws If the `neshCache` function is not used in a Next.js app directory or if the `revalidate` option is invalid. - * - * @remarks - * - This function is intended to be used in a Next.js app directory. - * - * @since 1.2.0 - */ -export function neshCache< - Arguments extends unknown[], - Result extends Promise, ->( - callback: Callback, - commonOptions?: CommonNeshCacheOptions, -) { - if (commonOptions?.resultSerializer && !commonOptions?.resultDeserializer) { - throw new Error( - 'neshCache: if you provide a resultSerializer, you must provide a resultDeserializer.', - ); - } - - if (commonOptions?.resultDeserializer && !commonOptions?.resultSerializer) { - throw new Error( - 'neshCache: if you provide a resultDeserializer, you must provide a resultSerializer.', - ); - } - - const commonTags = commonOptions?.tags ?? []; - const commonRevalidate = commonOptions?.revalidate ?? false; - const commonArgumentsSerializer = - commonOptions?.argumentsSerializer ?? serializeArguments; - const commonResultSerializer = - commonOptions?.resultSerializer ?? serializeResult; - const commonResultDeserializer = - commonOptions?.resultDeserializer ?? deserializeResult; - - async function cachedCallback( - options: NeshCacheOptions, - ...args: Arguments - ): Promise { - const store = staticGenerationAsyncStorage.getStore(); - - assert( - store?.incrementalCache, - 'neshCache must be used in a Next.js app directory.', - ); - - const { - tags = [], - revalidate = commonRevalidate, - cacheKey, - argumentsSerializer = commonArgumentsSerializer, - resultDeserializer = commonResultDeserializer, - resultSerializer = commonResultSerializer, - } = options ?? {}; - - assert( - revalidate === false || (revalidate > 0 && Number.isInteger(revalidate)), - 'neshCache: revalidate must be a positive integer or false.', - ); - - if ( - store.fetchCache === 'force-no-store' || - store.isDraftMode || - store.incrementalCache.dev - ) { - return await callback(...args); - } - - const uniqueTags = new Set(store.tags); - - const combinedTags = [...tags, ...commonTags]; - - for (const tag of combinedTags) { - if (typeof tag === 'string') { - uniqueTags.add(tag); - } else { - console.warn( - `neshCache: Invalid tag: ${tag}. Skipping it. Expected a string.`, - ); - } - } - - const allTags = Array.from(uniqueTags); - - // TODO: Find out why this is necessary - store.tags = allTags; - store.revalidate = revalidate; - const fetchIdx = store.nextFetchId ?? 1; - store.nextFetchId = fetchIdx + 1; - - const key = await store.incrementalCache.fetchCacheKey( - `nesh-cache-${cacheKey ?? argumentsSerializer(args)}`, - ); - - const handleUnlock = await store.incrementalCache.lock(key); - - let cacheData: IncrementalCacheEntry | null = null; - - try { - cacheData = await store.incrementalCache.get(key, { - revalidate, - tags: allTags, - softTags: addImplicitTags(store), - kindHint: 'fetch', - fetchIdx, - fetchUrl: 'neshCache', - }); - } catch (error) { - await handleUnlock(); - - throw error; - } - - if (cacheData?.value?.kind === 'FETCH' && cacheData.isStale === false) { - await handleUnlock(); - - return resultDeserializer(cacheData.value.data.body); - } - - let data: Result; - - try { - data = await staticGenerationAsyncStorage.run( - { - ...store, - // force any nested fetches to bypass cache so they revalidate - // when the unstable_cache call is revalidated - fetchCache: 'force-no-store', - }, - callback, - ...args, - ); - } catch (error) { - // biome-ignore lint/complexity/noUselessCatch: we need to rethrow the error - throw error; - } finally { - await handleUnlock(); - } - - store.incrementalCache.set( - key, - { - kind: 'FETCH', - data: { - body: resultSerializer(data), - headers: {}, - url: 'neshCache', - }, - revalidate: revalidate || TIME_ONE_YEAR, - }, - { - revalidate, - tags, - fetchCache: true, - fetchIdx, - fetchUrl: 'neshCache', - }, - ); - - return data; - } - - return cachedCallback; -} diff --git a/packages/cache-handler/src/functions/nesh-classic-cache.ts b/packages/cache-handler/src/functions/nesh-classic-cache.ts deleted file mode 100644 index a802b180..00000000 --- a/packages/cache-handler/src/functions/nesh-classic-cache.ts +++ /dev/null @@ -1,349 +0,0 @@ -import assert from 'node:assert/strict'; -import { createHash } from 'node:crypto'; -import type { Revalidate } from '@repo/next-common'; -import { staticGenerationAsyncStorage } from 'next/dist/client/components/static-generation-async-storage.external.js'; -import type { IncrementalCache } from 'next/dist/server/lib/incremental-cache'; -import type { CacheHandler } from '../cache-handler'; -import { TIME_ONE_YEAR } from '../constants'; - -declare global { - var __incrementalCache: IncrementalCache | undefined; -} - -function hashCacheKey(url: string): string { - // this should be bumped anytime a fix is made to cache entries - // that should bust the cache - const MAIN_KEY_PREFIX = 'nesh-pages-cache-v1'; - - const cacheString = JSON.stringify([MAIN_KEY_PREFIX, url]); - - return createHash('sha256').update(cacheString).digest('hex'); -} - -/** - * Serializes the given arguments into a string representation. - * - * @param object - The arguments to be serialized. - * - * @returns The serialized string representation of the arguments. - */ -function serializeArguments(object: object): string { - return JSON.stringify(object); -} - -/** - * Serializes the given object into a string representation. - * - * @param object - The object to be serialized. - * - * @returns The serialized string representation of the object. - */ -function serializeResult(object: object): string { - return Buffer.from(JSON.stringify(object), 'utf-8').toString('base64'); -} - -/** - * Deserializes a string representation of an object into its original form. - * - * @param string - The string representation of the object. - * - * @returns The deserialized object. - */ -function deserializeResult(string: string): T { - return JSON.parse(Buffer.from(string, 'base64').toString('utf-8')); -} - -/** - * @template Arguments - The type of the arguments passed to the callback function. - * - * @template Result - The type of the value returned by the callback function. - */ -type Callback = ( - ...args: Arguments -) => Result; - -/** - * An object containing options for the cache. - */ -type NeshClassicCacheOptions = { - /** - * The response context object. - * It is used to set the cache headers. - */ - responseContext?: object & { - setHeader( - name: string, - value: number | string | readonly string[], - ): unknown; - }; - /** - * An array of tags to associate with the cached result. - * Tags are used to revalidate the cache using the `revalidateTag` function. - */ - tags?: string[]; - /** - * The revalidation interval in seconds. - * Must be a positive integer or `false` to disable revalidation. - * - * @default revalidate // of the current route - */ - revalidate?: Revalidate; - /** - * A custom cache key to be used instead of creating one from the arguments. - */ - cacheKey?: string; - /** - * A function that serializes the arguments passed to the callback function. - * Use it to create a cache key. - * - * @default (args) => JSON.stringify(args) - * - * @param callbackArguments - The arguments passed to the callback function. - */ - argumentsSerializer?(callbackArguments: Arguments): string; - /** - * - * A function that serializes the result of the callback function. - * - * @default (result) => Buffer.from(JSON.stringify(result)).toString('base64') - * - * @param result - The result of the callback function. - */ - resultSerializer?(result: Result): string; - /** - * A function that deserializes the string representation of the result of the callback function. - * - * @default (string) => JSON.parse(Buffer.from(string, 'base64').toString('utf-8')) - * - * @param string - The string representation of the result of the callback function. - */ - resultDeserializer?(string: string): Result; -}; - -/** - * An object containing common options for the cache. - */ -type CommonNeshClassicCacheOptions = Omit< - NeshClassicCacheOptions, - 'cacheKey' | 'responseContext' ->; - -/** - * Experimental implementation of the "`unstable_cache`" for classic Next.js Pages Router. - * It allows to cache data in the `getServerSideProps` and API routes. - * - * The API may change in the future. Use with caution. - * - * Caches the result of a callback function and returns a cached version if available. - * If not available, it executes the callback function, caches the result, and returns it. - * - * @param callback - The callback function to be cached. - * - * @param options - An object containing options for the cache. - * - * @param options.responseContext - The response context object. - * It is used to set the cache headers. - * - * @param options.tags - An array of tags to associate with the cached result. - * Tags are used to revalidate the cache using the `revalidateTag` function. - * - * @param options.revalidate - The revalidation interval in seconds. - * Must be a positive integer or `false` to disable revalidation. - * Defaults to `export const revalidate = time;` in the current route. - * - * @param options.argumentsSerializer - A function that serializes the arguments passed to the callback function. - * Use it to create a cache key. Defaults to `JSON.stringify(args)`. - * - * @param options.resultSerializer - A function that serializes the result of the callback function. - * Defaults to `Buffer.from(JSON.stringify(data)).toString('base64')`. - * - * @param options.resultDeserializer - A function that deserializes the string representation of the result of the callback function. - * Defaults to `JSON.parse(Buffer.from(data, 'base64').toString('utf-8'))`. - * - * @returns The callback wrapped in a caching function. - * First argument is the cache options which can be used to override the common options. - * In addition, there is a `cacheKey` option that can be used to provide a custom cache key. - * - * @throws If the `neshClassicCache` function is not used in a Next.js Pages directory or if the `revalidate` option is invalid. - * - * @example file: `src/pages/api/api-example.js` - * - * ```js - * import { neshClassicCache } from '@neshca/cache-handler/functions'; - * import axios from 'axios'; - * - * export const config = { - * runtime: 'nodejs', - * }; - * - * async function getViaAxios(url) { - * try { - * return (await axios.get(url.href)).data; - * } catch (_error) { - * return null; - * } - * } - * - * const cachedAxios = neshClassicCache(getViaAxios); - * - * export default async function handler(request, response) { - * if (request.method !== 'GET') { - * return response.status(405).send(null); - * } - * - * const revalidate = 5; - * - * const url = new URL('https://api.example.com/data.json'); - * - * // Add tags to be able to revalidate the cache - * const data = await cachedAxios({ revalidate, tags: [url.pathname], responseContext: response }, url); - * - * if (!data) { - * response.status(404).send('Not found'); - * - * return; - * } - * - * response.json(data); - * } - * ``` - * - * @remarks - * - This function is intended to be used in a Next.js Pages directory. - * - * @since 1.8.0 - */ -export function neshClassicCache< - Arguments extends unknown[], - Result extends Promise, ->( - callback: Callback, - commonOptions?: CommonNeshClassicCacheOptions, -) { - if (commonOptions?.resultSerializer && !commonOptions?.resultDeserializer) { - throw new Error( - 'neshClassicCache: if you provide a resultSerializer, you must provide a resultDeserializer.', - ); - } - - if (commonOptions?.resultDeserializer && !commonOptions?.resultSerializer) { - throw new Error( - 'neshClassicCache: if you provide a resultDeserializer, you must provide a resultSerializer.', - ); - } - - const commonRevalidate = commonOptions?.revalidate ?? false; - const commonArgumentsSerializer = - commonOptions?.argumentsSerializer ?? serializeArguments; - const commonResultSerializer = - commonOptions?.resultSerializer ?? serializeResult; - const commonResultDeserializer = - commonOptions?.resultDeserializer ?? deserializeResult; - - async function cachedCallback( - options: NeshClassicCacheOptions, - ...args: Arguments - ): Promise { - const store = staticGenerationAsyncStorage.getStore(); - - assert( - !store?.incrementalCache, - 'neshClassicCache must be used in a Next.js Pages directory.', - ); - - const cacheHandler = globalThis?.__incrementalCache?.cacheHandler as - | InstanceType - | undefined; - - assert( - cacheHandler, - 'neshClassicCache must be used in a Next.js Pages directory.', - ); - - const { - responseContext, - tags = [], - revalidate = commonRevalidate, - cacheKey, - argumentsSerializer = commonArgumentsSerializer, - resultDeserializer = commonResultDeserializer, - resultSerializer = commonResultSerializer, - } = options ?? {}; - - assert( - revalidate === false || (revalidate > 0 && Number.isInteger(revalidate)), - 'neshClassicCache: revalidate must be a positive integer or false.', - ); - - responseContext?.setHeader( - 'Cache-Control', - `public, s-maxage=${revalidate}, stale-while-revalidate`, - ); - - const uniqueTags = new Set(); - - for (const tag of tags) { - if (typeof tag === 'string') { - uniqueTags.add(tag); - } else { - console.warn( - `neshClassicCache: Invalid tag: ${tag}. Skipping it. Expected a string.`, - ); - } - } - - const allTags = Array.from(uniqueTags); - - const key = hashCacheKey( - `nesh-classic-cache-${cacheKey ?? argumentsSerializer(args)}`, - ); - - const cacheData = await cacheHandler.get(key, { - revalidate, - tags: allTags, - kindHint: 'fetch', - fetchUrl: 'neshClassicCache', - }); - - if ( - cacheData?.value?.kind === 'FETCH' && - cacheData.lifespan && - cacheData.lifespan.staleAt > Date.now() / 1000 - ) { - return resultDeserializer(cacheData.value.data.body); - } - - const data: Result = await callback(...args); - - cacheHandler.set( - key, - { - kind: 'FETCH', - data: { - body: resultSerializer(data), - headers: {}, - url: 'neshClassicCache', - }, - revalidate: revalidate || TIME_ONE_YEAR, - }, - { - revalidate, - tags, - fetchCache: true, - fetchUrl: 'neshClassicCache', - }, - ); - - if ( - cacheData?.value?.kind === 'FETCH' && - cacheData?.lifespan && - cacheData.lifespan.expireAt > Date.now() / 1000 - ) { - return resultDeserializer(cacheData.value.data.body); - } - - return data; - } - - return cachedCallback; -} diff --git a/packages/cache-handler/src/handlers/server.ts b/packages/cache-handler/src/handlers/server.ts deleted file mode 100644 index 8bc2f9d3..00000000 --- a/packages/cache-handler/src/handlers/server.ts +++ /dev/null @@ -1,131 +0,0 @@ -import type { CacheHandlerValue, Handler } from '../cache-handler'; - -export type ServerCacheHandlerOptions = { - /** - * The base URL of the cache store server. - * - * @since 1.0.0 - */ - baseUrl: URL | string; - /** - * Timeout in milliseconds for remote cache store operations. - * - * @since 1.0.0 - */ - timeoutMs?: number; -}; - -/** - * Creates a server-based Handler to use with the `@neshca/server` package. - * - * This function initializes a Handler for managing cache operations via a server. - * It includes methods to get, set, and manage cache values and revalidated tags, - * leveraging server-side storage. - * - * @deprecated This Handler is deprecated since @neshca/cache-handler version 1.7.0 and will be removed in the next major release. - * - * @param options - The configuration options for the server Handler. See {@link ServerCacheHandlerOptions}. - * - * @returns An object representing the cache, with methods for cache operations. - * - * @example - * ```js - * const serverHandler = createHandler({ - * baseUrl: 'http://localhost:8080/', - * }); - * ``` - * - * @remarks - * - the `get` method retrieves a value from the server cache. If the server response has status 404, it returns `null`. - * - the `set` method allows setting a value in the server cache. - * - the `revalidateTag` methods are used for handling tag-based cache revalidation. - */ -export default function createHandler({ - baseUrl, - timeoutMs, -}: ServerCacheHandlerOptions): Handler { - return { - name: 'server', - async get(key, { implicitTags }) { - const url = new URL('/get', baseUrl); - - url.searchParams.set('key', key); - url.searchParams.set('implicitTags', JSON.stringify(implicitTags)); - - const response = await fetch(url, { - signal: timeoutMs ? AbortSignal.timeout(timeoutMs) : undefined, - // @ts-expect-error -- act as an internal fetch call - next: { - internal: true, - }, - }); - - if (response.status === 404) { - return null; - } - - if (!response.ok) { - throw new Error(`get error: ${response.status}`); - } - - const string = await response.text(); - - return JSON.parse(string) as CacheHandlerValue; - }, - async set(key, cacheHandlerValue) { - const url = new URL('/set', baseUrl); - - const response = await fetch(url, { - method: 'POST', - body: JSON.stringify([key, JSON.stringify(cacheHandlerValue)]), - headers: { - 'Content-Type': 'application/json', - }, - signal: timeoutMs ? AbortSignal.timeout(timeoutMs) : undefined, - // @ts-expect-error -- act as an internal fetch call - next: { - internal: true, - }, - }); - - if (!response.ok) { - throw new Error(`set error: ${response.status}`); - } - }, - async revalidateTag(tag) { - const url = new URL('/revalidateTag', baseUrl); - - const response = await fetch(url, { - method: 'POST', - body: JSON.stringify([tag]), - headers: { - 'Content-Type': 'application/json', - }, - signal: timeoutMs ? AbortSignal.timeout(timeoutMs) : undefined, - // @ts-expect-error -- act as an internal fetch call - next: { - internal: true, - }, - }); - - if (!response.ok) { - throw new Error(`revalidateTag error: ${response.status}`); - } - }, - async delete(key) { - const url = new URL(`/${key}`, baseUrl); - - const response = await fetch(url, { - method: 'DELETE', - // @ts-expect-error -- act as an internal fetch call - next: { - internal: true, - }, - }); - - if (!response.ok) { - throw new Error(`delete error: ${response.status}`); - } - }, - }; -} diff --git a/packages/cache-handler/src/instrumentation/register-initial-cache.ts b/packages/cache-handler/src/instrumentation/register-initial-cache.ts index d6d0a35b..0ed8dd55 100644 --- a/packages/cache-handler/src/instrumentation/register-initial-cache.ts +++ b/packages/cache-handler/src/instrumentation/register-initial-cache.ts @@ -1,9 +1,10 @@ import { promises as fsPromises } from 'node:fs'; import path from 'node:path'; -import type { - CachedFetchValue, - Revalidate, - RouteMetadata, +import { + type CachedFetchValue, + CachedRouteKind, + type Revalidate, + type RouteMetadata, } from '@repo/next-common'; import { PRERENDER_MANIFEST, SERVER_DIRECTORY } from 'next/constants'; import type { PrerenderManifest } from 'next/dist/build'; @@ -204,7 +205,7 @@ export async function registerInitialCache( await cacheHandler.set( cachePath, { - kind: 'ROUTE', + kind: CachedRouteKind.APP_ROUTE, body, headers: meta.headers, status: meta.status, @@ -291,10 +292,9 @@ export async function registerInitialCache( await cacheHandler.set( cachePath, { - kind: 'PAGE', + kind: CachedRouteKind.PAGES, html, pageData, - postponed: meta?.postponed, headers: meta?.headers, status: meta?.status, }, diff --git a/packages/cache-handler/tsconfig.json b/packages/cache-handler/tsconfig.json index 3b78eb2d..9a3e464b 100644 --- a/packages/cache-handler/tsconfig.json +++ b/packages/cache-handler/tsconfig.json @@ -3,6 +3,7 @@ "include": ["."], "exclude": ["dist", "node_modules"], "compilerOptions": { + "isolatedModules": false, "paths": { "@repo/next-common": ["../../internal/next-common/src/next-common.ts"], "@repo/next-lru-cache/next-cache-handler-value": [ diff --git a/packages/json-replacer-reviver/.npmignore b/packages/json-replacer-reviver/.npmignore deleted file mode 100644 index b097392b..00000000 --- a/packages/json-replacer-reviver/.npmignore +++ /dev/null @@ -1,5 +0,0 @@ -!dist -.turbo -src -tsconfig.json -tsup.config.ts diff --git a/packages/json-replacer-reviver/CHANGELOG.md b/packages/json-replacer-reviver/CHANGELOG.md deleted file mode 100644 index 7d694265..00000000 --- a/packages/json-replacer-reviver/CHANGELOG.md +++ /dev/null @@ -1,43 +0,0 @@ -# @neshca/json-replacer-reviver - -## 1.1.3 - -### Patch Changes - -- 7adc1af: Fix bin paths in package.json files. - -## 1.1.2 - -### Patch Changes - -- dbf9286: Fixed type in readme - -## 1.1.1 - -### Patch Changes - -- bb61a52: Applied new code style. - -## 1.1.0 - -### Minor Changes - -- 954a21e: Use `exports` instead of `main` and `module` in `package.json` - -## 1.0.3 - -### Patch Changes - -- a9e4604: Switched testing framework from Jest to native Node.js - -## 1.0.2 - -### Patch Changes - -- be8d389: Improve documentation - -## 1.0.1 - -### Patch Changes - -- 32bc1d6: Add changeset configuration for versioning diff --git a/packages/json-replacer-reviver/LICENSE b/packages/json-replacer-reviver/LICENSE deleted file mode 100644 index 5b65b185..00000000 --- a/packages/json-replacer-reviver/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2025 Arseny Kruglikov - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/packages/json-replacer-reviver/README.md b/packages/json-replacer-reviver/README.md deleted file mode 100644 index df318081..00000000 --- a/packages/json-replacer-reviver/README.md +++ /dev/null @@ -1,63 +0,0 @@ -# @neshca/json-replacer-reviver - -Utility library for handling `Buffer` object serialization and deserialization with JSON, offering base64 representations. - -[![npm package](https://img.shields.io/npm/v/@neshca/json-replacer-reviver/latest.svg)](https://www.npmjs.com/package/@neshca/json-replacer-reviver) -[![Dependencies](https://img.shields.io/npm/dm/@neshca/json-replacer-reviver)](https://www.npmjs.com/package/@neshca/json-replacer-reviver) -[![License](https://img.shields.io/npm/l/express.svg)](https://github.com/caching-tools/next-shared-cache/blob/canary/packages/json-replacer-reviver/LICENSE) - -## Installation - -```bash -npm add @neshca/json-replacer-reviver -``` - -```bash -pnpm add @neshca/json-replacer-reviver -``` - -```bash -yarn add @neshca/json-replacer-reviver -``` - -```bash -bun add @neshca/json-replacer-reviver -``` - -## Usage - -```js -const buffer = Buffer.from('hello'); -console.log(buffer); // - -const json = JSON.stringify(buffer); -console.log(json); // '{"type":"Buffer","data":[104,101,108,108,111]}' - -const parsed = JSON.parse(json, reviveFromJsonRepresentation); -console.log(parsed); // -``` - -```js -const buffer = Buffer.from('hello'); -console.log(buffer); // - -const jsonBase64 = JSON.stringify(buffer, replaceJsonWithBase64); -console.log(jsonBase64); // '{"type":"BufferBase64","data":"aGVsbG8="}' - -const parsedFromBase64 = JSON.parse(jsonBase64, reviveFromBase64Representation); -console.log(parsed); // -``` - -## Developing and contributing - -[Developing and contributing to this monorepo](../../docs/contributing/monorepo.md) - -### Running tests locally - -```bash -pnpm -F @repo/json-replacer-reviver test -``` - -## License - -[MIT](./LICENSE) diff --git a/packages/json-replacer-reviver/package.json b/packages/json-replacer-reviver/package.json deleted file mode 100644 index b9f7c8cb..00000000 --- a/packages/json-replacer-reviver/package.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "name": "@neshca/json-replacer-reviver", - "version": "1.1.3", - "description": "Utility library for handling `Buffer` object serialization and deserialization with JSON, offering base64 representations", - "homepage": "https://github.com/caching-tools/next-shared-cache/tree/canary/packages/json-replacer-reviver", - "bugs": "https://github.com/caching-tools/next-shared-cache/issues", - "repository": { - "type": "git", - "url": "git+https://github.com/caching-tools/next-shared-cache.git" - }, - "license": "MIT", - "author": { - "name": "Arseny Kruglikov", - "email": "caching.tools@proton.me" - }, - "type": "module", - "exports": { - "import": "./dist/json-replacer-reviver.js", - "require": "./dist/json-replacer-reviver.cjs", - "types": "./dist/json-replacer-reviver.d.ts" - }, - "scripts": { - "build": "tsup", - "dev": "tsup --watch", - "test": "tsx --test **/*.test.ts", - "test:watch": "tsx --watch --test **/*.test.ts" - }, - "devDependencies": { - "@repo/typescript-config": "workspace:*", - "@types/node": "22.13.5", - "tsup": "8.4.0", - "tsx": "4.19.3", - "typescript": "5.7.3" - } -} diff --git a/packages/json-replacer-reviver/src/json-replacer-reviver.test.ts b/packages/json-replacer-reviver/src/json-replacer-reviver.test.ts deleted file mode 100644 index a1b1a4ed..00000000 --- a/packages/json-replacer-reviver/src/json-replacer-reviver.test.ts +++ /dev/null @@ -1,93 +0,0 @@ -import assert from 'node:assert/strict'; -import { describe, it } from 'node:test'; - -import { - isBufferBase64Representation, - isBufferJsonRepresentation, - replaceJsonWithBase64, - reviveFromBase64Representation, - reviveFromJsonRepresentation, -} from './json-replacer-reviver'; - -const TEST_STRING = 'Hello'; -const TEST_BUFFER = Buffer.from(TEST_STRING); -const JSON_REPRESENTATION = { type: 'Buffer', data: [72, 101, 108, 108, 111] }; -const BASE64_REPRESENTATION = { type: 'BufferBase64', data: 'SGVsbG8=' }; - -const INVALID_INPUTS = [ - {}, - null, - undefined, - 'hello', - 123, - true, - false, - { type: 'Buffer', data: 'hello' }, - { type: 'BufferBase64', data: [1, 2, 3] }, -]; - -await describe('Buffer JSON Representation', async () => { - await it('should identify and revive valid JSON representations', () => { - const json = JSON.stringify(TEST_BUFFER); - const revivedFromJson = JSON.parse( - json, - reviveFromJsonRepresentation, - ) as Buffer; - - assert.strictEqual(isBufferJsonRepresentation(JSON_REPRESENTATION), true); - assert.strictEqual(TEST_BUFFER.equals(revivedFromJson), true); - }); - - await it('should reject invalid JSON representations', () => { - for (const input of INVALID_INPUTS) { - assert.strictEqual(isBufferJsonRepresentation(input), false); - } - }); - - await it('should handle non-Buffer JSON representations during revival', () => { - const value = 'hello'; - const revived = reviveFromJsonRepresentation('', value); - assert.strictEqual(revived, value); - }); - - await it('should convert JSON representation to its Base64 format', () => { - const converted = replaceJsonWithBase64('', JSON_REPRESENTATION); - assert.deepStrictEqual(converted, BASE64_REPRESENTATION); - }); -}); - -await describe('Buffer Base64 Representation', async () => { - await it('should identify and revive valid Base64 representations', () => { - const revived = reviveFromBase64Representation('', BASE64_REPRESENTATION); - - assert.strictEqual( - isBufferBase64Representation(BASE64_REPRESENTATION), - true, - ); - assert.strictEqual(TEST_BUFFER.equals(revived as Buffer), true); - }); - - await it('should reject invalid Base64 representations', () => { - for (const input of INVALID_INPUTS) { - assert.strictEqual(isBufferBase64Representation(input), false); - } - }); - - await it('should handle Buffer serialization and deserialization', () => { - const object = { - someKey: { - name: 'someName', - buffer: TEST_BUFFER, - }, - }; - const serialized = JSON.stringify(object, replaceJsonWithBase64); - const deserialized = JSON.parse( - serialized, - reviveFromBase64Representation, - ) as typeof object; - assert.strictEqual( - object.someKey.buffer.equals(deserialized.someKey.buffer), - true, - ); - }); -}); diff --git a/packages/json-replacer-reviver/src/json-replacer-reviver.ts b/packages/json-replacer-reviver/src/json-replacer-reviver.ts deleted file mode 100644 index f2019890..00000000 --- a/packages/json-replacer-reviver/src/json-replacer-reviver.ts +++ /dev/null @@ -1,151 +0,0 @@ -import { Buffer } from 'node:buffer'; - -/** - * Represents the JSON structure of a `Buffer` object. - */ -export type BufferJsonRepresentation = { - /** - * Indicates the representation type; always 'Buffer' for this structure. - */ - type: 'Buffer'; - /** - * An array of numbers representing the buffer's byte data. - */ - data: number[]; -}; - -/** - * Represents the base64-encoded JSON structure of a `Buffer` object. - */ -export type BufferBase64Representation = { - /** - * Indicates the representation type; always 'BufferBase64' for this structure. - */ - type: 'BufferBase64'; - /** - * A string containing the base64-encoded data of the buffer. - */ - data: string; -}; - -/** - * Determines if a value corresponds to the JSON representation of a `Buffer` object. - * - * @param value - Value to be verified. - * @returns `true` if the value matches the JSON representation of a `Buffer`, otherwise `false`. - */ -export function isBufferJsonRepresentation( - value: unknown, -): value is BufferJsonRepresentation { - return ( - typeof value === 'object' && - value !== null && - (value as BufferJsonRepresentation).type === 'Buffer' && - Array.isArray((value as BufferJsonRepresentation).data) - ); -} - -/** - * Determines if a value matches the base64-encoded JSON format of a `Buffer` object. - * - * @param value - Value to be verified. - * @returns `true` if the value matches the base64-encoded JSON format of a `Buffer`, otherwise `false`. - */ -export function isBufferBase64Representation( - value: unknown, -): value is BufferBase64Representation { - return ( - typeof value === 'object' && - value !== null && - (value as BufferBase64Representation).type === 'BufferBase64' && - typeof (value as BufferBase64Representation).data === 'string' - ); -} - -/** - * Converts a JSON representation of a `Buffer` object back to the actual `Buffer` object. - * - * @param key - Property key during parsing. - * @param value - Associated value during parsing. - * @returns A `Buffer` object if the value is a JSON representation of it; otherwise, returns the original value. - * @example - * ```js - * const buffer = Buffer.from('hello'); - * console.log(buffer); // - * - * const json = JSON.stringify(buffer); - * console.log(json); // '{"type":"Buffer","data":[104,101,108,108,111]}' - * - * const parsed = JSON.parse(json, reviveFromJsonRepresentation); - * console.log(parsed); // - * ``` - */ -export function reviveFromJsonRepresentation( - _key: string, - value: unknown, -): unknown { - if (isBufferJsonRepresentation(value)) { - // @ts-expect-error -- TS doesn't know that Buffer.from can accept a BufferJsonRepresentation - return Buffer.from(value); - } - - return value; -} - -/** - * Transforms a JSON representation of a `Buffer` object into its base64-encoded JSON format. - * - * @param key - Property key during stringification. - * @param value - Associated value during stringification. - * @returns A base64-encoded representation if the value is a `Buffer`; otherwise, returns the original value. - * @example - * ```js - * const buffer = Buffer.from('hello'); - * console.log(buffer); // - * - * const jsonBase64 = JSON.stringify(buffer, replaceJsonWithBase64); - * console.log(jsonBase64); // '{"type":"BufferBase64","data":"aGVsbG8="}' - * - * const parsedFromBase64 = JSON.parse(jsonBase64, reviveFromBase64Representation); - * console.log(parsed); // - * ``` - */ -export function replaceJsonWithBase64(_key: string, value: unknown): unknown { - if (isBufferJsonRepresentation(value)) { - return { - type: 'BufferBase64', - data: Buffer.from(value.data).toString('base64'), - }; - } - - return value; -} - -/** - * Recovers a `Buffer` object from its base64-encoded JSON format. - * - * @param key - Property key during parsing. - * @param value - Associated value during parsing. - * @returns A `Buffer` object if the value is a base64-encoded JSON representation of it; otherwise, returns the original value. - * @example - * ```js - * const buffer = Buffer.from('hello'); - * console.log(buffer); // - * - * const jsonBase64 = JSON.stringify(buffer, replaceJsonWithBase64); - * console.log(jsonBase64); // '{"type":"BufferBase64","data":"aGVsbG8="}' - * - * const parsedFromBase64 = JSON.parse(jsonBase64, reviveFromBase64Representation); - * console.log(parsed); // - * ``` - */ -export function reviveFromBase64Representation( - _key: string, - value: unknown, -): unknown { - if (isBufferBase64Representation(value)) { - return Buffer.from(value.data, 'base64'); - } - - return value; -} diff --git a/packages/json-replacer-reviver/tsconfig.json b/packages/json-replacer-reviver/tsconfig.json deleted file mode 100644 index 9c5847bc..00000000 --- a/packages/json-replacer-reviver/tsconfig.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "extends": "@repo/typescript-config/base.json", - "include": ["."], - "exclude": ["dist", "node_modules"] -} diff --git a/packages/json-replacer-reviver/tsup.config.ts b/packages/json-replacer-reviver/tsup.config.ts deleted file mode 100644 index 3259797c..00000000 --- a/packages/json-replacer-reviver/tsup.config.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { defineConfig } from 'tsup'; - -export const tsup = defineConfig({ - name: 'Build json-replacer-reviver', - entry: ['src/json-replacer-reviver.ts'], - splitting: false, - outDir: 'dist', - clean: false, - format: ['cjs', 'esm'], - dts: true, - target: 'node18', -}); diff --git a/packages/server/.npmignore b/packages/server/.npmignore deleted file mode 100644 index b097392b..00000000 --- a/packages/server/.npmignore +++ /dev/null @@ -1,5 +0,0 @@ -!dist -.turbo -src -tsconfig.json -tsup.config.ts diff --git a/packages/server/CHANGELOG.md b/packages/server/CHANGELOG.md deleted file mode 100644 index 7860b37a..00000000 --- a/packages/server/CHANGELOG.md +++ /dev/null @@ -1,124 +0,0 @@ -# @neshca/server - -## 1.2.0 - -### Minor Changes - -- 978c3e2: Make `@neshca/server` deprecated. `@neshca/cache-handler/server` will be removed in the next major release. - -## 1.1.2 - -### Patch Changes - -- 435a4fe: Implement delete functionality. - -## 1.1.1 - -### Patch Changes - -- 7adc1af: Fix bin paths in package.json files. - -## 1.1.0 - -### Minor Changes - -- 588153b: Add support for the new `implicitTags` parameter. - -## 1.0.0 - -### Major Changes - -- dbf9286: Release 1.0.0 - - #### Breaking Changes - - - change the API to match with the new CacheHandler API - -## 0.6.1 - -### Patch Changes - -- bb61a52: Applied new code style. - -## 0.6.0 - -### Minor Changes - -- 60dab2a: Updated the package to ensure compatibility with the new API for `@neshca/cache-handler`. - - #### Breaking Changes - - - Renamed `getTagsManifest` route to `getRevalidatedTags`; - Changed the return type of `getRevalidatedTags` route. - -## 0.5.1 - -### Patch Changes - -- 274e2e4: Fix remote property injection vulnerability - -## 0.5.0 - -### Minor Changes - -- 9a970af: Add LRU key eviction - -## 0.4.1 - -### Patch Changes - -- cc5323d: Add next14.0.1 to dist tags - -## 0.4.0 - -### Minor Changes - -- b811b66: Upgrade to Next.js v14.0.0 - -## 0.3.10 - -### Patch Changes - -- 334890f: Add next13.5.6 in distTags - -## 0.3.9 - -### Patch Changes - -- be8d389: Improve documentation - -## 0.3.8 - -### Patch Changes - -- 6a33283: Rewrite README to be more clear - -## 0.3.7 - -### Patch Changes - -- a6862db: Change result of /clear-cache route, update pino, remove @vercel/ncc - -## 0.3.6 - -### Patch Changes - -- 892c741: Fix publishing - -## 0.3.5 - -### Patch Changes - -- 8abe6ea: Add supported Next.js versions to distTags - -## 0.3.4 - -### Patch Changes - -- 577ea45: Automatically add dist-tags to npm packages - -## 0.3.3 - -### Patch Changes - -- 32bc1d6: Add changeset configuration for versioning diff --git a/packages/server/LICENSE b/packages/server/LICENSE deleted file mode 100644 index 5b65b185..00000000 --- a/packages/server/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2025 Arseny Kruglikov - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/packages/server/README.md b/packages/server/README.md deleted file mode 100644 index 2a63b2ec..00000000 --- a/packages/server/README.md +++ /dev/null @@ -1,13 +0,0 @@ -## `@neshca/server` - -**This package is deprecated since `@neshca/cache-handler` version 1.7.0 and will be removed in the next major release.** - -Efficient and simple HTTP caching server with LRU eviction, tailored for seamless integration with `@neshca/cache-handler/server` Handler. - -### Overview - -This project provides a simple HTTP server that works seamlessly with `@neshca/cache-handler/server`. It implements an efficient LRU (Least Recently Used) key eviction policy, ensuring optimal use of cache resources by automatically removing the least recently accessed items when the cache reaches its capacity. - -### Usage - -You can see examples of how to use `@neshca/server` in [Remote HTTP server with LRU cache ↗](https://caching-tools.github.io/next-shared-cache/server) section of the `@neshca/cache-handler` documentation. diff --git a/packages/server/package.json b/packages/server/package.json deleted file mode 100644 index 1035bfcc..00000000 --- a/packages/server/package.json +++ /dev/null @@ -1,39 +0,0 @@ -{ - "name": "@neshca/server", - "version": "1.1.2", - "description": "Efficient and simple HTTP caching server with LRU eviction, tailored for seamless integration with `@neshca/cache-handler/server` Handler", - "homepage": "https://github.com/caching-tools/next-shared-cache/tree/canary/packages/server", - "bugs": "https://github.com/caching-tools/next-shared-cache/issues", - "repository": { - "type": "git", - "url": "git+https://github.com/caching-tools/next-shared-cache.git" - }, - "license": "MIT", - "author": { - "name": "Arseny Kruglikov", - "email": "caching.tools@proton.me" - }, - "type": "module", - "exports": null, - "bin": { - "next-cache-server": "dist/server.js" - }, - "scripts": { - "build": "tsup", - "dev": "tsx --watch ./src/server.ts", - "start": "tsx ./src/server.ts" - }, - "dependencies": { - "fastify": "5.2.1", - "pino": "9.6.0" - }, - "devDependencies": { - "@repo/next-common": "workspace:*", - "@repo/next-lru-cache": "workspace:*", - "@repo/typescript-config": "workspace:*", - "@types/node": "22.13.5", - "tsup": "8.4.0", - "tsx": "4.19.3", - "typescript": "5.7.3" - } -} diff --git a/packages/server/src/server.ts b/packages/server/src/server.ts deleted file mode 100644 index 3e890a86..00000000 --- a/packages/server/src/server.ts +++ /dev/null @@ -1,118 +0,0 @@ -#!/usr/bin/env node - -import { NEXT_CACHE_IMPLICIT_TAG_ID } from '@repo/next-common'; -import createCacheStore from '@repo/next-lru-cache/next-cache-handler-value'; -import Fastify from 'fastify'; -import { pino } from 'pino'; - -const logger = pino({ - transport: { - target: 'pino-pretty', - }, - level: process.env.CI ? 'silent' : 'info', -}); - -const server = Fastify(); - -const lruCacheStore = createCacheStore(); - -const host = process.env.HOST ?? 'localhost'; -const port = Number.parseInt(process.env.PORT ?? '8080', 10); - -const revalidatedTags = new Map(); - -server.get('/get', async (request, reply): Promise => { - const { key, implicitTags: implicitTagsString } = request.query as { - key: string; - implicitTags: string; - }; - - const cacheValue = lruCacheStore.get(key); - - if (!cacheValue) { - await reply.code(404).send(null); - - return; - } - - if (cacheValue.lifespan && cacheValue.lifespan.expireAt < Date.now() / 1000) { - lruCacheStore.delete(key); - - await reply.code(404).send(null); - } - - const implicitTags = JSON.parse(implicitTagsString); - - const combinedTags = new Set([...cacheValue.tags, ...implicitTags]); - - if (combinedTags.size === 0) { - await reply.code(404).send(null); - } - - for (const tag of combinedTags) { - const revalidationTime = revalidatedTags.get(tag); - - if (revalidationTime && revalidationTime > cacheValue.lastModified) { - lruCacheStore.delete(key); - - await reply.code(404).send(null); - } - } - - await reply.code(200).send(cacheValue); -}); - -server.post('/set', async (request, reply): Promise => { - const [key, data] = request.body as [string, string, number]; - - lruCacheStore.set(key, JSON.parse(data)); - - await reply.code(200).send(); -}); - -server.post('/revalidateTag', async (request, reply): Promise => { - const [tag] = request.body as [string]; - - for (const [key, { tags }] of lruCacheStore.entries()) { - // If the value's tags include the specified tag, delete this entry - if (tags.includes(tag)) { - lruCacheStore.delete(key); - } - } - - if (tag.startsWith(NEXT_CACHE_IMPLICIT_TAG_ID)) { - revalidatedTags.set(tag, Date.now()); - } - - await reply.code(200).send(); -}); - -server.get('/clear-cache', async (_request, reply): Promise => { - lruCacheStore.clear(); - - await reply.code(200).send(true); -}); - -server.delete('/:key', async (request, reply): Promise => { - const { key } = request.params as { key?: string }; - - if (!key) { - await reply.code(200).send(false); - - return; - } - - lruCacheStore.delete(key); - - await reply.code(200).send(true); -}); - -server - .listen({ port, host }) - .then((address) => { - logger.info('next-cache-server listening on %s', address); - }) - .catch((err) => { - logger.error(err); - process.exit(1); - }); diff --git a/packages/server/tsconfig.json b/packages/server/tsconfig.json deleted file mode 100644 index 27e7353d..00000000 --- a/packages/server/tsconfig.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "extends": "@repo/typescript-config/base.json", - "include": ["."], - "exclude": ["dist", "node_modules"], - "compilerOptions": { - "paths": { - "@repo/next-common": ["../../internal/next-common/src/next-common.ts"] - } - } -} diff --git a/packages/server/tsup.config.ts b/packages/server/tsup.config.ts deleted file mode 100644 index 919757c6..00000000 --- a/packages/server/tsup.config.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { defineConfig } from 'tsup'; - -export const tsup = defineConfig(() => { - return { - name: 'Build server', - entry: ['src/server.ts', 'src/types.ts'], - splitting: false, - dts: true, - clean: true, - outDir: 'dist', - format: 'esm', - target: 'node18', - noExternal: ['@repo/next-lru-cache/string'], - }; -}); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 9b6e112f..09e57205 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -63,6 +63,9 @@ importers: '@types/react-dom': specifier: 19.0.4 version: 19.0.4(@types/react@19.0.10) + dotenv-cli: + specifier: 8.0.0 + version: 8.0.0 eslint: specifier: 9.21.0 version: 9.21.0 @@ -257,55 +260,6 @@ importers: specifier: 5.7.3 version: 5.7.3 - packages/json-replacer-reviver: - devDependencies: - '@repo/typescript-config': - specifier: workspace:* - version: link:../../internal/typescript-config - '@types/node': - specifier: 22.13.5 - version: 22.13.5 - tsup: - specifier: 8.4.0 - version: 8.4.0(postcss@8.4.31)(tsx@4.19.3)(typescript@5.7.3)(yaml@2.7.0) - tsx: - specifier: 4.19.3 - version: 4.19.3 - typescript: - specifier: 5.7.3 - version: 5.7.3 - - packages/server: - dependencies: - fastify: - specifier: 5.2.1 - version: 5.2.1 - pino: - specifier: 9.6.0 - version: 9.6.0 - devDependencies: - '@repo/next-common': - specifier: workspace:* - version: link:../../internal/next-common - '@repo/next-lru-cache': - specifier: workspace:* - version: link:../../internal/next-lru-cache - '@repo/typescript-config': - specifier: workspace:* - version: link:../../internal/typescript-config - '@types/node': - specifier: 22.13.5 - version: 22.13.5 - tsup: - specifier: 8.4.0 - version: 8.4.0(postcss@8.4.31)(tsx@4.19.3)(typescript@5.7.3)(yaml@2.7.0) - tsx: - specifier: 4.19.3 - version: 4.19.3 - typescript: - specifier: 5.7.3 - version: 5.7.3 - packages: '@antfu/install-pkg@1.0.0': @@ -2174,10 +2128,22 @@ packages: dompurify@3.2.4: resolution: {integrity: sha512-ysFSFEDVduQpyhzAob/kkuJjf5zWkZD8/A9ywSp1byueyuCfHamrCBa14/Oc2iiB0e51B+NpxSl5gmzn+Ms/mg==} + dotenv-cli@8.0.0: + resolution: {integrity: sha512-aLqYbK7xKOiTMIRf1lDPbI+Y+Ip/wo5k3eyp6ePysVaSqbyxjyK3dK35BTxG+rmd7djf5q2UPs4noPNH+cj0Qw==} + hasBin: true + + dotenv-expand@10.0.0: + resolution: {integrity: sha512-GopVGCpVS1UKH75VKHGuQFqS1Gusej0z4FyQkPdwjil2gNIv+LNsqBlboOzpJFZKVT95GkCyWJbBSdFEFUWI2A==} + engines: {node: '>=12'} + dotenv@16.0.3: resolution: {integrity: sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ==} engines: {node: '>=12'} + dotenv@16.4.7: + resolution: {integrity: sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ==} + engines: {node: '>=12'} + dunder-proto@1.0.1: resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} engines: {node: '>= 0.4'} @@ -6641,8 +6607,19 @@ snapshots: optionalDependencies: '@types/trusted-types': 2.0.7 + dotenv-cli@8.0.0: + dependencies: + cross-spawn: 7.0.6 + dotenv: 16.4.7 + dotenv-expand: 10.0.0 + minimist: 1.2.8 + + dotenv-expand@10.0.0: {} + dotenv@16.0.3: {} + dotenv@16.4.7: {} + dunder-proto@1.0.1: dependencies: call-bind-apply-helpers: 1.0.2 From 007760d99443a843a87201aa6a35120a94b795ca Mon Sep 17 00:00:00 2001 From: better-salmon <132773930+better-salmon@users.noreply.github.com> Date: Fri, 28 Feb 2025 19:01:16 +0300 Subject: [PATCH 04/16] Migrate to tsc from tsup, remove redundant packages --- .gitignore | 3 + apps/cache-testing/package.json | 1 + apps/cache-testing/tests/app.spec.ts | 1 - apps/cache-testing/tsconfig.json | 16 +- docs/cache-handler-docs/package.json | 1 + docs/cache-handler-docs/tsconfig.json | 18 +- internal/backend/package.json | 1 + internal/backend/tsconfig.json | 6 +- internal/eslint-config/package.json | 2 +- internal/next-common/package.json | 18 - internal/next-common/tsconfig.json | 5 - internal/next-lru-cache/package.json | 19 - internal/next-lru-cache/tsconfig.json | 8 - internal/typescript-config/lib.json | 23 + .../{base.json => local.json} | 25 +- internal/typescript-config/nextjs.json | 22 +- package.json | 7 +- packages/cache-handler/.npmignore | 2 +- packages/cache-handler/package.json | 13 +- packages/cache-handler/src/cache-handler.ts | 46 +- .../handlers/experimental-redis-cluster.ts | 10 +- .../cache-handler/src/handlers/local-lru.ts | 8 +- .../cache-handler/src/handlers/redis-stack.ts | 10 +- .../src/handlers/redis-strings.ts | 22 +- ...-validated-age-estimation-function.test.ts | 4 +- ...reate-validated-age-estimation-function.ts | 2 +- packages/cache-handler/src/helpers/helpers.ts | 6 +- .../src/helpers/is-implicit-tag.ts | 2 +- .../src/helpers/is-tags-manifest.ts | 2 +- .../src/helpers/promise-with-timeout.test.ts | 2 +- .../src/helpers/promise-with-timeout.ts | 2 +- .../src/instrumentation/instrumentation.ts | 2 +- .../instrumentation/register-initial-cache.ts | 36 +- .../cache-types/cache-string-value.ts | 4 +- .../cache-types/next-cache-handler-value.ts | 9 +- .../create-configured-cache.ts | 0 .../cache-handler/src/next-common-types.ts | 20 +- packages/cache-handler/tsconfig.json | 18 +- packages/cache-handler/tsup.config.ts | 19 - pnpm-lock.yaml | 640 ++---------------- turbo.json | 3 + 41 files changed, 225 insertions(+), 833 deletions(-) delete mode 100644 internal/next-common/package.json delete mode 100644 internal/next-common/tsconfig.json delete mode 100644 internal/next-lru-cache/package.json delete mode 100644 internal/next-lru-cache/tsconfig.json create mode 100644 internal/typescript-config/lib.json rename internal/typescript-config/{base.json => local.json} (57%) rename {internal/next-lru-cache/src => packages/cache-handler/src/lru-cache-next-adapter}/cache-types/cache-string-value.ts (96%) rename {internal/next-lru-cache/src => packages/cache-handler/src/lru-cache-next-adapter}/cache-types/next-cache-handler-value.ts (93%) rename {internal/next-lru-cache/src => packages/cache-handler/src/lru-cache-next-adapter}/create-configured-cache.ts (100%) rename internal/next-common/src/next-common.ts => packages/cache-handler/src/next-common-types.ts (91%) delete mode 100644 packages/cache-handler/tsup.config.ts diff --git a/.gitignore b/.gitignore index b87182c8..eaaa73fe 100644 --- a/.gitignore +++ b/.gitignore @@ -38,3 +38,6 @@ yarn-error.log* # Misc .DS_Store *.pem + +# TypeScript build info +tsconfig.tsbuildinfo diff --git a/apps/cache-testing/package.json b/apps/cache-testing/package.json index 89082d92..37afa689 100644 --- a/apps/cache-testing/package.json +++ b/apps/cache-testing/package.json @@ -6,6 +6,7 @@ "type": "module", "scripts": { "build": "next build && tsx create-instances.ts", + "check-types": "tsc --noEmit", "cluster:start": "pm2 start cluster.config.js --env production", "cluster:stop": "pm2 kill", "e2e": "playwright test --config=./playwright.config.ts", diff --git a/apps/cache-testing/tests/app.spec.ts b/apps/cache-testing/tests/app.spec.ts index f28eb6c4..75e11d87 100644 --- a/apps/cache-testing/tests/app.spec.ts +++ b/apps/cache-testing/tests/app.spec.ts @@ -8,7 +8,6 @@ import { const paths = [ '/app/with-params/dynamic-true/200', - '/app/with-params/nesh-cache/200', // '/app/with-params/dynamic-false/200', // this fails with native next.js cache '/app/no-params/dynamic-true/200', '/app/no-params/dynamic-false/200', diff --git a/apps/cache-testing/tsconfig.json b/apps/cache-testing/tsconfig.json index bd8b7571..8f692b0c 100644 --- a/apps/cache-testing/tsconfig.json +++ b/apps/cache-testing/tsconfig.json @@ -3,20 +3,8 @@ "compilerOptions": { "paths": { "cache-testing/*": ["./src/*"] - }, - "plugins": [ - { - "name": "next" - } - ], - "strictNullChecks": true + } }, - "include": [ - "next-env.d.ts", - "**/*.ts", - "**/*.tsx", - ".next/types/**/*.ts", - "run-app-instances.ts" - ], + "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"], "exclude": ["node_modules"] } diff --git a/docs/cache-handler-docs/package.json b/docs/cache-handler-docs/package.json index 0a25e4aa..589a301d 100644 --- a/docs/cache-handler-docs/package.json +++ b/docs/cache-handler-docs/package.json @@ -5,6 +5,7 @@ "type": "module", "scripts": { "build:docs": "next build && pagefind --site .next/server/app --output-path out/_pagefind", + "check-types": "tsc --noEmit", "dev:docs": "next dev --turbo", "eslint:check": "next lint", "eslint:fix": "next lint --fix", diff --git a/docs/cache-handler-docs/tsconfig.json b/docs/cache-handler-docs/tsconfig.json index 91838f5b..8f692b0c 100644 --- a/docs/cache-handler-docs/tsconfig.json +++ b/docs/cache-handler-docs/tsconfig.json @@ -2,21 +2,9 @@ "extends": "@repo/typescript-config/nextjs.json", "compilerOptions": { "paths": { - "cache-handler-docs/*": ["./src/*"] - }, - "plugins": [ - { - "name": "next" - } - ] + "cache-testing/*": ["./src/*"] + } }, - "include": [ - "next-env.d.ts", - "**/*.ts", - "**/*.tsx", - ".next/types/**/*.ts", - "next.config.ts" - ], - + "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"], "exclude": ["node_modules"] } diff --git a/internal/backend/package.json b/internal/backend/package.json index b87ebd9f..27af84c1 100644 --- a/internal/backend/package.json +++ b/internal/backend/package.json @@ -5,6 +5,7 @@ "license": "MIT", "type": "module", "scripts": { + "check-types": "tsc --noEmit", "dev": "tsx --watch ./src/backend.ts", "start": "tsx ./src/backend.ts" }, diff --git a/internal/backend/tsconfig.json b/internal/backend/tsconfig.json index 9c5847bc..9f6d17a6 100644 --- a/internal/backend/tsconfig.json +++ b/internal/backend/tsconfig.json @@ -1,5 +1,5 @@ { - "extends": "@repo/typescript-config/base.json", - "include": ["."], - "exclude": ["dist", "node_modules"] + "extends": "@repo/typescript-config/local.json", + "include": ["**/*.ts"], + "exclude": ["node_modules"] } diff --git a/internal/eslint-config/package.json b/internal/eslint-config/package.json index 4c1bdfd4..833b740a 100644 --- a/internal/eslint-config/package.json +++ b/internal/eslint-config/package.json @@ -12,7 +12,7 @@ "eslint": "9.21.0", "eslint-config-prettier": "10.0.2", "eslint-plugin-react": "7.37.4", - "eslint-plugin-react-hooks": "5.1.0", + "eslint-plugin-react-hooks": "5.2.0", "eslint-plugin-turbo": "2.4.4", "globals": "16.0.0", "typescript": "5.7.3", diff --git a/internal/next-common/package.json b/internal/next-common/package.json deleted file mode 100644 index 2392c3f3..00000000 --- a/internal/next-common/package.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "name": "@repo/next-common", - "version": "0.0.0", - "private": true, - "license": "MIT", - "type": "module", - "exports": { - "types": "./src/next-common.ts" - }, - "dependencies": { - "next": "15.2.0" - }, - "devDependencies": { - "@repo/typescript-config": "workspace:*", - "@types/node": "22.13.5", - "typescript": "5.7.3" - } -} diff --git a/internal/next-common/tsconfig.json b/internal/next-common/tsconfig.json deleted file mode 100644 index 9c5847bc..00000000 --- a/internal/next-common/tsconfig.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "extends": "@repo/typescript-config/base.json", - "include": ["."], - "exclude": ["dist", "node_modules"] -} diff --git a/internal/next-lru-cache/package.json b/internal/next-lru-cache/package.json deleted file mode 100644 index a9097839..00000000 --- a/internal/next-lru-cache/package.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "name": "@repo/next-lru-cache", - "version": "0.0.0", - "private": true, - "license": "MIT", - "type": "module", - "exports": { - "./*": "./src/cache-types/*.ts" - }, - "dependencies": { - "lru-cache": "10.4.3" - }, - "devDependencies": { - "@repo/next-common": "workspace:*", - "@repo/typescript-config": "workspace:*", - "@types/node": "22.13.5", - "typescript": "5.7.3" - } -} diff --git a/internal/next-lru-cache/tsconfig.json b/internal/next-lru-cache/tsconfig.json deleted file mode 100644 index d0bcdc7d..00000000 --- a/internal/next-lru-cache/tsconfig.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "extends": "@repo/typescript-config/base.json", - "include": ["."], - "exclude": ["dist", "node_modules"], - "compilerOptions": { - "isolatedModules": false - } -} diff --git a/internal/typescript-config/lib.json b/internal/typescript-config/lib.json new file mode 100644 index 00000000..41ef5165 --- /dev/null +++ b/internal/typescript-config/lib.json @@ -0,0 +1,23 @@ +{ + "$schema": "https://json.schemastore.org/tsconfig", + "display": "Node 18", + "_version": "18.2.0", + "compilerOptions": { + "target": "es2022", + "lib": ["es2023"], + + "module": "NodeNext", + "moduleDetection": "force", + "esModuleInterop": true, + + "strict": true, + "noUncheckedIndexedAccess": true, + "noImplicitOverride": true, + "skipLibCheck": true, + + "declaration": true, + "declarationMap": true, + "sourceMap": true, + "composite": true + } +} diff --git a/internal/typescript-config/base.json b/internal/typescript-config/local.json similarity index 57% rename from internal/typescript-config/base.json rename to internal/typescript-config/local.json index 23eccef5..95e47a09 100644 --- a/internal/typescript-config/base.json +++ b/internal/typescript-config/local.json @@ -1,22 +1,23 @@ { "$schema": "https://json.schemastore.org/tsconfig", - "display": "Default", + "display": "Node 22", + "_version": "22.0.0", "compilerOptions": { - "declaration": true, - "declarationMap": true, + "target": "es2022", + "lib": ["es2024"], + "esModuleInterop": true, - "incremental": false, - "isolatedModules": true, - "lib": ["es2022"], - "module": "ESNext", "moduleDetection": "force", - "moduleResolution": "bundler", + "module": "preserve", + + "strict": true, "noUncheckedIndexedAccess": true, - "resolveJsonModule": true, + "noImplicitOverride": true, "skipLibCheck": true, - "strict": true, - "target": "ES2022", - "allowJs": true, + "resolveJsonModule": true, + "isolatedModules": true, + "verbatimModuleSyntax": true, + "noEmit": true } } diff --git a/internal/typescript-config/nextjs.json b/internal/typescript-config/nextjs.json index 5a91568f..112912db 100644 --- a/internal/typescript-config/nextjs.json +++ b/internal/typescript-config/nextjs.json @@ -1,10 +1,24 @@ { "$schema": "https://json.schemastore.org/tsconfig", "display": "Next.js", - "extends": "./base.json", "compilerOptions": { - "plugins": [{ "name": "next" }], - "lib": ["ES2022", "DOM", "DOM.Iterable"], - "jsx": "preserve" + "target": "ES2017", + "lib": ["dom", "dom.iterable", "esnext"], + "allowJs": true, + "skipLibCheck": true, + "strict": true, + "noEmit": true, + "esModuleInterop": true, + "module": "esnext", + "moduleResolution": "bundler", + "resolveJsonModule": true, + "isolatedModules": true, + "jsx": "preserve", + "incremental": true, + "plugins": [ + { + "name": "next" + } + ] } } diff --git a/package.json b/package.json index e1d43373..a20176e1 100644 --- a/package.json +++ b/package.json @@ -9,10 +9,11 @@ "build:packages": "turbo run build --filter=!./apps/* --filter=!./docs/*", "build:test-app": "turbo run build --filter=@repo/cache-testing", "changeset": "changeset", + "check-types": "turbo run check-types", "ci:publish": "changeset publish", "ci:version": "changeset version && pnpm codestyle:fix", - "codestyle:check": "biome check . && pnpm prettier:check && pnpm eslint:check", - "codestyle:fix": "biome check --write . && pnpm prettier:fix && pnpm eslint:fix", + "codestyle:check": "biome check . && pnpm prettier:check && pnpm eslint:check && pnpm check-types", + "codestyle:fix": "biome check --write . && pnpm prettier:fix && pnpm eslint:fix && pnpm check-types", "dev:docs": "turbo run dev:docs --filter=@repo/cache-handler-docs", "dev:packages": "turbo run dev", "e2e": "turbo run e2e", @@ -29,7 +30,7 @@ "@biomejs/biome": "1.9.4", "@changesets/cli": "2.28.1", "prettier": "3.5.2", - "prettier-plugin-packagejson": "2.5.8", + "prettier-plugin-packagejson": "2.5.9", "turbo": "2.4.4" }, "packageManager": "pnpm@10.5.2+sha512.da9dc28cd3ff40d0592188235ab25d3202add8a207afbedc682220e4a0029ffbff4562102b9e6e46b4e3f9e8bd53e6d05de48544b0c57d4b0179e22c76d1199b", diff --git a/packages/cache-handler/.npmignore b/packages/cache-handler/.npmignore index b097392b..801abc7f 100644 --- a/packages/cache-handler/.npmignore +++ b/packages/cache-handler/.npmignore @@ -2,4 +2,4 @@ .turbo src tsconfig.json -tsup.config.ts +node_modules diff --git a/packages/cache-handler/package.json b/packages/cache-handler/package.json index 63cabf06..130c071f 100644 --- a/packages/cache-handler/package.json +++ b/packages/cache-handler/package.json @@ -73,21 +73,20 @@ } }, "scripts": { - "build": "tsup --dts-resolve", - "dev": "tsup --watch", + "build": "tsc --build", + "check-types": "tsc --noEmit", + "dev": "tsc --watch", "test": "tsx --test src/**/*.test.ts", "test:watch": "tsx --watch --test src/**/*.test.ts" }, "dependencies": { - "cluster-key-slot": "1.1.2", - "lru-cache": "10.4.3" + "cluster-key-slot": "^1.1.2", + "lru-cache": "^10.4.3", + "superjson": "^2.2.2" }, "devDependencies": { - "@repo/next-common": "workspace:*", - "@repo/next-lru-cache": "workspace:*", "@repo/typescript-config": "workspace:*", "@types/node": "22.13.5", - "tsup": "8.4.0", "tsx": "4.19.3", "typescript": "5.7.3" }, diff --git a/packages/cache-handler/src/cache-handler.ts b/packages/cache-handler/src/cache-handler.ts index f33a9d39..7b066643 100644 --- a/packages/cache-handler/src/cache-handler.ts +++ b/packages/cache-handler/src/cache-handler.ts @@ -12,11 +12,11 @@ import type { CacheHandler as NextCacheHandler, PrerenderManifest, Revalidate, -} from '@repo/next-common'; -import { CachedRouteKind } from '@repo/next-common'; +} from './next-common-types.js'; +import { CachedRouteKind } from './next-common-types.js'; -import { createValidatedAgeEstimationFunction } from './helpers/create-validated-age-estimation-function'; -import { getTagsFromHeaders } from './helpers/get-tags-from-headers'; +import { createValidatedAgeEstimationFunction } from './helpers/create-validated-age-estimation-function.js'; +import { getTagsFromHeaders } from './helpers/get-tags-from-headers.js'; export type { CacheHandlerValue }; @@ -849,13 +849,6 @@ export class CacheHandler implements NextCacheHandler { implicitTags: softTags, }); - if (cachedData?.value?.kind === CachedRouteKind.APP_ROUTE) { - cachedData.value.body = Buffer.from( - cachedData.value.body as unknown as string, - 'base64', - ); - } - if (!cachedData && CacheHandler.#fallbackFalseRoutes.has(cacheKey)) { cachedData = await CacheHandler.#readPagesRouterPage(cacheKey); @@ -901,35 +894,20 @@ export class CacheHandler implements NextCacheHandler { let cacheHandlerValueTags = tags; - let value = incrementalCacheValue; - - switch (value?.kind) { - case CachedRouteKind.PAGES: { - cacheHandlerValueTags = getTagsFromHeaders(value.headers ?? {}); - break; - } - case CachedRouteKind.APP_ROUTE: { - // create a new object to avoid mutating the original value - value = { - // replace the body with a base64 encoded string to save space - body: value.body.toString('base64') as unknown as Buffer, - headers: value.headers, - kind: value.kind, - status: value.status, - }; - - break; - } - default: { - break; - } + if ( + incrementalCacheValue?.kind === CachedRouteKind.PAGES || + incrementalCacheValue?.kind === CachedRouteKind.APP_PAGE + ) { + cacheHandlerValueTags = getTagsFromHeaders( + incrementalCacheValue.headers ?? {}, + ); } const cacheHandlerValue: CacheHandlerValue = { lastModified, lifespan, tags: Object.freeze(cacheHandlerValueTags), - value, + value: incrementalCacheValue, }; await CacheHandler.#mergedHandler.set(cacheKey, cacheHandlerValue); diff --git a/packages/cache-handler/src/handlers/experimental-redis-cluster.ts b/packages/cache-handler/src/handlers/experimental-redis-cluster.ts index fdb8f0e2..dd82083c 100644 --- a/packages/cache-handler/src/handlers/experimental-redis-cluster.ts +++ b/packages/cache-handler/src/handlers/experimental-redis-cluster.ts @@ -1,11 +1,11 @@ import calculate from 'cluster-key-slot'; import type { createCluster } from 'redis'; -import type { CacheHandlerValue, Handler } from '../cache-handler'; -import type { CreateRedisStringsHandlerOptions } from '../common-types'; +import type { CacheHandlerValue, Handler } from '../cache-handler.js'; +import type { CreateRedisStringsHandlerOptions } from '../common-types.js'; -import { REVALIDATED_TAGS_KEY } from '../constants'; -import { getTimeoutRedisCommandOptions } from '../helpers/get-timeout-redis-command-options'; -import { isImplicitTag } from '../helpers/is-implicit-tag'; +import { REVALIDATED_TAGS_KEY } from '../constants.js'; +import { getTimeoutRedisCommandOptions } from '../helpers/get-timeout-redis-command-options.js'; +import { isImplicitTag } from '../helpers/is-implicit-tag.js'; type CreateRedisClusterHandlerOptions> = CreateRedisStringsHandlerOptions & { diff --git a/packages/cache-handler/src/handlers/local-lru.ts b/packages/cache-handler/src/handlers/local-lru.ts index 917334cd..38162e60 100644 --- a/packages/cache-handler/src/handlers/local-lru.ts +++ b/packages/cache-handler/src/handlers/local-lru.ts @@ -1,8 +1,8 @@ -import type { LruCacheOptions } from '@repo/next-lru-cache/next-cache-handler-value'; -import createCacheStore from '@repo/next-lru-cache/next-cache-handler-value'; +import type { LruCacheOptions } from '../lru-cache-next-adapter/cache-types/next-cache-handler-value.js'; +import createCacheStore from '../lru-cache-next-adapter/cache-types/next-cache-handler-value.js'; -import { NEXT_CACHE_IMPLICIT_TAG_ID } from '@repo/next-common'; -import type { Handler } from '../cache-handler'; +import type { Handler } from '../cache-handler.js'; +import { NEXT_CACHE_IMPLICIT_TAG_ID } from '../next-common-types.js'; /** * @deprecated Use {@link LruCacheOptions} instead. diff --git a/packages/cache-handler/src/handlers/redis-stack.ts b/packages/cache-handler/src/handlers/redis-stack.ts index d26f0211..75aca370 100644 --- a/packages/cache-handler/src/handlers/redis-stack.ts +++ b/packages/cache-handler/src/handlers/redis-stack.ts @@ -1,14 +1,14 @@ import { ErrorReply, SchemaFieldTypes } from 'redis'; import { randomBytes } from 'node:crypto'; -import type { CacheHandlerValue, Handler } from '../cache-handler'; +import type { CacheHandlerValue, Handler } from '../cache-handler.js'; import type { CreateRedisStackHandlerOptions, RedisJSON, -} from '../common-types'; -import { REVALIDATED_TAGS_KEY, TIME_ONE_YEAR } from '../constants'; -import { getTimeoutRedisCommandOptions } from '../helpers/get-timeout-redis-command-options'; -import { isImplicitTag } from '../helpers/is-implicit-tag'; +} from '../common-types.js'; +import { REVALIDATED_TAGS_KEY, TIME_ONE_YEAR } from '../constants.js'; +import { getTimeoutRedisCommandOptions } from '../helpers/get-timeout-redis-command-options.js'; +import { isImplicitTag } from '../helpers/is-implicit-tag.js'; export type { CreateRedisStackHandlerOptions }; diff --git a/packages/cache-handler/src/handlers/redis-strings.ts b/packages/cache-handler/src/handlers/redis-strings.ts index 8cf8d4cd..499c9cea 100644 --- a/packages/cache-handler/src/handlers/redis-strings.ts +++ b/packages/cache-handler/src/handlers/redis-strings.ts @@ -1,9 +1,11 @@ -import type { CacheHandlerValue, Handler } from '../cache-handler'; -import type { CreateRedisStringsHandlerOptions } from '../common-types'; +import superjson from 'superjson'; -import { REVALIDATED_TAGS_KEY } from '../constants'; -import { getTimeoutRedisCommandOptions } from '../helpers/get-timeout-redis-command-options'; -import { isImplicitTag } from '../helpers/is-implicit-tag'; +import type { CacheHandlerValue, Handler } from '../cache-handler.js'; +import type { CreateRedisStringsHandlerOptions } from '../common-types.js'; + +import { REVALIDATED_TAGS_KEY } from '../constants.js'; +import { getTimeoutRedisCommandOptions } from '../helpers/get-timeout-redis-command-options.js'; +import { isImplicitTag } from '../helpers/is-implicit-tag.js'; export type { CreateRedisStringsHandlerOptions }; @@ -66,7 +68,7 @@ export default function createHandler({ return null; } - const cacheValue = JSON.parse(result) as CacheHandlerValue | null; + const cacheValue = superjson.parse(result); if (!cacheValue) { return null; @@ -114,7 +116,7 @@ export default function createHandler({ setOperation = client.set( options, keyPrefix + key, - JSON.stringify(cacheHandlerValue), + superjson.stringify(cacheHandlerValue), typeof cacheHandlerValue.lifespan?.expireAt === 'number' ? { EXAT: cacheHandlerValue.lifespan.expireAt, @@ -127,7 +129,7 @@ export default function createHandler({ setOperation = client.set( options, keyPrefix + key, - JSON.stringify(cacheHandlerValue), + superjson.stringify(cacheHandlerValue), ); expireOperation = cacheHandlerValue.lifespan @@ -152,7 +154,7 @@ export default function createHandler({ options, keyPrefix + sharedTagsKey, key, - JSON.stringify(cacheHandlerValue.tags), + superjson.stringify(cacheHandlerValue.tags), ) : undefined; @@ -187,7 +189,7 @@ export default function createHandler({ ); for (const { field, value } of remoteTagsPortion.tuples) { - tagsMap.set(field, JSON.parse(value)); + tagsMap.set(field, superjson.parse(value)); } cursor = remoteTagsPortion.cursor; diff --git a/packages/cache-handler/src/helpers/create-validated-age-estimation-function.test.ts b/packages/cache-handler/src/helpers/create-validated-age-estimation-function.test.ts index adf33d44..03629b71 100644 --- a/packages/cache-handler/src/helpers/create-validated-age-estimation-function.test.ts +++ b/packages/cache-handler/src/helpers/create-validated-age-estimation-function.test.ts @@ -1,7 +1,7 @@ import assert from 'node:assert/strict'; import { test } from 'node:test'; -import { MAX_INT32 } from '../constants'; -import { createValidatedAgeEstimationFunction } from './create-validated-age-estimation-function'; +import { MAX_INT32 } from '../constants.js'; +import { createValidatedAgeEstimationFunction } from './create-validated-age-estimation-function.js'; await test('returns the same age for simple callback', () => { const estimateAge = createValidatedAgeEstimationFunction((age) => age); diff --git a/packages/cache-handler/src/helpers/create-validated-age-estimation-function.ts b/packages/cache-handler/src/helpers/create-validated-age-estimation-function.ts index 601abe6f..073a254e 100644 --- a/packages/cache-handler/src/helpers/create-validated-age-estimation-function.ts +++ b/packages/cache-handler/src/helpers/create-validated-age-estimation-function.ts @@ -1,5 +1,5 @@ import assert from 'node:assert/strict'; -import { MAX_INT32 } from '../constants'; +import { MAX_INT32 } from '../constants.js'; type EstimateExpireAgeFunction = typeof getInitialExpireAge; diff --git a/packages/cache-handler/src/helpers/helpers.ts b/packages/cache-handler/src/helpers/helpers.ts index a85c7fcc..c07b3edb 100644 --- a/packages/cache-handler/src/helpers/helpers.ts +++ b/packages/cache-handler/src/helpers/helpers.ts @@ -1,3 +1,3 @@ -export { promiseWithTimeout } from './promise-with-timeout'; -export { isImplicitTag } from './is-implicit-tag'; -export { getTimeoutRedisCommandOptions } from './get-timeout-redis-command-options'; +export { promiseWithTimeout } from './promise-with-timeout.js'; +export { isImplicitTag } from './is-implicit-tag.js'; +export { getTimeoutRedisCommandOptions } from './get-timeout-redis-command-options.js'; diff --git a/packages/cache-handler/src/helpers/is-implicit-tag.ts b/packages/cache-handler/src/helpers/is-implicit-tag.ts index a97db76f..997bf7f8 100644 --- a/packages/cache-handler/src/helpers/is-implicit-tag.ts +++ b/packages/cache-handler/src/helpers/is-implicit-tag.ts @@ -1,4 +1,4 @@ -import { NEXT_CACHE_IMPLICIT_TAG_ID } from '@repo/next-common'; +import { NEXT_CACHE_IMPLICIT_TAG_ID } from '../next-common-types.js'; /** * Checks if a given tag is an implicit tag. diff --git a/packages/cache-handler/src/helpers/is-tags-manifest.ts b/packages/cache-handler/src/helpers/is-tags-manifest.ts index d585cd18..3198c7e1 100644 --- a/packages/cache-handler/src/helpers/is-tags-manifest.ts +++ b/packages/cache-handler/src/helpers/is-tags-manifest.ts @@ -1,4 +1,4 @@ -import type { TagsManifest } from '@repo/next-common'; +import type { TagsManifest } from '../next-common-types.js'; function hasItems(object: object): object is { items: unknown } { return Object.hasOwn(object, 'items'); diff --git a/packages/cache-handler/src/helpers/promise-with-timeout.test.ts b/packages/cache-handler/src/helpers/promise-with-timeout.test.ts index 8afb62ba..ac4866e2 100644 --- a/packages/cache-handler/src/helpers/promise-with-timeout.test.ts +++ b/packages/cache-handler/src/helpers/promise-with-timeout.test.ts @@ -2,7 +2,7 @@ import assert from 'node:assert/strict'; import { test } from 'node:test'; import Timers from 'node:timers/promises'; -import { promiseWithTimeout } from './promise-with-timeout'; +import { promiseWithTimeout } from './promise-with-timeout.js'; async function simulateOperation(duration: number): Promise { await Timers.scheduler.wait(duration); diff --git a/packages/cache-handler/src/helpers/promise-with-timeout.ts b/packages/cache-handler/src/helpers/promise-with-timeout.ts index 1afac29e..497c944c 100644 --- a/packages/cache-handler/src/helpers/promise-with-timeout.ts +++ b/packages/cache-handler/src/helpers/promise-with-timeout.ts @@ -1,4 +1,4 @@ -import { MAX_INT32 } from '../constants'; +import { MAX_INT32 } from '../constants.js'; /** * Wraps a Promise with a timeout, rejecting the Promise if it does not resolve within the specified time. diff --git a/packages/cache-handler/src/instrumentation/instrumentation.ts b/packages/cache-handler/src/instrumentation/instrumentation.ts index ec501a50..e11bf2ad 100644 --- a/packages/cache-handler/src/instrumentation/instrumentation.ts +++ b/packages/cache-handler/src/instrumentation/instrumentation.ts @@ -1,4 +1,4 @@ export { registerInitialCache, type RegisterInitialCacheOptions, -} from './register-initial-cache'; +} from './register-initial-cache.js'; diff --git a/packages/cache-handler/src/instrumentation/register-initial-cache.ts b/packages/cache-handler/src/instrumentation/register-initial-cache.ts index 0ed8dd55..87c9123e 100644 --- a/packages/cache-handler/src/instrumentation/register-initial-cache.ts +++ b/packages/cache-handler/src/instrumentation/register-initial-cache.ts @@ -1,17 +1,17 @@ import { promises as fsPromises } from 'node:fs'; import path from 'node:path'; +import { PRERENDER_MANIFEST, SERVER_DIRECTORY } from 'next/constants.js'; +import type { PrerenderManifest } from 'next/dist/build'; +import { CACHE_ONE_YEAR } from 'next/dist/lib/constants.js'; +import { getTagsFromHeaders } from '../helpers/get-tags-from-headers.js'; import { type CachedFetchValue, CachedRouteKind, type Revalidate, type RouteMetadata, -} from '@repo/next-common'; -import { PRERENDER_MANIFEST, SERVER_DIRECTORY } from 'next/constants'; -import type { PrerenderManifest } from 'next/dist/build'; -import { CACHE_ONE_YEAR } from 'next/dist/lib/constants'; -import { getTagsFromHeaders } from '../helpers/get-tags-from-headers'; +} from '../next-common-types.js'; -type CacheHandlerType = typeof import('../cache-handler').CacheHandler; +type CacheHandlerType = typeof import('../cache-handler.js').CacheHandler; type Router = 'pages' | 'app'; @@ -289,17 +289,19 @@ export async function registerInitialCache( } try { - await cacheHandler.set( - cachePath, - { - kind: CachedRouteKind.PAGES, - html, - pageData, - headers: meta?.headers, - status: meta?.status, - }, - { revalidate, neshca_lastModified: lastModified }, - ); + if (!isAppRouter) { + await cacheHandler.set( + cachePath, + { + kind: CachedRouteKind.PAGES, + html, + pageData, + headers: meta?.headers, + status: meta?.status, + }, + { revalidate, neshca_lastModified: lastModified }, + ); + } } catch (error) { if (debug) { console.warn( diff --git a/internal/next-lru-cache/src/cache-types/cache-string-value.ts b/packages/cache-handler/src/lru-cache-next-adapter/cache-types/cache-string-value.ts similarity index 96% rename from internal/next-lru-cache/src/cache-types/cache-string-value.ts rename to packages/cache-handler/src/lru-cache-next-adapter/cache-types/cache-string-value.ts index 304425f5..8967f743 100644 --- a/internal/next-lru-cache/src/cache-types/cache-string-value.ts +++ b/packages/cache-handler/src/lru-cache-next-adapter/cache-types/cache-string-value.ts @@ -1,7 +1,7 @@ import type { LRUCache } from 'lru-cache'; -import type { LruCacheOptions } from '../create-configured-cache'; -import { createConfiguredCache } from '../create-configured-cache'; +import type { LruCacheOptions } from '../create-configured-cache.js'; +import { createConfiguredCache } from '../create-configured-cache.js'; function calculateStringSize(value: string): number { return value.length; diff --git a/internal/next-lru-cache/src/cache-types/next-cache-handler-value.ts b/packages/cache-handler/src/lru-cache-next-adapter/cache-types/next-cache-handler-value.ts similarity index 93% rename from internal/next-lru-cache/src/cache-types/next-cache-handler-value.ts rename to packages/cache-handler/src/lru-cache-next-adapter/cache-types/next-cache-handler-value.ts index 14741588..bd5d64b3 100644 --- a/internal/next-lru-cache/src/cache-types/next-cache-handler-value.ts +++ b/packages/cache-handler/src/lru-cache-next-adapter/cache-types/next-cache-handler-value.ts @@ -1,8 +1,11 @@ -import { type CacheHandlerValue, CachedRouteKind } from '@repo/next-common'; import type { LRUCache } from 'lru-cache'; +import { + type CacheHandlerValue, + CachedRouteKind, +} from '../../next-common-types.js'; -import type { LruCacheOptions } from '../create-configured-cache'; -import { createConfiguredCache } from '../create-configured-cache'; +import type { LruCacheOptions } from '../create-configured-cache.js'; +import { createConfiguredCache } from '../create-configured-cache.js'; function calculateObjectSize({ value }: CacheHandlerValue): number { // Return default size if value is falsy diff --git a/internal/next-lru-cache/src/create-configured-cache.ts b/packages/cache-handler/src/lru-cache-next-adapter/create-configured-cache.ts similarity index 100% rename from internal/next-lru-cache/src/create-configured-cache.ts rename to packages/cache-handler/src/lru-cache-next-adapter/create-configured-cache.ts diff --git a/internal/next-common/src/next-common.ts b/packages/cache-handler/src/next-common-types.ts similarity index 91% rename from internal/next-common/src/next-common.ts rename to packages/cache-handler/src/next-common-types.ts index 353f13f1..e472cbac 100644 --- a/internal/next-common/src/next-common.ts +++ b/packages/cache-handler/src/next-common-types.ts @@ -2,19 +2,16 @@ import type { OutgoingHttpHeaders } from 'http'; import type { CacheHandler, + CacheHandlerContext, CacheHandlerValue as NextCacheHandlerValue, } from 'next/dist/server/lib/incremental-cache'; -import type FileSystemCache from 'next/dist/server/lib/incremental-cache/file-system-cache'; import type { CachedRouteKind, IncrementalCacheValue, -} from 'next/dist/server/response-cache/types'; +} from 'next/dist/server/response-cache/types.js'; export type { PrerenderManifest } from 'next/dist/build'; -export type { - CacheHandler, - CacheHandlerContext, -} from 'next/dist/server/lib/incremental-cache'; +export type { CacheHandler } from 'next/dist/server/lib/incremental-cache'; export type { CachedRedirectValue, CachedRouteValue, @@ -22,7 +19,7 @@ export type { CachedFetchValue, IncrementalCacheValue, IncrementalCacheEntry, -} from 'next/dist/server/response-cache/types'; +} from 'next/dist/server/response-cache/types.js'; export { CachedRouteKind } from 'next/dist/server/response-cache/types.js'; @@ -90,9 +87,12 @@ export type NonNullableRouteMetadata = { [K in keyof RouteMetadata]: NonNullable; }; -export type FileSystemCacheContext = ConstructorParameters< - typeof FileSystemCache ->[0]; +export type FileSystemCacheContext = Omit< + CacheHandlerContext, + 'serverDistDir' +> & { + serverDistDir: string; +}; export type CacheHandlerParametersGet = Parameters; diff --git a/packages/cache-handler/tsconfig.json b/packages/cache-handler/tsconfig.json index 9a3e464b..ca0d3bf1 100644 --- a/packages/cache-handler/tsconfig.json +++ b/packages/cache-handler/tsconfig.json @@ -1,14 +1,10 @@ { - "extends": "@repo/typescript-config/base.json", - "include": ["."], - "exclude": ["dist", "node_modules"], + "$schema": "https://json.schemastore.org/tsconfig", + "extends": "@repo/typescript-config/lib.json", "compilerOptions": { - "isolatedModules": false, - "paths": { - "@repo/next-common": ["../../internal/next-common/src/next-common.ts"], - "@repo/next-lru-cache/next-cache-handler-value": [ - "../../internal/next-lru-cache/src/cache-types/next-cache-handler-value.ts" - ] - } - } + "outDir": "dist", + "rootDir": "src" + }, + "include": ["src"], + "exclude": ["**/*.test.ts"] } diff --git a/packages/cache-handler/tsup.config.ts b/packages/cache-handler/tsup.config.ts deleted file mode 100644 index 1f91cdfc..00000000 --- a/packages/cache-handler/tsup.config.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { defineConfig } from 'tsup'; - -export const tsup = defineConfig({ - name: 'Build cache-handler', - entry: [ - 'src/cache-handler.ts', - 'src/handlers/*.ts', - 'src/helpers/helpers.ts', - 'src/functions/functions.ts', - 'src/instrumentation/instrumentation.ts', - ], - splitting: false, - outDir: 'dist', - clean: false, - format: ['cjs', 'esm'], - dts: { resolve: true }, - target: 'node18', - noExternal: ['lru-cache', 'cluster-key-slot'], -}); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 09e57205..effc982a 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -18,8 +18,8 @@ importers: specifier: 3.5.2 version: 3.5.2 prettier-plugin-packagejson: - specifier: 2.5.8 - version: 2.5.8(prettier@3.5.2) + specifier: 2.5.9 + version: 2.5.9(prettier@3.5.2) turbo: specifier: 2.4.4 version: 2.4.4 @@ -171,8 +171,8 @@ importers: specifier: 7.37.4 version: 7.37.4(eslint@9.21.0) eslint-plugin-react-hooks: - specifier: 5.1.0 - version: 5.1.0(eslint@9.21.0) + specifier: 5.2.0 + version: 5.2.0(eslint@9.21.0) eslint-plugin-turbo: specifier: 2.4.4 version: 2.4.4(eslint@9.21.0)(turbo@2.4.4) @@ -186,50 +186,15 @@ importers: specifier: 8.25.0 version: 8.25.0(eslint@9.21.0)(typescript@5.7.3) - internal/next-common: - dependencies: - next: - specifier: 15.2.0 - version: 15.2.0(@playwright/test@1.50.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - devDependencies: - '@repo/typescript-config': - specifier: workspace:* - version: link:../typescript-config - '@types/node': - specifier: 22.13.5 - version: 22.13.5 - typescript: - specifier: 5.7.3 - version: 5.7.3 - - internal/next-lru-cache: - dependencies: - lru-cache: - specifier: 10.4.3 - version: 10.4.3 - devDependencies: - '@repo/next-common': - specifier: workspace:* - version: link:../next-common - '@repo/typescript-config': - specifier: workspace:* - version: link:../typescript-config - '@types/node': - specifier: 22.13.5 - version: 22.13.5 - typescript: - specifier: 5.7.3 - version: 5.7.3 - internal/typescript-config: {} packages/cache-handler: dependencies: cluster-key-slot: - specifier: 1.1.2 + specifier: ^1.1.2 version: 1.1.2 lru-cache: - specifier: 10.4.3 + specifier: ^10.4.3 version: 10.4.3 next: specifier: '>= 15 < 16' @@ -237,22 +202,16 @@ importers: redis: specifier: '>= 4.6' version: 4.7.0 + superjson: + specifier: ^2.2.2 + version: 2.2.2 devDependencies: - '@repo/next-common': - specifier: workspace:* - version: link:../../internal/next-common - '@repo/next-lru-cache': - specifier: workspace:* - version: link:../../internal/next-lru-cache '@repo/typescript-config': specifier: workspace:* version: link:../../internal/typescript-config '@types/node': specifier: 22.13.5 version: 22.13.5 - tsup: - specifier: 8.4.0 - version: 8.4.0(postcss@8.4.31)(tsx@4.19.3)(typescript@5.7.3)(yaml@2.7.0) tsx: specifier: 4.19.3 version: 4.19.3 @@ -765,28 +724,6 @@ packages: cpu: [x64] os: [win32] - '@isaacs/cliui@8.0.2': - resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} - engines: {node: '>=12'} - - '@jridgewell/gen-mapping@0.3.8': - resolution: {integrity: sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==} - engines: {node: '>=6.0.0'} - - '@jridgewell/resolve-uri@3.1.2': - resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} - engines: {node: '>=6.0.0'} - - '@jridgewell/set-array@1.2.1': - resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} - engines: {node: '>=6.0.0'} - - '@jridgewell/sourcemap-codec@1.5.0': - resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} - - '@jridgewell/trace-mapping@0.3.25': - resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} - '@manypkg/find-root@1.1.0': resolution: {integrity: sha512-mki5uBvhHzO8kYYix/WRy2WX8S3B5wdVSc9D6KcU5lQNglP2yt58/VfLuAK49glRXChosY8ap2oJ1qgma3GUVA==} @@ -978,10 +915,6 @@ packages: cpu: [x64] os: [win32] - '@pkgjs/parseargs@0.11.0': - resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} - engines: {node: '>=14'} - '@pkgr/core@0.1.1': resolution: {integrity: sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==} engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} @@ -1068,101 +1001,6 @@ packages: peerDependencies: '@redis/client': ^1.0.0 - '@rollup/rollup-android-arm-eabi@4.34.8': - resolution: {integrity: sha512-q217OSE8DTp8AFHuNHXo0Y86e1wtlfVrXiAlwkIvGRQv9zbc6mE3sjIVfwI8sYUyNxwOg0j/Vm1RKM04JcWLJw==} - cpu: [arm] - os: [android] - - '@rollup/rollup-android-arm64@4.34.8': - resolution: {integrity: sha512-Gigjz7mNWaOL9wCggvoK3jEIUUbGul656opstjaUSGC3eT0BM7PofdAJaBfPFWWkXNVAXbaQtC99OCg4sJv70Q==} - cpu: [arm64] - os: [android] - - '@rollup/rollup-darwin-arm64@4.34.8': - resolution: {integrity: sha512-02rVdZ5tgdUNRxIUrFdcMBZQoaPMrxtwSb+/hOfBdqkatYHR3lZ2A2EGyHq2sGOd0Owk80oV3snlDASC24He3Q==} - cpu: [arm64] - os: [darwin] - - '@rollup/rollup-darwin-x64@4.34.8': - resolution: {integrity: sha512-qIP/elwR/tq/dYRx3lgwK31jkZvMiD6qUtOycLhTzCvrjbZ3LjQnEM9rNhSGpbLXVJYQ3rq39A6Re0h9tU2ynw==} - cpu: [x64] - os: [darwin] - - '@rollup/rollup-freebsd-arm64@4.34.8': - resolution: {integrity: sha512-IQNVXL9iY6NniYbTaOKdrlVP3XIqazBgJOVkddzJlqnCpRi/yAeSOa8PLcECFSQochzqApIOE1GHNu3pCz+BDA==} - cpu: [arm64] - os: [freebsd] - - '@rollup/rollup-freebsd-x64@4.34.8': - resolution: {integrity: sha512-TYXcHghgnCqYFiE3FT5QwXtOZqDj5GmaFNTNt3jNC+vh22dc/ukG2cG+pi75QO4kACohZzidsq7yKTKwq/Jq7Q==} - cpu: [x64] - os: [freebsd] - - '@rollup/rollup-linux-arm-gnueabihf@4.34.8': - resolution: {integrity: sha512-A4iphFGNkWRd+5m3VIGuqHnG3MVnqKe7Al57u9mwgbyZ2/xF9Jio72MaY7xxh+Y87VAHmGQr73qoKL9HPbXj1g==} - cpu: [arm] - os: [linux] - - '@rollup/rollup-linux-arm-musleabihf@4.34.8': - resolution: {integrity: sha512-S0lqKLfTm5u+QTxlFiAnb2J/2dgQqRy/XvziPtDd1rKZFXHTyYLoVL58M/XFwDI01AQCDIevGLbQrMAtdyanpA==} - cpu: [arm] - os: [linux] - - '@rollup/rollup-linux-arm64-gnu@4.34.8': - resolution: {integrity: sha512-jpz9YOuPiSkL4G4pqKrus0pn9aYwpImGkosRKwNi+sJSkz+WU3anZe6hi73StLOQdfXYXC7hUfsQlTnjMd3s1A==} - cpu: [arm64] - os: [linux] - - '@rollup/rollup-linux-arm64-musl@4.34.8': - resolution: {integrity: sha512-KdSfaROOUJXgTVxJNAZ3KwkRc5nggDk+06P6lgi1HLv1hskgvxHUKZ4xtwHkVYJ1Rep4GNo+uEfycCRRxht7+Q==} - cpu: [arm64] - os: [linux] - - '@rollup/rollup-linux-loongarch64-gnu@4.34.8': - resolution: {integrity: sha512-NyF4gcxwkMFRjgXBM6g2lkT58OWztZvw5KkV2K0qqSnUEqCVcqdh2jN4gQrTn/YUpAcNKyFHfoOZEer9nwo6uQ==} - cpu: [loong64] - os: [linux] - - '@rollup/rollup-linux-powerpc64le-gnu@4.34.8': - resolution: {integrity: sha512-LMJc999GkhGvktHU85zNTDImZVUCJ1z/MbAJTnviiWmmjyckP5aQsHtcujMjpNdMZPT2rQEDBlJfubhs3jsMfw==} - cpu: [ppc64] - os: [linux] - - '@rollup/rollup-linux-riscv64-gnu@4.34.8': - resolution: {integrity: sha512-xAQCAHPj8nJq1PI3z8CIZzXuXCstquz7cIOL73HHdXiRcKk8Ywwqtx2wrIy23EcTn4aZ2fLJNBB8d0tQENPCmw==} - cpu: [riscv64] - os: [linux] - - '@rollup/rollup-linux-s390x-gnu@4.34.8': - resolution: {integrity: sha512-DdePVk1NDEuc3fOe3dPPTb+rjMtuFw89gw6gVWxQFAuEqqSdDKnrwzZHrUYdac7A7dXl9Q2Vflxpme15gUWQFA==} - cpu: [s390x] - os: [linux] - - '@rollup/rollup-linux-x64-gnu@4.34.8': - resolution: {integrity: sha512-8y7ED8gjxITUltTUEJLQdgpbPh1sUQ0kMTmufRF/Ns5tI9TNMNlhWtmPKKHCU0SilX+3MJkZ0zERYYGIVBYHIA==} - cpu: [x64] - os: [linux] - - '@rollup/rollup-linux-x64-musl@4.34.8': - resolution: {integrity: sha512-SCXcP0ZpGFIe7Ge+McxY5zKxiEI5ra+GT3QRxL0pMMtxPfpyLAKleZODi1zdRHkz5/BhueUrYtYVgubqe9JBNQ==} - cpu: [x64] - os: [linux] - - '@rollup/rollup-win32-arm64-msvc@4.34.8': - resolution: {integrity: sha512-YHYsgzZgFJzTRbth4h7Or0m5O74Yda+hLin0irAIobkLQFRQd1qWmnoVfwmKm9TXIZVAD0nZ+GEb2ICicLyCnQ==} - cpu: [arm64] - os: [win32] - - '@rollup/rollup-win32-ia32-msvc@4.34.8': - resolution: {integrity: sha512-r3NRQrXkHr4uWy5TOjTpTYojR9XmF0j/RYgKCef+Ag46FWUTltm5ziticv8LdNsDMehjJ543x/+TJAek/xBA2w==} - cpu: [ia32] - os: [win32] - - '@rollup/rollup-win32-x64-msvc@4.34.8': - resolution: {integrity: sha512-U0FaE5O1BCpZSeE6gBl3c5ObhePQSfk9vDRToMmTkbhCOgW4jqvtS5LGyQ76L1fH8sM0keRp4uDTsbjiUyjk0g==} - cpu: [x64] - os: [win32] - '@shikijs/core@2.5.0': resolution: {integrity: sha512-uu/8RExTKtavlpH7XqnVYBrfBkUc20ngXiX9NSrBhOVZYv/7XQRKUyhtkeflY5QsxC0GbJThCerruZfsUaSldg==} @@ -1490,9 +1328,6 @@ packages: resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} engines: {node: '>=12'} - any-promise@1.3.0: - resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} - anymatch@3.1.3: resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} engines: {node: '>= 8'} @@ -1627,12 +1462,6 @@ packages: buffer-from@1.1.2: resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} - bundle-require@5.1.0: - resolution: {integrity: sha512-3WrrOuZiyaaZPWiEt4G3+IffISVC9HYlWueJEBWED4ZH4aIAC2PnkdnuRrR94M+w6yGWn4AglWtJtBI8YqvgoA==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - peerDependencies: - esbuild: '>=0.18' - busboy@1.6.0: resolution: {integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==} engines: {node: '>=10.16.0'} @@ -1641,10 +1470,6 @@ packages: resolution: {integrity: sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==} engines: {node: '>= 0.8'} - cac@6.7.14: - resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} - engines: {node: '>=8'} - call-bind-apply-helpers@1.0.2: resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} engines: {node: '>= 0.4'} @@ -1721,10 +1546,6 @@ packages: resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} engines: {node: '>= 8.10.0'} - chokidar@4.0.3: - resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} - engines: {node: '>= 14.16.0'} - ci-info@3.9.0: resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} engines: {node: '>=8'} @@ -1786,10 +1607,6 @@ packages: commander@2.15.1: resolution: {integrity: sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag==} - commander@4.1.1: - resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} - engines: {node: '>= 6'} - commander@7.2.0: resolution: {integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==} engines: {node: '>= 10'} @@ -1819,10 +1636,6 @@ packages: confbox@0.1.8: resolution: {integrity: sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==} - consola@3.4.0: - resolution: {integrity: sha512-EiPU8G6dQG0GFHNR8ljnZFki/8a+cQwEQ+7wpxdChl02Q8HXlwEZWD5lqAF8vC2sEC3Tehr8hy7vErz88LHyUA==} - engines: {node: ^14.18.0 || >=16.10.0} - content-disposition@0.5.2: resolution: {integrity: sha512-kRGRZw3bLlFISDBgwTSA1TMBFN6J6GWDeubmDE3AF+3+yXL8hTWv8r5rkLbqYXY4RjPk/EzHnClI3zQf1cFmHA==} engines: {node: '>= 0.6'} @@ -1831,6 +1644,10 @@ packages: resolution: {integrity: sha512-9Kr/j4O16ISv8zBBhJoi4bXOYNTkFLOqSL3UDB0njXxCXNezjeyVrJyGOWtgfs/q2km1gwBcfH8q1yEGoMYunA==} engines: {node: '>=18'} + copy-anything@3.0.5: + resolution: {integrity: sha512-yCEafptTtb4bk7GLEQoM8KVJpxAfdBJYaXyzQEgQQQgYrZiDp8SJmGKlYza6CYjEDNstAdNdKA3UuoULlEbS6w==} + engines: {node: '>=12.13'} + cose-base@1.0.3: resolution: {integrity: sha512-s9whTXInMSgAp/NVXVNuVxVKzGH2qck3aQlVHxDCdAEPgtMKwc4Wq6/QKhgdEdgbLSi9rBTAcPoRa6JpiG4ksg==} @@ -2237,8 +2054,8 @@ packages: peerDependencies: eslint: '>=7.0.0' - eslint-plugin-react-hooks@5.1.0: - resolution: {integrity: sha512-mpJRtPgHN2tNAvZ35AMfqeB3Xqeo273QxrHJsbBEPWODRM4r0yB6jfoROqKEYrOn27UtRPpcpHc2UqyBSuUNTw==} + eslint-plugin-react-hooks@5.2.0: + resolution: {integrity: sha512-+f15FfK64YQwZdJNELETdn5ibXEUQmW1DZL6KXhNnc2heoy/sg9VJJeT7n8TlMWouzWqSWavFkIhHyIbIAEapg==} engines: {node: '>=10'} peerDependencies: eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0 @@ -2469,10 +2286,6 @@ packages: resolution: {integrity: sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==} engines: {node: '>= 0.4'} - foreground-child@3.3.1: - resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==} - engines: {node: '>=14'} - form-data@4.0.2: resolution: {integrity: sha512-hGfm/slu0ZabnNt4oaRZ6uREyfCj6P4fT/n6A1rGV+Z0VdGXjfOhVUpkn6qVQONHGIFwmveGXyDs75+nr6FM8w==} engines: {node: '>= 6'} @@ -2569,10 +2382,6 @@ packages: resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} engines: {node: '>=10.13.0'} - glob@10.4.5: - resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} - hasBin: true - globals@14.0.0: resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} engines: {node: '>=18'} @@ -2907,6 +2716,10 @@ packages: resolution: {integrity: sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==} engines: {node: '>= 0.4'} + is-what@4.1.16: + resolution: {integrity: sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A==} + engines: {node: '>=12.13'} + is-windows@1.0.2: resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==} engines: {node: '>=0.10.0'} @@ -2933,9 +2746,6 @@ packages: resolution: {integrity: sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g==} engines: {node: '>= 0.4'} - jackspeak@3.4.3: - resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} - joycon@3.1.1: resolution: {integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==} engines: {node: '>=10'} @@ -3016,17 +2826,6 @@ packages: light-my-request@6.6.0: resolution: {integrity: sha512-CHYbu8RtboSIoVsHZ6Ye4cj4Aw/yg2oAFimlF7mNvfDV192LR7nDiKtSIfCuLT7KokPSTn/9kfVLm5OGN0A28A==} - lilconfig@3.1.3: - resolution: {integrity: sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==} - engines: {node: '>=14'} - - lines-and-columns@1.2.4: - resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} - - load-tsconfig@0.2.5: - resolution: {integrity: sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - local-pkg@1.1.0: resolution: {integrity: sha512-xbZBuX6gYIWrlLmZG43aAVer4ocntYO09vPy9lxd6Ns8DnR4U7N+IIeDkubinqFOHHzoMlPxTxwo0jhE7oYjAw==} engines: {node: '>=14'} @@ -3045,9 +2844,6 @@ packages: lodash.merge@4.6.2: resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} - lodash.sortby@4.7.0: - resolution: {integrity: sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==} - lodash.startcase@4.4.0: resolution: {integrity: sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==} @@ -3311,10 +3107,6 @@ packages: minimist@1.2.8: resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} - minipass@7.1.2: - resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} - engines: {node: '>=16 || 14 >=14.17'} - mj-context-menu@0.6.1: resolution: {integrity: sha512-7NO5s6n10TIV96d4g2uDpG7ZDpIhMh0QNfGdJw/W47JswFcosz457wqz/b5sAKvl12sxINGFCn80NZHKwxQEXA==} @@ -3342,9 +3134,6 @@ packages: mute-stream@0.0.8: resolution: {integrity: sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==} - mz@2.7.0: - resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} - nanoid@3.3.8: resolution: {integrity: sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} @@ -3537,11 +3326,8 @@ packages: resolution: {integrity: sha512-5NPgf87AT2STgwa2ntRMr45jTKrYBGkVU36yT0ig/n/GMAa3oPqhZfIQ2kMEimReg0+t9kZViDVZ83qfVUlckg==} engines: {node: '>= 14'} - package-json-from-dist@1.0.1: - resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} - - package-manager-detector@0.2.9: - resolution: {integrity: sha512-+vYvA/Y31l8Zk8dwxHhL3JfTuHPm6tlxM2A3GeQyl7ovYnSp1+mzAxClxaOr0qO1TtPxbQxetI7v5XqKLJZk7Q==} + package-manager-detector@0.2.10: + resolution: {integrity: sha512-1wlNZK7HW+UE3eGCcMv3hDaYokhspuIeH6enXSnCL1eEZSVDsy/dYwo/4CczhUsrKLA1SSXB+qce8Glw5DEVtw==} pagefind@1.3.0: resolution: {integrity: sha512-8KPLGT5g9s+olKMRTU9LFekLizkVIu9tes90O1/aigJ0T5LmyPqTzGJrETnSw3meSYg58YH7JTzhTTW/3z6VAw==} @@ -3587,10 +3373,6 @@ packages: path-parse@1.0.7: resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} - path-scurry@1.11.1: - resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} - engines: {node: '>=16 || 14 >=14.18'} - path-to-regexp@3.3.0: resolution: {integrity: sha512-qyCH421YQPS2WFDxDjftfc1ZR5WKQzVzqsp4n9M2kQhVOo/ByahFoUNJfl58kOcEGfQ//7weFTDhm+ss8Ecxgw==} @@ -3638,10 +3420,6 @@ packages: resolution: {integrity: sha512-i85pKRCt4qMjZ1+L7sy2Ag4t1atFcdbEt76+7iRJn1g2BvsnRMGu9p8pivl9fs63M2kF/A0OacFZhTub+m/qMg==} hasBin: true - pirates@4.0.6: - resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} - engines: {node: '>= 6'} - pkg-types@1.3.1: resolution: {integrity: sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==} @@ -3688,24 +3466,6 @@ packages: resolution: {integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==} engines: {node: '>= 0.4'} - postcss-load-config@6.0.1: - resolution: {integrity: sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g==} - engines: {node: '>= 18'} - peerDependencies: - jiti: '>=1.21.0' - postcss: '>=8.0.9' - tsx: ^4.8.1 - yaml: ^2.4.2 - peerDependenciesMeta: - jiti: - optional: true - postcss: - optional: true - tsx: - optional: true - yaml: - optional: true - postcss@8.4.31: resolution: {integrity: sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==} engines: {node: ^10 || ^12 || >=14} @@ -3714,8 +3474,8 @@ packages: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} engines: {node: '>= 0.8.0'} - prettier-plugin-packagejson@2.5.8: - resolution: {integrity: sha512-BaGOF63I0IJZoudxpuQe17naV93BRtK8b3byWktkJReKEMX9CC4qdGUzThPDVO/AUhPzlqDiAXbp18U6X8wLKA==} + prettier-plugin-packagejson@2.5.9: + resolution: {integrity: sha512-lhVEpWyYPtO+g9/zQLk6CLkMqcpwR8YGO4mwbbHJaFXoXVeK0LtcgTTalp8vZVmMyHKbcv/zhA1Xp4uQKoeCww==} peerDependencies: prettier: '>= 1.16.0' peerDependenciesMeta: @@ -3761,8 +3521,8 @@ packages: resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} engines: {node: '>=6'} - quansync@0.2.2: - resolution: {integrity: sha512-PrJjqc5Sn6Jv3vlIA9LQs0XdyhCTWrFddMgNP8mGyh3OiMh6ofOES4PRIApcfOZ0wLE2jJN+5/2eyOvzTv9tqw==} + quansync@0.2.6: + resolution: {integrity: sha512-u3TuxVTuJtkTxKGk5oZ7K2/o+l0/cC6J8SOyaaSnrnroqvcVy7xBxtvBUyd+Xa8cGoCr87XmQj4NR6W+zbqH8w==} queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} @@ -3813,10 +3573,6 @@ packages: resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} engines: {node: '>=8.10.0'} - readdirp@4.1.2: - resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==} - engines: {node: '>= 14.18.0'} - reading-time@1.5.0: resolution: {integrity: sha512-onYyVhBNr4CmAxFsKS7bz+uTLRakypIe4R+5A824vBSkQy/hB3fZepoVEf8OVAxzLvK+H/jm9TzpI3ETSm64Kg==} @@ -3966,11 +3722,6 @@ packages: robust-predicates@3.0.2: resolution: {integrity: sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg==} - rollup@4.34.8: - resolution: {integrity: sha512-489gTVMzAYdiZHFVA/ig/iYFllCcWFHMvUHI1rpFmkoUtRlQxqh6/yiNqnYibjMZ2b/+FUQwldG+aLsEt6bglQ==} - engines: {node: '>=18.0.0', npm: '>=8.0.0'} - hasBin: true - roughjs@4.6.6: resolution: {integrity: sha512-ZUz/69+SYpFN/g/lUlo2FXcIjRkSu3nDarreVdGGndHEBJ6cXPdKguS8JGxwj5HA5xIbVKSmLgr5b3AWxtRfvQ==} @@ -4133,8 +3884,8 @@ packages: sort-object-keys@1.1.3: resolution: {integrity: sha512-855pvK+VkU7PaKYPc+Jjnmt4EzejQHyhhF33q31qG8x7maDzkeFhAAThdCYay11CISO+qAMwjOBP+fPZe0IPyg==} - sort-package-json@2.14.0: - resolution: {integrity: sha512-xBRdmMjFB/KW3l51mP31dhlaiFmqkHLfWTfZAno8prb/wbDxwBPWFpxB16GZbiPbYr3wL41H8Kx22QIDWRe8WQ==} + sort-package-json@2.15.0: + resolution: {integrity: sha512-wpKu3DvFuymcRvPqJR7VN5J6wnqR+SYZ4SZmnJa9ckpV+BuoE0XYHZYsoWaJbt6oz8OwOXb4eoMjlEBM6hwhBw==} hasBin: true source-map-js@1.2.1: @@ -4152,10 +3903,6 @@ packages: resolution: {integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==} engines: {node: '>= 8'} - source-map@0.8.0-beta.0: - resolution: {integrity: sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==} - engines: {node: '>= 8'} - space-separated-tokens@2.0.2: resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} @@ -4260,10 +4007,9 @@ packages: stylis@4.3.6: resolution: {integrity: sha512-yQ3rwFWRfwNUY7H5vpU0wfdkNSnvnJinhF9830Swlaxl03zsOjCfmX0ugac+3LtK0lYSgwL/KXc8oYL3mG4YFQ==} - sucrase@3.35.0: - resolution: {integrity: sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==} - engines: {node: '>=16 || 14 >=14.17'} - hasBin: true + superjson@2.2.2: + resolution: {integrity: sha512-5JRxVqC8I8NuOUjzBbvVJAKNM8qoVuH0O77h4WInc/qC2q5IreqKxYwgkga3PfA22OayK2ikceb/B26dztPl+Q==} + engines: {node: '>=16'} supports-color@7.2.0: resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} @@ -4294,13 +4040,6 @@ packages: resolution: {integrity: sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==} engines: {node: '>=8'} - thenify-all@1.6.0: - resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} - engines: {node: '>=0.8'} - - thenify@3.3.1: - resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} - thread-stream@3.1.0: resolution: {integrity: sha512-OqyPZ9u96VohAyMfJykzmivOrY2wfMSf3C5TtFJVgN+Hm6aj+voFhlK+kZEIv2FBh1X6Xp3DlnCOfEQ3B2J86A==} @@ -4327,13 +4066,6 @@ packages: resolution: {integrity: sha512-/m8M+2BJUpoJdgAHoG+baCwBT+tf2VraSfkBgl0Y00qIWt41DJ8R5B8nsEw0I58YwF5IZH6z24/2TobDKnqSWw==} engines: {node: '>=12'} - tr46@1.0.1: - resolution: {integrity: sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==} - - tree-kill@1.2.2: - resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} - hasBin: true - trim-lines@3.0.1: resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==} @@ -4350,34 +4082,12 @@ packages: resolution: {integrity: sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ==} engines: {node: '>=6.10'} - ts-interface-checker@0.1.13: - resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} - tslib@1.9.3: resolution: {integrity: sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==} tslib@2.8.1: resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} - tsup@8.4.0: - resolution: {integrity: sha512-b+eZbPCjz10fRryaAA7C8xlIHnf8VnsaRqydheLIqwG/Mcpfk8Z5zp3HayX7GaTygkigHl5cBUs+IhcySiIexQ==} - engines: {node: '>=18'} - hasBin: true - peerDependencies: - '@microsoft/api-extractor': ^7.36.0 - '@swc/core': ^1 - postcss: ^8.4.12 - typescript: '>=4.5.0' - peerDependenciesMeta: - '@microsoft/api-extractor': - optional: true - '@swc/core': - optional: true - postcss: - optional: true - typescript: - optional: true - tsx@4.19.3: resolution: {integrity: sha512-4H8vUNGNjQ4V2EOoGw005+c+dGuPSnhpPBPHBtsZdGZBk/iJb4kguGlPWaZTZ3q5nMtFOEsY0nRDlh9PJyd6SQ==} engines: {node: '>=18.0.0'} @@ -4577,12 +4287,6 @@ packages: web-namespaces@2.0.1: resolution: {integrity: sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==} - webidl-conversions@4.0.2: - resolution: {integrity: sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==} - - whatwg-url@7.1.0: - resolution: {integrity: sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==} - which-boxed-primitive@1.1.1: resolution: {integrity: sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==} engines: {node: '>= 0.4'} @@ -4615,10 +4319,6 @@ packages: resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} engines: {node: '>=0.10.0'} - wrap-ansi@7.0.0: - resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} - engines: {node: '>=10'} - wrap-ansi@8.1.0: resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} engines: {node: '>=12'} @@ -4688,7 +4388,7 @@ snapshots: '@antfu/install-pkg@1.0.0': dependencies: - package-manager-detector: 0.2.9 + package-manager-detector: 0.2.10 tinyexec: 0.3.2 '@antfu/utils@8.1.1': {} @@ -4787,7 +4487,7 @@ snapshots: fs-extra: 7.0.1 mri: 1.2.0 p-limit: 2.3.0 - package-manager-detector: 0.2.9 + package-manager-detector: 0.2.10 picocolors: 1.1.1 resolve-from: 5.0.0 semver: 7.7.1 @@ -5179,32 +4879,6 @@ snapshots: '@img/sharp-win32-x64@0.33.5': optional: true - '@isaacs/cliui@8.0.2': - dependencies: - string-width: 5.1.2 - string-width-cjs: string-width@4.2.3 - strip-ansi: 7.1.0 - strip-ansi-cjs: strip-ansi@6.0.1 - wrap-ansi: 8.1.0 - wrap-ansi-cjs: wrap-ansi@7.0.0 - - '@jridgewell/gen-mapping@0.3.8': - dependencies: - '@jridgewell/set-array': 1.2.1 - '@jridgewell/sourcemap-codec': 1.5.0 - '@jridgewell/trace-mapping': 0.3.25 - - '@jridgewell/resolve-uri@3.1.2': {} - - '@jridgewell/set-array@1.2.1': {} - - '@jridgewell/sourcemap-codec@1.5.0': {} - - '@jridgewell/trace-mapping@0.3.25': - dependencies: - '@jridgewell/resolve-uri': 3.1.2 - '@jridgewell/sourcemap-codec': 1.5.0 - '@manypkg/find-root@1.1.0': dependencies: '@babel/runtime': 7.26.9 @@ -5371,9 +5045,6 @@ snapshots: '@pagefind/windows-x64@1.3.0': optional: true - '@pkgjs/parseargs@0.11.0': - optional: true - '@pkgr/core@0.1.1': {} '@playwright/test@1.50.1': @@ -5500,63 +5171,6 @@ snapshots: dependencies: '@redis/client': 1.6.0 - '@rollup/rollup-android-arm-eabi@4.34.8': - optional: true - - '@rollup/rollup-android-arm64@4.34.8': - optional: true - - '@rollup/rollup-darwin-arm64@4.34.8': - optional: true - - '@rollup/rollup-darwin-x64@4.34.8': - optional: true - - '@rollup/rollup-freebsd-arm64@4.34.8': - optional: true - - '@rollup/rollup-freebsd-x64@4.34.8': - optional: true - - '@rollup/rollup-linux-arm-gnueabihf@4.34.8': - optional: true - - '@rollup/rollup-linux-arm-musleabihf@4.34.8': - optional: true - - '@rollup/rollup-linux-arm64-gnu@4.34.8': - optional: true - - '@rollup/rollup-linux-arm64-musl@4.34.8': - optional: true - - '@rollup/rollup-linux-loongarch64-gnu@4.34.8': - optional: true - - '@rollup/rollup-linux-powerpc64le-gnu@4.34.8': - optional: true - - '@rollup/rollup-linux-riscv64-gnu@4.34.8': - optional: true - - '@rollup/rollup-linux-s390x-gnu@4.34.8': - optional: true - - '@rollup/rollup-linux-x64-gnu@4.34.8': - optional: true - - '@rollup/rollup-linux-x64-musl@4.34.8': - optional: true - - '@rollup/rollup-win32-arm64-msvc@4.34.8': - optional: true - - '@rollup/rollup-win32-ia32-msvc@4.34.8': - optional: true - - '@rollup/rollup-win32-x64-msvc@4.34.8': - optional: true - '@shikijs/core@2.5.0': dependencies: '@shikijs/engine-javascript': 2.5.0 @@ -5954,8 +5568,6 @@ snapshots: ansi-styles@6.2.1: {} - any-promise@1.3.0: {} - anymatch@3.1.3: dependencies: normalize-path: 3.0.0 @@ -6112,19 +5724,12 @@ snapshots: buffer-from@1.1.2: {} - bundle-require@5.1.0(esbuild@0.25.0): - dependencies: - esbuild: 0.25.0 - load-tsconfig: 0.2.5 - busboy@1.6.0: dependencies: streamsearch: 1.1.0 bytes@3.0.0: {} - cac@6.7.14: {} - call-bind-apply-helpers@1.0.2: dependencies: es-errors: 1.3.0 @@ -6206,10 +5811,6 @@ snapshots: optionalDependencies: fsevents: 2.3.3 - chokidar@4.0.3: - dependencies: - readdirp: 4.1.2 - ci-info@3.9.0: {} cli-boxes@3.0.0: {} @@ -6266,8 +5867,6 @@ snapshots: commander@2.15.1: {} - commander@4.1.1: {} - commander@7.2.0: {} commander@8.3.0: {} @@ -6296,12 +5895,14 @@ snapshots: confbox@0.1.8: {} - consola@3.4.0: {} - content-disposition@0.5.2: {} cookie@1.0.2: {} + copy-anything@3.0.5: + dependencies: + is-what: 4.1.16 + cose-base@1.0.3: dependencies: layout-base: 1.0.2 @@ -6805,7 +6406,7 @@ snapshots: dependencies: eslint: 9.21.0 - eslint-plugin-react-hooks@5.1.0(eslint@9.21.0): + eslint-plugin-react-hooks@5.2.0(eslint@9.21.0): dependencies: eslint: 9.21.0 @@ -7114,11 +6715,6 @@ snapshots: dependencies: is-callable: 1.2.7 - foreground-child@3.3.1: - dependencies: - cross-spawn: 7.0.6 - signal-exit: 4.1.0 - form-data@4.0.2: dependencies: asynckit: 0.4.0 @@ -7221,15 +6817,6 @@ snapshots: dependencies: is-glob: 4.0.3 - glob@10.4.5: - dependencies: - foreground-child: 3.3.1 - jackspeak: 3.4.3 - minimatch: 9.0.5 - minipass: 7.1.2 - package-json-from-dist: 1.0.1 - path-scurry: 1.11.1 - globals@14.0.0: {} globals@15.15.0: {} @@ -7634,6 +7221,8 @@ snapshots: call-bound: 1.0.3 get-intrinsic: 1.3.0 + is-what@4.1.16: {} + is-windows@1.0.2: {} is-wsl@2.2.0: @@ -7661,12 +7250,6 @@ snapshots: has-symbols: 1.1.0 set-function-name: 2.0.2 - jackspeak@3.4.3: - dependencies: - '@isaacs/cliui': 8.0.2 - optionalDependencies: - '@pkgjs/parseargs': 0.11.0 - joycon@3.1.1: {} js-git@0.7.8: @@ -7752,17 +7335,11 @@ snapshots: process-warning: 4.0.1 set-cookie-parser: 2.7.1 - lilconfig@3.1.3: {} - - lines-and-columns@1.2.4: {} - - load-tsconfig@0.2.5: {} - local-pkg@1.1.0: dependencies: mlly: 1.7.4 pkg-types: 1.3.1 - quansync: 0.2.2 + quansync: 0.2.6 locate-path@5.0.0: dependencies: @@ -7776,8 +7353,6 @@ snapshots: lodash.merge@4.6.2: {} - lodash.sortby@4.7.0: {} - lodash.startcase@4.4.0: {} lodash@4.17.21: {} @@ -8344,8 +7919,6 @@ snapshots: minimist@1.2.8: {} - minipass@7.1.2: {} - mj-context-menu@0.6.1: {} mkdirp@1.0.4: {} @@ -8367,12 +7940,6 @@ snapshots: mute-stream@0.0.8: {} - mz@2.7.0: - dependencies: - any-promise: 1.3.0 - object-assign: 4.1.1 - thenify-all: 1.6.0 - nanoid@3.3.8: {} natural-compare@1.4.0: {} @@ -8628,9 +8195,9 @@ snapshots: degenerator: 5.0.1 netmask: 2.0.2 - package-json-from-dist@1.0.1: {} - - package-manager-detector@0.2.9: {} + package-manager-detector@0.2.10: + dependencies: + quansync: 0.2.6 pagefind@1.3.0: optionalDependencies: @@ -8683,11 +8250,6 @@ snapshots: path-parse@1.0.7: {} - path-scurry@1.11.1: - dependencies: - lru-cache: 10.4.3 - minipass: 7.1.2 - path-to-regexp@3.3.0: {} path-type@4.0.0: {} @@ -8747,8 +8309,6 @@ snapshots: sonic-boom: 4.2.0 thread-stream: 3.1.0 - pirates@4.0.6: {} - pkg-types@1.3.1: dependencies: confbox: 0.1.8 @@ -8845,14 +8405,6 @@ snapshots: possible-typed-array-names@1.1.0: {} - postcss-load-config@6.0.1(postcss@8.4.31)(tsx@4.19.3)(yaml@2.7.0): - dependencies: - lilconfig: 3.1.3 - optionalDependencies: - postcss: 8.4.31 - tsx: 4.19.3 - yaml: 2.7.0 - postcss@8.4.31: dependencies: nanoid: 3.3.8 @@ -8861,9 +8413,9 @@ snapshots: prelude-ls@1.2.1: {} - prettier-plugin-packagejson@2.5.8(prettier@3.5.2): + prettier-plugin-packagejson@2.5.9(prettier@3.5.2): dependencies: - sort-package-json: 2.14.0 + sort-package-json: 2.15.0 synckit: 0.9.2 optionalDependencies: prettier: 3.5.2 @@ -8910,7 +8462,7 @@ snapshots: punycode@2.3.1: {} - quansync@0.2.2: {} + quansync@0.2.6: {} queue-microtask@1.2.3: {} @@ -8958,8 +8510,6 @@ snapshots: dependencies: picomatch: 2.3.1 - readdirp@4.1.2: {} - reading-time@1.5.0: {} real-require@0.2.0: {} @@ -9218,31 +8768,6 @@ snapshots: robust-predicates@3.0.2: {} - rollup@4.34.8: - dependencies: - '@types/estree': 1.0.6 - optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.34.8 - '@rollup/rollup-android-arm64': 4.34.8 - '@rollup/rollup-darwin-arm64': 4.34.8 - '@rollup/rollup-darwin-x64': 4.34.8 - '@rollup/rollup-freebsd-arm64': 4.34.8 - '@rollup/rollup-freebsd-x64': 4.34.8 - '@rollup/rollup-linux-arm-gnueabihf': 4.34.8 - '@rollup/rollup-linux-arm-musleabihf': 4.34.8 - '@rollup/rollup-linux-arm64-gnu': 4.34.8 - '@rollup/rollup-linux-arm64-musl': 4.34.8 - '@rollup/rollup-linux-loongarch64-gnu': 4.34.8 - '@rollup/rollup-linux-powerpc64le-gnu': 4.34.8 - '@rollup/rollup-linux-riscv64-gnu': 4.34.8 - '@rollup/rollup-linux-s390x-gnu': 4.34.8 - '@rollup/rollup-linux-x64-gnu': 4.34.8 - '@rollup/rollup-linux-x64-musl': 4.34.8 - '@rollup/rollup-win32-arm64-msvc': 4.34.8 - '@rollup/rollup-win32-ia32-msvc': 4.34.8 - '@rollup/rollup-win32-x64-msvc': 4.34.8 - fsevents: 2.3.3 - roughjs@4.6.6: dependencies: hachure-fill: 0.5.2 @@ -9467,7 +8992,7 @@ snapshots: sort-object-keys@1.1.3: {} - sort-package-json@2.14.0: + sort-package-json@2.15.0: dependencies: detect-indent: 7.0.1 detect-newline: 4.0.1 @@ -9489,10 +9014,6 @@ snapshots: source-map@0.7.4: {} - source-map@0.8.0-beta.0: - dependencies: - whatwg-url: 7.1.0 - space-separated-tokens@2.0.2: {} spawndamnit@3.0.1: @@ -9606,15 +9127,9 @@ snapshots: stylis@4.3.6: {} - sucrase@3.35.0: + superjson@2.2.2: dependencies: - '@jridgewell/gen-mapping': 0.3.8 - commander: 4.1.1 - glob: 10.4.5 - lines-and-columns: 1.2.4 - mz: 2.7.0 - pirates: 4.0.6 - ts-interface-checker: 0.1.13 + copy-anything: 3.0.5 supports-color@7.2.0: dependencies: @@ -9636,14 +9151,6 @@ snapshots: term-size@2.2.1: {} - thenify-all@1.6.0: - dependencies: - thenify: 3.3.1 - - thenify@3.3.1: - dependencies: - any-promise: 1.3.0 - thread-stream@3.1.0: dependencies: real-require: 0.2.0 @@ -9671,12 +9178,6 @@ snapshots: toad-cache@3.7.0: {} - tr46@1.0.1: - dependencies: - punycode: 2.3.1 - - tree-kill@1.2.2: {} - trim-lines@3.0.1: {} trough@2.2.0: {} @@ -9687,39 +9188,10 @@ snapshots: ts-dedent@2.2.0: {} - ts-interface-checker@0.1.13: {} - tslib@1.9.3: {} tslib@2.8.1: {} - tsup@8.4.0(postcss@8.4.31)(tsx@4.19.3)(typescript@5.7.3)(yaml@2.7.0): - dependencies: - bundle-require: 5.1.0(esbuild@0.25.0) - cac: 6.7.14 - chokidar: 4.0.3 - consola: 3.4.0 - debug: 4.4.0 - esbuild: 0.25.0 - joycon: 3.1.1 - picocolors: 1.1.1 - postcss-load-config: 6.0.1(postcss@8.4.31)(tsx@4.19.3)(yaml@2.7.0) - resolve-from: 5.0.0 - rollup: 4.34.8 - source-map: 0.8.0-beta.0 - sucrase: 3.35.0 - tinyexec: 0.3.2 - tinyglobby: 0.2.12 - tree-kill: 1.2.2 - optionalDependencies: - postcss: 8.4.31 - typescript: 5.7.3 - transitivePeerDependencies: - - jiti - - supports-color - - tsx - - yaml - tsx@4.19.3: dependencies: esbuild: 0.25.0 @@ -9966,14 +9438,6 @@ snapshots: web-namespaces@2.0.1: {} - webidl-conversions@4.0.2: {} - - whatwg-url@7.1.0: - dependencies: - lodash.sortby: 4.7.0 - tr46: 1.0.1 - webidl-conversions: 4.0.2 - which-boxed-primitive@1.1.1: dependencies: is-bigint: 1.1.0 @@ -10026,12 +9490,6 @@ snapshots: word-wrap@1.2.5: {} - wrap-ansi@7.0.0: - dependencies: - ansi-styles: 4.3.0 - string-width: 4.2.3 - strip-ansi: 6.0.1 - wrap-ansi@8.1.0: dependencies: ansi-styles: 6.2.1 diff --git a/turbo.json b/turbo.json index 67bff6c0..f5cb50e6 100644 --- a/turbo.json +++ b/turbo.json @@ -49,6 +49,9 @@ "dev:docs": { "cache": false, "persistent": true + }, + "check-types": { + "cache": false } } } From f667bdbb3acf4130af1d95919ec433669c4f0e11 Mon Sep 17 00:00:00 2001 From: better-salmon <132773930+better-salmon@users.noreply.github.com> Date: Sat, 1 Mar 2025 16:39:57 +0300 Subject: [PATCH 05/16] Refactor cache handler imports and configuration --- .github/workflows/tests.yml | 2 +- .vscode/settings.json | 11 +- apps/cache-testing/cache-handler-local.js | 2 +- ...mple.cjs => cache-handler-next-example.js} | 4 +- .../cache-handler-redis-stack.cjs | 89 ---- .../cache-handler-redis-stack.js | 4 +- .../cache-handler-redis-strings.js | 2 +- .../{next.config.js => next.config.ts} | 6 +- apps/cache-testing/package.json | 4 +- apps/cache-testing/src/instrumentation.ts | 2 +- docs/cache-handler-docs/package.json | 8 +- internal/backend/package.json | 4 +- internal/eslint-config/package.json | 4 +- internal/typescript-config/lib.json | 4 +- package.json | 7 +- packages/cache-handler/package.json | 62 +-- .../src/instrumentation/instrumentation.ts | 4 - .../instrumentation/register-initial-cache.ts | 2 +- .../cache-handler/src/next-common-types.ts | 6 +- packages/cache-handler/tsconfig.json | 4 +- pnpm-lock.yaml | 412 ++++++++++-------- 21 files changed, 264 insertions(+), 379 deletions(-) rename apps/cache-testing/{cache-handler-next-example.cjs => cache-handler-next-example.js} (95%) delete mode 100644 apps/cache-testing/cache-handler-redis-stack.cjs rename apps/cache-testing/{next.config.js => next.config.ts} (89%) delete mode 100644 packages/cache-handler/src/instrumentation/instrumentation.ts diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 073f6e9b..c19647c4 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -68,7 +68,7 @@ jobs: - name: Replace Path with Sed run: | if [ "${{ matrix.handler }}" == "redis-strings" ]; then - sed -i 's/cache-handler-redis-stack/cache-handler-redis-strings/g' apps/cache-testing/next.config.js + sed -i 's/cache-handler-redis-stack/cache-handler-redis-strings/g' apps/cache-testing/next.config.ts sed -i 's/cache-handler-redis-stack/cache-handler-redis-strings/g' apps/cache-testing/src/instrumentation.ts fi diff --git a/.vscode/settings.json b/.vscode/settings.json index e03f15de..03a519aa 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -5,19 +5,13 @@ } ], "typescript.surveys.enabled": false, + "typescript.tsdk": "node_modules/typescript/lib", "explorer.fileNesting.enabled": true, "explorer.fileNesting.patterns": { "*.ts": "$(capture).test.ts, $(capture).test.tsx", "*.tsx": "$(capture).test.ts, $(capture).test.tsx" }, "cSpell.words": ["nextjs", "prerendered", "codestyle"], - "grammarly.selectors": [ - { - "language": "markdown", - "scheme": "file" - } - ], - // "typescript.tsdk": "node_modules/typescript/lib", "editor.defaultFormatter": "biomejs.biome", "[jsonc]": { "editor.defaultFormatter": "esbenp.prettier-vscode" @@ -49,6 +43,5 @@ }, "[typescriptreact]": { "editor.defaultFormatter": "biomejs.biome" - }, - "grammarly.files.include": ["**/*.md", "**/*.mdx"] + } } diff --git a/apps/cache-testing/cache-handler-local.js b/apps/cache-testing/cache-handler-local.js index 2d30bbe3..875c7ada 100644 --- a/apps/cache-testing/cache-handler-local.js +++ b/apps/cache-testing/cache-handler-local.js @@ -1,7 +1,7 @@ // @ts-check import { CacheHandler } from '@neshca/cache-handler'; -import createLruHandler from '@neshca/cache-handler/local-lru'; +import createLruHandler from '@neshca/cache-handler/handlers/local-lru'; CacheHandler.onCreation(() => { const localHandler = createLruHandler(); diff --git a/apps/cache-testing/cache-handler-next-example.cjs b/apps/cache-testing/cache-handler-next-example.js similarity index 95% rename from apps/cache-testing/cache-handler-next-example.cjs rename to apps/cache-testing/cache-handler-next-example.js index d42e4368..f7a19f13 100644 --- a/apps/cache-testing/cache-handler-next-example.cjs +++ b/apps/cache-testing/cache-handler-next-example.js @@ -1,6 +1,6 @@ const cache = new Map(); -module.exports = class CacheHandler { +export default class CacheHandler { constructor(options) { this.options = options; } @@ -32,4 +32,4 @@ module.exports = class CacheHandler { } } } -}; +} diff --git a/apps/cache-testing/cache-handler-redis-stack.cjs b/apps/cache-testing/cache-handler-redis-stack.cjs deleted file mode 100644 index decb4bf6..00000000 --- a/apps/cache-testing/cache-handler-redis-stack.cjs +++ /dev/null @@ -1,89 +0,0 @@ -// @ts-check - -const { CacheHandler } = require('@neshca/cache-handler'); -const createLruHandler = require('@neshca/cache-handler/local-lru').default; -const createRedisHandler = require('@neshca/cache-handler/redis-stack').default; -const { createClient } = require('redis'); - -CacheHandler.onCreation(async () => { - if (!process.env.REDIS_URL) { - console.warn( - 'Make sure that REDIS_URL is added to the .env.local file and loaded properly.', - ); - } - - let client; - - try { - // Create a Redis client. - client = createClient({ - url: process.env.REDIS_URL, - name: `cache-handler:${process.env.PORT ?? process.pid}`, - }); - - // Redis won't work without error handling. https://github.com/redis/node-redis?tab=readme-ov-file#events - client.on('error', (error) => { - if (typeof process.env.NEXT_PRIVATE_DEBUG_CACHE !== 'undefined') { - console.error('Redis client error:', error); - } - }); - } catch (error) { - console.warn('Failed to create Redis client:', error); - } - - if (client) { - try { - console.info('Connecting Redis client...'); - - // Wait for the client to connect. - // Caveat: This will block the server from starting until the client is connected. - // And there is no timeout. Make your own timeout if needed. - await client.connect(); - console.info('Redis client connected.'); - } catch (error) { - console.warn('Failed to connect Redis client:', error); - - console.warn('Disconnecting the Redis client...'); - // Try to disconnect the client to stop it from reconnecting. - client - .disconnect() - .then(() => { - console.info('Redis client disconnected.'); - }) - .catch(() => { - console.warn( - 'Failed to quit the Redis client after failing to connect.', - ); - }); - } - } - - /** @type {import("@neshca/cache-handler").Handler | null} */ - let handler; - - if (client) { - // Create the `redis-stack` Handler if the client is available. - handler = createRedisHandler({ - client, - keyPrefix: 'JSON:', - timeoutMs: 1000, - }); - } else { - // Fallback to LRU handler if Redis client is not available. - // The application will still work, but the cache will be in-memory only and not shared. - handler = createLruHandler(); - console.warn( - 'Falling back to LRU handler because Redis client is not available.', - ); - } - - return { - handlers: [handler], - ttl: { - defaultStaleAge: 60, - estimateExpireAge: (staleAge) => staleAge * 2, - }, - }; -}); - -module.exports = CacheHandler; diff --git a/apps/cache-testing/cache-handler-redis-stack.js b/apps/cache-testing/cache-handler-redis-stack.js index 7ea08856..28dee186 100644 --- a/apps/cache-testing/cache-handler-redis-stack.js +++ b/apps/cache-testing/cache-handler-redis-stack.js @@ -1,8 +1,8 @@ // @ts-check import { CacheHandler } from '@neshca/cache-handler'; -import createLruHandler from '@neshca/cache-handler/local-lru'; -import createRedisHandler from '@neshca/cache-handler/redis-stack'; +import createLruHandler from '@neshca/cache-handler/handlers/local-lru'; +import createRedisHandler from '@neshca/cache-handler/handlers/redis-stack'; import { createClient } from 'redis'; CacheHandler.onCreation(async () => { diff --git a/apps/cache-testing/cache-handler-redis-strings.js b/apps/cache-testing/cache-handler-redis-strings.js index 39f87e32..1ad40915 100644 --- a/apps/cache-testing/cache-handler-redis-strings.js +++ b/apps/cache-testing/cache-handler-redis-strings.js @@ -1,7 +1,7 @@ // @ts-check import { CacheHandler } from '@neshca/cache-handler'; -import createRedisHandler from '@neshca/cache-handler/redis-strings'; +import createRedisHandler from '@neshca/cache-handler/handlers/redis-strings'; import { createClient } from 'redis'; CacheHandler.onCreation(async () => { diff --git a/apps/cache-testing/next.config.js b/apps/cache-testing/next.config.ts similarity index 89% rename from apps/cache-testing/next.config.js rename to apps/cache-testing/next.config.ts index e290176d..b08597da 100644 --- a/apps/cache-testing/next.config.js +++ b/apps/cache-testing/next.config.ts @@ -1,11 +1,9 @@ -// @ts-check - import path from 'node:path'; +import type { NextConfig } from 'next/types'; const cacheHandler = path.resolve('./cache-handler-redis-stack.js'); -/** @type {import('next').NextConfig} */ -const nextConfig = { +const nextConfig: NextConfig = { poweredByHeader: false, reactStrictMode: true, output: 'standalone', diff --git a/apps/cache-testing/package.json b/apps/cache-testing/package.json index 37afa689..78d18428 100644 --- a/apps/cache-testing/package.json +++ b/apps/cache-testing/package.json @@ -28,7 +28,7 @@ "@playwright/test": "1.50.1", "@repo/eslint-config": "workspace:*", "@repo/typescript-config": "workspace:*", - "@types/node": "22.13.5", + "@types/node": "22.13.9", "@types/react": "19.0.10", "@types/react-dom": "19.0.4", "dotenv-cli": "8.0.0", @@ -36,6 +36,6 @@ "fastify": "5.2.1", "pm2": "5.4.3", "tsx": "4.19.3", - "typescript": "5.7.3" + "typescript": "5.8.2" } } diff --git a/apps/cache-testing/src/instrumentation.ts b/apps/cache-testing/src/instrumentation.ts index 903aebf7..a3b9d874 100644 --- a/apps/cache-testing/src/instrumentation.ts +++ b/apps/cache-testing/src/instrumentation.ts @@ -1,7 +1,7 @@ export async function register() { if (process.env.NEXT_RUNTIME === 'nodejs') { const { registerInitialCache } = await import( - '@neshca/cache-handler/instrumentation' + '@neshca/cache-handler/instrumentation/register-initial-cache' ); const CacheHandler = (await import('../cache-handler-redis-stack.js')) .default; diff --git a/docs/cache-handler-docs/package.json b/docs/cache-handler-docs/package.json index 589a301d..065999a5 100644 --- a/docs/cache-handler-docs/package.json +++ b/docs/cache-handler-docs/package.json @@ -13,20 +13,20 @@ }, "dependencies": { "next": "15.2.0", - "nextra": "4.2.13", - "nextra-theme-docs": "4.2.13", + "nextra": "4.2.14", + "nextra-theme-docs": "4.2.14", "react": "19.0.0", "react-dom": "19.0.0" }, "devDependencies": { "@repo/eslint-config": "workspace:*", "@repo/typescript-config": "workspace:*", - "@types/node": "22.13.5", + "@types/node": "22.13.9", "@types/react": "19.0.10", "@types/react-dom": "19.0.4", "eslint": "9.21.0", "pagefind": "1.3.0", "serve": "14.2.4", - "typescript": "5.7.3" + "typescript": "5.8.2" } } diff --git a/internal/backend/package.json b/internal/backend/package.json index 27af84c1..713759e8 100644 --- a/internal/backend/package.json +++ b/internal/backend/package.json @@ -15,9 +15,9 @@ }, "devDependencies": { "@repo/typescript-config": "workspace:*", - "@types/node": "22.13.5", + "@types/node": "22.13.9", "pino-pretty": "13.0.0", "tsx": "4.19.3", - "typescript": "5.7.3" + "typescript": "5.8.2" } } diff --git a/internal/eslint-config/package.json b/internal/eslint-config/package.json index 833b740a..c83a6042 100644 --- a/internal/eslint-config/package.json +++ b/internal/eslint-config/package.json @@ -15,7 +15,7 @@ "eslint-plugin-react-hooks": "5.2.0", "eslint-plugin-turbo": "2.4.4", "globals": "16.0.0", - "typescript": "5.7.3", - "typescript-eslint": "8.25.0" + "typescript": "5.8.2", + "typescript-eslint": "8.26.0" } } diff --git a/internal/typescript-config/lib.json b/internal/typescript-config/lib.json index 41ef5165..ae898d31 100644 --- a/internal/typescript-config/lib.json +++ b/internal/typescript-config/lib.json @@ -1,7 +1,7 @@ { "$schema": "https://json.schemastore.org/tsconfig", - "display": "Node 18", - "_version": "18.2.0", + "display": "Node 20", + "_version": "20.17.0", "compilerOptions": { "target": "es2022", "lib": ["es2023"], diff --git a/package.json b/package.json index a20176e1..84fb8432 100644 --- a/package.json +++ b/package.json @@ -29,9 +29,10 @@ "devDependencies": { "@biomejs/biome": "1.9.4", "@changesets/cli": "2.28.1", - "prettier": "3.5.2", - "prettier-plugin-packagejson": "2.5.9", - "turbo": "2.4.4" + "prettier": "3.5.3", + "prettier-plugin-packagejson": "2.5.10", + "turbo": "2.4.4", + "typescript": "5.8.2" }, "packageManager": "pnpm@10.5.2+sha512.da9dc28cd3ff40d0592188235ab25d3202add8a207afbedc682220e4a0029ffbff4562102b9e6e46b4e3f9e8bd53e6d05de48544b0c57d4b0179e22c76d1199b", "engines": { diff --git a/packages/cache-handler/package.json b/packages/cache-handler/package.json index 130c071f..dba0e6fe 100644 --- a/packages/cache-handler/package.json +++ b/packages/cache-handler/package.json @@ -14,7 +14,7 @@ "bugs": "https://github.com/caching-tools/next-shared-cache/issues", "repository": { "type": "git", - "url": "git+https://github.com/caching-tools/next-shared-cache.git" + "url": "git+https://github.com/caching-tools/next-shared-cache.git " }, "license": "MIT", "author": { @@ -23,57 +23,13 @@ }, "type": "module", "exports": { - ".": { - "require": "./dist/cache-handler.cjs", - "import": "./dist/cache-handler.js" - }, - "./helpers": { - "require": "./dist/helpers/helpers.cjs", - "import": "./dist/helpers/helpers.js" - }, - "./functions": { - "require": "./dist/functions/functions.cjs", - "import": "./dist/functions/functions.js" - }, - "./instrumentation": { - "require": "./dist/instrumentation/instrumentation.cjs", - "import": "./dist/instrumentation/instrumentation.js" - }, - "./*": { - "require": "./dist/handlers/*.cjs", - "import": "./dist/handlers/*.js" - } - }, - "typesVersions": { - "*": { - "*": [ - "dist/cache-handler.d.ts" - ], - "helpers": [ - "dist/helpers/helpers.d.ts" - ], - "functions": [ - "dist/functions/functions.d.ts" - ], - "redis-stack": [ - "dist/handlers/redis-stack.d.ts" - ], - "redis-strings": [ - "dist/handlers/redis-strings.d.ts" - ], - "server": [ - "dist/handlers/server.d.ts" - ], - "local-lru": [ - "dist/handlers/local-lru.d.ts" - ], - "instrumentation": [ - "dist/instrumentation/instrumentation.d.ts" - ] - } + ".": "./dist/cache-handler.js", + "./handlers/*": "./dist/handlers/*.js", + "./helpers": "./dist/helpers/helpers.js", + "./instrumentation/*": "./dist/instrumentation/*.js" }, "scripts": { - "build": "tsc --build", + "build": "tsc", "check-types": "tsc --noEmit", "dev": "tsc --watch", "test": "tsx --test src/**/*.test.ts", @@ -81,14 +37,14 @@ }, "dependencies": { "cluster-key-slot": "^1.1.2", - "lru-cache": "^10.4.3", + "lru-cache": "^11.0.2", "superjson": "^2.2.2" }, "devDependencies": { "@repo/typescript-config": "workspace:*", - "@types/node": "22.13.5", + "@types/node": "22.13.9", "tsx": "4.19.3", - "typescript": "5.7.3" + "typescript": "5.8.2" }, "peerDependencies": { "next": ">= 15 < 16", diff --git a/packages/cache-handler/src/instrumentation/instrumentation.ts b/packages/cache-handler/src/instrumentation/instrumentation.ts deleted file mode 100644 index e11bf2ad..00000000 --- a/packages/cache-handler/src/instrumentation/instrumentation.ts +++ /dev/null @@ -1,4 +0,0 @@ -export { - registerInitialCache, - type RegisterInitialCacheOptions, -} from './register-initial-cache.js'; diff --git a/packages/cache-handler/src/instrumentation/register-initial-cache.ts b/packages/cache-handler/src/instrumentation/register-initial-cache.ts index 87c9123e..a95f637e 100644 --- a/packages/cache-handler/src/instrumentation/register-initial-cache.ts +++ b/packages/cache-handler/src/instrumentation/register-initial-cache.ts @@ -1,7 +1,7 @@ import { promises as fsPromises } from 'node:fs'; import path from 'node:path'; import { PRERENDER_MANIFEST, SERVER_DIRECTORY } from 'next/constants.js'; -import type { PrerenderManifest } from 'next/dist/build'; +import type { PrerenderManifest } from 'next/dist/build/index.js'; import { CACHE_ONE_YEAR } from 'next/dist/lib/constants.js'; import { getTagsFromHeaders } from '../helpers/get-tags-from-headers.js'; import { diff --git a/packages/cache-handler/src/next-common-types.ts b/packages/cache-handler/src/next-common-types.ts index e472cbac..155f68be 100644 --- a/packages/cache-handler/src/next-common-types.ts +++ b/packages/cache-handler/src/next-common-types.ts @@ -4,14 +4,14 @@ import type { CacheHandler, CacheHandlerContext, CacheHandlerValue as NextCacheHandlerValue, -} from 'next/dist/server/lib/incremental-cache'; +} from 'next/dist/server/lib/incremental-cache/index.js'; import type { CachedRouteKind, IncrementalCacheValue, } from 'next/dist/server/response-cache/types.js'; -export type { PrerenderManifest } from 'next/dist/build'; -export type { CacheHandler } from 'next/dist/server/lib/incremental-cache'; +export type { PrerenderManifest } from 'next/dist/build/index.js'; +export type { CacheHandler } from 'next/dist/server/lib/incremental-cache/index.js'; export type { CachedRedirectValue, CachedRouteValue, diff --git a/packages/cache-handler/tsconfig.json b/packages/cache-handler/tsconfig.json index ca0d3bf1..c4b57012 100644 --- a/packages/cache-handler/tsconfig.json +++ b/packages/cache-handler/tsconfig.json @@ -5,6 +5,6 @@ "outDir": "dist", "rootDir": "src" }, - "include": ["src"], - "exclude": ["**/*.test.ts"] + "include": ["**/*.ts"], + "exclude": ["**/*.test.ts", "node_modules", "dist"] } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index effc982a..08912bc9 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -15,14 +15,17 @@ importers: specifier: 2.28.1 version: 2.28.1 prettier: - specifier: 3.5.2 - version: 3.5.2 + specifier: 3.5.3 + version: 3.5.3 prettier-plugin-packagejson: - specifier: 2.5.9 - version: 2.5.9(prettier@3.5.2) + specifier: 2.5.10 + version: 2.5.10(prettier@3.5.3) turbo: specifier: 2.4.4 version: 2.4.4 + typescript: + specifier: 5.8.2 + version: 5.8.2 apps/cache-testing: dependencies: @@ -55,8 +58,8 @@ importers: specifier: workspace:* version: link:../../internal/typescript-config '@types/node': - specifier: 22.13.5 - version: 22.13.5 + specifier: 22.13.9 + version: 22.13.9 '@types/react': specifier: 19.0.10 version: 19.0.10 @@ -79,8 +82,8 @@ importers: specifier: 4.19.3 version: 4.19.3 typescript: - specifier: 5.7.3 - version: 5.7.3 + specifier: 5.8.2 + version: 5.8.2 docs/cache-handler-docs: dependencies: @@ -88,11 +91,11 @@ importers: specifier: 15.2.0 version: 15.2.0(@playwright/test@1.50.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) nextra: - specifier: 4.2.13 - version: 4.2.13(acorn@8.14.0)(next@15.2.0(@playwright/test@1.50.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3) + specifier: 4.2.14 + version: 4.2.14(acorn@8.14.0)(next@15.2.0(@playwright/test@1.50.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.8.2) nextra-theme-docs: - specifier: 4.2.13 - version: 4.2.13(@types/react@19.0.10)(next@15.2.0(@playwright/test@1.50.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(nextra@4.2.13(acorn@8.14.0)(next@15.2.0(@playwright/test@1.50.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3))(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + specifier: 4.2.14 + version: 4.2.14(@types/react@19.0.10)(next@15.2.0(@playwright/test@1.50.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(nextra@4.2.14(acorn@8.14.0)(next@15.2.0(@playwright/test@1.50.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.8.2))(react-dom@19.0.0(react@19.0.0))(react@19.0.0) react: specifier: 19.0.0 version: 19.0.0 @@ -107,8 +110,8 @@ importers: specifier: workspace:* version: link:../../internal/typescript-config '@types/node': - specifier: 22.13.5 - version: 22.13.5 + specifier: 22.13.9 + version: 22.13.9 '@types/react': specifier: 19.0.10 version: 19.0.10 @@ -125,8 +128,8 @@ importers: specifier: 14.2.4 version: 14.2.4 typescript: - specifier: 5.7.3 - version: 5.7.3 + specifier: 5.8.2 + version: 5.8.2 internal/backend: dependencies: @@ -141,8 +144,8 @@ importers: specifier: workspace:* version: link:../typescript-config '@types/node': - specifier: 22.13.5 - version: 22.13.5 + specifier: 22.13.9 + version: 22.13.9 pino-pretty: specifier: 13.0.0 version: 13.0.0 @@ -150,8 +153,8 @@ importers: specifier: 4.19.3 version: 4.19.3 typescript: - specifier: 5.7.3 - version: 5.7.3 + specifier: 5.8.2 + version: 5.8.2 internal/eslint-config: devDependencies: @@ -180,11 +183,11 @@ importers: specifier: 16.0.0 version: 16.0.0 typescript: - specifier: 5.7.3 - version: 5.7.3 + specifier: 5.8.2 + version: 5.8.2 typescript-eslint: - specifier: 8.25.0 - version: 8.25.0(eslint@9.21.0)(typescript@5.7.3) + specifier: 8.26.0 + version: 8.26.0(eslint@9.21.0)(typescript@5.8.2) internal/typescript-config: {} @@ -194,8 +197,8 @@ importers: specifier: ^1.1.2 version: 1.1.2 lru-cache: - specifier: ^10.4.3 - version: 10.4.3 + specifier: ^11.0.2 + version: 11.0.2 next: specifier: '>= 15 < 16' version: 15.2.0(@playwright/test@1.50.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) @@ -210,14 +213,14 @@ importers: specifier: workspace:* version: link:../../internal/typescript-config '@types/node': - specifier: 22.13.5 - version: 22.13.5 + specifier: 22.13.9 + version: 22.13.9 tsx: specifier: 4.19.3 version: 4.19.3 typescript: - specifier: 5.7.3 - version: 5.7.3 + specifier: 5.8.2 + version: 5.8.2 packages: @@ -1183,8 +1186,8 @@ packages: '@types/node@12.20.55': resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} - '@types/node@22.13.5': - resolution: {integrity: sha512-+lTU0PxZXn0Dr1NBtC7Y8cR21AJr87dLLU953CWA6pMxxv/UDc7jYAY90upcrie1nRcD6XNG5HOYEDtgW5TxAg==} + '@types/node@22.13.9': + resolution: {integrity: sha512-acBjXdRJ3A6Pb3tqnw9HZmyR3Fiol3aGxRCK1x3d+6CDAMjl7I649wpSd+yNURCjbOUGu9tqtLKnTGxmK6CyGw==} '@types/react-dom@19.0.4': resolution: {integrity: sha512-4fSQ8vWFkg+TGhePfUzVmat3eC14TXYSsiiDSLI0dVLsrm9gZFABjPy/Qu6TKgl1tq1Bu1yDsuQgY3A3DOjCcg==} @@ -1203,51 +1206,51 @@ packages: '@types/unist@3.0.3': resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==} - '@typescript-eslint/eslint-plugin@8.25.0': - resolution: {integrity: sha512-VM7bpzAe7JO/BFf40pIT1lJqS/z1F8OaSsUB3rpFJucQA4cOSuH2RVVVkFULN+En0Djgr29/jb4EQnedUo95KA==} + '@typescript-eslint/eslint-plugin@8.26.0': + resolution: {integrity: sha512-cLr1J6pe56zjKYajK6SSSre6nl1Gj6xDp1TY0trpgPzjVbgDwd09v2Ws37LABxzkicmUjhEeg/fAUjPJJB1v5Q==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: '@typescript-eslint/parser': ^8.0.0 || ^8.0.0-alpha.0 eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <5.8.0' + typescript: '>=4.8.4 <5.9.0' - '@typescript-eslint/parser@8.25.0': - resolution: {integrity: sha512-4gbs64bnbSzu4FpgMiQ1A+D+urxkoJk/kqlDJ2W//5SygaEiAP2B4GoS7TEdxgwol2el03gckFV9lJ4QOMiiHg==} + '@typescript-eslint/parser@8.26.0': + resolution: {integrity: sha512-mNtXP9LTVBy14ZF3o7JG69gRPBK/2QWtQd0j0oH26HcY/foyJJau6pNUez7QrM5UHnSvwlQcJXKsk0I99B9pOA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <5.8.0' + typescript: '>=4.8.4 <5.9.0' - '@typescript-eslint/scope-manager@8.25.0': - resolution: {integrity: sha512-6PPeiKIGbgStEyt4NNXa2ru5pMzQ8OYKO1hX1z53HMomrmiSB+R5FmChgQAP1ro8jMtNawz+TRQo/cSXrauTpg==} + '@typescript-eslint/scope-manager@8.26.0': + resolution: {integrity: sha512-E0ntLvsfPqnPwng8b8y4OGuzh/iIOm2z8U3S9zic2TeMLW61u5IH2Q1wu0oSTkfrSzwbDJIB/Lm8O3//8BWMPA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/type-utils@8.25.0': - resolution: {integrity: sha512-d77dHgHWnxmXOPJuDWO4FDWADmGQkN5+tt6SFRZz/RtCWl4pHgFl3+WdYCn16+3teG09DY6XtEpf3gGD0a186g==} + '@typescript-eslint/type-utils@8.26.0': + resolution: {integrity: sha512-ruk0RNChLKz3zKGn2LwXuVoeBcUMh+jaqzN461uMMdxy5H9epZqIBtYj7UiPXRuOpaALXGbmRuZQhmwHhaS04Q==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <5.8.0' + typescript: '>=4.8.4 <5.9.0' - '@typescript-eslint/types@8.25.0': - resolution: {integrity: sha512-+vUe0Zb4tkNgznQwicsvLUJgZIRs6ITeWSCclX1q85pR1iOiaj+4uZJIUp//Z27QWu5Cseiw3O3AR8hVpax7Aw==} + '@typescript-eslint/types@8.26.0': + resolution: {integrity: sha512-89B1eP3tnpr9A8L6PZlSjBvnJhWXtYfZhECqlBl1D9Lme9mHO6iWlsprBtVenQvY1HMhax1mWOjhtL3fh/u+pA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/typescript-estree@8.25.0': - resolution: {integrity: sha512-ZPaiAKEZ6Blt/TPAx5Ot0EIB/yGtLI2EsGoY6F7XKklfMxYQyvtL+gT/UCqkMzO0BVFHLDlzvFqQzurYahxv9Q==} + '@typescript-eslint/typescript-estree@8.26.0': + resolution: {integrity: sha512-tiJ1Hvy/V/oMVRTbEOIeemA2XoylimlDQ03CgPPNaHYZbpsc78Hmngnt+WXZfJX1pjQ711V7g0H7cSJThGYfPQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - typescript: '>=4.8.4 <5.8.0' + typescript: '>=4.8.4 <5.9.0' - '@typescript-eslint/utils@8.25.0': - resolution: {integrity: sha512-syqRbrEv0J1wywiLsK60XzHnQe/kRViI3zwFALrNEgnntn1l24Ra2KvOAWwWbWZ1lBZxZljPDGOq967dsl6fkA==} + '@typescript-eslint/utils@8.26.0': + resolution: {integrity: sha512-2L2tU3FVwhvU14LndnQCA2frYC8JnPDVKyQtWFPf8IYFMt/ykEN1bPolNhNbCVgOmdzTlWdusCTKA/9nKrf8Ig==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <5.8.0' + typescript: '>=4.8.4 <5.9.0' - '@typescript-eslint/visitor-keys@8.25.0': - resolution: {integrity: sha512-kCYXKAum9CecGVHGij7muybDfTS2sD3t0L4bJsEZLkyrXUImiCTq1M3LG2SRtOhiHFwMR9wAFplpT6XHYjTkwQ==} + '@typescript-eslint/visitor-keys@8.26.0': + resolution: {integrity: sha512-2z8JQJWAzPdDd51dRQ/oqIJxe99/hoLIqmf8RMCAJQtYDc535W/Jt2+RTP4bP0aKeBG1F65yjIZuczOXCmbWwg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@typescript/vfs@1.6.1': @@ -1478,8 +1481,8 @@ packages: resolution: {integrity: sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==} engines: {node: '>= 0.4'} - call-bound@1.0.3: - resolution: {integrity: sha512-YTd+6wGlNlPxSuri7Y6X8tY2dmm12UMH66RpKMhiX6rsk5wXXnYgbUcOt8kiS31/AjfoTOvCsE+w8nZQLQnzHA==} + call-bound@1.0.4: + resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==} engines: {node: '>= 0.4'} callsites@3.1.0: @@ -1636,6 +1639,9 @@ packages: confbox@0.1.8: resolution: {integrity: sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==} + confbox@0.2.1: + resolution: {integrity: sha512-hkT3yDPFbs95mNCy1+7qNKC6Pro+/ibzYxtM2iqEigpf0sVw+bg4Zh9/snjsBcf990vfIsg5+1U7VyiyBb3etg==} + content-disposition@0.5.2: resolution: {integrity: sha512-kRGRZw3bLlFISDBgwTSA1TMBFN6J6GWDeubmDE3AF+3+yXL8hTWv8r5rkLbqYXY4RjPk/EzHnClI3zQf1cFmHA==} engines: {node: '>= 0.6'} @@ -2171,6 +2177,9 @@ packages: resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==} engines: {node: '>=16.17'} + exsolve@1.0.1: + resolution: {integrity: sha512-Smf0iQtkQVJLaph8r/qS8C8SWfQkaq9Q/dFcD44MLbJj6DNhlWefVuaS21SjfqOsBbjVlKtbCj6L9ekXK6EZUg==} + extend@3.0.2: resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} @@ -2463,8 +2472,8 @@ packages: hast-util-raw@9.1.0: resolution: {integrity: sha512-Y8/SBAHkZGoNkpzqqfCldijcuUKh7/su31kEBp67cFY09Wy0mTRgtsLYsiIxMJxlu0f6AA5SUTbDR8K0rxnbUw==} - hast-util-to-estree@3.1.2: - resolution: {integrity: sha512-94SDoKOfop5gP8RHyw4vV1aj+oChuD42g08BONGAaWFbbO6iaWUqxk7SWfGybgcVzhK16KifZr3zD2dqQgx3jQ==} + hast-util-to-estree@3.1.3: + resolution: {integrity: sha512-48+B/rJWAp0jamNbAAf9M7Uf//UVqAoMmgXhBdxTDJLGKY+LRnZ99qcG+Qjl5HfMpYNzS5v4EAwVEF34LeAj7w==} hast-util-to-html@9.0.5: resolution: {integrity: sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw==} @@ -2826,8 +2835,8 @@ packages: light-my-request@6.6.0: resolution: {integrity: sha512-CHYbu8RtboSIoVsHZ6Ye4cj4Aw/yg2oAFimlF7mNvfDV192LR7nDiKtSIfCuLT7KokPSTn/9kfVLm5OGN0A28A==} - local-pkg@1.1.0: - resolution: {integrity: sha512-xbZBuX6gYIWrlLmZG43aAVer4ocntYO09vPy9lxd6Ns8DnR4U7N+IIeDkubinqFOHHzoMlPxTxwo0jhE7oYjAw==} + local-pkg@1.1.1: + resolution: {integrity: sha512-WunYko2W1NcdfAFpuLUoucsgULmgDBRkdxHxWQ7mK0cQqwPiy8E1enjuRBrhLtZkB5iScJ1XIPdhVEFK8aOLSg==} engines: {node: '>=14'} locate-path@5.0.0: @@ -2857,8 +2866,9 @@ packages: resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} hasBin: true - lru-cache@10.4.3: - resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} + lru-cache@11.0.2: + resolution: {integrity: sha512-123qHRfJBmo2jXDbo/a5YOQrJoHF/GNQTLzQ5+IdK5pWpceK17yRc6ozlWd25FxvGKQbIUs91fDFkXmDHTKcyA==} + engines: {node: 20 || >=22} lru-cache@6.0.0: resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} @@ -3186,16 +3196,16 @@ packages: sass: optional: true - nextra-theme-docs@4.2.13: - resolution: {integrity: sha512-PO+ltZFtKXe2Jt4hgdJi5JahQHOjt2qmz5wVSfhS+PZDMAuFCa0UubBvkCyQDF3YdKjUI2gJ8CW0fGw84yeseQ==} + nextra-theme-docs@4.2.14: + resolution: {integrity: sha512-Z+eRIRMbssB8kgDjkucfqAd894+lga78cPiAcCD2YQY7VPyFFeYmXJIwpEiLmV3/13FtT1QVoJuMmRaUTjtJIQ==} peerDependencies: next: '>=14' - nextra: 4.2.13 + nextra: 4.2.14 react: '>=18' react-dom: '>=18' - nextra@4.2.13: - resolution: {integrity: sha512-ZjcIuDXaZoMn8s11iXGCp0UHTYZp3xCS6JFZbyj8Fh+RIKh9ZZlD+e6YlmXkA7t71PVjDWoF5URwMW/r7dYNjQ==} + nextra@4.2.14: + resolution: {integrity: sha512-Ur5hiWDLZUlSR4faLl7R1z6MEelH1vRWBIlcBP97N2qmQMFPfMIOMwjm+tscHcPlL5DoQ2F332P3RzTqdktyLQ==} engines: {node: '>=18'} peerDependencies: next: '>=14' @@ -3326,8 +3336,8 @@ packages: resolution: {integrity: sha512-5NPgf87AT2STgwa2ntRMr45jTKrYBGkVU36yT0ig/n/GMAa3oPqhZfIQ2kMEimReg0+t9kZViDVZ83qfVUlckg==} engines: {node: '>= 14'} - package-manager-detector@0.2.10: - resolution: {integrity: sha512-1wlNZK7HW+UE3eGCcMv3hDaYokhspuIeH6enXSnCL1eEZSVDsy/dYwo/4CczhUsrKLA1SSXB+qce8Glw5DEVtw==} + package-manager-detector@0.2.11: + resolution: {integrity: sha512-BEnLolu+yuz22S56CU1SUKq3XC3PkwD5wv4ikR4MfGvnRVcmzXR9DwSlW2fEamyTPyXHomBJRzgapeuBvRNzJQ==} pagefind@1.3.0: resolution: {integrity: sha512-8KPLGT5g9s+olKMRTU9LFekLizkVIu9tes90O1/aigJ0T5LmyPqTzGJrETnSw3meSYg58YH7JTzhTTW/3z6VAw==} @@ -3423,6 +3433,9 @@ packages: pkg-types@1.3.1: resolution: {integrity: sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==} + pkg-types@2.1.0: + resolution: {integrity: sha512-wmJwA+8ihJixSoHKxZJRBQG1oY8Yr9pGLzRmSsNms0iNWyHHAlZCa7mmKiFR10YPZuz/2k169JiS/inOjBCZ2A==} + playwright-core@1.50.1: resolution: {integrity: sha512-ra9fsNWayuYumt+NiM069M6OkcRb1FZSK8bgi66AtpFoWkg2+y0bJSNmkFrWhMbEBbVKC/EruAHH3g0zmtwGmQ==} engines: {node: '>=18'} @@ -3474,8 +3487,8 @@ packages: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} engines: {node: '>= 0.8.0'} - prettier-plugin-packagejson@2.5.9: - resolution: {integrity: sha512-lhVEpWyYPtO+g9/zQLk6CLkMqcpwR8YGO4mwbbHJaFXoXVeK0LtcgTTalp8vZVmMyHKbcv/zhA1Xp4uQKoeCww==} + prettier-plugin-packagejson@2.5.10: + resolution: {integrity: sha512-LUxATI5YsImIVSaaLJlJ3aE6wTD+nvots18U3GuQMJpUyClChaZlQrqx3dBnbhF20OnKWZyx8EgyZypQtBDtgQ==} peerDependencies: prettier: '>= 1.16.0' peerDependenciesMeta: @@ -3487,8 +3500,8 @@ packages: engines: {node: '>=10.13.0'} hasBin: true - prettier@3.5.2: - resolution: {integrity: sha512-lc6npv5PH7hVqozBR7lkBNOGXV9vMwROAPlumdBkX0wTbbzPu/U1hk5yL8p2pt4Xoc+2mkT8t/sow2YrV/M5qg==} + prettier@3.5.3: + resolution: {integrity: sha512-QQtaxnoDJeAkDvDKWCLiwIXkTgRhwYDEQCghU9Z6q03iyek/rxRh/2lC3HB7P8sWT2xC/y5JDctPLBIGzHKbhw==} engines: {node: '>=14'} hasBin: true @@ -3521,8 +3534,8 @@ packages: resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} engines: {node: '>=6'} - quansync@0.2.6: - resolution: {integrity: sha512-u3TuxVTuJtkTxKGk5oZ7K2/o+l0/cC6J8SOyaaSnrnroqvcVy7xBxtvBUyd+Xa8cGoCr87XmQj4NR6W+zbqH8w==} + quansync@0.2.8: + resolution: {integrity: sha512-4+saucphJMazjt7iOM27mbFCk+D9dd/zmgMDCzRZ8MEoBfYp7lAvoN38et/phRQF6wOPMy/OROBGgoWeSKyluA==} queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} @@ -3884,8 +3897,8 @@ packages: sort-object-keys@1.1.3: resolution: {integrity: sha512-855pvK+VkU7PaKYPc+Jjnmt4EzejQHyhhF33q31qG8x7maDzkeFhAAThdCYay11CISO+qAMwjOBP+fPZe0IPyg==} - sort-package-json@2.15.0: - resolution: {integrity: sha512-wpKu3DvFuymcRvPqJR7VN5J6wnqR+SYZ4SZmnJa9ckpV+BuoE0XYHZYsoWaJbt6oz8OwOXb4eoMjlEBM6hwhBw==} + sort-package-json@2.15.1: + resolution: {integrity: sha512-9x9+o8krTT2saA9liI4BljNjwAbvUnWf11Wq+i/iZt8nl2UGYnf3TH5uBydE7VALmP7AGwlfszuEeL8BDyb0YA==} hasBin: true source-map-js@1.2.1: @@ -3988,6 +4001,9 @@ packages: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} engines: {node: '>=8'} + style-to-js@1.1.16: + resolution: {integrity: sha512-/Q6ld50hKYPH3d/r6nr117TZkHR0w0kGGIVfpG9N6D8NymRPM9RqCUv4pRpJ62E5DqOYx2AFpbZMyCPnjQCnOw==} + style-to-object@1.0.8: resolution: {integrity: sha512-xT47I/Eo0rwJmaXC4oilDGDWLohVhR6o/xAQcPQN8q6QBuZVL8qMYL85kLmST5cPjAorwvqIA4qXTRQoYHaL6g==} @@ -4166,15 +4182,15 @@ packages: resolution: {integrity: sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==} engines: {node: '>= 0.4'} - typescript-eslint@8.25.0: - resolution: {integrity: sha512-TxRdQQLH4g7JkoFlYG3caW5v1S6kEkz8rqt80iQJZUYPq1zD1Ra7HfQBJJ88ABRaMvHAXnwRvRB4V+6sQ9xN5Q==} + typescript-eslint@8.26.0: + resolution: {integrity: sha512-PtVz9nAnuNJuAVeUFvwztjuUgSnJInODAUx47VDwWPXzd5vismPOtPtt83tzNXyOjVQbPRp786D6WFW/M2koIA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <5.8.0' + typescript: '>=4.8.4 <5.9.0' - typescript@5.7.3: - resolution: {integrity: sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==} + typescript@5.8.2: + resolution: {integrity: sha512-aJn6wq13/afZp/jT9QZmwEjDqqvSGp1VT5GVg+f/t6/oVyrgXM6BY1h9BRh/O5p3PlUPAe+WuiEZOmb/49RqoQ==} engines: {node: '>=14.17'} hasBin: true @@ -4388,7 +4404,7 @@ snapshots: '@antfu/install-pkg@1.0.0': dependencies: - package-manager-detector: 0.2.10 + package-manager-detector: 0.2.11 tinyexec: 0.3.2 '@antfu/utils@8.1.1': {} @@ -4487,7 +4503,7 @@ snapshots: fs-extra: 7.0.1 mri: 1.2.0 p-limit: 2.3.0 - package-manager-detector: 0.2.10 + package-manager-detector: 0.2.11 picocolors: 1.1.1 resolve-from: 5.0.0 semver: 7.7.1 @@ -4799,7 +4815,7 @@ snapshots: debug: 4.4.0 globals: 15.15.0 kolorist: 1.8.0 - local-pkg: 1.1.0 + local-pkg: 1.1.1 mlly: 1.7.4 transitivePeerDependencies: - supports-color @@ -5199,11 +5215,11 @@ snapshots: dependencies: '@shikijs/types': 2.5.0 - '@shikijs/twoslash@2.5.0(typescript@5.7.3)': + '@shikijs/twoslash@2.5.0(typescript@5.8.2)': dependencies: '@shikijs/core': 2.5.0 '@shikijs/types': 2.5.0 - twoslash: 0.2.12(typescript@5.7.3) + twoslash: 0.2.12(typescript@5.8.2) transitivePeerDependencies: - supports-color - typescript @@ -5399,7 +5415,7 @@ snapshots: '@types/node@12.20.55': {} - '@types/node@22.13.5': + '@types/node@22.13.9': dependencies: undici-types: 6.20.0 @@ -5418,87 +5434,87 @@ snapshots: '@types/unist@3.0.3': {} - '@typescript-eslint/eslint-plugin@8.25.0(@typescript-eslint/parser@8.25.0(eslint@9.21.0)(typescript@5.7.3))(eslint@9.21.0)(typescript@5.7.3)': + '@typescript-eslint/eslint-plugin@8.26.0(@typescript-eslint/parser@8.26.0(eslint@9.21.0)(typescript@5.8.2))(eslint@9.21.0)(typescript@5.8.2)': dependencies: '@eslint-community/regexpp': 4.12.1 - '@typescript-eslint/parser': 8.25.0(eslint@9.21.0)(typescript@5.7.3) - '@typescript-eslint/scope-manager': 8.25.0 - '@typescript-eslint/type-utils': 8.25.0(eslint@9.21.0)(typescript@5.7.3) - '@typescript-eslint/utils': 8.25.0(eslint@9.21.0)(typescript@5.7.3) - '@typescript-eslint/visitor-keys': 8.25.0 + '@typescript-eslint/parser': 8.26.0(eslint@9.21.0)(typescript@5.8.2) + '@typescript-eslint/scope-manager': 8.26.0 + '@typescript-eslint/type-utils': 8.26.0(eslint@9.21.0)(typescript@5.8.2) + '@typescript-eslint/utils': 8.26.0(eslint@9.21.0)(typescript@5.8.2) + '@typescript-eslint/visitor-keys': 8.26.0 eslint: 9.21.0 graphemer: 1.4.0 ignore: 5.3.2 natural-compare: 1.4.0 - ts-api-utils: 2.0.1(typescript@5.7.3) - typescript: 5.7.3 + ts-api-utils: 2.0.1(typescript@5.8.2) + typescript: 5.8.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.25.0(eslint@9.21.0)(typescript@5.7.3)': + '@typescript-eslint/parser@8.26.0(eslint@9.21.0)(typescript@5.8.2)': dependencies: - '@typescript-eslint/scope-manager': 8.25.0 - '@typescript-eslint/types': 8.25.0 - '@typescript-eslint/typescript-estree': 8.25.0(typescript@5.7.3) - '@typescript-eslint/visitor-keys': 8.25.0 + '@typescript-eslint/scope-manager': 8.26.0 + '@typescript-eslint/types': 8.26.0 + '@typescript-eslint/typescript-estree': 8.26.0(typescript@5.8.2) + '@typescript-eslint/visitor-keys': 8.26.0 debug: 4.4.0 eslint: 9.21.0 - typescript: 5.7.3 + typescript: 5.8.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/scope-manager@8.25.0': + '@typescript-eslint/scope-manager@8.26.0': dependencies: - '@typescript-eslint/types': 8.25.0 - '@typescript-eslint/visitor-keys': 8.25.0 + '@typescript-eslint/types': 8.26.0 + '@typescript-eslint/visitor-keys': 8.26.0 - '@typescript-eslint/type-utils@8.25.0(eslint@9.21.0)(typescript@5.7.3)': + '@typescript-eslint/type-utils@8.26.0(eslint@9.21.0)(typescript@5.8.2)': dependencies: - '@typescript-eslint/typescript-estree': 8.25.0(typescript@5.7.3) - '@typescript-eslint/utils': 8.25.0(eslint@9.21.0)(typescript@5.7.3) + '@typescript-eslint/typescript-estree': 8.26.0(typescript@5.8.2) + '@typescript-eslint/utils': 8.26.0(eslint@9.21.0)(typescript@5.8.2) debug: 4.4.0 eslint: 9.21.0 - ts-api-utils: 2.0.1(typescript@5.7.3) - typescript: 5.7.3 + ts-api-utils: 2.0.1(typescript@5.8.2) + typescript: 5.8.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/types@8.25.0': {} + '@typescript-eslint/types@8.26.0': {} - '@typescript-eslint/typescript-estree@8.25.0(typescript@5.7.3)': + '@typescript-eslint/typescript-estree@8.26.0(typescript@5.8.2)': dependencies: - '@typescript-eslint/types': 8.25.0 - '@typescript-eslint/visitor-keys': 8.25.0 + '@typescript-eslint/types': 8.26.0 + '@typescript-eslint/visitor-keys': 8.26.0 debug: 4.4.0 fast-glob: 3.3.3 is-glob: 4.0.3 minimatch: 9.0.5 semver: 7.7.1 - ts-api-utils: 2.0.1(typescript@5.7.3) - typescript: 5.7.3 + ts-api-utils: 2.0.1(typescript@5.8.2) + typescript: 5.8.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.25.0(eslint@9.21.0)(typescript@5.7.3)': + '@typescript-eslint/utils@8.26.0(eslint@9.21.0)(typescript@5.8.2)': dependencies: '@eslint-community/eslint-utils': 4.4.1(eslint@9.21.0) - '@typescript-eslint/scope-manager': 8.25.0 - '@typescript-eslint/types': 8.25.0 - '@typescript-eslint/typescript-estree': 8.25.0(typescript@5.7.3) + '@typescript-eslint/scope-manager': 8.26.0 + '@typescript-eslint/types': 8.26.0 + '@typescript-eslint/typescript-estree': 8.26.0(typescript@5.8.2) eslint: 9.21.0 - typescript: 5.7.3 + typescript: 5.8.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/visitor-keys@8.25.0': + '@typescript-eslint/visitor-keys@8.26.0': dependencies: - '@typescript-eslint/types': 8.25.0 + '@typescript-eslint/types': 8.26.0 eslint-visitor-keys: 4.2.0 - '@typescript/vfs@1.6.1(typescript@5.7.3)': + '@typescript/vfs@1.6.1(typescript@5.8.2)': dependencies: debug: 4.4.0 - typescript: 5.7.3 + typescript: 5.8.2 transitivePeerDependencies: - supports-color @@ -5585,7 +5601,7 @@ snapshots: array-buffer-byte-length@1.0.2: dependencies: - call-bound: 1.0.3 + call-bound: 1.0.4 is-array-buffer: 3.0.5 array-includes@3.1.8: @@ -5742,7 +5758,7 @@ snapshots: get-intrinsic: 1.3.0 set-function-length: 1.2.2 - call-bound@1.0.3: + call-bound@1.0.4: dependencies: call-bind-apply-helpers: 1.0.2 get-intrinsic: 1.3.0 @@ -5895,6 +5911,8 @@ snapshots: confbox@0.1.8: {} + confbox@0.2.1: {} + content-disposition@0.5.2: {} cookie@1.0.2: {} @@ -6111,19 +6129,19 @@ snapshots: data-view-buffer@1.0.2: dependencies: - call-bound: 1.0.3 + call-bound: 1.0.4 es-errors: 1.3.0 is-data-view: 1.0.2 data-view-byte-length@1.0.2: dependencies: - call-bound: 1.0.3 + call-bound: 1.0.4 es-errors: 1.3.0 is-data-view: 1.0.2 data-view-byte-offset@1.0.1: dependencies: - call-bound: 1.0.3 + call-bound: 1.0.4 es-errors: 1.3.0 is-data-view: 1.0.2 @@ -6256,7 +6274,7 @@ snapshots: arraybuffer.prototype.slice: 1.0.4 available-typed-arrays: 1.0.7 call-bind: 1.0.8 - call-bound: 1.0.3 + call-bound: 1.0.4 data-view-buffer: 1.0.2 data-view-byte-length: 1.0.2 data-view-byte-offset: 1.0.1 @@ -6311,7 +6329,7 @@ snapshots: es-iterator-helpers@1.2.1: dependencies: call-bind: 1.0.8 - call-bound: 1.0.3 + call-bound: 1.0.4 define-properties: 1.2.1 es-abstract: 1.23.9 es-errors: 1.3.0 @@ -6581,6 +6599,8 @@ snapshots: signal-exit: 4.1.0 strip-final-newline: 3.0.0 + exsolve@1.0.1: {} + extend@3.0.2: {} extendable-error@0.1.7: {} @@ -6747,7 +6767,7 @@ snapshots: function.prototype.name@1.1.8: dependencies: call-bind: 1.0.8 - call-bound: 1.0.3 + call-bound: 1.0.4 define-properties: 1.2.1 functions-have-names: 1.2.3 hasown: 2.0.2 @@ -6783,7 +6803,7 @@ snapshots: get-symbol-description@1.1.0: dependencies: - call-bound: 1.0.3 + call-bound: 1.0.4 es-errors: 1.3.0 get-intrinsic: 1.3.0 @@ -6924,7 +6944,7 @@ snapshots: web-namespaces: 2.0.1 zwitch: 2.0.4 - hast-util-to-estree@3.1.2: + hast-util-to-estree@3.1.3: dependencies: '@types/estree': 1.0.6 '@types/estree-jsx': 1.0.5 @@ -6939,7 +6959,7 @@ snapshots: mdast-util-mdxjs-esm: 2.0.1 property-information: 7.0.0 space-separated-tokens: 2.0.2 - style-to-object: 1.0.8 + style-to-js: 1.1.16 unist-util-position: 5.0.0 zwitch: 2.0.4 transitivePeerDependencies: @@ -7084,7 +7104,7 @@ snapshots: is-array-buffer@3.0.5: dependencies: call-bind: 1.0.8 - call-bound: 1.0.3 + call-bound: 1.0.4 get-intrinsic: 1.3.0 is-arrayish@0.3.2: @@ -7093,7 +7113,7 @@ snapshots: is-async-function@2.1.1: dependencies: async-function: 1.0.0 - call-bound: 1.0.3 + call-bound: 1.0.4 get-proto: 1.0.1 has-tostringtag: 1.0.2 safe-regex-test: 1.1.0 @@ -7108,7 +7128,7 @@ snapshots: is-boolean-object@1.2.2: dependencies: - call-bound: 1.0.3 + call-bound: 1.0.4 has-tostringtag: 1.0.2 is-callable@1.2.7: {} @@ -7119,13 +7139,13 @@ snapshots: is-data-view@1.0.2: dependencies: - call-bound: 1.0.3 + call-bound: 1.0.4 get-intrinsic: 1.3.0 is-typed-array: 1.1.15 is-date-object@1.1.0: dependencies: - call-bound: 1.0.3 + call-bound: 1.0.4 has-tostringtag: 1.0.2 is-decimal@2.0.1: {} @@ -7138,13 +7158,13 @@ snapshots: is-finalizationregistry@1.1.1: dependencies: - call-bound: 1.0.3 + call-bound: 1.0.4 is-fullwidth-code-point@3.0.0: {} is-generator-function@1.1.0: dependencies: - call-bound: 1.0.3 + call-bound: 1.0.4 get-proto: 1.0.1 has-tostringtag: 1.0.2 safe-regex-test: 1.1.0 @@ -7163,7 +7183,7 @@ snapshots: is-number-object@1.1.1: dependencies: - call-bound: 1.0.3 + call-bound: 1.0.4 has-tostringtag: 1.0.2 is-number@7.0.0: {} @@ -7176,7 +7196,7 @@ snapshots: is-regex@1.2.1: dependencies: - call-bound: 1.0.3 + call-bound: 1.0.4 gopd: 1.2.0 has-tostringtag: 1.0.2 hasown: 2.0.2 @@ -7185,7 +7205,7 @@ snapshots: is-shared-array-buffer@1.0.4: dependencies: - call-bound: 1.0.3 + call-bound: 1.0.4 is-stream@2.0.1: {} @@ -7193,7 +7213,7 @@ snapshots: is-string@1.1.1: dependencies: - call-bound: 1.0.3 + call-bound: 1.0.4 has-tostringtag: 1.0.2 is-subdir@1.2.0: @@ -7202,7 +7222,7 @@ snapshots: is-symbol@1.1.1: dependencies: - call-bound: 1.0.3 + call-bound: 1.0.4 has-symbols: 1.1.0 safe-regex-test: 1.1.0 @@ -7214,11 +7234,11 @@ snapshots: is-weakref@1.1.1: dependencies: - call-bound: 1.0.3 + call-bound: 1.0.4 is-weakset@2.0.4: dependencies: - call-bound: 1.0.3 + call-bound: 1.0.4 get-intrinsic: 1.3.0 is-what@4.1.16: {} @@ -7335,11 +7355,11 @@ snapshots: process-warning: 4.0.1 set-cookie-parser: 2.7.1 - local-pkg@1.1.0: + local-pkg@1.1.1: dependencies: mlly: 1.7.4 - pkg-types: 1.3.1 - quansync: 0.2.6 + pkg-types: 2.1.0 + quansync: 0.2.8 locate-path@5.0.0: dependencies: @@ -7363,7 +7383,7 @@ snapshots: dependencies: js-tokens: 4.0.0 - lru-cache@10.4.3: {} + lru-cache@11.0.2: {} lru-cache@6.0.0: dependencies: @@ -7989,13 +8009,13 @@ snapshots: - '@babel/core' - babel-plugin-macros - nextra-theme-docs@4.2.13(@types/react@19.0.10)(next@15.2.0(@playwright/test@1.50.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(nextra@4.2.13(acorn@8.14.0)(next@15.2.0(@playwright/test@1.50.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3))(react-dom@19.0.0(react@19.0.0))(react@19.0.0): + nextra-theme-docs@4.2.14(@types/react@19.0.10)(next@15.2.0(@playwright/test@1.50.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(nextra@4.2.14(acorn@8.14.0)(next@15.2.0(@playwright/test@1.50.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.8.2))(react-dom@19.0.0(react@19.0.0))(react@19.0.0): dependencies: '@headlessui/react': 2.2.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0) clsx: 2.1.1 next: 15.2.0(@playwright/test@1.50.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) next-themes: 0.4.4(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - nextra: 4.2.13(acorn@8.14.0)(next@15.2.0(@playwright/test@1.50.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3) + nextra: 4.2.14(acorn@8.14.0)(next@15.2.0(@playwright/test@1.50.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.8.2) react: 19.0.0 react-compiler-runtime: 0.0.0-experimental-22c6e49-20241219(react@19.0.0) react-dom: 19.0.0(react@19.0.0) @@ -8008,13 +8028,13 @@ snapshots: - immer - use-sync-external-store - nextra@4.2.13(acorn@8.14.0)(next@15.2.0(@playwright/test@1.50.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3): + nextra@4.2.14(acorn@8.14.0)(next@15.2.0(@playwright/test@1.50.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.8.2): dependencies: '@formatjs/intl-localematcher': 0.6.0 '@headlessui/react': 2.2.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0) '@mdx-js/mdx': 3.1.0(acorn@8.14.0) '@napi-rs/simple-git': 0.1.19 - '@shikijs/twoslash': 2.5.0(typescript@5.7.3) + '@shikijs/twoslash': 2.5.0(typescript@5.8.2) '@theguild/remark-mermaid': 0.2.0(react@19.0.0) '@theguild/remark-npm2yarn': 0.3.3 better-react-mathjax: 2.1.0(react@19.0.0) @@ -8023,7 +8043,7 @@ snapshots: estree-util-value-to-estree: 3.3.2 fast-glob: 3.3.3 github-slugger: 2.0.0 - hast-util-to-estree: 3.1.2 + hast-util-to-estree: 3.1.3 katex: 0.16.21 mdast-util-from-markdown: 2.0.2 mdast-util-gfm: 3.1.0 @@ -8086,7 +8106,7 @@ snapshots: object.assign@4.1.7: dependencies: call-bind: 1.0.8 - call-bound: 1.0.3 + call-bound: 1.0.4 define-properties: 1.2.1 es-object-atoms: 1.1.1 has-symbols: 1.1.0 @@ -8108,7 +8128,7 @@ snapshots: object.values@1.2.1: dependencies: call-bind: 1.0.8 - call-bound: 1.0.3 + call-bound: 1.0.4 define-properties: 1.2.1 es-object-atoms: 1.1.1 @@ -8195,9 +8215,9 @@ snapshots: degenerator: 5.0.1 netmask: 2.0.2 - package-manager-detector@0.2.10: + package-manager-detector@0.2.11: dependencies: - quansync: 0.2.6 + quansync: 0.2.8 pagefind@1.3.0: optionalDependencies: @@ -8315,6 +8335,12 @@ snapshots: mlly: 1.7.4 pathe: 2.0.3 + pkg-types@2.1.0: + dependencies: + confbox: 0.2.1 + exsolve: 1.0.1 + pathe: 2.0.3 + playwright-core@1.50.1: {} playwright@1.50.1: @@ -8413,16 +8439,16 @@ snapshots: prelude-ls@1.2.1: {} - prettier-plugin-packagejson@2.5.9(prettier@3.5.2): + prettier-plugin-packagejson@2.5.10(prettier@3.5.3): dependencies: - sort-package-json: 2.15.0 + sort-package-json: 2.15.1 synckit: 0.9.2 optionalDependencies: - prettier: 3.5.2 + prettier: 3.5.3 prettier@2.8.8: {} - prettier@3.5.2: {} + prettier@3.5.3: {} process-warning@4.0.1: {} @@ -8462,7 +8488,7 @@ snapshots: punycode@2.3.1: {} - quansync@0.2.6: {} + quansync@0.2.8: {} queue-microtask@1.2.3: {} @@ -8630,7 +8656,7 @@ snapshots: dependencies: '@types/estree': 1.0.6 '@types/hast': 3.0.4 - hast-util-to-estree: 3.1.2 + hast-util-to-estree: 3.1.3 transitivePeerDependencies: - supports-color @@ -8786,7 +8812,7 @@ snapshots: safe-array-concat@1.1.3: dependencies: call-bind: 1.0.8 - call-bound: 1.0.3 + call-bound: 1.0.4 get-intrinsic: 1.3.0 has-symbols: 1.1.0 isarray: 2.0.5 @@ -8802,7 +8828,7 @@ snapshots: safe-regex-test@1.1.0: dependencies: - call-bound: 1.0.3 + call-bound: 1.0.4 es-errors: 1.3.0 is-regex: 1.2.1 @@ -8937,14 +8963,14 @@ snapshots: side-channel-map@1.0.1: dependencies: - call-bound: 1.0.3 + call-bound: 1.0.4 es-errors: 1.3.0 get-intrinsic: 1.3.0 object-inspect: 1.13.4 side-channel-weakmap@1.0.2: dependencies: - call-bound: 1.0.3 + call-bound: 1.0.4 es-errors: 1.3.0 get-intrinsic: 1.3.0 object-inspect: 1.13.4 @@ -8992,7 +9018,7 @@ snapshots: sort-object-keys@1.1.3: {} - sort-package-json@2.15.0: + sort-package-json@2.15.1: dependencies: detect-indent: 7.0.1 detect-newline: 4.0.1 @@ -9052,7 +9078,7 @@ snapshots: string.prototype.matchall@4.0.12: dependencies: call-bind: 1.0.8 - call-bound: 1.0.3 + call-bound: 1.0.4 define-properties: 1.2.1 es-abstract: 1.23.9 es-errors: 1.3.0 @@ -9073,7 +9099,7 @@ snapshots: string.prototype.trim@1.2.10: dependencies: call-bind: 1.0.8 - call-bound: 1.0.3 + call-bound: 1.0.4 define-data-property: 1.1.4 define-properties: 1.2.1 es-abstract: 1.23.9 @@ -9083,7 +9109,7 @@ snapshots: string.prototype.trimend@1.0.9: dependencies: call-bind: 1.0.8 - call-bound: 1.0.3 + call-bound: 1.0.4 define-properties: 1.2.1 es-object-atoms: 1.1.1 @@ -9116,6 +9142,10 @@ snapshots: strip-json-comments@3.1.1: {} + style-to-js@1.1.16: + dependencies: + style-to-object: 1.0.8 + style-to-object@1.0.8: dependencies: inline-style-parser: 0.2.4 @@ -9182,9 +9212,9 @@ snapshots: trough@2.2.0: {} - ts-api-utils@2.0.1(typescript@5.7.3): + ts-api-utils@2.0.1(typescript@5.8.2): dependencies: - typescript: 5.7.3 + typescript: 5.8.2 ts-dedent@2.2.0: {} @@ -9230,11 +9260,11 @@ snapshots: twoslash-protocol@0.2.12: {} - twoslash@0.2.12(typescript@5.7.3): + twoslash@0.2.12(typescript@5.8.2): dependencies: - '@typescript/vfs': 1.6.1(typescript@5.7.3) + '@typescript/vfs': 1.6.1(typescript@5.8.2) twoslash-protocol: 0.2.12 - typescript: 5.7.3 + typescript: 5.8.2 transitivePeerDependencies: - supports-color @@ -9251,7 +9281,7 @@ snapshots: typed-array-buffer@1.0.3: dependencies: - call-bound: 1.0.3 + call-bound: 1.0.4 es-errors: 1.3.0 is-typed-array: 1.1.15 @@ -9282,23 +9312,23 @@ snapshots: possible-typed-array-names: 1.1.0 reflect.getprototypeof: 1.0.10 - typescript-eslint@8.25.0(eslint@9.21.0)(typescript@5.7.3): + typescript-eslint@8.26.0(eslint@9.21.0)(typescript@5.8.2): dependencies: - '@typescript-eslint/eslint-plugin': 8.25.0(@typescript-eslint/parser@8.25.0(eslint@9.21.0)(typescript@5.7.3))(eslint@9.21.0)(typescript@5.7.3) - '@typescript-eslint/parser': 8.25.0(eslint@9.21.0)(typescript@5.7.3) - '@typescript-eslint/utils': 8.25.0(eslint@9.21.0)(typescript@5.7.3) + '@typescript-eslint/eslint-plugin': 8.26.0(@typescript-eslint/parser@8.26.0(eslint@9.21.0)(typescript@5.8.2))(eslint@9.21.0)(typescript@5.8.2) + '@typescript-eslint/parser': 8.26.0(eslint@9.21.0)(typescript@5.8.2) + '@typescript-eslint/utils': 8.26.0(eslint@9.21.0)(typescript@5.8.2) eslint: 9.21.0 - typescript: 5.7.3 + typescript: 5.8.2 transitivePeerDependencies: - supports-color - typescript@5.7.3: {} + typescript@5.8.2: {} ufo@1.5.4: {} unbox-primitive@1.1.0: dependencies: - call-bound: 1.0.3 + call-bound: 1.0.4 has-bigints: 1.1.0 has-symbols: 1.1.0 which-boxed-primitive: 1.1.1 @@ -9448,7 +9478,7 @@ snapshots: which-builtin-type@1.2.1: dependencies: - call-bound: 1.0.3 + call-bound: 1.0.4 function.prototype.name: 1.1.8 has-tostringtag: 1.0.2 is-async-function: 2.1.1 @@ -9473,7 +9503,7 @@ snapshots: dependencies: available-typed-arrays: 1.0.7 call-bind: 1.0.8 - call-bound: 1.0.3 + call-bound: 1.0.4 for-each: 0.3.5 gopd: 1.2.0 has-tostringtag: 1.0.2 From 4b532b9f10ed13b94685205c902f2289bfa13a30 Mon Sep 17 00:00:00 2001 From: better-salmon <132773930+better-salmon@users.noreply.github.com> Date: Tue, 4 Mar 2025 01:23:50 +0300 Subject: [PATCH 06/16] Migrate to Vitest, refactor cache-handler API names --- .vscode/settings.json | 4 - apps/cache-testing/package.json | 1 - apps/cache-testing/run-app-instances.ts | 2 +- .../usage/creating-a-custom-handler/page.mdx | 4 +- internal/typescript-config/test.json | 19 + packages/cache-handler/package.json | 9 +- packages/cache-handler/src/cache-handler.ts | 7 +- .../handlers/experimental-redis-cluster.ts | 28 +- .../cache-handler/src/handlers/local-lru.ts | 105 +++- .../cache-handler/src/handlers/redis-stack.ts | 22 +- .../src/handlers/redis-strings.ts | 24 +- .../helpers/create-redis-timeout-config.ts | 31 ++ ...-validated-age-estimation-function.test.ts | 96 ---- ...reate-validated-age-estimation-function.ts | 41 -- .../src/helpers/get-tags-from-headers.ts | 23 - .../get-timeout-redis-command-options.ts | 13 - packages/cache-handler/src/helpers/helpers.ts | 5 +- .../src/helpers/is-implicit-tag.ts | 12 - .../src/helpers/is-tag-implicit.ts | 29 + .../src/helpers/is-tags-manifest.ts | 20 - .../src/helpers/promise-with-timeout.test.ts | 80 --- .../src/helpers/promise-with-timeout.ts | 46 -- .../instrumentation/register-initial-cache.ts | 8 +- .../cache-types/cache-string-value.ts | 14 - .../cache-types/next-cache-handler-value.ts | 53 -- .../create-configured-cache.ts | 56 -- .../cache-handler/src/next-common-types.ts | 3 +- .../src/utils/compose-age-estimation-fn.ts | 60 ++ .../src/utils/get-tags-from-headers.ts | 35 ++ packages/cache-handler/test/tsconfig.json | 5 + .../utils/compose-age-estimation-fn.test.ts | 121 ++++ packages/cache-handler/tsconfig.json | 2 +- packages/cache-handler/vitest.config.ts | 9 + pnpm-lock.yaml | 526 ++++++++++++++++++ 34 files changed, 990 insertions(+), 523 deletions(-) create mode 100644 internal/typescript-config/test.json create mode 100644 packages/cache-handler/src/helpers/create-redis-timeout-config.ts delete mode 100644 packages/cache-handler/src/helpers/create-validated-age-estimation-function.test.ts delete mode 100644 packages/cache-handler/src/helpers/create-validated-age-estimation-function.ts delete mode 100644 packages/cache-handler/src/helpers/get-tags-from-headers.ts delete mode 100644 packages/cache-handler/src/helpers/get-timeout-redis-command-options.ts delete mode 100644 packages/cache-handler/src/helpers/is-implicit-tag.ts create mode 100644 packages/cache-handler/src/helpers/is-tag-implicit.ts delete mode 100644 packages/cache-handler/src/helpers/is-tags-manifest.ts delete mode 100644 packages/cache-handler/src/helpers/promise-with-timeout.test.ts delete mode 100644 packages/cache-handler/src/helpers/promise-with-timeout.ts delete mode 100644 packages/cache-handler/src/lru-cache-next-adapter/cache-types/cache-string-value.ts delete mode 100644 packages/cache-handler/src/lru-cache-next-adapter/cache-types/next-cache-handler-value.ts delete mode 100644 packages/cache-handler/src/lru-cache-next-adapter/create-configured-cache.ts create mode 100644 packages/cache-handler/src/utils/compose-age-estimation-fn.ts create mode 100644 packages/cache-handler/src/utils/get-tags-from-headers.ts create mode 100644 packages/cache-handler/test/tsconfig.json create mode 100644 packages/cache-handler/test/utils/compose-age-estimation-fn.test.ts create mode 100644 packages/cache-handler/vitest.config.ts diff --git a/.vscode/settings.json b/.vscode/settings.json index 03a519aa..2ffbc92e 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -7,10 +7,6 @@ "typescript.surveys.enabled": false, "typescript.tsdk": "node_modules/typescript/lib", "explorer.fileNesting.enabled": true, - "explorer.fileNesting.patterns": { - "*.ts": "$(capture).test.ts, $(capture).test.tsx", - "*.tsx": "$(capture).test.ts, $(capture).test.tsx" - }, "cSpell.words": ["nextjs", "prerendered", "codestyle"], "editor.defaultFormatter": "biomejs.biome", "[jsonc]": { diff --git a/apps/cache-testing/package.json b/apps/cache-testing/package.json index 78d18428..c2ebd24c 100644 --- a/apps/cache-testing/package.json +++ b/apps/cache-testing/package.json @@ -6,7 +6,6 @@ "type": "module", "scripts": { "build": "next build && tsx create-instances.ts", - "check-types": "tsc --noEmit", "cluster:start": "pm2 start cluster.config.js --env production", "cluster:stop": "pm2 kill", "e2e": "playwright test --config=./playwright.config.ts", diff --git a/apps/cache-testing/run-app-instances.ts b/apps/cache-testing/run-app-instances.ts index 1b41f8ee..30f3ddc6 100644 --- a/apps/cache-testing/run-app-instances.ts +++ b/apps/cache-testing/run-app-instances.ts @@ -2,7 +2,7 @@ import { scheduler } from 'node:timers/promises'; import Fastify from 'fastify'; -// biome-ignore lint/style/noNamespaceImport: pm2 works only with Namespace import +// biome-ignore lint/style/noNamespaceImport: pm2 works only with namespace import import * as pm2Default from 'pm2'; const { default: pm2 } = pm2Default as unknown as { diff --git a/docs/cache-handler-docs/src/app/usage/creating-a-custom-handler/page.mdx b/docs/cache-handler-docs/src/app/usage/creating-a-custom-handler/page.mdx index f914c0bd..9a14d9e3 100644 --- a/docs/cache-handler-docs/src/app/usage/creating-a-custom-handler/page.mdx +++ b/docs/cache-handler-docs/src/app/usage/creating-a-custom-handler/page.mdx @@ -18,7 +18,7 @@ Create a file called `cache-handler.mjs` next to your `next.config.js` with the ```js filename="cache-handler.mjs" copy import { CacheHandler } from '@neshca/cache-handler'; -import { isImplicitTag } from '@neshca/cache-handler/helpers'; +import { isTagImplicit } from '@neshca/cache-handler/helpers'; import { createClient, commandOptions } from 'redis'; CacheHandler.onCreation(async () => { @@ -179,7 +179,7 @@ CacheHandler.onCreation(async () => { // Check if the tag is implicit. // Implicit tags are not stored in the cached values. - if (isImplicitTag(tag)) { + if (isTagImplicit(tag)) { // Mark the tag as revalidated at the current time. await client.hSet( commandOptions({ signal: AbortSignal.timeout(timeoutMs) }), diff --git a/internal/typescript-config/test.json b/internal/typescript-config/test.json new file mode 100644 index 00000000..eec6c6c0 --- /dev/null +++ b/internal/typescript-config/test.json @@ -0,0 +1,19 @@ +{ + "$schema": "https://json.schemastore.org/tsconfig", + "display": "Test", + "compilerOptions": { + "target": "es2022", + "lib": ["es2023"], + + "module": "NodeNext", + "moduleDetection": "force", + "esModuleInterop": true, + + "strict": true, + "noUncheckedIndexedAccess": true, + "noImplicitOverride": true, + "skipLibCheck": true, + + "noEmit": true + } +} diff --git a/packages/cache-handler/package.json b/packages/cache-handler/package.json index dba0e6fe..f034317c 100644 --- a/packages/cache-handler/package.json +++ b/packages/cache-handler/package.json @@ -24,16 +24,16 @@ "type": "module", "exports": { ".": "./dist/cache-handler.js", + "./helpers/*": "./dist/helpers/*.js", "./handlers/*": "./dist/handlers/*.js", - "./helpers": "./dist/helpers/helpers.js", "./instrumentation/*": "./dist/instrumentation/*.js" }, "scripts": { "build": "tsc", "check-types": "tsc --noEmit", "dev": "tsc --watch", - "test": "tsx --test src/**/*.test.ts", - "test:watch": "tsx --watch --test src/**/*.test.ts" + "test": "vitest run", + "test:watch": "vitest" }, "dependencies": { "cluster-key-slot": "^1.1.2", @@ -44,7 +44,8 @@ "@repo/typescript-config": "workspace:*", "@types/node": "22.13.9", "tsx": "4.19.3", - "typescript": "5.8.2" + "typescript": "5.8.2", + "vitest": "3.0.7" }, "peerDependencies": { "next": ">= 15 < 16", diff --git a/packages/cache-handler/src/cache-handler.ts b/packages/cache-handler/src/cache-handler.ts index 7b066643..f81648a6 100644 --- a/packages/cache-handler/src/cache-handler.ts +++ b/packages/cache-handler/src/cache-handler.ts @@ -15,8 +15,8 @@ import type { } from './next-common-types.js'; import { CachedRouteKind } from './next-common-types.js'; -import { createValidatedAgeEstimationFunction } from './helpers/create-validated-age-estimation-function.js'; -import { getTagsFromHeaders } from './helpers/get-tags-from-headers.js'; +import { composeAgeEstimationFn } from './utils/compose-age-estimation-fn.js'; +import { getTagsFromHeaders } from './utils/get-tags-from-headers.js'; export type { CacheHandlerValue }; @@ -623,8 +623,7 @@ export class CacheHandler implements NextCacheHandler { CacheHandler.#defaultStaleAge = Math.floor(defaultStaleAge); } - CacheHandler.#estimateExpireAge = - createValidatedAgeEstimationFunction(estimateExpireAge); + CacheHandler.#estimateExpireAge = composeAgeEstimationFn(estimateExpireAge); CacheHandler.#serverDistDir = serverDistDir; diff --git a/packages/cache-handler/src/handlers/experimental-redis-cluster.ts b/packages/cache-handler/src/handlers/experimental-redis-cluster.ts index dd82083c..9d8a51f1 100644 --- a/packages/cache-handler/src/handlers/experimental-redis-cluster.ts +++ b/packages/cache-handler/src/handlers/experimental-redis-cluster.ts @@ -1,11 +1,11 @@ -import calculate from 'cluster-key-slot'; -import type { createCluster } from 'redis'; import type { CacheHandlerValue, Handler } from '../cache-handler.js'; import type { CreateRedisStringsHandlerOptions } from '../common-types.js'; +import calculate from 'cluster-key-slot'; +import type { createCluster } from 'redis'; import { REVALIDATED_TAGS_KEY } from '../constants.js'; -import { getTimeoutRedisCommandOptions } from '../helpers/get-timeout-redis-command-options.js'; -import { isImplicitTag } from '../helpers/is-implicit-tag.js'; +import { createRedisTimeoutConfig } from '../helpers/create-redis-timeout-config.js'; +import { isTagImplicit } from '../helpers/is-tag-implicit.js'; type CreateRedisClusterHandlerOptions> = CreateRedisStringsHandlerOptions & { @@ -83,7 +83,7 @@ export default function createHandler({ name: 'experimental-redis-cluster', async get(key, { implicitTags }) { const result = await cluster.get( - getTimeoutRedisCommandOptions(timeoutMs), + createRedisTimeoutConfig(timeoutMs), keyPrefix + key, ); @@ -104,7 +104,7 @@ export default function createHandler({ } const revalidationTimes = await cluster.hmGet( - getTimeoutRedisCommandOptions(timeoutMs), + createRedisTimeoutConfig(timeoutMs), revalidatedTagsKey, Array.from(combinedTags), ); @@ -115,7 +115,7 @@ export default function createHandler({ Number.parseInt(timeString, 10) > cacheValue.lastModified ) { await cluster.unlink( - getTimeoutRedisCommandOptions(timeoutMs), + createRedisTimeoutConfig(timeoutMs), keyPrefix + key, ); @@ -126,7 +126,7 @@ export default function createHandler({ return cacheValue; }, async set(key, cacheHandlerValue) { - const options = getTimeoutRedisCommandOptions(timeoutMs); + const options = createRedisTimeoutConfig(timeoutMs); let setOperation: Promise; @@ -184,9 +184,9 @@ export default function createHandler({ async revalidateTag(tag) { // If the tag is an implicit tag, we need to mark it as revalidated. // The revalidation process is done by the CacheHandler class on the next get operation. - if (isImplicitTag(tag)) { + if (isTagImplicit(tag)) { await cluster.hSet( - getTimeoutRedisCommandOptions(timeoutMs), + createRedisTimeoutConfig(timeoutMs), revalidatedTagsKey, tag, Date.now(), @@ -201,7 +201,7 @@ export default function createHandler({ do { const remoteTagsPortion = await cluster.hScan( - getTimeoutRedisCommandOptions(timeoutMs), + createRedisTimeoutConfig(timeoutMs), keyPrefix + sharedTagsKey, cursor, hScanOptions, @@ -242,7 +242,7 @@ export default function createHandler({ } const unlinkPromisesForSlot = client.unlink( - getTimeoutRedisCommandOptions(timeoutMs), + createRedisTimeoutConfig(timeoutMs), keys, ); @@ -252,7 +252,7 @@ export default function createHandler({ } const updateTagsOperation = cluster.hDel( - { isolated: true, ...getTimeoutRedisCommandOptions(timeoutMs) }, + { isolated: true, ...createRedisTimeoutConfig(timeoutMs) }, keyPrefix + sharedTagsKey, tagsToDelete, ); @@ -260,7 +260,7 @@ export default function createHandler({ await Promise.allSettled([...unlinkPromises, updateTagsOperation]); }, async delete(key) { - await cluster.unlink(getTimeoutRedisCommandOptions(timeoutMs), key); + await cluster.unlink(createRedisTimeoutConfig(timeoutMs), key); }, }; } diff --git a/packages/cache-handler/src/handlers/local-lru.ts b/packages/cache-handler/src/handlers/local-lru.ts index 38162e60..3bca2a5f 100644 --- a/packages/cache-handler/src/handlers/local-lru.ts +++ b/packages/cache-handler/src/handlers/local-lru.ts @@ -1,15 +1,108 @@ -import type { LruCacheOptions } from '../lru-cache-next-adapter/cache-types/next-cache-handler-value.js'; -import createCacheStore from '../lru-cache-next-adapter/cache-types/next-cache-handler-value.js'; - import type { Handler } from '../cache-handler.js'; import { NEXT_CACHE_IMPLICIT_TAG_ID } from '../next-common-types.js'; +import { + type CacheHandlerValue, + CachedRouteKind, +} from '../next-common-types.js'; +import { LRUCache } from 'lru-cache'; + +function calculateObjectSize({ value }: CacheHandlerValue): number { + // Return default size if value is falsy + if (!value) { + return 25; + } + + switch (value.kind) { + case CachedRouteKind.REDIRECT: { + // Calculate size based on the length of the stringified props + return JSON.stringify(value.props).length; + } + case CachedRouteKind.IMAGE: { + // Throw a specific error for image kind + throw new Error( + 'Image kind should not be used for incremental-cache calculations.', + ); + } + case CachedRouteKind.FETCH: { + // Calculate size based on the length of the stringified data + return JSON.stringify(value.data || '').length; + } + case CachedRouteKind.APP_ROUTE: { + // Size based on the length of the body + return value.body.length; + } + case CachedRouteKind.PAGES: { + return value.html.length + JSON.stringify(value.pageData).length; + } + case CachedRouteKind.APP_PAGE: { + return value.html.length + (value.rscData?.length || 0); + } + default: { + return 0; + } + } +} + +export function createCacheStore( + options?: LruCacheOptions, +): LRUCache { + return createConfiguredCache(calculateObjectSize, options); +} /** - * @deprecated Use {@link LruCacheOptions} instead. + * Configuration options for the LRU cache. + * + * @since 1.0.0 */ -export type LruCacheHandlerOptions = LruCacheOptions; +export type LruCacheOptions = { + /** + * Optional. Maximum number of items the cache can hold. + * + * @default 1000 + * + * @since 1.0.0 + */ + maxItemsNumber?: number; + /** + * Optional. Maximum size in bytes for each item in the cache. + * + * @default 104857600 // 100 Mb + * + * @since 1.0.0 + */ + maxItemSizeBytes?: number; +}; + +const MAX_ITEMS_NUMBER = 1000; +const MAX_ITEM_SIZE_BYTES = 100 * 1024 * 1024; + +const DEFAULT_OPTIONS: LruCacheOptions = { + maxItemsNumber: MAX_ITEMS_NUMBER, + maxItemSizeBytes: MAX_ITEM_SIZE_BYTES, +}; -export type { LruCacheOptions }; +/** + * Creates a configured LRUCache. + * + * @param calculateSizeCallback - A callback function to calculate the size of cache items. + * + * @param options - Optional configuration options for the cache. + * + * @returns A new instance of LRUCache. + */ +export function createConfiguredCache( + calculateSizeCallback: (value: CacheValueType) => number, + { + maxItemsNumber = MAX_ITEMS_NUMBER, + maxItemSizeBytes = MAX_ITEM_SIZE_BYTES, + } = DEFAULT_OPTIONS, +): LRUCache { + return new LRUCache({ + max: maxItemsNumber, + maxSize: maxItemSizeBytes, + sizeCalculation: calculateSizeCallback, + }); +} /** * Creates an LRU (Least Recently Used) cache Handler. diff --git a/packages/cache-handler/src/handlers/redis-stack.ts b/packages/cache-handler/src/handlers/redis-stack.ts index 75aca370..f222b78e 100644 --- a/packages/cache-handler/src/handlers/redis-stack.ts +++ b/packages/cache-handler/src/handlers/redis-stack.ts @@ -7,8 +7,8 @@ import type { RedisJSON, } from '../common-types.js'; import { REVALIDATED_TAGS_KEY, TIME_ONE_YEAR } from '../constants.js'; -import { getTimeoutRedisCommandOptions } from '../helpers/get-timeout-redis-command-options.js'; -import { isImplicitTag } from '../helpers/is-implicit-tag.js'; +import { createRedisTimeoutConfig } from '../helpers/create-redis-timeout-config.js'; +import { isTagImplicit } from '../helpers/is-tag-implicit.js'; export type { CreateRedisStackHandlerOptions }; @@ -88,7 +88,7 @@ export default function createHandler({ assertClientIsReady(); const cacheValue = (await client.json.get( - getTimeoutRedisCommandOptions(timeoutMs), + createRedisTimeoutConfig(timeoutMs), keyPrefix + key, )) as CacheHandlerValue | null; @@ -108,7 +108,7 @@ export default function createHandler({ } const revalidationTimes = await client.hmGet( - getTimeoutRedisCommandOptions(timeoutMs), + createRedisTimeoutConfig(timeoutMs), revalidatedTagsKey, Array.from(combinedTags), ); @@ -119,7 +119,7 @@ export default function createHandler({ Number.parseInt(timeString, 10) > cacheValue.lastModified ) { await client.unlink( - getTimeoutRedisCommandOptions(timeoutMs), + createRedisTimeoutConfig(timeoutMs), keyPrefix + key, ); @@ -134,7 +134,7 @@ export default function createHandler({ cacheHandlerValue.tags = cacheHandlerValue.tags.map(sanitizeTag); - const options = getTimeoutRedisCommandOptions(timeoutMs); + const options = createRedisTimeoutConfig(timeoutMs); const setCacheValue = client.json.set( options, @@ -162,9 +162,9 @@ export default function createHandler({ // If the tag is an implicit tag, we need to mark it as revalidated. // The revalidation process is done by the CacheHandler class on the next get operation. - if (isImplicitTag(tag)) { + if (isTagImplicit(tag)) { await client.hSet( - getTimeoutRedisCommandOptions(timeoutMs), + createRedisTimeoutConfig(timeoutMs), revalidatedTagsKey, sanitizedTag, Date.now(), @@ -177,7 +177,7 @@ export default function createHandler({ while (true) { const { documents: documentIds } = await client.ft.searchNoContent( - getTimeoutRedisCommandOptions(timeoutMs), + createRedisTimeoutConfig(timeoutMs), indexName, `@tag:(${sanitizedTag})`, { @@ -201,12 +201,12 @@ export default function createHandler({ return; } - const options = getTimeoutRedisCommandOptions(timeoutMs); + const options = createRedisTimeoutConfig(timeoutMs); await client.unlink(options, keysToDelete); }, async delete(key) { - await client.unlink(getTimeoutRedisCommandOptions(timeoutMs), key); + await client.unlink(createRedisTimeoutConfig(timeoutMs), key); }, }; } diff --git a/packages/cache-handler/src/handlers/redis-strings.ts b/packages/cache-handler/src/handlers/redis-strings.ts index 499c9cea..81348f67 100644 --- a/packages/cache-handler/src/handlers/redis-strings.ts +++ b/packages/cache-handler/src/handlers/redis-strings.ts @@ -4,8 +4,8 @@ import type { CacheHandlerValue, Handler } from '../cache-handler.js'; import type { CreateRedisStringsHandlerOptions } from '../common-types.js'; import { REVALIDATED_TAGS_KEY } from '../constants.js'; -import { getTimeoutRedisCommandOptions } from '../helpers/get-timeout-redis-command-options.js'; -import { isImplicitTag } from '../helpers/is-implicit-tag.js'; +import { createRedisTimeoutConfig } from '../helpers/create-redis-timeout-config.js'; +import { isTagImplicit } from '../helpers/is-tag-implicit.js'; export type { CreateRedisStringsHandlerOptions }; @@ -60,7 +60,7 @@ export default function createHandler({ assertClientIsReady(); const result = await client.get( - getTimeoutRedisCommandOptions(timeoutMs), + createRedisTimeoutConfig(timeoutMs), keyPrefix + key, ); @@ -81,7 +81,7 @@ export default function createHandler({ } const revalidationTimes = await client.hmGet( - getTimeoutRedisCommandOptions(timeoutMs), + createRedisTimeoutConfig(timeoutMs), revalidatedTagsKey, Array.from(combinedTags), ); @@ -92,7 +92,7 @@ export default function createHandler({ Number.parseInt(timeString, 10) > cacheValue.lastModified ) { await client.unlink( - getTimeoutRedisCommandOptions(timeoutMs), + createRedisTimeoutConfig(timeoutMs), keyPrefix + key, ); @@ -105,7 +105,7 @@ export default function createHandler({ async set(key, cacheHandlerValue) { assertClientIsReady(); - const options = getTimeoutRedisCommandOptions(timeoutMs); + const options = createRedisTimeoutConfig(timeoutMs); let setOperation: Promise; @@ -165,9 +165,9 @@ export default function createHandler({ // If the tag is an implicit tag, we need to mark it as revalidated. // The revalidation process is done by the CacheHandler class on the next get operation. - if (isImplicitTag(tag)) { + if (isTagImplicit(tag)) { await client.hSet( - getTimeoutRedisCommandOptions(timeoutMs), + createRedisTimeoutConfig(timeoutMs), revalidatedTagsKey, tag, Date.now(), @@ -182,7 +182,7 @@ export default function createHandler({ do { const remoteTagsPortion = await client.hScan( - getTimeoutRedisCommandOptions(timeoutMs), + createRedisTimeoutConfig(timeoutMs), keyPrefix + sharedTagsKey, cursor, hScanOptions, @@ -211,12 +211,12 @@ export default function createHandler({ } const deleteKeysOperation = client.unlink( - getTimeoutRedisCommandOptions(timeoutMs), + createRedisTimeoutConfig(timeoutMs), keysToDelete, ); const updateTagsOperation = client.hDel( - { isolated: true, ...getTimeoutRedisCommandOptions(timeoutMs) }, + { isolated: true, ...createRedisTimeoutConfig(timeoutMs) }, keyPrefix + sharedTagsKey, tagsToDelete, ); @@ -224,7 +224,7 @@ export default function createHandler({ await Promise.all([deleteKeysOperation, updateTagsOperation]); }, async delete(key) { - await client.unlink(getTimeoutRedisCommandOptions(timeoutMs), key); + await client.unlink(createRedisTimeoutConfig(timeoutMs), key); }, }; } diff --git a/packages/cache-handler/src/helpers/create-redis-timeout-config.ts b/packages/cache-handler/src/helpers/create-redis-timeout-config.ts new file mode 100644 index 00000000..f2c1eeff --- /dev/null +++ b/packages/cache-handler/src/helpers/create-redis-timeout-config.ts @@ -0,0 +1,31 @@ +import { commandOptions } from 'redis'; + +type CommandOptions = ReturnType; + +/** + * Creates Redis command options with an optional timeout. + * + * This function generates command options for Redis operations with an abort signal + * that will automatically timeout after the specified duration. If timeoutMs is set to 0, + * no timeout will be applied. + * + * @param timeoutMs - The timeout duration in milliseconds. If set to 0, no timeout will be applied. + * + * @returns Redis command options with the specified timeout configuration. + * + * @example + * ```ts + * // Create command options with a 5-second timeout + * const options = createRedisTimeoutConfig(5000); + * + * // Use the options in a Redis command + * await client.get(options, 'myKey'); + * ``` + */ +export function createRedisTimeoutConfig(timeoutMs: number): CommandOptions { + if (timeoutMs === 0) { + return commandOptions({}); + } + + return commandOptions({ signal: AbortSignal.timeout(timeoutMs) }); +} diff --git a/packages/cache-handler/src/helpers/create-validated-age-estimation-function.test.ts b/packages/cache-handler/src/helpers/create-validated-age-estimation-function.test.ts deleted file mode 100644 index 03629b71..00000000 --- a/packages/cache-handler/src/helpers/create-validated-age-estimation-function.test.ts +++ /dev/null @@ -1,96 +0,0 @@ -import assert from 'node:assert/strict'; -import { test } from 'node:test'; -import { MAX_INT32 } from '../constants.js'; -import { createValidatedAgeEstimationFunction } from './create-validated-age-estimation-function.js'; - -await test('returns the same age for simple callback', () => { - const estimateAge = createValidatedAgeEstimationFunction((age) => age); - const testAge = 100; - assert.strictEqual( - estimateAge(testAge), - testAge, - 'The estimated age should equal the input age.', - ); -}); - -await test('throws error for negative age', () => { - const estimateAge = createValidatedAgeEstimationFunction((age) => age); - const testAge = -1; - assert.throws( - () => estimateAge(testAge), - /The expire age must be a positive integer but got/, - 'Should throw error for negative age.', - ); -}); - -await test('handles float by flooring', () => { - const estimateAge = createValidatedAgeEstimationFunction((age) => age + 0.9); - const testAge = 100; - assert.strictEqual( - estimateAge(testAge), - 100, - 'The estimated age should be floored to the nearest lower integer.', - ); -}); - -await test('handles numbers bigger than MAX_INT32 by returning MAX_INT32', () => { - const estimateAge = createValidatedAgeEstimationFunction( - (age) => age + MAX_INT32, - ); - assert.strictEqual( - estimateAge(100), - MAX_INT32, - 'The estimated age should return MAX_INT32 for numbers bigger than MAX_INT32.', - ); -}); - -await test('throws error for non-integer', () => { - const estimateAge = createValidatedAgeEstimationFunction( - (age) => age + Number.NaN, - ); - assert.throws( - () => estimateAge(10), - /The expire age must be a positive integer but got/, - 'Should throw error for non-integer values.', - ); -}); - -await test('throws error for zero', () => { - const estimateAge = createValidatedAgeEstimationFunction((age) => age * 0); - assert.throws( - () => estimateAge(10), - /The expire age must be a positive integer but got/, - 'Should throw error for zero.', - ); -}); - -await test('handles MAX_INT32 correctly', () => { - const estimateAge = createValidatedAgeEstimationFunction((_age) => MAX_INT32); - assert.strictEqual( - estimateAge(0), - MAX_INT32, - 'The estimated age should handle MAX_INT32 correctly.', - ); -}); - -await test('throws error for non-numeric input', () => { - const estimateAge = createValidatedAgeEstimationFunction( - (_age) => 'non-numeric' as unknown as number, - ); - assert.throws( - () => estimateAge(10), - /The expire age must be a positive integer but got/, - 'Should throw error for non-numeric input.', - ); -}); - -await test('callback throws an error', () => { - const estimateAge = createValidatedAgeEstimationFunction(() => { - throw new Error('Test error'); - }); - assert.throws( - () => estimateAge(10), - /Test error/, - 'Should propagate callback errors.', - ); -}); diff --git a/packages/cache-handler/src/helpers/create-validated-age-estimation-function.ts b/packages/cache-handler/src/helpers/create-validated-age-estimation-function.ts deleted file mode 100644 index 073a254e..00000000 --- a/packages/cache-handler/src/helpers/create-validated-age-estimation-function.ts +++ /dev/null @@ -1,41 +0,0 @@ -import assert from 'node:assert/strict'; -import { MAX_INT32 } from '../constants.js'; - -type EstimateExpireAgeFunction = typeof getInitialExpireAge; - -/** - * Returns the initial expire age based on the provided stale age. - * - * @param staleAge - The stale age value. - * - * @returns The initial expire age. - */ -export function getInitialExpireAge(staleAge: number): number { - return staleAge * 1.5; -} - -/** - * Creates a validated age estimation function. - * - * @param callback - The callback function to calculate the expire age based on the stale age. - * - * @returns The age estimation function. This function will return the expire age based on the stale age. - * Its return value will be a positive integer and less than 2147483647. - */ -export function createValidatedAgeEstimationFunction( - callback = getInitialExpireAge, -): EstimateExpireAgeFunction { - return function estimateExpireAge(staleAge: number): number { - const rawExpireAge = callback(staleAge); - - const expireAge = Math.min(Math.floor(rawExpireAge), MAX_INT32); - - // Number.isInteger also checks for NaN, Infinity, -Infinity and non-numeric values. - assert( - Number.isInteger(expireAge) && expireAge > 0, - `The expire age must be a positive integer but got a ${expireAge}.`, - ); - - return expireAge; - }; -} diff --git a/packages/cache-handler/src/helpers/get-tags-from-headers.ts b/packages/cache-handler/src/helpers/get-tags-from-headers.ts deleted file mode 100644 index 83e676f1..00000000 --- a/packages/cache-handler/src/helpers/get-tags-from-headers.ts +++ /dev/null @@ -1,23 +0,0 @@ -// biome-ignore lint/style/useNodejsImportProtocol: RollupError: "OutgoingHttpHeaders" is not exported by "node:http" -import type { OutgoingHttpHeaders } from 'http'; - -/** - * Retrieves the cache tags from the headers. - * - * @param headers - Headers object. - * - * @returns An array of cache tags. - */ -export function getTagsFromHeaders(headers: OutgoingHttpHeaders): string[] { - const tagsHeader = headers['x-next-cache-tags']; - - if (Array.isArray(tagsHeader)) { - return tagsHeader; - } - - if (typeof tagsHeader === 'string') { - return tagsHeader.split(','); - } - - return []; -} diff --git a/packages/cache-handler/src/helpers/get-timeout-redis-command-options.ts b/packages/cache-handler/src/helpers/get-timeout-redis-command-options.ts deleted file mode 100644 index 453be3c8..00000000 --- a/packages/cache-handler/src/helpers/get-timeout-redis-command-options.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { commandOptions } from 'redis'; - -type CommandOptions = ReturnType; - -export function getTimeoutRedisCommandOptions( - timeoutMs: number, -): CommandOptions { - if (timeoutMs === 0) { - return commandOptions({}); - } - - return commandOptions({ signal: AbortSignal.timeout(timeoutMs) }); -} diff --git a/packages/cache-handler/src/helpers/helpers.ts b/packages/cache-handler/src/helpers/helpers.ts index c07b3edb..90baae5c 100644 --- a/packages/cache-handler/src/helpers/helpers.ts +++ b/packages/cache-handler/src/helpers/helpers.ts @@ -1,3 +1,2 @@ -export { promiseWithTimeout } from './promise-with-timeout.js'; -export { isImplicitTag } from './is-implicit-tag.js'; -export { getTimeoutRedisCommandOptions } from './get-timeout-redis-command-options.js'; +export { isTagImplicit } from './is-tag-implicit.js'; +export { createRedisTimeoutConfig } from './create-redis-timeout-config.js'; diff --git a/packages/cache-handler/src/helpers/is-implicit-tag.ts b/packages/cache-handler/src/helpers/is-implicit-tag.ts deleted file mode 100644 index 997bf7f8..00000000 --- a/packages/cache-handler/src/helpers/is-implicit-tag.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { NEXT_CACHE_IMPLICIT_TAG_ID } from '../next-common-types.js'; - -/** - * Checks if a given tag is an implicit tag. - * - * @param tag - The tag to check. - * - * @returns A boolean indicating whether the tag is an implicit tag. - */ -export function isImplicitTag(tag: string): boolean { - return tag.startsWith(NEXT_CACHE_IMPLICIT_TAG_ID); -} diff --git a/packages/cache-handler/src/helpers/is-tag-implicit.ts b/packages/cache-handler/src/helpers/is-tag-implicit.ts new file mode 100644 index 00000000..c95d2b3f --- /dev/null +++ b/packages/cache-handler/src/helpers/is-tag-implicit.ts @@ -0,0 +1,29 @@ +import { NEXT_CACHE_IMPLICIT_TAG_ID } from '../next-common-types.js'; + +/** + * Determines if a tag is an implicit tag generated by Next.js for internal cache management. + * + * Implicit tags are automatically generated by Next.js based on the routing hierarchy + * to manage cache invalidation for pages and layouts in the App Router. They are prefixed + * with `NEXT_CACHE_IMPLICIT_TAG_ID` ('_N_T_') to distinguish them from user-defined tags. + * + * Implicit tags require special handling during revalidation because they are part of + * Next.js's internal caching mechanism. When an implicit tag is revalidated, the actual + * cache invalidation is deferred until the next 'get' operation that accesses the cache. + * + * @param tag - The cache tag string to check + * + * @returns `true` if the tag is an implicit Next.js tag (starts with '_N_T_'), `false` otherwise + * + * @example + * // Returns true for implicit tags + * isTagImplicit('_N_T_/layout') // true + * isTagImplicit('_N_T_/user/[id]/page') // true + * + * // Returns false for user-defined tags + * isTagImplicit('user-123') // false + * isTagImplicit('product-update') // false + */ +export function isTagImplicit(tag: string): boolean { + return tag.startsWith(NEXT_CACHE_IMPLICIT_TAG_ID); +} diff --git a/packages/cache-handler/src/helpers/is-tags-manifest.ts b/packages/cache-handler/src/helpers/is-tags-manifest.ts deleted file mode 100644 index 3198c7e1..00000000 --- a/packages/cache-handler/src/helpers/is-tags-manifest.ts +++ /dev/null @@ -1,20 +0,0 @@ -import type { TagsManifest } from '../next-common-types.js'; - -function hasItems(object: object): object is { items: unknown } { - return Object.hasOwn(object, 'items'); -} - -function hasVersion(object: object): object is { version: unknown } { - return Object.hasOwn(object, 'version'); -} - -export function isTagsManifest(object: unknown): object is TagsManifest { - return ( - typeof object === 'object' && - object !== null && - hasItems(object) && - hasVersion(object) && - typeof object.version === 'number' && - object.version === 1 - ); -} diff --git a/packages/cache-handler/src/helpers/promise-with-timeout.test.ts b/packages/cache-handler/src/helpers/promise-with-timeout.test.ts deleted file mode 100644 index ac4866e2..00000000 --- a/packages/cache-handler/src/helpers/promise-with-timeout.test.ts +++ /dev/null @@ -1,80 +0,0 @@ -import assert from 'node:assert/strict'; -import { test } from 'node:test'; -import Timers from 'node:timers/promises'; - -import { promiseWithTimeout } from './promise-with-timeout.js'; - -async function simulateOperation(duration: number): Promise { - await Timers.scheduler.wait(duration); - - return 'completed'; -} - -async function simulateOperationError(duration: number): Promise { - await Timers.scheduler.wait(duration); - - throw new Error('Operation error'); -} - -await test('should resolve if operation finishes before timeout', async () => { - const fastOperation = simulateOperation(100); - const result = await promiseWithTimeout(fastOperation, 200); - assert.strictEqual(result, 'completed'); -}); - -await test('should reject if operation times out', async () => { - const slowOperation = simulateOperation(300); - try { - await promiseWithTimeout(slowOperation, 100); - assert.fail('Expected operation to time out'); - } catch (error) { - if (error instanceof Error) { - assert.match(error.message, /timed out/); - } - } -}); - -await test('should allow operation without timeout when timeoutMs is undefined', async () => { - const operation = simulateOperation(100); - const result = await promiseWithTimeout(operation); - assert.strictEqual(result, 'completed'); -}); - -await test('should return original operation if timeoutMs is not a number', async () => { - const operation = simulateOperation(100); - const result = await promiseWithTimeout( - operation, - 'not a number' as unknown as number, - ); - assert.strictEqual(result, 'completed'); -}); - -await test('should return original operation if timeoutMs is NaN', async () => { - const operation = simulateOperation(100); - const result = await promiseWithTimeout(operation, Number.NaN); - assert.strictEqual(result, 'completed'); -}); - -await test('should return original operation if timeoutMs is less than or equal to 0', async () => { - const operation = simulateOperation(100); - const result = await promiseWithTimeout(operation, 0); - assert.strictEqual(result, 'completed'); -}); - -await test('should return original operation if timeoutMs is greater than MAX_INT32', async () => { - const operation = simulateOperation(100); - const result = await promiseWithTimeout(operation, Number.MAX_SAFE_INTEGER); - assert.strictEqual(result, 'completed'); -}); - -await test('should reject if operation throws an error', async () => { - try { - const operationError = simulateOperationError(100); - await promiseWithTimeout(operationError, 200); - assert.fail('Expected operation to throw an error'); - } catch (error) { - if (error instanceof Error) { - assert.match(error.message, /Operation error/); - } - } -}); diff --git a/packages/cache-handler/src/helpers/promise-with-timeout.ts b/packages/cache-handler/src/helpers/promise-with-timeout.ts deleted file mode 100644 index 497c944c..00000000 --- a/packages/cache-handler/src/helpers/promise-with-timeout.ts +++ /dev/null @@ -1,46 +0,0 @@ -import { MAX_INT32 } from '../constants.js'; - -/** - * Wraps a Promise with a timeout, rejecting the Promise if it does not resolve within the specified time. - * - * @param operation - The Promise to wrap with a timeout. - * @param timeoutMs - Optional. The timeout period in milliseconds. - * If this is not a positive number, the function will simply return the original Promise. - * - * @returns A new Promise that behaves like the original Promise, - * but will be rejected if the original Promise does not resolve within the specified timeout. - * - * @throws If the operation does not complete within the specified timeout, - * the returned Promise will be rejected with an Error that has a message indicating the timeout period. - */ -export function promiseWithTimeout( - operation: Promise, - timeoutMs?: number, -): Promise { - if ( - typeof timeoutMs !== 'number' || - Number.isNaN(timeoutMs) || - timeoutMs <= 0 || - timeoutMs > MAX_INT32 - ) { - return operation; - } - - return new Promise((resolve, reject) => { - const timeoutId = setTimeout( - reject, - timeoutMs, - new Error(`Operation timed out after ${timeoutMs} ms`), - ); - - operation - .then((result) => { - clearTimeout(timeoutId); - resolve(result); - }) - .catch((error) => { - clearTimeout(timeoutId); - reject(error as Error); - }); - }); -} diff --git a/packages/cache-handler/src/instrumentation/register-initial-cache.ts b/packages/cache-handler/src/instrumentation/register-initial-cache.ts index a95f637e..c14395fc 100644 --- a/packages/cache-handler/src/instrumentation/register-initial-cache.ts +++ b/packages/cache-handler/src/instrumentation/register-initial-cache.ts @@ -1,15 +1,15 @@ import { promises as fsPromises } from 'node:fs'; import path from 'node:path'; -import { PRERENDER_MANIFEST, SERVER_DIRECTORY } from 'next/constants.js'; -import type { PrerenderManifest } from 'next/dist/build/index.js'; -import { CACHE_ONE_YEAR } from 'next/dist/lib/constants.js'; -import { getTagsFromHeaders } from '../helpers/get-tags-from-headers.js'; +import { getTagsFromHeaders } from '../utils/get-tags-from-headers.js'; import { type CachedFetchValue, CachedRouteKind, type Revalidate, type RouteMetadata, } from '../next-common-types.js'; +import { PRERENDER_MANIFEST, SERVER_DIRECTORY } from 'next/constants.js'; +import type { PrerenderManifest } from 'next/dist/build/index.js'; +import { CACHE_ONE_YEAR } from 'next/dist/lib/constants.js'; type CacheHandlerType = typeof import('../cache-handler.js').CacheHandler; diff --git a/packages/cache-handler/src/lru-cache-next-adapter/cache-types/cache-string-value.ts b/packages/cache-handler/src/lru-cache-next-adapter/cache-types/cache-string-value.ts deleted file mode 100644 index 8967f743..00000000 --- a/packages/cache-handler/src/lru-cache-next-adapter/cache-types/cache-string-value.ts +++ /dev/null @@ -1,14 +0,0 @@ -import type { LRUCache } from 'lru-cache'; - -import type { LruCacheOptions } from '../create-configured-cache.js'; -import { createConfiguredCache } from '../create-configured-cache.js'; - -function calculateStringSize(value: string): number { - return value.length; -} - -export default function createCacheStore( - options?: LruCacheOptions, -): LRUCache { - return createConfiguredCache(calculateStringSize, options); -} diff --git a/packages/cache-handler/src/lru-cache-next-adapter/cache-types/next-cache-handler-value.ts b/packages/cache-handler/src/lru-cache-next-adapter/cache-types/next-cache-handler-value.ts deleted file mode 100644 index bd5d64b3..00000000 --- a/packages/cache-handler/src/lru-cache-next-adapter/cache-types/next-cache-handler-value.ts +++ /dev/null @@ -1,53 +0,0 @@ -import type { LRUCache } from 'lru-cache'; -import { - type CacheHandlerValue, - CachedRouteKind, -} from '../../next-common-types.js'; - -import type { LruCacheOptions } from '../create-configured-cache.js'; -import { createConfiguredCache } from '../create-configured-cache.js'; - -function calculateObjectSize({ value }: CacheHandlerValue): number { - // Return default size if value is falsy - if (!value) { - return 25; - } - - switch (value.kind) { - case CachedRouteKind.REDIRECT: { - // Calculate size based on the length of the stringified props - return JSON.stringify(value.props).length; - } - case CachedRouteKind.IMAGE: { - // Throw a specific error for image kind - throw new Error( - 'Image kind should not be used for incremental-cache calculations.', - ); - } - case CachedRouteKind.FETCH: { - // Calculate size based on the length of the stringified data - return JSON.stringify(value.data || '').length; - } - case CachedRouteKind.APP_ROUTE: { - // Size based on the length of the body - return value.body.length; - } - case CachedRouteKind.PAGES: { - return value.html.length + JSON.stringify(value.pageData).length; - } - case CachedRouteKind.APP_PAGE: { - return value.html.length + (value.rscData?.length || 0); - } - default: { - return 0; - } - } -} - -export type { LruCacheOptions }; - -export default function createCacheStore( - options?: LruCacheOptions, -): LRUCache { - return createConfiguredCache(calculateObjectSize, options); -} diff --git a/packages/cache-handler/src/lru-cache-next-adapter/create-configured-cache.ts b/packages/cache-handler/src/lru-cache-next-adapter/create-configured-cache.ts deleted file mode 100644 index 91eb41fe..00000000 --- a/packages/cache-handler/src/lru-cache-next-adapter/create-configured-cache.ts +++ /dev/null @@ -1,56 +0,0 @@ -import { LRUCache } from 'lru-cache'; - -/** - * Configuration options for the LRU cache. - * - * @since 1.0.0 - */ -export type LruCacheOptions = { - /** - * Optional. Maximum number of items the cache can hold. - * - * @default 1000 - * - * @since 1.0.0 - */ - maxItemsNumber?: number; - /** - * Optional. Maximum size in bytes for each item in the cache. - * - * @default 104857600 // 100 Mb - * - * @since 1.0.0 - */ - maxItemSizeBytes?: number; -}; - -const MAX_ITEMS_NUMBER = 1000; -const MAX_ITEM_SIZE_BYTES = 100 * 1024 * 1024; - -const DEFAULT_OPTIONS: LruCacheOptions = { - maxItemsNumber: MAX_ITEMS_NUMBER, - maxItemSizeBytes: MAX_ITEM_SIZE_BYTES, -}; - -/** - * Creates a configured LRUCache. - * - * @param calculateSizeCallback - A callback function to calculate the size of cache items. - * - * @param options - Optional configuration options for the cache. - * - * @returns A new instance of LRUCache. - */ -export function createConfiguredCache( - calculateSizeCallback: (value: CacheValueType) => number, - { - maxItemsNumber = MAX_ITEMS_NUMBER, - maxItemSizeBytes = MAX_ITEM_SIZE_BYTES, - } = DEFAULT_OPTIONS, -): LRUCache { - return new LRUCache({ - max: maxItemsNumber, - maxSize: maxItemSizeBytes, - sizeCalculation: calculateSizeCallback, - }); -} diff --git a/packages/cache-handler/src/next-common-types.ts b/packages/cache-handler/src/next-common-types.ts index 155f68be..4ec33fb2 100644 --- a/packages/cache-handler/src/next-common-types.ts +++ b/packages/cache-handler/src/next-common-types.ts @@ -1,5 +1,4 @@ -// biome-ignore lint/style/useNodejsImportProtocol: RollupError: "OutgoingHttpHeaders" is not exported by "node:http" -import type { OutgoingHttpHeaders } from 'http'; +import type { OutgoingHttpHeaders } from 'node:http'; import type { CacheHandler, CacheHandlerContext, diff --git a/packages/cache-handler/src/utils/compose-age-estimation-fn.ts b/packages/cache-handler/src/utils/compose-age-estimation-fn.ts new file mode 100644 index 00000000..13066885 --- /dev/null +++ b/packages/cache-handler/src/utils/compose-age-estimation-fn.ts @@ -0,0 +1,60 @@ +import assert from 'node:assert/strict'; +import { MAX_INT32 } from '../constants.js'; + +type EstimateExpireAgeFunction = typeof getInitialExpireAge; + +/** + * Calculates an initial expiration age based on the stale age. + * + * By default, this function sets the expiration age to 1.5 times the stale age, + * creating a buffer period between when content becomes stale and when it expires. + * + * @param staleAge - The time in seconds when the cache entry becomes stale + * + * @returns The calculated expiration age in seconds + */ +export function getInitialExpireAge(staleAge: number): number { + return staleAge * 1.5; +} + +/** + * Creates a validated age estimation function with safety boundaries. + * + * This function wraps the provided callback function with validation to ensure + * the returned expire age is: + * 1. A positive integer + * 2. Not exceeding MAX_INT32 (2147483647) + * 3. Floored to the nearest integer + * + * @param callback - A function that calculates expire age from stale age + * @returns A validated function that safely converts stale age to expire age + * @throws Assertion error if the calculated expire age is not a positive integer + * + * @example + * ``` + * // Using default implementation (1.5x multiplier) + * const defaultEstimator = composeAgeEstimationFn(); + * const expireAge = defaultEstimator(3600); // 5400 + * + * // Using custom implementation + * const customEstimator = composeAgeEstimationFn(staleAge => staleAge * 2); + * const expireAge = customEstimator(3600); // 7200 + * ``` + */ +export function composeAgeEstimationFn( + callback = getInitialExpireAge, +): EstimateExpireAgeFunction { + return function estimateExpireAge(staleAge: number): number { + const rawExpireAge = callback(staleAge); + + const expireAge = Math.min(Math.floor(rawExpireAge), MAX_INT32); + + // Number.isInteger also checks for NaN, Infinity, -Infinity and non-numeric values. + assert( + Number.isInteger(expireAge) && expireAge > 0, + `The expire age must be a positive integer but got a ${expireAge}.`, + ); + + return expireAge; + }; +} diff --git a/packages/cache-handler/src/utils/get-tags-from-headers.ts b/packages/cache-handler/src/utils/get-tags-from-headers.ts new file mode 100644 index 00000000..f6b97ffc --- /dev/null +++ b/packages/cache-handler/src/utils/get-tags-from-headers.ts @@ -0,0 +1,35 @@ +import type { OutgoingHttpHeaders } from 'node:http'; + +/** + * Extracts cache tags from the 'x-next-cache-tags' HTTP header. + * + * This function parses cache invalidation tags from response headers, which are used + * by Next.js to manage cache revalidation. It handles both string and array header formats. + * + * @param headers - The HTTP headers object containing potential cache tags + * + * @returns An array of extracted cache tag strings, or an empty array if no tags are found + * + * @example + * // With string header + * getTagsFromHeaders({ 'x-next-cache-tags': 'tag1,tag2,tag3' }) + * // Returns: ['tag1', 'tag2', 'tag3'] + * + * @example + * // With array header + * getTagsFromHeaders({ 'x-next-cache-tags': ['tag1', 'tag2'] }) + * // Returns: ['tag1', 'tag2'] + */ +export function getTagsFromHeaders(headers: OutgoingHttpHeaders): string[] { + const tagsHeader = headers['x-next-cache-tags']; + + if (Array.isArray(tagsHeader)) { + return tagsHeader; + } + + if (typeof tagsHeader === 'string') { + return tagsHeader.split(','); + } + + return []; +} diff --git a/packages/cache-handler/test/tsconfig.json b/packages/cache-handler/test/tsconfig.json new file mode 100644 index 00000000..376c1a83 --- /dev/null +++ b/packages/cache-handler/test/tsconfig.json @@ -0,0 +1,5 @@ +{ + "$schema": "https://json.schemastore.org/tsconfig", + "extends": "@repo/typescript-config/test.json", + "include": ["**/*.test.ts", "**/*.spec.ts"] +} diff --git a/packages/cache-handler/test/utils/compose-age-estimation-fn.test.ts b/packages/cache-handler/test/utils/compose-age-estimation-fn.test.ts new file mode 100644 index 00000000..21005c3f --- /dev/null +++ b/packages/cache-handler/test/utils/compose-age-estimation-fn.test.ts @@ -0,0 +1,121 @@ +import { describe, expect, it } from 'vitest'; +import { MAX_INT32 } from '../../src/constants.js'; +import { composeAgeEstimationFn, getInitialExpireAge } from '../../src/utils/compose-age-estimation-fn.js'; + +describe('composeAgeEstimationFn', () => { + describe('valid inputs', () => { + it('returns the same age for simple callback', () => { + const estimateAge = composeAgeEstimationFn((age) => age); + const testAge = 100; + // The estimated age should be the same as the input age + expect(estimateAge(testAge)).toBe(testAge); + }); + + it('handles float by flooring', () => { + const estimateAge = composeAgeEstimationFn( + (age) => age + 0.9, + ); + const testAge = 100; + // The estimated age should be floored to the nearest integer + expect(estimateAge(testAge)).toBe(100); + }); + + it('handles numbers bigger than MAX_INT32 by returning MAX_INT32', () => { + const estimateAge = composeAgeEstimationFn( + (age) => age + MAX_INT32, + ); + // The estimated age should return MAX_INT32 for numbers bigger than MAX_INT32 + expect(estimateAge(100)).toBe(MAX_INT32); + }); + + it('handles MAX_INT32 correctly', () => { + const estimateAge = composeAgeEstimationFn( + (_age) => MAX_INT32, + ); + // The estimated age should handle MAX_INT32 correctly + expect(estimateAge(0)).toBe(MAX_INT32); + }); + + it('handles value just below MAX_INT32', () => { + const estimateAge = composeAgeEstimationFn( + (_age) => MAX_INT32 - 1, + ); + expect(estimateAge(0)).toBe(MAX_INT32 - 1); + }); + + it('handles Infinity by capping at MAX_INT32', () => { + const estimateAge = composeAgeEstimationFn( + (_age) => Number.POSITIVE_INFINITY, + ); + expect(estimateAge(100)).toBe(MAX_INT32); + }); + + it('uses default callback when none provided', () => { + const estimateAge = composeAgeEstimationFn(); + // Default multiplies by 1.5 and floors + expect(estimateAge(100)).toBe(150); + expect(estimateAge(101)).toBe(151); + }); + + it('default callback handles numbers close to MAX_INT32', () => { + // Test the getInitialExpireAge function directly + expect(getInitialExpireAge(MAX_INT32 / 1.5 - 1)).toBeLessThan(MAX_INT32); + + // Test through composeAgeEstimationFn + const estimateAge = composeAgeEstimationFn(); + const largeStaleAge = Math.floor(MAX_INT32 / 1.5) - 1; + expect(estimateAge(largeStaleAge)).toBe(Math.floor(largeStaleAge * 1.5)); + }); + }); + + describe('invalid inputs', () => { + it('throws error for negative age', () => { + const estimateAge = composeAgeEstimationFn((age) => age); + const testAge = -1; + expect(() => estimateAge(testAge)).toThrow( + 'The expire age must be a positive integer but got a -1.', + ); + }); + + it('throws error for non-integer', () => { + const estimateAge = composeAgeEstimationFn( + (age) => age + Number.NaN, + ); + expect(() => estimateAge(10)).toThrow( + 'The expire age must be a positive integer but got a NaN.', + ); + }); + + it('throws error for zero', () => { + const estimateAge = composeAgeEstimationFn((age) => age * 0); + expect(() => estimateAge(10)).toThrow( + 'The expire age must be a positive integer but got a 0.', + ); + }); + + it('throws error for non-numeric input', () => { + const estimateAge = composeAgeEstimationFn( + (_age) => 'non-numeric' as unknown as number, + ); + expect(() => estimateAge(10)).toThrow( + 'The expire age must be a positive integer but got a NaN.', + ); + }); + + it('callback throws an error', () => { + const estimateAge = composeAgeEstimationFn(() => { + throw new Error('Test error'); + }); + expect(() => estimateAge(10)).toThrow('Test error'); + }); + + it('handles negative infinity', () => { + const estimateAge = composeAgeEstimationFn( + (_age) => Number.NEGATIVE_INFINITY, + ); + expect(() => estimateAge(10)).toThrow( + 'The expire age must be a positive integer but got a -Infinity.', + ); + }); + }); +}); diff --git a/packages/cache-handler/tsconfig.json b/packages/cache-handler/tsconfig.json index c4b57012..23ce6f47 100644 --- a/packages/cache-handler/tsconfig.json +++ b/packages/cache-handler/tsconfig.json @@ -6,5 +6,5 @@ "rootDir": "src" }, "include": ["**/*.ts"], - "exclude": ["**/*.test.ts", "node_modules", "dist"] + "exclude": ["node_modules", "dist", "test", "vitest.config.ts"] } diff --git a/packages/cache-handler/vitest.config.ts b/packages/cache-handler/vitest.config.ts new file mode 100644 index 00000000..316eb22b --- /dev/null +++ b/packages/cache-handler/vitest.config.ts @@ -0,0 +1,9 @@ +import { defineConfig } from 'vitest/config'; + +export default defineConfig({ + test: { + globals: true, + environment: 'node', + include: ['**/*.test.ts'], + }, +}); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 08912bc9..239d8788 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -221,6 +221,9 @@ importers: typescript: specifier: 5.8.2 version: 5.8.2 + vitest: + specifier: 3.0.7 + version: 3.0.7(@types/debug@4.1.12)(@types/node@22.13.9)(tsx@4.19.3)(yaml@2.7.0) packages: @@ -727,6 +730,9 @@ packages: cpu: [x64] os: [win32] + '@jridgewell/sourcemap-codec@1.5.0': + resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} + '@manypkg/find-root@1.1.0': resolution: {integrity: sha512-mki5uBvhHzO8kYYix/WRy2WX8S3B5wdVSc9D6KcU5lQNglP2yt58/VfLuAK49glRXChosY8ap2oJ1qgma3GUVA==} @@ -1004,6 +1010,101 @@ packages: peerDependencies: '@redis/client': ^1.0.0 + '@rollup/rollup-android-arm-eabi@4.34.9': + resolution: {integrity: sha512-qZdlImWXur0CFakn2BJ2znJOdqYZKiedEPEVNTBrpfPjc/YuTGcaYZcdmNFTkUj3DU0ZM/AElcM8Ybww3xVLzA==} + cpu: [arm] + os: [android] + + '@rollup/rollup-android-arm64@4.34.9': + resolution: {integrity: sha512-4KW7P53h6HtJf5Y608T1ISKvNIYLWRKMvfnG0c44M6In4DQVU58HZFEVhWINDZKp7FZps98G3gxwC1sb0wXUUg==} + cpu: [arm64] + os: [android] + + '@rollup/rollup-darwin-arm64@4.34.9': + resolution: {integrity: sha512-0CY3/K54slrzLDjOA7TOjN1NuLKERBgk9nY5V34mhmuu673YNb+7ghaDUs6N0ujXR7fz5XaS5Aa6d2TNxZd0OQ==} + cpu: [arm64] + os: [darwin] + + '@rollup/rollup-darwin-x64@4.34.9': + resolution: {integrity: sha512-eOojSEAi/acnsJVYRxnMkPFqcxSMFfrw7r2iD9Q32SGkb/Q9FpUY1UlAu1DH9T7j++gZ0lHjnm4OyH2vCI7l7Q==} + cpu: [x64] + os: [darwin] + + '@rollup/rollup-freebsd-arm64@4.34.9': + resolution: {integrity: sha512-2lzjQPJbN5UnHm7bHIUKFMulGTQwdvOkouJDpPysJS+QFBGDJqcfh+CxxtG23Ik/9tEvnebQiylYoazFMAgrYw==} + cpu: [arm64] + os: [freebsd] + + '@rollup/rollup-freebsd-x64@4.34.9': + resolution: {integrity: sha512-SLl0hi2Ah2H7xQYd6Qaiu01kFPzQ+hqvdYSoOtHYg/zCIFs6t8sV95kaoqjzjFwuYQLtOI0RZre/Ke0nPaQV+g==} + cpu: [x64] + os: [freebsd] + + '@rollup/rollup-linux-arm-gnueabihf@4.34.9': + resolution: {integrity: sha512-88I+D3TeKItrw+Y/2ud4Tw0+3CxQ2kLgu3QvrogZ0OfkmX/DEppehus7L3TS2Q4lpB+hYyxhkQiYPJ6Mf5/dPg==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm-musleabihf@4.34.9': + resolution: {integrity: sha512-3qyfWljSFHi9zH0KgtEPG4cBXHDFhwD8kwg6xLfHQ0IWuH9crp005GfoUUh/6w9/FWGBwEHg3lxK1iHRN1MFlA==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm64-gnu@4.34.9': + resolution: {integrity: sha512-6TZjPHjKZUQKmVKMUowF3ewHxctrRR09eYyvT5eFv8w/fXarEra83A2mHTVJLA5xU91aCNOUnM+DWFMSbQ0Nxw==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-arm64-musl@4.34.9': + resolution: {integrity: sha512-LD2fytxZJZ6xzOKnMbIpgzFOuIKlxVOpiMAXawsAZ2mHBPEYOnLRK5TTEsID6z4eM23DuO88X0Tq1mErHMVq0A==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-loongarch64-gnu@4.34.9': + resolution: {integrity: sha512-dRAgTfDsn0TE0HI6cmo13hemKpVHOEyeciGtvlBTkpx/F65kTvShtY/EVyZEIfxFkV5JJTuQ9tP5HGBS0hfxIg==} + cpu: [loong64] + os: [linux] + + '@rollup/rollup-linux-powerpc64le-gnu@4.34.9': + resolution: {integrity: sha512-PHcNOAEhkoMSQtMf+rJofwisZqaU8iQ8EaSps58f5HYll9EAY5BSErCZ8qBDMVbq88h4UxaNPlbrKqfWP8RfJA==} + cpu: [ppc64] + os: [linux] + + '@rollup/rollup-linux-riscv64-gnu@4.34.9': + resolution: {integrity: sha512-Z2i0Uy5G96KBYKjeQFKbbsB54xFOL5/y1P5wNBsbXB8yE+At3oh0DVMjQVzCJRJSfReiB2tX8T6HUFZ2k8iaKg==} + cpu: [riscv64] + os: [linux] + + '@rollup/rollup-linux-s390x-gnu@4.34.9': + resolution: {integrity: sha512-U+5SwTMoeYXoDzJX5dhDTxRltSrIax8KWwfaaYcynuJw8mT33W7oOgz0a+AaXtGuvhzTr2tVKh5UO8GVANTxyQ==} + cpu: [s390x] + os: [linux] + + '@rollup/rollup-linux-x64-gnu@4.34.9': + resolution: {integrity: sha512-FwBHNSOjUTQLP4MG7y6rR6qbGw4MFeQnIBrMe161QGaQoBQLqSUEKlHIiVgF3g/mb3lxlxzJOpIBhaP+C+KP2A==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-linux-x64-musl@4.34.9': + resolution: {integrity: sha512-cYRpV4650z2I3/s6+5/LONkjIz8MBeqrk+vPXV10ORBnshpn8S32bPqQ2Utv39jCiDcO2eJTuSlPXpnvmaIgRA==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-win32-arm64-msvc@4.34.9': + resolution: {integrity: sha512-z4mQK9dAN6byRA/vsSgQiPeuO63wdiDxZ9yg9iyX2QTzKuQM7T4xlBoeUP/J8uiFkqxkcWndWi+W7bXdPbt27Q==} + cpu: [arm64] + os: [win32] + + '@rollup/rollup-win32-ia32-msvc@4.34.9': + resolution: {integrity: sha512-KB48mPtaoHy1AwDNkAJfHXvHp24H0ryZog28spEs0V48l3H1fr4i37tiyHsgKZJnCmvxsbATdZGBpbmxTE3a9w==} + cpu: [ia32] + os: [win32] + + '@rollup/rollup-win32-x64-msvc@4.34.9': + resolution: {integrity: sha512-AyleYRPU7+rgkMWbEh71fQlrzRfeP6SyMnRf9XX4fCdDPAJumdSBqYEcWPMzVQ4ScAl7E4oFfK0GUVn77xSwbw==} + cpu: [x64] + os: [win32] + '@shikijs/core@2.5.0': resolution: {integrity: sha512-uu/8RExTKtavlpH7XqnVYBrfBkUc20ngXiX9NSrBhOVZYv/7XQRKUyhtkeflY5QsxC0GbJThCerruZfsUaSldg==} @@ -1261,6 +1362,35 @@ packages: '@ungap/structured-clone@1.3.0': resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} + '@vitest/expect@3.0.7': + resolution: {integrity: sha512-QP25f+YJhzPfHrHfYHtvRn+uvkCFCqFtW9CktfBxmB+25QqWsx7VB2As6f4GmwllHLDhXNHvqedwhvMmSnNmjw==} + + '@vitest/mocker@3.0.7': + resolution: {integrity: sha512-qui+3BLz9Eonx4EAuR/i+QlCX6AUZ35taDQgwGkK/Tw6/WgwodSrjN1X2xf69IA/643ZX5zNKIn2svvtZDrs4w==} + peerDependencies: + msw: ^2.4.9 + vite: ^5.0.0 || ^6.0.0 + peerDependenciesMeta: + msw: + optional: true + vite: + optional: true + + '@vitest/pretty-format@3.0.7': + resolution: {integrity: sha512-CiRY0BViD/V8uwuEzz9Yapyao+M9M008/9oMOSQydwbwb+CMokEq3XVaF3XK/VWaOK0Jm9z7ENhybg70Gtxsmg==} + + '@vitest/runner@3.0.7': + resolution: {integrity: sha512-WeEl38Z0S2ZcuRTeyYqaZtm4e26tq6ZFqh5y8YD9YxfWuu0OFiGFUbnxNynwLjNRHPsXyee2M9tV7YxOTPZl2g==} + + '@vitest/snapshot@3.0.7': + resolution: {integrity: sha512-eqTUryJWQN0Rtf5yqCGTQWsCFOQe4eNz5Twsu21xYEcnFJtMU5XvmG0vgebhdLlrHQTSq5p8vWHJIeJQV8ovsA==} + + '@vitest/spy@3.0.7': + resolution: {integrity: sha512-4T4WcsibB0B6hrKdAZTM37ekuyFZt2cGbEGd2+L0P8ov15J1/HUsUaqkXEQPNAWr4BtPPe1gI+FYfMHhEKfR8w==} + + '@vitest/utils@3.0.7': + resolution: {integrity: sha512-xePVpCRfooFX3rANQjwoditoXgWb1MaFbzmGuPP59MK6i13mrnDw/yEIyJudLeW6/38mCNcwCiJIGmpDPibAIg==} + '@zeit/schemas@2.36.0': resolution: {integrity: sha512-7kjMwcChYEzMKjeex9ZFXkt1AyNov9R5HZtjBKVsmVpw7pa7ZtlCGvCBC2vnnXctaYN+aRI61HjIqeetZW5ROg==} @@ -1382,6 +1512,10 @@ packages: resolution: {integrity: sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==} engines: {node: '>= 0.4'} + assertion-error@2.0.1: + resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} + engines: {node: '>=12'} + ast-types@0.13.4: resolution: {integrity: sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==} engines: {node: '>=4'} @@ -1473,6 +1607,10 @@ packages: resolution: {integrity: sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==} engines: {node: '>= 0.8'} + cac@6.7.14: + resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} + engines: {node: '>=8'} + call-bind-apply-helpers@1.0.2: resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} engines: {node: '>= 0.4'} @@ -1499,6 +1637,10 @@ packages: ccount@2.0.1: resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} + chai@5.2.0: + resolution: {integrity: sha512-mCuXncKXk5iCLhfhwTc0izo0gtEmpz5CtG2y8GiOINBlMVS6v8TMRc5TaLWKS6692m9+dVVfzgeVxR5UxWHTYw==} + engines: {node: '>=12'} + chalk-template@0.4.0: resolution: {integrity: sha512-/ghrgmhfY8RaSdeo43hNXxpoHAtxdbskUHjPpfqUWGttFgycUhYPGx3YZBCnUCvOa7Doivn1IZec3DEGFoMgLg==} engines: {node: '>=12'} @@ -1537,6 +1679,10 @@ packages: charm@0.1.2: resolution: {integrity: sha512-syedaZ9cPe7r3hoQA9twWYKu5AIyCswN5+szkmPBe9ccdLrj4bYaCnLVPTLd2kgVRc7+zoX4tyPgRnFKCj5YjQ==} + check-error@2.1.1: + resolution: {integrity: sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==} + engines: {node: '>= 16'} + chevrotain-allstar@0.3.1: resolution: {integrity: sha512-b7g+y9A0v4mxCW1qUhf3BSVPg+/NvGErk/dOkrDaHA0nQIQGAtrOjlX//9OQtRlSCy+x9rfB5N8yC71lH1nvMw==} peerDependencies: @@ -1891,6 +2037,10 @@ packages: decode-named-character-reference@1.0.2: resolution: {integrity: sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==} + deep-eql@5.0.2: + resolution: {integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==} + engines: {node: '>=6'} + deep-extend@0.6.0: resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} engines: {node: '>=4.0.0'} @@ -2014,6 +2164,9 @@ packages: resolution: {integrity: sha512-uDn+FE1yrDzyC0pCo961B2IHbdM8y/ACZsKD4dG6WqrjV53BADjwa7D+1aom2rsNVfLyDgU/eigvlJGJ08OQ4w==} engines: {node: '>= 0.4'} + es-module-lexer@1.6.0: + resolution: {integrity: sha512-qqnD1yMU6tk/jnaMosogGySTZP8YtUgAffA9nMN+E/rjxcfRQ6IEk7IiozUjgxKoFHBGjTLnrHB/YC45r/59EQ==} + es-object-atoms@1.1.1: resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} engines: {node: '>= 0.4'} @@ -2177,6 +2330,10 @@ packages: resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==} engines: {node: '>=16.17'} + expect-type@1.2.0: + resolution: {integrity: sha512-80F22aiJ3GLyVnS/B3HzgR6RelZVumzj9jkL0Rhz4h0xYbNW9PjlQz5h3J/SShErbXBc295vseR4/MIbVmUbeA==} + engines: {node: '>=12.0.0'} + exsolve@1.0.1: resolution: {integrity: sha512-Smf0iQtkQVJLaph8r/qS8C8SWfQkaq9Q/dFcD44MLbJj6DNhlWefVuaS21SjfqOsBbjVlKtbCj6L9ekXK6EZUg==} @@ -2866,6 +3023,9 @@ packages: resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} hasBin: true + loupe@3.1.3: + resolution: {integrity: sha512-kkIp7XSkP78ZxJEsSxW3712C6teJVoeHHwgo9zJ380de7IYyJ2ISlxojcH2pC5OFLewESmnRi/+XCDIEEVyoug==} + lru-cache@11.0.2: resolution: {integrity: sha512-123qHRfJBmo2jXDbo/a5YOQrJoHF/GNQTLzQ5+IdK5pWpceK17yRc6ozlWd25FxvGKQbIUs91fDFkXmDHTKcyA==} engines: {node: 20 || >=22} @@ -2878,6 +3038,9 @@ packages: resolution: {integrity: sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==} engines: {node: '>=12'} + magic-string@0.30.17: + resolution: {integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==} + markdown-extensions@2.0.0: resolution: {integrity: sha512-o5vL7aDWatOTX8LzaS1WMoaoxIiLRQJuIKKe2wAw6IeULDHaqbiqiggmx+pKvZDb1Sj+pE46Sn1T7lCqfFtg1Q==} engines: {node: '>=16'} @@ -3393,6 +3556,10 @@ packages: pathe@2.0.3: resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} + pathval@2.0.0: + resolution: {integrity: sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==} + engines: {node: '>= 14.16'} + picocolors@1.1.1: resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} @@ -3483,6 +3650,10 @@ packages: resolution: {integrity: sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==} engines: {node: ^10 || ^12 || >=14} + postcss@8.5.3: + resolution: {integrity: sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==} + engines: {node: ^10 || ^12 || >=14} + prelude-ls@1.2.1: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} engines: {node: '>= 0.8.0'} @@ -3735,6 +3906,11 @@ packages: robust-predicates@3.0.2: resolution: {integrity: sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg==} + rollup@4.34.9: + resolution: {integrity: sha512-nF5XYqWWp9hx/LrpC8sZvvvmq0TeTjQgaZHYmAgwysT9nh8sWnZhBnM8ZyVbbJFIQBLwHDNoMqsBZBbUo4U8sQ==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + roughjs@4.6.6: resolution: {integrity: sha512-ZUz/69+SYpFN/g/lUlo2FXcIjRkSu3nDarreVdGGndHEBJ6cXPdKguS8JGxwj5HA5xIbVKSmLgr5b3AWxtRfvQ==} @@ -3861,6 +4037,9 @@ packages: resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==} engines: {node: '>= 0.4'} + siginfo@2.0.0: + resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} + signal-exit@3.0.7: resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} @@ -3939,6 +4118,12 @@ packages: sprintf-js@1.1.3: resolution: {integrity: sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==} + stackback@0.0.2: + resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} + + std-env@3.8.1: + resolution: {integrity: sha512-vj5lIj3Mwf9D79hBkltk5qmkFI+biIKWS2IBxEyEU3AX1tUf7AoL8nSazCOiiqQsGKIq01SClsKEzweu34uwvA==} + streamsearch@1.1.0: resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==} engines: {node: '>=10.0.0'} @@ -4059,6 +4244,9 @@ packages: thread-stream@3.1.0: resolution: {integrity: sha512-OqyPZ9u96VohAyMfJykzmivOrY2wfMSf3C5TtFJVgN+Hm6aj+voFhlK+kZEIv2FBh1X6Xp3DlnCOfEQ3B2J86A==} + tinybench@2.9.0: + resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} + tinyexec@0.3.2: resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==} @@ -4066,6 +4254,18 @@ packages: resolution: {integrity: sha512-qkf4trmKSIiMTs/E63cxH+ojC2unam7rJ0WrauAzpT3ECNTxGRMlaXxVbfxMUC/w0LaYk6jQ4y/nGR9uBO3tww==} engines: {node: '>=12.0.0'} + tinypool@1.0.2: + resolution: {integrity: sha512-al6n+QEANGFOMf/dmUMsuS5/r9B06uwlyNjZZql/zv8J7ybHCgoihBNORZCY2mzUuAnomQa2JdhyHKzZxPCrFA==} + engines: {node: ^18.0.0 || >=20.0.0} + + tinyrainbow@2.0.0: + resolution: {integrity: sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==} + engines: {node: '>=14.0.0'} + + tinyspy@3.0.2: + resolution: {integrity: sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q==} + engines: {node: '>=14.0.0'} + title@4.0.1: resolution: {integrity: sha512-xRnPkJx9nvE5MF6LkB5e8QJjE2FW8269wTu/LQdf7zZqBgPly0QJPf/CWAo7srj5so4yXfoLEdCFgurlpi47zg==} hasBin: true @@ -4276,6 +4476,79 @@ packages: vfile@6.0.3: resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==} + vite-node@3.0.7: + resolution: {integrity: sha512-2fX0QwX4GkkkpULXdT1Pf4q0tC1i1lFOyseKoonavXUNlQ77KpW2XqBGGNIm/J4Ows4KxgGJzDguYVPKwG/n5A==} + engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} + hasBin: true + + vite@6.2.0: + resolution: {integrity: sha512-7dPxoo+WsT/64rDcwoOjk76XHj+TqNTIvHKcuMQ1k4/SeHDaQt5GFAeLYzrimZrMpn/O6DtdI03WUjdxuPM0oQ==} + engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} + hasBin: true + peerDependencies: + '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 + jiti: '>=1.21.0' + less: '*' + lightningcss: ^1.21.0 + sass: '*' + sass-embedded: '*' + stylus: '*' + sugarss: '*' + terser: ^5.16.0 + tsx: ^4.8.1 + yaml: ^2.4.2 + peerDependenciesMeta: + '@types/node': + optional: true + jiti: + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + tsx: + optional: true + yaml: + optional: true + + vitest@3.0.7: + resolution: {integrity: sha512-IP7gPK3LS3Fvn44x30X1dM9vtawm0aesAa2yBIZ9vQf+qB69NXC5776+Qmcr7ohUXIQuLhk7xQR0aSUIDPqavg==} + engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} + hasBin: true + peerDependencies: + '@edge-runtime/vm': '*' + '@types/debug': ^4.1.12 + '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 + '@vitest/browser': 3.0.7 + '@vitest/ui': 3.0.7 + happy-dom: '*' + jsdom: '*' + peerDependenciesMeta: + '@edge-runtime/vm': + optional: true + '@types/debug': + optional: true + '@types/node': + optional: true + '@vitest/browser': + optional: true + '@vitest/ui': + optional: true + happy-dom: + optional: true + jsdom: + optional: true + vizion@2.2.1: resolution: {integrity: sha512-sfAcO2yeSU0CSPFI/DmZp3FsFE9T+8913nv1xWBOyzODv13fwkn6Vl7HqxGpkr9F608M+8SuFId3s+BlZqfXww==} engines: {node: '>=4.0'} @@ -4324,6 +4597,11 @@ packages: engines: {node: '>= 8'} hasBin: true + why-is-node-running@2.3.0: + resolution: {integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==} + engines: {node: '>=8'} + hasBin: true + wicked-good-xpath@1.3.0: resolution: {integrity: sha512-Gd9+TUn5nXdwj/hFsPVx5cuHHiF5Bwuc30jZ4+ronF1qHK5O7HD0sgmXWSEgwKquT3ClLoKPVbO6qGwVwLzvAw==} @@ -4895,6 +5173,8 @@ snapshots: '@img/sharp-win32-x64@0.33.5': optional: true + '@jridgewell/sourcemap-codec@1.5.0': {} + '@manypkg/find-root@1.1.0': dependencies: '@babel/runtime': 7.26.9 @@ -5187,6 +5467,63 @@ snapshots: dependencies: '@redis/client': 1.6.0 + '@rollup/rollup-android-arm-eabi@4.34.9': + optional: true + + '@rollup/rollup-android-arm64@4.34.9': + optional: true + + '@rollup/rollup-darwin-arm64@4.34.9': + optional: true + + '@rollup/rollup-darwin-x64@4.34.9': + optional: true + + '@rollup/rollup-freebsd-arm64@4.34.9': + optional: true + + '@rollup/rollup-freebsd-x64@4.34.9': + optional: true + + '@rollup/rollup-linux-arm-gnueabihf@4.34.9': + optional: true + + '@rollup/rollup-linux-arm-musleabihf@4.34.9': + optional: true + + '@rollup/rollup-linux-arm64-gnu@4.34.9': + optional: true + + '@rollup/rollup-linux-arm64-musl@4.34.9': + optional: true + + '@rollup/rollup-linux-loongarch64-gnu@4.34.9': + optional: true + + '@rollup/rollup-linux-powerpc64le-gnu@4.34.9': + optional: true + + '@rollup/rollup-linux-riscv64-gnu@4.34.9': + optional: true + + '@rollup/rollup-linux-s390x-gnu@4.34.9': + optional: true + + '@rollup/rollup-linux-x64-gnu@4.34.9': + optional: true + + '@rollup/rollup-linux-x64-musl@4.34.9': + optional: true + + '@rollup/rollup-win32-arm64-msvc@4.34.9': + optional: true + + '@rollup/rollup-win32-ia32-msvc@4.34.9': + optional: true + + '@rollup/rollup-win32-x64-msvc@4.34.9': + optional: true + '@shikijs/core@2.5.0': dependencies: '@shikijs/engine-javascript': 2.5.0 @@ -5520,6 +5857,46 @@ snapshots: '@ungap/structured-clone@1.3.0': {} + '@vitest/expect@3.0.7': + dependencies: + '@vitest/spy': 3.0.7 + '@vitest/utils': 3.0.7 + chai: 5.2.0 + tinyrainbow: 2.0.0 + + '@vitest/mocker@3.0.7(vite@6.2.0(@types/node@22.13.9)(tsx@4.19.3)(yaml@2.7.0))': + dependencies: + '@vitest/spy': 3.0.7 + estree-walker: 3.0.3 + magic-string: 0.30.17 + optionalDependencies: + vite: 6.2.0(@types/node@22.13.9)(tsx@4.19.3)(yaml@2.7.0) + + '@vitest/pretty-format@3.0.7': + dependencies: + tinyrainbow: 2.0.0 + + '@vitest/runner@3.0.7': + dependencies: + '@vitest/utils': 3.0.7 + pathe: 2.0.3 + + '@vitest/snapshot@3.0.7': + dependencies: + '@vitest/pretty-format': 3.0.7 + magic-string: 0.30.17 + pathe: 2.0.3 + + '@vitest/spy@3.0.7': + dependencies: + tinyspy: 3.0.2 + + '@vitest/utils@3.0.7': + dependencies: + '@vitest/pretty-format': 3.0.7 + loupe: 3.1.3 + tinyrainbow: 2.0.0 + '@zeit/schemas@2.36.0': {} abstract-logging@2.0.1: {} @@ -5658,6 +6035,8 @@ snapshots: get-intrinsic: 1.3.0 is-array-buffer: 3.0.5 + assertion-error@2.0.1: {} + ast-types@0.13.4: dependencies: tslib: 2.8.1 @@ -5746,6 +6125,8 @@ snapshots: bytes@3.0.0: {} + cac@6.7.14: {} + call-bind-apply-helpers@1.0.2: dependencies: es-errors: 1.3.0 @@ -5771,6 +6152,14 @@ snapshots: ccount@2.0.1: {} + chai@5.2.0: + dependencies: + assertion-error: 2.0.1 + check-error: 2.1.1 + deep-eql: 5.0.2 + loupe: 3.1.3 + pathval: 2.0.0 + chalk-template@0.4.0: dependencies: chalk: 4.1.2 @@ -5801,6 +6190,8 @@ snapshots: charm@0.1.2: {} + check-error@2.1.1: {} + chevrotain-allstar@0.3.1(chevrotain@11.0.3): dependencies: chevrotain: 11.0.3 @@ -6171,6 +6562,8 @@ snapshots: dependencies: character-entities: 2.0.2 + deep-eql@5.0.2: {} + deep-extend@0.6.0: {} deep-is@0.1.4: {} @@ -6345,6 +6738,8 @@ snapshots: iterator.prototype: 1.1.5 safe-array-concat: 1.1.3 + es-module-lexer@1.6.0: {} + es-object-atoms@1.1.1: dependencies: es-errors: 1.3.0 @@ -6599,6 +6994,8 @@ snapshots: signal-exit: 4.1.0 strip-final-newline: 3.0.0 + expect-type@1.2.0: {} + exsolve@1.0.1: {} extend@3.0.2: {} @@ -7383,6 +7780,8 @@ snapshots: dependencies: js-tokens: 4.0.0 + loupe@3.1.3: {} + lru-cache@11.0.2: {} lru-cache@6.0.0: @@ -7391,6 +7790,10 @@ snapshots: lru-cache@7.18.3: {} + magic-string@0.30.17: + dependencies: + '@jridgewell/sourcemap-codec': 1.5.0 + markdown-extensions@2.0.0: {} markdown-table@3.0.4: {} @@ -8276,6 +8679,8 @@ snapshots: pathe@2.0.3: {} + pathval@2.0.0: {} + picocolors@1.1.1: {} picomatch@2.3.1: {} @@ -8437,6 +8842,12 @@ snapshots: picocolors: 1.1.1 source-map-js: 1.2.1 + postcss@8.5.3: + dependencies: + nanoid: 3.3.8 + picocolors: 1.1.1 + source-map-js: 1.2.1 + prelude-ls@1.2.1: {} prettier-plugin-packagejson@2.5.10(prettier@3.5.3): @@ -8794,6 +9205,31 @@ snapshots: robust-predicates@3.0.2: {} + rollup@4.34.9: + dependencies: + '@types/estree': 1.0.6 + optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.34.9 + '@rollup/rollup-android-arm64': 4.34.9 + '@rollup/rollup-darwin-arm64': 4.34.9 + '@rollup/rollup-darwin-x64': 4.34.9 + '@rollup/rollup-freebsd-arm64': 4.34.9 + '@rollup/rollup-freebsd-x64': 4.34.9 + '@rollup/rollup-linux-arm-gnueabihf': 4.34.9 + '@rollup/rollup-linux-arm-musleabihf': 4.34.9 + '@rollup/rollup-linux-arm64-gnu': 4.34.9 + '@rollup/rollup-linux-arm64-musl': 4.34.9 + '@rollup/rollup-linux-loongarch64-gnu': 4.34.9 + '@rollup/rollup-linux-powerpc64le-gnu': 4.34.9 + '@rollup/rollup-linux-riscv64-gnu': 4.34.9 + '@rollup/rollup-linux-s390x-gnu': 4.34.9 + '@rollup/rollup-linux-x64-gnu': 4.34.9 + '@rollup/rollup-linux-x64-musl': 4.34.9 + '@rollup/rollup-win32-arm64-msvc': 4.34.9 + '@rollup/rollup-win32-ia32-msvc': 4.34.9 + '@rollup/rollup-win32-x64-msvc': 4.34.9 + fsevents: 2.3.3 + roughjs@4.6.6: dependencies: hachure-fill: 0.5.2 @@ -8984,6 +9420,8 @@ snapshots: side-channel-map: 1.0.1 side-channel-weakmap: 1.0.2 + siginfo@2.0.0: {} + signal-exit@3.0.7: {} signal-exit@4.1.0: {} @@ -9061,6 +9499,10 @@ snapshots: sprintf-js@1.1.3: {} + stackback@0.0.2: {} + + std-env@3.8.1: {} + streamsearch@1.1.0: {} string-width@4.2.3: @@ -9185,6 +9627,8 @@ snapshots: dependencies: real-require: 0.2.0 + tinybench@2.9.0: {} + tinyexec@0.3.2: {} tinyglobby@0.2.12: @@ -9192,6 +9636,12 @@ snapshots: fdir: 6.4.3(picomatch@4.0.2) picomatch: 4.0.2 + tinypool@1.0.2: {} + + tinyrainbow@2.0.0: {} + + tinyspy@3.0.2: {} + title@4.0.1: dependencies: arg: 5.0.2 @@ -9442,6 +9892,77 @@ snapshots: '@types/unist': 3.0.3 vfile-message: 4.0.2 + vite-node@3.0.7(@types/node@22.13.9)(tsx@4.19.3)(yaml@2.7.0): + dependencies: + cac: 6.7.14 + debug: 4.4.0 + es-module-lexer: 1.6.0 + pathe: 2.0.3 + vite: 6.2.0(@types/node@22.13.9)(tsx@4.19.3)(yaml@2.7.0) + transitivePeerDependencies: + - '@types/node' + - jiti + - less + - lightningcss + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + - tsx + - yaml + + vite@6.2.0(@types/node@22.13.9)(tsx@4.19.3)(yaml@2.7.0): + dependencies: + esbuild: 0.25.0 + postcss: 8.5.3 + rollup: 4.34.9 + optionalDependencies: + '@types/node': 22.13.9 + fsevents: 2.3.3 + tsx: 4.19.3 + yaml: 2.7.0 + + vitest@3.0.7(@types/debug@4.1.12)(@types/node@22.13.9)(tsx@4.19.3)(yaml@2.7.0): + dependencies: + '@vitest/expect': 3.0.7 + '@vitest/mocker': 3.0.7(vite@6.2.0(@types/node@22.13.9)(tsx@4.19.3)(yaml@2.7.0)) + '@vitest/pretty-format': 3.0.7 + '@vitest/runner': 3.0.7 + '@vitest/snapshot': 3.0.7 + '@vitest/spy': 3.0.7 + '@vitest/utils': 3.0.7 + chai: 5.2.0 + debug: 4.4.0 + expect-type: 1.2.0 + magic-string: 0.30.17 + pathe: 2.0.3 + std-env: 3.8.1 + tinybench: 2.9.0 + tinyexec: 0.3.2 + tinypool: 1.0.2 + tinyrainbow: 2.0.0 + vite: 6.2.0(@types/node@22.13.9)(tsx@4.19.3)(yaml@2.7.0) + vite-node: 3.0.7(@types/node@22.13.9)(tsx@4.19.3)(yaml@2.7.0) + why-is-node-running: 2.3.0 + optionalDependencies: + '@types/debug': 4.1.12 + '@types/node': 22.13.9 + transitivePeerDependencies: + - jiti + - less + - lightningcss + - msw + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + - tsx + - yaml + vizion@2.2.1: dependencies: async: 2.6.4 @@ -9512,6 +10033,11 @@ snapshots: dependencies: isexe: 2.0.0 + why-is-node-running@2.3.0: + dependencies: + siginfo: 2.0.0 + stackback: 0.0.2 + wicked-good-xpath@1.3.0: {} widest-line@4.0.1: From 7bb12de4ee4d280794ef60c789aa75ad26e58710 Mon Sep 17 00:00:00 2001 From: better-salmon <132773930+better-salmon@users.noreply.github.com> Date: Tue, 4 Mar 2025 23:24:19 +0300 Subject: [PATCH 07/16] Use cache --- apps/cache-testing/cache-handler-none.js | 19 + apps/cache-testing/next.config.ts | 4 + apps/cache-testing/redis.js | 3 + .../no-params/dynamic-false/[slug]/page.tsx | 4 +- .../no-params/dynamic-true/[slug]/page.tsx | 4 +- .../src/app/app/no-params/ssr/200/page.tsx | 2 +- .../src/app/app/randomHex/[length]/page.tsx | 16 +- .../with-params/dynamic-false/[slug]/page.tsx | 4 +- .../with-params/dynamic-true/[slug]/page.tsx | 4 +- .../src/utils/create-get-data.ts | 25 +- apps/cache-testing/tests/app.spec.ts | 6 +- apps/cache-testing/tests/pages.spec.ts | 2 +- packages/cache-handler/package.json | 3 +- packages/cache-handler/src/cache-handler.ts | 61 +- .../handlers/experimental-redis-cluster.ts | 4 +- .../cache-handler/src/handlers/local-lru.ts | 2 +- .../instrumentation/register-initial-cache.ts | 235 +------- .../cache-handler/src/next-common-types.ts | 5 +- packages/cache-handler/src/use-cache/redis.ts | 535 ++++++++++++++++++ .../utils/compose-age-estimation-fn.test.ts | 33 +- pnpm-lock.yaml | 8 +- 21 files changed, 652 insertions(+), 327 deletions(-) create mode 100644 apps/cache-testing/cache-handler-none.js create mode 100644 apps/cache-testing/redis.js create mode 100644 packages/cache-handler/src/use-cache/redis.ts diff --git a/apps/cache-testing/cache-handler-none.js b/apps/cache-testing/cache-handler-none.js new file mode 100644 index 00000000..d6d774c3 --- /dev/null +++ b/apps/cache-testing/cache-handler-none.js @@ -0,0 +1,19 @@ +// @ts-check + +import { CacheHandler } from '@neshca/cache-handler'; + +CacheHandler.onCreation(() => { + return { + handlers: [ + { + name: 'handler-none', + get: () => Promise.resolve(undefined), + set: () => Promise.resolve(undefined), + revalidateTag: () => Promise.resolve(undefined), + delete: () => Promise.resolve(undefined), + }, + ], + }; +}); + +export default CacheHandler; diff --git a/apps/cache-testing/next.config.ts b/apps/cache-testing/next.config.ts index b08597da..422e3519 100644 --- a/apps/cache-testing/next.config.ts +++ b/apps/cache-testing/next.config.ts @@ -15,6 +15,10 @@ const nextConfig: NextConfig = { // PPR should only be configured via the PPR_ENABLED env variable due to conditional logic in tests. ppr: process.env.PPR_ENABLED === 'true', largePageDataBytes: 1024 * 1024, // 1MB + useCache: true, + cacheHandlers: { + default: './redis.js', + }, }, }; diff --git a/apps/cache-testing/redis.js b/apps/cache-testing/redis.js new file mode 100644 index 00000000..225bf8cd --- /dev/null +++ b/apps/cache-testing/redis.js @@ -0,0 +1,3 @@ +import redis from '@neshca/cache-handler/use-cache/redis'; + +export default redis; diff --git a/apps/cache-testing/src/app/app/no-params/dynamic-false/[slug]/page.tsx b/apps/cache-testing/src/app/app/no-params/dynamic-false/[slug]/page.tsx index 5136b185..31b60f2c 100644 --- a/apps/cache-testing/src/app/app/no-params/dynamic-false/[slug]/page.tsx +++ b/apps/cache-testing/src/app/app/no-params/dynamic-false/[slug]/page.tsx @@ -5,11 +5,11 @@ import { createGetData } from 'cache-testing/utils/create-get-data'; export const dynamicParams = false; -export const revalidate = 5; +const revalidate = 5; type PageParams = { params: Promise<{ slug: string }> }; -const getData = createGetData('app/no-params/dynamic-false'); +const getData = createGetData('app/no-params/dynamic-false', revalidate); export default async function Index({ params, diff --git a/apps/cache-testing/src/app/app/no-params/dynamic-true/[slug]/page.tsx b/apps/cache-testing/src/app/app/no-params/dynamic-true/[slug]/page.tsx index d5c4c8a3..911e6626 100644 --- a/apps/cache-testing/src/app/app/no-params/dynamic-true/[slug]/page.tsx +++ b/apps/cache-testing/src/app/app/no-params/dynamic-true/[slug]/page.tsx @@ -5,11 +5,11 @@ import { createGetData } from 'cache-testing/utils/create-get-data'; export const dynamicParams = true; -export const revalidate = 5; +const revalidate = 5; type PageParams = { params: Promise<{ slug: string }> }; -const getData = createGetData('app/no-params/dynamic-true'); +const getData = createGetData('app/no-params/dynamic-true', revalidate); export default async function Index({ params, diff --git a/apps/cache-testing/src/app/app/no-params/ssr/200/page.tsx b/apps/cache-testing/src/app/app/no-params/ssr/200/page.tsx index 523e64a8..483b050c 100644 --- a/apps/cache-testing/src/app/app/no-params/ssr/200/page.tsx +++ b/apps/cache-testing/src/app/app/no-params/ssr/200/page.tsx @@ -3,7 +3,7 @@ import { notFound } from 'next/navigation'; import { CommonAppPage } from 'cache-testing/utils/common-app-page'; import { createGetData } from 'cache-testing/utils/create-get-data'; -const getData = createGetData('app/no-params/ssr', undefined, 'no-store'); +const getData = createGetData('app/no-params/ssr', 0); export default async function Index(): Promise { const data = await getData('200'); diff --git a/apps/cache-testing/src/app/app/randomHex/[length]/page.tsx b/apps/cache-testing/src/app/app/randomHex/[length]/page.tsx index e6f26554..18fe2ae5 100644 --- a/apps/cache-testing/src/app/app/randomHex/[length]/page.tsx +++ b/apps/cache-testing/src/app/app/randomHex/[length]/page.tsx @@ -1,9 +1,9 @@ -import { notFound } from 'next/navigation'; -import { Suspense } from 'react'; - import { CacheStateWatcher } from 'cache-testing/components/cache-state-watcher'; import { PreRenderedAt } from 'cache-testing/components/pre-rendered-at'; import type { RandomHexPageProps } from 'cache-testing/utils/types'; +import { unstable_cacheTag as cacheTag } from 'next/cache'; +import { notFound } from 'next/navigation'; +import { Suspense } from 'react'; const lengthSteps = new Array(5).fill(0).map((_, i) => 10 ** (i + 1)); @@ -20,17 +20,17 @@ export async function generateStaticParams(): Promise< export default async function Page({ params, }: PageParams): Promise { + 'use cache'; + const resolvedParams = await params; const { length } = resolvedParams; const path = `/randomHex/app/${length}`; + cacheTag(`/app/randomHex/${length}`); + const url = new URL(path, 'http://localhost:8081'); - const result = await fetch(url, { - next: { - tags: [`/app/randomHex/${length}`], - }, - }); + const result = await fetch(url); if (!result.ok) { notFound(); diff --git a/apps/cache-testing/src/app/app/with-params/dynamic-false/[slug]/page.tsx b/apps/cache-testing/src/app/app/with-params/dynamic-false/[slug]/page.tsx index e58b7049..4540f218 100644 --- a/apps/cache-testing/src/app/app/with-params/dynamic-false/[slug]/page.tsx +++ b/apps/cache-testing/src/app/app/with-params/dynamic-false/[slug]/page.tsx @@ -7,9 +7,9 @@ type PageParams = { params: Promise<{ slug: string }> }; export const dynamicParams = false; -export const revalidate = 5; +const revalidate = 5; -const getData = createGetData('app/with-params/dynamic-false'); +const getData = createGetData('app/with-params/dynamic-false', revalidate); export function generateStaticParams(): Promise< { diff --git a/apps/cache-testing/src/app/app/with-params/dynamic-true/[slug]/page.tsx b/apps/cache-testing/src/app/app/with-params/dynamic-true/[slug]/page.tsx index 10124bab..2040e1ff 100644 --- a/apps/cache-testing/src/app/app/with-params/dynamic-true/[slug]/page.tsx +++ b/apps/cache-testing/src/app/app/with-params/dynamic-true/[slug]/page.tsx @@ -7,9 +7,9 @@ type PageParams = { params: Promise<{ slug: string }> }; export const dynamicParams = true; -export const revalidate = 5; +const revalidate = 5; -const getData = createGetData('app/with-params/dynamic-true'); +const getData = createGetData('app/with-params/dynamic-true', revalidate); export function generateStaticParams(): Promise< { diff --git a/apps/cache-testing/src/utils/create-get-data.ts b/apps/cache-testing/src/utils/create-get-data.ts index ffd44f9e..0268bb3b 100644 --- a/apps/cache-testing/src/utils/create-get-data.ts +++ b/apps/cache-testing/src/utils/create-get-data.ts @@ -1,24 +1,27 @@ +import { + unstable_cacheLife as cacheLife, + unstable_cacheTag as cacheTag, +} from 'next/cache'; import { normalizeSlug } from './normalize-slug'; import type { CountBackendApiResponseJson, PageProps } from './types'; -export function createGetData( - path: string, - revalidate?: number, - cache?: RequestCache, -) { +export function createGetData(path: string, revalidate?: number) { return async function getData( slug: string, ): Promise | null> { + 'use cache'; + const pathAndTag = `/${path}/${normalizeSlug(slug)}`; - const url = new URL(`/count${pathAndTag}`, 'http://localhost:8081'); + cacheLife({ + revalidate, + }); - const tags = [pathAndTag, 'whole-app-route']; + cacheTag(pathAndTag, 'whole-app-route'); - const result = await fetch(url, { - cache, - next: { revalidate, tags }, - }); + const url = new URL(`/count${pathAndTag}`, 'http://localhost:8081'); + + const result = await fetch(url); if (!result.ok) { return null; diff --git a/apps/cache-testing/tests/app.spec.ts b/apps/cache-testing/tests/app.spec.ts index 75e11d87..9d0868e8 100644 --- a/apps/cache-testing/tests/app.spec.ts +++ b/apps/cache-testing/tests/app.spec.ts @@ -141,7 +141,7 @@ test.describe('On-demand revalidation', () => { test.describe('Time-based revalidation', () => { for (const path of paths) { - test(`Page should be fresh after becoming stale and reloaded twice ${path}`, async ({ + test(`Page should be fresh after becoming stale and reloaded ${path}`, async ({ page, baseURL, }) => { @@ -166,10 +166,6 @@ test.describe('Time-based revalidation', () => { await page.reload(); - await expect(page.getByTestId('data')).toHaveText(pageValue); - - await page.reload(); - await expect(page.getByTestId('data')).not.toHaveText(pageValue); }); } diff --git a/apps/cache-testing/tests/pages.spec.ts b/apps/cache-testing/tests/pages.spec.ts index 6e84f87e..1173f049 100644 --- a/apps/cache-testing/tests/pages.spec.ts +++ b/apps/cache-testing/tests/pages.spec.ts @@ -3,7 +3,7 @@ import { expect, test } from '@playwright/test'; const paths = [ '/pages/with-paths/fallback-blocking/200', - '/pages/with-paths/fallback-true/200', + // '/pages/with-paths/fallback-true/200', '/pages/with-paths/fallback-false/200', '/pages/no-paths/fallback-blocking/200', '/pages/no-paths/fallback-true/200', diff --git a/packages/cache-handler/package.json b/packages/cache-handler/package.json index f034317c..a6d3c60e 100644 --- a/packages/cache-handler/package.json +++ b/packages/cache-handler/package.json @@ -26,7 +26,8 @@ ".": "./dist/cache-handler.js", "./helpers/*": "./dist/helpers/*.js", "./handlers/*": "./dist/handlers/*.js", - "./instrumentation/*": "./dist/instrumentation/*.js" + "./instrumentation/*": "./dist/instrumentation/*.js", + "./use-cache/*": "./dist/use-cache/*.js" }, "scripts": { "build": "tsc", diff --git a/packages/cache-handler/src/cache-handler.ts b/packages/cache-handler/src/cache-handler.ts index f81648a6..1d592465 100644 --- a/packages/cache-handler/src/cache-handler.ts +++ b/packages/cache-handler/src/cache-handler.ts @@ -3,7 +3,6 @@ import path from 'node:path'; import type { CacheHandlerParametersGet, - CacheHandlerParametersRevalidateTag, CacheHandlerParametersSet, CacheHandlerValue, FileSystemCacheContext, @@ -13,10 +12,9 @@ import type { PrerenderManifest, Revalidate, } from './next-common-types.js'; -import { CachedRouteKind } from './next-common-types.js'; +import { CachedRouteKind, IncrementalCacheKind } from './next-common-types.js'; import { composeAgeEstimationFn } from './utils/compose-age-estimation-fn.js'; -import { getTagsFromHeaders } from './utils/get-tags-from-headers.js'; export type { CacheHandlerValue }; @@ -830,9 +828,11 @@ export class CacheHandler implements NextCacheHandler { cacheKey: CacheHandlerParametersGet[0], ctx: CacheHandlerParametersGet[1], ): Promise { - await CacheHandler.#configureCacheHandler(); + if (ctx?.kind !== IncrementalCacheKind.PAGES) { + return null; + } - const { softTags = [] } = ctx; + await CacheHandler.#configureCacheHandler(); if (CacheHandler.#debug) { console.info( @@ -845,7 +845,7 @@ export class CacheHandler implements NextCacheHandler { let cachedData: CacheHandlerValue | null | undefined = await CacheHandler.#mergedHandler.get(cacheKey, { - implicitTags: softTags, + implicitTags: [], }); if (!cachedData && CacheHandler.#fallbackFalseRoutes.has(cacheKey)) { @@ -865,6 +865,10 @@ export class CacheHandler implements NextCacheHandler { incrementalCacheValue: CacheHandlerParametersSet[1], ctx: CacheHandlerParametersSet[2] & { neshca_lastModified?: number }, ): Promise { + if (incrementalCacheValue?.kind !== CachedRouteKind.PAGES) { + return; + } + await CacheHandler.#configureCacheHandler(); if (CacheHandler.#debug) { @@ -876,7 +880,7 @@ export class CacheHandler implements NextCacheHandler { ); } - const { revalidate, tags = [], neshca_lastModified } = ctx; + const { revalidate, neshca_lastModified } = ctx; const lastModified = Math.round(neshca_lastModified ?? Date.now()); @@ -891,30 +895,16 @@ export class CacheHandler implements NextCacheHandler { return; } - let cacheHandlerValueTags = tags; - - if ( - incrementalCacheValue?.kind === CachedRouteKind.PAGES || - incrementalCacheValue?.kind === CachedRouteKind.APP_PAGE - ) { - cacheHandlerValueTags = getTagsFromHeaders( - incrementalCacheValue.headers ?? {}, - ); - } - - const cacheHandlerValue: CacheHandlerValue = { + const cacheHandlerValue = { lastModified, lifespan, - tags: Object.freeze(cacheHandlerValueTags), + tags: [], value: incrementalCacheValue, - }; + } as const; await CacheHandler.#mergedHandler.set(cacheKey, cacheHandlerValue); - if ( - hasFallbackFalse && - cacheHandlerValue.value?.kind === CachedRouteKind.PAGES - ) { + if (hasFallbackFalse) { await CacheHandler.#writePagesRouterPage( cacheKey, cacheHandlerValue.value, @@ -922,25 +912,8 @@ export class CacheHandler implements NextCacheHandler { } } - async revalidateTag( - tag: CacheHandlerParametersRevalidateTag[0], - ): Promise { - await CacheHandler.#configureCacheHandler(); - - const tags = typeof tag === 'string' ? [tag] : tag; - - if (CacheHandler.#debug) { - console.info( - '[CacheHandler] [method: %s] [tags: [%s]] %s', - 'revalidateTag', - tags.join(', '), - 'Started revalidating tag in parallel.', - ); - } - - for (const tag of tags) { - await CacheHandler.#mergedHandler.revalidateTag(tag); - } + async revalidateTag(): Promise { + // not implemented yet } resetRequestCache(): void { diff --git a/packages/cache-handler/src/handlers/experimental-redis-cluster.ts b/packages/cache-handler/src/handlers/experimental-redis-cluster.ts index 9d8a51f1..70bc604e 100644 --- a/packages/cache-handler/src/handlers/experimental-redis-cluster.ts +++ b/packages/cache-handler/src/handlers/experimental-redis-cluster.ts @@ -1,7 +1,7 @@ -import type { CacheHandlerValue, Handler } from '../cache-handler.js'; -import type { CreateRedisStringsHandlerOptions } from '../common-types.js'; import calculate from 'cluster-key-slot'; import type { createCluster } from 'redis'; +import type { CacheHandlerValue, Handler } from '../cache-handler.js'; +import type { CreateRedisStringsHandlerOptions } from '../common-types.js'; import { REVALIDATED_TAGS_KEY } from '../constants.js'; import { createRedisTimeoutConfig } from '../helpers/create-redis-timeout-config.js'; diff --git a/packages/cache-handler/src/handlers/local-lru.ts b/packages/cache-handler/src/handlers/local-lru.ts index 3bca2a5f..2a486d86 100644 --- a/packages/cache-handler/src/handlers/local-lru.ts +++ b/packages/cache-handler/src/handlers/local-lru.ts @@ -1,10 +1,10 @@ +import { LRUCache } from 'lru-cache'; import type { Handler } from '../cache-handler.js'; import { NEXT_CACHE_IMPLICIT_TAG_ID } from '../next-common-types.js'; import { type CacheHandlerValue, CachedRouteKind, } from '../next-common-types.js'; -import { LRUCache } from 'lru-cache'; function calculateObjectSize({ value }: CacheHandlerValue): number { // Return default size if value is falsy diff --git a/packages/cache-handler/src/instrumentation/register-initial-cache.ts b/packages/cache-handler/src/instrumentation/register-initial-cache.ts index c14395fc..53cab4a8 100644 --- a/packages/cache-handler/src/instrumentation/register-initial-cache.ts +++ b/packages/cache-handler/src/instrumentation/register-initial-cache.ts @@ -1,15 +1,8 @@ import { promises as fsPromises } from 'node:fs'; import path from 'node:path'; -import { getTagsFromHeaders } from '../utils/get-tags-from-headers.js'; -import { - type CachedFetchValue, - CachedRouteKind, - type Revalidate, - type RouteMetadata, -} from '../next-common-types.js'; import { PRERENDER_MANIFEST, SERVER_DIRECTORY } from 'next/constants.js'; import type { PrerenderManifest } from 'next/dist/build/index.js'; -import { CACHE_ONE_YEAR } from 'next/dist/lib/constants.js'; +import { CachedRouteKind, type Revalidate } from '../next-common-types.js'; type CacheHandlerType = typeof import('../cache-handler.js').CacheHandler; @@ -23,14 +16,6 @@ const PRERENDER_MANIFEST_VERSION = 4; * @since 1.7.0 */ export type RegisterInitialCacheOptions = { - /** - * Whether to populate the cache with fetch calls. - * - * @default true - * - * @since 1.7.0 - */ - fetch?: boolean; /** * Whether to populate the cache with pre-rendered pages. * @@ -39,14 +24,6 @@ export type RegisterInitialCacheOptions = { * @since 1.7.0 */ pages?: boolean; - /** - * Whether to populate the cache with routes. - * - * @default true - * - * @since 1.7.0 - */ - routes?: boolean; }; /** @@ -92,11 +69,8 @@ export async function registerInitialCache( const nextJsPath = path.join(process.cwd(), '.next'); const prerenderManifestPath = path.join(nextJsPath, PRERENDER_MANIFEST); const serverDistDir = path.join(nextJsPath, SERVER_DIRECTORY); - const fetchCacheDir = path.join(nextJsPath, 'cache', 'fetch-cache'); - const populateFetch = options.fetch ?? true; const populatePages = options.pages ?? true; - const populateRoutes = options.routes ?? true; let prerenderManifest: PrerenderManifest | undefined; @@ -149,87 +123,6 @@ export async function registerInitialCache( return; } - async function setRouteCache( - cachePath: string, - router: Router, - revalidate: Revalidate, - ) { - const pathToRouteFiles = path.join(serverDistDir, router, cachePath); - - let lastModified: number | undefined; - - try { - const stats = await fsPromises.stat(`${pathToRouteFiles}.body`); - lastModified = stats.mtimeMs; - } catch (error) { - if (debug) { - console.warn( - '[CacheHandler] [%s] %s %s', - 'registerInitialCache', - 'Failed to read route body file', - `Error: ${error}`, - ); - } - - return; - } - - let body: Buffer; - let meta: RouteMetadata; - - try { - [body, meta] = await Promise.all([ - fsPromises.readFile(`${pathToRouteFiles}.body`), - fsPromises - .readFile(`${pathToRouteFiles}.meta`, 'utf-8') - .then((data) => JSON.parse(data) as RouteMetadata), - ]); - - if (!(meta.headers && meta.status)) { - throw new Error('Invalid route metadata. Missing headers or status.'); - } - } catch (error) { - if (debug) { - console.warn( - '[CacheHandler] [%s] %s %s', - 'registerInitialCache', - 'Failed to read route body or metadata file, or parse metadata', - `Error: ${error}`, - ); - } - - return; - } - - try { - await cacheHandler.set( - cachePath, - { - kind: CachedRouteKind.APP_ROUTE, - body, - headers: meta.headers, - status: meta.status, - }, - { - revalidate, - neshca_lastModified: lastModified, - tags: getTagsFromHeaders(meta.headers), - }, - ); - } catch (error) { - if (debug) { - console.warn( - '[CacheHandler] [%s] %s %s', - 'registerInitialCache', - 'Failed to set route cache. Please check if the CacheHandler is configured correctly', - `Error: ${error}`, - ); - } - - return; - } - } - async function setPageCache( cachePath: string, router: Router, @@ -237,8 +130,6 @@ export async function registerInitialCache( ) { const pathToRouteFiles = path.join(serverDistDir, router, cachePath); - const isAppRouter = router === 'app'; - let lastModified: number | undefined; try { @@ -258,22 +149,13 @@ export async function registerInitialCache( let html: string | undefined; let pageData: string | object | undefined; - let meta: RouteMetadata | undefined; try { - [html, pageData, meta] = await Promise.all([ + [html, pageData] = await Promise.all([ fsPromises.readFile(`${pathToRouteFiles}.html`, 'utf-8'), fsPromises - .readFile( - `${pathToRouteFiles}.${isAppRouter ? 'rsc' : 'json'}`, - 'utf-8', - ) - .then((data) => (isAppRouter ? data : (JSON.parse(data) as object))), - isAppRouter - ? fsPromises - .readFile(`${pathToRouteFiles}.meta`, 'utf-8') - .then((data) => JSON.parse(data) as RouteMetadata) - : undefined, + .readFile(`${pathToRouteFiles}.json`, 'utf-8') + .then((data) => JSON.parse(data) as object), ]); } catch (error) { if (debug) { @@ -289,19 +171,17 @@ export async function registerInitialCache( } try { - if (!isAppRouter) { - await cacheHandler.set( - cachePath, - { - kind: CachedRouteKind.PAGES, - html, - pageData, - headers: meta?.headers, - status: meta?.status, - }, - { revalidate, neshca_lastModified: lastModified }, - ); - } + await cacheHandler.set( + cachePath, + { + kind: CachedRouteKind.PAGES, + html, + pageData, + headers: undefined, + status: undefined, + }, + { revalidate, neshca_lastModified: lastModified }, + ); } catch (error) { if (debug) { console.warn( @@ -322,91 +202,6 @@ export async function registerInitialCache( ] of Object.entries(prerenderManifest.routes)) { if (populatePages && dataRoute?.endsWith('.json')) { await setPageCache(cachePath, 'pages', initialRevalidateSeconds); - } else if (populatePages && dataRoute?.endsWith('.rsc')) { - await setPageCache(cachePath, 'app', initialRevalidateSeconds); - } else if (populateRoutes && dataRoute === null) { - await setRouteCache(cachePath, 'app', initialRevalidateSeconds); - } - } - - if (!populateFetch) { - return; - } - - let fetchFiles: string[]; - - try { - fetchFiles = await fsPromises.readdir(fetchCacheDir); - } catch (error) { - if (debug) { - console.warn( - '[CacheHandler] [%s] %s %s', - 'registerInitialCache', - 'Failed to read cache/fetch-cache directory', - `Error: ${error}`, - ); - } - - return; - } - - for (const fetchCacheKey of fetchFiles) { - const filePath = path.join(fetchCacheDir, fetchCacheKey); - - let lastModified: number | undefined; - - try { - const stats = await fsPromises.stat(filePath); - lastModified = stats.mtimeMs; - } catch (error) { - if (debug) { - console.warn( - '[CacheHandler] [%s] %s %s', - 'registerInitialCache', - 'Failed to read fetch cache file', - `Error: ${error}`, - ); - } - return; - } - - let fetchCache: CachedFetchValue; - try { - fetchCache = await fsPromises - .readFile(filePath, 'utf-8') - .then((data) => JSON.parse(data) as CachedFetchValue); - } catch (error) { - if (debug) { - console.warn( - '[CacheHandler] [%s] %s %s', - 'registerInitialCache', - 'Failed to parse fetch cache file', - `Error: ${error}`, - ); - } - - return; - } - - // HACK: By default, Next.js sets the revalidate option to CACHE_ONE_YEAR if the revalidate option is set - const revalidate = - fetchCache.revalidate === CACHE_ONE_YEAR ? false : fetchCache.revalidate; - - try { - await cacheHandler.set(fetchCacheKey, fetchCache, { - revalidate, - neshca_lastModified: lastModified, - tags: fetchCache.tags, - }); - } catch (error) { - if (debug) { - console.warn( - '[CacheHandler] [%s] %s %s', - 'registerInitialCache', - 'Failed to set fetch cache. Please check if the CacheHandler is configured correctly', - `Error: ${error}`, - ); - } } } } diff --git a/packages/cache-handler/src/next-common-types.ts b/packages/cache-handler/src/next-common-types.ts index 4ec33fb2..dda4b7e6 100644 --- a/packages/cache-handler/src/next-common-types.ts +++ b/packages/cache-handler/src/next-common-types.ts @@ -20,7 +20,10 @@ export type { IncrementalCacheEntry, } from 'next/dist/server/response-cache/types.js'; -export { CachedRouteKind } from 'next/dist/server/response-cache/types.js'; +export { + CachedRouteKind, + IncrementalCacheKind, +} from 'next/dist/server/response-cache/types.js'; export type NextRouteMetadata = { status: number | undefined; diff --git a/packages/cache-handler/src/use-cache/redis.ts b/packages/cache-handler/src/use-cache/redis.ts new file mode 100644 index 00000000..d1c79c54 --- /dev/null +++ b/packages/cache-handler/src/use-cache/redis.ts @@ -0,0 +1,535 @@ +import type { + CacheEntry, + CacheHandler, +} from 'next/dist/server/lib/cache-handlers/types.js'; +import { + isTagStale, + tagsManifest as localTagsManifest, +} from 'next/dist/server/lib/incremental-cache/tags-manifest.external.js'; + +import { type RedisClientOptions, createClient } from 'redis'; + +/** + * Configuration options for the Redis cache handler + */ +type RedisConfig = { + /** + * Redis connection URL (defaults to 'redis://localhost:6379') + */ + url?: string; + /** + * Prefix for all Redis keys (defaults to 'neshca:') + */ + keyPrefix?: string; + /** + * Pub/Sub channel name for tag invalidations (defaults to 'neshca:tag-invalidations') + */ + tagChannel?: string; + /** + * Redis connection options passed directly to the Redis client + */ + clientOptions?: RedisClientOptions; + /** + * Multiplier for revalidate time when calculating cache expiration (defaults to 2) + */ + revalidateTimeMultiplier?: number; + /** + * Default expiration time in seconds when revalidate time is not available (defaults to 60) + */ + defaultExpirationSeconds?: number; + /** + * Minimum expiration time in seconds (defaults to 1) + */ + minimumExpirationSeconds?: number; +}; + +/** + * Default configuration values for the Redis cache handler + */ +const DEFAULT_CONFIG: RedisConfig = { + url: 'redis://localhost:6379', + keyPrefix: 'neshca:', + tagChannel: 'neshca:tag-invalidations', + revalidateTimeMultiplier: 2, + defaultExpirationSeconds: 60, + minimumExpirationSeconds: 1, +}; + +/** + * Key name for storing tags in Redis + */ +const TAGS_KEY = 'tags'; + +/** + * Message format for tag invalidation events published to Redis + */ +type TagInvalidationMessage = { + /** + * Array of tags to invalidate + */ + tags: string[]; + /** + * Timestamp when the invalidation occurred + */ + timestamp: number; +}; + +/** + * Internal representation of a cache entry with error handling metadata + */ +type PrivateCacheEntry = { + /** + * The actual cache entry + */ + entry: CacheEntry; + + /** + * Flag indicating if this entry resulted from an error + * + * For the default cache we store errored cache + * entries and allow them to be used up to 3 times + * after that we want to dispose it and try for fresh + * + * If an entry is errored we return no entry + * three times so that we retry hitting origin (MISS) + * and then if it still fails to set after the third we + * return the errored content and use expiration of + * Math.min(30, entry.expiration) + */ + isErrored: boolean; + + /** + * Count of retry attempts for errored entries + */ + errorRetryCount: number; +}; + +/** + * Modified cache entry type for storage in Redis + * Converts the ReadableStream value to a string for storage + */ +type StorageCacheEntry = Omit & { + /** + * Base64-encoded string representation of the original value + */ + value: string; +}; + +/** + * Map to track pending cache set operations + */ +const pendingSets = new Map>(); + +/** + * Creates a Redis-based cache handler for Next.js + * + * @param config - Configuration options for Redis + * @returns A CacheHandler implementation using Redis for storage and invalidation + */ +function createRedisCacheHandler(config: RedisConfig = {}) { + // Merge default config with provided config + const mergedConfig = { ...DEFAULT_CONFIG, ...config }; + const { + url, + keyPrefix, + tagChannel, + clientOptions, + revalidateTimeMultiplier = 2, + defaultExpirationSeconds = 60, + minimumExpirationSeconds = 1, + } = mergedConfig; + + // Create main Redis client + const redisConnection = createClient({ + url, + ...clientOptions, + }); + + // Create separate subscriber client for pub/sub + // (Redis requires a dedicated connection for pub/sub) + const subscriberConnection = createClient({ + url, + ...clientOptions, + }); + + // Connect both clients + const connectionPromise: Promise> = + redisConnection.connect().then((client) => { + return client; + }); + + /** + * Generates a fully-qualified Redis key with the configured prefix + * + * @param key - The base key + * @returns The key with prefix applied + */ + const getKey = (key: string) => `${keyPrefix}${key}`; + + /** + * Gets the fully-qualified Redis key for storing tags + * + * @returns The tags key with prefix applied + */ + const getTagsKey = () => getKey(TAGS_KEY); + + // Initialize by loading tags from Redis and setting up subscriber + const initializePromise = (async () => { + try { + // Connect subscriber + await subscriberConnection.connect(); + + // Load existing tags from Redis + await loadTagsFromRedis(); + + // Subscribe to tag invalidation channel + if (tagChannel) { + await subscriberConnection.subscribe(tagChannel, handleTagInvalidation); + } + + // Use logger in production instead of console + console.info('Redis cache handler initialized with pub/sub'); + } catch (error) { + console.error('Failed to initialize Redis cache handler:', error); + + // Attempt reconnection for subscriber + subscriberConnection.on('error', handleRedisError); + subscriberConnection.on('reconnecting', handleRedisReconnecting); + subscriberConnection.on('ready', handleRedisReady); + } + })(); + + /** + * Loads tags from Redis into the local tags manifest + * Called during initialization and after reconnection + */ + async function loadTagsFromRedis() { + try { + const redisClient = await connectionPromise; + if (!redisClient?.isReady) { + return; + } + + const tagsData = await redisClient.hGetAll(getTagsKey()); + + // Reset local cache + for (const key of Object.keys(localTagsManifest.items)) { + delete localTagsManifest.items[key]; + } + + // Update local cache from Redis data + for (const [tag, timestampStr] of Object.entries(tagsData)) { + try { + const timestamp = Number.parseInt(timestampStr, 10); + if (!Number.isNaN(timestamp)) { + localTagsManifest.items[tag] = { revalidatedAt: timestamp }; + } + } catch (err) { + console.error(`Failed to parse tag timestamp for ${tag}:`, err); + } + } + } catch (error) { + console.error('Failed to load tags from Redis:', error); + } + } + + /** + * Handles tag invalidation messages from the Redis pub/sub channel + * Updates the local tags manifest with the received invalidation data + * + * @param message - JSON string containing tag invalidation information + */ + function handleTagInvalidation(message: string) { + try { + const invalidation: TagInvalidationMessage = JSON.parse(message); + + // Update local tagsManifest with the received tags + for (const tag of invalidation.tags) { + if (!localTagsManifest.items[tag]) { + localTagsManifest.items[tag] = {}; + } + localTagsManifest.items[tag].revalidatedAt = invalidation.timestamp; + } + } catch (error) { + console.error('Failed to process tag invalidation message:', error); + } + } + + /** + * Handles Redis connection errors + * + * @param error - The error that occurred + */ + function handleRedisError(error: Error) { + console.error('Redis connection error:', error); + } + + /** + * Handles Redis reconnection attempts + */ + function handleRedisReconnecting() { + console.info('Redis reconnecting...'); + } + + /** + * Handles successful Redis reconnection + * Reloads tags and resubscribes to the pub/sub channel + */ + function handleRedisReady() { + console.info('Redis connection reestablished'); + // Reload tags and resubscribe after reconnection + loadTagsFromRedis().then(() => { + if (tagChannel) { + subscriberConnection.subscribe(tagChannel, handleTagInvalidation); + } + }); + } + + /** + * The Redis-based cache handler implementation + */ + const DefaultCacheHandler: CacheHandler = { + /** + * Retrieves a cache entry from Redis + * + * @param cacheKey - The key to look up + * @param softTags - Optional tags for soft validation + * @returns The cache entry if found and valid, undefined otherwise + */ + async get(cacheKey, softTags) { + // Ensure initialization is complete + await initializePromise; + await pendingSets.get(cacheKey); + + const redisClient = await connectionPromise; + + if (!redisClient?.isReady) { + return undefined; + } + + try { + const privateEntryJson = await redisClient.get(getKey(cacheKey)); + + if (!privateEntryJson) { + return undefined; + } + + const privateEntry: PrivateCacheEntry = JSON.parse(privateEntryJson); + const entry = privateEntry.entry; + + // Restore the ReadableStream from base64 string + if (typeof entry.value === 'string') { + const buffer = Buffer.from(entry.value, 'base64'); + entry.value = new ReadableStream({ + start(controller) { + controller.enqueue(new Uint8Array(buffer)); + controller.close(); + }, + }); + } + + if ( + performance.timeOrigin + performance.now() > + entry.timestamp + entry.revalidate * 1000 + ) { + // Cache entries should expire after revalidate time + return undefined; + } + + if ( + isTagStale(entry.tags, entry.timestamp) || + isTagStale(softTags, entry.timestamp) + ) { + return undefined; + } + const [returnStream, newSaved] = entry.value.tee(); + entry.value = newSaved; + + return { + ...entry, + value: returnStream, + }; + } catch (error) { + console.error('Error retrieving cache entry:', error); + return undefined; + } + }, + + /** + * Stores a cache entry in Redis + * + * @param cacheKey - The key to store the entry under + * @param pendingEntry - Promise resolving to the entry to store + */ + async set(cacheKey, pendingEntry) { + // Ensure initialization is complete + await initializePromise; + + let resolvePending: () => void = () => { + // + }; + + const pendingPromise = new Promise((resolve) => { + resolvePending = resolve; + }); + + pendingSets.set(cacheKey, pendingPromise); + + const redisClient = await connectionPromise; + + if (!redisClient?.isReady) { + resolvePending(); + pendingSets.delete(cacheKey); + return; + } + + try { + const entry = await pendingEntry; + + try { + const [value, clonedValue] = entry.value.tee(); + entry.value = value; + const reader = clonedValue.getReader(); + + const chunks: Buffer[] = []; + // biome-ignore lint/suspicious/noAssignInExpressions: + // biome-ignore lint/suspicious/noImplicitAnyLet: + // biome-ignore lint/suspicious/noEvolvingTypes: + for (let chunk; !(chunk = await reader.read()).done; ) { + const buffer = Buffer.from(chunk.value); + chunks.push(buffer); + } + + // Combine all chunks into a single buffer and convert to base64 + const fullBuffer = Buffer.concat( + chunks.map((chunk) => Buffer.from(chunk)), + ); + + // Replace the ReadableStream with the base64 string for storage + const storageEntry: StorageCacheEntry = { + ...entry, + value: fullBuffer.toString('base64'), + }; + + const privateEntry: PrivateCacheEntry = { + entry: storageEntry as unknown as CacheEntry, + isErrored: false, + errorRetryCount: 0, + }; + + console.info( + 'entry.expire, entry.revalidate, entry.stale', + entry.expire, + entry.revalidate, + entry.stale, + ); + + // Store in Redis with an expiration + await redisClient.set( + getKey(cacheKey), + JSON.stringify(privateEntry), + { + EXAT: + Math.floor(Date.now() / 1000) + + Math.max( + minimumExpirationSeconds, + Math.floor( + entry.revalidate * revalidateTimeMultiplier || + defaultExpirationSeconds, + ), + ), + }, + ); + } catch (error) { + console.error('Error setting cache entry:', error); + } finally { + resolvePending(); + pendingSets.delete(cacheKey); + } + } catch (_error) { + resolvePending(); + pendingSets.delete(cacheKey); + } + }, + + /** + * Invalidates tags by updating their timestamps in Redis and broadcasting the change + * + * @param tags - The tags to invalidate + */ + async expireTags(...tags) { + // Ensure initialization is complete + await initializePromise; + + if (tags.length === 0) { + return; + } + + const timestamp = Date.now(); + const redisClient = await connectionPromise; + + if (!redisClient?.isReady) { + // Fallback to local update if Redis is not available + for (const tag of tags) { + if (!localTagsManifest.items[tag]) { + localTagsManifest.items[tag] = {}; + } + localTagsManifest.items[tag].revalidatedAt = timestamp; + } + return; + } + + try { + // Create a hash of tag-timestamp pairs + const tagUpdates: Record = {}; + + // Build the hash of updates + for (const tag of tags) { + tagUpdates[tag] = timestamp.toString(10); + + // Also update local cache + localTagsManifest.items[tag] ??= {}; + localTagsManifest.items[tag].revalidatedAt = timestamp; + } + + // Use hSet with multiple fields (equivalent to hmset in newer Redis clients) + await redisClient.hSet(getTagsKey(), tagUpdates); + + // Publish invalidation event + const message: TagInvalidationMessage = { + tags, + timestamp, + }; + + if (tagChannel) { + await redisClient.publish(tagChannel, JSON.stringify(message)); + } + } catch (error) { + console.error('Failed to expire tags:', error); + } + }, + + /** + * Handles tag invalidation received from another source + * Simply delegates to expireTags + * + * @param tags - The tags to mark as invalidated + */ + async receiveExpiredTags(...tags): Promise { + // Just delegate to expireTags which handles both local and distributed invalidation + return await this.expireTags(...tags); + }, + }; + + return DefaultCacheHandler; +} + +/** + * Default Redis cache handler with standard configuration + */ +export default createRedisCacheHandler(); + +/** + * Factory function for creating a Redis cache handler with custom configuration + */ +export { createRedisCacheHandler }; diff --git a/packages/cache-handler/test/utils/compose-age-estimation-fn.test.ts b/packages/cache-handler/test/utils/compose-age-estimation-fn.test.ts index 21005c3f..c49ac29a 100644 --- a/packages/cache-handler/test/utils/compose-age-estimation-fn.test.ts +++ b/packages/cache-handler/test/utils/compose-age-estimation-fn.test.ts @@ -1,6 +1,9 @@ import { describe, expect, it } from 'vitest'; import { MAX_INT32 } from '../../src/constants.js'; -import { composeAgeEstimationFn, getInitialExpireAge } from '../../src/utils/compose-age-estimation-fn.js'; +import { + composeAgeEstimationFn, + getInitialExpireAge, +} from '../../src/utils/compose-age-estimation-fn.js'; describe('composeAgeEstimationFn', () => { describe('valid inputs', () => { @@ -12,34 +15,26 @@ describe('composeAgeEstimationFn', () => { }); it('handles float by flooring', () => { - const estimateAge = composeAgeEstimationFn( - (age) => age + 0.9, - ); + const estimateAge = composeAgeEstimationFn((age) => age + 0.9); const testAge = 100; // The estimated age should be floored to the nearest integer expect(estimateAge(testAge)).toBe(100); }); it('handles numbers bigger than MAX_INT32 by returning MAX_INT32', () => { - const estimateAge = composeAgeEstimationFn( - (age) => age + MAX_INT32, - ); + const estimateAge = composeAgeEstimationFn((age) => age + MAX_INT32); // The estimated age should return MAX_INT32 for numbers bigger than MAX_INT32 expect(estimateAge(100)).toBe(MAX_INT32); }); it('handles MAX_INT32 correctly', () => { - const estimateAge = composeAgeEstimationFn( - (_age) => MAX_INT32, - ); + const estimateAge = composeAgeEstimationFn((_age) => MAX_INT32); // The estimated age should handle MAX_INT32 correctly expect(estimateAge(0)).toBe(MAX_INT32); }); it('handles value just below MAX_INT32', () => { - const estimateAge = composeAgeEstimationFn( - (_age) => MAX_INT32 - 1, - ); + const estimateAge = composeAgeEstimationFn((_age) => MAX_INT32 - 1); expect(estimateAge(0)).toBe(MAX_INT32 - 1); }); @@ -49,18 +44,18 @@ describe('composeAgeEstimationFn', () => { ); expect(estimateAge(100)).toBe(MAX_INT32); }); - + it('uses default callback when none provided', () => { const estimateAge = composeAgeEstimationFn(); // Default multiplies by 1.5 and floors expect(estimateAge(100)).toBe(150); expect(estimateAge(101)).toBe(151); }); - + it('default callback handles numbers close to MAX_INT32', () => { // Test the getInitialExpireAge function directly expect(getInitialExpireAge(MAX_INT32 / 1.5 - 1)).toBeLessThan(MAX_INT32); - + // Test through composeAgeEstimationFn const estimateAge = composeAgeEstimationFn(); const largeStaleAge = Math.floor(MAX_INT32 / 1.5) - 1; @@ -78,9 +73,7 @@ describe('composeAgeEstimationFn', () => { }); it('throws error for non-integer', () => { - const estimateAge = composeAgeEstimationFn( - (age) => age + Number.NaN, - ); + const estimateAge = composeAgeEstimationFn((age) => age + Number.NaN); expect(() => estimateAge(10)).toThrow( 'The expire age must be a positive integer but got a NaN.', ); @@ -108,7 +101,7 @@ describe('composeAgeEstimationFn', () => { }); expect(() => estimateAge(10)).toThrow('Test error'); }); - + it('handles negative infinity', () => { const estimateAge = composeAgeEstimationFn( (_age) => Number.NEGATIVE_INFINITY, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 239d8788..b8247ec6 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1631,8 +1631,8 @@ packages: resolution: {integrity: sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw==} engines: {node: '>=14.16'} - caniuse-lite@1.0.30001701: - resolution: {integrity: sha512-faRs/AW3jA9nTwmJBSO1PQ6L/EOgsB5HMQQq4iCu5zhPgVVgO/pZRHlmatwijZKetFw8/Pr4q6dEN8sJuq8qTw==} + caniuse-lite@1.0.30001702: + resolution: {integrity: sha512-LoPe/D7zioC0REI5W73PeR1e1MLCipRGq/VkovJnd6Df+QVqT+vT33OXCp8QUd7kA7RZrHWxb1B36OQKI/0gOA==} ccount@2.0.1: resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} @@ -6148,7 +6148,7 @@ snapshots: camelcase@7.0.1: {} - caniuse-lite@1.0.30001701: {} + caniuse-lite@1.0.30001702: {} ccount@2.0.1: {} @@ -8392,7 +8392,7 @@ snapshots: '@swc/counter': 0.1.3 '@swc/helpers': 0.5.15 busboy: 1.6.0 - caniuse-lite: 1.0.30001701 + caniuse-lite: 1.0.30001702 postcss: 8.4.31 react: 19.0.0 react-dom: 19.0.0(react@19.0.0) From 63b6273cffb1fb0edc325a8dff4509845bccba2b Mon Sep 17 00:00:00 2001 From: better-salmon <132773930+better-salmon@users.noreply.github.com> Date: Mon, 17 Mar 2025 23:14:32 +0300 Subject: [PATCH 08/16] Update deps --- apps/cache-testing/package.json | 12 +- docs/cache-handler-docs/package.json | 10 +- internal/backend/package.json | 2 +- internal/eslint-config/package.json | 10 +- packages/cache-handler/package.json | 4 +- pnpm-lock.yaml | 1141 +++++++++++++------------- 6 files changed, 588 insertions(+), 591 deletions(-) diff --git a/apps/cache-testing/package.json b/apps/cache-testing/package.json index c2ebd24c..c1681ad4 100644 --- a/apps/cache-testing/package.json +++ b/apps/cache-testing/package.json @@ -17,23 +17,23 @@ }, "dependencies": { "@neshca/cache-handler": "workspace:*", - "axios": "1.8.1", - "next": "15.2.0", + "axios": "1.8.3", + "next": "15.2.2", "react": "19.0.0", "react-dom": "19.0.0", "redis": "4.7.0" }, "devDependencies": { - "@playwright/test": "1.50.1", + "@playwright/test": "1.51.1", "@repo/eslint-config": "workspace:*", "@repo/typescript-config": "workspace:*", - "@types/node": "22.13.9", + "@types/node": "22.13.10", "@types/react": "19.0.10", "@types/react-dom": "19.0.4", "dotenv-cli": "8.0.0", - "eslint": "9.21.0", + "eslint": "9.22.0", "fastify": "5.2.1", - "pm2": "5.4.3", + "pm2": "6.0.5", "tsx": "4.19.3", "typescript": "5.8.2" } diff --git a/docs/cache-handler-docs/package.json b/docs/cache-handler-docs/package.json index 065999a5..8e6cb7a6 100644 --- a/docs/cache-handler-docs/package.json +++ b/docs/cache-handler-docs/package.json @@ -12,19 +12,19 @@ "start:docs": "serve out" }, "dependencies": { - "next": "15.2.0", - "nextra": "4.2.14", - "nextra-theme-docs": "4.2.14", + "next": "15.2.2", + "nextra": "4.2.16", + "nextra-theme-docs": "4.2.16", "react": "19.0.0", "react-dom": "19.0.0" }, "devDependencies": { "@repo/eslint-config": "workspace:*", "@repo/typescript-config": "workspace:*", - "@types/node": "22.13.9", + "@types/node": "22.13.10", "@types/react": "19.0.10", "@types/react-dom": "19.0.4", - "eslint": "9.21.0", + "eslint": "9.22.0", "pagefind": "1.3.0", "serve": "14.2.4", "typescript": "5.8.2" diff --git a/internal/backend/package.json b/internal/backend/package.json index 713759e8..516c4b9c 100644 --- a/internal/backend/package.json +++ b/internal/backend/package.json @@ -15,7 +15,7 @@ }, "devDependencies": { "@repo/typescript-config": "workspace:*", - "@types/node": "22.13.9", + "@types/node": "22.13.10", "pino-pretty": "13.0.0", "tsx": "4.19.3", "typescript": "5.8.2" diff --git a/internal/eslint-config/package.json b/internal/eslint-config/package.json index c83a6042..aceaf6aa 100644 --- a/internal/eslint-config/package.json +++ b/internal/eslint-config/package.json @@ -7,15 +7,15 @@ "./next-js": "./next.js" }, "devDependencies": { - "@eslint/js": "9.21.0", - "@next/eslint-plugin-next": "15.2.0", - "eslint": "9.21.0", - "eslint-config-prettier": "10.0.2", + "@eslint/js": "9.22.0", + "@next/eslint-plugin-next": "15.2.2", + "eslint": "9.22.0", + "eslint-config-prettier": "10.1.1", "eslint-plugin-react": "7.37.4", "eslint-plugin-react-hooks": "5.2.0", "eslint-plugin-turbo": "2.4.4", "globals": "16.0.0", "typescript": "5.8.2", - "typescript-eslint": "8.26.0" + "typescript-eslint": "8.26.1" } } diff --git a/packages/cache-handler/package.json b/packages/cache-handler/package.json index a6d3c60e..c8c14e5d 100644 --- a/packages/cache-handler/package.json +++ b/packages/cache-handler/package.json @@ -43,10 +43,10 @@ }, "devDependencies": { "@repo/typescript-config": "workspace:*", - "@types/node": "22.13.9", + "@types/node": "22.13.10", "tsx": "4.19.3", "typescript": "5.8.2", - "vitest": "3.0.7" + "vitest": "3.0.9" }, "peerDependencies": { "next": ">= 15 < 16", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index b8247ec6..903575c0 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -33,11 +33,11 @@ importers: specifier: workspace:* version: link:../../packages/cache-handler axios: - specifier: 1.8.1 - version: 1.8.1 + specifier: 1.8.3 + version: 1.8.3 next: - specifier: 15.2.0 - version: 15.2.0(@playwright/test@1.50.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + specifier: 15.2.2 + version: 15.2.2(@playwright/test@1.51.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) react: specifier: 19.0.0 version: 19.0.0 @@ -49,8 +49,8 @@ importers: version: 4.7.0 devDependencies: '@playwright/test': - specifier: 1.50.1 - version: 1.50.1 + specifier: 1.51.1 + version: 1.51.1 '@repo/eslint-config': specifier: workspace:* version: link:../../internal/eslint-config @@ -58,8 +58,8 @@ importers: specifier: workspace:* version: link:../../internal/typescript-config '@types/node': - specifier: 22.13.9 - version: 22.13.9 + specifier: 22.13.10 + version: 22.13.10 '@types/react': specifier: 19.0.10 version: 19.0.10 @@ -70,14 +70,14 @@ importers: specifier: 8.0.0 version: 8.0.0 eslint: - specifier: 9.21.0 - version: 9.21.0 + specifier: 9.22.0 + version: 9.22.0 fastify: specifier: 5.2.1 version: 5.2.1 pm2: - specifier: 5.4.3 - version: 5.4.3 + specifier: 6.0.5 + version: 6.0.5 tsx: specifier: 4.19.3 version: 4.19.3 @@ -88,14 +88,14 @@ importers: docs/cache-handler-docs: dependencies: next: - specifier: 15.2.0 - version: 15.2.0(@playwright/test@1.50.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + specifier: 15.2.2 + version: 15.2.2(@playwright/test@1.51.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) nextra: - specifier: 4.2.14 - version: 4.2.14(acorn@8.14.0)(next@15.2.0(@playwright/test@1.50.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.8.2) + specifier: 4.2.16 + version: 4.2.16(acorn@8.14.1)(next@15.2.2(@playwright/test@1.51.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.8.2) nextra-theme-docs: - specifier: 4.2.14 - version: 4.2.14(@types/react@19.0.10)(next@15.2.0(@playwright/test@1.50.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(nextra@4.2.14(acorn@8.14.0)(next@15.2.0(@playwright/test@1.50.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.8.2))(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + specifier: 4.2.16 + version: 4.2.16(@types/react@19.0.10)(next@15.2.2(@playwright/test@1.51.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(nextra@4.2.16(acorn@8.14.1)(next@15.2.2(@playwright/test@1.51.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.8.2))(react-dom@19.0.0(react@19.0.0))(react@19.0.0) react: specifier: 19.0.0 version: 19.0.0 @@ -110,8 +110,8 @@ importers: specifier: workspace:* version: link:../../internal/typescript-config '@types/node': - specifier: 22.13.9 - version: 22.13.9 + specifier: 22.13.10 + version: 22.13.10 '@types/react': specifier: 19.0.10 version: 19.0.10 @@ -119,8 +119,8 @@ importers: specifier: 19.0.4 version: 19.0.4(@types/react@19.0.10) eslint: - specifier: 9.21.0 - version: 9.21.0 + specifier: 9.22.0 + version: 9.22.0 pagefind: specifier: 1.3.0 version: 1.3.0 @@ -144,8 +144,8 @@ importers: specifier: workspace:* version: link:../typescript-config '@types/node': - specifier: 22.13.9 - version: 22.13.9 + specifier: 22.13.10 + version: 22.13.10 pino-pretty: specifier: 13.0.0 version: 13.0.0 @@ -159,26 +159,26 @@ importers: internal/eslint-config: devDependencies: '@eslint/js': - specifier: 9.21.0 - version: 9.21.0 + specifier: 9.22.0 + version: 9.22.0 '@next/eslint-plugin-next': - specifier: 15.2.0 - version: 15.2.0 + specifier: 15.2.2 + version: 15.2.2 eslint: - specifier: 9.21.0 - version: 9.21.0 + specifier: 9.22.0 + version: 9.22.0 eslint-config-prettier: - specifier: 10.0.2 - version: 10.0.2(eslint@9.21.0) + specifier: 10.1.1 + version: 10.1.1(eslint@9.22.0) eslint-plugin-react: specifier: 7.37.4 - version: 7.37.4(eslint@9.21.0) + version: 7.37.4(eslint@9.22.0) eslint-plugin-react-hooks: specifier: 5.2.0 - version: 5.2.0(eslint@9.21.0) + version: 5.2.0(eslint@9.22.0) eslint-plugin-turbo: specifier: 2.4.4 - version: 2.4.4(eslint@9.21.0)(turbo@2.4.4) + version: 2.4.4(eslint@9.22.0)(turbo@2.4.4) globals: specifier: 16.0.0 version: 16.0.0 @@ -186,8 +186,8 @@ importers: specifier: 5.8.2 version: 5.8.2 typescript-eslint: - specifier: 8.26.0 - version: 8.26.0(eslint@9.21.0)(typescript@5.8.2) + specifier: 8.26.1 + version: 8.26.1(eslint@9.22.0)(typescript@5.8.2) internal/typescript-config: {} @@ -201,7 +201,7 @@ importers: version: 11.0.2 next: specifier: '>= 15 < 16' - version: 15.2.0(@playwright/test@1.50.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + version: 15.2.2(@playwright/test@1.51.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) redis: specifier: '>= 4.6' version: 4.7.0 @@ -213,8 +213,8 @@ importers: specifier: workspace:* version: link:../../internal/typescript-config '@types/node': - specifier: 22.13.9 - version: 22.13.9 + specifier: 22.13.10 + version: 22.13.10 tsx: specifier: 4.19.3 version: 4.19.3 @@ -222,8 +222,8 @@ importers: specifier: 5.8.2 version: 5.8.2 vitest: - specifier: 3.0.7 - version: 3.0.7(@types/debug@4.1.12)(@types/node@22.13.9)(tsx@4.19.3)(yaml@2.7.0) + specifier: 3.0.9 + version: 3.0.9(@types/debug@4.1.12)(@types/node@22.13.10)(tsx@4.19.3)(yaml@2.7.0) packages: @@ -233,8 +233,8 @@ packages: '@antfu/utils@8.1.1': resolution: {integrity: sha512-Mex9nXf9vR6AhcXmMrlz/HVgYYZpVGJ6YlPgwl7UnaFpnshXs6EK/oa5Gpf3CzENMjkvEx2tQtntGnb7UtSTOQ==} - '@babel/runtime@7.26.9': - resolution: {integrity: sha512-aA63XwOkcl4xxQa3HjPMqOP6LiK0ZDv3mUPYEFXkpHbaFjtGggE1A61FjFzJnB+p7/oy2gA8E+rcBNl/zC1tMg==} + '@babel/runtime@7.26.10': + resolution: {integrity: sha512-2WJMeRQPHKSPemqk/awGrAiuFfzBmOIPXKizAsVhWH9YJqLZ0H+HS4c8loHGgW6utJ3E/ejXQUsiGaQy2NZ9Fw==} engines: {node: '>=6.9.0'} '@biomejs/biome@1.9.4': @@ -366,158 +366,158 @@ packages: '@emnapi/runtime@1.3.1': resolution: {integrity: sha512-kEBmG8KyqtxJZv+ygbEim+KCGtIq1fC22Ms3S4ziXmYKm8uyoLX0MHONVKwp+9opg390VaKRNt4a7A9NwmpNhw==} - '@esbuild/aix-ppc64@0.25.0': - resolution: {integrity: sha512-O7vun9Sf8DFjH2UtqK8Ku3LkquL9SZL8OLY1T5NZkA34+wG3OQF7cl4Ql8vdNzM6fzBbYfLaiRLIOZ+2FOCgBQ==} + '@esbuild/aix-ppc64@0.25.1': + resolution: {integrity: sha512-kfYGy8IdzTGy+z0vFGvExZtxkFlA4zAxgKEahG9KE1ScBjpQnFsNOX8KTU5ojNru5ed5CVoJYXFtoxaq5nFbjQ==} engines: {node: '>=18'} cpu: [ppc64] os: [aix] - '@esbuild/android-arm64@0.25.0': - resolution: {integrity: sha512-grvv8WncGjDSyUBjN9yHXNt+cq0snxXbDxy5pJtzMKGmmpPxeAmAhWxXI+01lU5rwZomDgD3kJwulEnhTRUd6g==} + '@esbuild/android-arm64@0.25.1': + resolution: {integrity: sha512-50tM0zCJW5kGqgG7fQ7IHvQOcAn9TKiVRuQ/lN0xR+T2lzEFvAi1ZcS8DiksFcEpf1t/GYOeOfCAgDHFpkiSmA==} engines: {node: '>=18'} cpu: [arm64] os: [android] - '@esbuild/android-arm@0.25.0': - resolution: {integrity: sha512-PTyWCYYiU0+1eJKmw21lWtC+d08JDZPQ5g+kFyxP0V+es6VPPSUhM6zk8iImp2jbV6GwjX4pap0JFbUQN65X1g==} + '@esbuild/android-arm@0.25.1': + resolution: {integrity: sha512-dp+MshLYux6j/JjdqVLnMglQlFu+MuVeNrmT5nk6q07wNhCdSnB7QZj+7G8VMUGh1q+vj2Bq8kRsuyA00I/k+Q==} engines: {node: '>=18'} cpu: [arm] os: [android] - '@esbuild/android-x64@0.25.0': - resolution: {integrity: sha512-m/ix7SfKG5buCnxasr52+LI78SQ+wgdENi9CqyCXwjVR2X4Jkz+BpC3le3AoBPYTC9NHklwngVXvbJ9/Akhrfg==} + '@esbuild/android-x64@0.25.1': + resolution: {integrity: sha512-GCj6WfUtNldqUzYkN/ITtlhwQqGWu9S45vUXs7EIYf+7rCiiqH9bCloatO9VhxsL0Pji+PF4Lz2XXCES+Q8hDw==} engines: {node: '>=18'} cpu: [x64] os: [android] - '@esbuild/darwin-arm64@0.25.0': - resolution: {integrity: sha512-mVwdUb5SRkPayVadIOI78K7aAnPamoeFR2bT5nszFUZ9P8UpK4ratOdYbZZXYSqPKMHfS1wdHCJk1P1EZpRdvw==} + '@esbuild/darwin-arm64@0.25.1': + resolution: {integrity: sha512-5hEZKPf+nQjYoSr/elb62U19/l1mZDdqidGfmFutVUjjUZrOazAtwK+Kr+3y0C/oeJfLlxo9fXb1w7L+P7E4FQ==} engines: {node: '>=18'} cpu: [arm64] os: [darwin] - '@esbuild/darwin-x64@0.25.0': - resolution: {integrity: sha512-DgDaYsPWFTS4S3nWpFcMn/33ZZwAAeAFKNHNa1QN0rI4pUjgqf0f7ONmXf6d22tqTY+H9FNdgeaAa+YIFUn2Rg==} + '@esbuild/darwin-x64@0.25.1': + resolution: {integrity: sha512-hxVnwL2Dqs3fM1IWq8Iezh0cX7ZGdVhbTfnOy5uURtao5OIVCEyj9xIzemDi7sRvKsuSdtCAhMKarxqtlyVyfA==} engines: {node: '>=18'} cpu: [x64] os: [darwin] - '@esbuild/freebsd-arm64@0.25.0': - resolution: {integrity: sha512-VN4ocxy6dxefN1MepBx/iD1dH5K8qNtNe227I0mnTRjry8tj5MRk4zprLEdG8WPyAPb93/e4pSgi1SoHdgOa4w==} + '@esbuild/freebsd-arm64@0.25.1': + resolution: {integrity: sha512-1MrCZs0fZa2g8E+FUo2ipw6jw5qqQiH+tERoS5fAfKnRx6NXH31tXBKI3VpmLijLH6yriMZsxJtaXUyFt/8Y4A==} engines: {node: '>=18'} cpu: [arm64] os: [freebsd] - '@esbuild/freebsd-x64@0.25.0': - resolution: {integrity: sha512-mrSgt7lCh07FY+hDD1TxiTyIHyttn6vnjesnPoVDNmDfOmggTLXRv8Id5fNZey1gl/V2dyVK1VXXqVsQIiAk+A==} + '@esbuild/freebsd-x64@0.25.1': + resolution: {integrity: sha512-0IZWLiTyz7nm0xuIs0q1Y3QWJC52R8aSXxe40VUxm6BB1RNmkODtW6LHvWRrGiICulcX7ZvyH6h5fqdLu4gkww==} engines: {node: '>=18'} cpu: [x64] os: [freebsd] - '@esbuild/linux-arm64@0.25.0': - resolution: {integrity: sha512-9QAQjTWNDM/Vk2bgBl17yWuZxZNQIF0OUUuPZRKoDtqF2k4EtYbpyiG5/Dk7nqeK6kIJWPYldkOcBqjXjrUlmg==} + '@esbuild/linux-arm64@0.25.1': + resolution: {integrity: sha512-jaN3dHi0/DDPelk0nLcXRm1q7DNJpjXy7yWaWvbfkPvI+7XNSc/lDOnCLN7gzsyzgu6qSAmgSvP9oXAhP973uQ==} engines: {node: '>=18'} cpu: [arm64] os: [linux] - '@esbuild/linux-arm@0.25.0': - resolution: {integrity: sha512-vkB3IYj2IDo3g9xX7HqhPYxVkNQe8qTK55fraQyTzTX/fxaDtXiEnavv9geOsonh2Fd2RMB+i5cbhu2zMNWJwg==} + '@esbuild/linux-arm@0.25.1': + resolution: {integrity: sha512-NdKOhS4u7JhDKw9G3cY6sWqFcnLITn6SqivVArbzIaf3cemShqfLGHYMx8Xlm/lBit3/5d7kXvriTUGa5YViuQ==} engines: {node: '>=18'} cpu: [arm] os: [linux] - '@esbuild/linux-ia32@0.25.0': - resolution: {integrity: sha512-43ET5bHbphBegyeqLb7I1eYn2P/JYGNmzzdidq/w0T8E2SsYL1U6un2NFROFRg1JZLTzdCoRomg8Rvf9M6W6Gg==} + '@esbuild/linux-ia32@0.25.1': + resolution: {integrity: sha512-OJykPaF4v8JidKNGz8c/q1lBO44sQNUQtq1KktJXdBLn1hPod5rE/Hko5ugKKZd+D2+o1a9MFGUEIUwO2YfgkQ==} engines: {node: '>=18'} cpu: [ia32] os: [linux] - '@esbuild/linux-loong64@0.25.0': - resolution: {integrity: sha512-fC95c/xyNFueMhClxJmeRIj2yrSMdDfmqJnyOY4ZqsALkDrrKJfIg5NTMSzVBr5YW1jf+l7/cndBfP3MSDpoHw==} + '@esbuild/linux-loong64@0.25.1': + resolution: {integrity: sha512-nGfornQj4dzcq5Vp835oM/o21UMlXzn79KobKlcs3Wz9smwiifknLy4xDCLUU0BWp7b/houtdrgUz7nOGnfIYg==} engines: {node: '>=18'} cpu: [loong64] os: [linux] - '@esbuild/linux-mips64el@0.25.0': - resolution: {integrity: sha512-nkAMFju7KDW73T1DdH7glcyIptm95a7Le8irTQNO/qtkoyypZAnjchQgooFUDQhNAy4iu08N79W4T4pMBwhPwQ==} + '@esbuild/linux-mips64el@0.25.1': + resolution: {integrity: sha512-1osBbPEFYwIE5IVB/0g2X6i1qInZa1aIoj1TdL4AaAb55xIIgbg8Doq6a5BzYWgr+tEcDzYH67XVnTmUzL+nXg==} engines: {node: '>=18'} cpu: [mips64el] os: [linux] - '@esbuild/linux-ppc64@0.25.0': - resolution: {integrity: sha512-NhyOejdhRGS8Iwv+KKR2zTq2PpysF9XqY+Zk77vQHqNbo/PwZCzB5/h7VGuREZm1fixhs4Q/qWRSi5zmAiO4Fw==} + '@esbuild/linux-ppc64@0.25.1': + resolution: {integrity: sha512-/6VBJOwUf3TdTvJZ82qF3tbLuWsscd7/1w+D9LH0W/SqUgM5/JJD0lrJ1fVIfZsqB6RFmLCe0Xz3fmZc3WtyVg==} engines: {node: '>=18'} cpu: [ppc64] os: [linux] - '@esbuild/linux-riscv64@0.25.0': - resolution: {integrity: sha512-5S/rbP5OY+GHLC5qXp1y/Mx//e92L1YDqkiBbO9TQOvuFXM+iDqUNG5XopAnXoRH3FjIUDkeGcY1cgNvnXp/kA==} + '@esbuild/linux-riscv64@0.25.1': + resolution: {integrity: sha512-nSut/Mx5gnilhcq2yIMLMe3Wl4FK5wx/o0QuuCLMtmJn+WeWYoEGDN1ipcN72g1WHsnIbxGXd4i/MF0gTcuAjQ==} engines: {node: '>=18'} cpu: [riscv64] os: [linux] - '@esbuild/linux-s390x@0.25.0': - resolution: {integrity: sha512-XM2BFsEBz0Fw37V0zU4CXfcfuACMrppsMFKdYY2WuTS3yi8O1nFOhil/xhKTmE1nPmVyvQJjJivgDT+xh8pXJA==} + '@esbuild/linux-s390x@0.25.1': + resolution: {integrity: sha512-cEECeLlJNfT8kZHqLarDBQso9a27o2Zd2AQ8USAEoGtejOrCYHNtKP8XQhMDJMtthdF4GBmjR2au3x1udADQQQ==} engines: {node: '>=18'} cpu: [s390x] os: [linux] - '@esbuild/linux-x64@0.25.0': - resolution: {integrity: sha512-9yl91rHw/cpwMCNytUDxwj2XjFpxML0y9HAOH9pNVQDpQrBxHy01Dx+vaMu0N1CKa/RzBD2hB4u//nfc+Sd3Cw==} + '@esbuild/linux-x64@0.25.1': + resolution: {integrity: sha512-xbfUhu/gnvSEg+EGovRc+kjBAkrvtk38RlerAzQxvMzlB4fXpCFCeUAYzJvrnhFtdeyVCDANSjJvOvGYoeKzFA==} engines: {node: '>=18'} cpu: [x64] os: [linux] - '@esbuild/netbsd-arm64@0.25.0': - resolution: {integrity: sha512-RuG4PSMPFfrkH6UwCAqBzauBWTygTvb1nxWasEJooGSJ/NwRw7b2HOwyRTQIU97Hq37l3npXoZGYMy3b3xYvPw==} + '@esbuild/netbsd-arm64@0.25.1': + resolution: {integrity: sha512-O96poM2XGhLtpTh+s4+nP7YCCAfb4tJNRVZHfIE7dgmax+yMP2WgMd2OecBuaATHKTHsLWHQeuaxMRnCsH8+5g==} engines: {node: '>=18'} cpu: [arm64] os: [netbsd] - '@esbuild/netbsd-x64@0.25.0': - resolution: {integrity: sha512-jl+qisSB5jk01N5f7sPCsBENCOlPiS/xptD5yxOx2oqQfyourJwIKLRA2yqWdifj3owQZCL2sn6o08dBzZGQzA==} + '@esbuild/netbsd-x64@0.25.1': + resolution: {integrity: sha512-X53z6uXip6KFXBQ+Krbx25XHV/NCbzryM6ehOAeAil7X7oa4XIq+394PWGnwaSQ2WRA0KI6PUO6hTO5zeF5ijA==} engines: {node: '>=18'} cpu: [x64] os: [netbsd] - '@esbuild/openbsd-arm64@0.25.0': - resolution: {integrity: sha512-21sUNbq2r84YE+SJDfaQRvdgznTD8Xc0oc3p3iW/a1EVWeNj/SdUCbm5U0itZPQYRuRTW20fPMWMpcrciH2EJw==} + '@esbuild/openbsd-arm64@0.25.1': + resolution: {integrity: sha512-Na9T3szbXezdzM/Kfs3GcRQNjHzM6GzFBeU1/6IV/npKP5ORtp9zbQjvkDJ47s6BCgaAZnnnu/cY1x342+MvZg==} engines: {node: '>=18'} cpu: [arm64] os: [openbsd] - '@esbuild/openbsd-x64@0.25.0': - resolution: {integrity: sha512-2gwwriSMPcCFRlPlKx3zLQhfN/2WjJ2NSlg5TKLQOJdV0mSxIcYNTMhk3H3ulL/cak+Xj0lY1Ym9ysDV1igceg==} + '@esbuild/openbsd-x64@0.25.1': + resolution: {integrity: sha512-T3H78X2h1tszfRSf+txbt5aOp/e7TAz3ptVKu9Oyir3IAOFPGV6O9c2naym5TOriy1l0nNf6a4X5UXRZSGX/dw==} engines: {node: '>=18'} cpu: [x64] os: [openbsd] - '@esbuild/sunos-x64@0.25.0': - resolution: {integrity: sha512-bxI7ThgLzPrPz484/S9jLlvUAHYMzy6I0XiU1ZMeAEOBcS0VePBFxh1JjTQt3Xiat5b6Oh4x7UC7IwKQKIJRIg==} + '@esbuild/sunos-x64@0.25.1': + resolution: {integrity: sha512-2H3RUvcmULO7dIE5EWJH8eubZAI4xw54H1ilJnRNZdeo8dTADEZ21w6J22XBkXqGJbe0+wnNJtw3UXRoLJnFEg==} engines: {node: '>=18'} cpu: [x64] os: [sunos] - '@esbuild/win32-arm64@0.25.0': - resolution: {integrity: sha512-ZUAc2YK6JW89xTbXvftxdnYy3m4iHIkDtK3CLce8wg8M2L+YZhIvO1DKpxrd0Yr59AeNNkTiic9YLf6FTtXWMw==} + '@esbuild/win32-arm64@0.25.1': + resolution: {integrity: sha512-GE7XvrdOzrb+yVKB9KsRMq+7a2U/K5Cf/8grVFRAGJmfADr/e/ODQ134RK2/eeHqYV5eQRFxb1hY7Nr15fv1NQ==} engines: {node: '>=18'} cpu: [arm64] os: [win32] - '@esbuild/win32-ia32@0.25.0': - resolution: {integrity: sha512-eSNxISBu8XweVEWG31/JzjkIGbGIJN/TrRoiSVZwZ6pkC6VX4Im/WV2cz559/TXLcYbcrDN8JtKgd9DJVIo8GA==} + '@esbuild/win32-ia32@0.25.1': + resolution: {integrity: sha512-uOxSJCIcavSiT6UnBhBzE8wy3n0hOkJsBOzy7HDAuTDE++1DJMRRVCPGisULScHL+a/ZwdXPpXD3IyFKjA7K8A==} engines: {node: '>=18'} cpu: [ia32] os: [win32] - '@esbuild/win32-x64@0.25.0': - resolution: {integrity: sha512-ZENoHJBxA20C2zFzh6AI4fT6RraMzjYw4xKWemRTRmRVtN9c5DcH9r/f2ihEkMjOW5eGgrwCslG/+Y/3bL+DHQ==} + '@esbuild/win32-x64@0.25.1': + resolution: {integrity: sha512-Y1EQdcfwMSeQN/ujR5VayLOJ1BHaK+ssyk0AEzPjC+t1lITgsnccPqFjb6V+LsTp/9Iov4ysfjxLaGJ9RPtkVg==} engines: {node: '>=18'} cpu: [x64] os: [win32] - '@eslint-community/eslint-utils@4.4.1': - resolution: {integrity: sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA==} + '@eslint-community/eslint-utils@4.5.1': + resolution: {integrity: sha512-soEIOALTfTK6EjmKMMoLugwaP0rzkad90iIWd1hMO9ARkSAyjfMfkRRhLvD5qH7vvM0Cg72pieUfR6yh6XxC4w==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 @@ -530,6 +530,10 @@ packages: resolution: {integrity: sha512-GNKqxfHG2ySmJOBSHg7LxeUx4xpuCoFjacmlCoYWEbaPXLwvfIjixRI12xCQZeULksQb23uiA8F40w5TojpV7w==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@eslint/config-helpers@0.1.0': + resolution: {integrity: sha512-kLrdPDJE1ckPo94kmPPf9Hfd0DU0Jw6oKYrhe+pwSC0iTUInmTa+w6fw8sGgcfkFJGNdWOUeOaDM4quW4a7OkA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@eslint/core@0.12.0': resolution: {integrity: sha512-cmrR6pytBuSMTaBweKoGMwu3EiHiEC+DoyupPmlZ0HxBJBtIxwe+j/E4XPIKNx+Q74c8lXKPwYawBf5glsTkHg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -538,8 +542,8 @@ packages: resolution: {integrity: sha512-yaVPAiNAalnCZedKLdR21GOGILMLKPyqSLWaAjQFvYA2i/ciDi8ArYVr69Anohb6cH2Ukhqti4aFnYyPm8wdwQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/js@9.21.0': - resolution: {integrity: sha512-BqStZ3HX8Yz6LvsF5ByXYrtigrV5AXADWLAGc7PH/1SxOb7/FIYYMszZZWiUou/GB9P2lXWk2SV4d+Z8h0nknw==} + '@eslint/js@9.22.0': + resolution: {integrity: sha512-vLFajx9o8d1/oL2ZkpMYbkLv8nDB6yaIwFNt7nI4+I80U/z03SxmfOMsLbvWr3p7C+Wnoh//aOu2pQW8cS0HCQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@eslint/object-schema@2.1.6': @@ -553,8 +557,8 @@ packages: '@fastify/ajv-compiler@4.0.2': resolution: {integrity: sha512-Rkiu/8wIjpsf46Rr+Fitd3HRP+VsxUFDDeag0hs9L0ksfnwx2g7SPQQTFL0E8Qv+rfXzQOxBJnjUB9ITUDjfWQ==} - '@fastify/error@4.0.0': - resolution: {integrity: sha512-OO/SA8As24JtT1usTUTKgGH7uLvhfwZPwlptRi2Dp5P4KKmJI3gvsZ8MIHnNwDs4sLf/aai5LzTyl66xr7qMxA==} + '@fastify/error@4.1.0': + resolution: {integrity: sha512-KeFcciOr1eo/YvIXHP65S94jfEEqn1RxTRBT1aJaHxY5FK0/GDXYozsQMMWlZoHgi8i0s+YtrLsgj/JkUUjSkQ==} '@fastify/fast-json-stringify-compiler@5.0.2': resolution: {integrity: sha512-YdR7gqlLg1xZAQa+SX4sMNzQHY5pC54fu9oC5aYSUqBhyn6fkLkrdtKlpVdCNPlwuUuXA1PjFTEmvMF6ZVXVGw==} @@ -833,56 +837,56 @@ packages: resolution: {integrity: sha512-jMxvwzkKzd3cXo2EB9GM2ic0eYo2rP/BS6gJt6HnWbsDO1O8GSD4k7o2Cpr2YERtMpGF/MGcDfsfj2EbQPtrXw==} engines: {node: '>= 10'} - '@next/env@15.2.0': - resolution: {integrity: sha512-eMgJu1RBXxxqqnuRJQh5RozhskoNUDHBFybvi+Z+yK9qzKeG7dadhv/Vp1YooSZmCnegf7JxWuapV77necLZNA==} + '@next/env@15.2.2': + resolution: {integrity: sha512-yWgopCfA9XDR8ZH3taB5nRKtKJ1Q5fYsTOuYkzIIoS8TJ0UAUKAGF73JnGszbjk2ufAQDj6mDdgsJAFx5CLtYQ==} - '@next/eslint-plugin-next@15.2.0': - resolution: {integrity: sha512-jHFUG2OwmAuOASqq253RAEG/5BYcPHn27p1NoWZDCf4OdvdK0yRYWX92YKkL+Mk2s+GyJrmd/GATlL5b2IySpw==} + '@next/eslint-plugin-next@15.2.2': + resolution: {integrity: sha512-1+BzokFuFQIfLaRxUKf2u5In4xhPV7tUgKcK53ywvFl6+LXHWHpFkcV7VNeKlyQKUotwiq4fy/aDNF9EiUp4RQ==} - '@next/swc-darwin-arm64@15.2.0': - resolution: {integrity: sha512-rlp22GZwNJjFCyL7h5wz9vtpBVuCt3ZYjFWpEPBGzG712/uL1bbSkS675rVAUCRZ4hjoTJ26Q7IKhr5DfJrHDA==} + '@next/swc-darwin-arm64@15.2.2': + resolution: {integrity: sha512-HNBRnz+bkZ+KfyOExpUxTMR0Ow8nkkcE6IlsdEa9W/rI7gefud19+Sn1xYKwB9pdCdxIP1lPru/ZfjfA+iT8pw==} engines: {node: '>= 10'} cpu: [arm64] os: [darwin] - '@next/swc-darwin-x64@15.2.0': - resolution: {integrity: sha512-DiU85EqSHogCz80+sgsx90/ecygfCSGl5P3b4XDRVZpgujBm5lp4ts7YaHru7eVTyZMjHInzKr+w0/7+qDrvMA==} + '@next/swc-darwin-x64@15.2.2': + resolution: {integrity: sha512-mJOUwp7al63tDpLpEFpKwwg5jwvtL1lhRW2fI1Aog0nYCPAhxbJsaZKdoVyPZCy8MYf/iQVNDuk/+i29iLCzIA==} engines: {node: '>= 10'} cpu: [x64] os: [darwin] - '@next/swc-linux-arm64-gnu@15.2.0': - resolution: {integrity: sha512-VnpoMaGukiNWVxeqKHwi8MN47yKGyki5q+7ql/7p/3ifuU2341i/gDwGK1rivk0pVYbdv5D8z63uu9yMw0QhpQ==} + '@next/swc-linux-arm64-gnu@15.2.2': + resolution: {integrity: sha512-5ZZ0Zwy3SgMr7MfWtRE7cQWVssfOvxYfD9O7XHM7KM4nrf5EOeqwq67ZXDgo86LVmffgsu5tPO57EeFKRnrfSQ==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - '@next/swc-linux-arm64-musl@15.2.0': - resolution: {integrity: sha512-ka97/ssYE5nPH4Qs+8bd8RlYeNeUVBhcnsNUmFM6VWEob4jfN9FTr0NBhXVi1XEJpj3cMfgSRW+LdE3SUZbPrw==} + '@next/swc-linux-arm64-musl@15.2.2': + resolution: {integrity: sha512-cgKWBuFMLlJ4TWcFHl1KOaVVUAF8vy4qEvX5KsNd0Yj5mhu989QFCq1WjuaEbv/tO1ZpsQI6h/0YR8bLwEi+nA==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - '@next/swc-linux-x64-gnu@15.2.0': - resolution: {integrity: sha512-zY1JduE4B3q0k2ZCE+DAF/1efjTXUsKP+VXRtrt/rJCTgDlUyyryx7aOgYXNc1d8gobys/Lof9P9ze8IyRDn7Q==} + '@next/swc-linux-x64-gnu@15.2.2': + resolution: {integrity: sha512-c3kWSOSsVL8rcNBBfOq1+/j2PKs2nsMwJUV4icUxRgGBwUOfppeh7YhN5s79enBQFU+8xRgVatFkhHU1QW7yUA==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - '@next/swc-linux-x64-musl@15.2.0': - resolution: {integrity: sha512-QqvLZpurBD46RhaVaVBepkVQzh8xtlUN00RlG4Iq1sBheNugamUNPuZEH1r9X1YGQo1KqAe1iiShF0acva3jHQ==} + '@next/swc-linux-x64-musl@15.2.2': + resolution: {integrity: sha512-PXTW9PLTxdNlVYgPJ0equojcq1kNu5NtwcNjRjHAB+/sdoKZ+X8FBu70fdJFadkxFIGekQTyRvPMFF+SOJaQjw==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - '@next/swc-win32-arm64-msvc@15.2.0': - resolution: {integrity: sha512-ODZ0r9WMyylTHAN6pLtvUtQlGXBL9voljv6ujSlcsjOxhtXPI1Ag6AhZK0SE8hEpR1374WZZ5w33ChpJd5fsjw==} + '@next/swc-win32-arm64-msvc@15.2.2': + resolution: {integrity: sha512-nG644Es5llSGEcTaXhnGWR/aThM/hIaz0jx4MDg4gWC8GfTCp8eDBWZ77CVuv2ha/uL9Ce+nPTfYkSLG67/sHg==} engines: {node: '>= 10'} cpu: [arm64] os: [win32] - '@next/swc-win32-x64-msvc@15.2.0': - resolution: {integrity: sha512-8+4Z3Z7xa13NdUuUAcpVNA6o76lNPniBd9Xbo02bwXQXnZgFvEopwY2at5+z7yHl47X9qbZpvwatZ2BRo3EdZw==} + '@next/swc-win32-x64-msvc@15.2.2': + resolution: {integrity: sha512-52nWy65S/R6/kejz3jpvHAjZDPKIbEQu4x9jDBzmB9jJfuOy5rspjKu4u77+fI4M/WzLXrrQd57hlFGzz1ubcQ==} engines: {node: '>= 10'} cpu: [x64] os: [win32] @@ -928,16 +932,16 @@ packages: resolution: {integrity: sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==} engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} - '@playwright/test@1.50.1': - resolution: {integrity: sha512-Jii3aBg+CEDpgnuDxEp/h7BimHcUTDlpEtce89xEumlJ5ef2hqepZ+PWp1DDpYC/VO9fmWVI1IlEaoI5fK9FXQ==} + '@playwright/test@1.51.1': + resolution: {integrity: sha512-nM+kEaTSAoVlXmMPH10017vn3FSiFqr/bh4fKg9vmAdMfd9SDqRZNvPSiAHADc/itWak+qPvMPZQOPwCBW7k7Q==} engines: {node: '>=18'} hasBin: true - '@pm2/agent@2.0.4': - resolution: {integrity: sha512-n7WYvvTJhHLS2oBb1PjOtgLpMhgImOq8sXkPBw6smeg9LJBWZjiEgPKOpR8mn9UJZsB5P3W4V/MyvNnp31LKeA==} + '@pm2/agent@2.1.1': + resolution: {integrity: sha512-0V9ckHWd/HSC8BgAbZSoq8KXUG81X97nSkAxmhKDhmF8vanyaoc1YXwc2KVkbWz82Rg4gjd2n9qiT3i7bdvGrQ==} - '@pm2/io@6.0.1': - resolution: {integrity: sha512-KiA+shC6sULQAr9mGZ1pg+6KVW9MF8NpG99x26Lf/082/Qy8qsTCtnJy+HQReW1A9Rdf0C/404cz0RZGZro+IA==} + '@pm2/io@6.1.0': + resolution: {integrity: sha512-IxHuYURa3+FQ6BKePlgChZkqABUKFYH6Bwbw7V/pWU1pP6iR1sCI26l7P9ThUEB385ruZn/tZS3CXDUF5IA1NQ==} engines: {node: '>=6.0'} '@pm2/js-api@0.8.0': @@ -947,14 +951,14 @@ packages: '@pm2/pm2-version-check@1.0.4': resolution: {integrity: sha512-SXsM27SGH3yTWKc2fKR4SYNxsmnvuBQ9dd6QHtEWmiZ/VqaOYPAIlS8+vMcn27YLtAEBGvNRSh3TPNvtjZgfqA==} - '@react-aria/focus@3.19.1': - resolution: {integrity: sha512-bix9Bu1Ue7RPcYmjwcjhB14BMu2qzfJ3tMQLqDc9pweJA66nOw8DThy3IfVr8Z7j2PHktOLf9kcbiZpydKHqzg==} + '@react-aria/focus@3.20.1': + resolution: {integrity: sha512-lgYs+sQ1TtBrAXnAdRBQrBo0/7o5H6IrfDxec1j+VRpcXL0xyk0xPq+m3lZp8typzIghqDgpnKkJ5Jf4OrzPIw==} peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - '@react-aria/interactions@3.23.0': - resolution: {integrity: sha512-0qR1atBIWrb7FzQ+Tmr3s8uH5mQdyRH78n0krYaG8tng9+u1JlSi8DGRSaC9ezKyNB84m7vHT207xnHXGeJ3Fg==} + '@react-aria/interactions@3.24.1': + resolution: {integrity: sha512-OWEcIC6UQfWq4Td5Ptuh4PZQ4LHLJr/JL2jGYvuNL6EgL3bWvzPrRYIF/R64YbfVxIC7FeZpPSkS07sZ93/NoA==} peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 @@ -965,19 +969,22 @@ packages: peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - '@react-aria/utils@3.27.0': - resolution: {integrity: sha512-p681OtApnKOdbeN8ITfnnYqfdHS0z7GE+4l8EXlfLnr70Rp/9xicBO6d2rU+V/B3JujDw2gPWxYKEnEeh0CGCw==} + '@react-aria/utils@3.28.1': + resolution: {integrity: sha512-mnHFF4YOVu9BRFQ1SZSKfPhg3z+lBRYoW5mLcYTQihbKhz48+I1sqRkP7ahMITr8ANH3nb34YaMME4XWmK2Mgg==} peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 + '@react-stately/flags@3.1.0': + resolution: {integrity: sha512-KSHOCxTFpBtxhIRcKwsD1YDTaNxFtCYuAUb0KEihc16QwqZViq4hasgPBs2gYm7fHRbw7WYzWKf6ZSo/+YsFlg==} + '@react-stately/utils@3.10.5': resolution: {integrity: sha512-iMQSGcpaecghDIh3mZEpZfoFH3ExBwTtuBEcvZ2XnGzCgQjeYXcMdIUwAfVQLXFTdHUHGF6Gu6/dFrYsCzySBQ==} peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - '@react-types/shared@3.27.0': - resolution: {integrity: sha512-gvznmLhi6JPEf0bsq7SwRYTHAKKq/wcmKqFez9sRdbED+SPMUmK5omfZ6w3EwUFQHbYUa4zPBYedQ7Knv70RMw==} + '@react-types/shared@3.28.0': + resolution: {integrity: sha512-9oMEYIDc3sk0G5rysnYvdNrkSg7B04yTKl50HHSZVbokeHpnU0yRmsDaWb9B/5RprcKj8XszEk5guBO8Sa/Q+Q==} peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 @@ -1010,98 +1017,98 @@ packages: peerDependencies: '@redis/client': ^1.0.0 - '@rollup/rollup-android-arm-eabi@4.34.9': - resolution: {integrity: sha512-qZdlImWXur0CFakn2BJ2znJOdqYZKiedEPEVNTBrpfPjc/YuTGcaYZcdmNFTkUj3DU0ZM/AElcM8Ybww3xVLzA==} + '@rollup/rollup-android-arm-eabi@4.36.0': + resolution: {integrity: sha512-jgrXjjcEwN6XpZXL0HUeOVGfjXhPyxAbbhD0BlXUB+abTOpbPiN5Wb3kOT7yb+uEtATNYF5x5gIfwutmuBA26w==} cpu: [arm] os: [android] - '@rollup/rollup-android-arm64@4.34.9': - resolution: {integrity: sha512-4KW7P53h6HtJf5Y608T1ISKvNIYLWRKMvfnG0c44M6In4DQVU58HZFEVhWINDZKp7FZps98G3gxwC1sb0wXUUg==} + '@rollup/rollup-android-arm64@4.36.0': + resolution: {integrity: sha512-NyfuLvdPdNUfUNeYKUwPwKsE5SXa2J6bCt2LdB/N+AxShnkpiczi3tcLJrm5mA+eqpy0HmaIY9F6XCa32N5yzg==} cpu: [arm64] os: [android] - '@rollup/rollup-darwin-arm64@4.34.9': - resolution: {integrity: sha512-0CY3/K54slrzLDjOA7TOjN1NuLKERBgk9nY5V34mhmuu673YNb+7ghaDUs6N0ujXR7fz5XaS5Aa6d2TNxZd0OQ==} + '@rollup/rollup-darwin-arm64@4.36.0': + resolution: {integrity: sha512-JQ1Jk5G4bGrD4pWJQzWsD8I1n1mgPXq33+/vP4sk8j/z/C2siRuxZtaUA7yMTf71TCZTZl/4e1bfzwUmFb3+rw==} cpu: [arm64] os: [darwin] - '@rollup/rollup-darwin-x64@4.34.9': - resolution: {integrity: sha512-eOojSEAi/acnsJVYRxnMkPFqcxSMFfrw7r2iD9Q32SGkb/Q9FpUY1UlAu1DH9T7j++gZ0lHjnm4OyH2vCI7l7Q==} + '@rollup/rollup-darwin-x64@4.36.0': + resolution: {integrity: sha512-6c6wMZa1lrtiRsbDziCmjE53YbTkxMYhhnWnSW8R/yqsM7a6mSJ3uAVT0t8Y/DGt7gxUWYuFM4bwWk9XCJrFKA==} cpu: [x64] os: [darwin] - '@rollup/rollup-freebsd-arm64@4.34.9': - resolution: {integrity: sha512-2lzjQPJbN5UnHm7bHIUKFMulGTQwdvOkouJDpPysJS+QFBGDJqcfh+CxxtG23Ik/9tEvnebQiylYoazFMAgrYw==} + '@rollup/rollup-freebsd-arm64@4.36.0': + resolution: {integrity: sha512-KXVsijKeJXOl8QzXTsA+sHVDsFOmMCdBRgFmBb+mfEb/7geR7+C8ypAml4fquUt14ZyVXaw2o1FWhqAfOvA4sg==} cpu: [arm64] os: [freebsd] - '@rollup/rollup-freebsd-x64@4.34.9': - resolution: {integrity: sha512-SLl0hi2Ah2H7xQYd6Qaiu01kFPzQ+hqvdYSoOtHYg/zCIFs6t8sV95kaoqjzjFwuYQLtOI0RZre/Ke0nPaQV+g==} + '@rollup/rollup-freebsd-x64@4.36.0': + resolution: {integrity: sha512-dVeWq1ebbvByI+ndz4IJcD4a09RJgRYmLccwlQ8bPd4olz3Y213uf1iwvc7ZaxNn2ab7bjc08PrtBgMu6nb4pQ==} cpu: [x64] os: [freebsd] - '@rollup/rollup-linux-arm-gnueabihf@4.34.9': - resolution: {integrity: sha512-88I+D3TeKItrw+Y/2ud4Tw0+3CxQ2kLgu3QvrogZ0OfkmX/DEppehus7L3TS2Q4lpB+hYyxhkQiYPJ6Mf5/dPg==} + '@rollup/rollup-linux-arm-gnueabihf@4.36.0': + resolution: {integrity: sha512-bvXVU42mOVcF4le6XSjscdXjqx8okv4n5vmwgzcmtvFdifQ5U4dXFYaCB87namDRKlUL9ybVtLQ9ztnawaSzvg==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm-musleabihf@4.34.9': - resolution: {integrity: sha512-3qyfWljSFHi9zH0KgtEPG4cBXHDFhwD8kwg6xLfHQ0IWuH9crp005GfoUUh/6w9/FWGBwEHg3lxK1iHRN1MFlA==} + '@rollup/rollup-linux-arm-musleabihf@4.36.0': + resolution: {integrity: sha512-JFIQrDJYrxOnyDQGYkqnNBtjDwTgbasdbUiQvcU8JmGDfValfH1lNpng+4FWlhaVIR4KPkeddYjsVVbmJYvDcg==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm64-gnu@4.34.9': - resolution: {integrity: sha512-6TZjPHjKZUQKmVKMUowF3ewHxctrRR09eYyvT5eFv8w/fXarEra83A2mHTVJLA5xU91aCNOUnM+DWFMSbQ0Nxw==} + '@rollup/rollup-linux-arm64-gnu@4.36.0': + resolution: {integrity: sha512-KqjYVh3oM1bj//5X7k79PSCZ6CvaVzb7Qs7VMWS+SlWB5M8p3FqufLP9VNp4CazJ0CsPDLwVD9r3vX7Ci4J56A==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-arm64-musl@4.34.9': - resolution: {integrity: sha512-LD2fytxZJZ6xzOKnMbIpgzFOuIKlxVOpiMAXawsAZ2mHBPEYOnLRK5TTEsID6z4eM23DuO88X0Tq1mErHMVq0A==} + '@rollup/rollup-linux-arm64-musl@4.36.0': + resolution: {integrity: sha512-QiGnhScND+mAAtfHqeT+cB1S9yFnNQ/EwCg5yE3MzoaZZnIV0RV9O5alJAoJKX/sBONVKeZdMfO8QSaWEygMhw==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-loongarch64-gnu@4.34.9': - resolution: {integrity: sha512-dRAgTfDsn0TE0HI6cmo13hemKpVHOEyeciGtvlBTkpx/F65kTvShtY/EVyZEIfxFkV5JJTuQ9tP5HGBS0hfxIg==} + '@rollup/rollup-linux-loongarch64-gnu@4.36.0': + resolution: {integrity: sha512-1ZPyEDWF8phd4FQtTzMh8FQwqzvIjLsl6/84gzUxnMNFBtExBtpL51H67mV9xipuxl1AEAerRBgBwFNpkw8+Lg==} cpu: [loong64] os: [linux] - '@rollup/rollup-linux-powerpc64le-gnu@4.34.9': - resolution: {integrity: sha512-PHcNOAEhkoMSQtMf+rJofwisZqaU8iQ8EaSps58f5HYll9EAY5BSErCZ8qBDMVbq88h4UxaNPlbrKqfWP8RfJA==} + '@rollup/rollup-linux-powerpc64le-gnu@4.36.0': + resolution: {integrity: sha512-VMPMEIUpPFKpPI9GZMhJrtu8rxnp6mJR3ZzQPykq4xc2GmdHj3Q4cA+7avMyegXy4n1v+Qynr9fR88BmyO74tg==} cpu: [ppc64] os: [linux] - '@rollup/rollup-linux-riscv64-gnu@4.34.9': - resolution: {integrity: sha512-Z2i0Uy5G96KBYKjeQFKbbsB54xFOL5/y1P5wNBsbXB8yE+At3oh0DVMjQVzCJRJSfReiB2tX8T6HUFZ2k8iaKg==} + '@rollup/rollup-linux-riscv64-gnu@4.36.0': + resolution: {integrity: sha512-ttE6ayb/kHwNRJGYLpuAvB7SMtOeQnVXEIpMtAvx3kepFQeowVED0n1K9nAdraHUPJ5hydEMxBpIR7o4nrm8uA==} cpu: [riscv64] os: [linux] - '@rollup/rollup-linux-s390x-gnu@4.34.9': - resolution: {integrity: sha512-U+5SwTMoeYXoDzJX5dhDTxRltSrIax8KWwfaaYcynuJw8mT33W7oOgz0a+AaXtGuvhzTr2tVKh5UO8GVANTxyQ==} + '@rollup/rollup-linux-s390x-gnu@4.36.0': + resolution: {integrity: sha512-4a5gf2jpS0AIe7uBjxDeUMNcFmaRTbNv7NxI5xOCs4lhzsVyGR/0qBXduPnoWf6dGC365saTiwag8hP1imTgag==} cpu: [s390x] os: [linux] - '@rollup/rollup-linux-x64-gnu@4.34.9': - resolution: {integrity: sha512-FwBHNSOjUTQLP4MG7y6rR6qbGw4MFeQnIBrMe161QGaQoBQLqSUEKlHIiVgF3g/mb3lxlxzJOpIBhaP+C+KP2A==} + '@rollup/rollup-linux-x64-gnu@4.36.0': + resolution: {integrity: sha512-5KtoW8UWmwFKQ96aQL3LlRXX16IMwyzMq/jSSVIIyAANiE1doaQsx/KRyhAvpHlPjPiSU/AYX/8m+lQ9VToxFQ==} cpu: [x64] os: [linux] - '@rollup/rollup-linux-x64-musl@4.34.9': - resolution: {integrity: sha512-cYRpV4650z2I3/s6+5/LONkjIz8MBeqrk+vPXV10ORBnshpn8S32bPqQ2Utv39jCiDcO2eJTuSlPXpnvmaIgRA==} + '@rollup/rollup-linux-x64-musl@4.36.0': + resolution: {integrity: sha512-sycrYZPrv2ag4OCvaN5js+f01eoZ2U+RmT5as8vhxiFz+kxwlHrsxOwKPSA8WyS+Wc6Epid9QeI/IkQ9NkgYyQ==} cpu: [x64] os: [linux] - '@rollup/rollup-win32-arm64-msvc@4.34.9': - resolution: {integrity: sha512-z4mQK9dAN6byRA/vsSgQiPeuO63wdiDxZ9yg9iyX2QTzKuQM7T4xlBoeUP/J8uiFkqxkcWndWi+W7bXdPbt27Q==} + '@rollup/rollup-win32-arm64-msvc@4.36.0': + resolution: {integrity: sha512-qbqt4N7tokFwwSVlWDsjfoHgviS3n/vZ8LK0h1uLG9TYIRuUTJC88E1xb3LM2iqZ/WTqNQjYrtmtGmrmmawB6A==} cpu: [arm64] os: [win32] - '@rollup/rollup-win32-ia32-msvc@4.34.9': - resolution: {integrity: sha512-KB48mPtaoHy1AwDNkAJfHXvHp24H0ryZog28spEs0V48l3H1fr4i37tiyHsgKZJnCmvxsbATdZGBpbmxTE3a9w==} + '@rollup/rollup-win32-ia32-msvc@4.36.0': + resolution: {integrity: sha512-t+RY0JuRamIocMuQcfwYSOkmdX9dtkr1PbhKW42AMvaDQa+jOdpUYysroTF/nuPpAaQMWp7ye+ndlmmthieJrQ==} cpu: [ia32] os: [win32] - '@rollup/rollup-win32-x64-msvc@4.34.9': - resolution: {integrity: sha512-AyleYRPU7+rgkMWbEh71fQlrzRfeP6SyMnRf9XX4fCdDPAJumdSBqYEcWPMzVQ4ScAl7E4oFfK0GUVn77xSwbw==} + '@rollup/rollup-win32-x64-msvc@4.36.0': + resolution: {integrity: sha512-aRXd7tRZkWLqGbChgcMMDEHjOKudo1kChb1Jt1IfR8cY/KIpgNviLeJy5FUb9IpSuQj8dU2fAYNMPW/hLKOSTw==} cpu: [x64] os: [win32] @@ -1135,14 +1142,14 @@ packages: '@swc/helpers@0.5.15': resolution: {integrity: sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==} - '@tanstack/react-virtual@3.13.2': - resolution: {integrity: sha512-LceSUgABBKF6HSsHK2ZqHzQ37IKV/jlaWbHm+NyTa3/WNb/JZVcThDuTainf+PixltOOcFCYXwxbLpOX9sCx+g==} + '@tanstack/react-virtual@3.13.4': + resolution: {integrity: sha512-jPWC3BXvVLHsMX67NEHpJaZ+/FySoNxFfBEiF4GBc1+/nVwdRm+UcSCYnKP3pXQr0eEsDpXi/PQZhNfJNopH0g==} 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 - '@tanstack/virtual-core@3.13.2': - resolution: {integrity: sha512-Qzz4EgzMbO5gKrmqUondCjiHcuu4B1ftHb0pjCut661lXZdGoHeze9f/M8iwsK1t5LGR6aNuNGU7mxkowaW6RQ==} + '@tanstack/virtual-core@3.13.4': + resolution: {integrity: sha512-fNGO9fjjSLns87tlcto106enQQLycCKR4DPNpgq3djP5IdcPFdPAmaKjsgzIeRhH7hWrELgW12hYnRthS5kLUw==} '@theguild/remark-mermaid@0.2.0': resolution: {integrity: sha512-o8n57TJy0OI4PCrNw8z6S+vpHtrwoQZzTA5Y3fL0U1NDRIoMg/78duWgEBFsCZcWM1G6zjE91yg1aKCsDwgE2Q==} @@ -1287,8 +1294,8 @@ packages: '@types/node@12.20.55': resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} - '@types/node@22.13.9': - resolution: {integrity: sha512-acBjXdRJ3A6Pb3tqnw9HZmyR3Fiol3aGxRCK1x3d+6CDAMjl7I649wpSd+yNURCjbOUGu9tqtLKnTGxmK6CyGw==} + '@types/node@22.13.10': + resolution: {integrity: sha512-I6LPUvlRH+O6VRUqYOcMudhaIdUVWfsjnZavnsraHvpBwaEyMN29ry+0UVJhImYL16xsscu0aske3yA+uPOWfw==} '@types/react-dom@19.0.4': resolution: {integrity: sha512-4fSQ8vWFkg+TGhePfUzVmat3eC14TXYSsiiDSLI0dVLsrm9gZFABjPy/Qu6TKgl1tq1Bu1yDsuQgY3A3DOjCcg==} @@ -1307,51 +1314,51 @@ packages: '@types/unist@3.0.3': resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==} - '@typescript-eslint/eslint-plugin@8.26.0': - resolution: {integrity: sha512-cLr1J6pe56zjKYajK6SSSre6nl1Gj6xDp1TY0trpgPzjVbgDwd09v2Ws37LABxzkicmUjhEeg/fAUjPJJB1v5Q==} + '@typescript-eslint/eslint-plugin@8.26.1': + resolution: {integrity: sha512-2X3mwqsj9Bd3Ciz508ZUtoQQYpOhU/kWoUqIf49H8Z0+Vbh6UF/y0OEYp0Q0axOGzaBGs7QxRwq0knSQ8khQNA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: '@typescript-eslint/parser': ^8.0.0 || ^8.0.0-alpha.0 eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.9.0' - '@typescript-eslint/parser@8.26.0': - resolution: {integrity: sha512-mNtXP9LTVBy14ZF3o7JG69gRPBK/2QWtQd0j0oH26HcY/foyJJau6pNUez7QrM5UHnSvwlQcJXKsk0I99B9pOA==} + '@typescript-eslint/parser@8.26.1': + resolution: {integrity: sha512-w6HZUV4NWxqd8BdeFf81t07d7/YV9s7TCWrQQbG5uhuvGUAW+fq1usZ1Hmz9UPNLniFnD8GLSsDpjP0hm1S4lQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.9.0' - '@typescript-eslint/scope-manager@8.26.0': - resolution: {integrity: sha512-E0ntLvsfPqnPwng8b8y4OGuzh/iIOm2z8U3S9zic2TeMLW61u5IH2Q1wu0oSTkfrSzwbDJIB/Lm8O3//8BWMPA==} + '@typescript-eslint/scope-manager@8.26.1': + resolution: {integrity: sha512-6EIvbE5cNER8sqBu6V7+KeMZIC1664d2Yjt+B9EWUXrsyWpxx4lEZrmvxgSKRC6gX+efDL/UY9OpPZ267io3mg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/type-utils@8.26.0': - resolution: {integrity: sha512-ruk0RNChLKz3zKGn2LwXuVoeBcUMh+jaqzN461uMMdxy5H9epZqIBtYj7UiPXRuOpaALXGbmRuZQhmwHhaS04Q==} + '@typescript-eslint/type-utils@8.26.1': + resolution: {integrity: sha512-Kcj/TagJLwoY/5w9JGEFV0dclQdyqw9+VMndxOJKtoFSjfZhLXhYjzsQEeyza03rwHx2vFEGvrJWJBXKleRvZg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.9.0' - '@typescript-eslint/types@8.26.0': - resolution: {integrity: sha512-89B1eP3tnpr9A8L6PZlSjBvnJhWXtYfZhECqlBl1D9Lme9mHO6iWlsprBtVenQvY1HMhax1mWOjhtL3fh/u+pA==} + '@typescript-eslint/types@8.26.1': + resolution: {integrity: sha512-n4THUQW27VmQMx+3P+B0Yptl7ydfceUj4ON/AQILAASwgYdZ/2dhfymRMh5egRUrvK5lSmaOm77Ry+lmXPOgBQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/typescript-estree@8.26.0': - resolution: {integrity: sha512-tiJ1Hvy/V/oMVRTbEOIeemA2XoylimlDQ03CgPPNaHYZbpsc78Hmngnt+WXZfJX1pjQ711V7g0H7cSJThGYfPQ==} + '@typescript-eslint/typescript-estree@8.26.1': + resolution: {integrity: sha512-yUwPpUHDgdrv1QJ7YQal3cMVBGWfnuCdKbXw1yyjArax3353rEJP1ZA+4F8nOlQ3RfS2hUN/wze3nlY+ZOhvoA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <5.9.0' - '@typescript-eslint/utils@8.26.0': - resolution: {integrity: sha512-2L2tU3FVwhvU14LndnQCA2frYC8JnPDVKyQtWFPf8IYFMt/ykEN1bPolNhNbCVgOmdzTlWdusCTKA/9nKrf8Ig==} + '@typescript-eslint/utils@8.26.1': + resolution: {integrity: sha512-V4Urxa/XtSUroUrnI7q6yUTD3hDtfJ2jzVfeT3VK0ciizfK2q/zGC0iDh1lFMUZR8cImRrep6/q0xd/1ZGPQpg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.9.0' - '@typescript-eslint/visitor-keys@8.26.0': - resolution: {integrity: sha512-2z8JQJWAzPdDd51dRQ/oqIJxe99/hoLIqmf8RMCAJQtYDc535W/Jt2+RTP4bP0aKeBG1F65yjIZuczOXCmbWwg==} + '@typescript-eslint/visitor-keys@8.26.1': + resolution: {integrity: sha512-AjOC3zfnxd6S4Eiy3jwktJPclqhFHNyd8L6Gycf9WUPoKZpgM5PjkxY1X7uSy61xVpiJDhhk7XT2NVsN3ALTWg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@typescript/vfs@1.6.1': @@ -1362,11 +1369,11 @@ packages: '@ungap/structured-clone@1.3.0': resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} - '@vitest/expect@3.0.7': - resolution: {integrity: sha512-QP25f+YJhzPfHrHfYHtvRn+uvkCFCqFtW9CktfBxmB+25QqWsx7VB2As6f4GmwllHLDhXNHvqedwhvMmSnNmjw==} + '@vitest/expect@3.0.9': + resolution: {integrity: sha512-5eCqRItYgIML7NNVgJj6TVCmdzE7ZVgJhruW0ziSQV4V7PvLkDL1bBkBdcTs/VuIz0IxPb5da1IDSqc1TR9eig==} - '@vitest/mocker@3.0.7': - resolution: {integrity: sha512-qui+3BLz9Eonx4EAuR/i+QlCX6AUZ35taDQgwGkK/Tw6/WgwodSrjN1X2xf69IA/643ZX5zNKIn2svvtZDrs4w==} + '@vitest/mocker@3.0.9': + resolution: {integrity: sha512-ryERPIBOnvevAkTq+L1lD+DTFBRcjueL9lOUfXsLfwP92h4e+Heb+PjiqS3/OURWPtywfafK0kj++yDFjWUmrA==} peerDependencies: msw: ^2.4.9 vite: ^5.0.0 || ^6.0.0 @@ -1376,20 +1383,20 @@ packages: vite: optional: true - '@vitest/pretty-format@3.0.7': - resolution: {integrity: sha512-CiRY0BViD/V8uwuEzz9Yapyao+M9M008/9oMOSQydwbwb+CMokEq3XVaF3XK/VWaOK0Jm9z7ENhybg70Gtxsmg==} + '@vitest/pretty-format@3.0.9': + resolution: {integrity: sha512-OW9F8t2J3AwFEwENg3yMyKWweF7oRJlMyHOMIhO5F3n0+cgQAJZBjNgrF8dLwFTEXl5jUqBLXd9QyyKv8zEcmA==} - '@vitest/runner@3.0.7': - resolution: {integrity: sha512-WeEl38Z0S2ZcuRTeyYqaZtm4e26tq6ZFqh5y8YD9YxfWuu0OFiGFUbnxNynwLjNRHPsXyee2M9tV7YxOTPZl2g==} + '@vitest/runner@3.0.9': + resolution: {integrity: sha512-NX9oUXgF9HPfJSwl8tUZCMP1oGx2+Sf+ru6d05QjzQz4OwWg0psEzwY6VexP2tTHWdOkhKHUIZH+fS6nA7jfOw==} - '@vitest/snapshot@3.0.7': - resolution: {integrity: sha512-eqTUryJWQN0Rtf5yqCGTQWsCFOQe4eNz5Twsu21xYEcnFJtMU5XvmG0vgebhdLlrHQTSq5p8vWHJIeJQV8ovsA==} + '@vitest/snapshot@3.0.9': + resolution: {integrity: sha512-AiLUiuZ0FuA+/8i19mTYd+re5jqjEc2jZbgJ2up0VY0Ddyyxg/uUtBDpIFAy4uzKaQxOW8gMgBdAJJ2ydhu39A==} - '@vitest/spy@3.0.7': - resolution: {integrity: sha512-4T4WcsibB0B6hrKdAZTM37ekuyFZt2cGbEGd2+L0P8ov15J1/HUsUaqkXEQPNAWr4BtPPe1gI+FYfMHhEKfR8w==} + '@vitest/spy@3.0.9': + resolution: {integrity: sha512-/CcK2UDl0aQ2wtkp3YVWldrpLRNCfVcIOFGlVGKO4R5eajsH393Z1yiXLVQ7vWsj26JOEjeZI0x5sm5P4OGUNQ==} - '@vitest/utils@3.0.7': - resolution: {integrity: sha512-xePVpCRfooFX3rANQjwoditoXgWb1MaFbzmGuPP59MK6i13mrnDw/yEIyJudLeW6/38mCNcwCiJIGmpDPibAIg==} + '@vitest/utils@3.0.9': + resolution: {integrity: sha512-ilHM5fHhZ89MCp5aAaM9uhfl1c2JdxVxl3McqsdVyVNN6JffnEen8UMCdRTzOhGXNQGo5GNL9QugHrz727Wnng==} '@zeit/schemas@2.36.0': resolution: {integrity: sha512-7kjMwcChYEzMKjeex9ZFXkt1AyNov9R5HZtjBKVsmVpw7pa7ZtlCGvCBC2vnnXctaYN+aRI61HjIqeetZW5ROg==} @@ -1406,8 +1413,8 @@ packages: peerDependencies: acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 - acorn@8.14.0: - resolution: {integrity: sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==} + acorn@8.14.1: + resolution: {integrity: sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==} engines: {node: '>=0.4.0'} hasBin: true @@ -1548,8 +1555,8 @@ packages: avvio@9.1.0: resolution: {integrity: sha512-fYASnYi600CsH/j9EQov7lECAniYiBFiiAtBNuZYLA2leLe9qOvZzqYHFjtIj6gD2VMoMLP14834LFWvr4IfDw==} - axios@1.8.1: - resolution: {integrity: sha512-NN+fvwH/kV01dYUQ3PTOZns4LWtWhOFCAhQ/pHb88WQ1hNe5V/dvFwc4VJcDL11LT9xSX0QtsR8sWUuyOuOq7g==} + axios@1.8.3: + resolution: {integrity: sha512-iP4DebzoNlP/YN2dpwCgb8zoCmhtkajzS48JvwmkSkXvPI3DHc7m+XYL5tGnSlJtR6nImXZmdCuN5aP8dh1d8A==} bail@2.0.2: resolution: {integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==} @@ -1631,8 +1638,8 @@ packages: resolution: {integrity: sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw==} engines: {node: '>=14.16'} - caniuse-lite@1.0.30001702: - resolution: {integrity: sha512-LoPe/D7zioC0REI5W73PeR1e1MLCipRGq/VkovJnd6Df+QVqT+vT33OXCp8QUd7kA7RZrHWxb1B36OQKI/0gOA==} + caniuse-lite@1.0.30001705: + resolution: {integrity: sha512-S0uyMMiYvA7CxNgomYBwwwPUnWzFD83f3B1ce5jHUfHTH//QL6hHsreI8RVC5606R4ssqravelYO5TU6t8sEyg==} ccount@2.0.1: resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} @@ -2034,8 +2041,8 @@ packages: supports-color: optional: true - decode-named-character-reference@1.0.2: - resolution: {integrity: sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==} + decode-named-character-reference@1.1.0: + resolution: {integrity: sha512-Wy+JTSbFThEOXQIR2L6mxJvEs+veIzpmqD7ynWxMXGpnk3smkHQOp6forLdHsKpAMW9iJpaBBIxz285t1n1C3w==} deep-eql@5.0.2: resolution: {integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==} @@ -2189,8 +2196,8 @@ packages: esast-util-from-js@2.0.1: resolution: {integrity: sha512-8Ja+rNJ0Lt56Pcf3TAmpBZjmx8ZcK5Ts4cAzIOjsjevg9oSXJnl6SUQ2EevU8tv3h6ZLWmoKL5H4fgWvdvfETw==} - esbuild@0.25.0: - resolution: {integrity: sha512-BXq5mqc8ltbaN34cDqWuYKyNhX8D/Z0J1xdtdQ8UcIIIyJyz+ZMKUt58tF3SrZ85jcfN/PZYhjR5uDQAYNVbuw==} + esbuild@0.25.1: + resolution: {integrity: sha512-BGO5LtrGC7vxnqucAe/rmvKdJllfGaYWdyABvyMoXQlfYMb2bbRuReWR5tEGE//4LcNJj9XrkovTqNYRFZHAMQ==} engines: {node: '>=18'} hasBin: true @@ -2207,8 +2214,8 @@ packages: engines: {node: '>=6.0'} hasBin: true - eslint-config-prettier@10.0.2: - resolution: {integrity: sha512-1105/17ZIMjmCOJOPNfVdbXafLCLj3hPmkmB7dLgt7XsQ/zkxSuDerE/xgO3RxoHysR1N1whmquY0lSn2O0VLg==} + eslint-config-prettier@10.1.1: + resolution: {integrity: sha512-4EQQr6wXwS+ZJSzaR5ZCrYgLxqvUjdXctaEtBqHcbkW944B1NQyO4qpdHQbXBONfwxXdkAY81HH4+LUfrg+zPw==} hasBin: true peerDependencies: eslint: '>=7.0.0' @@ -2231,8 +2238,8 @@ packages: eslint: '>6.6.0' turbo: '>2.0.0' - eslint-scope@8.2.0: - resolution: {integrity: sha512-PHlWUfG6lvPc3yvP5A4PNyBL1W8fkDUccmI21JUu/+GKZBoH/W5u6usENXUrWFRsyoW5ACUjFGgAFQp5gUlb/A==} + eslint-scope@8.3.0: + resolution: {integrity: sha512-pUNxi75F8MJ/GdeKtVLSbYg4ZI34J6C0C7sbL4YOp2exGwen7ZsuBqKzUhXd0qMQ362yET3z+uPwKeg/0C2XCQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} eslint-visitor-keys@3.4.3: @@ -2243,8 +2250,8 @@ packages: resolution: {integrity: sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - eslint@9.21.0: - resolution: {integrity: sha512-KjeihdFqTPhOMXTt7StsDxriV4n66ueuF/jfPNC3j/lduHwr/ijDwJMsF+wyMJethgiKi5wniIE243vi07d3pg==} + eslint@9.22.0: + resolution: {integrity: sha512-9V/QURhsRN40xuHXWjV64yvrzMjcz7ZyNoF2jJFmy9j/SLk0u1OLSZgXi28MrXjymnjEGSR80WCdab3RGMDveQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} hasBin: true peerDependencies: @@ -2313,9 +2320,6 @@ packages: resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} engines: {node: '>=0.10.0'} - eventemitter2@0.4.14: - resolution: {integrity: sha512-K7J4xq5xAD5jHsGM5ReWXRTFa3JRGofHiMcVgQ8PRwgWxzjHpMWCIzsmyf60+mh8KLsqYPcjUMa0AC4hd6lPyQ==} - eventemitter2@5.0.1: resolution: {integrity: sha512-5EM1GHXycJBS6mauYAbVKT1cVs7POKWb2NXD4Vyt8dDqeZa7LaDK1/sjtL+Zb0lzTpSNil4596Dyu97hz37QLg==} @@ -2334,8 +2338,8 @@ packages: resolution: {integrity: sha512-80F22aiJ3GLyVnS/B3HzgR6RelZVumzj9jkL0Rhz4h0xYbNW9PjlQz5h3J/SShErbXBc295vseR4/MIbVmUbeA==} engines: {node: '>=12.0.0'} - exsolve@1.0.1: - resolution: {integrity: sha512-Smf0iQtkQVJLaph8r/qS8C8SWfQkaq9Q/dFcD44MLbJj6DNhlWefVuaS21SjfqOsBbjVlKtbCj6L9ekXK6EZUg==} + exsolve@1.0.4: + resolution: {integrity: sha512-xsZH6PXaER4XoV+NiT7JHp1bJodJVT+cxeSH1G0f0tlT0lJqYuHUP3bUx2HtfTDvOagMINYp8rsqusxud3RXhw==} extend@3.0.2: resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} @@ -2635,8 +2639,8 @@ packages: hast-util-to-html@9.0.5: resolution: {integrity: sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw==} - hast-util-to-jsx-runtime@2.3.5: - resolution: {integrity: sha512-gHD+HoFxOMmmXLuq9f2dZDMQHVcplCVpMfBNRpJsF03yyLZvJGzsFORe8orVuYDX9k2w0VH0uF8oryFd1whqKQ==} + hast-util-to-jsx-runtime@2.3.6: + resolution: {integrity: sha512-zl6s8LwNyo1P9uw+XJGvZtdFF1GdAkOg8ujOw+4Pyb76874fLps4ueHXDhXWdk6YHQ6OgUtinliG7RsYvCbbBg==} hast-util-to-parse5@8.0.0: resolution: {integrity: sha512-3KKrV5ZVI8if87DVSi1vDeByYrkGzg4mEfeu4alwgmmIeARiBLKCZS2uw5Gb6nU9x9Yufyj3iudm6i7nl52PFw==} @@ -2981,10 +2985,6 @@ packages: layout-base@2.0.1: resolution: {integrity: sha512-dp3s92+uNI1hWIpPGH3jK2kxE2lMjdXdr+DH8ynZHpd6PUlH6x6cbuXnoMmiNumznqaNO31xu9e79F0uuZ0JFg==} - lazy@1.0.11: - resolution: {integrity: sha512-Y+CjUfLmIpoUCCRl0ub4smrYtGGr5AOa2AKOaWelGHOGz33X/Y/KizefGqbkwfz44+cnq/+9habclf8vOmu2LA==} - engines: {node: '>=0.2.0'} - levn@0.4.1: resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} engines: {node: '>= 0.8.0'} @@ -3048,8 +3048,8 @@ packages: markdown-table@3.0.4: resolution: {integrity: sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==} - marked@13.0.3: - resolution: {integrity: sha512-rqRix3/TWzE9rIoFGIn8JmsVfhiuC8VIQ8IdX5TfzmeBucdY05/0UlzKaw0eVtpcN/OdVFpBk7CjKGo9iHJ/zA==} + marked@15.0.7: + resolution: {integrity: sha512-dgLIeKGLx5FwziAnsk4ONoGwHwGPJzselimvlVskE9XLN4Orv9u2VA3GWw/lYUqjfA0rUT/6fqKwfZJapP9BEg==} engines: {node: '>= 18'} hasBin: true @@ -3121,8 +3121,8 @@ packages: resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} engines: {node: '>= 8'} - mermaid@11.4.1: - resolution: {integrity: sha512-Mb01JT/x6CKDWaxigwfZYuYmDZ6xtrNwNlidKZwkSrDaY9n90tdrJTV5Umk+wP1fZscGptmKFXHsXMDEVZ+Q6A==} + mermaid@11.5.0: + resolution: {integrity: sha512-IYhyukID3zzDj1EihKiN1lp+PXNImoJ3Iyz73qeDAgnus4BNGsJV1n471P4PyeGxPVONerZxignwGxGTSwZnlg==} mhchemparser@4.2.1: resolution: {integrity: sha512-kYmyrCirqJf3zZ9t/0wGgRZ4/ZJw//VwaRVGA75C4nhE60vtnIzhl9J9ndkX/h6hxSN7pjg/cE0VxbnNM+bnDQ==} @@ -3307,8 +3307,8 @@ packages: mute-stream@0.0.8: resolution: {integrity: sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==} - nanoid@3.3.8: - resolution: {integrity: sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==} + nanoid@3.3.10: + resolution: {integrity: sha512-vSJJTG+t/dIKAUhUDw/dLdZ9s//5OxcHqLaDWWrW4Cdq7o6tdLIczUkMXt2MBNmk6sJRZBZRXVixs7URY1CmIg==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true @@ -3332,14 +3332,14 @@ packages: resolution: {integrity: sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==} engines: {node: '>= 0.4.0'} - next-themes@0.4.4: - resolution: {integrity: sha512-LDQ2qIOJF0VnuVrrMSMLrWGjRMkq+0mpgl6e0juCLqdJ+oo8Q84JRWT6Wh11VDQKkMMe+dVzDKLWs5n87T+PkQ==} + next-themes@0.4.6: + resolution: {integrity: sha512-pZvgD5L0IEvX5/9GWyHMf3m8BKiVQwsCMHfoFosXtXBMnaS0ZnIJ9ST4b4NqLVKDEm8QBxoNNGNaBv2JNF6XNA==} peerDependencies: react: ^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc react-dom: ^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc - next@15.2.0: - resolution: {integrity: sha512-VaiM7sZYX8KIAHBrRGSFytKknkrexNfGb8GlG6e93JqueCspuGte8i4ybn8z4ww1x3f2uzY4YpTaBEW4/hvsoQ==} + next@15.2.2: + resolution: {integrity: sha512-dgp8Kcx5XZRjMw2KNwBtUzhngRaURPioxoNIVl5BOyJbhi9CUgEtKDO7fx5wh8Z8vOVX1nYZ9meawJoRrlASYA==} engines: {node: ^18.18.0 || ^19.8.0 || >= 20.0.0} hasBin: true peerDependencies: @@ -3359,16 +3359,16 @@ packages: sass: optional: true - nextra-theme-docs@4.2.14: - resolution: {integrity: sha512-Z+eRIRMbssB8kgDjkucfqAd894+lga78cPiAcCD2YQY7VPyFFeYmXJIwpEiLmV3/13FtT1QVoJuMmRaUTjtJIQ==} + nextra-theme-docs@4.2.16: + resolution: {integrity: sha512-IbEf7A7qd2PWYZ8XlwIXNghZRPxbiTw1tbPejH/tNX6nmAHUNpCrDPQO/jraYSnEae2DSb/5ZOBdqMT1c03paQ==} peerDependencies: next: '>=14' - nextra: 4.2.14 + nextra: 4.2.16 react: '>=18' react-dom: '>=18' - nextra@4.2.14: - resolution: {integrity: sha512-Ur5hiWDLZUlSR4faLl7R1z6MEelH1vRWBIlcBP97N2qmQMFPfMIOMwjm+tscHcPlL5DoQ2F332P3RzTqdktyLQ==} + nextra@4.2.16: + resolution: {integrity: sha512-j0DNAWN1s6nzRtqS5L4PfVIk2BaD12V1nk/Cd1nRSHSF05vio6VmQ9+WZBbSvCrBjbnsRSflPBEP0cTs1y0lmQ==} engines: {node: '>=18'} peerDependencies: next: '>=14' @@ -3394,10 +3394,6 @@ packages: resolution: {integrity: sha512-tt6PvKu4WyzPwWUzy/hvPFqn+uwXO0K1ZHka8az3NnrhWJDmSqI8ncWq0fkL0k/lmmi5tAC11FXwXuh0rFbt1A==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - nssocket@0.6.0: - resolution: {integrity: sha512-a9GSOIql5IqgWJR3F/JXG4KpJTA3Z53Cj0MeMvGpglytB1nxE4PdFNC0jINe27CS7cGivoynwc054EzCcT3M3w==} - engines: {node: '>= 0.10.x'} - object-assign@4.1.1: resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} engines: {node: '>=0.10.0'} @@ -3414,8 +3410,8 @@ packages: resolution: {integrity: sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==} engines: {node: '>= 0.4'} - object.entries@1.1.8: - resolution: {integrity: sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ==} + object.entries@1.1.9: + resolution: {integrity: sha512-8u/hfXFRBD1O0hPUjioLhoWFHRmt6tKA4/vZPyckBr18l1KE9uHrFaFaUi8MDRTpi4uak2goyPTSNJLXX2k2Hw==} engines: {node: '>= 0.4'} object.fromentries@2.0.8: @@ -3603,13 +3599,13 @@ packages: pkg-types@2.1.0: resolution: {integrity: sha512-wmJwA+8ihJixSoHKxZJRBQG1oY8Yr9pGLzRmSsNms0iNWyHHAlZCa7mmKiFR10YPZuz/2k169JiS/inOjBCZ2A==} - playwright-core@1.50.1: - resolution: {integrity: sha512-ra9fsNWayuYumt+NiM069M6OkcRb1FZSK8bgi66AtpFoWkg2+y0bJSNmkFrWhMbEBbVKC/EruAHH3g0zmtwGmQ==} + playwright-core@1.51.1: + resolution: {integrity: sha512-/crRMj8+j/Nq5s8QcvegseuyeZPxpQCZb6HNk3Sos3BlZyAknRjoyJPFWkpNn8v0+P3WiwqFF8P+zQo4eqiNuw==} engines: {node: '>=18'} hasBin: true - playwright@1.50.1: - resolution: {integrity: sha512-G8rwsOQJ63XG6BbKj2w5rHeavFjy5zynBA9zsJMMtBoe/Uf757oG12NXz6e6OirF7RCrTVAKFXbLmn1RbL7Qaw==} + playwright@1.51.1: + resolution: {integrity: sha512-kkx+MB2KQRkyxjYPc3a0wLZZoDczmppyGJIvQ43l+aZihkaVvmu/21kiyaHeHjiFxjxNNFnUncKmcGIyOojsaw==} engines: {node: '>=18'} hasBin: true @@ -3631,9 +3627,9 @@ packages: pm2-sysmonit@1.2.8: resolution: {integrity: sha512-ACOhlONEXdCTVwKieBIQLSi2tQZ8eKinhcr9JpZSUAL8Qy0ajIgRtsLxG/lwPOW3JEKqPyw/UaHmTWhUzpP4kA==} - pm2@5.4.3: - resolution: {integrity: sha512-4/I1htIHzZk1Y67UgOCo4F1cJtas1kSds31N8zN0PybO230id1nigyjGuGFzUnGmUFPmrJ0On22fO1ChFlp7VQ==} - engines: {node: '>=12.0.0'} + pm2@6.0.5: + resolution: {integrity: sha512-+O43WPaEiwYbm6/XSpAOO1Rtya/Uof0n7x8hJZGfwIuepesNTIVArpZh4KqFfze0cvvqZMr0maTW3ifhvmyeMQ==} + engines: {node: '>=16.0.0'} hasBin: true points-on-curve@0.2.0: @@ -3691,8 +3687,8 @@ packages: property-information@7.0.0: resolution: {integrity: sha512-7D/qOz/+Y4X/rzSB6jKxKUsQnphO046ei8qxG59mtM3RG3DHgTK81HrxrmoDVINJb8NKT5ZsRbwHvQ6B68Iyhg==} - proxy-agent@6.3.1: - resolution: {integrity: sha512-Rb5RVBy1iyqOtNl15Cw/llpeLH8bsb37gM1FUfKQ+Wck6xHlbAhWGUFiTRHtkjqGTA5pSHz6+0hrPW/oECihPQ==} + proxy-agent@6.4.0: + resolution: {integrity: sha512-u0piLU+nCOHMgGjRbimiXmA9kM/L9EHh3zL81xCdp7m+Y2pHIsnmbdDoEDoAz5geaonNR6q6+yOPQs6n4T6sBQ==} engines: {node: '>= 14'} proxy-from-env@1.1.0: @@ -3906,8 +3902,8 @@ packages: robust-predicates@3.0.2: resolution: {integrity: sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg==} - rollup@4.34.9: - resolution: {integrity: sha512-nF5XYqWWp9hx/LrpC8sZvvvmq0TeTjQgaZHYmAgwysT9nh8sWnZhBnM8ZyVbbJFIQBLwHDNoMqsBZBbUo4U8sQ==} + rollup@4.36.0: + resolution: {integrity: sha512-zwATAXNQxUcd40zgtQG0ZafcRK4g004WtEl7kbuhTWPvf07PsfohXl39jVUvPF7jvNAIkKPQ2XrsDlWuxBd++Q==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true @@ -4382,8 +4378,8 @@ packages: resolution: {integrity: sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==} engines: {node: '>= 0.4'} - typescript-eslint@8.26.0: - resolution: {integrity: sha512-PtVz9nAnuNJuAVeUFvwztjuUgSnJInODAUx47VDwWPXzd5vismPOtPtt83tzNXyOjVQbPRp786D6WFW/M2koIA==} + typescript-eslint@8.26.1: + resolution: {integrity: sha512-t/oIs9mYyrwZGRpDv3g+3K6nZ5uhKEMt2oNmAPwaY4/ye0+EH4nXIPYNtkYFS6QHm+1DFg34DbglYBz5P9Xysg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 @@ -4459,8 +4455,8 @@ packages: uri-js@4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} - uuid@9.0.1: - resolution: {integrity: sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==} + uuid@11.1.0: + resolution: {integrity: sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A==} hasBin: true vary@1.1.2: @@ -4476,13 +4472,13 @@ packages: vfile@6.0.3: resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==} - vite-node@3.0.7: - resolution: {integrity: sha512-2fX0QwX4GkkkpULXdT1Pf4q0tC1i1lFOyseKoonavXUNlQ77KpW2XqBGGNIm/J4Ows4KxgGJzDguYVPKwG/n5A==} + vite-node@3.0.9: + resolution: {integrity: sha512-w3Gdx7jDcuT9cNn9jExXgOyKmf5UOTb6WMHz8LGAm54eS1Elf5OuBhCxl6zJxGhEeIkgsE1WbHuoL0mj/UXqXg==} engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} hasBin: true - vite@6.2.0: - resolution: {integrity: sha512-7dPxoo+WsT/64rDcwoOjk76XHj+TqNTIvHKcuMQ1k4/SeHDaQt5GFAeLYzrimZrMpn/O6DtdI03WUjdxuPM0oQ==} + vite@6.2.2: + resolution: {integrity: sha512-yW7PeMM+LkDzc7CgJuRLMW2Jz0FxMOsVJ8Lv3gpgW9WLcb9cTW+121UEr1hvmfR7w3SegR5ItvYyzVz1vxNJgQ==} engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} hasBin: true peerDependencies: @@ -4521,16 +4517,16 @@ packages: yaml: optional: true - vitest@3.0.7: - resolution: {integrity: sha512-IP7gPK3LS3Fvn44x30X1dM9vtawm0aesAa2yBIZ9vQf+qB69NXC5776+Qmcr7ohUXIQuLhk7xQR0aSUIDPqavg==} + vitest@3.0.9: + resolution: {integrity: sha512-BbcFDqNyBlfSpATmTtXOAOj71RNKDDvjBM/uPfnxxVGrG+FSH2RQIwgeEngTaTkuU/h0ScFvf+tRcKfYXzBybQ==} engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} hasBin: true peerDependencies: '@edge-runtime/vm': '*' '@types/debug': ^4.1.12 '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 - '@vitest/browser': 3.0.7 - '@vitest/ui': 3.0.7 + '@vitest/browser': 3.0.9 + '@vitest/ui': 3.0.9 happy-dom: '*' jsdom: '*' peerDependenciesMeta: @@ -4588,8 +4584,8 @@ packages: resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==} engines: {node: '>= 0.4'} - which-typed-array@1.1.18: - resolution: {integrity: sha512-qEcY+KJYlWyLH9vNbsr6/5j59AXk5ni5aakf8ldzBvGde6Iz4sxZGkJyWSAueTG7QhOvNRYb1lDdFmL5Td0QKA==} + which-typed-array@1.1.19: + resolution: {integrity: sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==} engines: {node: '>= 0.4'} which@2.0.2: @@ -4687,7 +4683,7 @@ snapshots: '@antfu/utils@8.1.1': {} - '@babel/runtime@7.26.9': + '@babel/runtime@7.26.10': dependencies: regenerator-runtime: 0.14.1 @@ -4892,84 +4888,84 @@ snapshots: tslib: 2.8.1 optional: true - '@esbuild/aix-ppc64@0.25.0': + '@esbuild/aix-ppc64@0.25.1': optional: true - '@esbuild/android-arm64@0.25.0': + '@esbuild/android-arm64@0.25.1': optional: true - '@esbuild/android-arm@0.25.0': + '@esbuild/android-arm@0.25.1': optional: true - '@esbuild/android-x64@0.25.0': + '@esbuild/android-x64@0.25.1': optional: true - '@esbuild/darwin-arm64@0.25.0': + '@esbuild/darwin-arm64@0.25.1': optional: true - '@esbuild/darwin-x64@0.25.0': + '@esbuild/darwin-x64@0.25.1': optional: true - '@esbuild/freebsd-arm64@0.25.0': + '@esbuild/freebsd-arm64@0.25.1': optional: true - '@esbuild/freebsd-x64@0.25.0': + '@esbuild/freebsd-x64@0.25.1': optional: true - '@esbuild/linux-arm64@0.25.0': + '@esbuild/linux-arm64@0.25.1': optional: true - '@esbuild/linux-arm@0.25.0': + '@esbuild/linux-arm@0.25.1': optional: true - '@esbuild/linux-ia32@0.25.0': + '@esbuild/linux-ia32@0.25.1': optional: true - '@esbuild/linux-loong64@0.25.0': + '@esbuild/linux-loong64@0.25.1': optional: true - '@esbuild/linux-mips64el@0.25.0': + '@esbuild/linux-mips64el@0.25.1': optional: true - '@esbuild/linux-ppc64@0.25.0': + '@esbuild/linux-ppc64@0.25.1': optional: true - '@esbuild/linux-riscv64@0.25.0': + '@esbuild/linux-riscv64@0.25.1': optional: true - '@esbuild/linux-s390x@0.25.0': + '@esbuild/linux-s390x@0.25.1': optional: true - '@esbuild/linux-x64@0.25.0': + '@esbuild/linux-x64@0.25.1': optional: true - '@esbuild/netbsd-arm64@0.25.0': + '@esbuild/netbsd-arm64@0.25.1': optional: true - '@esbuild/netbsd-x64@0.25.0': + '@esbuild/netbsd-x64@0.25.1': optional: true - '@esbuild/openbsd-arm64@0.25.0': + '@esbuild/openbsd-arm64@0.25.1': optional: true - '@esbuild/openbsd-x64@0.25.0': + '@esbuild/openbsd-x64@0.25.1': optional: true - '@esbuild/sunos-x64@0.25.0': + '@esbuild/sunos-x64@0.25.1': optional: true - '@esbuild/win32-arm64@0.25.0': + '@esbuild/win32-arm64@0.25.1': optional: true - '@esbuild/win32-ia32@0.25.0': + '@esbuild/win32-ia32@0.25.1': optional: true - '@esbuild/win32-x64@0.25.0': + '@esbuild/win32-x64@0.25.1': optional: true - '@eslint-community/eslint-utils@4.4.1(eslint@9.21.0)': + '@eslint-community/eslint-utils@4.5.1(eslint@9.22.0)': dependencies: - eslint: 9.21.0 + eslint: 9.22.0 eslint-visitor-keys: 3.4.3 '@eslint-community/regexpp@4.12.1': {} @@ -4982,6 +4978,8 @@ snapshots: transitivePeerDependencies: - supports-color + '@eslint/config-helpers@0.1.0': {} + '@eslint/core@0.12.0': dependencies: '@types/json-schema': 7.0.15 @@ -5000,7 +4998,7 @@ snapshots: transitivePeerDependencies: - supports-color - '@eslint/js@9.21.0': {} + '@eslint/js@9.22.0': {} '@eslint/object-schema@2.1.6': {} @@ -5015,7 +5013,7 @@ snapshots: ajv-formats: 3.0.1(ajv@8.17.1) fast-uri: 3.0.6 - '@fastify/error@4.0.0': {} + '@fastify/error@4.1.0': {} '@fastify/fast-json-stringify-compiler@5.0.2': dependencies: @@ -5064,9 +5062,9 @@ snapshots: '@headlessui/react@2.2.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: '@floating-ui/react': 0.26.28(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@react-aria/focus': 3.19.1(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@react-aria/interactions': 3.23.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@tanstack/react-virtual': 3.13.2(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@react-aria/focus': 3.20.1(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@react-aria/interactions': 3.24.1(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@tanstack/react-virtual': 3.13.4(react-dom@19.0.0(react@19.0.0))(react@19.0.0) react: 19.0.0 react-dom: 19.0.0(react@19.0.0) @@ -5177,21 +5175,21 @@ snapshots: '@manypkg/find-root@1.1.0': dependencies: - '@babel/runtime': 7.26.9 + '@babel/runtime': 7.26.10 '@types/node': 12.20.55 find-up: 4.1.0 fs-extra: 8.1.0 '@manypkg/get-packages@1.1.3': dependencies: - '@babel/runtime': 7.26.9 + '@babel/runtime': 7.26.10 '@changesets/types': 4.1.0 '@manypkg/find-root': 1.1.0 fs-extra: 8.1.0 globby: 11.1.0 read-yaml-file: 1.1.0 - '@mdx-js/mdx@3.1.0(acorn@8.14.0)': + '@mdx-js/mdx@3.1.0(acorn@8.14.1)': dependencies: '@types/estree': 1.0.6 '@types/estree-jsx': 1.0.5 @@ -5202,10 +5200,10 @@ snapshots: estree-util-is-identifier-name: 3.0.0 estree-util-scope: 1.0.0 estree-walker: 3.0.3 - hast-util-to-jsx-runtime: 2.3.5 + hast-util-to-jsx-runtime: 2.3.6 markdown-extensions: 2.0.0 recma-build-jsx: 1.0.0 - recma-jsx: 1.0.0(acorn@8.14.0) + recma-jsx: 1.0.0(acorn@8.14.1) recma-stringify: 1.0.0 rehype-recma: 1.0.0 remark-mdx: 3.1.0 @@ -5284,34 +5282,34 @@ snapshots: '@napi-rs/simple-git-win32-arm64-msvc': 0.1.19 '@napi-rs/simple-git-win32-x64-msvc': 0.1.19 - '@next/env@15.2.0': {} + '@next/env@15.2.2': {} - '@next/eslint-plugin-next@15.2.0': + '@next/eslint-plugin-next@15.2.2': dependencies: fast-glob: 3.3.1 - '@next/swc-darwin-arm64@15.2.0': + '@next/swc-darwin-arm64@15.2.2': optional: true - '@next/swc-darwin-x64@15.2.0': + '@next/swc-darwin-x64@15.2.2': optional: true - '@next/swc-linux-arm64-gnu@15.2.0': + '@next/swc-linux-arm64-gnu@15.2.2': optional: true - '@next/swc-linux-arm64-musl@15.2.0': + '@next/swc-linux-arm64-musl@15.2.2': optional: true - '@next/swc-linux-x64-gnu@15.2.0': + '@next/swc-linux-x64-gnu@15.2.2': optional: true - '@next/swc-linux-x64-musl@15.2.0': + '@next/swc-linux-x64-musl@15.2.2': optional: true - '@next/swc-win32-arm64-msvc@15.2.0': + '@next/swc-win32-arm64-msvc@15.2.2': optional: true - '@next/swc-win32-x64-msvc@15.2.0': + '@next/swc-win32-x64-msvc@15.2.2': optional: true '@nodelib/fs.scandir@2.1.5': @@ -5343,11 +5341,11 @@ snapshots: '@pkgr/core@0.1.1': {} - '@playwright/test@1.50.1': + '@playwright/test@1.51.1': dependencies: - playwright: 1.50.1 + playwright: 1.51.1 - '@pm2/agent@2.0.4': + '@pm2/agent@2.1.1': dependencies: async: 3.2.6 chalk: 3.0.0 @@ -5356,10 +5354,9 @@ snapshots: eventemitter2: 5.0.1 fast-json-patch: 3.1.1 fclone: 1.0.11 - nssocket: 0.6.0 pm2-axon: 4.0.1 pm2-axon-rpc: 0.7.1 - proxy-agent: 6.3.1 + proxy-agent: 6.4.0 semver: 7.5.4 ws: 7.5.10 transitivePeerDependencies: @@ -5367,7 +5364,7 @@ snapshots: - supports-color - utf-8-validate - '@pm2/io@6.0.1': + '@pm2/io@6.1.0': dependencies: async: 2.6.4 debug: 4.3.7 @@ -5398,21 +5395,22 @@ snapshots: transitivePeerDependencies: - supports-color - '@react-aria/focus@3.19.1(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + '@react-aria/focus@3.20.1(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: - '@react-aria/interactions': 3.23.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@react-aria/utils': 3.27.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@react-types/shared': 3.27.0(react@19.0.0) + '@react-aria/interactions': 3.24.1(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@react-aria/utils': 3.28.1(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@react-types/shared': 3.28.0(react@19.0.0) '@swc/helpers': 0.5.15 clsx: 2.1.1 react: 19.0.0 react-dom: 19.0.0(react@19.0.0) - '@react-aria/interactions@3.23.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + '@react-aria/interactions@3.24.1(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: '@react-aria/ssr': 3.9.7(react@19.0.0) - '@react-aria/utils': 3.27.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@react-types/shared': 3.27.0(react@19.0.0) + '@react-aria/utils': 3.28.1(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@react-stately/flags': 3.1.0 + '@react-types/shared': 3.28.0(react@19.0.0) '@swc/helpers': 0.5.15 react: 19.0.0 react-dom: 19.0.0(react@19.0.0) @@ -5422,22 +5420,27 @@ snapshots: '@swc/helpers': 0.5.15 react: 19.0.0 - '@react-aria/utils@3.27.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + '@react-aria/utils@3.28.1(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: '@react-aria/ssr': 3.9.7(react@19.0.0) + '@react-stately/flags': 3.1.0 '@react-stately/utils': 3.10.5(react@19.0.0) - '@react-types/shared': 3.27.0(react@19.0.0) + '@react-types/shared': 3.28.0(react@19.0.0) '@swc/helpers': 0.5.15 clsx: 2.1.1 react: 19.0.0 react-dom: 19.0.0(react@19.0.0) + '@react-stately/flags@3.1.0': + dependencies: + '@swc/helpers': 0.5.15 + '@react-stately/utils@3.10.5(react@19.0.0)': dependencies: '@swc/helpers': 0.5.15 react: 19.0.0 - '@react-types/shared@3.27.0(react@19.0.0)': + '@react-types/shared@3.28.0(react@19.0.0)': dependencies: react: 19.0.0 @@ -5467,61 +5470,61 @@ snapshots: dependencies: '@redis/client': 1.6.0 - '@rollup/rollup-android-arm-eabi@4.34.9': + '@rollup/rollup-android-arm-eabi@4.36.0': optional: true - '@rollup/rollup-android-arm64@4.34.9': + '@rollup/rollup-android-arm64@4.36.0': optional: true - '@rollup/rollup-darwin-arm64@4.34.9': + '@rollup/rollup-darwin-arm64@4.36.0': optional: true - '@rollup/rollup-darwin-x64@4.34.9': + '@rollup/rollup-darwin-x64@4.36.0': optional: true - '@rollup/rollup-freebsd-arm64@4.34.9': + '@rollup/rollup-freebsd-arm64@4.36.0': optional: true - '@rollup/rollup-freebsd-x64@4.34.9': + '@rollup/rollup-freebsd-x64@4.36.0': optional: true - '@rollup/rollup-linux-arm-gnueabihf@4.34.9': + '@rollup/rollup-linux-arm-gnueabihf@4.36.0': optional: true - '@rollup/rollup-linux-arm-musleabihf@4.34.9': + '@rollup/rollup-linux-arm-musleabihf@4.36.0': optional: true - '@rollup/rollup-linux-arm64-gnu@4.34.9': + '@rollup/rollup-linux-arm64-gnu@4.36.0': optional: true - '@rollup/rollup-linux-arm64-musl@4.34.9': + '@rollup/rollup-linux-arm64-musl@4.36.0': optional: true - '@rollup/rollup-linux-loongarch64-gnu@4.34.9': + '@rollup/rollup-linux-loongarch64-gnu@4.36.0': optional: true - '@rollup/rollup-linux-powerpc64le-gnu@4.34.9': + '@rollup/rollup-linux-powerpc64le-gnu@4.36.0': optional: true - '@rollup/rollup-linux-riscv64-gnu@4.34.9': + '@rollup/rollup-linux-riscv64-gnu@4.36.0': optional: true - '@rollup/rollup-linux-s390x-gnu@4.34.9': + '@rollup/rollup-linux-s390x-gnu@4.36.0': optional: true - '@rollup/rollup-linux-x64-gnu@4.34.9': + '@rollup/rollup-linux-x64-gnu@4.36.0': optional: true - '@rollup/rollup-linux-x64-musl@4.34.9': + '@rollup/rollup-linux-x64-musl@4.36.0': optional: true - '@rollup/rollup-win32-arm64-msvc@4.34.9': + '@rollup/rollup-win32-arm64-msvc@4.36.0': optional: true - '@rollup/rollup-win32-ia32-msvc@4.34.9': + '@rollup/rollup-win32-ia32-msvc@4.36.0': optional: true - '@rollup/rollup-win32-x64-msvc@4.34.9': + '@rollup/rollup-win32-x64-msvc@4.36.0': optional: true '@shikijs/core@2.5.0': @@ -5574,17 +5577,17 @@ snapshots: dependencies: tslib: 2.8.1 - '@tanstack/react-virtual@3.13.2(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + '@tanstack/react-virtual@3.13.4(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: - '@tanstack/virtual-core': 3.13.2 + '@tanstack/virtual-core': 3.13.4 react: 19.0.0 react-dom: 19.0.0(react@19.0.0) - '@tanstack/virtual-core@3.13.2': {} + '@tanstack/virtual-core@3.13.4': {} '@theguild/remark-mermaid@0.2.0(react@19.0.0)': dependencies: - mermaid: 11.4.1 + mermaid: 11.5.0 react: 19.0.0 unist-util-visit: 5.0.0 transitivePeerDependencies: @@ -5752,7 +5755,7 @@ snapshots: '@types/node@12.20.55': {} - '@types/node@22.13.9': + '@types/node@22.13.10': dependencies: undici-types: 6.20.0 @@ -5771,15 +5774,15 @@ snapshots: '@types/unist@3.0.3': {} - '@typescript-eslint/eslint-plugin@8.26.0(@typescript-eslint/parser@8.26.0(eslint@9.21.0)(typescript@5.8.2))(eslint@9.21.0)(typescript@5.8.2)': + '@typescript-eslint/eslint-plugin@8.26.1(@typescript-eslint/parser@8.26.1(eslint@9.22.0)(typescript@5.8.2))(eslint@9.22.0)(typescript@5.8.2)': dependencies: '@eslint-community/regexpp': 4.12.1 - '@typescript-eslint/parser': 8.26.0(eslint@9.21.0)(typescript@5.8.2) - '@typescript-eslint/scope-manager': 8.26.0 - '@typescript-eslint/type-utils': 8.26.0(eslint@9.21.0)(typescript@5.8.2) - '@typescript-eslint/utils': 8.26.0(eslint@9.21.0)(typescript@5.8.2) - '@typescript-eslint/visitor-keys': 8.26.0 - eslint: 9.21.0 + '@typescript-eslint/parser': 8.26.1(eslint@9.22.0)(typescript@5.8.2) + '@typescript-eslint/scope-manager': 8.26.1 + '@typescript-eslint/type-utils': 8.26.1(eslint@9.22.0)(typescript@5.8.2) + '@typescript-eslint/utils': 8.26.1(eslint@9.22.0)(typescript@5.8.2) + '@typescript-eslint/visitor-keys': 8.26.1 + eslint: 9.22.0 graphemer: 1.4.0 ignore: 5.3.2 natural-compare: 1.4.0 @@ -5788,40 +5791,40 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.26.0(eslint@9.21.0)(typescript@5.8.2)': + '@typescript-eslint/parser@8.26.1(eslint@9.22.0)(typescript@5.8.2)': dependencies: - '@typescript-eslint/scope-manager': 8.26.0 - '@typescript-eslint/types': 8.26.0 - '@typescript-eslint/typescript-estree': 8.26.0(typescript@5.8.2) - '@typescript-eslint/visitor-keys': 8.26.0 + '@typescript-eslint/scope-manager': 8.26.1 + '@typescript-eslint/types': 8.26.1 + '@typescript-eslint/typescript-estree': 8.26.1(typescript@5.8.2) + '@typescript-eslint/visitor-keys': 8.26.1 debug: 4.4.0 - eslint: 9.21.0 + eslint: 9.22.0 typescript: 5.8.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/scope-manager@8.26.0': + '@typescript-eslint/scope-manager@8.26.1': dependencies: - '@typescript-eslint/types': 8.26.0 - '@typescript-eslint/visitor-keys': 8.26.0 + '@typescript-eslint/types': 8.26.1 + '@typescript-eslint/visitor-keys': 8.26.1 - '@typescript-eslint/type-utils@8.26.0(eslint@9.21.0)(typescript@5.8.2)': + '@typescript-eslint/type-utils@8.26.1(eslint@9.22.0)(typescript@5.8.2)': dependencies: - '@typescript-eslint/typescript-estree': 8.26.0(typescript@5.8.2) - '@typescript-eslint/utils': 8.26.0(eslint@9.21.0)(typescript@5.8.2) + '@typescript-eslint/typescript-estree': 8.26.1(typescript@5.8.2) + '@typescript-eslint/utils': 8.26.1(eslint@9.22.0)(typescript@5.8.2) debug: 4.4.0 - eslint: 9.21.0 + eslint: 9.22.0 ts-api-utils: 2.0.1(typescript@5.8.2) typescript: 5.8.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/types@8.26.0': {} + '@typescript-eslint/types@8.26.1': {} - '@typescript-eslint/typescript-estree@8.26.0(typescript@5.8.2)': + '@typescript-eslint/typescript-estree@8.26.1(typescript@5.8.2)': dependencies: - '@typescript-eslint/types': 8.26.0 - '@typescript-eslint/visitor-keys': 8.26.0 + '@typescript-eslint/types': 8.26.1 + '@typescript-eslint/visitor-keys': 8.26.1 debug: 4.4.0 fast-glob: 3.3.3 is-glob: 4.0.3 @@ -5832,20 +5835,20 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.26.0(eslint@9.21.0)(typescript@5.8.2)': + '@typescript-eslint/utils@8.26.1(eslint@9.22.0)(typescript@5.8.2)': dependencies: - '@eslint-community/eslint-utils': 4.4.1(eslint@9.21.0) - '@typescript-eslint/scope-manager': 8.26.0 - '@typescript-eslint/types': 8.26.0 - '@typescript-eslint/typescript-estree': 8.26.0(typescript@5.8.2) - eslint: 9.21.0 + '@eslint-community/eslint-utils': 4.5.1(eslint@9.22.0) + '@typescript-eslint/scope-manager': 8.26.1 + '@typescript-eslint/types': 8.26.1 + '@typescript-eslint/typescript-estree': 8.26.1(typescript@5.8.2) + eslint: 9.22.0 typescript: 5.8.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/visitor-keys@8.26.0': + '@typescript-eslint/visitor-keys@8.26.1': dependencies: - '@typescript-eslint/types': 8.26.0 + '@typescript-eslint/types': 8.26.1 eslint-visitor-keys: 4.2.0 '@typescript/vfs@1.6.1(typescript@5.8.2)': @@ -5857,43 +5860,43 @@ snapshots: '@ungap/structured-clone@1.3.0': {} - '@vitest/expect@3.0.7': + '@vitest/expect@3.0.9': dependencies: - '@vitest/spy': 3.0.7 - '@vitest/utils': 3.0.7 + '@vitest/spy': 3.0.9 + '@vitest/utils': 3.0.9 chai: 5.2.0 tinyrainbow: 2.0.0 - '@vitest/mocker@3.0.7(vite@6.2.0(@types/node@22.13.9)(tsx@4.19.3)(yaml@2.7.0))': + '@vitest/mocker@3.0.9(vite@6.2.2(@types/node@22.13.10)(tsx@4.19.3)(yaml@2.7.0))': dependencies: - '@vitest/spy': 3.0.7 + '@vitest/spy': 3.0.9 estree-walker: 3.0.3 magic-string: 0.30.17 optionalDependencies: - vite: 6.2.0(@types/node@22.13.9)(tsx@4.19.3)(yaml@2.7.0) + vite: 6.2.2(@types/node@22.13.10)(tsx@4.19.3)(yaml@2.7.0) - '@vitest/pretty-format@3.0.7': + '@vitest/pretty-format@3.0.9': dependencies: tinyrainbow: 2.0.0 - '@vitest/runner@3.0.7': + '@vitest/runner@3.0.9': dependencies: - '@vitest/utils': 3.0.7 + '@vitest/utils': 3.0.9 pathe: 2.0.3 - '@vitest/snapshot@3.0.7': + '@vitest/snapshot@3.0.9': dependencies: - '@vitest/pretty-format': 3.0.7 + '@vitest/pretty-format': 3.0.9 magic-string: 0.30.17 pathe: 2.0.3 - '@vitest/spy@3.0.7': + '@vitest/spy@3.0.9': dependencies: tinyspy: 3.0.2 - '@vitest/utils@3.0.7': + '@vitest/utils@3.0.9': dependencies: - '@vitest/pretty-format': 3.0.7 + '@vitest/pretty-format': 3.0.9 loupe: 3.1.3 tinyrainbow: 2.0.0 @@ -5906,11 +5909,11 @@ snapshots: mime-types: 2.1.35 negotiator: 0.6.3 - acorn-jsx@5.3.2(acorn@8.14.0): + acorn-jsx@5.3.2(acorn@8.14.1): dependencies: - acorn: 8.14.0 + acorn: 8.14.1 - acorn@8.14.0: {} + acorn@8.14.1: {} agent-base@7.1.3: {} @@ -6061,10 +6064,10 @@ snapshots: avvio@9.1.0: dependencies: - '@fastify/error': 4.0.0 + '@fastify/error': 4.1.0 fastq: 1.19.1 - axios@1.8.1: + axios@1.8.3: dependencies: follow-redirects: 1.15.9(debug@4.3.7) form-data: 4.0.2 @@ -6148,7 +6151,7 @@ snapshots: camelcase@7.0.1: {} - caniuse-lite@1.0.30001702: {} + caniuse-lite@1.0.30001705: {} ccount@2.0.1: {} @@ -6558,7 +6561,7 @@ snapshots: dependencies: ms: 2.1.3 - decode-named-character-reference@1.0.2: + decode-named-character-reference@1.1.0: dependencies: character-entities: 2.0.2 @@ -6713,7 +6716,7 @@ snapshots: typed-array-byte-offset: 1.0.4 typed-array-length: 1.0.7 unbox-primitive: 1.1.0 - which-typed-array: 1.1.18 + which-typed-array: 1.1.19 es-define-property@1.0.1: {} @@ -6771,37 +6774,37 @@ snapshots: esast-util-from-js@2.0.1: dependencies: '@types/estree-jsx': 1.0.5 - acorn: 8.14.0 + acorn: 8.14.1 esast-util-from-estree: 2.0.0 vfile-message: 4.0.2 - esbuild@0.25.0: + esbuild@0.25.1: optionalDependencies: - '@esbuild/aix-ppc64': 0.25.0 - '@esbuild/android-arm': 0.25.0 - '@esbuild/android-arm64': 0.25.0 - '@esbuild/android-x64': 0.25.0 - '@esbuild/darwin-arm64': 0.25.0 - '@esbuild/darwin-x64': 0.25.0 - '@esbuild/freebsd-arm64': 0.25.0 - '@esbuild/freebsd-x64': 0.25.0 - '@esbuild/linux-arm': 0.25.0 - '@esbuild/linux-arm64': 0.25.0 - '@esbuild/linux-ia32': 0.25.0 - '@esbuild/linux-loong64': 0.25.0 - '@esbuild/linux-mips64el': 0.25.0 - '@esbuild/linux-ppc64': 0.25.0 - '@esbuild/linux-riscv64': 0.25.0 - '@esbuild/linux-s390x': 0.25.0 - '@esbuild/linux-x64': 0.25.0 - '@esbuild/netbsd-arm64': 0.25.0 - '@esbuild/netbsd-x64': 0.25.0 - '@esbuild/openbsd-arm64': 0.25.0 - '@esbuild/openbsd-x64': 0.25.0 - '@esbuild/sunos-x64': 0.25.0 - '@esbuild/win32-arm64': 0.25.0 - '@esbuild/win32-ia32': 0.25.0 - '@esbuild/win32-x64': 0.25.0 + '@esbuild/aix-ppc64': 0.25.1 + '@esbuild/android-arm': 0.25.1 + '@esbuild/android-arm64': 0.25.1 + '@esbuild/android-x64': 0.25.1 + '@esbuild/darwin-arm64': 0.25.1 + '@esbuild/darwin-x64': 0.25.1 + '@esbuild/freebsd-arm64': 0.25.1 + '@esbuild/freebsd-x64': 0.25.1 + '@esbuild/linux-arm': 0.25.1 + '@esbuild/linux-arm64': 0.25.1 + '@esbuild/linux-ia32': 0.25.1 + '@esbuild/linux-loong64': 0.25.1 + '@esbuild/linux-mips64el': 0.25.1 + '@esbuild/linux-ppc64': 0.25.1 + '@esbuild/linux-riscv64': 0.25.1 + '@esbuild/linux-s390x': 0.25.1 + '@esbuild/linux-x64': 0.25.1 + '@esbuild/netbsd-arm64': 0.25.1 + '@esbuild/netbsd-x64': 0.25.1 + '@esbuild/openbsd-arm64': 0.25.1 + '@esbuild/openbsd-x64': 0.25.1 + '@esbuild/sunos-x64': 0.25.1 + '@esbuild/win32-arm64': 0.25.1 + '@esbuild/win32-ia32': 0.25.1 + '@esbuild/win32-x64': 0.25.1 escape-string-regexp@4.0.0: {} @@ -6815,15 +6818,15 @@ snapshots: optionalDependencies: source-map: 0.6.1 - eslint-config-prettier@10.0.2(eslint@9.21.0): + eslint-config-prettier@10.1.1(eslint@9.22.0): dependencies: - eslint: 9.21.0 + eslint: 9.22.0 - eslint-plugin-react-hooks@5.2.0(eslint@9.21.0): + eslint-plugin-react-hooks@5.2.0(eslint@9.22.0): dependencies: - eslint: 9.21.0 + eslint: 9.22.0 - eslint-plugin-react@7.37.4(eslint@9.21.0): + eslint-plugin-react@7.37.4(eslint@9.22.0): dependencies: array-includes: 3.1.8 array.prototype.findlast: 1.2.5 @@ -6831,12 +6834,12 @@ snapshots: array.prototype.tosorted: 1.1.4 doctrine: 2.1.0 es-iterator-helpers: 1.2.1 - eslint: 9.21.0 + eslint: 9.22.0 estraverse: 5.3.0 hasown: 2.0.2 jsx-ast-utils: 3.3.5 minimatch: 3.1.2 - object.entries: 1.1.8 + object.entries: 1.1.9 object.fromentries: 2.0.8 object.values: 1.2.1 prop-types: 15.8.1 @@ -6845,13 +6848,13 @@ snapshots: string.prototype.matchall: 4.0.12 string.prototype.repeat: 1.0.0 - eslint-plugin-turbo@2.4.4(eslint@9.21.0)(turbo@2.4.4): + eslint-plugin-turbo@2.4.4(eslint@9.22.0)(turbo@2.4.4): dependencies: dotenv: 16.0.3 - eslint: 9.21.0 + eslint: 9.22.0 turbo: 2.4.4 - eslint-scope@8.2.0: + eslint-scope@8.3.0: dependencies: esrecurse: 4.3.0 estraverse: 5.3.0 @@ -6860,14 +6863,15 @@ snapshots: eslint-visitor-keys@4.2.0: {} - eslint@9.21.0: + eslint@9.22.0: dependencies: - '@eslint-community/eslint-utils': 4.4.1(eslint@9.21.0) + '@eslint-community/eslint-utils': 4.5.1(eslint@9.22.0) '@eslint-community/regexpp': 4.12.1 '@eslint/config-array': 0.19.2 + '@eslint/config-helpers': 0.1.0 '@eslint/core': 0.12.0 '@eslint/eslintrc': 3.3.0 - '@eslint/js': 9.21.0 + '@eslint/js': 9.22.0 '@eslint/plugin-kit': 0.2.7 '@humanfs/node': 0.16.6 '@humanwhocodes/module-importer': 1.0.1 @@ -6879,7 +6883,7 @@ snapshots: cross-spawn: 7.0.6 debug: 4.4.0 escape-string-regexp: 4.0.0 - eslint-scope: 8.2.0 + eslint-scope: 8.3.0 eslint-visitor-keys: 4.2.0 espree: 10.3.0 esquery: 1.6.0 @@ -6903,8 +6907,8 @@ snapshots: espree@10.3.0: dependencies: - acorn: 8.14.0 - acorn-jsx: 5.3.2(acorn@8.14.0) + acorn: 8.14.1 + acorn-jsx: 5.3.2(acorn@8.14.1) eslint-visitor-keys: 4.2.0 esprima@4.0.1: {} @@ -6964,8 +6968,6 @@ snapshots: esutils@2.0.3: {} - eventemitter2@0.4.14: {} - eventemitter2@5.0.1: {} eventemitter2@6.4.9: {} @@ -6996,7 +6998,7 @@ snapshots: expect-type@1.2.0: {} - exsolve@1.0.1: {} + exsolve@1.0.4: {} extend@3.0.2: {} @@ -7064,7 +7066,7 @@ snapshots: fastify@5.2.1: dependencies: '@fastify/ajv-compiler': 4.0.2 - '@fastify/error': 4.0.0 + '@fastify/error': 4.1.0 '@fastify/fast-json-stringify-compiler': 5.0.2 '@fastify/proxy-addr': 5.0.0 abstract-logging: 2.0.1 @@ -7376,7 +7378,7 @@ snapshots: stringify-entities: 4.0.4 zwitch: 2.0.4 - hast-util-to-jsx-runtime@2.3.5: + hast-util-to-jsx-runtime@2.3.6: dependencies: '@types/estree': 1.0.6 '@types/hast': 3.0.4 @@ -7390,7 +7392,7 @@ snapshots: mdast-util-mdxjs-esm: 2.0.1 property-information: 7.0.0 space-separated-tokens: 2.0.2 - style-to-object: 1.0.8 + style-to-js: 1.1.16 unist-util-position: 5.0.0 vfile-message: 4.0.2 transitivePeerDependencies: @@ -7625,7 +7627,7 @@ snapshots: is-typed-array@1.1.15: dependencies: - which-typed-array: 1.1.18 + which-typed-array: 1.1.19 is-weakmap@2.0.2: {} @@ -7739,8 +7741,6 @@ snapshots: layout-base@2.0.1: {} - lazy@1.0.11: {} - levn@0.4.1: dependencies: prelude-ls: 1.2.1 @@ -7798,7 +7798,7 @@ snapshots: markdown-table@3.0.4: {} - marked@13.0.3: {} + marked@15.0.7: {} math-intrinsics@1.1.0: {} @@ -7820,7 +7820,7 @@ snapshots: dependencies: '@types/mdast': 4.0.4 '@types/unist': 3.0.3 - decode-named-character-reference: 1.0.2 + decode-named-character-reference: 1.1.0 devlop: 1.1.0 mdast-util-to-string: 4.0.0 micromark: 4.0.2 @@ -7999,7 +7999,7 @@ snapshots: merge2@1.4.1: {} - mermaid@11.4.1: + mermaid@11.5.0: dependencies: '@braintree/sanitize-url': 7.1.1 '@iconify/utils': 2.3.0 @@ -8016,11 +8016,11 @@ snapshots: katex: 0.16.21 khroma: 2.1.0 lodash-es: 4.17.21 - marked: 13.0.3 + marked: 15.0.7 roughjs: 4.6.6 stylis: 4.3.6 ts-dedent: 2.2.0 - uuid: 9.0.1 + uuid: 11.1.0 transitivePeerDependencies: - supports-color @@ -8028,7 +8028,7 @@ snapshots: micromark-core-commonmark@2.0.3: dependencies: - decode-named-character-reference: 1.0.2 + decode-named-character-reference: 1.1.0 devlop: 1.1.0 micromark-factory-destination: 2.0.1 micromark-factory-label: 2.0.1 @@ -8163,8 +8163,8 @@ snapshots: micromark-extension-mdxjs@3.0.0: dependencies: - acorn: 8.14.0 - acorn-jsx: 5.3.2(acorn@8.14.0) + acorn: 8.14.1 + acorn-jsx: 5.3.2(acorn@8.14.1) micromark-extension-mdx-expression: 3.0.0 micromark-extension-mdx-jsx: 3.0.1 micromark-extension-mdx-md: 2.0.0 @@ -8242,7 +8242,7 @@ snapshots: micromark-util-decode-string@2.0.1: dependencies: - decode-named-character-reference: 1.0.2 + decode-named-character-reference: 1.1.0 micromark-util-character: 2.1.1 micromark-util-decode-numeric-character-reference: 2.0.2 micromark-util-symbol: 2.0.1 @@ -8291,7 +8291,7 @@ snapshots: dependencies: '@types/debug': 4.1.12 debug: 4.4.0 - decode-named-character-reference: 1.0.2 + decode-named-character-reference: 1.1.0 devlop: 1.1.0 micromark-core-commonmark: 2.0.3 micromark-factory-space: 2.0.1 @@ -8348,7 +8348,7 @@ snapshots: mlly@1.7.4: dependencies: - acorn: 8.14.0 + acorn: 8.14.1 pathe: 2.0.3 pkg-types: 1.3.1 ufo: 1.5.4 @@ -8363,7 +8363,7 @@ snapshots: mute-stream@0.0.8: {} - nanoid@3.3.8: {} + nanoid@3.3.10: {} natural-compare@1.4.0: {} @@ -8381,44 +8381,44 @@ snapshots: netmask@2.0.2: {} - next-themes@0.4.4(react-dom@19.0.0(react@19.0.0))(react@19.0.0): + next-themes@0.4.6(react-dom@19.0.0(react@19.0.0))(react@19.0.0): dependencies: react: 19.0.0 react-dom: 19.0.0(react@19.0.0) - next@15.2.0(@playwright/test@1.50.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0): + next@15.2.2(@playwright/test@1.51.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0): dependencies: - '@next/env': 15.2.0 + '@next/env': 15.2.2 '@swc/counter': 0.1.3 '@swc/helpers': 0.5.15 busboy: 1.6.0 - caniuse-lite: 1.0.30001702 + caniuse-lite: 1.0.30001705 postcss: 8.4.31 react: 19.0.0 react-dom: 19.0.0(react@19.0.0) styled-jsx: 5.1.6(react@19.0.0) optionalDependencies: - '@next/swc-darwin-arm64': 15.2.0 - '@next/swc-darwin-x64': 15.2.0 - '@next/swc-linux-arm64-gnu': 15.2.0 - '@next/swc-linux-arm64-musl': 15.2.0 - '@next/swc-linux-x64-gnu': 15.2.0 - '@next/swc-linux-x64-musl': 15.2.0 - '@next/swc-win32-arm64-msvc': 15.2.0 - '@next/swc-win32-x64-msvc': 15.2.0 - '@playwright/test': 1.50.1 + '@next/swc-darwin-arm64': 15.2.2 + '@next/swc-darwin-x64': 15.2.2 + '@next/swc-linux-arm64-gnu': 15.2.2 + '@next/swc-linux-arm64-musl': 15.2.2 + '@next/swc-linux-x64-gnu': 15.2.2 + '@next/swc-linux-x64-musl': 15.2.2 + '@next/swc-win32-arm64-msvc': 15.2.2 + '@next/swc-win32-x64-msvc': 15.2.2 + '@playwright/test': 1.51.1 sharp: 0.33.5 transitivePeerDependencies: - '@babel/core' - babel-plugin-macros - nextra-theme-docs@4.2.14(@types/react@19.0.10)(next@15.2.0(@playwright/test@1.50.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(nextra@4.2.14(acorn@8.14.0)(next@15.2.0(@playwright/test@1.50.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.8.2))(react-dom@19.0.0(react@19.0.0))(react@19.0.0): + nextra-theme-docs@4.2.16(@types/react@19.0.10)(next@15.2.2(@playwright/test@1.51.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(nextra@4.2.16(acorn@8.14.1)(next@15.2.2(@playwright/test@1.51.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.8.2))(react-dom@19.0.0(react@19.0.0))(react@19.0.0): dependencies: '@headlessui/react': 2.2.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0) clsx: 2.1.1 - next: 15.2.0(@playwright/test@1.50.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - next-themes: 0.4.4(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - nextra: 4.2.14(acorn@8.14.0)(next@15.2.0(@playwright/test@1.50.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.8.2) + next: 15.2.2(@playwright/test@1.51.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + next-themes: 0.4.6(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + nextra: 4.2.16(acorn@8.14.1)(next@15.2.2(@playwright/test@1.51.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.8.2) react: 19.0.0 react-compiler-runtime: 0.0.0-experimental-22c6e49-20241219(react@19.0.0) react-dom: 19.0.0(react@19.0.0) @@ -8431,11 +8431,11 @@ snapshots: - immer - use-sync-external-store - nextra@4.2.14(acorn@8.14.0)(next@15.2.0(@playwright/test@1.50.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.8.2): + nextra@4.2.16(acorn@8.14.1)(next@15.2.2(@playwright/test@1.51.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.8.2): dependencies: '@formatjs/intl-localematcher': 0.6.0 '@headlessui/react': 2.2.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@mdx-js/mdx': 3.1.0(acorn@8.14.0) + '@mdx-js/mdx': 3.1.0(acorn@8.14.1) '@napi-rs/simple-git': 0.1.19 '@shikijs/twoslash': 2.5.0(typescript@5.8.2) '@theguild/remark-mermaid': 0.2.0(react@19.0.0) @@ -8452,7 +8452,7 @@ snapshots: mdast-util-gfm: 3.1.0 mdast-util-to-hast: 13.2.0 negotiator: 1.0.0 - next: 15.2.0(@playwright/test@1.50.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + next: 15.2.2(@playwright/test@1.51.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) react: 19.0.0 react-compiler-runtime: 0.0.0-experimental-22c6e49-20241219(react@19.0.0) react-dom: 19.0.0(react@19.0.0) @@ -8495,11 +8495,6 @@ snapshots: npm-to-yarn@3.0.1: {} - nssocket@0.6.0: - dependencies: - eventemitter2: 0.4.14 - lazy: 1.0.11 - object-assign@4.1.1: {} object-inspect@1.13.4: {} @@ -8515,9 +8510,10 @@ snapshots: has-symbols: 1.1.0 object-keys: 1.1.1 - object.entries@1.1.8: + object.entries@1.1.9: dependencies: call-bind: 1.0.8 + call-bound: 1.0.4 define-properties: 1.2.1 es-object-atoms: 1.1.1 @@ -8641,7 +8637,7 @@ snapshots: '@types/unist': 2.0.11 character-entities-legacy: 3.0.0 character-reference-invalid: 2.0.1 - decode-named-character-reference: 1.0.2 + decode-named-character-reference: 1.1.0 is-alphanumerical: 2.0.1 is-decimal: 2.0.1 is-hexadecimal: 2.0.1 @@ -8743,14 +8739,14 @@ snapshots: pkg-types@2.1.0: dependencies: confbox: 0.2.1 - exsolve: 1.0.1 + exsolve: 1.0.4 pathe: 2.0.3 - playwright-core@1.50.1: {} + playwright-core@1.51.1: {} - playwright@1.50.1: + playwright@1.51.1: dependencies: - playwright-core: 1.50.1 + playwright-core: 1.51.1 optionalDependencies: fsevents: 2.3.2 @@ -8789,10 +8785,10 @@ snapshots: - supports-color optional: true - pm2@5.4.3: + pm2@6.0.5: dependencies: - '@pm2/agent': 2.0.4 - '@pm2/io': 6.0.1 + '@pm2/agent': 2.1.1 + '@pm2/io': 6.1.0 '@pm2/js-api': 0.8.0 '@pm2/pm2-version-check': 1.0.4 async: 3.2.6 @@ -8838,13 +8834,13 @@ snapshots: postcss@8.4.31: dependencies: - nanoid: 3.3.8 + nanoid: 3.3.10 picocolors: 1.1.1 source-map-js: 1.2.1 postcss@8.5.3: dependencies: - nanoid: 3.3.8 + nanoid: 3.3.10 picocolors: 1.1.1 source-map-js: 1.2.1 @@ -8877,7 +8873,7 @@ snapshots: property-information@7.0.0: {} - proxy-agent@6.3.1: + proxy-agent@6.4.0: dependencies: agent-base: 7.1.3 debug: 4.4.0 @@ -8957,9 +8953,9 @@ snapshots: estree-util-build-jsx: 3.0.1 vfile: 6.0.3 - recma-jsx@1.0.0(acorn@8.14.0): + recma-jsx@1.0.0(acorn@8.14.1): dependencies: - acorn-jsx: 5.3.2(acorn@8.14.0) + acorn-jsx: 5.3.2(acorn@8.14.1) estree-util-to-js: 2.0.0 recma-parse: 1.0.0 recma-stringify: 1.0.0 @@ -9205,29 +9201,29 @@ snapshots: robust-predicates@3.0.2: {} - rollup@4.34.9: + rollup@4.36.0: dependencies: '@types/estree': 1.0.6 optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.34.9 - '@rollup/rollup-android-arm64': 4.34.9 - '@rollup/rollup-darwin-arm64': 4.34.9 - '@rollup/rollup-darwin-x64': 4.34.9 - '@rollup/rollup-freebsd-arm64': 4.34.9 - '@rollup/rollup-freebsd-x64': 4.34.9 - '@rollup/rollup-linux-arm-gnueabihf': 4.34.9 - '@rollup/rollup-linux-arm-musleabihf': 4.34.9 - '@rollup/rollup-linux-arm64-gnu': 4.34.9 - '@rollup/rollup-linux-arm64-musl': 4.34.9 - '@rollup/rollup-linux-loongarch64-gnu': 4.34.9 - '@rollup/rollup-linux-powerpc64le-gnu': 4.34.9 - '@rollup/rollup-linux-riscv64-gnu': 4.34.9 - '@rollup/rollup-linux-s390x-gnu': 4.34.9 - '@rollup/rollup-linux-x64-gnu': 4.34.9 - '@rollup/rollup-linux-x64-musl': 4.34.9 - '@rollup/rollup-win32-arm64-msvc': 4.34.9 - '@rollup/rollup-win32-ia32-msvc': 4.34.9 - '@rollup/rollup-win32-x64-msvc': 4.34.9 + '@rollup/rollup-android-arm-eabi': 4.36.0 + '@rollup/rollup-android-arm64': 4.36.0 + '@rollup/rollup-darwin-arm64': 4.36.0 + '@rollup/rollup-darwin-x64': 4.36.0 + '@rollup/rollup-freebsd-arm64': 4.36.0 + '@rollup/rollup-freebsd-x64': 4.36.0 + '@rollup/rollup-linux-arm-gnueabihf': 4.36.0 + '@rollup/rollup-linux-arm-musleabihf': 4.36.0 + '@rollup/rollup-linux-arm64-gnu': 4.36.0 + '@rollup/rollup-linux-arm64-musl': 4.36.0 + '@rollup/rollup-linux-loongarch64-gnu': 4.36.0 + '@rollup/rollup-linux-powerpc64le-gnu': 4.36.0 + '@rollup/rollup-linux-riscv64-gnu': 4.36.0 + '@rollup/rollup-linux-s390x-gnu': 4.36.0 + '@rollup/rollup-linux-x64-gnu': 4.36.0 + '@rollup/rollup-linux-x64-musl': 4.36.0 + '@rollup/rollup-win32-arm64-msvc': 4.36.0 + '@rollup/rollup-win32-ia32-msvc': 4.36.0 + '@rollup/rollup-win32-x64-msvc': 4.36.0 fsevents: 2.3.3 roughjs@4.6.6: @@ -9674,7 +9670,7 @@ snapshots: tsx@4.19.3: dependencies: - esbuild: 0.25.0 + esbuild: 0.25.1 get-tsconfig: 4.10.0 optionalDependencies: fsevents: 2.3.3 @@ -9762,12 +9758,12 @@ snapshots: possible-typed-array-names: 1.1.0 reflect.getprototypeof: 1.0.10 - typescript-eslint@8.26.0(eslint@9.21.0)(typescript@5.8.2): + typescript-eslint@8.26.1(eslint@9.22.0)(typescript@5.8.2): dependencies: - '@typescript-eslint/eslint-plugin': 8.26.0(@typescript-eslint/parser@8.26.0(eslint@9.21.0)(typescript@5.8.2))(eslint@9.21.0)(typescript@5.8.2) - '@typescript-eslint/parser': 8.26.0(eslint@9.21.0)(typescript@5.8.2) - '@typescript-eslint/utils': 8.26.0(eslint@9.21.0)(typescript@5.8.2) - eslint: 9.21.0 + '@typescript-eslint/eslint-plugin': 8.26.1(@typescript-eslint/parser@8.26.1(eslint@9.22.0)(typescript@5.8.2))(eslint@9.22.0)(typescript@5.8.2) + '@typescript-eslint/parser': 8.26.1(eslint@9.22.0)(typescript@5.8.2) + '@typescript-eslint/utils': 8.26.1(eslint@9.22.0)(typescript@5.8.2) + eslint: 9.22.0 typescript: 5.8.2 transitivePeerDependencies: - supports-color @@ -9873,7 +9869,7 @@ snapshots: dependencies: punycode: 2.3.1 - uuid@9.0.1: {} + uuid@11.1.0: {} vary@1.1.2: {} @@ -9892,13 +9888,13 @@ snapshots: '@types/unist': 3.0.3 vfile-message: 4.0.2 - vite-node@3.0.7(@types/node@22.13.9)(tsx@4.19.3)(yaml@2.7.0): + vite-node@3.0.9(@types/node@22.13.10)(tsx@4.19.3)(yaml@2.7.0): dependencies: cac: 6.7.14 debug: 4.4.0 es-module-lexer: 1.6.0 pathe: 2.0.3 - vite: 6.2.0(@types/node@22.13.9)(tsx@4.19.3)(yaml@2.7.0) + vite: 6.2.2(@types/node@22.13.10)(tsx@4.19.3)(yaml@2.7.0) transitivePeerDependencies: - '@types/node' - jiti @@ -9913,26 +9909,26 @@ snapshots: - tsx - yaml - vite@6.2.0(@types/node@22.13.9)(tsx@4.19.3)(yaml@2.7.0): + vite@6.2.2(@types/node@22.13.10)(tsx@4.19.3)(yaml@2.7.0): dependencies: - esbuild: 0.25.0 + esbuild: 0.25.1 postcss: 8.5.3 - rollup: 4.34.9 + rollup: 4.36.0 optionalDependencies: - '@types/node': 22.13.9 + '@types/node': 22.13.10 fsevents: 2.3.3 tsx: 4.19.3 yaml: 2.7.0 - vitest@3.0.7(@types/debug@4.1.12)(@types/node@22.13.9)(tsx@4.19.3)(yaml@2.7.0): + vitest@3.0.9(@types/debug@4.1.12)(@types/node@22.13.10)(tsx@4.19.3)(yaml@2.7.0): dependencies: - '@vitest/expect': 3.0.7 - '@vitest/mocker': 3.0.7(vite@6.2.0(@types/node@22.13.9)(tsx@4.19.3)(yaml@2.7.0)) - '@vitest/pretty-format': 3.0.7 - '@vitest/runner': 3.0.7 - '@vitest/snapshot': 3.0.7 - '@vitest/spy': 3.0.7 - '@vitest/utils': 3.0.7 + '@vitest/expect': 3.0.9 + '@vitest/mocker': 3.0.9(vite@6.2.2(@types/node@22.13.10)(tsx@4.19.3)(yaml@2.7.0)) + '@vitest/pretty-format': 3.0.9 + '@vitest/runner': 3.0.9 + '@vitest/snapshot': 3.0.9 + '@vitest/spy': 3.0.9 + '@vitest/utils': 3.0.9 chai: 5.2.0 debug: 4.4.0 expect-type: 1.2.0 @@ -9943,12 +9939,12 @@ snapshots: tinyexec: 0.3.2 tinypool: 1.0.2 tinyrainbow: 2.0.0 - vite: 6.2.0(@types/node@22.13.9)(tsx@4.19.3)(yaml@2.7.0) - vite-node: 3.0.7(@types/node@22.13.9)(tsx@4.19.3)(yaml@2.7.0) + vite: 6.2.2(@types/node@22.13.10)(tsx@4.19.3)(yaml@2.7.0) + vite-node: 3.0.9(@types/node@22.13.10)(tsx@4.19.3)(yaml@2.7.0) why-is-node-running: 2.3.0 optionalDependencies: '@types/debug': 4.1.12 - '@types/node': 22.13.9 + '@types/node': 22.13.10 transitivePeerDependencies: - jiti - less @@ -10011,7 +10007,7 @@ snapshots: isarray: 2.0.5 which-boxed-primitive: 1.1.1 which-collection: 1.0.2 - which-typed-array: 1.1.18 + which-typed-array: 1.1.19 which-collection@1.0.2: dependencies: @@ -10020,12 +10016,13 @@ snapshots: is-weakmap: 2.0.2 is-weakset: 2.0.4 - which-typed-array@1.1.18: + which-typed-array@1.1.19: dependencies: available-typed-arrays: 1.0.7 call-bind: 1.0.8 call-bound: 1.0.4 for-each: 0.3.5 + get-proto: 1.0.1 gopd: 1.2.0 has-tostringtag: 1.0.2 From 070abb5ffed441165989c56b53cb70ce19110500 Mon Sep 17 00:00:00 2001 From: better-salmon <132773930+better-salmon@users.noreply.github.com> Date: Tue, 18 Mar 2025 00:22:27 +0300 Subject: [PATCH 09/16] Support cacheControl value in set context --- apps/cache-testing/tests/pages.spec.ts | 2 +- packages/cache-handler/src/cache-handler.ts | 9 +++++++-- .../src/instrumentation/register-initial-cache.ts | 6 +++++- 3 files changed, 13 insertions(+), 4 deletions(-) diff --git a/apps/cache-testing/tests/pages.spec.ts b/apps/cache-testing/tests/pages.spec.ts index 1173f049..07566dd5 100644 --- a/apps/cache-testing/tests/pages.spec.ts +++ b/apps/cache-testing/tests/pages.spec.ts @@ -6,7 +6,7 @@ const paths = [ // '/pages/with-paths/fallback-true/200', '/pages/with-paths/fallback-false/200', '/pages/no-paths/fallback-blocking/200', - '/pages/no-paths/fallback-true/200', + // '/pages/no-paths/fallback-true/200', // '/pages/no-paths/fallback-false/200', // this fails with native next.js cache ]; diff --git a/packages/cache-handler/src/cache-handler.ts b/packages/cache-handler/src/cache-handler.ts index 1d592465..d91882f5 100644 --- a/packages/cache-handler/src/cache-handler.ts +++ b/packages/cache-handler/src/cache-handler.ts @@ -865,7 +865,10 @@ export class CacheHandler implements NextCacheHandler { incrementalCacheValue: CacheHandlerParametersSet[1], ctx: CacheHandlerParametersSet[2] & { neshca_lastModified?: number }, ): Promise { - if (incrementalCacheValue?.kind !== CachedRouteKind.PAGES) { + if ( + incrementalCacheValue?.kind !== CachedRouteKind.PAGES || + ctx.fetchCache === true + ) { return; } @@ -880,7 +883,9 @@ export class CacheHandler implements NextCacheHandler { ); } - const { revalidate, neshca_lastModified } = ctx; + const { neshca_lastModified, cacheControl } = ctx; + + const revalidate = cacheControl?.revalidate; const lastModified = Math.round(neshca_lastModified ?? Date.now()); diff --git a/packages/cache-handler/src/instrumentation/register-initial-cache.ts b/packages/cache-handler/src/instrumentation/register-initial-cache.ts index 53cab4a8..a9875ba1 100644 --- a/packages/cache-handler/src/instrumentation/register-initial-cache.ts +++ b/packages/cache-handler/src/instrumentation/register-initial-cache.ts @@ -180,7 +180,11 @@ export async function registerInitialCache( headers: undefined, status: undefined, }, - { revalidate, neshca_lastModified: lastModified }, + { + neshca_lastModified: lastModified, + fetchCache: false, + cacheControl: { revalidate, expire: 0 }, + }, ); } catch (error) { if (debug) { From 4ba0138bdfb4608da6f7864438982d3e4ed2f687 Mon Sep 17 00:00:00 2001 From: better-salmon <132773930+better-salmon@users.noreply.github.com> Date: Tue, 18 Mar 2025 02:15:36 +0300 Subject: [PATCH 10/16] Fix fallback-true pages --- .vscode/settings.json | 3 + apps/cache-testing/package.json | 4 +- apps/cache-testing/run-app-instances.ts | 7 +- apps/cache-testing/tests/pages.spec.ts | 4 +- docs/cache-handler-docs/package.json | 4 +- internal/eslint-config/package.json | 2 +- packages/cache-handler/src/cache-handler.ts | 18 +- packages/cache-handler/src/use-cache/redis.ts | 7 - pnpm-lock.yaml | 192 ++++++++++++++---- turbo.json | 1 + 10 files changed, 184 insertions(+), 58 deletions(-) diff --git a/.vscode/settings.json b/.vscode/settings.json index 2ffbc92e..7c7dad25 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -39,5 +39,8 @@ }, "[typescriptreact]": { "editor.defaultFormatter": "biomejs.biome" + }, + "[html]": { + "editor.defaultFormatter": "esbenp.prettier-vscode" } } diff --git a/apps/cache-testing/package.json b/apps/cache-testing/package.json index c1681ad4..85e6bfb2 100644 --- a/apps/cache-testing/package.json +++ b/apps/cache-testing/package.json @@ -18,7 +18,7 @@ "dependencies": { "@neshca/cache-handler": "workspace:*", "axios": "1.8.3", - "next": "15.2.2", + "next": "15.2.3", "react": "19.0.0", "react-dom": "19.0.0", "redis": "4.7.0" @@ -28,7 +28,7 @@ "@repo/eslint-config": "workspace:*", "@repo/typescript-config": "workspace:*", "@types/node": "22.13.10", - "@types/react": "19.0.10", + "@types/react": "19.0.11", "@types/react-dom": "19.0.4", "dotenv-cli": "8.0.0", "eslint": "9.22.0", diff --git a/apps/cache-testing/run-app-instances.ts b/apps/cache-testing/run-app-instances.ts index 30f3ddc6..f91cf814 100644 --- a/apps/cache-testing/run-app-instances.ts +++ b/apps/cache-testing/run-app-instances.ts @@ -2,12 +2,7 @@ import { scheduler } from 'node:timers/promises'; import Fastify from 'fastify'; -// biome-ignore lint/style/noNamespaceImport: pm2 works only with namespace import -import * as pm2Default from 'pm2'; - -const { default: pm2 } = pm2Default as unknown as { - default: typeof import('pm2'); -}; +import pm2 from 'pm2'; const args = process.argv .slice(2) diff --git a/apps/cache-testing/tests/pages.spec.ts b/apps/cache-testing/tests/pages.spec.ts index 07566dd5..6e84f87e 100644 --- a/apps/cache-testing/tests/pages.spec.ts +++ b/apps/cache-testing/tests/pages.spec.ts @@ -3,10 +3,10 @@ import { expect, test } from '@playwright/test'; const paths = [ '/pages/with-paths/fallback-blocking/200', - // '/pages/with-paths/fallback-true/200', + '/pages/with-paths/fallback-true/200', '/pages/with-paths/fallback-false/200', '/pages/no-paths/fallback-blocking/200', - // '/pages/no-paths/fallback-true/200', + '/pages/no-paths/fallback-true/200', // '/pages/no-paths/fallback-false/200', // this fails with native next.js cache ]; diff --git a/docs/cache-handler-docs/package.json b/docs/cache-handler-docs/package.json index 8e6cb7a6..6c6d4355 100644 --- a/docs/cache-handler-docs/package.json +++ b/docs/cache-handler-docs/package.json @@ -12,7 +12,7 @@ "start:docs": "serve out" }, "dependencies": { - "next": "15.2.2", + "next": "15.2.3", "nextra": "4.2.16", "nextra-theme-docs": "4.2.16", "react": "19.0.0", @@ -22,7 +22,7 @@ "@repo/eslint-config": "workspace:*", "@repo/typescript-config": "workspace:*", "@types/node": "22.13.10", - "@types/react": "19.0.10", + "@types/react": "19.0.11", "@types/react-dom": "19.0.4", "eslint": "9.22.0", "pagefind": "1.3.0", diff --git a/internal/eslint-config/package.json b/internal/eslint-config/package.json index aceaf6aa..d2e8f3ab 100644 --- a/internal/eslint-config/package.json +++ b/internal/eslint-config/package.json @@ -8,7 +8,7 @@ }, "devDependencies": { "@eslint/js": "9.22.0", - "@next/eslint-plugin-next": "15.2.2", + "@next/eslint-plugin-next": "15.2.3", "eslint": "9.22.0", "eslint-config-prettier": "10.1.1", "eslint-plugin-react": "7.37.4", diff --git a/packages/cache-handler/src/cache-handler.ts b/packages/cache-handler/src/cache-handler.ts index d91882f5..cbd155f5 100644 --- a/packages/cache-handler/src/cache-handler.ts +++ b/packages/cache-handler/src/cache-handler.ts @@ -386,6 +386,7 @@ export class CacheHandler implements NextCacheHandler { static async #readPagesRouterPage( cacheKey: string, + isFallback: boolean, ): Promise { let cacheHandlerValue: CacheHandlerValue | null = null; let pageHtmlHandle: fsPromises.FileHandle | null = null; @@ -417,9 +418,11 @@ export class CacheHandler implements NextCacheHandler { const [pageHtmlFile, { mtimeMs }, pageData] = await Promise.all([ pageHtmlHandle.readFile('utf-8'), pageHtmlHandle.stat(), - fsPromises - .readFile(pageDataPath, 'utf-8') - .then((data) => JSON.parse(data) as object), + isFallback + ? {} + : fsPromises + .readFile(pageDataPath, 'utf-8') + .then((data) => JSON.parse(data) as object), ]); if (CacheHandler.#debug) { @@ -849,7 +852,7 @@ export class CacheHandler implements NextCacheHandler { }); if (!cachedData && CacheHandler.#fallbackFalseRoutes.has(cacheKey)) { - cachedData = await CacheHandler.#readPagesRouterPage(cacheKey); + cachedData = await CacheHandler.#readPagesRouterPage(cacheKey, false); // if we have a value from the file system, we should set it to the cache store if (cachedData) { @@ -857,6 +860,13 @@ export class CacheHandler implements NextCacheHandler { } } + if (ctx.isFallback) { + cachedData = await CacheHandler.#readPagesRouterPage( + cacheKey, + ctx.isFallback, + ); + } + return cachedData ?? null; } diff --git a/packages/cache-handler/src/use-cache/redis.ts b/packages/cache-handler/src/use-cache/redis.ts index d1c79c54..d3a05816 100644 --- a/packages/cache-handler/src/use-cache/redis.ts +++ b/packages/cache-handler/src/use-cache/redis.ts @@ -417,13 +417,6 @@ function createRedisCacheHandler(config: RedisConfig = {}) { errorRetryCount: 0, }; - console.info( - 'entry.expire, entry.revalidate, entry.stale', - entry.expire, - entry.revalidate, - entry.stale, - ); - // Store in Redis with an expiration await redisClient.set( getKey(cacheKey), diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 903575c0..60fb0f52 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -36,8 +36,8 @@ importers: specifier: 1.8.3 version: 1.8.3 next: - specifier: 15.2.2 - version: 15.2.2(@playwright/test@1.51.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + specifier: 15.2.3 + version: 15.2.3(@playwright/test@1.51.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) react: specifier: 19.0.0 version: 19.0.0 @@ -61,11 +61,11 @@ importers: specifier: 22.13.10 version: 22.13.10 '@types/react': - specifier: 19.0.10 - version: 19.0.10 + specifier: 19.0.11 + version: 19.0.11 '@types/react-dom': specifier: 19.0.4 - version: 19.0.4(@types/react@19.0.10) + version: 19.0.4(@types/react@19.0.11) dotenv-cli: specifier: 8.0.0 version: 8.0.0 @@ -88,14 +88,14 @@ importers: docs/cache-handler-docs: dependencies: next: - specifier: 15.2.2 - version: 15.2.2(@playwright/test@1.51.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + specifier: 15.2.3 + version: 15.2.3(@playwright/test@1.51.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) nextra: specifier: 4.2.16 - version: 4.2.16(acorn@8.14.1)(next@15.2.2(@playwright/test@1.51.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.8.2) + version: 4.2.16(acorn@8.14.1)(next@15.2.3(@playwright/test@1.51.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.8.2) nextra-theme-docs: specifier: 4.2.16 - version: 4.2.16(@types/react@19.0.10)(next@15.2.2(@playwright/test@1.51.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(nextra@4.2.16(acorn@8.14.1)(next@15.2.2(@playwright/test@1.51.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.8.2))(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + version: 4.2.16(@types/react@19.0.11)(next@15.2.3(@playwright/test@1.51.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(nextra@4.2.16(acorn@8.14.1)(next@15.2.3(@playwright/test@1.51.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.8.2))(react-dom@19.0.0(react@19.0.0))(react@19.0.0) react: specifier: 19.0.0 version: 19.0.0 @@ -113,11 +113,11 @@ importers: specifier: 22.13.10 version: 22.13.10 '@types/react': - specifier: 19.0.10 - version: 19.0.10 + specifier: 19.0.11 + version: 19.0.11 '@types/react-dom': specifier: 19.0.4 - version: 19.0.4(@types/react@19.0.10) + version: 19.0.4(@types/react@19.0.11) eslint: specifier: 9.22.0 version: 9.22.0 @@ -162,8 +162,8 @@ importers: specifier: 9.22.0 version: 9.22.0 '@next/eslint-plugin-next': - specifier: 15.2.2 - version: 15.2.2 + specifier: 15.2.3 + version: 15.2.3 eslint: specifier: 9.22.0 version: 9.22.0 @@ -840,8 +840,11 @@ packages: '@next/env@15.2.2': resolution: {integrity: sha512-yWgopCfA9XDR8ZH3taB5nRKtKJ1Q5fYsTOuYkzIIoS8TJ0UAUKAGF73JnGszbjk2ufAQDj6mDdgsJAFx5CLtYQ==} - '@next/eslint-plugin-next@15.2.2': - resolution: {integrity: sha512-1+BzokFuFQIfLaRxUKf2u5In4xhPV7tUgKcK53ywvFl6+LXHWHpFkcV7VNeKlyQKUotwiq4fy/aDNF9EiUp4RQ==} + '@next/env@15.2.3': + resolution: {integrity: sha512-a26KnbW9DFEUsSxAxKBORR/uD9THoYoKbkpFywMN/AFvboTt94b8+g/07T8J6ACsdLag8/PDU60ov4rPxRAixw==} + + '@next/eslint-plugin-next@15.2.3': + resolution: {integrity: sha512-eNSOIMJtjs+dp4Ms1tB1PPPJUQHP3uZK+OQ7iFY9qXpGO6ojT6imCL+KcUOqE/GXGidWbBZJzYdgAdPHqeCEPA==} '@next/swc-darwin-arm64@15.2.2': resolution: {integrity: sha512-HNBRnz+bkZ+KfyOExpUxTMR0Ow8nkkcE6IlsdEa9W/rI7gefud19+Sn1xYKwB9pdCdxIP1lPru/ZfjfA+iT8pw==} @@ -849,48 +852,96 @@ packages: cpu: [arm64] os: [darwin] + '@next/swc-darwin-arm64@15.2.3': + resolution: {integrity: sha512-uaBhA8aLbXLqwjnsHSkxs353WrRgQgiFjduDpc7YXEU0B54IKx3vU+cxQlYwPCyC8uYEEX7THhtQQsfHnvv8dw==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [darwin] + '@next/swc-darwin-x64@15.2.2': resolution: {integrity: sha512-mJOUwp7al63tDpLpEFpKwwg5jwvtL1lhRW2fI1Aog0nYCPAhxbJsaZKdoVyPZCy8MYf/iQVNDuk/+i29iLCzIA==} engines: {node: '>= 10'} cpu: [x64] os: [darwin] + '@next/swc-darwin-x64@15.2.3': + resolution: {integrity: sha512-pVwKvJ4Zk7h+4hwhqOUuMx7Ib02u3gDX3HXPKIShBi9JlYllI0nU6TWLbPT94dt7FSi6mSBhfc2JrHViwqbOdw==} + engines: {node: '>= 10'} + cpu: [x64] + os: [darwin] + '@next/swc-linux-arm64-gnu@15.2.2': resolution: {integrity: sha512-5ZZ0Zwy3SgMr7MfWtRE7cQWVssfOvxYfD9O7XHM7KM4nrf5EOeqwq67ZXDgo86LVmffgsu5tPO57EeFKRnrfSQ==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] + '@next/swc-linux-arm64-gnu@15.2.3': + resolution: {integrity: sha512-50ibWdn2RuFFkOEUmo9NCcQbbV9ViQOrUfG48zHBCONciHjaUKtHcYFiCwBVuzD08fzvzkWuuZkd4AqbvKO7UQ==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + '@next/swc-linux-arm64-musl@15.2.2': resolution: {integrity: sha512-cgKWBuFMLlJ4TWcFHl1KOaVVUAF8vy4qEvX5KsNd0Yj5mhu989QFCq1WjuaEbv/tO1ZpsQI6h/0YR8bLwEi+nA==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] + '@next/swc-linux-arm64-musl@15.2.3': + resolution: {integrity: sha512-2gAPA7P652D3HzR4cLyAuVYwYqjG0mt/3pHSWTCyKZq/N/dJcUAEoNQMyUmwTZWCJRKofB+JPuDVP2aD8w2J6Q==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + '@next/swc-linux-x64-gnu@15.2.2': resolution: {integrity: sha512-c3kWSOSsVL8rcNBBfOq1+/j2PKs2nsMwJUV4icUxRgGBwUOfppeh7YhN5s79enBQFU+8xRgVatFkhHU1QW7yUA==} engines: {node: '>= 10'} cpu: [x64] os: [linux] + '@next/swc-linux-x64-gnu@15.2.3': + resolution: {integrity: sha512-ODSKvrdMgAJOVU4qElflYy1KSZRM3M45JVbeZu42TINCMG3anp7YCBn80RkISV6bhzKwcUqLBAmOiWkaGtBA9w==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + '@next/swc-linux-x64-musl@15.2.2': resolution: {integrity: sha512-PXTW9PLTxdNlVYgPJ0equojcq1kNu5NtwcNjRjHAB+/sdoKZ+X8FBu70fdJFadkxFIGekQTyRvPMFF+SOJaQjw==} engines: {node: '>= 10'} cpu: [x64] os: [linux] + '@next/swc-linux-x64-musl@15.2.3': + resolution: {integrity: sha512-ZR9kLwCWrlYxwEoytqPi1jhPd1TlsSJWAc+H/CJHmHkf2nD92MQpSRIURR1iNgA/kuFSdxB8xIPt4p/T78kwsg==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + '@next/swc-win32-arm64-msvc@15.2.2': resolution: {integrity: sha512-nG644Es5llSGEcTaXhnGWR/aThM/hIaz0jx4MDg4gWC8GfTCp8eDBWZ77CVuv2ha/uL9Ce+nPTfYkSLG67/sHg==} engines: {node: '>= 10'} cpu: [arm64] os: [win32] + '@next/swc-win32-arm64-msvc@15.2.3': + resolution: {integrity: sha512-+G2FrDcfm2YDbhDiObDU/qPriWeiz/9cRR0yMWJeTLGGX6/x8oryO3tt7HhodA1vZ8r2ddJPCjtLcpaVl7TE2Q==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [win32] + '@next/swc-win32-x64-msvc@15.2.2': resolution: {integrity: sha512-52nWy65S/R6/kejz3jpvHAjZDPKIbEQu4x9jDBzmB9jJfuOy5rspjKu4u77+fI4M/WzLXrrQd57hlFGzz1ubcQ==} engines: {node: '>= 10'} cpu: [x64] os: [win32] + '@next/swc-win32-x64-msvc@15.2.3': + resolution: {integrity: sha512-gHYS9tc+G2W0ZC8rBL+H6RdtXIyk40uLiaos0yj5US85FNhbFEndMA2nW3z47nzOWiSvXTZ5kBClc3rD0zJg0w==} + engines: {node: '>= 10'} + cpu: [x64] + os: [win32] + '@nodelib/fs.scandir@2.1.5': resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} engines: {node: '>= 8'} @@ -1302,8 +1353,8 @@ packages: peerDependencies: '@types/react': ^19.0.0 - '@types/react@19.0.10': - resolution: {integrity: sha512-JuRQ9KXLEjaUNjTWpzuR231Z2WpIwczOkBEIvbHNCzQefFIT0L8IqE6NV6ULLyC1SI/i234JnDoMkfg+RjQj2g==} + '@types/react@19.0.11': + resolution: {integrity: sha512-vrdxRZfo9ALXth6yPfV16PYTLZwsUWhVjjC+DkfE5t1suNSbBrWC9YqSuuxJZ8Ps6z1o2ycRpIqzZJIgklq4Tw==} '@types/trusted-types@2.0.7': resolution: {integrity: sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==} @@ -1638,8 +1689,8 @@ packages: resolution: {integrity: sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw==} engines: {node: '>=14.16'} - caniuse-lite@1.0.30001705: - resolution: {integrity: sha512-S0uyMMiYvA7CxNgomYBwwwPUnWzFD83f3B1ce5jHUfHTH//QL6hHsreI8RVC5606R4ssqravelYO5TU6t8sEyg==} + caniuse-lite@1.0.30001706: + resolution: {integrity: sha512-3ZczoTApMAZwPKYWmwVbQMFpXBDds3/0VciVoUwPUbldlYyVLmRVuRs/PcUZtHpbLRpzzDvrvnFuREsGt6lUug==} ccount@2.0.1: resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} @@ -3359,6 +3410,27 @@ packages: sass: optional: true + next@15.2.3: + resolution: {integrity: sha512-x6eDkZxk2rPpu46E1ZVUWIBhYCLszmUY6fvHBFcbzJ9dD+qRX6vcHusaqqDlnY+VngKzKbAiG2iRCkPbmi8f7w==} + engines: {node: ^18.18.0 || ^19.8.0 || >= 20.0.0} + hasBin: true + peerDependencies: + '@opentelemetry/api': ^1.1.0 + '@playwright/test': ^1.41.2 + babel-plugin-react-compiler: '*' + react: ^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0 + react-dom: ^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0 + sass: ^1.3.0 + peerDependenciesMeta: + '@opentelemetry/api': + optional: true + '@playwright/test': + optional: true + babel-plugin-react-compiler: + optional: true + sass: + optional: true + nextra-theme-docs@4.2.16: resolution: {integrity: sha512-IbEf7A7qd2PWYZ8XlwIXNghZRPxbiTw1tbPejH/tNX6nmAHUNpCrDPQO/jraYSnEae2DSb/5ZOBdqMT1c03paQ==} peerDependencies: @@ -5284,34 +5356,60 @@ snapshots: '@next/env@15.2.2': {} - '@next/eslint-plugin-next@15.2.2': + '@next/env@15.2.3': {} + + '@next/eslint-plugin-next@15.2.3': dependencies: fast-glob: 3.3.1 '@next/swc-darwin-arm64@15.2.2': optional: true + '@next/swc-darwin-arm64@15.2.3': + optional: true + '@next/swc-darwin-x64@15.2.2': optional: true + '@next/swc-darwin-x64@15.2.3': + optional: true + '@next/swc-linux-arm64-gnu@15.2.2': optional: true + '@next/swc-linux-arm64-gnu@15.2.3': + optional: true + '@next/swc-linux-arm64-musl@15.2.2': optional: true + '@next/swc-linux-arm64-musl@15.2.3': + optional: true + '@next/swc-linux-x64-gnu@15.2.2': optional: true + '@next/swc-linux-x64-gnu@15.2.3': + optional: true + '@next/swc-linux-x64-musl@15.2.2': optional: true + '@next/swc-linux-x64-musl@15.2.3': + optional: true + '@next/swc-win32-arm64-msvc@15.2.2': optional: true + '@next/swc-win32-arm64-msvc@15.2.3': + optional: true + '@next/swc-win32-x64-msvc@15.2.2': optional: true + '@next/swc-win32-x64-msvc@15.2.3': + optional: true + '@nodelib/fs.scandir@2.1.5': dependencies: '@nodelib/fs.stat': 2.0.5 @@ -5759,11 +5857,11 @@ snapshots: dependencies: undici-types: 6.20.0 - '@types/react-dom@19.0.4(@types/react@19.0.10)': + '@types/react-dom@19.0.4(@types/react@19.0.11)': dependencies: - '@types/react': 19.0.10 + '@types/react': 19.0.11 - '@types/react@19.0.10': + '@types/react@19.0.11': dependencies: csstype: 3.1.3 @@ -6151,7 +6249,7 @@ snapshots: camelcase@7.0.1: {} - caniuse-lite@1.0.30001705: {} + caniuse-lite@1.0.30001706: {} ccount@2.0.1: {} @@ -8392,7 +8490,7 @@ snapshots: '@swc/counter': 0.1.3 '@swc/helpers': 0.5.15 busboy: 1.6.0 - caniuse-lite: 1.0.30001705 + caniuse-lite: 1.0.30001706 postcss: 8.4.31 react: 19.0.0 react-dom: 19.0.0(react@19.0.0) @@ -8412,26 +8510,52 @@ snapshots: - '@babel/core' - babel-plugin-macros - nextra-theme-docs@4.2.16(@types/react@19.0.10)(next@15.2.2(@playwright/test@1.51.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(nextra@4.2.16(acorn@8.14.1)(next@15.2.2(@playwright/test@1.51.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.8.2))(react-dom@19.0.0(react@19.0.0))(react@19.0.0): + next@15.2.3(@playwright/test@1.51.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0): + dependencies: + '@next/env': 15.2.3 + '@swc/counter': 0.1.3 + '@swc/helpers': 0.5.15 + busboy: 1.6.0 + caniuse-lite: 1.0.30001706 + postcss: 8.4.31 + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) + styled-jsx: 5.1.6(react@19.0.0) + optionalDependencies: + '@next/swc-darwin-arm64': 15.2.3 + '@next/swc-darwin-x64': 15.2.3 + '@next/swc-linux-arm64-gnu': 15.2.3 + '@next/swc-linux-arm64-musl': 15.2.3 + '@next/swc-linux-x64-gnu': 15.2.3 + '@next/swc-linux-x64-musl': 15.2.3 + '@next/swc-win32-arm64-msvc': 15.2.3 + '@next/swc-win32-x64-msvc': 15.2.3 + '@playwright/test': 1.51.1 + sharp: 0.33.5 + transitivePeerDependencies: + - '@babel/core' + - babel-plugin-macros + + nextra-theme-docs@4.2.16(@types/react@19.0.11)(next@15.2.3(@playwright/test@1.51.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(nextra@4.2.16(acorn@8.14.1)(next@15.2.3(@playwright/test@1.51.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.8.2))(react-dom@19.0.0(react@19.0.0))(react@19.0.0): dependencies: '@headlessui/react': 2.2.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0) clsx: 2.1.1 - next: 15.2.2(@playwright/test@1.51.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + next: 15.2.3(@playwright/test@1.51.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) next-themes: 0.4.6(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - nextra: 4.2.16(acorn@8.14.1)(next@15.2.2(@playwright/test@1.51.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.8.2) + nextra: 4.2.16(acorn@8.14.1)(next@15.2.3(@playwright/test@1.51.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.8.2) react: 19.0.0 react-compiler-runtime: 0.0.0-experimental-22c6e49-20241219(react@19.0.0) react-dom: 19.0.0(react@19.0.0) scroll-into-view-if-needed: 3.1.0 zod: 3.24.2 zod-validation-error: 3.4.0(zod@3.24.2) - zustand: 5.0.3(@types/react@19.0.10)(react@19.0.0) + zustand: 5.0.3(@types/react@19.0.11)(react@19.0.0) transitivePeerDependencies: - '@types/react' - immer - use-sync-external-store - nextra@4.2.16(acorn@8.14.1)(next@15.2.2(@playwright/test@1.51.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.8.2): + nextra@4.2.16(acorn@8.14.1)(next@15.2.3(@playwright/test@1.51.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.8.2): dependencies: '@formatjs/intl-localematcher': 0.6.0 '@headlessui/react': 2.2.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0) @@ -8452,7 +8576,7 @@ snapshots: mdast-util-gfm: 3.1.0 mdast-util-to-hast: 13.2.0 negotiator: 1.0.0 - next: 15.2.2(@playwright/test@1.51.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + next: 15.2.3(@playwright/test@1.51.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) react: 19.0.0 react-compiler-runtime: 0.0.0-experimental-22c6e49-20241219(react@19.0.0) react-dom: 19.0.0(react@19.0.0) @@ -10067,9 +10191,9 @@ snapshots: zod@3.24.2: {} - zustand@5.0.3(@types/react@19.0.10)(react@19.0.0): + zustand@5.0.3(@types/react@19.0.11)(react@19.0.0): optionalDependencies: - '@types/react': 19.0.10 + '@types/react': 19.0.11 react: 19.0.0 zwitch@2.0.4: {} diff --git a/turbo.json b/turbo.json index f5cb50e6..2c7dc649 100644 --- a/turbo.json +++ b/turbo.json @@ -6,6 +6,7 @@ "tasks": { "build": { "dependsOn": ["^build"], + "cache": false, "env": [ "REDIS_URL", "REMOTE_CACHE_SERVER_BASE_URL", From fc874c6754fb1d488d01a1163d20bcd9b1368e09 Mon Sep 17 00:00:00 2001 From: better-salmon <132773930+better-salmon@users.noreply.github.com> Date: Wed, 19 Mar 2025 18:55:06 +0200 Subject: [PATCH 11/16] Implement use-cache-cache helper --- apps/cache-testing/package.json | 4 +- apps/cache-testing/redis.js | 11 +- .../src/utils/create-get-data.ts | 1 + docs/cache-handler-docs/package.json | 4 +- internal/eslint-config/package.json | 2 +- internal/typescript-config/lib.json | 2 +- package.json | 2 +- packages/cache-handler/package.json | 1 + packages/cache-handler/src/use-cache-cache.ts | 152 ++++++ .../cache-handler/src/use-cache/node-redis.ts | 114 +++++ packages/cache-handler/src/use-cache/redis.ts | 467 ++++-------------- pnpm-lock.yaml | 296 ++++------- 12 files changed, 455 insertions(+), 601 deletions(-) create mode 100644 packages/cache-handler/src/use-cache-cache.ts create mode 100644 packages/cache-handler/src/use-cache/node-redis.ts diff --git a/apps/cache-testing/package.json b/apps/cache-testing/package.json index 85e6bfb2..ec9e32dc 100644 --- a/apps/cache-testing/package.json +++ b/apps/cache-testing/package.json @@ -18,7 +18,7 @@ "dependencies": { "@neshca/cache-handler": "workspace:*", "axios": "1.8.3", - "next": "15.2.3", + "next": "15.3.0-canary.13", "react": "19.0.0", "react-dom": "19.0.0", "redis": "4.7.0" @@ -28,7 +28,7 @@ "@repo/eslint-config": "workspace:*", "@repo/typescript-config": "workspace:*", "@types/node": "22.13.10", - "@types/react": "19.0.11", + "@types/react": "19.0.12", "@types/react-dom": "19.0.4", "dotenv-cli": "8.0.0", "eslint": "9.22.0", diff --git a/apps/cache-testing/redis.js b/apps/cache-testing/redis.js index 225bf8cd..3046dcf8 100644 --- a/apps/cache-testing/redis.js +++ b/apps/cache-testing/redis.js @@ -1,3 +1,10 @@ -import redis from '@neshca/cache-handler/use-cache/redis'; +import { createRedisCacheHandler } from '@neshca/cache-handler/use-cache/node-redis'; +import { createClient } from 'redis'; -export default redis; +export default createRedisCacheHandler({ + client: createClient({ + url: process.env.REDIS_URL, + }), + keyPrefix: 'use-cache-redis:', + sharedTagsKey: 'tags', +}); diff --git a/apps/cache-testing/src/utils/create-get-data.ts b/apps/cache-testing/src/utils/create-get-data.ts index 0268bb3b..8fda5a92 100644 --- a/apps/cache-testing/src/utils/create-get-data.ts +++ b/apps/cache-testing/src/utils/create-get-data.ts @@ -15,6 +15,7 @@ export function createGetData(path: string, revalidate?: number) { cacheLife({ revalidate, + expire: revalidate ? revalidate * 2 : undefined, }); cacheTag(pathAndTag, 'whole-app-route'); diff --git a/docs/cache-handler-docs/package.json b/docs/cache-handler-docs/package.json index 6c6d4355..12c409e3 100644 --- a/docs/cache-handler-docs/package.json +++ b/docs/cache-handler-docs/package.json @@ -12,7 +12,7 @@ "start:docs": "serve out" }, "dependencies": { - "next": "15.2.3", + "next": "15.3.0-canary.13", "nextra": "4.2.16", "nextra-theme-docs": "4.2.16", "react": "19.0.0", @@ -22,7 +22,7 @@ "@repo/eslint-config": "workspace:*", "@repo/typescript-config": "workspace:*", "@types/node": "22.13.10", - "@types/react": "19.0.11", + "@types/react": "19.0.12", "@types/react-dom": "19.0.4", "eslint": "9.22.0", "pagefind": "1.3.0", diff --git a/internal/eslint-config/package.json b/internal/eslint-config/package.json index d2e8f3ab..6d9ba3f1 100644 --- a/internal/eslint-config/package.json +++ b/internal/eslint-config/package.json @@ -8,7 +8,7 @@ }, "devDependencies": { "@eslint/js": "9.22.0", - "@next/eslint-plugin-next": "15.2.3", + "@next/eslint-plugin-next": "15.3.0-canary.13", "eslint": "9.22.0", "eslint-config-prettier": "10.1.1", "eslint-plugin-react": "7.37.4", diff --git a/internal/typescript-config/lib.json b/internal/typescript-config/lib.json index ae898d31..6690c5a2 100644 --- a/internal/typescript-config/lib.json +++ b/internal/typescript-config/lib.json @@ -4,7 +4,7 @@ "_version": "20.17.0", "compilerOptions": { "target": "es2022", - "lib": ["es2023"], + "lib": ["es2024"], "module": "NodeNext", "moduleDetection": "force", diff --git a/package.json b/package.json index 84fb8432..d746d021 100644 --- a/package.json +++ b/package.json @@ -34,7 +34,7 @@ "turbo": "2.4.4", "typescript": "5.8.2" }, - "packageManager": "pnpm@10.5.2+sha512.da9dc28cd3ff40d0592188235ab25d3202add8a207afbedc682220e4a0029ffbff4562102b9e6e46b4e3f9e8bd53e6d05de48544b0c57d4b0179e22c76d1199b", + "packageManager": "pnpm@10.6.4+sha512.da3d715bfd22a9a105e6e8088cfc7826699332ded60c423b14ec613a185f1602206702ff0fe4c438cb15c979081ce4cb02568e364b15174503a63c7a8e2a5f6c", "engines": { "node": ">=22.11.0" } diff --git a/packages/cache-handler/package.json b/packages/cache-handler/package.json index c8c14e5d..b87e8d57 100644 --- a/packages/cache-handler/package.json +++ b/packages/cache-handler/package.json @@ -44,6 +44,7 @@ "devDependencies": { "@repo/typescript-config": "workspace:*", "@types/node": "22.13.10", + "next": "15.3.0-canary.13", "tsx": "4.19.3", "typescript": "5.8.2", "vitest": "3.0.9" diff --git a/packages/cache-handler/src/use-cache-cache.ts b/packages/cache-handler/src/use-cache-cache.ts new file mode 100644 index 00000000..0d974748 --- /dev/null +++ b/packages/cache-handler/src/use-cache-cache.ts @@ -0,0 +1,152 @@ +import type { + CacheEntry, + CacheHandlerV2, +} from 'next/dist/server/lib/cache-handlers/types.js'; +import { + isStale, + tagsManifest, +} from 'next/dist/server/lib/incremental-cache/tags-manifest.external.js'; + +export type SerializedCacheEntry = Omit & { + value: string; +}; + +export type { CacheHandlerV2, CacheEntry }; + +const pendingSets = new Map>(); + +export type RemoteStore = { + get(key: string): Promise; + set(key: string, value: string): Promise; + refreshTags(tagsManifest: Map): Promise; + getExpirationTimestamps(tags: string[]): Promise; + expireTags(expiredTags: Map): Promise; +}; +export async function createCacheHandler( + remoteStorePromise: Promise, +) { + const cacheHandler: CacheHandlerV2 = { + async get(cacheKey) { + await pendingSets.get(cacheKey); + + try { + const remoteStore = await remoteStorePromise; + + const serializedEntry: string | undefined = + await remoteStore.get(cacheKey); + + if (!serializedEntry) { + return undefined; + } + + const entry: SerializedCacheEntry = JSON.parse(serializedEntry); + + const now = performance.timeOrigin + performance.now(); + + if (now > entry.timestamp + entry.revalidate * 1000) { + return undefined; + } + + if (isStale(entry.tags, entry.timestamp)) { + return undefined; + } + + return { + expire: entry.expire, + revalidate: entry.revalidate, + stale: entry.stale, + tags: entry.tags, + timestamp: entry.timestamp, + value: new ReadableStream({ + start(controller) { + controller.enqueue(Buffer.from(entry.value, 'base64')); + controller.close(); + }, + }), + } satisfies CacheEntry; + } catch (_error) { + // + } + + return undefined; + }, + async set(cacheKey, pendingEntry) { + const { resolve: resolvePending, promise: pendingPromise } = + Promise.withResolvers(); + + pendingSets.set(cacheKey, pendingPromise); + + try { + const entry = await pendingEntry; + + try { + const [value, clonedValue] = entry.value.tee(); + entry.value = value; + + const chunks: Uint8Array[] = []; + + for await (const chunk of clonedValue) { + chunks.push(chunk); + } + + const storageEntry: SerializedCacheEntry = { + expire: entry.expire, + revalidate: entry.revalidate, + stale: entry.stale, + tags: entry.tags, + timestamp: entry.timestamp, + value: Buffer.concat(chunks).toString('base64'), + }; + + const remoteStore = await remoteStorePromise; + + await remoteStore.set(cacheKey, JSON.stringify(storageEntry)); + } catch (_error) { + // + } finally { + resolvePending(); + pendingSets.delete(cacheKey); + } + } catch (_error) { + // + } finally { + resolvePending(); + pendingSets.delete(cacheKey); + } + }, + async refreshTags() { + const remoteStore = await remoteStorePromise; + + await remoteStore.refreshTags(tagsManifest); + }, + async getExpiration(...tags) { + const remoteStore = await remoteStorePromise; + + const timestamps = await remoteStore.getExpirationTimestamps(tags); + + return Math.max(...timestamps); + }, + async expireTags(...tags) { + if (tags.length === 0) { + return; + } + + const timestamp = performance.timeOrigin + performance.now(); + + const expiredTags = new Map(); + + for (const tag of tags) { + tagsManifest.set(tag, timestamp); + expiredTags.set(tag, timestamp); + } + + const remoteStore = await remoteStorePromise; + + await remoteStore.expireTags(expiredTags); + }, + }; + + return cacheHandler; +} + +export default createCacheHandler; diff --git a/packages/cache-handler/src/use-cache/node-redis.ts b/packages/cache-handler/src/use-cache/node-redis.ts new file mode 100644 index 00000000..dcc7afe2 --- /dev/null +++ b/packages/cache-handler/src/use-cache/node-redis.ts @@ -0,0 +1,114 @@ +import type { createClient } from 'redis'; +import { createRedisTimeoutConfig } from '../helpers/create-redis-timeout-config.js'; +import { type RemoteStore, createCacheHandler } from '../use-cache-cache.js'; + +export type Config> = { + client: T; + keyPrefix?: string; + sharedTagsKey?: string; + timeoutMs?: number; +}; + +function createRedisStore>({ + client, + keyPrefix, + sharedTagsKey, + timeoutMs = 5000, +}: Config): RemoteStore { + const getKey = (key: string) => `${keyPrefix}${key}`; + const getSharedTagsKey = () => `${keyPrefix}${sharedTagsKey}`; + + return { + async get(key) { + if (!client.isReady) { + return Promise.resolve(undefined); + } + + const options = createRedisTimeoutConfig(timeoutMs); + + return (await client.get(options, getKey(key))) ?? undefined; + }, + async set(key, value) { + if (!client.isReady) { + return; + } + + const options = createRedisTimeoutConfig(timeoutMs); + + await client.set(options, getKey(key), value); + }, + async expireTags(expiredTags) { + if (!client.isReady) { + return; + } + + const options = createRedisTimeoutConfig(timeoutMs); + + await client.hSet( + options, + getSharedTagsKey(), + Object.fromEntries(expiredTags), + ); + }, + getExpirationTimestamps() { + return Promise.resolve([]); + }, + async refreshTags(tagsManifest) { + try { + if (!client?.isReady) { + return; + } + + let cursor = 0; + + const hScanOptions = { COUNT: 10 }; + + do { + const options = createRedisTimeoutConfig(timeoutMs); + + const remoteTagsPortion = await client.hScan( + options, + getSharedTagsKey(), + cursor, + hScanOptions, + ); + + for (const { + field: tag, + value: timestampStr, + } of remoteTagsPortion.tuples) { + try { + const timestamp = Number.parseInt(timestampStr, 10); + + if (!Number.isNaN(timestamp)) { + tagsManifest.set(tag, timestamp); + } + } catch (err) { + console.error(`Failed to parse tag timestamp for ${tag}:`, err); + } + } + + cursor = remoteTagsPortion.cursor; + } while (cursor !== 0); + } catch (error) { + console.error('Failed to load tags from Redis:', error); + } + }, + }; +} + +export function createRedisCacheHandler< + T extends ReturnType, +>({ client, keyPrefix, sharedTagsKey, timeoutMs }: Config) { + const remoteStore = client + .connect() + .then((redisClient) => ({ + client: redisClient, + keyPrefix, + sharedTagsKey, + timeoutMs, + })) + .then(createRedisStore); + + return createCacheHandler(remoteStore); +} diff --git a/packages/cache-handler/src/use-cache/redis.ts b/packages/cache-handler/src/use-cache/redis.ts index d3a05816..7cc39fee 100644 --- a/packages/cache-handler/src/use-cache/redis.ts +++ b/packages/cache-handler/src/use-cache/redis.ts @@ -1,304 +1,96 @@ import type { CacheEntry, - CacheHandler, + CacheHandlerV2, } from 'next/dist/server/lib/cache-handlers/types.js'; import { - isTagStale, - tagsManifest as localTagsManifest, + isStale, + tagsManifest, } from 'next/dist/server/lib/incremental-cache/tags-manifest.external.js'; import { type RedisClientOptions, createClient } from 'redis'; -/** - * Configuration options for the Redis cache handler - */ type RedisConfig = { - /** - * Redis connection URL (defaults to 'redis://localhost:6379') - */ url?: string; - /** - * Prefix for all Redis keys (defaults to 'neshca:') - */ keyPrefix?: string; - /** - * Pub/Sub channel name for tag invalidations (defaults to 'neshca:tag-invalidations') - */ - tagChannel?: string; - /** - * Redis connection options passed directly to the Redis client - */ clientOptions?: RedisClientOptions; - /** - * Multiplier for revalidate time when calculating cache expiration (defaults to 2) - */ - revalidateTimeMultiplier?: number; - /** - * Default expiration time in seconds when revalidate time is not available (defaults to 60) - */ - defaultExpirationSeconds?: number; - /** - * Minimum expiration time in seconds (defaults to 1) - */ - minimumExpirationSeconds?: number; + tagsScanSize?: number; }; -/** - * Default configuration values for the Redis cache handler - */ const DEFAULT_CONFIG: RedisConfig = { url: 'redis://localhost:6379', keyPrefix: 'neshca:', - tagChannel: 'neshca:tag-invalidations', - revalidateTimeMultiplier: 2, - defaultExpirationSeconds: 60, - minimumExpirationSeconds: 1, + tagsScanSize: 10, }; -/** - * Key name for storing tags in Redis - */ -const TAGS_KEY = 'tags'; - -/** - * Message format for tag invalidation events published to Redis - */ -type TagInvalidationMessage = { - /** - * Array of tags to invalidate - */ - tags: string[]; - /** - * Timestamp when the invalidation occurred - */ - timestamp: number; -}; - -/** - * Internal representation of a cache entry with error handling metadata - */ -type PrivateCacheEntry = { - /** - * The actual cache entry - */ - entry: CacheEntry; - - /** - * Flag indicating if this entry resulted from an error - * - * For the default cache we store errored cache - * entries and allow them to be used up to 3 times - * after that we want to dispose it and try for fresh - * - * If an entry is errored we return no entry - * three times so that we retry hitting origin (MISS) - * and then if it still fails to set after the third we - * return the errored content and use expiration of - * Math.min(30, entry.expiration) - */ - isErrored: boolean; - - /** - * Count of retry attempts for errored entries - */ - errorRetryCount: number; -}; +const TAGS_MANIFEST_KEY = 'tagsManifest'; -/** - * Modified cache entry type for storage in Redis - * Converts the ReadableStream value to a string for storage - */ type StorageCacheEntry = Omit & { - /** - * Base64-encoded string representation of the original value - */ value: string; }; -/** - * Map to track pending cache set operations - */ const pendingSets = new Map>(); -/** - * Creates a Redis-based cache handler for Next.js - * - * @param config - Configuration options for Redis - * @returns A CacheHandler implementation using Redis for storage and invalidation - */ function createRedisCacheHandler(config: RedisConfig = {}) { - // Merge default config with provided config const mergedConfig = { ...DEFAULT_CONFIG, ...config }; - const { - url, - keyPrefix, - tagChannel, - clientOptions, - revalidateTimeMultiplier = 2, - defaultExpirationSeconds = 60, - minimumExpirationSeconds = 1, - } = mergedConfig; - - // Create main Redis client - const redisConnection = createClient({ - url, - ...clientOptions, - }); + const { url, keyPrefix, clientOptions, tagsScanSize } = mergedConfig; - // Create separate subscriber client for pub/sub - // (Redis requires a dedicated connection for pub/sub) - const subscriberConnection = createClient({ + const redisConnection = createClient({ url, ...clientOptions, }); - // Connect both clients const connectionPromise: Promise> = redisConnection.connect().then((client) => { return client; }); - /** - * Generates a fully-qualified Redis key with the configured prefix - * - * @param key - The base key - * @returns The key with prefix applied - */ const getKey = (key: string) => `${keyPrefix}${key}`; - /** - * Gets the fully-qualified Redis key for storing tags - * - * @returns The tags key with prefix applied - */ - const getTagsKey = () => getKey(TAGS_KEY); - - // Initialize by loading tags from Redis and setting up subscriber - const initializePromise = (async () => { - try { - // Connect subscriber - await subscriberConnection.connect(); - - // Load existing tags from Redis - await loadTagsFromRedis(); - - // Subscribe to tag invalidation channel - if (tagChannel) { - await subscriberConnection.subscribe(tagChannel, handleTagInvalidation); - } - - // Use logger in production instead of console - console.info('Redis cache handler initialized with pub/sub'); - } catch (error) { - console.error('Failed to initialize Redis cache handler:', error); - - // Attempt reconnection for subscriber - subscriberConnection.on('error', handleRedisError); - subscriberConnection.on('reconnecting', handleRedisReconnecting); - subscriberConnection.on('ready', handleRedisReady); - } - })(); + const TAGS_KEY = getKey(TAGS_MANIFEST_KEY); - /** - * Loads tags from Redis into the local tags manifest - * Called during initialization and after reconnection - */ - async function loadTagsFromRedis() { + async function refreshTagsFromRemote() { try { const redisClient = await connectionPromise; + if (!redisClient?.isReady) { return; } - const tagsData = await redisClient.hGetAll(getTagsKey()); - - // Reset local cache - for (const key of Object.keys(localTagsManifest.items)) { - delete localTagsManifest.items[key]; - } - - // Update local cache from Redis data - for (const [tag, timestampStr] of Object.entries(tagsData)) { - try { - const timestamp = Number.parseInt(timestampStr, 10); - if (!Number.isNaN(timestamp)) { - localTagsManifest.items[tag] = { revalidatedAt: timestamp }; + let cursor = 0; + + const hScanOptions = { COUNT: tagsScanSize }; + + do { + const remoteTagsPortion = await redisClient.hScan( + TAGS_KEY, + cursor, + hScanOptions, + ); + + for (const { + field: tag, + value: timestampStr, + } of remoteTagsPortion.tuples) { + try { + const timestamp = Number.parseInt(timestampStr, 10); + + if (!Number.isNaN(timestamp)) { + tagsManifest.set(tag, timestamp); + } + } catch (err) { + console.error(`Failed to parse tag timestamp for ${tag}:`, err); } - } catch (err) { - console.error(`Failed to parse tag timestamp for ${tag}:`, err); } - } - } catch (error) { - console.error('Failed to load tags from Redis:', error); - } - } - - /** - * Handles tag invalidation messages from the Redis pub/sub channel - * Updates the local tags manifest with the received invalidation data - * - * @param message - JSON string containing tag invalidation information - */ - function handleTagInvalidation(message: string) { - try { - const invalidation: TagInvalidationMessage = JSON.parse(message); - // Update local tagsManifest with the received tags - for (const tag of invalidation.tags) { - if (!localTagsManifest.items[tag]) { - localTagsManifest.items[tag] = {}; - } - localTagsManifest.items[tag].revalidatedAt = invalidation.timestamp; - } + cursor = remoteTagsPortion.cursor; + } while (cursor !== 0); } catch (error) { - console.error('Failed to process tag invalidation message:', error); + console.error('Failed to load tags from Redis:', error); } } - /** - * Handles Redis connection errors - * - * @param error - The error that occurred - */ - function handleRedisError(error: Error) { - console.error('Redis connection error:', error); - } - - /** - * Handles Redis reconnection attempts - */ - function handleRedisReconnecting() { - console.info('Redis reconnecting...'); - } - - /** - * Handles successful Redis reconnection - * Reloads tags and resubscribes to the pub/sub channel - */ - function handleRedisReady() { - console.info('Redis connection reestablished'); - // Reload tags and resubscribe after reconnection - loadTagsFromRedis().then(() => { - if (tagChannel) { - subscriberConnection.subscribe(tagChannel, handleTagInvalidation); - } - }); - } - - /** - * The Redis-based cache handler implementation - */ - const DefaultCacheHandler: CacheHandler = { - /** - * Retrieves a cache entry from Redis - * - * @param cacheKey - The key to look up - * @param softTags - Optional tags for soft validation - * @returns The cache entry if found and valid, undefined otherwise - */ - async get(cacheKey, softTags) { - // Ensure initialization is complete - await initializePromise; + const DefaultCacheHandler: CacheHandlerV2 = { + async get(cacheKey) { await pendingSets.get(cacheKey); const redisClient = await connectionPromise; @@ -314,64 +106,41 @@ function createRedisCacheHandler(config: RedisConfig = {}) { return undefined; } - const privateEntry: PrivateCacheEntry = JSON.parse(privateEntryJson); - const entry = privateEntry.entry; - - // Restore the ReadableStream from base64 string - if (typeof entry.value === 'string') { - const buffer = Buffer.from(entry.value, 'base64'); - entry.value = new ReadableStream({ - start(controller) { - controller.enqueue(new Uint8Array(buffer)); - controller.close(); - }, - }); - } + const entry: StorageCacheEntry = JSON.parse(privateEntryJson); + const now = performance.timeOrigin + performance.now(); - if ( - performance.timeOrigin + performance.now() > - entry.timestamp + entry.revalidate * 1000 - ) { - // Cache entries should expire after revalidate time + if (now > entry.timestamp + entry.revalidate * 1000) { return undefined; } - if ( - isTagStale(entry.tags, entry.timestamp) || - isTagStale(softTags, entry.timestamp) - ) { + if (isStale(entry.tags, entry.timestamp)) { return undefined; } - const [returnStream, newSaved] = entry.value.tee(); - entry.value = newSaved; - return { - ...entry, - value: returnStream, + const cacheEntry: CacheEntry = { + expire: entry.expire, + revalidate: entry.revalidate, + stale: entry.stale, + tags: entry.tags, + timestamp: entry.timestamp, + value: new ReadableStream({ + start(controller) { + controller.enqueue(Buffer.from(entry.value, 'base64')); + controller.close(); + }, + }), }; + + return cacheEntry; } catch (error) { console.error('Error retrieving cache entry:', error); return undefined; } }, - /** - * Stores a cache entry in Redis - * - * @param cacheKey - The key to store the entry under - * @param pendingEntry - Promise resolving to the entry to store - */ async set(cacheKey, pendingEntry) { - // Ensure initialization is complete - await initializePromise; - - let resolvePending: () => void = () => { - // - }; - - const pendingPromise = new Promise((resolve) => { - resolvePending = resolve; - }); + const { resolve: resolvePending, promise: pendingPromise } = + Promise.withResolvers(); pendingSets.set(cacheKey, pendingPromise); @@ -389,48 +158,27 @@ function createRedisCacheHandler(config: RedisConfig = {}) { try { const [value, clonedValue] = entry.value.tee(); entry.value = value; - const reader = clonedValue.getReader(); - - const chunks: Buffer[] = []; - // biome-ignore lint/suspicious/noAssignInExpressions: - // biome-ignore lint/suspicious/noImplicitAnyLet: - // biome-ignore lint/suspicious/noEvolvingTypes: - for (let chunk; !(chunk = await reader.read()).done; ) { - const buffer = Buffer.from(chunk.value); - chunks.push(buffer); - } - // Combine all chunks into a single buffer and convert to base64 - const fullBuffer = Buffer.concat( - chunks.map((chunk) => Buffer.from(chunk)), - ); + const chunks: Uint8Array[] = []; - // Replace the ReadableStream with the base64 string for storage - const storageEntry: StorageCacheEntry = { - ...entry, - value: fullBuffer.toString('base64'), - }; + for await (const chunk of clonedValue) { + chunks.push(chunk); + } - const privateEntry: PrivateCacheEntry = { - entry: storageEntry as unknown as CacheEntry, - isErrored: false, - errorRetryCount: 0, + const storageEntry: StorageCacheEntry = { + expire: entry.expire, + revalidate: entry.revalidate, + stale: entry.stale, + tags: entry.tags, + timestamp: entry.timestamp, + value: Buffer.concat(chunks).toString('base64'), }; - // Store in Redis with an expiration await redisClient.set( getKey(cacheKey), - JSON.stringify(privateEntry), + JSON.stringify(storageEntry), { - EXAT: - Math.floor(Date.now() / 1000) + - Math.max( - minimumExpirationSeconds, - Math.floor( - entry.revalidate * revalidateTimeMultiplier || - defaultExpirationSeconds, - ), - ), + EXAT: Math.floor(entry.timestamp / 1000 + entry.expire), }, ); } catch (error) { @@ -444,85 +192,40 @@ function createRedisCacheHandler(config: RedisConfig = {}) { pendingSets.delete(cacheKey); } }, - - /** - * Invalidates tags by updating their timestamps in Redis and broadcasting the change - * - * @param tags - The tags to invalidate - */ + async refreshTags() { + await refreshTagsFromRemote(); + }, + async getExpiration(...tags) { + return Math.max(...tags.map((tag) => tagsManifest.get(tag) ?? 0)); + }, async expireTags(...tags) { - // Ensure initialization is complete - await initializePromise; - if (tags.length === 0) { return; } - const timestamp = Date.now(); + const timestamp = performance.timeOrigin + performance.now(); + + for (const tag of tags) { + tagsManifest.set(tag, timestamp); + } + const redisClient = await connectionPromise; if (!redisClient?.isReady) { - // Fallback to local update if Redis is not available - for (const tag of tags) { - if (!localTagsManifest.items[tag]) { - localTagsManifest.items[tag] = {}; - } - localTagsManifest.items[tag].revalidatedAt = timestamp; - } return; } try { - // Create a hash of tag-timestamp pairs - const tagUpdates: Record = {}; - - // Build the hash of updates - for (const tag of tags) { - tagUpdates[tag] = timestamp.toString(10); - - // Also update local cache - localTagsManifest.items[tag] ??= {}; - localTagsManifest.items[tag].revalidatedAt = timestamp; - } - - // Use hSet with multiple fields (equivalent to hmset in newer Redis clients) - await redisClient.hSet(getTagsKey(), tagUpdates); - - // Publish invalidation event - const message: TagInvalidationMessage = { - tags, - timestamp, - }; - - if (tagChannel) { - await redisClient.publish(tagChannel, JSON.stringify(message)); - } + await redisClient.hSet(TAGS_KEY, Object.fromEntries(tagsManifest)); } catch (error) { console.error('Failed to expire tags:', error); } }, - - /** - * Handles tag invalidation received from another source - * Simply delegates to expireTags - * - * @param tags - The tags to mark as invalidated - */ - async receiveExpiredTags(...tags): Promise { - // Just delegate to expireTags which handles both local and distributed invalidation - return await this.expireTags(...tags); - }, }; return DefaultCacheHandler; } -/** - * Default Redis cache handler with standard configuration - */ export default createRedisCacheHandler(); -/** - * Factory function for creating a Redis cache handler with custom configuration - */ export { createRedisCacheHandler }; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 60fb0f52..3523c39c 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -36,8 +36,8 @@ importers: specifier: 1.8.3 version: 1.8.3 next: - specifier: 15.2.3 - version: 15.2.3(@playwright/test@1.51.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + specifier: 15.3.0-canary.13 + version: 15.3.0-canary.13(@playwright/test@1.51.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) react: specifier: 19.0.0 version: 19.0.0 @@ -61,11 +61,11 @@ importers: specifier: 22.13.10 version: 22.13.10 '@types/react': - specifier: 19.0.11 - version: 19.0.11 + specifier: 19.0.12 + version: 19.0.12 '@types/react-dom': specifier: 19.0.4 - version: 19.0.4(@types/react@19.0.11) + version: 19.0.4(@types/react@19.0.12) dotenv-cli: specifier: 8.0.0 version: 8.0.0 @@ -88,14 +88,14 @@ importers: docs/cache-handler-docs: dependencies: next: - specifier: 15.2.3 - version: 15.2.3(@playwright/test@1.51.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + specifier: 15.3.0-canary.13 + version: 15.3.0-canary.13(@playwright/test@1.51.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) nextra: specifier: 4.2.16 - version: 4.2.16(acorn@8.14.1)(next@15.2.3(@playwright/test@1.51.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.8.2) + version: 4.2.16(acorn@8.14.1)(next@15.3.0-canary.13(@playwright/test@1.51.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.8.2) nextra-theme-docs: specifier: 4.2.16 - version: 4.2.16(@types/react@19.0.11)(next@15.2.3(@playwright/test@1.51.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(nextra@4.2.16(acorn@8.14.1)(next@15.2.3(@playwright/test@1.51.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.8.2))(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + version: 4.2.16(@types/react@19.0.12)(next@15.3.0-canary.13(@playwright/test@1.51.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(nextra@4.2.16(acorn@8.14.1)(next@15.3.0-canary.13(@playwright/test@1.51.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.8.2))(react-dom@19.0.0(react@19.0.0))(react@19.0.0) react: specifier: 19.0.0 version: 19.0.0 @@ -113,11 +113,11 @@ importers: specifier: 22.13.10 version: 22.13.10 '@types/react': - specifier: 19.0.11 - version: 19.0.11 + specifier: 19.0.12 + version: 19.0.12 '@types/react-dom': specifier: 19.0.4 - version: 19.0.4(@types/react@19.0.11) + version: 19.0.4(@types/react@19.0.12) eslint: specifier: 9.22.0 version: 9.22.0 @@ -162,8 +162,8 @@ importers: specifier: 9.22.0 version: 9.22.0 '@next/eslint-plugin-next': - specifier: 15.2.3 - version: 15.2.3 + specifier: 15.3.0-canary.13 + version: 15.3.0-canary.13 eslint: specifier: 9.22.0 version: 9.22.0 @@ -199,9 +199,6 @@ importers: lru-cache: specifier: ^11.0.2 version: 11.0.2 - next: - specifier: '>= 15 < 16' - version: 15.2.2(@playwright/test@1.51.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) redis: specifier: '>= 4.6' version: 4.7.0 @@ -215,6 +212,9 @@ importers: '@types/node': specifier: 22.13.10 version: 22.13.10 + next: + specifier: 15.3.0-canary.13 + version: 15.3.0-canary.13(@playwright/test@1.51.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) tsx: specifier: 4.19.3 version: 4.19.3 @@ -837,107 +837,56 @@ packages: resolution: {integrity: sha512-jMxvwzkKzd3cXo2EB9GM2ic0eYo2rP/BS6gJt6HnWbsDO1O8GSD4k7o2Cpr2YERtMpGF/MGcDfsfj2EbQPtrXw==} engines: {node: '>= 10'} - '@next/env@15.2.2': - resolution: {integrity: sha512-yWgopCfA9XDR8ZH3taB5nRKtKJ1Q5fYsTOuYkzIIoS8TJ0UAUKAGF73JnGszbjk2ufAQDj6mDdgsJAFx5CLtYQ==} - - '@next/env@15.2.3': - resolution: {integrity: sha512-a26KnbW9DFEUsSxAxKBORR/uD9THoYoKbkpFywMN/AFvboTt94b8+g/07T8J6ACsdLag8/PDU60ov4rPxRAixw==} + '@next/env@15.3.0-canary.13': + resolution: {integrity: sha512-JSc7jRSVdstjZ0bfxKMFeYM+gVRgUbPpGSWq9JLDQDH/mYHMN+LMNR8CafQCKjoSL7tzkBpH9Ug6r9WaIescCw==} - '@next/eslint-plugin-next@15.2.3': - resolution: {integrity: sha512-eNSOIMJtjs+dp4Ms1tB1PPPJUQHP3uZK+OQ7iFY9qXpGO6ojT6imCL+KcUOqE/GXGidWbBZJzYdgAdPHqeCEPA==} + '@next/eslint-plugin-next@15.3.0-canary.13': + resolution: {integrity: sha512-FyzLsLvIdTA7QJBxTeNShszbXhYn8uGJcLdbTDiQUcs2BfSPXpMt26t8nQVdUhNBcxt4XyzEDddIhfIwBYPtWg==} - '@next/swc-darwin-arm64@15.2.2': - resolution: {integrity: sha512-HNBRnz+bkZ+KfyOExpUxTMR0Ow8nkkcE6IlsdEa9W/rI7gefud19+Sn1xYKwB9pdCdxIP1lPru/ZfjfA+iT8pw==} + '@next/swc-darwin-arm64@15.3.0-canary.13': + resolution: {integrity: sha512-A1EiOZHBTFF3Asyb+h4R0/IuOFEx+HN/0ek9BwR7g4neqZunAMU0LaGeExhxX7eUDJR4NWV16HEQq6nBcJB/UA==} engines: {node: '>= 10'} cpu: [arm64] os: [darwin] - '@next/swc-darwin-arm64@15.2.3': - resolution: {integrity: sha512-uaBhA8aLbXLqwjnsHSkxs353WrRgQgiFjduDpc7YXEU0B54IKx3vU+cxQlYwPCyC8uYEEX7THhtQQsfHnvv8dw==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [darwin] - - '@next/swc-darwin-x64@15.2.2': - resolution: {integrity: sha512-mJOUwp7al63tDpLpEFpKwwg5jwvtL1lhRW2fI1Aog0nYCPAhxbJsaZKdoVyPZCy8MYf/iQVNDuk/+i29iLCzIA==} - engines: {node: '>= 10'} - cpu: [x64] - os: [darwin] - - '@next/swc-darwin-x64@15.2.3': - resolution: {integrity: sha512-pVwKvJ4Zk7h+4hwhqOUuMx7Ib02u3gDX3HXPKIShBi9JlYllI0nU6TWLbPT94dt7FSi6mSBhfc2JrHViwqbOdw==} + '@next/swc-darwin-x64@15.3.0-canary.13': + resolution: {integrity: sha512-ojmJVrcv571Q893G0EZGgnYJOGjxYTYSvrNiXMaY2gz9W8p1G+wY/Fc6f2Vm5c2GQcjUdmJOb57x3Ujdxi3szw==} engines: {node: '>= 10'} cpu: [x64] os: [darwin] - '@next/swc-linux-arm64-gnu@15.2.2': - resolution: {integrity: sha512-5ZZ0Zwy3SgMr7MfWtRE7cQWVssfOvxYfD9O7XHM7KM4nrf5EOeqwq67ZXDgo86LVmffgsu5tPO57EeFKRnrfSQ==} + '@next/swc-linux-arm64-gnu@15.3.0-canary.13': + resolution: {integrity: sha512-k4dEOZZ9x8PtHH8HtD/3h/epDBRqWOf13UOE3JY/NH60pY5t4uXG3JEj9tcKnezhv0/Q5eT9c6WiydXdjs2YvQ==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - '@next/swc-linux-arm64-gnu@15.2.3': - resolution: {integrity: sha512-50ibWdn2RuFFkOEUmo9NCcQbbV9ViQOrUfG48zHBCONciHjaUKtHcYFiCwBVuzD08fzvzkWuuZkd4AqbvKO7UQ==} + '@next/swc-linux-arm64-musl@15.3.0-canary.13': + resolution: {integrity: sha512-Ms7b0OF05Q2qpo90ih/cVhviNrEatVZtsobBVyoXGfWxv/gOrhXoxuzROFGNdGXRZNJ7EgUaWmO4pZGjfUhEWw==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - '@next/swc-linux-arm64-musl@15.2.2': - resolution: {integrity: sha512-cgKWBuFMLlJ4TWcFHl1KOaVVUAF8vy4qEvX5KsNd0Yj5mhu989QFCq1WjuaEbv/tO1ZpsQI6h/0YR8bLwEi+nA==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [linux] - - '@next/swc-linux-arm64-musl@15.2.3': - resolution: {integrity: sha512-2gAPA7P652D3HzR4cLyAuVYwYqjG0mt/3pHSWTCyKZq/N/dJcUAEoNQMyUmwTZWCJRKofB+JPuDVP2aD8w2J6Q==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [linux] - - '@next/swc-linux-x64-gnu@15.2.2': - resolution: {integrity: sha512-c3kWSOSsVL8rcNBBfOq1+/j2PKs2nsMwJUV4icUxRgGBwUOfppeh7YhN5s79enBQFU+8xRgVatFkhHU1QW7yUA==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - - '@next/swc-linux-x64-gnu@15.2.3': - resolution: {integrity: sha512-ODSKvrdMgAJOVU4qElflYy1KSZRM3M45JVbeZu42TINCMG3anp7YCBn80RkISV6bhzKwcUqLBAmOiWkaGtBA9w==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - - '@next/swc-linux-x64-musl@15.2.2': - resolution: {integrity: sha512-PXTW9PLTxdNlVYgPJ0equojcq1kNu5NtwcNjRjHAB+/sdoKZ+X8FBu70fdJFadkxFIGekQTyRvPMFF+SOJaQjw==} + '@next/swc-linux-x64-gnu@15.3.0-canary.13': + resolution: {integrity: sha512-id/4NWejJpglZiY/PLpV0H675bITfo0QrUNjZtRuKfphJNkPoRGsMXdaZ3mSpFscTqofyaINQ3fis0D4sSmJUw==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - '@next/swc-linux-x64-musl@15.2.3': - resolution: {integrity: sha512-ZR9kLwCWrlYxwEoytqPi1jhPd1TlsSJWAc+H/CJHmHkf2nD92MQpSRIURR1iNgA/kuFSdxB8xIPt4p/T78kwsg==} + '@next/swc-linux-x64-musl@15.3.0-canary.13': + resolution: {integrity: sha512-9eE2E6KN01yxwE9H2fWaQA6PRvfjuY+lvadGBpub/pf710kdWFe9VYb8zECT492Vw90axHmktFZDTXuf2WaVTA==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - '@next/swc-win32-arm64-msvc@15.2.2': - resolution: {integrity: sha512-nG644Es5llSGEcTaXhnGWR/aThM/hIaz0jx4MDg4gWC8GfTCp8eDBWZ77CVuv2ha/uL9Ce+nPTfYkSLG67/sHg==} + '@next/swc-win32-arm64-msvc@15.3.0-canary.13': + resolution: {integrity: sha512-PbJ/yFCUBxhLr6wKoaC+CQebzeaiqrYOJXEMb9O1XFWp2te8okLjF2BihSziFVLtoA4m2one56pG5jU7W9GUzg==} engines: {node: '>= 10'} cpu: [arm64] os: [win32] - '@next/swc-win32-arm64-msvc@15.2.3': - resolution: {integrity: sha512-+G2FrDcfm2YDbhDiObDU/qPriWeiz/9cRR0yMWJeTLGGX6/x8oryO3tt7HhodA1vZ8r2ddJPCjtLcpaVl7TE2Q==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [win32] - - '@next/swc-win32-x64-msvc@15.2.2': - resolution: {integrity: sha512-52nWy65S/R6/kejz3jpvHAjZDPKIbEQu4x9jDBzmB9jJfuOy5rspjKu4u77+fI4M/WzLXrrQd57hlFGzz1ubcQ==} - engines: {node: '>= 10'} - cpu: [x64] - os: [win32] - - '@next/swc-win32-x64-msvc@15.2.3': - resolution: {integrity: sha512-gHYS9tc+G2W0ZC8rBL+H6RdtXIyk40uLiaos0yj5US85FNhbFEndMA2nW3z47nzOWiSvXTZ5kBClc3rD0zJg0w==} + '@next/swc-win32-x64-msvc@15.3.0-canary.13': + resolution: {integrity: sha512-6dUpH6huWVS0uBObUWBTolu/lZIP99oD1TdgjGt3S2te+OjXAlza8ERgR8mGTV04hpRZFv7tUivISaGlkYE+Bw==} engines: {node: '>= 10'} cpu: [x64] os: [win32] @@ -1353,8 +1302,8 @@ packages: peerDependencies: '@types/react': ^19.0.0 - '@types/react@19.0.11': - resolution: {integrity: sha512-vrdxRZfo9ALXth6yPfV16PYTLZwsUWhVjjC+DkfE5t1suNSbBrWC9YqSuuxJZ8Ps6z1o2ycRpIqzZJIgklq4Tw==} + '@types/react@19.0.12': + resolution: {integrity: sha512-V6Ar115dBDrjbtXSrS+/Oruobc+qVbbUxDFC1RSbRqLt5SYvxxyIDrSC85RWml54g+jfNeEMZhEj7wW07ONQhA==} '@types/trusted-types@2.0.7': resolution: {integrity: sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==} @@ -3301,8 +3250,8 @@ packages: resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} engines: {node: '>= 0.6'} - mime-db@1.53.0: - resolution: {integrity: sha512-oHlN/w+3MQ3rba9rqFr6V/ypF10LSkdwUysQL7GkXoTgIWeV+tcXGA852TBxH+gsh8UWoyhR1hKcoMJTuWflpg==} + mime-db@1.54.0: + resolution: {integrity: sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==} engines: {node: '>= 0.6'} mime-types@2.1.18: @@ -3358,8 +3307,8 @@ packages: mute-stream@0.0.8: resolution: {integrity: sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==} - nanoid@3.3.10: - resolution: {integrity: sha512-vSJJTG+t/dIKAUhUDw/dLdZ9s//5OxcHqLaDWWrW4Cdq7o6tdLIczUkMXt2MBNmk6sJRZBZRXVixs7URY1CmIg==} + nanoid@3.3.11: + resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true @@ -3389,29 +3338,8 @@ packages: react: ^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc react-dom: ^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc - next@15.2.2: - resolution: {integrity: sha512-dgp8Kcx5XZRjMw2KNwBtUzhngRaURPioxoNIVl5BOyJbhi9CUgEtKDO7fx5wh8Z8vOVX1nYZ9meawJoRrlASYA==} - engines: {node: ^18.18.0 || ^19.8.0 || >= 20.0.0} - hasBin: true - peerDependencies: - '@opentelemetry/api': ^1.1.0 - '@playwright/test': ^1.41.2 - babel-plugin-react-compiler: '*' - react: ^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0 - react-dom: ^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0 - sass: ^1.3.0 - peerDependenciesMeta: - '@opentelemetry/api': - optional: true - '@playwright/test': - optional: true - babel-plugin-react-compiler: - optional: true - sass: - optional: true - - next@15.2.3: - resolution: {integrity: sha512-x6eDkZxk2rPpu46E1ZVUWIBhYCLszmUY6fvHBFcbzJ9dD+qRX6vcHusaqqDlnY+VngKzKbAiG2iRCkPbmi8f7w==} + next@15.3.0-canary.13: + resolution: {integrity: sha512-c8BO/c1FjV/jY4OmlBTKaeI0YYDIsakkmJQFgpjq9RzoBetoi/VLAloZMDpsrfSFIhHDHhraLMxzSvS6mFKeuA==} engines: {node: ^18.18.0 || ^19.8.0 || >= 20.0.0} hasBin: true peerDependencies: @@ -3773,8 +3701,8 @@ packages: resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} engines: {node: '>=6'} - quansync@0.2.8: - resolution: {integrity: sha512-4+saucphJMazjt7iOM27mbFCk+D9dd/zmgMDCzRZ8MEoBfYp7lAvoN38et/phRQF6wOPMy/OROBGgoWeSKyluA==} + quansync@0.2.10: + resolution: {integrity: sha512-t41VRkMYbkHyCYmOvx/6URnN80H7k4X0lLdBMGsz+maAwrJQYB1djpV6vHrQIBE0WBSGqhtEHrK9U3DWWH8v7A==} queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} @@ -5354,60 +5282,34 @@ snapshots: '@napi-rs/simple-git-win32-arm64-msvc': 0.1.19 '@napi-rs/simple-git-win32-x64-msvc': 0.1.19 - '@next/env@15.2.2': {} - - '@next/env@15.2.3': {} + '@next/env@15.3.0-canary.13': {} - '@next/eslint-plugin-next@15.2.3': + '@next/eslint-plugin-next@15.3.0-canary.13': dependencies: fast-glob: 3.3.1 - '@next/swc-darwin-arm64@15.2.2': + '@next/swc-darwin-arm64@15.3.0-canary.13': optional: true - '@next/swc-darwin-arm64@15.2.3': + '@next/swc-darwin-x64@15.3.0-canary.13': optional: true - '@next/swc-darwin-x64@15.2.2': + '@next/swc-linux-arm64-gnu@15.3.0-canary.13': optional: true - '@next/swc-darwin-x64@15.2.3': + '@next/swc-linux-arm64-musl@15.3.0-canary.13': optional: true - '@next/swc-linux-arm64-gnu@15.2.2': + '@next/swc-linux-x64-gnu@15.3.0-canary.13': optional: true - '@next/swc-linux-arm64-gnu@15.2.3': + '@next/swc-linux-x64-musl@15.3.0-canary.13': optional: true - '@next/swc-linux-arm64-musl@15.2.2': + '@next/swc-win32-arm64-msvc@15.3.0-canary.13': optional: true - '@next/swc-linux-arm64-musl@15.2.3': - optional: true - - '@next/swc-linux-x64-gnu@15.2.2': - optional: true - - '@next/swc-linux-x64-gnu@15.2.3': - optional: true - - '@next/swc-linux-x64-musl@15.2.2': - optional: true - - '@next/swc-linux-x64-musl@15.2.3': - optional: true - - '@next/swc-win32-arm64-msvc@15.2.2': - optional: true - - '@next/swc-win32-arm64-msvc@15.2.3': - optional: true - - '@next/swc-win32-x64-msvc@15.2.2': - optional: true - - '@next/swc-win32-x64-msvc@15.2.3': + '@next/swc-win32-x64-msvc@15.3.0-canary.13': optional: true '@nodelib/fs.scandir@2.1.5': @@ -5857,11 +5759,11 @@ snapshots: dependencies: undici-types: 6.20.0 - '@types/react-dom@19.0.4(@types/react@19.0.11)': + '@types/react-dom@19.0.4(@types/react@19.0.12)': dependencies: - '@types/react': 19.0.11 + '@types/react': 19.0.12 - '@types/react@19.0.11': + '@types/react@19.0.12': dependencies: csstype: 3.1.3 @@ -6383,7 +6285,7 @@ snapshots: compressible@2.0.18: dependencies: - mime-db: 1.53.0 + mime-db: 1.54.0 compression@1.7.4: dependencies: @@ -7854,7 +7756,7 @@ snapshots: dependencies: mlly: 1.7.4 pkg-types: 2.1.0 - quansync: 0.2.8 + quansync: 0.2.10 locate-path@5.0.0: dependencies: @@ -8416,7 +8318,7 @@ snapshots: mime-db@1.52.0: {} - mime-db@1.53.0: {} + mime-db@1.54.0: {} mime-types@2.1.18: dependencies: @@ -8461,7 +8363,7 @@ snapshots: mute-stream@0.0.8: {} - nanoid@3.3.10: {} + nanoid@3.3.11: {} natural-compare@1.4.0: {} @@ -8484,35 +8386,9 @@ snapshots: react: 19.0.0 react-dom: 19.0.0(react@19.0.0) - next@15.2.2(@playwright/test@1.51.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0): - dependencies: - '@next/env': 15.2.2 - '@swc/counter': 0.1.3 - '@swc/helpers': 0.5.15 - busboy: 1.6.0 - caniuse-lite: 1.0.30001706 - postcss: 8.4.31 - react: 19.0.0 - react-dom: 19.0.0(react@19.0.0) - styled-jsx: 5.1.6(react@19.0.0) - optionalDependencies: - '@next/swc-darwin-arm64': 15.2.2 - '@next/swc-darwin-x64': 15.2.2 - '@next/swc-linux-arm64-gnu': 15.2.2 - '@next/swc-linux-arm64-musl': 15.2.2 - '@next/swc-linux-x64-gnu': 15.2.2 - '@next/swc-linux-x64-musl': 15.2.2 - '@next/swc-win32-arm64-msvc': 15.2.2 - '@next/swc-win32-x64-msvc': 15.2.2 - '@playwright/test': 1.51.1 - sharp: 0.33.5 - transitivePeerDependencies: - - '@babel/core' - - babel-plugin-macros - - next@15.2.3(@playwright/test@1.51.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0): + next@15.3.0-canary.13(@playwright/test@1.51.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0): dependencies: - '@next/env': 15.2.3 + '@next/env': 15.3.0-canary.13 '@swc/counter': 0.1.3 '@swc/helpers': 0.5.15 busboy: 1.6.0 @@ -8522,40 +8398,40 @@ snapshots: react-dom: 19.0.0(react@19.0.0) styled-jsx: 5.1.6(react@19.0.0) optionalDependencies: - '@next/swc-darwin-arm64': 15.2.3 - '@next/swc-darwin-x64': 15.2.3 - '@next/swc-linux-arm64-gnu': 15.2.3 - '@next/swc-linux-arm64-musl': 15.2.3 - '@next/swc-linux-x64-gnu': 15.2.3 - '@next/swc-linux-x64-musl': 15.2.3 - '@next/swc-win32-arm64-msvc': 15.2.3 - '@next/swc-win32-x64-msvc': 15.2.3 + '@next/swc-darwin-arm64': 15.3.0-canary.13 + '@next/swc-darwin-x64': 15.3.0-canary.13 + '@next/swc-linux-arm64-gnu': 15.3.0-canary.13 + '@next/swc-linux-arm64-musl': 15.3.0-canary.13 + '@next/swc-linux-x64-gnu': 15.3.0-canary.13 + '@next/swc-linux-x64-musl': 15.3.0-canary.13 + '@next/swc-win32-arm64-msvc': 15.3.0-canary.13 + '@next/swc-win32-x64-msvc': 15.3.0-canary.13 '@playwright/test': 1.51.1 sharp: 0.33.5 transitivePeerDependencies: - '@babel/core' - babel-plugin-macros - nextra-theme-docs@4.2.16(@types/react@19.0.11)(next@15.2.3(@playwright/test@1.51.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(nextra@4.2.16(acorn@8.14.1)(next@15.2.3(@playwright/test@1.51.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.8.2))(react-dom@19.0.0(react@19.0.0))(react@19.0.0): + nextra-theme-docs@4.2.16(@types/react@19.0.12)(next@15.3.0-canary.13(@playwright/test@1.51.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(nextra@4.2.16(acorn@8.14.1)(next@15.3.0-canary.13(@playwright/test@1.51.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.8.2))(react-dom@19.0.0(react@19.0.0))(react@19.0.0): dependencies: '@headlessui/react': 2.2.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0) clsx: 2.1.1 - next: 15.2.3(@playwright/test@1.51.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + next: 15.3.0-canary.13(@playwright/test@1.51.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) next-themes: 0.4.6(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - nextra: 4.2.16(acorn@8.14.1)(next@15.2.3(@playwright/test@1.51.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.8.2) + nextra: 4.2.16(acorn@8.14.1)(next@15.3.0-canary.13(@playwright/test@1.51.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.8.2) react: 19.0.0 react-compiler-runtime: 0.0.0-experimental-22c6e49-20241219(react@19.0.0) react-dom: 19.0.0(react@19.0.0) scroll-into-view-if-needed: 3.1.0 zod: 3.24.2 zod-validation-error: 3.4.0(zod@3.24.2) - zustand: 5.0.3(@types/react@19.0.11)(react@19.0.0) + zustand: 5.0.3(@types/react@19.0.12)(react@19.0.0) transitivePeerDependencies: - '@types/react' - immer - use-sync-external-store - nextra@4.2.16(acorn@8.14.1)(next@15.2.3(@playwright/test@1.51.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.8.2): + nextra@4.2.16(acorn@8.14.1)(next@15.3.0-canary.13(@playwright/test@1.51.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.8.2): dependencies: '@formatjs/intl-localematcher': 0.6.0 '@headlessui/react': 2.2.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0) @@ -8576,7 +8452,7 @@ snapshots: mdast-util-gfm: 3.1.0 mdast-util-to-hast: 13.2.0 negotiator: 1.0.0 - next: 15.2.3(@playwright/test@1.51.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + next: 15.3.0-canary.13(@playwright/test@1.51.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) react: 19.0.0 react-compiler-runtime: 0.0.0-experimental-22c6e49-20241219(react@19.0.0) react-dom: 19.0.0(react@19.0.0) @@ -8740,7 +8616,7 @@ snapshots: package-manager-detector@0.2.11: dependencies: - quansync: 0.2.8 + quansync: 0.2.10 pagefind@1.3.0: optionalDependencies: @@ -8958,13 +8834,13 @@ snapshots: postcss@8.4.31: dependencies: - nanoid: 3.3.10 + nanoid: 3.3.11 picocolors: 1.1.1 source-map-js: 1.2.1 postcss@8.5.3: dependencies: - nanoid: 3.3.10 + nanoid: 3.3.11 picocolors: 1.1.1 source-map-js: 1.2.1 @@ -9019,7 +8895,7 @@ snapshots: punycode@2.3.1: {} - quansync@0.2.8: {} + quansync@0.2.10: {} queue-microtask@1.2.3: {} @@ -10191,9 +10067,9 @@ snapshots: zod@3.24.2: {} - zustand@5.0.3(@types/react@19.0.11)(react@19.0.0): + zustand@5.0.3(@types/react@19.0.12)(react@19.0.0): optionalDependencies: - '@types/react': 19.0.11 + '@types/react': 19.0.12 react: 19.0.0 zwitch@2.0.4: {} From f36cfc95217ac6a712cc6e8bf0eb83c196153797 Mon Sep 17 00:00:00 2001 From: better-salmon <132773930+better-salmon@users.noreply.github.com> Date: Thu, 20 Mar 2025 01:35:46 +0300 Subject: [PATCH 12/16] Refactor node-redis handler to use pub/sub --- apps/cache-testing/next.config.ts | 6 + apps/cache-testing/package.json | 4 +- .../src/utils/create-get-data.ts | 1 - docs/cache-handler-docs/package.json | 2 +- internal/eslint-config/package.json | 4 +- packages/cache-handler/package.json | 2 +- packages/cache-handler/src/cache-handler.ts | 2 + .../instrumentation/register-initial-cache.ts | 3 +- packages/cache-handler/src/use-cache-cache.ts | 17 +- .../cache-handler/src/use-cache/node-redis.ts | 127 +++++----- pnpm-lock.yaml | 226 +++++++++--------- 11 files changed, 210 insertions(+), 184 deletions(-) diff --git a/apps/cache-testing/next.config.ts b/apps/cache-testing/next.config.ts index 422e3519..e37c9b36 100644 --- a/apps/cache-testing/next.config.ts +++ b/apps/cache-testing/next.config.ts @@ -20,6 +20,12 @@ const nextConfig: NextConfig = { default: './redis.js', }, }, + eslint: { + ignoreDuringBuilds: true, + }, + typescript: { + ignoreBuildErrors: true, + }, }; export default nextConfig; diff --git a/apps/cache-testing/package.json b/apps/cache-testing/package.json index ec9e32dc..838270e1 100644 --- a/apps/cache-testing/package.json +++ b/apps/cache-testing/package.json @@ -17,8 +17,8 @@ }, "dependencies": { "@neshca/cache-handler": "workspace:*", - "axios": "1.8.3", - "next": "15.3.0-canary.13", + "axios": "1.8.4", + "next": "15.3.0-canary.14", "react": "19.0.0", "react-dom": "19.0.0", "redis": "4.7.0" diff --git a/apps/cache-testing/src/utils/create-get-data.ts b/apps/cache-testing/src/utils/create-get-data.ts index 8fda5a92..0268bb3b 100644 --- a/apps/cache-testing/src/utils/create-get-data.ts +++ b/apps/cache-testing/src/utils/create-get-data.ts @@ -15,7 +15,6 @@ export function createGetData(path: string, revalidate?: number) { cacheLife({ revalidate, - expire: revalidate ? revalidate * 2 : undefined, }); cacheTag(pathAndTag, 'whole-app-route'); diff --git a/docs/cache-handler-docs/package.json b/docs/cache-handler-docs/package.json index 12c409e3..c9facb89 100644 --- a/docs/cache-handler-docs/package.json +++ b/docs/cache-handler-docs/package.json @@ -12,7 +12,7 @@ "start:docs": "serve out" }, "dependencies": { - "next": "15.3.0-canary.13", + "next": "15.3.0-canary.14", "nextra": "4.2.16", "nextra-theme-docs": "4.2.16", "react": "19.0.0", diff --git a/internal/eslint-config/package.json b/internal/eslint-config/package.json index 6d9ba3f1..b745c6ae 100644 --- a/internal/eslint-config/package.json +++ b/internal/eslint-config/package.json @@ -8,7 +8,7 @@ }, "devDependencies": { "@eslint/js": "9.22.0", - "@next/eslint-plugin-next": "15.3.0-canary.13", + "@next/eslint-plugin-next": "15.3.0-canary.14", "eslint": "9.22.0", "eslint-config-prettier": "10.1.1", "eslint-plugin-react": "7.37.4", @@ -16,6 +16,6 @@ "eslint-plugin-turbo": "2.4.4", "globals": "16.0.0", "typescript": "5.8.2", - "typescript-eslint": "8.26.1" + "typescript-eslint": "8.27.0" } } diff --git a/packages/cache-handler/package.json b/packages/cache-handler/package.json index b87e8d57..d29b5397 100644 --- a/packages/cache-handler/package.json +++ b/packages/cache-handler/package.json @@ -44,7 +44,7 @@ "devDependencies": { "@repo/typescript-config": "workspace:*", "@types/node": "22.13.10", - "next": "15.3.0-canary.13", + "next": "15.3.0-canary.14", "tsx": "4.19.3", "typescript": "5.8.2", "vitest": "3.0.9" diff --git a/packages/cache-handler/src/cache-handler.ts b/packages/cache-handler/src/cache-handler.ts index cbd155f5..d4eecc03 100644 --- a/packages/cache-handler/src/cache-handler.ts +++ b/packages/cache-handler/src/cache-handler.ts @@ -323,6 +323,8 @@ async function removeEntryFromHandlers( }); } +export type CacheHandlerType = typeof CacheHandler; + export class CacheHandler implements NextCacheHandler { /** * Provides a descriptive name for the CacheHandler class. diff --git a/packages/cache-handler/src/instrumentation/register-initial-cache.ts b/packages/cache-handler/src/instrumentation/register-initial-cache.ts index a9875ba1..ce9d5274 100644 --- a/packages/cache-handler/src/instrumentation/register-initial-cache.ts +++ b/packages/cache-handler/src/instrumentation/register-initial-cache.ts @@ -2,10 +2,9 @@ import { promises as fsPromises } from 'node:fs'; import path from 'node:path'; import { PRERENDER_MANIFEST, SERVER_DIRECTORY } from 'next/constants.js'; import type { PrerenderManifest } from 'next/dist/build/index.js'; +import type { CacheHandlerType } from '../cache-handler.js'; import { CachedRouteKind, type Revalidate } from '../next-common-types.js'; -type CacheHandlerType = typeof import('../cache-handler.js').CacheHandler; - type Router = 'pages' | 'app'; const PRERENDER_MANIFEST_VERSION = 4; diff --git a/packages/cache-handler/src/use-cache-cache.ts b/packages/cache-handler/src/use-cache-cache.ts index 0d974748..87bd68da 100644 --- a/packages/cache-handler/src/use-cache-cache.ts +++ b/packages/cache-handler/src/use-cache-cache.ts @@ -1,6 +1,7 @@ import type { CacheEntry, CacheHandlerV2, + Timestamp, } from 'next/dist/server/lib/cache-handlers/types.js'; import { isStale, @@ -15,9 +16,16 @@ export type { CacheHandlerV2, CacheEntry }; const pendingSets = new Map>(); +type RemoteStoreOptions = { + timestamp: Timestamp; + revalidate: number; + expire: number; + stale: number; +}; + export type RemoteStore = { get(key: string): Promise; - set(key: string, value: string): Promise; + set(key: string, value: string, options: RemoteStoreOptions): Promise; refreshTags(tagsManifest: Map): Promise; getExpirationTimestamps(tags: string[]): Promise; expireTags(expiredTags: Map): Promise; @@ -100,7 +108,12 @@ export async function createCacheHandler( const remoteStore = await remoteStorePromise; - await remoteStore.set(cacheKey, JSON.stringify(storageEntry)); + await remoteStore.set(cacheKey, JSON.stringify(storageEntry), { + expire: entry.expire, + revalidate: entry.revalidate, + stale: entry.stale, + timestamp: entry.timestamp, + }); } catch (_error) { // } finally { diff --git a/packages/cache-handler/src/use-cache/node-redis.ts b/packages/cache-handler/src/use-cache/node-redis.ts index dcc7afe2..c649b7f4 100644 --- a/packages/cache-handler/src/use-cache/node-redis.ts +++ b/packages/cache-handler/src/use-cache/node-redis.ts @@ -1,111 +1,118 @@ +import { randomUUID } from 'node:crypto'; +import { tagsManifest } from 'next/dist/server/lib/incremental-cache/tags-manifest.external.js'; import type { createClient } from 'redis'; import { createRedisTimeoutConfig } from '../helpers/create-redis-timeout-config.js'; import { type RemoteStore, createCacheHandler } from '../use-cache-cache.js'; export type Config> = { client: T; + pubClient: T; + subClientId: string; + channel: string; keyPrefix?: string; - sharedTagsKey?: string; timeoutMs?: number; + expireTrigger?: 'stale' | 'expire'; +}; + +type Message = { + expiredTags: Record; + subClientId: string; }; function createRedisStore>({ client, + pubClient, + channel, + subClientId, keyPrefix, - sharedTagsKey, timeoutMs = 5000, + expireTrigger = 'stale', }: Config): RemoteStore { const getKey = (key: string) => `${keyPrefix}${key}`; - const getSharedTagsKey = () => `${keyPrefix}${sharedTagsKey}`; return { async get(key) { if (!client.isReady) { - return Promise.resolve(undefined); + return; } const options = createRedisTimeoutConfig(timeoutMs); return (await client.get(options, getKey(key))) ?? undefined; }, - async set(key, value) { + async set(key, value, { expire, timestamp, stale }) { if (!client.isReady) { return; } const options = createRedisTimeoutConfig(timeoutMs); - await client.set(options, getKey(key), value); + const expireAt = + expireTrigger === 'stale' + ? Math.floor(timestamp / 1000 + Math.min(expire, stale)) + : Math.floor(timestamp / 1000 + expire); + + await client.set(options, getKey(key), value, { + EXAT: expireAt, + }); }, async expireTags(expiredTags) { - if (!client.isReady) { + if (!pubClient.isReady) { return; } - const options = createRedisTimeoutConfig(timeoutMs); - - await client.hSet( - options, - getSharedTagsKey(), - Object.fromEntries(expiredTags), + await pubClient.publish( + channel, + JSON.stringify({ + expiredTags: Object.fromEntries(expiredTags), + subClientId, + } satisfies Message), ); }, getExpirationTimestamps() { - return Promise.resolve([]); + return Promise.resolve([0]); }, - async refreshTags(tagsManifest) { - try { - if (!client?.isReady) { - return; - } - - let cursor = 0; - - const hScanOptions = { COUNT: 10 }; - - do { - const options = createRedisTimeoutConfig(timeoutMs); - - const remoteTagsPortion = await client.hScan( - options, - getSharedTagsKey(), - cursor, - hScanOptions, - ); - - for (const { - field: tag, - value: timestampStr, - } of remoteTagsPortion.tuples) { - try { - const timestamp = Number.parseInt(timestampStr, 10); - - if (!Number.isNaN(timestamp)) { - tagsManifest.set(tag, timestamp); - } - } catch (err) { - console.error(`Failed to parse tag timestamp for ${tag}:`, err); - } - } - - cursor = remoteTagsPortion.cursor; - } while (cursor !== 0); - } catch (error) { - console.error('Failed to load tags from Redis:', error); - } + async refreshTags() { + // must be empty when using pub/sub }, }; } export function createRedisCacheHandler< T extends ReturnType, ->({ client, keyPrefix, sharedTagsKey, timeoutMs }: Config) { - const remoteStore = client - .connect() - .then((redisClient) => ({ - client: redisClient, +>({ client, keyPrefix, timeoutMs }: Config) { + const remoteStore = Promise.all([ + client.connect(), + client.duplicate().connect(), + client.duplicate().connect(), + ]) + .then(async ([mainClient, pubClient, subClient]) => { + const subClientId = randomUUID(); + const channel = `${keyPrefix}__revalidate_channel__`; + + await subClient.subscribe(channel, (message) => { + const { expiredTags, subClientId: messageSubClientId } = JSON.parse( + message, + ) as Message; + + if (subClientId === messageSubClientId) { + console.info('ignoring message from self'); + return; + } + + for (const [tag, timestamp] of Object.entries(expiredTags)) { + tagsManifest.set(tag, timestamp); + } + }); + + return { mainClient, pubClient, subClientId, channel }; + }) + .then(({ mainClient, pubClient, subClientId, channel }) => ({ + client: mainClient, + pubClient, + subClientId, + channel, keyPrefix, - sharedTagsKey, timeoutMs, })) .then(createRedisStore); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 3523c39c..cc7c27e3 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -33,11 +33,11 @@ importers: specifier: workspace:* version: link:../../packages/cache-handler axios: - specifier: 1.8.3 - version: 1.8.3 + specifier: 1.8.4 + version: 1.8.4 next: - specifier: 15.3.0-canary.13 - version: 15.3.0-canary.13(@playwright/test@1.51.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + specifier: 15.3.0-canary.14 + version: 15.3.0-canary.14(@playwright/test@1.51.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) react: specifier: 19.0.0 version: 19.0.0 @@ -88,14 +88,14 @@ importers: docs/cache-handler-docs: dependencies: next: - specifier: 15.3.0-canary.13 - version: 15.3.0-canary.13(@playwright/test@1.51.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + specifier: 15.3.0-canary.14 + version: 15.3.0-canary.14(@playwright/test@1.51.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) nextra: specifier: 4.2.16 - version: 4.2.16(acorn@8.14.1)(next@15.3.0-canary.13(@playwright/test@1.51.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.8.2) + version: 4.2.16(acorn@8.14.1)(next@15.3.0-canary.14(@playwright/test@1.51.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.8.2) nextra-theme-docs: specifier: 4.2.16 - version: 4.2.16(@types/react@19.0.12)(next@15.3.0-canary.13(@playwright/test@1.51.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(nextra@4.2.16(acorn@8.14.1)(next@15.3.0-canary.13(@playwright/test@1.51.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.8.2))(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + version: 4.2.16(@types/react@19.0.12)(next@15.3.0-canary.14(@playwright/test@1.51.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(nextra@4.2.16(acorn@8.14.1)(next@15.3.0-canary.14(@playwright/test@1.51.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.8.2))(react-dom@19.0.0(react@19.0.0))(react@19.0.0) react: specifier: 19.0.0 version: 19.0.0 @@ -162,8 +162,8 @@ importers: specifier: 9.22.0 version: 9.22.0 '@next/eslint-plugin-next': - specifier: 15.3.0-canary.13 - version: 15.3.0-canary.13 + specifier: 15.3.0-canary.14 + version: 15.3.0-canary.14 eslint: specifier: 9.22.0 version: 9.22.0 @@ -186,8 +186,8 @@ importers: specifier: 5.8.2 version: 5.8.2 typescript-eslint: - specifier: 8.26.1 - version: 8.26.1(eslint@9.22.0)(typescript@5.8.2) + specifier: 8.27.0 + version: 8.27.0(eslint@9.22.0)(typescript@5.8.2) internal/typescript-config: {} @@ -213,8 +213,8 @@ importers: specifier: 22.13.10 version: 22.13.10 next: - specifier: 15.3.0-canary.13 - version: 15.3.0-canary.13(@playwright/test@1.51.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + specifier: 15.3.0-canary.14 + version: 15.3.0-canary.14(@playwright/test@1.51.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) tsx: specifier: 4.19.3 version: 4.19.3 @@ -837,56 +837,56 @@ packages: resolution: {integrity: sha512-jMxvwzkKzd3cXo2EB9GM2ic0eYo2rP/BS6gJt6HnWbsDO1O8GSD4k7o2Cpr2YERtMpGF/MGcDfsfj2EbQPtrXw==} engines: {node: '>= 10'} - '@next/env@15.3.0-canary.13': - resolution: {integrity: sha512-JSc7jRSVdstjZ0bfxKMFeYM+gVRgUbPpGSWq9JLDQDH/mYHMN+LMNR8CafQCKjoSL7tzkBpH9Ug6r9WaIescCw==} + '@next/env@15.3.0-canary.14': + resolution: {integrity: sha512-wYQx9YYFuPUNtQP839fW7bPPMb7KF1q0DFO9COqsy441OyiXHyVs0BnsnhULSVpSs3FSsfRglPXFpxkVxQiq2w==} - '@next/eslint-plugin-next@15.3.0-canary.13': - resolution: {integrity: sha512-FyzLsLvIdTA7QJBxTeNShszbXhYn8uGJcLdbTDiQUcs2BfSPXpMt26t8nQVdUhNBcxt4XyzEDddIhfIwBYPtWg==} + '@next/eslint-plugin-next@15.3.0-canary.14': + resolution: {integrity: sha512-HnsmgLET9Gy2dEzscTIQvpX0EdOZ/v/XDusv2UdCGp/mxTZn0FFox41gtQVyWtfi9qhKtazrrcXl+gas/XbFwQ==} - '@next/swc-darwin-arm64@15.3.0-canary.13': - resolution: {integrity: sha512-A1EiOZHBTFF3Asyb+h4R0/IuOFEx+HN/0ek9BwR7g4neqZunAMU0LaGeExhxX7eUDJR4NWV16HEQq6nBcJB/UA==} + '@next/swc-darwin-arm64@15.3.0-canary.14': + resolution: {integrity: sha512-23MqQNFQ1ljHZ6+onzltjDEmNXgMoXdTIOMnxpOdE4p8F45ODU2g+k0Vl4ypPwAfgqd8Ni6aI9jG7RJfubvkrg==} engines: {node: '>= 10'} cpu: [arm64] os: [darwin] - '@next/swc-darwin-x64@15.3.0-canary.13': - resolution: {integrity: sha512-ojmJVrcv571Q893G0EZGgnYJOGjxYTYSvrNiXMaY2gz9W8p1G+wY/Fc6f2Vm5c2GQcjUdmJOb57x3Ujdxi3szw==} + '@next/swc-darwin-x64@15.3.0-canary.14': + resolution: {integrity: sha512-qFIbXnnjKqo3J5H3DhIMupmuxsf2nbwC+Kex42VVss9aCMn0Ap7zwZd/J54RIgC/gZJtP0KCqUY663xa0m/lBQ==} engines: {node: '>= 10'} cpu: [x64] os: [darwin] - '@next/swc-linux-arm64-gnu@15.3.0-canary.13': - resolution: {integrity: sha512-k4dEOZZ9x8PtHH8HtD/3h/epDBRqWOf13UOE3JY/NH60pY5t4uXG3JEj9tcKnezhv0/Q5eT9c6WiydXdjs2YvQ==} + '@next/swc-linux-arm64-gnu@15.3.0-canary.14': + resolution: {integrity: sha512-rpC12NgJ29z8iU4s6yl6AYsMcAiuDuzMljkTnAyUuRg/ehhlDoNMseidTldAofsnbp+K0NRNDujRHc+fgjeRAA==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - '@next/swc-linux-arm64-musl@15.3.0-canary.13': - resolution: {integrity: sha512-Ms7b0OF05Q2qpo90ih/cVhviNrEatVZtsobBVyoXGfWxv/gOrhXoxuzROFGNdGXRZNJ7EgUaWmO4pZGjfUhEWw==} + '@next/swc-linux-arm64-musl@15.3.0-canary.14': + resolution: {integrity: sha512-I1+JUYW3R9pWP2taLJABCaYXG6RybDHv8K1La9/7RGDRciPNu3RukjoFGL4/1SbzqjgIg/rkBuN4/mJ6XwwquA==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - '@next/swc-linux-x64-gnu@15.3.0-canary.13': - resolution: {integrity: sha512-id/4NWejJpglZiY/PLpV0H675bITfo0QrUNjZtRuKfphJNkPoRGsMXdaZ3mSpFscTqofyaINQ3fis0D4sSmJUw==} + '@next/swc-linux-x64-gnu@15.3.0-canary.14': + resolution: {integrity: sha512-JiqCXhIQdMnUa+Mc3G7Ed3r9AqnLlzKO2XcGgmm/zmAzIIxU3EVn0mD830B+h4zhq9FyQDKmvj9ZZkKRVfc26w==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - '@next/swc-linux-x64-musl@15.3.0-canary.13': - resolution: {integrity: sha512-9eE2E6KN01yxwE9H2fWaQA6PRvfjuY+lvadGBpub/pf710kdWFe9VYb8zECT492Vw90axHmktFZDTXuf2WaVTA==} + '@next/swc-linux-x64-musl@15.3.0-canary.14': + resolution: {integrity: sha512-M+4zHSgqBXTAYgZAJ0w07pYYA5Q2dALC4QBY+YWdugBRSQEIOq2xKo3WlxTbIpij5xTrL54uJZI8UBFYuHbecQ==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - '@next/swc-win32-arm64-msvc@15.3.0-canary.13': - resolution: {integrity: sha512-PbJ/yFCUBxhLr6wKoaC+CQebzeaiqrYOJXEMb9O1XFWp2te8okLjF2BihSziFVLtoA4m2one56pG5jU7W9GUzg==} + '@next/swc-win32-arm64-msvc@15.3.0-canary.14': + resolution: {integrity: sha512-2Jf9KI75uiRZtm27Sm3xn6xdosskabFpoZCI2q64r2ufuBx+gTgr5qZ6kIxcw9Oe/2atkWrjGXpdHNfJAxEXlA==} engines: {node: '>= 10'} cpu: [arm64] os: [win32] - '@next/swc-win32-x64-msvc@15.3.0-canary.13': - resolution: {integrity: sha512-6dUpH6huWVS0uBObUWBTolu/lZIP99oD1TdgjGt3S2te+OjXAlza8ERgR8mGTV04hpRZFv7tUivISaGlkYE+Bw==} + '@next/swc-win32-x64-msvc@15.3.0-canary.14': + resolution: {integrity: sha512-driLBL2CcZpXNdRbiLklaDOVvTmRCMhFEkJyQNK7EYhEKLH6QNaifi/NSyQrLRDhv9yfLLbVvDy7DlRiFBfWLQ==} engines: {node: '>= 10'} cpu: [x64] os: [win32] @@ -1314,51 +1314,51 @@ packages: '@types/unist@3.0.3': resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==} - '@typescript-eslint/eslint-plugin@8.26.1': - resolution: {integrity: sha512-2X3mwqsj9Bd3Ciz508ZUtoQQYpOhU/kWoUqIf49H8Z0+Vbh6UF/y0OEYp0Q0axOGzaBGs7QxRwq0knSQ8khQNA==} + '@typescript-eslint/eslint-plugin@8.27.0': + resolution: {integrity: sha512-4henw4zkePi5p252c8ncBLzLce52SEUz2Ebj8faDnuUXz2UuHEONYcJ+G0oaCF+bYCWVZtrGzq3FD7YXetmnSA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: '@typescript-eslint/parser': ^8.0.0 || ^8.0.0-alpha.0 eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.9.0' - '@typescript-eslint/parser@8.26.1': - resolution: {integrity: sha512-w6HZUV4NWxqd8BdeFf81t07d7/YV9s7TCWrQQbG5uhuvGUAW+fq1usZ1Hmz9UPNLniFnD8GLSsDpjP0hm1S4lQ==} + '@typescript-eslint/parser@8.27.0': + resolution: {integrity: sha512-XGwIabPallYipmcOk45DpsBSgLC64A0yvdAkrwEzwZ2viqGqRUJ8eEYoPz0CWnutgAFbNMPdsGGvzjSmcWVlEA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.9.0' - '@typescript-eslint/scope-manager@8.26.1': - resolution: {integrity: sha512-6EIvbE5cNER8sqBu6V7+KeMZIC1664d2Yjt+B9EWUXrsyWpxx4lEZrmvxgSKRC6gX+efDL/UY9OpPZ267io3mg==} + '@typescript-eslint/scope-manager@8.27.0': + resolution: {integrity: sha512-8oI9GwPMQmBryaaxG1tOZdxXVeMDte6NyJA4i7/TWa4fBwgnAXYlIQP+uYOeqAaLJ2JRxlG9CAyL+C+YE9Xknw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/type-utils@8.26.1': - resolution: {integrity: sha512-Kcj/TagJLwoY/5w9JGEFV0dclQdyqw9+VMndxOJKtoFSjfZhLXhYjzsQEeyza03rwHx2vFEGvrJWJBXKleRvZg==} + '@typescript-eslint/type-utils@8.27.0': + resolution: {integrity: sha512-wVArTVcz1oJOIEJxui/nRhV0TXzD/zMSOYi/ggCfNq78EIszddXcJb7r4RCp/oBrjt8n9A0BSxRMKxHftpDxDA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.9.0' - '@typescript-eslint/types@8.26.1': - resolution: {integrity: sha512-n4THUQW27VmQMx+3P+B0Yptl7ydfceUj4ON/AQILAASwgYdZ/2dhfymRMh5egRUrvK5lSmaOm77Ry+lmXPOgBQ==} + '@typescript-eslint/types@8.27.0': + resolution: {integrity: sha512-/6cp9yL72yUHAYq9g6DsAU+vVfvQmd1a8KyA81uvfDE21O2DwQ/qxlM4AR8TSdAu+kJLBDrEHKC5/W2/nxsY0A==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/typescript-estree@8.26.1': - resolution: {integrity: sha512-yUwPpUHDgdrv1QJ7YQal3cMVBGWfnuCdKbXw1yyjArax3353rEJP1ZA+4F8nOlQ3RfS2hUN/wze3nlY+ZOhvoA==} + '@typescript-eslint/typescript-estree@8.27.0': + resolution: {integrity: sha512-BnKq8cqPVoMw71O38a1tEb6iebEgGA80icSxW7g+kndx0o6ot6696HjG7NdgfuAVmVEtwXUr3L8R9ZuVjoQL6A==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <5.9.0' - '@typescript-eslint/utils@8.26.1': - resolution: {integrity: sha512-V4Urxa/XtSUroUrnI7q6yUTD3hDtfJ2jzVfeT3VK0ciizfK2q/zGC0iDh1lFMUZR8cImRrep6/q0xd/1ZGPQpg==} + '@typescript-eslint/utils@8.27.0': + resolution: {integrity: sha512-njkodcwH1yvmo31YWgRHNb/x1Xhhq4/m81PhtvmRngD8iHPehxffz1SNCO+kwaePhATC+kOa/ggmvPoPza5i0Q==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.9.0' - '@typescript-eslint/visitor-keys@8.26.1': - resolution: {integrity: sha512-AjOC3zfnxd6S4Eiy3jwktJPclqhFHNyd8L6Gycf9WUPoKZpgM5PjkxY1X7uSy61xVpiJDhhk7XT2NVsN3ALTWg==} + '@typescript-eslint/visitor-keys@8.27.0': + resolution: {integrity: sha512-WsXQwMkILJvffP6z4U3FYJPlbf/j07HIxmDjZpbNvBJkMfvwXj5ACRkkHwBDvLBbDbtX5TdU64/rcvKJ/vuInQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@typescript/vfs@1.6.1': @@ -1555,8 +1555,8 @@ packages: avvio@9.1.0: resolution: {integrity: sha512-fYASnYi600CsH/j9EQov7lECAniYiBFiiAtBNuZYLA2leLe9qOvZzqYHFjtIj6gD2VMoMLP14834LFWvr4IfDw==} - axios@1.8.3: - resolution: {integrity: sha512-iP4DebzoNlP/YN2dpwCgb8zoCmhtkajzS48JvwmkSkXvPI3DHc7m+XYL5tGnSlJtR6nImXZmdCuN5aP8dh1d8A==} + axios@1.8.4: + resolution: {integrity: sha512-eBSYY4Y68NNlHbHBMdeDmKNtDgXWhQsJcGqzO3iLUM0GraQFSS9cVgPX5I9b3lbdFKyYoAEGAZF1DwhTaljNAw==} bail@2.0.2: resolution: {integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==} @@ -3338,8 +3338,8 @@ packages: react: ^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc react-dom: ^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc - next@15.3.0-canary.13: - resolution: {integrity: sha512-c8BO/c1FjV/jY4OmlBTKaeI0YYDIsakkmJQFgpjq9RzoBetoi/VLAloZMDpsrfSFIhHDHhraLMxzSvS6mFKeuA==} + next@15.3.0-canary.14: + resolution: {integrity: sha512-YYn3Ucr7pbuvIB7iLHhhMiZ+HoDFe8ekgT7ZDuEyhPJVqodoVq2kd1VKWMNHBukNqe7HDz29SOYj/H/RA4OEGQ==} engines: {node: ^18.18.0 || ^19.8.0 || >= 20.0.0} hasBin: true peerDependencies: @@ -4378,8 +4378,8 @@ packages: resolution: {integrity: sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==} engines: {node: '>= 0.4'} - typescript-eslint@8.26.1: - resolution: {integrity: sha512-t/oIs9mYyrwZGRpDv3g+3K6nZ5uhKEMt2oNmAPwaY4/ye0+EH4nXIPYNtkYFS6QHm+1DFg34DbglYBz5P9Xysg==} + typescript-eslint@8.27.0: + resolution: {integrity: sha512-ZZ/8+Y0rRUMuW1gJaPtLWe4ryHbsPLzzibk5Sq+IFa2aOH1Vo0gPr1fbA6pOnzBke7zC2Da4w8AyCgxKXo3lqA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 @@ -5282,34 +5282,34 @@ snapshots: '@napi-rs/simple-git-win32-arm64-msvc': 0.1.19 '@napi-rs/simple-git-win32-x64-msvc': 0.1.19 - '@next/env@15.3.0-canary.13': {} + '@next/env@15.3.0-canary.14': {} - '@next/eslint-plugin-next@15.3.0-canary.13': + '@next/eslint-plugin-next@15.3.0-canary.14': dependencies: fast-glob: 3.3.1 - '@next/swc-darwin-arm64@15.3.0-canary.13': + '@next/swc-darwin-arm64@15.3.0-canary.14': optional: true - '@next/swc-darwin-x64@15.3.0-canary.13': + '@next/swc-darwin-x64@15.3.0-canary.14': optional: true - '@next/swc-linux-arm64-gnu@15.3.0-canary.13': + '@next/swc-linux-arm64-gnu@15.3.0-canary.14': optional: true - '@next/swc-linux-arm64-musl@15.3.0-canary.13': + '@next/swc-linux-arm64-musl@15.3.0-canary.14': optional: true - '@next/swc-linux-x64-gnu@15.3.0-canary.13': + '@next/swc-linux-x64-gnu@15.3.0-canary.14': optional: true - '@next/swc-linux-x64-musl@15.3.0-canary.13': + '@next/swc-linux-x64-musl@15.3.0-canary.14': optional: true - '@next/swc-win32-arm64-msvc@15.3.0-canary.13': + '@next/swc-win32-arm64-msvc@15.3.0-canary.14': optional: true - '@next/swc-win32-x64-msvc@15.3.0-canary.13': + '@next/swc-win32-x64-msvc@15.3.0-canary.14': optional: true '@nodelib/fs.scandir@2.1.5': @@ -5774,14 +5774,14 @@ snapshots: '@types/unist@3.0.3': {} - '@typescript-eslint/eslint-plugin@8.26.1(@typescript-eslint/parser@8.26.1(eslint@9.22.0)(typescript@5.8.2))(eslint@9.22.0)(typescript@5.8.2)': + '@typescript-eslint/eslint-plugin@8.27.0(@typescript-eslint/parser@8.27.0(eslint@9.22.0)(typescript@5.8.2))(eslint@9.22.0)(typescript@5.8.2)': dependencies: '@eslint-community/regexpp': 4.12.1 - '@typescript-eslint/parser': 8.26.1(eslint@9.22.0)(typescript@5.8.2) - '@typescript-eslint/scope-manager': 8.26.1 - '@typescript-eslint/type-utils': 8.26.1(eslint@9.22.0)(typescript@5.8.2) - '@typescript-eslint/utils': 8.26.1(eslint@9.22.0)(typescript@5.8.2) - '@typescript-eslint/visitor-keys': 8.26.1 + '@typescript-eslint/parser': 8.27.0(eslint@9.22.0)(typescript@5.8.2) + '@typescript-eslint/scope-manager': 8.27.0 + '@typescript-eslint/type-utils': 8.27.0(eslint@9.22.0)(typescript@5.8.2) + '@typescript-eslint/utils': 8.27.0(eslint@9.22.0)(typescript@5.8.2) + '@typescript-eslint/visitor-keys': 8.27.0 eslint: 9.22.0 graphemer: 1.4.0 ignore: 5.3.2 @@ -5791,27 +5791,27 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.26.1(eslint@9.22.0)(typescript@5.8.2)': + '@typescript-eslint/parser@8.27.0(eslint@9.22.0)(typescript@5.8.2)': dependencies: - '@typescript-eslint/scope-manager': 8.26.1 - '@typescript-eslint/types': 8.26.1 - '@typescript-eslint/typescript-estree': 8.26.1(typescript@5.8.2) - '@typescript-eslint/visitor-keys': 8.26.1 + '@typescript-eslint/scope-manager': 8.27.0 + '@typescript-eslint/types': 8.27.0 + '@typescript-eslint/typescript-estree': 8.27.0(typescript@5.8.2) + '@typescript-eslint/visitor-keys': 8.27.0 debug: 4.4.0 eslint: 9.22.0 typescript: 5.8.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/scope-manager@8.26.1': + '@typescript-eslint/scope-manager@8.27.0': dependencies: - '@typescript-eslint/types': 8.26.1 - '@typescript-eslint/visitor-keys': 8.26.1 + '@typescript-eslint/types': 8.27.0 + '@typescript-eslint/visitor-keys': 8.27.0 - '@typescript-eslint/type-utils@8.26.1(eslint@9.22.0)(typescript@5.8.2)': + '@typescript-eslint/type-utils@8.27.0(eslint@9.22.0)(typescript@5.8.2)': dependencies: - '@typescript-eslint/typescript-estree': 8.26.1(typescript@5.8.2) - '@typescript-eslint/utils': 8.26.1(eslint@9.22.0)(typescript@5.8.2) + '@typescript-eslint/typescript-estree': 8.27.0(typescript@5.8.2) + '@typescript-eslint/utils': 8.27.0(eslint@9.22.0)(typescript@5.8.2) debug: 4.4.0 eslint: 9.22.0 ts-api-utils: 2.0.1(typescript@5.8.2) @@ -5819,12 +5819,12 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/types@8.26.1': {} + '@typescript-eslint/types@8.27.0': {} - '@typescript-eslint/typescript-estree@8.26.1(typescript@5.8.2)': + '@typescript-eslint/typescript-estree@8.27.0(typescript@5.8.2)': dependencies: - '@typescript-eslint/types': 8.26.1 - '@typescript-eslint/visitor-keys': 8.26.1 + '@typescript-eslint/types': 8.27.0 + '@typescript-eslint/visitor-keys': 8.27.0 debug: 4.4.0 fast-glob: 3.3.3 is-glob: 4.0.3 @@ -5835,20 +5835,20 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.26.1(eslint@9.22.0)(typescript@5.8.2)': + '@typescript-eslint/utils@8.27.0(eslint@9.22.0)(typescript@5.8.2)': dependencies: '@eslint-community/eslint-utils': 4.5.1(eslint@9.22.0) - '@typescript-eslint/scope-manager': 8.26.1 - '@typescript-eslint/types': 8.26.1 - '@typescript-eslint/typescript-estree': 8.26.1(typescript@5.8.2) + '@typescript-eslint/scope-manager': 8.27.0 + '@typescript-eslint/types': 8.27.0 + '@typescript-eslint/typescript-estree': 8.27.0(typescript@5.8.2) eslint: 9.22.0 typescript: 5.8.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/visitor-keys@8.26.1': + '@typescript-eslint/visitor-keys@8.27.0': dependencies: - '@typescript-eslint/types': 8.26.1 + '@typescript-eslint/types': 8.27.0 eslint-visitor-keys: 4.2.0 '@typescript/vfs@1.6.1(typescript@5.8.2)': @@ -6067,7 +6067,7 @@ snapshots: '@fastify/error': 4.1.0 fastq: 1.19.1 - axios@1.8.3: + axios@1.8.4: dependencies: follow-redirects: 1.15.9(debug@4.3.7) form-data: 4.0.2 @@ -8386,9 +8386,9 @@ snapshots: react: 19.0.0 react-dom: 19.0.0(react@19.0.0) - next@15.3.0-canary.13(@playwright/test@1.51.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0): + next@15.3.0-canary.14(@playwright/test@1.51.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0): dependencies: - '@next/env': 15.3.0-canary.13 + '@next/env': 15.3.0-canary.14 '@swc/counter': 0.1.3 '@swc/helpers': 0.5.15 busboy: 1.6.0 @@ -8398,27 +8398,27 @@ snapshots: react-dom: 19.0.0(react@19.0.0) styled-jsx: 5.1.6(react@19.0.0) optionalDependencies: - '@next/swc-darwin-arm64': 15.3.0-canary.13 - '@next/swc-darwin-x64': 15.3.0-canary.13 - '@next/swc-linux-arm64-gnu': 15.3.0-canary.13 - '@next/swc-linux-arm64-musl': 15.3.0-canary.13 - '@next/swc-linux-x64-gnu': 15.3.0-canary.13 - '@next/swc-linux-x64-musl': 15.3.0-canary.13 - '@next/swc-win32-arm64-msvc': 15.3.0-canary.13 - '@next/swc-win32-x64-msvc': 15.3.0-canary.13 + '@next/swc-darwin-arm64': 15.3.0-canary.14 + '@next/swc-darwin-x64': 15.3.0-canary.14 + '@next/swc-linux-arm64-gnu': 15.3.0-canary.14 + '@next/swc-linux-arm64-musl': 15.3.0-canary.14 + '@next/swc-linux-x64-gnu': 15.3.0-canary.14 + '@next/swc-linux-x64-musl': 15.3.0-canary.14 + '@next/swc-win32-arm64-msvc': 15.3.0-canary.14 + '@next/swc-win32-x64-msvc': 15.3.0-canary.14 '@playwright/test': 1.51.1 sharp: 0.33.5 transitivePeerDependencies: - '@babel/core' - babel-plugin-macros - nextra-theme-docs@4.2.16(@types/react@19.0.12)(next@15.3.0-canary.13(@playwright/test@1.51.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(nextra@4.2.16(acorn@8.14.1)(next@15.3.0-canary.13(@playwright/test@1.51.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.8.2))(react-dom@19.0.0(react@19.0.0))(react@19.0.0): + nextra-theme-docs@4.2.16(@types/react@19.0.12)(next@15.3.0-canary.14(@playwright/test@1.51.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(nextra@4.2.16(acorn@8.14.1)(next@15.3.0-canary.14(@playwright/test@1.51.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.8.2))(react-dom@19.0.0(react@19.0.0))(react@19.0.0): dependencies: '@headlessui/react': 2.2.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0) clsx: 2.1.1 - next: 15.3.0-canary.13(@playwright/test@1.51.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + next: 15.3.0-canary.14(@playwright/test@1.51.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) next-themes: 0.4.6(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - nextra: 4.2.16(acorn@8.14.1)(next@15.3.0-canary.13(@playwright/test@1.51.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.8.2) + nextra: 4.2.16(acorn@8.14.1)(next@15.3.0-canary.14(@playwright/test@1.51.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.8.2) react: 19.0.0 react-compiler-runtime: 0.0.0-experimental-22c6e49-20241219(react@19.0.0) react-dom: 19.0.0(react@19.0.0) @@ -8431,7 +8431,7 @@ snapshots: - immer - use-sync-external-store - nextra@4.2.16(acorn@8.14.1)(next@15.3.0-canary.13(@playwright/test@1.51.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.8.2): + nextra@4.2.16(acorn@8.14.1)(next@15.3.0-canary.14(@playwright/test@1.51.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.8.2): dependencies: '@formatjs/intl-localematcher': 0.6.0 '@headlessui/react': 2.2.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0) @@ -8452,7 +8452,7 @@ snapshots: mdast-util-gfm: 3.1.0 mdast-util-to-hast: 13.2.0 negotiator: 1.0.0 - next: 15.3.0-canary.13(@playwright/test@1.51.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + next: 15.3.0-canary.14(@playwright/test@1.51.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) react: 19.0.0 react-compiler-runtime: 0.0.0-experimental-22c6e49-20241219(react@19.0.0) react-dom: 19.0.0(react@19.0.0) @@ -9758,11 +9758,11 @@ snapshots: possible-typed-array-names: 1.1.0 reflect.getprototypeof: 1.0.10 - typescript-eslint@8.26.1(eslint@9.22.0)(typescript@5.8.2): + typescript-eslint@8.27.0(eslint@9.22.0)(typescript@5.8.2): dependencies: - '@typescript-eslint/eslint-plugin': 8.26.1(@typescript-eslint/parser@8.26.1(eslint@9.22.0)(typescript@5.8.2))(eslint@9.22.0)(typescript@5.8.2) - '@typescript-eslint/parser': 8.26.1(eslint@9.22.0)(typescript@5.8.2) - '@typescript-eslint/utils': 8.26.1(eslint@9.22.0)(typescript@5.8.2) + '@typescript-eslint/eslint-plugin': 8.27.0(@typescript-eslint/parser@8.27.0(eslint@9.22.0)(typescript@5.8.2))(eslint@9.22.0)(typescript@5.8.2) + '@typescript-eslint/parser': 8.27.0(eslint@9.22.0)(typescript@5.8.2) + '@typescript-eslint/utils': 8.27.0(eslint@9.22.0)(typescript@5.8.2) eslint: 9.22.0 typescript: 5.8.2 transitivePeerDependencies: From 46632544bc2c5d6c983e2758ffc203f7543de8cf Mon Sep 17 00:00:00 2001 From: better-salmon <132773930+better-salmon@users.noreply.github.com> Date: Thu, 20 Mar 2025 22:12:30 +0200 Subject: [PATCH 13/16] Migrate to eslint from biome --- .github/workflows/test-docs.yml | 1 - .github/workflows/tests.yml | 2 - .gitignore | 1 + .prettierignore | 13 +- .vscode/extensions.json | 1 - .vscode/settings.json | 10 +- .../cache-handler-next-example.js | 5 +- apps/cache-testing/package.json | 6 +- .../src/app/api/revalidate-app/route.ts | 3 +- .../no-params/dynamic-false/[slug]/page.tsx | 1 - .../no-params/dynamic-true/[slug]/page.tsx | 1 - .../src/app/app/no-params/ssr/200/page.tsx | 1 - apps/cache-testing/src/app/app/ppr/page.tsx | 1 - .../src/app/app/randomHex/[length]/page.tsx | 12 +- .../cache-testing/src/app/app/static/route.ts | 2 +- .../with-params/dynamic-false/[slug]/page.tsx | 1 - .../with-params/dynamic-true/[slug]/page.tsx | 1 - apps/cache-testing/src/app/layout.tsx | 3 +- .../src/components/cache-state-watcher.tsx | 2 +- .../src/components/restart-button.tsx | 14 +- .../src/components/revalidate-button.tsx | 10 +- apps/cache-testing/src/globals.css | 7 +- apps/cache-testing/src/instrumentation.ts | 2 +- apps/cache-testing/src/pages/_app.tsx | 3 +- .../src/pages/api/revalidate-pages.ts | 3 +- apps/cache-testing/src/pages/layout.tsx | 3 +- .../no-paths/fallback-blocking/[slug].tsx | 3 +- .../pages/no-paths/fallback-false/[slug].tsx | 3 +- .../pages/no-paths/fallback-true/[slug].tsx | 3 +- .../src/pages/pages/randomHex/[length].tsx | 7 +- .../with-paths/fallback-blocking/[slug].tsx | 3 +- .../with-paths/fallback-false/[slug].tsx | 3 +- .../pages/with-paths/fallback-true/[slug].tsx | 3 +- .../src/utils/common-app-page.tsx | 4 +- .../src/utils/common-pages-page.tsx | 5 +- .../create-pages-get-get-server-side-props.ts | 3 +- .../utils/create-pages-get-static-props.ts | 3 +- biome.json | 80 - docs/cache-handler-docs/package.json | 10 +- docs/cache-handler-docs/src/app/layout.tsx | 2 +- internal/eslint-config/base.js | 132 ++ internal/eslint-config/lib.js | 20 + internal/eslint-config/next.js | 69 +- internal/eslint-config/package.json | 15 +- internal/eslint-config/vitest.js | 17 + internal/typescript-config/lib.json | 2 +- package.json | 15 +- packages/cache-handler/eslint.config.js | 10 + packages/cache-handler/package.json | 10 +- packages/cache-handler/src/cache-handler.ts | 123 +- packages/cache-handler/src/constants.ts | 2 + .../handlers/experimental-redis-cluster.ts | 48 +- .../cache-handler/src/handlers/local-lru.ts | 38 +- .../cache-handler/src/handlers/redis-stack.ts | 47 +- .../src/handlers/redis-strings.ts | 36 +- .../instrumentation/register-initial-cache.ts | 39 +- .../cache-handler/src/next-common-types.ts | 2 +- packages/cache-handler/src/use-cache-cache.ts | 31 +- .../cache-handler/src/use-cache/node-redis.ts | 59 +- packages/cache-handler/src/use-cache/redis.ts | 231 --- .../src/utils/compose-age-estimation-fn.ts | 2 + packages/cache-handler/test/tsconfig.json | 5 - .../utils/compose-age-estimation-fn.test.ts | 34 + packages/cache-handler/tsconfig.build.json | 9 + packages/cache-handler/tsconfig.json | 6 +- pnpm-lock.yaml | 1303 ++++++++++++++--- pnpm-workspace.yaml | 1 - turbo.json | 10 +- 68 files changed, 1750 insertions(+), 807 deletions(-) delete mode 100644 biome.json create mode 100644 internal/eslint-config/base.js create mode 100644 internal/eslint-config/lib.js create mode 100644 internal/eslint-config/vitest.js create mode 100644 packages/cache-handler/eslint.config.js delete mode 100644 packages/cache-handler/src/use-cache/redis.ts delete mode 100644 packages/cache-handler/test/tsconfig.json create mode 100644 packages/cache-handler/tsconfig.build.json diff --git a/.github/workflows/test-docs.yml b/.github/workflows/test-docs.yml index 061dfe02..9c1e6768 100644 --- a/.github/workflows/test-docs.yml +++ b/.github/workflows/test-docs.yml @@ -10,7 +10,6 @@ on: - 'docs/cache-handler-docs/**' - 'internal/eslint-config/**' - 'package.json' - - 'biome.json' - 'prettier.config.js' jobs: test: diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index c19647c4..313f276f 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -13,7 +13,6 @@ on: - '.github/workflows/tests.yml' - 'internal/eslint-config/**' - 'package.json' - - 'biome.json' - 'turbo.json' - 'prettier.config.js' pull_request: @@ -28,7 +27,6 @@ on: - '.github/workflows/tests.yml' - 'internal/eslint-config/**' - 'package.json' - - 'biome.json' - 'turbo.json' - 'prettier.config.js' jobs: diff --git a/.gitignore b/.gitignore index eaaa73fe..40ce2e89 100644 --- a/.gitignore +++ b/.gitignore @@ -41,3 +41,4 @@ yarn-error.log* # TypeScript build info tsconfig.tsbuildinfo +tsconfig.build.tsbuildinfo diff --git a/.prettierignore b/.prettierignore index b01d2be0..91675597 100644 --- a/.prettierignore +++ b/.prettierignore @@ -1,5 +1,6 @@ # Dependencies node_modules +pnpm-lock.yaml .pnp .pnp.js @@ -36,13 +37,5 @@ yarn-error.log* # Misc .DS_Store *.pem - - -# biome formatted files -*.js -*.ts -*.tsx -*.jsx -*.cjs -*.mjs -*.mts +tsconfig.tsbuildinfo +tsconfig.build.tsbuildinfo \ No newline at end of file diff --git a/.vscode/extensions.json b/.vscode/extensions.json index 00649a81..600ea322 100644 --- a/.vscode/extensions.json +++ b/.vscode/extensions.json @@ -1,6 +1,5 @@ { "recommendations": [ - "biomejs.biome", "dbaeumer.vscode-eslint", "esbenp.prettier-vscode", "unifiedjs.vscode-mdx", diff --git a/.vscode/settings.json b/.vscode/settings.json index 7c7dad25..5a00bab1 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -8,7 +8,7 @@ "typescript.tsdk": "node_modules/typescript/lib", "explorer.fileNesting.enabled": true, "cSpell.words": ["nextjs", "prerendered", "codestyle"], - "editor.defaultFormatter": "biomejs.biome", + "editor.defaultFormatter": "esbenp.prettier-vscode", "[jsonc]": { "editor.defaultFormatter": "esbenp.prettier-vscode" }, @@ -29,16 +29,16 @@ "editor.wordWrap": "on" }, "[javascript]": { - "editor.defaultFormatter": "biomejs.biome" + "editor.defaultFormatter": "esbenp.prettier-vscode" }, "[javascriptreact]": { - "editor.defaultFormatter": "biomejs.biome" + "editor.defaultFormatter": "esbenp.prettier-vscode" }, "[typescript]": { - "editor.defaultFormatter": "biomejs.biome" + "editor.defaultFormatter": "esbenp.prettier-vscode" }, "[typescriptreact]": { - "editor.defaultFormatter": "biomejs.biome" + "editor.defaultFormatter": "esbenp.prettier-vscode" }, "[html]": { "editor.defaultFormatter": "esbenp.prettier-vscode" diff --git a/apps/cache-testing/cache-handler-next-example.js b/apps/cache-testing/cache-handler-next-example.js index f7a19f13..f6f91d8e 100644 --- a/apps/cache-testing/cache-handler-next-example.js +++ b/apps/cache-testing/cache-handler-next-example.js @@ -5,13 +5,11 @@ export default class CacheHandler { this.options = options; } - // biome-ignore lint/suspicious/useAwait: don't bother async get(key) { // This could be stored anywhere, like durable storage return cache.get(key); } - // biome-ignore lint/suspicious/useAwait: don't bother async set(key, data, ctx) { // This could be stored anywhere, like durable storage cache.set(key, { @@ -21,10 +19,9 @@ export default class CacheHandler { }); } - // biome-ignore lint/suspicious/useAwait: don't bother async revalidateTag(tag) { // Iterate over all entries in the cache - // biome-ignore lint/style/useConst: don't bother + for (let [key, value] of cache) { // If the value's tags include the specified tag, delete this entry if (value.tags.includes(tag)) { diff --git a/apps/cache-testing/package.json b/apps/cache-testing/package.json index 838270e1..b34a8a4e 100644 --- a/apps/cache-testing/package.json +++ b/apps/cache-testing/package.json @@ -10,15 +10,15 @@ "cluster:stop": "pm2 kill", "e2e": "playwright test --config=./playwright.config.ts", "e2e:ui": "playwright test --ui --config=./playwright.config.ts", - "eslint:check": "next lint", - "eslint:fix": "next lint --fix", + "lint:check": "next lint --max-warnings=0", + "lint:fix": "next lint --fix --max-warnings=0", "playwright:install": "playwright install chromium", "start": "dotenv -e .env.local -v SERVER_STARTED=1 node .next/standalone/apps/cache-testing/server.js" }, "dependencies": { "@neshca/cache-handler": "workspace:*", "axios": "1.8.4", - "next": "15.3.0-canary.14", + "next": "15.3.0-canary.16", "react": "19.0.0", "react-dom": "19.0.0", "redis": "4.7.0" diff --git a/apps/cache-testing/src/app/api/revalidate-app/route.ts b/apps/cache-testing/src/app/api/revalidate-app/route.ts index 73d70b64..e295f11e 100644 --- a/apps/cache-testing/src/app/api/revalidate-app/route.ts +++ b/apps/cache-testing/src/app/api/revalidate-app/route.ts @@ -1,8 +1,7 @@ import { revalidatePath, revalidateTag } from 'next/cache'; -import type { NextRequest } from 'next/server'; import { NextResponse } from 'next/server'; - import { formatTime } from 'cache-testing/utils/format-time'; +import type { NextRequest } from 'next/server'; export function GET(request: NextRequest): Promise { const path = request.nextUrl.searchParams.get('path'); diff --git a/apps/cache-testing/src/app/app/no-params/dynamic-false/[slug]/page.tsx b/apps/cache-testing/src/app/app/no-params/dynamic-false/[slug]/page.tsx index 31b60f2c..bf9be930 100644 --- a/apps/cache-testing/src/app/app/no-params/dynamic-false/[slug]/page.tsx +++ b/apps/cache-testing/src/app/app/no-params/dynamic-false/[slug]/page.tsx @@ -1,5 +1,4 @@ import { notFound } from 'next/navigation'; - import { CommonAppPage } from 'cache-testing/utils/common-app-page'; import { createGetData } from 'cache-testing/utils/create-get-data'; diff --git a/apps/cache-testing/src/app/app/no-params/dynamic-true/[slug]/page.tsx b/apps/cache-testing/src/app/app/no-params/dynamic-true/[slug]/page.tsx index 911e6626..43c5c12d 100644 --- a/apps/cache-testing/src/app/app/no-params/dynamic-true/[slug]/page.tsx +++ b/apps/cache-testing/src/app/app/no-params/dynamic-true/[slug]/page.tsx @@ -1,5 +1,4 @@ import { notFound } from 'next/navigation'; - import { CommonAppPage } from 'cache-testing/utils/common-app-page'; import { createGetData } from 'cache-testing/utils/create-get-data'; diff --git a/apps/cache-testing/src/app/app/no-params/ssr/200/page.tsx b/apps/cache-testing/src/app/app/no-params/ssr/200/page.tsx index 483b050c..ebbc9218 100644 --- a/apps/cache-testing/src/app/app/no-params/ssr/200/page.tsx +++ b/apps/cache-testing/src/app/app/no-params/ssr/200/page.tsx @@ -1,5 +1,4 @@ import { notFound } from 'next/navigation'; - import { CommonAppPage } from 'cache-testing/utils/common-app-page'; import { createGetData } from 'cache-testing/utils/create-get-data'; diff --git a/apps/cache-testing/src/app/app/ppr/page.tsx b/apps/cache-testing/src/app/app/ppr/page.tsx index 21e5eb2c..1d7a9651 100644 --- a/apps/cache-testing/src/app/app/ppr/page.tsx +++ b/apps/cache-testing/src/app/app/ppr/page.tsx @@ -1,6 +1,5 @@ import { unstable_noStore as noStore } from 'next/cache'; import { Suspense } from 'react'; - import { formatTime } from 'cache-testing/utils/format-time'; import type { TimeBackendApiResponseJson } from 'cache-testing/utils/types'; diff --git a/apps/cache-testing/src/app/app/randomHex/[length]/page.tsx b/apps/cache-testing/src/app/app/randomHex/[length]/page.tsx index 18fe2ae5..55005d91 100644 --- a/apps/cache-testing/src/app/app/randomHex/[length]/page.tsx +++ b/apps/cache-testing/src/app/app/randomHex/[length]/page.tsx @@ -1,20 +1,22 @@ -import { CacheStateWatcher } from 'cache-testing/components/cache-state-watcher'; -import { PreRenderedAt } from 'cache-testing/components/pre-rendered-at'; -import type { RandomHexPageProps } from 'cache-testing/utils/types'; import { unstable_cacheTag as cacheTag } from 'next/cache'; import { notFound } from 'next/navigation'; import { Suspense } from 'react'; +import { CacheStateWatcher } from 'cache-testing/components/cache-state-watcher'; +import { PreRenderedAt } from 'cache-testing/components/pre-rendered-at'; +import type { RandomHexPageProps } from 'cache-testing/utils/types'; const lengthSteps = new Array(5).fill(0).map((_, i) => 10 ** (i + 1)); type PageParams = { params: Promise<{ length: string }> }; -export async function generateStaticParams(): Promise< +export function generateStaticParams(): Promise< { length: string; }[] > { - return lengthSteps.map((length) => ({ length: `${length}` })); + return Promise.resolve( + lengthSteps.map((length) => ({ length: `${length}` })), + ); } export default async function Page({ diff --git a/apps/cache-testing/src/app/app/static/route.ts b/apps/cache-testing/src/app/app/static/route.ts index 524283f8..d7004ce5 100644 --- a/apps/cache-testing/src/app/app/static/route.ts +++ b/apps/cache-testing/src/app/app/static/route.ts @@ -1,3 +1,3 @@ -export function GET() { +export function GET(): Promise { return Promise.resolve(new Response('OK', { status: 200 })); } diff --git a/apps/cache-testing/src/app/app/with-params/dynamic-false/[slug]/page.tsx b/apps/cache-testing/src/app/app/with-params/dynamic-false/[slug]/page.tsx index 4540f218..c899faa9 100644 --- a/apps/cache-testing/src/app/app/with-params/dynamic-false/[slug]/page.tsx +++ b/apps/cache-testing/src/app/app/with-params/dynamic-false/[slug]/page.tsx @@ -1,5 +1,4 @@ import { notFound } from 'next/navigation'; - import { CommonAppPage } from 'cache-testing/utils/common-app-page'; import { createGetData } from 'cache-testing/utils/create-get-data'; diff --git a/apps/cache-testing/src/app/app/with-params/dynamic-true/[slug]/page.tsx b/apps/cache-testing/src/app/app/with-params/dynamic-true/[slug]/page.tsx index 2040e1ff..1b5208be 100644 --- a/apps/cache-testing/src/app/app/with-params/dynamic-true/[slug]/page.tsx +++ b/apps/cache-testing/src/app/app/with-params/dynamic-true/[slug]/page.tsx @@ -1,5 +1,4 @@ import { notFound } from 'next/navigation'; - import { CommonAppPage } from 'cache-testing/utils/common-app-page'; import { createGetData } from 'cache-testing/utils/create-get-data'; diff --git a/apps/cache-testing/src/app/layout.tsx b/apps/cache-testing/src/app/layout.tsx index 43018e6a..0e85ba66 100644 --- a/apps/cache-testing/src/app/layout.tsx +++ b/apps/cache-testing/src/app/layout.tsx @@ -1,8 +1,7 @@ -import type { PropsWithChildren } from 'react'; import { Suspense } from 'react'; - import { RestartButton } from 'cache-testing/components/restart-button'; import { RevalidateButton } from 'cache-testing/components/revalidate-button'; +import type { PropsWithChildren } from 'react'; import 'cache-testing/globals.css'; export const metadata = { diff --git a/apps/cache-testing/src/components/cache-state-watcher.tsx b/apps/cache-testing/src/components/cache-state-watcher.tsx index b8e534b3..5ab89210 100644 --- a/apps/cache-testing/src/components/cache-state-watcher.tsx +++ b/apps/cache-testing/src/components/cache-state-watcher.tsx @@ -41,7 +41,7 @@ export function CacheStateWatcher({ id = requestAnimationFrame(check); - return () => { + return (): void => { cancelAnimationFrame(id); }; }, [revalidateAfter, time]); diff --git a/apps/cache-testing/src/components/restart-button.tsx b/apps/cache-testing/src/components/restart-button.tsx index f5b16518..e427c0e2 100644 --- a/apps/cache-testing/src/components/restart-button.tsx +++ b/apps/cache-testing/src/components/restart-button.tsx @@ -6,13 +6,15 @@ export function RestartButton(): React.ReactNode { const [restartState, setRestartState] = useState(''); function restart(): void { - fetch('/api/restart-app').then((result) => { - if (!result.ok) { + fetch('/api/restart-app') + .then((result) => { + if (!result.ok) { + throw new Error('Fail to restart'); + } + }) + .catch(() => { setRestartState('Fail to restart'); - } - }); - - setRestartState('Restarting...'); + }); } return ( diff --git a/apps/cache-testing/src/components/revalidate-button.tsx b/apps/cache-testing/src/components/revalidate-button.tsx index a5b8e064..50be628f 100644 --- a/apps/cache-testing/src/components/revalidate-button.tsx +++ b/apps/cache-testing/src/components/revalidate-button.tsx @@ -28,8 +28,8 @@ export function RevalidateButton({ searchParams.set(type, pathname); } - fetch(`/api/revalidate-${nextApi}?${searchParams.toString()}`).then( - async (result) => { + fetch(`/api/revalidate-${nextApi}?${searchParams.toString()}`) + .then(async (result) => { if (!result.ok) { setRevalidation('Fail to revalidate'); @@ -39,8 +39,10 @@ export function RevalidateButton({ const json = (await result.json()) as { now: string }; setRevalidation(`Revalidated at ${json.now}`); - }, - ); + }) + .catch(() => { + setRevalidation('Fail to revalidate'); + }); } return ( diff --git a/apps/cache-testing/src/globals.css b/apps/cache-testing/src/globals.css index f93df416..148af1e0 100644 --- a/apps/cache-testing/src/globals.css +++ b/apps/cache-testing/src/globals.css @@ -2,8 +2,9 @@ --max-width: 1100px; --border-radius: 12px; --font-mono: - ui-monospace, Menlo, Monaco, "Cascadia Mono", "Segoe UI Mono", "Roboto Mono", "Oxygen Mono", - "Ubuntu Monospace", "Source Code Pro", "Fira Mono", "Droid Sans Mono", "Courier New", monospace; + ui-monospace, Menlo, Monaco, 'Cascadia Mono', 'Segoe UI Mono', + 'Roboto Mono', 'Oxygen Mono', 'Ubuntu Monospace', 'Source Code Pro', + 'Fira Mono', 'Droid Sans Mono', 'Courier New', monospace; --foreground-rgb: 0, 0, 0; --background-start-rgb: 214, 219, 220; @@ -83,7 +84,7 @@ html, body { max-width: 100vw; overflow-x: hidden; - font-family: "Courier New", Courier, monospace; + font-family: 'Courier New', Courier, monospace; } body { diff --git a/apps/cache-testing/src/instrumentation.ts b/apps/cache-testing/src/instrumentation.ts index a3b9d874..ea36a8b8 100644 --- a/apps/cache-testing/src/instrumentation.ts +++ b/apps/cache-testing/src/instrumentation.ts @@ -1,4 +1,4 @@ -export async function register() { +export async function register(): Promise { if (process.env.NEXT_RUNTIME === 'nodejs') { const { registerInitialCache } = await import( '@neshca/cache-handler/instrumentation/register-initial-cache' diff --git a/apps/cache-testing/src/pages/_app.tsx b/apps/cache-testing/src/pages/_app.tsx index 2d5ad588..abf43cce 100644 --- a/apps/cache-testing/src/pages/_app.tsx +++ b/apps/cache-testing/src/pages/_app.tsx @@ -1,6 +1,5 @@ -import type { AppProps } from 'next/app'; - import Layout from './layout'; +import type { AppProps } from 'next/app'; export default function MyApp({ Component, diff --git a/apps/cache-testing/src/pages/api/revalidate-pages.ts b/apps/cache-testing/src/pages/api/revalidate-pages.ts index baead5cf..c1c140f0 100644 --- a/apps/cache-testing/src/pages/api/revalidate-pages.ts +++ b/apps/cache-testing/src/pages/api/revalidate-pages.ts @@ -1,6 +1,5 @@ -import type { NextApiRequest, NextApiResponse } from 'next'; - import { formatTime } from 'cache-testing/utils/format-time'; +import type { NextApiRequest, NextApiResponse } from 'next'; export default async function handler( request: NextApiRequest, diff --git a/apps/cache-testing/src/pages/layout.tsx b/apps/cache-testing/src/pages/layout.tsx index 7aff44f4..16972c67 100644 --- a/apps/cache-testing/src/pages/layout.tsx +++ b/apps/cache-testing/src/pages/layout.tsx @@ -1,7 +1,6 @@ -import type { PropsWithChildren } from 'react'; - import { RestartButton } from 'cache-testing/components/restart-button'; import { RevalidateButton } from 'cache-testing/components/revalidate-button'; +import type { PropsWithChildren } from 'react'; import 'cache-testing/globals.css'; export default function Layout({ diff --git a/apps/cache-testing/src/pages/pages/no-paths/fallback-blocking/[slug].tsx b/apps/cache-testing/src/pages/pages/no-paths/fallback-blocking/[slug].tsx index 4e20eb89..ffaf5378 100644 --- a/apps/cache-testing/src/pages/pages/no-paths/fallback-blocking/[slug].tsx +++ b/apps/cache-testing/src/pages/pages/no-paths/fallback-blocking/[slug].tsx @@ -1,7 +1,6 @@ -import type { GetStaticPathsResult } from 'next'; - import { CommonPagesPage } from 'cache-testing/utils/common-pages-page'; import { createPagesGetStaticProps } from 'cache-testing/utils/create-pages-get-static-props'; +import type { GetStaticPathsResult } from 'next'; export const getStaticProps = createPagesGetStaticProps( 'pages/no-paths/fallback-blocking', diff --git a/apps/cache-testing/src/pages/pages/no-paths/fallback-false/[slug].tsx b/apps/cache-testing/src/pages/pages/no-paths/fallback-false/[slug].tsx index a9e11b76..757ca4f4 100644 --- a/apps/cache-testing/src/pages/pages/no-paths/fallback-false/[slug].tsx +++ b/apps/cache-testing/src/pages/pages/no-paths/fallback-false/[slug].tsx @@ -1,7 +1,6 @@ -import type { GetStaticPathsResult } from 'next'; - import { CommonPagesPage } from 'cache-testing/utils/common-pages-page'; import { createPagesGetStaticProps } from 'cache-testing/utils/create-pages-get-static-props'; +import type { GetStaticPathsResult } from 'next'; export const getStaticProps = createPagesGetStaticProps( 'pages/no-paths/fallback-false', diff --git a/apps/cache-testing/src/pages/pages/no-paths/fallback-true/[slug].tsx b/apps/cache-testing/src/pages/pages/no-paths/fallback-true/[slug].tsx index ece84de3..eb787dbc 100644 --- a/apps/cache-testing/src/pages/pages/no-paths/fallback-true/[slug].tsx +++ b/apps/cache-testing/src/pages/pages/no-paths/fallback-true/[slug].tsx @@ -1,7 +1,6 @@ -import type { GetStaticPathsResult } from 'next'; - import { CommonPagesPage } from 'cache-testing/utils/common-pages-page'; import { createPagesGetStaticProps } from 'cache-testing/utils/create-pages-get-static-props'; +import type { GetStaticPathsResult } from 'next'; export const getStaticProps = createPagesGetStaticProps( 'pages/no-paths/fallback-true', diff --git a/apps/cache-testing/src/pages/pages/randomHex/[length].tsx b/apps/cache-testing/src/pages/pages/randomHex/[length].tsx index 8243e74d..56f10882 100644 --- a/apps/cache-testing/src/pages/pages/randomHex/[length].tsx +++ b/apps/cache-testing/src/pages/pages/randomHex/[length].tsx @@ -1,13 +1,12 @@ +import { CacheStateWatcher } from 'cache-testing/components/cache-state-watcher'; +import { PreRenderedAt } from 'cache-testing/components/pre-rendered-at'; +import type { RandomHexPageProps } from 'cache-testing/utils/types'; import type { GetStaticPathsResult, GetStaticPropsContext, GetStaticPropsResult, } from 'next'; -import { CacheStateWatcher } from 'cache-testing/components/cache-state-watcher'; -import { PreRenderedAt } from 'cache-testing/components/pre-rendered-at'; -import type { RandomHexPageProps } from 'cache-testing/utils/types'; - const lengthSteps = new Array(5).fill(0).map((_, i) => 10 ** (i + 1)); export async function getStaticProps({ diff --git a/apps/cache-testing/src/pages/pages/with-paths/fallback-blocking/[slug].tsx b/apps/cache-testing/src/pages/pages/with-paths/fallback-blocking/[slug].tsx index 9c2df973..c2d5befb 100644 --- a/apps/cache-testing/src/pages/pages/with-paths/fallback-blocking/[slug].tsx +++ b/apps/cache-testing/src/pages/pages/with-paths/fallback-blocking/[slug].tsx @@ -1,7 +1,6 @@ -import type { GetStaticPathsResult } from 'next'; - import { CommonPagesPage } from 'cache-testing/utils/common-pages-page'; import { createPagesGetStaticProps } from 'cache-testing/utils/create-pages-get-static-props'; +import type { GetStaticPathsResult } from 'next'; export const getStaticProps = createPagesGetStaticProps( 'pages/with-paths/fallback-blocking', diff --git a/apps/cache-testing/src/pages/pages/with-paths/fallback-false/[slug].tsx b/apps/cache-testing/src/pages/pages/with-paths/fallback-false/[slug].tsx index 1d272b62..afa5859e 100644 --- a/apps/cache-testing/src/pages/pages/with-paths/fallback-false/[slug].tsx +++ b/apps/cache-testing/src/pages/pages/with-paths/fallback-false/[slug].tsx @@ -1,7 +1,6 @@ -import type { GetStaticPathsResult } from 'next'; - import { CommonPagesPage } from 'cache-testing/utils/common-pages-page'; import { createPagesGetStaticProps } from 'cache-testing/utils/create-pages-get-static-props'; +import type { GetStaticPathsResult } from 'next'; export const getStaticProps = createPagesGetStaticProps( 'pages/with-paths/fallback-false', diff --git a/apps/cache-testing/src/pages/pages/with-paths/fallback-true/[slug].tsx b/apps/cache-testing/src/pages/pages/with-paths/fallback-true/[slug].tsx index c245d6aa..ea8361a2 100644 --- a/apps/cache-testing/src/pages/pages/with-paths/fallback-true/[slug].tsx +++ b/apps/cache-testing/src/pages/pages/with-paths/fallback-true/[slug].tsx @@ -1,7 +1,6 @@ -import type { GetStaticPathsResult } from 'next'; - import { CommonPagesPage } from 'cache-testing/utils/common-pages-page'; import { createPagesGetStaticProps } from 'cache-testing/utils/create-pages-get-static-props'; +import type { GetStaticPathsResult } from 'next'; export const getStaticProps = createPagesGetStaticProps( 'pages/with-paths/fallback-true', diff --git a/apps/cache-testing/src/utils/common-app-page.tsx b/apps/cache-testing/src/utils/common-app-page.tsx index eb92bbc1..9f049a33 100644 --- a/apps/cache-testing/src/utils/common-app-page.tsx +++ b/apps/cache-testing/src/utils/common-app-page.tsx @@ -1,9 +1,7 @@ import { Suspense } from 'react'; - -import type { PageProps } from './types'; - import { CacheStateWatcher } from 'cache-testing/components/cache-state-watcher'; import { PreRenderedAt } from 'cache-testing/components/pre-rendered-at'; +import type { PageProps } from './types'; export function CommonAppPage({ count, diff --git a/apps/cache-testing/src/utils/common-pages-page.tsx b/apps/cache-testing/src/utils/common-pages-page.tsx index 7f5ec675..553db94a 100644 --- a/apps/cache-testing/src/utils/common-pages-page.tsx +++ b/apps/cache-testing/src/utils/common-pages-page.tsx @@ -1,8 +1,7 @@ -import type { PageProps } from './types'; - +import { useRouter } from 'next/router'; import { CacheStateWatcher } from 'cache-testing/components/cache-state-watcher'; import { PreRenderedAt } from 'cache-testing/components/pre-rendered-at'; -import { useRouter } from 'next/router'; +import type { PageProps } from './types'; export function CommonPagesPage({ count, diff --git a/apps/cache-testing/src/utils/create-pages-get-get-server-side-props.ts b/apps/cache-testing/src/utils/create-pages-get-get-server-side-props.ts index bb97d7a2..3013dce3 100644 --- a/apps/cache-testing/src/utils/create-pages-get-get-server-side-props.ts +++ b/apps/cache-testing/src/utils/create-pages-get-get-server-side-props.ts @@ -1,6 +1,5 @@ -import type { GetServerSideProps, GetServerSidePropsResult } from 'next'; - import type { CountBackendApiResponseJson, PageProps } from './types'; +import type { GetServerSideProps, GetServerSidePropsResult } from 'next'; export function createPagesGetServerSideProps( path: string, diff --git a/apps/cache-testing/src/utils/create-pages-get-static-props.ts b/apps/cache-testing/src/utils/create-pages-get-static-props.ts index 428e6ed8..4c0abf4e 100644 --- a/apps/cache-testing/src/utils/create-pages-get-static-props.ts +++ b/apps/cache-testing/src/utils/create-pages-get-static-props.ts @@ -1,11 +1,10 @@ +import type { CountBackendApiResponseJson, PageProps } from './types'; import type { GetStaticProps, GetStaticPropsContext, GetStaticPropsResult, } from 'next'; -import type { CountBackendApiResponseJson, PageProps } from './types'; - const revalidate = 5; export function createPagesGetStaticProps( diff --git a/biome.json b/biome.json deleted file mode 100644 index 68ac35ae..00000000 --- a/biome.json +++ /dev/null @@ -1,80 +0,0 @@ -{ - "$schema": "./node_modules/@biomejs/biome/configuration_schema.json", - "organizeImports": { - "enabled": true - }, - "linter": { - "enabled": true, - "rules": { - "all": true, - "suspicious": { - "noConsole": { - "level": "error", - "options": { "allow": ["assert", "error", "info", "warn"] } - } - }, - "style": { - "useFilenamingConvention": { - "level": "error", - "options": { - "filenameCases": ["kebab-case"] - } - }, - "noDefaultExport": "off", - "useNamingConvention": "off", - "noImplicitBoolean": "off" - }, - "correctness": { - "noNodejsModules": "off", - "noUndeclaredDependencies": "off", - "useImportExtensions": "off" - }, - "complexity": { - "noExcessiveCognitiveComplexity": "off" - }, - "performance": { - "noBarrelFile": "off" - } - } - }, - - "formatter": { - "enabled": true, - "useEditorconfig": true - }, - "vcs": { - "clientKind": "git", - "useIgnoreFile": true, - "defaultBranch": "canary", - "enabled": true - }, - "javascript": { - "formatter": { - "quoteStyle": "single" - }, - "globals": ["React"] - }, - "json": { - "formatter": { - "enabled": false - } - }, - "overrides": [ - { - "include": ["[slug].tsx", "[length].tsx", "200.tsx"], - "linter": { - "rules": { "style": { "useFilenamingConvention": "off" } } - } - }, - { - "include": ["*.test.ts"], - "linter": { - "rules": { "performance": { "useTopLevelRegex": "off" } } - } - }, - { - "include": ["*.js", "*.cjs"], - "linter": { "rules": { "nursery": { "noCommonJs": "off" } } } - } - ] -} diff --git a/docs/cache-handler-docs/package.json b/docs/cache-handler-docs/package.json index c9facb89..d889833a 100644 --- a/docs/cache-handler-docs/package.json +++ b/docs/cache-handler-docs/package.json @@ -7,14 +7,14 @@ "build:docs": "next build && pagefind --site .next/server/app --output-path out/_pagefind", "check-types": "tsc --noEmit", "dev:docs": "next dev --turbo", - "eslint:check": "next lint", - "eslint:fix": "next lint --fix", + "lint:check": "next lint --max-warnings=0", + "lint:fix": "next lint --fix --max-warnings=0", "start:docs": "serve out" }, "dependencies": { - "next": "15.3.0-canary.14", - "nextra": "4.2.16", - "nextra-theme-docs": "4.2.16", + "next": "15.3.0-canary.16", + "nextra": "4.2.17", + "nextra-theme-docs": "4.2.17", "react": "19.0.0", "react-dom": "19.0.0" }, diff --git a/docs/cache-handler-docs/src/app/layout.tsx b/docs/cache-handler-docs/src/app/layout.tsx index d3a4f09b..cb650268 100644 --- a/docs/cache-handler-docs/src/app/layout.tsx +++ b/docs/cache-handler-docs/src/app/layout.tsx @@ -1,6 +1,6 @@ -import { Footer, Layout, Navbar } from 'nextra-theme-docs'; import { Banner } from 'nextra/components'; import { getPageMap } from 'nextra/page-map'; +import { Footer, Layout, Navbar } from 'nextra-theme-docs'; import type { ReactNode } from 'react'; import 'nextra-theme-docs/style.css'; diff --git a/internal/eslint-config/base.js b/internal/eslint-config/base.js new file mode 100644 index 00000000..7ebb8e5f --- /dev/null +++ b/internal/eslint-config/base.js @@ -0,0 +1,132 @@ +import 'eslint-plugin-only-warn'; +import js from '@eslint/js'; +import { globalIgnores } from 'eslint/config'; +import eslintPluginImportX from 'eslint-plugin-import-x'; +import turboPlugin from 'eslint-plugin-turbo'; +import globals from 'globals'; +import tseslint from 'typescript-eslint'; +import { createTypeScriptImportResolver } from 'eslint-import-resolver-typescript'; +import checkFile from 'eslint-plugin-check-file'; + +export default tseslint.config( + globalIgnores(['**/dist', '**/.turbo']), + { + extends: [js.configs.recommended, tseslint.configs.strictTypeChecked], + languageOptions: { + globals: { + ...globals.node, + ...globals.es2024, + }, + parserOptions: { + projectService: true, + tsconfigRootDir: import.meta.dirname, + }, + }, + rules: { + '@typescript-eslint/restrict-template-expressions': [ + 'error', + { allowNumber: true, allowBoolean: true, allowNever: true }, + ], + '@typescript-eslint/explicit-function-return-type': 'error', + '@typescript-eslint/no-unnecessary-condition': [ + 'error', + { allowConstantLoopConditions: 'only-allowed-literals' }, + ], + '@typescript-eslint/no-invalid-void-type': 'off', + '@typescript-eslint/no-unused-vars': [ + 'error', + { + args: 'all', + argsIgnorePattern: '^_', + caughtErrors: 'all', + caughtErrorsIgnorePattern: '^_', + destructuredArrayIgnorePattern: '^_', + varsIgnorePattern: '^_', + ignoreRestSiblings: true, + }, + ], + }, + }, + { + files: ['**/*.{js,mjs,cjs,jsx}'], + extends: [tseslint.configs.disableTypeChecked], + rules: { + '@typescript-eslint/explicit-function-return-type': 'off', + }, + }, + { + extends: [ + eslintPluginImportX.flatConfigs.errors, + eslintPluginImportX.flatConfigs.typescript, + ], + settings: { + 'import-x/resolver-next': [ + createTypeScriptImportResolver({ + alwaysTryTypes: true, + project: 'tsconfig.json', + }), + ], + }, + rules: { + 'no-unused-vars': 'off', + 'import-x/no-dynamic-require': 'warn', + 'import-x/consistent-type-specifier-style': ['error', 'prefer-top-level'], + 'import-x/no-empty-named-blocks': 'error', + 'import-x/no-mutable-exports': 'error', + 'import-x/no-cycle': 'error', + 'import-x/no-useless-path-segments': 'error', + 'import-x/first': 'error', + 'import-x/newline-after-import': 'error', + 'import-x/order': [ + 'error', + { + groups: [ + 'builtin', + 'external', + 'internal', + 'parent', + 'sibling', + 'index', + 'object', + 'type', + ], + 'newlines-between': 'never', + distinctGroup: false, + alphabetize: { + order: 'asc', + orderImportKind: 'asc', + }, + }, + ], + }, + }, + turboPlugin.configs['flat/recommended'], + { + files: ['**/*.{js,cjs,mjs,jsx,ts,tsx}'], + plugins: { + 'check-file': checkFile, + }, + rules: { + 'check-file/filename-naming-convention': [ + 'error', + { + '**/*.{js,cjs,mjs,jsx,ts,tsx}': 'KEBAB_CASE', + }, + { + ignoreMiddleExtensions: true, + }, + ], + 'check-file/folder-naming-convention': [ + 'error', + { '**/*': 'KEBAB_CASE' }, + ], + 'check-file/no-index': [ + 'error', + { + errorMessage: + 'The file "{{ target }}" is not allowed to be named "index"', + }, + ], + }, + }, +); diff --git a/internal/eslint-config/lib.js b/internal/eslint-config/lib.js new file mode 100644 index 00000000..f9b7057c --- /dev/null +++ b/internal/eslint-config/lib.js @@ -0,0 +1,20 @@ +import jsdoc from 'eslint-plugin-jsdoc'; +import tseslint from 'typescript-eslint'; + +export default tseslint.config({ + extends: [jsdoc.configs['flat/recommended-typescript']], + rules: { + 'jsdoc/check-indentation': 'error', + 'jsdoc/no-blank-blocks': 'error', + 'jsdoc/require-hyphen-before-param-description': ['error', 'always'], + 'jsdoc/check-tag-names': ['error', { definedTags: ['remarks'] }], + 'jsdoc/tag-lines': [ + 'error', + 'always', + { + applyToEndTag: false, + startLines: 1, + }, + ], + }, +}); diff --git a/internal/eslint-config/next.js b/internal/eslint-config/next.js index 023ea3f1..3a391702 100644 --- a/internal/eslint-config/next.js +++ b/internal/eslint-config/next.js @@ -1,11 +1,9 @@ -import js from '@eslint/js'; +import { globalIgnores } from 'eslint/config'; import pluginNext from '@next/eslint-plugin-next'; -import eslintConfigPrettier from 'eslint-config-prettier'; import pluginReact from 'eslint-plugin-react'; import pluginReactHooks from 'eslint-plugin-react-hooks'; -import turboPlugin from 'eslint-plugin-turbo'; -import globals from 'globals'; import tseslint from 'typescript-eslint'; +import baseEslintConfig from './base.js'; /** * A shared ESLint configuration for the repository. @@ -13,39 +11,23 @@ import tseslint from 'typescript-eslint'; * @type {import("typescript-eslint").ConfigArray} * */ export const nextJsConfig = tseslint.config( - js.configs.recommended, - eslintConfigPrettier, - ...tseslint.configs.recommended, + globalIgnores(['**/.next']), + baseEslintConfig, { - languageOptions: { - globals: { - ...globals.node, - }, - }, - }, - { - plugins: { - turbo: turboPlugin, - }, + extends: [ + pluginReact.configs.flat.recommended, + pluginReact.configs.flat['jsx-runtime'], + ], rules: { - 'turbo/no-undeclared-env-vars': 'warn', + 'react/prop-types': 'off', }, - }, - { - ignores: ['dist/**'], - }, - { - ...pluginReact.configs.flat.recommended, - languageOptions: { - ...pluginReact.configs.flat.recommended.languageOptions, - globals: { - ...globals.serviceworker, + settings: { + react: { + version: 'detect', }, }, - rules: { - 'react/prop-types': 'off', - }, }, + pluginReactHooks.configs['recommended-latest'], { plugins: { '@next/next': pluginNext, @@ -55,31 +37,10 @@ export const nextJsConfig = tseslint.config( ...pluginNext.configs['core-web-vitals'].rules, }, }, - { - plugins: { - 'react-hooks': pluginReactHooks, - }, - settings: { react: { version: 'detect' } }, - rules: { - ...pluginReactHooks.configs.recommended.rules, - // React scope no longer necessary with new JSX transform. - 'react/react-in-jsx-scope': 'off', - }, - }, { rules: { - '@typescript-eslint/no-unused-vars': [ - 'error', - { - args: 'all', - argsIgnorePattern: '^_', - caughtErrors: 'all', - caughtErrorsIgnorePattern: '^_', - destructuredArrayIgnorePattern: '^_', - varsIgnorePattern: '^_', - ignoreRestSiblings: true, - }, - ], + 'check-file/filename-naming-convention': 'off', + 'check-file/folder-naming-convention': 'off', }, }, ); diff --git a/internal/eslint-config/package.json b/internal/eslint-config/package.json index b745c6ae..01e88042 100644 --- a/internal/eslint-config/package.json +++ b/internal/eslint-config/package.json @@ -4,13 +4,24 @@ "private": true, "type": "module", "exports": { - "./next-js": "./next.js" + "./base": "./base.js", + "./vitest": "./vitest.js", + "./next-js": "./next.js", + "./lib": "./lib.js" }, "devDependencies": { "@eslint/js": "9.22.0", - "@next/eslint-plugin-next": "15.3.0-canary.14", + "@next/eslint-plugin-next": "15.3.0-canary.16", + "@typescript-eslint/parser": "8.27.0", + "@vitest/eslint-plugin": "1.1.38", "eslint": "9.22.0", "eslint-config-prettier": "10.1.1", + "eslint-import-resolver-typescript": "4.2.2", + "eslint-plugin-check-file": "3.1.0", + "eslint-plugin-import-x": "4.9.1", + "eslint-plugin-jsdoc": "50.6.8", + "eslint-plugin-mdx": "3.2.0", + "eslint-plugin-only-warn": "1.1.0", "eslint-plugin-react": "7.37.4", "eslint-plugin-react-hooks": "5.2.0", "eslint-plugin-turbo": "2.4.4", diff --git a/internal/eslint-config/vitest.js b/internal/eslint-config/vitest.js new file mode 100644 index 00000000..9e4f2f07 --- /dev/null +++ b/internal/eslint-config/vitest.js @@ -0,0 +1,17 @@ +import vitest from '@vitest/eslint-plugin'; +import tseslint from 'typescript-eslint'; + +export default tseslint.config({ + files: ['**/*.test.ts', '**/*.spec.ts'], + extends: [vitest.configs.all], + rules: { + 'vitest/prefer-expect-assertions': [ + 'error', + { + onlyFunctionsWithAsyncKeyword: true, + onlyFunctionsWithExpectInLoop: true, + onlyFunctionsWithExpectInCallback: true, + }, + ], + }, +}); diff --git a/internal/typescript-config/lib.json b/internal/typescript-config/lib.json index 6690c5a2..855cd635 100644 --- a/internal/typescript-config/lib.json +++ b/internal/typescript-config/lib.json @@ -4,7 +4,7 @@ "_version": "20.17.0", "compilerOptions": { "target": "es2022", - "lib": ["es2024"], + "lib": ["es2024", "esnext.disposable"], "module": "NodeNext", "moduleDetection": "force", diff --git a/package.json b/package.json index d746d021..e63ef65b 100644 --- a/package.json +++ b/package.json @@ -8,26 +8,25 @@ "build:docs": "turbo run build:docs --filter=@repo/cache-handler-docs", "build:packages": "turbo run build --filter=!./apps/* --filter=!./docs/*", "build:test-app": "turbo run build --filter=@repo/cache-testing", - "changeset": "changeset", + "change": "changeset", "check-types": "turbo run check-types", "ci:publish": "changeset publish", "ci:version": "changeset version && pnpm codestyle:fix", - "codestyle:check": "biome check . && pnpm prettier:check && pnpm eslint:check && pnpm check-types", - "codestyle:fix": "biome check --write . && pnpm prettier:fix && pnpm eslint:fix && pnpm check-types", + "codestyle:check": "pnpm lint:check && pnpm prettier:check && pnpm check-types", + "codestyle:fix": "pnpm lint:fix && pnpm prettier:fix && pnpm check-types", "dev:docs": "turbo run dev:docs --filter=@repo/cache-handler-docs", "dev:packages": "turbo run dev", "e2e": "turbo run e2e", - "eslint:check": "turbo run eslint:check", - "eslint:fix": "turbo run eslint:fix", + "lint:check": "turbo run lint:check", + "lint:fix": "turbo run lint:fix", "playwright:install": "pnpm -F @repo/cache-testing playwright:install", - "prettier:check": "prettier --check **/*.{md,mdx,yml,json}", - "prettier:fix": "prettier --write **/*.{md,mdx,yml,json}", + "prettier:check": "NODE_OPTIONS=\"--experimental-strip-types\" prettier . --check --cache", + "prettier:fix": "NODE_OPTIONS=\"--experimental-strip-types\" prettier . --write --cache", "start:backend": "turbo run start --filter=@repo/backend", "start:test-app": "turbo run start --filter=@repo/cache-testing", "test": "turbo run test" }, "devDependencies": { - "@biomejs/biome": "1.9.4", "@changesets/cli": "2.28.1", "prettier": "3.5.3", "prettier-plugin-packagejson": "2.5.10", diff --git a/packages/cache-handler/eslint.config.js b/packages/cache-handler/eslint.config.js new file mode 100644 index 00000000..d882b428 --- /dev/null +++ b/packages/cache-handler/eslint.config.js @@ -0,0 +1,10 @@ +import baseEslintConfig from '@repo/eslint-config/base'; +import libEslintConfig from '@repo/eslint-config/lib'; +import vitestEslintConfig from '@repo/eslint-config/vitest'; +import { defineConfig } from 'eslint/config'; + +export default defineConfig( + baseEslintConfig, + vitestEslintConfig, + libEslintConfig, +); diff --git a/packages/cache-handler/package.json b/packages/cache-handler/package.json index d29b5397..798d033e 100644 --- a/packages/cache-handler/package.json +++ b/packages/cache-handler/package.json @@ -30,9 +30,11 @@ "./use-cache/*": "./dist/use-cache/*.js" }, "scripts": { - "build": "tsc", + "build": "tsc -p tsconfig.build.json", "check-types": "tsc --noEmit", - "dev": "tsc --watch", + "dev": "tsc -w -p tsconfig.build.json", + "lint:check": "eslint . --max-warnings=0", + "lint:fix": "eslint --fix . --max-warnings=0", "test": "vitest run", "test:watch": "vitest" }, @@ -42,9 +44,11 @@ "superjson": "^2.2.2" }, "devDependencies": { + "@repo/eslint-config": "workspace:*", "@repo/typescript-config": "workspace:*", "@types/node": "22.13.10", - "next": "15.3.0-canary.14", + "eslint": "9.22.0", + "next": "15.3.0-canary.16", "tsx": "4.19.3", "typescript": "5.8.2", "vitest": "3.0.9" diff --git a/packages/cache-handler/src/cache-handler.ts b/packages/cache-handler/src/cache-handler.ts index d4eecc03..49921f9b 100644 --- a/packages/cache-handler/src/cache-handler.ts +++ b/packages/cache-handler/src/cache-handler.ts @@ -1,6 +1,8 @@ -import { promises as fsPromises } from 'node:fs'; +import { promises as fsPromises, constants } from 'node:fs'; import path from 'node:path'; - +import { PRERENDER_MANIFEST_VERSION } from './constants.js'; +import { CachedRouteKind, IncrementalCacheKind } from './next-common-types.js'; +import { composeAgeEstimationFn } from './utils/compose-age-estimation-fn.js'; import type { CacheHandlerParametersGet, CacheHandlerParametersSet, @@ -12,14 +14,9 @@ import type { PrerenderManifest, Revalidate, } from './next-common-types.js'; -import { CachedRouteKind, IncrementalCacheKind } from './next-common-types.js'; - -import { composeAgeEstimationFn } from './utils/compose-age-estimation-fn.js'; export type { CacheHandlerValue }; -const PRERENDER_MANIFEST_VERSION = 4; - /** * Represents an internal Next.js metadata for a `get` method. * This metadata is available in the `get` method of the cache handler. @@ -275,16 +272,16 @@ export type OnCreationHook = ( * Deletes an entry from all handlers. * * @param handlers - The list of handlers. + * * @param key - The key to delete. - * @param debug - Whether to log debug messages. * - * @returns A Promise that resolves when all handlers have finished deleting the entry. + * @param debug - Whether to log debug messages. */ -async function removeEntryFromHandlers( +function removeEntryFromHandlers( handlers: Handler[], key: string, debug: boolean, -): Promise { +): void { if (debug) { console.info( '[CacheHandler] [method: %s] [key: %s] %s', @@ -294,33 +291,34 @@ async function removeEntryFromHandlers( ); } - const operationsResults = await Promise.allSettled( - handlers.map((handler) => handler.delete?.(key)), - ); - - if (!debug) { - return; - } + Promise.allSettled(handlers.map((handler) => handler.delete?.(key))).then( + (operationsResults) => { + if (!debug) { + return; + } - operationsResults.forEach((handlerResult, index) => { - if (handlerResult.status === 'rejected') { - console.warn( - '[CacheHandler] [handler: %s] [method: %s] [key: %s] %s', - handlers[index]?.name ?? `unknown-${index}`, - 'delete', - key, - `Error: ${handlerResult.reason}`, - ); - } else { - console.info( - '[CacheHandler] [handler: %s] [method: %s] [key: %s] %s', - handlers[index]?.name ?? `unknown-${index}`, - 'delete', - key, - 'Successfully deleted value.', - ); - } - }); + operationsResults.forEach((handlerResult, index) => { + if (handlerResult.status === 'rejected') { + console.warn( + '[CacheHandler] [handler: %s] [method: %s] [key: %s] %s', + handlers[index]?.name ?? `unknown-${index}`, + 'delete', + key, + `Error: ${handlerResult.reason}`, + ); + } else { + console.info( + '[CacheHandler] [handler: %s] [method: %s] [key: %s] %s', + handlers[index]?.name ?? `unknown-${index}`, + 'delete', + key, + 'Successfully deleted value.', + ); + } + }); + }, + () => {}, + ); } export type CacheHandlerType = typeof CacheHandler; @@ -358,7 +356,7 @@ export class CacheHandler implements NextCacheHandler { * ``` */ static get name(): string { - if (CacheHandler.#cacheListLength === undefined) { + if (CacheHandler.#cacheListLength === 0) { return '@neshca/cache-handler is not configured yet'; } @@ -369,9 +367,9 @@ export class CacheHandler implements NextCacheHandler { static #context: FileSystemCacheContext; - static #mergedHandler: Omit; + static #mergedHandler: Omit | null = null; - static #cacheListLength: number; + static #cacheListLength = 0; static #debug = typeof process.env.NEXT_PRIVATE_DEBUG_CACHE !== 'undefined'; @@ -390,9 +388,6 @@ export class CacheHandler implements NextCacheHandler { cacheKey: string, isFallback: boolean, ): Promise { - let cacheHandlerValue: CacheHandlerValue | null = null; - let pageHtmlHandle: fsPromises.FileHandle | null = null; - if (CacheHandler.#debug) { console.info( '[CacheHandler] [handler: %s] [method: %s] [key: %s] %s', @@ -409,13 +404,17 @@ export class CacheHandler implements NextCacheHandler { 'pages', `${cacheKey}.html`, ); + const pageDataPath = path.join( CacheHandler.#serverDistDir, 'pages', `${cacheKey}.json`, ); - pageHtmlHandle = await fsPromises.open(pageHtmlPath, 'r'); + await using pageHtmlHandle = await fsPromises.open( + pageHtmlPath, + constants.O_RDONLY, + ); const [pageHtmlFile, { mtimeMs }, pageData] = await Promise.all([ pageHtmlHandle.readFile('utf-8'), @@ -437,7 +436,7 @@ export class CacheHandler implements NextCacheHandler { ); } - cacheHandlerValue = { + return { lastModified: mtimeMs, lifespan: null, tags: [], @@ -450,22 +449,18 @@ export class CacheHandler implements NextCacheHandler { }, }; } catch (error) { - cacheHandlerValue = null; - if (CacheHandler.#debug) { console.warn( '[CacheHandler] [handler: %s] [method: %s] [key: %s] %s', 'file system', 'get', cacheKey, - `Error: ${error}`, + `Error: ${error as Error}`, ); } - } finally { - await pageHtmlHandle?.close(); } - return cacheHandlerValue; + return null; } static async #writePagesRouterPage( @@ -478,6 +473,7 @@ export class CacheHandler implements NextCacheHandler { 'pages', `${cacheKey}.html`, ); + const pageDataPath = path.join( CacheHandler.#serverDistDir, 'pages', @@ -509,7 +505,7 @@ export class CacheHandler implements NextCacheHandler { 'file system', 'set', cacheKey, - `Error: ${error}`, + `Error: ${error as Error}`, ); } } @@ -666,13 +662,13 @@ export class CacheHandler implements NextCacheHandler { CacheHandler.#fallbackFalseRoutes.add(route); } } - } catch (_error) { + } catch (error) { if (CacheHandler.#debug) { console.warn( '[CacheHandler] [%s] %s %s', 'instrumentation.cache', 'Failed to read prerender manifest. Pages from the Pages Router with `fallback: false` will return 404 errors.', - `Error: ${_error}`, + `Error: ${error as Error}`, ); } } @@ -682,7 +678,7 @@ export class CacheHandler implements NextCacheHandler { CacheHandler.#cacheListLength = handlersList.length; CacheHandler.#mergedHandler = { - async get(key, meta) { + async get(key, meta): Promise { for (const handler of handlersList) { if (CacheHandler.#debug) { console.info( @@ -714,7 +710,6 @@ export class CacheHandler implements NextCacheHandler { cacheHandlerValue = null; - // remove the entry from all handlers in background removeEntryFromHandlers(handlersList, key, CacheHandler.#debug); } @@ -736,7 +731,7 @@ export class CacheHandler implements NextCacheHandler { handler.name, 'get', key, - `Error: ${error}`, + `Error: ${error as Error}`, ); } } @@ -744,7 +739,7 @@ export class CacheHandler implements NextCacheHandler { return null; }, - async set(key, cacheHandlerValue) { + async set(key, cacheHandlerValue): Promise { const operationsResults = await Promise.allSettled( handlersList.map((handler) => handler.set(key, { ...cacheHandlerValue }), @@ -775,7 +770,7 @@ export class CacheHandler implements NextCacheHandler { } }); }, - async revalidateTag(tag) { + async revalidateTag(tag): Promise { const operationsResults = await Promise.allSettled( handlersList.map((handler) => handler.revalidateTag(tag)), ); @@ -817,6 +812,8 @@ export class CacheHandler implements NextCacheHandler { /** * Creates a new CacheHandler instance. Constructor is intended for internal use only. + * + * @param context - The context for the CacheHandler. */ constructor(context: FileSystemCacheContext) { CacheHandler.#context = context; @@ -833,7 +830,7 @@ export class CacheHandler implements NextCacheHandler { cacheKey: CacheHandlerParametersGet[0], ctx: CacheHandlerParametersGet[1], ): Promise { - if (ctx?.kind !== IncrementalCacheKind.PAGES) { + if (ctx.kind !== IncrementalCacheKind.PAGES) { return null; } @@ -849,7 +846,7 @@ export class CacheHandler implements NextCacheHandler { } let cachedData: CacheHandlerValue | null | undefined = - await CacheHandler.#mergedHandler.get(cacheKey, { + await CacheHandler.#mergedHandler?.get(cacheKey, { implicitTags: [], }); @@ -858,7 +855,7 @@ export class CacheHandler implements NextCacheHandler { // if we have a value from the file system, we should set it to the cache store if (cachedData) { - await CacheHandler.#mergedHandler.set(cacheKey, cachedData); + await CacheHandler.#mergedHandler?.set(cacheKey, cachedData); } } @@ -919,7 +916,7 @@ export class CacheHandler implements NextCacheHandler { value: incrementalCacheValue, } as const; - await CacheHandler.#mergedHandler.set(cacheKey, cacheHandlerValue); + await CacheHandler.#mergedHandler?.set(cacheKey, cacheHandlerValue); if (hasFallbackFalse) { await CacheHandler.#writePagesRouterPage( diff --git a/packages/cache-handler/src/constants.ts b/packages/cache-handler/src/constants.ts index 2f6e8b09..0899038d 100644 --- a/packages/cache-handler/src/constants.ts +++ b/packages/cache-handler/src/constants.ts @@ -3,3 +3,5 @@ export const MAX_INT32 = 2 ** 31 - 1; export const TIME_ONE_YEAR = 31536000; export const REVALIDATED_TAGS_KEY = '__revalidated_tags__'; + +export const PRERENDER_MANIFEST_VERSION: number = 4; diff --git a/packages/cache-handler/src/handlers/experimental-redis-cluster.ts b/packages/cache-handler/src/handlers/experimental-redis-cluster.ts index 70bc604e..df0c5cce 100644 --- a/packages/cache-handler/src/handlers/experimental-redis-cluster.ts +++ b/packages/cache-handler/src/handlers/experimental-redis-cluster.ts @@ -1,11 +1,10 @@ import calculate from 'cluster-key-slot'; -import type { createCluster } from 'redis'; -import type { CacheHandlerValue, Handler } from '../cache-handler.js'; -import type { CreateRedisStringsHandlerOptions } from '../common-types.js'; - import { REVALIDATED_TAGS_KEY } from '../constants.js'; import { createRedisTimeoutConfig } from '../helpers/create-redis-timeout-config.js'; import { isTagImplicit } from '../helpers/is-tag-implicit.js'; +import type { CacheHandlerValue, Handler } from '../cache-handler.js'; +import type { CreateRedisStringsHandlerOptions } from '../common-types.js'; +import type { createCluster } from 'redis'; type CreateRedisClusterHandlerOptions> = CreateRedisStringsHandlerOptions & { @@ -21,6 +20,13 @@ type CreateRedisClusterHandlerOptions> = cluster: T; }; +/** + * Groups keys by slot. + * + * @param keys - The keys to group. + * + * @returns A map of slot to keys. + */ function groupKeysBySlot(keys: string[]): Map { const slotKeysMap: Map = new Map(); @@ -52,6 +58,18 @@ function groupKeysBySlot(keys: string[]): Map { * * @param options - The configuration options for the Redis Handler. See {@link CreateRedisClusterHandlerOptions}. * + * @param options.cluster - The Redis cluster instance. + * + * @param options.keyPrefix - The prefix to use for the Redis keys. + * + * @param options.sharedTagsKey - The key to use for the shared tags. + * + * @param options.timeoutMs - The timeout for the Redis operations. + * + * @param options.keyExpirationStrategy - The strategy to use for the key expiration. + * + * @param options.revalidateTagQuerySize - The size of the query to use for the revalidate tag. + * * @returns An object representing the cache, with methods for cache operations. * * @example @@ -81,7 +99,10 @@ export default function createHandler({ return { name: 'experimental-redis-cluster', - async get(key, { implicitTags }) { + async get( + key, + { implicitTags }, + ): Promise { const result = await cluster.get( createRedisTimeoutConfig(timeoutMs), keyPrefix + key, @@ -125,7 +146,7 @@ export default function createHandler({ return cacheValue; }, - async set(key, cacheHandlerValue) { + async set(key, cacheHandlerValue): Promise { const options = createRedisTimeoutConfig(timeoutMs); let setOperation: Promise; @@ -181,7 +202,7 @@ export default function createHandler({ await Promise.all([setOperation, expireOperation, setTagsOperation]); }, - async revalidateTag(tag) { + async revalidateTag(tag): Promise { // If the tag is an implicit tag, we need to mark it as revalidated. // The revalidation process is done by the CacheHandler class on the next get operation. if (isTagImplicit(tag)) { @@ -208,7 +229,7 @@ export default function createHandler({ ); for (const { field, value } of remoteTagsPortion.tuples) { - tagsMap.set(field, JSON.parse(value)); + tagsMap.set(field, JSON.parse(value) as string[]); } cursor = remoteTagsPortion.cursor; @@ -241,14 +262,9 @@ export default function createHandler({ continue; } - const unlinkPromisesForSlot = client.unlink( - createRedisTimeoutConfig(timeoutMs), - keys, + unlinkPromises.push( + client.unlink(createRedisTimeoutConfig(timeoutMs), keys), ); - - if (unlinkPromisesForSlot) { - unlinkPromises.push(unlinkPromisesForSlot); - } } const updateTagsOperation = cluster.hDel( @@ -259,7 +275,7 @@ export default function createHandler({ await Promise.allSettled([...unlinkPromises, updateTagsOperation]); }, - async delete(key) { + async delete(key): Promise { await cluster.unlink(createRedisTimeoutConfig(timeoutMs), key); }, }; diff --git a/packages/cache-handler/src/handlers/local-lru.ts b/packages/cache-handler/src/handlers/local-lru.ts index 2a486d86..1bc8eaa7 100644 --- a/packages/cache-handler/src/handlers/local-lru.ts +++ b/packages/cache-handler/src/handlers/local-lru.ts @@ -1,11 +1,18 @@ import { LRUCache } from 'lru-cache'; -import type { Handler } from '../cache-handler.js'; import { NEXT_CACHE_IMPLICIT_TAG_ID } from '../next-common-types.js'; -import { - type CacheHandlerValue, - CachedRouteKind, -} from '../next-common-types.js'; +import { CachedRouteKind } from '../next-common-types.js'; +import type { Handler } from '../cache-handler.js'; +import type { CacheHandlerValue } from '../next-common-types.js'; +/** + * Calculates the size of a cache item. + * + * @param cacheHandlerValue - The cache item to calculate the size of. + * + * @param cacheHandlerValue.value - The value of the cache item. + * + * @returns The size of the cache item. + */ function calculateObjectSize({ value }: CacheHandlerValue): number { // Return default size if value is falsy if (!value) { @@ -25,7 +32,7 @@ function calculateObjectSize({ value }: CacheHandlerValue): number { } case CachedRouteKind.FETCH: { // Calculate size based on the length of the stringified data - return JSON.stringify(value.data || '').length; + return JSON.stringify(value.data).length; } case CachedRouteKind.APP_ROUTE: { // Size based on the length of the body @@ -43,6 +50,13 @@ function calculateObjectSize({ value }: CacheHandlerValue): number { } } +/** + * Creates a cache store. + * + * @param options - The options for the cache store. + * + * @returns A new instance of LRUCache. + */ export function createCacheStore( options?: LruCacheOptions, ): LRUCache { @@ -88,6 +102,10 @@ const DEFAULT_OPTIONS: LruCacheOptions = { * * @param options - Optional configuration options for the cache. * + * @param options.maxItemsNumber - The maximum number of items in the cache. + * + * @param options.maxItemSizeBytes - The maximum size in bytes for each item in the cache. + * * @returns A new instance of LRUCache. */ export function createConfiguredCache( @@ -138,7 +156,7 @@ export default function createHandler({ return { name: 'local-lru', - get(key, { implicitTags }) { + get(key, { implicitTags }): Promise { const cacheValue = lruCacheStore.get(key); if (!cacheValue) { @@ -168,12 +186,12 @@ export default function createHandler({ return Promise.resolve(cacheValue); }, - set(key, cacheHandlerValue) { + set(key, cacheHandlerValue): Promise { lruCacheStore.set(key, cacheHandlerValue); return Promise.resolve(); }, - revalidateTag(tag) { + revalidateTag(tag): Promise { // Iterate over all entries in the cache for (const [key, { tags }] of lruCacheStore.entries()) { // If the value's tags include the specified tag, delete this entry @@ -188,7 +206,7 @@ export default function createHandler({ return Promise.resolve(); }, - delete(key) { + delete(key): Promise { lruCacheStore.delete(key); return Promise.resolve(); diff --git a/packages/cache-handler/src/handlers/redis-stack.ts b/packages/cache-handler/src/handlers/redis-stack.ts index f222b78e..ce1fd6a1 100644 --- a/packages/cache-handler/src/handlers/redis-stack.ts +++ b/packages/cache-handler/src/handlers/redis-stack.ts @@ -1,14 +1,13 @@ -import { ErrorReply, SchemaFieldTypes } from 'redis'; - import { randomBytes } from 'node:crypto'; +import { ErrorReply, SchemaFieldTypes } from 'redis'; +import { REVALIDATED_TAGS_KEY, TIME_ONE_YEAR } from '../constants.js'; +import { createRedisTimeoutConfig } from '../helpers/create-redis-timeout-config.js'; +import { isTagImplicit } from '../helpers/is-tag-implicit.js'; import type { CacheHandlerValue, Handler } from '../cache-handler.js'; import type { CreateRedisStackHandlerOptions, RedisJSON, } from '../common-types.js'; -import { REVALIDATED_TAGS_KEY, TIME_ONE_YEAR } from '../constants.js'; -import { createRedisTimeoutConfig } from '../helpers/create-redis-timeout-config.js'; -import { isTagImplicit } from '../helpers/is-tag-implicit.js'; export type { CreateRedisStackHandlerOptions }; @@ -21,6 +20,14 @@ export type { CreateRedisStackHandlerOptions }; * * @param options - The configuration options for the Redis Stack Handler. See {@link CreateRedisStackHandlerOptions}. * + * @param options.client - The Redis client. + * + * @param options.keyPrefix - The prefix to use for the Redis keys. + * + * @param options.timeoutMs - The timeout for the Redis operations. + * + * @param options.revalidateTagQuerySize - The size of the query to use for the revalidate tag. + * * @returns An object representing the cache, with methods for cache operations. * * @example @@ -44,18 +51,35 @@ export default function createHandler({ timeoutMs = 5000, revalidateTagQuerySize = 100, }: CreateRedisStackHandlerOptions): Handler { + /** + * Asserts that the Redis client is ready. + * + * @throws An error if the Redis client is not ready. + */ function assertClientIsReady(): void { if (!client.isReady) { throw new Error('Redis client is not ready'); } } - function sanitizeTag(str: string) { + /** + * Sanitizes a tag to be used in Redis. + * + * @param str - The tag to sanitize. + * + * @returns The sanitized tag. + */ + function sanitizeTag(str: string): string { return str.replace(/[^a-zA-Z0-9]/gi, '_'); } const indexName = `idx:tags-${randomBytes(32).toString('hex')}`; + /** + * Creates an index if it does not exist. + * + * @throws An error if the creation of the index fails but not because the index already exists. + */ async function createIndexIfNotExists(): Promise { try { await client.ft.create( @@ -84,7 +108,10 @@ export default function createHandler({ return { name: 'redis-stack', - async get(key, { implicitTags }) { + async get( + key, + { implicitTags }, + ): Promise { assertClientIsReady(); const cacheValue = (await client.json.get( @@ -129,7 +156,7 @@ export default function createHandler({ return cacheValue; }, - async set(key, cacheHandlerValue) { + async set(key, cacheHandlerValue): Promise { assertClientIsReady(); cacheHandlerValue.tags = cacheHandlerValue.tags.map(sanitizeTag); @@ -153,7 +180,7 @@ export default function createHandler({ await Promise.all([setCacheValue, expireCacheValue]); }, - async revalidateTag(tag) { + async revalidateTag(tag): Promise { assertClientIsReady(); await createIndexIfNotExists(); @@ -205,7 +232,7 @@ export default function createHandler({ await client.unlink(options, keysToDelete); }, - async delete(key) { + async delete(key): Promise { await client.unlink(createRedisTimeoutConfig(timeoutMs), key); }, }; diff --git a/packages/cache-handler/src/handlers/redis-strings.ts b/packages/cache-handler/src/handlers/redis-strings.ts index 81348f67..d04a9618 100644 --- a/packages/cache-handler/src/handlers/redis-strings.ts +++ b/packages/cache-handler/src/handlers/redis-strings.ts @@ -1,11 +1,9 @@ import superjson from 'superjson'; - -import type { CacheHandlerValue, Handler } from '../cache-handler.js'; -import type { CreateRedisStringsHandlerOptions } from '../common-types.js'; - import { REVALIDATED_TAGS_KEY } from '../constants.js'; import { createRedisTimeoutConfig } from '../helpers/create-redis-timeout-config.js'; import { isTagImplicit } from '../helpers/is-tag-implicit.js'; +import type { CacheHandlerValue, Handler } from '../cache-handler.js'; +import type { CreateRedisStringsHandlerOptions } from '../common-types.js'; export type { CreateRedisStringsHandlerOptions }; @@ -16,7 +14,19 @@ export type { CreateRedisStringsHandlerOptions }; * It supports Redis Client. The resulting Handler includes * methods to get, set, and manage cache values fot on-demand revalidation. * - * @param options - The configuration options for the Redis Handler. See {@link CreateRedisStringsHandlerOptions}. + * @param options - The configuration options for the Redis Handler. + * + * @param options.client - The Redis client. + * + * @param options.keyPrefix - The prefix to use for the Redis keys. + * + * @param options.sharedTagsKey - The key to use for the shared tags. + * + * @param options.timeoutMs - The timeout for the Redis operations. + * + * @param options.keyExpirationStrategy - The strategy to use for the key expiration. + * + * @param options.revalidateTagQuerySize - The size of the query to use for the revalidate tag. * * @returns An object representing the cache, with methods for cache operations. * @@ -44,6 +54,11 @@ export default function createHandler({ keyExpirationStrategy = 'EXPIREAT', revalidateTagQuerySize = 100, }: CreateRedisStringsHandlerOptions): Handler { + /** + * Asserts that the Redis client is ready. + * + * @throws An error if the Redis client is not ready. + */ function assertClientIsReady(): void { if (!client.isReady) { throw new Error( @@ -56,7 +71,10 @@ export default function createHandler({ return { name: 'redis-strings', - async get(key, { implicitTags }) { + async get( + key, + { implicitTags }, + ): Promise { assertClientIsReady(); const result = await client.get( @@ -102,7 +120,7 @@ export default function createHandler({ return cacheValue; }, - async set(key, cacheHandlerValue) { + async set(key, cacheHandlerValue): Promise { assertClientIsReady(); const options = createRedisTimeoutConfig(timeoutMs); @@ -160,7 +178,7 @@ export default function createHandler({ await Promise.all([setOperation, expireOperation, setTagsOperation]); }, - async revalidateTag(tag) { + async revalidateTag(tag): Promise { assertClientIsReady(); // If the tag is an implicit tag, we need to mark it as revalidated. @@ -223,7 +241,7 @@ export default function createHandler({ await Promise.all([deleteKeysOperation, updateTagsOperation]); }, - async delete(key) { + async delete(key): Promise { await client.unlink(createRedisTimeoutConfig(timeoutMs), key); }, }; diff --git a/packages/cache-handler/src/instrumentation/register-initial-cache.ts b/packages/cache-handler/src/instrumentation/register-initial-cache.ts index ce9d5274..1cf6d791 100644 --- a/packages/cache-handler/src/instrumentation/register-initial-cache.ts +++ b/packages/cache-handler/src/instrumentation/register-initial-cache.ts @@ -1,14 +1,14 @@ import { promises as fsPromises } from 'node:fs'; import path from 'node:path'; import { PRERENDER_MANIFEST, SERVER_DIRECTORY } from 'next/constants.js'; -import type { PrerenderManifest } from 'next/dist/build/index.js'; +import { PRERENDER_MANIFEST_VERSION } from '../constants.js'; +import { CachedRouteKind } from '../next-common-types.js'; import type { CacheHandlerType } from '../cache-handler.js'; -import { CachedRouteKind, type Revalidate } from '../next-common-types.js'; +import type { Revalidate } from '../next-common-types.js'; +import type { PrerenderManifest } from 'next/dist/build/index.js'; type Router = 'pages' | 'app'; -const PRERENDER_MANIFEST_VERSION = 4; - /** * Options for the `registerInitialCache` instrumentation. * @@ -35,13 +35,13 @@ export type RegisterInitialCacheOptions = { * * @param CacheHandler - The configured CacheHandler class, not an instance. * - * @param [options={}] - Options for the instrumentation. See {@link RegisterInitialCacheOptions}. + * @param [options] - Options for the instrumentation. See {@link RegisterInitialCacheOptions}. * - * @param [options.fetch=true] - Whether to populate the cache with fetch calls. + * @param [options.fetch] - Whether to populate the cache with fetch calls. * - * @param [options.pages=true] - Whether to populate the cache with pre-rendered pages. + * @param [options.pages] - Whether to populate the cache with pre-rendered pages. * - * @param [options.routes=true] - Whether to populate the cache with routes. + * @param [options.routes] - Whether to populate the cache with routes. * * @example file: `instrumentation.ts` * @@ -63,7 +63,7 @@ export type RegisterInitialCacheOptions = { export async function registerInitialCache( CacheHandler: CacheHandlerType, options: RegisterInitialCacheOptions = {}, -) { +): Promise { const debug = typeof process.env.NEXT_PRIVATE_DEBUG_CACHE !== 'undefined'; const nextJsPath = path.join(process.cwd(), '.next'); const prerenderManifestPath = path.join(nextJsPath, PRERENDER_MANIFEST); @@ -91,7 +91,7 @@ export async function registerInitialCache( '[CacheHandler] [%s] %s %s', 'registerInitialCache', 'Failed to read prerender manifest', - `Error: ${error}`, + `Error: ${error as Error}`, ); } @@ -115,18 +115,27 @@ export async function registerInitialCache( '[CacheHandler] [%s] %s %s', 'registerInitialCache', 'Failed to create CacheHandler instance', - `Error: ${error}`, + `Error: ${error as Error}`, ); } return; } + /** + * Sets the page cache. + * + * @param cachePath - The path to the page cache. + * + * @param router - The router to set the page cache for. + * + * @param revalidate - The revalidate time for the page cache. + */ async function setPageCache( cachePath: string, router: Router, revalidate: Revalidate, - ) { + ): Promise { const pathToRouteFiles = path.join(serverDistDir, router, cachePath); let lastModified: number | undefined; @@ -140,7 +149,7 @@ export async function registerInitialCache( '[CacheHandler] [%s] %s %s', 'registerInitialCache', 'Failed to read page html file', - `Error: ${error}`, + `Error: ${error as Error}`, ); } return; @@ -162,7 +171,7 @@ export async function registerInitialCache( '[CacheHandler] [%s] %s %s', 'registerInitialCache', 'Failed to read page html, page data, or metadata file, or parse metadata', - `Error: ${error}`, + `Error: ${error as Error}`, ); } @@ -191,7 +200,7 @@ export async function registerInitialCache( '[CacheHandler] [%s] %s %s', 'registerInitialCache', 'Failed to set page cache. Please check if the CacheHandler is configured correctly', - `Error: ${error}`, + `Error: ${error as Error}`, ); } diff --git a/packages/cache-handler/src/next-common-types.ts b/packages/cache-handler/src/next-common-types.ts index dda4b7e6..57d2cec4 100644 --- a/packages/cache-handler/src/next-common-types.ts +++ b/packages/cache-handler/src/next-common-types.ts @@ -1,4 +1,3 @@ -import type { OutgoingHttpHeaders } from 'node:http'; import type { CacheHandler, CacheHandlerContext, @@ -8,6 +7,7 @@ import type { CachedRouteKind, IncrementalCacheValue, } from 'next/dist/server/response-cache/types.js'; +import type { OutgoingHttpHeaders } from 'node:http'; export type { PrerenderManifest } from 'next/dist/build/index.js'; export type { CacheHandler } from 'next/dist/server/lib/incremental-cache/index.js'; diff --git a/packages/cache-handler/src/use-cache-cache.ts b/packages/cache-handler/src/use-cache-cache.ts index 87bd68da..ae280e3a 100644 --- a/packages/cache-handler/src/use-cache-cache.ts +++ b/packages/cache-handler/src/use-cache-cache.ts @@ -1,12 +1,12 @@ +import { + isStale, + tagsManifest, +} from 'next/dist/server/lib/incremental-cache/tags-manifest.external.js'; import type { CacheEntry, CacheHandlerV2, Timestamp, } from 'next/dist/server/lib/cache-handlers/types.js'; -import { - isStale, - tagsManifest, -} from 'next/dist/server/lib/incremental-cache/tags-manifest.external.js'; export type SerializedCacheEntry = Omit & { value: string; @@ -30,12 +30,25 @@ export type RemoteStore = { getExpirationTimestamps(tags: string[]): Promise; expireTags(expiredTags: Map): Promise; }; -export async function createCacheHandler( + +/** + * Creates a cache handler that uses a remote store to store and retrieve cache entries. + * This cache handler is used for 'use cache' in Next.js. + * + * @param remoteStorePromise - A promise that resolves to a remote store. + * + * @returns A cache handler that uses the remote store to store and retrieve cache entries. + */ +export function createCacheHandler( remoteStorePromise: Promise, -) { +): CacheHandlerV2 { const cacheHandler: CacheHandlerV2 = { async get(cacheKey) { - await pendingSets.get(cacheKey); + const pendingPromise = pendingSets.get(cacheKey); + + if (pendingPromise) { + await pendingPromise; + } try { const remoteStore = await remoteStorePromise; @@ -47,7 +60,7 @@ export async function createCacheHandler( return undefined; } - const entry: SerializedCacheEntry = JSON.parse(serializedEntry); + const entry = JSON.parse(serializedEntry) as SerializedCacheEntry; const now = performance.timeOrigin + performance.now(); @@ -66,7 +79,7 @@ export async function createCacheHandler( tags: entry.tags, timestamp: entry.timestamp, value: new ReadableStream({ - start(controller) { + start(controller): void { controller.enqueue(Buffer.from(entry.value, 'base64')); controller.close(); }, diff --git a/packages/cache-handler/src/use-cache/node-redis.ts b/packages/cache-handler/src/use-cache/node-redis.ts index c649b7f4..81c2e837 100644 --- a/packages/cache-handler/src/use-cache/node-redis.ts +++ b/packages/cache-handler/src/use-cache/node-redis.ts @@ -1,8 +1,9 @@ import { randomUUID } from 'node:crypto'; import { tagsManifest } from 'next/dist/server/lib/incremental-cache/tags-manifest.external.js'; -import type { createClient } from 'redis'; import { createRedisTimeoutConfig } from '../helpers/create-redis-timeout-config.js'; -import { type RemoteStore, createCacheHandler } from '../use-cache-cache.js'; +import { createCacheHandler } from '../use-cache-cache.js'; +import type { CacheHandlerV2, RemoteStore } from '../use-cache-cache.js'; +import type { createClient } from 'redis'; export type Config> = { client: T; @@ -19,19 +20,40 @@ type Message = { subClientId: string; }; +/** + * Creates a remote store that uses Redis to store and retrieve cache entries. + * + * @param config - The configuration for the remote store. + * + * @param config.client - The Redis client. + * + * @param config.pubClient - The Redis publish client. + * + * @param config.channel - The channel to use for the Redis pub/sub. + * + * @param config.subClientId - The ID of the Redis subscriber client. + * + * @param config.keyPrefix - The prefix to use for the Redis keys. + * + * @param config.timeoutMs - The timeout for the Redis operations. + * + * @param config.expireTrigger - The trigger for the Redis expiration. + * + * @returns A remote store that uses Redis to store and retrieve cache entries. + */ function createRedisStore>({ client, pubClient, channel, subClientId, - keyPrefix, + keyPrefix = '', timeoutMs = 5000, expireTrigger = 'stale', }: Config): RemoteStore { - const getKey = (key: string) => `${keyPrefix}${key}`; + const getKey = (key: string): string => `${keyPrefix}${key}`; return { - async get(key) { + async get(key): Promise { if (!client.isReady) { return; } @@ -40,7 +62,7 @@ function createRedisStore>({ return (await client.get(options, getKey(key))) ?? undefined; }, - async set(key, value, { expire, timestamp, stale }) { + async set(key, value, { expire, timestamp, stale }): Promise { if (!client.isReady) { return; } @@ -56,7 +78,7 @@ function createRedisStore>({ EXAT: expireAt, }); }, - async expireTags(expiredTags) { + async expireTags(expiredTags): Promise { if (!pubClient.isReady) { return; } @@ -69,18 +91,31 @@ function createRedisStore>({ } satisfies Message), ); }, - getExpirationTimestamps() { + getExpirationTimestamps(): Promise { return Promise.resolve([0]); }, - async refreshTags() { + async refreshTags(): Promise { // must be empty when using pub/sub }, }; } +/** + * Creates a cache handler that uses Redis to store and retrieve cache entries. + * + * @param config - The configuration for the cache handler. + * + * @param config.client - The Redis client. + * + * @param config.keyPrefix - The prefix to use for the Redis keys. + * + * @param config.timeoutMs - The timeout for the Redis operations. + * + * @returns A cache handler that uses Redis to store and retrieve cache entries. + */ export function createRedisCacheHandler< T extends ReturnType, ->({ client, keyPrefix, timeoutMs }: Config) { +>({ client, keyPrefix, timeoutMs }: Config): CacheHandlerV2 { const remoteStore = Promise.all([ client.connect(), client.duplicate().connect(), @@ -88,7 +123,9 @@ export function createRedisCacheHandler< ]) .then(async ([mainClient, pubClient, subClient]) => { const subClientId = randomUUID(); - const channel = `${keyPrefix}__revalidate_channel__`; + const channel = keyPrefix + ? `${keyPrefix}__revalidate_channel__` + : '__revalidate_channel__'; await subClient.subscribe(channel, (message) => { const { expiredTags, subClientId: messageSubClientId } = JSON.parse( diff --git a/packages/cache-handler/src/use-cache/redis.ts b/packages/cache-handler/src/use-cache/redis.ts deleted file mode 100644 index 7cc39fee..00000000 --- a/packages/cache-handler/src/use-cache/redis.ts +++ /dev/null @@ -1,231 +0,0 @@ -import type { - CacheEntry, - CacheHandlerV2, -} from 'next/dist/server/lib/cache-handlers/types.js'; -import { - isStale, - tagsManifest, -} from 'next/dist/server/lib/incremental-cache/tags-manifest.external.js'; - -import { type RedisClientOptions, createClient } from 'redis'; - -type RedisConfig = { - url?: string; - keyPrefix?: string; - clientOptions?: RedisClientOptions; - tagsScanSize?: number; -}; - -const DEFAULT_CONFIG: RedisConfig = { - url: 'redis://localhost:6379', - keyPrefix: 'neshca:', - tagsScanSize: 10, -}; - -const TAGS_MANIFEST_KEY = 'tagsManifest'; - -type StorageCacheEntry = Omit & { - value: string; -}; - -const pendingSets = new Map>(); - -function createRedisCacheHandler(config: RedisConfig = {}) { - const mergedConfig = { ...DEFAULT_CONFIG, ...config }; - const { url, keyPrefix, clientOptions, tagsScanSize } = mergedConfig; - - const redisConnection = createClient({ - url, - ...clientOptions, - }); - - const connectionPromise: Promise> = - redisConnection.connect().then((client) => { - return client; - }); - - const getKey = (key: string) => `${keyPrefix}${key}`; - - const TAGS_KEY = getKey(TAGS_MANIFEST_KEY); - - async function refreshTagsFromRemote() { - try { - const redisClient = await connectionPromise; - - if (!redisClient?.isReady) { - return; - } - - let cursor = 0; - - const hScanOptions = { COUNT: tagsScanSize }; - - do { - const remoteTagsPortion = await redisClient.hScan( - TAGS_KEY, - cursor, - hScanOptions, - ); - - for (const { - field: tag, - value: timestampStr, - } of remoteTagsPortion.tuples) { - try { - const timestamp = Number.parseInt(timestampStr, 10); - - if (!Number.isNaN(timestamp)) { - tagsManifest.set(tag, timestamp); - } - } catch (err) { - console.error(`Failed to parse tag timestamp for ${tag}:`, err); - } - } - - cursor = remoteTagsPortion.cursor; - } while (cursor !== 0); - } catch (error) { - console.error('Failed to load tags from Redis:', error); - } - } - - const DefaultCacheHandler: CacheHandlerV2 = { - async get(cacheKey) { - await pendingSets.get(cacheKey); - - const redisClient = await connectionPromise; - - if (!redisClient?.isReady) { - return undefined; - } - - try { - const privateEntryJson = await redisClient.get(getKey(cacheKey)); - - if (!privateEntryJson) { - return undefined; - } - - const entry: StorageCacheEntry = JSON.parse(privateEntryJson); - const now = performance.timeOrigin + performance.now(); - - if (now > entry.timestamp + entry.revalidate * 1000) { - return undefined; - } - - if (isStale(entry.tags, entry.timestamp)) { - return undefined; - } - - const cacheEntry: CacheEntry = { - expire: entry.expire, - revalidate: entry.revalidate, - stale: entry.stale, - tags: entry.tags, - timestamp: entry.timestamp, - value: new ReadableStream({ - start(controller) { - controller.enqueue(Buffer.from(entry.value, 'base64')); - controller.close(); - }, - }), - }; - - return cacheEntry; - } catch (error) { - console.error('Error retrieving cache entry:', error); - return undefined; - } - }, - - async set(cacheKey, pendingEntry) { - const { resolve: resolvePending, promise: pendingPromise } = - Promise.withResolvers(); - - pendingSets.set(cacheKey, pendingPromise); - - const redisClient = await connectionPromise; - - if (!redisClient?.isReady) { - resolvePending(); - pendingSets.delete(cacheKey); - return; - } - - try { - const entry = await pendingEntry; - - try { - const [value, clonedValue] = entry.value.tee(); - entry.value = value; - - const chunks: Uint8Array[] = []; - - for await (const chunk of clonedValue) { - chunks.push(chunk); - } - - const storageEntry: StorageCacheEntry = { - expire: entry.expire, - revalidate: entry.revalidate, - stale: entry.stale, - tags: entry.tags, - timestamp: entry.timestamp, - value: Buffer.concat(chunks).toString('base64'), - }; - - await redisClient.set( - getKey(cacheKey), - JSON.stringify(storageEntry), - { - EXAT: Math.floor(entry.timestamp / 1000 + entry.expire), - }, - ); - } catch (error) { - console.error('Error setting cache entry:', error); - } finally { - resolvePending(); - pendingSets.delete(cacheKey); - } - } catch (_error) { - resolvePending(); - pendingSets.delete(cacheKey); - } - }, - async refreshTags() { - await refreshTagsFromRemote(); - }, - async getExpiration(...tags) { - return Math.max(...tags.map((tag) => tagsManifest.get(tag) ?? 0)); - }, - async expireTags(...tags) { - if (tags.length === 0) { - return; - } - - const timestamp = performance.timeOrigin + performance.now(); - - for (const tag of tags) { - tagsManifest.set(tag, timestamp); - } - - const redisClient = await connectionPromise; - - if (!redisClient?.isReady) { - return; - } - - try { - await redisClient.hSet(TAGS_KEY, Object.fromEntries(tagsManifest)); - } catch (error) { - console.error('Failed to expire tags:', error); - } - }, - }; - - return DefaultCacheHandler; -} - -export default createRedisCacheHandler(); - -export { createRedisCacheHandler }; diff --git a/packages/cache-handler/src/utils/compose-age-estimation-fn.ts b/packages/cache-handler/src/utils/compose-age-estimation-fn.ts index 13066885..f7da4bf7 100644 --- a/packages/cache-handler/src/utils/compose-age-estimation-fn.ts +++ b/packages/cache-handler/src/utils/compose-age-estimation-fn.ts @@ -27,7 +27,9 @@ export function getInitialExpireAge(staleAge: number): number { * 3. Floored to the nearest integer * * @param callback - A function that calculates expire age from stale age + * * @returns A validated function that safely converts stale age to expire age + * * @throws Assertion error if the calculated expire age is not a positive integer * * @example diff --git a/packages/cache-handler/test/tsconfig.json b/packages/cache-handler/test/tsconfig.json deleted file mode 100644 index 376c1a83..00000000 --- a/packages/cache-handler/test/tsconfig.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "$schema": "https://json.schemastore.org/tsconfig", - "extends": "@repo/typescript-config/test.json", - "include": ["**/*.test.ts", "**/*.spec.ts"] -} diff --git a/packages/cache-handler/test/utils/compose-age-estimation-fn.test.ts b/packages/cache-handler/test/utils/compose-age-estimation-fn.test.ts index c49ac29a..e83f838d 100644 --- a/packages/cache-handler/test/utils/compose-age-estimation-fn.test.ts +++ b/packages/cache-handler/test/utils/compose-age-estimation-fn.test.ts @@ -8,72 +8,102 @@ import { describe('composeAgeEstimationFn', () => { describe('valid inputs', () => { it('returns the same age for simple callback', () => { + expect.hasAssertions(); + const estimateAge = composeAgeEstimationFn((age) => age); const testAge = 100; + // The estimated age should be the same as the input age expect(estimateAge(testAge)).toBe(testAge); }); it('handles float by flooring', () => { + expect.hasAssertions(); + const estimateAge = composeAgeEstimationFn((age) => age + 0.9); const testAge = 100; + // The estimated age should be floored to the nearest integer expect(estimateAge(testAge)).toBe(100); }); it('handles numbers bigger than MAX_INT32 by returning MAX_INT32', () => { + expect.hasAssertions(); + const estimateAge = composeAgeEstimationFn((age) => age + MAX_INT32); + // The estimated age should return MAX_INT32 for numbers bigger than MAX_INT32 expect(estimateAge(100)).toBe(MAX_INT32); }); it('handles MAX_INT32 correctly', () => { + expect.hasAssertions(); + const estimateAge = composeAgeEstimationFn((_age) => MAX_INT32); + // The estimated age should handle MAX_INT32 correctly expect(estimateAge(0)).toBe(MAX_INT32); }); it('handles value just below MAX_INT32', () => { + expect.hasAssertions(); + const estimateAge = composeAgeEstimationFn((_age) => MAX_INT32 - 1); + expect(estimateAge(0)).toBe(MAX_INT32 - 1); }); it('handles Infinity by capping at MAX_INT32', () => { + expect.hasAssertions(); + const estimateAge = composeAgeEstimationFn( (_age) => Number.POSITIVE_INFINITY, ); + expect(estimateAge(100)).toBe(MAX_INT32); }); it('uses default callback when none provided', () => { + expect.hasAssertions(); + const estimateAge = composeAgeEstimationFn(); + // Default multiplies by 1.5 and floors expect(estimateAge(100)).toBe(150); expect(estimateAge(101)).toBe(151); }); it('default callback handles numbers close to MAX_INT32', () => { + expect.hasAssertions(); + // Test the getInitialExpireAge function directly expect(getInitialExpireAge(MAX_INT32 / 1.5 - 1)).toBeLessThan(MAX_INT32); // Test through composeAgeEstimationFn const estimateAge = composeAgeEstimationFn(); const largeStaleAge = Math.floor(MAX_INT32 / 1.5) - 1; + expect(estimateAge(largeStaleAge)).toBe(Math.floor(largeStaleAge * 1.5)); }); }); describe('invalid inputs', () => { it('throws error for negative age', () => { + expect.hasAssertions(); + const estimateAge = composeAgeEstimationFn((age) => age); const testAge = -1; + expect(() => estimateAge(testAge)).toThrow( 'The expire age must be a positive integer but got a -1.', ); }); it('throws error for non-integer', () => { + expect.hasAssertions(); + const estimateAge = composeAgeEstimationFn((age) => age + Number.NaN); + expect(() => estimateAge(10)).toThrow( 'The expire age must be a positive integer but got a NaN.', ); @@ -81,6 +111,7 @@ describe('composeAgeEstimationFn', () => { it('throws error for zero', () => { const estimateAge = composeAgeEstimationFn((age) => age * 0); + expect(() => estimateAge(10)).toThrow( 'The expire age must be a positive integer but got a 0.', ); @@ -90,6 +121,7 @@ describe('composeAgeEstimationFn', () => { const estimateAge = composeAgeEstimationFn( (_age) => 'non-numeric' as unknown as number, ); + expect(() => estimateAge(10)).toThrow( 'The expire age must be a positive integer but got a NaN.', ); @@ -99,6 +131,7 @@ describe('composeAgeEstimationFn', () => { const estimateAge = composeAgeEstimationFn(() => { throw new Error('Test error'); }); + expect(() => estimateAge(10)).toThrow('Test error'); }); @@ -106,6 +139,7 @@ describe('composeAgeEstimationFn', () => { const estimateAge = composeAgeEstimationFn( (_age) => Number.NEGATIVE_INFINITY, ); + expect(() => estimateAge(10)).toThrow( 'The expire age must be a positive integer but got a -Infinity.', ); diff --git a/packages/cache-handler/tsconfig.build.json b/packages/cache-handler/tsconfig.build.json new file mode 100644 index 00000000..b651aea5 --- /dev/null +++ b/packages/cache-handler/tsconfig.build.json @@ -0,0 +1,9 @@ +{ + "$schema": "https://json.schemastore.org/tsconfig", + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": "dist", + "rootDir": "src" + }, + "include": ["src/**/*.ts"] +} diff --git a/packages/cache-handler/tsconfig.json b/packages/cache-handler/tsconfig.json index 23ce6f47..cb806e85 100644 --- a/packages/cache-handler/tsconfig.json +++ b/packages/cache-handler/tsconfig.json @@ -2,9 +2,9 @@ "$schema": "https://json.schemastore.org/tsconfig", "extends": "@repo/typescript-config/lib.json", "compilerOptions": { - "outDir": "dist", - "rootDir": "src" + "rootDir": ".", + "erasableSyntaxOnly": true }, "include": ["**/*.ts"], - "exclude": ["node_modules", "dist", "test", "vitest.config.ts"] + "exclude": ["node_modules", "dist"] } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index cc7c27e3..eec0bf9a 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -8,9 +8,6 @@ importers: .: devDependencies: - '@biomejs/biome': - specifier: 1.9.4 - version: 1.9.4 '@changesets/cli': specifier: 2.28.1 version: 2.28.1 @@ -36,8 +33,8 @@ importers: specifier: 1.8.4 version: 1.8.4 next: - specifier: 15.3.0-canary.14 - version: 15.3.0-canary.14(@playwright/test@1.51.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + specifier: 15.3.0-canary.16 + version: 15.3.0-canary.16(@playwright/test@1.51.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) react: specifier: 19.0.0 version: 19.0.0 @@ -88,14 +85,14 @@ importers: docs/cache-handler-docs: dependencies: next: - specifier: 15.3.0-canary.14 - version: 15.3.0-canary.14(@playwright/test@1.51.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + specifier: 15.3.0-canary.16 + version: 15.3.0-canary.16(@playwright/test@1.51.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) nextra: - specifier: 4.2.16 - version: 4.2.16(acorn@8.14.1)(next@15.3.0-canary.14(@playwright/test@1.51.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.8.2) + specifier: 4.2.17 + version: 4.2.17(acorn@8.14.1)(next@15.3.0-canary.16(@playwright/test@1.51.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.8.2) nextra-theme-docs: - specifier: 4.2.16 - version: 4.2.16(@types/react@19.0.12)(next@15.3.0-canary.14(@playwright/test@1.51.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(nextra@4.2.16(acorn@8.14.1)(next@15.3.0-canary.14(@playwright/test@1.51.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.8.2))(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + specifier: 4.2.17 + version: 4.2.17(@types/react@19.0.12)(next@15.3.0-canary.16(@playwright/test@1.51.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(nextra@4.2.17(acorn@8.14.1)(next@15.3.0-canary.16(@playwright/test@1.51.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.8.2))(react-dom@19.0.0(react@19.0.0))(react@19.0.0) react: specifier: 19.0.0 version: 19.0.0 @@ -162,14 +159,38 @@ importers: specifier: 9.22.0 version: 9.22.0 '@next/eslint-plugin-next': - specifier: 15.3.0-canary.14 - version: 15.3.0-canary.14 + specifier: 15.3.0-canary.16 + version: 15.3.0-canary.16 + '@typescript-eslint/parser': + specifier: 8.27.0 + version: 8.27.0(eslint@9.22.0)(typescript@5.8.2) + '@vitest/eslint-plugin': + specifier: 1.1.38 + version: 1.1.38(@typescript-eslint/utils@8.27.0(eslint@9.22.0)(typescript@5.8.2))(eslint@9.22.0)(typescript@5.8.2)(vitest@3.0.9(@types/debug@4.1.12)(@types/node@22.13.10)(tsx@4.19.3)(yaml@2.7.0)) eslint: specifier: 9.22.0 version: 9.22.0 eslint-config-prettier: specifier: 10.1.1 version: 10.1.1(eslint@9.22.0) + eslint-import-resolver-typescript: + specifier: 4.2.2 + version: 4.2.2(eslint-plugin-import-x@4.9.1(eslint@9.22.0)(typescript@5.8.2))(eslint@9.22.0) + eslint-plugin-check-file: + specifier: 3.1.0 + version: 3.1.0(eslint@9.22.0) + eslint-plugin-import-x: + specifier: 4.9.1 + version: 4.9.1(eslint@9.22.0)(typescript@5.8.2) + eslint-plugin-jsdoc: + specifier: 50.6.8 + version: 50.6.8(eslint@9.22.0) + eslint-plugin-mdx: + specifier: 3.2.0 + version: 3.2.0(eslint@9.22.0) + eslint-plugin-only-warn: + specifier: 1.1.0 + version: 1.1.0 eslint-plugin-react: specifier: 7.37.4 version: 7.37.4(eslint@9.22.0) @@ -206,15 +227,21 @@ importers: specifier: ^2.2.2 version: 2.2.2 devDependencies: + '@repo/eslint-config': + specifier: workspace:* + version: link:../../internal/eslint-config '@repo/typescript-config': specifier: workspace:* version: link:../../internal/typescript-config '@types/node': specifier: 22.13.10 version: 22.13.10 + eslint: + specifier: 9.22.0 + version: 9.22.0 next: - specifier: 15.3.0-canary.14 - version: 15.3.0-canary.14(@playwright/test@1.51.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + specifier: 15.3.0-canary.16 + version: 15.3.0-canary.16(@playwright/test@1.51.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) tsx: specifier: 4.19.3 version: 4.19.3 @@ -233,62 +260,17 @@ packages: '@antfu/utils@8.1.1': resolution: {integrity: sha512-Mex9nXf9vR6AhcXmMrlz/HVgYYZpVGJ6YlPgwl7UnaFpnshXs6EK/oa5Gpf3CzENMjkvEx2tQtntGnb7UtSTOQ==} - '@babel/runtime@7.26.10': - resolution: {integrity: sha512-2WJMeRQPHKSPemqk/awGrAiuFfzBmOIPXKizAsVhWH9YJqLZ0H+HS4c8loHGgW6utJ3E/ejXQUsiGaQy2NZ9Fw==} + '@babel/code-frame@7.26.2': + resolution: {integrity: sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==} engines: {node: '>=6.9.0'} - '@biomejs/biome@1.9.4': - resolution: {integrity: sha512-1rkd7G70+o9KkTn5KLmDYXihGoTaIGO9PIIN2ZB7UJxFrWw04CZHPYiMRjYsaDvVV7hP1dYNRLxSANLaBFGpog==} - engines: {node: '>=14.21.3'} - hasBin: true - - '@biomejs/cli-darwin-arm64@1.9.4': - resolution: {integrity: sha512-bFBsPWrNvkdKrNCYeAp+xo2HecOGPAy9WyNyB/jKnnedgzl4W4Hb9ZMzYNbf8dMCGmUdSavlYHiR01QaYR58cw==} - engines: {node: '>=14.21.3'} - cpu: [arm64] - os: [darwin] - - '@biomejs/cli-darwin-x64@1.9.4': - resolution: {integrity: sha512-ngYBh/+bEedqkSevPVhLP4QfVPCpb+4BBe2p7Xs32dBgs7rh9nY2AIYUL6BgLw1JVXV8GlpKmb/hNiuIxfPfZg==} - engines: {node: '>=14.21.3'} - cpu: [x64] - os: [darwin] - - '@biomejs/cli-linux-arm64-musl@1.9.4': - resolution: {integrity: sha512-v665Ct9WCRjGa8+kTr0CzApU0+XXtRgwmzIf1SeKSGAv+2scAlW6JR5PMFo6FzqqZ64Po79cKODKf3/AAmECqA==} - engines: {node: '>=14.21.3'} - cpu: [arm64] - os: [linux] - - '@biomejs/cli-linux-arm64@1.9.4': - resolution: {integrity: sha512-fJIW0+LYujdjUgJJuwesP4EjIBl/N/TcOX3IvIHJQNsAqvV2CHIogsmA94BPG6jZATS4Hi+xv4SkBBQSt1N4/g==} - engines: {node: '>=14.21.3'} - cpu: [arm64] - os: [linux] - - '@biomejs/cli-linux-x64-musl@1.9.4': - resolution: {integrity: sha512-gEhi/jSBhZ2m6wjV530Yy8+fNqG8PAinM3oV7CyO+6c3CEh16Eizm21uHVsyVBEB6RIM8JHIl6AGYCv6Q6Q9Tg==} - engines: {node: '>=14.21.3'} - cpu: [x64] - os: [linux] - - '@biomejs/cli-linux-x64@1.9.4': - resolution: {integrity: sha512-lRCJv/Vi3Vlwmbd6K+oQ0KhLHMAysN8lXoCI7XeHlxaajk06u7G+UsFSO01NAs5iYuWKmVZjmiOzJ0OJmGsMwg==} - engines: {node: '>=14.21.3'} - cpu: [x64] - os: [linux] - - '@biomejs/cli-win32-arm64@1.9.4': - resolution: {integrity: sha512-tlbhLk+WXZmgwoIKwHIHEBZUwxml7bRJgk0X2sPyNR3S93cdRq6XulAZRQJ17FYGGzWne0fgrXBKpl7l4M87Hg==} - engines: {node: '>=14.21.3'} - cpu: [arm64] - os: [win32] + '@babel/helper-validator-identifier@7.25.9': + resolution: {integrity: sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==} + engines: {node: '>=6.9.0'} - '@biomejs/cli-win32-x64@1.9.4': - resolution: {integrity: sha512-8Y5wMhVIPaWe6jw2H+KlEm4wP/f7EW3810ZLmDlrEEy5KvBsb9ECEfu/kMWD484ijfQ8+nIi0giMgu9g1UAuuA==} - engines: {node: '>=14.21.3'} - cpu: [x64] - os: [win32] + '@babel/runtime@7.26.10': + resolution: {integrity: sha512-2WJMeRQPHKSPemqk/awGrAiuFfzBmOIPXKizAsVhWH9YJqLZ0H+HS4c8loHGgW6utJ3E/ejXQUsiGaQy2NZ9Fw==} + engines: {node: '>=6.9.0'} '@braintree/sanitize-url@7.1.1': resolution: {integrity: sha512-i1L7noDNxtFyL5DmZafWy1wRVhGehQmzZaz1HiN5e7iylJMSZR7ekOV7NsIqa5qBldlLrsKv4HbgFUVlQrz8Mw==} @@ -363,9 +345,19 @@ packages: '@chevrotain/utils@11.0.3': resolution: {integrity: sha512-YslZMgtJUyuMbZ+aKvfF3x1f5liK4mWNxghFRv7jqRR9C3R3fAOGTTKvxXDa2Y1s9zSbcpuO0cAxDYsc9SrXoQ==} + '@emnapi/core@1.3.1': + resolution: {integrity: sha512-pVGjBIt1Y6gg3EJN8jTcfpP/+uuRksIo055oE/OBkDNcjZqVbfkWCksG1Jp4yZnj3iKWyWX8fdG/j6UDYPbFog==} + '@emnapi/runtime@1.3.1': resolution: {integrity: sha512-kEBmG8KyqtxJZv+ygbEim+KCGtIq1fC22Ms3S4ziXmYKm8uyoLX0MHONVKwp+9opg390VaKRNt4a7A9NwmpNhw==} + '@emnapi/wasi-threads@1.0.1': + resolution: {integrity: sha512-iIBu7mwkq4UQGeMEM8bLwNK962nXdhodeScX4slfQnRhEMMzvYivHhutCIk8uojvmASXXPC2WNEjwxFWk72Oqw==} + + '@es-joy/jsdoccomment@0.49.0': + resolution: {integrity: sha512-xjZTSFgECpb9Ohuk5yMX5RhUEbfeQcuOp8IF60e+wyzWEF0M5xeSgqsfLtvPEX8BIyOX9saZqzuGPmZ8oWc+5Q==} + engines: {node: '>=16'} + '@esbuild/aix-ppc64@0.25.1': resolution: {integrity: sha512-kfYGy8IdzTGy+z0vFGvExZtxkFlA4zAxgKEahG9KE1ScBjpQnFsNOX8KTU5ojNru5ed5CVoJYXFtoxaq5nFbjQ==} engines: {node: '>=18'} @@ -734,6 +726,10 @@ packages: cpu: [x64] os: [win32] + '@isaacs/cliui@8.0.2': + resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} + engines: {node: '>=12'} + '@jridgewell/sourcemap-codec@1.5.0': resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} @@ -837,56 +833,59 @@ packages: resolution: {integrity: sha512-jMxvwzkKzd3cXo2EB9GM2ic0eYo2rP/BS6gJt6HnWbsDO1O8GSD4k7o2Cpr2YERtMpGF/MGcDfsfj2EbQPtrXw==} engines: {node: '>= 10'} - '@next/env@15.3.0-canary.14': - resolution: {integrity: sha512-wYQx9YYFuPUNtQP839fW7bPPMb7KF1q0DFO9COqsy441OyiXHyVs0BnsnhULSVpSs3FSsfRglPXFpxkVxQiq2w==} + '@napi-rs/wasm-runtime@0.2.7': + resolution: {integrity: sha512-5yximcFK5FNompXfJFoWanu5l8v1hNGqNHh9du1xETp9HWk/B/PzvchX55WYOPaIeNglG8++68AAiauBAtbnzw==} - '@next/eslint-plugin-next@15.3.0-canary.14': - resolution: {integrity: sha512-HnsmgLET9Gy2dEzscTIQvpX0EdOZ/v/XDusv2UdCGp/mxTZn0FFox41gtQVyWtfi9qhKtazrrcXl+gas/XbFwQ==} + '@next/env@15.3.0-canary.16': + resolution: {integrity: sha512-/0zjOXv7h+5vhts1DMxqiH8k0zoGgmv5cJTEmkM0UZUtHYSrODLsCqax8rDBGpKtdUZ/2hLAaFafq2r91jgpAg==} - '@next/swc-darwin-arm64@15.3.0-canary.14': - resolution: {integrity: sha512-23MqQNFQ1ljHZ6+onzltjDEmNXgMoXdTIOMnxpOdE4p8F45ODU2g+k0Vl4ypPwAfgqd8Ni6aI9jG7RJfubvkrg==} + '@next/eslint-plugin-next@15.3.0-canary.16': + resolution: {integrity: sha512-lJt5bvb4YpWOX2gtTEX5yi5IHPDdRItGSdFcI7gZj+rjonv63etWBZZZ4oy6kYLBIdpLPcXBGCjlbRlMrzk7fg==} + + '@next/swc-darwin-arm64@15.3.0-canary.16': + resolution: {integrity: sha512-DAXsgvmaBQ+mBHtf78OqJugQJfAa4q7ApukIJw3X+Jk0XyRiOzi1lWj+GA4BjYdvKx5DoXPn7x9avWau9DW/mw==} engines: {node: '>= 10'} cpu: [arm64] os: [darwin] - '@next/swc-darwin-x64@15.3.0-canary.14': - resolution: {integrity: sha512-qFIbXnnjKqo3J5H3DhIMupmuxsf2nbwC+Kex42VVss9aCMn0Ap7zwZd/J54RIgC/gZJtP0KCqUY663xa0m/lBQ==} + '@next/swc-darwin-x64@15.3.0-canary.16': + resolution: {integrity: sha512-gs3wA8nixwddKvjQuUh8Ofgey+NDXyckV9B/XY/rG7tvXkphlsvh3gIiaGxPZ9CCaw65dY1umXceuQg9GRFP8Q==} engines: {node: '>= 10'} cpu: [x64] os: [darwin] - '@next/swc-linux-arm64-gnu@15.3.0-canary.14': - resolution: {integrity: sha512-rpC12NgJ29z8iU4s6yl6AYsMcAiuDuzMljkTnAyUuRg/ehhlDoNMseidTldAofsnbp+K0NRNDujRHc+fgjeRAA==} + '@next/swc-linux-arm64-gnu@15.3.0-canary.16': + resolution: {integrity: sha512-mjpULvzvhn2h3q4KOfX5w7jYmfrmJESlfNW8QsadDHTPbPnDJ42NSX/4LhdKVP9zULV6Mg9aEBHm5FkT4vXREA==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - '@next/swc-linux-arm64-musl@15.3.0-canary.14': - resolution: {integrity: sha512-I1+JUYW3R9pWP2taLJABCaYXG6RybDHv8K1La9/7RGDRciPNu3RukjoFGL4/1SbzqjgIg/rkBuN4/mJ6XwwquA==} + '@next/swc-linux-arm64-musl@15.3.0-canary.16': + resolution: {integrity: sha512-hRTdOY7RAnkY3/q2tgrrYCcblNm6I1osoBB0SxeLRpHLJERelUXfYPgcUllB8EWbfAiIaXEtCyxm0FiuMa8WiA==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - '@next/swc-linux-x64-gnu@15.3.0-canary.14': - resolution: {integrity: sha512-JiqCXhIQdMnUa+Mc3G7Ed3r9AqnLlzKO2XcGgmm/zmAzIIxU3EVn0mD830B+h4zhq9FyQDKmvj9ZZkKRVfc26w==} + '@next/swc-linux-x64-gnu@15.3.0-canary.16': + resolution: {integrity: sha512-vbhe6OL1BPuMTnDkRaXM5y32vdzW262N0EazKrqrJ56acuqOBNjgBAwsMJqQMcCRiXPrcvJAtzJOunFb897BXw==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - '@next/swc-linux-x64-musl@15.3.0-canary.14': - resolution: {integrity: sha512-M+4zHSgqBXTAYgZAJ0w07pYYA5Q2dALC4QBY+YWdugBRSQEIOq2xKo3WlxTbIpij5xTrL54uJZI8UBFYuHbecQ==} + '@next/swc-linux-x64-musl@15.3.0-canary.16': + resolution: {integrity: sha512-khbFaZ+kzWa8Om+PHOiqeKw3On5akmcM8cgY0F2ucBPHwsQhITXkNpOGMcPkZnB0MCnxak56andyV3FfZCYo8Q==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - '@next/swc-win32-arm64-msvc@15.3.0-canary.14': - resolution: {integrity: sha512-2Jf9KI75uiRZtm27Sm3xn6xdosskabFpoZCI2q64r2ufuBx+gTgr5qZ6kIxcw9Oe/2atkWrjGXpdHNfJAxEXlA==} + '@next/swc-win32-arm64-msvc@15.3.0-canary.16': + resolution: {integrity: sha512-JE2GRrvTluApQbesaj2+hxn0ADzRI/4vDHoHf1tfAHi9nYqKNw5CshIKXbA7Y1bffqBa0EhmqtdOcULu7g2jjw==} engines: {node: '>= 10'} cpu: [arm64] os: [win32] - '@next/swc-win32-x64-msvc@15.3.0-canary.14': - resolution: {integrity: sha512-driLBL2CcZpXNdRbiLklaDOVvTmRCMhFEkJyQNK7EYhEKLH6QNaifi/NSyQrLRDhv9yfLLbVvDy7DlRiFBfWLQ==} + '@next/swc-win32-x64-msvc@15.3.0-canary.16': + resolution: {integrity: sha512-Zid8KU7eUGIzOy/REV67vny0d48DLppK7OSqY6pJlSfrdQ/k6RuJell/9jTWE3aAS/7M4Aru+HR930vfM+T99Q==} engines: {node: '>= 10'} cpu: [x64] os: [win32] @@ -903,6 +902,30 @@ packages: resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} engines: {node: '>= 8'} + '@npmcli/config@8.3.4': + resolution: {integrity: sha512-01rtHedemDNhUXdicU7s+QYz/3JyV5Naj84cvdXGH4mgCdL+agmSYaLF4LUG4vMCLzhBO8YtS0gPpH1FGvbgAw==} + engines: {node: ^16.14.0 || >=18.0.0} + + '@npmcli/git@5.0.8': + resolution: {integrity: sha512-liASfw5cqhjNW9UFd+ruwwdEf/lbOAQjLL2XY2dFW/bkJheXDYZgOyul/4gVvEV4BWkTXjYGmDqMw9uegdbJNQ==} + engines: {node: ^16.14.0 || >=18.0.0} + + '@npmcli/map-workspaces@3.0.6': + resolution: {integrity: sha512-tkYs0OYnzQm6iIRdfy+LcLBjcKuQCeE5YLb8KnrIlutJfheNaPvPpgoFEyEFgbjzl5PLZ3IA/BWAwRU0eHuQDA==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + '@npmcli/name-from-folder@2.0.0': + resolution: {integrity: sha512-pwK+BfEBZJbKdNYpHHRTNBwBoqrN/iIMO0AiGvYsp3Hoaq0WbgGSWQR6SCldZovoDpY3yje5lkFUe6gsDgJ2vg==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + '@npmcli/package-json@5.2.1': + resolution: {integrity: sha512-f7zYC6kQautXHvNbLEWgD/uGu1+xCn9izgqBfgItWSx22U0ZDekxN08A1vM8cTxj/cRVe0Q94Ode+tdoYmIOOQ==} + engines: {node: ^16.14.0 || >=18.0.0} + + '@npmcli/promise-spawn@7.0.2': + resolution: {integrity: sha512-xhfYPXoV5Dy4UkY0D+v2KkwvnDfiA/8Mt3sWCGI/hM03NsYIH8ZaG6QzS9x7pje5vHZBZJ2v6VRFVTWACnqcmQ==} + engines: {node: ^16.14.0 || >=18.0.0} + '@pagefind/darwin-arm64@1.3.0': resolution: {integrity: sha512-365BEGl6ChOsauRjyVpBjXybflXAOvoMROw3TucAROHIcdBvXk9/2AmEvGFU0r75+vdQI4LJdJdpH4Y6Yqaj4A==} cpu: [arm64] @@ -928,8 +951,12 @@ packages: cpu: [x64] os: [win32] - '@pkgr/core@0.1.1': - resolution: {integrity: sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==} + '@pkgjs/parseargs@0.11.0': + resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} + engines: {node: '>=14'} + + '@pkgr/core@0.1.2': + resolution: {integrity: sha512-fdDH1LSGfZdTH2sxdpVMw31BanV28K/Gry0cVFxaNP77neJSkd82mM8ErPNYs9e+0O7SdHBLTDzDgwUuy18RnQ==} engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} '@playwright/test@1.51.1': @@ -1162,9 +1189,15 @@ packages: '@tootallnate/quickjs-emscripten@0.23.0': resolution: {integrity: sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==} + '@tybys/wasm-util@0.9.0': + resolution: {integrity: sha512-6+7nlbMVX/PVDCwaIQ8nTOPveOcFLSt8GcXdx8hD0bt39uWxYT88uXzqTd4fTvqta7oeUJqudepapKNt2DYJFw==} + '@types/acorn@4.0.6': resolution: {integrity: sha512-veQTnWP+1D/xbxVrPC3zHnCZRjSrKfhbMUlEA43iMZLu7EsnTtkJklIuwrCPbOi8YkvDQAiW05VQQFvvz9oieQ==} + '@types/concat-stream@2.0.3': + resolution: {integrity: sha512-3qe4oQAPNwVNwK4C9c8u+VJqv9kez+2MR4qJpoPFfXtgxxif1QbFusvXzK0/Wra2VX07smostI2VMmJNSpZjuQ==} + '@types/d3-array@3.2.1': resolution: {integrity: sha512-Y2Jn2idRrLzUfAKV2LyRImR+y4oa2AntrgID95SHJxuMUrkNXmanDSed71sRNZysveJVt1hLLemQZIady0FpEg==} @@ -1261,6 +1294,9 @@ packages: '@types/debug@4.1.12': resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==} + '@types/doctrine@0.0.9': + resolution: {integrity: sha512-eOIHzCUSH7SMfonMG1LsC2f8vxBFtho6NGBznK41R84YzPuvSBzrhEps33IsQiOW9+VL6NQ9DbjQJznk/S4uRA==} + '@types/estree-jsx@1.0.5': resolution: {integrity: sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==} @@ -1273,6 +1309,9 @@ packages: '@types/hast@3.0.4': resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==} + '@types/is-empty@1.2.3': + resolution: {integrity: sha512-4J1l5d79hoIvsrKh5VUKVRA1aIdsOb10Hu5j3J2VfP/msDnfTdGPmNp2E1Wg+vs97Bktzo+MZePFFXSGoykYJw==} + '@types/json-schema@7.0.15': resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} @@ -1305,6 +1344,9 @@ packages: '@types/react@19.0.12': resolution: {integrity: sha512-V6Ar115dBDrjbtXSrS+/Oruobc+qVbbUxDFC1RSbRqLt5SYvxxyIDrSC85RWml54g+jfNeEMZhEj7wW07ONQhA==} + '@types/supports-color@8.1.3': + resolution: {integrity: sha512-Hy6UMpxhE3j1tLpl27exp1XqHD7n8chAiNPzWfz16LPZoMMoSc4dzLl6w9qijkEb/r5O1ozdu1CWGA2L83ZeZg==} + '@types/trusted-types@2.0.7': resolution: {integrity: sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==} @@ -1369,6 +1411,74 @@ packages: '@ungap/structured-clone@1.3.0': resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} + '@unrs/rspack-resolver-binding-darwin-arm64@1.2.2': + resolution: {integrity: sha512-i7z0B+C0P8Q63O/5PXJAzeFtA1ttY3OR2VSJgGv18S+PFNwD98xHgAgPOT1H5HIV6jlQP8Avzbp09qxJUdpPNw==} + cpu: [arm64] + os: [darwin] + + '@unrs/rspack-resolver-binding-darwin-x64@1.2.2': + resolution: {integrity: sha512-YEdFzPjIbDUCfmehC6eS+AdJYtFWY35YYgWUnqqTM2oe/N58GhNy5yRllxYhxwJ9GcfHoNc6Ubze1yjkNv+9Qg==} + cpu: [x64] + os: [darwin] + + '@unrs/rspack-resolver-binding-freebsd-x64@1.2.2': + resolution: {integrity: sha512-TU4ntNXDgPN2giQyyzSnGWf/dVCem5lvwxg0XYvsvz35h5H19WrhTmHgbrULMuypCB3aHe1enYUC9rPLDw45mA==} + cpu: [x64] + os: [freebsd] + + '@unrs/rspack-resolver-binding-linux-arm-gnueabihf@1.2.2': + resolution: {integrity: sha512-ik3w4/rU6RujBvNWiDnKdXi1smBhqxEDhccNi/j2rHaMjm0Fk49KkJ6XKsoUnD2kZ5xaMJf9JjailW/okfUPIw==} + cpu: [arm] + os: [linux] + + '@unrs/rspack-resolver-binding-linux-arm64-gnu@1.2.2': + resolution: {integrity: sha512-fp4Azi8kHz6TX8SFmKfyScZrMLfp++uRm2srpqRjsRZIIBzH74NtSkdEUHImR4G7f7XJ+sVZjCc6KDDK04YEpQ==} + cpu: [arm64] + os: [linux] + + '@unrs/rspack-resolver-binding-linux-arm64-musl@1.2.2': + resolution: {integrity: sha512-gMiG3DCFioJxdGBzhlL86KcFgt9HGz0iDhw0YVYPsShItpN5pqIkNrI+L/Q/0gfDiGrfcE0X3VANSYIPmqEAlQ==} + cpu: [arm64] + os: [linux] + + '@unrs/rspack-resolver-binding-linux-x64-gnu@1.2.2': + resolution: {integrity: sha512-n/4n2CxaUF9tcaJxEaZm+lqvaw2gflfWQ1R9I7WQgYkKEKbRKbpG/R3hopYdUmLSRI4xaW1Cy0Bz40eS2Yi4Sw==} + cpu: [x64] + os: [linux] + + '@unrs/rspack-resolver-binding-linux-x64-musl@1.2.2': + resolution: {integrity: sha512-cHyhAr6rlYYbon1L2Ag449YCj3p6XMfcYTP0AQX+KkQo025d1y/VFtPWvjMhuEsE2lLvtHm7GdJozj6BOMtzVg==} + cpu: [x64] + os: [linux] + + '@unrs/rspack-resolver-binding-wasm32-wasi@1.2.2': + resolution: {integrity: sha512-eogDKuICghDLGc32FtP+WniG38IB1RcGOGz0G3z8406dUdjJvxfHGuGs/dSlM9YEp/v0lEqhJ4mBu6X2nL9pog==} + engines: {node: '>=14.0.0'} + cpu: [wasm32] + + '@unrs/rspack-resolver-binding-win32-arm64-msvc@1.2.2': + resolution: {integrity: sha512-7sWRJumhpXSi2lccX8aQpfFXHsSVASdWndLv8AmD8nDRA/5PBi8IplQVZNx2mYRx6+Bp91Z00kuVqpXO9NfCTg==} + cpu: [arm64] + os: [win32] + + '@unrs/rspack-resolver-binding-win32-x64-msvc@1.2.2': + resolution: {integrity: sha512-hewo/UMGP1a7O6FG/ThcPzSJdm/WwrYDNkdGgWl6M18H6K6MSitklomWpT9MUtT5KGj++QJb06va/14QBC4pvw==} + cpu: [x64] + os: [win32] + + '@vitest/eslint-plugin@1.1.38': + resolution: {integrity: sha512-KcOTZyVz8RiM5HyriiDVrP1CyBGuhRxle+lBsmSs6NTJEO/8dKVAq+f5vQzHj1/Kc7bYXSDO6yBe62Zx0t5iaw==} + peerDependencies: + '@typescript-eslint/utils': ^8.24.0 + eslint: '>= 8.57.0' + typescript: '>= 5.0.0' + vitest: '*' + peerDependenciesMeta: + typescript: + optional: true + vitest: + optional: true + '@vitest/expect@3.0.9': resolution: {integrity: sha512-5eCqRItYgIML7NNVgJj6TVCmdzE7ZVgJhruW0ziSQV4V7PvLkDL1bBkBdcTs/VuIz0IxPb5da1IDSqc1TR9eig==} @@ -1401,6 +1511,10 @@ packages: '@zeit/schemas@2.36.0': resolution: {integrity: sha512-7kjMwcChYEzMKjeex9ZFXkt1AyNov9R5HZtjBKVsmVpw7pa7ZtlCGvCBC2vnnXctaYN+aRI61HjIqeetZW5ROg==} + abbrev@2.0.0: + resolution: {integrity: sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + abstract-logging@2.0.1: resolution: {integrity: sha512-2BjRTZxTPvheOvGbBslFSYOUkr+SjPtOnrLP33f+VIWLzezQpZcqVg7ja3L4dBXmzzgwT+a029jRx5PCi3JuiA==} @@ -1475,6 +1589,10 @@ packages: arch@2.2.0: resolution: {integrity: sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==} + are-docs-informative@0.0.2: + resolution: {integrity: sha512-ixiS0nLNNG5jNQzgZJNoUpBKdo9yTYZMGJ+QgT2jmjR7G7+QHRCc4v6LQ3NgE7EBJq+o0ams3waJwkrlBom8Ig==} + engines: {node: '>=14'} + arg@5.0.2: resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==} @@ -1706,6 +1824,10 @@ packages: resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} engines: {node: '>=8'} + ci-info@4.2.0: + resolution: {integrity: sha512-cYY9mypksY8NRqgDB1XD1RiJL338v/551niynFTGkZOO2LHuB2OmOYxDIe/ttN9AHwrqdum1360G3ald0W9kCg==} + engines: {node: '>=8'} + cli-boxes@3.0.0: resolution: {integrity: sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==} engines: {node: '>=10'} @@ -1775,6 +1897,10 @@ packages: resolution: {integrity: sha512-e2i4wANQiSXgnrBlIatyHtP1odfUp0BbV5Y5nEGbxtIrStkEOAAzCUirvLBNXHLr7kwLvJl6V+4V3XV9x7Wd9w==} engines: {node: ^12.20.0 || >=14} + comment-parser@1.4.1: + resolution: {integrity: sha512-buhp5kePrmda3vhc5B9t7pUQXAb2Tnd0qgpkIhPhkHXxJpiPJ11H0ZEU0oBpJ2QztSbzG/ZxMj/CHsYJqRHmyg==} + engines: {node: '>= 12.0.0'} + compressible@2.0.18: resolution: {integrity: sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==} engines: {node: '>= 0.6'} @@ -1789,6 +1915,10 @@ packages: concat-map@0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + concat-stream@2.0.0: + resolution: {integrity: sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==} + engines: {'0': node >= 6.0} + confbox@0.1.8: resolution: {integrity: sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==} @@ -2097,6 +2227,10 @@ packages: devlop@1.1.0: resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} + diff@5.2.0: + resolution: {integrity: sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==} + engines: {node: '>=0.3.1'} + dir-glob@3.0.1: resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} engines: {node: '>=8'} @@ -2105,6 +2239,10 @@ packages: resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} engines: {node: '>=0.10.0'} + doctrine@3.0.0: + resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} + engines: {node: '>=6.0.0'} + dompurify@3.2.4: resolution: {integrity: sha512-ysFSFEDVduQpyhzAob/kkuJjf5zWkZD8/A9ywSp1byueyuCfHamrCBa14/Oc2iiB0e51B+NpxSl5gmzn+Ms/mg==} @@ -2134,6 +2272,9 @@ packages: emoji-regex-xs@1.0.0: resolution: {integrity: sha512-LRlerrMYoIDrT6jgpeZ2YYl/L8EulRTt5hQcYjy5AInh7HWXKimpqx68aknBFpGL2+/IcogTcaydJEgaTmOpDg==} + emoji-regex@10.4.0: + resolution: {integrity: sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==} + emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} @@ -2155,6 +2296,12 @@ packages: resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} engines: {node: '>=0.12'} + err-code@2.0.3: + resolution: {integrity: sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==} + + error-ex@1.3.2: + resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} + es-abstract@1.23.9: resolution: {integrity: sha512-py07lI0wjxAC/DcfK1S6G7iANonniZwTISvdPzk9hzeH0IZIshbuuFxLIU96OyF89Yb9hiqWn8M/bY83KY5vzA==} engines: {node: '>= 0.4'} @@ -2220,6 +2367,59 @@ packages: peerDependencies: eslint: '>=7.0.0' + eslint-import-resolver-node@0.3.9: + resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==} + + eslint-import-resolver-typescript@4.2.2: + resolution: {integrity: sha512-Rg1YEsb9UKLQ8BOv27cS3TZ6LhEAKQVgVOXArcE/sQrlnX8+FjmJRSC29ij1qrn+eurFuMsCFUcs7/+27T0vqQ==} + engines: {node: ^16.17.0 || >=18.6.0} + peerDependencies: + eslint: '*' + eslint-plugin-import: '*' + eslint-plugin-import-x: '*' + is-bun-module: '*' + peerDependenciesMeta: + eslint-plugin-import: + optional: true + eslint-plugin-import-x: + optional: true + is-bun-module: + optional: true + + eslint-mdx@3.2.0: + resolution: {integrity: sha512-7A6/TDZeUh8ORwM2pe+n1FyUjwEYfGF1OZI+sn45L11NMHSzj/RTK+VqAGjIi+kvDrGc3yScUa20L3DKW0IRjg==} + engines: {node: '>=18.0.0'} + peerDependencies: + eslint: '>=8.0.0' + + eslint-plugin-check-file@3.1.0: + resolution: {integrity: sha512-bBVjeQvG8ZMCjXr9mJEIZoNf7f5RT+cTqUr6QQq0xMKkWjLQpQtpqUXkBV/XncffOwvyTqjvKpqiQMCXL3mIDw==} + engines: {node: '>=18'} + peerDependencies: + eslint: '>=9.0.0' + + eslint-plugin-import-x@4.9.1: + resolution: {integrity: sha512-YJ9W12tfDBBYVUUI5FVls6ZrzbVmfrHcQkjeHrG6I7QxWAlIbueRD+G4zPTg1FwlBouunTYm9dhJMVJZdj9wwQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + + eslint-plugin-jsdoc@50.6.8: + resolution: {integrity: sha512-PPZVqhoXaalMQwDGzcQrJtPSPIPOYsSMtvkjYAdsIazOW20yhYtVX4+jLL+XznD4zYTXyZbPWPRKkNev4D4lyw==} + engines: {node: '>=18'} + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 || ^9.0.0 + + eslint-plugin-mdx@3.2.0: + resolution: {integrity: sha512-zMD6DoFf5tj86dF1M0g90IxeBzrckyhYwksvalO1vfOBPPzhpR2wAbILBHZnubNuQALVgiqYQbPQ922GpviuGA==} + engines: {node: '>=18.0.0'} + peerDependencies: + eslint: '>=8.0.0' + + eslint-plugin-only-warn@1.1.0: + resolution: {integrity: sha512-2tktqUAT+Q3hCAU0iSf4xAN1k9zOpjK5WO8104mB0rT/dGhOa09582HN5HlbxNbPRZ0THV7nLGvzugcNOSjzfA==} + engines: {node: '>=6'} + eslint-plugin-react-hooks@5.2.0: resolution: {integrity: sha512-+f15FfK64YQwZdJNELETdn5ibXEUQmW1DZL6KXhNnc2heoy/sg9VJJeT7n8TlMWouzWqSWavFkIhHyIbIAEapg==} engines: {node: '>=10'} @@ -2268,6 +2468,10 @@ packages: resolution: {integrity: sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + espree@9.6.1: + resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + esprima@4.0.1: resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} engines: {node: '>=4'} @@ -2456,6 +2660,10 @@ packages: resolution: {integrity: sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==} engines: {node: '>= 0.4'} + foreground-child@3.3.1: + resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==} + engines: {node: '>=14'} + form-data@4.0.2: resolution: {integrity: sha512-hGfm/slu0ZabnNt4oaRZ6uREyfCj6P4fT/n6A1rGV+Z0VdGXjfOhVUpkn6qVQONHGIFwmveGXyDs75+nr6FM8w==} engines: {node: '>= 6'} @@ -2552,6 +2760,10 @@ packages: resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} engines: {node: '>=10.13.0'} + glob@10.4.5: + resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} + hasBin: true + globals@14.0.0: resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} engines: {node: '>=18'} @@ -2660,6 +2872,10 @@ packages: help-me@5.0.0: resolution: {integrity: sha512-7xgomUX6ADmcYzFik0HzAxh/73YlKR9bmFzf51CZwR+b6YtzU2m0u49hQCqV6SvlqIqsaxovfwdvbnsw3b/zpg==} + hosted-git-info@7.0.2: + resolution: {integrity: sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w==} + engines: {node: ^16.14.0 || >=18.0.0} + html-void-elements@3.0.0: resolution: {integrity: sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==} @@ -2695,17 +2911,31 @@ packages: resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} engines: {node: '>= 4'} + ignore@6.0.2: + resolution: {integrity: sha512-InwqeHHN2XpumIkMvpl/DCJVrAHgCsG5+cn1XlnLWGwtZBm8QJfSusItfrwx81CTp5agNZqpKU2J/ccC5nGT4A==} + engines: {node: '>= 4'} + import-fresh@3.3.1: resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} engines: {node: '>=6'} + import-meta-resolve@4.1.0: + resolution: {integrity: sha512-I6fiaX09Xivtk+THaMfAwnA3MVA5Big1WHF1Dfx9hFuvNIWpXnorlkzhcQf6ehrqQiiZECRt1poOAkPmer3ruw==} + imurmurhash@0.1.4: resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} engines: {node: '>=0.8.19'} + inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + ini@1.3.8: resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} + ini@4.1.3: + resolution: {integrity: sha512-X7rqawQBvfdjS10YU1y1YVreA3SsLrW9dX2CewP2EbBJM4ypVNLDkO5y04gejPwKIY9lR+7r9gn3rFPt/kmWFg==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + inline-style-parser@0.2.4: resolution: {integrity: sha512-0aO8FkhNZlj/ZIbNi7Lxxr12obT7cL1moPfE4tg1LkX7LlLfC6DeX4l2ZEud1ukP9jNQyNnfzQVqwbwmAATY4Q==} @@ -2738,6 +2968,9 @@ packages: resolution: {integrity: sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==} engines: {node: '>= 0.4'} + is-arrayish@0.2.1: + resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} + is-arrayish@0.3.2: resolution: {integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==} @@ -2786,6 +3019,9 @@ packages: engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} hasBin: true + is-empty@1.2.0: + resolution: {integrity: sha512-F2FnH/otLNJv0J6wc73A5Xo7oHLNnqplYqZhUu01tD54DIPvxIRSTSLkrUB/M0nHO4vo1O9PDfN4KoTxCzLh/w==} + is-extglob@2.1.1: resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} engines: {node: '>=0.10.0'} @@ -2912,10 +3148,17 @@ packages: isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + isexe@3.1.1: + resolution: {integrity: sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==} + engines: {node: '>=16'} + iterator.prototype@1.1.5: resolution: {integrity: sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g==} engines: {node: '>= 0.4'} + jackspeak@3.4.3: + resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} + joycon@3.1.1: resolution: {integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==} engines: {node: '>=10'} @@ -2937,9 +3180,17 @@ packages: jsbn@1.1.0: resolution: {integrity: sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==} + jsdoc-type-pratt-parser@4.1.0: + resolution: {integrity: sha512-Hicd6JK5Njt2QB6XYFS7ok9e37O8AYk3jTcppG4YVQnYjOemymvTcmc7OWsmq/Qqj5TdRFO5/x/tIPmBeRtGHg==} + engines: {node: '>=12.0.0'} + json-buffer@3.0.1: resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + json-parse-even-better-errors@3.0.2: + resolution: {integrity: sha512-fi0NG4bPjCHunUJffmLd0gxssIgkNmArMvis4iNah6Owg1MCJjWhEcDLmsK6iGkJq3tHwbDkTlce70/tmXN4cQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + json-schema-ref-resolver@2.0.1: resolution: {integrity: sha512-HG0SIB9X4J8bwbxCbnd5FfPEbcXAJYTi1pBJeP/QPON+w8ovSME8iRG+ElHNxZNX2Qh6eYn1GdzJFS4cDFfx0Q==} @@ -2972,6 +3223,10 @@ packages: khroma@2.1.0: resolution: {integrity: sha512-Ls993zuzfayK269Svk9hzpeGUKob/sIgZzyHYdjQoAdQetRKpOLj+k/QQQ/6Qi0Yz65mlROrfd+Ev+1+7dz9Kw==} + kleur@4.1.5: + resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} + engines: {node: '>=6'} + kolorist@1.8.0: resolution: {integrity: sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==} @@ -2992,6 +3247,13 @@ packages: light-my-request@6.6.0: resolution: {integrity: sha512-CHYbu8RtboSIoVsHZ6Ye4cj4Aw/yg2oAFimlF7mNvfDV192LR7nDiKtSIfCuLT7KokPSTn/9kfVLm5OGN0A28A==} + lines-and-columns@2.0.4: + resolution: {integrity: sha512-wM1+Z03eypVAVUCE7QdSqpVIvelbOakn1M0bPDoA4SGWPx3sNDVUiMo3L6To6WWGClB7VyXnhQ4Sn7gxiJbE6A==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + load-plugin@6.0.3: + resolution: {integrity: sha512-kc0X2FEUZr145odl68frm+lMJuQ23+rTXYmR6TImqPtbpmXC4vVXbWKDQ9IzndA0HfyQamWfKLhzsqGSTxE63w==} + local-pkg@1.1.1: resolution: {integrity: sha512-WunYko2W1NcdfAFpuLUoucsgULmgDBRkdxHxWQ7mK0cQqwPiy8E1enjuRBrhLtZkB5iScJ1XIPdhVEFK8aOLSg==} engines: {node: '>=14'} @@ -3026,6 +3288,9 @@ packages: loupe@3.1.3: resolution: {integrity: sha512-kkIp7XSkP78ZxJEsSxW3712C6teJVoeHHwgo9zJ380de7IYyJ2ISlxojcH2pC5OFLewESmnRi/+XCDIEEVyoug==} + lru-cache@10.4.3: + resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} + lru-cache@11.0.2: resolution: {integrity: sha512-123qHRfJBmo2jXDbo/a5YOQrJoHF/GNQTLzQ5+IdK5pWpceK17yRc6ozlWd25FxvGKQbIUs91fDFkXmDHTKcyA==} engines: {node: 20 || >=22} @@ -3270,6 +3535,10 @@ packages: resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} engines: {node: '>=12'} + minimatch@10.0.1: + resolution: {integrity: sha512-ethXTt3SGGR+95gudmqJ1eNhRO7eGEGIgYA9vnPatK4/etz2MEVDno5GMCibdMTuBMyElzIlgxMna3K94XDIDQ==} + engines: {node: 20 || >=22} + minimatch@3.1.2: resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} @@ -3280,6 +3549,10 @@ packages: minimist@1.2.8: resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + minipass@7.1.2: + resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} + engines: {node: '>=16 || 14 >=14.17'} + mj-context-menu@0.6.1: resolution: {integrity: sha512-7NO5s6n10TIV96d4g2uDpG7ZDpIhMh0QNfGdJw/W47JswFcosz457wqz/b5sAKvl12sxINGFCn80NZHKwxQEXA==} @@ -3338,8 +3611,8 @@ packages: react: ^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc react-dom: ^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc - next@15.3.0-canary.14: - resolution: {integrity: sha512-YYn3Ucr7pbuvIB7iLHhhMiZ+HoDFe8ekgT7ZDuEyhPJVqodoVq2kd1VKWMNHBukNqe7HDz29SOYj/H/RA4OEGQ==} + next@15.3.0-canary.16: + resolution: {integrity: sha512-avt6+iv67AK7McJioEfiWFQF2/CfPFCSi9CCQ6dOA6Ozsd4JC1Q7ZoF34qcEGQXgVfc4DhdVWxUcIR2c222ihg==} engines: {node: ^18.18.0 || ^19.8.0 || >= 20.0.0} hasBin: true peerDependencies: @@ -3359,16 +3632,16 @@ packages: sass: optional: true - nextra-theme-docs@4.2.16: - resolution: {integrity: sha512-IbEf7A7qd2PWYZ8XlwIXNghZRPxbiTw1tbPejH/tNX6nmAHUNpCrDPQO/jraYSnEae2DSb/5ZOBdqMT1c03paQ==} + nextra-theme-docs@4.2.17: + resolution: {integrity: sha512-QQ7iPHQ7zqh7dKJZ3SQbxqoFt7r8RHD9v7dFtJ+x8evEfxwM23oBGHNBqIjBoPl5uSwtvufEiVd7WMhK+Dxdww==} peerDependencies: next: '>=14' - nextra: 4.2.16 + nextra: 4.2.17 react: '>=18' react-dom: '>=18' - nextra@4.2.16: - resolution: {integrity: sha512-j0DNAWN1s6nzRtqS5L4PfVIk2BaD12V1nk/Cd1nRSHSF05vio6VmQ9+WZBbSvCrBjbnsRSflPBEP0cTs1y0lmQ==} + nextra@4.2.17: + resolution: {integrity: sha512-WBZGSUeUJqkYm3F3F7+4N1oMP84r/YK/rAg96wkywu/MIsuUREY8fLXQgQbKkvcLbBl/7Wk2Iy+9xlhDu+weNg==} engines: {node: '>=18'} peerDependencies: next: '>=14' @@ -3378,10 +3651,35 @@ packages: nlcst-to-string@4.0.0: resolution: {integrity: sha512-YKLBCcUYKAg0FNlOBT6aI91qFmSiFKiluk655WzPF+DDMA02qIyy8uiRqI8QXtcFpEvll12LpL5MXqEmAZ+dcA==} + nopt@7.2.1: + resolution: {integrity: sha512-taM24ViiimT/XntxbPyJQzCG+p4EKOpgD3mxFwW38mGjVUrfERQOeY4EDHjdnptttfHuHQXFx+lTP08Q+mLa/w==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + hasBin: true + + normalize-package-data@6.0.2: + resolution: {integrity: sha512-V6gygoYb/5EmNI+MEGrWkC+e6+Rr7mTmfHrxDbLzxQogBkgzo76rkok0Am6thgSF7Mv2nLOajAJj5vDJZEFn7g==} + engines: {node: ^16.14.0 || >=18.0.0} + normalize-path@3.0.0: resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} engines: {node: '>=0.10.0'} + npm-install-checks@6.3.0: + resolution: {integrity: sha512-W29RiK/xtpCGqn6f3ixfRYGk+zRyr+Ew9F2E20BfXxT5/euLdA/Nm7fO7OeTGuAmTs30cpgInyJ0cYe708YTZw==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + npm-normalize-package-bin@3.0.1: + resolution: {integrity: sha512-dMxCf+zZ+3zeQZXKxmyuCKlIDPGuv8EF940xbkC4kQVDTtqoh6rJFO+JTKSA6/Rwi0getWmtuy4Itup0AMcaDQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + npm-package-arg@11.0.3: + resolution: {integrity: sha512-sHGJy8sOC1YraBywpzQlIKBE4pBbGbiF95U6Auspzyem956E0+FtDtsx1ZxlOJkQCZ1AFXAY/yuvtFYrOxF+Bw==} + engines: {node: ^16.14.0 || >=18.0.0} + + npm-pick-manifest@9.1.0: + resolution: {integrity: sha512-nkc+3pIIhqHVQr085X9d2JzPzLyjzQS96zbruppqC9aZRm/x8xx6xhI98gHtsfELP2bE+loHq8ZaHFHhe+NauA==} + engines: {node: ^16.14.0 || >=18.0.0} + npm-run-path@4.0.1: resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} engines: {node: '>=8'} @@ -3495,6 +3793,9 @@ packages: resolution: {integrity: sha512-5NPgf87AT2STgwa2ntRMr45jTKrYBGkVU36yT0ig/n/GMAa3oPqhZfIQ2kMEimReg0+t9kZViDVZ83qfVUlckg==} engines: {node: '>= 14'} + package-json-from-dist@1.0.1: + resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} + package-manager-detector@0.2.11: resolution: {integrity: sha512-BEnLolu+yuz22S56CU1SUKq3XC3PkwD5wv4ikR4MfGvnRVcmzXR9DwSlW2fEamyTPyXHomBJRzgapeuBvRNzJQ==} @@ -3512,6 +3813,14 @@ packages: parse-entities@4.0.2: resolution: {integrity: sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw==} + parse-imports@2.2.1: + resolution: {integrity: sha512-OL/zLggRp8mFhKL0rNORUTR4yBYujK/uU+xZL+/0Rgm2QE4nLO9v8PzEweSJEbMGKmDRjJE4R3IMJlL2di4JeQ==} + engines: {node: '>= 18'} + + parse-json@7.1.1: + resolution: {integrity: sha512-SgOTCX/EZXtZxBE5eJ97P4yGM5n37BwRU+YMsH4vNzFqJV/oWFXXCmwFlgWUM4PrakybVOueJJ6pwHqSVhTFDw==} + engines: {node: '>=16'} + parse-latin@7.0.0: resolution: {integrity: sha512-mhHgobPPua5kZ98EF4HWiH167JWBfl4pvAIXXdbaVohtK7a6YBOy56kvhCqduqyo/f3yrHFWmqmiMg/BkBkYYQ==} @@ -3542,6 +3851,10 @@ packages: path-parse@1.0.7: resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + path-scurry@1.11.1: + resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} + engines: {node: '>=16 || 14 >=14.18'} + path-to-regexp@3.3.0: resolution: {integrity: sha512-qyCH421YQPS2WFDxDjftfc1ZR5WKQzVzqsp4n9M2kQhVOo/ByahFoUNJfl58kOcEGfQ//7weFTDhm+ss8Ecxgw==} @@ -3672,9 +3985,25 @@ packages: engines: {node: '>=14'} hasBin: true + proc-log@4.2.0: + resolution: {integrity: sha512-g8+OnU/L2v+wyiVK+D5fA34J7EH8jZ8DDlvwhRCMxmMj7UCBvxiO1mGeN+36JXIKF4zevU4kRBd8lVgG9vLelA==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + process-warning@4.0.1: resolution: {integrity: sha512-3c2LzQ3rY9d0hc1emcsHhfT9Jwz0cChib/QN89oME2R451w5fy3f0afAhERFZAwrbDU43wk12d0ORBpDVME50Q==} + promise-inflight@1.0.1: + resolution: {integrity: sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==} + peerDependencies: + bluebird: '*' + peerDependenciesMeta: + bluebird: + optional: true + + promise-retry@2.0.1: + resolution: {integrity: sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==} + engines: {node: '>=10'} + promptly@2.2.0: resolution: {integrity: sha512-aC9j+BZsRSSzEsXBNBwDnAxujdx19HycZoKgRgzWnS8eOHg1asuf9heuLprfbe739zY3IdUQx+Egv6Jn135WHA==} @@ -3741,6 +4070,10 @@ packages: resolution: {integrity: sha512-V8AVnmPIICiWpGfm6GLzCR/W5FXLchHop40W4nXBmdlEceh16rCN8O8LNWm5bh5XUX91fh7KpA+W0TgMKmgTpQ==} engines: {node: '>=0.10.0'} + read-package-json-fast@3.0.2: + resolution: {integrity: sha512-0J+Msgym3vrLOUB3hzQCuZHII0xkNGCtz/HJH9xZshwv9DbDwkw1KaE3gx/e2J5rpEY5rtOy6cyhKOPrkP7FZw==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + read-yaml-file@1.1.0: resolution: {integrity: sha512-VIMnQi/Z4HT2Fxuwg5KrY174U1VdUIASQVWXXyqtNRtxSr9IYkn1rsI6Tb6HsrHCmB7gVpNwX6JxPTHcH6IoTA==} engines: {node: '>=6'} @@ -3749,6 +4082,10 @@ packages: resolution: {integrity: sha512-rSOKNYUmaxy0om1BNjMN4ezNT6VKK+2xF4GBhc81mkH7L60i6dp8qPYrkndNLT3QPphoII3maL9PVC9XmhHwVQ==} engines: {node: '>=0.8'} + readable-stream@3.6.2: + resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} + engines: {node: '>= 6'} + readdirp@3.6.0: resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} engines: {node: '>=8.10.0'} @@ -3808,11 +4145,11 @@ packages: rehype-parse@9.0.1: resolution: {integrity: sha512-ksCzCD0Fgfh7trPDxr2rSylbwq9iYDkSn8TCDmEJ49ljEUBxDVCzCHv7QNzZOfODanX4+bWQ4WZqLCRWYLfhag==} - rehype-pretty-code@0.14.0: - resolution: {integrity: sha512-hBeKF/Wkkf3zyUS8lal9RCUuhypDWLQc+h9UrP9Pav25FUm/AQAVh4m5gdvJxh4Oz+U+xKvdsV01p1LdvsZTiQ==} + rehype-pretty-code@0.14.1: + resolution: {integrity: sha512-IpG4OL0iYlbx78muVldsK86hdfNoht0z63AP7sekQNW2QOTmjxB7RbTO+rhIYNGRljgHxgVZoPwUl6bIC9SbjA==} engines: {node: '>=18'} peerDependencies: - shiki: ^1.3.0 + shiki: ^1.0.0 || ^2.0.0 || ^3.0.0 rehype-raw@7.0.0: resolution: {integrity: sha512-/aE8hCfKlQeA8LmyeyQvQF3eBiLRGNlfBJEvWH7ivp9sBqs7TNqBL5X3v157rM4IFETqDnIOO+z5M/biZbo9Ww==} @@ -3892,6 +4229,10 @@ packages: retext@9.0.0: resolution: {integrity: sha512-sbMDcpHCNjvlheSgMfEcVrZko3cDzdbe1x/e7G66dFp0Ff7Mldvi2uv6JkJQzdRcvLYE8CA8Oe8siQx8ZOgTcA==} + retry@0.12.0: + resolution: {integrity: sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==} + engines: {node: '>= 4'} + reusify@1.1.0: resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} @@ -3910,6 +4251,9 @@ packages: roughjs@4.6.6: resolution: {integrity: sha512-ZUz/69+SYpFN/g/lUlo2FXcIjRkSu3nDarreVdGGndHEBJ6cXPdKguS8JGxwj5HA5xIbVKSmLgr5b3AWxtRfvQ==} + rspack-resolver@1.2.2: + resolution: {integrity: sha512-Fwc19jMBA3g+fxDJH2B4WxwZjE0VaaOL7OX/A4Wn5Zv7bOD/vyPZhzXfaO73Xc2GAlfi96g5fGUa378WbIGfFw==} + run-parallel@1.2.0: resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} @@ -3919,6 +4263,10 @@ packages: rw@1.3.3: resolution: {integrity: sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==} + sade@1.8.1: + resolution: {integrity: sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==} + engines: {node: '>=6'} + safe-array-concat@1.1.3: resolution: {integrity: sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==} engines: {node: '>=0.4'} @@ -4054,6 +4402,9 @@ packages: resolution: {integrity: sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==} engines: {node: '>=14.16'} + slashes@3.0.12: + resolution: {integrity: sha512-Q9VME8WyGkc7pJf6QEkj3wE+2CnvZMI+XJhwdTPR8Z/kWQRXi7boAWLDibRPyHRTUTPx5FaU7MsyrjI3yLB4HA==} + smart-buffer@4.2.0: resolution: {integrity: sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==} engines: {node: '>= 6.0.0', npm: '>= 3.0.0'} @@ -4097,6 +4448,21 @@ packages: spawndamnit@3.0.1: resolution: {integrity: sha512-MmnduQUuHCoFckZoWnXsTg7JaiLBJrKFj9UI2MbRPGaJeVpsLcVBu6P/IGZovziM/YBsellCmsprgNA+w0CzVg==} + spdx-correct@3.2.0: + resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} + + spdx-exceptions@2.5.0: + resolution: {integrity: sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==} + + spdx-expression-parse@3.0.1: + resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} + + spdx-expression-parse@4.0.0: + resolution: {integrity: sha512-Clya5JIij/7C6bRR22+tnGXbc4VKlibKSVj2iHvVeX5iMW7s1SIQlqu699JkODJJIhh/pUu8L0/VLh8xflD+LQ==} + + spdx-license-ids@3.0.21: + resolution: {integrity: sha512-Bvg/8F5XephndSK3JffaRqdT+gyhfqIPwDHpX80tJrF8QQRYMo8sNMeaZ2Dp5+jhwKnUmIOyFFQfHRkjJm5nXg==} + speech-rule-engine@4.0.7: resolution: {integrity: sha512-sJrL3/wHzNwJRLBdf6CjJWIlxC04iYKkyXvYSVsWVOiC2DSkHmxsqOhEeMsBA9XK+CHuNcsdkbFDnoUfAsmp9g==} hasBin: true @@ -4114,6 +4480,9 @@ packages: sprintf-js@1.1.3: resolution: {integrity: sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==} + stable-hash@0.0.5: + resolution: {integrity: sha512-+L3ccpzibovGXFK+Ap/f8LOS0ahMrHTf3xu7mMLSpEGU0EO9ucaysSylKo9eRDFNhWve/y275iPmIZ4z39a9iA==} + stackback@0.0.2: resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} @@ -4132,6 +4501,10 @@ packages: resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} engines: {node: '>=12'} + string-width@6.1.0: + resolution: {integrity: sha512-k01swCJAgQmuADB0YIc+7TuatfNvTBVOoaUWJjTB9R4VJzR5vNWzf5t42ESVZFPS8xTySF7CAdV4t/aaIm3UnQ==} + engines: {node: '>=16'} + string.prototype.matchall@4.0.12: resolution: {integrity: sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==} engines: {node: '>= 0.4'} @@ -4151,6 +4524,9 @@ packages: resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==} engines: {node: '>= 0.4'} + string_decoder@1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + stringify-entities@4.0.4: resolution: {integrity: sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==} @@ -4212,6 +4588,10 @@ packages: resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} engines: {node: '>=8'} + supports-color@9.4.0: + resolution: {integrity: sha512-VL+lNrEoIXww1coLPOmiEmK/0sGigko5COxI09KzHc2VJXJsQ37UaQ+8quuxjDeA7+KnLGTWRyOXSLLR2Wb4jw==} + engines: {node: '>=12'} + supports-preserve-symlinks-flag@1.0.0: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} @@ -4284,8 +4664,8 @@ packages: trough@2.2.0: resolution: {integrity: sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==} - ts-api-utils@2.0.1: - resolution: {integrity: sha512-dnlgjFSVetynI8nzgJ+qF62efpglpWRk8isUEWZGWlJYySCTD6aKvbUDu+zbPeDakk3bg5H4XpitHukgfL1m9w==} + ts-api-utils@2.1.0: + resolution: {integrity: sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==} engines: {node: '>=18.12'} peerDependencies: typescript: '>=4.8.4' @@ -4362,6 +4742,10 @@ packages: resolution: {integrity: sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==} engines: {node: '>=12.20'} + type-fest@3.13.1: + resolution: {integrity: sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g==} + engines: {node: '>=14.16'} + typed-array-buffer@1.0.3: resolution: {integrity: sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==} engines: {node: '>= 0.4'} @@ -4378,6 +4762,9 @@ packages: resolution: {integrity: sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==} engines: {node: '>= 0.4'} + typedarray@0.0.6: + resolution: {integrity: sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==} + typescript-eslint@8.27.0: resolution: {integrity: sha512-ZZ/8+Y0rRUMuW1gJaPtLWe4ryHbsPLzzibk5Sq+IFa2aOH1Vo0gPr1fbA6pOnzBke7zC2Da4w8AyCgxKXo3lqA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -4400,12 +4787,18 @@ packages: undici-types@6.20.0: resolution: {integrity: sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==} + unified-engine@11.2.2: + resolution: {integrity: sha512-15g/gWE7qQl9tQ3nAEbMd5h9HV1EACtFs6N9xaRBZICoCwnNGbal1kOs++ICf4aiTdItZxU2s/kYWhW7htlqJg==} + unified@11.0.5: resolution: {integrity: sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==} unist-util-find-after@5.0.0: resolution: {integrity: sha512-amQa0Ep2m6hE2g72AugUItjbuM8X8cGQnFoHk0pGfrFeT9GZhzN5SW8nRsiGKK7Aif4CrACPENkA6P/Lw6fHGQ==} + unist-util-inspect@8.1.0: + resolution: {integrity: sha512-mOlg8Mp33pR0eeFpo5d2902ojqFFOKMMG2hF8bmH7ZlhnmjFgh0NI3/ZDwdaBJNbvrS7LZFVrBVtIE9KZ9s7vQ==} + unist-util-is@5.2.1: resolution: {integrity: sha512-u9njyyfEh43npf1M+yGKDGVPbY/JWEemg5nH05ncKPfi+kBbKBJoTdsogMu33uhytuLlv9y0O7GH7fEdwLdLQw==} @@ -4455,10 +4848,25 @@ packages: uri-js@4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + uuid@11.1.0: resolution: {integrity: sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A==} hasBin: true + uvu@0.5.6: + resolution: {integrity: sha512-+g8ENReyr8YsOc6fv/NVJs2vFdHBnBNdfE49rshrTzDWOlUx4Gq7KOS2GD8eqhy2j+Ejq29+SbKH8yjkAqXqoA==} + engines: {node: '>=8'} + hasBin: true + + validate-npm-package-license@3.0.4: + resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} + + validate-npm-package-name@5.0.1: + resolution: {integrity: sha512-OljLrQ9SQdOUqTaQxqL5dEfZWrXExyyWsozYlAWFawPVNuD83igl7uJD2RTkNMbniIYgt8l81eCJGIdQF7avLQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + vary@1.1.2: resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} engines: {node: '>= 0.8'} @@ -4469,6 +4877,15 @@ packages: vfile-message@4.0.2: resolution: {integrity: sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==} + vfile-reporter@8.1.1: + resolution: {integrity: sha512-qxRZcnFSQt6pWKn3PAk81yLK2rO2i7CDXpy8v8ZquiEOMLSnPw6BMSi9Y1sUCwGGl7a9b3CJT1CKpnRF7pp66g==} + + vfile-sort@4.0.0: + resolution: {integrity: sha512-lffPI1JrbHDTToJwcq0rl6rBmkjQmMuXkAxsZPRS9DXbaJQvc642eCg6EGxcX2i1L+esbuhq+2l9tBll5v8AeQ==} + + vfile-statistics@3.0.0: + resolution: {integrity: sha512-/qlwqwWBWFOmpXujL/20P+Iuydil0rZZNglR+VNm6J0gpLHwuVM5s7g2TfVoswbXjZ4HuIhLMySEyIw5i7/D8w==} + vfile@6.0.3: resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==} @@ -4569,6 +4986,9 @@ packages: vscode-uri@3.0.8: resolution: {integrity: sha512-AyFQ0EVmsOZOlAnxoFOGOq1SQDWAB7C6aqMGS23svWAllfOaxbuFvcT8D1i8z3Gyn8fraVeZNNmN6e9bxxXkKw==} + walk-up-path@3.0.1: + resolution: {integrity: sha512-9YlCL/ynK3CTlrSRrDxZvUauLzAswPCrsaCgilqFevUYpeEW0/3ScEjaa3kbW/T0ghhkEr7mv+fpjqn1Y1YuTA==} + web-namespaces@2.0.1: resolution: {integrity: sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==} @@ -4593,6 +5013,11 @@ packages: engines: {node: '>= 8'} hasBin: true + which@4.0.0: + resolution: {integrity: sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==} + engines: {node: ^16.13.0 || >=18.0.0} + hasBin: true + why-is-node-running@2.3.0: resolution: {integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==} engines: {node: '>=8'} @@ -4609,6 +5034,10 @@ packages: resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} engines: {node: '>=0.10.0'} + wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + wrap-ansi@8.1.0: resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} engines: {node: '>=12'} @@ -4683,44 +5112,17 @@ snapshots: '@antfu/utils@8.1.1': {} - '@babel/runtime@7.26.10': + '@babel/code-frame@7.26.2': dependencies: - regenerator-runtime: 0.14.1 - - '@biomejs/biome@1.9.4': - optionalDependencies: - '@biomejs/cli-darwin-arm64': 1.9.4 - '@biomejs/cli-darwin-x64': 1.9.4 - '@biomejs/cli-linux-arm64': 1.9.4 - '@biomejs/cli-linux-arm64-musl': 1.9.4 - '@biomejs/cli-linux-x64': 1.9.4 - '@biomejs/cli-linux-x64-musl': 1.9.4 - '@biomejs/cli-win32-arm64': 1.9.4 - '@biomejs/cli-win32-x64': 1.9.4 - - '@biomejs/cli-darwin-arm64@1.9.4': - optional: true - - '@biomejs/cli-darwin-x64@1.9.4': - optional: true - - '@biomejs/cli-linux-arm64-musl@1.9.4': - optional: true - - '@biomejs/cli-linux-arm64@1.9.4': - optional: true - - '@biomejs/cli-linux-x64-musl@1.9.4': - optional: true - - '@biomejs/cli-linux-x64@1.9.4': - optional: true + '@babel/helper-validator-identifier': 7.25.9 + js-tokens: 4.0.0 + picocolors: 1.1.1 - '@biomejs/cli-win32-arm64@1.9.4': - optional: true + '@babel/helper-validator-identifier@7.25.9': {} - '@biomejs/cli-win32-x64@1.9.4': - optional: true + '@babel/runtime@7.26.10': + dependencies: + regenerator-runtime: 0.14.1 '@braintree/sanitize-url@7.1.1': {} @@ -4883,18 +5285,35 @@ snapshots: '@chevrotain/utils@11.0.3': {} - '@emnapi/runtime@1.3.1': + '@emnapi/core@1.3.1': dependencies: + '@emnapi/wasi-threads': 1.0.1 tslib: 2.8.1 optional: true - '@esbuild/aix-ppc64@0.25.1': + '@emnapi/runtime@1.3.1': + dependencies: + tslib: 2.8.1 optional: true - '@esbuild/android-arm64@0.25.1': + '@emnapi/wasi-threads@1.0.1': + dependencies: + tslib: 2.8.1 optional: true - '@esbuild/android-arm@0.25.1': + '@es-joy/jsdoccomment@0.49.0': + dependencies: + comment-parser: 1.4.1 + esquery: 1.6.0 + jsdoc-type-pratt-parser: 4.1.0 + + '@esbuild/aix-ppc64@0.25.1': + optional: true + + '@esbuild/android-arm64@0.25.1': + optional: true + + '@esbuild/android-arm@0.25.1': optional: true '@esbuild/android-x64@0.25.1': @@ -5171,6 +5590,15 @@ snapshots: '@img/sharp-win32-x64@0.33.5': optional: true + '@isaacs/cliui@8.0.2': + dependencies: + string-width: 5.1.2 + string-width-cjs: string-width@4.2.3 + strip-ansi: 7.1.0 + strip-ansi-cjs: strip-ansi@6.0.1 + wrap-ansi: 8.1.0 + wrap-ansi-cjs: wrap-ansi@7.0.0 + '@jridgewell/sourcemap-codec@1.5.0': {} '@manypkg/find-root@1.1.0': @@ -5282,34 +5710,41 @@ snapshots: '@napi-rs/simple-git-win32-arm64-msvc': 0.1.19 '@napi-rs/simple-git-win32-x64-msvc': 0.1.19 - '@next/env@15.3.0-canary.14': {} + '@napi-rs/wasm-runtime@0.2.7': + dependencies: + '@emnapi/core': 1.3.1 + '@emnapi/runtime': 1.3.1 + '@tybys/wasm-util': 0.9.0 + optional: true - '@next/eslint-plugin-next@15.3.0-canary.14': + '@next/env@15.3.0-canary.16': {} + + '@next/eslint-plugin-next@15.3.0-canary.16': dependencies: fast-glob: 3.3.1 - '@next/swc-darwin-arm64@15.3.0-canary.14': + '@next/swc-darwin-arm64@15.3.0-canary.16': optional: true - '@next/swc-darwin-x64@15.3.0-canary.14': + '@next/swc-darwin-x64@15.3.0-canary.16': optional: true - '@next/swc-linux-arm64-gnu@15.3.0-canary.14': + '@next/swc-linux-arm64-gnu@15.3.0-canary.16': optional: true - '@next/swc-linux-arm64-musl@15.3.0-canary.14': + '@next/swc-linux-arm64-musl@15.3.0-canary.16': optional: true - '@next/swc-linux-x64-gnu@15.3.0-canary.14': + '@next/swc-linux-x64-gnu@15.3.0-canary.16': optional: true - '@next/swc-linux-x64-musl@15.3.0-canary.14': + '@next/swc-linux-x64-musl@15.3.0-canary.16': optional: true - '@next/swc-win32-arm64-msvc@15.3.0-canary.14': + '@next/swc-win32-arm64-msvc@15.3.0-canary.16': optional: true - '@next/swc-win32-x64-msvc@15.3.0-canary.14': + '@next/swc-win32-x64-msvc@15.3.0-canary.16': optional: true '@nodelib/fs.scandir@2.1.5': @@ -5324,6 +5759,58 @@ snapshots: '@nodelib/fs.scandir': 2.1.5 fastq: 1.19.1 + '@npmcli/config@8.3.4': + dependencies: + '@npmcli/map-workspaces': 3.0.6 + '@npmcli/package-json': 5.2.1 + ci-info: 4.2.0 + ini: 4.1.3 + nopt: 7.2.1 + proc-log: 4.2.0 + semver: 7.7.1 + walk-up-path: 3.0.1 + transitivePeerDependencies: + - bluebird + + '@npmcli/git@5.0.8': + dependencies: + '@npmcli/promise-spawn': 7.0.2 + ini: 4.1.3 + lru-cache: 10.4.3 + npm-pick-manifest: 9.1.0 + proc-log: 4.2.0 + promise-inflight: 1.0.1 + promise-retry: 2.0.1 + semver: 7.7.1 + which: 4.0.0 + transitivePeerDependencies: + - bluebird + + '@npmcli/map-workspaces@3.0.6': + dependencies: + '@npmcli/name-from-folder': 2.0.0 + glob: 10.4.5 + minimatch: 9.0.5 + read-package-json-fast: 3.0.2 + + '@npmcli/name-from-folder@2.0.0': {} + + '@npmcli/package-json@5.2.1': + dependencies: + '@npmcli/git': 5.0.8 + glob: 10.4.5 + hosted-git-info: 7.0.2 + json-parse-even-better-errors: 3.0.2 + normalize-package-data: 6.0.2 + proc-log: 4.2.0 + semver: 7.7.1 + transitivePeerDependencies: + - bluebird + + '@npmcli/promise-spawn@7.0.2': + dependencies: + which: 4.0.0 + '@pagefind/darwin-arm64@1.3.0': optional: true @@ -5339,7 +5826,10 @@ snapshots: '@pagefind/windows-x64@1.3.0': optional: true - '@pkgr/core@0.1.1': {} + '@pkgjs/parseargs@0.11.0': + optional: true + + '@pkgr/core@0.1.2': {} '@playwright/test@1.51.1': dependencies: @@ -5600,10 +6090,19 @@ snapshots: '@tootallnate/quickjs-emscripten@0.23.0': {} + '@tybys/wasm-util@0.9.0': + dependencies: + tslib: 2.8.1 + optional: true + '@types/acorn@4.0.6': dependencies: '@types/estree': 1.0.6 + '@types/concat-stream@2.0.3': + dependencies: + '@types/node': 22.13.10 + '@types/d3-array@3.2.1': {} '@types/d3-axis@3.0.6': @@ -5725,6 +6224,8 @@ snapshots: dependencies: '@types/ms': 2.1.0 + '@types/doctrine@0.0.9': {} + '@types/estree-jsx@1.0.5': dependencies: '@types/estree': 1.0.6 @@ -5737,6 +6238,8 @@ snapshots: dependencies: '@types/unist': 3.0.3 + '@types/is-empty@1.2.3': {} + '@types/json-schema@7.0.15': {} '@types/katex@0.16.7': {} @@ -5767,6 +6270,8 @@ snapshots: dependencies: csstype: 3.1.3 + '@types/supports-color@8.1.3': {} + '@types/trusted-types@2.0.7': optional: true @@ -5786,7 +6291,7 @@ snapshots: graphemer: 1.4.0 ignore: 5.3.2 natural-compare: 1.4.0 - ts-api-utils: 2.0.1(typescript@5.8.2) + ts-api-utils: 2.1.0(typescript@5.8.2) typescript: 5.8.2 transitivePeerDependencies: - supports-color @@ -5814,7 +6319,7 @@ snapshots: '@typescript-eslint/utils': 8.27.0(eslint@9.22.0)(typescript@5.8.2) debug: 4.4.0 eslint: 9.22.0 - ts-api-utils: 2.0.1(typescript@5.8.2) + ts-api-utils: 2.1.0(typescript@5.8.2) typescript: 5.8.2 transitivePeerDependencies: - supports-color @@ -5830,7 +6335,7 @@ snapshots: is-glob: 4.0.3 minimatch: 9.0.5 semver: 7.7.1 - ts-api-utils: 2.0.1(typescript@5.8.2) + ts-api-utils: 2.1.0(typescript@5.8.2) typescript: 5.8.2 transitivePeerDependencies: - supports-color @@ -5860,6 +6365,49 @@ snapshots: '@ungap/structured-clone@1.3.0': {} + '@unrs/rspack-resolver-binding-darwin-arm64@1.2.2': + optional: true + + '@unrs/rspack-resolver-binding-darwin-x64@1.2.2': + optional: true + + '@unrs/rspack-resolver-binding-freebsd-x64@1.2.2': + optional: true + + '@unrs/rspack-resolver-binding-linux-arm-gnueabihf@1.2.2': + optional: true + + '@unrs/rspack-resolver-binding-linux-arm64-gnu@1.2.2': + optional: true + + '@unrs/rspack-resolver-binding-linux-arm64-musl@1.2.2': + optional: true + + '@unrs/rspack-resolver-binding-linux-x64-gnu@1.2.2': + optional: true + + '@unrs/rspack-resolver-binding-linux-x64-musl@1.2.2': + optional: true + + '@unrs/rspack-resolver-binding-wasm32-wasi@1.2.2': + dependencies: + '@napi-rs/wasm-runtime': 0.2.7 + optional: true + + '@unrs/rspack-resolver-binding-win32-arm64-msvc@1.2.2': + optional: true + + '@unrs/rspack-resolver-binding-win32-x64-msvc@1.2.2': + optional: true + + '@vitest/eslint-plugin@1.1.38(@typescript-eslint/utils@8.27.0(eslint@9.22.0)(typescript@5.8.2))(eslint@9.22.0)(typescript@5.8.2)(vitest@3.0.9(@types/debug@4.1.12)(@types/node@22.13.10)(tsx@4.19.3)(yaml@2.7.0))': + dependencies: + '@typescript-eslint/utils': 8.27.0(eslint@9.22.0)(typescript@5.8.2) + eslint: 9.22.0 + optionalDependencies: + typescript: 5.8.2 + vitest: 3.0.9(@types/debug@4.1.12)(@types/node@22.13.10)(tsx@4.19.3)(yaml@2.7.0) + '@vitest/expect@3.0.9': dependencies: '@vitest/spy': 3.0.9 @@ -5902,6 +6450,8 @@ snapshots: '@zeit/schemas@2.36.0': {} + abbrev@2.0.0: {} + abstract-logging@2.0.1: {} accepts@1.3.8: @@ -5971,6 +6521,8 @@ snapshots: arch@2.2.0: {} + are-docs-informative@0.0.2: {} + arg@5.0.2: {} argparse@1.0.10: @@ -6223,6 +6775,8 @@ snapshots: ci-info@3.9.0: {} + ci-info@4.2.0: {} + cli-boxes@3.0.0: {} cli-tableau@2.0.1: @@ -6283,6 +6837,8 @@ snapshots: commander@9.2.0: {} + comment-parser@1.4.1: {} + compressible@2.0.18: dependencies: mime-db: 1.54.0 @@ -6303,6 +6859,13 @@ snapshots: concat-map@0.0.1: {} + concat-stream@2.0.0: + dependencies: + buffer-from: 1.1.2 + inherits: 2.0.4 + readable-stream: 3.6.2 + typedarray: 0.0.6 + confbox@0.1.8: {} confbox@0.2.1: {} @@ -6610,6 +7173,8 @@ snapshots: dependencies: dequal: 2.0.3 + diff@5.2.0: {} + dir-glob@3.0.1: dependencies: path-type: 4.0.0 @@ -6618,6 +7183,10 @@ snapshots: dependencies: esutils: 2.0.3 + doctrine@3.0.0: + dependencies: + esutils: 2.0.3 + dompurify@3.2.4: optionalDependencies: '@types/trusted-types': 2.0.7 @@ -6645,6 +7214,8 @@ snapshots: emoji-regex-xs@1.0.0: {} + emoji-regex@10.4.0: {} + emoji-regex@8.0.0: {} emoji-regex@9.2.2: {} @@ -6664,6 +7235,12 @@ snapshots: entities@4.5.0: {} + err-code@2.0.3: {} + + error-ex@1.3.2: + dependencies: + is-arrayish: 0.2.1 + es-abstract@1.23.9: dependencies: array-buffer-byte-length: 1.0.2 @@ -6822,6 +7399,108 @@ snapshots: dependencies: eslint: 9.22.0 + eslint-import-resolver-node@0.3.9: + dependencies: + debug: 3.2.7 + is-core-module: 2.16.1 + resolve: 1.22.10 + transitivePeerDependencies: + - supports-color + + eslint-import-resolver-typescript@4.2.2(eslint-plugin-import-x@4.9.1(eslint@9.22.0)(typescript@5.8.2))(eslint@9.22.0): + dependencies: + debug: 4.4.0 + eslint: 9.22.0 + get-tsconfig: 4.10.0 + rspack-resolver: 1.2.2 + stable-hash: 0.0.5 + tinyglobby: 0.2.12 + optionalDependencies: + eslint-plugin-import-x: 4.9.1(eslint@9.22.0)(typescript@5.8.2) + transitivePeerDependencies: + - supports-color + + eslint-mdx@3.2.0(eslint@9.22.0): + dependencies: + acorn: 8.14.1 + acorn-jsx: 5.3.2(acorn@8.14.1) + eslint: 9.22.0 + espree: 9.6.1 + estree-util-visit: 2.0.0 + remark-mdx: 3.1.0 + remark-parse: 11.0.0 + remark-stringify: 11.0.0 + synckit: 0.9.2 + tslib: 2.8.1 + unified: 11.0.5 + unified-engine: 11.2.2 + unist-util-visit: 5.0.0 + uvu: 0.5.6 + vfile: 6.0.3 + transitivePeerDependencies: + - bluebird + - supports-color + + eslint-plugin-check-file@3.1.0(eslint@9.22.0): + dependencies: + eslint: 9.22.0 + is-glob: 4.0.3 + micromatch: 4.0.8 + + eslint-plugin-import-x@4.9.1(eslint@9.22.0)(typescript@5.8.2): + dependencies: + '@types/doctrine': 0.0.9 + '@typescript-eslint/utils': 8.27.0(eslint@9.22.0)(typescript@5.8.2) + debug: 4.4.0 + doctrine: 3.0.0 + eslint: 9.22.0 + eslint-import-resolver-node: 0.3.9 + get-tsconfig: 4.10.0 + is-glob: 4.0.3 + minimatch: 10.0.1 + rspack-resolver: 1.2.2 + semver: 7.7.1 + stable-hash: 0.0.5 + tslib: 2.8.1 + transitivePeerDependencies: + - supports-color + - typescript + + eslint-plugin-jsdoc@50.6.8(eslint@9.22.0): + dependencies: + '@es-joy/jsdoccomment': 0.49.0 + are-docs-informative: 0.0.2 + comment-parser: 1.4.1 + debug: 4.4.0 + escape-string-regexp: 4.0.0 + eslint: 9.22.0 + espree: 10.3.0 + esquery: 1.6.0 + parse-imports: 2.2.1 + semver: 7.7.1 + spdx-expression-parse: 4.0.0 + synckit: 0.9.2 + transitivePeerDependencies: + - supports-color + + eslint-plugin-mdx@3.2.0(eslint@9.22.0): + dependencies: + eslint: 9.22.0 + eslint-mdx: 3.2.0(eslint@9.22.0) + mdast-util-from-markdown: 2.0.2 + remark-mdx: 3.1.0 + remark-parse: 11.0.0 + remark-stringify: 11.0.0 + synckit: 0.9.2 + tslib: 2.8.1 + unified: 11.0.5 + vfile: 6.0.3 + transitivePeerDependencies: + - bluebird + - supports-color + + eslint-plugin-only-warn@1.1.0: {} + eslint-plugin-react-hooks@5.2.0(eslint@9.22.0): dependencies: eslint: 9.22.0 @@ -6911,6 +7590,12 @@ snapshots: acorn-jsx: 5.3.2(acorn@8.14.1) eslint-visitor-keys: 4.2.0 + espree@9.6.1: + dependencies: + acorn: 8.14.1 + acorn-jsx: 5.3.2(acorn@8.14.1) + eslint-visitor-keys: 3.4.3 + esprima@4.0.1: {} esquery@1.6.0: @@ -7134,6 +7819,11 @@ snapshots: dependencies: is-callable: 1.2.7 + foreground-child@3.3.1: + dependencies: + cross-spawn: 7.0.6 + signal-exit: 4.1.0 + form-data@4.0.2: dependencies: asynckit: 0.4.0 @@ -7236,6 +7926,15 @@ snapshots: dependencies: is-glob: 4.0.3 + glob@10.4.5: + dependencies: + foreground-child: 3.3.1 + jackspeak: 3.4.3 + minimatch: 9.0.5 + minipass: 7.1.2 + package-json-from-dist: 1.0.1 + path-scurry: 1.11.1 + globals@14.0.0: {} globals@15.15.0: {} @@ -7433,6 +8132,10 @@ snapshots: help-me@5.0.0: {} + hosted-git-info@7.0.2: + dependencies: + lru-cache: 10.4.3 + html-void-elements@3.0.0: {} http-proxy-agent@7.0.2: @@ -7465,15 +8168,23 @@ snapshots: ignore@5.3.2: {} + ignore@6.0.2: {} + import-fresh@3.3.1: dependencies: parent-module: 1.0.1 resolve-from: 4.0.0 + import-meta-resolve@4.1.0: {} + imurmurhash@0.1.4: {} + inherits@2.0.4: {} + ini@1.3.8: {} + ini@4.1.3: {} + inline-style-parser@0.2.4: {} internal-slot@1.1.0: @@ -7506,6 +8217,8 @@ snapshots: call-bound: 1.0.4 get-intrinsic: 1.3.0 + is-arrayish@0.2.1: {} + is-arrayish@0.3.2: optional: true @@ -7553,6 +8266,8 @@ snapshots: is-docker@3.0.0: {} + is-empty@1.2.0: {} + is-extglob@2.1.1: {} is-finalizationregistry@1.1.1: @@ -7660,6 +8375,8 @@ snapshots: isexe@2.0.0: {} + isexe@3.1.1: {} + iterator.prototype@1.1.5: dependencies: define-data-property: 1.1.4 @@ -7669,6 +8386,12 @@ snapshots: has-symbols: 1.1.0 set-function-name: 2.0.2 + jackspeak@3.4.3: + dependencies: + '@isaacs/cliui': 8.0.2 + optionalDependencies: + '@pkgjs/parseargs': 0.11.0 + joycon@3.1.1: {} js-git@0.7.8: @@ -7691,8 +8414,12 @@ snapshots: jsbn@1.1.0: {} + jsdoc-type-pratt-parser@4.1.0: {} + json-buffer@3.0.1: {} + json-parse-even-better-errors@3.0.2: {} + json-schema-ref-resolver@2.0.1: dependencies: dequal: 2.0.3 @@ -7727,6 +8454,8 @@ snapshots: khroma@2.1.0: {} + kleur@4.1.5: {} + kolorist@1.8.0: {} langium@3.0.0: @@ -7752,6 +8481,15 @@ snapshots: process-warning: 4.0.1 set-cookie-parser: 2.7.1 + lines-and-columns@2.0.4: {} + + load-plugin@6.0.3: + dependencies: + '@npmcli/config': 8.3.4 + import-meta-resolve: 4.1.0 + transitivePeerDependencies: + - bluebird + local-pkg@1.1.1: dependencies: mlly: 1.7.4 @@ -7782,6 +8520,8 @@ snapshots: loupe@3.1.3: {} + lru-cache@10.4.3: {} + lru-cache@11.0.2: {} lru-cache@6.0.0: @@ -8332,6 +9072,10 @@ snapshots: mimic-fn@4.0.0: {} + minimatch@10.0.1: + dependencies: + brace-expansion: 2.0.1 + minimatch@3.1.2: dependencies: brace-expansion: 1.1.11 @@ -8342,6 +9086,8 @@ snapshots: minimist@1.2.8: {} + minipass@7.1.2: {} + mj-context-menu@0.6.1: {} mkdirp@1.0.4: {} @@ -8386,9 +9132,9 @@ snapshots: react: 19.0.0 react-dom: 19.0.0(react@19.0.0) - next@15.3.0-canary.14(@playwright/test@1.51.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0): + next@15.3.0-canary.16(@playwright/test@1.51.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0): dependencies: - '@next/env': 15.3.0-canary.14 + '@next/env': 15.3.0-canary.16 '@swc/counter': 0.1.3 '@swc/helpers': 0.5.15 busboy: 1.6.0 @@ -8398,27 +9144,27 @@ snapshots: react-dom: 19.0.0(react@19.0.0) styled-jsx: 5.1.6(react@19.0.0) optionalDependencies: - '@next/swc-darwin-arm64': 15.3.0-canary.14 - '@next/swc-darwin-x64': 15.3.0-canary.14 - '@next/swc-linux-arm64-gnu': 15.3.0-canary.14 - '@next/swc-linux-arm64-musl': 15.3.0-canary.14 - '@next/swc-linux-x64-gnu': 15.3.0-canary.14 - '@next/swc-linux-x64-musl': 15.3.0-canary.14 - '@next/swc-win32-arm64-msvc': 15.3.0-canary.14 - '@next/swc-win32-x64-msvc': 15.3.0-canary.14 + '@next/swc-darwin-arm64': 15.3.0-canary.16 + '@next/swc-darwin-x64': 15.3.0-canary.16 + '@next/swc-linux-arm64-gnu': 15.3.0-canary.16 + '@next/swc-linux-arm64-musl': 15.3.0-canary.16 + '@next/swc-linux-x64-gnu': 15.3.0-canary.16 + '@next/swc-linux-x64-musl': 15.3.0-canary.16 + '@next/swc-win32-arm64-msvc': 15.3.0-canary.16 + '@next/swc-win32-x64-msvc': 15.3.0-canary.16 '@playwright/test': 1.51.1 sharp: 0.33.5 transitivePeerDependencies: - '@babel/core' - babel-plugin-macros - nextra-theme-docs@4.2.16(@types/react@19.0.12)(next@15.3.0-canary.14(@playwright/test@1.51.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(nextra@4.2.16(acorn@8.14.1)(next@15.3.0-canary.14(@playwright/test@1.51.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.8.2))(react-dom@19.0.0(react@19.0.0))(react@19.0.0): + nextra-theme-docs@4.2.17(@types/react@19.0.12)(next@15.3.0-canary.16(@playwright/test@1.51.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(nextra@4.2.17(acorn@8.14.1)(next@15.3.0-canary.16(@playwright/test@1.51.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.8.2))(react-dom@19.0.0(react@19.0.0))(react@19.0.0): dependencies: '@headlessui/react': 2.2.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0) clsx: 2.1.1 - next: 15.3.0-canary.14(@playwright/test@1.51.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + next: 15.3.0-canary.16(@playwright/test@1.51.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) next-themes: 0.4.6(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - nextra: 4.2.16(acorn@8.14.1)(next@15.3.0-canary.14(@playwright/test@1.51.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.8.2) + nextra: 4.2.17(acorn@8.14.1)(next@15.3.0-canary.16(@playwright/test@1.51.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.8.2) react: 19.0.0 react-compiler-runtime: 0.0.0-experimental-22c6e49-20241219(react@19.0.0) react-dom: 19.0.0(react@19.0.0) @@ -8431,7 +9177,7 @@ snapshots: - immer - use-sync-external-store - nextra@4.2.16(acorn@8.14.1)(next@15.3.0-canary.14(@playwright/test@1.51.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.8.2): + nextra@4.2.17(acorn@8.14.1)(next@15.3.0-canary.16(@playwright/test@1.51.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.8.2): dependencies: '@formatjs/intl-localematcher': 0.6.0 '@headlessui/react': 2.2.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0) @@ -8452,13 +9198,13 @@ snapshots: mdast-util-gfm: 3.1.0 mdast-util-to-hast: 13.2.0 negotiator: 1.0.0 - next: 15.3.0-canary.14(@playwright/test@1.51.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + next: 15.3.0-canary.16(@playwright/test@1.51.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) react: 19.0.0 react-compiler-runtime: 0.0.0-experimental-22c6e49-20241219(react@19.0.0) react-dom: 19.0.0(react@19.0.0) react-medium-image-zoom: 5.2.14(react-dom@19.0.0(react@19.0.0))(react@19.0.0) rehype-katex: 7.0.1 - rehype-pretty-code: 0.14.0(shiki@2.5.0) + rehype-pretty-code: 0.14.1(shiki@2.5.0) rehype-raw: 7.0.0 remark-frontmatter: 5.0.0 remark-gfm: 4.0.1 @@ -8483,8 +9229,38 @@ snapshots: dependencies: '@types/nlcst': 2.0.3 + nopt@7.2.1: + dependencies: + abbrev: 2.0.0 + + normalize-package-data@6.0.2: + dependencies: + hosted-git-info: 7.0.2 + semver: 7.7.1 + validate-npm-package-license: 3.0.4 + normalize-path@3.0.0: {} + npm-install-checks@6.3.0: + dependencies: + semver: 7.7.1 + + npm-normalize-package-bin@3.0.1: {} + + npm-package-arg@11.0.3: + dependencies: + hosted-git-info: 7.0.2 + proc-log: 4.2.0 + semver: 7.7.1 + validate-npm-package-name: 5.0.1 + + npm-pick-manifest@9.1.0: + dependencies: + npm-install-checks: 6.3.0 + npm-normalize-package-bin: 3.0.1 + npm-package-arg: 11.0.3 + semver: 7.7.1 + npm-run-path@4.0.1: dependencies: path-key: 3.1.1 @@ -8614,6 +9390,8 @@ snapshots: degenerator: 5.0.1 netmask: 2.0.2 + package-json-from-dist@1.0.1: {} + package-manager-detector@0.2.11: dependencies: quansync: 0.2.10 @@ -8642,6 +9420,19 @@ snapshots: is-decimal: 2.0.1 is-hexadecimal: 2.0.1 + parse-imports@2.2.1: + dependencies: + es-module-lexer: 1.6.0 + slashes: 3.0.12 + + parse-json@7.1.1: + dependencies: + '@babel/code-frame': 7.26.2 + error-ex: 1.3.2 + json-parse-even-better-errors: 3.0.2 + lines-and-columns: 2.0.4 + type-fest: 3.13.1 + parse-latin@7.0.0: dependencies: '@types/nlcst': 2.0.3 @@ -8669,6 +9460,11 @@ snapshots: path-parse@1.0.7: {} + path-scurry@1.11.1: + dependencies: + lru-cache: 10.4.3 + minipass: 7.1.2 + path-to-regexp@3.3.0: {} path-type@4.0.0: {} @@ -8857,8 +9653,17 @@ snapshots: prettier@3.5.3: {} + proc-log@4.2.0: {} + process-warning@4.0.1: {} + promise-inflight@1.0.1: {} + + promise-retry@2.0.1: + dependencies: + err-code: 2.0.3 + retry: 0.12.0 + promptly@2.2.0: dependencies: read: 1.0.7 @@ -8928,6 +9733,11 @@ snapshots: react@19.0.0: {} + read-package-json-fast@3.0.2: + dependencies: + json-parse-even-better-errors: 3.0.2 + npm-normalize-package-bin: 3.0.1 + read-yaml-file@1.1.0: dependencies: graceful-fs: 4.2.11 @@ -8939,6 +9749,12 @@ snapshots: dependencies: mute-stream: 0.0.8 + readable-stream@3.6.2: + dependencies: + inherits: 2.0.4 + string_decoder: 1.3.0 + util-deprecate: 1.0.2 + readdirp@3.6.0: dependencies: picomatch: 2.3.1 @@ -9043,7 +9859,7 @@ snapshots: hast-util-from-html: 2.0.3 unified: 11.0.5 - rehype-pretty-code@0.14.0(shiki@2.5.0): + rehype-pretty-code@0.14.1(shiki@2.5.0): dependencies: '@types/hast': 3.0.4 hast-util-to-string: 3.0.1 @@ -9195,6 +10011,8 @@ snapshots: retext-stringify: 4.0.0 unified: 11.0.5 + retry@0.12.0: {} + reusify@1.1.0: {} rfdc@1.4.1: {} @@ -9233,6 +10051,20 @@ snapshots: points-on-curve: 0.2.0 points-on-path: 0.2.1 + rspack-resolver@1.2.2: + optionalDependencies: + '@unrs/rspack-resolver-binding-darwin-arm64': 1.2.2 + '@unrs/rspack-resolver-binding-darwin-x64': 1.2.2 + '@unrs/rspack-resolver-binding-freebsd-x64': 1.2.2 + '@unrs/rspack-resolver-binding-linux-arm-gnueabihf': 1.2.2 + '@unrs/rspack-resolver-binding-linux-arm64-gnu': 1.2.2 + '@unrs/rspack-resolver-binding-linux-arm64-musl': 1.2.2 + '@unrs/rspack-resolver-binding-linux-x64-gnu': 1.2.2 + '@unrs/rspack-resolver-binding-linux-x64-musl': 1.2.2 + '@unrs/rspack-resolver-binding-wasm32-wasi': 1.2.2 + '@unrs/rspack-resolver-binding-win32-arm64-msvc': 1.2.2 + '@unrs/rspack-resolver-binding-win32-x64-msvc': 1.2.2 + run-parallel@1.2.0: dependencies: queue-microtask: 1.2.3 @@ -9241,6 +10073,10 @@ snapshots: rw@1.3.3: {} + sade@1.8.1: + dependencies: + mri: 1.2.0 + safe-array-concat@1.1.3: dependencies: call-bind: 1.0.8 @@ -9431,6 +10267,8 @@ snapshots: slash@5.1.0: {} + slashes@3.0.12: {} + smart-buffer@4.2.0: {} socks-proxy-agent@8.0.5: @@ -9481,6 +10319,25 @@ snapshots: cross-spawn: 7.0.6 signal-exit: 4.1.0 + spdx-correct@3.2.0: + dependencies: + spdx-expression-parse: 3.0.1 + spdx-license-ids: 3.0.21 + + spdx-exceptions@2.5.0: {} + + spdx-expression-parse@3.0.1: + dependencies: + spdx-exceptions: 2.5.0 + spdx-license-ids: 3.0.21 + + spdx-expression-parse@4.0.0: + dependencies: + spdx-exceptions: 2.5.0 + spdx-license-ids: 3.0.21 + + spdx-license-ids@3.0.21: {} + speech-rule-engine@4.0.7: dependencies: commander: 9.2.0 @@ -9495,6 +10352,8 @@ snapshots: sprintf-js@1.1.3: {} + stable-hash@0.0.5: {} + stackback@0.0.2: {} std-env@3.8.1: {} @@ -9513,6 +10372,12 @@ snapshots: emoji-regex: 9.2.2 strip-ansi: 7.1.0 + string-width@6.1.0: + dependencies: + eastasianwidth: 0.2.0 + emoji-regex: 10.4.0 + strip-ansi: 7.1.0 + string.prototype.matchall@4.0.12: dependencies: call-bind: 1.0.8 @@ -9557,6 +10422,10 @@ snapshots: define-properties: 1.2.1 es-object-atoms: 1.1.1 + string_decoder@1.3.0: + dependencies: + safe-buffer: 5.2.1 + stringify-entities@4.0.4: dependencies: character-entities-html4: 2.1.0 @@ -9603,11 +10472,13 @@ snapshots: dependencies: has-flag: 4.0.0 + supports-color@9.4.0: {} + supports-preserve-symlinks-flag@1.0.0: {} synckit@0.9.2: dependencies: - '@pkgr/core': 0.1.1 + '@pkgr/core': 0.1.2 tslib: 2.8.1 system-architecture@0.1.0: {} @@ -9658,7 +10529,7 @@ snapshots: trough@2.2.0: {} - ts-api-utils@2.0.1(typescript@5.8.2): + ts-api-utils@2.1.0(typescript@5.8.2): dependencies: typescript: 5.8.2 @@ -9725,6 +10596,8 @@ snapshots: type-fest@2.19.0: {} + type-fest@3.13.1: {} + typed-array-buffer@1.0.3: dependencies: call-bound: 1.0.4 @@ -9758,6 +10631,8 @@ snapshots: possible-typed-array-names: 1.1.0 reflect.getprototypeof: 1.0.10 + typedarray@0.0.6: {} + typescript-eslint@8.27.0(eslint@9.22.0)(typescript@5.8.2): dependencies: '@typescript-eslint/eslint-plugin': 8.27.0(@typescript-eslint/parser@8.27.0(eslint@9.22.0)(typescript@5.8.2))(eslint@9.22.0)(typescript@5.8.2) @@ -9781,6 +10656,33 @@ snapshots: undici-types@6.20.0: {} + unified-engine@11.2.2: + dependencies: + '@types/concat-stream': 2.0.3 + '@types/debug': 4.1.12 + '@types/is-empty': 1.2.3 + '@types/node': 22.13.10 + '@types/unist': 3.0.3 + concat-stream: 2.0.0 + debug: 4.4.0 + extend: 3.0.2 + glob: 10.4.5 + ignore: 6.0.2 + is-empty: 1.2.0 + is-plain-obj: 4.1.0 + load-plugin: 6.0.3 + parse-json: 7.1.1 + trough: 2.2.0 + unist-util-inspect: 8.1.0 + vfile: 6.0.3 + vfile-message: 4.0.2 + vfile-reporter: 8.1.1 + vfile-statistics: 3.0.0 + yaml: 2.7.0 + transitivePeerDependencies: + - bluebird + - supports-color + unified@11.0.5: dependencies: '@types/unist': 3.0.3 @@ -9796,6 +10698,10 @@ snapshots: '@types/unist': 3.0.3 unist-util-is: 6.0.0 + unist-util-inspect@8.1.0: + dependencies: + '@types/unist': 3.0.3 + unist-util-is@5.2.1: dependencies: '@types/unist': 2.0.11 @@ -9869,8 +10775,24 @@ snapshots: dependencies: punycode: 2.3.1 + util-deprecate@1.0.2: {} + uuid@11.1.0: {} + uvu@0.5.6: + dependencies: + dequal: 2.0.3 + diff: 5.2.0 + kleur: 4.1.5 + sade: 1.8.1 + + validate-npm-package-license@3.0.4: + dependencies: + spdx-correct: 3.2.0 + spdx-expression-parse: 3.0.1 + + validate-npm-package-name@5.0.1: {} + vary@1.1.2: {} vfile-location@5.0.3: @@ -9883,6 +10805,27 @@ snapshots: '@types/unist': 3.0.3 unist-util-stringify-position: 4.0.0 + vfile-reporter@8.1.1: + dependencies: + '@types/supports-color': 8.1.3 + string-width: 6.1.0 + supports-color: 9.4.0 + unist-util-stringify-position: 4.0.0 + vfile: 6.0.3 + vfile-message: 4.0.2 + vfile-sort: 4.0.0 + vfile-statistics: 3.0.0 + + vfile-sort@4.0.0: + dependencies: + vfile: 6.0.3 + vfile-message: 4.0.2 + + vfile-statistics@3.0.0: + dependencies: + vfile: 6.0.3 + vfile-message: 4.0.2 + vfile@6.0.3: dependencies: '@types/unist': 3.0.3 @@ -9983,6 +10926,8 @@ snapshots: vscode-uri@3.0.8: {} + walk-up-path@3.0.1: {} + web-namespaces@2.0.1: {} which-boxed-primitive@1.1.1: @@ -10030,6 +10975,10 @@ snapshots: dependencies: isexe: 2.0.0 + which@4.0.0: + dependencies: + isexe: 3.1.1 + why-is-node-running@2.3.0: dependencies: siginfo: 2.0.0 @@ -10043,6 +10992,12 @@ snapshots: word-wrap@1.2.5: {} + wrap-ansi@7.0.0: + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi@8.1.0: dependencies: ansi-styles: 6.2.1 diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index c61f11b2..4d0d03d0 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -4,6 +4,5 @@ packages: - docs/cache-handler-docs - internal/* onlyBuiltDependencies: - - '@biomejs/biome' - esbuild - sharp diff --git a/turbo.json b/turbo.json index 2c7dc649..10a3a927 100644 --- a/turbo.json +++ b/turbo.json @@ -21,13 +21,11 @@ "dependsOn": ["^build:docs"], "outputs": [".next/**", "!.next/cache/**", "out/**"] }, - "eslint:check": { - "cache": false, - "dependsOn": ["^eslint:check"] + "lint:check": { + "cache": false }, - "eslint:fix": { - "cache": false, - "dependsOn": ["^eslint:fix"] + "lint:fix": { + "cache": false }, "test": { "cache": false From 65386692f06292e4e42a0e32c6738d8865a35c1f Mon Sep 17 00:00:00 2001 From: better-salmon <132773930+better-salmon@users.noreply.github.com> Date: Thu, 15 May 2025 14:54:53 +0300 Subject: [PATCH 14/16] Update dependencies --- apps/cache-testing/package.json | 26 +- docs/cache-handler-docs/package.json | 16 +- internal/backend/package.json | 8 +- internal/eslint-config/package.json | 32 +- package.json | 10 +- packages/cache-handler/package.json | 12 +- pnpm-lock.yaml | 3149 +++++++++++++++----------- pnpm-workspace.yaml | 1 + 8 files changed, 1870 insertions(+), 1384 deletions(-) diff --git a/apps/cache-testing/package.json b/apps/cache-testing/package.json index b34a8a4e..6509c10c 100644 --- a/apps/cache-testing/package.json +++ b/apps/cache-testing/package.json @@ -17,24 +17,24 @@ }, "dependencies": { "@neshca/cache-handler": "workspace:*", - "axios": "1.8.4", - "next": "15.3.0-canary.16", - "react": "19.0.0", - "react-dom": "19.0.0", + "axios": "1.9.0", + "next": "15.3.2", + "react": "19.1.0", + "react-dom": "19.1.0", "redis": "4.7.0" }, "devDependencies": { - "@playwright/test": "1.51.1", + "@playwright/test": "1.52.0", "@repo/eslint-config": "workspace:*", "@repo/typescript-config": "workspace:*", - "@types/node": "22.13.10", - "@types/react": "19.0.12", - "@types/react-dom": "19.0.4", + "@types/node": "22.15.18", + "@types/react": "19.1.4", + "@types/react-dom": "19.1.5", "dotenv-cli": "8.0.0", - "eslint": "9.22.0", - "fastify": "5.2.1", - "pm2": "6.0.5", - "tsx": "4.19.3", - "typescript": "5.8.2" + "eslint": "9.26.0", + "fastify": "5.3.3", + "pm2": "6.0.6", + "tsx": "4.19.4", + "typescript": "5.8.3" } } diff --git a/docs/cache-handler-docs/package.json b/docs/cache-handler-docs/package.json index d889833a..32f7577a 100644 --- a/docs/cache-handler-docs/package.json +++ b/docs/cache-handler-docs/package.json @@ -12,21 +12,21 @@ "start:docs": "serve out" }, "dependencies": { - "next": "15.3.0-canary.16", + "next": "15.3.2", "nextra": "4.2.17", "nextra-theme-docs": "4.2.17", - "react": "19.0.0", - "react-dom": "19.0.0" + "react": "19.1.0", + "react-dom": "19.1.0" }, "devDependencies": { "@repo/eslint-config": "workspace:*", "@repo/typescript-config": "workspace:*", - "@types/node": "22.13.10", - "@types/react": "19.0.12", - "@types/react-dom": "19.0.4", - "eslint": "9.22.0", + "@types/node": "22.15.18", + "@types/react": "19.1.4", + "@types/react-dom": "19.1.5", + "eslint": "9.26.0", "pagefind": "1.3.0", "serve": "14.2.4", - "typescript": "5.8.2" + "typescript": "5.8.3" } } diff --git a/internal/backend/package.json b/internal/backend/package.json index 516c4b9c..805025a6 100644 --- a/internal/backend/package.json +++ b/internal/backend/package.json @@ -10,14 +10,14 @@ "start": "tsx ./src/backend.ts" }, "dependencies": { - "fastify": "5.2.1", + "fastify": "5.3.3", "pino": "9.6.0" }, "devDependencies": { "@repo/typescript-config": "workspace:*", - "@types/node": "22.13.10", + "@types/node": "22.15.18", "pino-pretty": "13.0.0", - "tsx": "4.19.3", - "typescript": "5.8.2" + "tsx": "4.19.4", + "typescript": "5.8.3" } } diff --git a/internal/eslint-config/package.json b/internal/eslint-config/package.json index 01e88042..4d0c572d 100644 --- a/internal/eslint-config/package.json +++ b/internal/eslint-config/package.json @@ -10,23 +10,23 @@ "./lib": "./lib.js" }, "devDependencies": { - "@eslint/js": "9.22.0", - "@next/eslint-plugin-next": "15.3.0-canary.16", - "@typescript-eslint/parser": "8.27.0", - "@vitest/eslint-plugin": "1.1.38", - "eslint": "9.22.0", - "eslint-config-prettier": "10.1.1", - "eslint-import-resolver-typescript": "4.2.2", - "eslint-plugin-check-file": "3.1.0", - "eslint-plugin-import-x": "4.9.1", - "eslint-plugin-jsdoc": "50.6.8", - "eslint-plugin-mdx": "3.2.0", + "@eslint/js": "9.26.0", + "@next/eslint-plugin-next": "15.3.2", + "@typescript-eslint/parser": "8.32.1", + "@vitest/eslint-plugin": "1.1.44", + "eslint": "9.26.0", + "eslint-config-prettier": "10.1.5", + "eslint-import-resolver-typescript": "4.3.4", + "eslint-plugin-check-file": "3.2.0", + "eslint-plugin-import-x": "4.11.1", + "eslint-plugin-jsdoc": "50.6.17", + "eslint-plugin-mdx": "3.4.1", "eslint-plugin-only-warn": "1.1.0", - "eslint-plugin-react": "7.37.4", + "eslint-plugin-react": "7.37.5", "eslint-plugin-react-hooks": "5.2.0", - "eslint-plugin-turbo": "2.4.4", - "globals": "16.0.0", - "typescript": "5.8.2", - "typescript-eslint": "8.27.0" + "eslint-plugin-turbo": "2.5.3", + "globals": "16.1.0", + "typescript": "5.8.3", + "typescript-eslint": "8.32.1" } } diff --git a/package.json b/package.json index e63ef65b..8c4c884b 100644 --- a/package.json +++ b/package.json @@ -27,13 +27,13 @@ "test": "turbo run test" }, "devDependencies": { - "@changesets/cli": "2.28.1", + "@changesets/cli": "2.29.4", "prettier": "3.5.3", - "prettier-plugin-packagejson": "2.5.10", - "turbo": "2.4.4", - "typescript": "5.8.2" + "prettier-plugin-packagejson": "2.5.13", + "turbo": "2.5.3", + "typescript": "5.8.3" }, - "packageManager": "pnpm@10.6.4+sha512.da3d715bfd22a9a105e6e8088cfc7826699332ded60c423b14ec613a185f1602206702ff0fe4c438cb15c979081ce4cb02568e364b15174503a63c7a8e2a5f6c", + "packageManager": "pnpm@10.11.0+sha512.6540583f41cc5f628eb3d9773ecee802f4f9ef9923cc45b69890fb47991d4b092964694ec3a4f738a420c918a333062c8b925d312f42e4f0c263eb603551f977", "engines": { "node": ">=22.11.0" } diff --git a/packages/cache-handler/package.json b/packages/cache-handler/package.json index 798d033e..7e2bfd32 100644 --- a/packages/cache-handler/package.json +++ b/packages/cache-handler/package.json @@ -46,12 +46,12 @@ "devDependencies": { "@repo/eslint-config": "workspace:*", "@repo/typescript-config": "workspace:*", - "@types/node": "22.13.10", - "eslint": "9.22.0", - "next": "15.3.0-canary.16", - "tsx": "4.19.3", - "typescript": "5.8.2", - "vitest": "3.0.9" + "@types/node": "22.15.18", + "eslint": "9.26.0", + "next": "15.3.2", + "tsx": "4.19.4", + "typescript": "5.8.3", + "vitest": "3.1.3" }, "peerDependencies": { "next": ">= 15 < 16", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index eec0bf9a..63b3ee3d 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -9,20 +9,20 @@ importers: .: devDependencies: '@changesets/cli': - specifier: 2.28.1 - version: 2.28.1 + specifier: 2.29.4 + version: 2.29.4 prettier: specifier: 3.5.3 version: 3.5.3 prettier-plugin-packagejson: - specifier: 2.5.10 - version: 2.5.10(prettier@3.5.3) + specifier: 2.5.13 + version: 2.5.13(prettier@3.5.3) turbo: - specifier: 2.4.4 - version: 2.4.4 + specifier: 2.5.3 + version: 2.5.3 typescript: - specifier: 5.8.2 - version: 5.8.2 + specifier: 5.8.3 + version: 5.8.3 apps/cache-testing: dependencies: @@ -30,24 +30,24 @@ importers: specifier: workspace:* version: link:../../packages/cache-handler axios: - specifier: 1.8.4 - version: 1.8.4 + specifier: 1.9.0 + version: 1.9.0 next: - specifier: 15.3.0-canary.16 - version: 15.3.0-canary.16(@playwright/test@1.51.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + specifier: 15.3.2 + version: 15.3.2(@playwright/test@1.52.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) react: - specifier: 19.0.0 - version: 19.0.0 + specifier: 19.1.0 + version: 19.1.0 react-dom: - specifier: 19.0.0 - version: 19.0.0(react@19.0.0) + specifier: 19.1.0 + version: 19.1.0(react@19.1.0) redis: specifier: 4.7.0 version: 4.7.0 devDependencies: '@playwright/test': - specifier: 1.51.1 - version: 1.51.1 + specifier: 1.52.0 + version: 1.52.0 '@repo/eslint-config': specifier: workspace:* version: link:../../internal/eslint-config @@ -55,50 +55,50 @@ importers: specifier: workspace:* version: link:../../internal/typescript-config '@types/node': - specifier: 22.13.10 - version: 22.13.10 + specifier: 22.15.18 + version: 22.15.18 '@types/react': - specifier: 19.0.12 - version: 19.0.12 + specifier: 19.1.4 + version: 19.1.4 '@types/react-dom': - specifier: 19.0.4 - version: 19.0.4(@types/react@19.0.12) + specifier: 19.1.5 + version: 19.1.5(@types/react@19.1.4) dotenv-cli: specifier: 8.0.0 version: 8.0.0 eslint: - specifier: 9.22.0 - version: 9.22.0 + specifier: 9.26.0 + version: 9.26.0 fastify: - specifier: 5.2.1 - version: 5.2.1 + specifier: 5.3.3 + version: 5.3.3 pm2: - specifier: 6.0.5 - version: 6.0.5 + specifier: 6.0.6 + version: 6.0.6 tsx: - specifier: 4.19.3 - version: 4.19.3 + specifier: 4.19.4 + version: 4.19.4 typescript: - specifier: 5.8.2 - version: 5.8.2 + specifier: 5.8.3 + version: 5.8.3 docs/cache-handler-docs: dependencies: next: - specifier: 15.3.0-canary.16 - version: 15.3.0-canary.16(@playwright/test@1.51.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + specifier: 15.3.2 + version: 15.3.2(@playwright/test@1.52.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) nextra: specifier: 4.2.17 - version: 4.2.17(acorn@8.14.1)(next@15.3.0-canary.16(@playwright/test@1.51.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.8.2) + version: 4.2.17(acorn@8.14.1)(next@15.3.2(@playwright/test@1.52.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@5.8.3) nextra-theme-docs: specifier: 4.2.17 - version: 4.2.17(@types/react@19.0.12)(next@15.3.0-canary.16(@playwright/test@1.51.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(nextra@4.2.17(acorn@8.14.1)(next@15.3.0-canary.16(@playwright/test@1.51.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.8.2))(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + version: 4.2.17(@types/react@19.1.4)(next@15.3.2(@playwright/test@1.52.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(nextra@4.2.17(acorn@8.14.1)(next@15.3.2(@playwright/test@1.52.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@5.8.3))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(use-sync-external-store@1.5.0(react@19.1.0)) react: - specifier: 19.0.0 - version: 19.0.0 + specifier: 19.1.0 + version: 19.1.0 react-dom: - specifier: 19.0.0 - version: 19.0.0(react@19.0.0) + specifier: 19.1.0 + version: 19.1.0(react@19.1.0) devDependencies: '@repo/eslint-config': specifier: workspace:* @@ -107,17 +107,17 @@ importers: specifier: workspace:* version: link:../../internal/typescript-config '@types/node': - specifier: 22.13.10 - version: 22.13.10 + specifier: 22.15.18 + version: 22.15.18 '@types/react': - specifier: 19.0.12 - version: 19.0.12 + specifier: 19.1.4 + version: 19.1.4 '@types/react-dom': - specifier: 19.0.4 - version: 19.0.4(@types/react@19.0.12) + specifier: 19.1.5 + version: 19.1.5(@types/react@19.1.4) eslint: - specifier: 9.22.0 - version: 9.22.0 + specifier: 9.26.0 + version: 9.26.0 pagefind: specifier: 1.3.0 version: 1.3.0 @@ -125,14 +125,14 @@ importers: specifier: 14.2.4 version: 14.2.4 typescript: - specifier: 5.8.2 - version: 5.8.2 + specifier: 5.8.3 + version: 5.8.3 internal/backend: dependencies: fastify: - specifier: 5.2.1 - version: 5.2.1 + specifier: 5.3.3 + version: 5.3.3 pino: specifier: 9.6.0 version: 9.6.0 @@ -141,74 +141,74 @@ importers: specifier: workspace:* version: link:../typescript-config '@types/node': - specifier: 22.13.10 - version: 22.13.10 + specifier: 22.15.18 + version: 22.15.18 pino-pretty: specifier: 13.0.0 version: 13.0.0 tsx: - specifier: 4.19.3 - version: 4.19.3 + specifier: 4.19.4 + version: 4.19.4 typescript: - specifier: 5.8.2 - version: 5.8.2 + specifier: 5.8.3 + version: 5.8.3 internal/eslint-config: devDependencies: '@eslint/js': - specifier: 9.22.0 - version: 9.22.0 + specifier: 9.26.0 + version: 9.26.0 '@next/eslint-plugin-next': - specifier: 15.3.0-canary.16 - version: 15.3.0-canary.16 + specifier: 15.3.2 + version: 15.3.2 '@typescript-eslint/parser': - specifier: 8.27.0 - version: 8.27.0(eslint@9.22.0)(typescript@5.8.2) + specifier: 8.32.1 + version: 8.32.1(eslint@9.26.0)(typescript@5.8.3) '@vitest/eslint-plugin': - specifier: 1.1.38 - version: 1.1.38(@typescript-eslint/utils@8.27.0(eslint@9.22.0)(typescript@5.8.2))(eslint@9.22.0)(typescript@5.8.2)(vitest@3.0.9(@types/debug@4.1.12)(@types/node@22.13.10)(tsx@4.19.3)(yaml@2.7.0)) + specifier: 1.1.44 + version: 1.1.44(@typescript-eslint/utils@8.32.1(eslint@9.26.0)(typescript@5.8.3))(eslint@9.26.0)(typescript@5.8.3)(vitest@3.1.3(@types/debug@4.1.12)(@types/node@22.15.18)(tsx@4.19.4)(yaml@2.8.0)) eslint: - specifier: 9.22.0 - version: 9.22.0 + specifier: 9.26.0 + version: 9.26.0 eslint-config-prettier: - specifier: 10.1.1 - version: 10.1.1(eslint@9.22.0) + specifier: 10.1.5 + version: 10.1.5(eslint@9.26.0) eslint-import-resolver-typescript: - specifier: 4.2.2 - version: 4.2.2(eslint-plugin-import-x@4.9.1(eslint@9.22.0)(typescript@5.8.2))(eslint@9.22.0) + specifier: 4.3.4 + version: 4.3.4(eslint-plugin-import-x@4.11.1(eslint@9.26.0)(typescript@5.8.3))(eslint@9.26.0) eslint-plugin-check-file: - specifier: 3.1.0 - version: 3.1.0(eslint@9.22.0) + specifier: 3.2.0 + version: 3.2.0(eslint@9.26.0) eslint-plugin-import-x: - specifier: 4.9.1 - version: 4.9.1(eslint@9.22.0)(typescript@5.8.2) + specifier: 4.11.1 + version: 4.11.1(eslint@9.26.0)(typescript@5.8.3) eslint-plugin-jsdoc: - specifier: 50.6.8 - version: 50.6.8(eslint@9.22.0) + specifier: 50.6.17 + version: 50.6.17(eslint@9.26.0) eslint-plugin-mdx: - specifier: 3.2.0 - version: 3.2.0(eslint@9.22.0) + specifier: 3.4.1 + version: 3.4.1(eslint@9.26.0) eslint-plugin-only-warn: specifier: 1.1.0 version: 1.1.0 eslint-plugin-react: - specifier: 7.37.4 - version: 7.37.4(eslint@9.22.0) + specifier: 7.37.5 + version: 7.37.5(eslint@9.26.0) eslint-plugin-react-hooks: specifier: 5.2.0 - version: 5.2.0(eslint@9.22.0) + version: 5.2.0(eslint@9.26.0) eslint-plugin-turbo: - specifier: 2.4.4 - version: 2.4.4(eslint@9.22.0)(turbo@2.4.4) + specifier: 2.5.3 + version: 2.5.3(eslint@9.26.0)(turbo@2.5.3) globals: - specifier: 16.0.0 - version: 16.0.0 + specifier: 16.1.0 + version: 16.1.0 typescript: - specifier: 5.8.2 - version: 5.8.2 + specifier: 5.8.3 + version: 5.8.3 typescript-eslint: - specifier: 8.27.0 - version: 8.27.0(eslint@9.22.0)(typescript@5.8.2) + specifier: 8.32.1 + version: 8.32.1(eslint@9.26.0)(typescript@5.8.3) internal/typescript-config: {} @@ -219,7 +219,7 @@ importers: version: 1.1.2 lru-cache: specifier: ^11.0.2 - version: 11.0.2 + version: 11.1.0 redis: specifier: '>= 4.6' version: 4.7.0 @@ -234,58 +234,58 @@ importers: specifier: workspace:* version: link:../../internal/typescript-config '@types/node': - specifier: 22.13.10 - version: 22.13.10 + specifier: 22.15.18 + version: 22.15.18 eslint: - specifier: 9.22.0 - version: 9.22.0 + specifier: 9.26.0 + version: 9.26.0 next: - specifier: 15.3.0-canary.16 - version: 15.3.0-canary.16(@playwright/test@1.51.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + specifier: 15.3.2 + version: 15.3.2(@playwright/test@1.52.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) tsx: - specifier: 4.19.3 - version: 4.19.3 + specifier: 4.19.4 + version: 4.19.4 typescript: - specifier: 5.8.2 - version: 5.8.2 + specifier: 5.8.3 + version: 5.8.3 vitest: - specifier: 3.0.9 - version: 3.0.9(@types/debug@4.1.12)(@types/node@22.13.10)(tsx@4.19.3)(yaml@2.7.0) + specifier: 3.1.3 + version: 3.1.3(@types/debug@4.1.12)(@types/node@22.15.18)(tsx@4.19.4)(yaml@2.8.0) packages: - '@antfu/install-pkg@1.0.0': - resolution: {integrity: sha512-xvX6P/lo1B3ej0OsaErAjqgFYzYVcJpamjLAFLYh9vRJngBrMoUG7aVnrGTeqM7yxbyTD5p3F2+0/QUEh8Vzhw==} + '@antfu/install-pkg@1.1.0': + resolution: {integrity: sha512-MGQsmw10ZyI+EJo45CdSER4zEb+p31LpDAFp2Z3gkSd1yqVZGi0Ebx++YTEMonJy4oChEMLsxZ64j8FH6sSqtQ==} '@antfu/utils@8.1.1': resolution: {integrity: sha512-Mex9nXf9vR6AhcXmMrlz/HVgYYZpVGJ6YlPgwl7UnaFpnshXs6EK/oa5Gpf3CzENMjkvEx2tQtntGnb7UtSTOQ==} - '@babel/code-frame@7.26.2': - resolution: {integrity: sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==} + '@babel/code-frame@7.27.1': + resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==} engines: {node: '>=6.9.0'} - '@babel/helper-validator-identifier@7.25.9': - resolution: {integrity: sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==} + '@babel/helper-validator-identifier@7.27.1': + resolution: {integrity: sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==} engines: {node: '>=6.9.0'} - '@babel/runtime@7.26.10': - resolution: {integrity: sha512-2WJMeRQPHKSPemqk/awGrAiuFfzBmOIPXKizAsVhWH9YJqLZ0H+HS4c8loHGgW6utJ3E/ejXQUsiGaQy2NZ9Fw==} + '@babel/runtime@7.27.1': + resolution: {integrity: sha512-1x3D2xEk2fRo3PAhwQwu5UubzgiVWSXTBfWpVd2Mx2AzRqJuDJCsgaDVZ7HB5iGzDW1Hl1sWN2mFyKjmR9uAog==} engines: {node: '>=6.9.0'} '@braintree/sanitize-url@7.1.1': resolution: {integrity: sha512-i1L7noDNxtFyL5DmZafWy1wRVhGehQmzZaz1HiN5e7iylJMSZR7ekOV7NsIqa5qBldlLrsKv4HbgFUVlQrz8Mw==} - '@changesets/apply-release-plan@7.0.10': - resolution: {integrity: sha512-wNyeIJ3yDsVspYvHnEz1xQDq18D9ifed3lI+wxRQRK4pArUcuHgCTrHv0QRnnwjhVCQACxZ+CBih3wgOct6UXw==} + '@changesets/apply-release-plan@7.0.12': + resolution: {integrity: sha512-EaET7As5CeuhTzvXTQCRZeBUcisoYPDDcXvgTE/2jmmypKp0RC7LxKj/yzqeh/1qFTZI7oDGFcL1PHRuQuketQ==} - '@changesets/assemble-release-plan@6.0.6': - resolution: {integrity: sha512-Frkj8hWJ1FRZiY3kzVCKzS0N5mMwWKwmv9vpam7vt8rZjLL1JMthdh6pSDVSPumHPshTTkKZ0VtNbE0cJHZZUg==} + '@changesets/assemble-release-plan@6.0.8': + resolution: {integrity: sha512-y8+8LvZCkKJdbUlpXFuqcavpzJR80PN0OIfn8HZdwK7Sh6MgLXm4hKY5vu6/NDoKp8lAlM4ERZCqRMLxP4m+MQ==} '@changesets/changelog-git@0.2.1': resolution: {integrity: sha512-x/xEleCFLH28c3bQeQIyeZf8lFXyDFVn1SgcBiR2Tw/r4IAWlk1fzxCEZ6NxQAjF2Nwtczoen3OA2qR+UawQ8Q==} - '@changesets/cli@2.28.1': - resolution: {integrity: sha512-PiIyGRmSc6JddQJe/W1hRPjiN4VrMvb2VfQ6Uydy2punBioQrsxppyG5WafinKcW1mT0jOe/wU4k9Zy5ff21AA==} + '@changesets/cli@2.29.4': + resolution: {integrity: sha512-VW30x9oiFp/un/80+5jLeWgEU6Btj8IqOgI+X/zAYu4usVOWXjPIK5jSSlt5jsCU7/6Z7AxEkarxBxGUqkAmNg==} hasBin: true '@changesets/config@3.1.1': @@ -297,14 +297,14 @@ packages: '@changesets/get-dependents-graph@2.1.3': resolution: {integrity: sha512-gphr+v0mv2I3Oxt19VdWRRUxq3sseyUpX9DaHpTUmLj92Y10AGy+XOtV+kbM6L/fDcpx7/ISDFK6T8A/P3lOdQ==} - '@changesets/get-release-plan@4.0.8': - resolution: {integrity: sha512-MM4mq2+DQU1ZT7nqxnpveDMTkMBLnwNX44cX7NSxlXmr7f8hO6/S2MXNiXG54uf/0nYnefv0cfy4Czf/ZL/EKQ==} + '@changesets/get-release-plan@4.0.12': + resolution: {integrity: sha512-KukdEgaafnyGryUwpHG2kZ7xJquOmWWWk5mmoeQaSvZTWH1DC5D/Sw6ClgGFYtQnOMSQhgoEbDxAbpIIayKH1g==} '@changesets/get-version-range-type@0.4.0': resolution: {integrity: sha512-hwawtob9DryoGTpixy1D3ZXbGgJu1Rhr+ySH2PvTLHvkZuQ7sRT4oQwMh0hbqZH1weAooedEjRsbrWcGLCeyVQ==} - '@changesets/git@3.0.2': - resolution: {integrity: sha512-r1/Kju9Y8OxRRdvna+nxpQIsMsRQn9dhhAZt94FLDeu0Hij2hnOozW8iqnHBgvu+KdnJppCveQwK4odwfw/aWQ==} + '@changesets/git@3.0.4': + resolution: {integrity: sha512-BXANzRFkX+XcC1q/d27NKvlJ1yf7PSAgi8JG6dt8EfbHFHi4neau7mufcSca5zRhwOL8j9s6EqsxmT+s+/E6Sw==} '@changesets/logger@0.1.1': resolution: {integrity: sha512-OQtR36ZlnuTxKqoW4Sv6x5YIhOmClRd5pWsjZsddYxpWs517R0HkyiefQPIytCVh4ZcC5x9XaG8KTdd5iRQUfg==} @@ -315,8 +315,8 @@ packages: '@changesets/pre@2.0.2': resolution: {integrity: sha512-HaL/gEyFVvkf9KFg6484wR9s0qjAXlZ8qWPDkTyKF6+zqjBe/I2mygg3MbpZ++hdi0ToqNUF8cjj7fBy0dg8Ug==} - '@changesets/read@0.6.3': - resolution: {integrity: sha512-9H4p/OuJ3jXEUTjaVGdQEhBdqoT2cO5Ts95JTFsQyawmKzpL8FnIeJSyhTDPW1MBRDnwZlHFEM9SpPwJDY5wIg==} + '@changesets/read@0.6.5': + resolution: {integrity: sha512-UPzNGhsSjHD3Veb0xO/MwvasGe8eMyNrR/sT9gR8Q3DhOQZirgKhhXv/8hVsI0QpPjR004Z9iFxoJU6in3uGMg==} '@changesets/should-skip-package@0.1.2': resolution: {integrity: sha512-qAK/WrqWLNCP22UDdBTMPH5f41elVDlsNyat180A33dWxuUDyNpg6fPi/FyTZwRriVjg0L8gnjJn2F9XAoF0qw==} @@ -345,171 +345,171 @@ packages: '@chevrotain/utils@11.0.3': resolution: {integrity: sha512-YslZMgtJUyuMbZ+aKvfF3x1f5liK4mWNxghFRv7jqRR9C3R3fAOGTTKvxXDa2Y1s9zSbcpuO0cAxDYsc9SrXoQ==} - '@emnapi/core@1.3.1': - resolution: {integrity: sha512-pVGjBIt1Y6gg3EJN8jTcfpP/+uuRksIo055oE/OBkDNcjZqVbfkWCksG1Jp4yZnj3iKWyWX8fdG/j6UDYPbFog==} + '@emnapi/core@1.4.3': + resolution: {integrity: sha512-4m62DuCE07lw01soJwPiBGC0nAww0Q+RY70VZ+n49yDIO13yyinhbWCeNnaob0lakDtWQzSdtNWzJeOJt2ma+g==} - '@emnapi/runtime@1.3.1': - resolution: {integrity: sha512-kEBmG8KyqtxJZv+ygbEim+KCGtIq1fC22Ms3S4ziXmYKm8uyoLX0MHONVKwp+9opg390VaKRNt4a7A9NwmpNhw==} + '@emnapi/runtime@1.4.3': + resolution: {integrity: sha512-pBPWdu6MLKROBX05wSNKcNb++m5Er+KQ9QkB+WVM+pW2Kx9hoSrVTnu3BdkI5eBLZoKu/J6mW/B6i6bJB2ytXQ==} - '@emnapi/wasi-threads@1.0.1': - resolution: {integrity: sha512-iIBu7mwkq4UQGeMEM8bLwNK962nXdhodeScX4slfQnRhEMMzvYivHhutCIk8uojvmASXXPC2WNEjwxFWk72Oqw==} + '@emnapi/wasi-threads@1.0.2': + resolution: {integrity: sha512-5n3nTJblwRi8LlXkJ9eBzu+kZR8Yxcc7ubakyQTFzPMtIhFpUBRbsnc2Dv88IZDIbCDlBiWrknhB4Lsz7mg6BA==} - '@es-joy/jsdoccomment@0.49.0': - resolution: {integrity: sha512-xjZTSFgECpb9Ohuk5yMX5RhUEbfeQcuOp8IF60e+wyzWEF0M5xeSgqsfLtvPEX8BIyOX9saZqzuGPmZ8oWc+5Q==} - engines: {node: '>=16'} + '@es-joy/jsdoccomment@0.50.1': + resolution: {integrity: sha512-fas3qe1hw38JJgU/0m5sDpcrbZGysBeZcMwW5Ws9brYxY64MJyWLXRZCj18keTycT1LFTrFXdSNMS+GRVaU6Hw==} + engines: {node: '>=18'} - '@esbuild/aix-ppc64@0.25.1': - resolution: {integrity: sha512-kfYGy8IdzTGy+z0vFGvExZtxkFlA4zAxgKEahG9KE1ScBjpQnFsNOX8KTU5ojNru5ed5CVoJYXFtoxaq5nFbjQ==} + '@esbuild/aix-ppc64@0.25.4': + resolution: {integrity: sha512-1VCICWypeQKhVbE9oW/sJaAmjLxhVqacdkvPLEjwlttjfwENRSClS8EjBz0KzRyFSCPDIkuXW34Je/vk7zdB7Q==} engines: {node: '>=18'} cpu: [ppc64] os: [aix] - '@esbuild/android-arm64@0.25.1': - resolution: {integrity: sha512-50tM0zCJW5kGqgG7fQ7IHvQOcAn9TKiVRuQ/lN0xR+T2lzEFvAi1ZcS8DiksFcEpf1t/GYOeOfCAgDHFpkiSmA==} + '@esbuild/android-arm64@0.25.4': + resolution: {integrity: sha512-bBy69pgfhMGtCnwpC/x5QhfxAz/cBgQ9enbtwjf6V9lnPI/hMyT9iWpR1arm0l3kttTr4L0KSLpKmLp/ilKS9A==} engines: {node: '>=18'} cpu: [arm64] os: [android] - '@esbuild/android-arm@0.25.1': - resolution: {integrity: sha512-dp+MshLYux6j/JjdqVLnMglQlFu+MuVeNrmT5nk6q07wNhCdSnB7QZj+7G8VMUGh1q+vj2Bq8kRsuyA00I/k+Q==} + '@esbuild/android-arm@0.25.4': + resolution: {integrity: sha512-QNdQEps7DfFwE3hXiU4BZeOV68HHzYwGd0Nthhd3uCkkEKK7/R6MTgM0P7H7FAs5pU/DIWsviMmEGxEoxIZ+ZQ==} engines: {node: '>=18'} cpu: [arm] os: [android] - '@esbuild/android-x64@0.25.1': - resolution: {integrity: sha512-GCj6WfUtNldqUzYkN/ITtlhwQqGWu9S45vUXs7EIYf+7rCiiqH9bCloatO9VhxsL0Pji+PF4Lz2XXCES+Q8hDw==} + '@esbuild/android-x64@0.25.4': + resolution: {integrity: sha512-TVhdVtQIFuVpIIR282btcGC2oGQoSfZfmBdTip2anCaVYcqWlZXGcdcKIUklfX2wj0JklNYgz39OBqh2cqXvcQ==} engines: {node: '>=18'} cpu: [x64] os: [android] - '@esbuild/darwin-arm64@0.25.1': - resolution: {integrity: sha512-5hEZKPf+nQjYoSr/elb62U19/l1mZDdqidGfmFutVUjjUZrOazAtwK+Kr+3y0C/oeJfLlxo9fXb1w7L+P7E4FQ==} + '@esbuild/darwin-arm64@0.25.4': + resolution: {integrity: sha512-Y1giCfM4nlHDWEfSckMzeWNdQS31BQGs9/rouw6Ub91tkK79aIMTH3q9xHvzH8d0wDru5Ci0kWB8b3up/nl16g==} engines: {node: '>=18'} cpu: [arm64] os: [darwin] - '@esbuild/darwin-x64@0.25.1': - resolution: {integrity: sha512-hxVnwL2Dqs3fM1IWq8Iezh0cX7ZGdVhbTfnOy5uURtao5OIVCEyj9xIzemDi7sRvKsuSdtCAhMKarxqtlyVyfA==} + '@esbuild/darwin-x64@0.25.4': + resolution: {integrity: sha512-CJsry8ZGM5VFVeyUYB3cdKpd/H69PYez4eJh1W/t38vzutdjEjtP7hB6eLKBoOdxcAlCtEYHzQ/PJ/oU9I4u0A==} engines: {node: '>=18'} cpu: [x64] os: [darwin] - '@esbuild/freebsd-arm64@0.25.1': - resolution: {integrity: sha512-1MrCZs0fZa2g8E+FUo2ipw6jw5qqQiH+tERoS5fAfKnRx6NXH31tXBKI3VpmLijLH6yriMZsxJtaXUyFt/8Y4A==} + '@esbuild/freebsd-arm64@0.25.4': + resolution: {integrity: sha512-yYq+39NlTRzU2XmoPW4l5Ifpl9fqSk0nAJYM/V/WUGPEFfek1epLHJIkTQM6bBs1swApjO5nWgvr843g6TjxuQ==} engines: {node: '>=18'} cpu: [arm64] os: [freebsd] - '@esbuild/freebsd-x64@0.25.1': - resolution: {integrity: sha512-0IZWLiTyz7nm0xuIs0q1Y3QWJC52R8aSXxe40VUxm6BB1RNmkODtW6LHvWRrGiICulcX7ZvyH6h5fqdLu4gkww==} + '@esbuild/freebsd-x64@0.25.4': + resolution: {integrity: sha512-0FgvOJ6UUMflsHSPLzdfDnnBBVoCDtBTVyn/MrWloUNvq/5SFmh13l3dvgRPkDihRxb77Y17MbqbCAa2strMQQ==} engines: {node: '>=18'} cpu: [x64] os: [freebsd] - '@esbuild/linux-arm64@0.25.1': - resolution: {integrity: sha512-jaN3dHi0/DDPelk0nLcXRm1q7DNJpjXy7yWaWvbfkPvI+7XNSc/lDOnCLN7gzsyzgu6qSAmgSvP9oXAhP973uQ==} + '@esbuild/linux-arm64@0.25.4': + resolution: {integrity: sha512-+89UsQTfXdmjIvZS6nUnOOLoXnkUTB9hR5QAeLrQdzOSWZvNSAXAtcRDHWtqAUtAmv7ZM1WPOOeSxDzzzMogiQ==} engines: {node: '>=18'} cpu: [arm64] os: [linux] - '@esbuild/linux-arm@0.25.1': - resolution: {integrity: sha512-NdKOhS4u7JhDKw9G3cY6sWqFcnLITn6SqivVArbzIaf3cemShqfLGHYMx8Xlm/lBit3/5d7kXvriTUGa5YViuQ==} + '@esbuild/linux-arm@0.25.4': + resolution: {integrity: sha512-kro4c0P85GMfFYqW4TWOpvmF8rFShbWGnrLqlzp4X1TNWjRY3JMYUfDCtOxPKOIY8B0WC8HN51hGP4I4hz4AaQ==} engines: {node: '>=18'} cpu: [arm] os: [linux] - '@esbuild/linux-ia32@0.25.1': - resolution: {integrity: sha512-OJykPaF4v8JidKNGz8c/q1lBO44sQNUQtq1KktJXdBLn1hPod5rE/Hko5ugKKZd+D2+o1a9MFGUEIUwO2YfgkQ==} + '@esbuild/linux-ia32@0.25.4': + resolution: {integrity: sha512-yTEjoapy8UP3rv8dB0ip3AfMpRbyhSN3+hY8mo/i4QXFeDxmiYbEKp3ZRjBKcOP862Ua4b1PDfwlvbuwY7hIGQ==} engines: {node: '>=18'} cpu: [ia32] os: [linux] - '@esbuild/linux-loong64@0.25.1': - resolution: {integrity: sha512-nGfornQj4dzcq5Vp835oM/o21UMlXzn79KobKlcs3Wz9smwiifknLy4xDCLUU0BWp7b/houtdrgUz7nOGnfIYg==} + '@esbuild/linux-loong64@0.25.4': + resolution: {integrity: sha512-NeqqYkrcGzFwi6CGRGNMOjWGGSYOpqwCjS9fvaUlX5s3zwOtn1qwg1s2iE2svBe4Q/YOG1q6875lcAoQK/F4VA==} engines: {node: '>=18'} cpu: [loong64] os: [linux] - '@esbuild/linux-mips64el@0.25.1': - resolution: {integrity: sha512-1osBbPEFYwIE5IVB/0g2X6i1qInZa1aIoj1TdL4AaAb55xIIgbg8Doq6a5BzYWgr+tEcDzYH67XVnTmUzL+nXg==} + '@esbuild/linux-mips64el@0.25.4': + resolution: {integrity: sha512-IcvTlF9dtLrfL/M8WgNI/qJYBENP3ekgsHbYUIzEzq5XJzzVEV/fXY9WFPfEEXmu3ck2qJP8LG/p3Q8f7Zc2Xg==} engines: {node: '>=18'} cpu: [mips64el] os: [linux] - '@esbuild/linux-ppc64@0.25.1': - resolution: {integrity: sha512-/6VBJOwUf3TdTvJZ82qF3tbLuWsscd7/1w+D9LH0W/SqUgM5/JJD0lrJ1fVIfZsqB6RFmLCe0Xz3fmZc3WtyVg==} + '@esbuild/linux-ppc64@0.25.4': + resolution: {integrity: sha512-HOy0aLTJTVtoTeGZh4HSXaO6M95qu4k5lJcH4gxv56iaycfz1S8GO/5Jh6X4Y1YiI0h7cRyLi+HixMR+88swag==} engines: {node: '>=18'} cpu: [ppc64] os: [linux] - '@esbuild/linux-riscv64@0.25.1': - resolution: {integrity: sha512-nSut/Mx5gnilhcq2yIMLMe3Wl4FK5wx/o0QuuCLMtmJn+WeWYoEGDN1ipcN72g1WHsnIbxGXd4i/MF0gTcuAjQ==} + '@esbuild/linux-riscv64@0.25.4': + resolution: {integrity: sha512-i8JUDAufpz9jOzo4yIShCTcXzS07vEgWzyX3NH2G7LEFVgrLEhjwL3ajFE4fZI3I4ZgiM7JH3GQ7ReObROvSUA==} engines: {node: '>=18'} cpu: [riscv64] os: [linux] - '@esbuild/linux-s390x@0.25.1': - resolution: {integrity: sha512-cEECeLlJNfT8kZHqLarDBQso9a27o2Zd2AQ8USAEoGtejOrCYHNtKP8XQhMDJMtthdF4GBmjR2au3x1udADQQQ==} + '@esbuild/linux-s390x@0.25.4': + resolution: {integrity: sha512-jFnu+6UbLlzIjPQpWCNh5QtrcNfMLjgIavnwPQAfoGx4q17ocOU9MsQ2QVvFxwQoWpZT8DvTLooTvmOQXkO51g==} engines: {node: '>=18'} cpu: [s390x] os: [linux] - '@esbuild/linux-x64@0.25.1': - resolution: {integrity: sha512-xbfUhu/gnvSEg+EGovRc+kjBAkrvtk38RlerAzQxvMzlB4fXpCFCeUAYzJvrnhFtdeyVCDANSjJvOvGYoeKzFA==} + '@esbuild/linux-x64@0.25.4': + resolution: {integrity: sha512-6e0cvXwzOnVWJHq+mskP8DNSrKBr1bULBvnFLpc1KY+d+irZSgZ02TGse5FsafKS5jg2e4pbvK6TPXaF/A6+CA==} engines: {node: '>=18'} cpu: [x64] os: [linux] - '@esbuild/netbsd-arm64@0.25.1': - resolution: {integrity: sha512-O96poM2XGhLtpTh+s4+nP7YCCAfb4tJNRVZHfIE7dgmax+yMP2WgMd2OecBuaATHKTHsLWHQeuaxMRnCsH8+5g==} + '@esbuild/netbsd-arm64@0.25.4': + resolution: {integrity: sha512-vUnkBYxZW4hL/ie91hSqaSNjulOnYXE1VSLusnvHg2u3jewJBz3YzB9+oCw8DABeVqZGg94t9tyZFoHma8gWZQ==} engines: {node: '>=18'} cpu: [arm64] os: [netbsd] - '@esbuild/netbsd-x64@0.25.1': - resolution: {integrity: sha512-X53z6uXip6KFXBQ+Krbx25XHV/NCbzryM6ehOAeAil7X7oa4XIq+394PWGnwaSQ2WRA0KI6PUO6hTO5zeF5ijA==} + '@esbuild/netbsd-x64@0.25.4': + resolution: {integrity: sha512-XAg8pIQn5CzhOB8odIcAm42QsOfa98SBeKUdo4xa8OvX8LbMZqEtgeWE9P/Wxt7MlG2QqvjGths+nq48TrUiKw==} engines: {node: '>=18'} cpu: [x64] os: [netbsd] - '@esbuild/openbsd-arm64@0.25.1': - resolution: {integrity: sha512-Na9T3szbXezdzM/Kfs3GcRQNjHzM6GzFBeU1/6IV/npKP5ORtp9zbQjvkDJ47s6BCgaAZnnnu/cY1x342+MvZg==} + '@esbuild/openbsd-arm64@0.25.4': + resolution: {integrity: sha512-Ct2WcFEANlFDtp1nVAXSNBPDxyU+j7+tId//iHXU2f/lN5AmO4zLyhDcpR5Cz1r08mVxzt3Jpyt4PmXQ1O6+7A==} engines: {node: '>=18'} cpu: [arm64] os: [openbsd] - '@esbuild/openbsd-x64@0.25.1': - resolution: {integrity: sha512-T3H78X2h1tszfRSf+txbt5aOp/e7TAz3ptVKu9Oyir3IAOFPGV6O9c2naym5TOriy1l0nNf6a4X5UXRZSGX/dw==} + '@esbuild/openbsd-x64@0.25.4': + resolution: {integrity: sha512-xAGGhyOQ9Otm1Xu8NT1ifGLnA6M3sJxZ6ixylb+vIUVzvvd6GOALpwQrYrtlPouMqd/vSbgehz6HaVk4+7Afhw==} engines: {node: '>=18'} cpu: [x64] os: [openbsd] - '@esbuild/sunos-x64@0.25.1': - resolution: {integrity: sha512-2H3RUvcmULO7dIE5EWJH8eubZAI4xw54H1ilJnRNZdeo8dTADEZ21w6J22XBkXqGJbe0+wnNJtw3UXRoLJnFEg==} + '@esbuild/sunos-x64@0.25.4': + resolution: {integrity: sha512-Mw+tzy4pp6wZEK0+Lwr76pWLjrtjmJyUB23tHKqEDP74R3q95luY/bXqXZeYl4NYlvwOqoRKlInQialgCKy67Q==} engines: {node: '>=18'} cpu: [x64] os: [sunos] - '@esbuild/win32-arm64@0.25.1': - resolution: {integrity: sha512-GE7XvrdOzrb+yVKB9KsRMq+7a2U/K5Cf/8grVFRAGJmfADr/e/ODQ134RK2/eeHqYV5eQRFxb1hY7Nr15fv1NQ==} + '@esbuild/win32-arm64@0.25.4': + resolution: {integrity: sha512-AVUP428VQTSddguz9dO9ngb+E5aScyg7nOeJDrF1HPYu555gmza3bDGMPhmVXL8svDSoqPCsCPjb265yG/kLKQ==} engines: {node: '>=18'} cpu: [arm64] os: [win32] - '@esbuild/win32-ia32@0.25.1': - resolution: {integrity: sha512-uOxSJCIcavSiT6UnBhBzE8wy3n0hOkJsBOzy7HDAuTDE++1DJMRRVCPGisULScHL+a/ZwdXPpXD3IyFKjA7K8A==} + '@esbuild/win32-ia32@0.25.4': + resolution: {integrity: sha512-i1sW+1i+oWvQzSgfRcxxG2k4I9n3O9NRqy8U+uugaT2Dy7kLO9Y7wI72haOahxceMX8hZAzgGou1FhndRldxRg==} engines: {node: '>=18'} cpu: [ia32] os: [win32] - '@esbuild/win32-x64@0.25.1': - resolution: {integrity: sha512-Y1EQdcfwMSeQN/ujR5VayLOJ1BHaK+ssyk0AEzPjC+t1lITgsnccPqFjb6V+LsTp/9Iov4ysfjxLaGJ9RPtkVg==} + '@esbuild/win32-x64@0.25.4': + resolution: {integrity: sha512-nOT2vZNw6hJ+z43oP1SPea/G/6AbN6X+bGNhNuq8NtRHy4wsMhw765IKLNmnjek7GvjWBYQ8Q5VBoYTFg9y1UQ==} engines: {node: '>=18'} cpu: [x64] os: [win32] - '@eslint-community/eslint-utils@4.5.1': - resolution: {integrity: sha512-soEIOALTfTK6EjmKMMoLugwaP0rzkad90iIWd1hMO9ARkSAyjfMfkRRhLvD5qH7vvM0Cg72pieUfR6yh6XxC4w==} + '@eslint-community/eslint-utils@4.7.0': + resolution: {integrity: sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 @@ -518,32 +518,32 @@ packages: resolution: {integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - '@eslint/config-array@0.19.2': - resolution: {integrity: sha512-GNKqxfHG2ySmJOBSHg7LxeUx4xpuCoFjacmlCoYWEbaPXLwvfIjixRI12xCQZeULksQb23uiA8F40w5TojpV7w==} + '@eslint/config-array@0.20.0': + resolution: {integrity: sha512-fxlS1kkIjx8+vy2SjuCB94q3htSNrufYTXubwiBFeaQHbH6Ipi43gFJq2zCMt6PHhImH3Xmr0NksKDvchWlpQQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/config-helpers@0.1.0': - resolution: {integrity: sha512-kLrdPDJE1ckPo94kmPPf9Hfd0DU0Jw6oKYrhe+pwSC0iTUInmTa+w6fw8sGgcfkFJGNdWOUeOaDM4quW4a7OkA==} + '@eslint/config-helpers@0.2.2': + resolution: {integrity: sha512-+GPzk8PlG0sPpzdU5ZvIRMPidzAnZDl/s9L+y13iodqvb8leL53bTannOrQ/Im7UkpsmFU5Ily5U60LWixnmLg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/core@0.12.0': - resolution: {integrity: sha512-cmrR6pytBuSMTaBweKoGMwu3EiHiEC+DoyupPmlZ0HxBJBtIxwe+j/E4XPIKNx+Q74c8lXKPwYawBf5glsTkHg==} + '@eslint/core@0.13.0': + resolution: {integrity: sha512-yfkgDw1KR66rkT5A8ci4irzDysN7FRpq3ttJolR88OqQikAWqwA8j5VZyas+vjyBNFIJ7MfybJ9plMILI2UrCw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/eslintrc@3.3.0': - resolution: {integrity: sha512-yaVPAiNAalnCZedKLdR21GOGILMLKPyqSLWaAjQFvYA2i/ciDi8ArYVr69Anohb6cH2Ukhqti4aFnYyPm8wdwQ==} + '@eslint/eslintrc@3.3.1': + resolution: {integrity: sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/js@9.22.0': - resolution: {integrity: sha512-vLFajx9o8d1/oL2ZkpMYbkLv8nDB6yaIwFNt7nI4+I80U/z03SxmfOMsLbvWr3p7C+Wnoh//aOu2pQW8cS0HCQ==} + '@eslint/js@9.26.0': + resolution: {integrity: sha512-I9XlJawFdSMvWjDt6wksMCrgns5ggLNfFwFvnShsleWruvXM514Qxk8V246efTw+eo9JABvVz+u3q2RiAowKxQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@eslint/object-schema@2.1.6': resolution: {integrity: sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/plugin-kit@0.2.7': - resolution: {integrity: sha512-JubJ5B2pJ4k4yGxaNLdbjrnk9d/iDz6/q8wOilpIowd6PJPgaxCuHBnBszq7Ce2TyMrywm5r4PnKm6V3iiZF+g==} + '@eslint/plugin-kit@0.2.8': + resolution: {integrity: sha512-ZAoA40rNMPwSm+AeHpCq8STiNAwzWLJuP8Xv4CHIc9wv/PSuExjMrmjfYNj682vW0OOiZ1HKxzvjQr9XZIisQA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@fastify/ajv-compiler@4.0.2': @@ -552,8 +552,8 @@ packages: '@fastify/error@4.1.0': resolution: {integrity: sha512-KeFcciOr1eo/YvIXHP65S94jfEEqn1RxTRBT1aJaHxY5FK0/GDXYozsQMMWlZoHgi8i0s+YtrLsgj/JkUUjSkQ==} - '@fastify/fast-json-stringify-compiler@5.0.2': - resolution: {integrity: sha512-YdR7gqlLg1xZAQa+SX4sMNzQHY5pC54fu9oC5aYSUqBhyn6fkLkrdtKlpVdCNPlwuUuXA1PjFTEmvMF6ZVXVGw==} + '@fastify/fast-json-stringify-compiler@5.0.3': + resolution: {integrity: sha512-uik7yYHkLr6fxd8hJSZ8c+xF4WafPK+XzneQDPU+D10r5X19GW8lJcom2YijX2+qtFF1ENJlHXKFM9ouXNJYgQ==} '@fastify/forwarded@3.0.0': resolution: {integrity: sha512-kJExsp4JCms7ipzg7SJ3y8DwmePaELHxKYtg+tZow+k0znUTf3cb+npgyqm8+ATZOdmfgfydIebPDWM172wfyA==} @@ -564,11 +564,11 @@ packages: '@fastify/proxy-addr@5.0.0': resolution: {integrity: sha512-37qVVA1qZ5sgH7KpHkkC4z9SK6StIsIcOmpjvMPXNb3vx2GQxhZocogVYbr2PbbeLCQxYIPDok307xEvRZOzGA==} - '@floating-ui/core@1.6.9': - resolution: {integrity: sha512-uMXCuQ3BItDUbAMhIXw7UPXRfAlOAvZzdK9BWpE60MCn+Svt3aLn9jsPTi/WNGlRUu2uI0v5S7JiIUsbsvh3fw==} + '@floating-ui/core@1.7.0': + resolution: {integrity: sha512-FRdBLykrPPA6P76GGGqlex/e7fbe0F1ykgxHYNXQsH/iTEtjMj/f9bpY5oQqbjt5VgZvgz/uKXbGuROijh3VLA==} - '@floating-ui/dom@1.6.13': - resolution: {integrity: sha512-umqzocjDgNRGTuO7Q8CU32dkHkECqI8ZdMZ5Swb6QAM0t5rnlrN3lGo1hdpscRd3WS8T6DKYK4ephgIH9iRh3w==} + '@floating-ui/dom@1.7.0': + resolution: {integrity: sha512-lGTor4VlXcesUMh1cupTUTDoCxMb0V6bm3CnxHzQcw8Eaf1jQbgQX4i02fYgT0vJ82tb5MZ4CZk1LRGkktJCzg==} '@floating-ui/react-dom@2.1.2': resolution: {integrity: sha512-06okr5cgPzMNBy+Ycse2A6udMi4bqwW/zgBF/rwjcNqWkyr82Mcg8b0vjX8OJpZFy/FKjJmw6wV7t44kK6kW7A==} @@ -585,11 +585,11 @@ packages: '@floating-ui/utils@0.2.9': resolution: {integrity: sha512-MDWhGtE+eHw5JW7lq4qhc5yRLS11ERl1c7Z6Xd0a58DozHES6EnNNwUWbMiG4J9Cgj053Bhk8zvlhFYKVhULwg==} - '@formatjs/intl-localematcher@0.6.0': - resolution: {integrity: sha512-4rB4g+3hESy1bHSBG3tDFaMY2CH67iT7yne1e+0CLTsGLDcmoEWWpJjjpWVaYgYfYuohIRuo0E+N536gd2ZHZA==} + '@formatjs/intl-localematcher@0.6.1': + resolution: {integrity: sha512-ePEgLgVCqi2BBFnTMWPfIghu6FkbZnnBVhO2sSxvLfrdFw7wCHAHiDoM2h4NRgjbaY7+B7HgOLZGkK187pZTZg==} - '@headlessui/react@2.2.0': - resolution: {integrity: sha512-RzCEg+LXsuI7mHiSomsu/gBJSjpupm6A1qIZ5sWjd7JhARNlMiSA4kKfJpCKwU9tE+zMRterhhrP74PvfJrpXQ==} + '@headlessui/react@2.2.3': + resolution: {integrity: sha512-hgOJGXPifPlOczIeSwX8OjLWRJ5XdYApZFf7DeCbCrO1PXHkPhNTRrA9ZwJsgAG7SON1i2JcvIreF/kbgtJeaQ==} engines: {node: '>=10'} peerDependencies: react: ^18 || ^19 || ^19.0.0-rc @@ -611,8 +611,8 @@ packages: resolution: {integrity: sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==} engines: {node: '>=18.18'} - '@humanwhocodes/retry@0.4.2': - resolution: {integrity: sha512-xeO57FpIu4p1Ri3Jq/EXq4ClRm86dVF2z/+kvFnyqVYRavTZmaFaUBbWCOuuTh0o/g7DSsk6kc2vrS4Vl5oPOQ==} + '@humanwhocodes/retry@0.4.3': + resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==} engines: {node: '>=18.18'} '@iconify/types@2.0.0': @@ -621,107 +621,112 @@ packages: '@iconify/utils@2.3.0': resolution: {integrity: sha512-GmQ78prtwYW6EtzXRU1rY+KwOKfz32PD7iJh6Iyqw68GiKuoZ2A6pRtzWONz5VQJbp50mEjXh/7NkumtrAgRKA==} - '@img/sharp-darwin-arm64@0.33.5': - resolution: {integrity: sha512-UT4p+iz/2H4twwAoLCqfA9UH5pI6DggwKEGuaPy7nCVQ8ZsiY5PIcrRvD1DzuY3qYL07NtIQcWnBSY/heikIFQ==} + '@img/sharp-darwin-arm64@0.34.1': + resolution: {integrity: sha512-pn44xgBtgpEbZsu+lWf2KNb6OAf70X68k+yk69Ic2Xz11zHR/w24/U49XT7AeRwJ0Px+mhALhU5LPci1Aymk7A==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm64] os: [darwin] - '@img/sharp-darwin-x64@0.33.5': - resolution: {integrity: sha512-fyHac4jIc1ANYGRDxtiqelIbdWkIuQaI84Mv45KvGRRxSAa7o7d1ZKAOBaYbnepLC1WqxfpimdeWfvqqSGwR2Q==} + '@img/sharp-darwin-x64@0.34.1': + resolution: {integrity: sha512-VfuYgG2r8BpYiOUN+BfYeFo69nP/MIwAtSJ7/Zpxc5QF3KS22z8Pvg3FkrSFJBPNQ7mmcUcYQFBmEQp7eu1F8Q==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [darwin] - '@img/sharp-libvips-darwin-arm64@1.0.4': - resolution: {integrity: sha512-XblONe153h0O2zuFfTAbQYAX2JhYmDHeWikp1LM9Hul9gVPjFY427k6dFEcOL72O01QxQsWi761svJ/ev9xEDg==} + '@img/sharp-libvips-darwin-arm64@1.1.0': + resolution: {integrity: sha512-HZ/JUmPwrJSoM4DIQPv/BfNh9yrOA8tlBbqbLz4JZ5uew2+o22Ik+tHQJcih7QJuSa0zo5coHTfD5J8inqj9DA==} cpu: [arm64] os: [darwin] - '@img/sharp-libvips-darwin-x64@1.0.4': - resolution: {integrity: sha512-xnGR8YuZYfJGmWPvmlunFaWJsb9T/AO2ykoP3Fz/0X5XV2aoYBPkX6xqCQvUTKKiLddarLaxpzNe+b1hjeWHAQ==} + '@img/sharp-libvips-darwin-x64@1.1.0': + resolution: {integrity: sha512-Xzc2ToEmHN+hfvsl9wja0RlnXEgpKNmftriQp6XzY/RaSfwD9th+MSh0WQKzUreLKKINb3afirxW7A0fz2YWuQ==} cpu: [x64] os: [darwin] - '@img/sharp-libvips-linux-arm64@1.0.4': - resolution: {integrity: sha512-9B+taZ8DlyyqzZQnoeIvDVR/2F4EbMepXMc/NdVbkzsJbzkUjhXv/70GQJ7tdLA4YJgNP25zukcxpX2/SueNrA==} + '@img/sharp-libvips-linux-arm64@1.1.0': + resolution: {integrity: sha512-IVfGJa7gjChDET1dK9SekxFFdflarnUB8PwW8aGwEoF3oAsSDuNUTYS+SKDOyOJxQyDC1aPFMuRYLoDInyV9Ew==} cpu: [arm64] os: [linux] - '@img/sharp-libvips-linux-arm@1.0.5': - resolution: {integrity: sha512-gvcC4ACAOPRNATg/ov8/MnbxFDJqf/pDePbBnuBDcjsI8PssmjoKMAz4LtLaVi+OnSb5FK/yIOamqDwGmXW32g==} + '@img/sharp-libvips-linux-arm@1.1.0': + resolution: {integrity: sha512-s8BAd0lwUIvYCJyRdFqvsj+BJIpDBSxs6ivrOPm/R7piTs5UIwY5OjXrP2bqXC9/moGsyRa37eYWYCOGVXxVrA==} cpu: [arm] os: [linux] - '@img/sharp-libvips-linux-s390x@1.0.4': - resolution: {integrity: sha512-u7Wz6ntiSSgGSGcjZ55im6uvTrOxSIS8/dgoVMoiGE9I6JAfU50yH5BoDlYA1tcuGS7g/QNtetJnxA6QEsCVTA==} + '@img/sharp-libvips-linux-ppc64@1.1.0': + resolution: {integrity: sha512-tiXxFZFbhnkWE2LA8oQj7KYR+bWBkiV2nilRldT7bqoEZ4HiDOcePr9wVDAZPi/Id5fT1oY9iGnDq20cwUz8lQ==} + cpu: [ppc64] + os: [linux] + + '@img/sharp-libvips-linux-s390x@1.1.0': + resolution: {integrity: sha512-xukSwvhguw7COyzvmjydRb3x/09+21HykyapcZchiCUkTThEQEOMtBj9UhkaBRLuBrgLFzQ2wbxdeCCJW/jgJA==} cpu: [s390x] os: [linux] - '@img/sharp-libvips-linux-x64@1.0.4': - resolution: {integrity: sha512-MmWmQ3iPFZr0Iev+BAgVMb3ZyC4KeFc3jFxnNbEPas60e1cIfevbtuyf9nDGIzOaW9PdnDciJm+wFFaTlj5xYw==} + '@img/sharp-libvips-linux-x64@1.1.0': + resolution: {integrity: sha512-yRj2+reB8iMg9W5sULM3S74jVS7zqSzHG3Ol/twnAAkAhnGQnpjj6e4ayUz7V+FpKypwgs82xbRdYtchTTUB+Q==} cpu: [x64] os: [linux] - '@img/sharp-libvips-linuxmusl-arm64@1.0.4': - resolution: {integrity: sha512-9Ti+BbTYDcsbp4wfYib8Ctm1ilkugkA/uscUn6UXK1ldpC1JjiXbLfFZtRlBhjPZ5o1NCLiDbg8fhUPKStHoTA==} + '@img/sharp-libvips-linuxmusl-arm64@1.1.0': + resolution: {integrity: sha512-jYZdG+whg0MDK+q2COKbYidaqW/WTz0cc1E+tMAusiDygrM4ypmSCjOJPmFTvHHJ8j/6cAGyeDWZOsK06tP33w==} cpu: [arm64] os: [linux] - '@img/sharp-libvips-linuxmusl-x64@1.0.4': - resolution: {integrity: sha512-viYN1KX9m+/hGkJtvYYp+CCLgnJXwiQB39damAO7WMdKWlIhmYTfHjwSbQeUK/20vY154mwezd9HflVFM1wVSw==} + '@img/sharp-libvips-linuxmusl-x64@1.1.0': + resolution: {integrity: sha512-wK7SBdwrAiycjXdkPnGCPLjYb9lD4l6Ze2gSdAGVZrEL05AOUJESWU2lhlC+Ffn5/G+VKuSm6zzbQSzFX/P65A==} cpu: [x64] os: [linux] - '@img/sharp-linux-arm64@0.33.5': - resolution: {integrity: sha512-JMVv+AMRyGOHtO1RFBiJy/MBsgz0x4AWrT6QoEVVTyh1E39TrCUpTRI7mx9VksGX4awWASxqCYLCV4wBZHAYxA==} + '@img/sharp-linux-arm64@0.34.1': + resolution: {integrity: sha512-kX2c+vbvaXC6vly1RDf/IWNXxrlxLNpBVWkdpRq5Ka7OOKj6nr66etKy2IENf6FtOgklkg9ZdGpEu9kwdlcwOQ==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm64] os: [linux] - '@img/sharp-linux-arm@0.33.5': - resolution: {integrity: sha512-JTS1eldqZbJxjvKaAkxhZmBqPRGmxgu+qFKSInv8moZ2AmT5Yib3EQ1c6gp493HvrvV8QgdOXdyaIBrhvFhBMQ==} + '@img/sharp-linux-arm@0.34.1': + resolution: {integrity: sha512-anKiszvACti2sGy9CirTlNyk7BjjZPiML1jt2ZkTdcvpLU1YH6CXwRAZCA2UmRXnhiIftXQ7+Oh62Ji25W72jA==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm] os: [linux] - '@img/sharp-linux-s390x@0.33.5': - resolution: {integrity: sha512-y/5PCd+mP4CA/sPDKl2961b+C9d+vPAveS33s6Z3zfASk2j5upL6fXVPZi7ztePZ5CuH+1kW8JtvxgbuXHRa4Q==} + '@img/sharp-linux-s390x@0.34.1': + resolution: {integrity: sha512-7s0KX2tI9mZI2buRipKIw2X1ufdTeaRgwmRabt5bi9chYfhur+/C1OXg3TKg/eag1W+6CCWLVmSauV1owmRPxA==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [s390x] os: [linux] - '@img/sharp-linux-x64@0.33.5': - resolution: {integrity: sha512-opC+Ok5pRNAzuvq1AG0ar+1owsu842/Ab+4qvU879ippJBHvyY5n2mxF1izXqkPYlGuP/M556uh53jRLJmzTWA==} + '@img/sharp-linux-x64@0.34.1': + resolution: {integrity: sha512-wExv7SH9nmoBW3Wr2gvQopX1k8q2g5V5Iag8Zk6AVENsjwd+3adjwxtp3Dcu2QhOXr8W9NusBU6XcQUohBZ5MA==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [linux] - '@img/sharp-linuxmusl-arm64@0.33.5': - resolution: {integrity: sha512-XrHMZwGQGvJg2V/oRSUfSAfjfPxO+4DkiRh6p2AFjLQztWUuY/o8Mq0eMQVIY7HJ1CDQUJlxGGZRw1a5bqmd1g==} + '@img/sharp-linuxmusl-arm64@0.34.1': + resolution: {integrity: sha512-DfvyxzHxw4WGdPiTF0SOHnm11Xv4aQexvqhRDAoD00MzHekAj9a/jADXeXYCDFH/DzYruwHbXU7uz+H+nWmSOQ==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm64] os: [linux] - '@img/sharp-linuxmusl-x64@0.33.5': - resolution: {integrity: sha512-WT+d/cgqKkkKySYmqoZ8y3pxx7lx9vVejxW/W4DOFMYVSkErR+w7mf2u8m/y4+xHe7yY9DAXQMWQhpnMuFfScw==} + '@img/sharp-linuxmusl-x64@0.34.1': + resolution: {integrity: sha512-pax/kTR407vNb9qaSIiWVnQplPcGU8LRIJpDT5o8PdAx5aAA7AS3X9PS8Isw1/WfqgQorPotjrZL3Pqh6C5EBg==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [linux] - '@img/sharp-wasm32@0.33.5': - resolution: {integrity: sha512-ykUW4LVGaMcU9lu9thv85CbRMAwfeadCJHRsg2GmeRa/cJxsVY9Rbd57JcMxBkKHag5U/x7TSBpScF4U8ElVzg==} + '@img/sharp-wasm32@0.34.1': + resolution: {integrity: sha512-YDybQnYrLQfEpzGOQe7OKcyLUCML4YOXl428gOOzBgN6Gw0rv8dpsJ7PqTHxBnXnwXr8S1mYFSLSa727tpz0xg==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [wasm32] - '@img/sharp-win32-ia32@0.33.5': - resolution: {integrity: sha512-T36PblLaTwuVJ/zw/LaH0PdZkRz5rd3SmMHX8GSmR7vtNSP5Z6bQkExdSK7xGWyxLw4sUknBuugTelgw2faBbQ==} + '@img/sharp-win32-ia32@0.34.1': + resolution: {integrity: sha512-WKf/NAZITnonBf3U1LfdjoMgNO5JYRSlhovhRhMxXVdvWYveM4kM3L8m35onYIdh75cOMCo1BexgVQcCDzyoWw==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [ia32] os: [win32] - '@img/sharp-win32-x64@0.33.5': - resolution: {integrity: sha512-MpY/o8/8kj+EcnxwvrP4aTJSWw/aZ7JIGR4aBeZkZw5B7/Jn+tY9/VNwtcoGmdT7GfggGIU4kygOMSbYnOrAbg==} + '@img/sharp-win32-x64@0.34.1': + resolution: {integrity: sha512-hw1iIAHpNE8q3uMIRCgGOeDoz9KtFNarFLQclLxr/LK1VBkj8nby18RjFvr6aP7USRYAjTZW6yisnBWMX571Tw==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [win32] @@ -742,8 +747,12 @@ packages: '@mdx-js/mdx@3.1.0': resolution: {integrity: sha512-/QxEhPAvGwbQmy1Px8F899L5Uc2KZ6JtXwlCgJmjSTBedwOZkByYcBG4GceIGPXRDsmfxhHazuS+hlOShRLeDw==} - '@mermaid-js/parser@0.3.0': - resolution: {integrity: sha512-HsvL6zgE5sUPGgkIDlmAWR1HTNHz2Iy11BAWPTa4Jjabkpguy4Ze2gzfLrg6pdRuBvFwgUYyxiaNqZwrEEXepA==} + '@mermaid-js/parser@0.4.0': + resolution: {integrity: sha512-wla8XOWvQAwuqy+gxiZqY+c7FokraOTHRWMsbB4AgRx9Sy7zKslNyejy7E+a77qHfey5GXw/ik3IXv/NHMJgaA==} + + '@modelcontextprotocol/sdk@1.11.3': + resolution: {integrity: sha512-rmOWVRUbUJD7iSvJugjUbFZshTAuJ48MXoZ80Osx1GM0K/H1w7rSEvmw8m6vdWxNASgtaHIhAgre4H/E9GJiYQ==} + engines: {node: '>=18'} '@napi-rs/simple-git-android-arm-eabi@0.1.19': resolution: {integrity: sha512-XryEH/hadZ4Duk/HS/HC/cA1j0RHmqUGey3MsCf65ZS0VrWMqChXM/xlTPWuY5jfCc/rPubHaqI7DZlbexnX/g==} @@ -833,59 +842,59 @@ packages: resolution: {integrity: sha512-jMxvwzkKzd3cXo2EB9GM2ic0eYo2rP/BS6gJt6HnWbsDO1O8GSD4k7o2Cpr2YERtMpGF/MGcDfsfj2EbQPtrXw==} engines: {node: '>= 10'} - '@napi-rs/wasm-runtime@0.2.7': - resolution: {integrity: sha512-5yximcFK5FNompXfJFoWanu5l8v1hNGqNHh9du1xETp9HWk/B/PzvchX55WYOPaIeNglG8++68AAiauBAtbnzw==} + '@napi-rs/wasm-runtime@0.2.9': + resolution: {integrity: sha512-OKRBiajrrxB9ATokgEQoG87Z25c67pCpYcCwmXYX8PBftC9pBfN18gnm/fh1wurSLEKIAt+QRFLFCQISrb66Jg==} - '@next/env@15.3.0-canary.16': - resolution: {integrity: sha512-/0zjOXv7h+5vhts1DMxqiH8k0zoGgmv5cJTEmkM0UZUtHYSrODLsCqax8rDBGpKtdUZ/2hLAaFafq2r91jgpAg==} + '@next/env@15.3.2': + resolution: {integrity: sha512-xURk++7P7qR9JG1jJtLzPzf0qEvqCN0A/T3DXf8IPMKo9/6FfjxtEffRJIIew/bIL4T3C2jLLqBor8B/zVlx6g==} - '@next/eslint-plugin-next@15.3.0-canary.16': - resolution: {integrity: sha512-lJt5bvb4YpWOX2gtTEX5yi5IHPDdRItGSdFcI7gZj+rjonv63etWBZZZ4oy6kYLBIdpLPcXBGCjlbRlMrzk7fg==} + '@next/eslint-plugin-next@15.3.2': + resolution: {integrity: sha512-ijVRTXBgnHT33aWnDtmlG+LJD+5vhc9AKTJPquGG5NKXjpKNjc62woIhFtrAcWdBobt8kqjCoaJ0q6sDQoX7aQ==} - '@next/swc-darwin-arm64@15.3.0-canary.16': - resolution: {integrity: sha512-DAXsgvmaBQ+mBHtf78OqJugQJfAa4q7ApukIJw3X+Jk0XyRiOzi1lWj+GA4BjYdvKx5DoXPn7x9avWau9DW/mw==} + '@next/swc-darwin-arm64@15.3.2': + resolution: {integrity: sha512-2DR6kY/OGcokbnCsjHpNeQblqCZ85/1j6njYSkzRdpLn5At7OkSdmk7WyAmB9G0k25+VgqVZ/u356OSoQZ3z0g==} engines: {node: '>= 10'} cpu: [arm64] os: [darwin] - '@next/swc-darwin-x64@15.3.0-canary.16': - resolution: {integrity: sha512-gs3wA8nixwddKvjQuUh8Ofgey+NDXyckV9B/XY/rG7tvXkphlsvh3gIiaGxPZ9CCaw65dY1umXceuQg9GRFP8Q==} + '@next/swc-darwin-x64@15.3.2': + resolution: {integrity: sha512-ro/fdqaZWL6k1S/5CLv1I0DaZfDVJkWNaUU3un8Lg6m0YENWlDulmIWzV96Iou2wEYyEsZq51mwV8+XQXqMp3w==} engines: {node: '>= 10'} cpu: [x64] os: [darwin] - '@next/swc-linux-arm64-gnu@15.3.0-canary.16': - resolution: {integrity: sha512-mjpULvzvhn2h3q4KOfX5w7jYmfrmJESlfNW8QsadDHTPbPnDJ42NSX/4LhdKVP9zULV6Mg9aEBHm5FkT4vXREA==} + '@next/swc-linux-arm64-gnu@15.3.2': + resolution: {integrity: sha512-covwwtZYhlbRWK2HlYX9835qXum4xYZ3E2Mra1mdQ+0ICGoMiw1+nVAn4d9Bo7R3JqSmK1grMq/va+0cdh7bJA==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - '@next/swc-linux-arm64-musl@15.3.0-canary.16': - resolution: {integrity: sha512-hRTdOY7RAnkY3/q2tgrrYCcblNm6I1osoBB0SxeLRpHLJERelUXfYPgcUllB8EWbfAiIaXEtCyxm0FiuMa8WiA==} + '@next/swc-linux-arm64-musl@15.3.2': + resolution: {integrity: sha512-KQkMEillvlW5Qk5mtGA/3Yz0/tzpNlSw6/3/ttsV1lNtMuOHcGii3zVeXZyi4EJmmLDKYcTcByV2wVsOhDt/zg==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - '@next/swc-linux-x64-gnu@15.3.0-canary.16': - resolution: {integrity: sha512-vbhe6OL1BPuMTnDkRaXM5y32vdzW262N0EazKrqrJ56acuqOBNjgBAwsMJqQMcCRiXPrcvJAtzJOunFb897BXw==} + '@next/swc-linux-x64-gnu@15.3.2': + resolution: {integrity: sha512-uRBo6THWei0chz+Y5j37qzx+BtoDRFIkDzZjlpCItBRXyMPIg079eIkOCl3aqr2tkxL4HFyJ4GHDes7W8HuAUg==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - '@next/swc-linux-x64-musl@15.3.0-canary.16': - resolution: {integrity: sha512-khbFaZ+kzWa8Om+PHOiqeKw3On5akmcM8cgY0F2ucBPHwsQhITXkNpOGMcPkZnB0MCnxak56andyV3FfZCYo8Q==} + '@next/swc-linux-x64-musl@15.3.2': + resolution: {integrity: sha512-+uxFlPuCNx/T9PdMClOqeE8USKzj8tVz37KflT3Kdbx/LOlZBRI2yxuIcmx1mPNK8DwSOMNCr4ureSet7eyC0w==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - '@next/swc-win32-arm64-msvc@15.3.0-canary.16': - resolution: {integrity: sha512-JE2GRrvTluApQbesaj2+hxn0ADzRI/4vDHoHf1tfAHi9nYqKNw5CshIKXbA7Y1bffqBa0EhmqtdOcULu7g2jjw==} + '@next/swc-win32-arm64-msvc@15.3.2': + resolution: {integrity: sha512-LLTKmaI5cfD8dVzh5Vt7+OMo+AIOClEdIU/TSKbXXT2iScUTSxOGoBhfuv+FU8R9MLmrkIL1e2fBMkEEjYAtPQ==} engines: {node: '>= 10'} cpu: [arm64] os: [win32] - '@next/swc-win32-x64-msvc@15.3.0-canary.16': - resolution: {integrity: sha512-Zid8KU7eUGIzOy/REV67vny0d48DLppK7OSqY6pJlSfrdQ/k6RuJell/9jTWE3aAS/7M4Aru+HR930vfM+T99Q==} + '@next/swc-win32-x64-msvc@15.3.2': + resolution: {integrity: sha512-aW5B8wOPioJ4mBdMDXkt5f3j8pUr9W8AnlX0Df35uRWNT1Y6RIybxjnSUe+PhM+M1bwgyY8PHLmXZC6zT1o5tA==} engines: {node: '>= 10'} cpu: [x64] os: [win32] @@ -955,12 +964,12 @@ packages: resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} engines: {node: '>=14'} - '@pkgr/core@0.1.2': - resolution: {integrity: sha512-fdDH1LSGfZdTH2sxdpVMw31BanV28K/Gry0cVFxaNP77neJSkd82mM8ErPNYs9e+0O7SdHBLTDzDgwUuy18RnQ==} + '@pkgr/core@0.2.4': + resolution: {integrity: sha512-ROFF39F6ZrnzSUEmQQZUar0Jt4xVoP9WnDRdWwF4NNcXs3xBTLgBUDoOwW141y1jP+S8nahIbdxbFC7IShw9Iw==} engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} - '@playwright/test@1.51.1': - resolution: {integrity: sha512-nM+kEaTSAoVlXmMPH10017vn3FSiFqr/bh4fKg9vmAdMfd9SDqRZNvPSiAHADc/itWak+qPvMPZQOPwCBW7k7Q==} + '@playwright/test@1.52.0': + resolution: {integrity: sha512-uh6W7sb55hl7D6vsAeA+V2p5JnlAqzhqFyF0VcJkKZXkgnFcVG9PziERRHQfPLfNGx1C292a4JqbWzhR8L4R1g==} engines: {node: '>=18'} hasBin: true @@ -978,40 +987,40 @@ packages: '@pm2/pm2-version-check@1.0.4': resolution: {integrity: sha512-SXsM27SGH3yTWKc2fKR4SYNxsmnvuBQ9dd6QHtEWmiZ/VqaOYPAIlS8+vMcn27YLtAEBGvNRSh3TPNvtjZgfqA==} - '@react-aria/focus@3.20.1': - resolution: {integrity: sha512-lgYs+sQ1TtBrAXnAdRBQrBo0/7o5H6IrfDxec1j+VRpcXL0xyk0xPq+m3lZp8typzIghqDgpnKkJ5Jf4OrzPIw==} + '@react-aria/focus@3.20.2': + resolution: {integrity: sha512-Q3rouk/rzoF/3TuH6FzoAIKrl+kzZi9LHmr8S5EqLAOyP9TXIKG34x2j42dZsAhrw7TbF9gA8tBKwnCNH4ZV+Q==} peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - '@react-aria/interactions@3.24.1': - resolution: {integrity: sha512-OWEcIC6UQfWq4Td5Ptuh4PZQ4LHLJr/JL2jGYvuNL6EgL3bWvzPrRYIF/R64YbfVxIC7FeZpPSkS07sZ93/NoA==} + '@react-aria/interactions@3.25.0': + resolution: {integrity: sha512-GgIsDLlO8rDU/nFn6DfsbP9rfnzhm8QFjZkB9K9+r+MTSCn7bMntiWQgMM+5O6BiA8d7C7x4zuN4bZtc0RBdXQ==} peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - '@react-aria/ssr@3.9.7': - resolution: {integrity: sha512-GQygZaGlmYjmYM+tiNBA5C6acmiDWF52Nqd40bBp0Znk4M4hP+LTmI0lpI1BuKMw45T8RIhrAsICIfKwZvi2Gg==} + '@react-aria/ssr@3.9.8': + resolution: {integrity: sha512-lQDE/c9uTfBSDOjaZUJS8xP2jCKVk4zjQeIlCH90xaLhHDgbpCdns3xvFpJJujfj3nI4Ll9K7A+ONUBDCASOuw==} engines: {node: '>= 12'} peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - '@react-aria/utils@3.28.1': - resolution: {integrity: sha512-mnHFF4YOVu9BRFQ1SZSKfPhg3z+lBRYoW5mLcYTQihbKhz48+I1sqRkP7ahMITr8ANH3nb34YaMME4XWmK2Mgg==} + '@react-aria/utils@3.28.2': + resolution: {integrity: sha512-J8CcLbvnQgiBn54eeEvQQbIOfBF3A1QizxMw9P4cl9MkeR03ug7RnjTIdJY/n2p7t59kLeAB3tqiczhcj+Oi5w==} peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - '@react-stately/flags@3.1.0': - resolution: {integrity: sha512-KSHOCxTFpBtxhIRcKwsD1YDTaNxFtCYuAUb0KEihc16QwqZViq4hasgPBs2gYm7fHRbw7WYzWKf6ZSo/+YsFlg==} + '@react-stately/flags@3.1.1': + resolution: {integrity: sha512-XPR5gi5LfrPdhxZzdIlJDz/B5cBf63l4q6/AzNqVWFKgd0QqY5LvWJftXkklaIUpKSJkIKQb8dphuZXDtkWNqg==} - '@react-stately/utils@3.10.5': - resolution: {integrity: sha512-iMQSGcpaecghDIh3mZEpZfoFH3ExBwTtuBEcvZ2XnGzCgQjeYXcMdIUwAfVQLXFTdHUHGF6Gu6/dFrYsCzySBQ==} + '@react-stately/utils@3.10.6': + resolution: {integrity: sha512-O76ip4InfTTzAJrg8OaZxKU4vvjMDOpfA/PGNOytiXwBbkct2ZeZwaimJ8Bt9W1bj5VsZ81/o/tW4BacbdDOMA==} peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - '@react-types/shared@3.28.0': - resolution: {integrity: sha512-9oMEYIDc3sk0G5rysnYvdNrkSg7B04yTKl50HHSZVbokeHpnU0yRmsDaWb9B/5RprcKj8XszEk5guBO8Sa/Q+Q==} + '@react-types/shared@3.29.0': + resolution: {integrity: sha512-IDQYu/AHgZimObzCFdNl1LpZvQW/xcfLt3v20sorl5qRucDVj4S9os98sVTZ4IRIBjmS+MkjqpR5E70xan7ooA==} peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 @@ -1044,98 +1053,103 @@ packages: peerDependencies: '@redis/client': ^1.0.0 - '@rollup/rollup-android-arm-eabi@4.36.0': - resolution: {integrity: sha512-jgrXjjcEwN6XpZXL0HUeOVGfjXhPyxAbbhD0BlXUB+abTOpbPiN5Wb3kOT7yb+uEtATNYF5x5gIfwutmuBA26w==} + '@rollup/rollup-android-arm-eabi@4.40.2': + resolution: {integrity: sha512-JkdNEq+DFxZfUwxvB58tHMHBHVgX23ew41g1OQinthJ+ryhdRk67O31S7sYw8u2lTjHUPFxwar07BBt1KHp/hg==} cpu: [arm] os: [android] - '@rollup/rollup-android-arm64@4.36.0': - resolution: {integrity: sha512-NyfuLvdPdNUfUNeYKUwPwKsE5SXa2J6bCt2LdB/N+AxShnkpiczi3tcLJrm5mA+eqpy0HmaIY9F6XCa32N5yzg==} + '@rollup/rollup-android-arm64@4.40.2': + resolution: {integrity: sha512-13unNoZ8NzUmnndhPTkWPWbX3vtHodYmy+I9kuLxN+F+l+x3LdVF7UCu8TWVMt1POHLh6oDHhnOA04n8oJZhBw==} cpu: [arm64] os: [android] - '@rollup/rollup-darwin-arm64@4.36.0': - resolution: {integrity: sha512-JQ1Jk5G4bGrD4pWJQzWsD8I1n1mgPXq33+/vP4sk8j/z/C2siRuxZtaUA7yMTf71TCZTZl/4e1bfzwUmFb3+rw==} + '@rollup/rollup-darwin-arm64@4.40.2': + resolution: {integrity: sha512-Gzf1Hn2Aoe8VZzevHostPX23U7N5+4D36WJNHK88NZHCJr7aVMG4fadqkIf72eqVPGjGc0HJHNuUaUcxiR+N/w==} cpu: [arm64] os: [darwin] - '@rollup/rollup-darwin-x64@4.36.0': - resolution: {integrity: sha512-6c6wMZa1lrtiRsbDziCmjE53YbTkxMYhhnWnSW8R/yqsM7a6mSJ3uAVT0t8Y/DGt7gxUWYuFM4bwWk9XCJrFKA==} + '@rollup/rollup-darwin-x64@4.40.2': + resolution: {integrity: sha512-47N4hxa01a4x6XnJoskMKTS8XZ0CZMd8YTbINbi+w03A2w4j1RTlnGHOz/P0+Bg1LaVL6ufZyNprSg+fW5nYQQ==} cpu: [x64] os: [darwin] - '@rollup/rollup-freebsd-arm64@4.36.0': - resolution: {integrity: sha512-KXVsijKeJXOl8QzXTsA+sHVDsFOmMCdBRgFmBb+mfEb/7geR7+C8ypAml4fquUt14ZyVXaw2o1FWhqAfOvA4sg==} + '@rollup/rollup-freebsd-arm64@4.40.2': + resolution: {integrity: sha512-8t6aL4MD+rXSHHZUR1z19+9OFJ2rl1wGKvckN47XFRVO+QL/dUSpKA2SLRo4vMg7ELA8pzGpC+W9OEd1Z/ZqoQ==} cpu: [arm64] os: [freebsd] - '@rollup/rollup-freebsd-x64@4.36.0': - resolution: {integrity: sha512-dVeWq1ebbvByI+ndz4IJcD4a09RJgRYmLccwlQ8bPd4olz3Y213uf1iwvc7ZaxNn2ab7bjc08PrtBgMu6nb4pQ==} + '@rollup/rollup-freebsd-x64@4.40.2': + resolution: {integrity: sha512-C+AyHBzfpsOEYRFjztcYUFsH4S7UsE9cDtHCtma5BK8+ydOZYgMmWg1d/4KBytQspJCld8ZIujFMAdKG1xyr4Q==} cpu: [x64] os: [freebsd] - '@rollup/rollup-linux-arm-gnueabihf@4.36.0': - resolution: {integrity: sha512-bvXVU42mOVcF4le6XSjscdXjqx8okv4n5vmwgzcmtvFdifQ5U4dXFYaCB87namDRKlUL9ybVtLQ9ztnawaSzvg==} + '@rollup/rollup-linux-arm-gnueabihf@4.40.2': + resolution: {integrity: sha512-de6TFZYIvJwRNjmW3+gaXiZ2DaWL5D5yGmSYzkdzjBDS3W+B9JQ48oZEsmMvemqjtAFzE16DIBLqd6IQQRuG9Q==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm-musleabihf@4.36.0': - resolution: {integrity: sha512-JFIQrDJYrxOnyDQGYkqnNBtjDwTgbasdbUiQvcU8JmGDfValfH1lNpng+4FWlhaVIR4KPkeddYjsVVbmJYvDcg==} + '@rollup/rollup-linux-arm-musleabihf@4.40.2': + resolution: {integrity: sha512-urjaEZubdIkacKc930hUDOfQPysezKla/O9qV+O89enqsqUmQm8Xj8O/vh0gHg4LYfv7Y7UsE3QjzLQzDYN1qg==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm64-gnu@4.36.0': - resolution: {integrity: sha512-KqjYVh3oM1bj//5X7k79PSCZ6CvaVzb7Qs7VMWS+SlWB5M8p3FqufLP9VNp4CazJ0CsPDLwVD9r3vX7Ci4J56A==} + '@rollup/rollup-linux-arm64-gnu@4.40.2': + resolution: {integrity: sha512-KlE8IC0HFOC33taNt1zR8qNlBYHj31qGT1UqWqtvR/+NuCVhfufAq9fxO8BMFC22Wu0rxOwGVWxtCMvZVLmhQg==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-arm64-musl@4.36.0': - resolution: {integrity: sha512-QiGnhScND+mAAtfHqeT+cB1S9yFnNQ/EwCg5yE3MzoaZZnIV0RV9O5alJAoJKX/sBONVKeZdMfO8QSaWEygMhw==} + '@rollup/rollup-linux-arm64-musl@4.40.2': + resolution: {integrity: sha512-j8CgxvfM0kbnhu4XgjnCWJQyyBOeBI1Zq91Z850aUddUmPeQvuAy6OiMdPS46gNFgy8gN1xkYyLgwLYZG3rBOg==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-loongarch64-gnu@4.36.0': - resolution: {integrity: sha512-1ZPyEDWF8phd4FQtTzMh8FQwqzvIjLsl6/84gzUxnMNFBtExBtpL51H67mV9xipuxl1AEAerRBgBwFNpkw8+Lg==} + '@rollup/rollup-linux-loongarch64-gnu@4.40.2': + resolution: {integrity: sha512-Ybc/1qUampKuRF4tQXc7G7QY9YRyeVSykfK36Y5Qc5dmrIxwFhrOzqaVTNoZygqZ1ZieSWTibfFhQ5qK8jpWxw==} cpu: [loong64] os: [linux] - '@rollup/rollup-linux-powerpc64le-gnu@4.36.0': - resolution: {integrity: sha512-VMPMEIUpPFKpPI9GZMhJrtu8rxnp6mJR3ZzQPykq4xc2GmdHj3Q4cA+7avMyegXy4n1v+Qynr9fR88BmyO74tg==} + '@rollup/rollup-linux-powerpc64le-gnu@4.40.2': + resolution: {integrity: sha512-3FCIrnrt03CCsZqSYAOW/k9n625pjpuMzVfeI+ZBUSDT3MVIFDSPfSUgIl9FqUftxcUXInvFah79hE1c9abD+Q==} cpu: [ppc64] os: [linux] - '@rollup/rollup-linux-riscv64-gnu@4.36.0': - resolution: {integrity: sha512-ttE6ayb/kHwNRJGYLpuAvB7SMtOeQnVXEIpMtAvx3kepFQeowVED0n1K9nAdraHUPJ5hydEMxBpIR7o4nrm8uA==} + '@rollup/rollup-linux-riscv64-gnu@4.40.2': + resolution: {integrity: sha512-QNU7BFHEvHMp2ESSY3SozIkBPaPBDTsfVNGx3Xhv+TdvWXFGOSH2NJvhD1zKAT6AyuuErJgbdvaJhYVhVqrWTg==} cpu: [riscv64] os: [linux] - '@rollup/rollup-linux-s390x-gnu@4.36.0': - resolution: {integrity: sha512-4a5gf2jpS0AIe7uBjxDeUMNcFmaRTbNv7NxI5xOCs4lhzsVyGR/0qBXduPnoWf6dGC365saTiwag8hP1imTgag==} + '@rollup/rollup-linux-riscv64-musl@4.40.2': + resolution: {integrity: sha512-5W6vNYkhgfh7URiXTO1E9a0cy4fSgfE4+Hl5agb/U1sa0kjOLMLC1wObxwKxecE17j0URxuTrYZZME4/VH57Hg==} + cpu: [riscv64] + os: [linux] + + '@rollup/rollup-linux-s390x-gnu@4.40.2': + resolution: {integrity: sha512-B7LKIz+0+p348JoAL4X/YxGx9zOx3sR+o6Hj15Y3aaApNfAshK8+mWZEf759DXfRLeL2vg5LYJBB7DdcleYCoQ==} cpu: [s390x] os: [linux] - '@rollup/rollup-linux-x64-gnu@4.36.0': - resolution: {integrity: sha512-5KtoW8UWmwFKQ96aQL3LlRXX16IMwyzMq/jSSVIIyAANiE1doaQsx/KRyhAvpHlPjPiSU/AYX/8m+lQ9VToxFQ==} + '@rollup/rollup-linux-x64-gnu@4.40.2': + resolution: {integrity: sha512-lG7Xa+BmBNwpjmVUbmyKxdQJ3Q6whHjMjzQplOs5Z+Gj7mxPtWakGHqzMqNER68G67kmCX9qX57aRsW5V0VOng==} cpu: [x64] os: [linux] - '@rollup/rollup-linux-x64-musl@4.36.0': - resolution: {integrity: sha512-sycrYZPrv2ag4OCvaN5js+f01eoZ2U+RmT5as8vhxiFz+kxwlHrsxOwKPSA8WyS+Wc6Epid9QeI/IkQ9NkgYyQ==} + '@rollup/rollup-linux-x64-musl@4.40.2': + resolution: {integrity: sha512-tD46wKHd+KJvsmije4bUskNuvWKFcTOIM9tZ/RrmIvcXnbi0YK/cKS9FzFtAm7Oxi2EhV5N2OpfFB348vSQRXA==} cpu: [x64] os: [linux] - '@rollup/rollup-win32-arm64-msvc@4.36.0': - resolution: {integrity: sha512-qbqt4N7tokFwwSVlWDsjfoHgviS3n/vZ8LK0h1uLG9TYIRuUTJC88E1xb3LM2iqZ/WTqNQjYrtmtGmrmmawB6A==} + '@rollup/rollup-win32-arm64-msvc@4.40.2': + resolution: {integrity: sha512-Bjv/HG8RRWLNkXwQQemdsWw4Mg+IJ29LK+bJPW2SCzPKOUaMmPEppQlu/Fqk1d7+DX3V7JbFdbkh/NMmurT6Pg==} cpu: [arm64] os: [win32] - '@rollup/rollup-win32-ia32-msvc@4.36.0': - resolution: {integrity: sha512-t+RY0JuRamIocMuQcfwYSOkmdX9dtkr1PbhKW42AMvaDQa+jOdpUYysroTF/nuPpAaQMWp7ye+ndlmmthieJrQ==} + '@rollup/rollup-win32-ia32-msvc@4.40.2': + resolution: {integrity: sha512-dt1llVSGEsGKvzeIO76HToiYPNPYPkmjhMHhP00T9S4rDern8P2ZWvWAQUEJ+R1UdMWJ/42i/QqJ2WV765GZcA==} cpu: [ia32] os: [win32] - '@rollup/rollup-win32-x64-msvc@4.36.0': - resolution: {integrity: sha512-aRXd7tRZkWLqGbChgcMMDEHjOKudo1kChb1Jt1IfR8cY/KIpgNviLeJy5FUb9IpSuQj8dU2fAYNMPW/hLKOSTw==} + '@rollup/rollup-win32-x64-msvc@4.40.2': + resolution: {integrity: sha512-bwspbWB04XJpeElvsp+DCylKfF4trJDa2Y9Go8O6A7YLX2LIKGcNK/CYImJN6ZP4DcuOHB4Utl3iCbnR62DudA==} cpu: [x64] os: [win32] @@ -1169,14 +1183,17 @@ packages: '@swc/helpers@0.5.15': resolution: {integrity: sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==} - '@tanstack/react-virtual@3.13.4': - resolution: {integrity: sha512-jPWC3BXvVLHsMX67NEHpJaZ+/FySoNxFfBEiF4GBc1+/nVwdRm+UcSCYnKP3pXQr0eEsDpXi/PQZhNfJNopH0g==} + '@swc/helpers@0.5.17': + resolution: {integrity: sha512-5IKx/Y13RsYd+sauPb2x+U/xZikHjolzfuDgTAl/Tdf3Q8rslRvC19NKDLgAJQ6wsqADk10ntlv08nPFw/gO/A==} + + '@tanstack/react-virtual@3.13.8': + resolution: {integrity: sha512-meS2AanUg50f3FBSNoAdBSRAh8uS0ue01qm7zrw65KGJtiXB9QXfybqZwkh4uFpRv2iX/eu5tjcH5wqUpwYLPg==} 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 - '@tanstack/virtual-core@3.13.4': - resolution: {integrity: sha512-fNGO9fjjSLns87tlcto106enQQLycCKR4DPNpgq3djP5IdcPFdPAmaKjsgzIeRhH7hWrELgW12hYnRthS5kLUw==} + '@tanstack/virtual-core@3.13.8': + resolution: {integrity: sha512-BT6w89Hqy7YKaWewYzmecXQzcJh6HTBbKYJIIkMaNU49DZ06LoTV3z32DWWEdUsgW6n1xTmwTLs4GtWrZC261w==} '@theguild/remark-mermaid@0.2.0': resolution: {integrity: sha512-o8n57TJy0OI4PCrNw8z6S+vpHtrwoQZzTA5Y3fL0U1NDRIoMg/78duWgEBFsCZcWM1G6zjE91yg1aKCsDwgE2Q==} @@ -1192,9 +1209,6 @@ packages: '@tybys/wasm-util@0.9.0': resolution: {integrity: sha512-6+7nlbMVX/PVDCwaIQ8nTOPveOcFLSt8GcXdx8hD0bt39uWxYT88uXzqTd4fTvqta7oeUJqudepapKNt2DYJFw==} - '@types/acorn@4.0.6': - resolution: {integrity: sha512-veQTnWP+1D/xbxVrPC3zHnCZRjSrKfhbMUlEA43iMZLu7EsnTtkJklIuwrCPbOi8YkvDQAiW05VQQFvvz9oieQ==} - '@types/concat-stream@2.0.3': resolution: {integrity: sha512-3qe4oQAPNwVNwK4C9c8u+VJqv9kez+2MR4qJpoPFfXtgxxif1QbFusvXzK0/Wra2VX07smostI2VMmJNSpZjuQ==} @@ -1294,14 +1308,14 @@ packages: '@types/debug@4.1.12': resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==} - '@types/doctrine@0.0.9': - resolution: {integrity: sha512-eOIHzCUSH7SMfonMG1LsC2f8vxBFtho6NGBznK41R84YzPuvSBzrhEps33IsQiOW9+VL6NQ9DbjQJznk/S4uRA==} + '@types/eslint@9.6.1': + resolution: {integrity: sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==} '@types/estree-jsx@1.0.5': resolution: {integrity: sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==} - '@types/estree@1.0.6': - resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==} + '@types/estree@1.0.7': + resolution: {integrity: sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==} '@types/geojson@7946.0.16': resolution: {integrity: sha512-6C8nqWur3j98U6+lXDfTUWIfgvZU+EumvpHKcYjujKH7woYyLj2sUmff0tRhrqM7BohUw7Pz3ZB1jj2gW9Fvmg==} @@ -1333,16 +1347,16 @@ packages: '@types/node@12.20.55': resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} - '@types/node@22.13.10': - resolution: {integrity: sha512-I6LPUvlRH+O6VRUqYOcMudhaIdUVWfsjnZavnsraHvpBwaEyMN29ry+0UVJhImYL16xsscu0aske3yA+uPOWfw==} + '@types/node@22.15.18': + resolution: {integrity: sha512-v1DKRfUdyW+jJhZNEI1PYy29S2YRxMV5AOO/x/SjKmW0acCIOqmbj6Haf9eHAhsPmrhlHSxEhv/1WszcLWV4cg==} - '@types/react-dom@19.0.4': - resolution: {integrity: sha512-4fSQ8vWFkg+TGhePfUzVmat3eC14TXYSsiiDSLI0dVLsrm9gZFABjPy/Qu6TKgl1tq1Bu1yDsuQgY3A3DOjCcg==} + '@types/react-dom@19.1.5': + resolution: {integrity: sha512-CMCjrWucUBZvohgZxkjd6S9h0nZxXjzus6yDfUb+xLxYM7VvjKNH1tQrE9GWLql1XoOP4/Ds3bwFqShHUYraGg==} peerDependencies: '@types/react': ^19.0.0 - '@types/react@19.0.12': - resolution: {integrity: sha512-V6Ar115dBDrjbtXSrS+/Oruobc+qVbbUxDFC1RSbRqLt5SYvxxyIDrSC85RWml54g+jfNeEMZhEj7wW07ONQhA==} + '@types/react@19.1.4': + resolution: {integrity: sha512-EB1yiiYdvySuIITtD5lhW4yPyJ31RkJkkDw794LaQYrxCSaQV/47y5o1FMC4zF9ZyjUjzJMZwbovEnT5yHTW6g==} '@types/supports-color@8.1.3': resolution: {integrity: sha512-Hy6UMpxhE3j1tLpl27exp1XqHD7n8chAiNPzWfz16LPZoMMoSc4dzLl6w9qijkEb/r5O1ozdu1CWGA2L83ZeZg==} @@ -1356,51 +1370,51 @@ packages: '@types/unist@3.0.3': resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==} - '@typescript-eslint/eslint-plugin@8.27.0': - resolution: {integrity: sha512-4henw4zkePi5p252c8ncBLzLce52SEUz2Ebj8faDnuUXz2UuHEONYcJ+G0oaCF+bYCWVZtrGzq3FD7YXetmnSA==} + '@typescript-eslint/eslint-plugin@8.32.1': + resolution: {integrity: sha512-6u6Plg9nP/J1GRpe/vcjjabo6Uc5YQPAMxsgQyGC/I0RuukiG1wIe3+Vtg3IrSCVJDmqK3j8adrtzXSENRtFgg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: '@typescript-eslint/parser': ^8.0.0 || ^8.0.0-alpha.0 eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.9.0' - '@typescript-eslint/parser@8.27.0': - resolution: {integrity: sha512-XGwIabPallYipmcOk45DpsBSgLC64A0yvdAkrwEzwZ2viqGqRUJ8eEYoPz0CWnutgAFbNMPdsGGvzjSmcWVlEA==} + '@typescript-eslint/parser@8.32.1': + resolution: {integrity: sha512-LKMrmwCPoLhM45Z00O1ulb6jwyVr2kr3XJp+G+tSEZcbauNnScewcQwtJqXDhXeYPDEjZ8C1SjXm015CirEmGg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.9.0' - '@typescript-eslint/scope-manager@8.27.0': - resolution: {integrity: sha512-8oI9GwPMQmBryaaxG1tOZdxXVeMDte6NyJA4i7/TWa4fBwgnAXYlIQP+uYOeqAaLJ2JRxlG9CAyL+C+YE9Xknw==} + '@typescript-eslint/scope-manager@8.32.1': + resolution: {integrity: sha512-7IsIaIDeZn7kffk7qXC3o6Z4UblZJKV3UBpkvRNpr5NSyLji7tvTcvmnMNYuYLyh26mN8W723xpo3i4MlD33vA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/type-utils@8.27.0': - resolution: {integrity: sha512-wVArTVcz1oJOIEJxui/nRhV0TXzD/zMSOYi/ggCfNq78EIszddXcJb7r4RCp/oBrjt8n9A0BSxRMKxHftpDxDA==} + '@typescript-eslint/type-utils@8.32.1': + resolution: {integrity: sha512-mv9YpQGA8iIsl5KyUPi+FGLm7+bA4fgXaeRcFKRDRwDMu4iwrSHeDPipwueNXhdIIZltwCJv+NkxftECbIZWfA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.9.0' - '@typescript-eslint/types@8.27.0': - resolution: {integrity: sha512-/6cp9yL72yUHAYq9g6DsAU+vVfvQmd1a8KyA81uvfDE21O2DwQ/qxlM4AR8TSdAu+kJLBDrEHKC5/W2/nxsY0A==} + '@typescript-eslint/types@8.32.1': + resolution: {integrity: sha512-YmybwXUJcgGqgAp6bEsgpPXEg6dcCyPyCSr0CAAueacR/CCBi25G3V8gGQ2kRzQRBNol7VQknxMs9HvVa9Rvfg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/typescript-estree@8.27.0': - resolution: {integrity: sha512-BnKq8cqPVoMw71O38a1tEb6iebEgGA80icSxW7g+kndx0o6ot6696HjG7NdgfuAVmVEtwXUr3L8R9ZuVjoQL6A==} + '@typescript-eslint/typescript-estree@8.32.1': + resolution: {integrity: sha512-Y3AP9EIfYwBb4kWGb+simvPaqQoT5oJuzzj9m0i6FCY6SPvlomY2Ei4UEMm7+FXtlNJbor80ximyslzaQF6xhg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <5.9.0' - '@typescript-eslint/utils@8.27.0': - resolution: {integrity: sha512-njkodcwH1yvmo31YWgRHNb/x1Xhhq4/m81PhtvmRngD8iHPehxffz1SNCO+kwaePhATC+kOa/ggmvPoPza5i0Q==} + '@typescript-eslint/utils@8.32.1': + resolution: {integrity: sha512-DsSFNIgLSrc89gpq1LJB7Hm1YpuhK086DRDJSNrewcGvYloWW1vZLHBTIvarKZDcAORIy/uWNx8Gad+4oMpkSA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.9.0' - '@typescript-eslint/visitor-keys@8.27.0': - resolution: {integrity: sha512-WsXQwMkILJvffP6z4U3FYJPlbf/j07HIxmDjZpbNvBJkMfvwXj5ACRkkHwBDvLBbDbtX5TdU64/rcvKJ/vuInQ==} + '@typescript-eslint/visitor-keys@8.32.1': + resolution: {integrity: sha512-ar0tjQfObzhSaW3C3QNmTc5ofj0hDoNQ5XWrCy6zDyabdr0TWhCkClp+rywGNj/odAFBVzzJrK4tEq5M4Hmu4w==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@typescript/vfs@1.6.1': @@ -1411,65 +1425,95 @@ packages: '@ungap/structured-clone@1.3.0': resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} - '@unrs/rspack-resolver-binding-darwin-arm64@1.2.2': - resolution: {integrity: sha512-i7z0B+C0P8Q63O/5PXJAzeFtA1ttY3OR2VSJgGv18S+PFNwD98xHgAgPOT1H5HIV6jlQP8Avzbp09qxJUdpPNw==} + '@unrs/resolver-binding-darwin-arm64@1.7.2': + resolution: {integrity: sha512-vxtBno4xvowwNmO/ASL0Y45TpHqmNkAaDtz4Jqb+clmcVSSl8XCG/PNFFkGsXXXS6AMjP+ja/TtNCFFa1QwLRg==} cpu: [arm64] os: [darwin] - '@unrs/rspack-resolver-binding-darwin-x64@1.2.2': - resolution: {integrity: sha512-YEdFzPjIbDUCfmehC6eS+AdJYtFWY35YYgWUnqqTM2oe/N58GhNy5yRllxYhxwJ9GcfHoNc6Ubze1yjkNv+9Qg==} + '@unrs/resolver-binding-darwin-x64@1.7.2': + resolution: {integrity: sha512-qhVa8ozu92C23Hsmv0BF4+5Dyyd5STT1FolV4whNgbY6mj3kA0qsrGPe35zNR3wAN7eFict3s4Rc2dDTPBTuFQ==} cpu: [x64] os: [darwin] - '@unrs/rspack-resolver-binding-freebsd-x64@1.2.2': - resolution: {integrity: sha512-TU4ntNXDgPN2giQyyzSnGWf/dVCem5lvwxg0XYvsvz35h5H19WrhTmHgbrULMuypCB3aHe1enYUC9rPLDw45mA==} + '@unrs/resolver-binding-freebsd-x64@1.7.2': + resolution: {integrity: sha512-zKKdm2uMXqLFX6Ac7K5ElnnG5VIXbDlFWzg4WJ8CGUedJryM5A3cTgHuGMw1+P5ziV8CRhnSEgOnurTI4vpHpg==} cpu: [x64] os: [freebsd] - '@unrs/rspack-resolver-binding-linux-arm-gnueabihf@1.2.2': - resolution: {integrity: sha512-ik3w4/rU6RujBvNWiDnKdXi1smBhqxEDhccNi/j2rHaMjm0Fk49KkJ6XKsoUnD2kZ5xaMJf9JjailW/okfUPIw==} + '@unrs/resolver-binding-linux-arm-gnueabihf@1.7.2': + resolution: {integrity: sha512-8N1z1TbPnHH+iDS/42GJ0bMPLiGK+cUqOhNbMKtWJ4oFGzqSJk/zoXFzcQkgtI63qMcUI7wW1tq2usZQSb2jxw==} cpu: [arm] os: [linux] - '@unrs/rspack-resolver-binding-linux-arm64-gnu@1.2.2': - resolution: {integrity: sha512-fp4Azi8kHz6TX8SFmKfyScZrMLfp++uRm2srpqRjsRZIIBzH74NtSkdEUHImR4G7f7XJ+sVZjCc6KDDK04YEpQ==} + '@unrs/resolver-binding-linux-arm-musleabihf@1.7.2': + resolution: {integrity: sha512-tjYzI9LcAXR9MYd9rO45m1s0B/6bJNuZ6jeOxo1pq1K6OBuRMMmfyvJYval3s9FPPGmrldYA3mi4gWDlWuTFGA==} + cpu: [arm] + os: [linux] + + '@unrs/resolver-binding-linux-arm64-gnu@1.7.2': + resolution: {integrity: sha512-jon9M7DKRLGZ9VYSkFMflvNqu9hDtOCEnO2QAryFWgT6o6AXU8du56V7YqnaLKr6rAbZBWYsYpikF226v423QA==} cpu: [arm64] os: [linux] - '@unrs/rspack-resolver-binding-linux-arm64-musl@1.2.2': - resolution: {integrity: sha512-gMiG3DCFioJxdGBzhlL86KcFgt9HGz0iDhw0YVYPsShItpN5pqIkNrI+L/Q/0gfDiGrfcE0X3VANSYIPmqEAlQ==} + '@unrs/resolver-binding-linux-arm64-musl@1.7.2': + resolution: {integrity: sha512-c8Cg4/h+kQ63pL43wBNaVMmOjXI/X62wQmru51qjfTvI7kmCy5uHTJvK/9LrF0G8Jdx8r34d019P1DVJmhXQpA==} cpu: [arm64] os: [linux] - '@unrs/rspack-resolver-binding-linux-x64-gnu@1.2.2': - resolution: {integrity: sha512-n/4n2CxaUF9tcaJxEaZm+lqvaw2gflfWQ1R9I7WQgYkKEKbRKbpG/R3hopYdUmLSRI4xaW1Cy0Bz40eS2Yi4Sw==} + '@unrs/resolver-binding-linux-ppc64-gnu@1.7.2': + resolution: {integrity: sha512-A+lcwRFyrjeJmv3JJvhz5NbcCkLQL6Mk16kHTNm6/aGNc4FwPHPE4DR9DwuCvCnVHvF5IAd9U4VIs/VvVir5lg==} + cpu: [ppc64] + os: [linux] + + '@unrs/resolver-binding-linux-riscv64-gnu@1.7.2': + resolution: {integrity: sha512-hQQ4TJQrSQW8JlPm7tRpXN8OCNP9ez7PajJNjRD1ZTHQAy685OYqPrKjfaMw/8LiHCt8AZ74rfUVHP9vn0N69Q==} + cpu: [riscv64] + os: [linux] + + '@unrs/resolver-binding-linux-riscv64-musl@1.7.2': + resolution: {integrity: sha512-NoAGbiqrxtY8kVooZ24i70CjLDlUFI7nDj3I9y54U94p+3kPxwd2L692YsdLa+cqQ0VoqMWoehDFp21PKRUoIQ==} + cpu: [riscv64] + os: [linux] + + '@unrs/resolver-binding-linux-s390x-gnu@1.7.2': + resolution: {integrity: sha512-KaZByo8xuQZbUhhreBTW+yUnOIHUsv04P8lKjQ5otiGoSJ17ISGYArc+4vKdLEpGaLbemGzr4ZeUbYQQsLWFjA==} + cpu: [s390x] + os: [linux] + + '@unrs/resolver-binding-linux-x64-gnu@1.7.2': + resolution: {integrity: sha512-dEidzJDubxxhUCBJ/SHSMJD/9q7JkyfBMT77Px1npl4xpg9t0POLvnWywSk66BgZS/b2Hy9Y1yFaoMTFJUe9yg==} cpu: [x64] os: [linux] - '@unrs/rspack-resolver-binding-linux-x64-musl@1.2.2': - resolution: {integrity: sha512-cHyhAr6rlYYbon1L2Ag449YCj3p6XMfcYTP0AQX+KkQo025d1y/VFtPWvjMhuEsE2lLvtHm7GdJozj6BOMtzVg==} + '@unrs/resolver-binding-linux-x64-musl@1.7.2': + resolution: {integrity: sha512-RvP+Ux3wDjmnZDT4XWFfNBRVG0fMsc+yVzNFUqOflnDfZ9OYujv6nkh+GOr+watwrW4wdp6ASfG/e7bkDradsw==} cpu: [x64] os: [linux] - '@unrs/rspack-resolver-binding-wasm32-wasi@1.2.2': - resolution: {integrity: sha512-eogDKuICghDLGc32FtP+WniG38IB1RcGOGz0G3z8406dUdjJvxfHGuGs/dSlM9YEp/v0lEqhJ4mBu6X2nL9pog==} + '@unrs/resolver-binding-wasm32-wasi@1.7.2': + resolution: {integrity: sha512-y797JBmO9IsvXVRCKDXOxjyAE4+CcZpla2GSoBQ33TVb3ILXuFnMrbR/QQZoauBYeOFuu4w3ifWLw52sdHGz6g==} engines: {node: '>=14.0.0'} cpu: [wasm32] - '@unrs/rspack-resolver-binding-win32-arm64-msvc@1.2.2': - resolution: {integrity: sha512-7sWRJumhpXSi2lccX8aQpfFXHsSVASdWndLv8AmD8nDRA/5PBi8IplQVZNx2mYRx6+Bp91Z00kuVqpXO9NfCTg==} + '@unrs/resolver-binding-win32-arm64-msvc@1.7.2': + resolution: {integrity: sha512-gtYTh4/VREVSLA+gHrfbWxaMO/00y+34htY7XpioBTy56YN2eBjkPrY1ML1Zys89X3RJDKVaogzwxlM1qU7egg==} cpu: [arm64] os: [win32] - '@unrs/rspack-resolver-binding-win32-x64-msvc@1.2.2': - resolution: {integrity: sha512-hewo/UMGP1a7O6FG/ThcPzSJdm/WwrYDNkdGgWl6M18H6K6MSitklomWpT9MUtT5KGj++QJb06va/14QBC4pvw==} + '@unrs/resolver-binding-win32-ia32-msvc@1.7.2': + resolution: {integrity: sha512-Ywv20XHvHTDRQs12jd3MY8X5C8KLjDbg/jyaal/QLKx3fAShhJyD4blEANInsjxW3P7isHx1Blt56iUDDJO3jg==} + cpu: [ia32] + os: [win32] + + '@unrs/resolver-binding-win32-x64-msvc@1.7.2': + resolution: {integrity: sha512-friS8NEQfHaDbkThxopGk+LuE5v3iY0StruifjQEt7SLbA46OnfgMO15sOTkbpJkol6RB+1l1TYPXh0sCddpvA==} cpu: [x64] os: [win32] - '@vitest/eslint-plugin@1.1.38': - resolution: {integrity: sha512-KcOTZyVz8RiM5HyriiDVrP1CyBGuhRxle+lBsmSs6NTJEO/8dKVAq+f5vQzHj1/Kc7bYXSDO6yBe62Zx0t5iaw==} + '@vitest/eslint-plugin@1.1.44': + resolution: {integrity: sha512-m4XeohMT+Dj2RZfxnbiFR+Cv5dEC0H7C6TlxRQT7GK2556solm99kxgzJp/trKrZvanZcOFyw7aABykUTfWyrg==} peerDependencies: - '@typescript-eslint/utils': ^8.24.0 + '@typescript-eslint/utils': '>= 8.24.0' eslint: '>= 8.57.0' typescript: '>= 5.0.0' vitest: '*' @@ -1479,11 +1523,11 @@ packages: vitest: optional: true - '@vitest/expect@3.0.9': - resolution: {integrity: sha512-5eCqRItYgIML7NNVgJj6TVCmdzE7ZVgJhruW0ziSQV4V7PvLkDL1bBkBdcTs/VuIz0IxPb5da1IDSqc1TR9eig==} + '@vitest/expect@3.1.3': + resolution: {integrity: sha512-7FTQQuuLKmN1Ig/h+h/GO+44Q1IlglPlR2es4ab7Yvfx+Uk5xsv+Ykk+MEt/M2Yn/xGmzaLKxGw2lgy2bwuYqg==} - '@vitest/mocker@3.0.9': - resolution: {integrity: sha512-ryERPIBOnvevAkTq+L1lD+DTFBRcjueL9lOUfXsLfwP92h4e+Heb+PjiqS3/OURWPtywfafK0kj++yDFjWUmrA==} + '@vitest/mocker@3.1.3': + resolution: {integrity: sha512-PJbLjonJK82uCWHjzgBJZuR7zmAOrSvKk1QBxrennDIgtH4uK0TB1PvYmc0XBCigxxtiAVPfWtAdy4lpz8SQGQ==} peerDependencies: msw: ^2.4.9 vite: ^5.0.0 || ^6.0.0 @@ -1493,20 +1537,24 @@ packages: vite: optional: true - '@vitest/pretty-format@3.0.9': - resolution: {integrity: sha512-OW9F8t2J3AwFEwENg3yMyKWweF7oRJlMyHOMIhO5F3n0+cgQAJZBjNgrF8dLwFTEXl5jUqBLXd9QyyKv8zEcmA==} + '@vitest/pretty-format@3.1.3': + resolution: {integrity: sha512-i6FDiBeJUGLDKADw2Gb01UtUNb12yyXAqC/mmRWuYl+m/U9GS7s8us5ONmGkGpUUo7/iAYzI2ePVfOZTYvUifA==} - '@vitest/runner@3.0.9': - resolution: {integrity: sha512-NX9oUXgF9HPfJSwl8tUZCMP1oGx2+Sf+ru6d05QjzQz4OwWg0psEzwY6VexP2tTHWdOkhKHUIZH+fS6nA7jfOw==} + '@vitest/runner@3.1.3': + resolution: {integrity: sha512-Tae+ogtlNfFei5DggOsSUvkIaSuVywujMj6HzR97AHK6XK8i3BuVyIifWAm/sE3a15lF5RH9yQIrbXYuo0IFyA==} - '@vitest/snapshot@3.0.9': - resolution: {integrity: sha512-AiLUiuZ0FuA+/8i19mTYd+re5jqjEc2jZbgJ2up0VY0Ddyyxg/uUtBDpIFAy4uzKaQxOW8gMgBdAJJ2ydhu39A==} + '@vitest/snapshot@3.1.3': + resolution: {integrity: sha512-XVa5OPNTYUsyqG9skuUkFzAeFnEzDp8hQu7kZ0N25B1+6KjGm4hWLtURyBbsIAOekfWQ7Wuz/N/XXzgYO3deWQ==} - '@vitest/spy@3.0.9': - resolution: {integrity: sha512-/CcK2UDl0aQ2wtkp3YVWldrpLRNCfVcIOFGlVGKO4R5eajsH393Z1yiXLVQ7vWsj26JOEjeZI0x5sm5P4OGUNQ==} + '@vitest/spy@3.1.3': + resolution: {integrity: sha512-x6w+ctOEmEXdWaa6TO4ilb7l9DxPR5bwEb6hILKuxfU1NqWT2mpJD9NJN7t3OTfxmVlOMrvtoFJGdgyzZ605lQ==} - '@vitest/utils@3.0.9': - resolution: {integrity: sha512-ilHM5fHhZ89MCp5aAaM9uhfl1c2JdxVxl3McqsdVyVNN6JffnEen8UMCdRTzOhGXNQGo5GNL9QugHrz727Wnng==} + '@vitest/utils@3.1.3': + resolution: {integrity: sha512-2Ltrpht4OmHO9+c/nmHtF09HWiyWdworqnHIwjfvDyWjuwKbdkcS9AnhsDn+8E2RM4x++foD1/tNuLPVvWG1Rg==} + + '@xmldom/xmldom@0.9.8': + resolution: {integrity: sha512-p96FSY54r+WJ50FIOsCOjyj/wavs8921hG5+kVMmZgKcvIKxMXHTrjNJvRgWa/zuX3B6t2lijLNFaOyuxUH+2A==} + engines: {node: '>=14.6'} '@zeit/schemas@2.36.0': resolution: {integrity: sha512-7kjMwcChYEzMKjeex9ZFXkt1AyNov9R5HZtjBKVsmVpw7pa7ZtlCGvCBC2vnnXctaYN+aRI61HjIqeetZW5ROg==} @@ -1522,6 +1570,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-jsx@5.3.2: resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} peerDependencies: @@ -1582,6 +1634,10 @@ packages: resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} engines: {node: '>=12'} + ansis@4.0.0: + resolution: {integrity: sha512-P8nrHI1EyW9OfBt1X7hMSwGN2vwRuqHSKJAT1gbLWZRzDa24oHjYwGHvEgHeBepupzk878yS/HBZ0NMPYtbolw==} + engines: {node: '>=14'} + anymatch@3.1.3: resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} engines: {node: '>= 8'} @@ -1673,8 +1729,8 @@ packages: avvio@9.1.0: resolution: {integrity: sha512-fYASnYi600CsH/j9EQov7lECAniYiBFiiAtBNuZYLA2leLe9qOvZzqYHFjtIj6gD2VMoMLP14834LFWvr4IfDw==} - axios@1.8.4: - resolution: {integrity: sha512-eBSYY4Y68NNlHbHBMdeDmKNtDgXWhQsJcGqzO3iLUM0GraQFSS9cVgPX5I9b3lbdFKyYoAEGAZF1DwhTaljNAw==} + axios@1.9.0: + resolution: {integrity: sha512-re4CqKTJaURpzbLHtIi6XpDv20/CnpXOtjRY5/CU32L8gU8ek9UIivcfvSWvmKEngmVbrUtPpdDwWDWL7DNHvg==} bail@2.0.2: resolution: {integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==} @@ -1690,8 +1746,8 @@ packages: resolution: {integrity: sha512-pbnl5XzGBdrFU/wT4jqmJVPn2B6UHPBOhzMQkY/SPUPB6QtUXtmBHBIwCbXJol93mOpGMnQyP/+BB19q04xj7g==} engines: {node: '>=4'} - better-react-mathjax@2.1.0: - resolution: {integrity: sha512-RrHudli76sgoVu+YtjHTKhCkjO2eH1B7Xje1sa0YPjhKzq2y/GIwOt9+tuel3s2L+mCPmFbYBFLDFfo3pEa8rQ==} + better-react-mathjax@2.3.0: + resolution: {integrity: sha512-K0ceQC+jQmB+NLDogO5HCpqmYf18AU2FxDbLdduYgkHYWZApFggkHE4dIaXCV1NqeoscESYXXo1GSkY6fA295w==} peerDependencies: react: '>=16.8' @@ -1707,6 +1763,10 @@ packages: bodec@0.1.0: resolution: {integrity: sha512-Ylo+MAo5BDUq1KA3f3R/MFhh+g8cnHmo8bz3YPGhI1znrMaf77ol1sfvYJzsw3nTE+Y2GryfDxBaR+AqpAkEHQ==} + body-parser@2.2.0: + resolution: {integrity: sha512-02qvAaxv8tp7fBa/mw1ga98OGm+eCbqzJOKoRt70sLmfEEi+jyBYVTDGfCL/k06/4EMk/z01gCe7HoCH/f2LTg==} + engines: {node: '>=18'} + boxen@7.0.0: resolution: {integrity: sha512-j//dBVuyacJbvW+tvZ9HuH03fZ46QcaKvvhZickZqtB271DxJ7SNRSNxrV/dZX0085m7hISRZWbzWlJvx/rHSg==} engines: {node: '>=14.16'} @@ -1732,6 +1792,10 @@ packages: resolution: {integrity: sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==} engines: {node: '>= 0.8'} + bytes@3.1.2: + resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} + engines: {node: '>= 0.8'} + cac@6.7.14: resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} engines: {node: '>=8'} @@ -1756,8 +1820,8 @@ packages: resolution: {integrity: sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw==} engines: {node: '>=14.16'} - caniuse-lite@1.0.30001706: - resolution: {integrity: sha512-3ZczoTApMAZwPKYWmwVbQMFpXBDds3/0VciVoUwPUbldlYyVLmRVuRs/PcUZtHpbLRpzzDvrvnFuREsGt6lUug==} + caniuse-lite@1.0.30001718: + resolution: {integrity: sha512-AflseV1ahcSunK53NfEs9gFWgOEmzr0f+kaMFA4xiLZlr9Hzt7HxcSpIFcnNCUkz6R6dWKa54rUz3HUmI3nVcw==} ccount@2.0.1: resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} @@ -1882,6 +1946,10 @@ packages: comma-separated-tokens@2.0.3: resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} + commander@13.1.0: + resolution: {integrity: sha512-/rFeCpNJQbhSZjGVwO9RFV3xPqbnERS8MmIQzCtD/zl6gpJuV/bMLuN92oG3F7d8oDEHHRrujSXNUr8fpjntKw==} + engines: {node: '>=18'} + commander@2.15.1: resolution: {integrity: sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag==} @@ -1893,10 +1961,6 @@ packages: resolution: {integrity: sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==} engines: {node: '>= 12'} - commander@9.2.0: - resolution: {integrity: sha512-e2i4wANQiSXgnrBlIatyHtP1odfUp0BbV5Y5nEGbxtIrStkEOAAzCUirvLBNXHLr7kwLvJl6V+4V3XV9x7Wd9w==} - engines: {node: ^12.20.0 || >=14} - comment-parser@1.4.1: resolution: {integrity: sha512-buhp5kePrmda3vhc5B9t7pUQXAb2Tnd0qgpkIhPhkHXxJpiPJ11H0ZEU0oBpJ2QztSbzG/ZxMj/CHsYJqRHmyg==} engines: {node: '>= 12.0.0'} @@ -1922,13 +1986,29 @@ packages: confbox@0.1.8: resolution: {integrity: sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==} - confbox@0.2.1: - resolution: {integrity: sha512-hkT3yDPFbs95mNCy1+7qNKC6Pro+/ibzYxtM2iqEigpf0sVw+bg4Zh9/snjsBcf990vfIsg5+1U7VyiyBb3etg==} + confbox@0.2.2: + resolution: {integrity: sha512-1NB+BKqhtNipMsov4xI/NnhCKp9XG9NamYp5PVm9klAT0fsrNPjaFICsCFhNhwZJKNh7zB/3q8qXz0E9oaMNtQ==} content-disposition@0.5.2: resolution: {integrity: sha512-kRGRZw3bLlFISDBgwTSA1TMBFN6J6GWDeubmDE3AF+3+yXL8hTWv8r5rkLbqYXY4RjPk/EzHnClI3zQf1cFmHA==} engines: {node: '>= 0.6'} + content-disposition@1.0.0: + resolution: {integrity: sha512-Au9nRL8VNUut/XSzbQA38+M78dzP4D+eqg3gfJHMIHHYa3bg067xj1KxMUWj+VULbiZMowKngFFbKczUrNJ1mg==} + engines: {node: '>= 0.6'} + + content-type@1.0.5: + resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} + engines: {node: '>= 0.6'} + + cookie-signature@1.2.2: + resolution: {integrity: sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==} + engines: {node: '>=6.6.0'} + + cookie@0.7.2: + resolution: {integrity: sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==} + engines: {node: '>= 0.6'} + cookie@1.0.2: resolution: {integrity: sha512-9Kr/j4O16ISv8zBBhJoi4bXOYNTkFLOqSL3UDB0njXxCXNezjeyVrJyGOWtgfs/q2km1gwBcfH8q1yEGoMYunA==} engines: {node: '>=18'} @@ -1937,6 +2017,10 @@ packages: resolution: {integrity: sha512-yCEafptTtb4bk7GLEQoM8KVJpxAfdBJYaXyzQEgQQQgYrZiDp8SJmGKlYza6CYjEDNstAdNdKA3UuoULlEbS6w==} engines: {node: '>=12.13'} + cors@2.8.5: + resolution: {integrity: sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==} + engines: {node: '>= 0.10'} + cose-base@1.0.3: resolution: {integrity: sha512-s9whTXInMSgAp/NVXVNuVxVKzGH2qck3aQlVHxDCdAEPgtMKwc4Wq6/QKhgdEdgbLSi9rBTAcPoRa6JpiG4ksg==} @@ -1966,8 +2050,8 @@ packages: peerDependencies: cytoscape: ^3.2.0 - cytoscape@3.31.1: - resolution: {integrity: sha512-Hx5Mtb1+hnmAKaZZ/7zL1Y5HTFYOjdDswZy/jD+1WINRU8KVi1B7+vlHdsTwY+VCFucTreoyu1RDzQJ9u0d2Hw==} + cytoscape@3.32.0: + resolution: {integrity: sha512-5JHBC9n75kz5851jeklCPmZWcg3hUe6sjqJvyk3+hVqFaKcHwHgxsjeN1yLmggoUc6STbtm9/NQyabQehfjvWQ==} engines: {node: '>=0.10'} d3-array@2.12.1: @@ -2162,8 +2246,8 @@ packages: supports-color: optional: true - debug@4.4.0: - resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==} + debug@4.4.1: + resolution: {integrity: sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==} engines: {node: '>=6.0'} peerDependencies: supports-color: '*' @@ -2204,6 +2288,10 @@ packages: resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} engines: {node: '>=0.4.0'} + depd@2.0.0: + resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} + engines: {node: '>= 0.8'} + dequal@2.0.3: resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} engines: {node: '>=6'} @@ -2216,8 +2304,8 @@ packages: resolution: {integrity: sha512-Mc7QhQ8s+cLrnUfU/Ji94vG/r8M26m8f++vyres4ZoojaRDpZ1eSIh/EpzLNwlWuvzSZ3UbDFspjFvTDXe6e/g==} engines: {node: '>=12.20'} - detect-libc@2.0.3: - resolution: {integrity: sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==} + detect-libc@2.0.4: + resolution: {integrity: sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA==} engines: {node: '>=8'} detect-newline@4.0.1: @@ -2239,12 +2327,8 @@ packages: resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} engines: {node: '>=0.10.0'} - doctrine@3.0.0: - resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} - engines: {node: '>=6.0.0'} - - dompurify@3.2.4: - resolution: {integrity: sha512-ysFSFEDVduQpyhzAob/kkuJjf5zWkZD8/A9ywSp1byueyuCfHamrCBa14/Oc2iiB0e51B+NpxSl5gmzn+Ms/mg==} + dompurify@3.2.5: + resolution: {integrity: sha512-mLPd29uoRe9HpvwP2TxClGQBzGXeEC/we/q+bFlmPPmj2p2Ugl3r6ATu/UU1v77DXNcehiBg9zsr1dREyA/dJQ==} dotenv-cli@8.0.0: resolution: {integrity: sha512-aLqYbK7xKOiTMIRf1lDPbI+Y+Ip/wo5k3eyp6ePysVaSqbyxjyK3dK35BTxG+rmd7djf5q2UPs4noPNH+cj0Qw==} @@ -2258,8 +2342,8 @@ packages: resolution: {integrity: sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ==} engines: {node: '>=12'} - dotenv@16.4.7: - resolution: {integrity: sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ==} + dotenv@16.5.0: + resolution: {integrity: sha512-m/C+AwOAr9/W1UOIZUo232ejMNnJAJtYQjUbHoNTBNTJSvqzzDh7vnrei3o3r3m9blf6ZoDkvcw0VmozNRFJxg==} engines: {node: '>=12'} dunder-proto@1.0.1: @@ -2269,6 +2353,9 @@ packages: eastasianwidth@0.2.0: resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + ee-first@1.1.1: + resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} + emoji-regex-xs@1.0.0: resolution: {integrity: sha512-LRlerrMYoIDrT6jgpeZ2YYl/L8EulRTt5hQcYjy5AInh7HWXKimpqx68aknBFpGL2+/IcogTcaydJEgaTmOpDg==} @@ -2281,6 +2368,10 @@ packages: emoji-regex@9.2.2: resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + encodeurl@2.0.0: + resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==} + engines: {node: '>= 0.8'} + end-of-stream@1.4.4: resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} @@ -2292,8 +2383,8 @@ packages: resolution: {integrity: sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==} engines: {node: '>=8.6'} - entities@4.5.0: - resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} + entities@6.0.0: + resolution: {integrity: sha512-aKstq2TDOndCn4diEyp9Uq/Flu2i1GlLkc6XIDQSDMuaFE3OPW5OphLCyQ5SpSJZTb4reN+kTcYru5yIfXoRPw==} engines: {node: '>=0.12'} err-code@2.0.3: @@ -2318,8 +2409,8 @@ packages: resolution: {integrity: sha512-uDn+FE1yrDzyC0pCo961B2IHbdM8y/ACZsKD4dG6WqrjV53BADjwa7D+1aom2rsNVfLyDgU/eigvlJGJ08OQ4w==} engines: {node: '>= 0.4'} - es-module-lexer@1.6.0: - resolution: {integrity: sha512-qqnD1yMU6tk/jnaMosogGySTZP8YtUgAffA9nMN+E/rjxcfRQ6IEk7IiozUjgxKoFHBGjTLnrHB/YC45r/59EQ==} + es-module-lexer@1.7.0: + resolution: {integrity: sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==} es-object-atoms@1.1.1: resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} @@ -2343,11 +2434,14 @@ packages: esast-util-from-js@2.0.1: resolution: {integrity: sha512-8Ja+rNJ0Lt56Pcf3TAmpBZjmx8ZcK5Ts4cAzIOjsjevg9oSXJnl6SUQ2EevU8tv3h6ZLWmoKL5H4fgWvdvfETw==} - esbuild@0.25.1: - resolution: {integrity: sha512-BGO5LtrGC7vxnqucAe/rmvKdJllfGaYWdyABvyMoXQlfYMb2bbRuReWR5tEGE//4LcNJj9XrkovTqNYRFZHAMQ==} + esbuild@0.25.4: + resolution: {integrity: sha512-8pgjLUcUjcgDg+2Q4NYXnPbo/vncAY4UmyaCm0jZevERqCHZIaWwdJHkf8XQtu4AxSKCdvrUbT0XUr1IdZzI8Q==} engines: {node: '>=18'} hasBin: true + escape-html@1.0.3: + resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} + escape-string-regexp@4.0.0: resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} engines: {node: '>=10'} @@ -2361,8 +2455,8 @@ packages: engines: {node: '>=6.0'} hasBin: true - eslint-config-prettier@10.1.1: - resolution: {integrity: sha512-4EQQr6wXwS+ZJSzaR5ZCrYgLxqvUjdXctaEtBqHcbkW944B1NQyO4qpdHQbXBONfwxXdkAY81HH4+LUfrg+zPw==} + eslint-config-prettier@10.1.5: + resolution: {integrity: sha512-zc1UmCpNltmVY34vuLRV61r1K27sWuX39E+uyUnY8xS2Bex88VV9cugG+UZbRSRGtGyFboj+D8JODyme1plMpw==} hasBin: true peerDependencies: eslint: '>=7.0.0' @@ -2370,48 +2464,49 @@ packages: eslint-import-resolver-node@0.3.9: resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==} - eslint-import-resolver-typescript@4.2.2: - resolution: {integrity: sha512-Rg1YEsb9UKLQ8BOv27cS3TZ6LhEAKQVgVOXArcE/sQrlnX8+FjmJRSC29ij1qrn+eurFuMsCFUcs7/+27T0vqQ==} + eslint-import-resolver-typescript@4.3.4: + resolution: {integrity: sha512-buzw5z5VtiQMysYLH9iW9BV04YyZebsw+gPi+c4FCjfS9i6COYOrEWw9t3m3wA9PFBfqcBCqWf32qrXLbwafDw==} engines: {node: ^16.17.0 || >=18.6.0} peerDependencies: eslint: '*' eslint-plugin-import: '*' eslint-plugin-import-x: '*' - is-bun-module: '*' peerDependenciesMeta: eslint-plugin-import: optional: true eslint-plugin-import-x: optional: true - is-bun-module: - optional: true - eslint-mdx@3.2.0: - resolution: {integrity: sha512-7A6/TDZeUh8ORwM2pe+n1FyUjwEYfGF1OZI+sn45L11NMHSzj/RTK+VqAGjIi+kvDrGc3yScUa20L3DKW0IRjg==} + eslint-mdx@3.4.1: + resolution: {integrity: sha512-/Pt9D5TIAZwAUnCJA24i+uE9NuqulmLI58a1oU1eRb5jeUNOR23FpIt4xuBE9CFR50nd4FkLnuyox7dSNSZ5Tg==} engines: {node: '>=18.0.0'} peerDependencies: eslint: '>=8.0.0' + remark-lint-file-extension: '*' + peerDependenciesMeta: + remark-lint-file-extension: + optional: true - eslint-plugin-check-file@3.1.0: - resolution: {integrity: sha512-bBVjeQvG8ZMCjXr9mJEIZoNf7f5RT+cTqUr6QQq0xMKkWjLQpQtpqUXkBV/XncffOwvyTqjvKpqiQMCXL3mIDw==} + eslint-plugin-check-file@3.2.0: + resolution: {integrity: sha512-jHT3ZkSlazbxNdMhlfS3MotIfSHyNX8Kw0XQ0V7qNaum1Cq3wqEVHJAIwzBNG5JTqjRRBfXClX9pYqsJoNjAMw==} engines: {node: '>=18'} peerDependencies: eslint: '>=9.0.0' - eslint-plugin-import-x@4.9.1: - resolution: {integrity: sha512-YJ9W12tfDBBYVUUI5FVls6ZrzbVmfrHcQkjeHrG6I7QxWAlIbueRD+G4zPTg1FwlBouunTYm9dhJMVJZdj9wwQ==} + eslint-plugin-import-x@4.11.1: + resolution: {integrity: sha512-CiqREASJRnhwCB0NujkTdo4jU+cJAnhQrd4aCnWC1o+rYWIWakVbyuzVbnCriUUSLAnn5CoJ2ob36TEgNzejBQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 - eslint-plugin-jsdoc@50.6.8: - resolution: {integrity: sha512-PPZVqhoXaalMQwDGzcQrJtPSPIPOYsSMtvkjYAdsIazOW20yhYtVX4+jLL+XznD4zYTXyZbPWPRKkNev4D4lyw==} + eslint-plugin-jsdoc@50.6.17: + resolution: {integrity: sha512-hq+VQylhd12l8qjexyriDsejZhqiP33WgMTy2AmaGZ9+MrMWVqPECsM87GPxgHfQn0zw+YTuhqjUfk1f+q67aQ==} engines: {node: '>=18'} peerDependencies: eslint: ^7.0.0 || ^8.0.0 || ^9.0.0 - eslint-plugin-mdx@3.2.0: - resolution: {integrity: sha512-zMD6DoFf5tj86dF1M0g90IxeBzrckyhYwksvalO1vfOBPPzhpR2wAbILBHZnubNuQALVgiqYQbPQ922GpviuGA==} + eslint-plugin-mdx@3.4.1: + resolution: {integrity: sha512-dfQ7LthK/Kmfw2d5XrR4CS1ScmFOa1S9vPjBUxtKgCEl6mNnYVfA/yg50xLyab0pI/GEfGEmvlajs2biDHJBsA==} engines: {node: '>=18.0.0'} peerDependencies: eslint: '>=8.0.0' @@ -2426,14 +2521,14 @@ packages: peerDependencies: eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0 - eslint-plugin-react@7.37.4: - resolution: {integrity: sha512-BGP0jRmfYyvOyvMoRX/uoUeW+GqNj9y16bPQzqAHf3AYII/tDs+jMN0dBVkl88/OZwNGwrVFxE7riHsXVfy/LQ==} + eslint-plugin-react@7.37.5: + resolution: {integrity: sha512-Qteup0SqU15kdocexFNAJMvCJEfa2xUKNV4CC1xsVMrIIqEy3SQ/rqyxCWNzfrd3/ldy6HMlD2e0JDVpDg2qIA==} engines: {node: '>=4'} peerDependencies: eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7 - eslint-plugin-turbo@2.4.4: - resolution: {integrity: sha512-myEnQTjr3FkI0j1Fu0Mqnv1z8n0JW5iFTOUNzHaEevjzl+1uzMSsFwks/x8i3rGmI3EYtC1BY8K2B2pS0Vfx6w==} + eslint-plugin-turbo@2.5.3: + resolution: {integrity: sha512-DlXZd+LgpDlxH/6IsiAXLhy82x0jeJDm0XBEqP6Le08uy0HBQkjCUt7SmXNp8esAtX9RYe6oDClbNbmI1jtK5g==} peerDependencies: eslint: '>6.6.0' turbo: '>2.0.0' @@ -2450,8 +2545,8 @@ packages: resolution: {integrity: sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - eslint@9.22.0: - resolution: {integrity: sha512-9V/QURhsRN40xuHXWjV64yvrzMjcz7ZyNoF2jJFmy9j/SLk0u1OLSZgXi28MrXjymnjEGSR80WCdab3RGMDveQ==} + eslint@9.26.0: + resolution: {integrity: sha512-Hx0MOjPh6uK9oq9nVsATZKE/Wlbai7KFjfCuw9UHaguDW3x+HF0O5nIi3ud39TWgrTjTO5nHxmL3R1eANinWHQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} hasBin: true peerDependencies: @@ -2468,10 +2563,6 @@ packages: resolution: {integrity: sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - espree@9.6.1: - resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - esprima@4.0.1: resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} engines: {node: '>=4'} @@ -2507,12 +2598,8 @@ packages: estree-util-to-js@2.0.0: resolution: {integrity: sha512-WDF+xj5rRWmD5tj6bIqRi6CkLIXbbNQUcxQHzGysQzvHmdYG2G7p/Tf0J0gpxGgkeMZNTIjT/AoSvC9Xehcgdg==} - estree-util-value-to-estree@1.3.0: - resolution: {integrity: sha512-Y+ughcF9jSUJvncXwqRageavjrNPAI+1M/L3BI3PyLp1nmgYTGUXU6t5z1Y7OWuThoDdhPME07bQU+d5LxdJqw==} - engines: {node: '>=12.0.0'} - - estree-util-value-to-estree@3.3.2: - resolution: {integrity: sha512-hYH1aSvQI63Cvq3T3loaem6LW4u72F187zW4FHpTrReJSm6W66vYTFNO1vH/chmcOulp1HlAj1pxn8Ag0oXI5Q==} + estree-util-value-to-estree@3.4.0: + resolution: {integrity: sha512-Zlp+gxis+gCfK12d3Srl2PdX2ybsEA8ZYy6vQGVQTNNYLEGRQQ56XB64bjemN8kxIKXP1nC9ip4Z+ILy9LGzvQ==} estree-util-visit@2.0.0: resolution: {integrity: sha512-m5KgiH85xAhhW8Wta0vShLcUvOsh3LLPI2YVwcbio1l7E09NTLL1EyMZFM1OyWowoH0skScNbhOPl4kcBgzTww==} @@ -2524,12 +2611,24 @@ packages: resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} engines: {node: '>=0.10.0'} + etag@1.8.1: + resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} + engines: {node: '>= 0.6'} + eventemitter2@5.0.1: resolution: {integrity: sha512-5EM1GHXycJBS6mauYAbVKT1cVs7POKWb2NXD4Vyt8dDqeZa7LaDK1/sjtL+Zb0lzTpSNil4596Dyu97hz37QLg==} eventemitter2@6.4.9: resolution: {integrity: sha512-JEPTiaOt9f04oa6NOkc4aH+nVp5I3wEjpHbIPqfgCdD5v5bUzy7xQqwcVO2aDQgOWhI28da57HksMrzK9HlRxg==} + eventsource-parser@3.0.2: + resolution: {integrity: sha512-6RxOBZ/cYgd8usLwsEl+EC09Au/9BcmCKYF2/xbml6DNczf7nv0MQb+7BA2F+li6//I+28VNlQR37XfQtcAJuA==} + engines: {node: '>=18.0.0'} + + eventsource@3.0.7: + resolution: {integrity: sha512-CRT1WTyuQoD771GW56XEZFQ/ZoSfWid1alKGDYMmkt2yl8UXrVR4pspqWNEcqKvVIzg6PAltWjxcSSPrboA4iA==} + engines: {node: '>=18.0.0'} + execa@5.1.1: resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} engines: {node: '>=10'} @@ -2538,12 +2637,22 @@ packages: resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==} engines: {node: '>=16.17'} - expect-type@1.2.0: - resolution: {integrity: sha512-80F22aiJ3GLyVnS/B3HzgR6RelZVumzj9jkL0Rhz4h0xYbNW9PjlQz5h3J/SShErbXBc295vseR4/MIbVmUbeA==} + expect-type@1.2.1: + resolution: {integrity: sha512-/kP8CAwxzLVEeFrMm4kMmy4CCDlpipyA7MYLVrdJIkV0fYF0UaigQHRsxHiuY/GEea+bh4KSv3TIlgr+2UL6bw==} engines: {node: '>=12.0.0'} - exsolve@1.0.4: - resolution: {integrity: sha512-xsZH6PXaER4XoV+NiT7JHp1bJodJVT+cxeSH1G0f0tlT0lJqYuHUP3bUx2HtfTDvOagMINYp8rsqusxud3RXhw==} + express-rate-limit@7.5.0: + resolution: {integrity: sha512-eB5zbQh5h+VenMPM3fh+nw1YExi5nMr6HUCR62ELSP11huvxm/Uir1H1QEyTkk5QX6A58pX6NmaTMceKZ0Eodg==} + engines: {node: '>= 16'} + peerDependencies: + express: ^4.11 || 5 || ^5.0.0-beta.1 + + express@5.1.0: + resolution: {integrity: sha512-DT9ck5YIRU+8GYzzU5kT3eHGA5iL+1Zd0EutOmTE9Dtk+Tvuzd23VBU+ec7HPNSTxXYO55gPV/hq4pSBJDjFpA==} + engines: {node: '>= 18'} + + exsolve@1.0.5: + resolution: {integrity: sha512-pz5dvkYYKQ1AHVrgOzBKWeP4u4FRb3a6DNK2ucr0OoNwYIU4QWsJ+NM36LLzORT+z845MzKHHhpXiUF5nvQoJg==} extend@3.0.2: resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} @@ -2600,8 +2709,8 @@ packages: fast-uri@3.0.6: resolution: {integrity: sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw==} - fastify@5.2.1: - resolution: {integrity: sha512-rslrNBF67eg8/Gyn7P2URV8/6pz8kSAscFL4EThZJ8JBMaXacVdVE4hmUcnPNKERl5o/xTiBSLfdowBRhVF1WA==} + fastify@5.3.3: + resolution: {integrity: sha512-nCBiBCw9q6jPx+JJNVgO8JVnTXeUyrGcyTKPQikRkA/PanrFcOIo4R+ZnLeOLPZPGgzjomqfVarzE0kYx7qWiQ==} fastq@1.19.1: resolution: {integrity: sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==} @@ -2612,8 +2721,8 @@ packages: fclone@1.0.11: resolution: {integrity: sha512-GDqVQezKzRABdeqflsgMr7ktzgF9CyS+p2oe0jJqUY6izSSbhPIQJDpoU4PtGcD7VPM9xh/dVrTu6z1nwgmEGw==} - fdir@6.4.3: - resolution: {integrity: sha512-PMXmW2y1hDDfTSRc9gaXIuCCRpuoz3Kaz8cUelp3smouvfT632ozg2vrT6lJsHKKOF59YLbOGfAWGUcKEfRMQw==} + fdir@6.4.4: + resolution: {integrity: sha512-1NZP+GK4GfuAv3PqKvxQRDMjdSRZjnkq7KfhlNrCNNlZ0ygQFpebfrnfnq/W7fpUnAv9aGWmY1zKx7FYL3gwhg==} peerDependencies: picomatch: ^3 || ^4 peerDependenciesMeta: @@ -2628,9 +2737,13 @@ packages: resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} engines: {node: '>=8'} - find-my-way@9.2.0: - resolution: {integrity: sha512-d3uCir8Hmg7W1Ywp8nKf2lJJYU9Nwinvo+1D39Dn09nz65UKXIxUh7j7K8zeWhxqe1WrkS7FJyON/Q/3lPoc6w==} - engines: {node: '>=14'} + 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-up@4.1.0: resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} @@ -2672,6 +2785,14 @@ packages: resolution: {integrity: sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww==} engines: {node: '>=0.4.x'} + forwarded@0.2.0: + resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} + engines: {node: '>= 0.6'} + + fresh@2.0.0: + resolution: {integrity: sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==} + engines: {node: '>= 0.8'} + fs-extra@7.0.1: resolution: {integrity: sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==} engines: {node: '>=6 <7 || >=8'} @@ -2712,10 +2833,6 @@ packages: resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} engines: {node: '>= 0.4'} - get-stdin@9.0.0: - resolution: {integrity: sha512-dVKBjfWisLAicarI2Sf+JuBE/DghV4UzNAVe9yhEJuzeREd3JhOTE9cUaJTeSa77fsbQUK3pcOpJfM59+VKZaA==} - engines: {node: '>=12'} - get-stream@6.0.1: resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} engines: {node: '>=10'} @@ -2735,8 +2852,8 @@ packages: resolution: {integrity: sha512-E1b1lFFLvLgak2whF2xDBcOy6NLVGZBqqjJjsIhvopKfWWEi64pLVTWWehV8KlLerZkfNTA95sTe2OdJKm1OzQ==} engines: {node: '>= 14'} - git-hooks-list@3.2.0: - resolution: {integrity: sha512-ZHG9a1gEhUMX1TvGrLdyWb9kDopCBbTnI8z4JgRMYxsijWipgjSEYoPWqBuIB0DnRnvqlQSEeVmzpeuPm7NdFQ==} + git-hooks-list@4.1.1: + resolution: {integrity: sha512-cmP497iLq54AZnv4YRAEMnEyQ1eIn4tGKbmswqwmFV4GBnAqE8NLtWxxdXa++AalfgL5EBH4IxTPyquEuGY/jA==} git-node-fs@1.0.0: resolution: {integrity: sha512-bLQypt14llVXBg0S0u8q8HmU7g9p3ysH+NvVlae5vILuUvs759665HvmR5+wb04KjHyjFcDRxdYb4kyNnluMUQ==} @@ -2772,8 +2889,8 @@ packages: resolution: {integrity: sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==} engines: {node: '>=18'} - globals@16.0.0: - resolution: {integrity: sha512-iInW14XItCXET01CQFqudPOWP2jYMl7T+QRQT+UNcR/iQncN/F0UNpgd76iFkBPgNQb4+X3LV9tLJYzwh+Gl3A==} + globals@16.1.0: + resolution: {integrity: sha512-aibexHNbb/jiUSObBgpHLj+sIuUmJnYcgXBlrfsiDZ9rt4aF2TFRbyLgZ2iFQuVZ1K5Mx3FVkbKRSgKrbK3K2g==} engines: {node: '>=18'} globalthis@1.0.4: @@ -2879,6 +2996,10 @@ packages: html-void-elements@3.0.0: resolution: {integrity: sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==} + http-errors@2.0.0: + resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} + engines: {node: '>= 0.8'} + http-proxy-agent@7.0.2: resolution: {integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==} engines: {node: '>= 14'} @@ -2915,6 +3036,10 @@ packages: resolution: {integrity: sha512-InwqeHHN2XpumIkMvpl/DCJVrAHgCsG5+cn1XlnLWGwtZBm8QJfSusItfrwx81CTp5agNZqpKU2J/ccC5nGT4A==} engines: {node: '>= 4'} + ignore@7.0.4: + resolution: {integrity: sha512-gJzzk+PQNznz8ysRrC0aOkBNVRBDtE1n53IqyqEf3PXrYwomFs5q4pGMizBMJF+ykh03insJ27hB8gSrD2Hn8A==} + engines: {node: '>= 4'} + import-fresh@3.3.1: resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} engines: {node: '>=6'} @@ -2954,6 +3079,10 @@ packages: resolution: {integrity: sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==} engines: {node: '>= 12'} + ipaddr.js@1.9.1: + resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} + engines: {node: '>= 0.10'} + ipaddr.js@2.2.0: resolution: {integrity: sha512-Ag3wB2o37wslZS19hZqorUnrnzSkpOVy+IiiDEiTqNubEYpYuHWIf6K4psgN2ZWKExS4xhVCrRVfb/wfW8fWJA==} engines: {node: '>= 10'} @@ -2990,6 +3119,9 @@ packages: resolution: {integrity: sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==} engines: {node: '>= 0.4'} + is-bun-module@2.0.0: + resolution: {integrity: sha512-gNCGbnnnnFAUGKeZ9PdbyeGYJqewpmc2aKHUEMO5nQPWU9lOmv7jcmQIv+qHD8fXW6W7qfuCwX4rY9LNRjXrkQ==} + is-callable@1.2.7: resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} engines: {node: '>= 0.4'} @@ -3062,10 +3194,6 @@ packages: resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} engines: {node: '>=0.12.0'} - is-plain-obj@3.0.0: - resolution: {integrity: sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==} - engines: {node: '>=10'} - is-plain-obj@4.1.0: resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} engines: {node: '>=12'} @@ -3074,6 +3202,9 @@ packages: resolution: {integrity: sha512-9UoipoxYmSk6Xy7QFgRv2HDyaysmgSG75TFQs6S+3pDM7ZhKTF/bskZV+0UlABHzKjNVhPjYCLfeZUEg1wXxig==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + 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'} @@ -3213,8 +3344,8 @@ packages: resolution: {integrity: sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==} engines: {node: '>=4.0'} - katex@0.16.21: - resolution: {integrity: sha512-XvqR7FgOHtWupfMiigNzmh+MgUVmDGU2kXZm899ZkPfcuoPuFxyHmXsgATDpFZDAXCI8tvinaVcDo8PIIJSo4A==} + katex@0.16.22: + resolution: {integrity: sha512-XCHRdUw4lf3SKBaJe4EvgqIuWwkPSo9XoeO8GjQW94Bp7TWv9hNhzZjZ+OH9yf1UmLygb7DIT5GSFQiyt16zYg==} hasBin: true keyv@4.5.4: @@ -3230,8 +3361,8 @@ packages: kolorist@1.8.0: resolution: {integrity: sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==} - langium@3.0.0: - resolution: {integrity: sha512-+Ez9EoiByeoTu/2BXmEaZ06iPNXM6thWJp02KfBO/raSMyCJ4jw7AkWWa+zBCTm0+Tw1Fj9FOxdqSskyN5nAwg==} + langium@3.3.1: + resolution: {integrity: sha512-QJv/h939gDpvT+9SiLVlY7tZC3xB2qK57v0J04Sh9wpMb6MP1q8gB21L3WIo8T5P1MSMg3Ep14L7KkDCFG3y4w==} engines: {node: '>=16.0.0'} layout-base@1.0.2: @@ -3291,8 +3422,8 @@ packages: lru-cache@10.4.3: resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} - lru-cache@11.0.2: - resolution: {integrity: sha512-123qHRfJBmo2jXDbo/a5YOQrJoHF/GNQTLzQ5+IdK5pWpceK17yRc6ozlWd25FxvGKQbIUs91fDFkXmDHTKcyA==} + lru-cache@11.1.0: + resolution: {integrity: sha512-QIXZUBJUx+2zHUdQujWejBkcD9+cs94tLn0+YL8UrCh+D5sCXZ4c7LaEH48pNwRY3MLDgqUFyhlCyjJPf1WP0A==} engines: {node: 20 || >=22} lru-cache@6.0.0: @@ -3313,8 +3444,8 @@ packages: markdown-table@3.0.4: resolution: {integrity: sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==} - marked@15.0.7: - resolution: {integrity: sha512-dgLIeKGLx5FwziAnsk4ONoGwHwGPJzselimvlVskE9XLN4Orv9u2VA3GWw/lYUqjfA0rUT/6fqKwfZJapP9BEg==} + marked@15.0.11: + resolution: {integrity: sha512-1BEXAU2euRCG3xwgLVT1y0xbJEld1XOrmRJpUwRCcy7rxhSCwMrmEu9LXoPhHSCJG41V7YcQ2mjKRr5BA3ITIA==} engines: {node: '>= 18'} hasBin: true @@ -3379,6 +3510,14 @@ packages: mdast-util-to-string@4.0.0: resolution: {integrity: sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==} + media-typer@1.1.0: + resolution: {integrity: sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==} + engines: {node: '>= 0.8'} + + 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==} @@ -3386,8 +3525,8 @@ packages: resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} engines: {node: '>= 8'} - mermaid@11.5.0: - resolution: {integrity: sha512-IYhyukID3zzDj1EihKiN1lp+PXNImoJ3Iyz73qeDAgnus4BNGsJV1n471P4PyeGxPVONerZxignwGxGTSwZnlg==} + mermaid@11.6.0: + resolution: {integrity: sha512-PE8hGUy1LDlWIHWBP05SFdqUHGmRcCcK4IzpOKPE35eOw+G9zZgcnMpyunJVUEOgb//KBORPjysKndw8bFLuRg==} mhchemparser@4.2.1: resolution: {integrity: sha512-kYmyrCirqJf3zZ9t/0wGgRZ4/ZJw//VwaRVGA75C4nhE60vtnIzhl9J9ndkX/h6hxSN7pjg/cE0VxbnNM+bnDQ==} @@ -3422,11 +3561,11 @@ packages: micromark-extension-math@3.1.0: resolution: {integrity: sha512-lvEqd+fHjATVs+2v/8kg9i5Q0AP2k85H0WUOwpIVvUML8BapsMvh1XAogmQjOCsLpoKRCVQqEkQBB3NhVBcsOg==} - micromark-extension-mdx-expression@3.0.0: - resolution: {integrity: sha512-sI0nwhUDz97xyzqJAbHQhp5TfaxEvZZZ2JDqUo+7NvyIYG6BZ5CPPqj2ogUoPJlmXHBnyZUzISg9+oUmU6tUjQ==} + micromark-extension-mdx-expression@3.0.1: + resolution: {integrity: sha512-dD/ADLJ1AeMvSAKBwO22zG22N4ybhe7kFIZ3LsDI0GlsNr2A3KYxb0LdC1u5rj4Nw+CHKY0RVdnHX8vj8ejm4Q==} - micromark-extension-mdx-jsx@3.0.1: - resolution: {integrity: sha512-vNuFb9czP8QCtAQcEJn0UJQJZA8Dk6DXKBqx+bg/w0WGuSxDxNr7hErW89tHUY31dUW4NqEOWwmEUNhjTFmHkg==} + micromark-extension-mdx-jsx@3.0.2: + resolution: {integrity: sha512-e5+q1DjMh62LZAJOnDraSSbDMvGJ8x3cbjygy2qFEi7HCeUT4BDKCvMozPozcD6WmOt6sVvYDNBKhFSz3kjOVQ==} micromark-extension-mdx-md@2.0.0: resolution: {integrity: sha512-EpAiszsB3blw4Rpba7xTOUptcFeBFi+6PY8VnJ2hhimH+vCQDirWgsMpz7w1XcZE7LVrSAUGb9VJpG9ghlYvYQ==} @@ -3443,8 +3582,8 @@ packages: micromark-factory-label@2.0.1: resolution: {integrity: sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==} - micromark-factory-mdx-expression@2.0.2: - resolution: {integrity: sha512-5E5I2pFzJyg2CtemqAbcyCktpHXuJbABnsb32wX2U8IQKhhVFBqkcZR5LRm1WVoFqa4kTueZK4abep7wdo9nrw==} + micromark-factory-mdx-expression@2.0.3: + resolution: {integrity: sha512-kQnEtA3vzucU2BkrIa8/VaSAsP+EJ3CKOvhMuJgOEGg9KDC6OAY6nSnNDVRiVNRqj7Y4SlSzcStaH/5jge8JdQ==} micromark-factory-space@2.0.1: resolution: {integrity: sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==} @@ -3476,8 +3615,8 @@ packages: micromark-util-encode@2.0.1: resolution: {integrity: sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==} - micromark-util-events-to-acorn@2.0.2: - resolution: {integrity: sha512-Fk+xmBrOv9QZnEDguL9OI9/NQQp6Hz4FuQ4YmCb/5V7+9eAh1s6AYSvL20kHkD67YIg7EpE54TiSlcsf3vyZgA==} + micromark-util-events-to-acorn@2.0.3: + resolution: {integrity: sha512-jmsiEIiZ1n7X1Rr5k8wVExBQCg5jy4UXVADItHmNk1zkwEVhBuIUKRu3fqv+hs4nxLISi2DQGlqIOGiFxgbfHg==} micromark-util-html-tag-name@2.0.1: resolution: {integrity: sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==} @@ -3527,6 +3666,10 @@ packages: resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} engines: {node: '>= 0.6'} + mime-types@3.0.1: + resolution: {integrity: sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==} + engines: {node: '>= 0.6'} + mimic-fn@2.1.0: resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} engines: {node: '>=6'} @@ -3564,8 +3707,8 @@ packages: mlly@1.7.4: resolution: {integrity: sha512-qmdSIPC4bDJXgZTCR7XosJiNKySV7O215tsPtDN9iEO/7q/76b/ijtgRu/+epFXSJhijtTCCGp3DWS549P3xKw==} - module-details-from-path@1.0.3: - resolution: {integrity: sha512-ySViT69/76t8VhE1xXHK6Ch4NcDd26gx0MzKXLO+F7NOtnqH68d9zF94nT8ZWSxXh8ELOERsnJO/sWt1xZYw5A==} + module-details-from-path@1.0.4: + resolution: {integrity: sha512-EGWKgxALGMgzvxYF1UyGTy0HXX/2vHLkw6+NvDKW2jypWbHpjQuj4UMcqQWXHERJhVGKikolT06G3bcKe4fi7w==} mri@1.2.0: resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} @@ -3585,6 +3728,11 @@ packages: engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true + napi-postinstall@0.2.4: + resolution: {integrity: sha512-ZEzHJwBhZ8qQSbknHqYcdtQVr8zUgGyM/q6h6qAyhtyVMNrSgDhrC4disf03dYW0e+czXyLnZINnCTEkWy0eJg==} + engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} + hasBin: true + natural-compare@1.4.0: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} @@ -3611,8 +3759,8 @@ packages: react: ^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc react-dom: ^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc - next@15.3.0-canary.16: - resolution: {integrity: sha512-avt6+iv67AK7McJioEfiWFQF2/CfPFCSi9CCQ6dOA6Ozsd4JC1Q7ZoF34qcEGQXgVfc4DhdVWxUcIR2c222ihg==} + next@15.3.2: + resolution: {integrity: sha512-CA3BatMyHkxZ48sgOCLdVHjFU36N7TF1HhqAHLFOkV6buwZnvMI84Cug8xD56B9mCuKrqXnLn94417GrZ/jjCQ==} engines: {node: ^18.18.0 || ^19.8.0 || >= 20.0.0} hasBin: true peerDependencies: @@ -3724,6 +3872,10 @@ packages: resolution: {integrity: sha512-0eJJY6hXLGf1udHwfNftBqH+g73EU4B504nZeKpz1sYRKafAghwxEJunB2O7rDZkL4PGfsMVnTXZ2EjibbqcsA==} engines: {node: '>=14.0.0'} + on-finished@2.4.1: + resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} + engines: {node: '>= 0.8'} + on-headers@1.0.2: resolution: {integrity: sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==} engines: {node: '>= 0.8'} @@ -3799,6 +3951,9 @@ packages: package-manager-detector@0.2.11: resolution: {integrity: sha512-BEnLolu+yuz22S56CU1SUKq3XC3PkwD5wv4ikR4MfGvnRVcmzXR9DwSlW2fEamyTPyXHomBJRzgapeuBvRNzJQ==} + package-manager-detector@1.3.0: + resolution: {integrity: sha512-ZsEbbZORsyHuO00lY1kV3/t72yp6Ysay6Pd17ZAlNGuGwmWDLCJxFpRs0IzfXfj1o4icJOkUEioexFHzyPurSQ==} + pagefind@1.3.0: resolution: {integrity: sha512-8KPLGT5g9s+olKMRTU9LFekLizkVIu9tes90O1/aigJ0T5LmyPqTzGJrETnSw3meSYg58YH7JTzhTTW/3z6VAw==} hasBin: true @@ -3813,9 +3968,8 @@ packages: parse-entities@4.0.2: resolution: {integrity: sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw==} - parse-imports@2.2.1: - resolution: {integrity: sha512-OL/zLggRp8mFhKL0rNORUTR4yBYujK/uU+xZL+/0Rgm2QE4nLO9v8PzEweSJEbMGKmDRjJE4R3IMJlL2di4JeQ==} - engines: {node: '>= 18'} + parse-imports-exports@0.2.4: + resolution: {integrity: sha512-4s6vd6dx1AotCx/RCI2m7t7GCh5bDRUtGNvRfHSP2wbBQdMi67pPe7mtzmgwcaQ8VKK/6IB7Glfyu3qdZJPybQ==} parse-json@7.1.1: resolution: {integrity: sha512-SgOTCX/EZXtZxBE5eJ97P4yGM5n37BwRU+YMsH4vNzFqJV/oWFXXCmwFlgWUM4PrakybVOueJJ6pwHqSVhTFDw==} @@ -3827,8 +3981,15 @@ packages: parse-numeric-range@1.3.0: resolution: {integrity: sha512-twN+njEipszzlMJd4ONUYgSfZPDxgHhT9Ahed5uTigpQn90FggW4SA/AIPq/6a149fTbE9qBEcSwE3FAEp6wQQ==} - parse5@7.2.1: - resolution: {integrity: sha512-BuBYQYlv1ckiPdQi/ohiivi9Sagc9JG+Ozs0r7b/0iK3sKmrb0b9FdWdBbOdx6hBCM/F9Ir82ofnBhtZOjCRPQ==} + parse-statements@1.0.11: + resolution: {integrity: sha512-HlsyYdMBnbPQ9Jr/VgJ1YF4scnldvJpJxCVx6KgqPL4dxppsWrJHCIIxQXMJrqGnsRkNPATbeMJ8Yxu7JMsYcA==} + + parse5@7.3.0: + resolution: {integrity: sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==} + + parseurl@1.3.3: + resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} + engines: {node: '>= 0.8'} path-data-parser@0.1.0: resolution: {integrity: sha512-NOnmBpt5Y2RWbuv0LMzsayp3lVylAHLPUTut412ZA3l+C4uw4ZVkQbjShYCQ8TCpUMdPapr4YjUqLYD6v68j+w==} @@ -3858,6 +4019,10 @@ packages: path-to-regexp@3.3.0: resolution: {integrity: sha512-qyCH421YQPS2WFDxDjftfc1ZR5WKQzVzqsp4n9M2kQhVOo/ByahFoUNJfl58kOcEGfQ//7weFTDhm+ss8Ecxgw==} + path-to-regexp@8.2.0: + resolution: {integrity: sha512-TdrF7fW9Rphjq4RjrW0Kp2AW0Ahwu9sRGTkS6bvDi0SCwZlEZYmcfDbEsTz8RVk0EHIS/Vd1bv3JhG+1xZuAyQ==} + engines: {node: '>=16'} + path-type@4.0.0: resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} engines: {node: '>=8'} @@ -3906,19 +4071,23 @@ packages: resolution: {integrity: sha512-i85pKRCt4qMjZ1+L7sy2Ag4t1atFcdbEt76+7iRJn1g2BvsnRMGu9p8pivl9fs63M2kF/A0OacFZhTub+m/qMg==} hasBin: true + pkce-challenge@5.0.0: + resolution: {integrity: sha512-ueGLflrrnvwB3xuo/uGob5pd5FN7l0MsLf0Z87o/UQmRtwjvfylfc9MurIxRAWywCYTgrvpXBcqjV4OfCYGCIQ==} + engines: {node: '>=16.20.0'} + pkg-types@1.3.1: resolution: {integrity: sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==} pkg-types@2.1.0: resolution: {integrity: sha512-wmJwA+8ihJixSoHKxZJRBQG1oY8Yr9pGLzRmSsNms0iNWyHHAlZCa7mmKiFR10YPZuz/2k169JiS/inOjBCZ2A==} - playwright-core@1.51.1: - resolution: {integrity: sha512-/crRMj8+j/Nq5s8QcvegseuyeZPxpQCZb6HNk3Sos3BlZyAknRjoyJPFWkpNn8v0+P3WiwqFF8P+zQo4eqiNuw==} + playwright-core@1.52.0: + resolution: {integrity: sha512-l2osTgLXSMeuLZOML9qYODUQoPPnUsKsb5/P6LJ2e6uPKXUdPK5WYhN4z03G+YNbWmGDY4YENauNu4ZKczreHg==} engines: {node: '>=18'} hasBin: true - playwright@1.51.1: - resolution: {integrity: sha512-kkx+MB2KQRkyxjYPc3a0wLZZoDczmppyGJIvQ43l+aZihkaVvmu/21kiyaHeHjiFxjxNNFnUncKmcGIyOojsaw==} + playwright@1.52.0: + resolution: {integrity: sha512-JAwMNMBlxJ2oD1kce4KPtMkDeKGHQstdpFPcPH3maElAXon/QZeTvtsfXmTMRyO9TslfoYOXkSsvao2nE1ilTw==} engines: {node: '>=18'} hasBin: true @@ -3940,8 +4109,8 @@ packages: pm2-sysmonit@1.2.8: resolution: {integrity: sha512-ACOhlONEXdCTVwKieBIQLSi2tQZ8eKinhcr9JpZSUAL8Qy0ajIgRtsLxG/lwPOW3JEKqPyw/UaHmTWhUzpP4kA==} - pm2@6.0.5: - resolution: {integrity: sha512-+O43WPaEiwYbm6/XSpAOO1Rtya/Uof0n7x8hJZGfwIuepesNTIVArpZh4KqFfze0cvvqZMr0maTW3ifhvmyeMQ==} + pm2@6.0.6: + resolution: {integrity: sha512-6t+I+Gc232dKe0OjwFYlU59JoY8MWBqsBmcZMSfKollByL4q8APUFwWOt7OtPH4lGO4Sb6GiFAqu7xT42QeRBA==} engines: {node: '>=16.0.0'} hasBin: true @@ -3967,8 +4136,8 @@ packages: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} engines: {node: '>= 0.8.0'} - prettier-plugin-packagejson@2.5.10: - resolution: {integrity: sha512-LUxATI5YsImIVSaaLJlJ3aE6wTD+nvots18U3GuQMJpUyClChaZlQrqx3dBnbhF20OnKWZyx8EgyZypQtBDtgQ==} + prettier-plugin-packagejson@2.5.13: + resolution: {integrity: sha512-94B/Xy25HwiwSkGUGnwQw3cBw9jg9L5LfKCHpuRMjC8ETPq4oCMa2S4EblV628E0XER9n6v5rH0TQY9cUd10pg==} peerDependencies: prettier: '>= 1.16.0' peerDependenciesMeta: @@ -3992,6 +4161,9 @@ packages: process-warning@4.0.1: resolution: {integrity: sha512-3c2LzQ3rY9d0hc1emcsHhfT9Jwz0cChib/QN89oME2R451w5fy3f0afAhERFZAwrbDU43wk12d0ORBpDVME50Q==} + process-warning@5.0.0: + resolution: {integrity: sha512-a39t9ApHNx2L4+HBnQKqxxHNs1r7KF+Intd8Q/g1bUh6q0WIp9voPXJ/x0j+ZL45KF1pJd9+q2jLIRMfvEshkA==} + promise-inflight@1.0.1: resolution: {integrity: sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==} peerDependencies: @@ -4013,8 +4185,12 @@ packages: property-information@6.5.0: resolution: {integrity: sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig==} - property-information@7.0.0: - resolution: {integrity: sha512-7D/qOz/+Y4X/rzSB6jKxKUsQnphO046ei8qxG59mtM3RG3DHgTK81HrxrmoDVINJb8NKT5ZsRbwHvQ6B68Iyhg==} + property-information@7.1.0: + resolution: {integrity: sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==} + + proxy-addr@2.0.7: + resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} + engines: {node: '>= 0.10'} proxy-agent@6.4.0: resolution: {integrity: sha512-u0piLU+nCOHMgGjRbimiXmA9kM/L9EHh3zL81xCdp7m+Y2pHIsnmbdDoEDoAz5geaonNR6q6+yOPQs6n4T6sBQ==} @@ -4030,6 +4206,10 @@ packages: resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} engines: {node: '>=6'} + qs@6.14.0: + resolution: {integrity: sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==} + engines: {node: '>=0.6'} + quansync@0.2.10: resolution: {integrity: sha512-t41VRkMYbkHyCYmOvx/6URnN80H7k4X0lLdBMGsz+maAwrJQYB1djpV6vHrQIBE0WBSGqhtEHrK9U3DWWH8v7A==} @@ -4043,6 +4223,14 @@ packages: resolution: {integrity: sha512-kA5WQoNVo4t9lNx2kQNFCxKeBl5IbbSNBl1M/tLkw9WCn+hxNBAW5Qh8gdhs63CJnhjJ2zQWFoqPJP2sK1AV5A==} engines: {node: '>= 0.6'} + range-parser@1.2.1: + resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} + engines: {node: '>= 0.6'} + + raw-body@3.0.0: + resolution: {integrity: sha512-RmkhL8CAyCRPXCE28MMH0z2PNWQBNk2Q09ZdxM9IOOXwxwZbN+qbWaatPkdkWIKL2ZVDImrN/pK5HTRz2PcS4g==} + engines: {node: '>= 0.8'} + rc@1.2.8: resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} hasBin: true @@ -4052,10 +4240,10 @@ packages: peerDependencies: react: ^17.0.0 || ^18.0.0 || ^19.0.0 - react-dom@19.0.0: - resolution: {integrity: sha512-4GV5sHFG0e/0AD4X+ySy6UJd3jVl1iNsNHdpad0qhABJ11twS3TTBnseqsKurKcsNqCEFeGL3uLpVChpIO3QfQ==} + react-dom@19.1.0: + resolution: {integrity: sha512-Xs1hdnE+DyKgeHJeJznQmYMIBG3TKIHJJT95Q58nHLSrElKlGQqDTR2HQ9fx5CN/Gk6Vh/kupBTDLU11/nDk/g==} peerDependencies: - react: ^19.0.0 + react: ^19.1.0 react-is@16.13.1: resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} @@ -4066,8 +4254,8 @@ packages: 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 - react@19.0.0: - resolution: {integrity: sha512-V8AVnmPIICiWpGfm6GLzCR/W5FXLchHop40W4nXBmdlEceh16rCN8O8LNWm5bh5XUX91fh7KpA+W0TgMKmgTpQ==} + react@19.1.0: + resolution: {integrity: sha512-FS+XFBNvn3GTAWq26joslQgWNoFu08F4kl0J4CgdNKADkdSGXQyTCnKteIAJy96Br6YbpEU1LSzV5dYtjMkMDg==} engines: {node: '>=0.10.0'} read-package-json-fast@3.0.2: @@ -4116,9 +4304,6 @@ packages: resolution: {integrity: sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==} engines: {node: '>= 0.4'} - regenerator-runtime@0.14.1: - resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} - regex-recursion@6.0.2: resolution: {integrity: sha512-0YCaSCq2VRIebiaUviZNs0cBz1kg5kVS2UKUfNIx8YVs1cN3AV7NTctO5FOKBA+UT2BPJIWZauYHPqJODG50cg==} @@ -4172,11 +4357,11 @@ packages: remark-parse@11.0.0: resolution: {integrity: sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==} - remark-reading-time@2.0.1: - resolution: {integrity: sha512-fy4BKy9SRhtYbEHvp6AItbRTnrhiDGbqLQTSYVbQPGuRCncU1ubSsh9p/W5QZSxtYcUXv8KGL0xBgPLyNJA1xw==} + remark-reading-time@2.0.2: + resolution: {integrity: sha512-ILjIuR0dQQ8pELPgaFvz7ralcSN62rD/L1pTUJgWb4gfua3ZwYEI8mnKGxEQCbrXSUF/OvycTkcUbifGOtOn5A==} - remark-rehype@11.1.1: - resolution: {integrity: sha512-g/osARvjkBXb6Wo0XvAeXQohVta8i84ACbenPpoSsxTOQH/Ae0/RGP4WZgnMH5pMLpsj4FG7OHmcIcXxpza8eQ==} + remark-rehype@11.1.2: + resolution: {integrity: sha512-Dh7l57ianaEoIpzbp0PC9UKAdCSVklD8E5Rpw7ETfbTl3FqcOOgq5q2LVDhgGCkaBv7p24JXikPdvhhmHvKMsw==} remark-smartypants@3.0.2: resolution: {integrity: sha512-ILTWeOriIluwEvPjv67v7Blgrcx+LZOkAUVtKI3putuhlZm84FnqDORNXPPm+HY3NdZOMhyDwZ1E+eZB/Df5dA==} @@ -4243,16 +4428,17 @@ packages: robust-predicates@3.0.2: resolution: {integrity: sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg==} - rollup@4.36.0: - resolution: {integrity: sha512-zwATAXNQxUcd40zgtQG0ZafcRK4g004WtEl7kbuhTWPvf07PsfohXl39jVUvPF7jvNAIkKPQ2XrsDlWuxBd++Q==} + rollup@4.40.2: + resolution: {integrity: sha512-tfUOg6DTP4rhQ3VjOO6B4wyrJnGOX85requAXvqYTHsOgb2TFJdZ3aWpT8W2kPoypSGP7dZUyzxJ9ee4buM5Fg==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true roughjs@4.6.6: resolution: {integrity: sha512-ZUz/69+SYpFN/g/lUlo2FXcIjRkSu3nDarreVdGGndHEBJ6cXPdKguS8JGxwj5HA5xIbVKSmLgr5b3AWxtRfvQ==} - rspack-resolver@1.2.2: - resolution: {integrity: sha512-Fwc19jMBA3g+fxDJH2B4WxwZjE0VaaOL7OX/A4Wn5Zv7bOD/vyPZhzXfaO73Xc2GAlfi96g5fGUa378WbIGfFw==} + router@2.2.0: + resolution: {integrity: sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==} + engines: {node: '>= 18'} run-parallel@1.2.0: resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} @@ -4285,8 +4471,8 @@ packages: resolution: {integrity: sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==} engines: {node: '>= 0.4'} - safe-regex2@4.0.1: - resolution: {integrity: sha512-goqsB+bSlOmVX+CiFX2PFc1OV88j5jvBqIM+DgqrucHnUguAUNtiNOs+aTadq2NqsLQ+TQ3UEVG3gtSFcdlkCg==} + safe-regex2@5.0.0: + resolution: {integrity: sha512-YwJwe5a51WlK7KbOJREPdjNrpViQBI3p4T50lfwPuDhZnE3XGVTlGvi+aolc5+RvxDD6bnUmjVsU9n1eboLUYw==} safe-stable-stringify@2.5.0: resolution: {integrity: sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==} @@ -4298,8 +4484,8 @@ packages: sax@1.4.1: resolution: {integrity: sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==} - scheduler@0.25.0: - resolution: {integrity: sha512-xFVuu11jh+xcO7JOAGJNOXld8/TcEHK/4CituBUeUb5hqxJLj9YuemAEuvm9gQ/+pgXYfbQuqAkiYu+u7YEsNA==} + scheduler@0.26.0: + resolution: {integrity: sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA==} scroll-into-view-if-needed@3.1.0: resolution: {integrity: sha512-49oNpRjWRvnU8NyGVmUaYG4jtTkNonFZI86MmGRDqBphEK2EXT9gdEUoQPZhuBM8yWHxCWbobltqYO5M4XrUvQ==} @@ -4307,8 +4493,8 @@ 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.0.0: + resolution: {integrity: sha512-dxtLJO6sc35jWidmLxo7ij+Eg48PM/kleBsxpC8QJE0qJICe+KawkDQmvCMZUr9u7WKVHgMW6vy3fQ7zMiFZMA==} semver@6.3.1: resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} @@ -4319,14 +4505,22 @@ packages: engines: {node: '>=10'} hasBin: true - semver@7.7.1: - resolution: {integrity: sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==} + semver@7.7.2: + resolution: {integrity: sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==} engines: {node: '>=10'} hasBin: true + send@1.2.0: + resolution: {integrity: sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw==} + engines: {node: '>= 18'} + serve-handler@6.1.6: resolution: {integrity: sha512-x5RL9Y2p5+Sh3D38Fh9i/iQ5ZK+e4xuXRd/pGbM4D13tgo/MGwbttUk8emytcr1YYzBYs+apnUngBDFYfpjPuQ==} + serve-static@2.2.0: + resolution: {integrity: sha512-61g9pCh0Vnh7IutZjtLGGpTA355+OPn2TyDv/6ivP2h/AdAVX9azsoxmg2/M6nZeQZNYBEwIcsne1mJd9oQItQ==} + engines: {node: '>= 18'} + serve@14.2.4: resolution: {integrity: sha512-qy1S34PJ/fcY8gjVGszDB3EXiPSk5FKhUa7tQe0UPRddxRidc2V6cNHPNewbE1D7MAkgLuWEt3Vw56vYy73tzQ==} engines: {node: '>= 14'} @@ -4347,8 +4541,11 @@ packages: resolution: {integrity: sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==} engines: {node: '>= 0.4'} - sharp@0.33.5: - resolution: {integrity: sha512-haPVm1EkS9pgvHrQ/F3Xy+hgcuMV0Wm9vfIBSiwZ05k+xgb0PkBQpGsAA/oWdDobNaZTH5ppvHtzCFbnSEwHVw==} + setprototypeof@1.2.0: + resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} + + sharp@0.34.1: + resolution: {integrity: sha512-1j0w61+eVxu7DawFJtnfYcvSv6qPFvfTaqzTQ2BLknVhHTwGS8sc63ZBF4rzkWMBVKybo4S5OBtDdZahh2A1xg==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} shebang-command@2.0.0: @@ -4402,9 +4599,6 @@ packages: resolution: {integrity: sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==} engines: {node: '>=14.16'} - slashes@3.0.12: - resolution: {integrity: sha512-Q9VME8WyGkc7pJf6QEkj3wE+2CnvZMI+XJhwdTPR8Z/kWQRXi7boAWLDibRPyHRTUTPx5FaU7MsyrjI3yLB4HA==} - smart-buffer@4.2.0: resolution: {integrity: sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==} engines: {node: '>= 6.0.0', npm: '>= 3.0.0'} @@ -4423,8 +4617,8 @@ packages: sort-object-keys@1.1.3: resolution: {integrity: sha512-855pvK+VkU7PaKYPc+Jjnmt4EzejQHyhhF33q31qG8x7maDzkeFhAAThdCYay11CISO+qAMwjOBP+fPZe0IPyg==} - sort-package-json@2.15.1: - resolution: {integrity: sha512-9x9+o8krTT2saA9liI4BljNjwAbvUnWf11Wq+i/iZt8nl2UGYnf3TH5uBydE7VALmP7AGwlfszuEeL8BDyb0YA==} + sort-package-json@3.2.1: + resolution: {integrity: sha512-rTfRdb20vuoAn7LDlEtCqOkYfl2X+Qze6cLbNOzcDpbmKEhJI30tTN44d5shbKJnXsvz24QQhlCm81Bag7EOKg==} hasBin: true source-map-js@1.2.1: @@ -4463,8 +4657,8 @@ packages: spdx-license-ids@3.0.21: resolution: {integrity: sha512-Bvg/8F5XephndSK3JffaRqdT+gyhfqIPwDHpX80tJrF8QQRYMo8sNMeaZ2Dp5+jhwKnUmIOyFFQfHRkjJm5nXg==} - speech-rule-engine@4.0.7: - resolution: {integrity: sha512-sJrL3/wHzNwJRLBdf6CjJWIlxC04iYKkyXvYSVsWVOiC2DSkHmxsqOhEeMsBA9XK+CHuNcsdkbFDnoUfAsmp9g==} + speech-rule-engine@4.1.2: + resolution: {integrity: sha512-S6ji+flMEga+1QU79NDbwZ8Ivf0S/MpupQQiIC0rTpU/ZTKgcajijJJb1OcByBQDjrXCN1/DJtGz4ZJeBMPGJw==} hasBin: true split2@4.2.0: @@ -4486,8 +4680,12 @@ packages: stackback@0.0.2: resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} - std-env@3.8.1: - resolution: {integrity: sha512-vj5lIj3Mwf9D79hBkltk5qmkFI+biIKWS2IBxEyEU3AX1tUf7AoL8nSazCOiiqQsGKIq01SClsKEzweu34uwvA==} + statuses@2.0.1: + resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} + engines: {node: '>= 0.8'} + + std-env@3.9.0: + resolution: {integrity: sha512-UGvjygr6F6tpH7o2qyqR6QYpwraIjKSdtzyBdyytFOHmPZY917kwdwLG0RbOjWOnKmnm3PeHjaoLLMie7kPLQw==} streamsearch@1.1.0: resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==} @@ -4596,8 +4794,8 @@ packages: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} - synckit@0.9.2: - resolution: {integrity: sha512-vrozgXDQwYO72vHjUb/HnFbQx1exDjoKzqx23aXEg2a9VIg2TSFZ8FmeZpTjUCFMYw7mpX4BE2SFu8wI7asYsw==} + synckit@0.11.5: + resolution: {integrity: sha512-frqvfWyDA5VPVdrWfH24uM6SI/O8NLpVbIIJxb8t/a3YGsp4AW9CYgSKC0OaSEfexnp7Y1pVh2Y6IHO8ggGDmA==} engines: {node: ^14.18.0 || >=16.0.0} system-architecture@0.1.0: @@ -4626,8 +4824,11 @@ packages: tinyexec@0.3.2: resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==} - tinyglobby@0.2.12: - resolution: {integrity: sha512-qkf4trmKSIiMTs/E63cxH+ojC2unam7rJ0WrauAzpT3ECNTxGRMlaXxVbfxMUC/w0LaYk6jQ4y/nGR9uBO3tww==} + tinyexec@1.0.1: + resolution: {integrity: sha512-5uC6DDlmeqiOwCPmK9jMSdOuZTh8bU39Ys6yidB+UTt5hfZUPGAypSgFRiEp+jbi9qH40BLDvy85jIU88wKSqw==} + + tinyglobby@0.2.13: + resolution: {integrity: sha512-mEwzpUgrLySlveBwEVDMKk5B57bhLPYovRfPAXD5gA/98Opn0rCDj3GtLwFvCvH5RK9uPCExUROW5NjDwvqkxw==} engines: {node: '>=12.0.0'} tinypool@1.0.2: @@ -4658,6 +4859,10 @@ packages: resolution: {integrity: sha512-/m8M+2BJUpoJdgAHoG+baCwBT+tf2VraSfkBgl0Y00qIWt41DJ8R5B8nsEw0I58YwF5IZH6z24/2TobDKnqSWw==} engines: {node: '>=12'} + toidentifier@1.0.1: + resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} + engines: {node: '>=0.6'} + trim-lines@3.0.1: resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==} @@ -4680,43 +4885,43 @@ packages: tslib@2.8.1: resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} - tsx@4.19.3: - resolution: {integrity: sha512-4H8vUNGNjQ4V2EOoGw005+c+dGuPSnhpPBPHBtsZdGZBk/iJb4kguGlPWaZTZ3q5nMtFOEsY0nRDlh9PJyd6SQ==} + tsx@4.19.4: + resolution: {integrity: sha512-gK5GVzDkJK1SI1zwHf32Mqxf2tSJkNx+eYcNly5+nHvWqXUJYUkWBQtKauoESz3ymezAI++ZwT855x5p5eop+Q==} engines: {node: '>=18.0.0'} hasBin: true - turbo-darwin-64@2.4.4: - resolution: {integrity: sha512-5kPvRkLAfmWI0MH96D+/THnDMGXlFNmjeqNRj5grLKiry+M9pKj3pRuScddAXPdlxjO5Ptz06UNaOQrrYGTx1g==} + turbo-darwin-64@2.5.3: + resolution: {integrity: sha512-YSItEVBUIvAGPUDpAB9etEmSqZI3T6BHrkBkeSErvICXn3dfqXUfeLx35LfptLDEbrzFUdwYFNmt8QXOwe9yaw==} cpu: [x64] os: [darwin] - turbo-darwin-arm64@2.4.4: - resolution: {integrity: sha512-/gtHPqbGQXDFhrmy+Q/MFW2HUTUlThJ97WLLSe4bxkDrKHecDYhAjbZ4rN3MM93RV9STQb3Tqy4pZBtsd4DfCw==} + turbo-darwin-arm64@2.5.3: + resolution: {integrity: sha512-5PefrwHd42UiZX7YA9m1LPW6x9YJBDErXmsegCkVp+GjmWrADfEOxpFrGQNonH3ZMj77WZB2PVE5Aw3gA+IOhg==} cpu: [arm64] os: [darwin] - turbo-linux-64@2.4.4: - resolution: {integrity: sha512-SR0gri4k0bda56hw5u9VgDXLKb1Q+jrw4lM7WAhnNdXvVoep4d6LmnzgMHQQR12Wxl3KyWPbkz9d1whL6NTm2Q==} + turbo-linux-64@2.5.3: + resolution: {integrity: sha512-M9xigFgawn5ofTmRzvjjLj3Lqc05O8VHKuOlWNUlnHPUltFquyEeSkpQNkE/vpPdOR14AzxqHbhhxtfS4qvb1w==} cpu: [x64] os: [linux] - turbo-linux-arm64@2.4.4: - resolution: {integrity: sha512-COXXwzRd3vslQIfJhXUklgEqlwq35uFUZ7hnN+AUyXx7hUOLIiD5NblL+ETrHnhY4TzWszrbwUMfe2BYWtaPQg==} + turbo-linux-arm64@2.5.3: + resolution: {integrity: sha512-auJRbYZ8SGJVqvzTikpg1bsRAsiI9Tk0/SDkA5Xgg0GdiHDH/BOzv1ZjDE2mjmlrO/obr19Dw+39OlMhwLffrw==} cpu: [arm64] os: [linux] - turbo-windows-64@2.4.4: - resolution: {integrity: sha512-PV9rYNouGz4Ff3fd6sIfQy5L7HT9a4fcZoEv8PKRavU9O75G7PoDtm8scpHU10QnK0QQNLbE9qNxOAeRvF0fJg==} + turbo-windows-64@2.5.3: + resolution: {integrity: sha512-arLQYohuHtIEKkmQSCU9vtrKUg+/1TTstWB9VYRSsz+khvg81eX6LYHtXJfH/dK7Ho6ck+JaEh5G+QrE1jEmCQ==} cpu: [x64] os: [win32] - turbo-windows-arm64@2.4.4: - resolution: {integrity: sha512-403sqp9t5sx6YGEC32IfZTVWkRAixOQomGYB8kEc6ZD+//LirSxzeCHCnM8EmSXw7l57U1G+Fb0kxgTcKPU/Lg==} + turbo-windows-arm64@2.5.3: + resolution: {integrity: sha512-3JPn66HAynJ0gtr6H+hjY4VHpu1RPKcEwGATvGUTmLmYSYBQieVlnGDRMMoYN066YfyPqnNGCfhYbXfH92Cm0g==} cpu: [arm64] os: [win32] - turbo@2.4.4: - resolution: {integrity: sha512-N9FDOVaY3yz0YCOhYIgOGYad7+m2ptvinXygw27WPLQvcZDl3+0Sa77KGVlLSiuPDChOUEnTKE9VJwLSi9BPGQ==} + turbo@2.5.3: + resolution: {integrity: sha512-iHuaNcq5GZZnr3XDZNuu2LSyCzAOPwDuo5Qt+q64DfsTP1i3T2bKfxJhni2ZQxsvAoxRbuUK5QetJki4qc5aYA==} hasBin: true tv4@1.3.0: @@ -4746,6 +4951,10 @@ packages: resolution: {integrity: sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g==} engines: {node: '>=14.16'} + 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'} @@ -4765,27 +4974,27 @@ packages: typedarray@0.0.6: resolution: {integrity: sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==} - typescript-eslint@8.27.0: - resolution: {integrity: sha512-ZZ/8+Y0rRUMuW1gJaPtLWe4ryHbsPLzzibk5Sq+IFa2aOH1Vo0gPr1fbA6pOnzBke7zC2Da4w8AyCgxKXo3lqA==} + typescript-eslint@8.32.1: + resolution: {integrity: sha512-D7el+eaDHAmXvrZBy1zpzSNIRqnCOrkwTgZxTu3MUqRWk8k0q9m9Ho4+vPf7iHtgUfrK/o8IZaEApsxPlHTFCg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.9.0' - typescript@5.8.2: - resolution: {integrity: sha512-aJn6wq13/afZp/jT9QZmwEjDqqvSGp1VT5GVg+f/t6/oVyrgXM6BY1h9BRh/O5p3PlUPAe+WuiEZOmb/49RqoQ==} + typescript@5.8.3: + resolution: {integrity: sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==} engines: {node: '>=14.17'} hasBin: true - ufo@1.5.4: - resolution: {integrity: sha512-UsUk3byDzKd04EyoZ7U4DOlxQaD14JUKQl6/P7wiX4FNvUfm3XL246n9W5AmqwW5RSFJ27NAuM0iLscAOYUiGQ==} + ufo@1.6.1: + resolution: {integrity: sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA==} unbox-primitive@1.1.0: resolution: {integrity: sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==} engines: {node: '>= 0.4'} - undici-types@6.20.0: - resolution: {integrity: sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==} + undici-types@6.21.0: + resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} unified-engine@11.2.2: resolution: {integrity: sha512-15g/gWE7qQl9tQ3nAEbMd5h9HV1EACtFs6N9xaRBZICoCwnNGbal1kOs++ICf4aiTdItZxU2s/kYWhW7htlqJg==} @@ -4842,12 +5051,24 @@ packages: resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} engines: {node: '>= 4.0.0'} + unpipe@1.0.0: + resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} + engines: {node: '>= 0.8'} + + unrs-resolver@1.7.2: + resolution: {integrity: sha512-BBKpaylOW8KbHsu378Zky/dGh4ckT/4NW/0SHRABdqRLcQJ2dAOjDo9g97p04sWflm0kqPqpUatxReNV/dqI5A==} + update-check@1.5.4: resolution: {integrity: sha512-5YHsflzHP4t1G+8WGPlvKbJEbAJGCgw+Em+dGR1KmBUbr1J36SJBqlHLjR7oob7sco5hWHGQVcr9B2poIVDDTQ==} uri-js@4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + use-sync-external-store@1.5.0: + resolution: {integrity: sha512-Rb46I4cGGVBmjamjphe8L/UnvJD+uPPtTkNvX5mZgqdbavhI4EbgIWJiIHXJ8bc/i9EQGPRh4DwEURJ552Do0A==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} @@ -4889,13 +5110,13 @@ packages: vfile@6.0.3: resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==} - vite-node@3.0.9: - resolution: {integrity: sha512-w3Gdx7jDcuT9cNn9jExXgOyKmf5UOTb6WMHz8LGAm54eS1Elf5OuBhCxl6zJxGhEeIkgsE1WbHuoL0mj/UXqXg==} + vite-node@3.1.3: + resolution: {integrity: sha512-uHV4plJ2IxCl4u1up1FQRrqclylKAogbtBfOTwcuJ28xFi+89PZ57BRh+naIRvH70HPwxy5QHYzg1OrEaC7AbA==} engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} hasBin: true - vite@6.2.2: - resolution: {integrity: sha512-yW7PeMM+LkDzc7CgJuRLMW2Jz0FxMOsVJ8Lv3gpgW9WLcb9cTW+121UEr1hvmfR7w3SegR5ItvYyzVz1vxNJgQ==} + vite@6.3.5: + resolution: {integrity: sha512-cZn6NDFE7wdTpINgs++ZJ4N49W2vRp8LCKrn3Ob1kYNtOo21vfDoaV5GzBfLU4MovSAB8uNRm4jgzVQZ+mBzPQ==} engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} hasBin: true peerDependencies: @@ -4934,16 +5155,16 @@ packages: yaml: optional: true - vitest@3.0.9: - resolution: {integrity: sha512-BbcFDqNyBlfSpATmTtXOAOj71RNKDDvjBM/uPfnxxVGrG+FSH2RQIwgeEngTaTkuU/h0ScFvf+tRcKfYXzBybQ==} + vitest@3.1.3: + resolution: {integrity: sha512-188iM4hAHQ0km23TN/adso1q5hhwKqUpv+Sd6p5sOuh6FhQnRNW3IsiIpvxqahtBabsJ2SLZgmGSpcYK4wQYJw==} engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} hasBin: true peerDependencies: '@edge-runtime/vm': '*' '@types/debug': ^4.1.12 '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 - '@vitest/browser': 3.0.9 - '@vitest/ui': 3.0.9 + '@vitest/browser': 3.1.3 + '@vitest/ui': 3.1.3 happy-dom: '*' jsdom: '*' peerDependenciesMeta: @@ -5057,33 +5278,34 @@ packages: utf-8-validate: optional: true - xmldom-sre@0.1.31: - resolution: {integrity: sha512-f9s+fUkX04BxQf+7mMWAp5zk61pciie+fFLC9hX9UVvCeJQfNHRHXpeo5MPcR0EUf57PYLdt+ZO4f3Ipk2oZUw==} - engines: {node: '>=0.1'} - yallist@4.0.0: resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} - yaml@2.7.0: - resolution: {integrity: sha512-+hSoy/QHluxmC9kCIJyL/uyFmLmc+e5CFR5Wa+bpIhIj85LVb9ZH2nVnqrHoSvKogwODv0ClqZkmiSSaIH5LTA==} - engines: {node: '>= 14'} + yaml@2.8.0: + resolution: {integrity: sha512-4lLa/EcQCB0cJkyts+FpIRx5G/llPxfP6VQU5KByHEhLxY3IJCH0f0Hy1MHI8sClTvsIb8qwRJ6R/ZdlDJ/leQ==} + engines: {node: '>= 14.6'} hasBin: true yocto-queue@0.1.0: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} - zod-validation-error@3.4.0: - resolution: {integrity: sha512-ZOPR9SVY6Pb2qqO5XHt+MkkTRxGXb4EVtnjc9JpXUOtUB1T9Ru7mZOT361AN3MsetVe7R0a1KZshJDZdgp9miQ==} + zod-to-json-schema@3.24.5: + resolution: {integrity: sha512-/AuWwMP+YqiPbsJx5D6TfgRTc4kTLjsh5SOcd4bLsfUg2RcEXrFMJl1DGgdHy2aCfsIA/cr/1JM0xcB2GZji8g==} + peerDependencies: + zod: ^3.24.1 + + zod-validation-error@3.4.1: + resolution: {integrity: sha512-1KP64yqDPQ3rupxNv7oXhf7KdhHHgaqbKuspVoiN93TT0xrBjql+Svjkdjq/Qh/7GSMmgQs3AfvBT0heE35thw==} engines: {node: '>=18.0.0'} peerDependencies: - zod: ^3.18.0 + zod: ^3.24.4 - zod@3.24.2: - resolution: {integrity: sha512-lY7CDW43ECgW9u1TcT3IoXHflywfVqDYze4waEz812jR/bZ8FHDsl7pFQoSZTz5N+2NqRXs8GBwnAwo3ZNxqhQ==} + zod@3.24.4: + resolution: {integrity: sha512-OdqJE9UDRPwWsrHjLN2F8bPxvwJBK22EHLWtanu0LSYr5YqzsaaW3RMgmjwr8Rypg5k+meEJdSPXJZXE/yqOMg==} - zustand@5.0.3: - resolution: {integrity: sha512-14fwWQtU3pH4dE0dOpdMiWjddcH+QzKIgk1cl8epwSE7yag43k/AD/m4L6+K7DytAOr9gGBe3/EXj9g7cdostg==} + zustand@5.0.4: + resolution: {integrity: sha512-39VFTN5InDtMd28ZhjLyuTnlytDr9HfwO512Ai4I8ZABCoyAj4F1+sr7sD1jP/+p7k77Iko0Pb5NhgBFDCX0kQ==} engines: {node: '>=12.20.0'} peerDependencies: '@types/react': '>=18.0.0' @@ -5105,32 +5327,30 @@ packages: snapshots: - '@antfu/install-pkg@1.0.0': + '@antfu/install-pkg@1.1.0': dependencies: - package-manager-detector: 0.2.11 - tinyexec: 0.3.2 + package-manager-detector: 1.3.0 + tinyexec: 1.0.1 '@antfu/utils@8.1.1': {} - '@babel/code-frame@7.26.2': + '@babel/code-frame@7.27.1': dependencies: - '@babel/helper-validator-identifier': 7.25.9 + '@babel/helper-validator-identifier': 7.27.1 js-tokens: 4.0.0 picocolors: 1.1.1 - '@babel/helper-validator-identifier@7.25.9': {} + '@babel/helper-validator-identifier@7.27.1': {} - '@babel/runtime@7.26.10': - dependencies: - regenerator-runtime: 0.14.1 + '@babel/runtime@7.27.1': {} '@braintree/sanitize-url@7.1.1': {} - '@changesets/apply-release-plan@7.0.10': + '@changesets/apply-release-plan@7.0.12': dependencies: '@changesets/config': 3.1.1 '@changesets/get-version-range-type': 0.4.0 - '@changesets/git': 3.0.2 + '@changesets/git': 3.0.4 '@changesets/should-skip-package': 0.1.2 '@changesets/types': 6.1.0 '@manypkg/get-packages': 1.1.3 @@ -5140,34 +5360,34 @@ snapshots: outdent: 0.5.0 prettier: 2.8.8 resolve-from: 5.0.0 - semver: 7.7.1 + semver: 7.7.2 - '@changesets/assemble-release-plan@6.0.6': + '@changesets/assemble-release-plan@6.0.8': dependencies: '@changesets/errors': 0.2.0 '@changesets/get-dependents-graph': 2.1.3 '@changesets/should-skip-package': 0.1.2 '@changesets/types': 6.1.0 '@manypkg/get-packages': 1.1.3 - semver: 7.7.1 + semver: 7.7.2 '@changesets/changelog-git@0.2.1': dependencies: '@changesets/types': 6.1.0 - '@changesets/cli@2.28.1': + '@changesets/cli@2.29.4': dependencies: - '@changesets/apply-release-plan': 7.0.10 - '@changesets/assemble-release-plan': 6.0.6 + '@changesets/apply-release-plan': 7.0.12 + '@changesets/assemble-release-plan': 6.0.8 '@changesets/changelog-git': 0.2.1 '@changesets/config': 3.1.1 '@changesets/errors': 0.2.0 '@changesets/get-dependents-graph': 2.1.3 - '@changesets/get-release-plan': 4.0.8 - '@changesets/git': 3.0.2 + '@changesets/get-release-plan': 4.0.12 + '@changesets/git': 3.0.4 '@changesets/logger': 0.1.1 '@changesets/pre': 2.0.2 - '@changesets/read': 0.6.3 + '@changesets/read': 0.6.5 '@changesets/should-skip-package': 0.1.2 '@changesets/types': 6.1.0 '@changesets/write': 0.4.0 @@ -5182,7 +5402,7 @@ snapshots: package-manager-detector: 0.2.11 picocolors: 1.1.1 resolve-from: 5.0.0 - semver: 7.7.1 + semver: 7.7.2 spawndamnit: 3.0.1 term-size: 2.2.1 @@ -5205,20 +5425,20 @@ snapshots: '@changesets/types': 6.1.0 '@manypkg/get-packages': 1.1.3 picocolors: 1.1.1 - semver: 7.7.1 + semver: 7.7.2 - '@changesets/get-release-plan@4.0.8': + '@changesets/get-release-plan@4.0.12': dependencies: - '@changesets/assemble-release-plan': 6.0.6 + '@changesets/assemble-release-plan': 6.0.8 '@changesets/config': 3.1.1 '@changesets/pre': 2.0.2 - '@changesets/read': 0.6.3 + '@changesets/read': 0.6.5 '@changesets/types': 6.1.0 '@manypkg/get-packages': 1.1.3 '@changesets/get-version-range-type@0.4.0': {} - '@changesets/git@3.0.2': + '@changesets/git@3.0.4': dependencies: '@changesets/errors': 0.2.0 '@manypkg/get-packages': 1.1.3 @@ -5242,9 +5462,9 @@ snapshots: '@manypkg/get-packages': 1.1.3 fs-extra: 7.0.1 - '@changesets/read@0.6.3': + '@changesets/read@0.6.5': dependencies: - '@changesets/git': 3.0.2 + '@changesets/git': 3.0.4 '@changesets/logger': 0.1.1 '@changesets/parse': 0.4.1 '@changesets/types': 6.1.0 @@ -5285,128 +5505,131 @@ snapshots: '@chevrotain/utils@11.0.3': {} - '@emnapi/core@1.3.1': + '@emnapi/core@1.4.3': dependencies: - '@emnapi/wasi-threads': 1.0.1 + '@emnapi/wasi-threads': 1.0.2 tslib: 2.8.1 optional: true - '@emnapi/runtime@1.3.1': + '@emnapi/runtime@1.4.3': dependencies: tslib: 2.8.1 optional: true - '@emnapi/wasi-threads@1.0.1': + '@emnapi/wasi-threads@1.0.2': dependencies: tslib: 2.8.1 optional: true - '@es-joy/jsdoccomment@0.49.0': + '@es-joy/jsdoccomment@0.50.1': dependencies: + '@types/eslint': 9.6.1 + '@types/estree': 1.0.7 + '@typescript-eslint/types': 8.32.1 comment-parser: 1.4.1 esquery: 1.6.0 jsdoc-type-pratt-parser: 4.1.0 - '@esbuild/aix-ppc64@0.25.1': + '@esbuild/aix-ppc64@0.25.4': optional: true - '@esbuild/android-arm64@0.25.1': + '@esbuild/android-arm64@0.25.4': optional: true - '@esbuild/android-arm@0.25.1': + '@esbuild/android-arm@0.25.4': optional: true - '@esbuild/android-x64@0.25.1': + '@esbuild/android-x64@0.25.4': optional: true - '@esbuild/darwin-arm64@0.25.1': + '@esbuild/darwin-arm64@0.25.4': optional: true - '@esbuild/darwin-x64@0.25.1': + '@esbuild/darwin-x64@0.25.4': optional: true - '@esbuild/freebsd-arm64@0.25.1': + '@esbuild/freebsd-arm64@0.25.4': optional: true - '@esbuild/freebsd-x64@0.25.1': + '@esbuild/freebsd-x64@0.25.4': optional: true - '@esbuild/linux-arm64@0.25.1': + '@esbuild/linux-arm64@0.25.4': optional: true - '@esbuild/linux-arm@0.25.1': + '@esbuild/linux-arm@0.25.4': optional: true - '@esbuild/linux-ia32@0.25.1': + '@esbuild/linux-ia32@0.25.4': optional: true - '@esbuild/linux-loong64@0.25.1': + '@esbuild/linux-loong64@0.25.4': optional: true - '@esbuild/linux-mips64el@0.25.1': + '@esbuild/linux-mips64el@0.25.4': optional: true - '@esbuild/linux-ppc64@0.25.1': + '@esbuild/linux-ppc64@0.25.4': optional: true - '@esbuild/linux-riscv64@0.25.1': + '@esbuild/linux-riscv64@0.25.4': optional: true - '@esbuild/linux-s390x@0.25.1': + '@esbuild/linux-s390x@0.25.4': optional: true - '@esbuild/linux-x64@0.25.1': + '@esbuild/linux-x64@0.25.4': optional: true - '@esbuild/netbsd-arm64@0.25.1': + '@esbuild/netbsd-arm64@0.25.4': optional: true - '@esbuild/netbsd-x64@0.25.1': + '@esbuild/netbsd-x64@0.25.4': optional: true - '@esbuild/openbsd-arm64@0.25.1': + '@esbuild/openbsd-arm64@0.25.4': optional: true - '@esbuild/openbsd-x64@0.25.1': + '@esbuild/openbsd-x64@0.25.4': optional: true - '@esbuild/sunos-x64@0.25.1': + '@esbuild/sunos-x64@0.25.4': optional: true - '@esbuild/win32-arm64@0.25.1': + '@esbuild/win32-arm64@0.25.4': optional: true - '@esbuild/win32-ia32@0.25.1': + '@esbuild/win32-ia32@0.25.4': optional: true - '@esbuild/win32-x64@0.25.1': + '@esbuild/win32-x64@0.25.4': optional: true - '@eslint-community/eslint-utils@4.5.1(eslint@9.22.0)': + '@eslint-community/eslint-utils@4.7.0(eslint@9.26.0)': dependencies: - eslint: 9.22.0 + eslint: 9.26.0 eslint-visitor-keys: 3.4.3 '@eslint-community/regexpp@4.12.1': {} - '@eslint/config-array@0.19.2': + '@eslint/config-array@0.20.0': dependencies: '@eslint/object-schema': 2.1.6 - debug: 4.4.0 + debug: 4.4.1 minimatch: 3.1.2 transitivePeerDependencies: - supports-color - '@eslint/config-helpers@0.1.0': {} + '@eslint/config-helpers@0.2.2': {} - '@eslint/core@0.12.0': + '@eslint/core@0.13.0': dependencies: '@types/json-schema': 7.0.15 - '@eslint/eslintrc@3.3.0': + '@eslint/eslintrc@3.3.1': dependencies: ajv: 6.12.6 - debug: 4.4.0 + debug: 4.4.1 espree: 10.3.0 globals: 14.0.0 ignore: 5.3.2 @@ -5417,13 +5640,13 @@ snapshots: transitivePeerDependencies: - supports-color - '@eslint/js@9.22.0': {} + '@eslint/js@9.26.0': {} '@eslint/object-schema@2.1.6': {} - '@eslint/plugin-kit@0.2.7': + '@eslint/plugin-kit@0.2.8': dependencies: - '@eslint/core': 0.12.0 + '@eslint/core': 0.13.0 levn: 0.4.1 '@fastify/ajv-compiler@4.0.2': @@ -5434,7 +5657,7 @@ snapshots: '@fastify/error@4.1.0': {} - '@fastify/fast-json-stringify-compiler@5.0.2': + '@fastify/fast-json-stringify-compiler@5.0.3': dependencies: fast-json-stringify: 6.0.1 @@ -5449,43 +5672,44 @@ snapshots: '@fastify/forwarded': 3.0.0 ipaddr.js: 2.2.0 - '@floating-ui/core@1.6.9': + '@floating-ui/core@1.7.0': dependencies: '@floating-ui/utils': 0.2.9 - '@floating-ui/dom@1.6.13': + '@floating-ui/dom@1.7.0': dependencies: - '@floating-ui/core': 1.6.9 + '@floating-ui/core': 1.7.0 '@floating-ui/utils': 0.2.9 - '@floating-ui/react-dom@2.1.2(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + '@floating-ui/react-dom@2.1.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': dependencies: - '@floating-ui/dom': 1.6.13 - react: 19.0.0 - react-dom: 19.0.0(react@19.0.0) + '@floating-ui/dom': 1.7.0 + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) - '@floating-ui/react@0.26.28(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + '@floating-ui/react@0.26.28(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': dependencies: - '@floating-ui/react-dom': 2.1.2(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@floating-ui/react-dom': 2.1.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0) '@floating-ui/utils': 0.2.9 - react: 19.0.0 - react-dom: 19.0.0(react@19.0.0) + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) tabbable: 6.2.0 '@floating-ui/utils@0.2.9': {} - '@formatjs/intl-localematcher@0.6.0': + '@formatjs/intl-localematcher@0.6.1': dependencies: tslib: 2.8.1 - '@headlessui/react@2.2.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + '@headlessui/react@2.2.3(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': dependencies: - '@floating-ui/react': 0.26.28(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@react-aria/focus': 3.20.1(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@react-aria/interactions': 3.24.1(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@tanstack/react-virtual': 3.13.4(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - react: 19.0.0 - react-dom: 19.0.0(react@19.0.0) + '@floating-ui/react': 0.26.28(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@react-aria/focus': 3.20.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@react-aria/interactions': 3.25.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@tanstack/react-virtual': 3.13.8(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + use-sync-external-store: 1.5.0(react@19.1.0) '@humanfs/core@0.19.1': {} @@ -5498,16 +5722,16 @@ snapshots: '@humanwhocodes/retry@0.3.1': {} - '@humanwhocodes/retry@0.4.2': {} + '@humanwhocodes/retry@0.4.3': {} '@iconify/types@2.0.0': {} '@iconify/utils@2.3.0': dependencies: - '@antfu/install-pkg': 1.0.0 + '@antfu/install-pkg': 1.1.0 '@antfu/utils': 8.1.1 '@iconify/types': 2.0.0 - debug: 4.4.0 + debug: 4.4.1 globals: 15.15.0 kolorist: 1.8.0 local-pkg: 1.1.1 @@ -5515,79 +5739,82 @@ snapshots: transitivePeerDependencies: - supports-color - '@img/sharp-darwin-arm64@0.33.5': + '@img/sharp-darwin-arm64@0.34.1': optionalDependencies: - '@img/sharp-libvips-darwin-arm64': 1.0.4 + '@img/sharp-libvips-darwin-arm64': 1.1.0 optional: true - '@img/sharp-darwin-x64@0.33.5': + '@img/sharp-darwin-x64@0.34.1': optionalDependencies: - '@img/sharp-libvips-darwin-x64': 1.0.4 + '@img/sharp-libvips-darwin-x64': 1.1.0 optional: true - '@img/sharp-libvips-darwin-arm64@1.0.4': + '@img/sharp-libvips-darwin-arm64@1.1.0': optional: true - '@img/sharp-libvips-darwin-x64@1.0.4': + '@img/sharp-libvips-darwin-x64@1.1.0': optional: true - '@img/sharp-libvips-linux-arm64@1.0.4': + '@img/sharp-libvips-linux-arm64@1.1.0': optional: true - '@img/sharp-libvips-linux-arm@1.0.5': + '@img/sharp-libvips-linux-arm@1.1.0': optional: true - '@img/sharp-libvips-linux-s390x@1.0.4': + '@img/sharp-libvips-linux-ppc64@1.1.0': optional: true - '@img/sharp-libvips-linux-x64@1.0.4': + '@img/sharp-libvips-linux-s390x@1.1.0': optional: true - '@img/sharp-libvips-linuxmusl-arm64@1.0.4': + '@img/sharp-libvips-linux-x64@1.1.0': optional: true - '@img/sharp-libvips-linuxmusl-x64@1.0.4': + '@img/sharp-libvips-linuxmusl-arm64@1.1.0': optional: true - '@img/sharp-linux-arm64@0.33.5': + '@img/sharp-libvips-linuxmusl-x64@1.1.0': + optional: true + + '@img/sharp-linux-arm64@0.34.1': optionalDependencies: - '@img/sharp-libvips-linux-arm64': 1.0.4 + '@img/sharp-libvips-linux-arm64': 1.1.0 optional: true - '@img/sharp-linux-arm@0.33.5': + '@img/sharp-linux-arm@0.34.1': optionalDependencies: - '@img/sharp-libvips-linux-arm': 1.0.5 + '@img/sharp-libvips-linux-arm': 1.1.0 optional: true - '@img/sharp-linux-s390x@0.33.5': + '@img/sharp-linux-s390x@0.34.1': optionalDependencies: - '@img/sharp-libvips-linux-s390x': 1.0.4 + '@img/sharp-libvips-linux-s390x': 1.1.0 optional: true - '@img/sharp-linux-x64@0.33.5': + '@img/sharp-linux-x64@0.34.1': optionalDependencies: - '@img/sharp-libvips-linux-x64': 1.0.4 + '@img/sharp-libvips-linux-x64': 1.1.0 optional: true - '@img/sharp-linuxmusl-arm64@0.33.5': + '@img/sharp-linuxmusl-arm64@0.34.1': optionalDependencies: - '@img/sharp-libvips-linuxmusl-arm64': 1.0.4 + '@img/sharp-libvips-linuxmusl-arm64': 1.1.0 optional: true - '@img/sharp-linuxmusl-x64@0.33.5': + '@img/sharp-linuxmusl-x64@0.34.1': optionalDependencies: - '@img/sharp-libvips-linuxmusl-x64': 1.0.4 + '@img/sharp-libvips-linuxmusl-x64': 1.1.0 optional: true - '@img/sharp-wasm32@0.33.5': + '@img/sharp-wasm32@0.34.1': dependencies: - '@emnapi/runtime': 1.3.1 + '@emnapi/runtime': 1.4.3 optional: true - '@img/sharp-win32-ia32@0.33.5': + '@img/sharp-win32-ia32@0.34.1': optional: true - '@img/sharp-win32-x64@0.33.5': + '@img/sharp-win32-x64@0.34.1': optional: true '@isaacs/cliui@8.0.2': @@ -5603,14 +5830,14 @@ snapshots: '@manypkg/find-root@1.1.0': dependencies: - '@babel/runtime': 7.26.10 + '@babel/runtime': 7.27.1 '@types/node': 12.20.55 find-up: 4.1.0 fs-extra: 8.1.0 '@manypkg/get-packages@1.1.3': dependencies: - '@babel/runtime': 7.26.10 + '@babel/runtime': 7.27.1 '@changesets/types': 4.1.0 '@manypkg/find-root': 1.1.0 fs-extra: 8.1.0 @@ -5619,7 +5846,7 @@ snapshots: '@mdx-js/mdx@3.1.0(acorn@8.14.1)': dependencies: - '@types/estree': 1.0.6 + '@types/estree': 1.0.7 '@types/estree-jsx': 1.0.5 '@types/hast': 3.0.4 '@types/mdx': 2.0.13 @@ -5636,7 +5863,7 @@ snapshots: rehype-recma: 1.0.0 remark-mdx: 3.1.0 remark-parse: 11.0.0 - remark-rehype: 11.1.1 + remark-rehype: 11.1.2 source-map: 0.7.4 unified: 11.0.5 unist-util-position-from-estree: 2.0.0 @@ -5647,9 +5874,24 @@ snapshots: - acorn - supports-color - '@mermaid-js/parser@0.3.0': + '@mermaid-js/parser@0.4.0': dependencies: - langium: 3.0.0 + langium: 3.3.1 + + '@modelcontextprotocol/sdk@1.11.3': + dependencies: + content-type: 1.0.5 + cors: 2.8.5 + cross-spawn: 7.0.6 + eventsource: 3.0.7 + express: 5.1.0 + express-rate-limit: 7.5.0(express@5.1.0) + pkce-challenge: 5.0.0 + raw-body: 3.0.0 + zod: 3.24.4 + zod-to-json-schema: 3.24.5(zod@3.24.4) + transitivePeerDependencies: + - supports-color '@napi-rs/simple-git-android-arm-eabi@0.1.19': optional: true @@ -5710,41 +5952,41 @@ snapshots: '@napi-rs/simple-git-win32-arm64-msvc': 0.1.19 '@napi-rs/simple-git-win32-x64-msvc': 0.1.19 - '@napi-rs/wasm-runtime@0.2.7': + '@napi-rs/wasm-runtime@0.2.9': dependencies: - '@emnapi/core': 1.3.1 - '@emnapi/runtime': 1.3.1 + '@emnapi/core': 1.4.3 + '@emnapi/runtime': 1.4.3 '@tybys/wasm-util': 0.9.0 optional: true - '@next/env@15.3.0-canary.16': {} + '@next/env@15.3.2': {} - '@next/eslint-plugin-next@15.3.0-canary.16': + '@next/eslint-plugin-next@15.3.2': dependencies: fast-glob: 3.3.1 - '@next/swc-darwin-arm64@15.3.0-canary.16': + '@next/swc-darwin-arm64@15.3.2': optional: true - '@next/swc-darwin-x64@15.3.0-canary.16': + '@next/swc-darwin-x64@15.3.2': optional: true - '@next/swc-linux-arm64-gnu@15.3.0-canary.16': + '@next/swc-linux-arm64-gnu@15.3.2': optional: true - '@next/swc-linux-arm64-musl@15.3.0-canary.16': + '@next/swc-linux-arm64-musl@15.3.2': optional: true - '@next/swc-linux-x64-gnu@15.3.0-canary.16': + '@next/swc-linux-x64-gnu@15.3.2': optional: true - '@next/swc-linux-x64-musl@15.3.0-canary.16': + '@next/swc-linux-x64-musl@15.3.2': optional: true - '@next/swc-win32-arm64-msvc@15.3.0-canary.16': + '@next/swc-win32-arm64-msvc@15.3.2': optional: true - '@next/swc-win32-x64-msvc@15.3.0-canary.16': + '@next/swc-win32-x64-msvc@15.3.2': optional: true '@nodelib/fs.scandir@2.1.5': @@ -5767,7 +6009,7 @@ snapshots: ini: 4.1.3 nopt: 7.2.1 proc-log: 4.2.0 - semver: 7.7.1 + semver: 7.7.2 walk-up-path: 3.0.1 transitivePeerDependencies: - bluebird @@ -5781,7 +6023,7 @@ snapshots: proc-log: 4.2.0 promise-inflight: 1.0.1 promise-retry: 2.0.1 - semver: 7.7.1 + semver: 7.7.2 which: 4.0.0 transitivePeerDependencies: - bluebird @@ -5803,7 +6045,7 @@ snapshots: json-parse-even-better-errors: 3.0.2 normalize-package-data: 6.0.2 proc-log: 4.2.0 - semver: 7.7.1 + semver: 7.7.2 transitivePeerDependencies: - bluebird @@ -5829,11 +6071,11 @@ snapshots: '@pkgjs/parseargs@0.11.0': optional: true - '@pkgr/core@0.1.2': {} + '@pkgr/core@0.2.4': {} - '@playwright/test@1.51.1': + '@playwright/test@1.52.0': dependencies: - playwright: 1.51.1 + playwright: 1.52.0 '@pm2/agent@2.1.1': dependencies: @@ -5881,58 +6123,58 @@ snapshots: '@pm2/pm2-version-check@1.0.4': dependencies: - debug: 4.4.0 + debug: 4.4.1 transitivePeerDependencies: - supports-color - '@react-aria/focus@3.20.1(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + '@react-aria/focus@3.20.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': dependencies: - '@react-aria/interactions': 3.24.1(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@react-aria/utils': 3.28.1(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@react-types/shared': 3.28.0(react@19.0.0) - '@swc/helpers': 0.5.15 + '@react-aria/interactions': 3.25.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@react-aria/utils': 3.28.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@react-types/shared': 3.29.0(react@19.1.0) + '@swc/helpers': 0.5.17 clsx: 2.1.1 - react: 19.0.0 - react-dom: 19.0.0(react@19.0.0) + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) - '@react-aria/interactions@3.24.1(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + '@react-aria/interactions@3.25.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': dependencies: - '@react-aria/ssr': 3.9.7(react@19.0.0) - '@react-aria/utils': 3.28.1(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@react-stately/flags': 3.1.0 - '@react-types/shared': 3.28.0(react@19.0.0) - '@swc/helpers': 0.5.15 - react: 19.0.0 - react-dom: 19.0.0(react@19.0.0) + '@react-aria/ssr': 3.9.8(react@19.1.0) + '@react-aria/utils': 3.28.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@react-stately/flags': 3.1.1 + '@react-types/shared': 3.29.0(react@19.1.0) + '@swc/helpers': 0.5.17 + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) - '@react-aria/ssr@3.9.7(react@19.0.0)': + '@react-aria/ssr@3.9.8(react@19.1.0)': dependencies: - '@swc/helpers': 0.5.15 - react: 19.0.0 + '@swc/helpers': 0.5.17 + react: 19.1.0 - '@react-aria/utils@3.28.1(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + '@react-aria/utils@3.28.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': dependencies: - '@react-aria/ssr': 3.9.7(react@19.0.0) - '@react-stately/flags': 3.1.0 - '@react-stately/utils': 3.10.5(react@19.0.0) - '@react-types/shared': 3.28.0(react@19.0.0) - '@swc/helpers': 0.5.15 + '@react-aria/ssr': 3.9.8(react@19.1.0) + '@react-stately/flags': 3.1.1 + '@react-stately/utils': 3.10.6(react@19.1.0) + '@react-types/shared': 3.29.0(react@19.1.0) + '@swc/helpers': 0.5.17 clsx: 2.1.1 - react: 19.0.0 - react-dom: 19.0.0(react@19.0.0) + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) - '@react-stately/flags@3.1.0': + '@react-stately/flags@3.1.1': dependencies: - '@swc/helpers': 0.5.15 + '@swc/helpers': 0.5.17 - '@react-stately/utils@3.10.5(react@19.0.0)': + '@react-stately/utils@3.10.6(react@19.1.0)': dependencies: - '@swc/helpers': 0.5.15 - react: 19.0.0 + '@swc/helpers': 0.5.17 + react: 19.1.0 - '@react-types/shared@3.28.0(react@19.0.0)': + '@react-types/shared@3.29.0(react@19.1.0)': dependencies: - react: 19.0.0 + react: 19.1.0 '@redis/bloom@1.2.0(@redis/client@1.6.0)': dependencies: @@ -5960,61 +6202,64 @@ snapshots: dependencies: '@redis/client': 1.6.0 - '@rollup/rollup-android-arm-eabi@4.36.0': + '@rollup/rollup-android-arm-eabi@4.40.2': optional: true - '@rollup/rollup-android-arm64@4.36.0': + '@rollup/rollup-android-arm64@4.40.2': optional: true - '@rollup/rollup-darwin-arm64@4.36.0': + '@rollup/rollup-darwin-arm64@4.40.2': optional: true - '@rollup/rollup-darwin-x64@4.36.0': + '@rollup/rollup-darwin-x64@4.40.2': optional: true - '@rollup/rollup-freebsd-arm64@4.36.0': + '@rollup/rollup-freebsd-arm64@4.40.2': optional: true - '@rollup/rollup-freebsd-x64@4.36.0': + '@rollup/rollup-freebsd-x64@4.40.2': optional: true - '@rollup/rollup-linux-arm-gnueabihf@4.36.0': + '@rollup/rollup-linux-arm-gnueabihf@4.40.2': optional: true - '@rollup/rollup-linux-arm-musleabihf@4.36.0': + '@rollup/rollup-linux-arm-musleabihf@4.40.2': optional: true - '@rollup/rollup-linux-arm64-gnu@4.36.0': + '@rollup/rollup-linux-arm64-gnu@4.40.2': optional: true - '@rollup/rollup-linux-arm64-musl@4.36.0': + '@rollup/rollup-linux-arm64-musl@4.40.2': optional: true - '@rollup/rollup-linux-loongarch64-gnu@4.36.0': + '@rollup/rollup-linux-loongarch64-gnu@4.40.2': optional: true - '@rollup/rollup-linux-powerpc64le-gnu@4.36.0': + '@rollup/rollup-linux-powerpc64le-gnu@4.40.2': optional: true - '@rollup/rollup-linux-riscv64-gnu@4.36.0': + '@rollup/rollup-linux-riscv64-gnu@4.40.2': optional: true - '@rollup/rollup-linux-s390x-gnu@4.36.0': + '@rollup/rollup-linux-riscv64-musl@4.40.2': optional: true - '@rollup/rollup-linux-x64-gnu@4.36.0': + '@rollup/rollup-linux-s390x-gnu@4.40.2': optional: true - '@rollup/rollup-linux-x64-musl@4.36.0': + '@rollup/rollup-linux-x64-gnu@4.40.2': optional: true - '@rollup/rollup-win32-arm64-msvc@4.36.0': + '@rollup/rollup-linux-x64-musl@4.40.2': optional: true - '@rollup/rollup-win32-ia32-msvc@4.36.0': + '@rollup/rollup-win32-arm64-msvc@4.40.2': optional: true - '@rollup/rollup-win32-x64-msvc@4.36.0': + '@rollup/rollup-win32-ia32-msvc@4.40.2': + optional: true + + '@rollup/rollup-win32-x64-msvc@4.40.2': optional: true '@shikijs/core@2.5.0': @@ -6045,11 +6290,11 @@ snapshots: dependencies: '@shikijs/types': 2.5.0 - '@shikijs/twoslash@2.5.0(typescript@5.8.2)': + '@shikijs/twoslash@2.5.0(typescript@5.8.3)': dependencies: '@shikijs/core': 2.5.0 '@shikijs/types': 2.5.0 - twoslash: 0.2.12(typescript@5.8.2) + twoslash: 0.2.12(typescript@5.8.3) transitivePeerDependencies: - supports-color - typescript @@ -6067,18 +6312,22 @@ snapshots: dependencies: tslib: 2.8.1 - '@tanstack/react-virtual@3.13.4(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + '@swc/helpers@0.5.17': dependencies: - '@tanstack/virtual-core': 3.13.4 - react: 19.0.0 - react-dom: 19.0.0(react@19.0.0) + tslib: 2.8.1 - '@tanstack/virtual-core@3.13.4': {} + '@tanstack/react-virtual@3.13.8(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + dependencies: + '@tanstack/virtual-core': 3.13.8 + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) - '@theguild/remark-mermaid@0.2.0(react@19.0.0)': + '@tanstack/virtual-core@3.13.8': {} + + '@theguild/remark-mermaid@0.2.0(react@19.1.0)': dependencies: - mermaid: 11.5.0 - react: 19.0.0 + mermaid: 11.6.0 + react: 19.1.0 unist-util-visit: 5.0.0 transitivePeerDependencies: - supports-color @@ -6095,13 +6344,9 @@ snapshots: tslib: 2.8.1 optional: true - '@types/acorn@4.0.6': - dependencies: - '@types/estree': 1.0.6 - '@types/concat-stream@2.0.3': dependencies: - '@types/node': 22.13.10 + '@types/node': 22.15.18 '@types/d3-array@3.2.1': {} @@ -6224,13 +6469,16 @@ snapshots: dependencies: '@types/ms': 2.1.0 - '@types/doctrine@0.0.9': {} + '@types/eslint@9.6.1': + dependencies: + '@types/estree': 1.0.7 + '@types/json-schema': 7.0.15 '@types/estree-jsx@1.0.5': dependencies: - '@types/estree': 1.0.6 + '@types/estree': 1.0.7 - '@types/estree@1.0.6': {} + '@types/estree@1.0.7': {} '@types/geojson@7946.0.16': {} @@ -6258,15 +6506,15 @@ snapshots: '@types/node@12.20.55': {} - '@types/node@22.13.10': + '@types/node@22.15.18': dependencies: - undici-types: 6.20.0 + undici-types: 6.21.0 - '@types/react-dom@19.0.4(@types/react@19.0.12)': + '@types/react-dom@19.1.5(@types/react@19.1.4)': dependencies: - '@types/react': 19.0.12 + '@types/react': 19.1.4 - '@types/react@19.0.12': + '@types/react@19.1.4': dependencies: csstype: 3.1.3 @@ -6279,175 +6527,195 @@ snapshots: '@types/unist@3.0.3': {} - '@typescript-eslint/eslint-plugin@8.27.0(@typescript-eslint/parser@8.27.0(eslint@9.22.0)(typescript@5.8.2))(eslint@9.22.0)(typescript@5.8.2)': + '@typescript-eslint/eslint-plugin@8.32.1(@typescript-eslint/parser@8.32.1(eslint@9.26.0)(typescript@5.8.3))(eslint@9.26.0)(typescript@5.8.3)': dependencies: '@eslint-community/regexpp': 4.12.1 - '@typescript-eslint/parser': 8.27.0(eslint@9.22.0)(typescript@5.8.2) - '@typescript-eslint/scope-manager': 8.27.0 - '@typescript-eslint/type-utils': 8.27.0(eslint@9.22.0)(typescript@5.8.2) - '@typescript-eslint/utils': 8.27.0(eslint@9.22.0)(typescript@5.8.2) - '@typescript-eslint/visitor-keys': 8.27.0 - eslint: 9.22.0 + '@typescript-eslint/parser': 8.32.1(eslint@9.26.0)(typescript@5.8.3) + '@typescript-eslint/scope-manager': 8.32.1 + '@typescript-eslint/type-utils': 8.32.1(eslint@9.26.0)(typescript@5.8.3) + '@typescript-eslint/utils': 8.32.1(eslint@9.26.0)(typescript@5.8.3) + '@typescript-eslint/visitor-keys': 8.32.1 + eslint: 9.26.0 graphemer: 1.4.0 - ignore: 5.3.2 + ignore: 7.0.4 natural-compare: 1.4.0 - ts-api-utils: 2.1.0(typescript@5.8.2) - typescript: 5.8.2 + ts-api-utils: 2.1.0(typescript@5.8.3) + typescript: 5.8.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.27.0(eslint@9.22.0)(typescript@5.8.2)': + '@typescript-eslint/parser@8.32.1(eslint@9.26.0)(typescript@5.8.3)': dependencies: - '@typescript-eslint/scope-manager': 8.27.0 - '@typescript-eslint/types': 8.27.0 - '@typescript-eslint/typescript-estree': 8.27.0(typescript@5.8.2) - '@typescript-eslint/visitor-keys': 8.27.0 - debug: 4.4.0 - eslint: 9.22.0 - typescript: 5.8.2 + '@typescript-eslint/scope-manager': 8.32.1 + '@typescript-eslint/types': 8.32.1 + '@typescript-eslint/typescript-estree': 8.32.1(typescript@5.8.3) + '@typescript-eslint/visitor-keys': 8.32.1 + debug: 4.4.1 + eslint: 9.26.0 + typescript: 5.8.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/scope-manager@8.27.0': + '@typescript-eslint/scope-manager@8.32.1': dependencies: - '@typescript-eslint/types': 8.27.0 - '@typescript-eslint/visitor-keys': 8.27.0 + '@typescript-eslint/types': 8.32.1 + '@typescript-eslint/visitor-keys': 8.32.1 - '@typescript-eslint/type-utils@8.27.0(eslint@9.22.0)(typescript@5.8.2)': + '@typescript-eslint/type-utils@8.32.1(eslint@9.26.0)(typescript@5.8.3)': dependencies: - '@typescript-eslint/typescript-estree': 8.27.0(typescript@5.8.2) - '@typescript-eslint/utils': 8.27.0(eslint@9.22.0)(typescript@5.8.2) - debug: 4.4.0 - eslint: 9.22.0 - ts-api-utils: 2.1.0(typescript@5.8.2) - typescript: 5.8.2 + '@typescript-eslint/typescript-estree': 8.32.1(typescript@5.8.3) + '@typescript-eslint/utils': 8.32.1(eslint@9.26.0)(typescript@5.8.3) + debug: 4.4.1 + eslint: 9.26.0 + ts-api-utils: 2.1.0(typescript@5.8.3) + typescript: 5.8.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/types@8.27.0': {} + '@typescript-eslint/types@8.32.1': {} - '@typescript-eslint/typescript-estree@8.27.0(typescript@5.8.2)': + '@typescript-eslint/typescript-estree@8.32.1(typescript@5.8.3)': dependencies: - '@typescript-eslint/types': 8.27.0 - '@typescript-eslint/visitor-keys': 8.27.0 - debug: 4.4.0 + '@typescript-eslint/types': 8.32.1 + '@typescript-eslint/visitor-keys': 8.32.1 + debug: 4.4.1 fast-glob: 3.3.3 is-glob: 4.0.3 minimatch: 9.0.5 - semver: 7.7.1 - ts-api-utils: 2.1.0(typescript@5.8.2) - typescript: 5.8.2 + semver: 7.7.2 + ts-api-utils: 2.1.0(typescript@5.8.3) + typescript: 5.8.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.27.0(eslint@9.22.0)(typescript@5.8.2)': + '@typescript-eslint/utils@8.32.1(eslint@9.26.0)(typescript@5.8.3)': dependencies: - '@eslint-community/eslint-utils': 4.5.1(eslint@9.22.0) - '@typescript-eslint/scope-manager': 8.27.0 - '@typescript-eslint/types': 8.27.0 - '@typescript-eslint/typescript-estree': 8.27.0(typescript@5.8.2) - eslint: 9.22.0 - typescript: 5.8.2 + '@eslint-community/eslint-utils': 4.7.0(eslint@9.26.0) + '@typescript-eslint/scope-manager': 8.32.1 + '@typescript-eslint/types': 8.32.1 + '@typescript-eslint/typescript-estree': 8.32.1(typescript@5.8.3) + eslint: 9.26.0 + typescript: 5.8.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/visitor-keys@8.27.0': + '@typescript-eslint/visitor-keys@8.32.1': dependencies: - '@typescript-eslint/types': 8.27.0 + '@typescript-eslint/types': 8.32.1 eslint-visitor-keys: 4.2.0 - '@typescript/vfs@1.6.1(typescript@5.8.2)': + '@typescript/vfs@1.6.1(typescript@5.8.3)': dependencies: - debug: 4.4.0 - typescript: 5.8.2 + debug: 4.4.1 + typescript: 5.8.3 transitivePeerDependencies: - supports-color '@ungap/structured-clone@1.3.0': {} - '@unrs/rspack-resolver-binding-darwin-arm64@1.2.2': + '@unrs/resolver-binding-darwin-arm64@1.7.2': optional: true - '@unrs/rspack-resolver-binding-darwin-x64@1.2.2': + '@unrs/resolver-binding-darwin-x64@1.7.2': optional: true - '@unrs/rspack-resolver-binding-freebsd-x64@1.2.2': + '@unrs/resolver-binding-freebsd-x64@1.7.2': optional: true - '@unrs/rspack-resolver-binding-linux-arm-gnueabihf@1.2.2': + '@unrs/resolver-binding-linux-arm-gnueabihf@1.7.2': optional: true - '@unrs/rspack-resolver-binding-linux-arm64-gnu@1.2.2': + '@unrs/resolver-binding-linux-arm-musleabihf@1.7.2': optional: true - '@unrs/rspack-resolver-binding-linux-arm64-musl@1.2.2': + '@unrs/resolver-binding-linux-arm64-gnu@1.7.2': optional: true - '@unrs/rspack-resolver-binding-linux-x64-gnu@1.2.2': + '@unrs/resolver-binding-linux-arm64-musl@1.7.2': optional: true - '@unrs/rspack-resolver-binding-linux-x64-musl@1.2.2': + '@unrs/resolver-binding-linux-ppc64-gnu@1.7.2': optional: true - '@unrs/rspack-resolver-binding-wasm32-wasi@1.2.2': + '@unrs/resolver-binding-linux-riscv64-gnu@1.7.2': + optional: true + + '@unrs/resolver-binding-linux-riscv64-musl@1.7.2': + optional: true + + '@unrs/resolver-binding-linux-s390x-gnu@1.7.2': + optional: true + + '@unrs/resolver-binding-linux-x64-gnu@1.7.2': + optional: true + + '@unrs/resolver-binding-linux-x64-musl@1.7.2': + optional: true + + '@unrs/resolver-binding-wasm32-wasi@1.7.2': dependencies: - '@napi-rs/wasm-runtime': 0.2.7 + '@napi-rs/wasm-runtime': 0.2.9 optional: true - '@unrs/rspack-resolver-binding-win32-arm64-msvc@1.2.2': + '@unrs/resolver-binding-win32-arm64-msvc@1.7.2': optional: true - '@unrs/rspack-resolver-binding-win32-x64-msvc@1.2.2': + '@unrs/resolver-binding-win32-ia32-msvc@1.7.2': optional: true - '@vitest/eslint-plugin@1.1.38(@typescript-eslint/utils@8.27.0(eslint@9.22.0)(typescript@5.8.2))(eslint@9.22.0)(typescript@5.8.2)(vitest@3.0.9(@types/debug@4.1.12)(@types/node@22.13.10)(tsx@4.19.3)(yaml@2.7.0))': + '@unrs/resolver-binding-win32-x64-msvc@1.7.2': + optional: true + + '@vitest/eslint-plugin@1.1.44(@typescript-eslint/utils@8.32.1(eslint@9.26.0)(typescript@5.8.3))(eslint@9.26.0)(typescript@5.8.3)(vitest@3.1.3(@types/debug@4.1.12)(@types/node@22.15.18)(tsx@4.19.4)(yaml@2.8.0))': dependencies: - '@typescript-eslint/utils': 8.27.0(eslint@9.22.0)(typescript@5.8.2) - eslint: 9.22.0 + '@typescript-eslint/utils': 8.32.1(eslint@9.26.0)(typescript@5.8.3) + eslint: 9.26.0 optionalDependencies: - typescript: 5.8.2 - vitest: 3.0.9(@types/debug@4.1.12)(@types/node@22.13.10)(tsx@4.19.3)(yaml@2.7.0) + typescript: 5.8.3 + vitest: 3.1.3(@types/debug@4.1.12)(@types/node@22.15.18)(tsx@4.19.4)(yaml@2.8.0) - '@vitest/expect@3.0.9': + '@vitest/expect@3.1.3': dependencies: - '@vitest/spy': 3.0.9 - '@vitest/utils': 3.0.9 + '@vitest/spy': 3.1.3 + '@vitest/utils': 3.1.3 chai: 5.2.0 tinyrainbow: 2.0.0 - '@vitest/mocker@3.0.9(vite@6.2.2(@types/node@22.13.10)(tsx@4.19.3)(yaml@2.7.0))': + '@vitest/mocker@3.1.3(vite@6.3.5(@types/node@22.15.18)(tsx@4.19.4)(yaml@2.8.0))': dependencies: - '@vitest/spy': 3.0.9 + '@vitest/spy': 3.1.3 estree-walker: 3.0.3 magic-string: 0.30.17 optionalDependencies: - vite: 6.2.2(@types/node@22.13.10)(tsx@4.19.3)(yaml@2.7.0) + vite: 6.3.5(@types/node@22.15.18)(tsx@4.19.4)(yaml@2.8.0) - '@vitest/pretty-format@3.0.9': + '@vitest/pretty-format@3.1.3': dependencies: tinyrainbow: 2.0.0 - '@vitest/runner@3.0.9': + '@vitest/runner@3.1.3': dependencies: - '@vitest/utils': 3.0.9 + '@vitest/utils': 3.1.3 pathe: 2.0.3 - '@vitest/snapshot@3.0.9': + '@vitest/snapshot@3.1.3': dependencies: - '@vitest/pretty-format': 3.0.9 + '@vitest/pretty-format': 3.1.3 magic-string: 0.30.17 pathe: 2.0.3 - '@vitest/spy@3.0.9': + '@vitest/spy@3.1.3': dependencies: tinyspy: 3.0.2 - '@vitest/utils@3.0.9': + '@vitest/utils@3.1.3': dependencies: - '@vitest/pretty-format': 3.0.9 + '@vitest/pretty-format': 3.1.3 loupe: 3.1.3 tinyrainbow: 2.0.0 + '@xmldom/xmldom@0.9.8': {} + '@zeit/schemas@2.36.0': {} abbrev@2.0.0: {} @@ -6459,6 +6727,11 @@ snapshots: mime-types: 2.1.35 negotiator: 0.6.3 + accepts@2.0.0: + dependencies: + mime-types: 3.0.1 + negotiator: 1.0.0 + acorn-jsx@5.3.2(acorn@8.14.1): dependencies: acorn: 8.14.1 @@ -6514,6 +6787,8 @@ snapshots: ansi-styles@6.2.1: {} + ansis@4.0.0: {} + anymatch@3.1.3: dependencies: normalize-path: 3.0.0 @@ -6619,7 +6894,7 @@ snapshots: '@fastify/error': 4.1.0 fastq: 1.19.1 - axios@1.8.4: + axios@1.9.0: dependencies: follow-redirects: 1.15.9(debug@4.3.7) form-data: 4.0.2 @@ -6637,10 +6912,10 @@ snapshots: dependencies: is-windows: 1.0.2 - better-react-mathjax@2.1.0(react@19.0.0): + better-react-mathjax@2.3.0(react@19.1.0): dependencies: mathjax-full: 3.2.2 - react: 19.0.0 + react: 19.1.0 binary-extensions@2.3.0: {} @@ -6648,6 +6923,20 @@ snapshots: bodec@0.1.0: {} + body-parser@2.2.0: + dependencies: + bytes: 3.1.2 + content-type: 1.0.5 + debug: 4.4.1 + http-errors: 2.0.0 + iconv-lite: 0.6.3 + on-finished: 2.4.1 + qs: 6.14.0 + raw-body: 3.0.0 + type-is: 2.0.1 + transitivePeerDependencies: + - supports-color + boxen@7.0.0: dependencies: ansi-align: 3.0.1 @@ -6680,6 +6969,8 @@ snapshots: bytes@3.0.0: {} + bytes@3.1.2: {} + cac@6.7.14: {} call-bind-apply-helpers@1.0.2: @@ -6703,7 +6994,7 @@ snapshots: camelcase@7.0.1: {} - caniuse-lite@1.0.30001706: {} + caniuse-lite@1.0.30001718: {} ccount@2.0.1: {} @@ -6829,14 +7120,14 @@ snapshots: comma-separated-tokens@2.0.3: {} + commander@13.1.0: {} + commander@2.15.1: {} commander@7.2.0: {} commander@8.3.0: {} - commander@9.2.0: {} - comment-parser@1.4.1: {} compressible@2.0.18: @@ -6868,16 +7159,31 @@ snapshots: confbox@0.1.8: {} - confbox@0.2.1: {} + confbox@0.2.2: {} content-disposition@0.5.2: {} + content-disposition@1.0.0: + dependencies: + safe-buffer: 5.2.1 + + content-type@1.0.5: {} + + cookie-signature@1.2.2: {} + + cookie@0.7.2: {} + cookie@1.0.2: {} copy-anything@3.0.5: dependencies: is-what: 4.1.16 + cors@2.8.5: + dependencies: + object-assign: 4.1.1 + vary: 1.1.2 + cose-base@1.0.3: dependencies: layout-base: 1.0.2 @@ -6898,17 +7204,17 @@ snapshots: culvert@0.1.2: {} - cytoscape-cose-bilkent@4.1.0(cytoscape@3.31.1): + cytoscape-cose-bilkent@4.1.0(cytoscape@3.32.0): dependencies: cose-base: 1.0.3 - cytoscape: 3.31.1 + cytoscape: 3.32.0 - cytoscape-fcose@2.2.0(cytoscape@3.31.1): + cytoscape-fcose@2.2.0(cytoscape@3.32.0): dependencies: cose-base: 2.2.0 - cytoscape: 3.31.1 + cytoscape: 3.32.0 - cytoscape@3.31.1: {} + cytoscape@3.32.0: {} d3-array@2.12.1: dependencies: @@ -7120,7 +7426,7 @@ snapshots: dependencies: ms: 2.1.3 - debug@4.4.0: + debug@4.4.1: dependencies: ms: 2.1.3 @@ -7158,13 +7464,15 @@ snapshots: delayed-stream@1.0.0: {} + depd@2.0.0: {} + dequal@2.0.3: {} detect-indent@6.1.0: {} detect-indent@7.0.1: {} - detect-libc@2.0.3: + detect-libc@2.0.4: optional: true detect-newline@4.0.1: {} @@ -7183,18 +7491,14 @@ snapshots: dependencies: esutils: 2.0.3 - doctrine@3.0.0: - dependencies: - esutils: 2.0.3 - - dompurify@3.2.4: + dompurify@3.2.5: optionalDependencies: '@types/trusted-types': 2.0.7 dotenv-cli@8.0.0: dependencies: cross-spawn: 7.0.6 - dotenv: 16.4.7 + dotenv: 16.5.0 dotenv-expand: 10.0.0 minimist: 1.2.8 @@ -7202,7 +7506,7 @@ snapshots: dotenv@16.0.3: {} - dotenv@16.4.7: {} + dotenv@16.5.0: {} dunder-proto@1.0.1: dependencies: @@ -7212,6 +7516,8 @@ snapshots: eastasianwidth@0.2.0: {} + ee-first@1.1.1: {} + emoji-regex-xs@1.0.0: {} emoji-regex@10.4.0: {} @@ -7220,6 +7526,8 @@ snapshots: emoji-regex@9.2.2: {} + encodeurl@2.0.0: {} + end-of-stream@1.4.4: dependencies: once: 1.4.0 @@ -7233,7 +7541,7 @@ snapshots: ansi-colors: 4.1.3 strip-ansi: 6.0.1 - entities@4.5.0: {} + entities@6.0.0: {} err-code@2.0.3: {} @@ -7318,7 +7626,7 @@ snapshots: iterator.prototype: 1.1.5 safe-array-concat: 1.1.3 - es-module-lexer@1.6.0: {} + es-module-lexer@1.7.0: {} es-object-atoms@1.1.1: dependencies: @@ -7355,33 +7663,35 @@ snapshots: esast-util-from-estree: 2.0.0 vfile-message: 4.0.2 - esbuild@0.25.1: + esbuild@0.25.4: optionalDependencies: - '@esbuild/aix-ppc64': 0.25.1 - '@esbuild/android-arm': 0.25.1 - '@esbuild/android-arm64': 0.25.1 - '@esbuild/android-x64': 0.25.1 - '@esbuild/darwin-arm64': 0.25.1 - '@esbuild/darwin-x64': 0.25.1 - '@esbuild/freebsd-arm64': 0.25.1 - '@esbuild/freebsd-x64': 0.25.1 - '@esbuild/linux-arm': 0.25.1 - '@esbuild/linux-arm64': 0.25.1 - '@esbuild/linux-ia32': 0.25.1 - '@esbuild/linux-loong64': 0.25.1 - '@esbuild/linux-mips64el': 0.25.1 - '@esbuild/linux-ppc64': 0.25.1 - '@esbuild/linux-riscv64': 0.25.1 - '@esbuild/linux-s390x': 0.25.1 - '@esbuild/linux-x64': 0.25.1 - '@esbuild/netbsd-arm64': 0.25.1 - '@esbuild/netbsd-x64': 0.25.1 - '@esbuild/openbsd-arm64': 0.25.1 - '@esbuild/openbsd-x64': 0.25.1 - '@esbuild/sunos-x64': 0.25.1 - '@esbuild/win32-arm64': 0.25.1 - '@esbuild/win32-ia32': 0.25.1 - '@esbuild/win32-x64': 0.25.1 + '@esbuild/aix-ppc64': 0.25.4 + '@esbuild/android-arm': 0.25.4 + '@esbuild/android-arm64': 0.25.4 + '@esbuild/android-x64': 0.25.4 + '@esbuild/darwin-arm64': 0.25.4 + '@esbuild/darwin-x64': 0.25.4 + '@esbuild/freebsd-arm64': 0.25.4 + '@esbuild/freebsd-x64': 0.25.4 + '@esbuild/linux-arm': 0.25.4 + '@esbuild/linux-arm64': 0.25.4 + '@esbuild/linux-ia32': 0.25.4 + '@esbuild/linux-loong64': 0.25.4 + '@esbuild/linux-mips64el': 0.25.4 + '@esbuild/linux-ppc64': 0.25.4 + '@esbuild/linux-riscv64': 0.25.4 + '@esbuild/linux-s390x': 0.25.4 + '@esbuild/linux-x64': 0.25.4 + '@esbuild/netbsd-arm64': 0.25.4 + '@esbuild/netbsd-x64': 0.25.4 + '@esbuild/openbsd-arm64': 0.25.4 + '@esbuild/openbsd-x64': 0.25.4 + '@esbuild/sunos-x64': 0.25.4 + '@esbuild/win32-arm64': 0.25.4 + '@esbuild/win32-ia32': 0.25.4 + '@esbuild/win32-x64': 0.25.4 + + escape-html@1.0.3: {} escape-string-regexp@4.0.0: {} @@ -7395,9 +7705,9 @@ snapshots: optionalDependencies: source-map: 0.6.1 - eslint-config-prettier@10.1.1(eslint@9.22.0): + eslint-config-prettier@10.1.5(eslint@9.26.0): dependencies: - eslint: 9.22.0 + eslint: 9.26.0 eslint-import-resolver-node@0.3.9: dependencies: @@ -7407,30 +7717,31 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-import-resolver-typescript@4.2.2(eslint-plugin-import-x@4.9.1(eslint@9.22.0)(typescript@5.8.2))(eslint@9.22.0): + eslint-import-resolver-typescript@4.3.4(eslint-plugin-import-x@4.11.1(eslint@9.26.0)(typescript@5.8.3))(eslint@9.26.0): dependencies: - debug: 4.4.0 - eslint: 9.22.0 + debug: 4.4.1 + eslint: 9.26.0 get-tsconfig: 4.10.0 - rspack-resolver: 1.2.2 + is-bun-module: 2.0.0 stable-hash: 0.0.5 - tinyglobby: 0.2.12 + tinyglobby: 0.2.13 + unrs-resolver: 1.7.2 optionalDependencies: - eslint-plugin-import-x: 4.9.1(eslint@9.22.0)(typescript@5.8.2) + eslint-plugin-import-x: 4.11.1(eslint@9.26.0)(typescript@5.8.3) transitivePeerDependencies: - supports-color - eslint-mdx@3.2.0(eslint@9.22.0): + eslint-mdx@3.4.1(eslint@9.26.0): dependencies: acorn: 8.14.1 acorn-jsx: 5.3.2(acorn@8.14.1) - eslint: 9.22.0 - espree: 9.6.1 + eslint: 9.26.0 + espree: 10.3.0 estree-util-visit: 2.0.0 remark-mdx: 3.1.0 remark-parse: 11.0.0 remark-stringify: 11.0.0 - synckit: 0.9.2 + synckit: 0.11.5 tslib: 2.8.1 unified: 11.0.5 unified-engine: 11.2.2 @@ -7441,71 +7752,72 @@ snapshots: - bluebird - supports-color - eslint-plugin-check-file@3.1.0(eslint@9.22.0): + eslint-plugin-check-file@3.2.0(eslint@9.26.0): dependencies: - eslint: 9.22.0 + eslint: 9.26.0 is-glob: 4.0.3 micromatch: 4.0.8 - eslint-plugin-import-x@4.9.1(eslint@9.22.0)(typescript@5.8.2): + eslint-plugin-import-x@4.11.1(eslint@9.26.0)(typescript@5.8.3): dependencies: - '@types/doctrine': 0.0.9 - '@typescript-eslint/utils': 8.27.0(eslint@9.22.0)(typescript@5.8.2) - debug: 4.4.0 - doctrine: 3.0.0 - eslint: 9.22.0 + '@typescript-eslint/utils': 8.32.1(eslint@9.26.0)(typescript@5.8.3) + comment-parser: 1.4.1 + debug: 4.4.1 + eslint: 9.26.0 eslint-import-resolver-node: 0.3.9 get-tsconfig: 4.10.0 is-glob: 4.0.3 minimatch: 10.0.1 - rspack-resolver: 1.2.2 - semver: 7.7.1 + semver: 7.7.2 stable-hash: 0.0.5 tslib: 2.8.1 + unrs-resolver: 1.7.2 transitivePeerDependencies: - supports-color - typescript - eslint-plugin-jsdoc@50.6.8(eslint@9.22.0): + eslint-plugin-jsdoc@50.6.17(eslint@9.26.0): dependencies: - '@es-joy/jsdoccomment': 0.49.0 + '@es-joy/jsdoccomment': 0.50.1 are-docs-informative: 0.0.2 comment-parser: 1.4.1 - debug: 4.4.0 + debug: 4.4.1 escape-string-regexp: 4.0.0 - eslint: 9.22.0 + eslint: 9.26.0 espree: 10.3.0 esquery: 1.6.0 - parse-imports: 2.2.1 - semver: 7.7.1 + parse-imports-exports: 0.2.4 + semver: 7.7.2 spdx-expression-parse: 4.0.0 - synckit: 0.9.2 transitivePeerDependencies: - supports-color - eslint-plugin-mdx@3.2.0(eslint@9.22.0): + eslint-plugin-mdx@3.4.1(eslint@9.26.0): dependencies: - eslint: 9.22.0 - eslint-mdx: 3.2.0(eslint@9.22.0) + eslint: 9.26.0 + eslint-mdx: 3.4.1(eslint@9.26.0) mdast-util-from-markdown: 2.0.2 + mdast-util-mdx: 3.0.0 + micromark-extension-mdxjs: 3.0.0 remark-mdx: 3.1.0 remark-parse: 11.0.0 remark-stringify: 11.0.0 - synckit: 0.9.2 + synckit: 0.11.5 tslib: 2.8.1 unified: 11.0.5 vfile: 6.0.3 transitivePeerDependencies: - bluebird + - remark-lint-file-extension - supports-color eslint-plugin-only-warn@1.1.0: {} - eslint-plugin-react-hooks@5.2.0(eslint@9.22.0): + eslint-plugin-react-hooks@5.2.0(eslint@9.26.0): dependencies: - eslint: 9.22.0 + eslint: 9.26.0 - eslint-plugin-react@7.37.4(eslint@9.22.0): + eslint-plugin-react@7.37.5(eslint@9.26.0): dependencies: array-includes: 3.1.8 array.prototype.findlast: 1.2.5 @@ -7513,7 +7825,7 @@ snapshots: array.prototype.tosorted: 1.1.4 doctrine: 2.1.0 es-iterator-helpers: 1.2.1 - eslint: 9.22.0 + eslint: 9.26.0 estraverse: 5.3.0 hasown: 2.0.2 jsx-ast-utils: 3.3.5 @@ -7527,11 +7839,11 @@ snapshots: string.prototype.matchall: 4.0.12 string.prototype.repeat: 1.0.0 - eslint-plugin-turbo@2.4.4(eslint@9.22.0)(turbo@2.4.4): + eslint-plugin-turbo@2.5.3(eslint@9.26.0)(turbo@2.5.3): dependencies: dotenv: 16.0.3 - eslint: 9.22.0 - turbo: 2.4.4 + eslint: 9.26.0 + turbo: 2.5.3 eslint-scope@8.3.0: dependencies: @@ -7542,25 +7854,26 @@ snapshots: eslint-visitor-keys@4.2.0: {} - eslint@9.22.0: + eslint@9.26.0: dependencies: - '@eslint-community/eslint-utils': 4.5.1(eslint@9.22.0) + '@eslint-community/eslint-utils': 4.7.0(eslint@9.26.0) '@eslint-community/regexpp': 4.12.1 - '@eslint/config-array': 0.19.2 - '@eslint/config-helpers': 0.1.0 - '@eslint/core': 0.12.0 - '@eslint/eslintrc': 3.3.0 - '@eslint/js': 9.22.0 - '@eslint/plugin-kit': 0.2.7 + '@eslint/config-array': 0.20.0 + '@eslint/config-helpers': 0.2.2 + '@eslint/core': 0.13.0 + '@eslint/eslintrc': 3.3.1 + '@eslint/js': 9.26.0 + '@eslint/plugin-kit': 0.2.8 '@humanfs/node': 0.16.6 '@humanwhocodes/module-importer': 1.0.1 - '@humanwhocodes/retry': 0.4.2 - '@types/estree': 1.0.6 + '@humanwhocodes/retry': 0.4.3 + '@modelcontextprotocol/sdk': 1.11.3 + '@types/estree': 1.0.7 '@types/json-schema': 7.0.15 ajv: 6.12.6 chalk: 4.1.2 cross-spawn: 7.0.6 - debug: 4.4.0 + debug: 4.4.1 escape-string-regexp: 4.0.0 eslint-scope: 8.3.0 eslint-visitor-keys: 4.2.0 @@ -7579,6 +7892,7 @@ snapshots: minimatch: 3.1.2 natural-compare: 1.4.0 optionator: 0.9.4 + zod: 3.24.4 transitivePeerDependencies: - supports-color @@ -7590,12 +7904,6 @@ snapshots: acorn-jsx: 5.3.2(acorn@8.14.1) eslint-visitor-keys: 4.2.0 - espree@9.6.1: - dependencies: - acorn: 8.14.1 - acorn-jsx: 5.3.2(acorn@8.14.1) - eslint-visitor-keys: 3.4.3 - esprima@4.0.1: {} esquery@1.6.0: @@ -7610,7 +7918,7 @@ snapshots: estree-util-attach-comments@3.0.0: dependencies: - '@types/estree': 1.0.6 + '@types/estree': 1.0.7 estree-util-build-jsx@3.0.1: dependencies: @@ -7625,7 +7933,7 @@ snapshots: estree-util-scope@1.0.0: dependencies: - '@types/estree': 1.0.6 + '@types/estree': 1.0.7 devlop: 1.1.0 estree-util-to-js@2.0.0: @@ -7634,13 +7942,9 @@ snapshots: astring: 1.9.0 source-map: 0.7.4 - estree-util-value-to-estree@1.3.0: + estree-util-value-to-estree@3.4.0: dependencies: - is-plain-obj: 3.0.0 - - estree-util-value-to-estree@3.3.2: - dependencies: - '@types/estree': 1.0.6 + '@types/estree': 1.0.7 estree-util-visit@2.0.0: dependencies: @@ -7649,14 +7953,22 @@ snapshots: estree-walker@3.0.3: dependencies: - '@types/estree': 1.0.6 + '@types/estree': 1.0.7 esutils@2.0.3: {} + etag@1.8.1: {} + eventemitter2@5.0.1: {} eventemitter2@6.4.9: {} + eventsource-parser@3.0.2: {} + + eventsource@3.0.7: + dependencies: + eventsource-parser: 3.0.2 + execa@5.1.1: dependencies: cross-spawn: 7.0.6 @@ -7681,9 +7993,45 @@ snapshots: signal-exit: 4.1.0 strip-final-newline: 3.0.0 - expect-type@1.2.0: {} + expect-type@1.2.1: {} + + express-rate-limit@7.5.0(express@5.1.0): + dependencies: + express: 5.1.0 + + express@5.1.0: + dependencies: + accepts: 2.0.0 + body-parser: 2.2.0 + content-disposition: 1.0.0 + content-type: 1.0.5 + cookie: 0.7.2 + cookie-signature: 1.2.2 + debug: 4.4.1 + 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.1 + 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.1 + type-is: 2.0.1 + vary: 1.1.2 + transitivePeerDependencies: + - supports-color - exsolve@1.0.4: {} + exsolve@1.0.5: {} extend@3.0.2: {} @@ -7748,22 +8096,22 @@ snapshots: fast-uri@3.0.6: {} - fastify@5.2.1: + fastify@5.3.3: dependencies: '@fastify/ajv-compiler': 4.0.2 '@fastify/error': 4.1.0 - '@fastify/fast-json-stringify-compiler': 5.0.2 + '@fastify/fast-json-stringify-compiler': 5.0.3 '@fastify/proxy-addr': 5.0.0 abstract-logging: 2.0.1 avvio: 9.1.0 fast-json-stringify: 6.0.1 - find-my-way: 9.2.0 + find-my-way: 9.3.0 light-my-request: 6.6.0 pino: 9.6.0 - process-warning: 4.0.1 + process-warning: 5.0.0 rfdc: 1.4.1 - secure-json-parse: 3.0.2 - semver: 7.7.1 + secure-json-parse: 4.0.0 + semver: 7.7.2 toad-cache: 3.7.0 fastq@1.19.1: @@ -7776,7 +8124,7 @@ snapshots: fclone@1.0.11: {} - fdir@6.4.3(picomatch@4.0.2): + fdir@6.4.4(picomatch@4.0.2): optionalDependencies: picomatch: 4.0.2 @@ -7788,11 +8136,22 @@ snapshots: dependencies: to-regex-range: 5.0.1 - find-my-way@9.2.0: + finalhandler@2.1.0: + dependencies: + debug: 4.4.1 + encodeurl: 2.0.0 + escape-html: 1.0.3 + on-finished: 2.4.1 + parseurl: 1.3.3 + statuses: 2.0.1 + transitivePeerDependencies: + - supports-color + + find-my-way@9.3.0: dependencies: fast-deep-equal: 3.1.3 fast-querystring: 1.1.2 - safe-regex2: 4.0.1 + safe-regex2: 5.0.0 find-up@4.1.0: dependencies: @@ -7833,6 +8192,10 @@ snapshots: format@0.2.2: {} + forwarded@0.2.0: {} + + fresh@2.0.0: {} + fs-extra@7.0.1: dependencies: graceful-fs: 4.2.11 @@ -7884,8 +8247,6 @@ snapshots: dunder-proto: 1.0.1 es-object-atoms: 1.1.1 - get-stdin@9.0.0: {} - get-stream@6.0.1: {} get-stream@8.0.1: {} @@ -7904,11 +8265,11 @@ snapshots: dependencies: basic-ftp: 5.0.5 data-uri-to-buffer: 6.0.2 - debug: 4.4.0 + debug: 4.4.1 transitivePeerDependencies: - supports-color - git-hooks-list@3.2.0: {} + git-hooks-list@4.1.1: {} git-node-fs@1.0.0(js-git@0.7.8): optionalDependencies: @@ -7939,7 +8300,7 @@ snapshots: globals@15.15.0: {} - globals@16.0.0: {} + globals@16.1.0: {} globalthis@1.0.4: dependencies: @@ -8003,7 +8364,7 @@ snapshots: '@types/hast': 3.0.4 devlop: 1.1.0 hast-util-from-parse5: 8.0.3 - parse5: 7.2.1 + parse5: 7.3.0 vfile: 6.0.3 vfile-message: 4.0.2 @@ -8013,7 +8374,7 @@ snapshots: '@types/unist': 3.0.3 devlop: 1.1.0 hastscript: 9.0.1 - property-information: 7.0.0 + property-information: 7.1.0 vfile: 6.0.3 vfile-location: 5.0.3 web-namespaces: 2.0.1 @@ -8035,7 +8396,7 @@ snapshots: hast-util-to-parse5: 8.0.0 html-void-elements: 3.0.0 mdast-util-to-hast: 13.2.0 - parse5: 7.2.1 + parse5: 7.3.0 unist-util-position: 5.0.0 unist-util-visit: 5.0.0 vfile: 6.0.3 @@ -8044,7 +8405,7 @@ snapshots: hast-util-to-estree@3.1.3: dependencies: - '@types/estree': 1.0.6 + '@types/estree': 1.0.7 '@types/estree-jsx': 1.0.5 '@types/hast': 3.0.4 comma-separated-tokens: 2.0.3 @@ -8055,7 +8416,7 @@ snapshots: mdast-util-mdx-expression: 2.0.1 mdast-util-mdx-jsx: 3.2.0 mdast-util-mdxjs-esm: 2.0.1 - property-information: 7.0.0 + property-information: 7.1.0 space-separated-tokens: 2.0.2 style-to-js: 1.1.16 unist-util-position: 5.0.0 @@ -8072,14 +8433,14 @@ snapshots: hast-util-whitespace: 3.0.0 html-void-elements: 3.0.0 mdast-util-to-hast: 13.2.0 - property-information: 7.0.0 + property-information: 7.1.0 space-separated-tokens: 2.0.2 stringify-entities: 4.0.4 zwitch: 2.0.4 hast-util-to-jsx-runtime@2.3.6: dependencies: - '@types/estree': 1.0.6 + '@types/estree': 1.0.7 '@types/hast': 3.0.4 '@types/unist': 3.0.3 comma-separated-tokens: 2.0.3 @@ -8089,7 +8450,7 @@ snapshots: mdast-util-mdx-expression: 2.0.1 mdast-util-mdx-jsx: 3.2.0 mdast-util-mdxjs-esm: 2.0.1 - property-information: 7.0.0 + property-information: 7.1.0 space-separated-tokens: 2.0.2 style-to-js: 1.1.16 unist-util-position: 5.0.0 @@ -8127,7 +8488,7 @@ snapshots: '@types/hast': 3.0.4 comma-separated-tokens: 2.0.3 hast-util-parse-selector: 4.0.0 - property-information: 7.0.0 + property-information: 7.1.0 space-separated-tokens: 2.0.2 help-me@5.0.0: {} @@ -8138,17 +8499,25 @@ snapshots: html-void-elements@3.0.0: {} + http-errors@2.0.0: + dependencies: + depd: 2.0.0 + inherits: 2.0.4 + setprototypeof: 1.2.0 + statuses: 2.0.1 + toidentifier: 1.0.1 + http-proxy-agent@7.0.2: dependencies: agent-base: 7.1.3 - debug: 4.4.0 + debug: 4.4.1 transitivePeerDependencies: - supports-color https-proxy-agent@7.0.6: dependencies: agent-base: 7.1.3 - debug: 4.4.0 + debug: 4.4.1 transitivePeerDependencies: - supports-color @@ -8170,6 +8539,8 @@ snapshots: ignore@6.0.2: {} + ignore@7.0.4: {} + import-fresh@3.3.1: dependencies: parent-module: 1.0.1 @@ -8202,6 +8573,8 @@ snapshots: jsbn: 1.1.0 sprintf-js: 1.1.3 + ipaddr.js@1.9.1: {} + ipaddr.js@2.2.0: {} is-alphabetical@2.0.1: {} @@ -8243,6 +8616,10 @@ snapshots: call-bound: 1.0.4 has-tostringtag: 1.0.2 + is-bun-module@2.0.0: + dependencies: + semver: 7.7.2 + is-callable@1.2.7: {} is-core-module@2.16.1: @@ -8302,12 +8679,12 @@ snapshots: is-number@7.0.0: {} - is-plain-obj@3.0.0: {} - is-plain-obj@4.1.0: {} is-port-reachable@4.0.0: {} + is-promise@4.0.0: {} + is-regex@1.2.1: dependencies: call-bound: 1.0.4 @@ -8444,7 +8821,7 @@ snapshots: object.assign: 4.1.7 object.values: 1.2.1 - katex@0.16.21: + katex@0.16.22: dependencies: commander: 8.3.0 @@ -8458,7 +8835,7 @@ snapshots: kolorist@1.8.0: {} - langium@3.0.0: + langium@3.3.1: dependencies: chevrotain: 11.0.3 chevrotain-allstar: 0.3.1(chevrotain@11.0.3) @@ -8522,7 +8899,7 @@ snapshots: lru-cache@10.4.3: {} - lru-cache@11.0.2: {} + lru-cache@11.1.0: {} lru-cache@6.0.0: dependencies: @@ -8538,7 +8915,7 @@ snapshots: markdown-table@3.0.4: {} - marked@15.0.7: {} + marked@15.0.11: {} math-intrinsics@1.1.0: {} @@ -8547,7 +8924,7 @@ snapshots: esm: 3.2.25 mhchemparser: 4.2.1 mj-context-menu: 0.6.1 - speech-rule-engine: 4.0.7 + speech-rule-engine: 4.1.2 mdast-util-find-and-replace@3.0.2: dependencies: @@ -8735,28 +9112,32 @@ snapshots: dependencies: '@types/mdast': 4.0.4 + media-typer@1.1.0: {} + + merge-descriptors@2.0.0: {} + merge-stream@2.0.0: {} merge2@1.4.1: {} - mermaid@11.5.0: + mermaid@11.6.0: dependencies: '@braintree/sanitize-url': 7.1.1 '@iconify/utils': 2.3.0 - '@mermaid-js/parser': 0.3.0 + '@mermaid-js/parser': 0.4.0 '@types/d3': 7.4.3 - cytoscape: 3.31.1 - cytoscape-cose-bilkent: 4.1.0(cytoscape@3.31.1) - cytoscape-fcose: 2.2.0(cytoscape@3.31.1) + cytoscape: 3.32.0 + cytoscape-cose-bilkent: 4.1.0(cytoscape@3.32.0) + cytoscape-fcose: 2.2.0(cytoscape@3.32.0) d3: 7.9.0 d3-sankey: 0.12.3 dagre-d3-es: 7.0.11 dayjs: 1.11.13 - dompurify: 3.2.4 - katex: 0.16.21 + dompurify: 3.2.5 + katex: 0.16.22 khroma: 2.1.0 lodash-es: 4.17.21 - marked: 15.0.7 + marked: 15.0.11 roughjs: 4.6.6 stylis: 4.3.6 ts-dedent: 2.2.0 @@ -8854,33 +9235,32 @@ snapshots: dependencies: '@types/katex': 0.16.7 devlop: 1.1.0 - katex: 0.16.21 + katex: 0.16.22 micromark-factory-space: 2.0.1 micromark-util-character: 2.1.1 micromark-util-symbol: 2.0.1 micromark-util-types: 2.0.2 - micromark-extension-mdx-expression@3.0.0: + micromark-extension-mdx-expression@3.0.1: dependencies: - '@types/estree': 1.0.6 + '@types/estree': 1.0.7 devlop: 1.1.0 - micromark-factory-mdx-expression: 2.0.2 + micromark-factory-mdx-expression: 2.0.3 micromark-factory-space: 2.0.1 micromark-util-character: 2.1.1 - micromark-util-events-to-acorn: 2.0.2 + micromark-util-events-to-acorn: 2.0.3 micromark-util-symbol: 2.0.1 micromark-util-types: 2.0.2 - micromark-extension-mdx-jsx@3.0.1: + micromark-extension-mdx-jsx@3.0.2: dependencies: - '@types/acorn': 4.0.6 - '@types/estree': 1.0.6 + '@types/estree': 1.0.7 devlop: 1.1.0 estree-util-is-identifier-name: 3.0.0 - micromark-factory-mdx-expression: 2.0.2 + micromark-factory-mdx-expression: 2.0.3 micromark-factory-space: 2.0.1 micromark-util-character: 2.1.1 - micromark-util-events-to-acorn: 2.0.2 + micromark-util-events-to-acorn: 2.0.3 micromark-util-symbol: 2.0.1 micromark-util-types: 2.0.2 vfile-message: 4.0.2 @@ -8891,11 +9271,11 @@ snapshots: micromark-extension-mdxjs-esm@3.0.0: dependencies: - '@types/estree': 1.0.6 + '@types/estree': 1.0.7 devlop: 1.1.0 micromark-core-commonmark: 2.0.3 micromark-util-character: 2.1.1 - micromark-util-events-to-acorn: 2.0.2 + micromark-util-events-to-acorn: 2.0.3 micromark-util-symbol: 2.0.1 micromark-util-types: 2.0.2 unist-util-position-from-estree: 2.0.0 @@ -8905,8 +9285,8 @@ snapshots: dependencies: acorn: 8.14.1 acorn-jsx: 5.3.2(acorn@8.14.1) - micromark-extension-mdx-expression: 3.0.0 - micromark-extension-mdx-jsx: 3.0.1 + micromark-extension-mdx-expression: 3.0.1 + micromark-extension-mdx-jsx: 3.0.2 micromark-extension-mdx-md: 2.0.0 micromark-extension-mdxjs-esm: 3.0.0 micromark-util-combine-extensions: 2.0.1 @@ -8925,13 +9305,13 @@ snapshots: micromark-util-symbol: 2.0.1 micromark-util-types: 2.0.2 - micromark-factory-mdx-expression@2.0.2: + micromark-factory-mdx-expression@2.0.3: dependencies: - '@types/estree': 1.0.6 + '@types/estree': 1.0.7 devlop: 1.1.0 micromark-factory-space: 2.0.1 micromark-util-character: 2.1.1 - micromark-util-events-to-acorn: 2.0.2 + micromark-util-events-to-acorn: 2.0.3 micromark-util-symbol: 2.0.1 micromark-util-types: 2.0.2 unist-util-position-from-estree: 2.0.0 @@ -8989,10 +9369,9 @@ snapshots: micromark-util-encode@2.0.1: {} - micromark-util-events-to-acorn@2.0.2: + micromark-util-events-to-acorn@2.0.3: dependencies: - '@types/acorn': 4.0.6 - '@types/estree': 1.0.6 + '@types/estree': 1.0.7 '@types/unist': 3.0.3 devlop: 1.1.0 estree-util-visit: 2.0.0 @@ -9030,7 +9409,7 @@ snapshots: micromark@4.0.2: dependencies: '@types/debug': 4.1.12 - debug: 4.4.0 + debug: 4.4.1 decode-named-character-reference: 1.1.0 devlop: 1.1.0 micromark-core-commonmark: 2.0.3 @@ -9068,6 +9447,10 @@ snapshots: dependencies: mime-db: 1.52.0 + mime-types@3.0.1: + dependencies: + mime-db: 1.54.0 + mimic-fn@2.1.0: {} mimic-fn@4.0.0: {} @@ -9097,9 +9480,9 @@ snapshots: acorn: 8.14.1 pathe: 2.0.3 pkg-types: 1.3.1 - ufo: 1.5.4 + ufo: 1.6.1 - module-details-from-path@1.0.3: {} + module-details-from-path@1.0.4: {} mri@1.2.0: {} @@ -9111,6 +9494,8 @@ snapshots: nanoid@3.3.11: {} + napi-postinstall@0.2.4: {} + natural-compare@1.4.0: {} needle@2.4.0: @@ -9127,89 +9512,89 @@ snapshots: netmask@2.0.2: {} - next-themes@0.4.6(react-dom@19.0.0(react@19.0.0))(react@19.0.0): + next-themes@0.4.6(react-dom@19.1.0(react@19.1.0))(react@19.1.0): dependencies: - react: 19.0.0 - react-dom: 19.0.0(react@19.0.0) + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) - next@15.3.0-canary.16(@playwright/test@1.51.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0): + next@15.3.2(@playwright/test@1.52.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0): dependencies: - '@next/env': 15.3.0-canary.16 + '@next/env': 15.3.2 '@swc/counter': 0.1.3 '@swc/helpers': 0.5.15 busboy: 1.6.0 - caniuse-lite: 1.0.30001706 + caniuse-lite: 1.0.30001718 postcss: 8.4.31 - react: 19.0.0 - react-dom: 19.0.0(react@19.0.0) - styled-jsx: 5.1.6(react@19.0.0) + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + styled-jsx: 5.1.6(react@19.1.0) optionalDependencies: - '@next/swc-darwin-arm64': 15.3.0-canary.16 - '@next/swc-darwin-x64': 15.3.0-canary.16 - '@next/swc-linux-arm64-gnu': 15.3.0-canary.16 - '@next/swc-linux-arm64-musl': 15.3.0-canary.16 - '@next/swc-linux-x64-gnu': 15.3.0-canary.16 - '@next/swc-linux-x64-musl': 15.3.0-canary.16 - '@next/swc-win32-arm64-msvc': 15.3.0-canary.16 - '@next/swc-win32-x64-msvc': 15.3.0-canary.16 - '@playwright/test': 1.51.1 - sharp: 0.33.5 + '@next/swc-darwin-arm64': 15.3.2 + '@next/swc-darwin-x64': 15.3.2 + '@next/swc-linux-arm64-gnu': 15.3.2 + '@next/swc-linux-arm64-musl': 15.3.2 + '@next/swc-linux-x64-gnu': 15.3.2 + '@next/swc-linux-x64-musl': 15.3.2 + '@next/swc-win32-arm64-msvc': 15.3.2 + '@next/swc-win32-x64-msvc': 15.3.2 + '@playwright/test': 1.52.0 + sharp: 0.34.1 transitivePeerDependencies: - '@babel/core' - babel-plugin-macros - nextra-theme-docs@4.2.17(@types/react@19.0.12)(next@15.3.0-canary.16(@playwright/test@1.51.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(nextra@4.2.17(acorn@8.14.1)(next@15.3.0-canary.16(@playwright/test@1.51.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.8.2))(react-dom@19.0.0(react@19.0.0))(react@19.0.0): + nextra-theme-docs@4.2.17(@types/react@19.1.4)(next@15.3.2(@playwright/test@1.52.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(nextra@4.2.17(acorn@8.14.1)(next@15.3.2(@playwright/test@1.52.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@5.8.3))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(use-sync-external-store@1.5.0(react@19.1.0)): dependencies: - '@headlessui/react': 2.2.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@headlessui/react': 2.2.3(react-dom@19.1.0(react@19.1.0))(react@19.1.0) clsx: 2.1.1 - next: 15.3.0-canary.16(@playwright/test@1.51.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - next-themes: 0.4.6(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - nextra: 4.2.17(acorn@8.14.1)(next@15.3.0-canary.16(@playwright/test@1.51.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.8.2) - react: 19.0.0 - react-compiler-runtime: 0.0.0-experimental-22c6e49-20241219(react@19.0.0) - react-dom: 19.0.0(react@19.0.0) + next: 15.3.2(@playwright/test@1.52.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + next-themes: 0.4.6(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + nextra: 4.2.17(acorn@8.14.1)(next@15.3.2(@playwright/test@1.52.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@5.8.3) + react: 19.1.0 + react-compiler-runtime: 0.0.0-experimental-22c6e49-20241219(react@19.1.0) + react-dom: 19.1.0(react@19.1.0) scroll-into-view-if-needed: 3.1.0 - zod: 3.24.2 - zod-validation-error: 3.4.0(zod@3.24.2) - zustand: 5.0.3(@types/react@19.0.12)(react@19.0.0) + zod: 3.24.4 + zod-validation-error: 3.4.1(zod@3.24.4) + zustand: 5.0.4(@types/react@19.1.4)(react@19.1.0)(use-sync-external-store@1.5.0(react@19.1.0)) transitivePeerDependencies: - '@types/react' - immer - use-sync-external-store - nextra@4.2.17(acorn@8.14.1)(next@15.3.0-canary.16(@playwright/test@1.51.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.8.2): + nextra@4.2.17(acorn@8.14.1)(next@15.3.2(@playwright/test@1.52.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@5.8.3): dependencies: - '@formatjs/intl-localematcher': 0.6.0 - '@headlessui/react': 2.2.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@formatjs/intl-localematcher': 0.6.1 + '@headlessui/react': 2.2.3(react-dom@19.1.0(react@19.1.0))(react@19.1.0) '@mdx-js/mdx': 3.1.0(acorn@8.14.1) '@napi-rs/simple-git': 0.1.19 - '@shikijs/twoslash': 2.5.0(typescript@5.8.2) - '@theguild/remark-mermaid': 0.2.0(react@19.0.0) + '@shikijs/twoslash': 2.5.0(typescript@5.8.3) + '@theguild/remark-mermaid': 0.2.0(react@19.1.0) '@theguild/remark-npm2yarn': 0.3.3 - better-react-mathjax: 2.1.0(react@19.0.0) + better-react-mathjax: 2.3.0(react@19.1.0) clsx: 2.1.1 estree-util-to-js: 2.0.0 - estree-util-value-to-estree: 3.3.2 + estree-util-value-to-estree: 3.4.0 fast-glob: 3.3.3 github-slugger: 2.0.0 hast-util-to-estree: 3.1.3 - katex: 0.16.21 + katex: 0.16.22 mdast-util-from-markdown: 2.0.2 mdast-util-gfm: 3.1.0 mdast-util-to-hast: 13.2.0 negotiator: 1.0.0 - next: 15.3.0-canary.16(@playwright/test@1.51.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - react: 19.0.0 - react-compiler-runtime: 0.0.0-experimental-22c6e49-20241219(react@19.0.0) - react-dom: 19.0.0(react@19.0.0) - react-medium-image-zoom: 5.2.14(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + next: 15.3.2(@playwright/test@1.52.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + react: 19.1.0 + react-compiler-runtime: 0.0.0-experimental-22c6e49-20241219(react@19.1.0) + react-dom: 19.1.0(react@19.1.0) + react-medium-image-zoom: 5.2.14(react-dom@19.1.0(react@19.1.0))(react@19.1.0) rehype-katex: 7.0.1 rehype-pretty-code: 0.14.1(shiki@2.5.0) rehype-raw: 7.0.0 remark-frontmatter: 5.0.0 remark-gfm: 4.0.1 remark-math: 6.0.0 - remark-reading-time: 2.0.1 + remark-reading-time: 2.0.2 remark-smartypants: 3.0.2 shiki: 2.5.0 slash: 5.1.0 @@ -9217,9 +9602,9 @@ snapshots: unist-util-remove: 4.0.0 unist-util-visit: 5.0.0 unist-util-visit-children: 3.0.0 - yaml: 2.7.0 - zod: 3.24.2 - zod-validation-error: 3.4.0(zod@3.24.2) + yaml: 2.8.0 + zod: 3.24.4 + zod-validation-error: 3.4.1(zod@3.24.4) transitivePeerDependencies: - acorn - supports-color @@ -9236,14 +9621,14 @@ snapshots: normalize-package-data@6.0.2: dependencies: hosted-git-info: 7.0.2 - semver: 7.7.1 + semver: 7.7.2 validate-npm-package-license: 3.0.4 normalize-path@3.0.0: {} npm-install-checks@6.3.0: dependencies: - semver: 7.7.1 + semver: 7.7.2 npm-normalize-package-bin@3.0.1: {} @@ -9251,7 +9636,7 @@ snapshots: dependencies: hosted-git-info: 7.0.2 proc-log: 4.2.0 - semver: 7.7.1 + semver: 7.7.2 validate-npm-package-name: 5.0.1 npm-pick-manifest@9.1.0: @@ -9259,7 +9644,7 @@ snapshots: npm-install-checks: 6.3.0 npm-normalize-package-bin: 3.0.1 npm-package-arg: 11.0.3 - semver: 7.7.1 + semver: 7.7.2 npm-run-path@4.0.1: dependencies: @@ -9309,6 +9694,10 @@ snapshots: on-exit-leak-free@2.1.2: {} + on-finished@2.4.1: + dependencies: + ee-first: 1.1.1 + on-headers@1.0.2: {} once@1.4.0: @@ -9376,7 +9765,7 @@ snapshots: dependencies: '@tootallnate/quickjs-emscripten': 0.23.0 agent-base: 7.1.3 - debug: 4.4.0 + debug: 4.4.1 get-uri: 6.0.4 http-proxy-agent: 7.0.2 https-proxy-agent: 7.0.6 @@ -9396,6 +9785,8 @@ snapshots: dependencies: quansync: 0.2.10 + package-manager-detector@1.3.0: {} + pagefind@1.3.0: optionalDependencies: '@pagefind/darwin-arm64': 1.3.0 @@ -9420,14 +9811,13 @@ snapshots: is-decimal: 2.0.1 is-hexadecimal: 2.0.1 - parse-imports@2.2.1: + parse-imports-exports@0.2.4: dependencies: - es-module-lexer: 1.6.0 - slashes: 3.0.12 + parse-statements: 1.0.11 parse-json@7.1.1: dependencies: - '@babel/code-frame': 7.26.2 + '@babel/code-frame': 7.27.1 error-ex: 1.3.2 json-parse-even-better-errors: 3.0.2 lines-and-columns: 2.0.4 @@ -9444,9 +9834,13 @@ snapshots: parse-numeric-range@1.3.0: {} - parse5@7.2.1: + parse-statements@1.0.11: {} + + parse5@7.3.0: dependencies: - entities: 4.5.0 + entities: 6.0.0 + + parseurl@1.3.3: {} path-data-parser@0.1.0: {} @@ -9467,6 +9861,8 @@ snapshots: path-to-regexp@3.3.0: {} + path-to-regexp@8.2.0: {} + path-type@4.0.0: {} pathe@2.0.3: {} @@ -9526,6 +9922,8 @@ snapshots: sonic-boom: 4.2.0 thread-stream: 3.1.0 + pkce-challenge@5.0.0: {} + pkg-types@1.3.1: dependencies: confbox: 0.1.8 @@ -9534,21 +9932,21 @@ snapshots: pkg-types@2.1.0: dependencies: - confbox: 0.2.1 - exsolve: 1.0.4 + confbox: 0.2.2 + exsolve: 1.0.5 pathe: 2.0.3 - playwright-core@1.51.1: {} + playwright-core@1.52.0: {} - playwright@1.51.1: + playwright@1.52.0: dependencies: - playwright-core: 1.51.1 + playwright-core: 1.52.0 optionalDependencies: fsevents: 2.3.2 pm2-axon-rpc@0.7.1: dependencies: - debug: 4.4.0 + debug: 4.4.1 transitivePeerDependencies: - supports-color @@ -9556,7 +9954,7 @@ snapshots: dependencies: amp: 0.3.1 amp-message: 0.1.2 - debug: 4.4.0 + debug: 4.4.1 escape-string-regexp: 4.0.0 transitivePeerDependencies: - supports-color @@ -9573,7 +9971,7 @@ snapshots: pm2-sysmonit@1.2.8: dependencies: async: 3.2.6 - debug: 4.4.0 + debug: 4.4.1 pidusage: 2.0.21 systeminformation: 5.25.11 tx2: 1.0.5 @@ -9581,21 +9979,21 @@ snapshots: - supports-color optional: true - pm2@6.0.5: + pm2@6.0.6: dependencies: '@pm2/agent': 2.1.1 '@pm2/io': 6.1.0 '@pm2/js-api': 0.8.0 '@pm2/pm2-version-check': 1.0.4 + ansis: 4.0.0 async: 3.2.6 blessed: 0.1.81 - chalk: 3.0.0 chokidar: 3.6.0 cli-tableau: 2.0.1 commander: 2.15.1 croner: 4.1.97 dayjs: 1.11.13 - debug: 4.4.0 + debug: 4.4.1 enquirer: 2.3.6 eventemitter2: 5.0.1 fclone: 1.0.11 @@ -9608,7 +10006,7 @@ snapshots: pm2-deploy: 1.0.2 pm2-multimeter: 0.1.2 promptly: 2.2.0 - semver: 7.7.1 + semver: 7.7.2 source-map-support: 0.5.21 sprintf-js: 1.1.2 vizion: 2.2.1 @@ -9642,10 +10040,10 @@ snapshots: prelude-ls@1.2.1: {} - prettier-plugin-packagejson@2.5.10(prettier@3.5.3): + prettier-plugin-packagejson@2.5.13(prettier@3.5.3): dependencies: - sort-package-json: 2.15.1 - synckit: 0.9.2 + sort-package-json: 3.2.1 + synckit: 0.11.5 optionalDependencies: prettier: 3.5.3 @@ -9657,6 +10055,8 @@ snapshots: process-warning@4.0.1: {} + process-warning@5.0.0: {} + promise-inflight@1.0.1: {} promise-retry@2.0.1: @@ -9676,12 +10076,17 @@ snapshots: property-information@6.5.0: {} - property-information@7.0.0: {} + property-information@7.1.0: {} + + proxy-addr@2.0.7: + dependencies: + forwarded: 0.2.0 + ipaddr.js: 1.9.1 proxy-agent@6.4.0: dependencies: agent-base: 7.1.3 - debug: 4.4.0 + debug: 4.4.1 http-proxy-agent: 7.0.2 https-proxy-agent: 7.0.6 lru-cache: 7.18.3 @@ -9700,6 +10105,10 @@ snapshots: punycode@2.3.1: {} + qs@6.14.0: + dependencies: + side-channel: 1.1.0 + quansync@0.2.10: {} queue-microtask@1.2.3: {} @@ -9708,6 +10117,15 @@ snapshots: range-parser@1.2.0: {} + range-parser@1.2.1: {} + + raw-body@3.0.0: + dependencies: + bytes: 3.1.2 + http-errors: 2.0.0 + iconv-lite: 0.6.3 + unpipe: 1.0.0 + rc@1.2.8: dependencies: deep-extend: 0.6.0 @@ -9715,23 +10133,23 @@ snapshots: minimist: 1.2.8 strip-json-comments: 2.0.1 - react-compiler-runtime@0.0.0-experimental-22c6e49-20241219(react@19.0.0): + react-compiler-runtime@0.0.0-experimental-22c6e49-20241219(react@19.1.0): dependencies: - react: 19.0.0 + react: 19.1.0 - react-dom@19.0.0(react@19.0.0): + react-dom@19.1.0(react@19.1.0): dependencies: - react: 19.0.0 - scheduler: 0.25.0 + react: 19.1.0 + scheduler: 0.26.0 react-is@16.13.1: {} - react-medium-image-zoom@5.2.14(react-dom@19.0.0(react@19.0.0))(react@19.0.0): + react-medium-image-zoom@5.2.14(react-dom@19.1.0(react@19.1.0))(react@19.1.0): dependencies: - react: 19.0.0 - react-dom: 19.0.0(react@19.0.0) + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) - react@19.0.0: {} + react@19.1.0: {} read-package-json-fast@3.0.2: dependencies: @@ -9765,7 +10183,7 @@ snapshots: recma-build-jsx@1.0.0: dependencies: - '@types/estree': 1.0.6 + '@types/estree': 1.0.7 estree-util-build-jsx: 3.0.1 vfile: 6.0.3 @@ -9781,14 +10199,14 @@ snapshots: recma-parse@1.0.0: dependencies: - '@types/estree': 1.0.6 + '@types/estree': 1.0.7 esast-util-from-js: 2.0.1 unified: 11.0.5 vfile: 6.0.3 recma-stringify@1.0.0: dependencies: - '@types/estree': 1.0.6 + '@types/estree': 1.0.7 estree-util-to-js: 2.0.0 unified: 11.0.5 vfile: 6.0.3 @@ -9813,8 +10231,6 @@ snapshots: get-proto: 1.0.1 which-builtin-type: 1.2.1 - regenerator-runtime@0.14.1: {} - regex-recursion@6.0.2: dependencies: regex-utilities: 2.3.0 @@ -9849,7 +10265,7 @@ snapshots: '@types/katex': 0.16.7 hast-util-from-html-isomorphic: 2.0.0 hast-util-to-text: 4.0.2 - katex: 0.16.21 + katex: 0.16.22 unist-util-visit-parents: 6.0.1 vfile: 6.0.3 @@ -9877,7 +10293,7 @@ snapshots: rehype-recma@1.0.0: dependencies: - '@types/estree': 1.0.6 + '@types/estree': 1.0.7 '@types/hast': 3.0.4 hast-util-to-estree: 3.1.3 transitivePeerDependencies: @@ -9928,14 +10344,14 @@ snapshots: transitivePeerDependencies: - supports-color - remark-reading-time@2.0.1: + remark-reading-time@2.0.2: dependencies: estree-util-is-identifier-name: 2.1.0 - estree-util-value-to-estree: 1.3.0 + estree-util-value-to-estree: 3.4.0 reading-time: 1.5.0 unist-util-visit: 3.1.0 - remark-rehype@11.1.1: + remark-rehype@11.1.2: dependencies: '@types/hast': 3.0.4 '@types/mdast': 4.0.4 @@ -9960,8 +10376,8 @@ snapshots: require-in-the-middle@5.2.0: dependencies: - debug: 4.4.0 - module-details-from-path: 1.0.3 + debug: 4.4.1 + module-details-from-path: 1.0.4 resolve: 1.22.10 transitivePeerDependencies: - supports-color @@ -10019,29 +10435,30 @@ snapshots: robust-predicates@3.0.2: {} - rollup@4.36.0: + rollup@4.40.2: dependencies: - '@types/estree': 1.0.6 + '@types/estree': 1.0.7 optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.36.0 - '@rollup/rollup-android-arm64': 4.36.0 - '@rollup/rollup-darwin-arm64': 4.36.0 - '@rollup/rollup-darwin-x64': 4.36.0 - '@rollup/rollup-freebsd-arm64': 4.36.0 - '@rollup/rollup-freebsd-x64': 4.36.0 - '@rollup/rollup-linux-arm-gnueabihf': 4.36.0 - '@rollup/rollup-linux-arm-musleabihf': 4.36.0 - '@rollup/rollup-linux-arm64-gnu': 4.36.0 - '@rollup/rollup-linux-arm64-musl': 4.36.0 - '@rollup/rollup-linux-loongarch64-gnu': 4.36.0 - '@rollup/rollup-linux-powerpc64le-gnu': 4.36.0 - '@rollup/rollup-linux-riscv64-gnu': 4.36.0 - '@rollup/rollup-linux-s390x-gnu': 4.36.0 - '@rollup/rollup-linux-x64-gnu': 4.36.0 - '@rollup/rollup-linux-x64-musl': 4.36.0 - '@rollup/rollup-win32-arm64-msvc': 4.36.0 - '@rollup/rollup-win32-ia32-msvc': 4.36.0 - '@rollup/rollup-win32-x64-msvc': 4.36.0 + '@rollup/rollup-android-arm-eabi': 4.40.2 + '@rollup/rollup-android-arm64': 4.40.2 + '@rollup/rollup-darwin-arm64': 4.40.2 + '@rollup/rollup-darwin-x64': 4.40.2 + '@rollup/rollup-freebsd-arm64': 4.40.2 + '@rollup/rollup-freebsd-x64': 4.40.2 + '@rollup/rollup-linux-arm-gnueabihf': 4.40.2 + '@rollup/rollup-linux-arm-musleabihf': 4.40.2 + '@rollup/rollup-linux-arm64-gnu': 4.40.2 + '@rollup/rollup-linux-arm64-musl': 4.40.2 + '@rollup/rollup-linux-loongarch64-gnu': 4.40.2 + '@rollup/rollup-linux-powerpc64le-gnu': 4.40.2 + '@rollup/rollup-linux-riscv64-gnu': 4.40.2 + '@rollup/rollup-linux-riscv64-musl': 4.40.2 + '@rollup/rollup-linux-s390x-gnu': 4.40.2 + '@rollup/rollup-linux-x64-gnu': 4.40.2 + '@rollup/rollup-linux-x64-musl': 4.40.2 + '@rollup/rollup-win32-arm64-msvc': 4.40.2 + '@rollup/rollup-win32-ia32-msvc': 4.40.2 + '@rollup/rollup-win32-x64-msvc': 4.40.2 fsevents: 2.3.3 roughjs@4.6.6: @@ -10051,19 +10468,15 @@ snapshots: points-on-curve: 0.2.0 points-on-path: 0.2.1 - rspack-resolver@1.2.2: - optionalDependencies: - '@unrs/rspack-resolver-binding-darwin-arm64': 1.2.2 - '@unrs/rspack-resolver-binding-darwin-x64': 1.2.2 - '@unrs/rspack-resolver-binding-freebsd-x64': 1.2.2 - '@unrs/rspack-resolver-binding-linux-arm-gnueabihf': 1.2.2 - '@unrs/rspack-resolver-binding-linux-arm64-gnu': 1.2.2 - '@unrs/rspack-resolver-binding-linux-arm64-musl': 1.2.2 - '@unrs/rspack-resolver-binding-linux-x64-gnu': 1.2.2 - '@unrs/rspack-resolver-binding-linux-x64-musl': 1.2.2 - '@unrs/rspack-resolver-binding-wasm32-wasi': 1.2.2 - '@unrs/rspack-resolver-binding-win32-arm64-msvc': 1.2.2 - '@unrs/rspack-resolver-binding-win32-x64-msvc': 1.2.2 + router@2.2.0: + dependencies: + debug: 4.4.1 + depd: 2.0.0 + is-promise: 4.0.0 + parseurl: 1.3.3 + path-to-regexp: 8.2.0 + transitivePeerDependencies: + - supports-color run-parallel@1.2.0: dependencies: @@ -10100,7 +10513,7 @@ snapshots: es-errors: 1.3.0 is-regex: 1.2.1 - safe-regex2@4.0.1: + safe-regex2@5.0.0: dependencies: ret: 0.5.0 @@ -10110,7 +10523,7 @@ snapshots: sax@1.4.1: {} - scheduler@0.25.0: {} + scheduler@0.26.0: {} scroll-into-view-if-needed@3.1.0: dependencies: @@ -10118,7 +10531,7 @@ snapshots: secure-json-parse@2.7.0: {} - secure-json-parse@3.0.2: {} + secure-json-parse@4.0.0: {} semver@6.3.1: {} @@ -10126,7 +10539,23 @@ snapshots: dependencies: lru-cache: 6.0.0 - semver@7.7.1: {} + semver@7.7.2: {} + + send@1.2.0: + dependencies: + debug: 4.4.1 + encodeurl: 2.0.0 + escape-html: 1.0.3 + etag: 1.8.1 + fresh: 2.0.0 + http-errors: 2.0.0 + mime-types: 3.0.1 + ms: 2.1.3 + on-finished: 2.4.1 + range-parser: 1.2.1 + statuses: 2.0.1 + transitivePeerDependencies: + - supports-color serve-handler@6.1.6: dependencies: @@ -10138,6 +10567,15 @@ snapshots: path-to-regexp: 3.3.0 range-parser: 1.2.0 + 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 + serve@14.2.4: dependencies: '@zeit/schemas': 2.36.0 @@ -10178,31 +10616,34 @@ snapshots: es-errors: 1.3.0 es-object-atoms: 1.1.1 - sharp@0.33.5: + setprototypeof@1.2.0: {} + + sharp@0.34.1: dependencies: color: 4.2.3 - detect-libc: 2.0.3 - semver: 7.7.1 + detect-libc: 2.0.4 + semver: 7.7.2 optionalDependencies: - '@img/sharp-darwin-arm64': 0.33.5 - '@img/sharp-darwin-x64': 0.33.5 - '@img/sharp-libvips-darwin-arm64': 1.0.4 - '@img/sharp-libvips-darwin-x64': 1.0.4 - '@img/sharp-libvips-linux-arm': 1.0.5 - '@img/sharp-libvips-linux-arm64': 1.0.4 - '@img/sharp-libvips-linux-s390x': 1.0.4 - '@img/sharp-libvips-linux-x64': 1.0.4 - '@img/sharp-libvips-linuxmusl-arm64': 1.0.4 - '@img/sharp-libvips-linuxmusl-x64': 1.0.4 - '@img/sharp-linux-arm': 0.33.5 - '@img/sharp-linux-arm64': 0.33.5 - '@img/sharp-linux-s390x': 0.33.5 - '@img/sharp-linux-x64': 0.33.5 - '@img/sharp-linuxmusl-arm64': 0.33.5 - '@img/sharp-linuxmusl-x64': 0.33.5 - '@img/sharp-wasm32': 0.33.5 - '@img/sharp-win32-ia32': 0.33.5 - '@img/sharp-win32-x64': 0.33.5 + '@img/sharp-darwin-arm64': 0.34.1 + '@img/sharp-darwin-x64': 0.34.1 + '@img/sharp-libvips-darwin-arm64': 1.1.0 + '@img/sharp-libvips-darwin-x64': 1.1.0 + '@img/sharp-libvips-linux-arm': 1.1.0 + '@img/sharp-libvips-linux-arm64': 1.1.0 + '@img/sharp-libvips-linux-ppc64': 1.1.0 + '@img/sharp-libvips-linux-s390x': 1.1.0 + '@img/sharp-libvips-linux-x64': 1.1.0 + '@img/sharp-libvips-linuxmusl-arm64': 1.1.0 + '@img/sharp-libvips-linuxmusl-x64': 1.1.0 + '@img/sharp-linux-arm': 0.34.1 + '@img/sharp-linux-arm64': 0.34.1 + '@img/sharp-linux-s390x': 0.34.1 + '@img/sharp-linux-x64': 0.34.1 + '@img/sharp-linuxmusl-arm64': 0.34.1 + '@img/sharp-linuxmusl-x64': 0.34.1 + '@img/sharp-wasm32': 0.34.1 + '@img/sharp-win32-ia32': 0.34.1 + '@img/sharp-win32-x64': 0.34.1 optional: true shebang-command@2.0.0: @@ -10267,14 +10708,12 @@ snapshots: slash@5.1.0: {} - slashes@3.0.12: {} - smart-buffer@4.2.0: {} socks-proxy-agent@8.0.5: dependencies: agent-base: 7.1.3 - debug: 4.4.0 + debug: 4.4.1 socks: 2.8.4 transitivePeerDependencies: - supports-color @@ -10290,16 +10729,15 @@ snapshots: sort-object-keys@1.1.3: {} - sort-package-json@2.15.1: + sort-package-json@3.2.1: dependencies: detect-indent: 7.0.1 detect-newline: 4.0.1 - get-stdin: 9.0.0 - git-hooks-list: 3.2.0 + git-hooks-list: 4.1.1 is-plain-obj: 4.1.0 - semver: 7.7.1 + semver: 7.7.2 sort-object-keys: 1.1.3 - tinyglobby: 0.2.12 + tinyglobby: 0.2.13 source-map-js@1.2.1: {} @@ -10338,11 +10776,11 @@ snapshots: spdx-license-ids@3.0.21: {} - speech-rule-engine@4.0.7: + speech-rule-engine@4.1.2: dependencies: - commander: 9.2.0 + '@xmldom/xmldom': 0.9.8 + commander: 13.1.0 wicked-good-xpath: 1.3.0 - xmldom-sre: 0.1.31 split2@4.2.0: {} @@ -10356,7 +10794,9 @@ snapshots: stackback@0.0.2: {} - std-env@3.8.1: {} + statuses@2.0.1: {} + + std-env@3.9.0: {} streamsearch@1.1.0: {} @@ -10457,10 +10897,10 @@ snapshots: dependencies: inline-style-parser: 0.2.4 - styled-jsx@5.1.6(react@19.0.0): + styled-jsx@5.1.6(react@19.1.0): dependencies: client-only: 0.0.1 - react: 19.0.0 + react: 19.1.0 stylis@4.3.6: {} @@ -10476,9 +10916,9 @@ snapshots: supports-preserve-symlinks-flag@1.0.0: {} - synckit@0.9.2: + synckit@0.11.5: dependencies: - '@pkgr/core': 0.1.2 + '@pkgr/core': 0.2.4 tslib: 2.8.1 system-architecture@0.1.0: {} @@ -10498,9 +10938,11 @@ snapshots: tinyexec@0.3.2: {} - tinyglobby@0.2.12: + tinyexec@1.0.1: {} + + tinyglobby@0.2.13: dependencies: - fdir: 6.4.3(picomatch@4.0.2) + fdir: 6.4.4(picomatch@4.0.2) picomatch: 4.0.2 tinypool@1.0.2: {} @@ -10525,13 +10967,15 @@ snapshots: toad-cache@3.7.0: {} + toidentifier@1.0.1: {} + trim-lines@3.0.1: {} trough@2.2.0: {} - ts-api-utils@2.1.0(typescript@5.8.2): + ts-api-utils@2.1.0(typescript@5.8.3): dependencies: - typescript: 5.8.2 + typescript: 5.8.3 ts-dedent@2.2.0: {} @@ -10539,49 +10983,49 @@ snapshots: tslib@2.8.1: {} - tsx@4.19.3: + tsx@4.19.4: dependencies: - esbuild: 0.25.1 + esbuild: 0.25.4 get-tsconfig: 4.10.0 optionalDependencies: fsevents: 2.3.3 - turbo-darwin-64@2.4.4: + turbo-darwin-64@2.5.3: optional: true - turbo-darwin-arm64@2.4.4: + turbo-darwin-arm64@2.5.3: optional: true - turbo-linux-64@2.4.4: + turbo-linux-64@2.5.3: optional: true - turbo-linux-arm64@2.4.4: + turbo-linux-arm64@2.5.3: optional: true - turbo-windows-64@2.4.4: + turbo-windows-64@2.5.3: optional: true - turbo-windows-arm64@2.4.4: + turbo-windows-arm64@2.5.3: optional: true - turbo@2.4.4: + turbo@2.5.3: optionalDependencies: - turbo-darwin-64: 2.4.4 - turbo-darwin-arm64: 2.4.4 - turbo-linux-64: 2.4.4 - turbo-linux-arm64: 2.4.4 - turbo-windows-64: 2.4.4 - turbo-windows-arm64: 2.4.4 + turbo-darwin-64: 2.5.3 + turbo-darwin-arm64: 2.5.3 + turbo-linux-64: 2.5.3 + turbo-linux-arm64: 2.5.3 + turbo-windows-64: 2.5.3 + turbo-windows-arm64: 2.5.3 tv4@1.3.0: {} twoslash-protocol@0.2.12: {} - twoslash@0.2.12(typescript@5.8.2): + twoslash@0.2.12(typescript@5.8.3): dependencies: - '@typescript/vfs': 1.6.1(typescript@5.8.2) + '@typescript/vfs': 1.6.1(typescript@5.8.3) twoslash-protocol: 0.2.12 - typescript: 5.8.2 + typescript: 5.8.3 transitivePeerDependencies: - supports-color @@ -10598,6 +11042,12 @@ snapshots: type-fest@3.13.1: {} + type-is@2.0.1: + dependencies: + content-type: 1.0.5 + media-typer: 1.1.0 + mime-types: 3.0.1 + typed-array-buffer@1.0.3: dependencies: call-bound: 1.0.4 @@ -10633,19 +11083,19 @@ snapshots: typedarray@0.0.6: {} - typescript-eslint@8.27.0(eslint@9.22.0)(typescript@5.8.2): + typescript-eslint@8.32.1(eslint@9.26.0)(typescript@5.8.3): dependencies: - '@typescript-eslint/eslint-plugin': 8.27.0(@typescript-eslint/parser@8.27.0(eslint@9.22.0)(typescript@5.8.2))(eslint@9.22.0)(typescript@5.8.2) - '@typescript-eslint/parser': 8.27.0(eslint@9.22.0)(typescript@5.8.2) - '@typescript-eslint/utils': 8.27.0(eslint@9.22.0)(typescript@5.8.2) - eslint: 9.22.0 - typescript: 5.8.2 + '@typescript-eslint/eslint-plugin': 8.32.1(@typescript-eslint/parser@8.32.1(eslint@9.26.0)(typescript@5.8.3))(eslint@9.26.0)(typescript@5.8.3) + '@typescript-eslint/parser': 8.32.1(eslint@9.26.0)(typescript@5.8.3) + '@typescript-eslint/utils': 8.32.1(eslint@9.26.0)(typescript@5.8.3) + eslint: 9.26.0 + typescript: 5.8.3 transitivePeerDependencies: - supports-color - typescript@5.8.2: {} + typescript@5.8.3: {} - ufo@1.5.4: {} + ufo@1.6.1: {} unbox-primitive@1.1.0: dependencies: @@ -10654,17 +11104,17 @@ snapshots: has-symbols: 1.1.0 which-boxed-primitive: 1.1.1 - undici-types@6.20.0: {} + undici-types@6.21.0: {} unified-engine@11.2.2: dependencies: '@types/concat-stream': 2.0.3 '@types/debug': 4.1.12 '@types/is-empty': 1.2.3 - '@types/node': 22.13.10 + '@types/node': 22.15.18 '@types/unist': 3.0.3 concat-stream: 2.0.0 - debug: 4.4.0 + debug: 4.4.1 extend: 3.0.2 glob: 10.4.5 ignore: 6.0.2 @@ -10678,7 +11128,7 @@ snapshots: vfile-message: 4.0.2 vfile-reporter: 8.1.1 vfile-statistics: 3.0.0 - yaml: 2.7.0 + yaml: 2.8.0 transitivePeerDependencies: - bluebird - supports-color @@ -10766,6 +11216,30 @@ snapshots: universalify@0.1.2: {} + unpipe@1.0.0: {} + + unrs-resolver@1.7.2: + dependencies: + napi-postinstall: 0.2.4 + optionalDependencies: + '@unrs/resolver-binding-darwin-arm64': 1.7.2 + '@unrs/resolver-binding-darwin-x64': 1.7.2 + '@unrs/resolver-binding-freebsd-x64': 1.7.2 + '@unrs/resolver-binding-linux-arm-gnueabihf': 1.7.2 + '@unrs/resolver-binding-linux-arm-musleabihf': 1.7.2 + '@unrs/resolver-binding-linux-arm64-gnu': 1.7.2 + '@unrs/resolver-binding-linux-arm64-musl': 1.7.2 + '@unrs/resolver-binding-linux-ppc64-gnu': 1.7.2 + '@unrs/resolver-binding-linux-riscv64-gnu': 1.7.2 + '@unrs/resolver-binding-linux-riscv64-musl': 1.7.2 + '@unrs/resolver-binding-linux-s390x-gnu': 1.7.2 + '@unrs/resolver-binding-linux-x64-gnu': 1.7.2 + '@unrs/resolver-binding-linux-x64-musl': 1.7.2 + '@unrs/resolver-binding-wasm32-wasi': 1.7.2 + '@unrs/resolver-binding-win32-arm64-msvc': 1.7.2 + '@unrs/resolver-binding-win32-ia32-msvc': 1.7.2 + '@unrs/resolver-binding-win32-x64-msvc': 1.7.2 + update-check@1.5.4: dependencies: registry-auth-token: 3.3.2 @@ -10775,6 +11249,10 @@ snapshots: dependencies: punycode: 2.3.1 + use-sync-external-store@1.5.0(react@19.1.0): + dependencies: + react: 19.1.0 + util-deprecate@1.0.2: {} uuid@11.1.0: {} @@ -10831,13 +11309,13 @@ snapshots: '@types/unist': 3.0.3 vfile-message: 4.0.2 - vite-node@3.0.9(@types/node@22.13.10)(tsx@4.19.3)(yaml@2.7.0): + vite-node@3.1.3(@types/node@22.15.18)(tsx@4.19.4)(yaml@2.8.0): dependencies: cac: 6.7.14 - debug: 4.4.0 - es-module-lexer: 1.6.0 + debug: 4.4.1 + es-module-lexer: 1.7.0 pathe: 2.0.3 - vite: 6.2.2(@types/node@22.13.10)(tsx@4.19.3)(yaml@2.7.0) + vite: 6.3.5(@types/node@22.15.18)(tsx@4.19.4)(yaml@2.8.0) transitivePeerDependencies: - '@types/node' - jiti @@ -10852,42 +11330,46 @@ snapshots: - tsx - yaml - vite@6.2.2(@types/node@22.13.10)(tsx@4.19.3)(yaml@2.7.0): + vite@6.3.5(@types/node@22.15.18)(tsx@4.19.4)(yaml@2.8.0): dependencies: - esbuild: 0.25.1 + esbuild: 0.25.4 + fdir: 6.4.4(picomatch@4.0.2) + picomatch: 4.0.2 postcss: 8.5.3 - rollup: 4.36.0 + rollup: 4.40.2 + tinyglobby: 0.2.13 optionalDependencies: - '@types/node': 22.13.10 + '@types/node': 22.15.18 fsevents: 2.3.3 - tsx: 4.19.3 - yaml: 2.7.0 - - vitest@3.0.9(@types/debug@4.1.12)(@types/node@22.13.10)(tsx@4.19.3)(yaml@2.7.0): - dependencies: - '@vitest/expect': 3.0.9 - '@vitest/mocker': 3.0.9(vite@6.2.2(@types/node@22.13.10)(tsx@4.19.3)(yaml@2.7.0)) - '@vitest/pretty-format': 3.0.9 - '@vitest/runner': 3.0.9 - '@vitest/snapshot': 3.0.9 - '@vitest/spy': 3.0.9 - '@vitest/utils': 3.0.9 + tsx: 4.19.4 + yaml: 2.8.0 + + vitest@3.1.3(@types/debug@4.1.12)(@types/node@22.15.18)(tsx@4.19.4)(yaml@2.8.0): + dependencies: + '@vitest/expect': 3.1.3 + '@vitest/mocker': 3.1.3(vite@6.3.5(@types/node@22.15.18)(tsx@4.19.4)(yaml@2.8.0)) + '@vitest/pretty-format': 3.1.3 + '@vitest/runner': 3.1.3 + '@vitest/snapshot': 3.1.3 + '@vitest/spy': 3.1.3 + '@vitest/utils': 3.1.3 chai: 5.2.0 - debug: 4.4.0 - expect-type: 1.2.0 + debug: 4.4.1 + expect-type: 1.2.1 magic-string: 0.30.17 pathe: 2.0.3 - std-env: 3.8.1 + std-env: 3.9.0 tinybench: 2.9.0 tinyexec: 0.3.2 + tinyglobby: 0.2.13 tinypool: 1.0.2 tinyrainbow: 2.0.0 - vite: 6.2.2(@types/node@22.13.10)(tsx@4.19.3)(yaml@2.7.0) - vite-node: 3.0.9(@types/node@22.13.10)(tsx@4.19.3)(yaml@2.7.0) + vite: 6.3.5(@types/node@22.15.18)(tsx@4.19.4)(yaml@2.8.0) + vite-node: 3.1.3(@types/node@22.15.18)(tsx@4.19.4)(yaml@2.8.0) why-is-node-running: 2.3.0 optionalDependencies: '@types/debug': 4.1.12 - '@types/node': 22.13.10 + '@types/node': 22.15.18 transitivePeerDependencies: - jiti - less @@ -11008,23 +11490,26 @@ snapshots: ws@7.5.10: {} - xmldom-sre@0.1.31: {} - yallist@4.0.0: {} - yaml@2.7.0: {} + yaml@2.8.0: {} yocto-queue@0.1.0: {} - zod-validation-error@3.4.0(zod@3.24.2): + zod-to-json-schema@3.24.5(zod@3.24.4): + dependencies: + zod: 3.24.4 + + zod-validation-error@3.4.1(zod@3.24.4): dependencies: - zod: 3.24.2 + zod: 3.24.4 - zod@3.24.2: {} + zod@3.24.4: {} - zustand@5.0.3(@types/react@19.0.12)(react@19.0.0): + zustand@5.0.4(@types/react@19.1.4)(react@19.1.0)(use-sync-external-store@1.5.0(react@19.1.0)): optionalDependencies: - '@types/react': 19.0.12 - react: 19.0.0 + '@types/react': 19.1.4 + react: 19.1.0 + use-sync-external-store: 1.5.0(react@19.1.0) zwitch@2.0.4: {} diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 4d0d03d0..91bd5830 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -6,3 +6,4 @@ packages: onlyBuiltDependencies: - esbuild - sharp + - unrs-resolver From 0c42110b068ffdde113e854abf8b60f6dcd87757 Mon Sep 17 00:00:00 2001 From: better-salmon <132773930+better-salmon@users.noreply.github.com> Date: Thu, 15 May 2025 18:44:29 +0300 Subject: [PATCH 15/16] Upgrade Redis to version 5 --- apps/cache-testing/package.json | 2 +- internal/eslint-config/vitest.js | 5 + packages/cache-handler/package.json | 2 +- .../handlers/experimental-redis-cluster.ts | 102 ++++++++--------- .../cache-handler/src/handlers/redis-stack.ts | 75 ++++++------- .../src/handlers/redis-strings.ts | 104 +++++++----------- .../helpers/create-redis-timeout-config.ts | 31 ------ packages/cache-handler/src/helpers/helpers.ts | 1 - .../cache-handler/src/use-cache/node-redis.ts | 11 +- .../utils/compose-age-estimation-fn.test.ts | 2 +- pnpm-lock.yaml | 95 +++++++--------- 11 files changed, 178 insertions(+), 252 deletions(-) delete mode 100644 packages/cache-handler/src/helpers/create-redis-timeout-config.ts diff --git a/apps/cache-testing/package.json b/apps/cache-testing/package.json index 6509c10c..12533139 100644 --- a/apps/cache-testing/package.json +++ b/apps/cache-testing/package.json @@ -21,7 +21,7 @@ "next": "15.3.2", "react": "19.1.0", "react-dom": "19.1.0", - "redis": "4.7.0" + "redis": "5.0.1" }, "devDependencies": { "@playwright/test": "1.52.0", diff --git a/internal/eslint-config/vitest.js b/internal/eslint-config/vitest.js index 9e4f2f07..a97c4119 100644 --- a/internal/eslint-config/vitest.js +++ b/internal/eslint-config/vitest.js @@ -4,6 +4,11 @@ import tseslint from 'typescript-eslint'; export default tseslint.config({ files: ['**/*.test.ts', '**/*.spec.ts'], extends: [vitest.configs.all], + settings: { + vitest: { + typecheck: true, + }, + }, rules: { 'vitest/prefer-expect-assertions': [ 'error', diff --git a/packages/cache-handler/package.json b/packages/cache-handler/package.json index 7e2bfd32..9f02007b 100644 --- a/packages/cache-handler/package.json +++ b/packages/cache-handler/package.json @@ -55,6 +55,6 @@ }, "peerDependencies": { "next": ">= 15 < 16", - "redis": ">= 4.6" + "redis": ">= 5 < 6" } } diff --git a/packages/cache-handler/src/handlers/experimental-redis-cluster.ts b/packages/cache-handler/src/handlers/experimental-redis-cluster.ts index df0c5cce..abceffee 100644 --- a/packages/cache-handler/src/handlers/experimental-redis-cluster.ts +++ b/packages/cache-handler/src/handlers/experimental-redis-cluster.ts @@ -1,6 +1,5 @@ import calculate from 'cluster-key-slot'; import { REVALIDATED_TAGS_KEY } from '../constants.js'; -import { createRedisTimeoutConfig } from '../helpers/create-redis-timeout-config.js'; import { isTagImplicit } from '../helpers/is-tag-implicit.js'; import type { CacheHandlerValue, Handler } from '../cache-handler.js'; import type { CreateRedisStringsHandlerOptions } from '../common-types.js'; @@ -103,10 +102,9 @@ export default function createHandler({ key, { implicitTags }, ): Promise { - const result = await cluster.get( - createRedisTimeoutConfig(timeoutMs), - keyPrefix + key, - ); + const result = await cluster + .withCommandOptions({ abortSignal: AbortSignal.timeout(timeoutMs) }) + .get(keyPrefix + key); if (!result) { return null; @@ -124,21 +122,18 @@ export default function createHandler({ return cacheValue; } - const revalidationTimes = await cluster.hmGet( - createRedisTimeoutConfig(timeoutMs), - revalidatedTagsKey, - Array.from(combinedTags), - ); + const revalidationTimes = await cluster + .withCommandOptions({ abortSignal: AbortSignal.timeout(timeoutMs) }) + .hmGet(revalidatedTagsKey, Array.from(combinedTags)); for (const timeString of revalidationTimes) { if ( timeString && Number.parseInt(timeString, 10) > cacheValue.lastModified ) { - await cluster.unlink( - createRedisTimeoutConfig(timeoutMs), - keyPrefix + key, - ); + await cluster + .withCommandOptions({ abortSignal: AbortSignal.timeout(timeoutMs) }) + .unlink(keyPrefix + key); return null; } @@ -147,16 +142,17 @@ export default function createHandler({ return cacheValue; }, async set(key, cacheHandlerValue): Promise { - const options = createRedisTimeoutConfig(timeoutMs); + const options = { + abortSignal: AbortSignal.timeout(timeoutMs), + }; let setOperation: Promise; - let expireOperation: Promise | undefined; + let expireOperation: Promise | undefined; switch (keyExpirationStrategy) { case 'EXAT': { - setOperation = cluster.set( - options, + setOperation = cluster.withCommandOptions(options).set( keyPrefix + key, JSON.stringify(cacheHandlerValue), typeof cacheHandlerValue.lifespan?.expireAt === 'number' @@ -168,18 +164,20 @@ export default function createHandler({ break; } case 'EXPIREAT': { - setOperation = cluster.set( - options, + setOperation = cluster.withCommandOptions(options).set( keyPrefix + key, JSON.stringify(cacheHandlerValue), + typeof cacheHandlerValue.lifespan?.expireAt === 'number' + ? { + EXAT: cacheHandlerValue.lifespan.expireAt, + } + : undefined, ); expireOperation = cacheHandlerValue.lifespan - ? cluster.expireAt( - options, - keyPrefix + key, - cacheHandlerValue.lifespan.expireAt, - ) + ? cluster + .withCommandOptions(options) + .expireAt(keyPrefix + key, cacheHandlerValue.lifespan.expireAt) : undefined; break; } @@ -192,12 +190,13 @@ export default function createHandler({ const setTagsOperation = cacheHandlerValue.tags.length > 0 - ? cluster.hSet( - options, - keyPrefix + sharedTagsKey, - key, - JSON.stringify(cacheHandlerValue.tags), - ) + ? cluster + .withCommandOptions(options) + .hSet( + keyPrefix + sharedTagsKey, + key, + JSON.stringify(cacheHandlerValue.tags), + ) : undefined; await Promise.all([setOperation, expireOperation, setTagsOperation]); @@ -206,34 +205,28 @@ export default function createHandler({ // If the tag is an implicit tag, we need to mark it as revalidated. // The revalidation process is done by the CacheHandler class on the next get operation. if (isTagImplicit(tag)) { - await cluster.hSet( - createRedisTimeoutConfig(timeoutMs), - revalidatedTagsKey, - tag, - Date.now(), - ); + await cluster + .withCommandOptions({ abortSignal: AbortSignal.timeout(timeoutMs) }) + .hSet(revalidatedTagsKey, tag, Date.now()); } const tagsMap: Map = new Map(); - let cursor = 0; + let cursor = '0'; const hScanOptions = { COUNT: revalidateTagQuerySize }; do { - const remoteTagsPortion = await cluster.hScan( - createRedisTimeoutConfig(timeoutMs), - keyPrefix + sharedTagsKey, - cursor, - hScanOptions, - ); + const remoteTagsPortion = await cluster + .withCommandOptions({ abortSignal: AbortSignal.timeout(timeoutMs) }) + .hScan(keyPrefix + sharedTagsKey, cursor, hScanOptions); - for (const { field, value } of remoteTagsPortion.tuples) { + for (const { field, value } of remoteTagsPortion.entries) { tagsMap.set(field, JSON.parse(value) as string[]); } cursor = remoteTagsPortion.cursor; - } while (cursor !== 0); + } while (cursor !== '0'); const keysToDelete: string[] = []; @@ -256,27 +249,28 @@ export default function createHandler({ for (const [slot, keys] of slotKeysMap) { const targetMasterNode = cluster.slots[slot]?.master; - const client = await targetMasterNode?.client; + + const client = targetMasterNode?.client; if (keys.length === 0 || !client) { continue; } unlinkPromises.push( - client.unlink(createRedisTimeoutConfig(timeoutMs), keys), + client.withAbortSignal(AbortSignal.timeout(timeoutMs)).unlink(keys), ); } - const updateTagsOperation = cluster.hDel( - { isolated: true, ...createRedisTimeoutConfig(timeoutMs) }, - keyPrefix + sharedTagsKey, - tagsToDelete, - ); + const updateTagsOperation = cluster + .withCommandOptions({ abortSignal: AbortSignal.timeout(timeoutMs) }) + .hDel(keyPrefix + sharedTagsKey, tagsToDelete); await Promise.allSettled([...unlinkPromises, updateTagsOperation]); }, async delete(key): Promise { - await cluster.unlink(createRedisTimeoutConfig(timeoutMs), key); + await cluster + .withCommandOptions({ abortSignal: AbortSignal.timeout(timeoutMs) }) + .unlink(key); }, }; } diff --git a/packages/cache-handler/src/handlers/redis-stack.ts b/packages/cache-handler/src/handlers/redis-stack.ts index ce1fd6a1..45785383 100644 --- a/packages/cache-handler/src/handlers/redis-stack.ts +++ b/packages/cache-handler/src/handlers/redis-stack.ts @@ -1,7 +1,6 @@ import { randomBytes } from 'node:crypto'; -import { ErrorReply, SchemaFieldTypes } from 'redis'; +import { ErrorReply, SCHEMA_FIELD_TYPE } from 'redis'; import { REVALIDATED_TAGS_KEY, TIME_ONE_YEAR } from '../constants.js'; -import { createRedisTimeoutConfig } from '../helpers/create-redis-timeout-config.js'; import { isTagImplicit } from '../helpers/is-tag-implicit.js'; import type { CacheHandlerValue, Handler } from '../cache-handler.js'; import type { @@ -11,6 +10,11 @@ import type { export type { CreateRedisStackHandlerOptions }; +type SearchNoContentReply = { + total: number; + documents: string[]; +}; + /** * Creates a Handler for handling cache operations using Redis JSON. * @@ -85,7 +89,7 @@ export default function createHandler({ await client.ft.create( indexName, { - '$.tags': { type: SchemaFieldTypes.TEXT, AS: 'tag' }, + '$.tags': { type: SCHEMA_FIELD_TYPE.TEXT, AS: 'tag' }, }, { ON: 'JSON', @@ -114,10 +118,9 @@ export default function createHandler({ ): Promise { assertClientIsReady(); - const cacheValue = (await client.json.get( - createRedisTimeoutConfig(timeoutMs), - keyPrefix + key, - )) as CacheHandlerValue | null; + const cacheValue = (await client + .withAbortSignal(AbortSignal.timeout(timeoutMs)) + .json.get(keyPrefix + key)) as CacheHandlerValue | null; if (!cacheValue) { return null; @@ -134,21 +137,18 @@ export default function createHandler({ return cacheValue; } - const revalidationTimes = await client.hmGet( - createRedisTimeoutConfig(timeoutMs), - revalidatedTagsKey, - Array.from(combinedTags), - ); + const revalidationTimes = await client + .withAbortSignal(AbortSignal.timeout(timeoutMs)) + .hmGet(revalidatedTagsKey, Array.from(combinedTags)); for (const timeString of revalidationTimes) { if ( timeString && Number.parseInt(timeString, 10) > cacheValue.lastModified ) { - await client.unlink( - createRedisTimeoutConfig(timeoutMs), - keyPrefix + key, - ); + await client + .withAbortSignal(AbortSignal.timeout(timeoutMs)) + .unlink(keyPrefix + key); return null; } @@ -161,21 +161,20 @@ export default function createHandler({ cacheHandlerValue.tags = cacheHandlerValue.tags.map(sanitizeTag); - const options = createRedisTimeoutConfig(timeoutMs); + const signal = AbortSignal.timeout(timeoutMs); - const setCacheValue = client.json.set( - options, - keyPrefix + key, - '.', - cacheHandlerValue as unknown as RedisJSON, - ); + const setCacheValue = client + .withAbortSignal(signal) + .json.set( + keyPrefix + key, + '.', + cacheHandlerValue as unknown as RedisJSON, + ); const expireCacheValue = cacheHandlerValue.lifespan - ? client.expireAt( - options, - keyPrefix + key, - cacheHandlerValue.lifespan.expireAt, - ) + ? client + .withAbortSignal(signal) + .expireAt(keyPrefix + key, cacheHandlerValue.lifespan.expireAt) : undefined; await Promise.all([setCacheValue, expireCacheValue]); @@ -190,12 +189,9 @@ export default function createHandler({ // If the tag is an implicit tag, we need to mark it as revalidated. // The revalidation process is done by the CacheHandler class on the next get operation. if (isTagImplicit(tag)) { - await client.hSet( - createRedisTimeoutConfig(timeoutMs), - revalidatedTagsKey, - sanitizedTag, - Date.now(), - ); + await client + .withAbortSignal(AbortSignal.timeout(timeoutMs)) + .hSet(revalidatedTagsKey, sanitizedTag, Date.now()); } let from = 0; @@ -203,15 +199,14 @@ export default function createHandler({ const keysToDelete: string[] = []; while (true) { - const { documents: documentIds } = await client.ft.searchNoContent( - createRedisTimeoutConfig(timeoutMs), + const { documents: documentIds } = (await client.ft.searchNoContent( indexName, `@tag:(${sanitizedTag})`, { LIMIT: { from, size: revalidateTagQuerySize }, TIMEOUT: timeoutMs, }, - ); + )) as SearchNoContentReply; for (const id of documentIds) { keysToDelete.push(id); @@ -228,12 +223,12 @@ export default function createHandler({ return; } - const options = createRedisTimeoutConfig(timeoutMs); + const signal = AbortSignal.timeout(timeoutMs); - await client.unlink(options, keysToDelete); + await client.withAbortSignal(signal).unlink(keysToDelete); }, async delete(key): Promise { - await client.unlink(createRedisTimeoutConfig(timeoutMs), key); + await client.withAbortSignal(AbortSignal.timeout(timeoutMs)).unlink(key); }, }; } diff --git a/packages/cache-handler/src/handlers/redis-strings.ts b/packages/cache-handler/src/handlers/redis-strings.ts index d04a9618..8eb23052 100644 --- a/packages/cache-handler/src/handlers/redis-strings.ts +++ b/packages/cache-handler/src/handlers/redis-strings.ts @@ -1,6 +1,5 @@ import superjson from 'superjson'; import { REVALIDATED_TAGS_KEY } from '../constants.js'; -import { createRedisTimeoutConfig } from '../helpers/create-redis-timeout-config.js'; import { isTagImplicit } from '../helpers/is-tag-implicit.js'; import type { CacheHandlerValue, Handler } from '../cache-handler.js'; import type { CreateRedisStringsHandlerOptions } from '../common-types.js'; @@ -77,10 +76,9 @@ export default function createHandler({ ): Promise { assertClientIsReady(); - const result = await client.get( - createRedisTimeoutConfig(timeoutMs), - keyPrefix + key, - ); + const result = await client + .withAbortSignal(AbortSignal.timeout(timeoutMs)) + .get(keyPrefix + key); if (!result) { return null; @@ -98,21 +96,18 @@ export default function createHandler({ return cacheValue; } - const revalidationTimes = await client.hmGet( - createRedisTimeoutConfig(timeoutMs), - revalidatedTagsKey, - Array.from(combinedTags), - ); + const revalidationTimes = await client + .withAbortSignal(AbortSignal.timeout(timeoutMs)) + .hmGet(revalidatedTagsKey, Array.from(combinedTags)); for (const timeString of revalidationTimes) { if ( timeString && Number.parseInt(timeString, 10) > cacheValue.lastModified ) { - await client.unlink( - createRedisTimeoutConfig(timeoutMs), - keyPrefix + key, - ); + await client + .withAbortSignal(AbortSignal.timeout(timeoutMs)) + .unlink(keyPrefix + key); return null; } @@ -123,16 +118,15 @@ export default function createHandler({ async set(key, cacheHandlerValue): Promise { assertClientIsReady(); - const options = createRedisTimeoutConfig(timeoutMs); + const signal = AbortSignal.timeout(timeoutMs); let setOperation: Promise; - let expireOperation: Promise | undefined; + let expireOperation: Promise | undefined; switch (keyExpirationStrategy) { case 'EXAT': { - setOperation = client.set( - options, + setOperation = client.withAbortSignal(signal).set( keyPrefix + key, superjson.stringify(cacheHandlerValue), typeof cacheHandlerValue.lifespan?.expireAt === 'number' @@ -144,18 +138,14 @@ export default function createHandler({ break; } case 'EXPIREAT': { - setOperation = client.set( - options, - keyPrefix + key, - superjson.stringify(cacheHandlerValue), - ); + setOperation = client + .withAbortSignal(signal) + .set(keyPrefix + key, superjson.stringify(cacheHandlerValue)); expireOperation = cacheHandlerValue.lifespan - ? client.expireAt( - options, - keyPrefix + key, - cacheHandlerValue.lifespan.expireAt, - ) + ? client + .withAbortSignal(signal) + .expireAt(keyPrefix + key, cacheHandlerValue.lifespan.expireAt) : undefined; break; } @@ -168,12 +158,13 @@ export default function createHandler({ const setTagsOperation = cacheHandlerValue.tags.length > 0 - ? client.hSet( - options, - keyPrefix + sharedTagsKey, - key, - superjson.stringify(cacheHandlerValue.tags), - ) + ? client + .withAbortSignal(signal) + .hSet( + keyPrefix + sharedTagsKey, + key, + superjson.stringify(cacheHandlerValue.tags), + ) : undefined; await Promise.all([setOperation, expireOperation, setTagsOperation]); @@ -184,34 +175,22 @@ export default function createHandler({ // If the tag is an implicit tag, we need to mark it as revalidated. // The revalidation process is done by the CacheHandler class on the next get operation. if (isTagImplicit(tag)) { - await client.hSet( - createRedisTimeoutConfig(timeoutMs), - revalidatedTagsKey, - tag, - Date.now(), - ); + await client + .withAbortSignal(AbortSignal.timeout(timeoutMs)) + .hSet(revalidatedTagsKey, tag, Date.now()); } const tagsMap: Map = new Map(); - let cursor = 0; - const hScanOptions = { COUNT: revalidateTagQuerySize }; - do { - const remoteTagsPortion = await client.hScan( - createRedisTimeoutConfig(timeoutMs), - keyPrefix + sharedTagsKey, - cursor, - hScanOptions, - ); - - for (const { field, value } of remoteTagsPortion.tuples) { + for await (const entries of client + .withAbortSignal(AbortSignal.timeout(timeoutMs)) + .hScanIterator(keyPrefix + sharedTagsKey, hScanOptions)) { + for (const { field, value } of entries) { tagsMap.set(field, superjson.parse(value)); } - - cursor = remoteTagsPortion.cursor; - } while (cursor !== 0); + } const keysToDelete: string[] = []; @@ -228,21 +207,18 @@ export default function createHandler({ return; } - const deleteKeysOperation = client.unlink( - createRedisTimeoutConfig(timeoutMs), - keysToDelete, - ); + const deleteKeysOperation = client + .withAbortSignal(AbortSignal.timeout(timeoutMs)) + .unlink(keysToDelete); - const updateTagsOperation = client.hDel( - { isolated: true, ...createRedisTimeoutConfig(timeoutMs) }, - keyPrefix + sharedTagsKey, - tagsToDelete, - ); + const updateTagsOperation = client + .withAbortSignal(AbortSignal.timeout(timeoutMs)) + .hDel(keyPrefix + sharedTagsKey, tagsToDelete); await Promise.all([deleteKeysOperation, updateTagsOperation]); }, async delete(key): Promise { - await client.unlink(createRedisTimeoutConfig(timeoutMs), key); + await client.withAbortSignal(AbortSignal.timeout(timeoutMs)).unlink(key); }, }; } diff --git a/packages/cache-handler/src/helpers/create-redis-timeout-config.ts b/packages/cache-handler/src/helpers/create-redis-timeout-config.ts deleted file mode 100644 index f2c1eeff..00000000 --- a/packages/cache-handler/src/helpers/create-redis-timeout-config.ts +++ /dev/null @@ -1,31 +0,0 @@ -import { commandOptions } from 'redis'; - -type CommandOptions = ReturnType; - -/** - * Creates Redis command options with an optional timeout. - * - * This function generates command options for Redis operations with an abort signal - * that will automatically timeout after the specified duration. If timeoutMs is set to 0, - * no timeout will be applied. - * - * @param timeoutMs - The timeout duration in milliseconds. If set to 0, no timeout will be applied. - * - * @returns Redis command options with the specified timeout configuration. - * - * @example - * ```ts - * // Create command options with a 5-second timeout - * const options = createRedisTimeoutConfig(5000); - * - * // Use the options in a Redis command - * await client.get(options, 'myKey'); - * ``` - */ -export function createRedisTimeoutConfig(timeoutMs: number): CommandOptions { - if (timeoutMs === 0) { - return commandOptions({}); - } - - return commandOptions({ signal: AbortSignal.timeout(timeoutMs) }); -} diff --git a/packages/cache-handler/src/helpers/helpers.ts b/packages/cache-handler/src/helpers/helpers.ts index 90baae5c..fdfd0c8f 100644 --- a/packages/cache-handler/src/helpers/helpers.ts +++ b/packages/cache-handler/src/helpers/helpers.ts @@ -1,2 +1 @@ export { isTagImplicit } from './is-tag-implicit.js'; -export { createRedisTimeoutConfig } from './create-redis-timeout-config.js'; diff --git a/packages/cache-handler/src/use-cache/node-redis.ts b/packages/cache-handler/src/use-cache/node-redis.ts index 81c2e837..a107cfae 100644 --- a/packages/cache-handler/src/use-cache/node-redis.ts +++ b/packages/cache-handler/src/use-cache/node-redis.ts @@ -1,6 +1,5 @@ import { randomUUID } from 'node:crypto'; import { tagsManifest } from 'next/dist/server/lib/incremental-cache/tags-manifest.external.js'; -import { createRedisTimeoutConfig } from '../helpers/create-redis-timeout-config.js'; import { createCacheHandler } from '../use-cache-cache.js'; import type { CacheHandlerV2, RemoteStore } from '../use-cache-cache.js'; import type { createClient } from 'redis'; @@ -58,23 +57,25 @@ function createRedisStore>({ return; } - const options = createRedisTimeoutConfig(timeoutMs); + const signal = AbortSignal.timeout(timeoutMs); - return (await client.get(options, getKey(key))) ?? undefined; + return ( + (await client.withAbortSignal(signal).get(getKey(key))) ?? undefined + ); }, async set(key, value, { expire, timestamp, stale }): Promise { if (!client.isReady) { return; } - const options = createRedisTimeoutConfig(timeoutMs); + const signal = AbortSignal.timeout(timeoutMs); const expireAt = expireTrigger === 'stale' ? Math.floor(timestamp / 1000 + Math.min(expire, stale)) : Math.floor(timestamp / 1000 + expire); - await client.set(options, getKey(key), value, { + await client.withAbortSignal(signal).set(getKey(key), value, { EXAT: expireAt, }); }, diff --git a/packages/cache-handler/test/utils/compose-age-estimation-fn.test.ts b/packages/cache-handler/test/utils/compose-age-estimation-fn.test.ts index e83f838d..96e81787 100644 --- a/packages/cache-handler/test/utils/compose-age-estimation-fn.test.ts +++ b/packages/cache-handler/test/utils/compose-age-estimation-fn.test.ts @@ -5,7 +5,7 @@ import { getInitialExpireAge, } from '../../src/utils/compose-age-estimation-fn.js'; -describe('composeAgeEstimationFn', () => { +describe(composeAgeEstimationFn, () => { describe('valid inputs', () => { it('returns the same age for simple callback', () => { expect.hasAssertions(); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 63b3ee3d..0912cc09 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -42,8 +42,8 @@ importers: specifier: 19.1.0 version: 19.1.0(react@19.1.0) redis: - specifier: 4.7.0 - version: 4.7.0 + specifier: 5.0.1 + version: 5.0.1 devDependencies: '@playwright/test': specifier: 1.52.0 @@ -221,8 +221,8 @@ importers: specifier: ^11.0.2 version: 11.1.0 redis: - specifier: '>= 4.6' - version: 4.7.0 + specifier: '>= 5 < 6' + version: 5.0.1 superjson: specifier: ^2.2.2 version: 2.2.2 @@ -1024,34 +1024,33 @@ packages: peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - '@redis/bloom@1.2.0': - resolution: {integrity: sha512-HG2DFjYKbpNmVXsa0keLHp/3leGJz1mjh09f2RLGGLQZzSHpkmZWuwJbAvo3QcRY8p80m5+ZdXZdYOSBLlp7Cg==} + '@redis/bloom@5.0.1': + resolution: {integrity: sha512-F7L+rnuJvq/upKaVoEgsf8VT7g5pLQYWRqSUOV3uO4vpVtARzSKJ7CLyJjVsQS+wZVCGxsLMh8DwAIDcny1B+g==} + engines: {node: '>= 18'} peerDependencies: - '@redis/client': ^1.0.0 - - '@redis/client@1.6.0': - resolution: {integrity: sha512-aR0uffYI700OEEH4gYnitAnv3vzVGXCFvYfdpu/CJKvk4pHfLPEy/JSZyrpQ+15WhXe1yJRXLtfQ84s4mEXnPg==} - engines: {node: '>=14'} + '@redis/client': ^5.0.1 - '@redis/graph@1.1.1': - resolution: {integrity: sha512-FEMTcTHZozZciLRl6GiiIB4zGm5z5F3F6a6FZCyrfxdKOhFlGkiAqlexWMBzCi4DcRoyiOsuLfW+cjlGWyExOw==} - peerDependencies: - '@redis/client': ^1.0.0 + '@redis/client@5.0.1': + resolution: {integrity: sha512-k0EJvlMGEyBqUD3orKe0UMZ66fPtfwqPIr+ZSd853sXj2EyhNtPXSx+J6sENXJNgAlEBhvD+57Dwt0qTisKB0A==} + engines: {node: '>= 18'} - '@redis/json@1.0.7': - resolution: {integrity: sha512-6UyXfjVaTBTJtKNG4/9Z8PSpKE6XgSyEb8iwaqDcy+uKrd/DGYHTWkUdnQDyzm727V7p21WUMhsqz5oy65kPcQ==} + '@redis/json@5.0.1': + resolution: {integrity: sha512-t94HOTk5myfhvaHZzlUzk2hoUvH2jsjftcnMgJWuHL/pzjAJQoZDCUJzjkoXIUjWXuyJixTguaaDyOZWwqH2Kg==} + engines: {node: '>= 18'} peerDependencies: - '@redis/client': ^1.0.0 + '@redis/client': ^5.0.1 - '@redis/search@1.2.0': - resolution: {integrity: sha512-tYoDBbtqOVigEDMAcTGsRlMycIIjwMCgD8eR2t0NANeQmgK/lvxNAvYyb6bZDD4frHRhIHkJu2TBRvB0ERkOmw==} + '@redis/search@5.0.1': + resolution: {integrity: sha512-wipK6ZptY7K68B7YLVhP5I/wYCDUU+mDJMyJiUcQLuOs7/eKOBc8lTXKUSssor8QnzZSPy4A5ulcC5PZY22Zgw==} + engines: {node: '>= 18'} peerDependencies: - '@redis/client': ^1.0.0 + '@redis/client': ^5.0.1 - '@redis/time-series@1.1.0': - resolution: {integrity: sha512-c1Q99M5ljsIuc4YdaCwfUEXsofakb9c8+Zse2qxTadu8TalLXuAESzLvFAvNVbkmSlvlzIQOLpBCmWI9wTOt+g==} + '@redis/time-series@5.0.1': + resolution: {integrity: sha512-k6PgbrakhnohsEWEAdQZYt3e5vSKoIzpKvgQt8//lnWLrTZx+c3ed2sj0+pKIF4FvnSeuXLo4bBWcH0Z7Urg1A==} + engines: {node: '>= 18'} peerDependencies: - '@redis/client': ^1.0.0 + '@redis/client': ^5.0.1 '@rollup/rollup-android-arm-eabi@4.40.2': resolution: {integrity: sha512-JkdNEq+DFxZfUwxvB58tHMHBHVgX23ew41g1OQinthJ+ryhdRk67O31S7sYw8u2lTjHUPFxwar07BBt1KHp/hg==} @@ -2821,10 +2820,6 @@ packages: functions-have-names@1.2.3: resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} - generic-pool@3.9.0: - resolution: {integrity: sha512-hymDOu5B53XvN4QT9dBmZxPX4CWhBPPLguTZ9MMFeFa/Kg0xWVfylOVNlJji/E7yTZWFd/q9GO5TxDLq156D7g==} - engines: {node: '>= 4'} - get-intrinsic@1.3.0: resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} engines: {node: '>= 0.4'} @@ -4297,8 +4292,9 @@ packages: recma-stringify@1.0.0: resolution: {integrity: sha512-cjwII1MdIIVloKvC9ErQ+OgAtwHBmcZ0Bg4ciz78FtbT8In39aAYbaA7zvxQ61xVMSPE8WxhLwLbhif4Js2C+g==} - redis@4.7.0: - resolution: {integrity: sha512-zvmkHEAdGMn+hMRXuMBtu4Vo5P6rHQjLoHftu+lBqq8ZTA3RCVC/WzD790bkKKiNFp7d5/9PcSD19fJyyRvOdQ==} + redis@5.0.1: + resolution: {integrity: sha512-J8nqUjrfSq0E8NQkcHDZ4HdEQk5RMYjP3jZq02PE+ERiRxolbDNxPaTT4xh6tdrme+lJ86Goje9yMt9uzh23hQ==} + engines: {node: '>= 18'} reflect.getprototypeof@1.0.10: resolution: {integrity: sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==} @@ -6176,31 +6172,25 @@ snapshots: dependencies: react: 19.1.0 - '@redis/bloom@1.2.0(@redis/client@1.6.0)': + '@redis/bloom@5.0.1(@redis/client@5.0.1)': dependencies: - '@redis/client': 1.6.0 + '@redis/client': 5.0.1 - '@redis/client@1.6.0': + '@redis/client@5.0.1': dependencies: cluster-key-slot: 1.1.2 - generic-pool: 3.9.0 - yallist: 4.0.0 - '@redis/graph@1.1.1(@redis/client@1.6.0)': + '@redis/json@5.0.1(@redis/client@5.0.1)': dependencies: - '@redis/client': 1.6.0 + '@redis/client': 5.0.1 - '@redis/json@1.0.7(@redis/client@1.6.0)': + '@redis/search@5.0.1(@redis/client@5.0.1)': dependencies: - '@redis/client': 1.6.0 + '@redis/client': 5.0.1 - '@redis/search@1.2.0(@redis/client@1.6.0)': + '@redis/time-series@5.0.1(@redis/client@5.0.1)': dependencies: - '@redis/client': 1.6.0 - - '@redis/time-series@1.1.0(@redis/client@1.6.0)': - dependencies: - '@redis/client': 1.6.0 + '@redis/client': 5.0.1 '@rollup/rollup-android-arm-eabi@4.40.2': optional: true @@ -8227,8 +8217,6 @@ snapshots: functions-have-names@1.2.3: {} - generic-pool@3.9.0: {} - get-intrinsic@1.3.0: dependencies: call-bind-apply-helpers: 1.0.2 @@ -10211,14 +10199,13 @@ snapshots: unified: 11.0.5 vfile: 6.0.3 - redis@4.7.0: + redis@5.0.1: dependencies: - '@redis/bloom': 1.2.0(@redis/client@1.6.0) - '@redis/client': 1.6.0 - '@redis/graph': 1.1.1(@redis/client@1.6.0) - '@redis/json': 1.0.7(@redis/client@1.6.0) - '@redis/search': 1.2.0(@redis/client@1.6.0) - '@redis/time-series': 1.1.0(@redis/client@1.6.0) + '@redis/bloom': 5.0.1(@redis/client@5.0.1) + '@redis/client': 5.0.1 + '@redis/json': 5.0.1(@redis/client@5.0.1) + '@redis/search': 5.0.1(@redis/client@5.0.1) + '@redis/time-series': 5.0.1(@redis/client@5.0.1) reflect.getprototypeof@1.0.10: dependencies: From 9fdb6a4480b156d7377e35e2e0574f5ad93daa37 Mon Sep 17 00:00:00 2001 From: better-salmon <132773930+better-salmon@users.noreply.github.com> Date: Tue, 20 May 2025 15:58:50 +0300 Subject: [PATCH 16/16] wip --- .../cache-handler-redis-stack.js | 12 +- .../cache-handler-redis-strings.js | 1 + apps/cache-testing/package.json | 22 +- apps/cache-testing/redis.js | 1 + docs/cache-handler-docs/package.json | 10 +- internal/backend/package.json | 8 +- internal/eslint-config/package.json | 26 +- package.json | 10 +- packages/cache-handler/package.json | 10 +- packages/cache-handler/src/common-types.ts | 6 +- packages/cache-handler/src/use-cache-cache.ts | 58 +- .../cache-handler/src/use-cache/node-redis.ts | 14 +- pnpm-lock.yaml | 2792 ++++++++--------- 13 files changed, 1342 insertions(+), 1628 deletions(-) diff --git a/apps/cache-testing/cache-handler-redis-stack.js b/apps/cache-testing/cache-handler-redis-stack.js index 28dee186..e886660c 100644 --- a/apps/cache-testing/cache-handler-redis-stack.js +++ b/apps/cache-testing/cache-handler-redis-stack.js @@ -17,6 +17,7 @@ CacheHandler.onCreation(async () => { try { // Create a Redis client. client = createClient({ + RESP: 2, url: process.env.REDIS_URL, name: `cache-handler:${process.env.PORT ?? process.pid}`, }); @@ -45,16 +46,7 @@ CacheHandler.onCreation(async () => { console.warn('Disconnecting the Redis client...'); // Try to disconnect the client to stop it from reconnecting. - client - .disconnect() - .then(() => { - console.info('Redis client disconnected.'); - }) - .catch(() => { - console.warn( - 'Failed to quit the Redis client after failing to connect.', - ); - }); + client.destroy(); } } diff --git a/apps/cache-testing/cache-handler-redis-strings.js b/apps/cache-testing/cache-handler-redis-strings.js index 1ad40915..307dc3c5 100644 --- a/apps/cache-testing/cache-handler-redis-strings.js +++ b/apps/cache-testing/cache-handler-redis-strings.js @@ -15,6 +15,7 @@ CacheHandler.onCreation(async () => { /** @type {import("redis").RedisClientType} */ const client = createClient({ + RESP: 2, url: process.env.REDIS_URL, name: `cache-handler:${PREFIX}${process.env.PORT ?? process.pid}`, }); diff --git a/apps/cache-testing/package.json b/apps/cache-testing/package.json index 12533139..d18d7b2d 100644 --- a/apps/cache-testing/package.json +++ b/apps/cache-testing/package.json @@ -17,24 +17,24 @@ }, "dependencies": { "@neshca/cache-handler": "workspace:*", - "axios": "1.9.0", - "next": "15.3.2", + "axios": "1.10.0", + "next": "15.4.0-canary.61", "react": "19.1.0", "react-dom": "19.1.0", - "redis": "5.0.1" + "redis": "5.5.6" }, "devDependencies": { - "@playwright/test": "1.52.0", + "@playwright/test": "1.53.2", "@repo/eslint-config": "workspace:*", "@repo/typescript-config": "workspace:*", - "@types/node": "22.15.18", - "@types/react": "19.1.4", - "@types/react-dom": "19.1.5", + "@types/node": "24.0.10", + "@types/react": "19.1.8", + "@types/react-dom": "19.1.6", "dotenv-cli": "8.0.0", - "eslint": "9.26.0", - "fastify": "5.3.3", - "pm2": "6.0.6", - "tsx": "4.19.4", + "eslint": "9.30.1", + "fastify": "5.4.0", + "pm2": "6.0.8", + "tsx": "4.20.3", "typescript": "5.8.3" } } diff --git a/apps/cache-testing/redis.js b/apps/cache-testing/redis.js index 3046dcf8..aa282d56 100644 --- a/apps/cache-testing/redis.js +++ b/apps/cache-testing/redis.js @@ -3,6 +3,7 @@ import { createClient } from 'redis'; export default createRedisCacheHandler({ client: createClient({ + RESP: 2, url: process.env.REDIS_URL, }), keyPrefix: 'use-cache-redis:', diff --git a/docs/cache-handler-docs/package.json b/docs/cache-handler-docs/package.json index 32f7577a..40bf53c6 100644 --- a/docs/cache-handler-docs/package.json +++ b/docs/cache-handler-docs/package.json @@ -12,7 +12,7 @@ "start:docs": "serve out" }, "dependencies": { - "next": "15.3.2", + "next": "15.4.0-canary.61", "nextra": "4.2.17", "nextra-theme-docs": "4.2.17", "react": "19.1.0", @@ -21,10 +21,10 @@ "devDependencies": { "@repo/eslint-config": "workspace:*", "@repo/typescript-config": "workspace:*", - "@types/node": "22.15.18", - "@types/react": "19.1.4", - "@types/react-dom": "19.1.5", - "eslint": "9.26.0", + "@types/node": "24.0.10", + "@types/react": "19.1.8", + "@types/react-dom": "19.1.6", + "eslint": "9.30.1", "pagefind": "1.3.0", "serve": "14.2.4", "typescript": "5.8.3" diff --git a/internal/backend/package.json b/internal/backend/package.json index 805025a6..2abcb899 100644 --- a/internal/backend/package.json +++ b/internal/backend/package.json @@ -10,14 +10,14 @@ "start": "tsx ./src/backend.ts" }, "dependencies": { - "fastify": "5.3.3", - "pino": "9.6.0" + "fastify": "5.4.0", + "pino": "9.7.0" }, "devDependencies": { "@repo/typescript-config": "workspace:*", - "@types/node": "22.15.18", + "@types/node": "24.0.10", "pino-pretty": "13.0.0", - "tsx": "4.19.4", + "tsx": "4.20.3", "typescript": "5.8.3" } } diff --git a/internal/eslint-config/package.json b/internal/eslint-config/package.json index 4d0c572d..7e0c5a73 100644 --- a/internal/eslint-config/package.json +++ b/internal/eslint-config/package.json @@ -10,23 +10,23 @@ "./lib": "./lib.js" }, "devDependencies": { - "@eslint/js": "9.26.0", - "@next/eslint-plugin-next": "15.3.2", - "@typescript-eslint/parser": "8.32.1", - "@vitest/eslint-plugin": "1.1.44", - "eslint": "9.26.0", + "@eslint/js": "9.30.1", + "@next/eslint-plugin-next": "15.4.0-canary.61", + "@typescript-eslint/parser": "8.35.1", + "@vitest/eslint-plugin": "1.3.4", + "eslint": "9.30.1", "eslint-config-prettier": "10.1.5", - "eslint-import-resolver-typescript": "4.3.4", - "eslint-plugin-check-file": "3.2.0", - "eslint-plugin-import-x": "4.11.1", - "eslint-plugin-jsdoc": "50.6.17", - "eslint-plugin-mdx": "3.4.1", + "eslint-import-resolver-typescript": "4.4.4", + "eslint-plugin-check-file": "3.3.0", + "eslint-plugin-import-x": "4.16.1", + "eslint-plugin-jsdoc": "51.3.3", + "eslint-plugin-mdx": "3.6.0", "eslint-plugin-only-warn": "1.1.0", "eslint-plugin-react": "7.37.5", "eslint-plugin-react-hooks": "5.2.0", - "eslint-plugin-turbo": "2.5.3", - "globals": "16.1.0", + "eslint-plugin-turbo": "2.5.4", + "globals": "16.3.0", "typescript": "5.8.3", - "typescript-eslint": "8.32.1" + "typescript-eslint": "8.35.1" } } diff --git a/package.json b/package.json index 8c4c884b..2550dc75 100644 --- a/package.json +++ b/package.json @@ -27,13 +27,13 @@ "test": "turbo run test" }, "devDependencies": { - "@changesets/cli": "2.29.4", - "prettier": "3.5.3", - "prettier-plugin-packagejson": "2.5.13", - "turbo": "2.5.3", + "@changesets/cli": "2.29.5", + "prettier": "3.6.2", + "prettier-plugin-packagejson": "2.5.18", + "turbo": "2.5.4", "typescript": "5.8.3" }, - "packageManager": "pnpm@10.11.0+sha512.6540583f41cc5f628eb3d9773ecee802f4f9ef9923cc45b69890fb47991d4b092964694ec3a4f738a420c918a333062c8b925d312f42e4f0c263eb603551f977", + "packageManager": "pnpm@10.12.4+sha512.5ea8b0deed94ed68691c9bad4c955492705c5eeb8a87ef86bc62c74a26b037b08ff9570f108b2e4dbd1dd1a9186fea925e527f141c648e85af45631074680184", "engines": { "node": ">=22.11.0" } diff --git a/packages/cache-handler/package.json b/packages/cache-handler/package.json index 9f02007b..2e687600 100644 --- a/packages/cache-handler/package.json +++ b/packages/cache-handler/package.json @@ -46,12 +46,12 @@ "devDependencies": { "@repo/eslint-config": "workspace:*", "@repo/typescript-config": "workspace:*", - "@types/node": "22.15.18", - "eslint": "9.26.0", - "next": "15.3.2", - "tsx": "4.19.4", + "@types/node": "24.0.10", + "eslint": "9.30.1", + "next": "15.4.0-canary.61", + "tsx": "4.20.3", "typescript": "5.8.3", - "vitest": "3.1.3" + "vitest": "3.2.4" }, "peerDependencies": { "next": ">= 15 < 16", diff --git a/packages/cache-handler/src/common-types.ts b/packages/cache-handler/src/common-types.ts index 2b63fe1e..9a1abb8f 100644 --- a/packages/cache-handler/src/common-types.ts +++ b/packages/cache-handler/src/common-types.ts @@ -1,4 +1,4 @@ -import type { RedisClientType, createClient } from 'redis'; +import type { RedisClientType } from 'redis'; export type RedisJSON = Parameters['2']; @@ -7,9 +7,7 @@ export type RedisJSON = Parameters['2']; * * @since 1.0.0 */ -export type CreateRedisStackHandlerOptions< - T = ReturnType, -> = { +export type CreateRedisStackHandlerOptions = { /** * The Redis client instance. * diff --git a/packages/cache-handler/src/use-cache-cache.ts b/packages/cache-handler/src/use-cache-cache.ts index ae280e3a..026bd9db 100644 --- a/packages/cache-handler/src/use-cache-cache.ts +++ b/packages/cache-handler/src/use-cache-cache.ts @@ -97,44 +97,40 @@ export function createCacheHandler( pendingSets.set(cacheKey, pendingPromise); + const entry = await pendingEntry; + try { - const entry = await pendingEntry; + const chunks: Uint8Array[] = []; - try { - const [value, clonedValue] = entry.value.tee(); - entry.value = value; + const reader = entry.value.getReader(); - const chunks: Uint8Array[] = []; + while (true) { + const readerResult = await reader.read(); - for await (const chunk of clonedValue) { - chunks.push(chunk); + if (readerResult.done) { + break; } - const storageEntry: SerializedCacheEntry = { - expire: entry.expire, - revalidate: entry.revalidate, - stale: entry.stale, - tags: entry.tags, - timestamp: entry.timestamp, - value: Buffer.concat(chunks).toString('base64'), - }; - - const remoteStore = await remoteStorePromise; - - await remoteStore.set(cacheKey, JSON.stringify(storageEntry), { - expire: entry.expire, - revalidate: entry.revalidate, - stale: entry.stale, - timestamp: entry.timestamp, - }); - } catch (_error) { - // - } finally { - resolvePending(); - pendingSets.delete(cacheKey); + chunks.push(readerResult.value); } - } catch (_error) { - // + + const storageEntry: SerializedCacheEntry = { + expire: entry.expire, + revalidate: entry.revalidate, + stale: entry.stale, + tags: entry.tags, + timestamp: entry.timestamp, + value: Buffer.concat(chunks).toString('base64'), + }; + + const remoteStore = await remoteStorePromise; + + await remoteStore.set(cacheKey, JSON.stringify(storageEntry), { + expire: entry.expire, + revalidate: entry.revalidate, + stale: entry.stale, + timestamp: entry.timestamp, + }); } finally { resolvePending(); pendingSets.delete(cacheKey); diff --git a/packages/cache-handler/src/use-cache/node-redis.ts b/packages/cache-handler/src/use-cache/node-redis.ts index a107cfae..b4893a48 100644 --- a/packages/cache-handler/src/use-cache/node-redis.ts +++ b/packages/cache-handler/src/use-cache/node-redis.ts @@ -2,9 +2,9 @@ import { randomUUID } from 'node:crypto'; import { tagsManifest } from 'next/dist/server/lib/incremental-cache/tags-manifest.external.js'; import { createCacheHandler } from '../use-cache-cache.js'; import type { CacheHandlerV2, RemoteStore } from '../use-cache-cache.js'; -import type { createClient } from 'redis'; +import type { RedisClientType } from 'redis'; -export type Config> = { +export type Config = { client: T; pubClient: T; subClientId: string; @@ -40,7 +40,7 @@ type Message = { * * @returns A remote store that uses Redis to store and retrieve cache entries. */ -function createRedisStore>({ +function createRedisStore({ client, pubClient, channel, @@ -114,9 +114,11 @@ function createRedisStore>({ * * @returns A cache handler that uses Redis to store and retrieve cache entries. */ -export function createRedisCacheHandler< - T extends ReturnType, ->({ client, keyPrefix, timeoutMs }: Config): CacheHandlerV2 { +export function createRedisCacheHandler({ + client, + keyPrefix, + timeoutMs, +}: Config): CacheHandlerV2 { const remoteStore = Promise.all([ client.connect(), client.duplicate().connect(), diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 0912cc09..cc0946d2 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -9,17 +9,17 @@ importers: .: devDependencies: '@changesets/cli': - specifier: 2.29.4 - version: 2.29.4 + specifier: 2.29.5 + version: 2.29.5 prettier: - specifier: 3.5.3 - version: 3.5.3 + specifier: 3.6.2 + version: 3.6.2 prettier-plugin-packagejson: - specifier: 2.5.13 - version: 2.5.13(prettier@3.5.3) + specifier: 2.5.18 + version: 2.5.18(prettier@3.6.2) turbo: - specifier: 2.5.3 - version: 2.5.3 + specifier: 2.5.4 + version: 2.5.4 typescript: specifier: 5.8.3 version: 5.8.3 @@ -30,11 +30,11 @@ importers: specifier: workspace:* version: link:../../packages/cache-handler axios: - specifier: 1.9.0 - version: 1.9.0 + specifier: 1.10.0 + version: 1.10.0 next: - specifier: 15.3.2 - version: 15.3.2(@playwright/test@1.52.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + specifier: 15.4.0-canary.61 + version: 15.4.0-canary.61(@playwright/test@1.53.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) react: specifier: 19.1.0 version: 19.1.0 @@ -42,12 +42,12 @@ importers: specifier: 19.1.0 version: 19.1.0(react@19.1.0) redis: - specifier: 5.0.1 - version: 5.0.1 + specifier: 5.5.6 + version: 5.5.6 devDependencies: '@playwright/test': - specifier: 1.52.0 - version: 1.52.0 + specifier: 1.53.2 + version: 1.53.2 '@repo/eslint-config': specifier: workspace:* version: link:../../internal/eslint-config @@ -55,29 +55,29 @@ importers: specifier: workspace:* version: link:../../internal/typescript-config '@types/node': - specifier: 22.15.18 - version: 22.15.18 + specifier: 24.0.10 + version: 24.0.10 '@types/react': - specifier: 19.1.4 - version: 19.1.4 + specifier: 19.1.8 + version: 19.1.8 '@types/react-dom': - specifier: 19.1.5 - version: 19.1.5(@types/react@19.1.4) + specifier: 19.1.6 + version: 19.1.6(@types/react@19.1.8) dotenv-cli: specifier: 8.0.0 version: 8.0.0 eslint: - specifier: 9.26.0 - version: 9.26.0 + specifier: 9.30.1 + version: 9.30.1 fastify: - specifier: 5.3.3 - version: 5.3.3 + specifier: 5.4.0 + version: 5.4.0 pm2: - specifier: 6.0.6 - version: 6.0.6 + specifier: 6.0.8 + version: 6.0.8 tsx: - specifier: 4.19.4 - version: 4.19.4 + specifier: 4.20.3 + version: 4.20.3 typescript: specifier: 5.8.3 version: 5.8.3 @@ -85,14 +85,14 @@ importers: docs/cache-handler-docs: dependencies: next: - specifier: 15.3.2 - version: 15.3.2(@playwright/test@1.52.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + specifier: 15.4.0-canary.61 + version: 15.4.0-canary.61(@playwright/test@1.53.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) nextra: specifier: 4.2.17 - version: 4.2.17(acorn@8.14.1)(next@15.3.2(@playwright/test@1.52.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@5.8.3) + version: 4.2.17(acorn@8.15.0)(next@15.4.0-canary.61(@playwright/test@1.53.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@5.8.3) nextra-theme-docs: specifier: 4.2.17 - version: 4.2.17(@types/react@19.1.4)(next@15.3.2(@playwright/test@1.52.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(nextra@4.2.17(acorn@8.14.1)(next@15.3.2(@playwright/test@1.52.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@5.8.3))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(use-sync-external-store@1.5.0(react@19.1.0)) + version: 4.2.17(@types/react@19.1.8)(next@15.4.0-canary.61(@playwright/test@1.53.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(nextra@4.2.17(acorn@8.15.0)(next@15.4.0-canary.61(@playwright/test@1.53.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@5.8.3))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(use-sync-external-store@1.5.0(react@19.1.0)) react: specifier: 19.1.0 version: 19.1.0 @@ -107,17 +107,17 @@ importers: specifier: workspace:* version: link:../../internal/typescript-config '@types/node': - specifier: 22.15.18 - version: 22.15.18 + specifier: 24.0.10 + version: 24.0.10 '@types/react': - specifier: 19.1.4 - version: 19.1.4 + specifier: 19.1.8 + version: 19.1.8 '@types/react-dom': - specifier: 19.1.5 - version: 19.1.5(@types/react@19.1.4) + specifier: 19.1.6 + version: 19.1.6(@types/react@19.1.8) eslint: - specifier: 9.26.0 - version: 9.26.0 + specifier: 9.30.1 + version: 9.30.1 pagefind: specifier: 1.3.0 version: 1.3.0 @@ -131,24 +131,24 @@ importers: internal/backend: dependencies: fastify: - specifier: 5.3.3 - version: 5.3.3 + specifier: 5.4.0 + version: 5.4.0 pino: - specifier: 9.6.0 - version: 9.6.0 + specifier: 9.7.0 + version: 9.7.0 devDependencies: '@repo/typescript-config': specifier: workspace:* version: link:../typescript-config '@types/node': - specifier: 22.15.18 - version: 22.15.18 + specifier: 24.0.10 + version: 24.0.10 pino-pretty: specifier: 13.0.0 version: 13.0.0 tsx: - specifier: 4.19.4 - version: 4.19.4 + specifier: 4.20.3 + version: 4.20.3 typescript: specifier: 5.8.3 version: 5.8.3 @@ -156,59 +156,59 @@ importers: internal/eslint-config: devDependencies: '@eslint/js': - specifier: 9.26.0 - version: 9.26.0 + specifier: 9.30.1 + version: 9.30.1 '@next/eslint-plugin-next': - specifier: 15.3.2 - version: 15.3.2 + specifier: 15.4.0-canary.61 + version: 15.4.0-canary.61 '@typescript-eslint/parser': - specifier: 8.32.1 - version: 8.32.1(eslint@9.26.0)(typescript@5.8.3) + specifier: 8.35.1 + version: 8.35.1(eslint@9.30.1)(typescript@5.8.3) '@vitest/eslint-plugin': - specifier: 1.1.44 - version: 1.1.44(@typescript-eslint/utils@8.32.1(eslint@9.26.0)(typescript@5.8.3))(eslint@9.26.0)(typescript@5.8.3)(vitest@3.1.3(@types/debug@4.1.12)(@types/node@22.15.18)(tsx@4.19.4)(yaml@2.8.0)) + specifier: 1.3.4 + version: 1.3.4(eslint@9.30.1)(typescript@5.8.3)(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.0.10)(tsx@4.20.3)(yaml@2.8.0)) eslint: - specifier: 9.26.0 - version: 9.26.0 + specifier: 9.30.1 + version: 9.30.1 eslint-config-prettier: specifier: 10.1.5 - version: 10.1.5(eslint@9.26.0) + version: 10.1.5(eslint@9.30.1) eslint-import-resolver-typescript: - specifier: 4.3.4 - version: 4.3.4(eslint-plugin-import-x@4.11.1(eslint@9.26.0)(typescript@5.8.3))(eslint@9.26.0) + specifier: 4.4.4 + version: 4.4.4(eslint-plugin-import-x@4.16.1(@typescript-eslint/utils@8.35.1(eslint@9.30.1)(typescript@5.8.3))(eslint@9.30.1))(eslint@9.30.1) eslint-plugin-check-file: - specifier: 3.2.0 - version: 3.2.0(eslint@9.26.0) + specifier: 3.3.0 + version: 3.3.0(eslint@9.30.1) eslint-plugin-import-x: - specifier: 4.11.1 - version: 4.11.1(eslint@9.26.0)(typescript@5.8.3) + specifier: 4.16.1 + version: 4.16.1(@typescript-eslint/utils@8.35.1(eslint@9.30.1)(typescript@5.8.3))(eslint@9.30.1) eslint-plugin-jsdoc: - specifier: 50.6.17 - version: 50.6.17(eslint@9.26.0) + specifier: 51.3.3 + version: 51.3.3(eslint@9.30.1) eslint-plugin-mdx: - specifier: 3.4.1 - version: 3.4.1(eslint@9.26.0) + specifier: 3.6.0 + version: 3.6.0(eslint@9.30.1) eslint-plugin-only-warn: specifier: 1.1.0 version: 1.1.0 eslint-plugin-react: specifier: 7.37.5 - version: 7.37.5(eslint@9.26.0) + version: 7.37.5(eslint@9.30.1) eslint-plugin-react-hooks: specifier: 5.2.0 - version: 5.2.0(eslint@9.26.0) + version: 5.2.0(eslint@9.30.1) eslint-plugin-turbo: - specifier: 2.5.3 - version: 2.5.3(eslint@9.26.0)(turbo@2.5.3) + specifier: 2.5.4 + version: 2.5.4(eslint@9.30.1)(turbo@2.5.4) globals: - specifier: 16.1.0 - version: 16.1.0 + specifier: 16.3.0 + version: 16.3.0 typescript: specifier: 5.8.3 version: 5.8.3 typescript-eslint: - specifier: 8.32.1 - version: 8.32.1(eslint@9.26.0)(typescript@5.8.3) + specifier: 8.35.1 + version: 8.35.1(eslint@9.30.1)(typescript@5.8.3) internal/typescript-config: {} @@ -222,7 +222,7 @@ importers: version: 11.1.0 redis: specifier: '>= 5 < 6' - version: 5.0.1 + version: 5.5.6 superjson: specifier: ^2.2.2 version: 2.2.2 @@ -234,23 +234,23 @@ importers: specifier: workspace:* version: link:../../internal/typescript-config '@types/node': - specifier: 22.15.18 - version: 22.15.18 + specifier: 24.0.10 + version: 24.0.10 eslint: - specifier: 9.26.0 - version: 9.26.0 + specifier: 9.30.1 + version: 9.30.1 next: - specifier: 15.3.2 - version: 15.3.2(@playwright/test@1.52.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + specifier: 15.4.0-canary.61 + version: 15.4.0-canary.61(@playwright/test@1.53.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) tsx: - specifier: 4.19.4 - version: 4.19.4 + specifier: 4.20.3 + version: 4.20.3 typescript: specifier: 5.8.3 version: 5.8.3 vitest: - specifier: 3.1.3 - version: 3.1.3(@types/debug@4.1.12)(@types/node@22.15.18)(tsx@4.19.4)(yaml@2.8.0) + specifier: 3.2.4 + version: 3.2.4(@types/debug@4.1.12)(@types/node@24.0.10)(tsx@4.20.3)(yaml@2.8.0) packages: @@ -268,8 +268,8 @@ packages: resolution: {integrity: sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==} engines: {node: '>=6.9.0'} - '@babel/runtime@7.27.1': - resolution: {integrity: sha512-1x3D2xEk2fRo3PAhwQwu5UubzgiVWSXTBfWpVd2Mx2AzRqJuDJCsgaDVZ7HB5iGzDW1Hl1sWN2mFyKjmR9uAog==} + '@babel/runtime@7.27.6': + resolution: {integrity: sha512-vbavdySgbTTrmFE+EsiqUTzlOr5bzlnJtUv9PynGCAKvfQqjIXbvFdumPM/GxMDfyuGMJaJAU6TO4zc1Jf1i8Q==} engines: {node: '>=6.9.0'} '@braintree/sanitize-url@7.1.1': @@ -278,14 +278,14 @@ packages: '@changesets/apply-release-plan@7.0.12': resolution: {integrity: sha512-EaET7As5CeuhTzvXTQCRZeBUcisoYPDDcXvgTE/2jmmypKp0RC7LxKj/yzqeh/1qFTZI7oDGFcL1PHRuQuketQ==} - '@changesets/assemble-release-plan@6.0.8': - resolution: {integrity: sha512-y8+8LvZCkKJdbUlpXFuqcavpzJR80PN0OIfn8HZdwK7Sh6MgLXm4hKY5vu6/NDoKp8lAlM4ERZCqRMLxP4m+MQ==} + '@changesets/assemble-release-plan@6.0.9': + resolution: {integrity: sha512-tPgeeqCHIwNo8sypKlS3gOPmsS3wP0zHt67JDuL20P4QcXiw/O4Hl7oXiuLnP9yg+rXLQ2sScdV1Kkzde61iSQ==} '@changesets/changelog-git@0.2.1': resolution: {integrity: sha512-x/xEleCFLH28c3bQeQIyeZf8lFXyDFVn1SgcBiR2Tw/r4IAWlk1fzxCEZ6NxQAjF2Nwtczoen3OA2qR+UawQ8Q==} - '@changesets/cli@2.29.4': - resolution: {integrity: sha512-VW30x9oiFp/un/80+5jLeWgEU6Btj8IqOgI+X/zAYu4usVOWXjPIK5jSSlt5jsCU7/6Z7AxEkarxBxGUqkAmNg==} + '@changesets/cli@2.29.5': + resolution: {integrity: sha512-0j0cPq3fgxt2dPdFsg4XvO+6L66RC0pZybT9F4dG5TBrLA3jA/1pNkdTXH9IBBVHkgsKrNKenI3n1mPyPlIydg==} hasBin: true '@changesets/config@3.1.1': @@ -297,8 +297,8 @@ packages: '@changesets/get-dependents-graph@2.1.3': resolution: {integrity: sha512-gphr+v0mv2I3Oxt19VdWRRUxq3sseyUpX9DaHpTUmLj92Y10AGy+XOtV+kbM6L/fDcpx7/ISDFK6T8A/P3lOdQ==} - '@changesets/get-release-plan@4.0.12': - resolution: {integrity: sha512-KukdEgaafnyGryUwpHG2kZ7xJquOmWWWk5mmoeQaSvZTWH1DC5D/Sw6ClgGFYtQnOMSQhgoEbDxAbpIIayKH1g==} + '@changesets/get-release-plan@4.0.13': + resolution: {integrity: sha512-DWG1pus72FcNeXkM12tx+xtExyH/c9I1z+2aXlObH3i9YA7+WZEVaiHzHl03thpvAgWTRaH64MpfHxozfF7Dvg==} '@changesets/get-version-range-type@0.4.0': resolution: {integrity: sha512-hwawtob9DryoGTpixy1D3ZXbGgJu1Rhr+ySH2PvTLHvkZuQ7sRT4oQwMh0hbqZH1weAooedEjRsbrWcGLCeyVQ==} @@ -354,156 +354,156 @@ packages: '@emnapi/wasi-threads@1.0.2': resolution: {integrity: sha512-5n3nTJblwRi8LlXkJ9eBzu+kZR8Yxcc7ubakyQTFzPMtIhFpUBRbsnc2Dv88IZDIbCDlBiWrknhB4Lsz7mg6BA==} - '@es-joy/jsdoccomment@0.50.1': - resolution: {integrity: sha512-fas3qe1hw38JJgU/0m5sDpcrbZGysBeZcMwW5Ws9brYxY64MJyWLXRZCj18keTycT1LFTrFXdSNMS+GRVaU6Hw==} - engines: {node: '>=18'} + '@es-joy/jsdoccomment@0.52.0': + resolution: {integrity: sha512-BXuN7BII+8AyNtn57euU2Yxo9yA/KUDNzrpXyi3pfqKmBhhysR6ZWOebFh3vyPoqA3/j1SOvGgucElMGwlXing==} + engines: {node: '>=20.11.0'} - '@esbuild/aix-ppc64@0.25.4': - resolution: {integrity: sha512-1VCICWypeQKhVbE9oW/sJaAmjLxhVqacdkvPLEjwlttjfwENRSClS8EjBz0KzRyFSCPDIkuXW34Je/vk7zdB7Q==} + '@esbuild/aix-ppc64@0.25.5': + resolution: {integrity: sha512-9o3TMmpmftaCMepOdA5k/yDw8SfInyzWWTjYTFCX3kPSDJMROQTb8jg+h9Cnwnmm1vOzvxN7gIfB5V2ewpjtGA==} engines: {node: '>=18'} cpu: [ppc64] os: [aix] - '@esbuild/android-arm64@0.25.4': - resolution: {integrity: sha512-bBy69pgfhMGtCnwpC/x5QhfxAz/cBgQ9enbtwjf6V9lnPI/hMyT9iWpR1arm0l3kttTr4L0KSLpKmLp/ilKS9A==} + '@esbuild/android-arm64@0.25.5': + resolution: {integrity: sha512-VGzGhj4lJO+TVGV1v8ntCZWJktV7SGCs3Pn1GRWI1SBFtRALoomm8k5E9Pmwg3HOAal2VDc2F9+PM/rEY6oIDg==} engines: {node: '>=18'} cpu: [arm64] os: [android] - '@esbuild/android-arm@0.25.4': - resolution: {integrity: sha512-QNdQEps7DfFwE3hXiU4BZeOV68HHzYwGd0Nthhd3uCkkEKK7/R6MTgM0P7H7FAs5pU/DIWsviMmEGxEoxIZ+ZQ==} + '@esbuild/android-arm@0.25.5': + resolution: {integrity: sha512-AdJKSPeEHgi7/ZhuIPtcQKr5RQdo6OO2IL87JkianiMYMPbCtot9fxPbrMiBADOWWm3T2si9stAiVsGbTQFkbA==} engines: {node: '>=18'} cpu: [arm] os: [android] - '@esbuild/android-x64@0.25.4': - resolution: {integrity: sha512-TVhdVtQIFuVpIIR282btcGC2oGQoSfZfmBdTip2anCaVYcqWlZXGcdcKIUklfX2wj0JklNYgz39OBqh2cqXvcQ==} + '@esbuild/android-x64@0.25.5': + resolution: {integrity: sha512-D2GyJT1kjvO//drbRT3Hib9XPwQeWd9vZoBJn+bu/lVsOZ13cqNdDeqIF/xQ5/VmWvMduP6AmXvylO/PIc2isw==} engines: {node: '>=18'} cpu: [x64] os: [android] - '@esbuild/darwin-arm64@0.25.4': - resolution: {integrity: sha512-Y1giCfM4nlHDWEfSckMzeWNdQS31BQGs9/rouw6Ub91tkK79aIMTH3q9xHvzH8d0wDru5Ci0kWB8b3up/nl16g==} + '@esbuild/darwin-arm64@0.25.5': + resolution: {integrity: sha512-GtaBgammVvdF7aPIgH2jxMDdivezgFu6iKpmT+48+F8Hhg5J/sfnDieg0aeG/jfSvkYQU2/pceFPDKlqZzwnfQ==} engines: {node: '>=18'} cpu: [arm64] os: [darwin] - '@esbuild/darwin-x64@0.25.4': - resolution: {integrity: sha512-CJsry8ZGM5VFVeyUYB3cdKpd/H69PYez4eJh1W/t38vzutdjEjtP7hB6eLKBoOdxcAlCtEYHzQ/PJ/oU9I4u0A==} + '@esbuild/darwin-x64@0.25.5': + resolution: {integrity: sha512-1iT4FVL0dJ76/q1wd7XDsXrSW+oLoquptvh4CLR4kITDtqi2e/xwXwdCVH8hVHU43wgJdsq7Gxuzcs6Iq/7bxQ==} engines: {node: '>=18'} cpu: [x64] os: [darwin] - '@esbuild/freebsd-arm64@0.25.4': - resolution: {integrity: sha512-yYq+39NlTRzU2XmoPW4l5Ifpl9fqSk0nAJYM/V/WUGPEFfek1epLHJIkTQM6bBs1swApjO5nWgvr843g6TjxuQ==} + '@esbuild/freebsd-arm64@0.25.5': + resolution: {integrity: sha512-nk4tGP3JThz4La38Uy/gzyXtpkPW8zSAmoUhK9xKKXdBCzKODMc2adkB2+8om9BDYugz+uGV7sLmpTYzvmz6Sw==} engines: {node: '>=18'} cpu: [arm64] os: [freebsd] - '@esbuild/freebsd-x64@0.25.4': - resolution: {integrity: sha512-0FgvOJ6UUMflsHSPLzdfDnnBBVoCDtBTVyn/MrWloUNvq/5SFmh13l3dvgRPkDihRxb77Y17MbqbCAa2strMQQ==} + '@esbuild/freebsd-x64@0.25.5': + resolution: {integrity: sha512-PrikaNjiXdR2laW6OIjlbeuCPrPaAl0IwPIaRv+SMV8CiM8i2LqVUHFC1+8eORgWyY7yhQY+2U2fA55mBzReaw==} engines: {node: '>=18'} cpu: [x64] os: [freebsd] - '@esbuild/linux-arm64@0.25.4': - resolution: {integrity: sha512-+89UsQTfXdmjIvZS6nUnOOLoXnkUTB9hR5QAeLrQdzOSWZvNSAXAtcRDHWtqAUtAmv7ZM1WPOOeSxDzzzMogiQ==} + '@esbuild/linux-arm64@0.25.5': + resolution: {integrity: sha512-Z9kfb1v6ZlGbWj8EJk9T6czVEjjq2ntSYLY2cw6pAZl4oKtfgQuS4HOq41M/BcoLPzrUbNd+R4BXFyH//nHxVg==} engines: {node: '>=18'} cpu: [arm64] os: [linux] - '@esbuild/linux-arm@0.25.4': - resolution: {integrity: sha512-kro4c0P85GMfFYqW4TWOpvmF8rFShbWGnrLqlzp4X1TNWjRY3JMYUfDCtOxPKOIY8B0WC8HN51hGP4I4hz4AaQ==} + '@esbuild/linux-arm@0.25.5': + resolution: {integrity: sha512-cPzojwW2okgh7ZlRpcBEtsX7WBuqbLrNXqLU89GxWbNt6uIg78ET82qifUy3W6OVww6ZWobWub5oqZOVtwolfw==} engines: {node: '>=18'} cpu: [arm] os: [linux] - '@esbuild/linux-ia32@0.25.4': - resolution: {integrity: sha512-yTEjoapy8UP3rv8dB0ip3AfMpRbyhSN3+hY8mo/i4QXFeDxmiYbEKp3ZRjBKcOP862Ua4b1PDfwlvbuwY7hIGQ==} + '@esbuild/linux-ia32@0.25.5': + resolution: {integrity: sha512-sQ7l00M8bSv36GLV95BVAdhJ2QsIbCuCjh/uYrWiMQSUuV+LpXwIqhgJDcvMTj+VsQmqAHL2yYaasENvJ7CDKA==} engines: {node: '>=18'} cpu: [ia32] os: [linux] - '@esbuild/linux-loong64@0.25.4': - resolution: {integrity: sha512-NeqqYkrcGzFwi6CGRGNMOjWGGSYOpqwCjS9fvaUlX5s3zwOtn1qwg1s2iE2svBe4Q/YOG1q6875lcAoQK/F4VA==} + '@esbuild/linux-loong64@0.25.5': + resolution: {integrity: sha512-0ur7ae16hDUC4OL5iEnDb0tZHDxYmuQyhKhsPBV8f99f6Z9KQM02g33f93rNH5A30agMS46u2HP6qTdEt6Q1kg==} engines: {node: '>=18'} cpu: [loong64] os: [linux] - '@esbuild/linux-mips64el@0.25.4': - resolution: {integrity: sha512-IcvTlF9dtLrfL/M8WgNI/qJYBENP3ekgsHbYUIzEzq5XJzzVEV/fXY9WFPfEEXmu3ck2qJP8LG/p3Q8f7Zc2Xg==} + '@esbuild/linux-mips64el@0.25.5': + resolution: {integrity: sha512-kB/66P1OsHO5zLz0i6X0RxlQ+3cu0mkxS3TKFvkb5lin6uwZ/ttOkP3Z8lfR9mJOBk14ZwZ9182SIIWFGNmqmg==} engines: {node: '>=18'} cpu: [mips64el] os: [linux] - '@esbuild/linux-ppc64@0.25.4': - resolution: {integrity: sha512-HOy0aLTJTVtoTeGZh4HSXaO6M95qu4k5lJcH4gxv56iaycfz1S8GO/5Jh6X4Y1YiI0h7cRyLi+HixMR+88swag==} + '@esbuild/linux-ppc64@0.25.5': + resolution: {integrity: sha512-UZCmJ7r9X2fe2D6jBmkLBMQetXPXIsZjQJCjgwpVDz+YMcS6oFR27alkgGv3Oqkv07bxdvw7fyB71/olceJhkQ==} engines: {node: '>=18'} cpu: [ppc64] os: [linux] - '@esbuild/linux-riscv64@0.25.4': - resolution: {integrity: sha512-i8JUDAufpz9jOzo4yIShCTcXzS07vEgWzyX3NH2G7LEFVgrLEhjwL3ajFE4fZI3I4ZgiM7JH3GQ7ReObROvSUA==} + '@esbuild/linux-riscv64@0.25.5': + resolution: {integrity: sha512-kTxwu4mLyeOlsVIFPfQo+fQJAV9mh24xL+y+Bm6ej067sYANjyEw1dNHmvoqxJUCMnkBdKpvOn0Ahql6+4VyeA==} engines: {node: '>=18'} cpu: [riscv64] os: [linux] - '@esbuild/linux-s390x@0.25.4': - resolution: {integrity: sha512-jFnu+6UbLlzIjPQpWCNh5QtrcNfMLjgIavnwPQAfoGx4q17ocOU9MsQ2QVvFxwQoWpZT8DvTLooTvmOQXkO51g==} + '@esbuild/linux-s390x@0.25.5': + resolution: {integrity: sha512-K2dSKTKfmdh78uJ3NcWFiqyRrimfdinS5ErLSn3vluHNeHVnBAFWC8a4X5N+7FgVE1EjXS1QDZbpqZBjfrqMTQ==} engines: {node: '>=18'} cpu: [s390x] os: [linux] - '@esbuild/linux-x64@0.25.4': - resolution: {integrity: sha512-6e0cvXwzOnVWJHq+mskP8DNSrKBr1bULBvnFLpc1KY+d+irZSgZ02TGse5FsafKS5jg2e4pbvK6TPXaF/A6+CA==} + '@esbuild/linux-x64@0.25.5': + resolution: {integrity: sha512-uhj8N2obKTE6pSZ+aMUbqq+1nXxNjZIIjCjGLfsWvVpy7gKCOL6rsY1MhRh9zLtUtAI7vpgLMK6DxjO8Qm9lJw==} engines: {node: '>=18'} cpu: [x64] os: [linux] - '@esbuild/netbsd-arm64@0.25.4': - resolution: {integrity: sha512-vUnkBYxZW4hL/ie91hSqaSNjulOnYXE1VSLusnvHg2u3jewJBz3YzB9+oCw8DABeVqZGg94t9tyZFoHma8gWZQ==} + '@esbuild/netbsd-arm64@0.25.5': + resolution: {integrity: sha512-pwHtMP9viAy1oHPvgxtOv+OkduK5ugofNTVDilIzBLpoWAM16r7b/mxBvfpuQDpRQFMfuVr5aLcn4yveGvBZvw==} engines: {node: '>=18'} cpu: [arm64] os: [netbsd] - '@esbuild/netbsd-x64@0.25.4': - resolution: {integrity: sha512-XAg8pIQn5CzhOB8odIcAm42QsOfa98SBeKUdo4xa8OvX8LbMZqEtgeWE9P/Wxt7MlG2QqvjGths+nq48TrUiKw==} + '@esbuild/netbsd-x64@0.25.5': + resolution: {integrity: sha512-WOb5fKrvVTRMfWFNCroYWWklbnXH0Q5rZppjq0vQIdlsQKuw6mdSihwSo4RV/YdQ5UCKKvBy7/0ZZYLBZKIbwQ==} engines: {node: '>=18'} cpu: [x64] os: [netbsd] - '@esbuild/openbsd-arm64@0.25.4': - resolution: {integrity: sha512-Ct2WcFEANlFDtp1nVAXSNBPDxyU+j7+tId//iHXU2f/lN5AmO4zLyhDcpR5Cz1r08mVxzt3Jpyt4PmXQ1O6+7A==} + '@esbuild/openbsd-arm64@0.25.5': + resolution: {integrity: sha512-7A208+uQKgTxHd0G0uqZO8UjK2R0DDb4fDmERtARjSHWxqMTye4Erz4zZafx7Di9Cv+lNHYuncAkiGFySoD+Mw==} engines: {node: '>=18'} cpu: [arm64] os: [openbsd] - '@esbuild/openbsd-x64@0.25.4': - resolution: {integrity: sha512-xAGGhyOQ9Otm1Xu8NT1ifGLnA6M3sJxZ6ixylb+vIUVzvvd6GOALpwQrYrtlPouMqd/vSbgehz6HaVk4+7Afhw==} + '@esbuild/openbsd-x64@0.25.5': + resolution: {integrity: sha512-G4hE405ErTWraiZ8UiSoesH8DaCsMm0Cay4fsFWOOUcz8b8rC6uCvnagr+gnioEjWn0wC+o1/TAHt+It+MpIMg==} engines: {node: '>=18'} cpu: [x64] os: [openbsd] - '@esbuild/sunos-x64@0.25.4': - resolution: {integrity: sha512-Mw+tzy4pp6wZEK0+Lwr76pWLjrtjmJyUB23tHKqEDP74R3q95luY/bXqXZeYl4NYlvwOqoRKlInQialgCKy67Q==} + '@esbuild/sunos-x64@0.25.5': + resolution: {integrity: sha512-l+azKShMy7FxzY0Rj4RCt5VD/q8mG/e+mDivgspo+yL8zW7qEwctQ6YqKX34DTEleFAvCIUviCFX1SDZRSyMQA==} engines: {node: '>=18'} cpu: [x64] os: [sunos] - '@esbuild/win32-arm64@0.25.4': - resolution: {integrity: sha512-AVUP428VQTSddguz9dO9ngb+E5aScyg7nOeJDrF1HPYu555gmza3bDGMPhmVXL8svDSoqPCsCPjb265yG/kLKQ==} + '@esbuild/win32-arm64@0.25.5': + resolution: {integrity: sha512-O2S7SNZzdcFG7eFKgvwUEZ2VG9D/sn/eIiz8XRZ1Q/DO5a3s76Xv0mdBzVM5j5R639lXQmPmSo0iRpHqUUrsxw==} engines: {node: '>=18'} cpu: [arm64] os: [win32] - '@esbuild/win32-ia32@0.25.4': - resolution: {integrity: sha512-i1sW+1i+oWvQzSgfRcxxG2k4I9n3O9NRqy8U+uugaT2Dy7kLO9Y7wI72haOahxceMX8hZAzgGou1FhndRldxRg==} + '@esbuild/win32-ia32@0.25.5': + resolution: {integrity: sha512-onOJ02pqs9h1iMJ1PQphR+VZv8qBMQ77Klcsqv9CNW2w6yLqoURLcgERAIurY6QE63bbLuqgP9ATqajFLK5AMQ==} engines: {node: '>=18'} cpu: [ia32] os: [win32] - '@esbuild/win32-x64@0.25.4': - resolution: {integrity: sha512-nOT2vZNw6hJ+z43oP1SPea/G/6AbN6X+bGNhNuq8NtRHy4wsMhw765IKLNmnjek7GvjWBYQ8Q5VBoYTFg9y1UQ==} + '@esbuild/win32-x64@0.25.5': + resolution: {integrity: sha512-TXv6YnJ8ZMVdX+SXWVBo/0p8LTcrUYngpWjvm91TMjjBQii7Oz11Lw5lbDV5Y0TzuhSJHwiH4hEtC1I42mMS0g==} engines: {node: '>=18'} cpu: [x64] os: [win32] @@ -518,39 +518,43 @@ packages: resolution: {integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - '@eslint/config-array@0.20.0': - resolution: {integrity: sha512-fxlS1kkIjx8+vy2SjuCB94q3htSNrufYTXubwiBFeaQHbH6Ipi43gFJq2zCMt6PHhImH3Xmr0NksKDvchWlpQQ==} + '@eslint/config-array@0.21.0': + resolution: {integrity: sha512-ENIdc4iLu0d93HeYirvKmrzshzofPw6VkZRKQGe9Nv46ZnWUzcF1xV01dcvEg/1wXUR61OmmlSfyeyO7EvjLxQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/config-helpers@0.3.0': + resolution: {integrity: sha512-ViuymvFmcJi04qdZeDc2whTHryouGcDlaxPqarTD0ZE10ISpxGUVZGZDx4w01upyIynL3iu6IXH2bS1NhclQMw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/config-helpers@0.2.2': - resolution: {integrity: sha512-+GPzk8PlG0sPpzdU5ZvIRMPidzAnZDl/s9L+y13iodqvb8leL53bTannOrQ/Im7UkpsmFU5Ily5U60LWixnmLg==} + '@eslint/core@0.14.0': + resolution: {integrity: sha512-qIbV0/JZr7iSDjqAc60IqbLdsj9GDt16xQtWD+B78d/HAlvysGdZZ6rpJHGAc2T0FQx1X6thsSPdnoiGKdNtdg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/core@0.13.0': - resolution: {integrity: sha512-yfkgDw1KR66rkT5A8ci4irzDysN7FRpq3ttJolR88OqQikAWqwA8j5VZyas+vjyBNFIJ7MfybJ9plMILI2UrCw==} + '@eslint/core@0.15.1': + resolution: {integrity: sha512-bkOp+iumZCCbt1K1CmWf0R9pM5yKpDv+ZXtvSyQpudrI9kuFLp+bM2WOPXImuD/ceQuaa8f5pj93Y7zyECIGNA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@eslint/eslintrc@3.3.1': resolution: {integrity: sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/js@9.26.0': - resolution: {integrity: sha512-I9XlJawFdSMvWjDt6wksMCrgns5ggLNfFwFvnShsleWruvXM514Qxk8V246efTw+eo9JABvVz+u3q2RiAowKxQ==} + '@eslint/js@9.30.1': + resolution: {integrity: sha512-zXhuECFlyep42KZUhWjfvsmXGX39W8K8LFb8AWXM9gSV9dQB+MrJGLKvW6Zw0Ggnbpw0VHTtrhFXYe3Gym18jg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@eslint/object-schema@2.1.6': resolution: {integrity: sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/plugin-kit@0.2.8': - resolution: {integrity: sha512-ZAoA40rNMPwSm+AeHpCq8STiNAwzWLJuP8Xv4CHIc9wv/PSuExjMrmjfYNj682vW0OOiZ1HKxzvjQr9XZIisQA==} + '@eslint/plugin-kit@0.3.3': + resolution: {integrity: sha512-1+WqvgNMhmlAambTvT3KPtCl/Ibr68VldY2XY40SL1CE0ZXiakFR/cbTspaF5HsnpDMvcYYoJHfl4980NBjGag==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@fastify/ajv-compiler@4.0.2': resolution: {integrity: sha512-Rkiu/8wIjpsf46Rr+Fitd3HRP+VsxUFDDeag0hs9L0ksfnwx2g7SPQQTFL0E8Qv+rfXzQOxBJnjUB9ITUDjfWQ==} - '@fastify/error@4.1.0': - resolution: {integrity: sha512-KeFcciOr1eo/YvIXHP65S94jfEEqn1RxTRBT1aJaHxY5FK0/GDXYozsQMMWlZoHgi8i0s+YtrLsgj/JkUUjSkQ==} + '@fastify/error@4.2.0': + resolution: {integrity: sha512-RSo3sVDXfHskiBZKBPRgnQTtIqpi/7zhJOEmAxCiBcM7d0uwdGdxLlsCaLzGs8v8NnxIRlfG0N51p5yFaOentQ==} '@fastify/fast-json-stringify-compiler@5.0.3': resolution: {integrity: sha512-uik7yYHkLr6fxd8hJSZ8c+xF4WafPK+XzneQDPU+D10r5X19GW8lJcom2YijX2+qtFF1ENJlHXKFM9ouXNJYgQ==} @@ -564,14 +568,14 @@ packages: '@fastify/proxy-addr@5.0.0': resolution: {integrity: sha512-37qVVA1qZ5sgH7KpHkkC4z9SK6StIsIcOmpjvMPXNb3vx2GQxhZocogVYbr2PbbeLCQxYIPDok307xEvRZOzGA==} - '@floating-ui/core@1.7.0': - resolution: {integrity: sha512-FRdBLykrPPA6P76GGGqlex/e7fbe0F1ykgxHYNXQsH/iTEtjMj/f9bpY5oQqbjt5VgZvgz/uKXbGuROijh3VLA==} + '@floating-ui/core@1.7.2': + resolution: {integrity: sha512-wNB5ooIKHQc+Kui96jE/n69rHFWAVoxn5CAzL1Xdd8FG03cgY3MLO+GF9U3W737fYDSgPWA6MReKhBQBop6Pcw==} - '@floating-ui/dom@1.7.0': - resolution: {integrity: sha512-lGTor4VlXcesUMh1cupTUTDoCxMb0V6bm3CnxHzQcw8Eaf1jQbgQX4i02fYgT0vJ82tb5MZ4CZk1LRGkktJCzg==} + '@floating-ui/dom@1.7.2': + resolution: {integrity: sha512-7cfaOQuCS27HD7DX+6ib2OrnW+b4ZBwDNnCcT0uTyidcmyWb03FnQqJybDBoCnpdxwBSfA94UAYlRCt7mV+TbA==} - '@floating-ui/react-dom@2.1.2': - resolution: {integrity: sha512-06okr5cgPzMNBy+Ycse2A6udMi4bqwW/zgBF/rwjcNqWkyr82Mcg8b0vjX8OJpZFy/FKjJmw6wV7t44kK6kW7A==} + '@floating-ui/react-dom@2.1.4': + resolution: {integrity: sha512-JbbpPhp38UmXDDAu60RJmbeme37Jbgsm7NrHGgzYYFKmblzRUh6Pa641dII6LsjwF4XlScDrde2UAzDo/b9KPw==} peerDependencies: react: '>=16.8.0' react-dom: '>=16.8.0' @@ -582,14 +586,14 @@ packages: react: '>=16.8.0' react-dom: '>=16.8.0' - '@floating-ui/utils@0.2.9': - resolution: {integrity: sha512-MDWhGtE+eHw5JW7lq4qhc5yRLS11ERl1c7Z6Xd0a58DozHES6EnNNwUWbMiG4J9Cgj053Bhk8zvlhFYKVhULwg==} + '@floating-ui/utils@0.2.10': + resolution: {integrity: sha512-aGTxbpbg8/b5JfU1HXSrbH3wXZuLPJcNEcZQFMxLs3oSzgtVu6nFPkbbGGUvBcUjKV2YyB9Wxxabo+HEH9tcRQ==} '@formatjs/intl-localematcher@0.6.1': resolution: {integrity: sha512-ePEgLgVCqi2BBFnTMWPfIghu6FkbZnnBVhO2sSxvLfrdFw7wCHAHiDoM2h4NRgjbaY7+B7HgOLZGkK187pZTZg==} - '@headlessui/react@2.2.3': - resolution: {integrity: sha512-hgOJGXPifPlOczIeSwX8OjLWRJ5XdYApZFf7DeCbCrO1PXHkPhNTRrA9ZwJsgAG7SON1i2JcvIreF/kbgtJeaQ==} + '@headlessui/react@2.2.4': + resolution: {integrity: sha512-lz+OGcAH1dK93rgSMzXmm1qKOJkBUqZf1L4M8TWLNplftQD3IkoEDdUFNfAn4ylsN6WOTVtWaLmvmaHOUk1dTA==} engines: {node: '>=10'} peerDependencies: react: ^18 || ^19 || ^19.0.0-rc @@ -621,14 +625,14 @@ packages: '@iconify/utils@2.3.0': resolution: {integrity: sha512-GmQ78prtwYW6EtzXRU1rY+KwOKfz32PD7iJh6Iyqw68GiKuoZ2A6pRtzWONz5VQJbp50mEjXh/7NkumtrAgRKA==} - '@img/sharp-darwin-arm64@0.34.1': - resolution: {integrity: sha512-pn44xgBtgpEbZsu+lWf2KNb6OAf70X68k+yk69Ic2Xz11zHR/w24/U49XT7AeRwJ0Px+mhALhU5LPci1Aymk7A==} + '@img/sharp-darwin-arm64@0.34.2': + resolution: {integrity: sha512-OfXHZPppddivUJnqyKoi5YVeHRkkNE2zUFT2gbpKxp/JZCFYEYubnMg+gOp6lWfasPrTS+KPosKqdI+ELYVDtg==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm64] os: [darwin] - '@img/sharp-darwin-x64@0.34.1': - resolution: {integrity: sha512-VfuYgG2r8BpYiOUN+BfYeFo69nP/MIwAtSJ7/Zpxc5QF3KS22z8Pvg3FkrSFJBPNQ7mmcUcYQFBmEQp7eu1F8Q==} + '@img/sharp-darwin-x64@0.34.2': + resolution: {integrity: sha512-dYvWqmjU9VxqXmjEtjmvHnGqF8GrVjM2Epj9rJ6BUIXvk8slvNDJbhGFvIoXzkDhrJC2jUxNLz/GUjjvSzfw+g==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [darwin] @@ -678,65 +682,79 @@ packages: cpu: [x64] os: [linux] - '@img/sharp-linux-arm64@0.34.1': - resolution: {integrity: sha512-kX2c+vbvaXC6vly1RDf/IWNXxrlxLNpBVWkdpRq5Ka7OOKj6nr66etKy2IENf6FtOgklkg9ZdGpEu9kwdlcwOQ==} + '@img/sharp-linux-arm64@0.34.2': + resolution: {integrity: sha512-D8n8wgWmPDakc83LORcfJepdOSN6MvWNzzz2ux0MnIbOqdieRZwVYY32zxVx+IFUT8er5KPcyU3XXsn+GzG/0Q==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm64] os: [linux] - '@img/sharp-linux-arm@0.34.1': - resolution: {integrity: sha512-anKiszvACti2sGy9CirTlNyk7BjjZPiML1jt2ZkTdcvpLU1YH6CXwRAZCA2UmRXnhiIftXQ7+Oh62Ji25W72jA==} + '@img/sharp-linux-arm@0.34.2': + resolution: {integrity: sha512-0DZzkvuEOqQUP9mo2kjjKNok5AmnOr1jB2XYjkaoNRwpAYMDzRmAqUIa1nRi58S2WswqSfPOWLNOr0FDT3H5RQ==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm] os: [linux] - '@img/sharp-linux-s390x@0.34.1': - resolution: {integrity: sha512-7s0KX2tI9mZI2buRipKIw2X1ufdTeaRgwmRabt5bi9chYfhur+/C1OXg3TKg/eag1W+6CCWLVmSauV1owmRPxA==} + '@img/sharp-linux-s390x@0.34.2': + resolution: {integrity: sha512-EGZ1xwhBI7dNISwxjChqBGELCWMGDvmxZXKjQRuqMrakhO8QoMgqCrdjnAqJq/CScxfRn+Bb7suXBElKQpPDiw==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [s390x] os: [linux] - '@img/sharp-linux-x64@0.34.1': - resolution: {integrity: sha512-wExv7SH9nmoBW3Wr2gvQopX1k8q2g5V5Iag8Zk6AVENsjwd+3adjwxtp3Dcu2QhOXr8W9NusBU6XcQUohBZ5MA==} + '@img/sharp-linux-x64@0.34.2': + resolution: {integrity: sha512-sD7J+h5nFLMMmOXYH4DD9UtSNBD05tWSSdWAcEyzqW8Cn5UxXvsHAxmxSesYUsTOBmUnjtxghKDl15EvfqLFbQ==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [linux] - '@img/sharp-linuxmusl-arm64@0.34.1': - resolution: {integrity: sha512-DfvyxzHxw4WGdPiTF0SOHnm11Xv4aQexvqhRDAoD00MzHekAj9a/jADXeXYCDFH/DzYruwHbXU7uz+H+nWmSOQ==} + '@img/sharp-linuxmusl-arm64@0.34.2': + resolution: {integrity: sha512-NEE2vQ6wcxYav1/A22OOxoSOGiKnNmDzCYFOZ949xFmrWZOVII1Bp3NqVVpvj+3UeHMFyN5eP/V5hzViQ5CZNA==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm64] os: [linux] - '@img/sharp-linuxmusl-x64@0.34.1': - resolution: {integrity: sha512-pax/kTR407vNb9qaSIiWVnQplPcGU8LRIJpDT5o8PdAx5aAA7AS3X9PS8Isw1/WfqgQorPotjrZL3Pqh6C5EBg==} + '@img/sharp-linuxmusl-x64@0.34.2': + resolution: {integrity: sha512-DOYMrDm5E6/8bm/yQLCWyuDJwUnlevR8xtF8bs+gjZ7cyUNYXiSf/E8Kp0Ss5xasIaXSHzb888V1BE4i1hFhAA==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [linux] - '@img/sharp-wasm32@0.34.1': - resolution: {integrity: sha512-YDybQnYrLQfEpzGOQe7OKcyLUCML4YOXl428gOOzBgN6Gw0rv8dpsJ7PqTHxBnXnwXr8S1mYFSLSa727tpz0xg==} + '@img/sharp-wasm32@0.34.2': + resolution: {integrity: sha512-/VI4mdlJ9zkaq53MbIG6rZY+QRN3MLbR6usYlgITEzi4Rpx5S6LFKsycOQjkOGmqTNmkIdLjEvooFKwww6OpdQ==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [wasm32] - '@img/sharp-win32-ia32@0.34.1': - resolution: {integrity: sha512-WKf/NAZITnonBf3U1LfdjoMgNO5JYRSlhovhRhMxXVdvWYveM4kM3L8m35onYIdh75cOMCo1BexgVQcCDzyoWw==} + '@img/sharp-win32-arm64@0.34.2': + resolution: {integrity: sha512-cfP/r9FdS63VA5k0xiqaNaEoGxBg9k7uE+RQGzuK9fHt7jib4zAVVseR9LsE4gJcNWgT6APKMNnCcnyOtmSEUQ==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [win32] + + '@img/sharp-win32-ia32@0.34.2': + resolution: {integrity: sha512-QLjGGvAbj0X/FXl8n1WbtQ6iVBpWU7JO94u/P2M4a8CFYsvQi4GW2mRy/JqkRx0qpBzaOdKJKw8uc930EX2AHw==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [ia32] os: [win32] - '@img/sharp-win32-x64@0.34.1': - resolution: {integrity: sha512-hw1iIAHpNE8q3uMIRCgGOeDoz9KtFNarFLQclLxr/LK1VBkj8nby18RjFvr6aP7USRYAjTZW6yisnBWMX571Tw==} + '@img/sharp-win32-x64@0.34.2': + resolution: {integrity: sha512-aUdT6zEYtDKCaxkofmmJDJYGCf0+pJg3eU9/oBuqvEeoB9dKI6ZLc/1iLJCTuJQDO4ptntAlkUmHgGjyuobZbw==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [win32] + '@isaacs/balanced-match@4.0.1': + resolution: {integrity: sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ==} + engines: {node: 20 || >=22} + + '@isaacs/brace-expansion@5.0.0': + resolution: {integrity: sha512-ZT55BDLV0yv0RBm2czMiZ+SqCGO7AvmOM3G/w2xhVPH+te0aKgFjmBvGlL1dH+ql2tgGO3MVrbb3jCKyvpgnxA==} + engines: {node: 20 || >=22} + '@isaacs/cliui@8.0.2': resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} engines: {node: '>=12'} - '@jridgewell/sourcemap-codec@1.5.0': - resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} + '@jridgewell/sourcemap-codec@1.5.4': + resolution: {integrity: sha512-VT2+G1VQs/9oz078bLrYbecdZKs912zQlkelYpuf+SXF+QvZDYJlbx/LSx+meSAwdDFnF8FVXW92AVjjkVmgFw==} '@manypkg/find-root@1.1.0': resolution: {integrity: sha512-mki5uBvhHzO8kYYix/WRy2WX8S3B5wdVSc9D6KcU5lQNglP2yt58/VfLuAK49glRXChosY8ap2oJ1qgma3GUVA==} @@ -747,12 +765,8 @@ packages: '@mdx-js/mdx@3.1.0': resolution: {integrity: sha512-/QxEhPAvGwbQmy1Px8F899L5Uc2KZ6JtXwlCgJmjSTBedwOZkByYcBG4GceIGPXRDsmfxhHazuS+hlOShRLeDw==} - '@mermaid-js/parser@0.4.0': - resolution: {integrity: sha512-wla8XOWvQAwuqy+gxiZqY+c7FokraOTHRWMsbB4AgRx9Sy7zKslNyejy7E+a77qHfey5GXw/ik3IXv/NHMJgaA==} - - '@modelcontextprotocol/sdk@1.11.3': - resolution: {integrity: sha512-rmOWVRUbUJD7iSvJugjUbFZshTAuJ48MXoZ80Osx1GM0K/H1w7rSEvmw8m6vdWxNASgtaHIhAgre4H/E9GJiYQ==} - engines: {node: '>=18'} + '@mermaid-js/parser@0.6.0': + resolution: {integrity: sha512-7DNESgpyZ5WG1SIkrYafVBhWmImtmQuoxOO1lawI3gQYWxBX3v1FW3IyuuRfKJAO06XrZR71W0Kif5VEGGd4VA==} '@napi-rs/simple-git-android-arm-eabi@0.1.19': resolution: {integrity: sha512-XryEH/hadZ4Duk/HS/HC/cA1j0RHmqUGey3MsCf65ZS0VrWMqChXM/xlTPWuY5jfCc/rPubHaqI7DZlbexnX/g==} @@ -842,59 +856,59 @@ packages: resolution: {integrity: sha512-jMxvwzkKzd3cXo2EB9GM2ic0eYo2rP/BS6gJt6HnWbsDO1O8GSD4k7o2Cpr2YERtMpGF/MGcDfsfj2EbQPtrXw==} engines: {node: '>= 10'} - '@napi-rs/wasm-runtime@0.2.9': - resolution: {integrity: sha512-OKRBiajrrxB9ATokgEQoG87Z25c67pCpYcCwmXYX8PBftC9pBfN18gnm/fh1wurSLEKIAt+QRFLFCQISrb66Jg==} + '@napi-rs/wasm-runtime@0.2.11': + resolution: {integrity: sha512-9DPkXtvHydrcOsopiYpUgPHpmj0HWZKMUnL2dZqpvC42lsratuBG06V5ipyno0fUek5VlFsNQ+AcFATSrJXgMA==} - '@next/env@15.3.2': - resolution: {integrity: sha512-xURk++7P7qR9JG1jJtLzPzf0qEvqCN0A/T3DXf8IPMKo9/6FfjxtEffRJIIew/bIL4T3C2jLLqBor8B/zVlx6g==} + '@next/env@15.4.0-canary.61': + resolution: {integrity: sha512-69POa6nDa+1/CgHUiDxBUXFQFB5EdlrshdXzCaDcsbVNYeZKoGnrKHweQCzfmKGXvRcM3dziuhucVIwv68hbVw==} - '@next/eslint-plugin-next@15.3.2': - resolution: {integrity: sha512-ijVRTXBgnHT33aWnDtmlG+LJD+5vhc9AKTJPquGG5NKXjpKNjc62woIhFtrAcWdBobt8kqjCoaJ0q6sDQoX7aQ==} + '@next/eslint-plugin-next@15.4.0-canary.61': + resolution: {integrity: sha512-Frc7XZ4REtQPUulcweJm2ssdnkw3drgD0Bm4NTZCmT8jft4Rt0zW9EHUSxO+ySD9Y5H4/BUNopxZYD3SRtMNGw==} - '@next/swc-darwin-arm64@15.3.2': - resolution: {integrity: sha512-2DR6kY/OGcokbnCsjHpNeQblqCZ85/1j6njYSkzRdpLn5At7OkSdmk7WyAmB9G0k25+VgqVZ/u356OSoQZ3z0g==} + '@next/swc-darwin-arm64@15.4.0-canary.61': + resolution: {integrity: sha512-rM5TWBNlC3pLISxQ2yZfWXqqKx/B9OjhQcfTWHFJsuEzJuxVEDn0AxexjE/0jo+mEm8Xgwdwo0QA1bcGaRxAxQ==} engines: {node: '>= 10'} cpu: [arm64] os: [darwin] - '@next/swc-darwin-x64@15.3.2': - resolution: {integrity: sha512-ro/fdqaZWL6k1S/5CLv1I0DaZfDVJkWNaUU3un8Lg6m0YENWlDulmIWzV96Iou2wEYyEsZq51mwV8+XQXqMp3w==} + '@next/swc-darwin-x64@15.4.0-canary.61': + resolution: {integrity: sha512-R9WsMuXxpfhKpwcsYrDcpP+bsIPj8uPSSaZgNgxHQUovA1tCGVQO06ExddbGcnuvrs+J105/1NxuVafJlkJxjg==} engines: {node: '>= 10'} cpu: [x64] os: [darwin] - '@next/swc-linux-arm64-gnu@15.3.2': - resolution: {integrity: sha512-covwwtZYhlbRWK2HlYX9835qXum4xYZ3E2Mra1mdQ+0ICGoMiw1+nVAn4d9Bo7R3JqSmK1grMq/va+0cdh7bJA==} + '@next/swc-linux-arm64-gnu@15.4.0-canary.61': + resolution: {integrity: sha512-NcWW7Th1UCq9A+FKONHoUwoyJYbxDWu6MIG/SwjV0FMyEBtCwHU5YbN+hicj/B2KW2OBbA/dhhj30Pa468A0YQ==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - '@next/swc-linux-arm64-musl@15.3.2': - resolution: {integrity: sha512-KQkMEillvlW5Qk5mtGA/3Yz0/tzpNlSw6/3/ttsV1lNtMuOHcGii3zVeXZyi4EJmmLDKYcTcByV2wVsOhDt/zg==} + '@next/swc-linux-arm64-musl@15.4.0-canary.61': + resolution: {integrity: sha512-E4Ha94KEWiQK+BNMG8C8qi17PAl476JbrpwzmwQVi6CI58lJuN5KMBxqlCaOeeF582muO2YmjU5TDfBA/EY1ug==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - '@next/swc-linux-x64-gnu@15.3.2': - resolution: {integrity: sha512-uRBo6THWei0chz+Y5j37qzx+BtoDRFIkDzZjlpCItBRXyMPIg079eIkOCl3aqr2tkxL4HFyJ4GHDes7W8HuAUg==} + '@next/swc-linux-x64-gnu@15.4.0-canary.61': + resolution: {integrity: sha512-5Y3qFsEs0WHaL8n64iCWJpH92YSBVWDTdtbkA8YHobo5BuBDVimIMgrLbSzAVkHmd0GkMcoOEGXgN0+LwC8T5A==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - '@next/swc-linux-x64-musl@15.3.2': - resolution: {integrity: sha512-+uxFlPuCNx/T9PdMClOqeE8USKzj8tVz37KflT3Kdbx/LOlZBRI2yxuIcmx1mPNK8DwSOMNCr4ureSet7eyC0w==} + '@next/swc-linux-x64-musl@15.4.0-canary.61': + resolution: {integrity: sha512-7e3htZt4fpwjcG/iNTRtFwaAiqw0QFPp+U0arBxVH/bikKMeTqbflKvfD4RnGWkSB8FQbSgAyGvLQWEE22WPhA==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - '@next/swc-win32-arm64-msvc@15.3.2': - resolution: {integrity: sha512-LLTKmaI5cfD8dVzh5Vt7+OMo+AIOClEdIU/TSKbXXT2iScUTSxOGoBhfuv+FU8R9MLmrkIL1e2fBMkEEjYAtPQ==} + '@next/swc-win32-arm64-msvc@15.4.0-canary.61': + resolution: {integrity: sha512-ABj9Wpk/4XZAgJfflG2KrhDvusDO+r2I/0Byr1C2DXmY5wUhcFSJFXViAQX98PufO7t6Jg5flPC7uqBf4Hp0eQ==} engines: {node: '>= 10'} cpu: [arm64] os: [win32] - '@next/swc-win32-x64-msvc@15.3.2': - resolution: {integrity: sha512-aW5B8wOPioJ4mBdMDXkt5f3j8pUr9W8AnlX0Df35uRWNT1Y6RIybxjnSUe+PhM+M1bwgyY8PHLmXZC6zT1o5tA==} + '@next/swc-win32-x64-msvc@15.4.0-canary.61': + resolution: {integrity: sha512-WWzzuq52/Mu7/zr5nm4V2r6U+wnra6BxNLh1d4ZoxGkAPGkVPSOMmE/dTcVPjsADszOJwJzjVDq/KAYEftqEyw==} engines: {node: '>= 10'} cpu: [x64] os: [win32] @@ -964,12 +978,12 @@ packages: resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} engines: {node: '>=14'} - '@pkgr/core@0.2.4': - resolution: {integrity: sha512-ROFF39F6ZrnzSUEmQQZUar0Jt4xVoP9WnDRdWwF4NNcXs3xBTLgBUDoOwW141y1jP+S8nahIbdxbFC7IShw9Iw==} + '@pkgr/core@0.2.7': + resolution: {integrity: sha512-YLT9Zo3oNPJoBjBc4q8G2mjU4tqIbf5CEOORbUUr48dCD9q3umJ3IPlVqOqDakPfd2HuwccBaqlGhN4Gmr5OWg==} engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} - '@playwright/test@1.52.0': - resolution: {integrity: sha512-uh6W7sb55hl7D6vsAeA+V2p5JnlAqzhqFyF0VcJkKZXkgnFcVG9PziERRHQfPLfNGx1C292a4JqbWzhR8L4R1g==} + '@playwright/test@1.53.2': + resolution: {integrity: sha512-tEB2U5z74ebBeyfGNZ3Jfg29AnW+5HlWhvHtb/Mqco9pFdZU1ZLNdVb2UtB5CvmiilNr2ZfVH/qMmAROG/XTzw==} engines: {node: '>=18'} hasBin: true @@ -987,168 +1001,168 @@ packages: '@pm2/pm2-version-check@1.0.4': resolution: {integrity: sha512-SXsM27SGH3yTWKc2fKR4SYNxsmnvuBQ9dd6QHtEWmiZ/VqaOYPAIlS8+vMcn27YLtAEBGvNRSh3TPNvtjZgfqA==} - '@react-aria/focus@3.20.2': - resolution: {integrity: sha512-Q3rouk/rzoF/3TuH6FzoAIKrl+kzZi9LHmr8S5EqLAOyP9TXIKG34x2j42dZsAhrw7TbF9gA8tBKwnCNH4ZV+Q==} + '@react-aria/focus@3.20.5': + resolution: {integrity: sha512-JpFtXmWQ0Oca7FcvkqgjSyo6xEP7v3oQOLUId6o0xTvm4AD5W0mU2r3lYrbhsJ+XxdUUX4AVR5473sZZ85kU4A==} peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - '@react-aria/interactions@3.25.0': - resolution: {integrity: sha512-GgIsDLlO8rDU/nFn6DfsbP9rfnzhm8QFjZkB9K9+r+MTSCn7bMntiWQgMM+5O6BiA8d7C7x4zuN4bZtc0RBdXQ==} + '@react-aria/interactions@3.25.3': + resolution: {integrity: sha512-J1bhlrNtjPS/fe5uJQ+0c7/jiXniwa4RQlP+Emjfc/iuqpW2RhbF9ou5vROcLzWIyaW8tVMZ468J68rAs/aZ5A==} peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - '@react-aria/ssr@3.9.8': - resolution: {integrity: sha512-lQDE/c9uTfBSDOjaZUJS8xP2jCKVk4zjQeIlCH90xaLhHDgbpCdns3xvFpJJujfj3nI4Ll9K7A+ONUBDCASOuw==} + '@react-aria/ssr@3.9.9': + resolution: {integrity: sha512-2P5thfjfPy/np18e5wD4WPt8ydNXhij1jwA8oehxZTFqlgVMGXzcWKxTb4RtJrLFsqPO7RUQTiY8QJk0M4Vy2g==} engines: {node: '>= 12'} peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - '@react-aria/utils@3.28.2': - resolution: {integrity: sha512-J8CcLbvnQgiBn54eeEvQQbIOfBF3A1QizxMw9P4cl9MkeR03ug7RnjTIdJY/n2p7t59kLeAB3tqiczhcj+Oi5w==} + '@react-aria/utils@3.29.1': + resolution: {integrity: sha512-yXMFVJ73rbQ/yYE/49n5Uidjw7kh192WNN9PNQGV0Xoc7EJUlSOxqhnpHmYTyO0EotJ8fdM1fMH8durHjUSI8g==} peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - '@react-stately/flags@3.1.1': - resolution: {integrity: sha512-XPR5gi5LfrPdhxZzdIlJDz/B5cBf63l4q6/AzNqVWFKgd0QqY5LvWJftXkklaIUpKSJkIKQb8dphuZXDtkWNqg==} + '@react-stately/flags@3.1.2': + resolution: {integrity: sha512-2HjFcZx1MyQXoPqcBGALwWWmgFVUk2TuKVIQxCbRq7fPyWXIl6VHcakCLurdtYC2Iks7zizvz0Idv48MQ38DWg==} - '@react-stately/utils@3.10.6': - resolution: {integrity: sha512-O76ip4InfTTzAJrg8OaZxKU4vvjMDOpfA/PGNOytiXwBbkct2ZeZwaimJ8Bt9W1bj5VsZ81/o/tW4BacbdDOMA==} + '@react-stately/utils@3.10.7': + resolution: {integrity: sha512-cWvjGAocvy4abO9zbr6PW6taHgF24Mwy/LbQ4TC4Aq3tKdKDntxyD+sh7AkSRfJRT2ccMVaHVv2+FfHThd3PKQ==} peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - '@react-types/shared@3.29.0': - resolution: {integrity: sha512-IDQYu/AHgZimObzCFdNl1LpZvQW/xcfLt3v20sorl5qRucDVj4S9os98sVTZ4IRIBjmS+MkjqpR5E70xan7ooA==} + '@react-types/shared@3.30.0': + resolution: {integrity: sha512-COIazDAx1ncDg046cTJ8SFYsX8aS3lB/08LDnbkH/SkdYrFPWDlXMrO/sUam8j1WWM+PJ+4d1mj7tODIKNiFog==} peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - '@redis/bloom@5.0.1': - resolution: {integrity: sha512-F7L+rnuJvq/upKaVoEgsf8VT7g5pLQYWRqSUOV3uO4vpVtARzSKJ7CLyJjVsQS+wZVCGxsLMh8DwAIDcny1B+g==} + '@redis/bloom@5.5.6': + resolution: {integrity: sha512-bNR3mxkwtfuCxNOzfV8B3R5zA1LiN57EH6zK4jVBIgzMzliNuReZXBFGnXvsi80/SYohajn78YdpYI+XNpqL+A==} engines: {node: '>= 18'} peerDependencies: - '@redis/client': ^5.0.1 + '@redis/client': ^5.5.6 - '@redis/client@5.0.1': - resolution: {integrity: sha512-k0EJvlMGEyBqUD3orKe0UMZ66fPtfwqPIr+ZSd853sXj2EyhNtPXSx+J6sENXJNgAlEBhvD+57Dwt0qTisKB0A==} + '@redis/client@5.5.6': + resolution: {integrity: sha512-M3Svdwt6oSfyfQdqEr0L2HOJH2vK7GgCFx1NfAQvpWAT4+ljoT1L5S5cKT3dA9NJrxrOPDkdoTPWJnIrGCOcmw==} engines: {node: '>= 18'} - '@redis/json@5.0.1': - resolution: {integrity: sha512-t94HOTk5myfhvaHZzlUzk2hoUvH2jsjftcnMgJWuHL/pzjAJQoZDCUJzjkoXIUjWXuyJixTguaaDyOZWwqH2Kg==} + '@redis/json@5.5.6': + resolution: {integrity: sha512-AIsoe3SsGQagqAmSQHaqxEinm5oCWr7zxPWL90kKaEdLJ+zw8KBznf2i9oK0WUFP5pFssSQUXqnscQKe2amfDQ==} engines: {node: '>= 18'} peerDependencies: - '@redis/client': ^5.0.1 + '@redis/client': ^5.5.6 - '@redis/search@5.0.1': - resolution: {integrity: sha512-wipK6ZptY7K68B7YLVhP5I/wYCDUU+mDJMyJiUcQLuOs7/eKOBc8lTXKUSssor8QnzZSPy4A5ulcC5PZY22Zgw==} + '@redis/search@5.5.6': + resolution: {integrity: sha512-JSqasYqO0mVcHL7oxvbySRBBZYRYhFl3W7f0Da7BW8M/r0Z9wCiVrdjnN4/mKBpWZkoJT/iuisLUdPGhpKxBew==} engines: {node: '>= 18'} peerDependencies: - '@redis/client': ^5.0.1 + '@redis/client': ^5.5.6 - '@redis/time-series@5.0.1': - resolution: {integrity: sha512-k6PgbrakhnohsEWEAdQZYt3e5vSKoIzpKvgQt8//lnWLrTZx+c3ed2sj0+pKIF4FvnSeuXLo4bBWcH0Z7Urg1A==} + '@redis/time-series@5.5.6': + resolution: {integrity: sha512-jkpcgq3NOI3TX7xEAJ3JgesJTxAx7k0m6lNxNsYdEM8KOl+xj7GaB/0CbLkoricZDmFSEAz7ClA1iK9XkGHf+Q==} engines: {node: '>= 18'} peerDependencies: - '@redis/client': ^5.0.1 + '@redis/client': ^5.5.6 - '@rollup/rollup-android-arm-eabi@4.40.2': - resolution: {integrity: sha512-JkdNEq+DFxZfUwxvB58tHMHBHVgX23ew41g1OQinthJ+ryhdRk67O31S7sYw8u2lTjHUPFxwar07BBt1KHp/hg==} + '@rollup/rollup-android-arm-eabi@4.44.1': + resolution: {integrity: sha512-JAcBr1+fgqx20m7Fwe1DxPUl/hPkee6jA6Pl7n1v2EFiktAHenTaXl5aIFjUIEsfn9w3HE4gK1lEgNGMzBDs1w==} cpu: [arm] os: [android] - '@rollup/rollup-android-arm64@4.40.2': - resolution: {integrity: sha512-13unNoZ8NzUmnndhPTkWPWbX3vtHodYmy+I9kuLxN+F+l+x3LdVF7UCu8TWVMt1POHLh6oDHhnOA04n8oJZhBw==} + '@rollup/rollup-android-arm64@4.44.1': + resolution: {integrity: sha512-RurZetXqTu4p+G0ChbnkwBuAtwAbIwJkycw1n6GvlGlBuS4u5qlr5opix8cBAYFJgaY05TWtM+LaoFggUmbZEQ==} cpu: [arm64] os: [android] - '@rollup/rollup-darwin-arm64@4.40.2': - resolution: {integrity: sha512-Gzf1Hn2Aoe8VZzevHostPX23U7N5+4D36WJNHK88NZHCJr7aVMG4fadqkIf72eqVPGjGc0HJHNuUaUcxiR+N/w==} + '@rollup/rollup-darwin-arm64@4.44.1': + resolution: {integrity: sha512-fM/xPesi7g2M7chk37LOnmnSTHLG/v2ggWqKj3CCA1rMA4mm5KVBT1fNoswbo1JhPuNNZrVwpTvlCVggv8A2zg==} cpu: [arm64] os: [darwin] - '@rollup/rollup-darwin-x64@4.40.2': - resolution: {integrity: sha512-47N4hxa01a4x6XnJoskMKTS8XZ0CZMd8YTbINbi+w03A2w4j1RTlnGHOz/P0+Bg1LaVL6ufZyNprSg+fW5nYQQ==} + '@rollup/rollup-darwin-x64@4.44.1': + resolution: {integrity: sha512-gDnWk57urJrkrHQ2WVx9TSVTH7lSlU7E3AFqiko+bgjlh78aJ88/3nycMax52VIVjIm3ObXnDL2H00e/xzoipw==} cpu: [x64] os: [darwin] - '@rollup/rollup-freebsd-arm64@4.40.2': - resolution: {integrity: sha512-8t6aL4MD+rXSHHZUR1z19+9OFJ2rl1wGKvckN47XFRVO+QL/dUSpKA2SLRo4vMg7ELA8pzGpC+W9OEd1Z/ZqoQ==} + '@rollup/rollup-freebsd-arm64@4.44.1': + resolution: {integrity: sha512-wnFQmJ/zPThM5zEGcnDcCJeYJgtSLjh1d//WuHzhf6zT3Md1BvvhJnWoy+HECKu2bMxaIcfWiu3bJgx6z4g2XA==} cpu: [arm64] os: [freebsd] - '@rollup/rollup-freebsd-x64@4.40.2': - resolution: {integrity: sha512-C+AyHBzfpsOEYRFjztcYUFsH4S7UsE9cDtHCtma5BK8+ydOZYgMmWg1d/4KBytQspJCld8ZIujFMAdKG1xyr4Q==} + '@rollup/rollup-freebsd-x64@4.44.1': + resolution: {integrity: sha512-uBmIxoJ4493YATvU2c0upGz87f99e3wop7TJgOA/bXMFd2SvKCI7xkxY/5k50bv7J6dw1SXT4MQBQSLn8Bb/Uw==} cpu: [x64] os: [freebsd] - '@rollup/rollup-linux-arm-gnueabihf@4.40.2': - resolution: {integrity: sha512-de6TFZYIvJwRNjmW3+gaXiZ2DaWL5D5yGmSYzkdzjBDS3W+B9JQ48oZEsmMvemqjtAFzE16DIBLqd6IQQRuG9Q==} + '@rollup/rollup-linux-arm-gnueabihf@4.44.1': + resolution: {integrity: sha512-n0edDmSHlXFhrlmTK7XBuwKlG5MbS7yleS1cQ9nn4kIeW+dJH+ExqNgQ0RrFRew8Y+0V/x6C5IjsHrJmiHtkxQ==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm-musleabihf@4.40.2': - resolution: {integrity: sha512-urjaEZubdIkacKc930hUDOfQPysezKla/O9qV+O89enqsqUmQm8Xj8O/vh0gHg4LYfv7Y7UsE3QjzLQzDYN1qg==} + '@rollup/rollup-linux-arm-musleabihf@4.44.1': + resolution: {integrity: sha512-8WVUPy3FtAsKSpyk21kV52HCxB+me6YkbkFHATzC2Yd3yuqHwy2lbFL4alJOLXKljoRw08Zk8/xEj89cLQ/4Nw==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm64-gnu@4.40.2': - resolution: {integrity: sha512-KlE8IC0HFOC33taNt1zR8qNlBYHj31qGT1UqWqtvR/+NuCVhfufAq9fxO8BMFC22Wu0rxOwGVWxtCMvZVLmhQg==} + '@rollup/rollup-linux-arm64-gnu@4.44.1': + resolution: {integrity: sha512-yuktAOaeOgorWDeFJggjuCkMGeITfqvPgkIXhDqsfKX8J3jGyxdDZgBV/2kj/2DyPaLiX6bPdjJDTu9RB8lUPQ==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-arm64-musl@4.40.2': - resolution: {integrity: sha512-j8CgxvfM0kbnhu4XgjnCWJQyyBOeBI1Zq91Z850aUddUmPeQvuAy6OiMdPS46gNFgy8gN1xkYyLgwLYZG3rBOg==} + '@rollup/rollup-linux-arm64-musl@4.44.1': + resolution: {integrity: sha512-W+GBM4ifET1Plw8pdVaecwUgxmiH23CfAUj32u8knq0JPFyK4weRy6H7ooxYFD19YxBulL0Ktsflg5XS7+7u9g==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-loongarch64-gnu@4.40.2': - resolution: {integrity: sha512-Ybc/1qUampKuRF4tQXc7G7QY9YRyeVSykfK36Y5Qc5dmrIxwFhrOzqaVTNoZygqZ1ZieSWTibfFhQ5qK8jpWxw==} + '@rollup/rollup-linux-loongarch64-gnu@4.44.1': + resolution: {integrity: sha512-1zqnUEMWp9WrGVuVak6jWTl4fEtrVKfZY7CvcBmUUpxAJ7WcSowPSAWIKa/0o5mBL/Ij50SIf9tuirGx63Ovew==} cpu: [loong64] os: [linux] - '@rollup/rollup-linux-powerpc64le-gnu@4.40.2': - resolution: {integrity: sha512-3FCIrnrt03CCsZqSYAOW/k9n625pjpuMzVfeI+ZBUSDT3MVIFDSPfSUgIl9FqUftxcUXInvFah79hE1c9abD+Q==} + '@rollup/rollup-linux-powerpc64le-gnu@4.44.1': + resolution: {integrity: sha512-Rl3JKaRu0LHIx7ExBAAnf0JcOQetQffaw34T8vLlg9b1IhzcBgaIdnvEbbsZq9uZp3uAH+JkHd20Nwn0h9zPjA==} cpu: [ppc64] os: [linux] - '@rollup/rollup-linux-riscv64-gnu@4.40.2': - resolution: {integrity: sha512-QNU7BFHEvHMp2ESSY3SozIkBPaPBDTsfVNGx3Xhv+TdvWXFGOSH2NJvhD1zKAT6AyuuErJgbdvaJhYVhVqrWTg==} + '@rollup/rollup-linux-riscv64-gnu@4.44.1': + resolution: {integrity: sha512-j5akelU3snyL6K3N/iX7otLBIl347fGwmd95U5gS/7z6T4ftK288jKq3A5lcFKcx7wwzb5rgNvAg3ZbV4BqUSw==} cpu: [riscv64] os: [linux] - '@rollup/rollup-linux-riscv64-musl@4.40.2': - resolution: {integrity: sha512-5W6vNYkhgfh7URiXTO1E9a0cy4fSgfE4+Hl5agb/U1sa0kjOLMLC1wObxwKxecE17j0URxuTrYZZME4/VH57Hg==} + '@rollup/rollup-linux-riscv64-musl@4.44.1': + resolution: {integrity: sha512-ppn5llVGgrZw7yxbIm8TTvtj1EoPgYUAbfw0uDjIOzzoqlZlZrLJ/KuiE7uf5EpTpCTrNt1EdtzF0naMm0wGYg==} cpu: [riscv64] os: [linux] - '@rollup/rollup-linux-s390x-gnu@4.40.2': - resolution: {integrity: sha512-B7LKIz+0+p348JoAL4X/YxGx9zOx3sR+o6Hj15Y3aaApNfAshK8+mWZEf759DXfRLeL2vg5LYJBB7DdcleYCoQ==} + '@rollup/rollup-linux-s390x-gnu@4.44.1': + resolution: {integrity: sha512-Hu6hEdix0oxtUma99jSP7xbvjkUM/ycke/AQQ4EC5g7jNRLLIwjcNwaUy95ZKBJJwg1ZowsclNnjYqzN4zwkAw==} cpu: [s390x] os: [linux] - '@rollup/rollup-linux-x64-gnu@4.40.2': - resolution: {integrity: sha512-lG7Xa+BmBNwpjmVUbmyKxdQJ3Q6whHjMjzQplOs5Z+Gj7mxPtWakGHqzMqNER68G67kmCX9qX57aRsW5V0VOng==} + '@rollup/rollup-linux-x64-gnu@4.44.1': + resolution: {integrity: sha512-EtnsrmZGomz9WxK1bR5079zee3+7a+AdFlghyd6VbAjgRJDbTANJ9dcPIPAi76uG05micpEL+gPGmAKYTschQw==} cpu: [x64] os: [linux] - '@rollup/rollup-linux-x64-musl@4.40.2': - resolution: {integrity: sha512-tD46wKHd+KJvsmije4bUskNuvWKFcTOIM9tZ/RrmIvcXnbi0YK/cKS9FzFtAm7Oxi2EhV5N2OpfFB348vSQRXA==} + '@rollup/rollup-linux-x64-musl@4.44.1': + resolution: {integrity: sha512-iAS4p+J1az6Usn0f8xhgL4PaU878KEtutP4hqw52I4IO6AGoyOkHCxcc4bqufv1tQLdDWFx8lR9YlwxKuv3/3g==} cpu: [x64] os: [linux] - '@rollup/rollup-win32-arm64-msvc@4.40.2': - resolution: {integrity: sha512-Bjv/HG8RRWLNkXwQQemdsWw4Mg+IJ29LK+bJPW2SCzPKOUaMmPEppQlu/Fqk1d7+DX3V7JbFdbkh/NMmurT6Pg==} + '@rollup/rollup-win32-arm64-msvc@4.44.1': + resolution: {integrity: sha512-NtSJVKcXwcqozOl+FwI41OH3OApDyLk3kqTJgx8+gp6On9ZEt5mYhIsKNPGuaZr3p9T6NWPKGU/03Vw4CNU9qg==} cpu: [arm64] os: [win32] - '@rollup/rollup-win32-ia32-msvc@4.40.2': - resolution: {integrity: sha512-dt1llVSGEsGKvzeIO76HToiYPNPYPkmjhMHhP00T9S4rDern8P2ZWvWAQUEJ+R1UdMWJ/42i/QqJ2WV765GZcA==} + '@rollup/rollup-win32-ia32-msvc@4.44.1': + resolution: {integrity: sha512-JYA3qvCOLXSsnTR3oiyGws1Dm0YTuxAAeaYGVlGpUsHqloPcFjPg+X0Fj2qODGLNwQOAcCiQmHub/V007kiH5A==} cpu: [ia32] os: [win32] - '@rollup/rollup-win32-x64-msvc@4.40.2': - resolution: {integrity: sha512-bwspbWB04XJpeElvsp+DCylKfF4trJDa2Y9Go8O6A7YLX2LIKGcNK/CYImJN6ZP4DcuOHB4Utl3iCbnR62DudA==} + '@rollup/rollup-win32-x64-msvc@4.44.1': + resolution: {integrity: sha512-J8o22LuF0kTe7m+8PvW9wk3/bRq5+mRo5Dqo6+vXb7otCm3TPhYOJqOaQtGU9YMWQSL3krMnoOxMr0+9E6F3Ug==} cpu: [x64] os: [win32] @@ -1176,23 +1190,20 @@ packages: '@shikijs/vscode-textmate@10.0.2': resolution: {integrity: sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==} - '@swc/counter@0.1.3': - resolution: {integrity: sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==} - '@swc/helpers@0.5.15': resolution: {integrity: sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==} '@swc/helpers@0.5.17': resolution: {integrity: sha512-5IKx/Y13RsYd+sauPb2x+U/xZikHjolzfuDgTAl/Tdf3Q8rslRvC19NKDLgAJQ6wsqADk10ntlv08nPFw/gO/A==} - '@tanstack/react-virtual@3.13.8': - resolution: {integrity: sha512-meS2AanUg50f3FBSNoAdBSRAh8uS0ue01qm7zrw65KGJtiXB9QXfybqZwkh4uFpRv2iX/eu5tjcH5wqUpwYLPg==} + '@tanstack/react-virtual@3.13.12': + resolution: {integrity: sha512-Gd13QdxPSukP8ZrkbgS2RwoZseTTbQPLnQEn7HY/rqtM+8Zt95f7xKC7N0EsKs7aoz0WzZ+fditZux+F8EzYxA==} 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 - '@tanstack/virtual-core@3.13.8': - resolution: {integrity: sha512-BT6w89Hqy7YKaWewYzmecXQzcJh6HTBbKYJIIkMaNU49DZ06LoTV3z32DWWEdUsgW6n1xTmwTLs4GtWrZC261w==} + '@tanstack/virtual-core@3.13.12': + resolution: {integrity: sha512-1YBOJfRHV4sXUmWsFSf5rQor4Ss82G8dQWLRbnk3GA4jeP8hQt1hxXh0tmflpC0dz3VgEv/1+qwPyLeWkQuPFA==} '@theguild/remark-mermaid@0.2.0': resolution: {integrity: sha512-o8n57TJy0OI4PCrNw8z6S+vpHtrwoQZzTA5Y3fL0U1NDRIoMg/78duWgEBFsCZcWM1G6zjE91yg1aKCsDwgE2Q==} @@ -1208,6 +1219,9 @@ packages: '@tybys/wasm-util@0.9.0': resolution: {integrity: sha512-6+7nlbMVX/PVDCwaIQ8nTOPveOcFLSt8GcXdx8hD0bt39uWxYT88uXzqTd4fTvqta7oeUJqudepapKNt2DYJFw==} + '@types/chai@5.2.2': + resolution: {integrity: sha512-8kB30R7Hwqf40JPiKhVzodJs2Qc1ZJ5zuT3uzw5Hq/dhNCl3G3l83jfpdI1e20BP348+fV7VIL/+FxaXkqBmWg==} + '@types/concat-stream@2.0.3': resolution: {integrity: sha512-3qe4oQAPNwVNwK4C9c8u+VJqv9kez+2MR4qJpoPFfXtgxxif1QbFusvXzK0/Wra2VX07smostI2VMmJNSpZjuQ==} @@ -1307,14 +1321,14 @@ packages: '@types/debug@4.1.12': resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==} - '@types/eslint@9.6.1': - resolution: {integrity: sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==} + '@types/deep-eql@4.0.2': + resolution: {integrity: sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==} '@types/estree-jsx@1.0.5': resolution: {integrity: sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==} - '@types/estree@1.0.7': - resolution: {integrity: sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==} + '@types/estree@1.0.8': + resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} '@types/geojson@7946.0.16': resolution: {integrity: sha512-6C8nqWur3j98U6+lXDfTUWIfgvZU+EumvpHKcYjujKH7woYyLj2sUmff0tRhrqM7BohUw7Pz3ZB1jj2gW9Fvmg==} @@ -1346,16 +1360,19 @@ packages: '@types/node@12.20.55': resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} - '@types/node@22.15.18': - resolution: {integrity: sha512-v1DKRfUdyW+jJhZNEI1PYy29S2YRxMV5AOO/x/SjKmW0acCIOqmbj6Haf9eHAhsPmrhlHSxEhv/1WszcLWV4cg==} + '@types/node@22.16.0': + resolution: {integrity: sha512-B2egV9wALML1JCpv3VQoQ+yesQKAmNMBIAY7OteVrikcOcAkWm+dGL6qpeCktPjAv6N1JLnhbNiqS35UpFyBsQ==} + + '@types/node@24.0.10': + resolution: {integrity: sha512-ENHwaH+JIRTDIEEbDK6QSQntAYGtbvdDXnMXnZaZ6k13Du1dPMmprkEHIL7ok2Wl2aZevetwTAb5S+7yIF+enA==} - '@types/react-dom@19.1.5': - resolution: {integrity: sha512-CMCjrWucUBZvohgZxkjd6S9h0nZxXjzus6yDfUb+xLxYM7VvjKNH1tQrE9GWLql1XoOP4/Ds3bwFqShHUYraGg==} + '@types/react-dom@19.1.6': + resolution: {integrity: sha512-4hOiT/dwO8Ko0gV1m/TJZYk3y0KBnY9vzDh7W+DH17b2HFSOGgdj33dhihPeuy3l0q23+4e+hoXHV6hCC4dCXw==} peerDependencies: '@types/react': ^19.0.0 - '@types/react@19.1.4': - resolution: {integrity: sha512-EB1yiiYdvySuIITtD5lhW4yPyJ31RkJkkDw794LaQYrxCSaQV/47y5o1FMC4zF9ZyjUjzJMZwbovEnT5yHTW6g==} + '@types/react@19.1.8': + resolution: {integrity: sha512-AwAfQ2Wa5bCx9WP8nZL2uMZWod7J7/JSplxbTmBQ5ms6QpqNYm672H0Vu9ZVKVngQ+ii4R/byguVEUZQyeg44g==} '@types/supports-color@8.1.3': resolution: {integrity: sha512-Hy6UMpxhE3j1tLpl27exp1XqHD7n8chAiNPzWfz16LPZoMMoSc4dzLl6w9qijkEb/r5O1ozdu1CWGA2L83ZeZg==} @@ -1369,51 +1386,63 @@ packages: '@types/unist@3.0.3': resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==} - '@typescript-eslint/eslint-plugin@8.32.1': - resolution: {integrity: sha512-6u6Plg9nP/J1GRpe/vcjjabo6Uc5YQPAMxsgQyGC/I0RuukiG1wIe3+Vtg3IrSCVJDmqK3j8adrtzXSENRtFgg==} + '@typescript-eslint/eslint-plugin@8.35.1': + resolution: {integrity: sha512-9XNTlo7P7RJxbVeICaIIIEipqxLKguyh+3UbXuT2XQuFp6d8VOeDEGuz5IiX0dgZo8CiI6aOFLg4e8cF71SFVg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - '@typescript-eslint/parser': ^8.0.0 || ^8.0.0-alpha.0 + '@typescript-eslint/parser': ^8.35.1 eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.9.0' - '@typescript-eslint/parser@8.32.1': - resolution: {integrity: sha512-LKMrmwCPoLhM45Z00O1ulb6jwyVr2kr3XJp+G+tSEZcbauNnScewcQwtJqXDhXeYPDEjZ8C1SjXm015CirEmGg==} + '@typescript-eslint/parser@8.35.1': + resolution: {integrity: sha512-3MyiDfrfLeK06bi/g9DqJxP5pV74LNv4rFTyvGDmT3x2p1yp1lOd+qYZfiRPIOf/oON+WRZR5wxxuF85qOar+w==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.9.0' - '@typescript-eslint/scope-manager@8.32.1': - resolution: {integrity: sha512-7IsIaIDeZn7kffk7qXC3o6Z4UblZJKV3UBpkvRNpr5NSyLji7tvTcvmnMNYuYLyh26mN8W723xpo3i4MlD33vA==} + '@typescript-eslint/project-service@8.35.1': + resolution: {integrity: sha512-VYxn/5LOpVxADAuP3NrnxxHYfzVtQzLKeldIhDhzC8UHaiQvYlXvKuVho1qLduFbJjjy5U5bkGwa3rUGUb1Q6Q==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <5.9.0' + + '@typescript-eslint/scope-manager@8.35.1': + resolution: {integrity: sha512-s/Bpd4i7ht2934nG+UoSPlYXd08KYz3bmjLEb7Ye1UVob0d1ENiT3lY8bsCmik4RqfSbPw9xJJHbugpPpP5JUg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/type-utils@8.32.1': - resolution: {integrity: sha512-mv9YpQGA8iIsl5KyUPi+FGLm7+bA4fgXaeRcFKRDRwDMu4iwrSHeDPipwueNXhdIIZltwCJv+NkxftECbIZWfA==} + '@typescript-eslint/tsconfig-utils@8.35.1': + resolution: {integrity: sha512-K5/U9VmT9dTHoNowWZpz+/TObS3xqC5h0xAIjXPw+MNcKV9qg6eSatEnmeAwkjHijhACH0/N7bkhKvbt1+DXWQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <5.9.0' + + '@typescript-eslint/type-utils@8.35.1': + resolution: {integrity: sha512-HOrUBlfVRz5W2LIKpXzZoy6VTZzMu2n8q9C2V/cFngIC5U1nStJgv0tMV4sZPzdf4wQm9/ToWUFPMN9Vq9VJQQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.9.0' - '@typescript-eslint/types@8.32.1': - resolution: {integrity: sha512-YmybwXUJcgGqgAp6bEsgpPXEg6dcCyPyCSr0CAAueacR/CCBi25G3V8gGQ2kRzQRBNol7VQknxMs9HvVa9Rvfg==} + '@typescript-eslint/types@8.35.1': + resolution: {integrity: sha512-q/O04vVnKHfrrhNAscndAn1tuQhIkwqnaW+eu5waD5IPts2eX1dgJxgqcPx5BX109/qAz7IG6VrEPTOYKCNfRQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/typescript-estree@8.32.1': - resolution: {integrity: sha512-Y3AP9EIfYwBb4kWGb+simvPaqQoT5oJuzzj9m0i6FCY6SPvlomY2Ei4UEMm7+FXtlNJbor80ximyslzaQF6xhg==} + '@typescript-eslint/typescript-estree@8.35.1': + resolution: {integrity: sha512-Vvpuvj4tBxIka7cPs6Y1uvM7gJgdF5Uu9F+mBJBPY4MhvjrjWGK4H0lVgLJd/8PWZ23FTqsaJaLEkBCFUk8Y9g==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <5.9.0' - '@typescript-eslint/utils@8.32.1': - resolution: {integrity: sha512-DsSFNIgLSrc89gpq1LJB7Hm1YpuhK086DRDJSNrewcGvYloWW1vZLHBTIvarKZDcAORIy/uWNx8Gad+4oMpkSA==} + '@typescript-eslint/utils@8.35.1': + resolution: {integrity: sha512-lhnwatFmOFcazAsUm3ZnZFpXSxiwoa1Lj50HphnDe1Et01NF4+hrdXONSUHIcbVu2eFb1bAf+5yjXkGVkXBKAQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.9.0' - '@typescript-eslint/visitor-keys@8.32.1': - resolution: {integrity: sha512-ar0tjQfObzhSaW3C3QNmTc5ofj0hDoNQ5XWrCy6zDyabdr0TWhCkClp+rywGNj/odAFBVzzJrK4tEq5M4Hmu4w==} + '@typescript-eslint/visitor-keys@8.35.1': + resolution: {integrity: sha512-VRwixir4zBWCSTP/ljEo091lbpypz57PoeAQ9imjG+vbeof9LplljsL1mos4ccG6H9IjfrVGM359RozUnuFhpw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@typescript/vfs@1.6.1': @@ -1424,95 +1453,104 @@ packages: '@ungap/structured-clone@1.3.0': resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} - '@unrs/resolver-binding-darwin-arm64@1.7.2': - resolution: {integrity: sha512-vxtBno4xvowwNmO/ASL0Y45TpHqmNkAaDtz4Jqb+clmcVSSl8XCG/PNFFkGsXXXS6AMjP+ja/TtNCFFa1QwLRg==} + '@unrs/resolver-binding-android-arm-eabi@1.10.1': + resolution: {integrity: sha512-zohDKXT1Ok0yhbVGff4YAg9HUs5ietG5GpvJBPFSApZnGe7uf2cd26DRhKZbn0Be6xHUZrSzP+RAgMmzyc71EA==} + cpu: [arm] + os: [android] + + '@unrs/resolver-binding-android-arm64@1.10.1': + resolution: {integrity: sha512-tAN6k5UrTd4nicpA7s2PbjR/jagpDzAmvXFjbpTazUe5FRsFxVcBlS1F5Lzp5jtWU6bdiqRhSvd4X8rdpCffeA==} + cpu: [arm64] + os: [android] + + '@unrs/resolver-binding-darwin-arm64@1.10.1': + resolution: {integrity: sha512-+FCsag8WkauI4dQ50XumCXdfvDCZEpMUnvZDsKMxfOisnEklpDFXc6ThY0WqybBYZbiwR5tWcFaZmI0G6b4vrg==} cpu: [arm64] os: [darwin] - '@unrs/resolver-binding-darwin-x64@1.7.2': - resolution: {integrity: sha512-qhVa8ozu92C23Hsmv0BF4+5Dyyd5STT1FolV4whNgbY6mj3kA0qsrGPe35zNR3wAN7eFict3s4Rc2dDTPBTuFQ==} + '@unrs/resolver-binding-darwin-x64@1.10.1': + resolution: {integrity: sha512-qYKGGm5wk71ONcXTMZ0+J11qQeOAPz3nw6VtqrBUUELRyXFyvK8cHhHsLBFR4GHnilc2pgY1HTB2TvdW9wO26Q==} cpu: [x64] os: [darwin] - '@unrs/resolver-binding-freebsd-x64@1.7.2': - resolution: {integrity: sha512-zKKdm2uMXqLFX6Ac7K5ElnnG5VIXbDlFWzg4WJ8CGUedJryM5A3cTgHuGMw1+P5ziV8CRhnSEgOnurTI4vpHpg==} + '@unrs/resolver-binding-freebsd-x64@1.10.1': + resolution: {integrity: sha512-hOHMAhbvIQ63gkpgeNsXcWPSyvXH7ZEyeg254hY0Lp/hX8NdW+FsUWq73g9946Pc/BrcVI/I3C1cmZ4RCX9bNw==} cpu: [x64] os: [freebsd] - '@unrs/resolver-binding-linux-arm-gnueabihf@1.7.2': - resolution: {integrity: sha512-8N1z1TbPnHH+iDS/42GJ0bMPLiGK+cUqOhNbMKtWJ4oFGzqSJk/zoXFzcQkgtI63qMcUI7wW1tq2usZQSb2jxw==} + '@unrs/resolver-binding-linux-arm-gnueabihf@1.10.1': + resolution: {integrity: sha512-6ds7+zzHJgTDmpe0gmFcOTvSUhG5oZukkt+cCsSb3k4Uiz2yEQB4iCRITX2hBwSW+p8gAieAfecITjgqCkswXw==} cpu: [arm] os: [linux] - '@unrs/resolver-binding-linux-arm-musleabihf@1.7.2': - resolution: {integrity: sha512-tjYzI9LcAXR9MYd9rO45m1s0B/6bJNuZ6jeOxo1pq1K6OBuRMMmfyvJYval3s9FPPGmrldYA3mi4gWDlWuTFGA==} + '@unrs/resolver-binding-linux-arm-musleabihf@1.10.1': + resolution: {integrity: sha512-P7A0G2/jW00diNJyFeq4W9/nxovD62Ay8CMP4UK9OymC7qO7rG1a8Upad68/bdfpIOn7KSp7Aj/6lEW3yyznAA==} cpu: [arm] os: [linux] - '@unrs/resolver-binding-linux-arm64-gnu@1.7.2': - resolution: {integrity: sha512-jon9M7DKRLGZ9VYSkFMflvNqu9hDtOCEnO2QAryFWgT6o6AXU8du56V7YqnaLKr6rAbZBWYsYpikF226v423QA==} + '@unrs/resolver-binding-linux-arm64-gnu@1.10.1': + resolution: {integrity: sha512-Cg6xzdkrpltcTPO4At+A79zkC7gPDQIgosJmVV8M104ImB6KZi1MrNXgDYIAfkhUYjPzjNooEDFRAwwPadS7ZA==} cpu: [arm64] os: [linux] - '@unrs/resolver-binding-linux-arm64-musl@1.7.2': - resolution: {integrity: sha512-c8Cg4/h+kQ63pL43wBNaVMmOjXI/X62wQmru51qjfTvI7kmCy5uHTJvK/9LrF0G8Jdx8r34d019P1DVJmhXQpA==} + '@unrs/resolver-binding-linux-arm64-musl@1.10.1': + resolution: {integrity: sha512-aNeg99bVkXa4lt+oZbjNRPC8ZpjJTKxijg/wILrJdzNyAymO2UC/HUK1UfDjt6T7U5p/mK24T3CYOi3/+YEQSA==} cpu: [arm64] os: [linux] - '@unrs/resolver-binding-linux-ppc64-gnu@1.7.2': - resolution: {integrity: sha512-A+lcwRFyrjeJmv3JJvhz5NbcCkLQL6Mk16kHTNm6/aGNc4FwPHPE4DR9DwuCvCnVHvF5IAd9U4VIs/VvVir5lg==} + '@unrs/resolver-binding-linux-ppc64-gnu@1.10.1': + resolution: {integrity: sha512-ylz5ojeXrkPrtnzVhpCO+YegG63/aKhkoTlY8PfMfBfLaUG8v6m6iqrL7sBUKdVBgOB4kSTUPt9efQdA/Y3Z/w==} cpu: [ppc64] os: [linux] - '@unrs/resolver-binding-linux-riscv64-gnu@1.7.2': - resolution: {integrity: sha512-hQQ4TJQrSQW8JlPm7tRpXN8OCNP9ez7PajJNjRD1ZTHQAy685OYqPrKjfaMw/8LiHCt8AZ74rfUVHP9vn0N69Q==} + '@unrs/resolver-binding-linux-riscv64-gnu@1.10.1': + resolution: {integrity: sha512-xcWyhmJfXXOxK7lvE4+rLwBq+on83svlc0AIypfe6x4sMJR+S4oD7n9OynaQShfj2SufPw2KJAotnsNb+4nN2g==} cpu: [riscv64] os: [linux] - '@unrs/resolver-binding-linux-riscv64-musl@1.7.2': - resolution: {integrity: sha512-NoAGbiqrxtY8kVooZ24i70CjLDlUFI7nDj3I9y54U94p+3kPxwd2L692YsdLa+cqQ0VoqMWoehDFp21PKRUoIQ==} + '@unrs/resolver-binding-linux-riscv64-musl@1.10.1': + resolution: {integrity: sha512-mW9JZAdOCyorgi1eLJr4gX7xS67WNG9XNPYj5P8VuttK72XNsmdw9yhOO4tDANMgiLXFiSFaiL1gEpoNtRPw/A==} cpu: [riscv64] os: [linux] - '@unrs/resolver-binding-linux-s390x-gnu@1.7.2': - resolution: {integrity: sha512-KaZByo8xuQZbUhhreBTW+yUnOIHUsv04P8lKjQ5otiGoSJ17ISGYArc+4vKdLEpGaLbemGzr4ZeUbYQQsLWFjA==} + '@unrs/resolver-binding-linux-s390x-gnu@1.10.1': + resolution: {integrity: sha512-NZGKhBy6xkJ0k09cWNZz4DnhBcGlhDd3W+j7EYoNvf5TSwj2K6kbmfqTWITEgkvjsMUjm1wsrc4IJaH6VtjyHQ==} cpu: [s390x] os: [linux] - '@unrs/resolver-binding-linux-x64-gnu@1.7.2': - resolution: {integrity: sha512-dEidzJDubxxhUCBJ/SHSMJD/9q7JkyfBMT77Px1npl4xpg9t0POLvnWywSk66BgZS/b2Hy9Y1yFaoMTFJUe9yg==} + '@unrs/resolver-binding-linux-x64-gnu@1.10.1': + resolution: {integrity: sha512-VsjgckJ0gNMw7p0d8In6uPYr+s0p16yrT2rvG4v2jUpEMYkpnfnCiALa9SWshbvlGjKQ98Q2x19agm3iFk8w8Q==} cpu: [x64] os: [linux] - '@unrs/resolver-binding-linux-x64-musl@1.7.2': - resolution: {integrity: sha512-RvP+Ux3wDjmnZDT4XWFfNBRVG0fMsc+yVzNFUqOflnDfZ9OYujv6nkh+GOr+watwrW4wdp6ASfG/e7bkDradsw==} + '@unrs/resolver-binding-linux-x64-musl@1.10.1': + resolution: {integrity: sha512-idMnajMeejnaFi0Mx9UTLSYFDAOTfAEP7VjXNgxKApso3Eu2Njs0p2V95nNIyFi4oQVGFmIuCkoznAXtF/Zbmw==} cpu: [x64] os: [linux] - '@unrs/resolver-binding-wasm32-wasi@1.7.2': - resolution: {integrity: sha512-y797JBmO9IsvXVRCKDXOxjyAE4+CcZpla2GSoBQ33TVb3ILXuFnMrbR/QQZoauBYeOFuu4w3ifWLw52sdHGz6g==} + '@unrs/resolver-binding-wasm32-wasi@1.10.1': + resolution: {integrity: sha512-7jyhjIRNFjzlr8x5pth6Oi9hv3a7ubcVYm2GBFinkBQKcFhw4nIs5BtauSNtDW1dPIGrxF0ciynCZqzxMrYMsg==} engines: {node: '>=14.0.0'} cpu: [wasm32] - '@unrs/resolver-binding-win32-arm64-msvc@1.7.2': - resolution: {integrity: sha512-gtYTh4/VREVSLA+gHrfbWxaMO/00y+34htY7XpioBTy56YN2eBjkPrY1ML1Zys89X3RJDKVaogzwxlM1qU7egg==} + '@unrs/resolver-binding-win32-arm64-msvc@1.10.1': + resolution: {integrity: sha512-TY79+N+Gkoo7E99K+zmsKNeiuNJYlclZJtKqsHSls8We2iGhgxtletVsiBYie93MSTDRDMI8pkBZJlIJSZPrdA==} cpu: [arm64] os: [win32] - '@unrs/resolver-binding-win32-ia32-msvc@1.7.2': - resolution: {integrity: sha512-Ywv20XHvHTDRQs12jd3MY8X5C8KLjDbg/jyaal/QLKx3fAShhJyD4blEANInsjxW3P7isHx1Blt56iUDDJO3jg==} + '@unrs/resolver-binding-win32-ia32-msvc@1.10.1': + resolution: {integrity: sha512-BAJN5PEPlEV+1m8+PCtFoKm3LQ1P57B4Z+0+efU0NzmCaGk7pUaOxuPgl+m3eufVeeNBKiPDltG0sSB9qEfCxw==} cpu: [ia32] os: [win32] - '@unrs/resolver-binding-win32-x64-msvc@1.7.2': - resolution: {integrity: sha512-friS8NEQfHaDbkThxopGk+LuE5v3iY0StruifjQEt7SLbA46OnfgMO15sOTkbpJkol6RB+1l1TYPXh0sCddpvA==} + '@unrs/resolver-binding-win32-x64-msvc@1.10.1': + resolution: {integrity: sha512-2v3erKKmmCyIVvvhI2nF15qEbdBpISTq44m9pyd5gfIJB1PN94oePTLWEd82XUbIbvKhv76xTSeUQSCOGesLeg==} cpu: [x64] os: [win32] - '@vitest/eslint-plugin@1.1.44': - resolution: {integrity: sha512-m4XeohMT+Dj2RZfxnbiFR+Cv5dEC0H7C6TlxRQT7GK2556solm99kxgzJp/trKrZvanZcOFyw7aABykUTfWyrg==} + '@vitest/eslint-plugin@1.3.4': + resolution: {integrity: sha512-EOg8d0jn3BAiKnR55WkFxmxfWA3nmzrbIIuOXyTe6A72duryNgyU+bdBEauA97Aab3ho9kLmAwgPX63Ckj4QEg==} peerDependencies: - '@typescript-eslint/utils': '>= 8.24.0' eslint: '>= 8.57.0' typescript: '>= 5.0.0' vitest: '*' @@ -1522,34 +1560,34 @@ packages: vitest: optional: true - '@vitest/expect@3.1.3': - resolution: {integrity: sha512-7FTQQuuLKmN1Ig/h+h/GO+44Q1IlglPlR2es4ab7Yvfx+Uk5xsv+Ykk+MEt/M2Yn/xGmzaLKxGw2lgy2bwuYqg==} + '@vitest/expect@3.2.4': + resolution: {integrity: sha512-Io0yyORnB6sikFlt8QW5K7slY4OjqNX9jmJQ02QDda8lyM6B5oNgVWoSoKPac8/kgnCUzuHQKrSLtu/uOqqrig==} - '@vitest/mocker@3.1.3': - resolution: {integrity: sha512-PJbLjonJK82uCWHjzgBJZuR7zmAOrSvKk1QBxrennDIgtH4uK0TB1PvYmc0XBCigxxtiAVPfWtAdy4lpz8SQGQ==} + '@vitest/mocker@3.2.4': + resolution: {integrity: sha512-46ryTE9RZO/rfDd7pEqFl7etuyzekzEhUbTW3BvmeO/BcCMEgq59BKhek3dXDWgAj4oMK6OZi+vRr1wPW6qjEQ==} peerDependencies: msw: ^2.4.9 - vite: ^5.0.0 || ^6.0.0 + vite: ^5.0.0 || ^6.0.0 || ^7.0.0-0 peerDependenciesMeta: msw: optional: true vite: optional: true - '@vitest/pretty-format@3.1.3': - resolution: {integrity: sha512-i6FDiBeJUGLDKADw2Gb01UtUNb12yyXAqC/mmRWuYl+m/U9GS7s8us5ONmGkGpUUo7/iAYzI2ePVfOZTYvUifA==} + '@vitest/pretty-format@3.2.4': + resolution: {integrity: sha512-IVNZik8IVRJRTr9fxlitMKeJeXFFFN0JaB9PHPGQ8NKQbGpfjlTx9zO4RefN8gp7eqjNy8nyK3NZmBzOPeIxtA==} - '@vitest/runner@3.1.3': - resolution: {integrity: sha512-Tae+ogtlNfFei5DggOsSUvkIaSuVywujMj6HzR97AHK6XK8i3BuVyIifWAm/sE3a15lF5RH9yQIrbXYuo0IFyA==} + '@vitest/runner@3.2.4': + resolution: {integrity: sha512-oukfKT9Mk41LreEW09vt45f8wx7DordoWUZMYdY/cyAk7w5TWkTRCNZYF7sX7n2wB7jyGAl74OxgwhPgKaqDMQ==} - '@vitest/snapshot@3.1.3': - resolution: {integrity: sha512-XVa5OPNTYUsyqG9skuUkFzAeFnEzDp8hQu7kZ0N25B1+6KjGm4hWLtURyBbsIAOekfWQ7Wuz/N/XXzgYO3deWQ==} + '@vitest/snapshot@3.2.4': + resolution: {integrity: sha512-dEYtS7qQP2CjU27QBC5oUOxLE/v5eLkGqPE0ZKEIDGMs4vKWe7IjgLOeauHsR0D5YuuycGRO5oSRXnwnmA78fQ==} - '@vitest/spy@3.1.3': - resolution: {integrity: sha512-x6w+ctOEmEXdWaa6TO4ilb7l9DxPR5bwEb6hILKuxfU1NqWT2mpJD9NJN7t3OTfxmVlOMrvtoFJGdgyzZ605lQ==} + '@vitest/spy@3.2.4': + resolution: {integrity: sha512-vAfasCOe6AIK70iP5UD11Ac4siNUNJ9i/9PZ3NKx07sG6sUxeag1LWdNrMWeKKYBLlzuK+Gn65Yd5nyL6ds+nw==} - '@vitest/utils@3.1.3': - resolution: {integrity: sha512-2Ltrpht4OmHO9+c/nmHtF09HWiyWdworqnHIwjfvDyWjuwKbdkcS9AnhsDn+8E2RM4x++foD1/tNuLPVvWG1Rg==} + '@vitest/utils@3.2.4': + resolution: {integrity: sha512-fB2V0JFrQSMsCo9HiSq3Ezpdv4iYaXRG1Sx8edX3MwxfyNn83mKiGzOcH+Fkxt4MHxr3y42fQi1oeAInqgX2QA==} '@xmldom/xmldom@0.9.8': resolution: {integrity: sha512-p96FSY54r+WJ50FIOsCOjyj/wavs8921hG5+kVMmZgKcvIKxMXHTrjNJvRgWa/zuX3B6t2lijLNFaOyuxUH+2A==} @@ -1569,17 +1607,13 @@ 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-jsx@5.3.2: resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} peerDependencies: acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 - acorn@8.14.1: - resolution: {integrity: sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==} + acorn@8.15.0: + resolution: {integrity: sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==} engines: {node: '>=0.4.0'} hasBin: true @@ -1633,9 +1667,9 @@ packages: resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} engines: {node: '>=12'} - ansis@4.0.0: - resolution: {integrity: sha512-P8nrHI1EyW9OfBt1X7hMSwGN2vwRuqHSKJAT1gbLWZRzDa24oHjYwGHvEgHeBepupzk878yS/HBZ0NMPYtbolw==} - engines: {node: '>=14'} + ansis@4.0.0-node10: + resolution: {integrity: sha512-BRrU0Bo1X9dFGw6KgGz6hWrqQuOlVEDOzkb0QSLZY9sXHqA7pNj7yHPVJRz7y/rj4EOJ3d/D5uxH+ee9leYgsg==} + engines: {node: '>=10'} anymatch@3.1.3: resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} @@ -1661,8 +1695,8 @@ packages: resolution: {integrity: sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==} engines: {node: '>= 0.4'} - array-includes@3.1.8: - resolution: {integrity: sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==} + array-includes@3.1.9: + resolution: {integrity: sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ==} engines: {node: '>= 0.4'} array-iterate@2.0.1: @@ -1728,8 +1762,8 @@ packages: avvio@9.1.0: resolution: {integrity: sha512-fYASnYi600CsH/j9EQov7lECAniYiBFiiAtBNuZYLA2leLe9qOvZzqYHFjtIj6gD2VMoMLP14834LFWvr4IfDw==} - axios@1.9.0: - resolution: {integrity: sha512-re4CqKTJaURpzbLHtIi6XpDv20/CnpXOtjRY5/CU32L8gU8ek9UIivcfvSWvmKEngmVbrUtPpdDwWDWL7DNHvg==} + axios@1.10.0: + resolution: {integrity: sha512-/1xYAC4MP/HEG+3duIhFr4ZQXR4sQXOIe+o6sdqzeykGLx6Upp/1p8MHqhINOvGeP7xyNHe7tsiJByc4SSVUxw==} bail@2.0.2: resolution: {integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==} @@ -1762,19 +1796,15 @@ packages: bodec@0.1.0: resolution: {integrity: sha512-Ylo+MAo5BDUq1KA3f3R/MFhh+g8cnHmo8bz3YPGhI1znrMaf77ol1sfvYJzsw3nTE+Y2GryfDxBaR+AqpAkEHQ==} - body-parser@2.2.0: - resolution: {integrity: sha512-02qvAaxv8tp7fBa/mw1ga98OGm+eCbqzJOKoRt70sLmfEEi+jyBYVTDGfCL/k06/4EMk/z01gCe7HoCH/f2LTg==} - engines: {node: '>=18'} - boxen@7.0.0: resolution: {integrity: sha512-j//dBVuyacJbvW+tvZ9HuH03fZ46QcaKvvhZickZqtB271DxJ7SNRSNxrV/dZX0085m7hISRZWbzWlJvx/rHSg==} engines: {node: '>=14.16'} - brace-expansion@1.1.11: - resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + brace-expansion@1.1.12: + resolution: {integrity: sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==} - brace-expansion@2.0.1: - resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + brace-expansion@2.0.2: + resolution: {integrity: sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==} braces@3.0.3: resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} @@ -1783,18 +1813,10 @@ packages: buffer-from@1.1.2: resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} - busboy@1.6.0: - resolution: {integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==} - engines: {node: '>=10.16.0'} - bytes@3.0.0: resolution: {integrity: sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==} engines: {node: '>= 0.8'} - bytes@3.1.2: - resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} - engines: {node: '>= 0.8'} - cac@6.7.14: resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} engines: {node: '>=8'} @@ -1819,8 +1841,8 @@ packages: resolution: {integrity: sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw==} engines: {node: '>=14.16'} - caniuse-lite@1.0.30001718: - resolution: {integrity: sha512-AflseV1ahcSunK53NfEs9gFWgOEmzr0f+kaMFA4xiLZlr9Hzt7HxcSpIFcnNCUkz6R6dWKa54rUz3HUmI3nVcw==} + caniuse-lite@1.0.30001726: + resolution: {integrity: sha512-VQAUIUzBiZ/UnlM28fSp2CRF3ivUn1BWEvxMcVTNwpw91Py1pGbPIyIKtd+tzct9C3ouceCVdGAXxZOpZAsgdw==} ccount@2.0.1: resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} @@ -1992,22 +2014,6 @@ packages: resolution: {integrity: sha512-kRGRZw3bLlFISDBgwTSA1TMBFN6J6GWDeubmDE3AF+3+yXL8hTWv8r5rkLbqYXY4RjPk/EzHnClI3zQf1cFmHA==} engines: {node: '>= 0.6'} - content-disposition@1.0.0: - resolution: {integrity: sha512-Au9nRL8VNUut/XSzbQA38+M78dzP4D+eqg3gfJHMIHHYa3bg067xj1KxMUWj+VULbiZMowKngFFbKczUrNJ1mg==} - engines: {node: '>= 0.6'} - - content-type@1.0.5: - resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} - engines: {node: '>= 0.6'} - - cookie-signature@1.2.2: - resolution: {integrity: sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==} - engines: {node: '>=6.6.0'} - - cookie@0.7.2: - resolution: {integrity: sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==} - engines: {node: '>= 0.6'} - cookie@1.0.2: resolution: {integrity: sha512-9Kr/j4O16ISv8zBBhJoi4bXOYNTkFLOqSL3UDB0njXxCXNezjeyVrJyGOWtgfs/q2km1gwBcfH8q1yEGoMYunA==} engines: {node: '>=18'} @@ -2016,10 +2022,6 @@ packages: resolution: {integrity: sha512-yCEafptTtb4bk7GLEQoM8KVJpxAfdBJYaXyzQEgQQQgYrZiDp8SJmGKlYza6CYjEDNstAdNdKA3UuoULlEbS6w==} engines: {node: '>=12.13'} - cors@2.8.5: - resolution: {integrity: sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==} - engines: {node: '>= 0.10'} - cose-base@1.0.3: resolution: {integrity: sha512-s9whTXInMSgAp/NVXVNuVxVKzGH2qck3aQlVHxDCdAEPgtMKwc4Wq6/QKhgdEdgbLSi9rBTAcPoRa6JpiG4ksg==} @@ -2254,8 +2256,8 @@ packages: supports-color: optional: true - decode-named-character-reference@1.1.0: - resolution: {integrity: sha512-Wy+JTSbFThEOXQIR2L6mxJvEs+veIzpmqD7ynWxMXGpnk3smkHQOp6forLdHsKpAMW9iJpaBBIxz285t1n1C3w==} + decode-named-character-reference@1.2.0: + resolution: {integrity: sha512-c6fcElNV6ShtZXmsgNgFFV5tVX2PaV4g+MOAkb8eXHvn6sryJBrZa9r0zV6+dtTyoCKxtDy5tyQ5ZwQuidtd+Q==} deep-eql@5.0.2: resolution: {integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==} @@ -2287,10 +2289,6 @@ packages: resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} engines: {node: '>=0.4.0'} - depd@2.0.0: - resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} - engines: {node: '>= 0.8'} - dequal@2.0.3: resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} engines: {node: '>=6'} @@ -2326,8 +2324,8 @@ packages: resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} engines: {node: '>=0.10.0'} - dompurify@3.2.5: - resolution: {integrity: sha512-mLPd29uoRe9HpvwP2TxClGQBzGXeEC/we/q+bFlmPPmj2p2Ugl3r6ATu/UU1v77DXNcehiBg9zsr1dREyA/dJQ==} + dompurify@3.2.6: + resolution: {integrity: sha512-/2GogDQlohXPZe6D6NOgQvXLPSYBqIWMnZ8zzOhn09REE4eyAzb+Hed3jhoM9OkuaJ8P6ZGTTVWQKAi8ieIzfQ==} dotenv-cli@8.0.0: resolution: {integrity: sha512-aLqYbK7xKOiTMIRf1lDPbI+Y+Ip/wo5k3eyp6ePysVaSqbyxjyK3dK35BTxG+rmd7djf5q2UPs4noPNH+cj0Qw==} @@ -2341,8 +2339,8 @@ packages: resolution: {integrity: sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ==} engines: {node: '>=12'} - dotenv@16.5.0: - resolution: {integrity: sha512-m/C+AwOAr9/W1UOIZUo232ejMNnJAJtYQjUbHoNTBNTJSvqzzDh7vnrei3o3r3m9blf6ZoDkvcw0VmozNRFJxg==} + dotenv@16.6.1: + resolution: {integrity: sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==} engines: {node: '>=12'} dunder-proto@1.0.1: @@ -2352,9 +2350,6 @@ packages: eastasianwidth@0.2.0: resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} - ee-first@1.1.1: - resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} - emoji-regex-xs@1.0.0: resolution: {integrity: sha512-LRlerrMYoIDrT6jgpeZ2YYl/L8EulRTt5hQcYjy5AInh7HWXKimpqx68aknBFpGL2+/IcogTcaydJEgaTmOpDg==} @@ -2367,12 +2362,8 @@ packages: emoji-regex@9.2.2: resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} - encodeurl@2.0.0: - resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==} - engines: {node: '>= 0.8'} - - end-of-stream@1.4.4: - resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} + end-of-stream@1.4.5: + resolution: {integrity: sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==} enquirer@2.3.6: resolution: {integrity: sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==} @@ -2382,8 +2373,8 @@ packages: resolution: {integrity: sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==} engines: {node: '>=8.6'} - entities@6.0.0: - resolution: {integrity: sha512-aKstq2TDOndCn4diEyp9Uq/Flu2i1GlLkc6XIDQSDMuaFE3OPW5OphLCyQ5SpSJZTb4reN+kTcYru5yIfXoRPw==} + entities@6.0.1: + resolution: {integrity: sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==} engines: {node: '>=0.12'} err-code@2.0.3: @@ -2392,8 +2383,8 @@ packages: error-ex@1.3.2: resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} - es-abstract@1.23.9: - resolution: {integrity: sha512-py07lI0wjxAC/DcfK1S6G7iANonniZwTISvdPzk9hzeH0IZIshbuuFxLIU96OyF89Yb9hiqWn8M/bY83KY5vzA==} + es-abstract@1.24.0: + resolution: {integrity: sha512-WSzPgsdLtTcQwm4CROfS5ju2Wa1QQcVeT37jFjYzdFz1r9ahadC8B8/a4qxJxM+09F18iumCdRmlr96ZYkQvEg==} engines: {node: '>= 0.4'} es-define-property@1.0.1: @@ -2433,14 +2424,11 @@ packages: esast-util-from-js@2.0.1: resolution: {integrity: sha512-8Ja+rNJ0Lt56Pcf3TAmpBZjmx8ZcK5Ts4cAzIOjsjevg9oSXJnl6SUQ2EevU8tv3h6ZLWmoKL5H4fgWvdvfETw==} - esbuild@0.25.4: - resolution: {integrity: sha512-8pgjLUcUjcgDg+2Q4NYXnPbo/vncAY4UmyaCm0jZevERqCHZIaWwdJHkf8XQtu4AxSKCdvrUbT0XUr1IdZzI8Q==} + esbuild@0.25.5: + resolution: {integrity: sha512-P8OtKZRv/5J5hhz0cUAdu/cLuPIKXpQl1R9pZtvmHWQvrAUVd0UNIPT4IB4W3rNOqVO0rlqHmCIbSwxh/c9yUQ==} engines: {node: '>=18'} hasBin: true - escape-html@1.0.3: - resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} - escape-string-regexp@4.0.0: resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} engines: {node: '>=10'} @@ -2460,11 +2448,17 @@ packages: peerDependencies: eslint: '>=7.0.0' - eslint-import-resolver-node@0.3.9: - resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==} + eslint-import-context@0.1.9: + resolution: {integrity: sha512-K9Hb+yRaGAGUbwjhFNHvSmmkZs9+zbuoe3kFQ4V1wYjrepUFYM2dZAfNtjbbj3qsPfUfsA68Bx/ICWQMi+C8Eg==} + engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} + peerDependencies: + unrs-resolver: ^1.0.0 + peerDependenciesMeta: + unrs-resolver: + optional: true - eslint-import-resolver-typescript@4.3.4: - resolution: {integrity: sha512-buzw5z5VtiQMysYLH9iW9BV04YyZebsw+gPi+c4FCjfS9i6COYOrEWw9t3m3wA9PFBfqcBCqWf32qrXLbwafDw==} + eslint-import-resolver-typescript@4.4.4: + resolution: {integrity: sha512-1iM2zeBvrYmUNTj2vSC/90JTHDth+dfOfiNKkxApWRsTJYNrc8rOdxxIf5vazX+BiAXTeOT0UvWpGI/7qIWQOw==} engines: {node: ^16.17.0 || >=18.6.0} peerDependencies: eslint: '*' @@ -2476,8 +2470,8 @@ packages: eslint-plugin-import-x: optional: true - eslint-mdx@3.4.1: - resolution: {integrity: sha512-/Pt9D5TIAZwAUnCJA24i+uE9NuqulmLI58a1oU1eRb5jeUNOR23FpIt4xuBE9CFR50nd4FkLnuyox7dSNSZ5Tg==} + eslint-mdx@3.6.0: + resolution: {integrity: sha512-D1YKiLODSJmNK5+zOGqk5gU4lXEXCImUgT8uChDFgcwZYFYNUT71r+sOyLc0tYhTbuHg+tTOSkgSxJUhVon1Yg==} engines: {node: '>=18.0.0'} peerDependencies: eslint: '>=8.0.0' @@ -2486,26 +2480,33 @@ packages: remark-lint-file-extension: optional: true - eslint-plugin-check-file@3.2.0: - resolution: {integrity: sha512-jHT3ZkSlazbxNdMhlfS3MotIfSHyNX8Kw0XQ0V7qNaum1Cq3wqEVHJAIwzBNG5JTqjRRBfXClX9pYqsJoNjAMw==} + eslint-plugin-check-file@3.3.0: + resolution: {integrity: sha512-D57NBJRZt/8KzROsYgvRJzzItztWsP5B/9TssGhLHrrZzOMIFDn3RLnZN4kD7i5B4FduR040eOEqzKEcfFA9mQ==} engines: {node: '>=18'} peerDependencies: eslint: '>=9.0.0' - eslint-plugin-import-x@4.11.1: - resolution: {integrity: sha512-CiqREASJRnhwCB0NujkTdo4jU+cJAnhQrd4aCnWC1o+rYWIWakVbyuzVbnCriUUSLAnn5CoJ2ob36TEgNzejBQ==} + eslint-plugin-import-x@4.16.1: + resolution: {integrity: sha512-vPZZsiOKaBAIATpFE2uMI4w5IRwdv/FpQ+qZZMR4E+PeOcM4OeoEbqxRMnywdxP19TyB/3h6QBB0EWon7letSQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: + '@typescript-eslint/utils': ^8.0.0 eslint: ^8.57.0 || ^9.0.0 + eslint-import-resolver-node: '*' + peerDependenciesMeta: + '@typescript-eslint/utils': + optional: true + eslint-import-resolver-node: + optional: true - eslint-plugin-jsdoc@50.6.17: - resolution: {integrity: sha512-hq+VQylhd12l8qjexyriDsejZhqiP33WgMTy2AmaGZ9+MrMWVqPECsM87GPxgHfQn0zw+YTuhqjUfk1f+q67aQ==} - engines: {node: '>=18'} + eslint-plugin-jsdoc@51.3.3: + resolution: {integrity: sha512-8XK/9wncTh4PPntQfM4iYJ2v/kvX4qsfBzp+dTnyxpERWhl2R9hEJw1ihws+yAecg9CC6ExTfMInEg3wSK9kWA==} + engines: {node: '>=20.11.0'} peerDependencies: eslint: ^7.0.0 || ^8.0.0 || ^9.0.0 - eslint-plugin-mdx@3.4.1: - resolution: {integrity: sha512-dfQ7LthK/Kmfw2d5XrR4CS1ScmFOa1S9vPjBUxtKgCEl6mNnYVfA/yg50xLyab0pI/GEfGEmvlajs2biDHJBsA==} + eslint-plugin-mdx@3.6.0: + resolution: {integrity: sha512-q+OYdm/9QemwvxxMGmLFAJPx62l4V/38+Gk1wgRC8unnzF14sFgmCplrfuSQBUv5cndNd97xDuZO+83qM2n30A==} engines: {node: '>=18.0.0'} peerDependencies: eslint: '>=8.0.0' @@ -2526,26 +2527,26 @@ packages: peerDependencies: eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7 - eslint-plugin-turbo@2.5.3: - resolution: {integrity: sha512-DlXZd+LgpDlxH/6IsiAXLhy82x0jeJDm0XBEqP6Le08uy0HBQkjCUt7SmXNp8esAtX9RYe6oDClbNbmI1jtK5g==} + eslint-plugin-turbo@2.5.4: + resolution: {integrity: sha512-IZsW61DFj5mLMMaCJxhh1VE4HvNhfdnHnAaXajgne+LUzdyHk2NvYT0ECSa/1SssArcqgTvV74MrLL68hWLLFw==} peerDependencies: eslint: '>6.6.0' turbo: '>2.0.0' - eslint-scope@8.3.0: - resolution: {integrity: sha512-pUNxi75F8MJ/GdeKtVLSbYg4ZI34J6C0C7sbL4YOp2exGwen7ZsuBqKzUhXd0qMQ362yET3z+uPwKeg/0C2XCQ==} + eslint-scope@8.4.0: + resolution: {integrity: sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} eslint-visitor-keys@3.4.3: resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - eslint-visitor-keys@4.2.0: - resolution: {integrity: sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==} + eslint-visitor-keys@4.2.1: + resolution: {integrity: sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - eslint@9.26.0: - resolution: {integrity: sha512-Hx0MOjPh6uK9oq9nVsATZKE/Wlbai7KFjfCuw9UHaguDW3x+HF0O5nIi3ud39TWgrTjTO5nHxmL3R1eANinWHQ==} + eslint@9.30.1: + resolution: {integrity: sha512-zmxXPNMOXmwm9E0yQLi5uqXHs7uq2UIiqEKo3Gq+3fwo1XrJ+hijAZImyF7hclW3E6oHz43Yk3RP8at6OTKflQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} hasBin: true peerDependencies: @@ -2558,8 +2559,8 @@ packages: resolution: {integrity: sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA==} engines: {node: '>=6'} - espree@10.3.0: - resolution: {integrity: sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==} + espree@10.4.0: + resolution: {integrity: sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} esprima@4.0.1: @@ -2610,24 +2611,12 @@ packages: resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} engines: {node: '>=0.10.0'} - etag@1.8.1: - resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} - engines: {node: '>= 0.6'} - eventemitter2@5.0.1: resolution: {integrity: sha512-5EM1GHXycJBS6mauYAbVKT1cVs7POKWb2NXD4Vyt8dDqeZa7LaDK1/sjtL+Zb0lzTpSNil4596Dyu97hz37QLg==} eventemitter2@6.4.9: resolution: {integrity: sha512-JEPTiaOt9f04oa6NOkc4aH+nVp5I3wEjpHbIPqfgCdD5v5bUzy7xQqwcVO2aDQgOWhI28da57HksMrzK9HlRxg==} - eventsource-parser@3.0.2: - resolution: {integrity: sha512-6RxOBZ/cYgd8usLwsEl+EC09Au/9BcmCKYF2/xbml6DNczf7nv0MQb+7BA2F+li6//I+28VNlQR37XfQtcAJuA==} - engines: {node: '>=18.0.0'} - - eventsource@3.0.7: - resolution: {integrity: sha512-CRT1WTyuQoD771GW56XEZFQ/ZoSfWid1alKGDYMmkt2yl8UXrVR4pspqWNEcqKvVIzg6PAltWjxcSSPrboA4iA==} - engines: {node: '>=18.0.0'} - execa@5.1.1: resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} engines: {node: '>=10'} @@ -2640,18 +2629,8 @@ packages: resolution: {integrity: sha512-/kP8CAwxzLVEeFrMm4kMmy4CCDlpipyA7MYLVrdJIkV0fYF0UaigQHRsxHiuY/GEea+bh4KSv3TIlgr+2UL6bw==} engines: {node: '>=12.0.0'} - express-rate-limit@7.5.0: - resolution: {integrity: sha512-eB5zbQh5h+VenMPM3fh+nw1YExi5nMr6HUCR62ELSP11huvxm/Uir1H1QEyTkk5QX6A58pX6NmaTMceKZ0Eodg==} - engines: {node: '>= 16'} - peerDependencies: - express: ^4.11 || 5 || ^5.0.0-beta.1 - - express@5.1.0: - resolution: {integrity: sha512-DT9ck5YIRU+8GYzzU5kT3eHGA5iL+1Zd0EutOmTE9Dtk+Tvuzd23VBU+ec7HPNSTxXYO55gPV/hq4pSBJDjFpA==} - engines: {node: '>= 18'} - - exsolve@1.0.5: - resolution: {integrity: sha512-pz5dvkYYKQ1AHVrgOzBKWeP4u4FRb3a6DNK2ucr0OoNwYIU4QWsJ+NM36LLzORT+z845MzKHHhpXiUF5nvQoJg==} + exsolve@1.0.7: + resolution: {integrity: sha512-VO5fQUzZtI6C+vx4w/4BWJpg3s/5l+6pRQEHzFRM8WFi4XffSP1Z+4qi7GbjWbvRQEbdIco5mIMq+zX4rPuLrw==} extend@3.0.2: resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} @@ -2708,8 +2687,8 @@ packages: fast-uri@3.0.6: resolution: {integrity: sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw==} - fastify@5.3.3: - resolution: {integrity: sha512-nCBiBCw9q6jPx+JJNVgO8JVnTXeUyrGcyTKPQikRkA/PanrFcOIo4R+ZnLeOLPZPGgzjomqfVarzE0kYx7qWiQ==} + fastify@5.4.0: + resolution: {integrity: sha512-I4dVlUe+WNQAhKSyv15w+dwUh2EPiEl4X2lGYMmNSgF83WzTMAPKGdWEv5tPsCQOb+SOZwz8Vlta2vF+OeDgRw==} fastq@1.19.1: resolution: {integrity: sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==} @@ -2720,8 +2699,8 @@ packages: fclone@1.0.11: resolution: {integrity: sha512-GDqVQezKzRABdeqflsgMr7ktzgF9CyS+p2oe0jJqUY6izSSbhPIQJDpoU4PtGcD7VPM9xh/dVrTu6z1nwgmEGw==} - fdir@6.4.4: - resolution: {integrity: sha512-1NZP+GK4GfuAv3PqKvxQRDMjdSRZjnkq7KfhlNrCNNlZ0ygQFpebfrnfnq/W7fpUnAv9aGWmY1zKx7FYL3gwhg==} + fdir@6.4.6: + resolution: {integrity: sha512-hiFoqpyZcfNm1yc4u8oWCf9A2c4D3QjCrks3zmoVKVxpQRzmPNar1hUJcBG2RQHvEVGDN+Jm81ZheVLAQMK6+w==} peerDependencies: picomatch: ^3 || ^4 peerDependenciesMeta: @@ -2736,10 +2715,6 @@ packages: resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} engines: {node: '>=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'} @@ -2776,22 +2751,14 @@ packages: resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==} engines: {node: '>=14'} - form-data@4.0.2: - resolution: {integrity: sha512-hGfm/slu0ZabnNt4oaRZ6uREyfCj6P4fT/n6A1rGV+Z0VdGXjfOhVUpkn6qVQONHGIFwmveGXyDs75+nr6FM8w==} + form-data@4.0.3: + resolution: {integrity: sha512-qsITQPfmvMOSAdeyZ+12I1c+CKSstAFAwu+97zrnWAbIr5u8wfsExUzCesVLC8NgHuRUqNN4Zy6UPWUTRGslcA==} engines: {node: '>= 6'} format@0.2.2: resolution: {integrity: sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww==} engines: {node: '>=0.4.x'} - forwarded@0.2.0: - resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} - engines: {node: '>= 0.6'} - - fresh@2.0.0: - resolution: {integrity: sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==} - engines: {node: '>= 0.8'} - fs-extra@7.0.1: resolution: {integrity: sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==} engines: {node: '>=6 <7 || >=8'} @@ -2840,8 +2807,8 @@ packages: resolution: {integrity: sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==} engines: {node: '>= 0.4'} - get-tsconfig@4.10.0: - resolution: {integrity: sha512-kGzZ3LWWQcGIAmg6iWvXn0ei6WDtV26wzHRMwDSzmAbcXrTEXxHy6IehI6/4eT6VRKyMP1eF1VqwrVUmE/LR7A==} + get-tsconfig@4.10.1: + resolution: {integrity: sha512-auHyJ4AgMz7vgS8Hp3N6HXSmlMdUyhSUrfBF16w153rxtLIEOE+HGqaBppczZvnHLqQJfiHotCYpNhl0lUROFQ==} get-uri@6.0.4: resolution: {integrity: sha512-E1b1lFFLvLgak2whF2xDBcOy6NLVGZBqqjJjsIhvopKfWWEi64pLVTWWehV8KlLerZkfNTA95sTe2OdJKm1OzQ==} @@ -2884,8 +2851,8 @@ packages: resolution: {integrity: sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==} engines: {node: '>=18'} - globals@16.1.0: - resolution: {integrity: sha512-aibexHNbb/jiUSObBgpHLj+sIuUmJnYcgXBlrfsiDZ9rt4aF2TFRbyLgZ2iFQuVZ1K5Mx3FVkbKRSgKrbK3K2g==} + globals@16.3.0: + resolution: {integrity: sha512-bqWEnJ1Nt3neqx2q5SFfGS8r/ahumIakg3HcwtNlrVlwXIeNumWn/c7Pn/wKzGhf6SaW6H6uWXLqC30STCMchQ==} engines: {node: '>=18'} globalthis@1.0.4: @@ -2991,10 +2958,6 @@ packages: html-void-elements@3.0.0: resolution: {integrity: sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==} - http-errors@2.0.0: - resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} - engines: {node: '>= 0.8'} - http-proxy-agent@7.0.2: resolution: {integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==} engines: {node: '>= 14'} @@ -3031,8 +2994,8 @@ packages: resolution: {integrity: sha512-InwqeHHN2XpumIkMvpl/DCJVrAHgCsG5+cn1XlnLWGwtZBm8QJfSusItfrwx81CTp5agNZqpKU2J/ccC5nGT4A==} engines: {node: '>= 4'} - ignore@7.0.4: - resolution: {integrity: sha512-gJzzk+PQNznz8ysRrC0aOkBNVRBDtE1n53IqyqEf3PXrYwomFs5q4pGMizBMJF+ykh03insJ27hB8gSrD2Hn8A==} + ignore@7.0.5: + resolution: {integrity: sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==} engines: {node: '>= 4'} import-fresh@3.3.1: @@ -3074,10 +3037,6 @@ packages: resolution: {integrity: sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==} engines: {node: '>= 12'} - ipaddr.js@1.9.1: - resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} - engines: {node: '>= 0.10'} - ipaddr.js@2.2.0: resolution: {integrity: sha512-Ag3wB2o37wslZS19hZqorUnrnzSkpOVy+IiiDEiTqNubEYpYuHWIf6K4psgN2ZWKExS4xhVCrRVfb/wfW8fWJA==} engines: {node: '>= 10'} @@ -3181,6 +3140,10 @@ packages: resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==} engines: {node: '>= 0.4'} + is-negative-zero@2.0.3: + resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==} + engines: {node: '>= 0.4'} + is-number-object@1.1.1: resolution: {integrity: sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==} engines: {node: '>= 0.4'} @@ -3197,9 +3160,6 @@ packages: resolution: {integrity: sha512-9UoipoxYmSk6Xy7QFgRv2HDyaysmgSG75TFQs6S+3pDM7ZhKTF/bskZV+0UlABHzKjNVhPjYCLfeZUEg1wXxig==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - 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'} @@ -3295,6 +3255,9 @@ packages: js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + js-tokens@9.0.1: + resolution: {integrity: sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==} + js-yaml@3.14.1: resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} hasBin: true @@ -3411,8 +3374,8 @@ packages: resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} hasBin: true - loupe@3.1.3: - resolution: {integrity: sha512-kkIp7XSkP78ZxJEsSxW3712C6teJVoeHHwgo9zJ380de7IYyJ2ISlxojcH2pC5OFLewESmnRi/+XCDIEEVyoug==} + loupe@3.1.4: + resolution: {integrity: sha512-wJzkKwJrheKtknCOKNEtDK4iqg/MxmZheEMtSTYvnzRdEYaZzmgH976nenp8WdJRdx5Vc1X/9MO0Oszl6ezeXg==} lru-cache@10.4.3: resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} @@ -3439,8 +3402,8 @@ packages: markdown-table@3.0.4: resolution: {integrity: sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==} - marked@15.0.11: - resolution: {integrity: sha512-1BEXAU2euRCG3xwgLVT1y0xbJEld1XOrmRJpUwRCcy7rxhSCwMrmEu9LXoPhHSCJG41V7YcQ2mjKRr5BA3ITIA==} + marked@15.0.12: + resolution: {integrity: sha512-8dD6FusOQSrpv9Z1rdNMdlSgQOIP880DHqnohobOmYLElGEqAL/JvxvuxZO16r4HtjTlfPRDC1hbvxC9dPN2nA==} engines: {node: '>= 18'} hasBin: true @@ -3505,14 +3468,6 @@ packages: mdast-util-to-string@4.0.0: resolution: {integrity: sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==} - media-typer@1.1.0: - resolution: {integrity: sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==} - engines: {node: '>= 0.8'} - - 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==} @@ -3520,8 +3475,8 @@ packages: resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} engines: {node: '>= 8'} - mermaid@11.6.0: - resolution: {integrity: sha512-PE8hGUy1LDlWIHWBP05SFdqUHGmRcCcK4IzpOKPE35eOw+G9zZgcnMpyunJVUEOgb//KBORPjysKndw8bFLuRg==} + mermaid@11.8.0: + resolution: {integrity: sha512-uAZUwnBiqREZcUrFw3G5iQ5Pj3hTYUP95EZc3ec/nGBzHddJZydzYGE09tGZDBS1VoSoDn0symZ85FmypSTo5g==} mhchemparser@4.2.1: resolution: {integrity: sha512-kYmyrCirqJf3zZ9t/0wGgRZ4/ZJw//VwaRVGA75C4nhE60vtnIzhl9J9ndkX/h6hxSN7pjg/cE0VxbnNM+bnDQ==} @@ -3661,10 +3616,6 @@ packages: resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} engines: {node: '>= 0.6'} - mime-types@3.0.1: - resolution: {integrity: sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==} - engines: {node: '>= 0.6'} - mimic-fn@2.1.0: resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} engines: {node: '>=6'} @@ -3673,8 +3624,8 @@ packages: resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} engines: {node: '>=12'} - minimatch@10.0.1: - resolution: {integrity: sha512-ethXTt3SGGR+95gudmqJ1eNhRO7eGEGIgYA9vnPatK4/etz2MEVDno5GMCibdMTuBMyElzIlgxMna3K94XDIDQ==} + minimatch@10.0.3: + resolution: {integrity: sha512-IPZ167aShDZZUMdRk66cyQAW3qr0WzbHkPdMYa8bzZhlHhO3jALbKdxcaak7W9FfT2rZNpQuUu4Od7ILEpXSaw==} engines: {node: 20 || >=22} minimatch@3.1.2: @@ -3723,8 +3674,8 @@ packages: engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true - napi-postinstall@0.2.4: - resolution: {integrity: sha512-ZEzHJwBhZ8qQSbknHqYcdtQVr8zUgGyM/q6h6qAyhtyVMNrSgDhrC4disf03dYW0e+czXyLnZINnCTEkWy0eJg==} + napi-postinstall@0.3.0: + resolution: {integrity: sha512-M7NqKyhODKV1gRLdkwE7pDsZP2/SC2a2vHkOYh9MCpKMbWVfyVfUw5MaH83Fv6XMjxr5jryUp3IDDL9rlxsTeA==} engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} hasBin: true @@ -3754,8 +3705,8 @@ packages: react: ^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc react-dom: ^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc - next@15.3.2: - resolution: {integrity: sha512-CA3BatMyHkxZ48sgOCLdVHjFU36N7TF1HhqAHLFOkV6buwZnvMI84Cug8xD56B9mCuKrqXnLn94417GrZ/jjCQ==} + next@15.4.0-canary.61: + resolution: {integrity: sha512-EMSeQxbnfy7iR1lFK9CQNMdff9FYlFhWwiY1WfhXk7nYBSwF2n7+VM5q1drxVMZrrJpFmXvlWQ/A7imGVgVS9g==} engines: {node: ^18.18.0 || ^19.8.0 || >= 20.0.0} hasBin: true peerDependencies: @@ -3867,10 +3818,6 @@ packages: resolution: {integrity: sha512-0eJJY6hXLGf1udHwfNftBqH+g73EU4B504nZeKpz1sYRKafAghwxEJunB2O7rDZkL4PGfsMVnTXZ2EjibbqcsA==} engines: {node: '>=14.0.0'} - on-finished@2.4.1: - resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} - engines: {node: '>= 0.8'} - on-headers@1.0.2: resolution: {integrity: sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==} engines: {node: '>= 0.8'} @@ -3982,10 +3929,6 @@ packages: parse5@7.3.0: resolution: {integrity: sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==} - parseurl@1.3.3: - resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} - engines: {node: '>= 0.8'} - path-data-parser@0.1.0: resolution: {integrity: sha512-NOnmBpt5Y2RWbuv0LMzsayp3lVylAHLPUTut412ZA3l+C4uw4ZVkQbjShYCQ8TCpUMdPapr4YjUqLYD6v68j+w==} @@ -4014,10 +3957,6 @@ packages: path-to-regexp@3.3.0: resolution: {integrity: sha512-qyCH421YQPS2WFDxDjftfc1ZR5WKQzVzqsp4n9M2kQhVOo/ByahFoUNJfl58kOcEGfQ//7weFTDhm+ss8Ecxgw==} - path-to-regexp@8.2.0: - resolution: {integrity: sha512-TdrF7fW9Rphjq4RjrW0Kp2AW0Ahwu9sRGTkS6bvDi0SCwZlEZYmcfDbEsTz8RVk0EHIS/Vd1bv3JhG+1xZuAyQ==} - engines: {node: '>=16'} - path-type@4.0.0: resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} engines: {node: '>=8'} @@ -4025,8 +3964,8 @@ packages: pathe@2.0.3: resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} - pathval@2.0.0: - resolution: {integrity: sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==} + pathval@2.0.1: + resolution: {integrity: sha512-//nshmD55c46FuFw26xV/xFAaB5HF9Xdap7HJBBnrKdAd6/GxDBaNA1870O79+9ueg61cZLSVc+OaFlfmObYVQ==} engines: {node: '>= 14.16'} picocolors@1.1.1: @@ -4062,27 +4001,23 @@ packages: pino-std-serializers@7.0.0: resolution: {integrity: sha512-e906FRY0+tV27iq4juKzSYPbUj2do2X2JX4EzSca1631EB2QJQUqGbDuERal7LCtOpxl6x3+nvo9NPZcmjkiFA==} - pino@9.6.0: - resolution: {integrity: sha512-i85pKRCt4qMjZ1+L7sy2Ag4t1atFcdbEt76+7iRJn1g2BvsnRMGu9p8pivl9fs63M2kF/A0OacFZhTub+m/qMg==} + pino@9.7.0: + resolution: {integrity: sha512-vnMCM6xZTb1WDmLvtG2lE/2p+t9hDEIvTWJsu6FejkE62vB7gDhvzrpFR4Cw2to+9JNQxVnkAKVPA1KPB98vWg==} hasBin: true - pkce-challenge@5.0.0: - resolution: {integrity: sha512-ueGLflrrnvwB3xuo/uGob5pd5FN7l0MsLf0Z87o/UQmRtwjvfylfc9MurIxRAWywCYTgrvpXBcqjV4OfCYGCIQ==} - engines: {node: '>=16.20.0'} - pkg-types@1.3.1: resolution: {integrity: sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==} - pkg-types@2.1.0: - resolution: {integrity: sha512-wmJwA+8ihJixSoHKxZJRBQG1oY8Yr9pGLzRmSsNms0iNWyHHAlZCa7mmKiFR10YPZuz/2k169JiS/inOjBCZ2A==} + pkg-types@2.2.0: + resolution: {integrity: sha512-2SM/GZGAEkPp3KWORxQZns4M+WSeXbC2HEvmOIJe3Cmiv6ieAJvdVhDldtHqM5J1Y7MrR1XhkBT/rMlhh9FdqQ==} - playwright-core@1.52.0: - resolution: {integrity: sha512-l2osTgLXSMeuLZOML9qYODUQoPPnUsKsb5/P6LJ2e6uPKXUdPK5WYhN4z03G+YNbWmGDY4YENauNu4ZKczreHg==} + playwright-core@1.53.2: + resolution: {integrity: sha512-ox/OytMy+2w1jcYEYlOo1Hhp8hZkLCximMTUTMBXjGUA1KoFfiSZ+DU+3a739jsPY0yoKH2TFy9S2fsJas8yAw==} engines: {node: '>=18'} hasBin: true - playwright@1.52.0: - resolution: {integrity: sha512-JAwMNMBlxJ2oD1kce4KPtMkDeKGHQstdpFPcPH3maElAXon/QZeTvtsfXmTMRyO9TslfoYOXkSsvao2nE1ilTw==} + playwright@1.53.2: + resolution: {integrity: sha512-6K/qQxVFuVQhRQhFsVZ9fGeatxirtrpPgxzBYWyZLEXJzqYwuL4fuNmfOfD5et1tJE4GScKyPNeLhZeRwuTU3A==} engines: {node: '>=18'} hasBin: true @@ -4104,8 +4039,8 @@ packages: pm2-sysmonit@1.2.8: resolution: {integrity: sha512-ACOhlONEXdCTVwKieBIQLSi2tQZ8eKinhcr9JpZSUAL8Qy0ajIgRtsLxG/lwPOW3JEKqPyw/UaHmTWhUzpP4kA==} - pm2@6.0.6: - resolution: {integrity: sha512-6t+I+Gc232dKe0OjwFYlU59JoY8MWBqsBmcZMSfKollByL4q8APUFwWOt7OtPH4lGO4Sb6GiFAqu7xT42QeRBA==} + pm2@6.0.8: + resolution: {integrity: sha512-y7sO+UuGjfESK/ChRN+efJKAsHrBd95GY2p1GQfjVTtOfFtUfiW0NOuUhP5dN5QTF2F0EWcepgkLqbF32j90Iw==} engines: {node: '>=16.0.0'} hasBin: true @@ -4123,16 +4058,16 @@ packages: resolution: {integrity: sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==} engines: {node: ^10 || ^12 || >=14} - postcss@8.5.3: - resolution: {integrity: sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==} + postcss@8.5.6: + resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} engines: {node: ^10 || ^12 || >=14} prelude-ls@1.2.1: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} engines: {node: '>= 0.8.0'} - prettier-plugin-packagejson@2.5.13: - resolution: {integrity: sha512-94B/Xy25HwiwSkGUGnwQw3cBw9jg9L5LfKCHpuRMjC8ETPq4oCMa2S4EblV628E0XER9n6v5rH0TQY9cUd10pg==} + prettier-plugin-packagejson@2.5.18: + resolution: {integrity: sha512-NKznPGcGrcj4NPGxnh+w78JXPyfB6I4RQSCM0v+CAXwpDG7OEpJQ5zMyfC5NBgKH1k7Skwcj5ak5by2mrHvC5g==} peerDependencies: prettier: '>= 1.16.0' peerDependenciesMeta: @@ -4144,8 +4079,8 @@ packages: engines: {node: '>=10.13.0'} hasBin: true - prettier@3.5.3: - resolution: {integrity: sha512-QQtaxnoDJeAkDvDKWCLiwIXkTgRhwYDEQCghU9Z6q03iyek/rxRh/2lC3HB7P8sWT2xC/y5JDctPLBIGzHKbhw==} + prettier@3.6.2: + resolution: {integrity: sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ==} engines: {node: '>=14'} hasBin: true @@ -4183,10 +4118,6 @@ packages: property-information@7.1.0: resolution: {integrity: sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==} - proxy-addr@2.0.7: - resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} - engines: {node: '>= 0.10'} - proxy-agent@6.4.0: resolution: {integrity: sha512-u0piLU+nCOHMgGjRbimiXmA9kM/L9EHh3zL81xCdp7m+Y2pHIsnmbdDoEDoAz5geaonNR6q6+yOPQs6n4T6sBQ==} engines: {node: '>= 14'} @@ -4194,17 +4125,13 @@ packages: proxy-from-env@1.1.0: resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} - pump@3.0.2: - resolution: {integrity: sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==} + pump@3.0.3: + resolution: {integrity: sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA==} punycode@2.3.1: resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} engines: {node: '>=6'} - qs@6.14.0: - resolution: {integrity: sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==} - engines: {node: '>=0.6'} - quansync@0.2.10: resolution: {integrity: sha512-t41VRkMYbkHyCYmOvx/6URnN80H7k4X0lLdBMGsz+maAwrJQYB1djpV6vHrQIBE0WBSGqhtEHrK9U3DWWH8v7A==} @@ -4218,14 +4145,6 @@ packages: resolution: {integrity: sha512-kA5WQoNVo4t9lNx2kQNFCxKeBl5IbbSNBl1M/tLkw9WCn+hxNBAW5Qh8gdhs63CJnhjJ2zQWFoqPJP2sK1AV5A==} engines: {node: '>= 0.6'} - range-parser@1.2.1: - resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} - engines: {node: '>= 0.6'} - - raw-body@3.0.0: - resolution: {integrity: sha512-RmkhL8CAyCRPXCE28MMH0z2PNWQBNk2Q09ZdxM9IOOXwxwZbN+qbWaatPkdkWIKL2ZVDImrN/pK5HTRz2PcS4g==} - engines: {node: '>= 0.8'} - rc@1.2.8: resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} hasBin: true @@ -4292,8 +4211,8 @@ packages: recma-stringify@1.0.0: resolution: {integrity: sha512-cjwII1MdIIVloKvC9ErQ+OgAtwHBmcZ0Bg4ciz78FtbT8In39aAYbaA7zvxQ61xVMSPE8WxhLwLbhif4Js2C+g==} - redis@5.0.1: - resolution: {integrity: sha512-J8nqUjrfSq0E8NQkcHDZ4HdEQk5RMYjP3jZq02PE+ERiRxolbDNxPaTT4xh6tdrme+lJ86Goje9yMt9uzh23hQ==} + redis@5.5.6: + resolution: {integrity: sha512-hbpqBfcuhWHOS9YLNcXcJ4akNr7HFX61Dq3JuFZ9S7uU7C7kvnzuH2PDIXOP62A3eevvACoG8UacuXP3N07xdg==} engines: {node: '>= 18'} reflect.getprototypeof@1.0.10: @@ -4424,18 +4343,14 @@ packages: robust-predicates@3.0.2: resolution: {integrity: sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg==} - rollup@4.40.2: - resolution: {integrity: sha512-tfUOg6DTP4rhQ3VjOO6B4wyrJnGOX85requAXvqYTHsOgb2TFJdZ3aWpT8W2kPoypSGP7dZUyzxJ9ee4buM5Fg==} + rollup@4.44.1: + resolution: {integrity: sha512-x8H8aPvD+xbl0Do8oez5f5o8eMS3trfCghc4HhLAnCkj7Vl0d1JWGs0UF/D886zLW2rOj2QymV/JcSSsw+XDNg==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true roughjs@4.6.6: resolution: {integrity: sha512-ZUz/69+SYpFN/g/lUlo2FXcIjRkSu3nDarreVdGGndHEBJ6cXPdKguS8JGxwj5HA5xIbVKSmLgr5b3AWxtRfvQ==} - router@2.2.0: - resolution: {integrity: sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==} - engines: {node: '>= 18'} - run-parallel@1.2.0: resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} @@ -4506,17 +4421,9 @@ packages: engines: {node: '>=10'} hasBin: true - send@1.2.0: - resolution: {integrity: sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw==} - engines: {node: '>= 18'} - serve-handler@6.1.6: resolution: {integrity: sha512-x5RL9Y2p5+Sh3D38Fh9i/iQ5ZK+e4xuXRd/pGbM4D13tgo/MGwbttUk8emytcr1YYzBYs+apnUngBDFYfpjPuQ==} - serve-static@2.2.0: - resolution: {integrity: sha512-61g9pCh0Vnh7IutZjtLGGpTA355+OPn2TyDv/6ivP2h/AdAVX9azsoxmg2/M6nZeQZNYBEwIcsne1mJd9oQItQ==} - engines: {node: '>= 18'} - serve@14.2.4: resolution: {integrity: sha512-qy1S34PJ/fcY8gjVGszDB3EXiPSk5FKhUa7tQe0UPRddxRidc2V6cNHPNewbE1D7MAkgLuWEt3Vw56vYy73tzQ==} engines: {node: '>= 14'} @@ -4537,11 +4444,8 @@ packages: resolution: {integrity: sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==} engines: {node: '>= 0.4'} - setprototypeof@1.2.0: - resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} - - sharp@0.34.1: - resolution: {integrity: sha512-1j0w61+eVxu7DawFJtnfYcvSv6qPFvfTaqzTQ2BLknVhHTwGS8sc63ZBF4rzkWMBVKybo4S5OBtDdZahh2A1xg==} + sharp@0.34.2: + resolution: {integrity: sha512-lszvBmB9QURERtyKT2bNmsgxXK0ShJrL/fvqlonCo7e6xBF8nT8xU6pW+PMIbLsz0RxQk3rgH9kd8UmvOzlMJg==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} shebang-command@2.0.0: @@ -4603,8 +4507,8 @@ packages: resolution: {integrity: sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw==} engines: {node: '>= 14'} - socks@2.8.4: - resolution: {integrity: sha512-D3YaD0aRxR3mEcqnidIs7ReYJFVzWdd6fXJYUM8ixcQcJRGTka/b3saV0KflYhyVJXKhb947GndU35SxYNResQ==} + socks@2.8.5: + resolution: {integrity: sha512-iF+tNDQla22geJdTyJB1wM/qrX9DMRwWrciEPwWLPRWAUEM8sQiyxgckLxWT1f7+9VabJS0jTGGr4QgBuvi6Ww==} engines: {node: '>= 10.0.0', npm: '>= 3.0.0'} sonic-boom@4.2.0: @@ -4613,8 +4517,9 @@ packages: sort-object-keys@1.1.3: resolution: {integrity: sha512-855pvK+VkU7PaKYPc+Jjnmt4EzejQHyhhF33q31qG8x7maDzkeFhAAThdCYay11CISO+qAMwjOBP+fPZe0IPyg==} - sort-package-json@3.2.1: - resolution: {integrity: sha512-rTfRdb20vuoAn7LDlEtCqOkYfl2X+Qze6cLbNOzcDpbmKEhJI30tTN44d5shbKJnXsvz24QQhlCm81Bag7EOKg==} + sort-package-json@3.4.0: + resolution: {integrity: sha512-97oFRRMM2/Js4oEA9LJhjyMlde+2ewpZQf53pgue27UkbEXfHJnDzHlUxQ/DWUkzqmp7DFwJp8D+wi/TYeQhpA==} + engines: {node: '>=20'} hasBin: true source-map-js@1.2.1: @@ -4670,22 +4575,19 @@ packages: sprintf-js@1.1.3: resolution: {integrity: sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==} - stable-hash@0.0.5: - resolution: {integrity: sha512-+L3ccpzibovGXFK+Ap/f8LOS0ahMrHTf3xu7mMLSpEGU0EO9ucaysSylKo9eRDFNhWve/y275iPmIZ4z39a9iA==} + stable-hash-x@0.2.0: + resolution: {integrity: sha512-o3yWv49B/o4QZk5ZcsALc6t0+eCelPc44zZsLtCQnZPDwFpDYSWcDnrv2TtMmMbQ7uKo3J0HTURCqckw23czNQ==} + engines: {node: '>=12.0.0'} stackback@0.0.2: resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} - statuses@2.0.1: - resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} - engines: {node: '>= 0.8'} - std-env@3.9.0: resolution: {integrity: sha512-UGvjygr6F6tpH7o2qyqR6QYpwraIjKSdtzyBdyytFOHmPZY917kwdwLG0RbOjWOnKmnm3PeHjaoLLMie7kPLQw==} - streamsearch@1.1.0: - resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==} - engines: {node: '>=10.0.0'} + stop-iteration-iterator@1.1.0: + resolution: {integrity: sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==} + engines: {node: '>= 0.4'} string-width@4.2.3: resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} @@ -4752,11 +4654,14 @@ packages: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} engines: {node: '>=8'} - style-to-js@1.1.16: - resolution: {integrity: sha512-/Q6ld50hKYPH3d/r6nr117TZkHR0w0kGGIVfpG9N6D8NymRPM9RqCUv4pRpJ62E5DqOYx2AFpbZMyCPnjQCnOw==} + strip-literal@3.0.0: + resolution: {integrity: sha512-TcccoMhJOM3OebGhSBEmp3UZ2SfDMZUEBdRA/9ynfLi8yYajyWX3JiXArcJt4Umh4vISpspkQIY8ZZoCqjbviA==} + + style-to-js@1.1.17: + resolution: {integrity: sha512-xQcBGDxJb6jjFCTzvQtfiPn6YvvP2O8U1MDIPNfJQlWMYfktPy+iGsHE7cssjs7y84d9fQaK4UF3RIJaAHSoYA==} - style-to-object@1.0.8: - resolution: {integrity: sha512-xT47I/Eo0rwJmaXC4oilDGDWLohVhR6o/xAQcPQN8q6QBuZVL8qMYL85kLmST5cPjAorwvqIA4qXTRQoYHaL6g==} + style-to-object@1.0.9: + resolution: {integrity: sha512-G4qppLgKu/k6FwRpHiGiKPaPTFcG3g4wNVX/Qsfu+RqQM30E7Tyu/TEgxcL9PNLF5pdRLwQdE3YKKf+KF2Dzlw==} styled-jsx@5.1.6: resolution: {integrity: sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA==} @@ -4790,16 +4695,16 @@ packages: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} - synckit@0.11.5: - resolution: {integrity: sha512-frqvfWyDA5VPVdrWfH24uM6SI/O8NLpVbIIJxb8t/a3YGsp4AW9CYgSKC0OaSEfexnp7Y1pVh2Y6IHO8ggGDmA==} + synckit@0.11.8: + resolution: {integrity: sha512-+XZ+r1XGIJGeQk3VvXhT6xx/VpbHsRzsTkGgF6E5RX9TTXD0118l87puaEBZ566FhqblC6U0d4XnubznJDm30A==} engines: {node: ^14.18.0 || >=16.0.0} system-architecture@0.1.0: resolution: {integrity: sha512-ulAk51I9UVUyJgxlv9M6lFot2WP3e7t8Kz9+IS6D4rVba1tR9kON+Ey69f+1R4Q8cd45Lod6a4IcJIxnzGc/zA==} engines: {node: '>=18'} - systeminformation@5.25.11: - resolution: {integrity: sha512-jI01fn/t47rrLTQB0FTlMCC+5dYx8o0RRF+R4BPiUNsvg5OdY0s9DKMFmJGrx5SwMZQ4cag0Gl6v8oycso9b/g==} + systeminformation@5.27.7: + resolution: {integrity: sha512-saaqOoVEEFaux4v0K8Q7caiauRwjXC4XbD2eH60dxHXbpKxQ8kH9Rf7Jh+nryKpOUSEFxtCdBlSUx0/lO6rwRg==} engines: {node: '>=8.0.0'} os: [darwin, linux, win32, freebsd, openbsd, netbsd, sunos, android] hasBin: true @@ -4823,20 +4728,20 @@ packages: tinyexec@1.0.1: resolution: {integrity: sha512-5uC6DDlmeqiOwCPmK9jMSdOuZTh8bU39Ys6yidB+UTt5hfZUPGAypSgFRiEp+jbi9qH40BLDvy85jIU88wKSqw==} - tinyglobby@0.2.13: - resolution: {integrity: sha512-mEwzpUgrLySlveBwEVDMKk5B57bhLPYovRfPAXD5gA/98Opn0rCDj3GtLwFvCvH5RK9uPCExUROW5NjDwvqkxw==} + tinyglobby@0.2.14: + resolution: {integrity: sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==} engines: {node: '>=12.0.0'} - tinypool@1.0.2: - resolution: {integrity: sha512-al6n+QEANGFOMf/dmUMsuS5/r9B06uwlyNjZZql/zv8J7ybHCgoihBNORZCY2mzUuAnomQa2JdhyHKzZxPCrFA==} + tinypool@1.1.1: + resolution: {integrity: sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg==} engines: {node: ^18.0.0 || >=20.0.0} tinyrainbow@2.0.0: resolution: {integrity: sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==} engines: {node: '>=14.0.0'} - tinyspy@3.0.2: - resolution: {integrity: sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q==} + tinyspy@4.0.3: + resolution: {integrity: sha512-t2T/WLB2WRgZ9EpE4jgPJ9w+i66UZfDc8wHh0xrwiRNN+UwH98GIJkTeZqX9rg0i0ptwzqW+uYeIF0T4F8LR7A==} engines: {node: '>=14.0.0'} title@4.0.1: @@ -4855,10 +4760,6 @@ packages: resolution: {integrity: sha512-/m8M+2BJUpoJdgAHoG+baCwBT+tf2VraSfkBgl0Y00qIWt41DJ8R5B8nsEw0I58YwF5IZH6z24/2TobDKnqSWw==} engines: {node: '>=12'} - toidentifier@1.0.1: - resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} - engines: {node: '>=0.6'} - trim-lines@3.0.1: resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==} @@ -4881,43 +4782,43 @@ packages: tslib@2.8.1: resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} - tsx@4.19.4: - resolution: {integrity: sha512-gK5GVzDkJK1SI1zwHf32Mqxf2tSJkNx+eYcNly5+nHvWqXUJYUkWBQtKauoESz3ymezAI++ZwT855x5p5eop+Q==} + tsx@4.20.3: + resolution: {integrity: sha512-qjbnuR9Tr+FJOMBqJCW5ehvIo/buZq7vH7qD7JziU98h6l3qGy0a/yPFjwO+y0/T7GFpNgNAvEcPPVfyT8rrPQ==} engines: {node: '>=18.0.0'} hasBin: true - turbo-darwin-64@2.5.3: - resolution: {integrity: sha512-YSItEVBUIvAGPUDpAB9etEmSqZI3T6BHrkBkeSErvICXn3dfqXUfeLx35LfptLDEbrzFUdwYFNmt8QXOwe9yaw==} + turbo-darwin-64@2.5.4: + resolution: {integrity: sha512-ah6YnH2dErojhFooxEzmvsoZQTMImaruZhFPfMKPBq8sb+hALRdvBNLqfc8NWlZq576FkfRZ/MSi4SHvVFT9PQ==} cpu: [x64] os: [darwin] - turbo-darwin-arm64@2.5.3: - resolution: {integrity: sha512-5PefrwHd42UiZX7YA9m1LPW6x9YJBDErXmsegCkVp+GjmWrADfEOxpFrGQNonH3ZMj77WZB2PVE5Aw3gA+IOhg==} + turbo-darwin-arm64@2.5.4: + resolution: {integrity: sha512-2+Nx6LAyuXw2MdXb7pxqle3MYignLvS7OwtsP9SgtSBaMlnNlxl9BovzqdYAgkUW3AsYiQMJ/wBRb7d+xemM5A==} cpu: [arm64] os: [darwin] - turbo-linux-64@2.5.3: - resolution: {integrity: sha512-M9xigFgawn5ofTmRzvjjLj3Lqc05O8VHKuOlWNUlnHPUltFquyEeSkpQNkE/vpPdOR14AzxqHbhhxtfS4qvb1w==} + turbo-linux-64@2.5.4: + resolution: {integrity: sha512-5May2kjWbc8w4XxswGAl74GZ5eM4Gr6IiroqdLhXeXyfvWEdm2mFYCSWOzz0/z5cAgqyGidF1jt1qzUR8hTmOA==} cpu: [x64] os: [linux] - turbo-linux-arm64@2.5.3: - resolution: {integrity: sha512-auJRbYZ8SGJVqvzTikpg1bsRAsiI9Tk0/SDkA5Xgg0GdiHDH/BOzv1ZjDE2mjmlrO/obr19Dw+39OlMhwLffrw==} + turbo-linux-arm64@2.5.4: + resolution: {integrity: sha512-/2yqFaS3TbfxV3P5yG2JUI79P7OUQKOUvAnx4MV9Bdz6jqHsHwc9WZPpO4QseQm+NvmgY6ICORnoVPODxGUiJg==} cpu: [arm64] os: [linux] - turbo-windows-64@2.5.3: - resolution: {integrity: sha512-arLQYohuHtIEKkmQSCU9vtrKUg+/1TTstWB9VYRSsz+khvg81eX6LYHtXJfH/dK7Ho6ck+JaEh5G+QrE1jEmCQ==} + turbo-windows-64@2.5.4: + resolution: {integrity: sha512-EQUO4SmaCDhO6zYohxIjJpOKRN3wlfU7jMAj3CgcyTPvQR/UFLEKAYHqJOnJtymbQmiiM/ihX6c6W6Uq0yC7mA==} cpu: [x64] os: [win32] - turbo-windows-arm64@2.5.3: - resolution: {integrity: sha512-3JPn66HAynJ0gtr6H+hjY4VHpu1RPKcEwGATvGUTmLmYSYBQieVlnGDRMMoYN066YfyPqnNGCfhYbXfH92Cm0g==} + turbo-windows-arm64@2.5.4: + resolution: {integrity: sha512-oQ8RrK1VS8lrxkLriotFq+PiF7iiGgkZtfLKF4DDKsmdbPo0O9R2mQxm7jHLuXraRCuIQDWMIw6dpcr7Iykf4A==} cpu: [arm64] os: [win32] - turbo@2.5.3: - resolution: {integrity: sha512-iHuaNcq5GZZnr3XDZNuu2LSyCzAOPwDuo5Qt+q64DfsTP1i3T2bKfxJhni2ZQxsvAoxRbuUK5QetJki4qc5aYA==} + turbo@2.5.4: + resolution: {integrity: sha512-kc8ZibdRcuWUG1pbYSBFWqmIjynlD8Lp7IB6U3vIzvOv9VG+6Sp8bzyeBWE3Oi8XV5KsQrznyRTBPvrf99E4mA==} hasBin: true tv4@1.3.0: @@ -4947,10 +4848,6 @@ packages: resolution: {integrity: sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g==} engines: {node: '>=14.16'} - 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'} @@ -4970,8 +4867,8 @@ packages: typedarray@0.0.6: resolution: {integrity: sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==} - typescript-eslint@8.32.1: - resolution: {integrity: sha512-D7el+eaDHAmXvrZBy1zpzSNIRqnCOrkwTgZxTu3MUqRWk8k0q9m9Ho4+vPf7iHtgUfrK/o8IZaEApsxPlHTFCg==} + typescript-eslint@8.35.1: + resolution: {integrity: sha512-xslJjFzhOmHYQzSB/QTeASAHbjmxOGEP6Coh93TXmUBFQoJ1VU35UHIDmG06Jd6taf3wqqC1ntBnCMeymy5Ovw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 @@ -4992,6 +4889,9 @@ packages: undici-types@6.21.0: resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} + undici-types@7.8.0: + resolution: {integrity: sha512-9UJ2xGDvQ43tYyVMpuHlsgApydB8ZKfVYTsLDhXkFL/6gfkp+U8xTGdh8pMJv1SpZna0zxG1DwsKZsreLbXBxw==} + unified-engine@11.2.2: resolution: {integrity: sha512-15g/gWE7qQl9tQ3nAEbMd5h9HV1EACtFs6N9xaRBZICoCwnNGbal1kOs++ICf4aiTdItZxU2s/kYWhW7htlqJg==} @@ -5047,12 +4947,8 @@ packages: resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} engines: {node: '>= 4.0.0'} - unpipe@1.0.0: - resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} - engines: {node: '>= 0.8'} - - unrs-resolver@1.7.2: - resolution: {integrity: sha512-BBKpaylOW8KbHsu378Zky/dGh4ckT/4NW/0SHRABdqRLcQJ2dAOjDo9g97p04sWflm0kqPqpUatxReNV/dqI5A==} + unrs-resolver@1.10.1: + resolution: {integrity: sha512-EFrL7Hw4kmhZdwWO3dwwFJo6hO3FXuQ6Bg8BK/faHZ9m1YxqBS31BNSTxklIQkxK/4LlV8zTYnPsIRLBzTzjCA==} update-check@1.5.4: resolution: {integrity: sha512-5YHsflzHP4t1G+8WGPlvKbJEbAJGCgw+Em+dGR1KmBUbr1J36SJBqlHLjR7oob7sco5hWHGQVcr9B2poIVDDTQ==} @@ -5106,24 +5002,24 @@ packages: vfile@6.0.3: resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==} - vite-node@3.1.3: - resolution: {integrity: sha512-uHV4plJ2IxCl4u1up1FQRrqclylKAogbtBfOTwcuJ28xFi+89PZ57BRh+naIRvH70HPwxy5QHYzg1OrEaC7AbA==} + 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@6.3.5: - resolution: {integrity: sha512-cZn6NDFE7wdTpINgs++ZJ4N49W2vRp8LCKrn3Ob1kYNtOo21vfDoaV5GzBfLU4MovSAB8uNRm4jgzVQZ+mBzPQ==} - engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} + vite@7.0.2: + resolution: {integrity: sha512-hxdyZDY1CM6SNpKI4w4lcUc3Mtkd9ej4ECWVHSMrOdSinVc2zYOAppHeGc/hzmRo3pxM5blMzkuWHOJA/3NiFw==} + engines: {node: ^20.19.0 || >=22.12.0} hasBin: true peerDependencies: - '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 + '@types/node': ^20.19.0 || >=22.12.0 jiti: '>=1.21.0' - less: '*' + less: ^4.0.0 lightningcss: ^1.21.0 - sass: '*' - sass-embedded: '*' - stylus: '*' - sugarss: '*' + sass: ^1.70.0 + sass-embedded: ^1.70.0 + stylus: '>=0.54.8' + sugarss: ^5.0.0 terser: ^5.16.0 tsx: ^4.8.1 yaml: ^2.4.2 @@ -5151,16 +5047,16 @@ packages: yaml: optional: true - vitest@3.1.3: - resolution: {integrity: sha512-188iM4hAHQ0km23TN/adso1q5hhwKqUpv+Sd6p5sOuh6FhQnRNW3IsiIpvxqahtBabsJ2SLZgmGSpcYK4wQYJw==} + vitest@3.2.4: + resolution: {integrity: sha512-LUCP5ev3GURDysTWiP47wRRUpLKMOfPh+yKTx3kVIEiu5KOMeqzpnYNsKyOoVrULivR8tLcks4+lga33Whn90A==} engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} hasBin: true peerDependencies: '@edge-runtime/vm': '*' '@types/debug': ^4.1.12 '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 - '@vitest/browser': 3.1.3 - '@vitest/ui': 3.1.3 + '@vitest/browser': 3.2.4 + '@vitest/ui': 3.2.4 happy-dom: '*' jsdom: '*' peerDependenciesMeta: @@ -5286,22 +5182,17 @@ packages: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} - zod-to-json-schema@3.24.5: - resolution: {integrity: sha512-/AuWwMP+YqiPbsJx5D6TfgRTc4kTLjsh5SOcd4bLsfUg2RcEXrFMJl1DGgdHy2aCfsIA/cr/1JM0xcB2GZji8g==} - peerDependencies: - zod: ^3.24.1 - - zod-validation-error@3.4.1: - resolution: {integrity: sha512-1KP64yqDPQ3rupxNv7oXhf7KdhHHgaqbKuspVoiN93TT0xrBjql+Svjkdjq/Qh/7GSMmgQs3AfvBT0heE35thw==} + zod-validation-error@3.5.2: + resolution: {integrity: sha512-mdi7YOLtram5dzJ5aDtm1AG9+mxRma1iaMrZdYIpFO7epdKBUwLHIxTF8CPDeCQ828zAXYtizrKlEJAtzgfgrw==} engines: {node: '>=18.0.0'} peerDependencies: - zod: ^3.24.4 + zod: ^3.25.0 - zod@3.24.4: - resolution: {integrity: sha512-OdqJE9UDRPwWsrHjLN2F8bPxvwJBK22EHLWtanu0LSYr5YqzsaaW3RMgmjwr8Rypg5k+meEJdSPXJZXE/yqOMg==} + zod@3.25.72: + resolution: {integrity: sha512-Cl+fe4dNL4XumOBNBsr0lHfA80PQiZXHI4xEMTEr8gt6aGz92t3lBA32e71j9+JeF/VAYvdfBnuwJs+BMx/BrA==} - zustand@5.0.4: - resolution: {integrity: sha512-39VFTN5InDtMd28ZhjLyuTnlytDr9HfwO512Ai4I8ZABCoyAj4F1+sr7sD1jP/+p7k77Iko0Pb5NhgBFDCX0kQ==} + zustand@5.0.6: + resolution: {integrity: sha512-ihAqNeUVhe0MAD+X8M5UzqyZ9k3FFZLBTtqo6JLPwV53cbRB/mJwBI0PxcIgqhBBHlEs8G45OTDTMq3gNcLq3A==} engines: {node: '>=12.20.0'} peerDependencies: '@types/react': '>=18.0.0' @@ -5338,7 +5229,7 @@ snapshots: '@babel/helper-validator-identifier@7.27.1': {} - '@babel/runtime@7.27.1': {} + '@babel/runtime@7.27.6': {} '@braintree/sanitize-url@7.1.1': {} @@ -5358,7 +5249,7 @@ snapshots: resolve-from: 5.0.0 semver: 7.7.2 - '@changesets/assemble-release-plan@6.0.8': + '@changesets/assemble-release-plan@6.0.9': dependencies: '@changesets/errors': 0.2.0 '@changesets/get-dependents-graph': 2.1.3 @@ -5371,15 +5262,15 @@ snapshots: dependencies: '@changesets/types': 6.1.0 - '@changesets/cli@2.29.4': + '@changesets/cli@2.29.5': dependencies: '@changesets/apply-release-plan': 7.0.12 - '@changesets/assemble-release-plan': 6.0.8 + '@changesets/assemble-release-plan': 6.0.9 '@changesets/changelog-git': 0.2.1 '@changesets/config': 3.1.1 '@changesets/errors': 0.2.0 '@changesets/get-dependents-graph': 2.1.3 - '@changesets/get-release-plan': 4.0.12 + '@changesets/get-release-plan': 4.0.13 '@changesets/git': 3.0.4 '@changesets/logger': 0.1.1 '@changesets/pre': 2.0.2 @@ -5423,9 +5314,9 @@ snapshots: picocolors: 1.1.1 semver: 7.7.2 - '@changesets/get-release-plan@4.0.12': + '@changesets/get-release-plan@4.0.13': dependencies: - '@changesets/assemble-release-plan': 6.0.8 + '@changesets/assemble-release-plan': 6.0.9 '@changesets/config': 3.1.1 '@changesets/pre': 2.0.2 '@changesets/read': 0.6.5 @@ -5517,98 +5408,97 @@ snapshots: tslib: 2.8.1 optional: true - '@es-joy/jsdoccomment@0.50.1': + '@es-joy/jsdoccomment@0.52.0': dependencies: - '@types/eslint': 9.6.1 - '@types/estree': 1.0.7 - '@typescript-eslint/types': 8.32.1 + '@types/estree': 1.0.8 + '@typescript-eslint/types': 8.35.1 comment-parser: 1.4.1 esquery: 1.6.0 jsdoc-type-pratt-parser: 4.1.0 - '@esbuild/aix-ppc64@0.25.4': + '@esbuild/aix-ppc64@0.25.5': optional: true - '@esbuild/android-arm64@0.25.4': + '@esbuild/android-arm64@0.25.5': optional: true - '@esbuild/android-arm@0.25.4': + '@esbuild/android-arm@0.25.5': optional: true - '@esbuild/android-x64@0.25.4': + '@esbuild/android-x64@0.25.5': optional: true - '@esbuild/darwin-arm64@0.25.4': + '@esbuild/darwin-arm64@0.25.5': optional: true - '@esbuild/darwin-x64@0.25.4': + '@esbuild/darwin-x64@0.25.5': optional: true - '@esbuild/freebsd-arm64@0.25.4': + '@esbuild/freebsd-arm64@0.25.5': optional: true - '@esbuild/freebsd-x64@0.25.4': + '@esbuild/freebsd-x64@0.25.5': optional: true - '@esbuild/linux-arm64@0.25.4': + '@esbuild/linux-arm64@0.25.5': optional: true - '@esbuild/linux-arm@0.25.4': + '@esbuild/linux-arm@0.25.5': optional: true - '@esbuild/linux-ia32@0.25.4': + '@esbuild/linux-ia32@0.25.5': optional: true - '@esbuild/linux-loong64@0.25.4': + '@esbuild/linux-loong64@0.25.5': optional: true - '@esbuild/linux-mips64el@0.25.4': + '@esbuild/linux-mips64el@0.25.5': optional: true - '@esbuild/linux-ppc64@0.25.4': + '@esbuild/linux-ppc64@0.25.5': optional: true - '@esbuild/linux-riscv64@0.25.4': + '@esbuild/linux-riscv64@0.25.5': optional: true - '@esbuild/linux-s390x@0.25.4': + '@esbuild/linux-s390x@0.25.5': optional: true - '@esbuild/linux-x64@0.25.4': + '@esbuild/linux-x64@0.25.5': optional: true - '@esbuild/netbsd-arm64@0.25.4': + '@esbuild/netbsd-arm64@0.25.5': optional: true - '@esbuild/netbsd-x64@0.25.4': + '@esbuild/netbsd-x64@0.25.5': optional: true - '@esbuild/openbsd-arm64@0.25.4': + '@esbuild/openbsd-arm64@0.25.5': optional: true - '@esbuild/openbsd-x64@0.25.4': + '@esbuild/openbsd-x64@0.25.5': optional: true - '@esbuild/sunos-x64@0.25.4': + '@esbuild/sunos-x64@0.25.5': optional: true - '@esbuild/win32-arm64@0.25.4': + '@esbuild/win32-arm64@0.25.5': optional: true - '@esbuild/win32-ia32@0.25.4': + '@esbuild/win32-ia32@0.25.5': optional: true - '@esbuild/win32-x64@0.25.4': + '@esbuild/win32-x64@0.25.5': optional: true - '@eslint-community/eslint-utils@4.7.0(eslint@9.26.0)': + '@eslint-community/eslint-utils@4.7.0(eslint@9.30.1)': dependencies: - eslint: 9.26.0 + eslint: 9.30.1 eslint-visitor-keys: 3.4.3 '@eslint-community/regexpp@4.12.1': {} - '@eslint/config-array@0.20.0': + '@eslint/config-array@0.21.0': dependencies: '@eslint/object-schema': 2.1.6 debug: 4.4.1 @@ -5616,9 +5506,13 @@ snapshots: transitivePeerDependencies: - supports-color - '@eslint/config-helpers@0.2.2': {} + '@eslint/config-helpers@0.3.0': {} - '@eslint/core@0.13.0': + '@eslint/core@0.14.0': + dependencies: + '@types/json-schema': 7.0.15 + + '@eslint/core@0.15.1': dependencies: '@types/json-schema': 7.0.15 @@ -5626,7 +5520,7 @@ snapshots: dependencies: ajv: 6.12.6 debug: 4.4.1 - espree: 10.3.0 + espree: 10.4.0 globals: 14.0.0 ignore: 5.3.2 import-fresh: 3.3.1 @@ -5636,13 +5530,13 @@ snapshots: transitivePeerDependencies: - supports-color - '@eslint/js@9.26.0': {} + '@eslint/js@9.30.1': {} '@eslint/object-schema@2.1.6': {} - '@eslint/plugin-kit@0.2.8': + '@eslint/plugin-kit@0.3.3': dependencies: - '@eslint/core': 0.13.0 + '@eslint/core': 0.15.1 levn: 0.4.1 '@fastify/ajv-compiler@4.0.2': @@ -5651,7 +5545,7 @@ snapshots: ajv-formats: 3.0.1(ajv@8.17.1) fast-uri: 3.0.6 - '@fastify/error@4.1.0': {} + '@fastify/error@4.2.0': {} '@fastify/fast-json-stringify-compiler@5.0.3': dependencies: @@ -5668,41 +5562,41 @@ snapshots: '@fastify/forwarded': 3.0.0 ipaddr.js: 2.2.0 - '@floating-ui/core@1.7.0': + '@floating-ui/core@1.7.2': dependencies: - '@floating-ui/utils': 0.2.9 + '@floating-ui/utils': 0.2.10 - '@floating-ui/dom@1.7.0': + '@floating-ui/dom@1.7.2': dependencies: - '@floating-ui/core': 1.7.0 - '@floating-ui/utils': 0.2.9 + '@floating-ui/core': 1.7.2 + '@floating-ui/utils': 0.2.10 - '@floating-ui/react-dom@2.1.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + '@floating-ui/react-dom@2.1.4(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': dependencies: - '@floating-ui/dom': 1.7.0 + '@floating-ui/dom': 1.7.2 react: 19.1.0 react-dom: 19.1.0(react@19.1.0) '@floating-ui/react@0.26.28(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': dependencies: - '@floating-ui/react-dom': 2.1.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@floating-ui/utils': 0.2.9 + '@floating-ui/react-dom': 2.1.4(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@floating-ui/utils': 0.2.10 react: 19.1.0 react-dom: 19.1.0(react@19.1.0) tabbable: 6.2.0 - '@floating-ui/utils@0.2.9': {} + '@floating-ui/utils@0.2.10': {} '@formatjs/intl-localematcher@0.6.1': dependencies: tslib: 2.8.1 - '@headlessui/react@2.2.3(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + '@headlessui/react@2.2.4(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': dependencies: '@floating-ui/react': 0.26.28(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@react-aria/focus': 3.20.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@react-aria/interactions': 3.25.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@tanstack/react-virtual': 3.13.8(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@react-aria/focus': 3.20.5(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@react-aria/interactions': 3.25.3(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@tanstack/react-virtual': 3.13.12(react-dom@19.1.0(react@19.1.0))(react@19.1.0) react: 19.1.0 react-dom: 19.1.0(react@19.1.0) use-sync-external-store: 1.5.0(react@19.1.0) @@ -5735,12 +5629,12 @@ snapshots: transitivePeerDependencies: - supports-color - '@img/sharp-darwin-arm64@0.34.1': + '@img/sharp-darwin-arm64@0.34.2': optionalDependencies: '@img/sharp-libvips-darwin-arm64': 1.1.0 optional: true - '@img/sharp-darwin-x64@0.34.1': + '@img/sharp-darwin-x64@0.34.2': optionalDependencies: '@img/sharp-libvips-darwin-x64': 1.1.0 optional: true @@ -5772,47 +5666,56 @@ snapshots: '@img/sharp-libvips-linuxmusl-x64@1.1.0': optional: true - '@img/sharp-linux-arm64@0.34.1': + '@img/sharp-linux-arm64@0.34.2': optionalDependencies: '@img/sharp-libvips-linux-arm64': 1.1.0 optional: true - '@img/sharp-linux-arm@0.34.1': + '@img/sharp-linux-arm@0.34.2': optionalDependencies: '@img/sharp-libvips-linux-arm': 1.1.0 optional: true - '@img/sharp-linux-s390x@0.34.1': + '@img/sharp-linux-s390x@0.34.2': optionalDependencies: '@img/sharp-libvips-linux-s390x': 1.1.0 optional: true - '@img/sharp-linux-x64@0.34.1': + '@img/sharp-linux-x64@0.34.2': optionalDependencies: '@img/sharp-libvips-linux-x64': 1.1.0 optional: true - '@img/sharp-linuxmusl-arm64@0.34.1': + '@img/sharp-linuxmusl-arm64@0.34.2': optionalDependencies: '@img/sharp-libvips-linuxmusl-arm64': 1.1.0 optional: true - '@img/sharp-linuxmusl-x64@0.34.1': + '@img/sharp-linuxmusl-x64@0.34.2': optionalDependencies: '@img/sharp-libvips-linuxmusl-x64': 1.1.0 optional: true - '@img/sharp-wasm32@0.34.1': + '@img/sharp-wasm32@0.34.2': dependencies: '@emnapi/runtime': 1.4.3 optional: true - '@img/sharp-win32-ia32@0.34.1': + '@img/sharp-win32-arm64@0.34.2': + optional: true + + '@img/sharp-win32-ia32@0.34.2': optional: true - '@img/sharp-win32-x64@0.34.1': + '@img/sharp-win32-x64@0.34.2': optional: true + '@isaacs/balanced-match@4.0.1': {} + + '@isaacs/brace-expansion@5.0.0': + dependencies: + '@isaacs/balanced-match': 4.0.1 + '@isaacs/cliui@8.0.2': dependencies: string-width: 5.1.2 @@ -5822,27 +5725,27 @@ snapshots: wrap-ansi: 8.1.0 wrap-ansi-cjs: wrap-ansi@7.0.0 - '@jridgewell/sourcemap-codec@1.5.0': {} + '@jridgewell/sourcemap-codec@1.5.4': {} '@manypkg/find-root@1.1.0': dependencies: - '@babel/runtime': 7.27.1 + '@babel/runtime': 7.27.6 '@types/node': 12.20.55 find-up: 4.1.0 fs-extra: 8.1.0 '@manypkg/get-packages@1.1.3': dependencies: - '@babel/runtime': 7.27.1 + '@babel/runtime': 7.27.6 '@changesets/types': 4.1.0 '@manypkg/find-root': 1.1.0 fs-extra: 8.1.0 globby: 11.1.0 read-yaml-file: 1.1.0 - '@mdx-js/mdx@3.1.0(acorn@8.14.1)': + '@mdx-js/mdx@3.1.0(acorn@8.15.0)': dependencies: - '@types/estree': 1.0.7 + '@types/estree': 1.0.8 '@types/estree-jsx': 1.0.5 '@types/hast': 3.0.4 '@types/mdx': 2.0.13 @@ -5854,7 +5757,7 @@ snapshots: hast-util-to-jsx-runtime: 2.3.6 markdown-extensions: 2.0.0 recma-build-jsx: 1.0.0 - recma-jsx: 1.0.0(acorn@8.14.1) + recma-jsx: 1.0.0(acorn@8.15.0) recma-stringify: 1.0.0 rehype-recma: 1.0.0 remark-mdx: 3.1.0 @@ -5870,25 +5773,10 @@ snapshots: - acorn - supports-color - '@mermaid-js/parser@0.4.0': + '@mermaid-js/parser@0.6.0': dependencies: langium: 3.3.1 - '@modelcontextprotocol/sdk@1.11.3': - dependencies: - content-type: 1.0.5 - cors: 2.8.5 - cross-spawn: 7.0.6 - eventsource: 3.0.7 - express: 5.1.0 - express-rate-limit: 7.5.0(express@5.1.0) - pkce-challenge: 5.0.0 - raw-body: 3.0.0 - zod: 3.24.4 - zod-to-json-schema: 3.24.5(zod@3.24.4) - transitivePeerDependencies: - - supports-color - '@napi-rs/simple-git-android-arm-eabi@0.1.19': optional: true @@ -5948,41 +5836,41 @@ snapshots: '@napi-rs/simple-git-win32-arm64-msvc': 0.1.19 '@napi-rs/simple-git-win32-x64-msvc': 0.1.19 - '@napi-rs/wasm-runtime@0.2.9': + '@napi-rs/wasm-runtime@0.2.11': dependencies: '@emnapi/core': 1.4.3 '@emnapi/runtime': 1.4.3 '@tybys/wasm-util': 0.9.0 optional: true - '@next/env@15.3.2': {} + '@next/env@15.4.0-canary.61': {} - '@next/eslint-plugin-next@15.3.2': + '@next/eslint-plugin-next@15.4.0-canary.61': dependencies: fast-glob: 3.3.1 - '@next/swc-darwin-arm64@15.3.2': + '@next/swc-darwin-arm64@15.4.0-canary.61': optional: true - '@next/swc-darwin-x64@15.3.2': + '@next/swc-darwin-x64@15.4.0-canary.61': optional: true - '@next/swc-linux-arm64-gnu@15.3.2': + '@next/swc-linux-arm64-gnu@15.4.0-canary.61': optional: true - '@next/swc-linux-arm64-musl@15.3.2': + '@next/swc-linux-arm64-musl@15.4.0-canary.61': optional: true - '@next/swc-linux-x64-gnu@15.3.2': + '@next/swc-linux-x64-gnu@15.4.0-canary.61': optional: true - '@next/swc-linux-x64-musl@15.3.2': + '@next/swc-linux-x64-musl@15.4.0-canary.61': optional: true - '@next/swc-win32-arm64-msvc@15.3.2': + '@next/swc-win32-arm64-msvc@15.4.0-canary.61': optional: true - '@next/swc-win32-x64-msvc@15.3.2': + '@next/swc-win32-x64-msvc@15.4.0-canary.61': optional: true '@nodelib/fs.scandir@2.1.5': @@ -6067,11 +5955,11 @@ snapshots: '@pkgjs/parseargs@0.11.0': optional: true - '@pkgr/core@0.2.4': {} + '@pkgr/core@0.2.7': {} - '@playwright/test@1.52.0': + '@playwright/test@1.53.2': dependencies: - playwright: 1.52.0 + playwright: 1.53.2 '@pm2/agent@2.1.1': dependencies: @@ -6123,133 +6011,133 @@ snapshots: transitivePeerDependencies: - supports-color - '@react-aria/focus@3.20.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + '@react-aria/focus@3.20.5(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': dependencies: - '@react-aria/interactions': 3.25.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@react-aria/utils': 3.28.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@react-types/shared': 3.29.0(react@19.1.0) + '@react-aria/interactions': 3.25.3(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@react-aria/utils': 3.29.1(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@react-types/shared': 3.30.0(react@19.1.0) '@swc/helpers': 0.5.17 clsx: 2.1.1 react: 19.1.0 react-dom: 19.1.0(react@19.1.0) - '@react-aria/interactions@3.25.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + '@react-aria/interactions@3.25.3(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': dependencies: - '@react-aria/ssr': 3.9.8(react@19.1.0) - '@react-aria/utils': 3.28.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@react-stately/flags': 3.1.1 - '@react-types/shared': 3.29.0(react@19.1.0) + '@react-aria/ssr': 3.9.9(react@19.1.0) + '@react-aria/utils': 3.29.1(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@react-stately/flags': 3.1.2 + '@react-types/shared': 3.30.0(react@19.1.0) '@swc/helpers': 0.5.17 react: 19.1.0 react-dom: 19.1.0(react@19.1.0) - '@react-aria/ssr@3.9.8(react@19.1.0)': + '@react-aria/ssr@3.9.9(react@19.1.0)': dependencies: '@swc/helpers': 0.5.17 react: 19.1.0 - '@react-aria/utils@3.28.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + '@react-aria/utils@3.29.1(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': dependencies: - '@react-aria/ssr': 3.9.8(react@19.1.0) - '@react-stately/flags': 3.1.1 - '@react-stately/utils': 3.10.6(react@19.1.0) - '@react-types/shared': 3.29.0(react@19.1.0) + '@react-aria/ssr': 3.9.9(react@19.1.0) + '@react-stately/flags': 3.1.2 + '@react-stately/utils': 3.10.7(react@19.1.0) + '@react-types/shared': 3.30.0(react@19.1.0) '@swc/helpers': 0.5.17 clsx: 2.1.1 react: 19.1.0 react-dom: 19.1.0(react@19.1.0) - '@react-stately/flags@3.1.1': + '@react-stately/flags@3.1.2': dependencies: '@swc/helpers': 0.5.17 - '@react-stately/utils@3.10.6(react@19.1.0)': + '@react-stately/utils@3.10.7(react@19.1.0)': dependencies: '@swc/helpers': 0.5.17 react: 19.1.0 - '@react-types/shared@3.29.0(react@19.1.0)': + '@react-types/shared@3.30.0(react@19.1.0)': dependencies: react: 19.1.0 - '@redis/bloom@5.0.1(@redis/client@5.0.1)': + '@redis/bloom@5.5.6(@redis/client@5.5.6)': dependencies: - '@redis/client': 5.0.1 + '@redis/client': 5.5.6 - '@redis/client@5.0.1': + '@redis/client@5.5.6': dependencies: cluster-key-slot: 1.1.2 - '@redis/json@5.0.1(@redis/client@5.0.1)': + '@redis/json@5.5.6(@redis/client@5.5.6)': dependencies: - '@redis/client': 5.0.1 + '@redis/client': 5.5.6 - '@redis/search@5.0.1(@redis/client@5.0.1)': + '@redis/search@5.5.6(@redis/client@5.5.6)': dependencies: - '@redis/client': 5.0.1 + '@redis/client': 5.5.6 - '@redis/time-series@5.0.1(@redis/client@5.0.1)': + '@redis/time-series@5.5.6(@redis/client@5.5.6)': dependencies: - '@redis/client': 5.0.1 + '@redis/client': 5.5.6 - '@rollup/rollup-android-arm-eabi@4.40.2': + '@rollup/rollup-android-arm-eabi@4.44.1': optional: true - '@rollup/rollup-android-arm64@4.40.2': + '@rollup/rollup-android-arm64@4.44.1': optional: true - '@rollup/rollup-darwin-arm64@4.40.2': + '@rollup/rollup-darwin-arm64@4.44.1': optional: true - '@rollup/rollup-darwin-x64@4.40.2': + '@rollup/rollup-darwin-x64@4.44.1': optional: true - '@rollup/rollup-freebsd-arm64@4.40.2': + '@rollup/rollup-freebsd-arm64@4.44.1': optional: true - '@rollup/rollup-freebsd-x64@4.40.2': + '@rollup/rollup-freebsd-x64@4.44.1': optional: true - '@rollup/rollup-linux-arm-gnueabihf@4.40.2': + '@rollup/rollup-linux-arm-gnueabihf@4.44.1': optional: true - '@rollup/rollup-linux-arm-musleabihf@4.40.2': + '@rollup/rollup-linux-arm-musleabihf@4.44.1': optional: true - '@rollup/rollup-linux-arm64-gnu@4.40.2': + '@rollup/rollup-linux-arm64-gnu@4.44.1': optional: true - '@rollup/rollup-linux-arm64-musl@4.40.2': + '@rollup/rollup-linux-arm64-musl@4.44.1': optional: true - '@rollup/rollup-linux-loongarch64-gnu@4.40.2': + '@rollup/rollup-linux-loongarch64-gnu@4.44.1': optional: true - '@rollup/rollup-linux-powerpc64le-gnu@4.40.2': + '@rollup/rollup-linux-powerpc64le-gnu@4.44.1': optional: true - '@rollup/rollup-linux-riscv64-gnu@4.40.2': + '@rollup/rollup-linux-riscv64-gnu@4.44.1': optional: true - '@rollup/rollup-linux-riscv64-musl@4.40.2': + '@rollup/rollup-linux-riscv64-musl@4.44.1': optional: true - '@rollup/rollup-linux-s390x-gnu@4.40.2': + '@rollup/rollup-linux-s390x-gnu@4.44.1': optional: true - '@rollup/rollup-linux-x64-gnu@4.40.2': + '@rollup/rollup-linux-x64-gnu@4.44.1': optional: true - '@rollup/rollup-linux-x64-musl@4.40.2': + '@rollup/rollup-linux-x64-musl@4.44.1': optional: true - '@rollup/rollup-win32-arm64-msvc@4.40.2': + '@rollup/rollup-win32-arm64-msvc@4.44.1': optional: true - '@rollup/rollup-win32-ia32-msvc@4.40.2': + '@rollup/rollup-win32-ia32-msvc@4.44.1': optional: true - '@rollup/rollup-win32-x64-msvc@4.40.2': + '@rollup/rollup-win32-x64-msvc@4.44.1': optional: true '@shikijs/core@2.5.0': @@ -6296,8 +6184,6 @@ snapshots: '@shikijs/vscode-textmate@10.0.2': {} - '@swc/counter@0.1.3': {} - '@swc/helpers@0.5.15': dependencies: tslib: 2.8.1 @@ -6306,17 +6192,17 @@ snapshots: dependencies: tslib: 2.8.1 - '@tanstack/react-virtual@3.13.8(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + '@tanstack/react-virtual@3.13.12(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': dependencies: - '@tanstack/virtual-core': 3.13.8 + '@tanstack/virtual-core': 3.13.12 react: 19.1.0 react-dom: 19.1.0(react@19.1.0) - '@tanstack/virtual-core@3.13.8': {} + '@tanstack/virtual-core@3.13.12': {} '@theguild/remark-mermaid@0.2.0(react@19.1.0)': dependencies: - mermaid: 11.6.0 + mermaid: 11.8.0 react: 19.1.0 unist-util-visit: 5.0.0 transitivePeerDependencies: @@ -6334,9 +6220,13 @@ snapshots: tslib: 2.8.1 optional: true + '@types/chai@5.2.2': + dependencies: + '@types/deep-eql': 4.0.2 + '@types/concat-stream@2.0.3': dependencies: - '@types/node': 22.15.18 + '@types/node': 24.0.10 '@types/d3-array@3.2.1': {} @@ -6459,16 +6349,13 @@ snapshots: dependencies: '@types/ms': 2.1.0 - '@types/eslint@9.6.1': - dependencies: - '@types/estree': 1.0.7 - '@types/json-schema': 7.0.15 + '@types/deep-eql@4.0.2': {} '@types/estree-jsx@1.0.5': dependencies: - '@types/estree': 1.0.7 + '@types/estree': 1.0.8 - '@types/estree@1.0.7': {} + '@types/estree@1.0.8': {} '@types/geojson@7946.0.16': {} @@ -6496,15 +6383,19 @@ snapshots: '@types/node@12.20.55': {} - '@types/node@22.15.18': + '@types/node@22.16.0': dependencies: undici-types: 6.21.0 - '@types/react-dom@19.1.5(@types/react@19.1.4)': + '@types/node@24.0.10': dependencies: - '@types/react': 19.1.4 + undici-types: 7.8.0 - '@types/react@19.1.4': + '@types/react-dom@19.1.6(@types/react@19.1.8)': + dependencies: + '@types/react': 19.1.8 + + '@types/react@19.1.8': dependencies: csstype: 3.1.3 @@ -6517,57 +6408,72 @@ snapshots: '@types/unist@3.0.3': {} - '@typescript-eslint/eslint-plugin@8.32.1(@typescript-eslint/parser@8.32.1(eslint@9.26.0)(typescript@5.8.3))(eslint@9.26.0)(typescript@5.8.3)': + '@typescript-eslint/eslint-plugin@8.35.1(@typescript-eslint/parser@8.35.1(eslint@9.30.1)(typescript@5.8.3))(eslint@9.30.1)(typescript@5.8.3)': dependencies: '@eslint-community/regexpp': 4.12.1 - '@typescript-eslint/parser': 8.32.1(eslint@9.26.0)(typescript@5.8.3) - '@typescript-eslint/scope-manager': 8.32.1 - '@typescript-eslint/type-utils': 8.32.1(eslint@9.26.0)(typescript@5.8.3) - '@typescript-eslint/utils': 8.32.1(eslint@9.26.0)(typescript@5.8.3) - '@typescript-eslint/visitor-keys': 8.32.1 - eslint: 9.26.0 + '@typescript-eslint/parser': 8.35.1(eslint@9.30.1)(typescript@5.8.3) + '@typescript-eslint/scope-manager': 8.35.1 + '@typescript-eslint/type-utils': 8.35.1(eslint@9.30.1)(typescript@5.8.3) + '@typescript-eslint/utils': 8.35.1(eslint@9.30.1)(typescript@5.8.3) + '@typescript-eslint/visitor-keys': 8.35.1 + eslint: 9.30.1 graphemer: 1.4.0 - ignore: 7.0.4 + ignore: 7.0.5 natural-compare: 1.4.0 ts-api-utils: 2.1.0(typescript@5.8.3) typescript: 5.8.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.32.1(eslint@9.26.0)(typescript@5.8.3)': + '@typescript-eslint/parser@8.35.1(eslint@9.30.1)(typescript@5.8.3)': + dependencies: + '@typescript-eslint/scope-manager': 8.35.1 + '@typescript-eslint/types': 8.35.1 + '@typescript-eslint/typescript-estree': 8.35.1(typescript@5.8.3) + '@typescript-eslint/visitor-keys': 8.35.1 + debug: 4.4.1 + eslint: 9.30.1 + typescript: 5.8.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/project-service@8.35.1(typescript@5.8.3)': dependencies: - '@typescript-eslint/scope-manager': 8.32.1 - '@typescript-eslint/types': 8.32.1 - '@typescript-eslint/typescript-estree': 8.32.1(typescript@5.8.3) - '@typescript-eslint/visitor-keys': 8.32.1 + '@typescript-eslint/tsconfig-utils': 8.35.1(typescript@5.8.3) + '@typescript-eslint/types': 8.35.1 debug: 4.4.1 - eslint: 9.26.0 typescript: 5.8.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/scope-manager@8.32.1': + '@typescript-eslint/scope-manager@8.35.1': dependencies: - '@typescript-eslint/types': 8.32.1 - '@typescript-eslint/visitor-keys': 8.32.1 + '@typescript-eslint/types': 8.35.1 + '@typescript-eslint/visitor-keys': 8.35.1 - '@typescript-eslint/type-utils@8.32.1(eslint@9.26.0)(typescript@5.8.3)': + '@typescript-eslint/tsconfig-utils@8.35.1(typescript@5.8.3)': dependencies: - '@typescript-eslint/typescript-estree': 8.32.1(typescript@5.8.3) - '@typescript-eslint/utils': 8.32.1(eslint@9.26.0)(typescript@5.8.3) + typescript: 5.8.3 + + '@typescript-eslint/type-utils@8.35.1(eslint@9.30.1)(typescript@5.8.3)': + dependencies: + '@typescript-eslint/typescript-estree': 8.35.1(typescript@5.8.3) + '@typescript-eslint/utils': 8.35.1(eslint@9.30.1)(typescript@5.8.3) debug: 4.4.1 - eslint: 9.26.0 + eslint: 9.30.1 ts-api-utils: 2.1.0(typescript@5.8.3) typescript: 5.8.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/types@8.32.1': {} + '@typescript-eslint/types@8.35.1': {} - '@typescript-eslint/typescript-estree@8.32.1(typescript@5.8.3)': + '@typescript-eslint/typescript-estree@8.35.1(typescript@5.8.3)': dependencies: - '@typescript-eslint/types': 8.32.1 - '@typescript-eslint/visitor-keys': 8.32.1 + '@typescript-eslint/project-service': 8.35.1(typescript@5.8.3) + '@typescript-eslint/tsconfig-utils': 8.35.1(typescript@5.8.3) + '@typescript-eslint/types': 8.35.1 + '@typescript-eslint/visitor-keys': 8.35.1 debug: 4.4.1 fast-glob: 3.3.3 is-glob: 4.0.3 @@ -6578,21 +6484,21 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.32.1(eslint@9.26.0)(typescript@5.8.3)': + '@typescript-eslint/utils@8.35.1(eslint@9.30.1)(typescript@5.8.3)': dependencies: - '@eslint-community/eslint-utils': 4.7.0(eslint@9.26.0) - '@typescript-eslint/scope-manager': 8.32.1 - '@typescript-eslint/types': 8.32.1 - '@typescript-eslint/typescript-estree': 8.32.1(typescript@5.8.3) - eslint: 9.26.0 + '@eslint-community/eslint-utils': 4.7.0(eslint@9.30.1) + '@typescript-eslint/scope-manager': 8.35.1 + '@typescript-eslint/types': 8.35.1 + '@typescript-eslint/typescript-estree': 8.35.1(typescript@5.8.3) + eslint: 9.30.1 typescript: 5.8.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/visitor-keys@8.32.1': + '@typescript-eslint/visitor-keys@8.35.1': dependencies: - '@typescript-eslint/types': 8.32.1 - eslint-visitor-keys: 4.2.0 + '@typescript-eslint/types': 8.35.1 + eslint-visitor-keys: 4.2.1 '@typescript/vfs@1.6.1(typescript@5.8.3)': dependencies: @@ -6603,105 +6509,115 @@ snapshots: '@ungap/structured-clone@1.3.0': {} - '@unrs/resolver-binding-darwin-arm64@1.7.2': + '@unrs/resolver-binding-android-arm-eabi@1.10.1': + optional: true + + '@unrs/resolver-binding-android-arm64@1.10.1': optional: true - '@unrs/resolver-binding-darwin-x64@1.7.2': + '@unrs/resolver-binding-darwin-arm64@1.10.1': optional: true - '@unrs/resolver-binding-freebsd-x64@1.7.2': + '@unrs/resolver-binding-darwin-x64@1.10.1': optional: true - '@unrs/resolver-binding-linux-arm-gnueabihf@1.7.2': + '@unrs/resolver-binding-freebsd-x64@1.10.1': optional: true - '@unrs/resolver-binding-linux-arm-musleabihf@1.7.2': + '@unrs/resolver-binding-linux-arm-gnueabihf@1.10.1': optional: true - '@unrs/resolver-binding-linux-arm64-gnu@1.7.2': + '@unrs/resolver-binding-linux-arm-musleabihf@1.10.1': optional: true - '@unrs/resolver-binding-linux-arm64-musl@1.7.2': + '@unrs/resolver-binding-linux-arm64-gnu@1.10.1': optional: true - '@unrs/resolver-binding-linux-ppc64-gnu@1.7.2': + '@unrs/resolver-binding-linux-arm64-musl@1.10.1': optional: true - '@unrs/resolver-binding-linux-riscv64-gnu@1.7.2': + '@unrs/resolver-binding-linux-ppc64-gnu@1.10.1': optional: true - '@unrs/resolver-binding-linux-riscv64-musl@1.7.2': + '@unrs/resolver-binding-linux-riscv64-gnu@1.10.1': optional: true - '@unrs/resolver-binding-linux-s390x-gnu@1.7.2': + '@unrs/resolver-binding-linux-riscv64-musl@1.10.1': optional: true - '@unrs/resolver-binding-linux-x64-gnu@1.7.2': + '@unrs/resolver-binding-linux-s390x-gnu@1.10.1': optional: true - '@unrs/resolver-binding-linux-x64-musl@1.7.2': + '@unrs/resolver-binding-linux-x64-gnu@1.10.1': optional: true - '@unrs/resolver-binding-wasm32-wasi@1.7.2': + '@unrs/resolver-binding-linux-x64-musl@1.10.1': + optional: true + + '@unrs/resolver-binding-wasm32-wasi@1.10.1': dependencies: - '@napi-rs/wasm-runtime': 0.2.9 + '@napi-rs/wasm-runtime': 0.2.11 optional: true - '@unrs/resolver-binding-win32-arm64-msvc@1.7.2': + '@unrs/resolver-binding-win32-arm64-msvc@1.10.1': optional: true - '@unrs/resolver-binding-win32-ia32-msvc@1.7.2': + '@unrs/resolver-binding-win32-ia32-msvc@1.10.1': optional: true - '@unrs/resolver-binding-win32-x64-msvc@1.7.2': + '@unrs/resolver-binding-win32-x64-msvc@1.10.1': optional: true - '@vitest/eslint-plugin@1.1.44(@typescript-eslint/utils@8.32.1(eslint@9.26.0)(typescript@5.8.3))(eslint@9.26.0)(typescript@5.8.3)(vitest@3.1.3(@types/debug@4.1.12)(@types/node@22.15.18)(tsx@4.19.4)(yaml@2.8.0))': + '@vitest/eslint-plugin@1.3.4(eslint@9.30.1)(typescript@5.8.3)(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.0.10)(tsx@4.20.3)(yaml@2.8.0))': dependencies: - '@typescript-eslint/utils': 8.32.1(eslint@9.26.0)(typescript@5.8.3) - eslint: 9.26.0 + '@typescript-eslint/utils': 8.35.1(eslint@9.30.1)(typescript@5.8.3) + eslint: 9.30.1 optionalDependencies: typescript: 5.8.3 - vitest: 3.1.3(@types/debug@4.1.12)(@types/node@22.15.18)(tsx@4.19.4)(yaml@2.8.0) + vitest: 3.2.4(@types/debug@4.1.12)(@types/node@24.0.10)(tsx@4.20.3)(yaml@2.8.0) + transitivePeerDependencies: + - supports-color - '@vitest/expect@3.1.3': + '@vitest/expect@3.2.4': dependencies: - '@vitest/spy': 3.1.3 - '@vitest/utils': 3.1.3 + '@types/chai': 5.2.2 + '@vitest/spy': 3.2.4 + '@vitest/utils': 3.2.4 chai: 5.2.0 tinyrainbow: 2.0.0 - '@vitest/mocker@3.1.3(vite@6.3.5(@types/node@22.15.18)(tsx@4.19.4)(yaml@2.8.0))': + '@vitest/mocker@3.2.4(vite@7.0.2(@types/node@24.0.10)(tsx@4.20.3)(yaml@2.8.0))': dependencies: - '@vitest/spy': 3.1.3 + '@vitest/spy': 3.2.4 estree-walker: 3.0.3 magic-string: 0.30.17 optionalDependencies: - vite: 6.3.5(@types/node@22.15.18)(tsx@4.19.4)(yaml@2.8.0) + vite: 7.0.2(@types/node@24.0.10)(tsx@4.20.3)(yaml@2.8.0) - '@vitest/pretty-format@3.1.3': + '@vitest/pretty-format@3.2.4': dependencies: tinyrainbow: 2.0.0 - '@vitest/runner@3.1.3': + '@vitest/runner@3.2.4': dependencies: - '@vitest/utils': 3.1.3 + '@vitest/utils': 3.2.4 pathe: 2.0.3 + strip-literal: 3.0.0 - '@vitest/snapshot@3.1.3': + '@vitest/snapshot@3.2.4': dependencies: - '@vitest/pretty-format': 3.1.3 + '@vitest/pretty-format': 3.2.4 magic-string: 0.30.17 pathe: 2.0.3 - '@vitest/spy@3.1.3': + '@vitest/spy@3.2.4': dependencies: - tinyspy: 3.0.2 + tinyspy: 4.0.3 - '@vitest/utils@3.1.3': + '@vitest/utils@3.2.4': dependencies: - '@vitest/pretty-format': 3.1.3 - loupe: 3.1.3 + '@vitest/pretty-format': 3.2.4 + loupe: 3.1.4 tinyrainbow: 2.0.0 '@xmldom/xmldom@0.9.8': {} @@ -6717,16 +6633,11 @@ snapshots: mime-types: 2.1.35 negotiator: 0.6.3 - accepts@2.0.0: + acorn-jsx@5.3.2(acorn@8.15.0): dependencies: - mime-types: 3.0.1 - negotiator: 1.0.0 + acorn: 8.15.0 - acorn-jsx@5.3.2(acorn@8.14.1): - dependencies: - acorn: 8.14.1 - - acorn@8.14.1: {} + acorn@8.15.0: {} agent-base@7.1.3: {} @@ -6777,7 +6688,7 @@ snapshots: ansi-styles@6.2.1: {} - ansis@4.0.0: {} + ansis@4.0.0-node10: {} anymatch@3.1.3: dependencies: @@ -6801,14 +6712,16 @@ snapshots: call-bound: 1.0.4 is-array-buffer: 3.0.5 - array-includes@3.1.8: + array-includes@3.1.9: dependencies: call-bind: 1.0.8 + call-bound: 1.0.4 define-properties: 1.2.1 - es-abstract: 1.23.9 + es-abstract: 1.24.0 es-object-atoms: 1.1.1 get-intrinsic: 1.3.0 is-string: 1.1.1 + math-intrinsics: 1.1.0 array-iterate@2.0.1: {} @@ -6818,7 +6731,7 @@ snapshots: dependencies: call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.9 + es-abstract: 1.24.0 es-errors: 1.3.0 es-object-atoms: 1.1.1 es-shim-unscopables: 1.1.0 @@ -6827,21 +6740,21 @@ snapshots: dependencies: call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.9 + es-abstract: 1.24.0 es-shim-unscopables: 1.1.0 array.prototype.flatmap@1.3.3: dependencies: call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.9 + es-abstract: 1.24.0 es-shim-unscopables: 1.1.0 array.prototype.tosorted@1.1.4: dependencies: call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.9 + es-abstract: 1.24.0 es-errors: 1.3.0 es-shim-unscopables: 1.1.0 @@ -6850,7 +6763,7 @@ snapshots: array-buffer-byte-length: 1.0.2 call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.9 + es-abstract: 1.24.0 es-errors: 1.3.0 get-intrinsic: 1.3.0 is-array-buffer: 3.0.5 @@ -6881,13 +6794,13 @@ snapshots: avvio@9.1.0: dependencies: - '@fastify/error': 4.1.0 + '@fastify/error': 4.2.0 fastq: 1.19.1 - axios@1.9.0: + axios@1.10.0: dependencies: follow-redirects: 1.15.9(debug@4.3.7) - form-data: 4.0.2 + form-data: 4.0.3 proxy-from-env: 1.1.0 transitivePeerDependencies: - debug @@ -6913,20 +6826,6 @@ snapshots: bodec@0.1.0: {} - body-parser@2.2.0: - dependencies: - bytes: 3.1.2 - content-type: 1.0.5 - debug: 4.4.1 - http-errors: 2.0.0 - iconv-lite: 0.6.3 - on-finished: 2.4.1 - qs: 6.14.0 - raw-body: 3.0.0 - type-is: 2.0.1 - transitivePeerDependencies: - - supports-color - boxen@7.0.0: dependencies: ansi-align: 3.0.1 @@ -6938,12 +6837,12 @@ snapshots: widest-line: 4.0.1 wrap-ansi: 8.1.0 - brace-expansion@1.1.11: + brace-expansion@1.1.12: dependencies: balanced-match: 1.0.2 concat-map: 0.0.1 - brace-expansion@2.0.1: + brace-expansion@2.0.2: dependencies: balanced-match: 1.0.2 @@ -6953,14 +6852,8 @@ snapshots: buffer-from@1.1.2: {} - busboy@1.6.0: - dependencies: - streamsearch: 1.1.0 - bytes@3.0.0: {} - bytes@3.1.2: {} - cac@6.7.14: {} call-bind-apply-helpers@1.0.2: @@ -6984,7 +6877,7 @@ snapshots: camelcase@7.0.1: {} - caniuse-lite@1.0.30001718: {} + caniuse-lite@1.0.30001726: {} ccount@2.0.1: {} @@ -6993,8 +6886,8 @@ snapshots: assertion-error: 2.0.1 check-error: 2.1.1 deep-eql: 5.0.2 - loupe: 3.1.3 - pathval: 2.0.0 + loupe: 3.1.4 + pathval: 2.0.1 chalk-template@0.4.0: dependencies: @@ -7153,27 +7046,12 @@ snapshots: content-disposition@0.5.2: {} - content-disposition@1.0.0: - dependencies: - safe-buffer: 5.2.1 - - content-type@1.0.5: {} - - cookie-signature@1.2.2: {} - - cookie@0.7.2: {} - cookie@1.0.2: {} copy-anything@3.0.5: dependencies: is-what: 4.1.16 - cors@2.8.5: - dependencies: - object-assign: 4.1.1 - vary: 1.1.2 - cose-base@1.0.3: dependencies: layout-base: 1.0.2 @@ -7420,7 +7298,7 @@ snapshots: dependencies: ms: 2.1.3 - decode-named-character-reference@1.1.0: + decode-named-character-reference@1.2.0: dependencies: character-entities: 2.0.2 @@ -7454,8 +7332,6 @@ snapshots: delayed-stream@1.0.0: {} - depd@2.0.0: {} - dequal@2.0.3: {} detect-indent@6.1.0: {} @@ -7481,14 +7357,14 @@ snapshots: dependencies: esutils: 2.0.3 - dompurify@3.2.5: + dompurify@3.2.6: optionalDependencies: '@types/trusted-types': 2.0.7 dotenv-cli@8.0.0: dependencies: cross-spawn: 7.0.6 - dotenv: 16.5.0 + dotenv: 16.6.1 dotenv-expand: 10.0.0 minimist: 1.2.8 @@ -7496,7 +7372,7 @@ snapshots: dotenv@16.0.3: {} - dotenv@16.5.0: {} + dotenv@16.6.1: {} dunder-proto@1.0.1: dependencies: @@ -7506,8 +7382,6 @@ snapshots: eastasianwidth@0.2.0: {} - ee-first@1.1.1: {} - emoji-regex-xs@1.0.0: {} emoji-regex@10.4.0: {} @@ -7516,9 +7390,7 @@ snapshots: emoji-regex@9.2.2: {} - encodeurl@2.0.0: {} - - end-of-stream@1.4.4: + end-of-stream@1.4.5: dependencies: once: 1.4.0 @@ -7531,7 +7403,7 @@ snapshots: ansi-colors: 4.1.3 strip-ansi: 6.0.1 - entities@6.0.0: {} + entities@6.0.1: {} err-code@2.0.3: {} @@ -7539,7 +7411,7 @@ snapshots: dependencies: is-arrayish: 0.2.1 - es-abstract@1.23.9: + es-abstract@1.24.0: dependencies: array-buffer-byte-length: 1.0.2 arraybuffer.prototype.slice: 1.0.4 @@ -7568,7 +7440,9 @@ snapshots: is-array-buffer: 3.0.5 is-callable: 1.2.7 is-data-view: 1.0.2 + is-negative-zero: 2.0.3 is-regex: 1.2.1 + is-set: 2.0.3 is-shared-array-buffer: 1.0.4 is-string: 1.1.1 is-typed-array: 1.1.15 @@ -7583,6 +7457,7 @@ snapshots: safe-push-apply: 1.0.0 safe-regex-test: 1.1.0 set-proto: 1.0.0 + stop-iteration-iterator: 1.1.0 string.prototype.trim: 1.2.10 string.prototype.trimend: 1.0.9 string.prototype.trimstart: 1.0.8 @@ -7602,7 +7477,7 @@ snapshots: call-bind: 1.0.8 call-bound: 1.0.4 define-properties: 1.2.1 - es-abstract: 1.23.9 + es-abstract: 1.24.0 es-errors: 1.3.0 es-set-tostringtag: 2.1.0 function-bind: 1.1.2 @@ -7649,39 +7524,37 @@ snapshots: esast-util-from-js@2.0.1: dependencies: '@types/estree-jsx': 1.0.5 - acorn: 8.14.1 + acorn: 8.15.0 esast-util-from-estree: 2.0.0 vfile-message: 4.0.2 - esbuild@0.25.4: + esbuild@0.25.5: optionalDependencies: - '@esbuild/aix-ppc64': 0.25.4 - '@esbuild/android-arm': 0.25.4 - '@esbuild/android-arm64': 0.25.4 - '@esbuild/android-x64': 0.25.4 - '@esbuild/darwin-arm64': 0.25.4 - '@esbuild/darwin-x64': 0.25.4 - '@esbuild/freebsd-arm64': 0.25.4 - '@esbuild/freebsd-x64': 0.25.4 - '@esbuild/linux-arm': 0.25.4 - '@esbuild/linux-arm64': 0.25.4 - '@esbuild/linux-ia32': 0.25.4 - '@esbuild/linux-loong64': 0.25.4 - '@esbuild/linux-mips64el': 0.25.4 - '@esbuild/linux-ppc64': 0.25.4 - '@esbuild/linux-riscv64': 0.25.4 - '@esbuild/linux-s390x': 0.25.4 - '@esbuild/linux-x64': 0.25.4 - '@esbuild/netbsd-arm64': 0.25.4 - '@esbuild/netbsd-x64': 0.25.4 - '@esbuild/openbsd-arm64': 0.25.4 - '@esbuild/openbsd-x64': 0.25.4 - '@esbuild/sunos-x64': 0.25.4 - '@esbuild/win32-arm64': 0.25.4 - '@esbuild/win32-ia32': 0.25.4 - '@esbuild/win32-x64': 0.25.4 - - escape-html@1.0.3: {} + '@esbuild/aix-ppc64': 0.25.5 + '@esbuild/android-arm': 0.25.5 + '@esbuild/android-arm64': 0.25.5 + '@esbuild/android-x64': 0.25.5 + '@esbuild/darwin-arm64': 0.25.5 + '@esbuild/darwin-x64': 0.25.5 + '@esbuild/freebsd-arm64': 0.25.5 + '@esbuild/freebsd-x64': 0.25.5 + '@esbuild/linux-arm': 0.25.5 + '@esbuild/linux-arm64': 0.25.5 + '@esbuild/linux-ia32': 0.25.5 + '@esbuild/linux-loong64': 0.25.5 + '@esbuild/linux-mips64el': 0.25.5 + '@esbuild/linux-ppc64': 0.25.5 + '@esbuild/linux-riscv64': 0.25.5 + '@esbuild/linux-s390x': 0.25.5 + '@esbuild/linux-x64': 0.25.5 + '@esbuild/netbsd-arm64': 0.25.5 + '@esbuild/netbsd-x64': 0.25.5 + '@esbuild/openbsd-arm64': 0.25.5 + '@esbuild/openbsd-x64': 0.25.5 + '@esbuild/sunos-x64': 0.25.5 + '@esbuild/win32-arm64': 0.25.5 + '@esbuild/win32-ia32': 0.25.5 + '@esbuild/win32-x64': 0.25.5 escape-string-regexp@4.0.0: {} @@ -7695,44 +7568,43 @@ snapshots: optionalDependencies: source-map: 0.6.1 - eslint-config-prettier@10.1.5(eslint@9.26.0): + eslint-config-prettier@10.1.5(eslint@9.30.1): dependencies: - eslint: 9.26.0 + eslint: 9.30.1 - eslint-import-resolver-node@0.3.9: + eslint-import-context@0.1.9(unrs-resolver@1.10.1): dependencies: - debug: 3.2.7 - is-core-module: 2.16.1 - resolve: 1.22.10 - transitivePeerDependencies: - - supports-color + get-tsconfig: 4.10.1 + stable-hash-x: 0.2.0 + optionalDependencies: + unrs-resolver: 1.10.1 - eslint-import-resolver-typescript@4.3.4(eslint-plugin-import-x@4.11.1(eslint@9.26.0)(typescript@5.8.3))(eslint@9.26.0): + eslint-import-resolver-typescript@4.4.4(eslint-plugin-import-x@4.16.1(@typescript-eslint/utils@8.35.1(eslint@9.30.1)(typescript@5.8.3))(eslint@9.30.1))(eslint@9.30.1): dependencies: debug: 4.4.1 - eslint: 9.26.0 - get-tsconfig: 4.10.0 + eslint: 9.30.1 + eslint-import-context: 0.1.9(unrs-resolver@1.10.1) + get-tsconfig: 4.10.1 is-bun-module: 2.0.0 - stable-hash: 0.0.5 - tinyglobby: 0.2.13 - unrs-resolver: 1.7.2 + stable-hash-x: 0.2.0 + tinyglobby: 0.2.14 + unrs-resolver: 1.10.1 optionalDependencies: - eslint-plugin-import-x: 4.11.1(eslint@9.26.0)(typescript@5.8.3) + eslint-plugin-import-x: 4.16.1(@typescript-eslint/utils@8.35.1(eslint@9.30.1)(typescript@5.8.3))(eslint@9.30.1) transitivePeerDependencies: - supports-color - eslint-mdx@3.4.1(eslint@9.26.0): + eslint-mdx@3.6.0(eslint@9.30.1): dependencies: - acorn: 8.14.1 - acorn-jsx: 5.3.2(acorn@8.14.1) - eslint: 9.26.0 - espree: 10.3.0 + acorn: 8.15.0 + acorn-jsx: 5.3.2(acorn@8.15.0) + eslint: 9.30.1 + espree: 10.4.0 estree-util-visit: 2.0.0 remark-mdx: 3.1.0 remark-parse: 11.0.0 remark-stringify: 11.0.0 - synckit: 0.11.5 - tslib: 2.8.1 + synckit: 0.11.8 unified: 11.0.5 unified-engine: 11.2.2 unist-util-visit: 5.0.0 @@ -7742,39 +7614,38 @@ snapshots: - bluebird - supports-color - eslint-plugin-check-file@3.2.0(eslint@9.26.0): + eslint-plugin-check-file@3.3.0(eslint@9.30.1): dependencies: - eslint: 9.26.0 + eslint: 9.30.1 is-glob: 4.0.3 micromatch: 4.0.8 - eslint-plugin-import-x@4.11.1(eslint@9.26.0)(typescript@5.8.3): + eslint-plugin-import-x@4.16.1(@typescript-eslint/utils@8.35.1(eslint@9.30.1)(typescript@5.8.3))(eslint@9.30.1): dependencies: - '@typescript-eslint/utils': 8.32.1(eslint@9.26.0)(typescript@5.8.3) + '@typescript-eslint/types': 8.35.1 comment-parser: 1.4.1 debug: 4.4.1 - eslint: 9.26.0 - eslint-import-resolver-node: 0.3.9 - get-tsconfig: 4.10.0 + eslint: 9.30.1 + eslint-import-context: 0.1.9(unrs-resolver@1.10.1) is-glob: 4.0.3 - minimatch: 10.0.1 + minimatch: 10.0.3 semver: 7.7.2 - stable-hash: 0.0.5 - tslib: 2.8.1 - unrs-resolver: 1.7.2 + stable-hash-x: 0.2.0 + unrs-resolver: 1.10.1 + optionalDependencies: + '@typescript-eslint/utils': 8.35.1(eslint@9.30.1)(typescript@5.8.3) transitivePeerDependencies: - supports-color - - typescript - eslint-plugin-jsdoc@50.6.17(eslint@9.26.0): + eslint-plugin-jsdoc@51.3.3(eslint@9.30.1): dependencies: - '@es-joy/jsdoccomment': 0.50.1 + '@es-joy/jsdoccomment': 0.52.0 are-docs-informative: 0.0.2 comment-parser: 1.4.1 debug: 4.4.1 escape-string-regexp: 4.0.0 - eslint: 9.26.0 - espree: 10.3.0 + eslint: 9.30.1 + espree: 10.4.0 esquery: 1.6.0 parse-imports-exports: 0.2.4 semver: 7.7.2 @@ -7782,18 +7653,17 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-plugin-mdx@3.4.1(eslint@9.26.0): + eslint-plugin-mdx@3.6.0(eslint@9.30.1): dependencies: - eslint: 9.26.0 - eslint-mdx: 3.4.1(eslint@9.26.0) + eslint: 9.30.1 + eslint-mdx: 3.6.0(eslint@9.30.1) mdast-util-from-markdown: 2.0.2 mdast-util-mdx: 3.0.0 micromark-extension-mdxjs: 3.0.0 remark-mdx: 3.1.0 remark-parse: 11.0.0 remark-stringify: 11.0.0 - synckit: 0.11.5 - tslib: 2.8.1 + synckit: 0.11.8 unified: 11.0.5 vfile: 6.0.3 transitivePeerDependencies: @@ -7803,19 +7673,19 @@ snapshots: eslint-plugin-only-warn@1.1.0: {} - eslint-plugin-react-hooks@5.2.0(eslint@9.26.0): + eslint-plugin-react-hooks@5.2.0(eslint@9.30.1): dependencies: - eslint: 9.26.0 + eslint: 9.30.1 - eslint-plugin-react@7.37.5(eslint@9.26.0): + eslint-plugin-react@7.37.5(eslint@9.30.1): dependencies: - array-includes: 3.1.8 + array-includes: 3.1.9 array.prototype.findlast: 1.2.5 array.prototype.flatmap: 1.3.3 array.prototype.tosorted: 1.1.4 doctrine: 2.1.0 es-iterator-helpers: 1.2.1 - eslint: 9.26.0 + eslint: 9.30.1 estraverse: 5.3.0 hasown: 2.0.2 jsx-ast-utils: 3.3.5 @@ -7829,45 +7699,44 @@ snapshots: string.prototype.matchall: 4.0.12 string.prototype.repeat: 1.0.0 - eslint-plugin-turbo@2.5.3(eslint@9.26.0)(turbo@2.5.3): + eslint-plugin-turbo@2.5.4(eslint@9.30.1)(turbo@2.5.4): dependencies: dotenv: 16.0.3 - eslint: 9.26.0 - turbo: 2.5.3 + eslint: 9.30.1 + turbo: 2.5.4 - eslint-scope@8.3.0: + eslint-scope@8.4.0: dependencies: esrecurse: 4.3.0 estraverse: 5.3.0 eslint-visitor-keys@3.4.3: {} - eslint-visitor-keys@4.2.0: {} + eslint-visitor-keys@4.2.1: {} - eslint@9.26.0: + eslint@9.30.1: dependencies: - '@eslint-community/eslint-utils': 4.7.0(eslint@9.26.0) + '@eslint-community/eslint-utils': 4.7.0(eslint@9.30.1) '@eslint-community/regexpp': 4.12.1 - '@eslint/config-array': 0.20.0 - '@eslint/config-helpers': 0.2.2 - '@eslint/core': 0.13.0 + '@eslint/config-array': 0.21.0 + '@eslint/config-helpers': 0.3.0 + '@eslint/core': 0.14.0 '@eslint/eslintrc': 3.3.1 - '@eslint/js': 9.26.0 - '@eslint/plugin-kit': 0.2.8 + '@eslint/js': 9.30.1 + '@eslint/plugin-kit': 0.3.3 '@humanfs/node': 0.16.6 '@humanwhocodes/module-importer': 1.0.1 '@humanwhocodes/retry': 0.4.3 - '@modelcontextprotocol/sdk': 1.11.3 - '@types/estree': 1.0.7 + '@types/estree': 1.0.8 '@types/json-schema': 7.0.15 ajv: 6.12.6 chalk: 4.1.2 cross-spawn: 7.0.6 debug: 4.4.1 escape-string-regexp: 4.0.0 - eslint-scope: 8.3.0 - eslint-visitor-keys: 4.2.0 - espree: 10.3.0 + eslint-scope: 8.4.0 + eslint-visitor-keys: 4.2.1 + espree: 10.4.0 esquery: 1.6.0 esutils: 2.0.3 fast-deep-equal: 3.1.3 @@ -7882,17 +7751,16 @@ snapshots: minimatch: 3.1.2 natural-compare: 1.4.0 optionator: 0.9.4 - zod: 3.24.4 transitivePeerDependencies: - supports-color esm@3.2.25: {} - espree@10.3.0: + espree@10.4.0: dependencies: - acorn: 8.14.1 - acorn-jsx: 5.3.2(acorn@8.14.1) - eslint-visitor-keys: 4.2.0 + acorn: 8.15.0 + acorn-jsx: 5.3.2(acorn@8.15.0) + eslint-visitor-keys: 4.2.1 esprima@4.0.1: {} @@ -7908,7 +7776,7 @@ snapshots: estree-util-attach-comments@3.0.0: dependencies: - '@types/estree': 1.0.7 + '@types/estree': 1.0.8 estree-util-build-jsx@3.0.1: dependencies: @@ -7923,7 +7791,7 @@ snapshots: estree-util-scope@1.0.0: dependencies: - '@types/estree': 1.0.7 + '@types/estree': 1.0.8 devlop: 1.1.0 estree-util-to-js@2.0.0: @@ -7934,7 +7802,7 @@ snapshots: estree-util-value-to-estree@3.4.0: dependencies: - '@types/estree': 1.0.7 + '@types/estree': 1.0.8 estree-util-visit@2.0.0: dependencies: @@ -7943,22 +7811,14 @@ snapshots: estree-walker@3.0.3: dependencies: - '@types/estree': 1.0.7 + '@types/estree': 1.0.8 esutils@2.0.3: {} - etag@1.8.1: {} - eventemitter2@5.0.1: {} eventemitter2@6.4.9: {} - eventsource-parser@3.0.2: {} - - eventsource@3.0.7: - dependencies: - eventsource-parser: 3.0.2 - execa@5.1.1: dependencies: cross-spawn: 7.0.6 @@ -7985,43 +7845,7 @@ snapshots: expect-type@1.2.1: {} - express-rate-limit@7.5.0(express@5.1.0): - dependencies: - express: 5.1.0 - - express@5.1.0: - dependencies: - accepts: 2.0.0 - body-parser: 2.2.0 - content-disposition: 1.0.0 - content-type: 1.0.5 - cookie: 0.7.2 - cookie-signature: 1.2.2 - debug: 4.4.1 - 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.1 - 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.1 - type-is: 2.0.1 - vary: 1.1.2 - transitivePeerDependencies: - - supports-color - - exsolve@1.0.5: {} + exsolve@1.0.7: {} extend@3.0.2: {} @@ -8086,10 +7910,10 @@ snapshots: fast-uri@3.0.6: {} - fastify@5.3.3: + fastify@5.4.0: dependencies: '@fastify/ajv-compiler': 4.0.2 - '@fastify/error': 4.1.0 + '@fastify/error': 4.2.0 '@fastify/fast-json-stringify-compiler': 5.0.3 '@fastify/proxy-addr': 5.0.0 abstract-logging: 2.0.1 @@ -8097,7 +7921,7 @@ snapshots: fast-json-stringify: 6.0.1 find-my-way: 9.3.0 light-my-request: 6.6.0 - pino: 9.6.0 + pino: 9.7.0 process-warning: 5.0.0 rfdc: 1.4.1 secure-json-parse: 4.0.0 @@ -8114,7 +7938,7 @@ snapshots: fclone@1.0.11: {} - fdir@6.4.4(picomatch@4.0.2): + fdir@6.4.6(picomatch@4.0.2): optionalDependencies: picomatch: 4.0.2 @@ -8126,17 +7950,6 @@ snapshots: dependencies: to-regex-range: 5.0.1 - finalhandler@2.1.0: - dependencies: - debug: 4.4.1 - encodeurl: 2.0.0 - escape-html: 1.0.3 - on-finished: 2.4.1 - parseurl: 1.3.3 - statuses: 2.0.1 - transitivePeerDependencies: - - supports-color - find-my-way@9.3.0: dependencies: fast-deep-equal: 3.1.3 @@ -8173,19 +7986,16 @@ snapshots: cross-spawn: 7.0.6 signal-exit: 4.1.0 - form-data@4.0.2: + form-data@4.0.3: dependencies: asynckit: 0.4.0 combined-stream: 1.0.8 es-set-tostringtag: 2.1.0 + hasown: 2.0.2 mime-types: 2.1.35 format@0.2.2: {} - forwarded@0.2.0: {} - - fresh@2.0.0: {} - fs-extra@7.0.1: dependencies: graceful-fs: 4.2.11 @@ -8245,7 +8055,7 @@ snapshots: es-errors: 1.3.0 get-intrinsic: 1.3.0 - get-tsconfig@4.10.0: + get-tsconfig@4.10.1: dependencies: resolve-pkg-maps: 1.0.0 @@ -8288,7 +8098,7 @@ snapshots: globals@15.15.0: {} - globals@16.1.0: {} + globals@16.3.0: {} globalthis@1.0.4: dependencies: @@ -8393,7 +8203,7 @@ snapshots: hast-util-to-estree@3.1.3: dependencies: - '@types/estree': 1.0.7 + '@types/estree': 1.0.8 '@types/estree-jsx': 1.0.5 '@types/hast': 3.0.4 comma-separated-tokens: 2.0.3 @@ -8406,7 +8216,7 @@ snapshots: mdast-util-mdxjs-esm: 2.0.1 property-information: 7.1.0 space-separated-tokens: 2.0.2 - style-to-js: 1.1.16 + style-to-js: 1.1.17 unist-util-position: 5.0.0 zwitch: 2.0.4 transitivePeerDependencies: @@ -8428,7 +8238,7 @@ snapshots: hast-util-to-jsx-runtime@2.3.6: dependencies: - '@types/estree': 1.0.7 + '@types/estree': 1.0.8 '@types/hast': 3.0.4 '@types/unist': 3.0.3 comma-separated-tokens: 2.0.3 @@ -8440,7 +8250,7 @@ snapshots: mdast-util-mdxjs-esm: 2.0.1 property-information: 7.1.0 space-separated-tokens: 2.0.2 - style-to-js: 1.1.16 + style-to-js: 1.1.17 unist-util-position: 5.0.0 vfile-message: 4.0.2 transitivePeerDependencies: @@ -8487,14 +8297,6 @@ snapshots: html-void-elements@3.0.0: {} - http-errors@2.0.0: - dependencies: - depd: 2.0.0 - inherits: 2.0.4 - setprototypeof: 1.2.0 - statuses: 2.0.1 - toidentifier: 1.0.1 - http-proxy-agent@7.0.2: dependencies: agent-base: 7.1.3 @@ -8527,7 +8329,7 @@ snapshots: ignore@6.0.2: {} - ignore@7.0.4: {} + ignore@7.0.5: {} import-fresh@3.3.1: dependencies: @@ -8561,8 +8363,6 @@ snapshots: jsbn: 1.1.0 sprintf-js: 1.1.3 - ipaddr.js@1.9.1: {} - ipaddr.js@2.2.0: {} is-alphabetical@2.0.1: {} @@ -8660,6 +8460,8 @@ snapshots: is-map@2.0.3: {} + is-negative-zero@2.0.3: {} + is-number-object@1.1.1: dependencies: call-bound: 1.0.4 @@ -8671,8 +8473,6 @@ snapshots: is-port-reachable@4.0.0: {} - is-promise@4.0.0: {} - is-regex@1.2.1: dependencies: call-bound: 1.0.4 @@ -8768,6 +8568,8 @@ snapshots: js-tokens@4.0.0: {} + js-tokens@9.0.1: {} + js-yaml@3.14.1: dependencies: argparse: 1.0.10 @@ -8804,7 +8606,7 @@ snapshots: jsx-ast-utils@3.3.5: dependencies: - array-includes: 3.1.8 + array-includes: 3.1.9 array.prototype.flat: 1.3.3 object.assign: 4.1.7 object.values: 1.2.1 @@ -8858,7 +8660,7 @@ snapshots: local-pkg@1.1.1: dependencies: mlly: 1.7.4 - pkg-types: 2.1.0 + pkg-types: 2.2.0 quansync: 0.2.10 locate-path@5.0.0: @@ -8883,7 +8685,7 @@ snapshots: dependencies: js-tokens: 4.0.0 - loupe@3.1.3: {} + loupe@3.1.4: {} lru-cache@10.4.3: {} @@ -8897,13 +8699,13 @@ snapshots: magic-string@0.30.17: dependencies: - '@jridgewell/sourcemap-codec': 1.5.0 + '@jridgewell/sourcemap-codec': 1.5.4 markdown-extensions@2.0.0: {} markdown-table@3.0.4: {} - marked@15.0.11: {} + marked@15.0.12: {} math-intrinsics@1.1.0: {} @@ -8925,7 +8727,7 @@ snapshots: dependencies: '@types/mdast': 4.0.4 '@types/unist': 3.0.3 - decode-named-character-reference: 1.1.0 + decode-named-character-reference: 1.2.0 devlop: 1.1.0 mdast-util-to-string: 4.0.0 micromark: 4.0.2 @@ -9100,19 +8902,15 @@ snapshots: dependencies: '@types/mdast': 4.0.4 - media-typer@1.1.0: {} - - merge-descriptors@2.0.0: {} - merge-stream@2.0.0: {} merge2@1.4.1: {} - mermaid@11.6.0: + mermaid@11.8.0: dependencies: '@braintree/sanitize-url': 7.1.1 '@iconify/utils': 2.3.0 - '@mermaid-js/parser': 0.4.0 + '@mermaid-js/parser': 0.6.0 '@types/d3': 7.4.3 cytoscape: 3.32.0 cytoscape-cose-bilkent: 4.1.0(cytoscape@3.32.0) @@ -9121,11 +8919,11 @@ snapshots: d3-sankey: 0.12.3 dagre-d3-es: 7.0.11 dayjs: 1.11.13 - dompurify: 3.2.5 + dompurify: 3.2.6 katex: 0.16.22 khroma: 2.1.0 lodash-es: 4.17.21 - marked: 15.0.11 + marked: 15.0.12 roughjs: 4.6.6 stylis: 4.3.6 ts-dedent: 2.2.0 @@ -9137,7 +8935,7 @@ snapshots: micromark-core-commonmark@2.0.3: dependencies: - decode-named-character-reference: 1.1.0 + decode-named-character-reference: 1.2.0 devlop: 1.1.0 micromark-factory-destination: 2.0.1 micromark-factory-label: 2.0.1 @@ -9231,7 +9029,7 @@ snapshots: micromark-extension-mdx-expression@3.0.1: dependencies: - '@types/estree': 1.0.7 + '@types/estree': 1.0.8 devlop: 1.1.0 micromark-factory-mdx-expression: 2.0.3 micromark-factory-space: 2.0.1 @@ -9242,7 +9040,7 @@ snapshots: micromark-extension-mdx-jsx@3.0.2: dependencies: - '@types/estree': 1.0.7 + '@types/estree': 1.0.8 devlop: 1.1.0 estree-util-is-identifier-name: 3.0.0 micromark-factory-mdx-expression: 2.0.3 @@ -9259,7 +9057,7 @@ snapshots: micromark-extension-mdxjs-esm@3.0.0: dependencies: - '@types/estree': 1.0.7 + '@types/estree': 1.0.8 devlop: 1.1.0 micromark-core-commonmark: 2.0.3 micromark-util-character: 2.1.1 @@ -9271,8 +9069,8 @@ snapshots: micromark-extension-mdxjs@3.0.0: dependencies: - acorn: 8.14.1 - acorn-jsx: 5.3.2(acorn@8.14.1) + acorn: 8.15.0 + acorn-jsx: 5.3.2(acorn@8.15.0) micromark-extension-mdx-expression: 3.0.1 micromark-extension-mdx-jsx: 3.0.2 micromark-extension-mdx-md: 2.0.0 @@ -9295,7 +9093,7 @@ snapshots: micromark-factory-mdx-expression@2.0.3: dependencies: - '@types/estree': 1.0.7 + '@types/estree': 1.0.8 devlop: 1.1.0 micromark-factory-space: 2.0.1 micromark-util-character: 2.1.1 @@ -9350,7 +9148,7 @@ snapshots: micromark-util-decode-string@2.0.1: dependencies: - decode-named-character-reference: 1.1.0 + decode-named-character-reference: 1.2.0 micromark-util-character: 2.1.1 micromark-util-decode-numeric-character-reference: 2.0.2 micromark-util-symbol: 2.0.1 @@ -9359,7 +9157,7 @@ snapshots: micromark-util-events-to-acorn@2.0.3: dependencies: - '@types/estree': 1.0.7 + '@types/estree': 1.0.8 '@types/unist': 3.0.3 devlop: 1.1.0 estree-util-visit: 2.0.0 @@ -9398,7 +9196,7 @@ snapshots: dependencies: '@types/debug': 4.1.12 debug: 4.4.1 - decode-named-character-reference: 1.1.0 + decode-named-character-reference: 1.2.0 devlop: 1.1.0 micromark-core-commonmark: 2.0.3 micromark-factory-space: 2.0.1 @@ -9435,25 +9233,21 @@ snapshots: dependencies: mime-db: 1.52.0 - mime-types@3.0.1: - dependencies: - mime-db: 1.54.0 - mimic-fn@2.1.0: {} mimic-fn@4.0.0: {} - minimatch@10.0.1: + minimatch@10.0.3: dependencies: - brace-expansion: 2.0.1 + '@isaacs/brace-expansion': 5.0.0 minimatch@3.1.2: dependencies: - brace-expansion: 1.1.11 + brace-expansion: 1.1.12 minimatch@9.0.5: dependencies: - brace-expansion: 2.0.1 + brace-expansion: 2.0.2 minimist@1.2.8: {} @@ -9465,7 +9259,7 @@ snapshots: mlly@1.7.4: dependencies: - acorn: 8.14.1 + acorn: 8.15.0 pathe: 2.0.3 pkg-types: 1.3.1 ufo: 1.6.1 @@ -9482,7 +9276,7 @@ snapshots: nanoid@3.3.11: {} - napi-postinstall@0.2.4: {} + napi-postinstall@0.3.0: {} natural-compare@1.4.0: {} @@ -9505,56 +9299,54 @@ snapshots: react: 19.1.0 react-dom: 19.1.0(react@19.1.0) - next@15.3.2(@playwright/test@1.52.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0): + next@15.4.0-canary.61(@playwright/test@1.53.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0): dependencies: - '@next/env': 15.3.2 - '@swc/counter': 0.1.3 + '@next/env': 15.4.0-canary.61 '@swc/helpers': 0.5.15 - busboy: 1.6.0 - caniuse-lite: 1.0.30001718 + caniuse-lite: 1.0.30001726 postcss: 8.4.31 react: 19.1.0 react-dom: 19.1.0(react@19.1.0) styled-jsx: 5.1.6(react@19.1.0) optionalDependencies: - '@next/swc-darwin-arm64': 15.3.2 - '@next/swc-darwin-x64': 15.3.2 - '@next/swc-linux-arm64-gnu': 15.3.2 - '@next/swc-linux-arm64-musl': 15.3.2 - '@next/swc-linux-x64-gnu': 15.3.2 - '@next/swc-linux-x64-musl': 15.3.2 - '@next/swc-win32-arm64-msvc': 15.3.2 - '@next/swc-win32-x64-msvc': 15.3.2 - '@playwright/test': 1.52.0 - sharp: 0.34.1 + '@next/swc-darwin-arm64': 15.4.0-canary.61 + '@next/swc-darwin-x64': 15.4.0-canary.61 + '@next/swc-linux-arm64-gnu': 15.4.0-canary.61 + '@next/swc-linux-arm64-musl': 15.4.0-canary.61 + '@next/swc-linux-x64-gnu': 15.4.0-canary.61 + '@next/swc-linux-x64-musl': 15.4.0-canary.61 + '@next/swc-win32-arm64-msvc': 15.4.0-canary.61 + '@next/swc-win32-x64-msvc': 15.4.0-canary.61 + '@playwright/test': 1.53.2 + sharp: 0.34.2 transitivePeerDependencies: - '@babel/core' - babel-plugin-macros - nextra-theme-docs@4.2.17(@types/react@19.1.4)(next@15.3.2(@playwright/test@1.52.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(nextra@4.2.17(acorn@8.14.1)(next@15.3.2(@playwright/test@1.52.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@5.8.3))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(use-sync-external-store@1.5.0(react@19.1.0)): + nextra-theme-docs@4.2.17(@types/react@19.1.8)(next@15.4.0-canary.61(@playwright/test@1.53.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(nextra@4.2.17(acorn@8.15.0)(next@15.4.0-canary.61(@playwright/test@1.53.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@5.8.3))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(use-sync-external-store@1.5.0(react@19.1.0)): dependencies: - '@headlessui/react': 2.2.3(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@headlessui/react': 2.2.4(react-dom@19.1.0(react@19.1.0))(react@19.1.0) clsx: 2.1.1 - next: 15.3.2(@playwright/test@1.52.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + next: 15.4.0-canary.61(@playwright/test@1.53.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) next-themes: 0.4.6(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - nextra: 4.2.17(acorn@8.14.1)(next@15.3.2(@playwright/test@1.52.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@5.8.3) + nextra: 4.2.17(acorn@8.15.0)(next@15.4.0-canary.61(@playwright/test@1.53.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@5.8.3) react: 19.1.0 react-compiler-runtime: 0.0.0-experimental-22c6e49-20241219(react@19.1.0) react-dom: 19.1.0(react@19.1.0) scroll-into-view-if-needed: 3.1.0 - zod: 3.24.4 - zod-validation-error: 3.4.1(zod@3.24.4) - zustand: 5.0.4(@types/react@19.1.4)(react@19.1.0)(use-sync-external-store@1.5.0(react@19.1.0)) + zod: 3.25.72 + zod-validation-error: 3.5.2(zod@3.25.72) + zustand: 5.0.6(@types/react@19.1.8)(react@19.1.0)(use-sync-external-store@1.5.0(react@19.1.0)) transitivePeerDependencies: - '@types/react' - immer - use-sync-external-store - nextra@4.2.17(acorn@8.14.1)(next@15.3.2(@playwright/test@1.52.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@5.8.3): + nextra@4.2.17(acorn@8.15.0)(next@15.4.0-canary.61(@playwright/test@1.53.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@5.8.3): dependencies: '@formatjs/intl-localematcher': 0.6.1 - '@headlessui/react': 2.2.3(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@mdx-js/mdx': 3.1.0(acorn@8.14.1) + '@headlessui/react': 2.2.4(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@mdx-js/mdx': 3.1.0(acorn@8.15.0) '@napi-rs/simple-git': 0.1.19 '@shikijs/twoslash': 2.5.0(typescript@5.8.3) '@theguild/remark-mermaid': 0.2.0(react@19.1.0) @@ -9571,7 +9363,7 @@ snapshots: mdast-util-gfm: 3.1.0 mdast-util-to-hast: 13.2.0 negotiator: 1.0.0 - next: 15.3.2(@playwright/test@1.52.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + next: 15.4.0-canary.61(@playwright/test@1.53.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) react: 19.1.0 react-compiler-runtime: 0.0.0-experimental-22c6e49-20241219(react@19.1.0) react-dom: 19.1.0(react@19.1.0) @@ -9591,8 +9383,8 @@ snapshots: unist-util-visit: 5.0.0 unist-util-visit-children: 3.0.0 yaml: 2.8.0 - zod: 3.24.4 - zod-validation-error: 3.4.1(zod@3.24.4) + zod: 3.25.72 + zod-validation-error: 3.5.2(zod@3.25.72) transitivePeerDependencies: - acorn - supports-color @@ -9670,7 +9462,7 @@ snapshots: dependencies: call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.9 + es-abstract: 1.24.0 es-object-atoms: 1.1.1 object.values@1.2.1: @@ -9682,10 +9474,6 @@ snapshots: on-exit-leak-free@2.1.2: {} - on-finished@2.4.1: - dependencies: - ee-first: 1.1.1 - on-headers@1.0.2: {} once@1.4.0: @@ -9794,7 +9582,7 @@ snapshots: '@types/unist': 2.0.11 character-entities-legacy: 3.0.0 character-reference-invalid: 2.0.1 - decode-named-character-reference: 1.1.0 + decode-named-character-reference: 1.2.0 is-alphanumerical: 2.0.1 is-decimal: 2.0.1 is-hexadecimal: 2.0.1 @@ -9826,9 +9614,7 @@ snapshots: parse5@7.3.0: dependencies: - entities: 6.0.0 - - parseurl@1.3.3: {} + entities: 6.0.1 path-data-parser@0.1.0: {} @@ -9849,13 +9635,11 @@ snapshots: path-to-regexp@3.3.0: {} - path-to-regexp@8.2.0: {} - path-type@4.0.0: {} pathe@2.0.3: {} - pathval@2.0.0: {} + pathval@2.0.1: {} picocolors@1.1.1: {} @@ -9889,46 +9673,44 @@ snapshots: minimist: 1.2.8 on-exit-leak-free: 2.1.2 pino-abstract-transport: 2.0.0 - pump: 3.0.2 + pump: 3.0.3 secure-json-parse: 2.7.0 sonic-boom: 4.2.0 strip-json-comments: 3.1.1 pino-std-serializers@7.0.0: {} - pino@9.6.0: + pino@9.7.0: dependencies: atomic-sleep: 1.0.0 fast-redact: 3.5.0 on-exit-leak-free: 2.1.2 pino-abstract-transport: 2.0.0 pino-std-serializers: 7.0.0 - process-warning: 4.0.1 + process-warning: 5.0.0 quick-format-unescaped: 4.0.4 real-require: 0.2.0 safe-stable-stringify: 2.5.0 sonic-boom: 4.2.0 thread-stream: 3.1.0 - pkce-challenge@5.0.0: {} - pkg-types@1.3.1: dependencies: confbox: 0.1.8 mlly: 1.7.4 pathe: 2.0.3 - pkg-types@2.1.0: + pkg-types@2.2.0: dependencies: confbox: 0.2.2 - exsolve: 1.0.5 + exsolve: 1.0.7 pathe: 2.0.3 - playwright-core@1.52.0: {} + playwright-core@1.53.2: {} - playwright@1.52.0: + playwright@1.53.2: dependencies: - playwright-core: 1.52.0 + playwright-core: 1.53.2 optionalDependencies: fsevents: 2.3.2 @@ -9961,19 +9743,19 @@ snapshots: async: 3.2.6 debug: 4.4.1 pidusage: 2.0.21 - systeminformation: 5.25.11 + systeminformation: 5.27.7 tx2: 1.0.5 transitivePeerDependencies: - supports-color optional: true - pm2@6.0.6: + pm2@6.0.8: dependencies: '@pm2/agent': 2.1.1 '@pm2/io': 6.1.0 '@pm2/js-api': 0.8.0 '@pm2/pm2-version-check': 1.0.4 - ansis: 4.0.0 + ansis: 4.0.0-node10 async: 3.2.6 blessed: 0.1.81 chokidar: 3.6.0 @@ -10020,7 +9802,7 @@ snapshots: picocolors: 1.1.1 source-map-js: 1.2.1 - postcss@8.5.3: + postcss@8.5.6: dependencies: nanoid: 3.3.11 picocolors: 1.1.1 @@ -10028,16 +9810,16 @@ snapshots: prelude-ls@1.2.1: {} - prettier-plugin-packagejson@2.5.13(prettier@3.5.3): + prettier-plugin-packagejson@2.5.18(prettier@3.6.2): dependencies: - sort-package-json: 3.2.1 - synckit: 0.11.5 + sort-package-json: 3.4.0 + synckit: 0.11.8 optionalDependencies: - prettier: 3.5.3 + prettier: 3.6.2 prettier@2.8.8: {} - prettier@3.5.3: {} + prettier@3.6.2: {} proc-log@4.2.0: {} @@ -10066,11 +9848,6 @@ snapshots: property-information@7.1.0: {} - proxy-addr@2.0.7: - dependencies: - forwarded: 0.2.0 - ipaddr.js: 1.9.1 - proxy-agent@6.4.0: dependencies: agent-base: 7.1.3 @@ -10086,17 +9863,13 @@ snapshots: proxy-from-env@1.1.0: {} - pump@3.0.2: + pump@3.0.3: dependencies: - end-of-stream: 1.4.4 + end-of-stream: 1.4.5 once: 1.4.0 punycode@2.3.1: {} - qs@6.14.0: - dependencies: - side-channel: 1.1.0 - quansync@0.2.10: {} queue-microtask@1.2.3: {} @@ -10105,15 +9878,6 @@ snapshots: range-parser@1.2.0: {} - range-parser@1.2.1: {} - - raw-body@3.0.0: - dependencies: - bytes: 3.1.2 - http-errors: 2.0.0 - iconv-lite: 0.6.3 - unpipe: 1.0.0 - rc@1.2.8: dependencies: deep-extend: 0.6.0 @@ -10171,13 +9935,13 @@ snapshots: recma-build-jsx@1.0.0: dependencies: - '@types/estree': 1.0.7 + '@types/estree': 1.0.8 estree-util-build-jsx: 3.0.1 vfile: 6.0.3 - recma-jsx@1.0.0(acorn@8.14.1): + recma-jsx@1.0.0(acorn@8.15.0): dependencies: - acorn-jsx: 5.3.2(acorn@8.14.1) + acorn-jsx: 5.3.2(acorn@8.15.0) estree-util-to-js: 2.0.0 recma-parse: 1.0.0 recma-stringify: 1.0.0 @@ -10187,31 +9951,31 @@ snapshots: recma-parse@1.0.0: dependencies: - '@types/estree': 1.0.7 + '@types/estree': 1.0.8 esast-util-from-js: 2.0.1 unified: 11.0.5 vfile: 6.0.3 recma-stringify@1.0.0: dependencies: - '@types/estree': 1.0.7 + '@types/estree': 1.0.8 estree-util-to-js: 2.0.0 unified: 11.0.5 vfile: 6.0.3 - redis@5.0.1: + redis@5.5.6: dependencies: - '@redis/bloom': 5.0.1(@redis/client@5.0.1) - '@redis/client': 5.0.1 - '@redis/json': 5.0.1(@redis/client@5.0.1) - '@redis/search': 5.0.1(@redis/client@5.0.1) - '@redis/time-series': 5.0.1(@redis/client@5.0.1) + '@redis/bloom': 5.5.6(@redis/client@5.5.6) + '@redis/client': 5.5.6 + '@redis/json': 5.5.6(@redis/client@5.5.6) + '@redis/search': 5.5.6(@redis/client@5.5.6) + '@redis/time-series': 5.5.6(@redis/client@5.5.6) reflect.getprototypeof@1.0.10: dependencies: call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.9 + es-abstract: 1.24.0 es-errors: 1.3.0 es-object-atoms: 1.1.1 get-intrinsic: 1.3.0 @@ -10280,7 +10044,7 @@ snapshots: rehype-recma@1.0.0: dependencies: - '@types/estree': 1.0.7 + '@types/estree': 1.0.8 '@types/hast': 3.0.4 hast-util-to-estree: 3.1.3 transitivePeerDependencies: @@ -10422,30 +10186,30 @@ snapshots: robust-predicates@3.0.2: {} - rollup@4.40.2: + rollup@4.44.1: dependencies: - '@types/estree': 1.0.7 + '@types/estree': 1.0.8 optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.40.2 - '@rollup/rollup-android-arm64': 4.40.2 - '@rollup/rollup-darwin-arm64': 4.40.2 - '@rollup/rollup-darwin-x64': 4.40.2 - '@rollup/rollup-freebsd-arm64': 4.40.2 - '@rollup/rollup-freebsd-x64': 4.40.2 - '@rollup/rollup-linux-arm-gnueabihf': 4.40.2 - '@rollup/rollup-linux-arm-musleabihf': 4.40.2 - '@rollup/rollup-linux-arm64-gnu': 4.40.2 - '@rollup/rollup-linux-arm64-musl': 4.40.2 - '@rollup/rollup-linux-loongarch64-gnu': 4.40.2 - '@rollup/rollup-linux-powerpc64le-gnu': 4.40.2 - '@rollup/rollup-linux-riscv64-gnu': 4.40.2 - '@rollup/rollup-linux-riscv64-musl': 4.40.2 - '@rollup/rollup-linux-s390x-gnu': 4.40.2 - '@rollup/rollup-linux-x64-gnu': 4.40.2 - '@rollup/rollup-linux-x64-musl': 4.40.2 - '@rollup/rollup-win32-arm64-msvc': 4.40.2 - '@rollup/rollup-win32-ia32-msvc': 4.40.2 - '@rollup/rollup-win32-x64-msvc': 4.40.2 + '@rollup/rollup-android-arm-eabi': 4.44.1 + '@rollup/rollup-android-arm64': 4.44.1 + '@rollup/rollup-darwin-arm64': 4.44.1 + '@rollup/rollup-darwin-x64': 4.44.1 + '@rollup/rollup-freebsd-arm64': 4.44.1 + '@rollup/rollup-freebsd-x64': 4.44.1 + '@rollup/rollup-linux-arm-gnueabihf': 4.44.1 + '@rollup/rollup-linux-arm-musleabihf': 4.44.1 + '@rollup/rollup-linux-arm64-gnu': 4.44.1 + '@rollup/rollup-linux-arm64-musl': 4.44.1 + '@rollup/rollup-linux-loongarch64-gnu': 4.44.1 + '@rollup/rollup-linux-powerpc64le-gnu': 4.44.1 + '@rollup/rollup-linux-riscv64-gnu': 4.44.1 + '@rollup/rollup-linux-riscv64-musl': 4.44.1 + '@rollup/rollup-linux-s390x-gnu': 4.44.1 + '@rollup/rollup-linux-x64-gnu': 4.44.1 + '@rollup/rollup-linux-x64-musl': 4.44.1 + '@rollup/rollup-win32-arm64-msvc': 4.44.1 + '@rollup/rollup-win32-ia32-msvc': 4.44.1 + '@rollup/rollup-win32-x64-msvc': 4.44.1 fsevents: 2.3.3 roughjs@4.6.6: @@ -10455,16 +10219,6 @@ snapshots: points-on-curve: 0.2.0 points-on-path: 0.2.1 - router@2.2.0: - dependencies: - debug: 4.4.1 - depd: 2.0.0 - is-promise: 4.0.0 - parseurl: 1.3.3 - path-to-regexp: 8.2.0 - transitivePeerDependencies: - - supports-color - run-parallel@1.2.0: dependencies: queue-microtask: 1.2.3 @@ -10528,22 +10282,6 @@ snapshots: semver@7.7.2: {} - send@1.2.0: - dependencies: - debug: 4.4.1 - encodeurl: 2.0.0 - escape-html: 1.0.3 - etag: 1.8.1 - fresh: 2.0.0 - http-errors: 2.0.0 - mime-types: 3.0.1 - ms: 2.1.3 - on-finished: 2.4.1 - range-parser: 1.2.1 - statuses: 2.0.1 - transitivePeerDependencies: - - supports-color - serve-handler@6.1.6: dependencies: bytes: 3.0.0 @@ -10554,15 +10292,6 @@ snapshots: path-to-regexp: 3.3.0 range-parser: 1.2.0 - 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 - serve@14.2.4: dependencies: '@zeit/schemas': 2.36.0 @@ -10603,16 +10332,14 @@ snapshots: es-errors: 1.3.0 es-object-atoms: 1.1.1 - setprototypeof@1.2.0: {} - - sharp@0.34.1: + sharp@0.34.2: dependencies: color: 4.2.3 detect-libc: 2.0.4 semver: 7.7.2 optionalDependencies: - '@img/sharp-darwin-arm64': 0.34.1 - '@img/sharp-darwin-x64': 0.34.1 + '@img/sharp-darwin-arm64': 0.34.2 + '@img/sharp-darwin-x64': 0.34.2 '@img/sharp-libvips-darwin-arm64': 1.1.0 '@img/sharp-libvips-darwin-x64': 1.1.0 '@img/sharp-libvips-linux-arm': 1.1.0 @@ -10622,15 +10349,16 @@ snapshots: '@img/sharp-libvips-linux-x64': 1.1.0 '@img/sharp-libvips-linuxmusl-arm64': 1.1.0 '@img/sharp-libvips-linuxmusl-x64': 1.1.0 - '@img/sharp-linux-arm': 0.34.1 - '@img/sharp-linux-arm64': 0.34.1 - '@img/sharp-linux-s390x': 0.34.1 - '@img/sharp-linux-x64': 0.34.1 - '@img/sharp-linuxmusl-arm64': 0.34.1 - '@img/sharp-linuxmusl-x64': 0.34.1 - '@img/sharp-wasm32': 0.34.1 - '@img/sharp-win32-ia32': 0.34.1 - '@img/sharp-win32-x64': 0.34.1 + '@img/sharp-linux-arm': 0.34.2 + '@img/sharp-linux-arm64': 0.34.2 + '@img/sharp-linux-s390x': 0.34.2 + '@img/sharp-linux-x64': 0.34.2 + '@img/sharp-linuxmusl-arm64': 0.34.2 + '@img/sharp-linuxmusl-x64': 0.34.2 + '@img/sharp-wasm32': 0.34.2 + '@img/sharp-win32-arm64': 0.34.2 + '@img/sharp-win32-ia32': 0.34.2 + '@img/sharp-win32-x64': 0.34.2 optional: true shebang-command@2.0.0: @@ -10701,11 +10429,11 @@ snapshots: dependencies: agent-base: 7.1.3 debug: 4.4.1 - socks: 2.8.4 + socks: 2.8.5 transitivePeerDependencies: - supports-color - socks@2.8.4: + socks@2.8.5: dependencies: ip-address: 9.0.5 smart-buffer: 4.2.0 @@ -10716,7 +10444,7 @@ snapshots: sort-object-keys@1.1.3: {} - sort-package-json@3.2.1: + sort-package-json@3.4.0: dependencies: detect-indent: 7.0.1 detect-newline: 4.0.1 @@ -10724,7 +10452,7 @@ snapshots: is-plain-obj: 4.1.0 semver: 7.7.2 sort-object-keys: 1.1.3 - tinyglobby: 0.2.13 + tinyglobby: 0.2.14 source-map-js@1.2.1: {} @@ -10777,15 +10505,16 @@ snapshots: sprintf-js@1.1.3: {} - stable-hash@0.0.5: {} + stable-hash-x@0.2.0: {} stackback@0.0.2: {} - statuses@2.0.1: {} - std-env@3.9.0: {} - streamsearch@1.1.0: {} + stop-iteration-iterator@1.1.0: + dependencies: + es-errors: 1.3.0 + internal-slot: 1.1.0 string-width@4.2.3: dependencies: @@ -10810,7 +10539,7 @@ snapshots: call-bind: 1.0.8 call-bound: 1.0.4 define-properties: 1.2.1 - es-abstract: 1.23.9 + es-abstract: 1.24.0 es-errors: 1.3.0 es-object-atoms: 1.1.1 get-intrinsic: 1.3.0 @@ -10824,7 +10553,7 @@ snapshots: string.prototype.repeat@1.0.0: dependencies: define-properties: 1.2.1 - es-abstract: 1.23.9 + es-abstract: 1.24.0 string.prototype.trim@1.2.10: dependencies: @@ -10832,7 +10561,7 @@ snapshots: call-bound: 1.0.4 define-data-property: 1.1.4 define-properties: 1.2.1 - es-abstract: 1.23.9 + es-abstract: 1.24.0 es-object-atoms: 1.1.1 has-property-descriptors: 1.0.2 @@ -10876,11 +10605,15 @@ snapshots: strip-json-comments@3.1.1: {} - style-to-js@1.1.16: + strip-literal@3.0.0: + dependencies: + js-tokens: 9.0.1 + + style-to-js@1.1.17: dependencies: - style-to-object: 1.0.8 + style-to-object: 1.0.9 - style-to-object@1.0.8: + style-to-object@1.0.9: dependencies: inline-style-parser: 0.2.4 @@ -10903,14 +10636,13 @@ snapshots: supports-preserve-symlinks-flag@1.0.0: {} - synckit@0.11.5: + synckit@0.11.8: dependencies: - '@pkgr/core': 0.2.4 - tslib: 2.8.1 + '@pkgr/core': 0.2.7 system-architecture@0.1.0: {} - systeminformation@5.25.11: + systeminformation@5.27.7: optional: true tabbable@6.2.0: {} @@ -10927,16 +10659,16 @@ snapshots: tinyexec@1.0.1: {} - tinyglobby@0.2.13: + tinyglobby@0.2.14: dependencies: - fdir: 6.4.4(picomatch@4.0.2) + fdir: 6.4.6(picomatch@4.0.2) picomatch: 4.0.2 - tinypool@1.0.2: {} + tinypool@1.1.1: {} tinyrainbow@2.0.0: {} - tinyspy@3.0.2: {} + tinyspy@4.0.3: {} title@4.0.1: dependencies: @@ -10954,8 +10686,6 @@ snapshots: toad-cache@3.7.0: {} - toidentifier@1.0.1: {} - trim-lines@3.0.1: {} trough@2.2.0: {} @@ -10970,39 +10700,39 @@ snapshots: tslib@2.8.1: {} - tsx@4.19.4: + tsx@4.20.3: dependencies: - esbuild: 0.25.4 - get-tsconfig: 4.10.0 + esbuild: 0.25.5 + get-tsconfig: 4.10.1 optionalDependencies: fsevents: 2.3.3 - turbo-darwin-64@2.5.3: + turbo-darwin-64@2.5.4: optional: true - turbo-darwin-arm64@2.5.3: + turbo-darwin-arm64@2.5.4: optional: true - turbo-linux-64@2.5.3: + turbo-linux-64@2.5.4: optional: true - turbo-linux-arm64@2.5.3: + turbo-linux-arm64@2.5.4: optional: true - turbo-windows-64@2.5.3: + turbo-windows-64@2.5.4: optional: true - turbo-windows-arm64@2.5.3: + turbo-windows-arm64@2.5.4: optional: true - turbo@2.5.3: + turbo@2.5.4: optionalDependencies: - turbo-darwin-64: 2.5.3 - turbo-darwin-arm64: 2.5.3 - turbo-linux-64: 2.5.3 - turbo-linux-arm64: 2.5.3 - turbo-windows-64: 2.5.3 - turbo-windows-arm64: 2.5.3 + turbo-darwin-64: 2.5.4 + turbo-darwin-arm64: 2.5.4 + turbo-linux-64: 2.5.4 + turbo-linux-arm64: 2.5.4 + turbo-windows-64: 2.5.4 + turbo-windows-arm64: 2.5.4 tv4@1.3.0: {} @@ -11029,12 +10759,6 @@ snapshots: type-fest@3.13.1: {} - type-is@2.0.1: - dependencies: - content-type: 1.0.5 - media-typer: 1.1.0 - mime-types: 3.0.1 - typed-array-buffer@1.0.3: dependencies: call-bound: 1.0.4 @@ -11070,12 +10794,12 @@ snapshots: typedarray@0.0.6: {} - typescript-eslint@8.32.1(eslint@9.26.0)(typescript@5.8.3): + typescript-eslint@8.35.1(eslint@9.30.1)(typescript@5.8.3): dependencies: - '@typescript-eslint/eslint-plugin': 8.32.1(@typescript-eslint/parser@8.32.1(eslint@9.26.0)(typescript@5.8.3))(eslint@9.26.0)(typescript@5.8.3) - '@typescript-eslint/parser': 8.32.1(eslint@9.26.0)(typescript@5.8.3) - '@typescript-eslint/utils': 8.32.1(eslint@9.26.0)(typescript@5.8.3) - eslint: 9.26.0 + '@typescript-eslint/eslint-plugin': 8.35.1(@typescript-eslint/parser@8.35.1(eslint@9.30.1)(typescript@5.8.3))(eslint@9.30.1)(typescript@5.8.3) + '@typescript-eslint/parser': 8.35.1(eslint@9.30.1)(typescript@5.8.3) + '@typescript-eslint/utils': 8.35.1(eslint@9.30.1)(typescript@5.8.3) + eslint: 9.30.1 typescript: 5.8.3 transitivePeerDependencies: - supports-color @@ -11093,12 +10817,14 @@ snapshots: undici-types@6.21.0: {} + undici-types@7.8.0: {} + unified-engine@11.2.2: dependencies: '@types/concat-stream': 2.0.3 '@types/debug': 4.1.12 '@types/is-empty': 1.2.3 - '@types/node': 22.15.18 + '@types/node': 22.16.0 '@types/unist': 3.0.3 concat-stream: 2.0.0 debug: 4.4.1 @@ -11203,29 +10929,29 @@ snapshots: universalify@0.1.2: {} - unpipe@1.0.0: {} - - unrs-resolver@1.7.2: + unrs-resolver@1.10.1: dependencies: - napi-postinstall: 0.2.4 + napi-postinstall: 0.3.0 optionalDependencies: - '@unrs/resolver-binding-darwin-arm64': 1.7.2 - '@unrs/resolver-binding-darwin-x64': 1.7.2 - '@unrs/resolver-binding-freebsd-x64': 1.7.2 - '@unrs/resolver-binding-linux-arm-gnueabihf': 1.7.2 - '@unrs/resolver-binding-linux-arm-musleabihf': 1.7.2 - '@unrs/resolver-binding-linux-arm64-gnu': 1.7.2 - '@unrs/resolver-binding-linux-arm64-musl': 1.7.2 - '@unrs/resolver-binding-linux-ppc64-gnu': 1.7.2 - '@unrs/resolver-binding-linux-riscv64-gnu': 1.7.2 - '@unrs/resolver-binding-linux-riscv64-musl': 1.7.2 - '@unrs/resolver-binding-linux-s390x-gnu': 1.7.2 - '@unrs/resolver-binding-linux-x64-gnu': 1.7.2 - '@unrs/resolver-binding-linux-x64-musl': 1.7.2 - '@unrs/resolver-binding-wasm32-wasi': 1.7.2 - '@unrs/resolver-binding-win32-arm64-msvc': 1.7.2 - '@unrs/resolver-binding-win32-ia32-msvc': 1.7.2 - '@unrs/resolver-binding-win32-x64-msvc': 1.7.2 + '@unrs/resolver-binding-android-arm-eabi': 1.10.1 + '@unrs/resolver-binding-android-arm64': 1.10.1 + '@unrs/resolver-binding-darwin-arm64': 1.10.1 + '@unrs/resolver-binding-darwin-x64': 1.10.1 + '@unrs/resolver-binding-freebsd-x64': 1.10.1 + '@unrs/resolver-binding-linux-arm-gnueabihf': 1.10.1 + '@unrs/resolver-binding-linux-arm-musleabihf': 1.10.1 + '@unrs/resolver-binding-linux-arm64-gnu': 1.10.1 + '@unrs/resolver-binding-linux-arm64-musl': 1.10.1 + '@unrs/resolver-binding-linux-ppc64-gnu': 1.10.1 + '@unrs/resolver-binding-linux-riscv64-gnu': 1.10.1 + '@unrs/resolver-binding-linux-riscv64-musl': 1.10.1 + '@unrs/resolver-binding-linux-s390x-gnu': 1.10.1 + '@unrs/resolver-binding-linux-x64-gnu': 1.10.1 + '@unrs/resolver-binding-linux-x64-musl': 1.10.1 + '@unrs/resolver-binding-wasm32-wasi': 1.10.1 + '@unrs/resolver-binding-win32-arm64-msvc': 1.10.1 + '@unrs/resolver-binding-win32-ia32-msvc': 1.10.1 + '@unrs/resolver-binding-win32-x64-msvc': 1.10.1 update-check@1.5.4: dependencies: @@ -11296,13 +11022,13 @@ snapshots: '@types/unist': 3.0.3 vfile-message: 4.0.2 - vite-node@3.1.3(@types/node@22.15.18)(tsx@4.19.4)(yaml@2.8.0): + vite-node@3.2.4(@types/node@24.0.10)(tsx@4.20.3)(yaml@2.8.0): dependencies: cac: 6.7.14 debug: 4.4.1 es-module-lexer: 1.7.0 pathe: 2.0.3 - vite: 6.3.5(@types/node@22.15.18)(tsx@4.19.4)(yaml@2.8.0) + vite: 7.0.2(@types/node@24.0.10)(tsx@4.20.3)(yaml@2.8.0) transitivePeerDependencies: - '@types/node' - jiti @@ -11317,46 +11043,48 @@ snapshots: - tsx - yaml - vite@6.3.5(@types/node@22.15.18)(tsx@4.19.4)(yaml@2.8.0): + vite@7.0.2(@types/node@24.0.10)(tsx@4.20.3)(yaml@2.8.0): dependencies: - esbuild: 0.25.4 - fdir: 6.4.4(picomatch@4.0.2) + esbuild: 0.25.5 + fdir: 6.4.6(picomatch@4.0.2) picomatch: 4.0.2 - postcss: 8.5.3 - rollup: 4.40.2 - tinyglobby: 0.2.13 + postcss: 8.5.6 + rollup: 4.44.1 + tinyglobby: 0.2.14 optionalDependencies: - '@types/node': 22.15.18 + '@types/node': 24.0.10 fsevents: 2.3.3 - tsx: 4.19.4 + tsx: 4.20.3 yaml: 2.8.0 - vitest@3.1.3(@types/debug@4.1.12)(@types/node@22.15.18)(tsx@4.19.4)(yaml@2.8.0): + vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.0.10)(tsx@4.20.3)(yaml@2.8.0): dependencies: - '@vitest/expect': 3.1.3 - '@vitest/mocker': 3.1.3(vite@6.3.5(@types/node@22.15.18)(tsx@4.19.4)(yaml@2.8.0)) - '@vitest/pretty-format': 3.1.3 - '@vitest/runner': 3.1.3 - '@vitest/snapshot': 3.1.3 - '@vitest/spy': 3.1.3 - '@vitest/utils': 3.1.3 + '@types/chai': 5.2.2 + '@vitest/expect': 3.2.4 + '@vitest/mocker': 3.2.4(vite@7.0.2(@types/node@24.0.10)(tsx@4.20.3)(yaml@2.8.0)) + '@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.2.0 debug: 4.4.1 expect-type: 1.2.1 magic-string: 0.30.17 pathe: 2.0.3 + picomatch: 4.0.2 std-env: 3.9.0 tinybench: 2.9.0 tinyexec: 0.3.2 - tinyglobby: 0.2.13 - tinypool: 1.0.2 + tinyglobby: 0.2.14 + tinypool: 1.1.1 tinyrainbow: 2.0.0 - vite: 6.3.5(@types/node@22.15.18)(tsx@4.19.4)(yaml@2.8.0) - vite-node: 3.1.3(@types/node@22.15.18)(tsx@4.19.4)(yaml@2.8.0) + vite: 7.0.2(@types/node@24.0.10)(tsx@4.20.3)(yaml@2.8.0) + vite-node: 3.2.4(@types/node@24.0.10)(tsx@4.20.3)(yaml@2.8.0) why-is-node-running: 2.3.0 optionalDependencies: '@types/debug': 4.1.12 - '@types/node': 22.15.18 + '@types/node': 24.0.10 transitivePeerDependencies: - jiti - less @@ -11483,19 +11211,15 @@ snapshots: yocto-queue@0.1.0: {} - zod-to-json-schema@3.24.5(zod@3.24.4): - dependencies: - zod: 3.24.4 - - zod-validation-error@3.4.1(zod@3.24.4): + zod-validation-error@3.5.2(zod@3.25.72): dependencies: - zod: 3.24.4 + zod: 3.25.72 - zod@3.24.4: {} + zod@3.25.72: {} - zustand@5.0.4(@types/react@19.1.4)(react@19.1.0)(use-sync-external-store@1.5.0(react@19.1.0)): + zustand@5.0.6(@types/react@19.1.8)(react@19.1.0)(use-sync-external-store@1.5.0(react@19.1.0)): optionalDependencies: - '@types/react': 19.1.4 + '@types/react': 19.1.8 react: 19.1.0 use-sync-external-store: 1.5.0(react@19.1.0)