diff --git a/package.json b/package.json index b489df7c2d..6469166bb6 100644 --- a/package.json +++ b/package.json @@ -21,7 +21,7 @@ "test:e2e:mobile-webkit": "BROWSER=mobile-webkit NODE_TLS_REJECT_UNAUTHORIZED=0 TS_NODE_PROJECT=./tests/e2e/cucumber/tsconfig.json cucumber-js --profile=e2e ./tests/e2e/cucumber/features/mobile-view", "test:e2e:ipad-chromium": "BROWSER=ipad-chromium NODE_TLS_REJECT_UNAUTHORIZED=0 TS_NODE_PROJECT=./tests/e2e/cucumber/tsconfig.json cucumber-js --profile=e2e ./tests/e2e/cucumber/features/mobile-view", "test:e2e:ipad-safari": "BROWSER=ipad-landscape-webkit NODE_TLS_REJECT_UNAUTHORIZED=0 TS_NODE_PROJECT=./tests/e2e/cucumber/tsconfig.json cucumber-js --profile=e2e ./tests/e2e/cucumber/features/mobile-view", - "test:unit": "NODE_OPTIONS=--unhandled-rejections=throw vitest", + "test:unit": "NODE_OPTIONS=--unhandled-rejections=throw vitest --config ./tests/unit/config/vitest.config.ts", "licenses:check": "license-checker-rseidelsohn --summary --relativeLicensePath --onlyAllow 'Python-2.0;Apache*;Apache License, Version 2.0;Apache-2.0;Apache 2.0;Artistic-2.0;BSD;BSD-3-Clause;CC-BY-3.0;CC-BY-4.0;CC0-1.0;ISC;MIT;MPL-2.0;Public Domain;Unicode-TOU;Unlicense;WTFPL;BlueOak-1.0.0' --excludePackages '@opencloud-eu/babel-preset;@opencloud-eu/eslint-config;@opencloud-eu/prettier-config;@opencloud-eu/tsconfig;@opencloud-eu/web-client;@opencloud-eu/web-pkg;external;web-app-files;text-editor;preview;web-app-ocm;@opencloud-eu/design-system;pdf-viewer;web-app-search;admin-settings;webfinger;web-runtime;@opencloud-eu/web-test-helpers'", "licenses:csv": "license-checker-rseidelsohn --relativeLicensePath --csv --out ./third-party-licenses/third-party-licenses.csv", "licenses:save": "license-checker-rseidelsohn --relativeLicensePath --out /dev/null --files ./third-party-licenses/third-party-licenses", @@ -60,8 +60,8 @@ "@types/lodash-es": "^4.17.12", "@types/luxon": "^3.7.1", "@vitejs/plugin-vue": "6.0.1", - "@vitest/coverage-v8": "^3.0.5", - "@vitest/web-worker": "^3.0.5", + "@vitest/coverage-v8": "^4.0.0", + "@vitest/web-worker": "^4.0.0", "@vue/compiler-dom": "3.5.22", "@vue/compiler-sfc": "3.5.22", "@vue/test-utils": "2.4.6", @@ -92,7 +92,7 @@ "vite-plugin-node-polyfills": "0.24.0", "vite-plugin-static-copy": "^3.0.0", "vite-plugin-treat-umd-as-commonjs": "0.1.4", - "vitest": "^3.0.5", + "vitest": "^4.0.0", "vitest-mock-extended": "3.1.0", "vue": "3.5.22", "vue-demi": "0.14.10", diff --git a/packages/design-system/src/composables/useIsVisible/index.spec.ts b/packages/design-system/src/composables/useIsVisible/index.spec.ts index 25306f3cc0..f0fd57c183 100644 --- a/packages/design-system/src/composables/useIsVisible/index.spec.ts +++ b/packages/design-system/src/composables/useIsVisible/index.spec.ts @@ -4,16 +4,21 @@ import { mount } from '@opencloud-eu/web-test-helpers' const mockIntersectionObserver = () => { const enable = () => { - const mock = { - observe: vi.fn(), - disconnect: vi.fn(), - unobserve: vi.fn() - } - - window.IntersectionObserver = vi.fn().mockImplementation(() => mock) + const observeMock = vi.fn() + const unobserveMock = vi.fn() + const disconnectMock = vi.fn() + window.IntersectionObserver = vi.fn( + class { + observe = observeMock + unobserve = unobserveMock + disconnect = disconnectMock + } + ) as any return { - mock, + observeMock, + unobserveMock, + disconnectMock, callback: (args: unknown[], fastForward = 0) => { ;(window.IntersectionObserver as any).mock.calls[0][0](args) vi.advanceTimersByTime(fastForward) @@ -64,15 +69,15 @@ describe('useIsVisible', () => { }) it('observes the target', async () => { - const { mock: observerMock } = enableIntersectionObserver() + const { observeMock } = enableIntersectionObserver() createWrapper() await nextTick() - expect(observerMock.observe).toHaveBeenCalledTimes(1) + expect(observeMock).toHaveBeenCalledTimes(1) }) it('only shows once and then gets unobserved if the the composable is in the default show mode', async () => { - const { mock: observerMock, callback: observerCallback } = enableIntersectionObserver() + const { unobserveMock, callback: observerCallback } = enableIntersectionObserver() const wrapper = createWrapper() await nextTick() @@ -81,11 +86,11 @@ describe('useIsVisible', () => { observerCallback([{ isIntersecting: true }]) await nextTick() expect((wrapper.vm.$refs.target as any).innerHTML).toBe('true') - expect(observerMock.unobserve).toHaveBeenCalledTimes(1) + expect(unobserveMock).toHaveBeenCalledTimes(1) }) it('shows and hides multiple times if the the composable is in showHide mode', async () => { - const { mock: observerMock, callback: observerCallback } = enableIntersectionObserver() + const { unobserveMock, callback: observerCallback } = enableIntersectionObserver() const wrapper = createWrapper({ mode: 'showHide' }) await nextTick() @@ -94,15 +99,15 @@ describe('useIsVisible', () => { observerCallback([{ isIntersecting: true }]) await nextTick() expect((wrapper.vm.$refs.target as any).innerHTML).toBe('true') - expect(observerMock.unobserve).toHaveBeenCalledTimes(0) + expect(unobserveMock).toHaveBeenCalledTimes(0) }) it('disconnects the observer before component gets unmounted', () => { - const { mock: observerMock } = enableIntersectionObserver() + const { disconnectMock } = enableIntersectionObserver() const wrapper = createWrapper() - expect(observerMock.disconnect).toHaveBeenCalledTimes(0) + expect(disconnectMock).toHaveBeenCalledTimes(0) wrapper.unmount() - expect(observerMock.disconnect).toHaveBeenCalledTimes(1) + expect(disconnectMock).toHaveBeenCalledTimes(1) }) }) diff --git a/packages/web-app-files/tests/unit/HandleUpload.spec.ts b/packages/web-app-files/tests/unit/HandleUpload.spec.ts index 83bd5635d6..49fc1c3b2c 100644 --- a/packages/web-app-files/tests/unit/HandleUpload.spec.ts +++ b/packages/web-app-files/tests/unit/HandleUpload.spec.ts @@ -17,10 +17,20 @@ import { OcUppyBody } from '@opencloud-eu/web-pkg' import { Language } from 'vue3-gettext' -import { UploadResourceConflict } from '../../src/helpers/resource/actions' import { createTestingPinia } from '@opencloud-eu/web-test-helpers' -vi.mock('../../src/helpers/resource/actions') +let getConflictsMock = vi.fn() +let displayOverwriteDialogMock = vi.fn() + +vi.mock('../../src/helpers/resource/actions', () => { + const UploadResourceConflict = vi.fn( + class { + getConflicts = getConflictsMock + displayOverwriteDialog = displayOverwriteDialogMock + } + ) + return { UploadResourceConflict } +}) type UppyPlugin = UnknownPlugin> @@ -247,14 +257,14 @@ describe('HandleUpload', () => { }) describe('conflict handling check', () => { it('checks for conflicts if check enabled', async () => { - const { instance, mocks } = getWrapper() + const { instance } = getWrapper() await instance.handleUpload([mock({ name: 'name' })]) - expect(mocks.resourceConflict.getConflicts).toHaveBeenCalled() + expect(getConflictsMock).toHaveBeenCalled() }) it('does not check for conflicts if check disabled', async () => { - const { instance, mocks } = getWrapper({ conflictHandlingEnabled: false }) + const { instance } = getWrapper({ conflictHandlingEnabled: false }) await instance.handleUpload([mock({ name: 'name' })]) - expect(mocks.resourceConflict.getConflicts).not.toHaveBeenCalled() + expect(getConflictsMock).not.toHaveBeenCalled() }) it('does not start upload if all files were skipped in conflict handling', async () => { const { instance, mocks } = getWrapper({ conflicts: [{}], conflictHandlerResult: [] }) @@ -300,10 +310,8 @@ const getWrapper = ({ conflictHandlerResult = [], spaces = [] } = {}) => { - const resourceConflict = mock() - resourceConflict.getConflicts.mockReturnValue(conflicts) - resourceConflict.displayOverwriteDialog.mockResolvedValue(conflictHandlerResult) - vi.mocked(UploadResourceConflict).mockImplementation(() => resourceConflict) + getConflictsMock = vi.fn(() => conflicts) + displayOverwriteDialogMock = vi.fn().mockResolvedValue(conflictHandlerResult) const route = mock() route.params.driveAliasAndItem = '1' @@ -334,7 +342,7 @@ const getWrapper = ({ quotaCheckEnabled } - const mocks = { uppy, opts, resourceConflict } + const mocks = { uppy, opts } const instance = new HandleUpload(uppy, opts) return { instance, mocks } } diff --git a/packages/web-app-preview/tests/unit/app.spec.ts b/packages/web-app-preview/tests/unit/app.spec.ts index 08e018fd78..7ca2034f6a 100644 --- a/packages/web-app-preview/tests/unit/app.spec.ts +++ b/packages/web-app-preview/tests/unit/app.spec.ts @@ -4,6 +4,8 @@ import { defaultComponentMocks, defaultPlugins, shallowMount } from '@opencloud- import { FileContext, queryItemAsString } from '@opencloud-eu/web-pkg' import { mock } from 'vitest-mock-extended' +vi.mock('@panzoom/panzoom') + vi.mock('@opencloud-eu/web-pkg', async (importOriginal) => ({ ...(await importOriginal()), queryItemAsString: vi.fn(), diff --git a/packages/web-pkg/package.json b/packages/web-pkg/package.json index 38fa47db3b..db53f95da7 100644 --- a/packages/web-pkg/package.json +++ b/packages/web-pkg/package.json @@ -75,7 +75,7 @@ "@opencloud-eu/web-test-helpers": "workspace:^", "@types/dompurify": "3.2.0", "@types/lodash-es": "4.17.12", - "@vitest/web-worker": "^3.0.5", + "@vitest/web-worker": "^4.0.0", "clean-publish": "5.2.2", "vite-plugin-dts": "4.5.4", "vite-plugin-node-polyfills": "0.24.0" diff --git a/packages/web-pkg/tests/unit/components/Avatars/AvatarUpload.spec.ts b/packages/web-pkg/tests/unit/components/Avatars/AvatarUpload.spec.ts index ca2ed5efc4..cc9d188078 100644 --- a/packages/web-pkg/tests/unit/components/Avatars/AvatarUpload.spec.ts +++ b/packages/web-pkg/tests/unit/components/Avatars/AvatarUpload.spec.ts @@ -10,24 +10,21 @@ import { useMessages } from '../../../../src' import { describe } from 'vitest' vi.mock('cropperjs', () => { - return { - default: vi.fn().mockImplementation(() => ({ - getCroppedCanvas: vi.fn(() => ({ + const Cropper = vi.fn( + class { + getCroppedCanvas = vi.fn(() => ({ toBlob: vi.fn((cb) => cb(new Blob())), toDataURL: vi.fn(() => 'data:image/png;base64,mocked') - })), - destroy: vi.fn(), - replace: vi.fn(), - reset: vi.fn(), - crop: vi.fn(), - move: vi.fn(), - rotate: vi.fn(), - scale: vi.fn(), - ready: vi.fn(() => true) - })) - } + })) + destroy = vi.fn() + ready = vi.fn(() => true) + } + ) + return { default: Cropper } }) +window.URL.createObjectURL = vi.fn(() => 'foo') + const selectors = { removeAvatarButton: '.avatar-upload-remove-button', avatarFileInput: '.avatar-file-input', diff --git a/packages/web-pkg/tests/unit/components/Spaces/SpaceImageModal.spec.ts b/packages/web-pkg/tests/unit/components/Spaces/SpaceImageModal.spec.ts index 1c8a3bf424..fe79e12286 100644 --- a/packages/web-pkg/tests/unit/components/Spaces/SpaceImageModal.spec.ts +++ b/packages/web-pkg/tests/unit/components/Spaces/SpaceImageModal.spec.ts @@ -8,23 +8,7 @@ import { useSpaceHelpers } from '../../../../src/composables/spaces/useSpaceHelp vi.mock('../../../../src/composables/spaces/useSpaceHelpers', () => ({ useSpaceHelpers: vi.fn() })) -vi.mock('cropperjs', () => { - return { - default: vi.fn().mockImplementation(() => ({ - getCroppedCanvas: vi.fn(() => ({ - toBlob: vi.fn((cb) => cb(new Blob())), - toDataURL: vi.fn(() => 'data:image/png;base64,mocked') - })), - destroy: vi.fn(), - replace: vi.fn(), - reset: vi.fn(), - crop: vi.fn(), - move: vi.fn(), - rotate: vi.fn(), - scale: vi.fn() - })) - } -}) +vi.mock('cropperjs') window.URL.createObjectURL = vi.fn(() => '') diff --git a/packages/web-pkg/tests/unit/observer/visibility.spec.ts b/packages/web-pkg/tests/unit/observer/visibility.spec.ts index 542f2de3c5..1cb251e2b5 100644 --- a/packages/web-pkg/tests/unit/observer/visibility.spec.ts +++ b/packages/web-pkg/tests/unit/observer/visibility.spec.ts @@ -3,17 +3,20 @@ import { VisibilityObserver } from '../../../src/observer' let callback: ( arg: { isIntersecting: boolean; intersectionRatio: number; target: HTMLElement }[] ) => void -let mockIntersectionObserver: IntersectionObserver + +const observeMock = vi.fn() +const unobserveMock = vi.fn() const reset = () => { - mockIntersectionObserver = { - observe: vi.fn(), - disconnect: vi.fn(), - unobserve: vi.fn() - } as unknown as IntersectionObserver - window.IntersectionObserver = vi.fn().mockImplementation((cb) => { - callback = cb - return mockIntersectionObserver - }) + window.IntersectionObserver = vi.fn( + class { + constructor(cb: typeof callback) { + callback = cb + } + observe = observeMock + unobserve = unobserveMock + disconnect = vi.fn() + } + ) as any } beforeEach(reset) @@ -29,10 +32,10 @@ describe('VisibilityObserver', () => { onExit: vi.fn() }, {} - ])('observes %p', (cb) => { + ])('observes %s', (cb) => { const observer = new VisibilityObserver() observer.observe(document.getElementById('target'), cb) - expect(mockIntersectionObserver.observe).toHaveBeenCalledTimes(Object.keys(cb).length ? 1 : 0) + expect(observeMock).toHaveBeenCalledTimes(Object.keys(cb).length ? 1 : 0) }) it('handles entered and exited callbacks', () => { @@ -58,7 +61,7 @@ describe('VisibilityObserver', () => { expect(onExit).toHaveBeenCalledTimes(2) }) - it.each(['disconnect', 'unobserve'] as const)('handles %p', (m) => { + it.each(['disconnect', 'unobserve'] as const)('handles %s', (m) => { const onEnter = vi.fn() const onExit = vi.fn() const observer = new VisibilityObserver() @@ -94,15 +97,15 @@ describe('VisibilityObserver', () => { callback([{ isIntersecting: false, intersectionRatio: -1, target }]) expect(onEnter).toHaveBeenCalledTimes(0) expect(onExit).toHaveBeenCalledTimes(0) - expect(mockIntersectionObserver.unobserve).toHaveBeenCalledTimes(0) + expect(unobserveMock).toHaveBeenCalledTimes(0) callback([{ isIntersecting: true, intersectionRatio: 1, target }]) expect(onEnter).toHaveBeenCalledTimes(1) expect(onExit).toHaveBeenCalledTimes(0) - expect(mockIntersectionObserver.unobserve).toHaveBeenCalledTimes(0) + expect(unobserveMock).toHaveBeenCalledTimes(0) callback([{ isIntersecting: false, intersectionRatio: -1, target }]) expect(onEnter).toHaveBeenCalledTimes(1) expect(onExit).toHaveBeenCalledTimes(1) - expect(mockIntersectionObserver.unobserve).toHaveBeenCalledTimes(1) + expect(unobserveMock).toHaveBeenCalledTimes(1) callback([{ isIntersecting: true, intersectionRatio: 1, target }]) expect(onEnter).toHaveBeenCalledTimes(1) expect(onExit).toHaveBeenCalledTimes(1) diff --git a/packages/web-runtime/tests/unit/components/Account/ThemeSwitcher.spec.ts b/packages/web-runtime/tests/unit/components/Account/ThemeSwitcher.spec.ts index 11359da187..4ec03a782e 100644 --- a/packages/web-runtime/tests/unit/components/Account/ThemeSwitcher.spec.ts +++ b/packages/web-runtime/tests/unit/components/Account/ThemeSwitcher.spec.ts @@ -1,5 +1,5 @@ -import { WebThemeType, useThemeStore, ThemeConfigType } from '@opencloud-eu/web-pkg' -import { mock, mockDeep } from 'vitest-mock-extended' +import { useThemeStore, ThemeConfigType } from '@opencloud-eu/web-pkg' +import { mockDeep } from 'vitest-mock-extended' import ThemeSwitcher from '../../../../src/components/Account/ThemeSwitcher.vue' import { defaultPlugins, defaultStubs, mount } from '@opencloud-eu/web-test-helpers' @@ -49,10 +49,10 @@ function getWrapper({ hasOnlyOneTheme = false } = {}) { stubActions: false, themeState: { availableThemes, - currentTheme: mock({ + currentTheme: { ...themeConfig.clients.web.defaults, ...themeConfig.clients.web.themes[0] - }) + } } } }) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 8f2d8b665e..ad1b6c77d4 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -77,11 +77,11 @@ importers: specifier: 6.0.1 version: 6.0.1(vite@7.1.11(@types/node@22.16.0)(jiti@2.6.1)(lightningcss@1.30.2)(sass@1.93.1)(yaml@2.8.1))(vue@3.5.22(typescript@5.9.3)) '@vitest/coverage-v8': - specifier: ^3.0.5 - version: 3.2.4(vitest@3.2.4(@types/node@22.16.0)(happy-dom@20.0.8)(jiti@2.6.1)(jsdom@27.0.1(postcss@8.5.6))(lightningcss@1.30.2)(sass@1.93.1)(yaml@2.8.1)) + specifier: ^4.0.0 + version: 4.0.1(vitest@4.0.1(@types/node@22.16.0)(happy-dom@20.0.8)(jiti@2.6.1)(jsdom@27.0.1(postcss@8.5.6))(lightningcss@1.30.2)(sass@1.93.1)(yaml@2.8.1)) '@vitest/web-worker': - specifier: ^3.0.5 - version: 3.2.4(vitest@3.2.4(@types/node@22.16.0)(happy-dom@20.0.8)(jiti@2.6.1)(jsdom@27.0.1(postcss@8.5.6))(lightningcss@1.30.2)(sass@1.93.1)(yaml@2.8.1)) + specifier: ^4.0.0 + version: 4.0.1(vitest@4.0.1(@types/node@22.16.0)(happy-dom@20.0.8)(jiti@2.6.1)(jsdom@27.0.1(postcss@8.5.6))(lightningcss@1.30.2)(sass@1.93.1)(yaml@2.8.1)) '@vue/compiler-dom': specifier: 3.5.22 version: 3.5.22 @@ -173,11 +173,11 @@ importers: specifier: 0.1.4 version: 0.1.4(vite@7.1.11(@types/node@22.16.0)(jiti@2.6.1)(lightningcss@1.30.2)(sass@1.93.1)(yaml@2.8.1)) vitest: - specifier: ^3.0.5 - version: 3.2.4(@types/node@22.16.0)(happy-dom@20.0.8)(jiti@2.6.1)(jsdom@27.0.1(postcss@8.5.6))(lightningcss@1.30.2)(sass@1.93.1)(yaml@2.8.1) + specifier: ^4.0.0 + version: 4.0.1(@types/node@22.16.0)(happy-dom@20.0.8)(jiti@2.6.1)(jsdom@27.0.1(postcss@8.5.6))(lightningcss@1.30.2)(sass@1.93.1)(yaml@2.8.1) vitest-mock-extended: specifier: 3.1.0 - version: 3.1.0(typescript@5.9.3)(vitest@3.2.4(@types/node@22.16.0)(happy-dom@20.0.8)(jiti@2.6.1)(jsdom@27.0.1(postcss@8.5.6))(lightningcss@1.30.2)(sass@1.93.1)(yaml@2.8.1)) + version: 3.1.0(typescript@5.9.3)(vitest@4.0.1(@types/node@22.16.0)(happy-dom@20.0.8)(jiti@2.6.1)(jsdom@27.0.1(postcss@8.5.6))(lightningcss@1.30.2)(sass@1.93.1)(yaml@2.8.1)) vue: specifier: 3.5.22 version: 3.5.22(typescript@5.9.3) @@ -917,8 +917,8 @@ importers: specifier: 4.17.12 version: 4.17.12 '@vitest/web-worker': - specifier: ^3.0.5 - version: 3.2.4(vitest@3.2.4(@types/node@22.16.0)(happy-dom@20.0.8)(jiti@2.6.1)(jsdom@27.0.1(postcss@8.5.6))(lightningcss@1.30.2)(sass@1.93.1)(yaml@2.8.1)) + specifier: ^4.0.0 + version: 4.0.1(vitest@4.0.1(@types/node@22.16.0)(happy-dom@20.0.8)(jiti@2.6.1)(jsdom@27.0.1(postcss@8.5.6))(lightningcss@1.30.2)(sass@1.93.1)(yaml@2.8.1)) clean-publish: specifier: 5.2.2 version: 5.2.2 @@ -1079,7 +1079,7 @@ importers: version: 3.0.3(typescript@5.9.3)(vue@3.5.22(typescript@5.9.3)) vitest-mock-extended: specifier: ^3.0.0 - version: 3.1.0(typescript@5.9.3)(vitest@3.2.4(@types/node@22.16.0)(happy-dom@20.0.8)(jiti@2.6.1)(jsdom@27.0.1(postcss@8.5.6))(lightningcss@1.30.2)(sass@1.93.1)(yaml@2.8.1)) + version: 3.1.0(typescript@5.9.3)(vitest@4.0.1(@types/node@22.16.0)(happy-dom@20.0.8)(jiti@2.6.1)(jsdom@27.0.1(postcss@8.5.6))(lightningcss@1.30.2)(sass@1.93.1)(yaml@2.8.1)) vue: specifier: ^3.5.10 version: 3.5.22(typescript@5.9.3) @@ -1206,10 +1206,6 @@ packages: resolution: {integrity: sha512-RgLX78ojYOrThJHrIiPzT4HW3yfQa0D7K+MQ81rhxqaNyNBu4F1r+72LNHYH/Z+y9I1Mrjrd/c/Ue5zfDgAEjQ==} engines: {node: '>= 14.0.0'} - '@ampproject/remapping@2.3.0': - resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} - engines: {node: '>=6.0.0'} - '@asamuzakjp/css-color@4.0.5': resolution: {integrity: sha512-lMrXidNhPGsDjytDy11Vwlb6OIGrT3CmLg3VWNFyWkLWtijKl7xjvForlh8vuj0SHGjgl4qZEQzUmYTeQA2JFQ==} @@ -2353,10 +2349,6 @@ packages: resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} engines: {node: '>=12'} - '@istanbuljs/schema@0.1.3': - resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} - engines: {node: '>=8'} - '@jridgewell/gen-mapping@0.3.12': resolution: {integrity: sha512-OuLGC46TjB5BbN1dH8JULVVZY4WTdkF7tV9Ys6wLL1rubZnCMstOhNHueU5bLCrnRuDhKPDM4g6sw4Bel5Gzqg==} @@ -2370,8 +2362,8 @@ packages: '@jridgewell/sourcemap-codec@1.5.5': resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} - '@jridgewell/trace-mapping@0.3.29': - resolution: {integrity: sha512-uw6guiW/gcAGPDhLmd77/6lW8QLeiV5RUTsAX46Db6oLhGaVj4lhnPwb184s1bkc8kdVg/+h988dro8GRDpmYQ==} + '@jridgewell/trace-mapping@0.3.31': + resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} '@jridgewell/trace-mapping@0.3.9': resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} @@ -2798,6 +2790,9 @@ packages: '@shikijs/vscode-textmate@10.0.2': resolution: {integrity: sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==} + '@standard-schema/spec@1.0.0': + resolution: {integrity: sha512-m2bOd0f2RT9k8QJx1JN85cZYyH1RqFBdlwtkSlf4tBDYLCiiZnv1fIIwacK6cqwXavOydf0NPToMQgpKq+dVlA==} + '@tailwindcss/node@4.1.15': resolution: {integrity: sha512-HF4+7QxATZWY3Jr8OlZrBSXmwT3Watj0OogeDvdUY/ByXJHQ+LBtqA2brDb3sBxYslIFx6UP94BJ4X6a4L9Bmw==} @@ -3140,48 +3135,48 @@ packages: vite: ^5.0.0 || ^6.0.0 || ^7.0.0 vue: ^3.2.25 - '@vitest/coverage-v8@3.2.4': - resolution: {integrity: sha512-EyF9SXU6kS5Ku/U82E259WSnvg6c8KTjppUncuNdm5QHpe17mwREHnjDzozC8x9MZ0xfBUFSaLkRv4TMA75ALQ==} + '@vitest/coverage-v8@4.0.1': + resolution: {integrity: sha512-nmB+UVryiWQLC0pfPQ6KmJacew1ecpuKeUyiGbXtp1+KoYtCTAAlLI++8X/wJfzlULil+l/1jiWPreFnB1U5Mg==} peerDependencies: - '@vitest/browser': 3.2.4 - vitest: 3.2.4 + '@vitest/browser': 4.0.1 + vitest: 4.0.1 peerDependenciesMeta: '@vitest/browser': optional: true - '@vitest/expect@3.2.4': - resolution: {integrity: sha512-Io0yyORnB6sikFlt8QW5K7slY4OjqNX9jmJQ02QDda8lyM6B5oNgVWoSoKPac8/kgnCUzuHQKrSLtu/uOqqrig==} + '@vitest/expect@4.0.1': + resolution: {integrity: sha512-KtvGLN/IWoZfg68JF2q/zbDEo+UJTWnc7suYJ8RF+ZTBeBcBz4NIOJDxO4Q3bEY9GsOYhgy5cOevcVPFh4+V7g==} - '@vitest/mocker@3.2.4': - resolution: {integrity: sha512-46ryTE9RZO/rfDd7pEqFl7etuyzekzEhUbTW3BvmeO/BcCMEgq59BKhek3dXDWgAj4oMK6OZi+vRr1wPW6qjEQ==} + '@vitest/mocker@4.0.1': + resolution: {integrity: sha512-fwmvg8YvwSAE41Hyhul7dL4UzPhG+k2VaZCcL+aHagLx4qlNQgKYTw7coF4YdjAxSBBt0b408gQFYMX1Qeqweg==} peerDependencies: msw: ^2.4.9 - vite: ^5.0.0 || ^6.0.0 || ^7.0.0-0 + vite: ^6.0.0 || ^7.0.0-0 peerDependenciesMeta: msw: optional: true vite: optional: true - '@vitest/pretty-format@3.2.4': - resolution: {integrity: sha512-IVNZik8IVRJRTr9fxlitMKeJeXFFFN0JaB9PHPGQ8NKQbGpfjlTx9zO4RefN8gp7eqjNy8nyK3NZmBzOPeIxtA==} + '@vitest/pretty-format@4.0.1': + resolution: {integrity: sha512-6nq3JY/zQ91+oX1vd4fajiVNyA/HMhaF9cOw5P9cQi6ML7PRi7ilVaQ77PulF+4kvUKr9bcLm9GoAtwlVFbGzw==} - '@vitest/runner@3.2.4': - resolution: {integrity: sha512-oukfKT9Mk41LreEW09vt45f8wx7DordoWUZMYdY/cyAk7w5TWkTRCNZYF7sX7n2wB7jyGAl74OxgwhPgKaqDMQ==} + '@vitest/runner@4.0.1': + resolution: {integrity: sha512-nxUoWmw7ZX2OiSNwolJeSOOzrrR/o79wRTwP7HhiW/lDFwQHtWMj9snMhrdvccFqanvI8897E81eXjgDbrRvqA==} - '@vitest/snapshot@3.2.4': - resolution: {integrity: sha512-dEYtS7qQP2CjU27QBC5oUOxLE/v5eLkGqPE0ZKEIDGMs4vKWe7IjgLOeauHsR0D5YuuycGRO5oSRXnwnmA78fQ==} + '@vitest/snapshot@4.0.1': + resolution: {integrity: sha512-CvfsEWutEIN/Z9ScXYup7YwlPeK9JICrV7FN9p3pVytsyh+aCHAH0PUi//YlTiQ7T8qYxJYpUrAwZL9XqmZ5ZA==} - '@vitest/spy@3.2.4': - resolution: {integrity: sha512-vAfasCOe6AIK70iP5UD11Ac4siNUNJ9i/9PZ3NKx07sG6sUxeag1LWdNrMWeKKYBLlzuK+Gn65Yd5nyL6ds+nw==} + '@vitest/spy@4.0.1': + resolution: {integrity: sha512-Hj0/TBQ2EN72wDpfKiUf63mRCkE0ZiSGXGeDDvW9T3LBKVVApItd0GyQLDBIe03kWbyK9gOTEbJVVWthcLFzCg==} - '@vitest/utils@3.2.4': - resolution: {integrity: sha512-fB2V0JFrQSMsCo9HiSq3Ezpdv4iYaXRG1Sx8edX3MwxfyNn83mKiGzOcH+Fkxt4MHxr3y42fQi1oeAInqgX2QA==} + '@vitest/utils@4.0.1': + resolution: {integrity: sha512-uRrACgpIz5sxuT87ml7xhh7EdKtW8k0N9oSFVBPl8gHB/JfLObLe9dXO6ZrsNN55FzciGIRqIEILgTQvg1eNHw==} - '@vitest/web-worker@3.2.4': - resolution: {integrity: sha512-JXK3lMyZHDrJ/BrJmxSZxe3RYT9oy2juxN4kpdrQ8NL8iibz352lXbcrnqG4WuSoBDwhjgghgvmIpsTv9Be7eA==} + '@vitest/web-worker@4.0.1': + resolution: {integrity: sha512-FNAfDi6wAOgaDBO2OnG5tMv/jumpC87uFQsxGj9TSbd1bA2nCURbpM5tezfCdAkSWMYwN3vy7Qqu8s/JhkSC9A==} peerDependencies: - vitest: 3.2.4 + vitest: 4.0.1 '@volar/language-core@2.4.23': resolution: {integrity: sha512-hEEd5ET/oSmBC6pi1j6NaNYRWoAiDhINbT8rmwtINugR39loROSlufGdYMF9TaKGfz+ViGs1Idi3mAhnuPcoGQ==} @@ -3456,12 +3451,8 @@ packages: assertion-error-formatter@3.0.0: resolution: {integrity: sha512-6YyAVLrEze0kQ7CmJfUgrLHb+Y7XghmL2Ie7ijVa2Y9ynP3LV+VDiwFk62Dn0qtqbmY0BT0ss6p1xxpiF2PYbQ==} - assertion-error@2.0.1: - resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} - engines: {node: '>=12'} - - ast-v8-to-istanbul@0.3.3: - resolution: {integrity: sha512-MuXMrSLVVoA6sYN/6Hke18vMzrT4TZNbZIj/hvh0fnYFpO+/kFXcLIaiPwXXWaQUPg4yJD8fj+lfJ7/1EBconw==} + ast-v8-to-istanbul@0.3.7: + resolution: {integrity: sha512-kr1Hy6YRZBkGQSb6puP+D6FQ59Cx4m0siYhAxygMCAgadiWQ6oxAxQXHOMvJx67SJ63jRoVIIg5eXzUbbct1ww==} async@3.2.6: resolution: {integrity: sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==} @@ -3597,10 +3588,6 @@ packages: byte-length@1.0.2: resolution: {integrity: sha512-ovBpjmsgd/teRmgcPh23d4gJvxDoXtAzEL9xTfMU8Yc2kqCDb7L9jAG0XHl1nzuGl+h3ebCIF1i62UFyA9V/2Q==} - cac@6.7.14: - resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} - engines: {node: '>=8'} - caf@15.0.1: resolution: {integrity: sha512-Xp/IK6vMwujxWZXra7djdYzPdPnEQKa7Mudu2wZgDQ3TJry1I0TgtjEgwZHpoBcMp68j4fb0/FZ1SJyMEgJrXQ==} @@ -3629,9 +3616,9 @@ packages: ccount@2.0.1: resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} - chai@5.2.0: - resolution: {integrity: sha512-mCuXncKXk5iCLhfhwTc0izo0gtEmpz5CtG2y8GiOINBlMVS6v8TMRc5TaLWKS6692m9+dVVfzgeVxR5UxWHTYw==} - engines: {node: '>=12'} + chai@6.2.0: + resolution: {integrity: sha512-aUTnJc/JipRzJrNADXVvpVqi6CO0dn3nx4EVPxijri+fj3LUUDyZQOgVeW54Ob3Y1Xh9Iz8f+CgaCl8v0mn9bA==} + engines: {node: '>=18'} chalk@4.1.2: resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} @@ -3649,10 +3636,6 @@ packages: charenc@0.0.2: resolution: {integrity: sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==} - check-error@2.1.1: - resolution: {integrity: sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==} - engines: {node: '>= 16'} - chokidar@3.6.0: resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} engines: {node: '>= 8.10.0'} @@ -3876,10 +3859,6 @@ packages: decimal.js@10.6.0: resolution: {integrity: sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==} - deep-eql@5.0.2: - resolution: {integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==} - engines: {node: '>=6'} - deep-is@0.1.4: resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} @@ -4207,8 +4186,8 @@ packages: evp_bytestokey@1.0.3: resolution: {integrity: sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==} - expect-type@1.2.1: - resolution: {integrity: sha512-/kP8CAwxzLVEeFrMm4kMmy4CCDlpipyA7MYLVrdJIkV0fYF0UaigQHRsxHiuY/GEea+bh4KSv3TIlgr+2UL6bw==} + expect-type@1.2.2: + resolution: {integrity: sha512-JhFGDVJ7tmDJItKhYgJCGLOWjuK9vPxiXoUFLwLDc99NlmklilbiQJwoctZtt13+xMw91MCk/REan6MWHqDjyA==} engines: {node: '>=12.0.0'} exsolve@1.0.5: @@ -4701,8 +4680,8 @@ packages: resolution: {integrity: sha512-yg2d+Em4KizZC5niWhQaIomgf5WlL4vOOjZ5xGCmF8SnPE/mDWWXgvRExdcpCgh9lLRRa1/fSYp2ymmbJ1pI+A==} engines: {node: '>=10'} - istanbul-reports@3.1.7: - resolution: {integrity: sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==} + istanbul-reports@3.2.0: + resolution: {integrity: sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==} engines: {node: '>=8'} jackspeak@3.4.3: @@ -4980,9 +4959,6 @@ packages: lodash@4.17.21: resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} - loupe@3.1.4: - resolution: {integrity: sha512-wJzkKwJrheKtknCOKNEtDK4iqg/MxmZheEMtSTYvnzRdEYaZzmgH976nenp8WdJRdx5Vc1X/9MO0Oszl6ezeXg==} - lower-case@2.0.2: resolution: {integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==} @@ -5441,10 +5417,6 @@ packages: pathe@2.0.3: resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} - pathval@2.0.0: - resolution: {integrity: sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==} - engines: {node: '>= 14.16'} - pbkdf2@3.1.3: resolution: {integrity: sha512-wfRLBZ0feWRhCIkoMB6ete7czJcnNnqRpcoWQBLqatqXXmelSRqfdDK4F3u9T2s2cXas/hQJcryI/4lAL+XTlA==} engines: {node: '>=0.12'} @@ -6028,9 +6000,6 @@ packages: resolution: {integrity: sha512-4X2FR3UwhNUE9G49aIsJW5hRRR3GXGTBTZRMfv568O60ojM8HcWjV/VxAxCDW3SUND33O6ZY66ZuRcdkj73q2g==} engines: {node: '>=14.16'} - strip-literal@3.0.0: - resolution: {integrity: sha512-TcccoMhJOM3OebGhSBEmp3UZ2SfDMZUEBdRA/9ynfLi8yYajyWX3JiXArcJt4Umh4vISpspkQIY8ZZoCqjbviA==} - strnum@1.1.2: resolution: {integrity: sha512-vrN+B7DBIoTTZjnPNewwhx6cBA/H+IS7rfW68n7XxC1y7uoiGQBxaKzqucGUgavX15dJgiGztLJ8vxuEzwqBdA==} @@ -6066,10 +6035,6 @@ packages: resolution: {integrity: sha512-ZL6DDuAlRlLGghwcfmSn9sK3Hr6ArtyudlSAiCqQ6IfE+b+HHbydbYDIG15IfS5do+7XQQBdBiubF/cV2dnDzg==} engines: {node: '>=6'} - test-exclude@7.0.1: - resolution: {integrity: sha512-pFYqmTw68LXVjeWJMST4+borgQP2AyMNbg1BpZh9LbyhUeNkeaPF9gzfPGUAnSMV3qPYdWUwDIjjCLiSDOl7vg==} - engines: {node: '>=18'} - thenify-all@1.6.0: resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} engines: {node: '>=0.8'} @@ -6097,16 +6062,8 @@ packages: resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==} engines: {node: '>=12.0.0'} - tinypool@1.1.1: - resolution: {integrity: sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg==} - engines: {node: ^18.0.0 || >=20.0.0} - - tinyrainbow@2.0.0: - resolution: {integrity: sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==} - engines: {node: '>=14.0.0'} - - tinyspy@4.0.3: - resolution: {integrity: sha512-t2T/WLB2WRgZ9EpE4jgPJ9w+i66UZfDc8wHh0xrwiRNN+UwH98GIJkTeZqX9rg0i0ptwzqW+uYeIF0T4F8LR7A==} + tinyrainbow@3.0.3: + resolution: {integrity: sha512-PSkbLUoxOFRzJYjjxHJt9xro7D+iilgMX/C9lawzVuYiIdcihh9DXmVibBe8lmcFrRi/VzlPjBxbN7rH24q8/Q==} engines: {node: '>=14.0.0'} tippy.js@6.3.7: @@ -6362,11 +6319,6 @@ packages: vfile@6.0.3: resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==} - vite-node@3.2.4: - resolution: {integrity: sha512-EbKSKh+bh1E1IFxeO0pg1n4dvoOTt0UDiXMd/qn++r98+jPO1xtJilvXldeuQ8giIB5IkpjCgMleHMNEsGH6pg==} - engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} - hasBin: true - vite-plugin-dts@4.5.4: resolution: {integrity: sha512-d4sOM8M/8z7vRXHHq/ebbblfaxENjogAAekcfcDCCwAyvGqnPrc7f4NZbvItS+g4WTgerW0xDwSz5qz11JT3vg==} peerDependencies: @@ -6486,16 +6438,18 @@ packages: typescript: 3.x || 4.x || 5.x vitest: '>=3.0.0' - vitest@3.2.4: - resolution: {integrity: sha512-LUCP5ev3GURDysTWiP47wRRUpLKMOfPh+yKTx3kVIEiu5KOMeqzpnYNsKyOoVrULivR8tLcks4+lga33Whn90A==} - engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} + vitest@4.0.1: + resolution: {integrity: sha512-4rwTfUNF0MExMZBiNirkzZpeyUZGOs3JD76N2qHNP9i6w6/bff7MRv2I9yFJKd1ICxzn2igpra+E4t9o2EfQhw==} + engines: {node: ^20.0.0 || ^22.0.0 || >=24.0.0} hasBin: true peerDependencies: '@edge-runtime/vm': '*' '@types/debug': ^4.1.12 - '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 - '@vitest/browser': 3.2.4 - '@vitest/ui': 3.2.4 + '@types/node': ^20.0.0 || ^22.0.0 || >=24.0.0 + '@vitest/browser-playwright': 4.0.1 + '@vitest/browser-preview': 4.0.1 + '@vitest/browser-webdriverio': 4.0.1 + '@vitest/ui': 4.0.1 happy-dom: '*' jsdom: '*' peerDependenciesMeta: @@ -6505,7 +6459,11 @@ packages: optional: true '@types/node': optional: true - '@vitest/browser': + '@vitest/browser-playwright': + optional: true + '@vitest/browser-preview': + optional: true + '@vitest/browser-webdriverio': optional: true '@vitest/ui': optional: true @@ -6865,11 +6823,6 @@ snapshots: dependencies: '@algolia/client-common': 5.35.0 - '@ampproject/remapping@2.3.0': - dependencies: - '@jridgewell/gen-mapping': 0.3.12 - '@jridgewell/trace-mapping': 0.3.29 - '@asamuzakjp/css-color@4.0.5': dependencies: '@csstools/css-calc': 2.1.4(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) @@ -6934,7 +6887,7 @@ snapshots: '@babel/parser': 7.28.4 '@babel/types': 7.28.4 '@jridgewell/gen-mapping': 0.3.12 - '@jridgewell/trace-mapping': 0.3.29 + '@jridgewell/trace-mapping': 0.3.31 jsesc: 3.1.0 '@babel/helper-annotate-as-pure@7.27.3': @@ -8248,23 +8201,21 @@ snapshots: wrap-ansi: 8.1.0 wrap-ansi-cjs: wrap-ansi@7.0.0 - '@istanbuljs/schema@0.1.3': {} - '@jridgewell/gen-mapping@0.3.12': dependencies: '@jridgewell/sourcemap-codec': 1.5.5 - '@jridgewell/trace-mapping': 0.3.29 + '@jridgewell/trace-mapping': 0.3.31 '@jridgewell/remapping@2.3.5': dependencies: '@jridgewell/gen-mapping': 0.3.12 - '@jridgewell/trace-mapping': 0.3.29 + '@jridgewell/trace-mapping': 0.3.31 '@jridgewell/resolve-uri@3.1.2': {} '@jridgewell/sourcemap-codec@1.5.5': {} - '@jridgewell/trace-mapping@0.3.29': + '@jridgewell/trace-mapping@0.3.31': dependencies: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.5.5 @@ -8715,6 +8666,8 @@ snapshots: '@shikijs/vscode-textmate@10.0.2': {} + '@standard-schema/spec@1.0.0': {} + '@tailwindcss/node@4.1.15': dependencies: '@jridgewell/remapping': 2.3.5 @@ -9078,71 +9031,66 @@ snapshots: vite: 7.1.11(@types/node@22.16.0)(jiti@2.6.1)(lightningcss@1.30.2)(sass@1.93.1)(yaml@2.8.1) vue: 3.5.22(typescript@5.9.3) - '@vitest/coverage-v8@3.2.4(vitest@3.2.4(@types/node@22.16.0)(happy-dom@20.0.8)(jiti@2.6.1)(jsdom@27.0.1(postcss@8.5.6))(lightningcss@1.30.2)(sass@1.93.1)(yaml@2.8.1))': + '@vitest/coverage-v8@4.0.1(vitest@4.0.1(@types/node@22.16.0)(happy-dom@20.0.8)(jiti@2.6.1)(jsdom@27.0.1(postcss@8.5.6))(lightningcss@1.30.2)(sass@1.93.1)(yaml@2.8.1))': dependencies: - '@ampproject/remapping': 2.3.0 '@bcoe/v8-coverage': 1.0.2 - ast-v8-to-istanbul: 0.3.3 + '@vitest/utils': 4.0.1 + ast-v8-to-istanbul: 0.3.7 debug: 4.4.3(supports-color@8.1.1) istanbul-lib-coverage: 3.2.2 istanbul-lib-report: 3.0.1 istanbul-lib-source-maps: 5.0.6 - istanbul-reports: 3.1.7 - magic-string: 0.30.19 + istanbul-reports: 3.2.0 magicast: 0.3.5 std-env: 3.9.0 - test-exclude: 7.0.1 - tinyrainbow: 2.0.0 - vitest: 3.2.4(@types/node@22.16.0)(happy-dom@20.0.8)(jiti@2.6.1)(jsdom@27.0.1(postcss@8.5.6))(lightningcss@1.30.2)(sass@1.93.1)(yaml@2.8.1) + tinyrainbow: 3.0.3 + vitest: 4.0.1(@types/node@22.16.0)(happy-dom@20.0.8)(jiti@2.6.1)(jsdom@27.0.1(postcss@8.5.6))(lightningcss@1.30.2)(sass@1.93.1)(yaml@2.8.1) transitivePeerDependencies: - supports-color - '@vitest/expect@3.2.4': + '@vitest/expect@4.0.1': dependencies: + '@standard-schema/spec': 1.0.0 '@types/chai': 5.2.2 - '@vitest/spy': 3.2.4 - '@vitest/utils': 3.2.4 - chai: 5.2.0 - tinyrainbow: 2.0.0 + '@vitest/spy': 4.0.1 + '@vitest/utils': 4.0.1 + chai: 6.2.0 + tinyrainbow: 3.0.3 - '@vitest/mocker@3.2.4(vite@7.1.11(@types/node@22.16.0)(jiti@2.6.1)(lightningcss@1.30.2)(sass@1.93.1)(yaml@2.8.1))': + '@vitest/mocker@4.0.1(vite@7.1.11(@types/node@22.16.0)(jiti@2.6.1)(lightningcss@1.30.2)(sass@1.93.1)(yaml@2.8.1))': dependencies: - '@vitest/spy': 3.2.4 + '@vitest/spy': 4.0.1 estree-walker: 3.0.3 magic-string: 0.30.19 optionalDependencies: vite: 7.1.11(@types/node@22.16.0)(jiti@2.6.1)(lightningcss@1.30.2)(sass@1.93.1)(yaml@2.8.1) - '@vitest/pretty-format@3.2.4': + '@vitest/pretty-format@4.0.1': dependencies: - tinyrainbow: 2.0.0 + tinyrainbow: 3.0.3 - '@vitest/runner@3.2.4': + '@vitest/runner@4.0.1': dependencies: - '@vitest/utils': 3.2.4 + '@vitest/utils': 4.0.1 pathe: 2.0.3 - strip-literal: 3.0.0 - '@vitest/snapshot@3.2.4': + '@vitest/snapshot@4.0.1': dependencies: - '@vitest/pretty-format': 3.2.4 + '@vitest/pretty-format': 4.0.1 magic-string: 0.30.19 pathe: 2.0.3 - '@vitest/spy@3.2.4': - dependencies: - tinyspy: 4.0.3 + '@vitest/spy@4.0.1': {} - '@vitest/utils@3.2.4': + '@vitest/utils@4.0.1': dependencies: - '@vitest/pretty-format': 3.2.4 - loupe: 3.1.4 - tinyrainbow: 2.0.0 + '@vitest/pretty-format': 4.0.1 + tinyrainbow: 3.0.3 - '@vitest/web-worker@3.2.4(vitest@3.2.4(@types/node@22.16.0)(happy-dom@20.0.8)(jiti@2.6.1)(jsdom@27.0.1(postcss@8.5.6))(lightningcss@1.30.2)(sass@1.93.1)(yaml@2.8.1))': + '@vitest/web-worker@4.0.1(vitest@4.0.1(@types/node@22.16.0)(happy-dom@20.0.8)(jiti@2.6.1)(jsdom@27.0.1(postcss@8.5.6))(lightningcss@1.30.2)(sass@1.93.1)(yaml@2.8.1))': dependencies: debug: 4.4.3(supports-color@8.1.1) - vitest: 3.2.4(@types/node@22.16.0)(happy-dom@20.0.8)(jiti@2.6.1)(jsdom@27.0.1(postcss@8.5.6))(lightningcss@1.30.2)(sass@1.93.1)(yaml@2.8.1) + vitest: 4.0.1(@types/node@22.16.0)(happy-dom@20.0.8)(jiti@2.6.1)(jsdom@27.0.1(postcss@8.5.6))(lightningcss@1.30.2)(sass@1.93.1)(yaml@2.8.1) transitivePeerDependencies: - supports-color @@ -9446,11 +9394,9 @@ snapshots: pad-right: 0.2.2 repeat-string: 1.6.1 - assertion-error@2.0.1: {} - - ast-v8-to-istanbul@0.3.3: + ast-v8-to-istanbul@0.3.7: dependencies: - '@jridgewell/trace-mapping': 0.3.29 + '@jridgewell/trace-mapping': 0.3.31 estree-walker: 3.0.3 js-tokens: 9.0.1 @@ -9616,8 +9562,6 @@ snapshots: byte-length@1.0.2: {} - cac@6.7.14: {} - caf@15.0.1(patch_hash=b09bdde8a1f7e834af8677123b32ceb4f485966fdb476facf5b6c64157c9fc14): {} call-bind-apply-helpers@1.0.2: @@ -9649,13 +9593,7 @@ snapshots: ccount@2.0.1: {} - chai@5.2.0: - dependencies: - assertion-error: 2.0.1 - check-error: 2.1.1 - deep-eql: 5.0.2 - loupe: 3.1.4 - pathval: 2.0.0 + chai@6.2.0: {} chalk@4.1.2: dependencies: @@ -9671,8 +9609,6 @@ snapshots: charenc@0.0.2: {} - check-error@2.1.1: {} - chokidar@3.6.0: dependencies: anymatch: 3.1.3 @@ -9927,8 +9863,6 @@ snapshots: decimal.js@10.6.0: {} - deep-eql@5.0.2: {} - deep-is@0.1.4: {} deep-object-diff@1.1.9: {} @@ -10343,7 +10277,7 @@ snapshots: md5.js: 1.3.5 safe-buffer: 5.2.1 - expect-type@1.2.1: {} + expect-type@1.2.2: {} exsolve@1.0.5: {} @@ -10817,13 +10751,13 @@ snapshots: istanbul-lib-source-maps@5.0.6: dependencies: - '@jridgewell/trace-mapping': 0.3.29 + '@jridgewell/trace-mapping': 0.3.31 debug: 4.4.3(supports-color@8.1.1) istanbul-lib-coverage: 3.2.2 transitivePeerDependencies: - supports-color - istanbul-reports@3.1.7: + istanbul-reports@3.2.0: dependencies: html-escaper: 2.0.2 istanbul-lib-report: 3.0.1 @@ -11099,8 +11033,6 @@ snapshots: lodash@4.17.21: {} - loupe@3.1.4: {} - lower-case@2.0.2: dependencies: tslib: 2.8.1 @@ -11583,8 +11515,6 @@ snapshots: pathe@2.0.3: {} - pathval@2.0.0: {} - pbkdf2@3.1.3: dependencies: create-hash: 1.1.3 @@ -12200,10 +12130,6 @@ snapshots: strip-json-comments@5.0.2: {} - strip-literal@3.0.0: - dependencies: - js-tokens: 9.0.1 - strnum@1.1.2: {} style-mod@4.1.3: {} @@ -12230,12 +12156,6 @@ snapshots: tapable@2.2.3: {} - test-exclude@7.0.1: - dependencies: - '@istanbuljs/schema': 0.1.3 - glob: 10.4.5 - minimatch: 9.0.5 - thenify-all@1.6.0: dependencies: thenify: 3.3.1 @@ -12263,11 +12183,7 @@ snapshots: fdir: 6.5.0(picomatch@4.0.3) picomatch: 4.0.3 - tinypool@1.1.1: {} - - tinyrainbow@2.0.0: {} - - tinyspy@4.0.3: {} + tinyrainbow@3.0.3: {} tippy.js@6.3.7: dependencies: @@ -12512,27 +12428,6 @@ snapshots: '@types/unist': 3.0.3 vfile-message: 4.0.3 - vite-node@3.2.4(@types/node@22.16.0)(jiti@2.6.1)(lightningcss@1.30.2)(sass@1.93.1)(yaml@2.8.1): - dependencies: - cac: 6.7.14 - debug: 4.4.3(supports-color@8.1.1) - es-module-lexer: 1.7.0 - pathe: 2.0.3 - vite: 7.1.11(@types/node@22.16.0)(jiti@2.6.1)(lightningcss@1.30.2)(sass@1.93.1)(yaml@2.8.1) - transitivePeerDependencies: - - '@types/node' - - jiti - - less - - lightningcss - - sass - - sass-embedded - - stylus - - sugarss - - supports-color - - terser - - tsx - - yaml - vite-plugin-dts@4.5.4(@types/node@22.16.0)(rollup@4.52.5)(typescript@5.9.3)(vite@7.1.11(@types/node@22.16.0)(jiti@2.6.1)(lightningcss@1.30.2)(sass@1.93.1)(yaml@2.8.1)): dependencies: '@microsoft/api-extractor': 7.52.5(@types/node@22.16.0) @@ -12653,25 +12548,24 @@ snapshots: - typescript - universal-cookie - vitest-mock-extended@3.1.0(typescript@5.9.3)(vitest@3.2.4(@types/node@22.16.0)(happy-dom@20.0.8)(jiti@2.6.1)(jsdom@27.0.1(postcss@8.5.6))(lightningcss@1.30.2)(sass@1.93.1)(yaml@2.8.1)): + vitest-mock-extended@3.1.0(typescript@5.9.3)(vitest@4.0.1(@types/node@22.16.0)(happy-dom@20.0.8)(jiti@2.6.1)(jsdom@27.0.1(postcss@8.5.6))(lightningcss@1.30.2)(sass@1.93.1)(yaml@2.8.1)): dependencies: ts-essentials: 10.0.4(typescript@5.9.3) typescript: 5.9.3 - vitest: 3.2.4(@types/node@22.16.0)(happy-dom@20.0.8)(jiti@2.6.1)(jsdom@27.0.1(postcss@8.5.6))(lightningcss@1.30.2)(sass@1.93.1)(yaml@2.8.1) + vitest: 4.0.1(@types/node@22.16.0)(happy-dom@20.0.8)(jiti@2.6.1)(jsdom@27.0.1(postcss@8.5.6))(lightningcss@1.30.2)(sass@1.93.1)(yaml@2.8.1) - vitest@3.2.4(@types/node@22.16.0)(happy-dom@20.0.8)(jiti@2.6.1)(jsdom@27.0.1(postcss@8.5.6))(lightningcss@1.30.2)(sass@1.93.1)(yaml@2.8.1): + vitest@4.0.1(@types/node@22.16.0)(happy-dom@20.0.8)(jiti@2.6.1)(jsdom@27.0.1(postcss@8.5.6))(lightningcss@1.30.2)(sass@1.93.1)(yaml@2.8.1): dependencies: - '@types/chai': 5.2.2 - '@vitest/expect': 3.2.4 - '@vitest/mocker': 3.2.4(vite@7.1.11(@types/node@22.16.0)(jiti@2.6.1)(lightningcss@1.30.2)(sass@1.93.1)(yaml@2.8.1)) - '@vitest/pretty-format': 3.2.4 - '@vitest/runner': 3.2.4 - '@vitest/snapshot': 3.2.4 - '@vitest/spy': 3.2.4 - '@vitest/utils': 3.2.4 - chai: 5.2.0 + '@vitest/expect': 4.0.1 + '@vitest/mocker': 4.0.1(vite@7.1.11(@types/node@22.16.0)(jiti@2.6.1)(lightningcss@1.30.2)(sass@1.93.1)(yaml@2.8.1)) + '@vitest/pretty-format': 4.0.1 + '@vitest/runner': 4.0.1 + '@vitest/snapshot': 4.0.1 + '@vitest/spy': 4.0.1 + '@vitest/utils': 4.0.1 debug: 4.4.3(supports-color@8.1.1) - expect-type: 1.2.1 + es-module-lexer: 1.7.0 + expect-type: 1.2.2 magic-string: 0.30.19 pathe: 2.0.3 picomatch: 4.0.3 @@ -12679,10 +12573,8 @@ snapshots: tinybench: 2.9.0 tinyexec: 0.3.2 tinyglobby: 0.2.15 - tinypool: 1.1.1 - tinyrainbow: 2.0.0 + tinyrainbow: 3.0.3 vite: 7.1.11(@types/node@22.16.0)(jiti@2.6.1)(lightningcss@1.30.2)(sass@1.93.1)(yaml@2.8.1) - vite-node: 3.2.4(@types/node@22.16.0)(jiti@2.6.1)(lightningcss@1.30.2)(sass@1.93.1)(yaml@2.8.1) why-is-node-running: 2.3.0 optionalDependencies: '@types/node': 22.16.0 diff --git a/tests/unit/config/vitest.config.ts b/tests/unit/config/vitest.config.ts index d3b9bc55dc..8073ef2333 100644 --- a/tests/unit/config/vitest.config.ts +++ b/tests/unit/config/vitest.config.ts @@ -5,6 +5,8 @@ import { compilerOptions } from '../../../vite.config.common' const root = path.resolve(__dirname, '../../../') +process.env.TZ = 'UTC' + export default defineConfig({ plugins: [vue({ template: { compilerOptions } })], css: { diff --git a/tests/unit/config/vitest.init.ts b/tests/unit/config/vitest.init.ts index c6b0bb8847..7d4fded737 100644 --- a/tests/unit/config/vitest.init.ts +++ b/tests/unit/config/vitest.init.ts @@ -1,16 +1,17 @@ -const IntersectionObserverMock = vi.fn(() => ({ - disconnect: vi.fn(), - observe: vi.fn(), - takeRecords: vi.fn(), - unobserve: vi.fn() -})) +class IntersectionObserverMock { + disconnect() {} + observe() {} + takeRecords() {} + unobserve() {} +} vi.stubGlobal('IntersectionObserver', IntersectionObserverMock) -const ResizeObserverMock = vi.fn(() => ({ - observe: vi.fn(), - unobserve: vi.fn() -})) +class ResizeObserverMock { + observe() {} + unobserve() {} + disconnect() {} +} vi.stubGlobal('ResizeObserver', ResizeObserverMock) diff --git a/vitest.workspace.ts b/vitest.workspace.ts deleted file mode 100644 index b1135c15cf..0000000000 --- a/vitest.workspace.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { defineWorkspace } from 'vitest/config' -import { globSync } from 'glob' - -// set timezone for snapshot reproducibility on different machines -process.env.TZ = 'UTC' - -const pattern = './packages/*/tests' -const testDirs = [...globSync(pattern), './packages/design-system/src'] - -export default defineWorkspace( - testDirs.map((dir) => { - const name = dir.split('/')[1] - return { - extends: './tests/unit/config/vitest.config.ts', - test: { - name, - dir - } - } - }) -)