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/.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 63622269..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: @@ -68,7 +66,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.ts sed -i 's/cache-handler-redis-stack/cache-handler-redis-strings/g' apps/cache-testing/src/instrumentation.ts fi diff --git a/.gitignore b/.gitignore index b87182c8..40ce2e89 100644 --- a/.gitignore +++ b/.gitignore @@ -38,3 +38,7 @@ yarn-error.log* # Misc .DS_Store *.pem + +# 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 e03f15de..5a00bab1 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -5,20 +5,10 @@ } ], "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", + "editor.defaultFormatter": "esbenp.prettier-vscode", "[jsonc]": { "editor.defaultFormatter": "esbenp.prettier-vscode" }, @@ -39,16 +29,18 @@ "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" }, - "grammarly.files.include": ["**/*.md", "**/*.mdx"] + "[html]": { + "editor.defaultFormatter": "esbenp.prettier-vscode" + } } diff --git a/apps/cache-testing/cache-handler-local.mjs b/apps/cache-testing/cache-handler-local.js similarity index 75% rename from apps/cache-testing/cache-handler-local.mjs rename to apps/cache-testing/cache-handler-local.js index 2d30bbe3..875c7ada 100644 --- a/apps/cache-testing/cache-handler-local.mjs +++ 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.js b/apps/cache-testing/cache-handler-next-example.js index d42e4368..f6f91d8e 100644 --- a/apps/cache-testing/cache-handler-next-example.js +++ b/apps/cache-testing/cache-handler-next-example.js @@ -1,17 +1,15 @@ const cache = new Map(); -module.exports = class CacheHandler { +export default class CacheHandler { constructor(options) { 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 @@ module.exports = 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)) { @@ -32,4 +29,4 @@ module.exports = class CacheHandler { } } } -}; +} 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/cache-handler-redis-stack.js b/apps/cache-testing/cache-handler-redis-stack.js index decb4bf6..e886660c 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/handlers/local-lru'; +import createRedisHandler from '@neshca/cache-handler/handlers/redis-stack'; +import { createClient } from 'redis'; CacheHandler.onCreation(async () => { if (!process.env.REDIS_URL) { @@ -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(); } } @@ -86,4 +78,4 @@ CacheHandler.onCreation(async () => { }; }); -module.exports = CacheHandler; +export default CacheHandler; diff --git a/apps/cache-testing/cache-handler-redis-stack.mjs b/apps/cache-testing/cache-handler-redis-stack.mjs deleted file mode 100644 index 7ea08856..00000000 --- a/apps/cache-testing/cache-handler-redis-stack.mjs +++ /dev/null @@ -1,89 +0,0 @@ -// @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'; - -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, - }, - }; -}); - -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 92% rename from apps/cache-testing/cache-handler-redis-strings.mjs rename to apps/cache-testing/cache-handler-redis-strings.js index 39f87e32..307dc3c5 100644 --- a/apps/cache-testing/cache-handler-redis-strings.mjs +++ 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 () => { @@ -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/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.ts similarity index 61% rename from apps/cache-testing/next.config.mjs rename to apps/cache-testing/next.config.ts index 1d5968d5..e37c9b36 100644 --- a/apps/cache-testing/next.config.mjs +++ b/apps/cache-testing/next.config.ts @@ -1,27 +1,31 @@ -// @ts-check - import path from 'node:path'; +import type { NextConfig } from 'next/types'; -const cacheHandler = path.resolve('./cache-handler-redis-stack.mjs'); +const cacheHandler = path.resolve('./cache-handler-redis-stack.js'); -/** @type {import('next').NextConfig} */ -const nextConfig = { +const nextConfig: NextConfig = { poweredByHeader: false, reactStrictMode: true, 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, + useCache: true, + cacheHandlers: { + 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 682a4360..d18d7b2d 100644 --- a/apps/cache-testing/package.json +++ b/apps/cache-testing/package.json @@ -3,36 +3,38 @@ "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", "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.7.9", - "next": "14.2.15", - "react": "18.3.1", - "react-dom": "18.3.1", - "redis": "4.7.0" + "axios": "1.10.0", + "next": "15.4.0-canary.61", + "react": "19.1.0", + "react-dom": "19.1.0", + "redis": "5.5.6" }, "devDependencies": { - "@playwright/test": "1.50.1", + "@playwright/test": "1.53.2", "@repo/eslint-config": "workspace:*", "@repo/typescript-config": "workspace:*", - "@types/node": "22.13.1", - "@types/react": "18.3.12", - "@types/react-dom": "18.3.1", - "eslint": "9.20.0", - "fastify": "5.2.1", - "pm2": "5.4.3", - "tsx": "4.19.2", - "typescript": "5.7.3" + "@types/node": "24.0.10", + "@types/react": "19.1.8", + "@types/react-dom": "19.1.6", + "dotenv-cli": "8.0.0", + "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 new file mode 100644 index 00000000..aa282d56 --- /dev/null +++ b/apps/cache-testing/redis.js @@ -0,0 +1,11 @@ +import { createRedisCacheHandler } from '@neshca/cache-handler/use-cache/node-redis'; +import { createClient } from 'redis'; + +export default createRedisCacheHandler({ + client: createClient({ + RESP: 2, + url: process.env.REDIS_URL, + }), + keyPrefix: 'use-cache-redis:', + sharedTagsKey: 'tags', +}); diff --git a/apps/cache-testing/run-app-instances.ts b/apps/cache-testing/run-app-instances.ts index 1b41f8ee..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/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 2ba46a75..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,20 +1,20 @@ import { notFound } from 'next/navigation'; - import { CommonAppPage } from 'cache-testing/utils/common-app-page'; import { createGetData } from 'cache-testing/utils/create-get-data'; export const dynamicParams = false; -export const revalidate = 5; +const revalidate = 5; -type PageParams = { params: { slug: string } }; +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, -}: 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..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,20 +1,20 @@ import { notFound } from 'next/navigation'; - import { CommonAppPage } from 'cache-testing/utils/common-app-page'; import { createGetData } from 'cache-testing/utils/create-get-data'; export const dynamicParams = true; -export const revalidate = 5; +const revalidate = 5; -type PageParams = { params: { slug: string } }; +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, -}: 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..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,11 +1,10 @@ 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 { +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..1d7a9651 100644 --- a/apps/cache-testing/src/app/app/ppr/page.tsx +++ b/apps/cache-testing/src/app/app/ppr/page.tsx @@ -1,10 +1,9 @@ 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'; -async function ActualData(): Promise { +async function ActualData(): Promise { noStore(); const response = await fetch('http://localhost:8081/time', { @@ -20,11 +19,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..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,30 +1,38 @@ +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: { length: string } }; +type PageParams = { params: Promise<{ length: string }> }; -export function generateStaticParams(): PageParams['params'][] { - return lengthSteps.map((length) => ({ length: `${length}` })); +export function generateStaticParams(): Promise< + { + length: string; + }[] +> { + return Promise.resolve( + lengthSteps.map((length) => ({ length: `${length}` })), + ); } export default async function Page({ - params: { length }, -}: PageParams): Promise { + 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/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 2e3e47fc..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,17 +1,20 @@ 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; -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 { +export function generateStaticParams(): Promise< + { + slug: string; + }[] +> { return Promise.resolve([ { slug: '200' }, { slug: '404' }, @@ -21,8 +24,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..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,17 +1,20 @@ 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; -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 { +export function generateStaticParams(): Promise< + { + slug: string; + }[] +> { return Promise.resolve([ { slug: '200' }, { slug: '404' }, @@ -21,8 +24,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..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 = { @@ -12,7 +11,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..5ab89210 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(''); @@ -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/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..e427c0e2 100644 --- a/apps/cache-testing/src/components/restart-button.tsx +++ b/apps/cache-testing/src/components/restart-button.tsx @@ -2,17 +2,19 @@ import { useState } from 'react'; -export function RestartButton(): JSX.Element { +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 99dd7943..50be628f 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(''); @@ -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 56fc1e52..ea36a8b8 100644 --- a/apps/cache-testing/src/instrumentation.ts +++ b/apps/cache-testing/src/instrumentation.ts @@ -1,9 +1,9 @@ -export async function register() { +export async function register(): Promise { 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.mjs')) + const CacheHandler = (await import('../cache-handler-redis-stack.js')) .default; await registerInitialCache(CacheHandler); } diff --git a/apps/cache-testing/src/pages/_app.tsx b/apps/cache-testing/src/pages/_app.tsx index ab2af1c9..abf43cce 100644 --- a/apps/cache-testing/src/pages/_app.tsx +++ b/apps/cache-testing/src/pages/_app.tsx @@ -1,8 +1,10 @@ -import type { AppProps } from 'next/app'; - import Layout from './layout'; +import type { AppProps } from 'next/app'; -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/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 991592db..16972c67 100644 --- a/apps/cache-testing/src/pages/layout.tsx +++ b/apps/cache-testing/src/pages/layout.tsx @@ -1,10 +1,11 @@ -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({ 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/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/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..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({ @@ -50,7 +49,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/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 e9bdc722..9f049a33 100644 --- a/apps/cache-testing/src/utils/common-app-page.tsx +++ b/apps/cache-testing/src/utils/common-app-page.tsx @@ -1,16 +1,14 @@ 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, 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..553db94a 100644 --- a/apps/cache-testing/src/utils/common-pages-page.tsx +++ b/apps/cache-testing/src/utils/common-pages-page.tsx @@ -1,15 +1,14 @@ -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, 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..0268bb3b 100644 --- a/apps/cache-testing/src/utils/create-get-data.ts +++ b/apps/cache-testing/src/utils/create-get-data.ts @@ -1,86 +1,34 @@ -import { neshCache } from '@neshca/cache-handler/functions'; -import axios from 'axios'; -import { unstable_cache } from 'next/cache'; +import { + unstable_cacheLife as cacheLife, + unstable_cacheTag as cacheTag, +} 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', -) { +export function createGetData(path: string, revalidate?: number) { return async function getData( slug: string, ): Promise | null> { - const pathAndTag = `/${path}/${normalizeSlug(slug)}`; - - 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, - }); + 'use cache'; - const data = await cachedGet(url); - - if (!data) { - return null; - } - - parsedResult = data; - - break; - } - case 'nesh-cache': { - const data = await cachedAxios( - { - revalidate, - tags, - }, - url, - ); - - if (!data) { - return null; - } - - parsedResult = data; + const pathAndTag = `/${path}/${normalizeSlug(slug)}`; - break; - } + cacheLife({ + revalidate, + }); - default: { - const result = await fetch(url, { - cache, - next: { revalidate, tags }, - }); + cacheTag(pathAndTag, 'whole-app-route'); - if (!result.ok) { - return null; - } + const url = new URL(`/count${pathAndTag}`, 'http://localhost:8081'); - parsedResult = (await result.json()) as CountBackendApiResponseJson; + const result = await fetch(url); - 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/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/apps/cache-testing/tests/app.spec.ts b/apps/cache-testing/tests/app.spec.ts index 310721d5..9d0868e8 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', @@ -142,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, }) => { @@ -167,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); }); } @@ -438,28 +433,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/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/biome.json b/biome.json deleted file mode 100644 index 0ea8c64a..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": ["JSX"] - }, - "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 cd98d8d0..40bf53c6 100644 --- a/docs/cache-handler-docs/package.json +++ b/docs/cache-handler-docs/package.json @@ -5,27 +5,28 @@ "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", + "lint:check": "next lint --max-warnings=0", + "lint:fix": "next lint --fix --max-warnings=0", "start:docs": "serve out" }, "dependencies": { - "next": "15.1.6", - "nextra": "4.2.4", - "nextra-theme-docs": "4.2.4", - "react": "19.0.0", - "react-dom": "19.0.0" + "next": "15.4.0-canary.61", + "nextra": "4.2.17", + "nextra-theme-docs": "4.2.17", + "react": "19.1.0", + "react-dom": "19.1.0" }, "devDependencies": { "@repo/eslint-config": "workspace:*", "@repo/typescript-config": "workspace:*", - "@types/node": "22.13.1", - "@types/react": "19.0.8", - "@types/react-dom": "19.0.3", - "eslint": "9.20.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.7.3" + "typescript": "5.8.3" } } diff --git a/docs/cache-handler-docs/src/app/layout.tsx b/docs/cache-handler-docs/src/app/layout.tsx index 86eb95e3..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'; @@ -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/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/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 b41fcd8c..2abcb899 100644 --- a/internal/backend/package.json +++ b/internal/backend/package.json @@ -5,18 +5,19 @@ "license": "MIT", "type": "module", "scripts": { + "check-types": "tsc --noEmit", "dev": "tsx --watch ./src/backend.ts", "start": "tsx ./src/backend.ts" }, "dependencies": { - "fastify": "5.2.1", - "pino": "9.6.0" + "fastify": "5.4.0", + "pino": "9.7.0" }, "devDependencies": { "@repo/typescript-config": "workspace:*", - "@types/node": "22.13.1", + "@types/node": "24.0.10", "pino-pretty": "13.0.0", - "tsx": "4.19.2", - "typescript": "5.7.3" + "tsx": "4.20.3", + "typescript": "5.8.3" } } 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/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 1c180fa9..3a391702 100644 --- a/internal/eslint-config/next.js +++ b/internal/eslint-config/next.js @@ -1,41 +1,33 @@ -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. * - * @type {import("eslint").Linter.Config} + * @type {import("typescript-eslint").ConfigArray} * */ -export const nextJsConfig = [ - js.configs.recommended, - eslintConfigPrettier, - ...tseslint.configs.recommended, +export const nextJsConfig = tseslint.config( + globalIgnores(['**/.next']), + baseEslintConfig, { - 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', }, }, }, + pluginReactHooks.configs['recommended-latest'], { plugins: { '@next/next': pluginNext, @@ -46,14 +38,9 @@ export const nextJsConfig = [ }, }, { - 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', + '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 64df5e4e..7e0c5a73 100644 --- a/internal/eslint-config/package.json +++ b/internal/eslint-config/package.json @@ -4,18 +4,29 @@ "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.20.0", - "@next/eslint-plugin-next": "15.1.6", - "eslint": "9.20.0", - "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", - "typescript": "5.7.3", - "typescript-eslint": "8.23.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.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.4", + "globals": "16.3.0", + "typescript": "5.8.3", + "typescript-eslint": "8.35.1" } } diff --git a/internal/eslint-config/vitest.js b/internal/eslint-config/vitest.js new file mode 100644 index 00000000..a97c4119 --- /dev/null +++ b/internal/eslint-config/vitest.js @@ -0,0 +1,22 @@ +import vitest from '@vitest/eslint-plugin'; +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', + { + onlyFunctionsWithAsyncKeyword: true, + onlyFunctionsWithExpectInLoop: true, + onlyFunctionsWithExpectInCallback: true, + }, + ], + }, +}); diff --git a/internal/next-common/package.json b/internal/next-common/package.json deleted file mode 100644 index d8d570ac..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": "14.2.15" - }, - "devDependencies": { - "@repo/typescript-config": "workspace:*", - "@types/node": "22.13.1", - "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 40554f48..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.1", - "typescript": "5.7.3" - } -} diff --git a/internal/next-lru-cache/src/cache-types/cache-string-value.ts b/internal/next-lru-cache/src/cache-types/cache-string-value.ts deleted file mode 100644 index 304425f5..00000000 --- a/internal/next-lru-cache/src/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'; -import { createConfiguredCache } from '../create-configured-cache'; - -function calculateStringSize(value: string): number { - return value.length; -} - -export default function createCacheStore( - options?: LruCacheOptions, -): LRUCache { - return createConfiguredCache(calculateStringSize, options); -} 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 deleted file mode 100644 index 5e18046f..00000000 --- a/internal/next-lru-cache/src/cache-types/next-cache-handler-value.ts +++ /dev/null @@ -1,49 +0,0 @@ -import type { CacheHandlerValue } from '@repo/next-common'; -import type { LRUCache } from 'lru-cache'; - -import type { LruCacheOptions } from '../create-configured-cache'; -import { createConfiguredCache } from '../create-configured-cache'; - -function calculateObjectSize({ value }: CacheHandlerValue): number { - // Return default size if value is falsy - if (!value) { - return 25; - } - - switch (value.kind) { - case 'REDIRECT': { - // Calculate size based on the length of the stringified props - return JSON.stringify(value.props).length; - } - case 'IMAGE': { - // Throw a specific error for image kind - throw new Error( - 'Image kind should not be used for incremental-cache calculations.', - ); - } - case 'FETCH': { - // Calculate size based on the length of the stringified data - return JSON.stringify(value.data || '').length; - } - case 'ROUTE': { - // Size based on the length of the body - return value.body.length; - } - 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; - } - } -} - -export type { LruCacheOptions }; - -export default function createCacheStore( - options?: LruCacheOptions, -): LRUCache { - return createConfiguredCache(calculateObjectSize, options); -} diff --git a/internal/next-lru-cache/src/create-configured-cache.ts b/internal/next-lru-cache/src/create-configured-cache.ts deleted file mode 100644 index 91eb41fe..00000000 --- a/internal/next-lru-cache/src/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/internal/next-lru-cache/tsconfig.json b/internal/next-lru-cache/tsconfig.json deleted file mode 100644 index 9c5847bc..00000000 --- a/internal/next-lru-cache/tsconfig.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "extends": "@repo/typescript-config/base.json", - "include": ["."], - "exclude": ["dist", "node_modules"] -} diff --git a/internal/typescript-config/lib.json b/internal/typescript-config/lib.json new file mode 100644 index 00000000..855cd635 --- /dev/null +++ b/internal/typescript-config/lib.json @@ -0,0 +1,23 @@ +{ + "$schema": "https://json.schemastore.org/tsconfig", + "display": "Node 20", + "_version": "20.17.0", + "compilerOptions": { + "target": "es2022", + "lib": ["es2024", "esnext.disposable"], + + "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/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/package.json b/package.json index 4b5c9156..2550dc75 100644 --- a/package.json +++ b/package.json @@ -8,37 +8,33 @@ "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", - "codestyle:fix": "biome check --write . && pnpm prettier:fix", + "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 --filter=!@neshca/server", + "dev:packages": "turbo run dev", "e2e": "turbo run e2e", - "eslint:check": "turbo run eslint:check", - "eslint:fix": "turbo run eslint:fix", - "prettier:check": "prettier --check **/*.{md,mdx,yml,json}", - "prettier:fix": "prettier --write **/*.{md,mdx,yml,json}", + "lint:check": "turbo run lint:check", + "lint:fix": "turbo run lint:fix", + "playwright:install": "pnpm -F @repo/cache-testing playwright:install", + "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.27.12", - "prettier": "3.4.2", - "prettier-plugin-packagejson": "2.5.8", - "turbo": "2.4.0" + "@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.2.1+sha512.398035c7bd696d0ba0b10a688ed558285329d27ea994804a52bad9167d8e3a72bcb993f9699585d3ca25779ac64949ef422757a6c31102c12ab932e5cbe5cc92", + "packageManager": "pnpm@10.12.4+sha512.5ea8b0deed94ed68691c9bad4c955492705c5eeb8a87ef86bc62c74a26b037b08ff9570f108b2e4dbd1dd1a9186fea925e527f141c648e85af45631074680184", "engines": { "node": ">=22.11.0" - }, - "pnpm": { - "onlyBuiltDependencies": [ - "@biomejs/biome", - "esbuild" - ] } } 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/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 dbce7c73..2e687600 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,80 +23,38 @@ }, "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", + "./helpers/*": "./dist/helpers/*.js", + "./handlers/*": "./dist/handlers/*.js", + "./instrumentation/*": "./dist/instrumentation/*.js", + "./use-cache/*": "./dist/use-cache/*.js" }, "scripts": { - "build": "tsup --dts-resolve", - "dev": "tsup --watch", - "test": "tsx --test src/**/*.test.ts", - "test:watch": "tsx --watch --test src/**/*.test.ts" + "build": "tsc -p tsconfig.build.json", + "check-types": "tsc --noEmit", + "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" }, "dependencies": { - "cluster-key-slot": "1.1.2", - "lru-cache": "10.4.3" + "cluster-key-slot": "^1.1.2", + "lru-cache": "^11.0.2", + "superjson": "^2.2.2" }, "devDependencies": { - "@repo/next-common": "workspace:*", - "@repo/next-lru-cache": "workspace:*", + "@repo/eslint-config": "workspace:*", "@repo/typescript-config": "workspace:*", - "@types/node": "22.13.1", - "tsup": "8.3.6", - "tsx": "4.19.2", - "typescript": "5.7.3" + "@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.2.4" }, "peerDependencies": { - "next": ">= 13.5.1 < 15", - "redis": ">= 4.6" - }, - "distTags": [ - "next13.5", - "next14" - ] + "next": ">= 15 < 16", + "redis": ">= 5 < 6" + } } diff --git a/packages/cache-handler/src/cache-handler.ts b/packages/cache-handler/src/cache-handler.ts index 60528f8c..49921f9b 100644 --- a/packages/cache-handler/src/cache-handler.ts +++ b/packages/cache-handler/src/cache-handler.ts @@ -1,9 +1,10 @@ -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, - CacheHandlerParametersRevalidateTag, CacheHandlerParametersSet, CacheHandlerValue, FileSystemCacheContext, @@ -12,15 +13,10 @@ import type { CacheHandler as NextCacheHandler, PrerenderManifest, Revalidate, -} from '@repo/next-common'; - -import { createValidatedAgeEstimationFunction } from './helpers/create-validated-age-estimation-function'; -import { getTagsFromHeaders } from './helpers/get-tags-from-headers'; +} from './next-common-types.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. @@ -276,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', @@ -295,35 +291,38 @@ 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; + export class CacheHandler implements NextCacheHandler { /** * Provides a descriptive name for the CacheHandler class. @@ -357,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'; } @@ -368,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'; @@ -387,10 +386,8 @@ export class CacheHandler implements NextCacheHandler { static async #readPagesRouterPage( 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', @@ -407,20 +404,26 @@ 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'), 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) { @@ -433,36 +436,31 @@ export class CacheHandler implements NextCacheHandler { ); } - cacheHandlerValue = { + return { lastModified: mtimeMs, lifespan: null, tags: [], value: { - kind: 'PAGE', + kind: CachedRouteKind.PAGES, html: pageHtmlFile, pageData, - postponed: undefined, headers: undefined, status: undefined, }, }; } 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( @@ -475,6 +473,7 @@ export class CacheHandler implements NextCacheHandler { 'pages', `${cacheKey}.html`, ); + const pageDataPath = path.join( CacheHandler.#serverDistDir, 'pages', @@ -506,7 +505,7 @@ export class CacheHandler implements NextCacheHandler { 'file system', 'set', cacheKey, - `Error: ${error}`, + `Error: ${error as Error}`, ); } } @@ -623,8 +622,7 @@ export class CacheHandler implements NextCacheHandler { CacheHandler.#defaultStaleAge = Math.floor(defaultStaleAge); } - CacheHandler.#estimateExpireAge = - createValidatedAgeEstimationFunction(estimateExpireAge); + CacheHandler.#estimateExpireAge = composeAgeEstimationFn(estimateExpireAge); CacheHandler.#serverDistDir = serverDistDir; @@ -664,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}`, ); } } @@ -680,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( @@ -712,7 +710,6 @@ export class CacheHandler implements NextCacheHandler { cacheHandlerValue = null; - // remove the entry from all handlers in background removeEntryFromHandlers(handlersList, key, CacheHandler.#debug); } @@ -734,7 +731,7 @@ export class CacheHandler implements NextCacheHandler { handler.name, 'get', key, - `Error: ${error}`, + `Error: ${error as Error}`, ); } } @@ -742,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 }), @@ -773,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)), ); @@ -815,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; @@ -829,11 +828,13 @@ export class CacheHandler implements NextCacheHandler { async get( cacheKey: CacheHandlerParametersGet[0], - ctx: CacheHandlerParametersGet[1] = {}, + 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,26 +846,26 @@ export class CacheHandler implements NextCacheHandler { } let cachedData: CacheHandlerValue | null | undefined = - await CacheHandler.#mergedHandler.get(cacheKey, { - implicitTags: softTags, + await CacheHandler.#mergedHandler?.get(cacheKey, { + implicitTags: [], }); - if (cachedData?.value?.kind === '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); + 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) { - await CacheHandler.#mergedHandler.set(cacheKey, cachedData); + await CacheHandler.#mergedHandler?.set(cacheKey, cachedData); } } + if (ctx.isFallback) { + cachedData = await CacheHandler.#readPagesRouterPage( + cacheKey, + ctx.isFallback, + ); + } + return cachedData ?? null; } @@ -873,6 +874,13 @@ export class CacheHandler implements NextCacheHandler { incrementalCacheValue: CacheHandlerParametersSet[1], ctx: CacheHandlerParametersSet[2] & { neshca_lastModified?: number }, ): Promise { + if ( + incrementalCacheValue?.kind !== CachedRouteKind.PAGES || + ctx.fetchCache === true + ) { + return; + } + await CacheHandler.#configureCacheHandler(); if (CacheHandler.#debug) { @@ -884,7 +892,9 @@ export class CacheHandler implements NextCacheHandler { ); } - const { revalidate, tags = [], neshca_lastModified } = ctx; + const { neshca_lastModified, cacheControl } = ctx; + + const revalidate = cacheControl?.revalidate; const lastModified = Math.round(neshca_lastModified ?? Date.now()); @@ -899,42 +909,16 @@ export class CacheHandler implements NextCacheHandler { return; } - let cacheHandlerValueTags = tags; - - let value = incrementalCacheValue; - - switch (value?.kind) { - case 'PAGE': { - cacheHandlerValueTags = getTagsFromHeaders(value.headers ?? {}); - break; - } - case '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; - } - } - - const cacheHandlerValue: CacheHandlerValue = { + const cacheHandlerValue = { lastModified, lifespan, - tags: Object.freeze(cacheHandlerValueTags), - value, - }; + tags: [], + value: incrementalCacheValue, + } as const; - await CacheHandler.#mergedHandler.set(cacheKey, cacheHandlerValue); + await CacheHandler.#mergedHandler?.set(cacheKey, cacheHandlerValue); - if (hasFallbackFalse && cacheHandlerValue.value?.kind === 'PAGE') { + if (hasFallbackFalse) { await CacheHandler.#writePagesRouterPage( cacheKey, cacheHandlerValue.value, @@ -942,25 +926,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/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/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/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/experimental-redis-cluster.ts b/packages/cache-handler/src/handlers/experimental-redis-cluster.ts index fdb8f0e2..abceffee 100644 --- a/packages/cache-handler/src/handlers/experimental-redis-cluster.ts +++ b/packages/cache-handler/src/handlers/experimental-redis-cluster.ts @@ -1,11 +1,9 @@ import calculate from 'cluster-key-slot'; +import { REVALIDATED_TAGS_KEY } from '../constants.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'; -import type { CacheHandlerValue, Handler } from '../cache-handler'; -import type { CreateRedisStringsHandlerOptions } from '../common-types'; - -import { REVALIDATED_TAGS_KEY } from '../constants'; -import { getTimeoutRedisCommandOptions } from '../helpers/get-timeout-redis-command-options'; -import { isImplicitTag } from '../helpers/is-implicit-tag'; type CreateRedisClusterHandlerOptions> = CreateRedisStringsHandlerOptions & { @@ -21,6 +19,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 +57,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,11 +98,13 @@ export default function createHandler({ return { name: 'experimental-redis-cluster', - async get(key, { implicitTags }) { - const result = await cluster.get( - getTimeoutRedisCommandOptions(timeoutMs), - keyPrefix + key, - ); + async get( + key, + { implicitTags }, + ): Promise { + const result = await cluster + .withCommandOptions({ abortSignal: AbortSignal.timeout(timeoutMs) }) + .get(keyPrefix + key); if (!result) { return null; @@ -103,21 +122,18 @@ export default function createHandler({ return cacheValue; } - const revalidationTimes = await cluster.hmGet( - getTimeoutRedisCommandOptions(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( - getTimeoutRedisCommandOptions(timeoutMs), - keyPrefix + key, - ); + await cluster + .withCommandOptions({ abortSignal: AbortSignal.timeout(timeoutMs) }) + .unlink(keyPrefix + key); return null; } @@ -125,17 +141,18 @@ export default function createHandler({ return cacheValue; }, - async set(key, cacheHandlerValue) { - const options = getTimeoutRedisCommandOptions(timeoutMs); + async set(key, cacheHandlerValue): Promise { + 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' @@ -147,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; } @@ -171,48 +190,43 @@ 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]); }, - 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 (isImplicitTag(tag)) { - await cluster.hSet( - getTimeoutRedisCommandOptions(timeoutMs), - revalidatedTagsKey, - tag, - Date.now(), - ); + if (isTagImplicit(tag)) { + 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( - getTimeoutRedisCommandOptions(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) { - tagsMap.set(field, JSON.parse(value)); + 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[] = []; @@ -235,32 +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; } - const unlinkPromisesForSlot = client.unlink( - getTimeoutRedisCommandOptions(timeoutMs), - keys, + unlinkPromises.push( + client.withAbortSignal(AbortSignal.timeout(timeoutMs)).unlink(keys), ); - - if (unlinkPromisesForSlot) { - unlinkPromises.push(unlinkPromisesForSlot); - } } - const updateTagsOperation = cluster.hDel( - { isolated: true, ...getTimeoutRedisCommandOptions(timeoutMs) }, - keyPrefix + sharedTagsKey, - tagsToDelete, - ); + const updateTagsOperation = cluster + .withCommandOptions({ abortSignal: AbortSignal.timeout(timeoutMs) }) + .hDel(keyPrefix + sharedTagsKey, tagsToDelete); await Promise.allSettled([...unlinkPromises, updateTagsOperation]); }, - async delete(key) { - await cluster.unlink(getTimeoutRedisCommandOptions(timeoutMs), key); + async delete(key): Promise { + await cluster + .withCommandOptions({ abortSignal: AbortSignal.timeout(timeoutMs) }) + .unlink(key); }, }; } diff --git a/packages/cache-handler/src/handlers/local-lru.ts b/packages/cache-handler/src/handlers/local-lru.ts index 917334cd..1bc8eaa7 100644 --- a/packages/cache-handler/src/handlers/local-lru.ts +++ b/packages/cache-handler/src/handlers/local-lru.ts @@ -1,15 +1,126 @@ -import type { LruCacheOptions } from '@repo/next-lru-cache/next-cache-handler-value'; -import createCacheStore from '@repo/next-lru-cache/next-cache-handler-value'; +import { LRUCache } from 'lru-cache'; +import { NEXT_CACHE_IMPLICIT_TAG_ID } 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'; -import { NEXT_CACHE_IMPLICIT_TAG_ID } from '@repo/next-common'; -import type { Handler } from '../cache-handler'; +/** + * 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) { + 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; + } + } +} + +/** + * Creates a cache store. + * + * @param options - The options for the cache store. + * + * @returns A new instance of LRUCache. + */ +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. + * + * @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( + 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. @@ -45,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) { @@ -75,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 @@ -95,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 d26f0211..45785383 100644 --- a/packages/cache-handler/src/handlers/redis-stack.ts +++ b/packages/cache-handler/src/handlers/redis-stack.ts @@ -1,17 +1,20 @@ -import { ErrorReply, SchemaFieldTypes } from 'redis'; - import { randomBytes } from 'node:crypto'; -import type { CacheHandlerValue, Handler } from '../cache-handler'; +import { ErrorReply, SCHEMA_FIELD_TYPE } from 'redis'; +import { REVALIDATED_TAGS_KEY, TIME_ONE_YEAR } from '../constants.js'; +import { isTagImplicit } from '../helpers/is-tag-implicit.js'; +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'; export type { CreateRedisStackHandlerOptions }; +type SearchNoContentReply = { + total: number; + documents: string[]; +}; + /** * Creates a Handler for handling cache operations using Redis JSON. * @@ -21,6 +24,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,24 +55,41 @@ 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( indexName, { - '$.tags': { type: SchemaFieldTypes.TEXT, AS: 'tag' }, + '$.tags': { type: SCHEMA_FIELD_TYPE.TEXT, AS: 'tag' }, }, { ON: 'JSON', @@ -84,13 +112,15 @@ export default function createHandler({ return { name: 'redis-stack', - async get(key, { implicitTags }) { + async get( + key, + { implicitTags }, + ): Promise { assertClientIsReady(); - const cacheValue = (await client.json.get( - getTimeoutRedisCommandOptions(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; @@ -107,21 +137,18 @@ export default function createHandler({ return cacheValue; } - const revalidationTimes = await client.hmGet( - getTimeoutRedisCommandOptions(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( - getTimeoutRedisCommandOptions(timeoutMs), - keyPrefix + key, - ); + await client + .withAbortSignal(AbortSignal.timeout(timeoutMs)) + .unlink(keyPrefix + key); return null; } @@ -129,31 +156,30 @@ export default function createHandler({ return cacheValue; }, - async set(key, cacheHandlerValue) { + async set(key, cacheHandlerValue): Promise { assertClientIsReady(); cacheHandlerValue.tags = cacheHandlerValue.tags.map(sanitizeTag); - const options = getTimeoutRedisCommandOptions(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]); }, - async revalidateTag(tag) { + async revalidateTag(tag): Promise { assertClientIsReady(); await createIndexIfNotExists(); @@ -162,13 +188,10 @@ 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)) { - await client.hSet( - getTimeoutRedisCommandOptions(timeoutMs), - revalidatedTagsKey, - sanitizedTag, - Date.now(), - ); + if (isTagImplicit(tag)) { + await client + .withAbortSignal(AbortSignal.timeout(timeoutMs)) + .hSet(revalidatedTagsKey, sanitizedTag, Date.now()); } let from = 0; @@ -176,15 +199,14 @@ export default function createHandler({ const keysToDelete: string[] = []; while (true) { - const { documents: documentIds } = await client.ft.searchNoContent( - getTimeoutRedisCommandOptions(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); @@ -201,12 +223,12 @@ export default function createHandler({ return; } - const options = getTimeoutRedisCommandOptions(timeoutMs); + const signal = AbortSignal.timeout(timeoutMs); - await client.unlink(options, keysToDelete); + await client.withAbortSignal(signal).unlink(keysToDelete); }, - async delete(key) { - await client.unlink(getTimeoutRedisCommandOptions(timeoutMs), key); + async delete(key): Promise { + 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 8cf8d4cd..8eb23052 100644 --- a/packages/cache-handler/src/handlers/redis-strings.ts +++ b/packages/cache-handler/src/handlers/redis-strings.ts @@ -1,9 +1,8 @@ -import type { CacheHandlerValue, Handler } from '../cache-handler'; -import type { CreateRedisStringsHandlerOptions } from '../common-types'; - -import { REVALIDATED_TAGS_KEY } from '../constants'; -import { getTimeoutRedisCommandOptions } from '../helpers/get-timeout-redis-command-options'; -import { isImplicitTag } from '../helpers/is-implicit-tag'; +import superjson from 'superjson'; +import { REVALIDATED_TAGS_KEY } from '../constants.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 }; @@ -14,7 +13,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. * @@ -42,6 +53,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( @@ -54,19 +70,21 @@ export default function createHandler({ return { name: 'redis-strings', - async get(key, { implicitTags }) { + async get( + key, + { implicitTags }, + ): Promise { assertClientIsReady(); - const result = await client.get( - getTimeoutRedisCommandOptions(timeoutMs), - keyPrefix + key, - ); + const result = await client + .withAbortSignal(AbortSignal.timeout(timeoutMs)) + .get(keyPrefix + key); if (!result) { return null; } - const cacheValue = JSON.parse(result) as CacheHandlerValue | null; + const cacheValue = superjson.parse(result); if (!cacheValue) { return null; @@ -78,21 +96,18 @@ export default function createHandler({ return cacheValue; } - const revalidationTimes = await client.hmGet( - getTimeoutRedisCommandOptions(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( - getTimeoutRedisCommandOptions(timeoutMs), - keyPrefix + key, - ); + await client + .withAbortSignal(AbortSignal.timeout(timeoutMs)) + .unlink(keyPrefix + key); return null; } @@ -100,21 +115,20 @@ export default function createHandler({ return cacheValue; }, - async set(key, cacheHandlerValue) { + async set(key, cacheHandlerValue): Promise { assertClientIsReady(); - const options = getTimeoutRedisCommandOptions(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, - JSON.stringify(cacheHandlerValue), + superjson.stringify(cacheHandlerValue), typeof cacheHandlerValue.lifespan?.expireAt === 'number' ? { EXAT: cacheHandlerValue.lifespan.expireAt, @@ -124,18 +138,14 @@ export default function createHandler({ break; } case 'EXPIREAT': { - setOperation = client.set( - options, - keyPrefix + key, - JSON.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; } @@ -148,50 +158,39 @@ export default function createHandler({ const setTagsOperation = cacheHandlerValue.tags.length > 0 - ? client.hSet( - options, - keyPrefix + sharedTagsKey, - key, - JSON.stringify(cacheHandlerValue.tags), - ) + ? client + .withAbortSignal(signal) + .hSet( + keyPrefix + sharedTagsKey, + key, + superjson.stringify(cacheHandlerValue.tags), + ) : undefined; 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. // The revalidation process is done by the CacheHandler class on the next get operation. - if (isImplicitTag(tag)) { - await client.hSet( - getTimeoutRedisCommandOptions(timeoutMs), - revalidatedTagsKey, - tag, - Date.now(), - ); + if (isTagImplicit(tag)) { + 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( - getTimeoutRedisCommandOptions(timeoutMs), - keyPrefix + sharedTagsKey, - cursor, - hScanOptions, - ); - - for (const { field, value } of remoteTagsPortion.tuples) { - tagsMap.set(field, JSON.parse(value)); + 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[] = []; @@ -208,21 +207,18 @@ export default function createHandler({ return; } - const deleteKeysOperation = client.unlink( - getTimeoutRedisCommandOptions(timeoutMs), - keysToDelete, - ); + const deleteKeysOperation = client + .withAbortSignal(AbortSignal.timeout(timeoutMs)) + .unlink(keysToDelete); - const updateTagsOperation = client.hDel( - { isolated: true, ...getTimeoutRedisCommandOptions(timeoutMs) }, - keyPrefix + sharedTagsKey, - tagsToDelete, - ); + const updateTagsOperation = client + .withAbortSignal(AbortSignal.timeout(timeoutMs)) + .hDel(keyPrefix + sharedTagsKey, tagsToDelete); await Promise.all([deleteKeysOperation, updateTagsOperation]); }, - async delete(key) { - await client.unlink(getTimeoutRedisCommandOptions(timeoutMs), key); + async delete(key): Promise { + await client.withAbortSignal(AbortSignal.timeout(timeoutMs)).unlink(key); }, }; } 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/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 adf33d44..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'; -import { createValidatedAgeEstimationFunction } from './create-validated-age-estimation-function'; - -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 601abe6f..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'; - -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 a85c7fcc..fdfd0c8f 100644 --- a/packages/cache-handler/src/helpers/helpers.ts +++ b/packages/cache-handler/src/helpers/helpers.ts @@ -1,3 +1 @@ -export { promiseWithTimeout } from './promise-with-timeout'; -export { isImplicitTag } from './is-implicit-tag'; -export { getTimeoutRedisCommandOptions } from './get-timeout-redis-command-options'; +export { isTagImplicit } from './is-tag-implicit.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 a97db76f..00000000 --- a/packages/cache-handler/src/helpers/is-implicit-tag.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { NEXT_CACHE_IMPLICIT_TAG_ID } from '@repo/next-common'; - -/** - * 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 d585cd18..00000000 --- a/packages/cache-handler/src/helpers/is-tags-manifest.ts +++ /dev/null @@ -1,20 +0,0 @@ -import type { TagsManifest } from '@repo/next-common'; - -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 8afb62ba..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'; - -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 1afac29e..00000000 --- a/packages/cache-handler/src/helpers/promise-with-timeout.ts +++ /dev/null @@ -1,46 +0,0 @@ -import { MAX_INT32 } from '../constants'; - -/** - * 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/instrumentation.ts b/packages/cache-handler/src/instrumentation/instrumentation.ts deleted file mode 100644 index ec501a50..00000000 --- a/packages/cache-handler/src/instrumentation/instrumentation.ts +++ /dev/null @@ -1,4 +0,0 @@ -export { - registerInitialCache, - type RegisterInitialCacheOptions, -} from './register-initial-cache'; diff --git a/packages/cache-handler/src/instrumentation/register-initial-cache.ts b/packages/cache-handler/src/instrumentation/register-initial-cache.ts index d6d0a35b..1cf6d791 100644 --- a/packages/cache-handler/src/instrumentation/register-initial-cache.ts +++ b/packages/cache-handler/src/instrumentation/register-initial-cache.ts @@ -1,35 +1,20 @@ import { promises as fsPromises } from 'node:fs'; import path from 'node:path'; -import type { - CachedFetchValue, - Revalidate, - 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'; - -type CacheHandlerType = typeof import('../cache-handler').CacheHandler; +import { PRERENDER_MANIFEST, SERVER_DIRECTORY } from 'next/constants.js'; +import { PRERENDER_MANIFEST_VERSION } from '../constants.js'; +import { CachedRouteKind } from '../next-common-types.js'; +import type { CacheHandlerType } from '../cache-handler.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. * * @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. * @@ -38,14 +23,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; }; /** @@ -58,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` * @@ -86,16 +63,13 @@ 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); 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; @@ -117,7 +91,7 @@ export async function registerInitialCache( '[CacheHandler] [%s] %s %s', 'registerInitialCache', 'Failed to read prerender manifest', - `Error: ${error}`, + `Error: ${error as Error}`, ); } @@ -141,103 +115,29 @@ export async function registerInitialCache( '[CacheHandler] [%s] %s %s', 'registerInitialCache', 'Failed to create CacheHandler instance', - `Error: ${error}`, + `Error: ${error as Error}`, ); } 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: '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; - } - } - + /** + * 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); - const isAppRouter = router === 'app'; - let lastModified: number | undefined; try { @@ -249,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; @@ -257,22 +157,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) { @@ -280,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}`, ); } @@ -291,14 +182,17 @@ export async function registerInitialCache( await cacheHandler.set( cachePath, { - kind: 'PAGE', + kind: CachedRouteKind.PAGES, html, pageData, - postponed: meta?.postponed, - headers: meta?.headers, - status: meta?.status, + headers: undefined, + status: undefined, + }, + { + neshca_lastModified: lastModified, + fetchCache: false, + cacheControl: { revalidate, expire: 0 }, }, - { revalidate, neshca_lastModified: lastModified }, ); } catch (error) { if (debug) { @@ -306,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}`, ); } @@ -320,91 +214,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/internal/next-common/src/next-common.ts b/packages/cache-handler/src/next-common-types.ts similarity index 83% rename from internal/next-common/src/next-common.ts rename to packages/cache-handler/src/next-common-types.ts index 532410bc..57d2cec4 100644 --- a/internal/next-common/src/next-common.ts +++ b/packages/cache-handler/src/next-common-types.ts @@ -1,17 +1,16 @@ -// biome-ignore lint/style/useNodejsImportProtocol: RollupError: "OutgoingHttpHeaders" is not exported by "node:http" -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 { IncrementalCacheValue } from 'next/dist/server/response-cache/types'; +} from 'next/dist/server/lib/incremental-cache/index.js'; +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'; -export type { - CacheHandler, - CacheHandlerContext, -} 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, @@ -19,7 +18,12 @@ export type { CachedFetchValue, IncrementalCacheValue, IncrementalCacheEntry, -} from 'next/dist/server/response-cache/types'; +} 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; @@ -85,9 +89,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; @@ -126,7 +133,7 @@ type ExtractIncrementalCacheKind = T extends { kind: Kind } export type IncrementalCachedPageValue = ExtractIncrementalCacheKind< IncrementalCacheValue, - 'PAGE' + CachedRouteKind.PAGES >; export type TagsManifest = { 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..026bd9db --- /dev/null +++ b/packages/cache-handler/src/use-cache-cache.ts @@ -0,0 +1,174 @@ +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'; + +export type SerializedCacheEntry = Omit & { + value: string; +}; + +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, options: RemoteStoreOptions): Promise; + refreshTags(tagsManifest: Map): Promise; + getExpirationTimestamps(tags: string[]): Promise; + expireTags(expiredTags: Map): Promise; +}; + +/** + * 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) { + const pendingPromise = pendingSets.get(cacheKey); + + if (pendingPromise) { + await pendingPromise; + } + + try { + const remoteStore = await remoteStorePromise; + + const serializedEntry: string | undefined = + await remoteStore.get(cacheKey); + + if (!serializedEntry) { + return undefined; + } + + const entry = JSON.parse(serializedEntry) as SerializedCacheEntry; + + 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): void { + 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); + + const entry = await pendingEntry; + + try { + const chunks: Uint8Array[] = []; + + const reader = entry.value.getReader(); + + while (true) { + const readerResult = await reader.read(); + + if (readerResult.done) { + break; + } + + chunks.push(readerResult.value); + } + + 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); + } + }, + 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..b4893a48 --- /dev/null +++ b/packages/cache-handler/src/use-cache/node-redis.ts @@ -0,0 +1,161 @@ +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 { RedisClientType } from 'redis'; + +export type Config = { + client: T; + pubClient: T; + subClientId: string; + channel: string; + keyPrefix?: string; + timeoutMs?: number; + expireTrigger?: 'stale' | 'expire'; +}; + +type Message = { + expiredTags: Record; + 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 = '', + timeoutMs = 5000, + expireTrigger = 'stale', +}: Config): RemoteStore { + const getKey = (key: string): string => `${keyPrefix}${key}`; + + return { + async get(key): Promise { + if (!client.isReady) { + return; + } + + const signal = AbortSignal.timeout(timeoutMs); + + return ( + (await client.withAbortSignal(signal).get(getKey(key))) ?? undefined + ); + }, + async set(key, value, { expire, timestamp, stale }): Promise { + if (!client.isReady) { + return; + } + + const signal = AbortSignal.timeout(timeoutMs); + + const expireAt = + expireTrigger === 'stale' + ? Math.floor(timestamp / 1000 + Math.min(expire, stale)) + : Math.floor(timestamp / 1000 + expire); + + await client.withAbortSignal(signal).set(getKey(key), value, { + EXAT: expireAt, + }); + }, + async expireTags(expiredTags): Promise { + if (!pubClient.isReady) { + return; + } + + await pubClient.publish( + channel, + JSON.stringify({ + expiredTags: Object.fromEntries(expiredTags), + subClientId, + } satisfies Message), + ); + }, + getExpirationTimestamps(): Promise { + return Promise.resolve([0]); + }, + 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({ + client, + keyPrefix, + timeoutMs, +}: Config): CacheHandlerV2 { + const remoteStore = Promise.all([ + client.connect(), + client.duplicate().connect(), + client.duplicate().connect(), + ]) + .then(async ([mainClient, pubClient, subClient]) => { + const subClientId = randomUUID(); + const channel = keyPrefix + ? `${keyPrefix}__revalidate_channel__` + : '__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, + timeoutMs, + })) + .then(createRedisStore); + + return createCacheHandler(remoteStore); +} 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..f7da4bf7 --- /dev/null +++ b/packages/cache-handler/src/utils/compose-age-estimation-fn.ts @@ -0,0 +1,62 @@ +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/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..96e81787 --- /dev/null +++ b/packages/cache-handler/test/utils/compose-age-estimation-fn.test.ts @@ -0,0 +1,148 @@ +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', () => { + 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.', + ); + }); + + 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.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 3b78eb2d..cb806e85 100644 --- a/packages/cache-handler/tsconfig.json +++ b/packages/cache-handler/tsconfig.json @@ -1,13 +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": { - "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" - ] - } - } + "rootDir": ".", + "erasableSyntaxOnly": true + }, + "include": ["**/*.ts"], + "exclude": ["node_modules", "dist"] } 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/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/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 fa9b19b7..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.1", - "tsup": "8.3.6", - "tsx": "4.19.2", - "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 1ce0ee23..00000000 --- a/packages/server/package.json +++ /dev/null @@ -1,43 +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.1", - "tsup": "8.3.6", - "tsx": "4.19.2", - "typescript": "5.7.3" - }, - "distTags": [ - "next13.5", - "next14" - ] -} 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 b75e0b23..cc0946d2 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -8,21 +8,21 @@ importers: .: devDependencies: - '@biomejs/biome': - specifier: 1.9.4 - version: 1.9.4 '@changesets/cli': - specifier: 2.27.12 - version: 2.27.12 + specifier: 2.29.5 + version: 2.29.5 prettier: - specifier: 3.4.2 - version: 3.4.2 + specifier: 3.6.2 + version: 3.6.2 prettier-plugin-packagejson: - specifier: 2.5.8 - version: 2.5.8(prettier@3.4.2) + specifier: 2.5.18 + version: 2.5.18(prettier@3.6.2) turbo: - specifier: 2.4.0 - version: 2.4.0 + specifier: 2.5.4 + version: 2.5.4 + typescript: + 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.7.9 - version: 1.7.9 + specifier: 1.10.0 + version: 1.10.0 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.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: 18.3.1 - version: 18.3.1 + specifier: 19.1.0 + version: 19.1.0 react-dom: - specifier: 18.3.1 - version: 18.3.1(react@18.3.1) + specifier: 19.1.0 + version: 19.1.0(react@19.1.0) redis: - specifier: 4.7.0 - version: 4.7.0 + specifier: 5.5.6 + version: 5.5.6 devDependencies: '@playwright/test': - specifier: 1.50.1 - version: 1.50.1 + specifier: 1.53.2 + version: 1.53.2 '@repo/eslint-config': specifier: workspace:* version: link:../../internal/eslint-config @@ -55,47 +55,50 @@ importers: specifier: workspace:* version: link:../../internal/typescript-config '@types/node': - specifier: 22.13.1 - version: 22.13.1 + specifier: 24.0.10 + version: 24.0.10 '@types/react': - specifier: 18.3.12 - version: 18.3.12 + specifier: 19.1.8 + version: 19.1.8 '@types/react-dom': - specifier: 18.3.1 - version: 18.3.1 + 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.20.0 - version: 9.20.0 + specifier: 9.30.1 + version: 9.30.1 fastify: - specifier: 5.2.1 - version: 5.2.1 + specifier: 5.4.0 + version: 5.4.0 pm2: - specifier: 5.4.3 - version: 5.4.3 + specifier: 6.0.8 + version: 6.0.8 tsx: - specifier: 4.19.2 - version: 4.19.2 + specifier: 4.20.3 + version: 4.20.3 typescript: - specifier: 5.7.3 - version: 5.7.3 + specifier: 5.8.3 + version: 5.8.3 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.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.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.17 + 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.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.17 + 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.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:* @@ -104,17 +107,17 @@ importers: specifier: workspace:* version: link:../../internal/typescript-config '@types/node': - specifier: 22.13.1 - version: 22.13.1 + specifier: 24.0.10 + version: 24.0.10 '@types/react': - specifier: 19.0.8 - version: 19.0.8 + specifier: 19.1.8 + version: 19.1.8 '@types/react-dom': - specifier: 19.0.3 - version: 19.0.3(@types/react@19.0.8) + specifier: 19.1.6 + version: 19.1.6(@types/react@19.1.8) eslint: - specifier: 9.20.0 - version: 9.20.0 + specifier: 9.30.1 + version: 9.30.1 pagefind: specifier: 1.3.0 version: 1.3.0 @@ -122,312 +125,210 @@ importers: specifier: 14.2.4 version: 14.2.4 typescript: - specifier: 5.7.3 - version: 5.7.3 + specifier: 5.8.3 + version: 5.8.3 internal/backend: dependencies: fastify: - specifier: 5.2.1 - version: 5.2.1 + 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.13.1 - version: 22.13.1 + specifier: 24.0.10 + version: 24.0.10 pino-pretty: specifier: 13.0.0 version: 13.0.0 tsx: - specifier: 4.19.2 - version: 4.19.2 + specifier: 4.20.3 + version: 4.20.3 typescript: - specifier: 5.7.3 - version: 5.7.3 + specifier: 5.8.3 + version: 5.8.3 internal/eslint-config: devDependencies: '@eslint/js': - specifier: 9.20.0 - version: 9.20.0 + specifier: 9.30.1 + version: 9.30.1 '@next/eslint-plugin-next': - specifier: 15.1.6 - version: 15.1.6 + specifier: 15.4.0-canary.61 + version: 15.4.0-canary.61 + '@typescript-eslint/parser': + specifier: 8.35.1 + version: 8.35.1(eslint@9.30.1)(typescript@5.8.3) + '@vitest/eslint-plugin': + 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.20.0 - version: 9.20.0 + specifier: 9.30.1 + version: 9.30.1 eslint-config-prettier: - specifier: 10.0.1 - version: 10.0.1(eslint@9.20.0) + specifier: 10.1.5 + version: 10.1.5(eslint@9.30.1) + eslint-import-resolver-typescript: + 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.3.0 + version: 3.3.0(eslint@9.30.1) + eslint-plugin-import-x: + 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: 51.3.3 + version: 51.3.3(eslint@9.30.1) + eslint-plugin-mdx: + 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.4 - version: 7.37.4(eslint@9.20.0) + specifier: 7.37.5 + version: 7.37.5(eslint@9.30.1) eslint-plugin-react-hooks: - specifier: 5.1.0 - version: 5.1.0(eslint@9.20.0) + specifier: 5.2.0 + version: 5.2.0(eslint@9.30.1) eslint-plugin-turbo: - specifier: 2.4.0 - version: 2.4.0(eslint@9.20.0)(turbo@2.4.0) + specifier: 2.5.4 + version: 2.5.4(eslint@9.30.1)(turbo@2.5.4) globals: - specifier: 15.14.0 - version: 15.14.0 + specifier: 16.3.0 + version: 16.3.0 typescript: - specifier: 5.7.3 - version: 5.7.3 + specifier: 5.8.3 + version: 5.8.3 typescript-eslint: - specifier: 8.23.0 - version: 8.23.0(eslint@9.20.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) - devDependencies: - '@repo/typescript-config': - specifier: workspace:* - version: link:../typescript-config - '@types/node': - specifier: 22.13.1 - version: 22.13.1 - 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.1 - version: 22.13.1 - typescript: - specifier: 5.7.3 - version: 5.7.3 + specifier: 8.35.1 + version: 8.35.1(eslint@9.30.1)(typescript@5.8.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 - 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: ^11.0.2 + version: 11.1.0 redis: - specifier: '>= 4.6' - version: 4.7.0 + specifier: '>= 5 < 6' + version: 5.5.6 + 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.1 - version: 22.13.1 - 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) - tsx: - specifier: 4.19.2 - version: 4.19.2 - typescript: - 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.1 - version: 22.13.1 - 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) - tsx: - specifier: 4.19.2 - version: 4.19.2 - 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': + '@repo/eslint-config': specifier: workspace:* - version: link:../../internal/next-lru-cache + version: link:../../internal/eslint-config '@repo/typescript-config': specifier: workspace:* version: link:../../internal/typescript-config '@types/node': - specifier: 22.13.1 - version: 22.13.1 - 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) + specifier: 24.0.10 + version: 24.0.10 + eslint: + specifier: 9.30.1 + version: 9.30.1 + next: + 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.2 - version: 4.19.2 + specifier: 4.20.3 + version: 4.20.3 typescript: - specifier: 5.7.3 - version: 5.7.3 + specifier: 5.8.3 + version: 5.8.3 + vitest: + 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: - '@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.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/code-frame@7.27.1': + resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==} 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.27.1': + resolution: {integrity: sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==} + 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.27.6': + resolution: {integrity: sha512-vbavdySgbTTrmFE+EsiqUTzlOr5bzlnJtUv9PynGCAKvfQqjIXbvFdumPM/GxMDfyuGMJaJAU6TO4zc1Jf1i8Q==} + engines: {node: '>=6.9.0'} '@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.12': + resolution: {integrity: sha512-EaET7As5CeuhTzvXTQCRZeBUcisoYPDDcXvgTE/2jmmypKp0RC7LxKj/yzqeh/1qFTZI7oDGFcL1PHRuQuketQ==} - '@changesets/assemble-release-plan@6.0.5': - resolution: {integrity: sha512-IgvBWLNKZd6k4t72MBTBK3nkygi0j3t3zdC1zrfusYo0KpdsvnDjrMM9vPnTCLCMlfNs55jRL4gIMybxa64FCQ==} + '@changesets/assemble-release-plan@6.0.9': + resolution: {integrity: sha512-tPgeeqCHIwNo8sypKlS3gOPmsS3wP0zHt67JDuL20P4QcXiw/O4Hl7oXiuLnP9yg+rXLQ2sScdV1Kkzde61iSQ==} - '@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.29.5': + resolution: {integrity: sha512-0j0cPq3fgxt2dPdFsg4XvO+6L66RC0pZybT9F4dG5TBrLA3jA/1pNkdTXH9IBBVHkgsKrNKenI3n1mPyPlIydg==} 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.13': + resolution: {integrity: sha512-DWG1pus72FcNeXkM12tx+xtExyH/c9I1z+2aXlObH3i9YA7+WZEVaiHzHl03thpvAgWTRaH64MpfHxozfF7Dvg==} '@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==} - '@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.5': + resolution: {integrity: sha512-UPzNGhsSjHD3Veb0xO/MwvasGe8eMyNrR/sT9gR8Q3DhOQZirgKhhXv/8hVsI0QpPjR004Z9iFxoJU6in3uGMg==} - '@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==} @@ -444,305 +345,171 @@ packages: '@chevrotain/utils@11.0.3': resolution: {integrity: sha512-YslZMgtJUyuMbZ+aKvfF3x1f5liK4mWNxghFRv7jqRR9C3R3fAOGTTKvxXDa2Y1s9zSbcpuO0cAxDYsc9SrXoQ==} - '@emnapi/runtime@1.3.1': - resolution: {integrity: sha512-kEBmG8KyqtxJZv+ygbEim+KCGtIq1fC22Ms3S4ziXmYKm8uyoLX0MHONVKwp+9opg390VaKRNt4a7A9NwmpNhw==} + '@emnapi/core@1.4.3': + resolution: {integrity: sha512-4m62DuCE07lw01soJwPiBGC0nAww0Q+RY70VZ+n49yDIO13yyinhbWCeNnaob0lakDtWQzSdtNWzJeOJt2ma+g==} - '@esbuild/aix-ppc64@0.23.1': - resolution: {integrity: sha512-6VhYk1diRqrhBAqpJEdjASR/+WVRtfjpqKuNw11cLiaWpAT/Uu+nokB+UJnevzy/P9C/ty6AOe0dwueMrGh/iQ==} - engines: {node: '>=18'} - cpu: [ppc64] - os: [aix] + '@emnapi/runtime@1.4.3': + resolution: {integrity: sha512-pBPWdu6MLKROBX05wSNKcNb++m5Er+KQ9QkB+WVM+pW2Kx9hoSrVTnu3BdkI5eBLZoKu/J6mW/B6i6bJB2ytXQ==} + + '@emnapi/wasi-threads@1.0.2': + resolution: {integrity: sha512-5n3nTJblwRi8LlXkJ9eBzu+kZR8Yxcc7ubakyQTFzPMtIhFpUBRbsnc2Dv88IZDIbCDlBiWrknhB4Lsz7mg6BA==} + + '@es-joy/jsdoccomment@0.52.0': + resolution: {integrity: sha512-BXuN7BII+8AyNtn57euU2Yxo9yA/KUDNzrpXyi3pfqKmBhhysR6ZWOebFh3vyPoqA3/j1SOvGgucElMGwlXing==} + engines: {node: '>=20.11.0'} - '@esbuild/aix-ppc64@0.24.2': - resolution: {integrity: sha512-thpVCb/rhxE/BnMLQ7GReQLLN8q9qbHmI55F4489/ByVg2aQaQ6kbcLb6FHkocZzQhxc4gx0sCk0tJkKBFzDhA==} + '@esbuild/aix-ppc64@0.25.5': + resolution: {integrity: sha512-9o3TMmpmftaCMepOdA5k/yDw8SfInyzWWTjYTFCX3kPSDJMROQTb8jg+h9Cnwnmm1vOzvxN7gIfB5V2ewpjtGA==} engines: {node: '>=18'} cpu: [ppc64] os: [aix] - '@esbuild/android-arm64@0.23.1': - resolution: {integrity: sha512-xw50ipykXcLstLeWH7WRdQuysJqejuAGPd30vd1i5zSyKK3WE+ijzHmLKxdiCMtH1pHz78rOg0BKSYOSB/2Khw==} - engines: {node: '>=18'} - cpu: [arm64] - os: [android] - - '@esbuild/android-arm64@0.24.2': - resolution: {integrity: sha512-cNLgeqCqV8WxfcTIOeL4OAtSmL8JjcN6m09XIgro1Wi7cF4t/THaWEa7eL5CMoMBdjoHOTh/vwTO/o2TRXIyzg==} + '@esbuild/android-arm64@0.25.5': + resolution: {integrity: sha512-VGzGhj4lJO+TVGV1v8ntCZWJktV7SGCs3Pn1GRWI1SBFtRALoomm8k5E9Pmwg3HOAal2VDc2F9+PM/rEY6oIDg==} engines: {node: '>=18'} cpu: [arm64] os: [android] - '@esbuild/android-arm@0.23.1': - resolution: {integrity: sha512-uz6/tEy2IFm9RYOyvKl88zdzZfwEfKZmnX9Cj1BHjeSGNuGLuMD1kR8y5bteYmwqKm1tj8m4cb/aKEorr6fHWQ==} + '@esbuild/android-arm@0.25.5': + resolution: {integrity: sha512-AdJKSPeEHgi7/ZhuIPtcQKr5RQdo6OO2IL87JkianiMYMPbCtot9fxPbrMiBADOWWm3T2si9stAiVsGbTQFkbA==} engines: {node: '>=18'} cpu: [arm] 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-x64@0.23.1': - resolution: {integrity: sha512-nlN9B69St9BwUoB+jkyU090bru8L0NA3yFvAd7k8dNsVH8bi9a8cUAUSEcEEgTp2z3dbEDGJGfP6VUnkQnlReg==} - engines: {node: '>=18'} - cpu: [x64] - os: [android] - - '@esbuild/android-x64@0.24.2': - resolution: {integrity: sha512-B6Q0YQDqMx9D7rvIcsXfmJfvUYLoP722bgfBlO5cGvNVb5V/+Y7nhBE3mHV9OpxBf4eAS2S68KZztiPaWq4XYw==} + '@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.23.1': - resolution: {integrity: sha512-YsS2e3Wtgnw7Wq53XXBLcV6JhRsEq8hkfg91ESVadIrzr9wO6jJDMZnCQbHm1Guc5t/CdDiFSSfWP58FNuvT3Q==} - engines: {node: '>=18'} - cpu: [arm64] - os: [darwin] - - '@esbuild/darwin-arm64@0.24.2': - resolution: {integrity: sha512-kj3AnYWc+CekmZnS5IPu9D+HWtUI49hbnyqk0FLEJDbzCIQt7hg7ucF1SQAilhtYpIujfaHr6O0UHlzzSPdOeA==} + '@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.23.1': - resolution: {integrity: sha512-aClqdgTDVPSEGgoCS8QDG37Gu8yc9lTHNAQlsztQ6ENetKEO//b8y31MMu2ZaPbn4kVsIABzVLXYLhCGekGDqw==} + '@esbuild/darwin-x64@0.25.5': + resolution: {integrity: sha512-1iT4FVL0dJ76/q1wd7XDsXrSW+oLoquptvh4CLR4kITDtqi2e/xwXwdCVH8hVHU43wgJdsq7Gxuzcs6Iq/7bxQ==} engines: {node: '>=18'} cpu: [x64] os: [darwin] - '@esbuild/darwin-x64@0.24.2': - resolution: {integrity: sha512-WeSrmwwHaPkNR5H3yYfowhZcbriGqooyu3zI/3GGpF8AyUdsrrP0X6KumITGA9WOyiJavnGZUwPGvxvwfWPHIA==} - engines: {node: '>=18'} - cpu: [x64] - os: [darwin] - - '@esbuild/freebsd-arm64@0.23.1': - resolution: {integrity: sha512-h1k6yS8/pN/NHlMl5+v4XPfikhJulk4G+tKGFIOwURBSFzE8bixw1ebjluLOjfwtLqY0kewfjLSrO6tN2MgIhA==} + '@esbuild/freebsd-arm64@0.25.5': + resolution: {integrity: sha512-nk4tGP3JThz4La38Uy/gzyXtpkPW8zSAmoUhK9xKKXdBCzKODMc2adkB2+8om9BDYugz+uGV7sLmpTYzvmz6Sw==} engines: {node: '>=18'} cpu: [arm64] os: [freebsd] - '@esbuild/freebsd-arm64@0.24.2': - resolution: {integrity: sha512-UN8HXjtJ0k/Mj6a9+5u6+2eZ2ERD7Edt1Q9IZiB5UZAIdPnVKDoG7mdTVGhHJIeEml60JteamR3qhsr1r8gXvg==} - engines: {node: '>=18'} - cpu: [arm64] - os: [freebsd] - - '@esbuild/freebsd-x64@0.23.1': - resolution: {integrity: sha512-lK1eJeyk1ZX8UklqFd/3A60UuZ/6UVfGT2LuGo3Wp4/z7eRTRYY+0xOu2kpClP+vMTi9wKOfXi2vjUpO1Ro76g==} + '@esbuild/freebsd-x64@0.25.5': + resolution: {integrity: sha512-PrikaNjiXdR2laW6OIjlbeuCPrPaAl0IwPIaRv+SMV8CiM8i2LqVUHFC1+8eORgWyY7yhQY+2U2fA55mBzReaw==} engines: {node: '>=18'} cpu: [x64] os: [freebsd] - '@esbuild/freebsd-x64@0.24.2': - resolution: {integrity: sha512-TvW7wE/89PYW+IevEJXZ5sF6gJRDY/14hyIGFXdIucxCsbRmLUcjseQu1SyTko+2idmCw94TgyaEZi9HUSOe3Q==} - engines: {node: '>=18'} - cpu: [x64] - os: [freebsd] - - '@esbuild/linux-arm64@0.23.1': - resolution: {integrity: sha512-/93bf2yxencYDnItMYV/v116zff6UyTjo4EtEQjUBeGiVpMmffDNUyD9UN2zV+V3LRV3/on4xdZ26NKzn6754g==} - engines: {node: '>=18'} - cpu: [arm64] - os: [linux] - - '@esbuild/linux-arm64@0.24.2': - resolution: {integrity: sha512-7HnAD6074BW43YvvUmE/35Id9/NB7BeX5EoNkK9obndmZBUk8xmJJeU7DwmUeN7tkysslb2eSl6CTrYz6oEMQg==} + '@esbuild/linux-arm64@0.25.5': + resolution: {integrity: sha512-Z9kfb1v6ZlGbWj8EJk9T6czVEjjq2ntSYLY2cw6pAZl4oKtfgQuS4HOq41M/BcoLPzrUbNd+R4BXFyH//nHxVg==} engines: {node: '>=18'} cpu: [arm64] os: [linux] - '@esbuild/linux-arm@0.23.1': - resolution: {integrity: sha512-CXXkzgn+dXAPs3WBwE+Kvnrf4WECwBdfjfeYHpMeVxWE0EceB6vhWGShs6wi0IYEqMSIzdOF1XjQ/Mkm5d7ZdQ==} + '@esbuild/linux-arm@0.25.5': + resolution: {integrity: sha512-cPzojwW2okgh7ZlRpcBEtsX7WBuqbLrNXqLU89GxWbNt6uIg78ET82qifUy3W6OVww6ZWobWub5oqZOVtwolfw==} engines: {node: '>=18'} cpu: [arm] 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-ia32@0.23.1': - resolution: {integrity: sha512-VTN4EuOHwXEkXzX5nTvVY4s7E/Krz7COC8xkftbbKRYAl96vPiUssGkeMELQMOnLOJ8k3BY1+ZY52tttZnHcXQ==} - engines: {node: '>=18'} - cpu: [ia32] - os: [linux] - - '@esbuild/linux-ia32@0.24.2': - resolution: {integrity: sha512-sfv0tGPQhcZOgTKO3oBE9xpHuUqguHvSo4jl+wjnKwFpapx+vUDcawbwPNuBIAYdRAvIDBfZVvXprIj3HA+Ugw==} + '@esbuild/linux-ia32@0.25.5': + resolution: {integrity: sha512-sQ7l00M8bSv36GLV95BVAdhJ2QsIbCuCjh/uYrWiMQSUuV+LpXwIqhgJDcvMTj+VsQmqAHL2yYaasENvJ7CDKA==} engines: {node: '>=18'} cpu: [ia32] os: [linux] - '@esbuild/linux-loong64@0.23.1': - resolution: {integrity: sha512-Vx09LzEoBa5zDnieH8LSMRToj7ir/Jeq0Gu6qJ/1GcBq9GkfoEAoXvLiW1U9J1qE/Y/Oyaq33w5p2ZWrNNHNEw==} - engines: {node: '>=18'} - cpu: [loong64] - os: [linux] - - '@esbuild/linux-loong64@0.24.2': - resolution: {integrity: sha512-CN9AZr8kEndGooS35ntToZLTQLHEjtVB5n7dl8ZcTZMonJ7CCfStrYhrzF97eAecqVbVJ7APOEe18RPI4KLhwQ==} + '@esbuild/linux-loong64@0.25.5': + resolution: {integrity: sha512-0ur7ae16hDUC4OL5iEnDb0tZHDxYmuQyhKhsPBV8f99f6Z9KQM02g33f93rNH5A30agMS46u2HP6qTdEt6Q1kg==} engines: {node: '>=18'} cpu: [loong64] os: [linux] - '@esbuild/linux-mips64el@0.23.1': - resolution: {integrity: sha512-nrFzzMQ7W4WRLNUOU5dlWAqa6yVeI0P78WKGUo7lg2HShq/yx+UYkeNSE0SSfSure0SqgnsxPvmAUu/vu0E+3Q==} + '@esbuild/linux-mips64el@0.25.5': + resolution: {integrity: sha512-kB/66P1OsHO5zLz0i6X0RxlQ+3cu0mkxS3TKFvkb5lin6uwZ/ttOkP3Z8lfR9mJOBk14ZwZ9182SIIWFGNmqmg==} engines: {node: '>=18'} cpu: [mips64el] 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-ppc64@0.23.1': - resolution: {integrity: sha512-dKN8fgVqd0vUIjxuJI6P/9SSSe/mB9rvA98CSH2sJnlZ/OCZWO1DJvxj8jvKTfYUdGfcq2dDxoKaC6bHuTlgcw==} + '@esbuild/linux-ppc64@0.25.5': + resolution: {integrity: sha512-UZCmJ7r9X2fe2D6jBmkLBMQetXPXIsZjQJCjgwpVDz+YMcS6oFR27alkgGv3Oqkv07bxdvw7fyB71/olceJhkQ==} engines: {node: '>=18'} cpu: [ppc64] os: [linux] - '@esbuild/linux-ppc64@0.24.2': - resolution: {integrity: sha512-shsVrgCZ57Vr2L8mm39kO5PPIb+843FStGt7sGGoqiiWYconSxwTiuswC1VJZLCjNiMLAMh34jg4VSEQb+iEbw==} - engines: {node: '>=18'} - cpu: [ppc64] - os: [linux] - - '@esbuild/linux-riscv64@0.23.1': - resolution: {integrity: sha512-5AV4Pzp80fhHL83JM6LoA6pTQVWgB1HovMBsLQ9OZWLDqVY8MVobBXNSmAJi//Csh6tcY7e7Lny2Hg1tElMjIA==} - engines: {node: '>=18'} - cpu: [riscv64] - os: [linux] - - '@esbuild/linux-riscv64@0.24.2': - resolution: {integrity: sha512-4eSFWnU9Hhd68fW16GD0TINewo1L6dRrB+oLNNbYyMUAeOD2yCK5KXGK1GH4qD/kT+bTEXjsyTCiJGHPZ3eM9Q==} + '@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.23.1': - resolution: {integrity: sha512-9ygs73tuFCe6f6m/Tb+9LtYxWR4c9yg7zjt2cYkjDbDpV/xVn+68cQxMXCjUpYwEkze2RcU/rMnfIXNRFmSoDw==} - engines: {node: '>=18'} - cpu: [s390x] - os: [linux] - - '@esbuild/linux-s390x@0.24.2': - resolution: {integrity: sha512-S0Bh0A53b0YHL2XEXC20bHLuGMOhFDO6GN4b3YjRLK//Ep3ql3erpNcPlEFed93hsQAjAQDNsvcK+hV90FubSw==} + '@esbuild/linux-s390x@0.25.5': + resolution: {integrity: sha512-K2dSKTKfmdh78uJ3NcWFiqyRrimfdinS5ErLSn3vluHNeHVnBAFWC8a4X5N+7FgVE1EjXS1QDZbpqZBjfrqMTQ==} engines: {node: '>=18'} cpu: [s390x] os: [linux] - '@esbuild/linux-x64@0.23.1': - resolution: {integrity: sha512-EV6+ovTsEXCPAp58g2dD68LxoP/wK5pRvgy0J/HxPGB009omFPv3Yet0HiaqvrIrgPTBuC6wCH1LTOY91EO5hQ==} + '@esbuild/linux-x64@0.25.5': + resolution: {integrity: sha512-uhj8N2obKTE6pSZ+aMUbqq+1nXxNjZIIjCjGLfsWvVpy7gKCOL6rsY1MhRh9zLtUtAI7vpgLMK6DxjO8Qm9lJw==} engines: {node: '>=18'} cpu: [x64] os: [linux] - '@esbuild/linux-x64@0.24.2': - resolution: {integrity: sha512-8Qi4nQcCTbLnK9WoMjdC9NiTG6/E38RNICU6sUNqK0QFxCYgoARqVqxdFmWkdonVsvGqWhmm7MO0jyTqLqwj0Q==} - engines: {node: '>=18'} - cpu: [x64] - os: [linux] - - '@esbuild/netbsd-arm64@0.24.2': - resolution: {integrity: sha512-wuLK/VztRRpMt9zyHSazyCVdCXlpHkKm34WUyinD2lzK07FAHTq0KQvZZlXikNWkDGoT6x3TD51jKQ7gMVpopw==} + '@esbuild/netbsd-arm64@0.25.5': + resolution: {integrity: sha512-pwHtMP9viAy1oHPvgxtOv+OkduK5ugofNTVDilIzBLpoWAM16r7b/mxBvfpuQDpRQFMfuVr5aLcn4yveGvBZvw==} engines: {node: '>=18'} cpu: [arm64] os: [netbsd] - '@esbuild/netbsd-x64@0.23.1': - resolution: {integrity: sha512-aevEkCNu7KlPRpYLjwmdcuNz6bDFiE7Z8XC4CPqExjTvrHugh28QzUXVOZtiYghciKUacNktqxdpymplil1beA==} + '@esbuild/netbsd-x64@0.25.5': + resolution: {integrity: sha512-WOb5fKrvVTRMfWFNCroYWWklbnXH0Q5rZppjq0vQIdlsQKuw6mdSihwSo4RV/YdQ5UCKKvBy7/0ZZYLBZKIbwQ==} engines: {node: '>=18'} cpu: [x64] os: [netbsd] - '@esbuild/netbsd-x64@0.24.2': - resolution: {integrity: sha512-VefFaQUc4FMmJuAxmIHgUmfNiLXY438XrL4GDNV1Y1H/RW3qow68xTwjZKfj/+Plp9NANmzbH5R40Meudu8mmw==} - engines: {node: '>=18'} - cpu: [x64] - os: [netbsd] - - '@esbuild/openbsd-arm64@0.23.1': - resolution: {integrity: sha512-3x37szhLexNA4bXhLrCC/LImN/YtWis6WXr1VESlfVtVeoFJBRINPJ3f0a/6LV8zpikqoUg4hyXw0sFBt5Cr+Q==} + '@esbuild/openbsd-arm64@0.25.5': + resolution: {integrity: sha512-7A208+uQKgTxHd0G0uqZO8UjK2R0DDb4fDmERtARjSHWxqMTye4Erz4zZafx7Di9Cv+lNHYuncAkiGFySoD+Mw==} engines: {node: '>=18'} cpu: [arm64] os: [openbsd] - '@esbuild/openbsd-arm64@0.24.2': - resolution: {integrity: sha512-YQbi46SBct6iKnszhSvdluqDmxCJA+Pu280Av9WICNwQmMxV7nLRHZfjQzwbPs3jeWnuAhE9Jy0NrnJ12Oz+0A==} - engines: {node: '>=18'} - cpu: [arm64] - os: [openbsd] - - '@esbuild/openbsd-x64@0.23.1': - resolution: {integrity: sha512-aY2gMmKmPhxfU+0EdnN+XNtGbjfQgwZj43k8G3fyrDM/UdZww6xrWxmDkuz2eCZchqVeABjV5BpildOrUbBTqA==} - engines: {node: '>=18'} - cpu: [x64] - os: [openbsd] - - '@esbuild/openbsd-x64@0.24.2': - resolution: {integrity: sha512-+iDS6zpNM6EnJyWv0bMGLWSWeXGN/HTaF/LXHXHwejGsVi+ooqDfMCCTerNFxEkM3wYVcExkeGXNqshc9iMaOA==} + '@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.23.1': - resolution: {integrity: sha512-RBRT2gqEl0IKQABT4XTj78tpk9v7ehp+mazn2HbUeZl1YMdaGAQqhapjGTCe7uw7y0frDi4gS0uHzhvpFuI1sA==} + '@esbuild/sunos-x64@0.25.5': + resolution: {integrity: sha512-l+azKShMy7FxzY0Rj4RCt5VD/q8mG/e+mDivgspo+yL8zW7qEwctQ6YqKX34DTEleFAvCIUviCFX1SDZRSyMQA==} engines: {node: '>=18'} cpu: [x64] os: [sunos] - '@esbuild/sunos-x64@0.24.2': - resolution: {integrity: sha512-hTdsW27jcktEvpwNHJU4ZwWFGkz2zRJUz8pvddmXPtXDzVKTTINmlmga3ZzwcuMpUvLw7JkLy9QLKyGpD2Yxig==} - engines: {node: '>=18'} - cpu: [x64] - os: [sunos] - - '@esbuild/win32-arm64@0.23.1': - resolution: {integrity: sha512-4O+gPR5rEBe2FpKOVyiJ7wNDPA8nGzDuJ6gN4okSA1gEOYZ67N8JPk58tkWtdtPeLz7lBnY6I5L3jdsr3S+A6A==} - engines: {node: '>=18'} - cpu: [arm64] - os: [win32] - - '@esbuild/win32-arm64@0.24.2': - resolution: {integrity: sha512-LihEQ2BBKVFLOC9ZItT9iFprsE9tqjDjnbulhHoFxYQtQfai7qfluVODIYxt1PgdoyQkz23+01rzwNwYfutxUQ==} + '@esbuild/win32-arm64@0.25.5': + resolution: {integrity: sha512-O2S7SNZzdcFG7eFKgvwUEZ2VG9D/sn/eIiz8XRZ1Q/DO5a3s76Xv0mdBzVM5j5R639lXQmPmSo0iRpHqUUrsxw==} engines: {node: '>=18'} cpu: [arm64] os: [win32] - '@esbuild/win32-ia32@0.23.1': - resolution: {integrity: sha512-BcaL0Vn6QwCwre3Y717nVHZbAa4UBEigzFm6VdsVdT/MbZ38xoj1X9HPkZhbmaBGUD1W8vxAfffbDe8bA6AKnQ==} + '@esbuild/win32-ia32@0.25.5': + resolution: {integrity: sha512-onOJ02pqs9h1iMJ1PQphR+VZv8qBMQ77Klcsqv9CNW2w6yLqoURLcgERAIurY6QE63bbLuqgP9ATqajFLK5AMQ==} engines: {node: '>=18'} cpu: [ia32] os: [win32] - '@esbuild/win32-ia32@0.24.2': - resolution: {integrity: sha512-q+iGUwfs8tncmFC9pcnD5IvRHAzmbwQ3GPS5/ceCyHdjXubwQWI12MKWSNSMYLJMq23/IUCvJMS76PDqXe1fxA==} - engines: {node: '>=18'} - cpu: [ia32] - os: [win32] - - '@esbuild/win32-x64@0.23.1': - resolution: {integrity: sha512-BHpFFeslkWrXWyUPnbKm+xYYVYruCinGcftSBaa8zoF9hZO4BcSCFUvHVTtzpIY6YzUnYtuEhZ+C9iEXjxnasg==} - engines: {node: '>=18'} - cpu: [x64] - os: [win32] - - '@esbuild/win32-x64@0.24.2': - resolution: {integrity: sha512-7VTgWzgMGvup6aSqDPLiW5zHaxYJGTO4OokMjIlrCtf+VpEL+cXKtCvg723iguPYI5oaUNdS+/V7OU2gvXVWEg==} + '@esbuild/win32-x64@0.25.5': + resolution: {integrity: sha512-TXv6YnJ8ZMVdX+SXWVBo/0p8LTcrUYngpWjvm91TMjjBQii7Oz11Lw5lbDV5Y0TzuhSJHwiH4hEtC1I42mMS0g==} 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.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 @@ -751,42 +518,46 @@ 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.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/core@0.10.0': - resolution: {integrity: sha512-gFHJ+xBOo4G3WRlR1e/3G8A6/KZAH6zcE/hkLRCZTi/B9avAG365QhFA8uOGzTMqgTghpn7/fSnscW++dpMSAw==} + '@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.11.0': - resolution: {integrity: sha512-DWUB2pksgNEb6Bz2fggIy1wh6fGgZP4Xyy/Mt0QZPiloKKXerbqq9D3SBQTlCRYOrcRPu4vuz+CGjwdfqxnoWA==} + '@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.2.0': - resolution: {integrity: sha512-grOjVNN8P3hjJn/eIETF1wwd12DdnwFDoyceUJLYYdkpbwq3nLi+4fqrTAONx7XDALqlL220wC/RHSC/QTI/0w==} + '@eslint/eslintrc@3.3.1': + resolution: {integrity: sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==} 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.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.5': - resolution: {integrity: sha512-lB05FkqEdUg2AA0xEbUz0SnkXT1LcCTa438W4IWTUh4hdOnVbQyOJ81OrDXsJk/LSiJHubgGEFoR5EHq1NsH1A==} + '@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.0.0': - resolution: {integrity: sha512-OO/SA8As24JtT1usTUTKgGH7uLvhfwZPwlptRi2Dp5P4KKmJI3gvsZ8MIHnNwDs4sLf/aai5LzTyl66xr7qMxA==} + '@fastify/error@4.2.0': + resolution: {integrity: sha512-RSo3sVDXfHskiBZKBPRgnQTtIqpi/7zhJOEmAxCiBcM7d0uwdGdxLlsCaLzGs8v8NnxIRlfG0N51p5yFaOentQ==} - '@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==} @@ -797,14 +568,14 @@ 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.2': + resolution: {integrity: sha512-wNB5ooIKHQc+Kui96jE/n69rHFWAVoxn5CAzL1Xdd8FG03cgY3MLO+GF9U3W737fYDSgPWA6MReKhBQBop6Pcw==} - '@floating-ui/dom@1.6.13': - resolution: {integrity: sha512-umqzocjDgNRGTuO7Q8CU32dkHkECqI8ZdMZ5Swb6QAM0t5rnlrN3lGo1hdpscRd3WS8T6DKYK4ephgIH9iRh3w==} + '@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' @@ -815,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.5.10': - resolution: {integrity: sha512-af3qATX+m4Rnd9+wHcjJ4w2ijq+rAVP3CCinJQvFv1kgSu1W6jypUmvleJxcewdxmutM8dmIRZFxO/IQBZmP2Q==} + '@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.4': + resolution: {integrity: sha512-lz+OGcAH1dK93rgSMzXmm1qKOJkBUqZf1L4M8TWLNplftQD3IkoEDdUFNfAn4ylsN6WOTVtWaLmvmaHOUk1dTA==} engines: {node: '>=10'} peerDependencies: react: ^18 || ^19 || ^19.0.0-rc @@ -844,8 +615,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.3': + resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==} engines: {node: '>=18.18'} '@iconify/types@2.0.0': @@ -854,132 +625,136 @@ 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.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.33.5': - resolution: {integrity: sha512-fyHac4jIc1ANYGRDxtiqelIbdWkIuQaI84Mv45KvGRRxSAa7o7d1ZKAOBaYbnepLC1WqxfpimdeWfvqqSGwR2Q==} + '@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] - '@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.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.33.5': - resolution: {integrity: sha512-JTS1eldqZbJxjvKaAkxhZmBqPRGmxgu+qFKSInv8moZ2AmT5Yib3EQ1c6gp493HvrvV8QgdOXdyaIBrhvFhBMQ==} + '@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.33.5': - resolution: {integrity: sha512-y/5PCd+mP4CA/sPDKl2961b+C9d+vPAveS33s6Z3zfASk2j5upL6fXVPZi7ztePZ5CuH+1kW8JtvxgbuXHRa4Q==} + '@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.33.5': - resolution: {integrity: sha512-opC+Ok5pRNAzuvq1AG0ar+1owsu842/Ab+4qvU879ippJBHvyY5n2mxF1izXqkPYlGuP/M556uh53jRLJmzTWA==} + '@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.33.5': - resolution: {integrity: sha512-XrHMZwGQGvJg2V/oRSUfSAfjfPxO+4DkiRh6p2AFjLQztWUuY/o8Mq0eMQVIY7HJ1CDQUJlxGGZRw1a5bqmd1g==} + '@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.33.5': - resolution: {integrity: sha512-WT+d/cgqKkkKySYmqoZ8y3pxx7lx9vVejxW/W4DOFMYVSkErR+w7mf2u8m/y4+xHe7yY9DAXQMWQhpnMuFfScw==} + '@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.33.5': - resolution: {integrity: sha512-ykUW4LVGaMcU9lu9thv85CbRMAwfeadCJHRsg2GmeRa/cJxsVY9Rbd57JcMxBkKHag5U/x7TSBpScF4U8ElVzg==} + '@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.33.5': - resolution: {integrity: sha512-T36PblLaTwuVJ/zw/LaH0PdZkRz5rd3SmMHX8GSmR7vtNSP5Z6bQkExdSK7xGWyxLw4sUknBuugTelgw2faBbQ==} + '@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.33.5': - resolution: {integrity: sha512-MpY/o8/8kj+EcnxwvrP4aTJSWw/aZ7JIGR4aBeZkZw5B7/Jn+tY9/VNwtcoGmdT7GfggGIU4kygOMSbYnOrAbg==} + '@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/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==} + '@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==} @@ -990,8 +765,8 @@ 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.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==} @@ -1081,113 +856,59 @@ packages: resolution: {integrity: sha512-jMxvwzkKzd3cXo2EB9GM2ic0eYo2rP/BS6gJt6HnWbsDO1O8GSD4k7o2Cpr2YERtMpGF/MGcDfsfj2EbQPtrXw==} engines: {node: '>= 10'} - '@next/env@14.2.15': - resolution: {integrity: sha512-S1qaj25Wru2dUpcIZMjxeMVSwkt8BK4dmWHHiBuRstcIyOsMapqT4A4jSB6onvqeygkSSmOkyny9VVx8JIGamQ==} + '@napi-rs/wasm-runtime@0.2.11': + resolution: {integrity: sha512-9DPkXtvHydrcOsopiYpUgPHpmj0HWZKMUnL2dZqpvC42lsratuBG06V5ipyno0fUek5VlFsNQ+AcFATSrJXgMA==} - '@next/env@15.1.6': - resolution: {integrity: sha512-d9AFQVPEYNr+aqokIiPLNK/MTyt3DWa/dpKveiAaVccUadFbhFEvY6FXYX2LJO2Hv7PHnLBu2oWwB4uBuHjr/w==} + '@next/env@15.4.0-canary.61': + resolution: {integrity: sha512-69POa6nDa+1/CgHUiDxBUXFQFB5EdlrshdXzCaDcsbVNYeZKoGnrKHweQCzfmKGXvRcM3dziuhucVIwv68hbVw==} - '@next/eslint-plugin-next@15.1.6': - resolution: {integrity: sha512-+slMxhTgILUntZDGNgsKEYHUvpn72WP1YTlkmEhS51vnVd7S9jEEy0n9YAMcI21vUG4akTw9voWH02lrClt/yw==} + '@next/eslint-plugin-next@15.4.0-canary.61': + resolution: {integrity: sha512-Frc7XZ4REtQPUulcweJm2ssdnkw3drgD0Bm4NTZCmT8jft4Rt0zW9EHUSxO+ySD9Y5H4/BUNopxZYD3SRtMNGw==} - '@next/swc-darwin-arm64@14.2.15': - resolution: {integrity: sha512-Rvh7KU9hOUBnZ9TJ28n2Oa7dD9cvDBKua9IKx7cfQQ0GoYUwg9ig31O2oMwH3wm+pE3IkAQ67ZobPfEgurPZIA==} + '@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-arm64@15.1.6': - resolution: {integrity: sha512-u7lg4Mpl9qWpKgy6NzEkz/w0/keEHtOybmIl0ykgItBxEM5mYotS5PmqTpo+Rhg8FiOiWgwr8USxmKQkqLBCrw==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [darwin] - - '@next/swc-darwin-x64@14.2.15': - resolution: {integrity: sha512-5TGyjFcf8ampZP3e+FyCax5zFVHi+Oe7sZyaKOngsqyaNEpOgkKB3sqmymkZfowy3ufGA/tUgDPPxpQx931lHg==} + '@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-darwin-x64@15.1.6': - resolution: {integrity: sha512-x1jGpbHbZoZ69nRuogGL2MYPLqohlhnT9OCU6E6QFewwup+z+M6r8oU47BTeJcWsF2sdBahp5cKiAcDbwwK/lg==} - engines: {node: '>= 10'} - cpu: [x64] - os: [darwin] - - '@next/swc-linux-arm64-gnu@14.2.15': - resolution: {integrity: sha512-3Bwv4oc08ONiQ3FiOLKT72Q+ndEMyLNsc/D3qnLMbtUYTQAmkx9E/JRu0DBpHxNddBmNT5hxz1mYBphJ3mfrrw==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [linux] - - '@next/swc-linux-arm64-gnu@15.1.6': - resolution: {integrity: sha512-jar9sFw0XewXsBzPf9runGzoivajeWJUc/JkfbLTC4it9EhU8v7tCRLH7l5Y1ReTMN6zKJO0kKAGqDk8YSO2bg==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [linux] - - '@next/swc-linux-arm64-musl@14.2.15': - resolution: {integrity: sha512-k5xf/tg1FBv/M4CMd8S+JL3uV9BnnRmoe7F+GWC3DxkTCD9aewFRH1s5rJ1zkzDa+Do4zyN8qD0N8c84Hu96FQ==} + '@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.1.6': - resolution: {integrity: sha512-+n3u//bfsrIaZch4cgOJ3tXCTbSxz0s6brJtU3SzLOvkJlPQMJ+eHVRi6qM2kKKKLuMY+tcau8XD9CJ1OjeSQQ==} + '@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@14.2.15': - resolution: {integrity: sha512-kE6q38hbrRbKEkkVn62reLXhThLRh6/TvgSP56GkFNhU22TbIrQDEMrO7j0IcQHcew2wfykq8lZyHFabz0oBrA==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - - '@next/swc-linux-x64-gnu@15.1.6': - resolution: {integrity: sha512-SpuDEXixM3PycniL4iVCLyUyvcl6Lt0mtv3am08sucskpG0tYkW1KlRhTgj4LI5ehyxriVVcfdoxuuP8csi3kQ==} + '@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@14.2.15': - resolution: {integrity: sha512-PZ5YE9ouy/IdO7QVJeIcyLn/Rc4ml9M2G4y3kCM9MNf1YKvFY4heg3pVa/jQbMro+tP6yc4G2o9LjAz1zxD7tQ==} + '@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-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==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [win32] - - '@next/swc-win32-arm64-msvc@15.1.6': - resolution: {integrity: sha512-s8w6EeqNmi6gdvM19tqKKWbCyOBvXFbndkGHl+c9YrzsLARRdCHsD9S1fMj8gsXm9v8vhC8s3N8rjuC/XrtkEg==} + '@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-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.4.0-canary.61': + resolution: {integrity: sha512-WWzzuq52/Mu7/zr5nm4V2r6U+wnra6BxNLh1d4ZoxGkAPGkVPSOMmE/dTcVPjsADszOJwJzjVDq/KAYEftqEyw==} engines: {node: '>= 10'} cpu: [x64] os: [win32] @@ -1204,6 +925,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] @@ -1233,20 +978,20 @@ packages: resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} engines: {node: '>=14'} - '@pkgr/core@0.1.1': - resolution: {integrity: sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==} + '@pkgr/core@0.2.7': + resolution: {integrity: sha512-YLT9Zo3oNPJoBjBc4q8G2mjU4tqIbf5CEOORbUUr48dCD9q3umJ3IPlVqOqDakPfd2HuwccBaqlGhN4Gmr5OWg==} 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.53.2': + resolution: {integrity: sha512-tEB2U5z74ebBeyfGNZ3Jfg29AnW+5HlWhvHtb/Mqco9pFdZU1ZLNdVb2UtB5CvmiilNr2ZfVH/qMmAROG/XTzw==} 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': @@ -1256,205 +1001,209 @@ 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.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.23.0': - resolution: {integrity: sha512-0qR1atBIWrb7FzQ+Tmr3s8uH5mQdyRH78n0krYaG8tng9+u1JlSi8DGRSaC9ezKyNB84m7vHT207xnHXGeJ3Fg==} + '@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.7': - resolution: {integrity: sha512-GQygZaGlmYjmYM+tiNBA5C6acmiDWF52Nqd40bBp0Znk4M4hP+LTmI0lpI1BuKMw45T8RIhrAsICIfKwZvi2Gg==} + '@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.27.0': - resolution: {integrity: sha512-p681OtApnKOdbeN8ITfnnYqfdHS0z7GE+4l8EXlfLnr70Rp/9xicBO6d2rU+V/B3JujDw2gPWxYKEnEeh0CGCw==} + '@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/utils@3.10.5': - resolution: {integrity: sha512-iMQSGcpaecghDIh3mZEpZfoFH3ExBwTtuBEcvZ2XnGzCgQjeYXcMdIUwAfVQLXFTdHUHGF6Gu6/dFrYsCzySBQ==} + '@react-stately/flags@3.1.2': + resolution: {integrity: sha512-2HjFcZx1MyQXoPqcBGALwWWmgFVUk2TuKVIQxCbRq7fPyWXIl6VHcakCLurdtYC2Iks7zizvz0Idv48MQ38DWg==} + + '@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.27.0': - resolution: {integrity: sha512-gvznmLhi6JPEf0bsq7SwRYTHAKKq/wcmKqFez9sRdbED+SPMUmK5omfZ6w3EwUFQHbYUa4zPBYedQ7Knv70RMw==} + '@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@1.2.0': - resolution: {integrity: sha512-HG2DFjYKbpNmVXsa0keLHp/3leGJz1mjh09f2RLGGLQZzSHpkmZWuwJbAvo3QcRY8p80m5+ZdXZdYOSBLlp7Cg==} + '@redis/bloom@5.5.6': + resolution: {integrity: sha512-bNR3mxkwtfuCxNOzfV8B3R5zA1LiN57EH6zK4jVBIgzMzliNuReZXBFGnXvsi80/SYohajn78YdpYI+XNpqL+A==} + 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.5.6 - '@redis/graph@1.1.1': - resolution: {integrity: sha512-FEMTcTHZozZciLRl6GiiIB4zGm5z5F3F6a6FZCyrfxdKOhFlGkiAqlexWMBzCi4DcRoyiOsuLfW+cjlGWyExOw==} - peerDependencies: - '@redis/client': ^1.0.0 + '@redis/client@5.5.6': + resolution: {integrity: sha512-M3Svdwt6oSfyfQdqEr0L2HOJH2vK7GgCFx1NfAQvpWAT4+ljoT1L5S5cKT3dA9NJrxrOPDkdoTPWJnIrGCOcmw==} + engines: {node: '>= 18'} - '@redis/json@1.0.7': - resolution: {integrity: sha512-6UyXfjVaTBTJtKNG4/9Z8PSpKE6XgSyEb8iwaqDcy+uKrd/DGYHTWkUdnQDyzm727V7p21WUMhsqz5oy65kPcQ==} + '@redis/json@5.5.6': + resolution: {integrity: sha512-AIsoe3SsGQagqAmSQHaqxEinm5oCWr7zxPWL90kKaEdLJ+zw8KBznf2i9oK0WUFP5pFssSQUXqnscQKe2amfDQ==} + engines: {node: '>= 18'} peerDependencies: - '@redis/client': ^1.0.0 + '@redis/client': ^5.5.6 - '@redis/search@1.2.0': - resolution: {integrity: sha512-tYoDBbtqOVigEDMAcTGsRlMycIIjwMCgD8eR2t0NANeQmgK/lvxNAvYyb6bZDD4frHRhIHkJu2TBRvB0ERkOmw==} + '@redis/search@5.5.6': + resolution: {integrity: sha512-JSqasYqO0mVcHL7oxvbySRBBZYRYhFl3W7f0Da7BW8M/r0Z9wCiVrdjnN4/mKBpWZkoJT/iuisLUdPGhpKxBew==} + engines: {node: '>= 18'} peerDependencies: - '@redis/client': ^1.0.0 + '@redis/client': ^5.5.6 - '@redis/time-series@1.1.0': - resolution: {integrity: sha512-c1Q99M5ljsIuc4YdaCwfUEXsofakb9c8+Zse2qxTadu8TalLXuAESzLvFAvNVbkmSlvlzIQOLpBCmWI9wTOt+g==} + '@redis/time-series@5.5.6': + resolution: {integrity: sha512-jkpcgq3NOI3TX7xEAJ3JgesJTxAx7k0m6lNxNsYdEM8KOl+xj7GaB/0CbLkoricZDmFSEAz7ClA1iK9XkGHf+Q==} + engines: {node: '>= 18'} peerDependencies: - '@redis/client': ^1.0.0 + '@redis/client': ^5.5.6 - '@rollup/rollup-android-arm-eabi@4.34.6': - resolution: {integrity: sha512-+GcCXtOQoWuC7hhX1P00LqjjIiS/iOouHXhMdiDSnq/1DGTox4SpUvO52Xm+div6+106r+TcvOeo/cxvyEyTgg==} + '@rollup/rollup-android-arm-eabi@4.44.1': + resolution: {integrity: sha512-JAcBr1+fgqx20m7Fwe1DxPUl/hPkee6jA6Pl7n1v2EFiktAHenTaXl5aIFjUIEsfn9w3HE4gK1lEgNGMzBDs1w==} cpu: [arm] os: [android] - '@rollup/rollup-android-arm64@4.34.6': - resolution: {integrity: sha512-E8+2qCIjciYUnCa1AiVF1BkRgqIGW9KzJeesQqVfyRITGQN+dFuoivO0hnro1DjT74wXLRZ7QF8MIbz+luGaJA==} + '@rollup/rollup-android-arm64@4.44.1': + resolution: {integrity: sha512-RurZetXqTu4p+G0ChbnkwBuAtwAbIwJkycw1n6GvlGlBuS4u5qlr5opix8cBAYFJgaY05TWtM+LaoFggUmbZEQ==} cpu: [arm64] os: [android] - '@rollup/rollup-darwin-arm64@4.34.6': - resolution: {integrity: sha512-z9Ib+OzqN3DZEjX7PDQMHEhtF+t6Mi2z/ueChQPLS/qUMKY7Ybn5A2ggFoKRNRh1q1T03YTQfBTQCJZiepESAg==} + '@rollup/rollup-darwin-arm64@4.44.1': + resolution: {integrity: sha512-fM/xPesi7g2M7chk37LOnmnSTHLG/v2ggWqKj3CCA1rMA4mm5KVBT1fNoswbo1JhPuNNZrVwpTvlCVggv8A2zg==} cpu: [arm64] os: [darwin] - '@rollup/rollup-darwin-x64@4.34.6': - resolution: {integrity: sha512-PShKVY4u0FDAR7jskyFIYVyHEPCPnIQY8s5OcXkdU8mz3Y7eXDJPdyM/ZWjkYdR2m0izD9HHWA8sGcXn+Qrsyg==} + '@rollup/rollup-darwin-x64@4.44.1': + resolution: {integrity: sha512-gDnWk57urJrkrHQ2WVx9TSVTH7lSlU7E3AFqiko+bgjlh78aJ88/3nycMax52VIVjIm3ObXnDL2H00e/xzoipw==} cpu: [x64] os: [darwin] - '@rollup/rollup-freebsd-arm64@4.34.6': - resolution: {integrity: sha512-YSwyOqlDAdKqs0iKuqvRHLN4SrD2TiswfoLfvYXseKbL47ht1grQpq46MSiQAx6rQEN8o8URtpXARCpqabqxGQ==} + '@rollup/rollup-freebsd-arm64@4.44.1': + resolution: {integrity: sha512-wnFQmJ/zPThM5zEGcnDcCJeYJgtSLjh1d//WuHzhf6zT3Md1BvvhJnWoy+HECKu2bMxaIcfWiu3bJgx6z4g2XA==} cpu: [arm64] os: [freebsd] - '@rollup/rollup-freebsd-x64@4.34.6': - resolution: {integrity: sha512-HEP4CgPAY1RxXwwL5sPFv6BBM3tVeLnshF03HMhJYCNc6kvSqBgTMmsEjb72RkZBAWIqiPUyF1JpEBv5XT9wKQ==} + '@rollup/rollup-freebsd-x64@4.44.1': + resolution: {integrity: sha512-uBmIxoJ4493YATvU2c0upGz87f99e3wop7TJgOA/bXMFd2SvKCI7xkxY/5k50bv7J6dw1SXT4MQBQSLn8Bb/Uw==} 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.44.1': + resolution: {integrity: sha512-n0edDmSHlXFhrlmTK7XBuwKlG5MbS7yleS1cQ9nn4kIeW+dJH+ExqNgQ0RrFRew8Y+0V/x6C5IjsHrJmiHtkxQ==} 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.44.1': + resolution: {integrity: sha512-8WVUPy3FtAsKSpyk21kV52HCxB+me6YkbkFHATzC2Yd3yuqHwy2lbFL4alJOLXKljoRw08Zk8/xEj89cLQ/4Nw==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm64-gnu@4.34.6': - resolution: {integrity: sha512-9RyprECbRa9zEjXLtvvshhw4CMrRa3K+0wcp3KME0zmBe1ILmvcVHnypZ/aIDXpRyfhSYSuN4EPdCCj5Du8FIA==} + '@rollup/rollup-linux-arm64-gnu@4.44.1': + resolution: {integrity: sha512-yuktAOaeOgorWDeFJggjuCkMGeITfqvPgkIXhDqsfKX8J3jGyxdDZgBV/2kj/2DyPaLiX6bPdjJDTu9RB8lUPQ==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-arm64-musl@4.34.6': - resolution: {integrity: sha512-qTmklhCTyaJSB05S+iSovfo++EwnIEZxHkzv5dep4qoszUMX5Ca4WM4zAVUMbfdviLgCSQOu5oU8YoGk1s6M9Q==} + '@rollup/rollup-linux-arm64-musl@4.44.1': + resolution: {integrity: sha512-W+GBM4ifET1Plw8pdVaecwUgxmiH23CfAUj32u8knq0JPFyK4weRy6H7ooxYFD19YxBulL0Ktsflg5XS7+7u9g==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-loongarch64-gnu@4.34.6': - resolution: {integrity: sha512-4Qmkaps9yqmpjY5pvpkfOerYgKNUGzQpFxV6rnS7c/JfYbDSU0y6WpbbredB5cCpLFGJEqYX40WUmxMkwhWCjw==} + '@rollup/rollup-linux-loongarch64-gnu@4.44.1': + resolution: {integrity: sha512-1zqnUEMWp9WrGVuVak6jWTl4fEtrVKfZY7CvcBmUUpxAJ7WcSowPSAWIKa/0o5mBL/Ij50SIf9tuirGx63Ovew==} 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.44.1': + resolution: {integrity: sha512-Rl3JKaRu0LHIx7ExBAAnf0JcOQetQffaw34T8vLlg9b1IhzcBgaIdnvEbbsZq9uZp3uAH+JkHd20Nwn0h9zPjA==} 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.44.1': + resolution: {integrity: sha512-j5akelU3snyL6K3N/iX7otLBIl347fGwmd95U5gS/7z6T4ftK288jKq3A5lcFKcx7wwzb5rgNvAg3ZbV4BqUSw==} + cpu: [riscv64] + os: [linux] + + '@rollup/rollup-linux-riscv64-musl@4.44.1': + resolution: {integrity: sha512-ppn5llVGgrZw7yxbIm8TTvtj1EoPgYUAbfw0uDjIOzzoqlZlZrLJ/KuiE7uf5EpTpCTrNt1EdtzF0naMm0wGYg==} 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.44.1': + resolution: {integrity: sha512-Hu6hEdix0oxtUma99jSP7xbvjkUM/ycke/AQQ4EC5g7jNRLLIwjcNwaUy95ZKBJJwg1ZowsclNnjYqzN4zwkAw==} cpu: [s390x] os: [linux] - '@rollup/rollup-linux-x64-gnu@4.34.6': - resolution: {integrity: sha512-Sht4aFvmA4ToHd2vFzwMFaQCiYm2lDFho5rPcvPBT5pCdC+GwHG6CMch4GQfmWTQ1SwRKS0dhDYb54khSrjDWw==} + '@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.34.6': - resolution: {integrity: sha512-zmmpOQh8vXc2QITsnCiODCDGXFC8LMi64+/oPpPx5qz3pqv0s6x46ps4xoycfUiVZps5PFn1gksZzo4RGTKT+A==} + '@rollup/rollup-linux-x64-musl@4.44.1': + resolution: {integrity: sha512-iAS4p+J1az6Usn0f8xhgL4PaU878KEtutP4hqw52I4IO6AGoyOkHCxcc4bqufv1tQLdDWFx8lR9YlwxKuv3/3g==} 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.44.1': + resolution: {integrity: sha512-NtSJVKcXwcqozOl+FwI41OH3OApDyLk3kqTJgx8+gp6On9ZEt5mYhIsKNPGuaZr3p9T6NWPKGU/03Vw4CNU9qg==} 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.44.1': + resolution: {integrity: sha512-JYA3qvCOLXSsnTR3oiyGws1Dm0YTuxAAeaYGVlGpUsHqloPcFjPg+X0Fj2qODGLNwQOAcCiQmHub/V007kiH5A==} 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.44.1': + resolution: {integrity: sha512-J8o22LuF0kTe7m+8PvW9wk3/bRq5+mRo5Dqo6+vXb7otCm3TPhYOJqOaQtGU9YMWQSL3krMnoOxMr0+9E6F3Ug==} cpu: [x64] os: [win32] - '@shikijs/core@2.3.2': - resolution: {integrity: sha512-s7vyL3LzUKm3Qwf36zRWlavX9BQMZTIq9B1almM63M5xBuSldnsTHCmsXzoF/Kyw4k7Xgas7yAyJz9VR/vcP1A==} - - '@shikijs/engine-javascript@2.3.2': - resolution: {integrity: sha512-w3IEMu5HfL/OaJTsMbIfZ1HRPnWVYRANeDtmsdIIEgUOcLjzFJFQwlnkckGjKHekEzNqlMLbgB/twnfZ/EEAGg==} + '@shikijs/core@2.5.0': + resolution: {integrity: sha512-uu/8RExTKtavlpH7XqnVYBrfBkUc20ngXiX9NSrBhOVZYv/7XQRKUyhtkeflY5QsxC0GbJThCerruZfsUaSldg==} - '@shikijs/engine-oniguruma@2.3.2': - resolution: {integrity: sha512-vikMY1TroyZXUHIXbMnvY/mjtOxMn+tavcfAeQPgWS9FHcgFSUoEtywF5B5sOLb9NXb8P2vb7odkh3nj15/00A==} + '@shikijs/engine-javascript@2.5.0': + resolution: {integrity: sha512-VjnOpnQf8WuCEZtNUdjjwGUbtAVKuZkVQ/5cHy/tojVVRIRtlWMYVjyWhxOmIq05AlSOv72z7hRNRGVBgQOl0w==} - '@shikijs/langs@2.3.2': - resolution: {integrity: sha512-UqI6bSxFzhexIJficZLKeB1L2Sc3xoNiAV0yHpfbg5meck93du+EKQtsGbBv66Ki53XZPhnR/kYkOr85elIuFw==} + '@shikijs/engine-oniguruma@2.5.0': + resolution: {integrity: sha512-pGd1wRATzbo/uatrCIILlAdFVKdxImWJGQ5rFiB5VZi2ve5xj3Ax9jny8QvkaV93btQEwR/rSz5ERFpC5mKNIw==} - '@shikijs/themes@2.3.2': - resolution: {integrity: sha512-QAh7D/hhfYKHibkG2tti8vxNt3ekAH5EqkXJeJbTh7FGvTCWEI7BHqNCtMdjFvZ0vav5nvUgdvA7/HI7pfsB4w==} + '@shikijs/langs@2.5.0': + resolution: {integrity: sha512-Qfrrt5OsNH5R+5tJ/3uYBBZv3SuGmnRPejV9IlIbFH3HTGLDlkqgHymAlzklVmKBjAaVmkPkyikAV/sQ1wSL+w==} - '@shikijs/twoslash@2.3.2': - resolution: {integrity: sha512-eYLSPNKH7qWpoStesZlDix+Mdppb/VUBc7LFZyOwTvTzZ6H+DS3OMUDH0wndc6ZWYUR27cyDMtFZoBjyzxRL0A==} + '@shikijs/themes@2.5.0': + resolution: {integrity: sha512-wGrk+R8tJnO0VMzmUExHR+QdSaPUl/NKs+a4cQQRWyoc3YFbUzuLEi/KWK1hj+8BfHRKm2jNhhJck1dfstJpiw==} - '@shikijs/types@2.3.2': - resolution: {integrity: sha512-CBaMY+a3pepyC4SETi7+bSzO0f6hxEQJUUuS4uD7zppzjmrN4ZRtBqxaT+wOan26CR9eeJ5iBhc4qvWEwn7Eeg==} + '@shikijs/twoslash@2.5.0': + resolution: {integrity: sha512-OdyoZRbzTB80qHFHdaXT070OG9hiljxbsJMZmrMAPWXG2e4FV8wbC63VBM5BJXa1DH645nw20VX1MzASkO5V9g==} - '@shikijs/vscode-textmate@10.0.1': - resolution: {integrity: sha512-fTIQwLF+Qhuws31iw7Ncl1R3HUDtGwIipiJ9iU+UsDUwMhegFcQKQHd51nZjb7CArq0MvON8rbgCGQYWHUKAdg==} + '@shikijs/types@2.5.0': + resolution: {integrity: sha512-ygl5yhxki9ZLNuNpPitBWvcy9fsSKKaRuO4BAlMyagszQidxcpLAr0qiW/q43DtSIDxO6hEbtYLiFZNXO/hdGw==} - '@swc/counter@0.1.3': - resolution: {integrity: sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==} + '@shikijs/vscode-textmate@10.0.2': + resolution: {integrity: sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==} '@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==} + '@swc/helpers@0.5.17': + resolution: {integrity: sha512-5IKx/Y13RsYd+sauPb2x+U/xZikHjolzfuDgTAl/Tdf3Q8rslRvC19NKDLgAJQ6wsqADk10ntlv08nPFw/gO/A==} - '@tanstack/react-virtual@3.13.0': - resolution: {integrity: sha512-CchF0NlLIowiM2GxtsoKBkXA4uqSnY2KvnXo+kyUFD4a4ll6+J0qzoRsUPMwXV/H26lRsxgJIr/YmjYum2oEjg==} + '@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.0': - resolution: {integrity: sha512-NBKJP3OIdmZY3COJdWkSonr50FMVIi+aj5ZJ7hI/DTpEKg2RMfo/KvP8A3B/zOSpMgIe52B5E2yn7rryULzA6g==} + '@tanstack/virtual-core@3.13.12': + resolution: {integrity: sha512-1YBOJfRHV4sXUmWsFSf5rQor4Ss82G8dQWLRbnk3GA4jeP8hQt1hxXh0tmflpC0dz3VgEv/1+qwPyLeWkQuPFA==} '@theguild/remark-mermaid@0.2.0': resolution: {integrity: sha512-o8n57TJy0OI4PCrNw8z6S+vpHtrwoQZzTA5Y3fL0U1NDRIoMg/78duWgEBFsCZcWM1G6zjE91yg1aKCsDwgE2Q==} @@ -1467,8 +1216,14 @@ packages: '@tootallnate/quickjs-emscripten@0.23.0': resolution: {integrity: sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==} - '@types/acorn@4.0.6': - resolution: {integrity: sha512-veQTnWP+1D/xbxVrPC3zHnCZRjSrKfhbMUlEA43iMZLu7EsnTtkJklIuwrCPbOi8YkvDQAiW05VQQFvvz9oieQ==} + '@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==} '@types/d3-array@3.2.1': resolution: {integrity: sha512-Y2Jn2idRrLzUfAKV2LyRImR+y4oa2AntrgID95SHJxuMUrkNXmanDSed71sRNZysveJVt1hLLemQZIady0FpEg==} @@ -1566,11 +1321,14 @@ packages: '@types/debug@4.1.12': resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==} + '@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.6': - resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==} + '@types/estree@1.0.8': + resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} '@types/geojson@7946.0.16': resolution: {integrity: sha512-6C8nqWur3j98U6+lXDfTUWIfgvZU+EumvpHKcYjujKH7woYyLj2sUmff0tRhrqM7BohUw7Pz3ZB1jj2gW9Fvmg==} @@ -1578,6 +1336,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==} @@ -1599,25 +1360,22 @@ 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.16.0': + resolution: {integrity: sha512-B2egV9wALML1JCpv3VQoQ+yesQKAmNMBIAY7OteVrikcOcAkWm+dGL6qpeCktPjAv6N1JLnhbNiqS35UpFyBsQ==} - '@types/prop-types@15.7.14': - resolution: {integrity: sha512-gNMvNH49DJ7OJYv+KAKn0Xp45p8PLl6zo2YnvDIbTd4J6MER2BmWN49TG7n9LvkyihINxeKW8+3bfS2yDC9dzQ==} + '@types/node@24.0.10': + resolution: {integrity: sha512-ENHwaH+JIRTDIEEbDK6QSQntAYGtbvdDXnMXnZaZ6k13Du1dPMmprkEHIL7ok2Wl2aZevetwTAb5S+7yIF+enA==} - '@types/react-dom@18.3.1': - resolution: {integrity: sha512-qW1Mfv8taImTthu4KoXgDfLuk4bydU6Q/TkADnDWWHwi4NX4BR+LWfTp2sVmTqRrsHvyDDTelgelxJ+SsejKKQ==} - - '@types/react-dom@19.0.3': - resolution: {integrity: sha512-0Knk+HJiMP/qOZgMyNFamlIjw9OFCsyC2ZbigmEEyXXixgre6IQpm/4V+r3qH4GC1JPvRJKInw+on2rV6YZLeA==} + '@types/react-dom@19.1.6': + resolution: {integrity: sha512-4hOiT/dwO8Ko0gV1m/TJZYk3y0KBnY9vzDh7W+DH17b2HFSOGgdj33dhihPeuy3l0q23+4e+hoXHV6hCC4dCXw==} peerDependencies: '@types/react': ^19.0.0 - '@types/react@18.3.12': - resolution: {integrity: sha512-D2wOSq/d6Agt28q7rSI3jhU7G6aiuzljDGZ2hTZHIkrTLUI+AF3WMeKkEZ9nN2fkBAlcktT6vcZjDFiIhMYEQw==} + '@types/react@19.1.8': + resolution: {integrity: sha512-AwAfQ2Wa5bCx9WP8nZL2uMZWod7J7/JSplxbTmBQ5ms6QpqNYm672H0Vu9ZVKVngQ+ii4R/byguVEUZQyeg44g==} - '@types/react@19.0.8': - resolution: {integrity: sha512-9P/o1IGdfmQxrujGbIMDyYaaCykhLKc0NGCtYcECNUr9UAaDe4gwvV9bR6tvd5Br1SG0j+PBpbKr2UYY8CwqSw==} + '@types/supports-color@8.1.3': + resolution: {integrity: sha512-Hy6UMpxhE3j1tLpl27exp1XqHD7n8chAiNPzWfz16LPZoMMoSc4dzLl6w9qijkEb/r5O1ozdu1CWGA2L83ZeZg==} '@types/trusted-types@2.0.7': resolution: {integrity: sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==} @@ -1628,51 +1386,63 @@ 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.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.8.0' + typescript: '>=4.8.4 <5.9.0' - '@typescript-eslint/parser@8.23.0': - resolution: {integrity: sha512-h2lUByouOXFAlMec2mILeELUbME5SZRN/7R9Cw2RD2lRQQY08MWMM+PmVVKKJNK1aIwqTo9t/0CvOxwPbRIE2Q==} + '@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.8.0' + typescript: '>=4.8.4 <5.9.0' + + '@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/scope-manager@8.23.0': - resolution: {integrity: sha512-OGqo7+dXHqI7Hfm+WqkZjKjsiRtFUQHPdGMXzk5mYXhJUedO7e/Y7i8AK3MyLMgZR93TX4bIzYrfyVjLC+0VSw==} + '@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.23.0': - resolution: {integrity: sha512-iIuLdYpQWZKbiH+RkCGc6iu+VwscP5rCtQ1lyQ7TYuKLrcZoeJVpcLiG8DliXVkUxirW/PWlmS+d6yD51L9jvA==} + '@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.8.0' + typescript: '>=4.8.4 <5.9.0' - '@typescript-eslint/types@8.23.0': - resolution: {integrity: sha512-1sK4ILJbCmZOTt9k4vkoulT6/y5CHJ1qUYxqpF1K/DBAd8+ZUL4LlSCxOssuH5m4rUaaN0uS0HlVPvd45zjduQ==} + '@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.23.0': - resolution: {integrity: sha512-LcqzfipsB8RTvH8FX24W4UUFk1bl+0yTOf9ZA08XngFwMg4Kj8A+9hwz8Cr/ZS4KwHrmo9PJiLZkOt49vPnuvQ==} + '@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.8.0' + typescript: '>=4.8.4 <5.9.0' - '@typescript-eslint/utils@8.23.0': - resolution: {integrity: sha512-uB/+PSo6Exu02b5ZEiVtmY6RVYO7YU5xqgzTIVZwTHvvK3HsL8tZZHFaTLFtRG3CsV4A5mhOv+NZx5BlhXPyIA==} + '@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.8.0' + typescript: '>=4.8.4 <5.9.0' - '@typescript-eslint/visitor-keys@8.23.0': - resolution: {integrity: sha512-oWWhcWDLwDfu++BGTZcmXWqpwtkwb5o7fxUIGksMQQDSdPW9prsSnfIOZMlsj4vBOSrcnjIUZMiIjODgGosFhQ==} + '@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': @@ -1683,9 +1453,153 @@ packages: '@ungap/structured-clone@1.3.0': resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} + '@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.10.1': + resolution: {integrity: sha512-qYKGGm5wk71ONcXTMZ0+J11qQeOAPz3nw6VtqrBUUELRyXFyvK8cHhHsLBFR4GHnilc2pgY1HTB2TvdW9wO26Q==} + cpu: [x64] + os: [darwin] + + '@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.10.1': + resolution: {integrity: sha512-6ds7+zzHJgTDmpe0gmFcOTvSUhG5oZukkt+cCsSb3k4Uiz2yEQB4iCRITX2hBwSW+p8gAieAfecITjgqCkswXw==} + cpu: [arm] + os: [linux] + + '@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.10.1': + resolution: {integrity: sha512-Cg6xzdkrpltcTPO4At+A79zkC7gPDQIgosJmVV8M104ImB6KZi1MrNXgDYIAfkhUYjPzjNooEDFRAwwPadS7ZA==} + cpu: [arm64] + os: [linux] + + '@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.10.1': + resolution: {integrity: sha512-ylz5ojeXrkPrtnzVhpCO+YegG63/aKhkoTlY8PfMfBfLaUG8v6m6iqrL7sBUKdVBgOB4kSTUPt9efQdA/Y3Z/w==} + cpu: [ppc64] + os: [linux] + + '@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.10.1': + resolution: {integrity: sha512-mW9JZAdOCyorgi1eLJr4gX7xS67WNG9XNPYj5P8VuttK72XNsmdw9yhOO4tDANMgiLXFiSFaiL1gEpoNtRPw/A==} + cpu: [riscv64] + os: [linux] + + '@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.10.1': + resolution: {integrity: sha512-VsjgckJ0gNMw7p0d8In6uPYr+s0p16yrT2rvG4v2jUpEMYkpnfnCiALa9SWshbvlGjKQ98Q2x19agm3iFk8w8Q==} + cpu: [x64] + os: [linux] + + '@unrs/resolver-binding-linux-x64-musl@1.10.1': + resolution: {integrity: sha512-idMnajMeejnaFi0Mx9UTLSYFDAOTfAEP7VjXNgxKApso3Eu2Njs0p2V95nNIyFi4oQVGFmIuCkoznAXtF/Zbmw==} + cpu: [x64] + os: [linux] + + '@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.10.1': + resolution: {integrity: sha512-TY79+N+Gkoo7E99K+zmsKNeiuNJYlclZJtKqsHSls8We2iGhgxtletVsiBYie93MSTDRDMI8pkBZJlIJSZPrdA==} + cpu: [arm64] + os: [win32] + + '@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.10.1': + resolution: {integrity: sha512-2v3erKKmmCyIVvvhI2nF15qEbdBpISTq44m9pyd5gfIJB1PN94oePTLWEd82XUbIbvKhv76xTSeUQSCOGesLeg==} + cpu: [x64] + os: [win32] + + '@vitest/eslint-plugin@1.3.4': + resolution: {integrity: sha512-EOg8d0jn3BAiKnR55WkFxmxfWA3nmzrbIIuOXyTe6A72duryNgyU+bdBEauA97Aab3ho9kLmAwgPX63Ckj4QEg==} + peerDependencies: + eslint: '>= 8.57.0' + typescript: '>= 5.0.0' + vitest: '*' + peerDependenciesMeta: + typescript: + optional: true + vitest: + optional: true + + '@vitest/expect@3.2.4': + resolution: {integrity: sha512-Io0yyORnB6sikFlt8QW5K7slY4OjqNX9jmJQ02QDda8lyM6B5oNgVWoSoKPac8/kgnCUzuHQKrSLtu/uOqqrig==} + + '@vitest/mocker@3.2.4': + resolution: {integrity: sha512-46ryTE9RZO/rfDd7pEqFl7etuyzekzEhUbTW3BvmeO/BcCMEgq59BKhek3dXDWgAj4oMK6OZi+vRr1wPW6qjEQ==} + peerDependencies: + msw: ^2.4.9 + vite: ^5.0.0 || ^6.0.0 || ^7.0.0-0 + peerDependenciesMeta: + msw: + optional: true + vite: + optional: true + + '@vitest/pretty-format@3.2.4': + resolution: {integrity: sha512-IVNZik8IVRJRTr9fxlitMKeJeXFFFN0JaB9PHPGQ8NKQbGpfjlTx9zO4RefN8gp7eqjNy8nyK3NZmBzOPeIxtA==} + + '@vitest/runner@3.2.4': + resolution: {integrity: sha512-oukfKT9Mk41LreEW09vt45f8wx7DordoWUZMYdY/cyAk7w5TWkTRCNZYF7sX7n2wB7jyGAl74OxgwhPgKaqDMQ==} + + '@vitest/snapshot@3.2.4': + resolution: {integrity: sha512-dEYtS7qQP2CjU27QBC5oUOxLE/v5eLkGqPE0ZKEIDGMs4vKWe7IjgLOeauHsR0D5YuuycGRO5oSRXnwnmA78fQ==} + + '@vitest/spy@3.2.4': + resolution: {integrity: sha512-vAfasCOe6AIK70iP5UD11Ac4siNUNJ9i/9PZ3NKx07sG6sUxeag1LWdNrMWeKKYBLlzuK+Gn65Yd5nyL6ds+nw==} + + '@vitest/utils@3.2.4': + resolution: {integrity: sha512-fB2V0JFrQSMsCo9HiSq3Ezpdv4iYaXRG1Sx8edX3MwxfyNn83mKiGzOcH+Fkxt4MHxr3y42fQi1oeAInqgX2QA==} + + '@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==} + 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==} @@ -1698,8 +1612,8 @@ packages: peerDependencies: acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 - acorn@8.14.0: - resolution: {integrity: sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==} + acorn@8.15.0: + resolution: {integrity: sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==} engines: {node: '>=0.4.0'} hasBin: true @@ -1753,8 +1667,9 @@ packages: resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} engines: {node: '>=12'} - any-promise@1.3.0: - resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} + 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==} @@ -1763,6 +1678,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==} @@ -1776,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: @@ -1807,6 +1726,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'} @@ -1839,8 +1762,8 @@ packages: avvio@9.1.0: resolution: {integrity: sha512-fYASnYi600CsH/j9EQov7lECAniYiBFiiAtBNuZYLA2leLe9qOvZzqYHFjtIj6gD2VMoMLP14834LFWvr4IfDw==} - axios@1.7.9: - resolution: {integrity: sha512-LhLcE7Hbiryz8oMDdDptSrWowmB4Bl6RCt6sIJKpRB4XtVf0iEgewX3au/pJqm+Py1kCASkb/FFKjxQaLtxJvw==} + axios@1.10.0: + resolution: {integrity: sha512-/1xYAC4MP/HEG+3duIhFr4ZQXR4sQXOIe+o6sdqzeykGLx6Upp/1p8MHqhINOvGeP7xyNHe7tsiJByc4SSVUxw==} bail@2.0.2: resolution: {integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==} @@ -1856,8 +1779,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' @@ -1877,11 +1800,11 @@ packages: 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==} @@ -1890,16 +1813,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'} - bytes@3.0.0: resolution: {integrity: sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==} engines: {node: '>= 0.8'} @@ -1908,16 +1821,16 @@ 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: 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: @@ -1928,12 +1841,16 @@ 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.30001726: + resolution: {integrity: sha512-VQAUIUzBiZ/UnlM28fSp2CRF3ivUn1BWEvxMcVTNwpw91Py1pGbPIyIKtd+tzct9C3ouceCVdGAXxZOpZAsgdw==} 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'} @@ -1972,6 +1889,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: @@ -1984,14 +1905,14 @@ 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'} + 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'} @@ -2046,13 +1967,13 @@ 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==} - 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'} @@ -2061,9 +1982,9 @@ 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'} compressible@2.0.18: resolution: {integrity: sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==} @@ -2079,12 +2000,15 @@ 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==} - consola@3.4.0: - resolution: {integrity: sha512-EiPU8G6dQG0GFHNR8ljnZFki/8a+cQwEQ+7wpxdChl02Q8HXlwEZWD5lqAF8vC2sEC3Tehr8hy7vErz88LHyUA==} - engines: {node: ^14.18.0 || >=16.10.0} + confbox@0.2.2: + resolution: {integrity: sha512-1NB+BKqhtNipMsov4xI/NnhCKp9XG9NamYp5PVm9klAT0fsrNPjaFICsCFhNhwZJKNh7zB/3q8qXz0E9oaMNtQ==} content-disposition@0.5.2: resolution: {integrity: sha512-kRGRZw3bLlFISDBgwTSA1TMBFN6J6GWDeubmDE3AF+3+yXL8hTWv8r5rkLbqYXY4RjPk/EzHnClI3zQf1cFmHA==} @@ -2094,6 +2018,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==} @@ -2123,8 +2051,8 @@ packages: peerDependencies: cytoscape: ^3.2.0 - cytoscape@3.31.0: - resolution: {integrity: sha512-zDGn1K/tfZwEnoGOcHc0H4XazqAAXAuDpcYw9mUnUjATjqljyCNGJv8uEvbvxGaGHaVshxMecyl6oc6uKzRfbw==} + cytoscape@3.32.0: + resolution: {integrity: sha512-5JHBC9n75kz5851jeklCPmZWcg3hUe6sjqJvyk3+hVqFaKcHwHgxsjeN1yLmggoUc6STbtm9/NQyabQehfjvWQ==} engines: {node: '>=0.10'} d3-array@2.12.1: @@ -2319,8 +2247,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: '*' @@ -2328,8 +2256,12 @@ packages: supports-color: optional: true - decode-named-character-reference@1.0.2: - resolution: {integrity: sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==} + 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==} + engines: {node: '>=6'} deep-extend@0.6.0: resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} @@ -2369,8 +2301,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: @@ -2380,6 +2312,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'} @@ -2388,13 +2324,25 @@ packages: resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} engines: {node: '>=0.10.0'} - dompurify@3.2.4: - resolution: {integrity: sha512-ysFSFEDVduQpyhzAob/kkuJjf5zWkZD8/A9ywSp1byueyuCfHamrCBa14/Oc2iiB0e51B+NpxSl5gmzn+Ms/mg==} + dompurify@3.2.6: + resolution: {integrity: sha512-/2GogDQlohXPZe6D6NOgQvXLPSYBqIWMnZ8zzOhn09REE4eyAzb+Hed3jhoM9OkuaJ8P6ZGTTVWQKAi8ieIzfQ==} + + 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.6.1: + resolution: {integrity: sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==} + engines: {node: '>=12'} + dunder-proto@1.0.1: resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} engines: {node: '>= 0.4'} @@ -2405,14 +2353,17 @@ 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==} emoji-regex@9.2.2: resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} - 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==} @@ -2422,12 +2373,18 @@ 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.1: + resolution: {integrity: sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==} engines: {node: '>=0.12'} - es-abstract@1.23.9: - resolution: {integrity: sha512-py07lI0wjxAC/DcfK1S6G7iANonniZwTISvdPzk9hzeH0IZIshbuuFxLIU96OyF89Yb9hiqWn8M/bY83KY5vzA==} + 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.24.0: + resolution: {integrity: sha512-WSzPgsdLtTcQwm4CROfS5ju2Wa1QQcVeT37jFjYzdFz1r9ahadC8B8/a4qxJxM+09F18iumCdRmlr96ZYkQvEg==} engines: {node: '>= 0.4'} es-define-property@1.0.1: @@ -2442,6 +2399,9 @@ packages: resolution: {integrity: sha512-uDn+FE1yrDzyC0pCo961B2IHbdM8y/ACZsKD4dG6WqrjV53BADjwa7D+1aom2rsNVfLyDgU/eigvlJGJ08OQ4w==} engines: {node: '>= 0.4'} + 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==} engines: {node: '>= 0.4'} @@ -2450,8 +2410,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 +2424,8 @@ packages: esast-util-from-js@2.0.1: resolution: {integrity: sha512-8Ja+rNJ0Lt56Pcf3TAmpBZjmx8ZcK5Ts4cAzIOjsjevg9oSXJnl6SUQ2EevU8tv3h6ZLWmoKL5H4fgWvdvfETw==} - esbuild@0.23.1: - resolution: {integrity: sha512-VVNz/9Sa0bs5SELtn3f7qhJCDPCF5oMEl5cO9/SSinpE9hbPVvxbd572HH5AKiP7WD8INO53GgfDDhRjkylHEg==} - engines: {node: '>=18'} - hasBin: true - - esbuild@0.24.2: - resolution: {integrity: sha512-+9egpBW8I3CD5XPe0n6BfT5fxLzxrlDzqydF3aviG+9ni1lDC/OvMHcxqEFV0+LANZG5R1bFMWfUrjVsdwxJvA==} + esbuild@0.25.5: + resolution: {integrity: sha512-P8OtKZRv/5J5hhz0cUAdu/cLuPIKXpQl1R9pZtvmHWQvrAUVd0UNIPT4IB4W3rNOqVO0rlqHmCIbSwxh/c9yUQ==} engines: {node: '>=18'} hasBin: true @@ -2486,44 +2442,111 @@ packages: engines: {node: '>=6.0'} hasBin: true - eslint-config-prettier@10.0.1: - resolution: {integrity: sha512-lZBts941cyJyeaooiKxAtzoPHTN+GbQTJFAIdQbRhA4/8whaAraEh47Whw/ZFfrjNSnlAxqfm9i0XVAEkULjCw==} + eslint-config-prettier@10.1.5: + resolution: {integrity: sha512-zc1UmCpNltmVY34vuLRV61r1K27sWuX39E+uyUnY8xS2Bex88VV9cugG+UZbRSRGtGyFboj+D8JODyme1plMpw==} hasBin: true peerDependencies: eslint: '>=7.0.0' - eslint-plugin-react-hooks@5.1.0: - resolution: {integrity: sha512-mpJRtPgHN2tNAvZ35AMfqeB3Xqeo273QxrHJsbBEPWODRM4r0yB6jfoROqKEYrOn27UtRPpcpHc2UqyBSuUNTw==} + 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.4.4: + resolution: {integrity: sha512-1iM2zeBvrYmUNTj2vSC/90JTHDth+dfOfiNKkxApWRsTJYNrc8rOdxxIf5vazX+BiAXTeOT0UvWpGI/7qIWQOw==} + engines: {node: ^16.17.0 || >=18.6.0} + peerDependencies: + eslint: '*' + eslint-plugin-import: '*' + eslint-plugin-import-x: '*' + peerDependenciesMeta: + eslint-plugin-import: + optional: true + eslint-plugin-import-x: + optional: true + + eslint-mdx@3.6.0: + resolution: {integrity: sha512-D1YKiLODSJmNK5+zOGqk5gU4lXEXCImUgT8uChDFgcwZYFYNUT71r+sOyLc0tYhTbuHg+tTOSkgSxJUhVon1Yg==} + 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.3.0: + resolution: {integrity: sha512-D57NBJRZt/8KzROsYgvRJzzItztWsP5B/9TssGhLHrrZzOMIFDn3RLnZN4kD7i5B4FduR040eOEqzKEcfFA9mQ==} + engines: {node: '>=18'} + peerDependencies: + eslint: '>=9.0.0' + + 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@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.6.0: + resolution: {integrity: sha512-q+OYdm/9QemwvxxMGmLFAJPx62l4V/38+Gk1wgRC8unnzF14sFgmCplrfuSQBUv5cndNd97xDuZO+83qM2n30A==} + 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'} 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.0: - resolution: {integrity: sha512-qCgoRi/OTc1VMxab7+sdKiV1xlkY4qjK9sM+kS7+WogrB1DxLguJSQXvk4HA13SD5VmJsq+8FYOw5q4EUk6Ixg==} + eslint-plugin-turbo@2.5.4: + resolution: {integrity: sha512-IZsW61DFj5mLMMaCJxhh1VE4HvNhfdnHnAaXajgne+LUzdyHk2NvYT0ECSa/1SssArcqgTvV74MrLL68hWLLFw==} peerDependencies: eslint: '>6.6.0' turbo: '>2.0.0' - eslint-scope@8.2.0: - resolution: {integrity: sha512-PHlWUfG6lvPc3yvP5A4PNyBL1W8fkDUccmI21JUu/+GKZBoH/W5u6usENXUrWFRsyoW5ACUjFGgAFQp5gUlb/A==} + 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.20.0: - resolution: {integrity: sha512-aL4F8167Hg4IvsW89ejnpTwx+B/UQRzJPGgbIOl+4XqffWsahVVsLEWoZvnrVuwpWmnRd7XeXmQI1zlKcFDteA==} + eslint@9.30.1: + resolution: {integrity: sha512-zmxXPNMOXmwm9E0yQLi5uqXHs7uq2UIiqEKo3Gq+3fwo1XrJ+hijAZImyF7hclW3E6oHz43Yk3RP8at6OTKflQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} hasBin: true peerDependencies: @@ -2536,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: @@ -2575,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==} @@ -2592,9 +2611,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==} @@ -2609,6 +2625,13 @@ packages: resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==} engines: {node: '>=16.17'} + expect-type@1.2.1: + resolution: {integrity: sha512-/kP8CAwxzLVEeFrMm4kMmy4CCDlpipyA7MYLVrdJIkV0fYF0UaigQHRsxHiuY/GEea+bh4KSv3TIlgr+2UL6bw==} + engines: {node: '>=12.0.0'} + + 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==} @@ -2664,11 +2687,11 @@ packages: fast-uri@3.0.6: resolution: {integrity: sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw==} - fastify@5.2.1: - resolution: {integrity: sha512-rslrNBF67eg8/Gyn7P2URV8/6pz8kSAscFL4EThZJ8JBMaXacVdVE4hmUcnPNKERl5o/xTiBSLfdowBRhVF1WA==} + fastify@5.4.0: + resolution: {integrity: sha512-I4dVlUe+WNQAhKSyv15w+dwUh2EPiEl4X2lGYMmNSgF83WzTMAPKGdWEv5tPsCQOb+SOZwz8Vlta2vF+OeDgRw==} - 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==} @@ -2676,8 +2699,8 @@ packages: fclone@1.0.11: resolution: {integrity: sha512-GDqVQezKzRABdeqflsgMr7ktzgF9CyS+p2oe0jJqUY6izSSbhPIQJDpoU4PtGcD7VPM9xh/dVrTu6z1nwgmEGw==} - fdir@6.4.3: - resolution: {integrity: sha512-PMXmW2y1hDDfTSRc9gaXIuCCRpuoz3Kaz8cUelp3smouvfT632ozg2vrT6lJsHKKOF59YLbOGfAWGUcKEfRMQw==} + fdir@6.4.6: + resolution: {integrity: sha512-hiFoqpyZcfNm1yc4u8oWCf9A2c4D3QjCrks3zmoVKVxpQRzmPNar1hUJcBG2RQHvEVGDN+Jm81ZheVLAQMK6+w==} peerDependencies: picomatch: ^3 || ^4 peerDependenciesMeta: @@ -2692,9 +2715,9 @@ 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'} + 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==} @@ -2708,8 +2731,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 +2743,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==} + foreground-child@3.3.1: + resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==} engines: {node: '>=14'} - form-data@4.0.1: - resolution: {integrity: sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==} + form-data@4.0.3: + resolution: {integrity: sha512-qsITQPfmvMOSAdeyZ+12I1c+CKSstAFAwu+97zrnWAbIr5u8wfsExUzCesVLC8NgHuRUqNN4Zy6UPWUTRGslcA==} engines: {node: '>= 6'} format@0.2.2: @@ -2764,22 +2787,14 @@ 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.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: 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'} @@ -2792,15 +2807,15 @@ 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==} 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==} @@ -2832,8 +2847,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.3.0: + resolution: {integrity: sha512-bqWEnJ1Nt3neqx2q5SFfGS8r/ahumIakg3HcwtNlrVlwXIeNumWn/c7Pn/wKzGhf6SaW6H6uWXLqC30STCMchQ==} engines: {node: '>=18'} globalthis@1.0.4: @@ -2893,8 +2912,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 +2924,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.3: + resolution: {integrity: sha512-48+B/rJWAp0jamNbAAf9M7Uf//UVqAoMmgXhBdxTDJLGKY+LRnZ99qcG+Qjl5HfMpYNzS5v4EAwVEF34LeAj7w==} - 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.6: + resolution: {integrity: sha512-zl6s8LwNyo1P9uw+XJGvZtdFF1GdAkOg8ujOw+4Pyb76874fLps4ueHXDhXWdk6YHQ6OgUtinliG7RsYvCbbBg==} hast-util-to-parse5@8.0.0: resolution: {integrity: sha512-3KKrV5ZVI8if87DVSi1vDeByYrkGzg4mEfeu4alwgmmIeARiBLKCZS2uw5Gb6nU9x9Yufyj3iudm6i7nl52PFw==} @@ -2926,12 +2945,16 @@ 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==} + 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==} @@ -2943,8 +2966,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==} @@ -2966,17 +2990,35 @@ 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'} + + ignore@7.0.5: + resolution: {integrity: sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==} + 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==} @@ -3009,6 +3051,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==} @@ -3028,6 +3073,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'} @@ -3057,6 +3105,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'} @@ -3089,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'} @@ -3097,10 +3152,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'} @@ -3157,6 +3208,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'} @@ -3179,6 +3234,10 @@ 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'} @@ -3196,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 @@ -3207,9 +3269,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==} @@ -3232,8 +3302,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: @@ -3242,11 +3312,15 @@ 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==} - 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: @@ -3255,30 +3329,22 @@ 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'} - light-my-request@6.5.1: - resolution: {integrity: sha512-0q82RyxIextuDtkA0UDofhPHIiQ2kmpa7fwElCSlm/8nQl36cDU1Cw+CAO90Es0lReH2HChClKL84I86Nc52hg==} - - 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==} + light-my-request@6.6.0: + resolution: {integrity: sha512-CHYbu8RtboSIoVsHZ6Ye4cj4Aw/yg2oAFimlF7mNvfDV192LR7nDiKtSIfCuLT7KokPSTn/9kfVLm5OGN0A28A==} - load-tsconfig@0.2.5: - resolution: {integrity: sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==} + lines-and-columns@2.0.4: + resolution: {integrity: sha512-wM1+Z03eypVAVUCE7QdSqpVIvelbOakn1M0bPDoA4SGWPx3sNDVUiMo3L6To6WWGClB7VyXnhQ4Sn7gxiJbE6A==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - local-pkg@1.0.0: - resolution: {integrity: sha512-bbgPw/wmroJsil/GgL4qjDzs5YLTBMQ99weRsok1XCDccQeehbHA/I1oRvk2NPtr7KGZgT/Y5tPRnAtMqeG2Kg==} + load-plugin@6.0.3: + resolution: {integrity: sha512-kc0X2FEUZr145odl68frm+lMJuQ23+rTXYmR6TImqPtbpmXC4vVXbWKDQ9IzndA0HfyQamWfKLhzsqGSTxE63w==} + + local-pkg@1.1.1: + resolution: {integrity: sha512-WunYko2W1NcdfAFpuLUoucsgULmgDBRkdxHxWQ7mK0cQqwPiy8E1enjuRBrhLtZkB5iScJ1XIPdhVEFK8aOLSg==} engines: {node: '>=14'} locate-path@5.0.0: @@ -3295,9 +3361,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,9 +3374,16 @@ packages: resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} hasBin: true + loupe@3.1.4: + resolution: {integrity: sha512-wJzkKwJrheKtknCOKNEtDK4iqg/MxmZheEMtSTYvnzRdEYaZzmgH976nenp8WdJRdx5Vc1X/9MO0Oszl6ezeXg==} + lru-cache@10.4.3: resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} + lru-cache@11.1.0: + resolution: {integrity: sha512-QIXZUBJUx+2zHUdQujWejBkcD9+cs94tLn0+YL8UrCh+D5sCXZ4c7LaEH48pNwRY3MLDgqUFyhlCyjJPf1WP0A==} + engines: {node: 20 || >=22} + lru-cache@6.0.0: resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} engines: {node: '>=10'} @@ -3322,6 +3392,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'} @@ -3329,8 +3402,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.12: + resolution: {integrity: sha512-8dD6FusOQSrpv9Z1rdNMdlSgQOIP880DHqnohobOmYLElGEqAL/JvxvuxZO16r4HtjTlfPRDC1hbvxC9dPN2nA==} engines: {node: '>= 18'} hasBin: true @@ -3353,8 +3426,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 +3438,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==} @@ -3402,14 +3475,14 @@ packages: resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} engines: {node: '>= 8'} - mermaid@11.4.1: - resolution: {integrity: sha512-Mb01JT/x6CKDWaxigwfZYuYmDZ6xtrNwNlidKZwkSrDaY9n90tdrJTV5Umk+wP1fZscGptmKFXHsXMDEVZ+Q6A==} + mermaid@11.8.0: + resolution: {integrity: sha512-uAZUwnBiqREZcUrFw3G5iQ5Pj3hTYUP95EZc3ec/nGBzHddJZydzYGE09tGZDBS1VoSoDn0symZ85FmypSTo5g==} 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==} @@ -3438,11 +3511,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==} @@ -3459,8 +3532,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==} @@ -3492,8 +3565,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==} @@ -3507,17 +3580,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==} @@ -3531,8 +3604,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: @@ -3551,6 +3624,10 @@ packages: resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} engines: {node: '>=12'} + minimatch@10.0.3: + resolution: {integrity: sha512-IPZ167aShDZZUMdRk66cyQAW3qr0WzbHkPdMYa8bzZhlHhO3jALbKdxcaak7W9FfT2rZNpQuUu4Od7ILEpXSaw==} + engines: {node: 20 || >=22} + minimatch@3.1.2: resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} @@ -3576,8 +3653,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==} @@ -3592,14 +3669,16 @@ 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==} + nanoid@3.3.11: + resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true + napi-postinstall@0.3.0: + resolution: {integrity: sha512-M7NqKyhODKV1gRLdkwE7pDsZP2/SC2a2vHkOYh9MCpKMbWVfyVfUw5MaH83Fv6XMjxr5jryUp3IDDL9rlxsTeA==} + engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} + hasBin: true + natural-compare@1.4.0: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} @@ -3620,32 +3699,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==} - peerDependencies: - 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-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.4.0-canary.61: + resolution: {integrity: sha512-EMSeQxbnfy7iR1lFK9CQNMdff9FYlFhWwiY1WfhXk7nYBSwF2n7+VM5q1drxVMZrrJpFmXvlWQ/A7imGVgVS9g==} engines: {node: ^18.18.0 || ^19.8.0 || >= 20.0.0} hasBin: true peerDependencies: @@ -3665,16 +3726,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.17: + resolution: {integrity: sha512-QQ7iPHQ7zqh7dKJZ3SQbxqoFt7r8RHD9v7dFtJ+x8evEfxwM23oBGHNBqIjBoPl5uSwtvufEiVd7WMhK+Dxdww==} peerDependencies: next: '>=14' - nextra: 4.2.4 + nextra: 4.2.17 react: '>=18' react-dom: '>=18' - nextra@4.2.4: - resolution: {integrity: sha512-pB91o5jrgcIkkot79GbTtfg9qZtLtzzMJRzbeqeL+HSVGLFhj2urEAOPzpc47emvdmEjjNLyB7LQ8BcBZvrlxg==} + nextra@4.2.17: + resolution: {integrity: sha512-WBZGSUeUJqkYm3F3F7+4N1oMP84r/YK/rAg96wkywu/MIsuUREY8fLXQgQbKkvcLbBl/7Wk2Iy+9xlhDu+weNg==} engines: {node: '>=18'} peerDependencies: next: '>=14' @@ -3684,10 +3745,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'} @@ -3700,10 +3786,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'} @@ -3720,8 +3802,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: @@ -3751,8 +3833,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 +3879,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: @@ -3808,8 +3890,11 @@ packages: 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.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==} @@ -3825,14 +3910,24 @@ packages: parse-entities@4.0.2: resolution: {integrity: sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw==} + parse-imports-exports@0.2.4: + resolution: {integrity: sha512-4s6vd6dx1AotCx/RCI2m7t7GCh5bDRUtGNvRfHSP2wbBQdMi67pPe7mtzmgwcaQ8VKK/6IB7Glfyu3qdZJPybQ==} + + 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==} 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==} path-data-parser@0.1.0: resolution: {integrity: sha512-NOnmBpt5Y2RWbuv0LMzsayp3lVylAHLPUTut412ZA3l+C4uw4ZVkQbjShYCQ8TCpUMdPapr4YjUqLYD6v68j+w==} @@ -3866,8 +3961,12 @@ 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==} + + pathval@2.0.1: + resolution: {integrity: sha512-//nshmD55c46FuFw26xV/xFAaB5HF9Xdap7HJBBnrKdAd6/GxDBaNA1870O79+9ueg61cZLSVc+OaFlfmObYVQ==} + engines: {node: '>= 14.16'} picocolors@1.1.1: resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} @@ -3902,24 +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 - 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==} - playwright-core@1.50.1: - resolution: {integrity: sha512-ra9fsNWayuYumt+NiM069M6OkcRb1FZSK8bgi66AtpFoWkg2+y0bJSNmkFrWhMbEBbVKC/EruAHH3g0zmtwGmQ==} + pkg-types@2.2.0: + resolution: {integrity: sha512-2SM/GZGAEkPp3KWORxQZns4M+WSeXbC2HEvmOIJe3Cmiv6ieAJvdVhDldtHqM5J1Y7MrR1XhkBT/rMlhh9FdqQ==} + + playwright-core@1.53.2: + resolution: {integrity: sha512-ox/OytMy+2w1jcYEYlOo1Hhp8hZkLCximMTUTMBXjGUA1KoFfiSZ+DU+3a739jsPY0yoKH2TFy9S2fsJas8yAw==} engines: {node: '>=18'} hasBin: true - playwright@1.50.1: - resolution: {integrity: sha512-G8rwsOQJ63XG6BbKj2w5rHeavFjy5zynBA9zsJMMtBoe/Uf757oG12NXz6e6OirF7RCrTVAKFXbLmn1RbL7Qaw==} + playwright@1.53.2: + resolution: {integrity: sha512-6K/qQxVFuVQhRQhFsVZ9fGeatxirtrpPgxzBYWyZLEXJzqYwuL4fuNmfOfD5et1tJE4GScKyPNeLhZeRwuTU3A==} engines: {node: '>=18'} hasBin: true @@ -3941,9 +4039,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.8: + resolution: {integrity: sha512-y7sO+UuGjfESK/ChRN+efJKAsHrBd95GY2p1GQfjVTtOfFtUfiW0NOuUhP5dN5QTF2F0EWcepgkLqbF32j90Iw==} + engines: {node: '>=16.0.0'} hasBin: true points-on-curve@0.2.0: @@ -3956,34 +4054,20 @@ 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} + 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.8: - resolution: {integrity: sha512-BaGOF63I0IJZoudxpuQe17naV93BRtK8b3byWktkJReKEMX9CC4qdGUzThPDVO/AUhPzlqDiAXbp18U6X8wLKA==} + prettier-plugin-packagejson@2.5.18: + resolution: {integrity: sha512-NKznPGcGrcj4NPGxnh+w78JXPyfB6I4RQSCM0v+CAXwpDG7OEpJQ5zMyfC5NBgKH1k7Skwcj5ak5by2mrHvC5g==} peerDependencies: prettier: '>= 1.16.0' peerDependenciesMeta: @@ -3995,14 +4079,33 @@ packages: engines: {node: '>=10.13.0'} hasBin: true - prettier@3.4.2: - resolution: {integrity: sha512-e9MewbtFo+Fevyuxn/4rrcDAaq0IYxPGLvObpQjiZBMAzB9IGmzlnG9RZy3FFas+eBMu2vA0CszMeduow5dIuQ==} + prettier@3.6.2: + resolution: {integrity: sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ==} 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==} + 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: + 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==} @@ -4012,20 +4115,26 @@ packages: property-information@6.5.0: resolution: {integrity: sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig==} - proxy-agent@6.3.1: - resolution: {integrity: sha512-Rb5RVBy1iyqOtNl15Cw/llpeLH8bsb37gM1FUfKQ+Wck6xHlbAhWGUFiTRHtkjqGTA5pSHz6+0hrPW/oECihPQ==} + property-information@7.1.0: + resolution: {integrity: sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==} + + proxy-agent@6.4.0: + resolution: {integrity: sha512-u0piLU+nCOHMgGjRbimiXmA9kM/L9EHh3zL81xCdp7m+Y2pHIsnmbdDoEDoAz5geaonNR6q6+yOPQs6n4T6sBQ==} engines: {node: '>= 14'} 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'} + quansync@0.2.10: + resolution: {integrity: sha512-t41VRkMYbkHyCYmOvx/6URnN80H7k4X0lLdBMGsz+maAwrJQYB1djpV6vHrQIBE0WBSGqhtEHrK9U3DWWH8v7A==} + queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} @@ -4045,32 +4154,27 @@ 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==} + 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==} - 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 - react@18.3.1: - resolution: {integrity: sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==} + react@19.1.0: + resolution: {integrity: sha512-FS+XFBNvn3GTAWq26joslQgWNoFu08F4kl0J4CgdNKADkdSGXQyTCnKteIAJy96Br6YbpEU1LSzV5dYtjMkMDg==} engines: {node: '>=0.10.0'} - react@19.0.0: - 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==} @@ -4080,14 +4184,14 @@ 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'} - readdirp@4.1.1: - resolution: {integrity: sha512-h80JrZu/MHUZCyHu5ciuoI0+WxsCxzxJTILn6Fs8rxSnFPh+UVHYfeIxK1nVGugMqkfC4vJcBOYbkfkwYK0+gw==} - engines: {node: '>= 14.18.0'} - reading-time@1.5.0: resolution: {integrity: sha512-onYyVhBNr4CmAxFsKS7bz+uTLRakypIe4R+5A824vBSkQy/hB3fZepoVEf8OVAxzLvK+H/jm9TzpI3ETSm64Kg==} @@ -4107,16 +4211,14 @@ 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.5.6: + resolution: {integrity: sha512-hbpqBfcuhWHOS9YLNcXcJ4akNr7HFX61Dq3JuFZ9S7uU7C7kvnzuH2PDIXOP62A3eevvACoG8UacuXP3N07xdg==} + engines: {node: '>= 18'} reflect.getprototypeof@1.0.10: 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==} @@ -4143,11 +4245,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==} @@ -4158,8 +4260,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==} @@ -4170,11 +4272,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==} @@ -4227,8 +4329,12 @@ packages: retext@9.0.0: resolution: {integrity: sha512-sbMDcpHCNjvlheSgMfEcVrZko3cDzdbe1x/e7G66dFp0Ff7Mldvi2uv6JkJQzdRcvLYE8CA8Oe8siQx8ZOgTcA==} - reusify@1.0.4: - resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} + 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'} rfdc@1.4.1: @@ -4237,8 +4343,8 @@ packages: robust-predicates@3.0.2: resolution: {integrity: sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg==} - rollup@4.34.6: - resolution: {integrity: sha512-wc2cBWqJgkU3Iz5oztRkQbfVkbxoz5EhnCGOrnJvnLnQ7O0WhQUYyv18qQI79O8L7DdHrrlJNeCHd4VGpnaXKQ==} + rollup@4.44.1: + resolution: {integrity: sha512-x8H8aPvD+xbl0Do8oez5f5o8eMS3trfCghc4HhLAnCkj7Vl0d1JWGs0UF/D886zLW2rOj2QymV/JcSSsw+XDNg==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true @@ -4254,6 +4360,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'} @@ -4272,8 +4382,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==} @@ -4285,11 +4395,8 @@ 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==} + scheduler@0.26.0: + resolution: {integrity: sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA==} scroll-into-view-if-needed@3.1.0: resolution: {integrity: sha512-49oNpRjWRvnU8NyGVmUaYG4jtTkNonFZI86MmGRDqBphEK2EXT9gdEUoQPZhuBM8yWHxCWbobltqYO5M4XrUvQ==} @@ -4297,8 +4404,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==} @@ -4309,8 +4416,8 @@ 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 @@ -4337,8 +4444,8 @@ packages: resolution: {integrity: sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==} engines: {node: '>= 0.4'} - sharp@0.33.5: - resolution: {integrity: sha512-haPVm1EkS9pgvHrQ/F3Xy+hgcuMV0Wm9vfIBSiwZ05k+xgb0PkBQpGsAA/oWdDobNaZTH5ppvHtzCFbnSEwHVw==} + 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: @@ -4349,8 +4456,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==} @@ -4371,6 +4478,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==} @@ -4397,8 +4507,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.5: + resolution: {integrity: sha512-iF+tNDQla22geJdTyJB1wM/qrX9DMRwWrciEPwWLPRWAUEM8sQiyxgckLxWT1f7+9VabJS0jTGGr4QgBuvi6Ww==} engines: {node: '>= 10.0.0', npm: '>= 3.0.0'} sonic-boom@4.2.0: @@ -4407,8 +4517,9 @@ 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@3.4.0: + resolution: {integrity: sha512-97oFRRMM2/Js4oEA9LJhjyMlde+2ewpZQf53pgue27UkbEXfHJnDzHlUxQ/DWUkzqmp7DFwJp8D+wi/TYeQhpA==} + engines: {node: '>=20'} hasBin: true source-map-js@1.2.1: @@ -4426,18 +4537,29 @@ 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==} spawndamnit@3.0.1: resolution: {integrity: sha512-MmnduQUuHCoFckZoWnXsTg7JaiLBJrKFj9UI2MbRPGaJeVpsLcVBu6P/IGZovziM/YBsellCmsprgNA+w0CzVg==} - speech-rule-engine@4.0.7: - resolution: {integrity: sha512-sJrL3/wHzNwJRLBdf6CjJWIlxC04iYKkyXvYSVsWVOiC2DSkHmxsqOhEeMsBA9XK+CHuNcsdkbFDnoUfAsmp9g==} + 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.1.2: + resolution: {integrity: sha512-S6ji+flMEga+1QU79NDbwZ8Ivf0S/MpupQQiIC0rTpU/ZTKgcajijJJb1OcByBQDjrXCN1/DJtGz4ZJeBMPGJw==} hasBin: true split2@4.2.0: @@ -4453,9 +4575,19 @@ packages: sprintf-js@1.1.3: resolution: {integrity: sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==} - streamsearch@1.1.0: - resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==} - engines: {node: '>=10.0.0'} + 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==} + + std-env@3.9.0: + resolution: {integrity: sha512-UGvjygr6F6tpH7o2qyqR6QYpwraIjKSdtzyBdyytFOHmPZY917kwdwLG0RbOjWOnKmnm3PeHjaoLLMie7kPLQw==} + + 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==} @@ -4465,6 +4597,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'} @@ -4484,6 +4620,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==} @@ -4515,21 +4654,14 @@ packages: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} engines: {node: '>=8'} - style-to-object@1.0.8: - resolution: {integrity: sha512-xT47I/Eo0rwJmaXC4oilDGDWLohVhR6o/xAQcPQN8q6QBuZVL8qMYL85kLmST5cPjAorwvqIA4qXTRQoYHaL6g==} + strip-literal@3.0.0: + resolution: {integrity: sha512-TcccoMhJOM3OebGhSBEmp3UZ2SfDMZUEBdRA/9ynfLi8yYajyWX3JiXArcJt4Umh4vISpspkQIY8ZZoCqjbviA==} - 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 + style-to-js@1.1.17: + resolution: {integrity: sha512-xQcBGDxJb6jjFCTzvQtfiPn6YvvP2O8U1MDIPNfJQlWMYfktPy+iGsHE7cssjs7y84d9fQaK4UF3RIJaAHSoYA==} + + 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==} @@ -4547,29 +4679,32 @@ 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==} 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'} - synckit@0.9.2: - resolution: {integrity: sha512-vrozgXDQwYO72vHjUb/HnFbQx1exDjoKzqx23aXEg2a9VIg2TSFZ8FmeZpTjUCFMYw7mpX4BE2SFu8wI7asYsw==} + 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 @@ -4581,23 +4716,34 @@ 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==} + tinybench@2.9.0: + resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} + tinyexec@0.3.2: resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==} - tinyglobby@0.2.10: - resolution: {integrity: sha512-Zc+8eJlFMvgatPZTl6A9L/yht8QqdmUNtURHaKZLmKBE12hNPSrqNkUp2cs3M/UKmNVVAMFQYSjYIVHDjW5zew==} + tinyexec@1.0.1: + resolution: {integrity: sha512-5uC6DDlmeqiOwCPmK9jMSdOuZTh8bU39Ys6yidB+UTt5hfZUPGAypSgFRiEp+jbi9qH40BLDvy85jIU88wKSqw==} + + tinyglobby@0.2.14: + resolution: {integrity: sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==} engines: {node: '>=12.0.0'} + tinypool@1.1.1: + resolution: {integrity: sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg==} + engines: {node: ^18.0.0 || >=20.0.0} + + tinyrainbow@2.0.0: + resolution: {integrity: sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==} + engines: {node: '>=14.0.0'} + + tinyspy@4.0.3: + resolution: {integrity: sha512-t2T/WLB2WRgZ9EpE4jgPJ9w+i66UZfDc8wHh0xrwiRNN+UwH98GIJkTeZqX9rg0i0ptwzqW+uYeIF0T4F8LR7A==} + engines: {node: '>=14.0.0'} + title@4.0.1: resolution: {integrity: sha512-xRnPkJx9nvE5MF6LkB5e8QJjE2FW8269wTu/LQdf7zZqBgPly0QJPf/CWAo7srj5so4yXfoLEdCFgurlpi47zg==} hasBin: true @@ -4614,21 +4760,14 @@ 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==} 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' @@ -4637,71 +4776,49 @@ 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.3.6: - resolution: {integrity: sha512-XkVtlDV/58S9Ye0JxUUTcrQk4S+EqlOHKzg6Roa62rdjL1nGWNUstG0xgI4vanHdfIpjP448J8vlN0oK6XOJ5g==} - 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.2: - resolution: {integrity: sha512-pOUl6Vo2LUq/bSa8S5q7b91cgNSjctn9ugq/+Mvow99qW6x/UZYwzxy/3NmqoT66eHYfCVvFvACC58UBPFf28g==} + tsx@4.20.3: + resolution: {integrity: sha512-qjbnuR9Tr+FJOMBqJCW5ehvIo/buZq7vH7qD7JziU98h6l3qGy0a/yPFjwO+y0/T7GFpNgNAvEcPPVfyT8rrPQ==} engines: {node: '>=18.0.0'} hasBin: true - turbo-darwin-64@2.4.0: - resolution: {integrity: sha512-kVMScnPUa3R4n7woNmkR15kOY0aUwCLJcUyH5UC59ggKqr5HIHwweKYK8N1pwBQso0LQF4I9i93hIzfJguCcwQ==} + turbo-darwin-64@2.5.4: + resolution: {integrity: sha512-ah6YnH2dErojhFooxEzmvsoZQTMImaruZhFPfMKPBq8sb+hALRdvBNLqfc8NWlZq576FkfRZ/MSi4SHvVFT9PQ==} cpu: [x64] os: [darwin] - turbo-darwin-arm64@2.4.0: - resolution: {integrity: sha512-8JObIpfun1guA7UlFR5jC/SOVm49lRscxMxfg5jZ5ABft79rhFC+ygN9AwAhGKv6W2DUhIh2xENkSgu4EDmUyg==} + turbo-darwin-arm64@2.5.4: + resolution: {integrity: sha512-2+Nx6LAyuXw2MdXb7pxqle3MYignLvS7OwtsP9SgtSBaMlnNlxl9BovzqdYAgkUW3AsYiQMJ/wBRb7d+xemM5A==} cpu: [arm64] os: [darwin] - turbo-linux-64@2.4.0: - resolution: {integrity: sha512-xWDGGcRlBuGV7HXWAVuTY6vsQi4aZxGMAnuiuNDg8Ij1aHGohOM0RUsWMXjxz4vuJmjk9+/D6NQqHH3AJEXezg==} + turbo-linux-64@2.5.4: + resolution: {integrity: sha512-5May2kjWbc8w4XxswGAl74GZ5eM4Gr6IiroqdLhXeXyfvWEdm2mFYCSWOzz0/z5cAgqyGidF1jt1qzUR8hTmOA==} cpu: [x64] os: [linux] - turbo-linux-arm64@2.4.0: - resolution: {integrity: sha512-c3En99xMguc/Pdtk/rZP53LnDdw0W6lgUc04he8r8F+UHYSNvgzHh0WGXXmCC6lGbBH72kPhhGx4bAwyvi7dug==} + turbo-linux-arm64@2.5.4: + resolution: {integrity: sha512-/2yqFaS3TbfxV3P5yG2JUI79P7OUQKOUvAnx4MV9Bdz6jqHsHwc9WZPpO4QseQm+NvmgY6ICORnoVPODxGUiJg==} cpu: [arm64] os: [linux] - turbo-windows-64@2.4.0: - resolution: {integrity: sha512-/gOORuOlyA8JDPzyA16CD3wvyRcuBFePa1URAnFUof9hXQmKxK0VvSDO79cYZFsJSchCKNJpckUS0gYxGsWwoA==} + turbo-windows-64@2.5.4: + resolution: {integrity: sha512-EQUO4SmaCDhO6zYohxIjJpOKRN3wlfU7jMAj3CgcyTPvQR/UFLEKAYHqJOnJtymbQmiiM/ihX6c6W6Uq0yC7mA==} cpu: [x64] os: [win32] - turbo-windows-arm64@2.4.0: - resolution: {integrity: sha512-/DJIdTFijEMM5LSiEpSfarDOMOlYqJV+EzmppqWtHqDsOLF4hbbIBH9sJR6OOp5dURAu5eURBYdmvBRz9Lo6TA==} + turbo-windows-arm64@2.5.4: + resolution: {integrity: sha512-oQ8RrK1VS8lrxkLriotFq+PiF7iiGgkZtfLKF4DDKsmdbPo0O9R2mQxm7jHLuXraRCuIQDWMIw6dpcr7Iykf4A==} cpu: [arm64] os: [win32] - turbo@2.4.0: - resolution: {integrity: sha512-ah/yQp2oMif1X0u7fBJ4MLMygnkbKnW5O8SG6pJvloPCpHfFoZctkSVQiJ3VnvNTq71V2JJIdwmOeu1i34OQyg==} + turbo@2.5.4: + resolution: {integrity: sha512-kc8ZibdRcuWUG1pbYSBFWqmIjynlD8Lp7IB6U3vIzvOv9VG+6Sp8bzyeBWE3Oi8XV5KsQrznyRTBPvrf99E4mA==} hasBin: true tv4@1.3.0: @@ -4727,6 +4844,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'} @@ -4743,27 +4864,36 @@ 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==} + typedarray@0.0.6: + resolution: {integrity: sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==} + + 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 - 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.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==} + + undici-types@7.8.0: + resolution: {integrity: sha512-9UJ2xGDvQ43tYyVMpuHlsgApydB8ZKfVYTsLDhXkFL/6gfkp+U8xTGdh8pMJv1SpZna0zxG1DwsKZsreLbXBxw==} + + unified-engine@11.2.2: + resolution: {integrity: sha512-15g/gWE7qQl9tQ3nAEbMd5h9HV1EACtFs6N9xaRBZICoCwnNGbal1kOs++ICf4aiTdItZxU2s/kYWhW7htlqJg==} unified@11.0.5: resolution: {integrity: sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==} @@ -4771,6 +4901,9 @@ packages: 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==} @@ -4814,16 +4947,39 @@ packages: resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} engines: {node: '>= 4.0.0'} + unrs-resolver@1.10.1: + resolution: {integrity: sha512-EFrL7Hw4kmhZdwWO3dwwFJo6hO3FXuQ6Bg8BK/faHZ9m1YxqBS31BNSTxklIQkxK/4LlV8zTYnPsIRLBzTzjCA==} + update-check@1.5.4: resolution: {integrity: sha512-5YHsflzHP4t1G+8WGPlvKbJEbAJGCgw+Em+dGR1KmBUbr1J36SJBqlHLjR7oob7sco5hWHGQVcr9B2poIVDDTQ==} uri-js@4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} - uuid@9.0.1: - resolution: {integrity: sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==} + 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==} + + 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'} @@ -4834,9 +4990,91 @@ 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==} + 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@7.0.2: + resolution: {integrity: sha512-hxdyZDY1CM6SNpKI4w4lcUc3Mtkd9ej4ECWVHSMrOdSinVc2zYOAppHeGc/hzmRo3pxM5blMzkuWHOJA/3NiFw==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + peerDependencies: + '@types/node': ^20.19.0 || >=22.12.0 + jiti: '>=1.21.0' + less: ^4.0.0 + lightningcss: ^1.21.0 + 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 + 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.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.2.4 + '@vitest/ui': 3.2.4 + 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'} @@ -4861,15 +5099,12 @@ 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==} - 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'} @@ -4882,8 +5117,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: @@ -4891,6 +5126,16 @@ 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'} + hasBin: true + wicked-good-xpath@1.3.0: resolution: {integrity: sha512-Gd9+TUn5nXdwj/hFsPVx5cuHHiF5Bwuc30jZ4+ronF1qHK5O7HD0sgmXWSEgwKquT3ClLoKPVbO6qGwVwLzvAw==} @@ -4925,33 +5170,29 @@ 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-validation-error@3.5.2: + resolution: {integrity: sha512-mdi7YOLtram5dzJ5aDtm1AG9+mxRma1iaMrZdYIpFO7epdKBUwLHIxTF8CPDeCQ828zAXYtizrKlEJAtzgfgrw==} engines: {node: '>=18.0.0'} peerDependencies: - zod: ^3.18.0 + zod: ^3.25.0 - zod@3.24.1: - resolution: {integrity: sha512-muH7gBL9sI1nciMZV67X5fTKKBLtwpZ5VBp1vsOQzj1MhrBZ4wlVCm3gedKZWLp0Oyel8sIGfeiz54Su+OVT+A==} + zod@3.25.72: + resolution: {integrity: sha512-Cl+fe4dNL4XumOBNBsr0lHfA80PQiZXHI4xEMTEr8gt6aGz92t3lBA32e71j9+JeF/VAYvdfBnuwJs+BMx/BrA==} - zustand@5.0.3: - resolution: {integrity: sha512-14fwWQtU3pH4dE0dOpdMiWjddcH+QzKIgk1cl8epwSE7yag43k/AD/m4L6+K7DytAOr9gGBe3/EXj9g7cdostg==} + zustand@5.0.6: + resolution: {integrity: sha512-ihAqNeUVhe0MAD+X8M5UzqyZ9k3FFZLBTtqo6JLPwV53cbRB/mJwBI0PxcIgqhBBHlEs8G45OTDTMq3gNcLq3A==} engines: {node: '>=12.20.0'} peerDependencies: '@types/react': '>=18.0.0' @@ -4973,61 +5214,32 @@ packages: snapshots: - '@antfu/install-pkg@1.0.0': + '@antfu/install-pkg@1.1.0': dependencies: - package-manager-detector: 0.2.9 - tinyexec: 0.3.2 + package-manager-detector: 1.3.0 + tinyexec: 1.0.1 - '@antfu/utils@8.1.0': {} + '@antfu/utils@8.1.1': {} - '@babel/runtime@7.26.7': + '@babel/code-frame@7.27.1': 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.27.1 + js-tokens: 4.0.0 + picocolors: 1.1.1 - '@biomejs/cli-win32-arm64@1.9.4': - optional: true + '@babel/helper-validator-identifier@7.27.1': {} - '@biomejs/cli-win32-x64@1.9.4': - optional: true + '@babel/runtime@7.27.6': {} '@braintree/sanitize-url@7.1.1': {} - '@changesets/apply-release-plan@7.0.8': + '@changesets/apply-release-plan@7.0.12': 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/git': 3.0.4 + '@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 @@ -5035,37 +5247,37 @@ 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.5': + '@changesets/assemble-release-plan@6.0.9': 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 + semver: 7.7.2 - '@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.29.5': 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.12 + '@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.2 - '@changesets/get-release-plan': 4.0.6 - '@changesets/git': 3.0.2 + '@changesets/get-dependents-graph': 2.1.3 + '@changesets/get-release-plan': 4.0.13 + '@changesets/git': 3.0.4 '@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.5 + '@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 @@ -5074,19 +5286,19 @@ 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.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 - '@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,25 +5307,25 @@ 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 + semver: 7.7.2 - '@changesets/get-release-plan@4.0.6': + '@changesets/get-release-plan@4.0.13': 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.9 + '@changesets/config': 3.1.1 + '@changesets/pre': 2.0.2 + '@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 @@ -5125,241 +5337,190 @@ 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.5': dependencies: - '@changesets/git': 3.0.2 + '@changesets/git': 3.0.4 '@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': - dependencies: - '@changesets/types': 6.0.0 - '@manypkg/get-packages': 1.1.3 - - '@changesets/types@4.1.0': {} - - '@changesets/types@6.0.0': {} - - '@changesets/write@0.3.2': - dependencies: - '@changesets/types': 6.0.0 - fs-extra: 7.0.1 - human-id: 1.0.2 - prettier: 2.8.8 - - '@chevrotain/cst-dts-gen@11.0.3': - dependencies: - '@chevrotain/gast': 11.0.3 - '@chevrotain/types': 11.0.3 - lodash-es: 4.17.21 - - '@chevrotain/gast@11.0.3': - dependencies: - '@chevrotain/types': 11.0.3 - lodash-es: 4.17.21 - - '@chevrotain/regexp-to-ast@11.0.3': {} - - '@chevrotain/types@11.0.3': {} - - '@chevrotain/utils@11.0.3': {} - - '@emnapi/runtime@1.3.1': + '@changesets/should-skip-package@0.1.2': dependencies: - 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': - optional: true - - '@esbuild/android-arm64@0.24.2': - optional: true - - '@esbuild/android-arm@0.23.1': - optional: true - - '@esbuild/android-arm@0.24.2': - optional: true - - '@esbuild/android-x64@0.23.1': - optional: true - - '@esbuild/android-x64@0.24.2': - optional: true - - '@esbuild/darwin-arm64@0.23.1': - optional: true - - '@esbuild/darwin-arm64@0.24.2': - optional: true - - '@esbuild/darwin-x64@0.23.1': - optional: true - - '@esbuild/darwin-x64@0.24.2': - optional: true + '@changesets/types': 6.1.0 + '@manypkg/get-packages': 1.1.3 - '@esbuild/freebsd-arm64@0.23.1': - optional: true + '@changesets/types@4.1.0': {} - '@esbuild/freebsd-arm64@0.24.2': - optional: true + '@changesets/types@6.1.0': {} - '@esbuild/freebsd-x64@0.23.1': - optional: true + '@changesets/write@0.4.0': + dependencies: + '@changesets/types': 6.1.0 + fs-extra: 7.0.1 + human-id: 4.1.1 + prettier: 2.8.8 - '@esbuild/freebsd-x64@0.24.2': - optional: true + '@chevrotain/cst-dts-gen@11.0.3': + dependencies: + '@chevrotain/gast': 11.0.3 + '@chevrotain/types': 11.0.3 + lodash-es: 4.17.21 - '@esbuild/linux-arm64@0.23.1': - optional: true + '@chevrotain/gast@11.0.3': + dependencies: + '@chevrotain/types': 11.0.3 + lodash-es: 4.17.21 - '@esbuild/linux-arm64@0.24.2': - optional: true + '@chevrotain/regexp-to-ast@11.0.3': {} - '@esbuild/linux-arm@0.23.1': - optional: true + '@chevrotain/types@11.0.3': {} - '@esbuild/linux-arm@0.24.2': - optional: true + '@chevrotain/utils@11.0.3': {} - '@esbuild/linux-ia32@0.23.1': + '@emnapi/core@1.4.3': + dependencies: + '@emnapi/wasi-threads': 1.0.2 + tslib: 2.8.1 optional: true - '@esbuild/linux-ia32@0.24.2': + '@emnapi/runtime@1.4.3': + dependencies: + tslib: 2.8.1 optional: true - '@esbuild/linux-loong64@0.23.1': + '@emnapi/wasi-threads@1.0.2': + dependencies: + tslib: 2.8.1 optional: true - '@esbuild/linux-loong64@0.24.2': - optional: true + '@es-joy/jsdoccomment@0.52.0': + dependencies: + '@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/linux-mips64el@0.23.1': + '@esbuild/aix-ppc64@0.25.5': optional: true - '@esbuild/linux-mips64el@0.24.2': + '@esbuild/android-arm64@0.25.5': optional: true - '@esbuild/linux-ppc64@0.23.1': + '@esbuild/android-arm@0.25.5': optional: true - '@esbuild/linux-ppc64@0.24.2': + '@esbuild/android-x64@0.25.5': optional: true - '@esbuild/linux-riscv64@0.23.1': + '@esbuild/darwin-arm64@0.25.5': optional: true - '@esbuild/linux-riscv64@0.24.2': + '@esbuild/darwin-x64@0.25.5': optional: true - '@esbuild/linux-s390x@0.23.1': + '@esbuild/freebsd-arm64@0.25.5': optional: true - '@esbuild/linux-s390x@0.24.2': + '@esbuild/freebsd-x64@0.25.5': optional: true - '@esbuild/linux-x64@0.23.1': + '@esbuild/linux-arm64@0.25.5': optional: true - '@esbuild/linux-x64@0.24.2': + '@esbuild/linux-arm@0.25.5': optional: true - '@esbuild/netbsd-arm64@0.24.2': + '@esbuild/linux-ia32@0.25.5': optional: true - '@esbuild/netbsd-x64@0.23.1': + '@esbuild/linux-loong64@0.25.5': optional: true - '@esbuild/netbsd-x64@0.24.2': + '@esbuild/linux-mips64el@0.25.5': optional: true - '@esbuild/openbsd-arm64@0.23.1': + '@esbuild/linux-ppc64@0.25.5': optional: true - '@esbuild/openbsd-arm64@0.24.2': + '@esbuild/linux-riscv64@0.25.5': optional: true - '@esbuild/openbsd-x64@0.23.1': + '@esbuild/linux-s390x@0.25.5': optional: true - '@esbuild/openbsd-x64@0.24.2': + '@esbuild/linux-x64@0.25.5': optional: true - '@esbuild/sunos-x64@0.23.1': + '@esbuild/netbsd-arm64@0.25.5': optional: true - '@esbuild/sunos-x64@0.24.2': + '@esbuild/netbsd-x64@0.25.5': optional: true - '@esbuild/win32-arm64@0.23.1': + '@esbuild/openbsd-arm64@0.25.5': optional: true - '@esbuild/win32-arm64@0.24.2': + '@esbuild/openbsd-x64@0.25.5': optional: true - '@esbuild/win32-ia32@0.23.1': + '@esbuild/sunos-x64@0.25.5': optional: true - '@esbuild/win32-ia32@0.24.2': + '@esbuild/win32-arm64@0.25.5': optional: true - '@esbuild/win32-x64@0.23.1': + '@esbuild/win32-ia32@0.25.5': optional: true - '@esbuild/win32-x64@0.24.2': + '@esbuild/win32-x64@0.25.5': optional: true - '@eslint-community/eslint-utils@4.4.1(eslint@9.20.0)': + '@eslint-community/eslint-utils@4.7.0(eslint@9.30.1)': dependencies: - eslint: 9.20.0 + eslint: 9.30.1 eslint-visitor-keys: 3.4.3 '@eslint-community/regexpp@4.12.1': {} - '@eslint/config-array@0.19.2': + '@eslint/config-array@0.21.0': dependencies: '@eslint/object-schema': 2.1.6 - debug: 4.4.0 + debug: 4.4.1 minimatch: 3.1.2 transitivePeerDependencies: - supports-color - '@eslint/core@0.10.0': + '@eslint/config-helpers@0.3.0': {} + + '@eslint/core@0.14.0': dependencies: '@types/json-schema': 7.0.15 - '@eslint/core@0.11.0': + '@eslint/core@0.15.1': dependencies: '@types/json-schema': 7.0.15 - '@eslint/eslintrc@3.2.0': + '@eslint/eslintrc@3.3.1': dependencies: ajv: 6.12.6 - debug: 4.4.0 - espree: 10.3.0 + debug: 4.4.1 + espree: 10.4.0 globals: 14.0.0 ignore: 5.3.2 import-fresh: 3.3.1 @@ -5369,13 +5530,13 @@ snapshots: transitivePeerDependencies: - supports-color - '@eslint/js@9.20.0': {} + '@eslint/js@9.30.1': {} '@eslint/object-schema@2.1.6': {} - '@eslint/plugin-kit@0.2.5': + '@eslint/plugin-kit@0.3.3': dependencies: - '@eslint/core': 0.10.0 + '@eslint/core': 0.15.1 levn: 0.4.1 '@fastify/ajv-compiler@4.0.2': @@ -5384,9 +5545,9 @@ snapshots: ajv-formats: 3.0.1(ajv@8.17.1) fast-uri: 3.0.6 - '@fastify/error@4.0.0': {} + '@fastify/error@4.2.0': {} - '@fastify/fast-json-stringify-compiler@5.0.2': + '@fastify/fast-json-stringify-compiler@5.0.3': dependencies: fast-json-stringify: 6.0.1 @@ -5401,43 +5562,44 @@ snapshots: '@fastify/forwarded': 3.0.0 ipaddr.js: 2.2.0 - '@floating-ui/core@1.6.9': + '@floating-ui/core@1.7.2': dependencies: - '@floating-ui/utils': 0.2.9 + '@floating-ui/utils': 0.2.10 - '@floating-ui/dom@1.6.13': + '@floating-ui/dom@1.7.2': dependencies: - '@floating-ui/core': 1.6.9 - '@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.0.0(react@19.0.0))(react@19.0.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.6.13 - react: 19.0.0 - react-dom: 19.0.0(react@19.0.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.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/utils': 0.2.9 - react: 19.0.0 - react-dom: 19.0.0(react@19.0.0) + '@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.5.10': + '@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.4(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.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) - 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.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) '@humanfs/core@0.19.1': {} @@ -5450,98 +5612,110 @@ snapshots: '@humanwhocodes/retry@0.3.1': {} - '@humanwhocodes/retry@0.4.1': {} + '@humanwhocodes/retry@0.4.3': {} '@iconify/types@2.0.0': {} '@iconify/utils@2.3.0': dependencies: - '@antfu/install-pkg': 1.0.0 - '@antfu/utils': 8.1.0 + '@antfu/install-pkg': 1.1.0 + '@antfu/utils': 8.1.1 '@iconify/types': 2.0.0 - debug: 4.4.0 - globals: 15.14.0 + debug: 4.4.1 + globals: 15.15.0 kolorist: 1.8.0 - local-pkg: 1.0.0 + local-pkg: 1.1.1 mlly: 1.7.4 transitivePeerDependencies: - supports-color - '@img/sharp-darwin-arm64@0.33.5': + '@img/sharp-darwin-arm64@0.34.2': 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.2': 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.1.0': optional: true - '@img/sharp-libvips-darwin-arm64@1.0.4': + '@img/sharp-libvips-darwin-x64@1.1.0': optional: true - '@img/sharp-libvips-darwin-x64@1.0.4': + '@img/sharp-libvips-linux-arm64@1.1.0': optional: true - '@img/sharp-libvips-linux-arm64@1.0.4': + '@img/sharp-libvips-linux-arm@1.1.0': optional: true - '@img/sharp-libvips-linux-arm@1.0.5': + '@img/sharp-libvips-linux-ppc64@1.1.0': optional: true - '@img/sharp-libvips-linux-s390x@1.0.4': + '@img/sharp-libvips-linux-s390x@1.1.0': optional: true - '@img/sharp-libvips-linux-x64@1.0.4': + '@img/sharp-libvips-linux-x64@1.1.0': optional: true - '@img/sharp-libvips-linuxmusl-arm64@1.0.4': + '@img/sharp-libvips-linuxmusl-arm64@1.1.0': optional: true - '@img/sharp-libvips-linuxmusl-x64@1.0.4': + '@img/sharp-libvips-linuxmusl-x64@1.1.0': optional: true - '@img/sharp-linux-arm64@0.33.5': + '@img/sharp-linux-arm64@0.34.2': 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.2': 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.2': 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.2': 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.2': 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.2': 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.2': dependencies: - '@emnapi/runtime': 1.3.1 + '@emnapi/runtime': 1.4.3 + optional: true + + '@img/sharp-win32-arm64@0.34.2': optional: true - '@img/sharp-win32-ia32@0.33.5': + '@img/sharp-win32-ia32@0.34.2': optional: true - '@img/sharp-win32-x64@0.33.5': + '@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 @@ -5551,42 +5725,27 @@ snapshots: 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 + '@jridgewell/sourcemap-codec@1.5.4': {} '@manypkg/find-root@1.1.0': dependencies: - '@babel/runtime': 7.26.7 + '@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.26.7 + '@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.0)': + '@mdx-js/mdx@3.1.0(acorn@8.15.0)': dependencies: - '@types/estree': 1.0.6 + '@types/estree': 1.0.8 '@types/estree-jsx': 1.0.5 '@types/hast': 3.0.4 '@types/mdx': 2.0.13 @@ -5595,15 +5754,15 @@ 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.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.15.0) recma-stringify: 1.0.0 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 @@ -5614,9 +5773,9 @@ snapshots: - acorn - supports-color - '@mermaid-js/parser@0.3.0': + '@mermaid-js/parser@0.6.0': dependencies: - langium: 3.0.0 + langium: 3.3.1 '@napi-rs/simple-git-android-arm-eabi@0.1.19': optional: true @@ -5677,63 +5836,41 @@ 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.1.6': {} - - '@next/eslint-plugin-next@15.1.6': + '@napi-rs/wasm-runtime@0.2.11': 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': + '@emnapi/core': 1.4.3 + '@emnapi/runtime': 1.4.3 + '@tybys/wasm-util': 0.9.0 optional: true - '@next/swc-linux-arm64-musl@15.1.6': - optional: true + '@next/env@15.4.0-canary.61': {} - '@next/swc-linux-x64-gnu@14.2.15': - optional: true + '@next/eslint-plugin-next@15.4.0-canary.61': + dependencies: + fast-glob: 3.3.1 - '@next/swc-linux-x64-gnu@15.1.6': + '@next/swc-darwin-arm64@15.4.0-canary.61': optional: true - '@next/swc-linux-x64-musl@14.2.15': + '@next/swc-darwin-x64@15.4.0-canary.61': optional: true - '@next/swc-linux-x64-musl@15.1.6': + '@next/swc-linux-arm64-gnu@15.4.0-canary.61': optional: true - '@next/swc-win32-arm64-msvc@14.2.15': + '@next/swc-linux-arm64-musl@15.4.0-canary.61': optional: true - '@next/swc-win32-arm64-msvc@15.1.6': + '@next/swc-linux-x64-gnu@15.4.0-canary.61': optional: true - '@next/swc-win32-ia32-msvc@14.2.15': + '@next/swc-linux-x64-musl@15.4.0-canary.61': optional: true - '@next/swc-win32-x64-msvc@14.2.15': + '@next/swc-win32-arm64-msvc@15.4.0-canary.61': optional: true - '@next/swc-win32-x64-msvc@15.1.6': + '@next/swc-win32-x64-msvc@15.4.0-canary.61': optional: true '@nodelib/fs.scandir@2.1.5': @@ -5746,7 +5883,59 @@ snapshots: '@nodelib/fs.walk@1.2.8': dependencies: '@nodelib/fs.scandir': 2.1.5 - fastq: 1.19.0 + 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.2 + 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.2 + 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.2 + transitivePeerDependencies: + - bluebird + + '@npmcli/promise-spawn@7.0.2': + dependencies: + which: 4.0.0 '@pagefind/darwin-arm64@1.3.0': optional: true @@ -5766,13 +5955,13 @@ snapshots: '@pkgjs/parseargs@0.11.0': optional: true - '@pkgr/core@0.1.1': {} + '@pkgr/core@0.2.7': {} - '@playwright/test@1.50.1': + '@playwright/test@1.53.2': dependencies: - playwright: 1.50.1 + playwright: 1.53.2 - '@pm2/agent@2.0.4': + '@pm2/agent@2.1.1': dependencies: async: 3.2.6 chalk: 3.0.0 @@ -5781,10 +5970,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: @@ -5792,7 +5980,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 @@ -5819,203 +6007,203 @@ snapshots: '@pm2/pm2-version-check@1.0.4': dependencies: - debug: 4.4.0 + debug: 4.4.1 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.5(react-dom@19.1.0(react@19.1.0))(react@19.1.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) - '@swc/helpers': 0.5.15 + '@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.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.23.0(react-dom@19.0.0(react@19.0.0))(react@19.0.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.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) - '@swc/helpers': 0.5.15 - react: 19.0.0 - react-dom: 19.0.0(react@19.0.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.7(react@19.0.0)': + '@react-aria/ssr@3.9.9(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.27.0(react-dom@19.0.0(react@19.0.0))(react@19.0.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.7(react@19.0.0) - '@react-stately/utils': 3.10.5(react@19.0.0) - '@react-types/shared': 3.27.0(react@19.0.0) - '@swc/helpers': 0.5.15 + '@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.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/utils@3.10.5(react@19.0.0)': + '@react-stately/flags@3.1.2': dependencies: - '@swc/helpers': 0.5.15 - react: 19.0.0 + '@swc/helpers': 0.5.17 - '@react-types/shared@3.27.0(react@19.0.0)': + '@react-stately/utils@3.10.7(react@19.1.0)': dependencies: - react: 19.0.0 + '@swc/helpers': 0.5.17 + react: 19.1.0 - '@redis/bloom@1.2.0(@redis/client@1.6.0)': + '@react-types/shared@3.30.0(react@19.1.0)': dependencies: - '@redis/client': 1.6.0 + react: 19.1.0 - '@redis/client@1.6.0': + '@redis/bloom@5.5.6(@redis/client@5.5.6)': dependencies: - cluster-key-slot: 1.1.2 - generic-pool: 3.9.0 - yallist: 4.0.0 + '@redis/client': 5.5.6 - '@redis/graph@1.1.1(@redis/client@1.6.0)': + '@redis/client@5.5.6': dependencies: - '@redis/client': 1.6.0 + cluster-key-slot: 1.1.2 - '@redis/json@1.0.7(@redis/client@1.6.0)': + '@redis/json@5.5.6(@redis/client@5.5.6)': dependencies: - '@redis/client': 1.6.0 + '@redis/client': 5.5.6 - '@redis/search@1.2.0(@redis/client@1.6.0)': + '@redis/search@5.5.6(@redis/client@5.5.6)': dependencies: - '@redis/client': 1.6.0 + '@redis/client': 5.5.6 - '@redis/time-series@1.1.0(@redis/client@1.6.0)': + '@redis/time-series@5.5.6(@redis/client@5.5.6)': dependencies: - '@redis/client': 1.6.0 + '@redis/client': 5.5.6 - '@rollup/rollup-android-arm-eabi@4.34.6': + '@rollup/rollup-android-arm-eabi@4.44.1': optional: true - '@rollup/rollup-android-arm64@4.34.6': + '@rollup/rollup-android-arm64@4.44.1': optional: true - '@rollup/rollup-darwin-arm64@4.34.6': + '@rollup/rollup-darwin-arm64@4.44.1': optional: true - '@rollup/rollup-darwin-x64@4.34.6': + '@rollup/rollup-darwin-x64@4.44.1': optional: true - '@rollup/rollup-freebsd-arm64@4.34.6': + '@rollup/rollup-freebsd-arm64@4.44.1': optional: true - '@rollup/rollup-freebsd-x64@4.34.6': + '@rollup/rollup-freebsd-x64@4.44.1': optional: true - '@rollup/rollup-linux-arm-gnueabihf@4.34.6': + '@rollup/rollup-linux-arm-gnueabihf@4.44.1': optional: true - '@rollup/rollup-linux-arm-musleabihf@4.34.6': + '@rollup/rollup-linux-arm-musleabihf@4.44.1': optional: true - '@rollup/rollup-linux-arm64-gnu@4.34.6': + '@rollup/rollup-linux-arm64-gnu@4.44.1': optional: true - '@rollup/rollup-linux-arm64-musl@4.34.6': + '@rollup/rollup-linux-arm64-musl@4.44.1': optional: true - '@rollup/rollup-linux-loongarch64-gnu@4.34.6': + '@rollup/rollup-linux-loongarch64-gnu@4.44.1': optional: true - '@rollup/rollup-linux-powerpc64le-gnu@4.34.6': + '@rollup/rollup-linux-powerpc64le-gnu@4.44.1': optional: true - '@rollup/rollup-linux-riscv64-gnu@4.34.6': + '@rollup/rollup-linux-riscv64-gnu@4.44.1': optional: true - '@rollup/rollup-linux-s390x-gnu@4.34.6': + '@rollup/rollup-linux-riscv64-musl@4.44.1': optional: true - '@rollup/rollup-linux-x64-gnu@4.34.6': + '@rollup/rollup-linux-s390x-gnu@4.44.1': optional: true - '@rollup/rollup-linux-x64-musl@4.34.6': + '@rollup/rollup-linux-x64-gnu@4.44.1': optional: true - '@rollup/rollup-win32-arm64-msvc@4.34.6': + '@rollup/rollup-linux-x64-musl@4.44.1': optional: true - '@rollup/rollup-win32-ia32-msvc@4.34.6': + '@rollup/rollup-win32-arm64-msvc@4.44.1': optional: true - '@rollup/rollup-win32-x64-msvc@4.34.6': + '@rollup/rollup-win32-ia32-msvc@4.44.1': optional: true - '@shikijs/core@2.3.2': + '@rollup/rollup-win32-x64-msvc@4.44.1': + optional: true + + '@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.8.3)': dependencies: - '@shikijs/core': 2.3.2 - '@shikijs/types': 2.3.2 - twoslash: 0.2.12(typescript@5.7.3) + '@shikijs/core': 2.5.0 + '@shikijs/types': 2.5.0 + twoslash: 0.2.12(typescript@5.8.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': {} - - '@swc/counter@0.1.3': {} + '@shikijs/vscode-textmate@10.0.2': {} '@swc/helpers@0.5.15': dependencies: tslib: 2.8.1 - '@swc/helpers@0.5.5': + '@swc/helpers@0.5.17': 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.12(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': dependencies: - '@tanstack/virtual-core': 3.13.0 - react: 19.0.0 - react-dom: 19.0.0(react@19.0.0) + '@tanstack/virtual-core': 3.13.12 + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) - '@tanstack/virtual-core@3.13.0': {} + '@tanstack/virtual-core@3.13.12': {} - '@theguild/remark-mermaid@0.2.0(react@19.0.0)': + '@theguild/remark-mermaid@0.2.0(react@19.1.0)': dependencies: - mermaid: 11.4.1 - react: 19.0.0 + mermaid: 11.8.0 + react: 19.1.0 unist-util-visit: 5.0.0 transitivePeerDependencies: - supports-color @@ -6027,9 +6215,18 @@ snapshots: '@tootallnate/quickjs-emscripten@0.23.0': {} - '@types/acorn@4.0.6': + '@tybys/wasm-util@0.9.0': + dependencies: + 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/estree': 1.0.6 + '@types/node': 24.0.10 '@types/d3-array@3.2.1': {} @@ -6152,11 +6349,13 @@ snapshots: dependencies: '@types/ms': 2.1.0 + '@types/deep-eql@4.0.2': {} + '@types/estree-jsx@1.0.5': dependencies: - '@types/estree': 1.0.6 + '@types/estree': 1.0.8 - '@types/estree@1.0.6': {} + '@types/estree@1.0.8': {} '@types/geojson@7946.0.16': {} @@ -6164,6 +6363,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': {} @@ -6182,28 +6383,23 @@ snapshots: '@types/node@12.20.55': {} - '@types/node@22.13.1': + '@types/node@22.16.0': dependencies: - undici-types: 6.20.0 - - '@types/prop-types@15.7.14': {} + undici-types: 6.21.0 - '@types/react-dom@18.3.1': + '@types/node@24.0.10': dependencies: - '@types/react': 19.0.8 + undici-types: 7.8.0 - '@types/react-dom@19.0.3(@types/react@19.0.8)': + '@types/react-dom@19.1.6(@types/react@19.1.8)': dependencies: - '@types/react': 19.0.8 + '@types/react': 19.1.8 - '@types/react@18.3.12': + '@types/react@19.1.8': dependencies: - '@types/prop-types': 15.7.14 csstype: 3.1.3 - '@types/react@19.0.8': - dependencies: - csstype: 3.1.3 + '@types/supports-color@8.1.3': {} '@types/trusted-types@2.0.7': optional: true @@ -6212,94 +6408,224 @@ 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.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.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.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: 5.3.2 + ignore: 7.0.5 natural-compare: 1.4.0 - ts-api-utils: 2.0.1(typescript@5.7.3) - typescript: 5.7.3 + ts-api-utils: 2.1.0(typescript@5.8.3) + typescript: 5.8.3 + transitivePeerDependencies: + - supports-color + + '@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/parser@8.23.0(eslint@9.20.0)(typescript@5.7.3)': + '@typescript-eslint/project-service@8.35.1(typescript@5.8.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 - debug: 4.4.0 - eslint: 9.20.0 - typescript: 5.7.3 + '@typescript-eslint/tsconfig-utils': 8.35.1(typescript@5.8.3) + '@typescript-eslint/types': 8.35.1 + debug: 4.4.1 + typescript: 5.8.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/scope-manager@8.23.0': + '@typescript-eslint/scope-manager@8.35.1': + dependencies: + '@typescript-eslint/types': 8.35.1 + '@typescript-eslint/visitor-keys': 8.35.1 + + '@typescript-eslint/tsconfig-utils@8.35.1(typescript@5.8.3)': dependencies: - '@typescript-eslint/types': 8.23.0 - '@typescript-eslint/visitor-keys': 8.23.0 + typescript: 5.8.3 - '@typescript-eslint/type-utils@8.23.0(eslint@9.20.0)(typescript@5.7.3)': + '@typescript-eslint/type-utils@8.35.1(eslint@9.30.1)(typescript@5.8.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) - debug: 4.4.0 - eslint: 9.20.0 - ts-api-utils: 2.0.1(typescript@5.7.3) - typescript: 5.7.3 + '@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.30.1 + ts-api-utils: 2.1.0(typescript@5.8.3) + typescript: 5.8.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/types@8.23.0': {} + '@typescript-eslint/types@8.35.1': {} - '@typescript-eslint/typescript-estree@8.23.0(typescript@5.7.3)': + '@typescript-eslint/typescript-estree@8.35.1(typescript@5.8.3)': dependencies: - '@typescript-eslint/types': 8.23.0 - '@typescript-eslint/visitor-keys': 8.23.0 - debug: 4.4.0 + '@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 minimatch: 9.0.5 - semver: 7.7.1 - ts-api-utils: 2.0.1(typescript@5.7.3) - typescript: 5.7.3 + 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.23.0(eslint@9.20.0)(typescript@5.7.3)': + '@typescript-eslint/utils@8.35.1(eslint@9.30.1)(typescript@5.8.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 - typescript: 5.7.3 + '@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.23.0': + '@typescript-eslint/visitor-keys@8.35.1': dependencies: - '@typescript-eslint/types': 8.23.0 - 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.7.3)': + '@typescript/vfs@1.6.1(typescript@5.8.3)': dependencies: - debug: 4.4.0 - typescript: 5.7.3 + debug: 4.4.1 + typescript: 5.8.3 transitivePeerDependencies: - supports-color '@ungap/structured-clone@1.3.0': {} + '@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-arm64@1.10.1': + optional: true + + '@unrs/resolver-binding-darwin-x64@1.10.1': + optional: true + + '@unrs/resolver-binding-freebsd-x64@1.10.1': + optional: true + + '@unrs/resolver-binding-linux-arm-gnueabihf@1.10.1': + optional: true + + '@unrs/resolver-binding-linux-arm-musleabihf@1.10.1': + optional: true + + '@unrs/resolver-binding-linux-arm64-gnu@1.10.1': + optional: true + + '@unrs/resolver-binding-linux-arm64-musl@1.10.1': + optional: true + + '@unrs/resolver-binding-linux-ppc64-gnu@1.10.1': + optional: true + + '@unrs/resolver-binding-linux-riscv64-gnu@1.10.1': + optional: true + + '@unrs/resolver-binding-linux-riscv64-musl@1.10.1': + optional: true + + '@unrs/resolver-binding-linux-s390x-gnu@1.10.1': + optional: true + + '@unrs/resolver-binding-linux-x64-gnu@1.10.1': + optional: true + + '@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.11 + optional: true + + '@unrs/resolver-binding-win32-arm64-msvc@1.10.1': + optional: true + + '@unrs/resolver-binding-win32-ia32-msvc@1.10.1': + optional: true + + '@unrs/resolver-binding-win32-x64-msvc@1.10.1': + optional: true + + '@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.35.1(eslint@9.30.1)(typescript@5.8.3) + eslint: 9.30.1 + optionalDependencies: + 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) + transitivePeerDependencies: + - supports-color + + '@vitest/expect@3.2.4': + dependencies: + '@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.2.4(vite@7.0.2(@types/node@24.0.10)(tsx@4.20.3)(yaml@2.8.0))': + dependencies: + '@vitest/spy': 3.2.4 + estree-walker: 3.0.3 + magic-string: 0.30.17 + optionalDependencies: + vite: 7.0.2(@types/node@24.0.10)(tsx@4.20.3)(yaml@2.8.0) + + '@vitest/pretty-format@3.2.4': + dependencies: + tinyrainbow: 2.0.0 + + '@vitest/runner@3.2.4': + dependencies: + '@vitest/utils': 3.2.4 + pathe: 2.0.3 + strip-literal: 3.0.0 + + '@vitest/snapshot@3.2.4': + dependencies: + '@vitest/pretty-format': 3.2.4 + magic-string: 0.30.17 + pathe: 2.0.3 + + '@vitest/spy@3.2.4': + dependencies: + tinyspy: 4.0.3 + + '@vitest/utils@3.2.4': + dependencies: + '@vitest/pretty-format': 3.2.4 + loupe: 3.1.4 + tinyrainbow: 2.0.0 + + '@xmldom/xmldom@0.9.8': {} + '@zeit/schemas@2.36.0': {} + abbrev@2.0.0: {} + abstract-logging@2.0.1: {} accepts@1.3.8: @@ -6307,11 +6633,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.15.0): dependencies: - acorn: 8.14.0 + acorn: 8.15.0 - acorn@8.14.0: {} + acorn@8.15.0: {} agent-base@7.1.3: {} @@ -6362,7 +6688,7 @@ snapshots: ansi-styles@6.2.1: {} - any-promise@1.3.0: {} + ansis@4.0.0-node10: {} anymatch@3.1.3: dependencies: @@ -6371,6 +6697,8 @@ snapshots: arch@2.2.0: {} + are-docs-informative@0.0.2: {} + arg@5.0.2: {} argparse@1.0.10: @@ -6381,17 +6709,19 @@ 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: + 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.2.7 + get-intrinsic: 1.3.0 is-string: 1.1.1 + math-intrinsics: 1.1.0 array-iterate@2.0.1: {} @@ -6401,43 +6731,45 @@ 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.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-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-shim-unscopables: 1.0.2 + 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.0.2 + es-shim-unscopables: 1.1.0 arraybuffer.prototype.slice@1.0.4: dependencies: 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.2.7 + 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 @@ -6462,13 +6794,13 @@ snapshots: avvio@9.1.0: dependencies: - '@fastify/error': 4.0.0 - fastq: 1.19.0 + '@fastify/error': 4.2.0 + fastq: 1.19.1 - axios@1.7.9: + axios@1.10.0: dependencies: follow-redirects: 1.15.9(debug@4.3.7) - form-data: 4.0.1 + form-data: 4.0.3 proxy-from-env: 1.1.0 transitivePeerDependencies: - debug @@ -6483,10 +6815,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: {} @@ -6505,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 @@ -6520,44 +6852,43 @@ snapshots: buffer-from@1.1.2: {} - bundle-require@5.1.0(esbuild@0.24.2): - dependencies: - esbuild: 0.24.2 - 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.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 + 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.1 - get-intrinsic: 1.2.7 + call-bind-apply-helpers: 1.0.2 + get-intrinsic: 1.3.0 callsites@3.1.0: {} camelcase@7.0.1: {} - caniuse-lite@1.0.30001698: {} + caniuse-lite@1.0.30001726: {} 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.4 + pathval: 2.0.1 + chalk-template@0.4.0: dependencies: chalk: 4.1.2 @@ -6588,6 +6919,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 @@ -6614,12 +6947,10 @@ snapshots: optionalDependencies: fsevents: 2.3.3 - chokidar@4.0.3: - dependencies: - readdirp: 4.1.1 - ci-info@3.9.0: {} + ci-info@4.2.0: {} + cli-boxes@3.0.0: {} cli-tableau@2.0.1: @@ -6672,19 +7003,19 @@ snapshots: comma-separated-tokens@2.0.3: {} - commander@2.15.1: {} + commander@13.1.0: {} - commander@4.1.1: {} + 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: dependencies: - mime-db: 1.53.0 + mime-db: 1.54.0 compression@1.7.4: dependencies: @@ -6702,14 +7033,25 @@ 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: {} - consola@3.4.0: {} + confbox@0.2.2: {} 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 @@ -6730,17 +7072,17 @@ snapshots: culvert@0.1.2: {} - cytoscape-cose-bilkent@4.1.0(cytoscape@3.31.0): + cytoscape-cose-bilkent@4.1.0(cytoscape@3.32.0): dependencies: cose-base: 1.0.3 - cytoscape: 3.31.0 + cytoscape: 3.32.0 - cytoscape-fcose@2.2.0(cytoscape@3.31.0): + cytoscape-fcose@2.2.0(cytoscape@3.32.0): dependencies: cose-base: 2.2.0 - cytoscape: 3.31.0 + cytoscape: 3.32.0 - cytoscape@3.31.0: {} + cytoscape@3.32.0: {} d3-array@2.12.1: dependencies: @@ -6918,19 +7260,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 @@ -6952,14 +7294,16 @@ snapshots: dependencies: ms: 2.1.3 - debug@4.4.0: + debug@4.4.1: dependencies: ms: 2.1.3 - decode-named-character-reference@1.0.2: + decode-named-character-reference@1.2.0: dependencies: character-entities: 2.0.2 + deep-eql@5.0.2: {} + deep-extend@0.6.0: {} deep-is@0.1.4: {} @@ -6994,7 +7338,7 @@ snapshots: detect-indent@7.0.1: {} - detect-libc@2.0.3: + detect-libc@2.0.4: optional: true detect-newline@4.0.1: {} @@ -7003,6 +7347,8 @@ snapshots: dependencies: dequal: 2.0.3 + diff@5.2.0: {} + dir-glob@3.0.1: dependencies: path-type: 4.0.0 @@ -7011,15 +7357,26 @@ snapshots: dependencies: esutils: 2.0.3 - dompurify@3.2.4: + dompurify@3.2.6: optionalDependencies: '@types/trusted-types': 2.0.7 + dotenv-cli@8.0.0: + dependencies: + cross-spawn: 7.0.6 + dotenv: 16.6.1 + dotenv-expand: 10.0.0 + minimist: 1.2.8 + + dotenv-expand@10.0.0: {} + dotenv@16.0.3: {} + dotenv@16.6.1: {} + 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 @@ -7027,11 +7384,13 @@ snapshots: emoji-regex-xs@1.0.0: {} + emoji-regex@10.4.0: {} + emoji-regex@8.0.0: {} emoji-regex@9.2.2: {} - end-of-stream@1.4.4: + end-of-stream@1.4.5: dependencies: once: 1.4.0 @@ -7044,15 +7403,21 @@ snapshots: ansi-colors: 4.1.3 strip-ansi: 6.0.1 - entities@4.5.0: {} + entities@6.0.1: {} - es-abstract@1.23.9: + err-code@2.0.3: {} + + error-ex@1.3.2: + dependencies: + is-arrayish: 0.2.1 + + es-abstract@1.24.0: dependencies: array-buffer-byte-length: 1.0.2 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 @@ -7062,7 +7427,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 @@ -7075,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 @@ -7090,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 @@ -7098,7 +7466,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: {} @@ -7107,13 +7475,13 @@ 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-abstract: 1.24.0 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 @@ -7123,6 +7491,8 @@ snapshots: iterator.prototype: 1.1.5 safe-array-concat: 1.1.3 + es-module-lexer@1.7.0: {} + es-object-atoms@1.1.1: dependencies: es-errors: 1.3.0 @@ -7130,11 +7500,11 @@ 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 - es-shim-unscopables@1.0.2: + es-shim-unscopables@1.1.0: dependencies: hasown: 2.0.2 @@ -7154,64 +7524,37 @@ snapshots: esast-util-from-js@2.0.1: dependencies: '@types/estree-jsx': 1.0.5 - acorn: 8.14.0 + acorn: 8.15.0 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: + esbuild@0.25.5: 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/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: {} @@ -7225,28 +7568,129 @@ snapshots: optionalDependencies: source-map: 0.6.1 - eslint-config-prettier@10.0.1(eslint@9.20.0): + eslint-config-prettier@10.1.5(eslint@9.30.1): + dependencies: + eslint: 9.30.1 + + eslint-import-context@0.1.9(unrs-resolver@1.10.1): + dependencies: + get-tsconfig: 4.10.1 + stable-hash-x: 0.2.0 + optionalDependencies: + unrs-resolver: 1.10.1 + + 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.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-x: 0.2.0 + tinyglobby: 0.2.14 + unrs-resolver: 1.10.1 + optionalDependencies: + 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.6.0(eslint@9.30.1): + dependencies: + 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.8 + 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.3.0(eslint@9.30.1): + dependencies: + eslint: 9.30.1 + is-glob: 4.0.3 + micromatch: 4.0.8 + + 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/types': 8.35.1 + comment-parser: 1.4.1 + debug: 4.4.1 + eslint: 9.30.1 + eslint-import-context: 0.1.9(unrs-resolver@1.10.1) + is-glob: 4.0.3 + minimatch: 10.0.3 + semver: 7.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 + + eslint-plugin-jsdoc@51.3.3(eslint@9.30.1): + dependencies: + '@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.30.1 + espree: 10.4.0 + esquery: 1.6.0 + parse-imports-exports: 0.2.4 + semver: 7.7.2 + spdx-expression-parse: 4.0.0 + transitivePeerDependencies: + - supports-color + + eslint-plugin-mdx@3.6.0(eslint@9.30.1): dependencies: - eslint: 9.20.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.8 + 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.1.0(eslint@9.20.0): + eslint-plugin-react-hooks@5.2.0(eslint@9.30.1): dependencies: - eslint: 9.20.0 + eslint: 9.30.1 - eslint-plugin-react@7.37.4(eslint@9.20.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.20.0 + eslint: 9.30.1 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 @@ -7255,43 +7699,44 @@ 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.5.4(eslint@9.30.1)(turbo@2.5.4): dependencies: dotenv: 16.0.3 - eslint: 9.20.0 - turbo: 2.4.0 + eslint: 9.30.1 + turbo: 2.5.4 - eslint-scope@8.2.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.20.0: + eslint@9.30.1: dependencies: - '@eslint-community/eslint-utils': 4.4.1(eslint@9.20.0) + '@eslint-community/eslint-utils': 4.7.0(eslint@9.30.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/config-array': 0.21.0 + '@eslint/config-helpers': 0.3.0 + '@eslint/core': 0.14.0 + '@eslint/eslintrc': 3.3.1 + '@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.1 - '@types/estree': 1.0.6 + '@humanwhocodes/retry': 0.4.3 + '@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.0 + debug: 4.4.1 escape-string-regexp: 4.0.0 - eslint-scope: 8.2.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 @@ -7311,11 +7756,11 @@ snapshots: esm@3.2.25: {} - espree@10.3.0: + espree@10.4.0: dependencies: - acorn: 8.14.0 - acorn-jsx: 5.3.2(acorn@8.14.0) - 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: {} @@ -7331,7 +7776,7 @@ snapshots: estree-util-attach-comments@3.0.0: dependencies: - '@types/estree': 1.0.6 + '@types/estree': 1.0.8 estree-util-build-jsx@3.0.1: dependencies: @@ -7346,7 +7791,7 @@ snapshots: estree-util-scope@1.0.0: dependencies: - '@types/estree': 1.0.6 + '@types/estree': 1.0.8 devlop: 1.1.0 estree-util-to-js@2.0.0: @@ -7355,13 +7800,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.8 estree-util-visit@2.0.0: dependencies: @@ -7370,12 +7811,10 @@ snapshots: estree-walker@3.0.3: dependencies: - '@types/estree': 1.0.6 + '@types/estree': 1.0.8 esutils@2.0.3: {} - eventemitter2@0.4.14: {} - eventemitter2@5.0.1: {} eventemitter2@6.4.9: {} @@ -7404,6 +7843,10 @@ snapshots: signal-exit: 4.1.0 strip-final-newline: 3.0.0 + expect-type@1.2.1: {} + + exsolve@1.0.7: {} + extend@3.0.2: {} extendable-error@0.1.7: {} @@ -7467,27 +7910,27 @@ snapshots: fast-uri@3.0.6: {} - fastify@5.2.1: + fastify@5.4.0: dependencies: '@fastify/ajv-compiler': 4.0.2 - '@fastify/error': 4.0.0 - '@fastify/fast-json-stringify-compiler': 5.0.2 + '@fastify/error': 4.2.0 + '@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 - light-my-request: 6.5.1 - pino: 9.6.0 - process-warning: 4.0.1 + find-my-way: 9.3.0 + light-my-request: 6.6.0 + pino: 9.7.0 + 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.0: + fastq@1.19.1: dependencies: - reusify: 1.0.4 + reusify: 1.1.0 fault@2.0.1: dependencies: @@ -7495,7 +7938,7 @@ snapshots: fclone@1.0.11: {} - fdir@6.4.3(picomatch@4.0.2): + fdir@6.4.6(picomatch@4.0.2): optionalDependencies: picomatch: 4.0.2 @@ -7507,11 +7950,11 @@ snapshots: dependencies: to-regex-range: 5.0.1 - find-my-way@9.2.0: + 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: @@ -7525,28 +7968,30 @@ 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 - foreground-child@3.3.0: + foreground-child@3.3.1: dependencies: cross-spawn: 7.0.6 signal-exit: 4.1.0 - form-data@4.0.1: + 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: {} @@ -7574,7 +8019,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 @@ -7582,11 +8027,9 @@ snapshots: functions-have-names@1.2.3: {} - generic-pool@3.9.0: {} - - get-intrinsic@1.2.7: + get-intrinsic@1.3.0: 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 @@ -7602,19 +8045,17 @@ 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: {} 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.2.7 + get-intrinsic: 1.3.0 - get-tsconfig@4.10.0: + get-tsconfig@4.10.1: dependencies: resolve-pkg-maps: 1.0.0 @@ -7622,11 +8063,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: @@ -7646,7 +8087,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 @@ -7655,7 +8096,9 @@ snapshots: globals@14.0.0: {} - globals@15.14.0: {} + globals@15.15.0: {} + + globals@16.3.0: {} globalthis@1.0.4: dependencies: @@ -7704,7 +8147,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 +8161,18 @@ snapshots: dependencies: '@types/hast': 3.0.4 devlop: 1.1.0 - hast-util-from-parse5: 8.0.2 - parse5: 7.2.1 + hast-util-from-parse5: 8.0.3 + parse5: 7.3.0 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.1.0 vfile: 6.0.3 vfile-location: 5.0.3 web-namespaces: 2.0.1 @@ -7747,20 +8190,20 @@ 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 - parse5: 7.2.1 + parse5: 7.3.0 unist-util-position: 5.0.0 unist-util-visit: 5.0.0 vfile: 6.0.3 web-namespaces: 2.0.1 zwitch: 2.0.4 - hast-util-to-estree@3.1.1: + hast-util-to-estree@3.1.3: dependencies: - '@types/estree': 1.0.6 + '@types/estree': 1.0.8 '@types/estree-jsx': 1.0.5 '@types/hast': 3.0.4 comma-separated-tokens: 2.0.3 @@ -7771,15 +8214,15 @@ 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.1.0 space-separated-tokens: 2.0.2 - style-to-object: 1.0.8 + style-to-js: 1.1.17 unist-util-position: 5.0.0 zwitch: 2.0.4 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,14 +8231,14 @@ 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.1.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.6: dependencies: - '@types/estree': 1.0.6 + '@types/estree': 1.0.8 '@types/hast': 3.0.4 '@types/unist': 3.0.3 comma-separated-tokens: 2.0.3 @@ -7805,9 +8248,9 @@ 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.1.0 space-separated-tokens: 2.0.2 - style-to-object: 1.0.8 + style-to-js: 1.1.17 unist-util-position: 5.0.0 vfile-message: 4.0.2 transitivePeerDependencies: @@ -7838,33 +8281,37 @@ 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.1.0 space-separated-tokens: 2.0.2 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: 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 - human-id@1.0.2: {} + human-id@4.1.1: {} human-signals@2.1.0: {} @@ -7880,15 +8327,25 @@ snapshots: ignore@5.3.2: {} + ignore@6.0.2: {} + + ignore@7.0.5: {} + 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: @@ -7918,8 +8375,10 @@ snapshots: is-array-buffer@3.0.5: dependencies: call-bind: 1.0.8 - call-bound: 1.0.3 - get-intrinsic: 1.2.7 + call-bound: 1.0.4 + get-intrinsic: 1.3.0 + + is-arrayish@0.2.1: {} is-arrayish@0.3.2: optional: true @@ -7927,7 +8386,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 @@ -7942,9 +8401,13 @@ snapshots: is-boolean-object@1.2.2: dependencies: - call-bound: 1.0.3 + 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: @@ -7953,13 +8416,13 @@ snapshots: is-data-view@1.0.2: dependencies: - call-bound: 1.0.3 - get-intrinsic: 1.2.7 + 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: {} @@ -7968,17 +8431,19 @@ snapshots: is-docker@3.0.0: {} + is-empty@1.2.0: {} + is-extglob@2.1.1: {} 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 @@ -7995,22 +8460,22 @@ snapshots: is-map@2.0.3: {} + is-negative-zero@2.0.3: {} + 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: {} - is-plain-obj@3.0.0: {} - is-plain-obj@4.1.0: {} is-port-reachable@4.0.0: {} 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 @@ -8019,7 +8484,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: {} @@ -8027,7 +8492,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: @@ -8036,24 +8501,26 @@ 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 is-typed-array@1.1.15: dependencies: - which-typed-array: 1.1.18 + which-typed-array: 1.1.19 is-weakmap@2.0.2: {} 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 - get-intrinsic: 1.2.7 + call-bound: 1.0.4 + get-intrinsic: 1.3.0 + + is-what@4.1.16: {} is-windows@1.0.2: {} @@ -8073,11 +8540,13 @@ snapshots: isexe@2.0.0: {} + isexe@3.1.1: {} + iterator.prototype@1.1.5: 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 @@ -8099,6 +8568,8 @@ snapshots: js-tokens@4.0.0: {} + js-tokens@9.0.1: {} + js-yaml@3.14.1: dependencies: argparse: 1.0.10 @@ -8110,8 +8581,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 @@ -8131,12 +8606,12 @@ 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 - katex@0.16.21: + katex@0.16.22: dependencies: commander: 8.3.0 @@ -8146,9 +8621,11 @@ snapshots: khroma@2.1.0: {} + kleur@4.1.5: {} + 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) @@ -8160,29 +8637,31 @@ snapshots: layout-base@2.0.1: {} - lazy@1.0.11: {} - levn@0.4.1: dependencies: 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 set-cookie-parser: 2.7.1 - lilconfig@3.1.3: {} - - lines-and-columns@1.2.4: {} + lines-and-columns@2.0.4: {} - load-tsconfig@0.2.5: {} + load-plugin@6.0.3: + dependencies: + '@npmcli/config': 8.3.4 + import-meta-resolve: 4.1.0 + transitivePeerDependencies: + - bluebird - local-pkg@1.0.0: + local-pkg@1.1.1: dependencies: mlly: 1.7.4 - pkg-types: 1.3.1 + pkg-types: 2.2.0 + quansync: 0.2.10 locate-path@5.0.0: dependencies: @@ -8196,8 +8675,6 @@ snapshots: lodash.merge@4.6.2: {} - lodash.sortby@4.7.0: {} - lodash.startcase@4.4.0: {} lodash@4.17.21: {} @@ -8208,19 +8685,27 @@ snapshots: dependencies: js-tokens: 4.0.0 + loupe@3.1.4: {} + lru-cache@10.4.3: {} + lru-cache@11.1.0: {} + lru-cache@6.0.0: dependencies: yallist: 4.0.0 lru-cache@7.18.3: {} + magic-string@0.30.17: + dependencies: + '@jridgewell/sourcemap-codec': 1.5.4 + markdown-extensions@2.0.0: {} markdown-table@3.0.4: {} - marked@13.0.3: {} + marked@15.0.12: {} math-intrinsics@1.1.0: {} @@ -8229,7 +8714,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: @@ -8242,15 +8727,15 @@ snapshots: dependencies: '@types/mdast': 4.0.4 '@types/unist': 3.0.3 - decode-named-character-reference: 1.0.2 + decode-named-character-reference: 1.2.0 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 @@ -8274,7 +8759,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 +8796,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 @@ -8421,36 +8906,36 @@ snapshots: merge2@1.4.1: {} - mermaid@11.4.1: + mermaid@11.8.0: dependencies: '@braintree/sanitize-url': 7.1.1 '@iconify/utils': 2.3.0 - '@mermaid-js/parser': 0.3.0 + '@mermaid-js/parser': 0.6.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.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.6 + katex: 0.16.22 khroma: 2.1.0 lodash-es: 4.17.21 - marked: 13.0.3 + marked: 15.0.12 roughjs: 4.6.6 stylis: 4.3.6 ts-dedent: 2.2.0 - uuid: 9.0.1 + uuid: 11.1.0 transitivePeerDependencies: - supports-color mhchemparser@4.2.1: {} - micromark-core-commonmark@2.0.2: + micromark-core-commonmark@2.0.3: dependencies: - decode-named-character-reference: 1.0.2 + decode-named-character-reference: 1.2.0 devlop: 1.1.0 micromark-factory-destination: 2.0.1 micromark-factory-label: 2.0.1 @@ -8463,34 +8948,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: @@ -8499,7 +8984,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: @@ -8507,11 +8992,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: @@ -8519,7 +9004,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: @@ -8530,118 +9015,117 @@ 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: '@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.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.8 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.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.8 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.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 + '@types/estree': 1.0.8 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-events-to-acorn: 2.0.3 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-extension-mdxjs@3.0.0: dependencies: - acorn: 8.14.0 - acorn-jsx: 5.3.2(acorn@8.14.0) - micromark-extension-mdx-expression: 3.0.0 - micromark-extension-mdx-jsx: 3.0.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 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: + micromark-factory-mdx-expression@2.0.3: dependencies: - '@types/estree': 1.0.6 + '@types/estree': 1.0.8 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.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: @@ -8651,12 +9135,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: @@ -8664,22 +9148,21 @@ snapshots: micromark-util-decode-string@2.0.1: dependencies: - decode-named-character-reference: 1.0.2 + 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 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.8 '@types/unist': 3.0.3 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: {} @@ -8690,7 +9173,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: @@ -8698,24 +9181,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 + debug: 4.4.1 + decode-named-character-reference: 1.2.0 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 @@ -8725,9 +9208,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 @@ -8740,7 +9223,7 @@ snapshots: mime-db@1.52.0: {} - mime-db@1.53.0: {} + mime-db@1.54.0: {} mime-types@2.1.18: dependencies: @@ -8754,13 +9237,17 @@ snapshots: mimic-fn@4.0.0: {} + minimatch@10.0.3: + dependencies: + '@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: {} @@ -8772,12 +9259,12 @@ snapshots: mlly@1.7.4: dependencies: - acorn: 8.14.0 - pathe: 2.0.2 + acorn: 8.15.0 + 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: {} @@ -8787,13 +9274,9 @@ 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.11: {} - nanoid@3.3.8: {} + napi-postinstall@0.3.0: {} natural-compare@1.4.0: {} @@ -8811,151 +9294,97 @@ snapshots: netmask@2.0.2: {} - next-themes@0.4.4(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@14.2.15(@playwright/test@1.50.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): - dependencies: - '@next/env': 14.2.15 - '@swc/helpers': 0.5.5 - busboy: 1.6.0 - caniuse-lite: 1.0.30001698 - 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): + next-themes@0.4.6(react-dom@19.1.0(react@19.1.0))(react@19.1.0): dependencies: - '@next/env': 14.2.15 - '@swc/helpers': 0.5.5 - busboy: 1.6.0 - caniuse-lite: 1.0.30001698 - 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 + react: 19.1.0 + react-dom: 19.1.0(react@19.1.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.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.1.6 - '@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.30001698 + caniuse-lite: 1.0.30001726 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.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 - '@playwright/test': 1.50.1 - sharp: 0.33.5 + '@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.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.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.0(react-dom@19.0.0(react@19.0.0))(react@19.0.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.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) - 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.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.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.1 - zod-validation-error: 3.4.0(zod@3.24.1) - zustand: 5.0.3(@types/react@19.0.8)(react@19.0.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.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.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.5.10 - '@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) + '@formatjs/intl-localematcher': 0.6.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.3.2(typescript@5.7.3) - '@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.1 - katex: 0.16.21 + hast-util-to-estree: 3.1.3 + katex: 0.16.22 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) + 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) + 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.0(shiki@2.3.2) + rehype-pretty-code: 0.14.1(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-reading-time: 2.0.2 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) + yaml: 2.8.0 + zod: 3.25.72 + zod-validation-error: 3.5.2(zod@3.25.72) transitivePeerDependencies: - acorn - supports-color @@ -8965,8 +9394,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.2 + validate-npm-package-license: 3.0.4 + normalize-path@3.0.0: {} + npm-install-checks@6.3.0: + dependencies: + semver: 7.7.2 + + 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.2 + 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.2 + npm-run-path@4.0.1: dependencies: path-key: 3.1.1 @@ -8977,11 +9436,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: {} @@ -8991,15 +9445,16 @@ 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 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 @@ -9007,13 +9462,13 @@ 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: 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 @@ -9033,7 +9488,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 @@ -9054,7 +9509,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 @@ -9082,11 +9537,11 @@ 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 - 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 @@ -9102,7 +9557,11 @@ snapshots: package-json-from-dist@1.0.1: {} - package-manager-detector@0.2.9: {} + package-manager-detector@0.2.11: + dependencies: + quansync: 0.2.10 + + package-manager-detector@1.3.0: {} pagefind@1.3.0: optionalDependencies: @@ -9123,11 +9582,23 @@ 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.2.0 is-alphanumerical: 2.0.1 is-decimal: 2.0.1 is-hexadecimal: 2.0.1 + parse-imports-exports@0.2.4: + dependencies: + parse-statements: 1.0.11 + + parse-json@7.1.1: + dependencies: + '@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 + type-fest: 3.13.1 + parse-latin@7.0.0: dependencies: '@types/nlcst': 2.0.3 @@ -9139,9 +9610,11 @@ 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.1 path-data-parser@0.1.0: {} @@ -9164,7 +9637,9 @@ snapshots: path-type@4.0.0: {} - pathe@2.0.2: {} + pathe@2.0.3: {} + + pathval@2.0.1: {} picocolors@1.1.1: {} @@ -9198,46 +9673,50 @@ 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 - pirates@4.0.6: {} - pkg-types@1.3.1: dependencies: confbox: 0.1.8 mlly: 1.7.4 - pathe: 2.0.2 + pathe: 2.0.3 + + pkg-types@2.2.0: + dependencies: + confbox: 0.2.2 + exsolve: 1.0.7 + pathe: 2.0.3 - playwright-core@1.50.1: {} + playwright-core@1.53.2: {} - playwright@1.50.1: + playwright@1.53.2: dependencies: - playwright-core: 1.50.1 + playwright-core: 1.53.2 optionalDependencies: fsevents: 2.3.2 pm2-axon-rpc@0.7.1: dependencies: - debug: 4.4.0 + debug: 4.4.1 transitivePeerDependencies: - supports-color @@ -9245,7 +9724,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 @@ -9262,29 +9741,29 @@ 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 + systeminformation: 5.27.7 tx2: 1.0.5 transitivePeerDependencies: - supports-color optional: true - pm2@5.4.3: + pm2@6.0.8: 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 + ansis: 4.0.0-node10 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 @@ -9297,7 +9776,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 @@ -9317,35 +9796,44 @@ 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@8.4.31: dependencies: - lilconfig: 3.1.3 - optionalDependencies: - postcss: 8.4.31 - tsx: 4.19.2 - yaml: 2.7.0 + nanoid: 3.3.11 + picocolors: 1.1.1 + source-map-js: 1.2.1 - postcss@8.4.31: + postcss@8.5.6: dependencies: - nanoid: 3.3.8 + nanoid: 3.3.11 picocolors: 1.1.1 source-map-js: 1.2.1 prelude-ls@1.2.1: {} - prettier-plugin-packagejson@2.5.8(prettier@3.4.2): + prettier-plugin-packagejson@2.5.18(prettier@3.6.2): dependencies: - sort-package-json: 2.14.0 - synckit: 0.9.2 + sort-package-json: 3.4.0 + synckit: 0.11.8 optionalDependencies: - prettier: 3.4.2 + prettier: 3.6.2 prettier@2.8.8: {} - prettier@3.4.2: {} + prettier@3.6.2: {} + + proc-log@4.2.0: {} process-warning@4.0.1: {} + process-warning@5.0.0: {} + + 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 @@ -9358,14 +9846,16 @@ snapshots: property-information@6.5.0: {} - proxy-agent@6.3.1: + property-information@7.1.0: {} + + 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 - 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: @@ -9373,13 +9863,15 @@ 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: {} + quansync@0.2.10: {} + queue-microtask@1.2.3: {} quick-format-unescaped@4.0.4: {} @@ -9393,33 +9885,28 @@ snapshots: minimist: 1.2.8 strip-json-comments: 2.0.1 - react-compiler-runtime@0.0.0-experimental-22c6e49-20241219(react@19.0.0): - dependencies: - react: 19.0.0 - - react-dom@18.3.1(react@18.3.1): + react-compiler-runtime@0.0.0-experimental-22c6e49-20241219(react@19.1.0): dependencies: - loose-envify: 1.4.0 - react: 18.3.1 - scheduler: 0.23.2 + 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.13(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@18.3.1: - dependencies: - loose-envify: 1.4.0 + react@19.1.0: {} - 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: @@ -9432,25 +9919,29 @@ 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 - readdirp@4.1.1: {} - reading-time@1.5.0: {} real-require@0.2.0: {} recma-build-jsx@1.0.0: dependencies: - '@types/estree': 1.0.6 + '@types/estree': 1.0.8 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.15.0): dependencies: - acorn-jsx: 5.3.2(acorn@8.14.0) + 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 @@ -9460,40 +9951,37 @@ snapshots: recma-parse@1.0.0: dependencies: - '@types/estree': 1.0.6 + '@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.6 + '@types/estree': 1.0.8 estree-util-to-js: 2.0.0 unified: 11.0.5 vfile: 6.0.3 - redis@4.7.0: + redis@5.5.6: 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.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.2.7 + get-intrinsic: 1.3.0 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 @@ -9528,7 +10016,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 @@ -9538,13 +10026,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.1(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 @@ -9556,9 +10044,9 @@ snapshots: rehype-recma@1.0.0: dependencies: - '@types/estree': 1.0.6 + '@types/estree': 1.0.8 '@types/hast': 3.0.4 - hast-util-to-estree: 3.1.1 + hast-util-to-estree: 3.1.3 transitivePeerDependencies: - supports-color @@ -9571,10 +10059,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 @@ -9602,19 +10090,19 @@ 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 - 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 @@ -9639,8 +10127,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 @@ -9690,35 +10178,38 @@ snapshots: retext-stringify: 4.0.0 unified: 11.0.5 - reusify@1.0.4: {} + retry@0.12.0: {} + + reusify@1.1.0: {} rfdc@1.4.1: {} robust-predicates@3.0.2: {} - rollup@4.34.6: + rollup@4.44.1: dependencies: - '@types/estree': 1.0.6 + '@types/estree': 1.0.8 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.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: @@ -9736,11 +10227,15 @@ 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 - call-bound: 1.0.3 - get-intrinsic: 1.2.7 + call-bound: 1.0.4 + get-intrinsic: 1.3.0 has-symbols: 1.1.0 isarray: 2.0.5 @@ -9755,11 +10250,11 @@ 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 - safe-regex2@4.0.1: + safe-regex2@5.0.0: dependencies: ret: 0.5.0 @@ -9769,11 +10264,7 @@ snapshots: sax@1.4.1: {} - scheduler@0.23.2: - dependencies: - loose-envify: 1.4.0 - - scheduler@0.25.0: {} + scheduler@0.26.0: {} scroll-into-view-if-needed@3.1.0: dependencies: @@ -9781,7 +10272,7 @@ snapshots: secure-json-parse@2.7.0: {} - secure-json-parse@3.0.2: {} + secure-json-parse@4.0.0: {} semver@6.3.1: {} @@ -9789,7 +10280,7 @@ snapshots: dependencies: lru-cache: 6.0.0 - semver@7.7.1: {} + semver@7.7.2: {} serve-handler@6.1.6: dependencies: @@ -9824,7 +10315,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 @@ -9841,31 +10332,33 @@ snapshots: es-errors: 1.3.0 es-object-atoms: 1.1.1 - sharp@0.33.5: + sharp@0.34.2: 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.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 + '@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.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: @@ -9874,15 +10367,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: {} @@ -9894,16 +10387,16 @@ 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.2.7 + 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.2.7 + get-intrinsic: 1.3.0 object-inspect: 1.13.4 side-channel-map: 1.0.1 @@ -9915,6 +10408,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: {} @@ -9933,12 +10428,12 @@ snapshots: socks-proxy-agent@8.0.5: dependencies: agent-base: 7.1.3 - debug: 4.4.0 - socks: 2.8.3 + debug: 4.4.1 + socks: 2.8.5 transitivePeerDependencies: - supports-color - socks@2.8.3: + socks@2.8.5: dependencies: ip-address: 9.0.5 smart-buffer: 4.2.0 @@ -9949,16 +10444,15 @@ snapshots: sort-object-keys@1.1.3: {} - sort-package-json@2.14.0: + sort-package-json@3.4.0: 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.10 + tinyglobby: 0.2.14 source-map-js@1.2.1: {} @@ -9971,10 +10465,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: @@ -9982,11 +10472,30 @@ snapshots: cross-spawn: 7.0.6 signal-exit: 4.1.0 - speech-rule-engine@4.0.7: + 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: - commander: 9.2.0 + 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.1.2: + dependencies: + '@xmldom/xmldom': 0.9.8 + commander: 13.1.0 wicked-good-xpath: 1.3.0 - xmldom-sre: 0.1.31 split2@4.2.0: {} @@ -9996,7 +10505,16 @@ snapshots: sprintf-js@1.1.3: {} - streamsearch@1.1.0: {} + stable-hash-x@0.2.0: {} + + stackback@0.0.2: {} + + std-env@3.9.0: {} + + stop-iteration-iterator@1.1.0: + dependencies: + es-errors: 1.3.0 + internal-slot: 1.1.0 string-width@4.2.3: dependencies: @@ -10010,15 +10528,21 @@ 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 - call-bound: 1.0.3 + 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.2.7 + get-intrinsic: 1.3.0 gopd: 1.2.0 has-symbols: 1.1.0 internal-slot: 1.1.0 @@ -10029,22 +10553,22 @@ 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: 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 + es-abstract: 1.24.0 es-object-atoms: 1.1.1 has-property-descriptors: 1.0.2 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 @@ -10054,6 +10578,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 @@ -10077,76 +10605,71 @@ snapshots: strip-json-comments@3.1.1: {} - style-to-object@1.0.8: + strip-literal@3.0.0: dependencies: - inline-style-parser: 0.2.4 + js-tokens: 9.0.1 - styled-jsx@5.1.1(react@18.3.1): + style-to-js@1.1.17: dependencies: - client-only: 0.0.1 - react: 18.3.1 + style-to-object: 1.0.9 - styled-jsx@5.1.1(react@19.0.0): + style-to-object@1.0.9: dependencies: - client-only: 0.0.1 - react: 19.0.0 + 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: {} - 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: has-flag: 4.0.0 + supports-color@9.4.0: {} + supports-preserve-symlinks-flag@1.0.0: {} - synckit@0.9.2: + synckit@0.11.8: dependencies: - '@pkgr/core': 0.1.1 - 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: {} 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 + tinybench@2.9.0: {} + tinyexec@0.3.2: {} - tinyglobby@0.2.10: + tinyexec@1.0.1: {} + + tinyglobby@0.2.14: dependencies: - fdir: 6.4.3(picomatch@4.0.2) + fdir: 6.4.6(picomatch@4.0.2) picomatch: 4.0.2 + tinypool@1.1.1: {} + + tinyrainbow@2.0.0: {} + + tinyspy@4.0.3: {} + title@4.0.1: dependencies: arg: 5.0.2 @@ -10163,98 +10686,63 @@ 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: {} - ts-api-utils@2.0.1(typescript@5.7.3): + ts-api-utils@2.1.0(typescript@5.8.3): dependencies: - typescript: 5.7.3 + typescript: 5.8.3 ts-dedent@2.2.0: {} - ts-interface-checker@0.1.13: {} - tslib@1.9.3: {} tslib@2.8.1: {} - tsup@8.3.6(postcss@8.4.31)(tsx@4.19.2)(typescript@5.7.3)(yaml@2.7.0): - dependencies: - bundle-require: 5.1.0(esbuild@0.24.2) - cac: 6.7.14 - chokidar: 4.0.3 - consola: 3.4.0 - debug: 4.4.0 - 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) - resolve-from: 5.0.0 - rollup: 4.34.6 - source-map: 0.8.0-beta.0 - sucrase: 3.35.0 - tinyexec: 0.3.2 - tinyglobby: 0.2.10 - tree-kill: 1.2.2 - optionalDependencies: - postcss: 8.4.31 - typescript: 5.7.3 - transitivePeerDependencies: - - jiti - - supports-color - - tsx - - yaml - - tsx@4.19.2: + tsx@4.20.3: dependencies: - esbuild: 0.23.1 - get-tsconfig: 4.10.0 + esbuild: 0.25.5 + get-tsconfig: 4.10.1 optionalDependencies: fsevents: 2.3.3 - turbo-darwin-64@2.4.0: + turbo-darwin-64@2.5.4: optional: true - turbo-darwin-arm64@2.4.0: + turbo-darwin-arm64@2.5.4: optional: true - turbo-linux-64@2.4.0: + turbo-linux-64@2.5.4: optional: true - turbo-linux-arm64@2.4.0: + turbo-linux-arm64@2.5.4: optional: true - turbo-windows-64@2.4.0: + turbo-windows-64@2.5.4: optional: true - turbo-windows-arm64@2.4.0: + turbo-windows-arm64@2.5.4: optional: true - turbo@2.4.0: + turbo@2.5.4: 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.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: {} twoslash-protocol@0.2.12: {} - twoslash@0.2.12(typescript@5.7.3): + twoslash@0.2.12(typescript@5.8.3): dependencies: - '@typescript/vfs': 1.6.1(typescript@5.7.3) + '@typescript/vfs': 1.6.1(typescript@5.8.3) twoslash-protocol: 0.2.12 - typescript: 5.7.3 + typescript: 5.8.3 transitivePeerDependencies: - supports-color @@ -10269,16 +10757,18 @@ snapshots: type-fest@2.19.0: {} + type-fest@3.13.1: {} + 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 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 +10777,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,34 +10786,65 @@ 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): + typedarray@0.0.6: {} + + typescript-eslint@8.35.1(eslint@9.30.1)(typescript@5.8.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: 5.7.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) + '@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 - typescript@5.7.3: {} + typescript@5.8.3: {} - ufo@1.5.4: {} + ufo@1.6.1: {} 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 - undici-types@6.20.0: {} + 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.16.0 + '@types/unist': 3.0.3 + concat-stream: 2.0.0 + debug: 4.4.1 + 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.8.0 + transitivePeerDependencies: + - bluebird + - supports-color unified@11.0.5: dependencies: @@ -10340,6 +10861,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 @@ -10404,6 +10929,30 @@ snapshots: universalify@0.1.2: {} + unrs-resolver@1.10.1: + dependencies: + napi-postinstall: 0.3.0 + optionalDependencies: + '@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: registry-auth-token: 3.3.2 @@ -10413,7 +10962,27 @@ snapshots: dependencies: punycode: 2.3.1 - uuid@9.0.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: {} + + 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: {} @@ -10427,11 +10996,109 @@ 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 vfile-message: 4.0.2 + 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: 7.0.2(@types/node@24.0.10)(tsx@4.20.3)(yaml@2.8.0) + transitivePeerDependencies: + - '@types/node' + - jiti + - less + - lightningcss + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + - tsx + - yaml + + vite@7.0.2(@types/node@24.0.10)(tsx@4.20.3)(yaml@2.8.0): + dependencies: + esbuild: 0.25.5 + fdir: 6.4.6(picomatch@4.0.2) + picomatch: 4.0.2 + postcss: 8.5.6 + rollup: 4.44.1 + tinyglobby: 0.2.14 + optionalDependencies: + '@types/node': 24.0.10 + fsevents: 2.3.3 + tsx: 4.20.3 + 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: + '@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.14 + tinypool: 1.1.1 + tinyrainbow: 2.0.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': 24.0.10 + transitivePeerDependencies: + - jiti + - less + - lightningcss + - msw + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + - tsx + - yaml + vizion@2.2.1: dependencies: async: 2.6.4 @@ -10456,15 +11123,9 @@ snapshots: vscode-uri@3.0.8: {} - web-namespaces@2.0.1: {} - - webidl-conversions@4.0.2: {} + walk-up-path@3.0.1: {} - whatwg-url@7.1.0: - dependencies: - lodash.sortby: 4.7.0 - tr46: 1.0.1 - webidl-conversions: 4.0.2 + web-namespaces@2.0.1: {} which-boxed-primitive@1.1.1: dependencies: @@ -10476,7 +11137,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 @@ -10488,7 +11149,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: @@ -10497,12 +11158,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.3 - for-each: 0.3.4 + call-bound: 1.0.4 + for-each: 0.3.5 + get-proto: 1.0.1 gopd: 1.2.0 has-tostringtag: 1.0.2 @@ -10510,6 +11172,15 @@ 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 + stackback: 0.0.2 + wicked-good-xpath@1.3.0: {} widest-line@4.0.1: @@ -10534,23 +11205,22 @@ 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.1): + zod-validation-error@3.5.2(zod@3.25.72): dependencies: - zod: 3.24.1 + zod: 3.25.72 - zod@3.24.1: {} + zod@3.25.72: {} - zustand@5.0.3(@types/react@19.0.8)(react@19.0.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.0.8 - react: 19.0.0 + '@types/react': 19.1.8 + 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 11681b62..91bd5830 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: + - esbuild + - sharp + - unrs-resolver diff --git a/turbo.json b/turbo.json index 01189b5f..10a3a927 100644 --- a/turbo.json +++ b/turbo.json @@ -6,12 +6,14 @@ "tasks": { "build": { "dependsOn": ["^build"], + "cache": false, "env": [ "REDIS_URL", "REMOTE_CACHE_SERVER_BASE_URL", "SERVER_STARTED", "PORT", - "PPR_ENABLED" + "PPR_ENABLED", + "NEXT_PRIVATE_DEBUG_CACHE" ], "outputs": [".next/**", "!.next/cache/**", "dist/**", "out/**"] }, @@ -19,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 @@ -48,6 +48,9 @@ "dev:docs": { "cache": false, "persistent": true + }, + "check-types": { + "cache": false } } }