From 8ee212eac4545f0c370d319256453d23518f1890 Mon Sep 17 00:00:00 2001
From: Martin Alexander Kaminski
Date: Wed, 4 Nov 2026 20:05:45 +0100
Subject: [PATCH 01/21] chore: fix broken lockfile after merge conflict
---
frontend/pnpm-lock.yaml | 904 ++++++++++++++++++----------------------
1 file changed, 398 insertions(+), 506 deletions(-)
diff --git a/frontend/pnpm-lock.yaml b/frontend/pnpm-lock.yaml
index 6073792..57cb2fc 100644
--- a/frontend/pnpm-lock.yaml
+++ b/frontend/pnpm-lock.yaml
@@ -19,13 +19,13 @@ importers:
version: 5.3.0
'@icons-pack/react-simple-icons':
specifier: ^13.15.1
- version: 13.15.1(react@19.3.0)
+ version: 13.15.1(react@19.3.1)
'@react-router/node':
specifier: ^8.5.0
- version: 8.5.0(react-router@8.5.0(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.1(react@19.3.1))(react@19.3.1))(typescript@6.0.3)
+ version: 8.5.1(react-router@8.5.1(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.1(react@19.3.1))(react@19.3.1))(typescript@6.0.3)
'@react-router/serve':
specifier: ^8.5.0
- version: 8.5.0(react-router@8.5.0(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.1(react@19.3.1))(react@19.3.1))(typescript@6.0.3)
+ version: 8.5.1(react-router@8.5.1(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.1(react@19.3.1))(react@19.3.1))(typescript@6.0.3)
'@tailwindcss/vite':
specifier: ^4.3.3
version: 4.3.3(vite@8.3.5(@types/node@24.19.2)(jiti@2.7.0)(yaml@2.9.1))
@@ -34,7 +34,7 @@ importers:
version: 1.33.5(react-dom@19.3.1(react@19.3.1))(react@19.3.1)
better-auth:
specifier: ^1.7.12
- version: 1.7.12(react-dom@19.3.1(react@19.3.1))(react@19.3.1)(vitest@5.0.5(@types/node@24.19.2)(jsdom@30.1.3(@noble/hashes@2.4.0))(vite@8.3.5(@types/node@24.19.2)(jiti@2.7.0)(yaml@2.9.1)))
+ version: 1.7.14(react-dom@19.3.1(react@19.3.1))(react@19.3.1)(vitest@5.0.5(@types/node@24.19.2)(jsdom@30.1.3(@noble/hashes@2.4.0))(vite@8.3.5(@types/node@24.19.2)(jiti@2.7.0)(yaml@2.9.1)))
class-variance-authority:
specifier: ^0.7.1
version: 0.7.1
@@ -49,7 +49,7 @@ importers:
version: 5.2.2
lucide-react:
specifier: ^1.61.0
- version: 1.61.0(@types/react@19.3.0)(react@19.3.1)
+ version: 1.63.0(@types/react@19.3.0)(react@19.3.1)
react:
specifier: ^19.3.1
version: 19.3.1
@@ -58,13 +58,13 @@ importers:
version: 19.3.1(react@19.3.1)
react-router:
specifier: ^8.5.0
- version: 8.5.0(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.1(react@19.3.1))(react@19.3.1)
+ version: 8.5.1(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.1(react@19.3.1))(react@19.3.1)
rxjs:
specifier: ^7.8.2
version: 7.8.2
shadcn:
specifier: ^4.22.1
- version: 4.22.1
+ version: 4.23.0
tailwindcss:
specifier: ^4.3.3
version: 4.3.3
@@ -89,10 +89,10 @@ importers:
version: 7.4.6(@types/node@24.19.2)(graphql@17.0.2)(typescript@6.0.3)
'@graphql-codegen/typescript-operations':
specifier: ^6.1.10
- version: 6.1.10(graphql@17.0.2)
+ version: 6.2.0(graphql@17.0.2)
'@react-router/dev':
specifier: ^8.5.0
- version: 8.5.0(@react-router/serve@8.5.0(react-router@8.5.0(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.1(react@19.3.1))(react@19.3.1))(typescript@6.0.3))(react-router@8.5.0(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.1(react@19.3.1))(react@19.3.1))(typescript@6.0.3)(vite@8.3.5(@types/node@24.19.2)(jiti@2.7.0)(yaml@2.9.1))
+ version: 8.5.1(@react-router/serve@8.5.1(react-router@8.5.1(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.1(react@19.3.1))(react@19.3.1))(typescript@6.0.3))(react-router@8.5.1(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.1(react@19.3.1))(react@19.3.1))(typescript@6.0.3)(vite@8.3.5(@types/node@24.19.2)(jiti@2.7.0)(yaml@2.9.1))
'@rolldown/plugin-babel':
specifier: ^0.2.4
version: 0.2.4(@babel/core@7.29.7)(@babel/runtime@8.0.8)(rolldown@1.2.15)(vite@8.3.5(@types/node@24.19.2)(jiti@2.7.0)(yaml@2.9.1))
@@ -149,7 +149,7 @@ importers:
version: 6.0.3
typescript-eslint:
specifier: ^8.72.0
- version: 8.72.0(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3)
+ version: 8.72.1(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3)
vite:
specifier: ^8.3.5
version: 8.3.5(@types/node@24.19.2)(jiti@2.7.0)(yaml@2.9.1)
@@ -186,8 +186,8 @@ packages:
peerDependencies:
graphql: '*'
- '@asamuzakjp/css-color@7.1.7':
- resolution: {integrity: sha512-Q7ioeear07HwixdIitIn9KS1LZi97CEDFCSjPNm9v+y8KNbsu9q4Lrd4zUQW4faED+E7qxvfeVnbNRW46wFKuw==}
+ '@asamuzakjp/css-color@7.1.9':
+ resolution: {integrity: sha512-vZ6JQVq8Ivgz6b/IBlAf90wZviXdluY13cQOPO+nJHbmXwGrPl2GcpqUY7a55/8ZVdfONXpCFMpRijOBCHNlcQ==}
engines: {node: ^22.22.2 || ^24.15.0 || >=26.0.0}
'@asamuzakjp/dom-selector@10.0.5':
@@ -357,11 +357,11 @@ packages:
'@types/react':
optional: true
- '@better-auth/core@1.7.12':
- resolution: {integrity: sha512-SUStBGHJ13KnSO6+7U/1DSlfuOtln4jtOrFZqzQtxZVHZIrAoMjwHNGitlF+s7hvKbuC3Z14xjnqfLLqIqGfxw==}
+ '@better-auth/core@1.7.14':
+ resolution: {integrity: sha512-ByhdrGVwp/el+hoTYKSVOHIH23/lQj9TQ1txdGcWOg22tnfr3hJ6ukzySooeYj/R36XsQgBhkJqIp8mKsNeErA==}
peerDependencies:
'@better-auth/utils': ^0.4.2 || ^0.5.0
- '@better-fetch/fetch': 1.3.2
+ '@better-fetch/fetch': 1.3.3
'@opentelemetry/api': ^1.9.0
better-call: 1.4.4
jose: ^6.1.0
@@ -371,46 +371,46 @@ packages:
'@opentelemetry/api':
optional: true
- '@better-auth/drizzle-adapter@1.7.12':
- resolution: {integrity: sha512-Qzoyuf05aK01Pc0k3EXv8Xj3XCT2m2dCWc5HoB7x+xX6N3Pm2eQsca+UIArsJcbuNEWWP3L51oIebnBoHJ5DTw==}
+ '@better-auth/drizzle-adapter@1.7.14':
+ resolution: {integrity: sha512-5RC8Ec5Ur15FWsS4As9/VrlRbB3+9EfShxIpA5A1FcD6IgPxFvzQNkAm2+FYx9LUSqx47NPf9hBTG2GUCMP9Ig==}
peerDependencies:
- '@better-auth/core': ^1.7.12
+ '@better-auth/core': ^1.7.14
'@better-auth/utils': ^0.4.2 || ^0.5.0
drizzle-orm: ^0.45.2 || >=1.0.0-rc.1 <2.0.0
peerDependenciesMeta:
drizzle-orm:
optional: true
- '@better-auth/kysely-adapter@1.7.12':
- resolution: {integrity: sha512-1PaFXktLv4n3DmrGbPaCj5SsvcT40NnWw7NLua5/J1+8/A051N5ZzqOwJifXEIQX5k6NdwvmymwDQxKytduEAQ==}
+ '@better-auth/kysely-adapter@1.7.14':
+ resolution: {integrity: sha512-4wkqj8a8JVpWDYLlgzfbk7eOaWCFkL6HHQd6CLamFKaC8vNsXew1x4v5dE5O6dGr8j4g5qMISS+BAvOuIvBevg==}
peerDependencies:
- '@better-auth/core': ^1.7.12
+ '@better-auth/core': ^1.7.14
'@better-auth/utils': ^0.4.2 || ^0.5.0
kysely: ^0.28.17 || ^0.29.0
peerDependenciesMeta:
kysely:
optional: true
- '@better-auth/memory-adapter@1.7.12':
- resolution: {integrity: sha512-glaDwXzDptnddHqRuu7fj47FAssUcOzLNgdlTGJoEPrspkX69x2vnXwgAzNuApjZI21WLtPH/rQ6CN+DQGybPA==}
+ '@better-auth/memory-adapter@1.7.14':
+ resolution: {integrity: sha512-Ojv9BcmFyHuTHha9ZM/NUW1ut9J84wLngta+07Es0Ejn8kekqP5aHBpZd5Z8AvADs5iJUOWvQGFmGlPWAKJgBg==}
peerDependencies:
- '@better-auth/core': ^1.7.12
+ '@better-auth/core': ^1.7.14
'@better-auth/utils': ^0.4.2 || ^0.5.0
- '@better-auth/mongo-adapter@1.7.12':
- resolution: {integrity: sha512-HKV4sgYSw/Gdt9AuHlESMkiKL72SWdGweDy1Wsyxoh06BpG7aNu4aSJ7marNpMdKZteyRbxWWqQkA9ediA8qFw==}
+ '@better-auth/mongo-adapter@1.7.14':
+ resolution: {integrity: sha512-6IA0RSPZFMdRwwnLZ9oWnDIiD0y0o0azTHUfa01BNU2AFJgMDkeiASUV3bKcJBskzQoyQrff74eFYTsTSeeVUQ==}
peerDependencies:
- '@better-auth/core': ^1.7.12
+ '@better-auth/core': ^1.7.14
'@better-auth/utils': ^0.4.2 || ^0.5.0
mongodb: ^6.0.0 || ^7.0.0
peerDependenciesMeta:
mongodb:
optional: true
- '@better-auth/prisma-adapter@1.7.12':
- resolution: {integrity: sha512-FZRX6ORbwhDmeYE1Tl0IPtUn8v3BlVFgbJxDnm/DCNHxuFRf+0t4HfddUgYeYehHFR8aSDsdYX44fEFWM9877w==}
+ '@better-auth/prisma-adapter@1.7.14':
+ resolution: {integrity: sha512-mF6t5xqeZNWzUe0ErmrSdzQmtslJscmu9X8Mp5QmROlpnnAzvSc70RILu8lHms8CePt7N34+KRH1QvYjGFrVGQ==}
peerDependencies:
- '@better-auth/core': ^1.7.12
+ '@better-auth/core': ^1.7.14
'@better-auth/utils': ^0.4.2 || ^0.5.0
'@prisma/client': ^5.0.0 || ^6.0.0 || ^7.0.0
prisma: ^5.0.0 || ^6.0.0 || ^7.0.0
@@ -420,18 +420,18 @@ packages:
prisma:
optional: true
- '@better-auth/telemetry@1.7.12':
- resolution: {integrity: sha512-DaDkKNnI99vKGGbWq9KJg2uYeaOjsK9nIBw9T2m2KG/RkxpvQRjYkZ00++up2bZQkR5pB1nukGbplza3UJG/Xg==}
+ '@better-auth/telemetry@1.7.14':
+ resolution: {integrity: sha512-PtKFzsH7gje/WJuUPDjckOoNFazsq8NMt3AdiXIPzHl7tZULcNGTKAX8K7+yn0rG6cO/4mtMgpOjhtilElOnmg==}
peerDependencies:
- '@better-auth/core': ^1.7.12
+ '@better-auth/core': ^1.7.14
'@better-auth/utils': ^0.4.2 || ^0.5.0
- '@better-fetch/fetch': 1.3.2
+ '@better-fetch/fetch': 1.3.3
- '@better-auth/utils@0.5.0':
- resolution: {integrity: sha512-BL8W4EfIZFwlu0r54m3v1ztjDhu6dDe/amLTm0xybmbZaNgYUqhD3SjpAsnq0q8YD6/ki4iwIgxJNLP/N3TxiA==}
+ '@better-auth/utils@0.5.1':
+ resolution: {integrity: sha512-WETqw5vQ52uQ/xwWR4E8rTgT6fDEr/wnS+otDNkBCa/69281FCF32OKDdQUcahMCnjsvqXBNiEvAQHFB0EVRRg==}
- '@better-fetch/fetch@1.3.2':
- resolution: {integrity: sha512-Gs7n99b5tqUC6cQAPbV0uED3IraHB6xQbHLQ/C3l7ZFafHScOx9pQ+DYmP5blbLFShVWLqxNUlI9wi4xU/X+ow==}
+ '@better-fetch/fetch@1.3.3':
+ resolution: {integrity: sha512-U6SlDt/GUWtK2JAxS/NhdoYTEim+EL1G5byz2TUj83KjLZBUpYzb5SmX0aXaCnbGkAjFKnV/o/0+cyXMbEcqqg==}
'@bramus/specificity@2.4.3':
resolution: {integrity: sha512-0GEz8qJWokkUVYQYRukmkSHIFNoBH8QTreeHrAFbvz1XFYc3Y+puhMs8PQ5x8GNugiC2l5jvDBXKLbBIByeSBw==}
@@ -694,8 +694,8 @@ packages:
peerDependencies:
graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0
- '@graphql-codegen/typescript-operations@6.1.10':
- resolution: {integrity: sha512-hTnwAwQI+/lV0mAlWV0Jg7jBo2XCC++8+njr0meDHQbeAJSH6Pew1ZIcmLVvQUsQNSQwNoR4SKftHbDvq6KoNA==}
+ '@graphql-codegen/typescript-operations@6.2.0':
+ resolution: {integrity: sha512-TOMrl34UbfrHJ67WkoWoY5V6bHxCZrvwTtUfuaaos6ZIAOK9d2fIJnouwjPgMRU8JzACYWV3XG+qqOsoDaB25g==}
engines: {node: '>=16'}
peerDependencies:
graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0
@@ -710,8 +710,8 @@ packages:
peerDependencies:
graphql: ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0
- '@graphql-codegen/visitor-plugin-common@7.4.0':
- resolution: {integrity: sha512-dI5U37AVNsnctN8qIHhXM8G8zygx8JCwId6QiH6KOfyCeIYLDBkqPElfuD/2lIDzWAGoMkS2FNoTcfqNcsSvRA==}
+ '@graphql-codegen/visitor-plugin-common@7.5.0':
+ resolution: {integrity: sha512-/7h13H2PnjWMKVD0wYvxh9MWmG9HX6vHCoUL3Hyf2dOUI9soU/uTvBK6gJUs58RILKu4V36QxY/tIaeGOuRRRw==}
engines: {node: '>=16'}
peerDependencies:
graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0
@@ -738,8 +738,8 @@ packages:
peerDependencies:
graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0
- '@graphql-tools/delegate@12.3.0':
- resolution: {integrity: sha512-b7jor8s1M5QkmfwkClyJRQKJ30I+mLNvmV35/QVGQkNUctOkqk17bps3TCS/dC1iVBIAUUO5NUppTJ6/GAcmyA==}
+ '@graphql-tools/delegate@12.3.1':
+ resolution: {integrity: sha512-j3B7LjXpEhcT45zLoNmkJ/cJxbjdlWBiorkJH4TJiPDFvyeHtcqw5WZKDJ+P09Xg26D8Ewv+1GyvJpzy8a3q3A==}
engines: {node: '>=20.0.0'}
peerDependencies:
graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0
@@ -858,8 +858,8 @@ packages:
peerDependencies:
graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0
- '@graphql-tools/wrap@11.2.2':
- resolution: {integrity: sha512-FZ1S0fir0C9ohEC3yN3ywDmoXw9gwGrOiqMybERTjwIqLnHzTxi8AHJvenNGLPLDTMlL5t3nZ8X6E09skXIqyw==}
+ '@graphql-tools/wrap@11.2.3':
+ resolution: {integrity: sha512-QHhXloj6z7Z0WmPR8MYlc4/fR1DmKPeqNH7FuNchG9/D3aDjViO1gZtPuXRR5zX4Oz/fmocDfXqeO/HiMv9myA==}
engines: {node: '>=20.0.0'}
peerDependencies:
graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0
@@ -869,12 +869,6 @@ packages:
peerDependencies:
graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0
- '@hono/node-server@2.1.5':
- resolution: {integrity: sha512-MgP/I06GdvsilDspMk/qmRzpk8LOUStP6jFAbSRi40W09DhoyUn+Mj7eyKICPqeYKybOjVFLVIAQzvu1bfIa7Q==}
- engines: {node: '>=20'}
- peerDependencies:
- hono: ^4 || ^5.0.0-0
-
'@humanfs/core@0.19.2':
resolution: {integrity: sha512-UhXNm+CFMWcbChXywFwkmhqjs3PRCmcSa/hfBgLIb7oQ5HNb1wS0icWsGtSAUNgefHeI+eBrA8I1fxmbHsGdvA==}
engines: {node: '>=18.18.0'}
@@ -900,12 +894,12 @@ packages:
peerDependencies:
react: ^16.13 || ^17 || ^18 || ^19
- '@inquirer/ansi@2.0.9':
- resolution: {integrity: sha512-0Ywt3S8tqM6TWUcsRlBFQ1x+X3/o8kktX0ZiKAnByYb9GFDknnOhse1PVtfiD2BXPI8ar+BWx9PV9R0lQIcygw==}
+ '@inquirer/ansi@2.0.10':
+ resolution: {integrity: sha512-dwrc+1aqVZpHNkNDswXGtn1typ+Pxpo5FHZRyBw1le7onEJUkPUkYOY1FIFC1LvFMYUqqLuWBwElhAmencL7MQ==}
engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'}
- '@inquirer/checkbox@5.2.7':
- resolution: {integrity: sha512-/+QmGE/9bvE/EobaZDnzYe+T+QWoJrnmxwBQNtoi2OVSUR9d1znYsNyEoUrOZvFSxDYttrhzRIpXpaLkN+iIsg==}
+ '@inquirer/checkbox@5.2.8':
+ resolution: {integrity: sha512-NY/S1EalQhlonqhwwsarrcnkH7s9ByQuvjWYdk1jB2Gb9EPQJjKkhCTWjM3yQ0UpHaLm1XbIL89b+32G8rhO5w==}
engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'}
peerDependencies:
'@types/node': '>=18'
@@ -913,8 +907,8 @@ packages:
'@types/node':
optional: true
- '@inquirer/confirm@6.3.4':
- resolution: {integrity: sha512-ZwnaZZDa1zxsyVrN32s447ydMnKcw7e8WWNT+R+Qsu0zAn8Rs6yi9d1B80Kob1Ul2cfUi7t8JD2t4/K7uEZpqA==}
+ '@inquirer/confirm@6.3.5':
+ resolution: {integrity: sha512-BJ59BOyURiZiAxdr9AuRu38/k+rV+DcTIM2fUF/c/BXrab6H8zMZTTOl3LgkSJH96Xob2vOJxDiBkHiz32Xx2w==}
engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'}
peerDependencies:
'@types/node': '>=18'
@@ -922,8 +916,8 @@ packages:
'@types/node':
optional: true
- '@inquirer/core@12.0.5':
- resolution: {integrity: sha512-c0ZSnO9oVk/IlEGoZK3u8b3IZQeu9I6jUkXJSQnQEVRXsjKvtAq3AGqFL2LgfJhlzMZne08pZHWRWasIcI3Rew==}
+ '@inquirer/core@12.0.6':
+ resolution: {integrity: sha512-5yxn2LsJ8Tu4ei2a+yNkmFRhM/cb+JMEsEs/AW6CCOnBnpMy4IjYiPMFyHtYq8weOmlTyqqCx40y0DsD7OsEPw==}
engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'}
peerDependencies:
'@types/node': '>=18'
@@ -931,8 +925,8 @@ packages:
'@types/node':
optional: true
- '@inquirer/editor@5.3.5':
- resolution: {integrity: sha512-6lU3/pPx5z3lHWejFW061MV4qZooBQYv/+EeGhNOPiP/i+hrYsHfxxBnnDGsAfg8YdLUd69YckoeOjtr3QuAUg==}
+ '@inquirer/editor@5.3.6':
+ resolution: {integrity: sha512-Z5SOeRC5VNkINfKN4rY8BSaYKb3GYi8iSEqZZRqogsE2GhBBToQ0Xw25SbI+4bcatLzU009mZ5d9EuJNiJuUCg==}
engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'}
peerDependencies:
'@types/node': '>=18'
@@ -940,8 +934,8 @@ packages:
'@types/node':
optional: true
- '@inquirer/expand@5.1.7':
- resolution: {integrity: sha512-eiJ31YFCaB6fLoJCqLIn8S6eqUyME6vwr8KcP5h8cxmA+bV9RRVPO+kywoxb7G63HduDXV6sN/SM7o2R+ahEcQ==}
+ '@inquirer/expand@5.1.8':
+ resolution: {integrity: sha512-dMEnTkpLqzM/sbILwL7QJgx9iX5hoEM8+bh6shgwd9mYJamdOnth7y2mMaFd08Glj9AXEFKllWcGYyBqnJsHrA==}
engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'}
peerDependencies:
'@types/node': '>=18'
@@ -949,8 +943,8 @@ packages:
'@types/node':
optional: true
- '@inquirer/external-editor@3.0.6':
- resolution: {integrity: sha512-rWmw6WG8JZ7LMn/srXEylYGhL6EXXJeROE7/4x4GREh6NgzqJBDbIgpNGsYoLPfobeb4VZtEYzPGnT5EFNYhiQ==}
+ '@inquirer/external-editor@3.0.7':
+ resolution: {integrity: sha512-enNqTJpojgISCG+a5acjnfJ02hcRTFUBVm8uXiCY40PRPZtSzFnNLskOTU+kDUUEODYma90syxuea1rRtUFh0Q==}
engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'}
peerDependencies:
'@types/node': '>=18'
@@ -958,12 +952,12 @@ packages:
'@types/node':
optional: true
- '@inquirer/figures@2.0.9':
- resolution: {integrity: sha512-EAWgUTGQ/Umgga51dE3B2PUHbufuXarDfg86uVgoSgNHNNQnyFKcOrQLWVqYMghuSyHh8+2HUH0Js9cTC1WAdg==}
+ '@inquirer/figures@2.0.10':
+ resolution: {integrity: sha512-51elrUJV3jZpvD0ygz8+U10Kc6+Lzqln+/tYmnbhy6jo5oXpE6hMCcv+OTBC0enwJXsb3JIuT3VtEinRNCSK2A==}
engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'}
- '@inquirer/input@5.1.8':
- resolution: {integrity: sha512-psOSTgkL8y/OtgJJYbqJ0oISr2QBE0U1Ro/qQdA/EKjeJiwiUTQgQmq8o4ESNzVOWthIeh3YLD7BCUR9dKnR5g==}
+ '@inquirer/input@5.1.9':
+ resolution: {integrity: sha512-2Vd5T7lTxfgJMpAd3aOu6bQpbUnCU7tBgvTQIZkP/7juJzmRmTM2t5XfOCuirFduWLTSJI/WZp32Cq1E01TVeg==}
engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'}
peerDependencies:
'@types/node': '>=18'
@@ -971,8 +965,8 @@ packages:
'@types/node':
optional: true
- '@inquirer/number@4.2.5':
- resolution: {integrity: sha512-lEy7LWsdF5qHx5QjHZqabUqM9P7i5uTMCt8GRzqxmwXXKbapKJDA+ucVflVVPAyj4snD5DTAD4L+sct85XOlOQ==}
+ '@inquirer/number@4.2.6':
+ resolution: {integrity: sha512-22LnGGCDm1M/pKXxxF8n6ppr/1IztdsxqeqeBRUMTTNnJTkjIBiAkewiDM4u/gjtazj/FvZS+nk9AbO/vEcBFQ==}
engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'}
peerDependencies:
'@types/node': '>=18'
@@ -980,8 +974,8 @@ packages:
'@types/node':
optional: true
- '@inquirer/password@5.2.4':
- resolution: {integrity: sha512-T7ir3fflSSVCYEVqNyMBq+pIMsilQRtbZcD5gxn6Ewsin5TJWBxrGBdXveWtmeXVAeoInfhS+BhBUZaL4sFSDg==}
+ '@inquirer/password@5.2.5':
+ resolution: {integrity: sha512-0v0wLQA4uhWbybmdH6oPl7ooxCiymNylkvi2gCSc+mA5ZQB6QoJLVhoHq12T82lhozpp9fpMJnJkC1nJrU/A+A==}
engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'}
peerDependencies:
'@types/node': '>=18'
@@ -989,8 +983,8 @@ packages:
'@types/node':
optional: true
- '@inquirer/prompts@8.7.4':
- resolution: {integrity: sha512-SAJt+QhY5rOJAIgZBw9TrHWfgrp6wsb9cqRCyqax+Hl6EiFfRXmD9EsIWkST8yq/dQ8H46Is2Sr/JG7Ls/LQ+Q==}
+ '@inquirer/prompts@8.7.5':
+ resolution: {integrity: sha512-l/IWwC+QhOyXgxkZloOh+n5quGzc1m5ZawyzBmoizCZaxbJeLRdS3pStoqg/JVInJRXaG5aHMhjK6H6oYiBC9A==}
engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'}
peerDependencies:
'@types/node': '>=18'
@@ -998,8 +992,8 @@ packages:
'@types/node':
optional: true
- '@inquirer/rawlist@5.3.7':
- resolution: {integrity: sha512-XveEe8v3BHj9ec00n+9i8FHjWhXjS6+jCTizYvXCqKUKtgkrq9xid8S5j3mYGW96qfxG3mwNoud3m3v8GDk9Pw==}
+ '@inquirer/rawlist@5.3.8':
+ resolution: {integrity: sha512-h+6Y4pPvYvuRbksn1kIBdD9tCYD+E468W5sIcVfLmoLP5IasnY0r33N+r+46ej/P8b2PCREjyKR+MnnfPGdTzg==}
engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'}
peerDependencies:
'@types/node': '>=18'
@@ -1007,8 +1001,8 @@ packages:
'@types/node':
optional: true
- '@inquirer/search@4.3.5':
- resolution: {integrity: sha512-kIUecMugEN2YTvTmff+uYz0nAE0f9RFNDVZknfrh264vAQM9P8tnsXiUp7z8XbGuNIBEtFMJhvc9QquawpC46A==}
+ '@inquirer/search@4.3.6':
+ resolution: {integrity: sha512-JZj9ttkIvuaFQIc2oxsyqC1ad05WL02ku6W/INVKTCzNaVq1KkhP3AfTRC0m7OWlKZyw+EWwPBFZfYiG9jF6Yw==}
engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'}
peerDependencies:
'@types/node': '>=18'
@@ -1016,8 +1010,8 @@ packages:
'@types/node':
optional: true
- '@inquirer/select@5.2.7':
- resolution: {integrity: sha512-pRDWO4dTqSAvFQdO8yclKMtXNDm9K9HmvWB5UZmT3clw2OlOBNXveHzhyFmO/0d0yJMqlPcNITus1Jtpm6t8VQ==}
+ '@inquirer/select@5.2.8':
+ resolution: {integrity: sha512-BklkkAAOpjdCfuQw5fVGcDuhKxA7T1iBpn6b2JUvDDdkIsO3Ftlg+WnWUCVpkUBFagL2o036OFW+xL4lC9wIPw==}
engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'}
peerDependencies:
'@types/node': '>=18'
@@ -1025,8 +1019,8 @@ packages:
'@types/node':
optional: true
- '@inquirer/type@4.2.0':
- resolution: {integrity: sha512-2rnHX8RPo4glJYqnFc/v3nQeIhDcjyRRyaT7MGcfL/8xv/8K03SXYoA2tX06WVSKywWOE/ncbG3dtuzLjR5TCQ==}
+ '@inquirer/type@4.2.1':
+ resolution: {integrity: sha512-lDkPsnv5M5CcYB2T1qTc3dobNTPkVr4DU3Ic2Q6SW8/qVRHgvzdRdmVZ6YqG9Ag1aJTeMsLU0s0WPRh3CZWDQQ==}
engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'}
peerDependencies:
'@types/node': '>=18'
@@ -1059,15 +1053,13 @@ packages:
'@keyv/serialize@1.1.1':
resolution: {integrity: sha512-dXn3FZhPv0US+7dtJsIi2R+c7qWYiReoEh5zUntWCf4oSpMNib8FDhSoed6m3QyZdx5hK7iLFkYk3rNxwt8vTA==}
- '@modelcontextprotocol/sdk@1.32.2':
- resolution: {integrity: sha512-SWsVtH/0vULSQStoZ6xxH2K09Li8fXYTMC64ZeogCdpZ3XSi1eCPOByV1OpuJxuI3OcmHhosDWYyii07tpPsLw==}
- engines: {node: '>=18'}
- peerDependencies:
- '@cfworker/json-schema': ^4.1.1
- zod: ^3.25 || ^4.0
- peerDependenciesMeta:
- '@cfworker/json-schema':
- optional: true
+ '@modelcontextprotocol/core@2.4.0':
+ resolution: {integrity: sha512-z8QBKqdfXLPzkLQuG4xp8hrVEMm1PZ1IgxMN2sMbJiFiAKOWXnAzogXn2W4aqIBlP1ea6U5yiqVquvUNM1Cj6Q==}
+ engines: {node: '>=20'}
+
+ '@modelcontextprotocol/server@2.4.0':
+ resolution: {integrity: sha512-rgR9yxSaAJ+bcsi/XroT/S2AfPiIWloXAnrdfYSCms9ivVju0ishu/wW0J21Ho6+ZOR1r7RyeRbjiRuF87ix5Q==}
+ engines: {node: '>=20'}
'@noble/ciphers@2.4.0':
resolution: {integrity: sha512-AnjFn0Jv92laAkvMrghlFZq4qQCIN/4DxFV/eooqtC2YTjB7kBeLMS2T9KJX4Dn+ZVXLOwK0lSgqDtx9gvxtiw==}
@@ -1092,14 +1084,14 @@ packages:
'@oxc-project/types@0.155.0':
resolution: {integrity: sha512-SeE8JPwW1xs1tHeNycjUtUBdhorRa8o4jlvjwk49R7/Z291i+4DQa7JJIgOm/TaYQZx+QrPQbVJ/9c8dMIZN8Q==}
- '@react-router/dev@8.5.0':
- resolution: {integrity: sha512-SXmL0ym9Wp8Hi0LdXLG6yPaN8V1rUW4PuavvBS9eqpr0hM3PFjiCUT44pRzCj4G9lKEQBeNcj4beOtpN7IxuCg==}
+ '@react-router/dev@8.5.1':
+ resolution: {integrity: sha512-1NQ/lP8m7Kd9G4cGKPoEMZe0qcWOnRkf8QxpAcnX/3V5wJp+/mDvM9QUqwUxI+RywytNNGtc4uuDFhwt0xMLbg==}
engines: {node: '>=22.22.0'}
hasBin: true
peerDependencies:
- '@react-router/serve': ^8.5.0
+ '@react-router/serve': ^8.5.1
'@vitejs/plugin-rsc': ~0.5.26
- react-router: ^8.5.0
+ react-router: ^8.5.1
react-server-dom-webpack: ^19.2.7
typescript: ^5.1.0 || ^6.0.0 || ^7.0.0
vite: ^7.0.0 || ^8.0.0
@@ -1116,33 +1108,33 @@ packages:
wrangler:
optional: true
- '@react-router/express@8.5.0':
- resolution: {integrity: sha512-uJDrp6XrW9MQSgbw6EKNXekSz0CS2dcnqWFTA4NZaL7CsPTwe7tXVR7auMxCEiTVg5+4wd0PWsPtX+J4VEqWDg==}
+ '@react-router/express@8.5.1':
+ resolution: {integrity: sha512-pWx/cvrOztywTanlaUI/i0T3EbK+OGxdOL0HASHlc1QSLsadx39bNqKuMJFacZscBtZh8NgR1glAcrkIpUL06Q==}
engines: {node: '>=22.22.0'}
peerDependencies:
express: ^4.22.2 || ^5
- react-router: 8.5.0
+ react-router: 8.5.1
typescript: ^5.1.0 || ^6.0.0 || ^7.0.0
peerDependenciesMeta:
typescript:
optional: true
- '@react-router/node@8.5.0':
- resolution: {integrity: sha512-9a3a37TW5GAo/J336Uk1tca/X1OxjpseETz/zCHcojtL7oRlFrlFoDt6wSdCtFRCiwlLyHcWY+qwZ+xnb05kSg==}
+ '@react-router/node@8.5.1':
+ resolution: {integrity: sha512-hEr3YFQaSoQL8T85+DqNOpdDLfuD2mKEeGdQAEvfix2bQdCtcpatE0uzB3zYidIUex0iEJG/eOZdAjLrzlJrjA==}
engines: {node: '>=22.22.0'}
peerDependencies:
- react-router: 8.5.0
+ react-router: 8.5.1
typescript: ^5.1.0 || ^6.0.0 || ^7.0.0
peerDependenciesMeta:
typescript:
optional: true
- '@react-router/serve@8.5.0':
- resolution: {integrity: sha512-3cIUPAtmlAXjvmD6kmYw8/q9YQvVNHzSLJVJRfAX29hp/t+yvhbqnmRAPDyFHDMTUha+wgvKb6GA/3cqJa+LHA==}
+ '@react-router/serve@8.5.1':
+ resolution: {integrity: sha512-frPpfYqIA4f9ynW+tBxUox0BD+yaJJttu1SLPkTOyE5o6/h8Y9ueD4+4dtoCaxmlnF4rKWbcXptRPcwX+KEEZw==}
engines: {node: '>=22.22.0'}
hasBin: true
peerDependencies:
- react-router: 8.5.0
+ react-router: 8.5.1
'@remix-run/node-fetch-server@0.14.2':
resolution: {integrity: sha512-1cpM/f5i1ka/9CUMBwZXZp7Bn92x8VQjzg+F4eEe88DlVdNHkAKrf/vvbZoYgdkfy2bWHtGC6LQGLmojEqOF4Q==}
@@ -1272,8 +1264,8 @@ packages:
'@sec-ant/readable-stream@0.4.1':
resolution: {integrity: sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg==}
- '@shadcn/registry@0.2.0':
- resolution: {integrity: sha512-m3TeqU/+av2kgOLfESHkWzsmhuQuY4NXZd5Y1Rd4lzy4IX3JJ5+k2mYfkq6OT8oMuk2W4GQPAkO7+CC7KlpSbw==}
+ '@shadcn/registry@0.2.1':
+ resolution: {integrity: sha512-wMvZ3DGdnhCwtpeFbwKybSGfCcP52bZX77jMKgZvupmirgyA5KRLlkeQXkI2RGHIaD8TX2iWe2wcIEjjqzg2FQ==}
engines: {node: '>=20.18.1'}
'@sindresorhus/merge-streams@4.0.0':
@@ -1492,63 +1484,63 @@ packages:
'@types/ws@8.18.2':
resolution: {integrity: sha512-67MQl+fpWKVTT1NYdnmo3U4sc/xPo/zQBncVnI74qmQa0z/b+1g6iYqNmGCPbxO+zz2aklb08a0oHfegiVd0/w==}
- '@typescript-eslint/eslint-plugin@8.72.0':
- resolution: {integrity: sha512-aysKgysPX9XOv/dk95UkvUDe++Q3n3dJPG9CEWT3RUccxfkPJ+Qn6nhKPDhZXU6Ofo9kgwGWwKyQCnZIXTgngg==}
+ '@typescript-eslint/eslint-plugin@8.72.1':
+ resolution: {integrity: sha512-5CokTWXpmbylfFabsbvHC0CAw3XLaGnoa+nFJX5FR592h/LoZsENUE6p/rg5xvkKrFEXz6pYmgI29AgXc2N3BQ==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies:
- '@typescript-eslint/parser': ^8.72.0
+ '@typescript-eslint/parser': ^8.72.1
eslint: ^8.57.0 || ^9.0.0 || ^10.0.0
typescript: '>=4.8.4 <6.1.0'
- '@typescript-eslint/parser@8.72.0':
- resolution: {integrity: sha512-0O+x3ynciD6zuXb1CKSu165haQV6ey53DKhHHUnujP7U+XlltJG+/keT0Xhd1HXCze+IHf7Tvt39ovyepX/LNw==}
+ '@typescript-eslint/parser@8.72.1':
+ resolution: {integrity: sha512-ZGwZP4OCfyA0AQTpEAMWz+rtX01DRhQWW5hB0ucKDEIX5U7jdmPSaMx94rQfaPAQzIYz2BimOgKOJtjfpRFQ9g==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies:
eslint: ^8.57.0 || ^9.0.0 || ^10.0.0
typescript: '>=4.8.4 <6.1.0'
- '@typescript-eslint/project-service@8.72.0':
- resolution: {integrity: sha512-bzHngBbmIgzj6TsTjVUCntGx6FFLgE7mPjpO0PzHycOaZHXqS43XnrkFIHRS16LLr/xO6FHSXG3GJFo/F4bSBQ==}
+ '@typescript-eslint/project-service@8.72.1':
+ resolution: {integrity: sha512-fAuVMkwdO/huI8nyo/WKnNKf6Gag93S56Rh3Ts5mGcavwSdaN8tRg1gCeIGX8PF+nzp1BjGfO4gHhGzW1J6jTg==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies:
typescript: '>=4.8.4 <6.1.0'
- '@typescript-eslint/scope-manager@8.72.0':
- resolution: {integrity: sha512-JewPyJOYcXBSAS7PIgufscHOwZqhTGyBRiQJhhuDln66tMchxvvt7nJ90JKKIoOelmdHA3kAQbm9cEUHc4JSEA==}
+ '@typescript-eslint/scope-manager@8.72.1':
+ resolution: {integrity: sha512-lC/t6eMCZZQAAKZEYGL6RDVSuFehpdmMT6h+nJIjIa6oylN/PwDgDVtEIbB7O9xFfZYtZAYLoLlDNWKJhtF+uQ==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
- '@typescript-eslint/tsconfig-utils@8.72.0':
- resolution: {integrity: sha512-0vbxCf7xLVPSjcOdm6eQbgViH8EDJ8xnl1laLT9yoqSz2YmcSfSg5Vdl0JUvZf6rcuJ0ZivJIuMD4edTg8obaA==}
+ '@typescript-eslint/tsconfig-utils@8.72.1':
+ resolution: {integrity: sha512-e4D5R5vpeAEPBxT2BAzsFQL3sbwyeeeo5+aczgNSRK1V734jE7pTqaGFU+fXapWEQwnZbpFaTn32+Z8DwS6OTg==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies:
typescript: '>=4.8.4 <6.1.0'
- '@typescript-eslint/type-utils@8.72.0':
- resolution: {integrity: sha512-gEXxmmbSTSOVTC37IYYvremOM31v+UN2W772bJxmVYPhAOPSUxtacyb7wkm1EhkYKU6KzFJsdU44DCV4to0LWw==}
+ '@typescript-eslint/type-utils@8.72.1':
+ resolution: {integrity: sha512-iY2wlmyrXJmx4yxUGP3aYCFF3cA/6ShddOKmLU2dx7LnEykbAM8WThlxZEfd1NddqceF6eJmZUayxx9oKIYNlg==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies:
eslint: ^8.57.0 || ^9.0.0 || ^10.0.0
typescript: '>=4.8.4 <6.1.0'
- '@typescript-eslint/types@8.72.0':
- resolution: {integrity: sha512-Adfoy59kxNEjT5E5fnyrp7GpHYuWs8ONbdohu4ez6IU46qDq8LltG90tLmkucZB2uhYL8mqBjtXqGd8yhfjXqQ==}
+ '@typescript-eslint/types@8.72.1':
+ resolution: {integrity: sha512-LmE5IhQet1BWOWEXqBrVtBPsMAOQ6Nzk35d+WLh3mk4EUF33sqlfxjio1MdYeSvKSG5skactKKuixBIKXhL4Rw==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
- '@typescript-eslint/typescript-estree@8.72.0':
- resolution: {integrity: sha512-gwLfFgWcw15tN2KXDCJvxEOQjPn+P3j/n3eSqkZ5sX4VpW9Cosodr+tWwBZRvJT3TcKx6HnPRGZMCNAiP1Xhug==}
+ '@typescript-eslint/typescript-estree@8.72.1':
+ resolution: {integrity: sha512-DAlUoUV93hIvrtIQLwCbmZQYVZwOMhiHJrOVUUIWicFZaIYjTRqlY3I/NZevfkLmSqkNHRu2qYDcq9lrn16oOQ==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies:
typescript: '>=4.8.4 <6.1.0'
- '@typescript-eslint/utils@8.72.0':
- resolution: {integrity: sha512-0up3oArJZBYnzOaEXKo8DmI43QvMZyPoFEt9LWzRJcyl/RcJjfKKPebknN1VbTgXBf3M/KggUh5uUMdURLnseg==}
+ '@typescript-eslint/utils@8.72.1':
+ resolution: {integrity: sha512-5v5liypurJBFHCBNqh/RjsymAD+VWcE0djuGY/BUqp5fC3Qn+luWDEksjuTtWjPn6i5zQlUtkZCRG/CYG0yCkA==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies:
eslint: ^8.57.0 || ^9.0.0 || ^10.0.0
typescript: '>=4.8.4 <6.1.0'
- '@typescript-eslint/visitor-keys@8.72.0':
- resolution: {integrity: sha512-E2mroviasaWecDzTGiGMtuEguuLVOeRggnrIn93CJuxYJzQBHbyymlT08aVQydbBal5538o+JkBKXh2sRuCyIA==}
+ '@typescript-eslint/visitor-keys@8.72.1':
+ resolution: {integrity: sha512-SB8xqipSzZHUePCCLNeYxqnxq83X61/qzNhjQGbTfjxGZIeOEP7tBgWYX05Tcd6CgE02WdTJnh5b8kMZJ/+bnQ==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
'@vitejs/plugin-react@6.1.2':
@@ -1601,16 +1593,16 @@ packages:
resolution: {integrity: sha512-BDMdYFcerLQkwA2RTldxOqRCs6ZQD1S7UgP3pUdGUkcbgTrP/V5ko77ZkCww9DHmC4lpoYuwigGfQYj285gMvA==}
engines: {node: '>=18.0.0'}
- '@whatwg-node/node-fetch@0.9.2':
- resolution: {integrity: sha512-KPUMuyu2u0i92mchLcvPJBHnsOd1osahvAvagHGEod4GTkFTyoXZwlbagFTWm/k4ixjEiGi7cbCLPYm0uFb2Wg==}
+ '@whatwg-node/node-fetch@0.9.3':
+ resolution: {integrity: sha512-Ekx4MfF76yzQTphPf1Qr8N2hbxlTaI/hZ4TSmRGWqmEjQrRlkrtiIT107mS0gds4SisAtAXaU8jXhffipowlGw==}
engines: {node: '>=22.15.0'}
'@whatwg-node/promise-helpers@1.3.2':
resolution: {integrity: sha512-Nst5JdK47VIl9UcGwtv2Rcgyn5lWtZ0/mhRQ4G8NN2isxpq2TO30iqHzmwoJycjWuyUfg3GFXqP/gFHXeV57IA==}
engines: {node: '>=16.0.0'}
- '@whatwg-node/promise-helpers@2.0.0':
- resolution: {integrity: sha512-/i9CS0Z96o+cPwaYoAyVxAThDiUX1wV3tDmNWPJbn+vtdR+JftuCDg1NGCXBrzIYVDGkJ8uT6ctwmrBOUzOpKQ==}
+ '@whatwg-node/promise-helpers@2.0.1':
+ resolution: {integrity: sha512-ziVgm01A9irPLVBaUFei64qp771BrDXldbv5pY6kgFgNtA+7zq8ux6nj/6w8bELGH/+Ttnc76ox04HIjU8nqvg==}
engines: {node: '>=22.15.0'}
'@wry/caches@1.0.1':
@@ -1646,9 +1638,6 @@ packages:
ajv-formats@2.1.1:
resolution: {integrity: sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==}
- ajv-formats@3.0.1:
- resolution: {integrity: sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==}
-
ajv@6.15.0:
resolution: {integrity: sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==}
@@ -1719,8 +1708,8 @@ packages:
resolution: {integrity: sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==}
engines: {node: 18 || 20 || >=22}
- baseline-browser-mapping@2.11.32:
- resolution: {integrity: sha512-UvuxFU9P3hM29LrQdwu0cD6w6/+SFr+UlB9s/knI7+O2rK9xFxKUwSDWxGdbbqQ9/V7BJ5s0NI5nQAE4uJp3gQ==}
+ baseline-browser-mapping@2.11.34:
+ resolution: {integrity: sha512-Aqr8mA1kIvyJ3UY5YAY7ib8LSo1DmDMbMnVqGPtsKW1LxaFQFwn9Eb3yvq2fUKJsRvaXjnAV7R5osqETapzNiA==}
engines: {node: '>=6.0.0'}
hasBin: true
@@ -1728,8 +1717,8 @@ packages:
resolution: {integrity: sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==}
engines: {node: '>= 0.8'}
- better-auth@1.7.12:
- resolution: {integrity: sha512-f1fEG0QdTslzbmFA+vOGFFW/XXCWkG4kBxLeH9n1vp1otTH9+ZzV6EJ6797GStWeiYYgS5Vnt9xqE12KwSyAAw==}
+ better-auth@1.7.14:
+ resolution: {integrity: sha512-QxDCI0pOCCHDYmruisKhKyrvOJ6Icv9xg0RA6ZUysfKFXENYwhNNpwUlkE/NmViH2nDMgkKcymmLr55pnpR9vw==}
peerDependencies:
'@lynx-js/react': '*'
'@prisma/client': ^5.0.0 || ^6.0.0 || ^7.0.0
@@ -1810,8 +1799,8 @@ packages:
resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==}
engines: {node: '>=8'}
- browserslist@4.29.4:
- resolution: {integrity: sha512-2TcbbiwXEq+N0kD36tykpCfyyQigUXmuwNQbnPp4Xk4PX9JOqVIKjJlIDjpH7uY6tmRGoAd+apeT1p60T8wsdA==}
+ browserslist@4.29.5:
+ resolution: {integrity: sha512-khTmKu5NGYTotqcYo8Bew2k4RAE9PuXRSFRXG2lQBrCEQHyeQ/vX6gKMxfokwywBsLiXZMnHsmWMG1pnO8J7uQ==}
engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7}
hasBin: true
@@ -1939,10 +1928,6 @@ packages:
resolution: {integrity: sha512-e+H0ZXHSWYrENhQzw1LPuP4oF5MzVKmDU6d3hxlvaPEYLLg62MxtQNPRx4SYSuYJSBUgnQIG4HIN2tEtNv7Dog==}
engines: {node: '>=18'}
- content-type@1.0.5:
- resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==}
- engines: {node: '>= 0.6'}
-
content-type@2.1.0:
resolution: {integrity: sha512-mj7UPXE0jaqaOsukNZRUEfEi2AcL7C/vwmwcHV0O97eO1E1pxBZuyjlZrx5seTaNBg1U6+o35wpa35Qfcc+7ag==}
engines: {node: '>=18'}
@@ -1961,10 +1946,6 @@ packages:
resolution: {integrity: sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==}
engines: {node: '>= 0.6'}
- cors@2.8.6:
- resolution: {integrity: sha512-tJtZBBHA6vjIAaF6EnIaq6laBBP9aq/Y3ouVJjEfoHbRBcHBAHYcMh/w8LDrk2PvIMMq8gmopa5D4V8RmbrxGw==}
- engines: {node: '>= 0.10'}
-
cosmiconfig@8.3.6:
resolution: {integrity: sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==}
engines: {node: '>=14'}
@@ -2132,8 +2113,8 @@ packages:
ee-first@1.1.1:
resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==}
- electron-to-chromium@1.5.464:
- resolution: {integrity: sha512-nRa65aFge40viPAKxMKULIY8tcXKwKboJWNn4RoKwyWXJ6SP7BnrDGKUTzc64818jIciH0PK7LSF8QzZes19GA==}
+ electron-to-chromium@1.5.467:
+ resolution: {integrity: sha512-Nw9X371rtZmYcBSnEijnCDONILjs93biCZO34juC7MBOmK8E+GFnyD4T/WvyrlJkppul7oxg6TwvtKst9SODTw==}
emoji-regex@10.6.0:
resolution: {integrity: sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==}
@@ -2319,14 +2300,6 @@ packages:
eventemitter3@5.0.4:
resolution: {integrity: sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==}
- eventsource-parser@3.1.1:
- resolution: {integrity: sha512-EKN1vKAMcZ8MlYMpaNuxN6R9yakzH6uajHcHVTqWJzvu5pWw9DyhbP35HH8MVBQ+dZjAfDxk+A8NiR9KWaXiyQ==}
- engines: {node: '>=18.0.0'}
-
- eventsource@3.0.7:
- resolution: {integrity: sha512-CRT1WTyuQoD771GW56XEZFQ/ZoSfWid1alKGDYMmkt2yl8UXrVR4pspqWNEcqKvVIzg6PAltWjxcSSPrboA4iA==}
- engines: {node: '>=18.0.0'}
-
execa@5.1.1:
resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==}
engines: {node: '>=10'}
@@ -2343,18 +2316,12 @@ packages:
resolution: {integrity: sha512-KfYbmpRm0VbLjEvVa9yGwCi9GI34xvi7A/HXYWQO65CSD2u3MczUJSuwXKFIxlGsgBQizV9q5J9NHj4VG0n+pA==}
engines: {node: '>=12.0.0'}
- express-rate-limit@8.7.1:
- resolution: {integrity: sha512-2FXbqkygil3mZiXzEtM0IjE/UBmBNot0J1GEVrJT4JbrvwOSoEtqtO+wHbiMQELWe1eNvHoYRg2dkjOid+6JkA==}
- engines: {node: '>= 16'}
- peerDependencies:
- express: '>= 4.11'
-
express@5.3.0:
resolution: {integrity: sha512-qCqy1xSoaugxOD4IVHb1ZWdkvCF2W3aE2okKouWj8VwJ+ztskSiXoBnCSJqfKT+cVPJhuJqe9YLbY425+Zh00g==}
engines: {node: '>= 18'}
- exsolve@1.1.3:
- resolution: {integrity: sha512-kuzL9zherLQoqDeQaS55AiiIg1kb4KYXaSusTtgZTPlvKP2gGCI82LNmBNh5RjDVUXIcmgx+/Mx7vPwRzBbhJA==}
+ exsolve@1.2.0:
+ resolution: {integrity: sha512-h1pQPR9XoeSMdntRNCjyTznaume4UpfXrULBnlkZ2CUM/G5eSa+pBByGldO5uR8dxbPC+OuJXsPPNf+JZ81ADg==}
fast-deep-equal@3.1.3:
resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==}
@@ -2562,10 +2529,6 @@ packages:
hermes-parser@0.25.1:
resolution: {integrity: sha512-6pEjquH3rqaI6cYAXYPcz9MS4rY6R4ngRgrgfDshRptUZIc3lw0MCIJIGDj9++mfySOuPTHB4nrSW99BCvOPIA==}
- hono@4.13.13:
- resolution: {integrity: sha512-CQ46U0ZkAGmbT/4UxdzzGJpacP2IeKgY4a5/tOI9AABbpOMfK739wfDXmv1usCk+3RkKj1hQy4/fjhiwa2xlrA==}
- engines: {node: '>=16.9.0'}
-
hookified@1.15.1:
resolution: {integrity: sha512-MvG/clsADq1GPM2KGo2nyfaWVyn9naPiXrqIe4jYjXNZQt238kWyOGrsyc/DmRAQ+Re6yeo6yX/yoNCG5KAEVg==}
@@ -2596,8 +2559,8 @@ packages:
resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==}
engines: {node: '>= 4'}
- ignore@7.0.13:
- resolution: {integrity: sha512-2E8Q6rh+1RRSq/YdaGsNfXsEZy9FVqv6BSSrkmZJP7BnaoPnRfKL+YaofPvP+5rzdk144qSm6i4+hvPgUcbV4Q==}
+ ignore@7.0.14:
+ resolution: {integrity: sha512-wCBiZ77u1tuWde6G/nfOtLaCTYcFDU5yCzARzK10y+rLhzYoL7a7yEemcopcc2Mzow7gZOIjnV2ym1NYmdiJOQ==}
engines: {node: '>= 4'}
immutable@5.1.9:
@@ -2625,8 +2588,8 @@ packages:
invariant@2.2.4:
resolution: {integrity: sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==}
- ip-address@10.7.4:
- resolution: {integrity: sha512-DWBMKyeM25D70nrIiTkgQth59/G+naKOTep6huF9j+GmeK3DMD60Zvxg5d5qQnz+38AHgou6ean2LECX+lrKDg==}
+ ip-address@10.7.5:
+ resolution: {integrity: sha512-t2v0rkILYv9WXmSL7TpAaU3HXgaFYOPUcH3QHgwQ++gpJuH3bqyMy4Fvt/DJCTKwzH3Cf+bAp5W/mFL39KPLzA==}
engines: {node: '>= 12'}
ipaddr.js@1.9.1:
@@ -2798,9 +2761,6 @@ packages:
json-schema-typed@7.0.3:
resolution: {integrity: sha512-7DE8mpG+/fVw+dTpjbxnx47TaMnDfOI1jwft9g1VybltZCduyRQPJPvc+zzKY9WPHxhPWczyFuYa6I8Mw4iU5A==}
- json-schema-typed@8.0.2:
- resolution: {integrity: sha512-fQhoXdcvc3V28x7C7BMs4P5+kNlgUURe2jmUT1T//oBRMDrqy1QPelJimwZGo7Hg9VPV3EQV5Bnq4hbFy2vetA==}
-
json-stable-stringify-without-jsonify@1.0.1:
resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==}
@@ -3024,8 +2984,8 @@ packages:
lru-cache@5.1.1:
resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==}
- lucide-react@1.61.0:
- resolution: {integrity: sha512-v2SQPPPNjnr+BlhL9Spuzmo5yR+hLkftfuE4E3jaxdNPgSH0hJKPcLJBP7yAta87jQNPsSERS59PJjCJ/CorBA==}
+ lucide-react@1.63.0:
+ resolution: {integrity: sha512-GkBfQG+FUJ41x6y3/lNXiOziVU0Rcqqq0TCzhHS8avsFXHZmOdmfBqsVTvHSaVmbI+wbdGkxHRmhYWhD3N4/yA==}
peerDependencies:
'@types/react': '*'
react: ^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0
@@ -3040,8 +3000,8 @@ packages:
magic-string@0.30.21:
resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==}
- magic-string@1.4.3:
- resolution: {integrity: sha512-z12OxmaPGE0F4xlpGdjuAUckipLpQlTAuAmyGhNoD7ODpYUzvDfvtxUbjM/jwznyP178oju/KDdyi220wNJ0RQ==}
+ magic-string@1.4.5:
+ resolution: {integrity: sha512-oLLC2+YvQUfAa+vxoufE/yc1icb87M9iXIRqAoR/2EhE/8cb3SF/+Gi0c2By1B+5Vz2e2vQtUvHiu1+63Znh+w==}
map-cache@0.2.2:
resolution: {integrity: sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg==}
@@ -3172,10 +3132,6 @@ packages:
resolution: {integrity: sha512-9qny7Z9DsQU8Ou39ERsPU4OZQlSTP47ShQzuKZ6PRXpYLtIFgl/DEBYEXKlvcEa+9tHVcK8CF81Y2V72qaZhWA==}
engines: {node: '>=18'}
- object-assign@4.1.1:
- resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==}
- engines: {node: '>=0.10.0'}
-
object-inspect@1.13.4:
resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==}
engines: {node: '>= 0.4'}
@@ -3321,10 +3277,6 @@ packages:
resolution: {integrity: sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA==}
engines: {node: '>=12'}
- pkce-challenge@5.0.1:
- resolution: {integrity: sha512-wQ0b/W4Fr01qtpHlqSqspcj3EhBvimsdh0KlHhH8HRZnMsEa0ea2fTULOXOS9ccQr3om+GcGRk4e+isrZWV8qQ==}
- engines: {node: '>=16.20.0'}
-
pkg-types@2.4.0:
resolution: {integrity: sha512-07Fys7iVx0X6TcviMOgogM1Lk33ZyqOezMnU79S+kffWqwolG/5W9V8EgQSeYCIfFTYVgssRbnH630Oa2+soBA==}
@@ -3336,8 +3288,8 @@ packages:
resolution: {integrity: sha512-wWBro/7hJ40ye6TPiXkUQoXKCw23xSsjriUvqd7Uls9Sso3oLiON1flc18cCdnjgCRXw4fBVqUJJeOdDTh3P3g==}
engines: {node: '>=4'}
- postcss@8.5.31:
- resolution: {integrity: sha512-YUbWYCgErwnMAVkjUnYa+KlMBzGpHwiIt/DE7f0G33AuX2LH9UcTk6KgWxd3zRU+pN3u/C+Xl3EnMLM4Hea7Sg==}
+ postcss@8.5.32:
+ resolution: {integrity: sha512-LJlKCCAUFKOuZxipUdYw1NzIITEsPcgyOG9LkvRJvuKj/bRzbuRY0ARXvL0pWGpsZvn8jku+LMep2eU0seHp8g==}
engines: {node: ^10 || ^12 || >=14}
powershell-utils@0.2.1:
@@ -3377,8 +3329,8 @@ packages:
resolution: {integrity: sha512-+Owyggi9IxT1ePKGafcI87ubSmxol6smwJ+RAHDQlx9+9cPwFWDiKFFCPuWhr9ignlGpZ9vDQLw67N4dcTVFEA==}
engines: {node: '>=20'}
- qs@6.16.1:
- resolution: {integrity: sha512-5Px6J7rfHBAGUhNQ3es4YzcOdBBw0SDcVtThJml4RdnKw4tKs2epA0kPZ+K8X+WiHktT93RHVcQ/3ym5aTCgtg==}
+ qs@6.17.0:
+ resolution: {integrity: sha512-5LK5BZ2XDHMvcUJaf0CQ5HL3aVgKbpklvByC7qLSxYkfE8COEEbJg5xCHWCTqzqi0Gs4Jn5Mv5v3R38W6edscA==}
engines: {node: '>=0.6'}
queue-microtask@1.2.3:
@@ -3404,8 +3356,8 @@ packages:
resolution: {integrity: sha512-QgT5//D3jfjJb6Gsjxv0Slpj23ip+HtOpnNgnb2S5zU3CB26G/IDPGoy4RJB42wzFE46DRsstbW6tKHoKbhAxw==}
engines: {node: '>=0.10.0'}
- react-router@8.5.0:
- resolution: {integrity: sha512-9nEd/deifcTJIIcUaNIyQGkyXD0D6QVB9XD2O5GgHpP3xu3U5RXm87YQ8++Wn8JQWgMBM/5+PjWPM/7n7O7WHA==}
+ react-router@8.5.1:
+ resolution: {integrity: sha512-5u1eQ46QjuXjNfEnLwzrnou1Bm5dquO3xjVYkkMYCudtkicD2AQHtx+fvXzPATtPJx8TW6DR1x1TDRqsfHyZBw==}
engines: {node: '>=22.22.0'}
peerDependencies:
'@types/react': '>=19.2.0'
@@ -3532,8 +3484,8 @@ packages:
setprototypeof@1.2.0:
resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==}
- shadcn@4.22.1:
- resolution: {integrity: sha512-LbB4Lro+b0qSVki/tgL5edtKylEnXe1ppxMJC12d7NHPgaT+eSgJGMQULwP72V7X9tbiUq7xfx3VDAfB7jdGoA==}
+ shadcn@4.23.0:
+ resolution: {integrity: sha512-lKgq7QPFgkV/6EOrMCwvEn7ZAw/YnM/grhxzJmK4cZdw3E4F3Ut2EmWvrn2E+vzJp1y/76mxU185OSkXo9Ff+Q==}
engines: {node: '>=20.18.1'}
hasBin: true
@@ -3669,8 +3621,8 @@ packages:
resolution: {integrity: sha512-tTw2sPVgJb/ZO+Uz5Cs1haWg7aL0cw+DvD8mXos+ws5YaelM3IBZ50M717T1+RD5Qq0TdeZ/EI/wVMnAdJA0Eg==}
engines: {node: '>=22.12.0'}
- systeminformation@5.33.16:
- resolution: {integrity: sha512-R+Lh69IJXfJj6bfyH1In5cIR9FTr4hBS39YvlZHZjsK1p9cuELPq7hplZZIb56ZESMMb+DzdKqqE6Iomi01Mvg==}
+ systeminformation@5.33.18:
+ resolution: {integrity: sha512-SF8DBQx3ypa8zDqZlezpHQ6M2g7TrqSEWpAtC4OsHCdLmi7J2WdxaSbA8/DJyEn2l/CHPrW0VFenoqoDccrw6g==}
engines: {node: '>=10.0.0'}
os: [darwin, linux, win32, freebsd, openbsd, netbsd, sunos, android]
hasBin: true
@@ -3704,8 +3656,8 @@ packages:
title-case@3.0.3:
resolution: {integrity: sha512-e1zGYRvbffpcHIrnuqT0Dh+gEJtDaxDSoG4JAIpq4oDFyooziLBIiYQv0GBT4FUAnUop5uZ1hiIAj7oAF6sOCA==}
- tldts-core@7.4.19:
- resolution: {integrity: sha512-goNXV6Ho9TIOfpJZanTd6CKG5DyYgYAL+k+22T0SLh8l6+KHIfBUPFuePuSZv05UttIaaLmI9tb7TmGIdK5AkQ==}
+ tldts-core@7.4.20:
+ resolution: {integrity: sha512-C630TWXZCZmLq0F2bW4QqwnaaxCQ/svpAqvJwnC4JvgEM5ohhBnGsEzTLSOXcN+xjz+kEaHS5uoWIw2klnqd0A==}
tldts@7.4.19:
resolution: {integrity: sha512-48dH6aSpQnpbzDUc4vIQZ1VjB8tkK+e8c1yx05/SZK+rkssgjEOlxDd/yU8/a4vGYQ9vRgJr9dwMq9TJ0b3X2Q==}
@@ -3765,8 +3717,8 @@ packages:
resolution: {integrity: sha512-faYHw0anBbc/kWF3zFTEnxSFOAGUX9GFbOBthvDdLsIlEoWOFOtS0zgCiQYwIskL9iGXZL3kAXD8OoZ4GmMATA==}
engines: {node: '>= 18'}
- typescript-eslint@8.72.0:
- resolution: {integrity: sha512-r26Fkc8As+mZvqp7SLsMmNFyYUup/6CjK7/eHBHmhOw6GH6n6YFxHVFrG0jN1c5CMpDzelLPxvgeCOzx7BjN+A==}
+ typescript-eslint@8.72.1:
+ resolution: {integrity: sha512-3Li9FfPmQp45nxEtFD1ZCrYFI3cYK5kpyNtmm1H7lMagm8u9sy6PTjy3ytwQZs7KNukOyKFHAZ6z6GjYFeaeXw==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies:
eslint: ^8.57.0 || ^9.0.0 || ^10.0.0
@@ -4033,11 +3985,6 @@ packages:
resolution: {integrity: sha512-xYqdZFUK/VYazNl/oCDYN+3WloWQwMfZxBoiNt6qNyk+xfOdi598muWE42rNZFp1kNOiqW936q5RhUdnpqElSg==}
engines: {node: '>=18'}
- zod-to-json-schema@3.25.2:
- resolution: {integrity: sha512-O/PgfnpT1xKSDeQYSCfRI5Gy3hPf91mKVDuYLUHZJMiDFptvP41MSnWofm8dnCm0256ZNfZIM7DSzuSMAFnjHA==}
- peerDependencies:
- zod: ^3.25.28 || ^4
-
zod-validation-error@4.0.2:
resolution: {integrity: sha512-Q6/nZLe6jxuU80qb/4uJ4t5v2VEZ44lzQjPDhYJNztRQ4wyWc6VF3D3Kb/fAuPetZQnhS3hnajCf9CsWesghLQ==}
engines: {node: '>=18.0.0'}
@@ -4074,7 +4021,7 @@ snapshots:
immutable: 5.1.9
invariant: 2.2.4
- '@asamuzakjp/css-color@7.1.7':
+ '@asamuzakjp/css-color@7.1.9':
dependencies:
'@csstools/css-calc': 3.4.3(@csstools/css-parser-algorithms@4.0.2(@csstools/css-tokenizer@4.0.2))(@csstools/css-tokenizer@4.0.2)
'@csstools/css-color-parser': 4.2.6(@csstools/css-parser-algorithms@4.0.2(@csstools/css-tokenizer@4.0.2))(@csstools/css-tokenizer@4.0.2)
@@ -4133,7 +4080,7 @@ snapshots:
dependencies:
'@babel/compat-data': 7.29.7
'@babel/helper-validator-option': 7.29.7
- browserslist: 4.29.4
+ browserslist: 4.29.5
lru-cache: 5.1.1
semver: 6.3.1
@@ -4302,10 +4249,10 @@ snapshots:
optionalDependencies:
'@types/react': 19.3.0
- '@better-auth/core@1.7.12(@better-auth/utils@0.5.0)(@better-fetch/fetch@1.3.2)(better-call@1.4.4(zod@4.6.7))(jose@6.2.13)(kysely@0.29.7)(nanostores@1.5.5)':
+ '@better-auth/core@1.7.14(@better-auth/utils@0.5.1)(@better-fetch/fetch@1.3.3)(better-call@1.4.4(zod@4.6.7))(jose@6.2.13)(kysely@0.29.7)(nanostores@1.5.5)':
dependencies:
- '@better-auth/utils': 0.5.0
- '@better-fetch/fetch': 1.3.2
+ '@better-auth/utils': 0.5.1
+ '@better-fetch/fetch': 1.3.3
'@standard-schema/spec': 1.1.0
better-call: 1.4.4(zod@4.6.7)
jose: 6.2.13
@@ -4313,44 +4260,44 @@ snapshots:
nanostores: 1.5.5
zod: 4.6.7
- '@better-auth/drizzle-adapter@1.7.12(@better-auth/core@1.7.12(@better-auth/utils@0.5.0)(@better-fetch/fetch@1.3.2)(better-call@1.4.4(zod@4.6.7))(jose@6.2.13)(kysely@0.29.7)(nanostores@1.5.5))(@better-auth/utils@0.5.0)':
+ '@better-auth/drizzle-adapter@1.7.14(@better-auth/core@1.7.14(@better-auth/utils@0.5.1)(@better-fetch/fetch@1.3.3)(better-call@1.4.4(zod@4.6.7))(jose@6.2.13)(kysely@0.29.7)(nanostores@1.5.5))(@better-auth/utils@0.5.1)':
dependencies:
- '@better-auth/core': 1.7.12(@better-auth/utils@0.5.0)(@better-fetch/fetch@1.3.2)(better-call@1.4.4(zod@4.6.7))(jose@6.2.13)(kysely@0.29.7)(nanostores@1.5.5)
- '@better-auth/utils': 0.5.0
+ '@better-auth/core': 1.7.14(@better-auth/utils@0.5.1)(@better-fetch/fetch@1.3.3)(better-call@1.4.4(zod@4.6.7))(jose@6.2.13)(kysely@0.29.7)(nanostores@1.5.5)
+ '@better-auth/utils': 0.5.1
- '@better-auth/kysely-adapter@1.7.12(@better-auth/core@1.7.12(@better-auth/utils@0.5.0)(@better-fetch/fetch@1.3.2)(better-call@1.4.4(zod@4.6.7))(jose@6.2.13)(kysely@0.29.7)(nanostores@1.5.5))(@better-auth/utils@0.5.0)(kysely@0.29.7)':
+ '@better-auth/kysely-adapter@1.7.14(@better-auth/core@1.7.14(@better-auth/utils@0.5.1)(@better-fetch/fetch@1.3.3)(better-call@1.4.4(zod@4.6.7))(jose@6.2.13)(kysely@0.29.7)(nanostores@1.5.5))(@better-auth/utils@0.5.1)(kysely@0.29.7)':
dependencies:
- '@better-auth/core': 1.7.12(@better-auth/utils@0.5.0)(@better-fetch/fetch@1.3.2)(better-call@1.4.4(zod@4.6.7))(jose@6.2.13)(kysely@0.29.7)(nanostores@1.5.5)
- '@better-auth/utils': 0.5.0
+ '@better-auth/core': 1.7.14(@better-auth/utils@0.5.1)(@better-fetch/fetch@1.3.3)(better-call@1.4.4(zod@4.6.7))(jose@6.2.13)(kysely@0.29.7)(nanostores@1.5.5)
+ '@better-auth/utils': 0.5.1
optionalDependencies:
kysely: 0.29.7
- '@better-auth/memory-adapter@1.7.12(@better-auth/core@1.7.12(@better-auth/utils@0.5.0)(@better-fetch/fetch@1.3.2)(better-call@1.4.4(zod@4.6.7))(jose@6.2.13)(kysely@0.29.7)(nanostores@1.5.5))(@better-auth/utils@0.5.0)':
+ '@better-auth/memory-adapter@1.7.14(@better-auth/core@1.7.14(@better-auth/utils@0.5.1)(@better-fetch/fetch@1.3.3)(better-call@1.4.4(zod@4.6.7))(jose@6.2.13)(kysely@0.29.7)(nanostores@1.5.5))(@better-auth/utils@0.5.1)':
dependencies:
- '@better-auth/core': 1.7.12(@better-auth/utils@0.5.0)(@better-fetch/fetch@1.3.2)(better-call@1.4.4(zod@4.6.7))(jose@6.2.13)(kysely@0.29.7)(nanostores@1.5.5)
- '@better-auth/utils': 0.5.0
+ '@better-auth/core': 1.7.14(@better-auth/utils@0.5.1)(@better-fetch/fetch@1.3.3)(better-call@1.4.4(zod@4.6.7))(jose@6.2.13)(kysely@0.29.7)(nanostores@1.5.5)
+ '@better-auth/utils': 0.5.1
- '@better-auth/mongo-adapter@1.7.12(@better-auth/core@1.7.12(@better-auth/utils@0.5.0)(@better-fetch/fetch@1.3.2)(better-call@1.4.4(zod@4.6.7))(jose@6.2.13)(kysely@0.29.7)(nanostores@1.5.5))(@better-auth/utils@0.5.0)':
+ '@better-auth/mongo-adapter@1.7.14(@better-auth/core@1.7.14(@better-auth/utils@0.5.1)(@better-fetch/fetch@1.3.3)(better-call@1.4.4(zod@4.6.7))(jose@6.2.13)(kysely@0.29.7)(nanostores@1.5.5))(@better-auth/utils@0.5.1)':
dependencies:
- '@better-auth/core': 1.7.12(@better-auth/utils@0.5.0)(@better-fetch/fetch@1.3.2)(better-call@1.4.4(zod@4.6.7))(jose@6.2.13)(kysely@0.29.7)(nanostores@1.5.5)
- '@better-auth/utils': 0.5.0
+ '@better-auth/core': 1.7.14(@better-auth/utils@0.5.1)(@better-fetch/fetch@1.3.3)(better-call@1.4.4(zod@4.6.7))(jose@6.2.13)(kysely@0.29.7)(nanostores@1.5.5)
+ '@better-auth/utils': 0.5.1
- '@better-auth/prisma-adapter@1.7.12(@better-auth/core@1.7.12(@better-auth/utils@0.5.0)(@better-fetch/fetch@1.3.2)(better-call@1.4.4(zod@4.6.7))(jose@6.2.13)(kysely@0.29.7)(nanostores@1.5.5))(@better-auth/utils@0.5.0)':
+ '@better-auth/prisma-adapter@1.7.14(@better-auth/core@1.7.14(@better-auth/utils@0.5.1)(@better-fetch/fetch@1.3.3)(better-call@1.4.4(zod@4.6.7))(jose@6.2.13)(kysely@0.29.7)(nanostores@1.5.5))(@better-auth/utils@0.5.1)':
dependencies:
- '@better-auth/core': 1.7.12(@better-auth/utils@0.5.0)(@better-fetch/fetch@1.3.2)(better-call@1.4.4(zod@4.6.7))(jose@6.2.13)(kysely@0.29.7)(nanostores@1.5.5)
- '@better-auth/utils': 0.5.0
+ '@better-auth/core': 1.7.14(@better-auth/utils@0.5.1)(@better-fetch/fetch@1.3.3)(better-call@1.4.4(zod@4.6.7))(jose@6.2.13)(kysely@0.29.7)(nanostores@1.5.5)
+ '@better-auth/utils': 0.5.1
- '@better-auth/telemetry@1.7.12(@better-auth/core@1.7.12(@better-auth/utils@0.5.0)(@better-fetch/fetch@1.3.2)(better-call@1.4.4(zod@4.6.7))(jose@6.2.13)(kysely@0.29.7)(nanostores@1.5.5))(@better-auth/utils@0.5.0)(@better-fetch/fetch@1.3.2)':
+ '@better-auth/telemetry@1.7.14(@better-auth/core@1.7.14(@better-auth/utils@0.5.1)(@better-fetch/fetch@1.3.3)(better-call@1.4.4(zod@4.6.7))(jose@6.2.13)(kysely@0.29.7)(nanostores@1.5.5))(@better-auth/utils@0.5.1)(@better-fetch/fetch@1.3.3)':
dependencies:
- '@better-auth/core': 1.7.12(@better-auth/utils@0.5.0)(@better-fetch/fetch@1.3.2)(better-call@1.4.4(zod@4.6.7))(jose@6.2.13)(kysely@0.29.7)(nanostores@1.5.5)
- '@better-auth/utils': 0.5.0
- '@better-fetch/fetch': 1.3.2
+ '@better-auth/core': 1.7.14(@better-auth/utils@0.5.1)(@better-fetch/fetch@1.3.3)(better-call@1.4.4(zod@4.6.7))(jose@6.2.13)(kysely@0.29.7)(nanostores@1.5.5)
+ '@better-auth/utils': 0.5.1
+ '@better-fetch/fetch': 1.3.3
- '@better-auth/utils@0.5.0':
+ '@better-auth/utils@0.5.1':
dependencies:
'@noble/hashes': 2.4.0
- '@better-fetch/fetch@1.3.2': {}
+ '@better-fetch/fetch@1.3.3': {}
'@bramus/specificity@2.4.3':
dependencies:
@@ -4406,7 +4353,7 @@ snapshots:
object-treeify: 1.1.33
open: 8.4.2
picomatch: 4.0.7
- systeminformation: 5.33.16
+ systeminformation: 5.33.18
undici: 7.30.1
which: 4.0.0
yocto-spinner: 1.2.2
@@ -4439,9 +4386,9 @@ snapshots:
'@eslint-react/ast@5.28.8(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3)':
dependencies:
- '@typescript-eslint/types': 8.72.0
- '@typescript-eslint/typescript-estree': 8.72.0(typescript@6.0.3)
- '@typescript-eslint/utils': 8.72.0(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3)
+ '@typescript-eslint/types': 8.72.1
+ '@typescript-eslint/typescript-estree': 8.72.1(typescript@6.0.3)
+ '@typescript-eslint/utils': 8.72.1(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3)
typescript: 6.0.3
optionalDependencies:
eslint: 10.13.0(jiti@2.7.0)
@@ -4454,8 +4401,8 @@ snapshots:
'@eslint-react/eslint': 5.28.8(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3)
'@eslint-react/shared': 5.28.8(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3)
'@eslint-react/var': 5.28.8(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3)
- '@typescript-eslint/types': 8.72.0
- '@typescript-eslint/utils': 8.72.0(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3)
+ '@typescript-eslint/types': 8.72.1
+ '@typescript-eslint/utils': 8.72.1(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3)
ts-pattern: 5.9.2
typescript: 6.0.3
optionalDependencies:
@@ -4480,8 +4427,8 @@ snapshots:
'@eslint-react/eslint@5.28.8(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3)':
dependencies:
- '@typescript-eslint/types': 8.72.0
- '@typescript-eslint/utils': 8.72.0(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3)
+ '@typescript-eslint/types': 8.72.1
+ '@typescript-eslint/utils': 8.72.1(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3)
typescript: 6.0.3
optionalDependencies:
eslint: 10.13.0(jiti@2.7.0)
@@ -4493,8 +4440,8 @@ snapshots:
'@eslint-react/ast': 5.28.8(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3)
'@eslint-react/eslint': 5.28.8(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3)
'@eslint-react/var': 5.28.8(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3)
- '@typescript-eslint/types': 8.72.0
- '@typescript-eslint/utils': 8.72.0(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3)
+ '@typescript-eslint/types': 8.72.1
+ '@typescript-eslint/utils': 8.72.1(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3)
ts-pattern: 5.9.2
typescript: 6.0.3
optionalDependencies:
@@ -4505,7 +4452,7 @@ snapshots:
'@eslint-react/shared@5.28.8(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3)':
dependencies:
'@eslint-react/eslint': 5.28.8(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3)
- '@typescript-eslint/utils': 8.72.0(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3)
+ '@typescript-eslint/utils': 8.72.1(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3)
ts-pattern: 5.9.2
typescript: 6.0.3
zod: 4.6.7
@@ -4518,9 +4465,9 @@ snapshots:
dependencies:
'@eslint-react/ast': 5.28.8(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3)
'@eslint-react/eslint': 5.28.8(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3)
- '@typescript-eslint/scope-manager': 8.72.0
- '@typescript-eslint/types': 8.72.0
- '@typescript-eslint/utils': 8.72.0(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3)
+ '@typescript-eslint/scope-manager': 8.72.1
+ '@typescript-eslint/types': 8.72.1
+ '@typescript-eslint/utils': 8.72.1(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3)
ts-pattern: 5.9.2
typescript: 6.0.3
optionalDependencies:
@@ -4604,7 +4551,7 @@ snapshots:
'@graphql-tools/merge': 9.2.8(graphql@17.0.2)
'@graphql-tools/url-loader': 9.1.14(@types/node@24.19.2)(graphql@17.0.2)
'@graphql-tools/utils': 12.1.0(graphql@17.0.2)
- '@inquirer/prompts': 8.7.4(@types/node@24.19.2)
+ '@inquirer/prompts': 8.7.5(@types/node@24.19.2)
'@whatwg-node/fetch': 0.10.13
chalk: 5.6.2
cosmiconfig: 9.0.2(typescript@6.0.3)
@@ -4644,8 +4591,8 @@ snapshots:
'@graphql-codegen/plugin-helpers': 7.4.2(graphql@17.0.2)
'@graphql-codegen/typed-document-node': 7.2.0(graphql@17.0.2)
'@graphql-codegen/typescript': 6.1.2(graphql@17.0.2)
- '@graphql-codegen/typescript-operations': 6.1.10(graphql@17.0.2)
- '@graphql-codegen/visitor-plugin-common': 7.4.0(graphql@17.0.2)
+ '@graphql-codegen/typescript-operations': 6.2.0(graphql@17.0.2)
+ '@graphql-codegen/visitor-plugin-common': 7.5.0(graphql@17.0.2)
'@graphql-tools/documents': 1.0.2(graphql@17.0.2)
'@graphql-tools/utils': 12.1.0(graphql@17.0.2)
'@graphql-typed-document-node/core': 3.2.0(graphql@17.0.2)
@@ -4663,7 +4610,7 @@ snapshots:
'@graphql-codegen/gql-tag-operations@6.1.1(graphql@17.0.2)':
dependencies:
'@graphql-codegen/plugin-helpers': 7.4.2(graphql@17.0.2)
- '@graphql-codegen/visitor-plugin-common': 7.4.0(graphql@17.0.2)
+ '@graphql-codegen/visitor-plugin-common': 7.5.0(graphql@17.0.2)
'@graphql-tools/utils': 12.1.0(graphql@17.0.2)
auto-bind: 5.0.1
graphql: 17.0.2
@@ -4688,17 +4635,17 @@ snapshots:
'@graphql-codegen/typed-document-node@7.2.0(graphql@17.0.2)':
dependencies:
'@graphql-codegen/plugin-helpers': 7.4.2(graphql@17.0.2)
- '@graphql-codegen/visitor-plugin-common': 7.4.0(graphql@17.0.2)
+ '@graphql-codegen/visitor-plugin-common': 7.5.0(graphql@17.0.2)
auto-bind: 5.0.1
change-case-all: 2.1.0
graphql: 17.0.2
tslib: 2.8.1
- '@graphql-codegen/typescript-operations@6.1.10(graphql@17.0.2)':
+ '@graphql-codegen/typescript-operations@6.2.0(graphql@17.0.2)':
dependencies:
'@graphql-codegen/plugin-helpers': 7.4.2(graphql@17.0.2)
'@graphql-codegen/schema-ast': 6.1.1(graphql@17.0.2)
- '@graphql-codegen/visitor-plugin-common': 7.4.0(graphql@17.0.2)
+ '@graphql-codegen/visitor-plugin-common': 7.5.0(graphql@17.0.2)
auto-bind: 5.0.1
graphql: 17.0.2
tslib: 2.8.1
@@ -4707,12 +4654,12 @@ snapshots:
dependencies:
'@graphql-codegen/plugin-helpers': 7.4.2(graphql@17.0.2)
'@graphql-codegen/schema-ast': 6.1.1(graphql@17.0.2)
- '@graphql-codegen/visitor-plugin-common': 7.4.0(graphql@17.0.2)
+ '@graphql-codegen/visitor-plugin-common': 7.5.0(graphql@17.0.2)
auto-bind: 5.0.1
graphql: 17.0.2
tslib: 2.8.1
- '@graphql-codegen/visitor-plugin-common@7.4.0(graphql@17.0.2)':
+ '@graphql-codegen/visitor-plugin-common@7.5.0(graphql@17.0.2)':
dependencies:
'@graphql-codegen/plugin-helpers': 7.4.2(graphql@17.0.2)
'@graphql-tools/optimize': 2.0.1(graphql@17.0.2)
@@ -4756,7 +4703,7 @@ snapshots:
transitivePeerDependencies:
- supports-color
- '@graphql-tools/delegate@12.3.0(graphql@17.0.2)':
+ '@graphql-tools/delegate@12.3.1(graphql@17.0.2)':
dependencies:
'@graphql-tools/batch-execute': 10.3.0(graphql@17.0.2)
'@graphql-tools/executor': 2.1.0(graphql@17.0.2)
@@ -4827,7 +4774,7 @@ snapshots:
'@graphql-typed-document-node/core': 3.2.0(graphql@17.0.2)
'@repeaterjs/repeater': 3.1.0
'@whatwg-node/disposablestack': 0.1.0
- '@whatwg-node/promise-helpers': 2.0.0
+ '@whatwg-node/promise-helpers': 2.0.1
graphql: 17.0.2
tslib: 2.8.1
@@ -4849,7 +4796,7 @@ snapshots:
'@graphql-tools/graphql-tag-pluck': 8.3.41(graphql@17.0.2)
'@graphql-tools/utils': 12.1.0(graphql@17.0.2)
'@whatwg-node/fetch': 0.12.1
- '@whatwg-node/promise-helpers': 2.0.0
+ '@whatwg-node/promise-helpers': 2.0.1
graphql: 17.0.2
sync-fetch: 0.7.1
tslib: 2.8.1
@@ -4932,10 +4879,10 @@ snapshots:
'@graphql-tools/executor-http': 3.5.0(@types/node@24.19.2)(graphql@17.0.2)
'@graphql-tools/executor-legacy-ws': 1.1.39(graphql@17.0.2)
'@graphql-tools/utils': 12.1.0(graphql@17.0.2)
- '@graphql-tools/wrap': 11.2.2(graphql@17.0.2)
+ '@graphql-tools/wrap': 11.2.3(graphql@17.0.2)
'@types/ws': 8.18.2
'@whatwg-node/fetch': 0.12.1
- '@whatwg-node/promise-helpers': 2.0.0
+ '@whatwg-node/promise-helpers': 2.0.1
graphql: 17.0.2
isomorphic-ws: 5.0.0(ws@8.22.0)
sync-fetch: 0.7.1
@@ -4951,14 +4898,14 @@ snapshots:
'@graphql-tools/utils@12.1.0(graphql@17.0.2)':
dependencies:
'@graphql-typed-document-node/core': 3.2.0(graphql@17.0.2)
- '@whatwg-node/promise-helpers': 2.0.0
+ '@whatwg-node/promise-helpers': 2.0.1
cross-inspect: 1.0.1
graphql: 17.0.2
tslib: 2.8.1
- '@graphql-tools/wrap@11.2.2(graphql@17.0.2)':
+ '@graphql-tools/wrap@11.2.3(graphql@17.0.2)':
dependencies:
- '@graphql-tools/delegate': 12.3.0(graphql@17.0.2)
+ '@graphql-tools/delegate': 12.3.1(graphql@17.0.2)
'@graphql-tools/schema': 10.1.5(graphql@17.0.2)
'@graphql-tools/utils': 12.1.0(graphql@17.0.2)
'@whatwg-node/promise-helpers': 1.3.2
@@ -4969,10 +4916,6 @@ snapshots:
dependencies:
graphql: 17.0.2
- '@hono/node-server@2.1.5(hono@4.13.13)':
- dependencies:
- hono: 4.13.13
-
'@humanfs/core@0.19.2':
dependencies:
'@humanfs/types': 0.15.0
@@ -4989,33 +4932,33 @@ snapshots:
'@humanwhocodes/retry@0.4.3': {}
- '@icons-pack/react-simple-icons@13.15.1(react@19.3.0)':
+ '@icons-pack/react-simple-icons@13.15.1(react@19.3.1)':
dependencies:
- react: 19.3.0
+ react: 19.3.1
- '@inquirer/ansi@2.0.9': {}
+ '@inquirer/ansi@2.0.10': {}
- '@inquirer/checkbox@5.2.7(@types/node@24.19.2)':
+ '@inquirer/checkbox@5.2.8(@types/node@24.19.2)':
dependencies:
- '@inquirer/ansi': 2.0.9
- '@inquirer/core': 12.0.5(@types/node@24.19.2)
- '@inquirer/figures': 2.0.9
- '@inquirer/type': 4.2.0(@types/node@24.19.2)
+ '@inquirer/ansi': 2.0.10
+ '@inquirer/core': 12.0.6(@types/node@24.19.2)
+ '@inquirer/figures': 2.0.10
+ '@inquirer/type': 4.2.1(@types/node@24.19.2)
optionalDependencies:
'@types/node': 24.19.2
- '@inquirer/confirm@6.3.4(@types/node@24.19.2)':
+ '@inquirer/confirm@6.3.5(@types/node@24.19.2)':
dependencies:
- '@inquirer/core': 12.0.5(@types/node@24.19.2)
- '@inquirer/type': 4.2.0(@types/node@24.19.2)
+ '@inquirer/core': 12.0.6(@types/node@24.19.2)
+ '@inquirer/type': 4.2.1(@types/node@24.19.2)
optionalDependencies:
'@types/node': 24.19.2
- '@inquirer/core@12.0.5(@types/node@24.19.2)':
+ '@inquirer/core@12.0.6(@types/node@24.19.2)':
dependencies:
- '@inquirer/ansi': 2.0.9
- '@inquirer/figures': 2.0.9
- '@inquirer/type': 4.2.0(@types/node@24.19.2)
+ '@inquirer/ansi': 2.0.10
+ '@inquirer/figures': 2.0.10
+ '@inquirer/type': 4.2.1(@types/node@24.19.2)
cli-width: 4.1.0
fast-wrap-ansi: 0.2.2
mute-stream: 3.0.0
@@ -5023,92 +4966,92 @@ snapshots:
optionalDependencies:
'@types/node': 24.19.2
- '@inquirer/editor@5.3.5(@types/node@24.19.2)':
+ '@inquirer/editor@5.3.6(@types/node@24.19.2)':
dependencies:
- '@inquirer/core': 12.0.5(@types/node@24.19.2)
- '@inquirer/external-editor': 3.0.6(@types/node@24.19.2)
- '@inquirer/type': 4.2.0(@types/node@24.19.2)
+ '@inquirer/core': 12.0.6(@types/node@24.19.2)
+ '@inquirer/external-editor': 3.0.7(@types/node@24.19.2)
+ '@inquirer/type': 4.2.1(@types/node@24.19.2)
optionalDependencies:
'@types/node': 24.19.2
- '@inquirer/expand@5.1.7(@types/node@24.19.2)':
+ '@inquirer/expand@5.1.8(@types/node@24.19.2)':
dependencies:
- '@inquirer/core': 12.0.5(@types/node@24.19.2)
- '@inquirer/type': 4.2.0(@types/node@24.19.2)
+ '@inquirer/core': 12.0.6(@types/node@24.19.2)
+ '@inquirer/type': 4.2.1(@types/node@24.19.2)
optionalDependencies:
'@types/node': 24.19.2
- '@inquirer/external-editor@3.0.6(@types/node@24.19.2)':
+ '@inquirer/external-editor@3.0.7(@types/node@24.19.2)':
dependencies:
chardet: 2.2.0
iconv-lite: 0.7.3
optionalDependencies:
'@types/node': 24.19.2
- '@inquirer/figures@2.0.9': {}
+ '@inquirer/figures@2.0.10': {}
- '@inquirer/input@5.1.8(@types/node@24.19.2)':
+ '@inquirer/input@5.1.9(@types/node@24.19.2)':
dependencies:
- '@inquirer/core': 12.0.5(@types/node@24.19.2)
- '@inquirer/type': 4.2.0(@types/node@24.19.2)
+ '@inquirer/core': 12.0.6(@types/node@24.19.2)
+ '@inquirer/type': 4.2.1(@types/node@24.19.2)
optionalDependencies:
'@types/node': 24.19.2
- '@inquirer/number@4.2.5(@types/node@24.19.2)':
+ '@inquirer/number@4.2.6(@types/node@24.19.2)':
dependencies:
- '@inquirer/core': 12.0.5(@types/node@24.19.2)
- '@inquirer/type': 4.2.0(@types/node@24.19.2)
+ '@inquirer/core': 12.0.6(@types/node@24.19.2)
+ '@inquirer/type': 4.2.1(@types/node@24.19.2)
optionalDependencies:
'@types/node': 24.19.2
- '@inquirer/password@5.2.4(@types/node@24.19.2)':
+ '@inquirer/password@5.2.5(@types/node@24.19.2)':
dependencies:
- '@inquirer/ansi': 2.0.9
- '@inquirer/core': 12.0.5(@types/node@24.19.2)
- '@inquirer/type': 4.2.0(@types/node@24.19.2)
+ '@inquirer/ansi': 2.0.10
+ '@inquirer/core': 12.0.6(@types/node@24.19.2)
+ '@inquirer/type': 4.2.1(@types/node@24.19.2)
optionalDependencies:
'@types/node': 24.19.2
- '@inquirer/prompts@8.7.4(@types/node@24.19.2)':
- dependencies:
- '@inquirer/checkbox': 5.2.7(@types/node@24.19.2)
- '@inquirer/confirm': 6.3.4(@types/node@24.19.2)
- '@inquirer/editor': 5.3.5(@types/node@24.19.2)
- '@inquirer/expand': 5.1.7(@types/node@24.19.2)
- '@inquirer/input': 5.1.8(@types/node@24.19.2)
- '@inquirer/number': 4.2.5(@types/node@24.19.2)
- '@inquirer/password': 5.2.4(@types/node@24.19.2)
- '@inquirer/rawlist': 5.3.7(@types/node@24.19.2)
- '@inquirer/search': 4.3.5(@types/node@24.19.2)
- '@inquirer/select': 5.2.7(@types/node@24.19.2)
+ '@inquirer/prompts@8.7.5(@types/node@24.19.2)':
+ dependencies:
+ '@inquirer/checkbox': 5.2.8(@types/node@24.19.2)
+ '@inquirer/confirm': 6.3.5(@types/node@24.19.2)
+ '@inquirer/editor': 5.3.6(@types/node@24.19.2)
+ '@inquirer/expand': 5.1.8(@types/node@24.19.2)
+ '@inquirer/input': 5.1.9(@types/node@24.19.2)
+ '@inquirer/number': 4.2.6(@types/node@24.19.2)
+ '@inquirer/password': 5.2.5(@types/node@24.19.2)
+ '@inquirer/rawlist': 5.3.8(@types/node@24.19.2)
+ '@inquirer/search': 4.3.6(@types/node@24.19.2)
+ '@inquirer/select': 5.2.8(@types/node@24.19.2)
optionalDependencies:
'@types/node': 24.19.2
- '@inquirer/rawlist@5.3.7(@types/node@24.19.2)':
+ '@inquirer/rawlist@5.3.8(@types/node@24.19.2)':
dependencies:
- '@inquirer/core': 12.0.5(@types/node@24.19.2)
- '@inquirer/type': 4.2.0(@types/node@24.19.2)
+ '@inquirer/core': 12.0.6(@types/node@24.19.2)
+ '@inquirer/type': 4.2.1(@types/node@24.19.2)
optionalDependencies:
'@types/node': 24.19.2
- '@inquirer/search@4.3.5(@types/node@24.19.2)':
+ '@inquirer/search@4.3.6(@types/node@24.19.2)':
dependencies:
- '@inquirer/core': 12.0.5(@types/node@24.19.2)
- '@inquirer/figures': 2.0.9
- '@inquirer/type': 4.2.0(@types/node@24.19.2)
+ '@inquirer/core': 12.0.6(@types/node@24.19.2)
+ '@inquirer/figures': 2.0.10
+ '@inquirer/type': 4.2.1(@types/node@24.19.2)
optionalDependencies:
'@types/node': 24.19.2
- '@inquirer/select@5.2.7(@types/node@24.19.2)':
+ '@inquirer/select@5.2.8(@types/node@24.19.2)':
dependencies:
- '@inquirer/ansi': 2.0.9
- '@inquirer/core': 12.0.5(@types/node@24.19.2)
- '@inquirer/figures': 2.0.9
- '@inquirer/type': 4.2.0(@types/node@24.19.2)
+ '@inquirer/ansi': 2.0.10
+ '@inquirer/core': 12.0.6(@types/node@24.19.2)
+ '@inquirer/figures': 2.0.10
+ '@inquirer/type': 4.2.1(@types/node@24.19.2)
optionalDependencies:
'@types/node': 24.19.2
- '@inquirer/type@4.2.0(@types/node@24.19.2)':
+ '@inquirer/type@4.2.1(@types/node@24.19.2)':
optionalDependencies:
'@types/node': 24.19.2
@@ -5139,27 +5082,14 @@ snapshots:
'@keyv/serialize@1.1.1': {}
- '@modelcontextprotocol/sdk@1.32.2(zod@4.6.7)':
+ '@modelcontextprotocol/core@2.4.0':
dependencies:
- '@hono/node-server': 2.1.5(hono@4.13.13)
- ajv: 8.20.0
- ajv-formats: 3.0.1
- content-type: 1.0.5
- cors: 2.8.6
- cross-spawn: 7.0.6
- eventsource: 3.0.7
- eventsource-parser: 3.1.1
- express: 5.3.0
- express-rate-limit: 8.7.1(express@5.3.0)
- hono: 4.13.13
- jose: 6.2.13
- json-schema-typed: 8.0.2
- pkce-challenge: 5.0.1
- raw-body: 3.0.2
zod: 4.6.7
- zod-to-json-schema: 3.25.2(zod@4.6.7)
- transitivePeerDependencies:
- - supports-color
+
+ '@modelcontextprotocol/server@2.4.0':
+ dependencies:
+ '@modelcontextprotocol/core': 2.4.0
+ zod: 4.6.7
'@noble/ciphers@2.4.0': {}
@@ -5179,14 +5109,14 @@ snapshots:
'@oxc-project/types@0.155.0': {}
- '@react-router/dev@8.5.0(@react-router/serve@8.5.0(react-router@8.5.0(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.1(react@19.3.1))(react@19.3.1))(typescript@6.0.3))(react-router@8.5.0(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.1(react@19.3.1))(react@19.3.1))(typescript@6.0.3)(vite@8.3.5(@types/node@24.19.2)(jiti@2.7.0)(yaml@2.9.1))':
+ '@react-router/dev@8.5.1(@react-router/serve@8.5.1(react-router@8.5.1(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.1(react@19.3.1))(react@19.3.1))(typescript@6.0.3))(react-router@8.5.1(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.1(react@19.3.1))(react@19.3.1))(typescript@6.0.3)(vite@8.3.5(@types/node@24.19.2)(jiti@2.7.0)(yaml@2.9.1))':
dependencies:
'@babel/core': 7.29.7
'@babel/generator': 7.29.8
'@babel/parser': 7.29.11
'@babel/traverse': 7.29.10
'@babel/types': 7.29.11
- '@react-router/node': 8.5.0(react-router@8.5.0(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.1(react@19.3.1))(react@19.3.1))(typescript@6.0.3)
+ '@react-router/node': 8.5.1(react-router@8.5.1(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.1(react@19.3.1))(react@19.3.1))(typescript@6.0.3)
'@remix-run/node-fetch-server': 0.14.2
babel-dead-code-elimination: 1.0.12
chokidar: 5.0.0
@@ -5201,42 +5131,42 @@ snapshots:
picocolors: 1.1.1
pkg-types: 2.4.0
react-refresh: 0.18.0
- react-router: 8.5.0(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.1(react@19.3.1))(react@19.3.1)
+ react-router: 8.5.1(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.1(react@19.3.1))(react@19.3.1)
semver: 7.8.5
tinyglobby: 0.2.17
valibot: 1.5.0(typescript@6.0.3)
vite: 8.3.5(@types/node@24.19.2)(jiti@2.7.0)(yaml@2.9.1)
optionalDependencies:
- '@react-router/serve': 8.5.0(react-router@8.5.0(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.1(react@19.3.1))(react@19.3.1))(typescript@6.0.3)
+ '@react-router/serve': 8.5.1(react-router@8.5.1(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.1(react@19.3.1))(react@19.3.1))(typescript@6.0.3)
typescript: 6.0.3
transitivePeerDependencies:
- babel-plugin-macros
- supports-color
- '@react-router/express@8.5.0(express@5.3.0)(react-router@8.5.0(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.1(react@19.3.1))(react@19.3.1))(typescript@6.0.3)':
+ '@react-router/express@8.5.1(express@5.3.0)(react-router@8.5.1(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.1(react@19.3.1))(react@19.3.1))(typescript@6.0.3)':
dependencies:
- '@react-router/node': 8.5.0(react-router@8.5.0(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.1(react@19.3.1))(react@19.3.1))(typescript@6.0.3)
+ '@react-router/node': 8.5.1(react-router@8.5.1(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.1(react@19.3.1))(react@19.3.1))(typescript@6.0.3)
express: 5.3.0
- react-router: 8.5.0(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.1(react@19.3.1))(react@19.3.1)
+ react-router: 8.5.1(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.1(react@19.3.1))(react@19.3.1)
optionalDependencies:
typescript: 6.0.3
- '@react-router/node@8.5.0(react-router@8.5.0(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.1(react@19.3.1))(react@19.3.1))(typescript@6.0.3)':
+ '@react-router/node@8.5.1(react-router@8.5.1(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.1(react@19.3.1))(react@19.3.1))(typescript@6.0.3)':
dependencies:
'@remix-run/node-fetch-server': 0.14.2
- react-router: 8.5.0(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.1(react@19.3.1))(react@19.3.1)
+ react-router: 8.5.1(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.1(react@19.3.1))(react@19.3.1)
optionalDependencies:
typescript: 6.0.3
- '@react-router/serve@8.5.0(react-router@8.5.0(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.1(react@19.3.1))(react@19.3.1))(typescript@6.0.3)':
+ '@react-router/serve@8.5.1(react-router@8.5.1(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.1(react@19.3.1))(react@19.3.1))(typescript@6.0.3)':
dependencies:
- '@react-router/express': 8.5.0(express@5.3.0)(react-router@8.5.0(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.1(react@19.3.1))(react@19.3.1))(typescript@6.0.3)
- '@react-router/node': 8.5.0(react-router@8.5.0(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.1(react@19.3.1))(react@19.3.1))(typescript@6.0.3)
+ '@react-router/express': 8.5.1(express@5.3.0)(react-router@8.5.1(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.1(react@19.3.1))(react@19.3.1))(typescript@6.0.3)
+ '@react-router/node': 8.5.1(react-router@8.5.1(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.1(react@19.3.1))(react@19.3.1))(typescript@6.0.3)
'@remix-run/node-fetch-server': 0.14.2
compression: 1.8.2
express: 5.3.0
morgan: 1.12.1
- react-router: 8.5.0(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.1(react@19.3.1))(react@19.3.1)
+ react-router: 8.5.1(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.1(react@19.3.1))(react@19.3.1)
source-map-support: 0.5.21
transitivePeerDependencies:
- supports-color
@@ -5306,7 +5236,7 @@ snapshots:
'@sec-ant/readable-stream@0.4.1': {}
- '@shadcn/registry@0.2.0':
+ '@shadcn/registry@0.2.1':
dependencies:
'@babel/core': 7.29.7
'@babel/parser': 7.29.11
@@ -5322,7 +5252,7 @@ snapshots:
fuzzysort: 3.1.0
kleur: 4.1.5
ora: 8.2.0
- postcss: 8.5.31
+ postcss: 8.5.32
prompts: 2.4.2
recast: 0.23.21
socks: 2.8.10
@@ -5530,57 +5460,57 @@ snapshots:
dependencies:
'@types/node': 24.19.2
- '@typescript-eslint/eslint-plugin@8.72.0(@typescript-eslint/parser@8.72.0(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3))(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3)':
+ '@typescript-eslint/eslint-plugin@8.72.1(@typescript-eslint/parser@8.72.1(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3))(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3)':
dependencies:
'@eslint-community/regexpp': 4.12.2
- '@typescript-eslint/parser': 8.72.0(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3)
- '@typescript-eslint/scope-manager': 8.72.0
- '@typescript-eslint/type-utils': 8.72.0(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3)
- '@typescript-eslint/utils': 8.72.0(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3)
- '@typescript-eslint/visitor-keys': 8.72.0
+ '@typescript-eslint/parser': 8.72.1(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3)
+ '@typescript-eslint/scope-manager': 8.72.1
+ '@typescript-eslint/type-utils': 8.72.1(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3)
+ '@typescript-eslint/utils': 8.72.1(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3)
+ '@typescript-eslint/visitor-keys': 8.72.1
eslint: 10.13.0(jiti@2.7.0)
- ignore: 7.0.13
+ ignore: 7.0.14
natural-compare: 1.4.0
ts-api-utils: 2.5.0(typescript@6.0.3)
typescript: 6.0.3
transitivePeerDependencies:
- supports-color
- '@typescript-eslint/parser@8.72.0(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3)':
+ '@typescript-eslint/parser@8.72.1(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3)':
dependencies:
- '@typescript-eslint/scope-manager': 8.72.0
- '@typescript-eslint/types': 8.72.0
- '@typescript-eslint/typescript-estree': 8.72.0(typescript@6.0.3)
- '@typescript-eslint/visitor-keys': 8.72.0
+ '@typescript-eslint/scope-manager': 8.72.1
+ '@typescript-eslint/types': 8.72.1
+ '@typescript-eslint/typescript-estree': 8.72.1(typescript@6.0.3)
+ '@typescript-eslint/visitor-keys': 8.72.1
debug: 4.4.3
eslint: 10.13.0(jiti@2.7.0)
typescript: 6.0.3
transitivePeerDependencies:
- supports-color
- '@typescript-eslint/project-service@8.72.0(typescript@6.0.3)':
+ '@typescript-eslint/project-service@8.72.1(typescript@6.0.3)':
dependencies:
- '@typescript-eslint/tsconfig-utils': 8.72.0(typescript@6.0.3)
- '@typescript-eslint/types': 8.72.0
+ '@typescript-eslint/tsconfig-utils': 8.72.1(typescript@6.0.3)
+ '@typescript-eslint/types': 8.72.1
debug: 4.4.3
typescript: 6.0.3
transitivePeerDependencies:
- supports-color
- '@typescript-eslint/scope-manager@8.72.0':
+ '@typescript-eslint/scope-manager@8.72.1':
dependencies:
- '@typescript-eslint/types': 8.72.0
- '@typescript-eslint/visitor-keys': 8.72.0
+ '@typescript-eslint/types': 8.72.1
+ '@typescript-eslint/visitor-keys': 8.72.1
- '@typescript-eslint/tsconfig-utils@8.72.0(typescript@6.0.3)':
+ '@typescript-eslint/tsconfig-utils@8.72.1(typescript@6.0.3)':
dependencies:
typescript: 6.0.3
- '@typescript-eslint/type-utils@8.72.0(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3)':
+ '@typescript-eslint/type-utils@8.72.1(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3)':
dependencies:
- '@typescript-eslint/types': 8.72.0
- '@typescript-eslint/typescript-estree': 8.72.0(typescript@6.0.3)
- '@typescript-eslint/utils': 8.72.0(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3)
+ '@typescript-eslint/types': 8.72.1
+ '@typescript-eslint/typescript-estree': 8.72.1(typescript@6.0.3)
+ '@typescript-eslint/utils': 8.72.1(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3)
debug: 4.4.3
eslint: 10.13.0(jiti@2.7.0)
ts-api-utils: 2.5.0(typescript@6.0.3)
@@ -5588,14 +5518,14 @@ snapshots:
transitivePeerDependencies:
- supports-color
- '@typescript-eslint/types@8.72.0': {}
+ '@typescript-eslint/types@8.72.1': {}
- '@typescript-eslint/typescript-estree@8.72.0(typescript@6.0.3)':
+ '@typescript-eslint/typescript-estree@8.72.1(typescript@6.0.3)':
dependencies:
- '@typescript-eslint/project-service': 8.72.0(typescript@6.0.3)
- '@typescript-eslint/tsconfig-utils': 8.72.0(typescript@6.0.3)
- '@typescript-eslint/types': 8.72.0
- '@typescript-eslint/visitor-keys': 8.72.0
+ '@typescript-eslint/project-service': 8.72.1(typescript@6.0.3)
+ '@typescript-eslint/tsconfig-utils': 8.72.1(typescript@6.0.3)
+ '@typescript-eslint/types': 8.72.1
+ '@typescript-eslint/visitor-keys': 8.72.1
debug: 4.4.3
minimatch: 10.2.6
semver: 7.8.5
@@ -5605,20 +5535,20 @@ snapshots:
transitivePeerDependencies:
- supports-color
- '@typescript-eslint/utils@8.72.0(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3)':
+ '@typescript-eslint/utils@8.72.1(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3)':
dependencies:
'@eslint-community/eslint-utils': 4.10.1(eslint@10.13.0(jiti@2.7.0))
- '@typescript-eslint/scope-manager': 8.72.0
- '@typescript-eslint/types': 8.72.0
- '@typescript-eslint/typescript-estree': 8.72.0(typescript@6.0.3)
+ '@typescript-eslint/scope-manager': 8.72.1
+ '@typescript-eslint/types': 8.72.1
+ '@typescript-eslint/typescript-estree': 8.72.1(typescript@6.0.3)
eslint: 10.13.0(jiti@2.7.0)
typescript: 6.0.3
transitivePeerDependencies:
- supports-color
- '@typescript-eslint/visitor-keys@8.72.0':
+ '@typescript-eslint/visitor-keys@8.72.1':
dependencies:
- '@typescript-eslint/types': 8.72.0
+ '@typescript-eslint/types': 8.72.1
eslint-visitor-keys: 5.0.1
'@vitejs/plugin-react@6.1.2(@rolldown/plugin-babel@0.2.4(@babel/core@7.29.7)(@babel/runtime@8.0.8)(rolldown@1.2.15)(vite@8.3.5(@types/node@24.19.2)(jiti@2.7.0)(yaml@2.9.1)))(babel-plugin-react-compiler@1.0.0)(vite@8.3.5(@types/node@24.19.2)(jiti@2.7.0)(yaml@2.9.1))':
@@ -5634,7 +5564,7 @@ snapshots:
'@jridgewell/trace-mapping': 0.3.31
'@vitest/spy': 5.0.5
estree-walker: 3.0.3
- magic-string: 1.4.3
+ magic-string: 1.4.5
optionalDependencies:
vite: 8.3.5(@types/node@24.19.2)(jiti@2.7.0)(yaml@2.9.1)
@@ -5647,7 +5577,7 @@ snapshots:
'@whatwg-node/disposablestack@0.1.0':
dependencies:
- '@whatwg-node/promise-helpers': 2.0.0
+ '@whatwg-node/promise-helpers': 2.0.1
tslib: 2.8.1
'@whatwg-node/fetch@0.10.13':
@@ -5657,7 +5587,7 @@ snapshots:
'@whatwg-node/fetch@0.12.1':
dependencies:
- '@whatwg-node/node-fetch': 0.9.2
+ '@whatwg-node/node-fetch': 0.9.3
urlpattern-polyfill: 10.1.0
'@whatwg-node/node-fetch@0.8.6':
@@ -5667,18 +5597,18 @@ snapshots:
'@whatwg-node/promise-helpers': 1.3.2
tslib: 2.8.1
- '@whatwg-node/node-fetch@0.9.2':
+ '@whatwg-node/node-fetch@0.9.3':
dependencies:
'@fastify/busboy': 3.2.4
'@whatwg-node/disposablestack': 0.1.0
- '@whatwg-node/promise-helpers': 2.0.0
+ '@whatwg-node/promise-helpers': 2.0.1
tslib: 2.8.1
'@whatwg-node/promise-helpers@1.3.2':
dependencies:
tslib: 2.8.1
- '@whatwg-node/promise-helpers@2.0.0':
+ '@whatwg-node/promise-helpers@2.0.1':
dependencies:
tslib: 2.8.1
@@ -5713,10 +5643,6 @@ snapshots:
dependencies:
ajv: 8.20.0
- ajv-formats@3.0.1:
- dependencies:
- ajv: 8.20.0
-
ajv@6.15.0:
dependencies:
fast-deep-equal: 3.1.3
@@ -5780,23 +5706,23 @@ snapshots:
balanced-match@4.0.4: {}
- baseline-browser-mapping@2.11.32: {}
+ baseline-browser-mapping@2.11.34: {}
basic-auth@2.0.1:
dependencies:
safe-buffer: 5.1.2
- better-auth@1.7.12(react-dom@19.3.1(react@19.3.1))(react@19.3.1)(vitest@5.0.5(@types/node@24.19.2)(jsdom@30.1.3(@noble/hashes@2.4.0))(vite@8.3.5(@types/node@24.19.2)(jiti@2.7.0)(yaml@2.9.1))):
- dependencies:
- '@better-auth/core': 1.7.12(@better-auth/utils@0.5.0)(@better-fetch/fetch@1.3.2)(better-call@1.4.4(zod@4.6.7))(jose@6.2.13)(kysely@0.29.7)(nanostores@1.5.5)
- '@better-auth/drizzle-adapter': 1.7.12(@better-auth/core@1.7.12(@better-auth/utils@0.5.0)(@better-fetch/fetch@1.3.2)(better-call@1.4.4(zod@4.6.7))(jose@6.2.13)(kysely@0.29.7)(nanostores@1.5.5))(@better-auth/utils@0.5.0)
- '@better-auth/kysely-adapter': 1.7.12(@better-auth/core@1.7.12(@better-auth/utils@0.5.0)(@better-fetch/fetch@1.3.2)(better-call@1.4.4(zod@4.6.7))(jose@6.2.13)(kysely@0.29.7)(nanostores@1.5.5))(@better-auth/utils@0.5.0)(kysely@0.29.7)
- '@better-auth/memory-adapter': 1.7.12(@better-auth/core@1.7.12(@better-auth/utils@0.5.0)(@better-fetch/fetch@1.3.2)(better-call@1.4.4(zod@4.6.7))(jose@6.2.13)(kysely@0.29.7)(nanostores@1.5.5))(@better-auth/utils@0.5.0)
- '@better-auth/mongo-adapter': 1.7.12(@better-auth/core@1.7.12(@better-auth/utils@0.5.0)(@better-fetch/fetch@1.3.2)(better-call@1.4.4(zod@4.6.7))(jose@6.2.13)(kysely@0.29.7)(nanostores@1.5.5))(@better-auth/utils@0.5.0)
- '@better-auth/prisma-adapter': 1.7.12(@better-auth/core@1.7.12(@better-auth/utils@0.5.0)(@better-fetch/fetch@1.3.2)(better-call@1.4.4(zod@4.6.7))(jose@6.2.13)(kysely@0.29.7)(nanostores@1.5.5))(@better-auth/utils@0.5.0)
- '@better-auth/telemetry': 1.7.12(@better-auth/core@1.7.12(@better-auth/utils@0.5.0)(@better-fetch/fetch@1.3.2)(better-call@1.4.4(zod@4.6.7))(jose@6.2.13)(kysely@0.29.7)(nanostores@1.5.5))(@better-auth/utils@0.5.0)(@better-fetch/fetch@1.3.2)
- '@better-auth/utils': 0.5.0
- '@better-fetch/fetch': 1.3.2
+ better-auth@1.7.14(react-dom@19.3.1(react@19.3.1))(react@19.3.1)(vitest@5.0.5(@types/node@24.19.2)(jsdom@30.1.3(@noble/hashes@2.4.0))(vite@8.3.5(@types/node@24.19.2)(jiti@2.7.0)(yaml@2.9.1))):
+ dependencies:
+ '@better-auth/core': 1.7.14(@better-auth/utils@0.5.1)(@better-fetch/fetch@1.3.3)(better-call@1.4.4(zod@4.6.7))(jose@6.2.13)(kysely@0.29.7)(nanostores@1.5.5)
+ '@better-auth/drizzle-adapter': 1.7.14(@better-auth/core@1.7.14(@better-auth/utils@0.5.1)(@better-fetch/fetch@1.3.3)(better-call@1.4.4(zod@4.6.7))(jose@6.2.13)(kysely@0.29.7)(nanostores@1.5.5))(@better-auth/utils@0.5.1)
+ '@better-auth/kysely-adapter': 1.7.14(@better-auth/core@1.7.14(@better-auth/utils@0.5.1)(@better-fetch/fetch@1.3.3)(better-call@1.4.4(zod@4.6.7))(jose@6.2.13)(kysely@0.29.7)(nanostores@1.5.5))(@better-auth/utils@0.5.1)(kysely@0.29.7)
+ '@better-auth/memory-adapter': 1.7.14(@better-auth/core@1.7.14(@better-auth/utils@0.5.1)(@better-fetch/fetch@1.3.3)(better-call@1.4.4(zod@4.6.7))(jose@6.2.13)(kysely@0.29.7)(nanostores@1.5.5))(@better-auth/utils@0.5.1)
+ '@better-auth/mongo-adapter': 1.7.14(@better-auth/core@1.7.14(@better-auth/utils@0.5.1)(@better-fetch/fetch@1.3.3)(better-call@1.4.4(zod@4.6.7))(jose@6.2.13)(kysely@0.29.7)(nanostores@1.5.5))(@better-auth/utils@0.5.1)
+ '@better-auth/prisma-adapter': 1.7.14(@better-auth/core@1.7.14(@better-auth/utils@0.5.1)(@better-fetch/fetch@1.3.3)(better-call@1.4.4(zod@4.6.7))(jose@6.2.13)(kysely@0.29.7)(nanostores@1.5.5))(@better-auth/utils@0.5.1)
+ '@better-auth/telemetry': 1.7.14(@better-auth/core@1.7.14(@better-auth/utils@0.5.1)(@better-fetch/fetch@1.3.3)(better-call@1.4.4(zod@4.6.7))(jose@6.2.13)(kysely@0.29.7)(nanostores@1.5.5))(@better-auth/utils@0.5.1)(@better-fetch/fetch@1.3.3)
+ '@better-auth/utils': 0.5.1
+ '@better-fetch/fetch': 1.3.3
'@noble/ciphers': 2.4.0
'@noble/hashes': 2.4.0
better-call: 1.4.4(zod@4.6.7)
@@ -5814,8 +5740,8 @@ snapshots:
better-call@1.4.4(zod@4.6.7):
dependencies:
- '@better-auth/utils': 0.5.0
- '@better-fetch/fetch': 1.3.2
+ '@better-auth/utils': 0.5.1
+ '@better-fetch/fetch': 1.3.3
rou3: 0.9.2
set-cookie-parser: 3.2.1
optionalDependencies:
@@ -5833,7 +5759,7 @@ snapshots:
http-errors: 2.0.1
iconv-lite: 0.7.3
on-finished: 2.4.2
- qs: 6.16.1
+ qs: 6.17.0
raw-body: 3.0.2
type-is: 2.1.0
transitivePeerDependencies:
@@ -5847,13 +5773,13 @@ snapshots:
dependencies:
fill-range: 7.1.1
- browserslist@4.29.4:
+ browserslist@4.29.5:
dependencies:
- baseline-browser-mapping: 2.11.32
+ baseline-browser-mapping: 2.11.34
caniuse-lite: 1.0.30001819
- electron-to-chromium: 1.5.464
+ electron-to-chromium: 1.5.467
node-releases: 2.0.60
- update-browserslist-db: 1.3.4(browserslist@4.29.4)
+ update-browserslist-db: 1.3.4(browserslist@4.29.5)
buffer-from@1.1.2: {}
@@ -5977,8 +5903,6 @@ snapshots:
content-disposition@2.0.1: {}
- content-type@1.0.5: {}
-
content-type@2.1.0: {}
convert-source-map@2.0.0: {}
@@ -5989,11 +5913,6 @@ snapshots:
cookie@0.7.2: {}
- cors@2.8.6:
- dependencies:
- object-assign: 4.1.1
- vary: 1.1.2
-
cosmiconfig@8.3.6(typescript@6.0.3):
dependencies:
import-fresh: 3.3.1
@@ -6115,7 +6034,7 @@ snapshots:
ee-first@1.1.1: {}
- electron-to-chromium@1.5.464: {}
+ electron-to-chromium@1.5.467: {}
emoji-regex@10.6.0: {}
@@ -6164,8 +6083,8 @@ snapshots:
'@eslint-react/jsx': 5.28.8(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3)
'@eslint-react/shared': 5.28.8(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3)
'@eslint-react/var': 5.28.8(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3)
- '@typescript-eslint/types': 8.72.0
- '@typescript-eslint/utils': 8.72.0(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3)
+ '@typescript-eslint/types': 8.72.1
+ '@typescript-eslint/utils': 8.72.1(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3)
compare-versions: 6.1.1
ts-pattern: 5.9.2
typescript: 6.0.3
@@ -6192,8 +6111,8 @@ snapshots:
'@eslint-react/eslint': 5.28.8(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3)
'@eslint-react/jsx': 5.28.8(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3)
'@eslint-react/shared': 5.28.8(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3)
- '@typescript-eslint/types': 8.72.0
- '@typescript-eslint/utils': 8.72.0(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3)
+ '@typescript-eslint/types': 8.72.1
+ '@typescript-eslint/utils': 8.72.1(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3)
typescript: 6.0.3
optionalDependencies:
eslint: 10.13.0(jiti@2.7.0)
@@ -6207,8 +6126,8 @@ snapshots:
'@eslint-react/eslint': 5.28.8(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3)
'@eslint-react/shared': 5.28.8(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3)
'@eslint-react/var': 5.28.8(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3)
- '@typescript-eslint/types': 8.72.0
- '@typescript-eslint/utils': 8.72.0(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3)
+ '@typescript-eslint/types': 8.72.1
+ '@typescript-eslint/utils': 8.72.1(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3)
ts-pattern: 5.9.2
typescript: 6.0.3
optionalDependencies:
@@ -6227,8 +6146,8 @@ snapshots:
'@eslint-react/eslint': 5.28.8(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3)
'@eslint-react/shared': 5.28.8(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3)
'@eslint-react/var': 5.28.8(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3)
- '@typescript-eslint/types': 8.72.0
- '@typescript-eslint/utils': 8.72.0(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3)
+ '@typescript-eslint/types': 8.72.1
+ '@typescript-eslint/utils': 8.72.1(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3)
typescript: 6.0.3
optionalDependencies:
eslint: 10.13.0(jiti@2.7.0)
@@ -6242,8 +6161,8 @@ snapshots:
'@eslint-react/eslint': 5.28.8(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3)
'@eslint-react/shared': 5.28.8(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3)
'@eslint-react/var': 5.28.8(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3)
- '@typescript-eslint/types': 8.72.0
- '@typescript-eslint/utils': 8.72.0(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3)
+ '@typescript-eslint/types': 8.72.1
+ '@typescript-eslint/utils': 8.72.1(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3)
ts-pattern: 5.9.2
typescript: 6.0.3
optionalDependencies:
@@ -6259,10 +6178,10 @@ snapshots:
'@eslint-react/jsx': 5.28.8(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3)
'@eslint-react/shared': 5.28.8(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3)
'@eslint-react/var': 5.28.8(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3)
- '@typescript-eslint/scope-manager': 8.72.0
- '@typescript-eslint/types': 8.72.0
- '@typescript-eslint/typescript-estree': 8.72.0(typescript@6.0.3)
- '@typescript-eslint/utils': 8.72.0(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3)
+ '@typescript-eslint/scope-manager': 8.72.1
+ '@typescript-eslint/types': 8.72.1
+ '@typescript-eslint/typescript-estree': 8.72.1(typescript@6.0.3)
+ '@typescript-eslint/utils': 8.72.1(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3)
compare-versions: 6.1.1
string-ts: 2.3.1
ts-api-utils: 2.5.0(typescript@6.0.3)
@@ -6349,12 +6268,6 @@ snapshots:
eventemitter3@5.0.4: {}
- eventsource-parser@3.1.1: {}
-
- eventsource@3.0.7:
- dependencies:
- eventsource-parser: 3.1.1
-
execa@5.1.1:
dependencies:
cross-spawn: 7.0.6
@@ -6386,14 +6299,6 @@ snapshots:
expect-type@1.4.0: {}
- express-rate-limit@8.7.1(express@5.3.0):
- dependencies:
- debug: 4.4.3
- express: 5.3.0
- ip-address: 10.7.4
- transitivePeerDependencies:
- - supports-color
-
express@5.3.0:
dependencies:
accepts: 2.0.0
@@ -6416,7 +6321,7 @@ snapshots:
once: 1.4.0
parseurl: 1.3.3
proxy-addr: 2.0.8
- qs: 6.16.1
+ qs: 6.17.0
range-parser: 1.3.0
router: 2.2.0
send: 1.2.1
@@ -6427,7 +6332,7 @@ snapshots:
transitivePeerDependencies:
- supports-color
- exsolve@1.1.3: {}
+ exsolve@1.2.0: {}
fast-deep-equal@3.1.3: {}
@@ -6636,8 +6541,6 @@ snapshots:
dependencies:
hermes-estree: 0.25.1
- hono@4.13.13: {}
-
hookified@1.15.1: {}
hookified@2.2.0: {}
@@ -6666,7 +6569,7 @@ snapshots:
ignore@5.3.2: {}
- ignore@7.0.13: {}
+ ignore@7.0.14: {}
immutable@5.1.9: {}
@@ -6687,7 +6590,7 @@ snapshots:
dependencies:
loose-envify: 1.4.0
- ip-address@10.7.4: {}
+ ip-address@10.7.5: {}
ipaddr.js@1.9.1: {}
@@ -6786,7 +6689,7 @@ snapshots:
jsdom@30.1.3(@noble/hashes@2.4.0):
dependencies:
- '@asamuzakjp/css-color': 7.1.7
+ '@asamuzakjp/css-color': 7.1.9
'@asamuzakjp/dom-selector': 10.0.5
'@bramus/specificity': 2.4.3
'@csstools/css-syntax-patches-for-csstree': 1.1.15(css-tree@3.2.1)
@@ -6819,8 +6722,6 @@ snapshots:
json-schema-typed@7.0.3: {}
- json-schema-typed@8.0.2: {}
-
json-stable-stringify-without-jsonify@1.0.1: {}
json-to-pretty-yaml@1.2.2:
@@ -6998,7 +6899,7 @@ snapshots:
dependencies:
yallist: 3.1.1
- lucide-react@1.61.0(@types/react@19.3.0)(react@19.3.1):
+ lucide-react@1.63.0(@types/react@19.3.0)(react@19.3.1):
dependencies:
react: 19.3.1
optionalDependencies:
@@ -7010,7 +6911,7 @@ snapshots:
dependencies:
'@jridgewell/sourcemap-codec': 1.6.0
- magic-string@1.4.3:
+ magic-string@1.4.5:
dependencies:
'@jridgewell/sourcemap-codec': 1.6.0
@@ -7108,8 +7009,6 @@ snapshots:
path-key: 4.0.0
unicorn-magic: 0.3.0
- object-assign@4.1.1: {}
-
object-inspect@1.13.4: {}
object-treeify@1.1.33: {}
@@ -7250,12 +7149,10 @@ snapshots:
picomatch@4.0.7: {}
- pkce-challenge@5.0.1: {}
-
pkg-types@2.4.0:
dependencies:
confbox: 0.3.1
- exsolve: 1.1.3
+ exsolve: 1.2.0
pathe: 2.0.3
pkg-up@3.1.0:
@@ -7267,7 +7164,7 @@ snapshots:
cssesc: 3.0.0
util-deprecate: 1.0.2
- postcss@8.5.31:
+ postcss@8.5.32:
dependencies:
nanoid: 3.3.20
picocolors: 1.1.1
@@ -7305,7 +7202,7 @@ snapshots:
dependencies:
hookified: 2.2.0
- qs@6.16.1:
+ qs@6.17.0:
dependencies:
es-define-property: 1.0.1
side-channel: 1.1.1
@@ -7330,7 +7227,7 @@ snapshots:
react-refresh@0.18.0: {}
- react-router@8.5.0(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.1(react@19.3.1))(react@19.3.1):
+ react-router@8.5.1(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.1(react@19.3.1))(react@19.3.1):
dependencies:
'@remix-run/route-pattern': 0.22.1
cookie-es: 3.1.1
@@ -7468,17 +7365,17 @@ snapshots:
setprototypeof@1.2.0: {}
- shadcn@4.22.1:
+ shadcn@4.23.0:
dependencies:
'@babel/core': 7.29.7
'@babel/parser': 7.29.11
'@babel/plugin-transform-typescript': 7.29.9(@babel/core@7.29.7)
'@babel/preset-typescript': 7.29.7(@babel/core@7.29.7)
'@dotenvx/dotenvx': 1.75.1
- '@modelcontextprotocol/sdk': 1.32.2(zod@4.6.7)
- '@shadcn/registry': 0.2.0
+ '@modelcontextprotocol/server': 2.4.0
+ '@shadcn/registry': 0.2.1
'@types/validate-npm-package-name': 4.0.2
- browserslist: 4.29.4
+ browserslist: 4.29.5
cn: 0.2.6
commander: 14.0.3
dedent: 1.7.2
@@ -7491,7 +7388,7 @@ snapshots:
kleur: 4.1.5
open: 11.0.4
ora: 8.2.0
- postcss: 8.5.31
+ postcss: 8.5.32
postcss-selector-parser: 7.1.7
prompts: 2.4.2
recast: 0.23.21
@@ -7503,7 +7400,6 @@ snapshots:
validate-npm-package-name: 7.0.2
zod: 4.6.7
transitivePeerDependencies:
- - '@cfworker/json-schema'
- babel-plugin-macros
- supports-color
@@ -7565,7 +7461,7 @@ snapshots:
socks@2.8.10:
dependencies:
- ip-address: 10.7.4
+ ip-address: 10.7.5
smart-buffer: 4.2.0
source-map-js@1.2.2: {}
@@ -7632,7 +7528,7 @@ snapshots:
timeout-signal: 2.0.0
whatwg-mimetype: 5.0.0
- systeminformation@5.33.16: {}
+ systeminformation@5.33.18: {}
tailwindcss@4.3.3: {}
@@ -7655,11 +7551,11 @@ snapshots:
dependencies:
tslib: 2.8.1
- tldts-core@7.4.19: {}
+ tldts-core@7.4.20: {}
tldts@7.4.19:
dependencies:
- tldts-core: 7.4.19
+ tldts-core: 7.4.20
to-regex-range@5.0.1:
dependencies:
@@ -7710,12 +7606,12 @@ snapshots:
media-typer: 1.1.1
mime-types: 3.0.2
- typescript-eslint@8.72.0(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3):
+ typescript-eslint@8.72.1(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3):
dependencies:
- '@typescript-eslint/eslint-plugin': 8.72.0(@typescript-eslint/parser@8.72.0(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3))(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3)
- '@typescript-eslint/parser': 8.72.0(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3)
- '@typescript-eslint/typescript-estree': 8.72.0(typescript@6.0.3)
- '@typescript-eslint/utils': 8.72.0(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3)
+ '@typescript-eslint/eslint-plugin': 8.72.1(@typescript-eslint/parser@8.72.1(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3))(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3)
+ '@typescript-eslint/parser': 8.72.1(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3)
+ '@typescript-eslint/typescript-estree': 8.72.1(typescript@6.0.3)
+ '@typescript-eslint/utils': 8.72.1(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3)
eslint: 10.13.0(jiti@2.7.0)
typescript: 6.0.3
transitivePeerDependencies:
@@ -7741,9 +7637,9 @@ snapshots:
unpipe@1.0.0: {}
- update-browserslist-db@1.3.4(browserslist@4.29.4):
+ update-browserslist-db@1.3.4(browserslist@4.29.5):
dependencies:
- browserslist: 4.29.4
+ browserslist: 4.29.5
escalade: 3.2.0
picocolors: 1.1.1
@@ -7771,7 +7667,7 @@ snapshots:
dependencies:
lightningcss: 1.33.0
picomatch: 4.0.7
- postcss: 8.5.31
+ postcss: 8.5.32
rolldown: 1.2.15
tinyglobby: 0.2.17
optionalDependencies:
@@ -7787,7 +7683,7 @@ snapshots:
chai: 6.3.0
es-module-lexer: 2.3.2
expect-type: 1.4.0
- magic-string: 1.4.3
+ magic-string: 1.4.5
obug: 3.0.0
picomatch: 4.0.7
std-env: 4.3.0
@@ -7881,10 +7777,6 @@ snapshots:
yoctocolors@2.2.0: {}
- zod-to-json-schema@3.25.2(zod@4.6.7):
- dependencies:
- zod: 4.6.7
-
zod-validation-error@4.0.2(zod@4.6.7):
dependencies:
zod: 4.6.7
From 2d875d083fcf6f2a99d698106f395b274174da8d Mon Sep 17 00:00:00 2001
From: Martin Alexander Kaminski
Date: Wed, 4 Nov 2026 21:10:18 +0100
Subject: [PATCH 02/21] chore: update lockfile again
---
frontend/pnpm-lock.yaml | 1324 ++++++++++++++++++---------------------
1 file changed, 599 insertions(+), 725 deletions(-)
diff --git a/frontend/pnpm-lock.yaml b/frontend/pnpm-lock.yaml
index 57cb2fc..0623071 100644
--- a/frontend/pnpm-lock.yaml
+++ b/frontend/pnpm-lock.yaml
@@ -10,7 +10,7 @@ importers:
dependencies:
'@apollo/client':
specifier: ^4.3.5
- version: 4.3.5(graphql-ws@6.4.1(graphql@17.0.2)(ws@8.22.0))(graphql@17.0.2)(react-dom@19.3.1(react@19.3.1))(react@19.3.1)(rxjs@7.8.2)
+ version: 4.3.6(graphql-ws@6.4.1(graphql@17.0.2)(ws@8.22.1))(graphql@17.0.2)(react-dom@19.3.1(react@19.3.1))(react@19.3.1)(rxjs@7.8.2)
'@base-ui/react':
specifier: ^1.9.0
version: 1.9.0(@types/react@19.3.0)(react-dom@19.3.1(react@19.3.1))(react@19.3.1)
@@ -28,13 +28,13 @@ importers:
version: 8.5.1(react-router@8.5.1(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.1(react@19.3.1))(react@19.3.1))(typescript@6.0.3)
'@tailwindcss/vite':
specifier: ^4.3.3
- version: 4.3.3(vite@8.3.5(@types/node@24.19.2)(jiti@2.7.0)(yaml@2.9.1))
+ version: 4.3.4(vite@8.3.5(@types/node@24.19.2)(jiti@2.7.0)(yaml@2.9.1))
'@tanstack/react-form':
specifier: ^1.33.5
version: 1.33.5(react-dom@19.3.1(react@19.3.1))(react@19.3.1)
better-auth:
specifier: ^1.7.12
- version: 1.7.14(react-dom@19.3.1(react@19.3.1))(react@19.3.1)(vitest@5.0.5(@types/node@24.19.2)(jsdom@30.1.3(@noble/hashes@2.4.0))(vite@8.3.5(@types/node@24.19.2)(jiti@2.7.0)(yaml@2.9.1)))
+ version: 1.7.15(react-dom@19.3.1(react@19.3.1))(react@19.3.1)(vitest@5.1.0(@types/node@24.19.2)(jsdom@30.1.3(@noble/hashes@2.4.0))(vite@8.3.5(@types/node@24.19.2)(jiti@2.7.0)(yaml@2.9.1)))
class-variance-authority:
specifier: ^0.7.1
version: 0.7.1
@@ -49,7 +49,7 @@ importers:
version: 5.2.2
lucide-react:
specifier: ^1.61.0
- version: 1.63.0(@types/react@19.3.0)(react@19.3.1)
+ version: 1.67.0(@types/react@19.3.0)(react@19.3.1)
react:
specifier: ^19.3.1
version: 19.3.1
@@ -67,7 +67,7 @@ importers:
version: 4.23.0
tailwindcss:
specifier: ^4.3.3
- version: 4.3.3
+ version: 4.3.4
tw-animate-css:
specifier: ^1.4.0
version: 1.4.0
@@ -80,10 +80,10 @@ importers:
version: 7.29.7
'@eslint-react/eslint-plugin':
specifier: ^5.28.8
- version: 5.28.8(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3)
+ version: 5.28.8(eslint@10.14.0(jiti@2.7.0))(typescript@6.0.3)
'@eslint/js':
specifier: ^10.0.1
- version: 10.0.1(eslint@10.13.0(jiti@2.7.0))
+ version: 10.0.1(eslint@10.14.0(jiti@2.7.0))
'@graphql-codegen/cli':
specifier: ^7.4.6
version: 7.4.6(@types/node@24.19.2)(graphql@17.0.2)(typescript@6.0.3)
@@ -95,13 +95,13 @@ importers:
version: 8.5.1(@react-router/serve@8.5.1(react-router@8.5.1(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.1(react@19.3.1))(react@19.3.1))(typescript@6.0.3))(react-router@8.5.1(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.1(react@19.3.1))(react@19.3.1))(typescript@6.0.3)(vite@8.3.5(@types/node@24.19.2)(jiti@2.7.0)(yaml@2.9.1))
'@rolldown/plugin-babel':
specifier: ^0.2.4
- version: 0.2.4(@babel/core@7.29.7)(@babel/runtime@8.0.8)(rolldown@1.2.15)(vite@8.3.5(@types/node@24.19.2)(jiti@2.7.0)(yaml@2.9.1))
+ version: 0.2.4(@babel/core@7.29.7)(@babel/runtime@8.1.0)(rolldown@1.2.16)(vite@8.3.5(@types/node@24.19.2)(jiti@2.7.0)(yaml@2.9.1))
'@testing-library/dom':
specifier: ^10.4.2
version: 10.4.2
'@testing-library/jest-dom':
specifier: ^7.0.1
- version: 7.0.1(@testing-library/dom@10.4.2)(vitest@5.0.5(@types/node@24.19.2)(jsdom@30.1.3(@noble/hashes@2.4.0))(vite@8.3.5(@types/node@24.19.2)(jiti@2.7.0)(yaml@2.9.1)))
+ version: 7.0.1(@testing-library/dom@10.4.2)(vitest@5.1.0(@types/node@24.19.2)(jsdom@30.1.3(@noble/hashes@2.4.0))(vite@8.3.5(@types/node@24.19.2)(jiti@2.7.0)(yaml@2.9.1)))
'@testing-library/react':
specifier: ^16.3.3
version: 16.3.3(@testing-library/dom@10.4.2)(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.1(react@19.3.1))(react@19.3.1)
@@ -122,22 +122,22 @@ importers:
version: 19.3.0(@types/react@19.3.0)
'@vitejs/plugin-react':
specifier: ^6.1.2
- version: 6.1.2(@rolldown/plugin-babel@0.2.4(@babel/core@7.29.7)(@babel/runtime@8.0.8)(rolldown@1.2.15)(vite@8.3.5(@types/node@24.19.2)(jiti@2.7.0)(yaml@2.9.1)))(babel-plugin-react-compiler@1.0.0)(vite@8.3.5(@types/node@24.19.2)(jiti@2.7.0)(yaml@2.9.1))
+ version: 6.2.1(@rolldown/plugin-babel@0.2.4(@babel/core@7.29.7)(@babel/runtime@8.1.0)(rolldown@1.2.16)(vite@8.3.5(@types/node@24.19.2)(jiti@2.7.0)(yaml@2.9.1)))(babel-plugin-react-compiler@1.0.0)(vite@8.3.5(@types/node@24.19.2)(jiti@2.7.0)(yaml@2.9.1))
babel-plugin-react-compiler:
specifier: ^1.0.0
version: 1.0.0
eslint:
specifier: ^10.13.0
- version: 10.13.0(jiti@2.7.0)
+ version: 10.14.0(jiti@2.7.0)
eslint-plugin-react-hooks:
specifier: ^7.1.1
- version: 7.1.1(eslint@10.13.0(jiti@2.7.0))
+ version: 7.1.1(eslint@10.14.0(jiti@2.7.0))
eslint-plugin-react-refresh:
specifier: ^0.5.7
- version: 0.5.7(eslint@10.13.0(jiti@2.7.0))
+ version: 0.5.7(eslint@10.14.0(jiti@2.7.0))
globals:
specifier: ^17.13.0
- version: 17.13.0
+ version: 17.14.0
jsdom:
specifier: ^30.1.3
version: 30.1.3(@noble/hashes@2.4.0)
@@ -149,21 +149,21 @@ importers:
version: 6.0.3
typescript-eslint:
specifier: ^8.72.0
- version: 8.72.1(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3)
+ version: 8.72.1(eslint@10.14.0(jiti@2.7.0))(typescript@6.0.3)
vite:
specifier: ^8.3.5
version: 8.3.5(@types/node@24.19.2)(jiti@2.7.0)(yaml@2.9.1)
vitest:
specifier: ^5.0.5
- version: 5.0.5(@types/node@24.19.2)(jsdom@30.1.3(@noble/hashes@2.4.0))(vite@8.3.5(@types/node@24.19.2)(jiti@2.7.0)(yaml@2.9.1))
+ version: 5.1.0(@types/node@24.19.2)(jsdom@30.1.3(@noble/hashes@2.4.0))(vite@8.3.5(@types/node@24.19.2)(jiti@2.7.0)(yaml@2.9.1))
packages:
'@adobe/css-tools@4.5.0':
resolution: {integrity: sha512-6OzddxPio9UiWTCemp4N8cYLV2ZN1ncRnV1cVGtve7dhPOtRkleRyx32GQCYSwDYgaHU3USMm84tNsvKzRCa1Q==}
- '@apollo/client@4.3.5':
- resolution: {integrity: sha512-phA1B82EisAHIjT6irj9Lm4I5516pASExgACUl8pzcnq5eGmNjBhImDgjSRHRt18u1Hrqw0uP71jKJtEjV/Fag==}
+ '@apollo/client@4.3.6':
+ resolution: {integrity: sha512-hGpMGPur4S5KJlWakVIKo5ly7Sp0dx+2yOiVz+gIG8S+D+deZO/Xi9mhSsdMTiGF2q1rAg5nymnQUJsctEAkKg==}
peerDependencies:
graphql: ^16.0.0 || ^17.0.0
graphql-ws: ^5.5.5 || ^6.0.3
@@ -206,8 +206,8 @@ packages:
resolution: {integrity: sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA==}
engines: {node: '>=6.9.0'}
- '@babel/generator@7.29.8':
- resolution: {integrity: sha512-gZbepsdh3WDtgZKWL+vTPh71LSBrm/Y4/QDZBVCcYfmeTEEuoOYwlSy+G1StfJg+/Zy550u/3TATbm7qDbbMtg==}
+ '@babel/generator@7.29.12':
+ resolution: {integrity: sha512-2W76mhjrpQFO1lK5e8IvGYB2D0YZ7S2R1Z2BjO2ZUYuW+amcpK/z60U6ZZmzskwoa7sJ6XohP/Wg8H5KxXI/IA==}
engines: {node: '>=6.9.0'}
'@babel/helper-annotate-as-pure@7.29.7':
@@ -218,8 +218,8 @@ packages:
resolution: {integrity: sha512-wem6WaBj4NaVYVdNhLPPVacES6ZJ+KBBfSkTMD3YZxbP3rm3Di85tJU5ljaUNhaOynt+Aj0xruhYuzQBt8n71g==}
engines: {node: '>=6.9.0'}
- '@babel/helper-create-class-features-plugin@7.29.7':
- resolution: {integrity: sha512-IY3ZD9Tmooqr3TUhc3DUWxiuo8xx1DWLhd5M7hQ+ZWJamqM2BbalrBJb2MisSLoYorOj75U03qULCxQTY9r3hg==}
+ '@babel/helper-create-class-features-plugin@7.29.12':
+ resolution: {integrity: sha512-ACxGoWMV866q/QlZHeCOaQZAR5QclKsIvkAmlDemqjm6+6Bynijs1mH068BzH2N2e+wSuDmBWY87fqKfvhi1Lw==}
engines: {node: '>=6.9.0'}
peerDependencies:
'@babel/core': ^7.0.0
@@ -276,8 +276,8 @@ packages:
resolution: {integrity: sha512-EMCx3AGZ3WfAl6ht7AyQoPm2Lh+BGYEMdc4Q6Hf7uSCDOZFuLq44qNwL+iaim8VlyYhRAo4X43+weadK8ZB4Yg==}
engines: {node: '>=6.9.0'}
- '@babel/parser@7.29.11':
- resolution: {integrity: sha512-OZ6+oaK7GMyg3IfCpj8JOmn8n+w2rJbDT0LLfVDTLb1ZFeKDh3AiNELgCMUw175IJHSkLl74hG0M0VLsvx+gag==}
+ '@babel/parser@7.29.12':
+ resolution: {integrity: sha512-WJ7JBp/Q4+z/ImydtI7jS6NVco5++632ExBemSX+Ysb+G1lCwQ5BVo3SY+jGGOcZXI4ZccbZSUSJLNBW6eEpJg==}
engines: {node: '>=6.0.0'}
hasBin: true
@@ -315,15 +315,15 @@ packages:
resolution: {integrity: sha512-NpugTzbKgGrNe45Ui32cN8vCFFMxVtP/9rtfwv0nP5FRDAjvYBxJcLVpYA9mr1jxP6cnIT7x9LUzuDTbWYYNRA==}
engines: {node: '>=6.9.0'}
- '@babel/runtime@8.0.8':
- resolution: {integrity: sha512-dEu8nGlRqjsJsvviUUoSMfcRHpwomCiRlXsc2mPfJ79+ffTpDm+JtfUtTMzUrqCApHQnCsVPD3gT1ZT8RgBRCQ==}
+ '@babel/runtime@8.1.0':
+ resolution: {integrity: sha512-MQye/pU7gzXerMzlhScFNH1u4Je6rR8cqJWSgAfD+rIwbbtwG8tVDegoI7sWfcXkfVRW09G7vk2vjxGIuKFfwg==}
'@babel/template@7.29.7':
resolution: {integrity: sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg==}
engines: {node: '>=6.9.0'}
- '@babel/traverse@7.29.10':
- resolution: {integrity: sha512-B3lYAs2nkKskbgQ1nfy8Ma9ao9Q1rntTAQHrzzyDuj+TSO+X3le6PfWwqDvodsb+OumE10eMFfuMCTQSQ5iuIQ==}
+ '@babel/traverse@7.29.12':
+ resolution: {integrity: sha512-MscXe/NAZcOkYEsRajHZFt3ynsb22PUi6CTrp5U7+RYycR9By84mn9mFN54YgfITiqK4hFx3Ju3tZSyzfpS5ew==}
engines: {node: '>=6.9.0'}
'@babel/types@7.29.11':
@@ -357,8 +357,8 @@ packages:
'@types/react':
optional: true
- '@better-auth/core@1.7.14':
- resolution: {integrity: sha512-ByhdrGVwp/el+hoTYKSVOHIH23/lQj9TQ1txdGcWOg22tnfr3hJ6ukzySooeYj/R36XsQgBhkJqIp8mKsNeErA==}
+ '@better-auth/core@1.7.15':
+ resolution: {integrity: sha512-BetlCGMINY5GiQocDF9X2wD+9yWrSrAecQbcZUCDqXd2pAolPr15ZrFqYyjEXX6YKUdPPWotUmo8naE4NSyEVQ==}
peerDependencies:
'@better-auth/utils': ^0.4.2 || ^0.5.0
'@better-fetch/fetch': 1.3.3
@@ -371,46 +371,46 @@ packages:
'@opentelemetry/api':
optional: true
- '@better-auth/drizzle-adapter@1.7.14':
- resolution: {integrity: sha512-5RC8Ec5Ur15FWsS4As9/VrlRbB3+9EfShxIpA5A1FcD6IgPxFvzQNkAm2+FYx9LUSqx47NPf9hBTG2GUCMP9Ig==}
+ '@better-auth/drizzle-adapter@1.7.15':
+ resolution: {integrity: sha512-HtFz2WovzJGfmIobhqaHNdTUA5EuXtCp8YdyMxS8at70usce/LMlh4CVc9hPAXl49XuJaDi8vp5Z9Cgk9dQCUA==}
peerDependencies:
- '@better-auth/core': ^1.7.14
+ '@better-auth/core': ^1.7.15
'@better-auth/utils': ^0.4.2 || ^0.5.0
drizzle-orm: ^0.45.2 || >=1.0.0-rc.1 <2.0.0
peerDependenciesMeta:
drizzle-orm:
optional: true
- '@better-auth/kysely-adapter@1.7.14':
- resolution: {integrity: sha512-4wkqj8a8JVpWDYLlgzfbk7eOaWCFkL6HHQd6CLamFKaC8vNsXew1x4v5dE5O6dGr8j4g5qMISS+BAvOuIvBevg==}
+ '@better-auth/kysely-adapter@1.7.15':
+ resolution: {integrity: sha512-1anYpzH3A0i6W2J9EvqMAlCCVQ3NfLUKZGquJ4LfZzS8rC7iHSntpagqEvZeerZrAydtke2rMl91SSiNtKyVcQ==}
peerDependencies:
- '@better-auth/core': ^1.7.14
+ '@better-auth/core': ^1.7.15
'@better-auth/utils': ^0.4.2 || ^0.5.0
kysely: ^0.28.17 || ^0.29.0
peerDependenciesMeta:
kysely:
optional: true
- '@better-auth/memory-adapter@1.7.14':
- resolution: {integrity: sha512-Ojv9BcmFyHuTHha9ZM/NUW1ut9J84wLngta+07Es0Ejn8kekqP5aHBpZd5Z8AvADs5iJUOWvQGFmGlPWAKJgBg==}
+ '@better-auth/memory-adapter@1.7.15':
+ resolution: {integrity: sha512-lsSgxCCn94QanigQrhdXOcQ2thb3ix8zOBQZySet6Tp1dK3pb+GmQ1ZQtamYgj5itvq99fEmLr4Em24XE2BTcA==}
peerDependencies:
- '@better-auth/core': ^1.7.14
+ '@better-auth/core': ^1.7.15
'@better-auth/utils': ^0.4.2 || ^0.5.0
- '@better-auth/mongo-adapter@1.7.14':
- resolution: {integrity: sha512-6IA0RSPZFMdRwwnLZ9oWnDIiD0y0o0azTHUfa01BNU2AFJgMDkeiASUV3bKcJBskzQoyQrff74eFYTsTSeeVUQ==}
+ '@better-auth/mongo-adapter@1.7.15':
+ resolution: {integrity: sha512-Pku7yZcIuvGqsGy2cLws+7en8dLPyGmP9v0BHHtxEqtsFyc+DtLvv1AzHzNKQz5v52KlbUQ5Uflx5+Le0A1ALA==}
peerDependencies:
- '@better-auth/core': ^1.7.14
+ '@better-auth/core': ^1.7.15
'@better-auth/utils': ^0.4.2 || ^0.5.0
mongodb: ^6.0.0 || ^7.0.0
peerDependenciesMeta:
mongodb:
optional: true
- '@better-auth/prisma-adapter@1.7.14':
- resolution: {integrity: sha512-mF6t5xqeZNWzUe0ErmrSdzQmtslJscmu9X8Mp5QmROlpnnAzvSc70RILu8lHms8CePt7N34+KRH1QvYjGFrVGQ==}
+ '@better-auth/prisma-adapter@1.7.15':
+ resolution: {integrity: sha512-YMMA2HnEPFcUNw/mJWxBxoAdRV2B1ZQ8rRsBJwwTQsC6sfZVYr9f/5zslizf6J7eRpOpgqpiwumSRhdeLf1EOg==}
peerDependencies:
- '@better-auth/core': ^1.7.14
+ '@better-auth/core': ^1.7.15
'@better-auth/utils': ^0.4.2 || ^0.5.0
'@prisma/client': ^5.0.0 || ^6.0.0 || ^7.0.0
prisma: ^5.0.0 || ^6.0.0 || ^7.0.0
@@ -420,10 +420,10 @@ packages:
prisma:
optional: true
- '@better-auth/telemetry@1.7.14':
- resolution: {integrity: sha512-PtKFzsH7gje/WJuUPDjckOoNFazsq8NMt3AdiXIPzHl7tZULcNGTKAX8K7+yn0rG6cO/4mtMgpOjhtilElOnmg==}
+ '@better-auth/telemetry@1.7.15':
+ resolution: {integrity: sha512-qZq491FZNLRCFmBo97DK+wOKfKPcSMeP87BoqH1nWZc0FZi2fbS4vqmwgn9OdQU7LRjHs/757o64iao1vrvkKA==}
peerDependencies:
- '@better-auth/core': ^1.7.14
+ '@better-auth/core': ^1.7.15
'@better-auth/utils': ^0.4.2 || ^0.5.0
'@better-fetch/fetch': 1.3.3
@@ -454,8 +454,8 @@ packages:
'@csstools/css-parser-algorithms': ^4.0.2
'@csstools/css-tokenizer': ^4.0.2
- '@csstools/css-color-parser@4.2.6':
- resolution: {integrity: sha512-iiPQ3iRWwnJkeEn6RIu6SJPr7hYrLz6XZ9s/QZl+2/LI5KQVjpl2fdmDSZKuD4xP6GMmMPgHFFXg6k1Wkz0Trg==}
+ '@csstools/css-color-parser@4.2.7':
+ resolution: {integrity: sha512-zgm9yjQz5iJB4VL8RyVwd71TWB8Q89FSxt/NzXoWqPSkEBOVtn9L6vAPtSc9hpKfB0Awo/AL2VKFHjYetBLFHQ==}
engines: {node: '>=20.19.0'}
peerDependencies:
'@csstools/css-parser-algorithms': ^4.0.2
@@ -467,8 +467,8 @@ packages:
peerDependencies:
'@csstools/css-tokenizer': ^4.0.2
- '@csstools/css-syntax-patches-for-csstree@1.1.15':
- resolution: {integrity: sha512-J0u7HkVl2nzSlhsiTOp4AmwcUQ3D+mGEEKfBy/7To5/y7F2OHwyLrXfrhR0SMgr4p5Lo+eaMVSeai24zUcBIxA==}
+ '@csstools/css-syntax-patches-for-csstree@1.1.16':
+ resolution: {integrity: sha512-LsDbJPP/B8cPasUJyTA5S99F7C4G93ngW8hUluXz8CFeOaaRnBPtBiIlvgcPYU0HmHNz8CXg+1vwFrIB4F6Dgw==}
peerDependencies:
css-tree: ^3.2.1
peerDependenciesMeta:
@@ -726,8 +726,8 @@ packages:
peerDependencies:
graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0
- '@graphql-tools/batch-execute@10.3.0':
- resolution: {integrity: sha512-mj46zB15w4ZvtX4dNAOOmdq+90hKGj4zNzSWlQu23sQWEzPTA2GGO5NcGIFgd+oThsf4yqg4cK2rhH9o7LoM6Q==}
+ '@graphql-tools/batch-execute@10.3.1':
+ resolution: {integrity: sha512-DlJlKeTl1VGRZjkFkS2ADpS5G6ayTVQjDp/exmhs+1FP1iEkrM4t2WKQE1Hg6Tt0h5yi4zwWjYMNT/WFmuI1IQ==}
engines: {node: '>=20.0.0'}
peerDependencies:
graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0
@@ -738,8 +738,8 @@ packages:
peerDependencies:
graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0
- '@graphql-tools/delegate@12.3.1':
- resolution: {integrity: sha512-j3B7LjXpEhcT45zLoNmkJ/cJxbjdlWBiorkJH4TJiPDFvyeHtcqw5WZKDJ+P09Xg26D8Ewv+1GyvJpzy8a3q3A==}
+ '@graphql-tools/delegate@12.3.2':
+ resolution: {integrity: sha512-dBpoIZYwdkPct+fvdy3CWUEcgYJkRy8dYyHJTJpg+Jqmq+XYrYKDpM69/ktlao2zJw8VWL2sdv7nGb0bVw/Jgg==}
engines: {node: '>=20.0.0'}
peerDependencies:
graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0
@@ -762,8 +762,8 @@ packages:
peerDependencies:
graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0
- '@graphql-tools/executor-http@3.5.0':
- resolution: {integrity: sha512-CsiYRCUFLjkewTDoIefCeBk9+9Kw+QjjEXq+YHFi+IabaEmGvnhhdC4yqnX0wnDTNCz2+V4NyMYP9i0PbcrrGA==}
+ '@graphql-tools/executor-http@3.6.0':
+ resolution: {integrity: sha512-Z09GYFYH6Up7UGJys8XrZXgAvZKSrF/op3vhGAbdBntVOc02PahOP/RgW9fqzXBHzWcmmSpXqlxCTVCObgOvLA==}
engines: {node: '>=20.0.0'}
peerDependencies:
graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0
@@ -858,8 +858,8 @@ packages:
peerDependencies:
graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0
- '@graphql-tools/wrap@11.2.3':
- resolution: {integrity: sha512-QHhXloj6z7Z0WmPR8MYlc4/fR1DmKPeqNH7FuNchG9/D3aDjViO1gZtPuXRR5zX4Oz/fmocDfXqeO/HiMv9myA==}
+ '@graphql-tools/wrap@11.2.4':
+ resolution: {integrity: sha512-B0miEWDoH/FwEB+wGwFfsFWcBtL66ag0O+WbcV2P2ztYQvG3tgtwn9efRZ6Fu2MjvvaboMoqWL1ftuCWsYh/rA==}
engines: {node: '>=20.0.0'}
peerDependencies:
graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0
@@ -1081,8 +1081,8 @@ packages:
resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==}
engines: {node: '>= 8'}
- '@oxc-project/types@0.155.0':
- resolution: {integrity: sha512-SeE8JPwW1xs1tHeNycjUtUBdhorRa8o4jlvjwk49R7/Z291i+4DQa7JJIgOm/TaYQZx+QrPQbVJ/9c8dMIZN8Q==}
+ '@oxc-project/types@0.156.0':
+ resolution: {integrity: sha512-1Duyg48TdJNdyhEB8Xn1L36bT9Pv6GUtlKjHxOys8xkaF/rQq3XJE+bAurSK/AgIz5mGFsb77cn9Pb20+WCScw==}
'@react-router/dev@8.5.1':
resolution: {integrity: sha512-1NQ/lP8m7Kd9G4cGKPoEMZe0qcWOnRkf8QxpAcnX/3V5wJp+/mDvM9QUqwUxI+RywytNNGtc4uuDFhwt0xMLbg==}
@@ -1145,98 +1145,98 @@ packages:
'@repeaterjs/repeater@3.1.0':
resolution: {integrity: sha512-TaoVksZRSx2KWYYpyLQtMQXXeS98VsgZImzW65xmiVgbYhXLk+aEsmzPLirqVuE4/XuUapH2iMtxUzaBNDzdSQ==}
- '@rolldown/binding-android-arm-eabi@1.2.15':
- resolution: {integrity: sha512-aLcgK9gIJ3YRvrrtfSBbRa27F5WrpiTaPulnFpsHPxpUHgFlSgnU4854MHwoRGEBhfRJDWCS2WQ7lIjskE9Olw==}
+ '@rolldown/binding-android-arm-eabi@1.2.16':
+ resolution: {integrity: sha512-ia3DwAs0OsMGS7+IConptSiyk9pEXkOx/AbJ2n/lAGxH3QkWQus1t8d7gnAT38FCU2sQu8lUbeR6AiZFv4JxaA==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [arm]
os: [android]
- '@rolldown/binding-android-arm64@1.2.15':
- resolution: {integrity: sha512-xD7DdZCrbThKuxNg7ooQmvp07ys4J/pnSEMTG3/OdOWl6daC67m/Q4fL78sRHMxTH/N4fGUbYhcPM0MF5WFHkg==}
+ '@rolldown/binding-android-arm64@1.2.16':
+ resolution: {integrity: sha512-kx5wBiMB6E7TEvpl2B9gjLU004BkvEm2Dr941BFjx/SontPwSzNuQUIoVKxHHoSjpFIfHMmcguyLOtyn0hObRg==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [arm64]
os: [android]
- '@rolldown/binding-darwin-arm64@1.2.15':
- resolution: {integrity: sha512-m2WuQ6r0B4OTYxyPpNLtXaMRbRDUbG8YQV2Q3KTdSSK8Th6KHCnC8jVCJt8bvYeSB5WivkkNbc85mKadaSdOxA==}
+ '@rolldown/binding-darwin-arm64@1.2.16':
+ resolution: {integrity: sha512-qslZrXnKJU4cUpjoAmtAo/KQM9e2IRMlmpig6Zpwj+8KWxW8v+nkAf9216Bsek9lOC1jvg2yCjygCFo2f83msQ==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [arm64]
os: [darwin]
- '@rolldown/binding-darwin-x64@1.2.15':
- resolution: {integrity: sha512-5RtnsHM36nodM9WbMy+zip0LGS/G+y5wro5RHrpOlr4ac24+1zSi9kiV2MP1myZeZ/ifEHfulQcWjnAXzc2C2A==}
+ '@rolldown/binding-darwin-x64@1.2.16':
+ resolution: {integrity: sha512-FdF+y48ND13eAyM2mQn+85kvAqNlvRWROy2rhgA463X/0Gv4vGtazZtfaF1mRBLscYvtOlh4QnLjOWiFzX69OQ==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [x64]
os: [darwin]
- '@rolldown/binding-freebsd-x64@1.2.15':
- resolution: {integrity: sha512-g3l09pyFqhu+135JKkbkwiKGQmwU5hUMUPJ4VdBADvuqR8d33L6H578rh8m7rtxbdp+VmX/+nzI7nvhSZlzpUQ==}
+ '@rolldown/binding-freebsd-x64@1.2.16':
+ resolution: {integrity: sha512-ddjqFM5e95AgLbUPtKIS7V1KTVlA0RUgCVr5mn+/IEhsdy3pr+Vuj/HZ7nlMN2FyxIwUktOH1LEPIQXO1v9y1Q==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [x64]
os: [freebsd]
- '@rolldown/binding-linux-arm-gnueabihf@1.2.15':
- resolution: {integrity: sha512-nIe3VugI97nGQtspPxDqA4sXMUpeiocKIP/CqpY/u/vgbT+alX+cVxu1C/oVBPKg4feNTmYovE91v4DgXvXNwQ==}
+ '@rolldown/binding-linux-arm-gnueabihf@1.2.16':
+ resolution: {integrity: sha512-tHdKWbFkFBI687iim3LIyIvyL7j66VvQYkDPss5Stn/qyE2tWkR1YD0dXmXPFKKqT/o5ZEJVsaRsWS2meQwGOA==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [arm]
os: [linux]
- '@rolldown/binding-linux-arm64-gnu@1.2.15':
- resolution: {integrity: sha512-iTBjXx+B5QSvgI89lJfmqh4wTh8NabR1YZIIN3hNx4zSG0EVfVqkOvLulNpG4251pbd6/IAmZ/LefVk1Y4rPhw==}
+ '@rolldown/binding-linux-arm64-gnu@1.2.16':
+ resolution: {integrity: sha512-FJiLGAblPBMlBEdbOqw6kW6QcXDWAf/oJu7gYs9ZJZwmg+K+/zjFLxPTIY9izJUzxzc24FHvmseyA0IvJSl17w==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [arm64]
os: [linux]
libc: [glibc]
- '@rolldown/binding-linux-arm64-musl@1.2.15':
- resolution: {integrity: sha512-uN26XOnVR7rqQupG3V9oAG2EGGatWjcJHOeDOHUFCh4TBWmP2tHTFoVN13aYbwfm0aHqJAEmcwhAu6sooIjfqQ==}
+ '@rolldown/binding-linux-arm64-musl@1.2.16':
+ resolution: {integrity: sha512-hrJpblMsrQ58U9veWpbXzkhV5zStunds6HWLprqq1qauvgBr1E6P+24kLj6lSLI9vjRn/RYpjprhkHQPKGWpNg==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [arm64]
os: [linux]
libc: [musl]
- '@rolldown/binding-linux-ppc64-gnu@1.2.15':
- resolution: {integrity: sha512-9nWkcdd+H+XhaA3fQIwpHnKIrfx/PQ6rO0pivr78Og07tXlUlctBBJoEYLPfhTmCR/QxEVdn6uPjHV5SymPhdw==}
+ '@rolldown/binding-linux-ppc64-gnu@1.2.16':
+ resolution: {integrity: sha512-qJd/dC6j6CwLG9/s/RP2nb1RZ0GIgj7Ioj7x/SYa3RzjVrlzrmH0fhIOpfvqQDeIsdP0loi+kHaMhJzY1PBIaA==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [ppc64]
os: [linux]
libc: [glibc]
- '@rolldown/binding-linux-s390x-gnu@1.2.15':
- resolution: {integrity: sha512-Ggh0ciFjLwIusLSLz7LZYEaGdxOAUJXI+Qu5JCbhPJJHEt8vP+IjRATTJheiJsdzzTYgUiHUiw3X1Ea3ZpMBdA==}
+ '@rolldown/binding-linux-s390x-gnu@1.2.16':
+ resolution: {integrity: sha512-Vx7Xg5uUJuNcujJjI70OICaH0EYj80BtOLZTSN7uOYg8QOLlyKnaG0IW7Fn/J0IpJsaKzmDKMhOQv1JBM9m9vg==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [s390x]
os: [linux]
libc: [glibc]
- '@rolldown/binding-linux-x64-gnu@1.2.15':
- resolution: {integrity: sha512-FHg60rS6DBePAYZ9X9F67x+JObFdmgn6tupA1C/a3B+CufFmTD4mX+e8M75tCiAO3foR/6xwVBI0KQiI7sn/rw==}
+ '@rolldown/binding-linux-x64-gnu@1.2.16':
+ resolution: {integrity: sha512-TNKhgE3uJTsTzatUSSYt0Kgo+Oa2uSlSjz4r1aEIea7HX6ULBym4fAlYUhG1i6pjNf2njfCUAfKwr6C3E9Xg1w==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [x64]
os: [linux]
libc: [glibc]
- '@rolldown/binding-linux-x64-musl@1.2.15':
- resolution: {integrity: sha512-/cvV/7v5VGz/moiz0XKRj2dE8DzsKyhIu1KpOvJGPjRywg3yscON889UGvAe8zfiJLHup7VLjBduoGWi3HusWQ==}
+ '@rolldown/binding-linux-x64-musl@1.2.16':
+ resolution: {integrity: sha512-7chXdpjXZ8qG0+mIxECN3cT9kvhZ3/oZhMX6Pp876P7CDrIy8nJswva6Mq357JR7eYXfuskwZxMeV1SzoZdHrA==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [x64]
os: [linux]
libc: [musl]
- '@rolldown/binding-openharmony-arm64@1.2.15':
- resolution: {integrity: sha512-MyzC5Hrv/sm+Z7TSGKP/j8001RO2xQm1zOpCNVL4j0cY/VhBZviludA2YFQ7i4lH6ZAXxQm0lcMdBzM+99mE7w==}
+ '@rolldown/binding-openharmony-arm64@1.2.16':
+ resolution: {integrity: sha512-Kwjt+7uNTJK5/MDkGWGVO2KQPnj8yAV75dMpfwyHZrJSXWHrniOB0aUEWlVYf3H1hOqFLIStLdM5QXq6bnKmOQ==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [arm64]
os: [openharmony]
- '@rolldown/binding-win32-arm64-msvc@1.2.15':
- resolution: {integrity: sha512-+PgYiS+AH5omy6L45ZLxybasauJaj3M8buoT83D+nzPmCayXlxUV9hydhciCKVyIg0B/v0BtXPDE1uGqNwCPpg==}
+ '@rolldown/binding-win32-arm64-msvc@1.2.16':
+ resolution: {integrity: sha512-/LH6WfjDRXXJz/p5xl4TmU+jpcnwcxbKEQBW/GZE0JHfN0lGIyTtsUEGaQ/q/GikkGJ2yLKe6pwm7AnEWO8pdw==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [arm64]
os: [win32]
- '@rolldown/binding-win32-x64-msvc@1.2.15':
- resolution: {integrity: sha512-HFZd2QNQYn1JbIi+Hpd7H+r/lkWxcfIu28nirZ6eCn2LafuvmExMlb/P96Sfx5tf7pPArw39IdhmCF8vmV+NhQ==}
+ '@rolldown/binding-win32-x64-msvc@1.2.16':
+ resolution: {integrity: sha512-1lv1KvX0Z871zfk7vw+dnXMMnHNyDwMzWG8Kv3HxDXMOhzCX4SHc7HK319fInP0i+0p9D8brkfzL7pJOaGl+tw==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [x64]
os: [win32]
@@ -1275,71 +1275,70 @@ packages:
'@standard-schema/spec@1.1.0':
resolution: {integrity: sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==}
- '@tailwindcss/node@4.3.3':
- resolution: {integrity: sha512-/T8IKEsf9VTU6tLjgC7+sv2mOPtQxzE2jMw7u4Tt40Tx+QSZxpzh95/H6cMKoja9XuW7iMdLJYBB0o9G1CaAgg==}
+ '@tailwindcss/node@4.3.4':
+ resolution: {integrity: sha512-b7QK/QG04v3j04NbpG82XLCedRyulnkuwUDwRa9oK/ypnJIzMapz2Wg+0TltVczjUzDaJJHIa1+jj9aMUOFMTQ==}
- '@tailwindcss/oxide-android-arm64@4.3.3':
- resolution: {integrity: sha512-Y85A2gmPSkl5Ve5qR86GL4HT509cFqQh1aes9p3sSkyTPwt0Pppf3GkwGe4JPACcRYjgJIEhQgM6dBClnr0NYw==}
+ '@tailwindcss/oxide-android-arm64@4.3.4':
+ resolution: {integrity: sha512-qkjxt+EFocOi3mtsUS3ndlj6yj4SHubwBdvBynLnS8T4mvSzX0Enn0CpypJKmBEtczUAXOHVZKA2zTGzSNU2Sg==}
engines: {node: '>= 20'}
cpu: [arm64]
os: [android]
- '@tailwindcss/oxide-darwin-arm64@4.3.3':
- resolution: {integrity: sha512-BiaWatpBcERQFDlOjRDpIVXuFK5PJez5SA4JMg6VYZdBYU+qKfV/vqjcIs+IYmtitf1xYQZTwXvU/8y4lfZUGw==}
+ '@tailwindcss/oxide-darwin-arm64@4.3.4':
+ resolution: {integrity: sha512-i/awUA/7mJQAbA3AzCW8aQtUh5goMieUdF1zOoclLaJUCxDvsXQ8VJqpQZY3dfcHS6PJjd3tw25nNneD/mEviQ==}
engines: {node: '>= 20'}
cpu: [arm64]
os: [darwin]
- '@tailwindcss/oxide-darwin-x64@4.3.3':
- resolution: {integrity: sha512-fAeUqfV5ndhxRwai8cXGzdLvul9utWOmeTkv69unv4ZXixjn61Z+p9lCWdwOwA3TYboG3BwdVuN/RDjhBRl0mw==}
+ '@tailwindcss/oxide-darwin-x64@4.3.4':
+ resolution: {integrity: sha512-q56V9U6AnoYz/yj/alkDLhSQ9AZoXQSEl93f7WETa0+32CudbqM57BXdYXfMYPKudueXKaA+MG6L/0KRseF7Jg==}
engines: {node: '>= 20'}
cpu: [x64]
os: [darwin]
- '@tailwindcss/oxide-freebsd-x64@4.3.3':
- resolution: {integrity: sha512-iyf5bV6+wnAlflVeEy7R25dupxTNECZN5QMI0qNT6eT+EgaGdZcKhGkr5SdoaWiLJ3spLqIY9VCeSGrwmtg4kw==}
+ '@tailwindcss/oxide-freebsd-x64@4.3.4':
+ resolution: {integrity: sha512-r0W7A+Z9HTHh7bwihJl45E/zZKLjxD50/jToVF/E/RZHSl8+EWO+4yKKJpPMcUooT9hdoip3Zx1uWnbMg4N79g==}
engines: {node: '>= 20'}
cpu: [x64]
os: [freebsd]
- '@tailwindcss/oxide-linux-arm-gnueabihf@4.3.3':
- resolution: {integrity: sha512-aAYUprJAJQWWbRrPvtjdroZ56Md+JM8pMiopS6xGEwDfLhqj+2ver2p4nU4Mb3CRqcMmNBjo8KkUgcxhkzVQGQ==}
+ '@tailwindcss/oxide-linux-arm-gnueabihf@4.3.4':
+ resolution: {integrity: sha512-3aih/sRxzeYfi2Bkh+bGYNf2YU9Llamb2mpA7BNF1obYzdgEeWDAMQzK6BSwzLhs/eTdOaSur92qrGfchagUtQ==}
engines: {node: '>= 20'}
cpu: [arm]
os: [linux]
- '@tailwindcss/oxide-linux-arm64-gnu@4.3.3':
- resolution: {integrity: sha512-nDxldcEENOxZRzC2uu9jrutZdAAQtb+8WWDCSnWL1zvBk1+FN+x6MtDViPB5AJMfttVCUhehGWus3XBPgatM/w==}
+ '@tailwindcss/oxide-linux-arm64-gnu@4.3.4':
+ resolution: {integrity: sha512-ktJSrPGQou4OqL88rDEx5CkeM9BjzrwZvYo8u7B7VL1zkBa2XBm351o4MQrek95qikb2M++26Y7w7vbH6Mgl8g==}
engines: {node: '>= 20'}
cpu: [arm64]
os: [linux]
libc: [glibc]
- '@tailwindcss/oxide-linux-arm64-musl@4.3.3':
- resolution: {integrity: sha512-Md44bD6veX/PC5iyF8cDVnw4HBIANZepRZZ7a8DQOvkfo5WUBwcp6iAuCUz23u+4SUkhJlD3eL7hNdW8ezd/kA==}
+ '@tailwindcss/oxide-linux-arm64-musl@4.3.4':
+ resolution: {integrity: sha512-rt3hjUxT7utAtcB+df6wHyaXDyxhE7Zd1x7L/nvB5Jb2qBb8dZwFUoWqeRja1BaF5OlSqkKSjBmVXj9OsevmCQ==}
engines: {node: '>= 20'}
cpu: [arm64]
os: [linux]
libc: [musl]
- '@tailwindcss/oxide-linux-x64-gnu@4.3.3':
- resolution: {integrity: sha512-tx7us1muwOKAKWao2v/GaafFeQboE6aj88vC6ziN2NCGcRm8gWUhwjzg+YdVB1e4boAtdtma4L43onunI6NS4w==}
+ '@tailwindcss/oxide-linux-x64-gnu@4.3.4':
+ resolution: {integrity: sha512-XE3jO2yOOWjttpeGvpwf3/b274NMi3QapQSAI/EzsgrmYNan1Tw8dXT9JQkN7K0OgvuqiC8mcCyNvGzEkpVJPQ==}
engines: {node: '>= 20'}
cpu: [x64]
os: [linux]
libc: [glibc]
- '@tailwindcss/oxide-linux-x64-musl@4.3.3':
- resolution: {integrity: sha512-SJxX60smvHgasZoBy11dX6YRjXJFovwWBoedhbQPOBzgFWBHGB+TVPWB9BxzR7TTxU8FQZAI2AyiNCMzFm8Img==}
+ '@tailwindcss/oxide-linux-x64-musl@4.3.4':
+ resolution: {integrity: sha512-PaAZ2FjJaZk9SQLYtKIfQWiFm/xtl7pX2MKPgCzn0mS/VU54yu+vP457AJdB2XFLxU3gO2abLCt8N7Lg4EbKNg==}
engines: {node: '>= 20'}
cpu: [x64]
os: [linux]
libc: [musl]
- '@tailwindcss/oxide-wasm32-wasi@4.3.3':
- resolution: {integrity: sha512-jx1+rPhY/5Ympkktd656HBWEBLxP7dH06losBLjjf5vgCODXvi9KhtftWcMIwTFIDqBr7cRnQkdLnAG+IOlGvQ==}
- engines: {node: '>=14.0.0'}
- cpu: [wasm32]
+ '@tailwindcss/oxide-wasm32-wasi@4.3.4':
+ resolution: {integrity: sha512-bjO9WmoM687p8AoCIyw1DUqzpAs4JICLvNmIPxIWDmhw8IOsdubtWQLShyJmISnDKtRy1BBApHVOUl6sNFQQJA==}
+ engines: {node: ^20.19.0 || ^22.13.0 || >=23.5.0}
bundledDependencies:
- '@napi-rs/wasm-runtime'
- '@emnapi/core'
@@ -1348,24 +1347,24 @@ packages:
- '@emnapi/wasi-threads'
- tslib
- '@tailwindcss/oxide-win32-arm64-msvc@4.3.3':
- resolution: {integrity: sha512-3rc292Ca2ceK6Ulcc/bAVnTs/3nDtoPhyEKlgPv+yQJQi/JS/AMJlqzxvlDacL1nekbrcf6bTqp/jV4qgnPxNQ==}
+ '@tailwindcss/oxide-win32-arm64-msvc@4.3.4':
+ resolution: {integrity: sha512-jCrwCvWVtt7ruMXp6dFPd5KBNU8o1tWtEdZbTL/w/hvD3lUYZA0E2mmfvTzW4QLHIx5wGQU9HeY7997R1QTrEg==}
engines: {node: '>= 20'}
cpu: [arm64]
os: [win32]
- '@tailwindcss/oxide-win32-x64-msvc@4.3.3':
- resolution: {integrity: sha512-yJ0pwIVc/nYeGoV02WtsN8KYyLQv7kyI2wDnkezyJlGGjkd4QLwDGAwl47YpPJeuI0M0ObaXGSPjvWDPeTPggw==}
+ '@tailwindcss/oxide-win32-x64-msvc@4.3.4':
+ resolution: {integrity: sha512-cge1wcedn1FrRSXL22lF5sNDYr8c9+VImk7zFYLPs12jkDmchSrZNfzWqOKub+5Hb/aYRdDEqERGGDKONBlOzQ==}
engines: {node: '>= 20'}
cpu: [x64]
os: [win32]
- '@tailwindcss/oxide@4.3.3':
- resolution: {integrity: sha512-krXjAikiaFSPaK/FkAQT5UTx3VormQaiZ5hBFlJZ9UFQGB/rwg1MZIhHAG9smMQRTdyJxP6Qt5MwMtdyU5FWrA==}
+ '@tailwindcss/oxide@4.3.4':
+ resolution: {integrity: sha512-riqsRw2sLF7B1sNCCkTl3KYXEqvhTiABzZ/4oxxHfZ3c3Td60bCBfOrUuUGOiHagd3E7V+zG46c+XBDWZGFBcg==}
engines: {node: '>= 20'}
- '@tailwindcss/vite@4.3.3':
- resolution: {integrity: sha512-yYU8cogLeSh/ms2jh8Fj7jaba/EWa7Ja6GoUqYZaraEuCI5YS6ms6ObZgjjedm+jm6XZjdNRWBpPP6Z86oOxcw==}
+ '@tailwindcss/vite@4.3.4':
+ resolution: {integrity: sha512-wGukGWb8SVuN7+FJvSS7M5eSJWDIWwVSvUvj1q41eTIhGPsS2DAgFWjA7YURJNwjHSgty59Hz8iMUiyO+YMHBQ==}
peerDependencies:
vite: ^5.2.0 || ^6 || ^7 || ^8
@@ -1461,8 +1460,8 @@ packages:
'@types/esrecurse@4.3.1':
resolution: {integrity: sha512-xJBAbDifo5hpffDBuHl0Y8ywswbiAp/Wi7Y/GtAgSlZyIABppyurxVueOPE8LUQOxdlgi6Zqce7uoEpqNTeiUw==}
- '@types/estree@1.0.9':
- resolution: {integrity: sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==}
+ '@types/estree@1.0.10':
+ resolution: {integrity: sha512-lTyOMnOcmRBzdCv6/4zUZCrEhV0xrqQiUZBZtVcbmLHBXKLnN8q89v/wKRF/Q0HbwVsqbIG3o5HDoFl9sduM+g==}
'@types/json-schema@7.0.15':
resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==}
@@ -1543,13 +1542,13 @@ packages:
resolution: {integrity: sha512-SB8xqipSzZHUePCCLNeYxqnxq83X61/qzNhjQGbTfjxGZIeOEP7tBgWYX05Tcd6CgE02WdTJnh5b8kMZJ/+bnQ==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
- '@vitejs/plugin-react@6.1.2':
- resolution: {integrity: sha512-fhJNGUdscQa4HkI0xFxwonWyhnVReCPDbXI7FH7jmzpnVCrFQI7PRrhWecO263610vOrs9tr2Y4xcf8uAdFxbw==}
+ '@vitejs/plugin-react@6.2.1':
+ resolution: {integrity: sha512-9KyWCij3r0+qLG3Q62vBmv0VyevmYibAtxaCIVK9o0k6CXgaajZRIe8tpfchQcdZArJ5b/7OrIz4W3b2uxVRDA==}
engines: {node: ^20.19.0 || >=22.12.0}
peerDependencies:
- '@rolldown/plugin-babel': ^0.1.7 || ^0.2.0
+ '@rolldown/plugin-babel': ^0.1.7 || ^0.2.0 || ^0.3.0
babel-plugin-react-compiler: ^1.0.0
- oxc-transform-react: ^0.152.0
+ oxc-transform-react: '>=0.152.0 <0.157.0'
vite: ^8.0.0
peerDependenciesMeta:
'@rolldown/plugin-babel':
@@ -1559,8 +1558,8 @@ packages:
oxc-transform-react:
optional: true
- '@vitest/mocker@5.0.5':
- resolution: {integrity: sha512-xLL3lkDegJZw+MGoGaCCsFayDZthGgpAtr3Vziyfc4p7xH89K7KRPcRBBh/kEYm0Aqkt5DtTmkYpBtRV/FrHZg==}
+ '@vitest/mocker@5.1.0':
+ resolution: {integrity: sha512-5umB9/jlWcqVS6fsrFmv5Gdnpu6wAUio/lEOwAmvB7v+lFo/IW2B9FhAD0p19GCULTgMzLCdUmuCDCnAzWgppQ==}
peerDependencies:
msw: ^2.4.9 || ^3.0.0
vite: ^6.0.0 || ^7.0.0 || ^8.0.0
@@ -1570,8 +1569,8 @@ packages:
vite:
optional: true
- '@vitest/spy@5.0.5':
- resolution: {integrity: sha512-lwJRExuH417257Q5wv9QYugN9IMJkoxcrKrYxGPQkBzl7wlNpTUxD/5yNX4ESKVUIShKPgkGchYPFMWOOk0wzw==}
+ '@vitest/spy@5.1.0':
+ resolution: {integrity: sha512-2DPO5OMHWKrBngC+fCmTQqemNF0gidRhp3lxbBmRhW+M1XJrfgPpqNqWVevXtn2f2ufD5ZaR1B6B641aAlcX5A==}
'@whatwg-node/disposablestack@0.0.6':
resolution: {integrity: sha512-LOtTn+JgJvX8WfBVJtF08TGrdjuFzGJc4mkP8EdDI8ADbvO7kiexYep1o8dwnt0okb0jYclCDXF13xU7Ge4zSw==}
@@ -1656,8 +1655,8 @@ packages:
resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==}
engines: {node: '>=8'}
- ansi-regex@6.4.0:
- resolution: {integrity: sha512-KzTVk2tCWAHtYrvvvaP8bJKJq2pVinhLcGEQdtLIYPbmNGNyYe8QwNaTUYQp2J7/vIsUKt5QCqAfUkYyG9DkOw==}
+ ansi-regex@6.5.0:
+ resolution: {integrity: sha512-zhvbbbdt1kbw7EJ9OQoxmQcuaNR9P5kTj7e/YdmOSU10aHWbycofJxA6jKfoEy3vlLdctOF9ZHaxLtmSm998wQ==}
engines: {node: '>=12'}
ansi-styles@5.2.0:
@@ -1708,8 +1707,8 @@ packages:
resolution: {integrity: sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==}
engines: {node: 18 || 20 || >=22}
- baseline-browser-mapping@2.11.34:
- resolution: {integrity: sha512-Aqr8mA1kIvyJ3UY5YAY7ib8LSo1DmDMbMnVqGPtsKW1LxaFQFwn9Eb3yvq2fUKJsRvaXjnAV7R5osqETapzNiA==}
+ baseline-browser-mapping@2.11.35:
+ resolution: {integrity: sha512-GNk8KX52CHqeNKGk8+7tZnQab/2k1t/BgrUHPKNdijzpEhF1saPQZHVKb6m5loSAxB39gyrTYw34Qf9CQ3u1qQ==}
engines: {node: '>=6.0.0'}
hasBin: true
@@ -1717,8 +1716,8 @@ packages:
resolution: {integrity: sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==}
engines: {node: '>= 0.8'}
- better-auth@1.7.14:
- resolution: {integrity: sha512-QxDCI0pOCCHDYmruisKhKyrvOJ6Icv9xg0RA6ZUysfKFXENYwhNNpwUlkE/NmViH2nDMgkKcymmLr55pnpR9vw==}
+ better-auth@1.7.15:
+ resolution: {integrity: sha512-x2HmrQZy9yTG3H9iJ9pvaVGmLbI++ynOcJ3SGqFZnhEDscQSpG+1P9Xv41ceje2vw7dVE5+BbImDGneyhtW2Vg==}
peerDependencies:
'@lynx-js/react': '*'
'@prisma/client': ^5.0.0 || ^6.0.0 || ^7.0.0
@@ -1830,8 +1829,8 @@ packages:
resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==}
engines: {node: '>=6'}
- caniuse-lite@1.0.30001819:
- resolution: {integrity: sha512-LFUqIIAwpzsIuevnKnsR9qnStBcgzPShTX61lBwN9uFkkf8o8zLiebEjbW8AYtZiF+1YKDWfdt/pWDtMuG8Xwg==}
+ caniuse-lite@1.0.30001820:
+ resolution: {integrity: sha512-gfWD6MxqVCqAOwmODfZf7DchWvlrA+SRdNX7ceLfg3xRqe5ssjjpF7EgslC/0tiLiNTajdaNN/q8c/5u/7Gz8w==}
chai@6.3.0:
resolution: {integrity: sha512-XWAtwJ6OHO+tj0EKCs0Y2UamnyOxseZWltU4x2U2wh8g4AigdjwvtUjvLP2tqkA/avxHEtzxNaqGq/YGNwckKg==}
@@ -1841,8 +1840,8 @@ packages:
resolution: {integrity: sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==}
engines: {node: ^12.17.0 || ^14.13 || >=16.0.0}
- change-case-all@2.1.0:
- resolution: {integrity: sha512-v6b0WWWkZUMHVuYk82l+WROgkUm4qEN2w5hKRNWtEOYwWqUGoi8C6xH0l1RLF1EoWqDFK6MFclmN3od6ws3/uw==}
+ change-case-all@2.2.0:
+ resolution: {integrity: sha512-/BSm9RoX2fl1bcfZI5dHLOGPqsH0Yf5igEPs76SUGZs52EryPcNrSyJUCNcYNrH5VTThnHDmDs0vjPasNeBOLg==}
change-case@5.4.4:
resolution: {integrity: sha512-HRQyTk2/YPEkt9TnUPbOpr64Uw3KOicFWPVBb+xiHvd6eBx/qPr9xqfBFDT8P2vWsvvz4jbEkfDe71W3VyNu2w==}
@@ -1921,8 +1920,8 @@ packages:
resolution: {integrity: sha512-8fLl9F04EJqjSqH+QjITQfJF8BrOVaYr1jewVgSRAEWePfxT0sku4w2hrGQ60BC/TNLGQ2pgxNlTbWQmMPFvXg==}
engines: {node: '>=12'}
- confbox@0.3.1:
- resolution: {integrity: sha512-cKUSoKa8YxFZZSmraVi7onONx3amu77ngK3kGpsYHDH7drPwCRkQE1RYMPlLRrMtnciRj274XNRxcHxnKmDSnA==}
+ confbox@0.3.2:
+ resolution: {integrity: sha512-ZUAKhKlkCOrIGKc8cj7zek9s9z1mveHif/25nUshI2BzCRzF7KH7KHa+Lnh2ubq+e1tIlaFuP763mzW4qVoehg==}
content-disposition@2.0.1:
resolution: {integrity: sha512-e+H0ZXHSWYrENhQzw1LPuP4oF5MzVKmDU6d3hxlvaPEYLLg62MxtQNPRx4SYSuYJSBUgnQIG4HIN2tEtNv7Dog==}
@@ -2113,26 +2112,26 @@ packages:
ee-first@1.1.1:
resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==}
- electron-to-chromium@1.5.467:
- resolution: {integrity: sha512-Nw9X371rtZmYcBSnEijnCDONILjs93biCZO34juC7MBOmK8E+GFnyD4T/WvyrlJkppul7oxg6TwvtKst9SODTw==}
+ electron-to-chromium@1.5.474:
+ resolution: {integrity: sha512-t1DE2RM6wtco58TQ47NcKw0CXw4fT3gWQvj49kkNBzMrUX3m9Sq/SoKcjEfwa9vvQ6sKYlqi/g05vG2tKLWH4w==}
emoji-regex@10.6.0:
resolution: {integrity: sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==}
- encodeurl@2.0.0:
- resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==}
+ encodeurl@2.0.1:
+ resolution: {integrity: sha512-Ev/hIyePLZtpL98x562lvPtenrUfGr0lfaf44HFZ+hDEwso7ccV9QAZrEVLg0hxNAzygaAFxy2dYaAKKM0G06A==}
engines: {node: '>= 0.8'}
- enhanced-resolve@5.26.0:
- resolution: {integrity: sha512-9vhedylFonb2YGogzUKX6+Ja72gOJbN1QHAqdrvqLwhdl/QWbKopzoUC9EbQNVsAns/bx/4uyqalrQAoy1IByw==}
+ enhanced-resolve@5.26.1:
+ resolution: {integrity: sha512-PPnnSJq3azKOIewXR/uppBV/6h98dprBJ/WaQ9Qgj10xX1lJLNfg+XShpbsrSqcDSy2yYYyhfXM1wWhftqgyzw==}
engines: {node: '>=10.13.0'}
enquirer@2.4.1:
resolution: {integrity: sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==}
engines: {node: '>=8.6'}
- entities@8.1.0:
- resolution: {integrity: sha512-kxL7msIffSuh9aaFAMD7rxAIuTRMAHMeBtgHW2yUdWw732ZNh4MehkF2gdjvtdmikkaIP9bFDDJOPlsvm7avrA==}
+ entities@9.0.0:
+ resolution: {integrity: sha512-oJFNDJg3kTPwAD1cNn2+WmUq4wFoo09npc3Ydf1D7ED4smRiWrsKnaLxykrTWgyGEcusc87P5dxlAleol9kpkg==}
engines: {node: '>=20.19.0'}
env-paths@2.2.1:
@@ -2255,8 +2254,8 @@ packages:
resolution: {integrity: sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==}
engines: {node: ^20.19.0 || ^22.13.0 || >=24}
- eslint@10.13.0:
- resolution: {integrity: sha512-UohDjD4zSzEwhf58M3O7vc/ycc8O1I7dNlhtD0WxE8Px8EHNJKtUwzBqrzeGhisRuv2ag4sAYswszCJRgKXYUg==}
+ eslint@10.14.0:
+ resolution: {integrity: sha512-T0pNsxkb9IKmtQjhpK3d7nWOpFv+YHuMbTJnSVMoQblF0onvXfErrtp4V1jHtsQPan7dKaGVD0q1WCXnzMF31A==}
engines: {node: ^20.19.0 || ^22.13.0 || >=24}
hasBin: true
peerDependencies:
@@ -2460,8 +2459,8 @@ packages:
resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==}
engines: {node: '>=10.13.0'}
- globals@17.13.0:
- resolution: {integrity: sha512-RwMTC61u7hrG3ZJMkZQOK4JLJrKS8QtoTii63EmWvFXHqycY9FObBJQCbsLxSO8kjKhWE5kV1GC+Vb1g3RI0Zg==}
+ globals@17.14.0:
+ resolution: {integrity: sha512-UtdkTVyAJePQv0J2M9Xe4L0ruNSDV314XiIJsADI2Zf40bcdAonE/D/OhAU8AT99oij9mhLByb+NvA3QWZYgCg==}
engines: {node: '>=18'}
globby@11.1.0:
@@ -2588,8 +2587,8 @@ packages:
invariant@2.2.4:
resolution: {integrity: sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==}
- ip-address@10.7.5:
- resolution: {integrity: sha512-t2v0rkILYv9WXmSL7TpAaU3HXgaFYOPUcH3QHgwQ++gpJuH3bqyMy4Fvt/DJCTKwzH3Cf+bAp5W/mFL39KPLzA==}
+ ip-address@10.7.6:
+ resolution: {integrity: sha512-00LYkM6byILa9eQIx6qoaXCM40xTLd56AZ4vyaPW3YTyb49VZYPo5xsiAq4tuQ54GH4R7gVdYScJ1B7B77PuTg==}
engines: {node: '>= 12'}
ipaddr.js@1.9.1:
@@ -2725,8 +2724,8 @@ packages:
resolution: {integrity: sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ==}
hasBin: true
- jose@6.2.13:
- resolution: {integrity: sha512-7TIg10ZE1x82YediN+lcrPNvGMKge9yFHQD+Qho/b8y2adfugU3AsvvHfxV0fzyFllT6l9xCjf4RWY9g/Z9PJQ==}
+ jose@6.2.15:
+ resolution: {integrity: sha512-qdF6ewcZARtef63fJ9AKKZPgxw+t7USH6HLXYcD4CrdmSvDp79rpJSPFEKc90QBeGS63u1KQtN2MZQHC0yDIzA==}
js-tokens@4.0.0:
resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==}
@@ -2787,81 +2786,44 @@ packages:
resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==}
engines: {node: '>=6'}
- kysely@0.29.7:
- resolution: {integrity: sha512-fmIq+7kv4WbFm2tcfznRzikqB4cuNpgZ40PSU2fAJ2/OO5XhojqnTPrmgrCjYSRJVwBln03XcRXJGnw9H099IQ==}
+ kysely@0.29.8:
+ resolution: {integrity: sha512-ixHU1H4R+LeC5Y0nAhYgiGRFpFRHm2DXKEmJSs/vbes9sKXyssyzxzE/NYiOJX5fY0BL28biCre3GqlCqUwyXQ==}
engines: {node: '>=22.0.0'}
levn@0.4.1:
resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==}
engines: {node: '>= 0.8.0'}
- lightningcss-android-arm64@1.32.0:
- resolution: {integrity: sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==}
- engines: {node: '>= 12.0.0'}
- cpu: [arm64]
- os: [android]
-
lightningcss-android-arm64@1.33.0:
resolution: {integrity: sha512-gEpRTalKdosp4Bb8qWtc2iOgE5SeIHlpS1up9bFq2wAyYhl1UdTObYiHe98zEM9SQvSoqQZ1IQD0JNpg3Ml5pg==}
engines: {node: '>= 12.0.0'}
cpu: [arm64]
os: [android]
- lightningcss-darwin-arm64@1.32.0:
- resolution: {integrity: sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==}
- engines: {node: '>= 12.0.0'}
- cpu: [arm64]
- os: [darwin]
-
lightningcss-darwin-arm64@1.33.0:
resolution: {integrity: sha512-Sciaz8eenNTKn9b3t7+xr0ipTp9YxKQY4npwQ3mrRuL0BAVHBLyZxofhaKBAVtzmtRZ/zTyo0/to4B1uWG/Djg==}
engines: {node: '>= 12.0.0'}
cpu: [arm64]
os: [darwin]
- lightningcss-darwin-x64@1.32.0:
- resolution: {integrity: sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==}
- engines: {node: '>= 12.0.0'}
- cpu: [x64]
- os: [darwin]
-
lightningcss-darwin-x64@1.33.0:
resolution: {integrity: sha512-Z5UPAxzrjlWNNyGy6i65cJzzvgJ5D3T6wMvs+gWpY9d7qRhANrxqAp6LhxIgZhWEw18RfJTGcRxjuLIBr+m8XQ==}
engines: {node: '>= 12.0.0'}
cpu: [x64]
os: [darwin]
- lightningcss-freebsd-x64@1.32.0:
- resolution: {integrity: sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==}
- engines: {node: '>= 12.0.0'}
- cpu: [x64]
- os: [freebsd]
-
lightningcss-freebsd-x64@1.33.0:
resolution: {integrity: sha512-QQM/Ti/hQajJwCY+RiWuCZ9sdtI/XQk7nDK5vC8kkdwixezOlDgvDx7+RT+QjK6FcFT4MpsuoBnHIo/O3StRRg==}
engines: {node: '>= 12.0.0'}
cpu: [x64]
os: [freebsd]
- lightningcss-linux-arm-gnueabihf@1.32.0:
- resolution: {integrity: sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==}
- engines: {node: '>= 12.0.0'}
- cpu: [arm]
- os: [linux]
-
lightningcss-linux-arm-gnueabihf@1.33.0:
resolution: {integrity: sha512-N7FVBe6iS24MlM6R/4RBTxGhQheZGs7tiQ9U32UtF75NzP5Q7xWPRqLBCKxlRQRk3rY1jCIPLzx7WzOhuUIRLQ==}
engines: {node: '>= 12.0.0'}
cpu: [arm]
os: [linux]
- lightningcss-linux-arm64-gnu@1.32.0:
- resolution: {integrity: sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==}
- engines: {node: '>= 12.0.0'}
- cpu: [arm64]
- os: [linux]
- libc: [glibc]
-
lightningcss-linux-arm64-gnu@1.33.0:
resolution: {integrity: sha512-j2v/itmy4HlNxlc6voKXYgBqNi0Ng2LShg4z7GufpEgs05P+2suBVyi9I6YHq5uoVFx9ETin3eCEhLVyXGQnKg==}
engines: {node: '>= 12.0.0'}
@@ -2869,13 +2831,6 @@ packages:
os: [linux]
libc: [glibc]
- lightningcss-linux-arm64-musl@1.32.0:
- resolution: {integrity: sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==}
- engines: {node: '>= 12.0.0'}
- cpu: [arm64]
- os: [linux]
- libc: [musl]
-
lightningcss-linux-arm64-musl@1.33.0:
resolution: {integrity: sha512-yiO5ROMuYQgXbC60yjZU5CYSFZGKXL0HFATXt9mHJn1+zW55oCtMI9NfcVhYLMFDL7gV7oBPon/EmMMGg2OvtQ==}
engines: {node: '>= 12.0.0'}
@@ -2883,13 +2838,6 @@ packages:
os: [linux]
libc: [musl]
- lightningcss-linux-x64-gnu@1.32.0:
- resolution: {integrity: sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==}
- engines: {node: '>= 12.0.0'}
- cpu: [x64]
- os: [linux]
- libc: [glibc]
-
lightningcss-linux-x64-gnu@1.33.0:
resolution: {integrity: sha512-ar+Ju7LmcN0Jo4FpL4hpFybwNG9/3A/Br5KW2n2jyODg3MEZXaDYADdemoNS+BDNfMgKvylJLj4S5tyRActuAg==}
engines: {node: '>= 12.0.0'}
@@ -2897,13 +2845,6 @@ packages:
os: [linux]
libc: [glibc]
- lightningcss-linux-x64-musl@1.32.0:
- resolution: {integrity: sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==}
- engines: {node: '>= 12.0.0'}
- cpu: [x64]
- os: [linux]
- libc: [musl]
-
lightningcss-linux-x64-musl@1.33.0:
resolution: {integrity: sha512-RYiYbkokw0trfKqqzfF55lginwEPrD3OJDfTuJzFs1MK6iFnDenaz1fqLLtX4ITG3OktJQXOeTaw1awrBAlZPw==}
engines: {node: '>= 12.0.0'}
@@ -2911,34 +2852,18 @@ packages:
os: [linux]
libc: [musl]
- lightningcss-win32-arm64-msvc@1.32.0:
- resolution: {integrity: sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==}
- engines: {node: '>= 12.0.0'}
- cpu: [arm64]
- os: [win32]
-
lightningcss-win32-arm64-msvc@1.33.0:
resolution: {integrity: sha512-1K+MPfLSFVpphzpdbfkhlWk6wBrTObBzS2T6db10PNOZgR9GoVsAWzwNyuhUYYbTp23j+4RrncfujZ4uAzXvwA==}
engines: {node: '>= 12.0.0'}
cpu: [arm64]
os: [win32]
- lightningcss-win32-x64-msvc@1.32.0:
- resolution: {integrity: sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==}
- engines: {node: '>= 12.0.0'}
- cpu: [x64]
- os: [win32]
-
lightningcss-win32-x64-msvc@1.33.0:
resolution: {integrity: sha512-OlEICDx/Xl0FqSp4bry8zFnCvGpig3Gl4gCquvYwHuqJKEC1+n9NgDniFvqHGmMv1ZkqDJrDqKKSykTDX+ehuA==}
engines: {node: '>= 12.0.0'}
cpu: [x64]
os: [win32]
- lightningcss@1.32.0:
- resolution: {integrity: sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==}
- engines: {node: '>= 12.0.0'}
-
lightningcss@1.33.0:
resolution: {integrity: sha512-WkUDrojuJs0xkgGf2udWxa3yGBRxPtxUkB79i6aCZLRgc7PM8fZe9TosfPDcvEpQZbuFASnHYmRLBLUbmLOIIA==}
engines: {node: '>= 12.0.0'}
@@ -2984,8 +2909,8 @@ packages:
lru-cache@5.1.1:
resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==}
- lucide-react@1.63.0:
- resolution: {integrity: sha512-GkBfQG+FUJ41x6y3/lNXiOziVU0Rcqqq0TCzhHS8avsFXHZmOdmfBqsVTvHSaVmbI+wbdGkxHRmhYWhD3N4/yA==}
+ lucide-react@1.67.0:
+ resolution: {integrity: sha512-z7kd21YNm/Gw3E7mTnq5dTuvV+yc+OEwA//oDENSG1SbZ/NVgKdjxALJFNdGoC0Ji7HaJR2Dha9ev7VUPxy9CQ==}
peerDependencies:
'@types/react': '*'
react: ^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0
@@ -2997,9 +2922,6 @@ packages:
resolution: {integrity: sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==}
hasBin: true
- magic-string@0.30.21:
- resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==}
-
magic-string@1.4.5:
resolution: {integrity: sha512-oLLC2+YvQUfAa+vxoufE/yc1icb87M9iXIRqAoR/2EhE/8cb3SF/+Gi0c2By1B+5Vz2e2vQtUvHiu1+63Znh+w==}
@@ -3116,8 +3038,8 @@ packages:
resolution: {integrity: sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==}
engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
- node-releases@2.0.60:
- resolution: {integrity: sha512-OmO8+GM1JUZqXET720VrJCwkjUCXmCMQm0Z3UDDRbfNLHS4NEAvY60j5jiFv0tkKw2PNNlqOLhahVmwJIOLDIQ==}
+ node-releases@2.0.63:
+ resolution: {integrity: sha512-6li2QanLsAXpIH2R6j77MzRyvOyrvdTqlKtO4CgBdHGNvN99ZZfyxszHc5o5+IZBWD5u6Hzwg83JoGXmqZNG9Q==}
engines: {node: '>=18'}
normalize-path@2.1.1:
@@ -3222,8 +3144,8 @@ packages:
resolution: {integrity: sha512-TXfryirbmq34y8QBwgqCVLi+8oA3oWx2eAnSn62ITyEhEYaWRlVZ2DvMM9eZbMs/RfxPu/PK/aBLyGj4IrqMHw==}
engines: {node: '>=18'}
- parse5@8.0.1:
- resolution: {integrity: sha512-z1e/HMG90obSGeidlli3hj7cbocou0/wa5HacvI3ASx34PecNjNQeaHNo5WIZpWofN9kgkqV1q5YvXe3F0FoPw==}
+ parse5@8.1.0:
+ resolution: {integrity: sha512-sq3qBFpee5jeocbFbO48VHlGr8sT7mbXS0vxlKN6sottBtJzrOG3998sr0llSZcQAGgfpdmEYAIZE0P9z0dE8w==}
parseurl@1.3.3:
resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==}
@@ -3329,8 +3251,8 @@ packages:
resolution: {integrity: sha512-+Owyggi9IxT1ePKGafcI87ubSmxol6smwJ+RAHDQlx9+9cPwFWDiKFFCPuWhr9ignlGpZ9vDQLw67N4dcTVFEA==}
engines: {node: '>=20'}
- qs@6.17.0:
- resolution: {integrity: sha512-5LK5BZ2XDHMvcUJaf0CQ5HL3aVgKbpklvByC7qLSxYkfE8COEEbJg5xCHWCTqzqi0Gs4Jn5Mv5v3R38W6edscA==}
+ qs@6.17.1:
+ resolution: {integrity: sha512-jd3COkaKVgGUW+ZHyEHCG9bH7RoaaiWuMgzsIBjUMVjLAaWGWpoUAVwljVvBHxRu/2qEHnadLGZrkutYUBPQJA==}
engines: {node: '>=0.6'}
queue-microtask@1.2.3:
@@ -3423,8 +3345,8 @@ packages:
rfdc@1.4.1:
resolution: {integrity: sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==}
- rolldown@1.2.15:
- resolution: {integrity: sha512-6odND+fel5zVw3I4Yc2e69gvguDnX0CAAGiNDZSq4ik5WUcaLrkD2GLuog0XcODbor31hZ5ayEMgVDno+KPV5g==}
+ rolldown@1.2.16:
+ resolution: {integrity: sha512-bWvlMpFKiTfDKfnK7FC2MPgPeWCf/Kpwsq49ApdW+FQaBZb6O6dZ4MAPbPUjp7hYQrw/RobqCzn64BRrQecGHw==}
engines: {node: ^20.19.0 || >=22.12.0}
hasBin: true
@@ -3461,12 +3383,12 @@ packages:
scheduler@0.28.0:
resolution: {integrity: sha512-juorfCmIkIw8tT+p5BXSm6PJjQF/ycEYmKyzURCIt/RaZIhL+PulbQ9Yu2z1HdOJDdqDTlxA1+xKBmHXJsczAw==}
- semver@6.3.1:
- resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==}
+ semver@6.3.2:
+ resolution: {integrity: sha512-GYrCADwpu6yV5OAvchkQ27Z5wwMxWAEMg5NNWjyHh/5DboFFqbdbvYNIvZouQpxXyeMPoTOh0vdPYKlf0ZswdQ==}
hasBin: true
- semver@7.8.5:
- resolution: {integrity: sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==}
+ semver@7.8.6:
+ resolution: {integrity: sha512-9lpSSU4Mly3mrtruwLs1eLK6+gzbzqeBFwRNjIjE+9LuDpWdYctrQlQ3ej1Ilgi7gknpsTRnPoLP8DpCHqHIJw==}
engines: {node: '>=10'}
hasBin: true
@@ -3478,8 +3400,8 @@ packages:
resolution: {integrity: sha512-xRXBn0pPqQTVQiC8wyQrKs2MOlX24zQ0POGaj0kultvoOCstBQM5yvOhAVSUwOMjQtTvsPWoNCHfPGwaaQJhTw==}
engines: {node: '>= 18'}
- set-cookie-parser@3.2.1:
- resolution: {integrity: sha512-Npd1Pt+4zb3BrSZDPd2qFwRpS6b1EUEasRrO8xS0zMJi0fApXXK5YuzP0minyJnxwnFHoVoJwA55q0A0cu63gQ==}
+ set-cookie-parser@3.2.2:
+ resolution: {integrity: sha512-df017qMeYuXo4emL09nlyMpi2i2MtEIKS/6jtXH3vmjFgIRsOi852/5RmhJ4EkvN3ZF8jXadM/EkTPXgc8yPIw==}
setprototypeof@1.2.0:
resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==}
@@ -3575,8 +3497,8 @@ packages:
string-env-interpolation@1.0.1:
resolution: {integrity: sha512-78lwMoCcn0nNu8LszbP1UA7g55OeE4v7rCeWnM5B453rnNr4aq+5it3FEYtZrSEiMvHZOZ9Jlqb0OD0M2VInqg==}
- string-ts@2.3.1:
- resolution: {integrity: sha512-xSJq+BS52SaFFAVxuStmx6n5aYZU571uYUnUrPXkPFCfdHyZMMlbP2v2Wx5sNBnAVzq/2+0+mcBLBa3Xa5ubYw==}
+ string-ts@2.4.0:
+ resolution: {integrity: sha512-JOrTlmqL2wGvXZI+4RLzSAAqvhQL3rXOmSCLoacd9MC5hIj20xoa7CfYBEApBDncf+hhvbGi6atCy7LyweWRKQ==}
string-width@7.2.0:
resolution: {integrity: sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==}
@@ -3621,14 +3543,14 @@ packages:
resolution: {integrity: sha512-tTw2sPVgJb/ZO+Uz5Cs1haWg7aL0cw+DvD8mXos+ws5YaelM3IBZ50M717T1+RD5Qq0TdeZ/EI/wVMnAdJA0Eg==}
engines: {node: '>=22.12.0'}
- systeminformation@5.33.18:
- resolution: {integrity: sha512-SF8DBQx3ypa8zDqZlezpHQ6M2g7TrqSEWpAtC4OsHCdLmi7J2WdxaSbA8/DJyEn2l/CHPrW0VFenoqoDccrw6g==}
+ systeminformation@5.33.19:
+ resolution: {integrity: sha512-Zm7wGeCG7PqfvzegMJIzrxICopWqYCeLATVmvxOOci1isLcNVKgY4Fr0hhYQzvc7cgtK3377jQVChTFAnznOiA==}
engines: {node: '>=10.0.0'}
os: [darwin, linux, win32, freebsd, openbsd, netbsd, sunos, android]
hasBin: true
- tailwindcss@4.3.3:
- resolution: {integrity: sha512-gOhV3P7ufE62QDGg1zVaTgCR+EtPv92k2nIhVcVKcLmxT1sUBsQGhnZj175j+MqRt4zLF7ic+sCYjfhxMxj7YQ==}
+ tailwindcss@4.3.4:
+ resolution: {integrity: sha512-PCJZTFFdG+sL3gvnP1Do9o6GbkvH2q0p04xSs3f7cSvmAeK+sttG+/7ncK1fdRwKFfC7n+wDDJaOMBSefkI9ow==}
tapable@2.3.3:
resolution: {integrity: sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==}
@@ -3641,8 +3563,8 @@ packages:
tiny-invariant@1.3.3:
resolution: {integrity: sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==}
- tinybench@6.2.2:
- resolution: {integrity: sha512-nIZ2N2dFpjBsg2hgitKu7mA+FvsIJuGJOwysRngmVRRmWgR/UyPjwJj8c/fT/dhm8EkHnF5EOogRf+0Z2qrimA==}
+ tinybench@6.2.3:
+ resolution: {integrity: sha512-Al01C2JIBnO2CXCAPbpAl6sUiOZHeThGtHYNTa51JRw9PyWOCdr+9Ong05R4qg/Sk3+H645E8ov1h2c58ityNw==}
engines: {node: '>=20.0.0'}
tinyexec@1.3.1:
@@ -3702,6 +3624,9 @@ packages:
tslib@2.8.1:
resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==}
+ tslib@2.9.1:
+ resolution: {integrity: sha512-a4Ux9VKuIMHsOS7ENbEq6hK2ZGYIT27Rtl0E4eD9KqwxhKiQeMZE/9xb3IdYwWaSOyIBQLExhQgXDTYoiCxnWA==}
+
tw-animate-css@1.4.0:
resolution: {integrity: sha512-7bziOlRqH0hJx80h/3mbicLW7o8qLsH5+RaLR2t+OHM3D0JlWGODQKQ4cxbK7WlvmUxpcj6Kgu6EKqjrGFe3QQ==}
@@ -3839,20 +3764,20 @@ packages:
yaml:
optional: true
- vitest@5.0.5:
- resolution: {integrity: sha512-cPODOMF8YnkiiYtDdHo6n4wWmBrOBBbOIYH2d33M4l3CdNn72h+qMmO6uXffUN6A5AZFXNND/d+krS9mgkXRfg==}
+ vitest@5.1.0:
+ resolution: {integrity: sha512-MzmNFnrwa8v8lF1bLxw3UJ4EREwVOVb75VqJZmUDRjJ6EluK/x9th7qTbaeDk41WxE1GxWqmTXcdsfobfH5sOA==}
engines: {node: ^22.12.0 || ^24.0.0 || >=26.0.0}
hasBin: true
peerDependencies:
'@edge-runtime/vm': '*'
'@opentelemetry/api': ^1.9.0
'@types/node': ^22.0.0 || >=24.0.0
- '@vitest/browser-playwright': 5.0.5
- '@vitest/browser-preview': 5.0.5
+ '@vitest/browser-playwright': 5.1.0
+ '@vitest/browser-preview': 5.1.0
'@vitest/browser-webdriverio': ^5.0.0-beta.5 || >=5.0.0
- '@vitest/coverage-istanbul': 5.0.5
- '@vitest/coverage-v8': 5.0.5
- '@vitest/ui': 5.0.5
+ '@vitest/coverage-istanbul': 5.1.0
+ '@vitest/coverage-v8': 5.1.0
+ '@vitest/ui': 5.1.0
happy-dom: '*'
jsdom: '*'
vite: ^6.4.0 || ^7.0.0 || ^8.0.0
@@ -3930,8 +3855,8 @@ packages:
wrappy@1.0.2:
resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==}
- ws@8.22.0:
- resolution: {integrity: sha512-Ydggc987+RO0AnWtZ/7Wq9FtNvcrL1b/RO0ud9mWjUPgDrsAAwQSF51sm2hm1XofbU/4jkpGEsLFsZZxU+1DOg==}
+ ws@8.22.1:
+ resolution: {integrity: sha512-oyL6OPYme/CmiFvNuGzeoxCJ4nOrZE2O1FwM9MWM1AsGri6nLXB2pg+lNA8aLeXMSav0J6eIVS1j6vUPzUtK9g==}
engines: {node: '>=10.0.0'}
peerDependencies:
bufferutil: ^4.0.1
@@ -3998,7 +3923,7 @@ snapshots:
'@adobe/css-tools@4.5.0': {}
- '@apollo/client@4.3.5(graphql-ws@6.4.1(graphql@17.0.2)(ws@8.22.0))(graphql@17.0.2)(react-dom@19.3.1(react@19.3.1))(react@19.3.1)(rxjs@7.8.2)':
+ '@apollo/client@4.3.6(graphql-ws@6.4.1(graphql@17.0.2)(ws@8.22.1))(graphql@17.0.2)(react-dom@19.3.1(react@19.3.1))(react@19.3.1)(rxjs@7.8.2)':
dependencies:
'@graphql-typed-document-node/core': 3.2.0(graphql@17.0.2)
'@wry/caches': 1.0.1
@@ -4008,15 +3933,15 @@ snapshots:
graphql-tag: 2.12.7(graphql@17.0.2)
optimism: 0.18.1
rxjs: 7.8.2
- tslib: 2.8.1
+ tslib: 2.9.1
optionalDependencies:
- graphql-ws: 6.4.1(graphql@17.0.2)(ws@8.22.0)
+ graphql-ws: 6.4.1(graphql@17.0.2)(ws@8.22.1)
react: 19.3.1
react-dom: 19.3.1(react@19.3.1)
'@ardatan/relay-compiler@13.0.2(graphql@17.0.2)':
dependencies:
- '@babel/runtime': 8.0.8
+ '@babel/runtime': 8.1.0
graphql: 17.0.2
immutable: 5.1.9
invariant: 2.2.4
@@ -4024,7 +3949,7 @@ snapshots:
'@asamuzakjp/css-color@7.1.9':
dependencies:
'@csstools/css-calc': 3.4.3(@csstools/css-parser-algorithms@4.0.2(@csstools/css-tokenizer@4.0.2))(@csstools/css-tokenizer@4.0.2)
- '@csstools/css-color-parser': 4.2.6(@csstools/css-parser-algorithms@4.0.2(@csstools/css-tokenizer@4.0.2))(@csstools/css-tokenizer@4.0.2)
+ '@csstools/css-color-parser': 4.2.7(@csstools/css-parser-algorithms@4.0.2(@csstools/css-tokenizer@4.0.2))(@csstools/css-tokenizer@4.0.2)
'@csstools/css-parser-algorithms': 4.0.2(@csstools/css-tokenizer@4.0.2)
'@csstools/css-tokenizer': 4.0.2
lru-cache: 11.5.3
@@ -4047,26 +3972,26 @@ snapshots:
'@babel/core@7.29.7':
dependencies:
'@babel/code-frame': 7.29.7
- '@babel/generator': 7.29.8
+ '@babel/generator': 7.29.12
'@babel/helper-compilation-targets': 7.29.7
'@babel/helper-module-transforms': 7.29.7(@babel/core@7.29.7)
'@babel/helpers': 7.29.10
- '@babel/parser': 7.29.11
+ '@babel/parser': 7.29.12
'@babel/template': 7.29.7
- '@babel/traverse': 7.29.10
+ '@babel/traverse': 7.29.12
'@babel/types': 7.29.11
'@jridgewell/remapping': 2.3.5
convert-source-map: 2.0.0
debug: 4.4.3
gensync: 1.0.0-beta.2
json5: 2.2.3
- semver: 6.3.1
+ semver: 6.3.2
transitivePeerDependencies:
- supports-color
- '@babel/generator@7.29.8':
+ '@babel/generator@7.29.12':
dependencies:
- '@babel/parser': 7.29.11
+ '@babel/parser': 7.29.12
'@babel/types': 7.29.11
'@jridgewell/gen-mapping': 0.3.13
'@jridgewell/trace-mapping': 0.3.31
@@ -4082,9 +4007,9 @@ snapshots:
'@babel/helper-validator-option': 7.29.7
browserslist: 4.29.5
lru-cache: 5.1.1
- semver: 6.3.1
+ semver: 6.3.2
- '@babel/helper-create-class-features-plugin@7.29.7(@babel/core@7.29.7)':
+ '@babel/helper-create-class-features-plugin@7.29.12(@babel/core@7.29.7)':
dependencies:
'@babel/core': 7.29.7
'@babel/helper-annotate-as-pure': 7.29.7
@@ -4092,8 +4017,8 @@ snapshots:
'@babel/helper-optimise-call-expression': 7.29.7
'@babel/helper-replace-supers': 7.29.7(@babel/core@7.29.7)
'@babel/helper-skip-transparent-expression-wrappers': 7.29.7
- '@babel/traverse': 7.29.10
- semver: 6.3.1
+ '@babel/traverse': 7.29.12
+ semver: 6.3.2
transitivePeerDependencies:
- supports-color
@@ -4101,14 +4026,14 @@ snapshots:
'@babel/helper-member-expression-to-functions@7.29.7':
dependencies:
- '@babel/traverse': 7.29.10
+ '@babel/traverse': 7.29.12
'@babel/types': 7.29.11
transitivePeerDependencies:
- supports-color
'@babel/helper-module-imports@7.29.7':
dependencies:
- '@babel/traverse': 7.29.10
+ '@babel/traverse': 7.29.12
'@babel/types': 7.29.11
transitivePeerDependencies:
- supports-color
@@ -4118,7 +4043,7 @@ snapshots:
'@babel/core': 7.29.7
'@babel/helper-module-imports': 7.29.7
'@babel/helper-validator-identifier': 7.29.7
- '@babel/traverse': 7.29.10
+ '@babel/traverse': 7.29.12
transitivePeerDependencies:
- supports-color
@@ -4133,13 +4058,13 @@ snapshots:
'@babel/core': 7.29.7
'@babel/helper-member-expression-to-functions': 7.29.7
'@babel/helper-optimise-call-expression': 7.29.7
- '@babel/traverse': 7.29.10
+ '@babel/traverse': 7.29.12
transitivePeerDependencies:
- supports-color
'@babel/helper-skip-transparent-expression-wrappers@7.29.7':
dependencies:
- '@babel/traverse': 7.29.10
+ '@babel/traverse': 7.29.12
'@babel/types': 7.29.11
transitivePeerDependencies:
- supports-color
@@ -4155,7 +4080,7 @@ snapshots:
'@babel/template': 7.29.7
'@babel/types': 7.29.11
- '@babel/parser@7.29.11':
+ '@babel/parser@7.29.12':
dependencies:
'@babel/types': 7.29.11
@@ -4181,7 +4106,7 @@ snapshots:
dependencies:
'@babel/core': 7.29.7
'@babel/helper-annotate-as-pure': 7.29.7
- '@babel/helper-create-class-features-plugin': 7.29.7(@babel/core@7.29.7)
+ '@babel/helper-create-class-features-plugin': 7.29.12(@babel/core@7.29.7)
'@babel/helper-plugin-utils': 7.29.7
'@babel/helper-skip-transparent-expression-wrappers': 7.29.7
'@babel/plugin-syntax-typescript': 7.29.7(@babel/core@7.29.7)
@@ -4201,20 +4126,20 @@ snapshots:
'@babel/runtime@7.29.10': {}
- '@babel/runtime@8.0.8': {}
+ '@babel/runtime@8.1.0': {}
'@babel/template@7.29.7':
dependencies:
'@babel/code-frame': 7.29.7
- '@babel/parser': 7.29.11
+ '@babel/parser': 7.29.12
'@babel/types': 7.29.11
- '@babel/traverse@7.29.10':
+ '@babel/traverse@7.29.12':
dependencies:
'@babel/code-frame': 7.29.7
- '@babel/generator': 7.29.8
+ '@babel/generator': 7.29.12
'@babel/helper-globals': 7.29.7
- '@babel/parser': 7.29.11
+ '@babel/parser': 7.29.12
'@babel/template': 7.29.7
'@babel/types': 7.29.11
debug: 4.4.3
@@ -4228,7 +4153,7 @@ snapshots:
'@base-ui/react@1.9.0(@types/react@19.3.0)(react-dom@19.3.1(react@19.3.1))(react@19.3.1)':
dependencies:
- '@babel/runtime': 8.0.8
+ '@babel/runtime': 8.1.0
'@base-ui/utils': 0.5.0(@types/react@19.3.0)(react-dom@19.3.1(react@19.3.1))(react@19.3.1)
'@floating-ui/react-dom': 2.1.9(react-dom@19.3.1(react@19.3.1))(react@19.3.1)
'@floating-ui/utils': 0.2.12
@@ -4240,7 +4165,7 @@ snapshots:
'@base-ui/utils@0.5.0(@types/react@19.3.0)(react-dom@19.3.1(react@19.3.1))(react@19.3.1)':
dependencies:
- '@babel/runtime': 8.0.8
+ '@babel/runtime': 8.1.0
'@floating-ui/utils': 0.2.12
react: 19.3.1
react-dom: 19.3.1(react@19.3.1)
@@ -4249,47 +4174,47 @@ snapshots:
optionalDependencies:
'@types/react': 19.3.0
- '@better-auth/core@1.7.14(@better-auth/utils@0.5.1)(@better-fetch/fetch@1.3.3)(better-call@1.4.4(zod@4.6.7))(jose@6.2.13)(kysely@0.29.7)(nanostores@1.5.5)':
+ '@better-auth/core@1.7.15(@better-auth/utils@0.5.1)(@better-fetch/fetch@1.3.3)(better-call@1.4.4(zod@4.6.7))(jose@6.2.15)(kysely@0.29.8)(nanostores@1.5.5)':
dependencies:
'@better-auth/utils': 0.5.1
'@better-fetch/fetch': 1.3.3
'@standard-schema/spec': 1.1.0
better-call: 1.4.4(zod@4.6.7)
- jose: 6.2.13
- kysely: 0.29.7
+ jose: 6.2.15
+ kysely: 0.29.8
nanostores: 1.5.5
zod: 4.6.7
- '@better-auth/drizzle-adapter@1.7.14(@better-auth/core@1.7.14(@better-auth/utils@0.5.1)(@better-fetch/fetch@1.3.3)(better-call@1.4.4(zod@4.6.7))(jose@6.2.13)(kysely@0.29.7)(nanostores@1.5.5))(@better-auth/utils@0.5.1)':
+ '@better-auth/drizzle-adapter@1.7.15(@better-auth/core@1.7.15(@better-auth/utils@0.5.1)(@better-fetch/fetch@1.3.3)(better-call@1.4.4(zod@4.6.7))(jose@6.2.15)(kysely@0.29.8)(nanostores@1.5.5))(@better-auth/utils@0.5.1)':
dependencies:
- '@better-auth/core': 1.7.14(@better-auth/utils@0.5.1)(@better-fetch/fetch@1.3.3)(better-call@1.4.4(zod@4.6.7))(jose@6.2.13)(kysely@0.29.7)(nanostores@1.5.5)
+ '@better-auth/core': 1.7.15(@better-auth/utils@0.5.1)(@better-fetch/fetch@1.3.3)(better-call@1.4.4(zod@4.6.7))(jose@6.2.15)(kysely@0.29.8)(nanostores@1.5.5)
'@better-auth/utils': 0.5.1
- '@better-auth/kysely-adapter@1.7.14(@better-auth/core@1.7.14(@better-auth/utils@0.5.1)(@better-fetch/fetch@1.3.3)(better-call@1.4.4(zod@4.6.7))(jose@6.2.13)(kysely@0.29.7)(nanostores@1.5.5))(@better-auth/utils@0.5.1)(kysely@0.29.7)':
+ '@better-auth/kysely-adapter@1.7.15(@better-auth/core@1.7.15(@better-auth/utils@0.5.1)(@better-fetch/fetch@1.3.3)(better-call@1.4.4(zod@4.6.7))(jose@6.2.15)(kysely@0.29.8)(nanostores@1.5.5))(@better-auth/utils@0.5.1)(kysely@0.29.8)':
dependencies:
- '@better-auth/core': 1.7.14(@better-auth/utils@0.5.1)(@better-fetch/fetch@1.3.3)(better-call@1.4.4(zod@4.6.7))(jose@6.2.13)(kysely@0.29.7)(nanostores@1.5.5)
+ '@better-auth/core': 1.7.15(@better-auth/utils@0.5.1)(@better-fetch/fetch@1.3.3)(better-call@1.4.4(zod@4.6.7))(jose@6.2.15)(kysely@0.29.8)(nanostores@1.5.5)
'@better-auth/utils': 0.5.1
optionalDependencies:
- kysely: 0.29.7
+ kysely: 0.29.8
- '@better-auth/memory-adapter@1.7.14(@better-auth/core@1.7.14(@better-auth/utils@0.5.1)(@better-fetch/fetch@1.3.3)(better-call@1.4.4(zod@4.6.7))(jose@6.2.13)(kysely@0.29.7)(nanostores@1.5.5))(@better-auth/utils@0.5.1)':
+ '@better-auth/memory-adapter@1.7.15(@better-auth/core@1.7.15(@better-auth/utils@0.5.1)(@better-fetch/fetch@1.3.3)(better-call@1.4.4(zod@4.6.7))(jose@6.2.15)(kysely@0.29.8)(nanostores@1.5.5))(@better-auth/utils@0.5.1)':
dependencies:
- '@better-auth/core': 1.7.14(@better-auth/utils@0.5.1)(@better-fetch/fetch@1.3.3)(better-call@1.4.4(zod@4.6.7))(jose@6.2.13)(kysely@0.29.7)(nanostores@1.5.5)
+ '@better-auth/core': 1.7.15(@better-auth/utils@0.5.1)(@better-fetch/fetch@1.3.3)(better-call@1.4.4(zod@4.6.7))(jose@6.2.15)(kysely@0.29.8)(nanostores@1.5.5)
'@better-auth/utils': 0.5.1
- '@better-auth/mongo-adapter@1.7.14(@better-auth/core@1.7.14(@better-auth/utils@0.5.1)(@better-fetch/fetch@1.3.3)(better-call@1.4.4(zod@4.6.7))(jose@6.2.13)(kysely@0.29.7)(nanostores@1.5.5))(@better-auth/utils@0.5.1)':
+ '@better-auth/mongo-adapter@1.7.15(@better-auth/core@1.7.15(@better-auth/utils@0.5.1)(@better-fetch/fetch@1.3.3)(better-call@1.4.4(zod@4.6.7))(jose@6.2.15)(kysely@0.29.8)(nanostores@1.5.5))(@better-auth/utils@0.5.1)':
dependencies:
- '@better-auth/core': 1.7.14(@better-auth/utils@0.5.1)(@better-fetch/fetch@1.3.3)(better-call@1.4.4(zod@4.6.7))(jose@6.2.13)(kysely@0.29.7)(nanostores@1.5.5)
+ '@better-auth/core': 1.7.15(@better-auth/utils@0.5.1)(@better-fetch/fetch@1.3.3)(better-call@1.4.4(zod@4.6.7))(jose@6.2.15)(kysely@0.29.8)(nanostores@1.5.5)
'@better-auth/utils': 0.5.1
- '@better-auth/prisma-adapter@1.7.14(@better-auth/core@1.7.14(@better-auth/utils@0.5.1)(@better-fetch/fetch@1.3.3)(better-call@1.4.4(zod@4.6.7))(jose@6.2.13)(kysely@0.29.7)(nanostores@1.5.5))(@better-auth/utils@0.5.1)':
+ '@better-auth/prisma-adapter@1.7.15(@better-auth/core@1.7.15(@better-auth/utils@0.5.1)(@better-fetch/fetch@1.3.3)(better-call@1.4.4(zod@4.6.7))(jose@6.2.15)(kysely@0.29.8)(nanostores@1.5.5))(@better-auth/utils@0.5.1)':
dependencies:
- '@better-auth/core': 1.7.14(@better-auth/utils@0.5.1)(@better-fetch/fetch@1.3.3)(better-call@1.4.4(zod@4.6.7))(jose@6.2.13)(kysely@0.29.7)(nanostores@1.5.5)
+ '@better-auth/core': 1.7.15(@better-auth/utils@0.5.1)(@better-fetch/fetch@1.3.3)(better-call@1.4.4(zod@4.6.7))(jose@6.2.15)(kysely@0.29.8)(nanostores@1.5.5)
'@better-auth/utils': 0.5.1
- '@better-auth/telemetry@1.7.14(@better-auth/core@1.7.14(@better-auth/utils@0.5.1)(@better-fetch/fetch@1.3.3)(better-call@1.4.4(zod@4.6.7))(jose@6.2.13)(kysely@0.29.7)(nanostores@1.5.5))(@better-auth/utils@0.5.1)(@better-fetch/fetch@1.3.3)':
+ '@better-auth/telemetry@1.7.15(@better-auth/core@1.7.15(@better-auth/utils@0.5.1)(@better-fetch/fetch@1.3.3)(better-call@1.4.4(zod@4.6.7))(jose@6.2.15)(kysely@0.29.8)(nanostores@1.5.5))(@better-auth/utils@0.5.1)(@better-fetch/fetch@1.3.3)':
dependencies:
- '@better-auth/core': 1.7.14(@better-auth/utils@0.5.1)(@better-fetch/fetch@1.3.3)(better-call@1.4.4(zod@4.6.7))(jose@6.2.13)(kysely@0.29.7)(nanostores@1.5.5)
+ '@better-auth/core': 1.7.15(@better-auth/utils@0.5.1)(@better-fetch/fetch@1.3.3)(better-call@1.4.4(zod@4.6.7))(jose@6.2.15)(kysely@0.29.8)(nanostores@1.5.5)
'@better-auth/utils': 0.5.1
'@better-fetch/fetch': 1.3.3
@@ -4322,7 +4247,7 @@ snapshots:
'@csstools/css-parser-algorithms': 4.0.2(@csstools/css-tokenizer@4.0.2)
'@csstools/css-tokenizer': 4.0.2
- '@csstools/css-color-parser@4.2.6(@csstools/css-parser-algorithms@4.0.2(@csstools/css-tokenizer@4.0.2))(@csstools/css-tokenizer@4.0.2)':
+ '@csstools/css-color-parser@4.2.7(@csstools/css-parser-algorithms@4.0.2(@csstools/css-tokenizer@4.0.2))(@csstools/css-tokenizer@4.0.2)':
dependencies:
'@csstools/color-helpers': 6.1.2
'@csstools/css-calc': 3.4.3(@csstools/css-parser-algorithms@4.0.2(@csstools/css-tokenizer@4.0.2))(@csstools/css-tokenizer@4.0.2)
@@ -4333,7 +4258,7 @@ snapshots:
dependencies:
'@csstools/css-tokenizer': 4.0.2
- '@csstools/css-syntax-patches-for-csstree@1.1.15(css-tree@3.2.1)':
+ '@csstools/css-syntax-patches-for-csstree@1.1.16(css-tree@3.2.1)':
optionalDependencies:
css-tree: 3.2.1
@@ -4353,7 +4278,7 @@ snapshots:
object-treeify: 1.1.33
open: 8.4.2
picomatch: 4.0.7
- systeminformation: 5.33.18
+ systeminformation: 5.33.19
undici: 7.30.1
which: 4.0.0
yocto-spinner: 1.2.2
@@ -4365,113 +4290,113 @@ snapshots:
'@envelop/instrumentation': 1.0.1
'@envelop/types': 5.2.2
'@whatwg-node/promise-helpers': 1.3.2
- tslib: 2.8.1
+ tslib: 2.9.1
'@envelop/instrumentation@1.0.1':
dependencies:
'@whatwg-node/promise-helpers': 1.3.2
- tslib: 2.8.1
+ tslib: 2.9.1
'@envelop/types@5.2.2':
dependencies:
'@whatwg-node/promise-helpers': 1.3.2
- tslib: 2.8.1
+ tslib: 2.9.1
- '@eslint-community/eslint-utils@4.10.1(eslint@10.13.0(jiti@2.7.0))':
+ '@eslint-community/eslint-utils@4.10.1(eslint@10.14.0(jiti@2.7.0))':
dependencies:
- eslint: 10.13.0(jiti@2.7.0)
+ eslint: 10.14.0(jiti@2.7.0)
eslint-visitor-keys: 3.4.3
'@eslint-community/regexpp@4.12.2': {}
- '@eslint-react/ast@5.28.8(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3)':
+ '@eslint-react/ast@5.28.8(eslint@10.14.0(jiti@2.7.0))(typescript@6.0.3)':
dependencies:
'@typescript-eslint/types': 8.72.1
'@typescript-eslint/typescript-estree': 8.72.1(typescript@6.0.3)
- '@typescript-eslint/utils': 8.72.1(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3)
+ '@typescript-eslint/utils': 8.72.1(eslint@10.14.0(jiti@2.7.0))(typescript@6.0.3)
typescript: 6.0.3
optionalDependencies:
- eslint: 10.13.0(jiti@2.7.0)
+ eslint: 10.14.0(jiti@2.7.0)
transitivePeerDependencies:
- supports-color
- '@eslint-react/core@5.28.8(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3)':
+ '@eslint-react/core@5.28.8(eslint@10.14.0(jiti@2.7.0))(typescript@6.0.3)':
dependencies:
- '@eslint-react/ast': 5.28.8(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3)
- '@eslint-react/eslint': 5.28.8(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3)
- '@eslint-react/shared': 5.28.8(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3)
- '@eslint-react/var': 5.28.8(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3)
+ '@eslint-react/ast': 5.28.8(eslint@10.14.0(jiti@2.7.0))(typescript@6.0.3)
+ '@eslint-react/eslint': 5.28.8(eslint@10.14.0(jiti@2.7.0))(typescript@6.0.3)
+ '@eslint-react/shared': 5.28.8(eslint@10.14.0(jiti@2.7.0))(typescript@6.0.3)
+ '@eslint-react/var': 5.28.8(eslint@10.14.0(jiti@2.7.0))(typescript@6.0.3)
'@typescript-eslint/types': 8.72.1
- '@typescript-eslint/utils': 8.72.1(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3)
+ '@typescript-eslint/utils': 8.72.1(eslint@10.14.0(jiti@2.7.0))(typescript@6.0.3)
ts-pattern: 5.9.2
typescript: 6.0.3
optionalDependencies:
- eslint: 10.13.0(jiti@2.7.0)
+ eslint: 10.14.0(jiti@2.7.0)
transitivePeerDependencies:
- supports-color
- '@eslint-react/eslint-plugin@5.28.8(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3)':
+ '@eslint-react/eslint-plugin@5.28.8(eslint@10.14.0(jiti@2.7.0))(typescript@6.0.3)':
dependencies:
- '@eslint-react/shared': 5.28.8(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3)
- eslint-plugin-react-dom: 5.28.8(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3)
- eslint-plugin-react-jsx: 5.28.8(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3)
- eslint-plugin-react-naming-convention: 5.28.8(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3)
- eslint-plugin-react-rsc: 5.28.8(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3)
- eslint-plugin-react-web-api: 5.28.8(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3)
- eslint-plugin-react-x: 5.28.8(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3)
+ '@eslint-react/shared': 5.28.8(eslint@10.14.0(jiti@2.7.0))(typescript@6.0.3)
+ eslint-plugin-react-dom: 5.28.8(eslint@10.14.0(jiti@2.7.0))(typescript@6.0.3)
+ eslint-plugin-react-jsx: 5.28.8(eslint@10.14.0(jiti@2.7.0))(typescript@6.0.3)
+ eslint-plugin-react-naming-convention: 5.28.8(eslint@10.14.0(jiti@2.7.0))(typescript@6.0.3)
+ eslint-plugin-react-rsc: 5.28.8(eslint@10.14.0(jiti@2.7.0))(typescript@6.0.3)
+ eslint-plugin-react-web-api: 5.28.8(eslint@10.14.0(jiti@2.7.0))(typescript@6.0.3)
+ eslint-plugin-react-x: 5.28.8(eslint@10.14.0(jiti@2.7.0))(typescript@6.0.3)
typescript: 6.0.3
optionalDependencies:
- eslint: 10.13.0(jiti@2.7.0)
+ eslint: 10.14.0(jiti@2.7.0)
transitivePeerDependencies:
- supports-color
- '@eslint-react/eslint@5.28.8(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3)':
+ '@eslint-react/eslint@5.28.8(eslint@10.14.0(jiti@2.7.0))(typescript@6.0.3)':
dependencies:
'@typescript-eslint/types': 8.72.1
- '@typescript-eslint/utils': 8.72.1(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3)
+ '@typescript-eslint/utils': 8.72.1(eslint@10.14.0(jiti@2.7.0))(typescript@6.0.3)
typescript: 6.0.3
optionalDependencies:
- eslint: 10.13.0(jiti@2.7.0)
+ eslint: 10.14.0(jiti@2.7.0)
transitivePeerDependencies:
- supports-color
- '@eslint-react/jsx@5.28.8(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3)':
+ '@eslint-react/jsx@5.28.8(eslint@10.14.0(jiti@2.7.0))(typescript@6.0.3)':
dependencies:
- '@eslint-react/ast': 5.28.8(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3)
- '@eslint-react/eslint': 5.28.8(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3)
- '@eslint-react/var': 5.28.8(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3)
+ '@eslint-react/ast': 5.28.8(eslint@10.14.0(jiti@2.7.0))(typescript@6.0.3)
+ '@eslint-react/eslint': 5.28.8(eslint@10.14.0(jiti@2.7.0))(typescript@6.0.3)
+ '@eslint-react/var': 5.28.8(eslint@10.14.0(jiti@2.7.0))(typescript@6.0.3)
'@typescript-eslint/types': 8.72.1
- '@typescript-eslint/utils': 8.72.1(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3)
+ '@typescript-eslint/utils': 8.72.1(eslint@10.14.0(jiti@2.7.0))(typescript@6.0.3)
ts-pattern: 5.9.2
typescript: 6.0.3
optionalDependencies:
- eslint: 10.13.0(jiti@2.7.0)
+ eslint: 10.14.0(jiti@2.7.0)
transitivePeerDependencies:
- supports-color
- '@eslint-react/shared@5.28.8(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3)':
+ '@eslint-react/shared@5.28.8(eslint@10.14.0(jiti@2.7.0))(typescript@6.0.3)':
dependencies:
- '@eslint-react/eslint': 5.28.8(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3)
- '@typescript-eslint/utils': 8.72.1(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3)
+ '@eslint-react/eslint': 5.28.8(eslint@10.14.0(jiti@2.7.0))(typescript@6.0.3)
+ '@typescript-eslint/utils': 8.72.1(eslint@10.14.0(jiti@2.7.0))(typescript@6.0.3)
ts-pattern: 5.9.2
typescript: 6.0.3
zod: 4.6.7
optionalDependencies:
- eslint: 10.13.0(jiti@2.7.0)
+ eslint: 10.14.0(jiti@2.7.0)
transitivePeerDependencies:
- supports-color
- '@eslint-react/var@5.28.8(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3)':
+ '@eslint-react/var@5.28.8(eslint@10.14.0(jiti@2.7.0))(typescript@6.0.3)':
dependencies:
- '@eslint-react/ast': 5.28.8(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3)
- '@eslint-react/eslint': 5.28.8(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3)
+ '@eslint-react/ast': 5.28.8(eslint@10.14.0(jiti@2.7.0))(typescript@6.0.3)
+ '@eslint-react/eslint': 5.28.8(eslint@10.14.0(jiti@2.7.0))(typescript@6.0.3)
'@typescript-eslint/scope-manager': 8.72.1
'@typescript-eslint/types': 8.72.1
- '@typescript-eslint/utils': 8.72.1(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3)
+ '@typescript-eslint/utils': 8.72.1(eslint@10.14.0(jiti@2.7.0))(typescript@6.0.3)
ts-pattern: 5.9.2
typescript: 6.0.3
optionalDependencies:
- eslint: 10.13.0(jiti@2.7.0)
+ eslint: 10.14.0(jiti@2.7.0)
transitivePeerDependencies:
- supports-color
@@ -4491,9 +4416,9 @@ snapshots:
dependencies:
'@types/json-schema': 7.0.15
- '@eslint/js@10.0.1(eslint@10.13.0(jiti@2.7.0))':
+ '@eslint/js@10.0.1(eslint@10.14.0(jiti@2.7.0))':
optionalDependencies:
- eslint: 10.13.0(jiti@2.7.0)
+ eslint: 10.14.0(jiti@2.7.0)
'@eslint/object-schema@3.0.5': {}
@@ -4531,11 +4456,11 @@ snapshots:
dependencies:
'@graphql-codegen/plugin-helpers': 7.4.2(graphql@17.0.2)
graphql: 17.0.2
- tslib: 2.8.1
+ tslib: 2.9.1
'@graphql-codegen/cli@7.4.6(@types/node@24.19.2)(graphql@17.0.2)(typescript@6.0.3)':
dependencies:
- '@babel/generator': 7.29.8
+ '@babel/generator': 7.29.12
'@babel/template': 7.29.7
'@babel/types': 7.29.11
'@graphql-codegen/client-preset': 6.2.3(graphql@17.0.2)
@@ -4568,7 +4493,7 @@ snapshots:
shell-quote: 1.12.0
string-env-interpolation: 1.0.1
ts-log: 3.0.3
- tslib: 2.8.1
+ tslib: 2.9.1
yaml: 2.9.1
yargs: 18.2.0
transitivePeerDependencies:
@@ -4597,7 +4522,7 @@ snapshots:
'@graphql-tools/utils': 12.1.0(graphql@17.0.2)
'@graphql-typed-document-node/core': 3.2.0(graphql@17.0.2)
graphql: 17.0.2
- tslib: 2.8.1
+ tslib: 2.9.1
'@graphql-codegen/core@6.2.2(graphql@17.0.2)':
dependencies:
@@ -4605,7 +4530,7 @@ snapshots:
'@graphql-tools/schema': 10.1.5(graphql@17.0.2)
'@graphql-tools/utils': 12.1.0(graphql@17.0.2)
graphql: 17.0.2
- tslib: 2.8.1
+ tslib: 2.9.1
'@graphql-codegen/gql-tag-operations@6.1.1(graphql@17.0.2)':
dependencies:
@@ -4614,32 +4539,32 @@ snapshots:
'@graphql-tools/utils': 12.1.0(graphql@17.0.2)
auto-bind: 5.0.1
graphql: 17.0.2
- tslib: 2.8.1
+ tslib: 2.9.1
'@graphql-codegen/plugin-helpers@7.4.2(graphql@17.0.2)':
dependencies:
'@graphql-tools/utils': 12.1.0(graphql@17.0.2)
- change-case-all: 2.1.0
+ change-case-all: 2.2.0
common-tags: 1.8.2
graphql: 17.0.2
import-from: 4.0.0
- tslib: 2.8.1
+ tslib: 2.9.1
'@graphql-codegen/schema-ast@6.1.1(graphql@17.0.2)':
dependencies:
'@graphql-codegen/plugin-helpers': 7.4.2(graphql@17.0.2)
'@graphql-tools/utils': 12.1.0(graphql@17.0.2)
graphql: 17.0.2
- tslib: 2.8.1
+ tslib: 2.9.1
'@graphql-codegen/typed-document-node@7.2.0(graphql@17.0.2)':
dependencies:
'@graphql-codegen/plugin-helpers': 7.4.2(graphql@17.0.2)
'@graphql-codegen/visitor-plugin-common': 7.5.0(graphql@17.0.2)
auto-bind: 5.0.1
- change-case-all: 2.1.0
+ change-case-all: 2.2.0
graphql: 17.0.2
- tslib: 2.8.1
+ tslib: 2.9.1
'@graphql-codegen/typescript-operations@6.2.0(graphql@17.0.2)':
dependencies:
@@ -4648,7 +4573,7 @@ snapshots:
'@graphql-codegen/visitor-plugin-common': 7.5.0(graphql@17.0.2)
auto-bind: 5.0.1
graphql: 17.0.2
- tslib: 2.8.1
+ tslib: 2.9.1
'@graphql-codegen/typescript@6.1.2(graphql@17.0.2)':
dependencies:
@@ -4666,12 +4591,12 @@ snapshots:
'@graphql-tools/relay-operation-optimizer': 7.1.14(graphql@17.0.2)
'@graphql-tools/utils': 12.1.0(graphql@17.0.2)
auto-bind: 5.0.1
- change-case-all: 2.1.0
+ change-case-all: 2.2.0
dependency-graph: 1.0.0
graphql: 17.0.2
graphql-tag: 2.12.7(graphql@17.0.2)
parse-filepath: 1.0.2
- tslib: 2.8.1
+ tslib: 2.9.1
'@graphql-hive/signal@2.1.0': {}
@@ -4681,16 +4606,16 @@ snapshots:
'@whatwg-node/fetch': 0.12.1
graphql: 17.0.2
sync-fetch: 0.7.1
- tslib: 2.8.1
+ tslib: 2.9.1
- '@graphql-tools/batch-execute@10.3.0(graphql@17.0.2)':
+ '@graphql-tools/batch-execute@10.3.1(graphql@17.0.2)':
dependencies:
'@graphql-hive/signal': 2.1.0
'@graphql-tools/utils': 12.1.0(graphql@17.0.2)
'@whatwg-node/promise-helpers': 1.3.2
dataloader: 2.2.3
graphql: 17.0.2
- tslib: 2.8.1
+ tslib: 2.9.1
'@graphql-tools/code-file-loader@8.1.43(graphql@17.0.2)':
dependencies:
@@ -4698,26 +4623,26 @@ snapshots:
'@graphql-tools/utils': 12.1.0(graphql@17.0.2)
globby: 11.1.0
graphql: 17.0.2
- tslib: 2.8.1
+ tslib: 2.9.1
unixify: 1.0.0
transitivePeerDependencies:
- supports-color
- '@graphql-tools/delegate@12.3.1(graphql@17.0.2)':
+ '@graphql-tools/delegate@12.3.2(graphql@17.0.2)':
dependencies:
- '@graphql-tools/batch-execute': 10.3.0(graphql@17.0.2)
+ '@graphql-tools/batch-execute': 10.3.1(graphql@17.0.2)
'@graphql-tools/executor': 2.1.0(graphql@17.0.2)
'@graphql-tools/schema': 10.1.5(graphql@17.0.2)
'@graphql-tools/utils': 12.1.0(graphql@17.0.2)
'@whatwg-node/promise-helpers': 1.3.2
dataloader: 2.2.3
graphql: 17.0.2
- tslib: 2.8.1
+ tslib: 2.9.1
'@graphql-tools/documents@1.0.2(graphql@17.0.2)':
dependencies:
graphql: 17.0.2
- tslib: 2.8.1
+ tslib: 2.9.1
'@graphql-tools/executor-common@1.1.0(graphql@17.0.2)':
dependencies:
@@ -4731,17 +4656,17 @@ snapshots:
'@graphql-tools/utils': 12.1.0(graphql@17.0.2)
'@whatwg-node/disposablestack': 0.0.6
graphql: 17.0.2
- graphql-ws: 6.4.1(graphql@17.0.2)(ws@8.22.0)
- isows: 1.0.7(ws@8.22.0)
- tslib: 2.8.1
- ws: 8.22.0
+ graphql-ws: 6.4.1(graphql@17.0.2)(ws@8.22.1)
+ isows: 1.0.7(ws@8.22.1)
+ tslib: 2.9.1
+ ws: 8.22.1
transitivePeerDependencies:
- '@fastify/websocket'
- bufferutil
- crossws
- utf-8-validate
- '@graphql-tools/executor-http@3.5.0(@types/node@24.19.2)(graphql@17.0.2)':
+ '@graphql-tools/executor-http@3.6.0(@types/node@24.19.2)(graphql@17.0.2)':
dependencies:
'@graphql-hive/signal': 2.1.0
'@graphql-tools/executor-common': 1.1.0(graphql@17.0.2)
@@ -4752,7 +4677,7 @@ snapshots:
'@whatwg-node/promise-helpers': 1.3.2
graphql: 17.0.2
meros: 1.3.2(@types/node@24.19.2)
- tslib: 2.8.1
+ tslib: 2.9.1
transitivePeerDependencies:
- '@types/node'
@@ -4761,9 +4686,9 @@ snapshots:
'@graphql-tools/utils': 12.1.0(graphql@17.0.2)
'@types/ws': 8.18.2
graphql: 17.0.2
- isomorphic-ws: 5.0.0(ws@8.22.0)
- tslib: 2.8.1
- ws: 8.22.0
+ isomorphic-ws: 5.0.0(ws@8.22.1)
+ tslib: 2.9.1
+ ws: 8.22.1
transitivePeerDependencies:
- bufferutil
- utf-8-validate
@@ -4776,7 +4701,7 @@ snapshots:
'@whatwg-node/disposablestack': 0.1.0
'@whatwg-node/promise-helpers': 2.0.1
graphql: 17.0.2
- tslib: 2.8.1
+ tslib: 2.9.1
'@graphql-tools/git-loader@8.0.46(graphql@17.0.2)':
dependencies:
@@ -4785,21 +4710,21 @@ snapshots:
graphql: 17.0.2
is-glob: 4.0.3
micromatch: 4.0.8
- tslib: 2.8.1
+ tslib: 2.9.1
unixify: 1.0.0
transitivePeerDependencies:
- supports-color
'@graphql-tools/github-loader@9.1.13(@types/node@24.19.2)(graphql@17.0.2)':
dependencies:
- '@graphql-tools/executor-http': 3.5.0(@types/node@24.19.2)(graphql@17.0.2)
+ '@graphql-tools/executor-http': 3.6.0(@types/node@24.19.2)(graphql@17.0.2)
'@graphql-tools/graphql-tag-pluck': 8.3.41(graphql@17.0.2)
'@graphql-tools/utils': 12.1.0(graphql@17.0.2)
'@whatwg-node/fetch': 0.12.1
'@whatwg-node/promise-helpers': 2.0.1
graphql: 17.0.2
sync-fetch: 0.7.1
- tslib: 2.8.1
+ tslib: 2.9.1
transitivePeerDependencies:
- '@types/node'
- supports-color
@@ -4810,18 +4735,18 @@ snapshots:
'@graphql-tools/utils': 12.1.0(graphql@17.0.2)
globby: 11.1.0
graphql: 17.0.2
- tslib: 2.8.1
+ tslib: 2.9.1
unixify: 1.0.0
'@graphql-tools/graphql-tag-pluck@8.3.41(graphql@17.0.2)':
dependencies:
'@babel/core': 7.29.7
- '@babel/parser': 7.29.11
- '@babel/traverse': 7.29.10
+ '@babel/parser': 7.29.12
+ '@babel/traverse': 7.29.12
'@babel/types': 7.29.11
'@graphql-tools/utils': 12.1.0(graphql@17.0.2)
graphql: 17.0.2
- tslib: 2.8.1
+ tslib: 2.9.1
transitivePeerDependencies:
- supports-color
@@ -4830,14 +4755,14 @@ snapshots:
'@graphql-tools/utils': 12.1.0(graphql@17.0.2)
graphql: 17.0.2
resolve-from: 5.0.0
- tslib: 2.8.1
+ tslib: 2.9.1
'@graphql-tools/json-file-loader@8.0.38(graphql@17.0.2)':
dependencies:
'@graphql-tools/utils': 12.1.0(graphql@17.0.2)
globby: 11.1.0
graphql: 17.0.2
- tslib: 2.8.1
+ tslib: 2.9.1
unixify: 1.0.0
'@graphql-tools/load@8.1.21(graphql@17.0.2)':
@@ -4846,48 +4771,48 @@ snapshots:
'@graphql-tools/utils': 12.1.0(graphql@17.0.2)
graphql: 17.0.2
p-limit: 3.1.0
- tslib: 2.8.1
+ tslib: 2.9.1
'@graphql-tools/merge@9.2.8(graphql@17.0.2)':
dependencies:
'@graphql-tools/utils': 12.1.0(graphql@17.0.2)
graphql: 17.0.2
- tslib: 2.8.1
+ tslib: 2.9.1
'@graphql-tools/optimize@2.0.1(graphql@17.0.2)':
dependencies:
graphql: 17.0.2
- tslib: 2.8.1
+ tslib: 2.9.1
'@graphql-tools/relay-operation-optimizer@7.1.14(graphql@17.0.2)':
dependencies:
'@ardatan/relay-compiler': 13.0.2(graphql@17.0.2)
'@graphql-tools/utils': 12.1.0(graphql@17.0.2)
graphql: 17.0.2
- tslib: 2.8.1
+ tslib: 2.9.1
'@graphql-tools/schema@10.1.5(graphql@17.0.2)':
dependencies:
'@graphql-tools/merge': 9.2.8(graphql@17.0.2)
'@graphql-tools/utils': 12.1.0(graphql@17.0.2)
graphql: 17.0.2
- tslib: 2.8.1
+ tslib: 2.9.1
'@graphql-tools/url-loader@9.1.14(@types/node@24.19.2)(graphql@17.0.2)':
dependencies:
'@graphql-tools/executor-graphql-ws': 3.2.0(graphql@17.0.2)
- '@graphql-tools/executor-http': 3.5.0(@types/node@24.19.2)(graphql@17.0.2)
+ '@graphql-tools/executor-http': 3.6.0(@types/node@24.19.2)(graphql@17.0.2)
'@graphql-tools/executor-legacy-ws': 1.1.39(graphql@17.0.2)
'@graphql-tools/utils': 12.1.0(graphql@17.0.2)
- '@graphql-tools/wrap': 11.2.3(graphql@17.0.2)
+ '@graphql-tools/wrap': 11.2.4(graphql@17.0.2)
'@types/ws': 8.18.2
'@whatwg-node/fetch': 0.12.1
'@whatwg-node/promise-helpers': 2.0.1
graphql: 17.0.2
- isomorphic-ws: 5.0.0(ws@8.22.0)
+ isomorphic-ws: 5.0.0(ws@8.22.1)
sync-fetch: 0.7.1
- tslib: 2.8.1
- ws: 8.22.0
+ tslib: 2.9.1
+ ws: 8.22.1
transitivePeerDependencies:
- '@fastify/websocket'
- '@types/node'
@@ -4901,16 +4826,16 @@ snapshots:
'@whatwg-node/promise-helpers': 2.0.1
cross-inspect: 1.0.1
graphql: 17.0.2
- tslib: 2.8.1
+ tslib: 2.9.1
- '@graphql-tools/wrap@11.2.3(graphql@17.0.2)':
+ '@graphql-tools/wrap@11.2.4(graphql@17.0.2)':
dependencies:
- '@graphql-tools/delegate': 12.3.1(graphql@17.0.2)
+ '@graphql-tools/delegate': 12.3.2(graphql@17.0.2)
'@graphql-tools/schema': 10.1.5(graphql@17.0.2)
'@graphql-tools/utils': 12.1.0(graphql@17.0.2)
'@whatwg-node/promise-helpers': 1.3.2
graphql: 17.0.2
- tslib: 2.8.1
+ tslib: 2.9.1
'@graphql-typed-document-node/core@3.2.0(graphql@17.0.2)':
dependencies:
@@ -5107,14 +5032,14 @@ snapshots:
'@nodelib/fs.scandir': 2.1.5
fastq: 1.20.3
- '@oxc-project/types@0.155.0': {}
+ '@oxc-project/types@0.156.0': {}
'@react-router/dev@8.5.1(@react-router/serve@8.5.1(react-router@8.5.1(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.1(react@19.3.1))(react@19.3.1))(typescript@6.0.3))(react-router@8.5.1(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.1(react@19.3.1))(react@19.3.1))(typescript@6.0.3)(vite@8.3.5(@types/node@24.19.2)(jiti@2.7.0)(yaml@2.9.1))':
dependencies:
'@babel/core': 7.29.7
- '@babel/generator': 7.29.8
- '@babel/parser': 7.29.11
- '@babel/traverse': 7.29.10
+ '@babel/generator': 7.29.12
+ '@babel/parser': 7.29.12
+ '@babel/traverse': 7.29.12
'@babel/types': 7.29.11
'@react-router/node': 8.5.1(react-router@8.5.1(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.1(react@19.3.1))(react@19.3.1))(typescript@6.0.3)
'@remix-run/node-fetch-server': 0.14.2
@@ -5132,7 +5057,7 @@ snapshots:
pkg-types: 2.4.0
react-refresh: 0.18.0
react-router: 8.5.1(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.1(react@19.3.1))(react@19.3.1)
- semver: 7.8.5
+ semver: 7.8.6
tinyglobby: 0.2.17
valibot: 1.5.0(typescript@6.0.3)
vite: 8.3.5(@types/node@24.19.2)(jiti@2.7.0)(yaml@2.9.1)
@@ -5178,58 +5103,58 @@ snapshots:
'@repeaterjs/repeater@3.1.0': {}
- '@rolldown/binding-android-arm-eabi@1.2.15':
+ '@rolldown/binding-android-arm-eabi@1.2.16':
optional: true
- '@rolldown/binding-android-arm64@1.2.15':
+ '@rolldown/binding-android-arm64@1.2.16':
optional: true
- '@rolldown/binding-darwin-arm64@1.2.15':
+ '@rolldown/binding-darwin-arm64@1.2.16':
optional: true
- '@rolldown/binding-darwin-x64@1.2.15':
+ '@rolldown/binding-darwin-x64@1.2.16':
optional: true
- '@rolldown/binding-freebsd-x64@1.2.15':
+ '@rolldown/binding-freebsd-x64@1.2.16':
optional: true
- '@rolldown/binding-linux-arm-gnueabihf@1.2.15':
+ '@rolldown/binding-linux-arm-gnueabihf@1.2.16':
optional: true
- '@rolldown/binding-linux-arm64-gnu@1.2.15':
+ '@rolldown/binding-linux-arm64-gnu@1.2.16':
optional: true
- '@rolldown/binding-linux-arm64-musl@1.2.15':
+ '@rolldown/binding-linux-arm64-musl@1.2.16':
optional: true
- '@rolldown/binding-linux-ppc64-gnu@1.2.15':
+ '@rolldown/binding-linux-ppc64-gnu@1.2.16':
optional: true
- '@rolldown/binding-linux-s390x-gnu@1.2.15':
+ '@rolldown/binding-linux-s390x-gnu@1.2.16':
optional: true
- '@rolldown/binding-linux-x64-gnu@1.2.15':
+ '@rolldown/binding-linux-x64-gnu@1.2.16':
optional: true
- '@rolldown/binding-linux-x64-musl@1.2.15':
+ '@rolldown/binding-linux-x64-musl@1.2.16':
optional: true
- '@rolldown/binding-openharmony-arm64@1.2.15':
+ '@rolldown/binding-openharmony-arm64@1.2.16':
optional: true
- '@rolldown/binding-win32-arm64-msvc@1.2.15':
+ '@rolldown/binding-win32-arm64-msvc@1.2.16':
optional: true
- '@rolldown/binding-win32-x64-msvc@1.2.15':
+ '@rolldown/binding-win32-x64-msvc@1.2.16':
optional: true
- '@rolldown/plugin-babel@0.2.4(@babel/core@7.29.7)(@babel/runtime@8.0.8)(rolldown@1.2.15)(vite@8.3.5(@types/node@24.19.2)(jiti@2.7.0)(yaml@2.9.1))':
+ '@rolldown/plugin-babel@0.2.4(@babel/core@7.29.7)(@babel/runtime@8.1.0)(rolldown@1.2.16)(vite@8.3.5(@types/node@24.19.2)(jiti@2.7.0)(yaml@2.9.1))':
dependencies:
'@babel/core': 7.29.7
picomatch: 4.0.7
- rolldown: 1.2.15
+ rolldown: 1.2.16
optionalDependencies:
- '@babel/runtime': 8.0.8
+ '@babel/runtime': 8.1.0
vite: 8.3.5(@types/node@24.19.2)(jiti@2.7.0)(yaml@2.9.1)
'@rolldown/pluginutils@1.0.1': {}
@@ -5239,7 +5164,7 @@ snapshots:
'@shadcn/registry@0.2.1':
dependencies:
'@babel/core': 7.29.7
- '@babel/parser': 7.29.11
+ '@babel/parser': 7.29.12
'@babel/plugin-transform-typescript': 7.29.9(@babel/core@7.29.7)
'@babel/preset-typescript': 7.29.7(@babel/core@7.29.7)
'@dotenvx/dotenvx': 1.75.1
@@ -5268,72 +5193,72 @@ snapshots:
'@standard-schema/spec@1.1.0': {}
- '@tailwindcss/node@4.3.3':
+ '@tailwindcss/node@4.3.4':
dependencies:
'@jridgewell/remapping': 2.3.5
- enhanced-resolve: 5.26.0
+ enhanced-resolve: 5.26.1
jiti: 2.7.0
- lightningcss: 1.32.0
- magic-string: 0.30.21
+ lightningcss: 1.33.0
+ magic-string: 1.4.5
source-map-js: 1.2.2
- tailwindcss: 4.3.3
+ tailwindcss: 4.3.4
- '@tailwindcss/oxide-android-arm64@4.3.3':
+ '@tailwindcss/oxide-android-arm64@4.3.4':
optional: true
- '@tailwindcss/oxide-darwin-arm64@4.3.3':
+ '@tailwindcss/oxide-darwin-arm64@4.3.4':
optional: true
- '@tailwindcss/oxide-darwin-x64@4.3.3':
+ '@tailwindcss/oxide-darwin-x64@4.3.4':
optional: true
- '@tailwindcss/oxide-freebsd-x64@4.3.3':
+ '@tailwindcss/oxide-freebsd-x64@4.3.4':
optional: true
- '@tailwindcss/oxide-linux-arm-gnueabihf@4.3.3':
+ '@tailwindcss/oxide-linux-arm-gnueabihf@4.3.4':
optional: true
- '@tailwindcss/oxide-linux-arm64-gnu@4.3.3':
+ '@tailwindcss/oxide-linux-arm64-gnu@4.3.4':
optional: true
- '@tailwindcss/oxide-linux-arm64-musl@4.3.3':
+ '@tailwindcss/oxide-linux-arm64-musl@4.3.4':
optional: true
- '@tailwindcss/oxide-linux-x64-gnu@4.3.3':
+ '@tailwindcss/oxide-linux-x64-gnu@4.3.4':
optional: true
- '@tailwindcss/oxide-linux-x64-musl@4.3.3':
+ '@tailwindcss/oxide-linux-x64-musl@4.3.4':
optional: true
- '@tailwindcss/oxide-wasm32-wasi@4.3.3':
+ '@tailwindcss/oxide-wasm32-wasi@4.3.4':
optional: true
- '@tailwindcss/oxide-win32-arm64-msvc@4.3.3':
+ '@tailwindcss/oxide-win32-arm64-msvc@4.3.4':
optional: true
- '@tailwindcss/oxide-win32-x64-msvc@4.3.3':
+ '@tailwindcss/oxide-win32-x64-msvc@4.3.4':
optional: true
- '@tailwindcss/oxide@4.3.3':
+ '@tailwindcss/oxide@4.3.4':
optionalDependencies:
- '@tailwindcss/oxide-android-arm64': 4.3.3
- '@tailwindcss/oxide-darwin-arm64': 4.3.3
- '@tailwindcss/oxide-darwin-x64': 4.3.3
- '@tailwindcss/oxide-freebsd-x64': 4.3.3
- '@tailwindcss/oxide-linux-arm-gnueabihf': 4.3.3
- '@tailwindcss/oxide-linux-arm64-gnu': 4.3.3
- '@tailwindcss/oxide-linux-arm64-musl': 4.3.3
- '@tailwindcss/oxide-linux-x64-gnu': 4.3.3
- '@tailwindcss/oxide-linux-x64-musl': 4.3.3
- '@tailwindcss/oxide-wasm32-wasi': 4.3.3
- '@tailwindcss/oxide-win32-arm64-msvc': 4.3.3
- '@tailwindcss/oxide-win32-x64-msvc': 4.3.3
-
- '@tailwindcss/vite@4.3.3(vite@8.3.5(@types/node@24.19.2)(jiti@2.7.0)(yaml@2.9.1))':
- dependencies:
- '@tailwindcss/node': 4.3.3
- '@tailwindcss/oxide': 4.3.3
- tailwindcss: 4.3.3
+ '@tailwindcss/oxide-android-arm64': 4.3.4
+ '@tailwindcss/oxide-darwin-arm64': 4.3.4
+ '@tailwindcss/oxide-darwin-x64': 4.3.4
+ '@tailwindcss/oxide-freebsd-x64': 4.3.4
+ '@tailwindcss/oxide-linux-arm-gnueabihf': 4.3.4
+ '@tailwindcss/oxide-linux-arm64-gnu': 4.3.4
+ '@tailwindcss/oxide-linux-arm64-musl': 4.3.4
+ '@tailwindcss/oxide-linux-x64-gnu': 4.3.4
+ '@tailwindcss/oxide-linux-x64-musl': 4.3.4
+ '@tailwindcss/oxide-wasm32-wasi': 4.3.4
+ '@tailwindcss/oxide-win32-arm64-msvc': 4.3.4
+ '@tailwindcss/oxide-win32-x64-msvc': 4.3.4
+
+ '@tailwindcss/vite@4.3.4(vite@8.3.5(@types/node@24.19.2)(jiti@2.7.0)(yaml@2.9.1))':
+ dependencies:
+ '@tailwindcss/node': 4.3.4
+ '@tailwindcss/oxide': 4.3.4
+ tailwindcss: 4.3.4
vite: 8.3.5(@types/node@24.19.2)(jiti@2.7.0)(yaml@2.9.1)
'@tanstack/devtools-event-client@0.4.4': {}
@@ -5374,7 +5299,7 @@ snapshots:
picocolors: 1.1.1
pretty-format: 27.5.1
- '@testing-library/jest-dom@7.0.1(@testing-library/dom@10.4.2)(vitest@5.0.5(@types/node@24.19.2)(jsdom@30.1.3(@noble/hashes@2.4.0))(vite@8.3.5(@types/node@24.19.2)(jiti@2.7.0)(yaml@2.9.1)))':
+ '@testing-library/jest-dom@7.0.1(@testing-library/dom@10.4.2)(vitest@5.1.0(@types/node@24.19.2)(jsdom@30.1.3(@noble/hashes@2.4.0))(vite@8.3.5(@types/node@24.19.2)(jiti@2.7.0)(yaml@2.9.1)))':
dependencies:
'@adobe/css-tools': 4.5.0
'@testing-library/dom': 10.4.2
@@ -5384,7 +5309,7 @@ snapshots:
picocolors: 1.1.1
redent: 3.0.0
optionalDependencies:
- vitest: 5.0.5(@types/node@24.19.2)(jsdom@30.1.3(@noble/hashes@2.4.0))(vite@8.3.5(@types/node@24.19.2)(jiti@2.7.0)(yaml@2.9.1))
+ vitest: 5.1.0(@types/node@24.19.2)(jsdom@30.1.3(@noble/hashes@2.4.0))(vite@8.3.5(@types/node@24.19.2)(jiti@2.7.0)(yaml@2.9.1))
'@testing-library/react@16.3.3(@testing-library/dom@10.4.2)(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.1(react@19.3.1))(react@19.3.1)':
dependencies:
@@ -5410,7 +5335,7 @@ snapshots:
'@types/babel__core@7.20.5':
dependencies:
- '@babel/parser': 7.29.11
+ '@babel/parser': 7.29.12
'@babel/types': 7.29.11
'@types/babel__generator': 7.27.0
'@types/babel__template': 7.4.4
@@ -5422,7 +5347,7 @@ snapshots:
'@types/babel__template@7.4.4':
dependencies:
- '@babel/parser': 7.29.11
+ '@babel/parser': 7.29.12
'@babel/types': 7.29.11
'@types/babel__traverse@7.28.0':
@@ -5438,7 +5363,7 @@ snapshots:
'@types/esrecurse@4.3.1': {}
- '@types/estree@1.0.9': {}
+ '@types/estree@1.0.10': {}
'@types/json-schema@7.0.15': {}
@@ -5460,15 +5385,15 @@ snapshots:
dependencies:
'@types/node': 24.19.2
- '@typescript-eslint/eslint-plugin@8.72.1(@typescript-eslint/parser@8.72.1(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3))(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3)':
+ '@typescript-eslint/eslint-plugin@8.72.1(@typescript-eslint/parser@8.72.1(eslint@10.14.0(jiti@2.7.0))(typescript@6.0.3))(eslint@10.14.0(jiti@2.7.0))(typescript@6.0.3)':
dependencies:
'@eslint-community/regexpp': 4.12.2
- '@typescript-eslint/parser': 8.72.1(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3)
+ '@typescript-eslint/parser': 8.72.1(eslint@10.14.0(jiti@2.7.0))(typescript@6.0.3)
'@typescript-eslint/scope-manager': 8.72.1
- '@typescript-eslint/type-utils': 8.72.1(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3)
- '@typescript-eslint/utils': 8.72.1(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3)
+ '@typescript-eslint/type-utils': 8.72.1(eslint@10.14.0(jiti@2.7.0))(typescript@6.0.3)
+ '@typescript-eslint/utils': 8.72.1(eslint@10.14.0(jiti@2.7.0))(typescript@6.0.3)
'@typescript-eslint/visitor-keys': 8.72.1
- eslint: 10.13.0(jiti@2.7.0)
+ eslint: 10.14.0(jiti@2.7.0)
ignore: 7.0.14
natural-compare: 1.4.0
ts-api-utils: 2.5.0(typescript@6.0.3)
@@ -5476,14 +5401,14 @@ snapshots:
transitivePeerDependencies:
- supports-color
- '@typescript-eslint/parser@8.72.1(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3)':
+ '@typescript-eslint/parser@8.72.1(eslint@10.14.0(jiti@2.7.0))(typescript@6.0.3)':
dependencies:
'@typescript-eslint/scope-manager': 8.72.1
'@typescript-eslint/types': 8.72.1
'@typescript-eslint/typescript-estree': 8.72.1(typescript@6.0.3)
'@typescript-eslint/visitor-keys': 8.72.1
debug: 4.4.3
- eslint: 10.13.0(jiti@2.7.0)
+ eslint: 10.14.0(jiti@2.7.0)
typescript: 6.0.3
transitivePeerDependencies:
- supports-color
@@ -5506,13 +5431,13 @@ snapshots:
dependencies:
typescript: 6.0.3
- '@typescript-eslint/type-utils@8.72.1(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3)':
+ '@typescript-eslint/type-utils@8.72.1(eslint@10.14.0(jiti@2.7.0))(typescript@6.0.3)':
dependencies:
'@typescript-eslint/types': 8.72.1
'@typescript-eslint/typescript-estree': 8.72.1(typescript@6.0.3)
- '@typescript-eslint/utils': 8.72.1(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3)
+ '@typescript-eslint/utils': 8.72.1(eslint@10.14.0(jiti@2.7.0))(typescript@6.0.3)
debug: 4.4.3
- eslint: 10.13.0(jiti@2.7.0)
+ eslint: 10.14.0(jiti@2.7.0)
ts-api-utils: 2.5.0(typescript@6.0.3)
typescript: 6.0.3
transitivePeerDependencies:
@@ -5528,20 +5453,20 @@ snapshots:
'@typescript-eslint/visitor-keys': 8.72.1
debug: 4.4.3
minimatch: 10.2.6
- semver: 7.8.5
+ semver: 7.8.6
tinyglobby: 0.2.17
ts-api-utils: 2.5.0(typescript@6.0.3)
typescript: 6.0.3
transitivePeerDependencies:
- supports-color
- '@typescript-eslint/utils@8.72.1(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3)':
+ '@typescript-eslint/utils@8.72.1(eslint@10.14.0(jiti@2.7.0))(typescript@6.0.3)':
dependencies:
- '@eslint-community/eslint-utils': 4.10.1(eslint@10.13.0(jiti@2.7.0))
+ '@eslint-community/eslint-utils': 4.10.1(eslint@10.14.0(jiti@2.7.0))
'@typescript-eslint/scope-manager': 8.72.1
'@typescript-eslint/types': 8.72.1
'@typescript-eslint/typescript-estree': 8.72.1(typescript@6.0.3)
- eslint: 10.13.0(jiti@2.7.0)
+ eslint: 10.14.0(jiti@2.7.0)
typescript: 6.0.3
transitivePeerDependencies:
- supports-color
@@ -5551,34 +5476,34 @@ snapshots:
'@typescript-eslint/types': 8.72.1
eslint-visitor-keys: 5.0.1
- '@vitejs/plugin-react@6.1.2(@rolldown/plugin-babel@0.2.4(@babel/core@7.29.7)(@babel/runtime@8.0.8)(rolldown@1.2.15)(vite@8.3.5(@types/node@24.19.2)(jiti@2.7.0)(yaml@2.9.1)))(babel-plugin-react-compiler@1.0.0)(vite@8.3.5(@types/node@24.19.2)(jiti@2.7.0)(yaml@2.9.1))':
+ '@vitejs/plugin-react@6.2.1(@rolldown/plugin-babel@0.2.4(@babel/core@7.29.7)(@babel/runtime@8.1.0)(rolldown@1.2.16)(vite@8.3.5(@types/node@24.19.2)(jiti@2.7.0)(yaml@2.9.1)))(babel-plugin-react-compiler@1.0.0)(vite@8.3.5(@types/node@24.19.2)(jiti@2.7.0)(yaml@2.9.1))':
dependencies:
'@rolldown/pluginutils': 1.0.1
vite: 8.3.5(@types/node@24.19.2)(jiti@2.7.0)(yaml@2.9.1)
optionalDependencies:
- '@rolldown/plugin-babel': 0.2.4(@babel/core@7.29.7)(@babel/runtime@8.0.8)(rolldown@1.2.15)(vite@8.3.5(@types/node@24.19.2)(jiti@2.7.0)(yaml@2.9.1))
+ '@rolldown/plugin-babel': 0.2.4(@babel/core@7.29.7)(@babel/runtime@8.1.0)(rolldown@1.2.16)(vite@8.3.5(@types/node@24.19.2)(jiti@2.7.0)(yaml@2.9.1))
babel-plugin-react-compiler: 1.0.0
- '@vitest/mocker@5.0.5(vite@8.3.5(@types/node@24.19.2)(jiti@2.7.0)(yaml@2.9.1))':
+ '@vitest/mocker@5.1.0(vite@8.3.5(@types/node@24.19.2)(jiti@2.7.0)(yaml@2.9.1))':
dependencies:
'@jridgewell/trace-mapping': 0.3.31
- '@vitest/spy': 5.0.5
+ '@vitest/spy': 5.1.0
estree-walker: 3.0.3
magic-string: 1.4.5
optionalDependencies:
vite: 8.3.5(@types/node@24.19.2)(jiti@2.7.0)(yaml@2.9.1)
- '@vitest/spy@5.0.5': {}
+ '@vitest/spy@5.1.0': {}
'@whatwg-node/disposablestack@0.0.6':
dependencies:
'@whatwg-node/promise-helpers': 1.3.2
- tslib: 2.8.1
+ tslib: 2.9.1
'@whatwg-node/disposablestack@0.1.0':
dependencies:
'@whatwg-node/promise-helpers': 2.0.1
- tslib: 2.8.1
+ tslib: 2.9.1
'@whatwg-node/fetch@0.10.13':
dependencies:
@@ -5595,38 +5520,38 @@ snapshots:
'@fastify/busboy': 3.2.4
'@whatwg-node/disposablestack': 0.0.6
'@whatwg-node/promise-helpers': 1.3.2
- tslib: 2.8.1
+ tslib: 2.9.1
'@whatwg-node/node-fetch@0.9.3':
dependencies:
'@fastify/busboy': 3.2.4
'@whatwg-node/disposablestack': 0.1.0
'@whatwg-node/promise-helpers': 2.0.1
- tslib: 2.8.1
+ tslib: 2.9.1
'@whatwg-node/promise-helpers@1.3.2':
dependencies:
- tslib: 2.8.1
+ tslib: 2.9.1
'@whatwg-node/promise-helpers@2.0.1':
dependencies:
- tslib: 2.8.1
+ tslib: 2.9.1
'@wry/caches@1.0.1':
dependencies:
- tslib: 2.8.1
+ tslib: 2.9.1
'@wry/context@0.7.4':
dependencies:
- tslib: 2.8.1
+ tslib: 2.9.1
'@wry/equality@0.5.7':
dependencies:
- tslib: 2.8.1
+ tslib: 2.9.1
'@wry/trie@0.5.0':
dependencies:
- tslib: 2.8.1
+ tslib: 2.9.1
accepts@2.0.0:
dependencies:
@@ -5665,7 +5590,7 @@ snapshots:
ansi-regex@5.0.1: {}
- ansi-regex@6.4.0: {}
+ ansi-regex@6.5.0: {}
ansi-styles@5.2.0: {}
@@ -5685,7 +5610,7 @@ snapshots:
ast-types@0.16.3:
dependencies:
- tslib: 2.8.1
+ tslib: 2.9.1
atomically@1.7.0: {}
@@ -5694,8 +5619,8 @@ snapshots:
babel-dead-code-elimination@1.0.12:
dependencies:
'@babel/core': 7.29.7
- '@babel/parser': 7.29.11
- '@babel/traverse': 7.29.10
+ '@babel/parser': 7.29.12
+ '@babel/traverse': 7.29.12
'@babel/types': 7.29.11
transitivePeerDependencies:
- supports-color
@@ -5706,35 +5631,35 @@ snapshots:
balanced-match@4.0.4: {}
- baseline-browser-mapping@2.11.34: {}
+ baseline-browser-mapping@2.11.35: {}
basic-auth@2.0.1:
dependencies:
safe-buffer: 5.1.2
- better-auth@1.7.14(react-dom@19.3.1(react@19.3.1))(react@19.3.1)(vitest@5.0.5(@types/node@24.19.2)(jsdom@30.1.3(@noble/hashes@2.4.0))(vite@8.3.5(@types/node@24.19.2)(jiti@2.7.0)(yaml@2.9.1))):
+ better-auth@1.7.15(react-dom@19.3.1(react@19.3.1))(react@19.3.1)(vitest@5.1.0(@types/node@24.19.2)(jsdom@30.1.3(@noble/hashes@2.4.0))(vite@8.3.5(@types/node@24.19.2)(jiti@2.7.0)(yaml@2.9.1))):
dependencies:
- '@better-auth/core': 1.7.14(@better-auth/utils@0.5.1)(@better-fetch/fetch@1.3.3)(better-call@1.4.4(zod@4.6.7))(jose@6.2.13)(kysely@0.29.7)(nanostores@1.5.5)
- '@better-auth/drizzle-adapter': 1.7.14(@better-auth/core@1.7.14(@better-auth/utils@0.5.1)(@better-fetch/fetch@1.3.3)(better-call@1.4.4(zod@4.6.7))(jose@6.2.13)(kysely@0.29.7)(nanostores@1.5.5))(@better-auth/utils@0.5.1)
- '@better-auth/kysely-adapter': 1.7.14(@better-auth/core@1.7.14(@better-auth/utils@0.5.1)(@better-fetch/fetch@1.3.3)(better-call@1.4.4(zod@4.6.7))(jose@6.2.13)(kysely@0.29.7)(nanostores@1.5.5))(@better-auth/utils@0.5.1)(kysely@0.29.7)
- '@better-auth/memory-adapter': 1.7.14(@better-auth/core@1.7.14(@better-auth/utils@0.5.1)(@better-fetch/fetch@1.3.3)(better-call@1.4.4(zod@4.6.7))(jose@6.2.13)(kysely@0.29.7)(nanostores@1.5.5))(@better-auth/utils@0.5.1)
- '@better-auth/mongo-adapter': 1.7.14(@better-auth/core@1.7.14(@better-auth/utils@0.5.1)(@better-fetch/fetch@1.3.3)(better-call@1.4.4(zod@4.6.7))(jose@6.2.13)(kysely@0.29.7)(nanostores@1.5.5))(@better-auth/utils@0.5.1)
- '@better-auth/prisma-adapter': 1.7.14(@better-auth/core@1.7.14(@better-auth/utils@0.5.1)(@better-fetch/fetch@1.3.3)(better-call@1.4.4(zod@4.6.7))(jose@6.2.13)(kysely@0.29.7)(nanostores@1.5.5))(@better-auth/utils@0.5.1)
- '@better-auth/telemetry': 1.7.14(@better-auth/core@1.7.14(@better-auth/utils@0.5.1)(@better-fetch/fetch@1.3.3)(better-call@1.4.4(zod@4.6.7))(jose@6.2.13)(kysely@0.29.7)(nanostores@1.5.5))(@better-auth/utils@0.5.1)(@better-fetch/fetch@1.3.3)
+ '@better-auth/core': 1.7.15(@better-auth/utils@0.5.1)(@better-fetch/fetch@1.3.3)(better-call@1.4.4(zod@4.6.7))(jose@6.2.15)(kysely@0.29.8)(nanostores@1.5.5)
+ '@better-auth/drizzle-adapter': 1.7.15(@better-auth/core@1.7.15(@better-auth/utils@0.5.1)(@better-fetch/fetch@1.3.3)(better-call@1.4.4(zod@4.6.7))(jose@6.2.15)(kysely@0.29.8)(nanostores@1.5.5))(@better-auth/utils@0.5.1)
+ '@better-auth/kysely-adapter': 1.7.15(@better-auth/core@1.7.15(@better-auth/utils@0.5.1)(@better-fetch/fetch@1.3.3)(better-call@1.4.4(zod@4.6.7))(jose@6.2.15)(kysely@0.29.8)(nanostores@1.5.5))(@better-auth/utils@0.5.1)(kysely@0.29.8)
+ '@better-auth/memory-adapter': 1.7.15(@better-auth/core@1.7.15(@better-auth/utils@0.5.1)(@better-fetch/fetch@1.3.3)(better-call@1.4.4(zod@4.6.7))(jose@6.2.15)(kysely@0.29.8)(nanostores@1.5.5))(@better-auth/utils@0.5.1)
+ '@better-auth/mongo-adapter': 1.7.15(@better-auth/core@1.7.15(@better-auth/utils@0.5.1)(@better-fetch/fetch@1.3.3)(better-call@1.4.4(zod@4.6.7))(jose@6.2.15)(kysely@0.29.8)(nanostores@1.5.5))(@better-auth/utils@0.5.1)
+ '@better-auth/prisma-adapter': 1.7.15(@better-auth/core@1.7.15(@better-auth/utils@0.5.1)(@better-fetch/fetch@1.3.3)(better-call@1.4.4(zod@4.6.7))(jose@6.2.15)(kysely@0.29.8)(nanostores@1.5.5))(@better-auth/utils@0.5.1)
+ '@better-auth/telemetry': 1.7.15(@better-auth/core@1.7.15(@better-auth/utils@0.5.1)(@better-fetch/fetch@1.3.3)(better-call@1.4.4(zod@4.6.7))(jose@6.2.15)(kysely@0.29.8)(nanostores@1.5.5))(@better-auth/utils@0.5.1)(@better-fetch/fetch@1.3.3)
'@better-auth/utils': 0.5.1
'@better-fetch/fetch': 1.3.3
'@noble/ciphers': 2.4.0
'@noble/hashes': 2.4.0
better-call: 1.4.4(zod@4.6.7)
defu: 6.1.7
- jose: 6.2.13
- kysely: 0.29.7
+ jose: 6.2.15
+ kysely: 0.29.8
nanostores: 1.5.5
zod: 4.6.7
optionalDependencies:
react: 19.3.1
react-dom: 19.3.1(react@19.3.1)
- vitest: 5.0.5(@types/node@24.19.2)(jsdom@30.1.3(@noble/hashes@2.4.0))(vite@8.3.5(@types/node@24.19.2)(jiti@2.7.0)(yaml@2.9.1))
+ vitest: 5.1.0(@types/node@24.19.2)(jsdom@30.1.3(@noble/hashes@2.4.0))(vite@8.3.5(@types/node@24.19.2)(jiti@2.7.0)(yaml@2.9.1))
transitivePeerDependencies:
- '@opentelemetry/api'
@@ -5743,7 +5668,7 @@ snapshots:
'@better-auth/utils': 0.5.1
'@better-fetch/fetch': 1.3.3
rou3: 0.9.2
- set-cookie-parser: 3.2.1
+ set-cookie-parser: 3.2.2
optionalDependencies:
zod: 4.6.7
@@ -5759,7 +5684,7 @@ snapshots:
http-errors: 2.0.1
iconv-lite: 0.7.3
on-finished: 2.4.2
- qs: 6.17.0
+ qs: 6.17.1
raw-body: 3.0.2
type-is: 2.1.0
transitivePeerDependencies:
@@ -5775,10 +5700,10 @@ snapshots:
browserslist@4.29.5:
dependencies:
- baseline-browser-mapping: 2.11.34
- caniuse-lite: 1.0.30001819
- electron-to-chromium: 1.5.467
- node-releases: 2.0.60
+ baseline-browser-mapping: 2.11.35
+ caniuse-lite: 1.0.30001820
+ electron-to-chromium: 1.5.474
+ node-releases: 2.0.63
update-browserslist-db: 1.3.4(browserslist@4.29.5)
buffer-from@1.1.2: {}
@@ -5809,13 +5734,13 @@ snapshots:
callsites@3.1.0: {}
- caniuse-lite@1.0.30001819: {}
+ caniuse-lite@1.0.30001820: {}
chai@6.3.0: {}
chalk@5.6.2: {}
- change-case-all@2.1.0:
+ change-case-all@2.2.0:
dependencies:
change-case: 5.4.4
sponge-case: 2.0.3
@@ -5897,9 +5822,9 @@ snapshots:
json-schema-typed: 7.0.3
onetime: 5.1.2
pkg-up: 3.1.0
- semver: 7.8.5
+ semver: 7.8.6
- confbox@0.3.1: {}
+ confbox@0.3.2: {}
content-disposition@2.0.1: {}
@@ -5933,7 +5858,7 @@ snapshots:
cross-inspect@1.0.1:
dependencies:
- tslib: 2.8.1
+ tslib: 2.9.1
cross-spawn@7.0.6:
dependencies:
@@ -6034,13 +5959,13 @@ snapshots:
ee-first@1.1.1: {}
- electron-to-chromium@1.5.467: {}
+ electron-to-chromium@1.5.474: {}
emoji-regex@10.6.0: {}
- encodeurl@2.0.0: {}
+ encodeurl@2.0.1: {}
- enhanced-resolve@5.26.0:
+ enhanced-resolve@5.26.1:
dependencies:
graceful-fs: 4.2.11
tapable: 2.3.3
@@ -6050,7 +5975,7 @@ snapshots:
ansi-colors: 4.1.3
strip-ansi: 6.0.1
- entities@8.1.0: {}
+ entities@9.0.0: {}
env-paths@2.2.1: {}
@@ -6076,126 +6001,126 @@ snapshots:
escape-string-regexp@4.0.0: {}
- eslint-plugin-react-dom@5.28.8(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3):
+ eslint-plugin-react-dom@5.28.8(eslint@10.14.0(jiti@2.7.0))(typescript@6.0.3):
dependencies:
- '@eslint-react/ast': 5.28.8(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3)
- '@eslint-react/eslint': 5.28.8(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3)
- '@eslint-react/jsx': 5.28.8(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3)
- '@eslint-react/shared': 5.28.8(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3)
- '@eslint-react/var': 5.28.8(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3)
+ '@eslint-react/ast': 5.28.8(eslint@10.14.0(jiti@2.7.0))(typescript@6.0.3)
+ '@eslint-react/eslint': 5.28.8(eslint@10.14.0(jiti@2.7.0))(typescript@6.0.3)
+ '@eslint-react/jsx': 5.28.8(eslint@10.14.0(jiti@2.7.0))(typescript@6.0.3)
+ '@eslint-react/shared': 5.28.8(eslint@10.14.0(jiti@2.7.0))(typescript@6.0.3)
+ '@eslint-react/var': 5.28.8(eslint@10.14.0(jiti@2.7.0))(typescript@6.0.3)
'@typescript-eslint/types': 8.72.1
- '@typescript-eslint/utils': 8.72.1(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3)
+ '@typescript-eslint/utils': 8.72.1(eslint@10.14.0(jiti@2.7.0))(typescript@6.0.3)
compare-versions: 6.1.1
ts-pattern: 5.9.2
typescript: 6.0.3
optionalDependencies:
- eslint: 10.13.0(jiti@2.7.0)
+ eslint: 10.14.0(jiti@2.7.0)
transitivePeerDependencies:
- supports-color
- eslint-plugin-react-hooks@7.1.1(eslint@10.13.0(jiti@2.7.0)):
+ eslint-plugin-react-hooks@7.1.1(eslint@10.14.0(jiti@2.7.0)):
dependencies:
'@babel/core': 7.29.7
- '@babel/parser': 7.29.11
- eslint: 10.13.0(jiti@2.7.0)
+ '@babel/parser': 7.29.12
+ eslint: 10.14.0(jiti@2.7.0)
hermes-parser: 0.25.1
zod: 4.6.7
zod-validation-error: 4.0.2(zod@4.6.7)
transitivePeerDependencies:
- supports-color
- eslint-plugin-react-jsx@5.28.8(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3):
+ eslint-plugin-react-jsx@5.28.8(eslint@10.14.0(jiti@2.7.0))(typescript@6.0.3):
dependencies:
- '@eslint-react/ast': 5.28.8(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3)
- '@eslint-react/core': 5.28.8(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3)
- '@eslint-react/eslint': 5.28.8(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3)
- '@eslint-react/jsx': 5.28.8(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3)
- '@eslint-react/shared': 5.28.8(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3)
+ '@eslint-react/ast': 5.28.8(eslint@10.14.0(jiti@2.7.0))(typescript@6.0.3)
+ '@eslint-react/core': 5.28.8(eslint@10.14.0(jiti@2.7.0))(typescript@6.0.3)
+ '@eslint-react/eslint': 5.28.8(eslint@10.14.0(jiti@2.7.0))(typescript@6.0.3)
+ '@eslint-react/jsx': 5.28.8(eslint@10.14.0(jiti@2.7.0))(typescript@6.0.3)
+ '@eslint-react/shared': 5.28.8(eslint@10.14.0(jiti@2.7.0))(typescript@6.0.3)
'@typescript-eslint/types': 8.72.1
- '@typescript-eslint/utils': 8.72.1(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3)
+ '@typescript-eslint/utils': 8.72.1(eslint@10.14.0(jiti@2.7.0))(typescript@6.0.3)
typescript: 6.0.3
optionalDependencies:
- eslint: 10.13.0(jiti@2.7.0)
+ eslint: 10.14.0(jiti@2.7.0)
transitivePeerDependencies:
- supports-color
- eslint-plugin-react-naming-convention@5.28.8(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3):
+ eslint-plugin-react-naming-convention@5.28.8(eslint@10.14.0(jiti@2.7.0))(typescript@6.0.3):
dependencies:
- '@eslint-react/ast': 5.28.8(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3)
- '@eslint-react/core': 5.28.8(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3)
- '@eslint-react/eslint': 5.28.8(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3)
- '@eslint-react/shared': 5.28.8(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3)
- '@eslint-react/var': 5.28.8(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3)
+ '@eslint-react/ast': 5.28.8(eslint@10.14.0(jiti@2.7.0))(typescript@6.0.3)
+ '@eslint-react/core': 5.28.8(eslint@10.14.0(jiti@2.7.0))(typescript@6.0.3)
+ '@eslint-react/eslint': 5.28.8(eslint@10.14.0(jiti@2.7.0))(typescript@6.0.3)
+ '@eslint-react/shared': 5.28.8(eslint@10.14.0(jiti@2.7.0))(typescript@6.0.3)
+ '@eslint-react/var': 5.28.8(eslint@10.14.0(jiti@2.7.0))(typescript@6.0.3)
'@typescript-eslint/types': 8.72.1
- '@typescript-eslint/utils': 8.72.1(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3)
+ '@typescript-eslint/utils': 8.72.1(eslint@10.14.0(jiti@2.7.0))(typescript@6.0.3)
ts-pattern: 5.9.2
typescript: 6.0.3
optionalDependencies:
- eslint: 10.13.0(jiti@2.7.0)
+ eslint: 10.14.0(jiti@2.7.0)
transitivePeerDependencies:
- supports-color
- eslint-plugin-react-refresh@0.5.7(eslint@10.13.0(jiti@2.7.0)):
+ eslint-plugin-react-refresh@0.5.7(eslint@10.14.0(jiti@2.7.0)):
dependencies:
- eslint: 10.13.0(jiti@2.7.0)
+ eslint: 10.14.0(jiti@2.7.0)
- eslint-plugin-react-rsc@5.28.8(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3):
+ eslint-plugin-react-rsc@5.28.8(eslint@10.14.0(jiti@2.7.0))(typescript@6.0.3):
dependencies:
- '@eslint-react/ast': 5.28.8(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3)
- '@eslint-react/core': 5.28.8(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3)
- '@eslint-react/eslint': 5.28.8(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3)
- '@eslint-react/shared': 5.28.8(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3)
- '@eslint-react/var': 5.28.8(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3)
+ '@eslint-react/ast': 5.28.8(eslint@10.14.0(jiti@2.7.0))(typescript@6.0.3)
+ '@eslint-react/core': 5.28.8(eslint@10.14.0(jiti@2.7.0))(typescript@6.0.3)
+ '@eslint-react/eslint': 5.28.8(eslint@10.14.0(jiti@2.7.0))(typescript@6.0.3)
+ '@eslint-react/shared': 5.28.8(eslint@10.14.0(jiti@2.7.0))(typescript@6.0.3)
+ '@eslint-react/var': 5.28.8(eslint@10.14.0(jiti@2.7.0))(typescript@6.0.3)
'@typescript-eslint/types': 8.72.1
- '@typescript-eslint/utils': 8.72.1(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3)
+ '@typescript-eslint/utils': 8.72.1(eslint@10.14.0(jiti@2.7.0))(typescript@6.0.3)
typescript: 6.0.3
optionalDependencies:
- eslint: 10.13.0(jiti@2.7.0)
+ eslint: 10.14.0(jiti@2.7.0)
transitivePeerDependencies:
- supports-color
- eslint-plugin-react-web-api@5.28.8(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3):
+ eslint-plugin-react-web-api@5.28.8(eslint@10.14.0(jiti@2.7.0))(typescript@6.0.3):
dependencies:
- '@eslint-react/ast': 5.28.8(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3)
- '@eslint-react/core': 5.28.8(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3)
- '@eslint-react/eslint': 5.28.8(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3)
- '@eslint-react/shared': 5.28.8(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3)
- '@eslint-react/var': 5.28.8(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3)
+ '@eslint-react/ast': 5.28.8(eslint@10.14.0(jiti@2.7.0))(typescript@6.0.3)
+ '@eslint-react/core': 5.28.8(eslint@10.14.0(jiti@2.7.0))(typescript@6.0.3)
+ '@eslint-react/eslint': 5.28.8(eslint@10.14.0(jiti@2.7.0))(typescript@6.0.3)
+ '@eslint-react/shared': 5.28.8(eslint@10.14.0(jiti@2.7.0))(typescript@6.0.3)
+ '@eslint-react/var': 5.28.8(eslint@10.14.0(jiti@2.7.0))(typescript@6.0.3)
'@typescript-eslint/types': 8.72.1
- '@typescript-eslint/utils': 8.72.1(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3)
+ '@typescript-eslint/utils': 8.72.1(eslint@10.14.0(jiti@2.7.0))(typescript@6.0.3)
ts-pattern: 5.9.2
typescript: 6.0.3
optionalDependencies:
- eslint: 10.13.0(jiti@2.7.0)
+ eslint: 10.14.0(jiti@2.7.0)
transitivePeerDependencies:
- supports-color
- eslint-plugin-react-x@5.28.8(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3):
+ eslint-plugin-react-x@5.28.8(eslint@10.14.0(jiti@2.7.0))(typescript@6.0.3):
dependencies:
- '@eslint-react/ast': 5.28.8(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3)
- '@eslint-react/core': 5.28.8(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3)
- '@eslint-react/eslint': 5.28.8(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3)
- '@eslint-react/jsx': 5.28.8(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3)
- '@eslint-react/shared': 5.28.8(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3)
- '@eslint-react/var': 5.28.8(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3)
+ '@eslint-react/ast': 5.28.8(eslint@10.14.0(jiti@2.7.0))(typescript@6.0.3)
+ '@eslint-react/core': 5.28.8(eslint@10.14.0(jiti@2.7.0))(typescript@6.0.3)
+ '@eslint-react/eslint': 5.28.8(eslint@10.14.0(jiti@2.7.0))(typescript@6.0.3)
+ '@eslint-react/jsx': 5.28.8(eslint@10.14.0(jiti@2.7.0))(typescript@6.0.3)
+ '@eslint-react/shared': 5.28.8(eslint@10.14.0(jiti@2.7.0))(typescript@6.0.3)
+ '@eslint-react/var': 5.28.8(eslint@10.14.0(jiti@2.7.0))(typescript@6.0.3)
'@typescript-eslint/scope-manager': 8.72.1
'@typescript-eslint/types': 8.72.1
'@typescript-eslint/typescript-estree': 8.72.1(typescript@6.0.3)
- '@typescript-eslint/utils': 8.72.1(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3)
+ '@typescript-eslint/utils': 8.72.1(eslint@10.14.0(jiti@2.7.0))(typescript@6.0.3)
compare-versions: 6.1.1
- string-ts: 2.3.1
+ string-ts: 2.4.0
ts-api-utils: 2.5.0(typescript@6.0.3)
ts-pattern: 5.9.2
typescript: 6.0.3
optionalDependencies:
- eslint: 10.13.0(jiti@2.7.0)
+ eslint: 10.14.0(jiti@2.7.0)
transitivePeerDependencies:
- supports-color
eslint-scope@9.1.2:
dependencies:
'@types/esrecurse': 4.3.1
- '@types/estree': 1.0.9
+ '@types/estree': 1.0.10
esrecurse: 4.3.0
estraverse: 5.3.0
@@ -6203,9 +6128,9 @@ snapshots:
eslint-visitor-keys@5.0.1: {}
- eslint@10.13.0(jiti@2.7.0):
+ eslint@10.14.0(jiti@2.7.0):
dependencies:
- '@eslint-community/eslint-utils': 4.10.1(eslint@10.13.0(jiti@2.7.0))
+ '@eslint-community/eslint-utils': 4.10.1(eslint@10.14.0(jiti@2.7.0))
'@eslint-community/regexpp': 4.12.2
'@eslint/config-array': 0.23.5
'@eslint/config-helpers': 0.7.0
@@ -6214,7 +6139,7 @@ snapshots:
'@humanfs/node': 0.16.8
'@humanwhocodes/module-importer': 1.0.1
'@humanwhocodes/retry': 0.4.3
- '@types/estree': 1.0.9
+ '@types/estree': 1.0.10
ajv: 6.15.0
cross-spawn: 7.0.6
debug: 4.4.3
@@ -6260,7 +6185,7 @@ snapshots:
estree-walker@3.0.3:
dependencies:
- '@types/estree': 1.0.9
+ '@types/estree': 1.0.10
esutils@2.0.3: {}
@@ -6309,7 +6234,7 @@ snapshots:
cookie-signature: 1.2.2
debug: 4.4.3
depd: 2.0.0
- encodeurl: 2.0.0
+ encodeurl: 2.0.1
escape-html: 1.0.3
etag: 1.8.1
finalhandler: 2.1.1
@@ -6321,7 +6246,7 @@ snapshots:
once: 1.4.0
parseurl: 1.3.3
proxy-addr: 2.0.8
- qs: 6.17.0
+ qs: 6.17.1
range-parser: 1.3.0
router: 2.2.0
send: 1.2.1
@@ -6388,7 +6313,7 @@ snapshots:
finalhandler@2.1.1:
dependencies:
debug: 4.4.3
- encodeurl: 2.0.0
+ encodeurl: 2.0.1
escape-html: 1.0.3
on-finished: 2.4.2
parseurl: 1.3.3
@@ -6475,7 +6400,7 @@ snapshots:
dependencies:
is-glob: 4.0.3
- globals@17.13.0: {}
+ globals@17.14.0: {}
globby@11.1.0:
dependencies:
@@ -6503,7 +6428,7 @@ snapshots:
jiti: 2.7.0
minimatch: 10.2.6
string-env-interpolation: 1.0.1
- tslib: 2.8.1
+ tslib: 2.9.1
transitivePeerDependencies:
- '@fastify/websocket'
- '@types/node'
@@ -6515,13 +6440,13 @@ snapshots:
graphql-tag@2.12.7(graphql@17.0.2):
dependencies:
graphql: 17.0.2
- tslib: 2.8.1
+ tslib: 2.9.1
- graphql-ws@6.4.1(graphql@17.0.2)(ws@8.22.0):
+ graphql-ws@6.4.1(graphql@17.0.2)(ws@8.22.1):
dependencies:
graphql: 17.0.2
optionalDependencies:
- ws: 8.22.0
+ ws: 8.22.1
graphql@17.0.2: {}
@@ -6590,7 +6515,7 @@ snapshots:
dependencies:
loose-envify: 1.4.0
- ip-address@10.7.5: {}
+ ip-address@10.7.6: {}
ipaddr.js@1.9.1: {}
@@ -6669,17 +6594,17 @@ snapshots:
isexe@3.1.5: {}
- isomorphic-ws@5.0.0(ws@8.22.0):
+ isomorphic-ws@5.0.0(ws@8.22.1):
dependencies:
- ws: 8.22.0
+ ws: 8.22.1
- isows@1.0.7(ws@8.22.0):
+ isows@1.0.7(ws@8.22.1):
dependencies:
- ws: 8.22.0
+ ws: 8.22.1
jiti@2.7.0: {}
- jose@6.2.13: {}
+ jose@6.2.15: {}
js-tokens@4.0.0: {}
@@ -6692,7 +6617,7 @@ snapshots:
'@asamuzakjp/css-color': 7.1.9
'@asamuzakjp/dom-selector': 10.0.5
'@bramus/specificity': 2.4.3
- '@csstools/css-syntax-patches-for-csstree': 1.1.15(css-tree@3.2.1)
+ '@csstools/css-syntax-patches-for-csstree': 1.1.16(css-tree@3.2.1)
'@exodus/bytes': 1.16.0(@noble/hashes@2.4.0)
css-tree: 3.2.1
data-urls: 8.0.0(@noble/hashes@2.4.0)
@@ -6700,7 +6625,7 @@ snapshots:
html-encoding-sniffer: 7.0.0(@noble/hashes@2.4.0)
is-potential-custom-element-name: 1.0.1
lru-cache: 11.5.3
- parse5: 8.0.1
+ parse5: 8.1.0
saxes: 6.0.0
tough-cookie: 6.0.2
undici: 8.12.3
@@ -6745,95 +6670,46 @@ snapshots:
kleur@4.1.5: {}
- kysely@0.29.7: {}
+ kysely@0.29.8: {}
levn@0.4.1:
dependencies:
prelude-ls: 1.2.1
type-check: 0.4.0
- lightningcss-android-arm64@1.32.0:
- optional: true
-
lightningcss-android-arm64@1.33.0:
optional: true
- lightningcss-darwin-arm64@1.32.0:
- optional: true
-
lightningcss-darwin-arm64@1.33.0:
optional: true
- lightningcss-darwin-x64@1.32.0:
- optional: true
-
lightningcss-darwin-x64@1.33.0:
optional: true
- lightningcss-freebsd-x64@1.32.0:
- optional: true
-
lightningcss-freebsd-x64@1.33.0:
optional: true
- lightningcss-linux-arm-gnueabihf@1.32.0:
- optional: true
-
lightningcss-linux-arm-gnueabihf@1.33.0:
optional: true
- lightningcss-linux-arm64-gnu@1.32.0:
- optional: true
-
lightningcss-linux-arm64-gnu@1.33.0:
optional: true
- lightningcss-linux-arm64-musl@1.32.0:
- optional: true
-
lightningcss-linux-arm64-musl@1.33.0:
optional: true
- lightningcss-linux-x64-gnu@1.32.0:
- optional: true
-
lightningcss-linux-x64-gnu@1.33.0:
optional: true
- lightningcss-linux-x64-musl@1.32.0:
- optional: true
-
lightningcss-linux-x64-musl@1.33.0:
optional: true
- lightningcss-win32-arm64-msvc@1.32.0:
- optional: true
-
lightningcss-win32-arm64-msvc@1.33.0:
optional: true
- lightningcss-win32-x64-msvc@1.32.0:
- optional: true
-
lightningcss-win32-x64-msvc@1.33.0:
optional: true
- lightningcss@1.32.0:
- dependencies:
- detect-libc: 2.1.2
- optionalDependencies:
- lightningcss-android-arm64: 1.32.0
- lightningcss-darwin-arm64: 1.32.0
- lightningcss-darwin-x64: 1.32.0
- lightningcss-freebsd-x64: 1.32.0
- lightningcss-linux-arm-gnueabihf: 1.32.0
- lightningcss-linux-arm64-gnu: 1.32.0
- lightningcss-linux-arm64-musl: 1.32.0
- lightningcss-linux-x64-gnu: 1.32.0
- lightningcss-linux-x64-musl: 1.32.0
- lightningcss-win32-arm64-msvc: 1.32.0
- lightningcss-win32-x64-msvc: 1.32.0
-
lightningcss@1.33.0:
dependencies:
detect-libc: 2.1.2
@@ -6899,7 +6775,7 @@ snapshots:
dependencies:
yallist: 3.1.1
- lucide-react@1.63.0(@types/react@19.3.0)(react@19.3.1):
+ lucide-react@1.67.0(@types/react@19.3.0)(react@19.3.1):
dependencies:
react: 19.3.1
optionalDependencies:
@@ -6907,10 +6783,6 @@ snapshots:
lz-string@1.5.0: {}
- magic-string@0.30.21:
- dependencies:
- '@jridgewell/sourcemap-codec': 1.6.0
-
magic-string@1.4.5:
dependencies:
'@jridgewell/sourcemap-codec': 1.6.0
@@ -6994,7 +6866,7 @@ snapshots:
fetch-blob: 3.2.0
formdata-polyfill: 4.0.10
- node-releases@2.0.60: {}
+ node-releases@2.0.63: {}
normalize-path@2.1.1:
dependencies:
@@ -7053,7 +6925,7 @@ snapshots:
'@wry/caches': 1.0.1
'@wry/context': 0.7.4
'@wry/trie': 0.5.0
- tslib: 2.8.1
+ tslib: 2.9.1
optionator@0.9.4:
dependencies:
@@ -7115,9 +6987,9 @@ snapshots:
parse-ms@4.0.0: {}
- parse5@8.0.1:
+ parse5@8.1.0:
dependencies:
- entities: 8.1.0
+ entities: 9.0.0
parseurl@1.3.3: {}
@@ -7151,7 +7023,7 @@ snapshots:
pkg-types@2.4.0:
dependencies:
- confbox: 0.3.1
+ confbox: 0.3.2
exsolve: 1.2.0
pathe: 2.0.3
@@ -7202,7 +7074,7 @@ snapshots:
dependencies:
hookified: 2.2.0
- qs@6.17.0:
+ qs@6.17.1:
dependencies:
es-define-property: 1.0.1
side-channel: 1.1.1
@@ -7247,7 +7119,7 @@ snapshots:
esprima: 4.0.1
source-map: 0.6.1
tiny-invariant: 1.3.3
- tslib: 2.8.1
+ tslib: 2.9.1
redent@3.0.0:
dependencies:
@@ -7277,26 +7149,26 @@ snapshots:
rfdc@1.4.1: {}
- rolldown@1.2.15:
+ rolldown@1.2.16:
dependencies:
- '@oxc-project/types': 0.155.0
+ '@oxc-project/types': 0.156.0
'@rolldown/pluginutils': 1.0.1
optionalDependencies:
- '@rolldown/binding-android-arm-eabi': 1.2.15
- '@rolldown/binding-android-arm64': 1.2.15
- '@rolldown/binding-darwin-arm64': 1.2.15
- '@rolldown/binding-darwin-x64': 1.2.15
- '@rolldown/binding-freebsd-x64': 1.2.15
- '@rolldown/binding-linux-arm-gnueabihf': 1.2.15
- '@rolldown/binding-linux-arm64-gnu': 1.2.15
- '@rolldown/binding-linux-arm64-musl': 1.2.15
- '@rolldown/binding-linux-ppc64-gnu': 1.2.15
- '@rolldown/binding-linux-s390x-gnu': 1.2.15
- '@rolldown/binding-linux-x64-gnu': 1.2.15
- '@rolldown/binding-linux-x64-musl': 1.2.15
- '@rolldown/binding-openharmony-arm64': 1.2.15
- '@rolldown/binding-win32-arm64-msvc': 1.2.15
- '@rolldown/binding-win32-x64-msvc': 1.2.15
+ '@rolldown/binding-android-arm-eabi': 1.2.16
+ '@rolldown/binding-android-arm64': 1.2.16
+ '@rolldown/binding-darwin-arm64': 1.2.16
+ '@rolldown/binding-darwin-x64': 1.2.16
+ '@rolldown/binding-freebsd-x64': 1.2.16
+ '@rolldown/binding-linux-arm-gnueabihf': 1.2.16
+ '@rolldown/binding-linux-arm64-gnu': 1.2.16
+ '@rolldown/binding-linux-arm64-musl': 1.2.16
+ '@rolldown/binding-linux-ppc64-gnu': 1.2.16
+ '@rolldown/binding-linux-s390x-gnu': 1.2.16
+ '@rolldown/binding-linux-x64-gnu': 1.2.16
+ '@rolldown/binding-linux-x64-musl': 1.2.16
+ '@rolldown/binding-openharmony-arm64': 1.2.16
+ '@rolldown/binding-win32-arm64-msvc': 1.2.16
+ '@rolldown/binding-win32-x64-msvc': 1.2.16
rou3@0.9.2: {}
@@ -7318,7 +7190,7 @@ snapshots:
rxjs@7.8.2:
dependencies:
- tslib: 2.8.1
+ tslib: 2.9.1
safe-buffer@5.1.2: {}
@@ -7332,14 +7204,14 @@ snapshots:
scheduler@0.28.0: {}
- semver@6.3.1: {}
+ semver@6.3.2: {}
- semver@7.8.5: {}
+ semver@7.8.6: {}
send@1.2.1:
dependencies:
debug: 4.4.3
- encodeurl: 2.0.0
+ encodeurl: 2.0.1
escape-html: 1.0.3
etag: 1.8.1
fresh: 2.0.0
@@ -7354,21 +7226,21 @@ snapshots:
serve-static@2.2.1:
dependencies:
- encodeurl: 2.0.0
+ encodeurl: 2.0.1
escape-html: 1.0.3
parseurl: 1.3.3
send: 1.2.1
transitivePeerDependencies:
- supports-color
- set-cookie-parser@3.2.1: {}
+ set-cookie-parser@3.2.2: {}
setprototypeof@1.2.0: {}
shadcn@4.23.0:
dependencies:
'@babel/core': 7.29.7
- '@babel/parser': 7.29.11
+ '@babel/parser': 7.29.12
'@babel/plugin-transform-typescript': 7.29.9(@babel/core@7.29.7)
'@babel/preset-typescript': 7.29.7(@babel/core@7.29.7)
'@dotenvx/dotenvx': 1.75.1
@@ -7461,7 +7333,7 @@ snapshots:
socks@2.8.10:
dependencies:
- ip-address: 10.7.5
+ ip-address: 10.7.6
smart-buffer: 4.2.0
source-map-js@1.2.2: {}
@@ -7483,7 +7355,7 @@ snapshots:
string-env-interpolation@1.0.1: {}
- string-ts@2.3.1: {}
+ string-ts@2.4.0: {}
string-width@7.2.0:
dependencies:
@@ -7508,7 +7380,7 @@ snapshots:
strip-ansi@7.2.0:
dependencies:
- ansi-regex: 6.4.0
+ ansi-regex: 6.5.0
strip-bom@3.0.0: {}
@@ -7528,9 +7400,9 @@ snapshots:
timeout-signal: 2.0.0
whatwg-mimetype: 5.0.0
- systeminformation@5.33.18: {}
+ systeminformation@5.33.19: {}
- tailwindcss@4.3.3: {}
+ tailwindcss@4.3.4: {}
tapable@2.3.3: {}
@@ -7538,7 +7410,7 @@ snapshots:
tiny-invariant@1.3.3: {}
- tinybench@6.2.2: {}
+ tinybench@6.2.3: {}
tinyexec@1.3.1: {}
@@ -7549,7 +7421,7 @@ snapshots:
title-case@3.0.3:
dependencies:
- tslib: 2.8.1
+ tslib: 2.9.1
tldts-core@7.4.20: {}
@@ -7592,6 +7464,8 @@ snapshots:
tslib@2.8.1: {}
+ tslib@2.9.1: {}
+
tw-animate-css@1.4.0: {}
type-check@0.4.0:
@@ -7606,13 +7480,13 @@ snapshots:
media-typer: 1.1.1
mime-types: 3.0.2
- typescript-eslint@8.72.1(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3):
+ typescript-eslint@8.72.1(eslint@10.14.0(jiti@2.7.0))(typescript@6.0.3):
dependencies:
- '@typescript-eslint/eslint-plugin': 8.72.1(@typescript-eslint/parser@8.72.1(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3))(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3)
- '@typescript-eslint/parser': 8.72.1(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3)
+ '@typescript-eslint/eslint-plugin': 8.72.1(@typescript-eslint/parser@8.72.1(eslint@10.14.0(jiti@2.7.0))(typescript@6.0.3))(eslint@10.14.0(jiti@2.7.0))(typescript@6.0.3)
+ '@typescript-eslint/parser': 8.72.1(eslint@10.14.0(jiti@2.7.0))(typescript@6.0.3)
'@typescript-eslint/typescript-estree': 8.72.1(typescript@6.0.3)
- '@typescript-eslint/utils': 8.72.1(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3)
- eslint: 10.13.0(jiti@2.7.0)
+ '@typescript-eslint/utils': 8.72.1(eslint@10.14.0(jiti@2.7.0))(typescript@6.0.3)
+ eslint: 10.14.0(jiti@2.7.0)
typescript: 6.0.3
transitivePeerDependencies:
- supports-color
@@ -7668,7 +7542,7 @@ snapshots:
lightningcss: 1.33.0
picomatch: 4.0.7
postcss: 8.5.32
- rolldown: 1.2.15
+ rolldown: 1.2.16
tinyglobby: 0.2.17
optionalDependencies:
'@types/node': 24.19.2
@@ -7676,10 +7550,10 @@ snapshots:
jiti: 2.7.0
yaml: 2.9.1
- vitest@5.0.5(@types/node@24.19.2)(jsdom@30.1.3(@noble/hashes@2.4.0))(vite@8.3.5(@types/node@24.19.2)(jiti@2.7.0)(yaml@2.9.1)):
+ vitest@5.1.0(@types/node@24.19.2)(jsdom@30.1.3(@noble/hashes@2.4.0))(vite@8.3.5(@types/node@24.19.2)(jiti@2.7.0)(yaml@2.9.1)):
dependencies:
'@types/chai': 5.2.3
- '@vitest/mocker': 5.0.5(vite@8.3.5(@types/node@24.19.2)(jiti@2.7.0)(yaml@2.9.1))
+ '@vitest/mocker': 5.1.0(vite@8.3.5(@types/node@24.19.2)(jiti@2.7.0)(yaml@2.9.1))
chai: 6.3.0
es-module-lexer: 2.3.2
expect-type: 1.4.0
@@ -7687,7 +7561,7 @@ snapshots:
obug: 3.0.0
picomatch: 4.0.7
std-env: 4.3.0
- tinybench: 6.2.2
+ tinybench: 6.2.3
tinyexec: 1.3.1
tinyglobby: 0.2.17
vite: 8.3.5(@types/node@24.19.2)(jiti@2.7.0)(yaml@2.9.1)
@@ -7741,7 +7615,7 @@ snapshots:
wrappy@1.0.2: {}
- ws@8.22.0: {}
+ ws@8.22.1: {}
wsl-utils@1.0.1:
dependencies:
From 18d4e21b750e27084ec01aeab9c2236c03cde27c Mon Sep 17 00:00:00 2001
From: Martin Alexander Kaminski
Date: Wed, 4 Nov 2026 21:12:25 +0100
Subject: [PATCH 03/21] feat: add homepage with hero and top rated books
---
frontend/app/components/Header/Header.tsx | 3 +
.../BookFilters/BookFilters.test.tsx | 2 +-
.../BookFilters/BookFilters.tsx | 2 +-
.../PagesFilter/PagesFilter.tsx | 0
.../SearchBar/SearchBar.test.tsx | 2 +-
.../{home => books}/SearchBar/SearchBar.tsx | 2 +-
.../{home => books}/SortSelect/SortSelect.tsx | 0
.../home/HeroSection/HeroSection.tsx | 127 ++++++++++++++++
.../home/TopRatedSection/TopRatedSection.tsx | 69 +++++++++
frontend/app/hooks/useInView.ts | 34 +++++
frontend/app/index.css | 7 +
frontend/app/routes.ts | 1 +
frontend/app/routes/book/selectedBook.tsx | 15 +-
frontend/app/routes/books.test.tsx | 142 ++++++++++++++++++
frontend/app/routes/books.tsx | 84 +++++++++++
frontend/app/routes/home.test.tsx | 135 ++++-------------
frontend/app/routes/home.tsx | 82 ++--------
frontend/app/routes/profile.tsx | 2 +-
frontend/app/test/setup.ts | 11 +-
19 files changed, 534 insertions(+), 186 deletions(-)
rename frontend/app/components/{home => books}/BookFilters/BookFilters.test.tsx (98%)
rename frontend/app/components/{home => books}/BookFilters/BookFilters.tsx (98%)
rename frontend/app/components/{home => books}/PagesFilter/PagesFilter.tsx (100%)
rename frontend/app/components/{home => books}/SearchBar/SearchBar.test.tsx (96%)
rename frontend/app/components/{home => books}/SearchBar/SearchBar.tsx (98%)
rename frontend/app/components/{home => books}/SortSelect/SortSelect.tsx (100%)
create mode 100644 frontend/app/components/home/HeroSection/HeroSection.tsx
create mode 100644 frontend/app/components/home/TopRatedSection/TopRatedSection.tsx
create mode 100644 frontend/app/hooks/useInView.ts
create mode 100644 frontend/app/routes/books.test.tsx
create mode 100644 frontend/app/routes/books.tsx
diff --git a/frontend/app/components/Header/Header.tsx b/frontend/app/components/Header/Header.tsx
index cf74299..1826663 100644
--- a/frontend/app/components/Header/Header.tsx
+++ b/frontend/app/components/Header/Header.tsx
@@ -18,6 +18,9 @@ function Header() {
Home
+
+ Books
+
{!isPending && session && (
({
useBookFilters: () => ({
diff --git a/frontend/app/components/home/BookFilters/BookFilters.tsx b/frontend/app/components/books/BookFilters/BookFilters.tsx
similarity index 98%
rename from frontend/app/components/home/BookFilters/BookFilters.tsx
rename to frontend/app/components/books/BookFilters/BookFilters.tsx
index 3941da9..ac20cf0 100644
--- a/frontend/app/components/home/BookFilters/BookFilters.tsx
+++ b/frontend/app/components/books/BookFilters/BookFilters.tsx
@@ -15,7 +15,7 @@ import {
ComboboxValue,
useComboboxAnchor,
} from "~/components/ui/Combobox";
-import { PagesFilter } from "~/components/home/PagesFilter/PagesFilter";
+import { PagesFilter } from "~/components/books/PagesFilter/PagesFilter";
function BookFilters() {
const [, setSearchParams] = useSearchParams();
diff --git a/frontend/app/components/home/PagesFilter/PagesFilter.tsx b/frontend/app/components/books/PagesFilter/PagesFilter.tsx
similarity index 100%
rename from frontend/app/components/home/PagesFilter/PagesFilter.tsx
rename to frontend/app/components/books/PagesFilter/PagesFilter.tsx
diff --git a/frontend/app/components/home/SearchBar/SearchBar.test.tsx b/frontend/app/components/books/SearchBar/SearchBar.test.tsx
similarity index 96%
rename from frontend/app/components/home/SearchBar/SearchBar.test.tsx
rename to frontend/app/components/books/SearchBar/SearchBar.test.tsx
index 5bea8f6..75e0eeb 100644
--- a/frontend/app/components/home/SearchBar/SearchBar.test.tsx
+++ b/frontend/app/components/books/SearchBar/SearchBar.test.tsx
@@ -1,7 +1,7 @@
import { describe, expect, it } from "vitest";
import { render, screen, waitFor } from "@testing-library/react";
import userEvent from "@testing-library/user-event";
-import { SearchBar } from "~/components/home/SearchBar/SearchBar";
+import { SearchBar } from "~/components/books/SearchBar/SearchBar";
import { createRoutesStub, useSearchParams } from "react-router";
// Shows the current "q" param so tests can assert what SearchBar wrote to the URL.
diff --git a/frontend/app/components/home/SearchBar/SearchBar.tsx b/frontend/app/components/books/SearchBar/SearchBar.tsx
similarity index 98%
rename from frontend/app/components/home/SearchBar/SearchBar.tsx
rename to frontend/app/components/books/SearchBar/SearchBar.tsx
index 75e9cf3..155f76f 100644
--- a/frontend/app/components/home/SearchBar/SearchBar.tsx
+++ b/frontend/app/components/books/SearchBar/SearchBar.tsx
@@ -1,7 +1,7 @@
import { useEffect, useRef, useState } from "react";
import { FilterIcon } from "lucide-react";
import { SearchIcon } from "lucide-react";
-import { BookFilters } from "~/components/home/BookFilters/BookFilters";
+import { BookFilters } from "~/components/books/BookFilters/BookFilters";
import {
InputGroup,
InputGroupAddon,
diff --git a/frontend/app/components/home/SortSelect/SortSelect.tsx b/frontend/app/components/books/SortSelect/SortSelect.tsx
similarity index 100%
rename from frontend/app/components/home/SortSelect/SortSelect.tsx
rename to frontend/app/components/books/SortSelect/SortSelect.tsx
diff --git a/frontend/app/components/home/HeroSection/HeroSection.tsx b/frontend/app/components/home/HeroSection/HeroSection.tsx
new file mode 100644
index 0000000..fa6854e
--- /dev/null
+++ b/frontend/app/components/home/HeroSection/HeroSection.tsx
@@ -0,0 +1,127 @@
+import { Link, useNavigate } from "react-router";
+import { SearchIcon } from "lucide-react";
+import { authClient } from "~/api/auth";
+import { buttonVariants } from "~/components/ui/Button";
+import {
+ InputGroup,
+ InputGroupAddon,
+ InputGroupInput,
+} from "~/components/ui/InputGroup";
+import type { SearchBook } from "~/hooks/useSearchBooks";
+import { cn } from "~/lib/utils";
+import { useAppForm } from "~/hooks/useAppForm";
+
+const COVER_STYLES = [
+ "top-10 left-0 -rotate-8 motion-safe:delay-500",
+ "top-0 left-1/2 z-10 -translate-x-1/2",
+ "top-10 right-0 rotate-8 motion-safe:delay-1000",
+];
+
+function HeroSection({ books }: { books: SearchBook[] }) {
+ const { data: session, isPending } = authClient.useSession();
+ const bookCovers = books.filter((book) => book.coverImgUrl).slice(0, 3);
+ const navigate = useNavigate();
+
+ const form = useAppForm({
+ defaultValues: {
+ query: "",
+ },
+ onSubmit: async ({ value }) => {
+ const query = value.query.trim();
+ await navigate({
+ pathname: "/books",
+ search: query ? new URLSearchParams({ q: query }).toString() : "",
+ });
+ },
+ });
+
+ return (
+
+
+
+ Discover books{" "}
+ worth reading
+
+
+ Search thousands of titles, filter by genre, language and length, and
+ save the books you love .
+
+
+
+
+
+
+
+
+ {(field) => (
+ field.handleChange(e.target.value)}
+ />
+ )}
+
+
+ Search
+
+
+
+
+
+
+
+ Browse all books
+
+ {!isPending && !session && (
+
+ Create an account
+
+ )}
+
+
+
+ {bookCovers.length > 0 && (
+
+ {bookCovers.map((book, index) => (
+
+
+
+ ))}
+
+ )}
+
+ );
+}
+
+export { HeroSection };
diff --git a/frontend/app/components/home/TopRatedSection/TopRatedSection.tsx b/frontend/app/components/home/TopRatedSection/TopRatedSection.tsx
new file mode 100644
index 0000000..6f4efbc
--- /dev/null
+++ b/frontend/app/components/home/TopRatedSection/TopRatedSection.tsx
@@ -0,0 +1,69 @@
+import { Link } from "react-router";
+import { ArrowRightIcon } from "lucide-react";
+import { BookCard } from "~/components/BookCard/BookCard";
+import { Skeleton } from "~/components/ui/Skeleton";
+import { useInView } from "~/hooks/useInView";
+import type { SearchBook } from "~/hooks/useSearchBooks";
+import { cn } from "~/lib/utils";
+
+function TopRatedSection({
+ books,
+ loading,
+}: {
+ books?: SearchBook[];
+ loading: boolean;
+}) {
+ const { ref, inView } = useInView();
+ const hasBooks = books && books.length > 0;
+
+ return (
+
+
+
+ {loading || hasBooks ? (
+
+ {hasBooks
+ ? books.map((book) => (
+
+
+
+ ))
+ : Array.from({ length: 4 }, (_, index) => (
+
+
+
+ ))}
+
+ ) : (
+ Could not load the top rated books right now.
+ )}
+
+ );
+}
+
+export { TopRatedSection };
diff --git a/frontend/app/hooks/useInView.ts b/frontend/app/hooks/useInView.ts
new file mode 100644
index 0000000..a8bd24c
--- /dev/null
+++ b/frontend/app/hooks/useInView.ts
@@ -0,0 +1,34 @@
+import { useEffect, useRef, useState } from "react";
+
+/**
+ * A hook that returns a ref and a boolean indicating if the element is in view.
+ * Becomes true once and stays that way.
+ */
+function useInView() {
+ const ref = useRef(null);
+ const [inView, setInView] = useState(false);
+
+ useEffect(() => {
+ const element = ref.current;
+ if (!element) {
+ return;
+ }
+
+ const observer = new IntersectionObserver(
+ (entries) => {
+ if (entries.some((entry) => entry.isIntersecting)) {
+ setInView(true);
+ observer.disconnect();
+ }
+ },
+ { threshold: 0.15 },
+ );
+ observer.observe(element);
+
+ return () => observer.disconnect();
+ }, []);
+
+ return { ref, inView };
+}
+
+export { useInView };
diff --git a/frontend/app/index.css b/frontend/app/index.css
index 78add90..1d8a695 100644
--- a/frontend/app/index.css
+++ b/frontend/app/index.css
@@ -78,6 +78,13 @@
--radius-3xl: calc(var(--radius) * 2.2);
--radius-4xl: calc(var(--radius) * 2.6);
--text-md: 0.9375rem;
+ --animate-float: float 6s ease-in-out infinite;
+
+ @keyframes float {
+ 50% {
+ transform: translateY(-0.75rem);
+ }
+ }
}
:root {
diff --git a/frontend/app/routes.ts b/frontend/app/routes.ts
index 8ee3d52..3288133 100644
--- a/frontend/app/routes.ts
+++ b/frontend/app/routes.ts
@@ -2,6 +2,7 @@ import { index, route, type RouteConfig } from "@react-router/dev/routes";
export default [
index("routes/home.tsx"),
+ route("books", "routes/books.tsx"),
route("book/:bookId", "routes/book/selectedBook.tsx"),
route("signup", "routes/signup.tsx"),
route("login", "routes/login.tsx"),
diff --git a/frontend/app/routes/book/selectedBook.tsx b/frontend/app/routes/book/selectedBook.tsx
index 63583d5..73fd250 100644
--- a/frontend/app/routes/book/selectedBook.tsx
+++ b/frontend/app/routes/book/selectedBook.tsx
@@ -79,13 +79,7 @@ export default function SelectedBookPage({ params }: Route.ComponentProps) {
{origin === "favorites" ? (
diff --git a/frontend/app/routes/books.test.tsx b/frontend/app/routes/books.test.tsx
new file mode 100644
index 0000000..83093a7
--- /dev/null
+++ b/frontend/app/routes/books.test.tsx
@@ -0,0 +1,142 @@
+import { describe, expect, it, vi } from "vitest";
+import { screen } from "@testing-library/react";
+import userEvent from "@testing-library/user-event";
+import BooksPage from "~/routes/books";
+import SelectedBookPage from "~/routes/book/selectedBook";
+import { SEARCH_BOOKS } from "~/hooks/useSearchBooks";
+import { apiBook } from "~/test/fixtures/books";
+import { bookMock, searchBooksMock } from "~/test/mocks";
+import { renderRoutes } from "~/test/renderRoutes";
+import { loggedOut } from "~/test/session";
+
+// FavoriteButton on each book card reads the session. Logged out, it sends
+// no GraphQL requests.
+vi.mock("~/api/auth", () => ({
+ authClient: { useSession: vi.fn(() => loggedOut) },
+}));
+
+// Every book card is a link to the book's details page.
+const findBookLinks = () =>
+ screen.findAllByRole("link", { name: /View details for/ });
+
+const routes = [
+ { path: "/books", Component: BooksPage },
+ { path: "/book/:bookId", Component: SelectedBookPage },
+];
+
+describe("BooksPage", () => {
+ it("shows the books and the number of results from the API", async () => {
+ renderRoutes(routes, {
+ initialEntries: ["/books"],
+ mocks: [searchBooksMock()],
+ });
+
+ expect(await findBookLinks()).toHaveLength(3);
+ expect(screen.getByText("Good Omens")).toBeInTheDocument();
+ expect(
+ screen.getByText("Terry Pratchett, Neil Gaiman"),
+ ).toBeInTheDocument();
+ expect(screen.getByText("3 results")).toBeInTheDocument();
+ });
+
+ // Searching, filtering and sorting happen in the backend on the whole
+ // result set, so the page has to pass all of it on to the API. The mock
+ // only answers a request with exactly these variables.
+ it("sends the search, filters, sort and page from the URL to the API", async () => {
+ renderRoutes(routes, {
+ initialEntries: [
+ "/books?q=blade&genres=Fantasy&genres=Romance&language=English" +
+ "&bookFormat=Paperback&minPages=100&maxPages=500" +
+ "&sort=rating_desc&page=2",
+ ],
+ mocks: [
+ searchBooksMock(
+ {
+ title: "blade",
+ genres: ["Fantasy", "Romance"],
+ language: "English",
+ bookFormat: "Paperback",
+ minPages: 100,
+ maxPages: 500,
+ sortBy: "RATING",
+ sortDirection: "DESC",
+ limit: 12,
+ offset: 12,
+ },
+ undefined,
+ 15,
+ ),
+ ],
+ });
+
+ expect(await screen.findByText("15 results")).toBeInTheDocument();
+ expect(screen.getByRole("link", { current: "page" })).toHaveTextContent(
+ "2",
+ );
+ });
+
+ it("tells the user when no books match the search", async () => {
+ renderRoutes(routes, {
+ initialEntries: ["/books?q=zzzz"],
+ mocks: [searchBooksMock({ title: "zzzz", limit: 12, offset: 0 }, [])],
+ });
+
+ expect(
+ await screen.findByText("No books found for this search"),
+ ).toBeInTheDocument();
+ expect(screen.getByText("0 results")).toBeInTheDocument();
+ });
+
+ it("shows an error message when the API request fails", async () => {
+ renderRoutes(routes, {
+ initialEntries: ["/books"],
+ mocks: [
+ {
+ request: {
+ query: SEARCH_BOOKS,
+ variables: { title: "", limit: 12, offset: 0 },
+ },
+ error: new Error("Network error"),
+ },
+ ],
+ });
+
+ expect(
+ await screen.findByText(
+ "Sorry, there was an error loading the books. Please try again later.",
+ ),
+ ).toBeInTheDocument();
+ });
+
+ it("opens a book's details and goes back to the same search", async () => {
+ const user = userEvent.setup();
+ const variables = { title: "blade", limit: 12, offset: 0 };
+ renderRoutes(routes, {
+ initialEntries: ["/books?q=blade"],
+ // Each request is mocked once: the search results are reused from
+ // Apollo's cache on the details page and when going back.
+ mocks: [searchBooksMock(variables), bookMock(1, apiBook)],
+ });
+
+ await user.click(
+ await screen.findByRole("link", {
+ name: "View details for The Blade Itself",
+ }),
+ );
+
+ expect(await screen.findByText(/Logen Ninefingers/)).toBeInTheDocument();
+ expect(
+ screen.queryByRole("link", { name: /View details for/ }),
+ ).not.toBeInTheDocument();
+
+ await user.click(
+ // Rendered as a link, but exposed with role="button" by the Button component.
+ screen.getByRole("button", { name: "Go back to search results" }),
+ );
+
+ expect(await findBookLinks()).toHaveLength(3);
+ expect(
+ screen.getByRole("searchbox", { name: "Search for books" }),
+ ).toHaveValue("blade");
+ });
+});
diff --git a/frontend/app/routes/books.tsx b/frontend/app/routes/books.tsx
new file mode 100644
index 0000000..80732f3
--- /dev/null
+++ b/frontend/app/routes/books.tsx
@@ -0,0 +1,84 @@
+import { BookPagination } from "~/components/BookPagination/BookPagination";
+import { useSearchBooks } from "~/hooks/useSearchBooks";
+import { SearchBar } from "~/components/books/SearchBar/SearchBar";
+import { BookCard } from "~/components/BookCard/BookCard";
+import { SortSelect } from "~/components/books/SortSelect/SortSelect";
+import { useBookSearchParams } from "~/hooks/useBookSearchParams";
+import { BOOK_PAGE_LIMIT } from "~/lib/constants";
+
+export function meta() {
+ return [
+ { title: "Browse books | Readr" },
+ { name: "description", content: "Search and filter books on Readr" },
+ ];
+}
+
+export default function BooksPage() {
+ const { query, page, filters, sort } = useBookSearchParams();
+
+ const { books, totalCount, loading, error } = useSearchBooks({
+ filters,
+ title: query,
+ limit: BOOK_PAGE_LIMIT,
+ offset: (page - 1) * BOOK_PAGE_LIMIT,
+ sort,
+ });
+
+ if (loading) {
+ return (
+
+
+
+ Loading books...
+
+
+ );
+ }
+
+ if (error) {
+ return (
+
+
+
+ Sorry, there was an error loading the books. Please try again later.
+
+
+ );
+ }
+
+ if (!books || books.length === 0) {
+ return (
+
+
+
+ No books found for this search
+
+
+ );
+ }
+
+ return (
+
+
+
+
+
+ {books.map((book) => (
+
+
+
+ ))}
+
+
+
+ );
+}
diff --git a/frontend/app/routes/home.test.tsx b/frontend/app/routes/home.test.tsx
index b6a96ad..fe111f2 100644
--- a/frontend/app/routes/home.test.tsx
+++ b/frontend/app/routes/home.test.tsx
@@ -2,137 +2,68 @@ import { describe, expect, it, vi } from "vitest";
import { screen } from "@testing-library/react";
import userEvent from "@testing-library/user-event";
import HomePage from "~/routes/home";
-import SelectedBookPage from "~/routes/book/selectedBook";
-import { SEARCH_BOOKS } from "~/hooks/useSearchBooks";
-import { apiBook } from "~/test/fixtures/books";
-import { bookMock, searchBooksMock } from "~/test/mocks";
+import BooksPage from "~/routes/books";
+import { searchBooksMock } from "~/test/mocks";
import { renderRoutes } from "~/test/renderRoutes";
import { loggedOut } from "~/test/session";
-// FavoriteButton on each book card reads the session. Logged out, it sends
-// no GraphQL requests.
vi.mock("~/api/auth", () => ({
authClient: { useSession: vi.fn(() => loggedOut) },
}));
-// Every book card is a link to the book's details page.
-const findBookLinks = () =>
- screen.findAllByRole("link", { name: /View details for/ });
-
const routes = [
{ path: "/", Component: HomePage },
- { path: "/book/:bookId", Component: SelectedBookPage },
+ { path: "/books", Component: BooksPage },
];
+const topRatedMock = searchBooksMock({
+ title: "",
+ sortBy: "RATING",
+ sortDirection: "DESC",
+ limit: 8,
+ offset: 0,
+});
+
describe("HomePage", () => {
- it("shows the books and the number of results from the API", async () => {
- renderRoutes(routes, { mocks: [searchBooksMock()] });
+ it("shows the top rated books from the API", async () => {
+ renderRoutes(routes, { mocks: [topRatedMock] });
- expect(await findBookLinks()).toHaveLength(3);
- expect(screen.getByText("Good Omens")).toBeInTheDocument();
expect(
- screen.getByText("Terry Pratchett, Neil Gaiman"),
+ await screen.findAllByRole("link", { name: /View details for/ }),
+ ).toHaveLength(3);
+ expect(
+ screen.getByRole("link", { name: "Create an account" }),
).toBeInTheDocument();
- expect(screen.getByText("3 results")).toBeInTheDocument();
});
- // Searching, filtering and sorting happen in the backend on the whole
- // result set, so the page has to pass all of it on to the API. The mock
- // only answers a request with exactly these variables.
- it("sends the search, filters, sort and page from the URL to the API", async () => {
+ it("searches for books on the books page", async () => {
+ const user = userEvent.setup();
renderRoutes(routes, {
- initialEntries: [
- "/?q=blade&genres=Fantasy&genres=Romance&language=English" +
- "&bookFormat=Paperback&minPages=100&maxPages=500" +
- "&sort=rating_desc&page=2",
- ],
mocks: [
- searchBooksMock(
- {
- title: "blade",
- genres: ["Fantasy", "Romance"],
- language: "English",
- bookFormat: "Paperback",
- minPages: 100,
- maxPages: 500,
- sortBy: "RATING",
- sortDirection: "DESC",
- limit: 12,
- offset: 12,
- },
- undefined,
- 15,
- ),
+ topRatedMock,
+ searchBooksMock({ title: "blade", limit: 12, offset: 0 }),
],
});
- expect(await screen.findByText("15 results")).toBeInTheDocument();
- expect(screen.getByRole("link", { current: "page" })).toHaveTextContent(
- "2",
+ await user.type(
+ screen.getByRole("searchbox", { name: "Search for books" }),
+ "blade",
);
- });
+ await user.click(screen.getByRole("button", { name: "Search" }));
- it("tells the user when no books match the search", async () => {
- renderRoutes(routes, {
- initialEntries: ["/?q=zzzz"],
- mocks: [searchBooksMock({ title: "zzzz", limit: 12, offset: 0 }, [])],
- });
-
- expect(
- await screen.findByText("No books found for this search"),
- ).toBeInTheDocument();
- expect(screen.getByText("0 results")).toBeInTheDocument();
+ expect(await screen.findByText("3 results")).toBeInTheDocument();
});
- it("shows an error message when the API request fails", async () => {
- renderRoutes(routes, {
- mocks: [
- {
- request: {
- query: SEARCH_BOOKS,
- variables: { title: "", limit: 12, offset: 0 },
- },
- error: new Error("Network error"),
- },
- ],
- });
-
- expect(
- await screen.findByText(
- "Sorry, there was an error loading the books. Please try again later.",
- ),
- ).toBeInTheDocument();
- });
-
- it("opens a book's details and goes back to the same search", async () => {
+ it("shows all books when searching with only whitespace", async () => {
const user = userEvent.setup();
- const variables = { title: "blade", limit: 12, offset: 0 };
- renderRoutes(routes, {
- initialEntries: ["/?q=blade"],
- // Each request is mocked once: the search results are reused from
- // Apollo's cache on the details page and when going back.
- mocks: [searchBooksMock(variables), bookMock(1, apiBook)],
- });
+ renderRoutes(routes, { mocks: [topRatedMock, searchBooksMock()] });
- await user.click(
- await screen.findByRole("link", {
- name: "View details for The Blade Itself",
- }),
- );
-
- expect(await screen.findByText(/Logen Ninefingers/)).toBeInTheDocument();
- expect(
- screen.queryByRole("link", { name: /View details for/ }),
- ).not.toBeInTheDocument();
-
- await user.click(
- // Rendered as a link, but exposed with role="button" by the Button component.
- screen.getByRole("button", { name: "Go back to search results" }),
+ await user.type(
+ screen.getByRole("searchbox", { name: "Search for books" }),
+ " ",
);
+ await user.click(screen.getByRole("button", { name: "Search" }));
- expect(await findBookLinks()).toHaveLength(3);
- expect(
- screen.getByRole("searchbox", { name: "Search for books" }),
- ).toHaveValue("blade");
+ expect(await screen.findByText("3 results")).toBeInTheDocument();
});
});
diff --git a/frontend/app/routes/home.tsx b/frontend/app/routes/home.tsx
index 1f7b29f..d802f7b 100644
--- a/frontend/app/routes/home.tsx
+++ b/frontend/app/routes/home.tsx
@@ -1,10 +1,8 @@
-import { BookPagination } from "~/components/BookPagination/BookPagination";
+import { HeroSection } from "~/components/home/HeroSection/HeroSection";
+import { TopRatedSection } from "~/components/home/TopRatedSection/TopRatedSection";
import { useSearchBooks } from "~/hooks/useSearchBooks";
-import { SearchBar } from "~/components/home/SearchBar/SearchBar";
-import { BookCard } from "~/components/BookCard/BookCard";
-import { SortSelect } from "~/components/home/SortSelect/SortSelect";
-import { useBookSearchParams } from "~/hooks/useBookSearchParams";
-import { BOOK_PAGE_LIMIT } from "~/lib/constants";
+
+const TOP_RATED_LIMIT = 8;
export function meta() {
return [
@@ -14,71 +12,19 @@ export function meta() {
}
export default function HomePage() {
- const { query, page, filters, sort } = useBookSearchParams();
-
- const { books, totalCount, loading, error } = useSearchBooks({
- filters,
- title: query,
- limit: BOOK_PAGE_LIMIT,
- offset: (page - 1) * BOOK_PAGE_LIMIT,
- sort,
+ // Shared by the hero covers and the top rated list, so only one request is sent.
+ const { books, loading } = useSearchBooks({
+ filters: {},
+ title: "",
+ limit: TOP_RATED_LIMIT,
+ offset: 0,
+ sort: "rating_desc",
});
- if (loading) {
- return (
-
-
-
- Loading books...
-
-
- );
- }
-
- if (error) {
- return (
-
-
-
- Sorry, there was an error loading the books. Please try again later.
-
-
- );
- }
-
- if (!books || books.length === 0) {
- return (
-
-
-
- No books found for this search
-
-
- );
- }
-
return (
-
-
-
-
-
- {books.map((book) => (
-
-
-
- ))}
-
-
+
+
+
);
}
diff --git a/frontend/app/routes/profile.tsx b/frontend/app/routes/profile.tsx
index fd66c6c..a0962ce 100644
--- a/frontend/app/routes/profile.tsx
+++ b/frontend/app/routes/profile.tsx
@@ -155,7 +155,7 @@ export default function ProfilePage() {
) : books.length === 0 ? (
You have no favorite books yet.{" "}
-
+
Browse books
diff --git a/frontend/app/test/setup.ts b/frontend/app/test/setup.ts
index 66f2d6f..b2ed409 100644
--- a/frontend/app/test/setup.ts
+++ b/frontend/app/test/setup.ts
@@ -2,9 +2,18 @@
// Adds matchers like toBeInTheDocument() and toHaveAttribute() to expect().
import "@testing-library/jest-dom/vitest";
-import { afterEach } from "vitest";
+import { afterEach, vi } from "vitest";
import { cleanup } from "@testing-library/react";
+// jsdom has no IntersectionObserver
+class IntersectionObserverStub {
+ observe = vi.fn();
+ unobserve = vi.fn();
+ disconnect = vi.fn();
+ takeRecords = vi.fn(() => []);
+}
+vi.stubGlobal("IntersectionObserver", IntersectionObserverStub);
+
afterEach(() => {
// Unmount everything rendered by the previous test.
cleanup();
From 6708fe444fd3523e1d750f88d848aa2d16dfb585 Mon Sep 17 00:00:00 2001
From: Martin Alexander Kaminski
Date: Wed, 4 Nov 2026 21:26:19 +0100
Subject: [PATCH 04/21] feat: add stats, genres and "how it works" to homepage
---
.../home/GenresSection/GenresSection.tsx | 62 +++++++++++++++++++
.../HowItWorksSection/HowItWorksSection.tsx | 58 +++++++++++++++++
.../home/RevealSection/RevealSection.tsx | 23 +++++++
.../home/StatsSection/StatsSection.tsx | 52 ++++++++++++++++
.../home/TopRatedSection/TopRatedSection.tsx | 14 ++---
frontend/app/hooks/useBookFilters.ts | 2 +-
frontend/app/hooks/useCountUp.test.ts | 61 ++++++++++++++++++
frontend/app/hooks/useCountUp.ts | 39 ++++++++++++
frontend/app/routes/home.test.tsx | 42 +++++++++++--
frontend/app/routes/home.tsx | 8 ++-
frontend/app/test/mocks.ts | 14 ++++-
11 files changed, 358 insertions(+), 17 deletions(-)
create mode 100644 frontend/app/components/home/GenresSection/GenresSection.tsx
create mode 100644 frontend/app/components/home/HowItWorksSection/HowItWorksSection.tsx
create mode 100644 frontend/app/components/home/RevealSection/RevealSection.tsx
create mode 100644 frontend/app/components/home/StatsSection/StatsSection.tsx
create mode 100644 frontend/app/hooks/useCountUp.test.ts
create mode 100644 frontend/app/hooks/useCountUp.ts
diff --git a/frontend/app/components/home/GenresSection/GenresSection.tsx b/frontend/app/components/home/GenresSection/GenresSection.tsx
new file mode 100644
index 0000000..0821bb6
--- /dev/null
+++ b/frontend/app/components/home/GenresSection/GenresSection.tsx
@@ -0,0 +1,62 @@
+import { Link } from "react-router";
+import { RevealSection } from "~/components/home/RevealSection/RevealSection";
+import { buttonVariants } from "~/components/ui/Button";
+import { Skeleton } from "~/components/ui/Skeleton";
+import { useBookFilters } from "~/hooks/useBookFilters";
+import { cn } from "~/lib/utils";
+
+const GENRE_LIMIT = 12;
+
+function GenresSection() {
+ // The API sorts genres by how many books they have, so these are also the most popular
+ const { genres, loading, error } = useBookFilters();
+
+ return (
+
+
+
+ Popular genres
+
+
+ Jump straight into what you feel like reading.
+
+
+
+ {loading ? (
+
+ {Array.from({ length: GENRE_LIMIT }, (_, index) => (
+
+
+
+ ))}
+
+ ) : error || genres.length === 0 ? (
+ Could not load the genres right now.
+ ) : (
+
+ {genres.slice(0, GENRE_LIMIT).map((genre) => (
+
+
+ {genre}
+
+
+ ))}
+
+ )}
+
+ );
+}
+
+export { GenresSection };
diff --git a/frontend/app/components/home/HowItWorksSection/HowItWorksSection.tsx b/frontend/app/components/home/HowItWorksSection/HowItWorksSection.tsx
new file mode 100644
index 0000000..b7ad944
--- /dev/null
+++ b/frontend/app/components/home/HowItWorksSection/HowItWorksSection.tsx
@@ -0,0 +1,58 @@
+import { HeartIcon, SearchIcon, SparklesIcon } from "lucide-react";
+import { RevealSection } from "~/components/home/RevealSection/RevealSection";
+import { Card, CardContent, CardHeader, CardTitle } from "~/components/ui/Card";
+
+const STEPS = [
+ {
+ icon: SearchIcon,
+ title: "Search and filter",
+ description:
+ "Find books by title, then narrow them down by genre, language, format and length.",
+ },
+ {
+ icon: HeartIcon,
+ title: "Save your favorites",
+ description:
+ "Create an account to keep a list of the books you love, ready whenever you are.",
+ },
+ {
+ icon: SparklesIcon,
+ title: "Know your taste",
+ description: "Your profile shows the genres you come back to the most.",
+ },
+];
+
+function HowItWorksSection() {
+ return (
+
+
+ How Readr works
+
+
+
+ {STEPS.map(({ icon: Icon, title, description }) => (
+
+
+
+
+
+
+
+ {title}
+
+
+
+ {description}
+
+
+
+ ))}
+
+
+ );
+}
+
+export { HowItWorksSection };
diff --git a/frontend/app/components/home/RevealSection/RevealSection.tsx b/frontend/app/components/home/RevealSection/RevealSection.tsx
new file mode 100644
index 0000000..a55f4a0
--- /dev/null
+++ b/frontend/app/components/home/RevealSection/RevealSection.tsx
@@ -0,0 +1,23 @@
+import { useInView } from "~/hooks/useInView";
+import { cn } from "~/lib/utils";
+
+function RevealSection({
+ className,
+ ...props
+}: React.ComponentProps<"section">) {
+ const { ref, inView } = useInView();
+
+ return (
+
+ );
+}
+
+export { RevealSection };
diff --git a/frontend/app/components/home/StatsSection/StatsSection.tsx b/frontend/app/components/home/StatsSection/StatsSection.tsx
new file mode 100644
index 0000000..5bbd42f
--- /dev/null
+++ b/frontend/app/components/home/StatsSection/StatsSection.tsx
@@ -0,0 +1,52 @@
+import { RevealSection } from "~/components/home/RevealSection/RevealSection";
+import { useBookFilters } from "~/hooks/useBookFilters";
+import { useCountUp } from "~/hooks/useCountUp";
+import { useInView } from "~/hooks/useInView";
+
+interface StatProps {
+ label: string;
+ value: number;
+ start: boolean;
+}
+
+function Stat({ label, value, start }: StatProps) {
+ const count = useCountUp(value, start);
+
+ return (
+
+
{label}
+
+ {/* Screen readers get the final number instead of every step */}
+ {count.toLocaleString("en")}
+ {value.toLocaleString("en")}
+
+
+ );
+}
+
+interface StatsSectionProps {
+ bookCount: number;
+}
+
+function StatsSection({ bookCount }: StatsSectionProps) {
+ const { genres, languages } = useBookFilters();
+ const { ref, inView } = useInView();
+
+ return (
+
+
+
+
+
+
+
+ );
+}
+
+export { StatsSection };
diff --git a/frontend/app/components/home/TopRatedSection/TopRatedSection.tsx b/frontend/app/components/home/TopRatedSection/TopRatedSection.tsx
index 6f4efbc..53910ca 100644
--- a/frontend/app/components/home/TopRatedSection/TopRatedSection.tsx
+++ b/frontend/app/components/home/TopRatedSection/TopRatedSection.tsx
@@ -1,10 +1,9 @@
import { Link } from "react-router";
import { ArrowRightIcon } from "lucide-react";
import { BookCard } from "~/components/BookCard/BookCard";
+import { RevealSection } from "~/components/home/RevealSection/RevealSection";
import { Skeleton } from "~/components/ui/Skeleton";
-import { useInView } from "~/hooks/useInView";
import type { SearchBook } from "~/hooks/useSearchBooks";
-import { cn } from "~/lib/utils";
function TopRatedSection({
books,
@@ -13,17 +12,12 @@ function TopRatedSection({
books?: SearchBook[];
loading: boolean;
}) {
- const { ref, inView } = useInView();
const hasBooks = books && books.length > 0;
return (
-
+
);
}
diff --git a/frontend/app/hooks/useBookFilters.ts b/frontend/app/hooks/useBookFilters.ts
index 142f3c1..a39d80b 100644
--- a/frontend/app/hooks/useBookFilters.ts
+++ b/frontend/app/hooks/useBookFilters.ts
@@ -27,4 +27,4 @@ function useBookFilters() {
};
}
-export { useBookFilters };
+export { BOOK_FILTERS, useBookFilters };
diff --git a/frontend/app/hooks/useCountUp.test.ts b/frontend/app/hooks/useCountUp.test.ts
new file mode 100644
index 0000000..0fd2fc9
--- /dev/null
+++ b/frontend/app/hooks/useCountUp.test.ts
@@ -0,0 +1,61 @@
+import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
+import { act, renderHook } from "@testing-library/react";
+import { useCountUp } from "~/hooks/useCountUp";
+
+function prefersReducedMotion(reduce: boolean) {
+ vi.stubGlobal(
+ "matchMedia",
+ vi.fn(() => ({ matches: reduce })),
+ );
+}
+
+describe("useCountUp", () => {
+ beforeEach(() => {
+ vi.useFakeTimers({
+ toFake: ["requestAnimationFrame", "cancelAnimationFrame", "performance"],
+ });
+ });
+
+ afterEach(() => {
+ vi.useRealTimers();
+ vi.unstubAllGlobals();
+ });
+
+ it("stays at 0 until it is started", () => {
+ prefersReducedMotion(false);
+ const { result } = renderHook(() => useCountUp(500, false));
+
+ act(() => {
+ vi.advanceTimersByTime(2000);
+ });
+
+ expect(result.current).toBe(0);
+ });
+
+ it("counts up and ends exactly at the target", () => {
+ prefersReducedMotion(false);
+ const { result } = renderHook(() => useCountUp(500, true));
+
+ act(() => {
+ vi.advanceTimersByTime(500);
+ });
+ expect(result.current).toBeGreaterThan(0);
+ expect(result.current).toBeLessThan(500);
+
+ act(() => {
+ vi.advanceTimersByTime(1500);
+ });
+ expect(result.current).toBe(500);
+ });
+
+ it("jumps straight to the target when the user prefers reduced motion", () => {
+ prefersReducedMotion(true);
+ const { result } = renderHook(() => useCountUp(500, true));
+
+ act(() => {
+ vi.advanceTimersByTime(20);
+ });
+
+ expect(result.current).toBe(500);
+ });
+});
diff --git a/frontend/app/hooks/useCountUp.ts b/frontend/app/hooks/useCountUp.ts
new file mode 100644
index 0000000..ca4f614
--- /dev/null
+++ b/frontend/app/hooks/useCountUp.ts
@@ -0,0 +1,39 @@
+import { useEffect, useState } from "react";
+
+const DURATION_MS = 1500;
+
+/**
+ * Counts from 0 up to target once start is true, slowing down towards the end.
+ * Shows the final value immediately if the user prefers reduced motion.
+ */
+function useCountUp(target: number, start: boolean) {
+ const [value, setValue] = useState(0);
+
+ useEffect(() => {
+ if (!start) {
+ return;
+ }
+
+ const duration = matchMedia("(prefers-reduced-motion: reduce)").matches
+ ? 0
+ : DURATION_MS;
+ const startTime = performance.now();
+ let frame: number;
+
+ const tick = (now: number) => {
+ const progress =
+ duration === 0 ? 1 : Math.min((now - startTime) / duration, 1);
+ setValue(Math.round(target * (1 - (1 - progress) ** 3)));
+ if (progress < 1) {
+ frame = requestAnimationFrame(tick);
+ }
+ };
+ frame = requestAnimationFrame(tick);
+
+ return () => cancelAnimationFrame(frame);
+ }, [target, start]);
+
+ return value;
+}
+
+export { useCountUp };
diff --git a/frontend/app/routes/home.test.tsx b/frontend/app/routes/home.test.tsx
index fe111f2..cc7de79 100644
--- a/frontend/app/routes/home.test.tsx
+++ b/frontend/app/routes/home.test.tsx
@@ -1,9 +1,9 @@
import { describe, expect, it, vi } from "vitest";
-import { screen } from "@testing-library/react";
+import { screen, waitFor, within } from "@testing-library/react";
import userEvent from "@testing-library/user-event";
import HomePage from "~/routes/home";
import BooksPage from "~/routes/books";
-import { searchBooksMock } from "~/test/mocks";
+import { bookFiltersMock, searchBooksMock } from "~/test/mocks";
import { renderRoutes } from "~/test/renderRoutes";
import { loggedOut } from "~/test/session";
@@ -26,7 +26,7 @@ const topRatedMock = searchBooksMock({
describe("HomePage", () => {
it("shows the top rated books from the API", async () => {
- renderRoutes(routes, { mocks: [topRatedMock] });
+ renderRoutes(routes, { mocks: [topRatedMock, bookFiltersMock()] });
expect(
await screen.findAllByRole("link", { name: /View details for/ }),
@@ -41,6 +41,7 @@ describe("HomePage", () => {
renderRoutes(routes, {
mocks: [
topRatedMock,
+ bookFiltersMock(),
searchBooksMock({ title: "blade", limit: 12, offset: 0 }),
],
});
@@ -56,7 +57,9 @@ describe("HomePage", () => {
it("shows all books when searching with only whitespace", async () => {
const user = userEvent.setup();
- renderRoutes(routes, { mocks: [topRatedMock, searchBooksMock()] });
+ renderRoutes(routes, {
+ mocks: [topRatedMock, bookFiltersMock(), searchBooksMock()],
+ });
await user.type(
screen.getByRole("searchbox", { name: "Search for books" }),
@@ -66,4 +69,35 @@ describe("HomePage", () => {
expect(await screen.findByText("3 results")).toBeInTheDocument();
});
+
+ it("shows how many books, genres and languages there are", async () => {
+ renderRoutes(routes, { mocks: [topRatedMock, bookFiltersMock()] });
+
+ const stats = screen.getByRole("region", { name: "Library statistics" });
+ // The counts come from two queries, so wait for both: 3 books and 3 genres.
+ await waitFor(() => {
+ expect(within(stats).getAllByText("3")).toHaveLength(2);
+ });
+ expect(within(stats).getByText("2")).toBeInTheDocument();
+ });
+
+ it("opens the books page filtered by a popular genre", async () => {
+ const user = userEvent.setup();
+ renderRoutes(routes, {
+ mocks: [
+ topRatedMock,
+ bookFiltersMock(),
+ searchBooksMock({
+ title: "",
+ genres: ["Fantasy"],
+ limit: 12,
+ offset: 0,
+ }),
+ ],
+ });
+
+ await user.click(await screen.findByRole("link", { name: "Fantasy" }));
+
+ expect(await screen.findByText("3 results")).toBeInTheDocument();
+ });
});
diff --git a/frontend/app/routes/home.tsx b/frontend/app/routes/home.tsx
index d802f7b..3df8ec2 100644
--- a/frontend/app/routes/home.tsx
+++ b/frontend/app/routes/home.tsx
@@ -1,4 +1,7 @@
+import { GenresSection } from "~/components/home/GenresSection/GenresSection";
import { HeroSection } from "~/components/home/HeroSection/HeroSection";
+import { HowItWorksSection } from "~/components/home/HowItWorksSection/HowItWorksSection";
+import { StatsSection } from "~/components/home/StatsSection/StatsSection";
import { TopRatedSection } from "~/components/home/TopRatedSection/TopRatedSection";
import { useSearchBooks } from "~/hooks/useSearchBooks";
@@ -13,7 +16,7 @@ export function meta() {
export default function HomePage() {
// Shared by the hero covers and the top rated list, so only one request is sent.
- const { books, loading } = useSearchBooks({
+ const { books, totalCount, loading } = useSearchBooks({
filters: {},
title: "",
limit: TOP_RATED_LIMIT,
@@ -24,7 +27,10 @@ export default function HomePage() {
return (
+
+
+
);
}
diff --git a/frontend/app/test/mocks.ts b/frontend/app/test/mocks.ts
index cce0752..84c580d 100644
--- a/frontend/app/test/mocks.ts
+++ b/frontend/app/test/mocks.ts
@@ -4,6 +4,7 @@ import type {
SearchBooksQueryVariables,
} from "~/api/types/graphql.generated";
import { BOOK } from "~/hooks/useBook";
+import { BOOK_FILTERS } from "~/hooks/useBookFilters";
import { SEARCH_BOOKS } from "~/hooks/useSearchBooks";
import { BOOK_PAGE_LIMIT } from "~/lib/constants";
import { apiSearchBooks } from "~/test/fixtures/books";
@@ -42,4 +43,15 @@ function bookMock(
};
}
-export { bookMock, defaultSearchVariables, searchBooksMock };
+// The genres, languages and formats used by the filters and the home page.
+function bookFiltersMock(
+ genres = ["Fantasy", "Fiction", "Romance"],
+ languages = ["English", "Norwegian"],
+): MockLink.MockedResponse {
+ return {
+ request: { query: BOOK_FILTERS },
+ result: { data: { genres, languages, bookFormats: ["Paperback"] } },
+ };
+}
+
+export { bookFiltersMock, bookMock, defaultSearchVariables, searchBooksMock };
From eab23bf9ccbb6257b2a4b34a0df9f876f98e1d33 Mon Sep 17 00:00:00 2001
From: Martin Alexander Kaminski
Date: Wed, 4 Nov 2026 21:36:32 +0100
Subject: [PATCH 05/21] feat: add recommendations, surprise me button and
sign-up banner
---
.../home/ForYouSection/ForYouSection.tsx | 73 ++++++++++++++
.../home/HeroSection/HeroSection.tsx | 10 +-
.../HowItWorksSection/HowItWorksSection.tsx | 2 +-
.../home/SignUpBanner/SignUpBanner.tsx | 48 ++++++++++
.../SurpriseMeButton/SurpriseMeButton.tsx | 52 ++++++++++
frontend/app/routes/home.test.tsx | 94 ++++++++++++++++++-
frontend/app/routes/home.tsx | 9 +-
7 files changed, 281 insertions(+), 7 deletions(-)
create mode 100644 frontend/app/components/home/ForYouSection/ForYouSection.tsx
create mode 100644 frontend/app/components/home/SignUpBanner/SignUpBanner.tsx
create mode 100644 frontend/app/components/home/SurpriseMeButton/SurpriseMeButton.tsx
diff --git a/frontend/app/components/home/ForYouSection/ForYouSection.tsx b/frontend/app/components/home/ForYouSection/ForYouSection.tsx
new file mode 100644
index 0000000..fa1da69
--- /dev/null
+++ b/frontend/app/components/home/ForYouSection/ForYouSection.tsx
@@ -0,0 +1,73 @@
+import { Link } from "react-router";
+import { ArrowRightIcon } from "lucide-react";
+import { BookCard } from "~/components/BookCard/BookCard";
+import { RevealSection } from "~/components/home/RevealSection/RevealSection";
+import { useFavoriteBooks, useFavoriteStatus } from "~/hooks/useFavoriteBooks";
+import { useSearchBooks } from "~/hooks/useSearchBooks";
+
+const RECOMMENDATION_LIMIT = 4;
+
+function ForYouSection() {
+ const { topGenres } = useFavoriteBooks({ page: 1 });
+ const { isFavorite } = useFavoriteStatus({ enabled: true });
+ const topGenre = topGenres.at(0);
+
+ const { books } = useSearchBooks({
+ filters: { genres: topGenre ? [topGenre] : undefined },
+ title: "",
+ // Fetch extra, since books the user has already saved are left out.
+ limit: RECOMMENDATION_LIMIT * 3,
+ offset: 0,
+ sort: "rating_desc",
+ enabled: topGenre !== undefined,
+ });
+
+ const recommendations = (books ?? [])
+ .filter((book) => !isFavorite(book.id))
+ .slice(0, RECOMMENDATION_LIMIT);
+
+ // Users without favorites have no taste to base recommendations on yet.
+ if (!topGenre || recommendations.length === 0) {
+ return null;
+ }
+
+ return (
+
+
+
+
+ {recommendations.map((book) => (
+
+
+
+ ))}
+
+
+ );
+}
+
+export { ForYouSection };
diff --git a/frontend/app/components/home/HeroSection/HeroSection.tsx b/frontend/app/components/home/HeroSection/HeroSection.tsx
index fa6854e..0cef814 100644
--- a/frontend/app/components/home/HeroSection/HeroSection.tsx
+++ b/frontend/app/components/home/HeroSection/HeroSection.tsx
@@ -1,6 +1,7 @@
import { Link, useNavigate } from "react-router";
import { SearchIcon } from "lucide-react";
import { authClient } from "~/api/auth";
+import { SurpriseMeButton } from "~/components/home/SurpriseMeButton/SurpriseMeButton";
import { buttonVariants } from "~/components/ui/Button";
import {
InputGroup,
@@ -17,7 +18,13 @@ const COVER_STYLES = [
"top-10 right-0 rotate-8 motion-safe:delay-1000",
];
-function HeroSection({ books }: { books: SearchBook[] }) {
+function HeroSection({
+ books,
+ bookCount,
+}: {
+ books: SearchBook[];
+ bookCount: number;
+}) {
const { data: session, isPending } = authClient.useSession();
const bookCovers = books.filter((book) => book.coverImgUrl).slice(0, 3);
const navigate = useNavigate();
@@ -95,6 +102,7 @@ function HeroSection({ books }: { books: SearchBook[] }) {
Create an account
)}
+
diff --git a/frontend/app/components/home/HowItWorksSection/HowItWorksSection.tsx b/frontend/app/components/home/HowItWorksSection/HowItWorksSection.tsx
index b7ad944..344ae8e 100644
--- a/frontend/app/components/home/HowItWorksSection/HowItWorksSection.tsx
+++ b/frontend/app/components/home/HowItWorksSection/HowItWorksSection.tsx
@@ -13,7 +13,7 @@ const STEPS = [
icon: HeartIcon,
title: "Save your favorites",
description:
- "Create an account to keep a list of the books you love, ready whenever you are.",
+ "Create an account to keep a list of the books you like, ready whenever you are.",
},
{
icon: SparklesIcon,
diff --git a/frontend/app/components/home/SignUpBanner/SignUpBanner.tsx b/frontend/app/components/home/SignUpBanner/SignUpBanner.tsx
new file mode 100644
index 0000000..4eb9d48
--- /dev/null
+++ b/frontend/app/components/home/SignUpBanner/SignUpBanner.tsx
@@ -0,0 +1,48 @@
+import { Link } from "react-router";
+import { RevealSection } from "~/components/home/RevealSection/RevealSection";
+import { buttonVariants } from "~/components/ui/Button";
+import { cn } from "~/lib/utils";
+
+function SignUpBanner() {
+ return (
+
+
+
+ Start your reading list
+
+
+ Create a free account to save your favorite books and see which genres
+ you like the most.
+
+
+
+ Create an account
+
+
+ Log in
+
+
+
+
+ );
+}
+
+export { SignUpBanner };
diff --git a/frontend/app/components/home/SurpriseMeButton/SurpriseMeButton.tsx b/frontend/app/components/home/SurpriseMeButton/SurpriseMeButton.tsx
new file mode 100644
index 0000000..af1fca1
--- /dev/null
+++ b/frontend/app/components/home/SurpriseMeButton/SurpriseMeButton.tsx
@@ -0,0 +1,52 @@
+import { useLazyQuery } from "@apollo/client/react";
+import { useNavigate } from "react-router";
+import { ShuffleIcon } from "lucide-react";
+import { Button } from "~/components/ui/Button";
+import { Spinner } from "~/components/ui/Spinner";
+import { toast } from "~/components/ui/Toast";
+import { SEARCH_BOOKS } from "~/hooks/useSearchBooks";
+
+interface SurpriseMeButtonProps {
+ bookCount: number;
+}
+
+function SurpriseMeButton({ bookCount }: SurpriseMeButtonProps) {
+ const navigate = useNavigate();
+ const [fetchBook, { loading }] = useLazyQuery(SEARCH_BOOKS);
+
+ async function openRandomBook() {
+ try {
+ const { data } = await fetchBook({
+ variables: {
+ title: "",
+ limit: 1,
+ offset: Math.floor(Math.random() * bookCount),
+ },
+ });
+ const book = data?.searchBooks.books.at(0);
+ if (!book) {
+ throw new Error("No book found");
+ }
+ await navigate(`/book/${book.id}`);
+ } catch {
+ toast.add({
+ description: "Could not find a random book. Please try again.",
+ type: "error",
+ });
+ }
+ }
+
+ return (
+ void openRandomBook()}
+ >
+ {loading ? : }
+ Surprise me
+
+ );
+}
+
+export { SurpriseMeButton };
diff --git a/frontend/app/routes/home.test.tsx b/frontend/app/routes/home.test.tsx
index cc7de79..2c53df2 100644
--- a/frontend/app/routes/home.test.tsx
+++ b/frontend/app/routes/home.test.tsx
@@ -1,19 +1,29 @@
import { describe, expect, it, vi } from "vitest";
+import { useParams } from "react-router";
import { screen, waitFor, within } from "@testing-library/react";
import userEvent from "@testing-library/user-event";
+import { authClient } from "~/api/auth";
+import { FAVORITE_BOOK_IDS, FAVORITE_BOOKS } from "~/hooks/useFavoriteBooks";
import HomePage from "~/routes/home";
import BooksPage from "~/routes/books";
import { bookFiltersMock, searchBooksMock } from "~/test/mocks";
import { renderRoutes } from "~/test/renderRoutes";
-import { loggedOut } from "~/test/session";
+import { apiSearchBooks } from "~/test/fixtures/books";
+import { loggedIn, loggedOut } from "~/test/session";
vi.mock("~/api/auth", () => ({
authClient: { useSession: vi.fn(() => loggedOut) },
}));
+function BookPageStub() {
+ const { bookId } = useParams();
+ return Book {bookId} ;
+}
+
const routes = [
{ path: "/", Component: HomePage },
{ path: "/books", Component: BooksPage },
+ { path: "/book/:bookId", Component: BookPageStub },
];
const topRatedMock = searchBooksMock({
@@ -31,9 +41,6 @@ describe("HomePage", () => {
expect(
await screen.findAllByRole("link", { name: /View details for/ }),
).toHaveLength(3);
- expect(
- screen.getByRole("link", { name: "Create an account" }),
- ).toBeInTheDocument();
});
it("searches for books on the books page", async () => {
@@ -100,4 +107,83 @@ describe("HomePage", () => {
expect(await screen.findByText("3 results")).toBeInTheDocument();
});
+
+ it("invites logged out users to create an account", async () => {
+ renderRoutes(routes, { mocks: [topRatedMock, bookFiltersMock()] });
+
+ expect(
+ await screen.findByRole("region", { name: "Start your reading list" }),
+ ).toBeInTheDocument();
+ expect(screen.queryByText(/Because you like/)).not.toBeInTheDocument();
+ });
+
+ it("recommends books from the user's favorite genre that they have not saved", async () => {
+ vi.mocked(authClient.useSession).mockReturnValue(loggedIn);
+ const [savedBook] = apiSearchBooks;
+ renderRoutes(routes, {
+ mocks: [
+ topRatedMock,
+ bookFiltersMock(),
+ {
+ request: { query: FAVORITE_BOOKS, variables: { limit: 12, offset: 0 } },
+ result: {
+ data: {
+ favoriteBooks: {
+ __typename: "BookSearchResult",
+ totalCount: 1,
+ books: [savedBook],
+ },
+ favoriteGenres: ["Fantasy"],
+ },
+ },
+ },
+ {
+ request: { query: FAVORITE_BOOK_IDS },
+ result: { data: { favoriteBookIds: [savedBook.id] } },
+ },
+ searchBooksMock({
+ title: "",
+ genres: ["Fantasy"],
+ sortBy: "RATING",
+ sortDirection: "DESC",
+ limit: 12,
+ offset: 0,
+ }),
+ ],
+ });
+
+ const forYou = await screen.findByRole("region", {
+ name: "Because you like Fantasy",
+ });
+ expect(
+ within(forYou).getAllByRole("link", { name: /View details for/ }),
+ ).toHaveLength(2);
+ expect(within(forYou).queryByText(savedBook.title)).not.toBeInTheDocument();
+ expect(
+ screen.queryByRole("region", { name: "Start your reading list" }),
+ ).not.toBeInTheDocument();
+ });
+
+ it("opens a random book", async () => {
+ vi.spyOn(Math, "random").mockReturnValue(0.5);
+ const user = userEvent.setup();
+ renderRoutes(routes, {
+ mocks: [
+ topRatedMock,
+ bookFiltersMock(),
+ // 0.5 of 3 books is offset 1, the second book.
+ searchBooksMock({ title: "", limit: 1, offset: 1 }, [apiSearchBooks[1]]),
+ ],
+ });
+
+ const button = screen.getByRole("button", { name: "Surprise me" });
+ await waitFor(() => {
+ expect(button).toBeEnabled();
+ });
+ await user.click(button);
+
+ expect(
+ await screen.findByRole("heading", { name: "Book 2" }),
+ ).toBeInTheDocument();
+ });
});
diff --git a/frontend/app/routes/home.tsx b/frontend/app/routes/home.tsx
index 3df8ec2..c608b3b 100644
--- a/frontend/app/routes/home.tsx
+++ b/frontend/app/routes/home.tsx
@@ -1,6 +1,9 @@
+import { authClient } from "~/api/auth";
+import { ForYouSection } from "~/components/home/ForYouSection/ForYouSection";
import { GenresSection } from "~/components/home/GenresSection/GenresSection";
import { HeroSection } from "~/components/home/HeroSection/HeroSection";
import { HowItWorksSection } from "~/components/home/HowItWorksSection/HowItWorksSection";
+import { SignUpBanner } from "~/components/home/SignUpBanner/SignUpBanner";
import { StatsSection } from "~/components/home/StatsSection/StatsSection";
import { TopRatedSection } from "~/components/home/TopRatedSection/TopRatedSection";
import { useSearchBooks } from "~/hooks/useSearchBooks";
@@ -15,6 +18,8 @@ export function meta() {
}
export default function HomePage() {
+ const { data: session, isPending } = authClient.useSession();
+
// Shared by the hero covers and the top rated list, so only one request is sent.
const { books, totalCount, loading } = useSearchBooks({
filters: {},
@@ -26,11 +31,13 @@ export default function HomePage() {
return (
-
+
+ {session && }
+ {!isPending && !session && }
);
}
From e9b860f5989891339c75ba62d071f82b65c2c317 Mon Sep 17 00:00:00 2001
From: Martin Alexander Kaminski
Date: Wed, 4 Nov 2026 21:42:26 +0100
Subject: [PATCH 06/21] feat: add tooltip to surprise me button
---
.../SurpriseMeButton/SurpriseMeButton.tsx | 30 +++++++++++++------
1 file changed, 21 insertions(+), 9 deletions(-)
diff --git a/frontend/app/components/home/SurpriseMeButton/SurpriseMeButton.tsx b/frontend/app/components/home/SurpriseMeButton/SurpriseMeButton.tsx
index af1fca1..b2819e5 100644
--- a/frontend/app/components/home/SurpriseMeButton/SurpriseMeButton.tsx
+++ b/frontend/app/components/home/SurpriseMeButton/SurpriseMeButton.tsx
@@ -4,6 +4,11 @@ import { ShuffleIcon } from "lucide-react";
import { Button } from "~/components/ui/Button";
import { Spinner } from "~/components/ui/Spinner";
import { toast } from "~/components/ui/Toast";
+import {
+ Tooltip,
+ TooltipContent,
+ TooltipTrigger,
+} from "~/components/ui/Tooltip";
import { SEARCH_BOOKS } from "~/hooks/useSearchBooks";
interface SurpriseMeButtonProps {
@@ -37,15 +42,22 @@ function SurpriseMeButton({ bookCount }: SurpriseMeButtonProps) {
}
return (
- void openRandomBook()}
- >
- {loading ? : }
- Surprise me
-
+
+ void openRandomBook()}
+ />
+ }
+ >
+ {loading ? : }
+ Surprise me
+
+ Open a random book from the library
+
);
}
From 709afa77ccfedb12d49eab35603e3eca468727c2 Mon Sep 17 00:00:00 2001
From: Martin Alexander Kaminski
Date: Wed, 4 Nov 2026 21:52:02 +0100
Subject: [PATCH 07/21] feat: add Tabs component from shadcn
---
frontend/app/components/ui/Tabs.tsx | 79 +++++++++++++++++++++++++++++
1 file changed, 79 insertions(+)
create mode 100644 frontend/app/components/ui/Tabs.tsx
diff --git a/frontend/app/components/ui/Tabs.tsx b/frontend/app/components/ui/Tabs.tsx
new file mode 100644
index 0000000..564e02b
--- /dev/null
+++ b/frontend/app/components/ui/Tabs.tsx
@@ -0,0 +1,79 @@
+import { Tabs as TabsPrimitive } from "@base-ui/react/tabs";
+import { cva, type VariantProps } from "class-variance-authority";
+import { cn } from "cn";
+
+function Tabs({
+ className,
+ orientation = "horizontal",
+ ...props
+}: TabsPrimitive.Root.Props) {
+ return (
+
+ );
+}
+
+const tabsListVariants = cva(
+ "group/tabs-list inline-flex w-fit items-center justify-center rounded-lg p-[3px] text-muted-foreground group-data-horizontal/tabs:h-8 group-data-vertical/tabs:h-fit group-data-vertical/tabs:flex-col data-[variant=line]:rounded-none",
+ {
+ variants: {
+ variant: {
+ default: "bg-muted",
+ line: "gap-1 bg-transparent",
+ },
+ },
+ defaultVariants: {
+ variant: "default",
+ },
+ },
+);
+
+function TabsList({
+ className,
+ variant = "default",
+ ...props
+}: TabsPrimitive.List.Props & VariantProps) {
+ return (
+
+ );
+}
+
+function TabsTrigger({ className, ...props }: TabsPrimitive.Tab.Props) {
+ return (
+
+ );
+}
+
+function TabsContent({ className, ...props }: TabsPrimitive.Panel.Props) {
+ return (
+
+ );
+}
+
+export { Tabs, TabsList, TabsTrigger, TabsContent, tabsListVariants };
From cf0f2c935bcb44ce39bc595e4428622a105b78dc Mon Sep 17 00:00:00 2001
From: Martin Alexander Kaminski
Date: Wed, 4 Nov 2026 21:54:38 +0100
Subject: [PATCH 08/21] feat: show top 3 genres in for you section on homepage
---
.../home/ForYouSection/ForYouSection.tsx | 107 +++++++++---
frontend/app/hooks/useFavoriteBooks.ts | 4 +-
frontend/app/routes/home.test.tsx | 155 ++++++++++++++----
3 files changed, 214 insertions(+), 52 deletions(-)
diff --git a/frontend/app/components/home/ForYouSection/ForYouSection.tsx b/frontend/app/components/home/ForYouSection/ForYouSection.tsx
index fa1da69..3307235 100644
--- a/frontend/app/components/home/ForYouSection/ForYouSection.tsx
+++ b/frontend/app/components/home/ForYouSection/ForYouSection.tsx
@@ -1,36 +1,80 @@
+import { useState } from "react";
import { Link } from "react-router";
import { ArrowRightIcon } from "lucide-react";
import { BookCard } from "~/components/BookCard/BookCard";
import { RevealSection } from "~/components/home/RevealSection/RevealSection";
+import { Skeleton } from "~/components/ui/Skeleton";
+import { Tabs, TabsContent, TabsList, TabsTrigger } from "~/components/ui/Tabs";
import { useFavoriteBooks, useFavoriteStatus } from "~/hooks/useFavoriteBooks";
import { useSearchBooks } from "~/hooks/useSearchBooks";
const RECOMMENDATION_LIMIT = 4;
+const BOOK_GRID =
+ "grid grid-cols-4 gap-4 max-[1200px]:grid-cols-3 max-[1000px]:grid-cols-2 max-[600px]:grid-cols-1";
function ForYouSection() {
- const { topGenres } = useFavoriteBooks({ page: 1 });
- const { isFavorite } = useFavoriteStatus({ enabled: true });
- const topGenre = topGenres.at(0);
+ const favorites = useFavoriteBooks({ page: 1 });
+ const favoriteStatus = useFavoriteStatus({ enabled: true });
+ const [selectedGenre, setSelectedGenre] = useState();
- const { books } = useSearchBooks({
- filters: { genres: topGenre ? [topGenre] : undefined },
+ // Saving a book refetches the favorites.
+ // We keep the initial favorites so things do not change while the user is adding/removing favorites.
+ const [initialFavorites, setInitialFavorites] = useState<{
+ topGenres: string[];
+ bookIds: number[];
+ }>();
+
+ if (!initialFavorites && !favorites.loading && !favoriteStatus.loading) {
+ setInitialFavorites({
+ topGenres: favorites.topGenres,
+ bookIds: favoriteStatus.favoriteBookIds,
+ });
+ }
+
+ const topGenres = initialFavorites?.topGenres ?? [];
+ const genre = selectedGenre ?? topGenres.at(0);
+
+ const { books, loading } = useSearchBooks({
+ filters: { genres: genre ? [genre] : undefined },
title: "",
// Fetch extra, since books the user has already saved are left out.
limit: RECOMMENDATION_LIMIT * 3,
offset: 0,
sort: "rating_desc",
- enabled: topGenre !== undefined,
+ enabled: genre !== undefined,
});
- const recommendations = (books ?? [])
- .filter((book) => !isFavorite(book.id))
- .slice(0, RECOMMENDATION_LIMIT);
-
// Users without favorites have no taste to base recommendations on yet.
- if (!topGenre || recommendations.length === 0) {
+ if (!genre) {
return null;
}
+ const recommendations = (books ?? [])
+ .filter((book) => !initialFavorites?.bookIds.includes(Number(book.id)))
+ .slice(0, RECOMMENDATION_LIMIT);
+
+ const recommendationList = loading ? (
+
+ {Array.from({ length: RECOMMENDATION_LIMIT }, (_, index) => (
+
+
+
+ ))}
+
+ ) : recommendations.length > 0 ? (
+
+ {recommendations.map((book) => (
+
+
+
+ ))}
+
+ ) : (
+
+ You have already saved the top {genre} books. Nice taste!
+
+ );
+
return (
- Because you like {topGenre}
+ Because you like {genre}
- Highly rated books from your favorite genre.
+ Highly rated books from your favorite genres.
- More {topGenre}
+ More {genre}
-
- {recommendations.map((book) => (
-
-
-
- ))}
-
+ {topGenres.length > 1 ? (
+ {
+ if (typeof value === "string") {
+ setSelectedGenre(value);
+ }
+ }}
+ className="gap-6"
+ >
+
+ {topGenres.map((topGenre) => (
+
+ {topGenre}
+
+ ))}
+
+ {topGenres.map((topGenre) => (
+
+ {recommendationList}
+
+ ))}
+
+ ) : (
+ recommendationList
+ )}
);
}
diff --git a/frontend/app/hooks/useFavoriteBooks.ts b/frontend/app/hooks/useFavoriteBooks.ts
index 7f10458..3d1c760 100644
--- a/frontend/app/hooks/useFavoriteBooks.ts
+++ b/frontend/app/hooks/useFavoriteBooks.ts
@@ -97,7 +97,7 @@ function useFavoriteBooks({
}
function useFavoriteStatus({ enabled }: { enabled: boolean }) {
- const { data } = useQuery(FAVORITE_BOOK_IDS, { skip: !enabled });
+ const { data, loading } = useQuery(FAVORITE_BOOK_IDS, { skip: !enabled });
const favoriteBookIds = data?.favoriteBookIds ?? [];
const options = {
@@ -114,6 +114,8 @@ function useFavoriteStatus({ enabled }: { enabled: boolean }) {
);
return {
+ favoriteBookIds,
+ loading,
isFavorite: (bookId: string) => favoriteBookIds.includes(Number(bookId)),
addFavoriteBook: (bookId: string) =>
addFavoriteBook({ variables: { bookId: Number(bookId) } }),
diff --git a/frontend/app/routes/home.test.tsx b/frontend/app/routes/home.test.tsx
index 2c53df2..51bbcde 100644
--- a/frontend/app/routes/home.test.tsx
+++ b/frontend/app/routes/home.test.tsx
@@ -3,7 +3,11 @@ import { useParams } from "react-router";
import { screen, waitFor, within } from "@testing-library/react";
import userEvent from "@testing-library/user-event";
import { authClient } from "~/api/auth";
-import { FAVORITE_BOOK_IDS, FAVORITE_BOOKS } from "~/hooks/useFavoriteBooks";
+import {
+ ADD_FAVORITE_BOOK,
+ FAVORITE_BOOK_IDS,
+ FAVORITE_BOOKS,
+} from "~/hooks/useFavoriteBooks";
import HomePage from "~/routes/home";
import BooksPage from "~/routes/books";
import { bookFiltersMock, searchBooksMock } from "~/test/mocks";
@@ -26,6 +30,38 @@ const routes = [
{ path: "/book/:bookId", Component: BookPageStub },
];
+// The user's saved book and top genres, used for the recommendations.
+const [savedBook] = apiSearchBooks;
+const favoritesMocks = (favoriteGenres: string[], bookIds = [savedBook.id]) => [
+ {
+ request: { query: FAVORITE_BOOKS, variables: { limit: 12, offset: 0 } },
+ result: {
+ data: {
+ favoriteBooks: {
+ __typename: "BookSearchResult",
+ totalCount: 1,
+ books: [savedBook],
+ },
+ favoriteGenres,
+ },
+ },
+ },
+ {
+ request: { query: FAVORITE_BOOK_IDS },
+ result: { data: { favoriteBookIds: bookIds } },
+ },
+];
+
+const recommendationsMock = (genre: string) =>
+ searchBooksMock({
+ title: "",
+ genres: [genre],
+ sortBy: "RATING",
+ sortDirection: "DESC",
+ limit: 12,
+ offset: 0,
+ });
+
const topRatedMock = searchBooksMock({
title: "",
sortBy: "RATING",
@@ -119,36 +155,12 @@ describe("HomePage", () => {
it("recommends books from the user's favorite genre that they have not saved", async () => {
vi.mocked(authClient.useSession).mockReturnValue(loggedIn);
- const [savedBook] = apiSearchBooks;
renderRoutes(routes, {
mocks: [
topRatedMock,
bookFiltersMock(),
- {
- request: { query: FAVORITE_BOOKS, variables: { limit: 12, offset: 0 } },
- result: {
- data: {
- favoriteBooks: {
- __typename: "BookSearchResult",
- totalCount: 1,
- books: [savedBook],
- },
- favoriteGenres: ["Fantasy"],
- },
- },
- },
- {
- request: { query: FAVORITE_BOOK_IDS },
- result: { data: { favoriteBookIds: [savedBook.id] } },
- },
- searchBooksMock({
- title: "",
- genres: ["Fantasy"],
- sortBy: "RATING",
- sortDirection: "DESC",
- limit: 12,
- offset: 0,
- }),
+ ...favoritesMocks(["Fantasy"]),
+ recommendationsMock("Fantasy"),
],
});
@@ -156,7 +168,7 @@ describe("HomePage", () => {
name: "Because you like Fantasy",
});
expect(
- within(forYou).getAllByRole("link", { name: /View details for/ }),
+ await within(forYou).findAllByRole("link", { name: /View details for/ }),
).toHaveLength(2);
expect(within(forYou).queryByText(savedBook.title)).not.toBeInTheDocument();
expect(
@@ -172,7 +184,9 @@ describe("HomePage", () => {
topRatedMock,
bookFiltersMock(),
// 0.5 of 3 books is offset 1, the second book.
- searchBooksMock({ title: "", limit: 1, offset: 1 }, [apiSearchBooks[1]]),
+ searchBooksMock({ title: "", limit: 1, offset: 1 }, [
+ apiSearchBooks[1],
+ ]),
],
});
@@ -186,4 +200,87 @@ describe("HomePage", () => {
await screen.findByRole("heading", { name: "Book 2" }),
).toBeInTheDocument();
});
+
+ it("switches the recommendations between the user's favorite genres", async () => {
+ vi.mocked(authClient.useSession).mockReturnValue(loggedIn);
+ const user = userEvent.setup();
+ renderRoutes(routes, {
+ mocks: [
+ topRatedMock,
+ bookFiltersMock(),
+ ...favoritesMocks(["Fantasy", "Romance"]),
+ recommendationsMock("Fantasy"),
+ recommendationsMock("Romance"),
+ ],
+ });
+
+ const romance = await screen.findByRole("tab", { name: "Romance" });
+ expect(romance).toHaveAttribute("aria-selected", "false");
+ await user.click(romance);
+
+ expect(
+ await screen.findByRole("heading", { name: "Because you like Romance" }),
+ ).toBeInTheDocument();
+ expect(romance).toHaveAttribute("aria-selected", "true");
+ expect(screen.getByRole("link", { name: /More Romance/ })).toHaveAttribute(
+ "href",
+ "/books?genres=Romance&sort=rating_desc",
+ );
+ });
+
+ it("explains the surprise me button in a tooltip", async () => {
+ const user = userEvent.setup();
+ renderRoutes(routes, { mocks: [topRatedMock, bookFiltersMock()] });
+
+ const button = screen.getByRole("button", { name: "Surprise me" });
+ // Disabled until the number of books has loaded.
+ await waitFor(() => {
+ expect(button).toBeEnabled();
+ });
+ await user.hover(button);
+
+ expect(
+ await screen.findByText("Open a random book from the library"),
+ ).toBeInTheDocument();
+ });
+
+ it("keeps the recommendations in place when the user saves one of them", async () => {
+ vi.mocked(authClient.useSession).mockReturnValue(loggedIn);
+ const user = userEvent.setup();
+ renderRoutes(routes, {
+ mocks: [
+ topRatedMock,
+ bookFiltersMock(),
+ ...favoritesMocks(["Fantasy"]),
+ recommendationsMock("Fantasy"),
+ {
+ request: { query: ADD_FAVORITE_BOOK, variables: { bookId: 2 } },
+ result: { data: { addFavoriteBook: { __typename: "Book", id: 2 } } },
+ },
+ // After saving, the user's top genre changes as well.
+ ...favoritesMocks(["Romance"], [savedBook.id, 2]),
+ ],
+ });
+
+ const forYou = await screen.findByRole("region", {
+ name: "Because you like Fantasy",
+ });
+ await user.click(
+ await within(forYou).findByRole("button", {
+ name: "Add Before They Are Hanged to favorites",
+ }),
+ );
+
+ expect(
+ await within(forYou).findByRole("button", {
+ name: "Remove Before They Are Hanged from favorites",
+ }),
+ ).toBeInTheDocument();
+ expect(
+ screen.getByRole("heading", { name: "Because you like Fantasy" }),
+ ).toBeInTheDocument();
+ expect(
+ within(forYou).getAllByRole("link", { name: /View details for/ }),
+ ).toHaveLength(2);
+ });
});
From d2ed0fa0dd19723ec3174d319abd625bea3b47a1 Mon Sep 17 00:00:00 2001
From: Martin Alexander Kaminski
Date: Wed, 4 Nov 2026 21:54:48 +0100
Subject: [PATCH 09/21] chore: run Prettier on files
---
.../SurpriseMeButton/SurpriseMeButton.tsx | 6 ++++-
frontend/app/components/ui/Button.tsx | 3 ++-
frontend/app/components/ui/Popover.tsx | 22 +++++++++----------
3 files changed, 18 insertions(+), 13 deletions(-)
diff --git a/frontend/app/components/home/SurpriseMeButton/SurpriseMeButton.tsx b/frontend/app/components/home/SurpriseMeButton/SurpriseMeButton.tsx
index b2819e5..cd96320 100644
--- a/frontend/app/components/home/SurpriseMeButton/SurpriseMeButton.tsx
+++ b/frontend/app/components/home/SurpriseMeButton/SurpriseMeButton.tsx
@@ -53,7 +53,11 @@ function SurpriseMeButton({ bookCount }: SurpriseMeButtonProps) {
/>
}
>
- {loading ? : }
+ {loading ? (
+
+ ) : (
+
+ )}
Surprise me
Open a random book from the library
diff --git a/frontend/app/components/ui/Button.tsx b/frontend/app/components/ui/Button.tsx
index 51adf8c..4b65e65 100644
--- a/frontend/app/components/ui/Button.tsx
+++ b/frontend/app/components/ui/Button.tsx
@@ -7,7 +7,8 @@ const buttonVariants = cva(
{
variants: {
variant: {
- default: "bg-primary text-primary-foreground border-transparent hover:bg-primary/80",
+ default:
+ "bg-primary text-primary-foreground border-transparent hover:bg-primary/80",
outline:
"border-border bg-card hover:bg-muted hover:text-foreground aria-expanded:bg-muted aria-expanded:text-foreground dark:border-input dark:bg-input/30 dark:hover:bg-input/50",
secondary:
diff --git a/frontend/app/components/ui/Popover.tsx b/frontend/app/components/ui/Popover.tsx
index 904781c..36d6320 100644
--- a/frontend/app/components/ui/Popover.tsx
+++ b/frontend/app/components/ui/Popover.tsx
@@ -1,13 +1,13 @@
-import * as React from "react"
-import { Popover as PopoverPrimitive } from "@base-ui/react/popover"
-import { cn } from "cn"
+import * as React from "react";
+import { Popover as PopoverPrimitive } from "@base-ui/react/popover";
+import { cn } from "cn";
function Popover({ ...props }: PopoverPrimitive.Root.Props) {
- return
+ return ;
}
function PopoverTrigger({ ...props }: PopoverPrimitive.Trigger.Props) {
- return
+ return ;
}
function PopoverContent({
@@ -35,13 +35,13 @@ function PopoverContent({
data-slot="popover-content"
className={cn(
"z-50 flex w-72 origin-(--transform-origin) flex-col gap-2.5 rounded-lg bg-popover p-2.5 text-sm text-popover-foreground shadow-md ring-1 ring-foreground/10 outline-hidden duration-100 data-[side=bottom]:slide-in-from-top-2 data-[side=inline-end]:slide-in-from-left-2 data-[side=inline-start]:slide-in-from-right-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95",
- className
+ className,
)}
{...props}
/>
- )
+ );
}
function PopoverHeader({ className, ...props }: React.ComponentProps<"div">) {
@@ -51,7 +51,7 @@ function PopoverHeader({ className, ...props }: React.ComponentProps<"div">) {
className={cn("flex flex-col gap-0.5 text-sm", className)}
{...props}
/>
- )
+ );
}
function PopoverTitle({ className, ...props }: PopoverPrimitive.Title.Props) {
@@ -61,7 +61,7 @@ function PopoverTitle({ className, ...props }: PopoverPrimitive.Title.Props) {
className={cn("font-medium", className)}
{...props}
/>
- )
+ );
}
function PopoverDescription({
@@ -74,7 +74,7 @@ function PopoverDescription({
className={cn("text-muted-foreground", className)}
{...props}
/>
- )
+ );
}
export {
@@ -84,4 +84,4 @@ export {
PopoverHeader,
PopoverTitle,
PopoverTrigger,
-}
+};
From c1b4a00b581479837c79ab157eee81ef8929714b Mon Sep 17 00:00:00 2001
From: Martin Alexander Kaminski
Date: Wed, 4 Nov 2026 22:04:39 +0100
Subject: [PATCH 10/21] fix: browse the correct list after moving from homepage
---
frontend/app/components/BookCard/BookCard.tsx | 8 ++++++--
.../home/ForYouSection/ForYouSection.tsx | 15 +++++++--------
.../home/TopRatedSection/TopRatedSection.tsx | 7 +++++--
frontend/app/routes/home.test.tsx | 9 +++++++++
4 files changed, 27 insertions(+), 12 deletions(-)
diff --git a/frontend/app/components/BookCard/BookCard.tsx b/frontend/app/components/BookCard/BookCard.tsx
index b2d2507..af8d4bb 100644
--- a/frontend/app/components/BookCard/BookCard.tsx
+++ b/frontend/app/components/BookCard/BookCard.tsx
@@ -6,13 +6,17 @@ import type { SearchBook } from "~/hooks/useSearchBooks";
interface BookCardProps {
book: SearchBook;
+ // Overwrite the search params for the book details page, for example when coming from the homepage.
+ searchListParams?: string;
}
-function BookCard({ book }: BookCardProps) {
+function BookCard({ book, searchListParams }: BookCardProps) {
const [searchParams] = useSearchParams();
const location = useLocation();
- const nextSearchParams = new URLSearchParams(searchParams);
+ const nextSearchParams = new URLSearchParams(
+ searchListParams ?? searchParams,
+ );
if (location.pathname === "/profile") {
nextSearchParams.set("origin", "favorites");
diff --git a/frontend/app/components/home/ForYouSection/ForYouSection.tsx b/frontend/app/components/home/ForYouSection/ForYouSection.tsx
index 3307235..3b06817 100644
--- a/frontend/app/components/home/ForYouSection/ForYouSection.tsx
+++ b/frontend/app/components/home/ForYouSection/ForYouSection.tsx
@@ -53,6 +53,11 @@ function ForYouSection() {
.filter((book) => !initialFavorites?.bookIds.includes(Number(book.id)))
.slice(0, RECOMMENDATION_LIMIT);
+ const genreSearch = new URLSearchParams({
+ genres: genre,
+ sort: "rating_desc",
+ }).toString();
+
const recommendationList = loading ? (
{Array.from({ length: RECOMMENDATION_LIMIT }, (_, index) => (
@@ -65,7 +70,7 @@ function ForYouSection() {
{recommendations.map((book) => (
-
+
))}
@@ -90,13 +95,7 @@ function ForYouSection() {
More {genre}
diff --git a/frontend/app/components/home/TopRatedSection/TopRatedSection.tsx b/frontend/app/components/home/TopRatedSection/TopRatedSection.tsx
index 53910ca..26bdb3e 100644
--- a/frontend/app/components/home/TopRatedSection/TopRatedSection.tsx
+++ b/frontend/app/components/home/TopRatedSection/TopRatedSection.tsx
@@ -5,6 +5,9 @@ import { RevealSection } from "~/components/home/RevealSection/RevealSection";
import { Skeleton } from "~/components/ui/Skeleton";
import type { SearchBook } from "~/hooks/useSearchBooks";
+// The same books on the books page, for "See all" and for browsing from a book.
+const TOP_RATED_SEARCH = "?sort=rating_desc";
+
function TopRatedSection({
books,
loading,
@@ -29,7 +32,7 @@ function TopRatedSection({
See all
@@ -44,7 +47,7 @@ function TopRatedSection({
{hasBooks
? books.map((book) => (
-
+
))
: Array.from({ length: 4 }, (_, index) => (
diff --git a/frontend/app/routes/home.test.tsx b/frontend/app/routes/home.test.tsx
index 51bbcde..5a6c7b3 100644
--- a/frontend/app/routes/home.test.tsx
+++ b/frontend/app/routes/home.test.tsx
@@ -77,6 +77,10 @@ describe("HomePage", () => {
expect(
await screen.findAllByRole("link", { name: /View details for/ }),
).toHaveLength(3);
+ // The details page browses the same top rated list with previous/next.
+ expect(
+ screen.getByRole("link", { name: "View details for The Blade Itself" }),
+ ).toHaveAttribute("href", "/book/1?sort=rating_desc");
});
it("searches for books on the books page", async () => {
@@ -171,6 +175,11 @@ describe("HomePage", () => {
await within(forYou).findAllByRole("link", { name: /View details for/ }),
).toHaveLength(2);
expect(within(forYou).queryByText(savedBook.title)).not.toBeInTheDocument();
+ expect(
+ within(forYou).getByRole("link", {
+ name: "View details for Good Omens",
+ }),
+ ).toHaveAttribute("href", "/book/3?genres=Fantasy&sort=rating_desc");
expect(
screen.queryByRole("region", { name: "Start your reading list" }),
).not.toBeInTheDocument();
From 60c0ee224be095ddcf8ee15104cb0c3875b35d0e Mon Sep 17 00:00:00 2001
From: Martin Alexander Kaminski
Date: Wed, 4 Nov 2026 22:17:08 +0100
Subject: [PATCH 11/21] feat: add minRatings filter to searchBooks
---
backend/src/schema/books/resolvers/Query/searchBooks.ts | 2 ++
backend/src/schema/books/schema.graphql | 1 +
backend/src/schema/schema.generated.graphqls | 2 +-
backend/src/schema/typeDefs.generated.ts | 2 +-
backend/src/schema/types.generated.ts | 1 +
frontend/app/api/types/graphql.generated.ts | 5 +++--
frontend/app/api/types/index.ts | 1 +
7 files changed, 10 insertions(+), 4 deletions(-)
diff --git a/backend/src/schema/books/resolvers/Query/searchBooks.ts b/backend/src/schema/books/resolvers/Query/searchBooks.ts
index f4f5520..fe56f2c 100644
--- a/backend/src/schema/books/resolvers/Query/searchBooks.ts
+++ b/backend/src/schema/books/resolvers/Query/searchBooks.ts
@@ -31,6 +31,8 @@ export const searchBooks: NonNullable = async (
conditions.push(ilike(books.publisher, `%${args.publisher}%`));
if (args.minPages != null) conditions.push(gte(books.pages, args.minPages));
if (args.maxPages != null) conditions.push(lte(books.pages, args.maxPages));
+ if (args.minRatings != null)
+ conditions.push(gte(books.numRatings, args.minRatings));
const genreConditions: SQL[] = [];
diff --git a/backend/src/schema/books/schema.graphql b/backend/src/schema/books/schema.graphql
index 82b7ff5..454d2b3 100644
--- a/backend/src/schema/books/schema.graphql
+++ b/backend/src/schema/books/schema.graphql
@@ -43,6 +43,7 @@ extend type Query {
genres: [String!]
minPages: Int
maxPages: Int
+ minRatings: Int
limit: Int = 12
offset: Int = 0
sortBy: BookSortField = ID
diff --git a/backend/src/schema/schema.generated.graphqls b/backend/src/schema/schema.generated.graphqls
index f1b4060..492345f 100644
--- a/backend/src/schema/schema.generated.graphqls
+++ b/backend/src/schema/schema.generated.graphqls
@@ -48,7 +48,7 @@ type Query {
favoriteGenres(limit: Int = 3): [String!]!
genres: [String!]!
languages: [String!]!
- searchBooks(author: String, bookFormat: String, genres: [String!], language: String, limit: Int = 12, maxPages: Int, minPages: Int, offset: Int = 0, publisher: String, series: String, sortBy: BookSortField = ID, sortDirection: SortDirection = ASC, title: String): BookSearchResult!
+ searchBooks(author: String, bookFormat: String, genres: [String!], language: String, limit: Int = 12, maxPages: Int, minPages: Int, minRatings: Int, offset: Int = 0, publisher: String, series: String, sortBy: BookSortField = ID, sortDirection: SortDirection = ASC, title: String): BookSearchResult!
}
enum SortDirection {
diff --git a/backend/src/schema/typeDefs.generated.ts b/backend/src/schema/typeDefs.generated.ts
index d88abf4..98c2373 100644
--- a/backend/src/schema/typeDefs.generated.ts
+++ b/backend/src/schema/typeDefs.generated.ts
@@ -1,2 +1,2 @@
import type { DocumentNode } from 'graphql';
- export const typeDefs = {"kind":"Document","definitions":[{"name":{"kind":"Name","value":"Query"},"kind":"ObjectTypeDefinition","fields":[{"kind":"FieldDefinition","name":{"kind":"Name","value":"book"},"arguments":[{"kind":"InputValueDefinition","name":{"kind":"Name","value":"id"},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"Int"}}}}],"type":{"kind":"NamedType","name":{"kind":"Name","value":"Book"}}},{"kind":"FieldDefinition","name":{"kind":"Name","value":"genres"},"type":{"kind":"NonNullType","type":{"kind":"ListType","type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}}}},{"kind":"FieldDefinition","name":{"kind":"Name","value":"languages"},"type":{"kind":"NonNullType","type":{"kind":"ListType","type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}}}},{"kind":"FieldDefinition","name":{"kind":"Name","value":"bookFormats"},"type":{"kind":"NonNullType","type":{"kind":"ListType","type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}}}},{"kind":"FieldDefinition","name":{"kind":"Name","value":"searchBooks"},"arguments":[{"kind":"InputValueDefinition","name":{"kind":"Name","value":"title"},"type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}},{"kind":"InputValueDefinition","name":{"kind":"Name","value":"series"},"type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}},{"kind":"InputValueDefinition","name":{"kind":"Name","value":"author"},"type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}},{"kind":"InputValueDefinition","name":{"kind":"Name","value":"language"},"type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}},{"kind":"InputValueDefinition","name":{"kind":"Name","value":"bookFormat"},"type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}},{"kind":"InputValueDefinition","name":{"kind":"Name","value":"publisher"},"type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}},{"kind":"InputValueDefinition","name":{"kind":"Name","value":"genres"},"type":{"kind":"ListType","type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}}},{"kind":"InputValueDefinition","name":{"kind":"Name","value":"minPages"},"type":{"kind":"NamedType","name":{"kind":"Name","value":"Int"}}},{"kind":"InputValueDefinition","name":{"kind":"Name","value":"maxPages"},"type":{"kind":"NamedType","name":{"kind":"Name","value":"Int"}}},{"kind":"InputValueDefinition","name":{"kind":"Name","value":"limit"},"type":{"kind":"NamedType","name":{"kind":"Name","value":"Int"}},"defaultValue":{"kind":"IntValue","value":"12"}},{"kind":"InputValueDefinition","name":{"kind":"Name","value":"offset"},"type":{"kind":"NamedType","name":{"kind":"Name","value":"Int"}},"defaultValue":{"kind":"IntValue","value":"0"}},{"kind":"InputValueDefinition","name":{"kind":"Name","value":"sortBy"},"type":{"kind":"NamedType","name":{"kind":"Name","value":"BookSortField"}},"defaultValue":{"kind":"EnumValue","value":"ID"}},{"kind":"InputValueDefinition","name":{"kind":"Name","value":"sortDirection"},"type":{"kind":"NamedType","name":{"kind":"Name","value":"SortDirection"}},"defaultValue":{"kind":"EnumValue","value":"ASC"}}],"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"BookSearchResult"}}}},{"kind":"FieldDefinition","description":{"kind":"StringValue","value":"Favorite books of the logged-in user, newest first.","block":false},"name":{"kind":"Name","value":"favoriteBooks"},"arguments":[{"kind":"InputValueDefinition","name":{"kind":"Name","value":"limit"},"type":{"kind":"NamedType","name":{"kind":"Name","value":"Int"}},"defaultValue":{"kind":"IntValue","value":"12"}},{"kind":"InputValueDefinition","name":{"kind":"Name","value":"offset"},"type":{"kind":"NamedType","name":{"kind":"Name","value":"Int"}},"defaultValue":{"kind":"IntValue","value":"0"}}],"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"BookSearchResult"}}}},{"kind":"FieldDefinition","description":{"kind":"StringValue","value":"ID of every book the logged-in user that has been added to their favorites.","block":false},"name":{"kind":"Name","value":"favoriteBookIds"},"type":{"kind":"NonNullType","type":{"kind":"ListType","type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"Int"}}}}}},{"kind":"FieldDefinition","description":{"kind":"StringValue","value":"The logged-in user's most common genres among their favorite books.","block":false},"name":{"kind":"Name","value":"favoriteGenres"},"arguments":[{"kind":"InputValueDefinition","name":{"kind":"Name","value":"limit"},"type":{"kind":"NamedType","name":{"kind":"Name","value":"Int"}},"defaultValue":{"kind":"IntValue","value":"3"}}],"type":{"kind":"NonNullType","type":{"kind":"ListType","type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}}}}],"directives":[],"interfaces":[]},{"name":{"kind":"Name","value":"Mutation"},"kind":"ObjectTypeDefinition","fields":[{"kind":"FieldDefinition","name":{"kind":"Name","value":"addFavoriteBook"},"arguments":[{"kind":"InputValueDefinition","name":{"kind":"Name","value":"bookId"},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"Int"}}}}],"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"Book"}}}},{"kind":"FieldDefinition","name":{"kind":"Name","value":"removeFavoriteBook"},"arguments":[{"kind":"InputValueDefinition","name":{"kind":"Name","value":"bookId"},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"Int"}}}}],"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"Boolean"}}}}],"directives":[],"interfaces":[]},{"kind":"ObjectTypeDefinition","name":{"kind":"Name","value":"Book"},"fields":[{"kind":"FieldDefinition","name":{"kind":"Name","value":"id"},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"Int"}}}},{"kind":"FieldDefinition","name":{"kind":"Name","value":"isbn"},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}},{"kind":"FieldDefinition","name":{"kind":"Name","value":"title"},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}},{"kind":"FieldDefinition","name":{"kind":"Name","value":"series"},"type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}},{"kind":"FieldDefinition","name":{"kind":"Name","value":"author"},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}},{"kind":"FieldDefinition","name":{"kind":"Name","value":"description"},"type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}},{"kind":"FieldDefinition","name":{"kind":"Name","value":"language"},"type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}},{"kind":"FieldDefinition","name":{"kind":"Name","value":"bookFormat"},"type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}},{"kind":"FieldDefinition","name":{"kind":"Name","value":"edition"},"type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}},{"kind":"FieldDefinition","name":{"kind":"Name","value":"pages"},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"Int"}}}},{"kind":"FieldDefinition","name":{"kind":"Name","value":"publisher"},"type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}},{"kind":"FieldDefinition","name":{"kind":"Name","value":"publishDate"},"type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}},{"kind":"FieldDefinition","name":{"kind":"Name","value":"coverImgUrl"},"type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}},{"kind":"FieldDefinition","name":{"kind":"Name","value":"genres"},"type":{"kind":"NonNullType","type":{"kind":"ListType","type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}}}},{"kind":"FieldDefinition","name":{"kind":"Name","value":"rating"},"type":{"kind":"NamedType","name":{"kind":"Name","value":"Float"}}},{"kind":"FieldDefinition","name":{"kind":"Name","value":"numRatings"},"type":{"kind":"NamedType","name":{"kind":"Name","value":"Int"}}}]},{"kind":"EnumTypeDefinition","name":{"kind":"Name","value":"BookSortField"},"values":[{"kind":"EnumValueDefinition","name":{"kind":"Name","value":"ID"}},{"kind":"EnumValueDefinition","name":{"kind":"Name","value":"RATING"}}]},{"kind":"EnumTypeDefinition","name":{"kind":"Name","value":"SortDirection"},"values":[{"kind":"EnumValueDefinition","name":{"kind":"Name","value":"ASC"}},{"kind":"EnumValueDefinition","name":{"kind":"Name","value":"DESC"}}]},{"kind":"ObjectTypeDefinition","name":{"kind":"Name","value":"BookSearchResult"},"fields":[{"kind":"FieldDefinition","name":{"kind":"Name","value":"books"},"type":{"kind":"NonNullType","type":{"kind":"ListType","type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"Book"}}}}}},{"kind":"FieldDefinition","name":{"kind":"Name","value":"totalCount"},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"Int"}}}}]},{"kind":"SchemaDefinition","operationTypes":[{"kind":"OperationTypeDefinition","type":{"kind":"NamedType","name":{"kind":"Name","value":"Query"}},"operation":"query"},{"kind":"OperationTypeDefinition","type":{"kind":"NamedType","name":{"kind":"Name","value":"Mutation"}},"operation":"mutation"}]}]} as unknown as DocumentNode
\ No newline at end of file
+ export const typeDefs = {"kind":"Document","definitions":[{"name":{"kind":"Name","value":"Query"},"kind":"ObjectTypeDefinition","fields":[{"kind":"FieldDefinition","name":{"kind":"Name","value":"book"},"arguments":[{"kind":"InputValueDefinition","name":{"kind":"Name","value":"id"},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"Int"}}}}],"type":{"kind":"NamedType","name":{"kind":"Name","value":"Book"}}},{"kind":"FieldDefinition","name":{"kind":"Name","value":"genres"},"type":{"kind":"NonNullType","type":{"kind":"ListType","type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}}}},{"kind":"FieldDefinition","name":{"kind":"Name","value":"languages"},"type":{"kind":"NonNullType","type":{"kind":"ListType","type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}}}},{"kind":"FieldDefinition","name":{"kind":"Name","value":"bookFormats"},"type":{"kind":"NonNullType","type":{"kind":"ListType","type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}}}},{"kind":"FieldDefinition","name":{"kind":"Name","value":"searchBooks"},"arguments":[{"kind":"InputValueDefinition","name":{"kind":"Name","value":"title"},"type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}},{"kind":"InputValueDefinition","name":{"kind":"Name","value":"series"},"type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}},{"kind":"InputValueDefinition","name":{"kind":"Name","value":"author"},"type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}},{"kind":"InputValueDefinition","name":{"kind":"Name","value":"language"},"type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}},{"kind":"InputValueDefinition","name":{"kind":"Name","value":"bookFormat"},"type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}},{"kind":"InputValueDefinition","name":{"kind":"Name","value":"publisher"},"type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}},{"kind":"InputValueDefinition","name":{"kind":"Name","value":"genres"},"type":{"kind":"ListType","type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}}},{"kind":"InputValueDefinition","name":{"kind":"Name","value":"minPages"},"type":{"kind":"NamedType","name":{"kind":"Name","value":"Int"}}},{"kind":"InputValueDefinition","name":{"kind":"Name","value":"maxPages"},"type":{"kind":"NamedType","name":{"kind":"Name","value":"Int"}}},{"kind":"InputValueDefinition","name":{"kind":"Name","value":"minRatings"},"type":{"kind":"NamedType","name":{"kind":"Name","value":"Int"}}},{"kind":"InputValueDefinition","name":{"kind":"Name","value":"limit"},"type":{"kind":"NamedType","name":{"kind":"Name","value":"Int"}},"defaultValue":{"kind":"IntValue","value":"12"}},{"kind":"InputValueDefinition","name":{"kind":"Name","value":"offset"},"type":{"kind":"NamedType","name":{"kind":"Name","value":"Int"}},"defaultValue":{"kind":"IntValue","value":"0"}},{"kind":"InputValueDefinition","name":{"kind":"Name","value":"sortBy"},"type":{"kind":"NamedType","name":{"kind":"Name","value":"BookSortField"}},"defaultValue":{"kind":"EnumValue","value":"ID"}},{"kind":"InputValueDefinition","name":{"kind":"Name","value":"sortDirection"},"type":{"kind":"NamedType","name":{"kind":"Name","value":"SortDirection"}},"defaultValue":{"kind":"EnumValue","value":"ASC"}}],"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"BookSearchResult"}}}},{"kind":"FieldDefinition","description":{"kind":"StringValue","value":"Favorite books of the logged-in user, newest first.","block":false},"name":{"kind":"Name","value":"favoriteBooks"},"arguments":[{"kind":"InputValueDefinition","name":{"kind":"Name","value":"limit"},"type":{"kind":"NamedType","name":{"kind":"Name","value":"Int"}},"defaultValue":{"kind":"IntValue","value":"12"}},{"kind":"InputValueDefinition","name":{"kind":"Name","value":"offset"},"type":{"kind":"NamedType","name":{"kind":"Name","value":"Int"}},"defaultValue":{"kind":"IntValue","value":"0"}}],"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"BookSearchResult"}}}},{"kind":"FieldDefinition","description":{"kind":"StringValue","value":"ID of every book the logged-in user that has been added to their favorites.","block":false},"name":{"kind":"Name","value":"favoriteBookIds"},"type":{"kind":"NonNullType","type":{"kind":"ListType","type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"Int"}}}}}},{"kind":"FieldDefinition","description":{"kind":"StringValue","value":"The logged-in user's most common genres among their favorite books.","block":false},"name":{"kind":"Name","value":"favoriteGenres"},"arguments":[{"kind":"InputValueDefinition","name":{"kind":"Name","value":"limit"},"type":{"kind":"NamedType","name":{"kind":"Name","value":"Int"}},"defaultValue":{"kind":"IntValue","value":"3"}}],"type":{"kind":"NonNullType","type":{"kind":"ListType","type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}}}}],"directives":[],"interfaces":[]},{"name":{"kind":"Name","value":"Mutation"},"kind":"ObjectTypeDefinition","fields":[{"kind":"FieldDefinition","name":{"kind":"Name","value":"addFavoriteBook"},"arguments":[{"kind":"InputValueDefinition","name":{"kind":"Name","value":"bookId"},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"Int"}}}}],"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"Book"}}}},{"kind":"FieldDefinition","name":{"kind":"Name","value":"removeFavoriteBook"},"arguments":[{"kind":"InputValueDefinition","name":{"kind":"Name","value":"bookId"},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"Int"}}}}],"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"Boolean"}}}}],"directives":[],"interfaces":[]},{"kind":"ObjectTypeDefinition","name":{"kind":"Name","value":"Book"},"fields":[{"kind":"FieldDefinition","name":{"kind":"Name","value":"id"},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"Int"}}}},{"kind":"FieldDefinition","name":{"kind":"Name","value":"isbn"},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}},{"kind":"FieldDefinition","name":{"kind":"Name","value":"title"},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}},{"kind":"FieldDefinition","name":{"kind":"Name","value":"series"},"type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}},{"kind":"FieldDefinition","name":{"kind":"Name","value":"author"},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}},{"kind":"FieldDefinition","name":{"kind":"Name","value":"description"},"type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}},{"kind":"FieldDefinition","name":{"kind":"Name","value":"language"},"type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}},{"kind":"FieldDefinition","name":{"kind":"Name","value":"bookFormat"},"type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}},{"kind":"FieldDefinition","name":{"kind":"Name","value":"edition"},"type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}},{"kind":"FieldDefinition","name":{"kind":"Name","value":"pages"},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"Int"}}}},{"kind":"FieldDefinition","name":{"kind":"Name","value":"publisher"},"type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}},{"kind":"FieldDefinition","name":{"kind":"Name","value":"publishDate"},"type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}},{"kind":"FieldDefinition","name":{"kind":"Name","value":"coverImgUrl"},"type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}},{"kind":"FieldDefinition","name":{"kind":"Name","value":"genres"},"type":{"kind":"NonNullType","type":{"kind":"ListType","type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}}}},{"kind":"FieldDefinition","name":{"kind":"Name","value":"rating"},"type":{"kind":"NamedType","name":{"kind":"Name","value":"Float"}}},{"kind":"FieldDefinition","name":{"kind":"Name","value":"numRatings"},"type":{"kind":"NamedType","name":{"kind":"Name","value":"Int"}}}]},{"kind":"EnumTypeDefinition","name":{"kind":"Name","value":"BookSortField"},"values":[{"kind":"EnumValueDefinition","name":{"kind":"Name","value":"ID"}},{"kind":"EnumValueDefinition","name":{"kind":"Name","value":"RATING"}}]},{"kind":"EnumTypeDefinition","name":{"kind":"Name","value":"SortDirection"},"values":[{"kind":"EnumValueDefinition","name":{"kind":"Name","value":"ASC"}},{"kind":"EnumValueDefinition","name":{"kind":"Name","value":"DESC"}}]},{"kind":"ObjectTypeDefinition","name":{"kind":"Name","value":"BookSearchResult"},"fields":[{"kind":"FieldDefinition","name":{"kind":"Name","value":"books"},"type":{"kind":"NonNullType","type":{"kind":"ListType","type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"Book"}}}}}},{"kind":"FieldDefinition","name":{"kind":"Name","value":"totalCount"},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"Int"}}}}]},{"kind":"SchemaDefinition","operationTypes":[{"kind":"OperationTypeDefinition","type":{"kind":"NamedType","name":{"kind":"Name","value":"Query"}},"operation":"query"},{"kind":"OperationTypeDefinition","type":{"kind":"NamedType","name":{"kind":"Name","value":"Mutation"}},"operation":"mutation"}]}]} as unknown as DocumentNode
\ No newline at end of file
diff --git a/backend/src/schema/types.generated.ts b/backend/src/schema/types.generated.ts
index 710bcbd..f7e2400 100644
--- a/backend/src/schema/types.generated.ts
+++ b/backend/src/schema/types.generated.ts
@@ -101,6 +101,7 @@ export type QuerysearchBooksArgs = {
limit?: InputMaybe;
maxPages?: InputMaybe;
minPages?: InputMaybe;
+ minRatings?: InputMaybe;
offset?: InputMaybe;
publisher?: InputMaybe;
series?: InputMaybe;
diff --git a/frontend/app/api/types/graphql.generated.ts b/frontend/app/api/types/graphql.generated.ts
index 983b14e..acd6fdc 100644
--- a/frontend/app/api/types/graphql.generated.ts
+++ b/frontend/app/api/types/graphql.generated.ts
@@ -28,7 +28,7 @@ export type FavoriteBooksQueryVariables = Exact<{
}>;
-export type FavoriteBooksQuery = { favoriteGenres: Array, favoriteBooks: { __typename: 'BookSearchResult', totalCount: number, books: Array<{ __typename: 'Book', id: number, title: string, author: string, publishDate: string | null, coverImgUrl: string | null }> } };
+export type FavoriteBooksQuery = { favoriteGenres: Array, favoriteBooks: { __typename: 'BookSearchResult', totalCount: number, books: Array<{ __typename: 'Book', id: number, title: string, author: string, publishDate: string | null, coverImgUrl: string | null, rating: number | null, numRatings: number | null }> } };
export type FavoriteBookIdsQueryVariables = Exact<{ [key: string]: never; }>;
@@ -56,6 +56,7 @@ export type SearchBooksQueryVariables = Exact<{
bookFormat?: string | null | undefined;
minPages?: number | null | undefined;
maxPages?: number | null | undefined;
+ minRatings?: number | null | undefined;
sortBy?: BookSortField | null | undefined;
sortDirection?: SortDirection | null | undefined;
limit?: number | null | undefined;
@@ -63,4 +64,4 @@ export type SearchBooksQueryVariables = Exact<{
}>;
-export type SearchBooksQuery = { searchBooks: { __typename: 'BookSearchResult', totalCount: number, books: Array<{ __typename: 'Book', id: number, title: string, author: string, publishDate: string | null, coverImgUrl: string | null }> } };
+export type SearchBooksQuery = { searchBooks: { __typename: 'BookSearchResult', totalCount: number, books: Array<{ __typename: 'Book', id: number, title: string, author: string, publishDate: string | null, coverImgUrl: string | null, rating: number | null, numRatings: number | null }> } };
diff --git a/frontend/app/api/types/index.ts b/frontend/app/api/types/index.ts
index b19b812..df015a6 100644
--- a/frontend/app/api/types/index.ts
+++ b/frontend/app/api/types/index.ts
@@ -3,4 +3,5 @@ export interface BookFilters {
language?: string;
bookFormat?: string;
pages?: { min?: number; max?: number };
+ minRatings?: number;
}
From 511fc25ca760050ee4b181dcb4ecd54da5b1f453 Mon Sep 17 00:00:00 2001
From: Martin Alexander Kaminski
Date: Wed, 4 Nov 2026 22:22:00 +0100
Subject: [PATCH 12/21] feat: add minimum ratings search param and filter
---
.../books/BookFilters/BookFilters.test.tsx | 15 +++++
.../books/BookFilters/BookFilters.tsx | 4 ++
.../MinRatingsFilter/MinRatingsFilter.tsx | 58 +++++++++++++++++++
frontend/app/hooks/useBookSearchParams.ts | 8 ++-
frontend/app/hooks/useSearchBooks.ts | 5 ++
frontend/app/routes/books.test.tsx | 3 +-
6 files changed, 89 insertions(+), 4 deletions(-)
create mode 100644 frontend/app/components/books/MinRatingsFilter/MinRatingsFilter.tsx
diff --git a/frontend/app/components/books/BookFilters/BookFilters.test.tsx b/frontend/app/components/books/BookFilters/BookFilters.test.tsx
index 5900cc2..afb84f0 100644
--- a/frontend/app/components/books/BookFilters/BookFilters.test.tsx
+++ b/frontend/app/components/books/BookFilters/BookFilters.test.tsx
@@ -20,6 +20,7 @@ function SearchParamProbe() {
<>
{searchParams.getAll("genres").join(",")}
{searchParams.get("language")}
+ {searchParams.get("minRatings")}
{searchParams.get("minPages")}-{searchParams.get("maxPages")}
@@ -82,6 +83,20 @@ describe("FilterBooksSection", () => {
);
});
+ it("sets the minimum number of ratings in the URL", async () => {
+ const user = userEvent.setup();
+ render( );
+
+ await user.click(screen.getByLabelText("Minimum ratings"));
+ await user.click(
+ await screen.findByRole("option", { name: "1,000+ ratings" }),
+ );
+
+ await waitFor(() =>
+ expect(screen.getByTestId("minRatings")).toHaveTextContent("1000"),
+ );
+ });
+
it("shows the page range from the URL", () => {
render( );
diff --git a/frontend/app/components/books/BookFilters/BookFilters.tsx b/frontend/app/components/books/BookFilters/BookFilters.tsx
index ac20cf0..16ac67a 100644
--- a/frontend/app/components/books/BookFilters/BookFilters.tsx
+++ b/frontend/app/components/books/BookFilters/BookFilters.tsx
@@ -15,6 +15,7 @@ import {
ComboboxValue,
useComboboxAnchor,
} from "~/components/ui/Combobox";
+import { MinRatingsFilter } from "~/components/books/MinRatingsFilter/MinRatingsFilter";
import { PagesFilter } from "~/components/books/PagesFilter/PagesFilter";
function BookFilters() {
@@ -169,6 +170,9 @@ function BookFilters() {
+
+
+
diff --git a/frontend/app/components/books/MinRatingsFilter/MinRatingsFilter.tsx b/frontend/app/components/books/MinRatingsFilter/MinRatingsFilter.tsx
new file mode 100644
index 0000000..7f8a059
--- /dev/null
+++ b/frontend/app/components/books/MinRatingsFilter/MinRatingsFilter.tsx
@@ -0,0 +1,58 @@
+import { useSearchParams } from "react-router";
+import { useBookSearchParams } from "~/hooks/useBookSearchParams";
+import {
+ Select,
+ SelectContent,
+ SelectItem,
+ SelectTrigger,
+ SelectValue,
+} from "~/components/ui/Select";
+
+const items = [
+ { value: "any", label: "Any" },
+ ...[100, 1000, 10000, 100000].map((count) => ({
+ value: String(count),
+ label: `${count.toLocaleString("en")}+ ratings`,
+ })),
+];
+
+function MinRatingsFilter() {
+ const [, setSearchParams] = useSearchParams();
+ const { filters } = useBookSearchParams();
+
+ return (
+ <>
+ Minimum ratings
+ {
+ setSearchParams((searchParams) => {
+ if (value && value !== "any") {
+ searchParams.set("minRatings", value);
+ } else {
+ searchParams.delete("minRatings");
+ }
+ searchParams.delete("page");
+ return searchParams;
+ });
+ }}
+ >
+
+
+
+
+ {items.map((item) => (
+
+ {item.label}
+
+ ))}
+
+
+ >
+ );
+}
+
+export { MinRatingsFilter };
diff --git a/frontend/app/hooks/useBookSearchParams.ts b/frontend/app/hooks/useBookSearchParams.ts
index dd43978..41c610b 100644
--- a/frontend/app/hooks/useBookSearchParams.ts
+++ b/frontend/app/hooks/useBookSearchParams.ts
@@ -3,7 +3,7 @@ import { useSearchParams } from "react-router";
import type { BookFilters } from "~/api/types";
import { parseBookSort } from "~/api/bookSort";
-function parsePageCount(value: string | null) {
+function parseCount(value: string | null) {
const count = Number(value);
return value && Number.isInteger(count) && count >= 0 ? count : undefined;
}
@@ -14,6 +14,7 @@ const FILTER_KEYS = [
"bookFormat",
"minPages",
"maxPages",
+ "minRatings",
] as const;
function useBookSearchParams() {
@@ -26,8 +27,8 @@ function useBookSearchParams() {
// Only update filters when searchParams change to avoid unnecessary re-renders
const filters = useMemo((): BookFilters => {
const genres = searchParams.getAll("genres");
- const minPages = parsePageCount(searchParams.get("minPages"));
- const maxPages = parsePageCount(searchParams.get("maxPages"));
+ const minPages = parseCount(searchParams.get("minPages"));
+ const maxPages = parseCount(searchParams.get("maxPages"));
return {
genres: genres.length > 0 ? genres : undefined,
language: searchParams.get("language") ?? undefined,
@@ -36,6 +37,7 @@ function useBookSearchParams() {
minPages === undefined && maxPages === undefined
? undefined
: { min: minPages, max: maxPages },
+ minRatings: parseCount(searchParams.get("minRatings")),
};
}, [searchParams]);
diff --git a/frontend/app/hooks/useSearchBooks.ts b/frontend/app/hooks/useSearchBooks.ts
index 13425f8..f04e9a5 100644
--- a/frontend/app/hooks/useSearchBooks.ts
+++ b/frontend/app/hooks/useSearchBooks.ts
@@ -19,6 +19,7 @@ const SEARCH_BOOKS: TypedDocumentNode<
$bookFormat: String
$minPages: Int
$maxPages: Int
+ $minRatings: Int
$sortBy: BookSortField
$sortDirection: SortDirection
$limit: Int
@@ -31,6 +32,7 @@ const SEARCH_BOOKS: TypedDocumentNode<
bookFormat: $bookFormat
minPages: $minPages
maxPages: $maxPages
+ minRatings: $minRatings
sortBy: $sortBy
sortDirection: $sortDirection
limit: $limit
@@ -43,6 +45,8 @@ const SEARCH_BOOKS: TypedDocumentNode<
author
publishDate
coverImgUrl
+ rating
+ numRatings
}
}
}
@@ -74,6 +78,7 @@ function useSearchBooks({
bookFormat: filters.bookFormat,
minPages: filters.pages?.min,
maxPages: filters.pages?.max,
+ minRatings: filters.minRatings,
sortBy: sort && BOOK_SORTS[sort].sortBy,
sortDirection: sort && BOOK_SORTS[sort].sortDirection,
limit,
diff --git a/frontend/app/routes/books.test.tsx b/frontend/app/routes/books.test.tsx
index 83093a7..453c82c 100644
--- a/frontend/app/routes/books.test.tsx
+++ b/frontend/app/routes/books.test.tsx
@@ -46,7 +46,7 @@ describe("BooksPage", () => {
renderRoutes(routes, {
initialEntries: [
"/books?q=blade&genres=Fantasy&genres=Romance&language=English" +
- "&bookFormat=Paperback&minPages=100&maxPages=500" +
+ "&bookFormat=Paperback&minPages=100&maxPages=500&minRatings=1000" +
"&sort=rating_desc&page=2",
],
mocks: [
@@ -58,6 +58,7 @@ describe("BooksPage", () => {
bookFormat: "Paperback",
minPages: 100,
maxPages: 500,
+ minRatings: 1000,
sortBy: "RATING",
sortDirection: "DESC",
limit: 12,
From 60f99a68b985a19fbbf02c073ed16088331e8b91 Mon Sep 17 00:00:00 2001
From: Martin Alexander Kaminski
Date: Wed, 4 Nov 2026 22:23:38 +0100
Subject: [PATCH 13/21] feat: show book rating in BookCard
---
.../app/components/BookCard/BookCard.test.tsx | 10 ++++++++++
frontend/app/components/BookCard/BookCard.tsx | 17 +++++++++++++++++
.../__snapshots__/BookCard.test.tsx.snap | 5 +++++
frontend/app/hooks/useFavoriteBooks.ts | 2 ++
frontend/app/test/fixtures/books.ts | 6 ++++++
5 files changed, 40 insertions(+)
diff --git a/frontend/app/components/BookCard/BookCard.test.tsx b/frontend/app/components/BookCard/BookCard.test.tsx
index 72a9490..d286043 100644
--- a/frontend/app/components/BookCard/BookCard.test.tsx
+++ b/frontend/app/components/BookCard/BookCard.test.tsx
@@ -22,6 +22,16 @@ describe("BookCard", () => {
expect(screen.getByText("2001")).toBeInTheDocument();
});
+ it("shows the rating and how many ratings it is based on", () => {
+ const ratedBook = { ...book, rating: 4.156, numRatings: 312505 };
+ renderRoutes([
+ { path: "/", Component: () => },
+ ]);
+
+ expect(screen.getByText("4.16")).toBeInTheDocument();
+ expect(screen.getByText(/312,505 ratings/)).toBeInTheDocument();
+ });
+
it("links to the book's details page, keeping the current search", () => {
renderRoutes(routes, { initialEntries: ["/?q=fantasy"] });
diff --git a/frontend/app/components/BookCard/BookCard.tsx b/frontend/app/components/BookCard/BookCard.tsx
index af8d4bb..a8cc838 100644
--- a/frontend/app/components/BookCard/BookCard.tsx
+++ b/frontend/app/components/BookCard/BookCard.tsx
@@ -1,3 +1,4 @@
+import { StarIcon } from "lucide-react";
import { BookCover } from "~/components/BookCover/BookCover";
import { FavoriteButton } from "~/components/FavoriteButton/FavoriteButton";
import { Card, CardContent, CardHeader, CardTitle } from "~/components/ui/Card";
@@ -41,6 +42,22 @@ function BookCard({ book, searchListParams }: BookCardProps) {
{book.authors.join(", ")}
{book.publishedYear ?? "Unknown"}
+
+ {book.rating == null ? (
+ "No ratings yet"
+ ) : (
+ <>
+
+
+ {book.rating.toFixed(2)}
+
+ ({(book.numRatings ?? 0).toLocaleString("en")} ratings)
+ >
+ )}
+
diff --git a/frontend/app/components/BookCard/__snapshots__/BookCard.test.tsx.snap b/frontend/app/components/BookCard/__snapshots__/BookCard.test.tsx.snap
index 5b76b79..ff12884 100644
--- a/frontend/app/components/BookCard/__snapshots__/BookCard.test.tsx.snap
+++ b/frontend/app/components/BookCard/__snapshots__/BookCard.test.tsx.snap
@@ -47,6 +47,11 @@ exports[`BookCard > matches the snapshot 1`] = `
2001
+
+ No ratings yet
+
Date: Wed, 4 Nov 2026 22:26:46 +0100
Subject: [PATCH 14/21] feat: limit top rated books to those having many
reviews
---
.../home/ForYouSection/ForYouSection.tsx | 7 ++-
.../home/TopRatedSection/TopRatedSection.tsx | 3 +-
frontend/app/lib/constants.ts | 5 +-
frontend/app/routes/home.test.tsx | 47 +++++++++++++++----
frontend/app/routes/home.tsx | 18 +++++--
5 files changed, 64 insertions(+), 16 deletions(-)
diff --git a/frontend/app/components/home/ForYouSection/ForYouSection.tsx b/frontend/app/components/home/ForYouSection/ForYouSection.tsx
index 3b06817..45ff106 100644
--- a/frontend/app/components/home/ForYouSection/ForYouSection.tsx
+++ b/frontend/app/components/home/ForYouSection/ForYouSection.tsx
@@ -7,6 +7,7 @@ import { Skeleton } from "~/components/ui/Skeleton";
import { Tabs, TabsContent, TabsList, TabsTrigger } from "~/components/ui/Tabs";
import { useFavoriteBooks, useFavoriteStatus } from "~/hooks/useFavoriteBooks";
import { useSearchBooks } from "~/hooks/useSearchBooks";
+import { HOME_MIN_RATINGS } from "~/lib/constants";
const RECOMMENDATION_LIMIT = 4;
const BOOK_GRID =
@@ -35,7 +36,10 @@ function ForYouSection() {
const genre = selectedGenre ?? topGenres.at(0);
const { books, loading } = useSearchBooks({
- filters: { genres: genre ? [genre] : undefined },
+ filters: {
+ genres: genre ? [genre] : undefined,
+ minRatings: HOME_MIN_RATINGS,
+ },
title: "",
// Fetch extra, since books the user has already saved are left out.
limit: RECOMMENDATION_LIMIT * 3,
@@ -56,6 +60,7 @@ function ForYouSection() {
const genreSearch = new URLSearchParams({
genres: genre,
sort: "rating_desc",
+ minRatings: String(HOME_MIN_RATINGS),
}).toString();
const recommendationList = loading ? (
diff --git a/frontend/app/components/home/TopRatedSection/TopRatedSection.tsx b/frontend/app/components/home/TopRatedSection/TopRatedSection.tsx
index 26bdb3e..60987bf 100644
--- a/frontend/app/components/home/TopRatedSection/TopRatedSection.tsx
+++ b/frontend/app/components/home/TopRatedSection/TopRatedSection.tsx
@@ -4,9 +4,10 @@ import { BookCard } from "~/components/BookCard/BookCard";
import { RevealSection } from "~/components/home/RevealSection/RevealSection";
import { Skeleton } from "~/components/ui/Skeleton";
import type { SearchBook } from "~/hooks/useSearchBooks";
+import { HOME_MIN_RATINGS } from "~/lib/constants";
// The same books on the books page, for "See all" and for browsing from a book.
-const TOP_RATED_SEARCH = "?sort=rating_desc";
+const TOP_RATED_SEARCH = `?sort=rating_desc&minRatings=${HOME_MIN_RATINGS}`;
function TopRatedSection({
books,
diff --git a/frontend/app/lib/constants.ts b/frontend/app/lib/constants.ts
index 0bdf839..93da2a5 100644
--- a/frontend/app/lib/constants.ts
+++ b/frontend/app/lib/constants.ts
@@ -4,4 +4,7 @@ const MIN_PASSWORD_LENGTH = 8;
// Default number of books shown on a page
const BOOK_PAGE_LIMIT = 12;
-export { MIN_PASSWORD_LENGTH, BOOK_PAGE_LIMIT };
+// The minimum number of ratings of books on the home page.
+const HOME_MIN_RATINGS = 10_000;
+
+export { MIN_PASSWORD_LENGTH, BOOK_PAGE_LIMIT, HOME_MIN_RATINGS };
diff --git a/frontend/app/routes/home.test.tsx b/frontend/app/routes/home.test.tsx
index 5a6c7b3..2235d48 100644
--- a/frontend/app/routes/home.test.tsx
+++ b/frontend/app/routes/home.test.tsx
@@ -56,6 +56,7 @@ const recommendationsMock = (genre: string) =>
searchBooksMock({
title: "",
genres: [genre],
+ minRatings: 1000,
sortBy: "RATING",
sortDirection: "DESC",
limit: 12,
@@ -64,15 +65,25 @@ const recommendationsMock = (genre: string) =>
const topRatedMock = searchBooksMock({
title: "",
+ minRatings: 1000,
sortBy: "RATING",
sortDirection: "DESC",
limit: 8,
offset: 0,
});
+// The number of books in the whole library, for the stats and "Surprise me".
+const bookCountMock = searchBooksMock(
+ { title: "", limit: 0, offset: 0 },
+ [],
+ apiSearchBooks.length,
+);
+
describe("HomePage", () => {
it("shows the top rated books from the API", async () => {
- renderRoutes(routes, { mocks: [topRatedMock, bookFiltersMock()] });
+ renderRoutes(routes, {
+ mocks: [topRatedMock, bookCountMock, bookFiltersMock()],
+ });
expect(
await screen.findAllByRole("link", { name: /View details for/ }),
@@ -80,7 +91,7 @@ describe("HomePage", () => {
// The details page browses the same top rated list with previous/next.
expect(
screen.getByRole("link", { name: "View details for The Blade Itself" }),
- ).toHaveAttribute("href", "/book/1?sort=rating_desc");
+ ).toHaveAttribute("href", "/book/1?sort=rating_desc&minRatings=1000");
});
it("searches for books on the books page", async () => {
@@ -88,6 +99,7 @@ describe("HomePage", () => {
renderRoutes(routes, {
mocks: [
topRatedMock,
+ bookCountMock,
bookFiltersMock(),
searchBooksMock({ title: "blade", limit: 12, offset: 0 }),
],
@@ -105,7 +117,12 @@ describe("HomePage", () => {
it("shows all books when searching with only whitespace", async () => {
const user = userEvent.setup();
renderRoutes(routes, {
- mocks: [topRatedMock, bookFiltersMock(), searchBooksMock()],
+ mocks: [
+ topRatedMock,
+ bookCountMock,
+ bookFiltersMock(),
+ searchBooksMock(),
+ ],
});
await user.type(
@@ -118,7 +135,9 @@ describe("HomePage", () => {
});
it("shows how many books, genres and languages there are", async () => {
- renderRoutes(routes, { mocks: [topRatedMock, bookFiltersMock()] });
+ renderRoutes(routes, {
+ mocks: [topRatedMock, bookCountMock, bookFiltersMock()],
+ });
const stats = screen.getByRole("region", { name: "Library statistics" });
// The counts come from two queries, so wait for both: 3 books and 3 genres.
@@ -133,6 +152,7 @@ describe("HomePage", () => {
renderRoutes(routes, {
mocks: [
topRatedMock,
+ bookCountMock,
bookFiltersMock(),
searchBooksMock({
title: "",
@@ -149,7 +169,9 @@ describe("HomePage", () => {
});
it("invites logged out users to create an account", async () => {
- renderRoutes(routes, { mocks: [topRatedMock, bookFiltersMock()] });
+ renderRoutes(routes, {
+ mocks: [topRatedMock, bookCountMock, bookFiltersMock()],
+ });
expect(
await screen.findByRole("region", { name: "Start your reading list" }),
@@ -162,6 +184,7 @@ describe("HomePage", () => {
renderRoutes(routes, {
mocks: [
topRatedMock,
+ bookCountMock,
bookFiltersMock(),
...favoritesMocks(["Fantasy"]),
recommendationsMock("Fantasy"),
@@ -179,7 +202,10 @@ describe("HomePage", () => {
within(forYou).getByRole("link", {
name: "View details for Good Omens",
}),
- ).toHaveAttribute("href", "/book/3?genres=Fantasy&sort=rating_desc");
+ ).toHaveAttribute(
+ "href",
+ "/book/3?genres=Fantasy&sort=rating_desc&minRatings=1000",
+ );
expect(
screen.queryByRole("region", { name: "Start your reading list" }),
).not.toBeInTheDocument();
@@ -191,6 +217,7 @@ describe("HomePage", () => {
renderRoutes(routes, {
mocks: [
topRatedMock,
+ bookCountMock,
bookFiltersMock(),
// 0.5 of 3 books is offset 1, the second book.
searchBooksMock({ title: "", limit: 1, offset: 1 }, [
@@ -216,6 +243,7 @@ describe("HomePage", () => {
renderRoutes(routes, {
mocks: [
topRatedMock,
+ bookCountMock,
bookFiltersMock(),
...favoritesMocks(["Fantasy", "Romance"]),
recommendationsMock("Fantasy"),
@@ -233,13 +261,15 @@ describe("HomePage", () => {
expect(romance).toHaveAttribute("aria-selected", "true");
expect(screen.getByRole("link", { name: /More Romance/ })).toHaveAttribute(
"href",
- "/books?genres=Romance&sort=rating_desc",
+ "/books?genres=Romance&sort=rating_desc&minRatings=1000",
);
});
it("explains the surprise me button in a tooltip", async () => {
const user = userEvent.setup();
- renderRoutes(routes, { mocks: [topRatedMock, bookFiltersMock()] });
+ renderRoutes(routes, {
+ mocks: [topRatedMock, bookCountMock, bookFiltersMock()],
+ });
const button = screen.getByRole("button", { name: "Surprise me" });
// Disabled until the number of books has loaded.
@@ -259,6 +289,7 @@ describe("HomePage", () => {
renderRoutes(routes, {
mocks: [
topRatedMock,
+ bookCountMock,
bookFiltersMock(),
...favoritesMocks(["Fantasy"]),
recommendationsMock("Fantasy"),
diff --git a/frontend/app/routes/home.tsx b/frontend/app/routes/home.tsx
index c608b3b..3c257f3 100644
--- a/frontend/app/routes/home.tsx
+++ b/frontend/app/routes/home.tsx
@@ -7,6 +7,7 @@ import { SignUpBanner } from "~/components/home/SignUpBanner/SignUpBanner";
import { StatsSection } from "~/components/home/StatsSection/StatsSection";
import { TopRatedSection } from "~/components/home/TopRatedSection/TopRatedSection";
import { useSearchBooks } from "~/hooks/useSearchBooks";
+import { HOME_MIN_RATINGS } from "~/lib/constants";
const TOP_RATED_LIMIT = 8;
@@ -20,19 +21,26 @@ export function meta() {
export default function HomePage() {
const { data: session, isPending } = authClient.useSession();
- // Shared by the hero covers and the top rated list, so only one request is sent.
- const { books, totalCount, loading } = useSearchBooks({
- filters: {},
+ const { books, loading } = useSearchBooks({
+ filters: { minRatings: HOME_MIN_RATINGS },
title: "",
limit: TOP_RATED_LIMIT,
offset: 0,
sort: "rating_desc",
});
+ // Only the number of books in the whole library, for the stats and "Surprise me"
+ const { totalCount: bookCount } = useSearchBooks({
+ filters: {},
+ title: "",
+ limit: 0,
+ offset: 0,
+ });
+
return (
-
-
+
+
{session && }
From bed0cfb78104db757ce0a67a43d8c6c38eabff88 Mon Sep 17 00:00:00 2001
From: Martin Alexander Kaminski
Date: Wed, 4 Nov 2026 22:30:15 +0100
Subject: [PATCH 15/21] fix: add watch to backend tsx
This is so new changes automatically restart the backend Apollo Server
---
backend/package.json | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/backend/package.json b/backend/package.json
index 7a1ccd6..cb48a63 100644
--- a/backend/package.json
+++ b/backend/package.json
@@ -12,7 +12,7 @@
"scripts": {
"prestart": "graphql-codegen",
"typecheck": "tsc",
- "dev": "pnpm prestart && tsx src/index.ts",
+ "dev": "pnpm prestart && tsx watch src/index.ts",
"build": "esbuild src/index.ts --bundle --platform=node --format=esm --target=node24 --packages=external --outfile=dist/index.js",
"start": "pnpm build && node dist/index.js",
"db:init": "initdb -D db-data -U postgres -E UTF8 --auth=trust",
From 24f629d7ac025991e996d7e4f943b483e59454f2 Mon Sep 17 00:00:00 2001
From: Martin Alexander Kaminski
Date: Wed, 4 Nov 2026 22:42:56 +0100
Subject: [PATCH 16/21] feat: update Footer with new links and design
---
frontend/app/components/Footer/Footer.tsx | 28 ++++++++++++++++++++---
1 file changed, 25 insertions(+), 3 deletions(-)
diff --git a/frontend/app/components/Footer/Footer.tsx b/frontend/app/components/Footer/Footer.tsx
index 576b1e7..9aec524 100644
--- a/frontend/app/components/Footer/Footer.tsx
+++ b/frontend/app/components/Footer/Footer.tsx
@@ -1,8 +1,30 @@
+import { Link } from "react-router";
+import { buttonVariants } from "~/components/ui/Button";
+
function Footer() {
return (
-