diff --git a/web/.gitignore b/web/.gitignore index 048c5f6485..c013209ae9 100644 --- a/web/.gitignore +++ b/web/.gitignore @@ -8,6 +8,13 @@ # testing /coverage +# playwright e2e +/e2e/.auth/ +/e2e/test-results/ +/playwright-report/ +/blob-report/ +/test-results/ + # next.js /.next/ /out/ diff --git a/web/e2e/README.md b/web/e2e/README.md new file mode 100644 index 0000000000..2c9219b4c3 --- /dev/null +++ b/web/e2e/README.md @@ -0,0 +1,302 @@ +# E2E Testing Guide + +This directory contains End-to-End (E2E) tests for the Dify web application using [Playwright](https://playwright.dev/). + +## Quick Start + +### 1. Setup + +```bash +# Install dependencies (if not already done) +pnpm install + +# Install Playwright browsers +pnpm exec playwright install chromium +``` + +### 2. Configure Environment (Optional) + +Add E2E test configuration to your `web/.env.local` file: + +```env +# E2E Test Configuration +# Base URL of the frontend (optional, defaults to http://localhost:3000) +E2E_BASE_URL=https://test.example.com + +# Skip starting dev server (use existing deployed server) +E2E_SKIP_WEB_SERVER=true + +# API URL (optional, defaults to http://localhost:5001/console/api) +NEXT_PUBLIC_API_PREFIX=http://localhost:5001/console/api +``` + +### 3. Run Tests + +```bash +# Run all E2E tests +pnpm test:e2e + +# Run tests with UI (interactive mode) +pnpm test:e2e:ui + +# Run tests with browser visible +pnpm test:e2e:headed + +# Run tests in debug mode +pnpm test:e2e:debug + +# View test report +pnpm test:e2e:report +``` + +## Project Structure + +``` +web/ +├── .env.local # Environment config (includes E2E variables) +├── playwright.config.ts # Playwright configuration +└── e2e/ + ├── fixtures/ # Test fixtures (extended test objects) + │ └── index.ts # Main fixtures with page objects + ├── pages/ # Page Object Models (POM) + │ ├── base.page.ts # Base class for all page objects + │ ├── signin.page.ts # Sign-in page interactions + │ ├── apps.page.ts # Apps listing page interactions + │ ├── workflow.page.ts # Workflow editor interactions + │ └── index.ts # Page objects export + ├── tests/ # Test files (*.spec.ts) + ├── utils/ # Test utilities + │ ├── index.ts # Utils export + │ ├── test-helpers.ts # Common helper functions + │ └── api-helpers.ts # API-level test helpers + ├── .auth/ # Authentication state (gitignored) + ├── global.setup.ts # Authentication setup + ├── global.teardown.ts # Cleanup after tests + └── README.md # This file +``` + +## Writing Tests + +### Using Page Objects + +```typescript +import { test, expect } from '../fixtures' + +test('create a new app', async ({ appsPage }) => { + await appsPage.goto() + await appsPage.createApp({ + name: 'My Test App', + type: 'chatbot', + }) + await appsPage.expectAppExists('My Test App') +}) +``` + +### Using Test Helpers + +```typescript +import { test, expect } from '../fixtures' +import { generateTestId, waitForNetworkIdle } from '../utils/test-helpers' + +test('search functionality', async ({ appsPage }) => { + const uniqueName = generateTestId('app') + // ... test logic +}) +``` + +### Test Data Cleanup + +Always clean up test data to avoid polluting the database: + +```typescript +test('create and delete app', async ({ appsPage }) => { + const appName = generateTestId('test-app') + + // Create + await appsPage.createApp({ name: appName, type: 'chatbot' }) + + // Test assertions + await appsPage.expectAppExists(appName) + + // Cleanup + await appsPage.deleteApp(appName) +}) +``` + +### Skipping Authentication + +For tests that need to verify unauthenticated behavior: + +```typescript +test.describe('unauthenticated tests', () => { + test.use({ storageState: { cookies: [], origins: [] } }) + + test('redirects to login', async ({ page }) => { + await page.goto('/apps') + await expect(page).toHaveURL(/\/signin/) + }) +}) +``` + +## Best Practices + +### 1. Use Page Object Model (POM) + +- Encapsulate page interactions in page objects +- Makes tests more readable and maintainable +- Changes to selectors only need to be updated in one place + +### 2. Use Meaningful Test Names + +```typescript +// Good +test('should display error message for invalid email format', ...) + +// Bad +test('test1', ...) +``` + +### 3. Use Data-TestId Attributes + +When adding elements to the application, use `data-testid` attributes: + +```tsx +// In React component + + +// In test +await page.getByTestId('create-app-button').click() +``` + +### 4. Generate Unique Test Data + +```typescript +import { generateTestId } from '../utils/test-helpers' + +const appName = generateTestId('my-app') // e.g., "my-app-1732567890123-abc123" +``` + +### 5. Handle Async Operations + +```typescript +// Wait for element +await expect(element).toBeVisible({ timeout: 10000 }) + +// Wait for navigation +await page.waitForURL(/\/apps/) + +// Wait for network +await page.waitForLoadState('networkidle') +``` + +## Creating New Page Objects + +1. Create a new file in `e2e/pages/`: + +```typescript +// e2e/pages/my-feature.page.ts +import type { Page, Locator } from '@playwright/test' +import { BasePage } from './base.page' + +export class MyFeaturePage extends BasePage { + readonly myElement: Locator + + constructor(page: Page) { + super(page) + this.myElement = page.getByTestId('my-element') + } + + get path(): string { + return '/my-feature' + } + + async doSomething(): Promise { + await this.myElement.click() + } +} +``` + +2. Export from `e2e/pages/index.ts`: + +```typescript +export { MyFeaturePage } from './my-feature.page' +``` + +3. Add to fixtures in `e2e/fixtures/index.ts`: + +```typescript +import { MyFeaturePage } from '../pages/my-feature.page' + +type DifyFixtures = { + // ... existing fixtures + myFeaturePage: MyFeaturePage +} + +export const test = base.extend({ + // ... existing fixtures + myFeaturePage: async ({ page }, use) => { + await use(new MyFeaturePage(page)) + }, +}) +``` + +## Debugging + +### Visual Debugging + +```bash +# Open Playwright UI +pnpm test:e2e:ui + +# Run with visible browser +pnpm test:e2e:headed + +# Debug mode with inspector +pnpm test:e2e:debug +``` + +### Traces and Screenshots + +Failed tests automatically capture: +- Screenshots +- Video recordings +- Trace files + +View them: +```bash +pnpm test:e2e:report +``` + +### Manual Trace Viewing + +```bash +pnpm exec playwright show-trace e2e/test-results/path-to-trace.zip +``` + +## Troubleshooting + +### Tests timeout waiting for elements + +1. Check if selectors are correct +2. Increase timeout: `{ timeout: 30000 }` +3. Add explicit waits: `await page.waitForSelector(...)` + +### Authentication issues + +1. Make sure global.setup.ts has completed successfully +2. For deployed environments, ensure E2E_BASE_URL matches your cookie domain +3. Clear auth state: `rm -rf e2e/.auth/` + +### Flaky tests + +1. Add explicit waits for async operations +2. Use `test.slow()` for inherently slow tests +3. Add retry logic for unstable operations + +## Resources + +- [Playwright Documentation](https://playwright.dev/docs/intro) +- [Page Object Model Pattern](https://playwright.dev/docs/pom) +- [Best Practices](https://playwright.dev/docs/best-practices) +- [Debugging Guide](https://playwright.dev/docs/debug) + diff --git a/web/e2e/fixtures/index.ts b/web/e2e/fixtures/index.ts new file mode 100644 index 0000000000..c92fa637ca --- /dev/null +++ b/web/e2e/fixtures/index.ts @@ -0,0 +1,55 @@ +import { test as base, expect } from '@playwright/test' +import { AppsPage } from '../pages/apps.page' +import { SignInPage } from '../pages/signin.page' +import { WorkflowPage } from '../pages/workflow.page' + +/** + * Extended test fixtures for Dify E2E tests + * + * This module provides custom fixtures that inject page objects + * into tests, making it easier to write maintainable tests. + * + * @example + * ```typescript + * import { test, expect } from '@/e2e/fixtures' + * + * test('can create new app', async ({ appsPage }) => { + * await appsPage.goto() + * await appsPage.createApp('My Test App') + * await expect(appsPage.appCard('My Test App')).toBeVisible() + * }) + * ``` + */ + +// Define custom fixtures type +type DifyFixtures = { + appsPage: AppsPage + signInPage: SignInPage + workflowPage: WorkflowPage +} + +/** + * Extended test object with Dify-specific fixtures + */ +export const test = base.extend({ + // Apps page fixture + appsPage: async ({ page }, run) => { + const appsPage = new AppsPage(page) + await run(appsPage) + }, + + // Sign in page fixture + signInPage: async ({ page }, run) => { + const signInPage = new SignInPage(page) + await run(signInPage) + }, + + // Workflow page fixture + workflowPage: async ({ page }, run) => { + const workflowPage = new WorkflowPage(page) + await run(workflowPage) + }, +}) + +// Re-export expect for convenience +export { expect } diff --git a/web/e2e/global.setup.ts b/web/e2e/global.setup.ts new file mode 100644 index 0000000000..ec7001ddcd --- /dev/null +++ b/web/e2e/global.setup.ts @@ -0,0 +1,78 @@ +import { expect, test as setup } from '@playwright/test' +import fs from 'node:fs' +import path from 'node:path' + +const authFile = path.join(__dirname, '.auth/user.json') + +/** + * Global setup for E2E tests + * + * This runs before all tests and handles authentication. + * The authenticated state is saved and reused across all tests. + * + * Based on signin implementation: + * - web/app/signin/components/mail-and-password-auth.tsx + */ +setup('authenticate', async ({ page }) => { + // Get test user credentials from environment + const email = process.env.NEXT_PUBLIC_E2E_USER_EMAIL + const password = process.env.NEXT_PUBLIC_E2E_USER_PASSWORD + + if (!email || !password) { + console.warn( + '⚠️ NEXT_PUBLIC_E2E_USER_EMAIL or NEXT_PUBLIC_E2E_USER_PASSWORD not set.', + 'Creating empty auth state. Tests requiring auth will fail.', + ) + // Create empty auth state directory if it doesn't exist + const authDir = path.dirname(authFile) + if (!fs.existsSync(authDir)) + fs.mkdirSync(authDir, { recursive: true }) + + // Save empty state + await page.context().storageState({ path: authFile }) + return + } + + // Navigate to login page + await page.goto('/signin') + + // Wait for the page to load + await page.waitForLoadState('networkidle') + + // Fill in login form using actual Dify selectors + // Email input has id="email" + await page.locator('#email').fill(email) + // Password input has id="password" + await page.locator('#password').fill(password) + + // Wait for button to be enabled (form validation passes) + const signInButton = page.getByRole('button', { name: 'Sign in' }) + await expect(signInButton).toBeEnabled({ timeout: 5000 }) + + // Click login button and wait for the login API response + const [response] = await Promise.all([ + page.waitForResponse(resp => + resp.url().includes('/login') && resp.request().method() === 'POST', + ), + signInButton.click(), + ]) + + // Check if login request was successful + const status = response.status() + if (status === 200) { + // Redirect response means login successful (server-side redirect) + console.log('✅ Login successful (redirect response)') + // Wait for navigation to complete (redirect to /apps) + // See: mail-and-password-auth.tsx line 71 - router.replace(redirectUrl || '/apps') + await expect(page).toHaveURL(/\/apps/, { timeout: 30000 }) + } + else { + // Other status codes indicate failure + throw new Error(`Login request failed with status ${status}`) + } + + // Save authenticated state + await page.context().storageState({ path: authFile }) + + console.log('✅ Authentication successful, state saved.') +}) diff --git a/web/e2e/global.teardown.ts b/web/e2e/global.teardown.ts new file mode 100644 index 0000000000..c4187b86ac --- /dev/null +++ b/web/e2e/global.teardown.ts @@ -0,0 +1,199 @@ +import { request, test as teardown } from '@playwright/test' + +/** + * Global teardown for E2E tests + * + * This runs after all tests complete. + * Cleans up test data created during E2E tests. + * + * Environment variables: + * - NEXT_PUBLIC_API_PREFIX: API URL (default: http://localhost:5001/console/api) + * + * Based on Dify API: + * - GET /apps - list all apps + * - DELETE /apps/{id} - delete an app + * - GET /datasets - list all datasets + * - DELETE /datasets/{id} - delete a dataset + */ + +// API base URL with fallback for local development +// Ensure baseURL ends with '/' for proper path concatenation +const API_BASE_URL = (process.env.NEXT_PUBLIC_API_PREFIX || 'http://localhost:5001/console/api').replace(/\/?$/, '/') + +// Test data prefixes - used to identify test-created data +// Should match the prefix used in generateTestId() +const TEST_DATA_PREFIXES = ['e2e-', 'test-'] + +/** + * Check if a name matches test data pattern + */ +function isTestData(name: string): boolean { + return TEST_DATA_PREFIXES.some(prefix => name.toLowerCase().startsWith(prefix)) +} + +/** + * Delete a single app by ID + */ +async function deleteApp( + context: Awaited>, + app: { id: string, name: string }, +): Promise { + try { + const response = await context.delete(`apps/${app.id}`) + return response.ok() + } + catch { + console.warn(` Failed to delete app "${app.name}"`) + return false + } +} + +/** + * Delete a single dataset by ID + */ +async function deleteDataset( + context: Awaited>, + dataset: { id: string, name: string }, +): Promise { + try { + const response = await context.delete(`datasets/${dataset.id}`) + return response.ok() + } + catch { + console.warn(` Failed to delete dataset "${dataset.name}"`) + return false + } +} + +teardown('cleanup test data', async () => { + console.log('🧹 Starting global teardown...') + + const fs = await import('node:fs') + const authPath = 'e2e/.auth/user.json' + + // Check if auth state file exists and has cookies + if (!fs.existsSync(authPath)) { + console.warn('⚠️ Auth state file not found, skipping cleanup') + console.log('🧹 Global teardown complete.') + return + } + + let csrfToken = '' + try { + const authState = JSON.parse(fs.readFileSync(authPath, 'utf-8')) + if (!authState.cookies || authState.cookies.length === 0) { + console.warn('⚠️ Auth state is empty (no cookies), skipping cleanup') + console.log('🧹 Global teardown complete.') + return + } + // Extract CSRF token from cookies for API requests + const csrfCookie = authState.cookies.find((c: { name: string }) => c.name === 'csrf_token') + csrfToken = csrfCookie?.value || '' + } + catch { + console.warn('⚠️ Failed to read auth state, skipping cleanup') + console.log('🧹 Global teardown complete.') + return + } + + try { + // Create API request context with auth state and CSRF header + const context = await request.newContext({ + baseURL: API_BASE_URL, + storageState: authPath, + extraHTTPHeaders: { + 'X-CSRF-Token': csrfToken, + }, + }) + + // Clean up test apps + const appsDeleted = await cleanupTestApps(context) + console.log(` 📱 Deleted ${appsDeleted} test apps`) + + // Clean up test datasets + const datasetsDeleted = await cleanupTestDatasets(context) + console.log(` 📚 Deleted ${datasetsDeleted} test datasets`) + + await context.dispose() + } + catch (error) { + // Don't fail teardown if cleanup fails - just log the error + console.warn('⚠️ Teardown cleanup encountered errors:', error) + } + + // Clean up auth state file in CI environment for security + // In local development, keep it for faster iteration (skip re-login) + if (process.env.CI) { + try { + fs.unlinkSync(authPath) + console.log(' 🔐 Auth state file deleted (CI mode)') + } + catch { + // Ignore if file doesn't exist or can't be deleted + } + } + + console.log('🧹 Global teardown complete.') +}) + +/** + * Clean up test apps + * Deletes all apps with names starting with test prefixes + */ +async function cleanupTestApps(context: Awaited>): Promise { + try { + // Fetch all apps - API: GET /apps + const response = await context.get('apps', { + params: { page: 1, limit: 100 }, + }) + + if (!response.ok()) { + console.warn(' Failed to fetch apps list:', response.status(), response.url()) + return 0 + } + + const data = await response.json() + const apps: Array<{ id: string, name: string }> = data.data || [] + + // Filter test apps and delete them + const testApps = apps.filter(app => isTestData(app.name)) + const results = await Promise.all(testApps.map(app => deleteApp(context, app))) + + return results.filter(Boolean).length + } + catch (error) { + console.warn(' Error cleaning up apps:', error) + return 0 + } +} + +/** + * Clean up test datasets (knowledge bases) + * Deletes all datasets with names starting with test prefixes + */ +async function cleanupTestDatasets(context: Awaited>): Promise { + try { + // Fetch all datasets - API: GET /datasets + const response = await context.get('datasets', { + params: { page: 1, limit: 100 }, + }) + + if (!response.ok()) { + console.warn(' Failed to fetch datasets list:', response.status(), response.url()) + return 0 + } + + const data = await response.json() + const datasets: Array<{ id: string, name: string }> = data.data || [] + + // Filter test datasets and delete them + const testDatasets = datasets.filter(dataset => isTestData(dataset.name)) + const results = await Promise.all(testDatasets.map(dataset => deleteDataset(context, dataset))) + + return results.filter(Boolean).length + } + catch (error) { + console.warn(' Error cleaning up datasets:', error) + return 0 + } +} diff --git a/web/e2e/pages/apps.page.ts b/web/e2e/pages/apps.page.ts new file mode 100644 index 0000000000..56cd8bd8f0 --- /dev/null +++ b/web/e2e/pages/apps.page.ts @@ -0,0 +1,243 @@ +import type { Locator, Page } from '@playwright/test' +import { expect } from '@playwright/test' +import { BasePage } from './base.page' + +/** + * Apps (Studio) Page Object Model + * + * Handles interactions with the main apps listing page. + * Based on: web/app/components/apps/list.tsx + * web/app/components/apps/new-app-card.tsx + * web/app/components/apps/app-card.tsx + */ +export class AppsPage extends BasePage { + // Main page elements + readonly createFromBlankButton: Locator + readonly createFromTemplateButton: Locator + readonly importDSLButton: Locator + readonly searchInput: Locator + readonly appGrid: Locator + + // Create app modal elements (from create-app-modal/index.tsx) + readonly createAppModal: Locator + readonly appNameInput: Locator + readonly appDescriptionInput: Locator + readonly createButton: Locator + readonly cancelButton: Locator + + // App type selectors in create modal + readonly chatbotType: Locator + readonly completionType: Locator + readonly workflowType: Locator + readonly agentType: Locator + readonly chatflowType: Locator + + // Delete confirmation + readonly deleteConfirmButton: Locator + + constructor(page: Page) { + super(page) + + // Create app card buttons (from new-app-card.tsx) + // t('app.newApp.startFromBlank') = "Create from Blank" + this.createFromBlankButton = page.getByRole('button', { name: 'Create from Blank' }) + // t('app.newApp.startFromTemplate') = "Create from Template" + this.createFromTemplateButton = page.getByRole('button', { name: 'Create from Template' }) + // t('app.importDSL') = "Import DSL file" + this.importDSLButton = page.getByRole('button', { name: /Import DSL/i }) + + // Search input (from list.tsx) + this.searchInput = page.getByPlaceholder(/search/i) + + // App grid container + this.appGrid = page.locator('.grid').first() + + // Create app modal + this.createAppModal = page.locator('[class*="fullscreen-modal"]').or(page.getByRole('dialog')) + + // App name input - placeholder: t('app.newApp.appNamePlaceholder') = "Give your app a name" + this.appNameInput = page.getByPlaceholder('Give your app a name') + + // Description input - placeholder: t('app.newApp.appDescriptionPlaceholder') = "Enter the description of the app" + this.appDescriptionInput = page.getByPlaceholder('Enter the description of the app') + + // Create button - t('app.newApp.Create') = "Create" + this.createButton = page.getByRole('button', { name: 'Create', exact: true }) + this.cancelButton = page.getByRole('button', { name: 'Cancel' }) + + // App type selectors (from create-app-modal) + // These are displayed as clickable cards/buttons + this.chatbotType = page.getByText('Chatbot', { exact: true }) + this.completionType = page.getByText('Completion', { exact: true }).or(page.getByText('Text Generator')) + this.workflowType = page.getByText('Workflow', { exact: true }) + this.agentType = page.getByText('Agent', { exact: true }) + this.chatflowType = page.getByText('Chatflow', { exact: true }) + + // Delete confirmation button + this.deleteConfirmButton = page.getByRole('button', { name: /confirm|delete/i }).last() + } + + get path(): string { + return '/apps' + } + + /** + * Get app card by name + * App cards use AppIcon and display the app name + */ + appCard(name: string): Locator { + return this.appGrid.locator(`div:has-text("${name}")`).first() + } + + /** + * Get app card's more menu button (three dots) + */ + appCardMenu(name: string): Locator { + return this.appCard(name).locator('svg[class*="ri-more"]').or( + this.appCard(name).locator('button:has(svg)').last(), + ) + } + + /** + * Click "Create from Blank" button + */ + async clickCreateFromBlank(): Promise { + await this.createFromBlankButton.click() + await expect(this.createAppModal).toBeVisible({ timeout: 10000 }) + } + + /** + * Click "Create from Template" button + */ + async clickCreateFromTemplate(): Promise { + await this.createFromTemplateButton.click() + } + + /** + * Select app type in create modal + */ + async selectAppType(type: 'chatbot' | 'completion' | 'workflow' | 'agent' | 'chatflow'): Promise { + const typeMap: Record = { + chatbot: this.chatbotType, + completion: this.completionType, + workflow: this.workflowType, + agent: this.agentType, + chatflow: this.chatflowType, + } + await typeMap[type].click() + } + + /** + * Fill app name + */ + async fillAppName(name: string): Promise { + await this.appNameInput.fill(name) + } + + /** + * Fill app description + */ + async fillAppDescription(description: string): Promise { + await this.appDescriptionInput.fill(description) + } + + /** + * Confirm app creation + */ + async confirmCreate(): Promise { + await this.createButton.click() + } + + /** + * Create a new app with full flow + */ + async createApp(options: { + name: string + type?: 'chatbot' | 'completion' | 'workflow' | 'agent' | 'chatflow' + description?: string + }): Promise { + const { name, type = 'chatbot', description } = options + + await this.clickCreateFromBlank() + await this.selectAppType(type) + await this.fillAppName(name) + + if (description) + await this.fillAppDescription(description) + + await this.confirmCreate() + + // Wait for navigation to new app or modal to close + await this.page.waitForURL(/\/app\//, { timeout: 30000 }) + } + + /** + * Search for an app + */ + async searchApp(query: string): Promise { + await this.searchInput.fill(query) + await this.page.waitForTimeout(500) // Debounce + } + + /** + * Open an app by clicking its card + */ + async openApp(name: string): Promise { + await this.appCard(name).click() + await this.waitForNavigation() + } + + /** + * Delete an app by name + */ + async deleteApp(name: string): Promise { + // Hover on app card to show menu + await this.appCard(name).hover() + + // Click more menu (three dots icon) + await this.appCardMenu(name).click() + + // Click delete in menu + // t('common.operation.delete') = "Delete" + await this.page.getByRole('menuitem', { name: 'Delete' }) + .or(this.page.getByText('Delete').last()) + .click() + + // Confirm deletion + await this.deleteConfirmButton.click() + + // Wait for app to be removed + await expect(this.appCard(name)).toBeHidden({ timeout: 10000 }) + } + + /** + * Get count of visible apps + */ + async getAppCount(): Promise { + // Each app card has the app icon and name + return this.appGrid.locator('[class*="app-card"], [class*="rounded-xl"]').count() + } + + /** + * Check if apps list is empty + */ + async isEmpty(): Promise { + // Empty state component is shown when no apps + const emptyState = this.page.locator('[class*="empty"]') + return emptyState.isVisible() + } + + /** + * Verify app exists + */ + async expectAppExists(name: string): Promise { + await expect(this.page.getByText(name).first()).toBeVisible({ timeout: 10000 }) + } + + /** + * Verify app does not exist + */ + async expectAppNotExists(name: string): Promise { + await expect(this.page.getByText(name).first()).toBeHidden({ timeout: 10000 }) + } +} diff --git a/web/e2e/pages/base.page.ts b/web/e2e/pages/base.page.ts new file mode 100644 index 0000000000..472a76e440 --- /dev/null +++ b/web/e2e/pages/base.page.ts @@ -0,0 +1,144 @@ +import type { Locator, Page } from '@playwright/test' +import { expect } from '@playwright/test' + +/** + * Base Page Object Model class + * + * All page objects should extend this class. + * Provides common functionality and patterns for page objects. + */ +export abstract class BasePage { + readonly page: Page + + // Common elements that exist across multiple pages + protected readonly loadingSpinner: Locator + + constructor(page: Page) { + this.page = page + + // Loading spinner - based on web/app/components/base/loading/index.tsx + // Uses SVG with .spin-animation class + this.loadingSpinner = page.locator('.spin-animation') + } + + /** + * Abstract method - each page must define its URL path + */ + abstract get path(): string + + /** + * Navigate to this page + */ + async goto(): Promise { + await this.page.goto(this.path) + await this.waitForPageLoad() + } + + /** + * Wait for page to finish loading + */ + async waitForPageLoad(): Promise { + await this.page.waitForLoadState('networkidle') + // Wait for any loading spinners to disappear + if (await this.loadingSpinner.isVisible()) + await this.loadingSpinner.waitFor({ state: 'hidden', timeout: 30000 }) + } + + /** + * Check if page is currently visible + */ + async isVisible(): Promise { + return this.page.url().includes(this.path) + } + + /** + * Wait for and verify a toast notification + * Toast text is in .system-sm-semibold class + */ + async expectToast(text: string | RegExp): Promise { + const toast = this.page.locator('.system-sm-semibold').filter({ hasText: text }) + await expect(toast).toBeVisible({ timeout: 10000 }) + } + + /** + * Wait for a successful operation toast + * Success toast has bg-toast-success-bg background and RiCheckboxCircleFill icon + */ + async expectSuccessToast(text?: string | RegExp): Promise { + // Success toast contains .text-text-success class (green checkmark icon) + const successIndicator = this.page.locator('.text-text-success') + await expect(successIndicator).toBeVisible({ timeout: 10000 }) + + if (text) { + const toastText = this.page.locator('.system-sm-semibold').filter({ hasText: text }) + await expect(toastText).toBeVisible({ timeout: 10000 }) + } + } + + /** + * Wait for an error toast + * Error toast has bg-toast-error-bg background and RiErrorWarningFill icon + */ + async expectErrorToast(text?: string | RegExp): Promise { + // Error toast contains .text-text-destructive class (red warning icon) + const errorIndicator = this.page.locator('.text-text-destructive') + await expect(errorIndicator).toBeVisible({ timeout: 10000 }) + + if (text) { + const toastText = this.page.locator('.system-sm-semibold').filter({ hasText: text }) + await expect(toastText).toBeVisible({ timeout: 10000 }) + } + } + + /** + * Wait for a warning toast + * Warning toast has bg-toast-warning-bg background + */ + async expectWarningToast(text?: string | RegExp): Promise { + const warningIndicator = this.page.locator('.text-text-warning-secondary') + await expect(warningIndicator).toBeVisible({ timeout: 10000 }) + + if (text) { + const toastText = this.page.locator('.system-sm-semibold').filter({ hasText: text }) + await expect(toastText).toBeVisible({ timeout: 10000 }) + } + } + + /** + * Get the current page title + */ + async getTitle(): Promise { + return this.page.title() + } + + /** + * Take a screenshot of the current page + */ + async screenshot(name: string): Promise { + await this.page.screenshot({ + path: `e2e/test-results/screenshots/${name}.png`, + fullPage: true, + }) + } + + /** + * Wait for navigation to complete + */ + async waitForNavigation(options?: { timeout?: number }): Promise { + await this.page.waitForLoadState('networkidle', options) + } + + /** + * Press keyboard shortcut + */ + async pressShortcut(shortcut: string): Promise { + await this.page.keyboard.press(shortcut) + } + + /** + * Get element by test id (data-testid attribute) + */ + getByTestId(testId: string): Locator { + return this.page.getByTestId(testId) + } +} diff --git a/web/e2e/pages/index.ts b/web/e2e/pages/index.ts new file mode 100644 index 0000000000..5e5be15ef0 --- /dev/null +++ b/web/e2e/pages/index.ts @@ -0,0 +1,10 @@ +/** + * Page Object Models Index + * + * Export all page objects from a single entry point. + */ + +export { BasePage } from './base.page' +export { SignInPage } from './signin.page' +export { AppsPage } from './apps.page' +export { WorkflowPage } from './workflow.page' diff --git a/web/e2e/pages/signin.page.ts b/web/e2e/pages/signin.page.ts new file mode 100644 index 0000000000..5eea92d82f --- /dev/null +++ b/web/e2e/pages/signin.page.ts @@ -0,0 +1,112 @@ +import type { Locator, Page } from '@playwright/test' +import { expect } from '@playwright/test' +import { BasePage } from './base.page' + +/** + * Sign In Page Object Model + * + * Handles all interactions with the login/sign-in page. + * Based on: web/app/signin/components/mail-and-password-auth.tsx + */ +export class SignInPage extends BasePage { + readonly emailInput: Locator + readonly passwordInput: Locator + readonly signInButton: Locator + readonly forgotPasswordLink: Locator + readonly errorMessage: Locator + + constructor(page: Page) { + super(page) + + // Selectors based on actual signin page + // See: web/app/signin/components/mail-and-password-auth.tsx + this.emailInput = page.locator('#email') // id="email" + this.passwordInput = page.locator('#password') // id="password" + this.signInButton = page.getByRole('button', { name: 'Sign in' }) // t('login.signBtn') + this.forgotPasswordLink = page.getByRole('link', { name: /forgot/i }) + this.errorMessage = page.locator('[class*="toast"]').or(page.getByRole('alert')) + } + + get path(): string { + return '/signin' + } + + /** + * Fill in email address + */ + async fillEmail(email: string): Promise { + await this.emailInput.fill(email) + } + + /** + * Fill in password + */ + async fillPassword(password: string): Promise { + await this.passwordInput.fill(password) + } + + /** + * Click sign in button + */ + async clickSignIn(): Promise { + await this.signInButton.click() + } + + /** + * Complete login flow + */ + async login(email: string, password: string): Promise { + await this.fillEmail(email) + await this.fillPassword(password) + await this.clickSignIn() + } + + /** + * Login and wait for redirect to dashboard/apps + */ + async loginAndWaitForRedirect(email: string, password: string): Promise { + await this.login(email, password) + // After successful login, Dify redirects to /apps + await expect(this.page).toHaveURL(/\/apps/, { timeout: 30000 }) + } + + /** + * Verify invalid credentials error is shown + * Error message: t('login.error.invalidEmailOrPassword') = "Invalid email or password." + */ + async expectInvalidCredentialsError(): Promise { + await expect(this.errorMessage.filter({ hasText: /invalid|incorrect|wrong/i })) + .toBeVisible({ timeout: 10000 }) + } + + /** + * Verify email validation error + * Error message: t('login.error.emailInValid') = "Please enter a valid email address" + */ + async expectEmailValidationError(): Promise { + await expect(this.errorMessage.filter({ hasText: /valid email/i })) + .toBeVisible({ timeout: 10000 }) + } + + /** + * Verify password empty error + * Error message: t('login.error.passwordEmpty') = "Password is required" + */ + async expectPasswordEmptyError(): Promise { + await expect(this.errorMessage.filter({ hasText: /password.*required/i })) + .toBeVisible({ timeout: 10000 }) + } + + /** + * Check if user is already logged in (auto-redirected) + */ + async isRedirectedToApps(timeout = 5000): Promise { + try { + await this.page.waitForURL(/\/apps/, { timeout }) + return true + } + catch { + return false + } + } +} diff --git a/web/e2e/pages/workflow.page.ts b/web/e2e/pages/workflow.page.ts new file mode 100644 index 0000000000..a3359336ef --- /dev/null +++ b/web/e2e/pages/workflow.page.ts @@ -0,0 +1,353 @@ +import type { Locator, Page } from '@playwright/test' +import { expect } from '@playwright/test' +import { BasePage } from './base.page' + +/** + * Workflow Editor Page Object Model + * + * Handles interactions with the Dify workflow/canvas editor. + * Based on: web/app/components/workflow/ + * + * Key components: + * - ReactFlow canvas: web/app/components/workflow/index.tsx + * - Run button: web/app/components/workflow/header/run-mode.tsx + * - Publish button: web/app/components/workflow/header/index.tsx + * - Zoom controls: web/app/components/workflow/operator/zoom-in-out.tsx + * - Node panel: web/app/components/workflow/panel/index.tsx + * - Block selector: web/app/components/workflow/block-selector/ + */ +export class WorkflowPage extends BasePage { + // Canvas elements - ReactFlow based (web/app/components/workflow/index.tsx) + readonly canvas: Locator + readonly minimap: Locator + + // Header action buttons (web/app/components/workflow/header/) + readonly runButton: Locator + readonly stopButton: Locator + readonly publishButton: Locator + readonly undoButton: Locator + readonly redoButton: Locator + readonly historyButton: Locator + readonly checklistButton: Locator + + // Zoom controls (web/app/components/workflow/operator/zoom-in-out.tsx) + readonly zoomInButton: Locator + readonly zoomOutButton: Locator + readonly zoomPercentage: Locator + + // Node panel - appears when node is selected (web/app/components/workflow/panel/) + readonly nodeConfigPanel: Locator + readonly envPanel: Locator + readonly versionHistoryPanel: Locator + + // Debug and preview panel (web/app/components/workflow/panel/debug-and-preview/) + readonly debugPreviewPanel: Locator + readonly chatInput: Locator + + // Block selector - for adding nodes (web/app/components/workflow/block-selector/) + readonly blockSelector: Locator + readonly blockSearchInput: Locator + + constructor(page: Page) { + super(page) + + // Canvas - ReactFlow renders with these classes + this.canvas = page.locator('.react-flow') + this.minimap = page.locator('.react-flow__minimap') + + // Run button - shows "Test Run" text with play icon (run-mode.tsx) + // When running, shows "Running" with loading spinner + this.runButton = page.locator('.flex.items-center').filter({ hasText: /Test Run|Running|Listening/ }).first() + this.stopButton = page.locator('button').filter({ has: page.locator('svg.text-text-accent') }).filter({ hasText: '' }).last() + + // Publish button in header (header/index.tsx) + this.publishButton = page.getByRole('button', { name: /Publish|Update/ }) + + // Undo/Redo buttons (header/undo-redo.tsx) + this.undoButton = page.locator('[class*="undo"]').or(page.getByRole('button', { name: 'Undo' })) + this.redoButton = page.locator('[class*="redo"]').or(page.getByRole('button', { name: 'Redo' })) + + // History and checklist buttons (header/run-and-history.tsx) + this.historyButton = page.getByRole('button', { name: /history/i }) + this.checklistButton = page.locator('[class*="checklist"]') + + // Zoom controls at bottom (operator/zoom-in-out.tsx) + // Uses RiZoomInLine and RiZoomOutLine icons + this.zoomInButton = page.locator('.react-flow').locator('..').locator('button').filter({ has: page.locator('[class*="zoom-in"]') }).first() + .or(page.locator('svg[class*="RiZoomInLine"]').locator('..')) + this.zoomOutButton = page.locator('.react-flow').locator('..').locator('button').filter({ has: page.locator('[class*="zoom-out"]') }).first() + .or(page.locator('svg[class*="RiZoomOutLine"]').locator('..')) + this.zoomPercentage = page.locator('.system-sm-medium').filter({ hasText: /%$/ }) + + // Node config panel - appears on right when node selected (panel/index.tsx) + this.nodeConfigPanel = page.locator('.absolute.bottom-1.right-0.top-14') + this.envPanel = page.locator('[class*="env-panel"]') + this.versionHistoryPanel = page.locator('[class*="version-history"]') + + // Debug preview panel (panel/debug-and-preview/) + this.debugPreviewPanel = page.locator('[class*="debug"], [class*="preview-panel"]') + this.chatInput = page.locator('textarea[placeholder*="Enter"], textarea[placeholder*="input"]') + + // Block selector popup (block-selector/) + this.blockSelector = page.locator('[class*="block-selector"], [role="dialog"]').filter({ hasText: /LLM|Code|HTTP|IF/ }) + this.blockSearchInput = page.getByPlaceholder(/search/i) + } + + get path(): string { + // Dynamic path - will be set when navigating to specific workflow + return '/app' + } + + /** + * Navigate to a specific workflow app by ID + */ + async gotoWorkflow(appId: string): Promise { + await this.page.goto(`/app/${appId}/workflow`) + await this.waitForPageLoad() + await this.waitForCanvasReady() + } + + /** + * Wait for ReactFlow canvas to be fully loaded + */ + async waitForCanvasReady(): Promise { + await expect(this.canvas).toBeVisible({ timeout: 30000 }) + // Wait for nodes to render (ReactFlow needs time to initialize) + await this.page.waitForSelector('.react-flow__node', { timeout: 30000 }) + await this.page.waitForTimeout(500) // Allow animation to complete + } + + /** + * Get a node by its displayed title/name + * Dify nodes use .react-flow__node class with title text inside + */ + node(name: string): Locator { + return this.canvas.locator('.react-flow__node').filter({ hasText: name }) + } + + /** + * Get start node (entry point of workflow) + */ + get startNode(): Locator { + return this.canvas.locator('.react-flow__node').filter({ hasText: /Start|开始/ }).first() + } + + /** + * Get end node + */ + get endNode(): Locator { + return this.canvas.locator('.react-flow__node').filter({ hasText: /End|结束/ }).first() + } + + /** + * Add a new node by clicking on canvas edge and selecting from block selector + * @param nodeType - Node type like 'LLM', 'Code', 'HTTP Request', 'IF/ELSE', etc. + */ + async addNode(nodeType: string): Promise { + // Click the + button on a node's edge to open block selector + const addButton = this.canvas.locator('.react-flow__node').first() + .locator('[class*="handle"], [class*="add"]') + await addButton.click() + + // Wait for block selector to appear + await expect(this.blockSelector).toBeVisible({ timeout: 5000 }) + + // Search for node type if search is available + if (await this.blockSearchInput.isVisible()) + await this.blockSearchInput.fill(nodeType) + + // Click on the node type option + await this.blockSelector.getByText(nodeType, { exact: false }).first().click() + + await this.waitForCanvasReady() + } + + /** + * Select a node on the canvas (opens config panel on right) + */ + async selectNode(name: string): Promise { + await this.node(name).click() + // Config panel should appear + await expect(this.nodeConfigPanel).toBeVisible({ timeout: 5000 }) + } + + /** + * Delete the currently selected node using keyboard + */ + async deleteSelectedNode(): Promise { + await this.page.keyboard.press('Delete') + // Or Backspace + // await this.page.keyboard.press('Backspace') + } + + /** + * Delete a node by name using context menu + */ + async deleteNode(name: string): Promise { + await this.node(name).click({ button: 'right' }) + await this.page.getByRole('menuitem', { name: /delete|删除/i }).click() + } + + /** + * Connect two nodes by dragging from source handle to target handle + */ + async connectNodes(fromNode: string, toNode: string): Promise { + // ReactFlow uses data-handlepos for handle positions + const sourceHandle = this.node(fromNode).locator('.react-flow__handle-right, [data-handlepos="right"]') + const targetHandle = this.node(toNode).locator('.react-flow__handle-left, [data-handlepos="left"]') + + await sourceHandle.dragTo(targetHandle) + } + + /** + * Run/test the workflow (click Test Run button) + */ + async runWorkflow(): Promise { + await this.runButton.click() + } + + /** + * Stop a running workflow + */ + async stopWorkflow(): Promise { + await this.stopButton.click() + } + + /** + * Check if workflow is currently running + */ + async isRunning(): Promise { + const text = await this.runButton.textContent() + return text?.includes('Running') || text?.includes('Listening') || false + } + + /** + * Publish the workflow + */ + async publishWorkflow(): Promise { + await this.publishButton.click() + + // Handle confirmation dialog if it appears + const confirmButton = this.page.getByRole('button', { name: /confirm|确认/i }) + if (await confirmButton.isVisible({ timeout: 2000 })) + await confirmButton.click() + + await this.expectSuccessToast() + } + + /** + * Wait for workflow run to complete (success or failure) + */ + async waitForRunComplete(timeout = 60000): Promise { + // Wait until the "Running" state ends + await expect(async () => { + const isStillRunning = await this.isRunning() + expect(isStillRunning).toBe(false) + }).toPass({ timeout }) + } + + /** + * Verify workflow run completed successfully + */ + async expectRunSuccess(): Promise { + await this.waitForRunComplete() + // Check for success indicators in the debug panel or toast + const successIndicator = this.page.locator(':text("Succeeded"), :text("success"), :text("成功")') + await expect(successIndicator).toBeVisible({ timeout: 10000 }) + } + + /** + * Get the count of nodes on canvas + */ + async getNodeCount(): Promise { + return this.canvas.locator('.react-flow__node').count() + } + + /** + * Verify a specific node exists on canvas + */ + async expectNodeExists(name: string): Promise { + await expect(this.node(name)).toBeVisible() + } + + /** + * Verify a specific node does not exist on canvas + */ + async expectNodeNotExists(name: string): Promise { + await expect(this.node(name)).not.toBeVisible() + } + + /** + * Zoom in the canvas + */ + async zoomIn(): Promise { + // Use keyboard shortcut Ctrl++ + await this.page.keyboard.press('Control++') + } + + /** + * Zoom out the canvas + */ + async zoomOut(): Promise { + // Use keyboard shortcut Ctrl+- + await this.page.keyboard.press('Control+-') + } + + /** + * Fit view to show all nodes (keyboard shortcut Ctrl+1) + */ + async fitView(): Promise { + await this.page.keyboard.press('Control+1') + } + + /** + * Get current zoom percentage + */ + async getZoomPercentage(): Promise { + const text = await this.zoomPercentage.textContent() + return Number.parseInt(text?.replace('%', '') || '100') + } + + /** + * Undo last action (Ctrl+Z) + */ + async undo(): Promise { + await this.page.keyboard.press('Control+z') + } + + /** + * Redo last undone action (Ctrl+Shift+Z) + */ + async redo(): Promise { + await this.page.keyboard.press('Control+Shift+z') + } + + /** + * Open version history panel + */ + async openVersionHistory(): Promise { + await this.historyButton.click() + await expect(this.versionHistoryPanel).toBeVisible() + } + + /** + * Duplicate selected node (Ctrl+D) + */ + async duplicateSelectedNode(): Promise { + await this.page.keyboard.press('Control+d') + } + + /** + * Copy selected node (Ctrl+C) + */ + async copySelectedNode(): Promise { + await this.page.keyboard.press('Control+c') + } + + /** + * Paste node (Ctrl+V) + */ + async pasteNode(): Promise { + await this.page.keyboard.press('Control+v') + } +} diff --git a/web/e2e/tests/apps.spec.ts b/web/e2e/tests/apps.spec.ts new file mode 100644 index 0000000000..1ec8c859bf --- /dev/null +++ b/web/e2e/tests/apps.spec.ts @@ -0,0 +1,25 @@ +import { expect, test } from '../fixtures' + +/** + * Apps page E2E tests + * + * These tests verify the apps listing and creation functionality. + */ + +test.describe('Apps Page', () => { + test('should display apps page after authentication', async ({ page }) => { + // Navigate to apps page + await page.goto('/apps') + + // Verify we're on the apps page (not redirected to signin) + await expect(page).toHaveURL(/\/apps/) + + // Wait for the page to fully load + await page.waitForLoadState('networkidle') + + // Take a screenshot for debugging + await page.screenshot({ path: 'e2e/test-results/apps-page.png' }) + + console.log('✅ Apps page loaded successfully') + }) +}) diff --git a/web/e2e/utils/api-helpers.ts b/web/e2e/utils/api-helpers.ts new file mode 100644 index 0000000000..192761a3c4 --- /dev/null +++ b/web/e2e/utils/api-helpers.ts @@ -0,0 +1,165 @@ +import type { APIRequestContext } from '@playwright/test' + +/** + * API helper utilities for test setup and cleanup + * + * Use these helpers to set up test data via API before tests run, + * or to clean up data after tests complete. + * + * Environment variables: + * - NEXT_PUBLIC_API_PREFIX: API URL (default: http://localhost:5001/console/api) + * + * Based on Dify API configuration: + * @see web/config/index.ts - API_PREFIX + * @see web/types/app.ts - AppModeEnum + */ + +// API base URL with fallback for local development +const API_BASE_URL = process.env.NEXT_PUBLIC_API_PREFIX || 'http://localhost:5001/console/api' + +/** + * Dify App mode types + * @see web/types/app.ts - AppModeEnum + */ +export type AppMode = 'chat' | 'completion' | 'workflow' + +/** + * Create a new app via API + * + * @param request - Playwright API request context + * @param data - App data + * @param data.name - App name + * @param data.mode - App mode: chat (Chatbot), completion (Text Generator), + * workflow, advanced-chat (Chatflow), agent-chat (Agent) + * @param data.description - Optional description + * @param data.icon - Optional icon + * @param data.iconBackground - Optional icon background color + */ +export async function createAppViaApi( + request: APIRequestContext, + data: { + name: string + mode: AppMode + description?: string + icon?: string + iconBackground?: string + }, +): Promise<{ id: string, name: string }> { + const response = await request.post(`${API_BASE_URL}/apps`, { + data: { + name: data.name, + mode: data.mode, + description: data.description || '', + icon: data.icon || 'default', + icon_background: data.iconBackground || '#FFFFFF', + }, + }) + + if (!response.ok()) { + const error = await response.text() + throw new Error(`Failed to create app: ${error}`) + } + + return response.json() +} + +/** + * Delete an app via API + */ +export async function deleteAppViaApi( + request: APIRequestContext, + appId: string, +): Promise { + const response = await request.delete(`${API_BASE_URL}/apps/${appId}`) + + if (!response.ok() && response.status() !== 404) { + const error = await response.text() + throw new Error(`Failed to delete app: ${error}`) + } +} + +/** + * Create a dataset/knowledge base via API + */ +export async function createDatasetViaApi( + request: APIRequestContext, + data: { + name: string + description?: string + }, +): Promise<{ id: string, name: string }> { + const response = await request.post(`${API_BASE_URL}/datasets`, { + data: { + name: data.name, + description: data.description || '', + }, + }) + + if (!response.ok()) { + const error = await response.text() + throw new Error(`Failed to create dataset: ${error}`) + } + + return response.json() +} + +/** + * Delete a dataset via API + */ +export async function deleteDatasetViaApi( + request: APIRequestContext, + datasetId: string, +): Promise { + const response = await request.delete(`${API_BASE_URL}/datasets/${datasetId}`) + + if (!response.ok() && response.status() !== 404) { + const error = await response.text() + throw new Error(`Failed to delete dataset: ${error}`) + } +} + +/** + * Get current user info via API + */ +export async function getCurrentUserViaApi( + request: APIRequestContext, +): Promise<{ id: string, email: string, name: string }> { + const response = await request.get(`${API_BASE_URL}/account/profile`) + + if (!response.ok()) { + const error = await response.text() + throw new Error(`Failed to get user info: ${error}`) + } + + return response.json() +} + +/** + * Cleanup helper - delete all test apps by name pattern + */ +export async function cleanupTestApps( + request: APIRequestContext, + namePattern: RegExp, +): Promise { + const response = await request.get(`${API_BASE_URL}/apps`) + + if (!response.ok()) + return 0 + + const { data: apps } = await response.json() as { data: Array<{ id: string, name: string }> } + + const testApps = apps.filter(app => namePattern.test(app.name)) + let deletedCount = 0 + + for (const app of testApps) { + try { + await deleteAppViaApi(request, app.id) + deletedCount++ + } + catch { + // Ignore deletion errors during cleanup + } + } + + return deletedCount +} diff --git a/web/e2e/utils/index.ts b/web/e2e/utils/index.ts new file mode 100644 index 0000000000..9376310380 --- /dev/null +++ b/web/e2e/utils/index.ts @@ -0,0 +1,8 @@ +/** + * Test Utilities Index + * + * Export all utility functions from a single entry point. + */ + +export * from './test-helpers' +export * from './api-helpers' diff --git a/web/e2e/utils/test-helpers.ts b/web/e2e/utils/test-helpers.ts new file mode 100644 index 0000000000..7a59532f90 --- /dev/null +++ b/web/e2e/utils/test-helpers.ts @@ -0,0 +1,174 @@ +import type { Locator, Page } from '@playwright/test' + +/** + * Common test helper utilities for E2E tests + */ + +/** + * Wait for network to be idle with a custom timeout + */ +export async function waitForNetworkIdle(page: Page, timeout = 5000): Promise { + await page.waitForLoadState('networkidle', { timeout }) +} + +/** + * Wait for an element to be stable (not moving/resizing) + */ +export async function waitForStable(locator: Locator, timeout = 5000): Promise { + await locator.waitFor({ state: 'visible', timeout }) + // Additional wait for animations to complete + await locator.evaluate(el => new Promise((resolve) => { + const observer = new MutationObserver(() => { + // Observer callback - intentionally empty, just watching for changes + }) + observer.observe(el, { attributes: true, subtree: true }) + setTimeout(() => { + observer.disconnect() + resolve() + }, 100) + })) +} + +/** + * Safely click an element with retry logic + */ +export async function safeClick( + locator: Locator, + options?: { timeout?: number, force?: boolean }, +): Promise { + const { timeout = 10000, force = false } = options || {} + await locator.waitFor({ state: 'visible', timeout }) + await locator.click({ force, timeout }) +} + +/** + * Fill input with clear first + */ +export async function fillInput( + locator: Locator, + value: string, + options?: { clear?: boolean }, +): Promise { + const { clear = true } = options || {} + if (clear) + await locator.clear() + + await locator.fill(value) +} + +/** + * Select option from dropdown/select element + */ +export async function selectOption( + trigger: Locator, + optionText: string, + page: Page, +): Promise { + await trigger.click() + await page.getByRole('option', { name: optionText }).click() +} + +/** + * Wait for toast notification and verify its content + * + * Based on Dify toast implementation: + * @see web/app/components/base/toast/index.tsx + * + * Toast structure: + * - Container: .fixed.z-[9999] with rounded-xl + * - Type background classes: bg-toast-success-bg, bg-toast-error-bg, etc. + * - Type icon classes: text-text-success, text-text-destructive, etc. + */ +export async function waitForToast( + page: Page, + expectedText: string | RegExp, + type?: 'success' | 'error' | 'warning' | 'info', +): Promise { + // Dify toast uses fixed positioning with z-[9999] + const toastContainer = page.locator('.fixed.z-\\[9999\\]') + + // Filter by type if specified + let toast: Locator + if (type) { + // Each type has specific background class + const typeClassMap: Record = { + success: '.bg-toast-success-bg', + error: '.bg-toast-error-bg', + warning: '.bg-toast-warning-bg', + info: '.bg-toast-info-bg', + } + toast = toastContainer.filter({ has: page.locator(typeClassMap[type]) }) + .filter({ hasText: expectedText }) + } + else { + toast = toastContainer.filter({ hasText: expectedText }) + } + + await toast.waitFor({ state: 'visible', timeout: 10000 }) + return toast +} + +/** + * Dismiss any visible modals + */ +export async function dismissModal(page: Page): Promise { + const modal = page.locator('[role="dialog"]') + if (await modal.isVisible()) { + // Try clicking close button or backdrop + const closeButton = modal.locator('button[aria-label*="close"], button:has-text("Cancel")') + if (await closeButton.isVisible()) + await closeButton.click() + else + await page.keyboard.press('Escape') + + await modal.waitFor({ state: 'hidden', timeout: 5000 }) + } +} + +/** + * Generate a unique test identifier + */ +export function generateTestId(prefix = 'test'): string { + const timestamp = Date.now() + const random = Math.random().toString(36).substring(2, 8) + return `${prefix}-${timestamp}-${random}` +} + +/** + * Take a screenshot with a descriptive name + */ +export async function takeDebugScreenshot( + page: Page, + name: string, +): Promise { + const timestamp = new Date().toISOString().replace(/[:.]/g, '-') + await page.screenshot({ + path: `e2e/test-results/debug-${name}-${timestamp}.png`, + fullPage: true, + }) +} + +/** + * Retry an action with exponential backoff + */ +export async function retryAction( + action: () => Promise, + options?: { maxAttempts?: number, baseDelay?: number }, +): Promise { + const { maxAttempts = 3, baseDelay = 1000 } = options || {} + + for (let attempt = 1; attempt <= maxAttempts; attempt++) { + try { + return await action() + } + catch (error) { + if (attempt === maxAttempts) + throw error + + const delay = baseDelay * 2 ** (attempt - 1) + await new Promise(resolve => setTimeout(resolve, delay)) + } + } + + throw new Error('Unreachable') +} diff --git a/web/package.json b/web/package.json index 478abceb45..2ba8d8252c 100644 --- a/web/package.json +++ b/web/package.json @@ -40,6 +40,11 @@ "test": "jest", "test:watch": "jest --watch", "analyze-component": "node testing/analyze-component.js", + "test:e2e": "playwright test", + "test:e2e:ui": "playwright test --ui", + "test:e2e:headed": "playwright test --headed", + "test:e2e:debug": "playwright test --debug", + "test:e2e:report": "playwright show-report", "storybook": "storybook dev -p 6006", "build-storybook": "storybook build", "preinstall": "npx only-allow pnpm", @@ -158,6 +163,7 @@ "@next/bundle-analyzer": "15.5.7", "@next/eslint-plugin-next": "15.5.7", "@next/mdx": "15.5.7", + "@playwright/test": "^1.56.1", "@rgrove/parse-xml": "^4.2.0", "@storybook/addon-docs": "9.1.13", "@storybook/addon-links": "9.1.13", @@ -189,6 +195,7 @@ "bing-translate-api": "^4.1.0", "code-inspector-plugin": "1.2.9", "cross-env": "^10.1.0", + "dotenv": "^17.2.3", "eslint": "^9.38.0", "eslint-plugin-oxlint": "^1.23.0", "eslint-plugin-react-hooks": "^5.2.0", diff --git a/web/playwright.config.ts b/web/playwright.config.ts new file mode 100644 index 0000000000..565e620b26 --- /dev/null +++ b/web/playwright.config.ts @@ -0,0 +1,152 @@ +import path from 'node:path' +import { defineConfig, devices } from '@playwright/test' + +/** + * Playwright Configuration for Dify E2E Tests + * + * Environment variables are loaded from web/.env.local + * + * E2E specific variables: + * - E2E_BASE_URL: Base URL for tests (default: http://localhost:3000) + * - E2E_SKIP_WEB_SERVER: Set to 'true' to skip starting dev server (for CI with deployed env) + * @see https://playwright.dev/docs/test-configuration + */ + +// Load environment variables from web/.env.local +require('dotenv').config({ path: path.resolve(__dirname, '.env.local') }) + +// Base URL for the frontend application +// - Local development: http://localhost:3000 +// - CI/CD with deployed env: set E2E_BASE_URL to the deployed URL +const BASE_URL = process.env.E2E_BASE_URL || 'http://localhost:3000' + +// Whether to skip starting the web server +// - Local development: false (start dev server) +// - CI/CD with deployed env: true (use existing server) +const SKIP_WEB_SERVER = process.env.E2E_SKIP_WEB_SERVER === 'true' + +export default defineConfig({ + // Directory containing test files + testDir: './e2e/tests', + + // Run tests in files in parallel + fullyParallel: true, + + // Fail the build on CI if you accidentally left test.only in the source code + forbidOnly: !!process.env.CI, + + // Retry on CI only + retries: process.env.CI ? 2 : 0, + + // Opt out of parallel tests on CI for stability + workers: process.env.CI ? 1 : undefined, + + // Reporter to use + reporter: process.env.CI + ? [['html', { open: 'never' }], ['github']] + : [['html', { open: 'on-failure' }], ['list']], + + // Shared settings for all the projects below + use: { + // Base URL for all page.goto() calls + baseURL: BASE_URL, + + // Collect trace when retrying the failed test + trace: 'on-first-retry', + + // Take screenshot on failure + screenshot: 'only-on-failure', + + // Record video on failure + video: 'on-first-retry', + + // Default timeout for actions + actionTimeout: 10000, + + // Default timeout for navigation + navigationTimeout: 30000, + }, + + // Global timeout for each test + timeout: 60000, + + // Expect timeout + expect: { + timeout: 10000, + }, + + // Configure projects for major browsers + projects: [ + // Setup project - runs before all tests to handle authentication + { + name: 'setup', + testDir: './e2e', + testMatch: /global\.setup\.ts/, + teardown: 'teardown', + }, + { + name: 'teardown', + testDir: './e2e', + testMatch: /global\.teardown\.ts/, + }, + + // Main test project - uses authenticated state + { + name: 'chromium', + use: { + ...devices['Desktop Chrome'], + // Use prepared auth state + storageState: 'e2e/.auth/user.json', + }, + dependencies: ['setup'], + }, + + // Test in Firefox (optional, uncomment when needed) + // { + // name: 'firefox', + // use: { + // ...devices['Desktop Firefox'], + // storageState: 'e2e/.auth/user.json', + // }, + // dependencies: ['setup'], + // }, + + // Test in WebKit (optional, uncomment when needed) + // { + // name: 'webkit', + // use: { + // ...devices['Desktop Safari'], + // storageState: 'e2e/.auth/user.json', + // }, + // dependencies: ['setup'], + // }, + + // Test against mobile viewports (optional) + // { + // name: 'mobile-chrome', + // use: { + // ...devices['Pixel 5'], + // storageState: 'e2e/.auth/user.json', + // }, + // dependencies: ['setup'], + // }, + ], + + // Output folder for test artifacts + outputDir: 'e2e/test-results', + + // Run your local dev server before starting the tests + // - Local: starts dev server automatically + // - CI with deployed env: set E2E_SKIP_WEB_SERVER=true to skip + ...(SKIP_WEB_SERVER + ? {} + : { + webServer: { + command: 'pnpm dev', + url: BASE_URL, + // Reuse existing server in local dev, start fresh in CI + reuseExistingServer: !process.env.CI, + timeout: 120000, + }, + }), +}) diff --git a/web/pnpm-lock.yaml b/web/pnpm-lock.yaml index 02b1c9b592..58544e46e7 100644 --- a/web/pnpm-lock.yaml +++ b/web/pnpm-lock.yaml @@ -60,10 +60,10 @@ importers: dependencies: '@amplitude/analytics-browser': specifier: ^2.31.3 - version: 2.31.3 + version: 2.31.4 '@amplitude/plugin-session-replay-browser': specifier: ^1.23.6 - version: 1.23.6(@amplitude/rrweb@2.0.0-alpha.33)(rollup@2.79.2) + version: 1.24.1(@amplitude/rrweb@2.0.0-alpha.33)(rollup@2.79.2) '@emoji-mart/data': specifier: ^1.2.1 version: 1.2.1 @@ -81,7 +81,7 @@ importers: version: 2.2.0(react@19.2.1) '@hookform/resolvers': specifier: ^3.10.0 - version: 3.10.0(react-hook-form@7.67.0(react@19.2.1)) + version: 3.10.0(react-hook-form@7.68.0(react@19.2.1)) '@lexical/code': specifier: ^0.38.2 version: 0.38.2 @@ -126,13 +126,13 @@ importers: version: 0.5.19(tailwindcss@3.4.18(tsx@4.21.0)(yaml@2.8.2)) '@tanstack/react-form': specifier: ^1.23.7 - version: 1.27.0(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + version: 1.27.1(react-dom@19.2.1(react@19.2.1))(react@19.2.1) '@tanstack/react-query': specifier: ^5.90.5 - version: 5.90.11(react@19.2.1) + version: 5.90.12(react@19.2.1) '@tanstack/react-query-devtools': specifier: ^5.90.2 - version: 5.91.1(@tanstack/react-query@5.90.11(react@19.2.1))(react@19.2.1) + version: 5.91.1(@tanstack/react-query@5.90.12(react@19.2.1))(react@19.2.1) abcjs: specifier: ^6.5.2 version: 6.5.2 @@ -162,7 +162,7 @@ importers: version: 10.6.0 dompurify: specifier: ^3.3.0 - version: 3.3.0 + version: 3.3.1 echarts: specifier: ^5.6.0 version: 5.6.0 @@ -207,10 +207,10 @@ importers: version: 1.5.0 katex: specifier: ^0.16.25 - version: 0.16.25 + version: 0.16.27 ky: specifier: ^1.12.0 - version: 1.14.0 + version: 1.14.1 lamejs: specifier: ^1.2.1 version: 1.2.1 @@ -237,10 +237,10 @@ importers: version: 1.0.0 next: specifier: ~15.5.7 - version: 15.5.7(@babel/core@7.28.5)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(sass@1.94.2) + version: 15.5.7(@babel/core@7.28.5)(@playwright/test@1.57.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(sass@1.95.0) next-pwa: specifier: ^5.6.0 - version: 5.6.0(@babel/core@7.28.5)(@types/babel__core@7.20.5)(esbuild@0.25.0)(next@15.5.7(@babel/core@7.28.5)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(sass@1.94.2))(uglify-js@3.19.3)(webpack@5.103.0(esbuild@0.25.0)(uglify-js@3.19.3)) + version: 5.6.0(@babel/core@7.28.5)(@types/babel__core@7.20.5)(esbuild@0.25.0)(next@15.5.7(@babel/core@7.28.5)(@playwright/test@1.57.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(sass@1.95.0))(uglify-js@3.19.3)(webpack@5.103.0(esbuild@0.25.0)(uglify-js@3.19.3)) next-themes: specifier: ^0.4.6 version: 0.4.6(react-dom@19.2.1(react@19.2.1))(react@19.2.1) @@ -267,7 +267,7 @@ importers: version: 5.5.6(react-dom@19.2.1(react@19.2.1))(react@19.2.1) react-hook-form: specifier: ^7.65.0 - version: 7.67.0(react@19.2.1) + version: 7.68.0(react@19.2.1) react-hotkeys-hook: specifier: ^4.6.2 version: 4.6.2(react-dom@19.2.1(react@19.2.1))(react@19.2.1) @@ -364,7 +364,7 @@ importers: version: 7.28.5 '@chromatic-com/storybook': specifier: ^4.1.1 - version: 4.1.3(storybook@9.1.13(@testing-library/dom@10.4.1)(msw@2.12.4(@types/node@18.15.0)(typescript@5.9.3))) + version: 4.1.3(storybook@9.1.13(@testing-library/dom@10.4.1)) '@eslint-react/eslint-plugin': specifier: ^1.53.1 version: 1.53.1(eslint@9.39.1(jiti@1.21.7))(ts-api-utils@2.1.0(typescript@5.9.3))(typescript@5.9.3) @@ -386,27 +386,30 @@ importers: '@next/mdx': specifier: 15.5.7 version: 15.5.7(@mdx-js/loader@3.1.1(webpack@5.103.0(esbuild@0.25.0)(uglify-js@3.19.3)))(@mdx-js/react@3.1.1(@types/react@19.2.7)(react@19.2.1)) + '@playwright/test': + specifier: ^1.56.1 + version: 1.57.0 '@rgrove/parse-xml': specifier: ^4.2.0 version: 4.2.0 '@storybook/addon-docs': specifier: 9.1.13 - version: 9.1.13(@types/react@19.2.7)(storybook@9.1.13(@testing-library/dom@10.4.1)(msw@2.12.4(@types/node@18.15.0)(typescript@5.9.3))) + version: 9.1.13(@types/react@19.2.7)(storybook@9.1.13(@testing-library/dom@10.4.1)) '@storybook/addon-links': specifier: 9.1.13 - version: 9.1.13(react@19.2.1)(storybook@9.1.13(@testing-library/dom@10.4.1)(msw@2.12.4(@types/node@18.15.0)(typescript@5.9.3))) + version: 9.1.13(react@19.2.1)(storybook@9.1.13(@testing-library/dom@10.4.1)) '@storybook/addon-onboarding': specifier: 9.1.13 - version: 9.1.13(storybook@9.1.13(@testing-library/dom@10.4.1)(msw@2.12.4(@types/node@18.15.0)(typescript@5.9.3))) + version: 9.1.13(storybook@9.1.13(@testing-library/dom@10.4.1)) '@storybook/addon-themes': specifier: 9.1.13 - version: 9.1.13(storybook@9.1.13(@testing-library/dom@10.4.1)(msw@2.12.4(@types/node@18.15.0)(typescript@5.9.3))) + version: 9.1.13(storybook@9.1.13(@testing-library/dom@10.4.1)) '@storybook/nextjs': specifier: 9.1.13 - version: 9.1.13(esbuild@0.25.0)(next@15.5.7(@babel/core@7.28.5)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(sass@1.94.2))(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(sass@1.94.2)(storybook@9.1.13(@testing-library/dom@10.4.1)(msw@2.12.4(@types/node@18.15.0)(typescript@5.9.3)))(type-fest@4.2.0)(typescript@5.9.3)(uglify-js@3.19.3)(webpack-hot-middleware@2.26.1)(webpack@5.103.0(esbuild@0.25.0)(uglify-js@3.19.3)) + version: 9.1.13(esbuild@0.25.0)(next@15.5.7(@babel/core@7.28.5)(@playwright/test@1.57.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(sass@1.95.0))(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(sass@1.95.0)(storybook@9.1.13(@testing-library/dom@10.4.1))(type-fest@4.2.0)(typescript@5.9.3)(uglify-js@3.19.3)(webpack-hot-middleware@2.26.1)(webpack@5.103.0(esbuild@0.25.0)(uglify-js@3.19.3)) '@storybook/react': specifier: 9.1.13 - version: 9.1.13(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(storybook@9.1.13(@testing-library/dom@10.4.1)(msw@2.12.4(@types/node@18.15.0)(typescript@5.9.3)))(typescript@5.9.3) + version: 9.1.13(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(storybook@9.1.13(@testing-library/dom@10.4.1))(typescript@5.9.3) '@testing-library/dom': specifier: ^10.4.1 version: 10.4.1 @@ -463,7 +466,7 @@ importers: version: 10.0.0 '@typescript/native-preview': specifier: ^7.0.0-dev - version: 7.0.0-dev.20251204.1 + version: 7.0.0-dev.20251209.1 autoprefixer: specifier: ^10.4.21 version: 10.4.22(postcss@8.5.6) @@ -479,12 +482,15 @@ importers: cross-env: specifier: ^10.1.0 version: 10.1.0 + dotenv: + specifier: ^17.2.3 + version: 17.2.3 eslint: specifier: ^9.38.0 version: 9.39.1(jiti@1.21.7) eslint-plugin-oxlint: specifier: ^1.23.0 - version: 1.31.0 + version: 1.32.0 eslint-plugin-react-hooks: specifier: ^5.2.0 version: 5.2.0(eslint@9.39.1(jiti@1.21.7)) @@ -496,7 +502,7 @@ importers: version: 3.0.5(eslint@9.39.1(jiti@1.21.7)) eslint-plugin-storybook: specifier: ^9.1.13 - version: 9.1.16(eslint@9.39.1(jiti@1.21.7))(storybook@9.1.13(@testing-library/dom@10.4.1)(msw@2.12.4(@types/node@18.15.0)(typescript@5.9.3)))(typescript@5.9.3) + version: 9.1.16(eslint@9.39.1(jiti@1.21.7))(storybook@9.1.13(@testing-library/dom@10.4.1))(typescript@5.9.3) eslint-plugin-tailwindcss: specifier: ^3.18.2 version: 3.18.2(tailwindcss@3.4.18(tsx@4.21.0)(yaml@2.8.2)) @@ -511,7 +517,7 @@ importers: version: 29.7.0(@types/node@18.15.0)(ts-node@10.9.2(@types/node@18.15.0)(typescript@5.9.3)) knip: specifier: ^5.66.1 - version: 5.71.0(@types/node@18.15.0)(typescript@5.9.3) + version: 5.72.0(@types/node@18.15.0)(typescript@5.9.3) lint-staged: specifier: ^15.5.2 version: 15.5.2 @@ -526,19 +532,19 @@ importers: version: 14.0.10 oxlint: specifier: ^1.31.0 - version: 1.31.0 + version: 1.32.0 postcss: specifier: ^8.5.6 version: 8.5.6 react-scan: specifier: ^0.4.3 - version: 0.4.3(@types/react@19.2.7)(next@15.5.7(@babel/core@7.28.5)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(sass@1.94.2))(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(rollup@2.79.2) + version: 0.4.3(@types/react@19.2.7)(next@15.5.7(@babel/core@7.28.5)(@playwright/test@1.57.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(sass@1.95.0))(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(rollup@2.79.2) sass: specifier: ^1.93.2 - version: 1.94.2 + version: 1.95.0 storybook: specifier: 9.1.13 - version: 9.1.13(@testing-library/dom@10.4.1)(msw@2.12.4(@types/node@18.15.0)(typescript@5.9.3)) + version: 9.1.13(@testing-library/dom@10.4.1) tailwindcss: specifier: ^3.4.18 version: 3.4.18(tsx@4.21.0)(yaml@2.8.2) @@ -561,8 +567,8 @@ packages: resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==} engines: {node: '>=10'} - '@amplitude/analytics-browser@2.31.3': - resolution: {integrity: sha512-jGViok5dVYi+4y/OUpH/0+urbba7KK6lmWLJx05TW68ME7lPrZSYO2B1NPzoe6Eym1Rzz6k3njGFR7dtTxcFSQ==} + '@amplitude/analytics-browser@2.31.4': + resolution: {integrity: sha512-9O8a0SK55tQOgJJ0z9eE+q/C2xWo6a65wN4iSglxYwm1vvGJKG6Z/QV4XKQ6X0syGscRuG1XoMc0mt3xdVPtDg==} '@amplitude/analytics-client-common@2.4.16': resolution: {integrity: sha512-qF7NAl6Qr6QXcWKnldGJfO0Kp1TYoy1xsmzEDnOYzOS96qngtvsZ8MuKya1lWdVACoofwQo82V0VhNZJKk/2YA==} @@ -591,8 +597,8 @@ packages: '@amplitude/plugin-page-view-tracking-browser@2.6.3': resolution: {integrity: sha512-lLU4W2r5jXtfn/14cZKM9c9CQDxT7PVVlgm0susHJ3Kfsua9jJQuMHs4Zlg6rwByAtZi5nF4nYE5z0GF09gx0A==} - '@amplitude/plugin-session-replay-browser@1.23.6': - resolution: {integrity: sha512-MPUVbN/tBTHvqKujqIlzd5mq5d3kpovC/XEVw80dgWUYwOwU7+39vKGc2NZV8iGi3kOtOzm2XTlcGOS2Gtjw3Q==} + '@amplitude/plugin-session-replay-browser@1.24.1': + resolution: {integrity: sha512-NHePIu2Yv9ba+fOt5N33b8FFQPzyKvjs1BnWBgBCM5RECos3w6n/+zUWTnTJ4at2ipO2lz111abKDteUwbuptg==} '@amplitude/plugin-web-vitals-browser@1.1.0': resolution: {integrity: sha512-TA0X4Np4Wt5hkQ4+Ouhg6nm2xjDd9l03OV9N8Kbe1cqpr/sxvRwSpd+kp2eREbp6D7tHFFkKJA2iNtxbE5Y0cA==} @@ -629,8 +635,8 @@ packages: '@amplitude/rrweb@2.0.0-alpha.33': resolution: {integrity: sha512-vMuk/3HzDWaUzBLFxKd7IpA8TEWjyPZBuLiLexMd/mOfTt/+JkVLsfXiJOyltJfR98LpmMTp1q51dtq357Dnfg==} - '@amplitude/session-replay-browser@1.29.8': - resolution: {integrity: sha512-f/j1+xUxqK7ewz0OM04Q0m2N4Q+miCOfANe9jb9NAGfZdBu8IfNYswfjPiHdv0+ffXl5UovuyLhl1nV/znIZqA==} + '@amplitude/session-replay-browser@1.30.0': + resolution: {integrity: sha512-mLNJ5UEDuY91zRmqPiJcORMmaYkfrKjLzu52DsD/EaB+rKAxSuZbUlXlFjeaaCrNLWWV2ywn5y3Tl2xX0cQNzQ==} '@amplitude/targeting@0.2.0': resolution: {integrity: sha512-/50ywTrC4hfcfJVBbh5DFbqMPPfaIOivZeb5Gb+OGM03QrA+lsUqdvtnKLNuWtceD4H6QQ2KFzPJ5aAJLyzVDA==} @@ -1426,150 +1432,306 @@ packages: cpu: [ppc64] os: [aix] + '@esbuild/aix-ppc64@0.25.12': + resolution: {integrity: sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + '@esbuild/android-arm64@0.25.0': resolution: {integrity: sha512-grvv8WncGjDSyUBjN9yHXNt+cq0snxXbDxy5pJtzMKGmmpPxeAmAhWxXI+01lU5rwZomDgD3kJwulEnhTRUd6g==} engines: {node: '>=18'} cpu: [arm64] os: [android] + '@esbuild/android-arm64@0.25.12': + resolution: {integrity: sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + '@esbuild/android-arm@0.25.0': resolution: {integrity: sha512-PTyWCYYiU0+1eJKmw21lWtC+d08JDZPQ5g+kFyxP0V+es6VPPSUhM6zk8iImp2jbV6GwjX4pap0JFbUQN65X1g==} engines: {node: '>=18'} cpu: [arm] os: [android] + '@esbuild/android-arm@0.25.12': + resolution: {integrity: sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + '@esbuild/android-x64@0.25.0': resolution: {integrity: sha512-m/ix7SfKG5buCnxasr52+LI78SQ+wgdENi9CqyCXwjVR2X4Jkz+BpC3le3AoBPYTC9NHklwngVXvbJ9/Akhrfg==} engines: {node: '>=18'} cpu: [x64] os: [android] + '@esbuild/android-x64@0.25.12': + resolution: {integrity: sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + '@esbuild/darwin-arm64@0.25.0': resolution: {integrity: sha512-mVwdUb5SRkPayVadIOI78K7aAnPamoeFR2bT5nszFUZ9P8UpK4ratOdYbZZXYSqPKMHfS1wdHCJk1P1EZpRdvw==} engines: {node: '>=18'} cpu: [arm64] os: [darwin] + '@esbuild/darwin-arm64@0.25.12': + resolution: {integrity: sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + '@esbuild/darwin-x64@0.25.0': resolution: {integrity: sha512-DgDaYsPWFTS4S3nWpFcMn/33ZZwAAeAFKNHNa1QN0rI4pUjgqf0f7ONmXf6d22tqTY+H9FNdgeaAa+YIFUn2Rg==} engines: {node: '>=18'} cpu: [x64] os: [darwin] + '@esbuild/darwin-x64@0.25.12': + resolution: {integrity: sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + '@esbuild/freebsd-arm64@0.25.0': resolution: {integrity: sha512-VN4ocxy6dxefN1MepBx/iD1dH5K8qNtNe227I0mnTRjry8tj5MRk4zprLEdG8WPyAPb93/e4pSgi1SoHdgOa4w==} engines: {node: '>=18'} cpu: [arm64] os: [freebsd] + '@esbuild/freebsd-arm64@0.25.12': + resolution: {integrity: sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + '@esbuild/freebsd-x64@0.25.0': resolution: {integrity: sha512-mrSgt7lCh07FY+hDD1TxiTyIHyttn6vnjesnPoVDNmDfOmggTLXRv8Id5fNZey1gl/V2dyVK1VXXqVsQIiAk+A==} engines: {node: '>=18'} cpu: [x64] os: [freebsd] + '@esbuild/freebsd-x64@0.25.12': + resolution: {integrity: sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + '@esbuild/linux-arm64@0.25.0': resolution: {integrity: sha512-9QAQjTWNDM/Vk2bgBl17yWuZxZNQIF0OUUuPZRKoDtqF2k4EtYbpyiG5/Dk7nqeK6kIJWPYldkOcBqjXjrUlmg==} engines: {node: '>=18'} cpu: [arm64] os: [linux] + '@esbuild/linux-arm64@0.25.12': + resolution: {integrity: sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + '@esbuild/linux-arm@0.25.0': resolution: {integrity: sha512-vkB3IYj2IDo3g9xX7HqhPYxVkNQe8qTK55fraQyTzTX/fxaDtXiEnavv9geOsonh2Fd2RMB+i5cbhu2zMNWJwg==} engines: {node: '>=18'} cpu: [arm] os: [linux] + '@esbuild/linux-arm@0.25.12': + resolution: {integrity: sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + '@esbuild/linux-ia32@0.25.0': resolution: {integrity: sha512-43ET5bHbphBegyeqLb7I1eYn2P/JYGNmzzdidq/w0T8E2SsYL1U6un2NFROFRg1JZLTzdCoRomg8Rvf9M6W6Gg==} engines: {node: '>=18'} cpu: [ia32] os: [linux] + '@esbuild/linux-ia32@0.25.12': + resolution: {integrity: sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + '@esbuild/linux-loong64@0.25.0': resolution: {integrity: sha512-fC95c/xyNFueMhClxJmeRIj2yrSMdDfmqJnyOY4ZqsALkDrrKJfIg5NTMSzVBr5YW1jf+l7/cndBfP3MSDpoHw==} engines: {node: '>=18'} cpu: [loong64] os: [linux] + '@esbuild/linux-loong64@0.25.12': + resolution: {integrity: sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + '@esbuild/linux-mips64el@0.25.0': resolution: {integrity: sha512-nkAMFju7KDW73T1DdH7glcyIptm95a7Le8irTQNO/qtkoyypZAnjchQgooFUDQhNAy4iu08N79W4T4pMBwhPwQ==} engines: {node: '>=18'} cpu: [mips64el] os: [linux] + '@esbuild/linux-mips64el@0.25.12': + resolution: {integrity: sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + '@esbuild/linux-ppc64@0.25.0': resolution: {integrity: sha512-NhyOejdhRGS8Iwv+KKR2zTq2PpysF9XqY+Zk77vQHqNbo/PwZCzB5/h7VGuREZm1fixhs4Q/qWRSi5zmAiO4Fw==} engines: {node: '>=18'} cpu: [ppc64] os: [linux] + '@esbuild/linux-ppc64@0.25.12': + resolution: {integrity: sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + '@esbuild/linux-riscv64@0.25.0': resolution: {integrity: sha512-5S/rbP5OY+GHLC5qXp1y/Mx//e92L1YDqkiBbO9TQOvuFXM+iDqUNG5XopAnXoRH3FjIUDkeGcY1cgNvnXp/kA==} engines: {node: '>=18'} cpu: [riscv64] os: [linux] + '@esbuild/linux-riscv64@0.25.12': + resolution: {integrity: sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + '@esbuild/linux-s390x@0.25.0': resolution: {integrity: sha512-XM2BFsEBz0Fw37V0zU4CXfcfuACMrppsMFKdYY2WuTS3yi8O1nFOhil/xhKTmE1nPmVyvQJjJivgDT+xh8pXJA==} engines: {node: '>=18'} cpu: [s390x] os: [linux] + '@esbuild/linux-s390x@0.25.12': + resolution: {integrity: sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + '@esbuild/linux-x64@0.25.0': resolution: {integrity: sha512-9yl91rHw/cpwMCNytUDxwj2XjFpxML0y9HAOH9pNVQDpQrBxHy01Dx+vaMu0N1CKa/RzBD2hB4u//nfc+Sd3Cw==} engines: {node: '>=18'} cpu: [x64] os: [linux] + '@esbuild/linux-x64@0.25.12': + resolution: {integrity: sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + '@esbuild/netbsd-arm64@0.25.0': resolution: {integrity: sha512-RuG4PSMPFfrkH6UwCAqBzauBWTygTvb1nxWasEJooGSJ/NwRw7b2HOwyRTQIU97Hq37l3npXoZGYMy3b3xYvPw==} engines: {node: '>=18'} cpu: [arm64] os: [netbsd] + '@esbuild/netbsd-arm64@0.25.12': + resolution: {integrity: sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + '@esbuild/netbsd-x64@0.25.0': resolution: {integrity: sha512-jl+qisSB5jk01N5f7sPCsBENCOlPiS/xptD5yxOx2oqQfyourJwIKLRA2yqWdifj3owQZCL2sn6o08dBzZGQzA==} engines: {node: '>=18'} cpu: [x64] os: [netbsd] + '@esbuild/netbsd-x64@0.25.12': + resolution: {integrity: sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + '@esbuild/openbsd-arm64@0.25.0': resolution: {integrity: sha512-21sUNbq2r84YE+SJDfaQRvdgznTD8Xc0oc3p3iW/a1EVWeNj/SdUCbm5U0itZPQYRuRTW20fPMWMpcrciH2EJw==} engines: {node: '>=18'} cpu: [arm64] os: [openbsd] + '@esbuild/openbsd-arm64@0.25.12': + resolution: {integrity: sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + '@esbuild/openbsd-x64@0.25.0': resolution: {integrity: sha512-2gwwriSMPcCFRlPlKx3zLQhfN/2WjJ2NSlg5TKLQOJdV0mSxIcYNTMhk3H3ulL/cak+Xj0lY1Ym9ysDV1igceg==} engines: {node: '>=18'} cpu: [x64] os: [openbsd] + '@esbuild/openbsd-x64@0.25.12': + resolution: {integrity: sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + + '@esbuild/openharmony-arm64@0.25.12': + resolution: {integrity: sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openharmony] + '@esbuild/sunos-x64@0.25.0': resolution: {integrity: sha512-bxI7ThgLzPrPz484/S9jLlvUAHYMzy6I0XiU1ZMeAEOBcS0VePBFxh1JjTQt3Xiat5b6Oh4x7UC7IwKQKIJRIg==} engines: {node: '>=18'} cpu: [x64] os: [sunos] + '@esbuild/sunos-x64@0.25.12': + resolution: {integrity: sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + '@esbuild/win32-arm64@0.25.0': resolution: {integrity: sha512-ZUAc2YK6JW89xTbXvftxdnYy3m4iHIkDtK3CLce8wg8M2L+YZhIvO1DKpxrd0Yr59AeNNkTiic9YLf6FTtXWMw==} engines: {node: '>=18'} cpu: [arm64] os: [win32] + '@esbuild/win32-arm64@0.25.12': + resolution: {integrity: sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + '@esbuild/win32-ia32@0.25.0': resolution: {integrity: sha512-eSNxISBu8XweVEWG31/JzjkIGbGIJN/TrRoiSVZwZ6pkC6VX4Im/WV2cz559/TXLcYbcrDN8JtKgd9DJVIo8GA==} engines: {node: '>=18'} cpu: [ia32] os: [win32] + '@esbuild/win32-ia32@0.25.12': + resolution: {integrity: sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + '@esbuild/win32-x64@0.25.0': resolution: {integrity: sha512-ZENoHJBxA20C2zFzh6AI4fT6RraMzjYw4xKWemRTRmRVtN9c5DcH9r/f2ihEkMjOW5eGgrwCslG/+Y/3bL+DHQ==} engines: {node: '>=18'} cpu: [x64] os: [win32] + '@esbuild/win32-x64@0.25.12': + resolution: {integrity: sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + '@eslint-community/eslint-plugin-eslint-comments@4.5.0': resolution: {integrity: sha512-MAhuTKlr4y/CE3WYX26raZjy+I/kS2PLKSzvfmDCGrBLTFHOYwqROZdr4XwPgXwX3K9rjzMr4pSmUWGnzsUyMg==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -1994,41 +2156,6 @@ packages: cpu: [x64] os: [win32] - '@inquirer/ansi@1.0.2': - resolution: {integrity: sha512-S8qNSZiYzFd0wAcyG5AXCvUHC5Sr7xpZ9wZ2py9XR88jUz8wooStVx5M6dRzczbBWjic9NP7+rY0Xi7qqK/aMQ==} - engines: {node: '>=18'} - - '@inquirer/confirm@5.1.21': - resolution: {integrity: sha512-KR8edRkIsUayMXV+o3Gv+q4jlhENF9nMYUZs9PA2HzrXeHI8M5uDag70U7RJn9yyiMZSbtF5/UexBtAVtZGSbQ==} - engines: {node: '>=18'} - peerDependencies: - '@types/node': '>=18' - peerDependenciesMeta: - '@types/node': - optional: true - - '@inquirer/core@10.3.2': - resolution: {integrity: sha512-43RTuEbfP8MbKzedNqBrlhhNKVwoK//vUFNW3Q3vZ88BLcrs4kYpGg+B2mm5p2K/HfygoCxuKwJJiv8PbGmE0A==} - engines: {node: '>=18'} - peerDependencies: - '@types/node': '>=18' - peerDependenciesMeta: - '@types/node': - optional: true - - '@inquirer/figures@1.0.15': - resolution: {integrity: sha512-t2IEY+unGHOzAaVM5Xx6DEWKeXlDDcNPeDyUpsRc6CUhBfU3VQOEl+Vssh7VNp1dR8MdUJBWhuObjXCsVpjN5g==} - engines: {node: '>=18'} - - '@inquirer/type@3.0.10': - resolution: {integrity: sha512-BvziSRxfz5Ov8ch0z/n3oijRSEcEsHnhggm4xFZe93DHcUCTlutlq9Ox4SVENAfcRD22UQq7T/atg9Wr3k09eA==} - engines: {node: '>=18'} - peerDependencies: - '@types/node': '>=18' - peerDependenciesMeta: - '@types/node': - optional: true - '@isaacs/balanced-match@4.0.1': resolution: {integrity: sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ==} engines: {node: 20 || >=22} @@ -2241,10 +2368,6 @@ packages: resolution: {integrity: sha512-2+BzZbjRO7Ct61k8fMNHEtoKjeWI9pIlHFTqBwZ5icHpqszIgEZbjb1MW5Z0+bITTCTl3gk4PDBxs9tA/csXvA==} engines: {node: '>=18'} - '@mswjs/interceptors@0.40.0': - resolution: {integrity: sha512-EFd6cVbHsgLa6wa4RljGj6Wk75qoHxUSyc5asLyyPSyuhIcdS2Q3Phw6ImS1q+CkALthJRShiYfKANcQMuMqsQ==} - engines: {node: '>=18'} - '@napi-rs/wasm-runtime@1.1.0': resolution: {integrity: sha512-Fq6DJW+Bb5jaWE69/qOE0D1TUN9+6uWhCeZpdnSBk14pjLcCWR7Q8n49PTSPHazM37JqrsdpEthXy2xn6jWWiA==} @@ -2432,143 +2555,143 @@ packages: '@open-draft/until@2.1.0': resolution: {integrity: sha512-U69T3ItWHvLwGg5eJ0n3I62nWuE6ilHlmz7zM0npLBRvPRd7e6NYmg54vvRtP5mZG7kZqZCFVdsTWo7BPtBujg==} - '@oxc-resolver/binding-android-arm-eabi@11.14.2': - resolution: {integrity: sha512-bTrdE4Z1JcGwPxBOaGbxRbpOHL8/xPVJTTq3/bAZO2euWX0X7uZ+XxsbC+5jUDMhLenqdFokgE1akHEU4xsh6A==} + '@oxc-resolver/binding-android-arm-eabi@11.15.0': + resolution: {integrity: sha512-Q+lWuFfq7whNelNJIP1dhXaVz4zO9Tu77GcQHyxDWh3MaCoO2Bisphgzmsh4ZoUe2zIchQh6OvQL99GlWHg9Tw==} cpu: [arm] os: [android] - '@oxc-resolver/binding-android-arm64@11.14.2': - resolution: {integrity: sha512-bL7/f6YGKUvt/wzpX7ZrHCf1QerotbSG+IIb278AklXuwr6yQdfQHt7KQ8hAWqSYpB2TAbPbAa9HE4wzVyxL9Q==} + '@oxc-resolver/binding-android-arm64@11.15.0': + resolution: {integrity: sha512-vbdBttesHR0W1oJaxgWVTboyMUuu+VnPsHXJ6jrXf4czELzB6GIg5DrmlyhAmFBhjwov+yJH/DfTnHS+2sDgOw==} cpu: [arm64] os: [android] - '@oxc-resolver/binding-darwin-arm64@11.14.2': - resolution: {integrity: sha512-0zhMhqHz/kC6/UzMC4D9mVBz3/M9UTorbaULfHjAW5b8SUC08H01lZ5fR3OzfDbJI0ByLfiQZmbovuR/pJ8Wzg==} + '@oxc-resolver/binding-darwin-arm64@11.15.0': + resolution: {integrity: sha512-R67lsOe1UzNjqVBCwCZX1rlItTsj/cVtBw4Uy19CvTicqEWvwaTn8t34zLD75LQwDDPCY3C8n7NbD+LIdw+ZoA==} cpu: [arm64] os: [darwin] - '@oxc-resolver/binding-darwin-x64@11.14.2': - resolution: {integrity: sha512-kRJBTCQnrGy1mjO+658yMrlGYWEKi6j4JvKt92PRCoeDX0vW4jvzgoJXzZXNxZL1pCY6jIdwsn9u53v4jwpR6g==} + '@oxc-resolver/binding-darwin-x64@11.15.0': + resolution: {integrity: sha512-77mya5F8WV0EtCxI0MlVZcqkYlaQpfNwl/tZlfg4jRsoLpFbaTeWv75hFm6TE84WULVlJtSgvf7DhoWBxp9+ZQ==} cpu: [x64] os: [darwin] - '@oxc-resolver/binding-freebsd-x64@11.14.2': - resolution: {integrity: sha512-lpKiya7qPq5EAV5E16SJbxfhNYRCBZATGngn9mZxR2fMLDVbHISDIP2Br8eWA8M1FBJFsOGgBzxDo+42ySSNZQ==} + '@oxc-resolver/binding-freebsd-x64@11.15.0': + resolution: {integrity: sha512-X1Sz7m5PC+6D3KWIDXMUtux+0Imj6HfHGdBStSvgdI60OravzI1t83eyn6eN0LPTrynuPrUgjk7tOnOsBzSWHw==} cpu: [x64] os: [freebsd] - '@oxc-resolver/binding-linux-arm-gnueabihf@11.14.2': - resolution: {integrity: sha512-zRIf49IGs4cE9rwpVM3NxlHWquZpwQLebtc9dY9S+4+B+PSLIP95BrzdRfkspwzWC5DKZsOWpvGQjxQiLoUwGA==} + '@oxc-resolver/binding-linux-arm-gnueabihf@11.15.0': + resolution: {integrity: sha512-L1x/wCaIRre+18I4cH/lTqSAymlV0k4HqfSYNNuI9oeL28Ks86lI6O5VfYL6sxxWYgjuWB98gNGo7tq7d4GarQ==} cpu: [arm] os: [linux] - '@oxc-resolver/binding-linux-arm-musleabihf@11.14.2': - resolution: {integrity: sha512-sF1fBrcfwoRkv1pR3Kp6D5MuBeHRPxYuzk9rhaun/50vq5nAMOaomkEm4hBbTSubfU86CoBIEbLUQ+1f7NvUVA==} + '@oxc-resolver/binding-linux-arm-musleabihf@11.15.0': + resolution: {integrity: sha512-abGXd/zMGa0tH8nKlAXdOnRy4G7jZmkU0J85kMKWns161bxIgGn/j7zxqh3DKEW98wAzzU9GofZMJ0P5YCVPVw==} cpu: [arm] os: [linux] - '@oxc-resolver/binding-linux-arm64-gnu@11.14.2': - resolution: {integrity: sha512-O8iTBqz6oxf1k93Rn6WMGGQYo2jV1K81hq4N/Nke3dHE25EIEg2RKQqMz1dFrvVb2RkvD7QaUTEevbx0Lq+4wQ==} + '@oxc-resolver/binding-linux-arm64-gnu@11.15.0': + resolution: {integrity: sha512-SVjjjtMW66Mza76PBGJLqB0KKyFTBnxmtDXLJPbL6ZPGSctcXVmujz7/WAc0rb9m2oV0cHQTtVjnq6orQnI/jg==} cpu: [arm64] os: [linux] - '@oxc-resolver/binding-linux-arm64-musl@11.14.2': - resolution: {integrity: sha512-HOfzpS6eUxvdch9UlXCMx2kNJWMNBjUpVJhseqAKDB1dlrfCHgexeLyBX977GLXkq2BtNXKsY3KCryy1QhRSRw==} + '@oxc-resolver/binding-linux-arm64-musl@11.15.0': + resolution: {integrity: sha512-JDv2/AycPF2qgzEiDeMJCcSzKNDm3KxNg0KKWipoKEMDFqfM7LxNwwSVyAOGmrYlE4l3dg290hOMsr9xG7jv9g==} cpu: [arm64] os: [linux] - '@oxc-resolver/binding-linux-ppc64-gnu@11.14.2': - resolution: {integrity: sha512-0uLG6F2zljUseQAUmlpx/9IdKpiLsSirpmrr8/aGVfiEurIJzC/1lo2HQskkM7e0VVOkXg37AjHUDLE23Fi8SA==} + '@oxc-resolver/binding-linux-ppc64-gnu@11.15.0': + resolution: {integrity: sha512-zbu9FhvBLW4KJxo7ElFvZWbSt4vP685Qc/Gyk/Ns3g2gR9qh2qWXouH8PWySy+Ko/qJ42+HJCLg+ZNcxikERfg==} cpu: [ppc64] os: [linux] - '@oxc-resolver/binding-linux-riscv64-gnu@11.14.2': - resolution: {integrity: sha512-Pdh0BH/E0YIK7Qg95IsAfQyU9rAoDoFh50R19zCTNfjSnwsoDMGHjmUc82udSfPo2YMnuxA+/+aglxmLQVSu2Q==} + '@oxc-resolver/binding-linux-riscv64-gnu@11.15.0': + resolution: {integrity: sha512-Kfleehe6B09C2qCnyIU01xLFqFXCHI4ylzkicfX/89j+gNHh9xyNdpEvit88Kq6i5tTGdavVnM6DQfOE2qNtlg==} cpu: [riscv64] os: [linux] - '@oxc-resolver/binding-linux-riscv64-musl@11.14.2': - resolution: {integrity: sha512-3DLQhJ2r53rCH5cudYFqD7nh+Z6ABvld3GjbiqHhT43GMIPw3JcHekC2QunLRNjRr1G544fo1HtjTJz9rCBpyg==} + '@oxc-resolver/binding-linux-riscv64-musl@11.15.0': + resolution: {integrity: sha512-J7LPiEt27Tpm8P+qURDwNc8q45+n+mWgyys4/V6r5A8v5gDentHRGUx3iVk5NxdKhgoGulrzQocPTZVosq25Eg==} cpu: [riscv64] os: [linux] - '@oxc-resolver/binding-linux-s390x-gnu@11.14.2': - resolution: {integrity: sha512-G5BnAOQ5f+RUG1cvlJ4BvV+P7iKLYBv67snqgcfwD5b2N4UwJj32bt4H5JfolocWy4x3qUjEDWTIjHdE+2uZ9w==} + '@oxc-resolver/binding-linux-s390x-gnu@11.15.0': + resolution: {integrity: sha512-+8/d2tAScPjVJNyqa7GPGnqleTB/XW9dZJQ2D/oIM3wpH3TG+DaFEXBbk4QFJ9K9AUGBhvQvWU2mQyhK/yYn3Q==} cpu: [s390x] os: [linux] - '@oxc-resolver/binding-linux-x64-gnu@11.14.2': - resolution: {integrity: sha512-VirQAX2PqKrhWtQGsSDEKlPhbgh3ggjT1sWuxLk4iLFwtyA2tLEPXJNAsG0kfAS2+VSA8OyNq16wRpQlMPZ4yA==} + '@oxc-resolver/binding-linux-x64-gnu@11.15.0': + resolution: {integrity: sha512-xtvSzH7Nr5MCZI2FKImmOdTl9kzuQ51RPyLh451tvD2qnkg3BaqI9Ox78bTk57YJhlXPuxWSOL5aZhKAc9J6qg==} cpu: [x64] os: [linux] - '@oxc-resolver/binding-linux-x64-musl@11.14.2': - resolution: {integrity: sha512-q4ORcwMkpzu4EhZyka/s2TuH2QklEHAr/mIQBXzu5BACeBJZIFkICp8qrq4XVnkEZ+XhSFTvBECqfMTT/4LSkA==} + '@oxc-resolver/binding-linux-x64-musl@11.15.0': + resolution: {integrity: sha512-14YL1zuXj06+/tqsuUZuzL0T425WA/I4nSVN1kBXeC5WHxem6lQ+2HGvG+crjeJEqHgZUT62YIgj88W+8E7eyg==} cpu: [x64] os: [linux] - '@oxc-resolver/binding-openharmony-arm64@11.14.2': - resolution: {integrity: sha512-ZsMIpDCxSFpUM/TwOovX5vZUkV0IukPFnrKTGaeJRuTKXMcJxMiQGCYTwd6y684Y3j55QZqIMkVM9NdCGUX6Kw==} + '@oxc-resolver/binding-openharmony-arm64@11.15.0': + resolution: {integrity: sha512-/7Qli+1Wk93coxnrQaU8ySlICYN8HsgyIrzqjgIkQEpI//9eUeaeIHZptNl2fMvBGeXa7k2QgLbRNaBRgpnvMw==} cpu: [arm64] os: [openharmony] - '@oxc-resolver/binding-wasm32-wasi@11.14.2': - resolution: {integrity: sha512-Lvq5ZZNvSjT3Jq/buPFMtp55eNyGlEWsq30tN+yLOfODSo6T6yAJNs6+wXtqu9PiMj4xpVtgXypHtbQ1f+t7kw==} + '@oxc-resolver/binding-wasm32-wasi@11.15.0': + resolution: {integrity: sha512-q5rn2eIMQLuc/AVGR2rQKb2EVlgreATGG8xXg8f4XbbYCVgpxaq+dgMbiPStyNywW1MH8VU2T09UEm30UtOQvg==} engines: {node: '>=14.0.0'} cpu: [wasm32] - '@oxc-resolver/binding-win32-arm64-msvc@11.14.2': - resolution: {integrity: sha512-7w7WHSLSSmkkYHH52QF7TrO0Z8eaIjRUrre5M56hSWRAZupCRzADZxBVMpDnHobZ8MAa2kvvDEfDbERuOK/avQ==} + '@oxc-resolver/binding-win32-arm64-msvc@11.15.0': + resolution: {integrity: sha512-yCAh2RWjU/8wWTxQDgGPgzV9QBv0/Ojb5ej1c/58iOjyTuy/J1ZQtYi2SpULjKmwIxLJdTiCHpMilauWimE31w==} cpu: [arm64] os: [win32] - '@oxc-resolver/binding-win32-ia32-msvc@11.14.2': - resolution: {integrity: sha512-hIrdlWa6tzqyfuWrxUetURBWHttBS+NMbBrGhCupc54NCXFy2ArB+0JOOaLYiI2ShKL5a3uqB7EWxmjzOuDdPQ==} + '@oxc-resolver/binding-win32-ia32-msvc@11.15.0': + resolution: {integrity: sha512-lmXKb6lvA6M6QIbtYfgjd+AryJqExZVSY2bfECC18OPu7Lv1mHFF171Mai5l9hG3r4IhHPPIwT10EHoilSCYeA==} cpu: [ia32] os: [win32] - '@oxc-resolver/binding-win32-x64-msvc@11.14.2': - resolution: {integrity: sha512-dP9aV6AZRRpg5mlg0eMuTROtttpQwj3AiegNJ/NNmMSjs+0+aLNcgkWRPhskK3vjTsthH4/+kKLpnQhSxdJkNg==} + '@oxc-resolver/binding-win32-x64-msvc@11.15.0': + resolution: {integrity: sha512-HZsfne0s/tGOcJK9ZdTGxsNU2P/dH0Shf0jqrPvsC6wX0Wk+6AyhSpHFLQCnLOuFQiHHU0ePfM8iYsoJb5hHpQ==} cpu: [x64] os: [win32] - '@oxlint/darwin-arm64@1.31.0': - resolution: {integrity: sha512-HqoYNH5WFZRdqGUROTFGOdBcA9y/YdHNoR/ujlyVO53it+q96dujbgKEvlff/WEuo4LbDKBrKLWKTKvOd/VYdg==} + '@oxlint/darwin-arm64@1.32.0': + resolution: {integrity: sha512-yrqPmZYu5Qb+49h0P5EXVIq8VxYkDDM6ZQrWzlh16+UGFcD8HOXs4oF3g9RyfaoAbShLCXooSQsM/Ifwx8E/eQ==} cpu: [arm64] os: [darwin] - '@oxlint/darwin-x64@1.31.0': - resolution: {integrity: sha512-gNq+JQXBCkYKQhmJEgSNjuPqmdL8yBEX3v0sueLH3g5ym4OIrNO7ml1M7xzCs0zhINQCR9MsjMJMyBNaF1ed+g==} + '@oxlint/darwin-x64@1.32.0': + resolution: {integrity: sha512-pQRZrJG/2nAKc3IuocFbaFFbTDlQsjz2WfivRsMn0hw65EEsSuM84WMFMiAfLpTGyTICeUtHZLHlrM5lzVr36A==} cpu: [x64] os: [darwin] - '@oxlint/linux-arm64-gnu@1.31.0': - resolution: {integrity: sha512-cRmttpr3yHPwbrvtPNlv+0Zw2Oeh0cU902iMI4fFW9ylbW/vUAcz6DvzGMCYZbII8VDiwQ453SV5AA8xBgMbmw==} + '@oxlint/linux-arm64-gnu@1.32.0': + resolution: {integrity: sha512-tyomSmU2DzwcTmbaWFmStHgVfRmJDDvqcIvcw4fRB1YlL2Qg/XaM4NJ0m2bdTap38gxD5FSxSgCo0DkQ8GTolg==} cpu: [arm64] os: [linux] - '@oxlint/linux-arm64-musl@1.31.0': - resolution: {integrity: sha512-0p7vn0hdMdNPIUzemw8f1zZ2rRZ/963EkK3o4P0KUXOPgleo+J9ZIPH7gcHSHtyrNaBifN03wET1rH4SuWQYnA==} + '@oxlint/linux-arm64-musl@1.32.0': + resolution: {integrity: sha512-0W46dRMaf71OGE4+Rd+GHfS1uF/UODl5Mef6871pMhN7opPGfTI2fKJxh9VzRhXeSYXW/Z1EuCq9yCfmIJq+5Q==} cpu: [arm64] os: [linux] - '@oxlint/linux-x64-gnu@1.31.0': - resolution: {integrity: sha512-vNIbpSwQ4dwN0CUmojG7Y91O3CXOf0Kno7DSTshk/JJR4+u8HNVuYVjX2qBRk0OMc4wscJbEd7wJCl0VJOoCOw==} + '@oxlint/linux-x64-gnu@1.32.0': + resolution: {integrity: sha512-5+6myVCBOMvM62rDB9T3CARXUvIwhGqte6E+HoKRwYaqsxGUZ4bh3pItSgSFwHjLGPrvADS11qJUkk39eQQBzQ==} cpu: [x64] os: [linux] - '@oxlint/linux-x64-musl@1.31.0': - resolution: {integrity: sha512-4avnH09FJRTOT2cULdDPG0s14C+Ku4cnbNye6XO7rsiX6Bprz+aQblLA+1WLOr7UfC/0zF+jnZ9K5VyBBJy9Kw==} + '@oxlint/linux-x64-musl@1.32.0': + resolution: {integrity: sha512-qwQlwYYgVIC6ScjpUwiKKNyVdUlJckrfwPVpIjC9mvglIQeIjKuuyaDxUZWIOc/rEzeCV/tW6tcbehLkfEzqsw==} cpu: [x64] os: [linux] - '@oxlint/win32-arm64@1.31.0': - resolution: {integrity: sha512-mQaD5H93OUpxiGjC518t5wLQikf0Ur5mQEKO2VoTlkp01gqmrQ+hyCLOzABlsAIAeDJD58S9JwNOw4KFFnrqdw==} + '@oxlint/win32-arm64@1.32.0': + resolution: {integrity: sha512-7qYZF9CiXGtdv8Z/fBkgB5idD2Zokht67I5DKWH0fZS/2R232sDqW2JpWVkXltk0+9yFvmvJ0ouJgQRl9M3S2g==} cpu: [arm64] os: [win32] - '@oxlint/win32-x64@1.31.0': - resolution: {integrity: sha512-AS/h58HfloccRlVs7P3zbyZfxNS62JuE8/3fYGjkiRlR1ZoDxdqmz5QgLEn+YxxFUTMmclGAPMFHg9z2Pk315A==} + '@oxlint/win32-x64@1.32.0': + resolution: {integrity: sha512-XW1xqCj34MEGJlHteqasTZ/LmBrwYIgluhNW0aP+XWkn90+stKAq3W/40dvJKbMK9F7o09LPCuMVtUW7FIUuiA==} cpu: [x64] os: [win32] @@ -2664,6 +2787,11 @@ packages: resolution: {integrity: sha512-QNqXyfVS2wm9hweSYD2O7F0G06uurj9kZ96TRQE5Y9hU7+tgdZwIkbAKc5Ocy1HxEY2kuDQa6cQ1WRs/O5LFKA==} engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} + '@playwright/test@1.57.0': + resolution: {integrity: sha512-6TyEnHgd6SArQO8UO2OMTxshln3QMWBtPGrOCgs3wVEmQmwyuNtB10IZMfmYDE0riwNR1cu4q+pPcxMVtaG3TA==} + engines: {node: '>=18'} + hasBin: true + '@pmmmwh/react-refresh-webpack-plugin@0.5.17': resolution: {integrity: sha512-tXDyE1/jzFsHXjhRZQ3hMl0IVhYe5qula43LDWIhVfjp9G/nT5OQY5AORVOrkEGAUltBJOfOWeETbmhm6kHhuQ==} engines: {node: '>= 10.13'} @@ -3202,21 +3330,21 @@ packages: resolution: {integrity: sha512-RL1f5ZlfZMpghrCIdzl6mLOFLTuhqmPNblZgBaeKfdtk5rfbjykurv+VfYydOFXj0vxVIoA2d/zT7xfD7Ph8fw==} engines: {node: '>=18'} - '@tanstack/form-core@1.27.0': - resolution: {integrity: sha512-QFEhg9/VcrwtpbcN7Qpl8JVVfEm2UJ+dzfDFGGMYub2J9jsgrp2HmaY7LSLlnkpTJlCIDxQiWDkiOFYQtK6yzw==} + '@tanstack/form-core@1.27.1': + resolution: {integrity: sha512-hPM+0tUnZ2C2zb2TE1lar1JJ0S0cbnQHlUwFcCnVBpMV3rjtUzkoM766gUpWrlmTGCzNad0GbJ0aTxVsjT6J8g==} '@tanstack/pacer@0.15.4': resolution: {integrity: sha512-vGY+CWsFZeac3dELgB6UZ4c7OacwsLb8hvL2gLS6hTgy8Fl0Bm/aLokHaeDIP+q9F9HUZTnp360z9uv78eg8pg==} engines: {node: '>=18'} - '@tanstack/query-core@5.90.11': - resolution: {integrity: sha512-f9z/nXhCgWDF4lHqgIE30jxLe4sYv15QodfdPDKYAk7nAEjNcndy4dHz3ezhdUaR23BpWa4I2EH4/DZ0//Uf8A==} + '@tanstack/query-core@5.90.12': + resolution: {integrity: sha512-T1/8t5DhV/SisWjDnaiU2drl6ySvsHj1bHBCWNXd+/T+Hh1cf6JodyEYMd5sgwm+b/mETT4EV3H+zCVczCU5hg==} '@tanstack/query-devtools@5.91.1': resolution: {integrity: sha512-l8bxjk6BMsCaVQH6NzQEE/bEgFy1hAs5qbgXl0xhzezlaQbPk6Mgz9BqEg2vTLPOHD8N4k+w/gdgCbEzecGyNg==} - '@tanstack/react-form@1.27.0': - resolution: {integrity: sha512-7MBOtvjlUwkGpvA9TIOs3YdLoyfJWZYtxuAQIdkLDZ9HLrRaRbxWQIZ2H6sRVA35sPvx6uiQMunGHOPKip5AZA==} + '@tanstack/react-form@1.27.1': + resolution: {integrity: sha512-HKP0Ew2ae9AL5vU1PkJ+oAC2p+xBtA905u0fiNLzlfn1vLkBxenfg5L6TOA+rZITHpQsSo10tqwc5Yw6qn8Mpg==} peerDependencies: '@tanstack/react-start': '*' react: ^17.0.0 || ^18.0.0 || ^19.0.0 @@ -3230,8 +3358,8 @@ packages: '@tanstack/react-query': ^5.90.10 react: ^18 || ^19 - '@tanstack/react-query@5.90.11': - resolution: {integrity: sha512-3uyzz01D1fkTLXuxF3JfoJoHQMU2fxsfJwE+6N5hHy0dVNoZOvwKP8Z2k7k1KDeD54N20apcJnG75TBAStIrBA==} + '@tanstack/react-query@5.90.12': + resolution: {integrity: sha512-graRZspg7EoEaw0a8faiUASCyJrqjKPdqJ9EwuDRUF9mEYJ1YPczI9H+/agJ0mOJkPCJDk0lsz5QTrLZ/jQ2rg==} peerDependencies: react: ^18 || ^19 @@ -3241,8 +3369,8 @@ packages: react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - '@tanstack/react-virtual@3.13.12': - resolution: {integrity: sha512-Gd13QdxPSukP8ZrkbgS2RwoZseTTbQPLnQEn7HY/rqtM+8Zt95f7xKC7N0EsKs7aoz0WzZ+fditZux+F8EzYxA==} + '@tanstack/react-virtual@3.13.13': + resolution: {integrity: sha512-4o6oPMDvQv+9gMi8rE6gWmsOjtUZUYIJHv7EB+GblyYdi8U6OqLl8rhHWIUZSL1dUU2dPwTdTgybCKf9EjIrQg==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 @@ -3253,8 +3381,8 @@ packages: '@tanstack/store@0.8.0': resolution: {integrity: sha512-Om+BO0YfMZe//X2z0uLF2j+75nQga6TpTJgLJQBiq85aOyZNIhkCgleNcud2KQg4k4v9Y9l+Uhru3qWMPGTOzQ==} - '@tanstack/virtual-core@3.13.12': - resolution: {integrity: sha512-1YBOJfRHV4sXUmWsFSf5rQor4Ss82G8dQWLRbnk3GA4jeP8hQt1hxXh0tmflpC0dz3VgEv/1+qwPyLeWkQuPFA==} + '@tanstack/virtual-core@3.13.13': + resolution: {integrity: sha512-uQFoSdKKf5S8k51W5t7b2qpfkyIbdHMzAn+AMQvHPxKUPeo1SsGaA4JRISQT87jm28b7z8OEqPcg1IOZagQHcA==} '@testing-library/dom@10.4.1': resolution: {integrity: sha512-o4PXJQidqJl82ckFaXUeoAW+XysPLauYI43Abki5hABd853iMhitooc6znOnczgbTYmEP6U6/y1ZyKAIsvMKGg==} @@ -3514,8 +3642,8 @@ packages: '@types/node@18.15.0': resolution: {integrity: sha512-z6nr0TTEOBGkzLGmbypWOGnpSpSIBorEhC4L+4HeQ2iezKCi4f77kyslRwvHeNitymGQ+oFyIWGP96l/DPSV9w==} - '@types/node@20.19.25': - resolution: {integrity: sha512-ZsJzA5thDQMSQO788d7IocwwQbI8B5OPzmqNvpf3NY/+MHDAS759Wo0gd2WQeXYt5AAAQjzcrTVC6SKCuYgoCQ==} + '@types/node@20.19.26': + resolution: {integrity: sha512-0l6cjgF0XnihUpndDhk+nyD3exio3iKaYROSgvh/qSevPXax3L8p5DBRFjbvalnwatGgHEQn2R88y2fA3g4irg==} '@types/papaparse@5.5.1': resolution: {integrity: sha512-esEO+VISsLIyE+JZBmb89NzsYYbpwV8lmv2rPo6oX5y9KhBaIP7hhHgjuTut54qjdKVMufTEcrh5fUl9+58huw==} @@ -3566,9 +3694,6 @@ packages: '@types/stack-utils@2.0.3': resolution: {integrity: sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==} - '@types/statuses@2.0.6': - resolution: {integrity: sha512-xMAgYwceFhRA2zY+XbEA7mxYbA093wdiW8Vu6gZPGWy9cmOyU9XesH1tNcEWsKFd5Vzrqx5T3D38PWx1FIIXkA==} - '@types/trusted-types@2.0.7': resolution: {integrity: sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==} @@ -3593,109 +3718,109 @@ packages: '@types/zen-observable@0.8.3': resolution: {integrity: sha512-fbF6oTd4sGGy0xjHPKAt+eS2CrxJ3+6gQ3FGcBoIJR2TLAyCkCyI8JqZNy+FeON0AhVgNJoUumVoZQjBFUqHkw==} - '@typescript-eslint/eslint-plugin@8.48.1': - resolution: {integrity: sha512-X63hI1bxl5ohelzr0LY5coufyl0LJNthld+abwxpCoo6Gq+hSqhKwci7MUWkXo67mzgUK6YFByhmaHmUcuBJmA==} + '@typescript-eslint/eslint-plugin@8.49.0': + resolution: {integrity: sha512-JXij0vzIaTtCwu6SxTh8qBc66kmf1xs7pI4UOiMDFVct6q86G0Zs7KRcEoJgY3Cav3x5Tq0MF5jwgpgLqgKG3A==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - '@typescript-eslint/parser': ^8.48.1 + '@typescript-eslint/parser': ^8.49.0 eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/parser@8.48.1': - resolution: {integrity: sha512-PC0PDZfJg8sP7cmKe6L3QIL8GZwU5aRvUFedqSIpw3B+QjRSUZeeITC2M5XKeMXEzL6wccN196iy3JLwKNvDVA==} + '@typescript-eslint/parser@8.49.0': + resolution: {integrity: sha512-N9lBGA9o9aqb1hVMc9hzySbhKibHmB+N3IpoShyV6HyQYRGIhlrO5rQgttypi+yEeKsKI4idxC8Jw6gXKD4THA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/project-service@8.48.1': - resolution: {integrity: sha512-HQWSicah4s9z2/HifRPQ6b6R7G+SBx64JlFQpgSSHWPKdvCZX57XCbszg/bapbRsOEv42q5tayTYcEFpACcX1w==} + '@typescript-eslint/project-service@8.49.0': + resolution: {integrity: sha512-/wJN0/DKkmRUMXjZUXYZpD1NEQzQAAn9QWfGwo+Ai8gnzqH7tvqS7oNVdTjKqOcPyVIdZdyCMoqN66Ia789e7g==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/scope-manager@8.48.1': - resolution: {integrity: sha512-rj4vWQsytQbLxC5Bf4XwZ0/CKd362DkWMUkviT7DCS057SK64D5lH74sSGzhI6PDD2HCEq02xAP9cX68dYyg1w==} + '@typescript-eslint/scope-manager@8.49.0': + resolution: {integrity: sha512-npgS3zi+/30KSOkXNs0LQXtsg9ekZ8OISAOLGWA/ZOEn0ZH74Ginfl7foziV8DT+D98WfQ5Kopwqb/PZOaIJGg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/tsconfig-utils@8.48.1': - resolution: {integrity: sha512-k0Jhs4CpEffIBm6wPaCXBAD7jxBtrHjrSgtfCjUvPp9AZ78lXKdTR8fxyZO5y4vWNlOvYXRtngSZNSn+H53Jkw==} + '@typescript-eslint/tsconfig-utils@8.49.0': + resolution: {integrity: sha512-8prixNi1/6nawsRYxet4YOhnbW+W9FK/bQPxsGB1D3ZrDzbJ5FXw5XmzxZv82X3B+ZccuSxo/X8q9nQ+mFecWA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/type-utils@8.48.1': - resolution: {integrity: sha512-1jEop81a3LrJQLTf/1VfPQdhIY4PlGDBc/i67EVWObrtvcziysbLN3oReexHOM6N3jyXgCrkBsZpqwH0hiDOQg==} + '@typescript-eslint/type-utils@8.49.0': + resolution: {integrity: sha512-KTExJfQ+svY8I10P4HdxKzWsvtVnsuCifU5MvXrRwoP2KOlNZ9ADNEWWsQTJgMxLzS5VLQKDjkCT/YzgsnqmZg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/types@8.48.1': - resolution: {integrity: sha512-+fZ3LZNeiELGmimrujsDCT4CRIbq5oXdHe7chLiW8qzqyPMnn1puNstCrMNVAqwcl2FdIxkuJ4tOs/RFDBVc/Q==} + '@typescript-eslint/types@8.49.0': + resolution: {integrity: sha512-e9k/fneezorUo6WShlQpMxXh8/8wfyc+biu6tnAqA81oWrEic0k21RHzP9uqqpyBBeBKu4T+Bsjy9/b8u7obXQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/typescript-estree@8.48.1': - resolution: {integrity: sha512-/9wQ4PqaefTK6POVTjJaYS0bynCgzh6ClJHGSBj06XEHjkfylzB+A3qvyaXnErEZSaxhIo4YdyBgq6j4RysxDg==} + '@typescript-eslint/typescript-estree@8.49.0': + resolution: {integrity: sha512-jrLdRuAbPfPIdYNppHJ/D0wN+wwNfJ32YTAm10eJVsFmrVpXQnDWBn8niCSMlWjvml8jsce5E/O+86IQtTbJWA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/utils@8.48.1': - resolution: {integrity: sha512-fAnhLrDjiVfey5wwFRwrweyRlCmdz5ZxXz2G/4cLn0YDLjTapmN4gcCsTBR1N2rWnZSDeWpYtgLDsJt+FpmcwA==} + '@typescript-eslint/utils@8.49.0': + resolution: {integrity: sha512-N3W7rJw7Rw+z1tRsHZbK395TWSYvufBXumYtEGzypgMUthlg0/hmCImeA8hgO2d2G4pd7ftpxxul2J8OdtdaFA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/visitor-keys@8.48.1': - resolution: {integrity: sha512-BmxxndzEWhE4TIEEMBs8lP3MBWN3jFPs/p6gPm/wkv02o41hI6cq9AuSmGAaTTHPtA1FTi2jBre4A9rm5ZmX+Q==} + '@typescript-eslint/visitor-keys@8.49.0': + resolution: {integrity: sha512-LlKaciDe3GmZFphXIc79THF/YYBugZ7FS1pO581E/edlVVNbZKDy93evqmrfQ9/Y4uN0vVhX4iuchq26mK/iiA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript/native-preview-darwin-arm64@7.0.0-dev.20251204.1': - resolution: {integrity: sha512-CgIzuO/LFRufdVjJmll6x7jnejYqqLo4kJwrsUxQipJ/dcGeP0q2XMcxNBzT7F9L4Sd5dphRPOZFXES4kS0lig==} + '@typescript/native-preview-darwin-arm64@7.0.0-dev.20251209.1': + resolution: {integrity: sha512-F1cnYi+ZeinYQnaTQKKIsbuoq8vip5iepBkSZXlB8PjbG62LW1edUdktd/nVEc+Q+SEysSQ3jRdk9eU766s5iw==} cpu: [arm64] os: [darwin] - '@typescript/native-preview-darwin-x64@7.0.0-dev.20251204.1': - resolution: {integrity: sha512-X76oQeDMQHJiukkPPbk7STrfu97pfPe5ixwiN6nXzSGXLE+tzrXRecNkYhz4XWeAW2ASNmGwDJJ2RAU5l8MbgQ==} + '@typescript/native-preview-darwin-x64@7.0.0-dev.20251209.1': + resolution: {integrity: sha512-Ta6XKdAxEMBzd1xS4eQKXmlUkml+kMf23A9qFoegOxmyCdHJPak2gLH9ON5/C6js0ibZm1kdqwbcA0/INrcThg==} cpu: [x64] os: [darwin] - '@typescript/native-preview-linux-arm64@7.0.0-dev.20251204.1': - resolution: {integrity: sha512-+1as+h6ZNpc9TqlHwvDkBP7jg0FoCMUf6Rrc9/Mkllau6etznfVsWMADWT4t76gkGZKUIXOZqsl2Ya3uaBrCBQ==} + '@typescript/native-preview-linux-arm64@7.0.0-dev.20251209.1': + resolution: {integrity: sha512-kdiPMvs1hwi76hgvZjz4XQVNYTV+MAbJKnHXz6eL6aVXoTYzNtan5vWywKOHv9rV4jBMyVlZqtKbeG/XVV9WdQ==} cpu: [arm64] os: [linux] - '@typescript/native-preview-linux-arm@7.0.0-dev.20251204.1': - resolution: {integrity: sha512-3zl/Jj5rzkK9Oo5KVSIW+6bzRligoI+ZnA1xLpg0BBH2sk27a8Vasj7ZaGPlFvlSegvcaJdIjSt7Z8nBtiF9Ww==} + '@typescript/native-preview-linux-arm@7.0.0-dev.20251209.1': + resolution: {integrity: sha512-4e7WSBLLdmfJUGzm9Id4WA2fDZ2sY3Q6iudyZPNSb5AFsCmqQksM/JGAlNROHpi/tIqo95e3ckbjmrZTmH60EA==} cpu: [arm] os: [linux] - '@typescript/native-preview-linux-x64@7.0.0-dev.20251204.1': - resolution: {integrity: sha512-YD//l6yv7iPNlKn9OZDzBxrI+QGLN6d4RV3dSucsyq/YNZUulcywGztbZiaQxdUzKPwj70G+LVb9WCgf5ITOIQ==} + '@typescript/native-preview-linux-x64@7.0.0-dev.20251209.1': + resolution: {integrity: sha512-dH/Z50Xb52N4Csd0BXptmjuMN+87AhUAjM9Y5rNU8VwcUJJDFpKM6aKUhd4Q+XEVJWPFPlKDLx3pVhnO31CBhQ==} cpu: [x64] os: [linux] - '@typescript/native-preview-win32-arm64@7.0.0-dev.20251204.1': - resolution: {integrity: sha512-eDXYR5qfPFA8EfQ0d9SbWGLn02VbAaeTM9jQ5VeLlPLcBP81nGRaGQ9Quta5zeEHev1S9iCdyRj5BqCRtl0ohw==} + '@typescript/native-preview-win32-arm64@7.0.0-dev.20251209.1': + resolution: {integrity: sha512-vW7IGRNIUhhQ0vzFY3sRNxvYavNGum2OWgW1Bwc05yhg9AexBlRjdhsUSTLQ2dUeaDm2nx4i38LhXIVgLzMNeA==} cpu: [arm64] os: [win32] - '@typescript/native-preview-win32-x64@7.0.0-dev.20251204.1': - resolution: {integrity: sha512-CRWI2OPdqXbzOU52R2abWMb3Ie2Wp6VPrCFzR3pzP53JabTAe8+XoBWlont9bw/NsqbPKp2aQbdfbLQX5RI44g==} + '@typescript/native-preview-win32-x64@7.0.0-dev.20251209.1': + resolution: {integrity: sha512-jKT6npBrhRX/84LWSy9PbOWx2USTZhq9SOkvH2mcnU/+uqyNxZIMMVnW5exIyzcnWSPly3jK2qpfiHNjdrDaAA==} cpu: [x64] os: [win32] - '@typescript/native-preview@7.0.0-dev.20251204.1': - resolution: {integrity: sha512-nyMp0ybgJVZFtDOWmcKDqaRqtj8dOg65+fDxbjIrnZuMWIqlOUGH+imFwofqlW+KndAA7KtAio2YSZMMZB25WA==} + '@typescript/native-preview@7.0.0-dev.20251209.1': + resolution: {integrity: sha512-xnx3A1S1TTx+mx8FfP1UwkNTwPBmhGCbOh4PDNRUV5gDZkVuDDN3y1F7NPGSMg6MXE1KKPSLNM+PQMN33ZAL2Q==} hasBin: true '@ungap/structured-clone@1.3.0': resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} - '@vitest/eslint-plugin@1.5.1': - resolution: {integrity: sha512-t49CNERe/YadnLn90NTTKJLKzs99xBkXElcoUTLodG6j1G0Q7jy3mXqqiHd3N5aryG2KkgOg4UAoGwgwSrZqKQ==} + '@vitest/eslint-plugin@1.5.2': + resolution: {integrity: sha512-2t1F2iecXB/b1Ox4U137lhD3chihEE3dRVtu3qMD35tc6UqUjg1VGRJoS1AkFKwpT8zv8OQInzPQO06hrRkeqw==} engines: {node: '>=18'} peerDependencies: eslint: '>=8.57.0' @@ -4051,8 +4176,8 @@ packages: base64-js@1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} - baseline-browser-mapping@2.8.32: - resolution: {integrity: sha512-OPz5aBThlyLFgxyhdwf/s2+8ab3OvT7AdTNvKHBwpXomIYeXqpUUuT8LrdtxZSsWJ4R4CU1un4XGh5Ez3nlTpw==} + baseline-browser-mapping@2.9.5: + resolution: {integrity: sha512-D5vIoztZOq1XM54LUdttJVc96ggEsIfju2JBvht06pSzpckp3C7HReun67Bghzrtdsq9XdMGbSSB3v3GhMNmAA==} hasBin: true before-after-hook@3.0.2: @@ -4122,8 +4247,8 @@ packages: browserify-zlib@0.2.0: resolution: {integrity: sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==} - browserslist@4.28.0: - resolution: {integrity: sha512-tbydkR/CxfMwelN0vwdP/pLkDwyAASZ+VfWm4EOwlB6SWhx1sYnWLqo8N5j0rAzPfzfRaxt0mM/4wPU/Su84RQ==} + browserslist@4.28.1: + resolution: {integrity: sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true @@ -4188,11 +4313,8 @@ packages: resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} engines: {node: '>=10'} - caniuse-lite@1.0.30001757: - resolution: {integrity: sha512-r0nnL/I28Zi/yjk1el6ilj27tKcdjLsNqAOZr0yVjWPrSQyHgKI2INaEWw21bAQSv2LXRt1XuCS/GomNpWOxsQ==} - - caniuse-lite@1.0.30001759: - resolution: {integrity: sha512-Pzfx9fOKoKvevQf8oCXoyNRQ5QyxJj+3O0Rqx2V5oxT61KGx8+n6hV/IUyJeifUci2clnmmKVpvtiqRzgiWjSw==} + caniuse-lite@1.0.30001760: + resolution: {integrity: sha512-7AAMPcueWELt1p3mi13HR/LHH0TJLT11cnwDJEs3xA4+CK/PLKeO9Kl1oru24htkyUKtkGCvAx4ohB0Ttry8Dw==} canvas@3.2.0: resolution: {integrity: sha512-jk0GxrLtUEmW/TmFsk2WghvgHe8B0pxGilqCL21y8lHkPUGa6FTsnCNtHPOzT8O3y+N+m3espawV80bbBlgfTA==} @@ -4337,10 +4459,6 @@ packages: resolution: {integrity: sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA==} engines: {node: '>=18'} - cli-width@4.1.0: - resolution: {integrity: sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==} - engines: {node: '>= 12'} - client-only@0.0.1: resolution: {integrity: sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==} @@ -4455,10 +4573,6 @@ packages: convert-source-map@2.0.0: resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} - cookie@1.1.1: - resolution: {integrity: sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ==} - engines: {node: '>=18'} - copy-to-clipboard@3.3.3: resolution: {integrity: sha512-2KV8NhB5JqC3ky0r9PMCAZKbUHSwtEo4CwCs0KXgruG43gX5PMqDEBbVU4OUzw2MuAWUfsuFmWvEKG5QRfSnJA==} @@ -4864,8 +4978,8 @@ packages: dompurify@3.2.7: resolution: {integrity: sha512-WhL/YuveyGXJaerVlMYGWhvQswa7myDG17P7Vu65EWC05o8vfeNbvNf4d/BOvH99+ZW+LlQsc1GDKMa1vNK6dw==} - dompurify@3.3.0: - resolution: {integrity: sha512-r+f6MYR1gGN1eJv0TVQbhA7if/U7P87cdPl3HN5rikqaBSBxLiCb/b9O+2eG0cxz0ghyU+mU1QkbsOwERMYlWQ==} + dompurify@3.3.1: + resolution: {integrity: sha512-qkdCKzLNtrgPFP1Vo+98FRzJnBRGe4ffyCea9IwHB1fyxPOeNTHpLKYGd4Uk9xvNoH0ZoOjwZxNptyMwqrId1Q==} domutils@2.8.0: resolution: {integrity: sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==} @@ -4877,6 +4991,10 @@ packages: resolution: {integrity: sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==} engines: {node: '>=12'} + dotenv@17.2.3: + resolution: {integrity: sha512-JVUnt+DUIzu87TABbhPmNfVdBDt18BLOWjMUFJMSi/Qqg7NTYtabbvSNJGOJ7afbRuv9D/lngizHtP7QyLQ+9w==} + engines: {node: '>=12'} + duplexer@0.1.2: resolution: {integrity: sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==} @@ -4894,8 +5012,8 @@ packages: engines: {node: '>=0.10.0'} hasBin: true - electron-to-chromium@1.5.263: - resolution: {integrity: sha512-DrqJ11Knd+lo+dv+lltvfMDLU27g14LMdH2b0O3Pio4uk0x+z7OR+JrmyacTPN2M8w3BrZ7/RTwG3R9B7irPlg==} + electron-to-chromium@1.5.267: + resolution: {integrity: sha512-0Drusm6MVRXSOJpGbaSVgcQsuB4hEkMpHXaVstcPmhu5LIedxs1xNK/nIxmQIU/RPC0+1/o0AVZfBTkTNJOdUw==} elkjs@0.9.3: resolution: {integrity: sha512-f/ZeWvW/BCXbhGEf1Ujp29EASo/lk1FDnETgNKwJrsVvGZhUWCZyg3xLJjAsxfOmt8KjswHmI5EwCQcPMpOYhQ==} @@ -4975,6 +5093,11 @@ packages: engines: {node: '>=18'} hasBin: true + esbuild@0.25.12: + resolution: {integrity: sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==} + engines: {node: '>=18'} + hasBin: true + escalade@3.2.0: resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} engines: {node: '>=6'} @@ -5079,8 +5202,8 @@ packages: resolution: {integrity: sha512-brcKcxGnISN2CcVhXJ/kEQlNa0MEfGRtwKtWA16SkqXHKitaKIMrfemJKLKX1YqDU5C/5JY3PvZXd5jEW04e0Q==} engines: {node: '>=5.0.0'} - eslint-plugin-oxlint@1.31.0: - resolution: {integrity: sha512-yIUkBg9qZCL9DZVSvH3FklF5urG7LRboZD0/YLf/CvihPpcfBeMyH1onaG3+iKMCIRa/uwXgdRjB5MSOplFTVw==} + eslint-plugin-oxlint@1.32.0: + resolution: {integrity: sha512-CodKgz/9q3euGbCYrXVRyFxHfnrxn9Q4EywqE4V/VYegry2pJ9/hPQ0OUDTRzbl3/pPbVndkrUUm5tK8NTSgeg==} eslint-plugin-perfectionist@4.15.1: resolution: {integrity: sha512-MHF0cBoOG0XyBf7G0EAFCuJJu4I18wy0zAoT1OHfx2o6EOx1EFTIzr2HGeuZa1kDcusoX0xJ9V7oZmaeFd773Q==} @@ -5088,8 +5211,8 @@ packages: peerDependencies: eslint: '>=8.45.0' - eslint-plugin-pnpm@1.3.0: - resolution: {integrity: sha512-Lkdnj3afoeUIkDUu8X74z60nrzjQ2U55EbOeI+qz7H1He4IO4gmUKT2KQIl0It52iMHJeuyLDWWNgjr6UIK8nw==} + eslint-plugin-pnpm@1.4.2: + resolution: {integrity: sha512-em/HEUlud5G3G4VZe2dhgsLm2ey6CG+Y+Lq3fS/RsbnmKhi+D+LcLz31GphTJhizCoKl2oAVndMltOHbuBYe+A==} peerDependencies: eslint: ^9.0.0 @@ -5616,10 +5739,6 @@ packages: graphemer@1.4.0: resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} - graphql@16.12.0: - resolution: {integrity: sha512-DKKrynuQRne0PNpEbzuEdHlYOMksHSUI8Zc9Unei5gTsMNA2/vMpoMz/yKba50pejK56qj98qM0SjYxAKi13gQ==} - engines: {node: ^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0} - gzip-size@6.0.0: resolution: {integrity: sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==} engines: {node: '>=10'} @@ -5679,8 +5798,8 @@ packages: hast-util-to-jsx-runtime@2.3.6: resolution: {integrity: sha512-zl6s8LwNyo1P9uw+XJGvZtdFF1GdAkOg8ujOw+4Pyb76874fLps4ueHXDhXWdk6YHQ6OgUtinliG7RsYvCbbBg==} - hast-util-to-parse5@8.0.0: - resolution: {integrity: sha512-3KKrV5ZVI8if87DVSi1vDeByYrkGzg4mEfeu4alwgmmIeARiBLKCZS2uw5Gb6nU9x9Yufyj3iudm6i7nl52PFw==} + hast-util-to-parse5@8.0.1: + resolution: {integrity: sha512-MlWT6Pjt4CG9lFCjiz4BH7l9wmrMkfkJYCxFwKQic8+RTZgWPuWxwAfjJElsXkex7DJjfSJsQIt931ilUgmwdA==} hast-util-to-text@4.0.2: resolution: {integrity: sha512-KK6y/BN8lbaq654j7JgBydev7wuNMcID54lkRav1P0CaE1e47P72AWWPiGKXTJU271ooYzcvTAn/Zt0REnvc7A==} @@ -5698,9 +5817,6 @@ packages: resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} hasBin: true - headers-polyfill@4.0.3: - resolution: {integrity: sha512-IScLbePpkvO846sIwOtOTDjutRMWdXdJmXdMvk6gCBHxFO8d+QKOQedyZSxFTTFYRSmlgSTDtXqqq4pcenBXLQ==} - highlight.js@10.7.3: resolution: {integrity: sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==} @@ -6238,8 +6354,8 @@ packages: engines: {node: '>=6'} hasBin: true - jsonc-eslint-parser@2.4.1: - resolution: {integrity: sha512-uuPNLJkKN8NXAlZlQ6kmUF9qO+T6Kyd7oV4+/7yy8Jz6+MZNyhPq8EdLpdfnPVzUC8qSf1b4j1azKaGnFsjmsw==} + jsonc-eslint-parser@2.4.2: + resolution: {integrity: sha512-1e4qoRgnn448pRuMvKGsFFymUCquZV0mpGgOyIKNgD3JVDTsVJyRBGH/Fm0tBb8WsWGgmB1mDe6/yJMQM37DUA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} jsonc-parser@3.3.1: @@ -6259,8 +6375,8 @@ packages: resolution: {integrity: sha512-eQQBjBnsVtGacsG9uJNB8qOr3yA8rga4wAaGG1qRcBzSIvfhERLrWxMAM1hp5fcS6Abo8M4+bUBTekYR0qTPQw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - katex@0.16.25: - resolution: {integrity: sha512-woHRUZ/iF23GBP1dkDQMh1QBad9dmr8/PAwNA54VrSOVYgI12MAcE14TqnDdQOdzyEonGzMepYnqBMYdsoAr8Q==} + katex@0.16.27: + resolution: {integrity: sha512-aeQoDkuRWSqQN6nSvVCEFvfXdqo1OQiCmmW1kc9xSdjutPv7BGO7pqY9sQRJpMOGrEdfDgF2TfRXe5eUAD2Waw==} hasBin: true keyv@4.5.4: @@ -6277,16 +6393,16 @@ packages: resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} engines: {node: '>=6'} - knip@5.71.0: - resolution: {integrity: sha512-hwgdqEJ+7DNJ5jE8BCPu7b57TY7vUwP6MzWYgCgPpg6iPCee/jKPShDNIlFER2koti4oz5xF88VJbKCb4Wl71g==} + knip@5.72.0: + resolution: {integrity: sha512-rlyoXI8FcggNtM/QXd/GW0sbsYvNuA/zPXt7bsuVi6kVQogY2PDCr81bPpzNnl0CP8AkFm2Z2plVeL5QQSis2w==} engines: {node: '>=18.18.0'} hasBin: true peerDependencies: '@types/node': '>=18' typescript: '>=5.0.4 <7' - ky@1.14.0: - resolution: {integrity: sha512-Rczb6FMM6JT0lvrOlP5WUOCB7s9XKxzwgErzhKlKde1bEV90FXplV1o87fpt4PU/asJFiqjYJxAJyzJhcrxOsQ==} + ky@1.14.1: + resolution: {integrity: sha512-hYje4L9JCmpEQBtudo+v52X5X8tgWXUYyPcxKSuxQNboqufecl9VMWjGiucAFH060AwPXHZuH+WB2rrqfkmafw==} engines: {node: '>=18'} lamejs@1.2.1: @@ -6738,20 +6854,6 @@ packages: ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - msw@2.12.4: - resolution: {integrity: sha512-rHNiVfTyKhzc0EjoXUBVGteNKBevdjOlVC6GlIRXpy+/3LHEIGRovnB5WPjcvmNODVQ1TNFnoa7wsGbd0V3epg==} - engines: {node: '>=18'} - hasBin: true - peerDependencies: - typescript: '>= 4.8.x' - peerDependenciesMeta: - typescript: - optional: true - - mute-stream@2.0.0: - resolution: {integrity: sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA==} - engines: {node: ^18.17.0 || >=20.5.0} - mz@2.7.0: resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} @@ -6911,11 +7013,11 @@ packages: outvariant@1.4.3: resolution: {integrity: sha512-+Sl2UErvtsoajRDKCE5/dBz4DIvHXQQnAxtQTF04OJxY0+DyZXSo5P5Bb7XYWOh81syohlYL24hbDwxedPUJCA==} - oxc-resolver@11.14.2: - resolution: {integrity: sha512-M5fERQKcrCngMZNnk1gRaBbYcqpqXLgMcoqAo7Wpty+KH0I18i03oiy2peUsGJwFaKAEbmo+CtAyhXh08RZ1RA==} + oxc-resolver@11.15.0: + resolution: {integrity: sha512-Hk2J8QMYwmIO9XTCUiOH00+Xk2/+aBxRUnhrSlANDyCnLYc32R1WSIq1sU2yEdlqd53FfMpPEpnBYIKQMzliJw==} - oxlint@1.31.0: - resolution: {integrity: sha512-U+Z3VShi1zuLF2Hz/pm4vWJUBm5sDHjwSzj340tz4tS2yXg9H5PTipsZv+Yu/alg6Z7EM2cZPKGNBZAvmdfkQg==} + oxlint@1.32.0: + resolution: {integrity: sha512-HYDQCga7flsdyLMUIxTgSnEx5KBxpP9VINB8NgO+UjV80xBiTQXyVsvjtneMT3ZBLMbL0SlG/Dm03XQAsEshMA==} engines: {node: ^20.19.0 || >=22.12.0} hasBin: true peerDependencies: @@ -7038,9 +7140,6 @@ packages: path-parse@1.0.7: resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} - path-to-regexp@6.3.0: - resolution: {integrity: sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==} - path-type@4.0.0: resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} engines: {node: '>=8'} @@ -7131,8 +7230,8 @@ packages: resolution: {integrity: sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==} engines: {node: '>=4'} - pnpm-workspace-yaml@1.3.0: - resolution: {integrity: sha512-Krb5q8Totd5mVuLx7we+EFHq/AfxA75nbfTm25Q1pIf606+RlaKUG+PXH8SDihfe5b5k4H09gE+sL47L1t5lbw==} + pnpm-workspace-yaml@1.4.2: + resolution: {integrity: sha512-L2EKuOeV8aSt3z0RNtdwkg96BHV4WRN9pN2oTHKkMQQRxVEHFXPTbB+nly6ip1qV+JQM6qBebSiMgPRBx8S0Vw==} points-on-curve@0.2.0: resolution: {integrity: sha512-0mYKnYYe9ZcqMCWhUjItv/oHjvgEsfKvnUTg8sAtnHr3GVy7rGkXCb6d5cSyqrWqL4k81b9CPg3urd+T7aop3A==} @@ -7292,9 +7391,6 @@ packages: property-information@5.6.0: resolution: {integrity: sha512-YUHSPk+A30YPv+0Qf8i9Mbfe/C0hdPXk1s1jPVToV8pk8BQtpw10ct89Eo7OWkutrwqvT0eicAxlOg3dOAu8JA==} - property-information@6.5.0: - resolution: {integrity: sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig==} - property-information@7.1.0: resolution: {integrity: sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==} @@ -7396,8 +7492,8 @@ packages: react-fast-compare@3.2.2: resolution: {integrity: sha512-nsO+KSNgo1SbJqJEYRE9ERzo7YtYbou/OqjSQKxV7jcKox7+usiUVZOAC+XnDOABXggQTno0Y1CpVnuWEc1boQ==} - react-hook-form@7.67.0: - resolution: {integrity: sha512-E55EOwKJHHIT/I6J9DmQbCWToAYSw9nN5R57MZw9rMtjh+YQreMDxRLfdjfxQbiJ3/qbg3Z02wGzBX4M+5fMtQ==} + react-hook-form@7.68.0: + resolution: {integrity: sha512-oNN3fjrZ/Xo40SWlHf1yCjlMK417JxoSJVUXQjGdvdRCU07NTFei1i1f8ApUAts+IVh14e4EdakeLEA+BEAs/Q==} engines: {node: '>=18.0.0'} peerDependencies: react: ^16.8.0 || ^17 || ^18 || ^19 @@ -7726,9 +7822,6 @@ packages: resolution: {integrity: sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==} engines: {node: '>=18'} - rettime@0.7.0: - resolution: {integrity: sha512-LPRKoHnLKd/r3dVxcwO7vhCW+orkOGj9ViueosEBK6ie89CijnfRlhaDhHq/3Hxu4CkWQtxwlBG0mzTQY6uQjw==} - reusify@1.1.0: resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} @@ -7803,8 +7896,8 @@ packages: webpack: optional: true - sass@1.94.2: - resolution: {integrity: sha512-N+7WK20/wOr7CzA2snJcUSSNTCzeCGUTFY3OgeQP3mZ1aj9NMQ0mSTXwlrnd89j33zzQJGqIN52GIOmYrfq46A==} + sass@1.95.0: + resolution: {integrity: sha512-9QMjhLq+UkOg/4bb8Lt8A+hJZvY3t+9xeZMKSBtBEgxrXA3ed5Ts4NDreUkYgJP1BTmrscQE/xYhf7iShow6lw==} engines: {node: '>=14.0.0'} hasBin: true @@ -7981,10 +8074,6 @@ packages: state-local@1.0.7: resolution: {integrity: sha512-HTEHMNieakEnoe33shBYcZ7NX83ACUjCu8c40iOGEZsngj9zRnkqS9j1pqQPXwobB0ZcVTk27REb7COQ0UR59w==} - statuses@2.0.2: - resolution: {integrity: sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==} - engines: {node: '>= 0.8'} - storybook@9.1.13: resolution: {integrity: sha512-G3KZ36EVzXyHds72B/qtWiJnhUpM0xOUeYlDcO9DSHL1bDTv15cW4+upBl+mcBZrDvU838cn7Bv4GpF+O5MCfw==} hasBin: true @@ -8149,10 +8238,6 @@ packages: tabbable@6.3.0: resolution: {integrity: sha512-EIHvdY5bPLuWForiR/AN2Bxngzpuwn1is4asboytXtpTgsArc+WmSJKVLlhdh71u7jFcryDqB2A8lQvj78MkyQ==} - tagged-tag@1.0.0: - resolution: {integrity: sha512-yEFYrVhod+hdNyx7g5Bnkkb0G6si8HJurOoOEgC8B/O0uXLHlaey/65KRv6cuWBNhBgHKAROVpc7QyYqE5gFng==} - engines: {node: '>=20'} - tailwind-merge@2.6.0: resolution: {integrity: sha512-P+Vu1qXfzediirmHOC3xKGAYeZtPcV9g76X+xg2FD4tYgR71ewMA35Y3sCz3zhiN/dwefRpJX0yBcgwi1fXNQA==} @@ -8180,8 +8265,8 @@ packages: resolution: {integrity: sha512-G13vtMYPT/J8A4X2SjdtBTphZlrp1gKv6hZiOjw14RCWg6GbHuQBGtjlx75xLbYV/wEc0D7G5K4rxKP/cXk8Bw==} engines: {node: '>=10'} - terser-webpack-plugin@5.3.14: - resolution: {integrity: sha512-vkZjpUjb6OMS7dhV+tILUW6BhpDR7P2L/aQSAv+Uwk+m8KATX9EccViHTJR2qDtACKPIYndLGCyl3FMo+r2LMw==} + terser-webpack-plugin@5.3.15: + resolution: {integrity: sha512-PGkOdpRFK+rb1TzVz+msVhw4YMRT9txLF4kRqvJhGhCM324xuR3REBSHALN+l+sAhKUmz0aotnjp5D+P83mLhQ==} engines: {node: '>= 10.13.0'} peerDependencies: '@swc/core': '*' @@ -8259,18 +8344,14 @@ packages: toggle-selection@1.0.6: resolution: {integrity: sha512-BiZS+C1OS8g/q2RRbJmy59xpyghNBqrr6k5L/uKBGRsTfxmu3ffiRnd8mlGPUVayg8pvfi5urfnu8TU7DVOkLQ==} - toml-eslint-parser@0.10.0: - resolution: {integrity: sha512-khrZo4buq4qVmsGzS5yQjKe/WsFvV8fGfOjDQN0q4iy9FjRfPWRgTFrU8u1R2iu/SfWLhY9WnCi4Jhdrcbtg+g==} + toml-eslint-parser@0.10.1: + resolution: {integrity: sha512-9mjy3frhioGIVGcwamlVlUyJ9x+WHw/TXiz9R4YOlmsIuBN43r9Dp8HZ35SF9EKjHrn3BUZj04CF+YqZ2oJ+7w==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} totalist@3.0.1: resolution: {integrity: sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==} engines: {node: '>=6'} - tough-cookie@6.0.0: - resolution: {integrity: sha512-kXuRi1mtaKMrsLUxz3sQYvVl37B0Ns6MzfrtV5DvJceE9bPyspOqk9xxv7XbZWcfLWbFmm997vl83qUWVJA64w==} - engines: {node: '>=16'} - tr46@1.0.1: resolution: {integrity: sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==} @@ -8370,10 +8451,6 @@ packages: resolution: {integrity: sha512-5zknd7Dss75pMSED270A1RQS3KloqRJA9XbXLe0eCxyw7xXFb3rd+9B0UQ/0E+LQT6lnrLviEolYORlRWamn4w==} engines: {node: '>=16'} - type-fest@5.3.1: - resolution: {integrity: sha512-VCn+LMHbd4t6sF3wfU/+HKT63C9OoyrSIf4b+vtWHpt2U7/4InZG467YDNMFMR70DdHjAdpPWmw2lzRdg0Xqqg==} - engines: {node: '>=20'} - typescript@5.9.3: resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} engines: {node: '>=14.17'} @@ -8456,15 +8533,12 @@ packages: resolution: {integrity: sha512-us4j03/499KhbGP8BU7Hrzrgseo+KdfJYWcbcajCOqsAyb8Gk0Yn2kiUIcZISYCb1JFaZfIuG3b42HmguVOKCQ==} engines: {node: '>=18.12.0'} - until-async@3.0.2: - resolution: {integrity: sha512-IiSk4HlzAMqTUseHHe3VhIGyuFmN90zMTpD3Z3y8jeQbzLIq500MVM7Jq2vUAnTKAFPJrqwkzr6PoTcPhGcOiw==} - upath@1.2.0: resolution: {integrity: sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==} engines: {node: '>=4'} - update-browserslist-db@1.1.4: - resolution: {integrity: sha512-q0SPT4xyU84saUX+tomz1WLkxUbuaJnR1xWt17M7fJtEJigJeWUNGUqrauFXsHnqev9y9JTRGwk13tFBuKby4A==} + update-browserslist-db@1.2.2: + resolution: {integrity: sha512-E85pfNzMQ9jpKkA7+TJAi4TJN+tBCuWh5rUcS/sv6cFi+1q9LYDwDI5dpUL0u/73EElyQ8d3TEaeW4sPedBqYA==} hasBin: true peerDependencies: browserslist: '>= 4.21.0' @@ -8733,10 +8807,6 @@ packages: workbox-window@6.6.0: resolution: {integrity: sha512-L4N9+vka17d16geaJXXRjENLFldvkWy7JyGxElRD0JvBxvFEd8LOhr+uXCcar/NzAmIBRv9EZ+M+Qr4mOoBITw==} - wrap-ansi@6.2.0: - resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} - engines: {node: '>=8'} - wrap-ansi@7.0.0: resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} engines: {node: '>=10'} @@ -8791,8 +8861,8 @@ packages: yallist@3.1.1: resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} - yaml-eslint-parser@1.3.1: - resolution: {integrity: sha512-MdSgP9YA9QjtAO2+lt4O7V2bnH22LPnfeVLiQqjY3cOyn8dy/Ief8otjIe6SPPTK03nM7O3Yl0LTfWuF7l+9yw==} + yaml-eslint-parser@1.3.2: + resolution: {integrity: sha512-odxVsHAkZYYglR30aPYRY4nUGJnoJ2y1ww2HDvZALo0BDETv9kWbi16J52eHs+PWRNmF4ub6nZqfVOeesOvntg==} engines: {node: ^14.17.0 || >=16.0.0} yaml@1.10.2: @@ -8828,10 +8898,6 @@ packages: resolution: {integrity: sha512-4LCcse/U2MHZ63HAJVE+v71o7yOdIe4cZ70Wpf8D/IyjDKYQLV5GD46B+hSTjJsvV5PztjvHoU580EftxjDZFQ==} engines: {node: '>=12.20'} - yoctocolors-cjs@2.1.3: - resolution: {integrity: sha512-U/PBtDf35ff0D8X8D0jfdzHYEPFxAI7jJlxZXwCSez5M3190m+QobIfh+sWDWSHMCWWJN2AWamkegn6vr6YBTw==} - engines: {node: '>=18'} - zen-observable-ts@1.1.0: resolution: {integrity: sha512-1h4zlLSqI2cRLPJUHJFL8bCWHhkpuXkF+dbGkRaWjgDIG26DmzyshUMrdV/rL3UnR+mhaX4fRq8LPouq0MYYIA==} @@ -8894,7 +8960,7 @@ snapshots: '@alloc/quick-lru@5.2.0': {} - '@amplitude/analytics-browser@2.31.3': + '@amplitude/analytics-browser@2.31.4': dependencies: '@amplitude/analytics-core': 2.33.0 '@amplitude/plugin-autocapture-browser': 1.18.0 @@ -8946,12 +9012,12 @@ snapshots: '@amplitude/analytics-core': 2.33.0 tslib: 2.8.1 - '@amplitude/plugin-session-replay-browser@1.23.6(@amplitude/rrweb@2.0.0-alpha.33)(rollup@2.79.2)': + '@amplitude/plugin-session-replay-browser@1.24.1(@amplitude/rrweb@2.0.0-alpha.33)(rollup@2.79.2)': dependencies: '@amplitude/analytics-client-common': 2.4.16 '@amplitude/analytics-core': 2.33.0 '@amplitude/analytics-types': 2.11.0 - '@amplitude/session-replay-browser': 1.29.8(@amplitude/rrweb@2.0.0-alpha.33)(rollup@2.79.2) + '@amplitude/session-replay-browser': 1.30.0(@amplitude/rrweb@2.0.0-alpha.33)(rollup@2.79.2) idb-keyval: 6.2.2 tslib: 2.8.1 transitivePeerDependencies: @@ -9005,7 +9071,7 @@ snapshots: base64-arraybuffer: 1.0.2 mitt: 3.0.1 - '@amplitude/session-replay-browser@1.29.8(@amplitude/rrweb@2.0.0-alpha.33)(rollup@2.79.2)': + '@amplitude/session-replay-browser@1.30.0(@amplitude/rrweb@2.0.0-alpha.33)(rollup@2.79.2)': dependencies: '@amplitude/analytics-client-common': 2.4.16 '@amplitude/analytics-core': 2.33.0 @@ -9039,9 +9105,9 @@ snapshots: '@eslint-community/eslint-plugin-eslint-comments': 4.5.0(eslint@9.39.1(jiti@1.21.7)) '@eslint/markdown': 7.5.1 '@stylistic/eslint-plugin': 5.6.1(eslint@9.39.1(jiti@1.21.7)) - '@typescript-eslint/eslint-plugin': 8.48.1(@typescript-eslint/parser@8.48.1(eslint@9.39.1(jiti@1.21.7))(typescript@5.9.3))(eslint@9.39.1(jiti@1.21.7))(typescript@5.9.3) - '@typescript-eslint/parser': 8.48.1(eslint@9.39.1(jiti@1.21.7))(typescript@5.9.3) - '@vitest/eslint-plugin': 1.5.1(eslint@9.39.1(jiti@1.21.7))(typescript@5.9.3) + '@typescript-eslint/eslint-plugin': 8.49.0(@typescript-eslint/parser@8.49.0(eslint@9.39.1(jiti@1.21.7))(typescript@5.9.3))(eslint@9.39.1(jiti@1.21.7))(typescript@5.9.3) + '@typescript-eslint/parser': 8.49.0(eslint@9.39.1(jiti@1.21.7))(typescript@5.9.3) + '@vitest/eslint-plugin': 1.5.2(eslint@9.39.1(jiti@1.21.7))(typescript@5.9.3) ansis: 4.2.0 cac: 6.7.14 eslint: 9.39.1(jiti@1.21.7) @@ -9056,21 +9122,21 @@ snapshots: eslint-plugin-n: 17.23.1(eslint@9.39.1(jiti@1.21.7))(typescript@5.9.3) eslint-plugin-no-only-tests: 3.3.0 eslint-plugin-perfectionist: 4.15.1(eslint@9.39.1(jiti@1.21.7))(typescript@5.9.3) - eslint-plugin-pnpm: 1.3.0(eslint@9.39.1(jiti@1.21.7)) + eslint-plugin-pnpm: 1.4.2(eslint@9.39.1(jiti@1.21.7)) eslint-plugin-regexp: 2.10.0(eslint@9.39.1(jiti@1.21.7)) eslint-plugin-toml: 0.12.0(eslint@9.39.1(jiti@1.21.7)) eslint-plugin-unicorn: 61.0.2(eslint@9.39.1(jiti@1.21.7)) - eslint-plugin-unused-imports: 4.3.0(@typescript-eslint/eslint-plugin@8.48.1(@typescript-eslint/parser@8.48.1(eslint@9.39.1(jiti@1.21.7))(typescript@5.9.3))(eslint@9.39.1(jiti@1.21.7))(typescript@5.9.3))(eslint@9.39.1(jiti@1.21.7)) - eslint-plugin-vue: 10.6.2(@stylistic/eslint-plugin@5.6.1(eslint@9.39.1(jiti@1.21.7)))(@typescript-eslint/parser@8.48.1(eslint@9.39.1(jiti@1.21.7))(typescript@5.9.3))(eslint@9.39.1(jiti@1.21.7))(vue-eslint-parser@10.2.0(eslint@9.39.1(jiti@1.21.7))) + eslint-plugin-unused-imports: 4.3.0(@typescript-eslint/eslint-plugin@8.49.0(@typescript-eslint/parser@8.49.0(eslint@9.39.1(jiti@1.21.7))(typescript@5.9.3))(eslint@9.39.1(jiti@1.21.7))(typescript@5.9.3))(eslint@9.39.1(jiti@1.21.7)) + eslint-plugin-vue: 10.6.2(@stylistic/eslint-plugin@5.6.1(eslint@9.39.1(jiti@1.21.7)))(@typescript-eslint/parser@8.49.0(eslint@9.39.1(jiti@1.21.7))(typescript@5.9.3))(eslint@9.39.1(jiti@1.21.7))(vue-eslint-parser@10.2.0(eslint@9.39.1(jiti@1.21.7))) eslint-plugin-yml: 1.19.0(eslint@9.39.1(jiti@1.21.7)) eslint-processor-vue-blocks: 2.0.0(@vue/compiler-sfc@3.5.25)(eslint@9.39.1(jiti@1.21.7)) globals: 16.5.0 - jsonc-eslint-parser: 2.4.1 + jsonc-eslint-parser: 2.4.2 local-pkg: 1.1.2 parse-gitignore: 2.0.0 - toml-eslint-parser: 0.10.0 + toml-eslint-parser: 0.10.1 vue-eslint-parser: 10.2.0(eslint@9.39.1(jiti@1.21.7)) - yaml-eslint-parser: 1.3.1 + yaml-eslint-parser: 1.3.2 optionalDependencies: '@eslint-react/eslint-plugin': 1.53.1(eslint@9.39.1(jiti@1.21.7))(ts-api-utils@2.1.0(typescript@5.9.3))(typescript@5.9.3) '@next/eslint-plugin-next': 15.5.7 @@ -9139,7 +9205,7 @@ snapshots: dependencies: '@babel/compat-data': 7.28.5 '@babel/helper-validator-option': 7.27.1 - browserslist: 4.28.0 + browserslist: 4.28.1 lru-cache: 5.1.1 semver: 6.3.1 @@ -9930,13 +9996,13 @@ snapshots: '@chevrotain/utils@11.0.3': {} - '@chromatic-com/storybook@4.1.3(storybook@9.1.13(@testing-library/dom@10.4.1)(msw@2.12.4(@types/node@18.15.0)(typescript@5.9.3)))': + '@chromatic-com/storybook@4.1.3(storybook@9.1.13(@testing-library/dom@10.4.1))': dependencies: '@neoconfetti/react': 1.0.0 chromatic: 13.3.4 filesize: 10.1.6 jsonfile: 6.2.0 - storybook: 9.1.13(@testing-library/dom@10.4.1)(msw@2.12.4(@types/node@18.15.0)(typescript@5.9.3)) + storybook: 9.1.13(@testing-library/dom@10.4.1) strip-ansi: 7.1.2 transitivePeerDependencies: - '@chromatic-com/cypress' @@ -10035,7 +10101,7 @@ snapshots: '@es-joy/jsdoccomment@0.50.2': dependencies: '@types/estree': 1.0.8 - '@typescript-eslint/types': 8.48.1 + '@typescript-eslint/types': 8.49.0 comment-parser: 1.4.1 esquery: 1.6.0 jsdoc-type-pratt-parser: 4.1.0 @@ -10043,7 +10109,7 @@ snapshots: '@es-joy/jsdoccomment@0.58.0': dependencies: '@types/estree': 1.0.8 - '@typescript-eslint/types': 8.48.1 + '@typescript-eslint/types': 8.49.0 comment-parser: 1.4.1 esquery: 1.6.0 jsdoc-type-pratt-parser: 5.4.0 @@ -10051,78 +10117,156 @@ snapshots: '@esbuild/aix-ppc64@0.25.0': optional: true + '@esbuild/aix-ppc64@0.25.12': + optional: true + '@esbuild/android-arm64@0.25.0': optional: true + '@esbuild/android-arm64@0.25.12': + optional: true + '@esbuild/android-arm@0.25.0': optional: true + '@esbuild/android-arm@0.25.12': + optional: true + '@esbuild/android-x64@0.25.0': optional: true + '@esbuild/android-x64@0.25.12': + optional: true + '@esbuild/darwin-arm64@0.25.0': optional: true + '@esbuild/darwin-arm64@0.25.12': + optional: true + '@esbuild/darwin-x64@0.25.0': optional: true + '@esbuild/darwin-x64@0.25.12': + optional: true + '@esbuild/freebsd-arm64@0.25.0': optional: true + '@esbuild/freebsd-arm64@0.25.12': + optional: true + '@esbuild/freebsd-x64@0.25.0': optional: true + '@esbuild/freebsd-x64@0.25.12': + optional: true + '@esbuild/linux-arm64@0.25.0': optional: true + '@esbuild/linux-arm64@0.25.12': + optional: true + '@esbuild/linux-arm@0.25.0': optional: true + '@esbuild/linux-arm@0.25.12': + optional: true + '@esbuild/linux-ia32@0.25.0': optional: true + '@esbuild/linux-ia32@0.25.12': + optional: true + '@esbuild/linux-loong64@0.25.0': optional: true + '@esbuild/linux-loong64@0.25.12': + optional: true + '@esbuild/linux-mips64el@0.25.0': optional: true + '@esbuild/linux-mips64el@0.25.12': + optional: true + '@esbuild/linux-ppc64@0.25.0': optional: true + '@esbuild/linux-ppc64@0.25.12': + optional: true + '@esbuild/linux-riscv64@0.25.0': optional: true + '@esbuild/linux-riscv64@0.25.12': + optional: true + '@esbuild/linux-s390x@0.25.0': optional: true + '@esbuild/linux-s390x@0.25.12': + optional: true + '@esbuild/linux-x64@0.25.0': optional: true + '@esbuild/linux-x64@0.25.12': + optional: true + '@esbuild/netbsd-arm64@0.25.0': optional: true + '@esbuild/netbsd-arm64@0.25.12': + optional: true + '@esbuild/netbsd-x64@0.25.0': optional: true + '@esbuild/netbsd-x64@0.25.12': + optional: true + '@esbuild/openbsd-arm64@0.25.0': optional: true + '@esbuild/openbsd-arm64@0.25.12': + optional: true + '@esbuild/openbsd-x64@0.25.0': optional: true + '@esbuild/openbsd-x64@0.25.12': + optional: true + + '@esbuild/openharmony-arm64@0.25.12': + optional: true + '@esbuild/sunos-x64@0.25.0': optional: true + '@esbuild/sunos-x64@0.25.12': + optional: true + '@esbuild/win32-arm64@0.25.0': optional: true + '@esbuild/win32-arm64@0.25.12': + optional: true + '@esbuild/win32-ia32@0.25.0': optional: true + '@esbuild/win32-ia32@0.25.12': + optional: true + '@esbuild/win32-x64@0.25.0': optional: true + '@esbuild/win32-x64@0.25.12': + optional: true + '@eslint-community/eslint-plugin-eslint-comments@4.5.0(eslint@9.39.1(jiti@1.21.7))': dependencies: escape-string-regexp: 4.0.0 @@ -10141,9 +10285,9 @@ snapshots: '@eslint-react/ast@1.53.1(eslint@9.39.1(jiti@1.21.7))(typescript@5.9.3)': dependencies: '@eslint-react/eff': 1.53.1 - '@typescript-eslint/types': 8.48.1 - '@typescript-eslint/typescript-estree': 8.48.1(typescript@5.9.3) - '@typescript-eslint/utils': 8.48.1(eslint@9.39.1(jiti@1.21.7))(typescript@5.9.3) + '@typescript-eslint/types': 8.49.0 + '@typescript-eslint/typescript-estree': 8.49.0(typescript@5.9.3) + '@typescript-eslint/utils': 8.49.0(eslint@9.39.1(jiti@1.21.7))(typescript@5.9.3) string-ts: 2.3.1 ts-pattern: 5.9.0 transitivePeerDependencies: @@ -10158,10 +10302,10 @@ snapshots: '@eslint-react/kit': 1.53.1(eslint@9.39.1(jiti@1.21.7))(typescript@5.9.3) '@eslint-react/shared': 1.53.1(eslint@9.39.1(jiti@1.21.7))(typescript@5.9.3) '@eslint-react/var': 1.53.1(eslint@9.39.1(jiti@1.21.7))(typescript@5.9.3) - '@typescript-eslint/scope-manager': 8.48.1 - '@typescript-eslint/type-utils': 8.48.1(eslint@9.39.1(jiti@1.21.7))(typescript@5.9.3) - '@typescript-eslint/types': 8.48.1 - '@typescript-eslint/utils': 8.48.1(eslint@9.39.1(jiti@1.21.7))(typescript@5.9.3) + '@typescript-eslint/scope-manager': 8.49.0 + '@typescript-eslint/type-utils': 8.49.0(eslint@9.39.1(jiti@1.21.7))(typescript@5.9.3) + '@typescript-eslint/types': 8.49.0 + '@typescript-eslint/utils': 8.49.0(eslint@9.39.1(jiti@1.21.7))(typescript@5.9.3) birecord: 0.1.1 ts-pattern: 5.9.0 transitivePeerDependencies: @@ -10176,10 +10320,10 @@ snapshots: '@eslint-react/eff': 1.53.1 '@eslint-react/kit': 1.53.1(eslint@9.39.1(jiti@1.21.7))(typescript@5.9.3) '@eslint-react/shared': 1.53.1(eslint@9.39.1(jiti@1.21.7))(typescript@5.9.3) - '@typescript-eslint/scope-manager': 8.48.1 - '@typescript-eslint/type-utils': 8.48.1(eslint@9.39.1(jiti@1.21.7))(typescript@5.9.3) - '@typescript-eslint/types': 8.48.1 - '@typescript-eslint/utils': 8.48.1(eslint@9.39.1(jiti@1.21.7))(typescript@5.9.3) + '@typescript-eslint/scope-manager': 8.49.0 + '@typescript-eslint/type-utils': 8.49.0(eslint@9.39.1(jiti@1.21.7))(typescript@5.9.3) + '@typescript-eslint/types': 8.49.0 + '@typescript-eslint/utils': 8.49.0(eslint@9.39.1(jiti@1.21.7))(typescript@5.9.3) eslint: 9.39.1(jiti@1.21.7) eslint-plugin-react-debug: 1.53.1(eslint@9.39.1(jiti@1.21.7))(typescript@5.9.3) eslint-plugin-react-dom: 1.53.1(eslint@9.39.1(jiti@1.21.7))(typescript@5.9.3) @@ -10196,7 +10340,7 @@ snapshots: '@eslint-react/kit@1.53.1(eslint@9.39.1(jiti@1.21.7))(typescript@5.9.3)': dependencies: '@eslint-react/eff': 1.53.1 - '@typescript-eslint/utils': 8.48.1(eslint@9.39.1(jiti@1.21.7))(typescript@5.9.3) + '@typescript-eslint/utils': 8.49.0(eslint@9.39.1(jiti@1.21.7))(typescript@5.9.3) ts-pattern: 5.9.0 zod: 4.1.13 transitivePeerDependencies: @@ -10208,7 +10352,7 @@ snapshots: dependencies: '@eslint-react/eff': 1.53.1 '@eslint-react/kit': 1.53.1(eslint@9.39.1(jiti@1.21.7))(typescript@5.9.3) - '@typescript-eslint/utils': 8.48.1(eslint@9.39.1(jiti@1.21.7))(typescript@5.9.3) + '@typescript-eslint/utils': 8.49.0(eslint@9.39.1(jiti@1.21.7))(typescript@5.9.3) ts-pattern: 5.9.0 zod: 4.1.13 transitivePeerDependencies: @@ -10220,9 +10364,9 @@ snapshots: dependencies: '@eslint-react/ast': 1.53.1(eslint@9.39.1(jiti@1.21.7))(typescript@5.9.3) '@eslint-react/eff': 1.53.1 - '@typescript-eslint/scope-manager': 8.48.1 - '@typescript-eslint/types': 8.48.1 - '@typescript-eslint/utils': 8.48.1(eslint@9.39.1(jiti@1.21.7))(typescript@5.9.3) + '@typescript-eslint/scope-manager': 8.49.0 + '@typescript-eslint/types': 8.49.0 + '@typescript-eslint/utils': 8.49.0(eslint@9.39.1(jiti@1.21.7))(typescript@5.9.3) string-ts: 2.3.1 ts-pattern: 5.9.0 transitivePeerDependencies: @@ -10349,7 +10493,7 @@ snapshots: '@floating-ui/react': 0.26.28(react-dom@19.2.1(react@19.2.1))(react@19.2.1) '@react-aria/focus': 3.21.2(react-dom@19.2.1(react@19.2.1))(react@19.2.1) '@react-aria/interactions': 3.25.6(react-dom@19.2.1(react@19.2.1))(react@19.2.1) - '@tanstack/react-virtual': 3.13.12(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@tanstack/react-virtual': 3.13.13(react-dom@19.2.1(react@19.2.1))(react@19.2.1) react: 19.2.1 react-dom: 19.2.1(react@19.2.1) @@ -10357,9 +10501,9 @@ snapshots: dependencies: react: 19.2.1 - '@hookform/resolvers@3.10.0(react-hook-form@7.67.0(react@19.2.1))': + '@hookform/resolvers@3.10.0(react-hook-form@7.68.0(react@19.2.1))': dependencies: - react-hook-form: 7.67.0(react@19.2.1) + react-hook-form: 7.68.0(react@19.2.1) '@humanfs/core@0.19.1': {} @@ -10552,39 +10696,6 @@ snapshots: '@img/sharp-win32-x64@0.34.5': optional: true - '@inquirer/ansi@1.0.2': - optional: true - - '@inquirer/confirm@5.1.21(@types/node@18.15.0)': - dependencies: - '@inquirer/core': 10.3.2(@types/node@18.15.0) - '@inquirer/type': 3.0.10(@types/node@18.15.0) - optionalDependencies: - '@types/node': 18.15.0 - optional: true - - '@inquirer/core@10.3.2(@types/node@18.15.0)': - dependencies: - '@inquirer/ansi': 1.0.2 - '@inquirer/figures': 1.0.15 - '@inquirer/type': 3.0.10(@types/node@18.15.0) - cli-width: 4.1.0 - mute-stream: 2.0.0 - signal-exit: 4.1.0 - wrap-ansi: 6.2.0 - yoctocolors-cjs: 2.1.3 - optionalDependencies: - '@types/node': 18.15.0 - optional: true - - '@inquirer/figures@1.0.15': - optional: true - - '@inquirer/type@3.0.10(@types/node@18.15.0)': - optionalDependencies: - '@types/node': 18.15.0 - optional: true - '@isaacs/balanced-match@4.0.1': {} '@isaacs/brace-expansion@5.0.0': @@ -11022,16 +11133,6 @@ snapshots: outvariant: 1.4.3 strict-event-emitter: 0.5.1 - '@mswjs/interceptors@0.40.0': - dependencies: - '@open-draft/deferred-promise': 2.2.0 - '@open-draft/logger': 0.3.0 - '@open-draft/until': 2.1.0 - is-node-process: 1.2.0 - outvariant: 1.4.3 - strict-event-emitter: 0.5.1 - optional: true - '@napi-rs/wasm-runtime@1.1.0': dependencies: '@emnapi/core': 1.7.1 @@ -11197,90 +11298,90 @@ snapshots: '@open-draft/until@2.1.0': {} - '@oxc-resolver/binding-android-arm-eabi@11.14.2': + '@oxc-resolver/binding-android-arm-eabi@11.15.0': optional: true - '@oxc-resolver/binding-android-arm64@11.14.2': + '@oxc-resolver/binding-android-arm64@11.15.0': optional: true - '@oxc-resolver/binding-darwin-arm64@11.14.2': + '@oxc-resolver/binding-darwin-arm64@11.15.0': optional: true - '@oxc-resolver/binding-darwin-x64@11.14.2': + '@oxc-resolver/binding-darwin-x64@11.15.0': optional: true - '@oxc-resolver/binding-freebsd-x64@11.14.2': + '@oxc-resolver/binding-freebsd-x64@11.15.0': optional: true - '@oxc-resolver/binding-linux-arm-gnueabihf@11.14.2': + '@oxc-resolver/binding-linux-arm-gnueabihf@11.15.0': optional: true - '@oxc-resolver/binding-linux-arm-musleabihf@11.14.2': + '@oxc-resolver/binding-linux-arm-musleabihf@11.15.0': optional: true - '@oxc-resolver/binding-linux-arm64-gnu@11.14.2': + '@oxc-resolver/binding-linux-arm64-gnu@11.15.0': optional: true - '@oxc-resolver/binding-linux-arm64-musl@11.14.2': + '@oxc-resolver/binding-linux-arm64-musl@11.15.0': optional: true - '@oxc-resolver/binding-linux-ppc64-gnu@11.14.2': + '@oxc-resolver/binding-linux-ppc64-gnu@11.15.0': optional: true - '@oxc-resolver/binding-linux-riscv64-gnu@11.14.2': + '@oxc-resolver/binding-linux-riscv64-gnu@11.15.0': optional: true - '@oxc-resolver/binding-linux-riscv64-musl@11.14.2': + '@oxc-resolver/binding-linux-riscv64-musl@11.15.0': optional: true - '@oxc-resolver/binding-linux-s390x-gnu@11.14.2': + '@oxc-resolver/binding-linux-s390x-gnu@11.15.0': optional: true - '@oxc-resolver/binding-linux-x64-gnu@11.14.2': + '@oxc-resolver/binding-linux-x64-gnu@11.15.0': optional: true - '@oxc-resolver/binding-linux-x64-musl@11.14.2': + '@oxc-resolver/binding-linux-x64-musl@11.15.0': optional: true - '@oxc-resolver/binding-openharmony-arm64@11.14.2': + '@oxc-resolver/binding-openharmony-arm64@11.15.0': optional: true - '@oxc-resolver/binding-wasm32-wasi@11.14.2': + '@oxc-resolver/binding-wasm32-wasi@11.15.0': dependencies: '@napi-rs/wasm-runtime': 1.1.0 optional: true - '@oxc-resolver/binding-win32-arm64-msvc@11.14.2': + '@oxc-resolver/binding-win32-arm64-msvc@11.15.0': optional: true - '@oxc-resolver/binding-win32-ia32-msvc@11.14.2': + '@oxc-resolver/binding-win32-ia32-msvc@11.15.0': optional: true - '@oxc-resolver/binding-win32-x64-msvc@11.14.2': + '@oxc-resolver/binding-win32-x64-msvc@11.15.0': optional: true - '@oxlint/darwin-arm64@1.31.0': + '@oxlint/darwin-arm64@1.32.0': optional: true - '@oxlint/darwin-x64@1.31.0': + '@oxlint/darwin-x64@1.32.0': optional: true - '@oxlint/linux-arm64-gnu@1.31.0': + '@oxlint/linux-arm64-gnu@1.32.0': optional: true - '@oxlint/linux-arm64-musl@1.31.0': + '@oxlint/linux-arm64-musl@1.32.0': optional: true - '@oxlint/linux-x64-gnu@1.31.0': + '@oxlint/linux-x64-gnu@1.32.0': optional: true - '@oxlint/linux-x64-musl@1.31.0': + '@oxlint/linux-x64-musl@1.32.0': optional: true - '@oxlint/win32-arm64@1.31.0': + '@oxlint/win32-arm64@1.32.0': optional: true - '@oxlint/win32-x64@1.31.0': + '@oxlint/win32-x64@1.32.0': optional: true '@parcel/watcher-android-arm64@2.5.1': @@ -11351,6 +11452,10 @@ snapshots: '@pkgr/core@0.2.9': {} + '@playwright/test@1.57.0': + dependencies: + playwright: 1.57.0 + '@pmmmwh/react-refresh-webpack-plugin@0.5.17(react-refresh@0.14.2)(type-fest@4.2.0)(webpack-hot-middleware@2.26.1)(webpack@5.103.0(esbuild@0.25.0)(uglify-js@3.19.3))': dependencies: ansi-html: 0.0.9 @@ -11763,38 +11868,38 @@ snapshots: dependencies: '@sinonjs/commons': 3.0.1 - '@storybook/addon-docs@9.1.13(@types/react@19.2.7)(storybook@9.1.13(@testing-library/dom@10.4.1)(msw@2.12.4(@types/node@18.15.0)(typescript@5.9.3)))': + '@storybook/addon-docs@9.1.13(@types/react@19.2.7)(storybook@9.1.13(@testing-library/dom@10.4.1))': dependencies: '@mdx-js/react': 3.1.1(@types/react@19.2.7)(react@19.2.1) - '@storybook/csf-plugin': 9.1.13(storybook@9.1.13(@testing-library/dom@10.4.1)(msw@2.12.4(@types/node@18.15.0)(typescript@5.9.3))) + '@storybook/csf-plugin': 9.1.13(storybook@9.1.13(@testing-library/dom@10.4.1)) '@storybook/icons': 1.6.0(react-dom@19.2.1(react@19.2.1))(react@19.2.1) - '@storybook/react-dom-shim': 9.1.13(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(storybook@9.1.13(@testing-library/dom@10.4.1)(msw@2.12.4(@types/node@18.15.0)(typescript@5.9.3))) + '@storybook/react-dom-shim': 9.1.13(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(storybook@9.1.13(@testing-library/dom@10.4.1)) react: 19.2.1 react-dom: 19.2.1(react@19.2.1) - storybook: 9.1.13(@testing-library/dom@10.4.1)(msw@2.12.4(@types/node@18.15.0)(typescript@5.9.3)) + storybook: 9.1.13(@testing-library/dom@10.4.1) ts-dedent: 2.2.0 transitivePeerDependencies: - '@types/react' - '@storybook/addon-links@9.1.13(react@19.2.1)(storybook@9.1.13(@testing-library/dom@10.4.1)(msw@2.12.4(@types/node@18.15.0)(typescript@5.9.3)))': + '@storybook/addon-links@9.1.13(react@19.2.1)(storybook@9.1.13(@testing-library/dom@10.4.1))': dependencies: '@storybook/global': 5.0.0 - storybook: 9.1.13(@testing-library/dom@10.4.1)(msw@2.12.4(@types/node@18.15.0)(typescript@5.9.3)) + storybook: 9.1.13(@testing-library/dom@10.4.1) optionalDependencies: react: 19.2.1 - '@storybook/addon-onboarding@9.1.13(storybook@9.1.13(@testing-library/dom@10.4.1)(msw@2.12.4(@types/node@18.15.0)(typescript@5.9.3)))': + '@storybook/addon-onboarding@9.1.13(storybook@9.1.13(@testing-library/dom@10.4.1))': dependencies: - storybook: 9.1.13(@testing-library/dom@10.4.1)(msw@2.12.4(@types/node@18.15.0)(typescript@5.9.3)) + storybook: 9.1.13(@testing-library/dom@10.4.1) - '@storybook/addon-themes@9.1.13(storybook@9.1.13(@testing-library/dom@10.4.1)(msw@2.12.4(@types/node@18.15.0)(typescript@5.9.3)))': + '@storybook/addon-themes@9.1.13(storybook@9.1.13(@testing-library/dom@10.4.1))': dependencies: - storybook: 9.1.13(@testing-library/dom@10.4.1)(msw@2.12.4(@types/node@18.15.0)(typescript@5.9.3)) + storybook: 9.1.13(@testing-library/dom@10.4.1) ts-dedent: 2.2.0 - '@storybook/builder-webpack5@9.1.13(esbuild@0.25.0)(storybook@9.1.13(@testing-library/dom@10.4.1)(msw@2.12.4(@types/node@18.15.0)(typescript@5.9.3)))(typescript@5.9.3)(uglify-js@3.19.3)': + '@storybook/builder-webpack5@9.1.13(esbuild@0.25.0)(storybook@9.1.13(@testing-library/dom@10.4.1))(typescript@5.9.3)(uglify-js@3.19.3)': dependencies: - '@storybook/core-webpack': 9.1.13(storybook@9.1.13(@testing-library/dom@10.4.1)(msw@2.12.4(@types/node@18.15.0)(typescript@5.9.3))) + '@storybook/core-webpack': 9.1.13(storybook@9.1.13(@testing-library/dom@10.4.1)) case-sensitive-paths-webpack-plugin: 2.4.0 cjs-module-lexer: 1.4.3 css-loader: 6.11.0(webpack@5.103.0(esbuild@0.25.0)(uglify-js@3.19.3)) @@ -11802,9 +11907,9 @@ snapshots: fork-ts-checker-webpack-plugin: 8.0.0(typescript@5.9.3)(webpack@5.103.0(esbuild@0.25.0)(uglify-js@3.19.3)) html-webpack-plugin: 5.6.5(webpack@5.103.0(esbuild@0.25.0)(uglify-js@3.19.3)) magic-string: 0.30.21 - storybook: 9.1.13(@testing-library/dom@10.4.1)(msw@2.12.4(@types/node@18.15.0)(typescript@5.9.3)) + storybook: 9.1.13(@testing-library/dom@10.4.1) style-loader: 3.3.4(webpack@5.103.0(esbuild@0.25.0)(uglify-js@3.19.3)) - terser-webpack-plugin: 5.3.14(esbuild@0.25.0)(uglify-js@3.19.3)(webpack@5.103.0(esbuild@0.25.0)(uglify-js@3.19.3)) + terser-webpack-plugin: 5.3.15(esbuild@0.25.0)(uglify-js@3.19.3)(webpack@5.103.0(esbuild@0.25.0)(uglify-js@3.19.3)) ts-dedent: 2.2.0 webpack: 5.103.0(esbuild@0.25.0)(uglify-js@3.19.3) webpack-dev-middleware: 6.1.3(webpack@5.103.0(esbuild@0.25.0)(uglify-js@3.19.3)) @@ -11819,14 +11924,14 @@ snapshots: - uglify-js - webpack-cli - '@storybook/core-webpack@9.1.13(storybook@9.1.13(@testing-library/dom@10.4.1)(msw@2.12.4(@types/node@18.15.0)(typescript@5.9.3)))': + '@storybook/core-webpack@9.1.13(storybook@9.1.13(@testing-library/dom@10.4.1))': dependencies: - storybook: 9.1.13(@testing-library/dom@10.4.1)(msw@2.12.4(@types/node@18.15.0)(typescript@5.9.3)) + storybook: 9.1.13(@testing-library/dom@10.4.1) ts-dedent: 2.2.0 - '@storybook/csf-plugin@9.1.13(storybook@9.1.13(@testing-library/dom@10.4.1)(msw@2.12.4(@types/node@18.15.0)(typescript@5.9.3)))': + '@storybook/csf-plugin@9.1.13(storybook@9.1.13(@testing-library/dom@10.4.1))': dependencies: - storybook: 9.1.13(@testing-library/dom@10.4.1)(msw@2.12.4(@types/node@18.15.0)(typescript@5.9.3)) + storybook: 9.1.13(@testing-library/dom@10.4.1) unplugin: 1.16.1 '@storybook/global@5.0.0': {} @@ -11836,7 +11941,7 @@ snapshots: react: 19.2.1 react-dom: 19.2.1(react@19.2.1) - '@storybook/nextjs@9.1.13(esbuild@0.25.0)(next@15.5.7(@babel/core@7.28.5)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(sass@1.94.2))(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(sass@1.94.2)(storybook@9.1.13(@testing-library/dom@10.4.1)(msw@2.12.4(@types/node@18.15.0)(typescript@5.9.3)))(type-fest@4.2.0)(typescript@5.9.3)(uglify-js@3.19.3)(webpack-hot-middleware@2.26.1)(webpack@5.103.0(esbuild@0.25.0)(uglify-js@3.19.3))': + '@storybook/nextjs@9.1.13(esbuild@0.25.0)(next@15.5.7(@babel/core@7.28.5)(@playwright/test@1.57.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(sass@1.95.0))(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(sass@1.95.0)(storybook@9.1.13(@testing-library/dom@10.4.1))(type-fest@4.2.0)(typescript@5.9.3)(uglify-js@3.19.3)(webpack-hot-middleware@2.26.1)(webpack@5.103.0(esbuild@0.25.0)(uglify-js@3.19.3))': dependencies: '@babel/core': 7.28.5 '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.28.5) @@ -11852,15 +11957,15 @@ snapshots: '@babel/preset-typescript': 7.28.5(@babel/core@7.28.5) '@babel/runtime': 7.28.4 '@pmmmwh/react-refresh-webpack-plugin': 0.5.17(react-refresh@0.14.2)(type-fest@4.2.0)(webpack-hot-middleware@2.26.1)(webpack@5.103.0(esbuild@0.25.0)(uglify-js@3.19.3)) - '@storybook/builder-webpack5': 9.1.13(esbuild@0.25.0)(storybook@9.1.13(@testing-library/dom@10.4.1)(msw@2.12.4(@types/node@18.15.0)(typescript@5.9.3)))(typescript@5.9.3)(uglify-js@3.19.3) - '@storybook/preset-react-webpack': 9.1.13(esbuild@0.25.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(storybook@9.1.13(@testing-library/dom@10.4.1)(msw@2.12.4(@types/node@18.15.0)(typescript@5.9.3)))(typescript@5.9.3)(uglify-js@3.19.3) - '@storybook/react': 9.1.13(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(storybook@9.1.13(@testing-library/dom@10.4.1)(msw@2.12.4(@types/node@18.15.0)(typescript@5.9.3)))(typescript@5.9.3) + '@storybook/builder-webpack5': 9.1.13(esbuild@0.25.0)(storybook@9.1.13(@testing-library/dom@10.4.1))(typescript@5.9.3)(uglify-js@3.19.3) + '@storybook/preset-react-webpack': 9.1.13(esbuild@0.25.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(storybook@9.1.13(@testing-library/dom@10.4.1))(typescript@5.9.3)(uglify-js@3.19.3) + '@storybook/react': 9.1.13(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(storybook@9.1.13(@testing-library/dom@10.4.1))(typescript@5.9.3) '@types/semver': 7.7.1 babel-loader: 9.2.1(@babel/core@7.28.5)(webpack@5.103.0(esbuild@0.25.0)(uglify-js@3.19.3)) css-loader: 6.11.0(webpack@5.103.0(esbuild@0.25.0)(uglify-js@3.19.3)) image-size: 2.0.2 loader-utils: 3.3.1 - next: 15.5.7(@babel/core@7.28.5)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(sass@1.94.2) + next: 15.5.7(@babel/core@7.28.5)(@playwright/test@1.57.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(sass@1.95.0) node-polyfill-webpack-plugin: 2.0.1(webpack@5.103.0(esbuild@0.25.0)(uglify-js@3.19.3)) postcss: 8.5.6 postcss-loader: 8.2.0(postcss@8.5.6)(typescript@5.9.3)(webpack@5.103.0(esbuild@0.25.0)(uglify-js@3.19.3)) @@ -11868,9 +11973,9 @@ snapshots: react-dom: 19.2.1(react@19.2.1) react-refresh: 0.14.2 resolve-url-loader: 5.0.0 - sass-loader: 16.0.6(sass@1.94.2)(webpack@5.103.0(esbuild@0.25.0)(uglify-js@3.19.3)) + sass-loader: 16.0.6(sass@1.95.0)(webpack@5.103.0(esbuild@0.25.0)(uglify-js@3.19.3)) semver: 7.7.3 - storybook: 9.1.13(@testing-library/dom@10.4.1)(msw@2.12.4(@types/node@18.15.0)(typescript@5.9.3)) + storybook: 9.1.13(@testing-library/dom@10.4.1) style-loader: 3.3.4(webpack@5.103.0(esbuild@0.25.0)(uglify-js@3.19.3)) styled-jsx: 5.1.7(@babel/core@7.28.5)(react@19.2.1) tsconfig-paths: 4.2.0 @@ -11896,9 +12001,9 @@ snapshots: - webpack-hot-middleware - webpack-plugin-serve - '@storybook/preset-react-webpack@9.1.13(esbuild@0.25.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(storybook@9.1.13(@testing-library/dom@10.4.1)(msw@2.12.4(@types/node@18.15.0)(typescript@5.9.3)))(typescript@5.9.3)(uglify-js@3.19.3)': + '@storybook/preset-react-webpack@9.1.13(esbuild@0.25.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(storybook@9.1.13(@testing-library/dom@10.4.1))(typescript@5.9.3)(uglify-js@3.19.3)': dependencies: - '@storybook/core-webpack': 9.1.13(storybook@9.1.13(@testing-library/dom@10.4.1)(msw@2.12.4(@types/node@18.15.0)(typescript@5.9.3))) + '@storybook/core-webpack': 9.1.13(storybook@9.1.13(@testing-library/dom@10.4.1)) '@storybook/react-docgen-typescript-plugin': 1.0.6--canary.9.0c3f3b7.0(typescript@5.9.3)(webpack@5.103.0(esbuild@0.25.0)(uglify-js@3.19.3)) '@types/semver': 7.7.1 find-up: 7.0.0 @@ -11908,7 +12013,7 @@ snapshots: react-dom: 19.2.1(react@19.2.1) resolve: 1.22.11 semver: 7.7.3 - storybook: 9.1.13(@testing-library/dom@10.4.1)(msw@2.12.4(@types/node@18.15.0)(typescript@5.9.3)) + storybook: 9.1.13(@testing-library/dom@10.4.1) tsconfig-paths: 4.2.0 webpack: 5.103.0(esbuild@0.25.0)(uglify-js@3.19.3) optionalDependencies: @@ -11934,26 +12039,26 @@ snapshots: transitivePeerDependencies: - supports-color - '@storybook/react-dom-shim@9.1.13(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(storybook@9.1.13(@testing-library/dom@10.4.1)(msw@2.12.4(@types/node@18.15.0)(typescript@5.9.3)))': + '@storybook/react-dom-shim@9.1.13(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(storybook@9.1.13(@testing-library/dom@10.4.1))': dependencies: react: 19.2.1 react-dom: 19.2.1(react@19.2.1) - storybook: 9.1.13(@testing-library/dom@10.4.1)(msw@2.12.4(@types/node@18.15.0)(typescript@5.9.3)) + storybook: 9.1.13(@testing-library/dom@10.4.1) - '@storybook/react@9.1.13(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(storybook@9.1.13(@testing-library/dom@10.4.1)(msw@2.12.4(@types/node@18.15.0)(typescript@5.9.3)))(typescript@5.9.3)': + '@storybook/react@9.1.13(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(storybook@9.1.13(@testing-library/dom@10.4.1))(typescript@5.9.3)': dependencies: '@storybook/global': 5.0.0 - '@storybook/react-dom-shim': 9.1.13(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(storybook@9.1.13(@testing-library/dom@10.4.1)(msw@2.12.4(@types/node@18.15.0)(typescript@5.9.3))) + '@storybook/react-dom-shim': 9.1.13(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(storybook@9.1.13(@testing-library/dom@10.4.1)) react: 19.2.1 react-dom: 19.2.1(react@19.2.1) - storybook: 9.1.13(@testing-library/dom@10.4.1)(msw@2.12.4(@types/node@18.15.0)(typescript@5.9.3)) + storybook: 9.1.13(@testing-library/dom@10.4.1) optionalDependencies: typescript: 5.9.3 '@stylistic/eslint-plugin@5.6.1(eslint@9.39.1(jiti@1.21.7))': dependencies: '@eslint-community/eslint-utils': 4.9.0(eslint@9.39.1(jiti@1.21.7)) - '@typescript-eslint/types': 8.48.1 + '@typescript-eslint/types': 8.49.0 eslint: 9.39.1(jiti@1.21.7) eslint-visitor-keys: 4.2.1 espree: 10.4.0 @@ -11988,7 +12093,7 @@ snapshots: '@tanstack/devtools-event-client@0.3.5': {} - '@tanstack/form-core@1.27.0': + '@tanstack/form-core@1.27.1': dependencies: '@tanstack/devtools-event-client': 0.3.5 '@tanstack/pacer': 0.15.4 @@ -11999,27 +12104,27 @@ snapshots: '@tanstack/devtools-event-client': 0.3.5 '@tanstack/store': 0.7.7 - '@tanstack/query-core@5.90.11': {} + '@tanstack/query-core@5.90.12': {} '@tanstack/query-devtools@5.91.1': {} - '@tanstack/react-form@1.27.0(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': + '@tanstack/react-form@1.27.1(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': dependencies: - '@tanstack/form-core': 1.27.0 + '@tanstack/form-core': 1.27.1 '@tanstack/react-store': 0.8.0(react-dom@19.2.1(react@19.2.1))(react@19.2.1) react: 19.2.1 transitivePeerDependencies: - react-dom - '@tanstack/react-query-devtools@5.91.1(@tanstack/react-query@5.90.11(react@19.2.1))(react@19.2.1)': + '@tanstack/react-query-devtools@5.91.1(@tanstack/react-query@5.90.12(react@19.2.1))(react@19.2.1)': dependencies: '@tanstack/query-devtools': 5.91.1 - '@tanstack/react-query': 5.90.11(react@19.2.1) + '@tanstack/react-query': 5.90.12(react@19.2.1) react: 19.2.1 - '@tanstack/react-query@5.90.11(react@19.2.1)': + '@tanstack/react-query@5.90.12(react@19.2.1)': dependencies: - '@tanstack/query-core': 5.90.11 + '@tanstack/query-core': 5.90.12 react: 19.2.1 '@tanstack/react-store@0.8.0(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': @@ -12029,9 +12134,9 @@ snapshots: react-dom: 19.2.1(react@19.2.1) use-sync-external-store: 1.6.0(react@19.2.1) - '@tanstack/react-virtual@3.13.12(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': + '@tanstack/react-virtual@3.13.13(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': dependencies: - '@tanstack/virtual-core': 3.13.12 + '@tanstack/virtual-core': 3.13.13 react: 19.2.1 react-dom: 19.2.1(react@19.2.1) @@ -12039,7 +12144,7 @@ snapshots: '@tanstack/store@0.8.0': {} - '@tanstack/virtual-core@3.13.12': {} + '@tanstack/virtual-core@3.13.13': {} '@testing-library/dom@10.4.1': dependencies: @@ -12340,7 +12445,7 @@ snapshots: '@types/node@18.15.0': {} - '@types/node@20.19.25': + '@types/node@20.19.26': dependencies: undici-types: 6.21.0 @@ -12392,9 +12497,6 @@ snapshots: '@types/stack-utils@2.0.3': {} - '@types/statuses@2.0.6': - optional: true - '@types/trusted-types@2.0.7': {} '@types/unist@2.0.11': {} @@ -12413,16 +12515,15 @@ snapshots: '@types/zen-observable@0.8.3': {} - '@typescript-eslint/eslint-plugin@8.48.1(@typescript-eslint/parser@8.48.1(eslint@9.39.1(jiti@1.21.7))(typescript@5.9.3))(eslint@9.39.1(jiti@1.21.7))(typescript@5.9.3)': + '@typescript-eslint/eslint-plugin@8.49.0(@typescript-eslint/parser@8.49.0(eslint@9.39.1(jiti@1.21.7))(typescript@5.9.3))(eslint@9.39.1(jiti@1.21.7))(typescript@5.9.3)': dependencies: '@eslint-community/regexpp': 4.12.2 - '@typescript-eslint/parser': 8.48.1(eslint@9.39.1(jiti@1.21.7))(typescript@5.9.3) - '@typescript-eslint/scope-manager': 8.48.1 - '@typescript-eslint/type-utils': 8.48.1(eslint@9.39.1(jiti@1.21.7))(typescript@5.9.3) - '@typescript-eslint/utils': 8.48.1(eslint@9.39.1(jiti@1.21.7))(typescript@5.9.3) - '@typescript-eslint/visitor-keys': 8.48.1 + '@typescript-eslint/parser': 8.49.0(eslint@9.39.1(jiti@1.21.7))(typescript@5.9.3) + '@typescript-eslint/scope-manager': 8.49.0 + '@typescript-eslint/type-utils': 8.49.0(eslint@9.39.1(jiti@1.21.7))(typescript@5.9.3) + '@typescript-eslint/utils': 8.49.0(eslint@9.39.1(jiti@1.21.7))(typescript@5.9.3) + '@typescript-eslint/visitor-keys': 8.49.0 eslint: 9.39.1(jiti@1.21.7) - graphemer: 1.4.0 ignore: 7.0.5 natural-compare: 1.4.0 ts-api-utils: 2.1.0(typescript@5.9.3) @@ -12430,41 +12531,41 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.48.1(eslint@9.39.1(jiti@1.21.7))(typescript@5.9.3)': + '@typescript-eslint/parser@8.49.0(eslint@9.39.1(jiti@1.21.7))(typescript@5.9.3)': dependencies: - '@typescript-eslint/scope-manager': 8.48.1 - '@typescript-eslint/types': 8.48.1 - '@typescript-eslint/typescript-estree': 8.48.1(typescript@5.9.3) - '@typescript-eslint/visitor-keys': 8.48.1 + '@typescript-eslint/scope-manager': 8.49.0 + '@typescript-eslint/types': 8.49.0 + '@typescript-eslint/typescript-estree': 8.49.0(typescript@5.9.3) + '@typescript-eslint/visitor-keys': 8.49.0 debug: 4.4.3 eslint: 9.39.1(jiti@1.21.7) typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/project-service@8.48.1(typescript@5.9.3)': + '@typescript-eslint/project-service@8.49.0(typescript@5.9.3)': dependencies: - '@typescript-eslint/tsconfig-utils': 8.48.1(typescript@5.9.3) - '@typescript-eslint/types': 8.48.1 + '@typescript-eslint/tsconfig-utils': 8.49.0(typescript@5.9.3) + '@typescript-eslint/types': 8.49.0 debug: 4.4.3 typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/scope-manager@8.48.1': + '@typescript-eslint/scope-manager@8.49.0': dependencies: - '@typescript-eslint/types': 8.48.1 - '@typescript-eslint/visitor-keys': 8.48.1 + '@typescript-eslint/types': 8.49.0 + '@typescript-eslint/visitor-keys': 8.49.0 - '@typescript-eslint/tsconfig-utils@8.48.1(typescript@5.9.3)': + '@typescript-eslint/tsconfig-utils@8.49.0(typescript@5.9.3)': dependencies: typescript: 5.9.3 - '@typescript-eslint/type-utils@8.48.1(eslint@9.39.1(jiti@1.21.7))(typescript@5.9.3)': + '@typescript-eslint/type-utils@8.49.0(eslint@9.39.1(jiti@1.21.7))(typescript@5.9.3)': dependencies: - '@typescript-eslint/types': 8.48.1 - '@typescript-eslint/typescript-estree': 8.48.1(typescript@5.9.3) - '@typescript-eslint/utils': 8.48.1(eslint@9.39.1(jiti@1.21.7))(typescript@5.9.3) + '@typescript-eslint/types': 8.49.0 + '@typescript-eslint/typescript-estree': 8.49.0(typescript@5.9.3) + '@typescript-eslint/utils': 8.49.0(eslint@9.39.1(jiti@1.21.7))(typescript@5.9.3) debug: 4.4.3 eslint: 9.39.1(jiti@1.21.7) ts-api-utils: 2.1.0(typescript@5.9.3) @@ -12472,14 +12573,14 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/types@8.48.1': {} + '@typescript-eslint/types@8.49.0': {} - '@typescript-eslint/typescript-estree@8.48.1(typescript@5.9.3)': + '@typescript-eslint/typescript-estree@8.49.0(typescript@5.9.3)': dependencies: - '@typescript-eslint/project-service': 8.48.1(typescript@5.9.3) - '@typescript-eslint/tsconfig-utils': 8.48.1(typescript@5.9.3) - '@typescript-eslint/types': 8.48.1 - '@typescript-eslint/visitor-keys': 8.48.1 + '@typescript-eslint/project-service': 8.49.0(typescript@5.9.3) + '@typescript-eslint/tsconfig-utils': 8.49.0(typescript@5.9.3) + '@typescript-eslint/types': 8.49.0 + '@typescript-eslint/visitor-keys': 8.49.0 debug: 4.4.3 minimatch: 9.0.5 semver: 7.7.3 @@ -12489,59 +12590,59 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.48.1(eslint@9.39.1(jiti@1.21.7))(typescript@5.9.3)': + '@typescript-eslint/utils@8.49.0(eslint@9.39.1(jiti@1.21.7))(typescript@5.9.3)': dependencies: '@eslint-community/eslint-utils': 4.9.0(eslint@9.39.1(jiti@1.21.7)) - '@typescript-eslint/scope-manager': 8.48.1 - '@typescript-eslint/types': 8.48.1 - '@typescript-eslint/typescript-estree': 8.48.1(typescript@5.9.3) + '@typescript-eslint/scope-manager': 8.49.0 + '@typescript-eslint/types': 8.49.0 + '@typescript-eslint/typescript-estree': 8.49.0(typescript@5.9.3) eslint: 9.39.1(jiti@1.21.7) typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/visitor-keys@8.48.1': + '@typescript-eslint/visitor-keys@8.49.0': dependencies: - '@typescript-eslint/types': 8.48.1 + '@typescript-eslint/types': 8.49.0 eslint-visitor-keys: 4.2.1 - '@typescript/native-preview-darwin-arm64@7.0.0-dev.20251204.1': + '@typescript/native-preview-darwin-arm64@7.0.0-dev.20251209.1': optional: true - '@typescript/native-preview-darwin-x64@7.0.0-dev.20251204.1': + '@typescript/native-preview-darwin-x64@7.0.0-dev.20251209.1': optional: true - '@typescript/native-preview-linux-arm64@7.0.0-dev.20251204.1': + '@typescript/native-preview-linux-arm64@7.0.0-dev.20251209.1': optional: true - '@typescript/native-preview-linux-arm@7.0.0-dev.20251204.1': + '@typescript/native-preview-linux-arm@7.0.0-dev.20251209.1': optional: true - '@typescript/native-preview-linux-x64@7.0.0-dev.20251204.1': + '@typescript/native-preview-linux-x64@7.0.0-dev.20251209.1': optional: true - '@typescript/native-preview-win32-arm64@7.0.0-dev.20251204.1': + '@typescript/native-preview-win32-arm64@7.0.0-dev.20251209.1': optional: true - '@typescript/native-preview-win32-x64@7.0.0-dev.20251204.1': + '@typescript/native-preview-win32-x64@7.0.0-dev.20251209.1': optional: true - '@typescript/native-preview@7.0.0-dev.20251204.1': + '@typescript/native-preview@7.0.0-dev.20251209.1': optionalDependencies: - '@typescript/native-preview-darwin-arm64': 7.0.0-dev.20251204.1 - '@typescript/native-preview-darwin-x64': 7.0.0-dev.20251204.1 - '@typescript/native-preview-linux-arm': 7.0.0-dev.20251204.1 - '@typescript/native-preview-linux-arm64': 7.0.0-dev.20251204.1 - '@typescript/native-preview-linux-x64': 7.0.0-dev.20251204.1 - '@typescript/native-preview-win32-arm64': 7.0.0-dev.20251204.1 - '@typescript/native-preview-win32-x64': 7.0.0-dev.20251204.1 + '@typescript/native-preview-darwin-arm64': 7.0.0-dev.20251209.1 + '@typescript/native-preview-darwin-x64': 7.0.0-dev.20251209.1 + '@typescript/native-preview-linux-arm': 7.0.0-dev.20251209.1 + '@typescript/native-preview-linux-arm64': 7.0.0-dev.20251209.1 + '@typescript/native-preview-linux-x64': 7.0.0-dev.20251209.1 + '@typescript/native-preview-win32-arm64': 7.0.0-dev.20251209.1 + '@typescript/native-preview-win32-x64': 7.0.0-dev.20251209.1 '@ungap/structured-clone@1.3.0': {} - '@vitest/eslint-plugin@1.5.1(eslint@9.39.1(jiti@1.21.7))(typescript@5.9.3)': + '@vitest/eslint-plugin@1.5.2(eslint@9.39.1(jiti@1.21.7))(typescript@5.9.3)': dependencies: - '@typescript-eslint/scope-manager': 8.48.1 - '@typescript-eslint/utils': 8.48.1(eslint@9.39.1(jiti@1.21.7))(typescript@5.9.3) + '@typescript-eslint/scope-manager': 8.49.0 + '@typescript-eslint/utils': 8.49.0(eslint@9.39.1(jiti@1.21.7))(typescript@5.9.3) eslint: 9.39.1(jiti@1.21.7) optionalDependencies: typescript: 5.9.3 @@ -12556,13 +12657,11 @@ snapshots: chai: 5.3.3 tinyrainbow: 2.0.0 - '@vitest/mocker@3.2.4(msw@2.12.4(@types/node@18.15.0)(typescript@5.9.3))': + '@vitest/mocker@3.2.4': dependencies: '@vitest/spy': 3.2.4 estree-walker: 3.0.3 magic-string: 0.30.21 - optionalDependencies: - msw: 2.12.4(@types/node@18.15.0)(typescript@5.9.3) '@vitest/pretty-format@3.2.4': dependencies: @@ -12842,8 +12941,8 @@ snapshots: autoprefixer@10.4.22(postcss@8.5.6): dependencies: - browserslist: 4.28.0 - caniuse-lite: 1.0.30001757 + browserslist: 4.28.1 + caniuse-lite: 1.0.30001760 fraction.js: 5.3.4 normalize-range: 0.1.2 picocolors: 1.1.1 @@ -12959,7 +13058,7 @@ snapshots: base64-js@1.5.1: {} - baseline-browser-mapping@2.8.32: {} + baseline-browser-mapping@2.9.5: {} before-after-hook@3.0.2: {} @@ -13051,13 +13150,13 @@ snapshots: dependencies: pako: 1.0.11 - browserslist@4.28.0: + browserslist@4.28.1: dependencies: - baseline-browser-mapping: 2.8.32 - caniuse-lite: 1.0.30001757 - electron-to-chromium: 1.5.263 + baseline-browser-mapping: 2.9.5 + caniuse-lite: 1.0.30001760 + electron-to-chromium: 1.5.267 node-releases: 2.0.27 - update-browserslist-db: 1.1.4(browserslist@4.28.0) + update-browserslist-db: 1.2.2(browserslist@4.28.1) bser@2.1.1: dependencies: @@ -13113,9 +13212,7 @@ snapshots: camelcase@6.3.0: {} - caniuse-lite@1.0.30001757: {} - - caniuse-lite@1.0.30001759: {} + caniuse-lite@1.0.30001760: {} canvas@3.2.0: dependencies: @@ -13248,9 +13345,6 @@ snapshots: slice-ansi: 5.0.0 string-width: 4.2.3 - cli-width@4.1.0: - optional: true - client-only@0.0.1: {} cliui@8.0.1: @@ -13351,16 +13445,13 @@ snapshots: convert-source-map@2.0.0: {} - cookie@1.1.1: - optional: true - copy-to-clipboard@3.3.3: dependencies: toggle-selection: 1.0.6 core-js-compat@3.47.0: dependencies: - browserslist: 4.28.0 + browserslist: 4.28.1 core-js-pure@3.47.0: {} @@ -13801,7 +13892,7 @@ snapshots: optionalDependencies: '@types/trusted-types': 2.0.7 - dompurify@3.3.0: + dompurify@3.3.1: optionalDependencies: '@types/trusted-types': 2.0.7 @@ -13818,6 +13909,8 @@ snapshots: dotenv@16.6.1: {} + dotenv@17.2.3: {} + duplexer@0.1.2: {} echarts-for-react@3.0.5(echarts@5.6.0)(react@19.2.1): @@ -13836,7 +13929,7 @@ snapshots: dependencies: jake: 10.9.4 - electron-to-chromium@1.5.263: {} + electron-to-chromium@1.5.267: {} elkjs@0.9.3: {} @@ -13944,6 +14037,35 @@ snapshots: '@esbuild/win32-ia32': 0.25.0 '@esbuild/win32-x64': 0.25.0 + esbuild@0.25.12: + optionalDependencies: + '@esbuild/aix-ppc64': 0.25.12 + '@esbuild/android-arm': 0.25.12 + '@esbuild/android-arm64': 0.25.12 + '@esbuild/android-x64': 0.25.12 + '@esbuild/darwin-arm64': 0.25.12 + '@esbuild/darwin-x64': 0.25.12 + '@esbuild/freebsd-arm64': 0.25.12 + '@esbuild/freebsd-x64': 0.25.12 + '@esbuild/linux-arm': 0.25.12 + '@esbuild/linux-arm64': 0.25.12 + '@esbuild/linux-ia32': 0.25.12 + '@esbuild/linux-loong64': 0.25.12 + '@esbuild/linux-mips64el': 0.25.12 + '@esbuild/linux-ppc64': 0.25.12 + '@esbuild/linux-riscv64': 0.25.12 + '@esbuild/linux-s390x': 0.25.12 + '@esbuild/linux-x64': 0.25.12 + '@esbuild/netbsd-arm64': 0.25.12 + '@esbuild/netbsd-x64': 0.25.12 + '@esbuild/openbsd-arm64': 0.25.12 + '@esbuild/openbsd-x64': 0.25.12 + '@esbuild/openharmony-arm64': 0.25.12 + '@esbuild/sunos-x64': 0.25.12 + '@esbuild/win32-arm64': 0.25.12 + '@esbuild/win32-ia32': 0.25.12 + '@esbuild/win32-x64': 0.25.12 + escalade@3.2.0: {} escape-string-regexp@1.0.5: {} @@ -13973,11 +14095,11 @@ snapshots: dependencies: pathe: 2.0.3 - eslint-json-compat-utils@0.2.1(eslint@9.39.1(jiti@1.21.7))(jsonc-eslint-parser@2.4.1): + eslint-json-compat-utils@0.2.1(eslint@9.39.1(jiti@1.21.7))(jsonc-eslint-parser@2.4.2): dependencies: eslint: 9.39.1(jiti@1.21.7) esquery: 1.6.0 - jsonc-eslint-parser: 2.4.1 + jsonc-eslint-parser: 2.4.2 eslint-merge-processors@2.0.0(eslint@9.39.1(jiti@1.21.7)): dependencies: @@ -14002,7 +14124,7 @@ snapshots: eslint-plugin-import-lite@0.3.0(eslint@9.39.1(jiti@1.21.7))(typescript@5.9.3): dependencies: '@eslint-community/eslint-utils': 4.9.0(eslint@9.39.1(jiti@1.21.7)) - '@typescript-eslint/types': 8.48.1 + '@typescript-eslint/types': 8.49.0 eslint: 9.39.1(jiti@1.21.7) optionalDependencies: typescript: 5.9.3 @@ -14030,10 +14152,10 @@ snapshots: diff-sequences: 27.5.1 eslint: 9.39.1(jiti@1.21.7) eslint-compat-utils: 0.6.5(eslint@9.39.1(jiti@1.21.7)) - eslint-json-compat-utils: 0.2.1(eslint@9.39.1(jiti@1.21.7))(jsonc-eslint-parser@2.4.1) + eslint-json-compat-utils: 0.2.1(eslint@9.39.1(jiti@1.21.7))(jsonc-eslint-parser@2.4.2) espree: 10.4.0 graphemer: 1.4.0 - jsonc-eslint-parser: 2.4.1 + jsonc-eslint-parser: 2.4.2 natural-compare: 1.4.0 synckit: 0.11.11 transitivePeerDependencies: @@ -14056,29 +14178,30 @@ snapshots: eslint-plugin-no-only-tests@3.3.0: {} - eslint-plugin-oxlint@1.31.0: + eslint-plugin-oxlint@1.32.0: dependencies: jsonc-parser: 3.3.1 eslint-plugin-perfectionist@4.15.1(eslint@9.39.1(jiti@1.21.7))(typescript@5.9.3): dependencies: - '@typescript-eslint/types': 8.48.1 - '@typescript-eslint/utils': 8.48.1(eslint@9.39.1(jiti@1.21.7))(typescript@5.9.3) + '@typescript-eslint/types': 8.49.0 + '@typescript-eslint/utils': 8.49.0(eslint@9.39.1(jiti@1.21.7))(typescript@5.9.3) eslint: 9.39.1(jiti@1.21.7) natural-orderby: 5.0.0 transitivePeerDependencies: - supports-color - typescript - eslint-plugin-pnpm@1.3.0(eslint@9.39.1(jiti@1.21.7)): + eslint-plugin-pnpm@1.4.2(eslint@9.39.1(jiti@1.21.7)): dependencies: empathic: 2.0.0 eslint: 9.39.1(jiti@1.21.7) - jsonc-eslint-parser: 2.4.1 + jsonc-eslint-parser: 2.4.2 pathe: 2.0.3 - pnpm-workspace-yaml: 1.3.0 + pnpm-workspace-yaml: 1.4.2 tinyglobby: 0.2.15 - yaml-eslint-parser: 1.3.1 + yaml: 2.8.2 + yaml-eslint-parser: 1.3.2 eslint-plugin-react-debug@1.53.1(eslint@9.39.1(jiti@1.21.7))(typescript@5.9.3): dependencies: @@ -14088,10 +14211,10 @@ snapshots: '@eslint-react/kit': 1.53.1(eslint@9.39.1(jiti@1.21.7))(typescript@5.9.3) '@eslint-react/shared': 1.53.1(eslint@9.39.1(jiti@1.21.7))(typescript@5.9.3) '@eslint-react/var': 1.53.1(eslint@9.39.1(jiti@1.21.7))(typescript@5.9.3) - '@typescript-eslint/scope-manager': 8.48.1 - '@typescript-eslint/type-utils': 8.48.1(eslint@9.39.1(jiti@1.21.7))(typescript@5.9.3) - '@typescript-eslint/types': 8.48.1 - '@typescript-eslint/utils': 8.48.1(eslint@9.39.1(jiti@1.21.7))(typescript@5.9.3) + '@typescript-eslint/scope-manager': 8.49.0 + '@typescript-eslint/type-utils': 8.49.0(eslint@9.39.1(jiti@1.21.7))(typescript@5.9.3) + '@typescript-eslint/types': 8.49.0 + '@typescript-eslint/utils': 8.49.0(eslint@9.39.1(jiti@1.21.7))(typescript@5.9.3) eslint: 9.39.1(jiti@1.21.7) string-ts: 2.3.1 ts-pattern: 5.9.0 @@ -14108,9 +14231,9 @@ snapshots: '@eslint-react/kit': 1.53.1(eslint@9.39.1(jiti@1.21.7))(typescript@5.9.3) '@eslint-react/shared': 1.53.1(eslint@9.39.1(jiti@1.21.7))(typescript@5.9.3) '@eslint-react/var': 1.53.1(eslint@9.39.1(jiti@1.21.7))(typescript@5.9.3) - '@typescript-eslint/scope-manager': 8.48.1 - '@typescript-eslint/types': 8.48.1 - '@typescript-eslint/utils': 8.48.1(eslint@9.39.1(jiti@1.21.7))(typescript@5.9.3) + '@typescript-eslint/scope-manager': 8.49.0 + '@typescript-eslint/types': 8.49.0 + '@typescript-eslint/utils': 8.49.0(eslint@9.39.1(jiti@1.21.7))(typescript@5.9.3) compare-versions: 6.1.1 eslint: 9.39.1(jiti@1.21.7) string-ts: 2.3.1 @@ -14128,10 +14251,10 @@ snapshots: '@eslint-react/kit': 1.53.1(eslint@9.39.1(jiti@1.21.7))(typescript@5.9.3) '@eslint-react/shared': 1.53.1(eslint@9.39.1(jiti@1.21.7))(typescript@5.9.3) '@eslint-react/var': 1.53.1(eslint@9.39.1(jiti@1.21.7))(typescript@5.9.3) - '@typescript-eslint/scope-manager': 8.48.1 - '@typescript-eslint/type-utils': 8.48.1(eslint@9.39.1(jiti@1.21.7))(typescript@5.9.3) - '@typescript-eslint/types': 8.48.1 - '@typescript-eslint/utils': 8.48.1(eslint@9.39.1(jiti@1.21.7))(typescript@5.9.3) + '@typescript-eslint/scope-manager': 8.49.0 + '@typescript-eslint/type-utils': 8.49.0(eslint@9.39.1(jiti@1.21.7))(typescript@5.9.3) + '@typescript-eslint/types': 8.49.0 + '@typescript-eslint/utils': 8.49.0(eslint@9.39.1(jiti@1.21.7))(typescript@5.9.3) eslint: 9.39.1(jiti@1.21.7) string-ts: 2.3.1 ts-pattern: 5.9.0 @@ -14152,10 +14275,10 @@ snapshots: '@eslint-react/kit': 1.53.1(eslint@9.39.1(jiti@1.21.7))(typescript@5.9.3) '@eslint-react/shared': 1.53.1(eslint@9.39.1(jiti@1.21.7))(typescript@5.9.3) '@eslint-react/var': 1.53.1(eslint@9.39.1(jiti@1.21.7))(typescript@5.9.3) - '@typescript-eslint/scope-manager': 8.48.1 - '@typescript-eslint/type-utils': 8.48.1(eslint@9.39.1(jiti@1.21.7))(typescript@5.9.3) - '@typescript-eslint/types': 8.48.1 - '@typescript-eslint/utils': 8.48.1(eslint@9.39.1(jiti@1.21.7))(typescript@5.9.3) + '@typescript-eslint/scope-manager': 8.49.0 + '@typescript-eslint/type-utils': 8.49.0(eslint@9.39.1(jiti@1.21.7))(typescript@5.9.3) + '@typescript-eslint/types': 8.49.0 + '@typescript-eslint/utils': 8.49.0(eslint@9.39.1(jiti@1.21.7))(typescript@5.9.3) eslint: 9.39.1(jiti@1.21.7) string-ts: 2.3.1 ts-pattern: 5.9.0 @@ -14176,9 +14299,9 @@ snapshots: '@eslint-react/kit': 1.53.1(eslint@9.39.1(jiti@1.21.7))(typescript@5.9.3) '@eslint-react/shared': 1.53.1(eslint@9.39.1(jiti@1.21.7))(typescript@5.9.3) '@eslint-react/var': 1.53.1(eslint@9.39.1(jiti@1.21.7))(typescript@5.9.3) - '@typescript-eslint/scope-manager': 8.48.1 - '@typescript-eslint/types': 8.48.1 - '@typescript-eslint/utils': 8.48.1(eslint@9.39.1(jiti@1.21.7))(typescript@5.9.3) + '@typescript-eslint/scope-manager': 8.49.0 + '@typescript-eslint/types': 8.49.0 + '@typescript-eslint/utils': 8.49.0(eslint@9.39.1(jiti@1.21.7))(typescript@5.9.3) eslint: 9.39.1(jiti@1.21.7) string-ts: 2.3.1 ts-pattern: 5.9.0 @@ -14195,10 +14318,10 @@ snapshots: '@eslint-react/kit': 1.53.1(eslint@9.39.1(jiti@1.21.7))(typescript@5.9.3) '@eslint-react/shared': 1.53.1(eslint@9.39.1(jiti@1.21.7))(typescript@5.9.3) '@eslint-react/var': 1.53.1(eslint@9.39.1(jiti@1.21.7))(typescript@5.9.3) - '@typescript-eslint/scope-manager': 8.48.1 - '@typescript-eslint/type-utils': 8.48.1(eslint@9.39.1(jiti@1.21.7))(typescript@5.9.3) - '@typescript-eslint/types': 8.48.1 - '@typescript-eslint/utils': 8.48.1(eslint@9.39.1(jiti@1.21.7))(typescript@5.9.3) + '@typescript-eslint/scope-manager': 8.49.0 + '@typescript-eslint/type-utils': 8.49.0(eslint@9.39.1(jiti@1.21.7))(typescript@5.9.3) + '@typescript-eslint/types': 8.49.0 + '@typescript-eslint/utils': 8.49.0(eslint@9.39.1(jiti@1.21.7))(typescript@5.9.3) compare-versions: 6.1.1 eslint: 9.39.1(jiti@1.21.7) is-immutable-type: 5.0.1(eslint@9.39.1(jiti@1.21.7))(typescript@5.9.3) @@ -14235,11 +14358,11 @@ snapshots: semver: 7.7.2 typescript: 5.9.3 - eslint-plugin-storybook@9.1.16(eslint@9.39.1(jiti@1.21.7))(storybook@9.1.13(@testing-library/dom@10.4.1)(msw@2.12.4(@types/node@18.15.0)(typescript@5.9.3)))(typescript@5.9.3): + eslint-plugin-storybook@9.1.16(eslint@9.39.1(jiti@1.21.7))(storybook@9.1.13(@testing-library/dom@10.4.1))(typescript@5.9.3): dependencies: - '@typescript-eslint/utils': 8.48.1(eslint@9.39.1(jiti@1.21.7))(typescript@5.9.3) + '@typescript-eslint/utils': 8.49.0(eslint@9.39.1(jiti@1.21.7))(typescript@5.9.3) eslint: 9.39.1(jiti@1.21.7) - storybook: 9.1.13(@testing-library/dom@10.4.1)(msw@2.12.4(@types/node@18.15.0)(typescript@5.9.3)) + storybook: 9.1.13(@testing-library/dom@10.4.1) transitivePeerDependencies: - supports-color - typescript @@ -14256,7 +14379,7 @@ snapshots: eslint: 9.39.1(jiti@1.21.7) eslint-compat-utils: 0.6.5(eslint@9.39.1(jiti@1.21.7)) lodash: 4.17.21 - toml-eslint-parser: 0.10.0 + toml-eslint-parser: 0.10.1 transitivePeerDependencies: - supports-color @@ -14282,13 +14405,13 @@ snapshots: semver: 7.7.3 strip-indent: 4.1.1 - eslint-plugin-unused-imports@4.3.0(@typescript-eslint/eslint-plugin@8.48.1(@typescript-eslint/parser@8.48.1(eslint@9.39.1(jiti@1.21.7))(typescript@5.9.3))(eslint@9.39.1(jiti@1.21.7))(typescript@5.9.3))(eslint@9.39.1(jiti@1.21.7)): + eslint-plugin-unused-imports@4.3.0(@typescript-eslint/eslint-plugin@8.49.0(@typescript-eslint/parser@8.49.0(eslint@9.39.1(jiti@1.21.7))(typescript@5.9.3))(eslint@9.39.1(jiti@1.21.7))(typescript@5.9.3))(eslint@9.39.1(jiti@1.21.7)): dependencies: eslint: 9.39.1(jiti@1.21.7) optionalDependencies: - '@typescript-eslint/eslint-plugin': 8.48.1(@typescript-eslint/parser@8.48.1(eslint@9.39.1(jiti@1.21.7))(typescript@5.9.3))(eslint@9.39.1(jiti@1.21.7))(typescript@5.9.3) + '@typescript-eslint/eslint-plugin': 8.49.0(@typescript-eslint/parser@8.49.0(eslint@9.39.1(jiti@1.21.7))(typescript@5.9.3))(eslint@9.39.1(jiti@1.21.7))(typescript@5.9.3) - eslint-plugin-vue@10.6.2(@stylistic/eslint-plugin@5.6.1(eslint@9.39.1(jiti@1.21.7)))(@typescript-eslint/parser@8.48.1(eslint@9.39.1(jiti@1.21.7))(typescript@5.9.3))(eslint@9.39.1(jiti@1.21.7))(vue-eslint-parser@10.2.0(eslint@9.39.1(jiti@1.21.7))): + eslint-plugin-vue@10.6.2(@stylistic/eslint-plugin@5.6.1(eslint@9.39.1(jiti@1.21.7)))(@typescript-eslint/parser@8.49.0(eslint@9.39.1(jiti@1.21.7))(typescript@5.9.3))(eslint@9.39.1(jiti@1.21.7))(vue-eslint-parser@10.2.0(eslint@9.39.1(jiti@1.21.7))): dependencies: '@eslint-community/eslint-utils': 4.9.0(eslint@9.39.1(jiti@1.21.7)) eslint: 9.39.1(jiti@1.21.7) @@ -14300,7 +14423,7 @@ snapshots: xml-name-validator: 4.0.0 optionalDependencies: '@stylistic/eslint-plugin': 5.6.1(eslint@9.39.1(jiti@1.21.7)) - '@typescript-eslint/parser': 8.48.1(eslint@9.39.1(jiti@1.21.7))(typescript@5.9.3) + '@typescript-eslint/parser': 8.49.0(eslint@9.39.1(jiti@1.21.7))(typescript@5.9.3) eslint-plugin-yml@1.19.0(eslint@9.39.1(jiti@1.21.7)): dependencies: @@ -14310,7 +14433,7 @@ snapshots: eslint: 9.39.1(jiti@1.21.7) eslint-compat-utils: 0.6.5(eslint@9.39.1(jiti@1.21.7)) natural-compare: 1.4.0 - yaml-eslint-parser: 1.3.1 + yaml-eslint-parser: 1.3.2 transitivePeerDependencies: - supports-color @@ -14752,9 +14875,6 @@ snapshots: graphemer@1.4.0: {} - graphql@16.12.0: - optional: true - gzip-size@6.0.0: dependencies: duplexer: 0.1.2 @@ -14763,7 +14883,7 @@ snapshots: happy-dom@20.0.11: dependencies: - '@types/node': 20.19.25 + '@types/node': 20.19.26 '@types/whatwg-mimetype': 3.0.2 whatwg-mimetype: 3.0.0 @@ -14839,7 +14959,7 @@ snapshots: '@types/unist': 3.0.3 '@ungap/structured-clone': 1.3.0 hast-util-from-parse5: 8.0.3 - hast-util-to-parse5: 8.0.0 + hast-util-to-parse5: 8.0.1 html-void-elements: 3.0.0 mdast-util-to-hast: 13.2.1 parse5: 7.3.0 @@ -14890,12 +15010,12 @@ snapshots: transitivePeerDependencies: - supports-color - hast-util-to-parse5@8.0.0: + hast-util-to-parse5@8.0.1: dependencies: '@types/hast': 3.0.4 comma-separated-tokens: 2.0.3 devlop: 1.1.0 - property-information: 6.5.0 + property-information: 7.1.0 space-separated-tokens: 2.0.2 web-namespaces: 2.0.1 zwitch: 2.0.4 @@ -14929,9 +15049,6 @@ snapshots: he@1.2.0: {} - headers-polyfill@4.0.3: - optional: true - highlight.js@10.7.3: {} highlightjs-vue@1.0.0: {} @@ -15124,7 +15241,7 @@ snapshots: is-immutable-type@5.0.1(eslint@9.39.1(jiti@1.21.7))(typescript@5.9.3): dependencies: - '@typescript-eslint/type-utils': 8.48.1(eslint@9.39.1(jiti@1.21.7))(typescript@5.9.3) + '@typescript-eslint/type-utils': 8.49.0(eslint@9.39.1(jiti@1.21.7))(typescript@5.9.3) eslint: 9.39.1(jiti@1.21.7) ts-api-utils: 2.1.0(typescript@5.9.3) ts-declaration-location: 1.0.7(typescript@5.9.3) @@ -15583,7 +15700,7 @@ snapshots: json5@2.2.3: {} - jsonc-eslint-parser@2.4.1: + jsonc-eslint-parser@2.4.2: dependencies: acorn: 8.15.0 eslint-visitor-keys: 3.4.3 @@ -15604,7 +15721,7 @@ snapshots: jsx-ast-utils-x@0.1.0: {} - katex@0.16.25: + katex@0.16.27: dependencies: commander: 8.3.0 @@ -15618,7 +15735,7 @@ snapshots: kleur@4.1.5: {} - knip@5.71.0(@types/node@18.15.0)(typescript@5.9.3): + knip@5.72.0(@types/node@18.15.0)(typescript@5.9.3): dependencies: '@nodelib/fs.walk': 1.2.8 '@types/node': 18.15.0 @@ -15627,7 +15744,7 @@ snapshots: jiti: 2.6.1 js-yaml: 4.1.1 minimist: 1.2.8 - oxc-resolver: 11.14.2 + oxc-resolver: 11.15.0 picocolors: 1.1.1 picomatch: 4.0.3 smol-toml: 1.5.2 @@ -15635,7 +15752,7 @@ snapshots: typescript: 5.9.3 zod: 4.1.13 - ky@1.14.0: {} + ky@1.14.1: {} lamejs@1.2.1: dependencies: @@ -16030,8 +16147,8 @@ snapshots: d3-sankey: 0.12.3 dagre-d3-es: 7.0.11 dayjs: 1.11.19 - dompurify: 3.3.0 - katex: 0.16.25 + dompurify: 3.3.1 + katex: 0.16.27 khroma: 2.1.0 lodash-es: 4.17.21 marked: 15.0.12 @@ -16128,7 +16245,7 @@ snapshots: dependencies: '@types/katex': 0.16.7 devlop: 1.1.0 - katex: 0.16.25 + katex: 0.16.27 micromark-factory-space: 2.0.1 micromark-util-character: 2.1.1 micromark-util-symbol: 2.0.1 @@ -16396,35 +16513,6 @@ snapshots: ms@2.1.3: {} - msw@2.12.4(@types/node@18.15.0)(typescript@5.9.3): - dependencies: - '@inquirer/confirm': 5.1.21(@types/node@18.15.0) - '@mswjs/interceptors': 0.40.0 - '@open-draft/deferred-promise': 2.2.0 - '@types/statuses': 2.0.6 - cookie: 1.1.1 - graphql: 16.12.0 - headers-polyfill: 4.0.3 - is-node-process: 1.2.0 - outvariant: 1.4.3 - path-to-regexp: 6.3.0 - picocolors: 1.1.1 - rettime: 0.7.0 - statuses: 2.0.2 - strict-event-emitter: 0.5.1 - tough-cookie: 6.0.0 - type-fest: 5.3.1 - until-async: 3.0.2 - yargs: 17.7.2 - optionalDependencies: - typescript: 5.9.3 - transitivePeerDependencies: - - '@types/node' - optional: true - - mute-stream@2.0.0: - optional: true - mz@2.7.0: dependencies: any-promise: 1.3.0 @@ -16444,13 +16532,13 @@ snapshots: neo-async@2.6.2: {} - next-pwa@5.6.0(@babel/core@7.28.5)(@types/babel__core@7.20.5)(esbuild@0.25.0)(next@15.5.7(@babel/core@7.28.5)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(sass@1.94.2))(uglify-js@3.19.3)(webpack@5.103.0(esbuild@0.25.0)(uglify-js@3.19.3)): + next-pwa@5.6.0(@babel/core@7.28.5)(@types/babel__core@7.20.5)(esbuild@0.25.0)(next@15.5.7(@babel/core@7.28.5)(@playwright/test@1.57.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(sass@1.95.0))(uglify-js@3.19.3)(webpack@5.103.0(esbuild@0.25.0)(uglify-js@3.19.3)): dependencies: babel-loader: 8.4.1(@babel/core@7.28.5)(webpack@5.103.0(esbuild@0.25.0)(uglify-js@3.19.3)) clean-webpack-plugin: 4.0.0(webpack@5.103.0(esbuild@0.25.0)(uglify-js@3.19.3)) globby: 11.1.0 - next: 15.5.7(@babel/core@7.28.5)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(sass@1.94.2) - terser-webpack-plugin: 5.3.14(esbuild@0.25.0)(uglify-js@3.19.3)(webpack@5.103.0(esbuild@0.25.0)(uglify-js@3.19.3)) + next: 15.5.7(@babel/core@7.28.5)(@playwright/test@1.57.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(sass@1.95.0) + terser-webpack-plugin: 5.3.15(esbuild@0.25.0)(uglify-js@3.19.3)(webpack@5.103.0(esbuild@0.25.0)(uglify-js@3.19.3)) workbox-webpack-plugin: 6.6.0(@types/babel__core@7.20.5)(webpack@5.103.0(esbuild@0.25.0)(uglify-js@3.19.3)) workbox-window: 6.6.0 transitivePeerDependencies: @@ -16467,11 +16555,11 @@ snapshots: react: 19.2.1 react-dom: 19.2.1(react@19.2.1) - next@15.5.7(@babel/core@7.28.5)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(sass@1.94.2): + next@15.5.7(@babel/core@7.28.5)(@playwright/test@1.57.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(sass@1.95.0): dependencies: '@next/env': 15.5.7 '@swc/helpers': 0.5.15 - caniuse-lite: 1.0.30001759 + caniuse-lite: 1.0.30001760 postcss: 8.4.31 react: 19.2.1 react-dom: 19.2.1(react@19.2.1) @@ -16485,7 +16573,8 @@ snapshots: '@next/swc-linux-x64-musl': 15.5.7 '@next/swc-win32-arm64-msvc': 15.5.7 '@next/swc-win32-x64-msvc': 15.5.7 - sass: 1.94.2 + '@playwright/test': 1.57.0 + sass: 1.95.0 sharp: 0.34.5 transitivePeerDependencies: - '@babel/core' @@ -16612,39 +16701,39 @@ snapshots: outvariant@1.4.3: {} - oxc-resolver@11.14.2: + oxc-resolver@11.15.0: optionalDependencies: - '@oxc-resolver/binding-android-arm-eabi': 11.14.2 - '@oxc-resolver/binding-android-arm64': 11.14.2 - '@oxc-resolver/binding-darwin-arm64': 11.14.2 - '@oxc-resolver/binding-darwin-x64': 11.14.2 - '@oxc-resolver/binding-freebsd-x64': 11.14.2 - '@oxc-resolver/binding-linux-arm-gnueabihf': 11.14.2 - '@oxc-resolver/binding-linux-arm-musleabihf': 11.14.2 - '@oxc-resolver/binding-linux-arm64-gnu': 11.14.2 - '@oxc-resolver/binding-linux-arm64-musl': 11.14.2 - '@oxc-resolver/binding-linux-ppc64-gnu': 11.14.2 - '@oxc-resolver/binding-linux-riscv64-gnu': 11.14.2 - '@oxc-resolver/binding-linux-riscv64-musl': 11.14.2 - '@oxc-resolver/binding-linux-s390x-gnu': 11.14.2 - '@oxc-resolver/binding-linux-x64-gnu': 11.14.2 - '@oxc-resolver/binding-linux-x64-musl': 11.14.2 - '@oxc-resolver/binding-openharmony-arm64': 11.14.2 - '@oxc-resolver/binding-wasm32-wasi': 11.14.2 - '@oxc-resolver/binding-win32-arm64-msvc': 11.14.2 - '@oxc-resolver/binding-win32-ia32-msvc': 11.14.2 - '@oxc-resolver/binding-win32-x64-msvc': 11.14.2 + '@oxc-resolver/binding-android-arm-eabi': 11.15.0 + '@oxc-resolver/binding-android-arm64': 11.15.0 + '@oxc-resolver/binding-darwin-arm64': 11.15.0 + '@oxc-resolver/binding-darwin-x64': 11.15.0 + '@oxc-resolver/binding-freebsd-x64': 11.15.0 + '@oxc-resolver/binding-linux-arm-gnueabihf': 11.15.0 + '@oxc-resolver/binding-linux-arm-musleabihf': 11.15.0 + '@oxc-resolver/binding-linux-arm64-gnu': 11.15.0 + '@oxc-resolver/binding-linux-arm64-musl': 11.15.0 + '@oxc-resolver/binding-linux-ppc64-gnu': 11.15.0 + '@oxc-resolver/binding-linux-riscv64-gnu': 11.15.0 + '@oxc-resolver/binding-linux-riscv64-musl': 11.15.0 + '@oxc-resolver/binding-linux-s390x-gnu': 11.15.0 + '@oxc-resolver/binding-linux-x64-gnu': 11.15.0 + '@oxc-resolver/binding-linux-x64-musl': 11.15.0 + '@oxc-resolver/binding-openharmony-arm64': 11.15.0 + '@oxc-resolver/binding-wasm32-wasi': 11.15.0 + '@oxc-resolver/binding-win32-arm64-msvc': 11.15.0 + '@oxc-resolver/binding-win32-ia32-msvc': 11.15.0 + '@oxc-resolver/binding-win32-x64-msvc': 11.15.0 - oxlint@1.31.0: + oxlint@1.32.0: optionalDependencies: - '@oxlint/darwin-arm64': 1.31.0 - '@oxlint/darwin-x64': 1.31.0 - '@oxlint/linux-arm64-gnu': 1.31.0 - '@oxlint/linux-arm64-musl': 1.31.0 - '@oxlint/linux-x64-gnu': 1.31.0 - '@oxlint/linux-x64-musl': 1.31.0 - '@oxlint/win32-arm64': 1.31.0 - '@oxlint/win32-x64': 1.31.0 + '@oxlint/darwin-arm64': 1.32.0 + '@oxlint/darwin-x64': 1.32.0 + '@oxlint/linux-arm64-gnu': 1.32.0 + '@oxlint/linux-arm64-musl': 1.32.0 + '@oxlint/linux-x64-gnu': 1.32.0 + '@oxlint/linux-x64-musl': 1.32.0 + '@oxlint/win32-arm64': 1.32.0 + '@oxlint/win32-x64': 1.32.0 p-cancelable@2.1.1: {} @@ -16760,9 +16849,6 @@ snapshots: path-parse@1.0.7: {} - path-to-regexp@6.3.0: - optional: true - path-type@4.0.0: {} path2d@0.2.2: @@ -16838,7 +16924,7 @@ snapshots: pluralize@8.0.0: {} - pnpm-workspace-yaml@1.3.0: + pnpm-workspace-yaml@1.4.2: dependencies: yaml: 2.8.2 @@ -17005,8 +17091,6 @@ snapshots: dependencies: xtend: 4.0.2 - property-information@6.5.0: {} - property-information@7.1.0: {} public-encrypt@4.0.3: @@ -17119,7 +17203,7 @@ snapshots: react-fast-compare@3.2.2: {} - react-hook-form@7.67.0(react@19.2.1): + react-hook-form@7.68.0(react@19.2.1): dependencies: react: 19.2.1 @@ -17209,7 +17293,7 @@ snapshots: react-draggable: 4.4.6(react-dom@19.2.1(react@19.2.1))(react@19.2.1) tslib: 2.6.2 - react-scan@0.4.3(@types/react@19.2.7)(next@15.5.7(@babel/core@7.28.5)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(sass@1.94.2))(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(rollup@2.79.2): + react-scan@0.4.3(@types/react@19.2.7)(next@15.5.7(@babel/core@7.28.5)(@playwright/test@1.57.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(sass@1.95.0))(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(rollup@2.79.2): dependencies: '@babel/core': 7.28.5 '@babel/generator': 7.28.5 @@ -17219,9 +17303,9 @@ snapshots: '@pivanov/utils': 0.0.2(react-dom@19.2.1(react@19.2.1))(react@19.2.1) '@preact/signals': 1.3.2(preact@10.28.0) '@rollup/pluginutils': 5.3.0(rollup@2.79.2) - '@types/node': 20.19.25 + '@types/node': 20.19.26 bippy: 0.3.34(@types/react@19.2.7)(react@19.2.1) - esbuild: 0.25.0 + esbuild: 0.25.12 estree-walker: 3.0.3 kleur: 4.1.5 mri: 1.2.0 @@ -17231,7 +17315,7 @@ snapshots: react-dom: 19.2.1(react@19.2.1) tsx: 4.21.0 optionalDependencies: - next: 15.5.7(@babel/core@7.28.5)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(sass@1.94.2) + next: 15.5.7(@babel/core@7.28.5)(@playwright/test@1.57.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(sass@1.95.0) unplugin: 2.1.0 transitivePeerDependencies: - '@types/react' @@ -17428,7 +17512,7 @@ snapshots: '@types/katex': 0.16.7 hast-util-from-html-isomorphic: 2.0.0 hast-util-to-text: 4.0.2 - katex: 0.16.25 + katex: 0.16.27 unist-util-visit-parents: 6.0.2 vfile: 6.0.3 @@ -17555,9 +17639,6 @@ snapshots: onetime: 7.0.0 signal-exit: 4.1.0 - rettime@0.7.0: - optional: true - reusify@1.1.0: {} rfdc@1.4.1: {} @@ -17613,14 +17694,14 @@ snapshots: safe-buffer@5.2.1: {} - sass-loader@16.0.6(sass@1.94.2)(webpack@5.103.0(esbuild@0.25.0)(uglify-js@3.19.3)): + sass-loader@16.0.6(sass@1.95.0)(webpack@5.103.0(esbuild@0.25.0)(uglify-js@3.19.3)): dependencies: neo-async: 2.6.2 optionalDependencies: - sass: 1.94.2 + sass: 1.95.0 webpack: 5.103.0(esbuild@0.25.0)(uglify-js@3.19.3) - sass@1.94.2: + sass@1.95.0: dependencies: chokidar: 4.0.3 immutable: 5.1.4 @@ -17836,16 +17917,13 @@ snapshots: state-local@1.0.7: {} - statuses@2.0.2: - optional: true - - storybook@9.1.13(@testing-library/dom@10.4.1)(msw@2.12.4(@types/node@18.15.0)(typescript@5.9.3)): + storybook@9.1.13(@testing-library/dom@10.4.1): dependencies: '@storybook/global': 5.0.0 '@testing-library/jest-dom': 6.9.1 '@testing-library/user-event': 14.6.1(@testing-library/dom@10.4.1) '@vitest/expect': 3.2.4 - '@vitest/mocker': 3.2.4(msw@2.12.4(@types/node@18.15.0)(typescript@5.9.3)) + '@vitest/mocker': 3.2.4 '@vitest/spy': 3.2.4 better-opn: 3.0.2 esbuild: 0.25.0 @@ -18000,9 +18078,6 @@ snapshots: tabbable@6.3.0: {} - tagged-tag@1.0.0: - optional: true - tailwind-merge@2.6.0: {} tailwindcss@3.4.18(tsx@4.21.0)(yaml@2.8.2): @@ -18061,7 +18136,7 @@ snapshots: type-fest: 0.16.0 unique-string: 2.0.0 - terser-webpack-plugin@5.3.14(esbuild@0.25.0)(uglify-js@3.19.3)(webpack@5.103.0(esbuild@0.25.0)(uglify-js@3.19.3)): + terser-webpack-plugin@5.3.15(esbuild@0.25.0)(uglify-js@3.19.3)(webpack@5.103.0(esbuild@0.25.0)(uglify-js@3.19.3)): dependencies: '@jridgewell/trace-mapping': 0.3.31 jest-worker: 27.5.1 @@ -18133,17 +18208,12 @@ snapshots: toggle-selection@1.0.6: {} - toml-eslint-parser@0.10.0: + toml-eslint-parser@0.10.1: dependencies: eslint-visitor-keys: 3.4.3 totalist@3.0.1: {} - tough-cookie@6.0.0: - dependencies: - tldts: 7.0.19 - optional: true - tr46@1.0.1: dependencies: punycode: 2.3.1 @@ -18208,7 +18278,7 @@ snapshots: tsx@4.21.0: dependencies: - esbuild: 0.25.0 + esbuild: 0.25.12 get-tsconfig: 4.13.0 optionalDependencies: fsevents: 2.3.3 @@ -18234,11 +18304,6 @@ snapshots: type-fest@4.2.0: {} - type-fest@5.3.1: - dependencies: - tagged-tag: 1.0.0 - optional: true - typescript@5.9.3: {} ufo@1.6.1: {} @@ -18326,14 +18391,11 @@ snapshots: webpack-virtual-modules: 0.6.2 optional: true - until-async@3.0.2: - optional: true - upath@1.2.0: {} - update-browserslist-db@1.1.4(browserslist@4.28.0): + update-browserslist-db@1.2.2(browserslist@4.28.1): dependencies: - browserslist: 4.28.0 + browserslist: 4.28.1 escalade: 3.2.0 picocolors: 1.1.1 @@ -18534,7 +18596,7 @@ snapshots: '@webassemblyjs/wasm-parser': 1.14.1 acorn: 8.15.0 acorn-import-phases: 1.0.4(acorn@8.15.0) - browserslist: 4.28.0 + browserslist: 4.28.1 chrome-trace-event: 1.0.4 enhanced-resolve: 5.18.3 es-module-lexer: 1.7.0 @@ -18548,7 +18610,7 @@ snapshots: neo-async: 2.6.2 schema-utils: 4.3.3 tapable: 2.3.0 - terser-webpack-plugin: 5.3.14(esbuild@0.25.0)(uglify-js@3.19.3)(webpack@5.103.0(esbuild@0.25.0)(uglify-js@3.19.3)) + terser-webpack-plugin: 5.3.15(esbuild@0.25.0)(uglify-js@3.19.3)(webpack@5.103.0(esbuild@0.25.0)(uglify-js@3.19.3)) watchpack: 2.4.4 webpack-sources: 3.3.3 transitivePeerDependencies: @@ -18695,13 +18757,6 @@ snapshots: '@types/trusted-types': 2.0.7 workbox-core: 6.6.0 - wrap-ansi@6.2.0: - dependencies: - ansi-styles: 4.3.0 - string-width: 4.2.3 - strip-ansi: 6.0.1 - optional: true - wrap-ansi@7.0.0: dependencies: ansi-styles: 4.3.0 @@ -18733,7 +18788,7 @@ snapshots: yallist@3.1.1: {} - yaml-eslint-parser@1.3.1: + yaml-eslint-parser@1.3.2: dependencies: eslint-visitor-keys: 3.4.3 yaml: 2.8.2 @@ -18764,9 +18819,6 @@ snapshots: yocto-queue@1.2.2: {} - yoctocolors-cjs@2.1.3: - optional: true - zen-observable-ts@1.1.0: dependencies: '@types/zen-observable': 0.8.3