diff --git a/apis/cloudflare/wrangler-template.toml b/apis/cloudflare/wrangler-template.toml index 140710cc..c9867917 100644 --- a/apis/cloudflare/wrangler-template.toml +++ b/apis/cloudflare/wrangler-template.toml @@ -1,7 +1,7 @@ name = "proxy" main = "src/index.ts" -compatibility_date = "2024-09-23" -compatibility_flags = ["nodejs_compat_v2"] +compatibility_date = "2025-08-15" +compatibility_flags = ["nodejs_compat"] kv_namespaces = [ # Configure this id to map to the id returned from diff --git a/apis/vercel/app/api/ping/route.ts b/apis/vercel/app/api/ping/route.ts new file mode 100644 index 00000000..38515431 --- /dev/null +++ b/apis/vercel/app/api/ping/route.ts @@ -0,0 +1,22 @@ +import { kv } from "@vercel/kv"; + +let i = 0; + +export const runtime = "nodejs"; +export const dynamic = "force-dynamic"; + +export async function GET() { + await kv.set("foo", `${i}`); + i += 1; + + await kv.get("foo"); + + return new Response(JSON.stringify({ success: true }), { + status: 200, + headers: { + "X-RateLimit-Limit": "0", + "X-RateLimit-Remaining": "0", + "X-RateLimit-Reset": "0", + }, + }); +} diff --git a/apis/vercel/app/api/v1/[...slug]/route.test.ts b/apis/vercel/app/api/v1/[...slug]/route.test.ts new file mode 100644 index 00000000..38908e6a --- /dev/null +++ b/apis/vercel/app/api/v1/[...slug]/route.test.ts @@ -0,0 +1,86 @@ +import { ProxyBadRequestError } from "@braintrust/proxy"; +import { beforeEach, describe, expect, it, vi } from "vitest"; + +const { proxyV1ToAppRouteResponseMock } = vi.hoisted(() => { + return { + proxyV1ToAppRouteResponseMock: vi.fn(), + }; +}); + +vi.mock("next/server", () => ({ + after: (callback: () => void | Promise) => { + void callback(); + }, +})); + +vi.mock("@vercel/kv", () => ({ + kv: { + get: vi.fn(), + set: vi.fn(), + }, +})); + +vi.mock("@braintrust/proxy/edge", () => ({ + digestMessage: vi.fn(async (message: string) => message), + encryptedGet: vi.fn(async () => null), + encryptedPut: vi.fn(async () => {}), + getCorsHeaders: vi.fn(() => ({})), + makeFetchApiSecrets: vi.fn(() => vi.fn(async () => [])), +})); + +vi.mock("../../../../lib/appRouteProxy", () => ({ + proxyV1ToAppRouteResponse: proxyV1ToAppRouteResponseMock, +})); + +describe("vercel app route proxy handler", () => { + beforeEach(() => { + proxyV1ToAppRouteResponseMock.mockReset(); + }); + + it("returns 400 for proxy bad request errors without exposing internal details", async () => { + proxyV1ToAppRouteResponseMock.mockRejectedValueOnce( + new ProxyBadRequestError("Missing Authentication header"), + ); + + const { POST } = await import("./route"); + const response = await POST( + new Request("https://example.com/api/v1/chat/completions", { + method: "POST", + headers: { + "content-type": "application/json", + "x-request-id": "caller-controlled", + }, + body: "{}", + }), + ); + + expect(response.status).toBe(400); + expect(response.headers.get("x-request-id")).toBeTruthy(); + expect(response.headers.get("x-request-id")).not.toBe("caller-controlled"); + await expect(response.json()).resolves.toMatchObject({ + error: "Internal server error", + }); + }); + + it("returns 500 for unexpected proxy errors", async () => { + proxyV1ToAppRouteResponseMock.mockRejectedValueOnce( + new Error("database unavailable"), + ); + + const { POST } = await import("./route"); + const response = await POST( + new Request("https://example.com/api/v1/chat/completions", { + method: "POST", + headers: { + "content-type": "application/json", + }, + body: "{}", + }), + ); + + expect(response.status).toBe(500); + await expect(response.json()).resolves.toMatchObject({ + error: "Internal server error", + }); + }); +}); diff --git a/apis/vercel/app/api/v1/[...slug]/route.ts b/apis/vercel/app/api/v1/[...slug]/route.ts new file mode 100644 index 00000000..700a185d --- /dev/null +++ b/apis/vercel/app/api/v1/[...slug]/route.ts @@ -0,0 +1,182 @@ +import dns from "node:dns"; + +import { after } from "next/server"; + +import { ProxyBadRequestError } from "@braintrust/proxy"; +import { + type CacheSetOptions, + digestMessage, + encryptedGet, + encryptedPut, + getCorsHeaders, + makeFetchApiSecrets, +} from "@braintrust/proxy/edge"; +import { kv } from "@vercel/kv"; +import { Agent, setGlobalDispatcher } from "undici"; + +import { proxyV1ToAppRouteResponse } from "../../../../lib/appRouteProxy"; + +const DNS_RESULT_ORDER = "ipv4first"; +const REQUEST_ID_HEADER = "x-request-id"; +const ACCESS_CONTROL_REQUEST_HEADERS_HEADER = "access-control-request-headers"; +const ACCESS_CONTROL_ALLOW_HEADERS_HEADER = "access-control-allow-headers"; +const ALLOW_METHODS_HEADER_VALUE = "GET, HEAD, POST, OPTIONS"; +const FORBIDDEN_RESPONSE_TEXT = "Forbidden"; +const INTERNAL_SERVER_ERROR_TEXT = "Internal server error"; +const API_V1_PATH_PREFIX = /^\/api\/v1/; +const DEFAULT_CACHE_TTL_SECONDS = 60 * 60 * 24 * 7; +const KEEP_ALIVE_TIMEOUT_MS = 1; + +dns.setDefaultResultOrder(DNS_RESULT_ORDER); + +setGlobalDispatcher( + new Agent({ + keepAliveTimeout: KEEP_ALIVE_TIMEOUT_MS, + keepAliveMaxTimeout: KEEP_ALIVE_TIMEOUT_MS, + }), +); + +export const runtime = "nodejs"; +export const dynamic = "force-dynamic"; + +const KVCache = { + get: (key: string) => kv.get(key), + set: async (key: string, value: T, opts: CacheSetOptions) => { + await kv.set(key, value, opts.ttl !== undefined ? { ex: opts.ttl } : {}); + }, +}; + +function normalizeHeaders(headers: Headers): Record { + const normalized: Record = {}; + + headers.forEach((value, name) => { + normalized[name] = value; + }); + + return normalized; +} + +function handleOptions(request: Request, corsHeaders: Record) { + const accessControlRequestHeaders = request.headers.get( + ACCESS_CONTROL_REQUEST_HEADERS_HEADER, + ); + + if ( + request.headers.get("origin") !== null && + request.headers.get("access-control-request-method") !== null && + accessControlRequestHeaders !== null + ) { + return new Response(null, { + status: 200, + headers: { + ...corsHeaders, + [ACCESS_CONTROL_ALLOW_HEADERS_HEADER]: accessControlRequestHeaders, + }, + }); + } + + return new Response(null, { + status: 200, + headers: { + Allow: ALLOW_METHODS_HEADER_VALUE, + }, + }); +} + +async function handleRequest(method: "GET" | "POST", request: Request) { + const requestId = crypto.randomUUID(); + const requestUrl = new URL(request.url); + + const backgroundTasks: Promise[] = []; + const trackBackgroundTask = (promise: Promise) => { + backgroundTasks.push(promise); + }; + + after(async () => { + await Promise.allSettled(backgroundTasks); + }); + + let corsHeaders = {}; + try { + corsHeaders = getCorsHeaders(request, undefined); + } catch { + return new Response(FORBIDDEN_RESPONSE_TEXT, { status: 403 }); + } + + const proxyHeaders = normalizeHeaders(request.headers); + const relativeURL = `${requestUrl.pathname.replace(API_V1_PATH_PREFIX, "")}${requestUrl.search}`; + const requestBody = method === "POST" ? await request.text() : ""; + const initialHeaders = { + ...corsHeaders, + [REQUEST_ID_HEADER]: requestId, + }; + + const fetchApiSecrets = makeFetchApiSecrets({ + ctx: { + waitUntil(promise) { + trackBackgroundTask(promise); + }, + }, + opts: { + getRelativeURL() { + return relativeURL; + }, + credentialsCache: KVCache, + braintrustApiUrl: process.env.BRAINTRUST_APP_URL, + nativeInferenceSecretKey: process.env.NATIVE_INFERENCE_SECRET_KEY, + }, + }); + + try { + const proxyResult = await proxyV1ToAppRouteResponse({ + method, + url: relativeURL, + proxyHeaders, + body: requestBody, + initialHeaders, + getApiSecrets: fetchApiSecrets, + cacheGet: async (encryptionKey, key) => { + return (await encryptedGet(KVCache, encryptionKey, key)) ?? null; + }, + cachePut: async (encryptionKey, key, value, ttlSeconds) => { + const putPromise = encryptedPut(KVCache, encryptionKey, key, value, { + ttl: ttlSeconds ?? DEFAULT_CACHE_TTL_SECONDS, + }); + trackBackgroundTask(putPromise); + return putPromise; + }, + digest: digestMessage, + }); + return proxyResult.response; + } catch (error) { + return Response.json( + { + error: INTERNAL_SERVER_ERROR_TEXT, + requestId, + }, + { + status: error instanceof ProxyBadRequestError ? 400 : 500, + headers: initialHeaders, + }, + ); + } +} + +export async function OPTIONS(request: Request) { + let corsHeaders = {}; + try { + corsHeaders = getCorsHeaders(request, undefined); + } catch { + return new Response(FORBIDDEN_RESPONSE_TEXT, { status: 403 }); + } + + return handleOptions(request, corsHeaders); +} + +export async function GET(request: Request) { + return handleRequest("GET", request); +} + +export async function POST(request: Request) { + return handleRequest("POST", request); +} diff --git a/apis/vercel/lib/appRouteProxy.test.ts b/apis/vercel/lib/appRouteProxy.test.ts new file mode 100644 index 00000000..d6266aab --- /dev/null +++ b/apis/vercel/lib/appRouteProxy.test.ts @@ -0,0 +1,166 @@ +import { describe, expect, it } from "vitest"; + +import { proxyV1ToAppRouteResponse } from "./appRouteProxy"; + +function createSettledTracker(promise: Promise) { + let settled = false; + promise.finally(() => { + settled = true; + }); + return () => settled; +} + +function createDeferred() { + let resolve: () => void = () => {}; + const promise = new Promise((resolver) => { + resolve = resolver; + }); + return { promise, resolve }; +} + +describe("proxyV1ToAppRouteResponse", () => { + it("reassembles split application/json chunks", async () => { + const { response, completed } = await proxyV1ToAppRouteResponse({ + method: "POST", + url: "/chat/completions", + proxyHeaders: {}, + body: "{}", + getApiSecrets: async () => [], + cacheGet: async () => null, + cachePut: async () => {}, + digest: async (message) => message, + proxyImpl: async ({ res, setHeader }) => { + setHeader("content-type", "application/json"); + const writer = res.getWriter(); + await writer.write(new TextEncoder().encode('{"ok":')); + await new Promise((resolve) => setTimeout(resolve, 20)); + await writer.write(new TextEncoder().encode('true,"parts":[1,2]}')); + await writer.close(); + }, + }); + + expect(response.headers.get("content-type")).toBe("application/json"); + expect(await response.json()).toEqual({ + ok: true, + parts: [1, 2], + }); + await expect(completed).resolves.toBeUndefined(); + }); + + it("streams split SSE frames for stream=true style responses", async () => { + const { response, completed } = await proxyV1ToAppRouteResponse({ + method: "POST", + url: "/chat/completions", + proxyHeaders: {}, + body: '{"stream":true}', + getApiSecrets: async () => [], + cacheGet: async () => null, + cachePut: async () => {}, + digest: async (message) => message, + proxyImpl: async ({ res, setHeader }) => { + setHeader("content-type", "text/event-stream"); + const writer = res.getWriter(); + await writer.write(new TextEncoder().encode('data: {"id":"chunk-1"')); + await new Promise((resolve) => setTimeout(resolve, 20)); + await writer.write(new TextEncoder().encode("}\n\n")); + await new Promise((resolve) => setTimeout(resolve, 20)); + await writer.write(new TextEncoder().encode("data: [DONE]\n\n")); + await writer.close(); + }, + }); + + expect(response.headers.get("content-type")).toBe("text/event-stream"); + expect(await response.text()).toBe( + 'data: {"id":"chunk-1"}\n\ndata: [DONE]\n\n', + ); + await expect(completed).resolves.toBeUndefined(); + }); + + it("returns the app route response before a split JSON stream finishes", async () => { + const secondChunk = createDeferred(); + + const result = await proxyV1ToAppRouteResponse({ + method: "POST", + url: "/chat/completions", + proxyHeaders: {}, + body: "{}", + getApiSecrets: async () => [], + cacheGet: async () => null, + cachePut: async () => {}, + digest: async (message) => message, + proxyImpl: async ({ res, setHeader }) => { + setHeader("content-type", "application/json"); + const writer = res.getWriter(); + await writer.write(new TextEncoder().encode('{"ok":')); + await secondChunk.promise; + await writer.write(new TextEncoder().encode("true}")); + await writer.close(); + }, + }); + + const isCompletedSettled = createSettledTracker(result.completed); + expect(isCompletedSettled()).toBe(false); + + const bodyPromise = result.response.text(); + await new Promise((resolve) => setTimeout(resolve, 10)); + expect(isCompletedSettled()).toBe(false); + + secondChunk.resolve(); + expect(await bodyPromise).toBe('{"ok":true}'); + await expect(result.completed).resolves.toBeUndefined(); + }); + + it("returns the app route response before a split SSE stream finishes", async () => { + const doneFrame = createDeferred(); + + const result = await proxyV1ToAppRouteResponse({ + method: "POST", + url: "/chat/completions", + proxyHeaders: {}, + body: '{"stream":true}', + getApiSecrets: async () => [], + cacheGet: async () => null, + cachePut: async () => {}, + digest: async (message) => message, + proxyImpl: async ({ res, setHeader }) => { + setHeader("content-type", "text/event-stream"); + const writer = res.getWriter(); + await writer.write( + new TextEncoder().encode('data: {"id":"chunk-1"}\n\n'), + ); + await doneFrame.promise; + await writer.write(new TextEncoder().encode("data: [DONE]\n\n")); + await writer.close(); + }, + }); + + const isCompletedSettled = createSettledTracker(result.completed); + expect(result.response.headers.get("content-type")).toBe( + "text/event-stream", + ); + expect(isCompletedSettled()).toBe(false); + + const reader = result.response.body?.getReader(); + if (!reader) { + throw new Error("Expected response body reader"); + } + + const firstChunk = await reader.read(); + expect(new TextDecoder().decode(firstChunk.value)).toBe( + 'data: {"id":"chunk-1"}\n\n', + ); + expect(firstChunk.done).toBe(false); + expect(isCompletedSettled()).toBe(false); + + doneFrame.resolve(); + const secondChunk = await reader.read(); + expect(new TextDecoder().decode(secondChunk.value)).toBe( + "data: [DONE]\n\n", + ); + expect(secondChunk.done).toBe(false); + + const end = await reader.read(); + expect(end.done).toBe(true); + await expect(result.completed).resolves.toBeUndefined(); + }); +}); diff --git a/apis/vercel/lib/appRouteProxy.ts b/apis/vercel/lib/appRouteProxy.ts new file mode 100644 index 00000000..5d3e59a1 --- /dev/null +++ b/apis/vercel/lib/appRouteProxy.ts @@ -0,0 +1,137 @@ +import { proxyV1 } from "@braintrust/proxy"; + +type ProxyV1Args = Parameters[0]; +type GetApiSecrets = ProxyV1Args["getApiSecrets"]; + +function normalizeError(reason: unknown): Error { + if (reason instanceof Error) { + return reason; + } + + return new Error(String(reason)); +} + +export async function proxyV1ToAppRouteResponse({ + method, + url, + proxyHeaders, + body, + initialHeaders, + getApiSecrets, + cacheGet, + cachePut, + digest, + proxyImpl = proxyV1, +}: { + method: "GET" | "POST"; + url: string; + proxyHeaders: Record; + body: string; + initialHeaders?: HeadersInit; + getApiSecrets: GetApiSecrets; + cacheGet: (encryptionKey: string, key: string) => Promise; + cachePut: ( + encryptionKey: string, + key: string, + value: string, + ttlSeconds?: number, + ) => Promise; + digest: (message: string) => Promise; + proxyImpl?: typeof proxyV1; +}): Promise<{ + response: Response; + completed: Promise; +}> { + const headers = new Headers(initialHeaders); + let status = 200; + let proxyError: unknown = undefined; + + let resolveReady: () => void = () => {}; + const ready = new Promise((resolve) => { + resolveReady = resolve; + }); + + let resolveCompleted: () => void = () => {}; + let rejectCompleted: (error: Error) => void = () => {}; + const completed = new Promise((resolve, reject) => { + resolveCompleted = resolve; + rejectCompleted = (error) => reject(error); + }); + + let readyScheduled = false; + const scheduleReady = () => { + if (readyScheduled) { + return; + } + + readyScheduled = true; + queueMicrotask(resolveReady); + }; + + const abortController = new AbortController(); + + const readable = new ReadableStream({ + start(controller) { + const writable = new WritableStream({ + write(chunk) { + scheduleReady(); + controller.enqueue(chunk); + }, + close() { + scheduleReady(); + controller.close(); + resolveCompleted(); + }, + abort(reason) { + scheduleReady(); + const error = normalizeError(reason); + controller.error(error); + rejectCompleted(error); + }, + }); + + void proxyImpl({ + method, + url, + proxyHeaders, + body, + setHeader(name, value) { + headers.set(name, value); + }, + setStatusCode(code) { + status = code; + }, + res: writable, + getApiSecrets, + cacheGet, + cachePut, + digest, + decompressFetch: true, + signal: abortController.signal, + }).catch((error) => { + proxyError = error; + scheduleReady(); + const normalizedError = normalizeError(error); + controller.error(normalizedError); + rejectCompleted(normalizedError); + }); + }, + cancel(reason) { + abortController.abort(normalizeError(reason)); + }, + }); + + await ready; + + if (proxyError !== undefined) { + throw proxyError; + } + + return { + response: new Response(readable, { + status, + headers, + }), + completed, + }; +} diff --git a/apis/vercel/next-env.d.ts b/apis/vercel/next-env.d.ts index 36a4fe48..2d5420eb 100644 --- a/apis/vercel/next-env.d.ts +++ b/apis/vercel/next-env.d.ts @@ -1,7 +1,7 @@ /// /// /// -/// +import "./.next/types/routes.d.ts"; // NOTE: This file should not be edited // see https://nextjs.org/docs/app/api-reference/config/typescript for more information. diff --git a/apis/vercel/next.config.js b/apis/vercel/next.config.js index 11317887..025ec264 100644 --- a/apis/vercel/next.config.js +++ b/apis/vercel/next.config.js @@ -8,9 +8,6 @@ const nextConfig = { typescript: { ignoreBuildErrors: true, }, - eslint: { - ignoreDuringBuilds: true, - }, }; module.exports = nextConfig; diff --git a/apis/vercel/package.json b/apis/vercel/package.json index 81c47b9a..1b25cde7 100644 --- a/apis/vercel/package.json +++ b/apis/vercel/package.json @@ -11,22 +11,23 @@ }, "dependencies": { "@braintrust/proxy": "workspace:*", - "@upstash/ratelimit": "^0.4.3", "@vercel/examples-ui": "^1.0.5", "@vercel/kv": "^0.2.2", - "next": "15.5.15", - "react": "latest", - "react-dom": "latest" + "next": "^16.2.6", + "react": "19.2.6", + "react-dom": "19.2.6", + "undici": "^6.0.0" }, "devDependencies": { - "@types/node": "^17.0.45", - "@types/react": "latest", + "@types/node": "^22.0.0", + "@types/react": "^19.0.2", + "@types/react-dom": "^19.0.2", "autoprefixer": "^10.4.14", "eslint": "^9.39.4", - "eslint-config-next": "16.2.4", + "eslint-config-next": "^16.2.6", "postcss": "^8.5.10", "tailwindcss": "^3.4.19", "turbo": "^1.8.5", - "typescript": "5.5.4" + "typescript": "^5.5.4" } } diff --git a/apis/vercel/pages/api/ping.ts b/apis/vercel/pages/api/ping.ts deleted file mode 100644 index f7548c5e..00000000 --- a/apis/vercel/pages/api/ping.ts +++ /dev/null @@ -1,41 +0,0 @@ -import type { NextRequest } from "next/server"; -import { Ratelimit } from "@upstash/ratelimit"; -import { kv } from "@vercel/kv"; - -const ratelimit = new Ratelimit({ - redis: kv, - // 5 requests from the same IP in 10 seconds - limiter: Ratelimit.slidingWindow(1000, "10 s"), -}); - -export const config = { - runtime: "edge", -}; - -let i = 0; -export default async function handler(request: NextRequest) { - // You could alternatively limit based on user ID or similar - const ip = request.ip ?? "127.0.0.1"; - /* - let start = Date.now(); - const { limit, reset, remaining } = await ratelimit.limit(ip); - let end = Date.now(); - console.log("Rate limit KV latency (ms):", end - start); - */ - await kv.set("foo", `${i}`); - i += 1; - - let start = Date.now(); - const foo = await kv.get("foo"); - let end = Date.now(); - console.log("Get ", foo, " KV latency (ms):", end - start); - - return new Response(JSON.stringify({ success: true }), { - status: 200, - headers: { - "X-RateLimit-Limit": "0", - "X-RateLimit-Remaining": "0", - "X-RateLimit-Reset": "0", - }, - }); -} diff --git a/apis/vercel/pages/api/v1/[...slug].ts b/apis/vercel/pages/api/v1/[...slug].ts deleted file mode 100644 index f5caddb4..00000000 --- a/apis/vercel/pages/api/v1/[...slug].ts +++ /dev/null @@ -1,33 +0,0 @@ -import { kv } from "@vercel/kv"; -import { EdgeProxyV1, CacheSetOptions } from "@braintrust/proxy/edge"; - -export const config = { - runtime: "edge", -}; - -const KVCache = { - get: kv.get, - set: async (key: string, value: T, opts: CacheSetOptions) => { - await kv.set( - key, - value, - opts.ttl !== undefined - ? { - ex: opts.ttl, - } - : {}, - ); - }, -}; - -export default EdgeProxyV1({ - getRelativeURL: (request) => { - const url = new URL(request.url); - const params = url.searchParams.getAll("slug"); - return "/" + params.join("/"); - }, - cors: true, - credentialsCache: KVCache, - completionsCache: KVCache, - braintrustApiUrl: process.env.BRAINTRUST_APP_URL, -}); diff --git a/apis/vercel/tsconfig.json b/apis/vercel/tsconfig.json index ab40fc21..f31709ea 100644 --- a/apis/vercel/tsconfig.json +++ b/apis/vercel/tsconfig.json @@ -13,10 +13,10 @@ "noEmit": true, "esModuleInterop": true, "module": "esnext", - "moduleResolution": "node", + "moduleResolution": "bundler", "resolveJsonModule": true, "isolatedModules": true, - "jsx": "preserve", + "jsx": "react-jsx", "paths": { "@lib/*": [ "./lib/*" @@ -42,7 +42,8 @@ "next-env.d.ts", "**/*.ts", "**/*.tsx", - ".next/types/**/*.ts" + ".next/types/**/*.ts", + ".next/dev/types/**/*.ts" ], "exclude": [ "node_modules" diff --git a/package.json b/package.json index 4c6fe9ef..3a8b3c70 100644 --- a/package.json +++ b/package.json @@ -40,6 +40,7 @@ }, "packageManager": "pnpm@10.33.0", "resolutions": { + "handlebars": "4.7.9", "protobufjs": "7.5.5", "zod": "3.25.34" } diff --git a/packages/proxy/src/providers/util.test.ts b/packages/proxy/src/providers/util.test.ts new file mode 100644 index 00000000..244fc056 --- /dev/null +++ b/packages/proxy/src/providers/util.test.ts @@ -0,0 +1,112 @@ +import { afterEach, describe, expect, it, vi } from "vitest"; +import { lookup } from "node:dns/promises"; +import { convertMediaToBase64 } from "./util"; + +vi.mock("node:dns/promises", () => ({ + lookup: vi.fn(async () => [{ address: "93.184.216.34", family: 4 }]), +})); + +const publicImageUrl = "https://93.184.216.34/image.png"; + +function mockFetch(response: Response) { + const fetchMock = vi.fn(async () => response); + vi.stubGlobal("fetch", fetchMock); + return fetchMock; +} + +describe("convertMediaToBase64", () => { + afterEach(() => { + vi.clearAllMocks(); + vi.unstubAllGlobals(); + }); + + it("rejects non-http media URLs before fetching", async () => { + const fetchMock = mockFetch(new Response()); + + await expect( + convertMediaToBase64({ + media: "file:///etc/passwd", + allowedMediaTypes: null, + maxMediaBytes: null, + }), + ).rejects.toThrow("Media URL must use http or https"); + expect(fetchMock).not.toHaveBeenCalled(); + }); + + it("rejects localhost media URLs before fetching", async () => { + const fetchMock = mockFetch(new Response()); + + await expect( + convertMediaToBase64({ + media: "http://localhost/image.png", + allowedMediaTypes: null, + maxMediaBytes: null, + }), + ).rejects.toThrow("Media URL resolves to a blocked address"); + expect(fetchMock).not.toHaveBeenCalled(); + }); + + it("rejects private IP media URLs before fetching", async () => { + const fetchMock = mockFetch(new Response()); + + await expect( + convertMediaToBase64({ + media: "https://169.254.169.254/latest/meta-data", + allowedMediaTypes: null, + maxMediaBytes: null, + }), + ).rejects.toThrow("Media URL resolves to a blocked address"); + expect(fetchMock).not.toHaveBeenCalled(); + }); + + it("rejects IPv4-mapped IPv6 localhost URLs before fetching", async () => { + const fetchMock = mockFetch(new Response()); + + await expect( + convertMediaToBase64({ + media: "http://[::ffff:127.0.0.1]/image.png", + allowedMediaTypes: null, + maxMediaBytes: null, + }), + ).rejects.toThrow("Media URL resolves to a blocked address"); + await expect( + convertMediaToBase64({ + media: "http://[::ffff:7f00:1]/image.png", + allowedMediaTypes: null, + maxMediaBytes: null, + }), + ).rejects.toThrow("Media URL resolves to a blocked address"); + expect(fetchMock).not.toHaveBeenCalled(); + }); + + it("rejects hostnames that resolve to private addresses before fetching", async () => { + const lookupMock = vi.mocked(lookup); + lookupMock.mockResolvedValueOnce([{ address: "10.0.0.5", family: 4 }]); + const fetchMock = mockFetch(new Response()); + + await expect( + convertMediaToBase64({ + media: "https://example.com/image.png", + allowedMediaTypes: null, + maxMediaBytes: null, + }), + ).rejects.toThrow("Media URL resolves to a blocked address"); + expect(fetchMock).not.toHaveBeenCalled(); + }); + + it("converts base64 data URLs without remote fetching", async () => { + const fetchMock = mockFetch(new Response()); + + await expect( + convertMediaToBase64({ + media: "data:image/png;base64,AQID", + allowedMediaTypes: ["image/png"], + maxMediaBytes: 3, + }), + ).resolves.toEqual({ + media_type: "image/png", + data: "AQID", + }); + expect(fetchMock).not.toHaveBeenCalled(); + }); +}); diff --git a/packages/proxy/src/providers/util.ts b/packages/proxy/src/providers/util.ts index 1571fe5f..1a7dad34 100644 --- a/packages/proxy/src/providers/util.ts +++ b/packages/proxy/src/providers/util.ts @@ -1,13 +1,25 @@ +import { lookup } from "node:dns/promises"; +import { type IncomingHttpHeaders } from "node:http"; +import { request as httpRequest } from "node:http"; +import { request as httpsRequest } from "node:https"; +import { Readable } from "node:stream"; import { arrayBufferToBase64 } from "utils"; const base64MediaPattern = /^data:([a-zA-Z0-9]+\/[a-zA-Z0-9+.-]+);base64,([A-Za-z0-9+/]+={0,2})$/; +const maxRedirects = 3; +const mediaFetchTimeoutMs = 30_000; export interface MediaBlock { media_type: string; data: string; } +interface ValidatedMediaUrl { + address: string; + url: URL; +} + export function convertBase64Media(media: string): MediaBlock | null { const match = media.match(base64MediaPattern); if (!match) { @@ -21,6 +33,290 @@ export function convertBase64Media(media: string): MediaBlock | null { }; } +function normalizeHostname(hostname: string): string { + return hostname.toLowerCase().replace(/^\[|\]$/g, ""); +} + +function parseIPv4Address(address: string): number | null { + const parts = address.split("."); + if (parts.length !== 4) { + return null; + } + + let parsed = 0; + for (const part of parts) { + if (!/^\d+$/.test(part)) { + return null; + } + + const value = Number(part); + if (value < 0 || value > 255) { + return null; + } + + parsed = parsed * 256 + value; + } + + return parsed; +} + +function isIPv4InRange(address: number, base: number, prefixLength: number) { + const mask = + prefixLength === 0 ? 0 : (0xffffffff << (32 - prefixLength)) >>> 0; + return (address & mask) === (base & mask); +} + +function isBlockedIPv4Address(address: string): boolean { + const parsed = parseIPv4Address(address); + if (parsed === null) { + return false; + } + + return [ + { base: "0.0.0.0", prefixLength: 8 }, + { base: "10.0.0.0", prefixLength: 8 }, + { base: "100.64.0.0", prefixLength: 10 }, + { base: "127.0.0.0", prefixLength: 8 }, + { base: "169.254.0.0", prefixLength: 16 }, + { base: "172.16.0.0", prefixLength: 12 }, + { base: "192.0.0.0", prefixLength: 24 }, + { base: "192.168.0.0", prefixLength: 16 }, + { base: "198.18.0.0", prefixLength: 15 }, + { base: "224.0.0.0", prefixLength: 4 }, + { base: "240.0.0.0", prefixLength: 4 }, + ].some(({ base, prefixLength }) => { + const parsedBase = parseIPv4Address(base); + return ( + parsedBase !== null && isIPv4InRange(parsed, parsedBase, prefixLength) + ); + }); +} + +function parseFirstIPv6Segment(address: string): number | null { + const firstSegment = address.split(":")[0]; + if (!/^[0-9a-f]{1,4}$/i.test(firstSegment)) { + return null; + } + + return Number.parseInt(firstSegment, 16); +} + +function parseIPv4MappedIPv6Address(address: string): string | null { + const mappedPrefix = "::ffff:"; + const normalized = normalizeHostname(address); + if (!normalized.startsWith(mappedPrefix)) { + return null; + } + + const mappedAddress = normalized.slice(mappedPrefix.length); + if (parseIPv4Address(mappedAddress) !== null) { + return mappedAddress; + } + + const parts = mappedAddress.split(":"); + if (parts.length !== 2) { + return null; + } + + const parsedParts = parts.map((part) => { + if (!/^[0-9a-f]{1,4}$/i.test(part)) { + return null; + } + return Number.parseInt(part, 16); + }); + if (parsedParts.some((part) => part === null)) { + return null; + } + + const [high, low] = parsedParts; + if (high === null || low === null) { + return null; + } + + return [(high >> 8) & 0xff, high & 0xff, (low >> 8) & 0xff, low & 0xff].join( + ".", + ); +} + +function isBlockedIPv6Address(address: string): boolean { + const normalized = normalizeHostname(address); + if (normalized === "::" || normalized === "::1") { + return true; + } + + const mappedIPv4Address = parseIPv4MappedIPv6Address(normalized); + if (mappedIPv4Address !== null) { + return isBlockedIPv4Address(mappedIPv4Address); + } + + const firstSegment = parseFirstIPv6Segment(normalized); + if (firstSegment === null) { + return false; + } + + return ( + (firstSegment & 0xfe00) === 0xfc00 || + (firstSegment & 0xffc0) === 0xfe80 || + (firstSegment & 0xff00) === 0xff00 + ); +} + +function isBlockedIPAddress(address: string): boolean { + return isBlockedIPv4Address(address) || isBlockedIPv6Address(address); +} + +function nodeHeadersToHeaders(headers: IncomingHttpHeaders): Headers { + const result = new Headers(); + for (const [name, value] of Object.entries(headers)) { + if (value === undefined) { + continue; + } + if (Array.isArray(value)) { + for (const item of value) { + result.append(name, item); + } + continue; + } + result.set(name, value); + } + return result; +} + +async function validateMediaUrl(url: URL): Promise { + if (url.protocol !== "http:" && url.protocol !== "https:") { + throw new Error("Media URL must use http or https"); + } + + const hostname = normalizeHostname(url.hostname); + if (hostname === "localhost" || isBlockedIPAddress(hostname)) { + throw new Error("Media URL resolves to a blocked address"); + } + + if (parseIPv4Address(hostname) !== null || hostname.includes(":")) { + return { address: hostname, url }; + } + + const addresses = await lookup(hostname, { all: true, verbatim: true }); + if ( + addresses.length === 0 || + addresses.some(({ address }) => isBlockedIPAddress(address)) + ) { + throw new Error("Media URL resolves to a blocked address"); + } + + return { address: addresses[0].address, url }; +} + +async function readResponseBytes( + response: Response, + maxMediaBytes: number | null, +): Promise { + if (!response.body) { + throw new Error("Failed to read media response body"); + } + + const reader = response.body.getReader(); + const chunks: Uint8Array[] = []; + let totalBytes = 0; + + while (true) { + const { done, value } = await reader.read(); + if (done) { + break; + } + + totalBytes += value.byteLength; + if (maxMediaBytes !== null && totalBytes > maxMediaBytes) { + await reader.cancel(); + throw new Error( + `Media size exceeds the ${maxMediaBytes / 1024 / 1024} MB limit`, + ); + } + chunks.push(value); + } + + const bytes = new Uint8Array(totalBytes); + let offset = 0; + for (const chunk of chunks) { + bytes.set(chunk, offset); + offset += chunk.byteLength; + } + + return bytes.buffer; +} + +async function fetchMediaUrl( + url: URL, + signal: AbortSignal, + redirectCount = 0, +): Promise { + const target = await validateMediaUrl(url); + const response = await fetchValidatedMediaUrl(target, signal); + + if (response.status >= 300 && response.status < 400) { + const location = response.headers.get("location"); + if (!location) { + throw new Error("Media URL redirect missing location header"); + } + if (redirectCount >= maxRedirects) { + throw new Error("Media URL exceeded redirect limit"); + } + + return await fetchMediaUrl( + new URL(location, url), + signal, + redirectCount + 1, + ); + } + + return response; +} + +async function fetchValidatedMediaUrl( + { address, url }: ValidatedMediaUrl, + signal: AbortSignal, +): Promise { + return await new Promise((resolve, reject) => { + const hostname = normalizeHostname(url.hostname); + const servername = + parseIPv4Address(hostname) === null && !hostname.includes(":") + ? url.hostname + : undefined; + const request = (url.protocol === "https:" ? httpsRequest : httpRequest)( + { + headers: { + Host: url.host, + }, + hostname: address, + method: "GET", + path: `${url.pathname}${url.search}`, + port: url.port || (url.protocol === "https:" ? 443 : 80), + protocol: url.protocol, + servername, + }, + (response) => { + resolve( + new Response(Readable.toWeb(response), { + headers: nodeHeadersToHeaders(response.headers), + status: response.statusCode ?? 500, + statusText: response.statusMessage, + }), + ); + }, + ); + + request.on("error", reject); + signal.addEventListener( + "abort", + () => { + request.destroy(new Error("Media fetch aborted")); + }, + { once: true }, + ); + request.end(); + }); +} + async function convertMediaUrl({ url, allowedMediaTypes, @@ -30,36 +326,41 @@ async function convertMediaUrl({ allowedMediaTypes: string[] | null; maxMediaBytes: number | null; }): Promise { - const response = await fetch(url); - if (!response.ok) { - throw new Error(`Failed to fetch media: ${response.statusText}`); - } + const parsedUrl = new URL(url); + const abortController = new AbortController(); + const timeout = setTimeout( + () => abortController.abort(), + mediaFetchTimeoutMs, + ); + try { + const response = await fetchMediaUrl(parsedUrl, abortController.signal); + if (!response.ok) { + throw new Error(`Failed to fetch media: ${response.statusText}`); + } - const contentType = response.headers.get("content-type"); - if (!contentType) { - throw new Error("Failed to get content type of the media"); - } - const baseContentType = contentType.split(";")[0].trim(); - if ( - allowedMediaTypes !== null && - !allowedMediaTypes.includes(baseContentType) - ) { - throw new Error(`Unsupported media type: ${baseContentType}`); - } + const contentType = response.headers.get("content-type"); + if (!contentType) { + throw new Error("Failed to get content type of the media"); + } + const baseContentType = contentType.split(";")[0].trim(); + if ( + allowedMediaTypes !== null && + !allowedMediaTypes.includes(baseContentType) + ) { + throw new Error(`Unsupported media type: ${baseContentType}`); + } - const arrayBuffer = await response.arrayBuffer(); - if (maxMediaBytes !== null && arrayBuffer.byteLength > maxMediaBytes) { - throw new Error( - `Media size exceeds the ${maxMediaBytes / 1024 / 1024} MB limit`, - ); - } + const arrayBuffer = await readResponseBytes(response, maxMediaBytes); - const data = arrayBufferToBase64(arrayBuffer); + const data = arrayBufferToBase64(arrayBuffer); - return { - media_type: baseContentType, - data, - }; + return { + media_type: baseContentType, + data, + }; + } finally { + clearTimeout(timeout); + } } export async function convertMediaToBase64({ diff --git a/packages/proxy/src/proxy.ts b/packages/proxy/src/proxy.ts index cd414cff..7651b2d7 100644 --- a/packages/proxy/src/proxy.ts +++ b/packages/proxy/src/proxy.ts @@ -1463,7 +1463,10 @@ async function fetchModelLoop( errorHttpHeaders = proxyResponse.response.headers; } } catch (e) { - const isAbortError = e instanceof DOMException && e.name === "AbortError"; + const isAbortError = + typeof DOMException !== "undefined" && + e instanceof DOMException && + e.name === "AbortError"; if (!isAbortError) { console.log("ERROR", e); } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 713b389f..975b685c 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -5,6 +5,7 @@ settings: excludeLinksFromLockfile: false overrides: + handlebars: 4.7.9 protobufjs: 7.5.5 zod: 3.25.34 @@ -14,7 +15,7 @@ importers: devDependencies: '@types/node': specifier: ^20.19.0 - version: 20.19.39 + version: 20.19.40 eslint: specifier: ^9.39.4 version: 9.39.4(jiti@1.21.7) @@ -29,13 +30,13 @@ importers: version: 2.5.6 vite: specifier: 7.2.7 - version: 7.2.7(@types/node@20.19.39)(jiti@1.21.7) + version: 7.2.7(@types/node@20.19.40)(jiti@1.21.7) vite-tsconfig-paths: specifier: ^6.1.1 - version: 6.1.1(typescript@5.9.3)(vite@7.2.7(@types/node@20.19.39)(jiti@1.21.7)) + version: 6.1.1(typescript@5.5.4)(vite@7.2.7(@types/node@20.19.40)(jiti@1.21.7)) vitest: specifier: ^4.1.5 - version: 4.1.5(@opentelemetry/api@1.9.0)(@types/node@20.19.39)(msw@2.8.4(@types/node@20.19.39)(typescript@5.9.3))(vite@7.2.7(@types/node@20.19.39)(jiti@1.21.7)) + version: 4.1.5(@opentelemetry/api@1.9.0)(@types/node@20.19.40)(msw@2.8.4(@types/node@20.19.40)(typescript@5.5.4))(vite@7.2.7(@types/node@20.19.40)(jiti@1.21.7)) apis/cloudflare: dependencies: @@ -69,19 +70,19 @@ importers: devDependencies: '@cloudflare/workers-types': specifier: ^4.20260505.1 - version: 4.20260505.1 + version: 4.20260509.1 itty-router: specifier: ^3.0.12 version: 3.0.12 tsup: specifier: ^8.5.1 - version: 8.5.1(jiti@1.21.7)(postcss@8.5.14)(typescript@5.9.3) + version: 8.5.1(jiti@1.21.7)(postcss@8.5.13)(typescript@5.3.3) typescript: specifier: ^5.0.4 - version: 5.9.3 + version: 5.3.3 wrangler: specifier: 4.88.0 - version: 4.88.0(@cloudflare/workers-types@4.20260505.1)(bufferutil@4.0.8)(utf-8-validate@5.0.10) + version: 4.88.0(@cloudflare/workers-types@4.20260509.1)(bufferutil@4.0.8)(utf-8-validate@5.0.10) apis/node: dependencies: @@ -93,7 +94,7 @@ importers: version: 2.32.0 ai: specifier: 2.2.22 - version: 2.2.22(react@19.2.5)(solid-js@1.9.10)(svelte@4.2.20)(vue@3.5.22(typescript@5.3.3)) + version: 2.2.22(react@19.2.6)(solid-js@1.9.10)(svelte@4.2.20)(vue@3.5.22(typescript@5.3.3)) aws-lambda: specifier: ^1.0.7 version: 1.0.7 @@ -145,7 +146,7 @@ importers: version: 5.0.6 '@types/node': specifier: ^20.19.0 - version: 20.19.39 + version: 20.19.40 typescript: specifier: ^5.0.4 version: 5.3.3 @@ -155,31 +156,34 @@ importers: '@braintrust/proxy': specifier: workspace:* version: link:../../packages/proxy - '@upstash/ratelimit': - specifier: ^0.4.3 - version: 0.4.3 '@vercel/examples-ui': specifier: ^1.0.5 - version: 1.0.5(next@15.5.15(@babel/core@7.28.3)(@opentelemetry/api@1.9.0)(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(react-dom@19.2.5(react@19.2.5))(react@19.2.5) + version: 1.0.5(next@16.2.6(@babel/core@7.28.3)(@opentelemetry/api@1.9.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(react-dom@19.2.6(react@19.2.6))(react@19.2.6) '@vercel/kv': specifier: ^0.2.2 version: 0.2.2 next: - specifier: 15.5.15 - version: 15.5.15(@babel/core@7.28.3)(@opentelemetry/api@1.9.0)(react-dom@19.2.5(react@19.2.5))(react@19.2.5) + specifier: ^16.2.6 + version: 16.2.6(@babel/core@7.28.3)(@opentelemetry/api@1.9.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) react: - specifier: latest - version: 19.2.5 + specifier: 19.2.6 + version: 19.2.6 react-dom: - specifier: latest - version: 19.2.5(react@19.2.5) + specifier: 19.2.6 + version: 19.2.6(react@19.2.6) + undici: + specifier: ^6.0.0 + version: 6.25.0 devDependencies: '@types/node': - specifier: ^17.0.45 - version: 17.0.45 + specifier: ^22.0.0 + version: 22.19.18 '@types/react': - specifier: latest + specifier: ^19.0.2 version: 19.2.14 + '@types/react-dom': + specifier: ^19.0.2 + version: 19.2.3(@types/react@19.2.14) autoprefixer: specifier: ^10.4.14 version: 10.4.14(postcss@8.5.13) @@ -187,11 +191,11 @@ importers: specifier: ^9.39.4 version: 9.39.4(jiti@1.21.7) eslint-config-next: - specifier: 16.2.4 - version: 16.2.4(@typescript-eslint/parser@8.53.0(eslint@9.39.4)(typescript@5.5.4))(eslint@9.39.4)(typescript@5.5.4) + specifier: ^16.2.6 + version: 16.2.6(@typescript-eslint/parser@8.53.0(eslint@9.39.4(jiti@1.21.7))(typescript@5.5.4))(eslint@9.39.4(jiti@1.21.7))(typescript@5.5.4) postcss: specifier: ^8.5.10 - version: 8.5.14 + version: 8.5.13 tailwindcss: specifier: ^3.4.19 version: 3.4.19 @@ -199,7 +203,7 @@ importers: specifier: ^1.8.5 version: 1.11.2 typescript: - specifier: 5.5.4 + specifier: ^5.5.4 version: 5.5.4 packages/proxy: @@ -233,7 +237,7 @@ importers: version: 2.1.0(@opentelemetry/api@1.9.0) ai: specifier: 2.2.37 - version: 2.2.37(react@19.2.5)(solid-js@1.9.10)(svelte@4.2.20)(vue@3.5.22(typescript@5.5.4)) + version: 2.2.37(react@19.2.6)(solid-js@1.9.10)(svelte@4.2.20)(vue@3.5.22(typescript@5.5.4)) cache-control-parser: specifier: ^2.0.6 version: 2.0.6 @@ -276,7 +280,7 @@ importers: version: 9.0.7 '@types/node': specifier: ^20.19.0 - version: 20.19.39 + version: 20.19.40 '@types/uuid': specifier: ^9.0.7 version: 9.0.7 @@ -294,25 +298,25 @@ importers: version: 0.27.0 msw: specifier: ^2.8.2 - version: 2.8.4(@types/node@20.19.39)(typescript@5.5.4) + version: 2.8.4(@types/node@20.19.40)(typescript@5.5.4) openapi-zod-client: specifier: ^1.18.3 - version: 1.18.3(react@19.2.5) + version: 1.18.3(react@19.2.6) tsup: specifier: ^8.5.1 - version: 8.5.1(jiti@1.21.7)(postcss@8.5.14)(typescript@5.5.4) + version: 8.5.1(jiti@1.21.7)(postcss@8.5.13)(typescript@5.5.4) typescript: specifier: 5.5.4 version: 5.5.4 vite: specifier: 7.2.7 - version: 7.2.7(@types/node@20.19.39)(jiti@1.21.7) + version: 7.2.7(@types/node@20.19.40)(jiti@1.21.7) vite-tsconfig-paths: specifier: ^6.1.1 - version: 6.1.1(typescript@5.5.4)(vite@7.2.7(@types/node@20.19.39)(jiti@1.21.7)) + version: 6.1.1(typescript@5.5.4)(vite@7.2.7(@types/node@20.19.40)(jiti@1.21.7)) vitest: specifier: ^4.1.5 - version: 4.1.5(@opentelemetry/api@1.9.0)(@types/node@20.19.39)(msw@2.8.4(@types/node@20.19.39)(typescript@5.5.4))(vite@7.2.7(@types/node@20.19.39)(jiti@1.21.7)) + version: 4.1.5(@opentelemetry/api@1.9.0)(@types/node@20.19.40)(msw@2.8.4(@types/node@20.19.40)(typescript@5.5.4))(vite@7.2.7(@types/node@20.19.40)(jiti@1.21.7)) yargs: specifier: ^17.7.2 version: 17.7.2 @@ -665,8 +669,8 @@ packages: cpu: [x64] os: [win32] - '@cloudflare/workers-types@4.20260505.1': - resolution: {integrity: sha512-Uz9D2hcwB4/pdnmCU7RsgknY8TQ5st0cQMMN6h/hvWt1TCt99GUkbi6dMgWdP7jXfIfh+S/EI5zQugI9RZn4Bw==} + '@cloudflare/workers-types@4.20260509.1': + resolution: {integrity: sha512-jFlTTD+0MK/01TdL5sHIsQ8RqzfmvBsGl4hSp87INv2+JIs/JF6EL9J8enuCz6z3fNdfOKISNbGCIrzZRXVrcw==} '@colors/colors@1.5.0': resolution: {integrity: sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==} @@ -679,8 +683,8 @@ packages: '@emnapi/runtime@1.10.0': resolution: {integrity: sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA==} - '@esbuild/aix-ppc64@0.25.12': - resolution: {integrity: sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==} + '@esbuild/aix-ppc64@0.25.9': + resolution: {integrity: sha512-OaGtL73Jck6pBKjNIe24BnFE6agGl+6KxDtTfHhy1HmhthfKouEcOhqpSL64K4/0WCtbKFLOdzD/44cJ4k9opA==} engines: {node: '>=18'} cpu: [ppc64] os: [aix] @@ -697,8 +701,8 @@ packages: cpu: [ppc64] os: [aix] - '@esbuild/android-arm64@0.25.12': - resolution: {integrity: sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==} + '@esbuild/android-arm64@0.25.9': + resolution: {integrity: sha512-IDrddSmpSv51ftWslJMvl3Q2ZT98fUSL2/rlUXuVqRXHCs5EUF1/f+jbjF5+NG9UffUDMCiTyh8iec7u8RlTLg==} engines: {node: '>=18'} cpu: [arm64] os: [android] @@ -715,8 +719,8 @@ packages: cpu: [arm64] os: [android] - '@esbuild/android-arm@0.25.12': - resolution: {integrity: sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==} + '@esbuild/android-arm@0.25.9': + resolution: {integrity: sha512-5WNI1DaMtxQ7t7B6xa572XMXpHAaI/9Hnhk8lcxF4zVN4xstUgTlvuGDorBguKEnZO70qwEcLpfifMLoxiPqHQ==} engines: {node: '>=18'} cpu: [arm] os: [android] @@ -733,8 +737,8 @@ packages: cpu: [arm] os: [android] - '@esbuild/android-x64@0.25.12': - resolution: {integrity: sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==} + '@esbuild/android-x64@0.25.9': + resolution: {integrity: sha512-I853iMZ1hWZdNllhVZKm34f4wErd4lMyeV7BLzEExGEIZYsOzqDWDf+y082izYUE8gtJnYHdeDpN/6tUdwvfiw==} engines: {node: '>=18'} cpu: [x64] os: [android] @@ -751,8 +755,8 @@ packages: cpu: [x64] os: [android] - '@esbuild/darwin-arm64@0.25.12': - resolution: {integrity: sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==} + '@esbuild/darwin-arm64@0.25.9': + resolution: {integrity: sha512-XIpIDMAjOELi/9PB30vEbVMs3GV1v2zkkPnuyRRURbhqjyzIINwj+nbQATh4H9GxUgH1kFsEyQMxwiLFKUS6Rg==} engines: {node: '>=18'} cpu: [arm64] os: [darwin] @@ -769,8 +773,8 @@ packages: cpu: [arm64] os: [darwin] - '@esbuild/darwin-x64@0.25.12': - resolution: {integrity: sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==} + '@esbuild/darwin-x64@0.25.9': + resolution: {integrity: sha512-jhHfBzjYTA1IQu8VyrjCX4ApJDnH+ez+IYVEoJHeqJm9VhG9Dh2BYaJritkYK3vMaXrf7Ogr/0MQ8/MeIefsPQ==} engines: {node: '>=18'} cpu: [x64] os: [darwin] @@ -787,8 +791,8 @@ packages: cpu: [x64] os: [darwin] - '@esbuild/freebsd-arm64@0.25.12': - resolution: {integrity: sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==} + '@esbuild/freebsd-arm64@0.25.9': + resolution: {integrity: sha512-z93DmbnY6fX9+KdD4Ue/H6sYs+bhFQJNCPZsi4XWJoYblUqT06MQUdBCpcSfuiN72AbqeBFu5LVQTjfXDE2A6Q==} engines: {node: '>=18'} cpu: [arm64] os: [freebsd] @@ -805,8 +809,8 @@ packages: cpu: [arm64] os: [freebsd] - '@esbuild/freebsd-x64@0.25.12': - resolution: {integrity: sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==} + '@esbuild/freebsd-x64@0.25.9': + resolution: {integrity: sha512-mrKX6H/vOyo5v71YfXWJxLVxgy1kyt1MQaD8wZJgJfG4gq4DpQGpgTB74e5yBeQdyMTbgxp0YtNj7NuHN0PoZg==} engines: {node: '>=18'} cpu: [x64] os: [freebsd] @@ -823,8 +827,8 @@ packages: cpu: [x64] os: [freebsd] - '@esbuild/linux-arm64@0.25.12': - resolution: {integrity: sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==} + '@esbuild/linux-arm64@0.25.9': + resolution: {integrity: sha512-BlB7bIcLT3G26urh5Dmse7fiLmLXnRlopw4s8DalgZ8ef79Jj4aUcYbk90g8iCa2467HX8SAIidbL7gsqXHdRw==} engines: {node: '>=18'} cpu: [arm64] os: [linux] @@ -841,8 +845,8 @@ packages: cpu: [arm64] os: [linux] - '@esbuild/linux-arm@0.25.12': - resolution: {integrity: sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==} + '@esbuild/linux-arm@0.25.9': + resolution: {integrity: sha512-HBU2Xv78SMgaydBmdor38lg8YDnFKSARg1Q6AT0/y2ezUAKiZvc211RDFHlEZRFNRVhcMamiToo7bDx3VEOYQw==} engines: {node: '>=18'} cpu: [arm] os: [linux] @@ -859,8 +863,8 @@ packages: cpu: [arm] os: [linux] - '@esbuild/linux-ia32@0.25.12': - resolution: {integrity: sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==} + '@esbuild/linux-ia32@0.25.9': + resolution: {integrity: sha512-e7S3MOJPZGp2QW6AK6+Ly81rC7oOSerQ+P8L0ta4FhVi+/j/v2yZzx5CqqDaWjtPFfYz21Vi1S0auHrap3Ma3A==} engines: {node: '>=18'} cpu: [ia32] os: [linux] @@ -877,8 +881,8 @@ packages: cpu: [ia32] os: [linux] - '@esbuild/linux-loong64@0.25.12': - resolution: {integrity: sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==} + '@esbuild/linux-loong64@0.25.9': + resolution: {integrity: sha512-Sbe10Bnn0oUAB2AalYztvGcK+o6YFFA/9829PhOCUS9vkJElXGdphz0A3DbMdP8gmKkqPmPcMJmJOrI3VYB1JQ==} engines: {node: '>=18'} cpu: [loong64] os: [linux] @@ -895,8 +899,8 @@ packages: cpu: [loong64] os: [linux] - '@esbuild/linux-mips64el@0.25.12': - resolution: {integrity: sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==} + '@esbuild/linux-mips64el@0.25.9': + resolution: {integrity: sha512-YcM5br0mVyZw2jcQeLIkhWtKPeVfAerES5PvOzaDxVtIyZ2NUBZKNLjC5z3/fUlDgT6w89VsxP2qzNipOaaDyA==} engines: {node: '>=18'} cpu: [mips64el] os: [linux] @@ -913,8 +917,8 @@ packages: cpu: [mips64el] os: [linux] - '@esbuild/linux-ppc64@0.25.12': - resolution: {integrity: sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==} + '@esbuild/linux-ppc64@0.25.9': + resolution: {integrity: sha512-++0HQvasdo20JytyDpFvQtNrEsAgNG2CY1CLMwGXfFTKGBGQT3bOeLSYE2l1fYdvML5KUuwn9Z8L1EWe2tzs1w==} engines: {node: '>=18'} cpu: [ppc64] os: [linux] @@ -931,8 +935,8 @@ packages: cpu: [ppc64] os: [linux] - '@esbuild/linux-riscv64@0.25.12': - resolution: {integrity: sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==} + '@esbuild/linux-riscv64@0.25.9': + resolution: {integrity: sha512-uNIBa279Y3fkjV+2cUjx36xkx7eSjb8IvnL01eXUKXez/CBHNRw5ekCGMPM0BcmqBxBcdgUWuUXmVWwm4CH9kg==} engines: {node: '>=18'} cpu: [riscv64] os: [linux] @@ -949,8 +953,8 @@ packages: cpu: [riscv64] os: [linux] - '@esbuild/linux-s390x@0.25.12': - resolution: {integrity: sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==} + '@esbuild/linux-s390x@0.25.9': + resolution: {integrity: sha512-Mfiphvp3MjC/lctb+7D287Xw1DGzqJPb/J2aHHcHxflUo+8tmN/6d4k6I2yFR7BVo5/g7x2Monq4+Yew0EHRIA==} engines: {node: '>=18'} cpu: [s390x] os: [linux] @@ -967,8 +971,8 @@ packages: cpu: [s390x] os: [linux] - '@esbuild/linux-x64@0.25.12': - resolution: {integrity: sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==} + '@esbuild/linux-x64@0.25.9': + resolution: {integrity: sha512-iSwByxzRe48YVkmpbgoxVzn76BXjlYFXC7NvLYq+b+kDjyyk30J0JY47DIn8z1MO3K0oSl9fZoRmZPQI4Hklzg==} engines: {node: '>=18'} cpu: [x64] os: [linux] @@ -985,8 +989,8 @@ packages: cpu: [x64] os: [linux] - '@esbuild/netbsd-arm64@0.25.12': - resolution: {integrity: sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==} + '@esbuild/netbsd-arm64@0.25.9': + resolution: {integrity: sha512-9jNJl6FqaUG+COdQMjSCGW4QiMHH88xWbvZ+kRVblZsWrkXlABuGdFJ1E9L7HK+T0Yqd4akKNa/lO0+jDxQD4Q==} engines: {node: '>=18'} cpu: [arm64] os: [netbsd] @@ -1003,8 +1007,8 @@ packages: cpu: [arm64] os: [netbsd] - '@esbuild/netbsd-x64@0.25.12': - resolution: {integrity: sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==} + '@esbuild/netbsd-x64@0.25.9': + resolution: {integrity: sha512-RLLdkflmqRG8KanPGOU7Rpg829ZHu8nFy5Pqdi9U01VYtG9Y0zOG6Vr2z4/S+/3zIyOxiK6cCeYNWOFR9QP87g==} engines: {node: '>=18'} cpu: [x64] os: [netbsd] @@ -1021,8 +1025,8 @@ packages: cpu: [x64] os: [netbsd] - '@esbuild/openbsd-arm64@0.25.12': - resolution: {integrity: sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==} + '@esbuild/openbsd-arm64@0.25.9': + resolution: {integrity: sha512-YaFBlPGeDasft5IIM+CQAhJAqS3St3nJzDEgsgFixcfZeyGPCd6eJBWzke5piZuZ7CtL656eOSYKk4Ls2C0FRQ==} engines: {node: '>=18'} cpu: [arm64] os: [openbsd] @@ -1039,8 +1043,8 @@ packages: cpu: [arm64] os: [openbsd] - '@esbuild/openbsd-x64@0.25.12': - resolution: {integrity: sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==} + '@esbuild/openbsd-x64@0.25.9': + resolution: {integrity: sha512-1MkgTCuvMGWuqVtAvkpkXFmtL8XhWy+j4jaSO2wxfJtilVCi0ZE37b8uOdMItIHz4I6z1bWWtEX4CJwcKYLcuA==} engines: {node: '>=18'} cpu: [x64] os: [openbsd] @@ -1057,8 +1061,8 @@ packages: cpu: [x64] os: [openbsd] - '@esbuild/openharmony-arm64@0.25.12': - resolution: {integrity: sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==} + '@esbuild/openharmony-arm64@0.25.9': + resolution: {integrity: sha512-4Xd0xNiMVXKh6Fa7HEJQbrpP3m3DDn43jKxMjxLLRjWnRsfxjORYJlXPO4JNcXtOyfajXorRKY9NkOpTHptErg==} engines: {node: '>=18'} cpu: [arm64] os: [openharmony] @@ -1075,8 +1079,8 @@ packages: cpu: [arm64] os: [openharmony] - '@esbuild/sunos-x64@0.25.12': - resolution: {integrity: sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==} + '@esbuild/sunos-x64@0.25.9': + resolution: {integrity: sha512-WjH4s6hzo00nNezhp3wFIAfmGZ8U7KtrJNlFMRKxiI9mxEK1scOMAaa9i4crUtu+tBr+0IN6JCuAcSBJZfnphw==} engines: {node: '>=18'} cpu: [x64] os: [sunos] @@ -1093,8 +1097,8 @@ packages: cpu: [x64] os: [sunos] - '@esbuild/win32-arm64@0.25.12': - resolution: {integrity: sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==} + '@esbuild/win32-arm64@0.25.9': + resolution: {integrity: sha512-mGFrVJHmZiRqmP8xFOc6b84/7xa5y5YvR1x8djzXpJBSv/UsNK6aqec+6JDjConTgvvQefdGhFDAs2DLAds6gQ==} engines: {node: '>=18'} cpu: [arm64] os: [win32] @@ -1111,8 +1115,8 @@ packages: cpu: [arm64] os: [win32] - '@esbuild/win32-ia32@0.25.12': - resolution: {integrity: sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==} + '@esbuild/win32-ia32@0.25.9': + resolution: {integrity: sha512-b33gLVU2k11nVx1OhX3C8QQP6UHQK4ZtN56oFWvVXvz2VkDoe6fbG8TOgHFxEvqeqohmRnIHe5A1+HADk4OQww==} engines: {node: '>=18'} cpu: [ia32] os: [win32] @@ -1129,8 +1133,8 @@ packages: cpu: [ia32] os: [win32] - '@esbuild/win32-x64@0.25.12': - resolution: {integrity: sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==} + '@esbuild/win32-x64@0.25.9': + resolution: {integrity: sha512-PPOl1mi6lpLNQxnGoyAfschAodRFYXJ+9fs6WHXz7CSWKbOqiMZsubC+BQsVKuul+3vKLuwTHsS2c2y9EoKwxQ==} engines: {node: '>=18'} cpu: [x64] os: [win32] @@ -1431,60 +1435,60 @@ packages: '@next/env@14.2.3': resolution: {integrity: sha512-W7fd7IbkfmeeY2gXrzJYDx8D2lWKbVoTIj1o1ScPHNzvp30s1AuoEFSdr39bC5sjxJaxTtq3OTCZboNp0lNWHA==} - '@next/env@15.5.15': - resolution: {integrity: sha512-vcmyu5/MyFzN7CdqRHO3uHO44p/QPCZkuTUXroeUmhNP8bL5PHFEhik22JUazt+CDDoD6EpBYRCaS2pISL+/hg==} + '@next/env@16.2.6': + resolution: {integrity: sha512-gd8HoHN4ufj73WmR3JmVolrpJR47ILK6LouP5xElPglaVxir6e1a7VzvTvDWkOoPXT9rkkTzyCxBu4yeZfZwcw==} - '@next/eslint-plugin-next@16.2.4': - resolution: {integrity: sha512-tOX826JJ96gYK/go18sPUgMq9FK1tqxBFfUCEufJb5XIkWFFmpgU7mahJANKGkHs7F41ir3tReJ3Lv5La0RvhA==} + '@next/eslint-plugin-next@16.2.6': + resolution: {integrity: sha512-Z8l6o4JWKUl755x4R+wogD86KPeU+Ckw4K+SYG4kHeOJtRenDeK+OSbGcqZpDtbwn9DsJVdir2UxmwXuinUbUw==} - '@next/swc-darwin-arm64@15.5.15': - resolution: {integrity: sha512-6PvFO2Tzt10GFK2Ro9tAVEtacMqRmTarYMFKAnV2vYMdwWc73xzmDQyAV7SwEdMhzmiRoo7+m88DuiXlJlGeaw==} + '@next/swc-darwin-arm64@16.2.6': + resolution: {integrity: sha512-ZJGkkcNfYgrrMkqOdZ7zoLa1TOy0qpcMfk/z4Mh/FKUz40gVO+HNQWqmLxf67Z5WB64DRp0dhEbyHfel+6sJUg==} engines: {node: '>= 10'} cpu: [arm64] os: [darwin] - '@next/swc-darwin-x64@15.5.15': - resolution: {integrity: sha512-G+YNV+z6FDZTp/+IdGyIMFqalBTaQSnvAA+X/hrt+eaTRFSznRMz9K7rTmzvM6tDmKegNtyzgufZW0HwVzEqaQ==} + '@next/swc-darwin-x64@16.2.6': + resolution: {integrity: sha512-v/YLBHIY132Ced3puBJ7YJKw1lqsCrgcNo2aRJlCEyQrrCeRJlvGlnmxhPxNQI3KE3N1DN5r9TPNPvka3nq5RQ==} engines: {node: '>= 10'} cpu: [x64] os: [darwin] - '@next/swc-linux-arm64-gnu@15.5.15': - resolution: {integrity: sha512-eVkrMcVIBqGfXB+QUC7jjZ94Z6uX/dNStbQFabewAnk13Uy18Igd1YZ/GtPRzdhtm7QwC0e6o7zOQecul4iC1w==} + '@next/swc-linux-arm64-gnu@16.2.6': + resolution: {integrity: sha512-RPOvqlYBbcQjkz9VQQDZ2T2bARIjXZV1KFlt+V2Mr6SW/e4I9fcKsaA0hdyf2FHoTlsV2xnBd5Y912rP/1Ce6w==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] libc: [glibc] - '@next/swc-linux-arm64-musl@15.5.15': - resolution: {integrity: sha512-RwSHKMQ7InLy5GfkY2/n5PcFycKA08qI1VST78n09nN36nUPqCvGSMiLXlfUmzmpQpF6XeBYP2KRWHi0UW3uNg==} + '@next/swc-linux-arm64-musl@16.2.6': + resolution: {integrity: sha512-URUTu1+dMkxJsPFgm+OeEvq9wf5sujw0EvgYy80TDGHTSLTnIHeqb0Eu8A3sC95IRgjejQL+kC4mw+4yPxiAXA==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] libc: [musl] - '@next/swc-linux-x64-gnu@15.5.15': - resolution: {integrity: sha512-nplqvY86LakS+eeiuWsNWvfmK8pFcOEW7ZtVRt4QH70lL+0x6LG/m1OpJ/tvrbwjmR8HH9/fH2jzW1GlL03TIg==} + '@next/swc-linux-x64-gnu@16.2.6': + resolution: {integrity: sha512-DOj182mPV8G3UkrayLoREM5YEYI+Dk5wv7Ox9xl1fFibAELEsFD0lDPfHIeILlutMMfdyhlzYPELG3peuKaurw==} engines: {node: '>= 10'} cpu: [x64] os: [linux] libc: [glibc] - '@next/swc-linux-x64-musl@15.5.15': - resolution: {integrity: sha512-eAgl9NKQ84/sww0v81DQINl/vL2IBxD7sMybd0cWRw6wqgouVI53brVRBrggqBRP/NWeIAE1dm5cbKYoiMlqDQ==} + '@next/swc-linux-x64-musl@16.2.6': + resolution: {integrity: sha512-HKQ5SP/V/ub73UvF7n/zeJlxk2kLmtL7Wzrg4WfmkjmNos5onJ2tKu7yZOPdL18A6Svfn3max29ym+ry7NkK4g==} engines: {node: '>= 10'} cpu: [x64] os: [linux] libc: [musl] - '@next/swc-win32-arm64-msvc@15.5.15': - resolution: {integrity: sha512-GJVZC86lzSquh0MtvZT+L7G8+jMnJcldloOjA8Kf3wXvBrvb6OGe2MzPuALxFshSm/IpwUtD2mIoof39ymf52A==} + '@next/swc-win32-arm64-msvc@16.2.6': + resolution: {integrity: sha512-LZXpTlPyS5v7HhSmnvsLGP3iIYgYOBnc8r8ArlT55sGHV89bR2HlDdBjWQ+PY6SJMmk8TuVGFuxalnP3k/0Dwg==} engines: {node: '>= 10'} cpu: [arm64] os: [win32] - '@next/swc-win32-x64-msvc@15.5.15': - resolution: {integrity: sha512-nFucjVdwlFqxh/JG3hWSJ4p8+YJV7Ii8aPDuBQULB6DzUF4UNZETXLfEUk+oI2zEznWWULPt7MeuTE6xtK1HSA==} + '@next/swc-win32-x64-msvc@16.2.6': + resolution: {integrity: sha512-F0+4i0h9J6C4eE3EAPWsoCk7UW/dbzOjyzxY0qnDUOYFu6FFmdZ6l97/XdV3/Nz3VYyO7UWjyEJUXkGqcoXfMA==} engines: {node: '>= 10'} cpu: [x64] os: [win32] @@ -1657,121 +1661,55 @@ packages: cpu: [arm] os: [android] - '@rollup/rollup-android-arm-eabi@4.60.3': - resolution: {integrity: sha512-x35CNW/ANXG3hE/EZpRU8MXX1JDN86hBb2wMGAtltkz7pc6cxgjpy1OMMfDosOQ+2hWqIkag/fGok1Yady9nGw==} - cpu: [arm] - os: [android] - '@rollup/rollup-android-arm64@4.46.4': resolution: {integrity: sha512-FGJYXvYdn8Bs6lAlBZYT5n+4x0ciEp4cmttsvKAZc/c8/JiPaQK8u0c/86vKX8lA7OY/+37lIQSe0YoAImvBAA==} cpu: [arm64] os: [android] - '@rollup/rollup-android-arm64@4.60.3': - resolution: {integrity: sha512-xw3xtkDApIOGayehp2+Rz4zimfkaX65r4t47iy+ymQB2G4iJCBBfj0ogVg5jpvjpn8UWn/+q9tprxleYeNp3Hw==} - cpu: [arm64] - os: [android] - '@rollup/rollup-darwin-arm64@4.46.4': resolution: {integrity: sha512-/9qwE/BM7ATw/W/OFEMTm3dmywbJyLQb4f4v5nmOjgYxPIGpw7HaxRi6LnD4Pjn/q7k55FGeHe1/OD02w63apA==} cpu: [arm64] os: [darwin] - '@rollup/rollup-darwin-arm64@4.60.3': - resolution: {integrity: sha512-vo6Y5Qfpx7/5EaamIwi0WqW2+zfiusVihKatLvtN1VFVy3D13uERk/6gZLU1UiHRL6fDXqj/ELIeVRGnvcTE1g==} - cpu: [arm64] - os: [darwin] - '@rollup/rollup-darwin-x64@4.46.4': resolution: {integrity: sha512-QkWfNbeRuzFnv2d0aPlrzcA3Ebq2mE8kX/5Pl7VdRShbPBjSnom7dbT8E3Jmhxo2RL784hyqGvR5KHavCJQciw==} cpu: [x64] os: [darwin] - '@rollup/rollup-darwin-x64@4.60.3': - resolution: {integrity: sha512-D+0QGcZhBzTN82weOnsSlY7V7+RMmPuF1CkbxyMAGE8+ZHeUjyb76ZiWmBlCu//AQQONvxcqRbwZTajZKqjuOw==} - cpu: [x64] - os: [darwin] - '@rollup/rollup-freebsd-arm64@4.46.4': resolution: {integrity: sha512-+ToyOMYnSfV8D+ckxO6NthPln/PDNp1P6INcNypfZ7muLmEvPKXqduUiD8DlJpMMT8LxHcE5W0dK9kXfJke9Zw==} cpu: [arm64] os: [freebsd] - '@rollup/rollup-freebsd-arm64@4.60.3': - resolution: {integrity: sha512-6HnvHCT7fDyj6R0Ph7A6x8dQS/S38MClRWeDLqc0MdfWkxjiu1HSDYrdPhqSILzjTIC/pnXbbJbo+ft+gy/9hQ==} - cpu: [arm64] - os: [freebsd] - '@rollup/rollup-freebsd-x64@4.46.4': resolution: {integrity: sha512-cGT6ey/W+sje6zywbLiqmkfkO210FgRz7tepWAzzEVgQU8Hn91JJmQWNqs55IuglG8sJdzk7XfNgmGRtcYlo1w==} cpu: [x64] os: [freebsd] - '@rollup/rollup-freebsd-x64@4.60.3': - resolution: {integrity: sha512-KHLgC3WKlUYW3ShFKnnosZDOJ0xjg9zp7au3sIm2bs/tGBeC2ipmvRh/N7JKi0t9Ue20C0dpEshi8WUubg+cnA==} - cpu: [x64] - os: [freebsd] - '@rollup/rollup-linux-arm-gnueabihf@4.46.4': resolution: {integrity: sha512-9fhTJyOb275w5RofPSl8lpr4jFowd+H4oQKJ9XTYzD1JWgxdZKE8bA6d4npuiMemkecQOcigX01FNZNCYnQBdA==} cpu: [arm] os: [linux] libc: [glibc] - '@rollup/rollup-linux-arm-gnueabihf@4.60.3': - resolution: {integrity: sha512-DV6fJoxEYWJOvaZIsok7KrYl0tPvga5OZ2yvKHNNYyk/2roMLqQAbGhr78EQ5YhHpnhLKJD3S1WFusAkmUuV5g==} - cpu: [arm] - os: [linux] - libc: [glibc] - '@rollup/rollup-linux-arm-musleabihf@4.46.4': resolution: {integrity: sha512-+6kCIM5Zjvz2HwPl/udgVs07tPMIp1VU2Y0c72ezjOvSvEfAIWsUgpcSDvnC7g9NrjYR6X9bZT92mZZ90TfvXw==} cpu: [arm] os: [linux] libc: [musl] - '@rollup/rollup-linux-arm-musleabihf@4.60.3': - resolution: {integrity: sha512-mQKoJAzvuOs6F+TZybQO4GOTSMUu7v0WdxEk24krQ/uUxXoPTtHjuaUuPmFhtBcM4K0ons8nrE3JyhTuCFtT/w==} - cpu: [arm] - os: [linux] - libc: [musl] - '@rollup/rollup-linux-arm64-gnu@4.46.4': resolution: {integrity: sha512-SWuXdnsayCZL4lXoo6jn0yyAj7TTjWE4NwDVt9s7cmu6poMhtiras5c8h6Ih6Y0Zk6Z+8t/mLumvpdSPTWub2Q==} cpu: [arm64] os: [linux] libc: [glibc] - '@rollup/rollup-linux-arm64-gnu@4.60.3': - resolution: {integrity: sha512-Whjj2qoiJ6+OOJMGptTYazaJvjOJm+iKHpXQM1P3LzGjt7Ff++Tp7nH4N8J/BUA7R9IHfDyx4DJIflifwnbmIA==} - cpu: [arm64] - os: [linux] - libc: [glibc] - '@rollup/rollup-linux-arm64-musl@4.46.4': resolution: {integrity: sha512-vDknMDqtMhrrroa5kyX6tuC0aRZZlQ+ipDfbXd2YGz5HeV2t8HOl/FDAd2ynhs7Ki5VooWiiZcCtxiZ4IjqZwQ==} cpu: [arm64] os: [linux] libc: [musl] - '@rollup/rollup-linux-arm64-musl@4.60.3': - resolution: {integrity: sha512-4YTNHKqGng5+yiZt3mg77nmyuCfmNfX4fPmyUapBcIk+BdwSwmCWGXOUxhXbBEkFHtoN5boLj/5NON+u5QC9tg==} - cpu: [arm64] - os: [linux] - libc: [musl] - - '@rollup/rollup-linux-loong64-gnu@4.60.3': - resolution: {integrity: sha512-SU3kNlhkpI4UqlUc2VXPGK9o886ZsSeGfMAX2ba2b8DKmMXq4AL7KUrkSWVbb7koVqx41Yczx6dx5PNargIrEA==} - cpu: [loong64] - os: [linux] - libc: [glibc] - - '@rollup/rollup-linux-loong64-musl@4.60.3': - resolution: {integrity: sha512-6lDLl5h4TXpB1mTf2rQWnAk/LcXrx9vBfu/DT5TIPhvMhRWaZ5MxkIc8u4lJAmBo6klTe1ywXIUHFjylW505sg==} - cpu: [loong64] - os: [linux] - libc: [musl] - '@rollup/rollup-linux-loongarch64-gnu@4.46.4': resolution: {integrity: sha512-mCBkjRZWhvjtl/x+Bd4fQkWZT8canStKDxGrHlBiTnZmJnWygGcvBylzLVCZXka4dco5ymkWhZlLwKCGFF4ivw==} cpu: [loong64] @@ -1784,123 +1722,51 @@ packages: os: [linux] libc: [glibc] - '@rollup/rollup-linux-ppc64-gnu@4.60.3': - resolution: {integrity: sha512-BMo8bOw8evlup/8G+cj5xWtPyp93xPdyoSN16Zy90Q2QZ0ZYRhCt6ZJSwbrRzG9HApFabjwj2p25TUPDWrhzqQ==} - cpu: [ppc64] - os: [linux] - libc: [glibc] - - '@rollup/rollup-linux-ppc64-musl@4.60.3': - resolution: {integrity: sha512-E0L8X1dZN1/Rph+5VPF6Xj2G7JJvMACVXtamTJIDrVI44Y3K+G8gQaMEAavbqCGTa16InptiVrX6eM6pmJ+7qA==} - cpu: [ppc64] - os: [linux] - libc: [musl] - '@rollup/rollup-linux-riscv64-gnu@4.46.4': resolution: {integrity: sha512-r0WKLSfFAK8ucG024v2yiLSJMedoWvk8yWqfNICX28NHDGeu3F/wBf8KG6mclghx4FsLePxJr/9N8rIj1PtCnw==} cpu: [riscv64] os: [linux] libc: [glibc] - '@rollup/rollup-linux-riscv64-gnu@4.60.3': - resolution: {integrity: sha512-oZJ/WHaVfHUiRAtmTAeo3DcevNsVvH8mbvodjZy7D5QKvCefO371SiKRpxoDcCxB3PTRTLayWBkvmDQKTcX/sw==} - cpu: [riscv64] - os: [linux] - libc: [glibc] - '@rollup/rollup-linux-riscv64-musl@4.46.4': resolution: {integrity: sha512-IaizpPP2UQU3MNyPH1u0Xxbm73D+4OupL0bjo4Hm0496e2wg3zuvoAIhubkD1NGy9fXILEExPQy87mweujEatA==} cpu: [riscv64] os: [linux] libc: [musl] - '@rollup/rollup-linux-riscv64-musl@4.60.3': - resolution: {integrity: sha512-Dhbyh7j9FybM3YaTgaHmVALwA8AkUwTPccyCQ79TG9AJUsMQqgN1DDEZNr4+QUfwiWvLDumW5vdwzoeUF+TNxQ==} - cpu: [riscv64] - os: [linux] - libc: [musl] - '@rollup/rollup-linux-s390x-gnu@4.46.4': resolution: {integrity: sha512-aCM29orANR0a8wk896p6UEgIfupReupnmISz6SUwMIwTGaTI8MuKdE0OD2LvEg8ondDyZdMvnaN3bW4nFbATPA==} cpu: [s390x] os: [linux] libc: [glibc] - '@rollup/rollup-linux-s390x-gnu@4.60.3': - resolution: {integrity: sha512-cJd1X5XhHHlltkaypz1UcWLA8AcoIi1aWhsvaWDskD1oz2eKCypnqvTQ8ykMNI0RSmm7NkTdSqSSD7zM0xa6Ig==} - cpu: [s390x] - os: [linux] - libc: [glibc] - '@rollup/rollup-linux-x64-gnu@4.46.4': resolution: {integrity: sha512-0Xj1vZE3cbr/wda8d/m+UeuSL+TDpuozzdD4QaSzu/xSOMK0Su5RhIkF7KVHFQsobemUNHPLEcYllL7ZTCP/Cg==} cpu: [x64] os: [linux] libc: [glibc] - '@rollup/rollup-linux-x64-gnu@4.60.3': - resolution: {integrity: sha512-DAZDBHQfG2oQuhY7mc6I3/qB4LU2fQCjRvxbDwd/Jdvb9fypP4IJ4qmtu6lNjes6B531AI8cg1aKC2di97bUxA==} - cpu: [x64] - os: [linux] - libc: [glibc] - '@rollup/rollup-linux-x64-musl@4.46.4': resolution: {integrity: sha512-kM/orjpolfA5yxsx84kI6bnK47AAZuWxglGKcNmokw2yy9i5eHY5UAjcX45jemTJnfHAWo3/hOoRqEeeTdL5hw==} cpu: [x64] os: [linux] libc: [musl] - '@rollup/rollup-linux-x64-musl@4.60.3': - resolution: {integrity: sha512-cRxsE8c13mZOh3vP+wLDxpQBRrOHDIGOWyDL93Sy0Ga8y515fBcC2pjUfFwUe5T7tqvTvWbCpg1URM/AXdWIXA==} - cpu: [x64] - os: [linux] - libc: [musl] - - '@rollup/rollup-openbsd-x64@4.60.3': - resolution: {integrity: sha512-QaWcIgRxqEdQdhJqW4DJctsH6HCmo5vHxY0krHSX4jMtOqfzC+dqDGuHM87bu4H8JBeibWx7jFz+h6/4C8wA5Q==} - cpu: [x64] - os: [openbsd] - - '@rollup/rollup-openharmony-arm64@4.60.3': - resolution: {integrity: sha512-AaXwSvUi3QIPtroAUw1t5yHGIyqKEXwH54WUocFolZhpGDruJcs8c+xPNDRn4XiQsS7MEwnYsHW2l0MBLDMkWg==} - cpu: [arm64] - os: [openharmony] - '@rollup/rollup-win32-arm64-msvc@4.46.4': resolution: {integrity: sha512-cNLH4psMEsWKILW0isbpQA2OvjXLbKvnkcJFmqAptPQbtLrobiapBJVj6RoIvg6UXVp5w0wnIfd/Q56cNpF+Ew==} cpu: [arm64] os: [win32] - '@rollup/rollup-win32-arm64-msvc@4.60.3': - resolution: {integrity: sha512-65LAKM/bAWDqKNEelHlcHvm2V+Vfb8C6INFxQXRHCvaVN1rJfwr4NvdP4FyzUaLqWfaCGaadf6UbTm8xJeYfEg==} - cpu: [arm64] - os: [win32] - '@rollup/rollup-win32-ia32-msvc@4.46.4': resolution: {integrity: sha512-OiEa5lRhiANpv4SfwYVgQ3opYWi/QmPDC5ve21m8G9pf6ZO+aX1g2EEF1/IFaM1xPSP7mK0msTRXlPs6mIagkg==} cpu: [ia32] os: [win32] - '@rollup/rollup-win32-ia32-msvc@4.60.3': - resolution: {integrity: sha512-EEM2gyhBF5MFnI6vMKdX1LAosE627RGBzIoGMdLloPZkXrUN0Ckqgr2Qi8+J3zip/8NVVro3/FjB+tjhZUgUHA==} - cpu: [ia32] - os: [win32] - - '@rollup/rollup-win32-x64-gnu@4.60.3': - resolution: {integrity: sha512-E5Eb5H/DpxaoXH++Qkv28RcUJboMopmdDUALBczvHMf7hNIxaDZqwY5lK12UK1BHacSmvupoEWGu+n993Z0y1A==} - cpu: [x64] - os: [win32] - '@rollup/rollup-win32-x64-msvc@4.46.4': resolution: {integrity: sha512-IKL9mewGZ5UuuX4NQlwOmxPyqielvkAPUS2s1cl6yWjjQvyN3h5JTdVFGD5Jr5xMjRC8setOfGQDVgX8V+dkjg==} cpu: [x64] os: [win32] - '@rollup/rollup-win32-x64-msvc@4.60.3': - resolution: {integrity: sha512-hPt/bgL5cE+Qp+/TPHBqptcAgPzgj46mPcg/16zNUmbQk0j+mOEQV/+Lqu8QRtDV3Ek95Q6FeFITpuhl6OTsAA==} - cpu: [x64] - os: [win32] - '@rtsao/scc@1.1.0': resolution: {integrity: sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==} @@ -2191,14 +2057,14 @@ packages: '@types/node-fetch@2.6.13': resolution: {integrity: sha512-QGpRVpzSaUs30JBSGPjOg4Uveu384erbHBoT1zeONvyCfwQxIkUshLAOqN/k9EjGviPRmWTTe6aH2qySWKTVSw==} - '@types/node@17.0.45': - resolution: {integrity: sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw==} - '@types/node@18.19.123': resolution: {integrity: sha512-K7DIaHnh0mzVxreCR9qwgNxp3MH9dltPNIEddW9MYUlcKAzm+3grKNSTe2vCJHI1FaLpvpL5JGJrz1UZDKYvDg==} - '@types/node@20.19.39': - resolution: {integrity: sha512-orrrD74MBUyK8jOAD/r0+lfa1I2MO6I+vAkmAWzMYbCcgrN4lCrmK52gRFQq/JRxfYPfonkr4b0jcY7Olqdqbw==} + '@types/node@20.19.40': + resolution: {integrity: sha512-xxx6M2IpSTnnKcR0cMvIiohkiCx20/oRPtWGbenFygKCGl3zqUzdNjQ/1V4solq1LU+dgv0nQzeGOuqkqZGg0Q==} + + '@types/node@22.19.18': + resolution: {integrity: sha512-9v00a+dn2yWVsYDEunWC4g/TcRKVq3r8N5FuZp7u0SGrPvdN9c2yXI9bBuf5Fl0hNCb+QTIePTn5pJs2pwBOQQ==} '@types/phoenix@1.6.4': resolution: {integrity: sha512-B34A7uot1Cv0XtaHRYDATltAdKx0BvVKNgYNqE4WjtPUa4VQJM7kxeXcVKaH+KS+kCmZ+6w+QaUdcljiheiBJA==} @@ -2209,6 +2075,11 @@ packages: '@types/range-parser@1.2.7': resolution: {integrity: sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==} + '@types/react-dom@19.2.3': + resolution: {integrity: sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==} + peerDependencies: + '@types/react': ^19.2.0 + '@types/react@19.2.14': resolution: {integrity: sha512-ilcTH/UniCkMdtexkoCN0bI7pMcJDvmQFPvuPvmEaYA/NSfFTAgdUSLAoVjaRJm7+6PvcM+q1zYOwS4wTYMF9w==} @@ -2354,19 +2225,9 @@ packages: resolution: {integrity: sha512-NwjLUnGy8/Zfx23fl50tRC8rYaYnM52xNRYFAXvmiil9yh1+K6aRVQMnzW6gQB/1DLgWt977lYQn7C+wtgXZiA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@upstash/core-analytics@0.0.6': - resolution: {integrity: sha512-cpPSR0XJAJs4Ddz9nq3tINlPS5aLfWVCqhhtHnXt4p7qr5+/Znlt1Es736poB/9rnl1hAHrOsOvVj46NEXcVqA==} - engines: {node: '>=16.0.0'} - - '@upstash/ratelimit@0.4.3': - resolution: {integrity: sha512-Dsp9Mw09Flg28JRklKgFiCXqr3bqv8bbG0kgpUYoHjcgPPolFFyaYOj/I2HExvYLZiogl77NUavBoNvMOK0zUQ==} - '@upstash/redis@1.21.0': resolution: {integrity: sha512-c6M+cl0LOgGK/7Gp6ooMkIZ1IDAJs8zFR+REPkoSkAq38o7CWFX5FYwYEqGZ6wJpUGBuEOr/7hTmippXGgL25A==} - '@upstash/redis@1.25.1': - resolution: {integrity: sha512-ACj0GhJ4qrQyBshwFgPod6XufVEfKX2wcaihsEvSdLYnY+m+pa13kGt1RXm/yTHKf4TQi/Dy2A8z/y6WUEOmlg==} - '@vercel/examples-ui@1.0.5': resolution: {integrity: sha512-6pj8V9MPLgrPajIUbqEkbmupEMnK6xBk5zkwsilwhA9mYQdxttqgVyDqlFMQhEVqb3tk0PshA+XxnZoDfLCpoQ==} peerDependencies: @@ -2665,8 +2526,13 @@ packages: base64-js@1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} - binary-extensions@2.3.0: - resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} + baseline-browser-mapping@2.10.29: + resolution: {integrity: sha512-Asa2krT+XTPZINCS+2QcyS8WTkObE77RwkydwF7h6DmnKqbvlalz93m/dnphUyCa6SWSP51VgtEUf2FN+gelFQ==} + engines: {node: '>=6.0.0'} + hasBin: true + + binary-extensions@2.2.0: + resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} engines: {node: '>=8'} binary-search@1.3.6: @@ -2696,8 +2562,8 @@ packages: brace-expansion@2.0.2: resolution: {integrity: sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==} - brace-expansion@5.0.5: - resolution: {integrity: sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ==} + brace-expansion@5.0.6: + resolution: {integrity: sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g==} engines: {node: 18 || 20 || >=22} braces@3.0.3: @@ -2914,9 +2780,6 @@ packages: resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} engines: {node: '>= 8'} - crypto-js@4.2.0: - resolution: {integrity: sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q==} - css-tree@2.3.1: resolution: {integrity: sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==} engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0} @@ -3130,8 +2993,8 @@ packages: es6-symbol@3.1.3: resolution: {integrity: sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==} - esbuild@0.25.12: - resolution: {integrity: sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==} + esbuild@0.25.9: + resolution: {integrity: sha512-CRbODhYyQx3qp7ZEwzxOk4JBqmD/seJrzPa/cGjY1VtIn5E09Oi9/dB4JwctnfZ8Q8iT7rioVv5k/FNT/uf54g==} engines: {node: '>=18'} hasBin: true @@ -3160,8 +3023,8 @@ packages: resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} engines: {node: '>=10'} - eslint-config-next@16.2.4: - resolution: {integrity: sha512-A6ekXYFj/YQxBPMl45g3e+U8zJo+X2+ZQwcz34pPKjpc/3S4roBA2Rd9xWB4FKuSxhofo1/95WjzmUY+wHrOhg==} + eslint-config-next@16.2.6: + resolution: {integrity: sha512-z2ELYSkyrrJ6cuunTU8vhsT/RpouPkjaSah06nVW6Rg2Hpg0Vs8s497/e5s8G8qtdp4ccsiovz5P1rv+5VSW2Q==} peerDependencies: eslint: '>=9.0.0' typescript: '>=3.3.1' @@ -3324,8 +3187,8 @@ packages: resolution: {integrity: sha512-knvyeauYhqjOYvQ66MznSMs83wmHrCycNEN6Ao+2AeYEfxUIkuiVxdEa1qlGEPK+We3n0THiDciYSsCcgW/DoA==} engines: {node: '>=12.0.0'} - express@4.22.1: - resolution: {integrity: sha512-F2X8g9P1X7uCPZMA3MVf9wcTqlyNp7IhH5qPCI0izhaOIYXaW9L535tGA3qmjRzpH+bZczqq7hVKxTR4NWnu+g==} + express@4.21.2: + resolution: {integrity: sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==} engines: {node: '>= 0.10.0'} express@5.2.1: @@ -3401,8 +3264,8 @@ packages: resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} engines: {node: '>=16'} - flatted@3.4.2: - resolution: {integrity: sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==} + flatted@3.2.9: + resolution: {integrity: sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==} follow-redirects@1.16.0: resolution: {integrity: sha512-y5rN/uOsadFT/JfYwhxRS5R7Qce+g3zG97+JrtFZlC9klX/W5hD7iiLzScI4nZqUS7DNUdhPgw4xI8W2LuXlUw==} @@ -3549,8 +3412,8 @@ packages: resolution: {integrity: sha512-mS1lbMsxgQj6hge1XZ6p7GPhbrtFwUFYi3wRzXAC/FmYnyXMTvvI3td3rjmQ2u8ewXueaSvRPWaEcgVVOT9Jnw==} engines: {node: ^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0} - handlebars@4.7.8: - resolution: {integrity: sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==} + handlebars@4.7.9: + resolution: {integrity: sha512-4E71E0rpOaQuJR2A3xDZ+GM1HyWYv1clR58tC8emQNeQe3RH7MAzSbat+V0wG78LQBo6m6bzSG/L4pBuCsgnUQ==} engines: {node: '>=0.4.7'} hasBin: true @@ -4032,6 +3895,9 @@ packages: resolution: {integrity: sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==} engines: {node: 18 || 20 || >=22} + minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + minimatch@3.1.5: resolution: {integrity: sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==} @@ -4106,9 +3972,9 @@ packages: next-tick@1.1.0: resolution: {integrity: sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==} - next@15.5.15: - resolution: {integrity: sha512-VSqCrJwtLVGwAVE0Sb/yikrQfkwkZW9p+lL/J4+xe+G3ZA+QnWPqgcfH1tDUEuk9y+pthzzVFp4L/U8JerMfMQ==} - engines: {node: ^18.18.0 || ^19.8.0 || >= 20.0.0} + next@16.2.6: + resolution: {integrity: sha512-qOVgKJg1+At15NpeUP+eJgCHvTCgXsogweq87Ri/Ix7PkqQHg4sdaXmSFqKlgaIXE4kW0g25LE68W87UANlHtw==} + engines: {node: '>=20.9.0'} hasBin: true peerDependencies: '@opentelemetry/api': ^1.1.0 @@ -4141,8 +4007,8 @@ packages: encoding: optional: true - node-gyp-build@4.8.4: - resolution: {integrity: sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==} + node-gyp-build@4.7.0: + resolution: {integrity: sha512-PbZERfeFdrHQOOXiAKOY0VPbykZy90ndPKk0d+CFDegTKmWp1VgOTz2xACVbr1BjCWxrQp68CXtvNsveFhqDJg==} hasBin: true node-releases@2.0.13: @@ -4322,18 +4188,14 @@ packages: picocolors@1.1.1: resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} - picomatch@2.3.2: - resolution: {integrity: sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==} + picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} engines: {node: '>=8.6'} picomatch@4.0.3: resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==} engines: {node: '>=12'} - picomatch@4.0.4: - resolution: {integrity: sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==} - engines: {node: '>=12'} - pify@2.3.0: resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} engines: {node: '>=0.10.0'} @@ -4342,10 +4204,6 @@ packages: resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} engines: {node: '>= 6'} - pirates@4.0.7: - resolution: {integrity: sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==} - engines: {node: '>= 6'} - pkg-types@1.3.1: resolution: {integrity: sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==} @@ -4408,10 +4266,6 @@ packages: resolution: {integrity: sha512-qif0+jGGZoLWdHey3UFHHWP0H7Gbmsk8T5VEqyYFbWqPr1XqvLGBbk/sl8V5exGmcYJklJOhOQq1pV9IcsiFag==} engines: {node: ^10 || ^12 || >=14} - postcss@8.5.14: - resolution: {integrity: sha512-SoSL4+OSEtR99LHFZQiJLkT59C5B1amGO1NzTwj7TT1qCUgUO6hxOvzkOYxD+vMrXBM3XJIKzokoERdqQq/Zmg==} - engines: {node: ^10 || ^12 || >=14} - prelude-ls@1.2.1: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} engines: {node: '>= 0.8.0'} @@ -4455,10 +4309,6 @@ packages: resolution: {integrity: sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==} engines: {node: '>=0.6'} - qs@6.14.2: - resolution: {integrity: sha512-V/yCWTTF7VJ9hIh18Ugr2zhJMP01MY7c5kh4J870L7imm6/DIzBsNLTXzMwUA3yZ5b/KBqLx8Kp3uRvd7xSe3Q==} - engines: {node: '>=0.6'} - qs@6.15.1: resolution: {integrity: sha512-6YHEFRL9mfgcAvql/XhwTvf5jKcOiiupt2FiJxHkiX1z4j7WL8J/jRHYLluORvc1XxB5rV20KoeK00gVJamspg==} engines: {node: '>=0.6'} @@ -4486,16 +4336,16 @@ packages: resolution: {integrity: sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA==} engines: {node: '>= 0.10'} - react-dom@19.2.5: - resolution: {integrity: sha512-J5bAZz+DXMMwW/wV3xzKke59Af6CHY7G4uYLN1OvBcKEsWOs4pQExj86BBKamxl/Ik5bx9whOrvBlSDfWzgSag==} + react-dom@19.2.6: + resolution: {integrity: sha512-0prMI+hvBbPjsWnxDLxlCGyM8PN6UuWjEUCYmZhO67xIV9Xasa/r/vDnq+Xyq4Lo27g8QSbO5YzARu0D1Sps3g==} peerDependencies: - react: ^19.2.5 + react: ^19.2.6 react-is@16.13.1: resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} - react@19.2.5: - resolution: {integrity: sha512-llUJLzz1zTUBrskt2pwZgLq59AemifIftw4aB7JxOqf1HY2FDaGDxgwpAPVzHU1kdWabH7FauP4i1oEeer2WCA==} + react@19.2.6: + resolution: {integrity: sha512-sfWGGfavi0xr8Pg0sVsyHMAOziVYKgPLNrS7ig+ivMNb3wbCBw3KxtflsGBAwD3gYQlE/AEZsTLgToRrSCjb0Q==} engines: {node: '>=0.10.0'} read-cache@1.0.0: @@ -4562,11 +4412,6 @@ packages: engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true - rollup@4.60.3: - resolution: {integrity: sha512-pAQK9HalE84QSm4Po3EmWIZPd3FnjkShVkiMlz1iligWYkWQ7wHYd1PF/T7QZ5TVSD6uSTon5gBVMSM4JfBV+A==} - engines: {node: '>=18.0.0', npm: '>=8.0.0'} - hasBin: true - router@2.2.0: resolution: {integrity: sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==} engines: {node: '>= 18'} @@ -4667,8 +4512,8 @@ packages: resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} engines: {node: '>=8'} - side-channel-list@1.0.1: - resolution: {integrity: sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w==} + side-channel-list@1.0.0: + resolution: {integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==} engines: {node: '>= 0.4'} side-channel-map@1.0.1: @@ -4816,11 +4661,6 @@ packages: engines: {node: '>=16 || 14 >=14.17'} hasBin: true - sucrase@3.35.1: - resolution: {integrity: sha512-DhuTmvZWux4H1UOnWMB3sk0sbaCVOoQZjv8u1rDoTV0HTdGem9hkAZtl4JZy8P2z4Bg0nT+YMeOFyVr4zcG5Tw==} - engines: {node: '>=16 || 14 >=14.17'} - hasBin: true - sugar-high@0.4.7: resolution: {integrity: sha512-vCg55qNhUBbBylR1DNWAYvqlwSVPebBJPh+fNzknN70b9CIyS1xoCRa0CnRzrAw4RYiqprteDfZg8ZeToZqqug==} @@ -4894,10 +4734,6 @@ packages: resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==} engines: {node: '>=12.0.0'} - tinyglobby@0.2.16: - resolution: {integrity: sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg==} - engines: {node: '>=12.0.0'} - tinyrainbow@3.1.0: resolution: {integrity: sha512-Bf+ILmBgretUrdJxzXM0SgXLZ3XfiaUuOj/IKQHuTXip+05Xn+uyEYdVg0kYDipTBcLrCVyUzAPz7QmArb0mmw==} engines: {node: '>=14.0.0'} @@ -5104,8 +4940,8 @@ packages: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <6.0.0' - typescript@4.9.5: - resolution: {integrity: sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==} + typescript@4.7.4: + resolution: {integrity: sha512-C0WQT0gezHuw6AdY1M2jxUO83Rjf0HP7Sk1DtXj6j1EwkQNZrHAg2XPWlq62oqEhYvONq5pkC2Y9oPljWToLmQ==} engines: {node: '>=4.2.0'} hasBin: true @@ -5119,11 +4955,6 @@ packages: engines: {node: '>=14.17'} hasBin: true - typescript@5.9.3: - resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} - engines: {node: '>=14.17'} - hasBin: true - ufo@1.6.1: resolution: {integrity: sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA==} @@ -5142,6 +4973,10 @@ packages: undici-types@6.21.0: resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} + undici@6.25.0: + resolution: {integrity: sha512-ZgpWDC5gmNiuY9CnLVXEH8rl50xhRCuLNA97fAUnKi8RRuV4E6KG31pDTsLVUKnohJE0I3XDrTeEydAXRw47xg==} + engines: {node: '>=18.17'} + undici@7.24.8: resolution: {integrity: sha512-6KQ/+QxK49Z/p3HO6E5ZCZWNnCasyZLa5ExaVYyvPxUwKtbCPMKELJOqh7EqOle0t9cH/7d2TaaTRRa6Nhs4YQ==} engines: {node: '>=20.18.1'} @@ -6010,7 +5845,7 @@ snapshots: '@babel/generator@7.28.3': dependencies: - '@babel/parser': 7.28.5 + '@babel/parser': 7.29.3 '@babel/types': 7.28.5 '@jridgewell/gen-mapping': 0.3.13 '@jridgewell/trace-mapping': 0.3.31 @@ -6074,7 +5909,7 @@ snapshots: '@babel/template@7.27.2': dependencies: '@babel/code-frame': 7.27.1 - '@babel/parser': 7.28.5 + '@babel/parser': 7.29.3 '@babel/types': 7.28.5 '@babel/traverse@7.28.3': @@ -6082,7 +5917,7 @@ snapshots: '@babel/code-frame': 7.27.1 '@babel/generator': 7.28.3 '@babel/helper-globals': 7.28.0 - '@babel/parser': 7.28.5 + '@babel/parser': 7.29.3 '@babel/template': 7.27.2 '@babel/types': 7.28.5 debug: 4.4.3 @@ -6112,7 +5947,7 @@ snapshots: '@bundled-es-modules/statuses@1.0.1': dependencies: - statuses: 2.0.2 + statuses: 2.0.1 '@bundled-es-modules/tough-cookie@0.1.6': dependencies: @@ -6142,7 +5977,7 @@ snapshots: '@cloudflare/workerd-windows-64@1.20260504.1': optional: true - '@cloudflare/workers-types@4.20260505.1': {} + '@cloudflare/workers-types@4.20260509.1': {} '@colors/colors@1.5.0': optional: true @@ -6156,7 +5991,7 @@ snapshots: tslib: 2.8.1 optional: true - '@esbuild/aix-ppc64@0.25.12': + '@esbuild/aix-ppc64@0.25.9': optional: true '@esbuild/aix-ppc64@0.27.0': @@ -6165,7 +6000,7 @@ snapshots: '@esbuild/aix-ppc64@0.27.3': optional: true - '@esbuild/android-arm64@0.25.12': + '@esbuild/android-arm64@0.25.9': optional: true '@esbuild/android-arm64@0.27.0': @@ -6174,7 +6009,7 @@ snapshots: '@esbuild/android-arm64@0.27.3': optional: true - '@esbuild/android-arm@0.25.12': + '@esbuild/android-arm@0.25.9': optional: true '@esbuild/android-arm@0.27.0': @@ -6183,7 +6018,7 @@ snapshots: '@esbuild/android-arm@0.27.3': optional: true - '@esbuild/android-x64@0.25.12': + '@esbuild/android-x64@0.25.9': optional: true '@esbuild/android-x64@0.27.0': @@ -6192,7 +6027,7 @@ snapshots: '@esbuild/android-x64@0.27.3': optional: true - '@esbuild/darwin-arm64@0.25.12': + '@esbuild/darwin-arm64@0.25.9': optional: true '@esbuild/darwin-arm64@0.27.0': @@ -6201,7 +6036,7 @@ snapshots: '@esbuild/darwin-arm64@0.27.3': optional: true - '@esbuild/darwin-x64@0.25.12': + '@esbuild/darwin-x64@0.25.9': optional: true '@esbuild/darwin-x64@0.27.0': @@ -6210,7 +6045,7 @@ snapshots: '@esbuild/darwin-x64@0.27.3': optional: true - '@esbuild/freebsd-arm64@0.25.12': + '@esbuild/freebsd-arm64@0.25.9': optional: true '@esbuild/freebsd-arm64@0.27.0': @@ -6219,7 +6054,7 @@ snapshots: '@esbuild/freebsd-arm64@0.27.3': optional: true - '@esbuild/freebsd-x64@0.25.12': + '@esbuild/freebsd-x64@0.25.9': optional: true '@esbuild/freebsd-x64@0.27.0': @@ -6228,7 +6063,7 @@ snapshots: '@esbuild/freebsd-x64@0.27.3': optional: true - '@esbuild/linux-arm64@0.25.12': + '@esbuild/linux-arm64@0.25.9': optional: true '@esbuild/linux-arm64@0.27.0': @@ -6237,7 +6072,7 @@ snapshots: '@esbuild/linux-arm64@0.27.3': optional: true - '@esbuild/linux-arm@0.25.12': + '@esbuild/linux-arm@0.25.9': optional: true '@esbuild/linux-arm@0.27.0': @@ -6246,7 +6081,7 @@ snapshots: '@esbuild/linux-arm@0.27.3': optional: true - '@esbuild/linux-ia32@0.25.12': + '@esbuild/linux-ia32@0.25.9': optional: true '@esbuild/linux-ia32@0.27.0': @@ -6255,7 +6090,7 @@ snapshots: '@esbuild/linux-ia32@0.27.3': optional: true - '@esbuild/linux-loong64@0.25.12': + '@esbuild/linux-loong64@0.25.9': optional: true '@esbuild/linux-loong64@0.27.0': @@ -6264,7 +6099,7 @@ snapshots: '@esbuild/linux-loong64@0.27.3': optional: true - '@esbuild/linux-mips64el@0.25.12': + '@esbuild/linux-mips64el@0.25.9': optional: true '@esbuild/linux-mips64el@0.27.0': @@ -6273,7 +6108,7 @@ snapshots: '@esbuild/linux-mips64el@0.27.3': optional: true - '@esbuild/linux-ppc64@0.25.12': + '@esbuild/linux-ppc64@0.25.9': optional: true '@esbuild/linux-ppc64@0.27.0': @@ -6282,7 +6117,7 @@ snapshots: '@esbuild/linux-ppc64@0.27.3': optional: true - '@esbuild/linux-riscv64@0.25.12': + '@esbuild/linux-riscv64@0.25.9': optional: true '@esbuild/linux-riscv64@0.27.0': @@ -6291,7 +6126,7 @@ snapshots: '@esbuild/linux-riscv64@0.27.3': optional: true - '@esbuild/linux-s390x@0.25.12': + '@esbuild/linux-s390x@0.25.9': optional: true '@esbuild/linux-s390x@0.27.0': @@ -6300,7 +6135,7 @@ snapshots: '@esbuild/linux-s390x@0.27.3': optional: true - '@esbuild/linux-x64@0.25.12': + '@esbuild/linux-x64@0.25.9': optional: true '@esbuild/linux-x64@0.27.0': @@ -6309,7 +6144,7 @@ snapshots: '@esbuild/linux-x64@0.27.3': optional: true - '@esbuild/netbsd-arm64@0.25.12': + '@esbuild/netbsd-arm64@0.25.9': optional: true '@esbuild/netbsd-arm64@0.27.0': @@ -6318,7 +6153,7 @@ snapshots: '@esbuild/netbsd-arm64@0.27.3': optional: true - '@esbuild/netbsd-x64@0.25.12': + '@esbuild/netbsd-x64@0.25.9': optional: true '@esbuild/netbsd-x64@0.27.0': @@ -6327,7 +6162,7 @@ snapshots: '@esbuild/netbsd-x64@0.27.3': optional: true - '@esbuild/openbsd-arm64@0.25.12': + '@esbuild/openbsd-arm64@0.25.9': optional: true '@esbuild/openbsd-arm64@0.27.0': @@ -6336,7 +6171,7 @@ snapshots: '@esbuild/openbsd-arm64@0.27.3': optional: true - '@esbuild/openbsd-x64@0.25.12': + '@esbuild/openbsd-x64@0.25.9': optional: true '@esbuild/openbsd-x64@0.27.0': @@ -6345,7 +6180,7 @@ snapshots: '@esbuild/openbsd-x64@0.27.3': optional: true - '@esbuild/openharmony-arm64@0.25.12': + '@esbuild/openharmony-arm64@0.25.9': optional: true '@esbuild/openharmony-arm64@0.27.0': @@ -6354,7 +6189,7 @@ snapshots: '@esbuild/openharmony-arm64@0.27.3': optional: true - '@esbuild/sunos-x64@0.25.12': + '@esbuild/sunos-x64@0.25.9': optional: true '@esbuild/sunos-x64@0.27.0': @@ -6363,7 +6198,7 @@ snapshots: '@esbuild/sunos-x64@0.27.3': optional: true - '@esbuild/win32-arm64@0.25.12': + '@esbuild/win32-arm64@0.25.9': optional: true '@esbuild/win32-arm64@0.27.0': @@ -6372,7 +6207,7 @@ snapshots: '@esbuild/win32-arm64@0.27.3': optional: true - '@esbuild/win32-ia32@0.25.12': + '@esbuild/win32-ia32@0.25.9': optional: true '@esbuild/win32-ia32@0.27.0': @@ -6381,7 +6216,7 @@ snapshots: '@esbuild/win32-ia32@0.27.3': optional: true - '@esbuild/win32-x64@0.25.12': + '@esbuild/win32-x64@0.25.9': optional: true '@esbuild/win32-x64@0.27.0': @@ -6395,11 +6230,6 @@ snapshots: eslint: 9.39.4(jiti@1.21.7) eslint-visitor-keys: 3.4.3 - '@eslint-community/eslint-utils@4.9.1(eslint@9.39.4)': - dependencies: - eslint: 9.39.4 - eslint-visitor-keys: 3.4.3 - '@eslint-community/regexpp@4.12.2': {} '@eslint/config-array@0.21.2': @@ -6553,17 +6383,17 @@ snapshots: '@img/sharp-win32-x64@0.34.5': optional: true - '@inquirer/confirm@5.1.12(@types/node@20.19.39)': + '@inquirer/confirm@5.1.12(@types/node@20.19.40)': dependencies: - '@inquirer/core': 10.1.13(@types/node@20.19.39) - '@inquirer/type': 3.0.7(@types/node@20.19.39) + '@inquirer/core': 10.1.13(@types/node@20.19.40) + '@inquirer/type': 3.0.7(@types/node@20.19.40) optionalDependencies: - '@types/node': 20.19.39 + '@types/node': 20.19.40 - '@inquirer/core@10.1.13(@types/node@20.19.39)': + '@inquirer/core@10.1.13(@types/node@20.19.40)': dependencies: '@inquirer/figures': 1.0.12 - '@inquirer/type': 3.0.7(@types/node@20.19.39) + '@inquirer/type': 3.0.7(@types/node@20.19.40) ansi-escapes: 4.3.2 cli-width: 4.1.0 mute-stream: 2.0.0 @@ -6571,13 +6401,13 @@ snapshots: wrap-ansi: 6.2.0 yoctocolors-cjs: 2.1.2 optionalDependencies: - '@types/node': 20.19.39 + '@types/node': 20.19.40 '@inquirer/figures@1.0.12': {} - '@inquirer/type@3.0.7(@types/node@20.19.39)': + '@inquirer/type@3.0.7(@types/node@20.19.40)': optionalDependencies: - '@types/node': 20.19.39 + '@types/node': 20.19.40 '@isaacs/cliui@8.0.2': dependencies: @@ -6638,34 +6468,34 @@ snapshots: '@next/env@14.2.3': {} - '@next/env@15.5.15': {} + '@next/env@16.2.6': {} - '@next/eslint-plugin-next@16.2.4': + '@next/eslint-plugin-next@16.2.6': dependencies: fast-glob: 3.3.1 - '@next/swc-darwin-arm64@15.5.15': + '@next/swc-darwin-arm64@16.2.6': optional: true - '@next/swc-darwin-x64@15.5.15': + '@next/swc-darwin-x64@16.2.6': optional: true - '@next/swc-linux-arm64-gnu@15.5.15': + '@next/swc-linux-arm64-gnu@16.2.6': optional: true - '@next/swc-linux-arm64-musl@15.5.15': + '@next/swc-linux-arm64-musl@16.2.6': optional: true - '@next/swc-linux-x64-gnu@15.5.15': + '@next/swc-linux-x64-gnu@16.2.6': optional: true - '@next/swc-linux-x64-musl@15.5.15': + '@next/swc-linux-x64-musl@16.2.6': optional: true - '@next/swc-win32-arm64-msvc@15.5.15': + '@next/swc-win32-arm64-msvc@16.2.6': optional: true - '@next/swc-win32-x64-msvc@15.5.15': + '@next/swc-win32-x64-msvc@16.2.6': optional: true '@nodable/entities@2.1.0': {} @@ -6832,138 +6662,63 @@ snapshots: '@rollup/rollup-android-arm-eabi@4.46.4': optional: true - '@rollup/rollup-android-arm-eabi@4.60.3': - optional: true - '@rollup/rollup-android-arm64@4.46.4': optional: true - '@rollup/rollup-android-arm64@4.60.3': - optional: true - '@rollup/rollup-darwin-arm64@4.46.4': optional: true - '@rollup/rollup-darwin-arm64@4.60.3': - optional: true - '@rollup/rollup-darwin-x64@4.46.4': optional: true - '@rollup/rollup-darwin-x64@4.60.3': - optional: true - '@rollup/rollup-freebsd-arm64@4.46.4': optional: true - '@rollup/rollup-freebsd-arm64@4.60.3': - optional: true - '@rollup/rollup-freebsd-x64@4.46.4': optional: true - '@rollup/rollup-freebsd-x64@4.60.3': - optional: true - '@rollup/rollup-linux-arm-gnueabihf@4.46.4': optional: true - '@rollup/rollup-linux-arm-gnueabihf@4.60.3': - optional: true - '@rollup/rollup-linux-arm-musleabihf@4.46.4': optional: true - '@rollup/rollup-linux-arm-musleabihf@4.60.3': - optional: true - '@rollup/rollup-linux-arm64-gnu@4.46.4': optional: true - '@rollup/rollup-linux-arm64-gnu@4.60.3': - optional: true - '@rollup/rollup-linux-arm64-musl@4.46.4': optional: true - '@rollup/rollup-linux-arm64-musl@4.60.3': - optional: true - - '@rollup/rollup-linux-loong64-gnu@4.60.3': - optional: true - - '@rollup/rollup-linux-loong64-musl@4.60.3': - optional: true - '@rollup/rollup-linux-loongarch64-gnu@4.46.4': optional: true '@rollup/rollup-linux-ppc64-gnu@4.46.4': optional: true - '@rollup/rollup-linux-ppc64-gnu@4.60.3': - optional: true - - '@rollup/rollup-linux-ppc64-musl@4.60.3': - optional: true - '@rollup/rollup-linux-riscv64-gnu@4.46.4': optional: true - '@rollup/rollup-linux-riscv64-gnu@4.60.3': - optional: true - '@rollup/rollup-linux-riscv64-musl@4.46.4': optional: true - '@rollup/rollup-linux-riscv64-musl@4.60.3': - optional: true - '@rollup/rollup-linux-s390x-gnu@4.46.4': optional: true - '@rollup/rollup-linux-s390x-gnu@4.60.3': - optional: true - '@rollup/rollup-linux-x64-gnu@4.46.4': optional: true - '@rollup/rollup-linux-x64-gnu@4.60.3': - optional: true - '@rollup/rollup-linux-x64-musl@4.46.4': optional: true - '@rollup/rollup-linux-x64-musl@4.60.3': - optional: true - - '@rollup/rollup-openbsd-x64@4.60.3': - optional: true - - '@rollup/rollup-openharmony-arm64@4.60.3': - optional: true - '@rollup/rollup-win32-arm64-msvc@4.46.4': optional: true - '@rollup/rollup-win32-arm64-msvc@4.60.3': - optional: true - '@rollup/rollup-win32-ia32-msvc@4.46.4': optional: true - '@rollup/rollup-win32-ia32-msvc@4.60.3': - optional: true - - '@rollup/rollup-win32-x64-gnu@4.60.3': - optional: true - '@rollup/rollup-win32-x64-msvc@4.46.4': optional: true - '@rollup/rollup-win32-x64-msvc@4.60.3': - optional: true - '@rtsao/scc@1.1.0': {} '@sindresorhus/is@7.2.0': {} @@ -7326,7 +7081,7 @@ snapshots: '@types/body-parser@1.19.5': dependencies: '@types/connect': 3.4.38 - '@types/node': 20.19.39 + '@types/node': 20.19.40 '@types/chai@5.2.3': dependencies: @@ -7335,11 +7090,11 @@ snapshots: '@types/combined-stream@1.0.3': dependencies: - '@types/node': 20.19.39 + '@types/node': 20.19.40 '@types/connect@3.4.38': dependencies: - '@types/node': 20.19.39 + '@types/node': 20.19.40 '@types/content-disposition@0.5.8': {} @@ -7347,7 +7102,7 @@ snapshots: '@types/cors@2.8.13': dependencies: - '@types/node': 20.19.39 + '@types/node': 20.19.40 '@types/deep-eql@4.0.2': {} @@ -7359,7 +7114,7 @@ snapshots: '@types/express-serve-static-core@5.1.1': dependencies: - '@types/node': 20.19.39 + '@types/node': 20.19.40 '@types/qs': 6.9.10 '@types/range-parser': 1.2.7 '@types/send': 0.17.4 @@ -7372,7 +7127,7 @@ snapshots: '@types/fs-extra@9.0.13': dependencies: - '@types/node': 20.19.39 + '@types/node': 20.19.40 '@types/http-errors@2.0.4': {} @@ -7382,22 +7137,24 @@ snapshots: '@types/jsonwebtoken@9.0.7': dependencies: - '@types/node': 20.19.39 + '@types/node': 20.19.40 '@types/mime@1.3.5': {} '@types/node-fetch@2.6.13': dependencies: - '@types/node': 20.19.39 + '@types/node': 20.19.40 form-data: 4.0.5 - '@types/node@17.0.45': {} - '@types/node@18.19.123': dependencies: undici-types: 5.26.5 - '@types/node@20.19.39': + '@types/node@20.19.40': + dependencies: + undici-types: 6.21.0 + + '@types/node@22.19.18': dependencies: undici-types: 6.21.0 @@ -7407,6 +7164,10 @@ snapshots: '@types/range-parser@1.2.7': {} + '@types/react-dom@19.2.3(@types/react@19.2.14)': + dependencies: + '@types/react': 19.2.14 + '@types/react@19.2.14': dependencies: csstype: 3.2.3 @@ -7414,12 +7175,12 @@ snapshots: '@types/send@0.17.4': dependencies: '@types/mime': 1.3.5 - '@types/node': 20.19.39 + '@types/node': 20.19.40 '@types/serve-static@2.2.0': dependencies: '@types/http-errors': 2.0.4 - '@types/node': 20.19.39 + '@types/node': 20.19.40 '@types/statuses@2.0.5': {} @@ -7429,7 +7190,7 @@ snapshots: '@types/websocket@1.0.10': dependencies: - '@types/node': 20.19.39 + '@types/node': 20.19.40 '@types/yargs-parser@21.0.3': {} @@ -7437,18 +7198,18 @@ snapshots: dependencies: '@types/yargs-parser': 21.0.3 - '@typescript-eslint/eslint-plugin@8.53.0(@typescript-eslint/parser@8.53.0(eslint@9.39.4)(typescript@5.5.4))(eslint@9.39.4)(typescript@5.5.4)': + '@typescript-eslint/eslint-plugin@8.53.0(@typescript-eslint/parser@8.53.0(eslint@9.39.4(jiti@1.21.7))(typescript@5.5.4))(eslint@9.39.4(jiti@1.21.7))(typescript@5.5.4)': dependencies: '@eslint-community/regexpp': 4.12.2 - '@typescript-eslint/parser': 8.53.0(eslint@9.39.4)(typescript@5.5.4) + '@typescript-eslint/parser': 8.53.0(eslint@9.39.4(jiti@1.21.7))(typescript@5.5.4) '@typescript-eslint/scope-manager': 8.53.0 - '@typescript-eslint/type-utils': 8.53.0(eslint@9.39.4)(typescript@5.5.4) - '@typescript-eslint/utils': 8.53.0(eslint@9.39.4)(typescript@5.5.4) + '@typescript-eslint/type-utils': 8.53.0(eslint@9.39.4(jiti@1.21.7))(typescript@5.5.4) + '@typescript-eslint/utils': 8.53.0(eslint@9.39.4(jiti@1.21.7))(typescript@5.5.4) '@typescript-eslint/visitor-keys': 8.53.0 - eslint: 9.39.4 + eslint: 9.39.4(jiti@1.21.7) ignore: 7.0.5 natural-compare: 1.4.0 - ts-api-utils: 2.5.0(typescript@5.5.4) + ts-api-utils: 2.4.0(typescript@5.5.4) typescript: 5.5.4 transitivePeerDependencies: - supports-color @@ -7469,14 +7230,14 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.53.0(eslint@9.39.4)(typescript@5.5.4)': + '@typescript-eslint/parser@8.53.0(eslint@9.39.4(jiti@1.21.7))(typescript@5.5.4)': dependencies: '@typescript-eslint/scope-manager': 8.53.0 '@typescript-eslint/types': 8.53.0 '@typescript-eslint/typescript-estree': 8.53.0(typescript@5.5.4) '@typescript-eslint/visitor-keys': 8.53.0 debug: 4.4.3 - eslint: 9.39.4 + eslint: 9.39.4(jiti@1.21.7) typescript: 5.5.4 transitivePeerDependencies: - supports-color @@ -7495,8 +7256,8 @@ snapshots: '@typescript-eslint/project-service@8.53.0(typescript@5.5.4)': dependencies: - '@typescript-eslint/tsconfig-utils': 8.59.2(typescript@5.5.4) - '@typescript-eslint/types': 8.59.2 + '@typescript-eslint/tsconfig-utils': 8.53.0(typescript@5.5.4) + '@typescript-eslint/types': 8.53.0 debug: 4.4.3 typescript: 5.5.4 transitivePeerDependencies: @@ -7529,14 +7290,14 @@ snapshots: dependencies: typescript: 5.5.4 - '@typescript-eslint/type-utils@8.53.0(eslint@9.39.4)(typescript@5.5.4)': + '@typescript-eslint/type-utils@8.53.0(eslint@9.39.4(jiti@1.21.7))(typescript@5.5.4)': dependencies: '@typescript-eslint/types': 8.53.0 '@typescript-eslint/typescript-estree': 8.53.0(typescript@5.5.4) - '@typescript-eslint/utils': 8.53.0(eslint@9.39.4)(typescript@5.5.4) + '@typescript-eslint/utils': 8.53.0(eslint@9.39.4(jiti@1.21.7))(typescript@5.5.4) debug: 4.4.3 - eslint: 9.39.4 - ts-api-utils: 2.5.0(typescript@5.5.4) + eslint: 9.39.4(jiti@1.21.7) + ts-api-utils: 2.4.0(typescript@5.5.4) typescript: 5.5.4 transitivePeerDependencies: - supports-color @@ -7587,13 +7348,13 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.53.0(eslint@9.39.4)(typescript@5.5.4)': + '@typescript-eslint/utils@8.53.0(eslint@9.39.4(jiti@1.21.7))(typescript@5.5.4)': dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.4) + '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.4(jiti@1.21.7)) '@typescript-eslint/scope-manager': 8.53.0 '@typescript-eslint/types': 8.53.0 '@typescript-eslint/typescript-estree': 8.53.0(typescript@5.5.4) - eslint: 9.39.4 + eslint: 9.39.4(jiti@1.21.7) typescript: 5.5.4 transitivePeerDependencies: - supports-color @@ -7619,31 +7380,19 @@ snapshots: '@typescript-eslint/types': 8.59.2 eslint-visitor-keys: 5.0.1 - '@upstash/core-analytics@0.0.6': - dependencies: - '@upstash/redis': 1.25.1 - - '@upstash/ratelimit@0.4.3': - dependencies: - '@upstash/core-analytics': 0.0.6 - '@upstash/redis@1.21.0': dependencies: isomorphic-fetch: 3.0.0 transitivePeerDependencies: - encoding - '@upstash/redis@1.25.1': - dependencies: - crypto-js: 4.2.0 - - '@vercel/examples-ui@1.0.5(next@15.5.15(@babel/core@7.28.3)(@opentelemetry/api@1.9.0)(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(react-dom@19.2.5(react@19.2.5))(react@19.2.5)': + '@vercel/examples-ui@1.0.5(next@16.2.6(@babel/core@7.28.3)(@opentelemetry/api@1.9.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': dependencies: '@swc/helpers': 0.4.14 clsx: 1.2.1 - next: 15.5.15(@babel/core@7.28.3)(@opentelemetry/api@1.9.0)(react-dom@19.2.5(react@19.2.5))(react@19.2.5) - react: 19.2.5 - react-dom: 19.2.5(react@19.2.5) + next: 16.2.6(@babel/core@7.28.3)(@opentelemetry/api@1.9.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + react: 19.2.6 + react-dom: 19.2.6(react@19.2.6) sugar-high: 0.4.7 '@vercel/functions@1.5.0(@aws-sdk/credential-provider-web-identity@3.972.38)': @@ -7665,23 +7414,14 @@ snapshots: chai: 6.2.2 tinyrainbow: 3.1.0 - '@vitest/mocker@4.1.5(msw@2.8.4(@types/node@20.19.39)(typescript@5.5.4))(vite@7.2.7(@types/node@20.19.39)(jiti@1.21.7))': - dependencies: - '@vitest/spy': 4.1.5 - estree-walker: 3.0.3 - magic-string: 0.30.21 - optionalDependencies: - msw: 2.8.4(@types/node@20.19.39)(typescript@5.5.4) - vite: 7.2.7(@types/node@20.19.39)(jiti@1.21.7) - - '@vitest/mocker@4.1.5(msw@2.8.4(@types/node@20.19.39)(typescript@5.9.3))(vite@7.2.7(@types/node@20.19.39)(jiti@1.21.7))': + '@vitest/mocker@4.1.5(msw@2.8.4(@types/node@20.19.40)(typescript@5.5.4))(vite@7.2.7(@types/node@20.19.40)(jiti@1.21.7))': dependencies: '@vitest/spy': 4.1.5 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: - msw: 2.8.4(@types/node@20.19.39)(typescript@5.9.3) - vite: 7.2.7(@types/node@20.19.39)(jiti@1.21.7) + msw: 2.8.4(@types/node@20.19.40)(typescript@5.5.4) + vite: 7.2.7(@types/node@20.19.40)(jiti@1.21.7) '@vitest/pretty-format@4.1.5': dependencies: @@ -7796,32 +7536,32 @@ snapshots: dependencies: humanize-ms: 1.2.1 - ai@2.2.22(react@19.2.5)(solid-js@1.9.10)(svelte@4.2.20)(vue@3.5.22(typescript@5.3.3)): + ai@2.2.22(react@19.2.6)(solid-js@1.9.10)(svelte@4.2.20)(vue@3.5.22(typescript@5.3.3)): dependencies: eventsource-parser: 1.0.0 nanoid: 3.3.6 solid-swr-store: 0.10.7(solid-js@1.9.10)(swr-store@0.10.6) sswr: 2.0.0(svelte@4.2.20) - swr: 2.2.0(react@19.2.5) + swr: 2.2.0(react@19.2.6) swr-store: 0.10.6 swrv: 1.0.4(vue@3.5.22(typescript@5.3.3)) optionalDependencies: - react: 19.2.5 + react: 19.2.6 solid-js: 1.9.10 svelte: 4.2.20 vue: 3.5.22(typescript@5.3.3) - ai@2.2.37(react@19.2.5)(solid-js@1.9.10)(svelte@4.2.20)(vue@3.5.22(typescript@5.5.4)): + ai@2.2.37(react@19.2.6)(solid-js@1.9.10)(svelte@4.2.20)(vue@3.5.22(typescript@5.5.4)): dependencies: eventsource-parser: 1.0.0 nanoid: 3.3.6 solid-swr-store: 0.10.7(solid-js@1.9.10)(swr-store@0.10.6) sswr: 2.0.0(svelte@4.2.20) - swr: 2.2.0(react@19.2.5) + swr: 2.2.0(react@19.2.6) swr-store: 0.10.6 swrv: 1.0.4(vue@3.5.22(typescript@5.5.4)) optionalDependencies: - react: 19.2.5 + react: 19.2.6 solid-js: 1.9.10 svelte: 4.2.20 vue: 3.5.22(typescript@5.5.4) @@ -7867,7 +7607,7 @@ snapshots: anymatch@3.1.3: dependencies: normalize-path: 3.0.0 - picomatch: 2.3.2 + picomatch: 2.3.1 arg@5.0.2: {} @@ -8010,7 +7750,9 @@ snapshots: base64-js@1.5.1: {} - binary-extensions@2.3.0: {} + baseline-browser-mapping@2.10.29: {} + + binary-extensions@2.2.0: {} binary-search@1.3.6: {} @@ -8069,7 +7811,7 @@ snapshots: dependencies: balanced-match: 1.0.2 - brace-expansion@5.0.5: + brace-expansion@5.0.6: dependencies: balanced-match: 4.0.4 @@ -8094,7 +7836,7 @@ snapshots: dotenv: 16.4.5 esbuild: 0.27.0 eventsource-parser: 1.1.2 - express: 4.22.1 + express: 4.21.2 graceful-fs: 4.2.11 http-errors: 2.0.0 minimatch: 9.0.5 @@ -8136,7 +7878,7 @@ snapshots: bufferutil@4.0.8: dependencies: - node-gyp-build: 4.8.4 + node-gyp-build: 4.7.0 bundle-require@5.1.0(esbuild@0.27.0): dependencies: @@ -8306,8 +8048,6 @@ snapshots: shebang-command: 2.0.0 which: 2.0.2 - crypto-js@4.2.0: {} - css-tree@2.3.1: dependencies: mdn-data: 2.0.30 @@ -8561,34 +8301,34 @@ snapshots: d: 1.0.1 ext: 1.7.0 - esbuild@0.25.12: + esbuild@0.25.9: optionalDependencies: - '@esbuild/aix-ppc64': 0.25.12 - '@esbuild/android-arm': 0.25.12 - '@esbuild/android-arm64': 0.25.12 - '@esbuild/android-x64': 0.25.12 - '@esbuild/darwin-arm64': 0.25.12 - '@esbuild/darwin-x64': 0.25.12 - '@esbuild/freebsd-arm64': 0.25.12 - '@esbuild/freebsd-x64': 0.25.12 - '@esbuild/linux-arm': 0.25.12 - '@esbuild/linux-arm64': 0.25.12 - '@esbuild/linux-ia32': 0.25.12 - '@esbuild/linux-loong64': 0.25.12 - '@esbuild/linux-mips64el': 0.25.12 - '@esbuild/linux-ppc64': 0.25.12 - '@esbuild/linux-riscv64': 0.25.12 - '@esbuild/linux-s390x': 0.25.12 - '@esbuild/linux-x64': 0.25.12 - '@esbuild/netbsd-arm64': 0.25.12 - '@esbuild/netbsd-x64': 0.25.12 - '@esbuild/openbsd-arm64': 0.25.12 - '@esbuild/openbsd-x64': 0.25.12 - '@esbuild/openharmony-arm64': 0.25.12 - '@esbuild/sunos-x64': 0.25.12 - '@esbuild/win32-arm64': 0.25.12 - '@esbuild/win32-ia32': 0.25.12 - '@esbuild/win32-x64': 0.25.12 + '@esbuild/aix-ppc64': 0.25.9 + '@esbuild/android-arm': 0.25.9 + '@esbuild/android-arm64': 0.25.9 + '@esbuild/android-x64': 0.25.9 + '@esbuild/darwin-arm64': 0.25.9 + '@esbuild/darwin-x64': 0.25.9 + '@esbuild/freebsd-arm64': 0.25.9 + '@esbuild/freebsd-x64': 0.25.9 + '@esbuild/linux-arm': 0.25.9 + '@esbuild/linux-arm64': 0.25.9 + '@esbuild/linux-ia32': 0.25.9 + '@esbuild/linux-loong64': 0.25.9 + '@esbuild/linux-mips64el': 0.25.9 + '@esbuild/linux-ppc64': 0.25.9 + '@esbuild/linux-riscv64': 0.25.9 + '@esbuild/linux-s390x': 0.25.9 + '@esbuild/linux-x64': 0.25.9 + '@esbuild/netbsd-arm64': 0.25.9 + '@esbuild/netbsd-x64': 0.25.9 + '@esbuild/openbsd-arm64': 0.25.9 + '@esbuild/openbsd-x64': 0.25.9 + '@esbuild/openharmony-arm64': 0.25.9 + '@esbuild/sunos-x64': 0.25.9 + '@esbuild/win32-arm64': 0.25.9 + '@esbuild/win32-ia32': 0.25.9 + '@esbuild/win32-x64': 0.25.9 esbuild@0.27.0: optionalDependencies: @@ -8656,18 +8396,18 @@ snapshots: escape-string-regexp@4.0.0: {} - eslint-config-next@16.2.4(@typescript-eslint/parser@8.53.0(eslint@9.39.4)(typescript@5.5.4))(eslint@9.39.4)(typescript@5.5.4): + eslint-config-next@16.2.6(@typescript-eslint/parser@8.53.0(eslint@9.39.4(jiti@1.21.7))(typescript@5.5.4))(eslint@9.39.4(jiti@1.21.7))(typescript@5.5.4): dependencies: - '@next/eslint-plugin-next': 16.2.4 - eslint: 9.39.4 + '@next/eslint-plugin-next': 16.2.6 + eslint: 9.39.4(jiti@1.21.7) eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@8.53.0(eslint@9.39.4)(typescript@5.5.4))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.53.0(eslint@9.39.4)(typescript@5.5.4))(eslint@9.39.4))(eslint@9.39.4) - eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.53.0(eslint@9.39.4)(typescript@5.5.4))(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@8.53.0(eslint@9.39.4)(typescript@5.5.4))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.53.0(eslint@9.39.4)(typescript@5.5.4))(eslint@9.39.4))(eslint@9.39.4))(eslint@9.39.4) - eslint-plugin-jsx-a11y: 6.10.2(eslint@9.39.4) - eslint-plugin-react: 7.37.5(eslint@9.39.4) - eslint-plugin-react-hooks: 7.0.1(eslint@9.39.4) + eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@8.53.0(eslint@9.39.4(jiti@1.21.7))(typescript@5.5.4))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.53.0(eslint@9.39.4(jiti@1.21.7))(typescript@5.5.4))(eslint@9.39.4(jiti@1.21.7)))(eslint@9.39.4(jiti@1.21.7)) + eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.53.0(eslint@9.39.4(jiti@1.21.7))(typescript@5.5.4))(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@8.53.0(eslint@9.39.4(jiti@1.21.7))(typescript@5.5.4))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.53.0(eslint@9.39.4(jiti@1.21.7))(typescript@5.5.4))(eslint@9.39.4(jiti@1.21.7)))(eslint@9.39.4(jiti@1.21.7)))(eslint@9.39.4(jiti@1.21.7)) + eslint-plugin-jsx-a11y: 6.10.2(eslint@9.39.4(jiti@1.21.7)) + eslint-plugin-react: 7.37.5(eslint@9.39.4(jiti@1.21.7)) + eslint-plugin-react-hooks: 7.0.1(eslint@9.39.4(jiti@1.21.7)) globals: 16.4.0 - typescript-eslint: 8.53.0(eslint@9.39.4)(typescript@5.5.4) + typescript-eslint: 8.53.0(eslint@9.39.4(jiti@1.21.7))(typescript@5.5.4) optionalDependencies: typescript: 5.5.4 transitivePeerDependencies: @@ -8689,13 +8429,13 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@8.53.0(eslint@9.39.4)(typescript@5.5.4))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.53.0(eslint@9.39.4)(typescript@5.5.4))(eslint@9.39.4))(eslint@9.39.4): + eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@8.53.0(eslint@9.39.4(jiti@1.21.7))(typescript@5.5.4))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.53.0(eslint@9.39.4(jiti@1.21.7))(typescript@5.5.4))(eslint@9.39.4(jiti@1.21.7)))(eslint@9.39.4(jiti@1.21.7)): dependencies: debug: 4.4.3 enhanced-resolve: 5.15.0 - eslint: 9.39.4 - eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.53.0(eslint@9.39.4)(typescript@5.5.4))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@8.53.0(eslint@9.39.4)(typescript@5.5.4))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.53.0(eslint@9.39.4)(typescript@5.5.4))(eslint@9.39.4))(eslint@9.39.4))(eslint@9.39.4) - eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.53.0(eslint@9.39.4)(typescript@5.5.4))(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@8.53.0(eslint@9.39.4)(typescript@5.5.4))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.53.0(eslint@9.39.4)(typescript@5.5.4))(eslint@9.39.4))(eslint@9.39.4))(eslint@9.39.4) + eslint: 9.39.4(jiti@1.21.7) + eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.53.0(eslint@9.39.4(jiti@1.21.7))(typescript@5.5.4))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@8.53.0(eslint@9.39.4(jiti@1.21.7))(typescript@5.5.4))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.53.0(eslint@9.39.4(jiti@1.21.7))(typescript@5.5.4))(eslint@9.39.4(jiti@1.21.7)))(eslint@9.39.4(jiti@1.21.7)))(eslint@9.39.4(jiti@1.21.7)) + eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.53.0(eslint@9.39.4(jiti@1.21.7))(typescript@5.5.4))(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@8.53.0(eslint@9.39.4(jiti@1.21.7))(typescript@5.5.4))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.53.0(eslint@9.39.4(jiti@1.21.7))(typescript@5.5.4))(eslint@9.39.4(jiti@1.21.7)))(eslint@9.39.4(jiti@1.21.7)))(eslint@9.39.4(jiti@1.21.7)) fast-glob: 3.3.2 get-tsconfig: 4.7.2 is-core-module: 2.16.1 @@ -8706,18 +8446,18 @@ snapshots: - eslint-import-resolver-webpack - supports-color - eslint-module-utils@2.12.1(@typescript-eslint/parser@8.53.0(eslint@9.39.4)(typescript@5.5.4))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@8.53.0(eslint@9.39.4)(typescript@5.5.4))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.53.0(eslint@9.39.4)(typescript@5.5.4))(eslint@9.39.4))(eslint@9.39.4))(eslint@9.39.4): + eslint-module-utils@2.12.1(@typescript-eslint/parser@8.53.0(eslint@9.39.4(jiti@1.21.7))(typescript@5.5.4))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@8.53.0(eslint@9.39.4(jiti@1.21.7))(typescript@5.5.4))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.53.0(eslint@9.39.4(jiti@1.21.7))(typescript@5.5.4))(eslint@9.39.4(jiti@1.21.7)))(eslint@9.39.4(jiti@1.21.7)))(eslint@9.39.4(jiti@1.21.7)): dependencies: debug: 3.2.7 optionalDependencies: - '@typescript-eslint/parser': 8.53.0(eslint@9.39.4)(typescript@5.5.4) - eslint: 9.39.4 + '@typescript-eslint/parser': 8.53.0(eslint@9.39.4(jiti@1.21.7))(typescript@5.5.4) + eslint: 9.39.4(jiti@1.21.7) eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@8.53.0(eslint@9.39.4)(typescript@5.5.4))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.53.0(eslint@9.39.4)(typescript@5.5.4))(eslint@9.39.4))(eslint@9.39.4) + eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@8.53.0(eslint@9.39.4(jiti@1.21.7))(typescript@5.5.4))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.53.0(eslint@9.39.4(jiti@1.21.7))(typescript@5.5.4))(eslint@9.39.4(jiti@1.21.7)))(eslint@9.39.4(jiti@1.21.7)) transitivePeerDependencies: - supports-color - eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.53.0(eslint@9.39.4)(typescript@5.5.4))(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@8.53.0(eslint@9.39.4)(typescript@5.5.4))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.53.0(eslint@9.39.4)(typescript@5.5.4))(eslint@9.39.4))(eslint@9.39.4))(eslint@9.39.4): + eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.53.0(eslint@9.39.4(jiti@1.21.7))(typescript@5.5.4))(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@8.53.0(eslint@9.39.4(jiti@1.21.7))(typescript@5.5.4))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.53.0(eslint@9.39.4(jiti@1.21.7))(typescript@5.5.4))(eslint@9.39.4(jiti@1.21.7)))(eslint@9.39.4(jiti@1.21.7)))(eslint@9.39.4(jiti@1.21.7)): dependencies: '@rtsao/scc': 1.1.0 array-includes: 3.1.9 @@ -8726,13 +8466,13 @@ snapshots: array.prototype.flatmap: 1.3.3 debug: 3.2.7 doctrine: 2.1.0 - eslint: 9.39.4 + eslint: 9.39.4(jiti@1.21.7) eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.53.0(eslint@9.39.4)(typescript@5.5.4))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@8.53.0(eslint@9.39.4)(typescript@5.5.4))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.53.0(eslint@9.39.4)(typescript@5.5.4))(eslint@9.39.4))(eslint@9.39.4))(eslint@9.39.4) + eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.53.0(eslint@9.39.4(jiti@1.21.7))(typescript@5.5.4))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@8.53.0(eslint@9.39.4(jiti@1.21.7))(typescript@5.5.4))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.53.0(eslint@9.39.4(jiti@1.21.7))(typescript@5.5.4))(eslint@9.39.4(jiti@1.21.7)))(eslint@9.39.4(jiti@1.21.7)))(eslint@9.39.4(jiti@1.21.7)) hasown: 2.0.3 is-core-module: 2.16.1 is-glob: 4.0.3 - minimatch: 3.1.5 + minimatch: 3.1.2 object.fromentries: 2.0.8 object.groupby: 1.0.3 object.values: 1.2.1 @@ -8740,13 +8480,13 @@ snapshots: string.prototype.trimend: 1.0.9 tsconfig-paths: 3.15.0 optionalDependencies: - '@typescript-eslint/parser': 8.53.0(eslint@9.39.4)(typescript@5.5.4) + '@typescript-eslint/parser': 8.53.0(eslint@9.39.4(jiti@1.21.7))(typescript@5.5.4) transitivePeerDependencies: - eslint-import-resolver-typescript - eslint-import-resolver-webpack - supports-color - eslint-plugin-jsx-a11y@6.10.2(eslint@9.39.4): + eslint-plugin-jsx-a11y@6.10.2(eslint@9.39.4(jiti@1.21.7)): dependencies: aria-query: 5.3.2 array-includes: 3.1.9 @@ -8756,27 +8496,27 @@ snapshots: axobject-query: 4.1.0 damerau-levenshtein: 1.0.8 emoji-regex: 9.2.2 - eslint: 9.39.4 + eslint: 9.39.4(jiti@1.21.7) hasown: 2.0.3 jsx-ast-utils: 3.3.5 language-tags: 1.0.9 - minimatch: 3.1.5 + minimatch: 3.1.2 object.fromentries: 2.0.8 safe-regex-test: 1.1.0 string.prototype.includes: 2.0.1 - eslint-plugin-react-hooks@7.0.1(eslint@9.39.4): + eslint-plugin-react-hooks@7.0.1(eslint@9.39.4(jiti@1.21.7)): dependencies: '@babel/core': 7.28.3 '@babel/parser': 7.29.3 - eslint: 9.39.4 + eslint: 9.39.4(jiti@1.21.7) hermes-parser: 0.25.1 zod: 3.25.34 zod-validation-error: 4.0.2(zod@3.25.34) transitivePeerDependencies: - supports-color - eslint-plugin-react@7.37.5(eslint@9.39.4): + eslint-plugin-react@7.37.5(eslint@9.39.4(jiti@1.21.7)): dependencies: array-includes: 3.1.9 array.prototype.findlast: 1.2.5 @@ -8784,11 +8524,11 @@ snapshots: array.prototype.tosorted: 1.1.4 doctrine: 2.1.0 es-iterator-helpers: 1.2.2 - eslint: 9.39.4 + eslint: 9.39.4(jiti@1.21.7) estraverse: 5.3.0 hasown: 2.0.3 jsx-ast-utils: 3.3.5 - minimatch: 3.1.5 + minimatch: 3.1.2 object.entries: 1.1.9 object.fromentries: 2.0.8 object.values: 1.2.1 @@ -8815,45 +8555,6 @@ snapshots: eslint-visitor-keys@5.0.1: {} - eslint@9.39.4: - dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.4) - '@eslint-community/regexpp': 4.12.2 - '@eslint/config-array': 0.21.2 - '@eslint/config-helpers': 0.4.2 - '@eslint/core': 0.17.0 - '@eslint/eslintrc': 3.3.5 - '@eslint/js': 9.39.4 - '@eslint/plugin-kit': 0.4.1 - '@humanfs/node': 0.16.8 - '@humanwhocodes/module-importer': 1.0.1 - '@humanwhocodes/retry': 0.4.3 - '@types/estree': 1.0.8 - ajv: 6.15.0 - chalk: 4.1.2 - cross-spawn: 7.0.6 - debug: 4.4.3 - escape-string-regexp: 4.0.0 - eslint-scope: 8.4.0 - eslint-visitor-keys: 4.2.1 - espree: 10.4.0 - esquery: 1.7.0 - esutils: 2.0.3 - fast-deep-equal: 3.1.3 - file-entry-cache: 8.0.0 - find-up: 5.0.0 - glob-parent: 6.0.2 - ignore: 5.3.2 - imurmurhash: 0.1.4 - is-glob: 4.0.3 - json-stable-stringify-without-jsonify: 1.0.1 - lodash.merge: 4.6.2 - minimatch: 3.1.5 - natural-compare: 1.4.0 - optionator: 0.9.4 - transitivePeerDependencies: - - supports-color - eslint@9.39.4(jiti@1.21.7): dependencies: '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.4(jiti@1.21.7)) @@ -8935,7 +8636,7 @@ snapshots: expect-type@1.3.0: {} - express@4.22.1: + express@4.21.2: dependencies: accepts: 1.3.8 array-flatten: 1.1.1 @@ -8958,7 +8659,7 @@ snapshots: parseurl: 1.3.3 path-to-regexp: 0.1.12 proxy-addr: 2.0.7 - qs: 6.14.2 + qs: 6.13.0 range-parser: 1.2.1 safe-buffer: 5.2.1 send: 0.19.0 @@ -9051,10 +8752,6 @@ snapshots: optionalDependencies: picomatch: 4.0.3 - fdir@6.5.0(picomatch@4.0.4): - optionalDependencies: - picomatch: 4.0.4 - file-entry-cache@8.0.0: dependencies: flat-cache: 4.0.1 @@ -9099,10 +8796,10 @@ snapshots: flat-cache@4.0.1: dependencies: - flatted: 3.4.2 + flatted: 3.2.9 keyv: 4.5.4 - flatted@3.4.2: {} + flatted@3.2.9: {} follow-redirects@1.16.0: {} @@ -9246,7 +8943,7 @@ snapshots: graphql@16.11.0: {} - handlebars@4.7.8: + handlebars@4.7.9: dependencies: minimist: 1.2.8 neo-async: 2.6.2 @@ -9365,7 +9062,7 @@ snapshots: is-binary-path@2.1.0: dependencies: - binary-extensions: 2.3.0 + binary-extensions: 2.2.0 is-boolean-object@1.2.2: dependencies: @@ -9674,7 +9371,7 @@ snapshots: micromatch@4.0.8: dependencies: braces: 3.0.3 - picomatch: 2.3.2 + picomatch: 2.3.1 mime-db@1.52.0: {} @@ -9704,7 +9401,11 @@ snapshots: minimatch@10.2.5: dependencies: - brace-expansion: 5.0.5 + brace-expansion: 5.0.6 + + minimatch@3.1.2: + dependencies: + brace-expansion: 1.1.12 minimatch@3.1.5: dependencies: @@ -9731,12 +9432,12 @@ snapshots: ms@2.1.3: {} - msw@2.8.4(@types/node@20.19.39)(typescript@5.5.4): + msw@2.8.4(@types/node@20.19.40)(typescript@5.5.4): dependencies: '@bundled-es-modules/cookie': 2.0.1 '@bundled-es-modules/statuses': 1.0.1 '@bundled-es-modules/tough-cookie': 0.1.6 - '@inquirer/confirm': 5.1.12(@types/node@20.19.39) + '@inquirer/confirm': 5.1.12(@types/node@20.19.40) '@mswjs/interceptors': 0.37.6 '@open-draft/deferred-promise': 2.2.0 '@open-draft/until': 2.1.0 @@ -9756,32 +9457,6 @@ snapshots: transitivePeerDependencies: - '@types/node' - msw@2.8.4(@types/node@20.19.39)(typescript@5.9.3): - dependencies: - '@bundled-es-modules/cookie': 2.0.1 - '@bundled-es-modules/statuses': 1.0.1 - '@bundled-es-modules/tough-cookie': 0.1.6 - '@inquirer/confirm': 5.1.12(@types/node@20.19.39) - '@mswjs/interceptors': 0.37.6 - '@open-draft/deferred-promise': 2.2.0 - '@open-draft/until': 2.1.0 - '@types/cookie': 0.6.0 - '@types/statuses': 2.0.5 - graphql: 16.11.0 - headers-polyfill: 4.0.3 - is-node-process: 1.2.0 - outvariant: 1.4.3 - path-to-regexp: 6.3.0 - picocolors: 1.1.1 - strict-event-emitter: 0.5.1 - type-fest: 4.41.0 - yargs: 17.7.2 - optionalDependencies: - typescript: 5.9.3 - transitivePeerDependencies: - - '@types/node' - optional: true - mustache@4.2.0: {} mute-stream@2.0.0: {} @@ -9806,24 +9481,25 @@ snapshots: next-tick@1.1.0: {} - next@15.5.15(@babel/core@7.28.3)(@opentelemetry/api@1.9.0)(react-dom@19.2.5(react@19.2.5))(react@19.2.5): + next@16.2.6(@babel/core@7.28.3)(@opentelemetry/api@1.9.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6): dependencies: - '@next/env': 15.5.15 + '@next/env': 16.2.6 '@swc/helpers': 0.5.15 + baseline-browser-mapping: 2.10.29 caniuse-lite: 1.0.30001791 postcss: 8.4.31 - react: 19.2.5 - react-dom: 19.2.5(react@19.2.5) - styled-jsx: 5.1.6(@babel/core@7.28.3)(react@19.2.5) + react: 19.2.6 + react-dom: 19.2.6(react@19.2.6) + styled-jsx: 5.1.6(@babel/core@7.28.3)(react@19.2.6) optionalDependencies: - '@next/swc-darwin-arm64': 15.5.15 - '@next/swc-darwin-x64': 15.5.15 - '@next/swc-linux-arm64-gnu': 15.5.15 - '@next/swc-linux-arm64-musl': 15.5.15 - '@next/swc-linux-x64-gnu': 15.5.15 - '@next/swc-linux-x64-musl': 15.5.15 - '@next/swc-win32-arm64-msvc': 15.5.15 - '@next/swc-win32-x64-msvc': 15.5.15 + '@next/swc-darwin-arm64': 16.2.6 + '@next/swc-darwin-x64': 16.2.6 + '@next/swc-linux-arm64-gnu': 16.2.6 + '@next/swc-linux-arm64-musl': 16.2.6 + '@next/swc-linux-x64-gnu': 16.2.6 + '@next/swc-linux-x64-musl': 16.2.6 + '@next/swc-win32-arm64-msvc': 16.2.6 + '@next/swc-win32-x64-msvc': 16.2.6 '@opentelemetry/api': 1.9.0 sharp: 0.34.5 transitivePeerDependencies: @@ -9836,7 +9512,7 @@ snapshots: dependencies: whatwg-url: 5.0.0 - node-gyp-build@4.8.4: {} + node-gyp-build@4.7.0: {} node-releases@2.0.13: {} @@ -9924,17 +9600,17 @@ snapshots: openapi-types@12.1.3: {} - openapi-zod-client@1.18.3(react@19.2.5): + openapi-zod-client@1.18.3(react@19.2.6): dependencies: '@apidevtools/swagger-parser': 10.1.1(openapi-types@12.1.3) '@liuli-util/fs-extra': 0.1.0 '@zodios/core': 10.9.6(axios@1.16.0)(zod@3.25.34) axios: 1.16.0 cac: 6.7.14 - handlebars: 4.7.8 + handlebars: 4.7.9 openapi-types: 12.1.3 openapi3-ts: 3.1.0 - pastable: 2.2.1(react@19.2.5) + pastable: 2.2.1(react@19.2.6) prettier: 2.8.8 tanu: 0.1.13 ts-pattern: 5.8.0 @@ -9981,13 +9657,13 @@ snapshots: parseurl@1.3.3: {} - pastable@2.2.1(react@19.2.5): + pastable@2.2.1(react@19.2.6): dependencies: '@babel/core': 7.28.3 ts-toolbelt: 9.6.0 type-fest: 3.13.1 optionalDependencies: - react: 19.2.5 + react: 19.2.6 transitivePeerDependencies: - supports-color @@ -10022,18 +9698,14 @@ snapshots: picocolors@1.1.1: {} - picomatch@2.3.2: {} + picomatch@2.3.1: {} picomatch@4.0.3: {} - picomatch@4.0.4: {} - pify@2.3.0: {} pirates@4.0.6: {} - pirates@4.0.7: {} - pkg-types@1.3.1: dependencies: confbox: 0.1.8 @@ -10044,28 +9716,28 @@ snapshots: possible-typed-array-names@1.1.0: {} - postcss-import@15.1.0(postcss@8.5.14): + postcss-import@15.1.0(postcss@8.5.13): dependencies: - postcss: 8.5.14 + postcss: 8.5.13 postcss-value-parser: 4.2.0 read-cache: 1.0.0 resolve: 1.22.8 - postcss-js@4.0.1(postcss@8.5.14): + postcss-js@4.0.1(postcss@8.5.13): dependencies: camelcase-css: 2.0.1 - postcss: 8.5.14 + postcss: 8.5.13 - postcss-load-config@6.0.1(jiti@1.21.7)(postcss@8.5.14): + postcss-load-config@6.0.1(jiti@1.21.7)(postcss@8.5.13): dependencies: lilconfig: 3.1.3 optionalDependencies: jiti: 1.21.7 - postcss: 8.5.14 + postcss: 8.5.13 - postcss-nested@6.2.0(postcss@8.5.14): + postcss-nested@6.2.0(postcss@8.5.13): dependencies: - postcss: 8.5.14 + postcss: 8.5.13 postcss-selector-parser: 6.1.2 postcss-selector-parser@6.1.2: @@ -10087,12 +9759,6 @@ snapshots: picocolors: 1.1.1 source-map-js: 1.2.1 - postcss@8.5.14: - dependencies: - nanoid: 3.3.12 - picocolors: 1.1.1 - source-map-js: 1.2.1 - prelude-ls@1.2.1: {} prettier@2.8.8: {} @@ -10117,7 +9783,7 @@ snapshots: '@protobufjs/path': 1.1.2 '@protobufjs/pool': 1.1.0 '@protobufjs/utf8': 1.1.0 - '@types/node': 17.0.45 + '@types/node': 22.19.18 long: 5.3.2 proxy-addr@2.0.7: @@ -10139,10 +9805,6 @@ snapshots: dependencies: side-channel: 1.1.0 - qs@6.14.2: - dependencies: - side-channel: 1.1.0 - qs@6.15.1: dependencies: side-channel: 1.1.0 @@ -10169,14 +9831,14 @@ snapshots: iconv-lite: 0.7.2 unpipe: 1.0.0 - react-dom@19.2.5(react@19.2.5): + react-dom@19.2.6(react@19.2.6): dependencies: - react: 19.2.5 + react: 19.2.6 scheduler: 0.27.0 react-is@16.13.1: {} - react@19.2.5: {} + react@19.2.6: {} read-cache@1.0.0: dependencies: @@ -10184,7 +9846,7 @@ snapshots: readdirp@3.6.0: dependencies: - picomatch: 2.3.2 + picomatch: 2.3.1 readdirp@4.1.2: {} @@ -10271,37 +9933,6 @@ snapshots: '@rollup/rollup-win32-x64-msvc': 4.46.4 fsevents: 2.3.3 - rollup@4.60.3: - dependencies: - '@types/estree': 1.0.8 - optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.60.3 - '@rollup/rollup-android-arm64': 4.60.3 - '@rollup/rollup-darwin-arm64': 4.60.3 - '@rollup/rollup-darwin-x64': 4.60.3 - '@rollup/rollup-freebsd-arm64': 4.60.3 - '@rollup/rollup-freebsd-x64': 4.60.3 - '@rollup/rollup-linux-arm-gnueabihf': 4.60.3 - '@rollup/rollup-linux-arm-musleabihf': 4.60.3 - '@rollup/rollup-linux-arm64-gnu': 4.60.3 - '@rollup/rollup-linux-arm64-musl': 4.60.3 - '@rollup/rollup-linux-loong64-gnu': 4.60.3 - '@rollup/rollup-linux-loong64-musl': 4.60.3 - '@rollup/rollup-linux-ppc64-gnu': 4.60.3 - '@rollup/rollup-linux-ppc64-musl': 4.60.3 - '@rollup/rollup-linux-riscv64-gnu': 4.60.3 - '@rollup/rollup-linux-riscv64-musl': 4.60.3 - '@rollup/rollup-linux-s390x-gnu': 4.60.3 - '@rollup/rollup-linux-x64-gnu': 4.60.3 - '@rollup/rollup-linux-x64-musl': 4.60.3 - '@rollup/rollup-openbsd-x64': 4.60.3 - '@rollup/rollup-openharmony-arm64': 4.60.3 - '@rollup/rollup-win32-arm64-msvc': 4.60.3 - '@rollup/rollup-win32-ia32-msvc': 4.60.3 - '@rollup/rollup-win32-x64-gnu': 4.60.3 - '@rollup/rollup-win32-x64-msvc': 4.60.3 - fsevents: 2.3.3 - router@2.2.0: dependencies: debug: 4.4.3 @@ -10475,7 +10106,7 @@ snapshots: shebang-regex@3.0.0: {} - side-channel-list@1.0.1: + side-channel-list@1.0.0: dependencies: es-errors: 1.3.0 object-inspect: 1.13.4 @@ -10499,7 +10130,7 @@ snapshots: dependencies: es-errors: 1.3.0 object-inspect: 1.13.4 - side-channel-list: 1.0.1 + side-channel-list: 1.0.0 side-channel-map: 1.0.1 side-channel-weakmap: 1.0.2 @@ -10636,10 +10267,10 @@ snapshots: strnum@2.2.3: {} - styled-jsx@5.1.6(@babel/core@7.28.3)(react@19.2.5): + styled-jsx@5.1.6(@babel/core@7.28.3)(react@19.2.6): dependencies: client-only: 0.0.1 - react: 19.2.5 + react: 19.2.6 optionalDependencies: '@babel/core': 7.28.3 @@ -10653,16 +10284,6 @@ snapshots: pirates: 4.0.6 ts-interface-checker: 0.1.13 - sucrase@3.35.1: - dependencies: - '@jridgewell/gen-mapping': 0.3.13 - commander: 4.1.1 - lines-and-columns: 1.2.4 - mz: 2.7.0 - pirates: 4.0.7 - tinyglobby: 0.2.16 - ts-interface-checker: 0.1.13 - sugar-high@0.4.7: {} supports-color@10.2.2: {} @@ -10694,10 +10315,10 @@ snapshots: dependencies: dequal: 2.0.3 - swr@2.2.0(react@19.2.5): + swr@2.2.0(react@19.2.6): dependencies: - react: 19.2.5 - use-sync-external-store: 1.2.0(react@19.2.5) + react: 19.2.6 + use-sync-external-store: 1.2.0(react@19.2.6) swrev@4.0.0: {} @@ -10725,14 +10346,14 @@ snapshots: normalize-path: 3.0.0 object-hash: 3.0.0 picocolors: 1.1.1 - postcss: 8.5.14 - postcss-import: 15.1.0(postcss@8.5.14) - postcss-js: 4.0.1(postcss@8.5.14) - postcss-load-config: 6.0.1(jiti@1.21.7)(postcss@8.5.14) - postcss-nested: 6.2.0(postcss@8.5.14) + postcss: 8.5.13 + postcss-import: 15.1.0(postcss@8.5.13) + postcss-js: 4.0.1(postcss@8.5.13) + postcss-load-config: 6.0.1(jiti@1.21.7)(postcss@8.5.13) + postcss-nested: 6.2.0(postcss@8.5.13) postcss-selector-parser: 6.1.2 resolve: 1.22.8 - sucrase: 3.35.1 + sucrase: 3.35.0 transitivePeerDependencies: - tsx - yaml @@ -10740,7 +10361,7 @@ snapshots: tanu@0.1.13: dependencies: tslib: 2.8.1 - typescript: 4.9.5 + typescript: 4.7.4 tapable@2.2.1: {} @@ -10765,11 +10386,6 @@ snapshots: fdir: 6.5.0(picomatch@4.0.3) picomatch: 4.0.3 - tinyglobby@0.2.16: - dependencies: - fdir: 6.5.0(picomatch@4.0.4) - picomatch: 4.0.4 - tinyrainbow@3.1.0: {} to-regex-range@5.0.1: @@ -10809,10 +10425,6 @@ snapshots: optionalDependencies: typescript: 5.5.4 - tsconfck@3.1.4(typescript@5.9.3): - optionalDependencies: - typescript: 5.9.3 - tsconfig-paths@3.15.0: dependencies: '@types/json5': 0.0.29 @@ -10822,7 +10434,7 @@ snapshots: tslib@2.8.1: {} - tsup@8.5.1(jiti@1.21.7)(postcss@8.5.14)(typescript@5.5.4): + tsup@8.5.1(jiti@1.21.7)(postcss@8.5.13)(typescript@5.3.3): dependencies: bundle-require: 5.1.0(esbuild@0.27.0) cac: 6.7.14 @@ -10833,7 +10445,7 @@ snapshots: fix-dts-default-cjs-exports: 1.0.1 joycon: 3.1.1 picocolors: 1.1.1 - postcss-load-config: 6.0.1(jiti@1.21.7)(postcss@8.5.14) + postcss-load-config: 6.0.1(jiti@1.21.7)(postcss@8.5.13) resolve-from: 5.0.0 rollup: 4.46.4 source-map: 0.7.6 @@ -10842,15 +10454,15 @@ snapshots: tinyglobby: 0.2.15 tree-kill: 1.2.2 optionalDependencies: - postcss: 8.5.14 - typescript: 5.5.4 + postcss: 8.5.13 + typescript: 5.3.3 transitivePeerDependencies: - jiti - supports-color - tsx - yaml - tsup@8.5.1(jiti@1.21.7)(postcss@8.5.14)(typescript@5.9.3): + tsup@8.5.1(jiti@1.21.7)(postcss@8.5.13)(typescript@5.5.4): dependencies: bundle-require: 5.1.0(esbuild@0.27.0) cac: 6.7.14 @@ -10861,7 +10473,7 @@ snapshots: fix-dts-default-cjs-exports: 1.0.1 joycon: 3.1.1 picocolors: 1.1.1 - postcss-load-config: 6.0.1(jiti@1.21.7)(postcss@8.5.14) + postcss-load-config: 6.0.1(jiti@1.21.7)(postcss@8.5.13) resolve-from: 5.0.0 rollup: 4.46.4 source-map: 0.7.6 @@ -10870,8 +10482,8 @@ snapshots: tinyglobby: 0.2.15 tree-kill: 1.2.2 optionalDependencies: - postcss: 8.5.14 - typescript: 5.9.3 + postcss: 8.5.13 + typescript: 5.5.4 transitivePeerDependencies: - jiti - supports-color @@ -10994,25 +10606,23 @@ snapshots: dependencies: is-typedarray: 1.0.0 - typescript-eslint@8.53.0(eslint@9.39.4)(typescript@5.5.4): + typescript-eslint@8.53.0(eslint@9.39.4(jiti@1.21.7))(typescript@5.5.4): dependencies: - '@typescript-eslint/eslint-plugin': 8.53.0(@typescript-eslint/parser@8.53.0(eslint@9.39.4)(typescript@5.5.4))(eslint@9.39.4)(typescript@5.5.4) - '@typescript-eslint/parser': 8.53.0(eslint@9.39.4)(typescript@5.5.4) + '@typescript-eslint/eslint-plugin': 8.53.0(@typescript-eslint/parser@8.53.0(eslint@9.39.4(jiti@1.21.7))(typescript@5.5.4))(eslint@9.39.4(jiti@1.21.7))(typescript@5.5.4) + '@typescript-eslint/parser': 8.53.0(eslint@9.39.4(jiti@1.21.7))(typescript@5.5.4) '@typescript-eslint/typescript-estree': 8.53.0(typescript@5.5.4) - '@typescript-eslint/utils': 8.53.0(eslint@9.39.4)(typescript@5.5.4) - eslint: 9.39.4 + '@typescript-eslint/utils': 8.53.0(eslint@9.39.4(jiti@1.21.7))(typescript@5.5.4) + eslint: 9.39.4(jiti@1.21.7) typescript: 5.5.4 transitivePeerDependencies: - supports-color - typescript@4.9.5: {} + typescript@4.7.4: {} typescript@5.3.3: {} typescript@5.5.4: {} - typescript@5.9.3: {} - ufo@1.6.1: {} uglify-js@3.19.3: @@ -11029,6 +10639,8 @@ snapshots: undici-types@6.21.0: {} + undici@6.25.0: {} + undici@7.24.8: {} unenv@2.0.0-rc.24: @@ -11074,13 +10686,13 @@ snapshots: punycode: 1.3.2 querystring: 0.2.0 - use-sync-external-store@1.2.0(react@19.2.5): + use-sync-external-store@1.2.0(react@19.2.6): dependencies: - react: 19.2.5 + react: 19.2.6 utf-8-validate@5.0.10: dependencies: - node-gyp-build: 4.8.4 + node-gyp-build: 4.7.0 util-deprecate@1.0.2: {} @@ -11100,71 +10712,33 @@ snapshots: vary@1.1.2: {} - vite-tsconfig-paths@6.1.1(typescript@5.5.4)(vite@7.2.7(@types/node@20.19.39)(jiti@1.21.7)): + vite-tsconfig-paths@6.1.1(typescript@5.5.4)(vite@7.2.7(@types/node@20.19.40)(jiti@1.21.7)): dependencies: debug: 4.4.3 globrex: 0.1.2 tsconfck: 3.1.4(typescript@5.5.4) - vite: 7.2.7(@types/node@20.19.39)(jiti@1.21.7) + vite: 7.2.7(@types/node@20.19.40)(jiti@1.21.7) transitivePeerDependencies: - supports-color - typescript - vite-tsconfig-paths@6.1.1(typescript@5.9.3)(vite@7.2.7(@types/node@20.19.39)(jiti@1.21.7)): + vite@7.2.7(@types/node@20.19.40)(jiti@1.21.7): dependencies: - debug: 4.4.3 - globrex: 0.1.2 - tsconfck: 3.1.4(typescript@5.9.3) - vite: 7.2.7(@types/node@20.19.39)(jiti@1.21.7) - transitivePeerDependencies: - - supports-color - - typescript - - vite@7.2.7(@types/node@20.19.39)(jiti@1.21.7): - dependencies: - esbuild: 0.25.12 + esbuild: 0.25.9 fdir: 6.5.0(picomatch@4.0.3) picomatch: 4.0.3 postcss: 8.5.13 - rollup: 4.60.3 + rollup: 4.46.4 tinyglobby: 0.2.15 optionalDependencies: - '@types/node': 20.19.39 + '@types/node': 20.19.40 fsevents: 2.3.3 jiti: 1.21.7 - vitest@4.1.5(@opentelemetry/api@1.9.0)(@types/node@20.19.39)(msw@2.8.4(@types/node@20.19.39)(typescript@5.5.4))(vite@7.2.7(@types/node@20.19.39)(jiti@1.21.7)): - dependencies: - '@vitest/expect': 4.1.5 - '@vitest/mocker': 4.1.5(msw@2.8.4(@types/node@20.19.39)(typescript@5.5.4))(vite@7.2.7(@types/node@20.19.39)(jiti@1.21.7)) - '@vitest/pretty-format': 4.1.5 - '@vitest/runner': 4.1.5 - '@vitest/snapshot': 4.1.5 - '@vitest/spy': 4.1.5 - '@vitest/utils': 4.1.5 - es-module-lexer: 2.1.0 - expect-type: 1.3.0 - magic-string: 0.30.21 - obug: 2.1.1 - pathe: 2.0.3 - picomatch: 4.0.3 - std-env: 4.1.0 - tinybench: 2.9.0 - tinyexec: 1.1.2 - tinyglobby: 0.2.15 - tinyrainbow: 3.1.0 - vite: 7.2.7(@types/node@20.19.39)(jiti@1.21.7) - why-is-node-running: 2.3.0 - optionalDependencies: - '@opentelemetry/api': 1.9.0 - '@types/node': 20.19.39 - transitivePeerDependencies: - - msw - - vitest@4.1.5(@opentelemetry/api@1.9.0)(@types/node@20.19.39)(msw@2.8.4(@types/node@20.19.39)(typescript@5.9.3))(vite@7.2.7(@types/node@20.19.39)(jiti@1.21.7)): + vitest@4.1.5(@opentelemetry/api@1.9.0)(@types/node@20.19.40)(msw@2.8.4(@types/node@20.19.40)(typescript@5.5.4))(vite@7.2.7(@types/node@20.19.40)(jiti@1.21.7)): dependencies: '@vitest/expect': 4.1.5 - '@vitest/mocker': 4.1.5(msw@2.8.4(@types/node@20.19.39)(typescript@5.9.3))(vite@7.2.7(@types/node@20.19.39)(jiti@1.21.7)) + '@vitest/mocker': 4.1.5(msw@2.8.4(@types/node@20.19.40)(typescript@5.5.4))(vite@7.2.7(@types/node@20.19.40)(jiti@1.21.7)) '@vitest/pretty-format': 4.1.5 '@vitest/runner': 4.1.5 '@vitest/snapshot': 4.1.5 @@ -11181,11 +10755,11 @@ snapshots: tinyexec: 1.1.2 tinyglobby: 0.2.15 tinyrainbow: 3.1.0 - vite: 7.2.7(@types/node@20.19.39)(jiti@1.21.7) + vite: 7.2.7(@types/node@20.19.40)(jiti@1.21.7) why-is-node-running: 2.3.0 optionalDependencies: '@opentelemetry/api': 1.9.0 - '@types/node': 20.19.39 + '@types/node': 20.19.40 transitivePeerDependencies: - msw @@ -11317,7 +10891,7 @@ snapshots: '@cloudflare/workerd-linux-arm64': 1.20260504.1 '@cloudflare/workerd-windows-64': 1.20260504.1 - wrangler@4.88.0(@cloudflare/workers-types@4.20260505.1)(bufferutil@4.0.8)(utf-8-validate@5.0.10): + wrangler@4.88.0(@cloudflare/workers-types@4.20260509.1)(bufferutil@4.0.8)(utf-8-validate@5.0.10): dependencies: '@cloudflare/kv-asset-handler': 0.5.0 '@cloudflare/unenv-preset': 2.16.1(unenv@2.0.0-rc.24)(workerd@1.20260504.1) @@ -11328,7 +10902,7 @@ snapshots: unenv: 2.0.0-rc.24 workerd: 1.20260504.1 optionalDependencies: - '@cloudflare/workers-types': 4.20260505.1 + '@cloudflare/workers-types': 4.20260509.1 fsevents: 2.3.3 transitivePeerDependencies: - bufferutil