From cf206e6220f97fd147f477c06b628ddcd2a7ceb5 Mon Sep 17 00:00:00 2001 From: Alex Christoffer Rasmussen Date: Tue, 24 Mar 2026 09:11:57 +0100 Subject: [PATCH] feat: Vite 8 (#2018) * chore: upgrade vite * fix: inconsistentCjsInterop for ReactQR * chore: e2e tests should use relativve path and get host from playwright config * refactor: drop qr code dependency --------- Co-authored-by: alex-Arc --- apps/client/package.json | 5 +- .../components/qr-code/QrCode.module.scss | 22 + .../src/common/components/qr-code/QrCode.tsx | 43 ++ .../sharing/GenerateLinkForm.module.scss | 6 - .../src/features/sharing/GenerateLinkForm.tsx | 4 +- .../client/src/views/backstage/Backstage.scss | 6 - apps/client/src/views/backstage/Backstage.tsx | 4 +- e2e/tests/000-upload-showfile.spec.ts | 4 +- e2e/tests/002-view-navigation.spec.ts | 18 +- .../features/201-message-control.spec.ts | 4 +- e2e/tests/features/203-delay-block.spec.ts | 8 +- e2e/tests/features/204-editor-crud.spec.ts | 2 +- e2e/tests/features/206-url-preset.spec.ts | 14 +- e2e/tests/features/207-view-params.spec.ts | 2 +- e2e/tests/features/208-auxtimer.spec.ts | 2 +- .../features/209-rundown-shortcuts.spec.ts | 20 +- e2e/tests/features/210-client-remote.spec.ts | 12 +- e2e/tests/features/211-report-data.spec.ts | 4 +- e2e/tests/features/212-time-until.spec.ts | 2 +- .../213-arrange-while-playing.spec.ts | 4 +- .../features/301-spreadsheet-import.spec.ts | 2 +- pnpm-lock.yaml | 489 ++++++++++++++++-- 22 files changed, 560 insertions(+), 117 deletions(-) create mode 100644 apps/client/src/common/components/qr-code/QrCode.module.scss create mode 100644 apps/client/src/common/components/qr-code/QrCode.tsx diff --git a/apps/client/package.json b/apps/client/package.json index f200659e8..5aeacd277 100644 --- a/apps/client/package.json +++ b/apps/client/package.json @@ -19,13 +19,13 @@ "axios": "^1.12.2", "csv-stringify": "^6.6.0", "prismjs": "^1.30.0", + "qrcode": "^1.5.4", "react": "^19.2.3", "react-colorful": "^5.6.1", "react-dom": "^19.2.3", "react-fast-compare": "^3.2.2", "react-hook-form": "^7.62.0", "react-icons": "5.5.0", - "react-qr-code": "^2.0.18", "react-router": "^7.11.0", "react-simple-code-editor": "^0.14.1", "react-virtuoso": "^4.17.0", @@ -59,6 +59,7 @@ "devDependencies": { "@sentry/vite-plugin": "5.1.1", "@types/prismjs": "^1.26.6", + "@types/qrcode": "^1.5.6", "@types/react": "^19.1.12", "@types/react-dom": "^19.1.9", "@vitejs/plugin-react": "5.2.0", @@ -67,7 +68,7 @@ "ontime-utils": "workspace:*", "sass": "^1.57.1", "typescript": "catalog:", - "vite": "7.3.1", + "vite": "8.0.1", "vite-plugin-compression2": "2.5.1", "vite-plugin-prismjs-plus": "1.1.1", "vite-plugin-svgr": "4.5.0", diff --git a/apps/client/src/common/components/qr-code/QrCode.module.scss b/apps/client/src/common/components/qr-code/QrCode.module.scss new file mode 100644 index 000000000..39a30da51 --- /dev/null +++ b/apps/client/src/common/components/qr-code/QrCode.module.scss @@ -0,0 +1,22 @@ +@use '@/theme/viewerDefs' as *; + +.square { + border-radius: $component-border-radius-sm; + background-color: $viewer-color; + display: flex; + align-items: center; + justify-content: center; +} + +.blink { + animation: blink 1s ease-in-out infinite alternate; +} + +@keyframes blink { + 0% { + opacity: 10%; + } + 100% { + opacity: 100%; + } +} diff --git a/apps/client/src/common/components/qr-code/QrCode.tsx b/apps/client/src/common/components/qr-code/QrCode.tsx new file mode 100644 index 000000000..45813ece8 --- /dev/null +++ b/apps/client/src/common/components/qr-code/QrCode.tsx @@ -0,0 +1,43 @@ +import { toString } from 'qrcode'; +import { Suspense, use } from 'react'; + +import { cx } from '../../utils/styleUtils'; + +import style from './QrCode.module.scss'; + +interface QRCodeProps { + value: string; + size: number; +} + +export default function QRCode({ value, size }: QRCodeProps) { + 'use memo'; + const svgPromise = toString(value, { + width: size, + margin: 2, + color: { dark: '#101010', light: '#cfcfcf' }, + }); + + return ( + }> + + + ); +} + +function QrFallback({ size }: { size: number }) { + 'use memo'; + return ; +} + +function QrSvg({ svgPromise, size }: { svgPromise: Promise; size: number }) { + 'use memo'; + const svg = use(svgPromise); + return ( + + ); +} diff --git a/apps/client/src/features/sharing/GenerateLinkForm.module.scss b/apps/client/src/features/sharing/GenerateLinkForm.module.scss index b88daa3a1..5c1d572b6 100644 --- a/apps/client/src/features/sharing/GenerateLinkForm.module.scss +++ b/apps/client/src/features/sharing/GenerateLinkForm.module.scss @@ -1,9 +1,3 @@ -.qrCode { - padding: 0.5rem; - background: $ui-white; - border-radius: 3px; -} - .column { margin-top: 1rem; display: flex; diff --git a/apps/client/src/features/sharing/GenerateLinkForm.tsx b/apps/client/src/features/sharing/GenerateLinkForm.tsx index e0555b773..283694678 100644 --- a/apps/client/src/features/sharing/GenerateLinkForm.tsx +++ b/apps/client/src/features/sharing/GenerateLinkForm.tsx @@ -2,7 +2,6 @@ import { OntimeView, URLPreset } from 'ontime-types'; import { generateId } from 'ontime-utils'; import { useRef, useState } from 'react'; import { FieldErrors, useForm } from 'react-hook-form'; -import QRCode from 'react-qr-code'; import { generateUrl } from '../../common/api/session'; import { maybeAxiosError } from '../../common/api/utils'; @@ -10,6 +9,7 @@ import Button from '../../common/components/buttons/Button'; import CopyTag from '../../common/components/copy-tag/CopyTag'; import Info from '../../common/components/info/Info'; import Input from '../../common/components/input/input/Input'; +import QRCode from '../../common/components/qr-code/QrCode'; import Select from '../../common/components/select/Select'; import Switch from '../../common/components/switch/Switch'; import { useUpdateUrlPreset } from '../../common/hooks-query/useUrlPresets'; @@ -275,7 +275,7 @@ export default function GenerateLinkForm({ hostOptions, pathOptions, presets, is Share this link - +
{url}
diff --git a/apps/client/src/views/backstage/Backstage.scss b/apps/client/src/views/backstage/Backstage.scss index 1aaeb30bb..a02226a16 100644 --- a/apps/client/src/views/backstage/Backstage.scss +++ b/apps/client/src/views/backstage/Backstage.scss @@ -179,12 +179,6 @@ flex: 1; } - &__qr { - padding: 0.5rem; - background-color: $ui-white; - border-radius: 2px; - } - &__img { padding: 0.5rem; border-radius: 2px; diff --git a/apps/client/src/views/backstage/Backstage.tsx b/apps/client/src/views/backstage/Backstage.tsx index 0dd7c35ab..326938b57 100644 --- a/apps/client/src/views/backstage/Backstage.tsx +++ b/apps/client/src/views/backstage/Backstage.tsx @@ -2,9 +2,9 @@ import { useViewportSize } from '@mantine/hooks'; import { OntimeView, ProjectData } from 'ontime-types'; import { millisToString, removeLeadingZero } from 'ontime-utils'; import { useEffect, useMemo, useState } from 'react'; -import QRCode from 'react-qr-code'; import ProgressBar from '../../common/components/progress-bar/ProgressBar'; +import QRCode from '../../common/components/qr-code/QrCode'; import Empty from '../../common/components/state/Empty'; import EmptyPage from '../../common/components/state/EmptyPage'; import TitleCard from '../../common/components/title-card/TitleCard'; @@ -171,7 +171,7 @@ function Backstage({ events, customFields, projectData, isMirrored, settings }:
{extraInfo && }
- {projectData.url && } + {projectData.url && } {projectData.info &&
{projectData.info}
}
diff --git a/e2e/tests/000-upload-showfile.spec.ts b/e2e/tests/000-upload-showfile.spec.ts index ebbdb8201..180280fc4 100644 --- a/e2e/tests/000-upload-showfile.spec.ts +++ b/e2e/tests/000-upload-showfile.spec.ts @@ -7,7 +7,7 @@ const fileToUpload = 'e2e/tests/fixtures/e2e-test-db.json'; const fileToDownload = 'e2e/tests/fixtures/tmp/'; test('project file upload', async ({ page }) => { - await page.goto('http://localhost:4001/editor'); + await page.goto('/editor'); // Try to close welcome modal if it appears (times out silently if not present) try { @@ -47,7 +47,7 @@ test('project file upload', async ({ page }) => { //TODO: this works when testing locally, but not in github actions test.fixme('project file download', async ({ page }) => { - await page.goto('http://localhost:4001/editor/?settings=project__manage'); + await page.goto('/editor/?settings=project__manage'); await page .getByRole('row', { name: /.*currently loaded/i }) diff --git a/e2e/tests/002-view-navigation.spec.ts b/e2e/tests/002-view-navigation.spec.ts index dabf5ac24..e970e162f 100644 --- a/e2e/tests/002-view-navigation.spec.ts +++ b/e2e/tests/002-view-navigation.spec.ts @@ -2,7 +2,7 @@ import { type Page, expect, test } from '@playwright/test'; test.describe('test view navigation feature', () => { test.beforeEach(async ({ page }) => { - await page.goto('http://localhost:4001/'); + await page.goto('/'); await expect(page.locator('data-testid=timer-view')).toBeVisible(); }); @@ -10,51 +10,51 @@ test.describe('test view navigation feature', () => { await openNavigationMenu(page); await page.getByRole('button', { name: 'Timeline' }).click(); page.locator('data-testid=timeline-view'); - await expect(page).toHaveURL('http://localhost:4001/timeline'); + await expect(page).toHaveURL('/timeline'); }); test('Backstage', async ({ page }) => { await openNavigationMenu(page); await page.getByRole('button', { name: 'Backstage' }).click(); page.locator('data-testid=backstage-view'); - await expect(page).toHaveURL('http://localhost:4001/backstage'); + await expect(page).toHaveURL('/backstage'); }); test('Studio Clock', async ({ page }) => { await openNavigationMenu(page); await page.getByRole('button', { name: 'Studio Clock' }).click(); page.locator('data-testid=studio-view'); - await expect(page).toHaveURL('http://localhost:4001/studio'); + await expect(page).toHaveURL('/studio'); }); test('Countdown', async ({ page }) => { await openNavigationMenu(page); await page.getByRole('button', { name: 'Countdown' }).click(); page.locator('data-testid=countdown-view'); - await expect(page).toHaveURL('http://localhost:4001/countdown'); + await expect(page).toHaveURL('/countdown'); }); test('Project Info', async ({ page }) => { await openNavigationMenu(page); await page.getByRole('button', { name: 'Project Info' }).click(); page.locator('data-testid=project-view'); - await expect(page).toHaveURL('http://localhost:4001/info'); + await expect(page).toHaveURL('/info'); }); test('Timer', async ({ page }) => { await openNavigationMenu(page); await page.getByRole('button', { name: 'Timer', exact: true }).click(); page.locator('data-testid=timer-view'); - await expect(page).toHaveURL('http://localhost:4001/timer'); + await expect(page).toHaveURL('/timer'); }); test('not-found', async ({ page }) => { - await page.goto('http://localhost:4001/not-found'); + await page.goto('/not-found'); await expect(page).toHaveTitle(/ontime/); await expect(page.getByRole('heading', { name: 'Not found' })).toBeVisible(); - await page.goto('http://localhost:4001/preset/not-found'); + await page.goto('/preset/not-found'); await expect(page).toHaveTitle(/ontime/); await expect(page.getByRole('heading', { name: 'Not found' })).toBeVisible(); diff --git a/e2e/tests/features/201-message-control.spec.ts b/e2e/tests/features/201-message-control.spec.ts index 90358fef2..2bb033c55 100644 --- a/e2e/tests/features/201-message-control.spec.ts +++ b/e2e/tests/features/201-message-control.spec.ts @@ -4,14 +4,14 @@ test('message control sends messages to screens', async ({ context }) => { const editorPage = await context.newPage(); const featurePage = await context.newPage(); - await editorPage.goto('http://localhost:4001/messagecontrol'); + await editorPage.goto('/messagecontrol'); // stage timer message await editorPage.getByPlaceholder('Message shown fullscreen in stage timer').click(); await editorPage.getByPlaceholder('Message shown fullscreen in stage timer').fill('testing stage'); await editorPage.getByRole('button', { name: /toggle timer message/i }).click({ timeout: 5000 }); - await featurePage.goto('http://localhost:4001/timer'); + await featurePage.goto('/timer'); await featurePage.waitForLoadState('load', { timeout: 5000 }); await expect(featurePage.getByText('testing stage')).toBeVisible(); diff --git a/e2e/tests/features/203-delay-block.spec.ts b/e2e/tests/features/203-delay-block.spec.ts index 530443bcd..a2dfb10ba 100644 --- a/e2e/tests/features/203-delay-block.spec.ts +++ b/e2e/tests/features/203-delay-block.spec.ts @@ -1,7 +1,7 @@ import { expect, test } from '@playwright/test'; test('delays add time to events', async ({ page }) => { - await page.goto('http://localhost:4001/editor'); + await page.goto('/editor'); // delete all events and add a new one await page.getByRole('button', { name: 'Edit' }).click(); @@ -50,7 +50,7 @@ test('delays add time to events', async ({ page }) => { }); test('delays are show correctly', async ({ page }) => { - await page.goto('http://localhost:4001/editor'); + await page.goto('/editor'); // add a test event await page.getByRole('button', { name: 'Edit' }).click(); @@ -81,10 +81,10 @@ test('delays are show correctly', async ({ page }) => { await page.getByText('New start 00:11').click(); // delay is shown in the cuesheet - await page.goto('http://localhost:4001/cuesheet'); + await page.goto('/cuesheet'); await page.getByRole('cell', { name: 'Delayed by 1 min' }).click(); // delay is shown in the backstage view - await page.goto('http://localhost:4001/backstage'); + await page.goto('/backstage'); await page.getByText('00:11→00:21').click(); }); diff --git a/e2e/tests/features/204-editor-crud.spec.ts b/e2e/tests/features/204-editor-crud.spec.ts index be45c6bd8..3ad48290b 100644 --- a/e2e/tests/features/204-editor-crud.spec.ts +++ b/e2e/tests/features/204-editor-crud.spec.ts @@ -1,7 +1,7 @@ import { expect, test } from '@playwright/test'; test('CRUD operations on the rundown', async ({ page }) => { - await page.goto('http://localhost:4001/editor'); + await page.goto('/editor'); await page.getByRole('button', { name: 'Edit' }).click(); await page.getByRole('button', { name: 'Rundown menu' }).click(); diff --git a/e2e/tests/features/206-url-preset.spec.ts b/e2e/tests/features/206-url-preset.spec.ts index a7e2d9165..26284c418 100644 --- a/e2e/tests/features/206-url-preset.spec.ts +++ b/e2e/tests/features/206-url-preset.spec.ts @@ -8,7 +8,7 @@ test.describe('URL Preset', () => { test.beforeAll(async ({ browser }) => { const context = await browser.newContext(); const page = await context.newPage(); - await page.goto('http://localhost:4001/editor'); + await page.goto('/editor'); // Create the preset that will be used by other tests await page.getByRole('button', { name: 'Toggle settings' }).click(); @@ -31,7 +31,7 @@ test.describe('URL Preset', () => { }); test('Unwrapping a preset from a view', async ({ page }) => { - await page.goto('http://localhost:4001/timer'); + await page.goto('/timer'); // 1. the URL points to the view expect(page.url().includes('hideTimerSeconds=true')).not.toBeTruthy(); @@ -52,7 +52,7 @@ test.describe('URL Preset', () => { }); test('Sharing a link to an unwrapped preset', async ({ page }) => { - await page.goto('http://localhost:4001/editor'); + await page.goto('/editor'); // open settings await page.getByRole('button', { name: 'Toggle settings' }).click(); @@ -83,7 +83,7 @@ test.describe('URL Preset', () => { }); test('Sharing a link to a masked preset', async ({ page }) => { - await page.goto('http://localhost:4001/editor'); + await page.goto('/editor'); // open settings await page.getByRole('button', { name: 'Toggle settings' }).click(); @@ -118,7 +118,7 @@ test.describe('Sharing from cuesheet', () => { test.beforeAll(async ({ browser }) => { const context = await browser.newContext(); const page = await context.newPage(); - await page.goto('http://localhost:4001/editor'); + await page.goto('/editor'); // we create some elements to test with await page.getByRole('button', { name: 'Rundown menu' }).click(); @@ -135,7 +135,7 @@ test.describe('Sharing from cuesheet', () => { test('Sharing a link with readonly permissions', async ({ page }, testInfo) => { const alias = `cuesheet-read-test-${testInfo.retry}-${Date.now()}`; - await page.goto('http://localhost:4001/cuesheet'); + await page.goto('/cuesheet'); await expect(page.getByTestId('cuesheet')).toBeVisible(); await page.getByRole('button', { name: 'Share...' }).click(); @@ -189,7 +189,7 @@ test.describe('Sharing from cuesheet', () => { test('Sharing a link with scoped read-write permissions', async ({ page }, testInfo) => { const alias = `cuesheet-scope-test-${testInfo.retry}-${Date.now()}`; - await page.goto('http://localhost:4001/cuesheet'); + await page.goto('/cuesheet'); await expect(page.getByTestId('cuesheet')).toBeVisible(); await page.getByRole('button', { name: 'Share...' }).click(); diff --git a/e2e/tests/features/207-view-params.spec.ts b/e2e/tests/features/207-view-params.spec.ts index 244a24614..8179f6ac3 100644 --- a/e2e/tests/features/207-view-params.spec.ts +++ b/e2e/tests/features/207-view-params.spec.ts @@ -1,7 +1,7 @@ import { expect, test } from '@playwright/test'; test('View params configures timer view', async ({ page }) => { - await page.goto('http://localhost:4001/timer'); + await page.goto('/timer'); await expect(page.getByText('TIME NOW')).toBeInViewport(); diff --git a/e2e/tests/features/208-auxtimer.spec.ts b/e2e/tests/features/208-auxtimer.spec.ts index c830adfbe..022dcf993 100644 --- a/e2e/tests/features/208-auxtimer.spec.ts +++ b/e2e/tests/features/208-auxtimer.spec.ts @@ -1,7 +1,7 @@ import { expect, test } from '@playwright/test'; test('Aux timer buttons', async ({ page }) => { - await page.goto('http://localhost:4001/editor'); + await page.goto('/editor'); await page.getByTestId('time-input-aux1').click(); await page.getByTestId('time-input-aux1').fill('123456'); await page.getByTestId('time-input-aux1').press('Enter'); diff --git a/e2e/tests/features/209-rundown-shortcuts.spec.ts b/e2e/tests/features/209-rundown-shortcuts.spec.ts index c518288a0..a3717f9d2 100644 --- a/e2e/tests/features/209-rundown-shortcuts.spec.ts +++ b/e2e/tests/features/209-rundown-shortcuts.spec.ts @@ -1,7 +1,7 @@ import { expect, test } from '@playwright/test'; test('Copy-paste', async ({ page }) => { - await page.goto('http://localhost:4001/rundown'); + await page.goto('/rundown'); await page.getByRole('button', { name: 'Edit' }).click(); // clear rundown @@ -32,7 +32,7 @@ test('Copy-paste', async ({ page }) => { }); test('Cut-paste', async ({ page }) => { - await page.goto('http://localhost:4001/rundown'); + await page.goto('/rundown'); await page.getByRole('button', { name: 'Edit' }).click(); // clear rundown @@ -64,7 +64,7 @@ test('Cut-paste', async ({ page }) => { }); test('Move', async ({ page }) => { - await page.goto('http://localhost:4001/rundown'); + await page.goto('/rundown'); await page.getByRole('button', { name: 'Edit' }).click(); // clear rundown @@ -102,7 +102,7 @@ test('Move', async ({ page }) => { }); test('Add group', async ({ page }) => { - await page.goto('http://localhost:4001/rundown'); + await page.goto('/rundown'); await page.getByRole('button', { name: 'Edit' }).click(); // clear rundown @@ -137,7 +137,7 @@ test('Add group', async ({ page }) => { }); test('Add delay', async ({ page }) => { - await page.goto('http://localhost:4001/rundown'); + await page.goto('/rundown'); await page.getByRole('button', { name: 'Edit' }).click(); // clear rundown @@ -168,7 +168,7 @@ test('Add delay', async ({ page }) => { }); test('Add event', async ({ page }) => { - await page.goto('http://localhost:4001/rundown'); + await page.goto('/rundown'); await page.getByRole('button', { name: 'Edit' }).click(); // clear rundown @@ -195,11 +195,11 @@ test('Add event', async ({ page }) => { }); test('Delete event', async ({ page }) => { - await page.goto('http://localhost:4001/rundown'); + await page.goto('/rundown'); await page.getByRole('button', { name: 'Edit' }).click(); // clear rundown - await page.goto('http://localhost:4001/rundown'); + await page.goto('/rundown'); await page.getByRole('button', { name: 'Rundown menu' }).click(); await page.getByRole('menuitem', { name: 'Clear all' }).click(); await page.getByRole('button', { name: 'Delete all' }).click(); @@ -218,7 +218,7 @@ test('Delete event', async ({ page }) => { }); test('Find in rundown', async ({ page }) => { - await page.goto('http://localhost:4001/rundown'); + await page.goto('/rundown'); await expect(page.getByTestId('panel-rundown')).toBeVisible(); await page.keyboard.press('ControlOrMeta+f'); @@ -229,7 +229,7 @@ test('Find in rundown', async ({ page }) => { }); test('Open settings', async ({ page }) => { - await page.goto('http://localhost:4001/editor'); + await page.goto('/editor'); await expect(page.getByTestId('editor-container')).toBeVisible(); await page.keyboard.press('ControlOrMeta+,'); diff --git a/e2e/tests/features/210-client-remote.spec.ts b/e2e/tests/features/210-client-remote.spec.ts index cc547d152..3c4ea1855 100644 --- a/e2e/tests/features/210-client-remote.spec.ts +++ b/e2e/tests/features/210-client-remote.spec.ts @@ -4,8 +4,8 @@ test('redirect', async ({ context }) => { const controllerPage = await context.newPage(); const remotePage = await context.newPage(); - await controllerPage.goto('http://localhost:4001/editor?settings=network__clients'); - await remotePage.goto('http://localhost:4001/timer'); + await controllerPage.goto('/editor?settings=network__clients'); + await remotePage.goto('/timer'); await controllerPage.getByTestId('not-self-redirect').click(); await controllerPage.getByRole('textbox', { name: 'http://localhost:' }).click(); @@ -19,8 +19,8 @@ test('identify', async ({ context }) => { const controllerPage = await context.newPage(); const remotePage = await context.newPage(); - await controllerPage.goto('http://localhost:4001/editor?settings=network__clients'); - await remotePage.goto('http://localhost:4001/timer'); + await controllerPage.goto('/editor?settings=network__clients'); + await remotePage.goto('/timer'); await controllerPage.getByTestId('not-self-identify').click(); @@ -31,8 +31,8 @@ test('rename', async ({ context }) => { const controllerPage = await context.newPage(); const remotePage = await context.newPage(); - await controllerPage.goto('http://localhost:4001/editor?settings=network__clients'); - await remotePage.goto('http://localhost:4001/timer'); + await controllerPage.goto('/editor?settings=network__clients'); + await remotePage.goto('/timer'); await controllerPage.getByTestId('not-self-rename').click(); await controllerPage.getByPlaceholder('new name').click(); diff --git a/e2e/tests/features/211-report-data.spec.ts b/e2e/tests/features/211-report-data.spec.ts index e8030f887..c1199d77f 100644 --- a/e2e/tests/features/211-report-data.spec.ts +++ b/e2e/tests/features/211-report-data.spec.ts @@ -1,7 +1,7 @@ import { expect, test } from '@playwright/test'; test('show warning when event crosses midnight', async ({ page }) => { - await page.goto('http://localhost:4001/editor'); + await page.goto('/editor'); await page.getByRole('button', { name: 'Edit' }).click(); @@ -24,7 +24,7 @@ test('show warning when event crosses midnight', async ({ page }) => { }); test('show warning when event starts next day midnight', async ({ page }) => { - await page.goto('http://localhost:4001/editor'); + await page.goto('/editor'); await page.getByRole('button', { name: 'Edit' }).click(); diff --git a/e2e/tests/features/212-time-until.spec.ts b/e2e/tests/features/212-time-until.spec.ts index ed52d52b6..15801c336 100644 --- a/e2e/tests/features/212-time-until.spec.ts +++ b/e2e/tests/features/212-time-until.spec.ts @@ -129,7 +129,7 @@ test('time until absolute', async ({ context }) => { test('time until relative', async ({ context }) => { const editor = await context.newPage(); - editor.goto('http://localhost:4001/editor'); + editor.goto('/editor'); await editor.getByRole('button', { name: 'Edit' }).click(); await editor.getByRole('button', { name: 'Rundown menu' }).click(); diff --git a/e2e/tests/features/213-arrange-while-playing.spec.ts b/e2e/tests/features/213-arrange-while-playing.spec.ts index 58cadf095..1850b2d0c 100644 --- a/e2e/tests/features/213-arrange-while-playing.spec.ts +++ b/e2e/tests/features/213-arrange-while-playing.spec.ts @@ -1,7 +1,7 @@ import { expect, test } from '@playwright/test'; test('Rearrange while playing', async ({ page }) => { - await page.goto('http://localhost:4001/rundown'); + await page.goto('/rundown'); await page.getByRole('button', { name: 'Edit' }).click(); // clear rundown @@ -34,7 +34,7 @@ test('Rearrange while playing', async ({ page }) => { }); test('flag and unflag an event while playing', async ({ page }) => { - await page.goto('http://localhost:4001/editor/'); + await page.goto('/editor/'); await page.getByRole('button', { name: 'Edit' }).click(); await page.getByRole('button', { name: 'Rundown menu' }).click(); diff --git a/e2e/tests/features/301-spreadsheet-import.spec.ts b/e2e/tests/features/301-spreadsheet-import.spec.ts index 5df4d58da..8115a8aed 100644 --- a/e2e/tests/features/301-spreadsheet-import.spec.ts +++ b/e2e/tests/features/301-spreadsheet-import.spec.ts @@ -3,7 +3,7 @@ import { expect, test } from '@playwright/test'; const fileToUpload = 'e2e/tests/fixtures/test-sheet.xlsx'; test('sheet file upload', async ({ page }) => { - await page.goto('http://localhost:4001/editor'); + await page.goto('/editor'); await page.getByRole('button', { name: 'Edit' }).click(); await page.getByRole('button', { name: 'Rundown menu' }).click(); await page.getByRole('menuitem', { name: 'Clear all' }).click(); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 6bdc101e0..a87a2f920 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -103,6 +103,9 @@ importers: prismjs: specifier: ^1.30.0 version: 1.30.0 + qrcode: + specifier: ^1.5.4 + version: 1.5.4 react: specifier: ^19.2.3 version: 19.2.3 @@ -121,9 +124,6 @@ importers: react-icons: specifier: 5.5.0 version: 5.5.0(react@19.2.3) - react-qr-code: - specifier: ^2.0.18 - version: 2.0.18(react@19.2.3) react-router: specifier: ^7.11.0 version: 7.11.0(react-dom@19.2.3(react@19.2.3))(react@19.2.3) @@ -146,6 +146,9 @@ importers: '@types/prismjs': specifier: ^1.26.6 version: 1.26.6 + '@types/qrcode': + specifier: ^1.5.6 + version: 1.5.6 '@types/react': specifier: ^19.1.12 version: 19.1.12 @@ -154,7 +157,7 @@ importers: version: 19.1.9(@types/react@19.1.12) '@vitejs/plugin-react': specifier: 5.2.0 - version: 5.2.0(vite@7.3.1(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.92.0)(tsx@4.20.5)) + version: 5.2.0(vite@8.0.1(@types/node@25.4.0)(esbuild@0.27.4)(jiti@2.6.1)(sass@1.92.0)(tsx@4.20.5)) babel-plugin-react-compiler: specifier: 1.0.0 version: 1.0.0 @@ -171,20 +174,20 @@ importers: specifier: 'catalog:' version: 6.0.0-beta vite: - specifier: 7.3.1 - version: 7.3.1(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.92.0)(tsx@4.20.5) + specifier: 8.0.1 + version: 8.0.1(@types/node@25.4.0)(esbuild@0.27.4)(jiti@2.6.1)(sass@1.92.0)(tsx@4.20.5) vite-plugin-compression2: specifier: 2.5.1 version: 2.5.1(rollup@4.59.0) vite-plugin-prismjs-plus: specifier: 1.1.1 - version: 1.1.1(prismjs@1.30.0)(vite@7.3.1(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.92.0)(tsx@4.20.5)) + version: 1.1.1(prismjs@1.30.0)(vite@8.0.1(@types/node@25.4.0)(esbuild@0.27.4)(jiti@2.6.1)(sass@1.92.0)(tsx@4.20.5)) vite-plugin-svgr: specifier: 4.5.0 - version: 4.5.0(rollup@4.59.0)(typescript@6.0.0-beta)(vite@7.3.1(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.92.0)(tsx@4.20.5)) + version: 4.5.0(rollup@4.59.0)(typescript@6.0.0-beta)(vite@8.0.1(@types/node@25.4.0)(esbuild@0.27.4)(jiti@2.6.1)(sass@1.92.0)(tsx@4.20.5)) vite-tsconfig-paths: specifier: 6.1.1 - version: 6.1.1(typescript@6.0.0-beta)(vite@7.3.1(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.92.0)(tsx@4.20.5)) + version: 6.1.1(typescript@6.0.0-beta)(vite@8.0.1(@types/node@25.4.0)(esbuild@0.27.4)(jiti@2.6.1)(sass@1.92.0)(tsx@4.20.5)) vitest: specifier: 'catalog:' version: 4.0.17(@types/node@25.4.0)(happy-dom@16.8.1)(jiti@2.6.1)(jsdom@21.1.0)(lightningcss@1.32.0)(sass@1.92.0)(tsx@4.20.5) @@ -593,6 +596,15 @@ packages: resolution: {integrity: sha512-Wn9sPYIVFRFl5HmwMJkARCCf7rqK/EurkfQ/rJZ14mHP3iYTjZSIOSVonEAnhWeAXwtw7zOekGRlc6yTtZ0t+g==} engines: {node: '>=16.4'} + '@emnapi/core@1.9.1': + resolution: {integrity: sha512-mukuNALVsoix/w1BJwFzwXBN/dHeejQtuVzcDsfOEsdpCumXb/E9j8w11h5S54tT1xhifGfbbSm/ICrObRb3KA==} + + '@emnapi/runtime@1.9.1': + resolution: {integrity: sha512-VYi5+ZVLhpgK4hQ0TAjiQiZ6ol0oe4mBx7mVv7IflsiEp0OWoVsp/+f9Vc1hOhE0TtkORVrI1GvzyreqpgWtkA==} + + '@emnapi/wasi-threads@1.2.0': + resolution: {integrity: sha512-N10dEJNSsUx41Z6pZsXU8FjPjpBEplgH24sfkmITrBED1/U2Esum9F3lfLrMjKHHjmi557zQn7kR9R+XWXu5Rg==} + '@esbuild/aix-ppc64@0.24.2': resolution: {integrity: sha512-thpVCb/rhxE/BnMLQ7GReQLLN8q9qbHmI55F4489/ByVg2aQaQ6kbcLb6FHkocZzQhxc4gx0sCk0tJkKBFzDhA==} engines: {node: '>=18'} @@ -1126,6 +1138,9 @@ packages: peerDependencies: react: ^18.x || ^19.x + '@napi-rs/wasm-runtime@1.1.1': + resolution: {integrity: sha512-p64ah1M1ld8xjWv3qbvFwHiFVWrq1yFvV4f7w+mzaqiR4IlSgkqhcRdHwsGgomwzBH51sRY4NEowLxnaBjcW/A==} + '@npmcli/agent@3.0.0': resolution: {integrity: sha512-S79NdEgDQd/NGCay6TCoVzXSj74skRZIKJcpJjC5lOq34SZzyI6MqtiiWoiVWoVrTcGjNeC4ipbh1VIHlpfF5Q==} engines: {node: ^18.17.0 || >=20.5.0} @@ -1134,6 +1149,9 @@ packages: resolution: {integrity: sha512-/xGlezI6xfGO9NwuJlnwz/K14qD1kCSAGtacBHnGzeAIuJGazcp45KP5NuyARXoKb7cwulAGWVsbeSxdG/cb0Q==} engines: {node: ^18.17.0 || >=20.5.0} + '@oxc-project/types@0.120.0': + resolution: {integrity: sha512-k1YNu55DuvAip/MGE1FTsIuU3FUCn6v/ujG9V7Nq5Df/kX2CWb13hhwD0lmJGMGqE+bE1MXvv9SZVnMzEXlWcg==} + '@oxfmt/binding-android-arm-eabi@0.35.0': resolution: {integrity: sha512-BaRKlM3DyG81y/xWTsE6gZiv89F/3pHe2BqX2H4JbiB8HNVlWWtplzgATAE5IDSdwChdeuWLDTQzJ92Lglw3ZA==} engines: {node: ^20.19.0 || >=22.12.0} @@ -1483,6 +1501,98 @@ packages: engines: {node: '>=18'} hasBin: true + '@rolldown/binding-android-arm64@1.0.0-rc.10': + resolution: {integrity: sha512-jOHxwXhxmFKuXztiu1ORieJeTbx5vrTkcOkkkn2d35726+iwhrY1w/+nYY/AGgF12thg33qC3R1LMBF5tHTZHg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [android] + + '@rolldown/binding-darwin-arm64@1.0.0-rc.10': + resolution: {integrity: sha512-gED05Teg/vtTZbIJBc4VNMAxAFDUPkuO/rAIyyxZjTj1a1/s6z5TII/5yMGZ0uLRCifEtwUQn8OlYzuYc0m70w==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [darwin] + + '@rolldown/binding-darwin-x64@1.0.0-rc.10': + resolution: {integrity: sha512-rI15NcM1mA48lqrIxVkHfAqcyFLcQwyXWThy+BQ5+mkKKPvSO26ir+ZDp36AgYoYVkqvMcdS8zOE6SeBsR9e8A==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [darwin] + + '@rolldown/binding-freebsd-x64@1.0.0-rc.10': + resolution: {integrity: sha512-XZRXHdTa+4ME1MuDVp021+doQ+z6Ei4CCFmNc5/sKbqb8YmkiJdj8QKlV3rCI0AJtAeSB5n0WGPuJWNL9p/L2w==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [freebsd] + + '@rolldown/binding-linux-arm-gnueabihf@1.0.0-rc.10': + resolution: {integrity: sha512-R0SQMRluISSLzFE20sPWYHVmJdDQnRyc/FzSCN72BqQmh2SOZUFG+N3/vBZpR4C6WpEUVYJLrYUXaj43sJsNLA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [linux] + + '@rolldown/binding-linux-arm64-gnu@1.0.0-rc.10': + resolution: {integrity: sha512-Y1reMrV/o+cwpduYhJuOE3OMKx32RMYCidf14y+HssARRmhDuWXJ4yVguDg2R/8SyyGNo+auzz64LnPK9Hq6jg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + + '@rolldown/binding-linux-arm64-musl@1.0.0-rc.10': + resolution: {integrity: sha512-vELN+HNb2IzuzSBUOD4NHmP9yrGwl1DVM29wlQvx1OLSclL0NgVWnVDKl/8tEks79EFek/kebQKnNJkIAA4W2g==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + + '@rolldown/binding-linux-ppc64-gnu@1.0.0-rc.10': + resolution: {integrity: sha512-ZqrufYTgzxbHwpqOjzSsb0UV/aV2TFIY5rP8HdsiPTv/CuAgCRjM6s9cYFwQ4CNH+hf9Y4erHW1GjZuZ7WoI7w==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [ppc64] + os: [linux] + + '@rolldown/binding-linux-s390x-gnu@1.0.0-rc.10': + resolution: {integrity: sha512-gSlmVS1FZJSRicA6IyjoRoKAFK7IIHBs7xJuHRSmjImqk3mPPWbR7RhbnfH2G6bcmMEllCt2vQ/7u9e6bBnByg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [s390x] + os: [linux] + + '@rolldown/binding-linux-x64-gnu@1.0.0-rc.10': + resolution: {integrity: sha512-eOCKUpluKgfObT2pHjztnaWEIbUabWzk3qPZ5PuacuPmr4+JtQG4k2vGTY0H15edaTnicgU428XW/IH6AimcQw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + + '@rolldown/binding-linux-x64-musl@1.0.0-rc.10': + resolution: {integrity: sha512-Xdf2jQbfQowJnLcgYfD/m0Uu0Qj5OdxKallD78/IPPfzaiaI4KRAwZzHcKQ4ig1gtg1SuzC7jovNiM2TzQsBXA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + + '@rolldown/binding-openharmony-arm64@1.0.0-rc.10': + resolution: {integrity: sha512-o1hYe8hLi1EY6jgPFyxQgQ1wcycX+qz8eEbVmot2hFkgUzPxy9+kF0u0NIQBeDq+Mko47AkaFFaChcvZa9UX9Q==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [openharmony] + + '@rolldown/binding-wasm32-wasi@1.0.0-rc.10': + resolution: {integrity: sha512-Ugv9o7qYJudqQO5Y5y2N2SOo6S4WiqiNOpuQyoPInnhVzCY+wi/GHltcLHypG9DEUYMB0iTB/huJrpadiAcNcA==} + engines: {node: '>=14.0.0'} + cpu: [wasm32] + + '@rolldown/binding-win32-arm64-msvc@1.0.0-rc.10': + resolution: {integrity: sha512-7UODQb4fQUNT/vmgDZBl3XOBAIOutP5R3O/rkxg0aLfEGQ4opbCgU5vOw/scPe4xOqBwL9fw7/RP1vAMZ6QlAQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [win32] + + '@rolldown/binding-win32-x64-msvc@1.0.0-rc.10': + resolution: {integrity: sha512-PYxKHMVHOb5NJuDL53vBUl1VwUjymDcYI6rzpIni0C9+9mTiJedvUxSk7/RPp7OOAm3v+EjgMu9bIy3N6b408w==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [win32] + + '@rolldown/pluginutils@1.0.0-rc.10': + resolution: {integrity: sha512-UkVDEFk1w3mveXeKgaTuYfKWtPbvgck1dT8TUG3bnccrH0XtLTuAyfCoks4Q/M5ZGToSVJTIQYCzy2g/atAOeg==} + '@rolldown/pluginutils@1.0.0-rc.3': resolution: {integrity: sha512-eybk3TjzzzV97Dlj5c+XrBFW57eTNhzod66y9HrBlzJ6NsCrWCp/2kaPS3K9wJmurBC0Tdw4yPjXKZqlznim3Q==} @@ -1923,6 +2033,7 @@ packages: '@table-nav/core@0.0.7': resolution: {integrity: sha512-pCh18jHDRe3tw9sJZXfKi4cSD6VjHbn40CYdqhp5X91SIX7rakDEQAsTx6F7Fv9TUv265l+5rUDcYNaJ0N0cqQ==} + deprecated: Bad workplace dependencies '@table-nav/react@0.0.7': resolution: {integrity: sha512-S+DsD/qDqp50Z4dqt5tZFMWA3sRu0OOT/grMQuq/z/52jPEKJB+b9t+YSH8Ms55vCJOJ0DxuYldJpYrJLMG5ew==} @@ -1961,6 +2072,9 @@ packages: resolution: {integrity: sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==} engines: {node: '>= 10'} + '@tybys/wasm-util@0.10.1': + resolution: {integrity: sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==} + '@types/babel__core@7.20.5': resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} @@ -2044,6 +2158,9 @@ packages: '@types/prismjs@1.26.6': resolution: {integrity: sha512-vqlvI7qlMvcCBbVe0AKAb4f97//Hy0EBTaiW8AalRnG/xAN5zOiWWyrNqNXeq8+KAuvRewjCVY1+IPxk4RdNYw==} + '@types/qrcode@1.5.6': + resolution: {integrity: sha512-te7NQcV2BOvdj2b1hCAHzAoMNuj65kNBMz0KBaxM6c3VGBOhU0dURQKOtH8CFNI/dsKkwlv32p26qYQTWoB5bw==} + '@types/qs@6.9.7': resolution: {integrity: sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==} @@ -2383,6 +2500,10 @@ packages: resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} engines: {node: '>=6'} + camelcase@5.3.1: + resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} + engines: {node: '>=6'} + camelcase@6.3.0: resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} engines: {node: '>=10'} @@ -2441,6 +2562,9 @@ packages: resolution: {integrity: sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==} engines: {node: '>=8'} + cliui@6.0.0: + resolution: {integrity: sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==} + cliui@8.0.1: resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} engines: {node: '>=12'} @@ -2612,6 +2736,10 @@ packages: supports-color: optional: true + decamelize@1.2.0: + resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} + engines: {node: '>=0.10.0'} + decimal.js@10.6.0: resolution: {integrity: sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==} @@ -2658,6 +2786,9 @@ packages: detect-node@2.1.0: resolution: {integrity: sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==} + dijkstrajs@1.0.3: + resolution: {integrity: sha512-qiSlmBq9+BCdCA/L46dw8Uy93mloxsPSbwnm5yrKn2vMPiy8KyAskTF6zuV/j5BMsmOGZDPs7KjU+mjb670kfA==} + dir-compare@3.3.0: resolution: {integrity: sha512-J7/et3WlGUCxjdnD3HAAzQ6nsnc0WL6DD7WcwJb7c39iH1+AWfg+9OqzJNaI6PkBwBvm1mhZNL9iY/nRiZXlPg==} @@ -2917,6 +3048,10 @@ packages: resolution: {integrity: sha512-/t88Ty3d5JWQbWYgaOGCCYfXRwV1+be02WqYYlL6h0lEiUAMPM8o8qKGO01YIkOHzka2up08wvgYD0mDiI+q3Q==} engines: {node: '>= 0.8'} + find-up@4.1.0: + resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} + engines: {node: '>=8'} + find-up@5.0.0: resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} engines: {node: '>=10'} @@ -3429,6 +3564,10 @@ packages: resolution: {integrity: sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + locate-path@5.0.0: + resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} + engines: {node: '>=8'} + locate-path@6.0.0: resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} engines: {node: '>=10'} @@ -3461,10 +3600,6 @@ packages: resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} engines: {node: '>=10'} - loose-envify@1.4.0: - resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} - hasBin: true - lowdb@7.0.1: resolution: {integrity: sha512-neJAj8GwF0e8EpycYIDFqEPcx9Qz4GUho20jWFR7YiFeXzF1YMLdxB36PypcTSPMA+4+LvgyMacYhlr18Zlymw==} engines: {node: '>=18'} @@ -3772,10 +3907,18 @@ packages: resolution: {integrity: sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==} engines: {node: '>=8'} + p-limit@2.3.0: + resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} + engines: {node: '>=6'} + p-limit@3.1.0: resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} engines: {node: '>=10'} + p-locate@4.1.0: + resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} + engines: {node: '>=8'} + p-locate@5.0.0: resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} engines: {node: '>=10'} @@ -3784,6 +3927,10 @@ packages: resolution: {integrity: sha512-tkAQEw8ysMzmkhgw8k+1U/iPhWNhykKnSk4Rd5zLoPJCuJaGRPo6YposrZgaxHKzDHdDWWZvE/Sk7hsL2X/CpQ==} engines: {node: '>=18'} + p-try@2.2.0: + resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} + engines: {node: '>=6'} + package-json-from-dist@1.0.1: resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} @@ -3883,6 +4030,10 @@ packages: resolution: {integrity: sha512-uysumyrvkUX0rX/dEVqt8gC3sTBzd4zoWfLeS29nb53imdaXVvLINYXTI2GNqzaMuvacNx4uJQ8+b3zXR0pkgQ==} engines: {node: '>=10.4.0'} + pngjs@5.0.0: + resolution: {integrity: sha512-40QW5YalBNfQo5yRYmiw7Yz6TKKVr3h6970B2YE+3fQpsWcrbj1PzJgxeJ19DRQjhMbKPIuMY8rFaXc8moolVw==} + engines: {node: '>=10.13.0'} + postcss-load-config@6.0.1: resolution: {integrity: sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g==} engines: {node: '>= 18'} @@ -3924,9 +4075,6 @@ packages: resolution: {integrity: sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==} engines: {node: '>=10'} - prop-types@15.8.1: - resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} - proper-lockfile@4.1.2: resolution: {integrity: sha512-TjNPblN4BwAWMXU8s9AEz4JmQxnD1NNL7bNOY/AKUzyamc379FWASUhc/K1pL2noVb+XmZKLL68cjzLsiOAMaA==} @@ -3947,8 +4095,10 @@ packages: resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} engines: {node: '>=6'} - qr.js@0.0.0: - resolution: {integrity: sha512-c4iYnWb+k2E+vYpRimHqSu575b1/wKl4XFeJGpFmrJQz5I88v9aY2czh7s0w36srfCM1sXgC/xpoJz5dJfq+OQ==} + qrcode@1.5.4: + resolution: {integrity: sha512-1ca71Zgiu6ORjHqFBDpnSMTR2ReToX4l1Au1VFLyVeBTFavzQnv5JxMFr3ukHVKpSrSA2MCk0lNJSykjUfz7Zg==} + engines: {node: '>=10.13.0'} + hasBin: true qs@6.11.0: resolution: {integrity: sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==} @@ -4001,11 +4151,6 @@ packages: react-is@16.13.1: resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} - react-qr-code@2.0.18: - resolution: {integrity: sha512-v1Jqz7urLMhkO6jkgJuBYhnqvXagzceg3qJUWayuCK/c6LTIonpWbwxR1f1APGd4xrW/QcQEovNrAojbUz65Tg==} - peerDependencies: - react: '*' - react-refresh@0.18.0: resolution: {integrity: sha512-QgT5//D3jfjJb6Gsjxv0Slpj23ip+HtOpnNgnb2S5zU3CB26G/IDPGoy4RJB42wzFE46DRsstbW6tKHoKbhAxw==} engines: {node: '>=0.10.0'} @@ -4066,6 +4211,9 @@ packages: resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} engines: {node: '>=0.10.0'} + require-main-filename@2.0.0: + resolution: {integrity: sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==} + requires-port@1.0.0: resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} @@ -4115,6 +4263,11 @@ packages: resolution: {integrity: sha512-CHhPh+UNHD2GTXNYhPWLnU8ONHdI+5DI+4EYIAOaiD63rHeYlZvyh8P+in5999TTSFgUYuKUAjzRI4mdh/p+2A==} engines: {node: '>=8.0'} + rolldown@1.0.0-rc.10: + resolution: {integrity: sha512-q7j6vvarRFmKpgJUT8HCAUljkgzEp4LAhPlJUvQhA5LA1SUL36s5QCysMutErzL3EbNOZOkoziSx9iZC4FddKA==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + rollup@4.41.1: resolution: {integrity: sha512-cPmwD3FnFv8rKMBc1MxWCwVQFxwf1JEmSX3iQXrRVVG15zerAIXRjMFVWnd5Q5QvgKF7Aj+5ykXFhUl+QGnyOw==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} @@ -4196,6 +4349,9 @@ packages: server-timing@3.3.3: resolution: {integrity: sha512-TP0xWAca4oM8H/PSdeaGgp2qm+HrZ2cWCRcMXS2t500a7Wum/hSojlpTW43VZsIUSVNlKPFGDknH34IqF+mbBg==} + set-blocking@2.0.0: + resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} + set-cookie-parser@2.7.1: resolution: {integrity: sha512-IOc8uWeOZgnb3ptbCURJWNjWUPcO3ZnTTdzsurqERrP6nPyv+paC55vJM0LpOlT2ne+Ix+9+CRG1MNLlyZ4GjQ==} @@ -4698,6 +4854,49 @@ packages: yaml: optional: true + vite@8.0.1: + resolution: {integrity: sha512-wt+Z2qIhfFt85uiyRt5LPU4oVEJBXj8hZNWKeqFG4gRG/0RaRGJ7njQCwzFVjO+v4+Ipmf5CY7VdmZRAYYBPHw==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + peerDependencies: + '@types/node': ^20.19.0 || >=22.12.0 + '@vitejs/devtools': ^0.1.0 + esbuild: ^0.27.0 + jiti: '>=1.21.0' + less: ^4.0.0 + sass: ^1.70.0 + sass-embedded: ^1.70.0 + stylus: '>=0.54.8' + sugarss: ^5.0.0 + terser: ^5.16.0 + tsx: ^4.8.1 + yaml: ^2.4.2 + peerDependenciesMeta: + '@types/node': + optional: true + '@vitejs/devtools': + optional: true + esbuild: + optional: true + jiti: + optional: true + less: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + tsx: + optional: true + yaml: + optional: true + vitest@4.0.17: resolution: {integrity: sha512-FQMeF0DJdWY0iOnbv466n/0BudNdKj1l5jYgl5JVTwjSsZSlqyXFt/9+1sEyhR6CLowbZpV7O1sCHrzBhucKKg==} engines: {node: ^20.0.0 || ^22.0.0 || >=24.0.0} @@ -4776,6 +4975,9 @@ packages: whatwg-url@7.1.0: resolution: {integrity: sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==} + which-module@2.0.1: + resolution: {integrity: sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==} + which@2.0.2: resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} engines: {node: '>= 8'} @@ -4799,6 +5001,10 @@ packages: resolution: {integrity: sha512-OELeY0Q61OXpdUfTp+oweA/vtLVg5VDOXh+3he3PNzLGG/y0oylSOC1xRVj0+l4vQ3tj/bB1HVHv1ocXkQceFA==} engines: {node: '>=0.8'} + 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'} @@ -4850,6 +5056,9 @@ packages: xmlchars@2.2.0: resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==} + y18n@4.0.3: + resolution: {integrity: sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==} + y18n@5.0.8: resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} engines: {node: '>=10'} @@ -4864,10 +5073,18 @@ packages: resolution: {integrity: sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==} engines: {node: '>=18'} + yargs-parser@18.1.3: + resolution: {integrity: sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==} + engines: {node: '>=6'} + yargs-parser@21.1.1: resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} engines: {node: '>=12'} + yargs@15.4.1: + resolution: {integrity: sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==} + engines: {node: '>=8'} + yargs@17.7.2: resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} engines: {node: '>=12'} @@ -5293,6 +5510,22 @@ snapshots: transitivePeerDependencies: - supports-color + '@emnapi/core@1.9.1': + dependencies: + '@emnapi/wasi-threads': 1.2.0 + tslib: 2.6.2 + optional: true + + '@emnapi/runtime@1.9.1': + dependencies: + tslib: 2.6.2 + optional: true + + '@emnapi/wasi-threads@1.2.0': + dependencies: + tslib: 2.6.2 + optional: true + '@esbuild/aix-ppc64@0.24.2': optional: true @@ -5612,6 +5845,13 @@ snapshots: dependencies: react: 19.2.3 + '@napi-rs/wasm-runtime@1.1.1': + dependencies: + '@emnapi/core': 1.9.1 + '@emnapi/runtime': 1.9.1 + '@tybys/wasm-util': 0.10.1 + optional: true + '@npmcli/agent@3.0.0': dependencies: agent-base: 7.1.4 @@ -5626,6 +5866,8 @@ snapshots: dependencies: semver: 7.7.4 + '@oxc-project/types@0.120.0': {} + '@oxfmt/binding-android-arm-eabi@0.35.0': optional: true @@ -5826,6 +6068,55 @@ snapshots: dependencies: playwright: 1.55.0 + '@rolldown/binding-android-arm64@1.0.0-rc.10': + optional: true + + '@rolldown/binding-darwin-arm64@1.0.0-rc.10': + optional: true + + '@rolldown/binding-darwin-x64@1.0.0-rc.10': + optional: true + + '@rolldown/binding-freebsd-x64@1.0.0-rc.10': + optional: true + + '@rolldown/binding-linux-arm-gnueabihf@1.0.0-rc.10': + optional: true + + '@rolldown/binding-linux-arm64-gnu@1.0.0-rc.10': + optional: true + + '@rolldown/binding-linux-arm64-musl@1.0.0-rc.10': + optional: true + + '@rolldown/binding-linux-ppc64-gnu@1.0.0-rc.10': + optional: true + + '@rolldown/binding-linux-s390x-gnu@1.0.0-rc.10': + optional: true + + '@rolldown/binding-linux-x64-gnu@1.0.0-rc.10': + optional: true + + '@rolldown/binding-linux-x64-musl@1.0.0-rc.10': + optional: true + + '@rolldown/binding-openharmony-arm64@1.0.0-rc.10': + optional: true + + '@rolldown/binding-wasm32-wasi@1.0.0-rc.10': + dependencies: + '@napi-rs/wasm-runtime': 1.1.1 + optional: true + + '@rolldown/binding-win32-arm64-msvc@1.0.0-rc.10': + optional: true + + '@rolldown/binding-win32-x64-msvc@1.0.0-rc.10': + optional: true + + '@rolldown/pluginutils@1.0.0-rc.10': {} + '@rolldown/pluginutils@1.0.0-rc.3': {} '@rollup/pluginutils@5.1.4(rollup@4.59.0)': @@ -6210,6 +6501,11 @@ snapshots: '@tootallnate/once@2.0.0': {} + '@tybys/wasm-util@0.10.1': + dependencies: + tslib: 2.6.2 + optional: true + '@types/babel__core@7.20.5': dependencies: '@babel/parser': 7.28.3 @@ -6290,7 +6586,7 @@ snapshots: '@types/keyv@3.1.4': dependencies: - '@types/node': 22.15.26 + '@types/node': 25.4.0 '@types/mime@1.3.5': {} @@ -6318,6 +6614,10 @@ snapshots: '@types/prismjs@1.26.6': {} + '@types/qrcode@1.5.6': + dependencies: + '@types/node': 25.4.0 + '@types/qs@6.9.7': {} '@types/range-parser@1.2.4': {} @@ -6360,7 +6660,7 @@ snapshots: '@types/node': 22.15.26 optional: true - '@vitejs/plugin-react@5.2.0(vite@7.3.1(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.92.0)(tsx@4.20.5))': + '@vitejs/plugin-react@5.2.0(vite@8.0.1(@types/node@25.4.0)(esbuild@0.27.4)(jiti@2.6.1)(sass@1.92.0)(tsx@4.20.5))': dependencies: '@babel/core': 7.29.0 '@babel/plugin-transform-react-jsx-self': 7.27.1(@babel/core@7.29.0) @@ -6368,7 +6668,7 @@ snapshots: '@rolldown/pluginutils': 1.0.0-rc.3 '@types/babel__core': 7.20.5 react-refresh: 0.18.0 - vite: 7.3.1(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.92.0)(tsx@4.20.5) + vite: 8.0.1(@types/node@25.4.0)(esbuild@0.27.4)(jiti@2.6.1)(sass@1.92.0)(tsx@4.20.5) transitivePeerDependencies: - supports-color @@ -6823,6 +7123,8 @@ snapshots: callsites@3.1.0: {} + camelcase@5.3.1: {} + camelcase@6.3.0: {} caniuse-lite@1.0.30001720: {} @@ -6867,6 +7169,12 @@ snapshots: string-width: 4.2.3 optional: true + cliui@6.0.0: + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 6.2.0 + cliui@8.0.1: dependencies: string-width: 4.2.3 @@ -7020,6 +7328,8 @@ snapshots: dependencies: ms: 2.1.3 + decamelize@1.2.0: {} + decimal.js@10.6.0: optional: true @@ -7061,6 +7371,8 @@ snapshots: detect-node@2.1.0: optional: true + dijkstrajs@1.0.3: {} + dir-compare@3.3.0: dependencies: buffer-equal: 1.0.1 @@ -7463,6 +7775,11 @@ snapshots: transitivePeerDependencies: - supports-color + find-up@4.1.0: + dependencies: + locate-path: 5.0.0 + path-exists: 4.0.0 + find-up@5.0.0: dependencies: locate-path: 6.0.0 @@ -8037,7 +8354,6 @@ snapshots: lightningcss-linux-x64-musl: 1.32.0 lightningcss-win32-arm64-msvc: 1.32.0 lightningcss-win32-x64-msvc: 1.32.0 - optional: true lilconfig@3.1.3: {} @@ -8045,6 +8361,10 @@ snapshots: load-tsconfig@0.2.5: {} + locate-path@5.0.0: + dependencies: + p-locate: 4.1.0 + locate-path@6.0.0: dependencies: p-locate: 5.0.0 @@ -8070,10 +8390,6 @@ snapshots: chalk: 4.1.2 is-unicode-supported: 0.1.0 - loose-envify@1.4.0: - dependencies: - js-tokens: 4.0.0 - lowdb@7.0.1: dependencies: steno: 4.0.2 @@ -8410,16 +8726,26 @@ snapshots: p-cancelable@2.1.1: {} + p-limit@2.3.0: + dependencies: + p-try: 2.2.0 + p-limit@3.1.0: dependencies: yocto-queue: 0.1.0 + p-locate@4.1.0: + dependencies: + p-limit: 2.3.0 + p-locate@5.0.0: dependencies: p-limit: 3.1.0 p-map@7.0.4: {} + p-try@2.2.0: {} + package-json-from-dist@1.0.1: {} parent-module@1.0.1: @@ -8504,6 +8830,8 @@ snapshots: base64-js: 1.5.1 xmlbuilder: 15.1.1 + pngjs@5.0.0: {} + postcss-load-config@6.0.1(jiti@2.6.1)(postcss@8.5.8)(tsx@4.20.5): dependencies: lilconfig: 3.1.3 @@ -8531,12 +8859,6 @@ snapshots: err-code: 2.0.3 retry: 0.12.0 - prop-types@15.8.1: - dependencies: - loose-envify: 1.4.0 - object-assign: 4.1.1 - react-is: 16.13.1 - proper-lockfile@4.1.2: dependencies: graceful-fs: 4.2.11 @@ -8562,7 +8884,11 @@ snapshots: punycode@2.3.1: {} - qr.js@0.0.0: {} + qrcode@1.5.4: + dependencies: + dijkstrajs: 1.0.3 + pngjs: 5.0.0 + yargs: 15.4.1 qs@6.11.0: dependencies: @@ -8608,12 +8934,6 @@ snapshots: react-is@16.13.1: {} - react-qr-code@2.0.18(react@19.2.3): - dependencies: - prop-types: 15.8.1 - qr.js: 0.0.0 - react: 19.2.3 - react-refresh@0.18.0: {} react-router@7.11.0(react-dom@19.2.3(react@19.2.3))(react@19.2.3): @@ -8679,6 +8999,8 @@ snapshots: require-directory@2.1.1: {} + require-main-filename@2.0.0: {} + requires-port@1.0.0: optional: true @@ -8728,6 +9050,27 @@ snapshots: sprintf-js: 1.1.3 optional: true + rolldown@1.0.0-rc.10: + dependencies: + '@oxc-project/types': 0.120.0 + '@rolldown/pluginutils': 1.0.0-rc.10 + optionalDependencies: + '@rolldown/binding-android-arm64': 1.0.0-rc.10 + '@rolldown/binding-darwin-arm64': 1.0.0-rc.10 + '@rolldown/binding-darwin-x64': 1.0.0-rc.10 + '@rolldown/binding-freebsd-x64': 1.0.0-rc.10 + '@rolldown/binding-linux-arm-gnueabihf': 1.0.0-rc.10 + '@rolldown/binding-linux-arm64-gnu': 1.0.0-rc.10 + '@rolldown/binding-linux-arm64-musl': 1.0.0-rc.10 + '@rolldown/binding-linux-ppc64-gnu': 1.0.0-rc.10 + '@rolldown/binding-linux-s390x-gnu': 1.0.0-rc.10 + '@rolldown/binding-linux-x64-gnu': 1.0.0-rc.10 + '@rolldown/binding-linux-x64-musl': 1.0.0-rc.10 + '@rolldown/binding-openharmony-arm64': 1.0.0-rc.10 + '@rolldown/binding-wasm32-wasi': 1.0.0-rc.10 + '@rolldown/binding-win32-arm64-msvc': 1.0.0-rc.10 + '@rolldown/binding-win32-x64-msvc': 1.0.0-rc.10 + rollup@4.41.1: dependencies: '@types/estree': 1.0.7 @@ -8873,6 +9216,8 @@ snapshots: minimist: 1.2.8 on-headers: 1.0.2 + set-blocking@2.0.0: {} + set-cookie-parser@2.7.1: {} setprototypeof@1.2.0: {} @@ -9317,28 +9662,28 @@ snapshots: transitivePeerDependencies: - rollup - vite-plugin-prismjs-plus@1.1.1(prismjs@1.30.0)(vite@7.3.1(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.92.0)(tsx@4.20.5)): + vite-plugin-prismjs-plus@1.1.1(prismjs@1.30.0)(vite@8.0.1(@types/node@25.4.0)(esbuild@0.27.4)(jiti@2.6.1)(sass@1.92.0)(tsx@4.20.5)): dependencies: prismjs: 1.30.0 - vite: 7.3.1(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.92.0)(tsx@4.20.5) + vite: 8.0.1(@types/node@25.4.0)(esbuild@0.27.4)(jiti@2.6.1)(sass@1.92.0)(tsx@4.20.5) - vite-plugin-svgr@4.5.0(rollup@4.59.0)(typescript@6.0.0-beta)(vite@7.3.1(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.92.0)(tsx@4.20.5)): + vite-plugin-svgr@4.5.0(rollup@4.59.0)(typescript@6.0.0-beta)(vite@8.0.1(@types/node@25.4.0)(esbuild@0.27.4)(jiti@2.6.1)(sass@1.92.0)(tsx@4.20.5)): dependencies: '@rollup/pluginutils': 5.3.0(rollup@4.59.0) '@svgr/core': 8.1.0(typescript@6.0.0-beta) '@svgr/plugin-jsx': 8.1.0(@svgr/core@8.1.0(typescript@6.0.0-beta)) - vite: 7.3.1(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.92.0)(tsx@4.20.5) + vite: 8.0.1(@types/node@25.4.0)(esbuild@0.27.4)(jiti@2.6.1)(sass@1.92.0)(tsx@4.20.5) transitivePeerDependencies: - rollup - supports-color - typescript - vite-tsconfig-paths@6.1.1(typescript@6.0.0-beta)(vite@7.3.1(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.92.0)(tsx@4.20.5)): + vite-tsconfig-paths@6.1.1(typescript@6.0.0-beta)(vite@8.0.1(@types/node@25.4.0)(esbuild@0.27.4)(jiti@2.6.1)(sass@1.92.0)(tsx@4.20.5)): dependencies: debug: 4.4.3 globrex: 0.1.2 tsconfck: 3.1.6(typescript@6.0.0-beta) - vite: 7.3.1(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.92.0)(tsx@4.20.5) + vite: 8.0.1(@types/node@25.4.0)(esbuild@0.27.4)(jiti@2.6.1)(sass@1.92.0)(tsx@4.20.5) transitivePeerDependencies: - supports-color - typescript @@ -9375,6 +9720,21 @@ snapshots: sass: 1.92.0 tsx: 4.20.5 + vite@8.0.1(@types/node@25.4.0)(esbuild@0.27.4)(jiti@2.6.1)(sass@1.92.0)(tsx@4.20.5): + dependencies: + lightningcss: 1.32.0 + picomatch: 4.0.3 + postcss: 8.5.8 + rolldown: 1.0.0-rc.10 + tinyglobby: 0.2.15 + optionalDependencies: + '@types/node': 25.4.0 + esbuild: 0.27.4 + fsevents: 2.3.3 + jiti: 2.6.1 + sass: 1.92.0 + tsx: 4.20.5 + vitest@4.0.17(@types/node@22.15.26)(happy-dom@16.8.1)(jiti@2.6.1)(jsdom@21.1.0)(lightningcss@1.32.0)(sass@1.92.0)(tsx@4.20.5): dependencies: '@vitest/expect': 4.0.17 @@ -9506,6 +9866,8 @@ snapshots: tr46: 1.0.1 webidl-conversions: 4.0.2 + which-module@2.0.1: {} + which@2.0.2: dependencies: isexe: 2.0.0 @@ -9523,6 +9885,12 @@ snapshots: word@0.3.0: {} + wrap-ansi@6.2.0: + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi@7.0.0: dependencies: ansi-styles: 4.3.0 @@ -9560,6 +9928,8 @@ snapshots: xmlchars@2.2.0: optional: true + y18n@4.0.3: {} + y18n@5.0.8: {} yallist@3.1.1: {} @@ -9568,8 +9938,27 @@ snapshots: yallist@5.0.0: {} + yargs-parser@18.1.3: + dependencies: + camelcase: 5.3.1 + decamelize: 1.2.0 + yargs-parser@21.1.1: {} + yargs@15.4.1: + dependencies: + cliui: 6.0.0 + decamelize: 1.2.0 + find-up: 4.1.0 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + require-main-filename: 2.0.0 + set-blocking: 2.0.0 + string-width: 4.2.3 + which-module: 2.0.1 + y18n: 4.0.3 + yargs-parser: 18.1.3 + yargs@17.7.2: dependencies: cliui: 8.0.1