diff --git a/CHANGELOG.md b/CHANGELOG.md deleted file mode 100644 index 99a4831..0000000 --- a/CHANGELOG.md +++ /dev/null @@ -1,44 +0,0 @@ -# @xtr-dev/payload-billing - -## 0.1.0 (Initial Release) - -### Features - -- **Payment Providers**: Initial support for Stripe, Mollie, and Test providers -- **PayloadCMS Integration**: Pre-configured collections for payments, customers, invoices, and refunds -- **Test Provider**: Full-featured test payment provider for local development -- **TypeScript Support**: Complete TypeScript definitions and type safety -- **Webhook Handling**: Robust webhook processing for all supported providers -- **Currency Support**: Multi-currency support with validation and formatting utilities -- **Logging**: Structured logging system for debugging and monitoring -- **Validation**: Comprehensive data validation using Zod schemas - -### Collections - -- **Payments**: Track payment status, amounts, and provider-specific data -- **Customers**: Customer management with billing information and relationships -- **Invoices**: Invoice generation with line items and status tracking -- **Refunds**: Refund tracking with relationship to original payments - -### Provider Features - -#### Test Provider -- Configurable auto-completion of payments -- Failure simulation for testing error scenarios -- Delay simulation for testing async operations -- In-memory storage for development -- Full webhook event simulation - -#### Extensible Architecture -- Common provider interface for easy extension -- Provider registry system -- Standardized error handling -- Consistent logging across providers - -### Developer Experience - -- **Testing**: Comprehensive test suite with Jest -- **Build System**: Modern build setup with tsup -- **Linting**: ESLint configuration with TypeScript support -- **Documentation**: Complete API documentation and usage examples -- **Development**: Hot reloading and watch mode support \ No newline at end of file diff --git a/CLAUDE.md b/CLAUDE.md deleted file mode 100644 index 16d7ae6..0000000 --- a/CLAUDE.md +++ /dev/null @@ -1,166 +0,0 @@ -# PayloadCMS Billing Plugin Development Guidelines - -## Project Overview - -This is a PayloadCMS plugin that provides billing and payment functionality with flexible customer data management and invoice generation capabilities. - -## Architecture Principles - -### Core Design -- **TypeScript First**: Full TypeScript support with strict typing throughout -- **PayloadCMS Integration**: Deep integration with Payload collections, hooks, and admin UI -- **Flexible Customer Data**: Support for both relationship-based and embedded customer information -- **Callback-based Syncing**: Use customer info extractors to keep data in sync - -### Collections Structure -- **Payments**: Core payment tracking with provider-specific data -- **Customers**: Customer management with billing information (optional) -- **Invoices**: Invoice generation with embedded customer info and optional customer relationship -- **Refunds**: Refund tracking and management - -## Code Organization - -``` -src/ -├── collections/ # PayloadCMS collection configurations -├── types/ # TypeScript type definitions -└── index.ts # Main plugin entry point -``` - -## Customer Data Management - -### Customer Info Extractor Pattern - -The plugin uses a callback-based approach to extract customer information from customer relationships: - -```typescript -// Define how to extract customer info from your customer collection -const customerInfoExtractor: CustomerInfoExtractor = (customer) => ({ - name: customer.name, - email: customer.email, - phone: customer.phone, - company: customer.company, - taxId: customer.taxId, - billingAddress: { - line1: customer.address.line1, - line2: customer.address.line2, - city: customer.address.city, - state: customer.address.state, - postalCode: customer.address.postalCode, - country: customer.address.country, - } -}) -``` - -### Invoice Customer Data Options - -1. **With Customer Relationship + Extractor**: - - Customer relationship required - - Customer info auto-populated and read-only - - Syncs automatically when customer changes - -2. **With Customer Relationship (no extractor)**: - - Customer relationship optional - - Customer info manually editable - - Either relationship OR customer info required - -3. **No Customer Collection**: - - Customer info fields always required and editable - - No relationship field available - -## Plugin Configuration - -### Basic Configuration -```typescript -import { billingPlugin, defaultCustomerInfoExtractor } from '@xtr-dev/payload-billing' - -billingPlugin({ - collections: { - customers: 'customers', // Customer collection slug - invoices: 'invoices', // Invoice collection slug - payments: 'payments', // Payment collection slug - refunds: 'refunds', // Refund collection slug - customerRelation: false, // Disable customer relationship - // OR - customerRelation: 'clients', // Use custom collection slug - }, - customerInfoExtractor: defaultCustomerInfoExtractor, // For built-in customer collection -}) -``` - -### Custom Customer Info Extractor -```typescript -billingPlugin({ - customerInfoExtractor: (customer) => ({ - name: customer.fullName, - email: customer.contactEmail, - phone: customer.phoneNumber, - company: customer.companyName, - taxId: customer.vatNumber, - billingAddress: { - line1: customer.billing.street, - line2: customer.billing.apartment, - city: customer.billing.city, - state: customer.billing.state, - postalCode: customer.billing.zip, - country: customer.billing.countryCode, - } - }) -}) -``` - -## Development Guidelines - -### TypeScript Guidelines -- Use strict TypeScript configuration -- All customer info extractors must implement `CustomerInfoExtractor` interface -- Ensure consistent camelCase naming for all address fields - -### PayloadCMS Integration -- Follow PayloadCMS plugin patterns and conventions -- Use proper collection configurations with access control -- Utilize PayloadCMS hooks for data syncing and validation - -### Field Validation Rules -- When using `customerInfoExtractor`: customer relationship is required, customer info auto-populated -- When not using extractor: either customer relationship OR customer info must be provided -- When no customer collection: customer info is always required - -## Collections API - -### Invoice Collection Features -- Automatic invoice number generation (INV-{timestamp}) -- Currency validation (3-letter ISO codes) -- Automatic due date setting (30 days from creation) -- Line item total calculations -- Customer info syncing via hooks - -### Customer Data Syncing -The `beforeChange` hook automatically: -1. Detects when customer relationship changes -2. Fetches customer data from the related collection -3. Extracts customer info using the provided callback -4. Updates invoice with extracted data -5. Maintains data consistency across updates - -## Error Handling - -### Validation Errors -- Customer relationship required when using extractor -- Customer info required when not using relationship -- Proper error messages for missing required fields - -### Data Extraction Errors -- Failed customer fetches are logged and throw user-friendly errors -- Invalid customer data is handled gracefully - -## Performance Considerations -- Customer data is only fetched when relationship changes -- Read-only fields prevent unnecessary manual edits -- Efficient hook execution with proper change detection - -## Documentation Requirements -- Document all public APIs with examples -- Provide clear customer info extractor examples -- Include configuration guides for different use cases -- Maintain up-to-date TypeScript documentation \ No newline at end of file diff --git a/dev/DEMO_GUIDE.md b/dev/DEMO_GUIDE.md new file mode 100644 index 0000000..f644161 --- /dev/null +++ b/dev/DEMO_GUIDE.md @@ -0,0 +1,223 @@ +# Demo Project Quick Start Guide + +This guide will help you quickly get started with the billing plugin demo. + +## 🚀 Quick Start + +1. **Install dependencies** (if not already done): + ```bash + pnpm install + ``` + +2. **Start the development server**: + ```bash + pnpm dev + ``` + +3. **Access the demo**: + - Open [http://localhost:3000](http://localhost:3000) + - Login with `dev@payloadcms.com` / `test` if prompted + +## 🎯 What's Included + +### Custom Test Payment UI +A beautiful, modern payment interface built with React and Tailwind CSS that demonstrates: +- Payment method selection (iDEAL, Credit Card, PayPal, Apple Pay, Bank Transfer) +- Test scenario selection (success, failure, cancellation, etc.) +- Real-time payment status updates +- Test mode indicators and warnings +- Responsive design + +**Location**: `/dev/app/test-payment/[id]/page.tsx` + +### Interactive Demo Page +A landing page that showcases the plugin features and allows you to: +- Create test payments with one click +- Navigate to custom payment UI +- Access admin collections +- Learn about the plugin features + +**Location**: `/dev/app/page.tsx` + +### Customer Management +Full customer collection with: +- Name, email, phone, company +- Tax ID support +- Complete address fields +- Auto-sync with invoices via `customerInfoExtractor` + +**Location**: Configured in `/dev/payload.config.ts` + +### Sample Data +Comprehensive seed data including: +- 2 sample customers +- 2 invoices (1 paid, 1 open) +- 4 payments (various statuses) +- 1 refund + +**Location**: `/dev/seed.ts` + +### Custom API Routes +Demo API endpoint for creating payments: +- `POST /api/demo/create-payment` + +**Location**: `/dev/app/api/demo/create-payment/route.ts` + +## 🧪 Testing the Flow + +### Complete Payment Flow Test + +1. **Go to the demo page**: [http://localhost:3000](http://localhost:3000) + +2. **Click "Create Demo Payment"** - This creates a test payment + +3. **Click "Go to Payment Page"** - Opens the custom payment UI + +4. **Select a payment method** - Choose any method (e.g., Credit Card) + +5. **Select a test scenario** - Try different scenarios: + - **Instant Success**: See immediate payment success + - **Delayed Success**: See processing indicator, then success + - **Declined Payment**: See failure handling + - **Cancelled Payment**: See cancellation flow + +6. **Click "Process Test Payment"** - Watch the payment process + +7. **View in admin** - After success, you'll be redirected to the payments list + +### Testing with Different Scenarios + +Each scenario simulates a different payment outcome: + +| Scenario | Delay | Outcome | Use Case | +|----------|-------|---------|----------| +| Instant Success | 0ms | Success | Testing happy path | +| Delayed Success | 3s | Success | Testing async processing | +| Cancelled Payment | 1s | Cancelled | Testing user cancellation | +| Declined Payment | 2s | Failed | Testing payment failures | +| Expired Payment | 5s | Cancelled | Testing timeout handling | +| Pending Payment | 1.5s | Pending | Testing long-running payments | + +## 📊 Viewing Data + +### Admin Collections + +After running the demo, explore the seeded data: + +1. **Payments** ([http://localhost:3000/admin/collections/payments](http://localhost:3000/admin/collections/payments)) + - View all payment transactions + - See payment statuses and provider data + - Check linked invoices + +2. **Invoices** ([http://localhost:3000/admin/collections/invoices](http://localhost:3000/admin/collections/invoices)) + - View generated invoices + - See line items and totals + - Check customer relationships + +3. **Refunds** ([http://localhost:3000/admin/collections/refunds](http://localhost:3000/admin/collections/refunds)) + - View processed refunds + - See refund amounts and reasons + +4. **Customers** ([http://localhost:3000/admin/collections/customers](http://localhost:3000/admin/collections/customers)) + - View customer information + - Edit customer details (invoices will auto-update!) + +## 🔧 Configuration Highlights + +### Plugin Configuration +```typescript +billingPlugin({ + providers: [ + testProvider({ + enabled: true, + customUiRoute: '/test-payment', // Custom UI route + testModeIndicators: { + showWarningBanners: true, + showTestBadges: true, + consoleWarnings: true + } + }) + ], + collections: { + payments: 'payments', + invoices: 'invoices', + refunds: 'refunds', + }, + customerRelationSlug: 'customers', + customerInfoExtractor: (customer) => ({ + // Auto-extract customer info for invoices + name: customer.name, + email: customer.email, + // ... more fields + }), +}) +``` + +## 🎨 Customization Ideas + +### 1. Modify the Payment UI +Edit `/dev/app/test-payment/[id]/page.tsx` to: +- Change colors and styling +- Add your brand logo +- Modify the layout +- Add additional fields + +### 2. Add More Test Scenarios +Edit `testProvider` config to add custom scenarios: +```typescript +testProvider({ + scenarios: [ + { + id: 'custom-scenario', + name: 'Custom Scenario', + description: 'Your custom test scenario', + outcome: 'paid', + delay: 2000 + } + ] +}) +``` + +### 3. Create Invoice Templates +Add invoice generation endpoints that use specific templates + +### 4. Add Webhooks +Create webhook handlers to process real payment events + +## 💡 Tips + +- **Reset Data**: Delete `dev/payload.sqlite` and restart to re-seed +- **Check Console**: Test provider logs all events to the console +- **Test Mode Warnings**: Notice the warning banners and badges in test mode +- **Auto-sync**: Edit a customer's info and see invoices update automatically + +## 🐛 Troubleshooting + +### Payment not processing? +- Check browser console for errors +- Check server console for logs +- Verify the test provider is enabled in config + +### Custom UI not loading? +- Check that `customUiRoute` matches your page route +- Verify the payment ID is valid (starts with `test_pay_`) + +### Types not matching? +Run `pnpm dev:generate-types` to regenerate Payload types + +## 📚 Next Steps + +1. **Explore the Admin** - Login and browse the collections +2. **Create Custom Invoices** - Try creating invoices with line items +3. **Process Refunds** - Create refunds for successful payments +4. **Add Real Providers** - Configure Stripe or Mollie (see README.md) +5. **Build Your Integration** - Use this as a template for your app + +## 🎓 Learning Resources + +- Review `/dev/seed.ts` for data structure examples +- Check `/dev/payload.config.ts` for plugin configuration +- See `/dev/app/test-payment/[id]/page.tsx` for UI integration +- Read the main [README.md](../README.md) for API documentation + +Happy testing! 🚀 diff --git a/dev/README.md b/dev/README.md new file mode 100644 index 0000000..4667eee --- /dev/null +++ b/dev/README.md @@ -0,0 +1,350 @@ +# Billing Plugin Demo Application + +This is a demo application showcasing the `@xtr-dev/payload-billing` plugin for PayloadCMS 3.x. + +## Features + +- 🧪 **Test Payment Provider** with customizable scenarios +- 💳 **Payment Management** with full CRUD operations +- 🧾 **Invoice Generation** with line items and tax calculation +- 👥 **Customer Management** with relationship support +- 🔄 **Refund Processing** and tracking +- 🎨 **Custom Payment UI** with modern design +- 📊 **Sample Data** for quick testing + +## Getting Started + +### Installation + +```bash +# Install dependencies +pnpm install +``` + +### Running the Demo + +```bash +# Start the development server +pnpm dev + +# The application will be available at http://localhost:3000 +``` + +### Default Credentials + +- **Email**: `dev@payloadcms.com` +- **Password**: `test` + +## Demo Routes + +### Interactive Demo Page +Visit [http://localhost:3000](http://localhost:3000) to access the interactive demo page where you can: +- Create test payments +- View the custom payment UI +- Test different payment scenarios +- Navigate to admin collections + +### Custom Payment UI +The custom test payment UI is available at: +``` +http://localhost:3000/test-payment/{payment-id} +``` + +This page demonstrates: +- Modern, responsive payment interface +- Payment method selection +- Test scenario selection (success, failure, cancellation, etc.) +- Real-time payment status updates +- Test mode indicators and warnings + +### Admin Routes + +- **Payments**: [http://localhost:3000/admin/collections/payments](http://localhost:3000/admin/collections/payments) +- **Invoices**: [http://localhost:3000/admin/collections/invoices](http://localhost:3000/admin/collections/invoices) +- **Refunds**: [http://localhost:3000/admin/collections/refunds](http://localhost:3000/admin/collections/refunds) +- **Customers**: [http://localhost:3000/admin/collections/customers](http://localhost:3000/admin/collections/customers) + +## Sample Data + +The application includes seed data with: + +- **2 Customers** + - John Doe (Acme Corporation) + - Jane Smith (Tech Innovations Inc.) + +- **2 Invoices** + - Paid invoice with web development services + - Open invoice with subscription and additional users + +- **4 Payments** + - Successful payment linked to invoice + - Pending payment linked to invoice + - Standalone successful payment + - Failed payment example + +- **1 Refund** + - Partial refund on a successful payment + +To reset the sample data: +```bash +# Delete the database file +rm dev/payload.sqlite + +# Restart the server (will re-seed automatically) +pnpm dev +``` + +## Configuration + +The plugin is configured in `dev/payload.config.ts` with: + +### Test Provider Setup +```typescript +testProvider({ + enabled: true, + testModeIndicators: { + showWarningBanners: true, + showTestBadges: true, + consoleWarnings: true + }, + customUiRoute: '/test-payment', +}) +``` + +### Customer Relationship +```typescript +customerRelationSlug: 'customers', +customerInfoExtractor: (customer) => ({ + name: customer.name, + email: customer.email, + phone: customer.phone, + company: customer.company, + taxId: customer.taxId, + billingAddress: customer.address ? { + line1: customer.address.line1, + line2: customer.address.line2, + city: customer.address.city, + state: customer.address.state, + postalCode: customer.address.postalCode, + country: customer.address.country, + } : undefined, +}) +``` + +## Test Payment Scenarios + +The test provider includes the following scenarios: + +1. **Instant Success** - Payment succeeds immediately +2. **Delayed Success** - Payment succeeds after a delay (3s) +3. **Cancelled Payment** - User cancels the payment (1s) +4. **Declined Payment** - Payment is declined by the provider (2s) +5. **Expired Payment** - Payment expires before completion (5s) +6. **Pending Payment** - Payment remains in pending state (1.5s) + +## Payment Methods + +The test provider supports these payment methods: + +- 🏦 iDEAL +- 💳 Credit Card +- 🅿️ PayPal +- 🍎 Apple Pay +- 🏛️ Bank Transfer + +## API Examples + +### Creating a Payment (Local API) + +```typescript +import { getPayload } from 'payload' +import configPromise from '@payload-config' + +const payload = await getPayload({ config: configPromise }) + +const payment = await payload.create({ + collection: 'payments', + data: { + provider: 'test', + amount: 2500, // $25.00 in cents + currency: 'USD', + description: 'Demo payment', + status: 'pending', + } +}) + +// The payment will have a providerId that can be used in the custom UI +console.log(`Payment URL: /test-payment/${payment.providerId}`) +``` + +### Creating an Invoice with Customer + +```typescript +const invoice = await payload.create({ + collection: 'invoices', + data: { + customer: 'customer-id-here', + currency: 'USD', + items: [ + { + description: 'Service', + quantity: 1, + unitAmount: 5000 // $50.00 + } + ], + taxAmount: 500, // $5.00 + status: 'open' + } +}) +``` + +### REST API Example + +```bash +# Create a payment +curl -X POST http://localhost:3000/api/payments \ + -H "Content-Type: application/json" \ + -H "Authorization: Bearer YOUR_TOKEN" \ + -d '{ + "provider": "test", + "amount": 2500, + "currency": "USD", + "description": "Demo payment", + "status": "pending" + }' +``` + +## Custom Routes + +The demo includes custom API routes: + +### Create Payment +``` +POST /api/demo/create-payment +``` + +Request body: +```json +{ + "amount": 2500, + "currency": "USD", + "description": "Demo payment" +} +``` + +Response: +```json +{ + "success": true, + "payment": { + "id": "test_pay_1234567890_abc123", + "paymentId": "67890", + "amount": 2500, + "currency": "USD", + "description": "Demo payment" + } +} +``` + +## Development + +### File Structure + +``` +dev/ +├── app/ +│ ├── page.tsx # Interactive demo page (root) +│ ├── test-payment/ +│ │ └── [id]/ +│ │ └── page.tsx # Custom payment UI +│ ├── api/ +│ │ └── demo/ +│ │ └── create-payment/ +│ │ └── route.ts # Payment creation endpoint +│ └── (payload)/ # PayloadCMS admin routes +├── helpers/ +│ └── credentials.ts # Default user credentials +├── payload.config.ts # PayloadCMS configuration +├── seed.ts # Sample data seeding +└── README.md # This file +``` + +### Modifying the Demo + +To customize the demo: + +1. **Add more test scenarios**: Edit the `testProvider` config in `payload.config.ts` +2. **Customize the payment UI**: Edit `app/test-payment/[id]/page.tsx` +3. **Add more sample data**: Edit `seed.ts` +4. **Add custom collections**: Add to `collections` array in `payload.config.ts` + +### Testing Different Providers + +To test with real payment providers: + +```typescript +// Install the provider +pnpm add stripe +// or +pnpm add @mollie/api-client + +// Update payload.config.ts +import { stripeProvider, mollieProvider } from '../src/providers' + +billingPlugin({ + providers: [ + stripeProvider({ + secretKey: process.env.STRIPE_SECRET_KEY!, + webhookSecret: process.env.STRIPE_WEBHOOK_SECRET, + }), + mollieProvider({ + apiKey: process.env.MOLLIE_API_KEY!, + webhookUrl: process.env.MOLLIE_WEBHOOK_URL, + }), + // Keep test provider for development + testProvider({ enabled: true }), + ], + // ... rest of config +}) +``` + +## Troubleshooting + +### Database Issues + +If you encounter database errors: +```bash +# Delete the database +rm dev/payload.sqlite + +# Regenerate types +pnpm dev:generate-types + +# Restart the server +pnpm dev +``` + +### Port Already in Use + +If port 3000 is already in use: +```bash +# Use a different port +PORT=3001 pnpm dev +``` + +### TypeScript Errors + +Regenerate Payload types: +```bash +pnpm dev:generate-types +``` + +## Resources + +- [Plugin Documentation](../README.md) +- [PayloadCMS Documentation](https://payloadcms.com/docs) +- [GitHub Repository](https://github.com/xtr-dev/payload-billing) + +## License + +MIT diff --git a/dev/app/api/demo/create-payment/route.ts b/dev/app/api/demo/create-payment/route.ts new file mode 100644 index 0000000..89832fb --- /dev/null +++ b/dev/app/api/demo/create-payment/route.ts @@ -0,0 +1,56 @@ +import configPromise from '@payload-config' +import { getPayload } from 'payload' + +export async function POST(request: Request) { + try { + const payload = await getPayload({ + config: configPromise, + }) + + const body = await request.json() + const { amount, currency, description } = body + + if (!amount || !currency) { + return Response.json( + { success: false, error: 'Amount and currency are required' }, + { status: 400 } + ) + } + + // Create a payment using the test provider + const payment = await payload.create({ + collection: 'payments', + data: { + provider: 'test', + amount, + currency, + description: description || 'Demo payment', + status: 'pending', + metadata: { + source: 'demo-ui', + createdAt: new Date().toISOString(), + }, + }, + }) + + return Response.json({ + success: true, + payment: { + id: payment.providerId, // Use the test provider ID for the UI + paymentId: payment.id, + amount: payment.amount, + currency: payment.currency, + description: payment.description, + }, + }) + } catch (error) { + console.error('Failed to create payment:', error) + return Response.json( + { + success: false, + error: error instanceof Error ? error.message : 'Failed to create payment', + }, + { status: 500 } + ) + } +} diff --git a/dev/app/globals.css b/dev/app/globals.css new file mode 100644 index 0000000..f1d8c73 --- /dev/null +++ b/dev/app/globals.css @@ -0,0 +1 @@ +@import "tailwindcss"; diff --git a/dev/app/layout.tsx b/dev/app/layout.tsx new file mode 100644 index 0000000..ca2516a --- /dev/null +++ b/dev/app/layout.tsx @@ -0,0 +1,19 @@ +import type { Metadata } from 'next' +import './globals.css' + +export const metadata: Metadata = { + title: 'Billing Plugin Demo - PayloadCMS', + description: 'Demo application for @xtr-dev/payload-billing plugin', +} + +export default function RootLayout({ + children, +}: { + children: React.ReactNode +}) { + return ( + + {children} + + ) +} diff --git a/dev/app/page.tsx b/dev/app/page.tsx new file mode 100644 index 0000000..1d208ff --- /dev/null +++ b/dev/app/page.tsx @@ -0,0 +1,183 @@ +'use client' + +import Link from 'next/link' +import { useState } from 'react' + +export default function HomePage() { + const [paymentId, setPaymentId] = useState('') + const [loading, setLoading] = useState(false) + const [error, setError] = useState('') + + const createDemoPayment = async () => { + setLoading(true) + setError('') + + try { + const response = await fetch('/api/demo/create-payment', { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ + amount: 2500, + currency: 'USD', + description: 'Demo payment from custom UI', + }), + }) + + const data = await response.json() + + if (data.success) { + setPaymentId(data.payment.id) + } else { + setError(data.error || 'Failed to create payment') + } + } catch (err) { + setError(err instanceof Error ? err.message : 'An error occurred') + } finally { + setLoading(false) + } + } + + return ( +
+
+
+
+

Billing Plugin Demo

+

+ Test the @xtr-dev/payload-billing plugin with the test provider +

+
+ +
+
+

+ 🎮 Interactive Demo +

+

+ This demo shows how to integrate the billing plugin into your application. Click + the button below to create a test payment and see the custom payment UI in action. +

+ +
+

+ Create Test Payment +

+ + {!paymentId ? ( +
+ + + {error && ( +
+ {error} +
+ )} +
+ ) : ( +
+
+
+ + Payment Created Successfully! +
+

+ Payment ID: {paymentId} +

+
+ +
+ + Go to Payment Page → + + +
+
+ )} +
+
+ +
+

+ 📚 Quick Links +

+
+ +
💳 Payments
+
View all payment transactions
+ + + +
🧾 Invoices
+
Manage invoices and billing
+ + + +
🔄 Refunds
+
Process and track refunds
+ + + +
👥 Customers
+
Manage customer information
+ +
+
+ +
+

+ 💡 About This Demo +

+
+

+ This demo application showcases the @xtr-dev/payload-billing plugin + for PayloadCMS 3.x with the following features: +

+
    +
  • Test payment provider with customizable scenarios
  • +
  • Custom payment UI page with modern design
  • +
  • Customer relationship management with auto-sync
  • +
  • Invoice generation with line items and tax calculation
  • +
  • Refund processing and tracking
  • +
  • Sample data seeding for quick testing
  • +
+

+ The test provider allows you to simulate different payment outcomes including + success, failure, cancellation, and more - perfect for development and testing! +

+
+
+
+
+
+
+ ) +} diff --git a/dev/app/payment-failed/page.tsx b/dev/app/payment-failed/page.tsx new file mode 100644 index 0000000..8c2130e --- /dev/null +++ b/dev/app/payment-failed/page.tsx @@ -0,0 +1,185 @@ +'use client' + +import Link from 'next/link' +import { useSearchParams } from 'next/navigation' +import { Suspense } from 'react' + +function PaymentFailedContent() { + const searchParams = useSearchParams() + const paymentId = searchParams.get('paymentId') + const reason = searchParams.get('reason') || 'unknown' + const amount = searchParams.get('amount') + const currency = searchParams.get('currency') + + const getReasonText = (reason: string) => { + switch (reason) { + case 'failed': + return 'Payment was declined' + case 'cancelled': + return 'Payment was cancelled' + case 'expired': + return 'Payment session expired' + default: + return 'Payment could not be completed' + } + } + + const getReasonDescription = (reason: string) => { + switch (reason) { + case 'failed': + return 'The payment provider declined the transaction. This is a simulated failure for testing purposes.' + case 'cancelled': + return 'The payment was cancelled before completion. You can try again with a different test scenario.' + case 'expired': + return 'The payment session timed out. Please create a new payment to try again.' + default: + return 'An unexpected error occurred during payment processing.' + } + } + + return ( +
+
+
+
+
+ + + +
+
+

Payment {reason.charAt(0).toUpperCase() + reason.slice(1)}

+

+ {getReasonText(reason)} +

+
+ +
+
+

+ What Happened? +

+

+ {getReasonDescription(reason)} +

+ +
+ {paymentId && ( +
+ Payment ID: + + {paymentId} + +
+ )} + {amount && currency && ( +
+ Amount: + + {currency.toUpperCase()} {(parseInt(amount) / 100).toFixed(2)} + +
+ )} +
+ Status: + + {reason} + +
+
+
+ +
+

Try Again

+ +
+ +
+
+ 🔄 Try Another Payment +
+
+ Create a new test payment with different scenario +
+
+ + + + + + +
+
+ 💳 View Payment History +
+
+ Check all payments in admin +
+
+ + + + +
+
+ +
+

+ 💡 Testing Tip: This failure was simulated using the test provider. + Try selecting a different test scenario like "Instant Success" or "Delayed Success" + to see a successful payment flow. +

+
+
+
+
+ ) +} + +export default function PaymentFailedPage() { + return ( + +
Loading...
+ + }> + +
+ ) +} diff --git a/dev/app/payment-success/page.tsx b/dev/app/payment-success/page.tsx new file mode 100644 index 0000000..6d3da75 --- /dev/null +++ b/dev/app/payment-success/page.tsx @@ -0,0 +1,184 @@ +'use client' + +import Link from 'next/link' +import { useSearchParams } from 'next/navigation' +import { Suspense } from 'react' + +function PaymentSuccessContent() { + const searchParams = useSearchParams() + const paymentId = searchParams.get('paymentId') + const amount = searchParams.get('amount') + const currency = searchParams.get('currency') + + return ( +
+
+
+
+
+ + + +
+
+

Payment Successful!

+

+ Your test payment has been processed successfully +

+
+ +
+
+

+ Payment Details +

+
+ {paymentId && ( +
+ Payment ID: + + {paymentId} + +
+ )} + {amount && currency && ( +
+ Amount: + + {currency.toUpperCase()} {(parseInt(amount) / 100).toFixed(2)} + +
+ )} +
+ Status: + + Succeeded + +
+
+ Provider: + Test Provider +
+
+
+ +
+

What's Next?

+ +
+ +
+
+ 🏠 Back to Demo +
+
+ Try another test payment +
+
+ + + + + + +
+
+ 💳 View All Payments +
+
+ Check payment history in admin +
+
+ + + + + + +
+
+ 🧾 View Invoices +
+
+ Check invoices in admin +
+
+ + + + +
+
+ +
+

+ 💡 Demo Tip: This was a simulated payment using the test provider. + In production, you would integrate with real providers like Stripe or Mollie. +

+
+
+
+
+ ) +} + +export default function PaymentSuccessPage() { + return ( + +
Loading...
+ + }> + +
+ ) +} diff --git a/dev/app/test-payment/[id]/page.tsx b/dev/app/test-payment/[id]/page.tsx new file mode 100644 index 0000000..e3ebf4f --- /dev/null +++ b/dev/app/test-payment/[id]/page.tsx @@ -0,0 +1,291 @@ +'use client' + +import { useParams, useRouter } from 'next/navigation' +import { useEffect, useState } from 'react' + +interface PaymentMethod { + id: string + name: string + icon: string +} + +interface Scenario { + id: string + name: string + description: string + outcome: string + delay?: number +} + +interface TestProviderConfig { + enabled: boolean + scenarios: Scenario[] + methods: PaymentMethod[] + testModeIndicators: { + showWarningBanners: boolean + showTestBadges: boolean + consoleWarnings: boolean + } + defaultDelay: number + customUiRoute: string +} + +interface PaymentSession { + id: string + amount: number + currency: string + description?: string +} + +export default function TestPaymentPage() { + const params = useParams() + const router = useRouter() + const paymentId = params.id as string + + const [config, setConfig] = useState(null) + const [session, setSession] = useState(null) + const [selectedMethod, setSelectedMethod] = useState(null) + const [selectedScenario, setSelectedScenario] = useState(null) + const [processing, setProcessing] = useState(false) + const [status, setStatus] = useState<{ + type: 'idle' | 'processing' | 'success' | 'error' + message: string + }>({ type: 'idle', message: '' }) + + useEffect(() => { + // Load test provider config + fetch('/api/payload-billing/test/config') + .then((res) => res.json()) + .then((data) => { + setConfig(data) + if (data.testModeIndicators?.consoleWarnings) { + console.warn('[Test Provider] 🧪 TEST MODE: This is a simulated payment interface') + } + }) + .catch((err) => { + console.error('Failed to load test provider config:', err) + }) + + // Load payment session (mock data for demo) + setSession({ + id: paymentId, + amount: 2500, + currency: 'USD', + description: 'Demo payment for testing the billing plugin', + }) + }, [paymentId]) + + const handleProcessPayment = async () => { + if (!selectedMethod || !selectedScenario) return + + setProcessing(true) + setStatus({ type: 'processing', message: 'Initiating payment...' }) + + try { + const response = await fetch('/api/payload-billing/test/process', { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ + paymentId, + scenarioId: selectedScenario, + method: selectedMethod, + }), + }) + + const result = await response.json() + + if (result.success) { + const scenario = config?.scenarios.find((s) => s.id === selectedScenario) + setStatus({ + type: 'processing', + message: `Processing payment with ${scenario?.name}...`, + }) + + // Poll for status updates + setTimeout(() => pollStatus(), result.delay || 1000) + } else { + throw new Error(result.error || 'Failed to process payment') + } + } catch (error) { + setStatus({ + type: 'error', + message: error instanceof Error ? error.message : 'An error occurred', + }) + setProcessing(false) + } + } + + const pollStatus = async () => { + try { + const response = await fetch(`/api/payload-billing/test/status/${paymentId}`) + const result = await response.json() + + if (result.status === 'paid') { + setStatus({ type: 'success', message: '✅ Payment successful!' }) + setTimeout(() => { + const params = new URLSearchParams({ + paymentId: paymentId, + amount: session.amount.toString(), + currency: session.currency, + }) + router.push(`/payment-success?${params.toString()}`) + }, 2000) + } else if (['failed', 'cancelled', 'expired'].includes(result.status)) { + setStatus({ type: 'error', message: `❌ Payment ${result.status}` }) + setTimeout(() => { + const params = new URLSearchParams({ + paymentId: paymentId, + amount: session.amount.toString(), + currency: session.currency, + reason: result.status, + }) + router.push(`/payment-failed?${params.toString()}`) + }, 2000) + } else if (result.status === 'pending') { + setStatus({ type: 'processing', message: 'Payment is still pending...' }) + setTimeout(() => pollStatus(), 2000) + } + } catch (error) { + console.error('[Test Provider] Failed to poll status:', error) + setStatus({ type: 'error', message: 'Failed to check payment status' }) + setProcessing(false) + } + } + + if (!config || !session) { + return ( +
+
+
Loading...
+
+
+ ) + } + + return ( +
+
+
+ {config.testModeIndicators.showWarningBanners && ( +
+ 🧪 TEST MODE - This is a simulated payment for development purposes +
+ )} + +
+
+

Test Payment Checkout

+ {config.testModeIndicators.showTestBadges && ( + + Test + + )} +
+
+ {session.currency.toUpperCase()} {(session.amount / 100).toFixed(2)} +
+ {session.description && ( +

{session.description}

+ )} +
+ +
+ {/* Payment Methods */} +
+

+ 💳 Select Payment Method +

+
+ {config.methods.map((method) => ( + + ))} +
+
+ + {/* Test Scenarios */} +
+

+ 🎭 Select Test Scenario +

+
+ {config.scenarios.map((scenario) => ( + + ))} +
+
+ + {/* Process Button */} + + + {/* Status Message */} + {status.type !== 'idle' && ( +
+ {status.type === 'processing' && ( + + )} + {status.message} +
+ )} +
+
+ + {/* Info Card */} +
+

💡 Demo Information

+

+ This is a custom test payment UI for the @xtr-dev/payload-billing plugin. Select a + payment method and scenario to simulate different payment outcomes. The payment will be + processed according to the selected scenario. +

+
+
+
+ ) +} diff --git a/dev/payload-types.ts b/dev/payload-types.ts index 4fb47ca..c791428 100644 --- a/dev/payload-types.ts +++ b/dev/payload-types.ts @@ -69,6 +69,7 @@ export interface Config { collections: { posts: Post; media: Media; + customers: Customer; payments: Payment; invoices: Invoice; refunds: Refund; @@ -81,6 +82,7 @@ export interface Config { collectionsSelect: { posts: PostsSelect | PostsSelect; media: MediaSelect | MediaSelect; + customers: CustomersSelect | CustomersSelect; payments: PaymentsSelect | PaymentsSelect; invoices: InvoicesSelect | InvoicesSelect; refunds: RefundsSelect | RefundsSelect; @@ -148,6 +150,28 @@ export interface Media { focalX?: number | null; focalY?: number | null; } +/** + * This interface was referenced by `Config`'s JSON-Schema + * via the `definition` "customers". + */ +export interface Customer { + id: number; + name: string; + email: string; + phone?: string | null; + company?: string | null; + taxId?: string | null; + address?: { + line1?: string | null; + line2?: string | null; + city?: string | null; + state?: string | null; + postalCode?: string | null; + country?: string | null; + }; + updatedAt: string; + createdAt: string; +} /** * This interface was referenced by `Config`'s JSON-Schema * via the `definition` "payments". @@ -213,17 +237,21 @@ export interface Invoice { */ number: string; /** - * Customer billing information + * Link to customer record (optional) */ - customerInfo: { + customer?: (number | null) | Customer; + /** + * Customer billing information (auto-populated from customer relationship) + */ + customerInfo?: { /** * Customer name */ - name: string; + name?: string | null; /** * Customer email address */ - email: string; + email?: string | null; /** * Customer phone number */ @@ -238,18 +266,18 @@ export interface Invoice { taxId?: string | null; }; /** - * Billing address + * Billing address (auto-populated from customer relationship) */ - billingAddress: { + billingAddress?: { /** * Address line 1 */ - line1: string; + line1?: string | null; /** * Address line 2 */ line2?: string | null; - city: string; + city?: string | null; /** * State or province */ @@ -257,11 +285,11 @@ export interface Invoice { /** * Postal or ZIP code */ - postalCode: string; + postalCode?: string | null; /** * Country code (e.g., US, GB) */ - country: string; + country?: string | null; }; status: 'draft' | 'open' | 'paid' | 'void' | 'uncollectible'; /** @@ -402,6 +430,10 @@ export interface PayloadLockedDocument { relationTo: 'media'; value: number | Media; } | null) + | ({ + relationTo: 'customers'; + value: number | Customer; + } | null) | ({ relationTo: 'payments'; value: number | Payment; @@ -485,6 +517,29 @@ export interface MediaSelect { focalX?: T; focalY?: T; } +/** + * This interface was referenced by `Config`'s JSON-Schema + * via the `definition` "customers_select". + */ +export interface CustomersSelect { + name?: T; + email?: T; + phone?: T; + company?: T; + taxId?: T; + address?: + | T + | { + line1?: T; + line2?: T; + city?: T; + state?: T; + postalCode?: T; + country?: T; + }; + updatedAt?: T; + createdAt?: T; +} /** * This interface was referenced by `Config`'s JSON-Schema * via the `definition` "payments_select". @@ -510,6 +565,7 @@ export interface PaymentsSelect { */ export interface InvoicesSelect { number?: T; + customer?: T; customerInfo?: | T | { diff --git a/dev/payload.config.ts b/dev/payload.config.ts index e746f8a..54d60d1 100644 --- a/dev/payload.config.ts +++ b/dev/payload.config.ts @@ -36,6 +36,71 @@ const buildConfigWithSQLite = () => { staticDir: path.resolve(dirname, 'media'), }, }, + { + slug: 'customers', + admin: { + useAsTitle: 'name', + }, + fields: [ + { + name: 'name', + type: 'text', + required: true, + }, + { + name: 'email', + type: 'email', + required: true, + }, + { + name: 'phone', + type: 'text', + }, + { + name: 'company', + type: 'text', + }, + { + name: 'taxId', + type: 'text', + label: 'Tax ID', + }, + { + name: 'address', + type: 'group', + fields: [ + { + name: 'line1', + type: 'text', + label: 'Address Line 1', + }, + { + name: 'line2', + type: 'text', + label: 'Address Line 2', + }, + { + name: 'city', + type: 'text', + }, + { + name: 'state', + type: 'text', + label: 'State/Province', + }, + { + name: 'postalCode', + type: 'text', + label: 'Postal Code', + }, + { + name: 'country', + type: 'text', + }, + ], + }, + ], + }, ], db: sqliteAdapter({ client: { @@ -56,7 +121,8 @@ const buildConfigWithSQLite = () => { showWarningBanners: true, showTestBadges: true, consoleWarnings: true - } + }, + customUiRoute: '/test-payment', }) ], collections: { @@ -64,6 +130,22 @@ const buildConfigWithSQLite = () => { invoices: 'invoices', refunds: 'refunds', }, + customerRelationSlug: 'customers', + customerInfoExtractor: (customer) => ({ + name: customer.name, + email: customer.email, + phone: customer.phone, + company: customer.company, + taxId: customer.taxId, + billingAddress: customer.address ? { + line1: customer.address.line1, + line2: customer.address.line2, + city: customer.address.city, + state: customer.address.state, + postalCode: customer.address.postalCode, + country: customer.address.country, + } : undefined, + }), }), ], secret: process.env.PAYLOAD_SECRET || 'test-secret_key', diff --git a/dev/postcss.config.mjs b/dev/postcss.config.mjs new file mode 100644 index 0000000..a869506 --- /dev/null +++ b/dev/postcss.config.mjs @@ -0,0 +1,8 @@ +/** @type {import('postcss-load-config').Config} */ +const config = { + plugins: { + '@tailwindcss/postcss': {}, + }, +} + +export default config diff --git a/dev/seed.ts b/dev/seed.ts index 935948a..7c39db6 100644 --- a/dev/seed.ts +++ b/dev/seed.ts @@ -21,9 +21,189 @@ export const seed = async (payload: Payload) => { } // Seed billing sample data - // await seedBillingData(payload) + await seedBillingData(payload) } -// async function seedBillingData(payload: Payload): Promise { -// payload.logger.info('Seeding billing sample data...') -// } +async function seedBillingData(payload: Payload): Promise { + payload.logger.info('Seeding billing sample data...') + + // Check if we already have data + const existingPayments = await payload.count({ + collection: 'payments', + }) + + if (existingPayments.totalDocs > 0) { + payload.logger.info('Billing data already exists, skipping seed...') + return + } + + // Check if customers collection exists + const hasCustomers = payload.collections['customers'] !== undefined + + let customer1Id: string | number | undefined + let customer2Id: string | number | undefined + + if (hasCustomers) { + // Seed customers + payload.logger.info('Seeding customers...') + const customer1 = await payload.create({ + collection: 'customers', + data: { + name: 'John Doe', + email: 'john.doe@example.com', + phone: '+1 (555) 123-4567', + company: 'Acme Corporation', + taxId: 'US-123456789', + address: { + line1: '123 Main Street', + line2: 'Suite 100', + city: 'New York', + state: 'NY', + postalCode: '10001', + country: 'US', + }, + }, + }) + customer1Id = customer1.id + + const customer2 = await payload.create({ + collection: 'customers', + data: { + name: 'Jane Smith', + email: 'jane.smith@example.com', + phone: '+1 (555) 987-6543', + company: 'Tech Innovations Inc.', + address: { + line1: '456 Tech Avenue', + city: 'San Francisco', + state: 'CA', + postalCode: '94102', + country: 'US', + }, + }, + }) + customer2Id = customer2.id + } + + // Seed invoices + payload.logger.info('Seeding invoices...') + + const invoiceData1 = hasCustomers + ? { + customer: customer1Id, + currency: 'USD', + items: [ + { + description: 'Web Development Services', + quantity: 40, + unitAmount: 12500, // $125/hour + }, + { + description: 'Hosting & Deployment', + quantity: 1, + unitAmount: 5000, // $50 + }, + ], + taxAmount: 52500, // $525 tax (10%) + status: 'paid', + notes: 'Thank you for your business!', + } + : { + customerInfo: { + name: 'John Doe', + email: 'john.doe@example.com', + phone: '+1 (555) 123-4567', + company: 'Acme Corporation', + taxId: 'US-123456789', + }, + billingAddress: { + line1: '123 Main Street', + line2: 'Suite 100', + city: 'New York', + state: 'NY', + postalCode: '10001', + country: 'US', + }, + currency: 'USD', + items: [ + { + description: 'Web Development Services', + quantity: 40, + unitAmount: 12500, + }, + { + description: 'Hosting & Deployment', + quantity: 1, + unitAmount: 5000, + }, + ], + taxAmount: 52500, + status: 'paid', + notes: 'Thank you for your business!', + } + + const invoice1 = await payload.create({ + collection: 'invoices', + data: invoiceData1 as any, + }) + + const invoiceData2 = hasCustomers + ? { + customer: customer2Id, + currency: 'USD', + items: [ + { + description: 'Monthly Subscription - Pro Plan', + quantity: 1, + unitAmount: 9900, // $99 + }, + { + description: 'Additional Users (x5)', + quantity: 5, + unitAmount: 2000, // $20 each + }, + ], + taxAmount: 1990, + status: 'open', + } + : { + customerInfo: { + name: 'Jane Smith', + email: 'jane.smith@example.com', + phone: '+1 (555) 987-6543', + company: 'Tech Innovations Inc.', + }, + billingAddress: { + line1: '456 Tech Avenue', + city: 'San Francisco', + state: 'CA', + postalCode: '94102', + country: 'US', + }, + currency: 'USD', + items: [ + { + description: 'Monthly Subscription - Pro Plan', + quantity: 1, + unitAmount: 9900, + }, + { + description: 'Additional Users (x5)', + quantity: 5, + unitAmount: 2000, + }, + ], + taxAmount: 1990, + status: 'open', + } + + const invoice2 = await payload.create({ + collection: 'invoices', + data: invoiceData2 as any, + }) + + // Note: Skip payment seeding during initialization because the billing plugin + // providers aren't fully initialized yet. Payments can be created via the demo UI. + + payload.logger.info('✅ Billing sample data seeded successfully!') +} diff --git a/dev/tailwind.config.ts b/dev/tailwind.config.ts new file mode 100644 index 0000000..e581d09 --- /dev/null +++ b/dev/tailwind.config.ts @@ -0,0 +1,14 @@ +import type { Config } from 'tailwindcss' + +const config: Config = { + content: [ + './app/**/*.{js,ts,jsx,tsx,mdx}', + './components/**/*.{js,ts,jsx,tsx,mdx}', + ], + theme: { + extend: {}, + }, + plugins: [], +} + +export default config diff --git a/package.json b/package.json index ad9879c..554ba7c 100644 --- a/package.json +++ b/package.json @@ -81,9 +81,11 @@ "@playwright/test": "^1.52.0", "@swc-node/register": "1.10.9", "@swc/cli": "0.6.0", + "@tailwindcss/postcss": "^4.1.17", "@types/node": "^22.5.4", "@types/react": "19.1.8", "@types/react-dom": "19.1.6", + "autoprefixer": "^10.4.21", "copyfiles": "2.4.1", "cross-env": "^7.0.3", "eslint": "^9.23.0", @@ -93,6 +95,7 @@ "next": "15.4.4", "open": "^10.1.0", "payload": "3.37.0", + "postcss": "^8.5.6", "prettier": "^3.4.2", "qs-esm": "7.0.2", "react": "19.1.0", @@ -101,6 +104,7 @@ "sharp": "0.34.2", "sort-package-json": "^2.10.0", "stripe": "^18.5.0", + "tailwindcss": "^4.1.17", "typescript": "5.7.3", "vite-tsconfig-paths": "^5.1.4", "vitest": "^3.1.2" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 971afd0..adafb53 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -32,7 +32,7 @@ importers: version: 3.37.0(@types/pg@8.10.2)(@types/react@19.1.8)(payload@3.37.0(graphql@16.11.0)(typescript@5.7.3))(pg@8.11.3)(react@19.1.0) '@payloadcms/eslint-config': specifier: 3.9.0 - version: 3.9.0(@typescript-eslint/eslint-plugin@8.43.0(@typescript-eslint/parser@8.43.0(eslint@9.35.0)(typescript@5.7.3))(eslint@9.35.0)(typescript@5.7.3)) + version: 3.9.0(@typescript-eslint/eslint-plugin@8.43.0(@typescript-eslint/parser@8.43.0(eslint@9.35.0(jiti@2.6.1))(typescript@5.7.3))(eslint@9.35.0(jiti@2.6.1))(typescript@5.7.3))(jiti@2.6.1) '@payloadcms/next': specifier: 3.37.0 version: 3.37.0(@types/react@19.1.8)(graphql@16.11.0)(monaco-editor@0.53.0)(next@15.4.4(@playwright/test@1.55.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(sass@1.77.4))(payload@3.37.0(graphql@16.11.0)(typescript@5.7.3))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@5.7.3) @@ -51,6 +51,9 @@ importers: '@swc/cli': specifier: 0.6.0 version: 0.6.0(@swc/core@1.13.5) + '@tailwindcss/postcss': + specifier: ^4.1.17 + version: 4.1.17 '@types/node': specifier: ^22.5.4 version: 22.18.1 @@ -60,6 +63,9 @@ importers: '@types/react-dom': specifier: 19.1.6 version: 19.1.6(@types/react@19.1.8) + autoprefixer: + specifier: ^10.4.21 + version: 10.4.21(postcss@8.5.6) copyfiles: specifier: 2.4.1 version: 2.4.1 @@ -68,10 +74,10 @@ importers: version: 7.0.3 eslint: specifier: ^9.23.0 - version: 9.35.0 + version: 9.35.0(jiti@2.6.1) eslint-config-next: specifier: 15.4.4 - version: 15.4.4(eslint-plugin-import-x@4.4.2(eslint@9.35.0)(typescript@5.7.3))(eslint@9.35.0)(typescript@5.7.3) + version: 15.4.4(eslint-plugin-import-x@4.4.2(eslint@9.35.0(jiti@2.6.1))(typescript@5.7.3))(eslint@9.35.0(jiti@2.6.1))(typescript@5.7.3) graphql: specifier: ^16.8.1 version: 16.11.0 @@ -87,6 +93,9 @@ importers: payload: specifier: 3.37.0 version: 3.37.0(graphql@16.11.0)(typescript@5.7.3) + postcss: + specifier: ^8.5.6 + version: 8.5.6 prettier: specifier: ^3.4.2 version: 3.6.2 @@ -111,18 +120,25 @@ importers: stripe: specifier: ^18.5.0 version: 18.5.0(@types/node@22.18.1) + tailwindcss: + specifier: ^4.1.17 + version: 4.1.17 typescript: specifier: 5.7.3 version: 5.7.3 vite-tsconfig-paths: specifier: ^5.1.4 - version: 5.1.4(typescript@5.7.3)(vite@7.1.5(@types/node@22.18.1)(sass@1.77.4)(tsx@4.19.2)) + version: 5.1.4(typescript@5.7.3)(vite@7.1.5(@types/node@22.18.1)(jiti@2.6.1)(lightningcss@1.30.2)(sass@1.77.4)(tsx@4.19.2)) vitest: specifier: ^3.1.2 - version: 3.2.4(@types/debug@4.1.12)(@types/node@22.18.1)(sass@1.77.4)(tsx@4.19.2) + version: 3.2.4(@types/debug@4.1.12)(@types/node@22.18.1)(jiti@2.6.1)(lightningcss@1.30.2)(sass@1.77.4)(tsx@4.19.2) packages: + '@alloc/quick-lru@5.2.0': + resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==} + engines: {node: '>=10'} + '@apidevtools/json-schema-ref-parser@11.9.3': resolution: {integrity: sha512-60vepv88RwcJtSHrD6MjIL6Ta3SOYbgfnkHb+ppAVK+o9mXprRtulx7VlRl3lN3bbvysAfCS7WMVfhUYemB0IQ==} engines: {node: '>= 16'} @@ -1284,6 +1300,9 @@ packages: '@jridgewell/gen-mapping@0.3.13': resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} + '@jridgewell/remapping@2.3.5': + resolution: {integrity: sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==} + '@jridgewell/resolve-uri@3.1.2': resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} engines: {node: '>=6.0.0'} @@ -1978,6 +1997,94 @@ packages: resolution: {integrity: sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==} engines: {node: '>=14.16'} + '@tailwindcss/node@4.1.17': + resolution: {integrity: sha512-csIkHIgLb3JisEFQ0vxr2Y57GUNYh447C8xzwj89U/8fdW8LhProdxvnVH6U8M2Y73QKiTIH+LWbK3V2BBZsAg==} + + '@tailwindcss/oxide-android-arm64@4.1.17': + resolution: {integrity: sha512-BMqpkJHgOZ5z78qqiGE6ZIRExyaHyuxjgrJ6eBO5+hfrfGkuya0lYfw8fRHG77gdTjWkNWEEm+qeG2cDMxArLQ==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [android] + + '@tailwindcss/oxide-darwin-arm64@4.1.17': + resolution: {integrity: sha512-EquyumkQweUBNk1zGEU/wfZo2qkp/nQKRZM8bUYO0J+Lums5+wl2CcG1f9BgAjn/u9pJzdYddHWBiFXJTcxmOg==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [darwin] + + '@tailwindcss/oxide-darwin-x64@4.1.17': + resolution: {integrity: sha512-gdhEPLzke2Pog8s12oADwYu0IAw04Y2tlmgVzIN0+046ytcgx8uZmCzEg4VcQh+AHKiS7xaL8kGo/QTiNEGRog==} + engines: {node: '>= 10'} + cpu: [x64] + os: [darwin] + + '@tailwindcss/oxide-freebsd-x64@4.1.17': + resolution: {integrity: sha512-hxGS81KskMxML9DXsaXT1H0DyA+ZBIbyG/sSAjWNe2EDl7TkPOBI42GBV3u38itzGUOmFfCzk1iAjDXds8Oh0g==} + engines: {node: '>= 10'} + cpu: [x64] + os: [freebsd] + + '@tailwindcss/oxide-linux-arm-gnueabihf@4.1.17': + resolution: {integrity: sha512-k7jWk5E3ldAdw0cNglhjSgv501u7yrMf8oeZ0cElhxU6Y2o7f8yqelOp3fhf7evjIS6ujTI3U8pKUXV2I4iXHQ==} + engines: {node: '>= 10'} + cpu: [arm] + os: [linux] + + '@tailwindcss/oxide-linux-arm64-gnu@4.1.17': + resolution: {integrity: sha512-HVDOm/mxK6+TbARwdW17WrgDYEGzmoYayrCgmLEw7FxTPLcp/glBisuyWkFz/jb7ZfiAXAXUACfyItn+nTgsdQ==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + + '@tailwindcss/oxide-linux-arm64-musl@4.1.17': + resolution: {integrity: sha512-HvZLfGr42i5anKtIeQzxdkw/wPqIbpeZqe7vd3V9vI3RQxe3xU1fLjss0TjyhxWcBaipk7NYwSrwTwK1hJARMg==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + + '@tailwindcss/oxide-linux-x64-gnu@4.1.17': + resolution: {integrity: sha512-M3XZuORCGB7VPOEDH+nzpJ21XPvK5PyjlkSFkFziNHGLc5d6g3di2McAAblmaSUNl8IOmzYwLx9NsE7bplNkwQ==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + + '@tailwindcss/oxide-linux-x64-musl@4.1.17': + resolution: {integrity: sha512-k7f+pf9eXLEey4pBlw+8dgfJHY4PZ5qOUFDyNf7SI6lHjQ9Zt7+NcscjpwdCEbYi6FI5c2KDTDWyf2iHcCSyyQ==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + + '@tailwindcss/oxide-wasm32-wasi@4.1.17': + resolution: {integrity: sha512-cEytGqSSoy7zK4JRWiTCx43FsKP/zGr0CsuMawhH67ONlH+T79VteQeJQRO/X7L0juEUA8ZyuYikcRBf0vsxhg==} + engines: {node: '>=14.0.0'} + cpu: [wasm32] + bundledDependencies: + - '@napi-rs/wasm-runtime' + - '@emnapi/core' + - '@emnapi/runtime' + - '@tybys/wasm-util' + - '@emnapi/wasi-threads' + - tslib + + '@tailwindcss/oxide-win32-arm64-msvc@4.1.17': + resolution: {integrity: sha512-JU5AHr7gKbZlOGvMdb4722/0aYbU+tN6lv1kONx0JK2cGsh7g148zVWLM0IKR3NeKLv+L90chBVYcJ8uJWbC9A==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [win32] + + '@tailwindcss/oxide-win32-x64-msvc@4.1.17': + resolution: {integrity: sha512-SKWM4waLuqx0IH+FMDUw6R66Hu4OuTALFgnleKbqhgGU30DY20NORZMZUKgLRjQXNN2TLzKvh48QXTig4h4bGw==} + engines: {node: '>= 10'} + cpu: [x64] + os: [win32] + + '@tailwindcss/oxide@4.1.17': + resolution: {integrity: sha512-F0F7d01fmkQhsTjXezGBLdrl1KresJTcI3DB8EkScCldyKp3Msz4hub4uyYaVnk88BAS1g5DQjjF6F5qczheLA==} + engines: {node: '>= 10'} + + '@tailwindcss/postcss@4.1.17': + resolution: {integrity: sha512-+nKl9N9mN5uJ+M7dBOOCzINw94MPstNR/GtIhz1fpZysxL/4a+No64jCBD6CPN+bIHWFx3KWuu8XJRrj/572Dw==} + '@tokenizer/inflate@0.2.7': resolution: {integrity: sha512-MADQgmZT1eKjp06jpI2yozxaU9uVs4GzzgSL+uEq7bVcJ9V1ZXQkeGNql1fsSI0gMy1vhvNTNbUqrx+pZfJVmg==} engines: {node: '>=18'} @@ -2473,6 +2580,13 @@ packages: resolution: {integrity: sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==} engines: {node: '>=8.0.0'} + autoprefixer@10.4.21: + resolution: {integrity: sha512-O+A6LWV5LDHSJD3LjHYoNi4VLsj/Whi7k6zG12xTYaU4cQ8oxQGckXNX8cRHK5yOZ/ppVHe0ZBXGzSV9jXdVbQ==} + engines: {node: ^10 || ^12 || >=14} + hasBin: true + peerDependencies: + postcss: ^8.1.0 + available-typed-arrays@1.0.7: resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} engines: {node: '>= 0.4'} @@ -2509,6 +2623,10 @@ packages: base64-js@1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + baseline-browser-mapping@2.8.25: + resolution: {integrity: sha512-2NovHVesVF5TXefsGX1yzx1xgr7+m9JQenvz6FQY3qd+YXkKkYiv+vTCc7OriP9mcDZpTC5mAOYN4ocd29+erA==} + hasBin: true + better-path-resolve@1.0.0: resolution: {integrity: sha512-pbnl5XzGBdrFU/wT4jqmJVPn2B6UHPBOhzMQkY/SPUPB6QtUXtmBHBIwCbXJol93mOpGMnQyP/+BB19q04xj7g==} engines: {node: '>=4'} @@ -2541,6 +2659,11 @@ packages: resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} engines: {node: '>=8'} + browserslist@4.27.0: + resolution: {integrity: sha512-AXVQwdhot1eqLihwasPElhX2tAZiBjWdJ9i/Zcj2S6QYIjkx62OKSfnobkriB81C3l4w0rVy3Nt4jaTBltYEpw==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + bson-objectid@2.0.4: resolution: {integrity: sha512-vgnKAUzcDoa+AeyYwXCoHyF2q6u/8H46dxu5JN+4/TZeq/Dlinn0K6GvxsCLb3LHUJl0m/TLiEK31kUwtgocMQ==} @@ -2604,6 +2727,9 @@ packages: caniuse-lite@1.0.30001741: resolution: {integrity: sha512-QGUGitqsc8ARjLdgAfxETDhRbJ0REsP6O3I96TAth/mVjh2cYzN2u+3AzPP3aVSm2FehEItaJw1xd+IGBXWeSw==} + caniuse-lite@1.0.30001754: + resolution: {integrity: sha512-x6OeBXueoAceOmotzx3PO4Zpt4rzpeIFsSr6AAePTZxSkXiYDUmpypEl7e2+8NCd9bD7bXjqyef8CJYPC1jfxg==} + ccount@2.0.1: resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} @@ -2991,6 +3117,9 @@ packages: resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} engines: {node: '>= 0.4'} + electron-to-chromium@1.5.249: + resolution: {integrity: sha512-5vcfL3BBe++qZ5kuFhD/p8WOM1N9m3nwvJPULJx+4xf2usSlZFJ0qoNYO2fOX4hi3ocuDcmDobtA+5SFr4OmBg==} + emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} @@ -3000,6 +3129,10 @@ packages: end-of-stream@1.4.5: resolution: {integrity: sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==} + enhanced-resolve@5.18.3: + resolution: {integrity: sha512-d4lC8xfavMeBjzGr2vECC3fsGXziXZQyJxD868h2M/mBI3PwAuODxAkLkq5HYuvrPYcUtiLzsTo8U3PgX3Ocww==} + engines: {node: '>=10.13.0'} + enquirer@2.4.1: resolution: {integrity: sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==} engines: {node: '>=8.6'} @@ -3493,6 +3626,9 @@ packages: resolution: {integrity: sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==} engines: {node: '>=12.20.0'} + fraction.js@4.3.7: + resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==} + fs-extra@7.0.1: resolution: {integrity: sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==} engines: {node: '>=6 <7 || >=8'} @@ -3913,6 +4049,10 @@ packages: resolution: {integrity: sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g==} engines: {node: '>= 0.4'} + jiti@2.6.1: + resolution: {integrity: sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==} + hasBin: true + jose@5.9.6: resolution: {integrity: sha512-AMlnetc9+CV9asI19zHmrgS/WYsWUwCn2R7RzlbJWD7F9eWYUTGyBmU9o6PxngtLGOiDGPRu+Uc4fhKzbpteZQ==} @@ -4020,6 +4160,76 @@ packages: cpu: [x64, arm64, wasm32] os: [darwin, linux, win32] + lightningcss-android-arm64@1.30.2: + resolution: {integrity: sha512-BH9sEdOCahSgmkVhBLeU7Hc9DWeZ1Eb6wNS6Da8igvUwAe0sqROHddIlvU06q3WyXVEOYDZ6ykBZQnjTbmo4+A==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [android] + + lightningcss-darwin-arm64@1.30.2: + resolution: {integrity: sha512-ylTcDJBN3Hp21TdhRT5zBOIi73P6/W0qwvlFEk22fkdXchtNTOU4Qc37SkzV+EKYxLouZ6M4LG9NfZ1qkhhBWA==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [darwin] + + lightningcss-darwin-x64@1.30.2: + resolution: {integrity: sha512-oBZgKchomuDYxr7ilwLcyms6BCyLn0z8J0+ZZmfpjwg9fRVZIR5/GMXd7r9RH94iDhld3UmSjBM6nXWM2TfZTQ==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [darwin] + + lightningcss-freebsd-x64@1.30.2: + resolution: {integrity: sha512-c2bH6xTrf4BDpK8MoGG4Bd6zAMZDAXS569UxCAGcA7IKbHNMlhGQ89eRmvpIUGfKWNVdbhSbkQaWhEoMGmGslA==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [freebsd] + + lightningcss-linux-arm-gnueabihf@1.30.2: + resolution: {integrity: sha512-eVdpxh4wYcm0PofJIZVuYuLiqBIakQ9uFZmipf6LF/HRj5Bgm0eb3qL/mr1smyXIS1twwOxNWndd8z0E374hiA==} + engines: {node: '>= 12.0.0'} + cpu: [arm] + os: [linux] + + lightningcss-linux-arm64-gnu@1.30.2: + resolution: {integrity: sha512-UK65WJAbwIJbiBFXpxrbTNArtfuznvxAJw4Q2ZGlU8kPeDIWEX1dg3rn2veBVUylA2Ezg89ktszWbaQnxD/e3A==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + + lightningcss-linux-arm64-musl@1.30.2: + resolution: {integrity: sha512-5Vh9dGeblpTxWHpOx8iauV02popZDsCYMPIgiuw97OJ5uaDsL86cnqSFs5LZkG3ghHoX5isLgWzMs+eD1YzrnA==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + + lightningcss-linux-x64-gnu@1.30.2: + resolution: {integrity: sha512-Cfd46gdmj1vQ+lR6VRTTadNHu6ALuw2pKR9lYq4FnhvgBc4zWY1EtZcAc6EffShbb1MFrIPfLDXD6Xprbnni4w==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + + lightningcss-linux-x64-musl@1.30.2: + resolution: {integrity: sha512-XJaLUUFXb6/QG2lGIW6aIk6jKdtjtcffUT0NKvIqhSBY3hh9Ch+1LCeH80dR9q9LBjG3ewbDjnumefsLsP6aiA==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + + lightningcss-win32-arm64-msvc@1.30.2: + resolution: {integrity: sha512-FZn+vaj7zLv//D/192WFFVA0RgHawIcHqLX9xuWiQt7P0PtdFEVaxgF9rjM/IRYHQXNnk61/H/gb2Ei+kUQ4xQ==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [win32] + + lightningcss-win32-x64-msvc@1.30.2: + resolution: {integrity: sha512-5g1yc73p+iAkid5phb4oVFMB45417DkRevRbt/El/gKXJk4jid+vPFF/AXbxn05Aky8PapwzZrdJShv5C0avjw==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [win32] + + lightningcss@1.30.2: + resolution: {integrity: sha512-utfs7Pr5uJyyvDETitgsaqSyjCb2qNRAtuqUeWIAKztsOYdcACf2KtARYXg2pSvhkt+9NfoaNY7fxjl6nuMjIQ==} + engines: {node: '>= 12.0.0'} + lines-and-columns@1.2.4: resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} @@ -4057,6 +4267,9 @@ packages: magic-string@0.30.19: resolution: {integrity: sha512-2N21sPY9Ws53PZvsEpVtNuSW+ScYbQdp4b9qUaL+9QkHUrGFKo56Lg9Emg5s9V/qrtNBmiR01sYhUOwu3H+VOw==} + magic-string@0.30.21: + resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} + make-dir@3.1.0: resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} engines: {node: '>=8'} @@ -4352,6 +4565,9 @@ packages: resolution: {integrity: sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + node-releases@2.0.27: + resolution: {integrity: sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==} + noms@0.0.0: resolution: {integrity: sha512-lNDU9VJaOPxUmXcLb+HQFeUgQQPtMI24Gt6hgfuMHRJgMRHMF/qZ4HJD3GDru4sSw9IQl2jPjAYnQrdIeLbwow==} @@ -4359,6 +4575,10 @@ packages: resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} engines: {node: '>=0.10.0'} + normalize-range@0.1.2: + resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==} + engines: {node: '>=0.10.0'} + normalize-url@8.1.0: resolution: {integrity: sha512-X06Mfd/5aKsRHc0O0J5CUedwnPmnDtLF2+nq+KN9KSDlJHkPuh0JUviWjEWMe0SW/9TDdSLVPuk7L5gGTIA1/w==} engines: {node: '>=14.16'} @@ -4626,6 +4846,9 @@ packages: resolution: {integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==} engines: {node: '>= 0.4'} + postcss-value-parser@4.2.0: + resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} + postcss@8.4.31: resolution: {integrity: sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==} engines: {node: ^10 || ^12 || >=14} @@ -5209,6 +5432,13 @@ packages: tabbable@6.2.0: resolution: {integrity: sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==} + tailwindcss@4.1.17: + resolution: {integrity: sha512-j9Ee2YjuQqYT9bbRTfTZht9W/ytp5H+jJpZKiYdP/bpnXARAuELt9ofP0lPnmHjbga7SNQIxdTAXCmtKVYjN+Q==} + + tapable@2.3.0: + resolution: {integrity: sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==} + engines: {node: '>=6'} + tar-stream@3.1.7: resolution: {integrity: sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==} @@ -5405,6 +5635,12 @@ packages: resolution: {integrity: sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==} engines: {node: '>=8'} + update-browserslist-db@1.1.4: + resolution: {integrity: sha512-q0SPT4xyU84saUX+tomz1WLkxUbuaJnR1xWt17M7fJtEJigJeWUNGUqrauFXsHnqev9y9JTRGwk13tFBuKby4A==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + uri-js@4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} @@ -5631,6 +5867,8 @@ packages: snapshots: + '@alloc/quick-lru@5.2.0': {} + '@apidevtools/json-schema-ref-parser@11.9.3': dependencies: '@jsdevtools/ono': 7.1.3 @@ -6253,25 +6491,25 @@ snapshots: '@esbuild/win32-x64@0.25.9': optional: true - '@eslint-community/eslint-utils@4.9.0(eslint@9.14.0)': + '@eslint-community/eslint-utils@4.9.0(eslint@9.14.0(jiti@2.6.1))': dependencies: - eslint: 9.14.0 + eslint: 9.14.0(jiti@2.6.1) eslint-visitor-keys: 3.4.3 - '@eslint-community/eslint-utils@4.9.0(eslint@9.35.0)': + '@eslint-community/eslint-utils@4.9.0(eslint@9.35.0(jiti@2.6.1))': dependencies: - eslint: 9.35.0 + eslint: 9.35.0(jiti@2.6.1) eslint-visitor-keys: 3.4.3 '@eslint-community/regexpp@4.12.1': {} - '@eslint-react/ast@1.16.1(eslint@9.14.0)(typescript@5.7.2)': + '@eslint-react/ast@1.16.1(eslint@9.14.0(jiti@2.6.1))(typescript@5.7.2)': dependencies: '@eslint-react/tools': 1.16.1 - '@eslint-react/types': 1.16.1(eslint@9.14.0)(typescript@5.7.2) + '@eslint-react/types': 1.16.1(eslint@9.14.0(jiti@2.6.1))(typescript@5.7.2) '@typescript-eslint/types': 8.43.0 '@typescript-eslint/typescript-estree': 8.43.0(typescript@5.7.2) - '@typescript-eslint/utils': 8.43.0(eslint@9.14.0)(typescript@5.7.2) + '@typescript-eslint/utils': 8.43.0(eslint@9.14.0(jiti@2.6.1))(typescript@5.7.2) birecord: 0.1.1 string-ts: 2.2.1 ts-pattern: 5.8.0 @@ -6280,18 +6518,18 @@ snapshots: - supports-color - typescript - '@eslint-react/core@1.16.1(eslint@9.14.0)(typescript@5.7.2)': + '@eslint-react/core@1.16.1(eslint@9.14.0(jiti@2.6.1))(typescript@5.7.2)': dependencies: - '@eslint-react/ast': 1.16.1(eslint@9.14.0)(typescript@5.7.2) - '@eslint-react/jsx': 1.16.1(eslint@9.14.0)(typescript@5.7.2) - '@eslint-react/shared': 1.16.1(eslint@9.14.0)(typescript@5.7.2) + '@eslint-react/ast': 1.16.1(eslint@9.14.0(jiti@2.6.1))(typescript@5.7.2) + '@eslint-react/jsx': 1.16.1(eslint@9.14.0(jiti@2.6.1))(typescript@5.7.2) + '@eslint-react/shared': 1.16.1(eslint@9.14.0(jiti@2.6.1))(typescript@5.7.2) '@eslint-react/tools': 1.16.1 - '@eslint-react/types': 1.16.1(eslint@9.14.0)(typescript@5.7.2) - '@eslint-react/var': 1.16.1(eslint@9.14.0)(typescript@5.7.2) + '@eslint-react/types': 1.16.1(eslint@9.14.0(jiti@2.6.1))(typescript@5.7.2) + '@eslint-react/var': 1.16.1(eslint@9.14.0(jiti@2.6.1))(typescript@5.7.2) '@typescript-eslint/scope-manager': 8.43.0 - '@typescript-eslint/type-utils': 8.43.0(eslint@9.14.0)(typescript@5.7.2) + '@typescript-eslint/type-utils': 8.43.0(eslint@9.14.0(jiti@2.6.1))(typescript@5.7.2) '@typescript-eslint/types': 8.43.0 - '@typescript-eslint/utils': 8.43.0(eslint@9.14.0)(typescript@5.7.2) + '@typescript-eslint/utils': 8.43.0(eslint@9.14.0(jiti@2.6.1))(typescript@5.7.2) birecord: 0.1.1 short-unique-id: 5.3.2 ts-pattern: 5.8.0 @@ -6300,46 +6538,46 @@ snapshots: - supports-color - typescript - '@eslint-react/eslint-plugin@1.16.1(eslint@9.14.0)(typescript@5.7.2)': + '@eslint-react/eslint-plugin@1.16.1(eslint@9.14.0(jiti@2.6.1))(typescript@5.7.2)': dependencies: - '@eslint-react/shared': 1.16.1(eslint@9.14.0)(typescript@5.7.2) + '@eslint-react/shared': 1.16.1(eslint@9.14.0(jiti@2.6.1))(typescript@5.7.2) '@eslint-react/tools': 1.16.1 - '@eslint-react/types': 1.16.1(eslint@9.14.0)(typescript@5.7.2) + '@eslint-react/types': 1.16.1(eslint@9.14.0(jiti@2.6.1))(typescript@5.7.2) '@typescript-eslint/scope-manager': 8.43.0 - '@typescript-eslint/type-utils': 8.43.0(eslint@9.14.0)(typescript@5.7.2) + '@typescript-eslint/type-utils': 8.43.0(eslint@9.14.0(jiti@2.6.1))(typescript@5.7.2) '@typescript-eslint/types': 8.43.0 - '@typescript-eslint/utils': 8.43.0(eslint@9.14.0)(typescript@5.7.2) - eslint: 9.14.0 - eslint-plugin-react-debug: 1.16.1(eslint@9.14.0)(typescript@5.7.2) - eslint-plugin-react-dom: 1.16.1(eslint@9.14.0)(typescript@5.7.2) - eslint-plugin-react-hooks-extra: 1.16.1(eslint@9.14.0)(typescript@5.7.2) - eslint-plugin-react-naming-convention: 1.16.1(eslint@9.14.0)(typescript@5.7.2) - eslint-plugin-react-web-api: 1.16.1(eslint@9.14.0)(typescript@5.7.2) - eslint-plugin-react-x: 1.16.1(eslint@9.14.0)(typescript@5.7.2) + '@typescript-eslint/utils': 8.43.0(eslint@9.14.0(jiti@2.6.1))(typescript@5.7.2) + eslint: 9.14.0(jiti@2.6.1) + eslint-plugin-react-debug: 1.16.1(eslint@9.14.0(jiti@2.6.1))(typescript@5.7.2) + eslint-plugin-react-dom: 1.16.1(eslint@9.14.0(jiti@2.6.1))(typescript@5.7.2) + eslint-plugin-react-hooks-extra: 1.16.1(eslint@9.14.0(jiti@2.6.1))(typescript@5.7.2) + eslint-plugin-react-naming-convention: 1.16.1(eslint@9.14.0(jiti@2.6.1))(typescript@5.7.2) + eslint-plugin-react-web-api: 1.16.1(eslint@9.14.0(jiti@2.6.1))(typescript@5.7.2) + eslint-plugin-react-x: 1.16.1(eslint@9.14.0(jiti@2.6.1))(typescript@5.7.2) optionalDependencies: typescript: 5.7.2 transitivePeerDependencies: - supports-color - '@eslint-react/jsx@1.16.1(eslint@9.14.0)(typescript@5.7.2)': + '@eslint-react/jsx@1.16.1(eslint@9.14.0(jiti@2.6.1))(typescript@5.7.2)': dependencies: - '@eslint-react/ast': 1.16.1(eslint@9.14.0)(typescript@5.7.2) + '@eslint-react/ast': 1.16.1(eslint@9.14.0(jiti@2.6.1))(typescript@5.7.2) '@eslint-react/tools': 1.16.1 - '@eslint-react/types': 1.16.1(eslint@9.14.0)(typescript@5.7.2) - '@eslint-react/var': 1.16.1(eslint@9.14.0)(typescript@5.7.2) + '@eslint-react/types': 1.16.1(eslint@9.14.0(jiti@2.6.1))(typescript@5.7.2) + '@eslint-react/var': 1.16.1(eslint@9.14.0(jiti@2.6.1))(typescript@5.7.2) '@typescript-eslint/scope-manager': 8.43.0 '@typescript-eslint/types': 8.43.0 - '@typescript-eslint/utils': 8.43.0(eslint@9.14.0)(typescript@5.7.2) + '@typescript-eslint/utils': 8.43.0(eslint@9.14.0(jiti@2.6.1))(typescript@5.7.2) ts-pattern: 5.8.0 transitivePeerDependencies: - eslint - supports-color - typescript - '@eslint-react/shared@1.16.1(eslint@9.14.0)(typescript@5.7.2)': + '@eslint-react/shared@1.16.1(eslint@9.14.0(jiti@2.6.1))(typescript@5.7.2)': dependencies: '@eslint-react/tools': 1.16.1 - '@typescript-eslint/utils': 8.43.0(eslint@9.14.0)(typescript@5.7.2) + '@typescript-eslint/utils': 8.43.0(eslint@9.14.0(jiti@2.6.1))(typescript@5.7.2) picomatch: 4.0.3 transitivePeerDependencies: - eslint @@ -6348,24 +6586,24 @@ snapshots: '@eslint-react/tools@1.16.1': {} - '@eslint-react/types@1.16.1(eslint@9.14.0)(typescript@5.7.2)': + '@eslint-react/types@1.16.1(eslint@9.14.0(jiti@2.6.1))(typescript@5.7.2)': dependencies: '@eslint-react/tools': 1.16.1 '@typescript-eslint/types': 8.43.0 - '@typescript-eslint/utils': 8.43.0(eslint@9.14.0)(typescript@5.7.2) + '@typescript-eslint/utils': 8.43.0(eslint@9.14.0(jiti@2.6.1))(typescript@5.7.2) transitivePeerDependencies: - eslint - supports-color - typescript - '@eslint-react/var@1.16.1(eslint@9.14.0)(typescript@5.7.2)': + '@eslint-react/var@1.16.1(eslint@9.14.0(jiti@2.6.1))(typescript@5.7.2)': dependencies: - '@eslint-react/ast': 1.16.1(eslint@9.14.0)(typescript@5.7.2) + '@eslint-react/ast': 1.16.1(eslint@9.14.0(jiti@2.6.1))(typescript@5.7.2) '@eslint-react/tools': 1.16.1 - '@eslint-react/types': 1.16.1(eslint@9.14.0)(typescript@5.7.2) + '@eslint-react/types': 1.16.1(eslint@9.14.0(jiti@2.6.1))(typescript@5.7.2) '@typescript-eslint/scope-manager': 8.43.0 '@typescript-eslint/types': 8.43.0 - '@typescript-eslint/utils': 8.43.0(eslint@9.14.0)(typescript@5.7.2) + '@typescript-eslint/utils': 8.43.0(eslint@9.14.0(jiti@2.6.1))(typescript@5.7.2) ts-pattern: 5.8.0 transitivePeerDependencies: - eslint @@ -6663,6 +6901,11 @@ snapshots: '@jridgewell/sourcemap-codec': 1.5.5 '@jridgewell/trace-mapping': 0.3.31 + '@jridgewell/remapping@2.3.5': + dependencies: + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 + '@jridgewell/resolve-uri@3.1.2': {} '@jridgewell/sourcemap-codec@1.5.5': {} @@ -7221,26 +7464,26 @@ snapshots: - sql.js - sqlite3 - '@payloadcms/eslint-config@3.9.0(@typescript-eslint/eslint-plugin@8.43.0(@typescript-eslint/parser@8.43.0(eslint@9.35.0)(typescript@5.7.3))(eslint@9.35.0)(typescript@5.7.3))': + '@payloadcms/eslint-config@3.9.0(@typescript-eslint/eslint-plugin@8.43.0(@typescript-eslint/parser@8.43.0(eslint@9.35.0(jiti@2.6.1))(typescript@5.7.3))(eslint@9.35.0(jiti@2.6.1))(typescript@5.7.3))(jiti@2.6.1)': dependencies: - '@eslint-react/eslint-plugin': 1.16.1(eslint@9.14.0)(typescript@5.7.2) + '@eslint-react/eslint-plugin': 1.16.1(eslint@9.14.0(jiti@2.6.1))(typescript@5.7.2) '@eslint/js': 9.14.0 - '@payloadcms/eslint-plugin': 3.9.0(@typescript-eslint/eslint-plugin@8.43.0(@typescript-eslint/parser@8.43.0(eslint@9.35.0)(typescript@5.7.3))(eslint@9.35.0)(typescript@5.7.3)) + '@payloadcms/eslint-plugin': 3.9.0(@typescript-eslint/eslint-plugin@8.43.0(@typescript-eslint/parser@8.43.0(eslint@9.35.0(jiti@2.6.1))(typescript@5.7.3))(eslint@9.35.0(jiti@2.6.1))(typescript@5.7.3))(jiti@2.6.1) '@types/eslint': 9.6.1 '@types/eslint__js': 8.42.3 - '@typescript-eslint/parser': 8.14.0(eslint@9.14.0)(typescript@5.7.2) - eslint: 9.14.0 - eslint-config-prettier: 9.1.0(eslint@9.14.0) - eslint-plugin-import-x: 4.4.2(eslint@9.14.0)(typescript@5.7.2) - eslint-plugin-jest: 28.9.0(@typescript-eslint/eslint-plugin@8.43.0(@typescript-eslint/parser@8.43.0(eslint@9.35.0)(typescript@5.7.3))(eslint@9.35.0)(typescript@5.7.3))(eslint@9.14.0)(typescript@5.7.2) - eslint-plugin-jest-dom: 5.4.0(eslint@9.14.0) - eslint-plugin-jsx-a11y: 6.10.2(eslint@9.14.0) - eslint-plugin-perfectionist: 3.9.1(eslint@9.14.0)(typescript@5.7.2) - eslint-plugin-react-hooks: 5.0.0(eslint@9.14.0) - eslint-plugin-regexp: 2.6.0(eslint@9.14.0) + '@typescript-eslint/parser': 8.14.0(eslint@9.14.0(jiti@2.6.1))(typescript@5.7.2) + eslint: 9.14.0(jiti@2.6.1) + eslint-config-prettier: 9.1.0(eslint@9.14.0(jiti@2.6.1)) + eslint-plugin-import-x: 4.4.2(eslint@9.14.0(jiti@2.6.1))(typescript@5.7.2) + eslint-plugin-jest: 28.9.0(@typescript-eslint/eslint-plugin@8.43.0(@typescript-eslint/parser@8.43.0(eslint@9.35.0(jiti@2.6.1))(typescript@5.7.3))(eslint@9.35.0(jiti@2.6.1))(typescript@5.7.3))(eslint@9.14.0(jiti@2.6.1))(typescript@5.7.2) + eslint-plugin-jest-dom: 5.4.0(eslint@9.14.0(jiti@2.6.1)) + eslint-plugin-jsx-a11y: 6.10.2(eslint@9.14.0(jiti@2.6.1)) + eslint-plugin-perfectionist: 3.9.1(eslint@9.14.0(jiti@2.6.1))(typescript@5.7.2) + eslint-plugin-react-hooks: 5.0.0(eslint@9.14.0(jiti@2.6.1)) + eslint-plugin-regexp: 2.6.0(eslint@9.14.0(jiti@2.6.1)) globals: 15.12.0 typescript: 5.7.2 - typescript-eslint: 8.14.0(eslint@9.14.0)(typescript@5.7.2) + typescript-eslint: 8.14.0(eslint@9.14.0(jiti@2.6.1))(typescript@5.7.2) transitivePeerDependencies: - '@testing-library/dom' - '@typescript-eslint/eslint-plugin' @@ -7252,25 +7495,25 @@ snapshots: - svelte-eslint-parser - vue-eslint-parser - '@payloadcms/eslint-plugin@3.9.0(@typescript-eslint/eslint-plugin@8.43.0(@typescript-eslint/parser@8.43.0(eslint@9.35.0)(typescript@5.7.3))(eslint@9.35.0)(typescript@5.7.3))': + '@payloadcms/eslint-plugin@3.9.0(@typescript-eslint/eslint-plugin@8.43.0(@typescript-eslint/parser@8.43.0(eslint@9.35.0(jiti@2.6.1))(typescript@5.7.3))(eslint@9.35.0(jiti@2.6.1))(typescript@5.7.3))(jiti@2.6.1)': dependencies: - '@eslint-react/eslint-plugin': 1.16.1(eslint@9.14.0)(typescript@5.7.2) + '@eslint-react/eslint-plugin': 1.16.1(eslint@9.14.0(jiti@2.6.1))(typescript@5.7.2) '@eslint/js': 9.14.0 '@types/eslint': 9.6.1 '@types/eslint__js': 8.42.3 - '@typescript-eslint/parser': 8.14.0(eslint@9.14.0)(typescript@5.7.2) - eslint: 9.14.0 - eslint-config-prettier: 9.1.0(eslint@9.14.0) - eslint-plugin-import-x: 4.4.2(eslint@9.14.0)(typescript@5.7.2) - eslint-plugin-jest: 28.9.0(@typescript-eslint/eslint-plugin@8.43.0(@typescript-eslint/parser@8.43.0(eslint@9.35.0)(typescript@5.7.3))(eslint@9.35.0)(typescript@5.7.3))(eslint@9.14.0)(typescript@5.7.2) - eslint-plugin-jest-dom: 5.4.0(eslint@9.14.0) - eslint-plugin-jsx-a11y: 6.10.2(eslint@9.14.0) - eslint-plugin-perfectionist: 3.9.1(eslint@9.14.0)(typescript@5.7.2) - eslint-plugin-react-hooks: 5.0.0(eslint@9.14.0) - eslint-plugin-regexp: 2.6.0(eslint@9.14.0) + '@typescript-eslint/parser': 8.14.0(eslint@9.14.0(jiti@2.6.1))(typescript@5.7.2) + eslint: 9.14.0(jiti@2.6.1) + eslint-config-prettier: 9.1.0(eslint@9.14.0(jiti@2.6.1)) + eslint-plugin-import-x: 4.4.2(eslint@9.14.0(jiti@2.6.1))(typescript@5.7.2) + eslint-plugin-jest: 28.9.0(@typescript-eslint/eslint-plugin@8.43.0(@typescript-eslint/parser@8.43.0(eslint@9.35.0(jiti@2.6.1))(typescript@5.7.3))(eslint@9.35.0(jiti@2.6.1))(typescript@5.7.3))(eslint@9.14.0(jiti@2.6.1))(typescript@5.7.2) + eslint-plugin-jest-dom: 5.4.0(eslint@9.14.0(jiti@2.6.1)) + eslint-plugin-jsx-a11y: 6.10.2(eslint@9.14.0(jiti@2.6.1)) + eslint-plugin-perfectionist: 3.9.1(eslint@9.14.0(jiti@2.6.1))(typescript@5.7.2) + eslint-plugin-react-hooks: 5.0.0(eslint@9.14.0(jiti@2.6.1)) + eslint-plugin-regexp: 2.6.0(eslint@9.14.0(jiti@2.6.1)) globals: 15.12.0 typescript: 5.7.2 - typescript-eslint: 8.14.0(eslint@9.14.0)(typescript@5.7.2) + typescript-eslint: 8.14.0(eslint@9.14.0(jiti@2.6.1))(typescript@5.7.2) transitivePeerDependencies: - '@testing-library/dom' - '@typescript-eslint/eslint-plugin' @@ -7575,6 +7818,75 @@ snapshots: dependencies: defer-to-connect: 2.0.1 + '@tailwindcss/node@4.1.17': + dependencies: + '@jridgewell/remapping': 2.3.5 + enhanced-resolve: 5.18.3 + jiti: 2.6.1 + lightningcss: 1.30.2 + magic-string: 0.30.21 + source-map-js: 1.2.1 + tailwindcss: 4.1.17 + + '@tailwindcss/oxide-android-arm64@4.1.17': + optional: true + + '@tailwindcss/oxide-darwin-arm64@4.1.17': + optional: true + + '@tailwindcss/oxide-darwin-x64@4.1.17': + optional: true + + '@tailwindcss/oxide-freebsd-x64@4.1.17': + optional: true + + '@tailwindcss/oxide-linux-arm-gnueabihf@4.1.17': + optional: true + + '@tailwindcss/oxide-linux-arm64-gnu@4.1.17': + optional: true + + '@tailwindcss/oxide-linux-arm64-musl@4.1.17': + optional: true + + '@tailwindcss/oxide-linux-x64-gnu@4.1.17': + optional: true + + '@tailwindcss/oxide-linux-x64-musl@4.1.17': + optional: true + + '@tailwindcss/oxide-wasm32-wasi@4.1.17': + optional: true + + '@tailwindcss/oxide-win32-arm64-msvc@4.1.17': + optional: true + + '@tailwindcss/oxide-win32-x64-msvc@4.1.17': + optional: true + + '@tailwindcss/oxide@4.1.17': + optionalDependencies: + '@tailwindcss/oxide-android-arm64': 4.1.17 + '@tailwindcss/oxide-darwin-arm64': 4.1.17 + '@tailwindcss/oxide-darwin-x64': 4.1.17 + '@tailwindcss/oxide-freebsd-x64': 4.1.17 + '@tailwindcss/oxide-linux-arm-gnueabihf': 4.1.17 + '@tailwindcss/oxide-linux-arm64-gnu': 4.1.17 + '@tailwindcss/oxide-linux-arm64-musl': 4.1.17 + '@tailwindcss/oxide-linux-x64-gnu': 4.1.17 + '@tailwindcss/oxide-linux-x64-musl': 4.1.17 + '@tailwindcss/oxide-wasm32-wasi': 4.1.17 + '@tailwindcss/oxide-win32-arm64-msvc': 4.1.17 + '@tailwindcss/oxide-win32-x64-msvc': 4.1.17 + + '@tailwindcss/postcss@4.1.17': + dependencies: + '@alloc/quick-lru': 5.2.0 + '@tailwindcss/node': 4.1.17 + '@tailwindcss/oxide': 4.1.17 + postcss: 8.5.6 + tailwindcss: 4.1.17 + '@tokenizer/inflate@0.2.7': dependencies: debug: 4.4.1 @@ -7685,15 +7997,15 @@ snapshots: dependencies: '@types/node': 22.18.1 - '@typescript-eslint/eslint-plugin@8.14.0(@typescript-eslint/parser@8.14.0(eslint@9.14.0)(typescript@5.7.2))(eslint@9.14.0)(typescript@5.7.2)': + '@typescript-eslint/eslint-plugin@8.14.0(@typescript-eslint/parser@8.14.0(eslint@9.14.0(jiti@2.6.1))(typescript@5.7.2))(eslint@9.14.0(jiti@2.6.1))(typescript@5.7.2)': dependencies: '@eslint-community/regexpp': 4.12.1 - '@typescript-eslint/parser': 8.14.0(eslint@9.14.0)(typescript@5.7.2) + '@typescript-eslint/parser': 8.14.0(eslint@9.14.0(jiti@2.6.1))(typescript@5.7.2) '@typescript-eslint/scope-manager': 8.14.0 - '@typescript-eslint/type-utils': 8.14.0(eslint@9.14.0)(typescript@5.7.2) - '@typescript-eslint/utils': 8.14.0(eslint@9.14.0)(typescript@5.7.2) + '@typescript-eslint/type-utils': 8.14.0(eslint@9.14.0(jiti@2.6.1))(typescript@5.7.2) + '@typescript-eslint/utils': 8.14.0(eslint@9.14.0(jiti@2.6.1))(typescript@5.7.2) '@typescript-eslint/visitor-keys': 8.14.0 - eslint: 9.14.0 + eslint: 9.14.0(jiti@2.6.1) graphemer: 1.4.0 ignore: 5.3.2 natural-compare: 1.4.0 @@ -7703,15 +8015,15 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/eslint-plugin@8.43.0(@typescript-eslint/parser@8.43.0(eslint@9.35.0)(typescript@5.7.3))(eslint@9.35.0)(typescript@5.7.3)': + '@typescript-eslint/eslint-plugin@8.43.0(@typescript-eslint/parser@8.43.0(eslint@9.35.0(jiti@2.6.1))(typescript@5.7.3))(eslint@9.35.0(jiti@2.6.1))(typescript@5.7.3)': dependencies: '@eslint-community/regexpp': 4.12.1 - '@typescript-eslint/parser': 8.43.0(eslint@9.35.0)(typescript@5.7.3) + '@typescript-eslint/parser': 8.43.0(eslint@9.35.0(jiti@2.6.1))(typescript@5.7.3) '@typescript-eslint/scope-manager': 8.43.0 - '@typescript-eslint/type-utils': 8.43.0(eslint@9.35.0)(typescript@5.7.3) - '@typescript-eslint/utils': 8.43.0(eslint@9.35.0)(typescript@5.7.3) + '@typescript-eslint/type-utils': 8.43.0(eslint@9.35.0(jiti@2.6.1))(typescript@5.7.3) + '@typescript-eslint/utils': 8.43.0(eslint@9.35.0(jiti@2.6.1))(typescript@5.7.3) '@typescript-eslint/visitor-keys': 8.43.0 - eslint: 9.35.0 + eslint: 9.35.0(jiti@2.6.1) graphemer: 1.4.0 ignore: 7.0.5 natural-compare: 1.4.0 @@ -7720,27 +8032,27 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.14.0(eslint@9.14.0)(typescript@5.7.2)': + '@typescript-eslint/parser@8.14.0(eslint@9.14.0(jiti@2.6.1))(typescript@5.7.2)': dependencies: '@typescript-eslint/scope-manager': 8.14.0 '@typescript-eslint/types': 8.14.0 '@typescript-eslint/typescript-estree': 8.14.0(typescript@5.7.2) '@typescript-eslint/visitor-keys': 8.14.0 debug: 4.4.1 - eslint: 9.14.0 + eslint: 9.14.0(jiti@2.6.1) optionalDependencies: typescript: 5.7.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.43.0(eslint@9.35.0)(typescript@5.7.3)': + '@typescript-eslint/parser@8.43.0(eslint@9.35.0(jiti@2.6.1))(typescript@5.7.3)': dependencies: '@typescript-eslint/scope-manager': 8.43.0 '@typescript-eslint/types': 8.43.0 '@typescript-eslint/typescript-estree': 8.43.0(typescript@5.7.3) '@typescript-eslint/visitor-keys': 8.43.0 debug: 4.4.1 - eslint: 9.35.0 + eslint: 9.35.0(jiti@2.6.1) typescript: 5.7.3 transitivePeerDependencies: - supports-color @@ -7781,10 +8093,10 @@ snapshots: dependencies: typescript: 5.7.3 - '@typescript-eslint/type-utils@8.14.0(eslint@9.14.0)(typescript@5.7.2)': + '@typescript-eslint/type-utils@8.14.0(eslint@9.14.0(jiti@2.6.1))(typescript@5.7.2)': dependencies: '@typescript-eslint/typescript-estree': 8.14.0(typescript@5.7.2) - '@typescript-eslint/utils': 8.14.0(eslint@9.14.0)(typescript@5.7.2) + '@typescript-eslint/utils': 8.14.0(eslint@9.14.0(jiti@2.6.1))(typescript@5.7.2) debug: 4.4.1 ts-api-utils: 1.4.3(typescript@5.7.2) optionalDependencies: @@ -7793,25 +8105,25 @@ snapshots: - eslint - supports-color - '@typescript-eslint/type-utils@8.43.0(eslint@9.14.0)(typescript@5.7.2)': + '@typescript-eslint/type-utils@8.43.0(eslint@9.14.0(jiti@2.6.1))(typescript@5.7.2)': dependencies: '@typescript-eslint/types': 8.43.0 '@typescript-eslint/typescript-estree': 8.43.0(typescript@5.7.2) - '@typescript-eslint/utils': 8.43.0(eslint@9.14.0)(typescript@5.7.2) + '@typescript-eslint/utils': 8.43.0(eslint@9.14.0(jiti@2.6.1))(typescript@5.7.2) debug: 4.4.1 - eslint: 9.14.0 + eslint: 9.14.0(jiti@2.6.1) ts-api-utils: 2.1.0(typescript@5.7.2) typescript: 5.7.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/type-utils@8.43.0(eslint@9.35.0)(typescript@5.7.3)': + '@typescript-eslint/type-utils@8.43.0(eslint@9.35.0(jiti@2.6.1))(typescript@5.7.3)': dependencies: '@typescript-eslint/types': 8.43.0 '@typescript-eslint/typescript-estree': 8.43.0(typescript@5.7.3) - '@typescript-eslint/utils': 8.43.0(eslint@9.35.0)(typescript@5.7.3) + '@typescript-eslint/utils': 8.43.0(eslint@9.35.0(jiti@2.6.1))(typescript@5.7.3) debug: 4.4.1 - eslint: 9.35.0 + eslint: 9.35.0(jiti@2.6.1) ts-api-utils: 2.1.0(typescript@5.7.3) typescript: 5.7.3 transitivePeerDependencies: @@ -7868,35 +8180,35 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.14.0(eslint@9.14.0)(typescript@5.7.2)': + '@typescript-eslint/utils@8.14.0(eslint@9.14.0(jiti@2.6.1))(typescript@5.7.2)': dependencies: - '@eslint-community/eslint-utils': 4.9.0(eslint@9.14.0) + '@eslint-community/eslint-utils': 4.9.0(eslint@9.14.0(jiti@2.6.1)) '@typescript-eslint/scope-manager': 8.14.0 '@typescript-eslint/types': 8.14.0 '@typescript-eslint/typescript-estree': 8.14.0(typescript@5.7.2) - eslint: 9.14.0 + eslint: 9.14.0(jiti@2.6.1) transitivePeerDependencies: - supports-color - typescript - '@typescript-eslint/utils@8.43.0(eslint@9.14.0)(typescript@5.7.2)': + '@typescript-eslint/utils@8.43.0(eslint@9.14.0(jiti@2.6.1))(typescript@5.7.2)': dependencies: - '@eslint-community/eslint-utils': 4.9.0(eslint@9.14.0) + '@eslint-community/eslint-utils': 4.9.0(eslint@9.14.0(jiti@2.6.1)) '@typescript-eslint/scope-manager': 8.43.0 '@typescript-eslint/types': 8.43.0 '@typescript-eslint/typescript-estree': 8.43.0(typescript@5.7.2) - eslint: 9.14.0 + eslint: 9.14.0(jiti@2.6.1) typescript: 5.7.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.43.0(eslint@9.35.0)(typescript@5.7.3)': + '@typescript-eslint/utils@8.43.0(eslint@9.35.0(jiti@2.6.1))(typescript@5.7.3)': dependencies: - '@eslint-community/eslint-utils': 4.9.0(eslint@9.35.0) + '@eslint-community/eslint-utils': 4.9.0(eslint@9.35.0(jiti@2.6.1)) '@typescript-eslint/scope-manager': 8.43.0 '@typescript-eslint/types': 8.43.0 '@typescript-eslint/typescript-estree': 8.43.0(typescript@5.7.3) - eslint: 9.35.0 + eslint: 9.35.0(jiti@2.6.1) typescript: 5.7.3 transitivePeerDependencies: - supports-color @@ -7978,13 +8290,13 @@ snapshots: chai: 5.3.3 tinyrainbow: 2.0.0 - '@vitest/mocker@3.2.4(vite@7.1.5(@types/node@22.18.1)(sass@1.77.4)(tsx@4.19.2))': + '@vitest/mocker@3.2.4(vite@7.1.5(@types/node@22.18.1)(jiti@2.6.1)(lightningcss@1.30.2)(sass@1.77.4)(tsx@4.19.2))': dependencies: '@vitest/spy': 3.2.4 estree-walker: 3.0.3 magic-string: 0.30.19 optionalDependencies: - vite: 7.1.5(@types/node@22.18.1)(sass@1.77.4)(tsx@4.19.2) + vite: 7.1.5(@types/node@22.18.1)(jiti@2.6.1)(lightningcss@1.30.2)(sass@1.77.4)(tsx@4.19.2) '@vitest/pretty-format@3.2.4': dependencies: @@ -8231,6 +8543,16 @@ snapshots: atomic-sleep@1.0.0: {} + autoprefixer@10.4.21(postcss@8.5.6): + dependencies: + browserslist: 4.27.0 + caniuse-lite: 1.0.30001741 + fraction.js: 4.3.7 + normalize-range: 0.1.2 + picocolors: 1.1.1 + postcss: 8.5.6 + postcss-value-parser: 4.2.0 + available-typed-arrays@1.0.7: dependencies: possible-typed-array-names: 1.1.0 @@ -8261,6 +8583,8 @@ snapshots: base64-js@1.5.1: {} + baseline-browser-mapping@2.8.25: {} + better-path-resolve@1.0.0: dependencies: is-windows: 1.0.2 @@ -8295,6 +8619,14 @@ snapshots: dependencies: fill-range: 7.1.1 + browserslist@4.27.0: + dependencies: + baseline-browser-mapping: 2.8.25 + caniuse-lite: 1.0.30001754 + electron-to-chromium: 1.5.249 + node-releases: 2.0.27 + update-browserslist-db: 1.1.4(browserslist@4.27.0) + bson-objectid@2.0.4: {} bson@6.10.4: {} @@ -8355,6 +8687,8 @@ snapshots: caniuse-lite@1.0.30001741: {} + caniuse-lite@1.0.30001754: {} + ccount@2.0.1: {} chai@5.3.3: @@ -8631,6 +8965,8 @@ snapshots: es-errors: 1.3.0 gopd: 1.2.0 + electron-to-chromium@1.5.249: {} + emoji-regex@8.0.0: {} emoji-regex@9.2.2: {} @@ -8639,6 +8975,11 @@ snapshots: dependencies: once: 1.4.0 + enhanced-resolve@5.18.3: + dependencies: + graceful-fs: 4.2.11 + tapable: 2.3.0 + enquirer@2.4.1: dependencies: ansi-colors: 4.1.3 @@ -8871,19 +9212,19 @@ snapshots: escape-string-regexp@4.0.0: {} - eslint-config-next@15.4.4(eslint-plugin-import-x@4.4.2(eslint@9.35.0)(typescript@5.7.3))(eslint@9.35.0)(typescript@5.7.3): + eslint-config-next@15.4.4(eslint-plugin-import-x@4.4.2(eslint@9.35.0(jiti@2.6.1))(typescript@5.7.3))(eslint@9.35.0(jiti@2.6.1))(typescript@5.7.3): dependencies: '@next/eslint-plugin-next': 15.4.4 '@rushstack/eslint-patch': 1.12.0 - '@typescript-eslint/eslint-plugin': 8.43.0(@typescript-eslint/parser@8.43.0(eslint@9.35.0)(typescript@5.7.3))(eslint@9.35.0)(typescript@5.7.3) - '@typescript-eslint/parser': 8.43.0(eslint@9.35.0)(typescript@5.7.3) - eslint: 9.35.0 + '@typescript-eslint/eslint-plugin': 8.43.0(@typescript-eslint/parser@8.43.0(eslint@9.35.0(jiti@2.6.1))(typescript@5.7.3))(eslint@9.35.0(jiti@2.6.1))(typescript@5.7.3) + '@typescript-eslint/parser': 8.43.0(eslint@9.35.0(jiti@2.6.1))(typescript@5.7.3) + eslint: 9.35.0(jiti@2.6.1) eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import-x@4.4.2(eslint@9.35.0)(typescript@5.7.3))(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.43.0(eslint@9.35.0)(typescript@5.7.3))(eslint@9.35.0))(eslint@9.35.0) - eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.43.0(eslint@9.35.0)(typescript@5.7.3))(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import-x@4.4.2(eslint@9.35.0)(typescript@5.7.3))(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.43.0(eslint@9.35.0)(typescript@5.7.3))(eslint@9.35.0))(eslint@9.35.0))(eslint@9.35.0) - eslint-plugin-jsx-a11y: 6.10.2(eslint@9.35.0) - eslint-plugin-react: 7.37.5(eslint@9.35.0) - eslint-plugin-react-hooks: 5.2.0(eslint@9.35.0) + eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import-x@4.4.2(eslint@9.35.0(jiti@2.6.1))(typescript@5.7.3))(eslint-plugin-import@2.32.0)(eslint@9.35.0(jiti@2.6.1)) + eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.43.0(eslint@9.35.0(jiti@2.6.1))(typescript@5.7.3))(eslint-import-resolver-typescript@3.10.1)(eslint@9.35.0(jiti@2.6.1)) + eslint-plugin-jsx-a11y: 6.10.2(eslint@9.35.0(jiti@2.6.1)) + eslint-plugin-react: 7.37.5(eslint@9.35.0(jiti@2.6.1)) + eslint-plugin-react-hooks: 5.2.0(eslint@9.35.0(jiti@2.6.1)) optionalDependencies: typescript: 5.7.3 transitivePeerDependencies: @@ -8891,9 +9232,9 @@ snapshots: - eslint-plugin-import-x - supports-color - eslint-config-prettier@9.1.0(eslint@9.14.0): + eslint-config-prettier@9.1.0(eslint@9.14.0(jiti@2.6.1)): dependencies: - eslint: 9.14.0 + eslint: 9.14.0(jiti@2.6.1) eslint-import-resolver-node@0.3.9: dependencies: @@ -8903,39 +9244,39 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-import-resolver-typescript@3.10.1(eslint-plugin-import-x@4.4.2(eslint@9.35.0)(typescript@5.7.3))(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.43.0(eslint@9.35.0)(typescript@5.7.3))(eslint@9.35.0))(eslint@9.35.0): + eslint-import-resolver-typescript@3.10.1(eslint-plugin-import-x@4.4.2(eslint@9.35.0(jiti@2.6.1))(typescript@5.7.3))(eslint-plugin-import@2.32.0)(eslint@9.35.0(jiti@2.6.1)): dependencies: '@nolyfill/is-core-module': 1.0.39 debug: 4.4.1 - eslint: 9.35.0 + eslint: 9.35.0(jiti@2.6.1) get-tsconfig: 4.10.1 is-bun-module: 2.0.0 stable-hash: 0.0.5 tinyglobby: 0.2.15 unrs-resolver: 1.11.1 optionalDependencies: - eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.43.0(eslint@9.35.0)(typescript@5.7.3))(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import-x@4.4.2(eslint@9.35.0)(typescript@5.7.3))(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.43.0(eslint@9.35.0)(typescript@5.7.3))(eslint@9.35.0))(eslint@9.35.0))(eslint@9.35.0) - eslint-plugin-import-x: 4.4.2(eslint@9.35.0)(typescript@5.7.3) + eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.43.0(eslint@9.35.0(jiti@2.6.1))(typescript@5.7.3))(eslint-import-resolver-typescript@3.10.1)(eslint@9.35.0(jiti@2.6.1)) + eslint-plugin-import-x: 4.4.2(eslint@9.35.0(jiti@2.6.1))(typescript@5.7.3) transitivePeerDependencies: - supports-color - eslint-module-utils@2.12.1(@typescript-eslint/parser@8.43.0(eslint@9.35.0)(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import-x@4.4.2(eslint@9.35.0)(typescript@5.7.3))(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.43.0(eslint@9.35.0)(typescript@5.7.3))(eslint@9.35.0))(eslint@9.35.0))(eslint@9.35.0): + eslint-module-utils@2.12.1(@typescript-eslint/parser@8.43.0(eslint@9.35.0(jiti@2.6.1))(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1)(eslint@9.35.0(jiti@2.6.1)): dependencies: debug: 3.2.7 optionalDependencies: - '@typescript-eslint/parser': 8.43.0(eslint@9.35.0)(typescript@5.7.3) - eslint: 9.35.0 + '@typescript-eslint/parser': 8.43.0(eslint@9.35.0(jiti@2.6.1))(typescript@5.7.3) + eslint: 9.35.0(jiti@2.6.1) eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import-x@4.4.2(eslint@9.35.0)(typescript@5.7.3))(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.43.0(eslint@9.35.0)(typescript@5.7.3))(eslint@9.35.0))(eslint@9.35.0) + eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import-x@4.4.2(eslint@9.35.0(jiti@2.6.1))(typescript@5.7.3))(eslint-plugin-import@2.32.0)(eslint@9.35.0(jiti@2.6.1)) transitivePeerDependencies: - supports-color - eslint-plugin-import-x@4.4.2(eslint@9.14.0)(typescript@5.7.2): + eslint-plugin-import-x@4.4.2(eslint@9.14.0(jiti@2.6.1))(typescript@5.7.2): dependencies: - '@typescript-eslint/utils': 8.43.0(eslint@9.14.0)(typescript@5.7.2) + '@typescript-eslint/utils': 8.43.0(eslint@9.14.0(jiti@2.6.1))(typescript@5.7.2) debug: 4.4.1 doctrine: 3.0.0 - eslint: 9.14.0 + eslint: 9.14.0(jiti@2.6.1) eslint-import-resolver-node: 0.3.9 get-tsconfig: 4.10.1 is-glob: 4.0.3 @@ -8947,12 +9288,12 @@ snapshots: - supports-color - typescript - eslint-plugin-import-x@4.4.2(eslint@9.35.0)(typescript@5.7.3): + eslint-plugin-import-x@4.4.2(eslint@9.35.0(jiti@2.6.1))(typescript@5.7.3): dependencies: - '@typescript-eslint/utils': 8.43.0(eslint@9.35.0)(typescript@5.7.3) + '@typescript-eslint/utils': 8.43.0(eslint@9.35.0(jiti@2.6.1))(typescript@5.7.3) debug: 4.4.1 doctrine: 3.0.0 - eslint: 9.35.0 + eslint: 9.35.0(jiti@2.6.1) eslint-import-resolver-node: 0.3.9 get-tsconfig: 4.10.1 is-glob: 4.0.3 @@ -8965,7 +9306,7 @@ snapshots: - typescript optional: true - eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.43.0(eslint@9.35.0)(typescript@5.7.3))(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import-x@4.4.2(eslint@9.35.0)(typescript@5.7.3))(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.43.0(eslint@9.35.0)(typescript@5.7.3))(eslint@9.35.0))(eslint@9.35.0))(eslint@9.35.0): + eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.43.0(eslint@9.35.0(jiti@2.6.1))(typescript@5.7.3))(eslint-import-resolver-typescript@3.10.1)(eslint@9.35.0(jiti@2.6.1)): dependencies: '@rtsao/scc': 1.1.0 array-includes: 3.1.9 @@ -8974,9 +9315,9 @@ snapshots: array.prototype.flatmap: 1.3.3 debug: 3.2.7 doctrine: 2.1.0 - eslint: 9.35.0 + eslint: 9.35.0(jiti@2.6.1) eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.43.0(eslint@9.35.0)(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import-x@4.4.2(eslint@9.35.0)(typescript@5.7.3))(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.43.0(eslint@9.35.0)(typescript@5.7.3))(eslint@9.35.0))(eslint@9.35.0))(eslint@9.35.0) + eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.43.0(eslint@9.35.0(jiti@2.6.1))(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1)(eslint@9.35.0(jiti@2.6.1)) hasown: 2.0.2 is-core-module: 2.16.1 is-glob: 4.0.3 @@ -8988,29 +9329,29 @@ snapshots: string.prototype.trimend: 1.0.9 tsconfig-paths: 3.15.0 optionalDependencies: - '@typescript-eslint/parser': 8.43.0(eslint@9.35.0)(typescript@5.7.3) + '@typescript-eslint/parser': 8.43.0(eslint@9.35.0(jiti@2.6.1))(typescript@5.7.3) transitivePeerDependencies: - eslint-import-resolver-typescript - eslint-import-resolver-webpack - supports-color - eslint-plugin-jest-dom@5.4.0(eslint@9.14.0): + eslint-plugin-jest-dom@5.4.0(eslint@9.14.0(jiti@2.6.1)): dependencies: '@babel/runtime': 7.28.4 - eslint: 9.14.0 + eslint: 9.14.0(jiti@2.6.1) requireindex: 1.2.0 - eslint-plugin-jest@28.9.0(@typescript-eslint/eslint-plugin@8.43.0(@typescript-eslint/parser@8.43.0(eslint@9.35.0)(typescript@5.7.3))(eslint@9.35.0)(typescript@5.7.3))(eslint@9.14.0)(typescript@5.7.2): + eslint-plugin-jest@28.9.0(@typescript-eslint/eslint-plugin@8.43.0(@typescript-eslint/parser@8.43.0(eslint@9.35.0(jiti@2.6.1))(typescript@5.7.3))(eslint@9.35.0(jiti@2.6.1))(typescript@5.7.3))(eslint@9.14.0(jiti@2.6.1))(typescript@5.7.2): dependencies: - '@typescript-eslint/utils': 8.43.0(eslint@9.14.0)(typescript@5.7.2) - eslint: 9.14.0 + '@typescript-eslint/utils': 8.43.0(eslint@9.14.0(jiti@2.6.1))(typescript@5.7.2) + eslint: 9.14.0(jiti@2.6.1) optionalDependencies: - '@typescript-eslint/eslint-plugin': 8.43.0(@typescript-eslint/parser@8.43.0(eslint@9.35.0)(typescript@5.7.3))(eslint@9.35.0)(typescript@5.7.3) + '@typescript-eslint/eslint-plugin': 8.43.0(@typescript-eslint/parser@8.43.0(eslint@9.35.0(jiti@2.6.1))(typescript@5.7.3))(eslint@9.35.0(jiti@2.6.1))(typescript@5.7.3) transitivePeerDependencies: - supports-color - typescript - eslint-plugin-jsx-a11y@6.10.2(eslint@9.14.0): + eslint-plugin-jsx-a11y@6.10.2(eslint@9.14.0(jiti@2.6.1)): dependencies: aria-query: 5.3.2 array-includes: 3.1.9 @@ -9020,7 +9361,7 @@ snapshots: axobject-query: 4.1.0 damerau-levenshtein: 1.0.8 emoji-regex: 9.2.2 - eslint: 9.14.0 + eslint: 9.14.0(jiti@2.6.1) hasown: 2.0.2 jsx-ast-utils: 3.3.5 language-tags: 1.0.9 @@ -9029,7 +9370,7 @@ snapshots: safe-regex-test: 1.1.0 string.prototype.includes: 2.0.1 - eslint-plugin-jsx-a11y@6.10.2(eslint@9.35.0): + eslint-plugin-jsx-a11y@6.10.2(eslint@9.35.0(jiti@2.6.1)): dependencies: aria-query: 5.3.2 array-includes: 3.1.9 @@ -9039,7 +9380,7 @@ snapshots: axobject-query: 4.1.0 damerau-levenshtein: 1.0.8 emoji-regex: 9.2.2 - eslint: 9.35.0 + eslint: 9.35.0(jiti@2.6.1) hasown: 2.0.2 jsx-ast-utils: 3.3.5 language-tags: 1.0.9 @@ -9048,31 +9389,31 @@ snapshots: safe-regex-test: 1.1.0 string.prototype.includes: 2.0.1 - eslint-plugin-perfectionist@3.9.1(eslint@9.14.0)(typescript@5.7.2): + eslint-plugin-perfectionist@3.9.1(eslint@9.14.0(jiti@2.6.1))(typescript@5.7.2): dependencies: '@typescript-eslint/types': 8.43.0 - '@typescript-eslint/utils': 8.43.0(eslint@9.14.0)(typescript@5.7.2) - eslint: 9.14.0 + '@typescript-eslint/utils': 8.43.0(eslint@9.14.0(jiti@2.6.1))(typescript@5.7.2) + eslint: 9.14.0(jiti@2.6.1) minimatch: 9.0.5 natural-compare-lite: 1.4.0 transitivePeerDependencies: - supports-color - typescript - eslint-plugin-react-debug@1.16.1(eslint@9.14.0)(typescript@5.7.2): + eslint-plugin-react-debug@1.16.1(eslint@9.14.0(jiti@2.6.1))(typescript@5.7.2): dependencies: - '@eslint-react/ast': 1.16.1(eslint@9.14.0)(typescript@5.7.2) - '@eslint-react/core': 1.16.1(eslint@9.14.0)(typescript@5.7.2) - '@eslint-react/jsx': 1.16.1(eslint@9.14.0)(typescript@5.7.2) - '@eslint-react/shared': 1.16.1(eslint@9.14.0)(typescript@5.7.2) + '@eslint-react/ast': 1.16.1(eslint@9.14.0(jiti@2.6.1))(typescript@5.7.2) + '@eslint-react/core': 1.16.1(eslint@9.14.0(jiti@2.6.1))(typescript@5.7.2) + '@eslint-react/jsx': 1.16.1(eslint@9.14.0(jiti@2.6.1))(typescript@5.7.2) + '@eslint-react/shared': 1.16.1(eslint@9.14.0(jiti@2.6.1))(typescript@5.7.2) '@eslint-react/tools': 1.16.1 - '@eslint-react/types': 1.16.1(eslint@9.14.0)(typescript@5.7.2) - '@eslint-react/var': 1.16.1(eslint@9.14.0)(typescript@5.7.2) + '@eslint-react/types': 1.16.1(eslint@9.14.0(jiti@2.6.1))(typescript@5.7.2) + '@eslint-react/var': 1.16.1(eslint@9.14.0(jiti@2.6.1))(typescript@5.7.2) '@typescript-eslint/scope-manager': 8.43.0 - '@typescript-eslint/type-utils': 8.43.0(eslint@9.14.0)(typescript@5.7.2) + '@typescript-eslint/type-utils': 8.43.0(eslint@9.14.0(jiti@2.6.1))(typescript@5.7.2) '@typescript-eslint/types': 8.43.0 - '@typescript-eslint/utils': 8.43.0(eslint@9.14.0)(typescript@5.7.2) - eslint: 9.14.0 + '@typescript-eslint/utils': 8.43.0(eslint@9.14.0(jiti@2.6.1))(typescript@5.7.2) + eslint: 9.14.0(jiti@2.6.1) string-ts: 2.2.1 ts-pattern: 5.8.0 optionalDependencies: @@ -9080,114 +9421,114 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-plugin-react-dom@1.16.1(eslint@9.14.0)(typescript@5.7.2): + eslint-plugin-react-dom@1.16.1(eslint@9.14.0(jiti@2.6.1))(typescript@5.7.2): dependencies: - '@eslint-react/ast': 1.16.1(eslint@9.14.0)(typescript@5.7.2) - '@eslint-react/core': 1.16.1(eslint@9.14.0)(typescript@5.7.2) - '@eslint-react/jsx': 1.16.1(eslint@9.14.0)(typescript@5.7.2) - '@eslint-react/shared': 1.16.1(eslint@9.14.0)(typescript@5.7.2) + '@eslint-react/ast': 1.16.1(eslint@9.14.0(jiti@2.6.1))(typescript@5.7.2) + '@eslint-react/core': 1.16.1(eslint@9.14.0(jiti@2.6.1))(typescript@5.7.2) + '@eslint-react/jsx': 1.16.1(eslint@9.14.0(jiti@2.6.1))(typescript@5.7.2) + '@eslint-react/shared': 1.16.1(eslint@9.14.0(jiti@2.6.1))(typescript@5.7.2) '@eslint-react/tools': 1.16.1 - '@eslint-react/types': 1.16.1(eslint@9.14.0)(typescript@5.7.2) - '@eslint-react/var': 1.16.1(eslint@9.14.0)(typescript@5.7.2) + '@eslint-react/types': 1.16.1(eslint@9.14.0(jiti@2.6.1))(typescript@5.7.2) + '@eslint-react/var': 1.16.1(eslint@9.14.0(jiti@2.6.1))(typescript@5.7.2) '@typescript-eslint/scope-manager': 8.43.0 '@typescript-eslint/types': 8.43.0 - '@typescript-eslint/utils': 8.43.0(eslint@9.14.0)(typescript@5.7.2) - eslint: 9.14.0 + '@typescript-eslint/utils': 8.43.0(eslint@9.14.0(jiti@2.6.1))(typescript@5.7.2) + eslint: 9.14.0(jiti@2.6.1) ts-pattern: 5.8.0 optionalDependencies: typescript: 5.7.2 transitivePeerDependencies: - supports-color - eslint-plugin-react-hooks-extra@1.16.1(eslint@9.14.0)(typescript@5.7.2): + eslint-plugin-react-hooks-extra@1.16.1(eslint@9.14.0(jiti@2.6.1))(typescript@5.7.2): dependencies: - '@eslint-react/ast': 1.16.1(eslint@9.14.0)(typescript@5.7.2) - '@eslint-react/core': 1.16.1(eslint@9.14.0)(typescript@5.7.2) - '@eslint-react/jsx': 1.16.1(eslint@9.14.0)(typescript@5.7.2) - '@eslint-react/shared': 1.16.1(eslint@9.14.0)(typescript@5.7.2) + '@eslint-react/ast': 1.16.1(eslint@9.14.0(jiti@2.6.1))(typescript@5.7.2) + '@eslint-react/core': 1.16.1(eslint@9.14.0(jiti@2.6.1))(typescript@5.7.2) + '@eslint-react/jsx': 1.16.1(eslint@9.14.0(jiti@2.6.1))(typescript@5.7.2) + '@eslint-react/shared': 1.16.1(eslint@9.14.0(jiti@2.6.1))(typescript@5.7.2) '@eslint-react/tools': 1.16.1 - '@eslint-react/types': 1.16.1(eslint@9.14.0)(typescript@5.7.2) - '@eslint-react/var': 1.16.1(eslint@9.14.0)(typescript@5.7.2) + '@eslint-react/types': 1.16.1(eslint@9.14.0(jiti@2.6.1))(typescript@5.7.2) + '@eslint-react/var': 1.16.1(eslint@9.14.0(jiti@2.6.1))(typescript@5.7.2) '@typescript-eslint/scope-manager': 8.43.0 - '@typescript-eslint/type-utils': 8.43.0(eslint@9.14.0)(typescript@5.7.2) + '@typescript-eslint/type-utils': 8.43.0(eslint@9.14.0(jiti@2.6.1))(typescript@5.7.2) '@typescript-eslint/types': 8.43.0 - '@typescript-eslint/utils': 8.43.0(eslint@9.14.0)(typescript@5.7.2) - eslint: 9.14.0 + '@typescript-eslint/utils': 8.43.0(eslint@9.14.0(jiti@2.6.1))(typescript@5.7.2) + eslint: 9.14.0(jiti@2.6.1) ts-pattern: 5.8.0 optionalDependencies: typescript: 5.7.2 transitivePeerDependencies: - supports-color - eslint-plugin-react-hooks@5.0.0(eslint@9.14.0): + eslint-plugin-react-hooks@5.0.0(eslint@9.14.0(jiti@2.6.1)): dependencies: - eslint: 9.14.0 + eslint: 9.14.0(jiti@2.6.1) - eslint-plugin-react-hooks@5.2.0(eslint@9.35.0): + eslint-plugin-react-hooks@5.2.0(eslint@9.35.0(jiti@2.6.1)): dependencies: - eslint: 9.35.0 + eslint: 9.35.0(jiti@2.6.1) - eslint-plugin-react-naming-convention@1.16.1(eslint@9.14.0)(typescript@5.7.2): + eslint-plugin-react-naming-convention@1.16.1(eslint@9.14.0(jiti@2.6.1))(typescript@5.7.2): dependencies: - '@eslint-react/ast': 1.16.1(eslint@9.14.0)(typescript@5.7.2) - '@eslint-react/core': 1.16.1(eslint@9.14.0)(typescript@5.7.2) - '@eslint-react/jsx': 1.16.1(eslint@9.14.0)(typescript@5.7.2) - '@eslint-react/shared': 1.16.1(eslint@9.14.0)(typescript@5.7.2) + '@eslint-react/ast': 1.16.1(eslint@9.14.0(jiti@2.6.1))(typescript@5.7.2) + '@eslint-react/core': 1.16.1(eslint@9.14.0(jiti@2.6.1))(typescript@5.7.2) + '@eslint-react/jsx': 1.16.1(eslint@9.14.0(jiti@2.6.1))(typescript@5.7.2) + '@eslint-react/shared': 1.16.1(eslint@9.14.0(jiti@2.6.1))(typescript@5.7.2) '@eslint-react/tools': 1.16.1 - '@eslint-react/types': 1.16.1(eslint@9.14.0)(typescript@5.7.2) + '@eslint-react/types': 1.16.1(eslint@9.14.0(jiti@2.6.1))(typescript@5.7.2) '@typescript-eslint/scope-manager': 8.43.0 - '@typescript-eslint/type-utils': 8.43.0(eslint@9.14.0)(typescript@5.7.2) + '@typescript-eslint/type-utils': 8.43.0(eslint@9.14.0(jiti@2.6.1))(typescript@5.7.2) '@typescript-eslint/types': 8.43.0 - '@typescript-eslint/utils': 8.43.0(eslint@9.14.0)(typescript@5.7.2) - eslint: 9.14.0 + '@typescript-eslint/utils': 8.43.0(eslint@9.14.0(jiti@2.6.1))(typescript@5.7.2) + eslint: 9.14.0(jiti@2.6.1) ts-pattern: 5.8.0 optionalDependencies: typescript: 5.7.2 transitivePeerDependencies: - supports-color - eslint-plugin-react-web-api@1.16.1(eslint@9.14.0)(typescript@5.7.2): + eslint-plugin-react-web-api@1.16.1(eslint@9.14.0(jiti@2.6.1))(typescript@5.7.2): dependencies: - '@eslint-react/ast': 1.16.1(eslint@9.14.0)(typescript@5.7.2) - '@eslint-react/core': 1.16.1(eslint@9.14.0)(typescript@5.7.2) - '@eslint-react/jsx': 1.16.1(eslint@9.14.0)(typescript@5.7.2) - '@eslint-react/shared': 1.16.1(eslint@9.14.0)(typescript@5.7.2) + '@eslint-react/ast': 1.16.1(eslint@9.14.0(jiti@2.6.1))(typescript@5.7.2) + '@eslint-react/core': 1.16.1(eslint@9.14.0(jiti@2.6.1))(typescript@5.7.2) + '@eslint-react/jsx': 1.16.1(eslint@9.14.0(jiti@2.6.1))(typescript@5.7.2) + '@eslint-react/shared': 1.16.1(eslint@9.14.0(jiti@2.6.1))(typescript@5.7.2) '@eslint-react/tools': 1.16.1 - '@eslint-react/types': 1.16.1(eslint@9.14.0)(typescript@5.7.2) - '@eslint-react/var': 1.16.1(eslint@9.14.0)(typescript@5.7.2) + '@eslint-react/types': 1.16.1(eslint@9.14.0(jiti@2.6.1))(typescript@5.7.2) + '@eslint-react/var': 1.16.1(eslint@9.14.0(jiti@2.6.1))(typescript@5.7.2) '@typescript-eslint/scope-manager': 8.43.0 '@typescript-eslint/types': 8.43.0 - '@typescript-eslint/utils': 8.43.0(eslint@9.14.0)(typescript@5.7.2) + '@typescript-eslint/utils': 8.43.0(eslint@9.14.0(jiti@2.6.1))(typescript@5.7.2) birecord: 0.1.1 - eslint: 9.14.0 + eslint: 9.14.0(jiti@2.6.1) ts-pattern: 5.8.0 optionalDependencies: typescript: 5.7.2 transitivePeerDependencies: - supports-color - eslint-plugin-react-x@1.16.1(eslint@9.14.0)(typescript@5.7.2): + eslint-plugin-react-x@1.16.1(eslint@9.14.0(jiti@2.6.1))(typescript@5.7.2): dependencies: - '@eslint-react/ast': 1.16.1(eslint@9.14.0)(typescript@5.7.2) - '@eslint-react/core': 1.16.1(eslint@9.14.0)(typescript@5.7.2) - '@eslint-react/jsx': 1.16.1(eslint@9.14.0)(typescript@5.7.2) - '@eslint-react/shared': 1.16.1(eslint@9.14.0)(typescript@5.7.2) + '@eslint-react/ast': 1.16.1(eslint@9.14.0(jiti@2.6.1))(typescript@5.7.2) + '@eslint-react/core': 1.16.1(eslint@9.14.0(jiti@2.6.1))(typescript@5.7.2) + '@eslint-react/jsx': 1.16.1(eslint@9.14.0(jiti@2.6.1))(typescript@5.7.2) + '@eslint-react/shared': 1.16.1(eslint@9.14.0(jiti@2.6.1))(typescript@5.7.2) '@eslint-react/tools': 1.16.1 - '@eslint-react/types': 1.16.1(eslint@9.14.0)(typescript@5.7.2) - '@eslint-react/var': 1.16.1(eslint@9.14.0)(typescript@5.7.2) + '@eslint-react/types': 1.16.1(eslint@9.14.0(jiti@2.6.1))(typescript@5.7.2) + '@eslint-react/var': 1.16.1(eslint@9.14.0(jiti@2.6.1))(typescript@5.7.2) '@typescript-eslint/scope-manager': 8.43.0 - '@typescript-eslint/type-utils': 8.43.0(eslint@9.14.0)(typescript@5.7.2) + '@typescript-eslint/type-utils': 8.43.0(eslint@9.14.0(jiti@2.6.1))(typescript@5.7.2) '@typescript-eslint/types': 8.43.0 - '@typescript-eslint/utils': 8.43.0(eslint@9.14.0)(typescript@5.7.2) - eslint: 9.14.0 - is-immutable-type: 5.0.0(eslint@9.14.0)(typescript@5.7.2) + '@typescript-eslint/utils': 8.43.0(eslint@9.14.0(jiti@2.6.1))(typescript@5.7.2) + eslint: 9.14.0(jiti@2.6.1) + is-immutable-type: 5.0.0(eslint@9.14.0(jiti@2.6.1))(typescript@5.7.2) ts-pattern: 5.8.0 optionalDependencies: typescript: 5.7.2 transitivePeerDependencies: - supports-color - eslint-plugin-react@7.37.5(eslint@9.35.0): + eslint-plugin-react@7.37.5(eslint@9.35.0(jiti@2.6.1)): dependencies: array-includes: 3.1.9 array.prototype.findlast: 1.2.5 @@ -9195,7 +9536,7 @@ snapshots: array.prototype.tosorted: 1.1.4 doctrine: 2.1.0 es-iterator-helpers: 1.2.1 - eslint: 9.35.0 + eslint: 9.35.0(jiti@2.6.1) estraverse: 5.3.0 hasown: 2.0.2 jsx-ast-utils: 3.3.5 @@ -9209,12 +9550,12 @@ snapshots: string.prototype.matchall: 4.0.12 string.prototype.repeat: 1.0.0 - eslint-plugin-regexp@2.6.0(eslint@9.14.0): + eslint-plugin-regexp@2.6.0(eslint@9.14.0(jiti@2.6.1)): dependencies: - '@eslint-community/eslint-utils': 4.9.0(eslint@9.14.0) + '@eslint-community/eslint-utils': 4.9.0(eslint@9.14.0(jiti@2.6.1)) '@eslint-community/regexpp': 4.12.1 comment-parser: 1.4.1 - eslint: 9.14.0 + eslint: 9.14.0(jiti@2.6.1) jsdoc-type-pratt-parser: 4.8.0 refa: 0.12.1 regexp-ast-analysis: 0.7.1 @@ -9229,9 +9570,9 @@ snapshots: eslint-visitor-keys@4.2.1: {} - eslint@9.14.0: + eslint@9.14.0(jiti@2.6.1): dependencies: - '@eslint-community/eslint-utils': 4.9.0(eslint@9.14.0) + '@eslint-community/eslint-utils': 4.9.0(eslint@9.14.0(jiti@2.6.1)) '@eslint-community/regexpp': 4.12.1 '@eslint/config-array': 0.18.0 '@eslint/core': 0.7.0 @@ -9266,12 +9607,14 @@ snapshots: natural-compare: 1.4.0 optionator: 0.9.4 text-table: 0.2.0 + optionalDependencies: + jiti: 2.6.1 transitivePeerDependencies: - supports-color - eslint@9.35.0: + eslint@9.35.0(jiti@2.6.1): dependencies: - '@eslint-community/eslint-utils': 4.9.0(eslint@9.35.0) + '@eslint-community/eslint-utils': 4.9.0(eslint@9.35.0(jiti@2.6.1)) '@eslint-community/regexpp': 4.12.1 '@eslint/config-array': 0.21.0 '@eslint/config-helpers': 0.3.1 @@ -9306,6 +9649,8 @@ snapshots: minimatch: 3.1.2 natural-compare: 1.4.0 optionator: 0.9.4 + optionalDependencies: + jiti: 2.6.1 transitivePeerDependencies: - supports-color @@ -9496,6 +9841,8 @@ snapshots: dependencies: fetch-blob: 3.2.0 + fraction.js@4.3.7: {} + fs-extra@7.0.1: dependencies: graceful-fs: 4.2.11 @@ -9813,10 +10160,10 @@ snapshots: is-hexadecimal@2.0.1: {} - is-immutable-type@5.0.0(eslint@9.14.0)(typescript@5.7.2): + is-immutable-type@5.0.0(eslint@9.14.0(jiti@2.6.1))(typescript@5.7.2): dependencies: - '@typescript-eslint/type-utils': 8.43.0(eslint@9.14.0)(typescript@5.7.2) - eslint: 9.14.0 + '@typescript-eslint/type-utils': 8.43.0(eslint@9.14.0(jiti@2.6.1))(typescript@5.7.2) + eslint: 9.14.0(jiti@2.6.1) ts-api-utils: 1.4.3(typescript@5.7.2) ts-declaration-location: 1.0.7(typescript@5.7.2) typescript: 5.7.2 @@ -9912,6 +10259,8 @@ snapshots: has-symbols: 1.1.0 set-function-name: 2.0.2 + jiti@2.6.1: {} + jose@5.9.6: {} joycon@3.1.1: {} @@ -10014,6 +10363,55 @@ snapshots: '@libsql/linux-x64-musl': 0.4.7 '@libsql/win32-x64-msvc': 0.4.7 + lightningcss-android-arm64@1.30.2: + optional: true + + lightningcss-darwin-arm64@1.30.2: + optional: true + + lightningcss-darwin-x64@1.30.2: + optional: true + + lightningcss-freebsd-x64@1.30.2: + optional: true + + lightningcss-linux-arm-gnueabihf@1.30.2: + optional: true + + lightningcss-linux-arm64-gnu@1.30.2: + optional: true + + lightningcss-linux-arm64-musl@1.30.2: + optional: true + + lightningcss-linux-x64-gnu@1.30.2: + optional: true + + lightningcss-linux-x64-musl@1.30.2: + optional: true + + lightningcss-win32-arm64-msvc@1.30.2: + optional: true + + lightningcss-win32-x64-msvc@1.30.2: + optional: true + + lightningcss@1.30.2: + dependencies: + detect-libc: 2.0.4 + optionalDependencies: + lightningcss-android-arm64: 1.30.2 + lightningcss-darwin-arm64: 1.30.2 + lightningcss-darwin-x64: 1.30.2 + lightningcss-freebsd-x64: 1.30.2 + lightningcss-linux-arm-gnueabihf: 1.30.2 + lightningcss-linux-arm64-gnu: 1.30.2 + lightningcss-linux-arm64-musl: 1.30.2 + lightningcss-linux-x64-gnu: 1.30.2 + lightningcss-linux-x64-musl: 1.30.2 + lightningcss-win32-arm64-msvc: 1.30.2 + lightningcss-win32-x64-msvc: 1.30.2 + lines-and-columns@1.2.4: {} locate-path@5.0.0: @@ -10044,6 +10442,10 @@ snapshots: dependencies: '@jridgewell/sourcemap-codec': 1.5.5 + magic-string@0.30.21: + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + make-dir@3.1.0: dependencies: semver: 6.3.1 @@ -10460,6 +10862,8 @@ snapshots: fetch-blob: 3.2.0 formdata-polyfill: 4.0.10 + node-releases@2.0.27: {} + noms@0.0.0: dependencies: inherits: 2.0.4 @@ -10467,6 +10871,8 @@ snapshots: normalize-path@3.0.0: {} + normalize-range@0.1.2: {} + normalize-url@8.1.0: {} npm-run-path@4.0.1: @@ -10792,6 +11198,8 @@ snapshots: possible-typed-array-names@1.1.0: {} + postcss-value-parser@4.2.0: {} + postcss@8.4.31: dependencies: nanoid: 3.3.11 @@ -11469,6 +11877,10 @@ snapshots: tabbable@6.2.0: {} + tailwindcss@4.1.17: {} + + tapable@2.3.0: {} + tar-stream@3.1.7: dependencies: b4a: 1.7.1 @@ -11621,11 +12033,11 @@ snapshots: possible-typed-array-names: 1.1.0 reflect.getprototypeof: 1.0.10 - typescript-eslint@8.14.0(eslint@9.14.0)(typescript@5.7.2): + typescript-eslint@8.14.0(eslint@9.14.0(jiti@2.6.1))(typescript@5.7.2): dependencies: - '@typescript-eslint/eslint-plugin': 8.14.0(@typescript-eslint/parser@8.14.0(eslint@9.14.0)(typescript@5.7.2))(eslint@9.14.0)(typescript@5.7.2) - '@typescript-eslint/parser': 8.14.0(eslint@9.14.0)(typescript@5.7.2) - '@typescript-eslint/utils': 8.14.0(eslint@9.14.0)(typescript@5.7.2) + '@typescript-eslint/eslint-plugin': 8.14.0(@typescript-eslint/parser@8.14.0(eslint@9.14.0(jiti@2.6.1))(typescript@5.7.2))(eslint@9.14.0(jiti@2.6.1))(typescript@5.7.2) + '@typescript-eslint/parser': 8.14.0(eslint@9.14.0(jiti@2.6.1))(typescript@5.7.2) + '@typescript-eslint/utils': 8.14.0(eslint@9.14.0(jiti@2.6.1))(typescript@5.7.2) optionalDependencies: typescript: 5.7.2 transitivePeerDependencies: @@ -11703,6 +12115,12 @@ snapshots: untildify@4.0.0: {} + update-browserslist-db@1.1.4(browserslist@4.27.0): + dependencies: + browserslist: 4.27.0 + escalade: 3.2.0 + picocolors: 1.1.1 + uri-js@4.4.1: dependencies: punycode: 2.3.1 @@ -11731,13 +12149,13 @@ snapshots: '@types/unist': 3.0.3 unist-util-stringify-position: 4.0.0 - vite-node@3.2.4(@types/node@22.18.1)(sass@1.77.4)(tsx@4.19.2): + vite-node@3.2.4(@types/node@22.18.1)(jiti@2.6.1)(lightningcss@1.30.2)(sass@1.77.4)(tsx@4.19.2): dependencies: cac: 6.7.14 debug: 4.4.1 es-module-lexer: 1.7.0 pathe: 2.0.3 - vite: 7.1.5(@types/node@22.18.1)(sass@1.77.4)(tsx@4.19.2) + vite: 7.1.5(@types/node@22.18.1)(jiti@2.6.1)(lightningcss@1.30.2)(sass@1.77.4)(tsx@4.19.2) transitivePeerDependencies: - '@types/node' - jiti @@ -11752,18 +12170,18 @@ snapshots: - tsx - yaml - vite-tsconfig-paths@5.1.4(typescript@5.7.3)(vite@7.1.5(@types/node@22.18.1)(sass@1.77.4)(tsx@4.19.2)): + vite-tsconfig-paths@5.1.4(typescript@5.7.3)(vite@7.1.5(@types/node@22.18.1)(jiti@2.6.1)(lightningcss@1.30.2)(sass@1.77.4)(tsx@4.19.2)): dependencies: debug: 4.4.1 globrex: 0.1.2 tsconfck: 3.1.6(typescript@5.7.3) optionalDependencies: - vite: 7.1.5(@types/node@22.18.1)(sass@1.77.4)(tsx@4.19.2) + vite: 7.1.5(@types/node@22.18.1)(jiti@2.6.1)(lightningcss@1.30.2)(sass@1.77.4)(tsx@4.19.2) transitivePeerDependencies: - supports-color - typescript - vite@7.1.5(@types/node@22.18.1)(sass@1.77.4)(tsx@4.19.2): + vite@7.1.5(@types/node@22.18.1)(jiti@2.6.1)(lightningcss@1.30.2)(sass@1.77.4)(tsx@4.19.2): dependencies: esbuild: 0.25.9 fdir: 6.5.0(picomatch@4.0.3) @@ -11774,14 +12192,16 @@ snapshots: optionalDependencies: '@types/node': 22.18.1 fsevents: 2.3.3 + jiti: 2.6.1 + lightningcss: 1.30.2 sass: 1.77.4 tsx: 4.19.2 - vitest@3.2.4(@types/debug@4.1.12)(@types/node@22.18.1)(sass@1.77.4)(tsx@4.19.2): + vitest@3.2.4(@types/debug@4.1.12)(@types/node@22.18.1)(jiti@2.6.1)(lightningcss@1.30.2)(sass@1.77.4)(tsx@4.19.2): dependencies: '@types/chai': 5.2.2 '@vitest/expect': 3.2.4 - '@vitest/mocker': 3.2.4(vite@7.1.5(@types/node@22.18.1)(sass@1.77.4)(tsx@4.19.2)) + '@vitest/mocker': 3.2.4(vite@7.1.5(@types/node@22.18.1)(jiti@2.6.1)(lightningcss@1.30.2)(sass@1.77.4)(tsx@4.19.2)) '@vitest/pretty-format': 3.2.4 '@vitest/runner': 3.2.4 '@vitest/snapshot': 3.2.4 @@ -11799,8 +12219,8 @@ snapshots: tinyglobby: 0.2.15 tinypool: 1.1.1 tinyrainbow: 2.0.0 - vite: 7.1.5(@types/node@22.18.1)(sass@1.77.4)(tsx@4.19.2) - vite-node: 3.2.4(@types/node@22.18.1)(sass@1.77.4)(tsx@4.19.2) + vite: 7.1.5(@types/node@22.18.1)(jiti@2.6.1)(lightningcss@1.30.2)(sass@1.77.4)(tsx@4.19.2) + vite-node: 3.2.4(@types/node@22.18.1)(jiti@2.6.1)(lightningcss@1.30.2)(sass@1.77.4)(tsx@4.19.2) why-is-node-running: 2.3.0 optionalDependencies: '@types/debug': 4.1.12