diff --git a/.cursor/rules/forms.mdc b/.cursor/rules/forms.mdc index f102d37fd..35e57dd85 100644 --- a/.cursor/rules/forms.mdc +++ b/.cursor/rules/forms.mdc @@ -3,6 +3,7 @@ description: Writing Forms with Shadcn UI, Server Actions, Zod globs: apps/**/*.tsx,packages/**/*.tsx alwaysApply: false --- + # Forms - Use React Hook Form for form validation and submission. @@ -10,6 +11,7 @@ alwaysApply: false - Use the `zodResolver` function to resolve the Zod schema to the form. - Use Server Actions [server-actions.mdc](mdc:.cursor/rules/server-actions.mdc) for server-side code handling - Use Sonner for writing toasters for UI feedback +- Never add generics to `useForm`, use Zod resolver to infer types instead Follow the example below to create all forms: @@ -35,7 +37,9 @@ Server Actions [server-actions.mdc](mdc:.cursor/rules/server-actions.mdc) can he 'use server'; import { z } from 'zod'; + import { enhanceAction } from '@kit/next/actions'; + import { CreateNoteSchema } from '../schema/create-note.schema'; export const createNoteAction = enhanceAction( @@ -144,4 +148,4 @@ export function CreateNoteForm() { } ``` -Always use `@kit/ui` for writing the UI of the form. \ No newline at end of file +Always use `@kit/ui` for writing the UI of the form. diff --git a/.gemini/settings.json b/.gemini/settings.json new file mode 100644 index 000000000..68337d390 --- /dev/null +++ b/.gemini/settings.json @@ -0,0 +1 @@ +{ "contextFileName": "AGENTS.md" } diff --git a/.junie/guidelines.md b/.junie/guidelines.md index cf39d0de0..16a476820 100644 --- a/.junie/guidelines.md +++ b/.junie/guidelines.md @@ -15,7 +15,7 @@ class UserService { } export function createUserService() { - return new UserService(); + return new UserService(); } ``` diff --git a/AGENTS.md b/AGENTS.md index a60e8a9ef..1fd658b28 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -1,25 +1,23 @@ -# AGENTS.md +This file provides guidance to Claude Code when working with code in this repository. -This AGENTS.md file provides comprehensive guidance for OpenAI Codex and other AI agents working with this codebase. +## Core Technologies -### Core Technologies - -- **Next.js 15** with App Router and Turbopack +- **Next.js 15** with App Router - **Supabase** for database, auth, and storage -- **React 19** with React Compiler -- **TypeScript** with strict configuration -- **Tailwind CSS 4** for styling -- **Turborepo** for monorepo management +- **React 19** +- **TypeScript** +- **Tailwind CSS 4** and Shadcn UI +- **Turborepo** -### Monorepo Structure +## Monorepo Structure -- @apps/web - Main Next.js SaaS application -- @apps/dev-tool - Development utilities (port 3010) -- @apps/e2e - Playwright end-to-end tests -- @packages/ - Shared packages and utilities -- @tooling/ - Build tools and development scripts +- `apps/web` - Main Next.js SaaS application +- `apps/e2e` - Playwright end-to-end tests +- `packages/features/*` - Feature packages +- `packages/` - Shared packages and utilities +- `tooling/` - Build tools and development scripts -### Multi-Tenant Architecture +## Multi-Tenant Architecture **Personal Accounts**: Individual user accounts (auth.users.id = accounts.id) **Team Accounts**: Shared workspaces with members, roles, and permissions @@ -33,8 +31,6 @@ Data associates with accounts via foreign keys for proper access control. ```bash pnpm dev # Start all apps pnpm --filter web dev # Main app (port 3000) -pnpm --filter dev-tool dev # Dev tools (port 3010) -pnpm build # Build all apps ``` ### Database Operations @@ -49,570 +45,28 @@ pnpm --filter web supabase:db:diff # Create migration ### Code Quality ```bash -pnpm lint && pnpm format # Lint and format -pnpm typecheck # Type checking -pnpm test # Run tests +pnpm format:fix +pnpm lint:fix +pnpm typecheck ``` -## Application Structure +- Run the typecheck command regularly to ensure your code is type-safe. +- Run the linter and the formatter when your task is complete. -### Route Organization +## Typescript -``` -app/ -├── (marketing)/ # Public pages (landing, blog, docs) -├── (auth)/ # Authentication pages -├── home/ -│ ├── (user)/ # Personal account context -│ └── [account]/ # Team account context ([account] = team slug) -├── admin/ # Super admin section -└── api/ # API routes -``` +- Write clean, clear, well-designed, explicit TypeScript +- Avoid obvious comments +- Avoid unnecessary complexity or overly abstract code +- Always use implicit type inference, unless impossible +- You must avoid using `any` +- Handle errors gracefully using try/catch and appropriate error types -Key Examples: +## React -- Marketing layout: @apps/web/app/(marketing)/layout.tsx -- Personal dashboard: @apps/web/app/home/(user)/page.tsx -- Team workspace: @apps/web/app/home/[account]/page.tsx -- Admin section: @apps/web/app/admin/page.tsx - -### Component Organization - -- **Route-specific**: Use \_components/ directories -- **Route utilities**: Use \_lib/ for client, \_lib/server/ for server-side -- **Global components**: Root-level directories - -Example: - -- Team components: @apps/web/app/home/[account]/\_components/ -- Team server utils: @apps/web/app/home/[account]/\_lib/server/ -- Marketing components: @apps/web/app/(marketing)/\_components/ - -## Database Guidelines - -### Security & RLS Implementation - -**Critical Security Guidelines - Read Carefully! ⚠️** - -#### Database Security Fundamentals - -- **Always enable RLS** on new tables unless explicitly instructed otherwise -- **NEVER use SECURITY DEFINER functions** without explicit access controls - they bypass RLS entirely -- **Always use security_invoker=true for views** to maintain proper access control -- **Storage buckets MUST validate access** using account_id in the path structure. See @apps/web/supabase/schemas/16-storage.sql for proper implementation. -- **Use locks if required**: Database locks prevent race conditions and timing attacks in concurrent operations. Make sure to take these into account for all database operations. - -#### Security Definer Function - Dangerous Pattern ❌ - -```sql --- NEVER DO THIS - Allows any authenticated user to call function -CREATE OR REPLACE FUNCTION public.dangerous_function() -RETURNS void -LANGUAGE plpgsql -SECURITY DEFINER AS $ -BEGIN - -- This bypasses all RLS policies! - DELETE FROM sensitive_table; -- Anyone can call this! -END; -$; -GRANT EXECUTE ON FUNCTION public.dangerous_function() TO authenticated; -``` - -#### Security Definer Function - Safe Pattern ✅ - -```sql --- ONLY use SECURITY DEFINER with explicit access validation -CREATE OR REPLACE FUNCTION public.safe_admin_function(target_account_id uuid) -RETURNS void -LANGUAGE plpgsql -SECURITY DEFINER -SET search_path = '' AS $ -BEGIN - -- MUST validate caller has permission FIRST - IF NOT public.is_account_owner(target_account_id) THEN - RAISE EXCEPTION 'Access denied: insufficient permissions'; - END IF; - - -- Now safe to proceed with elevated privileges - -- Your admin operation here -END; -$; -``` - -#### Existing Helper Functions - Use These! 📚 - -**DO NOT recreate these functions - they already exist:** - -```sql --- Account Access Control -public.has_role_on_account(account_id, role?) -- Check team membership -public.has_permission(user_id, account_id, permission) -- Check permissions -public.is_account_owner(account_id) -- Verify ownership -public.has_active_subscription(account_id) -- Subscription status -public.is_team_member(account_id, user_id) -- Direct membership check -public.can_action_account_member(target_account_id, target_user_id) -- Member action rights - --- Administrative Functions -public.is_super_admin() -- Super admin check -public.is_aal2() -- MFA verification -public.is_mfa_compliant() -- MFA compliance - --- Configuration -public.is_set(field_name) -- Feature flag checks -``` - -Always check @apps/web/supabase/schemas/ before creating new functions! - -#### RLS Policy Best Practices ✅ - -```sql --- Proper RLS using existing helper functions -CREATE POLICY "notes_read" ON public.notes FOR SELECT - TO authenticated USING ( - account_id = (select auth.uid()) OR - public.has_role_on_account(account_id) - ); - --- For operations requiring specific permissions -CREATE POLICY "notes_manage" ON public.notes FOR ALL - TO authenticated USING ( - public.has_permission(auth.uid(), account_id, 'notes.manage'::app_permissions) - ); -``` - -### Schema Management Workflow - -1. Create schemas in @apps/web/supabase/schemas/ as `-.sql` -2. After changes: `pnpm supabase:web:stop` -3. Run: `pnpm --filter web run supabase:db:diff -f ` -4. Restart: `pnpm supabase:web:start` and `pnpm supabase:web:reset` -5. Generate types: `pnpm supabase:web:typegen` - -Key schema files: - -- Accounts: @apps/web/supabase/schemas/03-accounts.sql -- Memberships: @apps/web/supabase/schemas/05-memberships.sql -- Permissions: @apps/web/supabase/schemas/06-roles-permissions.sql - -### Type Generation - -```typescript -import { Tables } from '@kit/supabase/database'; - -type Account = Tables<'accounts'>; -``` - -Always prefer inferring types from generated Database types. - -## Development Patterns - -### Data Fetching Strategy - -**Quick Decision Framework:** - -- **Server Components**: Default choice for initial data loading -- **Client Components**: For interactive features requiring hooks or real-time updates -- **Admin Client**: Only for bypassing RLS (rare cases - requires manual auth/authorization) - -#### Server Components (Preferred) ✅ - -```typescript -import { getSupabaseServerClient } from '@kit/supabase/server-client'; - -async function NotesPage() { - const client = getSupabaseServerClient(); - const { data, error } = await client.from('notes').select('*'); - - if (error) return ; - return ; -} -``` - -**Key Insight**: Server Components automatically inherit RLS protection - no additional authorization checks needed! - -#### Client Components (Interactive) 🖱️ - -```typescript -'use client'; -import { useSupabase } from '@kit/supabase/hooks/use-supabase'; -import { useQuery } from '@tanstack/react-query'; - -function InteractiveNotes() { - const supabase = useSupabase(); - const { data, isLoading } = useQuery({ - queryKey: ['notes'], - queryFn: () => supabase.from('notes').select('*') - }); - - if (isLoading) return ; - return ; -} -``` - -#### Performance Optimization - Parallel Data Fetching 🚀 - -**Sequential (Slow) Pattern ❌** - -```typescript -async function SlowDashboard() { - const userData = await loadUserData(); - const notifications = await loadNotifications(); - const metrics = await loadMetrics(); - // Total time: sum of all requests -} -``` - -**Parallel (Optimized) Pattern ✅** - -```typescript -async function FastDashboard() { - // Execute all requests simultaneously - const [userData, notifications, metrics] = await Promise.all([ - loadUserData(), - loadNotifications(), - loadMetrics() - ]); - // Total time: longest single request - - return ; -} -``` - -**Performance Impact**: Parallel fetching can reduce page load time by 60-80% for multi-data pages! - -### Authorization Patterns - Critical Understanding 🔐 - -#### RLS-Protected Data Fetching (Standard) ✅ - -```typescript -async function getUserNotes(userId: string) { - const client = getSupabaseServerClient(); - - // RLS automatically ensures user can only access their own notes - // NO additional authorization checks needed! - const { data } = await client.from('notes').select('*').eq('user_id', userId); // RLS validates this automatically - - return data; -} -``` - -#### Admin Client Usage (Dangerous - Rare Cases Only) ⚠️ - -```typescript -async function adminGetUserNotes(userId: string) { - const adminClient = getSupabaseServerAdminClient(); - - // CRITICAL: Manual authorization required - bypasses RLS! - const currentUser = await getCurrentUser(); - if (!(await isSuperAdmin(currentUser))) { - throw new Error('Unauthorized: Admin access required'); - } - - // Additional validation: ensure current admin isn't targeting themselves - if (currentUser.id === userId) { - throw new Error('Cannot perform admin action on own account'); - } - - // Now safe to proceed with admin privileges - const { data } = await adminClient - .from('notes') - .select('*') - .eq('user_id', userId); - - return data; -} -``` - -**Rule of thumb**: If using standard Supabase client, trust RLS. If using admin client, validate everything manually. - -### Server Actions Implementation - -Always use `enhanceAction` from @packages/next/src/actions/index.ts: - -```typescript -'use server'; - -import { enhanceAction } from '@kit/next/actions'; - -export const createNoteAction = enhanceAction( - async function (data, user) { - // data is validated, user is authenticated - return { success: true }; - }, - { - auth: true, - schema: CreateNoteSchema, - }, -); -``` - -Example server actions: - -- Team billing: @apps/web/app/home/[account]/billing/\_lib/server/server-actions.ts -- Personal settings: @apps/web/app/home/(user)/settings/\_lib/server/server-actions.ts - -### Forms with React Hook Form & Zod - -```typescript -// 1. Schema in separate file -export const CreateNoteSchema = z.object({ - title: z.string().min(1), - content: z.string().min(1), -}); - -// 2. Client component with form -'use client'; -const form = useForm({ - resolver: zodResolver(CreateNoteSchema), -}); - -const onSubmit = (data) => { - startTransition(async () => { - await toast.promise(createNoteAction(data), { - loading: 'Creating...', - success: 'Created!', - error: 'Failed!', - }); - }); -}; -``` - -Form examples: - -- Contact form: @apps/web/app/(marketing)/contact/\_components/contact-form.tsx -- Verify OTP form: @packages/otp/src/components/verify-otp-form.tsx - -### Route Handlers (API Routes) - -Use `enhanceRouteHandler` from @packages/next/src/routes/index.ts: - -```typescript -import { enhanceRouteHandler } from '@kit/next/routes'; - -export const POST = enhanceRouteHandler( - async function ({ body, user, request }) { - // body is validated, user available if auth: true - return NextResponse.json({ success: true }); - }, - { - auth: true, - schema: ZodSchema, - }, -); -``` - -## React & TypeScript Best Practices - -### TS - -- Write clean, clear, well-designed, explicit Typescript -- Use implicit type inference, unless impossible -- `any` and `unknown` are a code smell and must justified if used -- Handle errors gracefully using try/catch and appropriate error types. - -### Components - -- Use functional components with TypeScript +- Use functional components - Always use 'use client' directive for client components -- Destructure props with proper TypeScript interfaces -- Name files to match component name (e.g., user-profile.tsx) - -### Conditional Rendering - -Use the `If` component from @packages/ui/src/makerkit/if.tsx: - -```tsx -import { If } from '@kit/ui/if'; - -}> - - - -// With type inference - - {(err) => } - -``` - -### Testing Attributes - -```tsx - -
Profile
-``` - -### Internationalization - -Always use `Trans` component from @packages/ui/src/makerkit/trans.tsx: - -```tsx -import { Trans } from '@kit/ui/trans'; - - - -// With HTML elements -, - }} -/> -``` - -Adding new languages: - -1. Add language code to @apps/web/lib/i18n/i18n.settings.ts -2. Create translation files in @apps/web/public/locales/[new-language]/ -3. Copy structure from English files - -Translation files: @apps/web/public/locales//.json - -## Security Guidelines 🛡️ - -### Authentication & Authorization - -- Authentication enforced by middleware -- Authorization handled by RLS at database level -- Avoid defensive code - use RLS instead -- For admin client usage, enforce both authentication and authorization - -### Data Passing - -- **Never pass sensitive data** to Client Components -- **Never expose server environment variables** to client (unless prefixed with NEXT_PUBLIC) -- Always validate user input - -### OTP for Sensitive Operations - -Use one-time tokens from @packages/otp/src/api/index.ts: - -```tsx -import { VerifyOtpForm } from '@kit/otp/components'; - - { - // Proceed with verified operation - }} -/>; -``` - -### Super Admin Protection - -For admin routes, use `AdminGuard` from @packages/features/admin/src/components/admin-guard.tsx: - -```tsx -import { AdminGuard } from '@kit/admin/components/admin-guard'; - -export default AdminGuard(AdminPageComponent); -``` - -## UI Components 🎨 - -### Core UI Library - -Import from @packages/ui/src/: - -```tsx -// Shadcn components -import { Button } from '@kit/ui/button'; -import { Card } from '@kit/ui/card'; -// Makerkit components -import { If } from '@kit/ui/if'; -import { ProfileAvatar } from '@kit/ui/profile-avatar'; -import { toast } from '@kit/ui/sonner'; -import { Trans } from '@kit/ui/trans'; -``` - -### Styling - -- Use Tailwind CSS v4 with semantic classes -- Prefer Shadcn-ui classes like `bg-background`, `text-muted-foreground` -- Use `cn()` utility from @kit/ui/cn for class merging - -## Workspace Contexts 🏢 - -### Personal Account Context (@apps/web/app/home/(user)) - -```tsx -import { useUserWorkspace } from '@kit/accounts/hooks/use-user-workspace'; - -function PersonalComponent() { - const { user, account } = useUserWorkspace(); - // Personal account data -} -``` - -Context provider: @packages/features/accounts/src/components/user-workspace-context-provider.tsx - -### Team Account Context (@apps/web/app/home/[account]) - -```tsx -import { useTeamAccountWorkspace } from '@kit/team-accounts/hooks/use-team-account-workspace'; - -function TeamComponent() { - const { account, user, accounts } = useTeamAccountWorkspace(); - // Team account data with permissions -} -``` - -Context provider: @packages/features/team-accounts/src/components/team-account-workspace-context-provider.tsx - -## Error Handling & Logging 📊 - -### Structured Logging - -Use logger from @packages/shared/src/logger/logger.ts: - -```typescript -import { getLogger } from '@kit/shared/logger'; - -async function myServerAction() { - const logger = await getLogger(); - const ctx = { name: 'myOperation', userId: user.id }; - - try { - logger.info(ctx, 'Operation started'); - // ... - } catch (error) { - logger.error({ ...ctx, error }, 'Operation failed'); - // handle error - } -} -``` - -## API Services - -### Account Services - -- Personal accounts API: @packages/features/accounts/src/server/api.ts -- Team accounts API: @packages/features/team-accounts/src/server/api.ts -- Admin service: @packages/features/admin/src/lib/server/services/admin.service.ts - -### Billing Services - -- Personal billing: @apps/web/app/home/(user)/billing/\_lib/server/user-billing.service.ts -- Team billing: @apps/web/app/home/[account]/billing/\_lib/server/team-billing.service.ts -- Per-seat billing: @packages/features/team-accounts/src/server/services/account-per-seat-billing.service.ts - -## Key Configuration Files - -- **Feature flags**: @apps/web/config/feature-flags.config.ts -- **i18n settings**: @apps/web/lib/i18n/i18n.settings.ts -- **Supabase config**: @apps/web/supabase/config.toml -- **Middleware**: @apps/web/middleware.ts - -## Quick Reference Checklist ✅ - -### Development Workflow - -- [ ] Enable RLS on new tables -- [ ] Generate TypeScript types after schema changes and infer types from these -- [ ] Implement proper error handling with logging -- [ ] Use Zod schemas for parsing all user input (including cookies, query params, etc.) -- [ ] Add testing attributes to interactive elements -- [ ] Validate permissions before sensitive operations \ No newline at end of file +- Add `data-test` for E2E tests where appropriate +- `useEffect` is a code smell and must be justified - avoid if possible +- Do not write many separate `useState`, prefer single state object (unless required) +- Prefer server-side data fetching using RSC \ No newline at end of file diff --git a/CLAUDE.md b/CLAUDE.md index db508bf0f..a0090b7b7 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -1,25 +1,23 @@ -# CLAUDE.md - This file provides guidance to Claude Code when working with code in this repository. -### Core Technologies +## Core Technologies -- **Next.js 15** with App Router and Turbopack +- **Next.js 15** with App Router - **Supabase** for database, auth, and storage -- **React 19** with React Compiler -- **TypeScript** with strict configuration -- **Tailwind CSS 4** for styling -- **Turborepo** for monorepo management +- **React 19** +- **TypeScript** +- **Tailwind CSS 4** and Shadcn UI +- **Turborepo** -### Monorepo Structure +## Monorepo Structure -- @apps/web - Main Next.js SaaS application -- @apps/dev-tool - Development utilities (port 3010) -- @apps/e2e - Playwright end-to-end tests -- @packages/ - Shared packages and utilities -- @tooling/ - Build tools and development scripts +- `apps/web` - Main Next.js SaaS application +- `apps/e2e` - Playwright end-to-end tests +- `packages/features/*` - Feature packages +- `packages/` - Shared packages and utilities +- `tooling/` - Build tools and development scripts -### Multi-Tenant Architecture +## Multi-Tenant Architecture **Personal Accounts**: Individual user accounts (auth.users.id = accounts.id) **Team Accounts**: Shared workspaces with members, roles, and permissions @@ -33,8 +31,6 @@ Data associates with accounts via foreign keys for proper access control. ```bash pnpm dev # Start all apps pnpm --filter web dev # Main app (port 3000) -pnpm --filter dev-tool dev # Dev tools (port 3010) -pnpm build # Build all apps ``` ### Database Operations @@ -49,570 +45,28 @@ pnpm --filter web supabase:db:diff # Create migration ### Code Quality ```bash -pnpm lint && pnpm format # Lint and format -pnpm typecheck # Type checking -pnpm test # Run tests +pnpm format:fix +pnpm lint:fix +pnpm typecheck ``` -## Application Structure +- Run the typecheck command regularly to ensure your code is type-safe. +- Run the linter and the formatter when your task is complete. -### Route Organization +## Typescript -``` -app/ -├── (marketing)/ # Public pages (landing, blog, docs) -├── (auth)/ # Authentication pages -├── home/ -│ ├── (user)/ # Personal account context -│ └── [account]/ # Team account context ([account] = team slug) -├── admin/ # Super admin section -└── api/ # API routes -``` +- Write clean, clear, well-designed, explicit TypeScript +- Avoid obvious comments +- Avoid unnecessary complexity or overly abstract code +- Always use implicit type inference, unless impossible +- You must avoid using `any` +- Handle errors gracefully using try/catch and appropriate error types -Key Examples: +## React -- Marketing layout: @apps/web/app/(marketing)/layout.tsx -- Personal dashboard: @apps/web/app/home/(user)/page.tsx -- Team workspace: @apps/web/app/home/[account]/page.tsx -- Admin section: @apps/web/app/admin/page.tsx - -### Component Organization - -- **Route-specific**: Use \_components/ directories -- **Route utilities**: Use \_lib/ for client, \_lib/server/ for server-side -- **Global components**: Root-level directories - -Example: - -- Team components: @apps/web/app/home/[account]/\_components/ -- Team server utils: @apps/web/app/home/[account]/\_lib/server/ -- Marketing components: @apps/web/app/(marketing)/\_components/ - -## Database Guidelines - -### Security & RLS Implementation - -**Critical Security Guidelines - Read Carefully! ⚠️** - -#### Database Security Fundamentals - -- **Always enable RLS** on new tables unless explicitly instructed otherwise -- **NEVER use SECURITY DEFINER functions** without explicit access controls - they bypass RLS entirely -- **Always use security_invoker=true for views** to maintain proper access control -- **Storage buckets MUST validate access** using account_id in the path structure. See @apps/web/supabase/schemas/16-storage.sql for proper implementation. -- **Use locks if required**: Database locks prevent race conditions and timing attacks in concurrent operations. Make sure to take these into account for all database operations. - -#### Security Definer Function - Dangerous Pattern ❌ - -```sql --- NEVER DO THIS - Allows any authenticated user to call function -CREATE OR REPLACE FUNCTION public.dangerous_function() -RETURNS void -LANGUAGE plpgsql -SECURITY DEFINER AS $ -BEGIN - -- This bypasses all RLS policies! - DELETE FROM sensitive_table; -- Anyone can call this! -END; -$; -GRANT EXECUTE ON FUNCTION public.dangerous_function() TO authenticated; -``` - -#### Security Definer Function - Safe Pattern ✅ - -```sql --- ONLY use SECURITY DEFINER with explicit access validation -CREATE OR REPLACE FUNCTION public.safe_admin_function(target_account_id uuid) -RETURNS void -LANGUAGE plpgsql -SECURITY DEFINER -SET search_path = '' AS $ -BEGIN - -- MUST validate caller has permission FIRST - IF NOT public.is_account_owner(target_account_id) THEN - RAISE EXCEPTION 'Access denied: insufficient permissions'; - END IF; - - -- Now safe to proceed with elevated privileges - -- Your admin operation here -END; -$; -``` - -#### Existing Helper Functions - Use These! 📚 - -**DO NOT recreate these functions - they already exist:** - -```sql --- Account Access Control -public.has_role_on_account(account_id, role?) -- Check team membership -public.has_permission(user_id, account_id, permission) -- Check permissions -public.is_account_owner(account_id) -- Verify ownership -public.has_active_subscription(account_id) -- Subscription status -public.is_team_member(account_id, user_id) -- Direct membership check -public.can_action_account_member(target_account_id, target_user_id) -- Member action rights - --- Administrative Functions -public.is_super_admin() -- Super admin check -public.is_aal2() -- MFA verification -public.is_mfa_compliant() -- MFA compliance - --- Configuration -public.is_set(field_name) -- Feature flag checks -``` - -Always check @apps/web/supabase/schemas/ before creating new functions! - -#### RLS Policy Best Practices ✅ - -```sql --- Proper RLS using existing helper functions -CREATE POLICY "notes_read" ON public.notes FOR SELECT - TO authenticated USING ( - account_id = (select auth.uid()) OR - public.has_role_on_account(account_id) - ); - --- For operations requiring specific permissions -CREATE POLICY "notes_manage" ON public.notes FOR ALL - TO authenticated USING ( - public.has_permission(auth.uid(), account_id, 'notes.manage'::app_permissions) - ); -``` - -### Schema Management Workflow - -1. Create schemas in @apps/web/supabase/schemas/ as `-.sql` -2. After changes: `pnpm supabase:web:stop` -3. Run: `pnpm --filter web run supabase:db:diff -f ` -4. Restart: `pnpm supabase:web:start` and `pnpm supabase:web:reset` -5. Generate types: `pnpm supabase:web:typegen` - -Key schema files: - -- Accounts: @apps/web/supabase/schemas/03-accounts.sql -- Memberships: @apps/web/supabase/schemas/05-memberships.sql -- Permissions: @apps/web/supabase/schemas/06-roles-permissions.sql - -### Type Generation - -```typescript -import { Tables } from '@kit/supabase/database'; - -type Account = Tables<'accounts'>; -``` - -Always prefer inferring types from generated Database types. - -## Development Patterns - -### Data Fetching Strategy - -**Quick Decision Framework:** - -- **Server Components**: Default choice for initial data loading -- **Client Components**: For interactive features requiring hooks or real-time updates -- **Admin Client**: Only for bypassing RLS (rare cases - requires manual auth/authorization) - -#### Server Components (Preferred) ✅ - -```typescript -import { getSupabaseServerClient } from '@kit/supabase/server-client'; - -async function NotesPage() { - const client = getSupabaseServerClient(); - const { data, error } = await client.from('notes').select('*'); - - if (error) return ; - return ; -} -``` - -**Key Insight**: Server Components automatically inherit RLS protection - no additional authorization checks needed! - -#### Client Components (Interactive) 🖱️ - -```typescript -'use client'; -import { useSupabase } from '@kit/supabase/hooks/use-supabase'; -import { useQuery } from '@tanstack/react-query'; - -function InteractiveNotes() { - const supabase = useSupabase(); - const { data, isLoading } = useQuery({ - queryKey: ['notes'], - queryFn: () => supabase.from('notes').select('*') - }); - - if (isLoading) return ; - return ; -} -``` - -#### Performance Optimization - Parallel Data Fetching 🚀 - -**Sequential (Slow) Pattern ❌** - -```typescript -async function SlowDashboard() { - const userData = await loadUserData(); - const notifications = await loadNotifications(); - const metrics = await loadMetrics(); - // Total time: sum of all requests -} -``` - -**Parallel (Optimized) Pattern ✅** - -```typescript -async function FastDashboard() { - // Execute all requests simultaneously - const [userData, notifications, metrics] = await Promise.all([ - loadUserData(), - loadNotifications(), - loadMetrics() - ]); - // Total time: longest single request - - return ; -} -``` - -**Performance Impact**: Parallel fetching can reduce page load time by 60-80% for multi-data pages! - -### Authorization Patterns - Critical Understanding 🔐 - -#### RLS-Protected Data Fetching (Standard) ✅ - -```typescript -async function getUserNotes(userId: string) { - const client = getSupabaseServerClient(); - - // RLS automatically ensures user can only access their own notes - // NO additional authorization checks needed! - const { data } = await client.from('notes').select('*').eq('user_id', userId); // RLS validates this automatically - - return data; -} -``` - -#### Admin Client Usage (Dangerous - Rare Cases Only) ⚠️ - -```typescript -async function adminGetUserNotes(userId: string) { - const adminClient = getSupabaseServerAdminClient(); - - // CRITICAL: Manual authorization required - bypasses RLS! - const currentUser = await getCurrentUser(); - if (!(await isSuperAdmin(currentUser))) { - throw new Error('Unauthorized: Admin access required'); - } - - // Additional validation: ensure current admin isn't targeting themselves - if (currentUser.id === userId) { - throw new Error('Cannot perform admin action on own account'); - } - - // Now safe to proceed with admin privileges - const { data } = await adminClient - .from('notes') - .select('*') - .eq('user_id', userId); - - return data; -} -``` - -**Rule of thumb**: If using standard Supabase client, trust RLS. If using admin client, validate everything manually. - -### Server Actions Implementation - -Always use `enhanceAction` from @packages/next/src/actions/index.ts: - -```typescript -'use server'; - -import { enhanceAction } from '@kit/next/actions'; - -export const createNoteAction = enhanceAction( - async function (data, user) { - // data is validated, user is authenticated - return { success: true }; - }, - { - auth: true, - schema: CreateNoteSchema, - }, -); -``` - -Example server actions: - -- Team billing: @apps/web/app/home/[account]/billing/\_lib/server/server-actions.ts -- Personal settings: @apps/web/app/home/(user)/settings/\_lib/server/server-actions.ts - -### Forms with React Hook Form & Zod - -```typescript -// 1. Schema in separate file -export const CreateNoteSchema = z.object({ - title: z.string().min(1), - content: z.string().min(1), -}); - -// 2. Client component with form -'use client'; -const form = useForm({ - resolver: zodResolver(CreateNoteSchema), -}); - -const onSubmit = (data) => { - startTransition(async () => { - await toast.promise(createNoteAction(data), { - loading: 'Creating...', - success: 'Created!', - error: 'Failed!', - }); - }); -}; -``` - -Form examples: - -- Contact form: @apps/web/app/(marketing)/contact/\_components/contact-form.tsx -- Verify OTP form: @packages/otp/src/components/verify-otp-form.tsx - -### Route Handlers (API Routes) - -Use `enhanceRouteHandler` from @packages/next/src/routes/index.ts: - -```typescript -import { enhanceRouteHandler } from '@kit/next/routes'; - -export const POST = enhanceRouteHandler( - async function ({ body, user, request }) { - // body is validated, user available if auth: true - return NextResponse.json({ success: true }); - }, - { - auth: true, - schema: ZodSchema, - }, -); -``` - -## React & TypeScript Best Practices - -### TS - -- Write clean, clear, well-designed, explicit Typescript -- Use implicit type inference, unless impossible -- `any` and `unknown` are a code smell and must justified if used -- Handle errors gracefully using try/catch and appropriate error types. - -### Components - -- Use functional components with TypeScript +- Use functional components - Always use 'use client' directive for client components -- Destructure props with proper TypeScript interfaces -- Name files to match component name (e.g., user-profile.tsx) - -### Conditional Rendering - -Use the `If` component from @packages/ui/src/makerkit/if.tsx: - -```tsx -import { If } from '@kit/ui/if'; - -}> - - - -// With type inference - - {(err) => } - -``` - -### Testing Attributes - -```tsx - -
Profile
-``` - -### Internationalization - -Always use `Trans` component from @packages/ui/src/makerkit/trans.tsx: - -```tsx -import { Trans } from '@kit/ui/trans'; - - - -// With HTML elements -, - }} -/> -``` - -Adding new languages: - -1. Add language code to @apps/web/lib/i18n/i18n.settings.ts -2. Create translation files in @apps/web/public/locales/[new-language]/ -3. Copy structure from English files - -Translation files: @apps/web/public/locales//.json - -## Security Guidelines 🛡️ - -### Authentication & Authorization - -- Authentication enforced by middleware -- Authorization handled by RLS at database level -- Avoid defensive code - use RLS instead -- For admin client usage, enforce both authentication and authorization - -### Data Passing - -- **Never pass sensitive data** to Client Components -- **Never expose server environment variables** to client (unless prefixed with NEXT_PUBLIC) -- Always validate user input - -### OTP for Sensitive Operations - -Use one-time tokens from @packages/otp/src/api/index.ts: - -```tsx -import { VerifyOtpForm } from '@kit/otp/components'; - - { - // Proceed with verified operation - }} -/>; -``` - -### Super Admin Protection - -For admin routes, use `AdminGuard` from @packages/features/admin/src/components/admin-guard.tsx: - -```tsx -import { AdminGuard } from '@kit/admin/components/admin-guard'; - -export default AdminGuard(AdminPageComponent); -``` - -## UI Components 🎨 - -### Core UI Library - -Import from @packages/ui/src/: - -```tsx -// Shadcn components -import { Button } from '@kit/ui/button'; -import { Card } from '@kit/ui/card'; -// Makerkit components -import { If } from '@kit/ui/if'; -import { ProfileAvatar } from '@kit/ui/profile-avatar'; -import { toast } from '@kit/ui/sonner'; -import { Trans } from '@kit/ui/trans'; -``` - -### Styling - -- Use Tailwind CSS v4 with semantic classes -- Prefer Shadcn-ui classes like `bg-background`, `text-muted-foreground` -- Use `cn()` utility from @kit/ui/cn for class merging - -## Workspace Contexts 🏢 - -### Personal Account Context (@apps/web/app/home/(user)) - -```tsx -import { useUserWorkspace } from '@kit/accounts/hooks/use-user-workspace'; - -function PersonalComponent() { - const { user, account } = useUserWorkspace(); - // Personal account data -} -``` - -Context provider: @packages/features/accounts/src/components/user-workspace-context-provider.tsx - -### Team Account Context (@apps/web/app/home/[account]) - -```tsx -import { useTeamAccountWorkspace } from '@kit/team-accounts/hooks/use-team-account-workspace'; - -function TeamComponent() { - const { account, user, accounts } = useTeamAccountWorkspace(); - // Team account data with permissions -} -``` - -Context provider: @packages/features/team-accounts/src/components/team-account-workspace-context-provider.tsx - -## Error Handling & Logging 📊 - -### Structured Logging - -Use logger from @packages/shared/src/logger/logger.ts: - -```typescript -import { getLogger } from '@kit/shared/logger'; - -async function myServerAction() { - const logger = await getLogger(); - const ctx = { name: 'myOperation', userId: user.id }; - - try { - logger.info(ctx, 'Operation started'); - // ... - } catch (error) { - logger.error({ ...ctx, error }, 'Operation failed'); - // handle error - } -} -``` - -## API Services - -### Account Services - -- Personal accounts API: @packages/features/accounts/src/server/api.ts -- Team accounts API: @packages/features/team-accounts/src/server/api.ts -- Admin service: @packages/features/admin/src/lib/server/services/admin.service.ts - -### Billing Services - -- Personal billing: @apps/web/app/home/(user)/billing/\_lib/server/user-billing.service.ts -- Team billing: @apps/web/app/home/[account]/billing/\_lib/server/team-billing.service.ts -- Per-seat billing: @packages/features/team-accounts/src/server/services/account-per-seat-billing.service.ts - -## Key Configuration Files - -- **Feature flags**: @apps/web/config/feature-flags.config.ts -- **i18n settings**: @apps/web/lib/i18n/i18n.settings.ts -- **Supabase config**: @apps/web/supabase/config.toml -- **Middleware**: @apps/web/middleware.ts - -## Quick Reference Checklist ✅ - -### Development Workflow - -- [ ] Enable RLS on new tables -- [ ] Generate TypeScript types after schema changes and infer types from these -- [ ] Implement proper error handling with logging -- [ ] Use Zod schemas for parsing all user input (including cookies, query params, etc.) -- [ ] Add testing attributes to interactive elements -- [ ] Validate permissions before sensitive operations \ No newline at end of file +- Add `data-test` for E2E tests where appropriate +- `useEffect` is a code smell and must be justified - avoid if possible +- Do not write many separate `useState`, prefer single state object (unless required) +- Prefer server-side data fetching using RSC \ No newline at end of file diff --git a/apps/dev-tool/package.json b/apps/dev-tool/package.json index dd8a0bc2c..da6d3c8cc 100644 --- a/apps/dev-tool/package.json +++ b/apps/dev-tool/package.json @@ -8,13 +8,13 @@ "format": "prettier --check --write \"**/*.{js,cjs,mjs,ts,tsx,md,json}\"" }, "dependencies": { - "@ai-sdk/openai": "^2.0.24", + "@ai-sdk/openai": "^2.0.30", "@faker-js/faker": "^10.0.0", - "@hookform/resolvers": "^5.2.1", - "@tanstack/react-query": "5.87.1", - "ai": "5.0.33", - "lucide-react": "^0.542.0", - "next": "15.5.2", + "@hookform/resolvers": "^5.2.2", + "@tanstack/react-query": "5.89.0", + "ai": "5.0.44", + "lucide-react": "^0.544.0", + "next": "15.5.3", "nodemailer": "^7.0.6", "react": "19.1.1", "react-dom": "19.1.1", @@ -28,9 +28,9 @@ "@kit/tsconfig": "workspace:*", "@kit/ui": "workspace:*", "@tailwindcss/postcss": "^4.1.13", - "@types/node": "^24.3.1", + "@types/node": "^24.5.0", "@types/nodemailer": "7.0.1", - "@types/react": "19.1.12", + "@types/react": "19.1.13", "@types/react-dom": "19.1.9", "babel-plugin-react-compiler": "19.1.0-rc.3", "pino-pretty": "13.0.0", diff --git a/apps/e2e/package.json b/apps/e2e/package.json index 5fcc89aed..acf4f04d5 100644 --- a/apps/e2e/package.json +++ b/apps/e2e/package.json @@ -13,9 +13,9 @@ "license": "ISC", "devDependencies": { "@playwright/test": "^1.55.0", - "@types/node": "^24.3.1", + "@types/node": "^24.5.0", "dotenv": "17.2.2", "node-html-parser": "^7.0.1", - "totp-generator": "^1.0.0" + "totp-generator": "^2.0.0" } } diff --git a/apps/e2e/tests/admin/admin.spec.ts b/apps/e2e/tests/admin/admin.spec.ts index 255539c24..8862a39b2 100644 --- a/apps/e2e/tests/admin/admin.spec.ts +++ b/apps/e2e/tests/admin/admin.spec.ts @@ -130,7 +130,7 @@ test.describe('Admin', () => { ), ]); - await expect(page.getByText('Banned')).toBeVisible(); + await expect(page.getByText('Banned').first()).toBeVisible(); await page.context().clearCookies(); @@ -156,7 +156,7 @@ test.describe('Admin', () => { await page.fill('[placeholder="Type CONFIRM to confirm"]', 'CONFIRM'); await page.getByRole('button', { name: 'Ban User' }).click(); - await expect(page.getByText('Banned')).toBeVisible(); + await expect(page.getByText('Banned').first()).toBeVisible(); // Now reactivate await page.getByTestId('admin-reactivate-account-button').click(); @@ -199,6 +199,7 @@ test.describe('Admin', () => { test('impersonate user flow', async ({ page }) => { await page.getByTestId('admin-impersonate-button').click(); + await expect( page.getByRole('heading', { name: 'Impersonate User' }), ).toBeVisible(); @@ -394,14 +395,15 @@ async function filterAccounts(page: Page, email: string) { } async function selectAccount(page: Page, email: string) { - const link = page - .locator('tr', { hasText: email.split('@')[0] }) - .locator('a'); + await expect(async () => { + const link = page + .locator('tr', { hasText: email.split('@')[0] }) + .locator('a'); - await expect(link).toBeVisible(); + await expect(link).toBeVisible(); - await link.click(); + await link.click(); - await page.waitForURL(new RegExp(`/admin/accounts/[a-z0-9-]+`)); - await page.waitForTimeout(500); + await page.waitForLoadState('networkidle'); + }).toPass(); } diff --git a/apps/e2e/tests/authentication/auth.po.ts b/apps/e2e/tests/authentication/auth.po.ts index 5b744767e..d2d080cfa 100644 --- a/apps/e2e/tests/authentication/auth.po.ts +++ b/apps/e2e/tests/authentication/auth.po.ts @@ -1,5 +1,4 @@ import { Page, expect } from '@playwright/test'; -import { TOTP } from 'totp-generator'; import { Mailbox } from '../utils/mailbox'; @@ -50,7 +49,9 @@ export class AuthPageObject { async submitMFAVerification(key: string) { const period = 30; - const { otp } = TOTP.generate(key, { + const { TOTP } = await import('totp-generator'); + + const { otp } = await TOTP.generate(key, { period, }); diff --git a/apps/e2e/tests/invitations/invitations.po.ts b/apps/e2e/tests/invitations/invitations.po.ts index 582e8f843..fe9fe4695 100644 --- a/apps/e2e/tests/invitations/invitations.po.ts +++ b/apps/e2e/tests/invitations/invitations.po.ts @@ -59,13 +59,13 @@ export class InvitationsPageObject { navigateToMembers() { return expect(async () => { await this.page - .locator('a', { - hasText: 'Members', - }) - .click(); + .locator('a', { + hasText: 'Members', + }) + .click(); await this.page.waitForURL('**/home/*/members'); - }).toPass() + }).toPass(); } async openInviteForm() { @@ -127,6 +127,8 @@ export class InvitationsPageObject { }); await Promise.all([click, response]); + + console.log('Invitation accepted'); } private getInviteForm() { diff --git a/apps/e2e/tests/team-accounts/team-invitation-mfa.spec.ts b/apps/e2e/tests/team-accounts/team-invitation-mfa.spec.ts index d2622db08..6b7125e61 100644 --- a/apps/e2e/tests/team-accounts/team-invitation-mfa.spec.ts +++ b/apps/e2e/tests/team-accounts/team-invitation-mfa.spec.ts @@ -84,7 +84,9 @@ test.describe('Team Invitation with MFA Flow', () => { await invitations.acceptInvitation(); // Should be redirected to the team dashboard - await page.waitForURL(`/home/${teamSlug}`); + await page.waitForURL(`/home/${teamSlug}`, { + timeout: 5_000, + }); // Step 4: Verify membership was successful // Open account selector to verify team is available diff --git a/apps/web/AGENTS.md b/apps/web/AGENTS.md new file mode 100644 index 000000000..f19d188b2 --- /dev/null +++ b/apps/web/AGENTS.md @@ -0,0 +1,264 @@ +# Web Application Instructions + +This file contains instructions specific to the main Next.js web application. + +## Application Structure + +### Route Organization + +``` +app/ +├── (marketing)/ # Public pages (landing, blog, docs) +├── (auth)/ # Authentication pages +├── home/ +│ ├── (user)/ # Personal account context +│ └── [account]/ # Team account context ([account] = team slug) +├── admin/ # Super admin section +└── api/ # API routes +``` + +Key Examples: + +- Marketing layout: `app/(marketing)/layout.tsx` +- Personal dashboard: `app/home/(user)/page.tsx` +- Team workspace: `app/home/[account]/page.tsx` +- Admin section: `app/admin/page.tsx` + +### Component Organization + +- **Route-specific**: Use `_components/` directories +- **Route utilities**: Use `_lib/` for client, `_lib/server/` for server-side +- **Global components**: Root-level directories + +Example: + +- Team components: `app/home/[account]/_components/` +- Team server utils: `app/home/[account]/_lib/server/` +- Marketing components: `app/(marketing)/_components/` + +## Data Fetching Strategy + +**Quick Decision Framework:** + +- **Server Components**: Default choice for initial data loading +- **Client Components**: For interactive features requiring hooks or real-time updates +- **Admin Client**: Only for bypassing RLS (rare cases - requires manual auth/authorization) + +### Server Components (Preferred) ✅ + +```typescript +import { getSupabaseServerClient } from '@kit/supabase/server-client'; + +async function NotesPage() { + const client = getSupabaseServerClient(); + const { data, error } = await client.from('notes').select('*'); + + if (error) return ; + return ; +} +``` + +**Key Insight**: Server Components automatically inherit RLS protection - no additional authorization checks needed! + +### Client Components (Interactive) 🖱️ + +```typescript +'use client'; +import { useSupabase } from '@kit/supabase/hooks/use-supabase'; +import { useQuery } from '@tanstack/react-query'; + +function InteractiveNotes() { + const supabase = useSupabase(); + const { data, isLoading } = useQuery({ + queryKey: ['notes'], + queryFn: () => supabase.from('notes').select('*') + }); + + if (isLoading) return ; + return ; +} +``` + +### Performance Optimization - Parallel Data Fetching 🚀 + +**Sequential (Slow) Pattern ❌** + +```typescript +async function SlowDashboard() { + const userData = await loadUserData(); + const notifications = await loadNotifications(); + const metrics = await loadMetrics(); + // Total time: sum of all requests +} +``` + +**Parallel (Optimized) Pattern ✅** + +```typescript +async function FastDashboard() { + // Execute all requests simultaneously + const [userData, notifications, metrics] = await Promise.all([ + loadUserData(), + loadNotifications(), + loadMetrics() + ]); + // Total time: longest single request + + return ; +} +``` + +**Performance Impact**: Parallel fetching can reduce page load time by 60-80% for multi-data pages! + +## Authorization Patterns - Critical Understanding 🔐 + +### RLS-Protected Data Fetching (Standard) ✅ + +```typescript +async function getUserNotes(userId: string) { + const client = getSupabaseServerClient(); + + // RLS automatically ensures user can only access their own notes + // NO additional authorization checks needed! + const { data } = await client.from('notes').select('*').eq('user_id', userId); // RLS validates this automatically + + return data; +} +``` + +### Admin Client Usage (Dangerous - Rare Cases Only) ⚠️ + +```typescript +async function adminGetUserNotes(userId: string) { + const adminClient = getSupabaseServerAdminClient(); + + // CRITICAL: Manual authorization required - bypasses RLS! + const currentUser = await getCurrentUser(); + if (!(await isSuperAdmin(currentUser))) { + throw new Error('Unauthorized: Admin access required'); + } + + // Additional validation: ensure current admin isn't targeting themselves + if (currentUser.id === userId) { + throw new Error('Cannot perform admin action on own account'); + } + + // Now safe to proceed with admin privileges + const { data } = await adminClient + .from('notes') + .select('*') + .eq('user_id', userId); + + return data; +} +``` + +**Rule of thumb**: If using standard Supabase client, trust RLS. If using admin client, validate everything manually. + +## Internationalization + +Always use `Trans` component from `@kit/ui/trans`: + +```tsx +import { Trans } from '@kit/ui/trans'; + + + +// With HTML elements +, + }} +/> +``` + +### Adding New Languages + +1. Add language code to `lib/i18n/i18n.settings.ts` +2. Create translation files in `public/locales/[new-language]/` +3. Copy structure from English files + +Translation files: `public/locales//.json` + +## Workspace Contexts 🏢 + +### Personal Account Context (`app/home/(user)`) + +```tsx +import { useUserWorkspace } from '@kit/accounts/hooks/use-user-workspace'; + +function PersonalComponent() { + const { user, account } = useUserWorkspace(); + // Personal account data +} +``` + +Context provider: `@packages/features/accounts/src/components/user-workspace-context-provider.tsx` + +### Team Account Context (`app/home/[account]`) + +```tsx +import { useTeamAccountWorkspace } from '@kit/team-accounts/hooks/use-team-account-workspace'; + +function TeamComponent() { + const { account, user, accounts } = useTeamAccountWorkspace(); + // Team account data with permissions +} +``` + +Context provider: `@packages/features/team-accounts/src/components/team-account-workspace-context-provider.tsx` + +## Key Configuration Files + +- **Feature flags**: `config/feature-flags.config.ts` +- **i18n settings**: `lib/i18n/i18n.settings.ts` +- **Supabase config**: `supabase/config.toml` +- **Middleware**: `middleware.ts` + +## Route Handlers (API Routes) + +Use `enhanceRouteHandler` from `@packages/next/src/routes/index.ts`: + +```typescript +import { enhanceRouteHandler } from '@kit/next/routes'; + +export const POST = enhanceRouteHandler( + async function ({ body, user, request }) { + // body is validated, user available if auth: true + return NextResponse.json({ success: true }); + }, + { + auth: true, + schema: ZodSchema, + }, +); +``` + +## Security Guidelines 🛡️ + +### Authentication & Authorization + +- Authentication already enforced by middleware +- Authorization handled by RLS at database level (in most cases) +- Avoid defensive code - use RLS instead +- When using the Supabase admin client, must enforce both authentication and authorization + +### Passing data to the client + +- **Never pass sensitive data** to Client Components +- **Never expose server environment variables** to client (unless prefixed with NEXT_PUBLIC) +- Always validate user input + +### Super Admin Protection + +For admin routes, use `AdminGuard` from `@packages/features/admin/src/components/admin-guard.tsx`: + +```tsx +import { AdminGuard } from '@kit/admin/components/admin-guard'; + +export default AdminGuard(AdminPageComponent); +``` diff --git a/apps/web/CLAUDE.md b/apps/web/CLAUDE.md new file mode 100644 index 000000000..f19d188b2 --- /dev/null +++ b/apps/web/CLAUDE.md @@ -0,0 +1,264 @@ +# Web Application Instructions + +This file contains instructions specific to the main Next.js web application. + +## Application Structure + +### Route Organization + +``` +app/ +├── (marketing)/ # Public pages (landing, blog, docs) +├── (auth)/ # Authentication pages +├── home/ +│ ├── (user)/ # Personal account context +│ └── [account]/ # Team account context ([account] = team slug) +├── admin/ # Super admin section +└── api/ # API routes +``` + +Key Examples: + +- Marketing layout: `app/(marketing)/layout.tsx` +- Personal dashboard: `app/home/(user)/page.tsx` +- Team workspace: `app/home/[account]/page.tsx` +- Admin section: `app/admin/page.tsx` + +### Component Organization + +- **Route-specific**: Use `_components/` directories +- **Route utilities**: Use `_lib/` for client, `_lib/server/` for server-side +- **Global components**: Root-level directories + +Example: + +- Team components: `app/home/[account]/_components/` +- Team server utils: `app/home/[account]/_lib/server/` +- Marketing components: `app/(marketing)/_components/` + +## Data Fetching Strategy + +**Quick Decision Framework:** + +- **Server Components**: Default choice for initial data loading +- **Client Components**: For interactive features requiring hooks or real-time updates +- **Admin Client**: Only for bypassing RLS (rare cases - requires manual auth/authorization) + +### Server Components (Preferred) ✅ + +```typescript +import { getSupabaseServerClient } from '@kit/supabase/server-client'; + +async function NotesPage() { + const client = getSupabaseServerClient(); + const { data, error } = await client.from('notes').select('*'); + + if (error) return ; + return ; +} +``` + +**Key Insight**: Server Components automatically inherit RLS protection - no additional authorization checks needed! + +### Client Components (Interactive) 🖱️ + +```typescript +'use client'; +import { useSupabase } from '@kit/supabase/hooks/use-supabase'; +import { useQuery } from '@tanstack/react-query'; + +function InteractiveNotes() { + const supabase = useSupabase(); + const { data, isLoading } = useQuery({ + queryKey: ['notes'], + queryFn: () => supabase.from('notes').select('*') + }); + + if (isLoading) return ; + return ; +} +``` + +### Performance Optimization - Parallel Data Fetching 🚀 + +**Sequential (Slow) Pattern ❌** + +```typescript +async function SlowDashboard() { + const userData = await loadUserData(); + const notifications = await loadNotifications(); + const metrics = await loadMetrics(); + // Total time: sum of all requests +} +``` + +**Parallel (Optimized) Pattern ✅** + +```typescript +async function FastDashboard() { + // Execute all requests simultaneously + const [userData, notifications, metrics] = await Promise.all([ + loadUserData(), + loadNotifications(), + loadMetrics() + ]); + // Total time: longest single request + + return ; +} +``` + +**Performance Impact**: Parallel fetching can reduce page load time by 60-80% for multi-data pages! + +## Authorization Patterns - Critical Understanding 🔐 + +### RLS-Protected Data Fetching (Standard) ✅ + +```typescript +async function getUserNotes(userId: string) { + const client = getSupabaseServerClient(); + + // RLS automatically ensures user can only access their own notes + // NO additional authorization checks needed! + const { data } = await client.from('notes').select('*').eq('user_id', userId); // RLS validates this automatically + + return data; +} +``` + +### Admin Client Usage (Dangerous - Rare Cases Only) ⚠️ + +```typescript +async function adminGetUserNotes(userId: string) { + const adminClient = getSupabaseServerAdminClient(); + + // CRITICAL: Manual authorization required - bypasses RLS! + const currentUser = await getCurrentUser(); + if (!(await isSuperAdmin(currentUser))) { + throw new Error('Unauthorized: Admin access required'); + } + + // Additional validation: ensure current admin isn't targeting themselves + if (currentUser.id === userId) { + throw new Error('Cannot perform admin action on own account'); + } + + // Now safe to proceed with admin privileges + const { data } = await adminClient + .from('notes') + .select('*') + .eq('user_id', userId); + + return data; +} +``` + +**Rule of thumb**: If using standard Supabase client, trust RLS. If using admin client, validate everything manually. + +## Internationalization + +Always use `Trans` component from `@kit/ui/trans`: + +```tsx +import { Trans } from '@kit/ui/trans'; + + + +// With HTML elements +, + }} +/> +``` + +### Adding New Languages + +1. Add language code to `lib/i18n/i18n.settings.ts` +2. Create translation files in `public/locales/[new-language]/` +3. Copy structure from English files + +Translation files: `public/locales//.json` + +## Workspace Contexts 🏢 + +### Personal Account Context (`app/home/(user)`) + +```tsx +import { useUserWorkspace } from '@kit/accounts/hooks/use-user-workspace'; + +function PersonalComponent() { + const { user, account } = useUserWorkspace(); + // Personal account data +} +``` + +Context provider: `@packages/features/accounts/src/components/user-workspace-context-provider.tsx` + +### Team Account Context (`app/home/[account]`) + +```tsx +import { useTeamAccountWorkspace } from '@kit/team-accounts/hooks/use-team-account-workspace'; + +function TeamComponent() { + const { account, user, accounts } = useTeamAccountWorkspace(); + // Team account data with permissions +} +``` + +Context provider: `@packages/features/team-accounts/src/components/team-account-workspace-context-provider.tsx` + +## Key Configuration Files + +- **Feature flags**: `config/feature-flags.config.ts` +- **i18n settings**: `lib/i18n/i18n.settings.ts` +- **Supabase config**: `supabase/config.toml` +- **Middleware**: `middleware.ts` + +## Route Handlers (API Routes) + +Use `enhanceRouteHandler` from `@packages/next/src/routes/index.ts`: + +```typescript +import { enhanceRouteHandler } from '@kit/next/routes'; + +export const POST = enhanceRouteHandler( + async function ({ body, user, request }) { + // body is validated, user available if auth: true + return NextResponse.json({ success: true }); + }, + { + auth: true, + schema: ZodSchema, + }, +); +``` + +## Security Guidelines 🛡️ + +### Authentication & Authorization + +- Authentication already enforced by middleware +- Authorization handled by RLS at database level (in most cases) +- Avoid defensive code - use RLS instead +- When using the Supabase admin client, must enforce both authentication and authorization + +### Passing data to the client + +- **Never pass sensitive data** to Client Components +- **Never expose server environment variables** to client (unless prefixed with NEXT_PUBLIC) +- Always validate user input + +### Super Admin Protection + +For admin routes, use `AdminGuard` from `@packages/features/admin/src/components/admin-guard.tsx`: + +```tsx +import { AdminGuard } from '@kit/admin/components/admin-guard'; + +export default AdminGuard(AdminPageComponent); +``` diff --git a/apps/web/app/admin/loading.tsx b/apps/web/app/admin/accounts/[id]/loading.tsx similarity index 100% rename from apps/web/app/admin/loading.tsx rename to apps/web/app/admin/accounts/[id]/loading.tsx diff --git a/apps/web/app/admin/accounts/loading.tsx b/apps/web/app/admin/accounts/loading.tsx new file mode 100644 index 000000000..4ea53181d --- /dev/null +++ b/apps/web/app/admin/accounts/loading.tsx @@ -0,0 +1,3 @@ +import { GlobalLoader } from '@kit/ui/global-loader'; + +export default GlobalLoader; diff --git a/apps/web/package.json b/apps/web/package.json index 4d7084c80..a44d29a90 100644 --- a/apps/web/package.json +++ b/apps/web/package.json @@ -32,7 +32,7 @@ }, "dependencies": { "@edge-csrf/nextjs": "2.5.3-cloudflare-rc1", - "@hookform/resolvers": "^5.2.1", + "@hookform/resolvers": "^5.2.2", "@kit/accounts": "workspace:*", "@kit/admin": "workspace:*", "@kit/analytics": "workspace:*", @@ -53,15 +53,15 @@ "@kit/ui": "workspace:*", "@makerkit/data-loader-supabase-core": "^0.0.10", "@makerkit/data-loader-supabase-nextjs": "^1.2.5", - "@marsidev/react-turnstile": "^1.3.0", + "@marsidev/react-turnstile": "^1.3.1", "@nosecone/next": "1.0.0-beta.11", "@radix-ui/react-icons": "^1.3.2", - "@supabase/supabase-js": "2.57.2", - "@tanstack/react-query": "5.87.1", + "@supabase/supabase-js": "2.57.4", + "@tanstack/react-query": "5.89.0", "@tanstack/react-table": "^8.21.3", "date-fns": "^4.1.0", - "lucide-react": "^0.542.0", - "next": "15.5.2", + "lucide-react": "^0.544.0", + "next": "15.5.3", "next-sitemap": "^4.2.3", "next-themes": "0.4.6", "react": "19.1.1", @@ -76,16 +76,16 @@ "@kit/eslint-config": "workspace:*", "@kit/prettier-config": "workspace:*", "@kit/tsconfig": "workspace:*", - "@next/bundle-analyzer": "15.5.2", + "@next/bundle-analyzer": "15.5.3", "@tailwindcss/postcss": "^4.1.13", - "@types/node": "^24.3.1", - "@types/react": "19.1.12", + "@types/node": "^24.5.0", + "@types/react": "19.1.13", "@types/react-dom": "19.1.9", "babel-plugin-react-compiler": "19.1.0-rc.3", "cssnano": "^7.1.1", "pino-pretty": "13.0.0", "prettier": "^3.6.2", - "supabase": "2.39.2", + "supabase": "2.40.7", "tailwindcss": "4.1.13", "tailwindcss-animate": "^1.0.7", "typescript": "^5.9.2" diff --git a/apps/web/supabase/AGENTS.md b/apps/web/supabase/AGENTS.md new file mode 100644 index 000000000..cdd62370a --- /dev/null +++ b/apps/web/supabase/AGENTS.md @@ -0,0 +1,292 @@ +# Supabase Database Schema Management + +This file contains guidance for working with database schemas, migrations, and Supabase development workflows. + +## Schema Organization + +Schemas are organized in numbered files in the `schemas/` directory. Numbers are used to sort dependencies. + +## Schema Development Workflow + +### 1. Creating New Schema Files + +```bash +# Create new schema file +touch schemas/15-my-new-feature.sql + +# Apply changes and create migration +pnpm --filter web run supabase:db:diff -f my-new-feature + +# Restart Supabase with fresh schema +pnpm supabase:web:reset + +# Generate TypeScript types +pnpm supabase:web:typegen +``` + +### 2. Modifying Existing Schemas + +```bash +# Edit schema file (e.g., schemas/03-accounts.sql) +# Make your changes... + +# Create migration for changes +pnpm --filter web run supabase:db:diff -f update-accounts + +# Apply and test +pnpm supabase:web:reset +pnpm supabase:web:typegen +``` + +## Security First Patterns + +## Add permissions (if any) + +```sql +ALTER TYPE public.app_permissions ADD VALUE 'notes.manage'; +COMMIT; +``` + +### Table Creation with RLS + +```sql +-- Create table +create table if not exists public.notes ( + id uuid unique not null default extensions.uuid_generate_v4(), + account_id uuid references public.accounts(id) on delete cascade not null, + -- ... + primary key (id) +); + +-- CRITICAL: Always enable RLS +alter table "public"."notes" enable row level security; + +-- Revoke default permissions +revoke all on public.notes from authenticated, service_role; + +-- Grant specific permissions +grant select, insert, update, delete on table public.notes to authenticated; + +-- Add RLS policies +create policy "notes_read" on public.notes for select + to authenticated using ( + account_id = (select auth.uid()) or + public.has_role_on_account(account_id) + ); + +create policy "notes_write" on public.notes for insert + to authenticated with check ( + public.has_permission(auth.uid(), account_id, 'notes.manage'::app_permissions) + ); + +create policy "notes_update" on public.notes for update + to authenticated using ( + public.has_permission(auth.uid(), account_id, 'notes.manage'::app_permissions) + ) + with check ( + public.has_permission(auth.uid(), account_id, 'notes.manage'::app_permissions) + ); + +create policy "notes_delete" on public.notes for delete + to authenticated using ( + public.has_permission(auth.uid(), account_id, 'notes.manage'::app_permissions) + ); +``` + +### Storage Bucket Policies + +```sql +-- Create storage bucket +insert into storage.buckets (id, name, public) +values ('documents', 'documents', false); + +-- RLS policy for storage +create policy documents_policy on storage.objects for all using ( + bucket_id = 'documents' + and ( + -- File belongs to user's account + kit.get_storage_filename_as_uuid(name) = auth.uid() + or + -- User has access to the account + public.has_role_on_account(kit.get_storage_filename_as_uuid(name)) + ) +) +with check ( + bucket_id = 'documents' + and ( + kit.get_storage_filename_as_uuid(name) = auth.uid() + or + public.has_permission( + auth.uid(), + kit.get_storage_filename_as_uuid(name), + 'files.upload'::app_permissions + ) + ) +); +``` + +## Function Creation Patterns + +### Safe Security Definer Functions + +```sql +-- NEVER create security definer functions without explicit access controls +create or replace function public.create_team_account(account_name text) +returns public.accounts +language plpgsql +security definer -- Elevated privileges +set search_path = '' -- Prevent SQL injection +as $$ +declare + new_account public.accounts; +begin + -- CRITICAL: Validate permissions first + if not public.is_set('enable_team_accounts') then + raise exception 'Team accounts are not enabled'; + end if; + + -- Additional validation can go here + if length(account_name) < 3 then + raise exception 'Account name must be at least 3 characters'; + end if; + + -- Now safe to proceed with elevated privileges + insert into public.accounts (name, is_personal_account) + values (account_name, false) + returning * into new_account; + + return new_account; +end; +$$; + +-- Grant to authenticated users only +grant execute on function public.create_team_account(text) to authenticated; +``` + +### Security Invoker Functions (Safer) + +```sql +-- Preferred: Functions that inherit RLS policies +create or replace function public.get_account_notes(target_account_id uuid) +returns setof public.notes +language plpgsql +security invoker -- Inherits caller's permissions (RLS applies) +set search_path = '' +as $$ +begin + -- RLS policies will automatically restrict results + return query + select * from public.notes + where account_id = target_account_id + order by created_at desc; +end; +$$; + +grant execute on function public.get_account_notes(uuid) to authenticated; +``` + +### Safe Column Additions + +```sql +-- Safe: Add nullable columns +alter table public.accounts +add column if not exists description text; + +-- Safe: Add columns with defaults +alter table public.accounts +add column if not exists is_verified boolean default false not null; + +-- Unsafe: Adding non-null columns without defaults +-- alter table public.accounts add column required_field text not null; -- DON'T DO THIS +``` + +### Index Management + +```sql +-- Create indexes concurrently for large tables +create index concurrently if not exists ix_accounts_created_at +on public.accounts (created_at desc); + +-- Drop unused indexes +drop index if exists ix_old_unused_index; +``` + +## Testing Database Changes + +### Local Testing + +```bash +# Test with fresh database +pnpm supabase:web:reset + +# Test your changes +pnpm run supabase:web:test +``` + +## Type Generation + +### After Schema Changes + +```bash +# Generate types after any schema changes +pnpm supabase:web:typegen +# Types are generated to src/lib/supabase/database.types.ts + +# Reset DB +pnpm supabase:web:reset +``` + +### Using Generated Types + +```typescript +import { Enums, Tables } from '@kit/supabase/database'; + +// Table types +type Account = Tables<'accounts'>; +type Note = Tables<'notes'>; + +// Enum types +type AppPermission = Enums<'app_permissions'>; + +// Insert types +type AccountInsert = Tables<'accounts'>['Insert']; +type AccountUpdate = Tables<'accounts'>['Update']; + +// Use in functions +async function createNote(data: Tables<'notes'>['Insert']) { + const { data: note, error } = await supabase + .from('notes') + .insert(data) + .select() + .single(); + + return note; +} +``` + +## Common Schema Patterns + +### Audit Trail + +Add triggers if the properties exist and are appropriate: + +- `public.trigger_set_timestamps()` - for tables with `created_at` and `updated_at` + columns +- `public.trigger_set_user_tracking()` - for tables with `created_by` and `updated_by` + columns + +### Useful Commands + +```bash +# View migration status +pnpm --filter web supabase migration list + +# Reset database completely +pnpm supabase:web:reset + +# Generate migration from schema diff +pnpm --filter web run supabase:db:diff -f migration-name + +# Apply specific migration +pnpm --filter web supabase migration up --include-schemas public +``` diff --git a/apps/web/supabase/CLAUDE.md b/apps/web/supabase/CLAUDE.md new file mode 100644 index 000000000..cdd62370a --- /dev/null +++ b/apps/web/supabase/CLAUDE.md @@ -0,0 +1,292 @@ +# Supabase Database Schema Management + +This file contains guidance for working with database schemas, migrations, and Supabase development workflows. + +## Schema Organization + +Schemas are organized in numbered files in the `schemas/` directory. Numbers are used to sort dependencies. + +## Schema Development Workflow + +### 1. Creating New Schema Files + +```bash +# Create new schema file +touch schemas/15-my-new-feature.sql + +# Apply changes and create migration +pnpm --filter web run supabase:db:diff -f my-new-feature + +# Restart Supabase with fresh schema +pnpm supabase:web:reset + +# Generate TypeScript types +pnpm supabase:web:typegen +``` + +### 2. Modifying Existing Schemas + +```bash +# Edit schema file (e.g., schemas/03-accounts.sql) +# Make your changes... + +# Create migration for changes +pnpm --filter web run supabase:db:diff -f update-accounts + +# Apply and test +pnpm supabase:web:reset +pnpm supabase:web:typegen +``` + +## Security First Patterns + +## Add permissions (if any) + +```sql +ALTER TYPE public.app_permissions ADD VALUE 'notes.manage'; +COMMIT; +``` + +### Table Creation with RLS + +```sql +-- Create table +create table if not exists public.notes ( + id uuid unique not null default extensions.uuid_generate_v4(), + account_id uuid references public.accounts(id) on delete cascade not null, + -- ... + primary key (id) +); + +-- CRITICAL: Always enable RLS +alter table "public"."notes" enable row level security; + +-- Revoke default permissions +revoke all on public.notes from authenticated, service_role; + +-- Grant specific permissions +grant select, insert, update, delete on table public.notes to authenticated; + +-- Add RLS policies +create policy "notes_read" on public.notes for select + to authenticated using ( + account_id = (select auth.uid()) or + public.has_role_on_account(account_id) + ); + +create policy "notes_write" on public.notes for insert + to authenticated with check ( + public.has_permission(auth.uid(), account_id, 'notes.manage'::app_permissions) + ); + +create policy "notes_update" on public.notes for update + to authenticated using ( + public.has_permission(auth.uid(), account_id, 'notes.manage'::app_permissions) + ) + with check ( + public.has_permission(auth.uid(), account_id, 'notes.manage'::app_permissions) + ); + +create policy "notes_delete" on public.notes for delete + to authenticated using ( + public.has_permission(auth.uid(), account_id, 'notes.manage'::app_permissions) + ); +``` + +### Storage Bucket Policies + +```sql +-- Create storage bucket +insert into storage.buckets (id, name, public) +values ('documents', 'documents', false); + +-- RLS policy for storage +create policy documents_policy on storage.objects for all using ( + bucket_id = 'documents' + and ( + -- File belongs to user's account + kit.get_storage_filename_as_uuid(name) = auth.uid() + or + -- User has access to the account + public.has_role_on_account(kit.get_storage_filename_as_uuid(name)) + ) +) +with check ( + bucket_id = 'documents' + and ( + kit.get_storage_filename_as_uuid(name) = auth.uid() + or + public.has_permission( + auth.uid(), + kit.get_storage_filename_as_uuid(name), + 'files.upload'::app_permissions + ) + ) +); +``` + +## Function Creation Patterns + +### Safe Security Definer Functions + +```sql +-- NEVER create security definer functions without explicit access controls +create or replace function public.create_team_account(account_name text) +returns public.accounts +language plpgsql +security definer -- Elevated privileges +set search_path = '' -- Prevent SQL injection +as $$ +declare + new_account public.accounts; +begin + -- CRITICAL: Validate permissions first + if not public.is_set('enable_team_accounts') then + raise exception 'Team accounts are not enabled'; + end if; + + -- Additional validation can go here + if length(account_name) < 3 then + raise exception 'Account name must be at least 3 characters'; + end if; + + -- Now safe to proceed with elevated privileges + insert into public.accounts (name, is_personal_account) + values (account_name, false) + returning * into new_account; + + return new_account; +end; +$$; + +-- Grant to authenticated users only +grant execute on function public.create_team_account(text) to authenticated; +``` + +### Security Invoker Functions (Safer) + +```sql +-- Preferred: Functions that inherit RLS policies +create or replace function public.get_account_notes(target_account_id uuid) +returns setof public.notes +language plpgsql +security invoker -- Inherits caller's permissions (RLS applies) +set search_path = '' +as $$ +begin + -- RLS policies will automatically restrict results + return query + select * from public.notes + where account_id = target_account_id + order by created_at desc; +end; +$$; + +grant execute on function public.get_account_notes(uuid) to authenticated; +``` + +### Safe Column Additions + +```sql +-- Safe: Add nullable columns +alter table public.accounts +add column if not exists description text; + +-- Safe: Add columns with defaults +alter table public.accounts +add column if not exists is_verified boolean default false not null; + +-- Unsafe: Adding non-null columns without defaults +-- alter table public.accounts add column required_field text not null; -- DON'T DO THIS +``` + +### Index Management + +```sql +-- Create indexes concurrently for large tables +create index concurrently if not exists ix_accounts_created_at +on public.accounts (created_at desc); + +-- Drop unused indexes +drop index if exists ix_old_unused_index; +``` + +## Testing Database Changes + +### Local Testing + +```bash +# Test with fresh database +pnpm supabase:web:reset + +# Test your changes +pnpm run supabase:web:test +``` + +## Type Generation + +### After Schema Changes + +```bash +# Generate types after any schema changes +pnpm supabase:web:typegen +# Types are generated to src/lib/supabase/database.types.ts + +# Reset DB +pnpm supabase:web:reset +``` + +### Using Generated Types + +```typescript +import { Enums, Tables } from '@kit/supabase/database'; + +// Table types +type Account = Tables<'accounts'>; +type Note = Tables<'notes'>; + +// Enum types +type AppPermission = Enums<'app_permissions'>; + +// Insert types +type AccountInsert = Tables<'accounts'>['Insert']; +type AccountUpdate = Tables<'accounts'>['Update']; + +// Use in functions +async function createNote(data: Tables<'notes'>['Insert']) { + const { data: note, error } = await supabase + .from('notes') + .insert(data) + .select() + .single(); + + return note; +} +``` + +## Common Schema Patterns + +### Audit Trail + +Add triggers if the properties exist and are appropriate: + +- `public.trigger_set_timestamps()` - for tables with `created_at` and `updated_at` + columns +- `public.trigger_set_user_tracking()` - for tables with `created_by` and `updated_by` + columns + +### Useful Commands + +```bash +# View migration status +pnpm --filter web supabase migration list + +# Reset database completely +pnpm supabase:web:reset + +# Generate migration from schema diff +pnpm --filter web run supabase:db:diff -f migration-name + +# Apply specific migration +pnpm --filter web supabase migration up --include-schemas public +``` diff --git a/apps/web/supabase/migrations/20250917024249_triggers.sql b/apps/web/supabase/migrations/20250917024249_triggers.sql new file mode 100644 index 000000000..28221249e --- /dev/null +++ b/apps/web/supabase/migrations/20250917024249_triggers.sql @@ -0,0 +1,42 @@ +-- Triggers for accounts table +create trigger accounts_set_timestamps +before insert or update on public.accounts +for each row execute function public.trigger_set_timestamps(); + +create trigger accounts_set_user_tracking +before insert or update on public.accounts +for each row execute function public.trigger_set_user_tracking(); + +-- Triggers for accounts_memberships table +create trigger accounts_memberships_set_timestamps +before insert or update on public.accounts_memberships +for each row execute function public.trigger_set_timestamps(); + +create trigger accounts_memberships_set_user_tracking +before insert or update on public.accounts_memberships +for each row execute function public.trigger_set_user_tracking(); + +-- Triggers for invitations table +create trigger invitations_set_timestamps +before insert or update on public.invitations +for each row execute function public.trigger_set_timestamps(); + +-- Triggers for subscriptions table +create trigger subscriptions_set_timestamps +before insert or update on public.subscriptions +for each row execute function public.trigger_set_timestamps(); + +-- Triggers for subscription_items table +create trigger subscription_items_set_timestamps +before insert or update on public.subscription_items +for each row execute function public.trigger_set_timestamps(); + +-- Triggers for orders table +create trigger orders_set_timestamps +before insert or update on public.orders +for each row execute function public.trigger_set_timestamps(); + +-- Triggers for order_items table +create trigger order_items_set_timestamps +before insert or update on public.order_items +for each row execute function public.trigger_set_timestamps(); \ No newline at end of file diff --git a/apps/web/supabase/schemas/03-accounts.sql b/apps/web/supabase/schemas/03-accounts.sql index 874408b2e..0b695f880 100644 --- a/apps/web/supabase/schemas/03-accounts.sql +++ b/apps/web/supabase/schemas/03-accounts.sql @@ -77,6 +77,15 @@ create unique index unique_personal_account on public.accounts (primary_owner_us where is_personal_account = true; +-- Triggers for accounts table +create trigger accounts_set_timestamps +before insert or update on public.accounts +for each row execute function public.trigger_set_timestamps(); + +create trigger accounts_set_user_tracking +before insert or update on public.accounts +for each row execute function public.trigger_set_user_tracking(); + -- RLS on the accounts table -- UPDATE(accounts): -- Team owners can update their accounts diff --git a/apps/web/supabase/schemas/05-memberships.sql b/apps/web/supabase/schemas/05-memberships.sql index 5966a60ec..209b55b29 100644 --- a/apps/web/supabase/schemas/05-memberships.sql +++ b/apps/web/supabase/schemas/05-memberships.sql @@ -46,6 +46,15 @@ create index ix_accounts_memberships_user_id on public.accounts_memberships (use create index ix_accounts_memberships_account_role on public.accounts_memberships (account_role); +-- Triggers for accounts_memberships table +create trigger accounts_memberships_set_timestamps +before insert or update on public.accounts_memberships +for each row execute function public.trigger_set_timestamps(); + +create trigger accounts_memberships_set_user_tracking +before insert or update on public.accounts_memberships +for each row execute function public.trigger_set_user_tracking(); + -- Enable RLS on the accounts_memberships table alter table public.accounts_memberships enable row level security; diff --git a/apps/web/supabase/schemas/07-invitations.sql b/apps/web/supabase/schemas/07-invitations.sql index 57e818844..ca0859f65 100644 --- a/apps/web/supabase/schemas/07-invitations.sql +++ b/apps/web/supabase/schemas/07-invitations.sql @@ -36,6 +36,11 @@ comment on column public.invitations.email is 'The email of the user being invit -- Indexes on the invitations table create index ix_invitations_account_id on public.invitations (account_id); +-- Triggers for invitations table +create trigger invitations_set_timestamps +before insert or update on public.invitations +for each row execute function public.trigger_set_timestamps(); + -- Revoke all on invitations table from authenticated and service_role revoke all on public.invitations from diff --git a/apps/web/supabase/schemas/09-subscriptions.sql b/apps/web/supabase/schemas/09-subscriptions.sql index 35f0a4a05..9b1ecc9a0 100644 --- a/apps/web/supabase/schemas/09-subscriptions.sql +++ b/apps/web/supabase/schemas/09-subscriptions.sql @@ -69,6 +69,11 @@ select -- Indexes on the subscriptions table create index ix_subscriptions_account_id on public.subscriptions (account_id); +-- Triggers for subscriptions table +create trigger subscriptions_set_timestamps +before insert or update on public.subscriptions +for each row execute function public.trigger_set_timestamps(); + -- Enable RLS on subscriptions table alter table public.subscriptions enable row level security; @@ -314,6 +319,11 @@ delete on table public.subscription_items to service_role; -- Indexes on the subscription_items table create index ix_subscription_items_subscription_id on public.subscription_items (subscription_id); +-- Triggers for subscription_items table +create trigger subscription_items_set_timestamps +before insert or update on public.subscription_items +for each row execute function public.trigger_set_timestamps(); + -- RLS alter table public.subscription_items enable row level security; diff --git a/apps/web/supabase/schemas/10-orders.sql b/apps/web/supabase/schemas/10-orders.sql index 1c1ac6d65..9bc0b1740 100644 --- a/apps/web/supabase/schemas/10-orders.sql +++ b/apps/web/supabase/schemas/10-orders.sql @@ -55,6 +55,11 @@ delete on table public.orders to service_role; -- Indexes on the orders table create index ix_orders_account_id on public.orders (account_id); +-- Triggers for orders table +create trigger orders_set_timestamps +before insert or update on public.orders +for each row execute function public.trigger_set_timestamps(); + -- RLS alter table public.orders enable row level security; @@ -130,6 +135,11 @@ grant insert, update, delete on table public.order_items to service_role; -- Indexes on the order_items table create index ix_order_items_order_id on public.order_items (order_id); +-- Triggers for order_items table +create trigger order_items_set_timestamps +before insert or update on public.order_items +for each row execute function public.trigger_set_timestamps(); + -- RLS alter table public.order_items enable row level security; diff --git a/apps/web/supabase/tests/database/triggers-timestamps-simple.test.sql b/apps/web/supabase/tests/database/triggers-timestamps-simple.test.sql new file mode 100644 index 000000000..30019b66e --- /dev/null +++ b/apps/web/supabase/tests/database/triggers-timestamps-simple.test.sql @@ -0,0 +1,155 @@ +BEGIN; +create extension "basejump-supabase_test_helpers" version '0.0.6'; + +select plan(12); + +--- Test the trigger_set_timestamps function on all tables +--- This test verifies that created_at and updated_at are properly set on insert + +--- Create test users +select tests.create_supabase_user('trigger_test_user1', 'test1@example.com'); + +-- Authenticate as test user +select makerkit.authenticate_as('trigger_test_user1'); + +------------ +--- Test accounts table timestamp triggers - INSERT +------------ + +INSERT INTO public.accounts (name, is_personal_account) +VALUES ('Test Account', false); + +SELECT ok( + (SELECT created_at IS NOT NULL FROM public.accounts WHERE name = 'Test Account'), + 'accounts: created_at should be set automatically on insert' +); + +SELECT ok( + (SELECT updated_at IS NOT NULL FROM public.accounts WHERE name = 'Test Account'), + 'accounts: updated_at should be set automatically on insert' +); + +SELECT ok( + (SELECT created_at = updated_at FROM public.accounts WHERE name = 'Test Account'), + 'accounts: created_at should equal updated_at on insert' +); + +------------ +--- Test invitations table timestamp triggers - INSERT +------------ + +-- Create a team account for invitation testing +INSERT INTO public.accounts (name, is_personal_account) +VALUES ('Invitation Test Team', false); + +-- Test invitation insert +INSERT INTO public.invitations (email, account_id, invited_by, role, invite_token, expires_at) +VALUES ( + 'invitee@example.com', + (SELECT id FROM public.accounts WHERE name = 'Invitation Test Team'), + tests.get_supabase_uid('trigger_test_user1'), + 'member', + 'test-token-123', + now() + interval '7 days' +); + +SELECT ok( + (SELECT created_at IS NOT NULL FROM public.invitations WHERE email = 'invitee@example.com'), + 'invitations: created_at should be set automatically on insert' +); + +SELECT ok( + (SELECT updated_at IS NOT NULL FROM public.invitations WHERE email = 'invitee@example.com'), + 'invitations: updated_at should be set automatically on insert' +); + +SELECT ok( + (SELECT created_at = updated_at FROM public.invitations WHERE email = 'invitee@example.com'), + 'invitations: created_at should equal updated_at on insert' +); + +------------ +--- Test subscriptions table timestamp triggers - INSERT (service_role required) +------------ + +set role service_role; + +-- Create billing customer first +INSERT INTO public.billing_customers (account_id, provider, customer_id, email) +VALUES ( + (SELECT id FROM public.accounts WHERE name = 'Invitation Test Team'), + 'stripe', + 'cus_test123', + 'billing@example.com' +); + +-- Test subscription insert +INSERT INTO public.subscriptions ( + id, account_id, billing_customer_id, status, active, billing_provider, + cancel_at_period_end, currency, period_starts_at, period_ends_at +) +VALUES ( + 'sub_test123', + (SELECT id FROM public.accounts WHERE name = 'Invitation Test Team'), + (SELECT id FROM public.billing_customers WHERE customer_id = 'cus_test123'), + 'active', + true, + 'stripe', + false, + 'USD', + now(), + now() + interval '1 month' +); + +SELECT ok( + (SELECT created_at IS NOT NULL FROM public.subscriptions WHERE id = 'sub_test123'), + 'subscriptions: created_at should be set automatically on insert' +); + +SELECT ok( + (SELECT updated_at IS NOT NULL FROM public.subscriptions WHERE id = 'sub_test123'), + 'subscriptions: updated_at should be set automatically on insert' +); + +SELECT ok( + (SELECT created_at = updated_at FROM public.subscriptions WHERE id = 'sub_test123'), + 'subscriptions: created_at should equal updated_at on insert' +); + +------------ +--- Test subscription_items table timestamp triggers - INSERT +------------ + +-- Test subscription_item insert +INSERT INTO public.subscription_items ( + id, subscription_id, product_id, variant_id, type, quantity, interval, interval_count +) +VALUES ( + 'si_test123', + 'sub_test123', + 'prod_test123', + 'var_test123', + 'flat', + 1, + 'month', + 1 +); + +SELECT ok( + (SELECT created_at IS NOT NULL FROM public.subscription_items WHERE id = 'si_test123'), + 'subscription_items: created_at should be set automatically on insert' +); + +SELECT ok( + (SELECT updated_at IS NOT NULL FROM public.subscription_items WHERE id = 'si_test123'), + 'subscription_items: updated_at should be set automatically on insert' +); + +SELECT ok( + (SELECT created_at = updated_at FROM public.subscription_items WHERE id = 'si_test123'), + 'subscription_items: created_at should equal updated_at on insert' +); + +SELECT * FROM finish(); + +ROLLBACK; \ No newline at end of file diff --git a/apps/web/supabase/tests/database/triggers-user-tracking-accounts.test.sql b/apps/web/supabase/tests/database/triggers-user-tracking-accounts.test.sql new file mode 100644 index 000000000..833005be3 --- /dev/null +++ b/apps/web/supabase/tests/database/triggers-user-tracking-accounts.test.sql @@ -0,0 +1,43 @@ +BEGIN; +create extension "basejump-supabase_test_helpers" version '0.0.6'; + +select plan(3); + +--- Test the trigger_set_user_tracking function on accounts table +--- This test verifies that created_by and updated_by are properly set on insert + +--- Create test users +select tests.create_supabase_user('user_tracking_test1', 'tracking1@example.com'); + +------------ +--- Test accounts table user tracking triggers - INSERT +------------ + +-- Authenticate as first user for insert +select makerkit.authenticate_as('user_tracking_test1'); + +-- Test INSERT: created_by and updated_by should be set to current user +INSERT INTO public.accounts (name, is_personal_account) +VALUES ('User Tracking Test Account', false); + +SELECT ok( + (SELECT created_by = tests.get_supabase_uid('user_tracking_test1') + FROM public.accounts WHERE name = 'User Tracking Test Account'), + 'accounts: created_by should be set to current user on insert' +); + +SELECT ok( + (SELECT updated_by = tests.get_supabase_uid('user_tracking_test1') + FROM public.accounts WHERE name = 'User Tracking Test Account'), + 'accounts: updated_by should be set to current user on insert' +); + +SELECT ok( + (SELECT created_by = updated_by + FROM public.accounts WHERE name = 'User Tracking Test Account'), + 'accounts: created_by should equal updated_by on insert' +); + +SELECT * FROM finish(); + +ROLLBACK; \ No newline at end of file diff --git a/package.json b/package.json index 010f73d7a..3a18b0b6c 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "next-supabase-saas-kit-turbo", - "version": "2.13.1", + "version": "2.14.0", "private": true, "sideEffects": false, "engines": { diff --git a/packages/analytics/AGENTS.md b/packages/analytics/AGENTS.md new file mode 100644 index 000000000..9044d1189 --- /dev/null +++ b/packages/analytics/AGENTS.md @@ -0,0 +1,105 @@ +# @kit/analytics Package + +Analytics package providing a unified interface for tracking events, page views, and user identification across multiple analytics providers. + +## Architecture + +- **AnalyticsManager**: Central manager orchestrating multiple analytics providers +- **AnalyticsService**: Interface defining analytics operations (track, identify, pageView) +- **Provider System**: Pluggable providers (currently includes NullAnalyticsService) +- **Client/Server Split**: Separate entry points for client and server-side usage + +## Usage + +### Basic Import + +```typescript +// Client-side +import { analytics } from '@kit/analytics'; + +// Server-side +import { analytics } from '@kit/analytics/server'; +``` + +### Core Methods + +```typescript +// Track events +await analytics.trackEvent('button_clicked', { + button_id: 'signup', + page: 'homepage' +}); + +// Track page views +await analytics.trackPageView('/dashboard'); + +// Identify users +await analytics.identify('user123', { + email: 'user@example.com', + plan: 'premium' +}); +``` + +Page views and user identification are handled by the plugin by default. + +## Creating Custom Providers + +Implement the `AnalyticsService` interface: + +```typescript +import { AnalyticsService } from '@kit/analytics'; + +class CustomAnalyticsService implements AnalyticsService { + async initialize(): Promise { + // Initialize your analytics service + } + + async trackEvent(name: string, properties?: Record): Promise { + // Track event implementation + } + + async trackPageView(path: string): Promise { + // Track page view implementation + } + + async identify(userId: string, traits?: Record): Promise { + // Identify user implementation + } +} +``` + +## Default Behavior + +- Uses `NullAnalyticsService` when no providers are active +- All methods return Promises that resolve to arrays of provider results +- Console debug logging when no active services or using null service +- Graceful error handling with console warnings for missing providers + +## Server-Side Analytics + +When using PostHog, you can track events server-side for better reliability and privacy: + +```typescript +import { analytics } from '@kit/analytics/server'; + +// Server-side event tracking (e.g., in API routes) +export async function POST(request: Request) { + // ... handle request + + // Track server-side events + await analytics.trackEvent('api_call', { + endpoint: '/api/users', + method: 'POST', + user_id: userId, + }); + + return Response.json({ success: true }); +} + +// Track user registration server-side +await analytics.identify(user.id, { + email: user.email, + created_at: user.created_at, + plan: user.plan, +}); +``` \ No newline at end of file diff --git a/packages/analytics/CLAUDE.md b/packages/analytics/CLAUDE.md new file mode 100644 index 000000000..9044d1189 --- /dev/null +++ b/packages/analytics/CLAUDE.md @@ -0,0 +1,105 @@ +# @kit/analytics Package + +Analytics package providing a unified interface for tracking events, page views, and user identification across multiple analytics providers. + +## Architecture + +- **AnalyticsManager**: Central manager orchestrating multiple analytics providers +- **AnalyticsService**: Interface defining analytics operations (track, identify, pageView) +- **Provider System**: Pluggable providers (currently includes NullAnalyticsService) +- **Client/Server Split**: Separate entry points for client and server-side usage + +## Usage + +### Basic Import + +```typescript +// Client-side +import { analytics } from '@kit/analytics'; + +// Server-side +import { analytics } from '@kit/analytics/server'; +``` + +### Core Methods + +```typescript +// Track events +await analytics.trackEvent('button_clicked', { + button_id: 'signup', + page: 'homepage' +}); + +// Track page views +await analytics.trackPageView('/dashboard'); + +// Identify users +await analytics.identify('user123', { + email: 'user@example.com', + plan: 'premium' +}); +``` + +Page views and user identification are handled by the plugin by default. + +## Creating Custom Providers + +Implement the `AnalyticsService` interface: + +```typescript +import { AnalyticsService } from '@kit/analytics'; + +class CustomAnalyticsService implements AnalyticsService { + async initialize(): Promise { + // Initialize your analytics service + } + + async trackEvent(name: string, properties?: Record): Promise { + // Track event implementation + } + + async trackPageView(path: string): Promise { + // Track page view implementation + } + + async identify(userId: string, traits?: Record): Promise { + // Identify user implementation + } +} +``` + +## Default Behavior + +- Uses `NullAnalyticsService` when no providers are active +- All methods return Promises that resolve to arrays of provider results +- Console debug logging when no active services or using null service +- Graceful error handling with console warnings for missing providers + +## Server-Side Analytics + +When using PostHog, you can track events server-side for better reliability and privacy: + +```typescript +import { analytics } from '@kit/analytics/server'; + +// Server-side event tracking (e.g., in API routes) +export async function POST(request: Request) { + // ... handle request + + // Track server-side events + await analytics.trackEvent('api_call', { + endpoint: '/api/users', + method: 'POST', + user_id: userId, + }); + + return Response.json({ success: true }); +} + +// Track user registration server-side +await analytics.identify(user.id, { + email: user.email, + created_at: user.created_at, + plan: user.plan, +}); +``` \ No newline at end of file diff --git a/packages/analytics/package.json b/packages/analytics/package.json index 5bb20a31c..35908d8b6 100644 --- a/packages/analytics/package.json +++ b/packages/analytics/package.json @@ -17,7 +17,7 @@ "@kit/eslint-config": "workspace:*", "@kit/prettier-config": "workspace:*", "@kit/tsconfig": "workspace:*", - "@types/node": "^24.3.1" + "@types/node": "^24.5.0" }, "typesVersions": { "*": { diff --git a/packages/billing/gateway/package.json b/packages/billing/gateway/package.json index 72d24f701..0887f0d0d 100644 --- a/packages/billing/gateway/package.json +++ b/packages/billing/gateway/package.json @@ -16,7 +16,7 @@ "./marketing": "./src/components/marketing.tsx" }, "devDependencies": { - "@hookform/resolvers": "^5.2.1", + "@hookform/resolvers": "^5.2.2", "@kit/billing": "workspace:*", "@kit/eslint-config": "workspace:*", "@kit/lemon-squeezy": "workspace:*", @@ -26,11 +26,11 @@ "@kit/supabase": "workspace:*", "@kit/tsconfig": "workspace:*", "@kit/ui": "workspace:*", - "@supabase/supabase-js": "2.57.2", - "@types/react": "19.1.12", + "@supabase/supabase-js": "2.57.4", + "@types/react": "19.1.13", "date-fns": "^4.1.0", - "lucide-react": "^0.542.0", - "next": "15.5.2", + "lucide-react": "^0.544.0", + "next": "15.5.3", "react": "19.1.1", "react-hook-form": "^7.62.0", "react-i18next": "^15.7.3", diff --git a/packages/billing/lemon-squeezy/package.json b/packages/billing/lemon-squeezy/package.json index e85875f5a..28278ec69 100644 --- a/packages/billing/lemon-squeezy/package.json +++ b/packages/billing/lemon-squeezy/package.json @@ -24,8 +24,8 @@ "@kit/supabase": "workspace:*", "@kit/tsconfig": "workspace:*", "@kit/ui": "workspace:*", - "@types/react": "19.1.12", - "next": "15.5.2", + "@types/react": "19.1.13", + "next": "15.5.3", "react": "19.1.1", "zod": "^3.25.74" }, diff --git a/packages/billing/stripe/package.json b/packages/billing/stripe/package.json index 2a00167b4..5e35d6885 100644 --- a/packages/billing/stripe/package.json +++ b/packages/billing/stripe/package.json @@ -15,7 +15,7 @@ "./components": "./src/components/index.ts" }, "dependencies": { - "@stripe/react-stripe-js": "^4.0.0", + "@stripe/react-stripe-js": "^4.0.2", "@stripe/stripe-js": "^7.9.0", "stripe": "^18.5.0" }, @@ -27,9 +27,9 @@ "@kit/supabase": "workspace:*", "@kit/tsconfig": "workspace:*", "@kit/ui": "workspace:*", - "@types/react": "19.1.12", + "@types/react": "19.1.13", "date-fns": "^4.1.0", - "next": "15.5.2", + "next": "15.5.3", "react": "19.1.1", "zod": "^3.25.74" }, diff --git a/packages/cms/core/package.json b/packages/cms/core/package.json index 5122c860f..dce8c70ad 100644 --- a/packages/cms/core/package.json +++ b/packages/cms/core/package.json @@ -20,7 +20,7 @@ "@kit/shared": "workspace:*", "@kit/tsconfig": "workspace:*", "@kit/wordpress": "workspace:*", - "@types/node": "^24.3.1" + "@types/node": "^24.5.0" }, "typesVersions": { "*": { diff --git a/packages/cms/keystatic/package.json b/packages/cms/keystatic/package.json index 1de3317d9..4278e0adb 100644 --- a/packages/cms/keystatic/package.json +++ b/packages/cms/keystatic/package.json @@ -26,8 +26,8 @@ "@kit/prettier-config": "workspace:*", "@kit/tsconfig": "workspace:*", "@kit/ui": "workspace:*", - "@types/node": "^24.3.1", - "@types/react": "19.1.12", + "@types/node": "^24.5.0", + "@types/react": "19.1.13", "react": "19.1.1", "zod": "^3.25.74" }, diff --git a/packages/cms/wordpress/package.json b/packages/cms/wordpress/package.json index fa7b2502d..234d48de9 100644 --- a/packages/cms/wordpress/package.json +++ b/packages/cms/wordpress/package.json @@ -20,8 +20,8 @@ "@kit/prettier-config": "workspace:*", "@kit/tsconfig": "workspace:*", "@kit/ui": "workspace:*", - "@types/node": "^24.3.1", - "@types/react": "19.1.12", + "@types/node": "^24.5.0", + "@types/react": "19.1.13", "wp-types": "^4.68.1" }, "typesVersions": { diff --git a/packages/database-webhooks/package.json b/packages/database-webhooks/package.json index dc0c8a061..c51cbec59 100644 --- a/packages/database-webhooks/package.json +++ b/packages/database-webhooks/package.json @@ -22,7 +22,7 @@ "@kit/supabase": "workspace:*", "@kit/team-accounts": "workspace:*", "@kit/tsconfig": "workspace:*", - "@supabase/supabase-js": "2.57.2", + "@supabase/supabase-js": "2.57.4", "zod": "^3.25.74" }, "typesVersions": { diff --git a/packages/email-templates/package.json b/packages/email-templates/package.json index 0f97ec7db..7d4756c3b 100644 --- a/packages/email-templates/package.json +++ b/packages/email-templates/package.json @@ -13,7 +13,7 @@ ".": "./src/index.ts" }, "dependencies": { - "@react-email/components": "0.5.1" + "@react-email/components": "0.5.3" }, "devDependencies": { "@kit/eslint-config": "workspace:*", diff --git a/packages/features/AGENTS.md b/packages/features/AGENTS.md new file mode 100644 index 000000000..7b4cc3b67 --- /dev/null +++ b/packages/features/AGENTS.md @@ -0,0 +1,289 @@ +# Feature Packages Instructions + +This file contains instructions for working with feature packages including accounts, teams, billing, auth, and notifications. + +## Feature Package Structure + +- `accounts/` - Personal account management +- `admin/` - Super admin functionality +- `auth/` - Authentication features +- `notifications/` - Notification system +- `team-accounts/` - Team account management + +## Account Services + +### Personal Accounts API + +Located at: `packages/features/accounts/src/server/api.ts` + +```typescript +import { createAccountsApi } from '@kit/accounts/api'; +import { getSupabaseServerClient } from '@kit/supabase/server-client'; + +const client = getSupabaseServerClient(); +const api = createAccountsApi(client); + +// Get account data +const account = await api.getAccount(accountId); + +// Get account workspace +const workspace = await api.getAccountWorkspace(); + +// Load user accounts +const accounts = await api.loadUserAccounts(); + +// Get subscription +const subscription = await api.getSubscription(accountId); + +// Get customer ID +const customerId = await api.getCustomerId(accountId); +``` + +### Team Accounts API + +Located at: `packages/features/team-accounts/src/server/api.ts` + +```typescript +import { createTeamAccountsApi } from '@kit/team-accounts/api'; + +const api = createTeamAccountsApi(client); + +// Get team account by slug +const account = await api.getTeamAccount(slug); + +// Get account workspace +const workspace = await api.getAccountWorkspace(slug); + +// Check permissions +const hasPermission = await api.hasPermission({ + accountId, + userId, + permission: 'billing.manage' +}); + +// Get members count +const count = await api.getMembersCount(accountId); + +// Get invitation +const invitation = await api.getInvitation(adminClient, token); +``` + +## Workspace Contexts + +### Personal Account Context + +Use in `apps/web/app/home/(user)` routes: + +```tsx +import { useUserWorkspace } from 'kit/accounts/hooks/use-user-workspace'; + +function PersonalComponent() { + const { user, account } = useUserWorkspace(); + + // user: authenticated user data + // account: personal account data + + return
Welcome {user.name}
; +} +``` + +Context provider: `packages/features/accounts/src/components/user-workspace-context-provider.tsx` + +### Team Account Context + +Use in `apps/web/app/home/[account]` routes: + +```tsx +import { useTeamAccountWorkspace } from '@kit/team-accounts/hooks/use-team-account-workspace'; + +function TeamComponent() { + const { account, user, accounts } = useTeamAccountWorkspace(); + + // account: current team account data + // user: authenticated user data + // accounts: all accounts user has access to + + return
Team: {account.name}
; +} +``` + +Context provider: `packages/features/team-accounts/src/components/team-account-workspace-context-provider.tsx` + +## Billing Services + +### Personal Billing + +Located at: `apps/web/app/home/(user)/billing/_lib/server/user-billing.service.ts` + +```typescript +// Personal billing operations +// - Manage individual user subscriptions +// - Handle personal account payments +// - Process individual billing changes +``` + +### Team Billing + +Located at: `apps/web/app/home/[account]/billing/_lib/server/team-billing.service.ts` + +```typescript +// Team billing operations +// - Manage team subscriptions +// - Handle team payments +// - Process team billing changes +``` + +### Per-Seat Billing Service + +Located at: `packages/features/team-accounts/src/server/services/account-per-seat-billing.service.ts` + +```typescript +import { createAccountPerSeatBillingService } from '@kit/team-accounts/billing'; + +const billingService = createAccountPerSeatBillingService(client); + +// Increase seats when adding team members +await billingService.increaseSeats(accountId); + +// Decrease seats when removing team members +await billingService.decreaseSeats(accountId); + +// Get per-seat subscription item +const subscription = await billingService.getPerSeatSubscriptionItem(accountId); +``` + +## Authentication Features + +### OTP for Sensitive Operations + +Use one-time tokens from `packages/otp/src/api/index.ts`: + +```tsx +import { VerifyOtpForm } from '@kit/otp/components'; + + { + // Proceed with verified operation + handleSensitiveOperation(otp); + }} + CancelButton={} +/> +``` + +## Admin Features + +### Super Admin Protection + +For admin routes, use `AdminGuard`: + +```tsx +import { AdminGuard } from '@kit/admin/components/admin-guard'; + +function AdminPage() { + return ( +
+

Admin Dashboard

+ {/* Admin content */} +
+ ); +} + +// Wrap the page component +export default AdminGuard(AdminPage); +``` + +### Admin Service + +Located at: `packages/features/admin/src/lib/server/services/admin.service.ts` + +```typescript +// Admin service operations +// - Manage all accounts +// - Handle admin-level operations +// - Access system-wide data +``` + +### Checking Admin Status + +```typescript +import { isSuperAdmin } from '@kit/admin'; + +function criticalAdminFeature() { + const isAdmin = await isSuperAdmin(client); + + if (!isAdmin) { + throw new Error('Access denied: Admin privileges required'); + } + + // ... +} +``` + +## Error Handling & Logging + +### Structured Logging + +Use logger from `packages/shared/src/logger/logger.ts`: + +```typescript +import { getLogger } from '@kit/shared/logger'; + +async function featureOperation() { + const logger = await getLogger(); + + const ctx = { + name: 'feature-operation', + userId: user.id, + accountId: account.id + }; + + try { + logger.info(ctx, 'Starting feature operation'); + + // Perform operation + const result = await performOperation(); + + logger.info({ ...ctx, result }, 'Feature operation completed'); + return result; + } catch (error) { + logger.error({ ...ctx, error }, 'Feature operation failed'); + throw error; + } +} +``` + +## Permission Patterns + +### Team Permissions + +```typescript +import { createTeamAccountsApi } from '@kit/team-accounts/api'; + +const api = createTeamAccountsApi(client); + +// Check if user has specific permission on account +const canManageBilling = await api.hasPermission({ + accountId, + userId, + permission: 'billing.manage' +}); + +if (!canManageBilling) { + throw new Error('Insufficient permissions'); +} +``` + +### Account Ownership + +```typescript +// Check if user is account owner (works for both personal and team accounts) +const isOwner = await client.rpc('is_account_owner', { + account_id: accountId +}); + +if (!isOwner) { + throw new Error('Only account owners can perform this action'); +} +``` \ No newline at end of file diff --git a/packages/features/CLAUDE.md b/packages/features/CLAUDE.md new file mode 100644 index 000000000..7b4cc3b67 --- /dev/null +++ b/packages/features/CLAUDE.md @@ -0,0 +1,289 @@ +# Feature Packages Instructions + +This file contains instructions for working with feature packages including accounts, teams, billing, auth, and notifications. + +## Feature Package Structure + +- `accounts/` - Personal account management +- `admin/` - Super admin functionality +- `auth/` - Authentication features +- `notifications/` - Notification system +- `team-accounts/` - Team account management + +## Account Services + +### Personal Accounts API + +Located at: `packages/features/accounts/src/server/api.ts` + +```typescript +import { createAccountsApi } from '@kit/accounts/api'; +import { getSupabaseServerClient } from '@kit/supabase/server-client'; + +const client = getSupabaseServerClient(); +const api = createAccountsApi(client); + +// Get account data +const account = await api.getAccount(accountId); + +// Get account workspace +const workspace = await api.getAccountWorkspace(); + +// Load user accounts +const accounts = await api.loadUserAccounts(); + +// Get subscription +const subscription = await api.getSubscription(accountId); + +// Get customer ID +const customerId = await api.getCustomerId(accountId); +``` + +### Team Accounts API + +Located at: `packages/features/team-accounts/src/server/api.ts` + +```typescript +import { createTeamAccountsApi } from '@kit/team-accounts/api'; + +const api = createTeamAccountsApi(client); + +// Get team account by slug +const account = await api.getTeamAccount(slug); + +// Get account workspace +const workspace = await api.getAccountWorkspace(slug); + +// Check permissions +const hasPermission = await api.hasPermission({ + accountId, + userId, + permission: 'billing.manage' +}); + +// Get members count +const count = await api.getMembersCount(accountId); + +// Get invitation +const invitation = await api.getInvitation(adminClient, token); +``` + +## Workspace Contexts + +### Personal Account Context + +Use in `apps/web/app/home/(user)` routes: + +```tsx +import { useUserWorkspace } from 'kit/accounts/hooks/use-user-workspace'; + +function PersonalComponent() { + const { user, account } = useUserWorkspace(); + + // user: authenticated user data + // account: personal account data + + return
Welcome {user.name}
; +} +``` + +Context provider: `packages/features/accounts/src/components/user-workspace-context-provider.tsx` + +### Team Account Context + +Use in `apps/web/app/home/[account]` routes: + +```tsx +import { useTeamAccountWorkspace } from '@kit/team-accounts/hooks/use-team-account-workspace'; + +function TeamComponent() { + const { account, user, accounts } = useTeamAccountWorkspace(); + + // account: current team account data + // user: authenticated user data + // accounts: all accounts user has access to + + return
Team: {account.name}
; +} +``` + +Context provider: `packages/features/team-accounts/src/components/team-account-workspace-context-provider.tsx` + +## Billing Services + +### Personal Billing + +Located at: `apps/web/app/home/(user)/billing/_lib/server/user-billing.service.ts` + +```typescript +// Personal billing operations +// - Manage individual user subscriptions +// - Handle personal account payments +// - Process individual billing changes +``` + +### Team Billing + +Located at: `apps/web/app/home/[account]/billing/_lib/server/team-billing.service.ts` + +```typescript +// Team billing operations +// - Manage team subscriptions +// - Handle team payments +// - Process team billing changes +``` + +### Per-Seat Billing Service + +Located at: `packages/features/team-accounts/src/server/services/account-per-seat-billing.service.ts` + +```typescript +import { createAccountPerSeatBillingService } from '@kit/team-accounts/billing'; + +const billingService = createAccountPerSeatBillingService(client); + +// Increase seats when adding team members +await billingService.increaseSeats(accountId); + +// Decrease seats when removing team members +await billingService.decreaseSeats(accountId); + +// Get per-seat subscription item +const subscription = await billingService.getPerSeatSubscriptionItem(accountId); +``` + +## Authentication Features + +### OTP for Sensitive Operations + +Use one-time tokens from `packages/otp/src/api/index.ts`: + +```tsx +import { VerifyOtpForm } from '@kit/otp/components'; + + { + // Proceed with verified operation + handleSensitiveOperation(otp); + }} + CancelButton={} +/> +``` + +## Admin Features + +### Super Admin Protection + +For admin routes, use `AdminGuard`: + +```tsx +import { AdminGuard } from '@kit/admin/components/admin-guard'; + +function AdminPage() { + return ( +
+

Admin Dashboard

+ {/* Admin content */} +
+ ); +} + +// Wrap the page component +export default AdminGuard(AdminPage); +``` + +### Admin Service + +Located at: `packages/features/admin/src/lib/server/services/admin.service.ts` + +```typescript +// Admin service operations +// - Manage all accounts +// - Handle admin-level operations +// - Access system-wide data +``` + +### Checking Admin Status + +```typescript +import { isSuperAdmin } from '@kit/admin'; + +function criticalAdminFeature() { + const isAdmin = await isSuperAdmin(client); + + if (!isAdmin) { + throw new Error('Access denied: Admin privileges required'); + } + + // ... +} +``` + +## Error Handling & Logging + +### Structured Logging + +Use logger from `packages/shared/src/logger/logger.ts`: + +```typescript +import { getLogger } from '@kit/shared/logger'; + +async function featureOperation() { + const logger = await getLogger(); + + const ctx = { + name: 'feature-operation', + userId: user.id, + accountId: account.id + }; + + try { + logger.info(ctx, 'Starting feature operation'); + + // Perform operation + const result = await performOperation(); + + logger.info({ ...ctx, result }, 'Feature operation completed'); + return result; + } catch (error) { + logger.error({ ...ctx, error }, 'Feature operation failed'); + throw error; + } +} +``` + +## Permission Patterns + +### Team Permissions + +```typescript +import { createTeamAccountsApi } from '@kit/team-accounts/api'; + +const api = createTeamAccountsApi(client); + +// Check if user has specific permission on account +const canManageBilling = await api.hasPermission({ + accountId, + userId, + permission: 'billing.manage' +}); + +if (!canManageBilling) { + throw new Error('Insufficient permissions'); +} +``` + +### Account Ownership + +```typescript +// Check if user is account owner (works for both personal and team accounts) +const isOwner = await client.rpc('is_account_owner', { + account_id: accountId +}); + +if (!isOwner) { + throw new Error('Only account owners can perform this action'); +} +``` \ No newline at end of file diff --git a/packages/features/accounts/package.json b/packages/features/accounts/package.json index 85e2695d5..f0cb73bfd 100644 --- a/packages/features/accounts/package.json +++ b/packages/features/accounts/package.json @@ -20,7 +20,7 @@ "nanoid": "^5.1.5" }, "devDependencies": { - "@hookform/resolvers": "^5.2.1", + "@hookform/resolvers": "^5.2.2", "@kit/billing-gateway": "workspace:*", "@kit/email-templates": "workspace:*", "@kit/eslint-config": "workspace:*", @@ -34,12 +34,12 @@ "@kit/tsconfig": "workspace:*", "@kit/ui": "workspace:*", "@radix-ui/react-icons": "^1.3.2", - "@supabase/supabase-js": "2.57.2", - "@tanstack/react-query": "5.87.1", - "@types/react": "19.1.12", + "@supabase/supabase-js": "2.57.4", + "@tanstack/react-query": "5.89.0", + "@types/react": "19.1.13", "@types/react-dom": "19.1.9", - "lucide-react": "^0.542.0", - "next": "15.5.2", + "lucide-react": "^0.544.0", + "next": "15.5.3", "next-themes": "0.4.6", "react": "19.1.1", "react-dom": "19.1.1", diff --git a/packages/features/admin/package.json b/packages/features/admin/package.json index 56b48a917..fdd2399ad 100644 --- a/packages/features/admin/package.json +++ b/packages/features/admin/package.json @@ -10,7 +10,7 @@ }, "prettier": "@kit/prettier-config", "devDependencies": { - "@hookform/resolvers": "^5.2.1", + "@hookform/resolvers": "^5.2.2", "@kit/eslint-config": "workspace:*", "@kit/next": "workspace:*", "@kit/prettier-config": "workspace:*", @@ -20,12 +20,12 @@ "@kit/ui": "workspace:*", "@makerkit/data-loader-supabase-core": "^0.0.10", "@makerkit/data-loader-supabase-nextjs": "^1.2.5", - "@supabase/supabase-js": "2.57.2", - "@tanstack/react-query": "5.87.1", + "@supabase/supabase-js": "2.57.4", + "@tanstack/react-query": "5.89.0", "@tanstack/react-table": "^8.21.3", - "@types/react": "19.1.12", - "lucide-react": "^0.542.0", - "next": "15.5.2", + "@types/react": "19.1.13", + "lucide-react": "^0.544.0", + "next": "15.5.3", "react": "19.1.1", "react-dom": "19.1.1", "react-hook-form": "^7.62.0", diff --git a/packages/features/admin/src/components/admin-account-page.tsx b/packages/features/admin/src/components/admin-account-page.tsx index a1641a549..d8565d744 100644 --- a/packages/features/admin/src/components/admin-account-page.tsx +++ b/packages/features/admin/src/components/admin-account-page.tsx @@ -46,18 +46,18 @@ export function AdminAccountPage(props: { async function PersonalAccountPage(props: { account: Account }) { const adminClient = getSupabaseServerAdminClient(); - const { data, error } = await adminClient.auth.admin.getUserById( - props.account.id, - ); + const [memberships, userResult] = await Promise.all([ + getMemberships(props.account.id), + adminClient.auth.admin.getUserById(props.account.id), + ]); - if (!data || error) { - throw new Error(`User not found`); + if (userResult.error) { + throw userResult.error; } - const memberships = await getMemberships(props.account.id); - const isBanned = - 'banned_until' in data.user && data.user.banned_until !== 'none'; + 'banned_until' in userResult.data.user && + userResult.data.user.banned_until !== 'none'; return ( <> diff --git a/packages/features/admin/src/components/admin-accounts-table.tsx b/packages/features/admin/src/components/admin-accounts-table.tsx index 7e21dc22a..d1273a9cd 100644 --- a/packages/features/admin/src/components/admin-accounts-table.tsx +++ b/packages/features/admin/src/components/admin-accounts-table.tsx @@ -168,6 +168,7 @@ function getColumns(): ColumnDef[] { cell: ({ row }) => { return ( diff --git a/packages/features/admin/src/components/admin-ban-user-dialog.tsx b/packages/features/admin/src/components/admin-ban-user-dialog.tsx index 789bd10a3..1efdd90b8 100644 --- a/packages/features/admin/src/components/admin-ban-user-dialog.tsx +++ b/packages/features/admin/src/components/admin-ban-user-dialog.tsx @@ -2,6 +2,8 @@ import { useState, useTransition } from 'react'; +import { isRedirectError } from 'next/dist/client/components/redirect-error'; + import { zodResolver } from '@hookform/resolvers/zod'; import { useForm } from 'react-hook-form'; @@ -77,11 +79,9 @@ function BanUserForm(props: { userId: string }) { onSubmit={form.handleSubmit((data) => { startTransition(async () => { try { - const result = await banUserAction(data); - - setError(!result.success); - } catch { - setError(true); + await banUserAction(data); + } catch (error) { + setError(!isRedirectError(error)); } }); })} diff --git a/packages/features/admin/src/components/admin-reactivate-user-dialog.tsx b/packages/features/admin/src/components/admin-reactivate-user-dialog.tsx index c254c4363..d61bf5963 100644 --- a/packages/features/admin/src/components/admin-reactivate-user-dialog.tsx +++ b/packages/features/admin/src/components/admin-reactivate-user-dialog.tsx @@ -2,6 +2,8 @@ import { useState, useTransition } from 'react'; +import { isRedirectError } from 'next/dist/client/components/redirect-error'; + import { zodResolver } from '@hookform/resolvers/zod'; import { useForm } from 'react-hook-form'; @@ -76,11 +78,9 @@ function ReactivateUserForm(props: { userId: string }) { onSubmit={form.handleSubmit((data) => { startTransition(async () => { try { - const result = await reactivateUserAction(data); - - setError(!result.success); - } catch { - setError(true); + await reactivateUserAction(data); + } catch (error) { + setError(!isRedirectError(error)); } }); })} diff --git a/packages/features/admin/src/lib/server/admin-server-actions.ts b/packages/features/admin/src/lib/server/admin-server-actions.ts index c4bdfcb78..bd20f3def 100644 --- a/packages/features/admin/src/lib/server/admin-server-actions.ts +++ b/packages/features/admin/src/lib/server/admin-server-actions.ts @@ -47,9 +47,7 @@ export const banUserAction = adminAction( revalidateAdmin(); - return { - success: true, - }; + return redirect(`/admin/accounts/${userId}`); }, { schema: BanUserSchema, @@ -83,9 +81,7 @@ export const reactivateUserAction = adminAction( logger.info({ userId }, `Super Admin has successfully reactivated user`); - return { - success: true, - }; + return redirect(`/admin/accounts/${userId}`); }, { schema: ReactivateUserSchema, diff --git a/packages/features/auth/package.json b/packages/features/auth/package.json index 21b1b6fba..b062dc417 100644 --- a/packages/features/auth/package.json +++ b/packages/features/auth/package.json @@ -20,20 +20,20 @@ "./oauth-provider-logo-image": "./src/components/oauth-provider-logo-image.tsx" }, "devDependencies": { - "@hookform/resolvers": "^5.2.1", + "@hookform/resolvers": "^5.2.2", "@kit/eslint-config": "workspace:*", "@kit/prettier-config": "workspace:*", "@kit/shared": "workspace:*", "@kit/supabase": "workspace:*", "@kit/tsconfig": "workspace:*", "@kit/ui": "workspace:*", - "@marsidev/react-turnstile": "^1.3.0", + "@marsidev/react-turnstile": "^1.3.1", "@radix-ui/react-icons": "^1.3.2", - "@supabase/supabase-js": "2.57.2", - "@tanstack/react-query": "5.87.1", - "@types/react": "19.1.12", - "lucide-react": "^0.542.0", - "next": "15.5.2", + "@supabase/supabase-js": "2.57.4", + "@tanstack/react-query": "5.89.0", + "@types/react": "19.1.13", + "lucide-react": "^0.544.0", + "next": "15.5.3", "react-hook-form": "^7.62.0", "react-i18next": "^15.7.3", "sonner": "^2.0.7", diff --git a/packages/features/notifications/package.json b/packages/features/notifications/package.json index d459d46eb..421d3d90d 100644 --- a/packages/features/notifications/package.json +++ b/packages/features/notifications/package.json @@ -19,10 +19,10 @@ "@kit/supabase": "workspace:*", "@kit/tsconfig": "workspace:*", "@kit/ui": "workspace:*", - "@supabase/supabase-js": "2.57.2", - "@tanstack/react-query": "5.87.1", - "@types/react": "19.1.12", - "lucide-react": "^0.542.0", + "@supabase/supabase-js": "2.57.4", + "@tanstack/react-query": "5.89.0", + "@types/react": "19.1.13", + "lucide-react": "^0.544.0", "react": "19.1.1", "react-dom": "19.1.1", "react-i18next": "^15.7.3" diff --git a/packages/features/team-accounts/package.json b/packages/features/team-accounts/package.json index f22c66ffd..7e39d69b2 100644 --- a/packages/features/team-accounts/package.json +++ b/packages/features/team-accounts/package.json @@ -18,7 +18,7 @@ "nanoid": "^5.1.5" }, "devDependencies": { - "@hookform/resolvers": "^5.2.1", + "@hookform/resolvers": "^5.2.2", "@kit/accounts": "workspace:*", "@kit/billing-gateway": "workspace:*", "@kit/email-templates": "workspace:*", @@ -32,15 +32,15 @@ "@kit/supabase": "workspace:*", "@kit/tsconfig": "workspace:*", "@kit/ui": "workspace:*", - "@supabase/supabase-js": "2.57.2", - "@tanstack/react-query": "5.87.1", + "@supabase/supabase-js": "2.57.4", + "@tanstack/react-query": "5.89.0", "@tanstack/react-table": "^8.21.3", - "@types/react": "19.1.12", + "@types/react": "19.1.13", "@types/react-dom": "19.1.9", "class-variance-authority": "^0.7.1", "date-fns": "^4.1.0", - "lucide-react": "^0.542.0", - "next": "15.5.2", + "lucide-react": "^0.544.0", + "next": "15.5.3", "react": "19.1.1", "react-dom": "19.1.1", "react-hook-form": "^7.62.0", diff --git a/packages/i18n/package.json b/packages/i18n/package.json index 91f1f94cb..8c69f0acf 100644 --- a/packages/i18n/package.json +++ b/packages/i18n/package.json @@ -20,8 +20,8 @@ "@kit/prettier-config": "workspace:*", "@kit/shared": "workspace:*", "@kit/tsconfig": "workspace:*", - "@tanstack/react-query": "5.87.1", - "next": "15.5.2", + "@tanstack/react-query": "5.89.0", + "next": "15.5.3", "react": "19.1.1", "react-dom": "19.1.1", "react-i18next": "^15.7.3" diff --git a/packages/mailers/AGENTS.md b/packages/mailers/AGENTS.md new file mode 100644 index 000000000..c23b74dfd --- /dev/null +++ b/packages/mailers/AGENTS.md @@ -0,0 +1,66 @@ +# Email Service Instructions + +This file contains guidance for working with the email service supporting Resend and Nodemailer. + +## Basic Usage + +```typescript +import { getMailer } from '@kit/mailers'; +import { renderAccountDeleteEmail } from '@kit/email-templates'; + +async function sendSimpleEmail() { + // Get mailer instance + const mailer = await getMailer(); + + // Send simple email + await mailer.sendEmail({ + to: 'user@example.com', + from: 'noreply@yourdomain.com', + subject: 'Welcome!', + html: '

Welcome!

Thank you for joining us.

', + }); +} + +async function sendComplexEmail() { + // Send with email template + const { html, subject } = await renderAccountDeleteEmail({ + userDisplayName: user.name, + productName: 'My SaaS App', + }); + + await mailer.sendEmail({ + to: user.email, + from: 'noreply@yourdomain.com', + subject, + html, + }); +} +``` + +## Email Templates + +Email templates are located in `@kit/email-templates` and return `{ html, subject }`: + +```typescript +import { + renderAccountDeleteEmail, + renderWelcomeEmail, + renderPasswordResetEmail +} from '@kit/email-templates'; + +// Render template +const { html, subject } = await renderWelcomeEmail({ + userDisplayName: 'John Doe', + loginUrl: 'https://app.com/login' +}); + +// Send rendered email +const mailer = await getMailer(); + +await mailer.sendEmail({ + to: user.email, + from: 'welcome@yourdomain.com', + subject, + html, +}); +``` \ No newline at end of file diff --git a/packages/mailers/CLAUDE.md b/packages/mailers/CLAUDE.md new file mode 100644 index 000000000..c23b74dfd --- /dev/null +++ b/packages/mailers/CLAUDE.md @@ -0,0 +1,66 @@ +# Email Service Instructions + +This file contains guidance for working with the email service supporting Resend and Nodemailer. + +## Basic Usage + +```typescript +import { getMailer } from '@kit/mailers'; +import { renderAccountDeleteEmail } from '@kit/email-templates'; + +async function sendSimpleEmail() { + // Get mailer instance + const mailer = await getMailer(); + + // Send simple email + await mailer.sendEmail({ + to: 'user@example.com', + from: 'noreply@yourdomain.com', + subject: 'Welcome!', + html: '

Welcome!

Thank you for joining us.

', + }); +} + +async function sendComplexEmail() { + // Send with email template + const { html, subject } = await renderAccountDeleteEmail({ + userDisplayName: user.name, + productName: 'My SaaS App', + }); + + await mailer.sendEmail({ + to: user.email, + from: 'noreply@yourdomain.com', + subject, + html, + }); +} +``` + +## Email Templates + +Email templates are located in `@kit/email-templates` and return `{ html, subject }`: + +```typescript +import { + renderAccountDeleteEmail, + renderWelcomeEmail, + renderPasswordResetEmail +} from '@kit/email-templates'; + +// Render template +const { html, subject } = await renderWelcomeEmail({ + userDisplayName: 'John Doe', + loginUrl: 'https://app.com/login' +}); + +// Send rendered email +const mailer = await getMailer(); + +await mailer.sendEmail({ + to: user.email, + from: 'welcome@yourdomain.com', + subject, + html, +}); +``` \ No newline at end of file diff --git a/packages/mailers/core/package.json b/packages/mailers/core/package.json index e764962e4..ed96fa625 100644 --- a/packages/mailers/core/package.json +++ b/packages/mailers/core/package.json @@ -20,7 +20,7 @@ "@kit/resend": "workspace:*", "@kit/shared": "workspace:*", "@kit/tsconfig": "workspace:*", - "@types/node": "^24.3.1", + "@types/node": "^24.5.0", "zod": "^3.25.74" }, "typesVersions": { diff --git a/packages/mailers/resend/package.json b/packages/mailers/resend/package.json index 4a605ef0d..1ee9a566a 100644 --- a/packages/mailers/resend/package.json +++ b/packages/mailers/resend/package.json @@ -17,7 +17,7 @@ "@kit/mailers-shared": "workspace:*", "@kit/prettier-config": "workspace:*", "@kit/tsconfig": "workspace:*", - "@types/node": "^24.3.1", + "@types/node": "^24.5.0", "zod": "^3.25.74" }, "typesVersions": { diff --git a/packages/mcp-server/.gitignore b/packages/mcp-server/.gitignore new file mode 100644 index 000000000..c795b054e --- /dev/null +++ b/packages/mcp-server/.gitignore @@ -0,0 +1 @@ +build \ No newline at end of file diff --git a/packages/mcp-server/README.md b/packages/mcp-server/README.md new file mode 100644 index 000000000..5655a48b0 --- /dev/null +++ b/packages/mcp-server/README.md @@ -0,0 +1,58 @@ +# Makerkit MCP Server + +The Makerkit MCP Server provides tools to AI Agents for working with the codebase. + +## Build MCP Server + +Run the command: + +```bash +pnpm --filter "@kit/mcp-server" build +``` + +The command will build the MCP Server at `packages/mcp-server/build/index.js`. + +## Adding MCP Servers to AI Coding tools + +Before getting started, retrieve the absolute path to the `index.js` file created above. You can normally do this in your IDE by right-clicking the `index.js` file and selecting `Copy Path`. + +I will reference this as `` in the steps below: please replace it with the full path to your `index.js`. + +### Claude Code + +Run the command below: + +```bash +claude mcp add makerkit node +``` + +Restart Claude Code. If no errors appear, the MCP should be correctly configured. + +### Codex + +Open the Codex YAML config and add the following: + +``` +[mcp_servers.makerkit] +command = "node" +args = [""] +``` + +### Cursor + +Open the `mcp.json` config in Cursor and add the following config: + +```json +{ + "mcpServers": { + "makerkit": { + "command": "node", + "args": [""] + } + } +} +``` + +## Additional MCP Servers + +I strongly suggest using [the Postgres MCP Server](https://github.com/modelcontextprotocol/servers-archived/tree/main/src/postgres) that allows AI Agents to understand the structure of your Database. diff --git a/packages/mcp-server/eslint.config.mjs b/packages/mcp-server/eslint.config.mjs new file mode 100644 index 000000000..97563ae8d --- /dev/null +++ b/packages/mcp-server/eslint.config.mjs @@ -0,0 +1,3 @@ +import eslintConfigBase from '@kit/eslint-config/base.js'; + +export default eslintConfigBase; diff --git a/packages/mcp-server/package.json b/packages/mcp-server/package.json new file mode 100644 index 000000000..f4ed4f3ab --- /dev/null +++ b/packages/mcp-server/package.json @@ -0,0 +1,31 @@ +{ + "name": "@kit/mcp-server", + "private": true, + "version": "0.1.0", + "main": "./build/index.js", + "bin": { + "makerkit-mcp-server": "./build/index.js" + }, + "typesVersions": { + "*": { + "*": [ + "src/*" + ] + } + }, + "scripts": { + "clean": "rm -rf .turbo node_modules", + "format": "prettier --check \"**/*.{mjs,ts,md,json}\"", + "build": "tsc && chmod 755 build/index.js", + "mcp": "node build/index.js" + }, + "devDependencies": { + "@kit/eslint-config": "workspace:*", + "@kit/prettier-config": "workspace:*", + "@kit/tsconfig": "workspace:*", + "@modelcontextprotocol/sdk": "1.18.0", + "@types/node": "^24.5.0", + "zod": "^3.25.74" + }, + "prettier": "@kit/prettier-config" +} diff --git a/packages/mcp-server/src/index.ts b/packages/mcp-server/src/index.ts new file mode 100644 index 000000000..196866863 --- /dev/null +++ b/packages/mcp-server/src/index.ts @@ -0,0 +1,31 @@ +import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'; +import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js'; + +import { registerComponentsTools } from './tools/components'; +import { registerDatabaseTools } from './tools/database'; +import { registerGetMigrationsTools } from './tools/migrations'; +import { registerScriptsTools } from './tools/scripts'; + +// Create server instance +const server = new McpServer({ + name: 'makerkit', + version: '1.0.0', + capabilities: {}, +}); + +registerGetMigrationsTools(server); +registerDatabaseTools(server); +registerComponentsTools(server); +registerScriptsTools(server); + +async function main() { + const transport = new StdioServerTransport(); + await server.connect(transport); + + console.error('Makerkit MCP Server running on stdio'); +} + +main().catch((error) => { + console.error('Fatal error in main():', error); + process.exit(1); +}); diff --git a/packages/mcp-server/src/server.ts b/packages/mcp-server/src/server.ts new file mode 100644 index 000000000..e69de29bb diff --git a/packages/mcp-server/src/tools/components.ts b/packages/mcp-server/src/tools/components.ts new file mode 100644 index 000000000..91de3568f --- /dev/null +++ b/packages/mcp-server/src/tools/components.ts @@ -0,0 +1,493 @@ +import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'; +import { readFile } from 'node:fs/promises'; +import { join } from 'node:path'; +import { z } from 'zod'; + +interface ComponentInfo { + name: string; + exportPath: string; + filePath: string; + category: 'shadcn' | 'makerkit' | 'utils'; + description: string; +} + +export class ComponentsTool { + static async getComponents(): Promise { + const packageJsonPath = join( + process.cwd(), + 'packages', + 'ui', + 'package.json', + ); + const packageJson = JSON.parse(await readFile(packageJsonPath, 'utf8')); + + const components: ComponentInfo[] = []; + + for (const [exportName, filePath] of Object.entries(packageJson.exports)) { + if (typeof filePath === 'string' && filePath.endsWith('.tsx')) { + const category = this.determineCategory(filePath); + const description = await this.generateDescription( + exportName, + filePath, + category, + ); + + components.push({ + name: exportName.replace('./', ''), + exportPath: exportName, + filePath: filePath, + category, + description, + }); + } + } + + return components.sort((a, b) => a.name.localeCompare(b.name)); + } + + static async searchComponents(query: string): Promise { + const allComponents = await this.getComponents(); + const searchTerm = query.toLowerCase(); + + return allComponents.filter((component) => { + return ( + component.name.toLowerCase().includes(searchTerm) || + component.description.toLowerCase().includes(searchTerm) || + component.category.toLowerCase().includes(searchTerm) + ); + }); + } + + static async getComponentProps(componentName: string): Promise<{ + componentName: string; + props: Array<{ + name: string; + type: string; + optional: boolean; + description?: string; + }>; + interfaces: string[]; + variants?: Record; + }> { + const content = await this.getComponentContent(componentName); + + return { + componentName, + props: this.extractProps(content), + interfaces: this.extractInterfaces(content), + variants: this.extractVariants(content), + }; + } + + private static extractProps(content: string): Array<{ + name: string; + type: string; + optional: boolean; + description?: string; + }> { + const props: Array<{ + name: string; + type: string; + optional: boolean; + description?: string; + }> = []; + + // Look for interface definitions that end with "Props" + const interfaceRegex = + /interface\s+(\w*Props)\s*(?:extends[^{]*?)?\s*{([^}]*)}/gs; + let match; + + while ((match = interfaceRegex.exec(content)) !== null) { + const interfaceBody = match[2]; + const propLines = interfaceBody + .split('\n') + .map((line) => line.trim()) + .filter((line) => line); + + for (const line of propLines) { + // Skip comments and empty lines + if ( + line.startsWith('//') || + line.startsWith('*') || + !line.includes(':') + ) + continue; + + // Extract prop name and type + const propMatch = line.match(/(\w+)(\?)?\s*:\s*([^;,]+)/); + if (propMatch) { + const [, name, optional, type] = propMatch; + props.push({ + name, + type: type.trim(), + optional: Boolean(optional), + }); + } + } + } + + return props; + } + + private static extractInterfaces(content: string): string[] { + const interfaces: string[] = []; + const interfaceRegex = /(?:export\s+)?interface\s+(\w+)/g; + let match; + + while ((match = interfaceRegex.exec(content)) !== null) { + interfaces.push(match[1]); + } + + return interfaces; + } + + private static extractVariants( + content: string, + ): Record | undefined { + // Look for CVA (class-variance-authority) variants + const cvaRegex = /cva\s*\([^,]*,\s*{[^}]*variants:\s*{([^}]*)}/s; + const match = cvaRegex.exec(content); + + if (!match) return undefined; + + const variantsSection = match[1]; + const variants: Record = {}; + + // Extract each variant category + const variantRegex = /(\w+):\s*{([^}]*)}/g; + let variantMatch; + + while ((variantMatch = variantRegex.exec(variantsSection)) !== null) { + const [, variantName, variantOptions] = variantMatch; + const options: string[] = []; + + // Extract option names + const optionRegex = /(\w+):/g; + let optionMatch; + + while ((optionMatch = optionRegex.exec(variantOptions)) !== null) { + options.push(optionMatch[1]); + } + + if (options.length > 0) { + variants[variantName] = options; + } + } + + return Object.keys(variants).length > 0 ? variants : undefined; + } + + static async getComponentContent(componentName: string): Promise { + const packageJsonPath = join( + process.cwd(), + 'packages', + 'ui', + 'package.json', + ); + const packageJson = JSON.parse(await readFile(packageJsonPath, 'utf8')); + + const exportPath = `./${componentName}`; + const filePath = packageJson.exports[exportPath]; + + if (!filePath) { + throw new Error(`Component "${componentName}" not found in exports`); + } + + const fullPath = join(process.cwd(), 'packages', 'ui', filePath); + return readFile(fullPath, 'utf8'); + } + + private static determineCategory( + filePath: string, + ): 'shadcn' | 'makerkit' | 'utils' { + if (filePath.includes('/shadcn/')) return 'shadcn'; + if (filePath.includes('/makerkit/')) return 'makerkit'; + return 'utils'; + } + + private static async generateDescription( + exportName: string, + _filePath: string, + category: 'shadcn' | 'makerkit' | 'utils', + ): Promise { + const componentName = exportName.replace('./', ''); + + if (category === 'shadcn') { + return this.getShadcnDescription(componentName); + } else if (category === 'makerkit') { + return this.getMakerkitDescription(componentName); + } else { + return this.getUtilsDescription(componentName); + } + } + + private static getShadcnDescription(componentName: string): string { + const descriptions: Record = { + accordion: + 'A vertically stacked set of interactive headings that each reveal a section of content', + 'alert-dialog': + 'A modal dialog that interrupts the user with important content and expects a response', + alert: + 'Displays a callout for user attention with different severity levels', + avatar: 'An image element with a fallback for representing the user', + badge: 'A small status descriptor for UI elements', + breadcrumb: + 'Displays the path to the current resource using a hierarchy of links', + button: 'Displays a button or a component that looks like a button', + calendar: + 'A date field component that allows users to enter and edit date', + card: 'Displays a card with header, content, and footer', + chart: 'A collection of chart components built on top of Recharts', + checkbox: + 'A control that allows the user to toggle between checked and not checked', + collapsible: 'An interactive component which can be expanded/collapsed', + command: 'A fast, composable, unstyled command menu for React', + 'data-table': 'A powerful table component built on top of TanStack Table', + dialog: + 'A window overlaid on either the primary window or another dialog window', + 'dropdown-menu': 'Displays a menu to the user triggered by a button', + form: 'Building forms with validation and error handling', + heading: 'Typography component for displaying headings', + input: + 'Displays a form input field or a component that looks like an input field', + 'input-otp': + 'Accessible one-time password component with copy paste functionality', + label: 'Renders an accessible label associated with controls', + 'navigation-menu': 'A collection of links for navigating websites', + popover: 'Displays rich content in a portal, triggered by a button', + progress: + 'Displays an indicator showing the completion progress of a task', + 'radio-group': + 'A set of checkable buttons where no more than one can be checked at a time', + 'scroll-area': + 'Augments native scroll functionality for custom, cross-browser styling', + select: 'Displays a list of options for the user to pick from', + separator: 'Visually or semantically separates content', + sheet: + 'Extends the Dialog component to display content that complements the main content of the screen', + sidebar: 'A collapsible sidebar component with navigation', + skeleton: 'Use to show a placeholder while content is loading', + slider: + 'An input where the user selects a value from within a given range', + sonner: 'An opinionated toast component for React', + switch: + 'A control that allows the user to toggle between checked and not checked', + table: 'A responsive table component', + tabs: 'A set of layered sections of content - known as tab panels - that are displayed one at a time', + textarea: + 'Displays a form textarea or a component that looks like a textarea', + tooltip: + 'A popup that displays information related to an element when the element receives keyboard focus or the mouse hovers over it', + }; + + return ( + descriptions[componentName] || `Shadcn UI component: ${componentName}` + ); + } + + private static getMakerkitDescription(componentName: string): string { + const descriptions: Record = { + if: 'Conditional rendering component that shows children only when condition is true', + trans: + 'Internationalization component for translating text with interpolation support', + sidebar: + 'Application sidebar component with navigation and collapsible functionality', + 'bordered-navigation-menu': + 'Navigation menu component with bordered styling', + spinner: 'Loading spinner component with customizable size and styling', + page: 'Page layout component that provides consistent structure and styling', + 'image-uploader': + 'Component for uploading and displaying images with drag-and-drop support', + 'global-loader': + 'Global loading indicator component for application-wide loading states', + 'loading-overlay': + 'Overlay component that shows loading state over content', + 'profile-avatar': + 'User profile avatar component with fallback and customization options', + 'enhanced-data-table': + 'Enhanced data table component with sorting, filtering, and pagination (best table component)', + 'language-selector': + 'Component for selecting application language/locale', + stepper: 'Step-by-step navigation component for multi-step processes', + 'card-button': 'Clickable card component that acts as a button', + 'multi-step-form': + 'Multi-step form component with validation and navigation', + 'app-breadcrumbs': 'Application breadcrumb navigation component', + 'empty-state': + 'Component for displaying empty states with customizable content', + marketing: 'Collection of marketing-focused components and layouts', + 'file-uploader': + 'File upload component with drag-and-drop and preview functionality', + }; + + return ( + descriptions[componentName] || + `Makerkit custom component: ${componentName}` + ); + } + + private static getUtilsDescription(componentName: string): string { + const descriptions: Record = { + utils: + 'Utility functions for styling, class management, and common operations', + 'navigation-schema': 'Schema and types for navigation configuration', + }; + + return descriptions[componentName] || `Utility module: ${componentName}`; + } +} + +export function registerComponentsTools(server: McpServer) { + createGetComponentsTool(server); + createGetComponentContentTool(server); + createComponentsSearchTool(server); + createGetComponentPropsTool(server); +} + +function createGetComponentsTool(server: McpServer) { + return server.tool( + 'get_components', + 'Get all available UI components from the @kit/ui package with descriptions', + async () => { + const components = await ComponentsTool.getComponents(); + + const componentsList = components + .map( + (component) => + `${component.name} (${component.category}): ${component.description}`, + ) + .join('\n'); + + return { + content: [ + { + type: 'text', + text: componentsList, + }, + ], + }; + }, + ); +} + +function createGetComponentContentTool(server: McpServer) { + return server.tool( + 'get_component_content', + 'Get the source code content of a specific UI component', + { + state: z.object({ + componentName: z.string(), + }), + }, + async ({ state }) => { + const content = await ComponentsTool.getComponentContent( + state.componentName, + ); + + return { + content: [ + { + type: 'text', + text: content, + }, + ], + }; + }, + ); +} + +function createComponentsSearchTool(server: McpServer) { + return server.tool( + 'components_search', + 'Search UI components by keyword in name, description, or category', + { + state: z.object({ + query: z.string(), + }), + }, + async ({ state }) => { + const components = await ComponentsTool.searchComponents(state.query); + + if (components.length === 0) { + return { + content: [ + { + type: 'text', + text: `No components found matching "${state.query}"`, + }, + ], + }; + } + + const componentsList = components + .map( + (component) => + `${component.name} (${component.category}): ${component.description}`, + ) + .join('\n'); + + return { + content: [ + { + type: 'text', + text: `Found ${components.length} components matching "${state.query}":\n\n${componentsList}`, + }, + ], + }; + }, + ); +} + +function createGetComponentPropsTool(server: McpServer) { + return server.tool( + 'get_component_props', + 'Extract component props, interfaces, and variants from a UI component', + { + state: z.object({ + componentName: z.string(), + }), + }, + async ({ state }) => { + const propsInfo = await ComponentsTool.getComponentProps( + state.componentName, + ); + + let result = `Component: ${propsInfo.componentName}\n\n`; + + if (propsInfo.interfaces.length > 0) { + result += `Interfaces: ${propsInfo.interfaces.join(', ')}\n\n`; + } + + if (propsInfo.props.length > 0) { + result += `Props:\n`; + propsInfo.props.forEach((prop) => { + const optional = prop.optional ? '?' : ''; + result += ` - ${prop.name}${optional}: ${prop.type}\n`; + }); + result += '\n'; + } + + if (propsInfo.variants) { + result += `Variants (CVA):\n`; + Object.entries(propsInfo.variants).forEach(([variantName, options]) => { + result += ` - ${variantName}: ${options.join(' | ')}\n`; + }); + result += '\n'; + } + + if (propsInfo.props.length === 0 && !propsInfo.variants) { + result += + 'No props or variants found. This might be a simple component or utility.'; + } + + return { + content: [ + { + type: 'text', + text: result, + }, + ], + }; + }, + ); +} diff --git a/packages/mcp-server/src/tools/database.ts b/packages/mcp-server/src/tools/database.ts new file mode 100644 index 000000000..c0a6dbd9e --- /dev/null +++ b/packages/mcp-server/src/tools/database.ts @@ -0,0 +1,706 @@ +import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'; +import { readFile, readdir, stat } from 'node:fs/promises'; +import { join } from 'node:path'; +import { z } from 'zod'; + +interface DatabaseFunction { + name: string; + parameters: Array<{ + name: string; + type: string; + defaultValue?: string; + }>; + returnType: string; + description: string; + purpose: string; + securityLevel: 'definer' | 'invoker'; + schema: string; + sourceFile: string; +} + +interface SchemaFile { + name: string; + path: string; + description: string; + section: string; + lastModified: Date; + tables: string[]; + functions: string[]; + dependencies: string[]; + topic: string; +} + +export class DatabaseTool { + static async getSchemaFiles(): Promise { + const schemasPath = join( + process.cwd(), + 'apps', + 'web', + 'supabase', + 'schemas', + ); + const files = await readdir(schemasPath); + + const schemaFiles: SchemaFile[] = []; + + for (const file of files.filter((f) => f.endsWith('.sql'))) { + const filePath = join(schemasPath, file); + const content = await readFile(filePath, 'utf8'); + const stats = await stat(filePath); + + // Extract section and description from the file header + const sectionMatch = content.match(/\* Section: ([^\n*]+)/); + const descriptionMatch = content.match(/\* ([^*\n]+)\n \* We create/); + + // Extract tables and functions from content + const tables = this.extractTables(content); + const functions = this.extractFunctionNames(content); + const dependencies = this.extractDependencies(content); + const topic = this.determineTopic(file, content); + + schemaFiles.push({ + name: file, + path: filePath, + section: sectionMatch?.[1]?.trim() || 'Unknown', + description: + descriptionMatch?.[1]?.trim() || 'No description available', + lastModified: stats.mtime, + tables, + functions, + dependencies, + topic, + }); + } + + return schemaFiles.sort((a, b) => a.name.localeCompare(b.name)); + } + + static async getFunctions(): Promise { + const schemaFiles = await this.getSchemaFiles(); + const functions: DatabaseFunction[] = []; + + for (const schemaFile of schemaFiles) { + const content = await readFile(schemaFile.path, 'utf8'); + const fileFunctions = this.extractFunctionsFromContent( + content, + schemaFile.name, + ); + functions.push(...fileFunctions); + } + + return functions.sort((a, b) => a.name.localeCompare(b.name)); + } + + static async getFunctionDetails( + functionName: string, + ): Promise { + const functions = await this.getFunctions(); + const func = functions.find((f) => f.name === functionName); + + if (!func) { + throw new Error(`Function "${functionName}" not found`); + } + + return func; + } + + static async searchFunctions(query: string): Promise { + const allFunctions = await this.getFunctions(); + const searchTerm = query.toLowerCase(); + + return allFunctions.filter((func) => { + return ( + func.name.toLowerCase().includes(searchTerm) || + func.description.toLowerCase().includes(searchTerm) || + func.purpose.toLowerCase().includes(searchTerm) || + func.returnType.toLowerCase().includes(searchTerm) + ); + }); + } + + static async getSchemaContent(fileName: string): Promise { + const schemasPath = join( + process.cwd(), + 'apps', + 'web', + 'supabase', + 'schemas', + ); + const filePath = join(schemasPath, fileName); + + try { + return await readFile(filePath, 'utf8'); + } catch (error) { + throw new Error(`Schema file "${fileName}" not found`); + } + } + + static async getSchemasByTopic(topic: string): Promise { + const allSchemas = await this.getSchemaFiles(); + const searchTerm = topic.toLowerCase(); + + return allSchemas.filter((schema) => { + return ( + schema.topic.toLowerCase().includes(searchTerm) || + schema.section.toLowerCase().includes(searchTerm) || + schema.description.toLowerCase().includes(searchTerm) || + schema.name.toLowerCase().includes(searchTerm) + ); + }); + } + + static async getSchemaBySection(section: string): Promise { + const allSchemas = await this.getSchemaFiles(); + return ( + allSchemas.find( + (schema) => schema.section.toLowerCase() === section.toLowerCase(), + ) || null + ); + } + + private static extractFunctionsFromContent( + content: string, + sourceFile: string, + ): DatabaseFunction[] { + const functions: DatabaseFunction[] = []; + + // Updated regex to capture function definitions with optional "or replace" + const functionRegex = + /create\s+(?:or\s+replace\s+)?function\s+([a-zA-Z_][a-zA-Z0-9_.]*)\s*\(([^)]*)\)\s*returns?\s+([^;\n]+)(?:\s+language\s+\w+)?(?:\s+security\s+(definer|invoker))?[^$]*?\$\$([^$]*)\$\$/gi; + + let match; + while ((match = functionRegex.exec(content)) !== null) { + const [, fullName, params, returnType, securityLevel, body] = match; + + if (!fullName || !returnType) continue; + + // Extract schema and function name + const nameParts = fullName.split('.'); + const functionName = nameParts[nameParts.length - 1]; + const schema = nameParts.length > 1 ? nameParts[0] : 'public'; + + // Parse parameters + const parameters = this.parseParameters(params || ''); + + // Extract description and purpose from comments before function + const functionIndex = match.index || 0; + const beforeFunction = content.substring( + Math.max(0, functionIndex - 500), + functionIndex, + ); + const description = this.extractDescription(beforeFunction, body || ''); + const purpose = this.extractPurpose(description, functionName); + + functions.push({ + name: functionName, + parameters, + returnType: returnType.trim(), + description, + purpose, + securityLevel: (securityLevel as 'definer' | 'invoker') || 'invoker', + schema, + sourceFile, + }); + } + + return functions; + } + + private static parseParameters(paramString: string): Array<{ + name: string; + type: string; + defaultValue?: string; + }> { + if (!paramString.trim()) return []; + + const parameters: Array<{ + name: string; + type: string; + defaultValue?: string; + }> = []; + + // Split by comma, but be careful of nested types + const params = paramString.split(','); + + for (const param of params) { + const cleaned = param.trim(); + if (!cleaned) continue; + + // Match parameter pattern: name type [default value] + const paramMatch = cleaned.match( + /^\s*([a-zA-Z_][a-zA-Z0-9_]*)\s+([^=\s]+)(?:\s+default\s+(.+))?\s*$/i, + ); + + if (paramMatch) { + const [, name, type, defaultValue] = paramMatch; + if (name && type) { + parameters.push({ + name: name.trim(), + type: type.trim(), + defaultValue: defaultValue?.trim(), + }); + } + } + } + + return parameters; + } + + private static extractDescription( + beforeFunction: string, + body: string, + ): string { + // Look for comments before the function + const commentMatch = beforeFunction.match(/--\s*(.+?)(?:\n|$)/); + if (commentMatch?.[1]) { + return commentMatch[1].trim(); + } + + // Look for comments inside the function body + const bodyCommentMatch = body.match(/--\s*(.+?)(?:\n|$)/); + if (bodyCommentMatch?.[1]) { + return bodyCommentMatch[1].trim(); + } + + return 'No description available'; + } + + private static extractPurpose( + description: string, + functionName: string, + ): string { + // Map function names to purposes + const purposeMap: Record = { + create_nonce: + 'Create one-time authentication tokens for secure operations', + verify_nonce: 'Verify and consume one-time tokens for authentication', + is_mfa_compliant: + 'Check if user has completed multi-factor authentication', + team_account_workspace: + 'Load comprehensive team account data with permissions', + has_role_on_account: 'Check if user has access to a specific account', + has_permission: 'Verify user permissions for specific account operations', + get_user_billing_account: 'Retrieve billing account information for user', + create_team_account: 'Create new team account with proper permissions', + invite_user_to_account: 'Send invitation to join team account', + accept_invitation: 'Process and accept team invitation', + transfer_account_ownership: 'Transfer account ownership between users', + delete_account: 'Safely delete account and associated data', + }; + + if (purposeMap[functionName]) { + return purposeMap[functionName]; + } + + // Analyze function name for purpose hints + if (functionName.includes('create')) + return 'Create database records with validation'; + if (functionName.includes('delete') || functionName.includes('remove')) + return 'Delete records with proper authorization'; + if (functionName.includes('update') || functionName.includes('modify')) + return 'Update existing records with validation'; + if (functionName.includes('get') || functionName.includes('fetch')) + return 'Retrieve data with access control'; + if (functionName.includes('verify') || functionName.includes('validate')) + return 'Validate data or permissions'; + if (functionName.includes('check') || functionName.includes('is_')) + return 'Check conditions or permissions'; + if (functionName.includes('invite')) + return 'Handle user invitations and access'; + if (functionName.includes('transfer')) + return 'Transfer ownership or data between entities'; + + return `Custom database function: ${description}`; + } + + private static extractTables(content: string): string[] { + const tables: string[] = []; + const tableRegex = + /create\s+table\s+(?:if\s+not\s+exists\s+)?(?:public\.)?([a-zA-Z_][a-zA-Z0-9_]*)/gi; + let match; + + while ((match = tableRegex.exec(content)) !== null) { + if (match[1]) { + tables.push(match[1]); + } + } + + return [...new Set(tables)]; // Remove duplicates + } + + private static extractFunctionNames(content: string): string[] { + const functions: string[] = []; + const functionRegex = + /create\s+(?:or\s+replace\s+)?function\s+(?:public\.)?([a-zA-Z_][a-zA-Z0-9_]*)/gi; + let match; + + while ((match = functionRegex.exec(content)) !== null) { + if (match[1]) { + functions.push(match[1]); + } + } + + return [...new Set(functions)]; // Remove duplicates + } + + private static extractDependencies(content: string): string[] { + const dependencies: string[] = []; + + // Look for references to other tables + const referencesRegex = + /references\s+(?:public\.)?([a-zA-Z_][a-zA-Z0-9_]*)/gi; + let match; + + while ((match = referencesRegex.exec(content)) !== null) { + if (match[1] && match[1] !== 'users') { + // Exclude auth.users as it's external + dependencies.push(match[1]); + } + } + + return [...new Set(dependencies)]; // Remove duplicates + } + + private static determineTopic(fileName: string, content: string): string { + // Map file names to topics + const fileTopicMap: Record = { + '00-privileges.sql': 'security', + '01-enums.sql': 'types', + '02-config.sql': 'configuration', + '03-accounts.sql': 'accounts', + '04-roles.sql': 'permissions', + '05-memberships.sql': 'teams', + '06-roles-permissions.sql': 'permissions', + '07-invitations.sql': 'teams', + '08-billing-customers.sql': 'billing', + '09-subscriptions.sql': 'billing', + '10-orders.sql': 'billing', + '11-notifications.sql': 'notifications', + '12-one-time-tokens.sql': 'auth', + '13-mfa.sql': 'auth', + '14-super-admin.sql': 'admin', + '15-account-views.sql': 'accounts', + '16-storage.sql': 'storage', + '17-roles-seed.sql': 'permissions', + }; + + if (fileTopicMap[fileName]) { + return fileTopicMap[fileName]; + } + + // Analyze content for topic hints + const contentLower = content.toLowerCase(); + if (contentLower.includes('account') && contentLower.includes('team')) + return 'accounts'; + if ( + contentLower.includes('subscription') || + contentLower.includes('billing') + ) + return 'billing'; + if ( + contentLower.includes('auth') || + contentLower.includes('mfa') || + contentLower.includes('token') + ) + return 'auth'; + if (contentLower.includes('permission') || contentLower.includes('role')) + return 'permissions'; + if (contentLower.includes('notification') || contentLower.includes('email')) + return 'notifications'; + if (contentLower.includes('storage') || contentLower.includes('bucket')) + return 'storage'; + if (contentLower.includes('admin') || contentLower.includes('super')) + return 'admin'; + + return 'general'; + } +} + +export function registerDatabaseTools(server: McpServer) { + createGetSchemaFilesTool(server); + createGetSchemaContentTool(server); + createGetSchemasByTopicTool(server); + createGetSchemaBySectionTool(server); + createGetFunctionsTool(server); + createGetFunctionDetailsTool(server); + createSearchFunctionsTool(server); +} + +function createGetSchemaFilesTool(server: McpServer) { + return server.tool( + 'get_schema_files', + '🔥 DATABASE SCHEMA FILES (SOURCE OF TRUTH - ALWAYS CURRENT) - Use these over migrations!', + async () => { + const schemaFiles = await DatabaseTool.getSchemaFiles(); + + const filesList = schemaFiles + .map((file) => { + const tablesInfo = + file.tables.length > 0 + ? ` | Tables: ${file.tables.join(', ')}` + : ''; + const functionsInfo = + file.functions.length > 0 + ? ` | Functions: ${file.functions.join(', ')}` + : ''; + return `${file.name} (${file.topic}): ${file.section} - ${file.description}${tablesInfo}${functionsInfo}`; + }) + .join('\n'); + + return { + content: [ + { + type: 'text', + text: `🔥 DATABASE SCHEMA FILES (ALWAYS UP TO DATE)\n\nThese files represent the current database state. Use these instead of migrations for current schema understanding.\n\n${filesList}`, + }, + ], + }; + }, + ); +} + +function createGetFunctionsTool(server: McpServer) { + return server.tool( + 'get_database_functions', + 'Get all database functions with descriptions and usage guidance', + async () => { + const functions = await DatabaseTool.getFunctions(); + + const functionsList = functions + .map((func) => { + const security = + func.securityLevel === 'definer' ? ' [SECURITY DEFINER]' : ''; + const params = func.parameters + .map((p) => { + const defaultVal = p.defaultValue ? ` = ${p.defaultValue}` : ''; + return `${p.name}: ${p.type}${defaultVal}`; + }) + .join(', '); + + return `${func.name}(${params}) � ${func.returnType}${security}\n Purpose: ${func.purpose}\n Source: ${func.sourceFile}`; + }) + .join('\n\n'); + + return { + content: [ + { + type: 'text', + text: `Database Functions:\n\n${functionsList}`, + }, + ], + }; + }, + ); +} + +function createGetFunctionDetailsTool(server: McpServer) { + return server.tool( + 'get_function_details', + 'Get detailed information about a specific database function', + { + state: z.object({ + functionName: z.string(), + }), + }, + async ({ state }) => { + const func = await DatabaseTool.getFunctionDetails(state.functionName); + + const params = + func.parameters.length > 0 + ? func.parameters + .map((p) => { + const defaultVal = p.defaultValue + ? ` (default: ${p.defaultValue})` + : ''; + return ` - ${p.name}: ${p.type}${defaultVal}`; + }) + .join('\n') + : ' No parameters'; + + const securityNote = + func.securityLevel === 'definer' + ? '\n� SECURITY DEFINER: This function runs with elevated privileges and bypasses RLS.' + : '\n SECURITY INVOKER: This function inherits caller permissions and respects RLS.'; + + return { + content: [ + { + type: 'text', + text: `Function: ${func.schema}.${func.name} + +Purpose: ${func.purpose} +Description: ${func.description} +Return Type: ${func.returnType} +Security Level: ${func.securityLevel}${securityNote} + +Parameters: +${params} + +Source File: ${func.sourceFile}`, + }, + ], + }; + }, + ); +} + +function createSearchFunctionsTool(server: McpServer) { + return server.tool( + 'search_database_functions', + 'Search database functions by name, description, or purpose', + { + state: z.object({ + query: z.string(), + }), + }, + async ({ state }) => { + const functions = await DatabaseTool.searchFunctions(state.query); + + if (functions.length === 0) { + return { + content: [ + { + type: 'text', + text: `No database functions found matching "${state.query}"`, + }, + ], + }; + } + + const functionsList = functions + .map((func) => { + const security = func.securityLevel === 'definer' ? ' [DEFINER]' : ''; + return `${func.name}${security}: ${func.purpose}`; + }) + .join('\n'); + + return { + content: [ + { + type: 'text', + text: `Found ${functions.length} functions matching "${state.query}":\n\n${functionsList}`, + }, + ], + }; + }, + ); +} + +function createGetSchemaContentTool(server: McpServer) { + return server.tool( + 'get_schema_content', + '📋 Get raw schema file content (CURRENT DATABASE STATE) - Source of truth for database structure', + { + state: z.object({ + fileName: z.string(), + }), + }, + async ({ state }) => { + const content = await DatabaseTool.getSchemaContent(state.fileName); + + return { + content: [ + { + type: 'text', + text: `📋 SCHEMA FILE: ${state.fileName} (CURRENT STATE)\n\n${content}`, + }, + ], + }; + }, + ); +} + +function createGetSchemasByTopicTool(server: McpServer) { + return server.tool( + 'get_schemas_by_topic', + '🎯 Find schema files by topic (accounts, auth, billing, permissions, etc.) - Fastest way to find relevant schemas', + { + state: z.object({ + topic: z.string(), + }), + }, + async ({ state }) => { + const schemas = await DatabaseTool.getSchemasByTopic(state.topic); + + if (schemas.length === 0) { + return { + content: [ + { + type: 'text', + text: `No schema files found for topic "${state.topic}". Available topics: accounts, auth, billing, permissions, teams, notifications, storage, admin, security, types, configuration.`, + }, + ], + }; + } + + const schemasList = schemas + .map((schema) => { + const tablesInfo = + schema.tables.length > 0 + ? `\n Tables: ${schema.tables.join(', ')}` + : ''; + const functionsInfo = + schema.functions.length > 0 + ? `\n Functions: ${schema.functions.join(', ')}` + : ''; + return `${schema.name}: ${schema.description}${tablesInfo}${functionsInfo}`; + }) + .join('\n\n'); + + return { + content: [ + { + type: 'text', + text: `🎯 SCHEMAS FOR TOPIC: "${state.topic}"\n\n${schemasList}`, + }, + ], + }; + }, + ); +} + +function createGetSchemaBySectionTool(server: McpServer) { + return server.tool( + 'get_schema_by_section', + '📂 Get specific schema by section name (Accounts, Permissions, etc.) - Direct access to schema sections', + { + state: z.object({ + section: z.string(), + }), + }, + async ({ state }) => { + const schema = await DatabaseTool.getSchemaBySection(state.section); + + if (!schema) { + return { + content: [ + { + type: 'text', + text: `No schema found for section "${state.section}". Use get_schema_files to see available sections.`, + }, + ], + }; + } + + const tablesInfo = + schema.tables.length > 0 ? `\nTables: ${schema.tables.join(', ')}` : ''; + const functionsInfo = + schema.functions.length > 0 + ? `\nFunctions: ${schema.functions.join(', ')}` + : ''; + const dependenciesInfo = + schema.dependencies.length > 0 + ? `\nDependencies: ${schema.dependencies.join(', ')}` + : ''; + + return { + content: [ + { + type: 'text', + text: `📂 SCHEMA SECTION: ${schema.section}\n\nFile: ${schema.name}\nTopic: ${schema.topic}\nDescription: ${schema.description}${tablesInfo}${functionsInfo}${dependenciesInfo}\n\nLast Modified: ${schema.lastModified.toISOString()}`, + }, + ], + }; + }, + ); +} diff --git a/packages/mcp-server/src/tools/migrations.ts b/packages/mcp-server/src/tools/migrations.ts new file mode 100644 index 000000000..d6cc837d6 --- /dev/null +++ b/packages/mcp-server/src/tools/migrations.ts @@ -0,0 +1,122 @@ +import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'; +import { exec } from 'node:child_process'; +import { readFile, readdir } from 'node:fs/promises'; +import { join } from 'node:path'; +import { promisify } from 'node:util'; +import { z } from 'zod'; + +export class MigrationsTool { + static GetMigrations() { + return readdir( + join(process.cwd(), 'apps', 'web', 'supabase', 'migrations'), + ); + } + + static getMigrationContent(path: string) { + return readFile( + join(process.cwd(), 'apps', 'web', 'supabase', 'migrations', path), + 'utf8', + ); + } + + static CreateMigration(path: string) { + return promisify(exec)(`supabase migration new ${path}`); + } + + static Diff() { + return promisify(exec)(`supabase migration diff`); + } +} + +export function registerGetMigrationsTools(server: McpServer) { + createGetMigrationsTool(server); + createGetMigrationContentTool(server); + createCreateMigrationTool(server); + createDiffMigrationTool(server); +} + +function createDiffMigrationTool(server: McpServer) { + return server.tool( + 'diff_migrations', + 'Compare differences between the declarative schemas and the applied migrations in Supabase', + async () => { + const { stdout } = await MigrationsTool.Diff(); + + return { + content: [ + { + type: 'text', + text: stdout, + }, + ], + }; + }, + ); +} + +function createCreateMigrationTool(server: McpServer) { + return server.tool( + 'create_migration', + 'Create a new Supabase Postgres migration file', + { + state: z.object({ + name: z.string(), + }), + }, + async ({ state }) => { + const { stdout } = await MigrationsTool.CreateMigration(state.name); + + return { + content: [ + { + type: 'text', + text: stdout, + }, + ], + }; + }, + ); +} + +function createGetMigrationContentTool(server: McpServer) { + return server.tool( + 'get_migration_content', + '📜 Get migration file content (HISTORICAL) - For current state use get_schema_content instead', + { + state: z.object({ + path: z.string(), + }), + }, + async ({ state }) => { + const content = await MigrationsTool.getMigrationContent(state.path); + + return { + content: [ + { + type: 'text', + text: `📜 MIGRATION FILE: ${state.path} (HISTORICAL)\n\nNote: This shows historical changes. For current database state, use get_schema_content instead.\n\n${content}`, + }, + ], + }; + }, + ); +} + +function createGetMigrationsTool(server: McpServer) { + return server.tool( + 'get_migrations', + '📜 Get migration files (HISTORICAL CHANGES) - Use schema files for current state instead', + async () => { + const migrations = await MigrationsTool.GetMigrations(); + + return { + content: [ + { + type: 'text', + text: `📜 MIGRATION FILES (HISTORICAL CHANGES)\n\nNote: For current database state, use get_schema_files instead. Migrations show historical changes.\n\n${migrations.join('\n')}`, + }, + ], + }; + }, + ); +} diff --git a/packages/mcp-server/src/tools/scripts.ts b/packages/mcp-server/src/tools/scripts.ts new file mode 100644 index 000000000..45ff6e70f --- /dev/null +++ b/packages/mcp-server/src/tools/scripts.ts @@ -0,0 +1,323 @@ +import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'; +import { readFile } from 'node:fs/promises'; +import { join } from 'node:path'; +import { z } from 'zod'; + +interface ScriptInfo { + name: string; + command: string; + category: + | 'development' + | 'build' + | 'testing' + | 'linting' + | 'database' + | 'maintenance' + | 'environment'; + description: string; + usage: string; + importance: 'critical' | 'high' | 'medium' | 'low'; + healthcheck?: boolean; +} + +export class ScriptsTool { + static async getScripts(): Promise { + const packageJsonPath = join(process.cwd(), 'package.json'); + const packageJson = JSON.parse(await readFile(packageJsonPath, 'utf8')); + + const scripts: ScriptInfo[] = []; + + for (const [scriptName, command] of Object.entries(packageJson.scripts)) { + if (typeof command === 'string') { + const scriptInfo = this.getScriptInfo(scriptName, command); + scripts.push(scriptInfo); + } + } + + return scripts.sort((a, b) => { + const importanceOrder = { critical: 0, high: 1, medium: 2, low: 3 }; + return importanceOrder[a.importance] - importanceOrder[b.importance]; + }); + } + + static async getScriptDetails(scriptName: string): Promise { + const packageJsonPath = join(process.cwd(), 'package.json'); + const packageJson = JSON.parse(await readFile(packageJsonPath, 'utf8')); + + const command = packageJson.scripts[scriptName]; + if (!command) { + throw new Error(`Script "${scriptName}" not found`); + } + + return this.getScriptInfo(scriptName, command); + } + + private static getScriptInfo( + scriptName: string, + command: string, + ): ScriptInfo { + const scriptDescriptions: Record< + string, + Omit + > = { + dev: { + category: 'development', + description: + 'Start development servers for all applications in parallel with hot reloading', + usage: 'Run this to start developing. Opens web app on port 3000.', + importance: 'medium', + }, + build: { + category: 'build', + description: + 'Build all applications and packages for production deployment', + usage: + 'Use before deploying to production. Ensures all code compiles correctly.', + importance: 'medium', + }, + typecheck: { + category: 'linting', + description: + 'Run TypeScript compiler to check for type errors across all packages', + usage: + 'CRITICAL: Run after writing code to ensure type safety. Must pass before commits.', + importance: 'critical', + healthcheck: true, + }, + lint: { + category: 'linting', + description: + 'Run ESLint to check code quality and enforce coding standards', + usage: + 'CRITICAL: Run after writing code to ensure code quality. Must pass before commits.', + importance: 'medium', + healthcheck: true, + }, + 'lint:fix': { + category: 'linting', + description: + 'Run ESLint with auto-fix to automatically resolve fixable issues', + usage: + 'Use to automatically fix linting issues. Run before manual fixes.', + importance: 'high', + healthcheck: true, + }, + format: { + category: 'linting', + description: 'Check code formatting with Prettier across all files', + usage: 'Verify code follows consistent formatting standards.', + importance: 'high', + }, + 'format:fix': { + category: 'linting', + description: + 'Auto-format all code with Prettier to ensure consistent styling', + usage: 'Use to automatically format code. Run before commits.', + importance: 'high', + healthcheck: true, + }, + test: { + category: 'testing', + description: 'Run all test suites across the monorepo', + usage: 'Execute to verify functionality. Should pass before commits.', + importance: 'high', + healthcheck: true, + }, + 'supabase:web:start': { + category: 'database', + description: 'Start local Supabase instance for development', + usage: 'Required for local development with database access.', + importance: 'critical', + }, + 'supabase:web:stop': { + category: 'database', + description: 'Stop the local Supabase instance', + usage: 'Use when done developing to free up resources.', + importance: 'medium', + }, + 'supabase:web:reset': { + category: 'database', + description: 'Reset local database to latest schema and seed data', + usage: 'Use when database state is corrupted or needs fresh start.', + importance: 'high', + }, + 'supabase:web:typegen': { + category: 'database', + description: 'Generate TypeScript types from Supabase database schema', + usage: 'Run after database schema changes to update types.', + importance: 'high', + }, + 'supabase:web:test': { + category: 'testing', + description: 'Run Supabase-specific tests', + usage: 'Test database functions, RLS policies, and migrations.', + importance: 'high', + }, + clean: { + category: 'maintenance', + description: 'Remove all generated files and dependencies', + usage: + 'Use when build artifacts are corrupted. Requires reinstall after.', + importance: 'medium', + }, + 'clean:workspaces': { + category: 'maintenance', + description: 'Clean all workspace packages using Turbo', + usage: 'Lighter cleanup that preserves node_modules.', + importance: 'medium', + }, + 'stripe:listen': { + category: 'development', + description: 'Start Stripe webhook listener for local development', + usage: 'Required when testing payment workflows locally.', + importance: 'medium', + }, + 'env:generate': { + category: 'environment', + description: 'Generate environment variable templates', + usage: 'Creates .env templates for new environments.', + importance: 'low', + }, + 'env:validate': { + category: 'environment', + description: 'Validate environment variables against schema', + usage: 'Ensures all required environment variables are properly set.', + importance: 'medium', + }, + update: { + category: 'maintenance', + description: 'Update all dependencies across the monorepo', + usage: 'Keep dependencies current. Test thoroughly after updating.', + importance: 'low', + }, + 'syncpack:list': { + category: 'maintenance', + description: 'List dependency version mismatches across packages', + usage: 'Identify inconsistent package versions in monorepo.', + importance: 'low', + }, + 'syncpack:fix': { + category: 'maintenance', + description: 'Fix dependency version mismatches across packages', + usage: 'Automatically align package versions across workspaces.', + importance: 'low', + }, + }; + + const scriptInfo = scriptDescriptions[scriptName] || { + category: 'maintenance' as const, + description: `Custom script: ${scriptName}`, + usage: 'See package.json for command details.', + importance: 'low' as const, + }; + + return { + name: scriptName, + command, + ...scriptInfo, + }; + } + + static getHealthcheckScripts(): ScriptInfo[] { + const allScripts = ['typecheck', 'lint', 'lint:fix', 'format:fix', 'test']; + + return allScripts.map((scriptName) => + this.getScriptInfo(scriptName, `[healthcheck] ${scriptName}`), + ); + } +} + +export function registerScriptsTools(server: McpServer) { + createGetScriptsTool(server); + createGetScriptDetailsTool(server); + createGetHealthcheckScriptsTool(server); +} + +function createGetScriptsTool(server: McpServer) { + return server.tool( + 'get_scripts', + 'Get all available npm/pnpm scripts with descriptions and usage guidance', + async () => { + const scripts = await ScriptsTool.getScripts(); + + const scriptsList = scripts + .map((script) => { + const healthcheck = script.healthcheck ? ' [HEALTHCHECK]' : ''; + return `${script.name} (${script.category})${healthcheck}: ${script.description}\n Usage: ${script.usage}`; + }) + .join('\n\n'); + + return { + content: [ + { + type: 'text', + text: `Available Scripts (sorted by importance):\n\n${scriptsList}`, + }, + ], + }; + }, + ); +} + +function createGetScriptDetailsTool(server: McpServer) { + return server.tool( + 'get_script_details', + 'Get detailed information about a specific script', + { + state: z.object({ + scriptName: z.string(), + }), + }, + async ({ state }) => { + const script = await ScriptsTool.getScriptDetails(state.scriptName); + + const healthcheck = script.healthcheck + ? '\n� HEALTHCHECK SCRIPT: This script should be run after writing code to ensure quality.' + : ''; + + return { + content: [ + { + type: 'text', + text: `Script: ${script.name} +Command: ${script.command} +Category: ${script.category} +Importance: ${script.importance} +Description: ${script.description} +Usage: ${script.usage}${healthcheck}`, + }, + ], + }; + }, + ); +} + +function createGetHealthcheckScriptsTool(server: McpServer) { + return server.tool( + 'get_healthcheck_scripts', + 'Get critical scripts that should be run after writing code (typecheck, lint, format, test)', + async () => { + const scripts = await ScriptsTool.getScripts(); + const healthcheckScripts = scripts.filter((script) => script.healthcheck); + + const scriptsList = healthcheckScripts + .map((script) => `pnpm ${script.name}: ${script.usage}`) + .join('\n'); + + return { + content: [ + { + type: 'text', + text: `<� CODE HEALTHCHECK SCRIPTS + +These scripts MUST be run after writing code to ensure quality: + +${scriptsList} + +� IMPORTANT: Always run these scripts before considering your work complete. They catch type errors, code quality issues, and ensure consistent formatting.`, + }, + ], + }; + }, + ); +} diff --git a/packages/mcp-server/test.ts b/packages/mcp-server/test.ts new file mode 100644 index 000000000..3ca052658 --- /dev/null +++ b/packages/mcp-server/test.ts @@ -0,0 +1,391 @@ +import { ComponentsTool } from './src/tools/components'; +import { DatabaseTool } from './src/tools/database'; +import { MigrationsTool } from './src/tools/migrations'; +import { ScriptsTool } from './src/tools/scripts'; + +console.log('=== Testing MigrationsTool ==='); +console.log(await MigrationsTool.GetMigrations()); + +console.log( + await MigrationsTool.getMigrationContent('20240319163440_roles-seed.sql'), +); + +console.log('\n=== Testing ComponentsTool ==='); + +console.log('\n--- Getting all components ---'); +const components = await ComponentsTool.getComponents(); +console.log(`Found ${components.length} components:`); +components.slice(0, 5).forEach((component) => { + console.log( + `- ${component.name} (${component.category}): ${component.description}`, + ); +}); +console.log('...'); + +console.log('\n--- Testing component content retrieval ---'); +try { + const buttonContent = await ComponentsTool.getComponentContent('button'); + console.log('Button component content length:', buttonContent.length); + console.log('First 200 characters:', buttonContent.substring(0, 200)); +} catch (error) { + console.error('Error getting button component:', error); +} + +console.log('\n--- Testing component filtering by category ---'); +const shadcnComponents = components.filter((c) => c.category === 'shadcn'); +const makerkitComponents = components.filter((c) => c.category === 'makerkit'); +const utilsComponents = components.filter((c) => c.category === 'utils'); + +console.log(`Shadcn components: ${shadcnComponents.length}`); +console.log(`Makerkit components: ${makerkitComponents.length}`); +console.log(`Utils components: ${utilsComponents.length}`); + +console.log('\n--- Sample components by category ---'); +console.log( + 'Shadcn:', + shadcnComponents + .slice(0, 3) + .map((c) => c.name) + .join(', '), +); +console.log( + 'Makerkit:', + makerkitComponents + .slice(0, 3) + .map((c) => c.name) + .join(', '), +); +console.log('Utils:', utilsComponents.map((c) => c.name).join(', ')); + +console.log('\n--- Testing error handling ---'); +try { + await ComponentsTool.getComponentContent('non-existent-component'); +} catch (error) { + console.log( + 'Expected error for non-existent component:', + error instanceof Error ? error.message : String(error), + ); +} + +console.log('\n=== Testing ScriptsTool ==='); + +console.log('\n--- Getting all scripts ---'); +const scripts = await ScriptsTool.getScripts(); +console.log(`Found ${scripts.length} scripts:`); + +console.log('\n--- Critical and High importance scripts ---'); +const importantScripts = scripts.filter( + (s) => s.importance === 'critical' || s.importance === 'high', +); +importantScripts.forEach((script) => { + const healthcheck = script.healthcheck ? ' [HEALTHCHECK]' : ''; + console.log( + `- ${script.name} (${script.importance})${healthcheck}: ${script.description}`, + ); +}); + +console.log('\n--- Healthcheck scripts (code quality) ---'); +const healthcheckScripts = scripts.filter((s) => s.healthcheck); +console.log('Scripts that should be run after writing code:'); +healthcheckScripts.forEach((script) => { + console.log(`- pnpm ${script.name}: ${script.usage}`); +}); + +console.log('\n--- Scripts by category ---'); +const categories = [...new Set(scripts.map((s) => s.category))]; +categories.forEach((category) => { + const categoryScripts = scripts.filter((s) => s.category === category); + console.log(`${category}: ${categoryScripts.map((s) => s.name).join(', ')}`); +}); + +console.log('\n--- Testing script details ---'); +try { + const typecheckDetails = await ScriptsTool.getScriptDetails('typecheck'); + console.log('Typecheck script details:'); + console.log(` Command: ${typecheckDetails.command}`); + console.log(` Importance: ${typecheckDetails.importance}`); + console.log(` Healthcheck: ${typecheckDetails.healthcheck}`); + console.log(` Usage: ${typecheckDetails.usage}`); +} catch (error) { + console.error('Error getting typecheck details:', error); +} + +console.log('\n--- Testing error handling for scripts ---'); +try { + await ScriptsTool.getScriptDetails('non-existent-script'); +} catch (error) { + console.log( + 'Expected error for non-existent script:', + error instanceof Error ? error.message : String(error), + ); +} + +console.log('\n=== Testing New ComponentsTool Features ==='); + +console.log('\n--- Testing component search ---'); +const buttonSearchResults = await ComponentsTool.searchComponents('button'); +console.log(`Search for "button": ${buttonSearchResults.length} results`); +buttonSearchResults.forEach((component) => { + console.log(` - ${component.name}: ${component.description}`); +}); + +console.log('\n--- Testing search by category ---'); +const shadcnSearchResults = await ComponentsTool.searchComponents('shadcn'); +console.log( + `Search for "shadcn": ${shadcnSearchResults.length} results (showing first 3)`, +); +shadcnSearchResults.slice(0, 3).forEach((component) => { + console.log(` - ${component.name}`); +}); + +console.log('\n--- Testing search by description keyword ---'); +const formSearchResults = await ComponentsTool.searchComponents('form'); +console.log(`Search for "form": ${formSearchResults.length} results`); +formSearchResults.forEach((component) => { + console.log(` - ${component.name}: ${component.description}`); +}); + +console.log('\n--- Testing component props extraction ---'); +try { + console.log('\n--- Button component props ---'); + const buttonProps = await ComponentsTool.getComponentProps('button'); + console.log(`Component: ${buttonProps.componentName}`); + console.log(`Interfaces: ${buttonProps.interfaces.join(', ')}`); + console.log(`Props (${buttonProps.props.length}):`); + buttonProps.props.forEach((prop) => { + const optional = prop.optional ? '?' : ''; + console.log(` - ${prop.name}${optional}: ${prop.type}`); + }); + if (buttonProps.variants) { + console.log('Variants:'); + Object.entries(buttonProps.variants).forEach(([variantName, options]) => { + console.log(` - ${variantName}: ${options.join(' | ')}`); + }); + } +} catch (error) { + console.error('Error getting button props:', error); +} + +console.log('\n--- Testing simpler component props ---'); +try { + const ifProps = await ComponentsTool.getComponentProps('if'); + console.log(`Component: ${ifProps.componentName}`); + console.log(`Interfaces: ${ifProps.interfaces.join(', ')}`); + console.log(`Props count: ${ifProps.props.length}`); + if (ifProps.props.length > 0) { + ifProps.props.forEach((prop) => { + const optional = prop.optional ? '?' : ''; + console.log(` - ${prop.name}${optional}: ${prop.type}`); + }); + } +} catch (error) { + console.error('Error getting if component props:', error); +} + +console.log('\n--- Testing search with no results ---'); +const noResults = await ComponentsTool.searchComponents('xyz123nonexistent'); +console.log(`Search for non-existent: ${noResults.length} results`); + +console.log('\n--- Testing props extraction error handling ---'); +try { + await ComponentsTool.getComponentProps('non-existent-component'); +} catch (error) { + console.log( + 'Expected error for non-existent component props:', + error instanceof Error ? error.message : String(error), + ); +} + +console.log('\n=== Testing DatabaseTool ==='); + +console.log('\n--- Getting schema files ---'); +const schemaFiles = await DatabaseTool.getSchemaFiles(); +console.log(`Found ${schemaFiles.length} schema files:`); +schemaFiles.slice(0, 5).forEach((file) => { + console.log(` - ${file.name}: ${file.section}`); +}); + +console.log('\n--- Getting database functions ---'); +const dbFunctions = await DatabaseTool.getFunctions(); +console.log(`Found ${dbFunctions.length} database functions:`); +dbFunctions.forEach((func) => { + const security = func.securityLevel === 'definer' ? ' [DEFINER]' : ''; + console.log(` - ${func.name}${security}: ${func.purpose}`); +}); + +console.log('\n--- Testing function search ---'); +const authFunctions = await DatabaseTool.searchFunctions('auth'); +console.log(`Functions related to "auth": ${authFunctions.length}`); +authFunctions.forEach((func) => { + console.log(` - ${func.name}: ${func.purpose}`); +}); + +console.log('\n--- Testing function search by security ---'); +const definerFunctions = await DatabaseTool.searchFunctions('definer'); +console.log(`Functions with security definer: ${definerFunctions.length}`); +definerFunctions.forEach((func) => { + console.log(` - ${func.name}: ${func.purpose}`); +}); + +console.log('\n--- Testing function details ---'); +if (dbFunctions.length > 0) { + try { + const firstFunction = dbFunctions[0]; + if (firstFunction) { + const functionDetails = await DatabaseTool.getFunctionDetails( + firstFunction.name, + ); + console.log(`Details for ${functionDetails.name}:`); + console.log(` Purpose: ${functionDetails.purpose}`); + console.log(` Return Type: ${functionDetails.returnType}`); + console.log(` Security: ${functionDetails.securityLevel}`); + console.log(` Parameters: ${functionDetails.parameters.length}`); + functionDetails.parameters.forEach((param) => { + const defaultVal = param.defaultValue + ? ` (default: ${param.defaultValue})` + : ''; + console.log(` - ${param.name}: ${param.type}${defaultVal}`); + }); + } + } catch (error) { + console.error('Error getting function details:', error); + } +} + +console.log('\n--- Testing function search with no results ---'); +const noFunctionResults = + await DatabaseTool.searchFunctions('xyz123nonexistent'); +console.log( + `Search for non-existent function: ${noFunctionResults.length} results`, +); + +console.log('\n--- Testing function details error handling ---'); +try { + await DatabaseTool.getFunctionDetails('non-existent-function'); +} catch (error) { + console.log( + 'Expected error for non-existent function:', + error instanceof Error ? error.message : String(error), + ); +} + +console.log('\n=== Testing Enhanced DatabaseTool Features ==='); + +console.log('\n--- Testing direct schema content access ---'); +try { + const accountsSchemaContent = + await DatabaseTool.getSchemaContent('03-accounts.sql'); + console.log('Accounts schema content length:', accountsSchemaContent.length); + console.log('First 200 characters:', accountsSchemaContent.substring(0, 200)); +} catch (error) { + console.error( + 'Error getting accounts schema content:', + error instanceof Error ? error.message : String(error), + ); +} + +console.log('\n--- Testing schema search by topic ---'); +const authSchemas = await DatabaseTool.getSchemasByTopic('auth'); +console.log(`Schemas related to "auth": ${authSchemas.length}`); +authSchemas.forEach((schema) => { + console.log(` - ${schema.name} (${schema.topic}): ${schema.section}`); + if (schema.functions.length > 0) { + console.log(` Functions: ${schema.functions.join(', ')}`); + } +}); + +console.log('\n--- Testing schema search by topic - billing ---'); +const billingSchemas = await DatabaseTool.getSchemasByTopic('billing'); +console.log(`Schemas related to "billing": ${billingSchemas.length}`); +billingSchemas.forEach((schema) => { + console.log(` - ${schema.name}: ${schema.description}`); + if (schema.tables.length > 0) { + console.log(` Tables: ${schema.tables.join(', ')}`); + } +}); + +console.log('\n--- Testing schema search by topic - accounts ---'); +const accountSchemas = await DatabaseTool.getSchemasByTopic('accounts'); +console.log(`Schemas related to "accounts": ${accountSchemas.length}`); +accountSchemas.forEach((schema) => { + console.log(` - ${schema.name}: ${schema.description}`); + if (schema.dependencies.length > 0) { + console.log(` Dependencies: ${schema.dependencies.join(', ')}`); + } +}); + +console.log('\n--- Testing schema by section lookup ---'); +try { + const accountsSection = await DatabaseTool.getSchemaBySection('Accounts'); + if (accountsSection) { + console.log(`Found section: ${accountsSection.section}`); + console.log(`File: ${accountsSection.name}`); + console.log(`Topic: ${accountsSection.topic}`); + console.log(`Tables: ${accountsSection.tables.join(', ')}`); + console.log(`Last modified: ${accountsSection.lastModified.toISOString()}`); + } +} catch (error) { + console.error('Error getting accounts section:', error); +} + +console.log('\n--- Testing enhanced schema metadata ---'); +const enhancedSchemas = await DatabaseTool.getSchemaFiles(); +console.log(`Total schemas with metadata: ${enhancedSchemas.length}`); + +// Show schemas with the most tables +const schemasWithTables = enhancedSchemas.filter((s) => s.tables.length > 0); +console.log(`Schemas with tables: ${schemasWithTables.length}`); +schemasWithTables.slice(0, 3).forEach((schema) => { + console.log( + ` - ${schema.name}: ${schema.tables.length} tables (${schema.tables.join(', ')})`, + ); +}); + +// Show schemas with functions +const schemasWithFunctions = enhancedSchemas.filter( + (s) => s.functions.length > 0, +); +console.log(`Schemas with functions: ${schemasWithFunctions.length}`); +schemasWithFunctions.slice(0, 3).forEach((schema) => { + console.log( + ` - ${schema.name}: ${schema.functions.length} functions (${schema.functions.join(', ')})`, + ); +}); + +// Show topic distribution +const topicCounts = enhancedSchemas.reduce( + (acc, schema) => { + acc[schema.topic] = (acc[schema.topic] || 0) + 1; + return acc; + }, + {} as Record, +); + +console.log('\n--- Topic distribution ---'); +Object.entries(topicCounts).forEach(([topic, count]) => { + console.log(` - ${topic}: ${count} files`); +}); + +console.log('\n--- Testing error handling for enhanced features ---'); +try { + await DatabaseTool.getSchemaContent('non-existent-schema.sql'); +} catch (error) { + console.log( + 'Expected error for non-existent schema:', + error instanceof Error ? error.message : String(error), + ); +} + +try { + const nonExistentSection = + await DatabaseTool.getSchemaBySection('NonExistentSection'); + console.log('Non-existent section result:', nonExistentSection); +} catch (error) { + console.error('Unexpected error for non-existent section:', error); +} + +const emptyTopicResults = + await DatabaseTool.getSchemasByTopic('xyz123nonexistent'); +console.log( + `Search for non-existent topic: ${emptyTopicResults.length} results`, +); diff --git a/packages/mcp-server/tsconfig.json b/packages/mcp-server/tsconfig.json new file mode 100644 index 000000000..3e968e5f0 --- /dev/null +++ b/packages/mcp-server/tsconfig.json @@ -0,0 +1,14 @@ +{ + "extends": "@kit/tsconfig/base.json", + "compilerOptions": { + "tsBuildInfoFile": "node_modules/.cache/tsbuildinfo.json", + "outDir": "./build", + "noEmit": false, + "strict": false, + "target": "ES2022", + "module": "commonjs", + "moduleResolution": "node" + }, + "files": ["src/index.ts"], + "exclude": ["node_modules"] +} diff --git a/packages/monitoring/api/package.json b/packages/monitoring/api/package.json index 38cba30ae..0ffb85737 100644 --- a/packages/monitoring/api/package.json +++ b/packages/monitoring/api/package.json @@ -23,7 +23,7 @@ "@kit/sentry": "workspace:*", "@kit/shared": "workspace:*", "@kit/tsconfig": "workspace:*", - "@types/react": "19.1.12", + "@types/react": "19.1.13", "react": "19.1.1", "zod": "^3.25.74" }, diff --git a/packages/monitoring/core/package.json b/packages/monitoring/core/package.json index 228310caa..0dcb00ffd 100644 --- a/packages/monitoring/core/package.json +++ b/packages/monitoring/core/package.json @@ -17,7 +17,7 @@ "@kit/eslint-config": "workspace:*", "@kit/prettier-config": "workspace:*", "@kit/tsconfig": "workspace:*", - "@types/react": "19.1.12", + "@types/react": "19.1.13", "react": "19.1.1" }, "typesVersions": { diff --git a/packages/monitoring/sentry/package.json b/packages/monitoring/sentry/package.json index 6b10de329..cb361bf90 100644 --- a/packages/monitoring/sentry/package.json +++ b/packages/monitoring/sentry/package.json @@ -16,7 +16,7 @@ "./config/server": "./src/sentry.client.server.ts" }, "dependencies": { - "@sentry/nextjs": "^10.10.0", + "@sentry/nextjs": "^10.11.0", "import-in-the-middle": "1.14.2" }, "devDependencies": { @@ -24,7 +24,7 @@ "@kit/monitoring-core": "workspace:*", "@kit/prettier-config": "workspace:*", "@kit/tsconfig": "workspace:*", - "@types/react": "19.1.12", + "@types/react": "19.1.13", "react": "19.1.1" }, "typesVersions": { diff --git a/packages/next/AGENTS.md b/packages/next/AGENTS.md new file mode 100644 index 000000000..2bdd5e6c2 --- /dev/null +++ b/packages/next/AGENTS.md @@ -0,0 +1,435 @@ +# Next.js Utilities Instructions + +This file contains instructions for working with Next.js utilities including server actions and route handlers. + +## Server Actions Implementation + +Always use `enhanceAction` from `@packages/next/src/actions/index.ts`: + +```typescript +'use server'; + +import { enhanceAction } from '@kit/next/actions'; +import { z } from 'zod'; + +// Define your schema +const CreateNoteSchema = z.object({ + title: z.string().min(1, 'Title is required'), + content: z.string().min(1, 'Content is required'), + accountId: z.string().uuid('Invalid account ID'), +}); + +export const createNoteAction = enhanceAction( + async function (data, user) { + // data is automatically validated against the schema + // user is automatically authenticated if auth: true + + const client = getSupabaseServerClient(); + + const { data: note, error } = await client + .from('notes') + .insert({ + title: data.title, + content: data.content, + account_id: data.accountId, + user_id: user.id, + }) + .select() + .single(); + + if (error) { + throw error; + } + + return { success: true, note }; + }, + { + auth: true, // Require authentication + schema: CreateNoteSchema, // Validate input with Zod + }, +); +``` + +### Server Action Examples + +- Team billing: `@apps/web/app/home/[account]/billing/_lib/server/server-actions.ts` +- Personal settings: `@apps/web/app/home/(user)/settings/_lib/server/server-actions.ts` + +### Server Action Options + +```typescript +export const myAction = enhanceAction( + async function (data, user, requestData) { + // data: validated input data + // user: authenticated user (if auth: true) + // requestData: additional request information + + return { success: true }; + }, + { + auth: true, // Require authentication (default: false) + schema: MySchema, // Zod schema for validation (optional) + // Additional options available + }, +); +``` + +## Route Handlers (API Routes) + +Use `enhanceRouteHandler` from `@packages/next/src/routes/index.ts`: + +```typescript +import { enhanceRouteHandler } from '@kit/next/routes'; +import { NextResponse } from 'next/server'; +import { z } from 'zod'; + +// Define your schema +const CreateItemSchema = z.object({ + name: z.string().min(1), + description: z.string().optional(), +}); + +export const POST = enhanceRouteHandler( + async function ({ body, user, request }) { + // body is validated against schema + // user is available if auth: true + // request is the original NextRequest + + const client = getSupabaseServerClient(); + + const { data, error } = await client + .from('items') + .insert({ + name: body.name, + description: body.description, + user_id: user.id, + }) + .select() + .single(); + + if (error) { + return NextResponse.json( + { error: 'Failed to create item' }, + { status: 500 } + ); + } + + return NextResponse.json({ success: true, data }); + }, + { + auth: true, // Require authentication + schema: CreateItemSchema, // Validate request body + }, +); + +export const GET = enhanceRouteHandler( + async function ({ user, request }) { + const url = new URL(request.url); + const limit = url.searchParams.get('limit') || '10'; + + const client = getSupabaseServerClient(); + + const { data, error } = await client + .from('items') + .select('*') + .eq('user_id', user.id) + .limit(parseInt(limit)); + + if (error) { + return NextResponse.json( + { error: 'Failed to fetch items' }, + { status: 500 } + ); + } + + return NextResponse.json({ data }); + }, + { + auth: true, + // No schema needed for GET requests + }, +); +``` + +### Route Handler Options + +```typescript +export const POST = enhanceRouteHandler( + async function ({ body, user, request }) { + // Handler function + return NextResponse.json({ success: true }); + }, + { + auth: true, // Require authentication (default: false) + schema: MySchema, // Zod schema for body validation (optional) + // Additional options available + }, +); +``` + +## Error Handling Patterns + +### Server Actions with Error Handling + +```typescript +export const createNoteAction = enhanceAction( + async function (data, user) { + const logger = await getLogger(); + const ctx = { name: 'create-note', userId: user.id }; + + try { + logger.info(ctx, 'Creating note'); + + const client = getSupabaseServerClient(); + + const { data: note, error } = await client + .from('notes') + .insert({ + title: data.title, + content: data.content, + user_id: user.id, + }) + .select() + .single(); + + if (error) { + logger.error({ ...ctx, error }, 'Failed to create note'); + throw error; + } + + logger.info({ ...ctx, noteId: note.id }, 'Note created successfully'); + + return { success: true, note }; + } catch (error) { + logger.error({ ...ctx, error }, 'Create note action failed'); + throw error; + } + }, + { + auth: true, + schema: CreateNoteSchema, + }, +); +``` + +### Route Handler with Error Handling + +```typescript +export const POST = enhanceRouteHandler( + async function ({ body, user }) { + const logger = await getLogger(); + const ctx = { name: 'api-create-item', userId: user.id }; + + try { + logger.info(ctx, 'Processing API request'); + + // Process request + const result = await processRequest(body, user); + + logger.info({ ...ctx, result }, 'API request successful'); + + return NextResponse.json({ success: true, data: result }); + } catch (error) { + logger.error({ ...ctx, error }, 'API request failed'); + + if (error.message.includes('validation')) { + return NextResponse.json( + { error: 'Invalid input data' }, + { status: 400 } + ); + } + + return NextResponse.json( + { error: 'Internal server error' }, + { status: 500 } + ); + } + }, + { + auth: true, + schema: CreateItemSchema, + }, +); +``` + +## Client-Side Integration + +### Using Server Actions in Components + +```tsx +'use client'; + +import { useTransition } from 'react'; +import { useForm } from 'react-hook-form'; +import { zodResolver } from '@hookform/resolvers/zod'; +import { toast } from '@kit/ui/sonner'; +import { Button } from '@kit/ui/button'; + +import { createNoteAction } from './actions'; +import { CreateNoteSchema } from './schemas'; + +function CreateNoteForm() { + const [isPending, startTransition] = useTransition(); + + const form = useForm({ + resolver: zodResolver(CreateNoteSchema), + defaultValues: { + title: '', + content: '', + }, + }); + + const onSubmit = (data) => { + startTransition(async () => { + try { + const result = await createNoteAction(data); + + if (result.success) { + toast.success('Note created successfully!'); + form.reset(); + } + } catch (error) { + toast.error('Failed to create note'); + console.error('Create note error:', error); + } + }); + }; + + return ( +
+ {/* Form fields */} + + +
+ ); +} +``` + +### Using Route Handlers with Fetch + +```typescript +'use client'; + +async function createItem(data: CreateItemInput) { + const response = await fetch('/api/items', { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify(data), + }); + + if (!response.ok) { + const error = await response.json(); + throw new Error(error.message || 'Failed to create item'); + } + + return response.json(); +} + +// Usage in component +const handleCreateItem = async (data) => { + try { + const result = await createItem(data); + toast.success('Item created successfully!'); + return result; + } catch (error) { + toast.error('Failed to create item'); + throw error; + } +}; +``` + +## Security Best Practices + +### Input Validation + +Always use Zod schemas for input validation: + +```typescript +// Define strict schemas +const UpdateUserSchema = z.object({ + name: z.string().min(1).max(100), + email: z.string().email(), + age: z.number().int().min(18).max(120), +}); + +// Server action with validation +export const updateUserAction = enhanceAction( + async function (data, user) { + // data is guaranteed to match the schema + // Additional business logic validation can go here + + if (data.email !== user.email) { + // Check if email change is allowed + const canChangeEmail = await checkEmailChangePermission(user); + if (!canChangeEmail) { + throw new Error('Email change not allowed'); + } + } + + // Update user + return await updateUser(user.id, data); + }, + { + auth: true, + schema: UpdateUserSchema, + }, +); +``` + +### Authorization Checks + +```typescript +export const deleteAccountAction = enhanceAction( + async function (data, user) { + const client = getSupabaseServerClient(); + + // Verify user owns the account + const { data: account, error } = await client + .from('accounts') + .select('id, primary_owner_user_id') + .eq('id', data.accountId) + .single(); + + if (error || !account) { + throw new Error('Account not found'); + } + + if (account.primary_owner_user_id !== user.id) { + throw new Error('Only account owners can delete accounts'); + } + + // Additional checks + const hasActiveSubscription = await client + .rpc('has_active_subscription', { account_id: data.accountId }); + + if (hasActiveSubscription) { + throw new Error('Cannot delete account with active subscription'); + } + + // Proceed with deletion + await deleteAccount(data.accountId); + + return { success: true }; + }, + { + auth: true, + schema: DeleteAccountSchema, + }, +); +``` + +## Middleware Integration + +The `enhanceAction` and `enhanceRouteHandler` utilities integrate with the application middleware for: + +- CSRF protection +- Authentication verification +- Request logging +- Error handling +- Input validation + +This ensures consistent security and monitoring across all server actions and API routes. \ No newline at end of file diff --git a/packages/next/CLAUDE.md b/packages/next/CLAUDE.md new file mode 100644 index 000000000..2bdd5e6c2 --- /dev/null +++ b/packages/next/CLAUDE.md @@ -0,0 +1,435 @@ +# Next.js Utilities Instructions + +This file contains instructions for working with Next.js utilities including server actions and route handlers. + +## Server Actions Implementation + +Always use `enhanceAction` from `@packages/next/src/actions/index.ts`: + +```typescript +'use server'; + +import { enhanceAction } from '@kit/next/actions'; +import { z } from 'zod'; + +// Define your schema +const CreateNoteSchema = z.object({ + title: z.string().min(1, 'Title is required'), + content: z.string().min(1, 'Content is required'), + accountId: z.string().uuid('Invalid account ID'), +}); + +export const createNoteAction = enhanceAction( + async function (data, user) { + // data is automatically validated against the schema + // user is automatically authenticated if auth: true + + const client = getSupabaseServerClient(); + + const { data: note, error } = await client + .from('notes') + .insert({ + title: data.title, + content: data.content, + account_id: data.accountId, + user_id: user.id, + }) + .select() + .single(); + + if (error) { + throw error; + } + + return { success: true, note }; + }, + { + auth: true, // Require authentication + schema: CreateNoteSchema, // Validate input with Zod + }, +); +``` + +### Server Action Examples + +- Team billing: `@apps/web/app/home/[account]/billing/_lib/server/server-actions.ts` +- Personal settings: `@apps/web/app/home/(user)/settings/_lib/server/server-actions.ts` + +### Server Action Options + +```typescript +export const myAction = enhanceAction( + async function (data, user, requestData) { + // data: validated input data + // user: authenticated user (if auth: true) + // requestData: additional request information + + return { success: true }; + }, + { + auth: true, // Require authentication (default: false) + schema: MySchema, // Zod schema for validation (optional) + // Additional options available + }, +); +``` + +## Route Handlers (API Routes) + +Use `enhanceRouteHandler` from `@packages/next/src/routes/index.ts`: + +```typescript +import { enhanceRouteHandler } from '@kit/next/routes'; +import { NextResponse } from 'next/server'; +import { z } from 'zod'; + +// Define your schema +const CreateItemSchema = z.object({ + name: z.string().min(1), + description: z.string().optional(), +}); + +export const POST = enhanceRouteHandler( + async function ({ body, user, request }) { + // body is validated against schema + // user is available if auth: true + // request is the original NextRequest + + const client = getSupabaseServerClient(); + + const { data, error } = await client + .from('items') + .insert({ + name: body.name, + description: body.description, + user_id: user.id, + }) + .select() + .single(); + + if (error) { + return NextResponse.json( + { error: 'Failed to create item' }, + { status: 500 } + ); + } + + return NextResponse.json({ success: true, data }); + }, + { + auth: true, // Require authentication + schema: CreateItemSchema, // Validate request body + }, +); + +export const GET = enhanceRouteHandler( + async function ({ user, request }) { + const url = new URL(request.url); + const limit = url.searchParams.get('limit') || '10'; + + const client = getSupabaseServerClient(); + + const { data, error } = await client + .from('items') + .select('*') + .eq('user_id', user.id) + .limit(parseInt(limit)); + + if (error) { + return NextResponse.json( + { error: 'Failed to fetch items' }, + { status: 500 } + ); + } + + return NextResponse.json({ data }); + }, + { + auth: true, + // No schema needed for GET requests + }, +); +``` + +### Route Handler Options + +```typescript +export const POST = enhanceRouteHandler( + async function ({ body, user, request }) { + // Handler function + return NextResponse.json({ success: true }); + }, + { + auth: true, // Require authentication (default: false) + schema: MySchema, // Zod schema for body validation (optional) + // Additional options available + }, +); +``` + +## Error Handling Patterns + +### Server Actions with Error Handling + +```typescript +export const createNoteAction = enhanceAction( + async function (data, user) { + const logger = await getLogger(); + const ctx = { name: 'create-note', userId: user.id }; + + try { + logger.info(ctx, 'Creating note'); + + const client = getSupabaseServerClient(); + + const { data: note, error } = await client + .from('notes') + .insert({ + title: data.title, + content: data.content, + user_id: user.id, + }) + .select() + .single(); + + if (error) { + logger.error({ ...ctx, error }, 'Failed to create note'); + throw error; + } + + logger.info({ ...ctx, noteId: note.id }, 'Note created successfully'); + + return { success: true, note }; + } catch (error) { + logger.error({ ...ctx, error }, 'Create note action failed'); + throw error; + } + }, + { + auth: true, + schema: CreateNoteSchema, + }, +); +``` + +### Route Handler with Error Handling + +```typescript +export const POST = enhanceRouteHandler( + async function ({ body, user }) { + const logger = await getLogger(); + const ctx = { name: 'api-create-item', userId: user.id }; + + try { + logger.info(ctx, 'Processing API request'); + + // Process request + const result = await processRequest(body, user); + + logger.info({ ...ctx, result }, 'API request successful'); + + return NextResponse.json({ success: true, data: result }); + } catch (error) { + logger.error({ ...ctx, error }, 'API request failed'); + + if (error.message.includes('validation')) { + return NextResponse.json( + { error: 'Invalid input data' }, + { status: 400 } + ); + } + + return NextResponse.json( + { error: 'Internal server error' }, + { status: 500 } + ); + } + }, + { + auth: true, + schema: CreateItemSchema, + }, +); +``` + +## Client-Side Integration + +### Using Server Actions in Components + +```tsx +'use client'; + +import { useTransition } from 'react'; +import { useForm } from 'react-hook-form'; +import { zodResolver } from '@hookform/resolvers/zod'; +import { toast } from '@kit/ui/sonner'; +import { Button } from '@kit/ui/button'; + +import { createNoteAction } from './actions'; +import { CreateNoteSchema } from './schemas'; + +function CreateNoteForm() { + const [isPending, startTransition] = useTransition(); + + const form = useForm({ + resolver: zodResolver(CreateNoteSchema), + defaultValues: { + title: '', + content: '', + }, + }); + + const onSubmit = (data) => { + startTransition(async () => { + try { + const result = await createNoteAction(data); + + if (result.success) { + toast.success('Note created successfully!'); + form.reset(); + } + } catch (error) { + toast.error('Failed to create note'); + console.error('Create note error:', error); + } + }); + }; + + return ( +
+ {/* Form fields */} + + +
+ ); +} +``` + +### Using Route Handlers with Fetch + +```typescript +'use client'; + +async function createItem(data: CreateItemInput) { + const response = await fetch('/api/items', { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify(data), + }); + + if (!response.ok) { + const error = await response.json(); + throw new Error(error.message || 'Failed to create item'); + } + + return response.json(); +} + +// Usage in component +const handleCreateItem = async (data) => { + try { + const result = await createItem(data); + toast.success('Item created successfully!'); + return result; + } catch (error) { + toast.error('Failed to create item'); + throw error; + } +}; +``` + +## Security Best Practices + +### Input Validation + +Always use Zod schemas for input validation: + +```typescript +// Define strict schemas +const UpdateUserSchema = z.object({ + name: z.string().min(1).max(100), + email: z.string().email(), + age: z.number().int().min(18).max(120), +}); + +// Server action with validation +export const updateUserAction = enhanceAction( + async function (data, user) { + // data is guaranteed to match the schema + // Additional business logic validation can go here + + if (data.email !== user.email) { + // Check if email change is allowed + const canChangeEmail = await checkEmailChangePermission(user); + if (!canChangeEmail) { + throw new Error('Email change not allowed'); + } + } + + // Update user + return await updateUser(user.id, data); + }, + { + auth: true, + schema: UpdateUserSchema, + }, +); +``` + +### Authorization Checks + +```typescript +export const deleteAccountAction = enhanceAction( + async function (data, user) { + const client = getSupabaseServerClient(); + + // Verify user owns the account + const { data: account, error } = await client + .from('accounts') + .select('id, primary_owner_user_id') + .eq('id', data.accountId) + .single(); + + if (error || !account) { + throw new Error('Account not found'); + } + + if (account.primary_owner_user_id !== user.id) { + throw new Error('Only account owners can delete accounts'); + } + + // Additional checks + const hasActiveSubscription = await client + .rpc('has_active_subscription', { account_id: data.accountId }); + + if (hasActiveSubscription) { + throw new Error('Cannot delete account with active subscription'); + } + + // Proceed with deletion + await deleteAccount(data.accountId); + + return { success: true }; + }, + { + auth: true, + schema: DeleteAccountSchema, + }, +); +``` + +## Middleware Integration + +The `enhanceAction` and `enhanceRouteHandler` utilities integrate with the application middleware for: + +- CSRF protection +- Authentication verification +- Request logging +- Error handling +- Input validation + +This ensures consistent security and monitoring across all server actions and API routes. \ No newline at end of file diff --git a/packages/next/package.json b/packages/next/package.json index 5efe7ab4f..4a3e9bc36 100644 --- a/packages/next/package.json +++ b/packages/next/package.json @@ -20,8 +20,8 @@ "@kit/prettier-config": "workspace:*", "@kit/supabase": "workspace:*", "@kit/tsconfig": "workspace:*", - "@supabase/supabase-js": "2.57.2", - "next": "15.5.2", + "@supabase/supabase-js": "2.57.4", + "next": "15.5.3", "zod": "^3.25.74" }, "typesVersions": { diff --git a/packages/otp/package.json b/packages/otp/package.json index 6b62d07ec..7c85f94c6 100644 --- a/packages/otp/package.json +++ b/packages/otp/package.json @@ -14,7 +14,7 @@ "./components": "./src/components/index.ts" }, "devDependencies": { - "@hookform/resolvers": "^5.2.1", + "@hookform/resolvers": "^5.2.2", "@kit/email-templates": "workspace:*", "@kit/eslint-config": "workspace:*", "@kit/mailers": "workspace:*", @@ -25,8 +25,8 @@ "@kit/tsconfig": "workspace:*", "@kit/ui": "workspace:*", "@radix-ui/react-icons": "^1.3.2", - "@supabase/supabase-js": "2.57.2", - "@types/react": "19.1.12", + "@supabase/supabase-js": "2.57.4", + "@types/react": "19.1.13", "@types/react-dom": "19.1.9", "react": "19.1.1", "react-dom": "19.1.1", diff --git a/packages/shared/package.json b/packages/shared/package.json index 8e132698d..bfa3568e3 100644 --- a/packages/shared/package.json +++ b/packages/shared/package.json @@ -20,10 +20,10 @@ "@kit/eslint-config": "workspace:*", "@kit/prettier-config": "workspace:*", "@kit/tsconfig": "workspace:*", - "@types/react": "19.1.12" + "@types/react": "19.1.13" }, "dependencies": { - "pino": "^9.9.4" + "pino": "^9.9.5" }, "typesVersions": { "*": { diff --git a/packages/supabase/AGENTS.md b/packages/supabase/AGENTS.md new file mode 100644 index 000000000..f3c99aa44 --- /dev/null +++ b/packages/supabase/AGENTS.md @@ -0,0 +1,312 @@ +# Database & Authentication Instructions + +This file contains instructions for working with Supabase, database security, and authentication. + +## Database Security Guidelines ⚠️ + +**Critical Security Guidelines - Read Carefully!** + +### Database Security Fundamentals + +- **Always enable RLS** on new tables unless explicitly instructed otherwise +- **NEVER use SECURITY DEFINER functions** without explicit access controls - they bypass RLS entirely +- **Always use security_invoker=true for views** to maintain proper access control +- **Storage buckets MUST validate access** using account_id in the path structure. See `apps/web/supabase/schemas/16-storage.sql` for proper implementation. +- **Use locks if required**: Database locks prevent race conditions and timing attacks in concurrent operations. Make sure to take these into account for all database operations. + +### Security Definer Function - Dangerous Pattern ❌ + +```sql +-- NEVER DO THIS - Allows any authenticated user to call function +CREATE OR REPLACE FUNCTION public.dangerous_function() +RETURNS void +LANGUAGE plpgsql +SECURITY DEFINER AS $ +BEGIN + -- This bypasses all RLS policies! + DELETE FROM sensitive_table; -- Anyone can call this! +END; +$; +GRANT EXECUTE ON FUNCTION public.dangerous_function() TO authenticated; +``` + +### Security Definer Function - Safe Pattern ✅ + +```sql +-- ONLY use SECURITY DEFINER with explicit access validation +CREATE OR REPLACE FUNCTION public.safe_admin_function(target_account_id uuid) +RETURNS void +LANGUAGE plpgsql +SECURITY DEFINER +SET search_path = '' AS $ +BEGIN + -- MUST validate caller has permission FIRST + IF NOT public.is_account_owner(target_account_id) THEN + RAISE EXCEPTION 'Access denied: insufficient permissions'; + END IF; + + -- Now safe to proceed with elevated privileges + -- Your admin operation here +END; +$; +``` + +Only grant critical functions to `service_role`: + +```sql +grant execute on public.dangerous_function to service_role; +``` + +## Existing Helper Functions - Use These! 📚 + +**DO NOT recreate these functions - they already exist:** + +```sql +-- Account Access Control +public.has_role_on_account(account_id, role?) -- Check team membership +public.has_permission(user_id, account_id, permission) -- Check permissions +public.is_account_owner(account_id) -- Verify ownership +public.has_active_subscription(account_id) -- Subscription status +public.is_team_member(account_id, user_id) -- Direct membership check +public.can_action_account_member(target_account_id, target_user_id) -- Member action rights + +-- Administrative Functions +public.is_super_admin() -- Super admin check +public.is_aal2() -- MFA verification +public.is_mfa_compliant() -- MFA compliance + +-- Configuration +public.is_set(field_name) -- Feature flag checks +``` + +Always check `apps/web/supabase/schemas/` before creating new functions! + +## RLS Policy Best Practices ✅ + +```sql +-- Proper RLS using existing helper functions +CREATE POLICY "notes_read" ON public.notes FOR SELECT + TO authenticated USING ( + account_id = (select auth.uid()) OR + public.has_role_on_account(account_id) + ); + +-- For operations requiring specific permissions +CREATE POLICY "notes_manage" ON public.notes FOR ALL + TO authenticated USING ( + public.has_permission(auth.uid(), account_id, 'notes.manage'::app_permissions) + ); +``` + +## Schema Management Workflow + +1. Create schemas in `apps/web/supabase/schemas/` as `-.sql` +2. After changes: `pnpm supabase:web:stop` +3. Run: `pnpm --filter web run supabase:db:diff -f ` +4. Restart: `pnpm supabase:web:start` and `pnpm supabase:web:reset` +5. Generate types: `pnpm supabase:web:typegen` + +- **Never modify database.types.ts**: Instead, use the Supabase CLI using our package.json scripts to re-generate the types after resetting the DB + +### Key Schema Files + +- Accounts: `apps/web/supabase/schemas/03-accounts.sql` +- Memberships: `apps/web/supabase/schemas/05-memberships.sql` +- Permissions: `apps/web/supabase/schemas/06-roles-permissions.sql` + +## Type Generation + +```typescript +import { Tables } from '@kit/supabase/database'; + +type Account = Tables<'accounts'>; +``` + +Always prefer inferring types from generated Database types. + +## Client Usage Patterns + +### Server Components (Preferred) + +```typescript +import { getSupabaseServerClient } from '@kit/supabase/server-client'; + +async function NotesPage() { + const client = getSupabaseServerClient(); + const { data, error } = await client.from('notes').select('*'); + + if (error) return ; + + return ; +} +``` + +### Client Components + +```typescript +'use client'; +import { useSupabase } from '@kit/supabase/hooks/use-supabase'; + +function InteractiveNotes() { + const supabase = useSupabase(); + // Use with React Query for optimal data fetching +} +``` + +### Admin Client (Use with Extreme Caution) ⚠️ + +```typescript +import { getSupabaseServerAdminClient } from '@kit/supabase/server-admin-client'; + +async function adminFunction() { + const adminClient = getSupabaseServerAdminClient(); + + // CRITICAL: Manual authorization required - bypasses RLS! + const currentUser = await getCurrentUser(); + + if (!(await isSuperAdmin(currentUser))) { + throw new Error('Unauthorized: Admin access required'); + } + + // Now safe to proceed with admin privileges + const { data } = await adminClient.from('table').select('*'); +} +``` + +## Authentication Patterns + +### Multi-Factor Authentication + +```typescript +import { checkRequiresMultiFactorAuthentication } from '@kit/supabase/check-requires-mfa'; + +const requiresMultiFactorAuthentication = + await checkRequiresMultiFactorAuthentication(supabase); + +if (requiresMultiFactorAuthentication) { + // Redirect to MFA page +} +``` + +### User Requirements + +```typescript +import { requireUser } from '@kit/supabase/require-user'; + +const client = getSupabaseServerClient(); +const user = await requireUser(client, { verifyMfa: false }); +``` + +## Storage Security + +Storage buckets must validate access using account_id in the path structure: + +```sql +-- RLS policies for storage bucket account_image +create policy account_image on storage.objects for all using ( + bucket_id = 'account_image' + and ( + kit.get_storage_filename_as_uuid(name) = auth.uid() + or public.has_role_on_account(kit.get_storage_filename_as_uuid(name)) + ) +) +with check ( + bucket_id = 'account_image' + and ( + kit.get_storage_filename_as_uuid(name) = auth.uid() + or public.has_permission( + auth.uid(), + kit.get_storage_filename_as_uuid(name), + 'settings.manage' + ) + ) +); +``` + +## Common Database Operations + +### Creating Tables with RLS + +```sql +-- Create table +create table if not exists public.notes ( + id uuid unique not null default extensions.uuid_generate_v4(), + account_id uuid references public.accounts(id) on delete cascade not null, + title varchar(255) not null, + content text, + created_at timestamp with time zone default now(), + updated_at timestamp with time zone default now(), + primary key (id) +); + +-- Enable RLS +alter table "public"."notes" enable row level security; + +-- Grant permissions +grant select, insert, update, delete on table public.notes to authenticated; + +-- Create RLS policies +create policy "notes_read" on public.notes for select + to authenticated using ( + account_id = (select auth.uid()) or + public.has_role_on_account(account_id) + ); + +create policy "notes_write" on public.notes for insert + to authenticated with check ( + account_id = (select auth.uid()) or + public.has_permission(auth.uid(), account_id, 'notes.manage'::app_permissions) + ); +``` + +### Indexes for Performance + +```sql +-- Create indexes for common queries +create index if not exists ix_notes_account_id on public.notes (account_id); +create index if not exists ix_notes_created_at on public.notes (created_at); +``` + +## Error Handling + +```typescript +import { getLogger } from '@kit/shared/logger'; + +async function databaseOperation() { + const logger = await getLogger(); + const ctx = { name: 'database-operation', accountId: 'account-123' }; + + try { + logger.info(ctx, 'Starting database operation'); + const result = await client.from('table').select('*'); + + if (result.error) { + logger.error({ ...ctx, error: result.error }, 'Database query failed'); + throw result.error; + } + + return result.data; + } catch (error) { + logger.error({ ...ctx, error }, 'Database operation failed'); + throw error; + } +} +``` + +## Migration Best Practices + +1. Always test migrations locally first +2. Use transactions for complex migrations +3. Add proper indexes for new columns +4. Update RLS policies when adding new tables +5. Generate TypeScript types after schema changes +6. Take into account constraints +7. Do not add breaking changes that would distrupt the DB to new migrations + +## Common Gotchas + +1. **RLS bypass**: Admin client bypasses all RLS - validate manually +2. **Missing indexes**: Always add indexes for foreign keys and commonly queried columns +3. **Security definer functions**: Only use with explicit permission checks +4. **Storage paths**: Must include account_id for proper access control +5. **Type safety**: Always regenerate types after schema changes \ No newline at end of file diff --git a/packages/supabase/CLAUDE.md b/packages/supabase/CLAUDE.md new file mode 100644 index 000000000..f3c99aa44 --- /dev/null +++ b/packages/supabase/CLAUDE.md @@ -0,0 +1,312 @@ +# Database & Authentication Instructions + +This file contains instructions for working with Supabase, database security, and authentication. + +## Database Security Guidelines ⚠️ + +**Critical Security Guidelines - Read Carefully!** + +### Database Security Fundamentals + +- **Always enable RLS** on new tables unless explicitly instructed otherwise +- **NEVER use SECURITY DEFINER functions** without explicit access controls - they bypass RLS entirely +- **Always use security_invoker=true for views** to maintain proper access control +- **Storage buckets MUST validate access** using account_id in the path structure. See `apps/web/supabase/schemas/16-storage.sql` for proper implementation. +- **Use locks if required**: Database locks prevent race conditions and timing attacks in concurrent operations. Make sure to take these into account for all database operations. + +### Security Definer Function - Dangerous Pattern ❌ + +```sql +-- NEVER DO THIS - Allows any authenticated user to call function +CREATE OR REPLACE FUNCTION public.dangerous_function() +RETURNS void +LANGUAGE plpgsql +SECURITY DEFINER AS $ +BEGIN + -- This bypasses all RLS policies! + DELETE FROM sensitive_table; -- Anyone can call this! +END; +$; +GRANT EXECUTE ON FUNCTION public.dangerous_function() TO authenticated; +``` + +### Security Definer Function - Safe Pattern ✅ + +```sql +-- ONLY use SECURITY DEFINER with explicit access validation +CREATE OR REPLACE FUNCTION public.safe_admin_function(target_account_id uuid) +RETURNS void +LANGUAGE plpgsql +SECURITY DEFINER +SET search_path = '' AS $ +BEGIN + -- MUST validate caller has permission FIRST + IF NOT public.is_account_owner(target_account_id) THEN + RAISE EXCEPTION 'Access denied: insufficient permissions'; + END IF; + + -- Now safe to proceed with elevated privileges + -- Your admin operation here +END; +$; +``` + +Only grant critical functions to `service_role`: + +```sql +grant execute on public.dangerous_function to service_role; +``` + +## Existing Helper Functions - Use These! 📚 + +**DO NOT recreate these functions - they already exist:** + +```sql +-- Account Access Control +public.has_role_on_account(account_id, role?) -- Check team membership +public.has_permission(user_id, account_id, permission) -- Check permissions +public.is_account_owner(account_id) -- Verify ownership +public.has_active_subscription(account_id) -- Subscription status +public.is_team_member(account_id, user_id) -- Direct membership check +public.can_action_account_member(target_account_id, target_user_id) -- Member action rights + +-- Administrative Functions +public.is_super_admin() -- Super admin check +public.is_aal2() -- MFA verification +public.is_mfa_compliant() -- MFA compliance + +-- Configuration +public.is_set(field_name) -- Feature flag checks +``` + +Always check `apps/web/supabase/schemas/` before creating new functions! + +## RLS Policy Best Practices ✅ + +```sql +-- Proper RLS using existing helper functions +CREATE POLICY "notes_read" ON public.notes FOR SELECT + TO authenticated USING ( + account_id = (select auth.uid()) OR + public.has_role_on_account(account_id) + ); + +-- For operations requiring specific permissions +CREATE POLICY "notes_manage" ON public.notes FOR ALL + TO authenticated USING ( + public.has_permission(auth.uid(), account_id, 'notes.manage'::app_permissions) + ); +``` + +## Schema Management Workflow + +1. Create schemas in `apps/web/supabase/schemas/` as `-.sql` +2. After changes: `pnpm supabase:web:stop` +3. Run: `pnpm --filter web run supabase:db:diff -f ` +4. Restart: `pnpm supabase:web:start` and `pnpm supabase:web:reset` +5. Generate types: `pnpm supabase:web:typegen` + +- **Never modify database.types.ts**: Instead, use the Supabase CLI using our package.json scripts to re-generate the types after resetting the DB + +### Key Schema Files + +- Accounts: `apps/web/supabase/schemas/03-accounts.sql` +- Memberships: `apps/web/supabase/schemas/05-memberships.sql` +- Permissions: `apps/web/supabase/schemas/06-roles-permissions.sql` + +## Type Generation + +```typescript +import { Tables } from '@kit/supabase/database'; + +type Account = Tables<'accounts'>; +``` + +Always prefer inferring types from generated Database types. + +## Client Usage Patterns + +### Server Components (Preferred) + +```typescript +import { getSupabaseServerClient } from '@kit/supabase/server-client'; + +async function NotesPage() { + const client = getSupabaseServerClient(); + const { data, error } = await client.from('notes').select('*'); + + if (error) return ; + + return ; +} +``` + +### Client Components + +```typescript +'use client'; +import { useSupabase } from '@kit/supabase/hooks/use-supabase'; + +function InteractiveNotes() { + const supabase = useSupabase(); + // Use with React Query for optimal data fetching +} +``` + +### Admin Client (Use with Extreme Caution) ⚠️ + +```typescript +import { getSupabaseServerAdminClient } from '@kit/supabase/server-admin-client'; + +async function adminFunction() { + const adminClient = getSupabaseServerAdminClient(); + + // CRITICAL: Manual authorization required - bypasses RLS! + const currentUser = await getCurrentUser(); + + if (!(await isSuperAdmin(currentUser))) { + throw new Error('Unauthorized: Admin access required'); + } + + // Now safe to proceed with admin privileges + const { data } = await adminClient.from('table').select('*'); +} +``` + +## Authentication Patterns + +### Multi-Factor Authentication + +```typescript +import { checkRequiresMultiFactorAuthentication } from '@kit/supabase/check-requires-mfa'; + +const requiresMultiFactorAuthentication = + await checkRequiresMultiFactorAuthentication(supabase); + +if (requiresMultiFactorAuthentication) { + // Redirect to MFA page +} +``` + +### User Requirements + +```typescript +import { requireUser } from '@kit/supabase/require-user'; + +const client = getSupabaseServerClient(); +const user = await requireUser(client, { verifyMfa: false }); +``` + +## Storage Security + +Storage buckets must validate access using account_id in the path structure: + +```sql +-- RLS policies for storage bucket account_image +create policy account_image on storage.objects for all using ( + bucket_id = 'account_image' + and ( + kit.get_storage_filename_as_uuid(name) = auth.uid() + or public.has_role_on_account(kit.get_storage_filename_as_uuid(name)) + ) +) +with check ( + bucket_id = 'account_image' + and ( + kit.get_storage_filename_as_uuid(name) = auth.uid() + or public.has_permission( + auth.uid(), + kit.get_storage_filename_as_uuid(name), + 'settings.manage' + ) + ) +); +``` + +## Common Database Operations + +### Creating Tables with RLS + +```sql +-- Create table +create table if not exists public.notes ( + id uuid unique not null default extensions.uuid_generate_v4(), + account_id uuid references public.accounts(id) on delete cascade not null, + title varchar(255) not null, + content text, + created_at timestamp with time zone default now(), + updated_at timestamp with time zone default now(), + primary key (id) +); + +-- Enable RLS +alter table "public"."notes" enable row level security; + +-- Grant permissions +grant select, insert, update, delete on table public.notes to authenticated; + +-- Create RLS policies +create policy "notes_read" on public.notes for select + to authenticated using ( + account_id = (select auth.uid()) or + public.has_role_on_account(account_id) + ); + +create policy "notes_write" on public.notes for insert + to authenticated with check ( + account_id = (select auth.uid()) or + public.has_permission(auth.uid(), account_id, 'notes.manage'::app_permissions) + ); +``` + +### Indexes for Performance + +```sql +-- Create indexes for common queries +create index if not exists ix_notes_account_id on public.notes (account_id); +create index if not exists ix_notes_created_at on public.notes (created_at); +``` + +## Error Handling + +```typescript +import { getLogger } from '@kit/shared/logger'; + +async function databaseOperation() { + const logger = await getLogger(); + const ctx = { name: 'database-operation', accountId: 'account-123' }; + + try { + logger.info(ctx, 'Starting database operation'); + const result = await client.from('table').select('*'); + + if (result.error) { + logger.error({ ...ctx, error: result.error }, 'Database query failed'); + throw result.error; + } + + return result.data; + } catch (error) { + logger.error({ ...ctx, error }, 'Database operation failed'); + throw error; + } +} +``` + +## Migration Best Practices + +1. Always test migrations locally first +2. Use transactions for complex migrations +3. Add proper indexes for new columns +4. Update RLS policies when adding new tables +5. Generate TypeScript types after schema changes +6. Take into account constraints +7. Do not add breaking changes that would distrupt the DB to new migrations + +## Common Gotchas + +1. **RLS bypass**: Admin client bypasses all RLS - validate manually +2. **Missing indexes**: Always add indexes for foreign keys and commonly queried columns +3. **Security definer functions**: Only use with explicit permission checks +4. **Storage paths**: Must include account_id for proper access control +5. **Type safety**: Always regenerate types after schema changes \ No newline at end of file diff --git a/packages/supabase/package.json b/packages/supabase/package.json index cfa8e6677..77852123c 100644 --- a/packages/supabase/package.json +++ b/packages/supabase/package.json @@ -26,10 +26,10 @@ "@kit/prettier-config": "workspace:*", "@kit/tsconfig": "workspace:*", "@supabase/ssr": "^0.7.0", - "@supabase/supabase-js": "2.57.2", - "@tanstack/react-query": "5.87.1", - "@types/react": "19.1.12", - "next": "15.5.2", + "@supabase/supabase-js": "2.57.4", + "@tanstack/react-query": "5.89.0", + "@types/react": "19.1.13", + "next": "15.5.3", "react": "19.1.1", "server-only": "^0.0.1", "zod": "^3.25.74" diff --git a/packages/ui/AGENTS.md b/packages/ui/AGENTS.md new file mode 100644 index 000000000..655183c79 --- /dev/null +++ b/packages/ui/AGENTS.md @@ -0,0 +1,304 @@ +# UI Components & Styling Instructions + +This file contains instructions for working with UI components, styling, and forms. + +## Core UI Library + +Import from `packages/ui/src/`: + +```tsx +// Shadcn components +import { Button } from '@kit/ui/button'; +import { Card } from '@kit/ui/card'; + +// Makerkit components +import { If } from '@kit/ui/if'; +import { ProfileAvatar } from '@kit/ui/profile-avatar'; +import { toast } from '@kit/ui/sonner'; +import { Trans } from '@kit/ui/trans'; +``` + +NB: imports must follow the convention "@kit/ui/", no matter the folder they're placed in + +## Styling Guidelines + +- Use **Tailwind CSS v4** with semantic classes +- Prefer Shadcn-ui classes like `bg-background`, `text-muted-foreground` +- Use `cn()` utility from `@kit/ui/cn` for class merging + +```tsx +import { cn } from '@kit/ui/cn'; + +function MyComponent({ className }) { + return ( +
+ Content +
+ ); +} +``` + +### Conditional Rendering + +Use the `If` component from `packages/ui/src/makerkit/if.tsx`: + +```tsx +import { If } from '@kit/ui/if'; + +}> + + + +// With type inference + + {(err) => } + +``` + +### Testing Attributes + +```tsx + +
Profile
+``` + +## Forms with React Hook Form & Zod + +```typescript +// 1. Schema in separate file +export const CreateNoteSchema = z.object({ + title: z.string().min(1), + content: z.string().min(1), +}); + +// 2. Client component with form +'use client'; +const form = useForm({ + resolver: zodResolver(CreateNoteSchema), +}); + +const onSubmit = (data) => { + startTransition(async () => { + await toast.promise(createNoteAction(data), { + loading: 'Creating...', + success: 'Created!', + error: 'Failed!', + }).unwrap(); + }); +}; +``` + +### Form Examples + +- Contact form: `apps/web/app/(marketing)/contact/_components/contact-form.tsx` +- Verify OTP form: `packages/otp/src/components/verify-otp-form.tsx` + +### Guidelines + +- Place Zod resolver outside so it can be reused with Server Actions +- Never add generics to `useForm`, use Zod resolver to infer types instead +- Never use `watch()` instead use hook `useWatch` +- Add `FormDescription` (optionally) and always add `FormMessage` to display errors + +## Internationalization + +Always use `Trans` component from `packages/ui/src/makerkit/trans.tsx`: + +```tsx +import { Trans } from '@kit/ui/trans'; + + + +// With HTML elements +, + }} +/> +``` + +## Toast Notifications + +Use the `toast` utility from `@kit/ui/sonner`: + +```tsx +import { toast } from '@kit/ui/sonner'; + +// Simple toast +toast.success('Success message'); +toast.error('Error message'); + +// Promise-based toast +await toast.promise(asyncFunction(), { + loading: 'Processing...', + success: 'Done!', + error: 'Failed!', +}); +``` + +## Common Component Patterns + +### Loading States + +```tsx +import { Spinner } from '@kit/ui/spinner'; + +}> + + +``` + +### Error Handling + +```tsx +import { Alert, AlertDescription, AlertTitle } from '@kit/ui/alert'; +import { ExclamationTriangleIcon } from '@radix-ui/react-icons'; + + + + + Error + {error} + + +``` + +### Button Patterns + +```tsx +import { Button } from '@kit/ui/button'; + +// Loading button + + +// Variants + + + + +``` + +### Card Layouts + +```tsx +import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@kit/ui/card'; + + + + Card Title + Card description + + + Card content goes here + + +``` + +## Form Components + +### Input Fields + +```tsx +import { Input } from '@kit/ui/input'; +import { Label } from '@kit/ui/label'; +import { FormField, FormItem, FormLabel, FormControl, FormMessage } from '@kit/ui/form'; + + ( + + Title + + + + + + + The title of your task + + + + + )} +/> +``` + +### Select Components + +```tsx +import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@kit/ui/select'; + + ( + + Category + + + + The category of your task + + + + + )} +/> +``` + +## Accessibility Guidelines + +- Always include proper ARIA labels +- Use semantic HTML elements +- Ensure proper keyboard navigation + +```tsx + +``` + +## Dark Mode Support + +The UI components automatically support dark mode through CSS variables. Use semantic color classes: + +```tsx +// Good - semantic colors +
+

Secondary text

+
+ +// Avoid - hardcoded colors +
+

Secondary text

+
+``` \ No newline at end of file diff --git a/packages/ui/CLAUDE.md b/packages/ui/CLAUDE.md new file mode 100644 index 000000000..958bb35ee --- /dev/null +++ b/packages/ui/CLAUDE.md @@ -0,0 +1,289 @@ +# UI Components & Styling Instructions + +This file contains instructions for working with UI components, styling, and forms. + +## Core UI Library + +Import from `packages/ui/src/`: + +```tsx +// Shadcn components +import { Button } from '@kit/ui/button'; +import { Card } from '@kit/ui/card'; +// Makerkit components +import { If } from '@kit/ui/if'; +import { ProfileAvatar } from '@kit/ui/profile-avatar'; +import { toast } from '@kit/ui/sonner'; +import { Trans } from '@kit/ui/trans'; +``` + +## Styling Guidelines + +- Use **Tailwind CSS v4** with semantic classes +- Prefer Shadcn-ui classes like `bg-background`, `text-muted-foreground` +- Use `cn()` utility from `@kit/ui/cn` for class merging + +```tsx +import { cn } from '@kit/ui/cn'; + +function MyComponent({ className }) { + return ( +
+ Content +
+ ); +} +``` + +### Conditional Rendering + +Use the `If` component from `packages/ui/src/makerkit/if.tsx`: + +```tsx +import { If } from '@kit/ui/if'; + +}> + + + +// With type inference + + {(err) => } + +``` + +### Testing Attributes + +```tsx + +
Profile
+``` + +## Forms with React Hook Form & Zod + +```typescript +// 1. Schema in separate file +export const CreateNoteSchema = z.object({ + title: z.string().min(1), + content: z.string().min(1), +}); + +// 2. Client component with form +'use client'; +const form = useForm({ + resolver: zodResolver(CreateNoteSchema), +}); + +const onSubmit = (data) => { + startTransition(async () => { + await toast.promise(createNoteAction(data), { + loading: 'Creating...', + success: 'Created!', + error: 'Failed!', + }).unwrap(); + }); +}; +``` + +### Guidelines + +- Place Zod resolver outside so it can be reused with Server Actions +- Never add generics to `useForm`, use Zod resolver to infer types instead +- Never use `watch()` instead use hook `useWatch` +- Add `FormDescription` (optionally) and always add `FormMessage` to display errors + +### Form Examples + +- Contact form: `apps/web/app/(marketing)/contact/_components/contact-form.tsx` +- Verify OTP form: `packages/otp/src/components/verify-otp-form.tsx` + +## Internationalization + +Always use `Trans` component from `packages/ui/src/makerkit/trans.tsx`: + +```tsx +import { Trans } from '@kit/ui/trans'; + + + +// With HTML elements +, + }} +/> +``` + +## Toast Notifications + +Use the `toast` utility from `@kit/ui/sonner`: + +```tsx +import { toast } from '@kit/ui/sonner'; + +// Simple toast +toast.success('Success message'); +toast.error('Error message'); + +// Promise-based toast +await toast.promise(asyncFunction(), { + loading: 'Processing...', + success: 'Done!', + error: 'Failed!', +}); +``` + +## Common Component Patterns + +### Loading States + +```tsx +import { Spinner } from '@kit/ui/spinner'; + +}> + + +``` + +### Error Handling + +```tsx +import { Alert, AlertDescription, AlertTitle } from '@kit/ui/alert'; +import { ExclamationTriangleIcon } from '@radix-ui/react-icons'; + + + + + Error + {error} + + +``` + +### Button Patterns + +```tsx +import { Button } from '@kit/ui/button'; + +// Loading button + + +// Variants + + + + +``` + +### Card Layouts + +```tsx +import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@kit/ui/card'; + + + + Card Title + Card description + + + Card content goes here + + +``` + +## Form Components + +### Input Fields + +```tsx +import { Input } from '@kit/ui/input'; +import { Label } from '@kit/ui/label'; +import { FormField, FormItem, FormLabel, FormControl, FormMessage } from '@kit/ui/form'; + + ( + + Title + + + + + + )} +/> +``` + +### Select Components + +```tsx +import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@kit/ui/select'; + + ( + + Category + + + + )} +/> +``` + +## Accessibility Guidelines + +- Always include proper ARIA labels +- Use semantic HTML elements +- Ensure proper keyboard navigation + +```tsx + +``` + +## Dark Mode Support + +The UI components automatically support dark mode through CSS variables. Use semantic color classes: + +```tsx +// Good - semantic colors +
+

Secondary text

+
+ +// Avoid - hardcoded colors +
+

Secondary text

+
+``` \ No newline at end of file diff --git a/packages/ui/package.json b/packages/ui/package.json index 570e681a4..1330fe173 100644 --- a/packages/ui/package.json +++ b/packages/ui/package.json @@ -9,12 +9,12 @@ "typecheck": "tsc --noEmit" }, "dependencies": { - "@hookform/resolvers": "^5.2.1", + "@hookform/resolvers": "^5.2.2", "@radix-ui/react-icons": "^1.3.2", "clsx": "^2.1.1", "cmdk": "1.1.1", "input-otp": "1.4.2", - "lucide-react": "^0.542.0", + "lucide-react": "^0.544.0", "radix-ui": "1.4.3", "react-dropzone": "^14.3.8", "react-top-loading-bar": "3.0.2", @@ -25,18 +25,18 @@ "@kit/eslint-config": "workspace:*", "@kit/prettier-config": "workspace:*", "@kit/tsconfig": "workspace:*", - "@supabase/supabase-js": "2.57.2", - "@tanstack/react-query": "5.87.1", + "@supabase/supabase-js": "2.57.4", + "@tanstack/react-query": "5.89.0", "@tanstack/react-table": "^8.21.3", - "@types/react": "19.1.12", + "@types/react": "19.1.13", "@types/react-dom": "19.1.9", "class-variance-authority": "^0.7.1", "date-fns": "^4.1.0", "eslint": "^9.35.0", - "next": "15.5.2", + "next": "15.5.3", "next-themes": "0.4.6", "prettier": "^3.6.2", - "react-day-picker": "^9.9.0", + "react-day-picker": "^9.10.0", "react-hook-form": "^7.62.0", "react-i18next": "^15.7.3", "sonner": "^2.0.7", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index f079a3891..6c71fa8a8 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -17,7 +17,7 @@ importers: version: 0.25.1 '@turbo/gen': specifier: ^2.5.6 - version: 2.5.6(@types/node@24.3.1)(typescript@5.9.2) + version: 2.5.6(@types/node@24.5.0)(typescript@5.9.2) cross-env: specifier: ^10.0.0 version: 10.0.0 @@ -34,26 +34,26 @@ importers: apps/dev-tool: dependencies: '@ai-sdk/openai': - specifier: ^2.0.24 - version: 2.0.24(zod@3.25.76) + specifier: ^2.0.30 + version: 2.0.30(zod@3.25.76) '@faker-js/faker': specifier: ^10.0.0 version: 10.0.0 '@hookform/resolvers': - specifier: ^5.2.1 - version: 5.2.1(react-hook-form@7.62.0(react@19.1.1)) + specifier: ^5.2.2 + version: 5.2.2(react-hook-form@7.62.0(react@19.1.1)) '@tanstack/react-query': - specifier: 5.87.1 - version: 5.87.1(react@19.1.1) + specifier: 5.89.0 + version: 5.89.0(react@19.1.1) ai: - specifier: 5.0.33 - version: 5.0.33(zod@3.25.76) + specifier: 5.0.44 + version: 5.0.44(zod@3.25.76) lucide-react: - specifier: ^0.542.0 - version: 0.542.0(react@19.1.1) + specifier: ^0.544.0 + version: 0.544.0(react@19.1.1) next: - specifier: 15.5.2 - version: 15.5.2(@opentelemetry/api@1.9.0)(@playwright/test@1.55.0)(babel-plugin-react-compiler@19.1.0-rc.3)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + specifier: 15.5.3 + version: 15.5.3(@opentelemetry/api@1.9.0)(@playwright/test@1.55.0)(babel-plugin-react-compiler@19.1.0-rc.3)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) nodemailer: specifier: ^7.0.6 version: 7.0.6 @@ -89,17 +89,17 @@ importers: specifier: ^4.1.13 version: 4.1.13 '@types/node': - specifier: ^24.3.1 - version: 24.3.1 + specifier: ^24.5.0 + version: 24.5.0 '@types/nodemailer': specifier: 7.0.1 version: 7.0.1 '@types/react': - specifier: 19.1.12 - version: 19.1.12 + specifier: 19.1.13 + version: 19.1.13 '@types/react-dom': specifier: 19.1.9 - version: 19.1.9(@types/react@19.1.12) + version: 19.1.9(@types/react@19.1.13) babel-plugin-react-compiler: specifier: 19.1.0-rc.3 version: 19.1.0-rc.3 @@ -131,8 +131,8 @@ importers: specifier: ^1.55.0 version: 1.55.0 '@types/node': - specifier: ^24.3.1 - version: 24.3.1 + specifier: ^24.5.0 + version: 24.5.0 dotenv: specifier: 17.2.2 version: 17.2.2 @@ -140,17 +140,17 @@ importers: specifier: ^7.0.1 version: 7.0.1 totp-generator: - specifier: ^1.0.0 - version: 1.0.0 + specifier: ^2.0.0 + version: 2.0.0 apps/web: dependencies: '@edge-csrf/nextjs': specifier: 2.5.3-cloudflare-rc1 - version: 2.5.3-cloudflare-rc1(next@15.5.2(@opentelemetry/api@1.9.0)(@playwright/test@1.55.0)(babel-plugin-react-compiler@19.1.0-rc.3)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)) + version: 2.5.3-cloudflare-rc1(next@15.5.3(@opentelemetry/api@1.9.0)(@playwright/test@1.55.0)(babel-plugin-react-compiler@19.1.0-rc.3)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)) '@hookform/resolvers': - specifier: ^5.2.1 - version: 5.2.1(react-hook-form@7.62.0(react@19.1.1)) + specifier: ^5.2.2 + version: 5.2.2(react-hook-form@7.62.0(react@19.1.1)) '@kit/accounts': specifier: workspace:* version: link:../../packages/features/accounts @@ -207,25 +207,25 @@ importers: version: link:../../packages/ui '@makerkit/data-loader-supabase-core': specifier: ^0.0.10 - version: 0.0.10(@supabase/postgrest-js@1.21.3)(@supabase/supabase-js@2.57.2) + version: 0.0.10(@supabase/postgrest-js@1.21.4)(@supabase/supabase-js@2.57.4) '@makerkit/data-loader-supabase-nextjs': specifier: ^1.2.5 - version: 1.2.5(@supabase/postgrest-js@1.21.3)(@supabase/supabase-js@2.57.2)(@tanstack/react-query@5.87.1(react@19.1.1))(next@15.5.2(@opentelemetry/api@1.9.0)(@playwright/test@1.55.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(react@19.1.1) + version: 1.2.5(@supabase/postgrest-js@1.21.4)(@supabase/supabase-js@2.57.4)(@tanstack/react-query@5.89.0(react@19.1.1))(next@15.5.3(@opentelemetry/api@1.9.0)(@playwright/test@1.55.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(react@19.1.1) '@marsidev/react-turnstile': - specifier: ^1.3.0 - version: 1.3.0(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + specifier: ^1.3.1 + version: 1.3.1(react-dom@19.1.1(react@19.1.1))(react@19.1.1) '@nosecone/next': specifier: 1.0.0-beta.11 - version: 1.0.0-beta.11(next@15.5.2(@opentelemetry/api@1.9.0)(@playwright/test@1.55.0)(babel-plugin-react-compiler@19.1.0-rc.3)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)) + version: 1.0.0-beta.11(next@15.5.3(@opentelemetry/api@1.9.0)(@playwright/test@1.55.0)(babel-plugin-react-compiler@19.1.0-rc.3)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)) '@radix-ui/react-icons': specifier: ^1.3.2 version: 1.3.2(react@19.1.1) '@supabase/supabase-js': - specifier: 2.57.2 - version: 2.57.2 + specifier: 2.57.4 + version: 2.57.4 '@tanstack/react-query': - specifier: 5.87.1 - version: 5.87.1(react@19.1.1) + specifier: 5.89.0 + version: 5.89.0(react@19.1.1) '@tanstack/react-table': specifier: ^8.21.3 version: 8.21.3(react-dom@19.1.1(react@19.1.1))(react@19.1.1) @@ -233,14 +233,14 @@ importers: specifier: ^4.1.0 version: 4.1.0 lucide-react: - specifier: ^0.542.0 - version: 0.542.0(react@19.1.1) + specifier: ^0.544.0 + version: 0.544.0(react@19.1.1) next: - specifier: 15.5.2 - version: 15.5.2(@opentelemetry/api@1.9.0)(@playwright/test@1.55.0)(babel-plugin-react-compiler@19.1.0-rc.3)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + specifier: 15.5.3 + version: 15.5.3(@opentelemetry/api@1.9.0)(@playwright/test@1.55.0)(babel-plugin-react-compiler@19.1.0-rc.3)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) next-sitemap: specifier: ^4.2.3 - version: 4.2.3(next@15.5.2(@opentelemetry/api@1.9.0)(@playwright/test@1.55.0)(babel-plugin-react-compiler@19.1.0-rc.3)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)) + version: 4.2.3(next@15.5.3(@opentelemetry/api@1.9.0)(@playwright/test@1.55.0)(babel-plugin-react-compiler@19.1.0-rc.3)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)) next-themes: specifier: 0.4.6 version: 0.4.6(react-dom@19.1.1(react@19.1.1))(react@19.1.1) @@ -276,20 +276,20 @@ importers: specifier: workspace:* version: link:../../tooling/typescript '@next/bundle-analyzer': - specifier: 15.5.2 - version: 15.5.2 + specifier: 15.5.3 + version: 15.5.3 '@tailwindcss/postcss': specifier: ^4.1.13 version: 4.1.13 '@types/node': - specifier: ^24.3.1 - version: 24.3.1 + specifier: ^24.5.0 + version: 24.5.0 '@types/react': - specifier: 19.1.12 - version: 19.1.12 + specifier: 19.1.13 + version: 19.1.13 '@types/react-dom': specifier: 19.1.9 - version: 19.1.9(@types/react@19.1.12) + version: 19.1.9(@types/react@19.1.13) babel-plugin-react-compiler: specifier: 19.1.0-rc.3 version: 19.1.0-rc.3 @@ -303,8 +303,8 @@ importers: specifier: ^3.6.2 version: 3.6.2 supabase: - specifier: 2.39.2 - version: 2.39.2 + specifier: 2.40.7 + version: 2.40.7 tailwindcss: specifier: 4.1.13 version: 4.1.13 @@ -327,8 +327,8 @@ importers: specifier: workspace:* version: link:../../tooling/typescript '@types/node': - specifier: ^24.3.1 - version: 24.3.1 + specifier: ^24.5.0 + version: 24.5.0 packages/billing/core: devDependencies: @@ -354,8 +354,8 @@ importers: packages/billing/gateway: devDependencies: '@hookform/resolvers': - specifier: ^5.2.1 - version: 5.2.1(react-hook-form@7.62.0(react@19.1.1)) + specifier: ^5.2.2 + version: 5.2.2(react-hook-form@7.62.0(react@19.1.1)) '@kit/billing': specifier: workspace:* version: link:../core @@ -384,20 +384,20 @@ importers: specifier: workspace:* version: link:../../ui '@supabase/supabase-js': - specifier: 2.57.2 - version: 2.57.2 + specifier: 2.57.4 + version: 2.57.4 '@types/react': - specifier: 19.1.12 - version: 19.1.12 + specifier: 19.1.13 + version: 19.1.13 date-fns: specifier: ^4.1.0 version: 4.1.0 lucide-react: - specifier: ^0.542.0 - version: 0.542.0(react@19.1.1) + specifier: ^0.544.0 + version: 0.544.0(react@19.1.1) next: - specifier: 15.5.2 - version: 15.5.2(@opentelemetry/api@1.9.0)(@playwright/test@1.55.0)(babel-plugin-react-compiler@19.1.0-rc.3)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + specifier: 15.5.3 + version: 15.5.3(@opentelemetry/api@1.9.0)(@playwright/test@1.55.0)(babel-plugin-react-compiler@19.1.0-rc.3)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) react: specifier: 19.1.1 version: 19.1.1 @@ -439,11 +439,11 @@ importers: specifier: workspace:* version: link:../../ui '@types/react': - specifier: 19.1.12 - version: 19.1.12 + specifier: 19.1.13 + version: 19.1.13 next: - specifier: 15.5.2 - version: 15.5.2(@opentelemetry/api@1.9.0)(@playwright/test@1.55.0)(babel-plugin-react-compiler@19.1.0-rc.3)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + specifier: 15.5.3 + version: 15.5.3(@opentelemetry/api@1.9.0)(@playwright/test@1.55.0)(babel-plugin-react-compiler@19.1.0-rc.3)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) react: specifier: 19.1.1 version: 19.1.1 @@ -454,14 +454,14 @@ importers: packages/billing/stripe: dependencies: '@stripe/react-stripe-js': - specifier: ^4.0.0 - version: 4.0.0(@stripe/stripe-js@7.9.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + specifier: ^4.0.2 + version: 4.0.2(@stripe/stripe-js@7.9.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) '@stripe/stripe-js': specifier: ^7.9.0 version: 7.9.0 stripe: specifier: ^18.5.0 - version: 18.5.0(@types/node@24.3.1) + version: 18.5.0(@types/node@24.5.0) devDependencies: '@kit/billing': specifier: workspace:* @@ -485,14 +485,14 @@ importers: specifier: workspace:* version: link:../../ui '@types/react': - specifier: 19.1.12 - version: 19.1.12 + specifier: 19.1.13 + version: 19.1.13 date-fns: specifier: ^4.1.0 version: 4.1.0 next: - specifier: 15.5.2 - version: 15.5.2(@opentelemetry/api@1.9.0)(@playwright/test@1.55.0)(babel-plugin-react-compiler@19.1.0-rc.3)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + specifier: 15.5.3 + version: 15.5.3(@opentelemetry/api@1.9.0)(@playwright/test@1.55.0)(babel-plugin-react-compiler@19.1.0-rc.3)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) react: specifier: 19.1.1 version: 19.1.1 @@ -524,20 +524,20 @@ importers: specifier: workspace:* version: link:../wordpress '@types/node': - specifier: ^24.3.1 - version: 24.3.1 + specifier: ^24.5.0 + version: 24.5.0 packages/cms/keystatic: dependencies: '@keystatic/core': specifier: 0.5.48 - version: 0.5.48(next@15.5.2(@opentelemetry/api@1.9.0)(@playwright/test@1.55.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + version: 0.5.48(next@15.5.3(@opentelemetry/api@1.9.0)(@playwright/test@1.55.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(react-dom@19.1.1(react@19.1.1))(react@19.1.1) '@keystatic/next': specifier: ^5.0.4 - version: 5.0.4(@keystatic/core@0.5.48(next@15.5.2(@opentelemetry/api@1.9.0)(@playwright/test@1.55.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(next@15.5.2(@opentelemetry/api@1.9.0)(@playwright/test@1.55.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + version: 5.0.4(@keystatic/core@0.5.48(next@15.5.3(@opentelemetry/api@1.9.0)(@playwright/test@1.55.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(next@15.5.3(@opentelemetry/api@1.9.0)(@playwright/test@1.55.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(react-dom@19.1.1(react@19.1.1))(react@19.1.1) '@markdoc/markdoc': specifier: ^0.5.4 - version: 0.5.4(@types/react@19.1.12)(react@19.1.1) + version: 0.5.4(@types/react@19.1.13)(react@19.1.1) devDependencies: '@kit/cms-types': specifier: workspace:* @@ -555,11 +555,11 @@ importers: specifier: workspace:* version: link:../../ui '@types/node': - specifier: ^24.3.1 - version: 24.3.1 + specifier: ^24.5.0 + version: 24.5.0 '@types/react': - specifier: 19.1.12 - version: 19.1.12 + specifier: 19.1.13 + version: 19.1.13 react: specifier: 19.1.1 version: 19.1.1 @@ -597,11 +597,11 @@ importers: specifier: workspace:* version: link:../../ui '@types/node': - specifier: ^24.3.1 - version: 24.3.1 + specifier: ^24.5.0 + version: 24.5.0 '@types/react': - specifier: 19.1.12 - version: 19.1.12 + specifier: 19.1.13 + version: 19.1.13 wp-types: specifier: ^4.68.1 version: 4.68.1 @@ -636,8 +636,8 @@ importers: specifier: workspace:* version: link:../../tooling/typescript '@supabase/supabase-js': - specifier: 2.57.2 - version: 2.57.2 + specifier: 2.57.4 + version: 2.57.4 zod: specifier: ^3.25.74 version: 3.25.76 @@ -645,8 +645,8 @@ importers: packages/email-templates: dependencies: '@react-email/components': - specifier: 0.5.1 - version: 0.5.1(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + specifier: 0.5.3 + version: 0.5.3(react-dom@19.1.1(react@19.1.1))(react@19.1.1) devDependencies: '@kit/eslint-config': specifier: workspace:* @@ -668,8 +668,8 @@ importers: version: 5.1.5 devDependencies: '@hookform/resolvers': - specifier: ^5.2.1 - version: 5.2.1(react-hook-form@7.62.0(react@19.1.1)) + specifier: ^5.2.2 + version: 5.2.2(react-hook-form@7.62.0(react@19.1.1)) '@kit/billing-gateway': specifier: workspace:* version: link:../../billing/gateway @@ -710,23 +710,23 @@ importers: specifier: ^1.3.2 version: 1.3.2(react@19.1.1) '@supabase/supabase-js': - specifier: 2.57.2 - version: 2.57.2 + specifier: 2.57.4 + version: 2.57.4 '@tanstack/react-query': - specifier: 5.87.1 - version: 5.87.1(react@19.1.1) + specifier: 5.89.0 + version: 5.89.0(react@19.1.1) '@types/react': - specifier: 19.1.12 - version: 19.1.12 + specifier: 19.1.13 + version: 19.1.13 '@types/react-dom': specifier: 19.1.9 - version: 19.1.9(@types/react@19.1.12) + version: 19.1.9(@types/react@19.1.13) lucide-react: - specifier: ^0.542.0 - version: 0.542.0(react@19.1.1) + specifier: ^0.544.0 + version: 0.544.0(react@19.1.1) next: - specifier: 15.5.2 - version: 15.5.2(@opentelemetry/api@1.9.0)(@playwright/test@1.55.0)(babel-plugin-react-compiler@19.1.0-rc.3)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + specifier: 15.5.3 + version: 15.5.3(@opentelemetry/api@1.9.0)(@playwright/test@1.55.0)(babel-plugin-react-compiler@19.1.0-rc.3)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) next-themes: specifier: 0.4.6 version: 0.4.6(react-dom@19.1.1(react@19.1.1))(react@19.1.1) @@ -749,8 +749,8 @@ importers: packages/features/admin: devDependencies: '@hookform/resolvers': - specifier: ^5.2.1 - version: 5.2.1(react-hook-form@7.62.0(react@19.1.1)) + specifier: ^5.2.2 + version: 5.2.2(react-hook-form@7.62.0(react@19.1.1)) '@kit/eslint-config': specifier: workspace:* version: link:../../../tooling/eslint @@ -774,28 +774,28 @@ importers: version: link:../../ui '@makerkit/data-loader-supabase-core': specifier: ^0.0.10 - version: 0.0.10(@supabase/postgrest-js@1.21.3)(@supabase/supabase-js@2.57.2) + version: 0.0.10(@supabase/postgrest-js@1.21.4)(@supabase/supabase-js@2.57.4) '@makerkit/data-loader-supabase-nextjs': specifier: ^1.2.5 - version: 1.2.5(@supabase/postgrest-js@1.21.3)(@supabase/supabase-js@2.57.2)(@tanstack/react-query@5.87.1(react@19.1.1))(next@15.5.2(@opentelemetry/api@1.9.0)(@playwright/test@1.55.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(react@19.1.1) + version: 1.2.5(@supabase/postgrest-js@1.21.4)(@supabase/supabase-js@2.57.4)(@tanstack/react-query@5.89.0(react@19.1.1))(next@15.5.3(@opentelemetry/api@1.9.0)(@playwright/test@1.55.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(react@19.1.1) '@supabase/supabase-js': - specifier: 2.57.2 - version: 2.57.2 + specifier: 2.57.4 + version: 2.57.4 '@tanstack/react-query': - specifier: 5.87.1 - version: 5.87.1(react@19.1.1) + specifier: 5.89.0 + version: 5.89.0(react@19.1.1) '@tanstack/react-table': specifier: ^8.21.3 version: 8.21.3(react-dom@19.1.1(react@19.1.1))(react@19.1.1) '@types/react': - specifier: 19.1.12 - version: 19.1.12 + specifier: 19.1.13 + version: 19.1.13 lucide-react: - specifier: ^0.542.0 - version: 0.542.0(react@19.1.1) + specifier: ^0.544.0 + version: 0.544.0(react@19.1.1) next: - specifier: 15.5.2 - version: 15.5.2(@opentelemetry/api@1.9.0)(@playwright/test@1.55.0)(babel-plugin-react-compiler@19.1.0-rc.3)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + specifier: 15.5.3 + version: 15.5.3(@opentelemetry/api@1.9.0)(@playwright/test@1.55.0)(babel-plugin-react-compiler@19.1.0-rc.3)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) react: specifier: 19.1.1 version: 19.1.1 @@ -812,8 +812,8 @@ importers: packages/features/auth: devDependencies: '@hookform/resolvers': - specifier: ^5.2.1 - version: 5.2.1(react-hook-form@7.62.0(react@19.1.1)) + specifier: ^5.2.2 + version: 5.2.2(react-hook-form@7.62.0(react@19.1.1)) '@kit/eslint-config': specifier: workspace:* version: link:../../../tooling/eslint @@ -833,26 +833,26 @@ importers: specifier: workspace:* version: link:../../ui '@marsidev/react-turnstile': - specifier: ^1.3.0 - version: 1.3.0(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + specifier: ^1.3.1 + version: 1.3.1(react-dom@19.1.1(react@19.1.1))(react@19.1.1) '@radix-ui/react-icons': specifier: ^1.3.2 version: 1.3.2(react@19.1.1) '@supabase/supabase-js': - specifier: 2.57.2 - version: 2.57.2 + specifier: 2.57.4 + version: 2.57.4 '@tanstack/react-query': - specifier: 5.87.1 - version: 5.87.1(react@19.1.1) + specifier: 5.89.0 + version: 5.89.0(react@19.1.1) '@types/react': - specifier: 19.1.12 - version: 19.1.12 + specifier: 19.1.13 + version: 19.1.13 lucide-react: - specifier: ^0.542.0 - version: 0.542.0(react@19.1.1) + specifier: ^0.544.0 + version: 0.544.0(react@19.1.1) next: - specifier: 15.5.2 - version: 15.5.2(@opentelemetry/api@1.9.0)(@playwright/test@1.55.0)(babel-plugin-react-compiler@19.1.0-rc.3)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + specifier: 15.5.3 + version: 15.5.3(@opentelemetry/api@1.9.0)(@playwright/test@1.55.0)(babel-plugin-react-compiler@19.1.0-rc.3)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) react-hook-form: specifier: ^7.62.0 version: 7.62.0(react@19.1.1) @@ -884,17 +884,17 @@ importers: specifier: workspace:* version: link:../../ui '@supabase/supabase-js': - specifier: 2.57.2 - version: 2.57.2 + specifier: 2.57.4 + version: 2.57.4 '@tanstack/react-query': - specifier: 5.87.1 - version: 5.87.1(react@19.1.1) + specifier: 5.89.0 + version: 5.89.0(react@19.1.1) '@types/react': - specifier: 19.1.12 - version: 19.1.12 + specifier: 19.1.13 + version: 19.1.13 lucide-react: - specifier: ^0.542.0 - version: 0.542.0(react@19.1.1) + specifier: ^0.544.0 + version: 0.544.0(react@19.1.1) react: specifier: 19.1.1 version: 19.1.1 @@ -912,8 +912,8 @@ importers: version: 5.1.5 devDependencies: '@hookform/resolvers': - specifier: ^5.2.1 - version: 5.2.1(react-hook-form@7.62.0(react@19.1.1)) + specifier: ^5.2.2 + version: 5.2.2(react-hook-form@7.62.0(react@19.1.1)) '@kit/accounts': specifier: workspace:* version: link:../accounts @@ -954,20 +954,20 @@ importers: specifier: workspace:* version: link:../../ui '@supabase/supabase-js': - specifier: 2.57.2 - version: 2.57.2 + specifier: 2.57.4 + version: 2.57.4 '@tanstack/react-query': - specifier: 5.87.1 - version: 5.87.1(react@19.1.1) + specifier: 5.89.0 + version: 5.89.0(react@19.1.1) '@tanstack/react-table': specifier: ^8.21.3 version: 8.21.3(react-dom@19.1.1(react@19.1.1))(react@19.1.1) '@types/react': - specifier: 19.1.12 - version: 19.1.12 + specifier: 19.1.13 + version: 19.1.13 '@types/react-dom': specifier: 19.1.9 - version: 19.1.9(@types/react@19.1.12) + version: 19.1.9(@types/react@19.1.13) class-variance-authority: specifier: ^0.7.1 version: 0.7.1 @@ -975,11 +975,11 @@ importers: specifier: ^4.1.0 version: 4.1.0 lucide-react: - specifier: ^0.542.0 - version: 0.542.0(react@19.1.1) + specifier: ^0.544.0 + version: 0.544.0(react@19.1.1) next: - specifier: 15.5.2 - version: 15.5.2(@opentelemetry/api@1.9.0)(@playwright/test@1.55.0)(babel-plugin-react-compiler@19.1.0-rc.3)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + specifier: 15.5.3 + version: 15.5.3(@opentelemetry/api@1.9.0)(@playwright/test@1.55.0)(babel-plugin-react-compiler@19.1.0-rc.3)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) react: specifier: 19.1.1 version: 19.1.1 @@ -1021,11 +1021,11 @@ importers: specifier: workspace:* version: link:../../tooling/typescript '@tanstack/react-query': - specifier: 5.87.1 - version: 5.87.1(react@19.1.1) + specifier: 5.89.0 + version: 5.89.0(react@19.1.1) next: - specifier: 15.5.2 - version: 15.5.2(@opentelemetry/api@1.9.0)(@playwright/test@1.55.0)(babel-plugin-react-compiler@19.1.0-rc.3)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + specifier: 15.5.3 + version: 15.5.3(@opentelemetry/api@1.9.0)(@playwright/test@1.55.0)(babel-plugin-react-compiler@19.1.0-rc.3)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) react: specifier: 19.1.1 version: 19.1.1 @@ -1060,8 +1060,8 @@ importers: specifier: workspace:* version: link:../../../tooling/typescript '@types/node': - specifier: ^24.3.1 - version: 24.3.1 + specifier: ^24.5.0 + version: 24.5.0 zod: specifier: ^3.25.74 version: 3.25.76 @@ -1106,8 +1106,8 @@ importers: specifier: workspace:* version: link:../../../tooling/typescript '@types/node': - specifier: ^24.3.1 - version: 24.3.1 + specifier: ^24.5.0 + version: 24.5.0 zod: specifier: ^3.25.74 version: 3.25.76 @@ -1127,6 +1127,27 @@ importers: specifier: ^3.25.74 version: 3.25.76 + packages/mcp-server: + devDependencies: + '@kit/eslint-config': + specifier: workspace:* + version: link:../../tooling/eslint + '@kit/prettier-config': + specifier: workspace:* + version: link:../../tooling/prettier + '@kit/tsconfig': + specifier: workspace:* + version: link:../../tooling/typescript + '@modelcontextprotocol/sdk': + specifier: 1.18.0 + version: 1.18.0 + '@types/node': + specifier: ^24.5.0 + version: 24.5.0 + zod: + specifier: ^3.25.74 + version: 3.25.76 + packages/monitoring/api: devDependencies: '@kit/eslint-config': @@ -1148,8 +1169,8 @@ importers: specifier: workspace:* version: link:../../../tooling/typescript '@types/react': - specifier: 19.1.12 - version: 19.1.12 + specifier: 19.1.13 + version: 19.1.13 react: specifier: 19.1.1 version: 19.1.1 @@ -1169,8 +1190,8 @@ importers: specifier: workspace:* version: link:../../../tooling/typescript '@types/react': - specifier: 19.1.12 - version: 19.1.12 + specifier: 19.1.13 + version: 19.1.13 react: specifier: 19.1.1 version: 19.1.1 @@ -1178,8 +1199,8 @@ importers: packages/monitoring/sentry: dependencies: '@sentry/nextjs': - specifier: ^10.10.0 - version: 10.10.0(@opentelemetry/context-async-hooks@2.1.0(@opentelemetry/api@1.9.0))(@opentelemetry/core@2.1.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.1.0(@opentelemetry/api@1.9.0))(next@15.5.2(@babel/core@7.28.3)(@opentelemetry/api@1.9.0)(@playwright/test@1.55.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(react@19.1.1)(webpack@5.101.3) + specifier: ^10.11.0 + version: 10.11.0(@opentelemetry/context-async-hooks@2.1.0(@opentelemetry/api@1.9.0))(@opentelemetry/core@2.1.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.1.0(@opentelemetry/api@1.9.0))(next@15.5.3(@babel/core@7.28.4)(@opentelemetry/api@1.9.0)(@playwright/test@1.55.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(react@19.1.1)(webpack@5.101.3) import-in-the-middle: specifier: 1.14.2 version: 1.14.2 @@ -1197,8 +1218,8 @@ importers: specifier: workspace:* version: link:../../../tooling/typescript '@types/react': - specifier: 19.1.12 - version: 19.1.12 + specifier: 19.1.13 + version: 19.1.13 react: specifier: 19.1.1 version: 19.1.1 @@ -1224,11 +1245,11 @@ importers: specifier: workspace:* version: link:../../tooling/typescript '@supabase/supabase-js': - specifier: 2.57.2 - version: 2.57.2 + specifier: 2.57.4 + version: 2.57.4 next: - specifier: 15.5.2 - version: 15.5.2(@opentelemetry/api@1.9.0)(@playwright/test@1.55.0)(babel-plugin-react-compiler@19.1.0-rc.3)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + specifier: 15.5.3 + version: 15.5.3(@opentelemetry/api@1.9.0)(@playwright/test@1.55.0)(babel-plugin-react-compiler@19.1.0-rc.3)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) zod: specifier: ^3.25.74 version: 3.25.76 @@ -1236,8 +1257,8 @@ importers: packages/otp: devDependencies: '@hookform/resolvers': - specifier: ^5.2.1 - version: 5.2.1(react-hook-form@7.62.0(react@19.1.1)) + specifier: ^5.2.2 + version: 5.2.2(react-hook-form@7.62.0(react@19.1.1)) '@kit/email-templates': specifier: workspace:* version: link:../email-templates @@ -1269,14 +1290,14 @@ importers: specifier: ^1.3.2 version: 1.3.2(react@19.1.1) '@supabase/supabase-js': - specifier: 2.57.2 - version: 2.57.2 + specifier: 2.57.4 + version: 2.57.4 '@types/react': - specifier: 19.1.12 - version: 19.1.12 + specifier: 19.1.13 + version: 19.1.13 '@types/react-dom': specifier: 19.1.9 - version: 19.1.9(@types/react@19.1.12) + version: 19.1.9(@types/react@19.1.13) react: specifier: 19.1.1 version: 19.1.1 @@ -1293,8 +1314,8 @@ importers: packages/shared: dependencies: pino: - specifier: ^9.9.4 - version: 9.9.4 + specifier: ^9.9.5 + version: 9.9.5 devDependencies: '@kit/eslint-config': specifier: workspace:* @@ -1306,8 +1327,8 @@ importers: specifier: workspace:* version: link:../../tooling/typescript '@types/react': - specifier: 19.1.12 - version: 19.1.12 + specifier: 19.1.13 + version: 19.1.13 packages/supabase: devDependencies: @@ -1322,19 +1343,19 @@ importers: version: link:../../tooling/typescript '@supabase/ssr': specifier: ^0.7.0 - version: 0.7.0(@supabase/supabase-js@2.57.2) + version: 0.7.0(@supabase/supabase-js@2.57.4) '@supabase/supabase-js': - specifier: 2.57.2 - version: 2.57.2 + specifier: 2.57.4 + version: 2.57.4 '@tanstack/react-query': - specifier: 5.87.1 - version: 5.87.1(react@19.1.1) + specifier: 5.89.0 + version: 5.89.0(react@19.1.1) '@types/react': - specifier: 19.1.12 - version: 19.1.12 + specifier: 19.1.13 + version: 19.1.13 next: - specifier: 15.5.2 - version: 15.5.2(@opentelemetry/api@1.9.0)(@playwright/test@1.55.0)(babel-plugin-react-compiler@19.1.0-rc.3)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + specifier: 15.5.3 + version: 15.5.3(@opentelemetry/api@1.9.0)(@playwright/test@1.55.0)(babel-plugin-react-compiler@19.1.0-rc.3)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) react: specifier: 19.1.1 version: 19.1.1 @@ -1348,8 +1369,8 @@ importers: packages/ui: dependencies: '@hookform/resolvers': - specifier: ^5.2.1 - version: 5.2.1(react-hook-form@7.62.0(react@19.1.1)) + specifier: ^5.2.2 + version: 5.2.2(react-hook-form@7.62.0(react@19.1.1)) '@radix-ui/react-icons': specifier: ^1.3.2 version: 1.3.2(react@19.1.1) @@ -1358,16 +1379,16 @@ importers: version: 2.1.1 cmdk: specifier: 1.1.1 - version: 1.1.1(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + version: 1.1.1(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) input-otp: specifier: 1.4.2 version: 1.4.2(react-dom@19.1.1(react@19.1.1))(react@19.1.1) lucide-react: - specifier: ^0.542.0 - version: 0.542.0(react@19.1.1) + specifier: ^0.544.0 + version: 0.544.0(react@19.1.1) radix-ui: specifier: 1.4.3 - version: 1.4.3(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + version: 1.4.3(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) react-dropzone: specifier: ^14.3.8 version: 14.3.8(react@19.1.1) @@ -1391,20 +1412,20 @@ importers: specifier: workspace:* version: link:../../tooling/typescript '@supabase/supabase-js': - specifier: 2.57.2 - version: 2.57.2 + specifier: 2.57.4 + version: 2.57.4 '@tanstack/react-query': - specifier: 5.87.1 - version: 5.87.1(react@19.1.1) + specifier: 5.89.0 + version: 5.89.0(react@19.1.1) '@tanstack/react-table': specifier: ^8.21.3 version: 8.21.3(react-dom@19.1.1(react@19.1.1))(react@19.1.1) '@types/react': - specifier: 19.1.12 - version: 19.1.12 + specifier: 19.1.13 + version: 19.1.13 '@types/react-dom': specifier: 19.1.9 - version: 19.1.9(@types/react@19.1.12) + version: 19.1.9(@types/react@19.1.13) class-variance-authority: specifier: ^0.7.1 version: 0.7.1 @@ -1415,8 +1436,8 @@ importers: specifier: ^9.35.0 version: 9.35.0(jiti@2.5.1) next: - specifier: 15.5.2 - version: 15.5.2(@opentelemetry/api@1.9.0)(@playwright/test@1.55.0)(babel-plugin-react-compiler@19.1.0-rc.3)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + specifier: 15.5.3 + version: 15.5.3(@opentelemetry/api@1.9.0)(@playwright/test@1.55.0)(babel-plugin-react-compiler@19.1.0-rc.3)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) next-themes: specifier: 0.4.6 version: 0.4.6(react-dom@19.1.1(react@19.1.1))(react@19.1.1) @@ -1424,8 +1445,8 @@ importers: specifier: ^3.6.2 version: 3.6.2 react-day-picker: - specifier: ^9.9.0 - version: 9.9.0(react@19.1.1) + specifier: ^9.10.0 + version: 9.10.0(react@19.1.1) react-hook-form: specifier: ^7.62.0 version: 7.62.0(react@19.1.1) @@ -1451,20 +1472,20 @@ importers: tooling/eslint: dependencies: '@next/eslint-plugin-next': - specifier: 15.5.2 - version: 15.5.2 + specifier: 15.5.3 + version: 15.5.3 '@types/eslint': specifier: 9.6.1 version: 9.6.1 eslint-config-next: - specifier: 15.5.2 - version: 15.5.2(eslint@9.35.0(jiti@2.5.1))(typescript@5.9.2) + specifier: 15.5.3 + version: 15.5.3(eslint@9.35.0(jiti@2.5.1))(typescript@5.9.2) eslint-config-turbo: specifier: ^2.5.6 version: 2.5.6(eslint@9.35.0(jiti@2.5.1))(turbo@2.5.6) typescript-eslint: - specifier: 8.42.0 - version: 8.42.0(eslint@9.35.0(jiti@2.5.1))(typescript@5.9.2) + specifier: 8.44.0 + version: 8.44.0(eslint@9.35.0(jiti@2.5.1))(typescript@5.9.2) devDependencies: '@kit/prettier-config': specifier: workspace:* @@ -1512,20 +1533,20 @@ packages: graphql: optional: true - '@ai-sdk/gateway@1.0.18': - resolution: {integrity: sha512-tpUF9nwTVFJGH+u9LHccf1TTRMeUrfJPzYJVpHH1tc1vclO695SQUTIR9jnTCuvn1XFYtkiXUALYpQhBYWf3Pg==} + '@ai-sdk/gateway@1.0.23': + resolution: {integrity: sha512-ynV7WxpRK2zWLGkdOtrU2hW22mBVkEYVS3iMg1+ZGmAYSgzCqzC74bfOJZ2GU1UdcrFWUsFI9qAYjsPkd+AebA==} engines: {node: '>=18'} peerDependencies: zod: ^3.25.76 || ^4 - '@ai-sdk/openai@2.0.24': - resolution: {integrity: sha512-8fPFvlb6PpDjy6JtJBP3Hqs4THKFNYOw6+j7nG7iJivNp+uvHlrHwnU6wQgMAesxEDjZRmVB6ntXWxGPCbBeJw==} + '@ai-sdk/openai@2.0.30': + resolution: {integrity: sha512-a9Vf64OT2dWEFyEGv+OxtCs69B18BsuzInvuyUxVPczbIiBLqUCt3zcD/8EwqbTPJwsFNsL8/9nbVZFmwA1+2A==} engines: {node: '>=18'} peerDependencies: zod: ^3.25.76 || ^4 - '@ai-sdk/provider-utils@3.0.8': - resolution: {integrity: sha512-cDj1iigu7MW2tgAQeBzOiLhjHOUM9vENsgh4oAVitek0d//WdgfPCsKO3euP7m7LyO/j9a1vr/So+BGNdpFXYw==} + '@ai-sdk/provider-utils@3.0.9': + resolution: {integrity: sha512-Pm571x5efqaI4hf9yW4KsVlDBDme8++UepZRnq+kqVBWWjgvGhQlzU8glaFq0YJEB9kkxZHbRRyVeHoV2sRYaQ==} engines: {node: '>=18'} peerDependencies: zod: ^3.25.76 || ^4 @@ -1538,10 +1559,6 @@ packages: resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==} engines: {node: '>=10'} - '@ampproject/remapping@2.3.0': - resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} - engines: {node: '>=6.0.0'} - '@aws-crypto/sha256-browser@5.2.0': resolution: {integrity: sha512-AXfN/lGotSQwu6HNcEsIASo7kWXZ5HYWvfOmSNKDsEqC4OashTp8alTmaz+F7TC2L083SFv5RdB+qU3Vs1kZqw==} @@ -1555,103 +1572,103 @@ packages: '@aws-crypto/util@5.2.0': resolution: {integrity: sha512-4RkU9EsI6ZpBve5fseQlGNUWKMa1RLPQ1dnjnQoe07ldfIzcsGb5hC5W0Dm7u423KWzawlrpbjXBrXCEv9zazQ==} - '@aws-sdk/client-sesv2@3.882.0': - resolution: {integrity: sha512-EUCYfXxTW1NVFCJQazoATK/aJ1Su7cozsU4kLAa3DZrW+ogUtemA4v66hsQlOwH0wKtg3FNJSTWMV8TIz1zBCQ==} + '@aws-sdk/client-sesv2@3.888.0': + resolution: {integrity: sha512-Zy7AXvj4oVLE5Zkj61qYZxIFgJXbRgTmFJvQ/EqgxE87KPR9+gF5wtC3iqcKEmkqFlWlxWrlhV4K70Vqqj4bZQ==} engines: {node: '>=18.0.0'} - '@aws-sdk/client-sso@3.882.0': - resolution: {integrity: sha512-JFWJB+2PZvygDuqb4iWKCro1Tl5L4tGBXMHe94jYMYnfajYGm58bW3RsPj3cKD2+TvIMUSXmNriNv+LbDKZmNw==} + '@aws-sdk/client-sso@3.888.0': + resolution: {integrity: sha512-8CLy/ehGKUmekjH+VtZJ4w40PqDg3u0K7uPziq/4P8Q7LLgsy8YQoHNbuY4am7JU3HWrqLXJI9aaz1+vPGPoWA==} engines: {node: '>=18.0.0'} - '@aws-sdk/core@3.882.0': - resolution: {integrity: sha512-m43/gEDbxqxLT/Mbn/OA21TuFpyocOUzjiSA2HBnLQ3KivA4ez0nsW91vh0Sp3TOfLgiZbRbVhmI6XfsFinwBg==} + '@aws-sdk/core@3.888.0': + resolution: {integrity: sha512-L3S2FZywACo4lmWv37Y4TbefuPJ1fXWyWwIJ3J4wkPYFJ47mmtUPqThlVrSbdTHkEjnZgJe5cRfxk0qCLsFh1w==} engines: {node: '>=18.0.0'} - '@aws-sdk/credential-provider-env@3.882.0': - resolution: {integrity: sha512-khhE1k+4XvGm8Mk6vVUbrVvEnx3r8E6dymSKSiAKf0lwsnKWAWd1RLGwLusqVgtGR4Jfsrbg7ox9MczIjgCiTg==} + '@aws-sdk/credential-provider-env@3.888.0': + resolution: {integrity: sha512-shPi4AhUKbIk7LugJWvNpeZA8va7e5bOHAEKo89S0Ac8WDZt2OaNzbh/b9l0iSL2eEyte8UgIsYGcFxOwIF1VA==} engines: {node: '>=18.0.0'} - '@aws-sdk/credential-provider-http@3.882.0': - resolution: {integrity: sha512-j3mBF+Q6RU3u8t5O1KOWbQQCi0WNSl47sNIa1RvyN6qK1WIA8BxM1hB25mI9TMPrNZMFthljVec+JcNjRNG34A==} + '@aws-sdk/credential-provider-http@3.888.0': + resolution: {integrity: sha512-Jvuk6nul0lE7o5qlQutcqlySBHLXOyoPtiwE6zyKbGc7RVl0//h39Lab7zMeY2drMn8xAnIopL4606Fd8JI/Hw==} engines: {node: '>=18.0.0'} - '@aws-sdk/credential-provider-ini@3.882.0': - resolution: {integrity: sha512-nUacsSYKyTUmv/Fqe0efihCRCabea5MZtGSZF0l2V8QBo39yJjw0wVmRK6G4bfm5lY7v2EVVIUCpiTvxRRUbHg==} + '@aws-sdk/credential-provider-ini@3.888.0': + resolution: {integrity: sha512-M82ItvS5yq+tO6ZOV1ruaVs2xOne+v8HW85GFCXnz8pecrzYdgxh6IsVqEbbWruryG/mUGkWMbkBZoEsy4MgyA==} engines: {node: '>=18.0.0'} - '@aws-sdk/credential-provider-node@3.882.0': - resolution: {integrity: sha512-sELdV+leCfY+Bw8NQo3H65oIT+9thqZU0RWyv85EfZVvKEwWDt4McA7+Co1VkH+nCY21s5jz4SOqIrYuT0cSQg==} + '@aws-sdk/credential-provider-node@3.888.0': + resolution: {integrity: sha512-KCrQh1dCDC8Y+Ap3SZa6S81kHk+p+yAaOQ5jC3dak4zhHW3RCrsGR/jYdemTOgbEGcA6ye51UbhWfrrlMmeJSA==} engines: {node: '>=18.0.0'} - '@aws-sdk/credential-provider-process@3.882.0': - resolution: {integrity: sha512-S3BgGcaR+L7CQAQn3Ysy9KSnck7+hDicAGM/dYvvJ8GwZNIOc0542Y+ntpV1UYa7OuZPWzGy2v2NcJSCbYDXEA==} + '@aws-sdk/credential-provider-process@3.888.0': + resolution: {integrity: sha512-+aX6piSukPQ8DUS4JAH344GePg8/+Q1t0+kvSHAZHhYvtQ/1Zek3ySOJWH2TuzTPCafY4nmWLcQcqvU1w9+4Lw==} engines: {node: '>=18.0.0'} - '@aws-sdk/credential-provider-sso@3.882.0': - resolution: {integrity: sha512-1pZRTKiDl6Oh/jP75lEoSkJrer1YEm8lMconB8dX9bsaWbp9cZeMJMK6pts5VQcveeOLr/8/U9TESboPjHBcyA==} + '@aws-sdk/credential-provider-sso@3.888.0': + resolution: {integrity: sha512-b1ZJji7LJ6E/j1PhFTyvp51in2iCOQ3VP6mj5H6f5OUnqn7efm41iNMoinKr87n0IKZw7qput5ggXVxEdPhouA==} engines: {node: '>=18.0.0'} - '@aws-sdk/credential-provider-web-identity@3.882.0': - resolution: {integrity: sha512-EvpsD0Vcz5WgXjpC53KAQ2CkeUp0KwwiV6brgQTXl+9yV/M8M0aK5Qk5ep/MPbAn5gtbqXHaCkiExaN4YYOhCg==} + '@aws-sdk/credential-provider-web-identity@3.888.0': + resolution: {integrity: sha512-7P0QNtsDzMZdmBAaY/vY1BsZHwTGvEz3bsn2bm5VSKFAeMmZqsHK1QeYdNsFjLtegnVh+wodxMq50jqLv3LFlA==} engines: {node: '>=18.0.0'} - '@aws-sdk/middleware-host-header@3.873.0': - resolution: {integrity: sha512-KZ/W1uruWtMOs7D5j3KquOxzCnV79KQW9MjJFZM/M0l6KI8J6V3718MXxFHsTjUE4fpdV6SeCNLV1lwGygsjJA==} + '@aws-sdk/middleware-host-header@3.887.0': + resolution: {integrity: sha512-ulzqXv6NNqdu/kr0sgBYupWmahISHY+azpJidtK6ZwQIC+vBUk9NdZeqQpy7KVhIk2xd4+5Oq9rxapPwPI21CA==} engines: {node: '>=18.0.0'} - '@aws-sdk/middleware-logger@3.876.0': - resolution: {integrity: sha512-cpWJhOuMSyz9oV25Z/CMHCBTgafDCbv7fHR80nlRrPdPZ8ETNsahwRgltXP1QJJ8r3X/c1kwpOR7tc+RabVzNA==} + '@aws-sdk/middleware-logger@3.887.0': + resolution: {integrity: sha512-YbbgLI6jKp2qSoAcHnXrQ5jcuc5EYAmGLVFgMVdk8dfCfJLfGGSaOLxF4CXC7QYhO50s+mPPkhBYejCik02Kug==} engines: {node: '>=18.0.0'} - '@aws-sdk/middleware-recursion-detection@3.873.0': - resolution: {integrity: sha512-OtgY8EXOzRdEWR//WfPkA/fXl0+WwE8hq0y9iw2caNyKPtca85dzrrZWnPqyBK/cpImosrpR1iKMYr41XshsCg==} + '@aws-sdk/middleware-recursion-detection@3.887.0': + resolution: {integrity: sha512-tjrUXFtQnFLo+qwMveq5faxP5MQakoLArXtqieHphSqZTXm21wDJM73hgT4/PQQGTwgYjDKqnqsE1hvk0hcfDw==} engines: {node: '>=18.0.0'} - '@aws-sdk/middleware-sdk-s3@3.882.0': - resolution: {integrity: sha512-j5Ya7RKSQSKkpcLsO+Rh272zKD63JYkLKY/N8m5MVNWQafMdUbkZi7nwwjq7s5t7r3Pmz7a4gLf4n6ZEL5eaow==} + '@aws-sdk/middleware-sdk-s3@3.888.0': + resolution: {integrity: sha512-rKOFNfqgqOfrdcLGF8fcO75azWS2aq2ksRHFoIEFru5FJxzu/yDAhY4C2FKiP/X34xeIUS2SbE/gQgrgWHSN2g==} engines: {node: '>=18.0.0'} - '@aws-sdk/middleware-user-agent@3.882.0': - resolution: {integrity: sha512-IdLVpV2b0qryxFb/gNPwZoayLUdgmb41fWpLiIf99pyNwR7TGs/9Ri2amS3PnaQHuES947xYSYZ9Ej0kBgjHKg==} + '@aws-sdk/middleware-user-agent@3.888.0': + resolution: {integrity: sha512-ZkcUkoys8AdrNNG7ATjqw2WiXqrhTvT+r4CIK3KhOqIGPHX0p0DQWzqjaIl7ZhSUToKoZ4Ud7MjF795yUr73oA==} engines: {node: '>=18.0.0'} - '@aws-sdk/nested-clients@3.882.0': - resolution: {integrity: sha512-IQkOtl/DhLV5+tJI7ZwjBDJO1lIoYOcmNQzcg8ly9RTdMoTcEtklevxmAwWB4DEFiIctUk2OSjHqhfWjeYredA==} + '@aws-sdk/nested-clients@3.888.0': + resolution: {integrity: sha512-py4o4RPSGt+uwGvSBzR6S6cCBjS4oTX5F8hrHFHfPCdIOMVjyOBejn820jXkCrcdpSj3Qg1yUZXxsByvxc9Lyg==} engines: {node: '>=18.0.0'} - '@aws-sdk/region-config-resolver@3.873.0': - resolution: {integrity: sha512-q9sPoef+BBG6PJnc4x60vK/bfVwvRWsPgcoQyIra057S/QGjq5VkjvNk6H8xedf6vnKlXNBwq9BaANBXnldUJg==} + '@aws-sdk/region-config-resolver@3.887.0': + resolution: {integrity: sha512-VdSMrIqJ3yjJb/fY+YAxrH/lCVv0iL8uA+lbMNfQGtO5tB3Zx6SU9LEpUwBNX8fPK1tUpI65CNE4w42+MY/7Mg==} engines: {node: '>=18.0.0'} - '@aws-sdk/signature-v4-multi-region@3.882.0': - resolution: {integrity: sha512-hAmA9BgL3nIRTGoOGjMXMqVtPhtPFKBFaqhgQkgmkzpbZ6aaGecNIqBfGxi9oezR4dnvI+PvKoRo2F8csF7fMA==} + '@aws-sdk/signature-v4-multi-region@3.888.0': + resolution: {integrity: sha512-FmOHUaJzEhqfcpyh0L7HLwYcYopK13Dbmuf+oUyu56/RoeB1nLnltH1VMQVj8v3Am2IwlGR+/JpFyrdkErN+cA==} engines: {node: '>=18.0.0'} - '@aws-sdk/token-providers@3.882.0': - resolution: {integrity: sha512-/Z6F8Cc+QjBMEPh3ZXy7JM1vMZCS41+Nh9VgdUwvvdJTA7LRXSDBRDL3cQPa7bii9unZ8SqsIC+7Nlw1LKwwJA==} + '@aws-sdk/token-providers@3.888.0': + resolution: {integrity: sha512-WA3NF+3W8GEuCMG1WvkDYbB4z10G3O8xuhT7QSjhvLYWQ9CPt3w4VpVIfdqmUn131TCIbhCzD0KN/1VJTjAjyw==} engines: {node: '>=18.0.0'} - '@aws-sdk/types@3.862.0': - resolution: {integrity: sha512-Bei+RL0cDxxV+lW2UezLbCYYNeJm6Nzee0TpW0FfyTRBhH9C1XQh4+x+IClriXvgBnRquTMMYsmJfvx8iyLKrg==} + '@aws-sdk/types@3.887.0': + resolution: {integrity: sha512-fmTEJpUhsPsovQ12vZSpVTEP/IaRoJAMBGQXlQNjtCpkBp6Iq3KQDa/HDaPINE+3xxo6XvTdtibsNOd5zJLV9A==} engines: {node: '>=18.0.0'} '@aws-sdk/util-arn-parser@3.873.0': resolution: {integrity: sha512-qag+VTqnJWDn8zTAXX4wiVioa0hZDQMtbZcGRERVnLar4/3/VIKBhxX2XibNQXFu1ufgcRn4YntT/XEPecFWcg==} engines: {node: '>=18.0.0'} - '@aws-sdk/util-endpoints@3.879.0': - resolution: {integrity: sha512-aVAJwGecYoEmbEFju3127TyJDF9qJsKDUUTRMDuS8tGn+QiWQFnfInmbt+el9GU1gEJupNTXV+E3e74y51fb7A==} + '@aws-sdk/util-endpoints@3.887.0': + resolution: {integrity: sha512-kpegvT53KT33BMeIcGLPA65CQVxLUL/C3gTz9AzlU/SDmeusBHX4nRApAicNzI/ltQ5lxZXbQn18UczzBuwF1w==} engines: {node: '>=18.0.0'} '@aws-sdk/util-locate-window@3.873.0': resolution: {integrity: sha512-xcVhZF6svjM5Rj89T1WzkjQmrTF6dpR2UvIHPMTnSZoNe6CixejPZ6f0JJ2kAhO8H+dUHwNBlsUgOTIKiK/Syg==} engines: {node: '>=18.0.0'} - '@aws-sdk/util-user-agent-browser@3.873.0': - resolution: {integrity: sha512-AcRdbK6o19yehEcywI43blIBhOCSo6UgyWcuOJX5CFF8k39xm1ILCjQlRRjchLAxWrm0lU0Q7XV90RiMMFMZtA==} + '@aws-sdk/util-user-agent-browser@3.887.0': + resolution: {integrity: sha512-X71UmVsYc6ZTH4KU6hA5urOzYowSXc3qvroagJNLJYU1ilgZ529lP4J9XOYfEvTXkLR1hPFSRxa43SrwgelMjA==} - '@aws-sdk/util-user-agent-node@3.882.0': - resolution: {integrity: sha512-7zPtGXeAs6UzKjrrSbMNiFMSLZ/2DWvJ26KBOasS3zQbL534yoNos4HUA3OOXSpKFBAIEcYWu6rzR4ptlvx50w==} + '@aws-sdk/util-user-agent-node@3.888.0': + resolution: {integrity: sha512-rSB3OHyuKXotIGfYEo//9sU0lXAUrTY28SUUnxzOGYuQsAt0XR5iYwBAp+RjV6x8f+Hmtbg0PdCsy1iNAXa0UQ==} engines: {node: '>=18.0.0'} peerDependencies: aws-crt: '>=1.0.0' @@ -1659,20 +1676,24 @@ packages: aws-crt: optional: true - '@aws-sdk/xml-builder@3.873.0': - resolution: {integrity: sha512-kLO7k7cGJ6KaHiExSJWojZurF7SnGMDHXRuQunFnEoD0n1yB6Lqy/S/zHiQ7oJnBhPr9q0TW9qFkrsZb1Uc54w==} + '@aws-sdk/xml-builder@3.887.0': + resolution: {integrity: sha512-lMwgWK1kNgUhHGfBvO/5uLe7TKhycwOn3eRCqsKPT9aPCx/HWuTlpcQp8oW2pCRGLS7qzcxqpQulcD+bbUL7XQ==} + engines: {node: '>=18.0.0'} + + '@aws/lambda-invoke-store@0.0.1': + resolution: {integrity: sha512-ORHRQ2tmvnBXc8t/X9Z8IcSbBA4xTLKuN873FopzklHMeqBst7YG0d+AX97inkvDX+NChYtSr+qGfcqGFaI8Zw==} engines: {node: '>=18.0.0'} '@babel/code-frame@7.27.1': resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==} engines: {node: '>=6.9.0'} - '@babel/compat-data@7.28.0': - resolution: {integrity: sha512-60X7qkglvrap8mn1lh2ebxXdZYtUcpd7gsmy9kLaBJ4i/WdY8PqTSdxyA8qraikqKQK5C1KRBKXqznrVapyNaw==} + '@babel/compat-data@7.28.4': + resolution: {integrity: sha512-YsmSKC29MJwf0gF8Rjjrg5LQCmyh+j/nD8/eP7f+BeoQTKYqs9RoWbjGOdy0+1Ekr68RJZMUOPVQaQisnIo4Rw==} engines: {node: '>=6.9.0'} - '@babel/core@7.28.3': - resolution: {integrity: sha512-yDBHV9kQNcr2/sUr9jghVyz9C3Y5G2zUM2H2lo+9mKv4sFgbA8s8Z9t8D1jiTkGoO/NoIfKMyKWr4s6CN23ZwQ==} + '@babel/core@7.28.4': + resolution: {integrity: sha512-2BCOP7TN8M+gVDj7/ht3hsaO/B/n5oDbiAyyvnRlNOs+u1o+JWNYTQrmpuNp1/Wq2gcFrI01JAW+paEKDMx/CA==} engines: {node: '>=6.9.0'} '@babel/generator@7.28.3': @@ -1709,8 +1730,8 @@ packages: resolution: {integrity: sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==} engines: {node: '>=6.9.0'} - '@babel/helpers@7.28.3': - resolution: {integrity: sha512-PTNtvUQihsAsDHMOP5pfobP8C6CM4JWXmP8DrEIt46c3r2bf87Ua1zoqevsMo9g+tWDwgWrFP5EIxuBx5RudAw==} + '@babel/helpers@7.28.4': + resolution: {integrity: sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==} engines: {node: '>=6.9.0'} '@babel/parser@7.28.3': @@ -1718,6 +1739,11 @@ packages: engines: {node: '>=6.0.0'} hasBin: true + '@babel/parser@7.28.4': + resolution: {integrity: sha512-yZbBqeM6TkpP9du/I2pUZnJsRMGGvOuIrhjzC1AwHwW+6he4mni6Bp/m8ijn0iOuZuPI2BfkCoSRunpyjnrQKg==} + engines: {node: '>=6.0.0'} + hasBin: true + '@babel/runtime-corejs3@7.28.3': resolution: {integrity: sha512-LKYxD2CIfocUFNREQ1yk+dW+8OH8CRqmgatBZYXb+XhuObO8wsDpEoCNri5bKld9cnj8xukqZjxSX8p1YiRF8Q==} engines: {node: '>=6.9.0'} @@ -1738,10 +1764,18 @@ packages: resolution: {integrity: sha512-7w4kZYHneL3A6NP2nxzHvT3HCZ7puDZZjFMqDpBPECub79sTtSO5CGXDkKrTQq8ksAwfD/XI2MRFX23njdDaIQ==} engines: {node: '>=6.9.0'} + '@babel/traverse@7.28.4': + resolution: {integrity: sha512-YEzuboP2qvQavAcjgQNVgsvHIDv6ZpwXvcvjmyySP2DIMuByS/6ioU5G9pYrWHM6T2YDfc7xga9iNzYOs12CFQ==} + engines: {node: '>=6.9.0'} + '@babel/types@7.28.2': resolution: {integrity: sha512-ruv7Ae4J5dUYULmeXw1gmb7rYRz57OWCPM57pHojnLq/3Z1CK2lNSLTCVjxVk1F/TZHwOZZrOWi0ur95BbLxNQ==} engines: {node: '>=6.9.0'} + '@babel/types@7.28.4': + resolution: {integrity: sha512-bkFqkLhh3pMBUQQkpVgWDWq/lqzc2678eUyDlTBhRqhCHFguYYGM0Efga7tYk4TogG/3x0EEl66/OQ+WGbWB/Q==} + engines: {node: '>=6.9.0'} + '@braintree/sanitize-url@6.0.4': resolution: {integrity: sha512-s3jaWicZd0pkP0jf5ysyHUI/RE7MHos6qlToFcGWXVp+ykHOy77OUMrfbgJ9it2C5bow7OIQwYYaHjk9XlBQ2A==} @@ -1816,6 +1850,12 @@ packages: peerDependencies: eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + '@eslint-community/eslint-utils@4.9.0': + resolution: {integrity: sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + '@eslint-community/regexpp@4.12.1': resolution: {integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} @@ -1893,8 +1933,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 - '@hookform/resolvers@5.2.1': - resolution: {integrity: sha512-u0+6X58gkjMcxur1wRWokA7XsiiBJ6aK17aPZxhkoYiK5J+HcTx0Vhu9ovXe6H+dVpO6cjrn2FkJTryXEMlryQ==} + '@hookform/resolvers@5.2.2': + resolution: {integrity: sha512-A/IxlMLShx3KjV/HeTcTfaMxdwy690+L/ZADoeaTltLx+CVuzkeVIPuybK3jrRfw7YZnmdKsVVHAlEPIAEUNlA==} peerDependencies: react-hook-form: ^7.55.0 @@ -2080,6 +2120,9 @@ packages: '@jridgewell/trace-mapping@0.3.30': resolution: {integrity: sha512-GQ7Nw5G2lTu/BtHTKfXhKHok2WGetd4XYcVKGx00SjAk8GMwgJM3zr6zORiPGuOE+/vkc90KtTosSSvaCjKb2Q==} + '@jridgewell/trace-mapping@0.3.31': + resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} + '@jridgewell/trace-mapping@0.3.9': resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} @@ -2169,71 +2212,75 @@ packages: react: optional: true - '@marsidev/react-turnstile@1.3.0': - resolution: {integrity: sha512-VO99Nynt+j4ETfMImQCj5LgbUKZ9mWPpy3RjP/3e/3vZu+FIphjEdU6g+cq4FeDoNshSxLlRzBTKcH5JMeM1GQ==} + '@marsidev/react-turnstile@1.3.1': + resolution: {integrity: sha512-h2THG/75k4Y049hgjSGPIcajxXnh+IZAiXVbryQyVmagkboN7pJtBgR16g8akjwUBSfRrg6jw6KvPDjscQflog==} peerDependencies: react: ^17.0.2 || ^18.0.0 || ^19.0 react-dom: ^17.0.2 || ^18.0.0 || ^19.0 + '@modelcontextprotocol/sdk@1.18.0': + resolution: {integrity: sha512-JvKyB6YwS3quM+88JPR0axeRgvdDu3Pv6mdZUy+w4qVkCzGgumb9bXG/TmtDRQv+671yaofVfXSQmFLlWU5qPQ==} + engines: {node: '>=18'} + '@napi-rs/wasm-runtime@0.2.12': resolution: {integrity: sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ==} - '@next/bundle-analyzer@15.5.2': - resolution: {integrity: sha512-UWOFpy/NK5iSeIP0mgdq4VqGB4/z37uq5v5dEtvzmY/BlaPO6m4EtFUaH6RVI0w2wG5sh0TG86i/cA5wcaJtgg==} + '@next/bundle-analyzer@15.5.3': + resolution: {integrity: sha512-l2NxnWHP2gWHbomAlz/wFnN2jNCx/dpr7P/XWeOLhULiyKkXSac8O8SjxRO/8FNhr2l4JNtWVKk82Uya4cZYTw==} '@next/env@13.5.11': resolution: {integrity: sha512-fbb2C7HChgM7CemdCY+y3N1n8pcTKdqtQLbC7/EQtPdLvlMUT9JX/dBYl8MMZAtYG4uVMyPFHXckb68q/NRwqg==} - '@next/env@15.5.2': - resolution: {integrity: sha512-Qe06ew4zt12LeO6N7j8/nULSOe3fMXE4dM6xgpBQNvdzyK1sv5y4oAP3bq4LamrvGCZtmRYnW8URFCeX5nFgGg==} + '@next/env@15.5.3': + resolution: {integrity: sha512-RSEDTRqyihYXygx/OJXwvVupfr9m04+0vH8vyy0HfZ7keRto6VX9BbEk0J2PUk0VGy6YhklJUSrgForov5F9pw==} - '@next/eslint-plugin-next@15.5.2': - resolution: {integrity: sha512-lkLrRVxcftuOsJNhWatf1P2hNVfh98k/omQHrCEPPriUypR6RcS13IvLdIrEvkm9AH2Nu2YpR5vLqBuy6twH3Q==} + '@next/eslint-plugin-next@15.5.3': + resolution: {integrity: sha512-SdhaKdko6dpsSr0DldkESItVrnPYB1NS2NpShCSX5lc7SSQmLZt5Mug6t2xbiuVWEVDLZSuIAoQyYVBYp0dR5g==} - '@next/swc-darwin-arm64@15.5.2': - resolution: {integrity: sha512-8bGt577BXGSd4iqFygmzIfTYizHb0LGWqH+qgIF/2EDxS5JsSdERJKA8WgwDyNBZgTIIA4D8qUtoQHmxIIquoQ==} + '@next/swc-darwin-arm64@15.5.3': + resolution: {integrity: sha512-nzbHQo69+au9wJkGKTU9lP7PXv0d1J5ljFpvb+LnEomLtSbJkbZyEs6sbF3plQmiOB2l9OBtN2tNSvCH1nQ9Jg==} engines: {node: '>= 10'} cpu: [arm64] os: [darwin] - '@next/swc-darwin-x64@15.5.2': - resolution: {integrity: sha512-2DjnmR6JHK4X+dgTXt5/sOCu/7yPtqpYt8s8hLkHFK3MGkka2snTv3yRMdHvuRtJVkPwCGsvBSwmoQCHatauFQ==} + '@next/swc-darwin-x64@15.5.3': + resolution: {integrity: sha512-w83w4SkOOhekJOcA5HBvHyGzgV1W/XvOfpkrxIse4uPWhYTTRwtGEM4v/jiXwNSJvfRvah0H8/uTLBKRXlef8g==} engines: {node: '>= 10'} cpu: [x64] os: [darwin] - '@next/swc-linux-arm64-gnu@15.5.2': - resolution: {integrity: sha512-3j7SWDBS2Wov/L9q0mFJtEvQ5miIqfO4l7d2m9Mo06ddsgUK8gWfHGgbjdFlCp2Ek7MmMQZSxpGFqcC8zGh2AA==} + '@next/swc-linux-arm64-gnu@15.5.3': + resolution: {integrity: sha512-+m7pfIs0/yvgVu26ieaKrifV8C8yiLe7jVp9SpcIzg7XmyyNE7toC1fy5IOQozmr6kWl/JONC51osih2RyoXRw==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - '@next/swc-linux-arm64-musl@15.5.2': - resolution: {integrity: sha512-s6N8k8dF9YGc5T01UPQ08yxsK6fUow5gG1/axWc1HVVBYQBgOjca4oUZF7s4p+kwhkB1bDSGR8QznWrFZ/Rt5g==} + '@next/swc-linux-arm64-musl@15.5.3': + resolution: {integrity: sha512-u3PEIzuguSenoZviZJahNLgCexGFhso5mxWCrrIMdvpZn6lkME5vc/ADZG8UUk5K1uWRy4hqSFECrON6UKQBbQ==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - '@next/swc-linux-x64-gnu@15.5.2': - resolution: {integrity: sha512-o1RV/KOODQh6dM6ZRJGZbc+MOAHww33Vbs5JC9Mp1gDk8cpEO+cYC/l7rweiEalkSm5/1WGa4zY7xrNwObN4+Q==} + '@next/swc-linux-x64-gnu@15.5.3': + resolution: {integrity: sha512-lDtOOScYDZxI2BENN9m0pfVPJDSuUkAD1YXSvlJF0DKwZt0WlA7T7o3wrcEr4Q+iHYGzEaVuZcsIbCps4K27sA==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - '@next/swc-linux-x64-musl@15.5.2': - resolution: {integrity: sha512-/VUnh7w8RElYZ0IV83nUcP/J4KJ6LLYliiBIri3p3aW2giF+PAVgZb6mk8jbQSB3WlTai8gEmCAr7kptFa1H6g==} + '@next/swc-linux-x64-musl@15.5.3': + resolution: {integrity: sha512-9vWVUnsx9PrY2NwdVRJ4dUURAQ8Su0sLRPqcCCxtX5zIQUBES12eRVHq6b70bbfaVaxIDGJN2afHui0eDm+cLg==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - '@next/swc-win32-arm64-msvc@15.5.2': - resolution: {integrity: sha512-sMPyTvRcNKXseNQ/7qRfVRLa0VhR0esmQ29DD6pqvG71+JdVnESJaHPA8t7bc67KD5spP3+DOCNLhqlEI2ZgQg==} + '@next/swc-win32-arm64-msvc@15.5.3': + resolution: {integrity: sha512-1CU20FZzY9LFQigRi6jM45oJMU3KziA5/sSG+dXeVaTm661snQP6xu3ykGxxwU5sLG3sh14teO/IOEPVsQMRfA==} engines: {node: '>= 10'} cpu: [arm64] os: [win32] - '@next/swc-win32-x64-msvc@15.5.2': - resolution: {integrity: sha512-W5VvyZHnxG/2ukhZF/9Ikdra5fdNftxI6ybeVKYvBPDtyx7x4jPPSNduUkfH5fo3zG0JQ0bPxgy41af2JX5D4Q==} + '@next/swc-win32-x64-msvc@15.5.3': + resolution: {integrity: sha512-JMoLAq3n3y5tKXPQwCK5c+6tmwkuFDa2XAxz8Wm4+IVthdBZdZGh+lmiLUHg9f9IDwIQpUjp+ysd6OkYTyZRZw==} engines: {node: '>= 10'} cpu: [x64] os: [win32] @@ -2264,6 +2311,10 @@ packages: resolution: {integrity: sha512-9B9RU0H7Ya1Dx/Rkyc4stuBZSGVQF27WigitInx2QQoj6KUpEFYPKoWjdFTunJYxmXmh17HeBvbMa1EhGyPmqQ==} engines: {node: '>=8.0.0'} + '@opentelemetry/api-logs@0.204.0': + resolution: {integrity: sha512-DqxY8yoAaiBPivoJD4UtgrMS8gEmzZ5lnaxzPojzLVHBGqPxgWm4zcuvcUHZiqQ6kRX2Klel2r9y8cA2HAtqpw==} + engines: {node: '>=8.0.0'} + '@opentelemetry/api-logs@0.57.2': resolution: {integrity: sha512-uIX52NnTM0iBh84MShlpouI7UKqkZ7MrUszTmaypHBu4r7NofznSnQRfJ+uUeDtQDj6w8eFGg5KBLDAwAPz1+A==} engines: {node: '>=14'} @@ -2344,8 +2395,8 @@ packages: peerDependencies: '@opentelemetry/api': ^1.3.0 - '@opentelemetry/instrumentation-ioredis@0.51.0': - resolution: {integrity: sha512-9IUws0XWCb80NovS+17eONXsw1ZJbHwYYMXiwsfR9TSurkLV5UNbRSKb9URHO+K+pIJILy9wCxvyiOneMr91Ig==} + '@opentelemetry/instrumentation-ioredis@0.52.0': + resolution: {integrity: sha512-rUvlyZwI90HRQPYicxpDGhT8setMrlHKokCtBtZgYxQWRF5RBbG4q0pGtbZvd7kyseuHbFpA3I/5z7M8b/5ywg==} engines: {node: ^18.19.0 || >=20.6.0} peerDependencies: '@opentelemetry/api': ^1.3.0 @@ -2428,6 +2479,12 @@ packages: peerDependencies: '@opentelemetry/api': ^1.3.0 + '@opentelemetry/instrumentation@0.204.0': + resolution: {integrity: sha512-vV5+WSxktzoMP8JoYWKeopChy6G3HKk4UQ2hESCRDUUTZqQ3+nM3u8noVG0LmNfRWwcFBnbZ71GKC7vaYYdJ1g==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + '@opentelemetry/instrumentation@0.57.2': resolution: {integrity: sha512-BdBGhQBh8IjZ2oIIX6F2/Q3LKm/FDDKi6ccYKcBTeilh6SNdNKveDOLk73BkSJjQLJk6qe4Yh+hHw1UPhCDdrg==} engines: {node: '>=14'} @@ -3470,8 +3527,8 @@ packages: peerDependencies: react: ^18.0 || ^19.0 || ^19.0.0-rc - '@react-email/components@0.5.1': - resolution: {integrity: sha512-2BxfSZSqMZ6cyQearFIz7h4vZ8m+NiwtZ7PBVdTV7APmK9wxMRBx0rTBO63FV214DTipyPwBjGIcscLh5U+IZg==} + '@react-email/components@0.5.3': + resolution: {integrity: sha512-8G5vsoMehuGOT4cDqaYLdpagtqCYPl4vThXNylClxO6SrN2w9Mh1+i2RNGj/rdqh/woamHORjlXMYCA/kzDMew==} engines: {node: '>=18.0.0'} peerDependencies: react: ^18.0 || ^19.0 || ^19.0.0-rc @@ -3535,8 +3592,8 @@ packages: peerDependencies: react: ^18.0 || ^19.0 || ^19.0.0-rc - '@react-email/render@1.2.1': - resolution: {integrity: sha512-7M4Xi8ITESZKS7pOPE0HWhKJWtS/JrAqPIyFPqIPJXZJHkjFMYXn2b/tAsHOufYW5/LTk4U1IkBMaVwE06kykw==} + '@react-email/render@1.2.3': + resolution: {integrity: sha512-qu3XYNkHGao3teJexVD5CrcgFkNLrzbZvpZN17a7EyQYUN3kHkTkE9saqY4VbvGx6QoNU3p8rsk/Xm++D/+pTw==} engines: {node: '>=18.0.0'} peerDependencies: react: ^18.0 || ^19.0 || ^19.0.0-rc @@ -3849,108 +3906,108 @@ packages: rollup: optional: true - '@rollup/rollup-android-arm-eabi@4.50.0': - resolution: {integrity: sha512-lVgpeQyy4fWN5QYebtW4buT/4kn4p4IJ+kDNB4uYNT5b8c8DLJDg6titg20NIg7E8RWwdWZORW6vUFfrLyG3KQ==} + '@rollup/rollup-android-arm-eabi@4.50.1': + resolution: {integrity: sha512-HJXwzoZN4eYTdD8bVV22DN8gsPCAj3V20NHKOs8ezfXanGpmVPR7kalUHd+Y31IJp9stdB87VKPFbsGY3H/2ag==} cpu: [arm] os: [android] - '@rollup/rollup-android-arm64@4.50.0': - resolution: {integrity: sha512-2O73dR4Dc9bp+wSYhviP6sDziurB5/HCym7xILKifWdE9UsOe2FtNcM+I4xZjKrfLJnq5UR8k9riB87gauiQtw==} + '@rollup/rollup-android-arm64@4.50.1': + resolution: {integrity: sha512-PZlsJVcjHfcH53mOImyt3bc97Ep3FJDXRpk9sMdGX0qgLmY0EIWxCag6EigerGhLVuL8lDVYNnSo8qnTElO4xw==} cpu: [arm64] os: [android] - '@rollup/rollup-darwin-arm64@4.50.0': - resolution: {integrity: sha512-vwSXQN8T4sKf1RHr1F0s98Pf8UPz7pS6P3LG9NSmuw0TVh7EmaE+5Ny7hJOZ0M2yuTctEsHHRTMi2wuHkdS6Hg==} + '@rollup/rollup-darwin-arm64@4.50.1': + resolution: {integrity: sha512-xc6i2AuWh++oGi4ylOFPmzJOEeAa2lJeGUGb4MudOtgfyyjr4UPNK+eEWTPLvmPJIY/pgw6ssFIox23SyrkkJw==} cpu: [arm64] os: [darwin] - '@rollup/rollup-darwin-x64@4.50.0': - resolution: {integrity: sha512-cQp/WG8HE7BCGyFVuzUg0FNmupxC+EPZEwWu2FCGGw5WDT1o2/YlENbm5e9SMvfDFR6FRhVCBePLqj0o8MN7Vw==} + '@rollup/rollup-darwin-x64@4.50.1': + resolution: {integrity: sha512-2ofU89lEpDYhdLAbRdeyz/kX3Y2lpYc6ShRnDjY35bZhd2ipuDMDi6ZTQ9NIag94K28nFMofdnKeHR7BT0CATw==} cpu: [x64] os: [darwin] - '@rollup/rollup-freebsd-arm64@4.50.0': - resolution: {integrity: sha512-UR1uTJFU/p801DvvBbtDD7z9mQL8J80xB0bR7DqW7UGQHRm/OaKzp4is7sQSdbt2pjjSS72eAtRh43hNduTnnQ==} + '@rollup/rollup-freebsd-arm64@4.50.1': + resolution: {integrity: sha512-wOsE6H2u6PxsHY/BeFHA4VGQN3KUJFZp7QJBmDYI983fgxq5Th8FDkVuERb2l9vDMs1D5XhOrhBrnqcEY6l8ZA==} cpu: [arm64] os: [freebsd] - '@rollup/rollup-freebsd-x64@4.50.0': - resolution: {integrity: sha512-G/DKyS6PK0dD0+VEzH/6n/hWDNPDZSMBmqsElWnCRGrYOb2jC0VSupp7UAHHQ4+QILwkxSMaYIbQ72dktp8pKA==} + '@rollup/rollup-freebsd-x64@4.50.1': + resolution: {integrity: sha512-A/xeqaHTlKbQggxCqispFAcNjycpUEHP52mwMQZUNqDUJFFYtPHCXS1VAG29uMlDzIVr+i00tSFWFLivMcoIBQ==} cpu: [x64] os: [freebsd] - '@rollup/rollup-linux-arm-gnueabihf@4.50.0': - resolution: {integrity: sha512-u72Mzc6jyJwKjJbZZcIYmd9bumJu7KNmHYdue43vT1rXPm2rITwmPWF0mmPzLm9/vJWxIRbao/jrQmxTO0Sm9w==} + '@rollup/rollup-linux-arm-gnueabihf@4.50.1': + resolution: {integrity: sha512-54v4okehwl5TaSIkpp97rAHGp7t3ghinRd/vyC1iXqXMfjYUTm7TfYmCzXDoHUPTTf36L8pr0E7YsD3CfB3ZDg==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm-musleabihf@4.50.0': - resolution: {integrity: sha512-S4UefYdV0tnynDJV1mdkNawp0E5Qm2MtSs330IyHgaccOFrwqsvgigUD29uT+B/70PDY1eQ3t40+xf6wIvXJyg==} + '@rollup/rollup-linux-arm-musleabihf@4.50.1': + resolution: {integrity: sha512-p/LaFyajPN/0PUHjv8TNyxLiA7RwmDoVY3flXHPSzqrGcIp/c2FjwPPP5++u87DGHtw+5kSH5bCJz0mvXngYxw==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm64-gnu@4.50.0': - resolution: {integrity: sha512-1EhkSvUQXJsIhk4msxP5nNAUWoB4MFDHhtc4gAYvnqoHlaL9V3F37pNHabndawsfy/Tp7BPiy/aSa6XBYbaD1g==} + '@rollup/rollup-linux-arm64-gnu@4.50.1': + resolution: {integrity: sha512-2AbMhFFkTo6Ptna1zO7kAXXDLi7H9fGTbVaIq2AAYO7yzcAsuTNWPHhb2aTA6GPiP+JXh85Y8CiS54iZoj4opw==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-arm64-musl@4.50.0': - resolution: {integrity: sha512-EtBDIZuDtVg75xIPIK1l5vCXNNCIRM0OBPUG+tbApDuJAy9mKago6QxX+tfMzbCI6tXEhMuZuN1+CU8iDW+0UQ==} + '@rollup/rollup-linux-arm64-musl@4.50.1': + resolution: {integrity: sha512-Cgef+5aZwuvesQNw9eX7g19FfKX5/pQRIyhoXLCiBOrWopjo7ycfB292TX9MDcDijiuIJlx1IzJz3IoCPfqs9w==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-loongarch64-gnu@4.50.0': - resolution: {integrity: sha512-BGYSwJdMP0hT5CCmljuSNx7+k+0upweM2M4YGfFBjnFSZMHOLYR0gEEj/dxyYJ6Zc6AiSeaBY8dWOa11GF/ppQ==} + '@rollup/rollup-linux-loongarch64-gnu@4.50.1': + resolution: {integrity: sha512-RPhTwWMzpYYrHrJAS7CmpdtHNKtt2Ueo+BlLBjfZEhYBhK00OsEqM08/7f+eohiF6poe0YRDDd8nAvwtE/Y62Q==} cpu: [loong64] os: [linux] - '@rollup/rollup-linux-ppc64-gnu@4.50.0': - resolution: {integrity: sha512-I1gSMzkVe1KzAxKAroCJL30hA4DqSi+wGc5gviD0y3IL/VkvcnAqwBf4RHXHyvH66YVHxpKO8ojrgc4SrWAnLg==} + '@rollup/rollup-linux-ppc64-gnu@4.50.1': + resolution: {integrity: sha512-eSGMVQw9iekut62O7eBdbiccRguuDgiPMsw++BVUg+1K7WjZXHOg/YOT9SWMzPZA+w98G+Fa1VqJgHZOHHnY0Q==} cpu: [ppc64] os: [linux] - '@rollup/rollup-linux-riscv64-gnu@4.50.0': - resolution: {integrity: sha512-bSbWlY3jZo7molh4tc5dKfeSxkqnf48UsLqYbUhnkdnfgZjgufLS/NTA8PcP/dnvct5CCdNkABJ56CbclMRYCA==} + '@rollup/rollup-linux-riscv64-gnu@4.50.1': + resolution: {integrity: sha512-S208ojx8a4ciIPrLgazF6AgdcNJzQE4+S9rsmOmDJkusvctii+ZvEuIC4v/xFqzbuP8yDjn73oBlNDgF6YGSXQ==} cpu: [riscv64] os: [linux] - '@rollup/rollup-linux-riscv64-musl@4.50.0': - resolution: {integrity: sha512-LSXSGumSURzEQLT2e4sFqFOv3LWZsEF8FK7AAv9zHZNDdMnUPYH3t8ZlaeYYZyTXnsob3htwTKeWtBIkPV27iQ==} + '@rollup/rollup-linux-riscv64-musl@4.50.1': + resolution: {integrity: sha512-3Ag8Ls1ggqkGUvSZWYcdgFwriy2lWo+0QlYgEFra/5JGtAd6C5Hw59oojx1DeqcA2Wds2ayRgvJ4qxVTzCHgzg==} cpu: [riscv64] os: [linux] - '@rollup/rollup-linux-s390x-gnu@4.50.0': - resolution: {integrity: sha512-CxRKyakfDrsLXiCyucVfVWVoaPA4oFSpPpDwlMcDFQvrv3XY6KEzMtMZrA+e/goC8xxp2WSOxHQubP8fPmmjOQ==} + '@rollup/rollup-linux-s390x-gnu@4.50.1': + resolution: {integrity: sha512-t9YrKfaxCYe7l7ldFERE1BRg/4TATxIg+YieHQ966jwvo7ddHJxPj9cNFWLAzhkVsbBvNA4qTbPVNsZKBO4NSg==} cpu: [s390x] os: [linux] - '@rollup/rollup-linux-x64-gnu@4.50.0': - resolution: {integrity: sha512-8PrJJA7/VU8ToHVEPu14FzuSAqVKyo5gg/J8xUerMbyNkWkO9j2ExBho/68RnJsMGNJq4zH114iAttgm7BZVkA==} + '@rollup/rollup-linux-x64-gnu@4.50.1': + resolution: {integrity: sha512-MCgtFB2+SVNuQmmjHf+wfI4CMxy3Tk8XjA5Z//A0AKD7QXUYFMQcns91K6dEHBvZPCnhJSyDWLApk40Iq/H3tA==} cpu: [x64] os: [linux] - '@rollup/rollup-linux-x64-musl@4.50.0': - resolution: {integrity: sha512-SkE6YQp+CzpyOrbw7Oc4MgXFvTw2UIBElvAvLCo230pyxOLmYwRPwZ/L5lBe/VW/qT1ZgND9wJfOsdy0XptRvw==} + '@rollup/rollup-linux-x64-musl@4.50.1': + resolution: {integrity: sha512-nEvqG+0jeRmqaUMuwzlfMKwcIVffy/9KGbAGyoa26iu6eSngAYQ512bMXuqqPrlTyfqdlB9FVINs93j534UJrg==} cpu: [x64] os: [linux] - '@rollup/rollup-openharmony-arm64@4.50.0': - resolution: {integrity: sha512-PZkNLPfvXeIOgJWA804zjSFH7fARBBCpCXxgkGDRjjAhRLOR8o0IGS01ykh5GYfod4c2yiiREuDM8iZ+pVsT+Q==} + '@rollup/rollup-openharmony-arm64@4.50.1': + resolution: {integrity: sha512-RDsLm+phmT3MJd9SNxA9MNuEAO/J2fhW8GXk62G/B4G7sLVumNFbRwDL6v5NrESb48k+QMqdGbHgEtfU0LCpbA==} cpu: [arm64] os: [openharmony] - '@rollup/rollup-win32-arm64-msvc@4.50.0': - resolution: {integrity: sha512-q7cIIdFvWQoaCbLDUyUc8YfR3Jh2xx3unO8Dn6/TTogKjfwrax9SyfmGGK6cQhKtjePI7jRfd7iRYcxYs93esg==} + '@rollup/rollup-win32-arm64-msvc@4.50.1': + resolution: {integrity: sha512-hpZB/TImk2FlAFAIsoElM3tLzq57uxnGYwplg6WDyAxbYczSi8O2eQ+H2Lx74504rwKtZ3N2g4bCUkiamzS6TQ==} cpu: [arm64] os: [win32] - '@rollup/rollup-win32-ia32-msvc@4.50.0': - resolution: {integrity: sha512-XzNOVg/YnDOmFdDKcxxK410PrcbcqZkBmz+0FicpW5jtjKQxcW1BZJEQOF0NJa6JO7CZhett8GEtRN/wYLYJuw==} + '@rollup/rollup-win32-ia32-msvc@4.50.1': + resolution: {integrity: sha512-SXjv8JlbzKM0fTJidX4eVsH+Wmnp0/WcD8gJxIZyR6Gay5Qcsmdbi9zVtnbkGPG8v2vMR1AD06lGWy5FLMcG7A==} cpu: [ia32] os: [win32] - '@rollup/rollup-win32-x64-msvc@4.50.0': - resolution: {integrity: sha512-xMmiWRR8sp72Zqwjgtf3QbZfF1wdh8X2ABu3EaozvZcyHJeU0r+XAnXdKgs4cCAp6ORoYoCygipYP1mjmbjrsg==} + '@rollup/rollup-win32-x64-msvc@4.50.1': + resolution: {integrity: sha512-StxAO/8ts62KZVRAm4JZYq9+NqNsV7RvimNK+YM7ry//zebEH6meuugqW/P5OFUCjyQgui+9fUxT6d5NShvMvA==} cpu: [x64] os: [win32] @@ -3963,28 +4020,28 @@ packages: '@selderee/plugin-htmlparser2@0.11.0': resolution: {integrity: sha512-P33hHGdldxGabLFjPPpaTxVolMrzrcegejx+0GxjrIb9Zv48D8yAIA/QTDR2dFl7Uz7urX8aX6+5bCZslr+gWQ==} - '@sentry-internal/browser-utils@10.10.0': - resolution: {integrity: sha512-209QN9vsQBwJcS+9DU7B4yl9mb4OqCt2kdL3LYDvqsuOdpICpwfowdK3RMn825Ruf4KLJa0KHM1scQbXZCc4lw==} + '@sentry-internal/browser-utils@10.11.0': + resolution: {integrity: sha512-fnMlz5ntap6x4vRsLOHwPqXh7t82StgAiRt+EaqcMX0t9l8C0w0df8qwrONKXvE5GdHWTNFJj5qR15FERSkg3Q==} engines: {node: '>=18'} - '@sentry-internal/feedback@10.10.0': - resolution: {integrity: sha512-oSU4F/ebOsJA9Eof0me9hLpSDTSelpnEY6gmhU9sHyIG+U7hJRuCfeGICxQOzBtteepWRhAaZEv4s9ZBh3iD2w==} + '@sentry-internal/feedback@10.11.0': + resolution: {integrity: sha512-ADey51IIaa29kepb8B7aSgSGSrcyT7QZdRsN1rhitefzrruHzpSUci5c2EPIvmWfKJq8Wnvukm9BHXZXAAIOzA==} engines: {node: '>=18'} - '@sentry-internal/replay-canvas@10.10.0': - resolution: {integrity: sha512-mJBNB0EBbE3vzL7lgd8lDoWWhRaRwxXdI4Kkx3r39u2+1qTdJP/xHbJDihyemCaw7gRL1FR/GC44JLipzEfkKQ==} + '@sentry-internal/replay-canvas@10.11.0': + resolution: {integrity: sha512-brWQ90IYQyZr44IpTprlmvbtz4l2ABzLdpP94Egh12Onf/q6n4CjLKaA25N5kX0uggHqX1Rs7dNaG0mP3ETHhA==} engines: {node: '>=18'} - '@sentry-internal/replay@10.10.0': - resolution: {integrity: sha512-sKFYWBaft0ET6gd5B0pThR6gYTjaUECXCzVAnSYxy64a2/PK6lV93BtnA1C2Q34Yhv/0scdyIbZtfTnSsEgwUg==} + '@sentry-internal/replay@10.11.0': + resolution: {integrity: sha512-t4M2bxMp2rKGK/l7bkVWjN+xVw9H9V12jAeXmO/Fskz2RcG1ZNLQnKSx/W/zCRMk8k7xOQFsfiApq+zDN+ziKA==} engines: {node: '>=18'} '@sentry/babel-plugin-component-annotate@4.3.0': resolution: {integrity: sha512-OuxqBprXRyhe8Pkfyz/4yHQJc5c3lm+TmYWSSx8u48g5yKewSQDOxkiLU5pAk3WnbLPy8XwU/PN+2BG0YFU9Nw==} engines: {node: '>= 14'} - '@sentry/browser@10.10.0': - resolution: {integrity: sha512-STBs29meUk0CvluIOXXnnRGRtjKsJN9fAHS3dUu3GMjmow4rxKBiBbAwoPYftAVdfvGypT7zQCQ+K30dbRxp0g==} + '@sentry/browser@10.11.0': + resolution: {integrity: sha512-qemaKCJKJHHCyGBpdLq23xL5u9Xvir20XN7YFTnHcEq4Jvj0GoWsslxKi5cQB2JvpYn62WxTiDgVLeQlleZhSg==} engines: {node: '>=18'} '@sentry/bundler-plugin-core@4.3.0': @@ -4043,18 +4100,18 @@ packages: engines: {node: '>= 10'} hasBin: true - '@sentry/core@10.10.0': - resolution: {integrity: sha512-4O1O6my/vYE98ZgfEuLEwOOuHzqqzfBT6IdRo1yiQM7/AXcmSl0H/k4HJtXCiCTiHm+veEuTDBHp0GQZmpIbtA==} + '@sentry/core@10.11.0': + resolution: {integrity: sha512-39Rxn8cDXConx3+SKOCAhW+/hklM7UDaz+U1OFzFMDlT59vXSpfI6bcXtNiFDrbOxlQ2hX8yAqx8YRltgSftoA==} engines: {node: '>=18'} - '@sentry/nextjs@10.10.0': - resolution: {integrity: sha512-Uc9tzuSJvpd48S0Ezt8EgdZl5s7tIJmBXwtUSgmoXK+9P3KHvUBd53tPIK8W6QeUSvKPO19/nBJ/rZ2sydItzQ==} + '@sentry/nextjs@10.11.0': + resolution: {integrity: sha512-oMRmRW982H6kNlUHNij5QAro8Kbi43r3VrcrKtrx7LgjHOUTFUvZmJeynC+T+PcMgLhQNvCC3JgzOhfSqxOChg==} engines: {node: '>=18'} peerDependencies: next: ^13.2.0 || ^14.0 || ^15.0.0-rc.0 - '@sentry/node-core@10.10.0': - resolution: {integrity: sha512-7jHM1Is0Si737SVA0sHPg7lj7OmKoNM+f7+E3ySvtHIUeSINZBLM6jg1q57R1kIg8eavpHXudYljRMpuv/8bYA==} + '@sentry/node-core@10.11.0': + resolution: {integrity: sha512-dkVZ06F+W5W0CsD47ATTTOTTocmccT/ezrF9idspQq+HVOcjoKSU60WpWo22NjtVNdSYKLnom0q1LKRoaRA/Ww==} engines: {node: '>=18'} peerDependencies: '@opentelemetry/api': ^1.9.0 @@ -4065,12 +4122,12 @@ packages: '@opentelemetry/sdk-trace-base': ^1.30.1 || ^2.0.0 '@opentelemetry/semantic-conventions': ^1.34.0 - '@sentry/node@10.10.0': - resolution: {integrity: sha512-GdI/ELIipKhdL8gdvnRLtz1ItPzAXRCZrvTwGMd5C+kDRALakQIR7pONC9nf5TKCG2UaslHEX+2XDImorhM7OA==} + '@sentry/node@10.11.0': + resolution: {integrity: sha512-Tbcjr3iQAEjYi7/QIpdS8afv/LU1TwDTiy5x87MSpVEoeFcZ7f2iFC4GV0fhB3p4qDuFdL2JGVsIIrzapp8Y4A==} engines: {node: '>=18'} - '@sentry/opentelemetry@10.10.0': - resolution: {integrity: sha512-EQ5/1Ps4n1JosmaDiFCyb5iByjjKja2pnmeMiLzTDZ5Zikjs/3GKzmh+SgTRFLOm6yKgQps0GdiCH2gxdrbONg==} + '@sentry/opentelemetry@10.11.0': + resolution: {integrity: sha512-BY2SsVlRKICzNUO9atUy064BZqYnhV5A/O+JjEx0kj7ylq+oZd++zmGkks00rSwaJE220cVcVhpwqxcFUpc2hw==} engines: {node: '>=18'} peerDependencies: '@opentelemetry/api': ^1.9.0 @@ -4079,14 +4136,14 @@ packages: '@opentelemetry/sdk-trace-base': ^1.30.1 || ^2.0.0 '@opentelemetry/semantic-conventions': ^1.34.0 - '@sentry/react@10.10.0': - resolution: {integrity: sha512-wfYq9W36uKBwaxwy3II/LXjs5XCAQ9MZz7OmkDvKhL9ly3YupnOua5DaFcNdlLmePuYVqOfEk2lBCJBj9FliOg==} + '@sentry/react@10.11.0': + resolution: {integrity: sha512-bE4lJ5Ni/n9JUdLWGG99yucY0/zOUXjKl9gfSTkvUvOiAIX/bY0Y4WgOqeWySvbMz679ZdOwF34k8RA/gI7a8g==} engines: {node: '>=18'} peerDependencies: react: ^16.14.0 || 17.x || 18.x || 19.x - '@sentry/vercel-edge@10.10.0': - resolution: {integrity: sha512-PYqpUFGUdVpIjhxRQZdC9ixisKlKe5Pez/12IBP+G2wNDy3Fz7MW5zhDgOdGuvjE/Zss59jn/bytfKEh3JQ3Uw==} + '@sentry/vercel-edge@10.11.0': + resolution: {integrity: sha512-jAsJ8RbbF2JWj2wnXfd6BwWxCR6GBITMtlaoWc7pG22HknEtoH15dKsQC3Ew5r/KRcofr2e+ywdnBn5CPr1Pbg==} engines: {node: '>=18'} '@sentry/webpack-plugin@4.3.0': @@ -4103,32 +4160,32 @@ packages: resolution: {integrity: sha512-5/kmIOY9FF32nicXH+5yLNTX4NJ4atl7jRgqAJuIn/iyDFXBktOKDxCvyGE/EzmF4ngSUvjXxQUQlQiZ5lfw+w==} engines: {node: '>=10'} - '@smithy/abort-controller@4.1.0': - resolution: {integrity: sha512-wEhSYznxOmx7EdwK1tYEWJF5+/wmSFsff9BfTOn8oO/+KPl3gsmThrb6MJlWbOC391+Ya31s5JuHiC2RlT80Zg==} + '@smithy/abort-controller@4.1.1': + resolution: {integrity: sha512-vkzula+IwRvPR6oKQhMYioM3A/oX/lFCZiwuxkQbRhqJS2S4YRY2k7k/SyR2jMf3607HLtbEwlRxi0ndXHMjRg==} engines: {node: '>=18.0.0'} - '@smithy/config-resolver@4.2.0': - resolution: {integrity: sha512-FA10YhPFLy23uxeWu7pOM2ctlw+gzbPMTZQwrZ8FRIfyJ/p8YIVz7AVTB5jjLD+QIerydyKcVMZur8qzzDILAQ==} + '@smithy/config-resolver@4.2.1': + resolution: {integrity: sha512-FXil8q4QN7mgKwU2hCLm0ltab8NyY/1RiqEf25Jnf6WLS3wmb11zGAoLETqg1nur2Aoibun4w4MjeN9CMJ4G6A==} engines: {node: '>=18.0.0'} - '@smithy/core@3.10.0': - resolution: {integrity: sha512-bXyD3Ij6b1qDymEYlEcF+QIjwb9gObwZNaRjETJsUEvSIzxFdynSQ3E4ysY7lUFSBzeWBNaFvX+5A0smbC2q6A==} + '@smithy/core@3.11.0': + resolution: {integrity: sha512-Abs5rdP1o8/OINtE49wwNeWuynCu0kme1r4RI3VXVrHr4odVDG7h7mTnw1WXXfN5Il+c25QOnrdL2y56USfxkA==} engines: {node: '>=18.0.0'} - '@smithy/credential-provider-imds@4.1.0': - resolution: {integrity: sha512-iVwNhxTsCQTPdp++4C/d9xvaDmuEWhXi55qJobMp9QMaEHRGH3kErU4F8gohtdsawRqnUy/ANylCjKuhcR2mPw==} + '@smithy/credential-provider-imds@4.1.1': + resolution: {integrity: sha512-1WdBfM9DwA59pnpIizxnUvBf/de18p4GP+6zP2AqrlFzoW3ERpZaT4QueBR0nS9deDMaQRkBlngpVlnkuuTisQ==} engines: {node: '>=18.0.0'} - '@smithy/fetch-http-handler@5.2.0': - resolution: {integrity: sha512-VZenjDdVaUGiy3hwQtxm75nhXZrhFG+3xyL93qCQAlYDyhT/jeDWM8/3r5uCFMlTmmyrIjiDyiOynVFchb0BSg==} + '@smithy/fetch-http-handler@5.2.1': + resolution: {integrity: sha512-5/3wxKNtV3wO/hk1is+CZUhL8a1yy/U+9u9LKQ9kZTkMsHaQjJhc3stFfiujtMnkITjzWfndGA2f7g9Uh9vKng==} engines: {node: '>=18.0.0'} - '@smithy/hash-node@4.1.0': - resolution: {integrity: sha512-mXkJQ/6lAXTuoSsEH+d/fHa4ms4qV5LqYoPLYhmhCRTNcMMdg+4Ya8cMgU1W8+OR40eX0kzsExT7fAILqtTl2w==} + '@smithy/hash-node@4.1.1': + resolution: {integrity: sha512-H9DIU9WBLhYrvPs9v4sYvnZ1PiAI0oc8CgNQUJ1rpN3pP7QADbTOUjchI2FB764Ub0DstH5xbTqcMJu1pnVqxA==} engines: {node: '>=18.0.0'} - '@smithy/invalid-dependency@4.1.0': - resolution: {integrity: sha512-4/FcV6aCMzgpM4YyA/GRzTtG28G0RQJcWK722MmpIgzOyfSceWcI9T9c8matpHU9qYYLaWtk8pSGNCLn5kzDRw==} + '@smithy/invalid-dependency@4.1.1': + resolution: {integrity: sha512-1AqLyFlfrrDkyES8uhINRlJXmHA2FkG+3DY8X+rmLSqmFwk3DJnvhyGzyByPyewh2jbmV+TYQBEfngQax8IFGg==} engines: {node: '>=18.0.0'} '@smithy/is-array-buffer@2.2.0': @@ -4139,72 +4196,72 @@ packages: resolution: {integrity: sha512-ePTYUOV54wMogio+he4pBybe8fwg4sDvEVDBU8ZlHOZXbXK3/C0XfJgUCu6qAZcawv05ZhZzODGUerFBPsPUDQ==} engines: {node: '>=18.0.0'} - '@smithy/middleware-content-length@4.1.0': - resolution: {integrity: sha512-x3dgLFubk/ClKVniJu+ELeZGk4mq7Iv0HgCRUlxNUIcerHTLVmq7Q5eGJL0tOnUltY6KFw5YOKaYxwdcMwox/w==} + '@smithy/middleware-content-length@4.1.1': + resolution: {integrity: sha512-9wlfBBgTsRvC2JxLJxv4xDGNBrZuio3AgSl0lSFX7fneW2cGskXTYpFxCdRYD2+5yzmsiTuaAJD1Wp7gWt9y9w==} engines: {node: '>=18.0.0'} - '@smithy/middleware-endpoint@4.2.0': - resolution: {integrity: sha512-J1eCF7pPDwgv7fGwRd2+Y+H9hlIolF3OZ2PjptonzzyOXXGh/1KGJAHpEcY1EX+WLlclKu2yC5k+9jWXdUG4YQ==} + '@smithy/middleware-endpoint@4.2.1': + resolution: {integrity: sha512-fUTMmQvQQZakXOuKizfu7fBLDpwvWZjfH6zUK2OLsoNZRZGbNUdNSdLJHpwk1vS208jtDjpUIskh+JoA8zMzZg==} engines: {node: '>=18.0.0'} - '@smithy/middleware-retry@4.2.0': - resolution: {integrity: sha512-raL5oWYf5ALl3jCJrajE8enKJEnV/2wZkKS6mb3ZRY2tg3nj66ssdWy5Ps8E6Yu8Wqh3Tt+Sb9LozjvwZupq+A==} + '@smithy/middleware-retry@4.2.1': + resolution: {integrity: sha512-JzfvjwSJXWRl7LkLgIRTUTd2Wj639yr3sQGpViGNEOjtb0AkAuYqRAHs+jSOI/LPC0ZTjmFVVtfrCICMuebexw==} engines: {node: '>=18.0.0'} - '@smithy/middleware-serde@4.1.0': - resolution: {integrity: sha512-CtLFYlHt7c2VcztyVRc+25JLV4aGpmaSv9F1sPB0AGFL6S+RPythkqpGDa2XBQLJQooKkjLA1g7Xe4450knShg==} + '@smithy/middleware-serde@4.1.1': + resolution: {integrity: sha512-lh48uQdbCoj619kRouev5XbWhCwRKLmphAif16c4J6JgJ4uXjub1PI6RL38d3BLliUvSso6klyB/LTNpWSNIyg==} engines: {node: '>=18.0.0'} - '@smithy/middleware-stack@4.1.0': - resolution: {integrity: sha512-91Fuw4IKp0eK8PNhMXrHRcYA1jvbZ9BJGT91wwPy3bTQT8mHTcQNius/EhSQTlT9QUI3Ki1wjHeNXbWK0tO8YQ==} + '@smithy/middleware-stack@4.1.1': + resolution: {integrity: sha512-ygRnniqNcDhHzs6QAPIdia26M7e7z9gpkIMUe/pK0RsrQ7i5MblwxY8078/QCnGq6AmlUUWgljK2HlelsKIb/A==} engines: {node: '>=18.0.0'} - '@smithy/node-config-provider@4.2.0': - resolution: {integrity: sha512-8/fpilqKurQ+f8nFvoFkJ0lrymoMJ+5/CQV5IcTv/MyKhk2Q/EFYCAgTSWHD4nMi9ux9NyBBynkyE9SLg2uSLA==} + '@smithy/node-config-provider@4.2.1': + resolution: {integrity: sha512-AIA0BJZq2h295J5NeCTKhg1WwtdTA/GqBCaVjk30bDgMHwniUETyh5cP9IiE9VrId7Kt8hS7zvREVMTv1VfA6g==} engines: {node: '>=18.0.0'} - '@smithy/node-http-handler@4.2.0': - resolution: {integrity: sha512-G4NV70B4hF9vBrUkkvNfWO6+QR4jYjeO4tc+4XrKCb4nPYj49V9Hu8Ftio7Mb0/0IlFyEOORudHrm+isY29nCA==} + '@smithy/node-http-handler@4.2.1': + resolution: {integrity: sha512-REyybygHlxo3TJICPF89N2pMQSf+p+tBJqpVe1+77Cfi9HBPReNjTgtZ1Vg73exq24vkqJskKDpfF74reXjxfw==} engines: {node: '>=18.0.0'} - '@smithy/property-provider@4.1.0': - resolution: {integrity: sha512-eksMjMHUlG5PwOUWO3k+rfLNOPVPJ70mUzyYNKb5lvyIuAwS4zpWGsxGiuT74DFWonW0xRNy+jgzGauUzX7SyA==} + '@smithy/property-provider@4.1.1': + resolution: {integrity: sha512-gm3ZS7DHxUbzC2wr8MUCsAabyiXY0gaj3ROWnhSx/9sPMc6eYLMM4rX81w1zsMaObj2Lq3PZtNCC1J6lpEY7zg==} engines: {node: '>=18.0.0'} - '@smithy/protocol-http@5.2.0': - resolution: {integrity: sha512-bwjlh5JwdOQnA01be+5UvHK4HQz4iaRKlVG46hHSJuqi0Ribt3K06Z1oQ29i35Np4G9MCDgkOGcHVyLMreMcbg==} + '@smithy/protocol-http@5.2.1': + resolution: {integrity: sha512-T8SlkLYCwfT/6m33SIU/JOVGNwoelkrvGjFKDSDtVvAXj/9gOT78JVJEas5a+ETjOu4SVvpCstKgd0PxSu/aHw==} engines: {node: '>=18.0.0'} - '@smithy/querystring-builder@4.1.0': - resolution: {integrity: sha512-JqTWmVIq4AF8R8OK/2cCCiQo5ZJ0SRPsDkDgLO5/3z8xxuUp1oMIBBjfuueEe+11hGTZ6rRebzYikpKc6yQV9Q==} + '@smithy/querystring-builder@4.1.1': + resolution: {integrity: sha512-J9b55bfimP4z/Jg1gNo+AT84hr90p716/nvxDkPGCD4W70MPms0h8KF50RDRgBGZeL83/u59DWNqJv6tEP/DHA==} engines: {node: '>=18.0.0'} - '@smithy/querystring-parser@4.1.0': - resolution: {integrity: sha512-VgdHhr8YTRsjOl4hnKFm7xEMOCRTnKw3FJ1nU+dlWNhdt/7eEtxtkdrJdx7PlRTabdANTmvyjE4umUl9cK4awg==} + '@smithy/querystring-parser@4.1.1': + resolution: {integrity: sha512-63TEp92YFz0oQ7Pj9IuI3IgnprP92LrZtRAkE3c6wLWJxfy/yOPRt39IOKerVr0JS770olzl0kGafXlAXZ1vng==} engines: {node: '>=18.0.0'} - '@smithy/service-error-classification@4.1.0': - resolution: {integrity: sha512-UBpNFzBNmS20jJomuYn++Y+soF8rOK9AvIGjS9yGP6uRXF5rP18h4FDUsoNpWTlSsmiJ87e2DpZo9ywzSMH7PQ==} + '@smithy/service-error-classification@4.1.1': + resolution: {integrity: sha512-Iam75b/JNXyDE41UvrlM6n8DNOa/r1ylFyvgruTUx7h2Uk7vDNV9AAwP1vfL1fOL8ls0xArwEGVcGZVd7IO/Cw==} engines: {node: '>=18.0.0'} - '@smithy/shared-ini-file-loader@4.1.0': - resolution: {integrity: sha512-W0VMlz9yGdQ/0ZAgWICFjFHTVU0YSfGoCVpKaExRM/FDkTeP/yz8OKvjtGjs6oFokCRm0srgj/g4Cg0xuHu8Rw==} + '@smithy/shared-ini-file-loader@4.1.1': + resolution: {integrity: sha512-YkpikhIqGc4sfXeIbzSj10t2bJI/sSoP5qxLue6zG+tEE3ngOBSm8sO3+djacYvS/R5DfpxN/L9CyZsvwjWOAQ==} engines: {node: '>=18.0.0'} - '@smithy/signature-v4@5.2.0': - resolution: {integrity: sha512-ObX1ZqG2DdZQlXx9mLD7yAR8AGb7yXurGm+iWx9x4l1fBZ8CZN2BRT09aSbcXVPZXWGdn5VtMuupjxhOTI2EjA==} + '@smithy/signature-v4@5.2.1': + resolution: {integrity: sha512-M9rZhWQLjlQVCCR37cSjHfhriGRN+FQ8UfgrYNufv66TJgk+acaggShl3KS5U/ssxivvZLlnj7QH2CUOKlxPyA==} engines: {node: '>=18.0.0'} - '@smithy/smithy-client@4.6.0': - resolution: {integrity: sha512-TvlIshqx5PIi0I0AiR+PluCpJ8olVG++xbYkAIGCUkByaMUlfOXLgjQTmYbr46k4wuDe8eHiTIlUflnjK2drPQ==} + '@smithy/smithy-client@4.6.1': + resolution: {integrity: sha512-WolVLDb9UTPMEPPOncrCt6JmAMCSC/V2y5gst2STWJ5r7+8iNac+EFYQnmvDCYMfOLcilOSEpm5yXZXwbLak1Q==} engines: {node: '>=18.0.0'} - '@smithy/types@4.4.0': - resolution: {integrity: sha512-4jY91NgZz+ZnSFcVzWwngOW6VuK3gR/ihTwSU1R/0NENe9Jd8SfWgbhDCAGUWL3bI7DiDSW7XF6Ui6bBBjrqXw==} + '@smithy/types@4.5.0': + resolution: {integrity: sha512-RkUpIOsVlAwUIZXO1dsz8Zm+N72LClFfsNqf173catVlvRZiwPy0x2u0JLEA4byreOPKDZPGjmPDylMoP8ZJRg==} engines: {node: '>=18.0.0'} - '@smithy/url-parser@4.1.0': - resolution: {integrity: sha512-/LYEIOuO5B2u++tKr1NxNxhZTrr3A63jW8N73YTwVeUyAlbB/YM+hkftsvtKAcMt3ADYo0FsF1GY3anehffSVQ==} + '@smithy/url-parser@4.1.1': + resolution: {integrity: sha512-bx32FUpkhcaKlEoOMbScvc93isaSiRM75pQ5IgIBaMkT7qMlIibpPRONyx/0CvrXHzJLpOn/u6YiDX2hcvs7Dg==} engines: {node: '>=18.0.0'} '@smithy/util-base64@4.1.0': @@ -4231,32 +4288,32 @@ packages: resolution: {integrity: sha512-swXz2vMjrP1ZusZWVTB/ai5gK+J8U0BWvP10v9fpcFvg+Xi/87LHvHfst2IgCs1i0v4qFZfGwCmeD/KNCdJZbQ==} engines: {node: '>=18.0.0'} - '@smithy/util-defaults-mode-browser@4.1.0': - resolution: {integrity: sha512-D27cLtJtC4EEeERJXS+JPoogz2tE5zeE3zhWSSu6ER5/wJ5gihUxIzoarDX6K1U27IFTHit5YfHqU4Y9RSGE0w==} + '@smithy/util-defaults-mode-browser@4.1.1': + resolution: {integrity: sha512-hA1AKIHFUMa9Tl6q6y8p0pJ9aWHCCG8s57flmIyLE0W7HcJeYrYtnqXDcGnftvXEhdQnSexyegXnzzTGk8bKLA==} engines: {node: '>=18.0.0'} - '@smithy/util-defaults-mode-node@4.1.0': - resolution: {integrity: sha512-gnZo3u5dP1o87plKupg39alsbeIY1oFFnCyV2nI/++pL19vTtBLgOyftLEjPjuXmoKn2B2rskX8b7wtC/+3Okg==} + '@smithy/util-defaults-mode-node@4.1.1': + resolution: {integrity: sha512-RGSpmoBrA+5D2WjwtK7tto6Pc2wO9KSXKLpLONhFZ8VyuCbqlLdiDAfuDTNY9AJe4JoE+Cx806cpTQQoQ71zPQ==} engines: {node: '>=18.0.0'} - '@smithy/util-endpoints@3.1.0': - resolution: {integrity: sha512-5LFg48KkunBVGrNs3dnQgLlMXJLVo7k9sdZV5su3rjO3c3DmQ2LwUZI0Zr49p89JWK6sB7KmzyI2fVcDsZkwuw==} + '@smithy/util-endpoints@3.1.1': + resolution: {integrity: sha512-qB4R9kO0SetA11Rzu6MVGFIaGYX3p6SGGGfWwsKnC6nXIf0n/0AKVwRTsYsz9ToN8CeNNtNgQRwKFBndGJZdyw==} engines: {node: '>=18.0.0'} '@smithy/util-hex-encoding@4.1.0': resolution: {integrity: sha512-1LcueNN5GYC4tr8mo14yVYbh/Ur8jHhWOxniZXii+1+ePiIbsLZ5fEI0QQGtbRRP5mOhmooos+rLmVASGGoq5w==} engines: {node: '>=18.0.0'} - '@smithy/util-middleware@4.1.0': - resolution: {integrity: sha512-612onNcKyxhP7/YOTKFTb2F6sPYtMRddlT5mZvYf1zduzaGzkYhpYIPxIeeEwBZFjnvEqe53Ijl2cYEfJ9d6/Q==} + '@smithy/util-middleware@4.1.1': + resolution: {integrity: sha512-CGmZ72mL29VMfESz7S6dekqzCh8ZISj3B+w0g1hZFXaOjGTVaSqfAEFAq8EGp8fUL+Q2l8aqNmt8U1tglTikeg==} engines: {node: '>=18.0.0'} - '@smithy/util-retry@4.1.0': - resolution: {integrity: sha512-5AGoBHb207xAKSVwaUnaER+L55WFY8o2RhlafELZR3mB0J91fpL+Qn+zgRkPzns3kccGaF2vy0HmNVBMWmN6dA==} + '@smithy/util-retry@4.1.1': + resolution: {integrity: sha512-jGeybqEZ/LIordPLMh5bnmnoIgsqnp4IEimmUp5c5voZ8yx+5kAlN5+juyr7p+f7AtZTgvhmInQk4Q0UVbrZ0Q==} engines: {node: '>=18.0.0'} - '@smithy/util-stream@4.3.0': - resolution: {integrity: sha512-ZOYS94jksDwvsCJtppHprUhsIscRnCKGr6FXCo3SxgQ31ECbza3wqDBqSy6IsAak+h/oAXb1+UYEBmDdseAjUQ==} + '@smithy/util-stream@4.3.1': + resolution: {integrity: sha512-khKkW/Jqkgh6caxMWbMuox9+YfGlsk9OnHOYCGVEdYQb/XVzcORXHLYUubHmmda0pubEDncofUrPNniS9d+uAA==} engines: {node: '>=18.0.0'} '@smithy/util-uri-escape@4.1.0': @@ -4277,8 +4334,8 @@ packages: '@standard-schema/utils@0.3.0': resolution: {integrity: sha512-e7Mew686owMaPJVNNLs55PUvgz371nKgwsc4vxE49zsODpJEnxgxRo2y/OKrqueavXgZNMDVj3DdHFlaSAeU8g==} - '@stripe/react-stripe-js@4.0.0': - resolution: {integrity: sha512-bsvABsGzdfXMD914fUNlse3QJMqQzOC1522KEO6lbYUAX6lgzqZ5h2vgVRqQc3hAIChukWfrVt9qpKzqn2JHpw==} + '@stripe/react-stripe-js@4.0.2': + resolution: {integrity: sha512-l2wau+8/LOlHl+Sz8wQ1oDuLJvyw51nQCsu6/ljT6smqzTszcMHifjAJoXlnMfcou3+jK/kQyVe04u/ufyTXgg==} peerDependencies: '@stripe/stripe-js': '>=1.44.1 <8.0.0' react: '>=16.8.0 <20.0.0' @@ -4291,15 +4348,15 @@ packages: '@supabase/auth-js@2.71.1': resolution: {integrity: sha512-mMIQHBRc+SKpZFRB2qtupuzulaUhFYupNyxqDj5Jp/LyPvcWvjaJzZzObv6URtL/O6lPxkanASnotGtNpS3H2Q==} - '@supabase/functions-js@2.4.5': - resolution: {integrity: sha512-v5GSqb9zbosquTo6gBwIiq7W9eQ7rE5QazsK/ezNiQXdCbY+bH8D9qEaBIkhVvX4ZRW5rP03gEfw5yw9tiq4EQ==} + '@supabase/functions-js@2.4.6': + resolution: {integrity: sha512-bhjZ7rmxAibjgmzTmQBxJU6ZIBCCJTc3Uwgvdi4FewueUTAGO5hxZT1Sj6tiD+0dSXf9XI87BDdJrg12z8Uaew==} '@supabase/node-fetch@2.6.15': resolution: {integrity: sha512-1ibVeYUacxWYi9i0cf5efil6adJ9WRyZBLivgjs+AUpewx1F3xPi7gLgaASI2SmIQxPoCEjAsLAzKPgMJVgOUQ==} engines: {node: 4.x || >=6.0.0} - '@supabase/postgrest-js@1.21.3': - resolution: {integrity: sha512-rg3DmmZQKEVCreXq6Am29hMVe1CzemXyIWVYyyua69y6XubfP+DzGfLxME/1uvdgwqdoaPbtjBDpEBhqxq1ZwA==} + '@supabase/postgrest-js@1.21.4': + resolution: {integrity: sha512-TxZCIjxk6/dP9abAi89VQbWWMBbybpGWyvmIzTd79OeravM13OjR/YEYeyUOPcM1C3QyvXkvPZhUfItvmhY1IQ==} '@supabase/realtime-js@2.15.5': resolution: {integrity: sha512-/Rs5Vqu9jejRD8ZeuaWXebdkH+J7V6VySbCZ/zQM93Ta5y3mAmocjioa/nzlB6qvFmyylUgKVS1KpE212t30OA==} @@ -4309,11 +4366,11 @@ packages: peerDependencies: '@supabase/supabase-js': ^2.43.4 - '@supabase/storage-js@2.11.1': - resolution: {integrity: sha512-kaKCJZcZrHDCO9L76bEPzNv2caCStOigOUioHw7CvdEzvcSKjVuomRfN2Y9EqXmJH4tEHoBi3tCs/Ye2e3HwDw==} + '@supabase/storage-js@2.12.1': + resolution: {integrity: sha512-QWg3HV6Db2J81VQx0PqLq0JDBn4Q8B1FYn1kYcbla8+d5WDmTdwwMr+EJAxNOSs9W4mhKMv+EYCpCrTFlTj4VQ==} - '@supabase/supabase-js@2.57.2': - resolution: {integrity: sha512-MxaZqZKUPK1ExzOilgSZqCPCxVPjevUrh6bcWz1SrDZexFc9VJ2cJbVP1EG1hKQx/bfLdTUjIZMoIrYpYqAPYw==} + '@supabase/supabase-js@2.57.4': + resolution: {integrity: sha512-LcbTzFhHYdwfQ7TRPfol0z04rLEyHabpGYANME6wkQ/kLtKNmI+Vy+WEM8HxeOZAtByUFxoUTTLwhXmrh+CcVw==} '@swc/helpers@0.5.15': resolution: {integrity: sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==} @@ -4409,11 +4466,11 @@ packages: '@tailwindcss/postcss@4.1.13': resolution: {integrity: sha512-HLgx6YSFKJT7rJqh9oJs/TkBFhxuMOfUKSBEPYwV+t78POOBsdQ7crhZLzwcH3T0UyUuOzU/GK5pk5eKr3wCiQ==} - '@tanstack/query-core@5.87.1': - resolution: {integrity: sha512-HOFHVvhOCprrWvtccSzc7+RNqpnLlZ5R6lTmngb8aq7b4rc2/jDT0w+vLdQ4lD9bNtQ+/A4GsFXy030Gk4ollA==} + '@tanstack/query-core@5.89.0': + resolution: {integrity: sha512-joFV1MuPhSLsKfTzwjmPDrp8ENfZ9N23ymFu07nLfn3JCkSHy0CFgsyhHTJOmWaumC/WiNIKM0EJyduCF/Ih/Q==} - '@tanstack/react-query@5.87.1': - resolution: {integrity: sha512-YKauf8jfMowgAqcxj96AHs+Ux3m3bWT1oSVKamaRPXSnW2HqSznnTCEkAVqctF1e/W9R/mPcyzzINIgpOH94qg==} + '@tanstack/react-query@5.89.0': + resolution: {integrity: sha512-SXbtWSTSRXyBOe80mszPxpEbaN4XPRUp/i0EfQK1uyj3KCk/c8FuPJNIRwzOVe/OU3rzxrYtiNabsAmk1l714A==} peerDependencies: react: ^18 || ^19 @@ -4477,8 +4534,8 @@ packages: resolution: {integrity: sha512-TmY25GmxzgX+395Fwl/F0te6S4RHdJtYl1QjZr+wlxVvKJ0IBOACpnpAvnLM3dpTgXuQukGtSWcRz7Zi9mZqcQ==} hasBin: true - '@tybys/wasm-util@0.10.0': - resolution: {integrity: sha512-VyyPYFlOMNylG45GoAe0xDoLwWuowvf92F9kySqzYh8vmYm7D2u4iUJKa1tOUpS70Ku13ASrOkS4ScXFsTaCNQ==} + '@tybys/wasm-util@0.10.1': + resolution: {integrity: sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==} '@types/connect@3.4.38': resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} @@ -4568,8 +4625,8 @@ packages: '@types/mysql@2.15.27': resolution: {integrity: sha512-YfWiV16IY0OeBfBCk8+hXKmdTKrKlwKN1MNKAPBu5JYxLwBEZl7QzeEpGnlZb3VMGJrrGmB84gXiH+ofs/TezA==} - '@types/node@24.3.1': - resolution: {integrity: sha512-3vXmQDXy+woz+gnrTvuvNrPzekOi+Ds0ReMxw0LzBiK3a+1k0kQn9f2NWk+lgD4rJehFUmYy2gMhJ2ZI+7YP9g==} + '@types/node@24.5.0': + resolution: {integrity: sha512-y1dMvuvJspJiPSDZUQ+WMBvF7dpnEqN4x9DDC9ie5Fs/HUZJA3wFp7EhHoVaKX/iI0cRoECV8X2jL8zi0xrHCg==} '@types/nodemailer@7.0.1': resolution: {integrity: sha512-UfHAghPmGZVzaL8x9y+mKZMWyHC399+iq0MOmya5tIyenWX3lcdSb60vOmp0DocR6gCDTYTozv/ULQnREyyjkg==} @@ -4591,8 +4648,8 @@ packages: peerDependencies: '@types/react': ^19.0.0 - '@types/react@19.1.12': - resolution: {integrity: sha512-cMoR+FoAf/Jyq6+Df2/Z41jISvGZZ2eTlnsaJRptmZ76Caldwy1odD4xTr/gNV9VLj0AWgg/nmkevIyUfIIq5w==} + '@types/react@19.1.13': + resolution: {integrity: sha512-hHkbU/eoO3EG5/MZkuFSKmYqPbSVk5byPFa3e7y/8TybHiLMACgI8seVYlicwk7H5K/rI2px9xrQp/C+AUDTiQ==} '@types/shimmer@1.2.0': resolution: {integrity: sha512-UE7oxhQLLd9gub6JKIAhDq06T0F6FnztwMNRvYgjeQSBeMc1ZG/tA47EwfduvkuQS8apbkM/lpLpWsaCeYsXVg==} @@ -4618,63 +4675,122 @@ packages: '@types/ws@8.18.1': resolution: {integrity: sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==} - '@typescript-eslint/eslint-plugin@8.42.0': - resolution: {integrity: sha512-Aq2dPqsQkxHOLfb2OPv43RnIvfj05nw8v/6n3B2NABIPpHnjQnaLo9QGMTvml+tv4korl/Cjfrb/BYhoL8UUTQ==} + '@typescript-eslint/eslint-plugin@8.43.0': + resolution: {integrity: sha512-8tg+gt7ENL7KewsKMKDHXR1vm8tt9eMxjJBYINf6swonlWgkYn5NwyIgXpbbDxTNU5DgpDFfj95prcTq2clIQQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - '@typescript-eslint/parser': ^8.42.0 + '@typescript-eslint/parser': ^8.43.0 eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/parser@8.42.0': - resolution: {integrity: sha512-r1XG74QgShUgXph1BYseJ+KZd17bKQib/yF3SR+demvytiRXrwd12Blnz5eYGm8tXaeRdd4x88MlfwldHoudGg==} + '@typescript-eslint/eslint-plugin@8.44.0': + resolution: {integrity: sha512-EGDAOGX+uwwekcS0iyxVDmRV9HX6FLSM5kzrAToLTsr9OWCIKG/y3lQheCq18yZ5Xh78rRKJiEpP0ZaCs4ryOQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + '@typescript-eslint/parser': ^8.44.0 + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <6.0.0' + + '@typescript-eslint/parser@8.43.0': + resolution: {integrity: sha512-B7RIQiTsCBBmY+yW4+ILd6mF5h1FUwJsVvpqkrgpszYifetQ2Ke+Z4u6aZh0CblkUGIdR59iYVyXqqZGkZ3aBw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/project-service@8.42.0': - resolution: {integrity: sha512-vfVpLHAhbPjilrabtOSNcUDmBboQNrJUiNAGoImkZKnMjs2TIcWG33s4Ds0wY3/50aZmTMqJa6PiwkwezaAklg==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - typescript: '>=4.8.4 <6.0.0' - - '@typescript-eslint/scope-manager@8.42.0': - resolution: {integrity: sha512-51+x9o78NBAVgQzOPd17DkNTnIzJ8T/O2dmMBLoK9qbY0Gm52XJcdJcCl18ExBMiHo6jPMErUQWUv5RLE51zJw==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@typescript-eslint/tsconfig-utils@8.42.0': - resolution: {integrity: sha512-kHeFUOdwAJfUmYKjR3CLgZSglGHjbNTi1H8sTYRYV2xX6eNz4RyJ2LIgsDLKf8Yi0/GL1WZAC/DgZBeBft8QAQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - typescript: '>=4.8.4 <6.0.0' - - '@typescript-eslint/type-utils@8.42.0': - resolution: {integrity: sha512-9KChw92sbPTYVFw3JLRH1ockhyR3zqqn9lQXol3/YbI6jVxzWoGcT3AsAW0mu1MY0gYtsXnUGV/AKpkAj5tVlQ==} + '@typescript-eslint/parser@8.44.0': + resolution: {integrity: sha512-VGMpFQGUQWYT9LfnPcX8ouFojyrZ/2w3K5BucvxL/spdNehccKhB4jUyB1yBCXpr2XFm0jkECxgrpXBW2ipoAw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/types@8.42.0': - resolution: {integrity: sha512-LdtAWMiFmbRLNP7JNeY0SqEtJvGMYSzfiWBSmx+VSZ1CH+1zyl8Mmw1TT39OrtsRvIYShjJWzTDMPWZJCpwBlw==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@typescript-eslint/typescript-estree@8.42.0': - resolution: {integrity: sha512-ku/uYtT4QXY8sl9EDJETD27o3Ewdi72hcXg1ah/kkUgBvAYHLwj2ofswFFNXS+FL5G+AGkxBtvGt8pFBHKlHsQ==} + '@typescript-eslint/project-service@8.43.0': + resolution: {integrity: sha512-htB/+D/BIGoNTQYffZw4uM4NzzuolCoaA/BusuSIcC8YjmBYQioew5VUZAYdAETPjeed0hqCaW7EHg+Robq8uw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/utils@8.42.0': - resolution: {integrity: sha512-JnIzu7H3RH5BrKC4NoZqRfmjqCIS1u3hGZltDYJgkVdqAezl4L9d1ZLw+36huCujtSBSAirGINF/S4UxOcR+/g==} + '@typescript-eslint/project-service@8.44.0': + resolution: {integrity: sha512-ZeaGNraRsq10GuEohKTo4295Z/SuGcSq2LzfGlqiuEvfArzo/VRrT0ZaJsVPuKZ55lVbNk8U6FcL+ZMH8CoyVA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.0.0' + + '@typescript-eslint/scope-manager@8.43.0': + resolution: {integrity: sha512-daSWlQ87ZhsjrbMLvpuuMAt3y4ba57AuvadcR7f3nl8eS3BjRc8L9VLxFLk92RL5xdXOg6IQ+qKjjqNEimGuAg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@typescript-eslint/scope-manager@8.44.0': + resolution: {integrity: sha512-87Jv3E+al8wpD+rIdVJm/ItDBe/Im09zXIjFoipOjr5gHUhJmTzfFLuTJ/nPTMc2Srsroy4IBXwcTCHyRR7KzA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@typescript-eslint/tsconfig-utils@8.43.0': + resolution: {integrity: sha512-ALC2prjZcj2YqqL5X/bwWQmHA2em6/94GcbB/KKu5SX3EBDOsqztmmX1kMkvAJHzxk7TazKzJfFiEIagNV3qEA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.0.0' + + '@typescript-eslint/tsconfig-utils@8.44.0': + resolution: {integrity: sha512-x5Y0+AuEPqAInc6yd0n5DAcvtoQ/vyaGwuX5HE9n6qAefk1GaedqrLQF8kQGylLUb9pnZyLf+iEiL9fr8APDtQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.0.0' + + '@typescript-eslint/type-utils@8.43.0': + resolution: {integrity: sha512-qaH1uLBpBuBBuRf8c1mLJ6swOfzCXryhKND04Igr4pckzSEW9JX5Aw9AgW00kwfjWJF0kk0ps9ExKTfvXfw4Qg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/visitor-keys@8.42.0': - resolution: {integrity: sha512-3WbiuzoEowaEn8RSnhJBrxSwX8ULYE9CXaPepS2C2W3NSA5NNIvBaslpBSBElPq0UGr0xVJlXFWOAKIkyylydQ==} + '@typescript-eslint/type-utils@8.44.0': + resolution: {integrity: sha512-9cwsoSxJ8Sak67Be/hD2RNt/fsqmWnNE1iHohG8lxqLSNY8xNfyY7wloo5zpW3Nu9hxVgURevqfcH6vvKCt6yg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <6.0.0' + + '@typescript-eslint/types@8.43.0': + resolution: {integrity: sha512-vQ2FZaxJpydjSZJKiSW/LJsabFFvV7KgLC5DiLhkBcykhQj8iK9BOaDmQt74nnKdLvceM5xmhaTF+pLekrxEkw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@typescript-eslint/types@8.44.0': + resolution: {integrity: sha512-ZSl2efn44VsYM0MfDQe68RKzBz75NPgLQXuGypmym6QVOWL5kegTZuZ02xRAT9T+onqvM6T8CdQk0OwYMB6ZvA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@typescript-eslint/typescript-estree@8.43.0': + resolution: {integrity: sha512-7Vv6zlAhPb+cvEpP06WXXy/ZByph9iL6BQRBDj4kmBsW98AqEeQHlj/13X+sZOrKSo9/rNKH4Ul4f6EICREFdw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.0.0' + + '@typescript-eslint/typescript-estree@8.44.0': + resolution: {integrity: sha512-lqNj6SgnGcQZwL4/SBJ3xdPEfcBuhCG8zdcwCPgYcmiPLgokiNDKlbPzCwEwu7m279J/lBYWtDYL+87OEfn8Jw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.0.0' + + '@typescript-eslint/utils@8.43.0': + resolution: {integrity: sha512-S1/tEmkUeeswxd0GGcnwuVQPFWo8NzZTOMxCvw8BX7OMxnNae+i8Tm7REQen/SwUIPoPqfKn7EaZ+YLpiB3k9g==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <6.0.0' + + '@typescript-eslint/utils@8.44.0': + resolution: {integrity: sha512-nktOlVcg3ALo0mYlV+L7sWUD58KG4CMj1rb2HUVOO4aL3K/6wcD+NERqd0rrA5Vg06b42YhF6cFxeixsp9Riqg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <6.0.0' + + '@typescript-eslint/visitor-keys@8.43.0': + resolution: {integrity: sha512-T+S1KqRD4sg/bHfLwrpF/K3gQLBM1n7Rp7OjjikjTEssI2YJzQpi5WXoynOaQ93ERIuq3O8RBTOUYDKszUCEHw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@typescript-eslint/visitor-keys@8.44.0': + resolution: {integrity: sha512-zaz9u8EJ4GBmnehlrpoKvj/E3dNbuQ7q0ucyZImm3cLqJ8INTc970B1qEqDX/Rzq65r3TvVTN7kHWPBoyW7DWw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@unrs/resolver-binding-android-arm-eabi@1.11.1': @@ -4841,6 +4957,10 @@ packages: '@xtuc/long@4.2.2': resolution: {integrity: sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==} + accepts@2.0.0: + resolution: {integrity: sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==} + engines: {node: '>= 0.6'} + acorn-import-attributes@1.9.5: resolution: {integrity: sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==} peerDependencies: @@ -4878,8 +4998,8 @@ packages: resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==} engines: {node: '>=8'} - ai@5.0.33: - resolution: {integrity: sha512-qmYQTb+K0204mawkjhCMGYPutDqPgmCeh/tQ9I3FpZfxvUe8R462D/MQUgLMFnMQ0z2kpUMoOJBKX6dSKb0OwA==} + ai@5.0.44: + resolution: {integrity: sha512-l/rdoM4LcRpsRBVvZQBwSU73oNoFGlWj+PcH86QRzxDGJgZqgGItWO0QcKjBNcLDmUjGN1VYd/8J0TAXHJleRQ==} engines: {node: '>=18'} peerDependencies: zod: ^3.25.76 || ^4 @@ -5017,6 +5137,14 @@ packages: base64-js@1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + baseline-browser-mapping@2.8.3: + resolution: {integrity: sha512-mcE+Wr2CAhHNWxXN/DdTI+n4gsPc5QpXpWnyCQWiQYIYZX+ZMJ8juXZgjRa/0/YPJo/NSsgW15/YgmI4nbysYw==} + hasBin: true + + baseline-browser-mapping@2.8.4: + resolution: {integrity: sha512-L+YvJwGAgwJBV1p6ffpSTa2KRc69EeeYGYjRVWKs0GKrK+LON0GC0gV+rKSNtALEDvMDqkvCFq9r1r94/Gjwxw==} + hasBin: true + basic-ftp@5.0.5: resolution: {integrity: sha512-4Bcg1P8xhUuqcii/S0Z9wiHIrQVPMermM1any+MX5GeGD7faD3/msQUDGLol9wOcz4/jbg/WJnGqoJF6LiBdtg==} engines: {node: '>=10.0.0'} @@ -5032,6 +5160,10 @@ packages: bl@4.1.0: resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} + body-parser@2.2.0: + resolution: {integrity: sha512-02qvAaxv8tp7fBa/mw1ga98OGm+eCbqzJOKoRt70sLmfEEi+jyBYVTDGfCL/k06/4EMk/z01gCe7HoCH/f2LTg==} + engines: {node: '>=18'} + boolbase@1.0.0: resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} @@ -5053,12 +5185,26 @@ packages: engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true + browserslist@4.26.0: + resolution: {integrity: sha512-P9go2WrP9FiPwLv3zqRD/Uoxo0RSHjzFCiQz7d4vbmwNqQFo9T9WCeP/Qn5EbcKQY6DBbkxEXNcpJOmncNrb7A==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + + browserslist@4.26.2: + resolution: {integrity: sha512-ECFzp6uFOSB+dcZ5BK/IBaGWssbSYBHvuMeMt3MMFyhI0Z8SqGgEkBLARgpRH3hutIgPVsALcMwbDrJqPxQ65A==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + buffer-from@1.1.2: resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} buffer@5.7.1: resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} + bytes@3.1.2: + resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} + engines: {node: '>= 0.8'} + call-bind-apply-helpers@1.0.2: resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} engines: {node: '>= 0.4'} @@ -5084,6 +5230,9 @@ packages: caniuse-lite@1.0.30001741: resolution: {integrity: sha512-QGUGitqsc8ARjLdgAfxETDhRbJ0REsP6O3I96TAth/mVjh2cYzN2u+3AzPP3aVSm2FehEItaJw1xd+IGBXWeSw==} + caniuse-lite@1.0.30001743: + resolution: {integrity: sha512-e6Ojr7RV14Un7dz6ASD0aZDmQPT/A+eZU+nuTNfjqmRrmkmQlnTNWH0SKmqagx9PeW87UVqapSurtAXifmtdmw==} + ccount@2.0.1: resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} @@ -5234,12 +5383,28 @@ packages: constant-case@2.0.0: resolution: {integrity: sha512-eS0N9WwmjTqrOmR3o83F5vW8Z+9R1HnVz3xmzT2PMFug9ly+Au/fxRWlEBSb6LcZwspSsEn9Xs1uw9YgzAg1EQ==} + content-disposition@1.0.0: + resolution: {integrity: sha512-Au9nRL8VNUut/XSzbQA38+M78dzP4D+eqg3gfJHMIHHYa3bg067xj1KxMUWj+VULbiZMowKngFFbKczUrNJ1mg==} + engines: {node: '>= 0.6'} + + content-type@1.0.5: + resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} + engines: {node: '>= 0.6'} + convert-source-map@1.9.0: resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} convert-source-map@2.0.0: resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + cookie-signature@1.2.2: + resolution: {integrity: sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==} + engines: {node: '>=6.6.0'} + + cookie@0.7.2: + resolution: {integrity: sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==} + engines: {node: '>= 0.6'} + cookie@1.0.2: resolution: {integrity: sha512-9Kr/j4O16ISv8zBBhJoi4bXOYNTkFLOqSL3UDB0njXxCXNezjeyVrJyGOWtgfs/q2km1gwBcfH8q1yEGoMYunA==} engines: {node: '>=18'} @@ -5247,6 +5412,10 @@ packages: core-js-pure@3.45.1: resolution: {integrity: sha512-OHnWFKgTUshEU8MK+lOs1H8kC8GkTi9Z1tvNkxrCcw9wl3MJIO7q2ld77wjWn4/xuGrVu2X+nME1iIIPBSdyEQ==} + cors@2.8.5: + resolution: {integrity: sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==} + engines: {node: '>= 0.10'} + cosmiconfig@7.1.0: resolution: {integrity: sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==} engines: {node: '>=10'} @@ -5410,6 +5579,15 @@ packages: supports-color: optional: true + debug@4.4.3: + resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + decimal.js-light@2.5.1: resolution: {integrity: sha512-qIMFpTMZmny+MMIitAB6D7iVPEorVw6YQRWkvarTkT4tBeSLLiHzcwj6q0MmYSFCiVpiqPJTJEYIrpcPzVEIvg==} @@ -5449,6 +5627,10 @@ packages: resolution: {integrity: sha512-wH9xOVHnczo9jN2IW68BabcecVPxacIA3g/7z6vhSU/4stOKQzeCRK0yD0A24WiAAUJmmVpWqrERcTxnLo3AnA==} engines: {node: '>=8'} + depd@2.0.0: + resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} + engines: {node: '>= 0.8'} + dequal@2.0.3: resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} engines: {node: '>=6'} @@ -5521,9 +5703,15 @@ packages: duplexer@0.1.2: resolution: {integrity: sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==} + ee-first@1.1.1: + resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} + electron-to-chromium@1.5.214: resolution: {integrity: sha512-TpvUNdha+X3ybfU78NoQatKvQEm1oq3lf2QbnmCEdw+Bd9RuIAY+hJTvq1avzHM0f7EJfnH3vbCnbzKzisc/9Q==} + electron-to-chromium@1.5.218: + resolution: {integrity: sha512-uwwdN0TUHs8u6iRgN8vKeWZMRll4gBkz+QMqdS7DDe49uiK68/UX92lFb61oiFPrpYZNeZIqa4bA7O6Aiasnzg==} + emery@1.4.4: resolution: {integrity: sha512-mMoO3uGDoiw/DmZ/YekT9gEoC0IFAXNWzYVukY8+/j0Wt8un1IDraIYGx+cMbRh+fHaCDE6Ui7zFAN8ezZSsAA==} @@ -5533,6 +5721,10 @@ packages: emoji-regex@9.2.2: resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + encodeurl@2.0.0: + resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==} + engines: {node: '>= 0.8'} + end-of-stream@1.4.5: resolution: {integrity: sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==} @@ -5586,6 +5778,9 @@ packages: resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} engines: {node: '>=6'} + escape-html@1.0.3: + resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} + escape-string-regexp@1.0.5: resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} engines: {node: '>=0.8.0'} @@ -5607,8 +5802,8 @@ packages: engines: {node: '>=6.0'} hasBin: true - eslint-config-next@15.5.2: - resolution: {integrity: sha512-3hPZghsLupMxxZ2ggjIIrat/bPniM2yRpsVPVM40rp8ZMzKWOJp2CGWn7+EzoV2ddkUr5fxNfHpF+wU1hGt/3g==} + eslint-config-next@15.5.3: + resolution: {integrity: sha512-e6j+QhQFOr5pfsc8VJbuTD9xTXJaRvMHYjEeLPA2pFkheNlgPLCkxdvhxhfuM4KGcqSZj2qEnpHisdTVs3BxuQ==} peerDependencies: eslint: ^7.23.0 || ^8.0.0 || ^9.0.0 typescript: '>=3.3.1' @@ -5757,6 +5952,10 @@ packages: resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} engines: {node: '>=0.10.0'} + etag@1.8.1: + resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} + engines: {node: '>= 0.6'} + event-target-shim@6.0.2: resolution: {integrity: sha512-8q3LsZjRezbFZ2PN+uP+Q7pnHUMmAOziU2vA2OwoFaKIXxlxl38IylhSSgUorWu/rf4er67w0ikBqjBFk/pomA==} engines: {node: '>=10.13.0'} @@ -5772,10 +5971,24 @@ packages: resolution: {integrity: sha512-Vo1ab+QXPzZ4tCa8SwIHJFaSzy4R6SHf7BY79rFBDf0idraZWAkYrDjDj8uWaSm3S2TK+hJ7/t1CEmZ7jXw+pg==} 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'} + express-rate-limit@7.5.1: + resolution: {integrity: sha512-7iN8iPMDzOMHPUYllBEsQdWVB6fPDMPqwjBaFrgr4Jgr/+okjvzAy+UHlYYL/Vs0OsOrMkwS6PJDkFlJwoxUnw==} + engines: {node: '>= 16'} + peerDependencies: + express: '>= 4.11' + + express@5.1.0: + resolution: {integrity: sha512-DT9ck5YIRU+8GYzzU5kT3eHGA5iL+1Zd0EutOmTE9Dtk+Tvuzd23VBU+ec7HPNSTxXYO55gPV/hq4pSBJDjFpA==} + engines: {node: '>= 18'} + external-editor@3.1.0: resolution: {integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==} engines: {node: '>=4'} @@ -5856,6 +6069,10 @@ packages: resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} engines: {node: '>=8'} + finalhandler@2.1.0: + resolution: {integrity: sha512-/t88Ty3d5JWQbWYgaOGCCYfXRwV1+be02WqYYlL6h0lEiUAMPM8o8qKGO01YIkOHzka2up08wvgYD0mDiI+q3Q==} + engines: {node: '>= 0.8'} + find-root@1.1.0: resolution: {integrity: sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==} @@ -5881,6 +6098,14 @@ packages: forwarded-parse@2.1.2: resolution: {integrity: sha512-alTFZZQDKMporBH77856pXgzhEzaUVmLCDk+egLgIgHst3Tpndzz8MnKe+GzRJRfvVdn69HhpW7cmXzvtLvJAw==} + forwarded@0.2.0: + resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} + engines: {node: '>= 0.6'} + + fresh@2.0.0: + resolution: {integrity: sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==} + engines: {node: '>= 0.8'} + fs-extra@10.1.0: resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==} engines: {node: '>=12'} @@ -6063,6 +6288,10 @@ packages: htmlparser2@8.0.2: resolution: {integrity: sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==} + http-errors@2.0.0: + resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} + engines: {node: '>= 0.8'} + http-proxy-agent@7.0.2: resolution: {integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==} engines: {node: '>= 14'} @@ -6101,6 +6330,10 @@ packages: resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} engines: {node: '>=0.10.0'} + iconv-lite@0.7.0: + resolution: {integrity: sha512-cf6L2Ds3h57VVmkZe+Pn+5APsT7FpqJtEhhieDCvrE2MK5Qk9MyffgQyuxQTm6BChfeZNtcOLHp9IcWRVcIcBQ==} + engines: {node: '>=0.10.0'} + idb-keyval@6.2.2: resolution: {integrity: sha512-yjD9nARJ/jb1g+CvD0tlhUHOrJ9Sy0P8T9MF3YaLlHnSRpwPfpTX0XIvpmw3gAJUmEu3FiICLBDPXVwyEvrleg==} @@ -6175,6 +6408,10 @@ packages: resolution: {integrity: sha512-NWv9YLW4PoW2B7xtzaS3NCot75m6nK7Icdv0o3lfMceJVRfSoQwqD4wEH5rLwoKJwUiZ/rfpiVBhnaF0FK4HoA==} engines: {node: '>= 12'} + ipaddr.js@1.9.1: + resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} + engines: {node: '>= 0.10'} + is-alphabetical@2.0.1: resolution: {integrity: sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==} @@ -6188,8 +6425,8 @@ packages: is-arrayish@0.2.1: resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} - is-arrayish@0.3.2: - resolution: {integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==} + is-arrayish@0.3.4: + resolution: {integrity: sha512-m6UrgzFVUYawGBh1dUsWR5M2Clqic9RVXC/9f8ceNlv2IcO9j9J/z8UoCLPqtsPBFNzEpfR3xftohbfqDx8EQA==} is-async-function@2.1.1: resolution: {integrity: sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==} @@ -6293,6 +6530,9 @@ packages: resolution: {integrity: sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==} engines: {node: '>=0.10.0'} + is-promise@4.0.0: + resolution: {integrity: sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==} + is-reference@1.2.1: resolution: {integrity: sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==} @@ -6582,14 +6822,17 @@ packages: resolution: {integrity: sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==} engines: {node: '>=12'} - lucide-react@0.542.0: - resolution: {integrity: sha512-w3hD8/SQB7+lzU2r4VdFyzzOzKnUjTZIF/MQJGSSvni7Llewni4vuViRppfRAa2guOsY5k4jZyxw/i9DQHv+dw==} + lucide-react@0.544.0: + resolution: {integrity: sha512-t5tS44bqd825zAW45UQxpG2CvcC4urOwn2TrwSH8u+MjeE+1NnWl6QqeQ/6NdjMqdOygyiT9p3Ev0p1NJykxjw==} peerDependencies: react: ^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0 magic-string@0.30.18: resolution: {integrity: sha512-yi8swmWbO17qHhwIBNeeZxTceJMeBvWJaId6dyvTSOwTipqeHhMhOrz6513r1sOKnpvQ7zkhlG8tPrpilwTxHQ==} + magic-string@0.30.19: + resolution: {integrity: sha512-2N21sPY9Ws53PZvsEpVtNuSW+ScYbQdp4b9qUaL+9QkHUrGFKo56Lg9Emg5s9V/qrtNBmiR01sYhUOwu3H+VOw==} + magic-string@0.30.8: resolution: {integrity: sha512-ISQTe55T2ao7XtlAStud6qwYPZjE4GK1S/BeVPus4jrq6JuOnQ00YKQC581RWhR122W7msZV263KzVeLoqidyQ==} engines: {node: '>=12'} @@ -6659,6 +6902,14 @@ packages: mdn-data@2.12.2: resolution: {integrity: sha512-IEn+pegP1aManZuckezWCO+XZQDplx1366JoVhTpMpBB1sPey/SbveZQUosKiKiGYjg1wH4pMlNgXbCiYgihQA==} + media-typer@1.1.0: + resolution: {integrity: sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==} + engines: {node: '>= 0.8'} + + merge-descriptors@2.0.0: + resolution: {integrity: sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==} + engines: {node: '>=18'} + merge-stream@2.0.0: resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} @@ -6767,10 +7018,18 @@ packages: resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} engines: {node: '>= 0.6'} + mime-db@1.54.0: + resolution: {integrity: sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==} + engines: {node: '>= 0.6'} + mime-types@2.1.35: resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} engines: {node: '>= 0.6'} + mime-types@3.0.1: + resolution: {integrity: sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==} + engines: {node: '>= 0.6'} + mimic-fn@2.1.0: resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} engines: {node: '>=6'} @@ -6841,6 +7100,10 @@ packages: natural-compare@1.4.0: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + negotiator@1.0.0: + resolution: {integrity: sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==} + engines: {node: '>= 0.6'} + neo-async@2.6.2: resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} @@ -6861,8 +7124,8 @@ packages: react: ^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc react-dom: ^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc - next@15.5.2: - resolution: {integrity: sha512-H8Otr7abj1glFhbGnvUt3gz++0AF1+QoCXEBmd/6aKbfdFwrn0LpA836Ed5+00va/7HQSDD+mOoVhn3tNy3e/Q==} + next@15.5.3: + resolution: {integrity: sha512-r/liNAx16SQj4D+XH/oI1dlpv9tdKJ6cONYPwwcCC46f2NjpaRWY+EKCzULfgQYV6YKXjHBchff2IZBSlZmJNw==} engines: {node: ^18.18.0 || ^19.8.0 || >= 20.0.0} hasBin: true peerDependencies: @@ -6913,6 +7176,9 @@ packages: node-releases@2.0.19: resolution: {integrity: sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==} + node-releases@2.0.21: + resolution: {integrity: sha512-5b0pgg78U3hwXkCM8Z9b2FJdPZlr9Psr9V2gQPESdGHqbntyFJKFW4r5TeWGFzafGY3hzs1JC62VEQMbl1JFkw==} + nodemailer@7.0.6: resolution: {integrity: sha512-F44uVzgwo49xboqbFgBGkRaiMgtoBrBEWCVincJPK9+S9Adkzt/wXCLKbf7dxucmxfTI5gHGB+bEmdyzN6QKjw==} engines: {node: '>=6.0.0'} @@ -6972,6 +7238,10 @@ packages: resolution: {integrity: sha512-0eJJY6hXLGf1udHwfNftBqH+g73EU4B504nZeKpz1sYRKafAghwxEJunB2O7rDZkL4PGfsMVnTXZ2EjibbqcsA==} engines: {node: '>=14.0.0'} + on-finished@2.4.1: + resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} + engines: {node: '>= 0.8'} + once@1.4.0: resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} @@ -7056,6 +7326,10 @@ packages: parseley@0.12.1: resolution: {integrity: sha512-e6qHKe3a9HWr0oMRVDTRhKce+bRO8VGQR3NyVwcjwrbhMmFCX9KszEV35+rn4AdilFAq9VPxP/Fe1wC9Qjd2lw==} + parseurl@1.3.3: + resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} + engines: {node: '>= 0.8'} + partysocket@0.0.22: resolution: {integrity: sha512-HmFJoVA48vfU5VaQ539YnQt+/QncV5wdlN7vEW//m8eCnOV2PKB8X08c7hI4VLrqntajaWovHhprWHgXbXgR1A==} @@ -7084,6 +7358,9 @@ packages: resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} engines: {node: '>=16 || 14 >=14.18'} + path-to-regexp@8.3.0: + resolution: {integrity: sha512-7jdwVIRtsP8MYpdXSwOS0YdD0Du+qOoF/AEPIt88PcCFrZCzx41oxku1jD88hZBwbNUIEfpqvuhjFaMAqMTWnA==} + path-type@4.0.0: resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} engines: {node: '>=8'} @@ -7126,10 +7403,14 @@ packages: pino-std-serializers@7.0.0: resolution: {integrity: sha512-e906FRY0+tV27iq4juKzSYPbUj2do2X2JX4EzSca1631EB2QJQUqGbDuERal7LCtOpxl6x3+nvo9NPZcmjkiFA==} - pino@9.9.4: - resolution: {integrity: sha512-d1XorUQ7sSKqVcYdXuEYs2h1LKxejSorMEJ76XoZ0pPDf8VzJMe7GlPXpMBZeQ9gE4ZPIp5uGD+5Nw7scxiigg==} + pino@9.9.5: + resolution: {integrity: sha512-d1s98p8/4TfYhsJ09r/Azt30aYELRi6NNnZtEbqFw6BoGsdPVf5lKNK3kUwH8BmJJfpTLNuicjUQjaMbd93dVg==} hasBin: true + pkce-challenge@5.0.0: + resolution: {integrity: sha512-ueGLflrrnvwB3xuo/uGob5pd5FN7l0MsLf0Z87o/UQmRtwjvfylfc9MurIxRAWywCYTgrvpXBcqjV4OfCYGCIQ==} + engines: {node: '>=16.20.0'} + playwright-core@1.55.0: resolution: {integrity: sha512-GvZs4vU3U5ro2nZpeiwyb0zuFaqb9sUiAJuyrWpcGouD8y9/HLgGbNRjIph7zU9D3hnPaisMl9zG9CgFi/biIg==} engines: {node: '>=18'} @@ -7452,6 +7733,10 @@ packages: proto-list@1.2.4: resolution: {integrity: sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==} + proxy-addr@2.0.7: + resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} + engines: {node: '>= 0.10'} + proxy-agent@6.5.0: resolution: {integrity: sha512-TmatMXdr2KlRiA2CyDu8GqR8EjahTG3aY3nXjdzFyoZbmB8hrBsTyMezhULIXKnC0jpfjlmiZ3+EaCzoInSu/A==} engines: {node: '>= 14'} @@ -7492,12 +7777,20 @@ packages: randombytes@2.1.0: resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} + range-parser@1.2.1: + resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} + engines: {node: '>= 0.6'} + + raw-body@3.0.1: + resolution: {integrity: sha512-9G8cA+tuMS75+6G/TzW8OtLzmBDMo8p1JRxN5AZ+LAp8uxGA8V8GZm4GQ4/N5QNQEnLmg6SS7wyuSmbKepiKqA==} + engines: {node: '>= 0.10'} + rc@1.2.8: resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} hasBin: true - react-day-picker@9.9.0: - resolution: {integrity: sha512-NtkJbuX6cl/VaGNb3sVVhmMA6LSMnL5G3xNL+61IyoZj0mUZFWTg4hmj7PHjIQ8MXN9dHWhUHFoJWG6y60DKSg==} + react-day-picker@9.10.0: + resolution: {integrity: sha512-tedecLSd+fpSN+J08601MaMsf122nxtqZXxB6lwX37qFoLtuPNuRJN8ylxFjLhyJS1kaLfAqL1GUkSLd2BMrpQ==} engines: {node: '>=18'} peerDependencies: react: '>=16.8.0' @@ -7686,14 +7979,18 @@ packages: deprecated: Rimraf versions prior to v4 are no longer supported hasBin: true - rollup@4.50.0: - resolution: {integrity: sha512-/Zl4D8zPifNmyGzJS+3kVoyXeDeT/GrsJM94sACNg9RtUE0hrHa1bNPtRSrfHTMH5HjRzce6K7rlTh3Khiw+pw==} + rollup@4.50.1: + resolution: {integrity: sha512-78E9voJHwnXQMiQdiqswVLZwJIzdBKJ1GdI5Zx6XwoFKUIk09/sSrr+05QFzvYb8q6Y9pPV45zzDuYa3907TZA==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true rope-sequence@1.3.4: resolution: {integrity: sha512-UT5EDe2cu2E/6O4igUr5PSFs23nvvukicWHx6GnOPlHAiiYbzNuCRQCuiUdHJQcqKalLKlrYJnjY0ySGsXNQXQ==} + router@2.2.0: + resolution: {integrity: sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==} + engines: {node: '>= 18'} + run-async@2.4.1: resolution: {integrity: sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==} engines: {node: '>=0.12.0'} @@ -7769,12 +8066,20 @@ packages: engines: {node: '>=10'} hasBin: true + send@1.2.0: + resolution: {integrity: sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw==} + engines: {node: '>= 18'} + sentence-case@2.1.1: resolution: {integrity: sha512-ENl7cYHaK/Ktwk5OTD+aDbQ3uC8IByu/6Bkg+HDv8Mm+XnBnppVNalcfJTNsp1ibstKh030/JKQQWglDvtKwEQ==} serialize-javascript@6.0.2: resolution: {integrity: sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==} + serve-static@2.2.0: + resolution: {integrity: sha512-61g9pCh0Vnh7IutZjtLGGpTA355+OPn2TyDv/6ivP2h/AdAVX9azsoxmg2/M6nZeQZNYBEwIcsne1mJd9oQItQ==} + engines: {node: '>= 18'} + server-only@0.0.1: resolution: {integrity: sha512-qepMx2JxAa5jjfzxG79yPPq+8BuFToHd1hm7kI+Z4zAq1ftQiP7HcxMhDDItrbtwVeLg/cY2JnKnrcFkmiswNA==} @@ -7790,6 +8095,9 @@ packages: resolution: {integrity: sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==} engines: {node: '>= 0.4'} + setprototypeof@1.2.0: + resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} + sharp@0.34.3: resolution: {integrity: sha512-eX2IQ6nFohW4DbvHIOLRB3MHFpYqaqvXd3Tp5e/T/dSH83fxaNJQRvDMhASmkNTsNTVF2/OOopzRCt7xokgPfg==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} @@ -7828,8 +8136,8 @@ packages: resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} engines: {node: '>=14'} - simple-swizzle@0.2.2: - resolution: {integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==} + simple-swizzle@0.2.4: + resolution: {integrity: sha512-nAu1WFPQSMNr2Zn9PGSZK9AGn4t/y97lEm+MXTtUDwfP0ksAIX4nO+6ruD9Jwut4C49SB1Ws+fbXsm/yScWOHw==} sirv@2.0.4: resolution: {integrity: sha512-94Bdh3cC2PKrbgSOUqTiGPWVZeSiXfKOVZNJniWoqrWrRkB1CJzBU3NEbiTsPcYy1lDsANA/THzS+9WBiy5nfQ==} @@ -7904,6 +8212,14 @@ packages: resolution: {integrity: sha512-WjlahMgHmCJpqzU8bIBy4qtsZdU9lRlcZE3Lvyej6t4tuOuv1vk57OW3MBrj6hXBFx/nNoC9MPMTcr5YA7NQbg==} engines: {node: '>=6'} + statuses@2.0.1: + resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} + engines: {node: '>= 0.8'} + + statuses@2.0.2: + resolution: {integrity: sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==} + engines: {node: '>= 0.8'} + stop-iteration-iterator@1.1.0: resolution: {integrity: sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==} engines: {node: '>= 0.4'} @@ -7995,8 +8311,8 @@ packages: stylis@4.2.0: resolution: {integrity: sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==} - supabase@2.39.2: - resolution: {integrity: sha512-/LDPMDIDmuDwj3UsKVw+wA+uHF7QhEF8xgJnKpnk1vqVdr+lA6xRSwWQzgaNuwPj5YPt6+78JKp+wzKziTsRVw==} + supabase@2.40.7: + resolution: {integrity: sha512-59lNW92axdufcEUdctNQpEc4k6uTEpzIUbqVXNSdWEDS/A/2yLGLxPOQQ0OBCsaJRhrVMmYXlRwgJK2PAoVQnA==} engines: {npm: '>=8'} hasBin: true @@ -8096,6 +8412,10 @@ packages: resolution: {integrity: sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==} engines: {node: '>=12.0.0'} + tinyglobby@0.2.15: + resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==} + engines: {node: '>=12.0.0'} + tinygradient@1.1.5: resolution: {integrity: sha512-8nIfc2vgQ4TeLnk2lFj4tRLvvJwEfQuabdsmvDdQPT0xlk9TaNtpGd6nNRxXoK6vQhN6RSzj+Cnp5tTQmpxmbw==} @@ -8110,12 +8430,16 @@ packages: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} engines: {node: '>=8.0'} + toidentifier@1.0.1: + resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} + engines: {node: '>=0.6'} + totalist@3.0.1: resolution: {integrity: sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==} engines: {node: '>=6'} - totp-generator@1.0.0: - resolution: {integrity: sha512-Iu/1Lk60/MH8FE+5cDWPiGbwKK1hxzSq+KT9oSqhZ1BEczGIKGcN50bP0WMLiIZKRg7t29iWLxw6f81TICQdoA==} + totp-generator@2.0.0: + resolution: {integrity: sha512-YXqrJupB/w762T4PrI9qLg5ekb0Of1MRerIW5wh3GRRkH/mgSROw5Gale0gidtc4CfTsNNyZFStS7H4uXJgL2Q==} tr46@0.0.3: resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} @@ -8198,6 +8522,10 @@ packages: resolution: {integrity: sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg==} engines: {node: '>=8'} + type-is@2.0.1: + resolution: {integrity: sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==} + engines: {node: '>= 0.6'} + typed-array-buffer@1.0.3: resolution: {integrity: sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==} engines: {node: '>= 0.4'} @@ -8214,8 +8542,8 @@ packages: resolution: {integrity: sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==} engines: {node: '>= 0.4'} - typescript-eslint@8.42.0: - resolution: {integrity: sha512-ozR/rQn+aQXQxh1YgbCzQWDFrsi9mcg+1PM3l/z5o1+20P7suOIaNg515bpr/OYt6FObz/NHcBstydDLHWeEKg==} + typescript-eslint@8.44.0: + resolution: {integrity: sha512-ib7mCkYuIzYonCq9XWF5XNw+fkj2zg629PSa9KNIQ47RXFF763S5BIX4wqz1+FLPogTZoiw8KmCiRPRa8bL3qw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 @@ -8235,8 +8563,8 @@ packages: resolution: {integrity: sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==} engines: {node: '>= 0.4'} - undici-types@7.10.0: - resolution: {integrity: sha512-t5Fy/nfn+14LuOc2KNYg75vZqClpAiqscVvMygNnlsHBFpSXdJaYtXMcdNLpl/Qvc3P2cB3s6lOV51nqsFq4ag==} + undici-types@7.12.0: + resolution: {integrity: sha512-goOacqME2GYyOZZfb5Lgtu+1IDmAlAEu5xnD3+xTzS10hT0vzpf0SPjkXwAw9Jm+4n/mQGDP3LO8CPbYROeBfQ==} unist-util-is@6.0.0: resolution: {integrity: sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==} @@ -8257,6 +8585,10 @@ packages: resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} engines: {node: '>= 10.0.0'} + unpipe@1.0.0: + resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} + engines: {node: '>= 0.8'} + unplugin@1.0.1: resolution: {integrity: sha512-aqrHaVBWW1JVKBHmGo33T5TxeL0qWzfvjWokObHA9bYmN7eNDkwOxmLjhioHl9878qDFMAaT51XNroRyuz7WxA==} @@ -8330,6 +8662,10 @@ packages: resolution: {integrity: sha512-IUoow1YUtvoBBC06dXs8bR8B9vuA3aJfmQNKMoaPG/OFsPmoQvw8xh+6Ye25Gx9DQhoEom3Pcu9MKHerm/NpUQ==} engines: {node: ^18.17.0 || >=20.5.0} + vary@1.1.2: + resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} + engines: {node: '>= 0.8'} + vfile-message@4.0.3: resolution: {integrity: sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw==} @@ -8503,6 +8839,11 @@ packages: resolution: {integrity: sha512-AyeEbWOu/TAXdxlV9wmGcR0+yh2j3vYPGOECcIj2S7MkrLyC7ne+oye2BKTItt0ii2PHk4cDy+95+LshzbXnGg==} engines: {node: '>=12.20'} + zod-to-json-schema@3.24.6: + resolution: {integrity: sha512-h/z3PKvcTcTetyjl1fkj79MHNEjm+HpD6NXheWjzOekY7kV+lwDYnHw+ivHkijnCSMz1yJaWBD9vu/Fcmk+vEg==} + peerDependencies: + zod: ^3.24.1 + zod@3.25.76: resolution: {integrity: sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==} @@ -8515,19 +8856,19 @@ snapshots: optionalDependencies: graphql: 16.11.0 - '@ai-sdk/gateway@1.0.18(zod@3.25.76)': + '@ai-sdk/gateway@1.0.23(zod@3.25.76)': dependencies: '@ai-sdk/provider': 2.0.0 - '@ai-sdk/provider-utils': 3.0.8(zod@3.25.76) + '@ai-sdk/provider-utils': 3.0.9(zod@3.25.76) zod: 3.25.76 - '@ai-sdk/openai@2.0.24(zod@3.25.76)': + '@ai-sdk/openai@2.0.30(zod@3.25.76)': dependencies: '@ai-sdk/provider': 2.0.0 - '@ai-sdk/provider-utils': 3.0.8(zod@3.25.76) + '@ai-sdk/provider-utils': 3.0.9(zod@3.25.76) zod: 3.25.76 - '@ai-sdk/provider-utils@3.0.8(zod@3.25.76)': + '@ai-sdk/provider-utils@3.0.9(zod@3.25.76)': dependencies: '@ai-sdk/provider': 2.0.0 '@standard-schema/spec': 1.0.0 @@ -8540,17 +8881,12 @@ snapshots: '@alloc/quick-lru@5.2.0': {} - '@ampproject/remapping@2.3.0': - dependencies: - '@jridgewell/gen-mapping': 0.3.13 - '@jridgewell/trace-mapping': 0.3.30 - '@aws-crypto/sha256-browser@5.2.0': dependencies: '@aws-crypto/sha256-js': 5.2.0 '@aws-crypto/supports-web-crypto': 5.2.0 '@aws-crypto/util': 5.2.0 - '@aws-sdk/types': 3.862.0 + '@aws-sdk/types': 3.887.0 '@aws-sdk/util-locate-window': 3.873.0 '@smithy/util-utf8': 2.3.0 tslib: 2.8.1 @@ -8558,7 +8894,7 @@ snapshots: '@aws-crypto/sha256-js@5.2.0': dependencies: '@aws-crypto/util': 5.2.0 - '@aws-sdk/types': 3.862.0 + '@aws-sdk/types': 3.887.0 tslib: 2.8.1 '@aws-crypto/supports-web-crypto@5.2.0': @@ -8567,388 +8903,391 @@ snapshots: '@aws-crypto/util@5.2.0': dependencies: - '@aws-sdk/types': 3.862.0 + '@aws-sdk/types': 3.887.0 '@smithy/util-utf8': 2.3.0 tslib: 2.8.1 - '@aws-sdk/client-sesv2@3.882.0': + '@aws-sdk/client-sesv2@3.888.0': dependencies: '@aws-crypto/sha256-browser': 5.2.0 '@aws-crypto/sha256-js': 5.2.0 - '@aws-sdk/core': 3.882.0 - '@aws-sdk/credential-provider-node': 3.882.0 - '@aws-sdk/middleware-host-header': 3.873.0 - '@aws-sdk/middleware-logger': 3.876.0 - '@aws-sdk/middleware-recursion-detection': 3.873.0 - '@aws-sdk/middleware-user-agent': 3.882.0 - '@aws-sdk/region-config-resolver': 3.873.0 - '@aws-sdk/signature-v4-multi-region': 3.882.0 - '@aws-sdk/types': 3.862.0 - '@aws-sdk/util-endpoints': 3.879.0 - '@aws-sdk/util-user-agent-browser': 3.873.0 - '@aws-sdk/util-user-agent-node': 3.882.0 - '@smithy/config-resolver': 4.2.0 - '@smithy/core': 3.10.0 - '@smithy/fetch-http-handler': 5.2.0 - '@smithy/hash-node': 4.1.0 - '@smithy/invalid-dependency': 4.1.0 - '@smithy/middleware-content-length': 4.1.0 - '@smithy/middleware-endpoint': 4.2.0 - '@smithy/middleware-retry': 4.2.0 - '@smithy/middleware-serde': 4.1.0 - '@smithy/middleware-stack': 4.1.0 - '@smithy/node-config-provider': 4.2.0 - '@smithy/node-http-handler': 4.2.0 - '@smithy/protocol-http': 5.2.0 - '@smithy/smithy-client': 4.6.0 - '@smithy/types': 4.4.0 - '@smithy/url-parser': 4.1.0 + '@aws-sdk/core': 3.888.0 + '@aws-sdk/credential-provider-node': 3.888.0 + '@aws-sdk/middleware-host-header': 3.887.0 + '@aws-sdk/middleware-logger': 3.887.0 + '@aws-sdk/middleware-recursion-detection': 3.887.0 + '@aws-sdk/middleware-user-agent': 3.888.0 + '@aws-sdk/region-config-resolver': 3.887.0 + '@aws-sdk/signature-v4-multi-region': 3.888.0 + '@aws-sdk/types': 3.887.0 + '@aws-sdk/util-endpoints': 3.887.0 + '@aws-sdk/util-user-agent-browser': 3.887.0 + '@aws-sdk/util-user-agent-node': 3.888.0 + '@smithy/config-resolver': 4.2.1 + '@smithy/core': 3.11.0 + '@smithy/fetch-http-handler': 5.2.1 + '@smithy/hash-node': 4.1.1 + '@smithy/invalid-dependency': 4.1.1 + '@smithy/middleware-content-length': 4.1.1 + '@smithy/middleware-endpoint': 4.2.1 + '@smithy/middleware-retry': 4.2.1 + '@smithy/middleware-serde': 4.1.1 + '@smithy/middleware-stack': 4.1.1 + '@smithy/node-config-provider': 4.2.1 + '@smithy/node-http-handler': 4.2.1 + '@smithy/protocol-http': 5.2.1 + '@smithy/smithy-client': 4.6.1 + '@smithy/types': 4.5.0 + '@smithy/url-parser': 4.1.1 '@smithy/util-base64': 4.1.0 '@smithy/util-body-length-browser': 4.1.0 '@smithy/util-body-length-node': 4.1.0 - '@smithy/util-defaults-mode-browser': 4.1.0 - '@smithy/util-defaults-mode-node': 4.1.0 - '@smithy/util-endpoints': 3.1.0 - '@smithy/util-middleware': 4.1.0 - '@smithy/util-retry': 4.1.0 + '@smithy/util-defaults-mode-browser': 4.1.1 + '@smithy/util-defaults-mode-node': 4.1.1 + '@smithy/util-endpoints': 3.1.1 + '@smithy/util-middleware': 4.1.1 + '@smithy/util-retry': 4.1.1 '@smithy/util-utf8': 4.1.0 tslib: 2.8.1 transitivePeerDependencies: - aws-crt - '@aws-sdk/client-sso@3.882.0': + '@aws-sdk/client-sso@3.888.0': dependencies: '@aws-crypto/sha256-browser': 5.2.0 '@aws-crypto/sha256-js': 5.2.0 - '@aws-sdk/core': 3.882.0 - '@aws-sdk/middleware-host-header': 3.873.0 - '@aws-sdk/middleware-logger': 3.876.0 - '@aws-sdk/middleware-recursion-detection': 3.873.0 - '@aws-sdk/middleware-user-agent': 3.882.0 - '@aws-sdk/region-config-resolver': 3.873.0 - '@aws-sdk/types': 3.862.0 - '@aws-sdk/util-endpoints': 3.879.0 - '@aws-sdk/util-user-agent-browser': 3.873.0 - '@aws-sdk/util-user-agent-node': 3.882.0 - '@smithy/config-resolver': 4.2.0 - '@smithy/core': 3.10.0 - '@smithy/fetch-http-handler': 5.2.0 - '@smithy/hash-node': 4.1.0 - '@smithy/invalid-dependency': 4.1.0 - '@smithy/middleware-content-length': 4.1.0 - '@smithy/middleware-endpoint': 4.2.0 - '@smithy/middleware-retry': 4.2.0 - '@smithy/middleware-serde': 4.1.0 - '@smithy/middleware-stack': 4.1.0 - '@smithy/node-config-provider': 4.2.0 - '@smithy/node-http-handler': 4.2.0 - '@smithy/protocol-http': 5.2.0 - '@smithy/smithy-client': 4.6.0 - '@smithy/types': 4.4.0 - '@smithy/url-parser': 4.1.0 + '@aws-sdk/core': 3.888.0 + '@aws-sdk/middleware-host-header': 3.887.0 + '@aws-sdk/middleware-logger': 3.887.0 + '@aws-sdk/middleware-recursion-detection': 3.887.0 + '@aws-sdk/middleware-user-agent': 3.888.0 + '@aws-sdk/region-config-resolver': 3.887.0 + '@aws-sdk/types': 3.887.0 + '@aws-sdk/util-endpoints': 3.887.0 + '@aws-sdk/util-user-agent-browser': 3.887.0 + '@aws-sdk/util-user-agent-node': 3.888.0 + '@smithy/config-resolver': 4.2.1 + '@smithy/core': 3.11.0 + '@smithy/fetch-http-handler': 5.2.1 + '@smithy/hash-node': 4.1.1 + '@smithy/invalid-dependency': 4.1.1 + '@smithy/middleware-content-length': 4.1.1 + '@smithy/middleware-endpoint': 4.2.1 + '@smithy/middleware-retry': 4.2.1 + '@smithy/middleware-serde': 4.1.1 + '@smithy/middleware-stack': 4.1.1 + '@smithy/node-config-provider': 4.2.1 + '@smithy/node-http-handler': 4.2.1 + '@smithy/protocol-http': 5.2.1 + '@smithy/smithy-client': 4.6.1 + '@smithy/types': 4.5.0 + '@smithy/url-parser': 4.1.1 '@smithy/util-base64': 4.1.0 '@smithy/util-body-length-browser': 4.1.0 '@smithy/util-body-length-node': 4.1.0 - '@smithy/util-defaults-mode-browser': 4.1.0 - '@smithy/util-defaults-mode-node': 4.1.0 - '@smithy/util-endpoints': 3.1.0 - '@smithy/util-middleware': 4.1.0 - '@smithy/util-retry': 4.1.0 + '@smithy/util-defaults-mode-browser': 4.1.1 + '@smithy/util-defaults-mode-node': 4.1.1 + '@smithy/util-endpoints': 3.1.1 + '@smithy/util-middleware': 4.1.1 + '@smithy/util-retry': 4.1.1 '@smithy/util-utf8': 4.1.0 tslib: 2.8.1 transitivePeerDependencies: - aws-crt - '@aws-sdk/core@3.882.0': + '@aws-sdk/core@3.888.0': dependencies: - '@aws-sdk/types': 3.862.0 - '@aws-sdk/xml-builder': 3.873.0 - '@smithy/core': 3.10.0 - '@smithy/node-config-provider': 4.2.0 - '@smithy/property-provider': 4.1.0 - '@smithy/protocol-http': 5.2.0 - '@smithy/signature-v4': 5.2.0 - '@smithy/smithy-client': 4.6.0 - '@smithy/types': 4.4.0 + '@aws-sdk/types': 3.887.0 + '@aws-sdk/xml-builder': 3.887.0 + '@smithy/core': 3.11.0 + '@smithy/node-config-provider': 4.2.1 + '@smithy/property-provider': 4.1.1 + '@smithy/protocol-http': 5.2.1 + '@smithy/signature-v4': 5.2.1 + '@smithy/smithy-client': 4.6.1 + '@smithy/types': 4.5.0 '@smithy/util-base64': 4.1.0 '@smithy/util-body-length-browser': 4.1.0 - '@smithy/util-middleware': 4.1.0 + '@smithy/util-middleware': 4.1.1 '@smithy/util-utf8': 4.1.0 fast-xml-parser: 5.2.5 tslib: 2.8.1 - '@aws-sdk/credential-provider-env@3.882.0': + '@aws-sdk/credential-provider-env@3.888.0': dependencies: - '@aws-sdk/core': 3.882.0 - '@aws-sdk/types': 3.862.0 - '@smithy/property-provider': 4.1.0 - '@smithy/types': 4.4.0 + '@aws-sdk/core': 3.888.0 + '@aws-sdk/types': 3.887.0 + '@smithy/property-provider': 4.1.1 + '@smithy/types': 4.5.0 tslib: 2.8.1 - '@aws-sdk/credential-provider-http@3.882.0': + '@aws-sdk/credential-provider-http@3.888.0': dependencies: - '@aws-sdk/core': 3.882.0 - '@aws-sdk/types': 3.862.0 - '@smithy/fetch-http-handler': 5.2.0 - '@smithy/node-http-handler': 4.2.0 - '@smithy/property-provider': 4.1.0 - '@smithy/protocol-http': 5.2.0 - '@smithy/smithy-client': 4.6.0 - '@smithy/types': 4.4.0 - '@smithy/util-stream': 4.3.0 + '@aws-sdk/core': 3.888.0 + '@aws-sdk/types': 3.887.0 + '@smithy/fetch-http-handler': 5.2.1 + '@smithy/node-http-handler': 4.2.1 + '@smithy/property-provider': 4.1.1 + '@smithy/protocol-http': 5.2.1 + '@smithy/smithy-client': 4.6.1 + '@smithy/types': 4.5.0 + '@smithy/util-stream': 4.3.1 tslib: 2.8.1 - '@aws-sdk/credential-provider-ini@3.882.0': + '@aws-sdk/credential-provider-ini@3.888.0': dependencies: - '@aws-sdk/core': 3.882.0 - '@aws-sdk/credential-provider-env': 3.882.0 - '@aws-sdk/credential-provider-http': 3.882.0 - '@aws-sdk/credential-provider-process': 3.882.0 - '@aws-sdk/credential-provider-sso': 3.882.0 - '@aws-sdk/credential-provider-web-identity': 3.882.0 - '@aws-sdk/nested-clients': 3.882.0 - '@aws-sdk/types': 3.862.0 - '@smithy/credential-provider-imds': 4.1.0 - '@smithy/property-provider': 4.1.0 - '@smithy/shared-ini-file-loader': 4.1.0 - '@smithy/types': 4.4.0 + '@aws-sdk/core': 3.888.0 + '@aws-sdk/credential-provider-env': 3.888.0 + '@aws-sdk/credential-provider-http': 3.888.0 + '@aws-sdk/credential-provider-process': 3.888.0 + '@aws-sdk/credential-provider-sso': 3.888.0 + '@aws-sdk/credential-provider-web-identity': 3.888.0 + '@aws-sdk/nested-clients': 3.888.0 + '@aws-sdk/types': 3.887.0 + '@smithy/credential-provider-imds': 4.1.1 + '@smithy/property-provider': 4.1.1 + '@smithy/shared-ini-file-loader': 4.1.1 + '@smithy/types': 4.5.0 tslib: 2.8.1 transitivePeerDependencies: - aws-crt - '@aws-sdk/credential-provider-node@3.882.0': + '@aws-sdk/credential-provider-node@3.888.0': dependencies: - '@aws-sdk/credential-provider-env': 3.882.0 - '@aws-sdk/credential-provider-http': 3.882.0 - '@aws-sdk/credential-provider-ini': 3.882.0 - '@aws-sdk/credential-provider-process': 3.882.0 - '@aws-sdk/credential-provider-sso': 3.882.0 - '@aws-sdk/credential-provider-web-identity': 3.882.0 - '@aws-sdk/types': 3.862.0 - '@smithy/credential-provider-imds': 4.1.0 - '@smithy/property-provider': 4.1.0 - '@smithy/shared-ini-file-loader': 4.1.0 - '@smithy/types': 4.4.0 + '@aws-sdk/credential-provider-env': 3.888.0 + '@aws-sdk/credential-provider-http': 3.888.0 + '@aws-sdk/credential-provider-ini': 3.888.0 + '@aws-sdk/credential-provider-process': 3.888.0 + '@aws-sdk/credential-provider-sso': 3.888.0 + '@aws-sdk/credential-provider-web-identity': 3.888.0 + '@aws-sdk/types': 3.887.0 + '@smithy/credential-provider-imds': 4.1.1 + '@smithy/property-provider': 4.1.1 + '@smithy/shared-ini-file-loader': 4.1.1 + '@smithy/types': 4.5.0 tslib: 2.8.1 transitivePeerDependencies: - aws-crt - '@aws-sdk/credential-provider-process@3.882.0': + '@aws-sdk/credential-provider-process@3.888.0': dependencies: - '@aws-sdk/core': 3.882.0 - '@aws-sdk/types': 3.862.0 - '@smithy/property-provider': 4.1.0 - '@smithy/shared-ini-file-loader': 4.1.0 - '@smithy/types': 4.4.0 + '@aws-sdk/core': 3.888.0 + '@aws-sdk/types': 3.887.0 + '@smithy/property-provider': 4.1.1 + '@smithy/shared-ini-file-loader': 4.1.1 + '@smithy/types': 4.5.0 tslib: 2.8.1 - '@aws-sdk/credential-provider-sso@3.882.0': + '@aws-sdk/credential-provider-sso@3.888.0': dependencies: - '@aws-sdk/client-sso': 3.882.0 - '@aws-sdk/core': 3.882.0 - '@aws-sdk/token-providers': 3.882.0 - '@aws-sdk/types': 3.862.0 - '@smithy/property-provider': 4.1.0 - '@smithy/shared-ini-file-loader': 4.1.0 - '@smithy/types': 4.4.0 + '@aws-sdk/client-sso': 3.888.0 + '@aws-sdk/core': 3.888.0 + '@aws-sdk/token-providers': 3.888.0 + '@aws-sdk/types': 3.887.0 + '@smithy/property-provider': 4.1.1 + '@smithy/shared-ini-file-loader': 4.1.1 + '@smithy/types': 4.5.0 tslib: 2.8.1 transitivePeerDependencies: - aws-crt - '@aws-sdk/credential-provider-web-identity@3.882.0': + '@aws-sdk/credential-provider-web-identity@3.888.0': dependencies: - '@aws-sdk/core': 3.882.0 - '@aws-sdk/nested-clients': 3.882.0 - '@aws-sdk/types': 3.862.0 - '@smithy/property-provider': 4.1.0 - '@smithy/types': 4.4.0 + '@aws-sdk/core': 3.888.0 + '@aws-sdk/nested-clients': 3.888.0 + '@aws-sdk/types': 3.887.0 + '@smithy/property-provider': 4.1.1 + '@smithy/types': 4.5.0 tslib: 2.8.1 transitivePeerDependencies: - aws-crt - '@aws-sdk/middleware-host-header@3.873.0': + '@aws-sdk/middleware-host-header@3.887.0': dependencies: - '@aws-sdk/types': 3.862.0 - '@smithy/protocol-http': 5.2.0 - '@smithy/types': 4.4.0 + '@aws-sdk/types': 3.887.0 + '@smithy/protocol-http': 5.2.1 + '@smithy/types': 4.5.0 tslib: 2.8.1 - '@aws-sdk/middleware-logger@3.876.0': + '@aws-sdk/middleware-logger@3.887.0': dependencies: - '@aws-sdk/types': 3.862.0 - '@smithy/types': 4.4.0 + '@aws-sdk/types': 3.887.0 + '@smithy/types': 4.5.0 tslib: 2.8.1 - '@aws-sdk/middleware-recursion-detection@3.873.0': + '@aws-sdk/middleware-recursion-detection@3.887.0': dependencies: - '@aws-sdk/types': 3.862.0 - '@smithy/protocol-http': 5.2.0 - '@smithy/types': 4.4.0 + '@aws-sdk/types': 3.887.0 + '@aws/lambda-invoke-store': 0.0.1 + '@smithy/protocol-http': 5.2.1 + '@smithy/types': 4.5.0 tslib: 2.8.1 - '@aws-sdk/middleware-sdk-s3@3.882.0': + '@aws-sdk/middleware-sdk-s3@3.888.0': dependencies: - '@aws-sdk/core': 3.882.0 - '@aws-sdk/types': 3.862.0 + '@aws-sdk/core': 3.888.0 + '@aws-sdk/types': 3.887.0 '@aws-sdk/util-arn-parser': 3.873.0 - '@smithy/core': 3.10.0 - '@smithy/node-config-provider': 4.2.0 - '@smithy/protocol-http': 5.2.0 - '@smithy/signature-v4': 5.2.0 - '@smithy/smithy-client': 4.6.0 - '@smithy/types': 4.4.0 + '@smithy/core': 3.11.0 + '@smithy/node-config-provider': 4.2.1 + '@smithy/protocol-http': 5.2.1 + '@smithy/signature-v4': 5.2.1 + '@smithy/smithy-client': 4.6.1 + '@smithy/types': 4.5.0 '@smithy/util-config-provider': 4.1.0 - '@smithy/util-middleware': 4.1.0 - '@smithy/util-stream': 4.3.0 + '@smithy/util-middleware': 4.1.1 + '@smithy/util-stream': 4.3.1 '@smithy/util-utf8': 4.1.0 tslib: 2.8.1 - '@aws-sdk/middleware-user-agent@3.882.0': + '@aws-sdk/middleware-user-agent@3.888.0': dependencies: - '@aws-sdk/core': 3.882.0 - '@aws-sdk/types': 3.862.0 - '@aws-sdk/util-endpoints': 3.879.0 - '@smithy/core': 3.10.0 - '@smithy/protocol-http': 5.2.0 - '@smithy/types': 4.4.0 + '@aws-sdk/core': 3.888.0 + '@aws-sdk/types': 3.887.0 + '@aws-sdk/util-endpoints': 3.887.0 + '@smithy/core': 3.11.0 + '@smithy/protocol-http': 5.2.1 + '@smithy/types': 4.5.0 tslib: 2.8.1 - '@aws-sdk/nested-clients@3.882.0': + '@aws-sdk/nested-clients@3.888.0': dependencies: '@aws-crypto/sha256-browser': 5.2.0 '@aws-crypto/sha256-js': 5.2.0 - '@aws-sdk/core': 3.882.0 - '@aws-sdk/middleware-host-header': 3.873.0 - '@aws-sdk/middleware-logger': 3.876.0 - '@aws-sdk/middleware-recursion-detection': 3.873.0 - '@aws-sdk/middleware-user-agent': 3.882.0 - '@aws-sdk/region-config-resolver': 3.873.0 - '@aws-sdk/types': 3.862.0 - '@aws-sdk/util-endpoints': 3.879.0 - '@aws-sdk/util-user-agent-browser': 3.873.0 - '@aws-sdk/util-user-agent-node': 3.882.0 - '@smithy/config-resolver': 4.2.0 - '@smithy/core': 3.10.0 - '@smithy/fetch-http-handler': 5.2.0 - '@smithy/hash-node': 4.1.0 - '@smithy/invalid-dependency': 4.1.0 - '@smithy/middleware-content-length': 4.1.0 - '@smithy/middleware-endpoint': 4.2.0 - '@smithy/middleware-retry': 4.2.0 - '@smithy/middleware-serde': 4.1.0 - '@smithy/middleware-stack': 4.1.0 - '@smithy/node-config-provider': 4.2.0 - '@smithy/node-http-handler': 4.2.0 - '@smithy/protocol-http': 5.2.0 - '@smithy/smithy-client': 4.6.0 - '@smithy/types': 4.4.0 - '@smithy/url-parser': 4.1.0 + '@aws-sdk/core': 3.888.0 + '@aws-sdk/middleware-host-header': 3.887.0 + '@aws-sdk/middleware-logger': 3.887.0 + '@aws-sdk/middleware-recursion-detection': 3.887.0 + '@aws-sdk/middleware-user-agent': 3.888.0 + '@aws-sdk/region-config-resolver': 3.887.0 + '@aws-sdk/types': 3.887.0 + '@aws-sdk/util-endpoints': 3.887.0 + '@aws-sdk/util-user-agent-browser': 3.887.0 + '@aws-sdk/util-user-agent-node': 3.888.0 + '@smithy/config-resolver': 4.2.1 + '@smithy/core': 3.11.0 + '@smithy/fetch-http-handler': 5.2.1 + '@smithy/hash-node': 4.1.1 + '@smithy/invalid-dependency': 4.1.1 + '@smithy/middleware-content-length': 4.1.1 + '@smithy/middleware-endpoint': 4.2.1 + '@smithy/middleware-retry': 4.2.1 + '@smithy/middleware-serde': 4.1.1 + '@smithy/middleware-stack': 4.1.1 + '@smithy/node-config-provider': 4.2.1 + '@smithy/node-http-handler': 4.2.1 + '@smithy/protocol-http': 5.2.1 + '@smithy/smithy-client': 4.6.1 + '@smithy/types': 4.5.0 + '@smithy/url-parser': 4.1.1 '@smithy/util-base64': 4.1.0 '@smithy/util-body-length-browser': 4.1.0 '@smithy/util-body-length-node': 4.1.0 - '@smithy/util-defaults-mode-browser': 4.1.0 - '@smithy/util-defaults-mode-node': 4.1.0 - '@smithy/util-endpoints': 3.1.0 - '@smithy/util-middleware': 4.1.0 - '@smithy/util-retry': 4.1.0 + '@smithy/util-defaults-mode-browser': 4.1.1 + '@smithy/util-defaults-mode-node': 4.1.1 + '@smithy/util-endpoints': 3.1.1 + '@smithy/util-middleware': 4.1.1 + '@smithy/util-retry': 4.1.1 '@smithy/util-utf8': 4.1.0 tslib: 2.8.1 transitivePeerDependencies: - aws-crt - '@aws-sdk/region-config-resolver@3.873.0': + '@aws-sdk/region-config-resolver@3.887.0': dependencies: - '@aws-sdk/types': 3.862.0 - '@smithy/node-config-provider': 4.2.0 - '@smithy/types': 4.4.0 + '@aws-sdk/types': 3.887.0 + '@smithy/node-config-provider': 4.2.1 + '@smithy/types': 4.5.0 '@smithy/util-config-provider': 4.1.0 - '@smithy/util-middleware': 4.1.0 + '@smithy/util-middleware': 4.1.1 tslib: 2.8.1 - '@aws-sdk/signature-v4-multi-region@3.882.0': + '@aws-sdk/signature-v4-multi-region@3.888.0': dependencies: - '@aws-sdk/middleware-sdk-s3': 3.882.0 - '@aws-sdk/types': 3.862.0 - '@smithy/protocol-http': 5.2.0 - '@smithy/signature-v4': 5.2.0 - '@smithy/types': 4.4.0 + '@aws-sdk/middleware-sdk-s3': 3.888.0 + '@aws-sdk/types': 3.887.0 + '@smithy/protocol-http': 5.2.1 + '@smithy/signature-v4': 5.2.1 + '@smithy/types': 4.5.0 tslib: 2.8.1 - '@aws-sdk/token-providers@3.882.0': + '@aws-sdk/token-providers@3.888.0': dependencies: - '@aws-sdk/core': 3.882.0 - '@aws-sdk/nested-clients': 3.882.0 - '@aws-sdk/types': 3.862.0 - '@smithy/property-provider': 4.1.0 - '@smithy/shared-ini-file-loader': 4.1.0 - '@smithy/types': 4.4.0 + '@aws-sdk/core': 3.888.0 + '@aws-sdk/nested-clients': 3.888.0 + '@aws-sdk/types': 3.887.0 + '@smithy/property-provider': 4.1.1 + '@smithy/shared-ini-file-loader': 4.1.1 + '@smithy/types': 4.5.0 tslib: 2.8.1 transitivePeerDependencies: - aws-crt - '@aws-sdk/types@3.862.0': + '@aws-sdk/types@3.887.0': dependencies: - '@smithy/types': 4.4.0 + '@smithy/types': 4.5.0 tslib: 2.8.1 '@aws-sdk/util-arn-parser@3.873.0': dependencies: tslib: 2.8.1 - '@aws-sdk/util-endpoints@3.879.0': + '@aws-sdk/util-endpoints@3.887.0': dependencies: - '@aws-sdk/types': 3.862.0 - '@smithy/types': 4.4.0 - '@smithy/url-parser': 4.1.0 - '@smithy/util-endpoints': 3.1.0 + '@aws-sdk/types': 3.887.0 + '@smithy/types': 4.5.0 + '@smithy/url-parser': 4.1.1 + '@smithy/util-endpoints': 3.1.1 tslib: 2.8.1 '@aws-sdk/util-locate-window@3.873.0': dependencies: tslib: 2.8.1 - '@aws-sdk/util-user-agent-browser@3.873.0': + '@aws-sdk/util-user-agent-browser@3.887.0': dependencies: - '@aws-sdk/types': 3.862.0 - '@smithy/types': 4.4.0 + '@aws-sdk/types': 3.887.0 + '@smithy/types': 4.5.0 bowser: 2.12.1 tslib: 2.8.1 - '@aws-sdk/util-user-agent-node@3.882.0': + '@aws-sdk/util-user-agent-node@3.888.0': dependencies: - '@aws-sdk/middleware-user-agent': 3.882.0 - '@aws-sdk/types': 3.862.0 - '@smithy/node-config-provider': 4.2.0 - '@smithy/types': 4.4.0 + '@aws-sdk/middleware-user-agent': 3.888.0 + '@aws-sdk/types': 3.887.0 + '@smithy/node-config-provider': 4.2.1 + '@smithy/types': 4.5.0 tslib: 2.8.1 - '@aws-sdk/xml-builder@3.873.0': + '@aws-sdk/xml-builder@3.887.0': dependencies: - '@smithy/types': 4.4.0 + '@smithy/types': 4.5.0 tslib: 2.8.1 + '@aws/lambda-invoke-store@0.0.1': {} + '@babel/code-frame@7.27.1': dependencies: '@babel/helper-validator-identifier': 7.27.1 js-tokens: 4.0.0 picocolors: 1.1.1 - '@babel/compat-data@7.28.0': {} + '@babel/compat-data@7.28.4': {} - '@babel/core@7.28.3': + '@babel/core@7.28.4': dependencies: - '@ampproject/remapping': 2.3.0 '@babel/code-frame': 7.27.1 '@babel/generator': 7.28.3 '@babel/helper-compilation-targets': 7.27.2 - '@babel/helper-module-transforms': 7.28.3(@babel/core@7.28.3) - '@babel/helpers': 7.28.3 - '@babel/parser': 7.28.3 + '@babel/helper-module-transforms': 7.28.3(@babel/core@7.28.4) + '@babel/helpers': 7.28.4 + '@babel/parser': 7.28.4 '@babel/template': 7.27.2 - '@babel/traverse': 7.28.3 - '@babel/types': 7.28.2 + '@babel/traverse': 7.28.4 + '@babel/types': 7.28.4 + '@jridgewell/remapping': 2.3.5 convert-source-map: 2.0.0 - debug: 4.4.1 + debug: 4.4.3 gensync: 1.0.0-beta.2 json5: 2.2.3 semver: 6.3.1 @@ -8965,9 +9304,9 @@ snapshots: '@babel/helper-compilation-targets@7.27.2': dependencies: - '@babel/compat-data': 7.28.0 + '@babel/compat-data': 7.28.4 '@babel/helper-validator-option': 7.27.1 - browserslist: 4.25.4 + browserslist: 4.26.0 lru-cache: 5.1.1 semver: 6.3.1 @@ -8980,12 +9319,12 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/helper-module-transforms@7.28.3(@babel/core@7.28.3)': + '@babel/helper-module-transforms@7.28.3(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.28.3 + '@babel/core': 7.28.4 '@babel/helper-module-imports': 7.27.1 '@babel/helper-validator-identifier': 7.27.1 - '@babel/traverse': 7.28.3 + '@babel/traverse': 7.28.4 transitivePeerDependencies: - supports-color @@ -8995,15 +9334,19 @@ snapshots: '@babel/helper-validator-option@7.27.1': {} - '@babel/helpers@7.28.3': + '@babel/helpers@7.28.4': dependencies: '@babel/template': 7.27.2 - '@babel/types': 7.28.2 + '@babel/types': 7.28.4 '@babel/parser@7.28.3': dependencies: '@babel/types': 7.28.2 + '@babel/parser@7.28.4': + dependencies: + '@babel/types': 7.28.4 + '@babel/runtime-corejs3@7.28.3': dependencies: core-js-pure: 3.45.1 @@ -9030,11 +9373,28 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/traverse@7.28.4': + dependencies: + '@babel/code-frame': 7.27.1 + '@babel/generator': 7.28.3 + '@babel/helper-globals': 7.28.0 + '@babel/parser': 7.28.4 + '@babel/template': 7.27.2 + '@babel/types': 7.28.4 + debug: 4.4.3 + transitivePeerDependencies: + - supports-color + '@babel/types@7.28.2': dependencies: '@babel/helper-string-parser': 7.27.1 '@babel/helper-validator-identifier': 7.27.1 + '@babel/types@7.28.4': + dependencies: + '@babel/helper-string-parser': 7.27.1 + '@babel/helper-validator-identifier': 7.27.1 + '@braintree/sanitize-url@6.0.4': {} '@corex/deepmerge@4.0.43': {} @@ -9047,9 +9407,9 @@ snapshots: '@discoveryjs/json-ext@0.5.7': {} - '@edge-csrf/nextjs@2.5.3-cloudflare-rc1(next@15.5.2(@opentelemetry/api@1.9.0)(@playwright/test@1.55.0)(babel-plugin-react-compiler@19.1.0-rc.3)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))': + '@edge-csrf/nextjs@2.5.3-cloudflare-rc1(next@15.5.3(@opentelemetry/api@1.9.0)(@playwright/test@1.55.0)(babel-plugin-react-compiler@19.1.0-rc.3)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))': dependencies: - next: 15.5.2(@opentelemetry/api@1.9.0)(@playwright/test@1.55.0)(babel-plugin-react-compiler@19.1.0-rc.3)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + next: 15.5.3(@opentelemetry/api@1.9.0)(@playwright/test@1.55.0)(babel-plugin-react-compiler@19.1.0-rc.3)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) '@emnapi/core@1.5.0': dependencies: @@ -9130,6 +9490,11 @@ snapshots: eslint: 9.35.0(jiti@2.5.1) eslint-visitor-keys: 3.4.3 + '@eslint-community/eslint-utils@4.9.0(eslint@9.35.0(jiti@2.5.1))': + dependencies: + eslint: 9.35.0(jiti@2.5.1) + eslint-visitor-keys: 3.4.3 + '@eslint-community/regexpp@4.12.1': {} '@eslint/config-array@0.21.0': @@ -9226,7 +9591,7 @@ snapshots: dependencies: graphql: 16.11.0 - '@hookform/resolvers@5.2.1(react-hook-form@7.62.0(react@19.1.1))': + '@hookform/resolvers@5.2.2(react-hook-form@7.62.0(react@19.1.1))': dependencies: '@standard-schema/utils': 0.3.0 react-hook-form: 7.62.0(react@19.1.1) @@ -9328,12 +9693,12 @@ snapshots: '@img/sharp-win32-x64@0.34.3': optional: true - '@inquirer/external-editor@1.0.1(@types/node@24.3.1)': + '@inquirer/external-editor@1.0.1(@types/node@24.5.0)': dependencies: chardet: 2.1.0 iconv-lite: 0.6.3 optionalDependencies: - '@types/node': 24.3.1 + '@types/node': 24.5.0 '@internationalized/date@3.9.0': dependencies: @@ -9371,7 +9736,7 @@ snapshots: '@jridgewell/source-map@0.3.11': dependencies: '@jridgewell/gen-mapping': 0.3.13 - '@jridgewell/trace-mapping': 0.3.30 + '@jridgewell/trace-mapping': 0.3.31 '@jridgewell/sourcemap-codec@1.5.5': {} @@ -9380,6 +9745,11 @@ snapshots: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.5.5 + '@jridgewell/trace-mapping@0.3.31': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.5 + '@jridgewell/trace-mapping@0.3.9': dependencies: '@jridgewell/resolve-uri': 3.1.2 @@ -9387,7 +9757,7 @@ snapshots: '@juggle/resize-observer@3.4.0': {} - '@keystar/ui@0.7.19(next@15.5.2(@opentelemetry/api@1.9.0)(@playwright/test@1.55.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': + '@keystar/ui@0.7.19(next@15.5.3(@opentelemetry/api@1.9.0)(@playwright/test@1.55.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': dependencies: '@babel/runtime': 7.28.3 '@emotion/css': 11.13.5 @@ -9474,25 +9844,25 @@ snapshots: '@react-types/switch': 3.5.14(react@19.1.1) '@react-types/table': 3.13.3(react@19.1.1) '@react-types/tabs': 3.3.18(react@19.1.1) - '@types/react': 19.1.12 + '@types/react': 19.1.13 emery: 1.4.4 facepaint: 1.2.1 react: 19.1.1 react-dom: 19.1.1(react@19.1.1) optionalDependencies: - next: 15.5.2(@opentelemetry/api@1.9.0)(@playwright/test@1.55.0)(babel-plugin-react-compiler@19.1.0-rc.3)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + next: 15.5.3(@opentelemetry/api@1.9.0)(@playwright/test@1.55.0)(babel-plugin-react-compiler@19.1.0-rc.3)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) transitivePeerDependencies: - supports-color - '@keystatic/core@0.5.48(next@15.5.2(@opentelemetry/api@1.9.0)(@playwright/test@1.55.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': + '@keystatic/core@0.5.48(next@15.5.3(@opentelemetry/api@1.9.0)(@playwright/test@1.55.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': dependencies: '@babel/runtime': 7.28.3 '@braintree/sanitize-url': 6.0.4 '@emotion/weak-memoize': 0.3.1 '@floating-ui/react': 0.24.8(react-dom@19.1.1(react@19.1.1))(react@19.1.1) '@internationalized/string': 3.2.7 - '@keystar/ui': 0.7.19(next@15.5.2(@opentelemetry/api@1.9.0)(@playwright/test@1.55.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@markdoc/markdoc': 0.4.0(@types/react@19.1.12)(react@19.1.1) + '@keystar/ui': 0.7.19(next@15.5.3(@opentelemetry/api@1.9.0)(@playwright/test@1.55.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@markdoc/markdoc': 0.4.0(@types/react@19.1.13)(react@19.1.1) '@react-aria/focus': 3.21.1(react-dom@19.1.1(react@19.1.1))(react@19.1.1) '@react-aria/i18n': 3.12.12(react-dom@19.1.1(react@19.1.1))(react@19.1.1) '@react-aria/interactions': 3.25.5(react-dom@19.1.1(react@19.1.1))(react@19.1.1) @@ -9509,7 +9879,7 @@ snapshots: '@sindresorhus/slugify': 1.1.2 '@toeverything/y-indexeddb': 0.10.0-canary.9(yjs@13.6.27) '@ts-gql/tag': 0.7.3(graphql@16.11.0) - '@types/react': 19.1.12 + '@types/react': 19.1.13 '@urql/core': 5.2.0(graphql@16.11.0) '@urql/exchange-auth': 2.2.1(@urql/core@5.2.0(graphql@16.11.0)) '@urql/exchange-graphcache': 7.2.4(@urql/core@5.2.0(graphql@16.11.0))(graphql@16.11.0) @@ -9562,31 +9932,31 @@ snapshots: - next - supports-color - '@keystatic/next@5.0.4(@keystatic/core@0.5.48(next@15.5.2(@opentelemetry/api@1.9.0)(@playwright/test@1.55.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(next@15.5.2(@opentelemetry/api@1.9.0)(@playwright/test@1.55.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': + '@keystatic/next@5.0.4(@keystatic/core@0.5.48(next@15.5.3(@opentelemetry/api@1.9.0)(@playwright/test@1.55.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(next@15.5.3(@opentelemetry/api@1.9.0)(@playwright/test@1.55.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': dependencies: '@babel/runtime': 7.28.3 - '@keystatic/core': 0.5.48(next@15.5.2(@opentelemetry/api@1.9.0)(@playwright/test@1.55.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@types/react': 19.1.12 + '@keystatic/core': 0.5.48(next@15.5.3(@opentelemetry/api@1.9.0)(@playwright/test@1.55.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@types/react': 19.1.13 chokidar: 3.6.0 - next: 15.5.2(@opentelemetry/api@1.9.0)(@playwright/test@1.55.0)(babel-plugin-react-compiler@19.1.0-rc.3)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + next: 15.5.3(@opentelemetry/api@1.9.0)(@playwright/test@1.55.0)(babel-plugin-react-compiler@19.1.0-rc.3)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) react: 19.1.1 react-dom: 19.1.1(react@19.1.1) server-only: 0.0.1 '@lemonsqueezy/lemonsqueezy.js@4.0.0': {} - '@makerkit/data-loader-supabase-core@0.0.10(@supabase/postgrest-js@1.21.3)(@supabase/supabase-js@2.57.2)': + '@makerkit/data-loader-supabase-core@0.0.10(@supabase/postgrest-js@1.21.4)(@supabase/supabase-js@2.57.4)': dependencies: - '@supabase/postgrest-js': 1.21.3 - '@supabase/supabase-js': 2.57.2 + '@supabase/postgrest-js': 1.21.4 + '@supabase/supabase-js': 2.57.4 ts-case-convert: 2.1.0 - '@makerkit/data-loader-supabase-nextjs@1.2.5(@supabase/postgrest-js@1.21.3)(@supabase/supabase-js@2.57.2)(@tanstack/react-query@5.87.1(react@19.1.1))(next@15.5.2(@opentelemetry/api@1.9.0)(@playwright/test@1.55.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(react@19.1.1)': + '@makerkit/data-loader-supabase-nextjs@1.2.5(@supabase/postgrest-js@1.21.4)(@supabase/supabase-js@2.57.4)(@tanstack/react-query@5.89.0(react@19.1.1))(next@15.5.3(@opentelemetry/api@1.9.0)(@playwright/test@1.55.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(react@19.1.1)': dependencies: - '@makerkit/data-loader-supabase-core': 0.0.10(@supabase/postgrest-js@1.21.3)(@supabase/supabase-js@2.57.2) - '@supabase/supabase-js': 2.57.2 - '@tanstack/react-query': 5.87.1(react@19.1.1) - next: 15.5.2(@opentelemetry/api@1.9.0)(@playwright/test@1.55.0)(babel-plugin-react-compiler@19.1.0-rc.3)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@makerkit/data-loader-supabase-core': 0.0.10(@supabase/postgrest-js@1.21.4)(@supabase/supabase-js@2.57.4) + '@supabase/supabase-js': 2.57.4 + '@tanstack/react-query': 5.89.0(react@19.1.1) + next: 15.5.3(@opentelemetry/api@1.9.0)(@playwright/test@1.55.0)(babel-plugin-react-compiler@19.1.0-rc.3)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) react: 19.1.1 transitivePeerDependencies: - '@supabase/postgrest-js' @@ -9620,32 +9990,49 @@ snapshots: js-yaml: 4.1.0 tinyglobby: 0.2.14 - '@markdoc/markdoc@0.4.0(@types/react@19.1.12)(react@19.1.1)': + '@markdoc/markdoc@0.4.0(@types/react@19.1.13)(react@19.1.1)': optionalDependencies: '@types/markdown-it': 12.2.3 - '@types/react': 19.1.12 + '@types/react': 19.1.13 react: 19.1.1 - '@markdoc/markdoc@0.5.4(@types/react@19.1.12)(react@19.1.1)': + '@markdoc/markdoc@0.5.4(@types/react@19.1.13)(react@19.1.1)': optionalDependencies: '@types/linkify-it': 3.0.5 '@types/markdown-it': 12.2.3 - '@types/react': 19.1.12 + '@types/react': 19.1.13 react: 19.1.1 - '@marsidev/react-turnstile@1.3.0(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': + '@marsidev/react-turnstile@1.3.1(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': dependencies: react: 19.1.1 react-dom: 19.1.1(react@19.1.1) + '@modelcontextprotocol/sdk@1.18.0': + dependencies: + ajv: 6.12.6 + content-type: 1.0.5 + cors: 2.8.5 + cross-spawn: 7.0.6 + eventsource: 3.0.7 + eventsource-parser: 3.0.6 + express: 5.1.0 + express-rate-limit: 7.5.1(express@5.1.0) + pkce-challenge: 5.0.0 + raw-body: 3.0.1 + zod: 3.25.76 + zod-to-json-schema: 3.24.6(zod@3.25.76) + transitivePeerDependencies: + - supports-color + '@napi-rs/wasm-runtime@0.2.12': dependencies: '@emnapi/core': 1.5.0 '@emnapi/runtime': 1.5.0 - '@tybys/wasm-util': 0.10.0 + '@tybys/wasm-util': 0.10.1 optional: true - '@next/bundle-analyzer@15.5.2': + '@next/bundle-analyzer@15.5.3': dependencies: webpack-bundle-analyzer: 4.10.1 transitivePeerDependencies: @@ -9654,34 +10041,34 @@ snapshots: '@next/env@13.5.11': {} - '@next/env@15.5.2': {} + '@next/env@15.5.3': {} - '@next/eslint-plugin-next@15.5.2': + '@next/eslint-plugin-next@15.5.3': dependencies: fast-glob: 3.3.1 - '@next/swc-darwin-arm64@15.5.2': + '@next/swc-darwin-arm64@15.5.3': optional: true - '@next/swc-darwin-x64@15.5.2': + '@next/swc-darwin-x64@15.5.3': optional: true - '@next/swc-linux-arm64-gnu@15.5.2': + '@next/swc-linux-arm64-gnu@15.5.3': optional: true - '@next/swc-linux-arm64-musl@15.5.2': + '@next/swc-linux-arm64-musl@15.5.3': optional: true - '@next/swc-linux-x64-gnu@15.5.2': + '@next/swc-linux-x64-gnu@15.5.3': optional: true - '@next/swc-linux-x64-musl@15.5.2': + '@next/swc-linux-x64-musl@15.5.3': optional: true - '@next/swc-win32-arm64-msvc@15.5.2': + '@next/swc-win32-arm64-msvc@15.5.3': optional: true - '@next/swc-win32-x64-msvc@15.5.2': + '@next/swc-win32-x64-msvc@15.5.3': optional: true '@nodelib/fs.scandir@2.1.5': @@ -9698,15 +10085,19 @@ snapshots: '@nolyfill/is-core-module@1.0.39': {} - '@nosecone/next@1.0.0-beta.11(next@15.5.2(@opentelemetry/api@1.9.0)(@playwright/test@1.55.0)(babel-plugin-react-compiler@19.1.0-rc.3)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))': + '@nosecone/next@1.0.0-beta.11(next@15.5.3(@opentelemetry/api@1.9.0)(@playwright/test@1.55.0)(babel-plugin-react-compiler@19.1.0-rc.3)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))': dependencies: - next: 15.5.2(@opentelemetry/api@1.9.0)(@playwright/test@1.55.0)(babel-plugin-react-compiler@19.1.0-rc.3)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + next: 15.5.3(@opentelemetry/api@1.9.0)(@playwright/test@1.55.0)(babel-plugin-react-compiler@19.1.0-rc.3)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) nosecone: 1.0.0-beta.11 '@opentelemetry/api-logs@0.203.0': dependencies: '@opentelemetry/api': 1.9.0 + '@opentelemetry/api-logs@0.204.0': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/api-logs@0.57.2': dependencies: '@opentelemetry/api': 1.9.0 @@ -9803,10 +10194,10 @@ snapshots: transitivePeerDependencies: - supports-color - '@opentelemetry/instrumentation-ioredis@0.51.0(@opentelemetry/api@1.9.0)': + '@opentelemetry/instrumentation-ioredis@0.52.0(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 - '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation': 0.204.0(@opentelemetry/api@1.9.0) '@opentelemetry/redis-common': 0.38.0 '@opentelemetry/semantic-conventions': 1.37.0 transitivePeerDependencies: @@ -9926,6 +10317,15 @@ snapshots: transitivePeerDependencies: - supports-color + '@opentelemetry/instrumentation@0.204.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/api-logs': 0.204.0 + import-in-the-middle: 1.14.2 + require-in-the-middle: 7.5.2 + transitivePeerDependencies: + - supports-color + '@opentelemetry/instrumentation@0.57.2(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 @@ -9989,750 +10389,750 @@ snapshots: '@radix-ui/primitive@1.1.3': {} - '@radix-ui/react-accessible-icon@1.1.7(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': + '@radix-ui/react-accessible-icon@1.1.7(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': dependencies: - '@radix-ui/react-visually-hidden': 1.2.3(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-visually-hidden': 1.2.3(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) react: 19.1.1 react-dom: 19.1.1(react@19.1.1) optionalDependencies: - '@types/react': 19.1.12 - '@types/react-dom': 19.1.9(@types/react@19.1.12) + '@types/react': 19.1.13 + '@types/react-dom': 19.1.9(@types/react@19.1.13) - '@radix-ui/react-accordion@1.2.12(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': + '@radix-ui/react-accordion@1.2.12(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': dependencies: '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-collapsible': 1.1.12(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.12)(react@19.1.1) - '@radix-ui/react-context': 1.1.2(@types/react@19.1.12)(react@19.1.1) - '@radix-ui/react-direction': 1.1.1(@types/react@19.1.12)(react@19.1.1) - '@radix-ui/react-id': 1.1.1(@types/react@19.1.12)(react@19.1.1) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.1.12)(react@19.1.1) + '@radix-ui/react-collapsible': 1.1.12(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.13)(react@19.1.1) + '@radix-ui/react-context': 1.1.2(@types/react@19.1.13)(react@19.1.1) + '@radix-ui/react-direction': 1.1.1(@types/react@19.1.13)(react@19.1.1) + '@radix-ui/react-id': 1.1.1(@types/react@19.1.13)(react@19.1.1) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.1.13)(react@19.1.1) react: 19.1.1 react-dom: 19.1.1(react@19.1.1) optionalDependencies: - '@types/react': 19.1.12 - '@types/react-dom': 19.1.9(@types/react@19.1.12) + '@types/react': 19.1.13 + '@types/react-dom': 19.1.9(@types/react@19.1.13) - '@radix-ui/react-alert-dialog@1.1.15(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': + '@radix-ui/react-alert-dialog@1.1.15(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': dependencies: '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.12)(react@19.1.1) - '@radix-ui/react-context': 1.1.2(@types/react@19.1.12)(react@19.1.1) - '@radix-ui/react-dialog': 1.1.15(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-slot': 1.2.3(@types/react@19.1.12)(react@19.1.1) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.13)(react@19.1.1) + '@radix-ui/react-context': 1.1.2(@types/react@19.1.13)(react@19.1.1) + '@radix-ui/react-dialog': 1.1.15(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-slot': 1.2.3(@types/react@19.1.13)(react@19.1.1) react: 19.1.1 react-dom: 19.1.1(react@19.1.1) optionalDependencies: - '@types/react': 19.1.12 - '@types/react-dom': 19.1.9(@types/react@19.1.12) + '@types/react': 19.1.13 + '@types/react-dom': 19.1.9(@types/react@19.1.13) - '@radix-ui/react-arrow@1.1.7(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': + '@radix-ui/react-arrow@1.1.7(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': dependencies: - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) react: 19.1.1 react-dom: 19.1.1(react@19.1.1) optionalDependencies: - '@types/react': 19.1.12 - '@types/react-dom': 19.1.9(@types/react@19.1.12) + '@types/react': 19.1.13 + '@types/react-dom': 19.1.9(@types/react@19.1.13) - '@radix-ui/react-aspect-ratio@1.1.7(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': + '@radix-ui/react-aspect-ratio@1.1.7(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': dependencies: - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) react: 19.1.1 react-dom: 19.1.1(react@19.1.1) optionalDependencies: - '@types/react': 19.1.12 - '@types/react-dom': 19.1.9(@types/react@19.1.12) + '@types/react': 19.1.13 + '@types/react-dom': 19.1.9(@types/react@19.1.13) - '@radix-ui/react-avatar@1.1.10(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': + '@radix-ui/react-avatar@1.1.10(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': dependencies: - '@radix-ui/react-context': 1.1.2(@types/react@19.1.12)(react@19.1.1) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.1.12)(react@19.1.1) - '@radix-ui/react-use-is-hydrated': 0.1.0(@types/react@19.1.12)(react@19.1.1) - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.12)(react@19.1.1) + '@radix-ui/react-context': 1.1.2(@types/react@19.1.13)(react@19.1.1) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.1.13)(react@19.1.1) + '@radix-ui/react-use-is-hydrated': 0.1.0(@types/react@19.1.13)(react@19.1.1) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.13)(react@19.1.1) react: 19.1.1 react-dom: 19.1.1(react@19.1.1) optionalDependencies: - '@types/react': 19.1.12 - '@types/react-dom': 19.1.9(@types/react@19.1.12) + '@types/react': 19.1.13 + '@types/react-dom': 19.1.9(@types/react@19.1.13) - '@radix-ui/react-checkbox@1.3.3(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': + '@radix-ui/react-checkbox@1.3.3(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': dependencies: '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.12)(react@19.1.1) - '@radix-ui/react-context': 1.1.2(@types/react@19.1.12)(react@19.1.1) - '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.1.12)(react@19.1.1) - '@radix-ui/react-use-previous': 1.1.1(@types/react@19.1.12)(react@19.1.1) - '@radix-ui/react-use-size': 1.1.1(@types/react@19.1.12)(react@19.1.1) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.13)(react@19.1.1) + '@radix-ui/react-context': 1.1.2(@types/react@19.1.13)(react@19.1.1) + '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.1.13)(react@19.1.1) + '@radix-ui/react-use-previous': 1.1.1(@types/react@19.1.13)(react@19.1.1) + '@radix-ui/react-use-size': 1.1.1(@types/react@19.1.13)(react@19.1.1) react: 19.1.1 react-dom: 19.1.1(react@19.1.1) optionalDependencies: - '@types/react': 19.1.12 - '@types/react-dom': 19.1.9(@types/react@19.1.12) + '@types/react': 19.1.13 + '@types/react-dom': 19.1.9(@types/react@19.1.13) - '@radix-ui/react-collapsible@1.1.12(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': + '@radix-ui/react-collapsible@1.1.12(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': dependencies: '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.12)(react@19.1.1) - '@radix-ui/react-context': 1.1.2(@types/react@19.1.12)(react@19.1.1) - '@radix-ui/react-id': 1.1.1(@types/react@19.1.12)(react@19.1.1) - '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.1.12)(react@19.1.1) - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.12)(react@19.1.1) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.13)(react@19.1.1) + '@radix-ui/react-context': 1.1.2(@types/react@19.1.13)(react@19.1.1) + '@radix-ui/react-id': 1.1.1(@types/react@19.1.13)(react@19.1.1) + '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.1.13)(react@19.1.1) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.13)(react@19.1.1) react: 19.1.1 react-dom: 19.1.1(react@19.1.1) optionalDependencies: - '@types/react': 19.1.12 - '@types/react-dom': 19.1.9(@types/react@19.1.12) + '@types/react': 19.1.13 + '@types/react-dom': 19.1.9(@types/react@19.1.13) - '@radix-ui/react-collection@1.1.7(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': + '@radix-ui/react-collection@1.1.7(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': dependencies: - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.12)(react@19.1.1) - '@radix-ui/react-context': 1.1.2(@types/react@19.1.12)(react@19.1.1) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-slot': 1.2.3(@types/react@19.1.12)(react@19.1.1) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.13)(react@19.1.1) + '@radix-ui/react-context': 1.1.2(@types/react@19.1.13)(react@19.1.1) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-slot': 1.2.3(@types/react@19.1.13)(react@19.1.1) react: 19.1.1 react-dom: 19.1.1(react@19.1.1) optionalDependencies: - '@types/react': 19.1.12 - '@types/react-dom': 19.1.9(@types/react@19.1.12) + '@types/react': 19.1.13 + '@types/react-dom': 19.1.9(@types/react@19.1.13) - '@radix-ui/react-compose-refs@1.1.2(@types/react@19.1.12)(react@19.1.1)': + '@radix-ui/react-compose-refs@1.1.2(@types/react@19.1.13)(react@19.1.1)': dependencies: react: 19.1.1 optionalDependencies: - '@types/react': 19.1.12 + '@types/react': 19.1.13 - '@radix-ui/react-context-menu@2.2.16(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': + '@radix-ui/react-context-menu@2.2.16(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': dependencies: '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-context': 1.1.2(@types/react@19.1.12)(react@19.1.1) - '@radix-ui/react-menu': 2.1.16(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.1.12)(react@19.1.1) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.1.12)(react@19.1.1) + '@radix-ui/react-context': 1.1.2(@types/react@19.1.13)(react@19.1.1) + '@radix-ui/react-menu': 2.1.16(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.1.13)(react@19.1.1) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.1.13)(react@19.1.1) react: 19.1.1 react-dom: 19.1.1(react@19.1.1) optionalDependencies: - '@types/react': 19.1.12 - '@types/react-dom': 19.1.9(@types/react@19.1.12) + '@types/react': 19.1.13 + '@types/react-dom': 19.1.9(@types/react@19.1.13) - '@radix-ui/react-context@1.1.2(@types/react@19.1.12)(react@19.1.1)': + '@radix-ui/react-context@1.1.2(@types/react@19.1.13)(react@19.1.1)': dependencies: react: 19.1.1 optionalDependencies: - '@types/react': 19.1.12 + '@types/react': 19.1.13 - '@radix-ui/react-dialog@1.1.15(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': + '@radix-ui/react-dialog@1.1.15(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': dependencies: '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.12)(react@19.1.1) - '@radix-ui/react-context': 1.1.2(@types/react@19.1.12)(react@19.1.1) - '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-focus-guards': 1.1.3(@types/react@19.1.12)(react@19.1.1) - '@radix-ui/react-focus-scope': 1.1.7(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-id': 1.1.1(@types/react@19.1.12)(react@19.1.1) - '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-slot': 1.2.3(@types/react@19.1.12)(react@19.1.1) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.1.12)(react@19.1.1) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.13)(react@19.1.1) + '@radix-ui/react-context': 1.1.2(@types/react@19.1.13)(react@19.1.1) + '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-focus-guards': 1.1.3(@types/react@19.1.13)(react@19.1.1) + '@radix-ui/react-focus-scope': 1.1.7(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-id': 1.1.1(@types/react@19.1.13)(react@19.1.1) + '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-slot': 1.2.3(@types/react@19.1.13)(react@19.1.1) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.1.13)(react@19.1.1) aria-hidden: 1.2.6 react: 19.1.1 react-dom: 19.1.1(react@19.1.1) - react-remove-scroll: 2.7.1(@types/react@19.1.12)(react@19.1.1) + react-remove-scroll: 2.7.1(@types/react@19.1.13)(react@19.1.1) optionalDependencies: - '@types/react': 19.1.12 - '@types/react-dom': 19.1.9(@types/react@19.1.12) + '@types/react': 19.1.13 + '@types/react-dom': 19.1.9(@types/react@19.1.13) - '@radix-ui/react-direction@1.1.1(@types/react@19.1.12)(react@19.1.1)': + '@radix-ui/react-direction@1.1.1(@types/react@19.1.13)(react@19.1.1)': dependencies: react: 19.1.1 optionalDependencies: - '@types/react': 19.1.12 + '@types/react': 19.1.13 - '@radix-ui/react-dismissable-layer@1.1.11(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': + '@radix-ui/react-dismissable-layer@1.1.11(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': dependencies: '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.12)(react@19.1.1) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.1.12)(react@19.1.1) - '@radix-ui/react-use-escape-keydown': 1.1.1(@types/react@19.1.12)(react@19.1.1) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.13)(react@19.1.1) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.1.13)(react@19.1.1) + '@radix-ui/react-use-escape-keydown': 1.1.1(@types/react@19.1.13)(react@19.1.1) react: 19.1.1 react-dom: 19.1.1(react@19.1.1) optionalDependencies: - '@types/react': 19.1.12 - '@types/react-dom': 19.1.9(@types/react@19.1.12) + '@types/react': 19.1.13 + '@types/react-dom': 19.1.9(@types/react@19.1.13) - '@radix-ui/react-dropdown-menu@2.1.16(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': + '@radix-ui/react-dropdown-menu@2.1.16(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': dependencies: '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.12)(react@19.1.1) - '@radix-ui/react-context': 1.1.2(@types/react@19.1.12)(react@19.1.1) - '@radix-ui/react-id': 1.1.1(@types/react@19.1.12)(react@19.1.1) - '@radix-ui/react-menu': 2.1.16(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.1.12)(react@19.1.1) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.13)(react@19.1.1) + '@radix-ui/react-context': 1.1.2(@types/react@19.1.13)(react@19.1.1) + '@radix-ui/react-id': 1.1.1(@types/react@19.1.13)(react@19.1.1) + '@radix-ui/react-menu': 2.1.16(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.1.13)(react@19.1.1) react: 19.1.1 react-dom: 19.1.1(react@19.1.1) optionalDependencies: - '@types/react': 19.1.12 - '@types/react-dom': 19.1.9(@types/react@19.1.12) + '@types/react': 19.1.13 + '@types/react-dom': 19.1.9(@types/react@19.1.13) - '@radix-ui/react-focus-guards@1.1.3(@types/react@19.1.12)(react@19.1.1)': + '@radix-ui/react-focus-guards@1.1.3(@types/react@19.1.13)(react@19.1.1)': dependencies: react: 19.1.1 optionalDependencies: - '@types/react': 19.1.12 + '@types/react': 19.1.13 - '@radix-ui/react-focus-scope@1.1.7(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': + '@radix-ui/react-focus-scope@1.1.7(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': dependencies: - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.12)(react@19.1.1) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.1.12)(react@19.1.1) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.13)(react@19.1.1) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.1.13)(react@19.1.1) react: 19.1.1 react-dom: 19.1.1(react@19.1.1) optionalDependencies: - '@types/react': 19.1.12 - '@types/react-dom': 19.1.9(@types/react@19.1.12) + '@types/react': 19.1.13 + '@types/react-dom': 19.1.9(@types/react@19.1.13) - '@radix-ui/react-form@0.1.8(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': + '@radix-ui/react-form@0.1.8(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': dependencies: '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.12)(react@19.1.1) - '@radix-ui/react-context': 1.1.2(@types/react@19.1.12)(react@19.1.1) - '@radix-ui/react-id': 1.1.1(@types/react@19.1.12)(react@19.1.1) - '@radix-ui/react-label': 2.1.7(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.13)(react@19.1.1) + '@radix-ui/react-context': 1.1.2(@types/react@19.1.13)(react@19.1.1) + '@radix-ui/react-id': 1.1.1(@types/react@19.1.13)(react@19.1.1) + '@radix-ui/react-label': 2.1.7(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) react: 19.1.1 react-dom: 19.1.1(react@19.1.1) optionalDependencies: - '@types/react': 19.1.12 - '@types/react-dom': 19.1.9(@types/react@19.1.12) + '@types/react': 19.1.13 + '@types/react-dom': 19.1.9(@types/react@19.1.13) - '@radix-ui/react-hover-card@1.1.15(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': + '@radix-ui/react-hover-card@1.1.15(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': dependencies: '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.12)(react@19.1.1) - '@radix-ui/react-context': 1.1.2(@types/react@19.1.12)(react@19.1.1) - '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-popper': 1.2.8(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.1.12)(react@19.1.1) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.13)(react@19.1.1) + '@radix-ui/react-context': 1.1.2(@types/react@19.1.13)(react@19.1.1) + '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-popper': 1.2.8(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.1.13)(react@19.1.1) react: 19.1.1 react-dom: 19.1.1(react@19.1.1) optionalDependencies: - '@types/react': 19.1.12 - '@types/react-dom': 19.1.9(@types/react@19.1.12) + '@types/react': 19.1.13 + '@types/react-dom': 19.1.9(@types/react@19.1.13) '@radix-ui/react-icons@1.3.2(react@19.1.1)': dependencies: react: 19.1.1 - '@radix-ui/react-id@1.1.1(@types/react@19.1.12)(react@19.1.1)': + '@radix-ui/react-id@1.1.1(@types/react@19.1.13)(react@19.1.1)': dependencies: - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.12)(react@19.1.1) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.13)(react@19.1.1) react: 19.1.1 optionalDependencies: - '@types/react': 19.1.12 + '@types/react': 19.1.13 - '@radix-ui/react-label@2.1.7(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': + '@radix-ui/react-label@2.1.7(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': dependencies: - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) react: 19.1.1 react-dom: 19.1.1(react@19.1.1) optionalDependencies: - '@types/react': 19.1.12 - '@types/react-dom': 19.1.9(@types/react@19.1.12) + '@types/react': 19.1.13 + '@types/react-dom': 19.1.9(@types/react@19.1.13) - '@radix-ui/react-menu@2.1.16(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': + '@radix-ui/react-menu@2.1.16(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': dependencies: '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.12)(react@19.1.1) - '@radix-ui/react-context': 1.1.2(@types/react@19.1.12)(react@19.1.1) - '@radix-ui/react-direction': 1.1.1(@types/react@19.1.12)(react@19.1.1) - '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-focus-guards': 1.1.3(@types/react@19.1.12)(react@19.1.1) - '@radix-ui/react-focus-scope': 1.1.7(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-id': 1.1.1(@types/react@19.1.12)(react@19.1.1) - '@radix-ui/react-popper': 1.2.8(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-roving-focus': 1.1.11(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-slot': 1.2.3(@types/react@19.1.12)(react@19.1.1) - '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.1.12)(react@19.1.1) + '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.13)(react@19.1.1) + '@radix-ui/react-context': 1.1.2(@types/react@19.1.13)(react@19.1.1) + '@radix-ui/react-direction': 1.1.1(@types/react@19.1.13)(react@19.1.1) + '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-focus-guards': 1.1.3(@types/react@19.1.13)(react@19.1.1) + '@radix-ui/react-focus-scope': 1.1.7(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-id': 1.1.1(@types/react@19.1.13)(react@19.1.1) + '@radix-ui/react-popper': 1.2.8(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-roving-focus': 1.1.11(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-slot': 1.2.3(@types/react@19.1.13)(react@19.1.1) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.1.13)(react@19.1.1) aria-hidden: 1.2.6 react: 19.1.1 react-dom: 19.1.1(react@19.1.1) - react-remove-scroll: 2.7.1(@types/react@19.1.12)(react@19.1.1) + react-remove-scroll: 2.7.1(@types/react@19.1.13)(react@19.1.1) optionalDependencies: - '@types/react': 19.1.12 - '@types/react-dom': 19.1.9(@types/react@19.1.12) + '@types/react': 19.1.13 + '@types/react-dom': 19.1.9(@types/react@19.1.13) - '@radix-ui/react-menubar@1.1.16(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': + '@radix-ui/react-menubar@1.1.16(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': dependencies: '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.12)(react@19.1.1) - '@radix-ui/react-context': 1.1.2(@types/react@19.1.12)(react@19.1.1) - '@radix-ui/react-direction': 1.1.1(@types/react@19.1.12)(react@19.1.1) - '@radix-ui/react-id': 1.1.1(@types/react@19.1.12)(react@19.1.1) - '@radix-ui/react-menu': 2.1.16(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-roving-focus': 1.1.11(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.1.12)(react@19.1.1) + '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.13)(react@19.1.1) + '@radix-ui/react-context': 1.1.2(@types/react@19.1.13)(react@19.1.1) + '@radix-ui/react-direction': 1.1.1(@types/react@19.1.13)(react@19.1.1) + '@radix-ui/react-id': 1.1.1(@types/react@19.1.13)(react@19.1.1) + '@radix-ui/react-menu': 2.1.16(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-roving-focus': 1.1.11(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.1.13)(react@19.1.1) react: 19.1.1 react-dom: 19.1.1(react@19.1.1) optionalDependencies: - '@types/react': 19.1.12 - '@types/react-dom': 19.1.9(@types/react@19.1.12) + '@types/react': 19.1.13 + '@types/react-dom': 19.1.9(@types/react@19.1.13) - '@radix-ui/react-navigation-menu@1.2.14(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': + '@radix-ui/react-navigation-menu@1.2.14(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': dependencies: '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.12)(react@19.1.1) - '@radix-ui/react-context': 1.1.2(@types/react@19.1.12)(react@19.1.1) - '@radix-ui/react-direction': 1.1.1(@types/react@19.1.12)(react@19.1.1) - '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-id': 1.1.1(@types/react@19.1.12)(react@19.1.1) - '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.1.12)(react@19.1.1) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.1.12)(react@19.1.1) - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.12)(react@19.1.1) - '@radix-ui/react-use-previous': 1.1.1(@types/react@19.1.12)(react@19.1.1) - '@radix-ui/react-visually-hidden': 1.2.3(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.13)(react@19.1.1) + '@radix-ui/react-context': 1.1.2(@types/react@19.1.13)(react@19.1.1) + '@radix-ui/react-direction': 1.1.1(@types/react@19.1.13)(react@19.1.1) + '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-id': 1.1.1(@types/react@19.1.13)(react@19.1.1) + '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.1.13)(react@19.1.1) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.1.13)(react@19.1.1) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.13)(react@19.1.1) + '@radix-ui/react-use-previous': 1.1.1(@types/react@19.1.13)(react@19.1.1) + '@radix-ui/react-visually-hidden': 1.2.3(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) react: 19.1.1 react-dom: 19.1.1(react@19.1.1) optionalDependencies: - '@types/react': 19.1.12 - '@types/react-dom': 19.1.9(@types/react@19.1.12) + '@types/react': 19.1.13 + '@types/react-dom': 19.1.9(@types/react@19.1.13) - '@radix-ui/react-one-time-password-field@0.1.8(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': + '@radix-ui/react-one-time-password-field@0.1.8(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': dependencies: '@radix-ui/number': 1.1.1 '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.12)(react@19.1.1) - '@radix-ui/react-context': 1.1.2(@types/react@19.1.12)(react@19.1.1) - '@radix-ui/react-direction': 1.1.1(@types/react@19.1.12)(react@19.1.1) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-roving-focus': 1.1.11(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.1.12)(react@19.1.1) - '@radix-ui/react-use-effect-event': 0.0.2(@types/react@19.1.12)(react@19.1.1) - '@radix-ui/react-use-is-hydrated': 0.1.0(@types/react@19.1.12)(react@19.1.1) - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.12)(react@19.1.1) + '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.13)(react@19.1.1) + '@radix-ui/react-context': 1.1.2(@types/react@19.1.13)(react@19.1.1) + '@radix-ui/react-direction': 1.1.1(@types/react@19.1.13)(react@19.1.1) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-roving-focus': 1.1.11(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.1.13)(react@19.1.1) + '@radix-ui/react-use-effect-event': 0.0.2(@types/react@19.1.13)(react@19.1.1) + '@radix-ui/react-use-is-hydrated': 0.1.0(@types/react@19.1.13)(react@19.1.1) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.13)(react@19.1.1) react: 19.1.1 react-dom: 19.1.1(react@19.1.1) optionalDependencies: - '@types/react': 19.1.12 - '@types/react-dom': 19.1.9(@types/react@19.1.12) + '@types/react': 19.1.13 + '@types/react-dom': 19.1.9(@types/react@19.1.13) - '@radix-ui/react-password-toggle-field@0.1.3(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': + '@radix-ui/react-password-toggle-field@0.1.3(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': dependencies: '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.12)(react@19.1.1) - '@radix-ui/react-context': 1.1.2(@types/react@19.1.12)(react@19.1.1) - '@radix-ui/react-id': 1.1.1(@types/react@19.1.12)(react@19.1.1) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.1.12)(react@19.1.1) - '@radix-ui/react-use-effect-event': 0.0.2(@types/react@19.1.12)(react@19.1.1) - '@radix-ui/react-use-is-hydrated': 0.1.0(@types/react@19.1.12)(react@19.1.1) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.13)(react@19.1.1) + '@radix-ui/react-context': 1.1.2(@types/react@19.1.13)(react@19.1.1) + '@radix-ui/react-id': 1.1.1(@types/react@19.1.13)(react@19.1.1) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.1.13)(react@19.1.1) + '@radix-ui/react-use-effect-event': 0.0.2(@types/react@19.1.13)(react@19.1.1) + '@radix-ui/react-use-is-hydrated': 0.1.0(@types/react@19.1.13)(react@19.1.1) react: 19.1.1 react-dom: 19.1.1(react@19.1.1) optionalDependencies: - '@types/react': 19.1.12 - '@types/react-dom': 19.1.9(@types/react@19.1.12) + '@types/react': 19.1.13 + '@types/react-dom': 19.1.9(@types/react@19.1.13) - '@radix-ui/react-popover@1.1.15(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': + '@radix-ui/react-popover@1.1.15(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': dependencies: '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.12)(react@19.1.1) - '@radix-ui/react-context': 1.1.2(@types/react@19.1.12)(react@19.1.1) - '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-focus-guards': 1.1.3(@types/react@19.1.12)(react@19.1.1) - '@radix-ui/react-focus-scope': 1.1.7(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-id': 1.1.1(@types/react@19.1.12)(react@19.1.1) - '@radix-ui/react-popper': 1.2.8(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-slot': 1.2.3(@types/react@19.1.12)(react@19.1.1) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.1.12)(react@19.1.1) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.13)(react@19.1.1) + '@radix-ui/react-context': 1.1.2(@types/react@19.1.13)(react@19.1.1) + '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-focus-guards': 1.1.3(@types/react@19.1.13)(react@19.1.1) + '@radix-ui/react-focus-scope': 1.1.7(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-id': 1.1.1(@types/react@19.1.13)(react@19.1.1) + '@radix-ui/react-popper': 1.2.8(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-slot': 1.2.3(@types/react@19.1.13)(react@19.1.1) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.1.13)(react@19.1.1) aria-hidden: 1.2.6 react: 19.1.1 react-dom: 19.1.1(react@19.1.1) - react-remove-scroll: 2.7.1(@types/react@19.1.12)(react@19.1.1) + react-remove-scroll: 2.7.1(@types/react@19.1.13)(react@19.1.1) optionalDependencies: - '@types/react': 19.1.12 - '@types/react-dom': 19.1.9(@types/react@19.1.12) + '@types/react': 19.1.13 + '@types/react-dom': 19.1.9(@types/react@19.1.13) - '@radix-ui/react-popper@1.2.8(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': + '@radix-ui/react-popper@1.2.8(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': dependencies: '@floating-ui/react-dom': 2.1.6(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-arrow': 1.1.7(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.12)(react@19.1.1) - '@radix-ui/react-context': 1.1.2(@types/react@19.1.12)(react@19.1.1) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.1.12)(react@19.1.1) - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.12)(react@19.1.1) - '@radix-ui/react-use-rect': 1.1.1(@types/react@19.1.12)(react@19.1.1) - '@radix-ui/react-use-size': 1.1.1(@types/react@19.1.12)(react@19.1.1) + '@radix-ui/react-arrow': 1.1.7(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.13)(react@19.1.1) + '@radix-ui/react-context': 1.1.2(@types/react@19.1.13)(react@19.1.1) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.1.13)(react@19.1.1) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.13)(react@19.1.1) + '@radix-ui/react-use-rect': 1.1.1(@types/react@19.1.13)(react@19.1.1) + '@radix-ui/react-use-size': 1.1.1(@types/react@19.1.13)(react@19.1.1) '@radix-ui/rect': 1.1.1 react: 19.1.1 react-dom: 19.1.1(react@19.1.1) optionalDependencies: - '@types/react': 19.1.12 - '@types/react-dom': 19.1.9(@types/react@19.1.12) + '@types/react': 19.1.13 + '@types/react-dom': 19.1.9(@types/react@19.1.13) - '@radix-ui/react-portal@1.1.9(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': + '@radix-ui/react-portal@1.1.9(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': dependencies: - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.12)(react@19.1.1) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.13)(react@19.1.1) react: 19.1.1 react-dom: 19.1.1(react@19.1.1) optionalDependencies: - '@types/react': 19.1.12 - '@types/react-dom': 19.1.9(@types/react@19.1.12) + '@types/react': 19.1.13 + '@types/react-dom': 19.1.9(@types/react@19.1.13) - '@radix-ui/react-presence@1.1.5(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': + '@radix-ui/react-presence@1.1.5(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': dependencies: - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.12)(react@19.1.1) - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.12)(react@19.1.1) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.13)(react@19.1.1) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.13)(react@19.1.1) react: 19.1.1 react-dom: 19.1.1(react@19.1.1) optionalDependencies: - '@types/react': 19.1.12 - '@types/react-dom': 19.1.9(@types/react@19.1.12) + '@types/react': 19.1.13 + '@types/react-dom': 19.1.9(@types/react@19.1.13) - '@radix-ui/react-primitive@2.1.3(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': + '@radix-ui/react-primitive@2.1.3(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': dependencies: - '@radix-ui/react-slot': 1.2.3(@types/react@19.1.12)(react@19.1.1) + '@radix-ui/react-slot': 1.2.3(@types/react@19.1.13)(react@19.1.1) react: 19.1.1 react-dom: 19.1.1(react@19.1.1) optionalDependencies: - '@types/react': 19.1.12 - '@types/react-dom': 19.1.9(@types/react@19.1.12) + '@types/react': 19.1.13 + '@types/react-dom': 19.1.9(@types/react@19.1.13) - '@radix-ui/react-progress@1.1.7(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': + '@radix-ui/react-progress@1.1.7(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': dependencies: - '@radix-ui/react-context': 1.1.2(@types/react@19.1.12)(react@19.1.1) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-context': 1.1.2(@types/react@19.1.13)(react@19.1.1) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) react: 19.1.1 react-dom: 19.1.1(react@19.1.1) optionalDependencies: - '@types/react': 19.1.12 - '@types/react-dom': 19.1.9(@types/react@19.1.12) + '@types/react': 19.1.13 + '@types/react-dom': 19.1.9(@types/react@19.1.13) - '@radix-ui/react-radio-group@1.3.8(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': + '@radix-ui/react-radio-group@1.3.8(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': dependencies: '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.12)(react@19.1.1) - '@radix-ui/react-context': 1.1.2(@types/react@19.1.12)(react@19.1.1) - '@radix-ui/react-direction': 1.1.1(@types/react@19.1.12)(react@19.1.1) - '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-roving-focus': 1.1.11(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.1.12)(react@19.1.1) - '@radix-ui/react-use-previous': 1.1.1(@types/react@19.1.12)(react@19.1.1) - '@radix-ui/react-use-size': 1.1.1(@types/react@19.1.12)(react@19.1.1) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.13)(react@19.1.1) + '@radix-ui/react-context': 1.1.2(@types/react@19.1.13)(react@19.1.1) + '@radix-ui/react-direction': 1.1.1(@types/react@19.1.13)(react@19.1.1) + '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-roving-focus': 1.1.11(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.1.13)(react@19.1.1) + '@radix-ui/react-use-previous': 1.1.1(@types/react@19.1.13)(react@19.1.1) + '@radix-ui/react-use-size': 1.1.1(@types/react@19.1.13)(react@19.1.1) react: 19.1.1 react-dom: 19.1.1(react@19.1.1) optionalDependencies: - '@types/react': 19.1.12 - '@types/react-dom': 19.1.9(@types/react@19.1.12) + '@types/react': 19.1.13 + '@types/react-dom': 19.1.9(@types/react@19.1.13) - '@radix-ui/react-roving-focus@1.1.11(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': + '@radix-ui/react-roving-focus@1.1.11(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': dependencies: '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.12)(react@19.1.1) - '@radix-ui/react-context': 1.1.2(@types/react@19.1.12)(react@19.1.1) - '@radix-ui/react-direction': 1.1.1(@types/react@19.1.12)(react@19.1.1) - '@radix-ui/react-id': 1.1.1(@types/react@19.1.12)(react@19.1.1) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.1.12)(react@19.1.1) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.1.12)(react@19.1.1) + '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.13)(react@19.1.1) + '@radix-ui/react-context': 1.1.2(@types/react@19.1.13)(react@19.1.1) + '@radix-ui/react-direction': 1.1.1(@types/react@19.1.13)(react@19.1.1) + '@radix-ui/react-id': 1.1.1(@types/react@19.1.13)(react@19.1.1) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.1.13)(react@19.1.1) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.1.13)(react@19.1.1) react: 19.1.1 react-dom: 19.1.1(react@19.1.1) optionalDependencies: - '@types/react': 19.1.12 - '@types/react-dom': 19.1.9(@types/react@19.1.12) + '@types/react': 19.1.13 + '@types/react-dom': 19.1.9(@types/react@19.1.13) - '@radix-ui/react-scroll-area@1.2.10(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': + '@radix-ui/react-scroll-area@1.2.10(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': dependencies: '@radix-ui/number': 1.1.1 '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.12)(react@19.1.1) - '@radix-ui/react-context': 1.1.2(@types/react@19.1.12)(react@19.1.1) - '@radix-ui/react-direction': 1.1.1(@types/react@19.1.12)(react@19.1.1) - '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.1.12)(react@19.1.1) - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.12)(react@19.1.1) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.13)(react@19.1.1) + '@radix-ui/react-context': 1.1.2(@types/react@19.1.13)(react@19.1.1) + '@radix-ui/react-direction': 1.1.1(@types/react@19.1.13)(react@19.1.1) + '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.1.13)(react@19.1.1) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.13)(react@19.1.1) react: 19.1.1 react-dom: 19.1.1(react@19.1.1) optionalDependencies: - '@types/react': 19.1.12 - '@types/react-dom': 19.1.9(@types/react@19.1.12) + '@types/react': 19.1.13 + '@types/react-dom': 19.1.9(@types/react@19.1.13) - '@radix-ui/react-select@2.2.6(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': + '@radix-ui/react-select@2.2.6(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': dependencies: '@radix-ui/number': 1.1.1 '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.12)(react@19.1.1) - '@radix-ui/react-context': 1.1.2(@types/react@19.1.12)(react@19.1.1) - '@radix-ui/react-direction': 1.1.1(@types/react@19.1.12)(react@19.1.1) - '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-focus-guards': 1.1.3(@types/react@19.1.12)(react@19.1.1) - '@radix-ui/react-focus-scope': 1.1.7(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-id': 1.1.1(@types/react@19.1.12)(react@19.1.1) - '@radix-ui/react-popper': 1.2.8(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-slot': 1.2.3(@types/react@19.1.12)(react@19.1.1) - '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.1.12)(react@19.1.1) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.1.12)(react@19.1.1) - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.12)(react@19.1.1) - '@radix-ui/react-use-previous': 1.1.1(@types/react@19.1.12)(react@19.1.1) - '@radix-ui/react-visually-hidden': 1.2.3(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.13)(react@19.1.1) + '@radix-ui/react-context': 1.1.2(@types/react@19.1.13)(react@19.1.1) + '@radix-ui/react-direction': 1.1.1(@types/react@19.1.13)(react@19.1.1) + '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-focus-guards': 1.1.3(@types/react@19.1.13)(react@19.1.1) + '@radix-ui/react-focus-scope': 1.1.7(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-id': 1.1.1(@types/react@19.1.13)(react@19.1.1) + '@radix-ui/react-popper': 1.2.8(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-slot': 1.2.3(@types/react@19.1.13)(react@19.1.1) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.1.13)(react@19.1.1) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.1.13)(react@19.1.1) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.13)(react@19.1.1) + '@radix-ui/react-use-previous': 1.1.1(@types/react@19.1.13)(react@19.1.1) + '@radix-ui/react-visually-hidden': 1.2.3(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) aria-hidden: 1.2.6 react: 19.1.1 react-dom: 19.1.1(react@19.1.1) - react-remove-scroll: 2.7.1(@types/react@19.1.12)(react@19.1.1) + react-remove-scroll: 2.7.1(@types/react@19.1.13)(react@19.1.1) optionalDependencies: - '@types/react': 19.1.12 - '@types/react-dom': 19.1.9(@types/react@19.1.12) + '@types/react': 19.1.13 + '@types/react-dom': 19.1.9(@types/react@19.1.13) - '@radix-ui/react-separator@1.1.7(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': + '@radix-ui/react-separator@1.1.7(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': dependencies: - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) react: 19.1.1 react-dom: 19.1.1(react@19.1.1) optionalDependencies: - '@types/react': 19.1.12 - '@types/react-dom': 19.1.9(@types/react@19.1.12) + '@types/react': 19.1.13 + '@types/react-dom': 19.1.9(@types/react@19.1.13) - '@radix-ui/react-slider@1.3.6(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': + '@radix-ui/react-slider@1.3.6(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': dependencies: '@radix-ui/number': 1.1.1 '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.12)(react@19.1.1) - '@radix-ui/react-context': 1.1.2(@types/react@19.1.12)(react@19.1.1) - '@radix-ui/react-direction': 1.1.1(@types/react@19.1.12)(react@19.1.1) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.1.12)(react@19.1.1) - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.12)(react@19.1.1) - '@radix-ui/react-use-previous': 1.1.1(@types/react@19.1.12)(react@19.1.1) - '@radix-ui/react-use-size': 1.1.1(@types/react@19.1.12)(react@19.1.1) + '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.13)(react@19.1.1) + '@radix-ui/react-context': 1.1.2(@types/react@19.1.13)(react@19.1.1) + '@radix-ui/react-direction': 1.1.1(@types/react@19.1.13)(react@19.1.1) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.1.13)(react@19.1.1) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.13)(react@19.1.1) + '@radix-ui/react-use-previous': 1.1.1(@types/react@19.1.13)(react@19.1.1) + '@radix-ui/react-use-size': 1.1.1(@types/react@19.1.13)(react@19.1.1) react: 19.1.1 react-dom: 19.1.1(react@19.1.1) optionalDependencies: - '@types/react': 19.1.12 - '@types/react-dom': 19.1.9(@types/react@19.1.12) + '@types/react': 19.1.13 + '@types/react-dom': 19.1.9(@types/react@19.1.13) - '@radix-ui/react-slot@1.2.3(@types/react@19.1.12)(react@19.1.1)': + '@radix-ui/react-slot@1.2.3(@types/react@19.1.13)(react@19.1.1)': dependencies: - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.12)(react@19.1.1) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.13)(react@19.1.1) react: 19.1.1 optionalDependencies: - '@types/react': 19.1.12 + '@types/react': 19.1.13 - '@radix-ui/react-switch@1.2.6(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': + '@radix-ui/react-switch@1.2.6(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': dependencies: '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.12)(react@19.1.1) - '@radix-ui/react-context': 1.1.2(@types/react@19.1.12)(react@19.1.1) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.1.12)(react@19.1.1) - '@radix-ui/react-use-previous': 1.1.1(@types/react@19.1.12)(react@19.1.1) - '@radix-ui/react-use-size': 1.1.1(@types/react@19.1.12)(react@19.1.1) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.13)(react@19.1.1) + '@radix-ui/react-context': 1.1.2(@types/react@19.1.13)(react@19.1.1) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.1.13)(react@19.1.1) + '@radix-ui/react-use-previous': 1.1.1(@types/react@19.1.13)(react@19.1.1) + '@radix-ui/react-use-size': 1.1.1(@types/react@19.1.13)(react@19.1.1) react: 19.1.1 react-dom: 19.1.1(react@19.1.1) optionalDependencies: - '@types/react': 19.1.12 - '@types/react-dom': 19.1.9(@types/react@19.1.12) + '@types/react': 19.1.13 + '@types/react-dom': 19.1.9(@types/react@19.1.13) - '@radix-ui/react-tabs@1.1.13(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': + '@radix-ui/react-tabs@1.1.13(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': dependencies: '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-context': 1.1.2(@types/react@19.1.12)(react@19.1.1) - '@radix-ui/react-direction': 1.1.1(@types/react@19.1.12)(react@19.1.1) - '@radix-ui/react-id': 1.1.1(@types/react@19.1.12)(react@19.1.1) - '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-roving-focus': 1.1.11(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.1.12)(react@19.1.1) + '@radix-ui/react-context': 1.1.2(@types/react@19.1.13)(react@19.1.1) + '@radix-ui/react-direction': 1.1.1(@types/react@19.1.13)(react@19.1.1) + '@radix-ui/react-id': 1.1.1(@types/react@19.1.13)(react@19.1.1) + '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-roving-focus': 1.1.11(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.1.13)(react@19.1.1) react: 19.1.1 react-dom: 19.1.1(react@19.1.1) optionalDependencies: - '@types/react': 19.1.12 - '@types/react-dom': 19.1.9(@types/react@19.1.12) + '@types/react': 19.1.13 + '@types/react-dom': 19.1.9(@types/react@19.1.13) - '@radix-ui/react-toast@1.2.15(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': + '@radix-ui/react-toast@1.2.15(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': dependencies: '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.12)(react@19.1.1) - '@radix-ui/react-context': 1.1.2(@types/react@19.1.12)(react@19.1.1) - '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.1.12)(react@19.1.1) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.1.12)(react@19.1.1) - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.12)(react@19.1.1) - '@radix-ui/react-visually-hidden': 1.2.3(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.13)(react@19.1.1) + '@radix-ui/react-context': 1.1.2(@types/react@19.1.13)(react@19.1.1) + '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.1.13)(react@19.1.1) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.1.13)(react@19.1.1) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.13)(react@19.1.1) + '@radix-ui/react-visually-hidden': 1.2.3(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) react: 19.1.1 react-dom: 19.1.1(react@19.1.1) optionalDependencies: - '@types/react': 19.1.12 - '@types/react-dom': 19.1.9(@types/react@19.1.12) + '@types/react': 19.1.13 + '@types/react-dom': 19.1.9(@types/react@19.1.13) - '@radix-ui/react-toggle-group@1.1.11(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': + '@radix-ui/react-toggle-group@1.1.11(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': dependencies: '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-context': 1.1.2(@types/react@19.1.12)(react@19.1.1) - '@radix-ui/react-direction': 1.1.1(@types/react@19.1.12)(react@19.1.1) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-roving-focus': 1.1.11(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-toggle': 1.1.10(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.1.12)(react@19.1.1) + '@radix-ui/react-context': 1.1.2(@types/react@19.1.13)(react@19.1.1) + '@radix-ui/react-direction': 1.1.1(@types/react@19.1.13)(react@19.1.1) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-roving-focus': 1.1.11(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-toggle': 1.1.10(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.1.13)(react@19.1.1) react: 19.1.1 react-dom: 19.1.1(react@19.1.1) optionalDependencies: - '@types/react': 19.1.12 - '@types/react-dom': 19.1.9(@types/react@19.1.12) + '@types/react': 19.1.13 + '@types/react-dom': 19.1.9(@types/react@19.1.13) - '@radix-ui/react-toggle@1.1.10(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': + '@radix-ui/react-toggle@1.1.10(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': dependencies: '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.1.12)(react@19.1.1) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.1.13)(react@19.1.1) react: 19.1.1 react-dom: 19.1.1(react@19.1.1) optionalDependencies: - '@types/react': 19.1.12 - '@types/react-dom': 19.1.9(@types/react@19.1.12) + '@types/react': 19.1.13 + '@types/react-dom': 19.1.9(@types/react@19.1.13) - '@radix-ui/react-toolbar@1.1.11(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': + '@radix-ui/react-toolbar@1.1.11(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': dependencies: '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-context': 1.1.2(@types/react@19.1.12)(react@19.1.1) - '@radix-ui/react-direction': 1.1.1(@types/react@19.1.12)(react@19.1.1) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-roving-focus': 1.1.11(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-separator': 1.1.7(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-toggle-group': 1.1.11(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-context': 1.1.2(@types/react@19.1.13)(react@19.1.1) + '@radix-ui/react-direction': 1.1.1(@types/react@19.1.13)(react@19.1.1) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-roving-focus': 1.1.11(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-separator': 1.1.7(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-toggle-group': 1.1.11(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) react: 19.1.1 react-dom: 19.1.1(react@19.1.1) optionalDependencies: - '@types/react': 19.1.12 - '@types/react-dom': 19.1.9(@types/react@19.1.12) + '@types/react': 19.1.13 + '@types/react-dom': 19.1.9(@types/react@19.1.13) - '@radix-ui/react-tooltip@1.2.8(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': + '@radix-ui/react-tooltip@1.2.8(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': dependencies: '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.12)(react@19.1.1) - '@radix-ui/react-context': 1.1.2(@types/react@19.1.12)(react@19.1.1) - '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-id': 1.1.1(@types/react@19.1.12)(react@19.1.1) - '@radix-ui/react-popper': 1.2.8(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-slot': 1.2.3(@types/react@19.1.12)(react@19.1.1) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.1.12)(react@19.1.1) - '@radix-ui/react-visually-hidden': 1.2.3(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.13)(react@19.1.1) + '@radix-ui/react-context': 1.1.2(@types/react@19.1.13)(react@19.1.1) + '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-id': 1.1.1(@types/react@19.1.13)(react@19.1.1) + '@radix-ui/react-popper': 1.2.8(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-slot': 1.2.3(@types/react@19.1.13)(react@19.1.1) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.1.13)(react@19.1.1) + '@radix-ui/react-visually-hidden': 1.2.3(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) react: 19.1.1 react-dom: 19.1.1(react@19.1.1) optionalDependencies: - '@types/react': 19.1.12 - '@types/react-dom': 19.1.9(@types/react@19.1.12) + '@types/react': 19.1.13 + '@types/react-dom': 19.1.9(@types/react@19.1.13) - '@radix-ui/react-use-callback-ref@1.1.1(@types/react@19.1.12)(react@19.1.1)': + '@radix-ui/react-use-callback-ref@1.1.1(@types/react@19.1.13)(react@19.1.1)': dependencies: react: 19.1.1 optionalDependencies: - '@types/react': 19.1.12 + '@types/react': 19.1.13 - '@radix-ui/react-use-controllable-state@1.2.2(@types/react@19.1.12)(react@19.1.1)': + '@radix-ui/react-use-controllable-state@1.2.2(@types/react@19.1.13)(react@19.1.1)': dependencies: - '@radix-ui/react-use-effect-event': 0.0.2(@types/react@19.1.12)(react@19.1.1) - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.12)(react@19.1.1) + '@radix-ui/react-use-effect-event': 0.0.2(@types/react@19.1.13)(react@19.1.1) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.13)(react@19.1.1) react: 19.1.1 optionalDependencies: - '@types/react': 19.1.12 + '@types/react': 19.1.13 - '@radix-ui/react-use-effect-event@0.0.2(@types/react@19.1.12)(react@19.1.1)': + '@radix-ui/react-use-effect-event@0.0.2(@types/react@19.1.13)(react@19.1.1)': dependencies: - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.12)(react@19.1.1) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.13)(react@19.1.1) react: 19.1.1 optionalDependencies: - '@types/react': 19.1.12 + '@types/react': 19.1.13 - '@radix-ui/react-use-escape-keydown@1.1.1(@types/react@19.1.12)(react@19.1.1)': + '@radix-ui/react-use-escape-keydown@1.1.1(@types/react@19.1.13)(react@19.1.1)': dependencies: - '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.1.12)(react@19.1.1) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.1.13)(react@19.1.1) react: 19.1.1 optionalDependencies: - '@types/react': 19.1.12 + '@types/react': 19.1.13 - '@radix-ui/react-use-is-hydrated@0.1.0(@types/react@19.1.12)(react@19.1.1)': + '@radix-ui/react-use-is-hydrated@0.1.0(@types/react@19.1.13)(react@19.1.1)': dependencies: react: 19.1.1 use-sync-external-store: 1.5.0(react@19.1.1) optionalDependencies: - '@types/react': 19.1.12 + '@types/react': 19.1.13 - '@radix-ui/react-use-layout-effect@1.1.1(@types/react@19.1.12)(react@19.1.1)': + '@radix-ui/react-use-layout-effect@1.1.1(@types/react@19.1.13)(react@19.1.1)': dependencies: react: 19.1.1 optionalDependencies: - '@types/react': 19.1.12 + '@types/react': 19.1.13 - '@radix-ui/react-use-previous@1.1.1(@types/react@19.1.12)(react@19.1.1)': + '@radix-ui/react-use-previous@1.1.1(@types/react@19.1.13)(react@19.1.1)': dependencies: react: 19.1.1 optionalDependencies: - '@types/react': 19.1.12 + '@types/react': 19.1.13 - '@radix-ui/react-use-rect@1.1.1(@types/react@19.1.12)(react@19.1.1)': + '@radix-ui/react-use-rect@1.1.1(@types/react@19.1.13)(react@19.1.1)': dependencies: '@radix-ui/rect': 1.1.1 react: 19.1.1 optionalDependencies: - '@types/react': 19.1.12 + '@types/react': 19.1.13 - '@radix-ui/react-use-size@1.1.1(@types/react@19.1.12)(react@19.1.1)': + '@radix-ui/react-use-size@1.1.1(@types/react@19.1.13)(react@19.1.1)': dependencies: - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.12)(react@19.1.1) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.13)(react@19.1.1) react: 19.1.1 optionalDependencies: - '@types/react': 19.1.12 + '@types/react': 19.1.13 - '@radix-ui/react-visually-hidden@1.2.3(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': + '@radix-ui/react-visually-hidden@1.2.3(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': dependencies: - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) react: 19.1.1 react-dom: 19.1.1(react@19.1.1) optionalDependencies: - '@types/react': 19.1.12 - '@types/react-dom': 19.1.9(@types/react@19.1.12) + '@types/react': 19.1.13 + '@types/react-dom': 19.1.9(@types/react@19.1.13) '@radix-ui/rect@1.1.1': {} @@ -11318,7 +11718,7 @@ snapshots: dependencies: react: 19.1.1 - '@react-email/components@0.5.1(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': + '@react-email/components@0.5.3(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': dependencies: '@react-email/body': 0.1.0(react@19.1.1) '@react-email/button': 0.2.0(react@19.1.1) @@ -11335,7 +11735,7 @@ snapshots: '@react-email/link': 0.0.12(react@19.1.1) '@react-email/markdown': 0.0.15(react@19.1.1) '@react-email/preview': 0.0.13(react@19.1.1) - '@react-email/render': 1.2.1(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@react-email/render': 1.2.3(react-dom@19.1.1(react@19.1.1))(react@19.1.1) '@react-email/row': 0.0.12(react@19.1.1) '@react-email/section': 0.0.16(react@19.1.1) '@react-email/tailwind': 1.2.2(react@19.1.1) @@ -11385,7 +11785,7 @@ snapshots: dependencies: react: 19.1.1 - '@react-email/render@1.2.1(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': + '@react-email/render@1.2.3(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': dependencies: html-to-text: 9.0.5 prettier: 3.6.2 @@ -11772,87 +12172,87 @@ snapshots: '@react-types/shared': 3.32.0(react@19.1.1) react: 19.1.1 - '@rollup/plugin-commonjs@28.0.1(rollup@4.50.0)': + '@rollup/plugin-commonjs@28.0.1(rollup@4.50.1)': dependencies: - '@rollup/pluginutils': 5.3.0(rollup@4.50.0) + '@rollup/pluginutils': 5.3.0(rollup@4.50.1) commondir: 1.0.1 estree-walker: 2.0.2 fdir: 6.5.0(picomatch@4.0.3) is-reference: 1.2.1 - magic-string: 0.30.18 + magic-string: 0.30.19 picomatch: 4.0.3 optionalDependencies: - rollup: 4.50.0 + rollup: 4.50.1 - '@rollup/pluginutils@5.3.0(rollup@4.50.0)': + '@rollup/pluginutils@5.3.0(rollup@4.50.1)': dependencies: '@types/estree': 1.0.8 estree-walker: 2.0.2 picomatch: 4.0.3 optionalDependencies: - rollup: 4.50.0 + rollup: 4.50.1 - '@rollup/rollup-android-arm-eabi@4.50.0': + '@rollup/rollup-android-arm-eabi@4.50.1': optional: true - '@rollup/rollup-android-arm64@4.50.0': + '@rollup/rollup-android-arm64@4.50.1': optional: true - '@rollup/rollup-darwin-arm64@4.50.0': + '@rollup/rollup-darwin-arm64@4.50.1': optional: true - '@rollup/rollup-darwin-x64@4.50.0': + '@rollup/rollup-darwin-x64@4.50.1': optional: true - '@rollup/rollup-freebsd-arm64@4.50.0': + '@rollup/rollup-freebsd-arm64@4.50.1': optional: true - '@rollup/rollup-freebsd-x64@4.50.0': + '@rollup/rollup-freebsd-x64@4.50.1': optional: true - '@rollup/rollup-linux-arm-gnueabihf@4.50.0': + '@rollup/rollup-linux-arm-gnueabihf@4.50.1': optional: true - '@rollup/rollup-linux-arm-musleabihf@4.50.0': + '@rollup/rollup-linux-arm-musleabihf@4.50.1': optional: true - '@rollup/rollup-linux-arm64-gnu@4.50.0': + '@rollup/rollup-linux-arm64-gnu@4.50.1': optional: true - '@rollup/rollup-linux-arm64-musl@4.50.0': + '@rollup/rollup-linux-arm64-musl@4.50.1': optional: true - '@rollup/rollup-linux-loongarch64-gnu@4.50.0': + '@rollup/rollup-linux-loongarch64-gnu@4.50.1': optional: true - '@rollup/rollup-linux-ppc64-gnu@4.50.0': + '@rollup/rollup-linux-ppc64-gnu@4.50.1': optional: true - '@rollup/rollup-linux-riscv64-gnu@4.50.0': + '@rollup/rollup-linux-riscv64-gnu@4.50.1': optional: true - '@rollup/rollup-linux-riscv64-musl@4.50.0': + '@rollup/rollup-linux-riscv64-musl@4.50.1': optional: true - '@rollup/rollup-linux-s390x-gnu@4.50.0': + '@rollup/rollup-linux-s390x-gnu@4.50.1': optional: true - '@rollup/rollup-linux-x64-gnu@4.50.0': + '@rollup/rollup-linux-x64-gnu@4.50.1': optional: true - '@rollup/rollup-linux-x64-musl@4.50.0': + '@rollup/rollup-linux-x64-musl@4.50.1': optional: true - '@rollup/rollup-openharmony-arm64@4.50.0': + '@rollup/rollup-openharmony-arm64@4.50.1': optional: true - '@rollup/rollup-win32-arm64-msvc@4.50.0': + '@rollup/rollup-win32-arm64-msvc@4.50.1': optional: true - '@rollup/rollup-win32-ia32-msvc@4.50.0': + '@rollup/rollup-win32-ia32-msvc@4.50.1': optional: true - '@rollup/rollup-win32-x64-msvc@4.50.0': + '@rollup/rollup-win32-x64-msvc@4.50.1': optional: true '@rtsao/scc@1.1.0': {} @@ -11864,37 +12264,37 @@ snapshots: domhandler: 5.0.3 selderee: 0.11.0 - '@sentry-internal/browser-utils@10.10.0': + '@sentry-internal/browser-utils@10.11.0': dependencies: - '@sentry/core': 10.10.0 + '@sentry/core': 10.11.0 - '@sentry-internal/feedback@10.10.0': + '@sentry-internal/feedback@10.11.0': dependencies: - '@sentry/core': 10.10.0 + '@sentry/core': 10.11.0 - '@sentry-internal/replay-canvas@10.10.0': + '@sentry-internal/replay-canvas@10.11.0': dependencies: - '@sentry-internal/replay': 10.10.0 - '@sentry/core': 10.10.0 + '@sentry-internal/replay': 10.11.0 + '@sentry/core': 10.11.0 - '@sentry-internal/replay@10.10.0': + '@sentry-internal/replay@10.11.0': dependencies: - '@sentry-internal/browser-utils': 10.10.0 - '@sentry/core': 10.10.0 + '@sentry-internal/browser-utils': 10.11.0 + '@sentry/core': 10.11.0 '@sentry/babel-plugin-component-annotate@4.3.0': {} - '@sentry/browser@10.10.0': + '@sentry/browser@10.11.0': dependencies: - '@sentry-internal/browser-utils': 10.10.0 - '@sentry-internal/feedback': 10.10.0 - '@sentry-internal/replay': 10.10.0 - '@sentry-internal/replay-canvas': 10.10.0 - '@sentry/core': 10.10.0 + '@sentry-internal/browser-utils': 10.11.0 + '@sentry-internal/feedback': 10.11.0 + '@sentry-internal/replay': 10.11.0 + '@sentry-internal/replay-canvas': 10.11.0 + '@sentry/core': 10.11.0 '@sentry/bundler-plugin-core@4.3.0': dependencies: - '@babel/core': 7.28.3 + '@babel/core': 7.28.4 '@sentry/babel-plugin-component-annotate': 4.3.0 '@sentry/cli': 2.53.0 dotenv: 16.6.1 @@ -11950,25 +12350,25 @@ snapshots: - encoding - supports-color - '@sentry/core@10.10.0': {} + '@sentry/core@10.11.0': {} - '@sentry/nextjs@10.10.0(@opentelemetry/context-async-hooks@2.1.0(@opentelemetry/api@1.9.0))(@opentelemetry/core@2.1.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.1.0(@opentelemetry/api@1.9.0))(next@15.5.2(@babel/core@7.28.3)(@opentelemetry/api@1.9.0)(@playwright/test@1.55.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(react@19.1.1)(webpack@5.101.3)': + '@sentry/nextjs@10.11.0(@opentelemetry/context-async-hooks@2.1.0(@opentelemetry/api@1.9.0))(@opentelemetry/core@2.1.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.1.0(@opentelemetry/api@1.9.0))(next@15.5.3(@babel/core@7.28.4)(@opentelemetry/api@1.9.0)(@playwright/test@1.55.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(react@19.1.1)(webpack@5.101.3)': dependencies: '@opentelemetry/api': 1.9.0 '@opentelemetry/semantic-conventions': 1.37.0 - '@rollup/plugin-commonjs': 28.0.1(rollup@4.50.0) - '@sentry-internal/browser-utils': 10.10.0 + '@rollup/plugin-commonjs': 28.0.1(rollup@4.50.1) + '@sentry-internal/browser-utils': 10.11.0 '@sentry/bundler-plugin-core': 4.3.0 - '@sentry/core': 10.10.0 - '@sentry/node': 10.10.0 - '@sentry/opentelemetry': 10.10.0(@opentelemetry/api@1.9.0)(@opentelemetry/context-async-hooks@2.1.0(@opentelemetry/api@1.9.0))(@opentelemetry/core@2.1.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.1.0(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.37.0) - '@sentry/react': 10.10.0(react@19.1.1) - '@sentry/vercel-edge': 10.10.0 + '@sentry/core': 10.11.0 + '@sentry/node': 10.11.0 + '@sentry/opentelemetry': 10.11.0(@opentelemetry/api@1.9.0)(@opentelemetry/context-async-hooks@2.1.0(@opentelemetry/api@1.9.0))(@opentelemetry/core@2.1.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.1.0(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.37.0) + '@sentry/react': 10.11.0(react@19.1.1) + '@sentry/vercel-edge': 10.11.0 '@sentry/webpack-plugin': 4.3.0(webpack@5.101.3) chalk: 3.0.0 - next: 15.5.2(@babel/core@7.28.3)(@opentelemetry/api@1.9.0)(@playwright/test@1.55.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + next: 15.5.3(@babel/core@7.28.4)(@opentelemetry/api@1.9.0)(@playwright/test@1.55.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) resolve: 1.22.8 - rollup: 4.50.0 + rollup: 4.50.1 stacktrace-parser: 0.1.11 transitivePeerDependencies: - '@opentelemetry/context-async-hooks' @@ -11979,7 +12379,7 @@ snapshots: - supports-color - webpack - '@sentry/node-core@10.10.0(@opentelemetry/api@1.9.0)(@opentelemetry/context-async-hooks@2.1.0(@opentelemetry/api@1.9.0))(@opentelemetry/core@2.1.0(@opentelemetry/api@1.9.0))(@opentelemetry/instrumentation@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/resources@2.1.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.1.0(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.37.0)': + '@sentry/node-core@10.11.0(@opentelemetry/api@1.9.0)(@opentelemetry/context-async-hooks@2.1.0(@opentelemetry/api@1.9.0))(@opentelemetry/core@2.1.0(@opentelemetry/api@1.9.0))(@opentelemetry/instrumentation@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/resources@2.1.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.1.0(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.37.0)': dependencies: '@opentelemetry/api': 1.9.0 '@opentelemetry/context-async-hooks': 2.1.0(@opentelemetry/api@1.9.0) @@ -11988,11 +12388,11 @@ snapshots: '@opentelemetry/resources': 2.1.0(@opentelemetry/api@1.9.0) '@opentelemetry/sdk-trace-base': 2.1.0(@opentelemetry/api@1.9.0) '@opentelemetry/semantic-conventions': 1.37.0 - '@sentry/core': 10.10.0 - '@sentry/opentelemetry': 10.10.0(@opentelemetry/api@1.9.0)(@opentelemetry/context-async-hooks@2.1.0(@opentelemetry/api@1.9.0))(@opentelemetry/core@2.1.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.1.0(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.37.0) + '@sentry/core': 10.11.0 + '@sentry/opentelemetry': 10.11.0(@opentelemetry/api@1.9.0)(@opentelemetry/context-async-hooks@2.1.0(@opentelemetry/api@1.9.0))(@opentelemetry/core@2.1.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.1.0(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.37.0) import-in-the-middle: 1.14.2 - '@sentry/node@10.10.0': + '@sentry/node@10.11.0': dependencies: '@opentelemetry/api': 1.9.0 '@opentelemetry/context-async-hooks': 2.1.0(@opentelemetry/api@1.9.0) @@ -12007,7 +12407,7 @@ snapshots: '@opentelemetry/instrumentation-graphql': 0.51.0(@opentelemetry/api@1.9.0) '@opentelemetry/instrumentation-hapi': 0.50.0(@opentelemetry/api@1.9.0) '@opentelemetry/instrumentation-http': 0.203.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-ioredis': 0.51.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-ioredis': 0.52.0(@opentelemetry/api@1.9.0) '@opentelemetry/instrumentation-kafkajs': 0.13.0(@opentelemetry/api@1.9.0) '@opentelemetry/instrumentation-knex': 0.48.0(@opentelemetry/api@1.9.0) '@opentelemetry/instrumentation-koa': 0.51.0(@opentelemetry/api@1.9.0) @@ -12024,35 +12424,35 @@ snapshots: '@opentelemetry/sdk-trace-base': 2.1.0(@opentelemetry/api@1.9.0) '@opentelemetry/semantic-conventions': 1.37.0 '@prisma/instrumentation': 6.14.0(@opentelemetry/api@1.9.0) - '@sentry/core': 10.10.0 - '@sentry/node-core': 10.10.0(@opentelemetry/api@1.9.0)(@opentelemetry/context-async-hooks@2.1.0(@opentelemetry/api@1.9.0))(@opentelemetry/core@2.1.0(@opentelemetry/api@1.9.0))(@opentelemetry/instrumentation@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/resources@2.1.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.1.0(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.37.0) - '@sentry/opentelemetry': 10.10.0(@opentelemetry/api@1.9.0)(@opentelemetry/context-async-hooks@2.1.0(@opentelemetry/api@1.9.0))(@opentelemetry/core@2.1.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.1.0(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.37.0) + '@sentry/core': 10.11.0 + '@sentry/node-core': 10.11.0(@opentelemetry/api@1.9.0)(@opentelemetry/context-async-hooks@2.1.0(@opentelemetry/api@1.9.0))(@opentelemetry/core@2.1.0(@opentelemetry/api@1.9.0))(@opentelemetry/instrumentation@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/resources@2.1.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.1.0(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.37.0) + '@sentry/opentelemetry': 10.11.0(@opentelemetry/api@1.9.0)(@opentelemetry/context-async-hooks@2.1.0(@opentelemetry/api@1.9.0))(@opentelemetry/core@2.1.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.1.0(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.37.0) import-in-the-middle: 1.14.2 minimatch: 9.0.5 transitivePeerDependencies: - supports-color - '@sentry/opentelemetry@10.10.0(@opentelemetry/api@1.9.0)(@opentelemetry/context-async-hooks@2.1.0(@opentelemetry/api@1.9.0))(@opentelemetry/core@2.1.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.1.0(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.37.0)': + '@sentry/opentelemetry@10.11.0(@opentelemetry/api@1.9.0)(@opentelemetry/context-async-hooks@2.1.0(@opentelemetry/api@1.9.0))(@opentelemetry/core@2.1.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.1.0(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.37.0)': dependencies: '@opentelemetry/api': 1.9.0 '@opentelemetry/context-async-hooks': 2.1.0(@opentelemetry/api@1.9.0) '@opentelemetry/core': 2.1.0(@opentelemetry/api@1.9.0) '@opentelemetry/sdk-trace-base': 2.1.0(@opentelemetry/api@1.9.0) '@opentelemetry/semantic-conventions': 1.37.0 - '@sentry/core': 10.10.0 + '@sentry/core': 10.11.0 - '@sentry/react@10.10.0(react@19.1.1)': + '@sentry/react@10.11.0(react@19.1.1)': dependencies: - '@sentry/browser': 10.10.0 - '@sentry/core': 10.10.0 + '@sentry/browser': 10.11.0 + '@sentry/core': 10.11.0 hoist-non-react-statics: 3.3.2 react: 19.1.1 - '@sentry/vercel-edge@10.10.0': + '@sentry/vercel-edge@10.11.0': dependencies: '@opentelemetry/api': 1.9.0 '@opentelemetry/resources': 2.1.0(@opentelemetry/api@1.9.0) - '@sentry/core': 10.10.0 + '@sentry/core': 10.11.0 '@sentry/webpack-plugin@4.3.0(webpack@5.101.3)': dependencies: @@ -12074,59 +12474,59 @@ snapshots: escape-string-regexp: 2.0.0 lodash.deburr: 4.1.0 - '@smithy/abort-controller@4.1.0': + '@smithy/abort-controller@4.1.1': dependencies: - '@smithy/types': 4.4.0 + '@smithy/types': 4.5.0 tslib: 2.8.1 - '@smithy/config-resolver@4.2.0': + '@smithy/config-resolver@4.2.1': dependencies: - '@smithy/node-config-provider': 4.2.0 - '@smithy/types': 4.4.0 + '@smithy/node-config-provider': 4.2.1 + '@smithy/types': 4.5.0 '@smithy/util-config-provider': 4.1.0 - '@smithy/util-middleware': 4.1.0 + '@smithy/util-middleware': 4.1.1 tslib: 2.8.1 - '@smithy/core@3.10.0': + '@smithy/core@3.11.0': dependencies: - '@smithy/middleware-serde': 4.1.0 - '@smithy/protocol-http': 5.2.0 - '@smithy/types': 4.4.0 + '@smithy/middleware-serde': 4.1.1 + '@smithy/protocol-http': 5.2.1 + '@smithy/types': 4.5.0 '@smithy/util-base64': 4.1.0 '@smithy/util-body-length-browser': 4.1.0 - '@smithy/util-middleware': 4.1.0 - '@smithy/util-stream': 4.3.0 + '@smithy/util-middleware': 4.1.1 + '@smithy/util-stream': 4.3.1 '@smithy/util-utf8': 4.1.0 '@types/uuid': 9.0.8 tslib: 2.8.1 uuid: 9.0.1 - '@smithy/credential-provider-imds@4.1.0': + '@smithy/credential-provider-imds@4.1.1': dependencies: - '@smithy/node-config-provider': 4.2.0 - '@smithy/property-provider': 4.1.0 - '@smithy/types': 4.4.0 - '@smithy/url-parser': 4.1.0 + '@smithy/node-config-provider': 4.2.1 + '@smithy/property-provider': 4.1.1 + '@smithy/types': 4.5.0 + '@smithy/url-parser': 4.1.1 tslib: 2.8.1 - '@smithy/fetch-http-handler@5.2.0': + '@smithy/fetch-http-handler@5.2.1': dependencies: - '@smithy/protocol-http': 5.2.0 - '@smithy/querystring-builder': 4.1.0 - '@smithy/types': 4.4.0 + '@smithy/protocol-http': 5.2.1 + '@smithy/querystring-builder': 4.1.1 + '@smithy/types': 4.5.0 '@smithy/util-base64': 4.1.0 tslib: 2.8.1 - '@smithy/hash-node@4.1.0': + '@smithy/hash-node@4.1.1': dependencies: - '@smithy/types': 4.4.0 + '@smithy/types': 4.5.0 '@smithy/util-buffer-from': 4.1.0 '@smithy/util-utf8': 4.1.0 tslib: 2.8.1 - '@smithy/invalid-dependency@4.1.0': + '@smithy/invalid-dependency@4.1.1': dependencies: - '@smithy/types': 4.4.0 + '@smithy/types': 4.5.0 tslib: 2.8.1 '@smithy/is-array-buffer@2.2.0': @@ -12137,121 +12537,121 @@ snapshots: dependencies: tslib: 2.8.1 - '@smithy/middleware-content-length@4.1.0': + '@smithy/middleware-content-length@4.1.1': dependencies: - '@smithy/protocol-http': 5.2.0 - '@smithy/types': 4.4.0 + '@smithy/protocol-http': 5.2.1 + '@smithy/types': 4.5.0 tslib: 2.8.1 - '@smithy/middleware-endpoint@4.2.0': + '@smithy/middleware-endpoint@4.2.1': dependencies: - '@smithy/core': 3.10.0 - '@smithy/middleware-serde': 4.1.0 - '@smithy/node-config-provider': 4.2.0 - '@smithy/shared-ini-file-loader': 4.1.0 - '@smithy/types': 4.4.0 - '@smithy/url-parser': 4.1.0 - '@smithy/util-middleware': 4.1.0 + '@smithy/core': 3.11.0 + '@smithy/middleware-serde': 4.1.1 + '@smithy/node-config-provider': 4.2.1 + '@smithy/shared-ini-file-loader': 4.1.1 + '@smithy/types': 4.5.0 + '@smithy/url-parser': 4.1.1 + '@smithy/util-middleware': 4.1.1 tslib: 2.8.1 - '@smithy/middleware-retry@4.2.0': + '@smithy/middleware-retry@4.2.1': dependencies: - '@smithy/node-config-provider': 4.2.0 - '@smithy/protocol-http': 5.2.0 - '@smithy/service-error-classification': 4.1.0 - '@smithy/smithy-client': 4.6.0 - '@smithy/types': 4.4.0 - '@smithy/util-middleware': 4.1.0 - '@smithy/util-retry': 4.1.0 + '@smithy/node-config-provider': 4.2.1 + '@smithy/protocol-http': 5.2.1 + '@smithy/service-error-classification': 4.1.1 + '@smithy/smithy-client': 4.6.1 + '@smithy/types': 4.5.0 + '@smithy/util-middleware': 4.1.1 + '@smithy/util-retry': 4.1.1 '@types/uuid': 9.0.8 tslib: 2.8.1 uuid: 9.0.1 - '@smithy/middleware-serde@4.1.0': + '@smithy/middleware-serde@4.1.1': dependencies: - '@smithy/protocol-http': 5.2.0 - '@smithy/types': 4.4.0 + '@smithy/protocol-http': 5.2.1 + '@smithy/types': 4.5.0 tslib: 2.8.1 - '@smithy/middleware-stack@4.1.0': + '@smithy/middleware-stack@4.1.1': dependencies: - '@smithy/types': 4.4.0 + '@smithy/types': 4.5.0 tslib: 2.8.1 - '@smithy/node-config-provider@4.2.0': + '@smithy/node-config-provider@4.2.1': dependencies: - '@smithy/property-provider': 4.1.0 - '@smithy/shared-ini-file-loader': 4.1.0 - '@smithy/types': 4.4.0 + '@smithy/property-provider': 4.1.1 + '@smithy/shared-ini-file-loader': 4.1.1 + '@smithy/types': 4.5.0 tslib: 2.8.1 - '@smithy/node-http-handler@4.2.0': + '@smithy/node-http-handler@4.2.1': dependencies: - '@smithy/abort-controller': 4.1.0 - '@smithy/protocol-http': 5.2.0 - '@smithy/querystring-builder': 4.1.0 - '@smithy/types': 4.4.0 + '@smithy/abort-controller': 4.1.1 + '@smithy/protocol-http': 5.2.1 + '@smithy/querystring-builder': 4.1.1 + '@smithy/types': 4.5.0 tslib: 2.8.1 - '@smithy/property-provider@4.1.0': + '@smithy/property-provider@4.1.1': dependencies: - '@smithy/types': 4.4.0 + '@smithy/types': 4.5.0 tslib: 2.8.1 - '@smithy/protocol-http@5.2.0': + '@smithy/protocol-http@5.2.1': dependencies: - '@smithy/types': 4.4.0 + '@smithy/types': 4.5.0 tslib: 2.8.1 - '@smithy/querystring-builder@4.1.0': + '@smithy/querystring-builder@4.1.1': dependencies: - '@smithy/types': 4.4.0 + '@smithy/types': 4.5.0 '@smithy/util-uri-escape': 4.1.0 tslib: 2.8.1 - '@smithy/querystring-parser@4.1.0': + '@smithy/querystring-parser@4.1.1': dependencies: - '@smithy/types': 4.4.0 + '@smithy/types': 4.5.0 tslib: 2.8.1 - '@smithy/service-error-classification@4.1.0': + '@smithy/service-error-classification@4.1.1': dependencies: - '@smithy/types': 4.4.0 + '@smithy/types': 4.5.0 - '@smithy/shared-ini-file-loader@4.1.0': + '@smithy/shared-ini-file-loader@4.1.1': dependencies: - '@smithy/types': 4.4.0 + '@smithy/types': 4.5.0 tslib: 2.8.1 - '@smithy/signature-v4@5.2.0': + '@smithy/signature-v4@5.2.1': dependencies: '@smithy/is-array-buffer': 4.1.0 - '@smithy/protocol-http': 5.2.0 - '@smithy/types': 4.4.0 + '@smithy/protocol-http': 5.2.1 + '@smithy/types': 4.5.0 '@smithy/util-hex-encoding': 4.1.0 - '@smithy/util-middleware': 4.1.0 + '@smithy/util-middleware': 4.1.1 '@smithy/util-uri-escape': 4.1.0 '@smithy/util-utf8': 4.1.0 tslib: 2.8.1 - '@smithy/smithy-client@4.6.0': + '@smithy/smithy-client@4.6.1': dependencies: - '@smithy/core': 3.10.0 - '@smithy/middleware-endpoint': 4.2.0 - '@smithy/middleware-stack': 4.1.0 - '@smithy/protocol-http': 5.2.0 - '@smithy/types': 4.4.0 - '@smithy/util-stream': 4.3.0 + '@smithy/core': 3.11.0 + '@smithy/middleware-endpoint': 4.2.1 + '@smithy/middleware-stack': 4.1.1 + '@smithy/protocol-http': 5.2.1 + '@smithy/types': 4.5.0 + '@smithy/util-stream': 4.3.1 tslib: 2.8.1 - '@smithy/types@4.4.0': + '@smithy/types@4.5.0': dependencies: tslib: 2.8.1 - '@smithy/url-parser@4.1.0': + '@smithy/url-parser@4.1.1': dependencies: - '@smithy/querystring-parser': 4.1.0 - '@smithy/types': 4.4.0 + '@smithy/querystring-parser': 4.1.1 + '@smithy/types': 4.5.0 tslib: 2.8.1 '@smithy/util-base64@4.1.0': @@ -12282,50 +12682,50 @@ snapshots: dependencies: tslib: 2.8.1 - '@smithy/util-defaults-mode-browser@4.1.0': + '@smithy/util-defaults-mode-browser@4.1.1': dependencies: - '@smithy/property-provider': 4.1.0 - '@smithy/smithy-client': 4.6.0 - '@smithy/types': 4.4.0 + '@smithy/property-provider': 4.1.1 + '@smithy/smithy-client': 4.6.1 + '@smithy/types': 4.5.0 bowser: 2.12.1 tslib: 2.8.1 - '@smithy/util-defaults-mode-node@4.1.0': + '@smithy/util-defaults-mode-node@4.1.1': dependencies: - '@smithy/config-resolver': 4.2.0 - '@smithy/credential-provider-imds': 4.1.0 - '@smithy/node-config-provider': 4.2.0 - '@smithy/property-provider': 4.1.0 - '@smithy/smithy-client': 4.6.0 - '@smithy/types': 4.4.0 + '@smithy/config-resolver': 4.2.1 + '@smithy/credential-provider-imds': 4.1.1 + '@smithy/node-config-provider': 4.2.1 + '@smithy/property-provider': 4.1.1 + '@smithy/smithy-client': 4.6.1 + '@smithy/types': 4.5.0 tslib: 2.8.1 - '@smithy/util-endpoints@3.1.0': + '@smithy/util-endpoints@3.1.1': dependencies: - '@smithy/node-config-provider': 4.2.0 - '@smithy/types': 4.4.0 + '@smithy/node-config-provider': 4.2.1 + '@smithy/types': 4.5.0 tslib: 2.8.1 '@smithy/util-hex-encoding@4.1.0': dependencies: tslib: 2.8.1 - '@smithy/util-middleware@4.1.0': + '@smithy/util-middleware@4.1.1': dependencies: - '@smithy/types': 4.4.0 + '@smithy/types': 4.5.0 tslib: 2.8.1 - '@smithy/util-retry@4.1.0': + '@smithy/util-retry@4.1.1': dependencies: - '@smithy/service-error-classification': 4.1.0 - '@smithy/types': 4.4.0 + '@smithy/service-error-classification': 4.1.1 + '@smithy/types': 4.5.0 tslib: 2.8.1 - '@smithy/util-stream@4.3.0': + '@smithy/util-stream@4.3.1': dependencies: - '@smithy/fetch-http-handler': 5.2.0 - '@smithy/node-http-handler': 4.2.0 - '@smithy/types': 4.4.0 + '@smithy/fetch-http-handler': 5.2.1 + '@smithy/node-http-handler': 4.2.1 + '@smithy/types': 4.5.0 '@smithy/util-base64': 4.1.0 '@smithy/util-buffer-from': 4.1.0 '@smithy/util-hex-encoding': 4.1.0 @@ -12350,7 +12750,7 @@ snapshots: '@standard-schema/utils@0.3.0': {} - '@stripe/react-stripe-js@4.0.0(@stripe/stripe-js@7.9.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': + '@stripe/react-stripe-js@4.0.2(@stripe/stripe-js@7.9.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': dependencies: '@stripe/stripe-js': 7.9.0 prop-types: 15.8.1 @@ -12363,7 +12763,7 @@ snapshots: dependencies: '@supabase/node-fetch': 2.6.15 - '@supabase/functions-js@2.4.5': + '@supabase/functions-js@2.4.6': dependencies: '@supabase/node-fetch': 2.6.15 @@ -12371,7 +12771,7 @@ snapshots: dependencies: whatwg-url: 5.0.0 - '@supabase/postgrest-js@1.21.3': + '@supabase/postgrest-js@1.21.4': dependencies: '@supabase/node-fetch': 2.6.15 @@ -12385,23 +12785,23 @@ snapshots: - bufferutil - utf-8-validate - '@supabase/ssr@0.7.0(@supabase/supabase-js@2.57.2)': + '@supabase/ssr@0.7.0(@supabase/supabase-js@2.57.4)': dependencies: - '@supabase/supabase-js': 2.57.2 + '@supabase/supabase-js': 2.57.4 cookie: 1.0.2 - '@supabase/storage-js@2.11.1': + '@supabase/storage-js@2.12.1': dependencies: '@supabase/node-fetch': 2.6.15 - '@supabase/supabase-js@2.57.2': + '@supabase/supabase-js@2.57.4': dependencies: '@supabase/auth-js': 2.71.1 - '@supabase/functions-js': 2.4.5 + '@supabase/functions-js': 2.4.6 '@supabase/node-fetch': 2.6.15 - '@supabase/postgrest-js': 1.21.3 + '@supabase/postgrest-js': 1.21.4 '@supabase/realtime-js': 2.15.5 - '@supabase/storage-js': 2.11.1 + '@supabase/storage-js': 2.12.1 transitivePeerDependencies: - bufferutil - utf-8-validate @@ -12486,11 +12886,11 @@ snapshots: postcss: 8.5.6 tailwindcss: 4.1.13 - '@tanstack/query-core@5.87.1': {} + '@tanstack/query-core@5.89.0': {} - '@tanstack/react-query@5.87.1(react@19.1.1)': + '@tanstack/react-query@5.89.0(react@19.1.1)': dependencies: - '@tanstack/query-core': 5.87.1 + '@tanstack/query-core': 5.89.0 react: 19.1.1 '@tanstack/react-table@8.21.3(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': @@ -12536,17 +12936,17 @@ snapshots: '@tsconfig/node16@1.0.4': {} - '@turbo/gen@2.5.6(@types/node@24.3.1)(typescript@5.9.2)': + '@turbo/gen@2.5.6(@types/node@24.5.0)(typescript@5.9.2)': dependencies: - '@turbo/workspaces': 2.5.6(@types/node@24.3.1) + '@turbo/workspaces': 2.5.6(@types/node@24.5.0) commander: 10.0.1 fs-extra: 10.1.0 - inquirer: 8.2.7(@types/node@24.3.1) + inquirer: 8.2.7(@types/node@24.5.0) minimatch: 9.0.5 node-plop: 0.26.3 picocolors: 1.0.1 proxy-agent: 6.5.0 - ts-node: 10.9.2(@types/node@24.3.1)(typescript@5.9.2) + ts-node: 10.9.2(@types/node@24.5.0)(typescript@5.9.2) update-check: 1.5.4 validate-npm-package-name: 5.0.1 transitivePeerDependencies: @@ -12556,14 +12956,14 @@ snapshots: - supports-color - typescript - '@turbo/workspaces@2.5.6(@types/node@24.3.1)': + '@turbo/workspaces@2.5.6(@types/node@24.5.0)': dependencies: commander: 10.0.1 execa: 5.1.1 fast-glob: 3.3.3 fs-extra: 10.1.0 gradient-string: 2.0.2 - inquirer: 8.2.7(@types/node@24.3.1) + inquirer: 8.2.7(@types/node@24.5.0) js-yaml: 4.1.0 ora: 4.1.1 picocolors: 1.0.1 @@ -12572,14 +12972,14 @@ snapshots: transitivePeerDependencies: - '@types/node' - '@tybys/wasm-util@0.10.0': + '@tybys/wasm-util@0.10.1': dependencies: tslib: 2.8.1 optional: true '@types/connect@3.4.38': dependencies: - '@types/node': 24.3.1 + '@types/node': 24.5.0 '@types/d3-array@3.2.1': {} @@ -12628,7 +13028,7 @@ snapshots: '@types/glob@7.2.0': dependencies: '@types/minimatch': 6.0.0 - '@types/node': 24.3.1 + '@types/node': 24.5.0 '@types/hast@3.0.4': dependencies: @@ -12671,16 +13071,16 @@ snapshots: '@types/mysql@2.15.27': dependencies: - '@types/node': 24.3.1 + '@types/node': 24.5.0 - '@types/node@24.3.1': + '@types/node@24.5.0': dependencies: - undici-types: 7.10.0 + undici-types: 7.12.0 '@types/nodemailer@7.0.1': dependencies: - '@aws-sdk/client-sesv2': 3.882.0 - '@types/node': 24.3.1 + '@aws-sdk/client-sesv2': 3.888.0 + '@types/node': 24.5.0 transitivePeerDependencies: - aws-crt @@ -12692,17 +13092,17 @@ snapshots: '@types/pg@8.15.4': dependencies: - '@types/node': 24.3.1 + '@types/node': 24.5.0 pg-protocol: 1.10.3 pg-types: 2.2.0 '@types/phoenix@1.6.6': {} - '@types/react-dom@19.1.9(@types/react@19.1.12)': + '@types/react-dom@19.1.9(@types/react@19.1.13)': dependencies: - '@types/react': 19.1.12 + '@types/react': 19.1.13 - '@types/react@19.1.12': + '@types/react@19.1.13': dependencies: csstype: 3.1.3 @@ -12710,11 +13110,11 @@ snapshots: '@types/tedious@4.0.14': dependencies: - '@types/node': 24.3.1 + '@types/node': 24.5.0 '@types/through@0.0.33': dependencies: - '@types/node': 24.3.1 + '@types/node': 24.5.0 '@types/tinycolor2@1.4.6': {} @@ -12726,16 +13126,16 @@ snapshots: '@types/ws@8.18.1': dependencies: - '@types/node': 24.3.1 + '@types/node': 24.5.0 - '@typescript-eslint/eslint-plugin@8.42.0(@typescript-eslint/parser@8.42.0(eslint@9.35.0(jiti@2.5.1))(typescript@5.9.2))(eslint@9.35.0(jiti@2.5.1))(typescript@5.9.2)': + '@typescript-eslint/eslint-plugin@8.43.0(@typescript-eslint/parser@8.43.0(eslint@9.35.0(jiti@2.5.1))(typescript@5.9.2))(eslint@9.35.0(jiti@2.5.1))(typescript@5.9.2)': dependencies: '@eslint-community/regexpp': 4.12.1 - '@typescript-eslint/parser': 8.42.0(eslint@9.35.0(jiti@2.5.1))(typescript@5.9.2) - '@typescript-eslint/scope-manager': 8.42.0 - '@typescript-eslint/type-utils': 8.42.0(eslint@9.35.0(jiti@2.5.1))(typescript@5.9.2) - '@typescript-eslint/utils': 8.42.0(eslint@9.35.0(jiti@2.5.1))(typescript@5.9.2) - '@typescript-eslint/visitor-keys': 8.42.0 + '@typescript-eslint/parser': 8.43.0(eslint@9.35.0(jiti@2.5.1))(typescript@5.9.2) + '@typescript-eslint/scope-manager': 8.43.0 + '@typescript-eslint/type-utils': 8.43.0(eslint@9.35.0(jiti@2.5.1))(typescript@5.9.2) + '@typescript-eslint/utils': 8.43.0(eslint@9.35.0(jiti@2.5.1))(typescript@5.9.2) + '@typescript-eslint/visitor-keys': 8.43.0 eslint: 9.35.0(jiti@2.5.1) graphemer: 1.4.0 ignore: 7.0.5 @@ -12745,57 +13145,118 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.42.0(eslint@9.35.0(jiti@2.5.1))(typescript@5.9.2)': + '@typescript-eslint/eslint-plugin@8.44.0(@typescript-eslint/parser@8.44.0(eslint@9.35.0(jiti@2.5.1))(typescript@5.9.2))(eslint@9.35.0(jiti@2.5.1))(typescript@5.9.2)': dependencies: - '@typescript-eslint/scope-manager': 8.42.0 - '@typescript-eslint/types': 8.42.0 - '@typescript-eslint/typescript-estree': 8.42.0(typescript@5.9.2) - '@typescript-eslint/visitor-keys': 8.42.0 - debug: 4.4.1 + '@eslint-community/regexpp': 4.12.1 + '@typescript-eslint/parser': 8.44.0(eslint@9.35.0(jiti@2.5.1))(typescript@5.9.2) + '@typescript-eslint/scope-manager': 8.44.0 + '@typescript-eslint/type-utils': 8.44.0(eslint@9.35.0(jiti@2.5.1))(typescript@5.9.2) + '@typescript-eslint/utils': 8.44.0(eslint@9.35.0(jiti@2.5.1))(typescript@5.9.2) + '@typescript-eslint/visitor-keys': 8.44.0 + eslint: 9.35.0(jiti@2.5.1) + graphemer: 1.4.0 + ignore: 7.0.5 + natural-compare: 1.4.0 + ts-api-utils: 2.1.0(typescript@5.9.2) + typescript: 5.9.2 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/parser@8.43.0(eslint@9.35.0(jiti@2.5.1))(typescript@5.9.2)': + dependencies: + '@typescript-eslint/scope-manager': 8.43.0 + '@typescript-eslint/types': 8.43.0 + '@typescript-eslint/typescript-estree': 8.43.0(typescript@5.9.2) + '@typescript-eslint/visitor-keys': 8.43.0 + debug: 4.4.3 eslint: 9.35.0(jiti@2.5.1) typescript: 5.9.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/project-service@8.42.0(typescript@5.9.2)': + '@typescript-eslint/parser@8.44.0(eslint@9.35.0(jiti@2.5.1))(typescript@5.9.2)': dependencies: - '@typescript-eslint/tsconfig-utils': 8.42.0(typescript@5.9.2) - '@typescript-eslint/types': 8.42.0 - debug: 4.4.1 + '@typescript-eslint/scope-manager': 8.44.0 + '@typescript-eslint/types': 8.44.0 + '@typescript-eslint/typescript-estree': 8.44.0(typescript@5.9.2) + '@typescript-eslint/visitor-keys': 8.44.0 + debug: 4.4.3 + eslint: 9.35.0(jiti@2.5.1) typescript: 5.9.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/scope-manager@8.42.0': + '@typescript-eslint/project-service@8.43.0(typescript@5.9.2)': dependencies: - '@typescript-eslint/types': 8.42.0 - '@typescript-eslint/visitor-keys': 8.42.0 + '@typescript-eslint/tsconfig-utils': 8.43.0(typescript@5.9.2) + '@typescript-eslint/types': 8.43.0 + debug: 4.4.3 + typescript: 5.9.2 + transitivePeerDependencies: + - supports-color - '@typescript-eslint/tsconfig-utils@8.42.0(typescript@5.9.2)': + '@typescript-eslint/project-service@8.44.0(typescript@5.9.2)': + dependencies: + '@typescript-eslint/tsconfig-utils': 8.44.0(typescript@5.9.2) + '@typescript-eslint/types': 8.44.0 + debug: 4.4.3 + typescript: 5.9.2 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/scope-manager@8.43.0': + dependencies: + '@typescript-eslint/types': 8.43.0 + '@typescript-eslint/visitor-keys': 8.43.0 + + '@typescript-eslint/scope-manager@8.44.0': + dependencies: + '@typescript-eslint/types': 8.44.0 + '@typescript-eslint/visitor-keys': 8.44.0 + + '@typescript-eslint/tsconfig-utils@8.43.0(typescript@5.9.2)': dependencies: typescript: 5.9.2 - '@typescript-eslint/type-utils@8.42.0(eslint@9.35.0(jiti@2.5.1))(typescript@5.9.2)': + '@typescript-eslint/tsconfig-utils@8.44.0(typescript@5.9.2)': dependencies: - '@typescript-eslint/types': 8.42.0 - '@typescript-eslint/typescript-estree': 8.42.0(typescript@5.9.2) - '@typescript-eslint/utils': 8.42.0(eslint@9.35.0(jiti@2.5.1))(typescript@5.9.2) - debug: 4.4.1 + typescript: 5.9.2 + + '@typescript-eslint/type-utils@8.43.0(eslint@9.35.0(jiti@2.5.1))(typescript@5.9.2)': + dependencies: + '@typescript-eslint/types': 8.43.0 + '@typescript-eslint/typescript-estree': 8.43.0(typescript@5.9.2) + '@typescript-eslint/utils': 8.43.0(eslint@9.35.0(jiti@2.5.1))(typescript@5.9.2) + debug: 4.4.3 eslint: 9.35.0(jiti@2.5.1) ts-api-utils: 2.1.0(typescript@5.9.2) typescript: 5.9.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/types@8.42.0': {} - - '@typescript-eslint/typescript-estree@8.42.0(typescript@5.9.2)': + '@typescript-eslint/type-utils@8.44.0(eslint@9.35.0(jiti@2.5.1))(typescript@5.9.2)': dependencies: - '@typescript-eslint/project-service': 8.42.0(typescript@5.9.2) - '@typescript-eslint/tsconfig-utils': 8.42.0(typescript@5.9.2) - '@typescript-eslint/types': 8.42.0 - '@typescript-eslint/visitor-keys': 8.42.0 - debug: 4.4.1 + '@typescript-eslint/types': 8.44.0 + '@typescript-eslint/typescript-estree': 8.44.0(typescript@5.9.2) + '@typescript-eslint/utils': 8.44.0(eslint@9.35.0(jiti@2.5.1))(typescript@5.9.2) + debug: 4.4.3 + eslint: 9.35.0(jiti@2.5.1) + ts-api-utils: 2.1.0(typescript@5.9.2) + typescript: 5.9.2 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/types@8.43.0': {} + + '@typescript-eslint/types@8.44.0': {} + + '@typescript-eslint/typescript-estree@8.43.0(typescript@5.9.2)': + dependencies: + '@typescript-eslint/project-service': 8.43.0(typescript@5.9.2) + '@typescript-eslint/tsconfig-utils': 8.43.0(typescript@5.9.2) + '@typescript-eslint/types': 8.43.0 + '@typescript-eslint/visitor-keys': 8.43.0 + debug: 4.4.3 fast-glob: 3.3.3 is-glob: 4.0.3 minimatch: 9.0.5 @@ -12805,20 +13266,52 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.42.0(eslint@9.35.0(jiti@2.5.1))(typescript@5.9.2)': + '@typescript-eslint/typescript-estree@8.44.0(typescript@5.9.2)': dependencies: - '@eslint-community/eslint-utils': 4.8.0(eslint@9.35.0(jiti@2.5.1)) - '@typescript-eslint/scope-manager': 8.42.0 - '@typescript-eslint/types': 8.42.0 - '@typescript-eslint/typescript-estree': 8.42.0(typescript@5.9.2) + '@typescript-eslint/project-service': 8.44.0(typescript@5.9.2) + '@typescript-eslint/tsconfig-utils': 8.44.0(typescript@5.9.2) + '@typescript-eslint/types': 8.44.0 + '@typescript-eslint/visitor-keys': 8.44.0 + debug: 4.4.3 + fast-glob: 3.3.3 + is-glob: 4.0.3 + minimatch: 9.0.5 + semver: 7.7.2 + ts-api-utils: 2.1.0(typescript@5.9.2) + typescript: 5.9.2 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/utils@8.43.0(eslint@9.35.0(jiti@2.5.1))(typescript@5.9.2)': + dependencies: + '@eslint-community/eslint-utils': 4.9.0(eslint@9.35.0(jiti@2.5.1)) + '@typescript-eslint/scope-manager': 8.43.0 + '@typescript-eslint/types': 8.43.0 + '@typescript-eslint/typescript-estree': 8.43.0(typescript@5.9.2) eslint: 9.35.0(jiti@2.5.1) typescript: 5.9.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/visitor-keys@8.42.0': + '@typescript-eslint/utils@8.44.0(eslint@9.35.0(jiti@2.5.1))(typescript@5.9.2)': dependencies: - '@typescript-eslint/types': 8.42.0 + '@eslint-community/eslint-utils': 4.9.0(eslint@9.35.0(jiti@2.5.1)) + '@typescript-eslint/scope-manager': 8.44.0 + '@typescript-eslint/types': 8.44.0 + '@typescript-eslint/typescript-estree': 8.44.0(typescript@5.9.2) + eslint: 9.35.0(jiti@2.5.1) + typescript: 5.9.2 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/visitor-keys@8.43.0': + dependencies: + '@typescript-eslint/types': 8.43.0 + eslint-visitor-keys: 4.2.1 + + '@typescript-eslint/visitor-keys@8.44.0': + dependencies: + '@typescript-eslint/types': 8.44.0 eslint-visitor-keys: 4.2.1 '@unrs/resolver-binding-android-arm-eabi@1.11.1': @@ -12985,6 +13478,11 @@ snapshots: '@xtuc/long@4.2.2': {} + accepts@2.0.0: + dependencies: + mime-types: 3.0.1 + negotiator: 1.0.0 + acorn-import-attributes@1.9.5(acorn@8.15.0): dependencies: acorn: 8.15.0 @@ -13005,7 +13503,7 @@ snapshots: agent-base@6.0.2: dependencies: - debug: 4.4.1 + debug: 4.4.3 transitivePeerDependencies: - supports-color @@ -13016,11 +13514,11 @@ snapshots: clean-stack: 2.2.0 indent-string: 4.0.0 - ai@5.0.33(zod@3.25.76): + ai@5.0.44(zod@3.25.76): dependencies: - '@ai-sdk/gateway': 1.0.18(zod@3.25.76) + '@ai-sdk/gateway': 1.0.23(zod@3.25.76) '@ai-sdk/provider': 2.0.0 - '@ai-sdk/provider-utils': 3.0.8(zod@3.25.76) + '@ai-sdk/provider-utils': 3.0.9(zod@3.25.76) '@opentelemetry/api': 1.9.0 zod: 3.25.76 @@ -13179,6 +13677,10 @@ snapshots: base64-js@1.5.1: {} + baseline-browser-mapping@2.8.3: {} + + baseline-browser-mapping@2.8.4: {} + basic-ftp@5.0.5: {} bin-links@5.0.0: @@ -13197,6 +13699,20 @@ snapshots: inherits: 2.0.4 readable-stream: 3.6.2 + body-parser@2.2.0: + dependencies: + bytes: 3.1.2 + content-type: 1.0.5 + debug: 4.4.3 + http-errors: 2.0.0 + iconv-lite: 0.6.3 + on-finished: 2.4.1 + qs: 6.14.0 + raw-body: 3.0.1 + type-is: 2.0.1 + transitivePeerDependencies: + - supports-color + boolbase@1.0.0: {} bowser@2.12.1: {} @@ -13221,6 +13737,22 @@ snapshots: node-releases: 2.0.19 update-browserslist-db: 1.1.3(browserslist@4.25.4) + browserslist@4.26.0: + dependencies: + baseline-browser-mapping: 2.8.3 + caniuse-lite: 1.0.30001741 + electron-to-chromium: 1.5.218 + node-releases: 2.0.21 + update-browserslist-db: 1.1.3(browserslist@4.26.0) + + browserslist@4.26.2: + dependencies: + baseline-browser-mapping: 2.8.4 + caniuse-lite: 1.0.30001743 + electron-to-chromium: 1.5.218 + node-releases: 2.0.21 + update-browserslist-db: 1.1.3(browserslist@4.26.2) + buffer-from@1.1.2: {} buffer@5.7.1: @@ -13228,6 +13760,8 @@ snapshots: base64-js: 1.5.1 ieee754: 1.2.1 + bytes@3.1.2: {} + call-bind-apply-helpers@1.0.2: dependencies: es-errors: 1.3.0 @@ -13261,6 +13795,8 @@ snapshots: caniuse-lite@1.0.30001741: {} + caniuse-lite@1.0.30001743: {} + ccount@2.0.1: {} chalk@2.4.2: @@ -13352,12 +13888,12 @@ snapshots: cmd-shim@7.0.0: {} - cmdk@1.1.1(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1): + cmdk@1.1.1(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1): dependencies: - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.12)(react@19.1.1) - '@radix-ui/react-dialog': 1.1.15(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-id': 1.1.1(@types/react@19.1.12)(react@19.1.1) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.13)(react@19.1.1) + '@radix-ui/react-dialog': 1.1.15(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-id': 1.1.1(@types/react@19.1.13)(react@19.1.1) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) react: 19.1.1 react-dom: 19.1.1(react@19.1.1) transitivePeerDependencies: @@ -13379,7 +13915,7 @@ snapshots: color-string@1.9.1: dependencies: color-name: 1.1.4 - simple-swizzle: 0.2.2 + simple-swizzle: 0.2.4 optional: true color@4.2.3: @@ -13418,14 +13954,29 @@ snapshots: snake-case: 2.1.0 upper-case: 1.1.3 + content-disposition@1.0.0: + dependencies: + safe-buffer: 5.2.1 + + content-type@1.0.5: {} + convert-source-map@1.9.0: {} convert-source-map@2.0.0: {} + cookie-signature@1.2.2: {} + + cookie@0.7.2: {} + cookie@1.0.2: {} core-js-pure@3.45.1: {} + cors@2.8.5: + dependencies: + object-assign: 4.1.1 + vary: 1.1.2 + cosmiconfig@7.1.0: dependencies: '@types/parse-json': 4.0.2 @@ -13601,6 +14152,10 @@ snapshots: dependencies: ms: 2.1.3 + debug@4.4.3: + dependencies: + ms: 2.1.3 + decimal.js-light@2.5.1: {} decimal.js@10.6.0: {} @@ -13648,6 +14203,8 @@ snapshots: rimraf: 3.0.2 slash: 3.0.0 + depd@2.0.0: {} + dequal@2.0.3: {} detect-indent@7.0.1: {} @@ -13713,14 +14270,20 @@ snapshots: duplexer@0.1.2: {} + ee-first@1.1.1: {} + electron-to-chromium@1.5.214: {} + electron-to-chromium@1.5.218: {} + emery@1.4.4: {} emoji-regex@8.0.0: {} emoji-regex@9.2.2: {} + encodeurl@2.0.0: {} + end-of-stream@1.4.5: dependencies: once: 1.4.0 @@ -13841,6 +14404,8 @@ snapshots: escalade@3.2.0: {} + escape-html@1.0.3: {} + escape-string-regexp@1.0.5: {} escape-string-regexp@2.0.0: {} @@ -13857,16 +14422,16 @@ snapshots: optionalDependencies: source-map: 0.6.1 - eslint-config-next@15.5.2(eslint@9.35.0(jiti@2.5.1))(typescript@5.9.2): + eslint-config-next@15.5.3(eslint@9.35.0(jiti@2.5.1))(typescript@5.9.2): dependencies: - '@next/eslint-plugin-next': 15.5.2 + '@next/eslint-plugin-next': 15.5.3 '@rushstack/eslint-patch': 1.12.0 - '@typescript-eslint/eslint-plugin': 8.42.0(@typescript-eslint/parser@8.42.0(eslint@9.35.0(jiti@2.5.1))(typescript@5.9.2))(eslint@9.35.0(jiti@2.5.1))(typescript@5.9.2) - '@typescript-eslint/parser': 8.42.0(eslint@9.35.0(jiti@2.5.1))(typescript@5.9.2) + '@typescript-eslint/eslint-plugin': 8.43.0(@typescript-eslint/parser@8.43.0(eslint@9.35.0(jiti@2.5.1))(typescript@5.9.2))(eslint@9.35.0(jiti@2.5.1))(typescript@5.9.2) + '@typescript-eslint/parser': 8.43.0(eslint@9.35.0(jiti@2.5.1))(typescript@5.9.2) eslint: 9.35.0(jiti@2.5.1) eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0)(eslint@9.35.0(jiti@2.5.1)) - eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.42.0(eslint@9.35.0(jiti@2.5.1))(typescript@5.9.2))(eslint-import-resolver-typescript@3.10.1)(eslint@9.35.0(jiti@2.5.1)) + eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.44.0(eslint@9.35.0(jiti@2.5.1))(typescript@5.9.2))(eslint@9.35.0(jiti@2.5.1)))(eslint@9.35.0(jiti@2.5.1)) + eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.43.0(eslint@9.35.0(jiti@2.5.1))(typescript@5.9.2))(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.44.0(eslint@9.35.0(jiti@2.5.1))(typescript@5.9.2))(eslint@9.35.0(jiti@2.5.1)))(eslint@9.35.0(jiti@2.5.1)))(eslint@9.35.0(jiti@2.5.1)) eslint-plugin-jsx-a11y: 6.10.2(eslint@9.35.0(jiti@2.5.1)) eslint-plugin-react: 7.37.5(eslint@9.35.0(jiti@2.5.1)) eslint-plugin-react-hooks: 5.2.0(eslint@9.35.0(jiti@2.5.1)) @@ -13891,33 +14456,33 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0)(eslint@9.35.0(jiti@2.5.1)): + eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.44.0(eslint@9.35.0(jiti@2.5.1))(typescript@5.9.2))(eslint@9.35.0(jiti@2.5.1)))(eslint@9.35.0(jiti@2.5.1)): dependencies: '@nolyfill/is-core-module': 1.0.39 - debug: 4.4.1 + debug: 4.4.3 eslint: 9.35.0(jiti@2.5.1) get-tsconfig: 4.10.1 is-bun-module: 2.0.0 stable-hash: 0.0.5 - tinyglobby: 0.2.14 + tinyglobby: 0.2.15 unrs-resolver: 1.11.1 optionalDependencies: - eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.42.0(eslint@9.35.0(jiti@2.5.1))(typescript@5.9.2))(eslint-import-resolver-typescript@3.10.1)(eslint@9.35.0(jiti@2.5.1)) + eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.43.0(eslint@9.35.0(jiti@2.5.1))(typescript@5.9.2))(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.44.0(eslint@9.35.0(jiti@2.5.1))(typescript@5.9.2))(eslint@9.35.0(jiti@2.5.1)))(eslint@9.35.0(jiti@2.5.1)))(eslint@9.35.0(jiti@2.5.1)) transitivePeerDependencies: - supports-color - eslint-module-utils@2.12.1(@typescript-eslint/parser@8.42.0(eslint@9.35.0(jiti@2.5.1))(typescript@5.9.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1)(eslint@9.35.0(jiti@2.5.1)): + eslint-module-utils@2.12.1(@typescript-eslint/parser@8.43.0(eslint@9.35.0(jiti@2.5.1))(typescript@5.9.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.44.0(eslint@9.35.0(jiti@2.5.1))(typescript@5.9.2))(eslint@9.35.0(jiti@2.5.1)))(eslint@9.35.0(jiti@2.5.1)))(eslint@9.35.0(jiti@2.5.1)): dependencies: debug: 3.2.7 optionalDependencies: - '@typescript-eslint/parser': 8.42.0(eslint@9.35.0(jiti@2.5.1))(typescript@5.9.2) + '@typescript-eslint/parser': 8.43.0(eslint@9.35.0(jiti@2.5.1))(typescript@5.9.2) eslint: 9.35.0(jiti@2.5.1) eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0)(eslint@9.35.0(jiti@2.5.1)) + eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.44.0(eslint@9.35.0(jiti@2.5.1))(typescript@5.9.2))(eslint@9.35.0(jiti@2.5.1)))(eslint@9.35.0(jiti@2.5.1)) transitivePeerDependencies: - supports-color - eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.42.0(eslint@9.35.0(jiti@2.5.1))(typescript@5.9.2))(eslint-import-resolver-typescript@3.10.1)(eslint@9.35.0(jiti@2.5.1)): + eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.43.0(eslint@9.35.0(jiti@2.5.1))(typescript@5.9.2))(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.44.0(eslint@9.35.0(jiti@2.5.1))(typescript@5.9.2))(eslint@9.35.0(jiti@2.5.1)))(eslint@9.35.0(jiti@2.5.1)))(eslint@9.35.0(jiti@2.5.1)): dependencies: '@rtsao/scc': 1.1.0 array-includes: 3.1.9 @@ -13928,7 +14493,7 @@ snapshots: doctrine: 2.1.0 eslint: 9.35.0(jiti@2.5.1) eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.42.0(eslint@9.35.0(jiti@2.5.1))(typescript@5.9.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1)(eslint@9.35.0(jiti@2.5.1)) + eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.43.0(eslint@9.35.0(jiti@2.5.1))(typescript@5.9.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.44.0(eslint@9.35.0(jiti@2.5.1))(typescript@5.9.2))(eslint@9.35.0(jiti@2.5.1)))(eslint@9.35.0(jiti@2.5.1)))(eslint@9.35.0(jiti@2.5.1)) hasown: 2.0.2 is-core-module: 2.16.1 is-glob: 4.0.3 @@ -13940,7 +14505,7 @@ snapshots: string.prototype.trimend: 1.0.9 tsconfig-paths: 3.15.0 optionalDependencies: - '@typescript-eslint/parser': 8.42.0(eslint@9.35.0(jiti@2.5.1))(typescript@5.9.2) + '@typescript-eslint/parser': 8.43.0(eslint@9.35.0(jiti@2.5.1))(typescript@5.9.2) transitivePeerDependencies: - eslint-import-resolver-typescript - eslint-import-resolver-webpack @@ -14084,6 +14649,8 @@ snapshots: esutils@2.0.3: {} + etag@1.8.1: {} + event-target-shim@6.0.2: {} eventemitter3@4.0.7: {} @@ -14092,6 +14659,10 @@ snapshots: eventsource-parser@3.0.6: {} + eventsource@3.0.7: + dependencies: + eventsource-parser: 3.0.6 + execa@5.1.1: dependencies: cross-spawn: 7.0.6 @@ -14104,6 +14675,42 @@ snapshots: signal-exit: 3.0.7 strip-final-newline: 2.0.0 + express-rate-limit@7.5.1(express@5.1.0): + dependencies: + express: 5.1.0 + + express@5.1.0: + dependencies: + accepts: 2.0.0 + body-parser: 2.2.0 + content-disposition: 1.0.0 + content-type: 1.0.5 + cookie: 0.7.2 + cookie-signature: 1.2.2 + debug: 4.4.3 + encodeurl: 2.0.0 + escape-html: 1.0.3 + etag: 1.8.1 + finalhandler: 2.1.0 + fresh: 2.0.0 + http-errors: 2.0.0 + merge-descriptors: 2.0.0 + mime-types: 3.0.1 + on-finished: 2.4.1 + once: 1.4.0 + parseurl: 1.3.3 + proxy-addr: 2.0.7 + qs: 6.14.0 + range-parser: 1.2.1 + router: 2.2.0 + send: 1.2.0 + serve-static: 2.2.0 + statuses: 2.0.2 + type-is: 2.0.1 + vary: 1.1.2 + transitivePeerDependencies: + - supports-color + external-editor@3.1.0: dependencies: chardet: 0.7.0 @@ -14179,6 +14786,17 @@ snapshots: dependencies: to-regex-range: 5.0.1 + finalhandler@2.1.0: + dependencies: + debug: 4.4.3 + encodeurl: 2.0.0 + escape-html: 1.0.3 + on-finished: 2.4.1 + parseurl: 1.3.3 + statuses: 2.0.2 + transitivePeerDependencies: + - supports-color + find-root@1.1.0: {} find-up@5.0.0: @@ -14203,6 +14821,10 @@ snapshots: forwarded-parse@2.1.2: {} + forwarded@0.2.0: {} + + fresh@2.0.0: {} + fs-extra@10.1.0: dependencies: graceful-fs: 4.2.11 @@ -14407,6 +15029,14 @@ snapshots: domutils: 3.2.2 entities: 4.5.0 + http-errors@2.0.0: + dependencies: + depd: 2.0.0 + inherits: 2.0.4 + setprototypeof: 1.2.0 + statuses: 2.0.1 + toidentifier: 1.0.1 + http-proxy-agent@7.0.2: dependencies: agent-base: 7.1.4 @@ -14417,7 +15047,7 @@ snapshots: https-proxy-agent@5.0.1: dependencies: agent-base: 6.0.2 - debug: 4.4.1 + debug: 4.4.3 transitivePeerDependencies: - supports-color @@ -14452,6 +15082,10 @@ snapshots: dependencies: safer-buffer: 2.1.2 + iconv-lite@0.7.0: + dependencies: + safer-buffer: 2.1.2 + idb-keyval@6.2.2: {} idb@7.1.1: {} @@ -14510,9 +15144,9 @@ snapshots: strip-ansi: 6.0.1 through: 2.3.8 - inquirer@8.2.7(@types/node@24.3.1): + inquirer@8.2.7(@types/node@24.5.0): dependencies: - '@inquirer/external-editor': 1.0.1(@types/node@24.3.1) + '@inquirer/external-editor': 1.0.1(@types/node@24.5.0) ansi-escapes: 4.3.2 chalk: 4.1.2 cli-cursor: 3.1.0 @@ -14547,6 +15181,8 @@ snapshots: ip-address@10.0.1: {} + ipaddr.js@1.9.1: {} + is-alphabetical@2.0.1: {} is-alphanumerical@2.0.1: @@ -14562,7 +15198,7 @@ snapshots: is-arrayish@0.2.1: {} - is-arrayish@0.3.2: + is-arrayish@0.3.4: optional: true is-async-function@2.1.1: @@ -14657,6 +15293,8 @@ snapshots: is-plain-object@5.0.0: {} + is-promise@4.0.0: {} + is-reference@1.2.1: dependencies: '@types/estree': 1.0.8 @@ -14729,7 +15367,7 @@ snapshots: jest-worker@27.5.1: dependencies: - '@types/node': 24.3.1 + '@types/node': 24.5.0 merge-stream: 2.0.0 supports-color: 8.1.1 @@ -14899,7 +15537,7 @@ snapshots: lru-cache@7.18.3: {} - lucide-react@0.542.0(react@19.1.1): + lucide-react@0.544.0(react@19.1.1): dependencies: react: 19.1.1 @@ -14907,6 +15545,10 @@ snapshots: dependencies: '@jridgewell/sourcemap-codec': 1.5.5 + magic-string@0.30.19: + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + magic-string@0.30.8: dependencies: '@jridgewell/sourcemap-codec': 1.5.5 @@ -15053,6 +15695,10 @@ snapshots: mdn-data@2.12.2: {} + media-typer@1.1.0: {} + + merge-descriptors@2.0.0: {} + merge-stream@2.0.0: {} merge2@1.4.1: {} @@ -15294,10 +15940,16 @@ snapshots: mime-db@1.52.0: {} + mime-db@1.54.0: {} + mime-types@2.1.35: dependencies: mime-db: 1.52.0 + mime-types@3.0.1: + dependencies: + mime-db: 1.54.0 + mimic-fn@2.1.0: {} minimatch@3.1.2: @@ -15344,41 +15996,43 @@ snapshots: natural-compare@1.4.0: {} + negotiator@1.0.0: {} + neo-async@2.6.2: {} netmask@2.0.2: {} - next-sitemap@4.2.3(next@15.5.2(@opentelemetry/api@1.9.0)(@playwright/test@1.55.0)(babel-plugin-react-compiler@19.1.0-rc.3)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)): + next-sitemap@4.2.3(next@15.5.3(@opentelemetry/api@1.9.0)(@playwright/test@1.55.0)(babel-plugin-react-compiler@19.1.0-rc.3)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)): dependencies: '@corex/deepmerge': 4.0.43 '@next/env': 13.5.11 fast-glob: 3.3.3 minimist: 1.2.8 - next: 15.5.2(@opentelemetry/api@1.9.0)(@playwright/test@1.55.0)(babel-plugin-react-compiler@19.1.0-rc.3)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + next: 15.5.3(@opentelemetry/api@1.9.0)(@playwright/test@1.55.0)(babel-plugin-react-compiler@19.1.0-rc.3)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) next-themes@0.4.6(react-dom@19.1.1(react@19.1.1))(react@19.1.1): dependencies: react: 19.1.1 react-dom: 19.1.1(react@19.1.1) - next@15.5.2(@babel/core@7.28.3)(@opentelemetry/api@1.9.0)(@playwright/test@1.55.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1): + next@15.5.3(@babel/core@7.28.4)(@opentelemetry/api@1.9.0)(@playwright/test@1.55.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1): dependencies: - '@next/env': 15.5.2 + '@next/env': 15.5.3 '@swc/helpers': 0.5.15 caniuse-lite: 1.0.30001741 postcss: 8.4.31 react: 19.1.1 react-dom: 19.1.1(react@19.1.1) - styled-jsx: 5.1.6(@babel/core@7.28.3)(react@19.1.1) + styled-jsx: 5.1.6(@babel/core@7.28.4)(react@19.1.1) optionalDependencies: - '@next/swc-darwin-arm64': 15.5.2 - '@next/swc-darwin-x64': 15.5.2 - '@next/swc-linux-arm64-gnu': 15.5.2 - '@next/swc-linux-arm64-musl': 15.5.2 - '@next/swc-linux-x64-gnu': 15.5.2 - '@next/swc-linux-x64-musl': 15.5.2 - '@next/swc-win32-arm64-msvc': 15.5.2 - '@next/swc-win32-x64-msvc': 15.5.2 + '@next/swc-darwin-arm64': 15.5.3 + '@next/swc-darwin-x64': 15.5.3 + '@next/swc-linux-arm64-gnu': 15.5.3 + '@next/swc-linux-arm64-musl': 15.5.3 + '@next/swc-linux-x64-gnu': 15.5.3 + '@next/swc-linux-x64-musl': 15.5.3 + '@next/swc-win32-arm64-msvc': 15.5.3 + '@next/swc-win32-x64-msvc': 15.5.3 '@opentelemetry/api': 1.9.0 '@playwright/test': 1.55.0 sharp: 0.34.3 @@ -15386,24 +16040,24 @@ snapshots: - '@babel/core' - babel-plugin-macros - next@15.5.2(@opentelemetry/api@1.9.0)(@playwright/test@1.55.0)(babel-plugin-react-compiler@19.1.0-rc.3)(react-dom@19.1.1(react@19.1.1))(react@19.1.1): + next@15.5.3(@opentelemetry/api@1.9.0)(@playwright/test@1.55.0)(babel-plugin-react-compiler@19.1.0-rc.3)(react-dom@19.1.1(react@19.1.1))(react@19.1.1): dependencies: - '@next/env': 15.5.2 + '@next/env': 15.5.3 '@swc/helpers': 0.5.15 caniuse-lite: 1.0.30001741 postcss: 8.4.31 react: 19.1.1 react-dom: 19.1.1(react@19.1.1) - styled-jsx: 5.1.6(@babel/core@7.28.3)(react@19.1.1) + styled-jsx: 5.1.6(@babel/core@7.28.4)(react@19.1.1) optionalDependencies: - '@next/swc-darwin-arm64': 15.5.2 - '@next/swc-darwin-x64': 15.5.2 - '@next/swc-linux-arm64-gnu': 15.5.2 - '@next/swc-linux-arm64-musl': 15.5.2 - '@next/swc-linux-x64-gnu': 15.5.2 - '@next/swc-linux-x64-musl': 15.5.2 - '@next/swc-win32-arm64-msvc': 15.5.2 - '@next/swc-win32-x64-msvc': 15.5.2 + '@next/swc-darwin-arm64': 15.5.3 + '@next/swc-darwin-x64': 15.5.3 + '@next/swc-linux-arm64-gnu': 15.5.3 + '@next/swc-linux-arm64-musl': 15.5.3 + '@next/swc-linux-x64-gnu': 15.5.3 + '@next/swc-linux-x64-musl': 15.5.3 + '@next/swc-win32-arm64-msvc': 15.5.3 + '@next/swc-win32-x64-msvc': 15.5.3 '@opentelemetry/api': 1.9.0 '@playwright/test': 1.55.0 babel-plugin-react-compiler: 19.1.0-rc.3 @@ -15449,6 +16103,8 @@ snapshots: node-releases@2.0.19: {} + node-releases@2.0.21: {} + nodemailer@7.0.6: {} normalize-path@3.0.0: {} @@ -15509,6 +16165,10 @@ snapshots: on-exit-leak-free@2.1.2: {} + on-finished@2.4.1: + dependencies: + ee-first: 1.1.1 + once@1.4.0: dependencies: wrappy: 1.0.2 @@ -15634,6 +16294,8 @@ snapshots: leac: 0.6.0 peberminta: 0.9.0 + parseurl@1.3.3: {} + partysocket@0.0.22: dependencies: event-target-shim: 6.0.2 @@ -15660,6 +16322,8 @@ snapshots: lru-cache: 10.4.3 minipass: 7.1.2 + path-to-regexp@8.3.0: {} + path-type@4.0.0: {} peberminta@0.9.0: {} @@ -15706,7 +16370,7 @@ snapshots: pino-std-serializers@7.0.0: {} - pino@9.9.4: + pino@9.9.5: dependencies: atomic-sleep: 1.0.0 fast-redact: 3.5.0 @@ -15720,6 +16384,8 @@ snapshots: sonic-boom: 4.2.0 thread-stream: 3.1.0 + pkce-challenge@5.0.0: {} + playwright-core@1.55.0: {} playwright@1.55.0: @@ -15980,6 +16646,11 @@ snapshots: proto-list@1.2.4: {} + proxy-addr@2.0.7: + dependencies: + forwarded: 0.2.0 + ipaddr.js: 1.9.1 + proxy-agent@6.5.0: dependencies: agent-base: 7.1.4 @@ -16010,73 +16681,82 @@ snapshots: quick-format-unescaped@4.0.4: {} - radix-ui@1.4.3(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1): + radix-ui@1.4.3(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1): dependencies: '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-accessible-icon': 1.1.7(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-accordion': 1.2.12(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-alert-dialog': 1.1.15(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-arrow': 1.1.7(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-aspect-ratio': 1.1.7(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-avatar': 1.1.10(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-checkbox': 1.3.3(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-collapsible': 1.1.12(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.12)(react@19.1.1) - '@radix-ui/react-context': 1.1.2(@types/react@19.1.12)(react@19.1.1) - '@radix-ui/react-context-menu': 2.2.16(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-dialog': 1.1.15(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-direction': 1.1.1(@types/react@19.1.12)(react@19.1.1) - '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-dropdown-menu': 2.1.16(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-focus-guards': 1.1.3(@types/react@19.1.12)(react@19.1.1) - '@radix-ui/react-focus-scope': 1.1.7(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-form': 0.1.8(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-hover-card': 1.1.15(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-label': 2.1.7(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-menu': 2.1.16(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-menubar': 1.1.16(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-navigation-menu': 1.2.14(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-one-time-password-field': 0.1.8(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-password-toggle-field': 0.1.3(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-popover': 1.1.15(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-popper': 1.2.8(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-progress': 1.1.7(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-radio-group': 1.3.8(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-roving-focus': 1.1.11(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-scroll-area': 1.2.10(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-select': 2.2.6(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-separator': 1.1.7(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-slider': 1.3.6(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-slot': 1.2.3(@types/react@19.1.12)(react@19.1.1) - '@radix-ui/react-switch': 1.2.6(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-tabs': 1.1.13(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-toast': 1.2.15(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-toggle': 1.1.10(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-toggle-group': 1.1.11(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-toolbar': 1.1.11(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-tooltip': 1.2.8(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.1.12)(react@19.1.1) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.1.12)(react@19.1.1) - '@radix-ui/react-use-effect-event': 0.0.2(@types/react@19.1.12)(react@19.1.1) - '@radix-ui/react-use-escape-keydown': 1.1.1(@types/react@19.1.12)(react@19.1.1) - '@radix-ui/react-use-is-hydrated': 0.1.0(@types/react@19.1.12)(react@19.1.1) - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.12)(react@19.1.1) - '@radix-ui/react-use-size': 1.1.1(@types/react@19.1.12)(react@19.1.1) - '@radix-ui/react-visually-hidden': 1.2.3(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-accessible-icon': 1.1.7(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-accordion': 1.2.12(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-alert-dialog': 1.1.15(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-arrow': 1.1.7(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-aspect-ratio': 1.1.7(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-avatar': 1.1.10(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-checkbox': 1.3.3(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-collapsible': 1.1.12(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.13)(react@19.1.1) + '@radix-ui/react-context': 1.1.2(@types/react@19.1.13)(react@19.1.1) + '@radix-ui/react-context-menu': 2.2.16(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-dialog': 1.1.15(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-direction': 1.1.1(@types/react@19.1.13)(react@19.1.1) + '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-dropdown-menu': 2.1.16(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-focus-guards': 1.1.3(@types/react@19.1.13)(react@19.1.1) + '@radix-ui/react-focus-scope': 1.1.7(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-form': 0.1.8(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-hover-card': 1.1.15(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-label': 2.1.7(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-menu': 2.1.16(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-menubar': 1.1.16(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-navigation-menu': 1.2.14(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-one-time-password-field': 0.1.8(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-password-toggle-field': 0.1.3(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-popover': 1.1.15(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-popper': 1.2.8(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-progress': 1.1.7(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-radio-group': 1.3.8(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-roving-focus': 1.1.11(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-scroll-area': 1.2.10(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-select': 2.2.6(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-separator': 1.1.7(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-slider': 1.3.6(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-slot': 1.2.3(@types/react@19.1.13)(react@19.1.1) + '@radix-ui/react-switch': 1.2.6(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-tabs': 1.1.13(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-toast': 1.2.15(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-toggle': 1.1.10(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-toggle-group': 1.1.11(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-toolbar': 1.1.11(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-tooltip': 1.2.8(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.1.13)(react@19.1.1) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.1.13)(react@19.1.1) + '@radix-ui/react-use-effect-event': 0.0.2(@types/react@19.1.13)(react@19.1.1) + '@radix-ui/react-use-escape-keydown': 1.1.1(@types/react@19.1.13)(react@19.1.1) + '@radix-ui/react-use-is-hydrated': 0.1.0(@types/react@19.1.13)(react@19.1.1) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.13)(react@19.1.1) + '@radix-ui/react-use-size': 1.1.1(@types/react@19.1.13)(react@19.1.1) + '@radix-ui/react-visually-hidden': 1.2.3(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) react: 19.1.1 react-dom: 19.1.1(react@19.1.1) optionalDependencies: - '@types/react': 19.1.12 - '@types/react-dom': 19.1.9(@types/react@19.1.12) + '@types/react': 19.1.13 + '@types/react-dom': 19.1.9(@types/react@19.1.13) randombytes@2.1.0: dependencies: safe-buffer: 5.2.1 + range-parser@1.2.1: {} + + raw-body@3.0.1: + dependencies: + bytes: 3.1.2 + http-errors: 2.0.0 + iconv-lite: 0.7.0 + unpipe: 1.0.0 + rc@1.2.8: dependencies: deep-extend: 0.6.0 @@ -16084,7 +16764,7 @@ snapshots: minimist: 1.2.8 strip-json-comments: 2.0.1 - react-day-picker@9.9.0(react@19.1.1): + react-day-picker@9.10.0(react@19.1.1): dependencies: '@date-fns/tz': 1.4.1 date-fns: 4.1.0 @@ -16123,24 +16803,24 @@ snapshots: dependencies: fast-deep-equal: 2.0.1 - react-remove-scroll-bar@2.3.8(@types/react@19.1.12)(react@19.1.1): + react-remove-scroll-bar@2.3.8(@types/react@19.1.13)(react@19.1.1): dependencies: react: 19.1.1 - react-style-singleton: 2.2.3(@types/react@19.1.12)(react@19.1.1) + react-style-singleton: 2.2.3(@types/react@19.1.13)(react@19.1.1) tslib: 2.8.1 optionalDependencies: - '@types/react': 19.1.12 + '@types/react': 19.1.13 - react-remove-scroll@2.7.1(@types/react@19.1.12)(react@19.1.1): + react-remove-scroll@2.7.1(@types/react@19.1.13)(react@19.1.1): dependencies: react: 19.1.1 - react-remove-scroll-bar: 2.3.8(@types/react@19.1.12)(react@19.1.1) - react-style-singleton: 2.2.3(@types/react@19.1.12)(react@19.1.1) + react-remove-scroll-bar: 2.3.8(@types/react@19.1.13)(react@19.1.1) + react-style-singleton: 2.2.3(@types/react@19.1.13)(react@19.1.1) tslib: 2.8.1 - use-callback-ref: 1.3.3(@types/react@19.1.12)(react@19.1.1) - use-sidecar: 1.1.3(@types/react@19.1.12)(react@19.1.1) + use-callback-ref: 1.3.3(@types/react@19.1.13)(react@19.1.1) + use-sidecar: 1.1.3(@types/react@19.1.13)(react@19.1.1) optionalDependencies: - '@types/react': 19.1.12 + '@types/react': 19.1.13 react-smooth@4.0.4(react-dom@19.1.1(react@19.1.1))(react@19.1.1): dependencies: @@ -16150,13 +16830,13 @@ snapshots: react-dom: 19.1.1(react@19.1.1) react-transition-group: 4.4.5(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - react-style-singleton@2.2.3(@types/react@19.1.12)(react@19.1.1): + react-style-singleton@2.2.3(@types/react@19.1.13)(react@19.1.1): dependencies: get-nonce: 1.0.1 react: 19.1.1 tslib: 2.8.1 optionalDependencies: - '@types/react': 19.1.12 + '@types/react': 19.1.13 react-top-loading-bar@3.0.2(react@19.1.1): dependencies: @@ -16247,7 +16927,7 @@ snapshots: require-in-the-middle@7.5.2: dependencies: - debug: 4.4.1 + debug: 4.4.3 module-details-from-path: 1.0.4 resolve: 1.22.8 transitivePeerDependencies: @@ -16286,35 +16966,45 @@ snapshots: dependencies: glob: 7.2.3 - rollup@4.50.0: + rollup@4.50.1: dependencies: '@types/estree': 1.0.8 optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.50.0 - '@rollup/rollup-android-arm64': 4.50.0 - '@rollup/rollup-darwin-arm64': 4.50.0 - '@rollup/rollup-darwin-x64': 4.50.0 - '@rollup/rollup-freebsd-arm64': 4.50.0 - '@rollup/rollup-freebsd-x64': 4.50.0 - '@rollup/rollup-linux-arm-gnueabihf': 4.50.0 - '@rollup/rollup-linux-arm-musleabihf': 4.50.0 - '@rollup/rollup-linux-arm64-gnu': 4.50.0 - '@rollup/rollup-linux-arm64-musl': 4.50.0 - '@rollup/rollup-linux-loongarch64-gnu': 4.50.0 - '@rollup/rollup-linux-ppc64-gnu': 4.50.0 - '@rollup/rollup-linux-riscv64-gnu': 4.50.0 - '@rollup/rollup-linux-riscv64-musl': 4.50.0 - '@rollup/rollup-linux-s390x-gnu': 4.50.0 - '@rollup/rollup-linux-x64-gnu': 4.50.0 - '@rollup/rollup-linux-x64-musl': 4.50.0 - '@rollup/rollup-openharmony-arm64': 4.50.0 - '@rollup/rollup-win32-arm64-msvc': 4.50.0 - '@rollup/rollup-win32-ia32-msvc': 4.50.0 - '@rollup/rollup-win32-x64-msvc': 4.50.0 + '@rollup/rollup-android-arm-eabi': 4.50.1 + '@rollup/rollup-android-arm64': 4.50.1 + '@rollup/rollup-darwin-arm64': 4.50.1 + '@rollup/rollup-darwin-x64': 4.50.1 + '@rollup/rollup-freebsd-arm64': 4.50.1 + '@rollup/rollup-freebsd-x64': 4.50.1 + '@rollup/rollup-linux-arm-gnueabihf': 4.50.1 + '@rollup/rollup-linux-arm-musleabihf': 4.50.1 + '@rollup/rollup-linux-arm64-gnu': 4.50.1 + '@rollup/rollup-linux-arm64-musl': 4.50.1 + '@rollup/rollup-linux-loongarch64-gnu': 4.50.1 + '@rollup/rollup-linux-ppc64-gnu': 4.50.1 + '@rollup/rollup-linux-riscv64-gnu': 4.50.1 + '@rollup/rollup-linux-riscv64-musl': 4.50.1 + '@rollup/rollup-linux-s390x-gnu': 4.50.1 + '@rollup/rollup-linux-x64-gnu': 4.50.1 + '@rollup/rollup-linux-x64-musl': 4.50.1 + '@rollup/rollup-openharmony-arm64': 4.50.1 + '@rollup/rollup-win32-arm64-msvc': 4.50.1 + '@rollup/rollup-win32-ia32-msvc': 4.50.1 + '@rollup/rollup-win32-x64-msvc': 4.50.1 fsevents: 2.3.3 rope-sequence@1.3.4: {} + router@2.2.0: + dependencies: + debug: 4.4.3 + depd: 2.0.0 + is-promise: 4.0.0 + parseurl: 1.3.3 + path-to-regexp: 8.3.0 + transitivePeerDependencies: + - supports-color + run-async@2.4.1: {} run-parallel@1.2.0: @@ -16389,6 +17079,22 @@ snapshots: semver@7.7.2: {} + send@1.2.0: + dependencies: + debug: 4.4.3 + encodeurl: 2.0.0 + escape-html: 1.0.3 + etag: 1.8.1 + fresh: 2.0.0 + http-errors: 2.0.0 + mime-types: 3.0.1 + ms: 2.1.3 + on-finished: 2.4.1 + range-parser: 1.2.1 + statuses: 2.0.2 + transitivePeerDependencies: + - supports-color + sentence-case@2.1.1: dependencies: no-case: 2.3.2 @@ -16398,6 +17104,15 @@ snapshots: dependencies: randombytes: 2.1.0 + serve-static@2.2.0: + dependencies: + encodeurl: 2.0.0 + escape-html: 1.0.3 + parseurl: 1.3.3 + send: 1.2.0 + transitivePeerDependencies: + - supports-color + server-only@0.0.1: {} set-function-length@1.2.2: @@ -16422,6 +17137,8 @@ snapshots: es-errors: 1.3.0 es-object-atoms: 1.1.1 + setprototypeof@1.2.0: {} + sharp@0.34.3: dependencies: color: 4.2.3 @@ -16492,9 +17209,9 @@ snapshots: signal-exit@4.1.0: {} - simple-swizzle@0.2.2: + simple-swizzle@0.2.4: dependencies: - is-arrayish: 0.3.2 + is-arrayish: 0.3.4 optional: true sirv@2.0.4: @@ -16578,6 +17295,10 @@ snapshots: dependencies: type-fest: 0.7.1 + statuses@2.0.1: {} + + statuses@2.0.2: {} + stop-iteration-iterator@1.1.0: dependencies: es-errors: 1.3.0 @@ -16660,20 +17381,20 @@ snapshots: strip-json-comments@3.1.1: {} - stripe@18.5.0(@types/node@24.3.1): + stripe@18.5.0(@types/node@24.5.0): dependencies: qs: 6.14.0 optionalDependencies: - '@types/node': 24.3.1 + '@types/node': 24.5.0 strnum@2.1.1: {} - styled-jsx@5.1.6(@babel/core@7.28.3)(react@19.1.1): + styled-jsx@5.1.6(@babel/core@7.28.4)(react@19.1.1): dependencies: client-only: 0.0.1 react: 19.1.1 optionalDependencies: - '@babel/core': 7.28.3 + '@babel/core': 7.28.4 stylehacks@7.0.6(postcss@8.5.6): dependencies: @@ -16683,7 +17404,7 @@ snapshots: stylis@4.2.0: {} - supabase@2.39.2: + supabase@2.40.7: dependencies: bin-links: 5.0.0 https-proxy-agent: 7.0.6 @@ -16746,7 +17467,7 @@ snapshots: terser-webpack-plugin@5.3.14(webpack@5.101.3): dependencies: - '@jridgewell/trace-mapping': 0.3.30 + '@jridgewell/trace-mapping': 0.3.31 jest-worker: 27.5.1 schema-utils: 4.3.2 serialize-javascript: 6.0.2 @@ -16781,6 +17502,11 @@ snapshots: fdir: 6.5.0(picomatch@4.0.3) picomatch: 4.0.3 + tinyglobby@0.2.15: + dependencies: + fdir: 6.5.0(picomatch@4.0.3) + picomatch: 4.0.3 + tinygradient@1.1.5: dependencies: '@types/tinycolor2': 1.4.6 @@ -16799,9 +17525,11 @@ snapshots: dependencies: is-number: 7.0.0 + toidentifier@1.0.1: {} + totalist@3.0.1: {} - totp-generator@1.0.0: + totp-generator@2.0.0: dependencies: jssha: 3.3.1 @@ -16813,14 +17541,14 @@ snapshots: ts-case-convert@2.1.0: {} - ts-node@10.9.2(@types/node@24.3.1)(typescript@5.9.2): + ts-node@10.9.2(@types/node@24.5.0)(typescript@5.9.2): dependencies: '@cspotcode/source-map-support': 0.8.1 '@tsconfig/node10': 1.0.11 '@tsconfig/node12': 1.0.11 '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.4 - '@types/node': 24.3.1 + '@types/node': 24.5.0 acorn: 8.15.0 acorn-walk: 8.3.4 arg: 4.1.3 @@ -16877,6 +17605,12 @@ snapshots: type-fest@0.7.1: {} + type-is@2.0.1: + dependencies: + content-type: 1.0.5 + media-typer: 1.1.0 + mime-types: 3.0.1 + typed-array-buffer@1.0.3: dependencies: call-bound: 1.0.4 @@ -16910,12 +17644,12 @@ snapshots: possible-typed-array-names: 1.1.0 reflect.getprototypeof: 1.0.10 - typescript-eslint@8.42.0(eslint@9.35.0(jiti@2.5.1))(typescript@5.9.2): + typescript-eslint@8.44.0(eslint@9.35.0(jiti@2.5.1))(typescript@5.9.2): dependencies: - '@typescript-eslint/eslint-plugin': 8.42.0(@typescript-eslint/parser@8.42.0(eslint@9.35.0(jiti@2.5.1))(typescript@5.9.2))(eslint@9.35.0(jiti@2.5.1))(typescript@5.9.2) - '@typescript-eslint/parser': 8.42.0(eslint@9.35.0(jiti@2.5.1))(typescript@5.9.2) - '@typescript-eslint/typescript-estree': 8.42.0(typescript@5.9.2) - '@typescript-eslint/utils': 8.42.0(eslint@9.35.0(jiti@2.5.1))(typescript@5.9.2) + '@typescript-eslint/eslint-plugin': 8.44.0(@typescript-eslint/parser@8.44.0(eslint@9.35.0(jiti@2.5.1))(typescript@5.9.2))(eslint@9.35.0(jiti@2.5.1))(typescript@5.9.2) + '@typescript-eslint/parser': 8.44.0(eslint@9.35.0(jiti@2.5.1))(typescript@5.9.2) + '@typescript-eslint/typescript-estree': 8.44.0(typescript@5.9.2) + '@typescript-eslint/utils': 8.44.0(eslint@9.35.0(jiti@2.5.1))(typescript@5.9.2) eslint: 9.35.0(jiti@2.5.1) typescript: 5.9.2 transitivePeerDependencies: @@ -16933,7 +17667,7 @@ snapshots: has-symbols: 1.1.0 which-boxed-primitive: 1.1.1 - undici-types@7.10.0: {} + undici-types@7.12.0: {} unist-util-is@6.0.0: dependencies: @@ -16960,6 +17694,8 @@ snapshots: universalify@2.0.1: {} + unpipe@1.0.0: {} + unplugin@1.0.1: dependencies: acorn: 8.15.0 @@ -16997,6 +17733,18 @@ snapshots: escalade: 3.2.0 picocolors: 1.1.1 + update-browserslist-db@1.1.3(browserslist@4.26.0): + dependencies: + browserslist: 4.26.0 + escalade: 3.2.0 + picocolors: 1.1.1 + + update-browserslist-db@1.1.3(browserslist@4.26.2): + dependencies: + browserslist: 4.26.2 + escalade: 3.2.0 + picocolors: 1.1.1 + update-check@1.5.4: dependencies: registry-auth-token: 3.3.2 @@ -17018,20 +17766,20 @@ snapshots: react: 19.1.1 wonka: 6.3.5 - use-callback-ref@1.3.3(@types/react@19.1.12)(react@19.1.1): + use-callback-ref@1.3.3(@types/react@19.1.13)(react@19.1.1): dependencies: react: 19.1.1 tslib: 2.8.1 optionalDependencies: - '@types/react': 19.1.12 + '@types/react': 19.1.13 - use-sidecar@1.1.3(@types/react@19.1.12)(react@19.1.1): + use-sidecar@1.1.3(@types/react@19.1.13)(react@19.1.1): dependencies: detect-node-es: 1.1.0 react: 19.1.1 tslib: 2.8.1 optionalDependencies: - '@types/react': 19.1.12 + '@types/react': 19.1.13 use-sync-external-store@1.5.0(react@19.1.1): dependencies: @@ -17047,6 +17795,8 @@ snapshots: validate-npm-package-name@6.0.2: {} + vary@1.1.2: {} + vfile-message@4.0.3: dependencies: '@types/unist': 3.0.3 @@ -17119,7 +17869,7 @@ snapshots: '@webassemblyjs/wasm-parser': 1.14.1 acorn: 8.15.0 acorn-import-phases: 1.0.4(acorn@8.15.0) - browserslist: 4.25.4 + browserslist: 4.26.2 chrome-trace-event: 1.0.4 enhanced-resolve: 5.18.3 es-module-lexer: 1.7.0 @@ -17254,6 +18004,10 @@ snapshots: yocto-queue@1.2.1: {} + zod-to-json-schema@3.24.6(zod@3.25.76): + dependencies: + zod: 3.25.76 + zod@3.25.76: {} zwitch@2.0.4: {} diff --git a/tooling/eslint/package.json b/tooling/eslint/package.json index d60f69e4d..eb1c3bb19 100644 --- a/tooling/eslint/package.json +++ b/tooling/eslint/package.json @@ -13,11 +13,11 @@ "format": "prettier --check \"**/*.{js,json}\"" }, "dependencies": { - "@next/eslint-plugin-next": "15.5.2", + "@next/eslint-plugin-next": "15.5.3", "@types/eslint": "9.6.1", - "eslint-config-next": "15.5.2", + "eslint-config-next": "15.5.3", "eslint-config-turbo": "^2.5.6", - "typescript-eslint": "8.42.0" + "typescript-eslint": "8.44.0" }, "devDependencies": { "@kit/prettier-config": "workspace:*",