diff --git a/app/routes/mod-queue.tsx b/app/routes/mod-queue.tsx index f05b80e..86c6e5b 100644 --- a/app/routes/mod-queue.tsx +++ b/app/routes/mod-queue.tsx @@ -196,7 +196,7 @@ export default function () { try { queueReq = await fetch( - `/api/mod-queue/list?before=${before}&showClosed=${show_closed}&type=${queueType}`, + `/api/mod-queue/${queueType}/list?before=${before}&showClosed=${show_closed}`, ); } catch { alert("Failed to load mod queue"); diff --git a/functions/api/appeals/[id]/_middleware.ts b/functions/api/appeals/[id]/_middleware.ts index cadce26..6c4ecaa 100644 --- a/functions/api/appeals/[id]/_middleware.ts +++ b/functions/api/appeals/[id]/_middleware.ts @@ -20,11 +20,25 @@ export async function onRequestPost(context: RequestContext) { context.data.targetId = id; if (!pathname.endsWith("/ban")) { - const key = await context.env.DATA.get(`appeal_${id}`); + const appeal: Record | null = await context.env.D1.prepare( + "SELECT * FROM appeals WHERE id = ?;", + ) + .bind(id) + .first(); - if (!key) return jsonError("No appeal with that ID exists", 404); + if (!appeal) return jsonError("No appeal with that ID exists", 404); - context.data.appeal = JSON.parse(key); + appeal.user = JSON.parse(appeal.user); + context.data.appeal = appeal; + + const pushNotificationData = await context.env.D1.prepare( + "SELECT token FROM push_notifications WHERE event_id = ? AND event_type = 'appeal';", + ) + .bind(id) + .first(); + + if (pushNotificationData) + context.data.fcm_token = pushNotificationData.token; } if ( diff --git a/functions/api/appeals/[id]/accept.ts b/functions/api/appeals/[id]/accept.ts index e920a07..75707c5 100644 --- a/functions/api/appeals/[id]/accept.ts +++ b/functions/api/appeals/[id]/accept.ts @@ -3,15 +3,21 @@ import sendEmail from "../../../email.js"; import { sendPushNotification } from "../../../gcloud.js"; export async function onRequestPost(context: RequestContext) { - const { appeal } = context.data; + const { appeal, fcm_token } = context.data; - if (appeal.fcm_token) { + if (fcm_token) { await sendPushNotification( context.env, "Appeal Accepted", context.data.body.feedback || "No additional details to display", - appeal.fcm_token + fcm_token, ); + + await context.env.D1.prepare( + "DELETE FROM push_notifications WHERE event_id = ? AND event_type = 'appeal';", + ) + .bind(appeal.id) + .run(); } else { const emailResponse = await sendEmail( appeal.user.email, @@ -19,8 +25,8 @@ export async function onRequestPost(context: RequestContext) { "Appeal Accepted", "appeal_accepted", { - note: context.data.body.feedback || "No note provided." - } + note: context.data.body.feedback || "No note provided.", + }, ); if (!emailResponse.ok) { @@ -32,29 +38,21 @@ export async function onRequestPost(context: RequestContext) { const { current_user: currentUser } = context.data; await context.env.D1.prepare( - "UPDATE appeals SET approved = 1, open = 0 WHERE id = ?;" + "UPDATE appeals SET approved = 1, user = json_remove(user, '$.email') WHERE id = ?;", ) .bind(context.params.id) .run(); - delete appeal.fcm_token; - delete appeal.user.email; - - appeal.open = false; - - await context.env.DATA.put(`appeal_${appeal.id}`, JSON.stringify(appeal), { - expirationTtl: 94608000 - }); await fetch( `https://discord.com/api/v10/guilds/242263977986359297/bans/${appeal.user.id}`, { headers: { authorization: `Bot ${context.env.BOT_TOKEN}`, - "x-audit-log-reason": `Appeal accepted by ${currentUser.username} (${currentUser.id})` + "x-audit-log-reason": `Appeal accepted by ${currentUser.username} (${currentUser.id})`, }, - method: "DELETE" - } + method: "DELETE", + }, ); await fetch(context.env.APPEALS_WEBHOOK, { @@ -67,19 +65,19 @@ export async function onRequestPost(context: RequestContext) { fields: [ { name: "Moderator", - value: `${currentUser.username} (${currentUser.id})` - } - ] - } - ] + value: `${currentUser.username} (${currentUser.id})`, + }, + ], + }, + ], }), headers: { - "content-type": "application/json" + "content-type": "application/json", }, - method: "POST" + method: "POST", }); return new Response(null, { - status: 204 + status: 204, }); } diff --git a/functions/api/appeals/[id]/deny.ts b/functions/api/appeals/[id]/deny.ts index a9982ef..350b209 100644 --- a/functions/api/appeals/[id]/deny.ts +++ b/functions/api/appeals/[id]/deny.ts @@ -3,16 +3,22 @@ import sendEmail from "../../../email.js"; import { sendPushNotification } from "../../../gcloud.js"; export async function onRequestPost(context: RequestContext) { - const { appeal } = context.data; - if (appeal.fcm_token) { + const { appeal, fcm_token } = context.data; + if (fcm_token) { await sendPushNotification( context.env, "Appeal Denied", `Unfortunately, we have decided to deny your appeal for the following reason: ${ context.data.body.feedback || "No additional details" }`, - appeal.fcm_token, + fcm_token, ); + + await context.env.D1.prepare( + "DELETE FROM push_notifications WHERE event_id = ? AND event_type = 'appeal';", + ) + .bind(appeal.id) + .run(); } else { const emailResponse = await sendEmail( appeal.user.email, @@ -31,22 +37,13 @@ export async function onRequestPost(context: RequestContext) { } await context.env.D1.prepare( - "UPDATE appeals SET approved = 0, open = 0 WHERE id = ?;", + "UPDATE appeals SET approved = 0, user = json_remove(user, '$.email') WHERE id = ?;", ) .bind(context.params.id) .run(); const { current_user: currentUser } = context.data; - delete appeal.user.email; - delete appeal.fcm_token; - - appeal.open = false; - - await context.env.DATA.put(`appeal_${appeal.id}`, JSON.stringify(appeal), { - expirationTtl: 94608000, - }); - await fetch(context.env.APPEALS_WEBHOOK, { body: JSON.stringify({ embeds: [ diff --git a/functions/api/appeals/submit.ts b/functions/api/appeals/submit.ts index 9bf1c2e..00dace3 100644 --- a/functions/api/appeals/submit.ts +++ b/functions/api/appeals/submit.ts @@ -41,18 +41,17 @@ export async function onRequestPost(context: RequestContext) { if (!currentUser.email) return jsonError("No email for this session", 403); - const existingAppeals = await context.env.DATA.list({ - prefix: `appeal_${currentUser.id}`, - }); const existingBlockedAppeal = await context.env.DATA.get( `blockedappeal_${currentUser.id}`, ); if ( existingBlockedAppeal || - existingAppeals.keys.find( - (appeal) => (appeal.metadata as { [k: string]: any })?.open, + (await context.env.D1.prepare( + "SELECT approved FROM appeals WHERE approved IS NULL AND json_extract(user, '$.id') = ?;", ) + .bind(currentUser.id) + .first()) ) return jsonError("Appeal already submitted", 403); @@ -74,33 +73,31 @@ export async function onRequestPost(context: RequestContext) { .randomUUID() .replaceAll("-", "")}`; - await context.env.DATA.put( - `appeal_${appealId}`, - JSON.stringify({ - ban_reason: whyBanned, - created_at: Date.now(), - fcm_token: typeof senderTokenId === "string" ? senderTokenId : undefined, + await context.env.D1.prepare( + "INSERT INTO appeals (ban_reason, created_at, id, learned, reason_for_unban, user) VALUES (?, ?, ?, ?, ?, ?);", + ) + .bind( + whyBanned, + Date.now(), + appealId, learned, - id: appealId, - open: true, - reason_for_unban: whyUnban, - user: { + whyUnban, + JSON.stringify({ email: currentUser.email, id: currentUser.id, username: currentUser.username, - }, - }), - { - expirationTtl: 94608000, - }, - ); - - await context.env.D1.prepare( - "INSERT INTO appeals (created_at, id, open, user) VALUES (?, ?, ?, ?)", - ) - .bind(Date.now(), appealId, 1, currentUser.id) + }), + ) .run(); + if (typeof senderTokenId === "string") { + await context.env.D1.prepare( + "INSERT INTO push_notifications (created_at, event_id, event_type, token) VALUES (?, ?, 'appeal', ?)", + ) + .bind(Date.now(), appealId, senderTokenId) + .run(); + } + await fetch(context.env.APPEALS_WEBHOOK, { body: JSON.stringify({ embeds: [ diff --git a/functions/api/game-appeals/[id]/accept.ts b/functions/api/game-appeals/[id]/accept.ts index b06a092..76eb95b 100644 --- a/functions/api/game-appeals/[id]/accept.ts +++ b/functions/api/game-appeals/[id]/accept.ts @@ -7,13 +7,14 @@ export async function onRequestPost(context: RequestContext) { if (statsReduction && typeof statsReduction !== "number") return jsonError("Invalid stat reduction", 400); - const appeal = await context.env.DATA.get( - `gameappeal_${context.params.id as string}`, - ); + const appeal: Record | null = await context.env.D1.prepare( + "SELECT * FROM game_appeals WHERE id = ?;", + ) + .bind(context.params.id) + .first(); if (!appeal) return jsonError("Appeal not found", 400); - const data = JSON.parse(appeal); const banList = (await getBanList(context)) as { [k: string]: { BanType: number; Unbanned?: boolean; UnbanReduct?: number }; }; @@ -23,12 +24,12 @@ export async function onRequestPost(context: RequestContext) { .bind(context.params.id) .run(); - if (!banList[data.roblox_id]) + if (!banList[appeal.roblox_id]) return new Response(null, { status: 204, }); - banList[data.roblox_id] = { + banList[appeal.roblox_id] = { BanType: 0, Unbanned: true, UnbanReduct: statsReduction, @@ -43,7 +44,7 @@ export async function onRequestPost(context: RequestContext) { Date.now(), context.data.current_user.id, crypto.randomUUID(), - data.roblox_id, + appeal.roblox_id, ) .run(); diff --git a/functions/api/game-appeals/[id]/deny.ts b/functions/api/game-appeals/[id]/deny.ts index eac2cad..7407d77 100644 --- a/functions/api/game-appeals/[id]/deny.ts +++ b/functions/api/game-appeals/[id]/deny.ts @@ -3,18 +3,20 @@ import { jsonError } from "../../../common.js"; export async function onRequestPost(context: RequestContext) { const appealId = context.params.id as string; - const appeal = await context.env.DATA.get(`gameappeal_${appealId}`); + const appeal = await context.env.D1.prepare( + "SELECT * FROM game_appeals WHERE id = ?;", + ) + .bind(appealId) + .first(); if (!appeal) return jsonError("Appeal not found", 404); - const appealData = JSON.parse(appeal); - await context.env.DATA.delete(`gameappeal_${appealId}`); await context.env.D1.prepare("DELETE FROM game_appeals WHERE id = ?;") .bind(appealId) .run(); await context.env.DATA.put( - `gameappealblock_${appealData.roblox_id}`, + `gameappealblock_${appeal.roblox_id}`, `${Date.now() + 2592000000}`, { expirationTtl: 2592000 }, ); diff --git a/functions/api/game-appeals/precheck.ts b/functions/api/game-appeals/precheck.ts index db08a83..35ef8e5 100644 --- a/functions/api/game-appeals/precheck.ts +++ b/functions/api/game-appeals/precheck.ts @@ -5,9 +5,7 @@ export default async function ( user: number, ): Promise<{ can_appeal?: boolean; error?: string; reason?: string }> { if ( - await context.env.D1.prepare( - "SELECT * FROM game_appeals WHERE open = 1 AND user = ?;", - ) + await context.env.D1.prepare("SELECT * FROM game_appeals WHERE user = ?;") .bind(user) .first() ) diff --git a/functions/api/game-appeals/submit.ts b/functions/api/game-appeals/submit.ts index 6480428..1b54ae7 100644 --- a/functions/api/game-appeals/submit.ts +++ b/functions/api/game-appeals/submit.ts @@ -43,25 +43,14 @@ export async function onRequestPost(context: RequestContext) { if (!precheckData.can_appeal) return jsonError(precheckData.reason as string, 400); - const appealId = `${id}${context.request.headers - .get("cf-ray") - ?.split("-")[0]}${Date.now()}`; - - await context.env.DATA.put( - `gameappeal_${appealId}`, - JSON.stringify({ - id: appealId, - reasonForUnban, - roblox_id: id, - roblox_username: username, - whatHappened, - }), - ); + const appealId = `${id}${ + context.request.headers.get("cf-ray")?.split("-")[0] + }${Date.now()}`; await context.env.D1.prepare( - "INSERT INTO game_appeals (created_at, id, open, user) VALUES (?, ?, ?, ?);", + "INSERT INTO game_appeals (created_at, id, reason_for_unban, roblox_id, roblox_username) VALUES (?, ?, ?, ?, ?);", ) - .bind(Date.now(), appealId, 1, id) + .bind(Date.now(), appealId, reasonForUnban, id, username) .run(); await fetch(context.env.REPORTS_WEBHOOK, { diff --git a/functions/api/inactivity/[id].ts b/functions/api/inactivity/[id].ts index 480af12..e7ee18e 100644 --- a/functions/api/inactivity/[id].ts +++ b/functions/api/inactivity/[id].ts @@ -1,17 +1,18 @@ import { jsonError } from "../../common.js"; import sendEmail from "../../email.js"; import { sendPushNotification } from "../../gcloud.js"; -import validateInactivityNotice from "./validate.js"; export async function onRequestDelete(context: RequestContext) { - const kvResult = await context.env.DATA.get( - `inactivity_${context.params.id}`, - ); + const result = await context.env.D1.prepare( + "SELECT json_extract(user, '*.id') AS uid FROM inactivity_notices WHERE id = ?;", + ) + .bind(context.params.id) + .first(); - if (!kvResult) return jsonError("No inactivity notice with that ID", 404); + if (!result) return jsonError("No inactivity notice with that ID", 404); if ( - JSON.parse(kvResult).user.id !== context.data.current_user.id && + result.uid !== context.data.current_user.id && !(context.data.current_user.permissions & (1 << 0)) ) return jsonError( @@ -19,7 +20,6 @@ export async function onRequestDelete(context: RequestContext) { 403, ); - await context.env.DATA.delete(`inactivity_${context.params.id}`); await context.env.D1.prepare("DELETE FROM inactivity_notices WHERE id = ?;") .bind(context.params.id) .run(); @@ -50,40 +50,61 @@ export async function onRequestPost(context: RequestContext) { return jsonError("You are not a manager of any departments", 403); const requestedNotice: { [k: string]: any } | null = - await context.env.DATA.get(`inactivity_${context.params.id as string}`, { - type: "json", - }); + await context.env.D1.prepare( + "SELECT decisions, departments, user FROM inactivity_notices WHERE id = ?;", + ) + .bind(context.params.id) + .first(); if (!requestedNotice) return jsonError("Inactivity notices does not exist", 404); - const decisions: { [dept: string]: boolean } = {}; + const decisions: { [dept: string]: boolean } = JSON.parse( + requestedNotice.decisions, + ); for (const department of userAdminDepartments) decisions[department] = accepted; - requestedNotice.decisions = decisions; + const applicableDepartments = JSON.parse(requestedNotice.departments).length; - if (Object.values(decisions).length === requestedNotice.departments.length) { - requestedNotice.open = false; + await context.env.D1.prepare( + "UPDATE inactivity_notices SET decisions = ?, user = json_remove(user, '*.email') WHERE id = ?;", + ) + .bind(JSON.stringify(decisions), context.params.id) + .run(); - const approved = !Object.values(decisions).filter((d) => !d).length; - - await context.env.D1.prepare( - "UPDATE inactivity_notices SET approved = ?, open = 0 WHERE id = ?;", + if (Object.values(decisions).length === applicableDepartments) { + const approved = + Object.values(decisions).filter((d) => d).length === + applicableDepartments; + const denied = + Object.values(decisions).filter((d) => !d).length !== + applicableDepartments; + const fcmTokenResult: FCMTokenResult | null = await context.env.D1.prepare( + "SELECT token FROM push_notifications WHERE event_id = ? AND event_type = 'inactivity';", ) - .bind(Number(approved), context.params.id) - .run(); + .bind(context.params.id) + .first(); + + if (fcmTokenResult) { + let status = "Approved"; + + if (denied) status = "Denied"; + else if (!approved) status = "Partially Approved"; - if (requestedNotice.fcm_token) { await sendPushNotification( context.env, - `Inactivity Request ${approved ? "Approved" : "Denied"}`, + `Inactivity Request ${status}`, accepted ? "Your inactivity request was approved." - : "Your inactivity request was denied, please reach out to management if you require more details.", - requestedNotice.fcm_token, + : `Your inactivity request was ${denied ? "denied" : "partially approved"}, please reach out to management if you require more details.`, + fcmTokenResult.token, ); + + await context.env.D1.prepare( + "DELETE FROM push_notifications WHERE event_id = ? AND event_type = 'inactivity';", + ).bind(context.params.id); } else { await sendEmail( requestedNotice.user.email, @@ -93,96 +114,8 @@ export async function onRequestPost(context: RequestContext) { { username: requestedNotice.user.username }, ); } - - delete requestedNotice.fcm_token; - delete requestedNotice.user.email; } - await context.env.DATA.put( - `inactivity_${context.params.id as string}`, - JSON.stringify(requestedNotice), - { expirationTtl: 63072000 }, - ); - - return new Response(null, { - status: 204, - }); -} - -export async function onRequestPut(context: RequestContext) { - const kvResult: InactivityNoticeProps | null = await context.env.DATA.get( - `inactivity_${context.params.id}`, - { type: "json" }, - ); - - if (!kvResult) return jsonError("No inactivity notice with that ID", 404); - - if (kvResult.user.id !== context.data.current_user.id) - return jsonError( - "You do not have permission to modify this inactivity notice", - 403, - ); - - const d1entry = await context.env.D1.prepare( - "SELECT open FROM inactivity_notices WHERE id = ?;", - ) - .bind(context.params.id) - .first(); - - if (!Boolean(d1entry?.open)) - return jsonError("Cannot modify a closed inactivity notice", 403); - - const { departments, end, reason, start } = context.data.body; - - const validationFailureResponse = validateInactivityNotice( - departments, - end, - reason, - start, - context.data.departments, - ); - - if (validationFailureResponse) return validationFailureResponse; - - kvResult.departments = departments; - kvResult.end = end; - kvResult.reason = reason; - kvResult.start = start; - - await context.env.DATA.put( - `inactivity_${context.params.id}`, - JSON.stringify(kvResult), - { - expirationTtl: 63072000, - }, - ); - - const departmentWebhooks = []; - for (const department of departments) - departmentWebhooks.push(context.env[`${department}_INACTIVITY_WEBHOOK`]); - - const webhookPromises = []; - for (const webhook of departmentWebhooks) - webhookPromises.push( - fetch(webhook, { - body: JSON.stringify({ - embeds: [ - { - title: "Inactivity Notice Modified", - color: 37562560, - description: `View the updated notice at https://carcrushers.cc/mod-queue?id=${context.params.id}&type=inactivity`, - }, - ], - }), - headers: { - "content-type": "application/json", - }, - method: "POST", - }), - ); - - await Promise.allSettled(webhookPromises); - return new Response(null, { status: 204, }); diff --git a/functions/api/inactivity/new.ts b/functions/api/inactivity/new.ts index 675dcb1..3072e1f 100644 --- a/functions/api/inactivity/new.ts +++ b/functions/api/inactivity/new.ts @@ -20,34 +20,33 @@ export async function onRequestPost(context: RequestContext) { (context.request.headers.get("cf-ray") as string).split("-")[0] + Date.now().toString(); - await context.env.DATA.put( - `inactivity_${inactivityId}`, - JSON.stringify({ - created_at: Date.now(), - departments, + await context.env.D1.prepare( + "INSERT INTO inactivity_notices (created_at, departments, end, hiatus, id, reason, start, user) VALUES (?, ?, ?, ?, ?, ?, ?, ?);", + ) + .bind( + Date.now(), + JSON.stringify(departments), end, - fcm_token: typeof senderTokenId === "string" ? senderTokenId : undefined, - hiatus, - open: true, + Number(hiatus), + inactivityId, reason, start, - user: { + JSON.stringify({ id: context.data.current_user.id, email: context.data.current_user.email, username: context.data.current_user.username, - }, - }), - { - expirationTtl: 63072000, - }, - ); - - await context.env.D1.prepare( - "INSERT INTO inactivity_notices (created_at, id, user) VALUES (?, ?, ?);", - ) - .bind(Date.now(), inactivityId, context.data.current_user.id) + }), + ) .run(); + if (typeof senderTokenId === "string") { + await context.env.D1.prepare( + "INSERT INTO push_notifications (created_at, event_id, event_type) VALUES (?, ?, ?);", + ) + .bind(Date.now(), inactivityId, "inactivity") + .run(); + } + const departmentsToNotify = []; const departmentRoles = []; const { env } = context; diff --git a/functions/api/me/appeals.ts b/functions/api/me/appeals.ts index 487d133..162639e 100644 --- a/functions/api/me/appeals.ts +++ b/functions/api/me/appeals.ts @@ -9,5 +9,13 @@ export async function onRequestGet(context: RequestContext) { if (!success) return jsonError("Unable to retrieve appeals", 500); - return jsonResponse(JSON.stringify(results)); + return jsonResponse( + JSON.stringify( + results.map((result) => { + result.user = JSON.parse(result.user as string); + + return result; + }), + ), + ); } diff --git a/functions/api/me/items/[type]/[id].ts b/functions/api/me/items/[type]/[id].ts index c0362b8..a424962 100644 --- a/functions/api/me/items/[type]/[id].ts +++ b/functions/api/me/items/[type]/[id].ts @@ -6,19 +6,27 @@ export async function onRequestGet(context: RequestContext) { if (!["appeal", "inactivity", "report"].includes(type as string)) return jsonError("Invalid type", 400); - const data = (await context.env.DATA.get(`${type}_${id}`, { - type: "json", - })) as { - created_at: number; - id: string; - open: boolean; - user?: { id: string; username: string }; - } & { [k: string]: any }; + const tables: { [k: string]: string } = { + appeal: "appeals", + inactivity: "inactivity_notices", + report: "reports", + }; - if (data?.user?.id !== context.data.current_user.id) + const data: Record | null = await context.env.D1.prepare( + `SELECT * + FROM ${tables[type as string]} + WHERE id = ?;`, + ) + .bind(id) + .first(); + + if (data?.user) data.user = JSON.parse(data.user); + + if (!data || data.user?.id !== context.data.current_user.id) return jsonError("Item does not exist", 404); if (type === "report") { + data.attachments = JSON.parse(data.attachments); const { AwsClient } = await import("aws4fetch"); const aws = new AwsClient({ accessKeyId: context.env.R2_ACCESS_KEY, diff --git a/functions/api/me/reports.ts b/functions/api/me/reports.ts index 95ab6a0..a6feb81 100644 --- a/functions/api/me/reports.ts +++ b/functions/api/me/reports.ts @@ -8,42 +8,12 @@ export async function onRequestGet(context: RequestContext) { results: { id: string }[]; success: boolean; } = await context.env.D1.prepare( - "SELECT id FROM reports WHERE user = ? ORDER BY created_at LIMIT 50;", + "SELECT created_at, id, open, target_usernames FROM reports WHERE json_extract(user, '$.id') = ? ORDER BY created_at LIMIT 50;", ) .bind(context.data.current_user.id) .all(); if (!success) return jsonError("Failed to retrieve reports", 500); - const ids: string[] = []; - results.map((v) => ids.push(v.id)); - - const kvDataPromises = []; - - for (const id of ids) - kvDataPromises.push(context.env.DATA.get(`report_${id}`, { type: "json" })); - - let settledKvPromises; - - try { - settledKvPromises = (await Promise.all( - kvDataPromises, - )) as ReportCardProps[]; - } catch (e) { - console.log(e); - return jsonError("Failed to resolve reports", 500); - } - - return jsonResponse( - JSON.stringify( - settledKvPromises.map((r) => { - return { - created_at: r.created_at, - id: r.id, - open: r.open, - target_usernames: r.target_usernames, - }; - }), - ), - ); + return jsonResponse(JSON.stringify(results)); } diff --git a/functions/api/mod-queue/[type]/[id].ts b/functions/api/mod-queue/[type]/[id].ts index db70681..e67e7a3 100644 --- a/functions/api/mod-queue/[type]/[id].ts +++ b/functions/api/mod-queue/[type]/[id].ts @@ -1,22 +1,24 @@ import { jsonError, jsonResponse } from "../../../common.js"; export async function onRequestGet(context: RequestContext) { - const types: { [k: string]: { permissions: number[]; prefix: string } } = { + const types: { + [k: string]: { permissions: number[]; table: string }; + } = { appeal: { permissions: [1 << 0, 1 << 1], - prefix: `appeal_`, + table: "appeals", }, gma: { permissions: [1 << 5], - prefix: "gameappeal_", + table: "game_appeals", }, inactivity: { permissions: [1 << 0, 1 << 4, 1 << 6, 1 << 7, 1 << 11], - prefix: "inactivity_", + table: "inactivity_notices", }, report: { permissions: [1 << 5], - prefix: "report_", + table: "reports", }, }; @@ -30,16 +32,15 @@ export async function onRequestGet(context: RequestContext) { ) return jsonError("You cannot use this filter", 403); - let item: { - [k: string]: any; - } | null = await context.env.DATA.get(`${types[type].prefix}${itemId}`, { - type: "json", - }); + const item: Record | null = await context.env.D1.prepare( + `SELECT * + FROM ${types[type].table} + WHERE id = ?;`, + ) + .bind(itemId) + .first(); - if (!item) - item = await context.env.DATA.get(`closed${types[type].prefix}${itemId}`, { - type: "json", - }); + if (!item) return jsonError("Item not found", 404); if ( type === "report" && @@ -47,7 +48,11 @@ export async function onRequestGet(context: RequestContext) { ) return jsonError("Report is processing", 409); - if (item) delete item.user?.email; + if (item.user) { + item.user = JSON.parse(item.user); + + delete item.user.email; + } return item ? jsonResponse(JSON.stringify(item)) diff --git a/functions/api/mod-queue/[type]/list.ts b/functions/api/mod-queue/[type]/list.ts new file mode 100644 index 0000000..f020a51 --- /dev/null +++ b/functions/api/mod-queue/[type]/list.ts @@ -0,0 +1,92 @@ +import { jsonError, jsonResponse } from "../../../common.js"; + +export async function onRequestGet(context: RequestContext): Promise { + const type = context.params.type as string; + const { searchParams } = new URL(context.request.url); + const before = parseInt(searchParams.get("before") || `${Date.now()}`); + const showClosed = searchParams.get("showClosed") === "true"; + const tables: { [k: string]: string } = { + appeal: "appeals", + gma: "game_appeals", + inactivity: "inactivity_notices", + report: "reports", + }; + const permissions: { [k: string]: number[] } = { + appeal: [1 << 0, 1 << 1], + gma: [1 << 5], + inactivity: [1 << 4, 1 << 6, 1 << 7, 1 << 11, 1 << 12], + report: [1 << 5], + }; + const { current_user: currentUser } = context.data; + + if (!tables[type]) return jsonError("Invalid filter type", 400); + + if (!permissions[type].find((p) => currentUser.permissions & p)) + return jsonError("You cannot use this filter", 403); + + if (isNaN(before)) return jsonError("Invalid `before` parameter", 400); + + let rows: D1Result>; + + switch (type) { + case "appeal": + rows = await context.env.D1.prepare( + `SELECT * + FROM appeals + WHERE created_at < ? + AND open ${showClosed ? "IS NOT" : "IS"} NULL + ORDER BY created_at DESC LIMIT 25;`, + ) + .bind(before, !Number(showClosed)) + .all(); + rows.results.forEach((r) => { + r.user = JSON.parse(r.user); + delete r.user.email; + }); + break; + + case "gma": + rows = await context.env.D1.prepare( + "SELECT * FROM game_appeals WHERE created_at < ? ORDER BY created_at DESC LIMIT 25;", + ) + .bind(before) + .all(); + break; + + case "inactivity": + rows = await context.env.D1.prepare( + `SELECT *, + (SELECT COUNT(*) FROM json_each(decisions)) as decision_count + FROM inactivity_notices + WHERE created_at < ? + AND decision_count ${showClosed ? "=" : "!="} json_array_length(departments)`, + ) + .bind(before) + .all(); + break; + + case "report": + rows = await context.env.D1.prepare( + "SELECT * FROM reports WHERE created_at < ? AND open = ? ORDER BY created_at DESC LIMIT 25;", + ) + .bind(before, !Number(showClosed)) + .all(); + + rows.results.forEach((r) => { + r.attachments = JSON.parse(r.attachments); + r.target_ids = JSON.parse(r.target_ids); + r.target_usernames = JSON.parse(r.target_usernames); + + if (!r.user) return; + + r.user = JSON.parse(r.user); + }); + + break; + + default: + return jsonError("Unknown filter error", 500); + } + + return jsonResponse(JSON.stringify(rows.results)); +} diff --git a/functions/api/mod-queue/list.ts b/functions/api/mod-queue/list.ts deleted file mode 100644 index d8c6160..0000000 --- a/functions/api/mod-queue/list.ts +++ /dev/null @@ -1,90 +0,0 @@ -import { jsonError, jsonResponse } from "../../common.js"; - -export async function onRequestGet(context: RequestContext) { - const { searchParams } = new URL(context.request.url); - const before = parseInt(searchParams.get("before") || `${Date.now()}`); - const entryType = searchParams.get("type"); - const showClosed = searchParams.get("showClosed") === "true"; - const tables: { [k: string]: string } = { - appeal: "appeals", - gma: "game_appeals", - inactivity: "inactivity_notices", - report: "reports", - }; - const types: { [k: string]: string } = { - appeal: "appeal", - gma: "gameappeal", - inactivity: "inactivity", - report: "report", - }; - const permissions: { [k: string]: number[] } = { - appeal: [1 << 0, 1 << 1], - gma: [1 << 5], - inactivity: [1 << 4, 1 << 6, 1 << 7, 1 << 11, 1 << 12], - report: [1 << 5], - }; - const { current_user: currentUser } = context.data; - - if (!entryType || !types[entryType]) - return jsonError("Invalid filter type", 400); - - if (!permissions[entryType].find((p) => currentUser.permissions & p)) - return jsonError("You cannot use this filter", 403); - - if (isNaN(before)) return jsonError("Invalid `before` parameter", 400); - - const prefix = types[entryType]; - const table = tables[entryType]; - const items = []; - const { results }: { results?: { created_at: number; id: string }[] } = - /* - This is normally VERY BAD and can lead to injection attacks - However, there is no other way to do this, as using bindings for table names is unsupported apparently - To avoid any potential injection attacks we enforce a list of specific values and permissions for table names - */ - await context.env.D1.prepare( - `SELECT id - FROM ${table} - WHERE created_at < ? AND open = ? - ORDER BY created_at DESC LIMIT 25;`, - ) - .bind(before, Number(!showClosed)) - .all(); - - if (results) - for (const { id } of results) { - const item: { [k: string]: any } | null = await context.env.DATA.get( - `${prefix}_${id}`, - { - type: "json", - }, - ); - - if (item) { - delete item.user?.email; - - if (entryType === "inactivity") { - // Only include inactivity notices that a user can actually act on - const departments = { - DM: [1 << 11], - ET: [1 << 4, 1 << 12], - FM: [1 << 7], - WM: [1 << 6], - }; - - if ( - !Object.entries(departments).find( - (dept) => - item.departments.includes(dept[0]) && - dept[1].find((p) => currentUser.permissions & p), - ) - ) - continue; - } - - items.push({ ...item, id }); - } - } - - return jsonResponse(JSON.stringify(items.filter((v) => v !== null))); -} diff --git a/functions/api/reports/[id]/action.ts b/functions/api/reports/[id]/action.ts index 86844e2..d65da79 100644 --- a/functions/api/reports/[id]/action.ts +++ b/functions/api/reports/[id]/action.ts @@ -5,15 +5,18 @@ import { sendPushNotification } from "../../../gcloud.js"; export async function onRequestPost(context: RequestContext) { const reportId = context.params.id as string; - const reportData: (ReportCardProps & { fcm_token?: string }) | null = - await context.env.DATA.get(`report_${reportId}`, { type: "json" }); + const report: { + [k: string]: any; + } | null = await context.env.D1.prepare("SELECT * FROM reports WHERE id = ?") + .bind(reportId) + .first(); - if (!reportData) return jsonError("Report does not exist", 404); + if (!report) return jsonError("Report does not exist", 404); const actionMap = context.data.body; const newActions: { [k: string]: { BanType: number } } = {}; const logMap: { [k: string]: number } = {}; - const { user } = reportData as ReportCardProps & { user?: { email: string } }; + const user = JSON.parse(report.user); for (const [user, action] of Object.entries(actionMap)) { if ( @@ -64,35 +67,44 @@ export async function onRequestPost(context: RequestContext) { await setBanList(context, Object.assign(banList, newActions)); } - reportData.open = false; + const pushNotificationData: Record | null = + await context.env.D1.prepare( + "SELECT token FROM push_notifications WHERE event_id = ? AND event_type = 'report';", + ) + .bind(reportId) + .first(); - if (user?.email && !reportData.fcm_token) + if (user?.email) await sendEmail( - user.email, + user?.email, context.env.MAILGUN_API_KEY, "Report Processed", "report_processed", { - username: reportData.user?.username as string, + username: report.user?.username as string, }, ); - else if (reportData.fcm_token) + else if (pushNotificationData) await sendPushNotification( context.env, "Report Processed", - `Your report for ${reportData.target_usernames.toString()} has been reviewed.`, - reportData.fcm_token, + `Your report for ${JSON.parse(report.target_usernames).toString()} has been reviewed.`, + pushNotificationData.token, ); - delete reportData.fcm_token; - delete (reportData.user as { email?: string; id: string; username: string }) + delete (report.user as { email?: string; id: string; username: string }) ?.email; - await context.env.DATA.put(`report_${reportId}`, JSON.stringify(reportData)); await context.env.D1.prepare("UPDATE reports SET open = 0 WHERE id = ?;") .bind(reportId) .run(); + await context.env.D1.prepare( + "DELETE FROM push_notifications WHERE event_id = ? AND event_type = 'report';", + ) + .bind(reportId) + .run(); + return new Response(null, { status: 204, }); diff --git a/functions/api/reports/complete.ts b/functions/api/reports/complete.ts index 974bee4..f02dd8a 100644 --- a/functions/api/reports/complete.ts +++ b/functions/api/reports/complete.ts @@ -17,7 +17,11 @@ export async function onRequestPost(context: RequestContext) { await context.env.DATA.delete(`reportprocessing_${id}`); - const value = await context.env.DATA.get(`report_${id}`); + const value = await context.env.D1.prepare( + "SELECT id FROM reports WHERE id = ?;", + ) + .bind(id) + .first(); if (!value) return jsonError("Report is missing", 500); diff --git a/functions/api/reports/recall.ts b/functions/api/reports/recall.ts index 0e0b6cc..9a69106 100644 --- a/functions/api/reports/recall.ts +++ b/functions/api/reports/recall.ts @@ -15,12 +15,15 @@ export async function onRequestPost(context: RequestContext) { ) return jsonError("No processing report with that ID found", 404); - const data: { [k: string]: any } | null = await context.env.DATA.get( - `report_${id}`, - { type: "json" }, - ); + const data: Record | null = await context.env.D1.prepare( + "SELECT attachments FROM reports WHERE id = ?;", + ) + .bind(id) + .first(); - if (!data) return jsonError("Report doesn't exist", 404); + if (!data) return jsonError("No report with that ID found", 404); + + data.attachments = JSON.parse(data.attachments); const accessToken = await GetAccessToken(context.env); const attachmentDeletePromises = []; @@ -47,7 +50,6 @@ export async function onRequestPost(context: RequestContext) { ); await Promise.allSettled(attachmentDeletePromises); - await context.env.DATA.delete(`report_${id}`); await context.env.D1.prepare("DELETE FROM reports WHERE id = ?;") .bind(id) .run(); diff --git a/functions/api/reports/submit.ts b/functions/api/reports/submit.ts index 01ffdcf..43f39f1 100644 --- a/functions/api/reports/submit.ts +++ b/functions/api/reports/submit.ts @@ -195,33 +195,25 @@ export async function onRequestPost(context: RequestContext) { attachments.push(new URL(urlResult.value).pathname.replace(/^\/?t?\//, "")); } - await context.env.DATA.put( - `report_${reportId}`, - JSON.stringify({ - attachments, - created_at: Date.now(), - fcm_token: typeof senderTokenId === "string" ? senderTokenId : undefined, - id: reportId, - open: true, - user: currentUser - ? { - email: currentUser.email, - id: currentUser.id, - username: currentUser.username, - } - : null, - target_ids: metaIDs, - target_usernames: metaNames, - }), - ); - - try { - await context.env.D1.prepare( - "INSERT INTO reports (created_at, id, open, user) VALUES (?, ?, ?, ?);", + await context.env.D1.prepare( + "INSERT INTO reports (attachments, created_at, id, open, target_ids, target_usernames, user) VALUES (?, ?, ?, 1, ?, ?, ?);", + ) + .bind( + JSON.stringify(attachments), + Date.now(), + reportId, + JSON.stringify(metaIDs), + JSON.stringify(metaNames), + currentUser ? JSON.stringify(currentUser) : null, ) - .bind(Date.now(), reportId, 1, currentUser?.id || null) + .run(); + + if (typeof senderTokenId === "string") + await context.env.D1.prepare( + "INSERT INTO push_notifications (created_at, event_id, event_type, token) VALUES (?, ?, ?, ?);", + ) + .bind(Date.now(), reportId, "report", senderTokenId) .run(); - } catch {} return jsonResponse( JSON.stringify({ id: reportId, upload_urls: uploadUrls }), diff --git a/index.d.ts b/index.d.ts index 3817d1c..51b0803 100644 --- a/index.d.ts +++ b/index.d.ts @@ -10,6 +10,13 @@ declare global { [k: string]: string; } + type FCMTokenResult = { + created_at: number; + event_id: string; + event_type: string; + token: string; + } + type RequestContext = EventContext; interface AppealCardProps { diff --git a/package-lock.json b/package-lock.json index 11628c0..33d165c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11,21 +11,21 @@ "@chakra-ui/react": "^2.8.2", "@emotion/react": "^11.11.4", "@emotion/styled": "^11.11.5", - "@fontsource/plus-jakarta-sans": "^5.0.19", - "@remix-run/cloudflare": "^2.8.1", - "@remix-run/cloudflare-pages": "^2.8.1", - "@remix-run/react": "^2.8.1", - "@sentry/react": "^7.110.1", + "@fontsource/plus-jakarta-sans": "^5.0.20", + "@remix-run/cloudflare": "^2.9.2", + "@remix-run/cloudflare-pages": "^2.9.2", + "@remix-run/react": "^2.9.2", + "@sentry/react": "^7.114.0", "aws4fetch": "^1.0.18", - "framer-motion": "^11.0.28", - "react": "^18.2.0", - "react-dom": "^18.2.0" + "framer-motion": "^11.1.9", + "react": "^18.3.1", + "react-dom": "^18.3.1" }, "devDependencies": { - "@remix-run/dev": "^2.8.1", - "@types/node": "^20.12.7", - "@types/react": "^18.2.78", - "@types/react-dom": "^18.2.25", + "@remix-run/dev": "^2.9.2", + "@types/node": "^20.12.11", + "@types/react": "^18.3.2", + "@types/react-dom": "^18.3.0", "dotenv": "^16.4.5", "prettier": "^3.2.5", "typescript": "^5.4.5" @@ -1875,9 +1875,9 @@ } }, "node_modules/@cloudflare/workers-types": { - "version": "4.20240405.0", - "resolved": "https://registry.npmjs.org/@cloudflare/workers-types/-/workers-types-4.20240405.0.tgz", - "integrity": "sha512-sEVOhyOgXUwfLkgHqbLZa/sfkSYrh7/zLmI6EZNibPaVPvAnAcItbNNl3SAlLyLKuwf8m4wAIAgu9meKWCvXjg==", + "version": "4.20240502.0", + "resolved": "https://registry.npmjs.org/@cloudflare/workers-types/-/workers-types-4.20240502.0.tgz", + "integrity": "sha512-OB1jIyPOzyOcuZFHWhsQnkRLN6u8+jmU9X3T4KZlGgn3Ivw8pBiswhLOp+yFeChR3Y4/5+V0hPFRko5SReordg==", "peer": true }, "node_modules/@emotion/babel-plugin": { @@ -2013,6 +2013,23 @@ "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.3.1.tgz", "integrity": "sha512-EsBwpc7hBUJWAsNPBmJy4hxWx12v6bshQsldrVmjxJoc3isbxhOrF2IcCpaXxfvq03NwkI7sbsOLXbYuqF/8Ww==" }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.20.2.tgz", + "integrity": "sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "aix" + ], + "peer": true, + "engines": { + "node": ">=12" + } + }, "node_modules/@esbuild/android-arm": { "version": "0.17.6", "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.17.6.tgz", @@ -2366,9 +2383,9 @@ } }, "node_modules/@fontsource/plus-jakarta-sans": { - "version": "5.0.19", - "resolved": "https://registry.npmjs.org/@fontsource/plus-jakarta-sans/-/plus-jakarta-sans-5.0.19.tgz", - "integrity": "sha512-LWMReNfB3s3tLRCPlFkqTfheqV40+2RQ4pOFhmKKB+9QrFsSf+g4Sl5r2V0+FNWHzdjfCas7uF4d+PejipqvUw==" + "version": "5.0.20", + "resolved": "https://registry.npmjs.org/@fontsource/plus-jakarta-sans/-/plus-jakarta-sans-5.0.20.tgz", + "integrity": "sha512-a887FrG31RWqliRg1jXZM8tjzqee2NlO3Vuc5uGdws2EFvOg46P9VMaeS5eM3jihFq8Kj0zUQD0GYQqcxdkfCA==" }, "node_modules/@isaacs/cliui": { "version": "8.0.2", @@ -2560,12 +2577,12 @@ } }, "node_modules/@remix-run/cloudflare": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/@remix-run/cloudflare/-/cloudflare-2.8.1.tgz", - "integrity": "sha512-/JTFIjRcT8DhQuHa0i1TKBO9q1NeVteYgxi6w4fCf6pS+HoQ3+1UXVqOQflUfuChCCn5R3mzPJywDq0RyH3ctw==", + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/@remix-run/cloudflare/-/cloudflare-2.9.2.tgz", + "integrity": "sha512-gTITKNS4kEx3svcyXsobC5ODTZJ09P1+NMymr1fi6wLkLpUmLa1jLdPBrfo60b5acAmxPWRTtTtL+UJPHnjHYQ==", "dependencies": { "@cloudflare/kv-asset-handler": "^0.1.3", - "@remix-run/server-runtime": "2.8.1" + "@remix-run/server-runtime": "2.9.2" }, "engines": { "node": ">=18.0.0" @@ -2581,11 +2598,11 @@ } }, "node_modules/@remix-run/cloudflare-pages": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/@remix-run/cloudflare-pages/-/cloudflare-pages-2.8.1.tgz", - "integrity": "sha512-VigmjkawtEzIgjeyv4MZa3S2sIxXJBMEr4Ol1bsxW8d3uHjcB83Fh/Ywe4phot/SsUzuYHccKbIMT/YY9ly2zg==", + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/@remix-run/cloudflare-pages/-/cloudflare-pages-2.9.2.tgz", + "integrity": "sha512-ese5MIsSCfSsv4fnEaFWwDlxpVFfz4WU77egRmDdQVMcFoYXUIBTZ8BUQwxYmSthdwzutQJ9bwoXLqDYVXdW2A==", "dependencies": { - "@remix-run/cloudflare": "2.8.1" + "@remix-run/cloudflare": "2.9.2" }, "engines": { "node": ">=18.0.0" @@ -2601,9 +2618,9 @@ } }, "node_modules/@remix-run/dev": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/@remix-run/dev/-/dev-2.8.1.tgz", - "integrity": "sha512-qFt4jAsAJeIOyg6ngeSnTG/9Z5N9QJfeThP/8wRHc1crqYgTiEtcI3DZ8WlAXjVSF5emgn/ZZKqzLAI02OgMfQ==", + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/@remix-run/dev/-/dev-2.9.2.tgz", + "integrity": "sha512-70dr9HH/mCHP5+uPoQXyS9+r73IL//IDPaFruIhK8kmmLPGAg5bGyFRz/xX6LTa98gPdAwZXxBy7frudeh2Z0Q==", "dev": true, "dependencies": { "@babel/core": "^7.21.8", @@ -2616,9 +2633,9 @@ "@babel/types": "^7.22.5", "@mdx-js/mdx": "^2.3.0", "@npmcli/package-json": "^4.0.1", - "@remix-run/node": "2.8.1", - "@remix-run/router": "1.15.3-pre.0", - "@remix-run/server-runtime": "2.8.1", + "@remix-run/node": "2.9.2", + "@remix-run/router": "1.16.1", + "@remix-run/server-runtime": "2.9.2", "@types/mdx": "^2.0.5", "@vanilla-extract/integration": "^6.2.0", "arg": "^5.0.1", @@ -2667,7 +2684,8 @@ "node": ">=18.0.0" }, "peerDependencies": { - "@remix-run/serve": "^2.8.1", + "@remix-run/react": "^2.9.2", + "@remix-run/serve": "^2.9.2", "typescript": "^5.1.0", "vite": "^5.1.0", "wrangler": "^3.28.2" @@ -2703,19 +2721,18 @@ } }, "node_modules/@remix-run/node": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/@remix-run/node/-/node-2.8.1.tgz", - "integrity": "sha512-ddCwBVlfLvRxTQJHPcaM1lhfMjsFYG3EGmYpWJIWnnzDX5EbX9pUNHBWisMuH1eA0c7pbw0PbW0UtCttKYx2qg==", + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/@remix-run/node/-/node-2.9.2.tgz", + "integrity": "sha512-2Mt2107pfelz4T+ziDBef3P4A7kgPqCDshnEYCVGxInivJ3HHwAKUcb7MhGa8uMMMA6LMWxbAPYNHPzC3iKv2A==", "dev": true, "dependencies": { - "@remix-run/server-runtime": "2.8.1", + "@remix-run/server-runtime": "2.9.2", "@remix-run/web-fetch": "^4.4.2", - "@remix-run/web-file": "^3.1.0", - "@remix-run/web-stream": "^1.1.0", "@web3-storage/multipart-parser": "^1.0.0", "cookie-signature": "^1.1.0", "source-map-support": "^0.5.21", - "stream-slice": "^0.1.2" + "stream-slice": "^0.1.2", + "undici": "^6.10.1" }, "engines": { "node": ">=18.0.0" @@ -2730,14 +2747,15 @@ } }, "node_modules/@remix-run/react": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/@remix-run/react/-/react-2.8.1.tgz", - "integrity": "sha512-HTPm1U8+xz2jPaVjZnssrckfmFMA8sUZUdaWnoF5lmLWdReqcQv+XlBhIrQQ3jO9L8iYYdnzaSZZcRFYSdpTYg==", + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/@remix-run/react/-/react-2.9.2.tgz", + "integrity": "sha512-DcZDzm68MBxGn8hjf/VsuUpjxDYZ8VOOH79P1zWu4hb3hBr90WV1Sa/gIAFUEGpOCcSQ0EG/ci8MaFxcAaPz2Q==", "dependencies": { - "@remix-run/router": "1.15.3", - "@remix-run/server-runtime": "2.8.1", - "react-router": "6.22.3", - "react-router-dom": "6.22.3" + "@remix-run/router": "1.16.1", + "@remix-run/server-runtime": "2.9.2", + "react-router": "6.23.1", + "react-router-dom": "6.23.1", + "turbo-stream": "^2.0.0" }, "engines": { "node": ">=18.0.0" @@ -2753,34 +2771,26 @@ } } }, - "node_modules/@remix-run/react/node_modules/@remix-run/router": { - "version": "1.15.3", - "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.15.3.tgz", - "integrity": "sha512-Oy8rmScVrVxWZVOpEF57ovlnhpZ8CCPlnIIumVcV9nFdiSIrus99+Lw78ekXyGvVDlIsFJbSfmSovJUhCWYV3w==", - "engines": { - "node": ">=14.0.0" - } - }, "node_modules/@remix-run/router": { - "version": "1.15.3-pre.0", - "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.15.3-pre.0.tgz", - "integrity": "sha512-JUQb6sztqJpRbsdKpx3D4+6eaGmHU4Yb/QeKrES/ZbLuijlZMOmZ+gV0ohX5vrRDnJHJmcQPq3Tpk0GGPNM9gg==", - "dev": true, + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.16.1.tgz", + "integrity": "sha512-es2g3dq6Nb07iFxGk5GuHN20RwBZOsuDQN7izWIisUcv9r+d2C5jQxqmgkdebXgReWfiyUabcki6Fg77mSNrig==", "engines": { "node": ">=14.0.0" } }, "node_modules/@remix-run/server-runtime": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/@remix-run/server-runtime/-/server-runtime-2.8.1.tgz", - "integrity": "sha512-fh4SOEoONrN73Kvzc0gMDCmYpVRVbvoj9j3BUXHAcn0An8iX+HD/22gU7nTkIBzExM/F9xgEcwTewOnWqLw0Bg==", + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/@remix-run/server-runtime/-/server-runtime-2.9.2.tgz", + "integrity": "sha512-dX37FEeMVVg7KUbpRhX4hD0nUY0Sscz/qAjU4lYCdd6IzwJGariTmz+bQTXKCjploZuXj09OQZHSOS/ydkUVDA==", "dependencies": { - "@remix-run/router": "1.15.3", + "@remix-run/router": "1.16.1", "@types/cookie": "^0.6.0", "@web3-storage/multipart-parser": "^1.0.0", "cookie": "^0.6.0", "set-cookie-parser": "^2.4.8", - "source-map": "^0.7.3" + "source-map": "^0.7.3", + "turbo-stream": "^2.0.0" }, "engines": { "node": ">=18.0.0" @@ -2794,14 +2804,6 @@ } } }, - "node_modules/@remix-run/server-runtime/node_modules/@remix-run/router": { - "version": "1.15.3", - "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.15.3.tgz", - "integrity": "sha512-Oy8rmScVrVxWZVOpEF57ovlnhpZ8CCPlnIIumVcV9nFdiSIrus99+Lw78ekXyGvVDlIsFJbSfmSovJUhCWYV3w==", - "engines": { - "node": ">=14.0.0" - } - }, "node_modules/@remix-run/server-runtime/node_modules/source-map": { "version": "0.7.4", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", @@ -2866,84 +2868,323 @@ "web-streams-polyfill": "^3.1.1" } }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.17.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.17.2.tgz", + "integrity": "sha512-NM0jFxY8bB8QLkoKxIQeObCaDlJKewVlIEkuyYKm5An1tdVZ966w2+MPQ2l8LBZLjR+SgyV+nRkTIunzOYBMLQ==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "peer": true + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.17.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.17.2.tgz", + "integrity": "sha512-yeX/Usk7daNIVwkq2uGoq2BYJKZY1JfyLTaHO/jaiSwi/lsf8fTFoQW/n6IdAsx5tx+iotu2zCJwz8MxI6D/Bw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "peer": true + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.17.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.17.2.tgz", + "integrity": "sha512-kcMLpE6uCwls023+kknm71ug7MZOrtXo+y5p/tsg6jltpDtgQY1Eq5sGfHcQfb+lfuKwhBmEURDga9N0ol4YPw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "peer": true + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.17.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.17.2.tgz", + "integrity": "sha512-AtKwD0VEx0zWkL0ZjixEkp5tbNLzX+FCqGG1SvOu993HnSz4qDI6S4kGzubrEJAljpVkhRSlg5bzpV//E6ysTQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "peer": true + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.17.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.17.2.tgz", + "integrity": "sha512-3reX2fUHqN7sffBNqmEyMQVj/CKhIHZd4y631duy0hZqI8Qoqf6lTtmAKvJFYa6bhU95B1D0WgzHkmTg33In0A==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "peer": true + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.17.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.17.2.tgz", + "integrity": "sha512-uSqpsp91mheRgw96xtyAGP9FW5ChctTFEoXP0r5FAzj/3ZRv3Uxjtc7taRQSaQM/q85KEKjKsZuiZM3GyUivRg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "peer": true + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.17.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.17.2.tgz", + "integrity": "sha512-EMMPHkiCRtE8Wdk3Qhtciq6BndLtstqZIroHiiGzB3C5LDJmIZcSzVtLRbwuXuUft1Cnv+9fxuDtDxz3k3EW2A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "peer": true + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.17.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.17.2.tgz", + "integrity": "sha512-NMPylUUZ1i0z/xJUIx6VUhISZDRT+uTWpBcjdv0/zkp7b/bQDF+NfnfdzuTiB1G6HTodgoFa93hp0O1xl+/UbA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "peer": true + }, + "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { + "version": "4.17.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.17.2.tgz", + "integrity": "sha512-T19My13y8uYXPw/L/k0JYaX1fJKFT/PWdXiHr8mTbXWxjVF1t+8Xl31DgBBvEKclw+1b00Chg0hxE2O7bTG7GQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "peer": true + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.17.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.17.2.tgz", + "integrity": "sha512-BOaNfthf3X3fOWAB+IJ9kxTgPmMqPPH5f5k2DcCsRrBIbWnaJCgX2ll77dV1TdSy9SaXTR5iDXRL8n7AnoP5cg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "peer": true + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.17.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.17.2.tgz", + "integrity": "sha512-W0UP/x7bnn3xN2eYMql2T/+wpASLE5SjObXILTMPUBDB/Fg/FxC+gX4nvCfPBCbNhz51C+HcqQp2qQ4u25ok6g==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "peer": true + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.17.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.17.2.tgz", + "integrity": "sha512-Hy7pLwByUOuyaFC6mAr7m+oMC+V7qyifzs/nW2OJfC8H4hbCzOX07Ov0VFk/zP3kBsELWNFi7rJtgbKYsav9QQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "peer": true + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.17.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.17.2.tgz", + "integrity": "sha512-h1+yTWeYbRdAyJ/jMiVw0l6fOOm/0D1vNLui9iPuqgRGnXA0u21gAqOyB5iHjlM9MMfNOm9RHCQ7zLIzT0x11Q==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "peer": true + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.17.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.17.2.tgz", + "integrity": "sha512-tmdtXMfKAjy5+IQsVtDiCfqbynAQE/TQRpWdVataHmhMb9DCoJxp9vLcCBjEQWMiUYxO1QprH/HbY9ragCEFLA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "peer": true + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.17.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.17.2.tgz", + "integrity": "sha512-7II/QCSTAHuE5vdZaQEwJq2ZACkBpQDOmQsE6D6XUbnBHW8IAhm4eTufL6msLJorzrHDFv3CF8oCA/hSIRuZeQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "peer": true + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.17.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.17.2.tgz", + "integrity": "sha512-TGGO7v7qOq4CYmSBVEYpI1Y5xDuCEnbVC5Vth8mOsW0gDSzxNrVERPc790IGHsrT2dQSimgMr9Ub3Y1Jci5/8w==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "peer": true + }, "node_modules/@sentry-internal/feedback": { - "version": "7.110.1", - "resolved": "https://registry.npmjs.org/@sentry-internal/feedback/-/feedback-7.110.1.tgz", - "integrity": "sha512-0aR3wuEW+SZKOVNamuy0pTQyPmqDjWPPLrB2GAXGT3ZjrVxjEzzVPqk6DVBYxSV2MuJaD507SZnvfoSPNgoBmw==", + "version": "7.114.0", + "resolved": "https://registry.npmjs.org/@sentry-internal/feedback/-/feedback-7.114.0.tgz", + "integrity": "sha512-kUiLRUDZuh10QE9JbSVVLgqxFoD9eDPOzT0MmzlPuas8JlTmJuV4FtSANNcqctd5mBuLt2ebNXH0MhRMwyae4A==", "dependencies": { - "@sentry/core": "7.110.1", - "@sentry/types": "7.110.1", - "@sentry/utils": "7.110.1" + "@sentry/core": "7.114.0", + "@sentry/types": "7.114.0", + "@sentry/utils": "7.114.0" }, "engines": { "node": ">=12" } }, "node_modules/@sentry-internal/replay-canvas": { - "version": "7.110.1", - "resolved": "https://registry.npmjs.org/@sentry-internal/replay-canvas/-/replay-canvas-7.110.1.tgz", - "integrity": "sha512-zdcCmWFXM4DHOau/BCZVb6jf9zozdbAiJ1MzQ6azuZEuysOl00YfktoWZBbZjjjpWT6025s+wrmFz54t0O+enw==", + "version": "7.114.0", + "resolved": "https://registry.npmjs.org/@sentry-internal/replay-canvas/-/replay-canvas-7.114.0.tgz", + "integrity": "sha512-6rTiqmKi/FYtesdM2TM2U+rh6BytdPjLP65KTUodtxohJ+r/3m+termj2o4BhIYPE1YYOZNmbZfwebkuQPmWeg==", "dependencies": { - "@sentry/core": "7.110.1", - "@sentry/replay": "7.110.1", - "@sentry/types": "7.110.1", - "@sentry/utils": "7.110.1" + "@sentry/core": "7.114.0", + "@sentry/replay": "7.114.0", + "@sentry/types": "7.114.0", + "@sentry/utils": "7.114.0" }, "engines": { "node": ">=12" } }, "node_modules/@sentry-internal/tracing": { - "version": "7.110.1", - "resolved": "https://registry.npmjs.org/@sentry-internal/tracing/-/tracing-7.110.1.tgz", - "integrity": "sha512-4kTd6EM0OP1SVWl2yLn3KIwlCpld1lyhNDeR8G1aKLm1PN+kVsR6YB/jy9KPPp4Q3lN3W9EkTSES3qhP4jVffQ==", + "version": "7.114.0", + "resolved": "https://registry.npmjs.org/@sentry-internal/tracing/-/tracing-7.114.0.tgz", + "integrity": "sha512-dOuvfJN7G+3YqLlUY4HIjyWHaRP8vbOgF+OsE5w2l7ZEn1rMAaUbPntAR8AF9GBA6j2zWNoSo8e7GjbJxVofSg==", "dependencies": { - "@sentry/core": "7.110.1", - "@sentry/types": "7.110.1", - "@sentry/utils": "7.110.1" + "@sentry/core": "7.114.0", + "@sentry/types": "7.114.0", + "@sentry/utils": "7.114.0" }, "engines": { "node": ">=8" } }, "node_modules/@sentry/browser": { - "version": "7.110.1", - "resolved": "https://registry.npmjs.org/@sentry/browser/-/browser-7.110.1.tgz", - "integrity": "sha512-H3TZlbdsgxuoVxhotMtBDemvAofx3UPNcS+UjQ40Bd+hKX01IIbEN3i+9RQ0jmcbU6xjf+yhjwp+Ejpm4FmYMw==", + "version": "7.114.0", + "resolved": "https://registry.npmjs.org/@sentry/browser/-/browser-7.114.0.tgz", + "integrity": "sha512-ijJ0vOEY6U9JJADVYGkUbLrAbpGSQgA4zV+KW3tcsBLX9M1jaWq4BV1PWHdzDPPDhy4OgfOjIfaMb5BSPn1U+g==", "dependencies": { - "@sentry-internal/feedback": "7.110.1", - "@sentry-internal/replay-canvas": "7.110.1", - "@sentry-internal/tracing": "7.110.1", - "@sentry/core": "7.110.1", - "@sentry/replay": "7.110.1", - "@sentry/types": "7.110.1", - "@sentry/utils": "7.110.1" + "@sentry-internal/feedback": "7.114.0", + "@sentry-internal/replay-canvas": "7.114.0", + "@sentry-internal/tracing": "7.114.0", + "@sentry/core": "7.114.0", + "@sentry/integrations": "7.114.0", + "@sentry/replay": "7.114.0", + "@sentry/types": "7.114.0", + "@sentry/utils": "7.114.0" }, "engines": { "node": ">=8" } }, "node_modules/@sentry/core": { - "version": "7.110.1", - "resolved": "https://registry.npmjs.org/@sentry/core/-/core-7.110.1.tgz", - "integrity": "sha512-yC1yeUFQlmHj9u/KxKmwOMVanBmgfX+4MZnZU31QPqN95adyZTwpaYFZl4fH5kDVnz7wXJI0qRP8SxuMePtqhw==", + "version": "7.114.0", + "resolved": "https://registry.npmjs.org/@sentry/core/-/core-7.114.0.tgz", + "integrity": "sha512-YnanVlmulkjgZiVZ9BfY9k6I082n+C+LbZo52MTvx3FY6RE5iyiPMpaOh67oXEZRWcYQEGm+bKruRxLVP6RlbA==", "dependencies": { - "@sentry/types": "7.110.1", - "@sentry/utils": "7.110.1" + "@sentry/types": "7.114.0", + "@sentry/utils": "7.114.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@sentry/integrations": { + "version": "7.114.0", + "resolved": "https://registry.npmjs.org/@sentry/integrations/-/integrations-7.114.0.tgz", + "integrity": "sha512-BJIBWXGKeIH0ifd7goxOS29fBA8BkEgVVCahs6xIOXBjX1IRS6PmX0zYx/GP23nQTfhJiubv2XPzoYOlZZmDxg==", + "dependencies": { + "@sentry/core": "7.114.0", + "@sentry/types": "7.114.0", + "@sentry/utils": "7.114.0", + "localforage": "^1.8.1" }, "engines": { "node": ">=8" } }, "node_modules/@sentry/react": { - "version": "7.110.1", - "resolved": "https://registry.npmjs.org/@sentry/react/-/react-7.110.1.tgz", - "integrity": "sha512-kXdMrDexPyBf0KP/IfgCk5NS1Yfz6tFK/+UKWTxEM5PVRZkHzV7CBdd50IFGL3xMGbJmtE5Bly6WzezqUgWZ5w==", + "version": "7.114.0", + "resolved": "https://registry.npmjs.org/@sentry/react/-/react-7.114.0.tgz", + "integrity": "sha512-zVPtvSy00Al25Z21f5GNzo3rd/TKS+iOX9wQwLrUZAxyf9RwBxKATLVJNJPkf8dQml6Qx+lfr0BHIlVcr1a1SQ==", "dependencies": { - "@sentry/browser": "7.110.1", - "@sentry/core": "7.110.1", - "@sentry/types": "7.110.1", - "@sentry/utils": "7.110.1", + "@sentry/browser": "7.114.0", + "@sentry/core": "7.114.0", + "@sentry/types": "7.114.0", + "@sentry/utils": "7.114.0", "hoist-non-react-statics": "^3.3.2" }, "engines": { @@ -2954,33 +3195,33 @@ } }, "node_modules/@sentry/replay": { - "version": "7.110.1", - "resolved": "https://registry.npmjs.org/@sentry/replay/-/replay-7.110.1.tgz", - "integrity": "sha512-R49fGOuKYsJ97EujPTzMjs3ZSuSkLTFFQmVBbsu/o6beRp4kK9l8H7r2BfLEcWJOXdWO5EU4KpRWgIxHaDK2aw==", + "version": "7.114.0", + "resolved": "https://registry.npmjs.org/@sentry/replay/-/replay-7.114.0.tgz", + "integrity": "sha512-UvEajoLIX9n2poeW3R4Ybz7D0FgCGXoFr/x/33rdUEMIdTypknxjJWxg6fJngIduzwrlrvWpvP8QiZXczYQy2Q==", "dependencies": { - "@sentry-internal/tracing": "7.110.1", - "@sentry/core": "7.110.1", - "@sentry/types": "7.110.1", - "@sentry/utils": "7.110.1" + "@sentry-internal/tracing": "7.114.0", + "@sentry/core": "7.114.0", + "@sentry/types": "7.114.0", + "@sentry/utils": "7.114.0" }, "engines": { "node": ">=12" } }, "node_modules/@sentry/types": { - "version": "7.110.1", - "resolved": "https://registry.npmjs.org/@sentry/types/-/types-7.110.1.tgz", - "integrity": "sha512-sZxOpM5gfyxvJeWVvNpHnxERTnlqcozjqNcIv29SZ6wonlkekmxDyJ3uCuPv85VO54WLyA4uzskPKnNFHacI8A==", + "version": "7.114.0", + "resolved": "https://registry.npmjs.org/@sentry/types/-/types-7.114.0.tgz", + "integrity": "sha512-tsqkkyL3eJtptmPtT0m9W/bPLkU7ILY7nvwpi1hahA5jrM7ppoU0IMaQWAgTD+U3rzFH40IdXNBFb8Gnqcva4w==", "engines": { "node": ">=8" } }, "node_modules/@sentry/utils": { - "version": "7.110.1", - "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-7.110.1.tgz", - "integrity": "sha512-eibLo2m1a7sHkOHxYYmRujr3D7ek2l9sv26F1SLoQBVDF7Afw5AKyzPmtA1D+4M9P/ux1okj7cGj3SaBrVpxXA==", + "version": "7.114.0", + "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-7.114.0.tgz", + "integrity": "sha512-319N90McVpupQ6vws4+tfCy/03AdtsU0MurIE4+W5cubHME08HtiEWlfacvAxX+yuKFhvdsO4K4BB/dj54ideg==", "dependencies": { - "@sentry/types": "7.110.1" + "@sentry/types": "7.114.0" }, "engines": { "node": ">=8" @@ -3068,9 +3309,9 @@ "dev": true }, "node_modules/@types/node": { - "version": "20.12.7", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.12.7.tgz", - "integrity": "sha512-wq0cICSkRLVaf3UGLMGItu/PtdY7oaXaI/RVU+xliKVOtRna3PRY57ZDfztpDL0n11vfymMUnXv8QwYCO7L1wg==", + "version": "20.12.11", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.12.11.tgz", + "integrity": "sha512-vDg9PZ/zi+Nqp6boSOT7plNuthRugEKixDv5sFTIpkE89MmNtEArAShI4mxuX2+UrLEe9pxC1vm2cjm9YlWbJw==", "dev": true, "dependencies": { "undici-types": "~5.26.4" @@ -3088,9 +3329,9 @@ "devOptional": true }, "node_modules/@types/react": { - "version": "18.2.78", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.78.tgz", - "integrity": "sha512-qOwdPnnitQY4xKlKayt42q5W5UQrSHjgoXNVEtxeqdITJ99k4VXJOP3vt8Rkm9HmgJpH50UNU+rlqfkfWOqp0A==", + "version": "18.3.2", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.2.tgz", + "integrity": "sha512-Btgg89dAnqD4vV7R3hlwOxgqobUQKgx3MmrQRi0yYbs/P0ym8XozIAlkqVilPqHQwXs4e9Tf63rrCgl58BcO4w==", "devOptional": true, "dependencies": { "@types/prop-types": "*", @@ -3098,9 +3339,9 @@ } }, "node_modules/@types/react-dom": { - "version": "18.2.25", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.2.25.tgz", - "integrity": "sha512-o/V48vf4MQh7juIKZU2QGDfli6p1+OOi5oXx36Hffpc9adsHeXjVp8rHuPkjd8VT8sOJ2Zp05HR7CdpGTIUFUA==", + "version": "18.3.0", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.0.tgz", + "integrity": "sha512-EhwApuTmMBmXuFOikhQLIBUn6uFg81SwLMOAUgodJF14SOBOCMdU04gDoYi0WOJJHD144TL32z4yDqCW3dnkQg==", "dev": true, "dependencies": { "@types/react": "*" @@ -3161,6 +3402,466 @@ "vite-node": "^0.28.5" } }, + "node_modules/@vanilla-extract/integration/node_modules/@esbuild/android-arm": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.20.tgz", + "integrity": "sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@vanilla-extract/integration/node_modules/@esbuild/android-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.20.tgz", + "integrity": "sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@vanilla-extract/integration/node_modules/@esbuild/android-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.20.tgz", + "integrity": "sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@vanilla-extract/integration/node_modules/@esbuild/darwin-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.20.tgz", + "integrity": "sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@vanilla-extract/integration/node_modules/@esbuild/darwin-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.20.tgz", + "integrity": "sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@vanilla-extract/integration/node_modules/@esbuild/freebsd-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.20.tgz", + "integrity": "sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@vanilla-extract/integration/node_modules/@esbuild/freebsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.20.tgz", + "integrity": "sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@vanilla-extract/integration/node_modules/@esbuild/linux-arm": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.20.tgz", + "integrity": "sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@vanilla-extract/integration/node_modules/@esbuild/linux-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.20.tgz", + "integrity": "sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@vanilla-extract/integration/node_modules/@esbuild/linux-ia32": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.20.tgz", + "integrity": "sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@vanilla-extract/integration/node_modules/@esbuild/linux-loong64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.20.tgz", + "integrity": "sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@vanilla-extract/integration/node_modules/@esbuild/linux-mips64el": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.20.tgz", + "integrity": "sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@vanilla-extract/integration/node_modules/@esbuild/linux-ppc64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.20.tgz", + "integrity": "sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@vanilla-extract/integration/node_modules/@esbuild/linux-riscv64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.20.tgz", + "integrity": "sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@vanilla-extract/integration/node_modules/@esbuild/linux-s390x": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.20.tgz", + "integrity": "sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@vanilla-extract/integration/node_modules/@esbuild/linux-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.20.tgz", + "integrity": "sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@vanilla-extract/integration/node_modules/@esbuild/netbsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.20.tgz", + "integrity": "sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@vanilla-extract/integration/node_modules/@esbuild/openbsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.20.tgz", + "integrity": "sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@vanilla-extract/integration/node_modules/@esbuild/sunos-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.20.tgz", + "integrity": "sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@vanilla-extract/integration/node_modules/@esbuild/win32-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.20.tgz", + "integrity": "sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@vanilla-extract/integration/node_modules/@esbuild/win32-ia32": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.20.tgz", + "integrity": "sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@vanilla-extract/integration/node_modules/@esbuild/win32-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz", + "integrity": "sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@vanilla-extract/integration/node_modules/rollup": { + "version": "3.29.4", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.29.4.tgz", + "integrity": "sha512-oWzmBZwvYrU0iJHtDmhsm662rC15FRXmcjCk1xD771dFDx5jJ02ufAQQTn0etB2emNk4J9EZg/yWKpsn9BWGRw==", + "dev": true, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=14.18.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/@vanilla-extract/integration/node_modules/vite": { + "version": "4.5.3", + "resolved": "https://registry.npmjs.org/vite/-/vite-4.5.3.tgz", + "integrity": "sha512-kQL23kMeX92v3ph7IauVkXkikdDRsYMGTVl5KY2E9OY4ONLvkHf04MDTbnfo6NKxZiDLWzVpP5oTa8hQD8U3dg==", + "dev": true, + "dependencies": { + "esbuild": "^0.18.10", + "postcss": "^8.4.27", + "rollup": "^3.27.1" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + }, + "peerDependencies": { + "@types/node": ">= 14", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } + } + }, + "node_modules/@vanilla-extract/integration/node_modules/vite/node_modules/esbuild": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.20.tgz", + "integrity": "sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/android-arm": "0.18.20", + "@esbuild/android-arm64": "0.18.20", + "@esbuild/android-x64": "0.18.20", + "@esbuild/darwin-arm64": "0.18.20", + "@esbuild/darwin-x64": "0.18.20", + "@esbuild/freebsd-arm64": "0.18.20", + "@esbuild/freebsd-x64": "0.18.20", + "@esbuild/linux-arm": "0.18.20", + "@esbuild/linux-arm64": "0.18.20", + "@esbuild/linux-ia32": "0.18.20", + "@esbuild/linux-loong64": "0.18.20", + "@esbuild/linux-mips64el": "0.18.20", + "@esbuild/linux-ppc64": "0.18.20", + "@esbuild/linux-riscv64": "0.18.20", + "@esbuild/linux-s390x": "0.18.20", + "@esbuild/linux-x64": "0.18.20", + "@esbuild/netbsd-x64": "0.18.20", + "@esbuild/openbsd-x64": "0.18.20", + "@esbuild/sunos-x64": "0.18.20", + "@esbuild/win32-arm64": "0.18.20", + "@esbuild/win32-ia32": "0.18.20", + "@esbuild/win32-x64": "0.18.20" + } + }, "node_modules/@vanilla-extract/private": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/@vanilla-extract/private/-/private-1.0.3.tgz", @@ -4701,9 +5402,9 @@ } }, "node_modules/framer-motion": { - "version": "11.0.28", - "resolved": "https://registry.npmjs.org/framer-motion/-/framer-motion-11.0.28.tgz", - "integrity": "sha512-j/vNYTCH5MX5sY/3dwMs00z1+qAqKX3iIHF762bwqlU814ooD5dDbuj3pA0LmIT5YqyryCkXEb/q+zRblin0lw==", + "version": "11.1.9", + "resolved": "https://registry.npmjs.org/framer-motion/-/framer-motion-11.1.9.tgz", + "integrity": "sha512-flECDIPV4QDNcOrDafVFiIazp8X01HFpzc01eDKJsdNH/wrATcYydJSH9JbPWMS8UD5lZlw+J1sK8LG2kICgqw==", "dependencies": { "tslib": "^2.4.0" }, @@ -5153,6 +5854,11 @@ } ] }, + "node_modules/immediate": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", + "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==" + }, "node_modules/import-fresh": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", @@ -5589,6 +6295,14 @@ "node": ">=6" } }, + "node_modules/lie": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/lie/-/lie-3.1.1.tgz", + "integrity": "sha512-RiNhHysUjhrDQntfYSfY4MU24coXXdEOgw9WGcKHNeEwffDYbF//u87M1EWaMGzuFoSbqW0C9C6lEEhDOAswfw==", + "dependencies": { + "immediate": "~3.0.5" + } + }, "node_modules/lilconfig": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", @@ -5624,6 +6338,14 @@ "url": "https://github.com/sponsors/antfu" } }, + "node_modules/localforage": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/localforage/-/localforage-1.10.0.tgz", + "integrity": "sha512-14/H1aX7hzBBmmh7sGPd+AOMkkIrHM3Z1PAyGgZigA1H1p5O5ANnMyWzvpAETtG68/dC4pC0ncy3+PPGzXZHPg==", + "dependencies": { + "lie": "3.1.1" + } + }, "node_modules/locate-path": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", @@ -7308,9 +8030,9 @@ } }, "node_modules/postcss": { - "version": "8.4.32", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.32.tgz", - "integrity": "sha512-D/kj5JNu6oo2EIy+XL/26JEDTlIbB8hw85G8StOE6L74RQAVVP5rej6wxCNqyMbR4RkPfqvezVbPw81Ngd6Kcw==", + "version": "8.4.38", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.38.tgz", + "integrity": "sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==", "dev": true, "funding": [ { @@ -7329,7 +8051,7 @@ "dependencies": { "nanoid": "^3.3.7", "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" + "source-map-js": "^1.2.0" }, "engines": { "node": "^10 || ^12 || >=14" @@ -7640,9 +8362,9 @@ } }, "node_modules/react": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", - "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", + "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", "dependencies": { "loose-envify": "^1.1.0" }, @@ -7662,15 +8384,15 @@ } }, "node_modules/react-dom": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz", - "integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==", + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", + "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", "dependencies": { "loose-envify": "^1.1.0", - "scheduler": "^0.23.0" + "scheduler": "^0.23.2" }, "peerDependencies": { - "react": "^18.2.0" + "react": "^18.3.1" } }, "node_modules/react-fast-compare": { @@ -7760,11 +8482,11 @@ } }, "node_modules/react-router": { - "version": "6.22.3", - "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.22.3.tgz", - "integrity": "sha512-dr2eb3Mj5zK2YISHK++foM9w4eBnO23eKnZEDs7c880P6oKbrjz/Svg9+nxqtHQK+oMW4OtjZca0RqPglXxguQ==", + "version": "6.23.1", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.23.1.tgz", + "integrity": "sha512-fzcOaRF69uvqbbM7OhvQyBTFDVrrGlsFdS3AL+1KfIBtGETibHzi3FkoTRyiDJnWNc2VxrfvR+657ROHjaNjqQ==", "dependencies": { - "@remix-run/router": "1.15.3" + "@remix-run/router": "1.16.1" }, "engines": { "node": ">=14.0.0" @@ -7774,12 +8496,12 @@ } }, "node_modules/react-router-dom": { - "version": "6.22.3", - "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.22.3.tgz", - "integrity": "sha512-7ZILI7HjcE+p31oQvwbokjk6OA/bnFxrhJ19n82Ex9Ph8fNAq+Hm/7KchpMGlTgWhUxRHMMCut+vEtNpWpowKw==", + "version": "6.23.1", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.23.1.tgz", + "integrity": "sha512-utP+K+aSTtEdbWpC+4gxhdlPFwuEfDKq8ZrPFU65bbRJY+l706qjR7yaidBpo3MSeA/fzwbXWbKBI6ftOnP3OQ==", "dependencies": { - "@remix-run/router": "1.15.3", - "react-router": "6.22.3" + "@remix-run/router": "1.16.1", + "react-router": "6.23.1" }, "engines": { "node": ">=14.0.0" @@ -7789,22 +8511,6 @@ "react-dom": ">=16.8" } }, - "node_modules/react-router-dom/node_modules/@remix-run/router": { - "version": "1.15.3", - "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.15.3.tgz", - "integrity": "sha512-Oy8rmScVrVxWZVOpEF57ovlnhpZ8CCPlnIIumVcV9nFdiSIrus99+Lw78ekXyGvVDlIsFJbSfmSovJUhCWYV3w==", - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/react-router/node_modules/@remix-run/router": { - "version": "1.15.3", - "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.15.3.tgz", - "integrity": "sha512-Oy8rmScVrVxWZVOpEF57ovlnhpZ8CCPlnIIumVcV9nFdiSIrus99+Lw78ekXyGvVDlIsFJbSfmSovJUhCWYV3w==", - "engines": { - "node": ">=14.0.0" - } - }, "node_modules/react-style-singleton": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/react-style-singleton/-/react-style-singleton-2.2.1.tgz", @@ -8009,18 +8715,39 @@ } }, "node_modules/rollup": { - "version": "3.29.4", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.29.4.tgz", - "integrity": "sha512-oWzmBZwvYrU0iJHtDmhsm662rC15FRXmcjCk1xD771dFDx5jJ02ufAQQTn0etB2emNk4J9EZg/yWKpsn9BWGRw==", + "version": "4.17.2", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.17.2.tgz", + "integrity": "sha512-/9ClTJPByC0U4zNLowV1tMBe8yMEAxewtR3cUNX5BoEpGH3dQEWpJLr6CLp0fPdYRF/fzVOgvDb1zXuakwF5kQ==", "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "@types/estree": "1.0.5" + }, "bin": { "rollup": "dist/bin/rollup" }, "engines": { - "node": ">=14.18.0", + "node": ">=18.0.0", "npm": ">=8.0.0" }, "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.17.2", + "@rollup/rollup-android-arm64": "4.17.2", + "@rollup/rollup-darwin-arm64": "4.17.2", + "@rollup/rollup-darwin-x64": "4.17.2", + "@rollup/rollup-linux-arm-gnueabihf": "4.17.2", + "@rollup/rollup-linux-arm-musleabihf": "4.17.2", + "@rollup/rollup-linux-arm64-gnu": "4.17.2", + "@rollup/rollup-linux-arm64-musl": "4.17.2", + "@rollup/rollup-linux-powerpc64le-gnu": "4.17.2", + "@rollup/rollup-linux-riscv64-gnu": "4.17.2", + "@rollup/rollup-linux-s390x-gnu": "4.17.2", + "@rollup/rollup-linux-x64-gnu": "4.17.2", + "@rollup/rollup-linux-x64-musl": "4.17.2", + "@rollup/rollup-win32-arm64-msvc": "4.17.2", + "@rollup/rollup-win32-ia32-msvc": "4.17.2", + "@rollup/rollup-win32-x64-msvc": "4.17.2", "fsevents": "~2.3.2" } }, @@ -8063,9 +8790,9 @@ "dev": true }, "node_modules/scheduler": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz", - "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==", + "version": "0.23.2", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", + "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", "dependencies": { "loose-envify": "^1.1.0" } @@ -8257,9 +8984,9 @@ } }, "node_modules/source-map-js": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", - "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", + "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==", "dev": true, "engines": { "node": ">=0.10.0" @@ -8763,6 +9490,11 @@ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" }, + "node_modules/turbo-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/turbo-stream/-/turbo-stream-2.0.1.tgz", + "integrity": "sha512-sm0ZtcX9YWh28p5X8t5McxC2uthrt9p+g0bGE0KTVFhnhNWefpSVCr+67zRNDUOfo4bpXwiOp7otO+dyQ7/y/A==" + }, "node_modules/type-is": { "version": "1.6.18", "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", @@ -8795,6 +9527,15 @@ "integrity": "sha512-o+ORpgGwaYQXgqGDwd+hkS4PuZ3QnmqMMxRuajK/a38L6fTpcE5GPIfrf+L/KemFzfUpeUQc1rRS1iDBozvnFA==", "dev": true }, + "node_modules/undici": { + "version": "6.16.1", + "resolved": "https://registry.npmjs.org/undici/-/undici-6.16.1.tgz", + "integrity": "sha512-NeNiTT7ixpeiL1qOIU/xTVpHpVP0svmI6PwoCKaMGaI5AsHOaRdwqU/f7Fi9eyU4u03nd5U/BC8wmRMnS9nqoA==", + "dev": true, + "engines": { + "node": ">=18.17" + } + }, "node_modules/undici-types": { "version": "5.26.5", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", @@ -9158,29 +9899,31 @@ } }, "node_modules/vite": { - "version": "4.5.3", - "resolved": "https://registry.npmjs.org/vite/-/vite-4.5.3.tgz", - "integrity": "sha512-kQL23kMeX92v3ph7IauVkXkikdDRsYMGTVl5KY2E9OY4ONLvkHf04MDTbnfo6NKxZiDLWzVpP5oTa8hQD8U3dg==", + "version": "5.2.11", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.2.11.tgz", + "integrity": "sha512-HndV31LWW05i1BLPMUCE1B9E9GFbOu1MbenhS58FuK6owSO5qHm7GiCotrNY1YE5rMeQSFBGmT5ZaLEjFizgiQ==", "dev": true, + "optional": true, + "peer": true, "dependencies": { - "esbuild": "^0.18.10", - "postcss": "^8.4.27", - "rollup": "^3.27.1" + "esbuild": "^0.20.1", + "postcss": "^8.4.38", + "rollup": "^4.13.0" }, "bin": { "vite": "bin/vite.js" }, "engines": { - "node": "^14.18.0 || >=16.0.0" + "node": "^18.0.0 || >=20.0.0" }, "funding": { "url": "https://github.com/vitejs/vite?sponsor=1" }, "optionalDependencies": { - "fsevents": "~2.3.2" + "fsevents": "~2.3.3" }, "peerDependencies": { - "@types/node": ">= 14", + "@types/node": "^18.0.0 || >=20.0.0", "less": "*", "lightningcss": "^1.21.0", "sass": "*", @@ -9237,16 +9980,7 @@ "url": "https://github.com/sponsors/antfu" } }, - "node_modules/vite-node/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/vite/node_modules/@esbuild/android-arm": { + "node_modules/vite-node/node_modules/@esbuild/android-arm": { "version": "0.18.20", "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.20.tgz", "integrity": "sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==", @@ -9262,7 +9996,7 @@ "node": ">=12" } }, - "node_modules/vite/node_modules/@esbuild/android-arm64": { + "node_modules/vite-node/node_modules/@esbuild/android-arm64": { "version": "0.18.20", "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.20.tgz", "integrity": "sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==", @@ -9278,7 +10012,7 @@ "node": ">=12" } }, - "node_modules/vite/node_modules/@esbuild/android-x64": { + "node_modules/vite-node/node_modules/@esbuild/android-x64": { "version": "0.18.20", "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.20.tgz", "integrity": "sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==", @@ -9294,7 +10028,7 @@ "node": ">=12" } }, - "node_modules/vite/node_modules/@esbuild/darwin-arm64": { + "node_modules/vite-node/node_modules/@esbuild/darwin-arm64": { "version": "0.18.20", "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.20.tgz", "integrity": "sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==", @@ -9310,7 +10044,7 @@ "node": ">=12" } }, - "node_modules/vite/node_modules/@esbuild/darwin-x64": { + "node_modules/vite-node/node_modules/@esbuild/darwin-x64": { "version": "0.18.20", "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.20.tgz", "integrity": "sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==", @@ -9326,7 +10060,7 @@ "node": ">=12" } }, - "node_modules/vite/node_modules/@esbuild/freebsd-arm64": { + "node_modules/vite-node/node_modules/@esbuild/freebsd-arm64": { "version": "0.18.20", "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.20.tgz", "integrity": "sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==", @@ -9342,7 +10076,7 @@ "node": ">=12" } }, - "node_modules/vite/node_modules/@esbuild/freebsd-x64": { + "node_modules/vite-node/node_modules/@esbuild/freebsd-x64": { "version": "0.18.20", "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.20.tgz", "integrity": "sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==", @@ -9358,7 +10092,7 @@ "node": ">=12" } }, - "node_modules/vite/node_modules/@esbuild/linux-arm": { + "node_modules/vite-node/node_modules/@esbuild/linux-arm": { "version": "0.18.20", "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.20.tgz", "integrity": "sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==", @@ -9374,7 +10108,7 @@ "node": ">=12" } }, - "node_modules/vite/node_modules/@esbuild/linux-arm64": { + "node_modules/vite-node/node_modules/@esbuild/linux-arm64": { "version": "0.18.20", "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.20.tgz", "integrity": "sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==", @@ -9390,7 +10124,7 @@ "node": ">=12" } }, - "node_modules/vite/node_modules/@esbuild/linux-ia32": { + "node_modules/vite-node/node_modules/@esbuild/linux-ia32": { "version": "0.18.20", "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.20.tgz", "integrity": "sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==", @@ -9406,7 +10140,7 @@ "node": ">=12" } }, - "node_modules/vite/node_modules/@esbuild/linux-loong64": { + "node_modules/vite-node/node_modules/@esbuild/linux-loong64": { "version": "0.18.20", "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.20.tgz", "integrity": "sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==", @@ -9422,7 +10156,7 @@ "node": ">=12" } }, - "node_modules/vite/node_modules/@esbuild/linux-mips64el": { + "node_modules/vite-node/node_modules/@esbuild/linux-mips64el": { "version": "0.18.20", "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.20.tgz", "integrity": "sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==", @@ -9438,7 +10172,7 @@ "node": ">=12" } }, - "node_modules/vite/node_modules/@esbuild/linux-ppc64": { + "node_modules/vite-node/node_modules/@esbuild/linux-ppc64": { "version": "0.18.20", "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.20.tgz", "integrity": "sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==", @@ -9454,7 +10188,7 @@ "node": ">=12" } }, - "node_modules/vite/node_modules/@esbuild/linux-riscv64": { + "node_modules/vite-node/node_modules/@esbuild/linux-riscv64": { "version": "0.18.20", "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.20.tgz", "integrity": "sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==", @@ -9470,7 +10204,7 @@ "node": ">=12" } }, - "node_modules/vite/node_modules/@esbuild/linux-s390x": { + "node_modules/vite-node/node_modules/@esbuild/linux-s390x": { "version": "0.18.20", "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.20.tgz", "integrity": "sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==", @@ -9486,7 +10220,7 @@ "node": ">=12" } }, - "node_modules/vite/node_modules/@esbuild/linux-x64": { + "node_modules/vite-node/node_modules/@esbuild/linux-x64": { "version": "0.18.20", "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.20.tgz", "integrity": "sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==", @@ -9502,7 +10236,7 @@ "node": ">=12" } }, - "node_modules/vite/node_modules/@esbuild/netbsd-x64": { + "node_modules/vite-node/node_modules/@esbuild/netbsd-x64": { "version": "0.18.20", "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.20.tgz", "integrity": "sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==", @@ -9518,7 +10252,7 @@ "node": ">=12" } }, - "node_modules/vite/node_modules/@esbuild/openbsd-x64": { + "node_modules/vite-node/node_modules/@esbuild/openbsd-x64": { "version": "0.18.20", "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.20.tgz", "integrity": "sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==", @@ -9534,7 +10268,7 @@ "node": ">=12" } }, - "node_modules/vite/node_modules/@esbuild/sunos-x64": { + "node_modules/vite-node/node_modules/@esbuild/sunos-x64": { "version": "0.18.20", "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.20.tgz", "integrity": "sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==", @@ -9550,7 +10284,7 @@ "node": ">=12" } }, - "node_modules/vite/node_modules/@esbuild/win32-arm64": { + "node_modules/vite-node/node_modules/@esbuild/win32-arm64": { "version": "0.18.20", "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.20.tgz", "integrity": "sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==", @@ -9566,7 +10300,7 @@ "node": ">=12" } }, - "node_modules/vite/node_modules/@esbuild/win32-ia32": { + "node_modules/vite-node/node_modules/@esbuild/win32-ia32": { "version": "0.18.20", "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.20.tgz", "integrity": "sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==", @@ -9582,7 +10316,7 @@ "node": ">=12" } }, - "node_modules/vite/node_modules/@esbuild/win32-x64": { + "node_modules/vite-node/node_modules/@esbuild/win32-x64": { "version": "0.18.20", "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz", "integrity": "sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==", @@ -9598,7 +10332,7 @@ "node": ">=12" } }, - "node_modules/vite/node_modules/esbuild": { + "node_modules/vite-node/node_modules/esbuild": { "version": "0.18.20", "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.20.tgz", "integrity": "sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==", @@ -9635,6 +10369,500 @@ "@esbuild/win32-x64": "0.18.20" } }, + "node_modules/vite-node/node_modules/rollup": { + "version": "3.29.4", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.29.4.tgz", + "integrity": "sha512-oWzmBZwvYrU0iJHtDmhsm662rC15FRXmcjCk1xD771dFDx5jJ02ufAQQTn0etB2emNk4J9EZg/yWKpsn9BWGRw==", + "dev": true, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=14.18.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/vite-node/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/vite-node/node_modules/vite": { + "version": "4.5.3", + "resolved": "https://registry.npmjs.org/vite/-/vite-4.5.3.tgz", + "integrity": "sha512-kQL23kMeX92v3ph7IauVkXkikdDRsYMGTVl5KY2E9OY4ONLvkHf04MDTbnfo6NKxZiDLWzVpP5oTa8hQD8U3dg==", + "dev": true, + "dependencies": { + "esbuild": "^0.18.10", + "postcss": "^8.4.27", + "rollup": "^3.27.1" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + }, + "peerDependencies": { + "@types/node": ">= 14", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } + } + }, + "node_modules/vite/node_modules/@esbuild/android-arm": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.20.2.tgz", + "integrity": "sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "peer": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/android-arm64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.20.2.tgz", + "integrity": "sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "peer": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/android-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.20.2.tgz", + "integrity": "sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "peer": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/darwin-arm64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.20.2.tgz", + "integrity": "sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "peer": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/darwin-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.20.2.tgz", + "integrity": "sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "peer": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/freebsd-arm64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.20.2.tgz", + "integrity": "sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "peer": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/freebsd-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.20.2.tgz", + "integrity": "sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "peer": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-arm": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.20.2.tgz", + "integrity": "sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-arm64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.20.2.tgz", + "integrity": "sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-ia32": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.20.2.tgz", + "integrity": "sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-loong64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.20.2.tgz", + "integrity": "sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-mips64el": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.20.2.tgz", + "integrity": "sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-ppc64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.20.2.tgz", + "integrity": "sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-riscv64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.20.2.tgz", + "integrity": "sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-s390x": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.20.2.tgz", + "integrity": "sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.20.2.tgz", + "integrity": "sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/netbsd-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.20.2.tgz", + "integrity": "sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "peer": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/openbsd-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.20.2.tgz", + "integrity": "sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "peer": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/sunos-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.20.2.tgz", + "integrity": "sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "peer": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/win32-arm64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.20.2.tgz", + "integrity": "sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "peer": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/win32-ia32": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.20.2.tgz", + "integrity": "sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "peer": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/win32-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.20.2.tgz", + "integrity": "sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "peer": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/esbuild": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.20.2.tgz", + "integrity": "sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "peer": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.20.2", + "@esbuild/android-arm": "0.20.2", + "@esbuild/android-arm64": "0.20.2", + "@esbuild/android-x64": "0.20.2", + "@esbuild/darwin-arm64": "0.20.2", + "@esbuild/darwin-x64": "0.20.2", + "@esbuild/freebsd-arm64": "0.20.2", + "@esbuild/freebsd-x64": "0.20.2", + "@esbuild/linux-arm": "0.20.2", + "@esbuild/linux-arm64": "0.20.2", + "@esbuild/linux-ia32": "0.20.2", + "@esbuild/linux-loong64": "0.20.2", + "@esbuild/linux-mips64el": "0.20.2", + "@esbuild/linux-ppc64": "0.20.2", + "@esbuild/linux-riscv64": "0.20.2", + "@esbuild/linux-s390x": "0.20.2", + "@esbuild/linux-x64": "0.20.2", + "@esbuild/netbsd-x64": "0.20.2", + "@esbuild/openbsd-x64": "0.20.2", + "@esbuild/sunos-x64": "0.20.2", + "@esbuild/win32-arm64": "0.20.2", + "@esbuild/win32-ia32": "0.20.2", + "@esbuild/win32-x64": "0.20.2" + } + }, "node_modules/wcwidth": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", @@ -9681,16 +10909,16 @@ } }, "node_modules/which-typed-array": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.14.tgz", - "integrity": "sha512-VnXFiIW8yNn9kIHN88xvZ4yOWchftKDsRJ8fEPacX/wl1lOvBrhsJ/OeJCXq7B0AaijRuqgzSKalJoPk+D8MPg==", + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.15.tgz", + "integrity": "sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==", "dev": true, "dependencies": { - "available-typed-arrays": "^1.0.6", - "call-bind": "^1.0.5", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", "for-each": "^0.3.3", "gopd": "^1.0.1", - "has-tostringtag": "^1.0.1" + "has-tostringtag": "^1.0.2" }, "engines": { "node": ">= 0.4" diff --git a/package.json b/package.json index fc212e6..ac6ef36 100644 --- a/package.json +++ b/package.json @@ -12,27 +12,27 @@ "@chakra-ui/react": "^2.8.2", "@emotion/react": "^11.11.4", "@emotion/styled": "^11.11.5", - "@fontsource/plus-jakarta-sans": "^5.0.19", - "@remix-run/cloudflare": "^2.8.1", - "@remix-run/cloudflare-pages": "^2.8.1", - "@remix-run/react": "^2.8.1", - "@sentry/react": "^7.110.1", + "@fontsource/plus-jakarta-sans": "^5.0.20", + "@remix-run/cloudflare": "^2.9.2", + "@remix-run/cloudflare-pages": "^2.9.2", + "@remix-run/react": "^2.9.2", + "@sentry/react": "^7.114.0", "aws4fetch": "^1.0.18", - "framer-motion": "^11.0.28", - "react": "^18.2.0", - "react-dom": "^18.2.0" + "framer-motion": "^11.1.9", + "react": "^18.3.1", + "react-dom": "^18.3.1" }, "devDependencies": { - "@remix-run/dev": "^2.8.1", - "@types/node": "^20.12.7", - "@types/react": "^18.2.78", - "@types/react-dom": "^18.2.25", + "@remix-run/dev": "^2.9.2", + "@types/node": "^20.12.11", + "@types/react": "^18.3.2", + "@types/react-dom": "^18.3.0", "dotenv": "^16.4.5", "prettier": "^3.2.5", "typescript": "^5.4.5" }, "overrides": { - "@cloudflare/workers-types": "^4.20240405.0" + "@cloudflare/workers-types": "^4.20240502.0" }, "prettier": { "endOfLine": "auto"