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 <omnivox@LAPTOP-RC5SNBVV.localdomain>
This commit is contained in:
Alex Christoffer Rasmussen
2026-03-24 09:11:57 +01:00
committed by GitHub
parent 4662cc8a26
commit cf206e6220
22 changed files with 560 additions and 117 deletions
+3 -2
View File
@@ -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",
@@ -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%;
}
}
@@ -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 (
<Suspense fallback={<QrFallback size={size} />}>
<QrSvg svgPromise={svgPromise} size={size} />
</Suspense>
);
}
function QrFallback({ size }: { size: number }) {
'use memo';
return <span style={{ width: size + 2, height: size + 2 }} className={cx([style.blink, style.square])} />;
}
function QrSvg({ svgPromise, size }: { svgPromise: Promise<string>; size: number }) {
'use memo';
const svg = use(svgPromise);
return (
<span
className={style.square}
style={{ width: size + 2, height: size + 2 }}
dangerouslySetInnerHTML={{ __html: svg }}
/>
);
}
@@ -1,9 +1,3 @@
.qrCode {
padding: 0.5rem;
background: $ui-white;
border-radius: 3px;
}
.column {
margin-top: 1rem;
display: flex;
@@ -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
</div>
<Panel.Section className={style.column}>
<Panel.Description>Share this link</Panel.Description>
<QRCode size={172} value={url} className={style.qrCode} />
<QRCode size={172} value={url} />
<div className={style.copiableLink} data-testid='copy-link'>
{url}
</div>
@@ -179,12 +179,6 @@
flex: 1;
}
&__qr {
padding: 0.5rem;
background-color: $ui-white;
border-radius: 2px;
}
&__img {
padding: 0.5rem;
border-radius: 2px;
@@ -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 }:
<div className={cx(['info', !showSchedule && 'info--stretch'])}>
{extraInfo && <ExtraInfo projectData={projectData} size={qrSize} source={extraInfo} />}
<div className='info-card'>
{projectData.url && <QRCode value={projectData.url} size={qrSize} level='L' className='info-card__qr' />}
{projectData.url && <QRCode value={projectData.url} size={qrSize} />}
{projectData.info && <div className='info-card__message'>{projectData.info}</div>}
</div>
</div>
+2 -2
View File
@@ -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 })
+9 -9
View File
@@ -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();
@@ -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();
+4 -4
View File
@@ -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();
});
+1 -1
View File
@@ -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();
+7 -7
View File
@@ -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();
+1 -1
View File
@@ -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();
+1 -1
View File
@@ -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');
@@ -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+,');
+6 -6
View File
@@ -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();
+2 -2
View File
@@ -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();
+1 -1
View File
@@ -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();
@@ -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();
@@ -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();
+439 -50
View File
@@ -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