From d34ad1d07f3126f9dce06b0379bee13fb6b3dec8 Mon Sep 17 00:00:00 2001 From: Abrar74774 Date: Sat, 15 Nov 2025 23:34:26 +0300 Subject: [PATCH 01/31] docs: remove underlines between bandges in README.md --- README.md | 32 ++++++++------------------------ 1 file changed, 8 insertions(+), 24 deletions(-) diff --git a/README.md b/README.md index 08648c0a..dcc6865f 100644 --- a/README.md +++ b/README.md @@ -9,18 +9,10 @@

- - GitHub Release - - - MIT License - - - Build Status - - - Umami Demo - + GitHub Release + MIT License + Build Status + Umami Demo

--- @@ -119,18 +111,10 @@ docker compose up --force-recreate -d ## 🛟 Support

- - GitHub - - - Twitter - - - LinkedIn - - - Discord - + GitHub + Twitter + LinkedIn + Discord

[release-shield]: https://img.shields.io/github/release/umami-software/umami.svg From e6586c60b19e46f4f397841382f049389406e12e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 17 Nov 2025 18:44:11 +0000 Subject: [PATCH 02/31] Bump js-yaml from 3.14.1 to 3.14.2 Bumps [js-yaml](https://github.com/nodeca/js-yaml) from 3.14.1 to 3.14.2. - [Changelog](https://github.com/nodeca/js-yaml/blob/master/CHANGELOG.md) - [Commits](https://github.com/nodeca/js-yaml/compare/3.14.1...3.14.2) --- updated-dependencies: - dependency-name: js-yaml dependency-version: 3.14.2 dependency-type: indirect ... Signed-off-by: dependabot[bot] --- pnpm-lock.yaml | 2 -- 1 file changed, 2 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 5ca04cd9..86b5e4c6 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -364,8 +364,6 @@ importers: specifier: ^5.9.3 version: 5.9.3 - dist: {} - packages: '@ampproject/remapping@2.3.0': From f5b5f159ecd24a440125212444e96d05e7860719 Mon Sep 17 00:00:00 2001 From: Arthur Sepiol Date: Fri, 28 Nov 2025 02:17:16 +0300 Subject: [PATCH 03/31] fix: skip realtime chart animation when data unchanged --- src/components/metrics/RealtimeChart.tsx | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/src/components/metrics/RealtimeChart.tsx b/src/components/metrics/RealtimeChart.tsx index a71c03c3..ea4046d4 100644 --- a/src/components/metrics/RealtimeChart.tsx +++ b/src/components/metrics/RealtimeChart.tsx @@ -16,6 +16,7 @@ export function RealtimeChart({ data, unit, ...props }: RealtimeChartProps) { const endDate = startOfMinute(new Date()); const startDate = subMinutes(endDate, REALTIME_RANGE); const prevEndDate = useRef(endDate); + const prevData = useRef(null); const chartData = useMemo(() => { if (!data) { @@ -28,14 +29,22 @@ export function RealtimeChart({ data, unit, ...props }: RealtimeChartProps) { }; }, [data, startDate, endDate, unit]); - // Don't animate the bars shifting over because it looks weird const animationDuration = useMemo(() => { + // Don't animate the bars shifting over because it looks weird if (isBefore(prevEndDate.current, endDate)) { prevEndDate.current = endDate; return 0; } + + // Don't animate when data hasn't changed + const serialized = JSON.stringify(chartData); + if (prevData.current === serialized) { + return 0; + } + prevData.current = serialized; + return DEFAULT_ANIMATION_DURATION; - }, [endDate]); + }, [endDate, chartData]); return ( Date: Fri, 28 Nov 2025 06:10:19 +0000 Subject: [PATCH 04/31] Issue#3802 - Team to user switch fixed --- src/app/page.tsx | 8 +++----- src/components/input/NavButton.tsx | 2 +- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/src/app/page.tsx b/src/app/page.tsx index 8bf748f9..06998956 100644 --- a/src/app/page.tsx +++ b/src/app/page.tsx @@ -1,7 +1,7 @@ 'use client'; import { useEffect } from 'react'; import { redirect } from 'next/navigation'; -import { getItem, removeItem } from '@/lib/storage'; +import { getItem } from '@/lib/storage'; import { LAST_TEAM_CONFIG } from '@/lib/constants'; export default function RootPage() { @@ -10,11 +10,9 @@ export default function RootPage() { if (lastTeam) { redirect(`/teams/${lastTeam}/websites`); - } else { - removeItem(LAST_TEAM_CONFIG); - - redirect(`/websites`); } + + redirect(`/websites`); }, []); return null; diff --git a/src/components/input/NavButton.tsx b/src/components/input/NavButton.tsx index b57c2ecd..44496e22 100644 --- a/src/components/input/NavButton.tsx +++ b/src/components/input/NavButton.tsx @@ -93,7 +93,7 @@ export function NavButton({ showText = true }: TeamsButtonProps) { - + } label={user.username} /> From 50bfee33284e716a888298078a03ca3f656c2bbd Mon Sep 17 00:00:00 2001 From: Syed Abdullah <2syedabdullah@gmail.com> Date: Fri, 28 Nov 2025 06:30:22 +0000 Subject: [PATCH 05/31] Moved the redirect to else statement --- src/app/page.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/app/page.tsx b/src/app/page.tsx index 06998956..22f6bc84 100644 --- a/src/app/page.tsx +++ b/src/app/page.tsx @@ -10,9 +10,9 @@ export default function RootPage() { if (lastTeam) { redirect(`/teams/${lastTeam}/websites`); + } else { + redirect(`/websites`); } - - redirect(`/websites`); }, []); return null; From 776e404c6f3423ffe9df115e331159c1d64d237d Mon Sep 17 00:00:00 2001 From: Prince EKPINSE Date: Sat, 29 Nov 2025 12:40:22 +0100 Subject: [PATCH 06/31] fix: [#3778] update 'Edit' word to support translation --- src/app/(main)/websites/[websiteId]/WebsiteHeader.tsx | 4 +++- src/lang/ar-SA.json | 1 + src/lang/be-BY.json | 1 + src/lang/bg-BG.json | 1 + src/lang/bn-BD.json | 1 + src/lang/bs-BA.json | 1 + src/lang/ca-ES.json | 1 + src/lang/cs-CZ.json | 1 + src/lang/da-DK.json | 1 + src/lang/de-CH.json | 1 + src/lang/de-DE.json | 1 + src/lang/el-GR.json | 1 + src/lang/en-GB.json | 1 + src/lang/en-US.json | 1 + src/lang/es-ES.json | 1 + src/lang/fa-IR.json | 1 + src/lang/fi-FI.json | 1 + src/lang/fo-FO.json | 1 + src/lang/fr-FR.json | 11 +++++++---- src/lang/ga-ES.json | 1 + src/lang/he-IL.json | 1 + src/lang/hi-IN.json | 1 + src/lang/hr-HR.json | 1 + src/lang/hu-HU.json | 1 + src/lang/id-ID.json | 1 + src/lang/it-IT.json | 1 + src/lang/ja-JP.json | 1 + src/lang/km-KH.json | 1 + src/lang/ko-KR.json | 1 + src/lang/lt-LT.json | 1 + src/lang/mn-MN.json | 1 + src/lang/ms-MY.json | 1 + src/lang/my-MM.json | 1 + src/lang/nb-NO.json | 1 + src/lang/nl-NL.json | 1 + src/lang/pl-PL.json | 1 + src/lang/pt-BR.json | 1 + src/lang/pt-PT.json | 1 + src/lang/ro-RO.json | 1 + src/lang/ru-RU.json | 1 + src/lang/si-LK.json | 1 + src/lang/sk-SK.json | 1 + src/lang/sl-SI.json | 1 + src/lang/sv-SE.json | 1 + src/lang/ta-IN.json | 1 + src/lang/th-TH.json | 1 + src/lang/tr-TR.json | 1 + src/lang/uk-UA.json | 1 + src/lang/ur-PK.json | 1 + src/lang/uz-UZ.json | 1 + src/lang/vi-VN.json | 1 + src/lang/zh-CN.json | 1 + src/lang/zh-TW.json | 1 + 53 files changed, 61 insertions(+), 5 deletions(-) diff --git a/src/app/(main)/websites/[websiteId]/WebsiteHeader.tsx b/src/app/(main)/websites/[websiteId]/WebsiteHeader.tsx index 73eb96b2..28187f00 100644 --- a/src/app/(main)/websites/[websiteId]/WebsiteHeader.tsx +++ b/src/app/(main)/websites/[websiteId]/WebsiteHeader.tsx @@ -13,6 +13,8 @@ export function WebsiteHeader({ showActions }: { showActions?: boolean }) { const { renderUrl, pathname } = useNavigation(); const isSettings = pathname.endsWith('/settings'); + const { formatMessage, labels } = useMessages(); + if (isSettings) { return null; } @@ -29,7 +31,7 @@ export function WebsiteHeader({ showActions }: { showActions?: boolean }) { - Edit + {formatMessage(labels.edit)} )} diff --git a/src/lang/ar-SA.json b/src/lang/ar-SA.json index 6a60dd53..5b5cfa9f 100644 --- a/src/lang/ar-SA.json +++ b/src/lang/ar-SA.json @@ -289,6 +289,7 @@ "label.websites": "المواقع", "label.window": "النافذة", "label.yesterday": "الأمس", + "label.behavior": "السلوك", "message.action-confirmation": "اكتب {confirmation} في المربع أدناه للتأكيد.", "message.active-users": "{x} حاليا {x, plural, one {زائر واحد} other {زوار}}", "message.bad-request": "Bad request", diff --git a/src/lang/be-BY.json b/src/lang/be-BY.json index 932ea557..1a866a92 100644 --- a/src/lang/be-BY.json +++ b/src/lang/be-BY.json @@ -20,6 +20,7 @@ "label.average": "Сярэдняе", "label.back": "Назад", "label.before": "Да", + "label.behavior": "Паводзіны", "label.boards": "Дошкі", "label.bounce-rate": "Паказчык адмоваў", "label.breakdown": "Разбіўка", diff --git a/src/lang/bg-BG.json b/src/lang/bg-BG.json index 0487498d..4b0effc8 100644 --- a/src/lang/bg-BG.json +++ b/src/lang/bg-BG.json @@ -20,6 +20,7 @@ "label.average": "Средно", "label.back": "Назад", "label.before": "Преди", + "label.behavior": "Поведение", "label.boards": "Дъски", "label.bounce-rate": "Kоефициент на отказ", "label.breakdown": "Разбивка", diff --git a/src/lang/bn-BD.json b/src/lang/bn-BD.json index 0260558b..9b9ad2f4 100644 --- a/src/lang/bn-BD.json +++ b/src/lang/bn-BD.json @@ -20,6 +20,7 @@ "label.average": "গড়", "label.back": "পেছনে", "label.before": "পূর্বে", + "label.behavior": "আচরণ", "label.boards": "বোর্ডসমূহ", "label.bounce-rate": "উপরে উঠার হার", "label.breakdown": "ভাঙ্গন", diff --git a/src/lang/bs-BA.json b/src/lang/bs-BA.json index 72d635d4..56848771 100644 --- a/src/lang/bs-BA.json +++ b/src/lang/bs-BA.json @@ -20,6 +20,7 @@ "label.average": "Prosjek", "label.back": "Nazad", "label.before": "Prije", + "label.behavior": "Ponašanje", "label.boards": "Ploče", "label.bounce-rate": "Stopa napuštanja", "label.breakdown": "Pregled po kategorijama", diff --git a/src/lang/ca-ES.json b/src/lang/ca-ES.json index 7ff46555..ab5444ce 100644 --- a/src/lang/ca-ES.json +++ b/src/lang/ca-ES.json @@ -20,6 +20,7 @@ "label.average": "Mitjana", "label.back": "Enrere", "label.before": "Abans", + "label.behavior": "Comportament", "label.boards": "Taulers", "label.bounce-rate": "Percentatge de rebot", "label.breakdown": "Desglossament", diff --git a/src/lang/cs-CZ.json b/src/lang/cs-CZ.json index a4dbc865..77d45a79 100644 --- a/src/lang/cs-CZ.json +++ b/src/lang/cs-CZ.json @@ -20,6 +20,7 @@ "label.average": "Průměr", "label.back": "Zpět", "label.before": "Před", + "label.behavior": "Chování", "label.boards": "Nástěnky", "label.bounce-rate": "Okamžité opuštění", "label.breakdown": "Rozpis", diff --git a/src/lang/da-DK.json b/src/lang/da-DK.json index 0078bcd3..f6c447ff 100644 --- a/src/lang/da-DK.json +++ b/src/lang/da-DK.json @@ -20,6 +20,7 @@ "label.average": "Gennemsnit", "label.back": "Tilbage", "label.before": "Før", + "label.behavior": "Adfærd", "label.boards": "Tavler", "label.bounce-rate": "Afvisningsprocent", "label.breakdown": "Opdeling", diff --git a/src/lang/de-CH.json b/src/lang/de-CH.json index a770949a..55734ebd 100644 --- a/src/lang/de-CH.json +++ b/src/lang/de-CH.json @@ -20,6 +20,7 @@ "label.average": "Durchschnitt", "label.back": "Zrugg", "label.before": "Vor", + "label.behavior": "Verhalte", "label.boards": "Boards", "label.bounce-rate": "Absprungsrate", "label.breakdown": "Uufschlüsselig", diff --git a/src/lang/de-DE.json b/src/lang/de-DE.json index 9bbedbf9..3436eb89 100644 --- a/src/lang/de-DE.json +++ b/src/lang/de-DE.json @@ -20,6 +20,7 @@ "label.average": "Durchschnitt", "label.back": "Zurück", "label.before": "Vor", + "label.behavior": "Verhalten", "label.boards": "Boards", "label.bounce-rate": "Absprungrate", "label.breakdown": "Aufschlüsselung", diff --git a/src/lang/el-GR.json b/src/lang/el-GR.json index df44a29d..720ff5ea 100644 --- a/src/lang/el-GR.json +++ b/src/lang/el-GR.json @@ -23,6 +23,7 @@ "label.boards": "Boards", "label.bounce-rate": "Ποσοστό αναπήδησης", "label.breakdown": "Breakdown", + "label.behavior": "Συμπεριφορά", "label.browser": "Browser", "label.browsers": "Προγράμματα περιήγησης", "label.campaigns": "Campaigns", diff --git a/src/lang/en-GB.json b/src/lang/en-GB.json index d2291495..7803dd68 100644 --- a/src/lang/en-GB.json +++ b/src/lang/en-GB.json @@ -20,6 +20,7 @@ "label.average": "Average", "label.back": "Back", "label.before": "Before", + "label.behavior": "Behavior", "label.boards": "Boards", "label.bounce-rate": "Bounce rate", "label.breakdown": "Breakdown", diff --git a/src/lang/en-US.json b/src/lang/en-US.json index 60627cca..3e588f50 100644 --- a/src/lang/en-US.json +++ b/src/lang/en-US.json @@ -289,6 +289,7 @@ "label.websites": "Websites", "label.window": "Window", "label.yesterday": "Yesterday", + "label.behavior": "Behavior", "message.action-confirmation": "Type {confirmation} in the box below to confirm.", "message.active-users": "{x} current {x, plural, one {visitor} other {visitors}}", "message.bad-request": "Bad request", diff --git a/src/lang/es-ES.json b/src/lang/es-ES.json index 3e74ed35..e3a4d38d 100644 --- a/src/lang/es-ES.json +++ b/src/lang/es-ES.json @@ -290,6 +290,7 @@ "label.websites": "Sitios web", "label.window": "Ventana", "label.yesterday": "Ayer", + "label.behavior": "Comportamiento", "message.action-confirmation": "Escriba {confirmation} en el cuadro a continuación para confirmar.", "message.active-users": "{x} {x, plural, one {activo} other {activos}}", "message.bad-request": "Bad request", diff --git a/src/lang/fa-IR.json b/src/lang/fa-IR.json index 4e912fce..96b3da9b 100644 --- a/src/lang/fa-IR.json +++ b/src/lang/fa-IR.json @@ -20,6 +20,7 @@ "label.average": "میانگین", "label.back": "بازگشت", "label.before": "قبل از", + "label.behavior": "رفتار", "label.boards": "بردها", "label.bounce-rate": "نرخ ریزش", "label.breakdown": "تفکیک", diff --git a/src/lang/fi-FI.json b/src/lang/fi-FI.json index 06f66d6c..daaa62f0 100644 --- a/src/lang/fi-FI.json +++ b/src/lang/fi-FI.json @@ -289,6 +289,7 @@ "label.websites": "Verkkosivut", "label.window": "Window", "label.yesterday": "Yesterday", + "label.behavior": "Behavior", "message.action-confirmation": "Type {confirmation} in the box below to confirm.", "message.active-users": "{x} {x, plural, one {vierailija} other {vierailijaa}}", "message.bad-request": "Bad request", diff --git a/src/lang/fo-FO.json b/src/lang/fo-FO.json index e811ab5e..6fca4258 100644 --- a/src/lang/fo-FO.json +++ b/src/lang/fo-FO.json @@ -20,6 +20,7 @@ "label.average": "Miðal", "label.back": "Aftur", "label.before": "Áðrenn", + "label.behavior": "Atferð", "label.boards": "Borð", "label.bounce-rate": "Bounce prosenttal", "label.breakdown": "Sundurgreining", diff --git a/src/lang/fr-FR.json b/src/lang/fr-FR.json index 517633af..cd6a96bc 100644 --- a/src/lang/fr-FR.json +++ b/src/lang/fr-FR.json @@ -289,6 +289,9 @@ "label.websites": "Sites", "label.window": "Fenêtre", "label.yesterday": "Hier", + "label.behavior": "Comportement", + "label.traffic": "Trafic", + "label.segments": "Segments", "message.action-confirmation": "Taper {confirmation} ci-dessous pour confirmer.", "message.active-users": "{x} {x, plural, one {visiteur} other {visiteurs}} actuellement", "message.bad-request": "Bad request", @@ -315,13 +318,13 @@ "message.no-teams": "Vous n'avez pas créé d'équipe.", "message.no-users": "Aucun utilisateur.", "message.no-websites-configured": "Vous n'avez pas configuré de site.", - "message.not-found": "Not found", - "message.nothing-selected": "Nothing selected.", + "message.not-found": "Non trouvé!", + "message.nothing-selected": "Rien n'est sélectionné.", "message.page-not-found": "Page non trouvée.", "message.reset-website": "Pour réinitialiser ce site, taper {confirmation} ci-dessous pour confirmer.", "message.reset-website-warning": "Toutes les statistiques pour ce site seront supprimées, mais votre code de suivi restera intact.", "message.saved": "Enregistré.", - "message.sever-error": "Server error", + "message.sever-error": "Erreur serveur", "message.share-url": "Les statistiques de votre site sont accessibles publiquement sur cette URL :", "message.team-already-member": "Vous êtes déjà membre de cette équipe.", "message.team-not-found": "Équipe non trouvée.", @@ -331,7 +334,7 @@ "message.transfer-user-website-to-team": "Choisir l'équipe à laquelle transférer ce site.", "message.transfer-website": "Transférer la propriété du site sur votre compte ou à une autre équipe.", "message.triggered-event": "Évènement déclenché", - "message.unauthorized": "Unauthorized", + "message.unauthorized": "Non authorisé!", "message.user-deleted": "Utilisateur supprimé.", "message.viewed-page": "Page vue", "message.visitor-log": "Visiteur de {country} utilisant {browser} sur {os} {device}" diff --git a/src/lang/ga-ES.json b/src/lang/ga-ES.json index bce46d3b..20826005 100644 --- a/src/lang/ga-ES.json +++ b/src/lang/ga-ES.json @@ -289,6 +289,7 @@ "label.websites": "Sitios web", "label.window": "Ventá", "label.yesterday": "Onte", + "label.behavior": "Comportamento", "message.action-confirmation": "Escribe {confirmation} na caixa de embaixo para confirmar.", "message.active-users": "{x} actual {x, plural, one {visitante} other {visitantes}}", "message.bad-request": "Bad request", diff --git a/src/lang/he-IL.json b/src/lang/he-IL.json index 2345dc44..2d115c8d 100644 --- a/src/lang/he-IL.json +++ b/src/lang/he-IL.json @@ -278,6 +278,7 @@ "label.value": "Value", "label.view": "View", "label.view-details": "פרטים נוספים", + "label.behavior": "התנהגות", "label.view-only": "View only", "label.views": "צפיות", "label.views-per-visit": "Views per visit", diff --git a/src/lang/hi-IN.json b/src/lang/hi-IN.json index 513d6742..54cac301 100644 --- a/src/lang/hi-IN.json +++ b/src/lang/hi-IN.json @@ -20,6 +20,7 @@ "label.average": "औसत", "label.back": "पीछे", "label.before": "पहले", + "label.behavior": "व्यवहार", "label.boards": "बोर्ड्स", "label.bounce-rate": "उछाल दर", "label.breakdown": "विभाजन", diff --git a/src/lang/hr-HR.json b/src/lang/hr-HR.json index c587e92e..141ad3fd 100644 --- a/src/lang/hr-HR.json +++ b/src/lang/hr-HR.json @@ -20,6 +20,7 @@ "label.average": "Prosjek", "label.back": "Natrag ", "label.before": "Prije", + "label.behavior": "Ponašanje", "label.boards": "Ploče", "label.bounce-rate": "Stopa napuštanja", "label.breakdown": "Raspad", diff --git a/src/lang/hu-HU.json b/src/lang/hu-HU.json index 67bafa61..1666b7a1 100644 --- a/src/lang/hu-HU.json +++ b/src/lang/hu-HU.json @@ -20,6 +20,7 @@ "label.average": "Átlag", "label.back": "Vissza", "label.before": "Előtt", + "label.behavior": "Viselkedés", "label.boards": "Táblák", "label.bounce-rate": "Visszafordulási arány", "label.breakdown": "Bontás", diff --git a/src/lang/id-ID.json b/src/lang/id-ID.json index e7a26470..30a64b6c 100644 --- a/src/lang/id-ID.json +++ b/src/lang/id-ID.json @@ -20,6 +20,7 @@ "label.average": "Rata-rata", "label.back": "Kembali", "label.before": "Sebelum", + "label.behavior": "Perilaku", "label.boards": "Papan", "label.bounce-rate": "Rasio pentalan", "label.breakdown": "Rincian", diff --git a/src/lang/it-IT.json b/src/lang/it-IT.json index 019b4de5..40cb5ecd 100644 --- a/src/lang/it-IT.json +++ b/src/lang/it-IT.json @@ -20,6 +20,7 @@ "label.average": "Media", "label.back": "Indietro", "label.before": "Prima", + "label.behavior": "Comportamento", "label.boards": "Bacheche", "label.bounce-rate": "Frequenza di rimbalzo", "label.breakdown": "Dettaglio", diff --git a/src/lang/ja-JP.json b/src/lang/ja-JP.json index 2c6cc2f9..7d2bf403 100644 --- a/src/lang/ja-JP.json +++ b/src/lang/ja-JP.json @@ -20,6 +20,7 @@ "label.average": "平均", "label.back": "戻る", "label.before": "直前", + "label.behavior": "行動", "label.boards": "ボード", "label.bounce-rate": "直帰率", "label.breakdown": "故障", diff --git a/src/lang/km-KH.json b/src/lang/km-KH.json index bae63986..087e24dc 100644 --- a/src/lang/km-KH.json +++ b/src/lang/km-KH.json @@ -20,6 +20,7 @@ "label.average": "ជាមធ្យម", "label.back": "ថយក្រោយ", "label.before": "មុន", + "label.behavior": "អាកប្បកិរិយា", "label.boards": "ក្តារ", "label.bounce-rate": "ចំនួនវិលត្រឡប់", "label.breakdown": "បំបែកលម្អិត", diff --git a/src/lang/ko-KR.json b/src/lang/ko-KR.json index 5826b1a4..977eea4e 100644 --- a/src/lang/ko-KR.json +++ b/src/lang/ko-KR.json @@ -20,6 +20,7 @@ "label.average": "평균", "label.back": "뒤로", "label.before": "이전", + "label.behavior": "행동", "label.boards": "보드", "label.bounce-rate": "이탈률", "label.breakdown": "세부 사항", diff --git a/src/lang/lt-LT.json b/src/lang/lt-LT.json index 2fc89c2c..772fa34e 100644 --- a/src/lang/lt-LT.json +++ b/src/lang/lt-LT.json @@ -20,6 +20,7 @@ "label.average": "Vidurkis", "label.back": "Atgal", "label.before": "Prieš", + "label.behavior": "Elgsena", "label.boards": "Lentos", "label.bounce-rate": "Atmetimo rodiklis", "label.breakdown": "Išskaidymas", diff --git a/src/lang/mn-MN.json b/src/lang/mn-MN.json index 22e37bc4..e9c649db 100644 --- a/src/lang/mn-MN.json +++ b/src/lang/mn-MN.json @@ -20,6 +20,7 @@ "label.average": "Дундаж", "label.back": "Буцах", "label.before": "Өмнө", + "label.behavior": "Зан төлөв", "label.boards": "Самбарууд", "label.bounce-rate": "Нэг хуудас үзээд гарсан", "label.breakdown": "Задаргаа", diff --git a/src/lang/ms-MY.json b/src/lang/ms-MY.json index eb5976bd..32abd085 100644 --- a/src/lang/ms-MY.json +++ b/src/lang/ms-MY.json @@ -20,6 +20,7 @@ "label.average": "Average", "label.back": "Kembali", "label.before": "Before", + "label.behavior": "Behavior", "label.boards": "Boards", "label.bounce-rate": "Kadar lantunan", "label.breakdown": "Breakdown", diff --git a/src/lang/my-MM.json b/src/lang/my-MM.json index 77f8e040..156b0c26 100644 --- a/src/lang/my-MM.json +++ b/src/lang/my-MM.json @@ -20,6 +20,7 @@ "label.average": "ပျမ်းမျှ", "label.back": "နောက်သို့", "label.before": "မတိုင်မီ", + "label.behavior": "အပြုအမူ", "label.boards": "Boards", "label.bounce-rate": "Bounce နှုန်း", "label.breakdown": "ခွဲခြမ်းစိတ်ဖြာမှု", diff --git a/src/lang/nb-NO.json b/src/lang/nb-NO.json index fc422256..adb4468e 100644 --- a/src/lang/nb-NO.json +++ b/src/lang/nb-NO.json @@ -20,6 +20,7 @@ "label.average": "Gjennomsnnitt", "label.back": "Tilbake", "label.before": "Før", + "label.behavior": "Atferd", "label.boards": "Tavler", "label.bounce-rate": "Avvisningsfrekvens", "label.breakdown": "Nedbrytning", diff --git a/src/lang/nl-NL.json b/src/lang/nl-NL.json index e48fa89e..1ec5c020 100644 --- a/src/lang/nl-NL.json +++ b/src/lang/nl-NL.json @@ -20,6 +20,7 @@ "label.average": "Gemiddelde", "label.back": "Terug", "label.before": "Voor", + "label.behavior": "Gedrag", "label.boards": "Borden", "label.bounce-rate": "Bouncepercentage", "label.breakdown": "Opsplitsen", diff --git a/src/lang/pl-PL.json b/src/lang/pl-PL.json index 11c76763..0c8b0004 100644 --- a/src/lang/pl-PL.json +++ b/src/lang/pl-PL.json @@ -20,6 +20,7 @@ "label.average": "Średnia", "label.back": "Powrót", "label.before": "Przed", + "label.behavior": "Zachowanie", "label.boards": "Tablice", "label.bounce-rate": "Współczynnik odrzuceń", "label.breakdown": "Rozbicie", diff --git a/src/lang/pt-BR.json b/src/lang/pt-BR.json index 5ccd4869..c34c9ab0 100644 --- a/src/lang/pt-BR.json +++ b/src/lang/pt-BR.json @@ -20,6 +20,7 @@ "label.average": "Média", "label.back": "Voltar", "label.before": "Antes", + "label.behavior": "Comportamento", "label.boards": "Quadros", "label.bounce-rate": "Taxa de rejeição", "label.breakdown": "Detalhamento", diff --git a/src/lang/pt-PT.json b/src/lang/pt-PT.json index ba5b3b08..86734cb5 100644 --- a/src/lang/pt-PT.json +++ b/src/lang/pt-PT.json @@ -20,6 +20,7 @@ "label.average": "Média", "label.back": "Voltar", "label.before": "Antes", + "label.behavior": "Comportamento", "label.boards": "Quadros", "label.bounce-rate": "Taxa de rejeição", "label.breakdown": "Detalhamento", diff --git a/src/lang/ro-RO.json b/src/lang/ro-RO.json index 54707048..78633304 100644 --- a/src/lang/ro-RO.json +++ b/src/lang/ro-RO.json @@ -20,6 +20,7 @@ "label.average": "Mediu", "label.back": "Înapoi", "label.before": "Înainte", + "label.behavior": "Comportament", "label.boards": "Panouri", "label.bounce-rate": "Rata de respingere", "label.breakdown": "Detaliat", diff --git a/src/lang/ru-RU.json b/src/lang/ru-RU.json index e63e66ab..96d0538f 100644 --- a/src/lang/ru-RU.json +++ b/src/lang/ru-RU.json @@ -20,6 +20,7 @@ "label.average": "Средний", "label.back": "Назад", "label.before": "До", + "label.behavior": "Поведение", "label.boards": "Доски", "label.bounce-rate": "Отказы", "label.breakdown": "Авария", diff --git a/src/lang/si-LK.json b/src/lang/si-LK.json index 34de41de..3e6aff86 100644 --- a/src/lang/si-LK.json +++ b/src/lang/si-LK.json @@ -20,6 +20,7 @@ "label.average": "Average", "label.back": "ආපසු", "label.before": "Before", + "label.behavior": "අචරණය", "label.boards": "Boards", "label.bounce-rate": "Bounce rate", "label.breakdown": "Breakdown", diff --git a/src/lang/sk-SK.json b/src/lang/sk-SK.json index ed182331..297d5e34 100644 --- a/src/lang/sk-SK.json +++ b/src/lang/sk-SK.json @@ -20,6 +20,7 @@ "label.average": "Priemer", "label.back": "Späť", "label.before": "Pred", + "label.behavior": "Správanie", "label.boards": "Tabule", "label.bounce-rate": "Okamžité opustenie", "label.breakdown": "Rozpis", diff --git a/src/lang/sl-SI.json b/src/lang/sl-SI.json index 5834881f..3dd3226f 100644 --- a/src/lang/sl-SI.json +++ b/src/lang/sl-SI.json @@ -20,6 +20,7 @@ "label.average": "Povprečno", "label.back": "Nazaj", "label.before": "Pred", + "label.behavior": "Obnašanje", "label.boards": "Table", "label.bounce-rate": "Odbojna stopnja", "label.breakdown": "Razčlenitev", diff --git a/src/lang/sv-SE.json b/src/lang/sv-SE.json index 18d216f2..1f456b0e 100644 --- a/src/lang/sv-SE.json +++ b/src/lang/sv-SE.json @@ -20,6 +20,7 @@ "label.average": "Genomsnitt", "label.back": "Tillbaka", "label.before": "Före", + "label.behavior": "Beteende", "label.boards": "Anslagstavlor", "label.bounce-rate": "Avvisningsfrekvens", "label.breakdown": "Analys", diff --git a/src/lang/ta-IN.json b/src/lang/ta-IN.json index ad992605..9e33d7b6 100644 --- a/src/lang/ta-IN.json +++ b/src/lang/ta-IN.json @@ -21,6 +21,7 @@ "label.back": "பின்னால்", "label.before": "Before", "label.boards": "Boards", + "label.behavior": "நடத்தை", "label.bounce-rate": "துள்ளல் விகிதம்", "label.breakdown": "Breakdown", "label.browser": "Browser", diff --git a/src/lang/th-TH.json b/src/lang/th-TH.json index 97df9fe3..b94ca905 100644 --- a/src/lang/th-TH.json +++ b/src/lang/th-TH.json @@ -20,6 +20,7 @@ "label.average": "Average", "label.back": "ย้อนกลับ", "label.before": "Before", + "label.behavior": "พฤติกรรม", "label.boards": "Boards", "label.bounce-rate": "อัตราตีกลับ", "label.breakdown": "Breakdown", diff --git a/src/lang/tr-TR.json b/src/lang/tr-TR.json index 4f8af0b3..3a2dce4b 100644 --- a/src/lang/tr-TR.json +++ b/src/lang/tr-TR.json @@ -20,6 +20,7 @@ "label.average": "Ortalama", "label.back": "Geri", "label.before": "Önce", + "label.behavior": "Davranış", "label.boards": "Panolar", "label.bounce-rate": "Tek sayfa ziyaret oranı", "label.breakdown": "Dağılım", diff --git a/src/lang/uk-UA.json b/src/lang/uk-UA.json index 39c08db9..768015be 100644 --- a/src/lang/uk-UA.json +++ b/src/lang/uk-UA.json @@ -20,6 +20,7 @@ "label.average": "Середній", "label.back": "Назад", "label.before": "До", + "label.behavior": "Поведінка", "label.boards": "Дошки", "label.bounce-rate": "Показник відмов", "label.breakdown": "Розподіл", diff --git a/src/lang/ur-PK.json b/src/lang/ur-PK.json index 66f33b9f..5cc31212 100644 --- a/src/lang/ur-PK.json +++ b/src/lang/ur-PK.json @@ -20,6 +20,7 @@ "label.average": "Average", "label.back": "پیچھے", "label.before": "Before", + "label.behavior": "رویے", "label.boards": "Boards", "label.bounce-rate": "اچھال کی شرح", "label.breakdown": "Breakdown", diff --git a/src/lang/uz-UZ.json b/src/lang/uz-UZ.json index e8a574c7..cf58945f 100644 --- a/src/lang/uz-UZ.json +++ b/src/lang/uz-UZ.json @@ -15,6 +15,7 @@ "label.average": "Oʻrtacha", "label.back": "Orqaga", "label.before": "Oldin", + "label.behavior": "Xulq-atvor", "label.bounce-rate": "Chiqib ketish darajasi", "label.breakdown": "Tahlil", "label.browser": "Brauzer", diff --git a/src/lang/vi-VN.json b/src/lang/vi-VN.json index 5c9a78a2..fc0a8c13 100644 --- a/src/lang/vi-VN.json +++ b/src/lang/vi-VN.json @@ -15,6 +15,7 @@ "label.average": "Trung bình", "label.back": "Quay lại", "label.before": "Trước đó", + "label.behavior": "Hành vi", "label.bounce-rate": "Tỷ lệ thoát trang", "label.breakdown": "Phân tích chi tiết", "label.browser": "Trình duyệt", diff --git a/src/lang/zh-CN.json b/src/lang/zh-CN.json index 894ac35c..c6f01dd5 100644 --- a/src/lang/zh-CN.json +++ b/src/lang/zh-CN.json @@ -20,6 +20,7 @@ "label.average": "平均", "label.back": "返回", "label.before": "之前", + "label.behavior": "行为", "label.boards": "看板", "label.bounce-rate": "跳出率", "label.breakdown": "故障", diff --git a/src/lang/zh-TW.json b/src/lang/zh-TW.json index 7b19cb25..030d11dc 100644 --- a/src/lang/zh-TW.json +++ b/src/lang/zh-TW.json @@ -20,6 +20,7 @@ "label.average": "平均", "label.back": "返回", "label.before": "之前", + "label.behavior": "行為", "label.boards": "看板", "label.bounce-rate": "跳出率", "label.breakdown": "細項分析", From beb2bc0a06aa0500aa6200a555e2ea7072274fd2 Mon Sep 17 00:00:00 2001 From: Prince EKPINSE Date: Sat, 29 Nov 2025 13:53:32 +0100 Subject: [PATCH 07/31] feat: improve mobile navigation with clickable page elements (#3770) --- .../(main)/websites/[websiteId]/WebsiteHeader.tsx | 7 ++++++- src/components/common/PageHeader.tsx | 11 ++++++++++- src/components/metrics/ActiveUsers.tsx | 13 ++++++++----- 3 files changed, 24 insertions(+), 7 deletions(-) diff --git a/src/app/(main)/websites/[websiteId]/WebsiteHeader.tsx b/src/app/(main)/websites/[websiteId]/WebsiteHeader.tsx index 28187f00..d8eb76c3 100644 --- a/src/app/(main)/websites/[websiteId]/WebsiteHeader.tsx +++ b/src/app/(main)/websites/[websiteId]/WebsiteHeader.tsx @@ -20,7 +20,12 @@ export function WebsiteHeader({ showActions }: { showActions?: boolean }) { } return ( - } marginBottom="3"> + } + marginBottom="3" + titleHref={renderUrl(`/websites/${website.id}`, false)} + > diff --git a/src/components/common/PageHeader.tsx b/src/components/common/PageHeader.tsx index 12b1a644..395fbdd3 100644 --- a/src/components/common/PageHeader.tsx +++ b/src/components/common/PageHeader.tsx @@ -1,5 +1,6 @@ import { ReactNode } from 'react'; import { Heading, Icon, Row, Text, Column, Grid } from '@umami/react-zen'; +import { LinkButton } from './LinkButton'; export function PageHeader({ title, @@ -7,6 +8,7 @@ export function PageHeader({ label, icon, showBorder = true, + titleHref, children, }: { title: string; @@ -14,6 +16,7 @@ export function PageHeader({ label?: ReactNode; icon?: ReactNode; showBorder?: boolean; + titleHref?: string; allowEdit?: boolean; className?: string; children?: ReactNode; @@ -33,7 +36,13 @@ export function PageHeader({ {icon} )} - {title && {title}} + {title && titleHref ? ( + + {title} + + ) : ( + title && {title} + )} {description && ( diff --git a/src/components/metrics/ActiveUsers.tsx b/src/components/metrics/ActiveUsers.tsx index 0627020e..9a7ff858 100644 --- a/src/components/metrics/ActiveUsers.tsx +++ b/src/components/metrics/ActiveUsers.tsx @@ -1,6 +1,7 @@ import { useMemo } from 'react'; import { Text, StatusLight } from '@umami/react-zen'; import { useMessages, useActyiveUsersQuery } from '@/components/hooks'; +import { LinkButton } from '@/components/common/LinkButton'; export function ActiveUsers({ websiteId, @@ -27,10 +28,12 @@ export function ActiveUsers({ } return ( - - - {count} {formatMessage(labels.online)} - - + + + + {count} {formatMessage(labels.online)} + + + ); } From 046cb6ef62a883ba1a4e12730e8e38c0f568bcf0 Mon Sep 17 00:00:00 2001 From: Prince EKPINSE Date: Sat, 29 Nov 2025 16:43:21 +0100 Subject: [PATCH 08/31] feat(#3748): restore favicon icons in websites list --- src/app/(main)/websites/WebsitesDataTable.tsx | 9 ++++++++- src/app/login/LoginForm.tsx | 2 +- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/src/app/(main)/websites/WebsitesDataTable.tsx b/src/app/(main)/websites/WebsitesDataTable.tsx index 93b1a7c7..c39420f0 100644 --- a/src/app/(main)/websites/WebsitesDataTable.tsx +++ b/src/app/(main)/websites/WebsitesDataTable.tsx @@ -2,6 +2,8 @@ import Link from 'next/link'; import { WebsitesTable } from './WebsitesTable'; import { DataGrid } from '@/components/common/DataGrid'; import { useLoginQuery, useNavigation, useUserWebsitesQuery } from '@/components/hooks'; +import { Favicon } from '@/index'; +import { Icon, Row } from '@umami/react-zen'; export function WebsitesDataTable({ userId, @@ -21,7 +23,12 @@ export function WebsitesDataTable({ const { renderUrl } = useNavigation(); const renderLink = (row: any) => ( - {row.name} + + + + + {row.name} + ); return ( diff --git a/src/app/login/LoginForm.tsx b/src/app/login/LoginForm.tsx index b151b94e..02138985 100644 --- a/src/app/login/LoginForm.tsx +++ b/src/app/login/LoginForm.tsx @@ -26,7 +26,7 @@ export function LoginForm() { setClientAuthToken(token); setUser(user); - router.push('/websites'); + router.push('/'); }, }); }; From e5a5aeecb5ac30156399c3c342d23df7e45ca069 Mon Sep 17 00:00:00 2001 From: Prince EKPINSE Date: Sat, 29 Nov 2025 16:54:45 +0100 Subject: [PATCH 09/31] feat(#3748): redirect user to last selected team on login --- src/app/login/LoginForm.tsx | 1 - 1 file changed, 1 deletion(-) diff --git a/src/app/login/LoginForm.tsx b/src/app/login/LoginForm.tsx index 02138985..481d7ccd 100644 --- a/src/app/login/LoginForm.tsx +++ b/src/app/login/LoginForm.tsx @@ -25,7 +25,6 @@ export function LoginForm() { onSuccess: async ({ token, user }) => { setClientAuthToken(token); setUser(user); - router.push('/'); }, }); From 92a7355ce346c039aad22d6a533dfcd25096c39c Mon Sep 17 00:00:00 2001 From: RaenonX Date: Mon, 24 Nov 2025 08:07:31 +0800 Subject: [PATCH 10/31] Fixed `/api/batch` request recreation failure --- src/app/api/batch/route.ts | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/src/app/api/batch/route.ts b/src/app/api/batch/route.ts index 6feab06b..aae14c96 100644 --- a/src/app/api/batch/route.ts +++ b/src/app/api/batch/route.ts @@ -18,7 +18,20 @@ export async function POST(request: Request) { let index = 0; for (const data of body) { - const newRequest = new Request(request, { body: JSON.stringify(data) }); + // Recreate a fresh Request since `new Request(request)` will have the following error: + // > Cannot read private member #state from an object whose class did not declare it + + // Copy headers we received, ensure JSON content type, and avoid conflicting content-length + const headers = new Headers(request.headers); + headers.set('content-type', 'application/json'); + headers.delete('content-length'); + + const newRequest = new Request(request.url, { + method: 'POST', + headers, + body: JSON.stringify(data), + }); + const response = await send.POST(newRequest); if (!response.ok) { From 805bc57bbb7fedf87edbc4ede9ff04f6c8bef374 Mon Sep 17 00:00:00 2001 From: RaenonX Date: Mon, 24 Nov 2025 15:21:20 +0800 Subject: [PATCH 11/31] Added `browser` / `os` / `device` override in `payload` --- src/app/api/send/route.ts | 3 +++ src/lib/detect.ts | 6 +++--- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/src/app/api/send/route.ts b/src/app/api/send/route.ts index 2c2085bf..6ef66f30 100644 --- a/src/app/api/send/route.ts +++ b/src/app/api/send/route.ts @@ -41,6 +41,9 @@ const schema = z.object({ userAgent: z.string().optional(), timestamp: z.coerce.number().int().optional(), id: z.string().optional(), + browser: z.string().optional(), + os: z.string().optional(), + device: z.string().optional(), }) .refine( data => { diff --git a/src/lib/detect.ts b/src/lib/detect.ts index c5528465..083203ed 100644 --- a/src/lib/detect.ts +++ b/src/lib/detect.ts @@ -114,9 +114,9 @@ export async function getClientInfo(request: Request, payload: Record Date: Mon, 24 Nov 2025 15:26:54 +0800 Subject: [PATCH 12/31] Updated `/api/batch` to return `cache` --- src/app/api/batch/route.ts | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/app/api/batch/route.ts b/src/app/api/batch/route.ts index aae14c96..46e8b3c3 100644 --- a/src/app/api/batch/route.ts +++ b/src/app/api/batch/route.ts @@ -17,6 +17,7 @@ export async function POST(request: Request) { const errors = []; let index = 0; + let cache = null; for (const data of body) { // Recreate a fresh Request since `new Request(request)` will have the following error: // > Cannot read private member #state from an object whose class did not declare it @@ -33,9 +34,12 @@ export async function POST(request: Request) { }); const response = await send.POST(newRequest); + const responseJson = await response.json(); if (!response.ok) { - errors.push({ index, response: await response.json() }); + errors.push({ index, response: responseJson }); + } else { + cache ??= responseJson.cache; } index++; @@ -46,6 +50,7 @@ export async function POST(request: Request) { processed: body.length - errors.length, errors: errors.length, details: errors, + cache, }); } catch (e) { return serverError(e); From 4d70c3baf1e4bd366e60ccee8c97da56ce3fae54 Mon Sep 17 00:00:00 2001 From: Indra Gunawan Date: Mon, 1 Dec 2025 16:48:58 +0800 Subject: [PATCH 13/31] add support for UUID v7 --- src/lib/crypto.ts | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/lib/crypto.ts b/src/lib/crypto.ts index f9387460..f6b0248e 100644 --- a/src/lib/crypto.ts +++ b/src/lib/crypto.ts @@ -1,5 +1,5 @@ import crypto from 'crypto'; -import { v4, v5 } from 'uuid'; +import { v4, v5, v7 } from 'uuid'; const ALGORITHM = 'aes-256-gcm'; const IV_LENGTH = 16; @@ -57,7 +57,9 @@ export function secret() { } export function uuid(...args: any) { - if (!args.length) return v4(); + if (args.length) { + return v5(hash(...args, secret()), v5.DNS); + } - return v5(hash(...args, secret()), v5.DNS); + return process.env.USE_UUIDV7 ? v7() : v4(); } From cb034a13710a97a9f04d8ab71726e2ad2a90cc44 Mon Sep 17 00:00:00 2001 From: Francis Cao Date: Mon, 1 Dec 2025 11:34:43 -0800 Subject: [PATCH 14/31] prisma schema boards + varchar length increase --- prisma/migrations/15_boards/migration.sql | 33 ++++++++++++ .../migration.sql | 16 ++++++ prisma/schema.prisma | 54 +++++++++++++------ 3 files changed, 88 insertions(+), 15 deletions(-) create mode 100644 prisma/migrations/15_boards/migration.sql create mode 100644 prisma/migrations/16_update_website_event_length/migration.sql diff --git a/prisma/migrations/15_boards/migration.sql b/prisma/migrations/15_boards/migration.sql new file mode 100644 index 00000000..09608c5f --- /dev/null +++ b/prisma/migrations/15_boards/migration.sql @@ -0,0 +1,33 @@ +-- CreateTable +CREATE TABLE "board" ( + "board_id" UUID NOT NULL, + "type" VARCHAR(50) NOT NULL, + "name" VARCHAR(200) NOT NULL, + "description" VARCHAR(500) NOT NULL, + "parameters" JSONB NOT NULL, + "slug" VARCHAR(100) NOT NULL, + "user_id" UUID, + "team_id" UUID, + "created_at" TIMESTAMPTZ(6) DEFAULT CURRENT_TIMESTAMP, + "updated_at" TIMESTAMPTZ(6), + + CONSTRAINT "board_pkey" PRIMARY KEY ("board_id") +); + +-- CreateIndex +CREATE UNIQUE INDEX "board_board_id_key" ON "board"("board_id"); + +-- CreateIndex +CREATE UNIQUE INDEX "board_slug_key" ON "board"("slug"); + +-- CreateIndex +CREATE INDEX "board_slug_idx" ON "board"("slug"); + +-- CreateIndex +CREATE INDEX "board_user_id_idx" ON "board"("user_id"); + +-- CreateIndex +CREATE INDEX "board_team_id_idx" ON "board"("team_id"); + +-- CreateIndex +CREATE INDEX "board_created_at_idx" ON "board"("created_at"); diff --git a/prisma/migrations/16_update_website_event_length/migration.sql b/prisma/migrations/16_update_website_event_length/migration.sql new file mode 100644 index 00000000..06dd57a6 --- /dev/null +++ b/prisma/migrations/16_update_website_event_length/migration.sql @@ -0,0 +1,16 @@ +-- AlterTable +ALTER TABLE "website_event" ALTER COLUMN "url_path" SET DATA TYPE VARCHAR(1024), +ALTER COLUMN "url_query" SET DATA TYPE VARCHAR(1024), +ALTER COLUMN "referrer_path" SET DATA TYPE VARCHAR(1024), +ALTER COLUMN "referrer_query" SET DATA TYPE VARCHAR(1024), +ALTER COLUMN "fbclid" SET DATA TYPE VARCHAR(1024), +ALTER COLUMN "gclid" SET DATA TYPE VARCHAR(1024), +ALTER COLUMN "li_fat_id" SET DATA TYPE VARCHAR(1024), +ALTER COLUMN "msclkid" SET DATA TYPE VARCHAR(1024), +ALTER COLUMN "ttclid" SET DATA TYPE VARCHAR(1024), +ALTER COLUMN "twclid" SET DATA TYPE VARCHAR(1024), +ALTER COLUMN "utm_campaign" SET DATA TYPE VARCHAR(512), +ALTER COLUMN "utm_content" SET DATA TYPE VARCHAR(512), +ALTER COLUMN "utm_medium" SET DATA TYPE VARCHAR(512), +ALTER COLUMN "utm_source" SET DATA TYPE VARCHAR(512), +ALTER COLUMN "utm_term" SET DATA TYPE VARCHAR(512); diff --git a/prisma/schema.prisma b/prisma/schema.prisma index aeb11648..c0e87e7a 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -27,6 +27,7 @@ model User { pixels Pixel[] @relation("user") teams TeamUser[] reports Report[] + boards Board[] @relation("user") @@map("user") } @@ -99,23 +100,23 @@ model WebsiteEvent { sessionId String @map("session_id") @db.Uuid visitId String @map("visit_id") @db.Uuid createdAt DateTime? @default(now()) @map("created_at") @db.Timestamptz(6) - urlPath String @map("url_path") @db.VarChar(500) - urlQuery String? @map("url_query") @db.VarChar(500) - utmSource String? @map("utm_source") @db.VarChar(255) - utmMedium String? @map("utm_medium") @db.VarChar(255) - utmCampaign String? @map("utm_campaign") @db.VarChar(255) - utmContent String? @map("utm_content") @db.VarChar(255) - utmTerm String? @map("utm_term") @db.VarChar(255) - referrerPath String? @map("referrer_path") @db.VarChar(500) - referrerQuery String? @map("referrer_query") @db.VarChar(500) + urlPath String @map("url_path") @db.VarChar(1024) + urlQuery String? @map("url_query") @db.VarChar(1024) + utmSource String? @map("utm_source") @db.VarChar(512) + utmMedium String? @map("utm_medium") @db.VarChar(512) + utmCampaign String? @map("utm_campaign") @db.VarChar(512) + utmContent String? @map("utm_content") @db.VarChar(512) + utmTerm String? @map("utm_term") @db.VarChar(512) + referrerPath String? @map("referrer_path") @db.VarChar(1024) + referrerQuery String? @map("referrer_query") @db.VarChar(1024) referrerDomain String? @map("referrer_domain") @db.VarChar(500) pageTitle String? @map("page_title") @db.VarChar(500) - gclid String? @db.VarChar(255) - fbclid String? @db.VarChar(255) - msclkid String? @db.VarChar(255) - ttclid String? @db.VarChar(255) - lifatid String? @map("li_fat_id") @db.VarChar(255) - twclid String? @db.VarChar(255) + gclid String? @db.VarChar(1024) + fbclid String? @db.VarChar(1024) + msclkid String? @db.VarChar(1024) + ttclid String? @db.VarChar(1024) + lifatid String? @map("li_fat_id") @db.VarChar(1024) + twclid String? @db.VarChar(1024) eventType Int @default(1) @map("event_type") @db.Integer eventName String? @map("event_name") @db.VarChar(50) tag String? @db.VarChar(50) @@ -199,6 +200,7 @@ model Team { members TeamUser[] links Link[] pixels Pixel[] + boards Board[] @@index([accessCode]) @@map("team") @@ -316,3 +318,25 @@ model Pixel { @@index([createdAt]) @@map("pixel") } + +model Board { + id String @id() @unique() @map("board_id") @db.Uuid + type String @db.VarChar(50) + name String @db.VarChar(200) + description String @db.VarChar(500) + parameters Json + slug String @unique() @db.VarChar(100) + userId String? @map("user_id") @db.Uuid + teamId String? @map("team_id") @db.Uuid + createdAt DateTime? @default(now()) @map("created_at") @db.Timestamptz(6) + updatedAt DateTime? @updatedAt @map("updated_at") @db.Timestamptz(6) + + user User? @relation("user", fields: [userId], references: [id]) + team Team? @relation(fields: [teamId], references: [id]) + + @@index([slug]) + @@index([userId]) + @@index([teamId]) + @@index([createdAt]) + @@map("board") +} \ No newline at end of file From f5896f071bf3e69c245fa5de8dac9f470e3bdc85 Mon Sep 17 00:00:00 2001 From: Mike Cao Date: Mon, 1 Dec 2025 23:33:57 -0800 Subject: [PATCH 15/31] Handle user account redirect. --- pnpm-lock.yaml | 2 ++ src/app/page.tsx | 1 - src/components/input/NavButton.tsx | 23 +++++++++++++++++------ 3 files changed, 19 insertions(+), 7 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 0a4577c1..e19b4029 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -328,6 +328,8 @@ importers: specifier: ^5.9.3 version: 5.9.3 + dist: {} + packages: '@ampproject/remapping@2.3.0': diff --git a/src/app/page.tsx b/src/app/page.tsx index 24a27116..6f0033df 100644 --- a/src/app/page.tsx +++ b/src/app/page.tsx @@ -1,6 +1,5 @@ 'use client'; import { redirect } from 'next/navigation'; -import { getItem } from '@/lib/storage'; import { useEffect } from 'react'; import { LAST_TEAM_CONFIG } from '@/lib/constants'; import { getItem } from '@/lib/storage'; diff --git a/src/components/input/NavButton.tsx b/src/components/input/NavButton.tsx index 9552ac73..ab77ef06 100644 --- a/src/components/input/NavButton.tsx +++ b/src/components/input/NavButton.tsx @@ -14,6 +14,7 @@ import { Text, } from '@umami/react-zen'; import { ArrowRight } from 'lucide-react'; +import type { Key } from 'react'; import { useConfig, useLoginQuery, @@ -33,7 +34,8 @@ import { Users, } from '@/components/icons'; import { Switch } from '@/components/svg'; -import { DOCS_URL } from '@/lib/constants'; +import { DOCS_URL, LAST_TEAM_CONFIG } from '@/lib/constants'; +import { removeItem } from '@/lib/storage'; export interface TeamsButtonProps { showText?: boolean; @@ -44,7 +46,7 @@ export function NavButton({ showText = true }: TeamsButtonProps) { const { user } = useLoginQuery(); const { cloudMode } = useConfig(); const { formatMessage, labels } = useMessages(); - const { teamId } = useNavigation(); + const { teamId, router } = useNavigation(); const { isMobile } = useMobile(); const team = user?.teams?.find(({ id }) => id === teamId); const selectedKeys = new Set([teamId || 'user']); @@ -54,7 +56,16 @@ export function NavButton({ showText = true }: TeamsButtonProps) { return cloudMode ? `${process.env.cloudUrl}${url}` : url; }; - const handleAction = async () => {}; + const handleAction = async (key: Key) => { + if (key === 'user') { + removeItem(LAST_TEAM_CONFIG); + if (cloudMode) { + window.location.href = '/'; + } else { + router.push('/'); + } + } + }; return ( @@ -84,16 +95,16 @@ export function NavButton({ showText = true }: TeamsButtonProps) { - + } label={formatMessage(labels.switchAccount)} /> - + - + } label={user.username} /> From b7807ed4662f416e637eb2d15e1d6c4a3f696277 Mon Sep 17 00:00:00 2001 From: Arthur Sepiol Date: Tue, 2 Dec 2025 13:43:59 +0300 Subject: [PATCH 16/31] feat(dev): add sample data generator script Adds a CLI tool to generate realistic analytics data for local development and testing. Creates two demo websites with varying traffic patterns and realistic user behavior distributions. --- package.json | 6 +- scripts/seed-data.ts | 121 ++++++++ scripts/seed/distributions/devices.ts | 80 +++++ scripts/seed/distributions/geographic.ts | 144 +++++++++ scripts/seed/distributions/referrers.ts | 163 ++++++++++ scripts/seed/distributions/temporal.ts | 69 +++++ scripts/seed/generators/events.ts | 191 ++++++++++++ scripts/seed/generators/revenue.ts | 65 ++++ scripts/seed/generators/sessions.ts | 52 ++++ scripts/seed/index.ts | 378 +++++++++++++++++++++++ scripts/seed/sites/blog.ts | 108 +++++++ scripts/seed/sites/saas.ts | 185 +++++++++++ scripts/seed/utils.ts | 85 +++++ 13 files changed, 1645 insertions(+), 2 deletions(-) create mode 100644 scripts/seed-data.ts create mode 100644 scripts/seed/distributions/devices.ts create mode 100644 scripts/seed/distributions/geographic.ts create mode 100644 scripts/seed/distributions/referrers.ts create mode 100644 scripts/seed/distributions/temporal.ts create mode 100644 scripts/seed/generators/events.ts create mode 100644 scripts/seed/generators/revenue.ts create mode 100644 scripts/seed/generators/sessions.ts create mode 100644 scripts/seed/index.ts create mode 100644 scripts/seed/sites/blog.ts create mode 100644 scripts/seed/sites/saas.ts create mode 100644 scripts/seed/utils.ts diff --git a/package.json b/package.json index fd31320e..23e19f8e 100644 --- a/package.json +++ b/package.json @@ -47,7 +47,8 @@ "postbuild": "node scripts/postbuild.js", "test": "jest", "cypress-open": "cypress open cypress run", - "cypress-run": "cypress run cypress run" + "cypress-run": "cypress run cypress run", + "seed-data": "tsx scripts/seed-data.ts" }, "lint-staged": { "**/*.{js,jsx,ts,tsx}": [ @@ -159,7 +160,7 @@ "eslint-plugin-cypress": "^2.15.1", "eslint-plugin-import": "^2.32.0", "eslint-plugin-jest": "^27.9.0", - "eslint-plugin-prettier": "^5.5.3", + "eslint-plugin-prettier": "^5.5.4", "extract-react-intl-messages": "^4.1.1", "husky": "^9.1.7", "jest": "^29.7.0", @@ -185,6 +186,7 @@ "ts-jest": "^29.4.5", "ts-node": "^10.9.1", "tsup": "^8.5.0", + "tsx": "^4.19.0", "typescript": "^5.9.3" } } diff --git a/scripts/seed-data.ts b/scripts/seed-data.ts new file mode 100644 index 00000000..82a0564c --- /dev/null +++ b/scripts/seed-data.ts @@ -0,0 +1,121 @@ +#!/usr/bin/env node +/* eslint-disable no-console */ + +/** + * Umami Sample Data Generator + * + * Generates realistic analytics data for local development and testing. + * Creates two demo websites: + * - Demo Blog: Low traffic (~100 sessions/month) + * - Demo SaaS: Average traffic (~500 sessions/day) + * + * Usage: + * npm run seed-data # Generate 30 days of data + * npm run seed-data -- --days 90 # Generate 90 days of data + * npm run seed-data -- --clear # Clear existing demo data first + * npm run seed-data -- --verbose # Show detailed progress + */ + +import { seed, type SeedConfig } from './seed/index.js'; + +function parseArgs(): SeedConfig { + const args = process.argv.slice(2); + + const config: SeedConfig = { + days: 30, + clear: false, + verbose: false, + }; + + for (let i = 0; i < args.length; i++) { + const arg = args[i]; + + if (arg === '--days' && args[i + 1]) { + config.days = parseInt(args[i + 1], 10); + if (isNaN(config.days) || config.days < 1) { + console.error('Error: --days must be a positive integer'); + process.exit(1); + } + i++; + } else if (arg === '--clear') { + config.clear = true; + } else if (arg === '--verbose' || arg === '-v') { + config.verbose = true; + } else if (arg === '--help' || arg === '-h') { + printHelp(); + process.exit(0); + } else if (arg.startsWith('--days=')) { + config.days = parseInt(arg.split('=')[1], 10); + if (isNaN(config.days) || config.days < 1) { + console.error('Error: --days must be a positive integer'); + process.exit(1); + } + } + } + + return config; +} + +function printHelp(): void { + console.log(` +Umami Sample Data Generator + +Generates realistic analytics data for local development and testing. + +Usage: + npm run seed-data [options] + +Options: + --days Number of days of data to generate (default: 30) + --clear Clear existing demo data before generating + --verbose, -v Show detailed progress + --help, -h Show this help message + +Examples: + npm run seed-data # Generate 30 days of data + npm run seed-data -- --days 90 # Generate 90 days of data + npm run seed-data -- --clear # Clear existing demo data first + npm run seed-data -- --days 7 -v # Generate 7 days with verbose output + +Generated Sites: + - Demo Blog: Low traffic (~90 sessions/month) + - Demo SaaS: Average traffic (~500 sessions/day) with revenue tracking + +Note: + This script is blocked from running in production environments + (NODE_ENV=production or cloud platforms like Vercel/Netlify/Railway). +`); +} + +function checkEnvironment(): void { + const nodeEnv = process.env.NODE_ENV; + + if (nodeEnv === 'production') { + console.error('\nError: seed-data cannot run in production environment.'); + console.error('This script is only for local development and testing.\n'); + process.exit(1); + } + + if (process.env.VERCEL || process.env.NETLIFY || process.env.RAILWAY_ENVIRONMENT) { + console.error('\nError: seed-data cannot run in cloud environments.'); + console.error('This script is only for local development and testing.\n'); + process.exit(1); + } +} + +async function main(): Promise { + console.log('\nUmami Sample Data Generator\n'); + + checkEnvironment(); + + const config = parseArgs(); + + try { + await seed(config); + } catch (error) { + console.error('\nError generating seed data:', error); + process.exit(1); + } +} + +main(); diff --git a/scripts/seed/distributions/devices.ts b/scripts/seed/distributions/devices.ts new file mode 100644 index 00000000..9d8b8c00 --- /dev/null +++ b/scripts/seed/distributions/devices.ts @@ -0,0 +1,80 @@ +import { weightedRandom, pickRandom, type WeightedOption } from '../utils.js'; + +export type DeviceType = 'desktop' | 'mobile' | 'tablet'; + +const deviceWeights: WeightedOption[] = [ + { value: 'desktop', weight: 0.55 }, + { value: 'mobile', weight: 0.4 }, + { value: 'tablet', weight: 0.05 }, +]; + +const browsersByDevice: Record[]> = { + desktop: [ + { value: 'Chrome', weight: 0.65 }, + { value: 'Safari', weight: 0.12 }, + { value: 'Firefox', weight: 0.1 }, + { value: 'Edge', weight: 0.1 }, + { value: 'Opera', weight: 0.03 }, + ], + mobile: [ + { value: 'Chrome', weight: 0.55 }, + { value: 'Safari', weight: 0.35 }, + { value: 'Samsung', weight: 0.05 }, + { value: 'Firefox', weight: 0.03 }, + { value: 'Opera', weight: 0.02 }, + ], + tablet: [ + { value: 'Safari', weight: 0.6 }, + { value: 'Chrome', weight: 0.35 }, + { value: 'Firefox', weight: 0.05 }, + ], +}; + +const osByDevice: Record[]> = { + desktop: [ + { value: 'Windows 10', weight: 0.5 }, + { value: 'Mac OS', weight: 0.3 }, + { value: 'Linux', weight: 0.12 }, + { value: 'Chrome OS', weight: 0.05 }, + { value: 'Windows 11', weight: 0.03 }, + ], + mobile: [ + { value: 'iOS', weight: 0.45 }, + { value: 'Android', weight: 0.55 }, + ], + tablet: [ + { value: 'iOS', weight: 0.75 }, + { value: 'Android', weight: 0.25 }, + ], +}; + +const screensByDevice: Record = { + desktop: [ + '1920x1080', + '2560x1440', + '1366x768', + '1440x900', + '3840x2160', + '1536x864', + '1680x1050', + '2560x1080', + ], + mobile: ['390x844', '414x896', '375x812', '360x800', '428x926', '393x873', '412x915', '360x780'], + tablet: ['1024x768', '768x1024', '834x1194', '820x1180', '810x1080', '800x1280'], +}; + +export interface DeviceInfo { + device: DeviceType; + browser: string; + os: string; + screen: string; +} + +export function getRandomDevice(): DeviceInfo { + const device = weightedRandom(deviceWeights); + const browser = weightedRandom(browsersByDevice[device]); + const os = weightedRandom(osByDevice[device]); + const screen = pickRandom(screensByDevice[device]); + + return { device, browser, os, screen }; +} diff --git a/scripts/seed/distributions/geographic.ts b/scripts/seed/distributions/geographic.ts new file mode 100644 index 00000000..ba6ebae3 --- /dev/null +++ b/scripts/seed/distributions/geographic.ts @@ -0,0 +1,144 @@ +import { weightedRandom, pickRandom, type WeightedOption } from '../utils.js'; + +interface GeoLocation { + country: string; + region: string; + city: string; +} + +const countryWeights: WeightedOption[] = [ + { value: 'US', weight: 0.35 }, + { value: 'GB', weight: 0.08 }, + { value: 'DE', weight: 0.06 }, + { value: 'FR', weight: 0.05 }, + { value: 'CA', weight: 0.04 }, + { value: 'AU', weight: 0.03 }, + { value: 'IN', weight: 0.08 }, + { value: 'BR', weight: 0.04 }, + { value: 'JP', weight: 0.03 }, + { value: 'NL', weight: 0.02 }, + { value: 'ES', weight: 0.02 }, + { value: 'IT', weight: 0.02 }, + { value: 'PL', weight: 0.02 }, + { value: 'SE', weight: 0.01 }, + { value: 'MX', weight: 0.02 }, + { value: 'KR', weight: 0.02 }, + { value: 'SG', weight: 0.01 }, + { value: 'ID', weight: 0.02 }, + { value: 'PH', weight: 0.01 }, + { value: 'TH', weight: 0.01 }, + { value: 'VN', weight: 0.01 }, + { value: 'RU', weight: 0.02 }, + { value: 'UA', weight: 0.01 }, + { value: 'ZA', weight: 0.01 }, + { value: 'NG', weight: 0.01 }, +]; + +const regionsByCountry: Record = { + US: [ + { region: 'CA', city: 'San Francisco' }, + { region: 'CA', city: 'Los Angeles' }, + { region: 'NY', city: 'New York' }, + { region: 'TX', city: 'Austin' }, + { region: 'TX', city: 'Houston' }, + { region: 'WA', city: 'Seattle' }, + { region: 'IL', city: 'Chicago' }, + { region: 'MA', city: 'Boston' }, + { region: 'CO', city: 'Denver' }, + { region: 'GA', city: 'Atlanta' }, + { region: 'FL', city: 'Miami' }, + { region: 'PA', city: 'Philadelphia' }, + ], + GB: [ + { region: 'ENG', city: 'London' }, + { region: 'ENG', city: 'Manchester' }, + { region: 'ENG', city: 'Birmingham' }, + { region: 'SCT', city: 'Edinburgh' }, + { region: 'ENG', city: 'Bristol' }, + ], + DE: [ + { region: 'BE', city: 'Berlin' }, + { region: 'BY', city: 'Munich' }, + { region: 'HH', city: 'Hamburg' }, + { region: 'HE', city: 'Frankfurt' }, + { region: 'NW', city: 'Cologne' }, + ], + FR: [ + { region: 'IDF', city: 'Paris' }, + { region: 'ARA', city: 'Lyon' }, + { region: 'PAC', city: 'Marseille' }, + { region: 'OCC', city: 'Toulouse' }, + ], + CA: [ + { region: 'ON', city: 'Toronto' }, + { region: 'BC', city: 'Vancouver' }, + { region: 'QC', city: 'Montreal' }, + { region: 'AB', city: 'Calgary' }, + ], + AU: [ + { region: 'NSW', city: 'Sydney' }, + { region: 'VIC', city: 'Melbourne' }, + { region: 'QLD', city: 'Brisbane' }, + { region: 'WA', city: 'Perth' }, + ], + IN: [ + { region: 'MH', city: 'Mumbai' }, + { region: 'KA', city: 'Bangalore' }, + { region: 'DL', city: 'New Delhi' }, + { region: 'TN', city: 'Chennai' }, + { region: 'TG', city: 'Hyderabad' }, + ], + BR: [ + { region: 'SP', city: 'Sao Paulo' }, + { region: 'RJ', city: 'Rio de Janeiro' }, + { region: 'MG', city: 'Belo Horizonte' }, + ], + JP: [ + { region: '13', city: 'Tokyo' }, + { region: '27', city: 'Osaka' }, + { region: '23', city: 'Nagoya' }, + ], + NL: [ + { region: 'NH', city: 'Amsterdam' }, + { region: 'ZH', city: 'Rotterdam' }, + { region: 'ZH', city: 'The Hague' }, + ], +}; + +const defaultRegions = [{ region: '', city: '' }]; + +export function getRandomGeo(): GeoLocation { + const country = weightedRandom(countryWeights); + const regions = regionsByCountry[country] || defaultRegions; + const { region, city } = pickRandom(regions); + + return { country, region, city }; +} + +const languages: WeightedOption[] = [ + { value: 'en-US', weight: 0.4 }, + { value: 'en-GB', weight: 0.08 }, + { value: 'de-DE', weight: 0.06 }, + { value: 'fr-FR', weight: 0.05 }, + { value: 'es-ES', weight: 0.05 }, + { value: 'pt-BR', weight: 0.04 }, + { value: 'ja-JP', weight: 0.03 }, + { value: 'zh-CN', weight: 0.05 }, + { value: 'ko-KR', weight: 0.02 }, + { value: 'ru-RU', weight: 0.02 }, + { value: 'it-IT', weight: 0.02 }, + { value: 'nl-NL', weight: 0.02 }, + { value: 'pl-PL', weight: 0.02 }, + { value: 'hi-IN', weight: 0.04 }, + { value: 'ar-SA', weight: 0.02 }, + { value: 'tr-TR', weight: 0.02 }, + { value: 'vi-VN', weight: 0.01 }, + { value: 'th-TH', weight: 0.01 }, + { value: 'id-ID', weight: 0.02 }, + { value: 'sv-SE', weight: 0.01 }, + { value: 'da-DK', weight: 0.01 }, +]; + +export function getRandomLanguage(): string { + return weightedRandom(languages); +} diff --git a/scripts/seed/distributions/referrers.ts b/scripts/seed/distributions/referrers.ts new file mode 100644 index 00000000..5b3f2c45 --- /dev/null +++ b/scripts/seed/distributions/referrers.ts @@ -0,0 +1,163 @@ +import { weightedRandom, pickRandom, randomInt, type WeightedOption } from '../utils.js'; + +export type ReferrerType = 'direct' | 'organic' | 'social' | 'paid' | 'referral'; + +export interface ReferrerInfo { + type: ReferrerType; + domain: string | null; + path: string | null; + utmSource: string | null; + utmMedium: string | null; + utmCampaign: string | null; + utmContent: string | null; + utmTerm: string | null; + gclid: string | null; + fbclid: string | null; +} + +const referrerTypeWeights: WeightedOption[] = [ + { value: 'direct', weight: 0.4 }, + { value: 'organic', weight: 0.25 }, + { value: 'social', weight: 0.15 }, + { value: 'paid', weight: 0.1 }, + { value: 'referral', weight: 0.1 }, +]; + +const searchEngines = [ + { domain: 'google.com', path: '/search' }, + { domain: 'bing.com', path: '/search' }, + { domain: 'duckduckgo.com', path: '/' }, + { domain: 'yahoo.com', path: '/search' }, + { domain: 'baidu.com', path: '/s' }, +]; + +const socialPlatforms = [ + { domain: 'twitter.com', path: null }, + { domain: 'x.com', path: null }, + { domain: 'linkedin.com', path: '/feed' }, + { domain: 'facebook.com', path: null }, + { domain: 'reddit.com', path: '/r/programming' }, + { domain: 'news.ycombinator.com', path: '/item' }, + { domain: 'threads.net', path: null }, + { domain: 'bsky.app', path: null }, +]; + +const referralSites = [ + { domain: 'medium.com', path: '/@author/article' }, + { domain: 'dev.to', path: '/post' }, + { domain: 'hashnode.com', path: '/blog' }, + { domain: 'techcrunch.com', path: '/article' }, + { domain: 'producthunt.com', path: '/posts' }, + { domain: 'indiehackers.com', path: '/post' }, +]; + +interface PaidCampaign { + source: string; + medium: string; + campaign: string; + useGclid?: boolean; + useFbclid?: boolean; +} + +const paidCampaigns: PaidCampaign[] = [ + { source: 'google', medium: 'cpc', campaign: 'brand_search', useGclid: true }, + { source: 'google', medium: 'cpc', campaign: 'product_awareness', useGclid: true }, + { source: 'facebook', medium: 'paid_social', campaign: 'retargeting', useFbclid: true }, + { source: 'facebook', medium: 'paid_social', campaign: 'lookalike', useFbclid: true }, + { source: 'linkedin', medium: 'cpc', campaign: 'b2b_targeting' }, + { source: 'twitter', medium: 'paid_social', campaign: 'launch_promo' }, +]; + +const organicCampaigns = [ + { source: 'newsletter', medium: 'email', campaign: 'weekly_digest' }, + { source: 'newsletter', medium: 'email', campaign: 'product_update' }, + { source: 'partner', medium: 'referral', campaign: 'integration_launch' }, +]; + +function generateClickId(): string { + const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'; + let result = ''; + for (let i = 0; i < 32; i++) { + result += chars.charAt(Math.floor(Math.random() * chars.length)); + } + return result; +} + +export function getRandomReferrer(): ReferrerInfo { + const type = weightedRandom(referrerTypeWeights); + + const result: ReferrerInfo = { + type, + domain: null, + path: null, + utmSource: null, + utmMedium: null, + utmCampaign: null, + utmContent: null, + utmTerm: null, + gclid: null, + fbclid: null, + }; + + switch (type) { + case 'direct': + // No referrer data + break; + + case 'organic': { + const engine = pickRandom(searchEngines); + result.domain = engine.domain; + result.path = engine.path; + break; + } + + case 'social': { + const platform = pickRandom(socialPlatforms); + result.domain = platform.domain; + result.path = platform.path; + + // Some social traffic has UTM params + if (Math.random() < 0.3) { + result.utmSource = platform.domain.replace('.com', '').replace('.net', ''); + result.utmMedium = 'social'; + } + break; + } + + case 'paid': { + const campaign = pickRandom(paidCampaigns); + result.utmSource = campaign.source; + result.utmMedium = campaign.medium; + result.utmCampaign = campaign.campaign; + result.utmContent = `ad_${randomInt(1, 5)}`; + + if (campaign.useGclid) { + result.gclid = generateClickId(); + result.domain = 'google.com'; + result.path = '/search'; + } else if (campaign.useFbclid) { + result.fbclid = generateClickId(); + result.domain = 'facebook.com'; + result.path = null; + } + break; + } + + case 'referral': { + // Mix of pure referrals and organic campaigns + if (Math.random() < 0.6) { + const site = pickRandom(referralSites); + result.domain = site.domain; + result.path = site.path; + } else { + const campaign = pickRandom(organicCampaigns); + result.utmSource = campaign.source; + result.utmMedium = campaign.medium; + result.utmCampaign = campaign.campaign; + } + break; + } + } + + return result; +} diff --git a/scripts/seed/distributions/temporal.ts b/scripts/seed/distributions/temporal.ts new file mode 100644 index 00000000..da0409a9 --- /dev/null +++ b/scripts/seed/distributions/temporal.ts @@ -0,0 +1,69 @@ +import { weightedRandom, randomInt, type WeightedOption } from '../utils.js'; + +const hourlyWeights: WeightedOption[] = [ + { value: 0, weight: 0.02 }, + { value: 1, weight: 0.01 }, + { value: 2, weight: 0.01 }, + { value: 3, weight: 0.01 }, + { value: 4, weight: 0.01 }, + { value: 5, weight: 0.02 }, + { value: 6, weight: 0.03 }, + { value: 7, weight: 0.05 }, + { value: 8, weight: 0.07 }, + { value: 9, weight: 0.08 }, + { value: 10, weight: 0.09 }, + { value: 11, weight: 0.08 }, + { value: 12, weight: 0.07 }, + { value: 13, weight: 0.08 }, + { value: 14, weight: 0.09 }, + { value: 15, weight: 0.08 }, + { value: 16, weight: 0.07 }, + { value: 17, weight: 0.06 }, + { value: 18, weight: 0.05 }, + { value: 19, weight: 0.04 }, + { value: 20, weight: 0.03 }, + { value: 21, weight: 0.03 }, + { value: 22, weight: 0.02 }, + { value: 23, weight: 0.02 }, +]; + +const dayOfWeekWeights: WeightedOption[] = [ + { value: 0, weight: 0.08 }, // Sunday + { value: 1, weight: 0.16 }, // Monday + { value: 2, weight: 0.17 }, // Tuesday + { value: 3, weight: 0.17 }, // Wednesday + { value: 4, weight: 0.16 }, // Thursday + { value: 5, weight: 0.15 }, // Friday + { value: 6, weight: 0.11 }, // Saturday +]; + +export function getWeightedHour(): number { + return weightedRandom(hourlyWeights); +} + +export function getDayOfWeekMultiplier(dayOfWeek: number): number { + const weight = dayOfWeekWeights.find(d => d.value === dayOfWeek)?.weight ?? 0.14; + return weight / 0.14; // Normalize around 1.0 +} + +export function generateTimestampForDay(day: Date): Date { + const hour = getWeightedHour(); + const minute = randomInt(0, 59); + const second = randomInt(0, 59); + const millisecond = randomInt(0, 999); + + const timestamp = new Date(day); + timestamp.setHours(hour, minute, second, millisecond); + + return timestamp; +} + +export function getSessionCountForDay(baseCount: number, day: Date): number { + const dayOfWeek = day.getDay(); + const multiplier = getDayOfWeekMultiplier(dayOfWeek); + + // Add some random variance (±20%) + const variance = 0.8 + Math.random() * 0.4; + + return Math.round(baseCount * multiplier * variance); +} diff --git a/scripts/seed/generators/events.ts b/scripts/seed/generators/events.ts new file mode 100644 index 00000000..72429062 --- /dev/null +++ b/scripts/seed/generators/events.ts @@ -0,0 +1,191 @@ +import { uuid, addSeconds, randomInt } from '../utils.js'; +import { getRandomReferrer } from '../distributions/referrers.js'; +import type { SessionData } from './sessions.js'; + +export const EVENT_TYPE = { + pageView: 1, + customEvent: 2, +} as const; + +export interface PageConfig { + path: string; + title: string; + weight: number; + avgTimeOnPage: number; +} + +export interface CustomEventConfig { + name: string; + weight: number; + pages?: string[]; + data?: Record; +} + +export interface JourneyConfig { + pages: string[]; + weight: number; +} + +export interface EventData { + id: string; + websiteId: string; + sessionId: string; + visitId: string; + eventType: number; + urlPath: string; + urlQuery: string | null; + pageTitle: string | null; + hostname: string; + referrerDomain: string | null; + referrerPath: string | null; + utmSource: string | null; + utmMedium: string | null; + utmCampaign: string | null; + utmContent: string | null; + utmTerm: string | null; + gclid: string | null; + fbclid: string | null; + eventName: string | null; + tag: string | null; + createdAt: Date; +} + +export interface EventDataEntry { + id: string; + websiteId: string; + websiteEventId: string; + dataKey: string; + stringValue: string | null; + numberValue: number | null; + dateValue: Date | null; + dataType: number; + createdAt: Date; +} + +export interface SiteConfig { + hostname: string; + pages: PageConfig[]; + journeys: JourneyConfig[]; + customEvents: CustomEventConfig[]; +} + +function getPageTitle(pages: PageConfig[], path: string): string | null { + const page = pages.find(p => p.path === path); + return page?.title ?? null; +} + +function getPageTimeOnPage(pages: PageConfig[], path: string): number { + const page = pages.find(p => p.path === path); + return page?.avgTimeOnPage ?? 30; +} + +export function generateEventsForSession( + session: SessionData, + siteConfig: SiteConfig, + journey: string[], +): { events: EventData[]; eventDataEntries: EventDataEntry[] } { + const events: EventData[] = []; + const eventDataEntries: EventDataEntry[] = []; + const visitId = uuid(); + + let currentTime = session.createdAt; + const referrer = getRandomReferrer(); + + for (let i = 0; i < journey.length; i++) { + const pagePath = journey[i]; + const isFirstPage = i === 0; + + const eventId = uuid(); + const pageTitle = getPageTitle(siteConfig.pages, pagePath); + + events.push({ + id: eventId, + websiteId: session.websiteId, + sessionId: session.id, + visitId, + eventType: EVENT_TYPE.pageView, + urlPath: pagePath, + urlQuery: null, + pageTitle, + hostname: siteConfig.hostname, + referrerDomain: isFirstPage ? referrer.domain : null, + referrerPath: isFirstPage ? referrer.path : null, + utmSource: isFirstPage ? referrer.utmSource : null, + utmMedium: isFirstPage ? referrer.utmMedium : null, + utmCampaign: isFirstPage ? referrer.utmCampaign : null, + utmContent: isFirstPage ? referrer.utmContent : null, + utmTerm: isFirstPage ? referrer.utmTerm : null, + gclid: isFirstPage ? referrer.gclid : null, + fbclid: isFirstPage ? referrer.fbclid : null, + eventName: null, + tag: null, + createdAt: currentTime, + }); + + // Check for custom events on this page + for (const customEvent of siteConfig.customEvents) { + // Check if this event can occur on this page + if (customEvent.pages && !customEvent.pages.includes(pagePath)) { + continue; + } + + // Random chance based on weight + if (Math.random() < customEvent.weight) { + currentTime = addSeconds(currentTime, randomInt(2, 15)); + + const customEventId = uuid(); + events.push({ + id: customEventId, + websiteId: session.websiteId, + sessionId: session.id, + visitId, + eventType: EVENT_TYPE.customEvent, + urlPath: pagePath, + urlQuery: null, + pageTitle, + hostname: siteConfig.hostname, + referrerDomain: null, + referrerPath: null, + utmSource: null, + utmMedium: null, + utmCampaign: null, + utmContent: null, + utmTerm: null, + gclid: null, + fbclid: null, + eventName: customEvent.name, + tag: null, + createdAt: currentTime, + }); + + // Generate event data if configured + if (customEvent.data) { + for (const [key, values] of Object.entries(customEvent.data)) { + const value = values[Math.floor(Math.random() * values.length)]; + const isNumber = typeof value === 'number'; + + eventDataEntries.push({ + id: uuid(), + websiteId: session.websiteId, + websiteEventId: customEventId, + dataKey: key, + stringValue: isNumber ? null : String(value), + numberValue: isNumber ? value : null, + dateValue: null, + dataType: isNumber ? 2 : 1, // 1 = string, 2 = number + createdAt: currentTime, + }); + } + } + } + } + + // Time spent on page before navigating + const timeOnPage = getPageTimeOnPage(siteConfig.pages, pagePath); + const variance = Math.floor(timeOnPage * 0.5); + const actualTime = timeOnPage + randomInt(-variance, variance); + currentTime = addSeconds(currentTime, Math.max(5, actualTime)); + } + + return { events, eventDataEntries }; +} diff --git a/scripts/seed/generators/revenue.ts b/scripts/seed/generators/revenue.ts new file mode 100644 index 00000000..deea9e6b --- /dev/null +++ b/scripts/seed/generators/revenue.ts @@ -0,0 +1,65 @@ +import { uuid, randomFloat } from '../utils.js'; +import type { EventData } from './events.js'; + +export interface RevenueConfig { + eventName: string; + minAmount: number; + maxAmount: number; + currency: string; + weight: number; +} + +export interface RevenueData { + id: string; + websiteId: string; + sessionId: string; + eventId: string; + eventName: string; + currency: string; + revenue: number; + createdAt: Date; +} + +export function generateRevenue(event: EventData, config: RevenueConfig): RevenueData | null { + if (event.eventName !== config.eventName) { + return null; + } + + if (Math.random() > config.weight) { + return null; + } + + const revenue = randomFloat(config.minAmount, config.maxAmount); + + return { + id: uuid(), + websiteId: event.websiteId, + sessionId: event.sessionId, + eventId: event.id, + eventName: event.eventName!, + currency: config.currency, + revenue: Math.round(revenue * 100) / 100, // Round to 2 decimal places + createdAt: event.createdAt, + }; +} + +export function generateRevenueForEvents( + events: EventData[], + configs: RevenueConfig[], +): RevenueData[] { + const revenueEntries: RevenueData[] = []; + + for (const event of events) { + if (!event.eventName) continue; + + for (const config of configs) { + const revenue = generateRevenue(event, config); + if (revenue) { + revenueEntries.push(revenue); + break; // Only one revenue per event + } + } + } + + return revenueEntries; +} diff --git a/scripts/seed/generators/sessions.ts b/scripts/seed/generators/sessions.ts new file mode 100644 index 00000000..1370511f --- /dev/null +++ b/scripts/seed/generators/sessions.ts @@ -0,0 +1,52 @@ +import { uuid } from '../utils.js'; +import { getRandomDevice } from '../distributions/devices.js'; +import { getRandomGeo, getRandomLanguage } from '../distributions/geographic.js'; +import { generateTimestampForDay } from '../distributions/temporal.js'; + +export interface SessionData { + id: string; + websiteId: string; + browser: string; + os: string; + device: string; + screen: string; + language: string; + country: string; + region: string; + city: string; + createdAt: Date; +} + +export function createSession(websiteId: string, day: Date): SessionData { + const deviceInfo = getRandomDevice(); + const geo = getRandomGeo(); + const language = getRandomLanguage(); + const createdAt = generateTimestampForDay(day); + + return { + id: uuid(), + websiteId, + browser: deviceInfo.browser, + os: deviceInfo.os, + device: deviceInfo.device, + screen: deviceInfo.screen, + language, + country: geo.country, + region: geo.region, + city: geo.city, + createdAt, + }; +} + +export function createSessions(websiteId: string, day: Date, count: number): SessionData[] { + const sessions: SessionData[] = []; + + for (let i = 0; i < count; i++) { + sessions.push(createSession(websiteId, day)); + } + + // Sort by createdAt to maintain chronological order + sessions.sort((a, b) => a.createdAt.getTime() - b.createdAt.getTime()); + + return sessions; +} diff --git a/scripts/seed/index.ts b/scripts/seed/index.ts new file mode 100644 index 00000000..5b9de8de --- /dev/null +++ b/scripts/seed/index.ts @@ -0,0 +1,378 @@ +/* eslint-disable no-console */ +import 'dotenv/config'; +import { PrismaPg } from '@prisma/adapter-pg'; +import { PrismaClient, Prisma } from '../../src/generated/prisma/client.js'; +import { uuid, generateDatesBetween, subDays, formatNumber, progressBar } from './utils.js'; +import { createSessions, type SessionData } from './generators/sessions.js'; +import { + generateEventsForSession, + type EventData, + type EventDataEntry, +} from './generators/events.js'; +import { + generateRevenueForEvents, + type RevenueData, + type RevenueConfig, +} from './generators/revenue.js'; +import { getSessionCountForDay } from './distributions/temporal.js'; +import { + BLOG_WEBSITE_NAME, + BLOG_WEBSITE_DOMAIN, + BLOG_SESSIONS_PER_DAY, + getBlogSiteConfig, + getBlogJourney, +} from './sites/blog.js'; +import { + SAAS_WEBSITE_NAME, + SAAS_WEBSITE_DOMAIN, + SAAS_SESSIONS_PER_DAY, + getSaasSiteConfig, + getSaasJourney, + saasRevenueConfigs, +} from './sites/saas.js'; + +const BATCH_SIZE = 1000; + +type SessionCreateInput = Prisma.SessionCreateManyInput; +type WebsiteEventCreateInput = Prisma.WebsiteEventCreateManyInput; +type EventDataCreateInput = Prisma.EventDataCreateManyInput; +type RevenueCreateInput = Prisma.RevenueCreateManyInput; + +export interface SeedConfig { + days: number; + clear: boolean; + verbose: boolean; +} + +export interface SeedResult { + websites: number; + sessions: number; + events: number; + eventData: number; + revenue: number; +} + +async function batchInsertSessions( + prisma: PrismaClient, + data: SessionCreateInput[], + verbose: boolean, +): Promise { + for (let i = 0; i < data.length; i += BATCH_SIZE) { + const batch = data.slice(i, i + BATCH_SIZE); + await prisma.session.createMany({ data: batch, skipDuplicates: true }); + if (verbose) { + console.log( + ` Inserted ${Math.min(i + BATCH_SIZE, data.length)}/${data.length} session records`, + ); + } + } +} + +async function batchInsertEvents( + prisma: PrismaClient, + data: WebsiteEventCreateInput[], + verbose: boolean, +): Promise { + for (let i = 0; i < data.length; i += BATCH_SIZE) { + const batch = data.slice(i, i + BATCH_SIZE); + await prisma.websiteEvent.createMany({ data: batch, skipDuplicates: true }); + if (verbose) { + console.log( + ` Inserted ${Math.min(i + BATCH_SIZE, data.length)}/${data.length} event records`, + ); + } + } +} + +async function batchInsertEventData( + prisma: PrismaClient, + data: EventDataCreateInput[], + verbose: boolean, +): Promise { + for (let i = 0; i < data.length; i += BATCH_SIZE) { + const batch = data.slice(i, i + BATCH_SIZE); + await prisma.eventData.createMany({ data: batch, skipDuplicates: true }); + if (verbose) { + console.log( + ` Inserted ${Math.min(i + BATCH_SIZE, data.length)}/${data.length} eventData records`, + ); + } + } +} + +async function batchInsertRevenue( + prisma: PrismaClient, + data: RevenueCreateInput[], + verbose: boolean, +): Promise { + for (let i = 0; i < data.length; i += BATCH_SIZE) { + const batch = data.slice(i, i + BATCH_SIZE); + await prisma.revenue.createMany({ data: batch, skipDuplicates: true }); + if (verbose) { + console.log( + ` Inserted ${Math.min(i + BATCH_SIZE, data.length)}/${data.length} revenue records`, + ); + } + } +} + +async function findAdminUser(prisma: PrismaClient): Promise { + const adminUser = await prisma.user.findFirst({ + where: { role: 'admin' }, + select: { id: true }, + }); + + if (!adminUser) { + throw new Error( + 'No admin user found in the database.\n' + + 'Please ensure you have run the initial setup and created an admin user.\n' + + 'The default admin user is created during first build (username: admin, password: umami).', + ); + } + + return adminUser.id; +} + +async function createWebsite( + prisma: PrismaClient, + name: string, + domain: string, + adminUserId: string, +): Promise { + const websiteId = uuid(); + + await prisma.website.create({ + data: { + id: websiteId, + name, + domain, + userId: adminUserId, + createdBy: adminUserId, + }, + }); + + return websiteId; +} + +async function clearDemoData(prisma: PrismaClient): Promise { + console.log('Clearing existing demo data...'); + + const demoWebsites = await prisma.website.findMany({ + where: { + OR: [{ name: BLOG_WEBSITE_NAME }, { name: SAAS_WEBSITE_NAME }], + }, + select: { id: true }, + }); + + const websiteIds = demoWebsites.map(w => w.id); + + if (websiteIds.length === 0) { + console.log(' No existing demo websites found'); + return; + } + + console.log(` Found ${websiteIds.length} demo website(s)`); + + // Delete in correct order due to foreign key constraints + await prisma.revenue.deleteMany({ where: { websiteId: { in: websiteIds } } }); + await prisma.eventData.deleteMany({ where: { websiteId: { in: websiteIds } } }); + await prisma.sessionData.deleteMany({ where: { websiteId: { in: websiteIds } } }); + await prisma.websiteEvent.deleteMany({ where: { websiteId: { in: websiteIds } } }); + await prisma.session.deleteMany({ where: { websiteId: { in: websiteIds } } }); + await prisma.segment.deleteMany({ where: { websiteId: { in: websiteIds } } }); + await prisma.report.deleteMany({ where: { websiteId: { in: websiteIds } } }); + await prisma.website.deleteMany({ where: { id: { in: websiteIds } } }); + + console.log(' Cleared existing demo data'); +} + +interface SiteGeneratorConfig { + name: string; + domain: string; + sessionsPerDay: number; + getSiteConfig: () => ReturnType; + getJourney: () => string[]; + revenueConfigs?: RevenueConfig[]; +} + +async function generateSiteData( + prisma: PrismaClient, + config: SiteGeneratorConfig, + days: Date[], + adminUserId: string, + verbose: boolean, +): Promise<{ sessions: number; events: number; eventData: number; revenue: number }> { + console.log(`\nGenerating data for ${config.name}...`); + + const websiteId = await createWebsite(prisma, config.name, config.domain, adminUserId); + console.log(` Created website: ${config.name} (${websiteId})`); + + const siteConfig = config.getSiteConfig(); + + const allSessions: SessionData[] = []; + const allEvents: EventData[] = []; + const allEventData: EventDataEntry[] = []; + const allRevenue: RevenueData[] = []; + + for (let dayIndex = 0; dayIndex < days.length; dayIndex++) { + const day = days[dayIndex]; + const sessionCount = getSessionCountForDay(config.sessionsPerDay, day); + const sessions = createSessions(websiteId, day, sessionCount); + + for (const session of sessions) { + const journey = config.getJourney(); + const { events, eventDataEntries } = generateEventsForSession(session, siteConfig, journey); + + allSessions.push(session); + allEvents.push(...events); + allEventData.push(...eventDataEntries); + + if (config.revenueConfigs) { + const revenueEntries = generateRevenueForEvents(events, config.revenueConfigs); + allRevenue.push(...revenueEntries); + } + } + + // Show progress (every day in verbose mode, otherwise every 2 days) + const shouldShowProgress = verbose || dayIndex % 2 === 0 || dayIndex === days.length - 1; + if (shouldShowProgress) { + process.stdout.write( + `\r ${progressBar(dayIndex + 1, days.length)} Day ${dayIndex + 1}/${days.length}`, + ); + } + } + + console.log(''); // New line after progress bar + + // Batch insert all data + console.log(` Inserting ${formatNumber(allSessions.length)} sessions...`); + await batchInsertSessions(prisma, allSessions as SessionCreateInput[], verbose); + + console.log(` Inserting ${formatNumber(allEvents.length)} events...`); + await batchInsertEvents(prisma, allEvents as WebsiteEventCreateInput[], verbose); + + if (allEventData.length > 0) { + console.log(` Inserting ${formatNumber(allEventData.length)} event data entries...`); + await batchInsertEventData(prisma, allEventData as EventDataCreateInput[], verbose); + } + + if (allRevenue.length > 0) { + console.log(` Inserting ${formatNumber(allRevenue.length)} revenue entries...`); + await batchInsertRevenue(prisma, allRevenue as RevenueCreateInput[], verbose); + } + + return { + sessions: allSessions.length, + events: allEvents.length, + eventData: allEventData.length, + revenue: allRevenue.length, + }; +} + +function createPrismaClient(): PrismaClient { + const url = process.env.DATABASE_URL; + if (!url) { + throw new Error( + 'DATABASE_URL environment variable is not set.\n' + + 'Please set DATABASE_URL in your .env file or environment.\n' + + 'Example: DATABASE_URL=postgresql://user:password@localhost:5432/umami', + ); + } + + let schema: string | undefined; + try { + const connectionUrl = new URL(url); + schema = connectionUrl.searchParams.get('schema') ?? undefined; + } catch { + throw new Error( + 'DATABASE_URL is not a valid URL.\n' + + 'Expected format: postgresql://user:password@host:port/database\n' + + `Received: ${url.substring(0, 30)}...`, + ); + } + + const adapter = new PrismaPg({ connectionString: url }, { schema }); + + return new PrismaClient({ + adapter, + errorFormat: 'pretty', + }); +} + +export async function seed(config: SeedConfig): Promise { + const prisma = createPrismaClient(); + + try { + const endDate = new Date(); + const startDate = subDays(endDate, config.days); + const days = generateDatesBetween(startDate, endDate); + + console.log(`\nSeed Configuration:`); + console.log( + ` Date range: ${startDate.toISOString().split('T')[0]} to ${endDate.toISOString().split('T')[0]}`, + ); + console.log(` Days: ${days.length}`); + console.log(` Clear existing: ${config.clear}`); + + if (config.clear) { + await clearDemoData(prisma); + } + + // Find admin user to own the demo websites + const adminUserId = await findAdminUser(prisma); + console.log(` Using admin user: ${adminUserId}`); + + // Generate Blog site (low traffic) + const blogResults = await generateSiteData( + prisma, + { + name: BLOG_WEBSITE_NAME, + domain: BLOG_WEBSITE_DOMAIN, + sessionsPerDay: BLOG_SESSIONS_PER_DAY, + getSiteConfig: getBlogSiteConfig, + getJourney: getBlogJourney, + }, + days, + adminUserId, + config.verbose, + ); + + // Generate SaaS site (high traffic) + const saasResults = await generateSiteData( + prisma, + { + name: SAAS_WEBSITE_NAME, + domain: SAAS_WEBSITE_DOMAIN, + sessionsPerDay: SAAS_SESSIONS_PER_DAY, + getSiteConfig: getSaasSiteConfig, + getJourney: getSaasJourney, + revenueConfigs: saasRevenueConfigs, + }, + days, + adminUserId, + config.verbose, + ); + + const result: SeedResult = { + websites: 2, + sessions: blogResults.sessions + saasResults.sessions, + events: blogResults.events + saasResults.events, + eventData: blogResults.eventData + saasResults.eventData, + revenue: blogResults.revenue + saasResults.revenue, + }; + + console.log(`\n${'─'.repeat(50)}`); + console.log(`Seed Complete!`); + console.log(`${'─'.repeat(50)}`); + console.log(` Websites: ${formatNumber(result.websites)}`); + console.log(` Sessions: ${formatNumber(result.sessions)}`); + console.log(` Events: ${formatNumber(result.events)}`); + console.log(` Event Data: ${formatNumber(result.eventData)}`); + console.log(` Revenue: ${formatNumber(result.revenue)}`); + console.log(`${'─'.repeat(50)}\n`); + + return result; + } finally { + await prisma.$disconnect(); + } +} diff --git a/scripts/seed/sites/blog.ts b/scripts/seed/sites/blog.ts new file mode 100644 index 00000000..e60b8b95 --- /dev/null +++ b/scripts/seed/sites/blog.ts @@ -0,0 +1,108 @@ +import { weightedRandom, type WeightedOption } from '../utils.js'; +import type { + SiteConfig, + JourneyConfig, + PageConfig, + CustomEventConfig, +} from '../generators/events.js'; + +export const BLOG_WEBSITE_NAME = 'Demo Blog'; +export const BLOG_WEBSITE_DOMAIN = 'blog.example.com'; + +const blogPosts = [ + 'getting-started-with-analytics', + 'privacy-first-tracking', + 'understanding-your-visitors', + 'improving-page-performance', + 'seo-best-practices', + 'content-marketing-guide', + 'building-audience-trust', + 'data-driven-decisions', +]; + +export const blogPages: PageConfig[] = [ + { path: '/', title: 'Demo Blog - Home', weight: 0.25, avgTimeOnPage: 30 }, + { path: '/blog', title: 'Blog Posts', weight: 0.2, avgTimeOnPage: 45 }, + { path: '/about', title: 'About Us', weight: 0.1, avgTimeOnPage: 60 }, + { path: '/contact', title: 'Contact', weight: 0.05, avgTimeOnPage: 45 }, + ...blogPosts.map(slug => ({ + path: `/blog/${slug}`, + title: slug + .split('-') + .map(w => w.charAt(0).toUpperCase() + w.slice(1)) + .join(' '), + weight: 0.05, + avgTimeOnPage: 180, + })), +]; + +export const blogJourneys: JourneyConfig[] = [ + // Direct to blog post (organic search) + { pages: ['/blog/getting-started-with-analytics'], weight: 0.15 }, + { pages: ['/blog/privacy-first-tracking'], weight: 0.12 }, + { pages: ['/blog/understanding-your-visitors'], weight: 0.1 }, + + // Homepage bounces + { pages: ['/'], weight: 0.15 }, + + // Homepage to blog listing + { pages: ['/', '/blog'], weight: 0.1 }, + + // Homepage to blog post + { pages: ['/', '/blog', '/blog/seo-best-practices'], weight: 0.08 }, + { pages: ['/', '/blog', '/blog/content-marketing-guide'], weight: 0.08 }, + + // About page visits + { pages: ['/', '/about'], weight: 0.07 }, + { pages: ['/', '/about', '/contact'], weight: 0.05 }, + + // Blog post to another + { pages: ['/blog/improving-page-performance', '/blog/data-driven-decisions'], weight: 0.05 }, + + // Longer sessions + { pages: ['/', '/blog', '/blog/building-audience-trust', '/about'], weight: 0.05 }, +]; + +export const blogCustomEvents: CustomEventConfig[] = [ + { + name: 'newsletter_signup', + weight: 0.03, + pages: ['/', '/blog'], + }, + { + name: 'share_click', + weight: 0.05, + pages: blogPosts.map(slug => `/blog/${slug}`), + data: { + platform: ['twitter', 'linkedin', 'facebook', 'copy_link'], + }, + }, + { + name: 'scroll_depth', + weight: 0.2, + pages: blogPosts.map(slug => `/blog/${slug}`), + data: { + depth: [25, 50, 75, 100], + }, + }, +]; + +export function getBlogSiteConfig(): SiteConfig { + return { + hostname: BLOG_WEBSITE_DOMAIN, + pages: blogPages, + journeys: blogJourneys, + customEvents: blogCustomEvents, + }; +} + +export function getBlogJourney(): string[] { + const journeyWeights: WeightedOption[] = blogJourneys.map(j => ({ + value: j.pages, + weight: j.weight, + })); + + return weightedRandom(journeyWeights); +} + +export const BLOG_SESSIONS_PER_DAY = 3; // ~90 sessions per month diff --git a/scripts/seed/sites/saas.ts b/scripts/seed/sites/saas.ts new file mode 100644 index 00000000..133895af --- /dev/null +++ b/scripts/seed/sites/saas.ts @@ -0,0 +1,185 @@ +import { weightedRandom, type WeightedOption } from '../utils.js'; +import type { + SiteConfig, + JourneyConfig, + PageConfig, + CustomEventConfig, +} from '../generators/events.js'; +import type { RevenueConfig } from '../generators/revenue.js'; + +export const SAAS_WEBSITE_NAME = 'Demo SaaS'; +export const SAAS_WEBSITE_DOMAIN = 'app.example.com'; + +const docsSections = [ + 'getting-started', + 'installation', + 'configuration', + 'api-reference', + 'integrations', +]; + +const blogPosts = [ + 'announcing-v2', + 'customer-success-story', + 'product-roadmap', + 'security-best-practices', +]; + +export const saasPages: PageConfig[] = [ + { path: '/', title: 'Demo SaaS - Analytics Made Simple', weight: 0.2, avgTimeOnPage: 45 }, + { path: '/features', title: 'Features', weight: 0.15, avgTimeOnPage: 90 }, + { path: '/pricing', title: 'Pricing', weight: 0.15, avgTimeOnPage: 120 }, + { path: '/docs', title: 'Documentation', weight: 0.1, avgTimeOnPage: 60 }, + { path: '/blog', title: 'Blog', weight: 0.05, avgTimeOnPage: 45 }, + { path: '/signup', title: 'Sign Up', weight: 0.08, avgTimeOnPage: 90 }, + { path: '/login', title: 'Login', weight: 0.05, avgTimeOnPage: 30 }, + { path: '/demo', title: 'Request Demo', weight: 0.05, avgTimeOnPage: 60 }, + ...docsSections.map(slug => ({ + path: `/docs/${slug}`, + title: `Docs: ${slug + .split('-') + .map(w => w.charAt(0).toUpperCase() + w.slice(1)) + .join(' ')}`, + weight: 0.02, + avgTimeOnPage: 180, + })), + ...blogPosts.map(slug => ({ + path: `/blog/${slug}`, + title: slug + .split('-') + .map(w => w.charAt(0).toUpperCase() + w.slice(1)) + .join(' '), + weight: 0.02, + avgTimeOnPage: 150, + })), +]; + +export const saasJourneys: JourneyConfig[] = [ + // Conversion funnel + { pages: ['/', '/features', '/pricing', '/signup'], weight: 0.12 }, + { pages: ['/', '/pricing', '/signup'], weight: 0.1 }, + { pages: ['/pricing', '/signup'], weight: 0.08 }, + + // Feature exploration + { pages: ['/', '/features'], weight: 0.1 }, + { pages: ['/', '/features', '/pricing'], weight: 0.08 }, + + // Documentation users + { pages: ['/docs', '/docs/getting-started'], weight: 0.08 }, + { pages: ['/docs/getting-started', '/docs/installation', '/docs/configuration'], weight: 0.06 }, + { pages: ['/docs/api-reference'], weight: 0.05 }, + + // Blog readers + { pages: ['/blog/announcing-v2'], weight: 0.05 }, + { pages: ['/blog/customer-success-story'], weight: 0.04 }, + + // Returning users + { pages: ['/login'], weight: 0.08 }, + + // Bounces + { pages: ['/'], weight: 0.08 }, + { pages: ['/pricing'], weight: 0.05 }, + + // Demo requests + { pages: ['/', '/demo'], weight: 0.03 }, +]; + +export const saasCustomEvents: CustomEventConfig[] = [ + { + name: 'signup_started', + weight: 0.6, + pages: ['/signup'], + data: { + plan: ['free', 'pro', 'enterprise'], + }, + }, + { + name: 'signup_completed', + weight: 0.3, + pages: ['/signup'], + data: { + plan: ['free', 'pro', 'enterprise'], + method: ['email', 'google', 'github'], + }, + }, + { + name: 'purchase', + weight: 0.15, + pages: ['/signup', '/pricing'], + data: { + plan: ['pro', 'enterprise'], + billing: ['monthly', 'annual'], + revenue: [29, 49, 99, 299], + currency: ['USD'], + }, + }, + { + name: 'demo_requested', + weight: 0.5, + pages: ['/demo'], + data: { + company_size: ['1-10', '11-50', '51-200', '200+'], + }, + }, + { + name: 'feature_viewed', + weight: 0.3, + pages: ['/features'], + data: { + feature: ['analytics', 'reports', 'api', 'integrations', 'privacy'], + }, + }, + { + name: 'cta_click', + weight: 0.15, + pages: ['/', '/features', '/pricing'], + data: { + button: ['hero_signup', 'nav_signup', 'pricing_cta', 'footer_cta'], + }, + }, + { + name: 'docs_search', + weight: 0.2, + pages: ['/docs', ...docsSections.map(s => `/docs/${s}`)], + data: { + query_type: ['api', 'setup', 'integration', 'troubleshooting'], + }, + }, +]; + +export const saasRevenueConfigs: RevenueConfig[] = [ + { + eventName: 'purchase', + minAmount: 29, + maxAmount: 29, + currency: 'USD', + weight: 0.7, // 70% Pro plan + }, + { + eventName: 'purchase', + minAmount: 299, + maxAmount: 299, + currency: 'USD', + weight: 0.3, // 30% Enterprise + }, +]; + +export function getSaasSiteConfig(): SiteConfig { + return { + hostname: SAAS_WEBSITE_DOMAIN, + pages: saasPages, + journeys: saasJourneys, + customEvents: saasCustomEvents, + }; +} + +export function getSaasJourney(): string[] { + const journeyWeights: WeightedOption[] = saasJourneys.map(j => ({ + value: j.pages, + weight: j.weight, + })); + + return weightedRandom(journeyWeights); +} + +export const SAAS_SESSIONS_PER_DAY = 500; diff --git a/scripts/seed/utils.ts b/scripts/seed/utils.ts new file mode 100644 index 00000000..7b44261e --- /dev/null +++ b/scripts/seed/utils.ts @@ -0,0 +1,85 @@ +import { v4 as uuidv4 } from 'uuid'; + +export interface WeightedOption { + value: T; + weight: number; +} + +export function weightedRandom(options: WeightedOption[]): T { + const totalWeight = options.reduce((sum, opt) => sum + opt.weight, 0); + let random = Math.random() * totalWeight; + + for (const option of options) { + random -= option.weight; + if (random <= 0) { + return option.value; + } + } + + return options[options.length - 1].value; +} + +export function randomInt(min: number, max: number): number { + return Math.floor(Math.random() * (max - min + 1)) + min; +} + +export function randomFloat(min: number, max: number): number { + return Math.random() * (max - min) + min; +} + +export function pickRandom(array: T[]): T { + return array[Math.floor(Math.random() * array.length)]; +} + +export function shuffleArray(array: T[]): T[] { + const result = [...array]; + for (let i = result.length - 1; i > 0; i--) { + const j = Math.floor(Math.random() * (i + 1)); + [result[i], result[j]] = [result[j], result[i]]; + } + return result; +} + +export function uuid(): string { + return uuidv4(); +} + +export function generateDatesBetween(startDate: Date, endDate: Date): Date[] { + const dates: Date[] = []; + const current = new Date(startDate); + current.setHours(0, 0, 0, 0); + + while (current <= endDate) { + dates.push(new Date(current)); + current.setDate(current.getDate() + 1); + } + + return dates; +} + +export function addHours(date: Date, hours: number): Date { + return new Date(date.getTime() + hours * 60 * 60 * 1000); +} + +export function addMinutes(date: Date, minutes: number): Date { + return new Date(date.getTime() + minutes * 60 * 1000); +} + +export function addSeconds(date: Date, seconds: number): Date { + return new Date(date.getTime() + seconds * 1000); +} + +export function subDays(date: Date, days: number): Date { + return new Date(date.getTime() - days * 24 * 60 * 60 * 1000); +} + +export function formatNumber(num: number): string { + return num.toLocaleString(); +} + +export function progressBar(current: number, total: number, width = 30): string { + const percent = current / total; + const filled = Math.round(width * percent); + const empty = width - filled; + return `[${'█'.repeat(filled)}${'░'.repeat(empty)}] ${Math.round(percent * 100)}%`; +} From c481bc5dccda0a86b7ca0883de477874cba407cc Mon Sep 17 00:00:00 2001 From: Arthur Sepiol Date: Tue, 2 Dec 2025 20:25:25 +0300 Subject: [PATCH 17/31] chore: exclude seed scripts from Docker builds --- .dockerignore | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.dockerignore b/.dockerignore index 71cdb8b9..61cb85b9 100644 --- a/.dockerignore +++ b/.dockerignore @@ -7,3 +7,5 @@ node_modules .idea .env .env.* +scripts/seed +scripts/seed-data.ts From 935517ce3a4a2aa046853338bb3e9e40f2a3449e Mon Sep 17 00:00:00 2001 From: Francis Cao Date: Tue, 2 Dec 2025 09:41:46 -0800 Subject: [PATCH 18/31] add cascading deletes to revenue/segment table Closes #3798 --- src/queries/prisma/website.ts | 70 ++++++++++++++++++++--------------- 1 file changed, 41 insertions(+), 29 deletions(-) diff --git a/src/queries/prisma/website.ts b/src/queries/prisma/website.ts index d6ba6d38..79cb7247 100644 --- a/src/queries/prisma/website.ts +++ b/src/queries/prisma/website.ts @@ -137,6 +137,9 @@ export async function resetWebsite(websiteId: string) { return transaction( [ + client.revenue.deleteMany({ + where: { websiteId }, + }), client.eventData.deleteMany({ where: { websiteId }, }), @@ -175,35 +178,44 @@ export async function deleteWebsite(websiteId: string) { const { client, transaction } = prisma; const cloudMode = !!process.env.CLOUD_MODE; - return transaction([ - client.eventData.deleteMany({ - where: { websiteId }, - }), - client.sessionData.deleteMany({ - where: { websiteId }, - }), - client.websiteEvent.deleteMany({ - where: { websiteId }, - }), - client.session.deleteMany({ - where: { websiteId }, - }), - client.report.deleteMany({ - where: { - websiteId, - }, - }), - cloudMode - ? client.website.update({ - data: { - deletedAt: new Date(), - }, - where: { id: websiteId }, - }) - : client.website.delete({ - where: { id: websiteId }, - }), - ]).then(async data => { + return transaction( + [ + client.revenue.deleteMany({ + where: { websiteId }, + }), + client.eventData.deleteMany({ + where: { websiteId }, + }), + client.sessionData.deleteMany({ + where: { websiteId }, + }), + client.websiteEvent.deleteMany({ + where: { websiteId }, + }), + client.session.deleteMany({ + where: { websiteId }, + }), + client.report.deleteMany({ + where: { websiteId }, + }), + client.segment.deleteMany({ + where: { websiteId }, + }), + cloudMode + ? client.website.update({ + data: { + deletedAt: new Date(), + }, + where: { id: websiteId }, + }) + : client.website.delete({ + where: { id: websiteId }, + }), + ], + { + timeout: 30000, + }, + ).then(async data => { if (cloudMode) { await redis.client.del(`website:${websiteId}`); } From 170821e2f958132fd85a27e182fab68f8b400644 Mon Sep 17 00:00:00 2001 From: Mike Cao Date: Tue, 2 Dec 2025 13:45:49 -0800 Subject: [PATCH 19/31] Populate teams on login. Closes #3796 --- src/app/api/auth/login/route.ts | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/app/api/auth/login/route.ts b/src/app/api/auth/login/route.ts index 7c2b2fed..17ca2f7d 100644 --- a/src/app/api/auth/login/route.ts +++ b/src/app/api/auth/login/route.ts @@ -7,7 +7,7 @@ import { checkPassword } from '@/lib/password'; import redis from '@/lib/redis'; import { parseRequest } from '@/lib/request'; import { json, unauthorized } from '@/lib/response'; -import { getUserByUsername } from '@/queries/prisma'; +import { getAllUserTeams, getUserByUsername } from '@/queries/prisma'; export async function POST(request: Request) { const schema = z.object({ @@ -39,8 +39,10 @@ export async function POST(request: Request) { token = createSecureToken({ userId: user.id, role }, secret()); } + const teams = await getAllUserTeams(id); + return json({ token, - user: { id, username, role, createdAt, isAdmin: role === ROLES.admin }, + user: { id, username, role, createdAt, isAdmin: role === ROLES.admin, teams }, }); } From b0f38b266bc6fbc079b65d75bd27b5b925bec827 Mon Sep 17 00:00:00 2001 From: Francis Cao Date: Tue, 2 Dec 2025 14:44:10 -0800 Subject: [PATCH 20/31] truncate large legend labels Closes #3813 --- src/components/metrics/Legend.tsx | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/components/metrics/Legend.tsx b/src/components/metrics/Legend.tsx index 63231919..34ddb5a0 100644 --- a/src/components/metrics/Legend.tsx +++ b/src/components/metrics/Legend.tsx @@ -22,7 +22,12 @@ export function Legend({ return ( onClick(item)}> - + {text} From 22f1b7d7c96d326887f55145d7798d2edb6b26b6 Mon Sep 17 00:00:00 2001 From: Francis Cao Date: Tue, 2 Dec 2025 15:57:45 -0800 Subject: [PATCH 21/31] add theme and locale url parameter options to share page Closes #3754 --- src/app/share/[...shareId]/SharePage.tsx | 22 ++++++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/src/app/share/[...shareId]/SharePage.tsx b/src/app/share/[...shareId]/SharePage.tsx index 55d3ee9f..c1da2168 100644 --- a/src/app/share/[...shareId]/SharePage.tsx +++ b/src/app/share/[...shareId]/SharePage.tsx @@ -1,15 +1,33 @@ 'use client'; -import { Column } from '@umami/react-zen'; +import { Column, useTheme } from '@umami/react-zen'; +import { useEffect } from 'react'; import { WebsiteHeader } from '@/app/(main)/websites/[websiteId]/WebsiteHeader'; import { WebsitePage } from '@/app/(main)/websites/[websiteId]/WebsitePage'; import { WebsiteProvider } from '@/app/(main)/websites/WebsiteProvider'; import { PageBody } from '@/components/common/PageBody'; -import { useShareTokenQuery } from '@/components/hooks'; +import { useLocale, useShareTokenQuery } from '@/components/hooks'; +import { languages } from '@/lib/lang'; import { Footer } from './Footer'; import { Header } from './Header'; export function SharePage({ shareId }) { const { shareToken, isLoading } = useShareTokenQuery(shareId); + const { setTheme } = useTheme(); + const { saveLocale } = useLocale(); + + useEffect(() => { + const url = new URL(window?.location?.href); + const theme = url.searchParams.get('theme'); + const locale = url.searchParams.get('locale'); + + if (theme === 'light' || theme === 'dark') { + setTheme(theme); + } + + if (Object.keys(languages).includes(locale)) { + saveLocale(locale); + } + }, []); if (isLoading || !shareToken) { return null; From f47e1072d9d0c0ba9650cdd5eb1f458f6a1d472a Mon Sep 17 00:00:00 2001 From: Francis Cao Date: Tue, 2 Dec 2025 16:10:11 -0800 Subject: [PATCH 22/31] remove locale code from SharePage --- src/app/share/[...shareId]/SharePage.tsx | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/src/app/share/[...shareId]/SharePage.tsx b/src/app/share/[...shareId]/SharePage.tsx index c1da2168..7ed06673 100644 --- a/src/app/share/[...shareId]/SharePage.tsx +++ b/src/app/share/[...shareId]/SharePage.tsx @@ -5,28 +5,21 @@ import { WebsiteHeader } from '@/app/(main)/websites/[websiteId]/WebsiteHeader'; import { WebsitePage } from '@/app/(main)/websites/[websiteId]/WebsitePage'; import { WebsiteProvider } from '@/app/(main)/websites/WebsiteProvider'; import { PageBody } from '@/components/common/PageBody'; -import { useLocale, useShareTokenQuery } from '@/components/hooks'; -import { languages } from '@/lib/lang'; +import { useShareTokenQuery } from '@/components/hooks'; import { Footer } from './Footer'; import { Header } from './Header'; export function SharePage({ shareId }) { const { shareToken, isLoading } = useShareTokenQuery(shareId); const { setTheme } = useTheme(); - const { saveLocale } = useLocale(); useEffect(() => { const url = new URL(window?.location?.href); const theme = url.searchParams.get('theme'); - const locale = url.searchParams.get('locale'); if (theme === 'light' || theme === 'dark') { setTheme(theme); } - - if (Object.keys(languages).includes(locale)) { - saveLocale(locale); - } }, []); if (isLoading || !shareToken) { From 89b985652ade3ecfca71f9948635accbb35b6aa9 Mon Sep 17 00:00:00 2001 From: Indra Gunawan Date: Wed, 3 Dec 2025 15:31:54 +0800 Subject: [PATCH 23/31] fix: disable prefetch for Links view button --- src/app/(main)/links/[linkId]/LinkHeader.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/app/(main)/links/[linkId]/LinkHeader.tsx b/src/app/(main)/links/[linkId]/LinkHeader.tsx index b7c70f07..33f0c242 100644 --- a/src/app/(main)/links/[linkId]/LinkHeader.tsx +++ b/src/app/(main)/links/[linkId]/LinkHeader.tsx @@ -11,7 +11,7 @@ export function LinkHeader() { return ( } marginBottom="3"> - + From a0940d78a7f0d63c28ecc262d50bb689b3008d45 Mon Sep 17 00:00:00 2001 From: Mike Cao Date: Tue, 2 Dec 2025 23:32:44 -0800 Subject: [PATCH 24/31] Updated packages. --- package.json | 2 +- pnpm-lock.yaml | 157 ++++++++++++++++++++++++++++++------------------- 2 files changed, 96 insertions(+), 63 deletions(-) diff --git a/package.json b/package.json index 077b74d3..fd40f40e 100644 --- a/package.json +++ b/package.json @@ -72,7 +72,7 @@ "@react-spring/web": "^10.0.3", "@svgr/cli": "^8.1.0", "@tanstack/react-query": "^5.90.5", - "@umami/react-zen": "^0.210.0", + "@umami/react-zen": "^0.211.0", "@umami/redis-client": "^0.29.0", "bcryptjs": "^3.0.2", "chalk": "^5.6.2", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index e19b4029..ba2da5a2 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -45,8 +45,8 @@ importers: specifier: ^5.90.5 version: 5.90.10(react@19.2.0) '@umami/react-zen': - specifier: ^0.210.0 - version: 0.210.0(@babel/core@7.28.3)(@types/react@19.2.6)(babel-plugin-react-compiler@19.1.0-rc.2)(immer@10.2.0)(use-sync-external-store@1.6.0(react@19.2.0)) + specifier: ^0.211.0 + version: 0.211.0(@babel/core@7.28.3)(@types/react@19.2.6)(babel-plugin-react-compiler@19.1.0-rc.2)(immer@10.2.0)(use-sync-external-store@1.6.0(react@19.2.0)) '@umami/redis-client': specifier: ^0.29.0 version: 0.29.0 @@ -1693,8 +1693,8 @@ packages: '@next/env@15.5.3': resolution: {integrity: sha512-RSEDTRqyihYXygx/OJXwvVupfr9m04+0vH8vyy0HfZ7keRto6VX9BbEk0J2PUk0VGy6YhklJUSrgForov5F9pw==} - '@next/env@15.5.6': - resolution: {integrity: sha512-3qBGRW+sCGzgbpc5TS1a0p7eNxnOarGVQhZxfvTdnV0gFI61lX7QNtQ4V1TSREctXzYn5NetbUsLvyqwLFJM6Q==} + '@next/env@16.0.6': + resolution: {integrity: sha512-PFTK/G/vM3UJwK5XDYMFOqt8QW42mmhSgdKDapOlCqBUAOfJN2dyOnASR/xUR/JRrro0pLohh/zOJ77xUQWQAg==} '@next/swc-darwin-arm64@15.5.3': resolution: {integrity: sha512-nzbHQo69+au9wJkGKTU9lP7PXv0d1J5ljFpvb+LnEomLtSbJkbZyEs6sbF3plQmiOB2l9OBtN2tNSvCH1nQ9Jg==} @@ -1702,8 +1702,8 @@ packages: cpu: [arm64] os: [darwin] - '@next/swc-darwin-arm64@15.5.6': - resolution: {integrity: sha512-ES3nRz7N+L5Umz4KoGfZ4XX6gwHplwPhioVRc25+QNsDa7RtUF/z8wJcbuQ2Tffm5RZwuN2A063eapoJ1u4nPg==} + '@next/swc-darwin-arm64@16.0.6': + resolution: {integrity: sha512-AGzKiPlDiui+9JcPRHLI4V9WFTTcKukhJTfK9qu3e0tz+Y/88B7vo5yZoO7UaikplJEHORzG3QaBFQfkjhnL0Q==} engines: {node: '>= 10'} cpu: [arm64] os: [darwin] @@ -1714,8 +1714,8 @@ packages: cpu: [x64] os: [darwin] - '@next/swc-darwin-x64@15.5.6': - resolution: {integrity: sha512-JIGcytAyk9LQp2/nuVZPAtj8uaJ/zZhsKOASTjxDug0SPU9LAM3wy6nPU735M1OqacR4U20LHVF5v5Wnl9ptTA==} + '@next/swc-darwin-x64@16.0.6': + resolution: {integrity: sha512-LlLLNrK9WCIUkq2GciWDcquXYIf7vLxX8XE49gz7EncssZGL1vlHwgmURiJsUZAvk0HM1a8qb1ABDezsjAE/jw==} engines: {node: '>= 10'} cpu: [x64] os: [darwin] @@ -1726,8 +1726,8 @@ packages: cpu: [arm64] os: [linux] - '@next/swc-linux-arm64-gnu@15.5.6': - resolution: {integrity: sha512-qvz4SVKQ0P3/Im9zcS2RmfFL/UCQnsJKJwQSkissbngnB/12c6bZTCB0gHTexz1s6d/mD0+egPKXAIRFVS7hQg==} + '@next/swc-linux-arm64-gnu@16.0.6': + resolution: {integrity: sha512-r04NzmLSGGfG8EPXKVK72N5zDNnq9pa9el78LhdtqIC3zqKh74QfKHnk24DoK4PEs6eY7sIK/CnNpt30oc59kg==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] @@ -1738,8 +1738,8 @@ packages: cpu: [arm64] os: [linux] - '@next/swc-linux-arm64-musl@15.5.6': - resolution: {integrity: sha512-FsbGVw3SJz1hZlvnWD+T6GFgV9/NYDeLTNQB2MXoPN5u9VA9OEDy6fJEfePfsUKAhJufFbZLgp0cPxMuV6SV0w==} + '@next/swc-linux-arm64-musl@16.0.6': + resolution: {integrity: sha512-hfB/QV0hA7lbD1OJxp52wVDlpffUMfyxUB5ysZbb/pBC5iuhyLcEKSVQo56PFUUmUQzbMsAtUu6k2Gh9bBtWXA==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] @@ -1750,8 +1750,8 @@ packages: cpu: [x64] os: [linux] - '@next/swc-linux-x64-gnu@15.5.6': - resolution: {integrity: sha512-3QnHGFWlnvAgyxFxt2Ny8PTpXtQD7kVEeaFat5oPAHHI192WKYB+VIKZijtHLGdBBvc16tiAkPTDmQNOQ0dyrA==} + '@next/swc-linux-x64-gnu@16.0.6': + resolution: {integrity: sha512-PZJushBgfvKhJBy01yXMdgL+l5XKr7uSn5jhOQXQXiH3iPT2M9iG64yHpPNGIKitKrHJInwmhPVGogZBAJOCPw==} engines: {node: '>= 10'} cpu: [x64] os: [linux] @@ -1762,8 +1762,8 @@ packages: cpu: [x64] os: [linux] - '@next/swc-linux-x64-musl@15.5.6': - resolution: {integrity: sha512-OsGX148sL+TqMK9YFaPFPoIaJKbFJJxFzkXZljIgA9hjMjdruKht6xDCEv1HLtlLNfkx3c5w2GLKhj7veBQizQ==} + '@next/swc-linux-x64-musl@16.0.6': + resolution: {integrity: sha512-LqY76IojrH9yS5fyATjLzlOIOgwyzBuNRqXwVxcGfZ58DWNQSyfnLGlfF6shAEqjwlDNLh4Z+P0rnOI87Y9jEw==} engines: {node: '>= 10'} cpu: [x64] os: [linux] @@ -1774,8 +1774,8 @@ packages: cpu: [arm64] os: [win32] - '@next/swc-win32-arm64-msvc@15.5.6': - resolution: {integrity: sha512-ONOMrqWxdzXDJNh2n60H6gGyKed42Ieu6UTVPZteXpuKbLZTH4G4eBMsr5qWgOBA+s7F+uB4OJbZnrkEDnZ5Fg==} + '@next/swc-win32-arm64-msvc@16.0.6': + resolution: {integrity: sha512-eIfSNNqAkj0tqKRf0u7BVjqylJCuabSrxnpSENY3YKApqwDMeAqYPmnOwmVe6DDl3Lvkbe7cJAyP6i9hQ5PmmQ==} engines: {node: '>= 10'} cpu: [arm64] os: [win32] @@ -1786,8 +1786,8 @@ packages: cpu: [x64] os: [win32] - '@next/swc-win32-x64-msvc@15.5.6': - resolution: {integrity: sha512-pxK4VIjFRx1MY92UycLOOw7dTdvccWsNETQ0kDHkBlcFH1GrTLUjSiHU1ohrznnux6TqRHgv5oflhfIWZwVROQ==} + '@next/swc-win32-x64-msvc@16.0.6': + resolution: {integrity: sha512-QGs18P4OKdK9y2F3Th42+KGnwsc2iaThOe6jxQgP62kslUU4W+g6AzI6bdIn/pslhSfxjAMU5SjakfT5Fyo/xA==} engines: {node: '>= 10'} cpu: [x64] os: [win32] @@ -2947,8 +2947,8 @@ packages: '@types/yauzl@2.10.3': resolution: {integrity: sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==} - '@umami/react-zen@0.210.0': - resolution: {integrity: sha512-nQ8EfrSleuXMPBVabr6rDoH2VS0ca41A3V2OCQbG4HqgLJ5+Mj8gHT/aLqUz5EKNBAmMy0/XxPNAgsHwwoxrCQ==} + '@umami/react-zen@0.211.0': + resolution: {integrity: sha512-e9dfsmMYpClYU/xQ+nwFo4ktAJc6eth4k6lpdD4j47FD5PaMfSY1FK1qJ7yq/JVN0Ydomc8cuWBDZbHpG4sQmQ==} '@umami/redis-client@0.29.0': resolution: {integrity: sha512-Jaqh++jskqDB7ny75pfC02OvKp1JTS4asGDsFrRL3qy8sxL3PAl9+/mybCJe4/6vWrXDJKqpgkSfUDJq2bFjyw==} @@ -3277,8 +3277,8 @@ packages: caniuse-lite@1.0.30001741: resolution: {integrity: sha512-QGUGitqsc8ARjLdgAfxETDhRbJ0REsP6O3I96TAth/mVjh2cYzN2u+3AzPP3aVSm2FehEItaJw1xd+IGBXWeSw==} - caniuse-lite@1.0.30001756: - resolution: {integrity: sha512-4HnCNKbMLkLdhJz3TToeVWHSnfJvPaq6vu/eRP0Ahub/07n484XHhBF5AJoSGHdVrS8tKFauUQz8Bp9P7LVx7A==} + caniuse-lite@1.0.30001759: + resolution: {integrity: sha512-Pzfx9fOKoKvevQf8oCXoyNRQ5QyxJj+3O0Rqx2V5oxT61KGx8+n6hV/IUyJeifUci2clnmmKVpvtiqRzgiWjSw==} caseless@0.12.0: resolution: {integrity: sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==} @@ -4194,6 +4194,10 @@ packages: resolution: {integrity: sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==} hasBin: true + glob@13.0.0: + resolution: {integrity: sha512-tvZgpqk6fz4BaNZ66ZsRaZnbHvP/jG3uKJvAZOwEVUL4RTA5nJeeLYfyN9/VA8NX/V3IBG+hkeuGpKjvELkVhA==} + engines: {node: 20 || >=22} + glob@7.2.3: resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} deprecated: Glob versions prior to v9 are no longer supported @@ -5037,6 +5041,10 @@ packages: lru-cache@10.4.3: resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} + lru-cache@11.2.4: + resolution: {integrity: sha512-B5Y16Jr9LB9dHVkh6ZevG+vAbOsNOYCX+sXvFWFu7B3Iz5mijW3zdbMyhsh8ANd2mSWBYdJgnqi+mL7/LrOPYg==} + engines: {node: 20 || >=22} + lru-cache@5.1.1: resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} @@ -5044,13 +5052,13 @@ packages: resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} engines: {node: '>=10'} - lucide-react@0.511.0: - resolution: {integrity: sha512-VK5a2ydJ7xm8GvBeKLS9mu1pVK6ucef9780JVUjw6bAjJL/QXnd4Y0p7SPeOUMC27YhzNCZvm5d/QX0Tp3rc0w==} + lucide-react@0.543.0: + resolution: {integrity: sha512-fpVfuOQO0V3HBaOA1stIiP/A2fPCXHIleRZL16Mx3HmjTYwNSbimhnFBygs2CAfU1geexMX5ItUcWBGUaqw5CA==} peerDependencies: react: ^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0 - lucide-react@0.543.0: - resolution: {integrity: sha512-fpVfuOQO0V3HBaOA1stIiP/A2fPCXHIleRZL16Mx3HmjTYwNSbimhnFBygs2CAfU1geexMX5ItUcWBGUaqw5CA==} + lucide-react@0.555.0: + resolution: {integrity: sha512-D8FvHUGbxWBRQM90NZeIyhAvkFfsh3u9ekrMvJ30Z6gnpBHS6HC6ldLg7tL45hwiIz/u66eKDtdA23gwwGsAHA==} peerDependencies: react: ^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0 @@ -5161,6 +5169,10 @@ packages: resolution: {integrity: sha512-IPZ167aShDZZUMdRk66cyQAW3qr0WzbHkPdMYa8bzZhlHhO3jALbKdxcaak7W9FfT2rZNpQuUu4Od7ILEpXSaw==} engines: {node: 20 || >=22} + minimatch@10.1.1: + resolution: {integrity: sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ==} + engines: {node: 20 || >=22} + minimatch@3.1.2: resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} @@ -5249,9 +5261,9 @@ packages: sass: optional: true - next@15.5.6: - resolution: {integrity: sha512-zTxsnI3LQo3c9HSdSf91O1jMNsEzIXDShXd4wVdg9y5shwLqBXi4ZtUUJyB86KGVSJLZx0PFONvO54aheGX8QQ==} - engines: {node: ^18.18.0 || ^19.8.0 || >= 20.0.0} + next@16.0.6: + resolution: {integrity: sha512-2zOZ/4FdaAp5hfCU/RnzARlZzBsjaTZ/XjNQmuyYLluAPM7kcrbIkdeO2SL0Ysd1vnrSgU+GwugfeWX1cUCgCg==} + engines: {node: '>=20.9.0'} hasBin: true peerDependencies: '@opentelemetry/api': ^1.1.0 @@ -5451,6 +5463,10 @@ packages: resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} engines: {node: '>=16 || 14 >=14.18'} + path-scurry@2.0.1: + resolution: {integrity: sha512-oWyT4gICAu+kaA7QWk/jvCHWarMKNs6pXOGWKDTr7cw4IGcUbW+PeTfbaQiLGheFRpjo6O9J0PmyMfQPjH71oA==} + engines: {node: 20 || >=22} + path-type@3.0.0: resolution: {integrity: sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==} engines: {node: '>=4'} @@ -6119,8 +6135,8 @@ packages: peerDependencies: react: '>=16.13.1' - react-hook-form@7.66.1: - resolution: {integrity: sha512-2KnjpgG2Rhbi+CIiIBQQ9Df6sMGH5ExNyFl4Hw9qO7pIqMBR8Bvu9RQyjl3JM4vehzCh9soiNUM/xYMswb2EiA==} + react-hook-form@7.67.0: + resolution: {integrity: sha512-E55EOwKJHHIT/I6J9DmQbCWToAYSw9nN5R57MZw9rMtjh+YQreMDxRLfdjfxQbiJ3/qbg3Z02wGzBX4M+5fMtQ==} engines: {node: '>=18.0.0'} peerDependencies: react: ^16.8.0 || ^17 || ^18 || ^19 @@ -8450,54 +8466,54 @@ snapshots: '@next/env@15.5.3': {} - '@next/env@15.5.6': {} + '@next/env@16.0.6': {} '@next/swc-darwin-arm64@15.5.3': optional: true - '@next/swc-darwin-arm64@15.5.6': + '@next/swc-darwin-arm64@16.0.6': optional: true '@next/swc-darwin-x64@15.5.3': optional: true - '@next/swc-darwin-x64@15.5.6': + '@next/swc-darwin-x64@16.0.6': optional: true '@next/swc-linux-arm64-gnu@15.5.3': optional: true - '@next/swc-linux-arm64-gnu@15.5.6': + '@next/swc-linux-arm64-gnu@16.0.6': optional: true '@next/swc-linux-arm64-musl@15.5.3': optional: true - '@next/swc-linux-arm64-musl@15.5.6': + '@next/swc-linux-arm64-musl@16.0.6': optional: true '@next/swc-linux-x64-gnu@15.5.3': optional: true - '@next/swc-linux-x64-gnu@15.5.6': + '@next/swc-linux-x64-gnu@16.0.6': optional: true '@next/swc-linux-x64-musl@15.5.3': optional: true - '@next/swc-linux-x64-musl@15.5.6': + '@next/swc-linux-x64-musl@16.0.6': optional: true '@next/swc-win32-arm64-msvc@15.5.3': optional: true - '@next/swc-win32-arm64-msvc@15.5.6': + '@next/swc-win32-arm64-msvc@16.0.6': optional: true '@next/swc-win32-x64-msvc@15.5.3': optional: true - '@next/swc-win32-x64-msvc@15.5.6': + '@next/swc-win32-x64-msvc@16.0.6': optional: true '@nodelib/fs.scandir@2.1.5': @@ -10087,21 +10103,21 @@ snapshots: '@types/node': 24.10.1 optional: true - '@umami/react-zen@0.210.0(@babel/core@7.28.3)(@types/react@19.2.6)(babel-plugin-react-compiler@19.1.0-rc.2)(immer@10.2.0)(use-sync-external-store@1.6.0(react@19.2.0))': + '@umami/react-zen@0.211.0(@babel/core@7.28.3)(@types/react@19.2.6)(babel-plugin-react-compiler@19.1.0-rc.2)(immer@10.2.0)(use-sync-external-store@1.6.0(react@19.2.0))': dependencies: '@fontsource/jetbrains-mono': 5.2.8 '@internationalized/date': 3.10.0 '@react-aria/focus': 3.21.2(react-dom@19.2.0(react@19.2.0))(react@19.2.0) '@react-spring/web': 9.7.5(react-dom@19.2.0(react@19.2.0))(react@19.2.0) classnames: 2.5.1 - glob: 10.5.0 + glob: 13.0.0 highlight.js: 11.11.1 - lucide-react: 0.511.0(react@19.2.0) - next: 15.5.6(@babel/core@7.28.3)(babel-plugin-react-compiler@19.1.0-rc.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + lucide-react: 0.555.0(react@19.2.0) + next: 16.0.6(@babel/core@7.28.3)(babel-plugin-react-compiler@19.1.0-rc.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) react: 19.2.0 react-aria-components: 1.13.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0) react-dom: 19.2.0(react@19.2.0) - react-hook-form: 7.66.1(react@19.2.0) + react-hook-form: 7.67.0(react@19.2.0) react-icons: 5.5.0(react@19.2.0) thenby: 1.3.4 zustand: 5.0.8(@types/react@19.2.6)(immer@10.2.0)(react@19.2.0)(use-sync-external-store@1.6.0(react@19.2.0)) @@ -10507,7 +10523,7 @@ snapshots: caniuse-lite@1.0.30001741: {} - caniuse-lite@1.0.30001756: {} + caniuse-lite@1.0.30001759: {} caseless@0.12.0: {} @@ -11616,6 +11632,12 @@ snapshots: package-json-from-dist: 1.0.1 path-scurry: 1.11.1 + glob@13.0.0: + dependencies: + minimatch: 10.1.1 + minipass: 7.1.2 + path-scurry: 2.0.1 + glob@7.2.3: dependencies: fs.realpath: 1.0.0 @@ -12646,6 +12668,8 @@ snapshots: lru-cache@10.4.3: {} + lru-cache@11.2.4: {} + lru-cache@5.1.1: dependencies: yallist: 3.1.1 @@ -12654,11 +12678,11 @@ snapshots: dependencies: yallist: 4.0.0 - lucide-react@0.511.0(react@19.2.0): + lucide-react@0.543.0(react@19.2.0): dependencies: react: 19.2.0 - lucide-react@0.543.0(react@19.2.0): + lucide-react@0.555.0(react@19.2.0): dependencies: react: 19.2.0 @@ -12769,6 +12793,10 @@ snapshots: dependencies: '@isaacs/brace-expansion': 5.0.0 + minimatch@10.1.1: + dependencies: + '@isaacs/brace-expansion': 5.0.0 + minimatch@3.1.2: dependencies: brace-expansion: 1.1.12 @@ -12853,24 +12881,24 @@ snapshots: - '@babel/core' - babel-plugin-macros - next@15.5.6(@babel/core@7.28.3)(babel-plugin-react-compiler@19.1.0-rc.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0): + next@16.0.6(@babel/core@7.28.3)(babel-plugin-react-compiler@19.1.0-rc.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0): dependencies: - '@next/env': 15.5.6 + '@next/env': 16.0.6 '@swc/helpers': 0.5.15 - caniuse-lite: 1.0.30001756 + caniuse-lite: 1.0.30001759 postcss: 8.4.31 react: 19.2.0 react-dom: 19.2.0(react@19.2.0) styled-jsx: 5.1.6(@babel/core@7.28.3)(react@19.2.0) optionalDependencies: - '@next/swc-darwin-arm64': 15.5.6 - '@next/swc-darwin-x64': 15.5.6 - '@next/swc-linux-arm64-gnu': 15.5.6 - '@next/swc-linux-arm64-musl': 15.5.6 - '@next/swc-linux-x64-gnu': 15.5.6 - '@next/swc-linux-x64-musl': 15.5.6 - '@next/swc-win32-arm64-msvc': 15.5.6 - '@next/swc-win32-x64-msvc': 15.5.6 + '@next/swc-darwin-arm64': 16.0.6 + '@next/swc-darwin-x64': 16.0.6 + '@next/swc-linux-arm64-gnu': 16.0.6 + '@next/swc-linux-arm64-musl': 16.0.6 + '@next/swc-linux-x64-gnu': 16.0.6 + '@next/swc-linux-x64-musl': 16.0.6 + '@next/swc-win32-arm64-msvc': 16.0.6 + '@next/swc-win32-x64-msvc': 16.0.6 babel-plugin-react-compiler: 19.1.0-rc.2 sharp: 0.34.5 transitivePeerDependencies: @@ -13055,6 +13083,11 @@ snapshots: lru-cache: 10.4.3 minipass: 7.1.2 + path-scurry@2.0.1: + dependencies: + lru-cache: 11.2.4 + minipass: 7.1.2 + path-type@3.0.0: dependencies: pify: 3.0.0 @@ -13750,7 +13783,7 @@ snapshots: '@babel/runtime': 7.28.3 react: 19.2.0 - react-hook-form@7.66.1(react@19.2.0): + react-hook-form@7.67.0(react@19.2.0): dependencies: react: 19.2.0 From 16cae691f6a814ff8a2dc947ad9c3980afd70ce1 Mon Sep 17 00:00:00 2001 From: Mike Cao Date: Wed, 3 Dec 2025 00:03:56 -0800 Subject: [PATCH 25/31] Don't prefetch links/pixels. Closes #3814 --- package.json | 2 +- pnpm-lock.yaml | 36 +++++++++++++++++++++++--- src/app/(main)/links/LinksTable.tsx | 6 ++++- src/app/(main)/pixels/PixelsTable.tsx | 6 ++++- src/components/common/ExternalLink.tsx | 9 +++++-- 5 files changed, 50 insertions(+), 9 deletions(-) diff --git a/package.json b/package.json index 6a38f854..dc701dfb 100644 --- a/package.json +++ b/package.json @@ -47,7 +47,7 @@ "test": "jest", "cypress-open": "cypress open cypress run", "cypress-run": "cypress run cypress run", - "seed-data": "tsx scripts/seed-data.ts" + "seed-data": "tsx scripts/seed-data.ts", "lint": "biome lint .", "format": "biome format --write .", "check": "biome check --write" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index ba2da5a2..be25301f 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -323,7 +323,10 @@ importers: version: 10.9.2(@types/node@24.10.1)(typescript@5.9.3) tsup: specifier: ^8.5.0 - version: 8.5.1(jiti@2.6.1)(postcss@8.5.6)(typescript@5.9.3)(yaml@2.8.1) + version: 8.5.1(jiti@2.6.1)(postcss@8.5.6)(tsx@4.21.0)(typescript@5.9.3)(yaml@2.8.1) + tsx: + specifier: ^4.19.0 + version: 4.21.0 typescript: specifier: ^5.9.3 version: 5.9.3 @@ -4176,6 +4179,9 @@ packages: resolution: {integrity: sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==} engines: {node: '>= 0.4'} + get-tsconfig@4.13.0: + resolution: {integrity: sha512-1VKTZJCwBrvbd+Wn3AOgQP/2Av+TfTCOlE4AcRJE72W1ksZXbAx8PPBR9RzgTeSPzlPMHrbANMH3LbltH73wxQ==} + getos@3.2.1: resolution: {integrity: sha512-U56CfOK17OKgTVqozZjUKNdkfEv6jk5WISBJ8SHoagjE6L69zOwl3Z+O8myjY9MEW3i2HPWQBt/LTbCgcC973Q==} @@ -6287,6 +6293,9 @@ packages: resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} engines: {node: '>=8'} + resolve-pkg-maps@1.0.0: + resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} + resolve.exports@2.0.3: resolution: {integrity: sha512-OcXjMsGdhL4XnbShKpAcSqPMzQoYkYyhbEaeSko47MjRP9NfEQMhZkXL1DoFlt9LWQn4YttrdnV6X2OiyzBi+A==} engines: {node: '>=10'} @@ -6899,6 +6908,11 @@ packages: typescript: optional: true + tsx@4.21.0: + resolution: {integrity: sha512-5C1sg4USs1lfG0GFb2RLXsdpXqBSEhAaA/0kPL01wxzpMqLILNxIxIOKiILz+cdg/pLnOUxFYOR5yhHU666wbw==} + engines: {node: '>=18.0.0'} + hasBin: true + tunnel-agent@0.6.0: resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} @@ -11602,6 +11616,10 @@ snapshots: es-errors: 1.3.0 get-intrinsic: 1.3.0 + get-tsconfig@4.13.0: + dependencies: + resolve-pkg-maps: 1.0.0 + getos@3.2.1: dependencies: async: 3.2.6 @@ -13319,12 +13337,13 @@ snapshots: postcss: 8.5.6 ts-node: 10.9.2(@types/node@24.10.1)(typescript@5.9.3) - postcss-load-config@6.0.1(jiti@2.6.1)(postcss@8.5.6)(yaml@2.8.1): + postcss-load-config@6.0.1(jiti@2.6.1)(postcss@8.5.6)(tsx@4.21.0)(yaml@2.8.1): dependencies: lilconfig: 3.1.3 optionalDependencies: jiti: 2.6.1 postcss: 8.5.6 + tsx: 4.21.0 yaml: 2.8.1 postcss-logical@5.0.4(postcss@8.5.6): @@ -13985,6 +14004,8 @@ snapshots: resolve-from@5.0.0: {} + resolve-pkg-maps@1.0.0: {} + resolve.exports@2.0.3: {} resolve@1.22.10: @@ -14737,7 +14758,7 @@ snapshots: tslib@2.8.1: {} - tsup@8.5.1(jiti@2.6.1)(postcss@8.5.6)(typescript@5.9.3)(yaml@2.8.1): + tsup@8.5.1(jiti@2.6.1)(postcss@8.5.6)(tsx@4.21.0)(typescript@5.9.3)(yaml@2.8.1): dependencies: bundle-require: 5.1.0(esbuild@0.27.0) cac: 6.7.14 @@ -14748,7 +14769,7 @@ snapshots: fix-dts-default-cjs-exports: 1.0.1 joycon: 3.1.1 picocolors: 1.1.1 - postcss-load-config: 6.0.1(jiti@2.6.1)(postcss@8.5.6)(yaml@2.8.1) + postcss-load-config: 6.0.1(jiti@2.6.1)(postcss@8.5.6)(tsx@4.21.0)(yaml@2.8.1) resolve-from: 5.0.0 rollup: 4.53.3 source-map: 0.7.6 @@ -14765,6 +14786,13 @@ snapshots: - tsx - yaml + tsx@4.21.0: + dependencies: + esbuild: 0.27.0 + get-tsconfig: 4.13.0 + optionalDependencies: + fsevents: 2.3.3 + tunnel-agent@0.6.0: dependencies: safe-buffer: 5.2.1 diff --git a/src/app/(main)/links/LinksTable.tsx b/src/app/(main)/links/LinksTable.tsx index 2ce4ba49..a3b4a86a 100644 --- a/src/app/(main)/links/LinksTable.tsx +++ b/src/app/(main)/links/LinksTable.tsx @@ -21,7 +21,11 @@ export function LinksTable(props: DataTableProps) { {({ slug }: any) => { const url = getSlugUrl(slug); - return {url}; + return ( + + {url} + + ); }} diff --git a/src/app/(main)/pixels/PixelsTable.tsx b/src/app/(main)/pixels/PixelsTable.tsx index 48f2121b..48a84589 100644 --- a/src/app/(main)/pixels/PixelsTable.tsx +++ b/src/app/(main)/pixels/PixelsTable.tsx @@ -21,7 +21,11 @@ export function PixelsTable(props: DataTableProps) { {({ slug }: any) => { const url = getSlugUrl(slug); - return {url}; + return ( + + {url} + + ); }} diff --git a/src/components/common/ExternalLink.tsx b/src/components/common/ExternalLink.tsx index 6b6dbb99..dec0d16f 100644 --- a/src/components/common/ExternalLink.tsx +++ b/src/components/common/ExternalLink.tsx @@ -1,8 +1,13 @@ import { Icon, Row, Text } from '@umami/react-zen'; -import Link from 'next/link'; +import Link, { type LinkProps } from 'next/link'; +import type { ReactNode } from 'react'; import { ExternalLink as LinkIcon } from '@/components/icons'; -export function ExternalLink({ href, children, ...props }) { +export function ExternalLink({ + href, + children, + ...props +}: LinkProps & { href: string; children: ReactNode }) { return ( From 6b584338e3a6efd7f32302f2bfb875fa2430013f Mon Sep 17 00:00:00 2001 From: Francis Cao Date: Wed, 3 Dec 2025 11:06:03 -0800 Subject: [PATCH 26/31] fix PageHeader type errors --- src/app/(main)/links/[linkId]/LinkHeader.tsx | 4 ++-- src/app/(main)/pixels/[pixelId]/PixelHeader.tsx | 2 +- src/app/(main)/websites/[websiteId]/WebsiteHeader.tsx | 1 - 3 files changed, 3 insertions(+), 4 deletions(-) diff --git a/src/app/(main)/links/[linkId]/LinkHeader.tsx b/src/app/(main)/links/[linkId]/LinkHeader.tsx index 33f0c242..8e4c9ebc 100644 --- a/src/app/(main)/links/[linkId]/LinkHeader.tsx +++ b/src/app/(main)/links/[linkId]/LinkHeader.tsx @@ -10,8 +10,8 @@ export function LinkHeader() { const link = useLink(); return ( - } marginBottom="3"> - + }> + diff --git a/src/app/(main)/pixels/[pixelId]/PixelHeader.tsx b/src/app/(main)/pixels/[pixelId]/PixelHeader.tsx index 8171aaf1..68fa6561 100644 --- a/src/app/(main)/pixels/[pixelId]/PixelHeader.tsx +++ b/src/app/(main)/pixels/[pixelId]/PixelHeader.tsx @@ -10,7 +10,7 @@ export function PixelHeader() { const pixel = usePixel(); return ( - } marginBottom="3"> + }> diff --git a/src/app/(main)/websites/[websiteId]/WebsiteHeader.tsx b/src/app/(main)/websites/[websiteId]/WebsiteHeader.tsx index e7a92516..7dd1d771 100644 --- a/src/app/(main)/websites/[websiteId]/WebsiteHeader.tsx +++ b/src/app/(main)/websites/[websiteId]/WebsiteHeader.tsx @@ -23,7 +23,6 @@ export function WebsiteHeader({ showActions }: { showActions?: boolean }) { } - marginBottom="3" titleHref={renderUrl(`/websites/${website.id}`, false)} > From 65f657dd230bef9004a6afeb17ec7615e5cab2b2 Mon Sep 17 00:00:00 2001 From: Francis Cao Date: Wed, 3 Dec 2025 11:08:54 -0800 Subject: [PATCH 27/31] Revert "prisma schema boards + varchar length increase" This reverts commit cb034a13710a97a9f04d8ab71726e2ad2a90cc44. --- prisma/migrations/15_boards/migration.sql | 33 ------------ .../migration.sql | 16 ------ prisma/schema.prisma | 54 ++++++------------- 3 files changed, 15 insertions(+), 88 deletions(-) delete mode 100644 prisma/migrations/15_boards/migration.sql delete mode 100644 prisma/migrations/16_update_website_event_length/migration.sql diff --git a/prisma/migrations/15_boards/migration.sql b/prisma/migrations/15_boards/migration.sql deleted file mode 100644 index 09608c5f..00000000 --- a/prisma/migrations/15_boards/migration.sql +++ /dev/null @@ -1,33 +0,0 @@ --- CreateTable -CREATE TABLE "board" ( - "board_id" UUID NOT NULL, - "type" VARCHAR(50) NOT NULL, - "name" VARCHAR(200) NOT NULL, - "description" VARCHAR(500) NOT NULL, - "parameters" JSONB NOT NULL, - "slug" VARCHAR(100) NOT NULL, - "user_id" UUID, - "team_id" UUID, - "created_at" TIMESTAMPTZ(6) DEFAULT CURRENT_TIMESTAMP, - "updated_at" TIMESTAMPTZ(6), - - CONSTRAINT "board_pkey" PRIMARY KEY ("board_id") -); - --- CreateIndex -CREATE UNIQUE INDEX "board_board_id_key" ON "board"("board_id"); - --- CreateIndex -CREATE UNIQUE INDEX "board_slug_key" ON "board"("slug"); - --- CreateIndex -CREATE INDEX "board_slug_idx" ON "board"("slug"); - --- CreateIndex -CREATE INDEX "board_user_id_idx" ON "board"("user_id"); - --- CreateIndex -CREATE INDEX "board_team_id_idx" ON "board"("team_id"); - --- CreateIndex -CREATE INDEX "board_created_at_idx" ON "board"("created_at"); diff --git a/prisma/migrations/16_update_website_event_length/migration.sql b/prisma/migrations/16_update_website_event_length/migration.sql deleted file mode 100644 index 06dd57a6..00000000 --- a/prisma/migrations/16_update_website_event_length/migration.sql +++ /dev/null @@ -1,16 +0,0 @@ --- AlterTable -ALTER TABLE "website_event" ALTER COLUMN "url_path" SET DATA TYPE VARCHAR(1024), -ALTER COLUMN "url_query" SET DATA TYPE VARCHAR(1024), -ALTER COLUMN "referrer_path" SET DATA TYPE VARCHAR(1024), -ALTER COLUMN "referrer_query" SET DATA TYPE VARCHAR(1024), -ALTER COLUMN "fbclid" SET DATA TYPE VARCHAR(1024), -ALTER COLUMN "gclid" SET DATA TYPE VARCHAR(1024), -ALTER COLUMN "li_fat_id" SET DATA TYPE VARCHAR(1024), -ALTER COLUMN "msclkid" SET DATA TYPE VARCHAR(1024), -ALTER COLUMN "ttclid" SET DATA TYPE VARCHAR(1024), -ALTER COLUMN "twclid" SET DATA TYPE VARCHAR(1024), -ALTER COLUMN "utm_campaign" SET DATA TYPE VARCHAR(512), -ALTER COLUMN "utm_content" SET DATA TYPE VARCHAR(512), -ALTER COLUMN "utm_medium" SET DATA TYPE VARCHAR(512), -ALTER COLUMN "utm_source" SET DATA TYPE VARCHAR(512), -ALTER COLUMN "utm_term" SET DATA TYPE VARCHAR(512); diff --git a/prisma/schema.prisma b/prisma/schema.prisma index c0e87e7a..aeb11648 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -27,7 +27,6 @@ model User { pixels Pixel[] @relation("user") teams TeamUser[] reports Report[] - boards Board[] @relation("user") @@map("user") } @@ -100,23 +99,23 @@ model WebsiteEvent { sessionId String @map("session_id") @db.Uuid visitId String @map("visit_id") @db.Uuid createdAt DateTime? @default(now()) @map("created_at") @db.Timestamptz(6) - urlPath String @map("url_path") @db.VarChar(1024) - urlQuery String? @map("url_query") @db.VarChar(1024) - utmSource String? @map("utm_source") @db.VarChar(512) - utmMedium String? @map("utm_medium") @db.VarChar(512) - utmCampaign String? @map("utm_campaign") @db.VarChar(512) - utmContent String? @map("utm_content") @db.VarChar(512) - utmTerm String? @map("utm_term") @db.VarChar(512) - referrerPath String? @map("referrer_path") @db.VarChar(1024) - referrerQuery String? @map("referrer_query") @db.VarChar(1024) + urlPath String @map("url_path") @db.VarChar(500) + urlQuery String? @map("url_query") @db.VarChar(500) + utmSource String? @map("utm_source") @db.VarChar(255) + utmMedium String? @map("utm_medium") @db.VarChar(255) + utmCampaign String? @map("utm_campaign") @db.VarChar(255) + utmContent String? @map("utm_content") @db.VarChar(255) + utmTerm String? @map("utm_term") @db.VarChar(255) + referrerPath String? @map("referrer_path") @db.VarChar(500) + referrerQuery String? @map("referrer_query") @db.VarChar(500) referrerDomain String? @map("referrer_domain") @db.VarChar(500) pageTitle String? @map("page_title") @db.VarChar(500) - gclid String? @db.VarChar(1024) - fbclid String? @db.VarChar(1024) - msclkid String? @db.VarChar(1024) - ttclid String? @db.VarChar(1024) - lifatid String? @map("li_fat_id") @db.VarChar(1024) - twclid String? @db.VarChar(1024) + gclid String? @db.VarChar(255) + fbclid String? @db.VarChar(255) + msclkid String? @db.VarChar(255) + ttclid String? @db.VarChar(255) + lifatid String? @map("li_fat_id") @db.VarChar(255) + twclid String? @db.VarChar(255) eventType Int @default(1) @map("event_type") @db.Integer eventName String? @map("event_name") @db.VarChar(50) tag String? @db.VarChar(50) @@ -200,7 +199,6 @@ model Team { members TeamUser[] links Link[] pixels Pixel[] - boards Board[] @@index([accessCode]) @@map("team") @@ -318,25 +316,3 @@ model Pixel { @@index([createdAt]) @@map("pixel") } - -model Board { - id String @id() @unique() @map("board_id") @db.Uuid - type String @db.VarChar(50) - name String @db.VarChar(200) - description String @db.VarChar(500) - parameters Json - slug String @unique() @db.VarChar(100) - userId String? @map("user_id") @db.Uuid - teamId String? @map("team_id") @db.Uuid - createdAt DateTime? @default(now()) @map("created_at") @db.Timestamptz(6) - updatedAt DateTime? @updatedAt @map("updated_at") @db.Timestamptz(6) - - user User? @relation("user", fields: [userId], references: [id]) - team Team? @relation(fields: [teamId], references: [id]) - - @@index([slug]) - @@index([userId]) - @@index([teamId]) - @@index([createdAt]) - @@map("board") -} \ No newline at end of file From a06490af74b7380b82b0f9a1e1b731b0c9c98d6b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 3 Dec 2025 19:53:10 +0000 Subject: [PATCH 28/31] Bump next from 15.5.3 to 15.5.7 Bumps [next](https://github.com/vercel/next.js) from 15.5.3 to 15.5.7. - [Release notes](https://github.com/vercel/next.js/releases) - [Changelog](https://github.com/vercel/next.js/blob/canary/release.js) - [Commits](https://github.com/vercel/next.js/compare/v15.5.3...v15.5.7) --- updated-dependencies: - dependency-name: next dependency-version: 15.5.7 dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- package.json | 2 +- pnpm-lock.yaml | 540 +++++-------------------------------------------- 2 files changed, 55 insertions(+), 487 deletions(-) diff --git a/package.json b/package.json index fd31320e..16b96742 100644 --- a/package.json +++ b/package.json @@ -108,7 +108,7 @@ "kafkajs": "^2.1.0", "lucide-react": "^0.543.0", "maxmind": "^5.0.0", - "next": "15.5.3", + "next": "15.5.7", "node-fetch": "^3.2.8", "npm-run-all": "^4.1.5", "papaparse": "^5.5.3", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index c4d0c432..e9a63f25 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -135,8 +135,8 @@ importers: specifier: ^5.0.0 version: 5.0.0 next: - specifier: 15.5.3 - version: 15.5.3(@babel/core@7.28.3)(babel-plugin-react-compiler@19.1.0-rc.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + specifier: 15.5.7 + version: 15.5.7(@babel/core@7.28.3)(babel-plugin-react-compiler@19.1.0-rc.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) node-fetch: specifier: ^3.2.8 version: 3.3.2 @@ -364,8 +364,6 @@ importers: specifier: ^5.9.3 version: 5.9.3 - dist: {} - packages: '@ampproject/remapping@2.3.0': @@ -872,14 +870,8 @@ packages: '@emnapi/core@1.4.5': resolution: {integrity: sha512-XsLw1dEOpkSX/WucdqUhPWP7hDxSvZiY+fsUC14h+FtQ2Ifni4znbBt8punRX+Uj2JG/uDb8nEHVKvrVlvdZ5Q==} - '@emnapi/runtime@1.4.5': - resolution: {integrity: sha512-++LApOtY0pEEz1zrd9vy1/zXVaVJJ/EbAF3u0fXIzPJEDtnITsBGbbK0EkM72amhl/R5b+5xx0Y/QhcVOpuulg==} - - '@emnapi/runtime@1.5.0': - resolution: {integrity: sha512-97/BJ3iXHww3djw6hYIfErCZFee7qCtrneuLa20UXFCOTCfBM2cvQHjWJ2EG0s0MtdNwInarqCTz35i4wWXHsQ==} - - '@emnapi/runtime@1.7.0': - resolution: {integrity: sha512-oAYoQnCYaQZKVS53Fq23ceWMRxq5EhQsE0x0RdQ55jT7wagMu5k+fS39v1fiSLrtrLQlXwVINenqhLMtTrV/1Q==} + '@emnapi/runtime@1.7.1': + resolution: {integrity: sha512-PVtJr5CmLwYAU9PZDMITZoR5iAOShYREoR45EyyLrbntV50mdePTgUn4AmOw90Ifcj+x2kRjdzr1HP3RrNiHGA==} '@emnapi/wasi-threads@1.0.4': resolution: {integrity: sha512-PJR+bOmMOPH8AtcTGAyYNiuJ3/Fcoj2XN/gBEWzDIKh254XO+mM9XoXHk5GNEhodxeMznbg7BlRojVbKN+gC6g==} @@ -1160,75 +1152,38 @@ packages: resolution: {integrity: sha512-A5P/LfWGFSl6nsckYtjw9da+19jB8hkJ6ACTGcDfEJ0aE+l2n2El7dsVM7UVHZQ9s2lmYMWlrS21YLy2IR1LUw==} engines: {node: '>=18'} - '@img/sharp-darwin-arm64@0.34.3': - resolution: {integrity: sha512-ryFMfvxxpQRsgZJqBd4wsttYQbCxsJksrv9Lw/v798JcQ8+w84mBWuXwl+TT0WJ/WrYOLaYpwQXi3sA9nTIaIg==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} - cpu: [arm64] - os: [darwin] - '@img/sharp-darwin-arm64@0.34.5': resolution: {integrity: sha512-imtQ3WMJXbMY4fxb/Ndp6HBTNVtWCUI0WdobyheGf5+ad6xX8VIDO8u2xE4qc/fr08CKG/7dDseFtn6M6g/r3w==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm64] os: [darwin] - '@img/sharp-darwin-x64@0.34.3': - resolution: {integrity: sha512-yHpJYynROAj12TA6qil58hmPmAwxKKC7reUqtGLzsOHfP7/rniNGTL8tjWX6L3CTV4+5P4ypcS7Pp+7OB+8ihA==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} - cpu: [x64] - os: [darwin] - '@img/sharp-darwin-x64@0.34.5': resolution: {integrity: sha512-YNEFAF/4KQ/PeW0N+r+aVVsoIY0/qxxikF2SWdp+NRkmMB7y9LBZAVqQ4yhGCm/H3H270OSykqmQMKLBhBJDEw==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [darwin] - '@img/sharp-libvips-darwin-arm64@1.2.0': - resolution: {integrity: sha512-sBZmpwmxqwlqG9ueWFXtockhsxefaV6O84BMOrhtg/YqbTaRdqDE7hxraVE3y6gVM4eExmfzW4a8el9ArLeEiQ==} - cpu: [arm64] - os: [darwin] - '@img/sharp-libvips-darwin-arm64@1.2.4': resolution: {integrity: sha512-zqjjo7RatFfFoP0MkQ51jfuFZBnVE2pRiaydKJ1G/rHZvnsrHAOcQALIi9sA5co5xenQdTugCvtb1cuf78Vf4g==} cpu: [arm64] os: [darwin] - '@img/sharp-libvips-darwin-x64@1.2.0': - resolution: {integrity: sha512-M64XVuL94OgiNHa5/m2YvEQI5q2cl9d/wk0qFTDVXcYzi43lxuiFTftMR1tOnFQovVXNZJ5TURSDK2pNe9Yzqg==} - cpu: [x64] - os: [darwin] - '@img/sharp-libvips-darwin-x64@1.2.4': resolution: {integrity: sha512-1IOd5xfVhlGwX+zXv2N93k0yMONvUlANylbJw1eTah8K/Jtpi15KC+WSiaX/nBmbm2HxRM1gZ0nSdjSsrZbGKg==} cpu: [x64] os: [darwin] - '@img/sharp-libvips-linux-arm64@1.2.0': - resolution: {integrity: sha512-RXwd0CgG+uPRX5YYrkzKyalt2OJYRiJQ8ED/fi1tq9WQW2jsQIn0tqrlR5l5dr/rjqq6AHAxURhj2DVjyQWSOA==} - cpu: [arm64] - os: [linux] - '@img/sharp-libvips-linux-arm64@1.2.4': resolution: {integrity: sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw==} cpu: [arm64] os: [linux] - '@img/sharp-libvips-linux-arm@1.2.0': - resolution: {integrity: sha512-mWd2uWvDtL/nvIzThLq3fr2nnGfyr/XMXlq8ZJ9WMR6PXijHlC3ksp0IpuhK6bougvQrchUAfzRLnbsen0Cqvw==} - cpu: [arm] - os: [linux] - '@img/sharp-libvips-linux-arm@1.2.4': resolution: {integrity: sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A==} cpu: [arm] os: [linux] - '@img/sharp-libvips-linux-ppc64@1.2.0': - resolution: {integrity: sha512-Xod/7KaDDHkYu2phxxfeEPXfVXFKx70EAFZ0qyUdOjCcxbjqyJOEUpDe6RIyaunGxT34Anf9ue/wuWOqBW2WcQ==} - cpu: [ppc64] - os: [linux] - '@img/sharp-libvips-linux-ppc64@1.2.4': resolution: {integrity: sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA==} cpu: [ppc64] @@ -1239,76 +1194,38 @@ packages: cpu: [riscv64] os: [linux] - '@img/sharp-libvips-linux-s390x@1.2.0': - resolution: {integrity: sha512-eMKfzDxLGT8mnmPJTNMcjfO33fLiTDsrMlUVcp6b96ETbnJmd4uvZxVJSKPQfS+odwfVaGifhsB07J1LynFehw==} - cpu: [s390x] - os: [linux] - '@img/sharp-libvips-linux-s390x@1.2.4': resolution: {integrity: sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ==} cpu: [s390x] os: [linux] - '@img/sharp-libvips-linux-x64@1.2.0': - resolution: {integrity: sha512-ZW3FPWIc7K1sH9E3nxIGB3y3dZkpJlMnkk7z5tu1nSkBoCgw2nSRTFHI5pB/3CQaJM0pdzMF3paf9ckKMSE9Tg==} - cpu: [x64] - os: [linux] - '@img/sharp-libvips-linux-x64@1.2.4': resolution: {integrity: sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw==} cpu: [x64] os: [linux] - '@img/sharp-libvips-linuxmusl-arm64@1.2.0': - resolution: {integrity: sha512-UG+LqQJbf5VJ8NWJ5Z3tdIe/HXjuIdo4JeVNADXBFuG7z9zjoegpzzGIyV5zQKi4zaJjnAd2+g2nna8TZvuW9Q==} - cpu: [arm64] - os: [linux] - '@img/sharp-libvips-linuxmusl-arm64@1.2.4': resolution: {integrity: sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw==} cpu: [arm64] os: [linux] - '@img/sharp-libvips-linuxmusl-x64@1.2.0': - resolution: {integrity: sha512-SRYOLR7CXPgNze8akZwjoGBoN1ThNZoqpOgfnOxmWsklTGVfJiGJoC/Lod7aNMGA1jSsKWM1+HRX43OP6p9+6Q==} - cpu: [x64] - os: [linux] - '@img/sharp-libvips-linuxmusl-x64@1.2.4': resolution: {integrity: sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg==} cpu: [x64] os: [linux] - '@img/sharp-linux-arm64@0.34.3': - resolution: {integrity: sha512-QdrKe3EvQrqwkDrtuTIjI0bu6YEJHTgEeqdzI3uWJOH6G1O8Nl1iEeVYRGdj1h5I21CqxSvQp1Yv7xeU3ZewbA==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} - cpu: [arm64] - os: [linux] - '@img/sharp-linux-arm64@0.34.5': resolution: {integrity: sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm64] os: [linux] - '@img/sharp-linux-arm@0.34.3': - resolution: {integrity: sha512-oBK9l+h6KBN0i3dC8rYntLiVfW8D8wH+NPNT3O/WBHeW0OQWCjfWksLUaPidsrDKpJgXp3G3/hkmhptAW0I3+A==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} - cpu: [arm] - os: [linux] - '@img/sharp-linux-arm@0.34.5': resolution: {integrity: sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm] os: [linux] - '@img/sharp-linux-ppc64@0.34.3': - resolution: {integrity: sha512-GLtbLQMCNC5nxuImPR2+RgrviwKwVql28FWZIW1zWruy6zLgA5/x2ZXk3mxj58X/tszVF69KK0Is83V8YgWhLA==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} - cpu: [ppc64] - os: [linux] - '@img/sharp-linux-ppc64@0.34.5': resolution: {integrity: sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} @@ -1321,94 +1238,47 @@ packages: cpu: [riscv64] os: [linux] - '@img/sharp-linux-s390x@0.34.3': - resolution: {integrity: sha512-3gahT+A6c4cdc2edhsLHmIOXMb17ltffJlxR0aC2VPZfwKoTGZec6u5GrFgdR7ciJSsHT27BD3TIuGcuRT0KmQ==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} - cpu: [s390x] - os: [linux] - '@img/sharp-linux-s390x@0.34.5': resolution: {integrity: sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [s390x] os: [linux] - '@img/sharp-linux-x64@0.34.3': - resolution: {integrity: sha512-8kYso8d806ypnSq3/Ly0QEw90V5ZoHh10yH0HnrzOCr6DKAPI6QVHvwleqMkVQ0m+fc7EH8ah0BB0QPuWY6zJQ==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} - cpu: [x64] - os: [linux] - '@img/sharp-linux-x64@0.34.5': resolution: {integrity: sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [linux] - '@img/sharp-linuxmusl-arm64@0.34.3': - resolution: {integrity: sha512-vAjbHDlr4izEiXM1OTggpCcPg9tn4YriK5vAjowJsHwdBIdx0fYRsURkxLG2RLm9gyBq66gwtWI8Gx0/ov+JKQ==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} - cpu: [arm64] - os: [linux] - '@img/sharp-linuxmusl-arm64@0.34.5': resolution: {integrity: sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm64] os: [linux] - '@img/sharp-linuxmusl-x64@0.34.3': - resolution: {integrity: sha512-gCWUn9547K5bwvOn9l5XGAEjVTTRji4aPTqLzGXHvIr6bIDZKNTA34seMPgM0WmSf+RYBH411VavCejp3PkOeQ==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} - cpu: [x64] - os: [linux] - '@img/sharp-linuxmusl-x64@0.34.5': resolution: {integrity: sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [linux] - '@img/sharp-wasm32@0.34.3': - resolution: {integrity: sha512-+CyRcpagHMGteySaWos8IbnXcHgfDn7pO2fiC2slJxvNq9gDipYBN42/RagzctVRKgxATmfqOSulgZv5e1RdMg==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} - cpu: [wasm32] - '@img/sharp-wasm32@0.34.5': resolution: {integrity: sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [wasm32] - '@img/sharp-win32-arm64@0.34.3': - resolution: {integrity: sha512-MjnHPnbqMXNC2UgeLJtX4XqoVHHlZNd+nPt1kRPmj63wURegwBhZlApELdtxM2OIZDRv/DFtLcNhVbd1z8GYXQ==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} - cpu: [arm64] - os: [win32] - '@img/sharp-win32-arm64@0.34.5': resolution: {integrity: sha512-WQ3AgWCWYSb2yt+IG8mnC6Jdk9Whs7O0gxphblsLvdhSpSTtmu69ZG1Gkb6NuvxsNACwiPV6cNSZNzt0KPsw7g==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm64] os: [win32] - '@img/sharp-win32-ia32@0.34.3': - resolution: {integrity: sha512-xuCdhH44WxuXgOM714hn4amodJMZl3OEvf0GVTm0BEyMeA2to+8HEdRPShH0SLYptJY1uBw+SCFP9WVQi1Q/cw==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} - cpu: [ia32] - os: [win32] - '@img/sharp-win32-ia32@0.34.5': resolution: {integrity: sha512-FV9m/7NmeCmSHDD5j4+4pNI8Cp3aW+JvLoXcTUo0IqyjSfAZJ8dIUmijx1qaJsIiU+Hosw6xM5KijAWRJCSgNg==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [ia32] os: [win32] - '@img/sharp-win32-x64@0.34.3': - resolution: {integrity: sha512-OWwz05d++TxzLEv4VnsTz5CmZ6mI6S05sfQGEMrNrQcOEERbX46332IvE7pO/EUiw7jUrrS40z/M7kPyjfl04g==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} - cpu: [x64] - os: [win32] - '@img/sharp-win32-x64@0.34.5': resolution: {integrity: sha512-+29YMsqY2/9eFEiW93eqWnuLcWcufowXewwSNIT6UwZdUUCrM3oFjMWH/Z6/TMmb4hlFenmfAVbpWeup2jryCw==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} @@ -1566,107 +1436,56 @@ packages: resolution: {integrity: sha512-HnMHG0tksVoS2E6ImcX9o/EcVH1dckb8ZL1FyghKRsEPYCo+20hQ6zncd5EEOW7K22UN+n1EprCROWUmsbhYMg==} engines: {node: '>=18.0.0'} - '@next/env@15.5.3': - resolution: {integrity: sha512-RSEDTRqyihYXygx/OJXwvVupfr9m04+0vH8vyy0HfZ7keRto6VX9BbEk0J2PUk0VGy6YhklJUSrgForov5F9pw==} - - '@next/env@15.5.6': - resolution: {integrity: sha512-3qBGRW+sCGzgbpc5TS1a0p7eNxnOarGVQhZxfvTdnV0gFI61lX7QNtQ4V1TSREctXzYn5NetbUsLvyqwLFJM6Q==} + '@next/env@15.5.7': + resolution: {integrity: sha512-4h6Y2NyEkIEN7Z8YxkA27pq6zTkS09bUSYC0xjd0NpwFxjnIKeZEeH591o5WECSmjpUhLn3H2QLJcDye3Uzcvg==} '@next/eslint-plugin-next@14.2.33': resolution: {integrity: sha512-DQTJFSvlB+9JilwqMKJ3VPByBNGxAGFTfJ7BuFj25cVcbBy7jm88KfUN+dngM4D3+UxZ8ER2ft+WH9JccMvxyg==} - '@next/swc-darwin-arm64@15.5.3': - resolution: {integrity: sha512-nzbHQo69+au9wJkGKTU9lP7PXv0d1J5ljFpvb+LnEomLtSbJkbZyEs6sbF3plQmiOB2l9OBtN2tNSvCH1nQ9Jg==} + '@next/swc-darwin-arm64@15.5.7': + resolution: {integrity: sha512-IZwtxCEpI91HVU/rAUOOobWSZv4P2DeTtNaCdHqLcTJU4wdNXgAySvKa/qJCgR5m6KI8UsKDXtO2B31jcaw1Yw==} engines: {node: '>= 10'} cpu: [arm64] os: [darwin] - '@next/swc-darwin-arm64@15.5.6': - resolution: {integrity: sha512-ES3nRz7N+L5Umz4KoGfZ4XX6gwHplwPhioVRc25+QNsDa7RtUF/z8wJcbuQ2Tffm5RZwuN2A063eapoJ1u4nPg==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [darwin] - - '@next/swc-darwin-x64@15.5.3': - resolution: {integrity: sha512-w83w4SkOOhekJOcA5HBvHyGzgV1W/XvOfpkrxIse4uPWhYTTRwtGEM4v/jiXwNSJvfRvah0H8/uTLBKRXlef8g==} + '@next/swc-darwin-x64@15.5.7': + resolution: {integrity: sha512-UP6CaDBcqaCBuiq/gfCEJw7sPEoX1aIjZHnBWN9v9qYHQdMKvCKcAVs4OX1vIjeE+tC5EIuwDTVIoXpUes29lg==} engines: {node: '>= 10'} cpu: [x64] os: [darwin] - '@next/swc-darwin-x64@15.5.6': - resolution: {integrity: sha512-JIGcytAyk9LQp2/nuVZPAtj8uaJ/zZhsKOASTjxDug0SPU9LAM3wy6nPU735M1OqacR4U20LHVF5v5Wnl9ptTA==} - engines: {node: '>= 10'} - cpu: [x64] - os: [darwin] - - '@next/swc-linux-arm64-gnu@15.5.3': - resolution: {integrity: sha512-+m7pfIs0/yvgVu26ieaKrifV8C8yiLe7jVp9SpcIzg7XmyyNE7toC1fy5IOQozmr6kWl/JONC51osih2RyoXRw==} + '@next/swc-linux-arm64-gnu@15.5.7': + resolution: {integrity: sha512-NCslw3GrNIw7OgmRBxHtdWFQYhexoUCq+0oS2ccjyYLtcn1SzGzeM54jpTFonIMUjNbHmpKpziXnpxhSWLcmBA==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - '@next/swc-linux-arm64-gnu@15.5.6': - resolution: {integrity: sha512-qvz4SVKQ0P3/Im9zcS2RmfFL/UCQnsJKJwQSkissbngnB/12c6bZTCB0gHTexz1s6d/mD0+egPKXAIRFVS7hQg==} + '@next/swc-linux-arm64-musl@15.5.7': + resolution: {integrity: sha512-nfymt+SE5cvtTrG9u1wdoxBr9bVB7mtKTcj0ltRn6gkP/2Nu1zM5ei8rwP9qKQP0Y//umK+TtkKgNtfboBxRrw==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - '@next/swc-linux-arm64-musl@15.5.3': - resolution: {integrity: sha512-u3PEIzuguSenoZviZJahNLgCexGFhso5mxWCrrIMdvpZn6lkME5vc/ADZG8UUk5K1uWRy4hqSFECrON6UKQBbQ==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [linux] - - '@next/swc-linux-arm64-musl@15.5.6': - resolution: {integrity: sha512-FsbGVw3SJz1hZlvnWD+T6GFgV9/NYDeLTNQB2MXoPN5u9VA9OEDy6fJEfePfsUKAhJufFbZLgp0cPxMuV6SV0w==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [linux] - - '@next/swc-linux-x64-gnu@15.5.3': - resolution: {integrity: sha512-lDtOOScYDZxI2BENN9m0pfVPJDSuUkAD1YXSvlJF0DKwZt0WlA7T7o3wrcEr4Q+iHYGzEaVuZcsIbCps4K27sA==} + '@next/swc-linux-x64-gnu@15.5.7': + resolution: {integrity: sha512-hvXcZvCaaEbCZcVzcY7E1uXN9xWZfFvkNHwbe/n4OkRhFWrs1J1QV+4U1BN06tXLdaS4DazEGXwgqnu/VMcmqw==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - '@next/swc-linux-x64-gnu@15.5.6': - resolution: {integrity: sha512-3QnHGFWlnvAgyxFxt2Ny8PTpXtQD7kVEeaFat5oPAHHI192WKYB+VIKZijtHLGdBBvc16tiAkPTDmQNOQ0dyrA==} + '@next/swc-linux-x64-musl@15.5.7': + resolution: {integrity: sha512-4IUO539b8FmF0odY6/SqANJdgwn1xs1GkPO5doZugwZ3ETF6JUdckk7RGmsfSf7ws8Qb2YB5It33mvNL/0acqA==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - '@next/swc-linux-x64-musl@15.5.3': - resolution: {integrity: sha512-9vWVUnsx9PrY2NwdVRJ4dUURAQ8Su0sLRPqcCCxtX5zIQUBES12eRVHq6b70bbfaVaxIDGJN2afHui0eDm+cLg==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - - '@next/swc-linux-x64-musl@15.5.6': - resolution: {integrity: sha512-OsGX148sL+TqMK9YFaPFPoIaJKbFJJxFzkXZljIgA9hjMjdruKht6xDCEv1HLtlLNfkx3c5w2GLKhj7veBQizQ==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - - '@next/swc-win32-arm64-msvc@15.5.3': - resolution: {integrity: sha512-1CU20FZzY9LFQigRi6jM45oJMU3KziA5/sSG+dXeVaTm661snQP6xu3ykGxxwU5sLG3sh14teO/IOEPVsQMRfA==} + '@next/swc-win32-arm64-msvc@15.5.7': + resolution: {integrity: sha512-CpJVTkYI3ZajQkC5vajM7/ApKJUOlm6uP4BknM3XKvJ7VXAvCqSjSLmM0LKdYzn6nBJVSjdclx8nYJSa3xlTgQ==} engines: {node: '>= 10'} cpu: [arm64] os: [win32] - '@next/swc-win32-arm64-msvc@15.5.6': - resolution: {integrity: sha512-ONOMrqWxdzXDJNh2n60H6gGyKed42Ieu6UTVPZteXpuKbLZTH4G4eBMsr5qWgOBA+s7F+uB4OJbZnrkEDnZ5Fg==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [win32] - - '@next/swc-win32-x64-msvc@15.5.3': - resolution: {integrity: sha512-JMoLAq3n3y5tKXPQwCK5c+6tmwkuFDa2XAxz8Wm4+IVthdBZdZGh+lmiLUHg9f9IDwIQpUjp+ysd6OkYTyZRZw==} - engines: {node: '>= 10'} - cpu: [x64] - os: [win32] - - '@next/swc-win32-x64-msvc@15.5.6': - resolution: {integrity: sha512-pxK4VIjFRx1MY92UycLOOw7dTdvccWsNETQ0kDHkBlcFH1GrTLUjSiHU1ohrznnux6TqRHgv5oflhfIWZwVROQ==} + '@next/swc-win32-x64-msvc@15.5.7': + resolution: {integrity: sha512-gMzgBX164I6DN+9/PGA+9dQiwmTkE4TloBNx8Kv9UiGARsr9Nba7IpcBRA1iTV9vwlYnrE3Uy6I7Aj6qLjQuqw==} engines: {node: '>= 10'} cpu: [x64] os: [win32] @@ -3401,14 +3220,8 @@ packages: caniuse-api@3.0.0: resolution: {integrity: sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==} - caniuse-lite@1.0.30001735: - resolution: {integrity: sha512-EV/laoX7Wq2J9TQlyIXRxTJqIw4sxfXS4OYgudGxBYRuTv0q7AM6yMEpU/Vo1I94thg9U6EZ2NfZx9GJq83u7w==} - - caniuse-lite@1.0.30001741: - resolution: {integrity: sha512-QGUGitqsc8ARjLdgAfxETDhRbJ0REsP6O3I96TAth/mVjh2cYzN2u+3AzPP3aVSm2FehEItaJw1xd+IGBXWeSw==} - - caniuse-lite@1.0.30001754: - resolution: {integrity: sha512-x6OeBXueoAceOmotzx3PO4Zpt4rzpeIFsSr6AAePTZxSkXiYDUmpypEl7e2+8NCd9bD7bXjqyef8CJYPC1jfxg==} + caniuse-lite@1.0.30001759: + resolution: {integrity: sha512-Pzfx9fOKoKvevQf8oCXoyNRQ5QyxJj+3O0Rqx2V5oxT61KGx8+n6hV/IUyJeifUci2clnmmKVpvtiqRzgiWjSw==} caseless@0.12.0: resolution: {integrity: sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==} @@ -3527,13 +3340,6 @@ packages: color-name@1.1.4: resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} - color-string@1.9.1: - resolution: {integrity: sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==} - - color@4.2.3: - resolution: {integrity: sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==} - engines: {node: '>=12.5.0'} - colord@2.9.3: resolution: {integrity: sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==} @@ -3907,10 +3713,6 @@ packages: resolution: {integrity: sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==} engines: {node: '>=8'} - detect-libc@2.0.4: - resolution: {integrity: sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA==} - engines: {node: '>=8'} - detect-libc@2.1.2: resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} engines: {node: '>=8'} @@ -4782,9 +4584,6 @@ packages: is-arrayish@0.2.1: resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} - is-arrayish@0.3.2: - resolution: {integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==} - is-async-function@2.1.1: resolution: {integrity: sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==} engines: {node: '>= 0.4'} @@ -5630,29 +5429,8 @@ packages: neo-async@2.6.2: resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} - next@15.5.3: - resolution: {integrity: sha512-r/liNAx16SQj4D+XH/oI1dlpv9tdKJ6cONYPwwcCC46f2NjpaRWY+EKCzULfgQYV6YKXjHBchff2IZBSlZmJNw==} - engines: {node: ^18.18.0 || ^19.8.0 || >= 20.0.0} - hasBin: true - peerDependencies: - '@opentelemetry/api': ^1.1.0 - '@playwright/test': ^1.51.1 - babel-plugin-react-compiler: '*' - react: ^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0 - react-dom: ^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0 - sass: ^1.3.0 - peerDependenciesMeta: - '@opentelemetry/api': - optional: true - '@playwright/test': - optional: true - babel-plugin-react-compiler: - optional: true - sass: - optional: true - - next@15.5.6: - resolution: {integrity: sha512-zTxsnI3LQo3c9HSdSf91O1jMNsEzIXDShXd4wVdg9y5shwLqBXi4ZtUUJyB86KGVSJLZx0PFONvO54aheGX8QQ==} + next@15.5.7: + resolution: {integrity: sha512-+t2/0jIJ48kUpGKkdlhgkv+zPTEOoXyr60qXe68eB/pl3CMJaLeIGjzp5D6Oqt25hCBiBTt8wEeeAzfJvUKnPQ==} engines: {node: ^18.18.0 || ^19.8.0 || >= 20.0.0} hasBin: true peerDependencies: @@ -6856,10 +6634,6 @@ packages: setimmediate@1.0.5: resolution: {integrity: sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==} - sharp@0.34.3: - resolution: {integrity: sha512-eX2IQ6nFohW4DbvHIOLRB3MHFpYqaqvXd3Tp5e/T/dSH83fxaNJQRvDMhASmkNTsNTVF2/OOopzRCt7xokgPfg==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} - sharp@0.34.5: resolution: {integrity: sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} @@ -6907,9 +6681,6 @@ packages: resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} engines: {node: '>=14'} - simple-swizzle@0.2.2: - resolution: {integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==} - sisteransi@1.0.5: resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} @@ -8188,17 +7959,7 @@ snapshots: tslib: 2.8.1 optional: true - '@emnapi/runtime@1.4.5': - dependencies: - tslib: 2.8.1 - optional: true - - '@emnapi/runtime@1.5.0': - dependencies: - tslib: 2.8.1 - optional: true - - '@emnapi/runtime@1.7.0': + '@emnapi/runtime@1.7.1': dependencies: tslib: 2.8.1 optional: true @@ -8457,108 +8218,56 @@ snapshots: '@img/colour@1.0.0': optional: true - '@img/sharp-darwin-arm64@0.34.3': - optionalDependencies: - '@img/sharp-libvips-darwin-arm64': 1.2.0 - optional: true - '@img/sharp-darwin-arm64@0.34.5': optionalDependencies: '@img/sharp-libvips-darwin-arm64': 1.2.4 optional: true - '@img/sharp-darwin-x64@0.34.3': - optionalDependencies: - '@img/sharp-libvips-darwin-x64': 1.2.0 - optional: true - '@img/sharp-darwin-x64@0.34.5': optionalDependencies: '@img/sharp-libvips-darwin-x64': 1.2.4 optional: true - '@img/sharp-libvips-darwin-arm64@1.2.0': - optional: true - '@img/sharp-libvips-darwin-arm64@1.2.4': optional: true - '@img/sharp-libvips-darwin-x64@1.2.0': - optional: true - '@img/sharp-libvips-darwin-x64@1.2.4': optional: true - '@img/sharp-libvips-linux-arm64@1.2.0': - optional: true - '@img/sharp-libvips-linux-arm64@1.2.4': optional: true - '@img/sharp-libvips-linux-arm@1.2.0': - optional: true - '@img/sharp-libvips-linux-arm@1.2.4': optional: true - '@img/sharp-libvips-linux-ppc64@1.2.0': - optional: true - '@img/sharp-libvips-linux-ppc64@1.2.4': optional: true '@img/sharp-libvips-linux-riscv64@1.2.4': optional: true - '@img/sharp-libvips-linux-s390x@1.2.0': - optional: true - '@img/sharp-libvips-linux-s390x@1.2.4': optional: true - '@img/sharp-libvips-linux-x64@1.2.0': - optional: true - '@img/sharp-libvips-linux-x64@1.2.4': optional: true - '@img/sharp-libvips-linuxmusl-arm64@1.2.0': - optional: true - '@img/sharp-libvips-linuxmusl-arm64@1.2.4': optional: true - '@img/sharp-libvips-linuxmusl-x64@1.2.0': - optional: true - '@img/sharp-libvips-linuxmusl-x64@1.2.4': optional: true - '@img/sharp-linux-arm64@0.34.3': - optionalDependencies: - '@img/sharp-libvips-linux-arm64': 1.2.0 - optional: true - '@img/sharp-linux-arm64@0.34.5': optionalDependencies: '@img/sharp-libvips-linux-arm64': 1.2.4 optional: true - '@img/sharp-linux-arm@0.34.3': - optionalDependencies: - '@img/sharp-libvips-linux-arm': 1.2.0 - optional: true - '@img/sharp-linux-arm@0.34.5': optionalDependencies: '@img/sharp-libvips-linux-arm': 1.2.4 optional: true - '@img/sharp-linux-ppc64@0.34.3': - optionalDependencies: - '@img/sharp-libvips-linux-ppc64': 1.2.0 - optional: true - '@img/sharp-linux-ppc64@0.34.5': optionalDependencies: '@img/sharp-libvips-linux-ppc64': 1.2.4 @@ -8569,71 +8278,37 @@ snapshots: '@img/sharp-libvips-linux-riscv64': 1.2.4 optional: true - '@img/sharp-linux-s390x@0.34.3': - optionalDependencies: - '@img/sharp-libvips-linux-s390x': 1.2.0 - optional: true - '@img/sharp-linux-s390x@0.34.5': optionalDependencies: '@img/sharp-libvips-linux-s390x': 1.2.4 optional: true - '@img/sharp-linux-x64@0.34.3': - optionalDependencies: - '@img/sharp-libvips-linux-x64': 1.2.0 - optional: true - '@img/sharp-linux-x64@0.34.5': optionalDependencies: '@img/sharp-libvips-linux-x64': 1.2.4 optional: true - '@img/sharp-linuxmusl-arm64@0.34.3': - optionalDependencies: - '@img/sharp-libvips-linuxmusl-arm64': 1.2.0 - optional: true - '@img/sharp-linuxmusl-arm64@0.34.5': optionalDependencies: '@img/sharp-libvips-linuxmusl-arm64': 1.2.4 optional: true - '@img/sharp-linuxmusl-x64@0.34.3': - optionalDependencies: - '@img/sharp-libvips-linuxmusl-x64': 1.2.0 - optional: true - '@img/sharp-linuxmusl-x64@0.34.5': optionalDependencies: '@img/sharp-libvips-linuxmusl-x64': 1.2.4 optional: true - '@img/sharp-wasm32@0.34.3': - dependencies: - '@emnapi/runtime': 1.5.0 - optional: true - '@img/sharp-wasm32@0.34.5': dependencies: - '@emnapi/runtime': 1.7.0 - optional: true - - '@img/sharp-win32-arm64@0.34.3': + '@emnapi/runtime': 1.7.1 optional: true '@img/sharp-win32-arm64@0.34.5': optional: true - '@img/sharp-win32-ia32@0.34.3': - optional: true - '@img/sharp-win32-ia32@0.34.5': optional: true - '@img/sharp-win32-x64@0.34.3': - optional: true - '@img/sharp-win32-x64@0.34.5': optional: true @@ -8897,66 +8572,40 @@ snapshots: '@napi-rs/wasm-runtime@0.2.12': dependencies: '@emnapi/core': 1.4.5 - '@emnapi/runtime': 1.4.5 + '@emnapi/runtime': 1.7.1 '@tybys/wasm-util': 0.10.0 optional: true '@netlify/plugin-nextjs@5.14.4': {} - '@next/env@15.5.3': {} - - '@next/env@15.5.6': {} + '@next/env@15.5.7': {} '@next/eslint-plugin-next@14.2.33': dependencies: glob: 10.3.10 - '@next/swc-darwin-arm64@15.5.3': + '@next/swc-darwin-arm64@15.5.7': optional: true - '@next/swc-darwin-arm64@15.5.6': + '@next/swc-darwin-x64@15.5.7': optional: true - '@next/swc-darwin-x64@15.5.3': + '@next/swc-linux-arm64-gnu@15.5.7': optional: true - '@next/swc-darwin-x64@15.5.6': + '@next/swc-linux-arm64-musl@15.5.7': optional: true - '@next/swc-linux-arm64-gnu@15.5.3': + '@next/swc-linux-x64-gnu@15.5.7': optional: true - '@next/swc-linux-arm64-gnu@15.5.6': + '@next/swc-linux-x64-musl@15.5.7': optional: true - '@next/swc-linux-arm64-musl@15.5.3': + '@next/swc-win32-arm64-msvc@15.5.7': optional: true - '@next/swc-linux-arm64-musl@15.5.6': - optional: true - - '@next/swc-linux-x64-gnu@15.5.3': - optional: true - - '@next/swc-linux-x64-gnu@15.5.6': - optional: true - - '@next/swc-linux-x64-musl@15.5.3': - optional: true - - '@next/swc-linux-x64-musl@15.5.6': - optional: true - - '@next/swc-win32-arm64-msvc@15.5.3': - optional: true - - '@next/swc-win32-arm64-msvc@15.5.6': - optional: true - - '@next/swc-win32-x64-msvc@15.5.3': - optional: true - - '@next/swc-win32-x64-msvc@15.5.6': + '@next/swc-win32-x64-msvc@15.5.7': optional: true '@nodelib/fs.scandir@2.1.5': @@ -10707,7 +10356,7 @@ snapshots: glob: 10.4.5 highlight.js: 11.11.1 lucide-react: 0.511.0(react@19.2.0) - next: 15.5.6(@babel/core@7.28.3)(babel-plugin-react-compiler@19.1.0-rc.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + next: 15.5.7(@babel/core@7.28.3)(babel-plugin-react-compiler@19.1.0-rc.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) react: 19.2.0 react-aria-components: 1.13.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0) react-dom: 19.2.0(react@19.2.0) @@ -11020,7 +10669,7 @@ snapshots: autoprefixer@10.4.21(postcss@8.5.6): dependencies: browserslist: 4.25.2 - caniuse-lite: 1.0.30001735 + caniuse-lite: 1.0.30001759 fraction.js: 4.3.7 normalize-range: 0.1.2 picocolors: 1.1.1 @@ -11147,7 +10796,7 @@ snapshots: browserslist@4.25.2: dependencies: - caniuse-lite: 1.0.30001735 + caniuse-lite: 1.0.30001759 electron-to-chromium: 1.5.202 node-releases: 2.0.19 update-browserslist-db: 1.1.3(browserslist@4.25.2) @@ -11234,15 +10883,11 @@ snapshots: caniuse-api@3.0.0: dependencies: browserslist: 4.25.2 - caniuse-lite: 1.0.30001741 + caniuse-lite: 1.0.30001759 lodash.memoize: 4.1.2 lodash.uniq: 4.5.0 - caniuse-lite@1.0.30001735: {} - - caniuse-lite@1.0.30001741: {} - - caniuse-lite@1.0.30001754: {} + caniuse-lite@1.0.30001759: {} caseless@0.12.0: {} @@ -11344,18 +10989,6 @@ snapshots: color-name@1.1.4: {} - color-string@1.9.1: - dependencies: - color-name: 1.1.4 - simple-swizzle: 0.2.2 - optional: true - - color@4.2.3: - dependencies: - color-convert: 2.0.1 - color-string: 1.9.1 - optional: true - colord@2.9.3: {} colorette@1.4.0: {} @@ -11780,9 +11413,6 @@ snapshots: detect-indent@6.1.0: {} - detect-libc@2.0.4: - optional: true - detect-libc@2.1.2: optional: true @@ -12862,9 +12492,6 @@ snapshots: is-arrayish@0.2.1: {} - is-arrayish@0.3.2: - optional: true - is-async-function@2.1.1: dependencies: async-function: 1.0.0 @@ -13901,48 +13528,24 @@ snapshots: neo-async@2.6.2: {} - next@15.5.3(@babel/core@7.28.3)(babel-plugin-react-compiler@19.1.0-rc.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0): + next@15.5.7(@babel/core@7.28.3)(babel-plugin-react-compiler@19.1.0-rc.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0): dependencies: - '@next/env': 15.5.3 + '@next/env': 15.5.7 '@swc/helpers': 0.5.15 - caniuse-lite: 1.0.30001741 + caniuse-lite: 1.0.30001759 postcss: 8.4.31 react: 19.2.0 react-dom: 19.2.0(react@19.2.0) styled-jsx: 5.1.6(@babel/core@7.28.3)(react@19.2.0) optionalDependencies: - '@next/swc-darwin-arm64': 15.5.3 - '@next/swc-darwin-x64': 15.5.3 - '@next/swc-linux-arm64-gnu': 15.5.3 - '@next/swc-linux-arm64-musl': 15.5.3 - '@next/swc-linux-x64-gnu': 15.5.3 - '@next/swc-linux-x64-musl': 15.5.3 - '@next/swc-win32-arm64-msvc': 15.5.3 - '@next/swc-win32-x64-msvc': 15.5.3 - babel-plugin-react-compiler: 19.1.0-rc.2 - sharp: 0.34.3 - transitivePeerDependencies: - - '@babel/core' - - babel-plugin-macros - - next@15.5.6(@babel/core@7.28.3)(babel-plugin-react-compiler@19.1.0-rc.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0): - dependencies: - '@next/env': 15.5.6 - '@swc/helpers': 0.5.15 - caniuse-lite: 1.0.30001754 - postcss: 8.4.31 - react: 19.2.0 - react-dom: 19.2.0(react@19.2.0) - styled-jsx: 5.1.6(@babel/core@7.28.3)(react@19.2.0) - optionalDependencies: - '@next/swc-darwin-arm64': 15.5.6 - '@next/swc-darwin-x64': 15.5.6 - '@next/swc-linux-arm64-gnu': 15.5.6 - '@next/swc-linux-arm64-musl': 15.5.6 - '@next/swc-linux-x64-gnu': 15.5.6 - '@next/swc-linux-x64-musl': 15.5.6 - '@next/swc-win32-arm64-msvc': 15.5.6 - '@next/swc-win32-x64-msvc': 15.5.6 + '@next/swc-darwin-arm64': 15.5.7 + '@next/swc-darwin-x64': 15.5.7 + '@next/swc-linux-arm64-gnu': 15.5.7 + '@next/swc-linux-arm64-musl': 15.5.7 + '@next/swc-linux-x64-gnu': 15.5.7 + '@next/swc-linux-x64-musl': 15.5.7 + '@next/swc-win32-arm64-msvc': 15.5.7 + '@next/swc-win32-x64-msvc': 15.5.7 babel-plugin-react-compiler: 19.1.0-rc.2 sharp: 0.34.5 transitivePeerDependencies: @@ -15263,36 +14866,6 @@ snapshots: setimmediate@1.0.5: {} - sharp@0.34.3: - dependencies: - color: 4.2.3 - detect-libc: 2.0.4 - semver: 7.7.3 - optionalDependencies: - '@img/sharp-darwin-arm64': 0.34.3 - '@img/sharp-darwin-x64': 0.34.3 - '@img/sharp-libvips-darwin-arm64': 1.2.0 - '@img/sharp-libvips-darwin-x64': 1.2.0 - '@img/sharp-libvips-linux-arm': 1.2.0 - '@img/sharp-libvips-linux-arm64': 1.2.0 - '@img/sharp-libvips-linux-ppc64': 1.2.0 - '@img/sharp-libvips-linux-s390x': 1.2.0 - '@img/sharp-libvips-linux-x64': 1.2.0 - '@img/sharp-libvips-linuxmusl-arm64': 1.2.0 - '@img/sharp-libvips-linuxmusl-x64': 1.2.0 - '@img/sharp-linux-arm': 0.34.3 - '@img/sharp-linux-arm64': 0.34.3 - '@img/sharp-linux-ppc64': 0.34.3 - '@img/sharp-linux-s390x': 0.34.3 - '@img/sharp-linux-x64': 0.34.3 - '@img/sharp-linuxmusl-arm64': 0.34.3 - '@img/sharp-linuxmusl-x64': 0.34.3 - '@img/sharp-wasm32': 0.34.3 - '@img/sharp-win32-arm64': 0.34.3 - '@img/sharp-win32-ia32': 0.34.3 - '@img/sharp-win32-x64': 0.34.3 - optional: true - sharp@0.34.5: dependencies: '@img/colour': 1.0.0 @@ -15371,11 +14944,6 @@ snapshots: signal-exit@4.1.0: {} - simple-swizzle@0.2.2: - dependencies: - is-arrayish: 0.3.2 - optional: true - sisteransi@1.0.5: {} slash@3.0.0: {} From dae7327ed36328aaac95dffc903cd56281e0d2bc Mon Sep 17 00:00:00 2001 From: Francis Cao Date: Wed, 3 Dec 2025 14:47:56 -0800 Subject: [PATCH 29/31] Fix date range increment function Closes #3828 --- src/components/input/WebsiteDateFilter.tsx | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/src/components/input/WebsiteDateFilter.tsx b/src/components/input/WebsiteDateFilter.tsx index beb6f371..18b4f13b 100644 --- a/src/components/input/WebsiteDateFilter.tsx +++ b/src/components/input/WebsiteDateFilter.tsx @@ -1,6 +1,6 @@ import { Button, Icon, ListItem, Row, Select, Text } from '@umami/react-zen'; import { isAfter } from 'date-fns'; -import { useCallback, useMemo } from 'react'; +import { useMemo } from 'react'; import { useDateRange, useDateRangeQuery, useMessages, useNavigation } from '@/components/hooks'; import { ChevronRight } from '@/components/icons'; import { getDateRangeValue } from '@/lib/date'; @@ -45,13 +45,9 @@ export function WebsiteDateFilter({ } }; - const handleIncrement = useCallback( - (increment: number) => { - router.push(updateParams({ offset: +offset + increment })); - }, - [offset], - ); - + const handleIncrement = increment => { + router.push(updateParams({ offset: Number(offset) + increment })); + }; const handleSelect = (compare: any) => { router.push(updateParams({ compare })); }; From 64767b189691ddb0816395a4a0c4c633f829333c Mon Sep 17 00:00:00 2001 From: Mike Cao Date: Wed, 3 Dec 2025 15:11:40 -0800 Subject: [PATCH 30/31] Updated next. Fixed link RSC fetch. --- Dockerfile | 18 +- package.json | 24 +- pnpm-lock.yaml | 2220 ++++++++--------- src/app/(main)/links/[linkId]/LinkHeader.tsx | 11 +- .../(main)/pixels/[pixelId]/PixelHeader.tsx | 11 +- .../websites/[websiteId]/WebsiteHeader.tsx | 1 - src/components/common/LinkButton.tsx | 14 +- src/components/common/PageHeader.tsx | 4 +- 8 files changed, 1155 insertions(+), 1148 deletions(-) diff --git a/Dockerfile b/Dockerfile index 32300687..aa894ea5 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,5 +1,7 @@ +ARG NODE_IMAGE_VERSION="22-alpine" + # Install dependencies only when needed -FROM node:22-alpine AS deps +FROM node:${NODE_IMAGE_VERSION} AS deps # Check https://github.com/nodejs/docker-node/tree/b4117f9333da4138b03a546ec926ef50a31506c3#nodealpine to understand why libc6-compat might be needed. RUN apk add --no-cache libc6-compat WORKDIR /app @@ -8,7 +10,7 @@ RUN npm install -g pnpm RUN pnpm install --frozen-lockfile # Rebuild the source code only when needed -FROM node:22-alpine AS builder +FROM node:${NODE_IMAGE_VERSION} AS builder WORKDIR /app COPY --from=deps /app/node_modules ./node_modules COPY . . @@ -25,9 +27,10 @@ ENV NEXT_TELEMETRY_DISABLED=1 RUN npm run build-docker # Production image, copy all the files and run next -FROM node:22-alpine AS runner +FROM node:${NODE_IMAGE_VERSION} AS runner WORKDIR /app +ARG PRISMA_VERSION="6.19.0" ARG NODE_OPTIONS ENV NODE_ENV=production @@ -36,13 +39,14 @@ ENV NODE_OPTIONS=$NODE_OPTIONS RUN addgroup --system --gid 1001 nodejs RUN adduser --system --uid 1001 nextjs -RUN npm install -g pnpm - RUN set -x \ - && apk add --no-cache curl + && apk add --no-cache curl \ + && npm install -g pnpm # Script dependencies -RUN pnpm --allow-build='@prisma/engines' add npm-run-all dotenv chalk semver prisma@6.18.0 @prisma/adapter-pg@6.18.0 +RUN pnpm --allow-build='@prisma/engines' add npm-run-all dotenv chalk semver \ + prisma@${PRISMA_VERSION} \ + @prisma/adapter-pg@${PRISMA_VERSION} COPY --from=builder --chown=nextjs:nodejs /app/public ./public COPY --from=builder /app/prisma ./prisma diff --git a/package.json b/package.json index dc701dfb..e20ae62d 100644 --- a/package.json +++ b/package.json @@ -72,7 +72,7 @@ "@prisma/extension-read-replicas": "^0.4.1", "@react-spring/web": "^10.0.3", "@svgr/cli": "^8.1.0", - "@tanstack/react-query": "^5.90.5", + "@tanstack/react-query": "^5.90.11", "@umami/react-zen": "^0.211.0", "@umami/redis-client": "^0.29.0", "bcryptjs": "^3.0.2", @@ -92,7 +92,7 @@ "esbuild": "^0.25.11", "fs-extra": "^11.3.2", "immer": "^10.2.0", - "ipaddr.js": "^2.0.1", + "ipaddr.js": "^2.3.0", "is-ci": "^3.0.1", "is-docker": "^3.0.0", "is-localhost-ip": "^2.0.0", @@ -102,15 +102,15 @@ "kafkajs": "^2.1.0", "lucide-react": "^0.543.0", "maxmind": "^5.0.0", - "next": "15.5.3", + "next": "^15.5.7", "node-fetch": "^3.2.8", "npm-run-all": "^4.1.5", "papaparse": "^5.5.3", "pg": "^8.16.3", "prisma": "^6.18.0", "pure-rand": "^7.0.1", - "react": "^19.2.0", - "react-dom": "^19.2.0", + "react": "^19.2.1", + "react-dom": "^19.2.1", "react-error-boundary": "^4.0.4", "react-intl": "^7.1.14", "react-simple-maps": "^2.3.0", @@ -122,13 +122,13 @@ "thenby": "^1.3.4", "ua-parser-js": "^2.0.6", "uuid": "^11.1.0", - "zod": "^4.1.12", - "zustand": "^5.0.8" + "zod": "^4.1.13", + "zustand": "^5.0.9" }, "devDependencies": { - "@biomejs/biome": "^2.3.6", + "@biomejs/biome": "^2.3.8", "@formatjs/cli": "^4.2.29", - "@netlify/plugin-nextjs": "^5.14.4", + "@netlify/plugin-nextjs": "^5.15.1", "@rollup/plugin-alias": "^5.0.0", "@rollup/plugin-commonjs": "^25.0.4", "@rollup/plugin-json": "^6.0.0", @@ -138,7 +138,7 @@ "@rollup/plugin-typescript": "^12.3.0", "@types/jest": "^30.0.0", "@types/node": "^24.9.2", - "@types/react": "^19.2.2", + "@types/react": "^19.2.7", "@types/react-dom": "^19.2.2", "@types/react-window": "^1.8.8", "babel-plugin-react-compiler": "19.1.0-rc.2", @@ -156,7 +156,7 @@ "rollup": "^4.52.5", "rollup-plugin-copy": "^3.4.0", "rollup-plugin-delete": "^3.0.1", - "rollup-plugin-dts": "^6.2.3", + "rollup-plugin-dts": "^6.3.0", "rollup-plugin-node-externals": "^8.1.1", "rollup-plugin-peer-deps-external": "^2.2.4", "rollup-plugin-postcss": "^4.0.2", @@ -165,7 +165,7 @@ "stylelint-config-prettier": "^9.0.3", "stylelint-config-recommended": "^14.0.0", "tar": "^6.1.2", - "ts-jest": "^29.4.5", + "ts-jest": "^29.4.6", "ts-node": "^10.9.1", "tsup": "^8.5.0", "tsx": "^4.19.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index be25301f..10eed821 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -25,7 +25,7 @@ importers: version: 5.2.8 '@hello-pangea/dnd': specifier: ^17.0.0 - version: 17.0.0(@types/react@19.2.6)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + version: 17.0.0(@types/react@19.2.7)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) '@prisma/adapter-pg': specifier: ^6.18.0 version: 6.19.0 @@ -37,16 +37,16 @@ importers: version: 0.4.1(@prisma/client@6.19.0(prisma@6.19.0(typescript@5.9.3))(typescript@5.9.3)) '@react-spring/web': specifier: ^10.0.3 - version: 10.0.3(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + version: 10.0.3(react-dom@19.2.1(react@19.2.1))(react@19.2.1) '@svgr/cli': specifier: ^8.1.0 version: 8.1.0(typescript@5.9.3) '@tanstack/react-query': - specifier: ^5.90.5 - version: 5.90.10(react@19.2.0) + specifier: ^5.90.11 + version: 5.90.11(react@19.2.1) '@umami/react-zen': specifier: ^0.211.0 - version: 0.211.0(@babel/core@7.28.3)(@types/react@19.2.6)(babel-plugin-react-compiler@19.1.0-rc.2)(immer@10.2.0)(use-sync-external-store@1.6.0(react@19.2.0)) + version: 0.211.0(@babel/core@7.28.3)(@types/react@19.2.7)(babel-plugin-react-compiler@19.1.0-rc.2)(immer@10.2.0)(use-sync-external-store@1.6.0(react@19.2.1)) '@umami/redis-client': specifier: ^0.29.0 version: 0.29.0 @@ -102,8 +102,8 @@ importers: specifier: ^10.2.0 version: 10.2.0 ipaddr.js: - specifier: ^2.0.1 - version: 2.2.0 + specifier: ^2.3.0 + version: 2.3.0 is-ci: specifier: ^3.0.1 version: 3.0.1 @@ -127,13 +127,13 @@ importers: version: 2.2.4 lucide-react: specifier: ^0.543.0 - version: 0.543.0(react@19.2.0) + version: 0.543.0(react@19.2.1) maxmind: specifier: ^5.0.0 version: 5.0.1 next: - specifier: 15.5.3 - version: 15.5.3(@babel/core@7.28.3)(babel-plugin-react-compiler@19.1.0-rc.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + specifier: ^15.5.7 + version: 15.5.7(@babel/core@7.28.3)(babel-plugin-react-compiler@19.1.0-rc.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) node-fetch: specifier: ^3.2.8 version: 3.3.2 @@ -153,26 +153,26 @@ importers: specifier: ^7.0.1 version: 7.0.1 react: - specifier: ^19.2.0 - version: 19.2.0 + specifier: ^19.2.1 + version: 19.2.1 react-dom: - specifier: ^19.2.0 - version: 19.2.0(react@19.2.0) + specifier: ^19.2.1 + version: 19.2.1(react@19.2.1) react-error-boundary: specifier: ^4.0.4 - version: 4.1.2(react@19.2.0) + version: 4.1.2(react@19.2.1) react-intl: specifier: ^7.1.14 - version: 7.1.14(react@19.2.0)(typescript@5.9.3) + version: 7.1.14(react@19.2.1)(typescript@5.9.3) react-simple-maps: specifier: ^2.3.0 - version: 2.3.0(prop-types@15.8.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + version: 2.3.0(prop-types@15.8.1)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) react-use-measure: specifier: ^2.0.4 - version: 2.1.7(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + version: 2.1.7(react-dom@19.2.1(react@19.2.1))(react@19.2.1) react-window: specifier: ^1.8.6 - version: 1.8.11(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + version: 1.8.11(react-dom@19.2.1(react@19.2.1))(react@19.2.1) request-ip: specifier: ^3.3.0 version: 3.3.0 @@ -192,21 +192,21 @@ importers: specifier: ^11.1.0 version: 11.1.0 zod: - specifier: ^4.1.12 - version: 4.1.12 + specifier: ^4.1.13 + version: 4.1.13 zustand: - specifier: ^5.0.8 - version: 5.0.8(@types/react@19.2.6)(immer@10.2.0)(react@19.2.0)(use-sync-external-store@1.6.0(react@19.2.0)) + specifier: ^5.0.9 + version: 5.0.9(@types/react@19.2.7)(immer@10.2.0)(react@19.2.1)(use-sync-external-store@1.6.0(react@19.2.1)) devDependencies: '@biomejs/biome': - specifier: ^2.3.6 - version: 2.3.7 + specifier: ^2.3.8 + version: 2.3.8 '@formatjs/cli': specifier: ^4.2.29 - version: 4.8.4(ts-jest@29.4.5(@babel/core@7.28.3)(@jest/transform@29.7.0)(@jest/types@30.0.5)(babel-jest@29.7.0(@babel/core@7.28.3))(esbuild@0.25.12)(jest-util@30.0.5)(jest@29.7.0(@types/node@24.10.1)(ts-node@10.9.2(@types/node@24.10.1)(typescript@5.9.3)))(typescript@5.9.3)) + version: 4.8.4(ts-jest@29.4.6(@babel/core@7.28.3)(@jest/transform@29.7.0)(@jest/types@30.0.5)(babel-jest@29.7.0(@babel/core@7.28.3))(esbuild@0.25.12)(jest-util@30.0.5)(jest@29.7.0(@types/node@24.10.1)(ts-node@10.9.2(@types/node@24.10.1)(typescript@5.9.3)))(typescript@5.9.3)) '@netlify/plugin-nextjs': - specifier: ^5.14.4 - version: 5.14.7 + specifier: ^5.15.1 + version: 5.15.1 '@rollup/plugin-alias': specifier: ^5.0.0 version: 5.1.1(rollup@4.53.3) @@ -235,11 +235,11 @@ importers: specifier: ^24.9.2 version: 24.10.1 '@types/react': - specifier: ^19.2.2 - version: 19.2.6 + specifier: ^19.2.7 + version: 19.2.7 '@types/react-dom': specifier: ^19.2.2 - version: 19.2.3(@types/react@19.2.6) + version: 19.2.3(@types/react@19.2.7) '@types/react-window': specifier: ^1.8.8 version: 1.8.8 @@ -254,7 +254,7 @@ importers: version: 13.17.0 extract-react-intl-messages: specifier: ^4.1.1 - version: 4.1.1(ts-jest@29.4.5(@babel/core@7.28.3)(@jest/transform@29.7.0)(@jest/types@30.0.5)(babel-jest@29.7.0(@babel/core@7.28.3))(esbuild@0.25.12)(jest-util@30.0.5)(jest@29.7.0(@types/node@24.10.1)(ts-node@10.9.2(@types/node@24.10.1)(typescript@5.9.3)))(typescript@5.9.3)) + version: 4.1.1(ts-jest@29.4.6(@babel/core@7.28.3)(@jest/transform@29.7.0)(@jest/types@30.0.5)(babel-jest@29.7.0(@babel/core@7.28.3))(esbuild@0.25.12)(jest-util@30.0.5)(jest@29.7.0(@types/node@24.10.1)(ts-node@10.9.2(@types/node@24.10.1)(typescript@5.9.3)))(typescript@5.9.3)) husky: specifier: ^9.1.7 version: 9.1.7 @@ -289,8 +289,8 @@ importers: specifier: ^3.0.1 version: 3.0.1(rollup@4.53.3) rollup-plugin-dts: - specifier: ^6.2.3 - version: 6.2.3(rollup@4.53.3)(typescript@5.9.3) + specifier: ^6.3.0 + version: 6.3.0(rollup@4.53.3)(typescript@5.9.3) rollup-plugin-node-externals: specifier: ^8.1.1 version: 8.1.2(rollup@4.53.3) @@ -316,8 +316,8 @@ importers: specifier: ^6.1.2 version: 6.2.1 ts-jest: - specifier: ^29.4.5 - version: 29.4.5(@babel/core@7.28.3)(@jest/transform@29.7.0)(@jest/types@30.0.5)(babel-jest@29.7.0(@babel/core@7.28.3))(esbuild@0.25.12)(jest-util@30.0.5)(jest@29.7.0(@types/node@24.10.1)(ts-node@10.9.2(@types/node@24.10.1)(typescript@5.9.3)))(typescript@5.9.3) + specifier: ^29.4.6 + version: 29.4.6(@babel/core@7.28.3)(@jest/transform@29.7.0)(@jest/types@30.0.5)(babel-jest@29.7.0(@babel/core@7.28.3))(esbuild@0.25.12)(jest-util@30.0.5)(jest@29.7.0(@types/node@24.10.1)(ts-node@10.9.2(@types/node@24.10.1)(typescript@5.9.3)))(typescript@5.9.3) ts-node: specifier: ^10.9.1 version: 10.9.2(@types/node@24.10.1)(typescript@5.9.3) @@ -508,55 +508,55 @@ packages: '@bcoe/v8-coverage@0.2.3': resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} - '@biomejs/biome@2.3.7': - resolution: {integrity: sha512-CTbAS/jNAiUc6rcq94BrTB8z83O9+BsgWj2sBCQg9rD6Wkh2gjfR87usjx0Ncx0zGXP1NKgT7JNglay5Zfs9jw==} + '@biomejs/biome@2.3.8': + resolution: {integrity: sha512-Qjsgoe6FEBxWAUzwFGFrB+1+M8y/y5kwmg5CHac+GSVOdmOIqsAiXM5QMVGZJ1eCUCLlPZtq4aFAQ0eawEUuUA==} engines: {node: '>=14.21.3'} hasBin: true - '@biomejs/cli-darwin-arm64@2.3.7': - resolution: {integrity: sha512-LirkamEwzIUULhXcf2D5b+NatXKeqhOwilM+5eRkbrnr6daKz9rsBL0kNZ16Hcy4b8RFq22SG4tcLwM+yx/wFA==} + '@biomejs/cli-darwin-arm64@2.3.8': + resolution: {integrity: sha512-HM4Zg9CGQ3txTPflxD19n8MFPrmUAjaC7PQdLkugeeC0cQ+PiVrd7i09gaBS/11QKsTDBJhVg85CEIK9f50Qww==} engines: {node: '>=14.21.3'} cpu: [arm64] os: [darwin] - '@biomejs/cli-darwin-x64@2.3.7': - resolution: {integrity: sha512-Q4TO633kvrMQkKIV7wmf8HXwF0dhdTD9S458LGE24TYgBjSRbuhvio4D5eOQzirEYg6eqxfs53ga/rbdd8nBKg==} + '@biomejs/cli-darwin-x64@2.3.8': + resolution: {integrity: sha512-lUDQ03D7y/qEao7RgdjWVGCu+BLYadhKTm40HkpJIi6kn8LSv5PAwRlew/DmwP4YZ9ke9XXoTIQDO1vAnbRZlA==} engines: {node: '>=14.21.3'} cpu: [x64] os: [darwin] - '@biomejs/cli-linux-arm64-musl@2.3.7': - resolution: {integrity: sha512-/afy8lto4CB8scWfMdt+NoCZtatBUF62Tk3ilWH2w8ENd5spLhM77zKlFZEvsKJv9AFNHknMl03zO67CiklL2Q==} + '@biomejs/cli-linux-arm64-musl@2.3.8': + resolution: {integrity: sha512-PShR4mM0sjksUMyxbyPNMxoKFPVF48fU8Qe8Sfx6w6F42verbwRLbz+QiKNiDPRJwUoMG1nPM50OBL3aOnTevA==} engines: {node: '>=14.21.3'} cpu: [arm64] os: [linux] - '@biomejs/cli-linux-arm64@2.3.7': - resolution: {integrity: sha512-inHOTdlstUBzgjDcx0ge71U4SVTbwAljmkfi3MC5WzsYCRhancqfeL+sa4Ke6v2ND53WIwCFD5hGsYExoI3EZQ==} + '@biomejs/cli-linux-arm64@2.3.8': + resolution: {integrity: sha512-Uo1OJnIkJgSgF+USx970fsM/drtPcQ39I+JO+Fjsaa9ZdCN1oysQmy6oAGbyESlouz+rzEckLTF6DS7cWse95g==} engines: {node: '>=14.21.3'} cpu: [arm64] os: [linux] - '@biomejs/cli-linux-x64-musl@2.3.7': - resolution: {integrity: sha512-CQUtgH1tIN6e5wiYSJqzSwJumHYolNtaj1dwZGCnZXm2PZU1jOJof9TsyiP3bXNDb+VOR7oo7ZvY01If0W3iFQ==} + '@biomejs/cli-linux-x64-musl@2.3.8': + resolution: {integrity: sha512-YGLkqU91r1276uwSjiUD/xaVikdxgV1QpsicT0bIA1TaieM6E5ibMZeSyjQ/izBn4tKQthUSsVZacmoJfa3pDA==} engines: {node: '>=14.21.3'} cpu: [x64] os: [linux] - '@biomejs/cli-linux-x64@2.3.7': - resolution: {integrity: sha512-fJMc3ZEuo/NaMYo5rvoWjdSS5/uVSW+HPRQujucpZqm2ZCq71b8MKJ9U4th9yrv2L5+5NjPF0nqqILCl8HY/fg==} + '@biomejs/cli-linux-x64@2.3.8': + resolution: {integrity: sha512-QDPMD5bQz6qOVb3kiBui0zKZXASLo0NIQ9JVJio5RveBEFgDgsvJFUvZIbMbUZT3T00M/1wdzwWXk4GIh0KaAw==} engines: {node: '>=14.21.3'} cpu: [x64] os: [linux] - '@biomejs/cli-win32-arm64@2.3.7': - resolution: {integrity: sha512-aJAE8eCNyRpcfx2JJAtsPtISnELJ0H4xVVSwnxm13bzI8RwbXMyVtxy2r5DV1xT3WiSP+7LxORcApWw0LM8HiA==} + '@biomejs/cli-win32-arm64@2.3.8': + resolution: {integrity: sha512-H4IoCHvL1fXKDrTALeTKMiE7GGWFAraDwBYFquE/L/5r1927Te0mYIGseXi4F+lrrwhSWbSGt5qPFswNoBaCxg==} engines: {node: '>=14.21.3'} cpu: [arm64] os: [win32] - '@biomejs/cli-win32-x64@2.3.7': - resolution: {integrity: sha512-pulzUshqv9Ed//MiE8MOUeeEkbkSHVDVY5Cz5wVAnH1DUqliCQG3j6s1POaITTFqFfo7AVIx2sWdKpx/GS+Nqw==} + '@biomejs/cli-win32-x64@2.3.8': + resolution: {integrity: sha512-RguzimPoZWtBapfKhKjcWXBVI91tiSprqdBYu7tWhgN8pKRZhw24rFeNZTNf6UiBfjCYCi9eFQs/JzJZIhuK4w==} engines: {node: '>=14.21.3'} cpu: [x64] os: [win32] @@ -1689,108 +1689,108 @@ packages: '@kurkle/color@0.3.4': resolution: {integrity: sha512-M5UknZPHRu3DEDWoipU6sE8PdkZ6Z/S+v4dD+Ke8IaNlpdSQah50lz1KtcFBa2vsdOnwbbnxJwVM4wty6udA5w==} - '@netlify/plugin-nextjs@5.14.7': - resolution: {integrity: sha512-RJRPGIlaY3M4KA6GxpOlynCPUKCVbtkHwg4ccHhoSVrHgysW3nqw1pX+FBvlBexrUl1JO2zuDFh4enRal9BpAw==} + '@netlify/plugin-nextjs@5.15.1': + resolution: {integrity: sha512-HXm94tteOuA0FYwhkxjYIPe0zta+Dsu0wz7LnhfqVlaYcRaOLjHtd2vgfmpz3np/fx9TQg3gCfqGkXt2a9i7Aw==} engines: {node: '>=18.0.0'} - '@next/env@15.5.3': - resolution: {integrity: sha512-RSEDTRqyihYXygx/OJXwvVupfr9m04+0vH8vyy0HfZ7keRto6VX9BbEk0J2PUk0VGy6YhklJUSrgForov5F9pw==} + '@next/env@15.5.7': + resolution: {integrity: sha512-4h6Y2NyEkIEN7Z8YxkA27pq6zTkS09bUSYC0xjd0NpwFxjnIKeZEeH591o5WECSmjpUhLn3H2QLJcDye3Uzcvg==} - '@next/env@16.0.6': - resolution: {integrity: sha512-PFTK/G/vM3UJwK5XDYMFOqt8QW42mmhSgdKDapOlCqBUAOfJN2dyOnASR/xUR/JRrro0pLohh/zOJ77xUQWQAg==} + '@next/env@16.0.7': + resolution: {integrity: sha512-gpaNgUh5nftFKRkRQGnVi5dpcYSKGcZZkQffZ172OrG/XkrnS7UBTQ648YY+8ME92cC4IojpI2LqTC8sTDhAaw==} - '@next/swc-darwin-arm64@15.5.3': - resolution: {integrity: sha512-nzbHQo69+au9wJkGKTU9lP7PXv0d1J5ljFpvb+LnEomLtSbJkbZyEs6sbF3plQmiOB2l9OBtN2tNSvCH1nQ9Jg==} + '@next/swc-darwin-arm64@15.5.7': + resolution: {integrity: sha512-IZwtxCEpI91HVU/rAUOOobWSZv4P2DeTtNaCdHqLcTJU4wdNXgAySvKa/qJCgR5m6KI8UsKDXtO2B31jcaw1Yw==} engines: {node: '>= 10'} cpu: [arm64] os: [darwin] - '@next/swc-darwin-arm64@16.0.6': - resolution: {integrity: sha512-AGzKiPlDiui+9JcPRHLI4V9WFTTcKukhJTfK9qu3e0tz+Y/88B7vo5yZoO7UaikplJEHORzG3QaBFQfkjhnL0Q==} + '@next/swc-darwin-arm64@16.0.7': + resolution: {integrity: sha512-LlDtCYOEj/rfSnEn/Idi+j1QKHxY9BJFmxx7108A6D8K0SB+bNgfYQATPk/4LqOl4C0Wo3LACg2ie6s7xqMpJg==} engines: {node: '>= 10'} cpu: [arm64] os: [darwin] - '@next/swc-darwin-x64@15.5.3': - resolution: {integrity: sha512-w83w4SkOOhekJOcA5HBvHyGzgV1W/XvOfpkrxIse4uPWhYTTRwtGEM4v/jiXwNSJvfRvah0H8/uTLBKRXlef8g==} + '@next/swc-darwin-x64@15.5.7': + resolution: {integrity: sha512-UP6CaDBcqaCBuiq/gfCEJw7sPEoX1aIjZHnBWN9v9qYHQdMKvCKcAVs4OX1vIjeE+tC5EIuwDTVIoXpUes29lg==} engines: {node: '>= 10'} cpu: [x64] os: [darwin] - '@next/swc-darwin-x64@16.0.6': - resolution: {integrity: sha512-LlLLNrK9WCIUkq2GciWDcquXYIf7vLxX8XE49gz7EncssZGL1vlHwgmURiJsUZAvk0HM1a8qb1ABDezsjAE/jw==} + '@next/swc-darwin-x64@16.0.7': + resolution: {integrity: sha512-rtZ7BhnVvO1ICf3QzfW9H3aPz7GhBrnSIMZyr4Qy6boXF0b5E3QLs+cvJmg3PsTCG2M1PBoC+DANUi4wCOKXpA==} engines: {node: '>= 10'} cpu: [x64] os: [darwin] - '@next/swc-linux-arm64-gnu@15.5.3': - resolution: {integrity: sha512-+m7pfIs0/yvgVu26ieaKrifV8C8yiLe7jVp9SpcIzg7XmyyNE7toC1fy5IOQozmr6kWl/JONC51osih2RyoXRw==} + '@next/swc-linux-arm64-gnu@15.5.7': + resolution: {integrity: sha512-NCslw3GrNIw7OgmRBxHtdWFQYhexoUCq+0oS2ccjyYLtcn1SzGzeM54jpTFonIMUjNbHmpKpziXnpxhSWLcmBA==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - '@next/swc-linux-arm64-gnu@16.0.6': - resolution: {integrity: sha512-r04NzmLSGGfG8EPXKVK72N5zDNnq9pa9el78LhdtqIC3zqKh74QfKHnk24DoK4PEs6eY7sIK/CnNpt30oc59kg==} + '@next/swc-linux-arm64-gnu@16.0.7': + resolution: {integrity: sha512-mloD5WcPIeIeeZqAIP5c2kdaTa6StwP4/2EGy1mUw8HiexSHGK/jcM7lFuS3u3i2zn+xH9+wXJs6njO7VrAqww==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - '@next/swc-linux-arm64-musl@15.5.3': - resolution: {integrity: sha512-u3PEIzuguSenoZviZJahNLgCexGFhso5mxWCrrIMdvpZn6lkME5vc/ADZG8UUk5K1uWRy4hqSFECrON6UKQBbQ==} + '@next/swc-linux-arm64-musl@15.5.7': + resolution: {integrity: sha512-nfymt+SE5cvtTrG9u1wdoxBr9bVB7mtKTcj0ltRn6gkP/2Nu1zM5ei8rwP9qKQP0Y//umK+TtkKgNtfboBxRrw==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - '@next/swc-linux-arm64-musl@16.0.6': - resolution: {integrity: sha512-hfB/QV0hA7lbD1OJxp52wVDlpffUMfyxUB5ysZbb/pBC5iuhyLcEKSVQo56PFUUmUQzbMsAtUu6k2Gh9bBtWXA==} + '@next/swc-linux-arm64-musl@16.0.7': + resolution: {integrity: sha512-+ksWNrZrthisXuo9gd1XnjHRowCbMtl/YgMpbRvFeDEqEBd523YHPWpBuDjomod88U8Xliw5DHhekBC3EOOd9g==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - '@next/swc-linux-x64-gnu@15.5.3': - resolution: {integrity: sha512-lDtOOScYDZxI2BENN9m0pfVPJDSuUkAD1YXSvlJF0DKwZt0WlA7T7o3wrcEr4Q+iHYGzEaVuZcsIbCps4K27sA==} + '@next/swc-linux-x64-gnu@15.5.7': + resolution: {integrity: sha512-hvXcZvCaaEbCZcVzcY7E1uXN9xWZfFvkNHwbe/n4OkRhFWrs1J1QV+4U1BN06tXLdaS4DazEGXwgqnu/VMcmqw==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - '@next/swc-linux-x64-gnu@16.0.6': - resolution: {integrity: sha512-PZJushBgfvKhJBy01yXMdgL+l5XKr7uSn5jhOQXQXiH3iPT2M9iG64yHpPNGIKitKrHJInwmhPVGogZBAJOCPw==} + '@next/swc-linux-x64-gnu@16.0.7': + resolution: {integrity: sha512-4WtJU5cRDxpEE44Ana2Xro1284hnyVpBb62lIpU5k85D8xXxatT+rXxBgPkc7C1XwkZMWpK5rXLXTh9PFipWsA==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - '@next/swc-linux-x64-musl@15.5.3': - resolution: {integrity: sha512-9vWVUnsx9PrY2NwdVRJ4dUURAQ8Su0sLRPqcCCxtX5zIQUBES12eRVHq6b70bbfaVaxIDGJN2afHui0eDm+cLg==} + '@next/swc-linux-x64-musl@15.5.7': + resolution: {integrity: sha512-4IUO539b8FmF0odY6/SqANJdgwn1xs1GkPO5doZugwZ3ETF6JUdckk7RGmsfSf7ws8Qb2YB5It33mvNL/0acqA==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - '@next/swc-linux-x64-musl@16.0.6': - resolution: {integrity: sha512-LqY76IojrH9yS5fyATjLzlOIOgwyzBuNRqXwVxcGfZ58DWNQSyfnLGlfF6shAEqjwlDNLh4Z+P0rnOI87Y9jEw==} + '@next/swc-linux-x64-musl@16.0.7': + resolution: {integrity: sha512-HYlhqIP6kBPXalW2dbMTSuB4+8fe+j9juyxwfMwCe9kQPPeiyFn7NMjNfoFOfJ2eXkeQsoUGXg+O2SE3m4Qg2w==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - '@next/swc-win32-arm64-msvc@15.5.3': - resolution: {integrity: sha512-1CU20FZzY9LFQigRi6jM45oJMU3KziA5/sSG+dXeVaTm661snQP6xu3ykGxxwU5sLG3sh14teO/IOEPVsQMRfA==} + '@next/swc-win32-arm64-msvc@15.5.7': + resolution: {integrity: sha512-CpJVTkYI3ZajQkC5vajM7/ApKJUOlm6uP4BknM3XKvJ7VXAvCqSjSLmM0LKdYzn6nBJVSjdclx8nYJSa3xlTgQ==} engines: {node: '>= 10'} cpu: [arm64] os: [win32] - '@next/swc-win32-arm64-msvc@16.0.6': - resolution: {integrity: sha512-eIfSNNqAkj0tqKRf0u7BVjqylJCuabSrxnpSENY3YKApqwDMeAqYPmnOwmVe6DDl3Lvkbe7cJAyP6i9hQ5PmmQ==} + '@next/swc-win32-arm64-msvc@16.0.7': + resolution: {integrity: sha512-EviG+43iOoBRZg9deGauXExjRphhuYmIOJ12b9sAPy0eQ6iwcPxfED2asb/s2/yiLYOdm37kPaiZu8uXSYPs0Q==} engines: {node: '>= 10'} cpu: [arm64] os: [win32] - '@next/swc-win32-x64-msvc@15.5.3': - resolution: {integrity: sha512-JMoLAq3n3y5tKXPQwCK5c+6tmwkuFDa2XAxz8Wm4+IVthdBZdZGh+lmiLUHg9f9IDwIQpUjp+ysd6OkYTyZRZw==} + '@next/swc-win32-x64-msvc@15.5.7': + resolution: {integrity: sha512-gMzgBX164I6DN+9/PGA+9dQiwmTkE4TloBNx8Kv9UiGARsr9Nba7IpcBRA1iTV9vwlYnrE3Uy6I7Aj6qLjQuqw==} engines: {node: '>= 10'} cpu: [x64] os: [win32] - '@next/swc-win32-x64-msvc@16.0.6': - resolution: {integrity: sha512-QGs18P4OKdK9y2F3Th42+KGnwsc2iaThOe6jxQgP62kslUU4W+g6AzI6bdIn/pslhSfxjAMU5SjakfT5Fyo/xA==} + '@next/swc-win32-x64-msvc@16.0.7': + resolution: {integrity: sha512-gniPjy55zp5Eg0896qSrf3yB1dw4F/3s8VK1ephdsZZ129j2n6e1WqCbE2YgcKhW9hPB9TVZENugquWJD5x0ug==} engines: {node: '>= 10'} cpu: [x64] os: [win32] @@ -2817,11 +2817,11 @@ packages: '@swc/helpers@0.5.17': resolution: {integrity: sha512-5IKx/Y13RsYd+sauPb2x+U/xZikHjolzfuDgTAl/Tdf3Q8rslRvC19NKDLgAJQ6wsqADk10ntlv08nPFw/gO/A==} - '@tanstack/query-core@5.90.10': - resolution: {integrity: sha512-EhZVFu9rl7GfRNuJLJ3Y7wtbTnENsvzp+YpcAV7kCYiXni1v8qZh++lpw4ch4rrwC0u/EZRnBHIehzCGzwXDSQ==} + '@tanstack/query-core@5.90.11': + resolution: {integrity: sha512-f9z/nXhCgWDF4lHqgIE30jxLe4sYv15QodfdPDKYAk7nAEjNcndy4dHz3ezhdUaR23BpWa4I2EH4/DZ0//Uf8A==} - '@tanstack/react-query@5.90.10': - resolution: {integrity: sha512-BKLss9Y8PQ9IUjPYQiv3/Zmlx92uxffUOX8ZZNoQlCIZBJPT5M+GOMQj7xislvVQ6l1BstBjcX0XB/aHfFYVNw==} + '@tanstack/react-query@5.90.11': + resolution: {integrity: sha512-3uyzz01D1fkTLXuxF3JfoJoHQMU2fxsfJwE+6N5hHy0dVNoZOvwKP8Z2k7k1KDeD54N20apcJnG75TBAStIrBA==} peerDependencies: react: ^18 || ^19 @@ -2919,8 +2919,8 @@ packages: '@types/react-window@1.8.8': resolution: {integrity: sha512-8Ls660bHR1AUA2kuRvVG9D/4XpRC6wjAaPT9dil7Ckc76eP9TKWZwwmgfq8Q1LANX3QNDnoU4Zp48A3w+zK69Q==} - '@types/react@19.2.6': - resolution: {integrity: sha512-p/jUvulfgU7oKtj6Xpk8cA2Y1xKTtICGpJYeJXz2YVO2UcvjQgeRMLDGfDeqeRW2Ta+0QNFwcc8X3GH8SxZz6w==} + '@types/react@19.2.7': + resolution: {integrity: sha512-MWtvHrGZLFttgeEj28VXHxpmwYbor/ATPYbBfSFZEIRK0ecCFLl2Qo55z52Hss+UV9CRN7trSeq1zbgx7YDWWg==} '@types/resolve@1.20.2': resolution: {integrity: sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==} @@ -4420,8 +4420,8 @@ packages: intl-messageformat@10.7.18: resolution: {integrity: sha512-m3Ofv/X/tV8Y3tHXLohcuVuhWKo7BBq62cqY15etqmLxg2DZ34AGGgQDeR+SCta2+zICb1NX83af0GJmbQ1++g==} - ipaddr.js@2.2.0: - resolution: {integrity: sha512-Ag3wB2o37wslZS19hZqorUnrnzSkpOVy+IiiDEiTqNubEYpYuHWIf6K4psgN2ZWKExS4xhVCrRVfb/wfW8fWJA==} + ipaddr.js@2.3.0: + resolution: {integrity: sha512-Zv/pA+ciVFbCSBBjGfaKUya/CcGmUHzTydLMaTwrUUEM2DIEO3iZvueGxmacvmN50fGpGVKeTXpb2LcYQxeVdg==} engines: {node: '>= 10'} is-array-buffer@3.0.5: @@ -5071,8 +5071,8 @@ packages: magic-string@0.30.17: resolution: {integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==} - magic-string@0.30.18: - resolution: {integrity: sha512-yi8swmWbO17qHhwIBNeeZxTceJMeBvWJaId6dyvTSOwTipqeHhMhOrz6513r1sOKnpvQ7zkhlG8tPrpilwTxHQ==} + magic-string@0.30.21: + resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} make-dir@3.1.0: resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} @@ -5246,8 +5246,8 @@ packages: neo-async@2.6.2: resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} - next@15.5.3: - resolution: {integrity: sha512-r/liNAx16SQj4D+XH/oI1dlpv9tdKJ6cONYPwwcCC46f2NjpaRWY+EKCzULfgQYV6YKXjHBchff2IZBSlZmJNw==} + next@15.5.7: + resolution: {integrity: sha512-+t2/0jIJ48kUpGKkdlhgkv+zPTEOoXyr60qXe68eB/pl3CMJaLeIGjzp5D6Oqt25hCBiBTt8wEeeAzfJvUKnPQ==} engines: {node: ^18.18.0 || ^19.8.0 || >= 20.0.0} hasBin: true peerDependencies: @@ -5267,8 +5267,8 @@ packages: sass: optional: true - next@16.0.6: - resolution: {integrity: sha512-2zOZ/4FdaAp5hfCU/RnzARlZzBsjaTZ/XjNQmuyYLluAPM7kcrbIkdeO2SL0Ysd1vnrSgU+GwugfeWX1cUCgCg==} + next@16.0.7: + resolution: {integrity: sha512-3mBRJyPxT4LOxAJI6IsXeFtKfiJUbjCLgvXO02fV8Wy/lIhPvP94Fe7dGhUgHXcQy4sSuYwQNcOLhIfOm0rL0A==} engines: {node: '>=20.9.0'} hasBin: true peerDependencies: @@ -6131,10 +6131,10 @@ packages: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - react-dom@19.2.0: - resolution: {integrity: sha512-UlbRu4cAiGaIewkPyiRGJk0imDN2T3JjieT6spoL2UeSf5od4n5LB/mQ4ejmxhCFT1tYe8IvaFulzynWovsEFQ==} + react-dom@19.2.1: + resolution: {integrity: sha512-ibrK8llX2a4eOskq1mXKu/TGZj9qzomO+sNfO98M6d9zIPOEhlBkMkBUBLd1vgS0gQsLDBzA+8jJBVXDnfHmJg==} peerDependencies: - react: ^19.2.0 + react: ^19.2.1 react-error-boundary@4.1.2: resolution: {integrity: sha512-GQDxZ5Jd+Aq/qUxbCm1UtzmL/s++V7zKgE8yMktJiCQXCCFZnMZh9ng+6/Ne6PjNSXH0L9CjeOEREfRnq6Duag==} @@ -6207,8 +6207,8 @@ packages: react: ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 react-dom: ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - react@19.2.0: - resolution: {integrity: sha512-tmbWg6W31tQLeB5cdIBOicJDJRR2KzXsV7uSK9iNfLWQ5bIZfxuPEHp7M8wiHyHnn0DD1i7w3Zmin0FtkrwoCQ==} + react@19.2.1: + resolution: {integrity: sha512-DGrYcCWK7tvYMnWh79yrPHt+vdx9tY+1gPZa7nJQtO/p8bLTDaHp4dzwEhQB7pZ4Xe3ok4XKuEPrVuc+wlpkmw==} engines: {node: '>=0.10.0'} read-babelrc-up@1.1.0: @@ -6335,8 +6335,8 @@ packages: peerDependencies: rollup: '*' - rollup-plugin-dts@6.2.3: - resolution: {integrity: sha512-UgnEsfciXSPpASuOelix7m4DrmyQgiaWBnvI0TM4GxuDh5FkqW8E5hu57bCxXB90VvR1WNfLV80yEDN18UogSA==} + rollup-plugin-dts@6.3.0: + resolution: {integrity: sha512-d0UrqxYd8KyZ6i3M2Nx7WOMy708qsV/7fTHMHxCMCBOAe3V/U7OMPu5GkX8hC+cmkHhzGnfeYongl1IgiooddA==} engines: {node: '>=16'} peerDependencies: rollup: ^3.29.4 || ^4 @@ -6845,8 +6845,8 @@ packages: ts-interface-checker@0.1.13: resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} - ts-jest@29.4.5: - resolution: {integrity: sha512-HO3GyiWn2qvTQA4kTgjDcXiMwYQt68a1Y8+JuLRVpdIzm+UOLSHgl/XqR4c6nzJkq5rOkjc02O2I7P7l/Yof0Q==} + ts-jest@29.4.6: + resolution: {integrity: sha512-fSpWtOO/1AjSNQguk43hb/JCo16oJDnMJf3CdEGNkqsEX3t0KX96xvyX1D7PfLCpVoKu4MfVrqUkFyblYoY4lA==} engines: {node: ^14.15.0 || ^16.10.0 || ^18.0.0 || >=20.0.0} hasBin: true peerDependencies: @@ -7194,11 +7194,11 @@ packages: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} - zod@4.1.12: - resolution: {integrity: sha512-JInaHOamG8pt5+Ey8kGmdcAcg3OL9reK8ltczgHTAwNhMys/6ThXHityHxVV2p3fkw/c+MAvBHFVYHFZDmjMCQ==} + zod@4.1.13: + resolution: {integrity: sha512-AvvthqfqrAhNH9dnfmrfKzX5upOdjUVJYFqNSlkmGf64gRaTzlPwz99IHYnVs28qYAybvAlBV+H7pn0saFY4Ig==} - zustand@5.0.8: - resolution: {integrity: sha512-gyPKpIaxY9XcO2vSMrLbiER7QMAMGOQZVRdJ6Zi782jkbzZygq5GI9nG8g+sMgitRtndwaBSl7uiqC49o1SSiw==} + zustand@5.0.9: + resolution: {integrity: sha512-ALBtUj0AfjJt3uNRQoL1tL2tMvj6Gp/6e39dnfT6uzpelGru8v1tPOGBzayOWbPJvujM8JojDk3E1LxeFisBNg==} engines: {node: '>=12.20.0'} peerDependencies: '@types/react': '>=18.0.0' @@ -7413,39 +7413,39 @@ snapshots: '@bcoe/v8-coverage@0.2.3': {} - '@biomejs/biome@2.3.7': + '@biomejs/biome@2.3.8': optionalDependencies: - '@biomejs/cli-darwin-arm64': 2.3.7 - '@biomejs/cli-darwin-x64': 2.3.7 - '@biomejs/cli-linux-arm64': 2.3.7 - '@biomejs/cli-linux-arm64-musl': 2.3.7 - '@biomejs/cli-linux-x64': 2.3.7 - '@biomejs/cli-linux-x64-musl': 2.3.7 - '@biomejs/cli-win32-arm64': 2.3.7 - '@biomejs/cli-win32-x64': 2.3.7 + '@biomejs/cli-darwin-arm64': 2.3.8 + '@biomejs/cli-darwin-x64': 2.3.8 + '@biomejs/cli-linux-arm64': 2.3.8 + '@biomejs/cli-linux-arm64-musl': 2.3.8 + '@biomejs/cli-linux-x64': 2.3.8 + '@biomejs/cli-linux-x64-musl': 2.3.8 + '@biomejs/cli-win32-arm64': 2.3.8 + '@biomejs/cli-win32-x64': 2.3.8 - '@biomejs/cli-darwin-arm64@2.3.7': + '@biomejs/cli-darwin-arm64@2.3.8': optional: true - '@biomejs/cli-darwin-x64@2.3.7': + '@biomejs/cli-darwin-x64@2.3.8': optional: true - '@biomejs/cli-linux-arm64-musl@2.3.7': + '@biomejs/cli-linux-arm64-musl@2.3.8': optional: true - '@biomejs/cli-linux-arm64@2.3.7': + '@biomejs/cli-linux-arm64@2.3.8': optional: true - '@biomejs/cli-linux-x64-musl@2.3.7': + '@biomejs/cli-linux-x64-musl@2.3.8': optional: true - '@biomejs/cli-linux-x64@2.3.7': + '@biomejs/cli-linux-x64@2.3.8': optional: true - '@biomejs/cli-win32-arm64@2.3.7': + '@biomejs/cli-win32-arm64@2.3.8': optional: true - '@biomejs/cli-win32-x64@2.3.7': + '@biomejs/cli-win32-x64@2.3.8': optional: true '@clickhouse/client-common@1.14.0': {} @@ -7914,10 +7914,10 @@ snapshots: '@fontsource/jetbrains-mono@5.2.8': {} - '@formatjs/cli@4.8.4(ts-jest@29.4.5(@babel/core@7.28.3)(@jest/transform@29.7.0)(@jest/types@30.0.5)(babel-jest@29.7.0(@babel/core@7.28.3))(esbuild@0.25.12)(jest-util@30.0.5)(jest@29.7.0(@types/node@24.10.1)(ts-node@10.9.2(@types/node@24.10.1)(typescript@5.9.3)))(typescript@5.9.3))': + '@formatjs/cli@4.8.4(ts-jest@29.4.6(@babel/core@7.28.3)(@jest/transform@29.7.0)(@jest/types@30.0.5)(babel-jest@29.7.0(@babel/core@7.28.3))(esbuild@0.25.12)(jest-util@30.0.5)(jest@29.7.0(@types/node@24.10.1)(ts-node@10.9.2(@types/node@24.10.1)(typescript@5.9.3)))(typescript@5.9.3))': dependencies: '@formatjs/icu-messageformat-parser': 2.1.0 - '@formatjs/ts-transformer': 3.9.4(ts-jest@29.4.5(@babel/core@7.28.3)(@jest/transform@29.7.0)(@jest/types@30.0.5)(babel-jest@29.7.0(@babel/core@7.28.3))(esbuild@0.25.12)(jest-util@30.0.5)(jest@29.7.0(@types/node@24.10.1)(ts-node@10.9.2(@types/node@24.10.1)(typescript@5.9.3)))(typescript@5.9.3)) + '@formatjs/ts-transformer': 3.9.4(ts-jest@29.4.6(@babel/core@7.28.3)(@jest/transform@29.7.0)(@jest/types@30.0.5)(babel-jest@29.7.0(@babel/core@7.28.3))(esbuild@0.25.12)(jest-util@30.0.5)(jest@29.7.0(@types/node@24.10.1)(ts-node@10.9.2(@types/node@24.10.1)(typescript@5.9.3)))(typescript@5.9.3)) '@types/estree': 0.0.50 '@types/fs-extra': 9.0.13 '@types/json-stable-stringify': 1.2.0 @@ -8004,15 +8004,15 @@ snapshots: optionalDependencies: typescript: 5.9.3 - '@formatjs/ts-transformer@2.13.0(ts-jest@29.4.5(@babel/core@7.28.3)(@jest/transform@29.7.0)(@jest/types@30.0.5)(babel-jest@29.7.0(@babel/core@7.28.3))(esbuild@0.25.12)(jest-util@30.0.5)(jest@29.7.0(@types/node@24.10.1)(ts-node@10.9.2(@types/node@24.10.1)(typescript@5.9.3)))(typescript@5.9.3))': + '@formatjs/ts-transformer@2.13.0(ts-jest@29.4.6(@babel/core@7.28.3)(@jest/transform@29.7.0)(@jest/types@30.0.5)(babel-jest@29.7.0(@babel/core@7.28.3))(esbuild@0.25.12)(jest-util@30.0.5)(jest@29.7.0(@types/node@24.10.1)(ts-node@10.9.2(@types/node@24.10.1)(typescript@5.9.3)))(typescript@5.9.3))': dependencies: intl-messageformat-parser: 6.1.2 tslib: 2.8.1 typescript: 4.9.5 optionalDependencies: - ts-jest: 29.4.5(@babel/core@7.28.3)(@jest/transform@29.7.0)(@jest/types@30.0.5)(babel-jest@29.7.0(@babel/core@7.28.3))(esbuild@0.25.12)(jest-util@30.0.5)(jest@29.7.0(@types/node@24.10.1)(ts-node@10.9.2(@types/node@24.10.1)(typescript@5.9.3)))(typescript@5.9.3) + ts-jest: 29.4.6(@babel/core@7.28.3)(@jest/transform@29.7.0)(@jest/types@30.0.5)(babel-jest@29.7.0(@babel/core@7.28.3))(esbuild@0.25.12)(jest-util@30.0.5)(jest@29.7.0(@types/node@24.10.1)(ts-node@10.9.2(@types/node@24.10.1)(typescript@5.9.3)))(typescript@5.9.3) - '@formatjs/ts-transformer@3.9.4(ts-jest@29.4.5(@babel/core@7.28.3)(@jest/transform@29.7.0)(@jest/types@30.0.5)(babel-jest@29.7.0(@babel/core@7.28.3))(esbuild@0.25.12)(jest-util@30.0.5)(jest@29.7.0(@types/node@24.10.1)(ts-node@10.9.2(@types/node@24.10.1)(typescript@5.9.3)))(typescript@5.9.3))': + '@formatjs/ts-transformer@3.9.4(ts-jest@29.4.6(@babel/core@7.28.3)(@jest/transform@29.7.0)(@jest/types@30.0.5)(babel-jest@29.7.0(@babel/core@7.28.3))(esbuild@0.25.12)(jest-util@30.0.5)(jest@29.7.0(@types/node@24.10.1)(ts-node@10.9.2(@types/node@24.10.1)(typescript@5.9.3)))(typescript@5.9.3))': dependencies: '@formatjs/icu-messageformat-parser': 2.1.0 '@types/node': 14.18.63 @@ -8020,19 +8020,19 @@ snapshots: tslib: 2.8.1 typescript: 4.9.5 optionalDependencies: - ts-jest: 29.4.5(@babel/core@7.28.3)(@jest/transform@29.7.0)(@jest/types@30.0.5)(babel-jest@29.7.0(@babel/core@7.28.3))(esbuild@0.25.12)(jest-util@30.0.5)(jest@29.7.0(@types/node@24.10.1)(ts-node@10.9.2(@types/node@24.10.1)(typescript@5.9.3)))(typescript@5.9.3) + ts-jest: 29.4.6(@babel/core@7.28.3)(@jest/transform@29.7.0)(@jest/types@30.0.5)(babel-jest@29.7.0(@babel/core@7.28.3))(esbuild@0.25.12)(jest-util@30.0.5)(jest@29.7.0(@types/node@24.10.1)(ts-node@10.9.2(@types/node@24.10.1)(typescript@5.9.3)))(typescript@5.9.3) - '@hello-pangea/dnd@17.0.0(@types/react@19.2.6)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@hello-pangea/dnd@17.0.0(@types/react@19.2.7)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': dependencies: '@babel/runtime': 7.28.3 css-box-model: 1.2.1 memoize-one: 6.0.0 raf-schd: 4.0.3 - react: 19.2.0 - react-dom: 19.2.0(react@19.2.0) - react-redux: 9.2.0(@types/react@19.2.6)(react@19.2.0)(redux@5.0.1) + react: 19.2.1 + react-dom: 19.2.1(react@19.2.1) + react-redux: 9.2.0(@types/react@19.2.7)(react@19.2.1)(redux@5.0.1) redux: 5.0.1 - use-memo-one: 1.1.3(react@19.2.0) + use-memo-one: 1.1.3(react@19.2.1) transitivePeerDependencies: - '@types/react' @@ -8476,58 +8476,58 @@ snapshots: '@kurkle/color@0.3.4': {} - '@netlify/plugin-nextjs@5.14.7': {} + '@netlify/plugin-nextjs@5.15.1': {} - '@next/env@15.5.3': {} + '@next/env@15.5.7': {} - '@next/env@16.0.6': {} + '@next/env@16.0.7': {} - '@next/swc-darwin-arm64@15.5.3': + '@next/swc-darwin-arm64@15.5.7': optional: true - '@next/swc-darwin-arm64@16.0.6': + '@next/swc-darwin-arm64@16.0.7': optional: true - '@next/swc-darwin-x64@15.5.3': + '@next/swc-darwin-x64@15.5.7': optional: true - '@next/swc-darwin-x64@16.0.6': + '@next/swc-darwin-x64@16.0.7': optional: true - '@next/swc-linux-arm64-gnu@15.5.3': + '@next/swc-linux-arm64-gnu@15.5.7': optional: true - '@next/swc-linux-arm64-gnu@16.0.6': + '@next/swc-linux-arm64-gnu@16.0.7': optional: true - '@next/swc-linux-arm64-musl@15.5.3': + '@next/swc-linux-arm64-musl@15.5.7': optional: true - '@next/swc-linux-arm64-musl@16.0.6': + '@next/swc-linux-arm64-musl@16.0.7': optional: true - '@next/swc-linux-x64-gnu@15.5.3': + '@next/swc-linux-x64-gnu@15.5.7': optional: true - '@next/swc-linux-x64-gnu@16.0.6': + '@next/swc-linux-x64-gnu@16.0.7': optional: true - '@next/swc-linux-x64-musl@15.5.3': + '@next/swc-linux-x64-musl@15.5.7': optional: true - '@next/swc-linux-x64-musl@16.0.6': + '@next/swc-linux-x64-musl@16.0.7': optional: true - '@next/swc-win32-arm64-msvc@15.5.3': + '@next/swc-win32-arm64-msvc@15.5.7': optional: true - '@next/swc-win32-arm64-msvc@16.0.6': + '@next/swc-win32-arm64-msvc@16.0.7': optional: true - '@next/swc-win32-x64-msvc@15.5.3': + '@next/swc-win32-x64-msvc@15.5.7': optional: true - '@next/swc-win32-x64-msvc@16.0.6': + '@next/swc-win32-x64-msvc@16.0.7': optional: true '@nodelib/fs.scandir@2.1.5': @@ -8596,1110 +8596,1110 @@ snapshots: dependencies: '@prisma/debug': 6.19.0 - '@react-aria/autocomplete@3.0.0-rc.3(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@react-aria/autocomplete@3.0.0-rc.3(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': dependencies: - '@react-aria/combobox': 3.14.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/focus': 3.21.2(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/i18n': 3.12.13(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/interactions': 3.25.6(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/listbox': 3.15.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/searchfield': 3.8.9(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/textfield': 3.18.2(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/utils': 3.31.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-stately/autocomplete': 3.0.0-beta.3(react@19.2.0) - '@react-stately/combobox': 3.12.0(react@19.2.0) - '@react-types/autocomplete': 3.0.0-alpha.35(react@19.2.0) - '@react-types/button': 3.14.1(react@19.2.0) - '@react-types/shared': 3.32.1(react@19.2.0) + '@react-aria/combobox': 3.14.0(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/focus': 3.21.2(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/i18n': 3.12.13(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/interactions': 3.25.6(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/listbox': 3.15.0(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/searchfield': 3.8.9(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/textfield': 3.18.2(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/utils': 3.31.0(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-stately/autocomplete': 3.0.0-beta.3(react@19.2.1) + '@react-stately/combobox': 3.12.0(react@19.2.1) + '@react-types/autocomplete': 3.0.0-alpha.35(react@19.2.1) + '@react-types/button': 3.14.1(react@19.2.1) + '@react-types/shared': 3.32.1(react@19.2.1) '@swc/helpers': 0.5.17 - react: 19.2.0 - react-dom: 19.2.0(react@19.2.0) + react: 19.2.1 + react-dom: 19.2.1(react@19.2.1) - '@react-aria/breadcrumbs@3.5.29(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@react-aria/breadcrumbs@3.5.29(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': dependencies: - '@react-aria/i18n': 3.12.13(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/link': 3.8.6(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/utils': 3.31.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-types/breadcrumbs': 3.7.17(react@19.2.0) - '@react-types/shared': 3.32.1(react@19.2.0) + '@react-aria/i18n': 3.12.13(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/link': 3.8.6(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/utils': 3.31.0(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-types/breadcrumbs': 3.7.17(react@19.2.1) + '@react-types/shared': 3.32.1(react@19.2.1) '@swc/helpers': 0.5.17 - react: 19.2.0 - react-dom: 19.2.0(react@19.2.0) + react: 19.2.1 + react-dom: 19.2.1(react@19.2.1) - '@react-aria/button@3.14.2(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@react-aria/button@3.14.2(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': dependencies: - '@react-aria/interactions': 3.25.6(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/toolbar': 3.0.0-beta.21(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/utils': 3.31.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-stately/toggle': 3.9.2(react@19.2.0) - '@react-types/button': 3.14.1(react@19.2.0) - '@react-types/shared': 3.32.1(react@19.2.0) + '@react-aria/interactions': 3.25.6(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/toolbar': 3.0.0-beta.21(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/utils': 3.31.0(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-stately/toggle': 3.9.2(react@19.2.1) + '@react-types/button': 3.14.1(react@19.2.1) + '@react-types/shared': 3.32.1(react@19.2.1) '@swc/helpers': 0.5.17 - react: 19.2.0 - react-dom: 19.2.0(react@19.2.0) + react: 19.2.1 + react-dom: 19.2.1(react@19.2.1) - '@react-aria/calendar@3.9.2(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@react-aria/calendar@3.9.2(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': dependencies: '@internationalized/date': 3.10.0 - '@react-aria/i18n': 3.12.13(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/interactions': 3.25.6(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@react-aria/i18n': 3.12.13(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/interactions': 3.25.6(react-dom@19.2.1(react@19.2.1))(react@19.2.1) '@react-aria/live-announcer': 3.4.4 - '@react-aria/utils': 3.31.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-stately/calendar': 3.9.0(react@19.2.0) - '@react-types/button': 3.14.1(react@19.2.0) - '@react-types/calendar': 3.8.0(react@19.2.0) - '@react-types/shared': 3.32.1(react@19.2.0) + '@react-aria/utils': 3.31.0(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-stately/calendar': 3.9.0(react@19.2.1) + '@react-types/button': 3.14.1(react@19.2.1) + '@react-types/calendar': 3.8.0(react@19.2.1) + '@react-types/shared': 3.32.1(react@19.2.1) '@swc/helpers': 0.5.17 - react: 19.2.0 - react-dom: 19.2.0(react@19.2.0) + react: 19.2.1 + react-dom: 19.2.1(react@19.2.1) - '@react-aria/checkbox@3.16.2(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@react-aria/checkbox@3.16.2(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': dependencies: - '@react-aria/form': 3.1.2(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/interactions': 3.25.6(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/label': 3.7.22(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/toggle': 3.12.2(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/utils': 3.31.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-stately/checkbox': 3.7.2(react@19.2.0) - '@react-stately/form': 3.2.2(react@19.2.0) - '@react-stately/toggle': 3.9.2(react@19.2.0) - '@react-types/checkbox': 3.10.2(react@19.2.0) - '@react-types/shared': 3.32.1(react@19.2.0) + '@react-aria/form': 3.1.2(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/interactions': 3.25.6(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/label': 3.7.22(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/toggle': 3.12.2(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/utils': 3.31.0(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-stately/checkbox': 3.7.2(react@19.2.1) + '@react-stately/form': 3.2.2(react@19.2.1) + '@react-stately/toggle': 3.9.2(react@19.2.1) + '@react-types/checkbox': 3.10.2(react@19.2.1) + '@react-types/shared': 3.32.1(react@19.2.1) '@swc/helpers': 0.5.17 - react: 19.2.0 - react-dom: 19.2.0(react@19.2.0) + react: 19.2.1 + react-dom: 19.2.1(react@19.2.1) - '@react-aria/collections@3.0.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@react-aria/collections@3.0.0(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': dependencies: - '@react-aria/interactions': 3.25.6(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/ssr': 3.9.10(react@19.2.0) - '@react-aria/utils': 3.31.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-types/shared': 3.32.1(react@19.2.0) + '@react-aria/interactions': 3.25.6(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/ssr': 3.9.10(react@19.2.1) + '@react-aria/utils': 3.31.0(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-types/shared': 3.32.1(react@19.2.1) '@swc/helpers': 0.5.17 - react: 19.2.0 - react-dom: 19.2.0(react@19.2.0) - use-sync-external-store: 1.6.0(react@19.2.0) + react: 19.2.1 + react-dom: 19.2.1(react@19.2.1) + use-sync-external-store: 1.6.0(react@19.2.1) - '@react-aria/color@3.1.2(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@react-aria/color@3.1.2(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': dependencies: - '@react-aria/i18n': 3.12.13(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/interactions': 3.25.6(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/numberfield': 3.12.2(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/slider': 3.8.2(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/spinbutton': 3.6.19(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/textfield': 3.18.2(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/utils': 3.31.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/visually-hidden': 3.8.28(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-stately/color': 3.9.2(react@19.2.0) - '@react-stately/form': 3.2.2(react@19.2.0) - '@react-types/color': 3.1.2(react@19.2.0) - '@react-types/shared': 3.32.1(react@19.2.0) + '@react-aria/i18n': 3.12.13(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/interactions': 3.25.6(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/numberfield': 3.12.2(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/slider': 3.8.2(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/spinbutton': 3.6.19(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/textfield': 3.18.2(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/utils': 3.31.0(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/visually-hidden': 3.8.28(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-stately/color': 3.9.2(react@19.2.1) + '@react-stately/form': 3.2.2(react@19.2.1) + '@react-types/color': 3.1.2(react@19.2.1) + '@react-types/shared': 3.32.1(react@19.2.1) '@swc/helpers': 0.5.17 - react: 19.2.0 - react-dom: 19.2.0(react@19.2.0) + react: 19.2.1 + react-dom: 19.2.1(react@19.2.1) - '@react-aria/combobox@3.14.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@react-aria/combobox@3.14.0(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': dependencies: - '@react-aria/focus': 3.21.2(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/i18n': 3.12.13(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/listbox': 3.15.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@react-aria/focus': 3.21.2(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/i18n': 3.12.13(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/listbox': 3.15.0(react-dom@19.2.1(react@19.2.1))(react@19.2.1) '@react-aria/live-announcer': 3.4.4 - '@react-aria/menu': 3.19.3(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/overlays': 3.30.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/selection': 3.26.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/textfield': 3.18.2(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/utils': 3.31.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-stately/collections': 3.12.8(react@19.2.0) - '@react-stately/combobox': 3.12.0(react@19.2.0) - '@react-stately/form': 3.2.2(react@19.2.0) - '@react-types/button': 3.14.1(react@19.2.0) - '@react-types/combobox': 3.13.9(react@19.2.0) - '@react-types/shared': 3.32.1(react@19.2.0) + '@react-aria/menu': 3.19.3(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/overlays': 3.30.0(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/selection': 3.26.0(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/textfield': 3.18.2(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/utils': 3.31.0(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-stately/collections': 3.12.8(react@19.2.1) + '@react-stately/combobox': 3.12.0(react@19.2.1) + '@react-stately/form': 3.2.2(react@19.2.1) + '@react-types/button': 3.14.1(react@19.2.1) + '@react-types/combobox': 3.13.9(react@19.2.1) + '@react-types/shared': 3.32.1(react@19.2.1) '@swc/helpers': 0.5.17 - react: 19.2.0 - react-dom: 19.2.0(react@19.2.0) + react: 19.2.1 + react-dom: 19.2.1(react@19.2.1) - '@react-aria/datepicker@3.15.2(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@react-aria/datepicker@3.15.2(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': dependencies: '@internationalized/date': 3.10.0 '@internationalized/number': 3.6.5 '@internationalized/string': 3.2.7 - '@react-aria/focus': 3.21.2(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/form': 3.1.2(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/i18n': 3.12.13(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/interactions': 3.25.6(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/label': 3.7.22(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/spinbutton': 3.6.19(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/utils': 3.31.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-stately/datepicker': 3.15.2(react@19.2.0) - '@react-stately/form': 3.2.2(react@19.2.0) - '@react-types/button': 3.14.1(react@19.2.0) - '@react-types/calendar': 3.8.0(react@19.2.0) - '@react-types/datepicker': 3.13.2(react@19.2.0) - '@react-types/dialog': 3.5.22(react@19.2.0) - '@react-types/shared': 3.32.1(react@19.2.0) + '@react-aria/focus': 3.21.2(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/form': 3.1.2(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/i18n': 3.12.13(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/interactions': 3.25.6(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/label': 3.7.22(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/spinbutton': 3.6.19(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/utils': 3.31.0(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-stately/datepicker': 3.15.2(react@19.2.1) + '@react-stately/form': 3.2.2(react@19.2.1) + '@react-types/button': 3.14.1(react@19.2.1) + '@react-types/calendar': 3.8.0(react@19.2.1) + '@react-types/datepicker': 3.13.2(react@19.2.1) + '@react-types/dialog': 3.5.22(react@19.2.1) + '@react-types/shared': 3.32.1(react@19.2.1) '@swc/helpers': 0.5.17 - react: 19.2.0 - react-dom: 19.2.0(react@19.2.0) + react: 19.2.1 + react-dom: 19.2.1(react@19.2.1) - '@react-aria/dialog@3.5.31(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@react-aria/dialog@3.5.31(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': dependencies: - '@react-aria/interactions': 3.25.6(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/overlays': 3.30.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/utils': 3.31.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-types/dialog': 3.5.22(react@19.2.0) - '@react-types/shared': 3.32.1(react@19.2.0) + '@react-aria/interactions': 3.25.6(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/overlays': 3.30.0(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/utils': 3.31.0(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-types/dialog': 3.5.22(react@19.2.1) + '@react-types/shared': 3.32.1(react@19.2.1) '@swc/helpers': 0.5.17 - react: 19.2.0 - react-dom: 19.2.0(react@19.2.0) + react: 19.2.1 + react-dom: 19.2.1(react@19.2.1) - '@react-aria/disclosure@3.1.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@react-aria/disclosure@3.1.0(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': dependencies: - '@react-aria/ssr': 3.9.10(react@19.2.0) - '@react-aria/utils': 3.31.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-stately/disclosure': 3.0.8(react@19.2.0) - '@react-types/button': 3.14.1(react@19.2.0) + '@react-aria/ssr': 3.9.10(react@19.2.1) + '@react-aria/utils': 3.31.0(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-stately/disclosure': 3.0.8(react@19.2.1) + '@react-types/button': 3.14.1(react@19.2.1) '@swc/helpers': 0.5.17 - react: 19.2.0 - react-dom: 19.2.0(react@19.2.0) + react: 19.2.1 + react-dom: 19.2.1(react@19.2.1) - '@react-aria/dnd@3.11.3(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@react-aria/dnd@3.11.3(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': dependencies: '@internationalized/string': 3.2.7 - '@react-aria/i18n': 3.12.13(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/interactions': 3.25.6(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@react-aria/i18n': 3.12.13(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/interactions': 3.25.6(react-dom@19.2.1(react@19.2.1))(react@19.2.1) '@react-aria/live-announcer': 3.4.4 - '@react-aria/overlays': 3.30.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/utils': 3.31.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-stately/collections': 3.12.8(react@19.2.0) - '@react-stately/dnd': 3.7.1(react@19.2.0) - '@react-types/button': 3.14.1(react@19.2.0) - '@react-types/shared': 3.32.1(react@19.2.0) + '@react-aria/overlays': 3.30.0(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/utils': 3.31.0(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-stately/collections': 3.12.8(react@19.2.1) + '@react-stately/dnd': 3.7.1(react@19.2.1) + '@react-types/button': 3.14.1(react@19.2.1) + '@react-types/shared': 3.32.1(react@19.2.1) '@swc/helpers': 0.5.17 - react: 19.2.0 - react-dom: 19.2.0(react@19.2.0) + react: 19.2.1 + react-dom: 19.2.1(react@19.2.1) - '@react-aria/focus@3.21.2(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@react-aria/focus@3.21.2(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': dependencies: - '@react-aria/interactions': 3.25.6(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/utils': 3.31.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-types/shared': 3.32.1(react@19.2.0) + '@react-aria/interactions': 3.25.6(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/utils': 3.31.0(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-types/shared': 3.32.1(react@19.2.1) '@swc/helpers': 0.5.17 clsx: 2.1.1 - react: 19.2.0 - react-dom: 19.2.0(react@19.2.0) + react: 19.2.1 + react-dom: 19.2.1(react@19.2.1) - '@react-aria/form@3.1.2(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@react-aria/form@3.1.2(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': dependencies: - '@react-aria/interactions': 3.25.6(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/utils': 3.31.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-stately/form': 3.2.2(react@19.2.0) - '@react-types/shared': 3.32.1(react@19.2.0) + '@react-aria/interactions': 3.25.6(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/utils': 3.31.0(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-stately/form': 3.2.2(react@19.2.1) + '@react-types/shared': 3.32.1(react@19.2.1) '@swc/helpers': 0.5.17 - react: 19.2.0 - react-dom: 19.2.0(react@19.2.0) + react: 19.2.1 + react-dom: 19.2.1(react@19.2.1) - '@react-aria/grid@3.14.5(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@react-aria/grid@3.14.5(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': dependencies: - '@react-aria/focus': 3.21.2(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/i18n': 3.12.13(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/interactions': 3.25.6(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@react-aria/focus': 3.21.2(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/i18n': 3.12.13(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/interactions': 3.25.6(react-dom@19.2.1(react@19.2.1))(react@19.2.1) '@react-aria/live-announcer': 3.4.4 - '@react-aria/selection': 3.26.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/utils': 3.31.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-stately/collections': 3.12.8(react@19.2.0) - '@react-stately/grid': 3.11.6(react@19.2.0) - '@react-stately/selection': 3.20.6(react@19.2.0) - '@react-types/checkbox': 3.10.2(react@19.2.0) - '@react-types/grid': 3.3.6(react@19.2.0) - '@react-types/shared': 3.32.1(react@19.2.0) + '@react-aria/selection': 3.26.0(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/utils': 3.31.0(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-stately/collections': 3.12.8(react@19.2.1) + '@react-stately/grid': 3.11.6(react@19.2.1) + '@react-stately/selection': 3.20.6(react@19.2.1) + '@react-types/checkbox': 3.10.2(react@19.2.1) + '@react-types/grid': 3.3.6(react@19.2.1) + '@react-types/shared': 3.32.1(react@19.2.1) '@swc/helpers': 0.5.17 - react: 19.2.0 - react-dom: 19.2.0(react@19.2.0) + react: 19.2.1 + react-dom: 19.2.1(react@19.2.1) - '@react-aria/gridlist@3.14.1(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@react-aria/gridlist@3.14.1(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': dependencies: - '@react-aria/focus': 3.21.2(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/grid': 3.14.5(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/i18n': 3.12.13(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/interactions': 3.25.6(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/selection': 3.26.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/utils': 3.31.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-stately/list': 3.13.1(react@19.2.0) - '@react-stately/tree': 3.9.3(react@19.2.0) - '@react-types/shared': 3.32.1(react@19.2.0) + '@react-aria/focus': 3.21.2(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/grid': 3.14.5(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/i18n': 3.12.13(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/interactions': 3.25.6(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/selection': 3.26.0(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/utils': 3.31.0(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-stately/list': 3.13.1(react@19.2.1) + '@react-stately/tree': 3.9.3(react@19.2.1) + '@react-types/shared': 3.32.1(react@19.2.1) '@swc/helpers': 0.5.17 - react: 19.2.0 - react-dom: 19.2.0(react@19.2.0) + react: 19.2.1 + react-dom: 19.2.1(react@19.2.1) - '@react-aria/i18n@3.12.13(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@react-aria/i18n@3.12.13(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': dependencies: '@internationalized/date': 3.10.0 '@internationalized/message': 3.1.8 '@internationalized/number': 3.6.5 '@internationalized/string': 3.2.7 - '@react-aria/ssr': 3.9.10(react@19.2.0) - '@react-aria/utils': 3.31.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-types/shared': 3.32.1(react@19.2.0) + '@react-aria/ssr': 3.9.10(react@19.2.1) + '@react-aria/utils': 3.31.0(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-types/shared': 3.32.1(react@19.2.1) '@swc/helpers': 0.5.17 - react: 19.2.0 - react-dom: 19.2.0(react@19.2.0) + react: 19.2.1 + react-dom: 19.2.1(react@19.2.1) - '@react-aria/interactions@3.25.6(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@react-aria/interactions@3.25.6(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': dependencies: - '@react-aria/ssr': 3.9.10(react@19.2.0) - '@react-aria/utils': 3.31.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@react-aria/ssr': 3.9.10(react@19.2.1) + '@react-aria/utils': 3.31.0(react-dom@19.2.1(react@19.2.1))(react@19.2.1) '@react-stately/flags': 3.1.2 - '@react-types/shared': 3.32.1(react@19.2.0) + '@react-types/shared': 3.32.1(react@19.2.1) '@swc/helpers': 0.5.17 - react: 19.2.0 - react-dom: 19.2.0(react@19.2.0) + react: 19.2.1 + react-dom: 19.2.1(react@19.2.1) - '@react-aria/label@3.7.22(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@react-aria/label@3.7.22(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': dependencies: - '@react-aria/utils': 3.31.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-types/shared': 3.32.1(react@19.2.0) + '@react-aria/utils': 3.31.0(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-types/shared': 3.32.1(react@19.2.1) '@swc/helpers': 0.5.17 - react: 19.2.0 - react-dom: 19.2.0(react@19.2.0) + react: 19.2.1 + react-dom: 19.2.1(react@19.2.1) - '@react-aria/landmark@3.0.7(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@react-aria/landmark@3.0.7(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': dependencies: - '@react-aria/utils': 3.31.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-types/shared': 3.32.1(react@19.2.0) + '@react-aria/utils': 3.31.0(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-types/shared': 3.32.1(react@19.2.1) '@swc/helpers': 0.5.17 - react: 19.2.0 - react-dom: 19.2.0(react@19.2.0) - use-sync-external-store: 1.6.0(react@19.2.0) + react: 19.2.1 + react-dom: 19.2.1(react@19.2.1) + use-sync-external-store: 1.6.0(react@19.2.1) - '@react-aria/link@3.8.6(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@react-aria/link@3.8.6(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': dependencies: - '@react-aria/interactions': 3.25.6(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/utils': 3.31.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-types/link': 3.6.5(react@19.2.0) - '@react-types/shared': 3.32.1(react@19.2.0) + '@react-aria/interactions': 3.25.6(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/utils': 3.31.0(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-types/link': 3.6.5(react@19.2.1) + '@react-types/shared': 3.32.1(react@19.2.1) '@swc/helpers': 0.5.17 - react: 19.2.0 - react-dom: 19.2.0(react@19.2.0) + react: 19.2.1 + react-dom: 19.2.1(react@19.2.1) - '@react-aria/listbox@3.15.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@react-aria/listbox@3.15.0(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': dependencies: - '@react-aria/interactions': 3.25.6(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/label': 3.7.22(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/selection': 3.26.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/utils': 3.31.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-stately/collections': 3.12.8(react@19.2.0) - '@react-stately/list': 3.13.1(react@19.2.0) - '@react-types/listbox': 3.7.4(react@19.2.0) - '@react-types/shared': 3.32.1(react@19.2.0) + '@react-aria/interactions': 3.25.6(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/label': 3.7.22(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/selection': 3.26.0(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/utils': 3.31.0(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-stately/collections': 3.12.8(react@19.2.1) + '@react-stately/list': 3.13.1(react@19.2.1) + '@react-types/listbox': 3.7.4(react@19.2.1) + '@react-types/shared': 3.32.1(react@19.2.1) '@swc/helpers': 0.5.17 - react: 19.2.0 - react-dom: 19.2.0(react@19.2.0) + react: 19.2.1 + react-dom: 19.2.1(react@19.2.1) '@react-aria/live-announcer@3.4.4': dependencies: '@swc/helpers': 0.5.17 - '@react-aria/menu@3.19.3(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@react-aria/menu@3.19.3(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': dependencies: - '@react-aria/focus': 3.21.2(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/i18n': 3.12.13(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/interactions': 3.25.6(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/overlays': 3.30.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/selection': 3.26.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/utils': 3.31.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-stately/collections': 3.12.8(react@19.2.0) - '@react-stately/menu': 3.9.8(react@19.2.0) - '@react-stately/selection': 3.20.6(react@19.2.0) - '@react-stately/tree': 3.9.3(react@19.2.0) - '@react-types/button': 3.14.1(react@19.2.0) - '@react-types/menu': 3.10.5(react@19.2.0) - '@react-types/shared': 3.32.1(react@19.2.0) + '@react-aria/focus': 3.21.2(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/i18n': 3.12.13(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/interactions': 3.25.6(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/overlays': 3.30.0(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/selection': 3.26.0(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/utils': 3.31.0(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-stately/collections': 3.12.8(react@19.2.1) + '@react-stately/menu': 3.9.8(react@19.2.1) + '@react-stately/selection': 3.20.6(react@19.2.1) + '@react-stately/tree': 3.9.3(react@19.2.1) + '@react-types/button': 3.14.1(react@19.2.1) + '@react-types/menu': 3.10.5(react@19.2.1) + '@react-types/shared': 3.32.1(react@19.2.1) '@swc/helpers': 0.5.17 - react: 19.2.0 - react-dom: 19.2.0(react@19.2.0) + react: 19.2.1 + react-dom: 19.2.1(react@19.2.1) - '@react-aria/meter@3.4.27(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@react-aria/meter@3.4.27(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': dependencies: - '@react-aria/progress': 3.4.27(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-types/meter': 3.4.13(react@19.2.0) - '@react-types/shared': 3.32.1(react@19.2.0) + '@react-aria/progress': 3.4.27(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-types/meter': 3.4.13(react@19.2.1) + '@react-types/shared': 3.32.1(react@19.2.1) '@swc/helpers': 0.5.17 - react: 19.2.0 - react-dom: 19.2.0(react@19.2.0) + react: 19.2.1 + react-dom: 19.2.1(react@19.2.1) - '@react-aria/numberfield@3.12.2(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@react-aria/numberfield@3.12.2(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': dependencies: - '@react-aria/i18n': 3.12.13(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/interactions': 3.25.6(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/spinbutton': 3.6.19(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/textfield': 3.18.2(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/utils': 3.31.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-stately/form': 3.2.2(react@19.2.0) - '@react-stately/numberfield': 3.10.2(react@19.2.0) - '@react-types/button': 3.14.1(react@19.2.0) - '@react-types/numberfield': 3.8.15(react@19.2.0) - '@react-types/shared': 3.32.1(react@19.2.0) + '@react-aria/i18n': 3.12.13(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/interactions': 3.25.6(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/spinbutton': 3.6.19(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/textfield': 3.18.2(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/utils': 3.31.0(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-stately/form': 3.2.2(react@19.2.1) + '@react-stately/numberfield': 3.10.2(react@19.2.1) + '@react-types/button': 3.14.1(react@19.2.1) + '@react-types/numberfield': 3.8.15(react@19.2.1) + '@react-types/shared': 3.32.1(react@19.2.1) '@swc/helpers': 0.5.17 - react: 19.2.0 - react-dom: 19.2.0(react@19.2.0) + react: 19.2.1 + react-dom: 19.2.1(react@19.2.1) - '@react-aria/overlays@3.30.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@react-aria/overlays@3.30.0(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': dependencies: - '@react-aria/focus': 3.21.2(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/i18n': 3.12.13(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/interactions': 3.25.6(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/ssr': 3.9.10(react@19.2.0) - '@react-aria/utils': 3.31.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/visually-hidden': 3.8.28(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-stately/overlays': 3.6.20(react@19.2.0) - '@react-types/button': 3.14.1(react@19.2.0) - '@react-types/overlays': 3.9.2(react@19.2.0) - '@react-types/shared': 3.32.1(react@19.2.0) + '@react-aria/focus': 3.21.2(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/i18n': 3.12.13(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/interactions': 3.25.6(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/ssr': 3.9.10(react@19.2.1) + '@react-aria/utils': 3.31.0(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/visually-hidden': 3.8.28(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-stately/overlays': 3.6.20(react@19.2.1) + '@react-types/button': 3.14.1(react@19.2.1) + '@react-types/overlays': 3.9.2(react@19.2.1) + '@react-types/shared': 3.32.1(react@19.2.1) '@swc/helpers': 0.5.17 - react: 19.2.0 - react-dom: 19.2.0(react@19.2.0) + react: 19.2.1 + react-dom: 19.2.1(react@19.2.1) - '@react-aria/progress@3.4.27(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@react-aria/progress@3.4.27(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': dependencies: - '@react-aria/i18n': 3.12.13(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/label': 3.7.22(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/utils': 3.31.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-types/progress': 3.5.16(react@19.2.0) - '@react-types/shared': 3.32.1(react@19.2.0) + '@react-aria/i18n': 3.12.13(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/label': 3.7.22(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/utils': 3.31.0(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-types/progress': 3.5.16(react@19.2.1) + '@react-types/shared': 3.32.1(react@19.2.1) '@swc/helpers': 0.5.17 - react: 19.2.0 - react-dom: 19.2.0(react@19.2.0) + react: 19.2.1 + react-dom: 19.2.1(react@19.2.1) - '@react-aria/radio@3.12.2(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@react-aria/radio@3.12.2(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': dependencies: - '@react-aria/focus': 3.21.2(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/form': 3.1.2(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/i18n': 3.12.13(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/interactions': 3.25.6(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/label': 3.7.22(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/utils': 3.31.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-stately/radio': 3.11.2(react@19.2.0) - '@react-types/radio': 3.9.2(react@19.2.0) - '@react-types/shared': 3.32.1(react@19.2.0) + '@react-aria/focus': 3.21.2(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/form': 3.1.2(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/i18n': 3.12.13(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/interactions': 3.25.6(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/label': 3.7.22(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/utils': 3.31.0(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-stately/radio': 3.11.2(react@19.2.1) + '@react-types/radio': 3.9.2(react@19.2.1) + '@react-types/shared': 3.32.1(react@19.2.1) '@swc/helpers': 0.5.17 - react: 19.2.0 - react-dom: 19.2.0(react@19.2.0) + react: 19.2.1 + react-dom: 19.2.1(react@19.2.1) - '@react-aria/searchfield@3.8.9(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@react-aria/searchfield@3.8.9(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': dependencies: - '@react-aria/i18n': 3.12.13(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/textfield': 3.18.2(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/utils': 3.31.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-stately/searchfield': 3.5.16(react@19.2.0) - '@react-types/button': 3.14.1(react@19.2.0) - '@react-types/searchfield': 3.6.6(react@19.2.0) - '@react-types/shared': 3.32.1(react@19.2.0) + '@react-aria/i18n': 3.12.13(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/textfield': 3.18.2(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/utils': 3.31.0(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-stately/searchfield': 3.5.16(react@19.2.1) + '@react-types/button': 3.14.1(react@19.2.1) + '@react-types/searchfield': 3.6.6(react@19.2.1) + '@react-types/shared': 3.32.1(react@19.2.1) '@swc/helpers': 0.5.17 - react: 19.2.0 - react-dom: 19.2.0(react@19.2.0) + react: 19.2.1 + react-dom: 19.2.1(react@19.2.1) - '@react-aria/select@3.17.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@react-aria/select@3.17.0(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': dependencies: - '@react-aria/form': 3.1.2(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/i18n': 3.12.13(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/interactions': 3.25.6(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/label': 3.7.22(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/listbox': 3.15.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/menu': 3.19.3(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/selection': 3.26.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/utils': 3.31.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/visually-hidden': 3.8.28(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-stately/select': 3.8.0(react@19.2.0) - '@react-types/button': 3.14.1(react@19.2.0) - '@react-types/select': 3.11.0(react@19.2.0) - '@react-types/shared': 3.32.1(react@19.2.0) + '@react-aria/form': 3.1.2(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/i18n': 3.12.13(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/interactions': 3.25.6(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/label': 3.7.22(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/listbox': 3.15.0(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/menu': 3.19.3(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/selection': 3.26.0(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/utils': 3.31.0(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/visually-hidden': 3.8.28(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-stately/select': 3.8.0(react@19.2.1) + '@react-types/button': 3.14.1(react@19.2.1) + '@react-types/select': 3.11.0(react@19.2.1) + '@react-types/shared': 3.32.1(react@19.2.1) '@swc/helpers': 0.5.17 - react: 19.2.0 - react-dom: 19.2.0(react@19.2.0) + react: 19.2.1 + react-dom: 19.2.1(react@19.2.1) - '@react-aria/selection@3.26.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@react-aria/selection@3.26.0(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': dependencies: - '@react-aria/focus': 3.21.2(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/i18n': 3.12.13(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/interactions': 3.25.6(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/utils': 3.31.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-stately/selection': 3.20.6(react@19.2.0) - '@react-types/shared': 3.32.1(react@19.2.0) + '@react-aria/focus': 3.21.2(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/i18n': 3.12.13(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/interactions': 3.25.6(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/utils': 3.31.0(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-stately/selection': 3.20.6(react@19.2.1) + '@react-types/shared': 3.32.1(react@19.2.1) '@swc/helpers': 0.5.17 - react: 19.2.0 - react-dom: 19.2.0(react@19.2.0) + react: 19.2.1 + react-dom: 19.2.1(react@19.2.1) - '@react-aria/separator@3.4.13(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@react-aria/separator@3.4.13(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': dependencies: - '@react-aria/utils': 3.31.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-types/shared': 3.32.1(react@19.2.0) + '@react-aria/utils': 3.31.0(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-types/shared': 3.32.1(react@19.2.1) '@swc/helpers': 0.5.17 - react: 19.2.0 - react-dom: 19.2.0(react@19.2.0) + react: 19.2.1 + react-dom: 19.2.1(react@19.2.1) - '@react-aria/slider@3.8.2(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@react-aria/slider@3.8.2(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': dependencies: - '@react-aria/i18n': 3.12.13(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/interactions': 3.25.6(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/label': 3.7.22(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/utils': 3.31.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-stately/slider': 3.7.2(react@19.2.0) - '@react-types/shared': 3.32.1(react@19.2.0) - '@react-types/slider': 3.8.2(react@19.2.0) + '@react-aria/i18n': 3.12.13(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/interactions': 3.25.6(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/label': 3.7.22(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/utils': 3.31.0(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-stately/slider': 3.7.2(react@19.2.1) + '@react-types/shared': 3.32.1(react@19.2.1) + '@react-types/slider': 3.8.2(react@19.2.1) '@swc/helpers': 0.5.17 - react: 19.2.0 - react-dom: 19.2.0(react@19.2.0) + react: 19.2.1 + react-dom: 19.2.1(react@19.2.1) - '@react-aria/spinbutton@3.6.19(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@react-aria/spinbutton@3.6.19(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': dependencies: - '@react-aria/i18n': 3.12.13(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@react-aria/i18n': 3.12.13(react-dom@19.2.1(react@19.2.1))(react@19.2.1) '@react-aria/live-announcer': 3.4.4 - '@react-aria/utils': 3.31.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-types/button': 3.14.1(react@19.2.0) - '@react-types/shared': 3.32.1(react@19.2.0) + '@react-aria/utils': 3.31.0(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-types/button': 3.14.1(react@19.2.1) + '@react-types/shared': 3.32.1(react@19.2.1) '@swc/helpers': 0.5.17 - react: 19.2.0 - react-dom: 19.2.0(react@19.2.0) + react: 19.2.1 + react-dom: 19.2.1(react@19.2.1) - '@react-aria/ssr@3.9.10(react@19.2.0)': + '@react-aria/ssr@3.9.10(react@19.2.1)': dependencies: '@swc/helpers': 0.5.17 - react: 19.2.0 + react: 19.2.1 - '@react-aria/switch@3.7.8(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@react-aria/switch@3.7.8(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': dependencies: - '@react-aria/toggle': 3.12.2(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-stately/toggle': 3.9.2(react@19.2.0) - '@react-types/shared': 3.32.1(react@19.2.0) - '@react-types/switch': 3.5.15(react@19.2.0) + '@react-aria/toggle': 3.12.2(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-stately/toggle': 3.9.2(react@19.2.1) + '@react-types/shared': 3.32.1(react@19.2.1) + '@react-types/switch': 3.5.15(react@19.2.1) '@swc/helpers': 0.5.17 - react: 19.2.0 - react-dom: 19.2.0(react@19.2.0) + react: 19.2.1 + react-dom: 19.2.1(react@19.2.1) - '@react-aria/table@3.17.8(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@react-aria/table@3.17.8(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': dependencies: - '@react-aria/focus': 3.21.2(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/grid': 3.14.5(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/i18n': 3.12.13(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/interactions': 3.25.6(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@react-aria/focus': 3.21.2(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/grid': 3.14.5(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/i18n': 3.12.13(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/interactions': 3.25.6(react-dom@19.2.1(react@19.2.1))(react@19.2.1) '@react-aria/live-announcer': 3.4.4 - '@react-aria/utils': 3.31.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/visually-hidden': 3.8.28(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-stately/collections': 3.12.8(react@19.2.0) + '@react-aria/utils': 3.31.0(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/visually-hidden': 3.8.28(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-stately/collections': 3.12.8(react@19.2.1) '@react-stately/flags': 3.1.2 - '@react-stately/table': 3.15.1(react@19.2.0) - '@react-types/checkbox': 3.10.2(react@19.2.0) - '@react-types/grid': 3.3.6(react@19.2.0) - '@react-types/shared': 3.32.1(react@19.2.0) - '@react-types/table': 3.13.4(react@19.2.0) + '@react-stately/table': 3.15.1(react@19.2.1) + '@react-types/checkbox': 3.10.2(react@19.2.1) + '@react-types/grid': 3.3.6(react@19.2.1) + '@react-types/shared': 3.32.1(react@19.2.1) + '@react-types/table': 3.13.4(react@19.2.1) '@swc/helpers': 0.5.17 - react: 19.2.0 - react-dom: 19.2.0(react@19.2.0) + react: 19.2.1 + react-dom: 19.2.1(react@19.2.1) - '@react-aria/tabs@3.10.8(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@react-aria/tabs@3.10.8(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': dependencies: - '@react-aria/focus': 3.21.2(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/i18n': 3.12.13(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/selection': 3.26.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/utils': 3.31.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-stately/tabs': 3.8.6(react@19.2.0) - '@react-types/shared': 3.32.1(react@19.2.0) - '@react-types/tabs': 3.3.19(react@19.2.0) + '@react-aria/focus': 3.21.2(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/i18n': 3.12.13(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/selection': 3.26.0(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/utils': 3.31.0(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-stately/tabs': 3.8.6(react@19.2.1) + '@react-types/shared': 3.32.1(react@19.2.1) + '@react-types/tabs': 3.3.19(react@19.2.1) '@swc/helpers': 0.5.17 - react: 19.2.0 - react-dom: 19.2.0(react@19.2.0) + react: 19.2.1 + react-dom: 19.2.1(react@19.2.1) - '@react-aria/tag@3.7.2(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@react-aria/tag@3.7.2(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': dependencies: - '@react-aria/gridlist': 3.14.1(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/i18n': 3.12.13(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/interactions': 3.25.6(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/label': 3.7.22(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/selection': 3.26.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/utils': 3.31.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-stately/list': 3.13.1(react@19.2.0) - '@react-types/button': 3.14.1(react@19.2.0) - '@react-types/shared': 3.32.1(react@19.2.0) + '@react-aria/gridlist': 3.14.1(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/i18n': 3.12.13(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/interactions': 3.25.6(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/label': 3.7.22(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/selection': 3.26.0(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/utils': 3.31.0(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-stately/list': 3.13.1(react@19.2.1) + '@react-types/button': 3.14.1(react@19.2.1) + '@react-types/shared': 3.32.1(react@19.2.1) '@swc/helpers': 0.5.17 - react: 19.2.0 - react-dom: 19.2.0(react@19.2.0) + react: 19.2.1 + react-dom: 19.2.1(react@19.2.1) - '@react-aria/textfield@3.18.2(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@react-aria/textfield@3.18.2(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': dependencies: - '@react-aria/form': 3.1.2(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/interactions': 3.25.6(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/label': 3.7.22(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/utils': 3.31.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-stately/form': 3.2.2(react@19.2.0) - '@react-stately/utils': 3.10.8(react@19.2.0) - '@react-types/shared': 3.32.1(react@19.2.0) - '@react-types/textfield': 3.12.6(react@19.2.0) + '@react-aria/form': 3.1.2(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/interactions': 3.25.6(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/label': 3.7.22(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/utils': 3.31.0(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-stately/form': 3.2.2(react@19.2.1) + '@react-stately/utils': 3.10.8(react@19.2.1) + '@react-types/shared': 3.32.1(react@19.2.1) + '@react-types/textfield': 3.12.6(react@19.2.1) '@swc/helpers': 0.5.17 - react: 19.2.0 - react-dom: 19.2.0(react@19.2.0) + react: 19.2.1 + react-dom: 19.2.1(react@19.2.1) - '@react-aria/toast@3.0.8(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@react-aria/toast@3.0.8(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': dependencies: - '@react-aria/i18n': 3.12.13(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/interactions': 3.25.6(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/landmark': 3.0.7(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/utils': 3.31.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-stately/toast': 3.1.2(react@19.2.0) - '@react-types/button': 3.14.1(react@19.2.0) - '@react-types/shared': 3.32.1(react@19.2.0) + '@react-aria/i18n': 3.12.13(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/interactions': 3.25.6(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/landmark': 3.0.7(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/utils': 3.31.0(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-stately/toast': 3.1.2(react@19.2.1) + '@react-types/button': 3.14.1(react@19.2.1) + '@react-types/shared': 3.32.1(react@19.2.1) '@swc/helpers': 0.5.17 - react: 19.2.0 - react-dom: 19.2.0(react@19.2.0) + react: 19.2.1 + react-dom: 19.2.1(react@19.2.1) - '@react-aria/toggle@3.12.2(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@react-aria/toggle@3.12.2(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': dependencies: - '@react-aria/interactions': 3.25.6(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/utils': 3.31.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-stately/toggle': 3.9.2(react@19.2.0) - '@react-types/checkbox': 3.10.2(react@19.2.0) - '@react-types/shared': 3.32.1(react@19.2.0) + '@react-aria/interactions': 3.25.6(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/utils': 3.31.0(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-stately/toggle': 3.9.2(react@19.2.1) + '@react-types/checkbox': 3.10.2(react@19.2.1) + '@react-types/shared': 3.32.1(react@19.2.1) '@swc/helpers': 0.5.17 - react: 19.2.0 - react-dom: 19.2.0(react@19.2.0) + react: 19.2.1 + react-dom: 19.2.1(react@19.2.1) - '@react-aria/toolbar@3.0.0-beta.21(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@react-aria/toolbar@3.0.0-beta.21(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': dependencies: - '@react-aria/focus': 3.21.2(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/i18n': 3.12.13(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/utils': 3.31.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-types/shared': 3.32.1(react@19.2.0) + '@react-aria/focus': 3.21.2(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/i18n': 3.12.13(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/utils': 3.31.0(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-types/shared': 3.32.1(react@19.2.1) '@swc/helpers': 0.5.17 - react: 19.2.0 - react-dom: 19.2.0(react@19.2.0) + react: 19.2.1 + react-dom: 19.2.1(react@19.2.1) - '@react-aria/tooltip@3.8.8(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@react-aria/tooltip@3.8.8(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': dependencies: - '@react-aria/interactions': 3.25.6(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/utils': 3.31.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-stately/tooltip': 3.5.8(react@19.2.0) - '@react-types/shared': 3.32.1(react@19.2.0) - '@react-types/tooltip': 3.4.21(react@19.2.0) + '@react-aria/interactions': 3.25.6(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/utils': 3.31.0(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-stately/tooltip': 3.5.8(react@19.2.1) + '@react-types/shared': 3.32.1(react@19.2.1) + '@react-types/tooltip': 3.4.21(react@19.2.1) '@swc/helpers': 0.5.17 - react: 19.2.0 - react-dom: 19.2.0(react@19.2.0) + react: 19.2.1 + react-dom: 19.2.1(react@19.2.1) - '@react-aria/tree@3.1.4(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@react-aria/tree@3.1.4(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': dependencies: - '@react-aria/gridlist': 3.14.1(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/i18n': 3.12.13(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/selection': 3.26.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/utils': 3.31.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-stately/tree': 3.9.3(react@19.2.0) - '@react-types/button': 3.14.1(react@19.2.0) - '@react-types/shared': 3.32.1(react@19.2.0) + '@react-aria/gridlist': 3.14.1(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/i18n': 3.12.13(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/selection': 3.26.0(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/utils': 3.31.0(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-stately/tree': 3.9.3(react@19.2.1) + '@react-types/button': 3.14.1(react@19.2.1) + '@react-types/shared': 3.32.1(react@19.2.1) '@swc/helpers': 0.5.17 - react: 19.2.0 - react-dom: 19.2.0(react@19.2.0) + react: 19.2.1 + react-dom: 19.2.1(react@19.2.1) - '@react-aria/utils@3.31.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@react-aria/utils@3.31.0(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': dependencies: - '@react-aria/ssr': 3.9.10(react@19.2.0) + '@react-aria/ssr': 3.9.10(react@19.2.1) '@react-stately/flags': 3.1.2 - '@react-stately/utils': 3.10.8(react@19.2.0) - '@react-types/shared': 3.32.1(react@19.2.0) + '@react-stately/utils': 3.10.8(react@19.2.1) + '@react-types/shared': 3.32.1(react@19.2.1) '@swc/helpers': 0.5.17 clsx: 2.1.1 - react: 19.2.0 - react-dom: 19.2.0(react@19.2.0) + react: 19.2.1 + react-dom: 19.2.1(react@19.2.1) - '@react-aria/virtualizer@4.1.10(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@react-aria/virtualizer@4.1.10(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': dependencies: - '@react-aria/i18n': 3.12.13(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/interactions': 3.25.6(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/utils': 3.31.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-stately/virtualizer': 4.4.4(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-types/shared': 3.32.1(react@19.2.0) + '@react-aria/i18n': 3.12.13(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/interactions': 3.25.6(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/utils': 3.31.0(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-stately/virtualizer': 4.4.4(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-types/shared': 3.32.1(react@19.2.1) '@swc/helpers': 0.5.17 - react: 19.2.0 - react-dom: 19.2.0(react@19.2.0) + react: 19.2.1 + react-dom: 19.2.1(react@19.2.1) - '@react-aria/visually-hidden@3.8.28(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@react-aria/visually-hidden@3.8.28(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': dependencies: - '@react-aria/interactions': 3.25.6(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/utils': 3.31.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-types/shared': 3.32.1(react@19.2.0) + '@react-aria/interactions': 3.25.6(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/utils': 3.31.0(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-types/shared': 3.32.1(react@19.2.1) '@swc/helpers': 0.5.17 - react: 19.2.0 - react-dom: 19.2.0(react@19.2.0) + react: 19.2.1 + react-dom: 19.2.1(react@19.2.1) - '@react-spring/animated@10.0.3(react@19.2.0)': + '@react-spring/animated@10.0.3(react@19.2.1)': dependencies: - '@react-spring/shared': 10.0.3(react@19.2.0) + '@react-spring/shared': 10.0.3(react@19.2.1) '@react-spring/types': 10.0.3 - react: 19.2.0 + react: 19.2.1 - '@react-spring/animated@9.7.5(react@19.2.0)': + '@react-spring/animated@9.7.5(react@19.2.1)': dependencies: - '@react-spring/shared': 9.7.5(react@19.2.0) + '@react-spring/shared': 9.7.5(react@19.2.1) '@react-spring/types': 9.7.5 - react: 19.2.0 + react: 19.2.1 - '@react-spring/core@10.0.3(react@19.2.0)': + '@react-spring/core@10.0.3(react@19.2.1)': dependencies: - '@react-spring/animated': 10.0.3(react@19.2.0) - '@react-spring/shared': 10.0.3(react@19.2.0) + '@react-spring/animated': 10.0.3(react@19.2.1) + '@react-spring/shared': 10.0.3(react@19.2.1) '@react-spring/types': 10.0.3 - react: 19.2.0 + react: 19.2.1 - '@react-spring/core@9.7.5(react@19.2.0)': + '@react-spring/core@9.7.5(react@19.2.1)': dependencies: - '@react-spring/animated': 9.7.5(react@19.2.0) - '@react-spring/shared': 9.7.5(react@19.2.0) + '@react-spring/animated': 9.7.5(react@19.2.1) + '@react-spring/shared': 9.7.5(react@19.2.1) '@react-spring/types': 9.7.5 - react: 19.2.0 + react: 19.2.1 '@react-spring/rafz@10.0.3': {} '@react-spring/rafz@9.7.5': {} - '@react-spring/shared@10.0.3(react@19.2.0)': + '@react-spring/shared@10.0.3(react@19.2.1)': dependencies: '@react-spring/rafz': 10.0.3 '@react-spring/types': 10.0.3 - react: 19.2.0 + react: 19.2.1 - '@react-spring/shared@9.7.5(react@19.2.0)': + '@react-spring/shared@9.7.5(react@19.2.1)': dependencies: '@react-spring/rafz': 9.7.5 '@react-spring/types': 9.7.5 - react: 19.2.0 + react: 19.2.1 '@react-spring/types@10.0.3': {} '@react-spring/types@9.7.5': {} - '@react-spring/web@10.0.3(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@react-spring/web@10.0.3(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': dependencies: - '@react-spring/animated': 10.0.3(react@19.2.0) - '@react-spring/core': 10.0.3(react@19.2.0) - '@react-spring/shared': 10.0.3(react@19.2.0) + '@react-spring/animated': 10.0.3(react@19.2.1) + '@react-spring/core': 10.0.3(react@19.2.1) + '@react-spring/shared': 10.0.3(react@19.2.1) '@react-spring/types': 10.0.3 - react: 19.2.0 - react-dom: 19.2.0(react@19.2.0) + react: 19.2.1 + react-dom: 19.2.1(react@19.2.1) - '@react-spring/web@9.7.5(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@react-spring/web@9.7.5(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': dependencies: - '@react-spring/animated': 9.7.5(react@19.2.0) - '@react-spring/core': 9.7.5(react@19.2.0) - '@react-spring/shared': 9.7.5(react@19.2.0) + '@react-spring/animated': 9.7.5(react@19.2.1) + '@react-spring/core': 9.7.5(react@19.2.1) + '@react-spring/shared': 9.7.5(react@19.2.1) '@react-spring/types': 9.7.5 - react: 19.2.0 - react-dom: 19.2.0(react@19.2.0) + react: 19.2.1 + react-dom: 19.2.1(react@19.2.1) - '@react-stately/autocomplete@3.0.0-beta.3(react@19.2.0)': + '@react-stately/autocomplete@3.0.0-beta.3(react@19.2.1)': dependencies: - '@react-stately/utils': 3.10.8(react@19.2.0) + '@react-stately/utils': 3.10.8(react@19.2.1) '@swc/helpers': 0.5.17 - react: 19.2.0 + react: 19.2.1 - '@react-stately/calendar@3.9.0(react@19.2.0)': + '@react-stately/calendar@3.9.0(react@19.2.1)': dependencies: '@internationalized/date': 3.10.0 - '@react-stately/utils': 3.10.8(react@19.2.0) - '@react-types/calendar': 3.8.0(react@19.2.0) - '@react-types/shared': 3.32.1(react@19.2.0) + '@react-stately/utils': 3.10.8(react@19.2.1) + '@react-types/calendar': 3.8.0(react@19.2.1) + '@react-types/shared': 3.32.1(react@19.2.1) '@swc/helpers': 0.5.17 - react: 19.2.0 + react: 19.2.1 - '@react-stately/checkbox@3.7.2(react@19.2.0)': + '@react-stately/checkbox@3.7.2(react@19.2.1)': dependencies: - '@react-stately/form': 3.2.2(react@19.2.0) - '@react-stately/utils': 3.10.8(react@19.2.0) - '@react-types/checkbox': 3.10.2(react@19.2.0) - '@react-types/shared': 3.32.1(react@19.2.0) + '@react-stately/form': 3.2.2(react@19.2.1) + '@react-stately/utils': 3.10.8(react@19.2.1) + '@react-types/checkbox': 3.10.2(react@19.2.1) + '@react-types/shared': 3.32.1(react@19.2.1) '@swc/helpers': 0.5.17 - react: 19.2.0 + react: 19.2.1 - '@react-stately/collections@3.12.8(react@19.2.0)': + '@react-stately/collections@3.12.8(react@19.2.1)': dependencies: - '@react-types/shared': 3.32.1(react@19.2.0) + '@react-types/shared': 3.32.1(react@19.2.1) '@swc/helpers': 0.5.17 - react: 19.2.0 + react: 19.2.1 - '@react-stately/color@3.9.2(react@19.2.0)': + '@react-stately/color@3.9.2(react@19.2.1)': dependencies: '@internationalized/number': 3.6.5 '@internationalized/string': 3.2.7 - '@react-stately/form': 3.2.2(react@19.2.0) - '@react-stately/numberfield': 3.10.2(react@19.2.0) - '@react-stately/slider': 3.7.2(react@19.2.0) - '@react-stately/utils': 3.10.8(react@19.2.0) - '@react-types/color': 3.1.2(react@19.2.0) - '@react-types/shared': 3.32.1(react@19.2.0) + '@react-stately/form': 3.2.2(react@19.2.1) + '@react-stately/numberfield': 3.10.2(react@19.2.1) + '@react-stately/slider': 3.7.2(react@19.2.1) + '@react-stately/utils': 3.10.8(react@19.2.1) + '@react-types/color': 3.1.2(react@19.2.1) + '@react-types/shared': 3.32.1(react@19.2.1) '@swc/helpers': 0.5.17 - react: 19.2.0 + react: 19.2.1 - '@react-stately/combobox@3.12.0(react@19.2.0)': + '@react-stately/combobox@3.12.0(react@19.2.1)': dependencies: - '@react-stately/collections': 3.12.8(react@19.2.0) - '@react-stately/form': 3.2.2(react@19.2.0) - '@react-stately/list': 3.13.1(react@19.2.0) - '@react-stately/overlays': 3.6.20(react@19.2.0) - '@react-stately/utils': 3.10.8(react@19.2.0) - '@react-types/combobox': 3.13.9(react@19.2.0) - '@react-types/shared': 3.32.1(react@19.2.0) + '@react-stately/collections': 3.12.8(react@19.2.1) + '@react-stately/form': 3.2.2(react@19.2.1) + '@react-stately/list': 3.13.1(react@19.2.1) + '@react-stately/overlays': 3.6.20(react@19.2.1) + '@react-stately/utils': 3.10.8(react@19.2.1) + '@react-types/combobox': 3.13.9(react@19.2.1) + '@react-types/shared': 3.32.1(react@19.2.1) '@swc/helpers': 0.5.17 - react: 19.2.0 + react: 19.2.1 - '@react-stately/data@3.14.1(react@19.2.0)': + '@react-stately/data@3.14.1(react@19.2.1)': dependencies: - '@react-types/shared': 3.32.1(react@19.2.0) + '@react-types/shared': 3.32.1(react@19.2.1) '@swc/helpers': 0.5.17 - react: 19.2.0 + react: 19.2.1 - '@react-stately/datepicker@3.15.2(react@19.2.0)': + '@react-stately/datepicker@3.15.2(react@19.2.1)': dependencies: '@internationalized/date': 3.10.0 '@internationalized/string': 3.2.7 - '@react-stately/form': 3.2.2(react@19.2.0) - '@react-stately/overlays': 3.6.20(react@19.2.0) - '@react-stately/utils': 3.10.8(react@19.2.0) - '@react-types/datepicker': 3.13.2(react@19.2.0) - '@react-types/shared': 3.32.1(react@19.2.0) + '@react-stately/form': 3.2.2(react@19.2.1) + '@react-stately/overlays': 3.6.20(react@19.2.1) + '@react-stately/utils': 3.10.8(react@19.2.1) + '@react-types/datepicker': 3.13.2(react@19.2.1) + '@react-types/shared': 3.32.1(react@19.2.1) '@swc/helpers': 0.5.17 - react: 19.2.0 + react: 19.2.1 - '@react-stately/disclosure@3.0.8(react@19.2.0)': + '@react-stately/disclosure@3.0.8(react@19.2.1)': dependencies: - '@react-stately/utils': 3.10.8(react@19.2.0) - '@react-types/shared': 3.32.1(react@19.2.0) + '@react-stately/utils': 3.10.8(react@19.2.1) + '@react-types/shared': 3.32.1(react@19.2.1) '@swc/helpers': 0.5.17 - react: 19.2.0 + react: 19.2.1 - '@react-stately/dnd@3.7.1(react@19.2.0)': + '@react-stately/dnd@3.7.1(react@19.2.1)': dependencies: - '@react-stately/selection': 3.20.6(react@19.2.0) - '@react-types/shared': 3.32.1(react@19.2.0) + '@react-stately/selection': 3.20.6(react@19.2.1) + '@react-types/shared': 3.32.1(react@19.2.1) '@swc/helpers': 0.5.17 - react: 19.2.0 + react: 19.2.1 '@react-stately/flags@3.1.2': dependencies: '@swc/helpers': 0.5.17 - '@react-stately/form@3.2.2(react@19.2.0)': + '@react-stately/form@3.2.2(react@19.2.1)': dependencies: - '@react-types/shared': 3.32.1(react@19.2.0) + '@react-types/shared': 3.32.1(react@19.2.1) '@swc/helpers': 0.5.17 - react: 19.2.0 + react: 19.2.1 - '@react-stately/grid@3.11.6(react@19.2.0)': + '@react-stately/grid@3.11.6(react@19.2.1)': dependencies: - '@react-stately/collections': 3.12.8(react@19.2.0) - '@react-stately/selection': 3.20.6(react@19.2.0) - '@react-types/grid': 3.3.6(react@19.2.0) - '@react-types/shared': 3.32.1(react@19.2.0) + '@react-stately/collections': 3.12.8(react@19.2.1) + '@react-stately/selection': 3.20.6(react@19.2.1) + '@react-types/grid': 3.3.6(react@19.2.1) + '@react-types/shared': 3.32.1(react@19.2.1) '@swc/helpers': 0.5.17 - react: 19.2.0 + react: 19.2.1 - '@react-stately/layout@4.5.1(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@react-stately/layout@4.5.1(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': dependencies: - '@react-stately/collections': 3.12.8(react@19.2.0) - '@react-stately/table': 3.15.1(react@19.2.0) - '@react-stately/virtualizer': 4.4.4(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-types/grid': 3.3.6(react@19.2.0) - '@react-types/shared': 3.32.1(react@19.2.0) - '@react-types/table': 3.13.4(react@19.2.0) + '@react-stately/collections': 3.12.8(react@19.2.1) + '@react-stately/table': 3.15.1(react@19.2.1) + '@react-stately/virtualizer': 4.4.4(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-types/grid': 3.3.6(react@19.2.1) + '@react-types/shared': 3.32.1(react@19.2.1) + '@react-types/table': 3.13.4(react@19.2.1) '@swc/helpers': 0.5.17 - react: 19.2.0 - react-dom: 19.2.0(react@19.2.0) + react: 19.2.1 + react-dom: 19.2.1(react@19.2.1) - '@react-stately/list@3.13.1(react@19.2.0)': + '@react-stately/list@3.13.1(react@19.2.1)': dependencies: - '@react-stately/collections': 3.12.8(react@19.2.0) - '@react-stately/selection': 3.20.6(react@19.2.0) - '@react-stately/utils': 3.10.8(react@19.2.0) - '@react-types/shared': 3.32.1(react@19.2.0) + '@react-stately/collections': 3.12.8(react@19.2.1) + '@react-stately/selection': 3.20.6(react@19.2.1) + '@react-stately/utils': 3.10.8(react@19.2.1) + '@react-types/shared': 3.32.1(react@19.2.1) '@swc/helpers': 0.5.17 - react: 19.2.0 + react: 19.2.1 - '@react-stately/menu@3.9.8(react@19.2.0)': + '@react-stately/menu@3.9.8(react@19.2.1)': dependencies: - '@react-stately/overlays': 3.6.20(react@19.2.0) - '@react-types/menu': 3.10.5(react@19.2.0) - '@react-types/shared': 3.32.1(react@19.2.0) + '@react-stately/overlays': 3.6.20(react@19.2.1) + '@react-types/menu': 3.10.5(react@19.2.1) + '@react-types/shared': 3.32.1(react@19.2.1) '@swc/helpers': 0.5.17 - react: 19.2.0 + react: 19.2.1 - '@react-stately/numberfield@3.10.2(react@19.2.0)': + '@react-stately/numberfield@3.10.2(react@19.2.1)': dependencies: '@internationalized/number': 3.6.5 - '@react-stately/form': 3.2.2(react@19.2.0) - '@react-stately/utils': 3.10.8(react@19.2.0) - '@react-types/numberfield': 3.8.15(react@19.2.0) + '@react-stately/form': 3.2.2(react@19.2.1) + '@react-stately/utils': 3.10.8(react@19.2.1) + '@react-types/numberfield': 3.8.15(react@19.2.1) '@swc/helpers': 0.5.17 - react: 19.2.0 + react: 19.2.1 - '@react-stately/overlays@3.6.20(react@19.2.0)': + '@react-stately/overlays@3.6.20(react@19.2.1)': dependencies: - '@react-stately/utils': 3.10.8(react@19.2.0) - '@react-types/overlays': 3.9.2(react@19.2.0) + '@react-stately/utils': 3.10.8(react@19.2.1) + '@react-types/overlays': 3.9.2(react@19.2.1) '@swc/helpers': 0.5.17 - react: 19.2.0 + react: 19.2.1 - '@react-stately/radio@3.11.2(react@19.2.0)': + '@react-stately/radio@3.11.2(react@19.2.1)': dependencies: - '@react-stately/form': 3.2.2(react@19.2.0) - '@react-stately/utils': 3.10.8(react@19.2.0) - '@react-types/radio': 3.9.2(react@19.2.0) - '@react-types/shared': 3.32.1(react@19.2.0) + '@react-stately/form': 3.2.2(react@19.2.1) + '@react-stately/utils': 3.10.8(react@19.2.1) + '@react-types/radio': 3.9.2(react@19.2.1) + '@react-types/shared': 3.32.1(react@19.2.1) '@swc/helpers': 0.5.17 - react: 19.2.0 + react: 19.2.1 - '@react-stately/searchfield@3.5.16(react@19.2.0)': + '@react-stately/searchfield@3.5.16(react@19.2.1)': dependencies: - '@react-stately/utils': 3.10.8(react@19.2.0) - '@react-types/searchfield': 3.6.6(react@19.2.0) + '@react-stately/utils': 3.10.8(react@19.2.1) + '@react-types/searchfield': 3.6.6(react@19.2.1) '@swc/helpers': 0.5.17 - react: 19.2.0 + react: 19.2.1 - '@react-stately/select@3.8.0(react@19.2.0)': + '@react-stately/select@3.8.0(react@19.2.1)': dependencies: - '@react-stately/form': 3.2.2(react@19.2.0) - '@react-stately/list': 3.13.1(react@19.2.0) - '@react-stately/overlays': 3.6.20(react@19.2.0) - '@react-stately/utils': 3.10.8(react@19.2.0) - '@react-types/select': 3.11.0(react@19.2.0) - '@react-types/shared': 3.32.1(react@19.2.0) + '@react-stately/form': 3.2.2(react@19.2.1) + '@react-stately/list': 3.13.1(react@19.2.1) + '@react-stately/overlays': 3.6.20(react@19.2.1) + '@react-stately/utils': 3.10.8(react@19.2.1) + '@react-types/select': 3.11.0(react@19.2.1) + '@react-types/shared': 3.32.1(react@19.2.1) '@swc/helpers': 0.5.17 - react: 19.2.0 + react: 19.2.1 - '@react-stately/selection@3.20.6(react@19.2.0)': + '@react-stately/selection@3.20.6(react@19.2.1)': dependencies: - '@react-stately/collections': 3.12.8(react@19.2.0) - '@react-stately/utils': 3.10.8(react@19.2.0) - '@react-types/shared': 3.32.1(react@19.2.0) + '@react-stately/collections': 3.12.8(react@19.2.1) + '@react-stately/utils': 3.10.8(react@19.2.1) + '@react-types/shared': 3.32.1(react@19.2.1) '@swc/helpers': 0.5.17 - react: 19.2.0 + react: 19.2.1 - '@react-stately/slider@3.7.2(react@19.2.0)': + '@react-stately/slider@3.7.2(react@19.2.1)': dependencies: - '@react-stately/utils': 3.10.8(react@19.2.0) - '@react-types/shared': 3.32.1(react@19.2.0) - '@react-types/slider': 3.8.2(react@19.2.0) + '@react-stately/utils': 3.10.8(react@19.2.1) + '@react-types/shared': 3.32.1(react@19.2.1) + '@react-types/slider': 3.8.2(react@19.2.1) '@swc/helpers': 0.5.17 - react: 19.2.0 + react: 19.2.1 - '@react-stately/table@3.15.1(react@19.2.0)': + '@react-stately/table@3.15.1(react@19.2.1)': dependencies: - '@react-stately/collections': 3.12.8(react@19.2.0) + '@react-stately/collections': 3.12.8(react@19.2.1) '@react-stately/flags': 3.1.2 - '@react-stately/grid': 3.11.6(react@19.2.0) - '@react-stately/selection': 3.20.6(react@19.2.0) - '@react-stately/utils': 3.10.8(react@19.2.0) - '@react-types/grid': 3.3.6(react@19.2.0) - '@react-types/shared': 3.32.1(react@19.2.0) - '@react-types/table': 3.13.4(react@19.2.0) + '@react-stately/grid': 3.11.6(react@19.2.1) + '@react-stately/selection': 3.20.6(react@19.2.1) + '@react-stately/utils': 3.10.8(react@19.2.1) + '@react-types/grid': 3.3.6(react@19.2.1) + '@react-types/shared': 3.32.1(react@19.2.1) + '@react-types/table': 3.13.4(react@19.2.1) '@swc/helpers': 0.5.17 - react: 19.2.0 + react: 19.2.1 - '@react-stately/tabs@3.8.6(react@19.2.0)': + '@react-stately/tabs@3.8.6(react@19.2.1)': dependencies: - '@react-stately/list': 3.13.1(react@19.2.0) - '@react-types/shared': 3.32.1(react@19.2.0) - '@react-types/tabs': 3.3.19(react@19.2.0) + '@react-stately/list': 3.13.1(react@19.2.1) + '@react-types/shared': 3.32.1(react@19.2.1) + '@react-types/tabs': 3.3.19(react@19.2.1) '@swc/helpers': 0.5.17 - react: 19.2.0 + react: 19.2.1 - '@react-stately/toast@3.1.2(react@19.2.0)': + '@react-stately/toast@3.1.2(react@19.2.1)': dependencies: '@swc/helpers': 0.5.17 - react: 19.2.0 - use-sync-external-store: 1.6.0(react@19.2.0) + react: 19.2.1 + use-sync-external-store: 1.6.0(react@19.2.1) - '@react-stately/toggle@3.9.2(react@19.2.0)': + '@react-stately/toggle@3.9.2(react@19.2.1)': dependencies: - '@react-stately/utils': 3.10.8(react@19.2.0) - '@react-types/checkbox': 3.10.2(react@19.2.0) - '@react-types/shared': 3.32.1(react@19.2.0) + '@react-stately/utils': 3.10.8(react@19.2.1) + '@react-types/checkbox': 3.10.2(react@19.2.1) + '@react-types/shared': 3.32.1(react@19.2.1) '@swc/helpers': 0.5.17 - react: 19.2.0 + react: 19.2.1 - '@react-stately/tooltip@3.5.8(react@19.2.0)': + '@react-stately/tooltip@3.5.8(react@19.2.1)': dependencies: - '@react-stately/overlays': 3.6.20(react@19.2.0) - '@react-types/tooltip': 3.4.21(react@19.2.0) + '@react-stately/overlays': 3.6.20(react@19.2.1) + '@react-types/tooltip': 3.4.21(react@19.2.1) '@swc/helpers': 0.5.17 - react: 19.2.0 + react: 19.2.1 - '@react-stately/tree@3.9.3(react@19.2.0)': + '@react-stately/tree@3.9.3(react@19.2.1)': dependencies: - '@react-stately/collections': 3.12.8(react@19.2.0) - '@react-stately/selection': 3.20.6(react@19.2.0) - '@react-stately/utils': 3.10.8(react@19.2.0) - '@react-types/shared': 3.32.1(react@19.2.0) + '@react-stately/collections': 3.12.8(react@19.2.1) + '@react-stately/selection': 3.20.6(react@19.2.1) + '@react-stately/utils': 3.10.8(react@19.2.1) + '@react-types/shared': 3.32.1(react@19.2.1) '@swc/helpers': 0.5.17 - react: 19.2.0 + react: 19.2.1 - '@react-stately/utils@3.10.8(react@19.2.0)': + '@react-stately/utils@3.10.8(react@19.2.1)': dependencies: '@swc/helpers': 0.5.17 - react: 19.2.0 + react: 19.2.1 - '@react-stately/virtualizer@4.4.4(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@react-stately/virtualizer@4.4.4(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': dependencies: - '@react-types/shared': 3.32.1(react@19.2.0) + '@react-types/shared': 3.32.1(react@19.2.1) '@swc/helpers': 0.5.17 - react: 19.2.0 - react-dom: 19.2.0(react@19.2.0) + react: 19.2.1 + react-dom: 19.2.1(react@19.2.1) - '@react-types/autocomplete@3.0.0-alpha.35(react@19.2.0)': + '@react-types/autocomplete@3.0.0-alpha.35(react@19.2.1)': dependencies: - '@react-types/combobox': 3.13.9(react@19.2.0) - '@react-types/searchfield': 3.6.6(react@19.2.0) - '@react-types/shared': 3.32.1(react@19.2.0) - react: 19.2.0 + '@react-types/combobox': 3.13.9(react@19.2.1) + '@react-types/searchfield': 3.6.6(react@19.2.1) + '@react-types/shared': 3.32.1(react@19.2.1) + react: 19.2.1 - '@react-types/breadcrumbs@3.7.17(react@19.2.0)': + '@react-types/breadcrumbs@3.7.17(react@19.2.1)': dependencies: - '@react-types/link': 3.6.5(react@19.2.0) - '@react-types/shared': 3.32.1(react@19.2.0) - react: 19.2.0 + '@react-types/link': 3.6.5(react@19.2.1) + '@react-types/shared': 3.32.1(react@19.2.1) + react: 19.2.1 - '@react-types/button@3.14.1(react@19.2.0)': + '@react-types/button@3.14.1(react@19.2.1)': dependencies: - '@react-types/shared': 3.32.1(react@19.2.0) - react: 19.2.0 + '@react-types/shared': 3.32.1(react@19.2.1) + react: 19.2.1 - '@react-types/calendar@3.8.0(react@19.2.0)': + '@react-types/calendar@3.8.0(react@19.2.1)': dependencies: '@internationalized/date': 3.10.0 - '@react-types/shared': 3.32.1(react@19.2.0) - react: 19.2.0 + '@react-types/shared': 3.32.1(react@19.2.1) + react: 19.2.1 - '@react-types/checkbox@3.10.2(react@19.2.0)': + '@react-types/checkbox@3.10.2(react@19.2.1)': dependencies: - '@react-types/shared': 3.32.1(react@19.2.0) - react: 19.2.0 + '@react-types/shared': 3.32.1(react@19.2.1) + react: 19.2.1 - '@react-types/color@3.1.2(react@19.2.0)': + '@react-types/color@3.1.2(react@19.2.1)': dependencies: - '@react-types/shared': 3.32.1(react@19.2.0) - '@react-types/slider': 3.8.2(react@19.2.0) - react: 19.2.0 + '@react-types/shared': 3.32.1(react@19.2.1) + '@react-types/slider': 3.8.2(react@19.2.1) + react: 19.2.1 - '@react-types/combobox@3.13.9(react@19.2.0)': + '@react-types/combobox@3.13.9(react@19.2.1)': dependencies: - '@react-types/shared': 3.32.1(react@19.2.0) - react: 19.2.0 + '@react-types/shared': 3.32.1(react@19.2.1) + react: 19.2.1 - '@react-types/datepicker@3.13.2(react@19.2.0)': + '@react-types/datepicker@3.13.2(react@19.2.1)': dependencies: '@internationalized/date': 3.10.0 - '@react-types/calendar': 3.8.0(react@19.2.0) - '@react-types/overlays': 3.9.2(react@19.2.0) - '@react-types/shared': 3.32.1(react@19.2.0) - react: 19.2.0 + '@react-types/calendar': 3.8.0(react@19.2.1) + '@react-types/overlays': 3.9.2(react@19.2.1) + '@react-types/shared': 3.32.1(react@19.2.1) + react: 19.2.1 - '@react-types/dialog@3.5.22(react@19.2.0)': + '@react-types/dialog@3.5.22(react@19.2.1)': dependencies: - '@react-types/overlays': 3.9.2(react@19.2.0) - '@react-types/shared': 3.32.1(react@19.2.0) - react: 19.2.0 + '@react-types/overlays': 3.9.2(react@19.2.1) + '@react-types/shared': 3.32.1(react@19.2.1) + react: 19.2.1 - '@react-types/form@3.7.16(react@19.2.0)': + '@react-types/form@3.7.16(react@19.2.1)': dependencies: - '@react-types/shared': 3.32.1(react@19.2.0) - react: 19.2.0 + '@react-types/shared': 3.32.1(react@19.2.1) + react: 19.2.1 - '@react-types/grid@3.3.6(react@19.2.0)': + '@react-types/grid@3.3.6(react@19.2.1)': dependencies: - '@react-types/shared': 3.32.1(react@19.2.0) - react: 19.2.0 + '@react-types/shared': 3.32.1(react@19.2.1) + react: 19.2.1 - '@react-types/link@3.6.5(react@19.2.0)': + '@react-types/link@3.6.5(react@19.2.1)': dependencies: - '@react-types/shared': 3.32.1(react@19.2.0) - react: 19.2.0 + '@react-types/shared': 3.32.1(react@19.2.1) + react: 19.2.1 - '@react-types/listbox@3.7.4(react@19.2.0)': + '@react-types/listbox@3.7.4(react@19.2.1)': dependencies: - '@react-types/shared': 3.32.1(react@19.2.0) - react: 19.2.0 + '@react-types/shared': 3.32.1(react@19.2.1) + react: 19.2.1 - '@react-types/menu@3.10.5(react@19.2.0)': + '@react-types/menu@3.10.5(react@19.2.1)': dependencies: - '@react-types/overlays': 3.9.2(react@19.2.0) - '@react-types/shared': 3.32.1(react@19.2.0) - react: 19.2.0 + '@react-types/overlays': 3.9.2(react@19.2.1) + '@react-types/shared': 3.32.1(react@19.2.1) + react: 19.2.1 - '@react-types/meter@3.4.13(react@19.2.0)': + '@react-types/meter@3.4.13(react@19.2.1)': dependencies: - '@react-types/progress': 3.5.16(react@19.2.0) - react: 19.2.0 + '@react-types/progress': 3.5.16(react@19.2.1) + react: 19.2.1 - '@react-types/numberfield@3.8.15(react@19.2.0)': + '@react-types/numberfield@3.8.15(react@19.2.1)': dependencies: - '@react-types/shared': 3.32.1(react@19.2.0) - react: 19.2.0 + '@react-types/shared': 3.32.1(react@19.2.1) + react: 19.2.1 - '@react-types/overlays@3.9.2(react@19.2.0)': + '@react-types/overlays@3.9.2(react@19.2.1)': dependencies: - '@react-types/shared': 3.32.1(react@19.2.0) - react: 19.2.0 + '@react-types/shared': 3.32.1(react@19.2.1) + react: 19.2.1 - '@react-types/progress@3.5.16(react@19.2.0)': + '@react-types/progress@3.5.16(react@19.2.1)': dependencies: - '@react-types/shared': 3.32.1(react@19.2.0) - react: 19.2.0 + '@react-types/shared': 3.32.1(react@19.2.1) + react: 19.2.1 - '@react-types/radio@3.9.2(react@19.2.0)': + '@react-types/radio@3.9.2(react@19.2.1)': dependencies: - '@react-types/shared': 3.32.1(react@19.2.0) - react: 19.2.0 + '@react-types/shared': 3.32.1(react@19.2.1) + react: 19.2.1 - '@react-types/searchfield@3.6.6(react@19.2.0)': + '@react-types/searchfield@3.6.6(react@19.2.1)': dependencies: - '@react-types/shared': 3.32.1(react@19.2.0) - '@react-types/textfield': 3.12.6(react@19.2.0) - react: 19.2.0 + '@react-types/shared': 3.32.1(react@19.2.1) + '@react-types/textfield': 3.12.6(react@19.2.1) + react: 19.2.1 - '@react-types/select@3.11.0(react@19.2.0)': + '@react-types/select@3.11.0(react@19.2.1)': dependencies: - '@react-types/shared': 3.32.1(react@19.2.0) - react: 19.2.0 + '@react-types/shared': 3.32.1(react@19.2.1) + react: 19.2.1 - '@react-types/shared@3.32.1(react@19.2.0)': + '@react-types/shared@3.32.1(react@19.2.1)': dependencies: - react: 19.2.0 + react: 19.2.1 - '@react-types/slider@3.8.2(react@19.2.0)': + '@react-types/slider@3.8.2(react@19.2.1)': dependencies: - '@react-types/shared': 3.32.1(react@19.2.0) - react: 19.2.0 + '@react-types/shared': 3.32.1(react@19.2.1) + react: 19.2.1 - '@react-types/switch@3.5.15(react@19.2.0)': + '@react-types/switch@3.5.15(react@19.2.1)': dependencies: - '@react-types/shared': 3.32.1(react@19.2.0) - react: 19.2.0 + '@react-types/shared': 3.32.1(react@19.2.1) + react: 19.2.1 - '@react-types/table@3.13.4(react@19.2.0)': + '@react-types/table@3.13.4(react@19.2.1)': dependencies: - '@react-types/grid': 3.3.6(react@19.2.0) - '@react-types/shared': 3.32.1(react@19.2.0) - react: 19.2.0 + '@react-types/grid': 3.3.6(react@19.2.1) + '@react-types/shared': 3.32.1(react@19.2.1) + react: 19.2.1 - '@react-types/tabs@3.3.19(react@19.2.0)': + '@react-types/tabs@3.3.19(react@19.2.1)': dependencies: - '@react-types/shared': 3.32.1(react@19.2.0) - react: 19.2.0 + '@react-types/shared': 3.32.1(react@19.2.1) + react: 19.2.1 - '@react-types/textfield@3.12.6(react@19.2.0)': + '@react-types/textfield@3.12.6(react@19.2.1)': dependencies: - '@react-types/shared': 3.32.1(react@19.2.0) - react: 19.2.0 + '@react-types/shared': 3.32.1(react@19.2.1) + react: 19.2.1 - '@react-types/tooltip@3.4.21(react@19.2.0)': + '@react-types/tooltip@3.4.21(react@19.2.1)': dependencies: - '@react-types/overlays': 3.9.2(react@19.2.0) - '@react-types/shared': 3.32.1(react@19.2.0) - react: 19.2.0 + '@react-types/overlays': 3.9.2(react@19.2.1) + '@react-types/shared': 3.32.1(react@19.2.1) + react: 19.2.1 '@redis/bloom@1.2.0(@redis/client@1.6.1)': dependencies: @@ -9981,12 +9981,12 @@ snapshots: dependencies: tslib: 2.8.1 - '@tanstack/query-core@5.90.10': {} + '@tanstack/query-core@5.90.11': {} - '@tanstack/react-query@5.90.10(react@19.2.0)': + '@tanstack/react-query@5.90.11(react@19.2.1)': dependencies: - '@tanstack/query-core': 5.90.10 - react: 19.2.0 + '@tanstack/query-core': 5.90.11 + react: 19.2.1 '@trysound/sax@0.2.0': {} @@ -10040,9 +10040,9 @@ snapshots: dependencies: '@types/node': 24.10.1 - '@types/hoist-non-react-statics@3.3.7(@types/react@19.2.6)': + '@types/hoist-non-react-statics@3.3.7(@types/react@19.2.7)': dependencies: - '@types/react': 19.2.6 + '@types/react': 19.2.7 hoist-non-react-statics: 3.3.2 '@types/istanbul-lib-coverage@2.0.6': {} @@ -10080,15 +10080,15 @@ snapshots: '@types/normalize-package-data@2.4.4': {} - '@types/react-dom@19.2.3(@types/react@19.2.6)': + '@types/react-dom@19.2.3(@types/react@19.2.7)': dependencies: - '@types/react': 19.2.6 + '@types/react': 19.2.7 '@types/react-window@1.8.8': dependencies: - '@types/react': 19.2.6 + '@types/react': 19.2.7 - '@types/react@19.2.6': + '@types/react@19.2.7': dependencies: csstype: 3.2.3 @@ -10117,24 +10117,24 @@ snapshots: '@types/node': 24.10.1 optional: true - '@umami/react-zen@0.211.0(@babel/core@7.28.3)(@types/react@19.2.6)(babel-plugin-react-compiler@19.1.0-rc.2)(immer@10.2.0)(use-sync-external-store@1.6.0(react@19.2.0))': + '@umami/react-zen@0.211.0(@babel/core@7.28.3)(@types/react@19.2.7)(babel-plugin-react-compiler@19.1.0-rc.2)(immer@10.2.0)(use-sync-external-store@1.6.0(react@19.2.1))': dependencies: '@fontsource/jetbrains-mono': 5.2.8 '@internationalized/date': 3.10.0 - '@react-aria/focus': 3.21.2(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-spring/web': 9.7.5(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@react-aria/focus': 3.21.2(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-spring/web': 9.7.5(react-dom@19.2.1(react@19.2.1))(react@19.2.1) classnames: 2.5.1 glob: 13.0.0 highlight.js: 11.11.1 - lucide-react: 0.555.0(react@19.2.0) - next: 16.0.6(@babel/core@7.28.3)(babel-plugin-react-compiler@19.1.0-rc.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - react: 19.2.0 - react-aria-components: 1.13.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - react-dom: 19.2.0(react@19.2.0) - react-hook-form: 7.67.0(react@19.2.0) - react-icons: 5.5.0(react@19.2.0) + lucide-react: 0.555.0(react@19.2.1) + next: 16.0.7(@babel/core@7.28.3)(babel-plugin-react-compiler@19.1.0-rc.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + react: 19.2.1 + react-aria-components: 1.13.0(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + react-dom: 19.2.1(react@19.2.1) + react-hook-form: 7.67.0(react@19.2.1) + react-icons: 5.5.0(react@19.2.1) thenby: 1.3.4 - zustand: 5.0.8(@types/react@19.2.6)(immer@10.2.0)(react@19.2.0)(use-sync-external-store@1.6.0(react@19.2.0)) + zustand: 5.0.9(@types/react@19.2.7)(immer@10.2.0)(react@19.2.1)(use-sync-external-store@1.6.0(react@19.2.1)) transitivePeerDependencies: - '@babel/core' - '@opentelemetry/api' @@ -10174,7 +10174,7 @@ snapshots: '@vue/compiler-ssr': 3.5.18 '@vue/shared': 3.5.18 estree-walker: 2.0.2 - magic-string: 0.30.18 + magic-string: 0.30.21 postcss: 8.5.6 source-map-js: 1.2.1 @@ -10368,12 +10368,12 @@ snapshots: dependencies: '@babel/types': 7.28.2 - babel-plugin-react-intl@7.9.4(ts-jest@29.4.5(@babel/core@7.28.3)(@jest/transform@29.7.0)(@jest/types@30.0.5)(babel-jest@29.7.0(@babel/core@7.28.3))(esbuild@0.25.12)(jest-util@30.0.5)(jest@29.7.0(@types/node@24.10.1)(ts-node@10.9.2(@types/node@24.10.1)(typescript@5.9.3)))(typescript@5.9.3)): + babel-plugin-react-intl@7.9.4(ts-jest@29.4.6(@babel/core@7.28.3)(@jest/transform@29.7.0)(@jest/types@30.0.5)(babel-jest@29.7.0(@babel/core@7.28.3))(esbuild@0.25.12)(jest-util@30.0.5)(jest@29.7.0(@types/node@24.10.1)(ts-node@10.9.2(@types/node@24.10.1)(typescript@5.9.3)))(typescript@5.9.3)): dependencies: '@babel/core': 7.28.3 '@babel/helper-plugin-utils': 7.27.1 '@babel/types': 7.28.2 - '@formatjs/ts-transformer': 2.13.0(ts-jest@29.4.5(@babel/core@7.28.3)(@jest/transform@29.7.0)(@jest/types@30.0.5)(babel-jest@29.7.0(@babel/core@7.28.3))(esbuild@0.25.12)(jest-util@30.0.5)(jest@29.7.0(@types/node@24.10.1)(ts-node@10.9.2(@types/node@24.10.1)(typescript@5.9.3)))(typescript@5.9.3)) + '@formatjs/ts-transformer': 2.13.0(ts-jest@29.4.6(@babel/core@7.28.3)(@jest/transform@29.7.0)(@jest/types@30.0.5)(babel-jest@29.7.0(@babel/core@7.28.3))(esbuild@0.25.12)(jest-util@30.0.5)(jest@29.7.0(@types/node@24.10.1)(ts-node@10.9.2(@types/node@24.10.1)(typescript@5.9.3)))(typescript@5.9.3)) '@types/babel__core': 7.20.5 '@types/fs-extra': 9.0.13 '@types/schema-utils': 2.4.0 @@ -11388,10 +11388,10 @@ snapshots: extend@3.0.2: {} - extract-react-intl-messages@4.1.1(ts-jest@29.4.5(@babel/core@7.28.3)(@jest/transform@29.7.0)(@jest/types@30.0.5)(babel-jest@29.7.0(@babel/core@7.28.3))(esbuild@0.25.12)(jest-util@30.0.5)(jest@29.7.0(@types/node@24.10.1)(ts-node@10.9.2(@types/node@24.10.1)(typescript@5.9.3)))(typescript@5.9.3)): + extract-react-intl-messages@4.1.1(ts-jest@29.4.6(@babel/core@7.28.3)(@jest/transform@29.7.0)(@jest/types@30.0.5)(babel-jest@29.7.0(@babel/core@7.28.3))(esbuild@0.25.12)(jest-util@30.0.5)(jest@29.7.0(@types/node@24.10.1)(ts-node@10.9.2(@types/node@24.10.1)(typescript@5.9.3)))(typescript@5.9.3)): dependencies: '@babel/core': 7.28.3 - babel-plugin-react-intl: 7.9.4(ts-jest@29.4.5(@babel/core@7.28.3)(@jest/transform@29.7.0)(@jest/types@30.0.5)(babel-jest@29.7.0(@babel/core@7.28.3))(esbuild@0.25.12)(jest-util@30.0.5)(jest@29.7.0(@types/node@24.10.1)(ts-node@10.9.2(@types/node@24.10.1)(typescript@5.9.3)))(typescript@5.9.3)) + babel-plugin-react-intl: 7.9.4(ts-jest@29.4.6(@babel/core@7.28.3)(@jest/transform@29.7.0)(@jest/types@30.0.5)(babel-jest@29.7.0(@babel/core@7.28.3))(esbuild@0.25.12)(jest-util@30.0.5)(jest@29.7.0(@types/node@24.10.1)(ts-node@10.9.2(@types/node@24.10.1)(typescript@5.9.3)))(typescript@5.9.3)) flat: 5.0.2 glob: 7.2.3 js-yaml: 3.14.1 @@ -11486,7 +11486,7 @@ snapshots: fix-dts-default-cjs-exports@1.0.1: dependencies: - magic-string: 0.30.18 + magic-string: 0.30.21 mlly: 1.8.0 rollup: 4.53.3 @@ -11867,7 +11867,7 @@ snapshots: '@formatjs/icu-messageformat-parser': 2.11.4 tslib: 2.8.1 - ipaddr.js@2.2.0: {} + ipaddr.js@2.3.0: {} is-array-buffer@3.0.5: dependencies: @@ -12696,19 +12696,19 @@ snapshots: dependencies: yallist: 4.0.0 - lucide-react@0.543.0(react@19.2.0): + lucide-react@0.543.0(react@19.2.1): dependencies: - react: 19.2.0 + react: 19.2.1 - lucide-react@0.555.0(react@19.2.0): + lucide-react@0.555.0(react@19.2.1): dependencies: - react: 19.2.0 + react: 19.2.1 magic-string@0.30.17: dependencies: '@jridgewell/sourcemap-codec': 1.5.5 - magic-string@0.30.18: + magic-string@0.30.21: dependencies: '@jridgewell/sourcemap-codec': 1.5.5 @@ -12875,48 +12875,48 @@ snapshots: neo-async@2.6.2: {} - next@15.5.3(@babel/core@7.28.3)(babel-plugin-react-compiler@19.1.0-rc.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0): + next@15.5.7(@babel/core@7.28.3)(babel-plugin-react-compiler@19.1.0-rc.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1): dependencies: - '@next/env': 15.5.3 + '@next/env': 15.5.7 '@swc/helpers': 0.5.15 caniuse-lite: 1.0.30001741 postcss: 8.4.31 - react: 19.2.0 - react-dom: 19.2.0(react@19.2.0) - styled-jsx: 5.1.6(@babel/core@7.28.3)(react@19.2.0) + react: 19.2.1 + react-dom: 19.2.1(react@19.2.1) + styled-jsx: 5.1.6(@babel/core@7.28.3)(react@19.2.1) optionalDependencies: - '@next/swc-darwin-arm64': 15.5.3 - '@next/swc-darwin-x64': 15.5.3 - '@next/swc-linux-arm64-gnu': 15.5.3 - '@next/swc-linux-arm64-musl': 15.5.3 - '@next/swc-linux-x64-gnu': 15.5.3 - '@next/swc-linux-x64-musl': 15.5.3 - '@next/swc-win32-arm64-msvc': 15.5.3 - '@next/swc-win32-x64-msvc': 15.5.3 + '@next/swc-darwin-arm64': 15.5.7 + '@next/swc-darwin-x64': 15.5.7 + '@next/swc-linux-arm64-gnu': 15.5.7 + '@next/swc-linux-arm64-musl': 15.5.7 + '@next/swc-linux-x64-gnu': 15.5.7 + '@next/swc-linux-x64-musl': 15.5.7 + '@next/swc-win32-arm64-msvc': 15.5.7 + '@next/swc-win32-x64-msvc': 15.5.7 babel-plugin-react-compiler: 19.1.0-rc.2 sharp: 0.34.3 transitivePeerDependencies: - '@babel/core' - babel-plugin-macros - next@16.0.6(@babel/core@7.28.3)(babel-plugin-react-compiler@19.1.0-rc.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0): + next@16.0.7(@babel/core@7.28.3)(babel-plugin-react-compiler@19.1.0-rc.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1): dependencies: - '@next/env': 16.0.6 + '@next/env': 16.0.7 '@swc/helpers': 0.5.15 caniuse-lite: 1.0.30001759 postcss: 8.4.31 - react: 19.2.0 - react-dom: 19.2.0(react@19.2.0) - styled-jsx: 5.1.6(@babel/core@7.28.3)(react@19.2.0) + react: 19.2.1 + react-dom: 19.2.1(react@19.2.1) + styled-jsx: 5.1.6(@babel/core@7.28.3)(react@19.2.1) optionalDependencies: - '@next/swc-darwin-arm64': 16.0.6 - '@next/swc-darwin-x64': 16.0.6 - '@next/swc-linux-arm64-gnu': 16.0.6 - '@next/swc-linux-arm64-musl': 16.0.6 - '@next/swc-linux-x64-gnu': 16.0.6 - '@next/swc-linux-x64-musl': 16.0.6 - '@next/swc-win32-arm64-msvc': 16.0.6 - '@next/swc-win32-x64-msvc': 16.0.6 + '@next/swc-darwin-arm64': 16.0.7 + '@next/swc-darwin-x64': 16.0.7 + '@next/swc-linux-arm64-gnu': 16.0.7 + '@next/swc-linux-arm64-musl': 16.0.7 + '@next/swc-linux-x64-gnu': 16.0.7 + '@next/swc-linux-x64-musl': 16.0.7 + '@next/swc-win32-arm64-msvc': 16.0.7 + '@next/swc-win32-x64-msvc': 16.0.7 babel-plugin-react-compiler: 19.1.0-rc.2 sharp: 0.34.5 transitivePeerDependencies: @@ -13711,115 +13711,115 @@ snapshots: defu: 6.1.4 destr: 2.0.5 - react-aria-components@1.13.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0): + react-aria-components@1.13.0(react-dom@19.2.1(react@19.2.1))(react@19.2.1): dependencies: '@internationalized/date': 3.10.0 '@internationalized/string': 3.2.7 - '@react-aria/autocomplete': 3.0.0-rc.3(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/collections': 3.0.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/dnd': 3.11.3(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/focus': 3.21.2(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/interactions': 3.25.6(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@react-aria/autocomplete': 3.0.0-rc.3(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/collections': 3.0.0(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/dnd': 3.11.3(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/focus': 3.21.2(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/interactions': 3.25.6(react-dom@19.2.1(react@19.2.1))(react@19.2.1) '@react-aria/live-announcer': 3.4.4 - '@react-aria/overlays': 3.30.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/ssr': 3.9.10(react@19.2.0) - '@react-aria/textfield': 3.18.2(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/toolbar': 3.0.0-beta.21(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/utils': 3.31.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/virtualizer': 4.1.10(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-stately/autocomplete': 3.0.0-beta.3(react@19.2.0) - '@react-stately/layout': 4.5.1(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-stately/selection': 3.20.6(react@19.2.0) - '@react-stately/table': 3.15.1(react@19.2.0) - '@react-stately/utils': 3.10.8(react@19.2.0) - '@react-stately/virtualizer': 4.4.4(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-types/form': 3.7.16(react@19.2.0) - '@react-types/grid': 3.3.6(react@19.2.0) - '@react-types/shared': 3.32.1(react@19.2.0) - '@react-types/table': 3.13.4(react@19.2.0) + '@react-aria/overlays': 3.30.0(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/ssr': 3.9.10(react@19.2.1) + '@react-aria/textfield': 3.18.2(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/toolbar': 3.0.0-beta.21(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/utils': 3.31.0(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/virtualizer': 4.1.10(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-stately/autocomplete': 3.0.0-beta.3(react@19.2.1) + '@react-stately/layout': 4.5.1(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-stately/selection': 3.20.6(react@19.2.1) + '@react-stately/table': 3.15.1(react@19.2.1) + '@react-stately/utils': 3.10.8(react@19.2.1) + '@react-stately/virtualizer': 4.4.4(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-types/form': 3.7.16(react@19.2.1) + '@react-types/grid': 3.3.6(react@19.2.1) + '@react-types/shared': 3.32.1(react@19.2.1) + '@react-types/table': 3.13.4(react@19.2.1) '@swc/helpers': 0.5.17 client-only: 0.0.1 - react: 19.2.0 - react-aria: 3.44.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - react-dom: 19.2.0(react@19.2.0) - react-stately: 3.42.0(react@19.2.0) - use-sync-external-store: 1.6.0(react@19.2.0) + react: 19.2.1 + react-aria: 3.44.0(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + react-dom: 19.2.1(react@19.2.1) + react-stately: 3.42.0(react@19.2.1) + use-sync-external-store: 1.6.0(react@19.2.1) - react-aria@3.44.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0): + react-aria@3.44.0(react-dom@19.2.1(react@19.2.1))(react@19.2.1): dependencies: '@internationalized/string': 3.2.7 - '@react-aria/breadcrumbs': 3.5.29(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/button': 3.14.2(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/calendar': 3.9.2(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/checkbox': 3.16.2(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/color': 3.1.2(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/combobox': 3.14.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/datepicker': 3.15.2(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/dialog': 3.5.31(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/disclosure': 3.1.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/dnd': 3.11.3(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/focus': 3.21.2(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/gridlist': 3.14.1(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/i18n': 3.12.13(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/interactions': 3.25.6(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/label': 3.7.22(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/landmark': 3.0.7(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/link': 3.8.6(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/listbox': 3.15.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/menu': 3.19.3(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/meter': 3.4.27(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/numberfield': 3.12.2(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/overlays': 3.30.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/progress': 3.4.27(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/radio': 3.12.2(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/searchfield': 3.8.9(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/select': 3.17.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/selection': 3.26.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/separator': 3.4.13(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/slider': 3.8.2(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/ssr': 3.9.10(react@19.2.0) - '@react-aria/switch': 3.7.8(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/table': 3.17.8(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/tabs': 3.10.8(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/tag': 3.7.2(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/textfield': 3.18.2(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/toast': 3.0.8(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/tooltip': 3.8.8(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/tree': 3.1.4(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/utils': 3.31.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/visually-hidden': 3.8.28(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-types/shared': 3.32.1(react@19.2.0) - react: 19.2.0 - react-dom: 19.2.0(react@19.2.0) + '@react-aria/breadcrumbs': 3.5.29(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/button': 3.14.2(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/calendar': 3.9.2(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/checkbox': 3.16.2(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/color': 3.1.2(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/combobox': 3.14.0(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/datepicker': 3.15.2(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/dialog': 3.5.31(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/disclosure': 3.1.0(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/dnd': 3.11.3(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/focus': 3.21.2(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/gridlist': 3.14.1(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/i18n': 3.12.13(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/interactions': 3.25.6(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/label': 3.7.22(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/landmark': 3.0.7(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/link': 3.8.6(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/listbox': 3.15.0(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/menu': 3.19.3(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/meter': 3.4.27(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/numberfield': 3.12.2(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/overlays': 3.30.0(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/progress': 3.4.27(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/radio': 3.12.2(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/searchfield': 3.8.9(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/select': 3.17.0(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/selection': 3.26.0(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/separator': 3.4.13(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/slider': 3.8.2(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/ssr': 3.9.10(react@19.2.1) + '@react-aria/switch': 3.7.8(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/table': 3.17.8(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/tabs': 3.10.8(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/tag': 3.7.2(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/textfield': 3.18.2(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/toast': 3.0.8(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/tooltip': 3.8.8(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/tree': 3.1.4(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/utils': 3.31.0(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/visually-hidden': 3.8.28(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-types/shared': 3.32.1(react@19.2.1) + react: 19.2.1 + react-dom: 19.2.1(react@19.2.1) - react-dom@19.2.0(react@19.2.0): + react-dom@19.2.1(react@19.2.1): dependencies: - react: 19.2.0 + react: 19.2.1 scheduler: 0.27.0 - react-error-boundary@4.1.2(react@19.2.0): + react-error-boundary@4.1.2(react@19.2.1): dependencies: '@babel/runtime': 7.28.3 - react: 19.2.0 + react: 19.2.1 - react-hook-form@7.67.0(react@19.2.0): + react-hook-form@7.67.0(react@19.2.1): dependencies: - react: 19.2.0 + react: 19.2.1 - react-icons@5.5.0(react@19.2.0): + react-icons@5.5.0(react@19.2.1): dependencies: - react: 19.2.0 + react: 19.2.1 - react-intl@7.1.14(react@19.2.0)(typescript@5.9.3): + react-intl@7.1.14(react@19.2.1)(typescript@5.9.3): dependencies: '@formatjs/ecma402-abstract': 2.3.6 '@formatjs/icu-messageformat-parser': 2.11.4 '@formatjs/intl': 3.1.8(typescript@5.9.3) - '@types/hoist-non-react-statics': 3.3.7(@types/react@19.2.6) - '@types/react': 19.2.6 + '@types/hoist-non-react-statics': 3.3.7(@types/react@19.2.7) + '@types/react': 19.2.7 hoist-non-react-statics: 3.3.2 intl-messageformat: 10.7.18 - react: 19.2.0 + react: 19.2.1 tslib: 2.8.1 optionalDependencies: typescript: 5.9.3 @@ -13828,69 +13828,69 @@ snapshots: react-is@18.3.1: {} - react-redux@9.2.0(@types/react@19.2.6)(react@19.2.0)(redux@5.0.1): + react-redux@9.2.0(@types/react@19.2.7)(react@19.2.1)(redux@5.0.1): dependencies: '@types/use-sync-external-store': 0.0.6 - react: 19.2.0 - use-sync-external-store: 1.5.0(react@19.2.0) + react: 19.2.1 + use-sync-external-store: 1.5.0(react@19.2.1) optionalDependencies: - '@types/react': 19.2.6 + '@types/react': 19.2.7 redux: 5.0.1 - react-simple-maps@2.3.0(prop-types@15.8.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0): + react-simple-maps@2.3.0(prop-types@15.8.1)(react-dom@19.2.1(react@19.2.1))(react@19.2.1): dependencies: d3-geo: 2.0.2 d3-selection: 2.0.0 d3-zoom: 2.0.0 prop-types: 15.8.1 - react: 19.2.0 - react-dom: 19.2.0(react@19.2.0) + react: 19.2.1 + react-dom: 19.2.1(react@19.2.1) topojson-client: 3.1.0 - react-stately@3.42.0(react@19.2.0): + react-stately@3.42.0(react@19.2.1): dependencies: - '@react-stately/calendar': 3.9.0(react@19.2.0) - '@react-stately/checkbox': 3.7.2(react@19.2.0) - '@react-stately/collections': 3.12.8(react@19.2.0) - '@react-stately/color': 3.9.2(react@19.2.0) - '@react-stately/combobox': 3.12.0(react@19.2.0) - '@react-stately/data': 3.14.1(react@19.2.0) - '@react-stately/datepicker': 3.15.2(react@19.2.0) - '@react-stately/disclosure': 3.0.8(react@19.2.0) - '@react-stately/dnd': 3.7.1(react@19.2.0) - '@react-stately/form': 3.2.2(react@19.2.0) - '@react-stately/list': 3.13.1(react@19.2.0) - '@react-stately/menu': 3.9.8(react@19.2.0) - '@react-stately/numberfield': 3.10.2(react@19.2.0) - '@react-stately/overlays': 3.6.20(react@19.2.0) - '@react-stately/radio': 3.11.2(react@19.2.0) - '@react-stately/searchfield': 3.5.16(react@19.2.0) - '@react-stately/select': 3.8.0(react@19.2.0) - '@react-stately/selection': 3.20.6(react@19.2.0) - '@react-stately/slider': 3.7.2(react@19.2.0) - '@react-stately/table': 3.15.1(react@19.2.0) - '@react-stately/tabs': 3.8.6(react@19.2.0) - '@react-stately/toast': 3.1.2(react@19.2.0) - '@react-stately/toggle': 3.9.2(react@19.2.0) - '@react-stately/tooltip': 3.5.8(react@19.2.0) - '@react-stately/tree': 3.9.3(react@19.2.0) - '@react-types/shared': 3.32.1(react@19.2.0) - react: 19.2.0 + '@react-stately/calendar': 3.9.0(react@19.2.1) + '@react-stately/checkbox': 3.7.2(react@19.2.1) + '@react-stately/collections': 3.12.8(react@19.2.1) + '@react-stately/color': 3.9.2(react@19.2.1) + '@react-stately/combobox': 3.12.0(react@19.2.1) + '@react-stately/data': 3.14.1(react@19.2.1) + '@react-stately/datepicker': 3.15.2(react@19.2.1) + '@react-stately/disclosure': 3.0.8(react@19.2.1) + '@react-stately/dnd': 3.7.1(react@19.2.1) + '@react-stately/form': 3.2.2(react@19.2.1) + '@react-stately/list': 3.13.1(react@19.2.1) + '@react-stately/menu': 3.9.8(react@19.2.1) + '@react-stately/numberfield': 3.10.2(react@19.2.1) + '@react-stately/overlays': 3.6.20(react@19.2.1) + '@react-stately/radio': 3.11.2(react@19.2.1) + '@react-stately/searchfield': 3.5.16(react@19.2.1) + '@react-stately/select': 3.8.0(react@19.2.1) + '@react-stately/selection': 3.20.6(react@19.2.1) + '@react-stately/slider': 3.7.2(react@19.2.1) + '@react-stately/table': 3.15.1(react@19.2.1) + '@react-stately/tabs': 3.8.6(react@19.2.1) + '@react-stately/toast': 3.1.2(react@19.2.1) + '@react-stately/toggle': 3.9.2(react@19.2.1) + '@react-stately/tooltip': 3.5.8(react@19.2.1) + '@react-stately/tree': 3.9.3(react@19.2.1) + '@react-types/shared': 3.32.1(react@19.2.1) + react: 19.2.1 - react-use-measure@2.1.7(react-dom@19.2.0(react@19.2.0))(react@19.2.0): + react-use-measure@2.1.7(react-dom@19.2.1(react@19.2.1))(react@19.2.1): dependencies: - react: 19.2.0 + react: 19.2.1 optionalDependencies: - react-dom: 19.2.0(react@19.2.0) + react-dom: 19.2.1(react@19.2.1) - react-window@1.8.11(react-dom@19.2.0(react@19.2.0))(react@19.2.0): + react-window@1.8.11(react-dom@19.2.1(react@19.2.1))(react@19.2.1): dependencies: '@babel/runtime': 7.28.3 memoize-one: 5.2.1 - react: 19.2.0 - react-dom: 19.2.0(react@19.2.0) + react: 19.2.1 + react-dom: 19.2.1(react@19.2.1) - react@19.2.0: {} + react@19.2.1: {} read-babelrc-up@1.1.0: dependencies: @@ -14045,9 +14045,9 @@ snapshots: del: 8.0.0 rollup: 4.53.3 - rollup-plugin-dts@6.2.3(rollup@4.53.3)(typescript@5.9.3): + rollup-plugin-dts@6.3.0(rollup@4.53.3)(typescript@5.9.3): dependencies: - magic-string: 0.30.18 + magic-string: 0.30.21 rollup: 4.53.3 typescript: 5.9.3 optionalDependencies: @@ -14491,10 +14491,10 @@ snapshots: style-search@0.1.0: {} - styled-jsx@5.1.6(@babel/core@7.28.3)(react@19.2.0): + styled-jsx@5.1.6(@babel/core@7.28.3)(react@19.2.1): dependencies: client-only: 0.0.1 - react: 19.2.0 + react: 19.2.1 optionalDependencies: '@babel/core': 7.28.3 @@ -14717,7 +14717,7 @@ snapshots: ts-interface-checker@0.1.13: {} - ts-jest@29.4.5(@babel/core@7.28.3)(@jest/transform@29.7.0)(@jest/types@30.0.5)(babel-jest@29.7.0(@babel/core@7.28.3))(esbuild@0.25.12)(jest-util@30.0.5)(jest@29.7.0(@types/node@24.10.1)(ts-node@10.9.2(@types/node@24.10.1)(typescript@5.9.3)))(typescript@5.9.3): + ts-jest@29.4.6(@babel/core@7.28.3)(@jest/transform@29.7.0)(@jest/types@30.0.5)(babel-jest@29.7.0(@babel/core@7.28.3))(esbuild@0.25.12)(jest-util@30.0.5)(jest@29.7.0(@types/node@24.10.1)(ts-node@10.9.2(@types/node@24.10.1)(typescript@5.9.3)))(typescript@5.9.3): dependencies: bs-logger: 0.2.6 fast-json-stable-stringify: 2.1.0 @@ -14894,17 +14894,17 @@ snapshots: dependencies: punycode: 2.3.1 - use-memo-one@1.1.3(react@19.2.0): + use-memo-one@1.1.3(react@19.2.1): dependencies: - react: 19.2.0 + react: 19.2.1 - use-sync-external-store@1.5.0(react@19.2.0): + use-sync-external-store@1.5.0(react@19.2.1): dependencies: - react: 19.2.0 + react: 19.2.1 - use-sync-external-store@1.6.0(react@19.2.0): + use-sync-external-store@1.6.0(react@19.2.1): dependencies: - react: 19.2.0 + react: 19.2.1 util-deprecate@1.0.2: {} @@ -15092,11 +15092,11 @@ snapshots: yocto-queue@0.1.0: {} - zod@4.1.12: {} + zod@4.1.13: {} - zustand@5.0.8(@types/react@19.2.6)(immer@10.2.0)(react@19.2.0)(use-sync-external-store@1.6.0(react@19.2.0)): + zustand@5.0.9(@types/react@19.2.7)(immer@10.2.0)(react@19.2.1)(use-sync-external-store@1.6.0(react@19.2.1)): optionalDependencies: - '@types/react': 19.2.6 + '@types/react': 19.2.7 immer: 10.2.0 - react: 19.2.0 - use-sync-external-store: 1.6.0(react@19.2.0) + react: 19.2.1 + use-sync-external-store: 1.6.0(react@19.2.1) diff --git a/src/app/(main)/links/[linkId]/LinkHeader.tsx b/src/app/(main)/links/[linkId]/LinkHeader.tsx index 33f0c242..a84a6260 100644 --- a/src/app/(main)/links/[linkId]/LinkHeader.tsx +++ b/src/app/(main)/links/[linkId]/LinkHeader.tsx @@ -1,4 +1,4 @@ -import { Icon, Text } from '@umami/react-zen'; +import { IconLabel } from '@umami/react-zen'; import { LinkButton } from '@/components/common/LinkButton'; import { PageHeader } from '@/components/common/PageHeader'; import { useLink, useMessages, useSlug } from '@/components/hooks'; @@ -10,12 +10,9 @@ export function LinkHeader() { const link = useLink(); return ( - } marginBottom="3"> - - - - - {formatMessage(labels.view)} + }> + + } label={formatMessage(labels.view)} /> ); diff --git a/src/app/(main)/pixels/[pixelId]/PixelHeader.tsx b/src/app/(main)/pixels/[pixelId]/PixelHeader.tsx index 8171aaf1..c771687f 100644 --- a/src/app/(main)/pixels/[pixelId]/PixelHeader.tsx +++ b/src/app/(main)/pixels/[pixelId]/PixelHeader.tsx @@ -1,4 +1,4 @@ -import { Icon, Text } from '@umami/react-zen'; +import { IconLabel } from '@umami/react-zen'; import { LinkButton } from '@/components/common/LinkButton'; import { PageHeader } from '@/components/common/PageHeader'; import { useMessages, usePixel, useSlug } from '@/components/hooks'; @@ -10,12 +10,9 @@ export function PixelHeader() { const pixel = usePixel(); return ( - } marginBottom="3"> - - - - - {formatMessage(labels.view)} + }> + + } label={formatMessage(labels.view)} /> ); diff --git a/src/app/(main)/websites/[websiteId]/WebsiteHeader.tsx b/src/app/(main)/websites/[websiteId]/WebsiteHeader.tsx index e7a92516..7dd1d771 100644 --- a/src/app/(main)/websites/[websiteId]/WebsiteHeader.tsx +++ b/src/app/(main)/websites/[websiteId]/WebsiteHeader.tsx @@ -23,7 +23,6 @@ export function WebsiteHeader({ showActions }: { showActions?: boolean }) { } - marginBottom="3" titleHref={renderUrl(`/websites/${website.id}`, false)} > diff --git a/src/components/common/LinkButton.tsx b/src/components/common/LinkButton.tsx index 682970e8..35292ba4 100644 --- a/src/components/common/LinkButton.tsx +++ b/src/components/common/LinkButton.tsx @@ -9,6 +9,7 @@ export interface LinkButtonProps extends ButtonProps { scroll?: boolean; variant?: any; prefetch?: boolean; + asAnchor?: boolean; children?: ReactNode; } @@ -19,15 +20,22 @@ export function LinkButton({ target, prefetch, children, + asAnchor, ...props }: LinkButtonProps) { const { dir } = useLocale(); return ( ); } diff --git a/src/components/common/PageHeader.tsx b/src/components/common/PageHeader.tsx index 6d8c122a..92167888 100644 --- a/src/components/common/PageHeader.tsx +++ b/src/components/common/PageHeader.tsx @@ -50,7 +50,9 @@ export function PageHeader({ )} - {children} + + {children} + ); } From c427c6f54762ffb5a4fe92e495abf371ca254498 Mon Sep 17 00:00:00 2001 From: Mike Cao Date: Wed, 3 Dec 2025 17:05:14 -0800 Subject: [PATCH 31/31] Fixed replica logic. --- src/lib/prisma.ts | 60 ++++++++++++++++++++++++++--------------------- 1 file changed, 33 insertions(+), 27 deletions(-) diff --git a/src/lib/prisma.ts b/src/lib/prisma.ts index 94970584..06336d3b 100644 --- a/src/lib/prisma.ts +++ b/src/lib/prisma.ts @@ -206,6 +206,10 @@ async function rawQuery(sql: string, data: Record, name?: string): return `$${params.length}${type ?? ''}`; }); + if (process.env.DATABASE_REPLICA_URL && '$replica' in client) { + return client.$replica().$queryRawUnsafe(query, ...params); + } + return client.$queryRawUnsafe(query, ...params); } @@ -296,10 +300,6 @@ function getSchema() { } function getClient() { - if (!process.env.DATABASE_URL) { - return null; - } - const url = process.env.DATABASE_URL; const replicaUrl = process.env.DATABASE_REPLICA_URL; const logQuery = process.env.LOG_QUERY; @@ -307,43 +307,49 @@ function getClient() { const connectionUrl = new URL(url); const schema = connectionUrl.searchParams.get('schema') ?? undefined; - const adapter = new PrismaPg({ connectionString: url.toString() }, { schema }); + const baseAdapter = new PrismaPg({ connectionString: url }, { schema }); - const prisma = new PrismaClient({ - adapter, + const baseClient = new PrismaClient({ + adapter: baseAdapter, errorFormat: 'pretty', ...(logQuery ? PRISMA_LOG_OPTIONS : {}), }); - if (replicaUrl) { - const replicaAdapter = new PrismaPg({ connectionString: replicaUrl.toString() }, { schema }); - - const replicaClient = new PrismaClient({ - adapter: replicaAdapter, - ...(logQuery ? PRISMA_LOG_OPTIONS : {}), - }); - - prisma.$extends( - readReplicas({ - replicas: [replicaClient], - }), - ); + if (logQuery) { + baseClient.$on('query', log); } + if (!replicaUrl) { + log('Prisma initialized'); + globalThis[PRISMA] ??= baseClient; + return baseClient; + } + + const replicaAdapter = new PrismaPg({ connectionString: replicaUrl }, { schema }); + + const replicaClient = new PrismaClient({ + adapter: replicaAdapter, + errorFormat: 'pretty', + ...(logQuery ? PRISMA_LOG_OPTIONS : {}), + }); + if (logQuery) { - prisma.$on('query' as never, log); + replicaClient.$on('query', log); } - log('Prisma initialized'); + const extended = baseClient.$extends( + readReplicas({ + replicas: [replicaClient], + }), + ); - if (!globalThis[PRISMA]) { - globalThis[PRISMA] = prisma; - } + log('Prisma initialized (with replica)'); + globalThis[PRISMA] ??= extended; - return prisma; + return extended; } -const client: PrismaClient = globalThis[PRISMA] || getClient(); +const client = (globalThis[PRISMA] || getClient()) as ReturnType; export default { client,