diff --git a/packages/markdoc/package.json b/packages/markdoc/package.json index c8793ebab2b..51dfc54d4a6 100644 --- a/packages/markdoc/package.json +++ b/packages/markdoc/package.json @@ -19,7 +19,7 @@ "devDependencies": { "@astrojs/markdoc": "^1.0.0", "@astrojs/starlight": "workspace:*", - "vitest": "^4.1.0-beta.6" + "vitest": "^4.1.0" }, "peerDependencies": { "@astrojs/markdoc": "^1.0.0", diff --git a/packages/starlight/__tests__/basics/git.test.ts b/packages/starlight/__tests__/basics/git.test.ts index 0f88eb427f2..dba5c38804b 100644 --- a/packages/starlight/__tests__/basics/git.test.ts +++ b/packages/starlight/__tests__/basics/git.test.ts @@ -1,4 +1,4 @@ -import { assert, describe, expect, test } from 'vitest'; +import { describe, expect, test, vi } from 'vitest'; import { getAllNewestCommitDate, getNewestCommitDate, @@ -119,13 +119,13 @@ describe('getAllNewestCommitDate', () => { for (const [file, date] of latestDates.entries()) { const expectedDate = expectedDates.get(file); - assert.ok(expectedDate, `Unexpected tracked file: ${file}`); + expect.assert(expectedDate, `Unexpected tracked file: ${file}`); expectCommitDateToEqual(new Date(date), expectedDate); } for (const file of expectedDates.keys()) { const latestDate = latestDates.get(file); - assert.ok(latestDate, `Missing tracked file: ${file}`); + expect.assert(latestDate, `Missing tracked file: ${file}`); } }); @@ -152,9 +152,11 @@ describe('getAllNewestCommitDate', () => { }); }); -function expectCommitDateToEqual(commitDate: CommitDate, expectedDateStr: ISODate) { - const expectedDate = new Date(expectedDateStr); - expect(commitDate).toStrictEqual(expectedDate); -} +const expectCommitDateToEqual = vi.defineHelper( + (commitDate: CommitDate, expectedDateStr: ISODate) => { + const expectedDate = new Date(expectedDateStr); + expect(commitDate).toStrictEqual(expectedDate); + } +); type CommitDate = ReturnType; diff --git a/packages/starlight/__tests__/basics/i18n.test.ts b/packages/starlight/__tests__/basics/i18n.test.ts index 88a14b01106..517e135811b 100644 --- a/packages/starlight/__tests__/basics/i18n.test.ts +++ b/packages/starlight/__tests__/basics/i18n.test.ts @@ -1,4 +1,4 @@ -import { assert, describe, expect, test, vi } from 'vitest'; +import { describe, expect, test, vi } from 'vitest'; import config from 'virtual:starlight/user-config'; import { processI18nConfig, pickLang } from '../../utils/i18n'; import type { AstroConfig, AstroUserConfig } from 'astro'; @@ -24,7 +24,7 @@ describe('processI18nConfig', () => { expect(astroI18nConfig.defaultLocale).toBe('en'); expect(astroI18nConfig.locales).toEqual(['en']); - assert(typeof astroI18nConfig.routing !== 'string'); + expect.assert(typeof astroI18nConfig.routing !== 'string'); expect(astroI18nConfig.routing?.prefixDefaultLocale).toBe(false); // The Starlight configuration should not be modified. diff --git a/packages/starlight/__tests__/basics/translations.test.ts b/packages/starlight/__tests__/basics/translations.test.ts index 3552e9cc6f8..93aed5cad08 100644 --- a/packages/starlight/__tests__/basics/translations.test.ts +++ b/packages/starlight/__tests__/basics/translations.test.ts @@ -1,4 +1,4 @@ -import { describe, expect, test, vi } from 'vitest'; +import { beforeAll, describe, expect, test, vi } from 'vitest'; import { useTranslations } from '../../utils/translations'; import translations from '../../translations'; @@ -10,36 +10,40 @@ describe('useTranslations()', () => { }); }); -describe('t()', async () => { - // The mocked user-defined translations are scoped to this `describe` block so that they do not - // affect other tests (`vi.mock` → `vi.doMock`). - vi.doMock('astro:content', async () => - (await import('../test-utils')).mockedAstroContent({ - i18n: [ - [ - 'en', - { - 'test.interpolation': '{{subject}} is {{adjective}}', - 'test.dataModel': 'Powered by {{integration.name}}', - 'test.escape': 'The tag is {{tag}}', - 'test.unescape': 'The tag is {{- tag}}', - 'test.currency': 'The price is {{price, currency(USD)}}', - 'test.list': '{{subjects, list}} are awesome', - 'test.count_one': '{{count}} project', - 'test.count_other': '{{count}} projects', - 'test.nesting1': '$t(test.nesting2) is nested', - 'test.nesting2': 'this UI string', - }, +describe('t()', () => { + let t: ReturnType; + + beforeAll(async () => { + // The mocked user-defined translations are scoped to this `describe` block so that they do not + // affect other tests (`vi.mock` → `vi.doMock`). + vi.doMock('astro:content', async () => + (await import('../test-utils')).mockedAstroContent({ + i18n: [ + [ + 'en', + { + 'test.interpolation': '{{subject}} is {{adjective}}', + 'test.dataModel': 'Powered by {{integration.name}}', + 'test.escape': 'The tag is {{tag}}', + 'test.unescape': 'The tag is {{- tag}}', + 'test.currency': 'The price is {{price, currency(USD)}}', + 'test.list': '{{subjects, list}} are awesome', + 'test.count_one': '{{count}} project', + 'test.count_other': '{{count}} projects', + 'test.nesting1': '$t(test.nesting2) is nested', + 'test.nesting2': 'this UI string', + }, + ], ], - ], - }) - ); - // Reset the modules registry so that re-importing `../../utils/translations` re-evaluates the - // module and re-computes `useTranslations`. Re-importing the module is necessary because - // top-level imports cannot be re-evaluated. - vi.resetModules(); - const { useTranslations } = await import('../../utils/translations'); - const t = useTranslations(undefined); + }) + ); + // Reset the modules registry so that re-importing `../../utils/translations` re-evaluates the + // module and re-computes `useTranslations`. Re-importing the module is necessary because + // top-level imports cannot be re-evaluated. + vi.resetModules(); + const { useTranslations } = await import('../../utils/translations'); + t = useTranslations(undefined); + }); test('supports using interpolation', () => { expect(t).toBeTypeOf('function'); @@ -104,16 +108,20 @@ describe('t()', async () => { }); }); -describe('t.all()', async () => { - // See the `t()` tests for an explanation of how the user-defined translations are mocked. - vi.doMock('astro:content', async () => - (await import('../test-utils')).mockedAstroContent({ - i18n: [['en', { 'test.foo': 'bar' }]], - }) - ); - vi.resetModules(); - const { useTranslations } = await import('../../utils/translations'); - const t = useTranslations(undefined); +describe('t.all()', () => { + let t: ReturnType; + + beforeAll(async () => { + // See the `t()` tests for an explanation of how the user-defined translations are mocked. + vi.doMock('astro:content', async () => + (await import('../test-utils')).mockedAstroContent({ + i18n: [['en', { 'test.foo': 'bar' }]], + }) + ); + vi.resetModules(); + const { useTranslations } = await import('../../utils/translations'); + t = useTranslations(undefined); + }); test('returns all translations including custom ones', () => { expect(t.all).toBeTypeOf('function'); @@ -121,16 +129,20 @@ describe('t.all()', async () => { }); }); -describe('t.exists()', async () => { - // See the `t()` tests for an explanation of how the user-defined translations are mocked. - vi.doMock('astro:content', async () => - (await import('../test-utils')).mockedAstroContent({ - i18n: [['en', { 'test.foo': 'bar' }]], - }) - ); - vi.resetModules(); - const { useTranslations } = await import('../../utils/translations'); - const t = useTranslations(undefined); +describe('t.exists()', () => { + let t: ReturnType; + + beforeAll(async () => { + // See the `t()` tests for an explanation of how the user-defined translations are mocked. + vi.doMock('astro:content', async () => + (await import('../test-utils')).mockedAstroContent({ + i18n: [['en', { 'test.foo': 'bar' }]], + }) + ); + vi.resetModules(); + const { useTranslations } = await import('../../utils/translations'); + t = useTranslations(undefined); + }); test('returns `true` for existing translations', () => { expect(t.exists).toBeTypeOf('function'); diff --git a/packages/starlight/__tests__/i18n-non-root-single-locale/i18n.test.ts b/packages/starlight/__tests__/i18n-non-root-single-locale/i18n.test.ts index 776c7177788..c6f62f7dec9 100644 --- a/packages/starlight/__tests__/i18n-non-root-single-locale/i18n.test.ts +++ b/packages/starlight/__tests__/i18n-non-root-single-locale/i18n.test.ts @@ -1,4 +1,4 @@ -import { assert, describe, expect, test } from 'vitest'; +import { describe, expect, test } from 'vitest'; import type { AstroConfig } from 'astro'; import config from 'virtual:starlight/user-config'; import { processI18nConfig } from '../../utils/i18n'; @@ -19,7 +19,7 @@ describe('processI18nConfig', () => { }, ] `); - assert(typeof astroI18nConfig.routing !== 'string'); + expect.assert(typeof astroI18nConfig.routing !== 'string'); expect(astroI18nConfig.routing?.prefixDefaultLocale).toBe(true); // The Starlight configuration should not be modified. diff --git a/packages/starlight/__tests__/i18n-root-default-locale/i18n.test.ts b/packages/starlight/__tests__/i18n-root-default-locale/i18n.test.ts index fb48dcf4afc..ea8f29e6271 100644 --- a/packages/starlight/__tests__/i18n-root-default-locale/i18n.test.ts +++ b/packages/starlight/__tests__/i18n-root-default-locale/i18n.test.ts @@ -1,4 +1,4 @@ -import { assert, describe, expect, test } from 'vitest'; +import { describe, expect, test } from 'vitest'; import config from 'virtual:starlight/user-config'; import { processI18nConfig } from '../../utils/i18n'; @@ -30,7 +30,7 @@ describe('processI18nConfig', () => { }, ] `); - assert(typeof astroI18nConfig.routing !== 'string'); + expect.assert(typeof astroI18nConfig.routing !== 'string'); expect(astroI18nConfig.routing?.prefixDefaultLocale).toBe(false); // The Starlight configuration should not be modified. diff --git a/packages/starlight/__tests__/i18n-root-locale/i18n.test.ts b/packages/starlight/__tests__/i18n-root-locale/i18n.test.ts index 049fad8fc23..449ac484fc5 100644 --- a/packages/starlight/__tests__/i18n-root-locale/i18n.test.ts +++ b/packages/starlight/__tests__/i18n-root-locale/i18n.test.ts @@ -1,4 +1,4 @@ -import { assert, describe, expect, test } from 'vitest'; +import { describe, expect, test } from 'vitest'; import type { AstroConfig } from 'astro'; import config from 'virtual:starlight/user-config'; import { processI18nConfig } from '../../utils/i18n'; @@ -30,7 +30,7 @@ describe('processI18nConfig', () => { }, ] `); - assert(typeof astroI18nConfig.routing !== 'string'); + expect.assert(typeof astroI18nConfig.routing !== 'string'); expect(astroI18nConfig.routing?.prefixDefaultLocale).toBe(false); // The Starlight configuration should not be modified. diff --git a/packages/starlight/__tests__/i18n-root-locale/routing.test.ts b/packages/starlight/__tests__/i18n-root-locale/routing.test.ts index 0c541539810..fad1281b21f 100644 --- a/packages/starlight/__tests__/i18n-root-locale/routing.test.ts +++ b/packages/starlight/__tests__/i18n-root-locale/routing.test.ts @@ -1,6 +1,6 @@ import { getRouteDataTestContext } from '../test-utils'; import config from 'virtual:starlight/user-config'; -import { assert, expect, test, vi } from 'vitest'; +import { expect, test, vi } from 'vitest'; import { routes } from '../../utils/routing'; import { generateRouteData } from '../../utils/routing/data'; import * as git from 'virtual:starlight/git-info'; @@ -70,7 +70,10 @@ test('fallback routes use their own locale data', () => { test('fallback routes use fallback entry last updated dates', () => { const getNewestCommitDate = vi.spyOn(git, 'getNewestCommitDate'); const route = routes.find((route) => route.entry.id === routes[4]!.id && route.locale === 'en'); - assert(route, 'Expected to find English fallback route for `guides/authoring-content.mdx`.'); + expect.assert( + route, + 'Expected to find English fallback route for `guides/authoring-content.mdx`.' + ); generateRouteData({ props: { diff --git a/packages/starlight/__tests__/i18n-single-root-locale/i18n.test.ts b/packages/starlight/__tests__/i18n-single-root-locale/i18n.test.ts index 232689156e6..46176641466 100644 --- a/packages/starlight/__tests__/i18n-single-root-locale/i18n.test.ts +++ b/packages/starlight/__tests__/i18n-single-root-locale/i18n.test.ts @@ -1,4 +1,4 @@ -import { assert, describe, expect, test } from 'vitest'; +import { describe, expect, test } from 'vitest'; import config from 'virtual:starlight/user-config'; import { processI18nConfig } from '../../utils/i18n'; @@ -8,7 +8,7 @@ describe('processI18nConfig', () => { expect(astroI18nConfig.defaultLocale).toBe('fr-CA'); expect(astroI18nConfig.locales).toEqual(['fr-CA']); - assert(typeof astroI18nConfig.routing !== 'string'); + expect.assert(typeof astroI18nConfig.routing !== 'string'); expect(astroI18nConfig.routing?.prefixDefaultLocale).toBe(false); // The Starlight configuration should not be modified. diff --git a/packages/starlight/__tests__/i18n/i18n.test.ts b/packages/starlight/__tests__/i18n/i18n.test.ts index 770cb379711..da9392ce344 100644 --- a/packages/starlight/__tests__/i18n/i18n.test.ts +++ b/packages/starlight/__tests__/i18n/i18n.test.ts @@ -1,4 +1,4 @@ -import { assert, describe, expect, test } from 'vitest'; +import { describe, expect, test } from 'vitest'; import type { AstroConfig } from 'astro'; import config from 'virtual:starlight/user-config'; import { processI18nConfig } from '../../utils/i18n'; @@ -37,7 +37,7 @@ describe('processI18nConfig', () => { }, ] `); - assert(typeof astroI18nConfig.routing !== 'string'); + expect.assert(typeof astroI18nConfig.routing !== 'string'); expect(astroI18nConfig.routing?.prefixDefaultLocale).toBe(true); // The Starlight configuration should not be modified. diff --git a/packages/starlight/__tests__/middleware/middleware.test.ts b/packages/starlight/__tests__/middleware/middleware.test.ts index 94d55c3bc2b..3db77b27917 100644 --- a/packages/starlight/__tests__/middleware/middleware.test.ts +++ b/packages/starlight/__tests__/middleware/middleware.test.ts @@ -1,11 +1,11 @@ import type { APIContext } from 'astro'; -import { expect, test } from 'vitest'; +import { expect, test, vi } from 'vitest'; import { onRequest } from '../../locals'; import type { StarlightRouteData } from '../../route-data'; test('starlightRoute throws when accessed outside of a Starlight page', async () => { const context = { locals: {}, currentLocale: 'en' } as APIContext; - await onRequest(context, () => Promise.resolve(new Response())); + await onRequest(context, vi.fn()); expect(() => { // We are testing that accessing `starlightRoute` outside of a Starlight page throws. // eslint-disable-next-line @typescript-eslint/no-unused-expressions @@ -27,7 +27,7 @@ test('starlightRoute throws when accessed outside of a Starlight page', async () test('starlightRoute returns as expected if it has been set', async () => { const context = { locals: {}, currentLocale: 'en' } as APIContext; - await onRequest(context, () => Promise.resolve(new Response())); + await onRequest(context, vi.fn()); context.locals.starlightRoute = { siteTitle: 'Test title' } as StarlightRouteData; expect(context.locals.starlightRoute.siteTitle).toBe('Test title'); }); diff --git a/packages/starlight/__tests__/plugins/config.test.ts b/packages/starlight/__tests__/plugins/config.test.ts index a206206f13d..bbaaee9a526 100644 --- a/packages/starlight/__tests__/plugins/config.test.ts +++ b/packages/starlight/__tests__/plugins/config.test.ts @@ -61,7 +61,7 @@ describe('validation', () => { [], createTestPluginContext() ) - ).rejects.toThrowError(/Invalid config passed to starlight integration/); + ).rejects.toThrow(/Invalid config passed to starlight integration/); }); test('validates plugins configuration before running them', async () => { @@ -73,7 +73,7 @@ describe('validation', () => { [{ name: 'invalid-plugin' }], createTestPluginContext() ) - ).rejects.toThrowError(/Invalid plugins config passed to starlight integration/); + ).rejects.toThrow(/Invalid plugins config passed to starlight integration/); }); test('validates configuration updates from plugins do not update the `plugins` config key', async () => { @@ -94,7 +94,7 @@ describe('validation', () => { ], createTestPluginContext() ) - ).rejects.toThrowError( + ).rejects.toThrow( /The `test-plugin` plugin tried to update the `plugins` config key which is not supported./ ); }); @@ -117,7 +117,7 @@ describe('validation', () => { ], createTestPluginContext() ) - ).rejects.toThrowError( + ).rejects.toThrow( /The `test-plugin` plugin tried to update the `routeMiddleware` config key which is not supported./ ); }); @@ -140,7 +140,7 @@ describe('validation', () => { ], createTestPluginContext() ) - ).rejects.toThrowError(/Invalid config update provided by the 'test-plugin' plugin/); + ).rejects.toThrow(/Invalid config update provided by the 'test-plugin' plugin/); }); }); diff --git a/packages/starlight/__tests__/remark-rehype/asides.test.ts b/packages/starlight/__tests__/remark-rehype/asides.test.ts index 404c9b49ccf..57098667558 100644 --- a/packages/starlight/__tests__/remark-rehype/asides.test.ts +++ b/packages/starlight/__tests__/remark-rehype/asides.test.ts @@ -130,7 +130,7 @@ Some text ::: ` ) - ).rejects.toThrowError( + ).rejects.toThrow( // We are not relying on `toThrowErrorMatchingInlineSnapshot()` and our custom snapshot // serializer in this specific test as error thrown in a remark plugin includes a dynamic file // path. diff --git a/packages/starlight/__tests__/remark-rehype/rehype-file-tree.test.ts b/packages/starlight/__tests__/remark-rehype/rehype-file-tree.test.ts index 30364306774..8c7f40de589 100644 --- a/packages/starlight/__tests__/remark-rehype/rehype-file-tree.test.ts +++ b/packages/starlight/__tests__/remark-rehype/rehype-file-tree.test.ts @@ -1,4 +1,4 @@ -import { describe, expect, test } from 'vitest'; +import { describe, expect, test, vi } from 'vitest'; import { processFileTree } from '../../user-components/rehype-file-tree'; import { Icons, type StarlightIcon } from '../../components-internals/Icons'; @@ -176,6 +176,8 @@ function extractFileTree(html: string, stripIcons = true) { return tree; } -function expectHtmlToIncludeIcon(html: string, icon: (typeof Icons)[StarlightIcon]) { - return expect(extractFileTree(html, false)).toContain(icon.replace('/>', '>')); -} +const expectHtmlToIncludeIcon = vi.defineHelper( + (html: string, icon: (typeof Icons)[StarlightIcon]) => { + return expect(extractFileTree(html, false)).toContain(icon.replace('/>', '>')); + } +); diff --git a/packages/starlight/package.json b/packages/starlight/package.json index ed8d7daba0a..b8b9271ba3a 100644 --- a/packages/starlight/package.json +++ b/packages/starlight/package.json @@ -54,10 +54,10 @@ "devDependencies": { "@playwright/test": "^1.57.0", "@types/node": "^22.19.3", - "@vitest/coverage-v8": "^4.1.0-beta.6", + "@vitest/coverage-v8": "^4.1.0", "astro": "^6.0.1", "linkedom": "^0.18.4", - "vitest": "^4.1.0-beta.6" + "vitest": "^4.1.0" }, "dependencies": { "@astrojs/markdown-remark": "^7.0.0", diff --git a/packages/tailwind/package.json b/packages/tailwind/package.json index 08f805a3e85..31dd196251d 100644 --- a/packages/tailwind/package.json +++ b/packages/tailwind/package.json @@ -25,7 +25,7 @@ "devDependencies": { "lightningcss": "^1.29.1", "tailwindcss": "^4.0.7", - "vitest": "^4.1.0-beta.6" + "vitest": "^4.1.0" }, "peerDependencies": { "@astrojs/starlight": ">=0.38.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 2b0ba8d0bc2..10e1e9fac5b 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -174,8 +174,8 @@ importers: specifier: workspace:* version: link:../starlight vitest: - specifier: ^4.1.0-beta.6 - version: 4.1.0-beta.6(@types/node@24.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.15.2)(yaml@2.7.1) + specifier: ^4.1.0 + version: 4.1.0(@types/node@24.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.15.2)(yaml@2.7.1) packages/starlight: dependencies: @@ -271,8 +271,8 @@ importers: specifier: ^22.19.3 version: 22.19.3 '@vitest/coverage-v8': - specifier: ^4.1.0-beta.6 - version: 4.1.0-beta.6(vitest@4.1.0-beta.6(@types/node@22.19.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.15.2)(yaml@2.7.1)) + specifier: ^4.1.0 + version: 4.1.0(vitest@4.1.0(@types/node@22.19.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.15.2)(yaml@2.7.1)) astro: specifier: ^6.0.1 version: 6.0.1(@types/node@22.19.3)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.53.3)(tsx@4.15.2)(typescript@5.6.3)(yaml@2.7.1) @@ -280,8 +280,8 @@ importers: specifier: ^0.18.4 version: 0.18.4 vitest: - specifier: ^4.1.0-beta.6 - version: 4.1.0-beta.6(@types/node@22.19.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.15.2)(yaml@2.7.1) + specifier: ^4.1.0 + version: 4.1.0(@types/node@22.19.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.15.2)(yaml@2.7.1) packages/starlight/__e2e__/fixtures/basics: dependencies: @@ -349,8 +349,8 @@ importers: specifier: ^4.0.7 version: 4.1.18 vitest: - specifier: ^4.1.0-beta.6 - version: 4.1.0-beta.6(@types/node@24.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.15.2)(yaml@2.7.1) + specifier: ^4.1.0 + version: 4.1.0(@types/node@24.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.15.2)(yaml@2.7.1) packages: @@ -1638,43 +1638,43 @@ packages: '@ungap/structured-clone@1.2.0': resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} - '@vitest/coverage-v8@4.1.0-beta.6': - resolution: {integrity: sha512-9e3a956eoJrVebh69jqFgQ77SFl5OkDM49AUj/JLu0jVSg/z1YCii/cbA94FZrayV2uzRG9jueXe6J3iXKQb9A==} + '@vitest/coverage-v8@4.1.0': + resolution: {integrity: sha512-nDWulKeik2bL2Va/Wl4x7DLuTKAXa906iRFooIRPR+huHkcvp9QDkPQ2RJdmjOFrqOqvNfoSQLF68deE3xC3CQ==} peerDependencies: - '@vitest/browser': 4.1.0-beta.6 - vitest: 4.1.0-beta.6 + '@vitest/browser': 4.1.0 + vitest: 4.1.0 peerDependenciesMeta: '@vitest/browser': optional: true - '@vitest/expect@4.1.0-beta.6': - resolution: {integrity: sha512-vtvYuf1E5DvcaoD+k3q65WhlZGPLOXrooq4PI6UaYvibQaQbevs/nOhmZQHKd3gxRrybzWzW1kQ8u+EpJlXmyQ==} + '@vitest/expect@4.1.0': + resolution: {integrity: sha512-EIxG7k4wlWweuCLG9Y5InKFwpMEOyrMb6ZJ1ihYu02LVj/bzUwn2VMU+13PinsjRW75XnITeFrQBMH5+dLvCDA==} - '@vitest/mocker@4.1.0-beta.6': - resolution: {integrity: sha512-x2EnQRKPaJcYlHV9DiaznYU5lNaA9DFRElUiGbT9Rjv9CxcKp9urO8xsj94HKb9CxdE4JJA6YQ6Gt8f09aeejw==} + '@vitest/mocker@4.1.0': + resolution: {integrity: sha512-evxREh+Hork43+Y4IOhTo+h5lGmVRyjqI739Rz4RlUPqwrkFFDF6EMvOOYjTx4E8Tl6gyCLRL8Mu7Ry12a13Tw==} peerDependencies: msw: ^2.4.9 - vite: ^6.0.0 || ^7.0.0-0 + vite: ^6.0.0 || ^7.0.0 || ^8.0.0-0 peerDependenciesMeta: msw: optional: true vite: optional: true - '@vitest/pretty-format@4.1.0-beta.6': - resolution: {integrity: sha512-Wx7Gjy7jdz7iC09/R5fzw0YfJFgzqgBddBGrQs7S9b3ds38p6CBBcXJ5DhrJpaUAtQZ+EoI2/I3RigWmKt1zOw==} + '@vitest/pretty-format@4.1.0': + resolution: {integrity: sha512-3RZLZlh88Ib0J7NQTRATfc/3ZPOnSUn2uDBUoGNn5T36+bALixmzphN26OUD3LRXWkJu4H0s5vvUeqBiw+kS0A==} - '@vitest/runner@4.1.0-beta.6': - resolution: {integrity: sha512-s8TqhIvYHw3g6QY0ZEwGNT4K6K4OaNM3oH6+hMgpPsV6qHcgCIsKgJ4R/M0r803Ts0xiG4vLewvo5DS80i0Rsg==} + '@vitest/runner@4.1.0': + resolution: {integrity: sha512-Duvx2OzQ7d6OjchL+trw+aSrb9idh7pnNfxrklo14p3zmNL4qPCDeIJAK+eBKYjkIwG96Bc6vYuxhqDXQOWpoQ==} - '@vitest/snapshot@4.1.0-beta.6': - resolution: {integrity: sha512-Y4vDrcC1c20Irk4OVQC2IjqwEiX3oDK6vG+18KkDQMXxQmUeSWt2KMLnMSeBHadcfh6eu+OXVMpF9MSWN7OmaQ==} + '@vitest/snapshot@4.1.0': + resolution: {integrity: sha512-0Vy9euT1kgsnj1CHttwi9i9o+4rRLEaPRSOJ5gyv579GJkNpgJK+B4HSv/rAWixx2wdAFci1X4CEPjiu2bXIMg==} - '@vitest/spy@4.1.0-beta.6': - resolution: {integrity: sha512-Oiy+/uXTkTHHZ5IKDYgwUFSl9PFUL1lTsEzzsDO9jZYR9TM4gbHavdkp/4WeHDlcceS0ME5fXmAyHJV7edVoFA==} + '@vitest/spy@4.1.0': + resolution: {integrity: sha512-pz77k+PgNpyMDv2FV6qmk5ZVau6c3R8HC8v342T2xlFxQKTrSeYw9waIJG8KgV9fFwAtTu4ceRzMivPTH6wSxw==} - '@vitest/utils@4.1.0-beta.6': - resolution: {integrity: sha512-dKZffS4O0ES7XxvZZejyJ2R9QseK3dRwzipRtsPs7njPTIgnJ8FWjSulwv6SVD8fhbYIia92kMgq83+xEqygTw==} + '@vitest/utils@4.1.0': + resolution: {integrity: sha512-XfPXT6a8TZY3dcGY8EdwsBulFCIw+BeeX0RZn2x/BtiY/75YGh8FeWGG8QISN/WhaqSrE2OrlDgtF8q5uhOTmw==} '@volar/kit@2.4.27': resolution: {integrity: sha512-ilZoQDMLzqmSsImJRWx4YiZ4FcvvPrPnFVmL6hSsIWB6Bn3qc7k88J9yP32dagrs5Y8EXIlvvD/mAFaiuEOACQ==} @@ -3550,8 +3550,8 @@ packages: resolution: {integrity: sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==} engines: {node: '>= 0.8'} - std-env@3.10.0: - resolution: {integrity: sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==} + std-env@4.0.0: + resolution: {integrity: sha512-zUMPtQ/HBY3/50VbpkupYHbRroTRZJPRLvreamgErJVys0ceuzMkD44J/QjqhHjOzK42GQ3QZIeFG1OYfOtKqQ==} stream-replace-string@2.0.0: resolution: {integrity: sha512-TlnjJ1C0QrmxRNrON00JvaFFlNh5TTG00APw23j74ET7gkQpTASi6/L2fuiav8pzK715HXtUeClpBTw2NPSn6w==} @@ -3894,18 +3894,18 @@ packages: vite: optional: true - vitest@4.1.0-beta.6: - resolution: {integrity: sha512-4sL2HRFu38kVrWkGqksK/hPn8QSvG9rRy0OgWZaEaI41/XNXKVbXW9ipxijvsQ4jhuOYgsfBmXi+mjbNQQrgbw==} + vitest@4.1.0: + resolution: {integrity: sha512-YbDrMF9jM2Lqc++2530UourxZHmkKLxrs4+mYhEwqWS97WJ7wOYEkcr+QfRgJ3PW9wz3odRijLZjHEaRLTNbqw==} engines: {node: ^20.0.0 || ^22.0.0 || >=24.0.0} hasBin: true peerDependencies: '@edge-runtime/vm': '*' '@opentelemetry/api': ^1.9.0 '@types/node': ^20.0.0 || ^22.0.0 || >=24.0.0 - '@vitest/browser-playwright': 4.1.0-beta.6 - '@vitest/browser-preview': 4.1.0-beta.6 - '@vitest/browser-webdriverio': 4.1.0-beta.6 - '@vitest/ui': 4.1.0-beta.6 + '@vitest/browser-playwright': 4.1.0 + '@vitest/browser-preview': 4.1.0 + '@vitest/browser-webdriverio': 4.1.0 + '@vitest/ui': 4.1.0 happy-dom: '*' jsdom: '*' peerDependenciesMeta: @@ -5460,66 +5460,66 @@ snapshots: '@ungap/structured-clone@1.2.0': {} - '@vitest/coverage-v8@4.1.0-beta.6(vitest@4.1.0-beta.6(@types/node@22.19.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.15.2)(yaml@2.7.1))': + '@vitest/coverage-v8@4.1.0(vitest@4.1.0(@types/node@22.19.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.15.2)(yaml@2.7.1))': dependencies: '@bcoe/v8-coverage': 1.0.2 - '@vitest/utils': 4.1.0-beta.6 + '@vitest/utils': 4.1.0 ast-v8-to-istanbul: 1.0.0 istanbul-lib-coverage: 3.2.2 istanbul-lib-report: 3.0.1 istanbul-reports: 3.2.0 magicast: 0.5.2 obug: 2.1.1 - std-env: 3.10.0 + std-env: 4.0.0 tinyrainbow: 3.0.3 - vitest: 4.1.0-beta.6(@types/node@22.19.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.15.2)(yaml@2.7.1) + vitest: 4.1.0(@types/node@22.19.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.15.2)(yaml@2.7.1) - '@vitest/expect@4.1.0-beta.6': + '@vitest/expect@4.1.0': dependencies: '@standard-schema/spec': 1.1.0 '@types/chai': 5.2.3 - '@vitest/spy': 4.1.0-beta.6 - '@vitest/utils': 4.1.0-beta.6 + '@vitest/spy': 4.1.0 + '@vitest/utils': 4.1.0 chai: 6.2.2 tinyrainbow: 3.0.3 - '@vitest/mocker@4.1.0-beta.6(vite@7.3.1(@types/node@22.19.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.15.2)(yaml@2.7.1))': + '@vitest/mocker@4.1.0(vite@7.3.1(@types/node@22.19.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.15.2)(yaml@2.7.1))': dependencies: - '@vitest/spy': 4.1.0-beta.6 + '@vitest/spy': 4.1.0 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: vite: 7.3.1(@types/node@22.19.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.15.2)(yaml@2.7.1) - '@vitest/mocker@4.1.0-beta.6(vite@7.3.1(@types/node@24.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.15.2)(yaml@2.7.1))': + '@vitest/mocker@4.1.0(vite@7.3.1(@types/node@24.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.15.2)(yaml@2.7.1))': dependencies: - '@vitest/spy': 4.1.0-beta.6 + '@vitest/spy': 4.1.0 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: vite: 7.3.1(@types/node@24.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.15.2)(yaml@2.7.1) - '@vitest/pretty-format@4.1.0-beta.6': + '@vitest/pretty-format@4.1.0': dependencies: tinyrainbow: 3.0.3 - '@vitest/runner@4.1.0-beta.6': + '@vitest/runner@4.1.0': dependencies: - '@vitest/utils': 4.1.0-beta.6 + '@vitest/utils': 4.1.0 pathe: 2.0.3 - '@vitest/snapshot@4.1.0-beta.6': + '@vitest/snapshot@4.1.0': dependencies: - '@vitest/pretty-format': 4.1.0-beta.6 - '@vitest/utils': 4.1.0-beta.6 + '@vitest/pretty-format': 4.1.0 + '@vitest/utils': 4.1.0 magic-string: 0.30.21 pathe: 2.0.3 - '@vitest/spy@4.1.0-beta.6': {} + '@vitest/spy@4.1.0': {} - '@vitest/utils@4.1.0-beta.6': + '@vitest/utils@4.1.0': dependencies: - '@vitest/pretty-format': 4.1.0-beta.6 + '@vitest/pretty-format': 4.1.0 convert-source-map: 2.0.0 tinyrainbow: 3.0.3 @@ -8130,7 +8130,7 @@ snapshots: statuses@2.0.2: {} - std-env@3.10.0: {} + std-env@4.0.0: {} stream-replace-string@2.0.0: {} @@ -8421,22 +8421,22 @@ snapshots: optionalDependencies: vite: 7.3.1(@types/node@24.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.15.2)(yaml@2.7.1) - vitest@4.1.0-beta.6(@types/node@22.19.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.15.2)(yaml@2.7.1): + vitest@4.1.0(@types/node@22.19.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.15.2)(yaml@2.7.1): dependencies: - '@vitest/expect': 4.1.0-beta.6 - '@vitest/mocker': 4.1.0-beta.6(vite@7.3.1(@types/node@22.19.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.15.2)(yaml@2.7.1)) - '@vitest/pretty-format': 4.1.0-beta.6 - '@vitest/runner': 4.1.0-beta.6 - '@vitest/snapshot': 4.1.0-beta.6 - '@vitest/spy': 4.1.0-beta.6 - '@vitest/utils': 4.1.0-beta.6 + '@vitest/expect': 4.1.0 + '@vitest/mocker': 4.1.0(vite@7.3.1(@types/node@22.19.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.15.2)(yaml@2.7.1)) + '@vitest/pretty-format': 4.1.0 + '@vitest/runner': 4.1.0 + '@vitest/snapshot': 4.1.0 + '@vitest/spy': 4.1.0 + '@vitest/utils': 4.1.0 es-module-lexer: 2.0.0 expect-type: 1.3.0 magic-string: 0.30.21 obug: 2.1.1 pathe: 2.0.3 picomatch: 4.0.3 - std-env: 3.10.0 + std-env: 4.0.0 tinybench: 2.9.0 tinyexec: 1.0.2 tinyglobby: 0.2.15 @@ -8458,22 +8458,22 @@ snapshots: - tsx - yaml - vitest@4.1.0-beta.6(@types/node@24.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.15.2)(yaml@2.7.1): + vitest@4.1.0(@types/node@24.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.15.2)(yaml@2.7.1): dependencies: - '@vitest/expect': 4.1.0-beta.6 - '@vitest/mocker': 4.1.0-beta.6(vite@7.3.1(@types/node@24.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.15.2)(yaml@2.7.1)) - '@vitest/pretty-format': 4.1.0-beta.6 - '@vitest/runner': 4.1.0-beta.6 - '@vitest/snapshot': 4.1.0-beta.6 - '@vitest/spy': 4.1.0-beta.6 - '@vitest/utils': 4.1.0-beta.6 + '@vitest/expect': 4.1.0 + '@vitest/mocker': 4.1.0(vite@7.3.1(@types/node@24.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.15.2)(yaml@2.7.1)) + '@vitest/pretty-format': 4.1.0 + '@vitest/runner': 4.1.0 + '@vitest/snapshot': 4.1.0 + '@vitest/spy': 4.1.0 + '@vitest/utils': 4.1.0 es-module-lexer: 2.0.0 expect-type: 1.3.0 magic-string: 0.30.21 obug: 2.1.1 pathe: 2.0.3 picomatch: 4.0.3 - std-env: 3.10.0 + std-env: 4.0.0 tinybench: 2.9.0 tinyexec: 1.0.2 tinyglobby: 0.2.15