diff --git a/.github/workflows/job_test_api_local.yaml b/.github/workflows/job_test_api_local.yaml index 3cffc06e98..09db6c677d 100644 --- a/.github/workflows/job_test_api_local.yaml +++ b/.github/workflows/job_test_api_local.yaml @@ -23,6 +23,7 @@ jobs: uses: ./.github/actions/install with: ts: true + go: true - name: Build run: pnpm turbo run build --filter=./apps/api... @@ -34,6 +35,13 @@ jobs: env: DRIZZLE_DATABASE_URL: "mysql://unkey:password@localhost:3306/unkey" + - name: Migrate ClickHouse + run: goose up + env: + GOOSE_DRIVER: clickhouse + GOOSE_DBSTRING: "tcp://default:password@127.0.0.1:9000" + GOOSE_MIGRATION_DIR: ./internal/clickhouse/schema + - name: Test run: pnpm vitest run -c vitest.integration.ts working-directory: apps/api diff --git a/apps/api/src/pkg/analytics.ts b/apps/api/src/pkg/analytics.ts index b153801af0..7b91fd20f0 100644 --- a/apps/api/src/pkg/analytics.ts +++ b/apps/api/src/pkg/analytics.ts @@ -46,4 +46,11 @@ export class Analytics { public get getVerificationsDaily() { return this.clickhouse.verifications.perDay; } + + /** + * Use this sparingly, mostly for quick iterations + */ + public get internalQuerier() { + return this.clickhouse.querier; + } } diff --git a/apps/api/src/pkg/cache/index.ts b/apps/api/src/pkg/cache/index.ts index e820f52131..a23687cf96 100644 --- a/apps/api/src/pkg/cache/index.ts +++ b/apps/api/src/pkg/cache/index.ts @@ -71,6 +71,7 @@ export function initCache(c: Context, metrics: Metrics): C(c.executionCtx, defaultOpts), auditLogBucketByWorkspaceIdAndName: new Namespace< CacheNamespaces["auditLogBucketByWorkspaceIdAndName"] >(c.executionCtx, defaultOpts), diff --git a/apps/api/src/pkg/cache/namespaces.ts b/apps/api/src/pkg/cache/namespaces.ts index 741e689538..590222a0c9 100644 --- a/apps/api/src/pkg/cache/namespaces.ts +++ b/apps/api/src/pkg/cache/namespaces.ts @@ -63,6 +63,7 @@ export type CacheNamespaces = { total: number; }; identityByExternalId: Identity | null; + identityById: Identity | null; // uses a compound key of [workspaceId, name] auditLogBucketByWorkspaceIdAndName: { id: string; diff --git a/apps/api/src/pkg/testutil/env.ts b/apps/api/src/pkg/testutil/env.ts index ccd900d7cc..f9eeeaf806 100644 --- a/apps/api/src/pkg/testutil/env.ts +++ b/apps/api/src/pkg/testutil/env.ts @@ -4,6 +4,7 @@ export const databaseEnv = z.object({ DATABASE_HOST: z.string().default("localhost:3900"), DATABASE_USERNAME: z.string().default("unkey"), DATABASE_PASSWORD: z.string().default("password"), + CLICKHOUSE_URL: z.string().default("http://default:password@localhost:8123"), }); export const integrationTestEnv = databaseEnv.merge( diff --git a/apps/api/src/pkg/testutil/harness.ts b/apps/api/src/pkg/testutil/harness.ts index f0ee2a23d5..35db2d34aa 100644 --- a/apps/api/src/pkg/testutil/harness.ts +++ b/apps/api/src/pkg/testutil/harness.ts @@ -1,4 +1,5 @@ import { Client } from "@planetscale/database"; +import { ClickHouse } from "@unkey/clickhouse"; import { sha256 } from "@unkey/hash"; import { newId } from "@unkey/id"; import { KeyV1 } from "@unkey/keys"; @@ -27,10 +28,12 @@ export type Resources = { export abstract class Harness { public readonly db: { primary: Database; readonly: Database }; + public readonly ch: ClickHouse; public resources: Resources; constructor(t: TaskContext) { - const { DATABASE_HOST, DATABASE_PASSWORD, DATABASE_USERNAME } = databaseEnv.parse(process.env); + const { DATABASE_HOST, DATABASE_PASSWORD, DATABASE_USERNAME, CLICKHOUSE_URL } = + databaseEnv.parse(process.env); const db = drizzle( new Client({ @@ -51,6 +54,7 @@ export abstract class Harness { ); this.db = { primary: db, readonly: db }; + this.ch = new ClickHouse({ url: CLICKHOUSE_URL }); this.resources = this.createResources(); t.onTestFinished(async () => { @@ -131,7 +135,11 @@ export abstract class Harness { name: string; permissions?: string[]; }[]; - }): Promise<{ keyId: string; key: string }> { + }): Promise<{ + keyId: string; + key: string; + identityId?: string; + }> { /** * Prepare the key we'll use */ @@ -186,6 +194,7 @@ export abstract class Harness { return { keyId, key, + identityId: opts?.identityId, }; } diff --git a/apps/api/src/pkg/testutil/request.ts b/apps/api/src/pkg/testutil/request.ts index 55dceffac2..e7b2d448e9 100644 --- a/apps/api/src/pkg/testutil/request.ts +++ b/apps/api/src/pkg/testutil/request.ts @@ -3,6 +3,7 @@ export type StepRequest = { url: string; method: "POST" | "GET" | "PUT" | "DELETE"; headers?: Record; + searchparams?: Record; body?: TRequestBody; }; export type StepResponse = { @@ -14,7 +15,18 @@ export type StepResponse = { export async function step( req: StepRequest, ): Promise> { - const res = await fetch(req.url, { + const url = new URL(req.url); + for (const [k, vv] of Object.entries(req.searchparams ?? {})) { + if (Array.isArray(vv)) { + for (const v of vv) { + url.searchParams.append(k, v); + } + } else { + url.searchParams.append(k, vv); + } + } + + const res = await fetch(url, { method: req.method, headers: req.headers, body: JSON.stringify(req.body), @@ -28,7 +40,7 @@ export async function step( body: JSON.parse(body), }; } catch { - console.error(`${req.url} didn't return json, received: ${body}`); + console.error(`${url.toString()} didn't return json, received: ${body}`); return {} as StepResponse; } } diff --git a/apps/api/src/routes/v1_analytics_getVerifications.happy.test.ts b/apps/api/src/routes/v1_analytics_getVerifications.happy.test.ts new file mode 100644 index 0000000000..3b03908cf1 --- /dev/null +++ b/apps/api/src/routes/v1_analytics_getVerifications.happy.test.ts @@ -0,0 +1,1230 @@ +import { IntegrationHarness } from "src/pkg/testutil/integration-harness"; + +import { schema } from "@unkey/db"; +import { newId } from "@unkey/id"; +import { describe, expect, test } from "vitest"; +import { z } from "zod"; +import type { V1AnalyticsGetVerificationsResponse } from "./v1_analytics_getVerifications"; + +const POSSIBLE_OUTCOMES = ["VALID", "RATE_LIMITED", "DISABLED"] as const; + +describe("with no data", () => { + test("returns an array with one element per interval", async (t) => { + const h = await IntegrationHarness.init(t); + + const end = Date.now(); + const interval = 60 * 60 * 1000; // hour + const start = end - 30 * interval; + + const root = await h.createRootKey(["api.*.read_api"]); + const res = await h.get({ + url: "/v1/analytics.getVerifications", + searchparams: { + start: start.toString(), + end: end.toString(), + groupBy: "hour", + apiId: h.resources.userApi.id, + }, + headers: { + Authorization: `Bearer ${root.key}`, + }, + }); + + expect(res.status, `expected 200, received: ${JSON.stringify(res, null, 2)}`).toBe(200); + expect(res.body, JSON.stringify({ res }, null, 2)).toHaveLength( + Math.floor((end - start) / interval), + ); + }); +}); + +describe.each([ + // generate and query times are different to ensure the query covers the entire generate interval + // and the used toStartOf function in clickhouse + { + granularity: "hour", + generate: { start: "2024-12-05", end: "2024-12-07" }, + query: { start: "2024-12-04", end: "2024-12-10" }, + }, + { + granularity: "day", + generate: { start: "2024-12-05", end: "2024-12-07" }, + query: { start: "2024-12-01", end: "2024-12-10" }, + }, + { + granularity: "month", + generate: { start: "2024-10-1", end: "2025-10-12" }, + query: { start: "2023-12-01", end: "2026-12-10" }, + }, +])("per $granularity", (tc) => { + test("all verifications are accounted for", async (t) => { + const h = await IntegrationHarness.init(t); + + const verifications = generate({ + start: new Date(tc.generate.start).getTime(), + end: new Date(tc.generate.end).getTime(), + length: 100_000, + workspaceId: h.resources.userWorkspace.id, + keySpaceId: h.resources.userKeyAuth.id, + keys: Array.from({ length: 3 }).map(() => ({ keyId: newId("test") })), + }); + + await h.ch.verifications.insert(verifications); + + const inserted = await h.ch.querier.query({ + query: + "SELECT COUNT(*) AS count from verifications.raw_key_verifications_v1 WHERE workspace_id={workspaceId:String}", + params: z.object({ workspaceId: z.string() }), + schema: z.object({ count: z.number() }), + })({ + workspaceId: h.resources.userWorkspace.id, + }); + expect(inserted.val!.at(0)?.count).toEqual(verifications.length); + + const root = await h.createRootKey(["api.*.read_api"]); + + const res = await h.get({ + url: "/v1/analytics.getVerifications", + searchparams: { + start: new Date(tc.query.start).getTime().toString(), + end: new Date(tc.query.end).getTime().toString(), + groupBy: tc.granularity, + apiId: h.resources.userApi.id, + }, + headers: { + Authorization: `Bearer ${root.key}`, + }, + }); + + expect(res.status, `expected 200, received: ${JSON.stringify(res, null, 2)}`).toBe(200); + + const outcomes = verifications.reduce( + (acc, v) => { + if (!acc[v.outcome]) { + acc[v.outcome] = 0; + } + acc[v.outcome]++; + return acc; + }, + {} as { [K in (typeof POSSIBLE_OUTCOMES)[number]]: number }, + ); + + expect(res.body.reduce((sum, d) => sum + d.total, 0)).toEqual(verifications.length); + expect(res.body.reduce((sum, d) => sum + (d.valid ?? 0), 0)).toEqual(outcomes.VALID); + expect(res.body.reduce((sum, d) => sum + (d.notFound ?? 0), 0)).toEqual(0); + expect(res.body.reduce((sum, d) => sum + (d.forbidden ?? 0), 0)).toEqual(0); + expect(res.body.reduce((sum, d) => sum + (d.usageExceeded ?? 0), 0)).toEqual(0); + expect(res.body.reduce((sum, d) => sum + (d.rateLimited ?? 0), 0)).toEqual( + outcomes.RATE_LIMITED, + ); + expect(res.body.reduce((sum, d) => sum + (d.unauthorized ?? 0), 0)).toEqual(0); + expect(res.body.reduce((sum, d) => sum + (d.disabled ?? 0), 0)).toEqual(outcomes.DISABLED); + expect(res.body.reduce((sum, d) => sum + (d.insufficientPermissions ?? 0), 0)).toEqual(0); + expect(res.body.reduce((sum, d) => sum + (d.expired ?? 0), 0)).toEqual(0); + }); +}); + +describe("RFC scenarios", () => { + test("a user's usage over the past 24h for 2 keys", async (t) => { + const h = await IntegrationHarness.init(t); + + const identity = { + workspaceId: h.resources.userWorkspace.id, + id: newId("test"), + externalId: newId("test"), + }; + + await h.db.primary.insert(schema.identities).values(identity); + + const keys = await Promise.all([ + h.createKey({ identityId: identity.id }), + h.createKey({ identityId: identity.id }), + h.createKey(), // unrelated noise + ]); + + const now = Date.now(); + + const verifications = generate({ + start: now - 12 * 60 * 60 * 1000, + end: now, + length: 100_000, + workspaceId: h.resources.userWorkspace.id, + keySpaceId: h.resources.userKeyAuth.id, + keys: keys.map((k) => ({ keyId: k.keyId, identityId: k.identityId })), + }); + + await h.ch.verifications.insert(verifications); + + const root = await h.createRootKey(["api.*.read_api"]); + + const start = now - 24 * 60 * 60 * 1000; + const end = now; + + const res = await h.get({ + url: "/v1/analytics.getVerifications", + searchparams: { + start: start.toString(), + end: end.toString(), + externalId: identity.externalId, + groupBy: "hour", + apiId: h.resources.userApi.id, + }, + headers: { + Authorization: `Bearer ${root.key}`, + }, + }); + + expect(res.status, `expected 200, received: ${JSON.stringify(res, null, 2)}`).toBe(200); + + let total = 0; + const outcomes = verifications.reduce( + (acc, v) => { + if (v.identity_id !== identity.id) { + return acc; + } + + acc[v.outcome]++; + total++; + return acc; + }, + { VALID: 0, RATE_LIMITED: 0, DISABLED: 0 } as { + [K in (typeof POSSIBLE_OUTCOMES)[number]]: number; + }, + ); + + expect(res.body.length).gte(24); + expect(res.body.length).lte(25); + + expect(res.body.reduce((sum, d) => sum + d.total, 0)).toEqual(total); + expect(res.body.reduce((sum, d) => sum + (d.valid ?? 0), 0)).toEqual(outcomes.VALID); + expect(res.body.reduce((sum, d) => sum + (d.notFound ?? 0), 0)).toEqual(0); + expect(res.body.reduce((sum, d) => sum + (d.forbidden ?? 0), 0)).toEqual(0); + expect(res.body.reduce((sum, d) => sum + (d.usageExceeded ?? 0), 0)).toEqual(0); + expect(res.body.reduce((sum, d) => sum + (d.rateLimited ?? 0), 0)).toEqual( + outcomes.RATE_LIMITED, + ); + expect(res.body.reduce((sum, d) => sum + (d.unauthorized ?? 0), 0)).toEqual(0); + expect(res.body.reduce((sum, d) => sum + (d.disabled ?? 0), 0)).toEqual(outcomes.DISABLED); + expect(res.body.reduce((sum, d) => sum + (d.insufficientPermissions ?? 0), 0)).toEqual(0); + expect(res.body.reduce((sum, d) => sum + (d.expired ?? 0), 0)).toEqual(0); + }); + + test("daily usage breakdown for a user per key in the current month", async (t) => { + const h = await IntegrationHarness.init(t); + + const identity = { + workspaceId: h.resources.userWorkspace.id, + id: newId("test"), + externalId: newId("test"), + }; + + await h.db.primary.insert(schema.identities).values(identity); + + const keys = await Promise.all([ + h.createKey({ identityId: identity.id }), + h.createKey({ identityId: identity.id }), + h.createKey({ identityId: identity.id }), + h.createKey(), + ]); + + const now = Date.now(); + + const verifications = generate({ + start: now - 12 * 60 * 60 * 1000, + end: now, + length: 100_000, + workspaceId: h.resources.userWorkspace.id, + keySpaceId: h.resources.userKeyAuth.id, + keys: keys.map((k) => ({ keyId: k.keyId, identityId: k.identityId })), + }); + + await h.ch.verifications.insert(verifications); + + const root = await h.createRootKey(["api.*.read_api"]); + + const start = now - 24 * 60 * 60 * 1000; + const end = now; + + const res = await h.get({ + url: "/v1/analytics.getVerifications", + searchparams: { + start: start.toString(), + end: end.toString(), + externalId: identity.externalId, + groupBy: ["key", "hour"], + apiId: h.resources.userApi.id, + }, + headers: { + Authorization: `Bearer ${root.key}`, + }, + }); + + expect(res.status, `expected 200, received: ${JSON.stringify(res, null, 2)}`).toBe(200); + + for (const row of res.body) { + expect(row.keyId).toBeDefined(); + } + + let total = 0; + const outcomes = verifications.reduce( + (acc, v) => { + if (v.identity_id !== identity.id) { + return acc; + } + + acc[v.outcome]++; + total++; + return acc; + }, + { VALID: 0, DISABLED: 0, RATE_LIMITED: 0 } as { + [K in (typeof POSSIBLE_OUTCOMES)[number]]: number; + }, + ); + + expect(res.body.reduce((sum, d) => sum + d.total, 0)).toEqual(total); + expect(res.body.reduce((sum, d) => sum + (d.valid ?? 0), 0)).toEqual(outcomes.VALID); + expect(res.body.reduce((sum, d) => sum + (d.notFound ?? 0), 0)).toEqual(0); + expect(res.body.reduce((sum, d) => sum + (d.forbidden ?? 0), 0)).toEqual(0); + expect(res.body.reduce((sum, d) => sum + (d.usageExceeded ?? 0), 0)).toEqual(0); + expect(res.body.reduce((sum, d) => sum + (d.rateLimited ?? 0), 0)).toEqual( + outcomes.RATE_LIMITED, + ); + expect(res.body.reduce((sum, d) => sum + (d.unauthorized ?? 0), 0)).toEqual(0); + expect(res.body.reduce((sum, d) => sum + (d.disabled ?? 0), 0)).toEqual(outcomes.DISABLED); + expect(res.body.reduce((sum, d) => sum + (d.insufficientPermissions ?? 0), 0)).toEqual(0); + expect(res.body.reduce((sum, d) => sum + (d.expired ?? 0), 0)).toEqual(0); + + // Per Key + for (const key of keys.filter((k) => k.identityId)) { + let keyTotal = 0; + const keyOutcomes = verifications.reduce( + (acc, v) => { + if (v.key_id !== key.keyId) { + return acc; + } + + acc[v.outcome]++; + keyTotal++; + return acc; + }, + { VALID: 0, DISABLED: 0, RATE_LIMITED: 0 } as { + [K in (typeof POSSIBLE_OUTCOMES)[number]]: number; + }, + ); + + expect( + res.body.filter((d) => d.keyId === key.keyId).reduce((sum, d) => sum + d.total, 0), + ).toEqual(keyTotal); + expect( + res.body.filter((d) => d.keyId === key.keyId).reduce((sum, d) => sum + (d.valid ?? 0), 0), + ).toEqual(keyOutcomes.VALID); + expect( + res.body + .filter((d) => d.keyId === key.keyId) + .reduce((sum, d) => sum + (d.notFound ?? 0), 0), + ).toEqual(0); + expect( + res.body + .filter((d) => d.keyId === key.keyId) + .reduce((sum, d) => sum + (d.forbidden ?? 0), 0), + ).toEqual(0); + expect( + res.body + .filter((d) => d.keyId === key.keyId) + .reduce((sum, d) => sum + (d.usageExceeded ?? 0), 0), + ).toEqual(0); + expect( + res.body + .filter((d) => d.keyId === key.keyId) + .reduce((sum, d) => sum + (d.rateLimited ?? 0), 0), + ).toEqual(keyOutcomes.RATE_LIMITED); + expect( + res.body + .filter((d) => d.keyId === key.keyId) + .reduce((sum, d) => sum + (d.unauthorized ?? 0), 0), + ).toEqual(0); + expect( + res.body + .filter((d) => d.keyId === key.keyId) + .reduce((sum, d) => sum + (d.disabled ?? 0), 0), + ).toEqual(keyOutcomes.DISABLED); + expect( + res.body + .filter((d) => d.keyId === key.keyId) + .reduce((sum, d) => sum + (d.insufficientPermissions ?? 0), 0), + ).toEqual(0); + expect( + res.body.filter((d) => d.keyId === key.keyId).reduce((sum, d) => sum + (d.expired ?? 0), 0), + ).toEqual(0); + } + }); + + test("A monthly cron job creates invoices for each identity", async (t) => { + const h = await IntegrationHarness.init(t); + + const identity = { + workspaceId: h.resources.userWorkspace.id, + id: newId("test"), + externalId: newId("test"), + }; + + await h.db.primary.insert(schema.identities).values(identity); + + const keys = await Promise.all([ + h.createKey({ identityId: identity.id }), + h.createKey({ identityId: identity.id }), + h.createKey({ identityId: identity.id }), + h.createKey(), + ]); + + const now = Date.now(); + + const verifications = generate({ + start: now - 3 * 30 * 24 * 60 * 60 * 1000, + end: now, + length: 100_000, + workspaceId: h.resources.userWorkspace.id, + keySpaceId: h.resources.userKeyAuth.id, + keys: keys.map((k) => ({ keyId: k.keyId, identityId: k.identityId })), + }); + + await h.ch.verifications.insert(verifications); + + const root = await h.createRootKey(["api.*.read_api"]); + + const start = new Date(now).setMonth(new Date(now).getMonth() - 1, 1); + const end = now; + + const res = await h.get({ + url: "/v1/analytics.getVerifications", + searchparams: { + start: start.toString(), + end: end.toString(), + externalId: identity.externalId, + groupBy: "month", + apiId: h.resources.userApi.id, + }, + headers: { + Authorization: `Bearer ${root.key}`, + }, + }); + + expect(res.status, `expected 200, received: ${JSON.stringify(res, null, 2)}`).toBe(200); + + expect(res.body.length).lte(2); + expect(res.body.length).gte(1); + let total = 0; + const outcomes = verifications.reduce( + (acc, v) => { + if ( + v.identity_id !== identity.id || + new Date(v.time).getUTCMonth() !== new Date(now).getUTCMonth() + ) { + return acc; + } + + acc[v.outcome]++; + total++; + return acc; + }, + { VALID: 0, DISABLED: 0, RATE_LIMITED: 0 } as { + [K in (typeof POSSIBLE_OUTCOMES)[number]]: number; + }, + ); + + expect(res.body.reduce((sum, d) => sum + d.total, 0)).toEqual(total); + expect(res.body.reduce((sum, d) => sum + (d.valid ?? 0), 0)).toEqual(outcomes.VALID); + expect(res.body.reduce((sum, d) => sum + (d.notFound ?? 0), 0)).toEqual(0); + expect(res.body.reduce((sum, d) => sum + (d.forbidden ?? 0), 0)).toEqual(0); + expect(res.body.reduce((sum, d) => sum + (d.usageExceeded ?? 0), 0)).toEqual(0); + expect(res.body.reduce((sum, d) => sum + (d.rateLimited ?? 0), 0)).toEqual( + outcomes.RATE_LIMITED, + ); + expect(res.body.reduce((sum, d) => sum + (d.unauthorized ?? 0), 0)).toEqual(0); + expect(res.body.reduce((sum, d) => sum + (d.disabled ?? 0), 0)).toEqual(outcomes.DISABLED); + expect(res.body.reduce((sum, d) => sum + (d.insufficientPermissions ?? 0), 0)).toEqual(0); + expect(res.body.reduce((sum, d) => sum + (d.expired ?? 0), 0)).toEqual(0); + }); + + test("a user sees a gauge with their quota, showing they used X out of Y API calls in the current billing period", async (t) => { + const h = await IntegrationHarness.init(t); + + const identity = { + workspaceId: h.resources.userWorkspace.id, + id: newId("test"), + externalId: newId("test"), + }; + + await h.db.primary.insert(schema.identities).values(identity); + + const keys = await Promise.all([ + h.createKey({ identityId: identity.id }), + h.createKey({ identityId: identity.id }), + h.createKey({ identityId: identity.id }), + h.createKey(), + ]); + + const now = Date.now(); + + const verifications = generate({ + start: now - 60 * 24 * 60 * 60 * 1000, + end: now, + length: 100_000, + workspaceId: h.resources.userWorkspace.id, + keySpaceId: h.resources.userKeyAuth.id, + keys: keys.map((k) => ({ keyId: k.keyId, identityId: k.identityId })), + }); + + await h.ch.verifications.insert(verifications); + + const root = await h.createRootKey(["api.*.read_api"]); + + const d = new Date(now); + d.setUTCDate(2); + d.setUTCHours(0, 0, 0, 0); + const start = d.getTime(); + const end = new Date(start).setUTCMonth(new Date(start).getUTCMonth() + 1); + + const res = await h.get({ + url: "/v1/analytics.getVerifications", + searchparams: { + start: start.toString(), + end: end.toString(), + apiId: h.resources.userApi.id, + externalId: identity.externalId, + groupBy: "day", + }, + headers: { + Authorization: `Bearer ${root.key}`, + }, + }); + + expect(res.status, `expected 200, received: ${JSON.stringify(res, null, 2)}`).toBe(200); + + let total = 0; + const outcomes = verifications.reduce( + (acc, v) => { + if (v.identity_id !== identity.id || v.time < start) { + return acc; + } + + acc[v.outcome]++; + total++; + return acc; + }, + { VALID: 0, DISABLED: 0, RATE_LIMITED: 0 } as { + [K in (typeof POSSIBLE_OUTCOMES)[number]]: number; + }, + ); + + expect(res.body.reduce((sum, d) => sum + d.total, 0)).toEqual(total); + expect(res.body.reduce((sum, d) => sum + (d.valid ?? 0), 0)).toEqual(outcomes.VALID); + expect(res.body.reduce((sum, d) => sum + (d.notFound ?? 0), 0)).toEqual(0); + expect(res.body.reduce((sum, d) => sum + (d.forbidden ?? 0), 0)).toEqual(0); + expect(res.body.reduce((sum, d) => sum + (d.usageExceeded ?? 0), 0)).toEqual(0); + expect(res.body.reduce((sum, d) => sum + (d.rateLimited ?? 0), 0)).toEqual( + outcomes.RATE_LIMITED, + ); + expect(res.body.reduce((sum, d) => sum + (d.unauthorized ?? 0), 0)).toEqual(0); + expect(res.body.reduce((sum, d) => sum + (d.disabled ?? 0), 0)).toEqual(outcomes.DISABLED); + expect(res.body.reduce((sum, d) => sum + (d.insufficientPermissions ?? 0), 0)).toEqual(0); + expect(res.body.reduce((sum, d) => sum + (d.expired ?? 0), 0)).toEqual(0); + }); + + test("An internal dashboard shows the top 10 users by API usage over the past 30 days", async (t) => { + const h = await IntegrationHarness.init(t); + + const identities = Array.from({ length: 100 }).map((_) => ({ + workspaceId: h.resources.userWorkspace.id, + id: newId("test"), + externalId: newId("test"), + })); + + await h.db.primary.insert(schema.identities).values(identities); + + const keys = await Promise.all( + identities.flatMap((id) => + Array.from({ length: 3 }).map((_) => h.createKey({ identityId: id.id })), + ), + ); + + const now = Date.now(); + + const verifications = generate({ + start: now - 60 * 24 * 60 * 60 * 1000, + end: now, + length: 100_000, + workspaceId: h.resources.userWorkspace.id, + keySpaceId: h.resources.userKeyAuth.id, + keys: keys.map((k) => ({ keyId: k.keyId, identityId: k.identityId })), + }); + + const start = now - 30 * 24 * 60 * 60 * 1000; + const end = now; + + await h.ch.verifications.insert(verifications); + + const byIdentity = verifications.reduce( + (acc, v) => { + if (toStartOfHour(v.time) < start || toStartOfHour(v.time) > end) { + return acc; + } + if (!acc[v.identity_id!]) { + acc[v.identity_id!] = { + identityId: v.identity_id!, + valid: 0, + rateLimited: 0, + disabled: 0, + total: 0, + }; + } + acc[v.identity_id!].total += 1; + switch (v.outcome) { + case "VALID": { + acc[v.identity_id!].valid += 1; + break; + } + case "RATE_LIMITED": { + acc[v.identity_id!].rateLimited += 1; + break; + } + + case "DISABLED": { + acc[v.identity_id!].disabled += 1; + break; + } + } + return acc; + }, + {} as Record< + string, + { identityId: string; valid: number; rateLimited: number; total: number; disabled: number } + >, + ); + + const top15 = Object.values(byIdentity) + .sort((a, b) => b.total - a.total) + .slice(0, 15); + + const root = await h.createRootKey(["api.*.read_api"]); + + const res = await h.get({ + url: "/v1/analytics.getVerifications", + searchparams: { + start: start.toString(), + end: end.toString(), + apiId: h.resources.userApi.id, + limit: "10", + orderBy: ["total"], + order: "desc", + groupBy: ["identity"], + }, + headers: { + Authorization: `Bearer ${root.key}`, + }, + }); + + expect(res.status, `expected 200, received: ${JSON.stringify(res, null, 2)}`).toBe(200); + + expect(res.body.length).gte(1); + expect(res.body.length).lte(10); + expect(res.body.length).lte(top15.length); + + for (let i = 0; i < res.body.length; i++) { + if (i === 0) { + // Nothing to compare in the first iteration + continue; + } + // Order should be desc + expect(res.body[i].total <= res.body[i - 1].total); + + expect( + res.body[i].identity, + `we're grouping by identity, so it should be defined but it wasn't, + we got i=${i}$ ${JSON.stringify(res.body[i], null, 2)}`, + ).toBeDefined(); + expect(res.body[i].total).toEqual(top15[i].total); + } + + for (const row of res.body) { + const actual = top15.find((i) => i.identityId === row.identity!.id); + expect(actual).toBeDefined(); + expect(row.total).toEqual(actual!.total); + } + }); +}); + +test("filter by tag", async (t) => { + const h = await IntegrationHarness.init(t); + + const identity = { + workspaceId: h.resources.userWorkspace.id, + id: newId("test"), + externalId: newId("test"), + }; + + await h.db.primary.insert(schema.identities).values(identity); + + const keys = await Promise.all([ + h.createKey({ identityId: identity.id }), + h.createKey({ identityId: identity.id }), + h.createKey({ identityId: identity.id }), + h.createKey(), + ]); + + const now = Date.now(); + + const tags = [["a", "b"], ["a"], [], ["b", "c"]]; + + const verifications = tags.flatMap((tags) => + generate({ + start: now - 60 * 24 * 60 * 60 * 1000, + end: now, + length: 100_000, + workspaceId: h.resources.userWorkspace.id, + keySpaceId: h.resources.userKeyAuth.id, + keys: keys.map((k) => ({ keyId: k.keyId, identityId: k.identityId })), + tags, + }), + ); + + await h.ch.verifications.insert(verifications); + + const root = await h.createRootKey(["api.*.read_api"]); + + const d = new Date(now); + d.setUTCDate(2); + d.setUTCHours(0, 0, 0, 0); + const start = d.getTime(); + const end = new Date(start).setUTCMonth(new Date(start).getUTCMonth() + 1); + + const res = await h.get({ + url: "/v1/analytics.getVerifications", + searchparams: { + start: start.toString(), + end: end.toString(), + apiId: h.resources.userApi.id, + tag: "a", + }, + headers: { + Authorization: `Bearer ${root.key}`, + }, + }); + + expect(res.status, `expected 200, received: ${JSON.stringify(res, null, 2)}`).toBe(200); + + const verificationsForTag = verifications.reduce( + (acc, v) => { + if (toStartOfHour(v.time) < start || toStartOfHour(v.time) > end || !v.tags.includes("a")) { + return acc; + } + acc.total += 1; + switch (v.outcome) { + case "VALID": { + acc.valid += 1; + break; + } + case "DISABLED": { + acc.disabled += 1; + break; + } + case "RATE_LIMITED": { + acc.rateLimited += 1; + break; + } + } + + return acc; + }, + { total: 0, valid: 0, disabled: 0, rateLimited: 0 }, + ); + + expect(res.body.length).toBe(1); + expect(res.body[0].total).toBe(verificationsForTag.total); + expect(res.body[0].valid).toBe(verificationsForTag.valid); + expect(res.body[0].disabled).toBe(verificationsForTag.disabled); + expect(res.body[0].rateLimited).toBe(verificationsForTag.rateLimited); +}); +test("filter by multiple tags", async (t) => { + const h = await IntegrationHarness.init(t); + + const identity = { + workspaceId: h.resources.userWorkspace.id, + id: newId("test"), + externalId: newId("test"), + }; + + await h.db.primary.insert(schema.identities).values(identity); + + const keys = await Promise.all([ + h.createKey({ identityId: identity.id }), + h.createKey({ identityId: identity.id }), + h.createKey({ identityId: identity.id }), + h.createKey(), + ]); + + const now = Date.now(); + + const tags = [["a", "b"], ["a"], [], ["b", "c"]]; + + const verifications = tags.flatMap((tags) => + generate({ + start: now - 60 * 24 * 60 * 60 * 1000, + end: now, + length: 100_000, + workspaceId: h.resources.userWorkspace.id, + keySpaceId: h.resources.userKeyAuth.id, + keys: keys.map((k) => ({ keyId: k.keyId, identityId: k.identityId })), + tags, + }), + ); + + await h.ch.verifications.insert(verifications); + + const root = await h.createRootKey(["api.*.read_api"]); + + const d = new Date(now); + d.setUTCDate(2); + d.setUTCHours(0, 0, 0, 0); + const start = d.getTime(); + const end = new Date(start).setUTCMonth(new Date(start).getUTCMonth() + 1); + + const res = await h.get({ + url: "/v1/analytics.getVerifications", + searchparams: { + start: start.toString(), + end: end.toString(), + apiId: h.resources.userApi.id, + tag: ["a", "b"], + }, + headers: { + Authorization: `Bearer ${root.key}`, + }, + }); + + expect(res.status, `expected 200, received: ${JSON.stringify(res, null, 2)}`).toBe(200); + + const want = verifications.reduce( + (acc, v) => { + if ( + toStartOfHour(v.time) < start || + toStartOfHour(v.time) > end || + !v.tags.includes("a") || + !v.tags.includes("b") + ) { + return acc; + } + acc.total += 1; + switch (v.outcome) { + case "VALID": { + acc.valid += 1; + break; + } + case "DISABLED": { + acc.disabled += 1; + break; + } + case "RATE_LIMITED": { + acc.rateLimited += 1; + break; + } + } + + return acc; + }, + { total: 0, valid: 0, disabled: 0, rateLimited: 0 }, + ); + + expect(res.body.length).toBe(1); + expect(res.body[0].total).toBe(want.total); + expect(res.body[0].valid).toBe(want.valid); + expect(res.body[0].disabled).toBe(want.disabled); + expect(res.body[0].rateLimited).toBe(want.rateLimited); +}); + +test("filter by key", async (t) => { + const h = await IntegrationHarness.init(t); + + const identity = { + workspaceId: h.resources.userWorkspace.id, + id: newId("test"), + externalId: newId("test"), + }; + + await h.db.primary.insert(schema.identities).values(identity); + + const keys = await Promise.all([ + h.createKey({ identityId: identity.id }), + h.createKey({ identityId: identity.id }), + h.createKey({ identityId: identity.id }), + h.createKey(), + ]); + + const now = Date.now(); + + const verifications = generate({ + start: now - 60 * 24 * 60 * 60 * 1000, + end: now, + length: 100_000, + workspaceId: h.resources.userWorkspace.id, + keySpaceId: h.resources.userKeyAuth.id, + keys: keys.map((k) => ({ keyId: k.keyId, identityId: k.identityId })), + tags: [], + }); + + await h.ch.verifications.insert(verifications); + + const root = await h.createRootKey(["api.*.read_api"]); + + const d = new Date(now); + d.setUTCDate(2); + d.setUTCHours(0, 0, 0, 0); + const start = d.getTime(); + const end = new Date(start).setUTCMonth(new Date(start).getUTCMonth() + 1); + + const res = await h.get({ + url: "/v1/analytics.getVerifications", + searchparams: { + start: start.toString(), + end: end.toString(), + apiId: h.resources.userApi.id, + keyId: keys[0].keyId, + }, + headers: { + Authorization: `Bearer ${root.key}`, + }, + }); + + expect(res.status, `expected 200, received: ${JSON.stringify(res, null, 2)}`).toBe(200); + + const verificationsForKey = verifications.reduce( + (acc, v) => { + if ( + toStartOfHour(v.time) < start || + toStartOfHour(v.time) > end || + v.key_id !== keys[0].keyId + ) { + return acc; + } + acc.total += 1; + switch (v.outcome) { + case "VALID": { + acc.valid += 1; + break; + } + case "DISABLED": { + acc.disabled += 1; + break; + } + case "RATE_LIMITED": { + acc.rateLimited += 1; + break; + } + } + + return acc; + }, + { total: 0, valid: 0, disabled: 0, rateLimited: 0 }, + ); + + expect(res.body.length).toBe(1); + expect(res.body[0].total).toBe(verificationsForKey.total); + expect(res.body[0].valid).toBe(verificationsForKey.valid); + expect(res.body[0].disabled).toBe(verificationsForKey.disabled); + expect(res.body[0].rateLimited).toBe(verificationsForKey.rateLimited); +}); +test("filter by multiple keys", async (t) => { + const h = await IntegrationHarness.init(t); + + const identity = { + workspaceId: h.resources.userWorkspace.id, + id: newId("test"), + externalId: newId("test"), + }; + + await h.db.primary.insert(schema.identities).values(identity); + + const keys = await Promise.all([ + h.createKey({ identityId: identity.id }), + h.createKey({ identityId: identity.id }), + h.createKey({ identityId: identity.id }), + h.createKey(), + ]); + + const now = Date.now(); + + const verifications = generate({ + start: now - 60 * 24 * 60 * 60 * 1000, + end: now, + length: 100_000, + workspaceId: h.resources.userWorkspace.id, + keySpaceId: h.resources.userKeyAuth.id, + keys: keys.map((k) => ({ keyId: k.keyId, identityId: k.identityId })), + tags: [], + }); + + await h.ch.verifications.insert(verifications); + + const root = await h.createRootKey(["api.*.read_api"]); + + const d = new Date(now); + d.setUTCDate(2); + d.setUTCHours(0, 0, 0, 0); + const start = d.getTime(); + const end = new Date(start).setUTCMonth(new Date(start).getUTCMonth() + 1); + + const res = await h.get({ + url: "/v1/analytics.getVerifications", + searchparams: { + start: start.toString(), + end: end.toString(), + apiId: h.resources.userApi.id, + keyId: [keys[0].keyId, keys[1].keyId], + }, + headers: { + Authorization: `Bearer ${root.key}`, + }, + }); + + expect(res.status, `expected 200, received: ${JSON.stringify(res, null, 2)}`).toBe(200); + + const want = verifications.reduce( + (acc, v) => { + if ( + toStartOfHour(v.time) < start || + toStartOfHour(v.time) > end || + (v.key_id !== keys[0].keyId && v.key_id !== keys[1].keyId) + ) { + return acc; + } + acc.total += 1; + switch (v.outcome) { + case "VALID": { + acc.valid += 1; + break; + } + case "DISABLED": { + acc.disabled += 1; + break; + } + case "RATE_LIMITED": { + acc.rateLimited += 1; + break; + } + } + + return acc; + }, + { total: 0, valid: 0, disabled: 0, rateLimited: 0 }, + ); + + expect(res.body.length).toBe(1); + expect(res.body[0].total).toBe(want.total); + expect(res.body[0].valid).toBe(want.valid); + expect(res.body[0].disabled).toBe(want.disabled); + expect(res.body[0].rateLimited).toBe(want.rateLimited); +}); + +test("grouping by tags", async (t) => { + const h = await IntegrationHarness.init(t); + + const identity = { + workspaceId: h.resources.userWorkspace.id, + id: newId("test"), + externalId: newId("test"), + }; + + await h.db.primary.insert(schema.identities).values(identity); + + const keys = await Promise.all([ + h.createKey({ identityId: identity.id }), + h.createKey({ identityId: identity.id }), + h.createKey({ identityId: identity.id }), + h.createKey(), + ]); + + const now = Date.now(); + + const tags = [["a", "b"], ["a"], [], ["b", "c"]]; + + const verifications = tags.flatMap((tags) => + generate({ + start: now - 60 * 24 * 60 * 60 * 1000, + end: now, + length: 100_000, + workspaceId: h.resources.userWorkspace.id, + keySpaceId: h.resources.userKeyAuth.id, + keys: keys.map((k) => ({ keyId: k.keyId, identityId: k.identityId })), + tags, + }), + ); + + await h.ch.verifications.insert(verifications); + + const root = await h.createRootKey(["api.*.read_api"]); + + const d = new Date(now); + d.setUTCDate(2); + d.setUTCHours(0, 0, 0, 0); + const start = d.getTime(); + const end = new Date(start).setUTCMonth(new Date(start).getUTCMonth() + 1); + + const res = await h.get({ + url: "/v1/analytics.getVerifications", + searchparams: { + start: start.toString(), + end: end.toString(), + apiId: h.resources.userApi.id, + groupBy: "tags", + }, + headers: { + Authorization: `Bearer ${root.key}`, + }, + }); + + expect(res.status, `expected 200, received: ${JSON.stringify(res, null, 2)}`).toBe(200); + + expect(res.body.length).toBe(tags.length); +}); + +test("breakdown by tag", async (t) => { + const h = await IntegrationHarness.init(t); + + const identity = { + workspaceId: h.resources.userWorkspace.id, + id: newId("test"), + externalId: newId("test"), + }; + + await h.db.primary.insert(schema.identities).values(identity); + + const keys = await Promise.all([ + h.createKey({ identityId: identity.id }), + h.createKey({ identityId: identity.id }), + h.createKey({ identityId: identity.id }), + h.createKey(), + ]); + + const now = Date.now(); + + const tags = [["a", "b"], ["a"], [], ["b", "c"]]; + + const verifications = tags.flatMap((tags) => + generate({ + start: now - 60 * 24 * 60 * 60 * 1000, + end: now, + length: 100_000, + workspaceId: h.resources.userWorkspace.id, + keySpaceId: h.resources.userKeyAuth.id, + keys: keys.map((k) => ({ keyId: k.keyId, identityId: k.identityId })), + tags, + }), + ); + + await h.ch.verifications.insert(verifications); + + const root = await h.createRootKey(["api.*.read_api"]); + + const d = new Date(now); + d.setUTCDate(2); + d.setUTCHours(0, 0, 0, 0); + const start = d.getTime(); + const end = new Date(start).setUTCMonth(new Date(start).getUTCMonth() + 1); + + const res = await h.get({ + url: "/v1/analytics.getVerifications", + searchparams: { + start: start.toString(), + end: end.toString(), + apiId: h.resources.userApi.id, + groupBy: "tag", + }, + headers: { + Authorization: `Bearer ${root.key}`, + }, + }); + + expect(res.status, `expected 200, received: ${JSON.stringify(res, null, 2)}`).toBe(200); + + const want = verifications.reduce( + (acc, v) => { + if (toStartOfHour(v.time) < start || toStartOfHour(v.time) > end) { + return acc; + } + + for (const tag of v.tags) { + if (!acc[tag]) { + acc[tag] = { total: 0, valid: 0, disabled: 0, rateLimited: 0 }; + } + + acc[tag].total += 1; + switch (v.outcome) { + case "VALID": { + acc[tag].valid += 1; + break; + } + case "DISABLED": { + acc[tag].disabled += 1; + break; + } + case "RATE_LIMITED": { + acc[tag].rateLimited += 1; + break; + } + } + } + + return acc; + }, + {} as Record, + ); + + for (const row of res.body) { + expect(row.total).toEqual(want[row.tag!].total); + expect(row.valid).toEqual(want[row.tag!].valid); + expect(row.disabled).toEqual(want[row.tag!].disabled); + expect(row.rateLimited).toEqual(want[row.tag!].rateLimited); + } +}); + +/** + * Generate a number of key verification events to seed clickhouse + * @param opts.start - Start timestamp in milliseconds + * @param opts.end - End timestamp in milliseconds + * @param opts.length - Number of events to generate + * @param opts.workspaceId - Workspace identifier + * @param opts.keySpaceId - Key space identifier + * @param opts.keys - Array of key configurations + * @param opts.tags - Optional array of tags + */ +function generate(opts: { + start: number; + end: number; + length: number; + workspaceId: string; + keySpaceId: string; + keys: Array<{ keyId: string; identityId?: string }>; + tags?: string[]; +}) { + return Array.from({ length: opts.length }).map((_) => { + const key = opts.keys[Math.floor(Math.random() * opts.keys.length)]; + + return { + time: Math.round(Math.random() * (opts.end - opts.start) + opts.start), + workspace_id: opts.workspaceId, + key_space_id: opts.keySpaceId, + key_id: key.keyId, + outcome: POSSIBLE_OUTCOMES[Math.floor(Math.random() * POSSIBLE_OUTCOMES.length)], + tags: opts.tags ?? [], + request_id: newId("test"), + region: "test", + identity_id: key.identityId, + }; + }); +} + +/** + * Truncates the timestamp to the start of the current hour + */ +function toStartOfHour(unixmilli: number): number { + return Math.floor(unixmilli / 60 / 60 / 1000) * 60 * 60 * 1000; +} diff --git a/apps/api/src/routes/v1_analytics_getVerifications.ts b/apps/api/src/routes/v1_analytics_getVerifications.ts index 8d24d74f28..644b79ec1d 100644 --- a/apps/api/src/routes/v1_analytics_getVerifications.ts +++ b/apps/api/src/routes/v1_analytics_getVerifications.ts @@ -1,7 +1,14 @@ import type { App } from "@/pkg/hono/app"; import { createRoute, z } from "@hono/zod-openapi"; -import { openApiErrorResponses } from "@/pkg/errors"; +import { rootKeyAuth } from "@/pkg/auth/root_key"; +import { UnkeyApiError, openApiErrorResponses } from "@/pkg/errors"; +import { dateTimeToUnix } from "@unkey/clickhouse/src/util"; +import { buildUnkeyQuery } from "@unkey/rbac"; + +const validation = { + groupBy: z.enum(["key", "identity", "tags", "tag", "month", "day", "hour"]), +}; const route = createRoute({ tags: ["analytics"], @@ -11,58 +18,74 @@ const route = createRoute({ security: [{ bearerAuth: [] }], request: { query: z.object({ - apiId: z - .array(z.string()) + apiId: z.string().openapi({ + description: "Select the API. Only keys belonging to this API will be included.", + }), + externalId: z.string().optional().openapi({ + description: + "Filtering by externalId allows you to narrow down the search to a specific user or organisation.", + }), + + keyId: z + .string() + .or(z.array(z.string())) .optional() .openapi({ - description: `Select the API for which to return data. + description: `Only include data for a specific key or keys. + + When you are providing zero or more than one key ids, all usage counts are aggregated and summed up. Send multiple requests with one keyId each if you need counts per key. - When you are providing zero or more than one API id, all usage counts are aggregated and summed up. Send multiple requests with one apiId each if you need counts per API. `, + example: ["key_1234"], }), - externalId: z - .array(z.string()) + tag: z + .string() + .or(z.array(z.string())) .optional() .openapi({ - description: `Filtering by externalId allows you to narrow down the search to a specific user or organisation. + description: `Only include data for a specific tag or tags. - When you are providing zero or more than one external ids, all usage counts are aggregated and summed up. Send multiple requests with one externalId each if you need counts per identity. + When you are providing zero or more than onetag, all usage counts are aggregated and summed up. Send multiple requests with one tag each if you need counts per tag. `, + example: ["key_1234"], }), - keyId: z - .array(z.string()) - .optional() + start: z.coerce + .number() + .int() .openapi({ - description: `Only include data for a speciifc key or keys. + description: `The start of the period to fetch usage for as unix milliseconds timestamp. + To understand how the start filter works, let's look at an example: - When you are providing zero or more than one key ids, all usage counts are aggregated and summed up. Send multiple requests with one keyId each if you need counts per key. + You specify a timestamp of 5 minutes past 9 am. + Your timestamp gets truncated to the start of the hour and then applied as filter. + We will include data \`where time >= 9 am\` -`, - example: ["key_1234"], + `, + example: 1620000000000, }), - start: z.coerce.number().int().openapi({ - description: "The start of the period to fetch usage for as unix milliseconds timestamp.", - example: 1620000000000, - }), - end: z.coerce.number().int().optional().openapi({ - description: - "The end of the period to fetch usage for as unix milliseconds timestamp, defaults to now.", - example: 1620000000000, - }), - granularity: z.enum(["hour", "day", "month"]).openapi({ - description: - "Selects the granularity of data. For example selecting hour will return one datapoint per hour.", - example: "day", - }), - groupBy: z - .enum(["key", "identity", "tags"]) - .or(z.array(z.enum(["key", "identity", "tags"]))) + end: z.coerce + .number() + .int() .optional() + .default(() => Date.now()) .openapi({ - description: `By default, all datapoints are aggregated by time alone, summing up all verifications across identities and keys. However in certain scenarios you want to get a breakdown per key or identity. For example finding out the usage spread across all keys for a specific user. + description: `The end of the period to fetch usage for as unix milliseconds timestamp. + To understand how the end filter works, let's look at an example: + You specify a timestamp of 5 minutes past 9 am. + Your timestamp gets truncated to the start of the hour and then applied as filter. + We will include data \`where time <= 10 am\` + `, + example: 1620000000000, + }), + groupBy: validation.groupBy + .or(z.array(validation.groupBy)) + .optional() + .openapi({ + description: `By default, datapoints are not aggregated, however you probably want to get a breakdown per time, key or identity. + Grouping by tags and by tag is mutually exclusive. `, }), limit: z.coerce @@ -74,11 +97,27 @@ const route = createRoute({ description: `Limit the number of returned datapoints. This may become useful for querying the top 10 identities based on usage.`, }), - orderBy: z.enum(["total", "valid", "TODO"]).optional().openapi({ - description: "TODO", - }), + orderBy: z + .enum([ + "time", + "valid", + "notFound", + "forbidden", + "usageExceeded", + "rateLimited", + "unauthorized", + "disabled", + "insufficientPermissions", + "expired", + "total", + ]) + .optional() + .openapi({ + description: + "Sort the output by a specific value. You can use this in combination with the `order` param.", + }), order: z.enum(["asc", "desc"]).optional().default("asc").openapi({ - description: "TODO", + description: "Define the order of sorting. Use this in combination with `orderBy`", }), }), }, @@ -88,60 +127,60 @@ const route = createRoute({ "Retrieve all required data to build end-user facing dashboards and drive your usage-based billing.", content: { "application/json": { - schema: z.object({ - data: z - .array( - z.object({ - time: z.number().int().openapi({ - description: - "Unix timestamp in milliseconds of the start of the current time slice.", - }), + schema: z + .array( + z.object({ + time: z.number().int().optional().openapi({ + description: + "Unix timestamp in milliseconds of the start of the current time slice.", + }), - outcomes: z.object({ - valid: z.number().int(), - rateLimited: z.number().int(), - usageExceeded: z.number().int(), - total: z.number().int().openapi({ - description: - "Total number of verifications in the current time slice, regardless of outcome.", - }), - TODO: z.number().int(), - }), + valid: z.number().int().optional(), + notFound: z.number().int().optional(), + forbidden: z.number().int().optional(), + usageExceeded: z.number().int().optional(), + rateLimited: z.number().int().optional(), + unauthorized: z.number().int().optional(), + disabled: z.number().int().optional(), + insufficientPermissions: z.number().int().optional(), + expired: z.number().int().optional(), + total: z.number().int().openapi({ + description: + "Total number of verifications in the current time slice, regardless of outcome.", + }), - keyId: z - .string() - .optional() - .openapi({ - description: ` + tag: z.string().optional().openapi({ + description: "Only available when grouping by tag.", + }), + tags: z.array(z.string()).optional().openapi({ + description: "Filter by one or multiple tags. If multiple tags are provided", + }), + keyId: z + .string() + .optional() + .openapi({ + description: ` Only available when specifying groupBy=key in the query. In this case there would be one datapoint per time and groupBy target.`, - }), - apiId: z - .string() - .optional() - .openapi({ - description: ` - Only available when specifying groupBy=api in the query. - In this case there would be one datapoint per time and groupBy target.`, - }), - identity: z - .object({ - id: z.string(), - externalId: z.string(), - }) - .optional() - .openapi({ - description: ` + }), + + identity: z + .object({ + id: z.string(), + externalId: z.string(), + }) + .optional() + .openapi({ + description: ` Only available when specifying groupBy=identity in the query. In this case there would be one datapoint per time and groupBy target.`, - }), - }), - ) - .openapi({ - description: - "Successful responses will always return an array of datapoints. One datapoint per granular slice, ie: hourly granularity means you receive one element per hour within the queried interval.", + }), }), - }), + ) + .openapi({ + description: + "Successful responses will always return an array of datapoints. One datapoint per granular slice, ie: hourly granularity means you receive one element per hour within the queried interval.", + }), }, }, }, @@ -150,90 +189,328 @@ const route = createRoute({ }); export type Route = typeof route; -export type V1AnalaticsGetVerificationsResponse = z.infer< +export type V1AnalyticsGetVerificationsRequest = z.infer; + +export type V1AnalyticsGetVerificationsResponse = z.infer< (typeof route.responses)[200]["content"]["application/json"]["schema"] >; export const registerV1AnalyticsGetVerifications = (app: App) => app.openapi(route, async (c) => { const filters = c.req.valid("query"); - console.info("fitlers", filters); - // const { analytics, cache, db, logger } = c.get("services"); + if ( + filters.groupBy && + Array.isArray(filters.groupBy) && + filters.groupBy.includes("tag") && + filters.groupBy.includes("tags") + ) { + throw new UnkeyApiError({ + code: "BAD_REQUEST", + message: "You can not group by tag and tags at the same time", + }); + } - // TODO: check permissions - // const auth = await rootKeyAuth(c, buildUnkeyQuery(({ or }) => or("*"))) - // console.info(auth) + const { cache, db, logger, analytics } = c.get("services"); - const query: string[] = []; - query.push("SELECT *"); - query.push("FROM {table:Identifier}"); - query.push("WHERE workspace_id = {workspaceId: String}"); - if (filters.apiId) { - // TODO: look up keySpaceId - // query.push("AND key_space_id = {keySpaceId: String}") - } - if (filters.externalId) { - // TODO: look up identity - // query.push("AND identity_id = {identityId: String}") - } - if (filters.keyId) { - query.push("AND key_id = {keyId: String}"); - } - query.push("AND time >= fromUnixTimestamp64Milli({start:Int64})"); - query.push("AND time <= fromUnixTimestamp64Milli({end:Int64})"); + const auth = await rootKeyAuth( + c, + buildUnkeyQuery(({ or }) => or("api.*.read_api", `api.${filters.apiId}.read_api`)), + ); - query.push("GROUP BY time, outcome"); + const tables = { + hour: { + name: "verifications.key_verifications_per_hour_v3", + fill: `WITH FILL +FROM toStartOfHour(fromUnixTimestamp64Milli({ start: Int64 })) +TO toStartOfHour(fromUnixTimestamp64Milli({ end: Int64 })) +STEP INTERVAL 1 HOUR`, + }, + day: { + name: "verifications.key_verifications_per_day_v3", + fill: `WITH FILL +FROM toStartOfDay(fromUnixTimestamp64Milli({ start: Int64 })) +TO toStartOfDay(fromUnixTimestamp64Milli({ end: Int64 })) +STEP INTERVAL 1 DAY`, + }, + month: { + name: "verifications.key_verifications_per_month_v3", + fill: `WITH FILL +FROM toDateTime(toStartOfMonth(fromUnixTimestamp64Milli({ start: Int64 }))) +TO toDateTime(toStartOfMonth(fromUnixTimestamp64Milli({ end: Int64 }))) +STEP INTERVAL 1 MONTH`, + }, + } as const; + + const select = [ + "sumIf(count, outcome == 'VALID') AS valid", + "sumIf(count, outcome == 'NOT_FOUND') AS notFound", + "sumIf(count, outcome == 'FORBIDDEN') AS forbidden", + "sumIf(count, outcome == 'USAGE_EXCEEDED') AS usageExceeded", + "sumIf(count, outcome == 'RATE_LIMITED') AS rateLimited", + "sumIf(count, outcome == 'UNAUTHORIZED') AS unauthorized", + "sumIf(count, outcome == 'DISABLED') AS disabled", + "sumIf(count, outcome == 'INSUFFICIENT_PERMISSIONS') AS insufficientPermissions", + "sumIf(count, outcome == 'EXPIRED') AS expired", + "SUM(count) AS total", + ]; + const where: string[] = [`workspace_id = '${auth.authorizedWorkspaceId}'`]; + const groupBy: string[] = []; + + type ValueOf = T[keyof T]; /** - * for each groupBy value we add the value manually to prevent SQL injection. + * By default we use the hourly table, as it is the most accurate. + * A future optimisation would be to choose a coarser granularity when the + * requested timeframe is much larger. * - * I think validating this with zod should be enough, but let's use the proper tools to protect - * ourselves. + * A user may override this by specifying a groupBy filter */ - const groupBy = (Array.isArray(filters.groupBy) ? filters.groupBy : [filters.groupBy]).filter( - Boolean, - ); - if (groupBy.includes("key")) { - query.push(", key"); + let table: ValueOf = tables.hour; + /** + * for each groupBy value we add the value manually to prevent SQL injection. + */ + + const selectedGroupBy = ( + Array.isArray(filters.groupBy) ? filters.groupBy : [filters.groupBy] + ).filter(Boolean); + if (selectedGroupBy.includes("month")) { + select.push("time"); + groupBy.push("time"); + table = tables.month; + } else if (selectedGroupBy.includes("day")) { + select.push("time"); + groupBy.push("time"); + table = tables.day; + } else if (selectedGroupBy.includes("hour")) { + select.push("time"); + groupBy.push("time"); + table = tables.hour; + } + + const filteredTags = filters.tag + ? Array.isArray(filters.tag) + ? filters.tag + : [filters.tag] + : undefined; + if (filteredTags) { + where.push("AND hasAll(tags, {tags:Array(String)})"); } - if (groupBy.includes("identity")) { - query.push(", identity"); + + if (selectedGroupBy.includes("key")) { + select.push("key_id AS keyId"); + groupBy.push("key_id"); + } + if (selectedGroupBy.includes("identity")) { + select.push("identity_id as identityId"); + groupBy.push("identity_id"); } - if (groupBy.includes("tags")) { - query.push(", tags"); + if (selectedGroupBy.includes("tags")) { + select.push("tags"); + groupBy.push("tags"); } - query.push("ORDER BY {orderBy:Identifier} {order:Identifier}"); + if (selectedGroupBy.includes("tag")) { + select.push("arrayJoin(tags) AS tag"); + groupBy.push("tag"); + } - query.push("WITH FILL"); - switch (filters.granularity) { - case "hour": { - query.push( - "FROM toStartOfHour(fromUnixTimestamp64Milli({start: Int64}))", - "TO toStartOfHour(fromUnixTimestamp64Milli({end: Int64}))", - "STEP INTERVAL 1 HOUR", + const { val: api, err: getApiError } = await cache.apiById.swr( + filters.apiId, + async (apiId: string) => { + return ( + (await db.readonly.query.apis.findFirst({ + where: (table, { eq, and, isNull }) => + and(eq(table.id, apiId), isNull(table.deletedAt)), + with: { + keyAuth: true, + }, + })) ?? null ); - break; + }, + ); + if (getApiError) { + throw new UnkeyApiError({ + code: "INTERNAL_SERVER_ERROR", + message: "we're unable to load the API", + }); + } + if (!api) { + throw new UnkeyApiError({ + code: "NOT_FOUND", + message: "we're unable to find the API", + }); + } + if (!api.keyAuthId) { + throw new UnkeyApiError({ + code: "PRECONDITION_FAILED", + message: "api has no keyspace attached", + }); + } + where.push(`AND key_space_id = '${api.keyAuthId}'`); + + if (filters.externalId) { + const { val: identity, err: getIdentityError } = await cache.identityByExternalId.swr( + filters.externalId, + async (externalId: string) => { + return ( + (await db.readonly.query.identities.findFirst({ + where: (table, { eq }) => eq(table.externalId, externalId), + })) ?? null + ); + }, + ); + if (getIdentityError) { + throw new UnkeyApiError({ + code: "INTERNAL_SERVER_ERROR", + message: "we're unable to load the identity", + }); } - case "day": { - query.push( - "FROM toStartOfDay(fromUnixTimestamp64Milli({start: Int64}))", - "TO toStartOfDay(fromUnixTimestamp64Milli({end: Int64}))", - "STEP INTERVAL 1 DAY", - ); - break; + if (!identity) { + throw new UnkeyApiError({ + code: "NOT_FOUND", + message: "we're unable to find the identity", + }); } - case "month": { - query.push( - "FROM toStartOfMonth(fromUnixTimestamp64Milli({start: Int64}))", - "TO toStartOfMonth(fromUnixTimestamp64Milli({end: Int64}))", - "STEP INTERVAL 1 Month", - ); - break; + where.push(`AND identity_id = '${identity.id}'`); + } + const filteredKeyIds = filters.keyId + ? Array.isArray(filters.keyId) + ? filters.keyId + : [filters.keyId] + : undefined; + if (filteredKeyIds && filteredKeyIds.length > 0) { + where.push("AND key_id IN {keyIds:Array(String)}"); + } + where.push("AND time >= fromUnixTimestamp64Milli({start:Int64})"); + where.push("AND time <= fromUnixTimestamp64Milli({end:Int64})"); + + const query: string[] = []; + query.push(`SELECT ${[...new Set(select)].join(", ")}`); + query.push(`FROM ${table.name} `); + query.push(`WHERE ${[...new Set(where)].join("\n")}`); + + if (groupBy.length > 0) { + query.push(`GROUP BY ${groupBy.join(", ")}`); + } + if (filters.orderBy) { + query.push(`ORDER BY { orderBy: Identifier } ${filters.order === "asc" ? "ASC" : "DESC"} `); + } else if (groupBy.includes("time")) { + query.push("ORDER BY time ASC"); + } + if (filters.limit) { + query.push("LIMIT {limit: Int64}"); + } + + if (groupBy.includes("time")) { + query.push(table.fill); + } + + query.push(";"); + + const data = await analytics.internalQuerier.query({ + query: query.map((l) => l.trim()).join("\n"), + params: z.object({ + start: z.number().int(), + end: z.number().int(), + orderBy: z.string().optional(), + limit: z.number().int().optional(), + tags: z.array(z.string()).optional(), + keyIds: z.array(z.string()).optional(), + }), + schema: z.object({ + time: dateTimeToUnix.optional(), + valid: z.number().int().optional(), + notFound: z.number().int().optional(), + forbidden: z.number().int().optional(), + usageExceeded: z.number().int().optional(), + rateLimited: z.number().int().optional(), + unauthorized: z.number().int().optional(), + disabled: z.number().int().optional(), + insufficientPermissions: z.number().int().optional(), + expired: z.number().int().optional(), + total: z.number().int().default(0), + keyId: z.string().optional(), + tag: z.string().optional(), + tags: z.array(z.string()).optional(), + identityId: z.string().optional(), + }), + })({ + start: filters.start, + end: filters.end, + orderBy: filters.orderBy, + limit: filters.limit, + tags: filteredTags, + keyIds: filteredKeyIds, + }); + + if (data.err) { + logger.error("unable to query clickhouse", { + error: data.err.message, + query: query, + }); + throw new UnkeyApiError({ + code: "INTERNAL_SERVER_ERROR", + message: "unable to query clickhouse", + }); + } + + const identityIds: Record = {}; + for (const row of data.val) { + if (row.identityId) { + identityIds[row.identityId] = true; } } - console.info("query", query.join("\n")); + const identities = await Promise.all( + Object.keys(identityIds).map(async (id) => { + const { val, err } = await cache.identityById.swr(id, () => + db.readonly.query.identities.findFirst({ + where: (table, { and, eq }) => + and(eq(table.workspaceId, auth.authorizedWorkspaceId), eq(table.id, id)), + }), + ); + if (err) { + throw new UnkeyApiError({ + code: "INTERNAL_SERVER_ERROR", + message: "unable to load identity from database", + }); + } + return val; + }), + ); + + const identitiesById = identities.reduce( + (acc, i) => { + if (i) { + acc[i.id] = i; + } + return acc; + }, + {} as Record, + ); - return c.json({ data: [] }); + return c.json( + data.val.map((row) => ({ + time: row.time, + valid: row.valid, + notFound: row.notFound, + forbidden: row.forbidden, + usageExceeded: row.usageExceeded, + rateLimited: row.rateLimited, + unauthorized: row.unauthorized, + disabled: row.disabled, + insufficientPermissions: row.insufficientPermissions, + expired: row.expired, + total: row.total, + keyId: row.keyId, + tag: row.tag, + tags: row.tags, + identity: row.identityId + ? { + id: row.identityId, + externalId: identitiesById[row.identityId]?.externalId, + } + : undefined, + })), + ); }); diff --git a/apps/api/src/routes/v1_apis_getApi.ts b/apps/api/src/routes/v1_apis_getApi.ts index 23a998ce94..3c5dfa03a0 100644 --- a/apps/api/src/routes/v1_apis_getApi.ts +++ b/apps/api/src/routes/v1_apis_getApi.ts @@ -71,6 +71,7 @@ export const registerV1ApisGetApi = (app: App) => })) ?? null ); }); + if (err) { throw new UnkeyApiError({ code: "INTERNAL_SERVER_ERROR", diff --git a/apps/api/src/routes/v1_keys_verifyKey.ts b/apps/api/src/routes/v1_keys_verifyKey.ts index e5dd817499..39b4f50482 100644 --- a/apps/api/src/routes/v1_keys_verifyKey.ts +++ b/apps/api/src/routes/v1_keys_verifyKey.ts @@ -378,9 +378,12 @@ export const registerV1KeysVerifyKey = (app: App) => identity_id: val.identity?.id, tags: req.tags ?? [], }) - .catch((err) => { + .then(({ err }) => { + if (!err) { + return; + } logger.error("unable to insert key verification", { - error: err.message ?? err, + error: err.message, }); }), ); diff --git a/apps/api/src/worker.ts b/apps/api/src/worker.ts index 553521426a..e5c7d6e6de 100644 --- a/apps/api/src/worker.ts +++ b/apps/api/src/worker.ts @@ -56,6 +56,8 @@ import { registerV1RatelimitGetOverride } from "./routes/v1_ratelimits_getOverri import { registerV1RatelimitListOverrides } from "./routes/v1_ratelimits_listOverrides"; import { registerV1RatelimitSetOverride } from "./routes/v1_ratelimits_setOverride"; +import { registerV1AnalyticsGetVerifications } from "./routes/v1_analytics_getVerifications"; + const app = newApp(); app.use("*", init()); @@ -124,6 +126,9 @@ registerV1IdentitiesListIdentities(app); registerV1IdentitiesUpdateIdentity(app); registerV1IdentitiesDeleteIdentity(app); +// analytics +registerV1AnalyticsGetVerifications(app); + // legacy REST style routes registerLegacyKeysCreate(app); registerLegacyKeysVerifyKey(app); diff --git a/apps/docs/analytics/api.mdx b/apps/docs/analytics/api.mdx new file mode 100644 index 0000000000..a5171d4ce3 --- /dev/null +++ b/apps/docs/analytics/api.mdx @@ -0,0 +1,6 @@ +--- +title: API +description: Power your own dashboard or tools +--- + +In Progress diff --git a/apps/docs/analytics/overview.mdx b/apps/docs/analytics/overview.mdx new file mode 100644 index 0000000000..286cd837e5 --- /dev/null +++ b/apps/docs/analytics/overview.mdx @@ -0,0 +1,184 @@ +--- +title: Overview +description: "Unkey tracks everything for you" +--- + + +Consumption based billing for APIs is getting more and more popular, but it's tedious to build in house. For low frequency events, it's quite possible to emit usage events directly to Stripe or similar, but this becomes very noisy quickly. Furthermore if you want to build end-user facing or internal analytics, you need to be able to query the events from Stripe, which often does not provide the granularity required. + +Most teams end up without end-user facing analytics, or build their own system to store and query usage metrics. + +Since Unkey already stores and aggregates verification events by time, outcome and identity, we can offer this data via an API. + + +## Available data + +Unkey stores an event for every single verification, the relevent fields are described below: + +| Data | Type | Explanation | +|----------------|---------------|----------------------------------------------------------------------------------------| +| `request_id` | String | Each request has a unique id, making it possible to retrieve later. | +| `time` | Int64 | A unix milli timestamp. | +| `key_space_id` | String | Each workspace may have multiple key spaces. Each API you create has its own keyspace. | +| `key_id` | String | The individual key being verified. | +| `outcome` | String | The outcome of the verification. `VALID`, `RATE_LIMITED` etc. | +| `identity_id` | String | The identity connected to this key. | +| `tags` | Array(String) | Arbitrary tags you may add during the verification to filter later. | + +We can return this data aggregated by `hour`, `day`, `month`, `tag`, `tags`, `identity`, `key` and `outcome`. +As well as filter by `identity_id`, `key_space_id`, `key_id`, `tags`, `outcome`, `start` and `end` time. + +## Example + +For an internal dashboard you want to find the top 5 users of a specific endpoint. In order to let Unkey know about the endpoint, you specify it as a tag when verifying keys: + +```bash Tagging a verification {6} +curl -XPOST 'https://api.unkey.dev/v1/keys.verifyKey' \ + -H 'Content-Type: application/json' \ + -d '{ + "key": "", + "apiId": "api_", + "tags": [ "path=/my/endpoint" ], + }' +``` + + +You can now query `api.unkey.dev/v1/analytics.getVerifications` via query parameters. +While we can't provide raw SQL access, we wanted to stay as close to SQL semantics as possible, so you didn't need to learn a new concept and to keep the translation layer simple. + +| Name | Value | Explanation | +|----------------|----------------------------------|--------------------------------------------------------------------------------| +| `start` | 1733749385000 | A unix milli timestamp to limit the query to a specific time frame. | +| `end` | 1736431397000 | A unix milli timestamp to limit the query to a specific time frame. | +| `apiId` | api_262b3iR7gkmP7aUyZ24uihcijsCe | The API ID to filter keys. | +| `groupBy` | identity | We're not interested in individual keys, but the user/org. | +| `orderBy` | total | We want to see the most active users, by how many verifications they're doing. | +| `order` | desc | We're ordering from most active to least active user. | +| `limit` | 5 | Only return the top 5. | + +Below is a curl command putting everythign together: + +```bash +curl 'https://api.unkey.dev/v1/analytics.getVerifications?start=1733749385000&end=1736431397000&apiId=api_262b3iR7gkmP7aUyZ24uihcijsCe&groupBy=identity&orderBy=total&order=desc&limit=5' \ + -H 'Content-Type: application/json' \ + -H 'Authorization: Bearer ' +``` + +You'll receive a json response with a breakdown of each outcome, per identity ordered by `total`. + + + +```json First Row +[ + { + "valid": 186, + "notFound": 0, + "forbidden": 0, + "usageExceeded": 0, + "rateLimited": 184, + "unauthorized": 0, + "disabled": 182, + "insufficientPermissions": 0, + "expired": 0, + "total": 552, + "apiId": "api_262b3iR7gkmP7aUyZ24uihcijsCe", + "identity": { + "id": "test_2ipPuAgat7xuVNGpK6AuPQ2Lbk11", + "externalId": "user_2rNBR4YXxKwzM8bzVrCR5q6dFlc" + } + }, + ... +] +``` + +```json Full Response +[ + { + "valid": 186, + "notFound": 0, + "forbidden": 0, + "usageExceeded": 0, + "rateLimited": 184, + "unauthorized": 0, + "disabled": 182, + "insufficientPermissions": 0, + "expired": 0, + "total": 552, + "apiId": "api_262b3iR7gkmP7aUyZ24uihcijsCe", + "identity": { + "id": "test_2ipPuAgat7xuVNGpK6AuPQ2Lbk11", + "externalId": "user_2rNBR4YXxKwzM8bzVrCR5q6dFlc" + } + }, + { + "valid": 190, + "notFound": 0, + "forbidden": 0, + "usageExceeded": 0, + "rateLimited": 161, + "unauthorized": 0, + "disabled": 200, + "insufficientPermissions": 0, + "expired": 0, + "total": 551, + "apiId": "api_262b3iR7gkmP7aUyZ24uihcijsCe", + "identity": { + "id": "test_2ipPuAiGJ3L3TUNKA6gp5eLeuyj7", + "externalId": "user_2rLz6cM63ZQ2v3IU0mryKbHetjK" + } + }, + { + "valid": 197, + "notFound": 0, + "forbidden": 0, + "usageExceeded": 0, + "rateLimited": 154, + "unauthorized": 0, + "disabled": 200, + "insufficientPermissions": 0, + "expired": 0, + "total": 551, + "apiId": "api_262b3iR7gkmP7aUyZ24uihcijsCe", + "identity": { + "id": "test_2ipPuAwJVE4Hdet3dyEpYreP8ob7", + "externalId": "user_2rLwFchrbyIDb4LUfFp4CpTG0L3" + } + }, + { + "valid": 191, + "notFound": 0, + "forbidden": 0, + "usageExceeded": 0, + "rateLimited": 184, + "unauthorized": 0, + "disabled": 171, + "insufficientPermissions": 0, + "expired": 0, + "total": 546, + "apiId": "api_262b3iR7gkmP7aUyZ24uihcijsCe", + "identity": { + "id": "test_2ipPuB23PVchmbkt9mMjjcpvLM8N", + "externalId": "user_2rLwCGvQKtnfnemH8HTL4cxWBFo" + } + }, + { + "valid": 207, + "notFound": 0, + "forbidden": 0, + "usageExceeded": 0, + "rateLimited": 171, + "unauthorized": 0, + "disabled": 162, + "insufficientPermissions": 0, + "expired": 0, + "total": 540, + "apiId": "api_262b3iR7gkmP7aUyZ24uihcijsCe", + "identity": { + "id": "test_2ipPuApEvEAXJo9UParPL6inHLLJ", + "externalId": "user_2rLDPPVfeNB2hn1ARMh2808CdwG" + } + } +] + +``` + diff --git a/apps/docs/mint.json b/apps/docs/mint.json index e7ca397b1c..34887759d5 100644 --- a/apps/docs/mint.json +++ b/apps/docs/mint.json @@ -177,6 +177,10 @@ { "group": "Audit logs", "pages": ["audit-log/introduction", "audit-log/types"] + }, + { + "group": "Analytics", + "pages": ["analytics/overview"] } ] }, diff --git a/internal/clickhouse/src/client/client.ts b/internal/clickhouse/src/client/client.ts index 2a937c3247..47745a3b50 100644 --- a/internal/clickhouse/src/client/client.ts +++ b/internal/clickhouse/src/client/client.ts @@ -48,6 +48,8 @@ export class Client implements Querier, Inserter { unparsedRows = await res.json(); } catch (err) { const message = err instanceof Error ? err.message : JSON.stringify(err); + console.error(err); + return Err(new QueryError(`Unable to query clickhouse: ${message}`, { query: req.query })); } const parsed = z.array(req.schema).safeParse(unparsedRows); diff --git a/packages/api/package.json b/packages/api/package.json index 3af102777e..2b13eedd6e 100644 --- a/packages/api/package.json +++ b/packages/api/package.json @@ -9,25 +9,17 @@ "publishConfig": { "access": "public" }, - "keywords": [ - "unkey", - "client", - "api" - ], + "keywords": ["unkey", "client", "api"], "bugs": { "url": "https://github.com/unkeyed/unkey/issues" }, "homepage": "https://github.com/unkeyed/unkey#readme", - "files": [ - "./dist/**", - "README.md" - ], + "files": ["./dist/**", "README.md"], "author": "Andreas Thomas ", "scripts": { "generate": "openapi-typescript https://api.unkey.dev/openapi.json -o ./src/openapi.d.ts", "build": "pnpm generate && tsup", - "pull": "docker pull bitnami/clickhouse:latest && docker pull golang:alpine", - "test": "pnpm pull && vitest run" + "test": "vitest run" }, "devDependencies": { "@types/node": "^20.14.9", diff --git a/packages/hono/package.json b/packages/hono/package.json index fcabc2fa00..e62a5e5eaf 100644 --- a/packages/hono/package.json +++ b/packages/hono/package.json @@ -8,19 +8,12 @@ "publishConfig": { "access": "public" }, - "keywords": [ - "unkey", - "client", - "api", - "hono" - ], + "keywords": ["unkey", "client", "api", "hono"], "bugs": { "url": "https://github.com/unkeyed/unkey/issues" }, "homepage": "https://github.com/unkeyed/unkey#readme", - "files": [ - "./dist/**" - ], + "files": ["./dist/**"], "author": "Andreas Thomas ", "scripts": { "build": "tsup", diff --git a/packages/nextjs/package.json b/packages/nextjs/package.json index 11bdf331b9..fee7bcc8a3 100644 --- a/packages/nextjs/package.json +++ b/packages/nextjs/package.json @@ -8,19 +8,12 @@ "publishConfig": { "access": "public" }, - "keywords": [ - "unkey", - "client", - "api" - ], + "keywords": ["unkey", "client", "api"], "bugs": { "url": "https://github.com/unkeyed/unkey/issues" }, "homepage": "https://github.com/unkeyed/unkey#readme", - "files": [ - "./dist/**", - "README.md" - ], + "files": ["./dist/**", "README.md"], "author": "Andreas Thomas ", "scripts": { "build": "tsup" diff --git a/packages/ratelimit/package.json b/packages/ratelimit/package.json index fb5c5e1006..d7086cec53 100644 --- a/packages/ratelimit/package.json +++ b/packages/ratelimit/package.json @@ -9,20 +9,12 @@ "publishConfig": { "access": "public" }, - "keywords": [ - "unkey", - "ratelimit", - "global", - "serverless" - ], + "keywords": ["unkey", "ratelimit", "global", "serverless"], "bugs": { "url": "https://github.com/unkeyed/unkey/issues" }, "homepage": "https://github.com/unkeyed/unkey#readme", - "files": [ - "./dist/**", - "README.md" - ], + "files": ["./dist/**", "README.md"], "author": "Andreas Thomas ", "scripts": { "build": "tsup" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 2451ebf979..52c6765584 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -205,7 +205,7 @@ importers: version: link:../../internal/schema ai: specifier: ^3.4.7 - version: 3.4.7(react@18.3.1)(svelte@5.16.0)(vue@3.5.13)(zod@3.23.8) + version: 3.4.7(react@18.3.1)(svelte@5.11.2)(vue@3.5.13)(zod@3.23.8) drizzle-orm: specifier: ^0.33.0 version: 0.33.0(@opentelemetry/api@1.4.1)(@planetscale/database@1.19.0)(@types/react@18.3.11)(react@18.3.1) @@ -580,7 +580,7 @@ importers: version: 5.7.5(@types/react-dom@18.3.0)(@types/react@18.3.11)(next@14.2.15)(react-dom@18.3.1)(react@18.3.1)(tailwindcss@3.4.15) fumadocs-twoslash: specifier: ^2.0.1 - version: 2.0.1(@types/react-dom@18.3.0)(@types/react@18.3.11)(fumadocs-ui@14.4.0)(react-dom@18.3.1)(react@18.3.1)(shiki@1.25.1)(typescript@5.5.4) + version: 2.0.1(@types/react-dom@18.3.0)(@types/react@18.3.11)(fumadocs-ui@14.4.0)(react-dom@18.3.1)(react@18.3.1)(shiki@1.24.2)(typescript@5.5.4) fumadocs-typescript: specifier: ^3.0.2 version: 3.0.2(typescript@5.5.4) @@ -1008,7 +1008,7 @@ importers: version: link:../../packages/error ai: specifier: ^3.0.23 - version: 3.4.7(react@18.3.1)(svelte@5.16.0)(vue@3.5.13)(zod@3.23.8) + version: 3.4.7(react@18.3.1)(svelte@5.11.2)(vue@3.5.13)(zod@3.23.8) zod: specifier: ^3.23.5 version: 3.23.8 @@ -1279,7 +1279,7 @@ importers: version: 18.3.1 react-email: specifier: 2.1.1 - version: 2.1.1(@babel/core@7.26.0)(eslint@9.17.0)(ts-node@10.9.2) + version: 2.1.1(@babel/core@7.26.0)(eslint@9.16.0)(ts-node@10.9.2) resend: specifier: ^4.0.0 version: 4.0.0(react-dom@18.3.1)(react@18.3.1) @@ -1714,13 +1714,13 @@ packages: delay: 6.0.0 hash-object: 5.0.1 is-relative-url: 4.0.0 - jsonrepair: 3.11.2 - ky: 1.7.4 + jsonrepair: 3.11.1 + ky: 1.7.3 normalize-url: 8.0.1 p-map: 7.0.3 p-throttle: 6.2.0 quick-lru: 7.0.0 - type-fest: 4.31.0 + type-fest: 4.30.0 zod: 3.23.8 zod-to-json-schema: 3.24.1(zod@3.23.8) zod-validation-error: 3.4.0(zod@3.23.8) @@ -1735,7 +1735,7 @@ packages: zod: ^3.23.8 dependencies: '@agentic/core': 7.0.0(zod@3.23.8) - ky: 1.7.4 + ky: 1.7.3 zod: 3.23.8 dev: false @@ -1807,7 +1807,7 @@ packages: - zod dev: false - /@ai-sdk/svelte@0.0.51(svelte@5.16.0)(zod@3.23.8): + /@ai-sdk/svelte@0.0.51(svelte@5.11.2)(zod@3.23.8): resolution: {integrity: sha512-aIZJaIds+KpCt19yUDCRDWebzF/17GCY7gN9KkcA2QM6IKRO5UmMcqEYja0ZmwFQPm1kBZkF2njhr8VXis2mAw==} engines: {node: '>=18'} peerDependencies: @@ -1818,8 +1818,8 @@ packages: dependencies: '@ai-sdk/provider-utils': 1.0.20(zod@3.23.8) '@ai-sdk/ui-utils': 0.0.46(zod@3.23.8) - sswr: 2.1.0(svelte@5.16.0) - svelte: 5.16.0 + sswr: 2.1.0(svelte@5.11.2) + svelte: 5.11.2 transitivePeerDependencies: - zod dev: false @@ -2144,7 +2144,7 @@ packages: dependencies: '@babel/compat-data': 7.26.3 '@babel/helper-validator-option': 7.25.9 - browserslist: 4.24.3 + browserslist: 4.24.2 lru-cache: 5.1.1 semver: 6.3.1 @@ -2353,10 +2353,10 @@ packages: statuses: 2.0.1 dev: true - /@changesets/apply-release-plan@7.0.7: - resolution: {integrity: sha512-qnPOcmmmnD0MfMg9DjU1/onORFyRpDXkMMl2IJg9mECY6RnxL3wN0TCCc92b2sXt1jt8DgjAUUsZYGUGTdYIXA==} + /@changesets/apply-release-plan@7.0.6: + resolution: {integrity: sha512-TKhVLtiwtQOgMAC0fCJfmv93faiViKSDqr8oMEqrnNs99gtSC1sZh/aEMS9a+dseU1ESZRCK+ofLgGY7o0fw/Q==} dependencies: - '@changesets/config': 3.0.5 + '@changesets/config': 3.0.4 '@changesets/get-version-range-type': 0.4.0 '@changesets/git': 3.0.2 '@changesets/should-skip-package': 0.1.1 @@ -2393,13 +2393,13 @@ packages: hasBin: true dependencies: '@babel/runtime': 7.26.0 - '@changesets/apply-release-plan': 7.0.7 + '@changesets/apply-release-plan': 7.0.6 '@changesets/assemble-release-plan': 6.0.5 '@changesets/changelog-git': 0.2.0 - '@changesets/config': 3.0.5 + '@changesets/config': 3.0.4 '@changesets/errors': 0.2.0 '@changesets/get-dependents-graph': 2.1.2 - '@changesets/get-release-plan': 4.0.6 + '@changesets/get-release-plan': 4.0.5 '@changesets/git': 3.0.2 '@changesets/logger': 0.1.1 '@changesets/pre': 2.0.1 @@ -2426,8 +2426,8 @@ packages: tty-table: 4.2.3 dev: true - /@changesets/config@3.0.5: - resolution: {integrity: sha512-QyXLSSd10GquX7hY0Mt4yQFMEeqnO5z/XLpbIr4PAkNNoQNKwDyiSrx4yd749WddusH1v3OSiA0NRAYmH/APpQ==} + /@changesets/config@3.0.4: + resolution: {integrity: sha512-+DiIwtEBpvvv1z30f8bbOsUQGuccnZl9KRKMM/LxUHuDu5oEjmN+bJQ1RIBKNJjfYMQn8RZzoPiX0UgPaLQyXw==} dependencies: '@changesets/errors': 0.2.0 '@changesets/get-dependents-graph': 2.1.2 @@ -2453,11 +2453,11 @@ packages: semver: 7.6.3 dev: true - /@changesets/get-release-plan@4.0.6: - resolution: {integrity: sha512-FHRwBkY7Eili04Y5YMOZb0ezQzKikTka4wL753vfUA5COSebt7KThqiuCN9BewE4/qFGgF/5t3AuzXx1/UAY4w==} + /@changesets/get-release-plan@4.0.5: + resolution: {integrity: sha512-E6wW7JoSMcctdVakut0UB76FrrN3KIeJSXvB+DHMFo99CnC3ZVnNYDCVNClMlqAhYGmLmAj77QfApaI3ca4Fkw==} dependencies: '@changesets/assemble-release-plan': 6.0.5 - '@changesets/config': 3.0.5 + '@changesets/config': 3.0.4 '@changesets/pre': 2.0.1 '@changesets/read': 0.6.2 '@changesets/types': 6.0.0 @@ -2817,8 +2817,8 @@ packages: dev: true optional: true - /@commitlint/load@19.6.1(@types/node@20.14.9)(typescript@5.5.3): - resolution: {integrity: sha512-kE4mRKWWNju2QpsCWt428XBvUH55OET2N4QKQ0bF85qS/XbsRGG1MiTByDNlEVpEPceMkDr46LNH95DtRwcsfA==} + /@commitlint/load@19.5.0(@types/node@20.14.9)(typescript@5.5.3): + resolution: {integrity: sha512-INOUhkL/qaKqwcTUvCE8iIUf5XHsEPCLY9looJ/ipzi7jtGhgmtH7OOFiNvwYgH7mA8osUWOUDV8t4E2HAi4xA==} engines: {node: '>=v18'} requiresBuild: true dependencies: @@ -2826,9 +2826,9 @@ packages: '@commitlint/execute-rule': 19.5.0 '@commitlint/resolve-extends': 19.5.0 '@commitlint/types': 19.5.0 - chalk: 5.4.1 + chalk: 5.3.0 cosmiconfig: 9.0.0(typescript@5.5.3) - cosmiconfig-typescript-loader: 6.1.0(@types/node@20.14.9)(cosmiconfig@9.0.0)(typescript@5.5.3) + cosmiconfig-typescript-loader: 5.1.0(@types/node@20.14.9)(cosmiconfig@9.0.0)(typescript@5.5.3) lodash.isplainobject: 4.0.6 lodash.merge: 4.6.2 lodash.uniq: 4.5.0 @@ -2856,7 +2856,7 @@ packages: engines: {node: '>=v18'} dependencies: '@types/conventional-commits-parser': 5.0.1 - chalk: 5.4.1 + chalk: 5.3.0 dev: true optional: true @@ -2869,13 +2869,13 @@ packages: camelcase: 8.0.0 esbuild: 0.21.5 gray-matter: 4.0.3 - p-limit: 6.2.0 + p-limit: 6.1.0 picomatch: 4.0.2 pluralize: 8.0.0 serialize-javascript: 6.0.2 tinyglobby: 0.2.10 typescript: 5.5.3 - yaml: 2.7.0 + yaml: 2.6.1 zod: 3.23.8 dev: true @@ -2926,19 +2926,19 @@ packages: resolution: {integrity: sha512-vPQRo70WzNQU12PGX2dI1yqxPXM0miYnsdu+Jn5UdAJMB1WpyY8pjMe489Bjgg/G5OVmekaeMDGsJYtlSYvbXg==} engines: {node: '>=18'} dependencies: - '@grpc/grpc-js': 1.12.5 + '@grpc/grpc-js': 1.12.4 '@lifeomic/axios-fetch': 3.1.0 '@opentelemetry/api': 1.4.1 '@opentelemetry/exporter-trace-otlp-http': 0.53.0(@opentelemetry/api@1.4.1) - '@opentelemetry/sdk-metrics': 1.30.0(@opentelemetry/api@1.4.1) + '@opentelemetry/sdk-metrics': 1.29.0(@opentelemetry/api@1.4.1) '@opentelemetry/sdk-node': 0.52.1(@opentelemetry/api@1.4.1) '@opentelemetry/semantic-conventions': 1.13.0 adm-zip: 0.5.16 env-paths: 3.0.0 execa: 9.5.2 - graphql: 16.10.0 - graphql-request: 7.1.2(graphql@16.10.0) - graphql-tag: 2.12.6(graphql@16.10.0) + graphql: 16.9.0 + graphql-request: 7.1.2(graphql@16.9.0) + graphql-tag: 2.12.6(graphql@16.9.0) node-color-log: 12.0.1 node-fetch: 3.3.2 reflect-metadata: 0.2.2 @@ -2960,7 +2960,7 @@ packages: /@electric-sql/client@0.7.1: resolution: {integrity: sha512-NpKEn5hDSy+NaAdG9Ql8kIGfjrj/XfakJOOHTTutb99db3Dza0uUfnkqycFpyUAarFMQ4hYSKgx8AbOm1PCeFQ==} optionalDependencies: - '@rollup/rollup-darwin-arm64': 4.29.1 + '@rollup/rollup-darwin-arm64': 4.28.1 dev: false /@emnapi/runtime@1.3.1: @@ -3065,7 +3065,7 @@ packages: debug: 4.4.0(supports-color@8.1.1) esbuild: 0.19.12 escape-string-regexp: 4.0.0 - resolve: 1.22.10 + resolve: 1.22.8 transitivePeerDependencies: - supports-color dev: true @@ -3115,8 +3115,8 @@ packages: dev: true optional: true - /@esbuild/aix-ppc64@0.24.2: - resolution: {integrity: sha512-thpVCb/rhxE/BnMLQ7GReQLLN8q9qbHmI55F4489/ByVg2aQaQ6kbcLb6FHkocZzQhxc4gx0sCk0tJkKBFzDhA==} + /@esbuild/aix-ppc64@0.24.0: + resolution: {integrity: sha512-WtKdFM7ls47zkKHFVzMz8opM7LkcsIp9amDUBIAWirg70RM71WRSjdILPsY5Uv1D42ZpUfaPILDlfactHgsRkw==} engines: {node: '>=18'} cpu: [ppc64] os: [aix] @@ -3186,8 +3186,8 @@ packages: dev: true optional: true - /@esbuild/android-arm64@0.24.2: - resolution: {integrity: sha512-cNLgeqCqV8WxfcTIOeL4OAtSmL8JjcN6m09XIgro1Wi7cF4t/THaWEa7eL5CMoMBdjoHOTh/vwTO/o2TRXIyzg==} + /@esbuild/android-arm64@0.24.0: + resolution: {integrity: sha512-Vsm497xFM7tTIPYK9bNTYJyF/lsP590Qc1WxJdlB6ljCbdZKU9SY8i7+Iin4kyhV/KV5J2rOKsBQbB77Ab7L/w==} engines: {node: '>=18'} cpu: [arm64] os: [android] @@ -3257,8 +3257,8 @@ packages: dev: true optional: true - /@esbuild/android-arm@0.24.2: - resolution: {integrity: sha512-tmwl4hJkCfNHwFB3nBa8z1Uy3ypZpxqxfTQOcHX+xRByyYgunVbZ9MzUUfb0RxaHIMnbHagwAxuTL+tnNM+1/Q==} + /@esbuild/android-arm@0.24.0: + resolution: {integrity: sha512-arAtTPo76fJ/ICkXWetLCc9EwEHKaeya4vMrReVlEIUCAUncH7M4bhMQ+M9Vf+FFOZJdTNMXNBrWwW+OXWpSew==} engines: {node: '>=18'} cpu: [arm] os: [android] @@ -3328,8 +3328,8 @@ packages: dev: true optional: true - /@esbuild/android-x64@0.24.2: - resolution: {integrity: sha512-B6Q0YQDqMx9D7rvIcsXfmJfvUYLoP722bgfBlO5cGvNVb5V/+Y7nhBE3mHV9OpxBf4eAS2S68KZztiPaWq4XYw==} + /@esbuild/android-x64@0.24.0: + resolution: {integrity: sha512-t8GrvnFkiIY7pa7mMgJd7p8p8qqYIz1NYiAoKc75Zyv73L3DZW++oYMSHPRarcotTKuSs6m3hTOa5CKHaS02TQ==} engines: {node: '>=18'} cpu: [x64] os: [android] @@ -3399,8 +3399,8 @@ packages: dev: true optional: true - /@esbuild/darwin-arm64@0.24.2: - resolution: {integrity: sha512-kj3AnYWc+CekmZnS5IPu9D+HWtUI49hbnyqk0FLEJDbzCIQt7hg7ucF1SQAilhtYpIujfaHr6O0UHlzzSPdOeA==} + /@esbuild/darwin-arm64@0.24.0: + resolution: {integrity: sha512-CKyDpRbK1hXwv79soeTJNHb5EiG6ct3efd/FTPdzOWdbZZfGhpbcqIpiD0+vwmpu0wTIL97ZRPZu8vUt46nBSw==} engines: {node: '>=18'} cpu: [arm64] os: [darwin] @@ -3470,8 +3470,8 @@ packages: dev: true optional: true - /@esbuild/darwin-x64@0.24.2: - resolution: {integrity: sha512-WeSrmwwHaPkNR5H3yYfowhZcbriGqooyu3zI/3GGpF8AyUdsrrP0X6KumITGA9WOyiJavnGZUwPGvxvwfWPHIA==} + /@esbuild/darwin-x64@0.24.0: + resolution: {integrity: sha512-rgtz6flkVkh58od4PwTRqxbKH9cOjaXCMZgWD905JOzjFKW+7EiUObfd/Kav+A6Gyud6WZk9w+xu6QLytdi2OA==} engines: {node: '>=18'} cpu: [x64] os: [darwin] @@ -3541,8 +3541,8 @@ packages: dev: true optional: true - /@esbuild/freebsd-arm64@0.24.2: - resolution: {integrity: sha512-UN8HXjtJ0k/Mj6a9+5u6+2eZ2ERD7Edt1Q9IZiB5UZAIdPnVKDoG7mdTVGhHJIeEml60JteamR3qhsr1r8gXvg==} + /@esbuild/freebsd-arm64@0.24.0: + resolution: {integrity: sha512-6Mtdq5nHggwfDNLAHkPlyLBpE5L6hwsuXZX8XNmHno9JuL2+bg2BX5tRkwjyfn6sKbxZTq68suOjgWqCicvPXA==} engines: {node: '>=18'} cpu: [arm64] os: [freebsd] @@ -3612,8 +3612,8 @@ packages: dev: true optional: true - /@esbuild/freebsd-x64@0.24.2: - resolution: {integrity: sha512-TvW7wE/89PYW+IevEJXZ5sF6gJRDY/14hyIGFXdIucxCsbRmLUcjseQu1SyTko+2idmCw94TgyaEZi9HUSOe3Q==} + /@esbuild/freebsd-x64@0.24.0: + resolution: {integrity: sha512-D3H+xh3/zphoX8ck4S2RxKR6gHlHDXXzOf6f/9dbFt/NRBDIE33+cVa49Kil4WUjxMGW0ZIYBYtaGCa2+OsQwQ==} engines: {node: '>=18'} cpu: [x64] os: [freebsd] @@ -3683,8 +3683,8 @@ packages: dev: true optional: true - /@esbuild/linux-arm64@0.24.2: - resolution: {integrity: sha512-7HnAD6074BW43YvvUmE/35Id9/NB7BeX5EoNkK9obndmZBUk8xmJJeU7DwmUeN7tkysslb2eSl6CTrYz6oEMQg==} + /@esbuild/linux-arm64@0.24.0: + resolution: {integrity: sha512-TDijPXTOeE3eaMkRYpcy3LarIg13dS9wWHRdwYRnzlwlA370rNdZqbcp0WTyyV/k2zSxfko52+C7jU5F9Tfj1g==} engines: {node: '>=18'} cpu: [arm64] os: [linux] @@ -3754,8 +3754,8 @@ packages: dev: true optional: true - /@esbuild/linux-arm@0.24.2: - resolution: {integrity: sha512-n0WRM/gWIdU29J57hJyUdIsk0WarGd6To0s+Y+LwvlC55wt+GT/OgkwoXCXvIue1i1sSNWblHEig00GBWiJgfA==} + /@esbuild/linux-arm@0.24.0: + resolution: {integrity: sha512-gJKIi2IjRo5G6Glxb8d3DzYXlxdEj2NlkixPsqePSZMhLudqPhtZ4BUrpIuTjJYXxvF9njql+vRjB2oaC9XpBw==} engines: {node: '>=18'} cpu: [arm] os: [linux] @@ -3825,8 +3825,8 @@ packages: dev: true optional: true - /@esbuild/linux-ia32@0.24.2: - resolution: {integrity: sha512-sfv0tGPQhcZOgTKO3oBE9xpHuUqguHvSo4jl+wjnKwFpapx+vUDcawbwPNuBIAYdRAvIDBfZVvXprIj3HA+Ugw==} + /@esbuild/linux-ia32@0.24.0: + resolution: {integrity: sha512-K40ip1LAcA0byL05TbCQ4yJ4swvnbzHscRmUilrmP9Am7//0UjPreh4lpYzvThT2Quw66MhjG//20mrufm40mA==} engines: {node: '>=18'} cpu: [ia32] os: [linux] @@ -3896,8 +3896,8 @@ packages: dev: true optional: true - /@esbuild/linux-loong64@0.24.2: - resolution: {integrity: sha512-CN9AZr8kEndGooS35ntToZLTQLHEjtVB5n7dl8ZcTZMonJ7CCfStrYhrzF97eAecqVbVJ7APOEe18RPI4KLhwQ==} + /@esbuild/linux-loong64@0.24.0: + resolution: {integrity: sha512-0mswrYP/9ai+CU0BzBfPMZ8RVm3RGAN/lmOMgW4aFUSOQBjA31UP8Mr6DDhWSuMwj7jaWOT0p0WoZ6jeHhrD7g==} engines: {node: '>=18'} cpu: [loong64] os: [linux] @@ -3967,8 +3967,8 @@ packages: dev: true optional: true - /@esbuild/linux-mips64el@0.24.2: - resolution: {integrity: sha512-iMkk7qr/wl3exJATwkISxI7kTcmHKE+BlymIAbHO8xanq/TjHaaVThFF6ipWzPHryoFsesNQJPE/3wFJw4+huw==} + /@esbuild/linux-mips64el@0.24.0: + resolution: {integrity: sha512-hIKvXm0/3w/5+RDtCJeXqMZGkI2s4oMUGj3/jM0QzhgIASWrGO5/RlzAzm5nNh/awHE0A19h/CvHQe6FaBNrRA==} engines: {node: '>=18'} cpu: [mips64el] os: [linux] @@ -4038,8 +4038,8 @@ packages: dev: true optional: true - /@esbuild/linux-ppc64@0.24.2: - resolution: {integrity: sha512-shsVrgCZ57Vr2L8mm39kO5PPIb+843FStGt7sGGoqiiWYconSxwTiuswC1VJZLCjNiMLAMh34jg4VSEQb+iEbw==} + /@esbuild/linux-ppc64@0.24.0: + resolution: {integrity: sha512-HcZh5BNq0aC52UoocJxaKORfFODWXZxtBaaZNuN3PUX3MoDsChsZqopzi5UupRhPHSEHotoiptqikjN/B77mYQ==} engines: {node: '>=18'} cpu: [ppc64] os: [linux] @@ -4109,8 +4109,8 @@ packages: dev: true optional: true - /@esbuild/linux-riscv64@0.24.2: - resolution: {integrity: sha512-4eSFWnU9Hhd68fW16GD0TINewo1L6dRrB+oLNNbYyMUAeOD2yCK5KXGK1GH4qD/kT+bTEXjsyTCiJGHPZ3eM9Q==} + /@esbuild/linux-riscv64@0.24.0: + resolution: {integrity: sha512-bEh7dMn/h3QxeR2KTy1DUszQjUrIHPZKyO6aN1X4BCnhfYhuQqedHaa5MxSQA/06j3GpiIlFGSsy1c7Gf9padw==} engines: {node: '>=18'} cpu: [riscv64] os: [linux] @@ -4180,8 +4180,8 @@ packages: dev: true optional: true - /@esbuild/linux-s390x@0.24.2: - resolution: {integrity: sha512-S0Bh0A53b0YHL2XEXC20bHLuGMOhFDO6GN4b3YjRLK//Ep3ql3erpNcPlEFed93hsQAjAQDNsvcK+hV90FubSw==} + /@esbuild/linux-s390x@0.24.0: + resolution: {integrity: sha512-ZcQ6+qRkw1UcZGPyrCiHHkmBaj9SiCD8Oqd556HldP+QlpUIe2Wgn3ehQGVoPOvZvtHm8HPx+bH20c9pvbkX3g==} engines: {node: '>=18'} cpu: [s390x] os: [linux] @@ -4251,8 +4251,8 @@ packages: dev: true optional: true - /@esbuild/linux-x64@0.24.2: - resolution: {integrity: sha512-8Qi4nQcCTbLnK9WoMjdC9NiTG6/E38RNICU6sUNqK0QFxCYgoARqVqxdFmWkdonVsvGqWhmm7MO0jyTqLqwj0Q==} + /@esbuild/linux-x64@0.24.0: + resolution: {integrity: sha512-vbutsFqQ+foy3wSSbmjBXXIJ6PL3scghJoM8zCL142cGaZKAdCZHyf+Bpu/MmX9zT9Q0zFBVKb36Ma5Fzfa8xA==} engines: {node: '>=18'} cpu: [x64] os: [linux] @@ -4260,15 +4260,6 @@ packages: dev: false optional: true - /@esbuild/netbsd-arm64@0.24.2: - resolution: {integrity: sha512-wuLK/VztRRpMt9zyHSazyCVdCXlpHkKm34WUyinD2lzK07FAHTq0KQvZZlXikNWkDGoT6x3TD51jKQ7gMVpopw==} - engines: {node: '>=18'} - cpu: [arm64] - os: [netbsd] - requiresBuild: true - dev: false - optional: true - /@esbuild/netbsd-x64@0.17.19: resolution: {integrity: sha512-CwFq42rXCR8TYIjIfpXCbRX0rp1jo6cPIUPSaWwzbVI4aOfX96OXY8M6KNmtPcg7QjYeDmN+DD0Wp3LaBOLf4Q==} engines: {node: '>=12'} @@ -4331,8 +4322,8 @@ packages: dev: true optional: true - /@esbuild/netbsd-x64@0.24.2: - resolution: {integrity: sha512-VefFaQUc4FMmJuAxmIHgUmfNiLXY438XrL4GDNV1Y1H/RW3qow68xTwjZKfj/+Plp9NANmzbH5R40Meudu8mmw==} + /@esbuild/netbsd-x64@0.24.0: + resolution: {integrity: sha512-hjQ0R/ulkO8fCYFsG0FZoH+pWgTTDreqpqY7UnQntnaKv95uP5iW3+dChxnx7C3trQQU40S+OgWhUVwCjVFLvg==} engines: {node: '>=18'} cpu: [x64] os: [netbsd] @@ -4349,8 +4340,8 @@ packages: dev: true optional: true - /@esbuild/openbsd-arm64@0.24.2: - resolution: {integrity: sha512-YQbi46SBct6iKnszhSvdluqDmxCJA+Pu280Av9WICNwQmMxV7nLRHZfjQzwbPs3jeWnuAhE9Jy0NrnJ12Oz+0A==} + /@esbuild/openbsd-arm64@0.24.0: + resolution: {integrity: sha512-MD9uzzkPQbYehwcN583yx3Tu5M8EIoTD+tUgKF982WYL9Pf5rKy9ltgD0eUgs8pvKnmizxjXZyLt0z6DC3rRXg==} engines: {node: '>=18'} cpu: [arm64] os: [openbsd] @@ -4420,8 +4411,8 @@ packages: dev: true optional: true - /@esbuild/openbsd-x64@0.24.2: - resolution: {integrity: sha512-+iDS6zpNM6EnJyWv0bMGLWSWeXGN/HTaF/LXHXHwejGsVi+ooqDfMCCTerNFxEkM3wYVcExkeGXNqshc9iMaOA==} + /@esbuild/openbsd-x64@0.24.0: + resolution: {integrity: sha512-4ir0aY1NGUhIC1hdoCzr1+5b43mw99uNwVzhIq1OY3QcEwPDO3B7WNXBzaKY5Nsf1+N11i1eOfFcq+D/gOS15Q==} engines: {node: '>=18'} cpu: [x64] os: [openbsd] @@ -4491,8 +4482,8 @@ packages: dev: true optional: true - /@esbuild/sunos-x64@0.24.2: - resolution: {integrity: sha512-hTdsW27jcktEvpwNHJU4ZwWFGkz2zRJUz8pvddmXPtXDzVKTTINmlmga3ZzwcuMpUvLw7JkLy9QLKyGpD2Yxig==} + /@esbuild/sunos-x64@0.24.0: + resolution: {integrity: sha512-jVzdzsbM5xrotH+W5f1s+JtUy1UWgjU0Cf4wMvffTB8m6wP5/kx0KiaLHlbJO+dMgtxKV8RQ/JvtlFcdZ1zCPA==} engines: {node: '>=18'} cpu: [x64] os: [sunos] @@ -4562,8 +4553,8 @@ packages: dev: true optional: true - /@esbuild/win32-arm64@0.24.2: - resolution: {integrity: sha512-LihEQ2BBKVFLOC9ZItT9iFprsE9tqjDjnbulhHoFxYQtQfai7qfluVODIYxt1PgdoyQkz23+01rzwNwYfutxUQ==} + /@esbuild/win32-arm64@0.24.0: + resolution: {integrity: sha512-iKc8GAslzRpBytO2/aN3d2yb2z8XTVfNV0PjGlCxKo5SgWmNXx82I/Q3aG1tFfS+A2igVCY97TJ8tnYwpUWLCA==} engines: {node: '>=18'} cpu: [arm64] os: [win32] @@ -4633,8 +4624,8 @@ packages: dev: true optional: true - /@esbuild/win32-ia32@0.24.2: - resolution: {integrity: sha512-q+iGUwfs8tncmFC9pcnD5IvRHAzmbwQ3GPS5/ceCyHdjXubwQWI12MKWSNSMYLJMq23/IUCvJMS76PDqXe1fxA==} + /@esbuild/win32-ia32@0.24.0: + resolution: {integrity: sha512-vQW36KZolfIudCcTnaTpmLQ24Ha1RjygBo39/aLkM2kmjkWmZGEJ5Gn9l5/7tzXA42QGIoWbICfg6KLLkIw6yw==} engines: {node: '>=18'} cpu: [ia32] os: [win32] @@ -4704,8 +4695,8 @@ packages: dev: true optional: true - /@esbuild/win32-x64@0.24.2: - resolution: {integrity: sha512-7VTgWzgMGvup6aSqDPLiW5zHaxYJGTO4OokMjIlrCtf+VpEL+cXKtCvg723iguPYI5oaUNdS+/V7OU2gvXVWEg==} + /@esbuild/win32-x64@0.24.0: + resolution: {integrity: sha512-7IAFPrjSQIJrGsK6flwg7NFmwBoSTyF3rl7If0hNUFQU4ilTsEPL6GuMuU9BfIWVVGuRnuIidkSMC+c0Otu8IA==} engines: {node: '>=18'} cpu: [x64] os: [win32] @@ -4713,13 +4704,13 @@ packages: dev: false optional: true - /@eslint-community/eslint-utils@4.4.1(eslint@9.17.0): + /@eslint-community/eslint-utils@4.4.1(eslint@9.16.0): resolution: {integrity: sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 dependencies: - eslint: 9.17.0 + eslint: 9.16.0 eslint-visitor-keys: 3.4.3 dev: false @@ -4763,8 +4754,8 @@ packages: - supports-color dev: false - /@eslint/js@9.17.0: - resolution: {integrity: sha512-Sxc4hqcs1kTu0iID3kcZDW3JHq2a77HO9P8CP6YEA/FpH3Ll8UXE2r/86Rz9YJLKme39S9vU5OWNjC6Xl0Cr3w==} + /@eslint/js@9.16.0: + resolution: {integrity: sha512-tw2HxzQkrbeuvyj1tG2Yqq+0H9wGoI2IMk4EOsQeX+vmd75FtJAzf+gTA69WF+baUKRYQ3x2kbLE08js5OsTVg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} dev: false @@ -4837,15 +4828,15 @@ packages: engines: {node: '>=14.0.0'} dev: false - /@graphql-typed-document-node/core@3.2.0(graphql@16.10.0): + /@graphql-typed-document-node/core@3.2.0(graphql@16.9.0): resolution: {integrity: sha512-mB9oAsNCm9aM3/SOv4YtBMqZbYj10R7dkq8byBqxGY/ncFwhf2oQzMV+LCRlWoDSEBJ3COiR1yeDvMtsoOsuFQ==} peerDependencies: graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 dependencies: - graphql: 16.10.0 + graphql: 16.9.0 - /@grpc/grpc-js@1.12.5: - resolution: {integrity: sha512-d3iiHxdpg5+ZcJ6jnDSOT8Z0O0VMVGy34jAnYLUX8yd36b1qn8f1TwOA/Lc7TsOh03IkPJ38eGI5qD2EjNkoEA==} + /@grpc/grpc-js@1.12.4: + resolution: {integrity: sha512-NBhrxEWnFh0FxeA0d//YP95lRFsSx2TNLEUQg4/W+5f/BMxcCjgOOIT24iD+ZB/tZw057j44DaIxja7w4XMrhg==} engines: {node: '>=12.10.0'} dependencies: '@grpc/proto-loader': 0.7.13 @@ -5101,10 +5092,10 @@ packages: resolution: {integrity: sha512-F2VBt7W/mwqEU4bL0RnHNZmC/OxzNx9cOYxHqnXX3MP6ruYvZUZAW9imgN9+h/uBT/oP8Gh888J2OZSbjSeWcg==} engines: {node: '>=18'} dependencies: - '@inquirer/figures': 1.0.9 + '@inquirer/figures': 1.0.8 '@inquirer/type': 2.0.0 '@types/mute-stream': 0.0.4 - '@types/node': 22.10.3 + '@types/node': 22.10.2 '@types/wrap-ansi': 3.0.0 ansi-escapes: 4.3.2 cli-width: 4.1.0 @@ -5115,8 +5106,8 @@ packages: yoctocolors-cjs: 2.1.2 dev: true - /@inquirer/figures@1.0.9: - resolution: {integrity: sha512-BXvGj0ehzrngHTPTDqUoDT3NXL8U0RxUk2zJm2A66RhCEIWdtU1v6GuUqNAgArW4PQ9CinqIWyHdQgdwOj06zQ==} + /@inquirer/figures@1.0.8: + resolution: {integrity: sha512-tKd+jsmhq21AP1LhexC0pPwsCxEhGgAkg28byjJAd+xhmIs8LUX8JbUc3vBf3PhLxWiB5EvyBE5X7JSPAqMAqg==} engines: {node: '>=18'} dev: true @@ -5454,9 +5445,9 @@ packages: '@babel/core': 7.26.0 '@babel/helper-module-imports': 7.25.9 '@babel/types': 7.26.3 - '@radix-ui/react-dialog': 1.1.4(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) - '@radix-ui/react-tooltip': 1.1.6(react-dom@18.3.1)(react@18.3.1) - '@rollup/pluginutils': 5.1.4 + '@radix-ui/react-dialog': 1.1.2(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-tooltip': 1.1.4(react-dom@18.3.1)(react@18.3.1) + '@rollup/pluginutils': 5.1.3 cmdk: 0.2.1(react-dom@18.3.1)(react@18.3.1) esbuild: 0.20.2 escalade: 3.2.0 @@ -5489,7 +5480,7 @@ packages: '@mintlify/prebuild': 1.0.280(react-dom@18.3.1)(react@18.3.1)(typescript@5.5.3) '@mintlify/previewing': 4.0.283(react-dom@18.3.1)(react@18.3.1)(typescript@5.5.3) '@mintlify/validation': 0.1.222 - chalk: 5.4.1 + chalk: 5.3.0 detect-port: 1.6.1 fs-extra: 11.2.0 gray-matter: 4.0.3 @@ -5564,7 +5555,7 @@ packages: dependencies: '@mintlify/common': 1.0.191(react-dom@18.3.1)(react@18.3.1) '@mintlify/prebuild': 1.0.280(react-dom@18.3.1)(react@18.3.1)(typescript@5.5.3) - chalk: 5.4.1 + chalk: 5.3.0 fs-extra: 11.2.0 gray-matter: 4.0.3 is-absolute-url: 4.0.1 @@ -5624,7 +5615,7 @@ packages: ajv-formats: 3.0.1(ajv@8.17.1) jsonpointer: 5.0.1 leven: 4.0.0 - yaml: 2.7.0 + yaml: 2.6.1 dev: true /@mintlify/prebuild@1.0.280(react-dom@18.3.1)(react@18.3.1)(typescript@5.5.3): @@ -5635,7 +5626,7 @@ packages: '@mintlify/scraping': 4.0.33(react-dom@18.3.1)(react@18.3.1)(typescript@5.5.3) '@mintlify/validation': 0.1.222 axios: 1.7.9 - chalk: 5.4.1 + chalk: 5.3.0 favicons: 7.2.0 fs-extra: 11.2.0 gray-matter: 4.0.3 @@ -5662,7 +5653,7 @@ packages: '@mintlify/validation': 0.1.222 '@octokit/rest': 19.0.13 better-opn: 3.0.2 - chalk: 5.4.1 + chalk: 5.3.0 chokidar: 3.6.0 express: 4.21.2 fs-extra: 11.2.0 @@ -5955,14 +5946,14 @@ packages: engines: {node: '>= 8'} dependencies: '@nodelib/fs.scandir': 2.1.5 - fastq: 1.18.0 + fastq: 1.17.1 /@nodelib/fs.walk@2.0.0: resolution: {integrity: sha512-54voNDBobGdMl3BUXSu7UaDh1P85PGHWlJ5e0XhPugo1JulOyCtp2I+5ri4wplGDJ8QGwPEQW7/x3yTLU7yF1A==} engines: {node: '>=16.14.0'} dependencies: '@nodelib/fs.scandir': 3.0.0 - fastq: 1.18.0 + fastq: 1.17.1 dev: true /@oclif/color@1.0.13: @@ -6050,12 +6041,12 @@ packages: - typescript dev: true - /@oclif/core@4.2.0: - resolution: {integrity: sha512-ETM2N/GL7W37Kv1Afv1j1Gh77CynS2ubEPP+p+MnjUXEjghNe7+bKAWhPkHnBuFAVFAqdv0qMpUAjxKLbsmbJw==} + /@oclif/core@4.0.36: + resolution: {integrity: sha512-Dk0bK2Abl/AJ3Fn6ountX037lbXGJY/xcTnBJs2SKDqex9wMcgkbnkKd6xXC/zJnRlfA+jE+niC3FnbxgTRcHg==} engines: {node: '>=18.0.0'} dependencies: ansi-escapes: 4.3.2 - ansis: 3.5.2 + ansis: 3.3.2 clean-stack: 3.0.1 cli-spinners: 2.9.2 debug: 4.4.0(supports-color@8.1.1) @@ -6104,8 +6095,8 @@ packages: resolution: {integrity: sha512-p30fo3JPtbOqTJOX9A/8qKV/14XWt8xFgG/goVfIkuKBAO+cdY78ag8pYatlpzsYzJhO27X1MFn0WkkPWo36Ww==} engines: {node: '>=18.0.0'} dependencies: - '@oclif/core': 4.2.0 - ansis: 3.5.2 + '@oclif/core': 4.0.36 + ansis: 3.3.2 debug: 4.4.0(supports-color@8.1.1) npm: 10.9.2 npm-package-arg: 11.0.3 @@ -6212,16 +6203,16 @@ packages: engines: {node: '>= 18'} dependencies: '@octokit/auth-token': 5.1.1 - '@octokit/graphql': 8.1.2 - '@octokit/request': 9.1.4 - '@octokit/request-error': 6.1.6 + '@octokit/graphql': 8.1.1 + '@octokit/request': 9.1.3 + '@octokit/request-error': 6.1.5 '@octokit/types': 13.6.2 before-after-hook: 3.0.2 universal-user-agent: 7.0.2 dev: false - /@octokit/endpoint@10.1.2: - resolution: {integrity: sha512-XybpFv9Ms4hX5OCHMZqyODYqGTZ3H6K6Vva+M9LR7ib/xr1y1ZnlChYv9H680y77Vd/i/k+thXApeRASBQkzhA==} + /@octokit/endpoint@10.1.1: + resolution: {integrity: sha512-JYjh5rMOwXMJyUpj028cu0Gbp7qe/ihxfJMLc8VZBMMqSwLgOxDI1911gV4Enl1QSavAQNJcwmwBF9M0VvLh6Q==} engines: {node: '>= 18'} dependencies: '@octokit/types': 13.6.2 @@ -6283,11 +6274,11 @@ packages: universal-user-agent: 6.0.1 dev: false - /@octokit/graphql@8.1.2: - resolution: {integrity: sha512-bdlj/CJVjpaz06NBpfHhp4kGJaRZfz7AzC+6EwUImRtrwIw8dIgJ63Xg0OzV9pRn3rIzrt5c2sa++BL0JJ8GLw==} + /@octokit/graphql@8.1.1: + resolution: {integrity: sha512-ukiRmuHTi6ebQx/HFRCXKbDlOh/7xEV6QUXaE7MJEKGNAncGI/STSbOkl12qVXZrfZdpXctx5O9X1AIaebiDBg==} engines: {node: '>= 18'} dependencies: - '@octokit/request': 9.1.4 + '@octokit/request': 9.1.3 '@octokit/types': 13.6.2 universal-user-agent: 7.0.2 dev: false @@ -6407,8 +6398,8 @@ packages: once: 1.4.0 dev: false - /@octokit/request-error@6.1.6: - resolution: {integrity: sha512-pqnVKYo/at0NuOjinrgcQYpEbv4snvP3bKMRqHaD9kIsk9u1LCpb2smHZi8/qJfgeNqLo5hNW4Z7FezNdEo0xg==} + /@octokit/request-error@6.1.5: + resolution: {integrity: sha512-IlBTfGX8Yn/oFPMwSfvugfncK2EwRLjzbrpifNaMY8o/HTEAFqCA1FZxjD9cWvSKBHgrIhc4CSBIzMxiLsbzFQ==} engines: {node: '>= 18'} dependencies: '@octokit/types': 13.6.2 @@ -6451,14 +6442,13 @@ packages: universal-user-agent: 6.0.1 dev: false - /@octokit/request@9.1.4: - resolution: {integrity: sha512-tMbOwGm6wDII6vygP3wUVqFTw3Aoo0FnVQyhihh8vVq12uO3P+vQZeo2CKMpWtPSogpACD0yyZAlVlQnjW71DA==} + /@octokit/request@9.1.3: + resolution: {integrity: sha512-V+TFhu5fdF3K58rs1pGUJIDH5RZLbZm5BI+MNF+6o/ssFNT4vWlCh/tVpF3NxGtP15HUxTTMUbsG5llAuU2CZA==} engines: {node: '>= 18'} dependencies: - '@octokit/endpoint': 10.1.2 - '@octokit/request-error': 6.1.6 + '@octokit/endpoint': 10.1.1 + '@octokit/request-error': 6.1.5 '@octokit/types': 13.6.2 - fast-content-type-parse: 2.0.0 universal-user-agent: 7.0.2 dev: false @@ -6618,7 +6608,7 @@ packages: peerDependencies: '@opentelemetry/api': ^1.0.0 dependencies: - '@grpc/grpc-js': 1.12.5 + '@grpc/grpc-js': 1.12.4 '@opentelemetry/api': 1.4.1 '@opentelemetry/core': 1.13.0(@opentelemetry/api@1.4.1) '@opentelemetry/otlp-grpc-exporter-base': 0.39.1(@opentelemetry/api@1.4.1) @@ -6687,7 +6677,7 @@ packages: '@opentelemetry/api': 1.4.1 '@opentelemetry/api-logs': 0.52.1 '@types/shimmer': 1.2.0 - import-in-the-middle: 1.12.0 + import-in-the-middle: 1.11.3 require-in-the-middle: 7.4.0 semver: 7.6.3 shimmer: 1.2.1 @@ -6730,7 +6720,7 @@ packages: peerDependencies: '@opentelemetry/api': ^1.0.0 dependencies: - '@grpc/grpc-js': 1.12.5 + '@grpc/grpc-js': 1.12.4 '@opentelemetry/api': 1.4.1 '@opentelemetry/core': 1.13.0(@opentelemetry/api@1.4.1) '@opentelemetry/otlp-exporter-base': 0.39.1(@opentelemetry/api@1.4.1) @@ -6877,8 +6867,8 @@ packages: '@opentelemetry/resources': 1.13.0(@opentelemetry/api@1.4.1) dev: true - /@opentelemetry/sdk-metrics@1.30.0(@opentelemetry/api@1.4.1): - resolution: {integrity: sha512-5kcj6APyRMvv6dEIP5plz2qfJAD4OMipBRT11u/pa1a68rHKI2Ln+iXVkAGKgx8o7CXbD7FdPypTUY88ZQgP4Q==} + /@opentelemetry/sdk-metrics@1.29.0(@opentelemetry/api@1.4.1): + resolution: {integrity: sha512-MkVtuzDjXZaUJSuJlHn6BSXjcQlMvHcsDV7LjY4P6AJeffMa4+kIGDjzsCf6DkAh6Vqlwag5EWEam3KZOX5Drw==} engines: {node: '>=14'} peerDependencies: '@opentelemetry/api': '>=1.3.0 <1.10.0' @@ -7087,8 +7077,8 @@ packages: '@parcel/watcher-win32-x64': 2.5.0 dev: true - /@peculiar/asn1-schema@2.3.15: - resolution: {integrity: sha512-QPeD8UA8axQREpgR5UTAfu2mqQmm97oUqahDtNdBcfj3qAnoXzFdQW+aNf/tD2WVXF8Fhmftxoj0eMIT++gX2w==} + /@peculiar/asn1-schema@2.3.13: + resolution: {integrity: sha512-3Xq3a01WkHRZL8X04Zsfg//mGaA21xlL4tlVn4v2xGT0JStiztATRkMwa5b+f/HXmY2smsiLXYK46Gwgzvfg3g==} dependencies: asn1js: 3.0.5 pvtsutils: 1.3.6 @@ -7099,17 +7089,17 @@ packages: resolution: {integrity: sha512-coUfuoMeIB7B8/NMekxaDzLhaYmp0HZNPEjYRm9goRou8UZIC3z21s0sL9AWoCw4EG876QyO3kYrc61WNF9B/w==} engines: {node: '>=8.0.0'} dependencies: - tslib: 2.4.1 + tslib: 2.8.1 dev: false /@peculiar/webcrypto@1.4.1: resolution: {integrity: sha512-eK4C6WTNYxoI7JOabMoZICiyqRRtJB220bh0Mbj5RwRycleZf9BPyZoxsTvpP0FpmVS2aS13NKOuh5/tN3sIRw==} engines: {node: '>=10.12.0'} dependencies: - '@peculiar/asn1-schema': 2.3.15 + '@peculiar/asn1-schema': 2.3.13 '@peculiar/json-schema': 1.1.12 pvtsutils: 1.3.6 - tslib: 2.4.1 + tslib: 2.8.1 webcrypto-core: 1.8.1 dev: false @@ -7208,10 +7198,10 @@ packages: /@radix-ui/primitive@1.1.0: resolution: {integrity: sha512-4Z8dn6Upk0qk4P74xBhZ6Hd/w0mPEzOOLxy4xiPXOXqjF7jZS0VAKk7/x/H6FyY2zCkYJqePf1G5KmkmNJ4RBA==} - dev: false /@radix-ui/primitive@1.1.1: resolution: {integrity: sha512-SJ31y+Q/zAyShtXJc8x83i9TYdbAfHZ++tUZnvjJJqFjzsdUnKsxPL6IEtBlxKkU7yzer//GQtZSV4GbldL3YA==} + dev: false /@radix-ui/react-accordion@1.2.0(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1): resolution: {integrity: sha512-HJOzSX8dQqtsp/3jVxCU3CXEONF7/2jlGAB28oX8TTw1Dz8JYbEI1UcL8355PuLBE41/IRRMvCw7VkiK/jcUOQ==} @@ -7241,8 +7231,8 @@ packages: react-dom: 18.3.1(react@18.3.1) dev: false - /@radix-ui/react-accordion@1.2.2(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-b1oh54x4DMCdGsB4/7ahiSrViXxaBwRPotiZNnYXjLha9vfuURSAZErki6qjDoSIV0eXx5v57XnTGVtGwnfp2g==} + /@radix-ui/react-accordion@1.2.1(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-bg/l7l5QzUjgsh8kjwDFommzAshnUsuVMV5NM56QVCm+7ZckYdd9P/ExR8xG/Oup0OajVxNLaHJ1tb8mXk+nzQ==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -7254,14 +7244,14 @@ packages: '@types/react-dom': optional: true dependencies: - '@radix-ui/primitive': 1.1.1 - '@radix-ui/react-collapsible': 1.1.2(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) - '@radix-ui/react-collection': 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) - '@radix-ui/react-compose-refs': 1.1.1(@types/react@18.3.11)(react@18.3.1) + '@radix-ui/primitive': 1.1.0 + '@radix-ui/react-collapsible': 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-collection': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.11)(react@18.3.1) '@radix-ui/react-context': 1.1.1(@types/react@18.3.11)(react@18.3.1) '@radix-ui/react-direction': 1.1.0(@types/react@18.3.11)(react@18.3.1) '@radix-ui/react-id': 1.1.0(@types/react@18.3.11)(react@18.3.1) - '@radix-ui/react-primitive': 2.0.1(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.11)(react@18.3.1) '@types/react': 18.3.11 '@types/react-dom': 18.3.0 @@ -7333,26 +7323,6 @@ packages: '@types/react-dom': 18.3.0 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - dev: false - - /@radix-ui/react-arrow@1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-NaVpZfmv8SKeZbn4ijN2V3jlHA9ngBG16VnIIm22nUR0Yk8KUALyBxT3KYEUnNuch9sTE8UTsS3whzBgKOL30w==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - dependencies: - '@radix-ui/react-primitive': 2.0.1(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) - '@types/react': 18.3.11 - '@types/react-dom': 18.3.0 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) /@radix-ui/react-avatar@1.0.4(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1): resolution: {integrity: sha512-kVK2K7ZD3wwj3qhle0ElXhOjbezIgyl2hVvgwfIdexL3rN6zJmy5AqqIf+D31lxVppdzV8CjAfZ6PklkmInZLw==} @@ -7461,8 +7431,8 @@ packages: react-dom: 18.3.1(react@18.3.1) dev: false - /@radix-ui/react-collapsible@1.1.2(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-PliMB63vxz7vggcyq0IxNYk8vGDrLXVWw4+W4B8YnwI1s18x7YZYqlG9PLX7XxAJUi0g2DxP4XKJMFHh/iVh9A==} + /@radix-ui/react-collapsible@1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-1///SnrfQHJEofLokyczERxQbWfCGQlQ2XsCZMucVs6it+lq9iw4vXy+uDn1edlb58cOZOWSldnfPAYcT4O/Yg==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -7474,12 +7444,12 @@ packages: '@types/react-dom': optional: true dependencies: - '@radix-ui/primitive': 1.1.1 - '@radix-ui/react-compose-refs': 1.1.1(@types/react@18.3.11)(react@18.3.1) + '@radix-ui/primitive': 1.1.0 + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.11)(react@18.3.1) '@radix-ui/react-context': 1.1.1(@types/react@18.3.11)(react@18.3.1) '@radix-ui/react-id': 1.1.0(@types/react@18.3.11)(react@18.3.1) - '@radix-ui/react-presence': 1.1.2(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) - '@radix-ui/react-primitive': 2.0.1(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-presence': 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.11)(react@18.3.1) '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.11)(react@18.3.1) '@types/react': 18.3.11 @@ -7535,29 +7505,6 @@ packages: react-dom: 18.3.1(react@18.3.1) dev: false - /@radix-ui/react-collection@1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-LwT3pSho9Dljg+wY2KN2mrrh6y3qELfftINERIzBUO9e0N+t0oMTyn3k9iv+ZqgrwGkRnLpNJrsMv9BZlt2yuA==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - dependencies: - '@radix-ui/react-compose-refs': 1.1.1(@types/react@18.3.11)(react@18.3.1) - '@radix-ui/react-context': 1.1.1(@types/react@18.3.11)(react@18.3.1) - '@radix-ui/react-primitive': 2.0.1(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) - '@radix-ui/react-slot': 1.1.1(@types/react@18.3.11)(react@18.3.1) - '@types/react': 18.3.11 - '@types/react-dom': 18.3.0 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - dev: false - /@radix-ui/react-compose-refs@1.0.0(react@18.3.1): resolution: {integrity: sha512-0KaSv6sx787/hK3eF53iOkiSLwAGlFMx5lotrqD2pTjB18KbybKoEIgkNZTKC60YECDQTKGTRcDBILwZVqVKvA==} peerDependencies: @@ -7592,7 +7539,6 @@ packages: dependencies: '@types/react': 18.3.11 react: 18.3.1 - dev: false /@radix-ui/react-compose-refs@1.1.1(@types/react@18.3.11)(react@18.3.1): resolution: {integrity: sha512-Y9VzoRDSJtgFMUCoiZBDVo084VQ5hfpXxVE+NgkdNsjiDBByiImMZKKhxMwCbdHvhlENG6a833CbFkOQvTricw==} @@ -7605,6 +7551,7 @@ packages: dependencies: '@types/react': 18.3.11 react: 18.3.1 + dev: false /@radix-ui/react-context@1.0.0(react@18.3.1): resolution: {integrity: sha512-1pVM9RfOQ+n/N5PJK33kRSKsr1glNxomxONs5c49MliinBY6Yw2Q995qfBUUo0/Mbg05B/sGA0gkgPI7kmSHBg==} @@ -7640,7 +7587,6 @@ packages: dependencies: '@types/react': 18.3.11 react: 18.3.1 - dev: false /@radix-ui/react-context@1.1.1(@types/react@18.3.11)(react@18.3.1): resolution: {integrity: sha512-UASk9zi+crv9WteK/NU4PLvOoL3OuE6BWVKNF6hPRBtYBDXQ2u5iu3O59zUlJiTVvkyuycnqrztsHVJwcK9K+Q==} @@ -7715,6 +7661,38 @@ packages: react-remove-scroll: 2.5.5(@types/react@18.3.11)(react@18.3.1) dev: false + /@radix-ui/react-dialog@1.1.2(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-Yj4dZtqa2o+kG61fzB0H2qUvmwBA2oyQroGLyNtBj1beo1khoQ3q1a2AO8rrQYjd8256CO9+N8L9tvsS+bnIyA==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@radix-ui/primitive': 1.1.0 + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.11)(react@18.3.1) + '@radix-ui/react-context': 1.1.1(@types/react@18.3.11)(react@18.3.1) + '@radix-ui/react-dismissable-layer': 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-focus-guards': 1.1.1(@types/react@18.3.11)(react@18.3.1) + '@radix-ui/react-focus-scope': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-id': 1.1.0(@types/react@18.3.11)(react@18.3.1) + '@radix-ui/react-portal': 1.1.2(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-presence': 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-slot': 1.1.0(@types/react@18.3.11)(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.11)(react@18.3.1) + '@types/react': 18.3.11 + '@types/react-dom': 18.3.0 + aria-hidden: 1.2.4 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + react-remove-scroll: 2.6.0(@types/react@18.3.11)(react@18.3.1) + /@radix-ui/react-dialog@1.1.4(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1): resolution: {integrity: sha512-Ur7EV1IwQGCyaAuyDRiOLA5JIUZxELJljF+MbM/2NC0BYwfuRrbpS30BiQBJrVruscgUkieKkqXYDOoByaxIoA==} peerDependencies: @@ -7746,6 +7724,7 @@ packages: react: 18.3.1 react-dom: 18.3.1(react@18.3.1) react-remove-scroll: 2.6.2(@types/react@18.3.11)(react@18.3.1) + dev: false /@radix-ui/react-direction@1.0.1(@types/react@18.3.11)(react@18.3.1): resolution: {integrity: sha512-RXcvnXgyvYvBEOhCBuddKecVkoMiI10Jcm5cTI7abJRAHYfFxeu+FBQs/DvdxSYucxR5mna0dNsL6QFlds5TMA==} @@ -7864,6 +7843,29 @@ packages: react-dom: 18.3.1(react@18.3.1) dev: false + /@radix-ui/react-dismissable-layer@1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-QSxg29lfr/xcev6kSz7MAlmDnzbP1eI/Dwn3Tp1ip0KT5CUELsxkekFEMVBEoykI3oV39hKT4TKZzBNMbcTZYQ==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@radix-ui/primitive': 1.1.0 + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.11)(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.11)(react@18.3.1) + '@radix-ui/react-use-escape-keydown': 1.1.0(@types/react@18.3.11)(react@18.3.1) + '@types/react': 18.3.11 + '@types/react-dom': 18.3.0 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + /@radix-ui/react-dismissable-layer@1.1.3(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1): resolution: {integrity: sha512-onrWn/72lQoEucDmJnr8uczSNTujT0vJnA/X5+3AkChVPowr8n1yvIKIabhWyMQeMvvmdpsvcyDqx3X1LEXCPg==} peerDependencies: @@ -7886,6 +7888,7 @@ packages: '@types/react-dom': 18.3.0 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) + dev: false /@radix-ui/react-dropdown-menu@2.1.1(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1): resolution: {integrity: sha512-y8E+x9fBq9qvteD2Zwa4397pUVhYsh9iq44b5RD5qu1GMJWBCBuVg1hMyItbc6+zH00TxGRqd9Iot4wzf3OoBQ==} @@ -8018,7 +8021,6 @@ packages: '@types/react-dom': 18.3.0 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - dev: false /@radix-ui/react-focus-scope@1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1): resolution: {integrity: sha512-01omzJAYRxXdG2/he/+xy+c8a8gCydoQ1yOxnWNcRhrrBW5W+RQJ22EK1SaO8tb3WoUsuEw7mJjBozPzihDFjA==} @@ -8040,6 +8042,7 @@ packages: '@types/react-dom': 18.3.0 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) + dev: false /@radix-ui/react-icons@1.3.0(react@18.3.1): resolution: {integrity: sha512-jQxj/0LKgp+j9BiTXz3O3sgs26RNet2iLWmsPyRz2SIcR4q/4SbazXfnYwbAr+vLYKSfc7qxzyGQA1HLlYiuNw==} @@ -8145,8 +8148,8 @@ packages: react-remove-scroll: 2.5.7(@types/react@18.3.11)(react@18.3.1) dev: false - /@radix-ui/react-navigation-menu@1.2.3(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-IQWAsQ7dsLIYDrn0WqPU+cdM7MONTv9nqrLVYoie3BPiabSfUVDe6Fr+oEt0Cofsr9ONDcDe9xhmJbL1Uq1yKg==} + /@radix-ui/react-navigation-menu@1.2.1(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-egDo0yJD2IK8L17gC82vptkvW1jLeni1VuqCyzY727dSJdk5cDjINomouLoNk8RVF7g2aNIfENKWL4UzeU9c8Q==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -8158,20 +8161,20 @@ packages: '@types/react-dom': optional: true dependencies: - '@radix-ui/primitive': 1.1.1 - '@radix-ui/react-collection': 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) - '@radix-ui/react-compose-refs': 1.1.1(@types/react@18.3.11)(react@18.3.1) + '@radix-ui/primitive': 1.1.0 + '@radix-ui/react-collection': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.11)(react@18.3.1) '@radix-ui/react-context': 1.1.1(@types/react@18.3.11)(react@18.3.1) '@radix-ui/react-direction': 1.1.0(@types/react@18.3.11)(react@18.3.1) - '@radix-ui/react-dismissable-layer': 1.1.3(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-dismissable-layer': 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) '@radix-ui/react-id': 1.1.0(@types/react@18.3.11)(react@18.3.1) - '@radix-ui/react-presence': 1.1.2(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) - '@radix-ui/react-primitive': 2.0.1(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-presence': 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.11)(react@18.3.1) '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.11)(react@18.3.1) '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.11)(react@18.3.1) '@radix-ui/react-use-previous': 1.1.0(@types/react@18.3.11)(react@18.3.1) - '@radix-ui/react-visually-hidden': 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-visually-hidden': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) '@types/react': 18.3.11 '@types/react-dom': 18.3.0 react: 18.3.1 @@ -8213,8 +8216,8 @@ packages: react-remove-scroll: 2.5.5(@types/react@18.3.11)(react@18.3.1) dev: false - /@radix-ui/react-popover@1.1.4(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-aUACAkXx8LaFymDma+HQVji7WhvEhpFJ7+qPz17Nf4lLZqtreGOFRiNQWQmhzp7kEWg9cOyyQJpdIMUMPc/CPw==} + /@radix-ui/react-popover@1.1.2(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-u2HRUyWW+lOiA2g0Le0tMmT55FGOEWHwPFt1EPfbLly7uXQExFo5duNKqG2DzmFXIdqOeNd+TpE8baHWJCyP9w==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -8226,25 +8229,25 @@ packages: '@types/react-dom': optional: true dependencies: - '@radix-ui/primitive': 1.1.1 - '@radix-ui/react-compose-refs': 1.1.1(@types/react@18.3.11)(react@18.3.1) + '@radix-ui/primitive': 1.1.0 + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.11)(react@18.3.1) '@radix-ui/react-context': 1.1.1(@types/react@18.3.11)(react@18.3.1) - '@radix-ui/react-dismissable-layer': 1.1.3(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-dismissable-layer': 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) '@radix-ui/react-focus-guards': 1.1.1(@types/react@18.3.11)(react@18.3.1) - '@radix-ui/react-focus-scope': 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-focus-scope': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) '@radix-ui/react-id': 1.1.0(@types/react@18.3.11)(react@18.3.1) - '@radix-ui/react-popper': 1.2.1(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) - '@radix-ui/react-portal': 1.1.3(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) - '@radix-ui/react-presence': 1.1.2(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) - '@radix-ui/react-primitive': 2.0.1(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) - '@radix-ui/react-slot': 1.1.1(@types/react@18.3.11)(react@18.3.1) + '@radix-ui/react-popper': 1.2.0(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-portal': 1.1.2(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-presence': 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-slot': 1.1.0(@types/react@18.3.11)(react@18.3.1) '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.11)(react@18.3.1) '@types/react': 18.3.11 '@types/react-dom': 18.3.0 aria-hidden: 1.2.4 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - react-remove-scroll: 2.6.2(@types/react@18.3.11)(react@18.3.1) + react-remove-scroll: 2.6.0(@types/react@18.3.11)(react@18.3.1) dev: false /@radix-ui/react-popper@1.1.2(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1): @@ -8334,35 +8337,6 @@ packages: '@types/react-dom': 18.3.0 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - dev: false - - /@radix-ui/react-popper@1.2.1(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-3kn5Me69L+jv82EKRuQCXdYyf1DqHwD2U/sxoNgBGCB7K9TRc3bQamQ+5EPM9EvyPdli0W41sROd+ZU1dTCztw==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - dependencies: - '@floating-ui/react-dom': 2.1.2(react-dom@18.3.1)(react@18.3.1) - '@radix-ui/react-arrow': 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) - '@radix-ui/react-compose-refs': 1.1.1(@types/react@18.3.11)(react@18.3.1) - '@radix-ui/react-context': 1.1.1(@types/react@18.3.11)(react@18.3.1) - '@radix-ui/react-primitive': 2.0.1(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) - '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.11)(react@18.3.1) - '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.11)(react@18.3.1) - '@radix-ui/react-use-rect': 1.1.0(@types/react@18.3.11)(react@18.3.1) - '@radix-ui/react-use-size': 1.1.0(@types/react@18.3.11)(react@18.3.1) - '@radix-ui/rect': 1.1.0 - '@types/react': 18.3.11 - '@types/react-dom': 18.3.0 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) /@radix-ui/react-portal@1.0.0(react-dom@18.3.1)(react@18.3.1): resolution: {integrity: sha512-a8qyFO/Xb99d8wQdu4o7qnigNjTPG123uADNecz0eX4usnQEj7o+cG4ZX4zkqq98NYekT7UoEQIjxBNWIFuqTA==} @@ -8439,6 +8413,26 @@ packages: react-dom: 18.3.1(react@18.3.1) dev: false + /@radix-ui/react-portal@1.1.2(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-WeDYLGPxJb/5EGBoedyJbT0MpoULmwnIPMJMSldkuiMsBAv7N1cRdsTWZWht9vpPOiN3qyiGAtbK2is47/uMFg==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.11)(react@18.3.1) + '@types/react': 18.3.11 + '@types/react-dom': 18.3.0 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + /@radix-ui/react-portal@1.1.3(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1): resolution: {integrity: sha512-NciRqhXnGojhT93RPyDaMPfLH3ZSl4jjIFbZQ1b/vxvZEdHsBZ49wP9w8L3HzUQwep01LcWtkUvm0OVB5JAHTw==} peerDependencies: @@ -8458,6 +8452,7 @@ packages: '@types/react-dom': 18.3.0 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) + dev: false /@radix-ui/react-presence@1.0.0(react-dom@18.3.1)(react@18.3.1): resolution: {integrity: sha512-A+6XEvN01NfVWiKu38ybawfHsBjWum42MRPnEuqPsBZ4eV7e/7K321B5VgYMPv3Xx5An6o1/l9ZuDBgmcmWK3w==} @@ -8515,6 +8510,26 @@ packages: react-dom: 18.3.1(react@18.3.1) dev: false + /@radix-ui/react-presence@1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-IeFXVi4YS1K0wVZzXNrbaaUvIJ3qdY+/Ih4eHFhWA9SwGR9UDX7Ck8abvL57C4cv3wwMvUE0OG69Qc3NCcTe/A==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.11)(react@18.3.1) + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.11)(react@18.3.1) + '@types/react': 18.3.11 + '@types/react-dom': 18.3.0 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + /@radix-ui/react-presence@1.1.2(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1): resolution: {integrity: sha512-18TFr80t5EVgL9x1SwF/YGtfG+l0BS0PRAlCWBDoBEiDQjeKgnNZRVJp/oVBl24sr3Gbfwc/Qpj4OcWTQMsAEg==} peerDependencies: @@ -8534,6 +8549,7 @@ packages: '@types/react-dom': 18.3.0 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) + dev: false /@radix-ui/react-primitive@1.0.0(react-dom@18.3.1)(react@18.3.1): resolution: {integrity: sha512-EyXe6mnRlHZ8b6f4ilTDrXmkLShICIuOTTj0GX4w1rp+wSxf3+TD05u1UOITC8VsJ2a9nwHvdXtOXEOl0Cw/zQ==} @@ -8586,7 +8602,6 @@ packages: '@types/react-dom': 18.3.0 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - dev: false /@radix-ui/react-primitive@2.0.1(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1): resolution: {integrity: sha512-sHCWTtxwNn3L3fH8qAfnF3WbUZycW93SM1j3NFDzXBiz8D6F5UTTy8G1+WFEaiCdvCVRJWj6N2R4Xq6HdiHmDg==} @@ -8606,6 +8621,7 @@ packages: '@types/react-dom': 18.3.0 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) + dev: false /@radix-ui/react-progress@1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1): resolution: {integrity: sha512-5G6Om/tYSxjSeEdrb1VfKkfZfn/1IlPWd731h2RfPuSbIfNUgfqAwbKfJCg/PP6nuUCTrYzalwHSpSinoWoCag==} @@ -8686,34 +8702,6 @@ packages: react-dom: 18.3.1(react@18.3.1) dev: false - /@radix-ui/react-roving-focus@1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-QE1RoxPGJ/Nm8Qmk0PxP8ojmoaS67i0s7hVssS7KuI2FQoc/uzVlZsqKfQvxPE6D8hICCPHJ4D88zNhT3OOmkw==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - dependencies: - '@radix-ui/primitive': 1.1.1 - '@radix-ui/react-collection': 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) - '@radix-ui/react-compose-refs': 1.1.1(@types/react@18.3.11)(react@18.3.1) - '@radix-ui/react-context': 1.1.1(@types/react@18.3.11)(react@18.3.1) - '@radix-ui/react-direction': 1.1.0(@types/react@18.3.11)(react@18.3.1) - '@radix-ui/react-id': 1.1.0(@types/react@18.3.11)(react@18.3.1) - '@radix-ui/react-primitive': 2.0.1(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) - '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.11)(react@18.3.1) - '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.11)(react@18.3.1) - '@types/react': 18.3.11 - '@types/react-dom': 18.3.0 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - dev: false - /@radix-ui/react-scroll-area@1.0.5(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1): resolution: {integrity: sha512-b6PAgH4GQf9QEn8zbT2XUHpW5z8BzqEc7Kl11TwDrvuTrxlkcjTD5qa/bxgKr+nmuXKu4L/W5UZ4mlP/VG/5Gw==} peerDependencies: @@ -8743,8 +8731,8 @@ packages: react-dom: 18.3.1(react@18.3.1) dev: false - /@radix-ui/react-scroll-area@1.2.2(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-EFI1N/S3YxZEW/lJ/H1jY3njlvTd8tBmgKEn4GHi51+aMm94i6NmAJstsm5cu3yJwYqYc93gpCPm21FeAbFk6g==} + /@radix-ui/react-scroll-area@1.2.1(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-FnM1fHfCtEZ1JkyfH/1oMiTcFBQvHKl4vD9WnpwkLgtF+UmnXMCad6ECPTaAjcDjam+ndOEJWgHyKDGNteWSHw==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -8757,12 +8745,12 @@ packages: optional: true dependencies: '@radix-ui/number': 1.1.0 - '@radix-ui/primitive': 1.1.1 - '@radix-ui/react-compose-refs': 1.1.1(@types/react@18.3.11)(react@18.3.1) + '@radix-ui/primitive': 1.1.0 + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.11)(react@18.3.1) '@radix-ui/react-context': 1.1.1(@types/react@18.3.11)(react@18.3.1) '@radix-ui/react-direction': 1.1.0(@types/react@18.3.11)(react@18.3.1) - '@radix-ui/react-presence': 1.1.2(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) - '@radix-ui/react-primitive': 2.0.1(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-presence': 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.11)(react@18.3.1) '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.11)(react@18.3.1) '@types/react': 18.3.11 @@ -8812,8 +8800,8 @@ packages: react-remove-scroll: 2.5.5(@types/react@18.3.11)(react@18.3.1) dev: false - /@radix-ui/react-select@2.1.4(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-pOkb2u8KgO47j/h7AylCj7dJsm69BXcjkrvTqMptFqsE2i0p8lHkfgneXKjAgPzBMivnoMyt8o4KiV4wYzDdyQ==} + /@radix-ui/react-select@2.1.2(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-rZJtWmorC7dFRi0owDmoijm6nSJH1tVw64QGiNIZ9PNLyBDtG+iAq+XGsya052At4BfarzY/Dhv9wrrUr6IMZA==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -8826,30 +8814,30 @@ packages: optional: true dependencies: '@radix-ui/number': 1.1.0 - '@radix-ui/primitive': 1.1.1 - '@radix-ui/react-collection': 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) - '@radix-ui/react-compose-refs': 1.1.1(@types/react@18.3.11)(react@18.3.1) + '@radix-ui/primitive': 1.1.0 + '@radix-ui/react-collection': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.11)(react@18.3.1) '@radix-ui/react-context': 1.1.1(@types/react@18.3.11)(react@18.3.1) '@radix-ui/react-direction': 1.1.0(@types/react@18.3.11)(react@18.3.1) - '@radix-ui/react-dismissable-layer': 1.1.3(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-dismissable-layer': 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) '@radix-ui/react-focus-guards': 1.1.1(@types/react@18.3.11)(react@18.3.1) - '@radix-ui/react-focus-scope': 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-focus-scope': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) '@radix-ui/react-id': 1.1.0(@types/react@18.3.11)(react@18.3.1) - '@radix-ui/react-popper': 1.2.1(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) - '@radix-ui/react-portal': 1.1.3(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) - '@radix-ui/react-primitive': 2.0.1(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) - '@radix-ui/react-slot': 1.1.1(@types/react@18.3.11)(react@18.3.1) + '@radix-ui/react-popper': 1.2.0(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-portal': 1.1.2(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-slot': 1.1.0(@types/react@18.3.11)(react@18.3.1) '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.11)(react@18.3.1) '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.11)(react@18.3.1) '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.11)(react@18.3.1) '@radix-ui/react-use-previous': 1.1.0(@types/react@18.3.11)(react@18.3.1) - '@radix-ui/react-visually-hidden': 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-visually-hidden': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) '@types/react': 18.3.11 '@types/react-dom': 18.3.0 aria-hidden: 1.2.4 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - react-remove-scroll: 2.6.2(@types/react@18.3.11)(react@18.3.1) + react-remove-scroll: 2.6.0(@types/react@18.3.11)(react@18.3.1) dev: false /@radix-ui/react-separator@1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1): @@ -8941,7 +8929,6 @@ packages: '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.11)(react@18.3.1) '@types/react': 18.3.11 react: 18.3.1 - dev: false /@radix-ui/react-slot@1.1.1(@types/react@18.3.11)(react@18.3.1): resolution: {integrity: sha512-RApLLOcINYJA+dMVbOju7MYv1Mb2EBp2nH4HdDzXTSyaR5optlm6Otrz1euW3HbdOR8UmmFK06TD+A9frYWv+g==} @@ -8955,6 +8942,7 @@ packages: '@radix-ui/react-compose-refs': 1.1.1(@types/react@18.3.11)(react@18.3.1) '@types/react': 18.3.11 react: 18.3.1 + dev: false /@radix-ui/react-switch@1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1): resolution: {integrity: sha512-mxm87F88HyHztsI7N+ZUmEoARGkC22YVW5CaC+Byc+HRpuvCrOBPTAnXgf+tZ/7i0Sg/eOePGdMhUKhPaQEqow==} @@ -9010,8 +8998,8 @@ packages: react-dom: 18.3.1(react@18.3.1) dev: false - /@radix-ui/react-tabs@1.1.2(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-9u/tQJMcC2aGq7KXpGivMm1mgq7oRJKXphDwdypPd/j21j/2znamPU8WkXgnhUaTrSFNIt8XhOyCAupg8/GbwQ==} + /@radix-ui/react-tabs@1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-3GBUDmP2DvzmtYLMsHmpA1GtR46ZDZ+OreXM/N+kkQJOPIgytFWWTfDQmBQKBvaFS0Vno0FktdbVzN28KGrMdw==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -9023,13 +9011,13 @@ packages: '@types/react-dom': optional: true dependencies: - '@radix-ui/primitive': 1.1.1 + '@radix-ui/primitive': 1.1.0 '@radix-ui/react-context': 1.1.1(@types/react@18.3.11)(react@18.3.1) '@radix-ui/react-direction': 1.1.0(@types/react@18.3.11)(react@18.3.1) '@radix-ui/react-id': 1.1.0(@types/react@18.3.11)(react@18.3.1) - '@radix-ui/react-presence': 1.1.2(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) - '@radix-ui/react-primitive': 2.0.1(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) - '@radix-ui/react-roving-focus': 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-presence': 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-roving-focus': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.11)(react@18.3.1) '@types/react': 18.3.11 '@types/react-dom': 18.3.0 @@ -9182,8 +9170,8 @@ packages: react-dom: 18.3.1(react@18.3.1) dev: false - /@radix-ui/react-tooltip@1.1.6(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-TLB5D8QLExS1uDn7+wH/bjEmRurNMTzNrtq7IjaS4kjion9NtzsTGkvR5+i7yc9q01Pi2KMM2cN3f8UG4IvvXA==} + /@radix-ui/react-tooltip@1.1.4(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-QpObUH/ZlpaO4YgHSaYzrLO2VuO+ZBFFgGzjMUPwtiYnAzzNNDPJeEGRrT7qNOrWm/Jr08M1vlp+vTHtnSQ0Uw==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -9195,18 +9183,18 @@ packages: '@types/react-dom': optional: true dependencies: - '@radix-ui/primitive': 1.1.1 - '@radix-ui/react-compose-refs': 1.1.1(@types/react@18.3.11)(react@18.3.1) + '@radix-ui/primitive': 1.1.0 + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.11)(react@18.3.1) '@radix-ui/react-context': 1.1.1(@types/react@18.3.11)(react@18.3.1) - '@radix-ui/react-dismissable-layer': 1.1.3(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-dismissable-layer': 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) '@radix-ui/react-id': 1.1.0(@types/react@18.3.11)(react@18.3.1) - '@radix-ui/react-popper': 1.2.1(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) - '@radix-ui/react-portal': 1.1.3(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) - '@radix-ui/react-presence': 1.1.2(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) - '@radix-ui/react-primitive': 2.0.1(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) - '@radix-ui/react-slot': 1.1.1(@types/react@18.3.11)(react@18.3.1) + '@radix-ui/react-popper': 1.2.0(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-portal': 1.1.2(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-presence': 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-slot': 1.1.0(@types/react@18.3.11)(react@18.3.1) '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.11)(react@18.3.1) - '@radix-ui/react-visually-hidden': 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-visually-hidden': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) dev: true @@ -9479,26 +9467,6 @@ packages: '@types/react-dom': 18.3.0 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - dev: false - - /@radix-ui/react-visually-hidden@1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-vVfA2IZ9q/J+gEamvj761Oq1FpWgCDaNOOIfbPVp2MVPLEomUr5+Vf7kJGwQ24YxZSlQVar7Bes8kyTo5Dshpg==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - dependencies: - '@radix-ui/react-primitive': 2.0.1(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) - '@types/react': 18.3.11 - '@types/react-dom': 18.3.0 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) /@radix-ui/rect@1.0.1: resolution: {integrity: sha512-fyrgCaedtvMg9NK3en0pnOYJdtfwxUcNolezkNPUsoX57X8oQk+NkqcvzHXD2uKNij6GXmWU9NDru2IWjrO4BQ==} @@ -9773,8 +9741,8 @@ packages: react: 18.3.1 dev: true - /@rollup/pluginutils@5.1.4: - resolution: {integrity: sha512-USm05zrsFxYLPdWWq+K3STlWiT/3ELn3RcV5hJMghpeAIhxfsUIg6mt12CBJBInWMV4VneoV7SfGv8xIwo2qNQ==} + /@rollup/pluginutils@5.1.3: + resolution: {integrity: sha512-Pnsb6f32CD2W3uCaLZIzDmeFyQ2b8UWMFI7xtwUezpcGBDVDW6y9XgAWIlARiGAo6eNF5FK5aQTr0LFyNyqq5A==} engines: {node: '>=14.0.0'} peerDependencies: rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 @@ -9787,151 +9755,151 @@ packages: picomatch: 4.0.2 dev: true - /@rollup/rollup-android-arm-eabi@4.29.1: - resolution: {integrity: sha512-ssKhA8RNltTZLpG6/QNkCSge+7mBQGUqJRisZ2MDQcEGaK93QESEgWK2iOpIDZ7k9zPVkG5AS3ksvD5ZWxmItw==} + /@rollup/rollup-android-arm-eabi@4.28.1: + resolution: {integrity: sha512-2aZp8AES04KI2dy3Ss6/MDjXbwBzj+i0GqKtWXgw2/Ma6E4jJvujryO6gJAghIRVz7Vwr9Gtl/8na3nDUKpraQ==} cpu: [arm] os: [android] requiresBuild: true dev: true optional: true - /@rollup/rollup-android-arm64@4.29.1: - resolution: {integrity: sha512-CaRfrV0cd+NIIcVVN/jx+hVLN+VRqnuzLRmfmlzpOzB87ajixsN/+9L5xNmkaUUvEbI5BmIKS+XTwXsHEb65Ew==} + /@rollup/rollup-android-arm64@4.28.1: + resolution: {integrity: sha512-EbkK285O+1YMrg57xVA+Dp0tDBRB93/BZKph9XhMjezf6F4TpYjaUSuPt5J0fZXlSag0LmZAsTmdGGqPp4pQFA==} cpu: [arm64] os: [android] requiresBuild: true dev: true optional: true - /@rollup/rollup-darwin-arm64@4.29.1: - resolution: {integrity: sha512-2ORr7T31Y0Mnk6qNuwtyNmy14MunTAMx06VAPI6/Ju52W10zk1i7i5U3vlDRWjhOI5quBcrvhkCHyF76bI7kEw==} + /@rollup/rollup-darwin-arm64@4.28.1: + resolution: {integrity: sha512-prduvrMKU6NzMq6nxzQw445zXgaDBbMQvmKSJaxpaZ5R1QDM8w+eGxo6Y/jhT/cLoCvnZI42oEqf9KQNYz1fqQ==} cpu: [arm64] os: [darwin] requiresBuild: true optional: true - /@rollup/rollup-darwin-x64@4.29.1: - resolution: {integrity: sha512-j/Ej1oanzPjmN0tirRd5K2/nncAhS9W6ICzgxV+9Y5ZsP0hiGhHJXZ2JQ53iSSjj8m6cRY6oB1GMzNn2EUt6Ng==} + /@rollup/rollup-darwin-x64@4.28.1: + resolution: {integrity: sha512-WsvbOunsUk0wccO/TV4o7IKgloJ942hVFK1CLatwv6TJspcCZb9umQkPdvB7FihmdxgaKR5JyxDjWpCOp4uZlQ==} cpu: [x64] os: [darwin] requiresBuild: true dev: true optional: true - /@rollup/rollup-freebsd-arm64@4.29.1: - resolution: {integrity: sha512-91C//G6Dm/cv724tpt7nTyP+JdN12iqeXGFM1SqnljCmi5yTXriH7B1r8AD9dAZByHpKAumqP1Qy2vVNIdLZqw==} + /@rollup/rollup-freebsd-arm64@4.28.1: + resolution: {integrity: sha512-HTDPdY1caUcU4qK23FeeGxCdJF64cKkqajU0iBnTVxS8F7H/7BewvYoG+va1KPSL63kQ1PGNyiwKOfReavzvNA==} cpu: [arm64] os: [freebsd] requiresBuild: true dev: true optional: true - /@rollup/rollup-freebsd-x64@4.29.1: - resolution: {integrity: sha512-hEioiEQ9Dec2nIRoeHUP6hr1PSkXzQaCUyqBDQ9I9ik4gCXQZjJMIVzoNLBRGet+hIUb3CISMh9KXuCcWVW/8w==} + /@rollup/rollup-freebsd-x64@4.28.1: + resolution: {integrity: sha512-m/uYasxkUevcFTeRSM9TeLyPe2QDuqtjkeoTpP9SW0XxUWfcYrGDMkO/m2tTw+4NMAF9P2fU3Mw4ahNvo7QmsQ==} cpu: [x64] os: [freebsd] requiresBuild: true dev: true optional: true - /@rollup/rollup-linux-arm-gnueabihf@4.29.1: - resolution: {integrity: sha512-Py5vFd5HWYN9zxBv3WMrLAXY3yYJ6Q/aVERoeUFwiDGiMOWsMs7FokXihSOaT/PMWUty/Pj60XDQndK3eAfE6A==} + /@rollup/rollup-linux-arm-gnueabihf@4.28.1: + resolution: {integrity: sha512-QAg11ZIt6mcmzpNE6JZBpKfJaKkqTm1A9+y9O+frdZJEuhQxiugM05gnCWiANHj4RmbgeVJpTdmKRmH/a+0QbA==} cpu: [arm] os: [linux] requiresBuild: true dev: true optional: true - /@rollup/rollup-linux-arm-musleabihf@4.29.1: - resolution: {integrity: sha512-RiWpGgbayf7LUcuSNIbahr0ys2YnEERD4gYdISA06wa0i8RALrnzflh9Wxii7zQJEB2/Eh74dX4y/sHKLWp5uQ==} + /@rollup/rollup-linux-arm-musleabihf@4.28.1: + resolution: {integrity: sha512-dRP9PEBfolq1dmMcFqbEPSd9VlRuVWEGSmbxVEfiq2cs2jlZAl0YNxFzAQS2OrQmsLBLAATDMb3Z6MFv5vOcXg==} cpu: [arm] os: [linux] requiresBuild: true dev: true optional: true - /@rollup/rollup-linux-arm64-gnu@4.29.1: - resolution: {integrity: sha512-Z80O+taYxTQITWMjm/YqNoe9d10OX6kDh8X5/rFCMuPqsKsSyDilvfg+vd3iXIqtfmp+cnfL1UrYirkaF8SBZA==} + /@rollup/rollup-linux-arm64-gnu@4.28.1: + resolution: {integrity: sha512-uGr8khxO+CKT4XU8ZUH1TTEUtlktK6Kgtv0+6bIFSeiSlnGJHG1tSFSjm41uQ9sAO/5ULx9mWOz70jYLyv1QkA==} cpu: [arm64] os: [linux] requiresBuild: true dev: true optional: true - /@rollup/rollup-linux-arm64-musl@4.29.1: - resolution: {integrity: sha512-fOHRtF9gahwJk3QVp01a/GqS4hBEZCV1oKglVVq13kcK3NeVlS4BwIFzOHDbmKzt3i0OuHG4zfRP0YoG5OF/rA==} + /@rollup/rollup-linux-arm64-musl@4.28.1: + resolution: {integrity: sha512-QF54q8MYGAqMLrX2t7tNpi01nvq5RI59UBNx+3+37zoKX5KViPo/gk2QLhsuqok05sSCRluj0D00LzCwBikb0A==} cpu: [arm64] os: [linux] requiresBuild: true dev: true optional: true - /@rollup/rollup-linux-loongarch64-gnu@4.29.1: - resolution: {integrity: sha512-5a7q3tnlbcg0OodyxcAdrrCxFi0DgXJSoOuidFUzHZ2GixZXQs6Tc3CHmlvqKAmOs5eRde+JJxeIf9DonkmYkw==} + /@rollup/rollup-linux-loongarch64-gnu@4.28.1: + resolution: {integrity: sha512-vPul4uodvWvLhRco2w0GcyZcdyBfpfDRgNKU+p35AWEbJ/HPs1tOUrkSueVbBS0RQHAf/A+nNtDpvw95PeVKOA==} cpu: [loong64] os: [linux] requiresBuild: true dev: true optional: true - /@rollup/rollup-linux-powerpc64le-gnu@4.29.1: - resolution: {integrity: sha512-9b4Mg5Yfz6mRnlSPIdROcfw1BU22FQxmfjlp/CShWwO3LilKQuMISMTtAu/bxmmrE6A902W2cZJuzx8+gJ8e9w==} + /@rollup/rollup-linux-powerpc64le-gnu@4.28.1: + resolution: {integrity: sha512-pTnTdBuC2+pt1Rmm2SV7JWRqzhYpEILML4PKODqLz+C7Ou2apEV52h19CR7es+u04KlqplggmN9sqZlekg3R1A==} cpu: [ppc64] os: [linux] requiresBuild: true dev: true optional: true - /@rollup/rollup-linux-riscv64-gnu@4.29.1: - resolution: {integrity: sha512-G5pn0NChlbRM8OJWpJFMX4/i8OEU538uiSv0P6roZcbpe/WfhEO+AT8SHVKfp8qhDQzaz7Q+1/ixMy7hBRidnQ==} + /@rollup/rollup-linux-riscv64-gnu@4.28.1: + resolution: {integrity: sha512-vWXy1Nfg7TPBSuAncfInmAI/WZDd5vOklyLJDdIRKABcZWojNDY0NJwruY2AcnCLnRJKSaBgf/GiJfauu8cQZA==} cpu: [riscv64] os: [linux] requiresBuild: true dev: true optional: true - /@rollup/rollup-linux-s390x-gnu@4.29.1: - resolution: {integrity: sha512-WM9lIkNdkhVwiArmLxFXpWndFGuOka4oJOZh8EP3Vb8q5lzdSCBuhjavJsw68Q9AKDGeOOIHYzYm4ZFvmWez5g==} + /@rollup/rollup-linux-s390x-gnu@4.28.1: + resolution: {integrity: sha512-/yqC2Y53oZjb0yz8PVuGOQQNOTwxcizudunl/tFs1aLvObTclTwZ0JhXF2XcPT/zuaymemCDSuuUPXJJyqeDOg==} cpu: [s390x] os: [linux] requiresBuild: true dev: true optional: true - /@rollup/rollup-linux-x64-gnu@4.29.1: - resolution: {integrity: sha512-87xYCwb0cPGZFoGiErT1eDcssByaLX4fc0z2nRM6eMtV9njAfEE6OW3UniAoDhX4Iq5xQVpE6qO9aJbCFumKYQ==} + /@rollup/rollup-linux-x64-gnu@4.28.1: + resolution: {integrity: sha512-fzgeABz7rrAlKYB0y2kSEiURrI0691CSL0+KXwKwhxvj92VULEDQLpBYLHpF49MSiPG4sq5CK3qHMnb9tlCjBw==} cpu: [x64] os: [linux] requiresBuild: true dev: true optional: true - /@rollup/rollup-linux-x64-musl@4.29.1: - resolution: {integrity: sha512-xufkSNppNOdVRCEC4WKvlR1FBDyqCSCpQeMMgv9ZyXqqtKBfkw1yfGMTUTs9Qsl6WQbJnsGboWCp7pJGkeMhKA==} + /@rollup/rollup-linux-x64-musl@4.28.1: + resolution: {integrity: sha512-xQTDVzSGiMlSshpJCtudbWyRfLaNiVPXt1WgdWTwWz9n0U12cI2ZVtWe/Jgwyv/6wjL7b66uu61Vg0POWVfz4g==} cpu: [x64] os: [linux] requiresBuild: true dev: true optional: true - /@rollup/rollup-win32-arm64-msvc@4.29.1: - resolution: {integrity: sha512-F2OiJ42m77lSkizZQLuC+jiZ2cgueWQL5YC9tjo3AgaEw+KJmVxHGSyQfDUoYR9cci0lAywv2Clmckzulcq6ig==} + /@rollup/rollup-win32-arm64-msvc@4.28.1: + resolution: {integrity: sha512-wSXmDRVupJstFP7elGMgv+2HqXelQhuNf+IS4V+nUpNVi/GUiBgDmfwD0UGN3pcAnWsgKG3I52wMOBnk1VHr/A==} cpu: [arm64] os: [win32] requiresBuild: true dev: true optional: true - /@rollup/rollup-win32-ia32-msvc@4.29.1: - resolution: {integrity: sha512-rYRe5S0FcjlOBZQHgbTKNrqxCBUmgDJem/VQTCcTnA2KCabYSWQDrytOzX7avb79cAAweNmMUb/Zw18RNd4mng==} + /@rollup/rollup-win32-ia32-msvc@4.28.1: + resolution: {integrity: sha512-ZkyTJ/9vkgrE/Rk9vhMXhf8l9D+eAhbAVbsGsXKy2ohmJaWg0LPQLnIxRdRp/bKyr8tXuPlXhIoGlEB5XpJnGA==} cpu: [ia32] os: [win32] requiresBuild: true dev: true optional: true - /@rollup/rollup-win32-x64-msvc@4.29.1: - resolution: {integrity: sha512-+10CMg9vt1MoHj6x1pxyjPSMjHTIlqs8/tBztXvPAx24SKs9jwVnKqHJumlH/IzhaPUaj3T6T6wfZr8okdXaIg==} + /@rollup/rollup-win32-x64-msvc@4.28.1: + resolution: {integrity: sha512-ZvK2jBafvttJjoIdKm/Q/Bh7IJ1Ose9IBOwpOXcOvW3ikGTQGmKDgxTC6oCAzW6PynbkKP8+um1du81XJHZ0JA==} cpu: [x64] os: [win32] requiresBuild: true @@ -9954,68 +9922,56 @@ packages: '@types/hast': 3.0.4 dev: false - /@shikijs/core@1.25.1: - resolution: {integrity: sha512-0j5k3ZkLTQViOuNzPVyWGoW1zgH3kiFdUT/JOCkTm7TU74mz+dF+NID+YoiCBzHQxgsDpcGYPjKDJRcuVLSt4A==} + /@shikijs/core@1.24.2: + resolution: {integrity: sha512-BpbNUSKIwbKrRRA+BQj0BEWSw+8kOPKDJevWeSE/xIqGX7K0xrCZQ9kK0nnEQyrzsUoka1l81ZtJ2mGaCA32HQ==} dependencies: - '@shikijs/engine-javascript': 1.25.1 - '@shikijs/engine-oniguruma': 1.25.1 - '@shikijs/types': 1.25.1 + '@shikijs/engine-javascript': 1.24.2 + '@shikijs/engine-oniguruma': 1.24.2 + '@shikijs/types': 1.24.2 '@shikijs/vscode-textmate': 9.3.1 '@types/hast': 3.0.4 - hast-util-to-html: 9.0.4 + hast-util-to-html: 9.0.3 dev: false - /@shikijs/engine-javascript@1.25.1: - resolution: {integrity: sha512-zQ7UWKnRCfD/Q1M+XOSyjsbhpE0qv8LUnmn82HYCeOsgAHgUZGEDIQ63bbuK3kU5sQg+2CtI+dPfOqD/mjSY9w==} + /@shikijs/engine-javascript@1.24.2: + resolution: {integrity: sha512-EqsmYBJdLEwEiO4H+oExz34a5GhhnVp+jH9Q/XjPjmBPc6TE/x4/gD0X3i0EbkKKNqXYHHJTJUpOLRQNkEzS9Q==} dependencies: - '@shikijs/types': 1.25.1 + '@shikijs/types': 1.24.2 '@shikijs/vscode-textmate': 9.3.1 - oniguruma-to-es: 0.10.0 + oniguruma-to-es: 0.7.0 dev: false - /@shikijs/engine-oniguruma@1.25.1: - resolution: {integrity: sha512-iKPMh3H+0USHtWfZ1irfMTH6tGmIUFSnqt3E2K8BgI1VEsqiPh0RYkG2WTwzNiM1/WHN4FzYx/nrKR7PDHiRyw==} + /@shikijs/engine-oniguruma@1.24.2: + resolution: {integrity: sha512-ZN6k//aDNWRJs1uKB12pturKHh7GejKugowOFGAuG7TxDRLod1Bd5JhpOikOiFqPmKjKEPtEA6mRCf7q3ulDyQ==} dependencies: - '@shikijs/types': 1.25.1 + '@shikijs/types': 1.24.2 '@shikijs/vscode-textmate': 9.3.1 dev: false - /@shikijs/langs@1.25.1: - resolution: {integrity: sha512-hdYjq9aRJplAzGe2qF51PR9IDgEoyGb4IkXvr3Ts6lEdg4Z8M/kdknKRo2EIuv3IR/aKkJXTlBQRM+wr3t20Ew==} + /@shikijs/rehype@1.24.2: + resolution: {integrity: sha512-G4Ks9y2FKwiIrRMIi3GGauyar2F05Ww9e4fbbzE/n2hTBGIcZ2e6KGlBNkDwNvVOGyyAsCpwHQFBMYgd30ZQ3Q==} dependencies: - '@shikijs/types': 1.25.1 - dev: false - - /@shikijs/rehype@1.25.1: - resolution: {integrity: sha512-+cW7ypA8YkHKvFV76GucVp9l7oFNzWvdit+HeH6o/5kl4Ejlv+9B66+HbNBlRDpy2Y+aKEVVxEsVXxv79Wq5Fw==} - dependencies: - '@shikijs/types': 1.25.1 + '@shikijs/types': 1.24.2 '@types/hast': 3.0.4 hast-util-to-string: 3.0.1 - shiki: 1.25.1 + shiki: 1.24.2 unified: 11.0.5 unist-util-visit: 5.0.0 dev: false - /@shikijs/themes@1.25.1: - resolution: {integrity: sha512-JO0lDn4LgGqg5QKvgich5ScUmC2okK+LxM9a3iLUH7YMeI2c8UGXThuJv6sZduS7pdJbYQHPrvWq9t/V4GhpbQ==} - dependencies: - '@shikijs/types': 1.25.1 - dev: false - - /@shikijs/twoslash@1.25.1(typescript@5.5.4): - resolution: {integrity: sha512-nLfPRX4dsqZKJF0Lq+QKl1eyKRk5pBdRDwORozcv1q1F8OVOS5I8Rb3GoWd9BVv/nrWcpxg4rBT59JJ3MrqXDQ==} + /@shikijs/twoslash@1.24.2(typescript@5.5.4): + resolution: {integrity: sha512-zcwYUNdSQDKquF1t+XrtoXM+lx9rCldAkZnT+e5fULKlLT6F8/F9fwICGhBm9lWp5/U4NptH+YcJUdvFOR0SRg==} dependencies: - '@shikijs/core': 1.25.1 - '@shikijs/types': 1.25.1 + '@shikijs/core': 1.24.2 + '@shikijs/types': 1.24.2 twoslash: 0.2.12(typescript@5.5.4) transitivePeerDependencies: - supports-color - typescript dev: false - /@shikijs/types@1.25.1: - resolution: {integrity: sha512-dceqFUoO95eY4tpOj3OGq8wE8EgJ4ey6Me1HQEu5UbwIYszFndEll/bjlB8Kp9wl4fx3uM7n4+y9XCYuDBmcXA==} + /@shikijs/types@1.24.2: + resolution: {integrity: sha512-bdeWZiDtajGLG9BudI0AHet0b6e7FbR0EsE4jpGaI0YwHm/XJunI9+3uZnzFtX65gsyJ6ngCIWUfA4NWRPnBkQ==} dependencies: '@shikijs/vscode-textmate': 9.3.1 '@types/hast': 3.0.4 @@ -10354,8 +10310,8 @@ packages: /@team-plain/typescript-sdk@2.19.0: resolution: {integrity: sha512-BloaZrzHLS2jfgdM9Q/wvpmkHw8ZoVCNaq3z5YsR8NOgbDuVNdzmAUzGqMDmdCRiZ5xbD8CUILHxap1AAJrY5A==} dependencies: - '@graphql-typed-document-node/core': 3.2.0(graphql@16.10.0) - graphql: 16.10.0 + '@graphql-typed-document-node/core': 3.2.0(graphql@16.9.0) + graphql: 16.9.0 zod: 3.23.8 dev: false @@ -10422,7 +10378,7 @@ packages: '@opentelemetry/api-logs': 0.52.1 '@opentelemetry/semantic-conventions': 1.13.0 '@trigger.dev/core': 3.3.1 - chalk: 5.4.1 + chalk: 5.3.0 cronstrue: 2.52.0 debug: 4.4.0(supports-color@8.1.1) evt: 2.5.8 @@ -10448,7 +10404,7 @@ packages: '@opentelemetry/api-logs': 0.52.1 '@opentelemetry/semantic-conventions': 1.13.0 '@trigger.dev/core': 3.3.1 - chalk: 5.4.1 + chalk: 5.3.0 cronstrue: 2.52.0 debug: 4.4.0(supports-color@8.1.1) evt: 2.5.8 @@ -10860,8 +10816,8 @@ packages: resolution: {integrity: sha512-vmYJF0REqDyyU0gviezF/KHq/fYaUbFhkcNbQCuPGFQj6VTbXuHZoxs/Y7mutWe73C8AC6l9fFu8mSYiBAqkGA==} dev: false - /@types/node@18.19.69: - resolution: {integrity: sha512-ECPdY1nlaiO/Y6GUnwgtAAhLNaQ53AyIVz+eILxpEo5OvuqE6yWkqWBIb5dU0DqhKQtMeny+FBD3PK6lm7L5xQ==} + /@types/node@18.19.68: + resolution: {integrity: sha512-QGtpFH1vB99ZmTa63K4/FU8twThj4fuVSBkGddTp7uIL/cuoLWIUSL2RcOaigBhfR+hg5pgGkBnkoOxrTVBMKw==} dependencies: undici-types: 5.26.5 dev: true @@ -10871,8 +10827,8 @@ packages: dependencies: undici-types: 5.26.5 - /@types/node@22.10.3: - resolution: {integrity: sha512-DifAyw4BkrufCILvD3ucnuN8eydUfc/C1GlyrnI+LK6543w5/L3VeVgf05o3B4fqSXP1dKYLOZsKfutpxPzZrw==} + /@types/node@22.10.2: + resolution: {integrity: sha512-Xxr6BBRCAOQixvonOye19wnzyDiUtTeqldOOmj3CkeblonbccA12PFwlufvRdrpjXxqnmUaeiU5EOA+7s5diUQ==} dependencies: undici-types: 6.20.0 dev: true @@ -10985,7 +10941,7 @@ packages: /@types/ssh2@1.15.1: resolution: {integrity: sha512-ZIbEqKAsi5gj35y4P4vkJYly642wIbY6PqoN0xiyQGshKUGXR9WQjF/iF9mXBQ8uBKy3ezfsCkcoHKhd0BzuDA==} dependencies: - '@types/node': 18.19.69 + '@types/node': 18.19.68 dev: true /@types/statuses@2.0.5: @@ -11303,7 +11259,7 @@ packages: /@vitest/snapshot@1.5.3: resolution: {integrity: sha512-K3mvIsjyKYBhNIDujMD2gfQEzddLe51nNOAf45yKRt/QFJcUIeTQd2trRvv6M6oCBHNVnZwFWbQ4yj96ibiDsA==} dependencies: - magic-string: 0.30.17 + magic-string: 0.30.15 pathe: 1.1.2 pretty-format: 29.7.0 dev: true @@ -11311,7 +11267,7 @@ packages: /@vitest/snapshot@1.6.0: resolution: {integrity: sha512-+Hx43f8Chus+DCmygqqfetcAZrDJwvTj0ymqjQq4CvmpKFSTVteEOBzCusu1x2tt4OJcvBflyHUE0DZSLgEMtQ==} dependencies: - magic-string: 0.30.17 + magic-string: 0.30.15 pathe: 1.1.2 pretty-format: 29.7.0 dev: true @@ -11381,7 +11337,7 @@ packages: '@vue/compiler-ssr': 3.5.13 '@vue/shared': 3.5.13 estree-walker: 2.0.2 - magic-string: 0.30.17 + magic-string: 0.30.15 postcss: 8.4.49 source-map-js: 1.2.1 dev: false @@ -11641,7 +11597,7 @@ packages: indent-string: 5.0.0 dev: true - /ai@3.4.7(react@18.3.1)(svelte@5.16.0)(vue@3.5.13)(zod@3.23.8): + /ai@3.4.7(react@18.3.1)(svelte@5.11.2)(vue@3.5.13)(zod@3.23.8): resolution: {integrity: sha512-SutkVjFE86+xNql7fJERJkSEwpILEuiQvCoogJef6ZX/PGHvu3yepwHwVwedgABXe9SudOIKN48EQESrXX/xCw==} engines: {node: '>=18'} peerDependencies: @@ -11666,7 +11622,7 @@ packages: '@ai-sdk/provider-utils': 1.0.20(zod@3.23.8) '@ai-sdk/react': 0.0.62(react@18.3.1)(zod@3.23.8) '@ai-sdk/solid': 0.0.49(zod@3.23.8) - '@ai-sdk/svelte': 0.0.51(svelte@5.16.0)(zod@3.23.8) + '@ai-sdk/svelte': 0.0.51(svelte@5.11.2)(zod@3.23.8) '@ai-sdk/ui-utils': 0.0.46(zod@3.23.8) '@ai-sdk/vue': 0.0.53(vue@3.5.13)(zod@3.23.8) '@opentelemetry/api': 1.4.1 @@ -11676,7 +11632,7 @@ packages: nanoid: 3.3.6 react: 18.3.1 secure-json-parse: 2.7.0 - svelte: 5.16.0 + svelte: 5.11.2 zod: 3.23.8 zod-to-json-schema: 3.23.2(zod@3.23.8) transitivePeerDependencies: @@ -11704,6 +11660,7 @@ packages: optional: true dependencies: ajv: 8.17.1 + dev: true /ajv-formats@3.0.1(ajv@8.17.1): resolution: {integrity: sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==} @@ -11724,15 +11681,6 @@ packages: ajv: 6.12.6 dev: false - /ajv-keywords@5.1.0(ajv@8.17.1): - resolution: {integrity: sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==} - peerDependencies: - ajv: ^8.8.2 - dependencies: - ajv: 8.17.1 - fast-deep-equal: 3.1.3 - dev: false - /ajv@6.12.6: resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} dependencies: @@ -11749,6 +11697,7 @@ packages: fast-uri: 3.0.3 json-schema-traverse: 1.0.0 require-from-string: 2.0.2 + dev: true /align-text@0.1.4: resolution: {integrity: sha512-GrTZLRpmp6wIC2ztrWW9MjjTgSKccffgFagbNDOX95/dcjEcYZibYTeaOntySQLcdw1ztBoFkviiUvTMbb9MYg==} @@ -11838,9 +11787,9 @@ packages: resolution: {integrity: sha512-QXu7BPrP29VllRxH8GwB7x5iX5qWKAAMLqKQGWTeLWVlNHNOpVMJ91dsxQAIWXpjuW5wqvxu3Jd/nRjrJ+0pqg==} dev: true - /ansis@3.5.2: - resolution: {integrity: sha512-5uGcUZRbORJeEppVdWfZOSybTMz+Ou+84HepgK081Yk5+pPMMzWf/XGxiAT6bfBqCghRB4MwBtYn0CHqINRVag==} - engines: {node: '>=16'} + /ansis@3.3.2: + resolution: {integrity: sha512-cFthbBlt+Oi0i9Pv/j6YdVWJh54CtjGACaMPCIrEV4Ha7HWsIjXDwseYV79TIL0B4+KfSwD5S70PeQDkPUd1rA==} + engines: {node: '>=15'} dev: true /any-promise@1.3.0: @@ -11863,7 +11812,7 @@ packages: lazystream: 1.0.1 lodash: 4.17.21 normalize-path: 3.0.0 - readable-stream: 4.6.0 + readable-stream: 4.5.2 dev: true /archiver@7.0.1: @@ -11873,7 +11822,7 @@ packages: archiver-utils: 5.0.2 async: 3.2.6 buffer-crc32: 1.0.0 - readable-stream: 4.6.0 + readable-stream: 4.5.2 readdir-glob: 1.1.3 tar-stream: 3.1.7 zip-stream: 6.0.1 @@ -11908,12 +11857,12 @@ packages: resolution: {integrity: sha512-fExL2kFDC1Q2DUOx3whE/9KoN66IzkY4b4zUHUBFM1ojEYjZZYDcUW3bek/ufGionX9giIKDC5redH2IlGqcQQ==} dev: true - /array-buffer-byte-length@1.0.2: - resolution: {integrity: sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==} + /array-buffer-byte-length@1.0.1: + resolution: {integrity: sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==} engines: {node: '>= 0.4'} dependencies: - call-bound: 1.0.3 - is-array-buffer: 3.0.5 + call-bind: 1.0.8 + is-array-buffer: 3.0.4 /array-flatten@1.1.1: resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==} @@ -11935,27 +11884,28 @@ packages: engines: {node: '>=8'} dev: true - /array.prototype.flat@1.3.3: - resolution: {integrity: sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==} + /array.prototype.flat@1.3.2: + resolution: {integrity: sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==} engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.8 + es-abstract: 1.23.5 es-shim-unscopables: 1.0.2 dev: true - /arraybuffer.prototype.slice@1.0.4: - resolution: {integrity: sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==} + /arraybuffer.prototype.slice@1.0.3: + resolution: {integrity: sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==} engines: {node: '>= 0.4'} dependencies: - array-buffer-byte-length: 1.0.2 + array-buffer-byte-length: 1.0.1 call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.8 + es-abstract: 1.23.5 es-errors: 1.3.0 get-intrinsic: 1.2.6 - is-array-buffer: 3.0.5 + is-array-buffer: 3.0.4 + is-shared-array-buffer: 1.0.3 /arrify@1.0.1: resolution: {integrity: sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==} @@ -11989,7 +11939,7 @@ packages: call-bind: 1.0.8 is-nan: 1.3.2 object-is: 1.1.6 - object.assign: 4.1.7 + object.assign: 4.1.5 util: 0.12.5 dev: true @@ -12043,8 +11993,8 @@ packages: peerDependencies: postcss: ^8.1.0 dependencies: - browserslist: 4.24.3 - caniuse-lite: 1.0.30001690 + browserslist: 4.24.2 + caniuse-lite: 1.0.30001688 fraction.js: 4.3.7 normalize-range: 0.1.2 picocolors: 1.1.1 @@ -12059,8 +12009,8 @@ packages: peerDependencies: postcss: ^8.1.0 dependencies: - browserslist: 4.24.3 - caniuse-lite: 1.0.30001690 + browserslist: 4.24.2 + caniuse-lite: 1.0.30001688 fraction.js: 4.3.7 normalize-range: 0.1.2 picocolors: 1.1.1 @@ -12074,8 +12024,8 @@ packages: peerDependencies: postcss: ^8.1.0 dependencies: - browserslist: 4.24.3 - caniuse-lite: 1.0.30001690 + browserslist: 4.24.2 + caniuse-lite: 1.0.30001688 fraction.js: 4.3.7 normalize-range: 0.1.2 picocolors: 1.1.1 @@ -12154,7 +12104,7 @@ packages: dependencies: bare-events: 2.5.0 bare-path: 2.1.3 - bare-stream: 2.6.1 + bare-stream: 2.5.3 dev: true optional: true @@ -12170,10 +12120,10 @@ packages: dev: true optional: true - /bare-stream@2.6.1: - resolution: {integrity: sha512-eVZbtKM+4uehzrsj49KtCy3Pbg7kO1pJ3SKZ1SFrIH/0pnj9scuGGgUlNDf/7qS8WKtGdiJY5Kyhs/ivYPTB/g==} + /bare-stream@2.5.3: + resolution: {integrity: sha512-p+zwXMlLluovtQXGKvT9oZkSYZA9wgpYaY3EluZlQJXYgPIL2r5Ym/3ZS8pvDkXLVWXnnRkeipdD+V1SAm25aw==} dependencies: - streamx: 2.21.1 + streamx: 2.21.0 dev: true optional: true @@ -12248,13 +12198,13 @@ packages: readable-stream: 3.6.2 dev: true - /bl@6.0.18: - resolution: {integrity: sha512-2k76XmWCuvu9HTvu3tFOl5HDdCH0wLZ/jHYva/LBVJmc9oX8yUtNQjxrFmbTdXsCSmIxwVTANZPNDfMQrvHFUw==} + /bl@6.0.16: + resolution: {integrity: sha512-V/kz+z2Mx5/6qDfRCilmrukUXcXuCoXKg3/3hDvzKKoSUx8CJKudfIoT29XZc3UE9xBvxs5qictiHdprwtteEg==} dependencies: '@types/readable-stream': 4.0.18 buffer: 6.0.3 inherits: 2.0.4 - readable-stream: 4.6.0 + readable-stream: 4.5.2 dev: true /blake3-wasm@2.1.5: @@ -12304,15 +12254,15 @@ packages: wcwidth: 1.0.1 dev: true - /browserslist@4.24.3: - resolution: {integrity: sha512-1CPmv8iobE2fyRMV97dAcMVegvvWKxmq94hkLiAkUGwKVTyDLw33K+ZxiFrREKmmps4rIw6grcCFCnTMSZ/YiA==} + /browserslist@4.24.2: + resolution: {integrity: sha512-ZIc+Q62revdMcqC6aChtW4jz3My3klmCO1fEmINZY/8J3EpBg5/A/D0AKmBveUh6pgoeycoMkVMko84tuYS+Gg==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true dependencies: - caniuse-lite: 1.0.30001690 - electron-to-chromium: 1.5.76 + caniuse-lite: 1.0.30001688 + electron-to-chromium: 1.5.73 node-releases: 2.0.19 - update-browserslist-db: 1.1.1(browserslist@4.24.3) + update-browserslist-db: 1.1.1(browserslist@4.24.2) /buffer-crc32@0.2.13: resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==} @@ -12425,11 +12375,11 @@ packages: get-intrinsic: 1.2.6 set-function-length: 1.2.2 - /call-bound@1.0.3: - resolution: {integrity: sha512-YTd+6wGlNlPxSuri7Y6X8tY2dmm12UMH66RpKMhiX6rsk5wXXnYgbUcOt8kiS31/AjfoTOvCsE+w8nZQLQnzHA==} + /call-bound@1.0.2: + resolution: {integrity: sha512-0lk0PHFe/uz0vl527fG9CgdE9WdafjDbCXvBbs+LUv000TVt2Jjhqbs4Jwm8gz070w8xXyEAxrPOMullsxXeGg==} engines: {node: '>= 0.4'} dependencies: - call-bind-apply-helpers: 1.0.1 + call-bind: 1.0.8 get-intrinsic: 1.2.6 /callsites@3.1.0: @@ -12466,8 +12416,8 @@ packages: resolution: {integrity: sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ==} dev: false - /caniuse-lite@1.0.30001690: - resolution: {integrity: sha512-5ExiE3qQN6oF8Clf8ifIDcMRCRE/dMGcETG/XGMD8/XiXm6HXQgQTh1yZYLXXpSOsEUlJm1Xr7kGULZTuGtP/w==} + /caniuse-lite@1.0.30001688: + resolution: {integrity: sha512-Nmqpru91cuABu/DTCXbM2NSRHzM2uVHfPnhJ/1zEAJx/ILBRVmz3pzH4N7DZqbdG0gWClsCC05Oj0mJ/1AWMbA==} /capnp-ts@0.7.0: resolution: {integrity: sha512-XKxXAC3HVPv7r674zP0VC3RTXz+/JKhfyw94ljvF80yynK6VkTnqE3jMuN8b3dUVmmc43TjyxjW4KTsmB3c86g==} @@ -12540,11 +12490,6 @@ packages: /chalk@5.3.0: resolution: {integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==} engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} - dev: true - - /chalk@5.4.1: - resolution: {integrity: sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==} - engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} /character-entities-html4@2.1.0: resolution: {integrity: sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==} @@ -12654,8 +12599,8 @@ packages: optionalDependencies: fsevents: 2.3.3 - /chokidar@4.0.3: - resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} + /chokidar@4.0.1: + resolution: {integrity: sha512-n8enUVCED/KVRQlab1hr3MVpcVMvxtZjmEa956u+4YijlmQED223XMSYj2tLuKvr4jcCTzNNMpQDUer72MMmzA==} engines: {node: '>= 14.16.0'} dependencies: readdirp: 4.0.2 @@ -13006,7 +12951,7 @@ packages: crc32-stream: 6.0.0 is-stream: 2.0.1 normalize-path: 3.0.0 - readable-stream: 4.6.0 + readable-stream: 4.5.2 dev: true /compute-scroll-into-view@3.1.0: @@ -13053,8 +12998,8 @@ packages: proto-list: 1.2.4 dev: false - /consola@3.3.3: - resolution: {integrity: sha512-Qil5KwghMzlqd51UXM0b6fyaGHtOC22scxrwrz4A2882LyUMwQjnvaedN1HAeXzphspQ6CpHkzMAWxBTUruDLg==} + /consola@3.2.3: + resolution: {integrity: sha512-I5qxpzLv+sJhTVEoLYNcTW+bThDCPsit0vLNKShZx6rLtpilNpmmeTPaeqJb9ZE9dV3DGaeby6Vuhrw38WjeyQ==} engines: {node: ^14.18.0 || >=16.10.0} dev: false @@ -13128,17 +13073,17 @@ packages: object-assign: 4.1.1 vary: 1.1.2 - /cosmiconfig-typescript-loader@6.1.0(@types/node@20.14.9)(cosmiconfig@9.0.0)(typescript@5.5.3): - resolution: {integrity: sha512-tJ1w35ZRUiM5FeTzT7DtYWAFFv37ZLqSRkGi2oeCK1gPhvaWjkAtfXvLmvE1pRfxxp9aQo6ba/Pvg1dKj05D4g==} - engines: {node: '>=v18'} + /cosmiconfig-typescript-loader@5.1.0(@types/node@20.14.9)(cosmiconfig@9.0.0)(typescript@5.5.3): + resolution: {integrity: sha512-7PtBB+6FdsOvZyJtlF3hEPpACq7RQX6BVGsgC7/lfVXnKMvNCu/XY3ykreqG5w/rBNdu2z8LCIKoF3kpHHdHlA==} + engines: {node: '>=v16'} peerDependencies: '@types/node': '*' - cosmiconfig: '>=9' - typescript: '>=5' + cosmiconfig: '>=8.2' + typescript: '>=4' dependencies: '@types/node': 20.14.9 cosmiconfig: 9.0.0(typescript@5.5.3) - jiti: 2.4.2 + jiti: 1.21.6 typescript: 5.5.3 dev: true optional: true @@ -13180,7 +13125,7 @@ packages: engines: {node: '>= 14'} dependencies: crc-32: 1.2.2 - readable-stream: 4.6.0 + readable-stream: 4.5.2 dev: true /create-require@1.1.1: @@ -13276,7 +13221,7 @@ packages: longest: 2.0.1 word-wrap: 1.2.5 optionalDependencies: - '@commitlint/load': 19.6.1(@types/node@20.14.9)(typescript@5.5.3) + '@commitlint/load': 19.5.0(@types/node@20.14.9)(typescript@5.5.3) transitivePeerDependencies: - '@types/node' - typescript @@ -13414,27 +13359,27 @@ packages: engines: {node: '>= 14'} dev: true - /data-view-buffer@1.0.2: - resolution: {integrity: sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==} + /data-view-buffer@1.0.1: + resolution: {integrity: sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==} engines: {node: '>= 0.4'} dependencies: - call-bound: 1.0.3 + call-bind: 1.0.8 es-errors: 1.3.0 is-data-view: 1.0.2 - /data-view-byte-length@1.0.2: - resolution: {integrity: sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==} + /data-view-byte-length@1.0.1: + resolution: {integrity: sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==} engines: {node: '>= 0.4'} dependencies: - call-bound: 1.0.3 + call-bind: 1.0.8 es-errors: 1.3.0 is-data-view: 1.0.2 - /data-view-byte-offset@1.0.1: - resolution: {integrity: sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==} + /data-view-byte-offset@1.0.0: + resolution: {integrity: sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==} engines: {node: '>= 0.4'} dependencies: - call-bound: 1.0.3 + call-bind: 1.0.8 es-errors: 1.3.0 is-data-view: 1.0.2 @@ -13564,8 +13509,8 @@ packages: resolution: {integrity: sha512-5tdhKF6DbU7iIzrIOa1AOUt39ZRm13cmL1cGEh//aqR8x9+tNfbywRf0n5FD/18OKMdo7DNEtrX2t22ZAkI+eg==} engines: {node: '>= 0.4'} dependencies: - is-arguments: 1.2.0 - is-date-object: 1.1.0 + is-arguments: 1.1.1 + is-date-object: 1.0.5 is-regex: 1.1.4 object-is: 1.1.6 object-keys: 1.1.1 @@ -13777,7 +13722,7 @@ packages: resolution: {integrity: sha512-plizRs/Vf15H+GCVxq2EUvyPK7ei9b/cVesHvjnX4xaXjM9spHe2Ytq0BitndFgvTJ3E3NljPNUEl7BAN43iZw==} engines: {node: '>= 6.0.0'} dependencies: - yaml: 2.7.0 + yaml: 2.6.1 dev: true /docker-modem@3.0.8: @@ -13829,8 +13774,8 @@ packages: domelementtype: 2.3.0 dev: false - /domutils@3.2.1: - resolution: {integrity: sha512-xWXmuRnN9OMP6ptPd2+H0cCbcYBULa5YDTbMm/2lvkWvNA3O4wcW+GvzooqBuNM8yy6pl3VIAeJTUUWUbfI5Fw==} + /domutils@3.1.0: + resolution: {integrity: sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==} dependencies: dom-serializer: 2.0.0 domelementtype: 2.3.0 @@ -13841,7 +13786,7 @@ packages: resolution: {integrity: sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==} dependencies: no-case: 3.0.4 - tslib: 2.4.1 + tslib: 2.8.1 dev: false /dot-prop@6.0.1: @@ -14198,8 +14143,8 @@ packages: zod: 3.23.8 dev: false - /dunder-proto@1.0.1: - resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} + /dunder-proto@1.0.0: + resolution: {integrity: sha512-9+Sj30DIu+4KvHqMfLUGLFYL2PkURSYMVXJyXe92nFRvlYq5hBjLEhblKB+vkd/WVlUYMWigiY07T91Fkk0+4A==} engines: {node: '>= 0.4'} dependencies: call-bind-apply-helpers: 1.0.1 @@ -14244,8 +14189,8 @@ packages: jake: 10.9.2 dev: true - /electron-to-chromium@1.5.76: - resolution: {integrity: sha512-CjVQyG7n7Sr+eBXE86HIulnL5N8xZY1sgmOPGuq/F0Rr0FJq63lg0kEtOIDfZBk44FnDLf6FUJ+dsJcuiUDdDQ==} + /electron-to-chromium@1.5.73: + resolution: {integrity: sha512-8wGNxG9tAG5KhGd3eeA0o6ixhiNdgr0DcHWm85XPCphwZgD1lIEoi6t3VERayWao7SF7AAZTw6oARGJeVjH8Kg==} /emoji-regex-xs@1.0.0: resolution: {integrity: sha512-LRlerrMYoIDrT6jgpeZ2YYl/L8EulRTt5hQcYjy5AInh7HWXKimpqx68aknBFpGL2+/IcogTcaydJEgaTmOpDg==} @@ -14334,8 +14279,8 @@ packages: - utf-8-validate dev: true - /enhanced-resolve@5.18.0: - resolution: {integrity: sha512-0/r0MySGYG8YqlayBZ6MuCfECmHFdJ5qyPh8s8wa5Hnm6SaFLSK1VYCbj+NKp090Nm1caZhD+QTnmxO7esYGyQ==} + /enhanced-resolve@5.17.1: + resolution: {integrity: sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg==} engines: {node: '>=10.13.0'} dependencies: graceful-fs: 4.2.11 @@ -14375,59 +14320,56 @@ packages: is-arrayish: 0.2.1 dev: true - /es-abstract@1.23.8: - resolution: {integrity: sha512-lfab8IzDn6EpI1ibZakcgS6WsfEBiB+43cuJo+wgylx1xKXf+Sp+YR3vFuQwC/u3sxYwV8Cxe3B0DpVUu/WiJQ==} + /es-abstract@1.23.5: + resolution: {integrity: sha512-vlmniQ0WNPwXqA0BnmwV3Ng7HxiGlh6r5U6JcTMNx8OilcAGqVJBHJcPjqOMaczU9fRuRK5Px2BdVyPRnKMMVQ==} engines: {node: '>= 0.4'} dependencies: - array-buffer-byte-length: 1.0.2 - arraybuffer.prototype.slice: 1.0.4 + array-buffer-byte-length: 1.0.1 + arraybuffer.prototype.slice: 1.0.3 available-typed-arrays: 1.0.7 call-bind: 1.0.8 - call-bound: 1.0.3 - data-view-buffer: 1.0.2 - data-view-byte-length: 1.0.2 - data-view-byte-offset: 1.0.1 + data-view-buffer: 1.0.1 + data-view-byte-length: 1.0.1 + data-view-byte-offset: 1.0.0 es-define-property: 1.0.1 es-errors: 1.3.0 es-object-atoms: 1.0.0 - es-set-tostringtag: 2.1.0 + es-set-tostringtag: 2.0.3 es-to-primitive: 1.3.0 - function.prototype.name: 1.1.8 + function.prototype.name: 1.1.6 get-intrinsic: 1.2.6 - get-symbol-description: 1.1.0 + get-symbol-description: 1.0.2 globalthis: 1.0.4 gopd: 1.2.0 has-property-descriptors: 1.0.2 has-proto: 1.2.0 has-symbols: 1.1.0 hasown: 2.0.2 - internal-slot: 1.1.0 - is-array-buffer: 3.0.5 + internal-slot: 1.0.7 + is-array-buffer: 3.0.4 is-callable: 1.2.7 is-data-view: 1.0.2 + is-negative-zero: 2.0.3 is-regex: 1.2.1 - is-shared-array-buffer: 1.0.4 - is-string: 1.1.1 - is-typed-array: 1.1.15 - is-weakref: 1.1.0 - math-intrinsics: 1.1.0 + is-shared-array-buffer: 1.0.3 + is-string: 1.1.0 + is-typed-array: 1.1.13 + is-weakref: 1.0.2 object-inspect: 1.13.3 object-keys: 1.1.1 - object.assign: 4.1.7 - own-keys: 1.0.1 + object.assign: 4.1.5 regexp.prototype.flags: 1.5.3 safe-array-concat: 1.1.3 - safe-push-apply: 1.0.0 - safe-regex-test: 1.1.0 + safe-regex-test: 1.0.3 string.prototype.trim: 1.2.10 string.prototype.trimend: 1.0.9 string.prototype.trimstart: 1.0.8 - typed-array-buffer: 1.0.3 - typed-array-byte-length: 1.0.3 - typed-array-byte-offset: 1.0.4 + typed-array-buffer: 1.0.2 + typed-array-byte-length: 1.0.1 + typed-array-byte-offset: 1.0.3 typed-array-length: 1.0.7 - unbox-primitive: 1.1.0 - which-typed-array: 1.1.18 + unbox-primitive: 1.0.2 + which-typed-array: 1.1.16 /es-define-property@1.0.1: resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} @@ -14437,8 +14379,8 @@ packages: resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} engines: {node: '>= 0.4'} - /es-module-lexer@1.6.0: - resolution: {integrity: sha512-qqnD1yMU6tk/jnaMosogGySTZP8YtUgAffA9nMN+E/rjxcfRQ6IEk7IiozUjgxKoFHBGjTLnrHB/YC45r/59EQ==} + /es-module-lexer@1.5.4: + resolution: {integrity: sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==} dev: false /es-object-atoms@1.0.0: @@ -14447,11 +14389,10 @@ packages: dependencies: es-errors: 1.3.0 - /es-set-tostringtag@2.1.0: - resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} + /es-set-tostringtag@2.0.3: + resolution: {integrity: sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==} engines: {node: '>= 0.4'} dependencies: - es-errors: 1.3.0 get-intrinsic: 1.2.6 has-tostringtag: 1.0.2 hasown: 2.0.2 @@ -14467,8 +14408,8 @@ packages: engines: {node: '>= 0.4'} dependencies: is-callable: 1.2.7 - is-date-object: 1.1.0 - is-symbol: 1.1.1 + is-date-object: 1.0.5 + is-symbol: 1.1.0 /es6-promise@4.2.8: resolution: {integrity: sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==} @@ -14716,37 +14657,36 @@ packages: '@esbuild/win32-x64': 0.23.1 dev: true - /esbuild@0.24.2: - resolution: {integrity: sha512-+9egpBW8I3CD5XPe0n6BfT5fxLzxrlDzqydF3aviG+9ni1lDC/OvMHcxqEFV0+LANZG5R1bFMWfUrjVsdwxJvA==} + /esbuild@0.24.0: + resolution: {integrity: sha512-FuLPevChGDshgSicjisSooU0cemp/sGXR841D5LHMB7mTVOmsEHcAxaH3irL53+8YDIeVNQEySh4DaYU/iuPqQ==} engines: {node: '>=18'} hasBin: true requiresBuild: true optionalDependencies: - '@esbuild/aix-ppc64': 0.24.2 - '@esbuild/android-arm': 0.24.2 - '@esbuild/android-arm64': 0.24.2 - '@esbuild/android-x64': 0.24.2 - '@esbuild/darwin-arm64': 0.24.2 - '@esbuild/darwin-x64': 0.24.2 - '@esbuild/freebsd-arm64': 0.24.2 - '@esbuild/freebsd-x64': 0.24.2 - '@esbuild/linux-arm': 0.24.2 - '@esbuild/linux-arm64': 0.24.2 - '@esbuild/linux-ia32': 0.24.2 - '@esbuild/linux-loong64': 0.24.2 - '@esbuild/linux-mips64el': 0.24.2 - '@esbuild/linux-ppc64': 0.24.2 - '@esbuild/linux-riscv64': 0.24.2 - '@esbuild/linux-s390x': 0.24.2 - '@esbuild/linux-x64': 0.24.2 - '@esbuild/netbsd-arm64': 0.24.2 - '@esbuild/netbsd-x64': 0.24.2 - '@esbuild/openbsd-arm64': 0.24.2 - '@esbuild/openbsd-x64': 0.24.2 - '@esbuild/sunos-x64': 0.24.2 - '@esbuild/win32-arm64': 0.24.2 - '@esbuild/win32-ia32': 0.24.2 - '@esbuild/win32-x64': 0.24.2 + '@esbuild/aix-ppc64': 0.24.0 + '@esbuild/android-arm': 0.24.0 + '@esbuild/android-arm64': 0.24.0 + '@esbuild/android-x64': 0.24.0 + '@esbuild/darwin-arm64': 0.24.0 + '@esbuild/darwin-x64': 0.24.0 + '@esbuild/freebsd-arm64': 0.24.0 + '@esbuild/freebsd-x64': 0.24.0 + '@esbuild/linux-arm': 0.24.0 + '@esbuild/linux-arm64': 0.24.0 + '@esbuild/linux-ia32': 0.24.0 + '@esbuild/linux-loong64': 0.24.0 + '@esbuild/linux-mips64el': 0.24.0 + '@esbuild/linux-ppc64': 0.24.0 + '@esbuild/linux-riscv64': 0.24.0 + '@esbuild/linux-s390x': 0.24.0 + '@esbuild/linux-x64': 0.24.0 + '@esbuild/netbsd-x64': 0.24.0 + '@esbuild/openbsd-arm64': 0.24.0 + '@esbuild/openbsd-x64': 0.24.0 + '@esbuild/sunos-x64': 0.24.0 + '@esbuild/win32-arm64': 0.24.0 + '@esbuild/win32-ia32': 0.24.0 + '@esbuild/win32-x64': 0.24.0 dev: false /escalade@3.2.0: @@ -14780,31 +14720,31 @@ packages: source-map: 0.6.1 dev: true - /eslint-config-prettier@9.0.0(eslint@9.17.0): + /eslint-config-prettier@9.0.0(eslint@9.16.0): resolution: {integrity: sha512-IcJsTkJae2S35pRsRAwoCE+925rJJStOdkKnLVgtE+tEpqU0EVVM7OqrwxqgptKdX29NUwC82I5pXsGFIgSevw==} hasBin: true peerDependencies: eslint: '>=7.0.0' dependencies: - eslint: 9.17.0 + eslint: 9.16.0 dev: false - /eslint-config-turbo@1.10.12(eslint@9.17.0): + /eslint-config-turbo@1.10.12(eslint@9.16.0): resolution: {integrity: sha512-z3jfh+D7UGYlzMWGh+Kqz++hf8LOE96q3o5R8X4HTjmxaBWlLAWG+0Ounr38h+JLR2TJno0hU9zfzoPNkR9BdA==} peerDependencies: eslint: '>6.6.0' dependencies: - eslint: 9.17.0 - eslint-plugin-turbo: 1.10.12(eslint@9.17.0) + eslint: 9.16.0 + eslint-plugin-turbo: 1.10.12(eslint@9.16.0) dev: false - /eslint-plugin-turbo@1.10.12(eslint@9.17.0): + /eslint-plugin-turbo@1.10.12(eslint@9.16.0): resolution: {integrity: sha512-uNbdj+ohZaYo4tFJ6dStRXu2FZigwulR1b3URPXe0Q8YaE7thuekKNP+54CHtZPH9Zey9dmDx5btAQl9mfzGOw==} peerDependencies: eslint: '>6.6.0' dependencies: dotenv: 16.0.3 - eslint: 9.17.0 + eslint: 9.16.0 dev: false /eslint-scope@5.1.1: @@ -14832,8 +14772,8 @@ packages: engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} dev: false - /eslint@9.17.0: - resolution: {integrity: sha512-evtlNcpJg+cZLcnVKwsai8fExnqjGPicK7gnUtlNuzu+Fv9bI0aLpND5T44VLQtoMEnI57LoXO9XAkIXwohKrA==} + /eslint@9.16.0: + resolution: {integrity: sha512-whp8mSQI4C8VXd+fLgSM0lh3UlmcFtVwUQjyKCFfsp+2ItAIYhlq/hqGahGqHE6cv9unM41VlqKk2VtKYR2TaA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} hasBin: true peerDependencies: @@ -14842,12 +14782,12 @@ packages: jiti: optional: true dependencies: - '@eslint-community/eslint-utils': 4.4.1(eslint@9.17.0) + '@eslint-community/eslint-utils': 4.4.1(eslint@9.16.0) '@eslint-community/regexpp': 4.12.1 '@eslint/config-array': 0.19.1 '@eslint/core': 0.9.1 '@eslint/eslintrc': 3.2.0 - '@eslint/js': 9.17.0 + '@eslint/js': 9.16.0 '@eslint/plugin-kit': 0.2.4 '@humanfs/node': 0.16.6 '@humanwhocodes/module-importer': 1.0.1 @@ -14905,10 +14845,11 @@ packages: estraverse: 5.3.0 dev: false - /esrap@1.3.2: - resolution: {integrity: sha512-C4PXusxYhFT98GjLSmb20k9PREuUdporer50dhzGuJu9IJXktbMddVCMLAERl5dAHyAi73GWWCE4FVHGP1794g==} + /esrap@1.2.3: + resolution: {integrity: sha512-ZlQmCCK+n7SGoqo7DnfKaP1sJZa49P01/dXzmjCASSo04p72w8EksT2NMK8CEX8DhKsfJXANioIw8VyHNsBfvQ==} dependencies: '@jridgewell/sourcemap-codec': 1.5.0 + '@types/estree': 1.0.6 dev: false /esrecurse@4.3.0: @@ -15205,10 +15146,6 @@ packages: - supports-color dev: true - /fast-content-type-parse@2.0.0: - resolution: {integrity: sha512-fCqg/6Sps8tqk8p+kqyKqYfOF0VjPNYrqpLiqNl0RBKmD80B080AJWVV6EkSkscjToNExcXg1+Mfzftrx6+iSA==} - dev: false - /fast-deep-equal@2.0.1: resolution: {integrity: sha512-bCK/2Z4zLidyB4ReuIsvALH6w31YfAQDmXMqMx6FyfHqvBxtjC0eRumeSu4Bs3XtXwpyIywtSTrVT99BxY1f9w==} dev: false @@ -15263,9 +15200,10 @@ packages: /fast-uri@3.0.3: resolution: {integrity: sha512-aLrHthzCjH5He4Z2H9YZ+v6Ujb9ocRuW6ZzkJQOrTxleEijANq4v1TsaPaVG1PZcuurEzrLcWRyYBYXD5cEiaw==} + dev: true - /fast-xml-parser@4.5.1: - resolution: {integrity: sha512-y655CeyUQ+jj7KBbYMc4FG01V8ZQqjN+gDYGJ50RtfsUB8iG9AmwmwoAgeKLJdmueKKMrH1RJ7yXHTSoczdv5w==} + /fast-xml-parser@4.5.0: + resolution: {integrity: sha512-/PlTQCI96+fZMAOLMZK4CWG1ItCbfZ/0jx7UIJFChPNrx7tcEgerUgWbeieCM9MfHInUDyK8DWYZ+YrywDJuTg==} hasBin: true dependencies: strnum: 1.0.5 @@ -15276,8 +15214,8 @@ packages: engines: {node: '>= 4.9.1'} dev: true - /fastq@1.18.0: - resolution: {integrity: sha512-QKHXPW0hD8g4UET03SdOdunzSouc9N4AuHdsX8XNcTsuz+yYFILVNIX4l9yHABMhiEI9Db0JTTIpu0wB+Y1QQw==} + /fastq@1.17.1: + resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} dependencies: reusify: 1.0.4 @@ -15688,20 +15626,20 @@ packages: dependencies: '@formatjs/intl-localematcher': 0.5.9 '@orama/orama': 3.0.4 - '@shikijs/rehype': 1.25.1 + '@shikijs/rehype': 1.24.2 github-slugger: 2.0.0 hast-util-to-estree: 3.1.0 hast-util-to-jsx-runtime: 2.3.2 - image-size: 1.2.0 + image-size: 1.1.1 negotiator: 1.0.0 next: 14.2.15(@babel/core@7.26.0)(@opentelemetry/api@1.4.1)(react-dom@18.3.1)(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - react-remove-scroll: 2.6.2(@types/react@18.3.11)(react@18.3.1) + react-remove-scroll: 2.6.0(@types/react@18.3.11)(react@18.3.1) remark: 15.0.1 remark-gfm: 4.0.0 scroll-into-view-if-needed: 3.1.0 - shiki: 1.25.1 + shiki: 1.24.2 unist-util-visit: 5.0.0 transitivePeerDependencies: - '@types/react' @@ -15730,20 +15668,20 @@ packages: dependencies: '@formatjs/intl-localematcher': 0.5.9 '@orama/orama': 3.0.4 - '@shikijs/rehype': 1.25.1 + '@shikijs/rehype': 1.24.2 github-slugger: 2.0.0 hast-util-to-estree: 3.1.0 hast-util-to-jsx-runtime: 2.3.2 - image-size: 1.2.0 + image-size: 1.1.1 negotiator: 1.0.0 next: 14.2.15(@babel/core@7.26.0)(@opentelemetry/api@1.4.1)(react-dom@18.3.1)(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - react-remove-scroll: 2.6.2(@types/react@18.3.11)(react@18.3.1) + react-remove-scroll: 2.6.0(@types/react@18.3.11)(react@18.3.1) remark: 15.0.1 remark-gfm: 4.0.0 scroll-into-view-if-needed: 3.1.0 - shiki: 1.25.1 + shiki: 1.24.2 unist-util-visit: 5.0.0 transitivePeerDependencies: - '@types/react' @@ -15758,9 +15696,9 @@ packages: next: 14.x.x || 15.x.x dependencies: '@mdx-js/mdx': 3.1.0(acorn@8.14.0) - chokidar: 4.0.3 + chokidar: 4.0.1 cross-spawn: 7.0.6 - esbuild: 0.24.2 + esbuild: 0.24.0 estree-util-value-to-estree: 3.2.1 fast-glob: 3.3.2 fumadocs-core: 14.4.0(@types/react@18.3.11)(next@14.2.15)(react-dom@18.3.1)(react@18.3.1) @@ -15782,7 +15720,7 @@ packages: dependencies: '@apidevtools/json-schema-ref-parser': 11.7.3 '@fumari/json-schema-to-typescript': 1.1.2 - '@radix-ui/react-select': 2.1.4(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-select': 2.1.2(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) '@radix-ui/react-slot': 1.1.0(@types/react@18.3.11)(react@18.3.1) class-variance-authority: 0.7.1 fast-glob: 3.3.2 @@ -15795,10 +15733,10 @@ packages: openapi-sampler: 1.6.1 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - react-hook-form: 7.54.2(react@18.3.1) + react-hook-form: 7.54.0(react@18.3.1) remark: 15.0.1 remark-rehype: 11.1.1 - shiki: 1.25.1 + shiki: 1.24.2 transitivePeerDependencies: - '@oramacloud/client' - '@types/react' @@ -15808,22 +15746,22 @@ packages: - tailwindcss dev: false - /fumadocs-twoslash@2.0.1(@types/react-dom@18.3.0)(@types/react@18.3.11)(fumadocs-ui@14.4.0)(react-dom@18.3.1)(react@18.3.1)(shiki@1.25.1)(typescript@5.5.4): + /fumadocs-twoslash@2.0.1(@types/react-dom@18.3.0)(@types/react@18.3.11)(fumadocs-ui@14.4.0)(react-dom@18.3.1)(react@18.3.1)(shiki@1.24.2)(typescript@5.5.4): resolution: {integrity: sha512-rpc4yci9sSslsmuS3KRp7ByqXFvffpSSMnmCPsByLnHY0t+aUFut7YAfvqJPyALPpj/si9ghaPJG/T1fcrL0uA==} peerDependencies: fumadocs-ui: ^13.0.0 || ^14.0.0 react: '>= 18' shiki: 1.x.x dependencies: - '@radix-ui/react-popover': 1.1.4(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) - '@shikijs/twoslash': 1.25.1(typescript@5.5.4) + '@radix-ui/react-popover': 1.1.2(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) + '@shikijs/twoslash': 1.24.2(typescript@5.5.4) fumadocs-ui: 14.4.0(@types/react-dom@18.3.0)(@types/react@18.3.11)(next@14.2.15)(react-dom@18.3.1)(react@18.3.1)(tailwindcss@3.4.15) mdast-util-from-markdown: 2.0.2 mdast-util-gfm: 3.0.0 mdast-util-to-hast: 13.2.0 react: 18.3.1 - shiki: 1.25.1 - tailwind-merge: 2.6.0 + shiki: 1.24.2 + tailwind-merge: 2.5.5 transitivePeerDependencies: - '@types/react' - '@types/react-dom' @@ -15843,7 +15781,7 @@ packages: mdast-util-from-markdown: 2.0.2 mdast-util-gfm: 3.0.0 mdast-util-to-hast: 13.2.0 - shiki: 1.25.1 + shiki: 1.24.2 ts-morph: 24.0.0 typescript: 5.5.4 transitivePeerDependencies: @@ -15861,15 +15799,15 @@ packages: tailwindcss: optional: true dependencies: - '@radix-ui/react-accordion': 1.2.2(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) - '@radix-ui/react-collapsible': 1.1.2(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) - '@radix-ui/react-dialog': 1.1.4(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-accordion': 1.2.1(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-collapsible': 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-dialog': 1.1.2(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) '@radix-ui/react-direction': 1.1.0(@types/react@18.3.11)(react@18.3.1) - '@radix-ui/react-navigation-menu': 1.2.3(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) - '@radix-ui/react-popover': 1.1.4(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) - '@radix-ui/react-scroll-area': 1.2.2(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-navigation-menu': 1.2.1(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-popover': 1.1.2(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-scroll-area': 1.2.1(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) '@radix-ui/react-slot': 1.1.0(@types/react@18.3.11)(react@18.3.1) - '@radix-ui/react-tabs': 1.1.2(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-tabs': 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) '@tailwindcss/typography': 0.5.15(tailwindcss@3.4.15) class-variance-authority: 0.7.1 fumadocs-core: 14.4.0(@types/react@18.3.11)(next@14.2.15)(react-dom@18.3.1)(react@18.3.1) @@ -15878,8 +15816,8 @@ packages: next-themes: 0.4.4(react-dom@18.3.1)(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - react-medium-image-zoom: 5.2.13(react-dom@18.3.1)(react@18.3.1) - tailwind-merge: 2.6.0 + react-medium-image-zoom: 5.2.12(react-dom@18.3.1)(react@18.3.1) + tailwind-merge: 2.5.5 tailwindcss: 3.4.15(ts-node@10.9.2) transitivePeerDependencies: - '@oramacloud/client' @@ -15900,15 +15838,15 @@ packages: tailwindcss: optional: true dependencies: - '@radix-ui/react-accordion': 1.2.2(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) - '@radix-ui/react-collapsible': 1.1.2(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) - '@radix-ui/react-dialog': 1.1.4(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-accordion': 1.2.1(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-collapsible': 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-dialog': 1.1.2(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) '@radix-ui/react-direction': 1.1.0(@types/react@18.3.11)(react@18.3.1) - '@radix-ui/react-navigation-menu': 1.2.3(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) - '@radix-ui/react-popover': 1.1.4(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) - '@radix-ui/react-scroll-area': 1.2.2(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-navigation-menu': 1.2.1(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-popover': 1.1.2(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-scroll-area': 1.2.1(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) '@radix-ui/react-slot': 1.1.0(@types/react@18.3.11)(react@18.3.1) - '@radix-ui/react-tabs': 1.1.2(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-tabs': 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) class-variance-authority: 0.7.1 fumadocs-core: 14.5.4(@types/react@18.3.11)(next@14.2.15)(react-dom@18.3.1)(react@18.3.1) lodash.merge: 4.6.2 @@ -15918,8 +15856,8 @@ packages: postcss-selector-parser: 7.0.0 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - react-medium-image-zoom: 5.2.13(react-dom@18.3.1)(react@18.3.1) - tailwind-merge: 2.6.0 + react-medium-image-zoom: 5.2.12(react-dom@18.3.1)(react@18.3.1) + tailwind-merge: 2.5.5 tailwindcss: 3.4.15(ts-node@10.9.2) transitivePeerDependencies: - '@oramacloud/client' @@ -15932,16 +15870,14 @@ packages: /function-bind@1.1.2: resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} - /function.prototype.name@1.1.8: - resolution: {integrity: sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==} + /function.prototype.name@1.1.6: + resolution: {integrity: sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==} engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.8 - call-bound: 1.0.3 define-properties: 1.2.1 + es-abstract: 1.23.5 functions-have-names: 1.2.3 - hasown: 2.0.2 - is-callable: 1.2.7 /functions-have-names@1.2.3: resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} @@ -15985,7 +15921,7 @@ packages: engines: {node: '>= 0.4'} dependencies: call-bind-apply-helpers: 1.0.1 - dunder-proto: 1.0.1 + dunder-proto: 1.0.0 es-define-property: 1.0.1 es-errors: 1.3.0 es-object-atoms: 1.0.0 @@ -15993,7 +15929,7 @@ packages: gopd: 1.2.0 has-symbols: 1.1.0 hasown: 2.0.2 - math-intrinsics: 1.1.0 + math-intrinsics: 1.0.0 /get-nonce@1.0.1: resolution: {integrity: sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==} @@ -16039,11 +15975,11 @@ packages: '@sec-ant/readable-stream': 0.4.1 is-stream: 4.0.1 - /get-symbol-description@1.1.0: - resolution: {integrity: sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==} + /get-symbol-description@1.0.2: + resolution: {integrity: sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==} engines: {node: '>= 0.4'} dependencies: - call-bound: 1.0.3 + call-bind: 1.0.8 es-errors: 1.3.0 get-intrinsic: 1.2.6 @@ -16239,27 +16175,27 @@ packages: resolution: {integrity: sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==} dev: true - /graphql-request@7.1.2(graphql@16.10.0): + /graphql-request@7.1.2(graphql@16.9.0): resolution: {integrity: sha512-+XE3iuC55C2di5ZUrB4pjgwe+nIQBuXVIK9J98wrVwojzDW3GMdSBZfxUk8l4j9TieIpjpggclxhNEU9ebGF8w==} peerDependencies: graphql: 14 - 16 dependencies: - '@graphql-typed-document-node/core': 3.2.0(graphql@16.10.0) - graphql: 16.10.0 + '@graphql-typed-document-node/core': 3.2.0(graphql@16.9.0) + graphql: 16.9.0 dev: true - /graphql-tag@2.12.6(graphql@16.10.0): + /graphql-tag@2.12.6(graphql@16.9.0): resolution: {integrity: sha512-FdSNcu2QQcWnM2VNvSCCDCVS5PpPqpzgFT8+GXzqJuoDd0CBncxCY278u4mhRO7tMgo2JjgJA5aZ+nWSQ/Z+xg==} engines: {node: '>=10'} peerDependencies: graphql: ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 dependencies: - graphql: 16.10.0 + graphql: 16.9.0 tslib: 2.8.1 dev: true - /graphql@16.10.0: - resolution: {integrity: sha512-AjqGKbDGUFRKIRCP9tCKiIGHyriz2oHEbPIbEtcSLSs4YjReZOIPQQWek4+6hjw62H9QShXHyaGivGiYVLeYFQ==} + /graphql@16.9.0: + resolution: {integrity: sha512-GGTKBX4SD7Wdb8mqeDLni2oaRGYQWjWHGKPQ24ZMnUtKfcsVoiv4uX8+LJr1K6U5VW2Lu1BwJnj7uiori0YtRw==} engines: {node: ^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0} /gray-matter@4.0.3: @@ -16290,9 +16226,8 @@ packages: ansi-regex: 2.1.1 dev: false - /has-bigints@1.1.0: - resolution: {integrity: sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==} - engines: {node: '>= 0.4'} + /has-bigints@1.0.2: + resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==} /has-flag@3.0.0: resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} @@ -16316,7 +16251,7 @@ packages: resolution: {integrity: sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==} engines: {node: '>= 0.4'} dependencies: - dunder-proto: 1.0.1 + dunder-proto: 1.0.0 /has-symbols@1.1.0: resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} @@ -16340,7 +16275,7 @@ packages: decircular: 0.1.1 is-obj: 3.0.0 sort-keys: 5.1.0 - type-fest: 4.31.0 + type-fest: 4.30.0 dev: false /hasown@2.0.2: @@ -16587,8 +16522,8 @@ packages: zwitch: 2.0.4 dev: true - /hast-util-to-html@9.0.4: - resolution: {integrity: sha512-wxQzXtdbhiwGAUKrnQJXlOPmHnEehzphwkK7aluUPQ+lEc1xefC8pblMgpp2w5ldBTEfveRIrADcrhGIWrlTDA==} + /hast-util-to-html@9.0.3: + resolution: {integrity: sha512-M17uBDzMJ9RPCqLMO92gNNUDuBSq10a25SDBI08iCCxmorf4Yy6sYHK57n9WAbRAAaU+DuR4W6GN9K4DFZesYg==} dependencies: '@types/hast': 3.0.4 '@types/unist': 3.0.3 @@ -16630,7 +16565,7 @@ packages: '@types/mdast': 4.0.4 '@ungap/structured-clone': 1.2.1 hast-util-phrasing: 3.0.1 - hast-util-to-html: 9.0.4 + hast-util-to-html: 9.0.3 hast-util-to-text: 4.0.2 hast-util-whitespace: 3.0.0 mdast-util-phrasing: 4.1.0 @@ -16807,7 +16742,7 @@ packages: dependencies: domelementtype: 2.3.0 domhandler: 5.0.3 - domutils: 3.2.1 + domutils: 3.1.0 entities: 4.5.0 dev: false @@ -16923,8 +16858,8 @@ packages: resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} engines: {node: '>= 4'} - /image-size@1.2.0: - resolution: {integrity: sha512-4S8fwbO6w3GeCVN6OPtA9I5IGKkcDMPcKndtUlpJuCwu7JLjtj7JZpwqLuyY2nrmQT3AWsCJLSKPsc2mPBSl3w==} + /image-size@1.1.1: + resolution: {integrity: sha512-541xKlUw6jr/6gGuk92F+mYM5zaFAc5ahphvkqvNe2bQ6gVBkd6bfrmVJ2t4KDAfikAYZyIqTnktX3i6/aQDrQ==} engines: {node: '>=16.x'} hasBin: true dependencies: @@ -16938,8 +16873,8 @@ packages: parent-module: 1.0.1 resolve-from: 4.0.0 - /import-in-the-middle@1.12.0: - resolution: {integrity: sha512-yAgSE7GmtRcu4ZUSFX/4v69UGXwugFFSdIQJ14LHPOPPQrWv8Y7O9PHsw8Ovk7bKCLe4sjXMbZFqGFcLHpZ89w==} + /import-in-the-middle@1.11.3: + resolution: {integrity: sha512-tNpKEb4AjZrCyrxi+Eyu43h5ig0O8ZRFSXPHh/00/o+4P4pKzVEW/m5lsVtsAT7fCIgmQOAPjdqecGDsBXRxsw==} dependencies: acorn: 8.14.0 acorn-import-attributes: 1.9.5(acorn@8.14.0) @@ -17022,8 +16957,8 @@ packages: wrap-ansi: 7.0.0 dev: true - /internal-slot@1.1.0: - resolution: {integrity: sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==} + /internal-slot@1.0.7: + resolution: {integrity: sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==} engines: {node: '>= 0.4'} dependencies: es-errors: 1.3.0 @@ -17040,6 +16975,11 @@ packages: engines: {node: '>= 0.10'} dev: false + /invariant@2.2.4: + resolution: {integrity: sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==} + dependencies: + loose-envify: 1.4.0 + /ip-address@9.0.5: resolution: {integrity: sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==} engines: {node: '>= 12'} @@ -17082,19 +17022,18 @@ packages: is-alphabetical: 2.0.1 is-decimal: 2.0.1 - /is-arguments@1.2.0: - resolution: {integrity: sha512-7bVbi0huj/wrIAOzb8U1aszg9kdi3KN/CyU19CTI7tAoZYEZoL9yCDXpbXN+uPsuWnP02cyug1gleqq+TU+YCA==} + /is-arguments@1.1.1: + resolution: {integrity: sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==} engines: {node: '>= 0.4'} dependencies: - call-bound: 1.0.3 + call-bind: 1.0.8 has-tostringtag: 1.0.2 - /is-array-buffer@3.0.5: - resolution: {integrity: sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==} + /is-array-buffer@3.0.4: + resolution: {integrity: sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==} engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.8 - call-bound: 1.0.3 get-intrinsic: 1.2.6 /is-arrayish@0.2.1: @@ -17114,7 +17053,7 @@ packages: resolution: {integrity: sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==} engines: {node: '>= 0.4'} dependencies: - has-bigints: 1.1.0 + has-bigints: 1.0.2 /is-binary-path@2.1.0: resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} @@ -17122,11 +17061,11 @@ packages: dependencies: binary-extensions: 2.3.0 - /is-boolean-object@1.2.1: - resolution: {integrity: sha512-l9qO6eFlUETHtuihLcYOaLKByJ1f+N4kthcU9YjHy3N+B3hWv0y/2Nd0mu/7lTFnRQHTrSdXF50HQ3bl5fEnng==} + /is-boolean-object@1.2.0: + resolution: {integrity: sha512-kR5g0+dXf/+kXnqI+lu0URKYPKgICtHGGNCDSB10AaUFj3o/HkB3u7WfpRBJGFopxxY0oH3ux7ZsDjLtK7xqvw==} engines: {node: '>= 0.4'} dependencies: - call-bound: 1.0.3 + call-bind: 1.0.8 has-tostringtag: 1.0.2 /is-buffer@1.1.6: @@ -17148,8 +17087,8 @@ packages: ci-info: 3.9.0 dev: true - /is-core-module@2.16.1: - resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==} + /is-core-module@2.15.1: + resolution: {integrity: sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==} engines: {node: '>= 0.4'} dependencies: hasown: 2.0.2 @@ -17158,15 +17097,14 @@ packages: resolution: {integrity: sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==} engines: {node: '>= 0.4'} dependencies: - call-bound: 1.0.3 + call-bound: 1.0.2 get-intrinsic: 1.2.6 - is-typed-array: 1.1.15 + is-typed-array: 1.1.13 - /is-date-object@1.1.0: - resolution: {integrity: sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==} + /is-date-object@1.0.5: + resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} engines: {node: '>= 0.4'} dependencies: - call-bound: 1.0.3 has-tostringtag: 1.0.2 /is-decimal@1.0.4: @@ -17194,11 +17132,11 @@ packages: resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} engines: {node: '>=0.10.0'} - /is-finalizationregistry@1.1.1: - resolution: {integrity: sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==} + /is-finalizationregistry@1.1.0: + resolution: {integrity: sha512-qfMdqbAQEwBw78ZyReKnlA8ezmPdb9BemzIIip/JkjaZUhitfXDkkr+3QTboW0JrSXT1QWyYShpvnNHGZ4c4yA==} engines: {node: '>= 0.4'} dependencies: - call-bound: 1.0.3 + call-bind: 1.0.8 /is-fullwidth-code-point@3.0.0: resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} @@ -17267,15 +17205,19 @@ packages: define-properties: 1.2.1 dev: true + /is-negative-zero@2.0.3: + resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==} + engines: {node: '>= 0.4'} + /is-node-process@1.2.0: resolution: {integrity: sha512-Vg4o6/fqPxIjtxgUH5QLJhwZ7gW5diGCVlXpuUfELC62CuxM1iHcRe51f2W1FDy04Ai4KJkagKjx3XaqyfRKXw==} dev: true - /is-number-object@1.1.1: - resolution: {integrity: sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==} + /is-number-object@1.1.0: + resolution: {integrity: sha512-KVSZV0Dunv9DTPkhXwcZ3Q+tUc9TsaE1ZwX5J2WMvsSGS6Md8TFPun5uwh0yRdrNerI6vf/tbJxqSx4c1ZI1Lw==} engines: {node: '>= 0.4'} dependencies: - call-bound: 1.0.3 + call-bind: 1.0.8 has-tostringtag: 1.0.2 /is-number@4.0.0: @@ -17340,7 +17282,7 @@ packages: resolution: {integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==} engines: {node: '>= 0.4'} dependencies: - call-bound: 1.0.3 + call-bound: 1.0.2 gopd: 1.2.0 has-tostringtag: 1.0.2 hasown: 2.0.2 @@ -17361,11 +17303,11 @@ packages: resolution: {integrity: sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==} engines: {node: '>= 0.4'} - /is-shared-array-buffer@1.0.4: - resolution: {integrity: sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==} + /is-shared-array-buffer@1.0.3: + resolution: {integrity: sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==} engines: {node: '>= 0.4'} dependencies: - call-bound: 1.0.3 + call-bind: 1.0.8 /is-stream@1.1.0: resolution: {integrity: sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==} @@ -17385,11 +17327,11 @@ packages: resolution: {integrity: sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A==} engines: {node: '>=18'} - /is-string@1.1.1: - resolution: {integrity: sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==} + /is-string@1.1.0: + resolution: {integrity: sha512-PlfzajuF9vSo5wErv3MJAKD/nqf9ngAs1NFQYm16nUYFO2IzxJ2hcm+IOCg+EEopdykNNUhVq5cz35cAUxU8+g==} engines: {node: '>= 0.4'} dependencies: - call-bound: 1.0.3 + call-bind: 1.0.8 has-tostringtag: 1.0.2 /is-subdir@1.2.0: @@ -17399,19 +17341,19 @@ packages: better-path-resolve: 1.0.0 dev: true - /is-symbol@1.1.1: - resolution: {integrity: sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==} + /is-symbol@1.1.0: + resolution: {integrity: sha512-qS8KkNNXUZ/I+nX6QT8ZS1/Yx0A444yhzdTKxCzKkNjQ9sHErBxJnJAgh+f5YhusYECEcjo4XcyH87hn6+ks0A==} engines: {node: '>= 0.4'} dependencies: - call-bound: 1.0.3 + call-bind: 1.0.8 has-symbols: 1.1.0 - safe-regex-test: 1.1.0 + safe-regex-test: 1.0.3 - /is-typed-array@1.1.15: - resolution: {integrity: sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==} + /is-typed-array@1.1.13: + resolution: {integrity: sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==} engines: {node: '>= 0.4'} dependencies: - which-typed-array: 1.1.18 + which-typed-array: 1.1.16 /is-unicode-supported@0.1.0: resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} @@ -17434,17 +17376,16 @@ packages: resolution: {integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==} engines: {node: '>= 0.4'} - /is-weakref@1.1.0: - resolution: {integrity: sha512-SXM8Nwyys6nT5WP6pltOwKytLV7FqQ4UiibxVmW+EIosHcmCqkkjViTb5SNssDlkCiEYRP1/pdWUKVvZBmsR2Q==} - engines: {node: '>= 0.4'} + /is-weakref@1.0.2: + resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==} dependencies: - call-bound: 1.0.3 + call-bind: 1.0.8 - /is-weakset@2.0.4: - resolution: {integrity: sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==} + /is-weakset@2.0.3: + resolution: {integrity: sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ==} engines: {node: '>= 0.4'} dependencies: - call-bound: 1.0.3 + call-bind: 1.0.8 get-intrinsic: 1.2.6 /is-what@4.1.16: @@ -17545,16 +17486,10 @@ packages: hasBin: true dev: true - /jiti@1.21.7: - resolution: {integrity: sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==} + /jiti@1.21.6: + resolution: {integrity: sha512-2yTgeWTWzMWkHu6Jp9NKgePDaYHbntiwvYuuJLbbN9vl7DC9DvXKOB2BC3ZZ92D3cvV/aflH0osDfwpHepQ53w==} hasBin: true - /jiti@2.4.2: - resolution: {integrity: sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A==} - hasBin: true - dev: true - optional: true - /jose@5.9.6: resolution: {integrity: sha512-AMlnetc9+CV9asI19zHmrgS/WYsWUwCn2R7RzlbJWD7F9eWYUTGyBmU9o6PxngtLGOiDGPRu+Uc4fhKzbpteZQ==} dev: false @@ -17645,6 +17580,7 @@ packages: /json-schema-traverse@1.0.0: resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + dev: true /json-schema-typed@7.0.3: resolution: {integrity: sha512-7DE8mpG+/fVw+dTpjbxnx47TaMnDfOI1jwft9g1VybltZCduyRQPJPvc+zzKY9WPHxhPWczyFuYa6I8Mw4iU5A==} @@ -17685,7 +17621,7 @@ packages: hasBin: true dependencies: '@types/diff-match-patch': 1.0.36 - chalk: 5.4.1 + chalk: 5.3.0 diff-match-patch: 1.0.5 dev: false @@ -17708,8 +17644,8 @@ packages: engines: {node: '>=0.10.0'} dev: true - /jsonrepair@3.11.2: - resolution: {integrity: sha512-ejydGcTq0qKk1r0NUBwjtvswbPFhs19+QEfwSeGwB8KJZ59W7/AOFmQh04c68mkJ+2hGk+OkOmkr2bKG4tGlLQ==} + /jsonrepair@3.11.1: + resolution: {integrity: sha512-9jej0NdRnXXv/n6oYxKbNhrKyPXM6SOrWEmNEpl5S+JpqzrmkxcX7gJCA+GMkgJiWd8KtH6G60+0gIlhZ4dMKQ==} hasBin: true dev: false @@ -17721,8 +17657,8 @@ packages: resolution: {integrity: sha512-GAQSWayS2+LjbH5bkRi+pMPYyP1JSp7o+4j58ANZ762N/RH/SdlAT3CHHztnn8s/xgg8kYNM24Gd2IPo9b5W+g==} dev: true - /katex@0.16.19: - resolution: {integrity: sha512-3IA6DYVhxhBabjSLTNO9S4+OliA3Qvb8pBQXMfC4WxXJgLwZgnfDl0BmB4z6nBMdznBsZ+CGM8DrGZ5hcguDZg==} + /katex@0.16.15: + resolution: {integrity: sha512-yE9YJIEAk2aZ+FL/G8r+UGw0CTUzEA8ZFy6E+8tc3spHUKq3qBnzCkI1CQwGoI9atJhVyFPEypQsTY7mJ1Pi9w==} hasBin: true dependencies: commander: 8.3.0 @@ -17783,8 +17719,8 @@ packages: zod-validation-error: 3.4.0(zod@3.24.1) dev: true - /ky@1.7.4: - resolution: {integrity: sha512-zYEr/gh7uLW2l4su11bmQ2M9xLgQLjyvx58UyNM/6nuqyWFHPX5ktMjvpev3F8QWdjSsHUpnWew4PBCswBNuMQ==} + /ky@1.7.3: + resolution: {integrity: sha512-Sz49ZWR/BjNOq+2UK1k9ONZUVq8eyuCj30Zgc8VrRNtFlTBZduzuvehUd5kjQF6/Fms3Ir3EYqzJryw9tRvsSw==} engines: {node: '>=18'} dev: false @@ -17918,7 +17854,7 @@ packages: engines: {node: '>=14'} dependencies: mlly: 1.7.3 - pkg-types: 1.3.0 + pkg-types: 1.2.1 dev: true /locate-character@3.0.0: @@ -18006,7 +17942,7 @@ packages: resolution: {integrity: sha512-l0x2DvrW294C9uDCoQe1VSU4gf529FkSZ6leBl4TiqZH/e+0R7hSfHQBNut2mNygDgHwvYHfFLn6Oxb3VWj2rA==} engines: {node: '>=12'} dependencies: - chalk: 5.4.1 + chalk: 5.3.0 is-unicode-supported: 1.3.0 dev: true @@ -18052,7 +17988,7 @@ packages: /lower-case@2.0.2: resolution: {integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==} dependencies: - tslib: 2.4.1 + tslib: 2.8.1 dev: false /lowercase-keys@3.0.0: @@ -18131,8 +18067,8 @@ packages: sourcemap-codec: 1.4.8 dev: true - /magic-string@0.30.17: - resolution: {integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==} + /magic-string@0.30.15: + resolution: {integrity: sha512-zXeaYRgZ6ldS1RJJUrMrYgNJ4fdwnyI6tVqoiIhyCyv5IVTK9BU8Ic2l253GGETQHxI4HNUwhJ3fjDhKqEoaAw==} dependencies: '@jridgewell/sourcemap-codec': 1.5.0 @@ -18174,8 +18110,8 @@ packages: resolution: {integrity: sha512-4vRUvPyxdO8cWULGTh9dZWL2tZK6LDBvj+OGHBER7poH9Qdt7kXEoj20wiz4lQUbUXQZFjPbe5mVDo9nutizCw==} dev: false - /math-intrinsics@1.1.0: - resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} + /math-intrinsics@1.0.0: + resolution: {integrity: sha512-4MqMiKP90ybymYvsut0CH2g4XWbfLtmlCkXmtmdcDCxNB+mQcu1w/1+L/VD7vi/PSv7X2JYV7SCcR+jiPXnQtA==} engines: {node: '>= 0.4'} /md-to-react-email@5.0.2(react@18.3.1): @@ -18421,7 +18357,7 @@ packages: ccount: 2.0.1 mdast-util-from-markdown: 1.3.1 mdast-util-to-markdown: 1.5.0 - parse-entities: 4.0.2 + parse-entities: 4.0.1 stringify-entities: 4.0.4 unist-util-remove-position: 4.0.2 unist-util-stringify-position: 3.0.3 @@ -18440,7 +18376,7 @@ packages: devlop: 1.1.0 mdast-util-from-markdown: 2.0.2 mdast-util-to-markdown: 2.1.2 - parse-entities: 4.0.2 + parse-entities: 4.0.1 stringify-entities: 4.0.4 unist-util-stringify-position: 4.0.0 vfile-message: 4.0.2 @@ -18824,7 +18760,7 @@ packages: resolution: {integrity: sha512-es0CcOV89VNS9wFmyn+wyFTKweXGW4CEvdaAca6SWRWPyYCbBisnjaHLjWO4Nszuiud84jCpkHsqAJoa768Pvg==} dependencies: '@types/katex': 0.16.7 - katex: 0.16.19 + katex: 0.16.15 micromark-factory-space: 1.1.0 micromark-util-character: 1.2.0 micromark-util-symbol: 1.1.0 @@ -19456,6 +19392,7 @@ packages: /minipass@6.0.2: resolution: {integrity: sha512-MzWSV5nYVT7mVyWCwn2o7JH13w2TBRmmSqSRCKzTw+lmft9X4z+3wjvs06Tzijo5z4W/kahUCDpRXTF+ZrmF/w==} engines: {node: '>=16 || 14 >=14.17'} + dev: true /minipass@7.1.2: resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} @@ -19523,7 +19460,7 @@ packages: dependencies: acorn: 8.14.0 pathe: 1.1.2 - pkg-types: 1.3.0 + pkg-types: 1.2.1 ufo: 1.5.4 dev: true @@ -19545,7 +19482,7 @@ packages: /mqtt-packet@9.0.1: resolution: {integrity: sha512-koZF1V/X2RZUI6uD9wN5OK1JxxcG1ofAR4H3LjCw1FkeKzruZQ26aAA6v2m1lZyWONZIR5wMMJFrZJDRNzbiQw==} dependencies: - bl: 6.0.18 + bl: 6.0.16 debug: 4.4.0(supports-color@8.1.1) process-nextick-args: 2.0.1 transitivePeerDependencies: @@ -19567,7 +19504,7 @@ packages: minimist: 1.2.8 mqtt-packet: 9.0.1 number-allocator: 1.0.14 - readable-stream: 4.6.0 + readable-stream: 4.5.2 reinterval: 1.1.0 rfdc: 1.4.1 split2: 4.2.0 @@ -19618,13 +19555,13 @@ packages: '@types/cookie': 0.6.0 '@types/statuses': 2.0.5 chalk: 4.1.2 - graphql: 16.10.0 + graphql: 16.9.0 headers-polyfill: 4.0.3 is-node-process: 1.2.0 outvariant: 1.4.3 path-to-regexp: 6.3.0 strict-event-emitter: 0.5.1 - type-fest: 4.31.0 + type-fest: 4.30.0 typescript: 5.5.3 yargs: 17.7.2 dev: true @@ -19772,7 +19709,7 @@ packages: '@next/env': 14.1.0 '@swc/helpers': 0.5.2 busboy: 1.6.0 - caniuse-lite: 1.0.30001690 + caniuse-lite: 1.0.30001688 graceful-fs: 4.2.11 postcss: 8.4.31 react: 18.3.1 @@ -19815,7 +19752,7 @@ packages: '@opentelemetry/api': 1.4.1 '@swc/helpers': 0.5.5 busboy: 1.6.0 - caniuse-lite: 1.0.30001690 + caniuse-lite: 1.0.30001688 graceful-fs: 4.2.11 postcss: 8.4.31 react: 18.3.1 @@ -19845,7 +19782,7 @@ packages: resolution: {integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==} dependencies: lower-case: 2.0.2 - tslib: 2.4.1 + tslib: 2.8.1 dev: false /node-addon-api@7.1.1: @@ -19905,7 +19842,7 @@ packages: resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} dependencies: hosted-git-info: 2.8.9 - resolve: 1.22.10 + resolve: 1.22.8 semver: 5.7.2 validate-npm-package-license: 3.0.4 dev: true @@ -20092,14 +20029,12 @@ packages: engines: {node: '>=0.10.0'} dev: true - /object.assign@4.1.7: - resolution: {integrity: sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==} + /object.assign@4.1.5: + resolution: {integrity: sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==} engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.8 - call-bound: 1.0.3 define-properties: 1.2.1 - es-object-atoms: 1.0.0 has-symbols: 1.1.0 object-keys: 1.1.1 @@ -20138,12 +20073,12 @@ packages: mimic-function: 5.0.1 dev: true - /oniguruma-to-es@0.10.0: - resolution: {integrity: sha512-zapyOUOCJxt+xhiNRPPMtfJkHGsZ98HHB9qJEkdT8BGytO/+kpe4m1Ngf0MzbzTmhacn11w9yGeDP6tzDhnCdg==} + /oniguruma-to-es@0.7.0: + resolution: {integrity: sha512-HRaRh09cE0gRS3+wi2zxekB+I5L8C/gN60S+vb11eADHUaB/q4u8wGGOX3GvwvitG8ixaeycZfeoyruKQzUgNg==} dependencies: emoji-regex-xs: 1.0.0 - regex: 5.1.1 - regex-recursion: 5.1.1 + regex: 5.0.2 + regex-recursion: 4.3.0 dev: false /open@8.4.0: @@ -20168,7 +20103,7 @@ packages: resolution: {integrity: sha512-s1cIatOqrrhSj2tmJ4abFYZQK6l5v+V4toO5q1Pa0DyN8mtyqy2I+Qrj5W9vOELEtybIMQs/TBZGVO/DtTFK8w==} dependencies: '@types/json-schema': 7.0.15 - fast-xml-parser: 4.5.1 + fast-xml-parser: 4.5.0 json-pointer: 0.6.2 dev: false @@ -20191,7 +20126,7 @@ packages: /openapi3-ts@4.4.0: resolution: {integrity: sha512-9asTNB9IkKEzWMcHmVZE7Ts3kC9G7AFHfs8i7caD8HbI76gEjdkId4z/AkP83xdZsH7PLAnnbl47qZkXuxpArw==} dependencies: - yaml: 2.7.0 + yaml: 2.6.1 dev: false /opener@1.5.2: @@ -20229,7 +20164,7 @@ packages: resolution: {integrity: sha512-ERAyNnZOfqM+Ao3RAvIXkYh5joP220yf59gVe2X/cI6SiCxIdi4c9HZKZD8R6q/RDXEje1THBju6iExiSsgJaQ==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} dependencies: - chalk: 5.4.1 + chalk: 5.3.0 cli-cursor: 4.0.0 cli-spinners: 2.9.2 is-interactive: 2.0.0 @@ -20253,14 +20188,6 @@ packages: resolution: {integrity: sha512-+Sl2UErvtsoajRDKCE5/dBz4DIvHXQQnAxtQTF04OJxY0+DyZXSo5P5Bb7XYWOh81syohlYL24hbDwxedPUJCA==} dev: true - /own-keys@1.0.1: - resolution: {integrity: sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==} - engines: {node: '>= 0.4'} - dependencies: - get-intrinsic: 1.2.6 - object-keys: 1.1.1 - safe-push-apply: 1.0.0 - /p-any@4.0.0: resolution: {integrity: sha512-S/B50s+pAVe0wmEZHmBs/9yJXeZ5KhHzOsgKzt0hRdgkoR3DxW9ts46fcsWi/r3VnzsnkKS7q4uimze+zjdryw==} engines: {node: '>=12.20'} @@ -20305,8 +20232,8 @@ packages: yocto-queue: 1.1.1 dev: true - /p-limit@6.2.0: - resolution: {integrity: sha512-kuUqqHNUqoIWp/c467RI4X6mmyuojY5jGutNU0wVTmEOOfcuwLqyMVoAi9MKi2Ak+5i9+nhmrK4ufZE8069kHA==} + /p-limit@6.1.0: + resolution: {integrity: sha512-H0jc0q1vOzlEk0TqAKXKZxdl7kX3OFUzCnNVUnq5Pc3DGo0kpeaMuPqxQn235HibwBEb0/pm9dgKTjXy66fBkg==} engines: {node: '>=18'} dependencies: yocto-queue: 1.1.1 @@ -20448,10 +20375,11 @@ packages: is-hexadecimal: 1.0.4 dev: false - /parse-entities@4.0.2: - resolution: {integrity: sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw==} + /parse-entities@4.0.1: + resolution: {integrity: sha512-SWzvYcSJh4d/SGLIOQfZ/CoNv6BTlI6YEQ7Nj82oDVnRpwe/Z/F1EMx42x3JAOwGBlCjeCH0BRJQbQ/opHL17w==} dependencies: '@types/unist': 2.0.11 + character-entities: 2.0.2 character-entities-legacy: 3.0.0 character-reference-invalid: 2.0.1 decode-named-character-reference: 1.0.2 @@ -20555,7 +20483,7 @@ packages: engines: {node: '>=16 || 14 >=14.18'} dependencies: lru-cache: 10.4.3 - minipass: 6.0.2 + minipass: 7.1.2 /path-to-regexp@0.1.12: resolution: {integrity: sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==} @@ -20642,8 +20570,8 @@ packages: find-up: 4.1.0 dev: true - /pkg-types@1.3.0: - resolution: {integrity: sha512-kS7yWjVFCkIw9hqdJBoMxDdzEngmkr5FXeWZZfQ6GoYacjVnsW6l2CcYW/0ThD0vF4LPJgVYnrg4d0uuhwYQbg==} + /pkg-types@1.2.1: + resolution: {integrity: sha512-sQoqa8alT3nHjGuTjuKgOnvjo4cljkufdtLMnO2LBP/wRwuDlo1tkaEdMxCRhyGRPacv/ztlZgDPm2b7FAmEvw==} dependencies: confbox: 0.1.8 mlly: 1.7.3 @@ -20685,7 +20613,7 @@ packages: postcss: 8.4.49 postcss-value-parser: 4.2.0 read-cache: 1.0.0 - resolve: 1.22.10 + resolve: 1.22.8 /postcss-js@4.0.1(postcss@8.4.49): resolution: {integrity: sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==} @@ -20711,7 +20639,7 @@ packages: lilconfig: 3.1.3 postcss: 8.4.49 ts-node: 10.9.2(@types/node@20.14.9)(typescript@5.5.3) - yaml: 2.7.0 + yaml: 2.6.1 /postcss-nested@6.2.0(postcss@8.4.49): resolution: {integrity: sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==} @@ -20761,7 +20689,7 @@ packages: dependencies: nanoid: 3.3.8 picocolors: 1.1.1 - source-map-js: 1.0.2 + source-map-js: 1.2.1 dev: false /postcss@8.4.38: @@ -20794,7 +20722,7 @@ packages: dependencies: core-js: 3.39.0 fflate: 0.4.8 - preact: 10.25.4 + preact: 10.25.2 web-vitals: 4.2.4 dev: false @@ -20818,8 +20746,8 @@ packages: - debug dev: false - /preact@10.25.4: - resolution: {integrity: sha512-jLdZDb+Q+odkHJ+MpW/9U5cODzqnB+fy2EiHSZES7ldV5LK7yjlVzTp7R8Xy6W6y75kfK8iWYtFVH7lvjwrCMA==} + /preact@10.25.2: + resolution: {integrity: sha512-GEts1EH3oMnqdOIeXhlbBSddZ9nrINd070WBOiPO2ous1orrKGUM4SMDbwyjSWD1iMS2dBvaDjAa5qUhz3TXqw==} dev: false /preferred-pm@3.1.4: @@ -21190,7 +21118,7 @@ packages: dependencies: react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - ua-parser-js: 0.7.40 + ua-parser-js: 0.7.39 dev: false /react-dom@18.2.0(react@18.2.0): @@ -21237,7 +21165,7 @@ packages: react-is: 18.1.0 dev: false - /react-email@2.1.1(@babel/core@7.26.0)(eslint@9.17.0)(ts-node@10.9.2): + /react-email@2.1.1(@babel/core@7.26.0)(eslint@9.16.0)(ts-node@10.9.2): resolution: {integrity: sha512-09oMVl/jN0/Re0bT0sEqYjyyFSCN/Tg0YmzjC9wfYpnMx02Apk40XXitySDfUBMR9EgTdr6T4lYknACqiLK3mg==} engines: {node: '>=18.0.0'} hasBin: true @@ -21263,8 +21191,8 @@ packages: commander: 11.1.0 debounce: 2.0.0 esbuild: 0.19.11 - eslint-config-prettier: 9.0.0(eslint@9.17.0) - eslint-config-turbo: 1.10.12(eslint@9.17.0) + eslint-config-prettier: 9.0.0(eslint@9.16.0) + eslint-config-turbo: 1.10.12(eslint@9.16.0) framer-motion: 10.17.4(react-dom@18.3.1)(react@18.3.1) glob: 10.3.4 log-symbols: 4.1.0 @@ -21309,8 +21237,8 @@ packages: react: 18.3.1 dev: false - /react-hook-form@7.54.2(react@18.3.1): - resolution: {integrity: sha512-eHpAUgUjWbZocoQYUHposymRb4ZP6d0uwUnooL2uOybA9/3tPUvoAKqEWK1WaSiTxxOfTpffNZP7QwlnM3/gEg==} + /react-hook-form@7.54.0(react@18.3.1): + resolution: {integrity: sha512-PS05+UQy/IdSbJNojBypxAo9wllhHgGmyr8/dyGQcPoiMf3e7Dfb9PWYVRco55bLbxH9S+1yDDJeTdlYCSxO3A==} engines: {node: '>=18.0.0'} peerDependencies: react: ^16.8.0 || ^17 || ^18 || ^19 @@ -21355,8 +21283,8 @@ packages: - supports-color dev: false - /react-medium-image-zoom@5.2.13(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-KcBL4OsoUQJgIFh6vQgt/6sRGqDy6bQBcsbhGD2tsy4B5Pw3dWrboocVOyIm76RRALEZ6Qwp3EDvIvfEv0m5sg==} + /react-medium-image-zoom@5.2.12(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-BbQ9jLBFxu6z+viH5tzQzAGqHOJQoYUM7iT1KUkamWKOO6vR1pC33os7LGLrHvOcyySMw74rUdoUCXFdeglwCQ==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 @@ -21382,6 +21310,21 @@ packages: scheduler: 0.23.2 dev: true + /react-remove-scroll-bar@2.3.6(@types/react@18.3.11)(react@18.3.1): + resolution: {integrity: sha512-DtSYaao4mBmX+HDo5YWYdBWQwYIQQshUV/dVxFxK+KM26Wjwp1gZ6rv6OC3oujI6Bfu6Xyg3TwK533AQutsn/g==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@types/react': 18.3.11 + react: 18.3.1 + react-style-singleton: 2.2.1(@types/react@18.3.11)(react@18.3.1) + tslib: 2.8.1 + /react-remove-scroll-bar@2.3.8(@types/react@18.3.11)(react@18.3.1): resolution: {integrity: sha512-9r+yi9+mgU33AKcj6IbT9oRCO78WriSj6t/cF8DWBZJ9aOGPOTEDvdUDz1FwKim7QXWwmHqtdHnRJfhAxEG46Q==} engines: {node: '>=10'} @@ -21396,6 +21339,7 @@ packages: react: 18.3.1 react-style-singleton: 2.2.3(@types/react@18.3.11)(react@18.3.1) tslib: 2.8.1 + dev: false /react-remove-scroll@2.5.4(react@18.3.1): resolution: {integrity: sha512-xGVKJJr0SJGQVirVFAUZ2k1QLyO6m+2fy0l8Qawbp5Jgrv3DeLalrfMNBFSlmz5kriGGzsVBtGVnf4pTKIhhWA==} @@ -21408,11 +21352,11 @@ packages: optional: true dependencies: react: 18.3.1 - react-remove-scroll-bar: 2.3.8(@types/react@18.3.11)(react@18.3.1) - react-style-singleton: 2.2.3(@types/react@18.3.11)(react@18.3.1) + react-remove-scroll-bar: 2.3.6(@types/react@18.3.11)(react@18.3.1) + react-style-singleton: 2.2.1(@types/react@18.3.11)(react@18.3.1) tslib: 2.8.1 - use-callback-ref: 1.3.3(@types/react@18.3.11)(react@18.3.1) - use-sidecar: 1.1.3(@types/react@18.3.11)(react@18.3.1) + use-callback-ref: 1.3.2(@types/react@18.3.11)(react@18.3.1) + use-sidecar: 1.1.2(@types/react@18.3.11)(react@18.3.1) dev: true /react-remove-scroll@2.5.5(@types/react@18.3.11)(react@18.3.1): @@ -21427,11 +21371,11 @@ packages: dependencies: '@types/react': 18.3.11 react: 18.3.1 - react-remove-scroll-bar: 2.3.8(@types/react@18.3.11)(react@18.3.1) - react-style-singleton: 2.2.3(@types/react@18.3.11)(react@18.3.1) + react-remove-scroll-bar: 2.3.6(@types/react@18.3.11)(react@18.3.1) + react-style-singleton: 2.2.1(@types/react@18.3.11)(react@18.3.1) tslib: 2.8.1 - use-callback-ref: 1.3.3(@types/react@18.3.11)(react@18.3.1) - use-sidecar: 1.1.3(@types/react@18.3.11)(react@18.3.1) + use-callback-ref: 1.3.2(@types/react@18.3.11)(react@18.3.1) + use-sidecar: 1.1.2(@types/react@18.3.11)(react@18.3.1) dev: false /react-remove-scroll@2.5.7(@types/react@18.3.11)(react@18.3.1): @@ -21446,13 +21390,31 @@ packages: dependencies: '@types/react': 18.3.11 react: 18.3.1 - react-remove-scroll-bar: 2.3.8(@types/react@18.3.11)(react@18.3.1) - react-style-singleton: 2.2.3(@types/react@18.3.11)(react@18.3.1) + react-remove-scroll-bar: 2.3.6(@types/react@18.3.11)(react@18.3.1) + react-style-singleton: 2.2.1(@types/react@18.3.11)(react@18.3.1) tslib: 2.8.1 - use-callback-ref: 1.3.3(@types/react@18.3.11)(react@18.3.1) - use-sidecar: 1.1.3(@types/react@18.3.11)(react@18.3.1) + use-callback-ref: 1.3.2(@types/react@18.3.11)(react@18.3.1) + use-sidecar: 1.1.2(@types/react@18.3.11)(react@18.3.1) dev: false + /react-remove-scroll@2.6.0(@types/react@18.3.11)(react@18.3.1): + resolution: {integrity: sha512-I2U4JVEsQenxDAKaVa3VZ/JeJZe0/2DxPWL8Tj8yLKctQJQiZM52pn/GWFpSp8dftjM3pSAHVJZscAnC/y+ySQ==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@types/react': 18.3.11 + react: 18.3.1 + react-remove-scroll-bar: 2.3.6(@types/react@18.3.11)(react@18.3.1) + react-style-singleton: 2.2.1(@types/react@18.3.11)(react@18.3.1) + tslib: 2.8.1 + use-callback-ref: 1.3.2(@types/react@18.3.11)(react@18.3.1) + use-sidecar: 1.1.2(@types/react@18.3.11)(react@18.3.1) + /react-remove-scroll@2.6.2(@types/react@18.3.11)(react@18.3.1): resolution: {integrity: sha512-KmONPx5fnlXYJQqC62Q+lwIeAk64ws/cUw6omIumRzMRPqgnYqhSSti99nbj0Ry13bv7dF+BKn7NB+OqkdZGTw==} engines: {node: '>=10'} @@ -21466,16 +21428,17 @@ packages: '@types/react': 18.3.11 react: 18.3.1 react-remove-scroll-bar: 2.3.8(@types/react@18.3.11)(react@18.3.1) - react-style-singleton: 2.2.3(@types/react@18.3.11)(react@18.3.1) + react-style-singleton: 2.2.1(@types/react@18.3.11)(react@18.3.1) tslib: 2.8.1 use-callback-ref: 1.3.3(@types/react@18.3.11)(react@18.3.1) - use-sidecar: 1.1.3(@types/react@18.3.11)(react@18.3.1) + use-sidecar: 1.1.2(@types/react@18.3.11)(react@18.3.1) + dev: false - /react-smooth@4.0.4(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-gnGKTpYwqL0Iii09gHobNolvX4Kiq4PKx6eWBCYYix+8cdw+cGo3do906l1NBPKkSWx1DghC1dlWG9L2uGd61Q==} + /react-smooth@4.0.3(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-PyxIrra8WZWrMRFcCiJsZ+JqFaxEINAt+v/w++wQKQlmO99Eh3+JTLeKApdTsLX2roBdWYXqPsaS8sO4UmdzIg==} peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 dependencies: fast-equals: 5.0.1 prop-types: 15.8.1 @@ -21484,6 +21447,22 @@ packages: react-transition-group: 4.4.5(react-dom@18.3.1)(react@18.3.1) dev: false + /react-style-singleton@2.2.1(@types/react@18.3.11)(react@18.3.1): + resolution: {integrity: sha512-ZWj0fHEMyWkHzKYUr2Bs/4zU6XLmq9HsgBURm7g5pAVfyn49DgUiNgY2d4lXRlYSiCif9YBGpQleewkcqddc7g==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@types/react': 18.3.11 + get-nonce: 1.0.1 + invariant: 2.2.4 + react: 18.3.1 + tslib: 2.8.1 + /react-style-singleton@2.2.3(@types/react@18.3.11)(react@18.3.1): resolution: {integrity: sha512-b6jSvxvVnyptAiLjbkWLE/lOnR4lfTtDAl+eUC7RZy+QQWc6wRzIV2CE6xBuMmDxc2qIihtDCZD5NPOFl7fRBQ==} engines: {node: '>=10'} @@ -21498,6 +21477,7 @@ packages: get-nonce: 1.0.1 react: 18.3.1 tslib: 2.8.1 + dev: false /react-syntax-highlighter@15.5.0(react@18.3.1): resolution: {integrity: sha512-+zq2myprEnQmH5yw6Gqc8lD55QHnpKaU8TOcFeC/Lg/MQSs8UknEA0JC4nTZGFAXC2J2Hyj/ijJ7NlabyPi2gg==} @@ -21643,8 +21623,8 @@ packages: string_decoder: 1.3.0 util-deprecate: 1.0.2 - /readable-stream@4.6.0: - resolution: {integrity: sha512-cbAdYt0VcnpN2Bekq7PU+k363ZRsPwJoEEJOEtSJQlJXzwaxt3FIo/uL+KeDSGIjJqtkwyge4KQgD2S2kd+CQw==} + /readable-stream@4.5.2: + resolution: {integrity: sha512-yjavECdqeZ3GLXNgRXgeQEdz9fvDDkNKyHnbHRFtOr7/LcfgBcmct7t/ET+HaCTqfh06OzoAxrkN/IfjJBVe+g==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: abort-controller: 3.0.0 @@ -21700,7 +21680,7 @@ packages: react: 18.3.1 react-dom: 18.3.1(react@18.3.1) react-is: 16.13.1 - react-smooth: 4.0.4(react-dom@18.3.1)(react@18.3.1) + react-smooth: 4.0.3(react-dom@18.3.1)(react@18.3.1) recharts-scale: 0.4.5 tiny-invariant: 1.3.3 victory-vendor: 36.9.2 @@ -21710,7 +21690,7 @@ packages: resolution: {integrity: sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==} engines: {node: '>= 0.10'} dependencies: - resolve: 1.22.10 + resolve: 1.22.8 dev: false /recma-build-jsx@1.0.0: @@ -21779,18 +21759,18 @@ packages: resolution: {integrity: sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q==} dev: true - /reflect.getprototypeof@1.0.9: - resolution: {integrity: sha512-r0Ay04Snci87djAsI4U+WNRcSw5S4pOH7qFjd/veA5gC7TbqESR3tcj28ia95L/fYUDw11JKP7uqUKUAfVvV5Q==} + /reflect.getprototypeof@1.0.8: + resolution: {integrity: sha512-B5dj6usc5dkk8uFliwjwDHM8To5/QwdKz9JcBZ8Ic4G1f0YmeeJTtE/ZTdgRFPAfxZFiUaPhZ1Jcs4qeagItGQ==} engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.8 define-properties: 1.2.1 - dunder-proto: 1.0.1 - es-abstract: 1.23.8 + dunder-proto: 1.0.0 + es-abstract: 1.23.5 es-errors: 1.3.0 get-intrinsic: 1.2.6 gopd: 1.2.0 - which-builtin-type: 1.2.1 + which-builtin-type: 1.2.0 /refractor@3.6.0: resolution: {integrity: sha512-MY9W41IOWxxk31o+YvFCNyNzdkc9M20NoZK5vq6jkv4I/uh2zkWcfudj0Q1fovjUQJrNewS9NMzeTtqPf+n5EA==} @@ -21806,16 +21786,15 @@ packages: '@types/hast': 2.3.10 '@types/prismjs': 1.26.5 hastscript: 7.2.0 - parse-entities: 4.0.2 + parse-entities: 4.0.1 dev: true /regenerator-runtime@0.14.1: resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} - /regex-recursion@5.1.1: - resolution: {integrity: sha512-ae7SBCbzVNrIjgSbh7wMznPcQel1DNlDtzensnFxpiNpXt1U2ju/bHugH422r+4LAVS1FpW1YCwilmnNsjum9w==} + /regex-recursion@4.3.0: + resolution: {integrity: sha512-5LcLnizwjcQ2ALfOj95MjcatxyqF5RPySx9yT+PaXu3Gox2vyAtLDjHB8NTJLtMGkvyau6nI3CfpwFCjPUIs/A==} dependencies: - regex: 5.1.1 regex-utilities: 2.3.0 dev: false @@ -21823,8 +21802,8 @@ packages: resolution: {integrity: sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng==} dev: false - /regex@5.1.1: - resolution: {integrity: sha512-dN5I359AVGPnwzJm2jN1k0W9LPZ+ePvoOeVMMfqIMFz53sSwXkxaJoxr50ptnsC771lK95BnTrVSZxq0b9yCGw==} + /regex@5.0.2: + resolution: {integrity: sha512-/pczGbKIQgfTMRV0XjABvc5RzLqQmwqxLHdQao2RTXPk+pmTXB2P0IaUHYdYyk412YLwUIkaeMd5T+RzVgTqnQ==} dependencies: regex-utilities: 2.3.0 dev: false @@ -21845,7 +21824,7 @@ packages: '@types/katex': 0.14.0 hast-util-from-html-isomorphic: 1.0.0 hast-util-to-text: 3.1.2 - katex: 0.16.19 + katex: 0.16.15 unist-util-visit: 4.1.2 dev: true @@ -21944,7 +21923,7 @@ packages: estree-util-value-to-estree: 3.2.1 toml: 3.0.0 unified: 11.0.5 - yaml: 2.7.0 + yaml: 2.6.1 dev: true /remark-mdx@2.3.0: @@ -22057,6 +22036,7 @@ packages: /require-from-string@2.0.2: resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} engines: {node: '>=0.10.0'} + dev: true /require-in-the-middle@7.4.0: resolution: {integrity: sha512-X34iHADNbNDfr6OTStIAHWSAvvKQRYgLO6duASaVf7J2VA3lvmNYboAHOuLC2huav1IwgZJtyEcJCKVzFxOSMQ==} @@ -22064,7 +22044,7 @@ packages: dependencies: debug: 4.4.0(supports-color@8.1.1) module-details-from-path: 1.0.3 - resolve: 1.22.10 + resolve: 1.22.8 transitivePeerDependencies: - supports-color @@ -22116,23 +22096,13 @@ packages: engines: {node: '>=10'} dev: true - /resolve@1.22.10: - resolution: {integrity: sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==} - engines: {node: '>= 0.4'} - hasBin: true - dependencies: - is-core-module: 2.16.1 - path-parse: 1.0.7 - supports-preserve-symlinks-flag: 1.0.0 - /resolve@1.22.8: resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} hasBin: true dependencies: - is-core-module: 2.16.1 + is-core-module: 2.15.1 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 - dev: true /responselike@3.0.0: resolution: {integrity: sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg==} @@ -22269,32 +22239,32 @@ packages: source-map-support: 0.3.3 dev: false - /rollup@4.29.1: - resolution: {integrity: sha512-RaJ45M/kmJUzSWDs1Nnd5DdV4eerC98idtUOVr6FfKcgxqvjwHmxc5upLF9qZU9EpsVzzhleFahrT3shLuJzIw==} + /rollup@4.28.1: + resolution: {integrity: sha512-61fXYl/qNVinKmGSTHAZ6Yy8I3YIJC/r2m9feHo6SwVAVcLT5MPwOUFe7EuURA/4m0NR8lXG4BBXuo/IZEsjMg==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true dependencies: '@types/estree': 1.0.6 optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.29.1 - '@rollup/rollup-android-arm64': 4.29.1 - '@rollup/rollup-darwin-arm64': 4.29.1 - '@rollup/rollup-darwin-x64': 4.29.1 - '@rollup/rollup-freebsd-arm64': 4.29.1 - '@rollup/rollup-freebsd-x64': 4.29.1 - '@rollup/rollup-linux-arm-gnueabihf': 4.29.1 - '@rollup/rollup-linux-arm-musleabihf': 4.29.1 - '@rollup/rollup-linux-arm64-gnu': 4.29.1 - '@rollup/rollup-linux-arm64-musl': 4.29.1 - '@rollup/rollup-linux-loongarch64-gnu': 4.29.1 - '@rollup/rollup-linux-powerpc64le-gnu': 4.29.1 - '@rollup/rollup-linux-riscv64-gnu': 4.29.1 - '@rollup/rollup-linux-s390x-gnu': 4.29.1 - '@rollup/rollup-linux-x64-gnu': 4.29.1 - '@rollup/rollup-linux-x64-musl': 4.29.1 - '@rollup/rollup-win32-arm64-msvc': 4.29.1 - '@rollup/rollup-win32-ia32-msvc': 4.29.1 - '@rollup/rollup-win32-x64-msvc': 4.29.1 + '@rollup/rollup-android-arm-eabi': 4.28.1 + '@rollup/rollup-android-arm64': 4.28.1 + '@rollup/rollup-darwin-arm64': 4.28.1 + '@rollup/rollup-darwin-x64': 4.28.1 + '@rollup/rollup-freebsd-arm64': 4.28.1 + '@rollup/rollup-freebsd-x64': 4.28.1 + '@rollup/rollup-linux-arm-gnueabihf': 4.28.1 + '@rollup/rollup-linux-arm-musleabihf': 4.28.1 + '@rollup/rollup-linux-arm64-gnu': 4.28.1 + '@rollup/rollup-linux-arm64-musl': 4.28.1 + '@rollup/rollup-linux-loongarch64-gnu': 4.28.1 + '@rollup/rollup-linux-powerpc64le-gnu': 4.28.1 + '@rollup/rollup-linux-riscv64-gnu': 4.28.1 + '@rollup/rollup-linux-s390x-gnu': 4.28.1 + '@rollup/rollup-linux-x64-gnu': 4.28.1 + '@rollup/rollup-linux-x64-musl': 4.28.1 + '@rollup/rollup-win32-arm64-msvc': 4.28.1 + '@rollup/rollup-win32-ia32-msvc': 4.28.1 + '@rollup/rollup-win32-x64-msvc': 4.28.1 fsevents: 2.3.3 dev: true @@ -22345,7 +22315,7 @@ packages: engines: {node: '>=0.4'} dependencies: call-bind: 1.0.8 - call-bound: 1.0.3 + call-bound: 1.0.2 get-intrinsic: 1.2.6 has-symbols: 1.1.0 isarray: 2.0.5 @@ -22357,18 +22327,11 @@ packages: /safe-buffer@5.2.1: resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} - /safe-push-apply@1.0.0: - resolution: {integrity: sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==} - engines: {node: '>= 0.4'} - dependencies: - es-errors: 1.3.0 - isarray: 2.0.5 - - /safe-regex-test@1.1.0: - resolution: {integrity: sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==} + /safe-regex-test@1.0.3: + resolution: {integrity: sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==} engines: {node: '>= 0.4'} dependencies: - call-bound: 1.0.3 + call-bind: 1.0.8 es-errors: 1.3.0 is-regex: 1.2.1 @@ -22409,16 +22372,6 @@ packages: ajv-keywords: 3.5.2(ajv@6.12.6) dev: false - /schema-utils@4.3.0: - resolution: {integrity: sha512-Gf9qqc58SpCA/xdziiHz35F4GNIWYWZrEshUc/G/r5BnLph6xpKuLeoJoQuj5WfBIx/eQLf+hmVPYHaxJu7V2g==} - engines: {node: '>= 10.13.0'} - dependencies: - '@types/json-schema': 7.0.15 - ajv: 8.17.1 - ajv-formats: 2.1.1(ajv@8.17.1) - ajv-keywords: 5.1.0(ajv@8.17.1) - dev: false - /scroll-into-view-if-needed@3.1.0: resolution: {integrity: sha512-49oNpRjWRvnU8NyGVmUaYG4jtTkNonFZI86MmGRDqBphEK2EXT9gdEUoQPZhuBM8yWHxCWbobltqYO5M4XrUvQ==} dependencies: @@ -22618,15 +22571,13 @@ packages: '@types/hast': 3.0.4 dev: false - /shiki@1.25.1: - resolution: {integrity: sha512-/1boRvNYwRW3GLG9Y6dXdnZ/Ha+J5T/5y3hV7TGQUcDSBM185D3FCbXlz2eTGNKG2iWCbWqo+P0yhGKZ4/CUrw==} + /shiki@1.24.2: + resolution: {integrity: sha512-TR1fi6mkRrzW+SKT5G6uKuc32Dj2EEa7Kj0k8kGqiBINb+C1TiflVOiT9ta6GqOJtC4fraxO5SLUaKBcSY38Fg==} dependencies: - '@shikijs/core': 1.25.1 - '@shikijs/engine-javascript': 1.25.1 - '@shikijs/engine-oniguruma': 1.25.1 - '@shikijs/langs': 1.25.1 - '@shikijs/themes': 1.25.1 - '@shikijs/types': 1.25.1 + '@shikijs/core': 1.24.2 + '@shikijs/engine-javascript': 1.24.2 + '@shikijs/engine-oniguruma': 1.24.2 + '@shikijs/types': 1.24.2 '@shikijs/vscode-textmate': 9.3.1 '@types/hast': 3.0.4 dev: false @@ -22645,7 +22596,7 @@ packages: resolution: {integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==} engines: {node: '>= 0.4'} dependencies: - call-bound: 1.0.3 + call-bound: 1.0.2 es-errors: 1.3.0 get-intrinsic: 1.2.6 object-inspect: 1.13.3 @@ -22654,7 +22605,7 @@ packages: resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==} engines: {node: '>= 0.4'} dependencies: - call-bound: 1.0.3 + call-bound: 1.0.2 es-errors: 1.3.0 get-intrinsic: 1.2.6 object-inspect: 1.13.3 @@ -22748,7 +22699,7 @@ packages: engines: {node: '>=6'} hasBin: true dependencies: - array.prototype.flat: 1.3.3 + array.prototype.flat: 1.3.2 breakword: 1.0.6 grapheme-splitter: 1.0.4 strip-ansi: 6.0.1 @@ -22765,7 +22716,7 @@ packages: resolution: {integrity: sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==} dependencies: dot-case: 3.0.4 - tslib: 2.4.1 + tslib: 2.8.1 dev: false /snakecase-keys@3.2.1: @@ -23047,12 +22998,12 @@ packages: nan: 2.22.0 dev: true - /sswr@2.1.0(svelte@5.16.0): + /sswr@2.1.0(svelte@5.11.2): resolution: {integrity: sha512-Cqc355SYlTAaUt8iDPaC/4DPPXK925PePLMxyBKuWd5kKc5mwsG3nT9+Mq2tyguL5s7b4Jg+IRMpTRsNTAfpSQ==} peerDependencies: svelte: ^4.0.0 || ^5.0.0-next.0 dependencies: - svelte: 5.16.0 + svelte: 5.11.2 swrev: 4.0.0 dev: false @@ -23105,12 +23056,12 @@ packages: resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==} engines: {node: '>=10.0.0'} - /streamx@2.21.1: - resolution: {integrity: sha512-PhP9wUnFLa+91CPy3N6tiQsK+gnYyUNuk15S3YG/zjYE7RuPeCjJngqnzpC31ow0lzBHQ+QGO4cNJnd0djYUsw==} + /streamx@2.21.0: + resolution: {integrity: sha512-Qz6MsDZXJ6ur9u+b+4xCG18TluU7PGlRfXVAAjNiGsFrBUt/ioyLkxbFaKJygoPs+/kW4VyBj0bSj89Qu0IGyg==} dependencies: fast-fifo: 1.3.2 queue-tick: 1.0.1 - text-decoder: 1.2.3 + text-decoder: 1.2.2 optionalDependencies: bare-events: 2.5.0 dev: true @@ -23162,10 +23113,10 @@ packages: engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.8 - call-bound: 1.0.3 + call-bound: 1.0.2 define-data-property: 1.1.4 define-properties: 1.2.1 - es-abstract: 1.23.8 + es-abstract: 1.23.5 es-object-atoms: 1.0.0 has-property-descriptors: 1.0.2 @@ -23174,7 +23125,7 @@ packages: engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.8 - call-bound: 1.0.3 + call-bound: 1.0.2 define-properties: 1.2.1 es-object-atoms: 1.0.0 @@ -23405,8 +23356,8 @@ packages: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} - /svelte@5.16.0: - resolution: {integrity: sha512-Ygqsiac6UogVED2ruKclU+pOeMThxWtp9LG+li7BXeDKC2paVIsRTMkNmcON4Zejerd1s5sZHWx6ZtU85xklVg==} + /svelte@5.11.2: + resolution: {integrity: sha512-kGWswlBaohYxZHML9jp8ZYXkwjKd+WTpyAK1CCDmNzsefZHQjvsa7kbrKUckcFloNmdzwQwaZq+NyunuNOE6lw==} engines: {node: '>=18'} dependencies: '@ampproject/remapping': 2.3.0 @@ -23416,12 +23367,11 @@ packages: acorn-typescript: 1.4.13(acorn@8.14.0) aria-query: 5.3.2 axobject-query: 4.1.0 - clsx: 2.1.1 esm-env: 1.2.1 - esrap: 1.3.2 + esrap: 1.2.3 is-reference: 3.0.3 locate-character: 3.0.0 - magic-string: 0.30.17 + magic-string: 0.30.15 zimmerframe: 1.1.2 dev: false @@ -23487,8 +23437,8 @@ packages: resolution: {integrity: sha512-0q8cfZHMu9nuYP/b5Shb7Y7Sh1B7Nnl5GqNr1U+n2p6+mybvRtayrQ+0042Z5byvTA8ihjlP8Odo8/VnHbZu4Q==} dev: false - /tailwind-merge@2.6.0: - resolution: {integrity: sha512-P+Vu1qXfzediirmHOC3xKGAYeZtPcV9g76X+xg2FD4tYgR71ewMA35Y3sCz3zhiN/dwefRpJX0yBcgwi1fXNQA==} + /tailwind-merge@2.5.5: + resolution: {integrity: sha512-0LXunzzAZzo0tEPxV3I297ffKZPlKDrjj7NXphC8V5ak9yHC5zRmxnOe2m/Rd/7ivsOMJe3JZ2JVocoDdQTRBA==} dev: false /tailwind-scrollbar@3.1.0(tailwindcss@3.4.15): @@ -23521,7 +23471,7 @@ packages: fast-glob: 3.3.2 glob-parent: 6.0.2 is-glob: 4.0.3 - jiti: 1.21.7 + jiti: 1.21.6 lilconfig: 2.1.0 micromatch: 4.0.8 normalize-path: 3.0.0 @@ -23533,7 +23483,7 @@ packages: postcss-load-config: 4.0.2(postcss@8.4.49)(ts-node@10.9.2) postcss-nested: 6.2.0(postcss@8.4.49) postcss-selector-parser: 6.1.2 - resolve: 1.22.10 + resolve: 1.22.8 sucrase: 3.35.0 transitivePeerDependencies: - ts-node @@ -23552,7 +23502,7 @@ packages: fast-glob: 3.3.2 glob-parent: 6.0.2 is-glob: 4.0.3 - jiti: 1.21.7 + jiti: 1.21.6 lilconfig: 2.1.0 micromatch: 4.0.8 normalize-path: 3.0.0 @@ -23564,7 +23514,7 @@ packages: postcss-load-config: 4.0.2(postcss@8.4.49)(ts-node@10.9.2) postcss-nested: 6.2.0(postcss@8.4.49) postcss-selector-parser: 6.1.2 - resolve: 1.22.10 + resolve: 1.22.8 sucrase: 3.35.0 transitivePeerDependencies: - ts-node @@ -23592,7 +23542,7 @@ packages: minimist: 1.2.8 mock-property: 1.0.3 object-inspect: 1.12.3 - resolve: 1.22.10 + resolve: 1.22.8 string.prototype.trim: 1.2.10 dev: false @@ -23631,7 +23581,7 @@ packages: dependencies: b4a: 1.6.7 fast-fifo: 1.3.2 - streamx: 2.21.1 + streamx: 2.21.0 dev: true /tar@6.2.1: @@ -23671,8 +23621,8 @@ packages: supports-hyperlinks: 2.3.0 dev: false - /terser-webpack-plugin@5.3.11(@swc/core@1.3.101)(esbuild@0.19.11)(webpack@5.97.1): - resolution: {integrity: sha512-RVCsMfuD0+cTt3EwX8hSl2Ks56EbFHWmhluwcqoPKtBnfjiT6olaq7PRIRfhyU8nnC2MrnDrBLfrD/RGE+cVXQ==} + /terser-webpack-plugin@5.3.10(@swc/core@1.3.101)(esbuild@0.19.11)(webpack@5.97.1): + resolution: {integrity: sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==} engines: {node: '>= 10.13.0'} peerDependencies: '@swc/core': '*' @@ -23691,7 +23641,7 @@ packages: '@swc/core': 1.3.101 esbuild: 0.19.11 jest-worker: 27.5.1 - schema-utils: 4.3.0 + schema-utils: 3.3.0 serialize-javascript: 6.0.2 terser: 5.37.0 webpack: 5.97.1(@swc/core@1.3.101)(esbuild@0.19.11) @@ -23730,8 +23680,8 @@ packages: - supports-color dev: true - /text-decoder@1.2.3: - resolution: {integrity: sha512-3/o9z3X0X0fTupwsYvR03pJ/DjWuqqrfwBgTQzdWDiQSm9KitAyz/9WqsT2JQW7KV2m+bC2ol/zqpW37NHxLaA==} + /text-decoder@1.2.2: + resolution: {integrity: sha512-/MDslo7ZyWTA2vnk1j7XoDVfXsGk3tp+zFEJHJGm0UjIlQifonVFwlVbQDFh8KJzTBnT8ie115TYqir6bclddA==} dependencies: b4a: 1.6.7 dev: true @@ -23846,7 +23796,7 @@ packages: dependencies: gopd: 1.2.0 typedarray.prototype.slice: 1.0.3 - which-typed-array: 1.1.18 + which-typed-array: 1.1.16 dev: true /tree-kill@1.2.2: @@ -23884,10 +23834,10 @@ packages: '@onetyped/zod': 1.0.1(@onetyped/core@0.1.1)(zod@3.23.8) '@trpc/server': 10.45.2 bundle-require: 4.2.1(esbuild@0.18.20) - chalk: 5.4.1 + chalk: 5.3.0 cli-truncate: 3.1.0 clipanion: 3.2.1(typanion@3.14.0) - consola: 3.3.3 + consola: 3.2.3 defu: 6.1.4 diff: 5.2.0 esbuild: 0.18.20 @@ -24034,7 +23984,7 @@ packages: joycon: 3.1.1 postcss-load-config: 4.0.2(postcss@8.4.49)(ts-node@10.9.2) resolve-from: 5.0.0 - rollup: 4.29.1 + rollup: 4.28.1 source-map: 0.8.0-beta.0 sucrase: 3.35.0 tree-kill: 1.2.2 @@ -24210,8 +24160,8 @@ packages: engines: {node: '>=12.20'} dev: false - /type-fest@4.31.0: - resolution: {integrity: sha512-yCxltHW07Nkhv/1F6wWBr8kz+5BGMfP+RbRSYFnegVb0qV/UMT0G0ElBloPVerqn4M2ZV80Ir1FtCcYv1cT6vQ==} + /type-fest@4.30.0: + resolution: {integrity: sha512-G6zXWS1dLj6eagy6sVhOMQiLtJdxQBHIA9Z6HFUNLOlr6MFOgzV8wvmidtPONfPtEUv0uZsy77XJNzTAfwPDaA==} engines: {node: '>=16'} /type-is@1.6.18: @@ -24222,26 +24172,26 @@ packages: mime-types: 2.1.35 dev: true - /typed-array-buffer@1.0.3: - resolution: {integrity: sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==} + /typed-array-buffer@1.0.2: + resolution: {integrity: sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==} engines: {node: '>= 0.4'} dependencies: - call-bound: 1.0.3 + call-bind: 1.0.8 es-errors: 1.3.0 - is-typed-array: 1.1.15 + is-typed-array: 1.1.13 - /typed-array-byte-length@1.0.3: - resolution: {integrity: sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==} + /typed-array-byte-length@1.0.1: + resolution: {integrity: sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==} engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.8 for-each: 0.3.3 gopd: 1.2.0 has-proto: 1.2.0 - is-typed-array: 1.1.15 + is-typed-array: 1.1.13 - /typed-array-byte-offset@1.0.4: - resolution: {integrity: sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==} + /typed-array-byte-offset@1.0.3: + resolution: {integrity: sha512-GsvTyUHTriq6o/bHcTd0vM7OQ9JEdlvluu9YISaA7+KzDzPaIzEeDFNkTfhdE3MYcNhNi0vq/LlegYgIs5yPAw==} engines: {node: '>= 0.4'} dependencies: available-typed-arrays: 1.0.7 @@ -24249,8 +24199,8 @@ packages: for-each: 0.3.3 gopd: 1.2.0 has-proto: 1.2.0 - is-typed-array: 1.1.15 - reflect.getprototypeof: 1.0.9 + is-typed-array: 1.1.13 + reflect.getprototypeof: 1.0.8 /typed-array-length@1.0.7: resolution: {integrity: sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==} @@ -24259,9 +24209,9 @@ packages: call-bind: 1.0.8 for-each: 0.3.3 gopd: 1.2.0 - is-typed-array: 1.1.15 + is-typed-array: 1.1.13 possible-typed-array-names: 1.0.0 - reflect.getprototypeof: 1.0.9 + reflect.getprototypeof: 1.0.8 /typedarray.prototype.slice@1.0.3: resolution: {integrity: sha512-8WbVAQAUlENo1q3c3zZYuy5k9VzBQvp8AX9WOtbvyWlLM1v5JaSRmjubLjzHF4JFtptjH/5c/i95yaElvcjC0A==} @@ -24269,10 +24219,10 @@ packages: dependencies: call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.8 + es-abstract: 1.23.5 es-errors: 1.3.0 - typed-array-buffer: 1.0.3 - typed-array-byte-offset: 1.0.4 + typed-array-buffer: 1.0.2 + typed-array-byte-offset: 1.0.3 dev: true /typedarray@0.0.6: @@ -24305,8 +24255,8 @@ packages: hasBin: true dev: true - /ua-parser-js@0.7.40: - resolution: {integrity: sha512-us1E3K+3jJppDBa3Tl0L3MOJiGhe1C6P0+nIvQAFYbxlMAx0h81eOwLmU57xgqToduDDPx3y5QsdjPfDu+FgOQ==} + /ua-parser-js@0.7.39: + resolution: {integrity: sha512-IZ6acm6RhQHNibSt7+c09hhvsKy9WUr4DVbeq9U8o71qxyYtJpQeDxQnMrVqnIFMLcQjHO0I9wgfO2vIahht4w==} hasBin: true dev: false @@ -24336,14 +24286,13 @@ packages: hasBin: true dev: false - /unbox-primitive@1.1.0: - resolution: {integrity: sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==} - engines: {node: '>= 0.4'} + /unbox-primitive@1.0.2: + resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} dependencies: - call-bound: 1.0.3 - has-bigints: 1.1.0 + call-bind: 1.0.8 + has-bigints: 1.0.2 has-symbols: 1.1.0 - which-boxed-primitive: 1.1.1 + which-boxed-primitive: 1.1.0 /unbzip2-stream@1.4.3: resolution: {integrity: sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==} @@ -24580,13 +24529,13 @@ packages: webpack-virtual-modules: 0.6.2 dev: true - /update-browserslist-db@1.1.1(browserslist@4.24.3): + /update-browserslist-db@1.1.1(browserslist@4.24.2): resolution: {integrity: sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==} hasBin: true peerDependencies: browserslist: '>= 4.21.0' dependencies: - browserslist: 4.24.3 + browserslist: 4.24.2 escalade: 3.2.0 picocolors: 1.1.1 @@ -24607,6 +24556,20 @@ packages: resolution: {integrity: sha512-H/A06tKD7sS1O1X2SshBVeA5FLycRpjqiBeqGKmBwBDBy28EnRjORxTNe269KSSr5un5qyWi1iL61wLxpd+ZOg==} dev: true + /use-callback-ref@1.3.2(@types/react@18.3.11)(react@18.3.1): + resolution: {integrity: sha512-elOQwe6Q8gqZgDA8mrh44qRTQqpIHDcZ3hXTLjBe1i4ph8XpNJnO+aQf3NaG+lriLopI4HMx9VjQLfPQ6vhnoA==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@types/react': 18.3.11 + react: 18.3.1 + tslib: 2.8.1 + /use-callback-ref@1.3.3(@types/react@18.3.11)(react@18.3.1): resolution: {integrity: sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg==} engines: {node: '>=10'} @@ -24620,13 +24583,14 @@ packages: '@types/react': 18.3.11 react: 18.3.1 tslib: 2.8.1 + dev: false - /use-sidecar@1.1.3(@types/react@18.3.11)(react@18.3.1): - resolution: {integrity: sha512-Fedw0aZvkhynoPYlA5WXrMCAMm+nSWdZt6lzJQ7Ok8S6Q+VsHmHpRWndVRJ8Be0ZbkfPc5LRYH+5XrzXcEeLRQ==} + /use-sidecar@1.1.2(@types/react@18.3.11)(react@18.3.1): + resolution: {integrity: sha512-epTbsLuzZ7lPClpz2TyryBfztm7m+28DlEv2ZCQ3MDr5ssiwyOwGH/e5F9CkfWjJ1t4clvI58yF822/GUkjjhw==} engines: {node: '>=10'} peerDependencies: - '@types/react': '*' - react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + '@types/react': ^16.9.0 || ^17.0.0 || ^18.0.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 peerDependenciesMeta: '@types/react': optional: true @@ -24669,10 +24633,10 @@ packages: resolution: {integrity: sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==} dependencies: inherits: 2.0.4 - is-arguments: 1.2.0 + is-arguments: 1.1.1 is-generator-function: 1.0.10 - is-typed-array: 1.1.15 - which-typed-array: 1.1.18 + is-typed-array: 1.1.13 + which-typed-array: 1.1.16 dev: true /utils-merge@1.0.1: @@ -24858,7 +24822,7 @@ packages: '@types/node': 20.14.9 esbuild: 0.21.5 postcss: 8.4.49 - rollup: 4.29.1 + rollup: 4.28.1 optionalDependencies: fsevents: 2.3.3 dev: true @@ -24900,7 +24864,7 @@ packages: debug: 4.4.0(supports-color@8.1.1) execa: 8.0.1 local-pkg: 0.5.1 - magic-string: 0.30.17 + magic-string: 0.30.15 pathe: 1.1.2 picocolors: 1.1.1 std-env: 3.8.0 @@ -24977,7 +24941,7 @@ packages: /webcrypto-core@1.8.1: resolution: {integrity: sha512-P+x1MvlNCXlKbLSOY4cYrdreqPG5hbzkmawbcXLKN/mf6DZW0SdNNkZ+sjwsqVkI4A4Ko2sPZmkZtCKY58w83A==} dependencies: - '@peculiar/asn1-schema': 2.3.15 + '@peculiar/asn1-schema': 2.3.13 '@peculiar/json-schema': 1.1.12 asn1js: 3.0.5 pvtsutils: 1.3.6 @@ -25039,10 +25003,10 @@ packages: '@webassemblyjs/wasm-edit': 1.14.1 '@webassemblyjs/wasm-parser': 1.14.1 acorn: 8.14.0 - browserslist: 4.24.3 + browserslist: 4.24.2 chrome-trace-event: 1.0.4 - enhanced-resolve: 5.18.0 - es-module-lexer: 1.6.0 + enhanced-resolve: 5.17.1 + es-module-lexer: 1.5.4 eslint-scope: 5.1.1 events: 3.3.0 glob-to-regexp: 0.4.1 @@ -25053,7 +25017,7 @@ packages: neo-async: 2.6.2 schema-utils: 3.3.0 tapable: 2.2.1 - terser-webpack-plugin: 5.3.11(@swc/core@1.3.101)(esbuild@0.19.11)(webpack@5.97.1) + terser-webpack-plugin: 5.3.10(@swc/core@1.3.101)(esbuild@0.19.11)(webpack@5.97.1) watchpack: 2.4.2 webpack-sources: 3.2.3 transitivePeerDependencies: @@ -25079,33 +25043,33 @@ packages: webidl-conversions: 4.0.2 dev: true - /which-boxed-primitive@1.1.1: - resolution: {integrity: sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==} + /which-boxed-primitive@1.1.0: + resolution: {integrity: sha512-Ei7Miu/AXe2JJ4iNF5j/UphAgRoma4trE6PtisM09bPygb3egMH3YLW/befsWb1A1AxvNSFidOFTB18XtnIIng==} engines: {node: '>= 0.4'} dependencies: is-bigint: 1.1.0 - is-boolean-object: 1.2.1 - is-number-object: 1.1.1 - is-string: 1.1.1 - is-symbol: 1.1.1 + is-boolean-object: 1.2.0 + is-number-object: 1.1.0 + is-string: 1.1.0 + is-symbol: 1.1.0 - /which-builtin-type@1.2.1: - resolution: {integrity: sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==} + /which-builtin-type@1.2.0: + resolution: {integrity: sha512-I+qLGQ/vucCby4tf5HsLmGueEla4ZhwTBSqaooS+Y0BuxN4Cp+okmGuV+8mXZ84KDI9BA+oklo+RzKg0ONdSUA==} engines: {node: '>= 0.4'} dependencies: - call-bound: 1.0.3 - function.prototype.name: 1.1.8 + call-bind: 1.0.8 + function.prototype.name: 1.1.6 has-tostringtag: 1.0.2 is-async-function: 2.0.0 - is-date-object: 1.1.0 - is-finalizationregistry: 1.1.1 + is-date-object: 1.0.5 + is-finalizationregistry: 1.1.0 is-generator-function: 1.0.10 is-regex: 1.2.1 - is-weakref: 1.1.0 + is-weakref: 1.0.2 isarray: 2.0.5 - which-boxed-primitive: 1.1.1 + which-boxed-primitive: 1.1.0 which-collection: 1.0.2 - which-typed-array: 1.1.18 + which-typed-array: 1.1.16 /which-collection@1.0.2: resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==} @@ -25114,7 +25078,7 @@ packages: is-map: 2.0.3 is-set: 2.0.3 is-weakmap: 2.0.2 - is-weakset: 2.0.4 + is-weakset: 2.0.3 /which-module@2.0.1: resolution: {integrity: sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==} @@ -25128,13 +25092,12 @@ packages: path-exists: 4.0.0 dev: true - /which-typed-array@1.1.18: - resolution: {integrity: sha512-qEcY+KJYlWyLH9vNbsr6/5j59AXk5ni5aakf8ldzBvGde6Iz4sxZGkJyWSAueTG7QhOvNRYb1lDdFmL5Td0QKA==} + /which-typed-array@1.1.16: + resolution: {integrity: sha512-g+N+GAWiRj66DngFwHvISJd+ITsyphZvD1vChfVg6cEdnzy53GzB3oy0fUNlvhz7H7+MiqhYr26qxQShCpKTTQ==} engines: {node: '>= 0.4'} dependencies: available-typed-arrays: 1.0.7 call-bind: 1.0.8 - call-bound: 1.0.3 for-each: 0.3.3 gopd: 1.2.0 has-tostringtag: 1.0.2 @@ -25266,7 +25229,7 @@ packages: miniflare: 3.20240524.2 nanoid: 3.3.8 path-to-regexp: 6.3.0 - resolve: 1.22.10 + resolve: 1.22.8 resolve.exports: 2.0.3 selfsigned: 2.4.1 source-map: 0.6.1 @@ -25295,14 +25258,14 @@ packages: '@esbuild-plugins/node-globals-polyfill': 0.2.3(esbuild@0.17.19) '@esbuild-plugins/node-modules-polyfill': 0.2.2(esbuild@0.17.19) blake3-wasm: 2.1.5 - chokidar: 4.0.3 + chokidar: 4.0.1 date-fns: 4.1.0 esbuild: 0.17.19 itty-time: 1.0.6 miniflare: 3.20241106.2 nanoid: 3.3.8 path-to-regexp: 6.3.0 - resolve: 1.22.10 + resolve: 1.22.8 selfsigned: 2.4.1 source-map: 0.6.1 unenv: /unenv-nightly@2.0.0-20241121-161142-806b5c0 @@ -25332,14 +25295,14 @@ packages: '@esbuild-plugins/node-globals-polyfill': 0.2.3(esbuild@0.17.19) '@esbuild-plugins/node-modules-polyfill': 0.2.2(esbuild@0.17.19) blake3-wasm: 2.1.5 - chokidar: 4.0.3 + chokidar: 4.0.1 date-fns: 4.1.0 esbuild: 0.17.19 itty-time: 1.0.6 miniflare: 3.20241106.2 nanoid: 3.3.8 path-to-regexp: 6.3.0 - resolve: 1.22.10 + resolve: 1.22.8 selfsigned: 2.4.1 source-map: 0.6.1 unenv: /unenv-nightly@2.0.0-20241121-161142-806b5c0 @@ -25504,8 +25467,8 @@ packages: engines: {node: '>= 14'} dev: true - /yaml@2.7.0: - resolution: {integrity: sha512-+hSoy/QHluxmC9kCIJyL/uyFmLmc+e5CFR5Wa+bpIhIj85LVb9ZH2nVnqrHoSvKogwODv0ClqZkmiSSaIH5LTA==} + /yaml@2.6.1: + resolution: {integrity: sha512-7r0XPzioN/Q9kXBro/XPnA6kznR73DHq+GXh5ON7ZozRO6aMjbmiBuKste2wslTFkC5d1dw0GooOCepZXJ2SAg==} engines: {node: '>= 14'} hasBin: true @@ -25617,7 +25580,7 @@ packages: dependencies: archiver-utils: 5.0.2 compress-commons: 6.0.2 - readable-stream: 4.6.0 + readable-stream: 4.5.2 dev: true /zod-error@1.5.0: