diff --git a/.github/workflows/test-database.yaml b/.github/workflows/test-database.yaml index c110b1ca0..e9c70f06c 100644 --- a/.github/workflows/test-database.yaml +++ b/.github/workflows/test-database.yaml @@ -21,7 +21,7 @@ jobs: - name: Setup node uses: actions/setup-node@v4 with: - node-version: "20" + node-version: "22" cache: "pnpm" - name: Install Dependencies run: pnpm install --frozen-lockfile diff --git a/apps/website/app/api/supabase/agent-identifier/route.ts b/apps/website/app/api/supabase/agent-identifier/route.ts index 31923db5c..0aab6b2b3 100644 --- a/apps/website/app/api/supabase/agent-identifier/route.ts +++ b/apps/website/app/api/supabase/agent-identifier/route.ts @@ -1,7 +1,7 @@ import { NextResponse, NextRequest } from "next/server"; import { createClient } from "~/utils/supabase/server"; -import { getOrCreateEntity, ItemValidator } from "~/utils/supabase/dbUtils"; +import { getOrCreateEntity } from "~/utils/supabase/dbUtils"; import { asPostgrestFailure } from "@repo/database/lib/contextFunctions"; import { createApiResponse, @@ -11,25 +11,26 @@ import { import { type TablesInsert, Constants } from "@repo/database/dbTypes"; type AgentIdentifierDataInput = TablesInsert<"AgentIdentifier">; +// eslint-disable-next-line @typescript-eslint/naming-convention const { AgentIdentifierType } = Constants.public.Enums; -const agentIdentifierValidator: ItemValidator = ( - agent_identifier: any, -) => { +// ItemValidator<"AgentIdentifier"> +const agentIdentifierValidator = ( + // eslint-disable-next-line @typescript-eslint/naming-convention + agent_identifier: AgentIdentifierDataInput, +): string | null => { if (!agent_identifier || typeof agent_identifier !== "object") return "Invalid request body: expected a JSON object."; + // eslint-disable-next-line @typescript-eslint/naming-convention const { identifier_type, account_id, value, trusted } = agent_identifier; if (!AgentIdentifierType.includes(identifier_type)) return "Invalid identifier_type"; if (!value || typeof value !== "string" || value.trim() === "") return "Missing or invalid value"; - if (!account_id || Number.isNaN(Number.parseInt(account_id, 10))) + if (!account_id || typeof account_id !== "number" || Number.isNaN(account_id)) return "Missing or invalid account_id"; - if ( - trusted !== undefined && - !["true", "false", true, false].includes(trusted) - ) + if (trusted !== undefined && typeof trusted !== "boolean") return "if included, trusted should be a boolean"; const keys = ["identifier_type", "account_id", "value", "trusted"]; @@ -42,18 +43,16 @@ export const POST = async (request: NextRequest): Promise => { const supabasePromise = createClient(); try { - const body = await request.json(); + const body = (await request.json()) as AgentIdentifierDataInput; const error = agentIdentifierValidator(body); if (error !== null) return createApiResponse(request, asPostgrestFailure(error, "invalid")); - body.account_id = Number.parseInt(body.account_id, 10); - body.trusted = body.trusted === true || body.trusted === "true" || false; const supabase = await supabasePromise; - const result = await getOrCreateEntity<"AgentIdentifier">({ + const result = await getOrCreateEntity({ supabase, tableName: "AgentIdentifier", - insertData: body as AgentIdentifierDataInput, + insertData: body, uniqueOn: ["value", "identifier_type", "account_id"], }); diff --git a/apps/website/app/api/supabase/content-embedding/batch/route.ts b/apps/website/app/api/supabase/content-embedding/batch/route.ts index 1268ad6f0..b09aadb06 100644 --- a/apps/website/app/api/supabase/content-embedding/batch/route.ts +++ b/apps/website/app/api/supabase/content-embedding/batch/route.ts @@ -13,8 +13,8 @@ import { KNOWN_EMBEDDING_TABLES, } from "~/utils/supabase/dbUtils"; import { - ApiInputEmbeddingItem, - ApiOutputEmbeddingRecord, + type ContentEmbeddingVecTablesInsert, + type ContentEmbeddingVecTables, embeddingInputProcessing, embeddingOutputProcessing, } from "~/utils/supabase/validators"; @@ -23,19 +23,19 @@ const DEFAULT_MODEL = "openai_text_embedding_3_small_1536"; const batchInsertEmbeddingsProcess = async ( supabase: Awaited>, - embeddingItems: ApiInputEmbeddingItem[], -): Promise> => { + embeddingItems: ContentEmbeddingVecTablesInsert[], +): Promise> => { // groupBy is node21 only, we are using 20. Group by model, by hand. // Note: This means that later index values may be totally wrong. // Note2: The key is a ModelName, but I cannot use an enum as a key. - const byModel: { [key: string]: ApiInputEmbeddingItem[] } = {}; + const byModel: { [key: string]: ContentEmbeddingVecTablesInsert[] } = {}; try { embeddingItems.reduce((acc, item) => { const model = item?.model || DEFAULT_MODEL; if (acc[model] === undefined) { acc[model] = []; } - acc[model]!.push(item); + acc[model].push(item); return acc; }, byModel); } catch (error) { @@ -45,7 +45,7 @@ const batchInsertEmbeddingsProcess = async ( throw error; } - const globalResults: ApiOutputEmbeddingRecord[] = []; + const globalResults: ContentEmbeddingVecTables[] = []; const partialErrors: string[] = []; let created = false, count = 0, @@ -55,15 +55,11 @@ const batchInsertEmbeddingsProcess = async ( if (embeddingItemsSet === undefined) continue; const tableData = KNOWN_EMBEDDING_TABLES[modelName]; if (tableData === undefined) continue; - const results = await processAndInsertBatch< - // any ContentEmbedding table for type checking purposes only - "ContentEmbedding_openai_text_embedding_3_small_1536", - ApiInputEmbeddingItem, - ApiOutputEmbeddingRecord - >({ + const { tableName } = tableData; + const results = await processAndInsertBatch({ supabase, items: embeddingItemsSet, - tableName: tableData.tableName, + tableName, inputProcessor: embeddingInputProcessing, outputProcessor: embeddingOutputProcessing, }); @@ -81,6 +77,7 @@ const batchInsertEmbeddingsProcess = async ( return { data: globalResults, error: null, + success: true, status: has_400 ? 400 : 500, count, statusText: partialErrors.join("; "), @@ -89,6 +86,7 @@ const batchInsertEmbeddingsProcess = async ( return { data: globalResults, error: null, + success: true, status: created ? 201 : 200, count, statusText: created ? "created" : "success", @@ -106,7 +104,7 @@ export const POST = async (request: NextRequest): Promise => { const supabase = await createClient(); try { - const body: ApiInputEmbeddingItem[] = await request.json(); + const body = (await request.json()) as ContentEmbeddingVecTablesInsert[]; if (!Array.isArray(body)) { return createApiResponse( request, diff --git a/apps/website/app/api/supabase/content-embedding/route.ts b/apps/website/app/api/supabase/content-embedding/route.ts index fccd7accb..aa769577e 100644 --- a/apps/website/app/api/supabase/content-embedding/route.ts +++ b/apps/website/app/api/supabase/content-embedding/route.ts @@ -13,8 +13,8 @@ import { KNOWN_EMBEDDING_TABLES, } from "~/utils/supabase/dbUtils"; import { - ApiInputEmbeddingItem, - ApiOutputEmbeddingRecord, + ContentEmbeddingVecTablesInsert, + ContentEmbeddingVecTables, embeddingInputProcessing, embeddingOutputProcessing, } from "~/utils/supabase/validators"; @@ -23,9 +23,11 @@ const DEFAULT_MODEL = "openai_text_embedding_3_small_1536"; const processAndCreateEmbedding = async ( supabasePromise: ReturnType, - data: ApiInputEmbeddingItem, -): Promise> => { - const { valid, error, processedItem } = embeddingInputProcessing(data); + data: ContentEmbeddingVecTablesInsert, +): Promise> => { + const processed = embeddingInputProcessing(data); + if (!processed) return asPostgrestFailure("Could not process input", "valid"); + const { valid, error, processedItem } = processed; if ( !valid || processedItem === undefined || @@ -41,14 +43,11 @@ const processAndCreateEmbedding = async ( const { tableName } = tableData; // Using getOrCreateEntity, forcing create path by providing non-matching criteria // This standardizes return type and error handling (e.g., FK violations from dbUtils) - const result = - await getOrCreateEntity<"ContentEmbedding_openai_text_embedding_3_small_1536">( - { - supabase, - tableName, - insertData: processedItem, - }, - ); + const result = await getOrCreateEntity({ + supabase, + tableName, + insertData: processedItem, + }); if (result.error) { return result; @@ -81,7 +80,7 @@ export const POST = async (request: NextRequest): Promise => { const supabasePromise = createClient(); try { - const body: ApiInputEmbeddingItem = await request.json(); + const body = (await request.json()) as ContentEmbeddingVecTablesInsert; const result = await processAndCreateEmbedding(supabasePromise, body); return createApiResponse(request, result); } catch (e: unknown) { diff --git a/apps/website/app/api/supabase/content/route.ts b/apps/website/app/api/supabase/content/route.ts index b1fcf06c2..3a0e9ffc9 100644 --- a/apps/website/app/api/supabase/content/route.ts +++ b/apps/website/app/api/supabase/content/route.ts @@ -27,7 +27,7 @@ const processAndUpsertContentEntry = async ( // If no solid matchCriteria for a "get", getOrCreateEntity will likely proceed to "create". // If there are unique constraints other than (space_id, source_local_id), it will handle race conditions. - const result = await getOrCreateEntity<"Content">({ + const result = await getOrCreateEntity({ supabase, tableName: "Content", insertData: data, diff --git a/apps/website/app/api/supabase/document/route.ts b/apps/website/app/api/supabase/document/route.ts index 170b01a2d..0c2ea783c 100644 --- a/apps/website/app/api/supabase/document/route.ts +++ b/apps/website/app/api/supabase/document/route.ts @@ -2,7 +2,7 @@ import { NextResponse, NextRequest } from "next/server"; import type { PostgrestSingleResponse } from "@supabase/supabase-js"; import { createClient } from "~/utils/supabase/server"; -import { getOrCreateEntity, ItemValidator } from "~/utils/supabase/dbUtils"; +import { getOrCreateEntity } from "~/utils/supabase/dbUtils"; import { asPostgrestFailure } from "@repo/database/lib/contextFunctions"; import { createApiResponse, @@ -14,9 +14,11 @@ import type { Tables, TablesInsert } from "@repo/database/dbTypes"; type DocumentDataInput = TablesInsert<"Document">; type DocumentRecord = Tables<"Document">; -const validateDocument: ItemValidator = (data) => { +// ItemValidator<"Document"> +const validateDocument = (data: DocumentDataInput): string | null => { if (!data || typeof data !== "object") return "Invalid request body: expected a JSON object."; + // eslint-disable-next-line @typescript-eslint/naming-convention const { space_id, author_id, source_local_id } = data; if (!author_id) return "Missing required author_id field."; @@ -32,7 +34,7 @@ const createDocument = async ( ): Promise> => { const supabase = await supabasePromise; - const result = await getOrCreateEntity<"Document">({ + const result = await getOrCreateEntity({ supabase, tableName: "Document", insertData: data, @@ -49,7 +51,7 @@ export const POST = async (request: NextRequest): Promise => { const supabasePromise = createClient(); try { - const body: DocumentDataInput = await request.json(); + const body = (await request.json()) as DocumentDataInput; const error = validateDocument(body); if (error !== null) return createApiResponse(request, asPostgrestFailure(error, "invalid")); diff --git a/apps/website/app/api/supabase/platform-account/route.ts b/apps/website/app/api/supabase/platform-account/route.ts index a94336713..40436df35 100644 --- a/apps/website/app/api/supabase/platform-account/route.ts +++ b/apps/website/app/api/supabase/platform-account/route.ts @@ -1,7 +1,7 @@ import { NextResponse, NextRequest } from "next/server"; import { createClient } from "~/utils/supabase/server"; -import { getOrCreateEntity, ItemValidator } from "~/utils/supabase/dbUtils"; +import { getOrCreateEntity } from "~/utils/supabase/dbUtils"; import { asPostgrestFailure } from "@repo/database/lib/contextFunctions"; import { createApiResponse, @@ -10,15 +10,16 @@ import { } from "~/utils/supabase/apiUtils"; import { type TablesInsert, Constants } from "@repo/database/dbTypes"; +// eslint-disable-next-line @typescript-eslint/naming-convention const { AgentType, Platform } = Constants.public.Enums; type PlatformAccountDataInput = TablesInsert<"PlatformAccount">; -const accountValidator: ItemValidator = ( - account: any, -) => { +// ItemValidator<"PlatformAccount"> +const accountValidator = (account: PlatformAccountDataInput): string | null => { if (!account || typeof account !== "object") return "Invalid request body: expected a JSON object."; + /* eslint-disable @typescript-eslint/naming-convention */ const { name, platform, @@ -29,6 +30,7 @@ const accountValidator: ItemValidator = ( metadata, dg_account, } = account; + /* eslint-enable @typescript-eslint/naming-convention */ if (!name || typeof name !== "string" || name.trim() === "") return "Missing or invalid name"; @@ -81,16 +83,16 @@ export const POST = async (request: NextRequest): Promise => { const supabasePromise = createClient(); try { - const body = await request.json(); + const body = (await request.json()) as PlatformAccountDataInput; const error = accountValidator(body); if (error !== null) return createApiResponse(request, asPostgrestFailure(error, "invalid")); const supabase = await supabasePromise; - const result = await getOrCreateEntity<"PlatformAccount">({ + const result = await getOrCreateEntity({ supabase, tableName: "PlatformAccount", - insertData: body as PlatformAccountDataInput, + insertData: body, uniqueOn: ["account_local_id", "platform"], }); diff --git a/apps/website/app/utils/supabase/dbUtils.ts b/apps/website/app/utils/supabase/dbUtils.ts index b7752dccd..6291ab245 100644 --- a/apps/website/app/utils/supabase/dbUtils.ts +++ b/apps/website/app/utils/supabase/dbUtils.ts @@ -3,11 +3,29 @@ import type { PostgrestResponse, PostgrestSingleResponse, } from "@supabase/supabase-js"; +import type { + ItemValidator, + ItemProcessor, + ItemOutputProcessor, + InputTypeOf, + OutputTypeOf, +} from "./validators"; +import { PostgrestError } from "@supabase/supabase-js"; import type { Database, Tables, TablesInsert } from "@repo/database/dbTypes"; +export type TableName = keyof Database["public"]["Tables"]; + +// Those next three types would be unions if we ever have more embedding tables +export type ContentEmbeddingTableName = + "ContentEmbedding_openai_text_embedding_3_small_1536"; +export type ContentEmbeddingStrTablesInsert = + TablesInsert<"ContentEmbedding_openai_text_embedding_3_small_1536">; +export type ContentEmbeddingStrTables = + Tables<"ContentEmbedding_openai_text_embedding_3_small_1536">; + export const KNOWN_EMBEDDING_TABLES: { [key: string]: { - tableName: keyof Database["public"]["Tables"]; + tableName: ContentEmbeddingTableName; tableSize: number; }; } = { @@ -25,9 +43,9 @@ const FOREIGN_KEY_RE = const FOREIGN_CONSTRAINT_RE = /insert or update on table ("?\w+"?) violates foreign key constraint ("?\w+"?)/; -const processSupabaseError = ( +const processSupabaseError = ( response: PostgrestResponse, - tableName: string, + tableName: T, ): PostgrestResponse => { const { error } = response; if (error == null) return response; // should not happen, but makes TS happy @@ -80,22 +98,22 @@ const processSupabaseError = ( * @param uniqueOn The expected uniqueOn key. * @returns Promise> */ -export const getOrCreateEntity = async < - TableName extends keyof Database["public"]["Tables"], ->({ +export const getOrCreateEntity = async ({ supabase, tableName, insertData, uniqueOn = undefined, }: { supabase: SupabaseClient; - tableName: keyof Database["public"]["Tables"]; - insertData: TablesInsert; - uniqueOn?: (keyof TablesInsert)[]; // Uses pKey otherwise -}): Promise>> => { - const result: PostgrestSingleResponse> = await supabase + tableName: T; + insertData: TablesInsert; + uniqueOn?: (keyof TablesInsert)[]; // Uses pKey otherwise +}): Promise>> => { + const result: PostgrestSingleResponse> = await supabase .from(tableName) - .upsert(insertData, { + // Typescript gets confused with latest supabase + // eslint-disable-next-line @typescript-eslint/no-explicit-any + .upsert(insertData as any, { onConflict: uniqueOn === undefined ? undefined : uniqueOn.join(","), ignoreDuplicates: false, count: "estimated", @@ -110,7 +128,7 @@ export const getOrCreateEntity = async < if (dup_key_data !== null && dup_key_data.length > 1) uniqueOn = dup_key_data[1]! .split(",") - .map((x) => x.trim()) as (keyof TablesInsert)[]; + .map((x) => x.trim()) as (keyof TablesInsert)[]; if (uniqueOn && uniqueOn.length > 0) { console.warn(`Attempting to re-fetch using ${uniqueOn.join(", ")}`); let reFetchQueryBuilder = supabase.from(tableName).select(); @@ -120,14 +138,18 @@ export const getOrCreateEntity = async < console.error("Empty key in uniqueOn"); continue; } - const keyS = String(key); reFetchQueryBuilder = reFetchQueryBuilder.eq( - keyS, - insertData[key] as any, // TS gets confused here? + // TS expects those to be known at compile time, but here they are runtime + /* eslint-disable @typescript-eslint/no-explicit-any */ + /* eslint-disable @typescript-eslint/no-unsafe-argument */ + key as any, + insertData[key] as any, + /* eslint-enable @typescript-eslint/no-explicit-any */ + /* eslint-enable @typescript-eslint/no-unsafe-argument */ ); } const reFetchResult = - await reFetchQueryBuilder.maybeSingle>(); + await reFetchQueryBuilder.maybeSingle>(); const { data: reFetchedEntity, error: reFetchError } = reFetchResult; if (reFetchResult === null) { @@ -138,14 +160,15 @@ export const getOrCreateEntity = async < console.log(`Found ${tableName} on re-fetch:`, reFetchedEntity); // Note: Using a PostgrestResult means I cannot have both data and error non-null... return { - error: { + error: new PostgrestError({ ...result.error, message: `Upsert failed because of conflict with this entity: ${reFetchedEntity}"`, - }, + }), statusText: result.statusText, data: null, count: null, status: 400, + success: false, }; } } @@ -155,35 +178,22 @@ export const getOrCreateEntity = async < return result; }; -export type BatchItemValidator = ( - item: TInput, - index: number, -) => { valid: boolean; error?: string; processedItem?: TProcessed }; - -export type ItemProcessor = (item: TInput) => { - valid: boolean; - error?: string; - processedItem?: TProcessed; -}; - -export type ItemValidator = (item: T) => string | null; - -export const InsertValidatedBatch = async < - TableName extends keyof Database["public"]["Tables"], ->({ +export const InsertValidatedBatch = async ({ supabase, tableName, items, uniqueOn = undefined, }: { supabase: SupabaseClient; - tableName: keyof Database["public"]["Tables"]; - items: TablesInsert[]; - uniqueOn?: (keyof TablesInsert)[]; // Uses pKey otherwise -}): Promise>> => { - const result: PostgrestResponse> = await supabase + tableName: T; + items: TablesInsert[]; + uniqueOn?: (keyof TablesInsert)[]; // Uses pKey otherwise +}): Promise>> => { + const result: PostgrestResponse> = await supabase .from(tableName) - .upsert(items, { + // Typescript gets confused with latest supabase + // eslint-disable-next-line @typescript-eslint/no-explicit-any + .upsert(items as any, { onConflict: uniqueOn === undefined ? undefined : uniqueOn.join(","), ignoreDuplicates: false, count: "estimated", @@ -210,9 +220,7 @@ export const InsertValidatedBatch = async < return result; }; -export const validateAndInsertBatch = async < - TableName extends keyof Database["public"]["Tables"], ->({ +export const validateAndInsertBatch = async ({ supabase, tableName, items, @@ -221,24 +229,24 @@ export const validateAndInsertBatch = async < outputValidator = undefined, }: { supabase: SupabaseClient; - tableName: keyof Database["public"]["Tables"]; - items: TablesInsert[]; - uniqueOn?: (keyof TablesInsert)[]; // Uses pKey otherwise - inputValidator?: ItemValidator>; - outputValidator?: ItemValidator>; -}): Promise>> => { - let validatedItems: TablesInsert[] = []; + tableName: T; + items: TablesInsert[]; + uniqueOn?: (keyof TablesInsert)[]; // Uses pKey otherwise + inputValidator?: ItemValidator; + outputValidator?: ItemValidator; +}): Promise>> => { + let validatedItems: TablesInsert[] = []; const validationErrors: { index: number; error: string }[] = []; if (!Array.isArray(items) || items.length === 0) { return { - error: { + error: new PostgrestError({ message: `Request body must be a non-empty array of ${tableName} items.`, details: "", - hint: "", + hint: "nonempty", code: "1", - name: "nonempty", - }, + }), status: 400, + success: false, data: null, count: null, statusText: "Empty input", @@ -269,13 +277,13 @@ export const validateAndInsertBatch = async < if (validationErrors.length > 0) { return { - error: { + error: new PostgrestError({ message: `Validation failed for one or more ${tableName} items.`, details: `${validationErrors}`, - hint: "", + hint: "invalid", code: "2", - name: "invalid", - }, + }), + success: false, status: 400, data: null, count: null, @@ -285,7 +293,7 @@ export const validateAndInsertBatch = async < } else { validatedItems = items; } - const result = await InsertValidatedBatch({ + const result = await InsertValidatedBatch({ supabase, tableName, items: validatedItems, @@ -295,7 +303,7 @@ export const validateAndInsertBatch = async < return result; } if (outputValidator !== undefined) { - const validatedResults: Tables[] = []; + const validatedResults: Tables[] = []; for (let i = 0; i < result.data.length; i++) { const item = result.data[i]; if (!item) { @@ -322,6 +330,7 @@ export const validateAndInsertBatch = async < // Erring on the side of returning data with an error in status. return { error: null, + success: true, status: 500, data: validatedResults, count: validatedResults.length, @@ -329,13 +338,13 @@ export const validateAndInsertBatch = async < }; } else { return { - error: { + error: new PostgrestError({ message: `Post-validation failed for all ${tableName} items.`, details: `${validationErrors}`, - hint: "", + hint: "invalid", code: "2", - name: "invalid", - }, + }), + success: false, status: 500, data: null, count: null, @@ -347,36 +356,32 @@ export const validateAndInsertBatch = async < return result; }; -export const processAndInsertBatch = async < - TableName extends keyof Database["public"]["Tables"], - InputType, - OutputType, ->({ +export const processAndInsertBatch = async ({ supabase, - tableName, items, + tableName, uniqueOn = undefined, inputProcessor, outputProcessor, }: { supabase: SupabaseClient; - tableName: keyof Database["public"]["Tables"]; - items: InputType[]; - uniqueOn?: (keyof TablesInsert)[]; // Uses pKey otherwise - inputProcessor: ItemProcessor>; - outputProcessor: ItemProcessor, OutputType>; -}): Promise> => { - let processedItems: TablesInsert[] = []; + items: InputTypeOf[]; + tableName: T; + uniqueOn?: (keyof TablesInsert)[]; // Uses pKey otherwise + inputProcessor: ItemProcessor; + outputProcessor: ItemOutputProcessor; +}): Promise>> => { + const processedItems: TablesInsert[] = []; const validationErrors: { index: number; error: string }[] = []; if (!Array.isArray(items) || items.length === 0) { return { - error: { + error: new PostgrestError({ message: `Request body must be a non-empty array of ${tableName} items.`, details: "", - hint: "", + hint: "nonempty", code: "1", - name: "nonempty", - }, + }), + success: false, status: 400, data: null, count: null, @@ -407,20 +412,20 @@ export const processAndInsertBatch = async < if (validationErrors.length > 0) { return { - error: { + error: new PostgrestError({ message: `Validation failed for one or more ${tableName} items.`, details: `${validationErrors}`, - hint: "", + hint: "invalid", code: "2", - name: "invalid", - }, + }), + success: false, status: 400, data: null, count: null, statusText: "Validation errors", }; } - const result = await InsertValidatedBatch({ + const result = await InsertValidatedBatch({ supabase, tableName, items: processedItems, @@ -429,7 +434,7 @@ export const processAndInsertBatch = async < if (result.error) { return result; } - const processedResults: OutputType[] = []; + const processedResults: Array> = []; for (let i = 0; i < result.data.length; i++) { const item = result.data[i]; if (!item) { @@ -457,19 +462,20 @@ export const processAndInsertBatch = async < return { error: null, status: 500, + success: true, data: processedResults, count: processedResults.length, statusText: `Validation failed for one or more ${tableName} items, and succeeded for ${processedResults.length}/${result.data.length}.`, }; } else { return { - error: { + error: new PostgrestError({ message: `Post-validation failed for all ${tableName} items.`, details: `${validationErrors}`, - hint: "", + hint: "invalid", code: "2", - name: "invalid", - }, + }), + success: false, status: 500, data: null, count: null, diff --git a/apps/website/app/utils/supabase/validators.ts b/apps/website/app/utils/supabase/validators.ts index 84f4defd9..c5e44de47 100644 --- a/apps/website/app/utils/supabase/validators.ts +++ b/apps/website/app/utils/supabase/validators.ts @@ -1,33 +1,66 @@ import { KNOWN_EMBEDDING_TABLES, - ItemProcessor, - ItemValidator, + type TableName, + type ContentEmbeddingTableName, } from "./dbUtils"; -import type { Tables, TablesInsert } from "@repo/database/dbTypes"; +import type { Database, Tables, TablesInsert } from "@repo/database/dbTypes"; + +/* eslint-disable @typescript-eslint/naming-convention */ +export type InputTypes = { + ContentEmbedding_openai_text_embedding_3_small_1536: ContentEmbeddingVecTablesInsert; + ContentEmbedding_openai_text_embedding_3_large_1536: ContentEmbeddingVecTablesInsert; +}; +export type OutputTypes = { + ContentEmbedding_openai_text_embedding_3_small_1536: ContentEmbeddingVecTables; + ContentEmbedding_openai_text_embedding_3_large_1536: ContentEmbeddingVecTables; +}; +/* eslint-enable @typescript-eslint/naming-convention */ + +export type InputTypeOf = + T extends keyof InputTypes ? InputTypes[T] : TablesInsert; +export type OutputTypeOf = + T extends keyof OutputTypes ? OutputTypes[T] : Tables; + +export type ItemProcessor = (item: InputTypeOf) => { + valid: boolean; + error?: string; + processedItem?: TablesInsert; +}; + +export type ItemOutputProcessor = (item: Tables) => { + valid: boolean; + error?: string; + processedItem?: OutputTypeOf; +}; + +export type ItemValidator = ( + item: Tables | TablesInsert, +) => string | null; // Use the first known ContentEmbedding table for type checking, as they have the same structure -export type ContentEmbeddingDataInput = +export type ContentEmbeddingStrTablesInsert = TablesInsert<"ContentEmbedding_openai_text_embedding_3_small_1536">; -export type ContentEmbeddingRecord = +export type ContentEmbeddingStrTables = Tables<"ContentEmbedding_openai_text_embedding_3_small_1536">; -export type ApiInputEmbeddingItem = Omit< - ContentEmbeddingDataInput, +export type ContentEmbeddingVecTablesInsert = Omit< + ContentEmbeddingStrTablesInsert, "vector" > & { vector: number[]; }; -export type ApiOutputEmbeddingRecord = Omit< - ContentEmbeddingRecord, +export type ContentEmbeddingVecTables = Omit< + ContentEmbeddingStrTables, "vector" > & { vector: number[]; }; -export const embeddingInputValidation: ItemValidator = ( - data, -) => { +// type: ItemValidator +export const embeddingInputValidation = ( + data: InputTypeOf, +): string | null => { if (!data || typeof data !== "object") return "Invalid request body: expected a JSON object."; const { target_id, model, vector } = data; @@ -64,23 +97,31 @@ export const embeddingInputValidation: ItemValidator = ( return null; }; -export const embeddingInputProcessing: ItemProcessor< - ApiInputEmbeddingItem, - ContentEmbeddingDataInput -> = (data) => { +// type: ItemProcessor +export const embeddingInputProcessing = ( + data: InputTypeOf, +): { + valid: boolean; + error?: string; + processedItem?: TablesInsert; +} => { const error = embeddingInputValidation(data); if (error) { return { valid: false, error }; } return { valid: true, - processedItem: { ...data, vector: JSON.stringify(data.vector) }, + processedItem: { + ...data, + vector: JSON.stringify(data.vector), + } as TablesInsert, }; }; -export const embeddingOutputValidation: ItemValidator< - ApiOutputEmbeddingRecord -> = (data) => { +// type: ItemOutputValidator +export const embeddingOutputValidation = ( + data: OutputTypeOf, +): string | null => { const { model, vector } = data; if ( !model || @@ -98,12 +139,19 @@ export const embeddingOutputValidation: ItemValidator< return null; }; -export const embeddingOutputProcessing: ItemProcessor< - ContentEmbeddingRecord, - ApiOutputEmbeddingRecord -> = (data) => { +// type: ItemOutputProcessor +export const embeddingOutputProcessing = ( + data: Tables, +): { + valid: boolean; + error?: string; + processedItem?: OutputTypeOf; +} => { try { - const processedData = { ...data, vector: JSON.parse(data.vector) }; + const processedData = { + ...data, + vector: JSON.parse(data.vector) as number[], + } as OutputTypeOf; const error = embeddingOutputValidation(processedData); if (error) { return { valid: false, error }; @@ -123,11 +171,13 @@ export const embeddingOutputProcessing: ItemProcessor< export type ContentDataInput = TablesInsert<"Content">; export type ContentRecord = Tables<"Content">; -export const contentInputValidation: ItemValidator = ( +// type: ItemValidator<"Content"> +export const contentInputValidation = ( data: ContentDataInput, -) => { +): string | null => { if (!data || typeof data !== "object") return "Invalid request body: expected a JSON object."; + // eslint-disable-next-line @typescript-eslint/naming-convention const { author_id, created, last_modified, scale, space_id, text } = data; if (!text || typeof text !== "string") return "Invalid or missing text."; diff --git a/apps/website/package.json b/apps/website/package.json index 7ab442ea9..9b83d5a80 100644 --- a/apps/website/package.json +++ b/apps/website/package.json @@ -16,7 +16,7 @@ "dependencies": { "@repo/database": "workspace:*", "@repo/ui": "workspace:*", - "@supabase/ssr": "^0.8.0", + "@supabase/ssr": "catalog:", "@supabase/supabase-js": "catalog:", "clsx": "^2.1.1", "gray-matter": "^4.0.3", diff --git a/packages/database/package.json b/packages/database/package.json index a7cdde56b..9f323ab09 100644 --- a/packages/database/package.json +++ b/packages/database/package.json @@ -55,15 +55,15 @@ "@repo/eslint-config": "workspace:*", "@repo/typescript-config": "workspace:*", "@types/node": "^20", - "@vercel/sdk": "^1.18.9", + "@vercel/sdk": "^1.19.40", "dotenv": "^16.6.1", "eslint": "catalog:", "prettier-plugin-gherkin": "^3.1.3", - "supabase": "^2.75.0", + "supabase": "^2.98.1", "ts-node-maintained": "^10.9.5", "tsx": "4.20.6", "typescript": "5.9.2", - "vercel": "50.9.6" + "vercel": "53.1.0" }, "prettier": { "plugins": [ diff --git a/packages/database/src/lib/contextFunctions.ts b/packages/database/src/lib/contextFunctions.ts index 1180d9ab5..cc4f94399 100644 --- a/packages/database/src/lib/contextFunctions.ts +++ b/packages/database/src/lib/contextFunctions.ts @@ -1,6 +1,14 @@ import { createClient } from "@supabase/supabase-js"; -import type { Database, Enums, Tables, TablesInsert } from "@repo/database/dbTypes"; -import type { PostgrestSingleResponse } from "@supabase/supabase-js"; +import type { + Database, + Enums, + Tables, + TablesInsert, +} from "@repo/database/dbTypes"; +import { + type PostgrestSingleResponse, + PostgrestError, +} from "@supabase/supabase-js"; import type { FunctionsResponse } from "@supabase/functions-js"; import { nextApiRoot } from "@repo/utils/execContext"; import type { DGSupabaseClient } from "@repo/database/lib/client"; @@ -24,13 +32,13 @@ export const asPostgrestFailure = ( ): PostgrestSingleResponse => { return { data: null, - error: { + success: false, + error: new PostgrestError({ message, code, details: "", - hint: "", - name: code, - }, + hint: code, + }), count: null, statusText: code, status, @@ -73,9 +81,10 @@ export const fetchOrCreateSpaceIndirect = async ( `Platform API failed: ${response.status} ${response.statusText} ${await response.text()}`, ); } - const data = await response.json() as SpaceRecord; + const data = (await response.json()) as SpaceRecord; return { data, + success: true, error: null, count: 1, status: 200, @@ -96,16 +105,18 @@ const createSingletonClient = (uniqueKey: string): DGSupabaseClient | null => { throw new FatalError("Missing required Supabase environment variables"); } if (lastStorageKey !== undefined && lastStorageKey !== uniqueKey) { - console.error("Changed storage key") + console.error("Changed storage key"); // I.e. working on a new vault. Should never happen. // Break singleton pattern in that edge case. client = undefined; } if (client === undefined) { - client = createClient(url, key, {auth: {storageKey: `sb-${uniqueKey}-auth-token`}}); - if (client) { - lastStorageKey = uniqueKey; - } + client = createClient(url, key, { + auth: { storageKey: `sb-${uniqueKey}-auth-token` }, + }); + if (client) { + lastStorageKey = uniqueKey; + } } return client; }; @@ -117,8 +128,11 @@ export const fetchOrCreateSpaceDirect = async ( if (error !== null) return asPostgrestFailure(error, "invalid space"); data.url = data.url.trim().replace(/\/$/, ""); // Distinguish local, or various supabase branches - const supabaseUrlFirstFragment = new URL(process.env.SUPABASE_URL || 'http://null').hostname.split('.')[0]; - const urlSlug = supabaseUrlFirstFragment+":"+data.name.replaceAll(/\W/g,""); + const supabaseUrlFirstFragment = new URL( + process.env.SUPABASE_URL || "http://null", + ).hostname.split(".")[0]; + const urlSlug = + supabaseUrlFirstFragment + ":" + data.name.replaceAll(/\W/g, ""); const supabase = createSingletonClient(urlSlug); if (!supabase) return asPostgrestFailure("No database", ""); const session = await supabase.auth.getSession(); @@ -129,13 +143,14 @@ export const fetchOrCreateSpaceDirect = async ( .select() .eq("url", data.url) .maybeSingle(); - if (result.error && result.status >= 500) - return result; + if (result.error && result.status >= 500) return result; if (result.data !== null) return result as PostgrestSingleResponse; // space does not exist, or not visible from this account; // logout to be sure - console.warn(`Creating a space while already logged in as ${session.data.session.user.email}; logging out`); + console.warn( + `Creating a space while already logged in as ${session.data.session.user.email}; logging out`, + ); await supabase.auth.refreshSession(); // this will clear an invalid session } // If it does not exist, create it @@ -160,6 +175,7 @@ export const fetchOrCreateSpaceDirect = async ( return { data: result2.data, error: null, + success: true, count: 1, status: 200, statusText: "OK", @@ -181,9 +197,9 @@ export const createLoggedInClient = async ({ const session = await client.auth.getSession(); if (session.data.session) { if (session.data.session.user.email === email) - return client; // already logged in + return client; // already logged in else { - console.warn("Email crosstalk") + console.warn("Email crosstalk"); await client.auth.signOut(); } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 07e31da72..7c5868b70 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -7,17 +7,20 @@ settings: catalogs: default: '@supabase/auth-js': - specifier: 2.95.3 - version: 2.95.3 + specifier: 2.105.2 + version: 2.105.2 '@supabase/functions-js': - specifier: 2.95.3 - version: 2.95.3 + specifier: 2.105.2 + version: 2.105.2 + '@supabase/ssr': + specifier: 0.10.2 + version: 0.10.2 '@supabase/storage-js': - specifier: 2.95.3 - version: 2.95.3 + specifier: 2.105.2 + version: 2.105.2 '@supabase/supabase-js': - specifier: 2.95.3 - version: 2.95.3 + specifier: 2.105.2 + version: 2.105.2 '@types/eslint': specifier: 8.56.12 version: 8.56.12 @@ -31,8 +34,8 @@ catalogs: specifier: 8.57.1 version: 8.57.1 posthog-js: - specifier: 1.336.4 - version: 1.336.4 + specifier: 1.372.8 + version: 1.372.8 react: specifier: ^19.1.0 version: 19.1.1 @@ -86,7 +89,7 @@ importers: dependencies: posthog-js: specifier: 'catalog:' - version: 1.336.4 + version: 1.372.8 devDependencies: husky: specifier: ^9.1.7 @@ -123,7 +126,7 @@ importers: version: link:../../packages/utils '@supabase/supabase-js': specifier: 'catalog:' - version: 2.95.3 + version: 2.105.2 date-fns: specifier: ^4.1.0 version: 4.1.0 @@ -244,10 +247,10 @@ importers: version: link:../../packages/utils '@supabase/functions-js': specifier: 'catalog:' - version: 2.95.3 + version: 2.105.2 '@supabase/supabase-js': specifier: 'catalog:' - version: 2.95.3 + version: 2.105.2 '@tldraw/editor': specifier: 2.4.6 version: 2.4.6(patch_hash=88df41e89e43122c6a700d4917a83250639461079144bdbab7015f6b761e4582)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) @@ -319,7 +322,7 @@ importers: version: 2.0.4 posthog-js: specifier: 'catalog:' - version: 1.336.4 + version: 1.372.8 react: specifier: 18.2.0 version: 18.2.0 @@ -437,11 +440,11 @@ importers: specifier: workspace:* version: link:../../packages/ui '@supabase/ssr': - specifier: ^0.8.0 - version: 0.8.0(@supabase/supabase-js@2.95.3) + specifier: 'catalog:' + version: 0.10.2(@supabase/supabase-js@2.105.2) '@supabase/supabase-js': specifier: 'catalog:' - version: 2.95.3 + version: 2.105.2 clsx: specifier: ^2.1.1 version: 2.1.1 @@ -465,7 +468,7 @@ importers: version: 4.104.0(ws@8.18.3)(zod@3.25.76) posthog-js: specifier: 'catalog:' - version: 1.336.4 + version: 1.372.8 react: specifier: 'catalog:' version: 19.1.1 @@ -529,16 +532,16 @@ importers: version: link:../utils '@supabase/auth-js': specifier: 'catalog:' - version: 2.95.3 + version: 2.105.2 '@supabase/functions-js': specifier: 'catalog:' - version: 2.95.3 + version: 2.105.2 '@supabase/storage-js': specifier: 'catalog:' - version: 2.95.3 + version: 2.105.2 '@supabase/supabase-js': specifier: 'catalog:' - version: 2.95.3 + version: 2.105.2 tslib: specifier: 2.5.1 version: 2.5.1 @@ -556,8 +559,8 @@ importers: specifier: ^20 version: 20.19.13 '@vercel/sdk': - specifier: ^1.18.9 - version: 1.18.9(hono@4.11.7) + specifier: ^1.19.40 + version: 1.19.40 dotenv: specifier: ^16.6.1 version: 16.6.1 @@ -568,8 +571,8 @@ importers: specifier: ^3.1.3 version: 3.1.3 supabase: - specifier: ^2.75.0 - version: 2.75.0 + specifier: ^2.98.1 + version: 2.98.1 ts-node-maintained: specifier: ^10.9.5 version: 10.9.6(@types/node@20.19.13)(typescript@5.9.2) @@ -580,8 +583,8 @@ importers: specifier: 5.9.2 version: 5.9.2 vercel: - specifier: 50.9.6 - version: 50.9.6(typescript@5.9.2) + specifier: 53.1.0 + version: 53.1.0(typescript@5.9.2) packages/eslint-config: devDependencies: @@ -1084,6 +1087,9 @@ packages: '@bundled-es-modules/statuses@1.0.1': resolution: {integrity: sha512-yn7BklA5acgcBr+7w064fGV+SGIFySjCKpqjcWgBAIfrAkY+4GQTJJHQMeT3V/sgz23VTEVV8TtOmkvJAhFVfg==} + '@bytecodealliance/preview2-shim@0.17.6': + resolution: {integrity: sha512-n3cM88gTen5980UOBAD6xDcNNL3ocTK8keab21bpx1ONdA+ARj7uD1qoFxOWCyKlkpSi195FH+GeAut7Oc6zZw==} + '@chevrotain/cst-dts-gen@11.1.2': resolution: {integrity: sha512-XTsjvDVB5nDZBQB8o0o/0ozNelQtn2KrUVteIHSlPd2VAV2utEb6JzyCJaJ8tGxACR4RiBNWy5uYUHX2eji88Q==} @@ -2077,9 +2083,6 @@ packages: prop-types: ^15.0.0 react: '>=0.14.0' - '@iarna/toml@2.2.5': - resolution: {integrity: sha512-trnsAYxU3xnS1gPHPyU961coFyLkh4gAD/0zQ5mymY4yOZ+CYvsPqUbOFSw0aDM4y0tV7tiFxL/1XfXPNC6IPg==} - '@iconify/types@2.0.0': resolution: {integrity: sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==} @@ -2419,8 +2422,8 @@ packages: resolution: {integrity: sha512-QakrKIGniGuRVfWBdMsDea/dx1PNE739QJ7gCM41s9q+qaCYTHCdsIBXQVVXry3mfWAiaM9kT22Hyz53Uw8mfg==} engines: {node: '>=18'} - '@modelcontextprotocol/sdk@1.25.3': - resolution: {integrity: sha512-vsAMBMERybvYgKbg/l4L1rhS7VXV1c0CtyJg72vwxONVX0l4ZfKVAnZEWTQixJGTzKnELjQ59e4NbdFDALRiAQ==} + '@modelcontextprotocol/sdk@1.29.0': + resolution: {integrity: sha512-zo37mZA9hJWpULgkRpowewez1y6ML5GsXJPY8FI0tBBCd77HEvza4jDqRKOXgHNn867PVGCyTdzqpz0izu5ZjQ==} engines: {node: '>=18'} peerDependencies: '@cfworker/json-schema': ^4.1.1 @@ -2910,11 +2913,11 @@ packages: '@popperjs/core@2.11.8': resolution: {integrity: sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==} - '@posthog/core@1.17.0': - resolution: {integrity: sha512-8pDNL+/u9ojzXloA5wILVDXBCV5daJ7w2ipCALQlEEZmL752cCKhRpbyiHn3tjKXh3Hy6aOboJneYa1JdlVHrQ==} + '@posthog/core@1.28.2': + resolution: {integrity: sha512-Dii3pxDheG1WioztvV/MqHQMnb16jSFrl2HkDR1T5yf5/R7lPqJCFYt+eXkEdp/oAv/PD+1joyG6Ap/2quFmtQ==} - '@posthog/types@1.336.4': - resolution: {integrity: sha512-BY3cq/8segbXEvHbEXx9SWmaKJEM0AGgsOgMFH2yy13AV+rUHsGcp4Z5LDI5pU25DURN9EAZvzcoVyYy/Iokmw==} + '@posthog/types@1.372.8': + resolution: {integrity: sha512-ALpfCnWsMSM9Cw/6kyLPVpd81ZReEdZwmDxOi+DTJuIo7wDxBiu2cAsjOuA6D/AL22v7HOJrHsmBAPAWqS5X7Q==} '@protobufjs/aspromise@1.1.2': resolution: {integrity: sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==} @@ -3935,6 +3938,10 @@ packages: '@remirror/core-constants@3.0.0': resolution: {integrity: sha512-42aWfPrimMfDKDi4YegyS7x+/0tlzaqwPQCULLanv3DMIlu96KTJR0fM5isWX2UViOqlGnX6YFgqWepcX+XMNg==} + '@renovatebot/pep440@4.2.1': + resolution: {integrity: sha512-2FK1hF93Fuf1laSdfiEmJvSJPVIDHEUTz68D3Fi9s0IZrrpaEcj6pTFBTbYvsgC5du4ogrtf5re7yMMvrKNgkw==} + engines: {node: ^20.9.0 || ^22.11.0 || ^24, pnpm: ^10.0.0} + '@rolldown/binding-android-arm64@1.0.0-rc.1': resolution: {integrity: sha512-He6ZoCfv5D7dlRbrhNBkuMVIHd0GDnjJwbICE1OWpG7G3S2gmJ+eXkcNLJjzjNDpeI2aRy56ou39AJM9AD8YFA==} engines: {node: ^20.19.0 || >=22.12.0} @@ -4306,33 +4313,36 @@ packages: resolution: {integrity: sha512-IUuj2zpGdeKaY5OdGnU83BUJsv7OA9uw3rNVSOuvzLMXMpBTU+W6V0SsQh6iI32lKUJArlnEU4BIzp83hghR/g==} engines: {node: '>=18.0.0'} - '@supabase/auth-js@2.95.3': - resolution: {integrity: sha512-vD2YoS8E2iKIX0F7EwXTmqhUpaNsmbU6X2R0/NdFcs02oEfnHyNP/3M716f3wVJ2E5XHGiTFXki6lRckhJ0Thg==} + '@supabase/auth-js@2.105.2': + resolution: {integrity: sha512-CpbqX05URyiSZjMeeJ9Op/dlWOd2oB3b7WbPkFYhkRGHeX6QEvBcjllBdPWEmHEzVKpDW6N1QkE5Rq2h6sPqDg==} engines: {node: '>=20.0.0'} - '@supabase/functions-js@2.95.3': - resolution: {integrity: sha512-uTuOAKzs9R/IovW1krO0ZbUHSJnsnyJElTXIRhjJTqymIVGcHzkAYnBCJqd7468Fs/Foz1BQ7Dv6DCl05lr7ig==} + '@supabase/functions-js@2.105.2': + resolution: {integrity: sha512-MToj3KvxquzYm//shCQPJj5Wtc9pltgne72KrAptIh0T4zZz3pU2cLL+sHb1w/s/gECcDQCQlfDSPfxpxqvXNg==} engines: {node: '>=20.0.0'} - '@supabase/postgrest-js@2.95.3': - resolution: {integrity: sha512-LTrRBqU1gOovxRm1vRXPItSMPBmEFqrfTqdPTRtzOILV4jPSueFz6pES5hpb4LRlkFwCPRmv3nQJ5N625V2Xrg==} + '@supabase/phoenix@0.4.1': + resolution: {integrity: sha512-hWGJkDAfWUNY8k0C080u3sGNFd2ncl9erhKgP7hnGkgJWEfT5Pd/SXal4QmWXBECVlZrannMAc9sBaaRyWpiUA==} + + '@supabase/postgrest-js@2.105.2': + resolution: {integrity: sha512-LQykk8LLUAnoShOlpJZzSRq50c2Vvwy8cxZ0jCXwHMaN7YFQUFunLstwz/dF7B3s6fLVHa+lNbw31mD0wLlaXg==} engines: {node: '>=20.0.0'} - '@supabase/realtime-js@2.95.3': - resolution: {integrity: sha512-D7EAtfU3w6BEUxDACjowWNJo/ZRo7sDIuhuOGKHIm9FHieGeoJV5R6GKTLtga/5l/6fDr2u+WcW/m8I9SYmaIw==} + '@supabase/realtime-js@2.105.2': + resolution: {integrity: sha512-FcQP1Ki1vAFwBcOlpz+Qbw9afP6t+R6mLPNVp6ap0XQIf4vo7/1Qv5VPCpb8skpMrbcPNzqA97rAjyzmN2g+NA==} engines: {node: '>=20.0.0'} - '@supabase/ssr@0.8.0': - resolution: {integrity: sha512-/PKk8kNFSs8QvvJ2vOww1mF5/c5W8y42duYtXvkOSe+yZKRgTTZywYG2l41pjhNomqESZCpZtXuWmYjFRMV+dw==} + '@supabase/ssr@0.10.2': + resolution: {integrity: sha512-JFbchN63CXLFHJRNT7udec4/RoD9PmXkSGko3QSO6vUuqGBtSzdmxR7FPfQNr7SuFd65I7Xv46q66ALjEN1cgQ==} peerDependencies: - '@supabase/supabase-js': ^2.76.1 + '@supabase/supabase-js': ^2.102.1 - '@supabase/storage-js@2.95.3': - resolution: {integrity: sha512-4GxkJiXI3HHWjxpC3sDx1BVrV87O0hfX+wvJdqGv67KeCu+g44SPnII8y0LL/Wr677jB7tpjAxKdtVWf+xhc9A==} + '@supabase/storage-js@2.105.2': + resolution: {integrity: sha512-OgPJxGOF4gCbp3uHGJmqZZ0Rg2qCoDZajfkczvG+HD61sQQOiKnf4RkWD8rx2mili5zMUJt6/bQrd5Zj7pgLug==} engines: {node: '>=20.0.0'} - '@supabase/supabase-js@2.95.3': - resolution: {integrity: sha512-Fukw1cUTQ6xdLiHDJhKKPu6svEPaCEDvThqCne3OaQyZvuq2qjhJAd91kJu3PXLG18aooCgYBaB6qQz35hhABg==} + '@supabase/supabase-js@2.105.2': + resolution: {integrity: sha512-sKP5nVgBrHoCLjQ3MY1wFWT5LCaFFzm/SRecRTQ90BRQ3Z3uWBq0XBVeH/SVrLSA8wrGce5vUORg3bjhrk68Ww==} engines: {node: '>=20.0.0'} '@swc/helpers@0.5.15': @@ -4864,9 +4874,6 @@ packages: '@types/normalize-package-data@2.4.4': resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==} - '@types/phoenix@1.6.6': - resolution: {integrity: sha512-PIzZZlEppgrpoT2QgbnDU+MMzuR6BbCjllj0bM70lWoejMeNJAxCchxnv7J3XFkI8MpygtRpzXrIlmWUBclP5A==} - '@types/prop-types@15.7.15': resolution: {integrity: sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw==} @@ -5134,113 +5141,120 @@ packages: peerDependencies: react: '>= 16.8.0' - '@vercel/backends@0.0.24': - resolution: {integrity: sha512-Rs8hGZ/PMBskdajlxmb71VHB4arX1grMO0HaRwtNb2cY2wPbscNXXTdVGBGkoIQyAg5c9CtaeiIcGDFCjgdApA==} - - '@vercel/blob@1.0.2': - resolution: {integrity: sha512-Im/KeFH4oPx7UsM+QiteimnE07bIUD7JK6CBafI9Z0jRFogaialTBMiZj8EKk/30ctUYsrpIIyP9iIY1YxWnUQ==} - engines: {node: '>=16.14'} + '@vercel/backends@0.3.0': + resolution: {integrity: sha512-mhTPAeX6w2zS7GvANq+Ox2qHExFevDK8BIkAnJIIhYgrey7kFlZTM04AZjZYctybsvyInPyPYUwgpmVWNotTGg==} + peerDependencies: + typescript: ^4.0.0 || ^5.0.0 '@vercel/blob@1.1.1': resolution: {integrity: sha512-heiJGj2qt5qTv6yiShH9f6KRAoZGj+lz61GQ+lBRL4lhvUmKI9A51KYlQTnsUd9ymdFlKHBlvmPeG+yGz2Qsbg==} engines: {node: '>=16.14'} - '@vercel/build-utils@13.2.16': - resolution: {integrity: sha512-5i6q9xXhDaZ75bQ/VMMCyeXtRY1HTJXj47ch3BEN42BgNdvFoDSL0eQVMzi80yRjyTvJ1bzGpn1A1K5aswLZVQ==} + '@vercel/blob@2.3.0': + resolution: {integrity: sha512-oYWiJbWRQ7gz9Mj0X/NHFJ3OcLMOBzq/2b3j6zeNrQmtFo6dHwU8FAwNpxVIYddVMd+g8eqEi7iRueYx8FtM0Q==} + engines: {node: '>=20.0.0'} + + '@vercel/build-utils@13.21.0': + resolution: {integrity: sha512-A1vtlzFYbjvxRxhnt94LUxrn9JVX2EuXALi/NFyxNA1M51eGQwI5LZaroNlgIRXdx7LCJxBQEUMKc1fi0aqU/g==} - '@vercel/cervel@0.0.11': - resolution: {integrity: sha512-3AH3jAcKR5GaVr5XZ4j4xkG+axhgZ4adbHig9439vzQN/pT4It97iONKENgbCQtBaG3rvsDJAd+Qjfhf0loi/Q==} + '@vercel/cervel@0.1.0': + resolution: {integrity: sha512-YFihXM6jTNzCsX3t9thDbQxjHtQvYzN5lbv/Q+pwMNFwWrMqeFMdshXzM0qm1UH7lnW6OUQ4cNbc6xQU6JTuVQ==} hasBin: true peerDependencies: typescript: ^4.0.0 || ^5.0.0 - '@vercel/detect-agent@1.1.0': - resolution: {integrity: sha512-Zfq6FbIcYl9gaAmVu6ROsqUiCNwpEj3Ljz/tMX5fl12Z95OFOxzf7vlO03WE5JBU/ri1tBDFHnW41dihMINOPQ==} + '@vercel/detect-agent@1.2.3': + resolution: {integrity: sha512-VYNCgUc0nOmC4WJmWw9GkrKdfr8Zl4/rxhC5SvgacBgxiW9W/9NRttUoHHXV8xdII3MaRgkZZVX8Ikzc/Jmjag==} engines: {node: '>=14'} - '@vercel/elysia@0.1.27': - resolution: {integrity: sha512-vMXA3WRTTyHjuueDLymZQ2btb0zN8LZlwCtG4oEFCePcP6zdPFht8BLXNfVetEGz26TYZSoLKdZxVo4CgV9MLg==} + '@vercel/elysia@0.1.73': + resolution: {integrity: sha512-TSPiGgIYW1lwR2Rjjbf86dTAxepweu1+5sei/EzFXiqcCpFzVElO6aETNCeimOTcrwft7//+IsaSpVBwxkyqFw==} - '@vercel/error-utils@2.0.3': - resolution: {integrity: sha512-CqC01WZxbLUxoiVdh9B/poPbNpY9U+tO1N9oWHwTl5YAZxcqXmmWJ8KNMFItJCUUWdY3J3xv8LvAuQv2KZ5YdQ==} + '@vercel/error-utils@2.1.0': + resolution: {integrity: sha512-DiJcXBOB9N6QM4d7hYPM9Ck/AUjzBl58XNQPxS74o7CuvIanjzrGgygP/70VsyEASeIJMazk1LrhwcNTR/eZGQ==} - '@vercel/express@0.1.35': - resolution: {integrity: sha512-lviPeaL9NQDreXezoqV0V72ww1q239xHHJb2l0aoRQZiZ69wXC/jGqXYY4bi3RjYPz90jMODjFYKI+hwJnSvxw==} + '@vercel/express@0.1.83': + resolution: {integrity: sha512-nFgPKHKG/rckqy6JbOqjNyFNM6PdqFmomYnGaSliZ/a4kXxadPK4NVBrhQ0aJJvDIWv+Gx6IX99QPkKLRq47Lg==} - '@vercel/fastify@0.1.30': - resolution: {integrity: sha512-34Pz8TYJtsaIo6TYb91lFBfPJtQASJVq8Xa8S63UgWyscJuy1kO4keWiPizfWs6rXLmozSbeXW9e+6z7PvOGWw==} + '@vercel/fastify@0.1.76': + resolution: {integrity: sha512-rbKXsOYlW0cUuXjDkkl9az9tB3ukkFsQjZwT/E3o9IXhZsMmYPWGG1CqS65/qYCpsF9bCfXgPgDBErDxL1NrgA==} - '@vercel/fun@1.2.1': - resolution: {integrity: sha512-p0IuyxKAnaV9P7xApKBDYXdPheErVyoi68tt2l8i2g20n26FgZ7IQoDsFfmTg/ClllxhdOnaArNAFu2XBmfCxw==} + '@vercel/fun@1.3.0': + resolution: {integrity: sha512-8erw9uPe0dFg45THkNxmjtvMX143SkZebmjgSVbcM3XCkXu3RIiBaJMcMNG8aaS+rnTuw8+d4De9HVT0M/r3wg==} engines: {node: '>= 18'} '@vercel/gatsby-plugin-vercel-analytics@1.0.11': resolution: {integrity: sha512-iTEA0vY6RBPuEzkwUTVzSHDATo1aF6bdLLspI68mQ/BTbi5UQEGjpjyzdKOVcSYApDtFU6M6vypZ1t4vIEnHvw==} - '@vercel/gatsby-plugin-vercel-builder@2.0.127': - resolution: {integrity: sha512-Y4zoxkAc6vn+MkdG78Wbm5B7zXHbAKZitfVpia6oCbfhu4hDIUmqMmQJeGLZmTSB00V0eOEIBWd39/AvrTDI2Q==} - - '@vercel/go@3.3.4': - resolution: {integrity: sha512-PAa7XYZk+ZuE3pWuPJU32fdDl3YH9+f9iYkd/yFhhRgHsd0PqCB5HQ+EHUKsso+BHlYo145GV6cPLh+HE+UI1A==} + '@vercel/gatsby-plugin-vercel-builder@2.2.0': + resolution: {integrity: sha512-Qs3b6OjGsWdjCsSo6elZ96Ip7Bs0sgN5fkTMdKGzH/IOpX+UOXiuu3uOIjvLDMAf2zOZHwlBGYMNKXF5WW/NvQ==} - '@vercel/h3@0.1.36': - resolution: {integrity: sha512-Uh/LtmWDgq6tpqB9pmpqgjntdFmGrmzSQggPzs/x6zKlzDMWxvItnB1D+1SD/vKTcImmFwOlCOOcNgFr/ZynCA==} + '@vercel/go@3.6.0': + resolution: {integrity: sha512-60gQxuQBfuGQCPdp1zmG3bfWncj+MRDm9KNogKeu4cA1uC2kGwUoCI6vr8kpGTv62v3gwSLbcnJ3RsqOqxb3KA==} - '@vercel/hono@0.2.30': - resolution: {integrity: sha512-w7Ctqw8P/MP0trBnAxiK7vm6Zm0L8JLlYdTXhaCjaMH8Q7+/bFsYXApyccJ//cMIJ9oRTSDmxy37ibUh9kzMzA==} + '@vercel/h3@0.1.82': + resolution: {integrity: sha512-tiLO/+EcrWYFYT3OvF/gI63Arc60w5m3zPU4dMrTuHnm0DW418oPFVvtKdN/B2FOGN+KEeUrfl8uXz1AdyTSog==} - '@vercel/hydrogen@1.3.5': - resolution: {integrity: sha512-7EE6yVKcCnjMb1io9y069GkLyGyIzRbW3Krm3Q7EEfJ3P46h9xe9v/O5UhBoPrwtqDUHxmDngZp9YyfgY8IITA==} + '@vercel/hono@0.2.76': + resolution: {integrity: sha512-gveEPPtgMHVl0Q9GPQw7FSLslBGJ8EidF56vsDyCtLIsfyIXnEiMXT9fwQ3u2fH7nc7FRk0hjFiqlhY1km8Xwg==} - '@vercel/introspection@0.0.10': - resolution: {integrity: sha512-saUF0T9NpN24HXo0xt3qrgrfg6hGnqosQeHXSPTuLprhBL58DONS+So7jfa8eNi+1vW8CHJVV8USfQ5OeCT25A==} + '@vercel/hydrogen@1.3.7': + resolution: {integrity: sha512-nh8hZ76Ipf9FRmMmQGd4SjkE0zxdjt+TUpZcuCIUG7yaHEh9STQV655I8rxKCB3hEWaKB3HALGgxZ0htIjQtZQ==} - '@vercel/koa@0.1.10': - resolution: {integrity: sha512-3vvz3o9kc9wzIh4wHuHkfAFFdZN0Ga+NwNeN3iKSxwt6RhjjyxfFY1d8LONUXNjh7m+Val0AM9g/Ij5o7Xaizg==} + '@vercel/koa@0.1.56': + resolution: {integrity: sha512-5edjnf3QiTvVCucp+peZ8RICcGjaZqbsuD6dzl6DrSUvXfSPF9Enjv/OoUErZbRCTlRjyUw7nzGP8CLf7o7XMQ==} - '@vercel/nestjs@0.2.31': - resolution: {integrity: sha512-OGcUy8rrGKnrQO/izSfwEG01wcJBQCv2IXR1jTlPjAd6ijEfss9qBPGC/Rmp6yaYeg8IFZl9J0479gyZ+l3qUA==} + '@vercel/nestjs@0.2.77': + resolution: {integrity: sha512-1nxP4Tcf+RQKkQA1f5bUXCUK8vhcnRzHocFiU2bE6+uu85UTaG13/VeUcYTQCmywPcomsPKi6u8B+S9fKv09xA==} - '@vercel/next@4.15.20': - resolution: {integrity: sha512-qJGLmhUGw7Iv1FYIDn0C4xmCOKQIKK8pigo8insAUkE+z3k1Hg4DbU3EpOfi8npztA/zzCRgcHfAWdB2X77X+A==} + '@vercel/next@4.17.0': + resolution: {integrity: sha512-7Yr2gdD2XMdl77Yy/y2SZfi4z8KcziKuoVgKMs25tA5qcarej6YcgOdf2FUfIf+OSdMl+MJmv+1IEE0pBj4hiA==} - '@vercel/nft@1.1.1': - resolution: {integrity: sha512-mKMGa7CEUcXU75474kOeqHbtvK1kAcu4wiahhmlUenB5JbTQB8wVlDI8CyHR3rpGo0qlzoRWqcDzI41FUoBJCA==} + '@vercel/nft@1.5.0': + resolution: {integrity: sha512-IWTDeIoWhQ7ZtRO/JRKH+jhmeQvZYhtGPmzw/QGDY+wDCQqfm25P9yIdoAFagu4fWsK4IwZXDFIjrmp5rRm/sA==} engines: {node: '>=20'} hasBin: true - '@vercel/nft@1.3.0': - resolution: {integrity: sha512-i4EYGkCsIjzu4vorDUbqglZc5eFtQI2syHb++9ZUDm6TU4edVywGpVnYDein35x9sevONOn9/UabfQXuNXtuzQ==} - engines: {node: '>=20'} - hasBin: true + '@vercel/node@5.7.15': + resolution: {integrity: sha512-o8YtafKgaYsY7/4SRKlrvTx/cEB5o3vQG3/eq5Qo66n4WaFeZV8R8GG+BzSU3SYozasQlQxkbPxedUNF4sZJ8A==} + + '@vercel/oidc@3.2.0': + resolution: {integrity: sha512-UycprH3T6n3jH0k44NHMa7pnFHGu/N05MjojYr+Mc6I7obkoLIJujSWwin1pCvdy/eOxrI/l3uDLQsmcrOb4ug==} + engines: {node: '>= 20'} - '@vercel/node@5.5.28': - resolution: {integrity: sha512-zuhUKqFdeoTz+o6S5zyKKXERrxbJpFmbt5qMrsg7t2pfxJZSAR6xg+HRSJd710uJnKpmi4h89hp/TIu1CuvAUQ==} + '@vercel/prepare-flags-definitions@0.2.1': + resolution: {integrity: sha512-ouXTsqn7I9xZ1KKezgvn/w3tZeQHL/tc52j9GHiOYi6kT8xgdbT8s2x8C9BQr44iceX0hfhtZwk9q7NuI2Tqbw==} - '@vercel/python@6.4.2': - resolution: {integrity: sha512-sFQZnhAXA3PNKfSgbnpy/eL3wybsp/Et03VvB+mgLmAus9ENSmMu7Kqr6gb2CT2PHMa+Bz8mhlRuAiuu2PRKtA==} + '@vercel/python-analysis@0.11.1': + resolution: {integrity: sha512-EPPLuXJQhIDUx08H9nG76AR2HSgBquwe3OAX5s2w20M923iaWeGGVkhX/4yZ89CJfXEZgE1Aj/mX7lVHOVIcYA==} - '@vercel/redwood@2.4.9': - resolution: {integrity: sha512-U7bYIuWfMEFMIcKKbX7lTT8pFNjig9Q3vLeCYRYQUrKVP8xLoUBXSEfW3ijtWJBUV8GmbZCDI30A16uUfNhN+g==} + '@vercel/python@6.37.0': + resolution: {integrity: sha512-MYPt5YUVDqo+sf5B38QyJMcXIm0oBR6xj7qnzan95r31ebYTxx6/iA0vIVFNLVR8LstkWK/xPknFN5jG8hu6qA==} - '@vercel/remix-builder@5.5.9': - resolution: {integrity: sha512-uVscM3Hx+2AqCnwUpksIZG2ADC3+mPnjyKtsvjHUWEgnxVgADp5MStSoVuQT6AKWwSEnBtxMfNi13I20MwUeeg==} + '@vercel/redwood@2.4.13': + resolution: {integrity: sha512-pXWzVctZea/J7WMQstjsYUDiMc6oJF72p8J5YZnLSCJWg7m+/dLzYGfaUSEo6Q0JpiO/NOcDmG3WENpn7kHwzg==} - '@vercel/ruby@2.2.5': - resolution: {integrity: sha512-DeSHZDEU1BvxzomHeBDsFyZ9VL2U/rUC15Ce4Asaw6LadYPyQ9HEvREJC7Vz4f2iHHD0iamJG9znaC3/UgvQDg==} + '@vercel/remix-builder@5.8.0': + resolution: {integrity: sha512-phMAw9GfWQZhYQbPzjq069zCzgI3cqs29nvoUPhmGJNz8chmphb3UHWy+MaeBLoUC3rneJzYQd1DtP2xtrMZXQ==} - '@vercel/rust@1.0.5': - resolution: {integrity: sha512-Y03g59nv1uT6Da+PvB/50WqJSHlaFZ9MSkG00R82dUcTySslMbQdOeaXymZtabrmU8zQYhWDb1/CwBki8sWnaQ==} + '@vercel/ruby@2.3.2': + resolution: {integrity: sha512-okIgMmPEePyDR9TZYaKM4oftcxVHM5Dbdl7V/tIdh3lq8MGLi7HR5vvQglmZUwZOeovE6MVtezxl960EOzeIiQ==} - '@vercel/sdk@1.18.9': - resolution: {integrity: sha512-wB1Mc4SP4I61FQN1flzY/4dIpu5jPX1sCDA/bzoOOYVDlJ3GPt11/iHyOO3KB+wDD9Bjv/h18jroMAf7Il3ccw==} + '@vercel/rust@1.2.0': + resolution: {integrity: sha512-JryMtBa0sFuqxfHpjrNgMks06XDKa8DVhGljTsoo26dIKqsoqeYhJHuepEAEXT+b5N+tUmxIOUcRq5//ewvytQ==} + + '@vercel/sandbox@1.9.0': + resolution: {integrity: sha512-zgr1ad0tkT1xZn/8Vxo60wOUOLqMAVGo4WqJQ8/UDcUtWynNJsBjI2tiMdWZrAo9EKH1MIqEzJNkcclF0UT1EQ==} + + '@vercel/sdk@1.19.40': + resolution: {integrity: sha512-DldsmD8ejrm99E/K0y/EBtgF13OzdWO6OxwOVOAhErUqVssxx2AOZtI/RgsKwEYuEc5xfB31cHOn7suHDmaTVQ==} hasBin: true - '@vercel/static-build@2.8.28': - resolution: {integrity: sha512-NAyZZ8AXGHdcKelbA8zYoZ76abgv1Uf3axuwgHtvnfHmkJtao3KAJWm4NhLLy05jo4I1iFmIjEslU3k0CFECew==} + '@vercel/static-build@2.9.22': + resolution: {integrity: sha512-zkwy48kv+4UlL3TTC8uoX2nWPdKXAydkKE/D8QYFq895Nq/CDB19r1q5vXno2iO9/njDsfYdl0Ftk7nXcexzgw==} - '@vercel/static-config@3.1.2': - resolution: {integrity: sha512-2d+TXr6K30w86a+WbMbGm2W91O0UzO5VeemZYBBUJbCjk/5FLLGIi8aV6RS2+WmaRvtcqNTn2pUA7nCOK3bGcQ==} + '@vercel/static-config@3.3.0': + resolution: {integrity: sha512-GpS3tPwUeDJCkrKbMNtS2XLRFgfxTlN7YNUL+Bo23+fGolrDw6Oq79R3yvxTYgqRaJMGSEqC7iMw6mj6I5loxg==} '@vercel/style-guide@6.0.0': resolution: {integrity: sha512-tu0wFINGz91EPwaT5VjSqUwbvCY9pvLach7SPG4XyfJKPU9Vku2TFa6+AyzJ4oroGbo9fK+TQhIFHrnFl0nCdg==} @@ -5268,6 +5282,10 @@ packages: '@yarnpkg/lockfile@1.1.0': resolution: {integrity: sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==} + '@yarnpkg/parsers@3.0.3': + resolution: {integrity: sha512-mQZgUSgFurUtA07ceMjxrWkYz8QtDuYkvPlu0ZqncgjopQ0t6CNEo/OSealkmnagSUx8ZD5ewvezUwUuMqutQg==} + engines: {node: '>=18.12.0'} + abab@2.0.6: resolution: {integrity: sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==} deprecated: Use your platform's native atob() and btoa() methods instead @@ -5328,6 +5346,10 @@ packages: resolution: {integrity: sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==} engines: {node: '>= 14'} + agent-base@9.0.0: + resolution: {integrity: sha512-TQf59BsZnytt8GdJKLPfUZ54g/iaUL2OWDSFCCvMOhsHduDQxO8xC4PNeyIkVcA5KwL2phPSv0douC0fgWzmnA==} + engines: {node: '>= 20'} + agentkeepalive@4.6.0: resolution: {integrity: sha512-kja8j7PjmncONqaTsB8fQ+wE2mSU2DJ9D4XKoJ5PFWIdRMa6SLSN1ff4mOr4jCbfRSsxR4keIiySJU0N9T5hIQ==} engines: {node: '>= 8.0.0'} @@ -5561,12 +5583,28 @@ packages: resolution: {integrity: sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==} engines: {node: '>= 0.4'} + b4a@1.8.1: + resolution: {integrity: sha512-aiqre1Nr0B/6DgE2N5vwTc+2/oQZ4Wh1t4NznYY4E00y8LCt6NqdRv81so00oo27D8MVKTpUa/MwUUtBLXCoDw==} + peerDependencies: + react-native-b4a: '*' + peerDependenciesMeta: + react-native-b4a: + optional: true + bail@2.0.2: resolution: {integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==} balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + bare-events@2.8.2: + resolution: {integrity: sha512-riJjyv1/mHLIPX4RwiK+oW9/4c3TEUeORHKefKAKnZ5kyslbN+HXowtbaVEqt4IMUB7OXlfixcs6gsFeo/jhiQ==} + peerDependencies: + bare-abort-controller: '*' + peerDependenciesMeta: + bare-abort-controller: + optional: true + base64-js@1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} @@ -5607,6 +5645,10 @@ packages: resolution: {integrity: sha512-02qvAaxv8tp7fBa/mw1ga98OGm+eCbqzJOKoRt70sLmfEEi+jyBYVTDGfCL/k06/4EMk/z01gCe7HoCH/f2LTg==} engines: {node: '>=18'} + body-parser@2.2.2: + resolution: {integrity: sha512-oP5VkATKlNwcgvxi0vM0p/D3n2C3EReYVX+DNYs5TjZFn/oQt2j+4sVJtSMr18pdRr8wjTcBl6LoV+FUwzPmNA==} + engines: {node: '>=18'} + bowser@2.12.1: resolution: {integrity: sha512-z4rE2Gxh7tvshQ4hluIT7XcFrgLIQaw9X3A+kTTRdovCz5PMukm/0QC/BKSYPj3omF5Qfypn9O/c5kgpmvYUCw==} @@ -5757,10 +5799,6 @@ packages: resolution: {integrity: sha512-mxIojEAQcuEvT/lyXq+jf/3cO/KoA6z4CeNDGGevTybECPOMFCnQy3OPahluUkbqgPNGw5Bi78UC7Po6Lhy+NA==} engines: {node: '>= 14.16.0'} - chownr@2.0.0: - resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} - engines: {node: '>=10'} - chownr@3.0.0: resolution: {integrity: sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==} engines: {node: '>=18'} @@ -6480,6 +6518,9 @@ packages: dompurify@3.3.1: resolution: {integrity: sha512-qkdCKzLNtrgPFP1Vo+98FRzJnBRGe4ffyCea9IwHB1fyxPOeNTHpLKYGd4Uk9xvNoH0ZoOjwZxNptyMwqrId1Q==} + dompurify@3.4.2: + resolution: {integrity: sha512-lHeS9SA/IKeIFFyYciHBr2n0v1VMPlSj843HdLOwjb2OxNwdq9Xykxqhk+FE42MzAdHvInbAolSE4mhahPpjXA==} + domutils@3.2.2: resolution: {integrity: sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==} @@ -6572,6 +6613,9 @@ packages: es-module-lexer@1.4.1: resolution: {integrity: sha512-cXLGjP0c4T3flZJKQSuziYoq7MlT+rnvfZjfp7h+I7K9BNX54kP9nyWvdbwjQ4u1iWbOL4u96fgeZLToQlZC7w==} + es-module-lexer@1.5.0: + resolution: {integrity: sha512-pqrTKmwEIgafsYZAGw9kszYzmagcE/n4dbgwGWLEXg7J4QFJVQRBld8j3Q3GNez79jzxZshq0bcT962QHOghjw==} + es-object-atoms@1.1.1: resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} engines: {node: '>= 0.4'} @@ -6913,6 +6957,9 @@ packages: events-intercept@2.0.0: resolution: {integrity: sha512-blk1va0zol9QOrdZt0rFXo5KMkNPVSp92Eju/Qz8THwKWKRKeE0T8Br/1aW6+Edkyq9xHYgYxn2QtOnUKPUp+Q==} + events-universal@1.0.1: + resolution: {integrity: sha512-LUd5euvbMLpwOF8m6ivPCbhQeSiYVNb8Vs0fQ8QjXo0JTkEHpz8pxdQf0gStltaPpw0Cca8b39KxvK9cfKRiAw==} + eventsource-parser@3.0.6: resolution: {integrity: sha512-Vo1ab+QXPzZ4tCa8SwIHJFaSzy4R6SHf7BY79rFBDf0idraZWAkYrDjDj8uWaSm3S2TK+hJ7/t1CEmZ7jXw+pg==} engines: {node: '>=18.0.0'} @@ -6951,10 +6998,20 @@ packages: peerDependencies: express: '>= 4.11' + express-rate-limit@8.4.1: + resolution: {integrity: sha512-NGVYwQSAyEQgzxX1iCM978PP9AdO/hW93gMcF6ZwQCm+rFvLsBH6w4xcXWTcliS8La5EPRN3p9wzItqBwJrfNw==} + engines: {node: '>= 16'} + peerDependencies: + express: '>= 4.11' + express@5.1.0: resolution: {integrity: sha512-DT9ck5YIRU+8GYzzU5kT3eHGA5iL+1Zd0EutOmTE9Dtk+Tvuzd23VBU+ec7HPNSTxXYO55gPV/hq4pSBJDjFpA==} engines: {node: '>= 18'} + express@5.2.1: + resolution: {integrity: sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw==} + engines: {node: '>= 18'} + exsolve@1.0.8: resolution: {integrity: sha512-LmDxfWXwcTArk8fUEnOfSZpHOJ6zOMUJKOtFLFqJLoKJetuQG874Uc7/Kki7zFLzYybmZhp1M7+98pfMqeX8yA==} @@ -6978,6 +7035,9 @@ packages: fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + fast-fifo@1.3.2: + resolution: {integrity: sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==} + fast-glob@3.3.1: resolution: {integrity: sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==} engines: {node: '>=8.6.0'} @@ -7133,6 +7193,10 @@ packages: resolution: {integrity: sha512-0rcTq621PD5jM/e0a3EJoGC/1TC5ZBCERW82LQuwfGnCa1V8w7dpYH1yNu+SLb6E5dkeCBzKEyLGlFrnr+dUyw==} engines: {node: '>=14.14'} + fs-extra@11.1.1: + resolution: {integrity: sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ==} + engines: {node: '>=14.14'} + fs-extra@11.3.1: resolution: {integrity: sha512-eXvGGwZ5CL17ZSwHWd3bbgk7UUpF6IFHtP57NYYakPvHOs8GDgDe5KJI36jIJzDkJ6eJjuzRA8eBQb6SkKue0g==} engines: {node: '>=14.14'} @@ -7141,10 +7205,6 @@ packages: resolution: {integrity: sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==} engines: {node: '>=10'} - fs-minipass@2.1.0: - resolution: {integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==} - engines: {node: '>= 8'} - fs.realpath@1.0.0: resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} @@ -7482,6 +7542,10 @@ packages: resolution: {integrity: sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==} engines: {node: '>= 14'} + https-proxy-agent@9.0.0: + resolution: {integrity: sha512-/MVmHp58WkOypgFhCLk4fzpPcFQvTJ/e6LBI7irpIO2HfxUbpmYoHF+KzipzJpxxzJu7aJNWQ0xojJ/dzV2G5g==} + engines: {node: '>= 20'} + human-signals@1.1.1: resolution: {integrity: sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==} engines: {node: '>=8.12.0'} @@ -7592,6 +7656,10 @@ packages: resolution: {integrity: sha512-NWv9YLW4PoW2B7xtzaS3NCot75m6nK7Icdv0o3lfMceJVRfSoQwqD4wEH5rLwoKJwUiZ/rfpiVBhnaF0FK4HoA==} engines: {node: '>= 12'} + ip-address@10.1.0: + resolution: {integrity: sha512-XXADHxXmvT9+CRxhXg56LJovE+bmWnEWB78LB83VZTprKTmaC5QfruXocxzTZ2Kl0DNwKuBdlIhjL8LeY8Sf8Q==} + engines: {node: '>= 12'} + ipaddr.js@1.9.1: resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} engines: {node: '>= 0.10'} @@ -7925,6 +7993,10 @@ packages: resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} hasBin: true + js-yaml@4.1.1: + resolution: {integrity: sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==} + hasBin: true + jsdom@20.0.3: resolution: {integrity: sha512-SYhBvTh89tTfCD/CRdSOm13mOBa42iTaTyfyEWBdKcGdPxPtLFBXuHR8XHb33YNYaP+lLbmSvBTsnoesCNJEsQ==} engines: {node: '>=14'} @@ -7976,6 +8048,9 @@ packages: jsonfile@6.2.0: resolution: {integrity: sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==} + jsonlines@0.1.1: + resolution: {integrity: sha512-ekDrAGso79Cvf+dtm+mL8OBI2bmAOt3gssYs833De/C9NmIpWDWyUO4zPgB5x2/OhY366dkhgfPMYfwZF7yOZA==} + jsx-ast-utils@3.3.5: resolution: {integrity: sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==} engines: {node: '>=4.0'} @@ -8513,14 +8588,6 @@ packages: minimist@1.2.8: resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} - minipass@3.3.6: - resolution: {integrity: sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==} - engines: {node: '>=8'} - - minipass@5.0.0: - resolution: {integrity: sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==} - engines: {node: '>=8'} - minipass@7.1.2: resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} engines: {node: '>=16 || 14 >=14.17'} @@ -8528,10 +8595,6 @@ packages: minisearch@7.2.0: resolution: {integrity: sha512-dqT2XBYUOZOiC5t2HRnwADjhNS2cecp9u+TJRiJ1Qp/f5qjkeT5APcGPjHw+bz89Ms8Jp+cG4AlE+QZ/QnDglg==} - minizlib@2.1.2: - resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==} - engines: {node: '>= 8'} - minizlib@3.1.0: resolution: {integrity: sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==} engines: {node: '>= 18'} @@ -8681,9 +8744,6 @@ packages: react: '>=18' react-dom: '>=18' - nf3@0.3.6: - resolution: {integrity: sha512-/XRUUILTAyuy1XunyVQuqGp8aEmZ2TfRTn8Rji+FA4xqv20qzL4jV7Reqbuey2XucKgPeRVcEYGScmJM0UnB6Q==} - nice-try@1.0.5: resolution: {integrity: sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==} @@ -9196,8 +9256,8 @@ packages: resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} engines: {node: ^10 || ^12 || >=14} - posthog-js@1.336.4: - resolution: {integrity: sha512-NX81XaqOjS/gue3UsbAAuJxi6vD0AGy1HUvywBIhAArCwbTXKS04NhEFwUcYJdrmwXUf94MntEIWGoc1pTFDtg==} + posthog-js@1.372.8: + resolution: {integrity: sha512-NAFWVScFGnU5jgGNLkrY/UnGH82uULs9RsJ/f26LkLn1l0MOZfq+/z+2RaOOQQX4NHruIVuxqz3J/50bgRG68A==} preact@10.28.2: resolution: {integrity: sha512-lbteaWGzGHdlIuiJ0l2Jq454m6kcpI1zNje6d8MlGAFlYvP2GO4ibnat7P74Esfz4sPTdM6UxtTwh/d3pwM9JA==} @@ -9398,6 +9458,10 @@ packages: resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} engines: {node: '>= 0.10'} + proxy-agent@6.4.0: + resolution: {integrity: sha512-u0piLU+nCOHMgGjRbimiXmA9kM/L9EHh3zL81xCdp7m+Y2pHIsnmbdDoEDoAz5geaonNR6q6+yOPQs6n4T6sBQ==} + engines: {node: '>= 14'} + proxy-agent@6.5.0: resolution: {integrity: sha512-TmatMXdr2KlRiA2CyDu8GqR8EjahTG3aY3nXjdzFyoZbmB8hrBsTyMezhULIXKnC0jpfjlmiZ3+EaCzoInSu/A==} engines: {node: '>= 14'} @@ -9423,6 +9487,10 @@ packages: resolution: {integrity: sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==} engines: {node: '>=0.6'} + qs@6.15.1: + resolution: {integrity: sha512-6YHEFRL9mfgcAvql/XhwTvf5jKcOiiupt2FiJxHkiX1z4j7WL8J/jRHYLluORvc1XxB5rV20KoeK00gVJamspg==} + engines: {node: '>=0.6'} + query-selector-shadow-dom@1.0.1: resolution: {integrity: sha512-lT5yCqEBgfoMYpf3F2xQRK7zEr1rhIIZuceDK6+xRkJQ4NMbHTwXqk4NkwDwQMNqXgG9r9fyHnzwNVs6zV5KRw==} @@ -9935,6 +10003,10 @@ packages: safer-buffer@2.1.2: resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + sandbox@2.5.6: + resolution: {integrity: sha512-tnFr7nyiuEhsAGb+xy60SDbij0790X+FgDljh3J/2HaRM6yQgNJkQKHbDH8ld7mR+PozXGgEfJ2Dc/5OyFnwsg==} + hasBin: true + saxes@6.0.0: resolution: {integrity: sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==} engines: {node: '>=v12.22.7'} @@ -10112,6 +10184,10 @@ packages: resolution: {integrity: sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==} engines: {node: '>= 6.0.0', npm: '>= 3.0.0'} + smol-toml@1.5.2: + resolution: {integrity: sha512-QlaZEqcAH3/RtNyet1IPIYPsEWAaYyXXv1Krsi+1L/QHppjX4Ifm8MQsBISz9vE8cHicIq3clogsheili5vhaQ==} + engines: {node: '>= 18'} + snake-case@2.1.0: resolution: {integrity: sha512-FMR5YoPFwOLuh4rRz92dywJjyKYZNLpMn1R5ujVpIYkbA9p01fq8RMg0FkO4M+Yobt4MjHeLTJVm5xFFBHSV2Q==} @@ -10222,6 +10298,9 @@ packages: stream-to-promise@2.2.0: resolution: {integrity: sha512-HAGUASw8NT0k8JvIVutB2Y/9iBk7gpgEyAudXwNJmZERdMITGdajOa4VJfD/kNiA3TppQpTP4J+CtcHwdzKBAw==} + streamx@2.25.0: + resolution: {integrity: sha512-0nQuG6jf1w+wddNEEXCF4nTg3LtufWINB5eFEN+5TNZW7KWJp6x87+JFL43vaAUPyCfH1wID+mNVyW6OHtFamg==} + strict-event-emitter@0.5.1: resolution: {integrity: sha512-vMgjE/GGEPEFnhFub6pa4FmJBRBVOLpIII2hvCZ8Kzb7K0hlHo7mQv6xYrBvCL2LtAIBwFUK8wvuJgTVSQ5MFQ==} @@ -10365,8 +10444,8 @@ packages: engines: {node: '>=16 || 14 >=14.17'} hasBin: true - supabase@2.75.0: - resolution: {integrity: sha512-Xaai8Wp7F03OMkOWSyS1OMMdk5DxkauJxcMMesj4mO6jDGEZpWBwgo/gIUb4hsckexmr/RXYdpDpTbUIMXahbw==} + supabase@2.98.1: + resolution: {integrity: sha512-hnPNVjqi8BClWd73YzSzdokap2o+JtCcx6oOOB2qV34CIwXip6IToeQMhdkblFJFGDwixRdqYEj590qB4D5+Vw==} engines: {npm: '>=8'} hasBin: true @@ -10424,15 +10503,12 @@ packages: resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==} engines: {node: '>=6'} - tar@6.2.1: - resolution: {integrity: sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==} - engines: {node: '>=10'} - deprecated: Old versions of tar are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me + tar-stream@3.1.7: + resolution: {integrity: sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==} - tar@7.5.2: - resolution: {integrity: sha512-7NyxrTE4Anh8km8iEy7o0QYPs+0JKBTj5ZaqHg6B39erLg0qYXN3BijtShwbsNSvQ+LN75+KV+C4QR/f6Gwnpg==} + tar@7.5.13: + resolution: {integrity: sha512-tOG/7GyXpFevhXVh8jOPJrmtRpOTsYqUIkVdVooZYJS/z8WhfQUX8RJILmeuJNinGAMSu1veBr4asSHFt5/hng==} engines: {node: '>=18'} - deprecated: Old versions of tar are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me tar@7.5.7: resolution: {integrity: sha512-fov56fJiRuThVFXD6o6/Q354S7pnWMJIVlDBYijsTNx6jKSE4pvrDTs6lUnmGvNyfJwFQQwWy3owKz1ucIhveQ==} @@ -10443,6 +10519,9 @@ packages: resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} engines: {node: '>=8'} + text-decoder@1.2.7: + resolution: {integrity: sha512-vlLytXkeP4xvEq2otHeJfSQIRyWxo/oZGEbXrtEEF9Hnmrdly59sUbzZ/QgyWuLYHctCHxFF4tRQZNQ9k60ExQ==} + text-table@0.2.0: resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} @@ -10600,20 +10679,6 @@ packages: '@swc/wasm': optional: true - ts-node@10.9.1: - resolution: {integrity: sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==} - hasBin: true - peerDependencies: - '@swc/core': '>=1.2.50' - '@swc/wasm': '>=1.2.50' - '@types/node': '*' - typescript: '>=2.7' - peerDependenciesMeta: - '@swc/core': - optional: true - '@swc/wasm': - optional: true - ts-node@10.9.2: resolution: {integrity: sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==} hasBin: true @@ -10787,11 +10852,6 @@ packages: typescript: optional: true - typescript@4.9.5: - resolution: {integrity: sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==} - engines: {node: '>=4.2.0'} - hasBin: true - typescript@5.5.4: resolution: {integrity: sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==} engines: {node: '>=14.17'} @@ -10839,6 +10899,14 @@ packages: resolution: {integrity: sha512-raqeBD6NQK4SkWhQzeYKd1KmIG6dllBOTt55Rmkt4HtI9mwdWtJljnrXjAFUBLTSN67HWrOIZ3EPF4kjUw80Bg==} engines: {node: '>=14.0'} + undici@6.25.0: + resolution: {integrity: sha512-ZgpWDC5gmNiuY9CnLVXEH8rl50xhRCuLNA97fAUnKi8RRuV4E6KG31pDTsLVUKnohJE0I3XDrTeEydAXRw47xg==} + engines: {node: '>=18.17'} + + undici@7.25.0: + resolution: {integrity: sha512-xXnp4kTyor2Zq+J1FfPI6Eq3ew5h6Vl0F/8d9XU5zZQf1tX9s2Su1/3PiMmUANFULpmksxkClamIZcaUqryHsQ==} + engines: {node: '>=20.18.1'} + unenv@2.0.0-rc.14: resolution: {integrity: sha512-od496pShMen7nOy5VmVJCnq8rptd45vh6Nx/r2iPbrba6pa6p+tS2ywuIHRZ/OBvSbQZB0kWvpO9XBNVFXHD3Q==} @@ -10971,6 +11039,7 @@ packages: uuid@9.0.1: resolution: {integrity: sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==} + deprecated: uuid@10 and below is no longer supported. For ESM codebases, update to uuid@latest. For CommonJS codebases, use uuid@11 (but be aware this version will likely be deprecated in 2028). hasBin: true uuidv7@1.1.0: @@ -10995,8 +11064,8 @@ packages: resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} engines: {node: '>= 0.8'} - vercel@50.9.6: - resolution: {integrity: sha512-eQI81w54KvPyizQnarQLf1wqxFL9gWYzqlS271er23ZJzNs/2tHVc+mikpXCu5V+Y4f1OSIaC5eNrzoV/hsthg==} + vercel@53.1.0: + resolution: {integrity: sha512-qukrCOUS91I9M4K9dvIn9f4RLnRBMCTvjx299xLbYCjyhaRTYmZ88o56idfXuXGjGJslCUU7KIzScQVLp7qgFw==} engines: {node: '>= 18'} hasBin: true @@ -11302,6 +11371,9 @@ packages: zod@3.22.4: resolution: {integrity: sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg==} + zod@3.24.4: + resolution: {integrity: sha512-OdqJE9UDRPwWsrHjLN2F8bPxvwJBK22EHLWtanu0LSYr5YqzsaaW3RMgmjwr8Rypg5k+meEJdSPXJZXE/yqOMg==} + zod@3.25.76: resolution: {integrity: sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==} @@ -12114,6 +12186,8 @@ snapshots: dependencies: statuses: 2.0.2 + '@bytecodealliance/preview2-shim@0.17.6': {} + '@chevrotain/cst-dts-gen@11.1.2': dependencies: '@chevrotain/gast': 11.1.2 @@ -12818,8 +12892,6 @@ snapshots: react: 18.2.0 warning: 4.0.3 - '@iarna/toml@2.2.5': {} - '@iconify/types@2.0.0': {} '@iconify/utils@3.1.0': @@ -13073,8 +13145,8 @@ snapshots: https-proxy-agent: 7.0.6 node-fetch: 2.7.0 nopt: 8.1.0 - semver: 7.7.2 - tar: 7.5.2 + semver: 7.7.4 + tar: 7.5.13 transitivePeerDependencies: - encoding - supports-color @@ -13141,7 +13213,7 @@ snapshots: transitivePeerDependencies: - supports-color - '@modelcontextprotocol/sdk@1.25.3(hono@4.11.7)(zod@3.25.76)': + '@modelcontextprotocol/sdk@1.29.0(zod@3.25.76)': dependencies: '@hono/node-server': 1.19.9(hono@4.11.7) ajv: 8.17.1 @@ -13151,8 +13223,9 @@ snapshots: cross-spawn: 7.0.6 eventsource: 3.0.7 eventsource-parser: 3.0.6 - express: 5.1.0 - express-rate-limit: 7.5.1(express@5.1.0) + express: 5.2.1 + express-rate-limit: 8.4.1(express@5.2.1) + hono: 4.11.7 jose: 6.1.3 json-schema-typed: 8.0.2 pkce-challenge: 5.0.0 @@ -13160,7 +13233,6 @@ snapshots: zod: 3.25.76 zod-to-json-schema: 3.25.1(zod@3.25.76) transitivePeerDependencies: - - hono - supports-color '@mswjs/interceptors@0.39.6': @@ -13560,11 +13632,11 @@ snapshots: '@popperjs/core@2.11.8': {} - '@posthog/core@1.17.0': + '@posthog/core@1.28.2': dependencies: - cross-spawn: 7.0.6 + '@posthog/types': 1.372.8 - '@posthog/types@1.336.4': {} + '@posthog/types@1.372.8': {} '@protobufjs/aspromise@1.1.2': {} @@ -15249,6 +15321,8 @@ snapshots: '@remirror/core-constants@3.0.0': {} + '@renovatebot/pep440@4.2.1': {} + '@rolldown/binding-android-arm64@1.0.0-rc.1': optional: true @@ -15714,21 +15788,23 @@ snapshots: '@smithy/types': 4.4.0 tslib: 2.8.1 - '@supabase/auth-js@2.95.3': + '@supabase/auth-js@2.105.2': dependencies: tslib: 2.8.1 - '@supabase/functions-js@2.95.3': + '@supabase/functions-js@2.105.2': dependencies: tslib: 2.8.1 - '@supabase/postgrest-js@2.95.3': + '@supabase/phoenix@0.4.1': {} + + '@supabase/postgrest-js@2.105.2': dependencies: tslib: 2.8.1 - '@supabase/realtime-js@2.95.3': + '@supabase/realtime-js@2.105.2': dependencies: - '@types/phoenix': 1.6.6 + '@supabase/phoenix': 0.4.1 '@types/ws': 8.18.1 tslib: 2.8.1 ws: 8.18.3 @@ -15736,23 +15812,23 @@ snapshots: - bufferutil - utf-8-validate - '@supabase/ssr@0.8.0(@supabase/supabase-js@2.95.3)': + '@supabase/ssr@0.10.2(@supabase/supabase-js@2.105.2)': dependencies: - '@supabase/supabase-js': 2.95.3 + '@supabase/supabase-js': 2.105.2 cookie: 1.0.2 - '@supabase/storage-js@2.95.3': + '@supabase/storage-js@2.105.2': dependencies: iceberg-js: 0.8.1 tslib: 2.8.1 - '@supabase/supabase-js@2.95.3': + '@supabase/supabase-js@2.105.2': dependencies: - '@supabase/auth-js': 2.95.3 - '@supabase/functions-js': 2.95.3 - '@supabase/postgrest-js': 2.95.3 - '@supabase/realtime-js': 2.95.3 - '@supabase/storage-js': 2.95.3 + '@supabase/auth-js': 2.105.2 + '@supabase/functions-js': 2.105.2 + '@supabase/postgrest-js': 2.105.2 + '@supabase/realtime-js': 2.105.2 + '@supabase/storage-js': 2.105.2 transitivePeerDependencies: - bufferutil - utf-8-validate @@ -16482,8 +16558,6 @@ snapshots: '@types/normalize-package-data@2.4.4': {} - '@types/phoenix@1.6.6': {} - '@types/prop-types@15.7.15': {} '@types/raf@3.4.3': {} @@ -16592,7 +16666,7 @@ snapshots: dependencies: '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.5.4) '@typescript-eslint/utils': 7.18.0(eslint@8.57.1)(typescript@5.5.4) - debug: 4.4.1(supports-color@8.1.1) + debug: 4.4.3 eslint: 8.57.1 ts-api-utils: 1.4.3(typescript@5.5.4) optionalDependencies: @@ -16608,10 +16682,10 @@ snapshots: dependencies: '@typescript-eslint/types': 5.62.0 '@typescript-eslint/visitor-keys': 5.62.0 - debug: 4.4.1(supports-color@8.1.1) + debug: 4.4.3 globby: 11.1.0 is-glob: 4.0.3 - semver: 7.7.2 + semver: 7.7.4 tsutils: 3.21.0(typescript@5.5.4) optionalDependencies: typescript: 5.5.4 @@ -16622,11 +16696,11 @@ snapshots: dependencies: '@typescript-eslint/types': 7.18.0 '@typescript-eslint/visitor-keys': 7.18.0 - debug: 4.4.1(supports-color@8.1.1) + debug: 4.4.3 globby: 11.1.0 is-glob: 4.0.3 minimatch: 9.0.5 - semver: 7.7.2 + semver: 7.7.4 ts-api-utils: 1.4.3(typescript@5.5.4) optionalDependencies: typescript: 5.5.4 @@ -16643,7 +16717,7 @@ snapshots: '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.5.4) eslint: 8.57.1 eslint-scope: 5.1.1 - semver: 7.7.2 + semver: 7.7.4 transitivePeerDependencies: - supports-color - typescript @@ -16754,18 +16828,28 @@ snapshots: '@use-gesture/core': 10.3.1 react: 19.0.0 - '@vercel/backends@0.0.24(typescript@5.9.2)': + '@vercel/backends@0.3.0(typescript@5.9.2)': dependencies: - '@vercel/cervel': 0.0.11(typescript@5.9.2) - '@vercel/introspection': 0.0.10 + '@vercel/build-utils': 13.21.0 + '@vercel/nft': 1.5.0 + '@yarnpkg/parsers': 3.0.3 + execa: 3.2.0 fs-extra: 11.1.0 + js-yaml: 3.14.1 + oxc-transform: 0.111.0 + path-to-regexp: 8.3.0 + resolve.exports: 2.0.3 + rolldown: 1.0.0-rc.1 + srvx: 0.8.9 + tsx: 4.21.0 + typescript: 5.9.2 + zod: 3.22.4 transitivePeerDependencies: - encoding - rollup - supports-color - - typescript - '@vercel/blob@1.0.2': + '@vercel/blob@1.1.1': dependencies: async-retry: 1.3.3 is-buffer: 2.0.5 @@ -16773,78 +16857,68 @@ snapshots: throttleit: 2.1.0 undici: 5.29.0 - '@vercel/blob@1.1.1': + '@vercel/blob@2.3.0': dependencies: async-retry: 1.3.3 is-buffer: 2.0.5 is-node-process: 1.2.0 throttleit: 2.1.0 - undici: 5.29.0 + undici: 6.25.0 - '@vercel/build-utils@13.2.16': {} + '@vercel/build-utils@13.21.0': + dependencies: + '@vercel/python-analysis': 0.11.1 + cjs-module-lexer: 1.2.3 + es-module-lexer: 1.5.0 - '@vercel/cervel@0.0.11(typescript@5.9.2)': + '@vercel/cervel@0.1.0(typescript@5.9.2)': dependencies: - '@vercel/build-utils': 13.2.16 - '@vercel/nft': 1.3.0 - execa: 3.2.0 - nf3: 0.3.6 - oxc-transform: 0.111.0 - resolve.exports: 2.0.3 - rolldown: 1.0.0-rc.1 - srvx: 0.8.9 - tsx: 4.21.0 + '@vercel/backends': 0.3.0(typescript@5.9.2) typescript: 5.9.2 transitivePeerDependencies: - encoding - rollup - supports-color - '@vercel/detect-agent@1.1.0': {} + '@vercel/detect-agent@1.2.3': {} - '@vercel/elysia@0.1.27': + '@vercel/elysia@0.1.73': dependencies: - '@vercel/node': 5.5.28 - '@vercel/static-config': 3.1.2 + '@vercel/node': 5.7.15 + '@vercel/static-config': 3.3.0 transitivePeerDependencies: - - '@swc/core' - - '@swc/wasm' - encoding - rollup - supports-color - '@vercel/error-utils@2.0.3': {} + '@vercel/error-utils@2.1.0': {} - '@vercel/express@0.1.35(typescript@5.9.2)': + '@vercel/express@0.1.83(typescript@5.9.2)': dependencies: - '@vercel/cervel': 0.0.11(typescript@5.9.2) - '@vercel/nft': 1.1.1 - '@vercel/node': 5.5.28 - '@vercel/static-config': 3.1.2 + '@vercel/cervel': 0.1.0(typescript@5.9.2) + '@vercel/nft': 1.5.0 + '@vercel/node': 5.7.15 + '@vercel/static-config': 3.3.0 fs-extra: 11.1.0 path-to-regexp: 8.3.0 ts-morph: 12.0.0 zod: 3.22.4 transitivePeerDependencies: - - '@swc/core' - - '@swc/wasm' - encoding - rollup - supports-color - typescript - '@vercel/fastify@0.1.30': + '@vercel/fastify@0.1.76': dependencies: - '@vercel/node': 5.5.28 - '@vercel/static-config': 3.1.2 + '@vercel/node': 5.7.15 + '@vercel/static-config': 3.3.0 transitivePeerDependencies: - - '@swc/core' - - '@swc/wasm' - encoding - rollup - supports-color - '@vercel/fun@1.2.1': + '@vercel/fun@1.3.0': dependencies: '@tootallnate/once': 2.0.0 async-listen: 1.2.0 @@ -16858,7 +16932,7 @@ snapshots: semver: 7.5.4 stat-mode: 0.3.0 stream-to-promise: 2.2.0 - tar: 6.2.1 + tar: 7.5.7 tinyexec: 0.3.2 tree-kill: 1.2.2 uid-promise: 1.0.0 @@ -16872,108 +16946,76 @@ snapshots: dependencies: web-vitals: 0.2.4 - '@vercel/gatsby-plugin-vercel-builder@2.0.127': + '@vercel/gatsby-plugin-vercel-builder@2.2.0': dependencies: '@sinclair/typebox': 0.25.24 - '@vercel/build-utils': 13.2.16 + '@vercel/build-utils': 13.21.0 esbuild: 0.27.0 etag: 1.8.1 fs-extra: 11.1.0 - '@vercel/go@3.3.4': {} + '@vercel/go@3.6.0': {} - '@vercel/h3@0.1.36': + '@vercel/h3@0.1.82': dependencies: - '@vercel/node': 5.5.28 - '@vercel/static-config': 3.1.2 + '@vercel/node': 5.7.15 + '@vercel/static-config': 3.3.0 transitivePeerDependencies: - - '@swc/core' - - '@swc/wasm' - encoding - rollup - supports-color - '@vercel/hono@0.2.30': + '@vercel/hono@0.2.76': dependencies: - '@vercel/nft': 1.1.1 - '@vercel/node': 5.5.28 - '@vercel/static-config': 3.1.2 + '@vercel/nft': 1.5.0 + '@vercel/node': 5.7.15 + '@vercel/static-config': 3.3.0 fs-extra: 11.1.0 path-to-regexp: 8.3.0 ts-morph: 12.0.0 zod: 3.22.4 transitivePeerDependencies: - - '@swc/core' - - '@swc/wasm' - encoding - rollup - supports-color - '@vercel/hydrogen@1.3.5': + '@vercel/hydrogen@1.3.7': dependencies: - '@vercel/static-config': 3.1.2 + '@vercel/static-config': 3.3.0 ts-morph: 12.0.0 - '@vercel/introspection@0.0.10': - dependencies: - path-to-regexp: 8.3.0 - zod: 3.22.4 - - '@vercel/koa@0.1.10': - dependencies: - '@vercel/node': 5.5.28 - '@vercel/static-config': 3.1.2 - transitivePeerDependencies: - - '@swc/core' - - '@swc/wasm' - - encoding - - rollup - - supports-color - - '@vercel/nestjs@0.2.31': + '@vercel/koa@0.1.56': dependencies: - '@vercel/node': 5.5.28 - '@vercel/static-config': 3.1.2 + '@vercel/node': 5.7.15 + '@vercel/static-config': 3.3.0 transitivePeerDependencies: - - '@swc/core' - - '@swc/wasm' - encoding - rollup - supports-color - '@vercel/next@4.15.20': + '@vercel/nestjs@0.2.77': dependencies: - '@vercel/nft': 1.1.1 + '@vercel/node': 5.7.15 + '@vercel/static-config': 3.3.0 transitivePeerDependencies: - encoding - rollup - supports-color - '@vercel/nft@1.1.1': + '@vercel/next@4.17.0': dependencies: - '@mapbox/node-pre-gyp': 2.0.0 - '@rollup/pluginutils': 5.3.0 - acorn: 8.15.0 - acorn-import-attributes: 1.9.5(acorn@8.15.0) - async-sema: 3.1.1 - bindings: 1.5.0 - estree-walker: 2.0.2 - glob: 13.0.0 - graceful-fs: 4.2.11 - node-gyp-build: 4.8.4 - picomatch: 4.0.3 - resolve-from: 5.0.0 + '@vercel/nft': 1.5.0 transitivePeerDependencies: - encoding - rollup - supports-color - '@vercel/nft@1.3.0': + '@vercel/nft@1.5.0': dependencies: '@mapbox/node-pre-gyp': 2.0.0 '@rollup/pluginutils': 5.3.0 - acorn: 8.15.0 - acorn-import-attributes: 1.9.5(acorn@8.15.0) + acorn: 8.16.0 + acorn-import-attributes: 1.9.5(acorn@8.16.0) async-sema: 3.1.1 bindings: 1.5.0 estree-walker: 2.0.2 @@ -16987,16 +17029,16 @@ snapshots: - rollup - supports-color - '@vercel/node@5.5.28': + '@vercel/node@5.7.15': dependencies: '@edge-runtime/node-utils': 2.3.0 '@edge-runtime/primitives': 4.1.0 '@edge-runtime/vm': 3.2.0 '@types/node': 20.11.0 - '@vercel/build-utils': 13.2.16 - '@vercel/error-utils': 2.0.3 - '@vercel/nft': 1.1.1 - '@vercel/static-config': 3.1.2 + '@vercel/build-utils': 13.21.0 + '@vercel/error-utils': 2.1.0 + '@vercel/nft': 1.5.0 + '@vercel/static-config': 3.3.0 async-listen: 3.0.0 cjs-module-lexer: 1.2.3 edge-runtime: 2.5.9 @@ -17008,23 +17050,36 @@ snapshots: path-to-regexp: 6.1.0 path-to-regexp-updated: path-to-regexp@6.3.0 ts-morph: 12.0.0 - ts-node: 10.9.1(@types/node@20.11.0)(typescript@4.9.5) - typescript: 4.9.5 - typescript5: typescript@5.9.3 + tsx: 4.21.0 + typescript: 5.9.3 undici: 5.28.4 transitivePeerDependencies: - - '@swc/core' - - '@swc/wasm' - encoding - rollup - supports-color - '@vercel/python@6.4.2': {} + '@vercel/oidc@3.2.0': {} - '@vercel/redwood@2.4.9': + '@vercel/prepare-flags-definitions@0.2.1': {} + + '@vercel/python-analysis@0.11.1': dependencies: - '@vercel/nft': 1.1.1 - '@vercel/static-config': 3.1.2 + '@bytecodealliance/preview2-shim': 0.17.6 + '@renovatebot/pep440': 4.2.1 + fs-extra: 11.1.1 + js-yaml: 4.1.1 + minimatch: 10.1.1 + smol-toml: 1.5.2 + zod: 3.22.4 + + '@vercel/python@6.37.0': + dependencies: + '@vercel/python-analysis': 0.11.1 + + '@vercel/redwood@2.4.13': + dependencies: + '@vercel/nft': 1.5.0 + '@vercel/static-config': 3.3.0 semver: 6.3.1 ts-morph: 12.0.0 transitivePeerDependencies: @@ -17032,11 +17087,11 @@ snapshots: - rollup - supports-color - '@vercel/remix-builder@5.5.9': + '@vercel/remix-builder@5.8.0': dependencies: - '@vercel/error-utils': 2.0.3 - '@vercel/nft': 1.1.1 - '@vercel/static-config': 3.1.2 + '@vercel/error-utils': 2.1.0 + '@vercel/nft': 1.5.0 + '@vercel/static-config': 3.3.0 path-to-regexp: 6.1.0 path-to-regexp-updated: path-to-regexp@6.3.0 ts-morph: 12.0.0 @@ -17045,30 +17100,44 @@ snapshots: - rollup - supports-color - '@vercel/ruby@2.2.5': {} + '@vercel/ruby@2.3.2': {} - '@vercel/rust@1.0.5': + '@vercel/rust@1.2.0': dependencies: - '@iarna/toml': 2.2.5 execa: 5.1.1 + smol-toml: 1.5.2 + + '@vercel/sandbox@1.9.0': + dependencies: + '@vercel/oidc': 3.2.0 + async-retry: 1.3.3 + jsonlines: 0.1.1 + ms: 2.1.3 + picocolors: 1.1.1 + tar-stream: 3.1.7 + undici: 7.25.0 + xdg-app-paths: 5.1.0 + zod: 3.24.4 + transitivePeerDependencies: + - bare-abort-controller + - react-native-b4a - '@vercel/sdk@1.18.9(hono@4.11.7)': + '@vercel/sdk@1.19.40': dependencies: - '@modelcontextprotocol/sdk': 1.25.3(hono@4.11.7)(zod@3.25.76) + '@modelcontextprotocol/sdk': 1.29.0(zod@3.25.76) zod: 3.25.76 transitivePeerDependencies: - '@cfworker/json-schema' - - hono - supports-color - '@vercel/static-build@2.8.28': + '@vercel/static-build@2.9.22': dependencies: '@vercel/gatsby-plugin-vercel-analytics': 1.0.11 - '@vercel/gatsby-plugin-vercel-builder': 2.0.127 - '@vercel/static-config': 3.1.2 + '@vercel/gatsby-plugin-vercel-builder': 2.2.0 + '@vercel/static-config': 3.3.0 ts-morph: 12.0.0 - '@vercel/static-config@3.1.2': + '@vercel/static-config@3.3.0': dependencies: ajv: 8.6.3 json-schema-to-ts: 1.6.4 @@ -17082,10 +17151,10 @@ snapshots: '@typescript-eslint/eslint-plugin': 7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.5.4))(eslint@8.57.1)(typescript@5.5.4) '@typescript-eslint/parser': 7.18.0(eslint@8.57.1)(typescript@5.5.4) eslint-config-prettier: 9.1.2(eslint@8.57.1) - eslint-import-resolver-alias: 1.1.2(eslint-plugin-import@2.32.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.5.4))(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.5.4))(eslint@8.57.1))(eslint@8.57.1))(eslint@8.57.1)) - eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.5.4))(eslint@8.57.1))(eslint@8.57.1) + eslint-import-resolver-alias: 1.1.2(eslint-plugin-import@2.32.0) + eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0)(eslint@8.57.1) eslint-plugin-eslint-comments: 3.2.0(eslint@8.57.1) - eslint-plugin-import: 2.32.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.5.4))(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.5.4))(eslint@8.57.1))(eslint@8.57.1))(eslint@8.57.1) + eslint-plugin-import: 2.32.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.5.4))(eslint-import-resolver-typescript@3.10.1)(eslint@8.57.1) eslint-plugin-jest: 27.9.0(@typescript-eslint/eslint-plugin@7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.5.4))(eslint@8.57.1)(typescript@5.5.4))(eslint@8.57.1)(typescript@5.5.4) eslint-plugin-jsx-a11y: 6.10.2(eslint@8.57.1) eslint-plugin-playwright: 1.8.3(eslint-plugin-jest@27.9.0(@typescript-eslint/eslint-plugin@7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.5.4))(eslint@8.57.1)(typescript@5.5.4))(eslint@8.57.1)(typescript@5.5.4))(eslint@8.57.1) @@ -17112,6 +17181,11 @@ snapshots: '@yarnpkg/lockfile@1.1.0': {} + '@yarnpkg/parsers@3.0.3': + dependencies: + js-yaml: 3.14.1 + tslib: 2.5.1 + abab@2.0.6: {} abbrev@3.0.1: {} @@ -17130,9 +17204,9 @@ snapshots: acorn: 8.16.0 acorn-walk: 8.3.4 - acorn-import-attributes@1.9.5(acorn@8.15.0): + acorn-import-attributes@1.9.5(acorn@8.16.0): dependencies: - acorn: 8.15.0 + acorn: 8.16.0 acorn-jsx@5.3.2(acorn@8.15.0): dependencies: @@ -17158,6 +17232,8 @@ snapshots: agent-base@7.1.4: {} + agent-base@9.0.0: {} + agentkeepalive@4.6.0: dependencies: humanize-ms: 1.2.1 @@ -17429,10 +17505,14 @@ snapshots: axobject-query@4.1.0: {} + b4a@1.8.1: {} + bail@2.0.2: {} balanced-match@1.0.2: {} + bare-events@2.8.2: {} + base64-js@1.5.1: {} basic-ftp@5.0.5: {} @@ -17476,7 +17556,7 @@ snapshots: dependencies: bytes: 3.1.2 content-type: 1.0.5 - debug: 4.4.1(supports-color@8.1.1) + debug: 4.4.3 http-errors: 2.0.0 iconv-lite: 0.6.3 on-finished: 2.4.1 @@ -17486,6 +17566,20 @@ snapshots: transitivePeerDependencies: - supports-color + body-parser@2.2.2: + dependencies: + bytes: 3.1.2 + content-type: 1.0.5 + debug: 4.4.3 + http-errors: 2.0.0 + iconv-lite: 0.7.0 + on-finished: 2.4.1 + qs: 6.15.1 + raw-body: 3.0.1 + type-is: 2.0.1 + transitivePeerDependencies: + - supports-color + bowser@2.12.1: {} brace-expansion@1.1.12: @@ -17672,8 +17766,6 @@ snapshots: dependencies: readdirp: 4.1.2 - chownr@2.0.0: {} - chownr@3.0.0: {} chrono-node@2.3.0: @@ -18354,6 +18446,10 @@ snapshots: optionalDependencies: '@types/trusted-types': 2.0.7 + dompurify@3.4.2: + optionalDependencies: + '@types/trusted-types': 2.0.7 + domutils@3.2.2: dependencies: dom-serializer: 2.0.0 @@ -18506,6 +18602,8 @@ snapshots: es-module-lexer@1.4.1: {} + es-module-lexer@1.5.0: {} + es-object-atoms@1.1.1: dependencies: es-errors: 1.3.0 @@ -18706,9 +18804,9 @@ snapshots: eslint-plugin-turbo: 2.5.6(eslint@8.57.1)(turbo@2.5.6) turbo: 2.5.6 - eslint-import-resolver-alias@1.1.2(eslint-plugin-import@2.32.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.5.4))(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.5.4))(eslint@8.57.1))(eslint@8.57.1))(eslint@8.57.1)): + eslint-import-resolver-alias@1.1.2(eslint-plugin-import@2.32.0): dependencies: - eslint-plugin-import: 2.32.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.5.4))(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.5.4))(eslint@8.57.1))(eslint@8.57.1))(eslint@8.57.1) + eslint-plugin-import: 2.32.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.5.4))(eslint-import-resolver-typescript@3.10.1)(eslint@8.57.1) eslint-import-resolver-node@0.3.9: dependencies: @@ -18718,7 +18816,7 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.5.4))(eslint@8.57.1))(eslint@8.57.1): + eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0)(eslint@8.57.1): dependencies: '@nolyfill/is-core-module': 1.0.39 debug: 4.4.1(supports-color@8.1.1) @@ -18729,18 +18827,18 @@ snapshots: tinyglobby: 0.2.14 unrs-resolver: 1.11.1 optionalDependencies: - eslint-plugin-import: 2.32.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.5.4))(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.5.4))(eslint@8.57.1))(eslint@8.57.1))(eslint@8.57.1) + eslint-plugin-import: 2.32.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.5.4))(eslint-import-resolver-typescript@3.10.1)(eslint@8.57.1) transitivePeerDependencies: - supports-color - eslint-module-utils@2.12.1(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.5.4))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.5.4))(eslint@8.57.1))(eslint@8.57.1))(eslint@8.57.1): + eslint-module-utils@2.12.1(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.5.4))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1)(eslint@8.57.1): dependencies: debug: 3.2.7 optionalDependencies: '@typescript-eslint/parser': 7.18.0(eslint@8.57.1)(typescript@5.5.4) eslint: 8.57.1 eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.5.4))(eslint@8.57.1))(eslint@8.57.1) + eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0)(eslint@8.57.1) transitivePeerDependencies: - supports-color @@ -18750,7 +18848,7 @@ snapshots: eslint: 8.57.1 ignore: 5.3.2 - eslint-plugin-import@2.32.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.5.4))(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.5.4))(eslint@8.57.1))(eslint@8.57.1))(eslint@8.57.1): + eslint-plugin-import@2.32.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.5.4))(eslint-import-resolver-typescript@3.10.1)(eslint@8.57.1): dependencies: '@rtsao/scc': 1.1.0 array-includes: 3.1.9 @@ -18761,7 +18859,7 @@ snapshots: doctrine: 2.1.0 eslint: 8.57.1 eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.12.1(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.5.4))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.5.4))(eslint@8.57.1))(eslint@8.57.1))(eslint@8.57.1) + eslint-module-utils: 2.12.1(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.5.4))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1)(eslint@8.57.1) hasown: 2.0.2 is-core-module: 2.16.1 is-glob: 4.0.3 @@ -19034,6 +19132,12 @@ snapshots: events-intercept@2.0.0: {} + events-universal@1.0.1: + dependencies: + bare-events: 2.8.2 + transitivePeerDependencies: + - bare-abort-controller + eventsource-parser@3.0.6: {} eventsource@3.0.7: @@ -19105,6 +19209,11 @@ snapshots: dependencies: express: 5.1.0 + express-rate-limit@8.4.1(express@5.2.1): + dependencies: + express: 5.2.1 + ip-address: 10.1.0 + express@5.1.0: dependencies: accepts: 2.0.0 @@ -19113,7 +19222,40 @@ snapshots: content-type: 1.0.5 cookie: 0.7.2 cookie-signature: 1.2.2 - debug: 4.4.1(supports-color@8.1.1) + debug: 4.4.3 + encodeurl: 2.0.0 + escape-html: 1.0.3 + etag: 1.8.1 + finalhandler: 2.1.0 + fresh: 2.0.0 + http-errors: 2.0.0 + merge-descriptors: 2.0.0 + mime-types: 3.0.2 + on-finished: 2.4.1 + once: 1.4.0 + parseurl: 1.3.3 + proxy-addr: 2.0.7 + qs: 6.14.0 + range-parser: 1.2.1 + router: 2.2.0 + send: 1.2.0 + serve-static: 2.2.0 + statuses: 2.0.2 + type-is: 2.0.1 + vary: 1.1.2 + transitivePeerDependencies: + - supports-color + + express@5.2.1: + dependencies: + accepts: 2.0.0 + body-parser: 2.2.2 + content-disposition: 1.0.0 + content-type: 1.0.5 + cookie: 0.7.2 + cookie-signature: 1.2.2 + debug: 4.4.3 + depd: 2.0.0 encodeurl: 2.0.0 escape-html: 1.0.3 etag: 1.8.1 @@ -19157,6 +19299,8 @@ snapshots: fast-deep-equal@3.1.3: {} + fast-fifo@1.3.2: {} + fast-glob@3.3.1: dependencies: '@nodelib/fs.stat': 2.0.5 @@ -19224,7 +19368,7 @@ snapshots: finalhandler@2.1.0: dependencies: - debug: 4.4.1(supports-color@8.1.1) + debug: 4.4.3 encodeurl: 2.0.0 escape-html: 1.0.3 on-finished: 2.4.1 @@ -19318,6 +19462,12 @@ snapshots: jsonfile: 6.2.0 universalify: 2.0.1 + fs-extra@11.1.1: + dependencies: + graceful-fs: 4.2.11 + jsonfile: 6.2.0 + universalify: 2.0.1 + fs-extra@11.3.1: dependencies: graceful-fs: 4.2.11 @@ -19331,10 +19481,6 @@ snapshots: jsonfile: 6.2.0 universalify: 2.0.1 - fs-minipass@2.1.0: - dependencies: - minipass: 3.3.6 - fs.realpath@1.0.0: {} fsevents@2.3.3: @@ -19416,7 +19562,7 @@ snapshots: dependencies: basic-ftp: 5.0.5 data-uri-to-buffer: 6.0.2 - debug: 4.4.1(supports-color@8.1.1) + debug: 4.4.3 transitivePeerDependencies: - supports-color @@ -19824,6 +19970,13 @@ snapshots: transitivePeerDependencies: - supports-color + https-proxy-agent@9.0.0: + dependencies: + agent-base: 9.0.0 + debug: 4.4.3 + transitivePeerDependencies: + - supports-color + human-signals@1.1.1: {} human-signals@2.1.0: {} @@ -19939,6 +20092,8 @@ snapshots: ip-address@10.0.1: {} + ip-address@10.1.0: {} + ipaddr.js@1.9.1: {} is-alphabetical@1.0.4: {} @@ -20243,6 +20398,10 @@ snapshots: dependencies: argparse: 2.0.1 + js-yaml@4.1.1: + dependencies: + argparse: 2.0.1 + jsdom@20.0.3: dependencies: abab: 2.0.6 @@ -20309,6 +20468,8 @@ snapshots: optionalDependencies: graceful-fs: 4.2.11 + jsonlines@0.1.1: {} + jsx-ast-utils@3.3.5: dependencies: array-includes: 3.1.9 @@ -21138,21 +21299,10 @@ snapshots: minimist@1.2.8: {} - minipass@3.3.6: - dependencies: - yallist: 4.0.0 - - minipass@5.0.0: {} - minipass@7.1.2: {} minisearch@7.2.0: {} - minizlib@2.1.2: - dependencies: - minipass: 3.3.6 - yallist: 4.0.0 - minizlib@3.1.0: dependencies: minipass: 7.1.2 @@ -21336,8 +21486,6 @@ snapshots: - supports-color - typescript - nf3@0.3.6: {} - nice-try@1.0.5: {} nlcst-to-string@4.0.0: @@ -21912,17 +22060,17 @@ snapshots: picocolors: 1.1.1 source-map-js: 1.2.1 - posthog-js@1.336.4: + posthog-js@1.372.8: dependencies: '@opentelemetry/api': 1.9.0 '@opentelemetry/api-logs': 0.208.0 '@opentelemetry/exporter-logs-otlp-http': 0.208.0(@opentelemetry/api@1.9.0) '@opentelemetry/resources': 2.4.0(@opentelemetry/api@1.9.0) '@opentelemetry/sdk-logs': 0.208.0(@opentelemetry/api@1.9.0) - '@posthog/core': 1.17.0 - '@posthog/types': 1.336.4 + '@posthog/core': 1.28.2 + '@posthog/types': 1.372.8 core-js: 3.45.1 - dompurify: 3.3.1 + dompurify: 3.4.2 fflate: 0.4.8 preact: 10.28.2 query-selector-shadow-dom: 1.0.1 @@ -22117,6 +22265,19 @@ snapshots: forwarded: 0.2.0 ipaddr.js: 1.9.1 + proxy-agent@6.4.0: + dependencies: + agent-base: 7.1.4 + debug: 4.4.3 + http-proxy-agent: 7.0.2 + https-proxy-agent: 7.0.6 + lru-cache: 7.18.3 + pac-proxy-agent: 7.2.0 + proxy-from-env: 1.1.0 + socks-proxy-agent: 8.0.5 + transitivePeerDependencies: + - supports-color + proxy-agent@6.5.0: dependencies: agent-base: 7.1.4 @@ -22149,6 +22310,10 @@ snapshots: dependencies: side-channel: 1.1.0 + qs@6.15.1: + dependencies: + side-channel: 1.1.0 + query-selector-shadow-dom@1.0.1: {} querystringify@2.2.0: {} @@ -22906,7 +23071,7 @@ snapshots: router@2.2.0: dependencies: - debug: 4.4.1(supports-color@8.1.1) + debug: 4.4.3 depd: 2.0.0 is-promise: 4.0.0 parseurl: 1.3.3 @@ -22955,6 +23120,16 @@ snapshots: safer-buffer@2.1.2: {} + sandbox@2.5.6: + dependencies: + '@vercel/sandbox': 1.9.0 + debug: 4.4.3 + zod: 4.3.6 + transitivePeerDependencies: + - bare-abort-controller + - react-native-b4a + - supports-color + saxes@6.0.0: dependencies: xmlchars: 2.2.0 @@ -22998,7 +23173,7 @@ snapshots: send@1.2.0: dependencies: - debug: 4.4.1(supports-color@8.1.1) + debug: 4.4.3 encodeurl: 2.0.0 escape-html: 1.0.3 etag: 1.8.1 @@ -23226,6 +23401,8 @@ snapshots: smart-buffer@4.2.0: {} + smol-toml@1.5.2: {} + snake-case@2.1.0: dependencies: no-case: 2.3.2 @@ -23251,7 +23428,7 @@ snapshots: detect-newline: 4.0.1 git-hooks-list: 4.1.1 is-plain-obj: 4.1.0 - semver: 7.7.2 + semver: 7.7.4 sort-object-keys: 1.1.3 tinyglobby: 0.2.14 @@ -23336,6 +23513,15 @@ snapshots: end-of-stream: 1.1.0 stream-to-array: 2.3.0 + streamx@2.25.0: + dependencies: + events-universal: 1.0.1 + fast-fifo: 1.3.2 + text-decoder: 1.2.7 + transitivePeerDependencies: + - bare-abort-controller + - react-native-b4a + strict-event-emitter@0.5.1: {} string-argv@0.3.1: {} @@ -23499,12 +23685,12 @@ snapshots: pirates: 4.0.7 ts-interface-checker: 0.1.13 - supabase@2.75.0: + supabase@2.98.1: dependencies: bin-links: 6.0.0 - https-proxy-agent: 7.0.6 + https-proxy-agent: 9.0.0 node-fetch: 3.3.2 - tar: 7.5.7 + tar: 7.5.13 transitivePeerDependencies: - supports-color @@ -23611,16 +23797,16 @@ snapshots: inherits: 2.0.4 readable-stream: 3.6.2 - tar@6.2.1: + tar-stream@3.1.7: dependencies: - chownr: 2.0.0 - fs-minipass: 2.1.0 - minipass: 5.0.0 - minizlib: 2.1.2 - mkdirp: 1.0.4 - yallist: 4.0.0 + b4a: 1.8.1 + fast-fifo: 1.3.2 + streamx: 2.25.0 + transitivePeerDependencies: + - bare-abort-controller + - react-native-b4a - tar@7.5.2: + tar@7.5.13: dependencies: '@isaacs/fs-minipass': 4.0.1 chownr: 3.0.0 @@ -23642,6 +23828,12 @@ snapshots: glob: 7.2.3 minimatch: 3.1.2 + text-decoder@1.2.7: + dependencies: + b4a: 1.8.1 + transitivePeerDependencies: + - react-native-b4a + text-table@0.2.0: {} thenify-all@1.6.0: @@ -23826,24 +24018,6 @@ snapshots: v8-compile-cache-lib: 3.0.1 yn: 3.1.1 - ts-node@10.9.1(@types/node@20.11.0)(typescript@4.9.5): - dependencies: - '@cspotcode/source-map-support': 0.8.1 - '@tsconfig/node10': 1.0.11 - '@tsconfig/node12': 1.0.11 - '@tsconfig/node14': 1.0.3 - '@tsconfig/node16': 1.0.4 - '@types/node': 20.11.0 - acorn: 8.15.0 - acorn-walk: 8.3.4 - arg: 4.1.3 - create-require: 1.1.1 - diff: 4.0.2 - make-error: 1.3.6 - typescript: 4.9.5 - v8-compile-cache-lib: 3.0.1 - yn: 3.1.1 - ts-node@10.9.2(@types/node@20.19.13)(typescript@5.5.4): dependencies: '@cspotcode/source-map-support': 0.8.1 @@ -24044,8 +24218,6 @@ snapshots: transitivePeerDependencies: - supports-color - typescript@4.9.5: {} - typescript@5.5.4: {} typescript@5.9.2: {} @@ -24080,6 +24252,10 @@ snapshots: dependencies: '@fastify/busboy': 2.1.1 + undici@6.25.0: {} + + undici@7.25.0: {} + unenv@2.0.0-rc.14: dependencies: defu: 6.1.4 @@ -24304,38 +24480,43 @@ snapshots: vary@1.1.2: {} - vercel@50.9.6(typescript@5.9.2): - dependencies: - '@vercel/backends': 0.0.24(typescript@5.9.2) - '@vercel/blob': 1.0.2 - '@vercel/build-utils': 13.2.16 - '@vercel/detect-agent': 1.1.0 - '@vercel/elysia': 0.1.27 - '@vercel/express': 0.1.35(typescript@5.9.2) - '@vercel/fastify': 0.1.30 - '@vercel/fun': 1.2.1 - '@vercel/go': 3.3.4 - '@vercel/h3': 0.1.36 - '@vercel/hono': 0.2.30 - '@vercel/hydrogen': 1.3.5 - '@vercel/koa': 0.1.10 - '@vercel/nestjs': 0.2.31 - '@vercel/next': 4.15.20 - '@vercel/node': 5.5.28 - '@vercel/python': 6.4.2 - '@vercel/redwood': 2.4.9 - '@vercel/remix-builder': 5.5.9 - '@vercel/ruby': 2.2.5 - '@vercel/rust': 1.0.5 - '@vercel/static-build': 2.8.28 + vercel@53.1.0(typescript@5.9.2): + dependencies: + '@vercel/backends': 0.3.0(typescript@5.9.2) + '@vercel/blob': 2.3.0 + '@vercel/build-utils': 13.21.0 + '@vercel/detect-agent': 1.2.3 + '@vercel/elysia': 0.1.73 + '@vercel/express': 0.1.83(typescript@5.9.2) + '@vercel/fastify': 0.1.76 + '@vercel/fun': 1.3.0 + '@vercel/go': 3.6.0 + '@vercel/h3': 0.1.82 + '@vercel/hono': 0.2.76 + '@vercel/hydrogen': 1.3.7 + '@vercel/koa': 0.1.56 + '@vercel/nestjs': 0.2.77 + '@vercel/next': 4.17.0 + '@vercel/node': 5.7.15 + '@vercel/prepare-flags-definitions': 0.2.1 + '@vercel/python': 6.37.0 + '@vercel/redwood': 2.4.13 + '@vercel/remix-builder': 5.8.0 + '@vercel/ruby': 2.3.2 + '@vercel/rust': 1.2.0 + '@vercel/static-build': 2.9.22 chokidar: 4.0.0 esbuild: 0.27.0 form-data: 4.0.4 jose: 5.9.6 + luxon: 3.7.2 + proxy-agent: 6.4.0 + sandbox: 2.5.6 + smol-toml: 1.5.2 transitivePeerDependencies: - - '@swc/core' - - '@swc/wasm' + - bare-abort-controller - encoding + - react-native-b4a - rollup - supports-color - typescript @@ -24645,6 +24826,8 @@ snapshots: zod@3.22.4: {} + zod@3.24.4: {} + zod@3.25.76: {} zod@4.3.6: {} diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 5d5856b8c..5f80a6220 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -29,11 +29,12 @@ catalog: eslint: 8.57.1 react: ^19.1.0 react-dom: ^19.1.0 - posthog-js: 1.336.4 - "@supabase/supabase-js": 2.95.3 - "@supabase/functions-js": 2.95.3 - "@supabase/storage-js": 2.95.3 - "@supabase/auth-js": 2.95.3 + posthog-js: 1.372.8 + "@supabase/supabase-js": 2.105.2 + "@supabase/functions-js": 2.105.2 + "@supabase/storage-js": 2.105.2 + "@supabase/auth-js": 2.105.2 + "@supabase/ssr": 0.10.2 catalogs: obsidian: